1.1 --- a/annotate.py Mon Feb 26 00:53:19 2007 +0100
1.2 +++ b/annotate.py Mon Feb 26 00:59:15 2007 +0100
1.3 @@ -179,9 +179,11 @@
1.4 else:
1.5 self.builtins_namespace = self.global_namespace
1.6
1.7 - return self.process_node(module, self.global_namespace)
1.8 + # NOTE: Not declaring module namespace usage, even though it is used.
1.9
1.10 - def process_node(self, node, locals):
1.11 + return self.process_node(module, self.global_namespace, 0)
1.12 +
1.13 + def process_node(self, node, locals, using_module_namespace):
1.14
1.15 """
1.16 Process a subprogram or module 'node', indicating the initial 'locals'.
1.17 @@ -223,34 +225,64 @@
1.18 # Dispatch to the code itself.
1.19
1.20 node.namespace = self.namespace
1.21 + self.set_module_namespace(using_module_namespace)
1.22 +
1.23 result = self.dispatch(node)
1.24 + self.extract_results(result)
1.25
1.26 while self.rerun_subprograms.has_key(node):
1.27 all_rerun_locals = self.rerun_subprograms[node]
1.28 del self.rerun_subprograms[node]
1.29 for rerun_locals in all_rerun_locals:
1.30 print "Re-running", node, "with", rerun_locals
1.31 - node.namespace = self.namespace = rerun_locals
1.32 - result = self.dispatch(node)
1.33
1.34 - result.namespace = self.namespace
1.35 - if not hasattr(result, "raises"):
1.36 - result.raises = []
1.37 - combine(result.raises, self.namespace.raises)
1.38 + self.namespace = rerun_locals
1.39 + node.namespace = rerun_locals
1.40 + self.set_module_namespace(using_module_namespace)
1.41
1.42 - # Obtain the return values.
1.43 -
1.44 - self.last_returns = self.namespace.returns
1.45 - self.last_raises = self.namespace.raises
1.46 - self.returned_locals = self.namespace.return_locals
1.47 + result = self.dispatch(node)
1.48 + self.extract_results(result)
1.49
1.50 # Restore the previous subprogram and namespace.
1.51
1.52 self.namespace = self.current_namespaces.pop()
1.53 self.current_subprograms.pop()
1.54 + self.reset_module_namespace(using_module_namespace)
1.55
1.56 return result
1.57
1.58 + def set_module_namespace(self, using_module_namespace):
1.59 +
1.60 + """
1.61 + In order to keep global accesses working, the module namespace must be
1.62 + adjusted.
1.63 + """
1.64 +
1.65 + if using_module_namespace:
1.66 + self.module.namespace = self.namespace
1.67 +
1.68 + def reset_module_namespace(self, using_module_namespace):
1.69 +
1.70 + """
1.71 + In order to keep global accesses working, the module namespace must be
1.72 + reset.
1.73 + """
1.74 +
1.75 + if using_module_namespace:
1.76 + self.module.namespace = self.namespace
1.77 +
1.78 + def extract_results(self, result):
1.79 +
1.80 + "Extract results from the namespace."
1.81 +
1.82 + result.namespace = self.namespace
1.83 + if hasattr(result, "raises"):
1.84 + combine(result.raises, self.namespace.raises)
1.85 + if hasattr(result, "returns"):
1.86 + combine(result.returns, self.namespace.returns)
1.87 + if hasattr(result, "return_locals"):
1.88 + combine(result.return_locals, self.namespace.return_locals)
1.89 +
1.90 def annotate(self, node, types=None):
1.91
1.92 """
1.93 @@ -258,7 +290,10 @@
1.94 'types' or the namespace's current type information.
1.95 """
1.96
1.97 - self.system.annotate(node, types or self.namespace.types)
1.98 + if types is None:
1.99 + self.system.annotate(node, self.namespace.types)
1.100 + else:
1.101 + self.system.annotate(node, types)
1.102
1.103 def annotate_parameters(self, node, items):
1.104
1.105 @@ -655,7 +690,7 @@
1.106 raised.
1.107 """
1.108
1.109 - self.namespace.set_types(self.namespace.raises[:])
1.110 + self.namespace.set_types(self.namespace.raises)
1.111 self.annotate(loadexc)
1.112 return loadexc
1.113
1.114 @@ -1004,19 +1039,14 @@
1.115 namespace.store(target.name, [Attribute(None, target)])
1.116
1.117 # Process the subprogram.
1.118 - # In order to keep global accesses working, the module namespace must be
1.119 - # adjusted.
1.120
1.121 - if using_module_namespace:
1.122 - self.module.namespace = namespace
1.123 -
1.124 - self.process_node(target, namespace)
1.125 + self.process_node(target, namespace, using_module_namespace)
1.126
1.127 # NOTE: Improve and verify this.
1.128 # If the invocation returns a value, acquire the return types.
1.129
1.130 if getattr(target, "returns_value", 0):
1.131 - self.namespace.set_types(self.last_returns)
1.132 + self.namespace.set_types(target.returns)
1.133 self.annotate(invoke)
1.134
1.135 # If it is a normal block, merge the locals.
1.136 @@ -1029,7 +1059,7 @@
1.137
1.138 # Merge the locals snapshots.
1.139
1.140 - for locals in self.returned_locals:
1.141 + for locals in target.return_locals:
1.142
1.143 # For blocks returning values (such as operations), do not merge
1.144 # snapshots or results.
1.145 @@ -1048,14 +1078,8 @@
1.146
1.147 if not hasattr(invoke, "raises"):
1.148 invoke.raises = []
1.149 - combine(invoke.raises, self.last_raises)
1.150 - combine(self.namespace.raises, self.last_raises)
1.151 -
1.152 - # In order to keep global accesses working, the module namespace must be
1.153 - # adjusted.
1.154 -
1.155 - if using_module_namespace:
1.156 - self.module.namespace = self.namespace
1.157 + combine(invoke.raises, target.raises)
1.158 + combine(self.namespace.raises, target.raises)
1.159
1.160 def process_args(self, invocation):
1.161
1.162 @@ -1253,19 +1277,22 @@
1.163 )
1.164 ]
1.165
1.166 + new_subprogram = Subprogram(
1.167 + instance=instance,
1.168 + name=None,
1.169 + returns_value=1,
1.170 + params=[],
1.171 + star=None,
1.172 + dstar=None,
1.173 + code=code
1.174 + )
1.175 + subprogram.module.simplifier.subnames[new_subprogram.full_name()] = new_subprogram
1.176 +
1.177 invocation.stars[subprogram.full_name()] = InvokeRef(
1.178 invocation.original,
1.179 instance=instance,
1.180 produces_result=1,
1.181 - ref=Subprogram(
1.182 - instance=instance,
1.183 - name=None,
1.184 - returns_value=1,
1.185 - params=[],
1.186 - star=None,
1.187 - dstar=None,
1.188 - code=code
1.189 - )
1.190 + ref=new_subprogram
1.191 )
1.192
1.193 return invocation.stars[subprogram.full_name()]
1.194 @@ -1368,19 +1395,22 @@
1.195 )
1.196 ]
1.197
1.198 + new_subprogram = Subprogram(
1.199 + instance=instance,
1.200 + name=None,
1.201 + returns_value=1,
1.202 + params=[],
1.203 + star=None,
1.204 + dstar=None,
1.205 + code=code
1.206 + )
1.207 + subprogram.module.simplifier.subnames[new_subprogram.full_name()] = new_subprogram
1.208 +
1.209 invocation.dstars[subprogram.full_name()] = InvokeRef(
1.210 invocation.original,
1.211 instance=instance,
1.212 produces_result=1,
1.213 - ref=Subprogram(
1.214 - instance=instance,
1.215 - name=None,
1.216 - returns_value=1,
1.217 - params=[],
1.218 - star=None,
1.219 - dstar=None,
1.220 - code=code
1.221 - )
1.222 + ref=new_subprogram
1.223 )
1.224
1.225 return invocation.dstars[subprogram.full_name()]
1.226 @@ -1414,7 +1444,7 @@
1.227
1.228 "Set the current collection of 'types'."
1.229
1.230 - self.types = types
1.231 + self.types = types[:]
1.232
1.233 def add(self, name, types):
1.234
1.235 @@ -1429,7 +1459,7 @@
1.236
1.237 "Store in (or associate with) the given 'name' the specified 'types'."
1.238
1.239 - self.names[name] = types
1.240 + self.names[name] = types[:]
1.241
1.242 __setitem__ = store
1.243
1.244 @@ -1476,10 +1506,10 @@
1.245 """
1.246
1.247 self.merge_items(namespace.names.items())
1.248 + combine(self.raises, namespace.raises)
1.249 if everything:
1.250 combine(self.returns, namespace.returns)
1.251 combine(self.return_locals, namespace.return_locals)
1.252 - combine(self.raises, namespace.raises)
1.253 for name, values in namespace.temp.items():
1.254 if values:
1.255 if not self.temp.has_key(name) or not self.temp[name]:
1.256 @@ -1518,7 +1548,7 @@
1.257 self.names = {}
1.258
1.259 def __repr__(self):
1.260 - return repr(self.names)
1.261 + return repr(self.names) + " (temp) " + repr(self.temp)
1.262
1.263 class Importer:
1.264
1.265 @@ -1756,6 +1786,14 @@
1.266
1.267 return results
1.268
1.269 +def prompt(vars):
1.270 + try:
1.271 + while 1:
1.272 + s = raw_input("> ")
1.273 + print eval(s)
1.274 + except EOFError:
1.275 + pass
1.276 +
1.277 # Convenience functions.
1.278
1.279 def load(name, builtins=None, module_name=None, importer=None, no_annotate=0):
2.1 --- a/simplified.py Mon Feb 26 00:53:19 2007 +0100
2.2 +++ b/simplified.py Mon Feb 26 00:59:15 2007 +0100
2.3 @@ -516,6 +516,9 @@
2.4 def __init__(self, *args, **kw):
2.5 Node.__init__(self, *args, **kw)
2.6 WithName.__init__(self)
2.7 + self.returns = []
2.8 + self.return_locals = []
2.9 + self.raises = []
2.10
2.11 class Module(Comparable):
2.12
2.13 @@ -601,8 +604,10 @@
2.14
2.15 key = (subprogram, instance)
2.16 if not self.attributes_for_instances.has_key(key):
2.17 - self.attributes_for_instances[key] = Attribute(attribute.context, subprogram.copy(instance, subprogram.full_name()))
2.18 - print "New subprogram", self.attributes_for_instances[key].type, "for", key
2.19 + new_subprogram = subprogram.copy(instance, subprogram.full_name())
2.20 + subprogram.module.simplifier.subnames[new_subprogram.full_name()] = new_subprogram
2.21 + self.attributes_for_instances[key] = Attribute(attribute.context, new_subprogram)
2.22 + print "New subprogram", new_subprogram, "for", key
2.23
2.24 return self.attributes_for_instances[key]
2.25
2.26 @@ -642,8 +647,8 @@
2.27
2.28 def has_instance(self, node):
2.29 requesting_instance = getattr(node, "instance", None)
2.30 - return requesting_instance is not None and requesting_instance.get_class() is self or \
2.31 - self.instance_relations.has_key(requesting_instance) or self.instances.has_key(self._get_key(node))
2.32 + #return requesting_instance is not None and requesting_instance.get_class() is self or \
2.33 + return self.instance_relations.has_key(requesting_instance) or self.instances.has_key(self._get_key(node))
2.34
2.35 def add_instance(self, node, instance):
2.36 requesting_instance = getattr(node, "instance", None)
2.37 @@ -655,8 +660,8 @@
2.38
2.39 def get_instance(self, node):
2.40 requesting_instance = getattr(node, "instance", None)
2.41 - if requesting_instance is not None and requesting_instance.get_class() is self:
2.42 - return requesting_instance
2.43 + #if requesting_instance is not None and requesting_instance.get_class() is self:
2.44 + # return requesting_instance
2.45 return self.instance_relations.get(requesting_instance) or self.instances[self._get_key(node)]
2.46
2.47 class Instance(Structure):
2.48 @@ -692,7 +697,10 @@
2.49 # NOTE: initialise built-in types, initialise built-in constants.
2.50
2.51 #def full_name(self):
2.52 - # return self.typename + "-c"
2.53 + # try:
2.54 + # return Instance.full_name(self)
2.55 + # except KeyError:
2.56 + # return self.typename + "-c"
2.57
2.58 class Attribute:
2.59