1.1 --- a/simplify/fixinstances.py Fri Jun 22 01:06:19 2007 +0200
1.2 +++ b/simplify/fixinstances.py Fri Jun 22 01:11:12 2007 +0200
1.3 @@ -74,6 +74,14 @@
1.4 self.current_subprograms = []
1.5
1.6 self.module = module
1.7 +
1.8 + # Visit structures and instances.
1.9 +
1.10 + for structure in self.module.simplifier.structures:
1.11 + for instance in structure.get_instances():
1.12 + for name, attrs in instance.namespace.items():
1.13 + instance.namespace[name] = self._replace(attrs)
1.14 +
1.15 self.process_node(self.module)
1.16
1.17 # Then, process all functions and methods.
1.18 @@ -87,13 +95,6 @@
1.19 for specialised in subprogram.active():
1.20 self.subprograms.append(self.process_node(specialised))
1.21
1.22 - # Visit structures and instances.
1.23 -
1.24 - for structure in self.module.simplifier.structures:
1.25 - for instance in structure.instances.values():
1.26 - for attrs in instance.namespace.values():
1.27 - self._replace(attrs)
1.28 -
1.29 def process_node(self, node):
1.30
1.31 """
1.32 @@ -134,12 +135,12 @@
1.33 for name in ("non_accesses", "non_writes", "raises", "returns", "types"):
1.34 if hasattr(node, name):
1.35 attrs = getattr(node, name)
1.36 - self._replace(attrs)
1.37 + setattr(node, name, self._replace(attrs))
1.38 for name in ("accesses", "writes", "paramtypes"):
1.39 if hasattr(node, name):
1.40 d = getattr(node, name)
1.41 for expr, attrs in d.items():
1.42 - self._replace(attrs, name, d, expr)
1.43 + d[self._get_replacement(expr)] = self._replace(attrs, name)
1.44
1.45 # Visit program nodes.
1.46
1.47 @@ -165,21 +166,23 @@
1.48
1.49 return node
1.50
1.51 - def _replace(self, items, name=None, container=None, key=None):
1.52 + def _replace(self, items, name=None):
1.53 + if name == "accesses":
1.54 + new_items = []
1.55 + else:
1.56 + new_items = set()
1.57 +
1.58 for item in list(items):
1.59 - items.remove(item)
1.60 if name == "accesses":
1.61 attr, accessor = item
1.62 value = attr.type
1.63 - items.append((Attribute(self._get_replacement(attr.context), self._get_replacement(value)), self._get_replacement(accessor)))
1.64 + new_items.append((Attribute(self._get_replacement(attr.context), self._get_replacement(value)), self._get_replacement(accessor)))
1.65 else:
1.66 attr = item
1.67 value = attr.type
1.68 - items.add(Attribute(self._get_replacement(attr.context), self._get_replacement(value)))
1.69 + new_items.add(Attribute(self._get_replacement(attr.context), self._get_replacement(value)))
1.70
1.71 - if name == "accesses":
1.72 - del container[key]
1.73 - container[self._get_replacement(key)] = items
1.74 + return new_items
1.75
1.76 def _get_replacement(self, value):
1.77 if isinstance(value, Instance):