1.1 --- a/annotate.py Thu Aug 03 01:00:40 2006 +0200
1.2 +++ b/annotate.py Thu Aug 03 01:02:47 2006 +0200
1.3 @@ -162,8 +162,6 @@
1.4 def __init__(self):
1.5 Visitor.__init__(self)
1.6 self.system = system
1.7 - self.types = None
1.8 - self.temp = {}
1.9
1.10 # Satisfy visitor issues.
1.11
1.12 @@ -207,6 +205,8 @@
1.13
1.14 self.returns = []
1.15 self.return_locals = []
1.16 + self.types = None
1.17 + self.temp = {}
1.18
1.19 # Add namespace details to any structure involved.
1.20
1.21 @@ -298,19 +298,21 @@
1.22
1.23 def visitLoadTemp(self, loadtemp):
1.24 index = getattr(loadtemp, "index", None)
1.25 - self.types = self.temp[index]
1.26 + self.types = self.temp[index][-1]
1.27 self.annotate(loadtemp)
1.28 return loadtemp
1.29
1.30 def visitStoreTemp(self, storetemp):
1.31 storetemp.expr = self.dispatch(storetemp.expr)
1.32 index = getattr(storetemp, "index", None)
1.33 - self.temp[index] = self.types
1.34 + if not self.temp.has_key(index):
1.35 + self.temp[index] = []
1.36 + self.temp[index].append(self.types)
1.37 return storetemp
1.38
1.39 def visitReleaseTemp(self, releasetemp):
1.40 index = getattr(releasetemp, "index", None)
1.41 - del self.temp[index]
1.42 + self.temp[index].pop()
1.43 return releasetemp
1.44
1.45 def visitLoadAttr(self, loadattr):
1.46 @@ -343,12 +345,16 @@
1.47 self.namespace = Namespace()
1.48 self.namespace.merge_namespace(saved_namespace)
1.49 conditional.body = self.dispatches(conditional.body)
1.50 + body_namespace = self.namespace
1.51
1.52 self.namespace = Namespace()
1.53 self.namespace.merge_namespace(saved_namespace)
1.54 conditional.else_ = self.dispatches(conditional.else_)
1.55 + else_namespace = self.namespace
1.56
1.57 - self.namespace = saved_namespace
1.58 + self.namespace = Namespace()
1.59 + self.namespace.merge_namespace(body_namespace)
1.60 + self.namespace.merge_namespace(else_namespace)
1.61 return conditional
1.62
1.63 def visitReturn(self, return_):
1.64 @@ -388,13 +394,12 @@
1.65 types.append(default.types)
1.66
1.67 invoke.args = args
1.68 - invoke.types = expr
1.69
1.70 # Now locate and invoke the subprogram. This can be complicated because
1.71 # the target may be a class or object, and there may be many different
1.72 # related subprograms.
1.73
1.74 - invocations = []
1.75 + invocations = {}
1.76
1.77 # Visit each callable in turn
1.78
1.79 @@ -420,7 +425,10 @@
1.80
1.81 for subprogram in subprograms:
1.82 if subprogram is not None:
1.83 - invocations.append(self.invoke_subprogram(invoke, subprogram))
1.84 + self.invoke_subprogram(invoke, subprogram)
1.85 + invocations[callable] = subprogram
1.86 +
1.87 + invoke.invocations = invocations
1.88
1.89 return invoke
1.90