1.1 --- a/simplify/annotate.py Mon Jul 30 00:35:54 2007 +0200
1.2 +++ b/simplify/annotate.py Tue Jul 31 01:05:24 2007 +0200
1.3 @@ -461,7 +461,7 @@
1.4 # the target may be a class or object, and there may be many different
1.5 # related subprograms.
1.6
1.7 - invocations = []
1.8 + invocations = set()
1.9
1.10 # Visit each callable in turn, finding subprograms.
1.11
1.12 @@ -516,8 +516,7 @@
1.13 # If a subprogram is defined, invoke it.
1.14
1.15 self.invoke_subprogram(invoke, attribute)
1.16 - if attribute.type not in invocations:
1.17 - invocations.append(attribute.type)
1.18 + invocations.add(attribute.type)
1.19
1.20 elif not isinstance(attr.type, GeneralClass):
1.21 print "Invocation type is None for", accessor
2.1 --- a/simplify/fixinstances.py Mon Jul 30 00:35:54 2007 +0200
2.2 +++ b/simplify/fixinstances.py Tue Jul 31 01:05:24 2007 +0200
2.3 @@ -146,10 +146,10 @@
2.4
2.5 # Process annotations.
2.6
2.7 - for name in ("non_accesses", "non_writes", "raises", "returns", "types"):
2.8 + for name in ("non_accesses", "non_writes", "raises", "returns", "types", "invocations"):
2.9 if hasattr(node, name):
2.10 attrs = getattr(node, name)
2.11 - setattr(node, name, self._replace(attrs))
2.12 + setattr(node, name, self._replace(attrs, name))
2.13 for name in ("accesses", "writes", "paramtypes"):
2.14 if hasattr(node, name):
2.15 d = getattr(node, name)
2.16 @@ -199,6 +199,8 @@
2.17 attr, accessor = item
2.18 value = attr.type
2.19 new_items.append((Attribute(self._get_replacement(attr.context), self._get_replacement(value)), self._get_replacement(accessor)))
2.20 + elif name == "invocations":
2.21 + new_items.add(self._get_replacement(item))
2.22 else:
2.23 attr = item
2.24 value = attr.type
3.1 --- a/simplify/simplified/program.py Mon Jul 30 00:35:54 2007 +0200
3.2 +++ b/simplify/simplified/program.py Tue Jul 31 01:05:24 2007 +0200
3.3 @@ -499,4 +499,25 @@
3.4 self.paramtypes = {}
3.5 self.namespace = Namespace() # NOTE: Temporary.
3.6
3.7 + def specialisations(self):
3.8 +
3.9 + "Return the active specialisations using only distinct instances."
3.10 +
3.11 + distinct_instances = {}
3.12 +
3.13 + subprograms = set()
3.14 + for instance, subprogram in self.copies.items() or [(None, self)]:
3.15 + if instance is None:
3.16 + subprograms.add(subprogram)
3.17 + continue
3.18 +
3.19 + cls = instance.get_class()
3.20 + if not distinct_instances.has_key(cls):
3.21 + distinct_instances[cls] = cls.get_distinct_instances()
3.22 + distinct_instance = distinct_instances[cls][instance]
3.23 + if instance is distinct_instance:
3.24 + subprograms.add(subprogram)
3.25 +
3.26 + return subprograms
3.27 +
3.28 # vim: tabstop=4 expandtab shiftwidth=4
4.1 --- a/simplify/viewer.py Mon Jul 30 00:35:54 2007 +0200
4.2 +++ b/simplify/viewer.py Tue Jul 31 01:05:24 2007 +0200
4.3 @@ -1150,10 +1150,10 @@
4.4 return self._invocations(_node.active())
4.5
4.6 def _invocations(self, nodes):
4.7 - invocations = []
4.8 + invocations = set()
4.9 for node in nodes:
4.10 if hasattr(node, "invocations"):
4.11 - invocations += node.invocations
4.12 + invocations.update(node.invocations)
4.13
4.14 # Record each link, avoiding duplicates.
4.15