# HG changeset patch # User paulb@localhost.localdomain # Date 1182381993 -7200 # Node ID 5b1f8ecf6d2dfcbef3b88843c2702cb08f49c9d8 # Parent 9b23f16cabb2217fcf7a39c002b79a63fb4de2e7 Changed the instance fixing to deal more thoroughly with "accesses" annotations. Added a distinct instances cache to _Class. diff -r 9b23f16cabb2 -r 5b1f8ecf6d2d simplify/fixinstances.py --- a/simplify/fixinstances.py Thu Jun 21 01:25:08 2007 +0200 +++ b/simplify/fixinstances.py Thu Jun 21 01:26:33 2007 +0200 @@ -139,7 +139,7 @@ if hasattr(node, name): d = getattr(node, name) for expr, attrs in d.items(): - self._replace(attrs, name) + self._replace(attrs, name, d, expr) # Visit program nodes. @@ -165,30 +165,28 @@ return node - def _replace(self, items, name=None): - to_replace = set() - for item in items: + def _replace(self, items, name=None, container=None, key=None): + for item in list(items): + items.remove(item) if name == "accesses": attr, accessor = item value = attr.type + items.append((Attribute(self._get_replacement(attr.context), self._get_replacement(value)), self._get_replacement(accessor))) else: attr = item value = attr.type - if isinstance(value, Instance): - distinct_instances = value.get_class().get_distinct_instances() - if distinct_instances.has_key(value): - to_replace.add((item, distinct_instances[value])) + items.add(Attribute(self._get_replacement(attr.context), self._get_replacement(value))) - for item, replacement in to_replace: - items.remove(item) + if name == "accesses": + del container[key] + container[self._get_replacement(key)] = items - for item, replacement in to_replace: - if name == "accesses": - attr, accessor = item - items.append((Attribute(attr.context, replacement), accessor)) - else: - attr = item - items.add(Attribute(attr.context, replacement)) + def _get_replacement(self, value): + if isinstance(value, Instance): + distinct_instances = value.get_class().get_distinct_instances() + return distinct_instances[value] + else: + return value def dispatch(self, node, *args): return Visitor.dispatch(self, node, *args) diff -r 9b23f16cabb2 -r 5b1f8ecf6d2d simplify/simplified/data.py --- a/simplify/simplified/data.py Thu Jun 21 01:25:08 2007 +0200 +++ b/simplify/simplified/data.py Thu Jun 21 01:26:33 2007 +0200 @@ -37,6 +37,8 @@ Structure.__init__(self, *args, **kw) WithName.__init__(self) + self.cache = None + def full_name(self): return "class %s" % self._full_name @@ -81,6 +83,9 @@ attribute types are distinct. """ + if self.cache is not None: + return self.cache + instances = {} names_found = [] instances_found = [] @@ -101,6 +106,7 @@ instances_found.append(instance) instances[instance] = instance + self.cache = instances return instances class SingleInstanceClass(_Class):