1.1 --- a/simplify/annotate.py Sun Jun 24 20:06:24 2007 +0200
1.2 +++ b/simplify/annotate.py Sun Jun 24 21:55:51 2007 +0200
1.3 @@ -751,10 +751,11 @@
1.4
1.5 # NOTE: This is dependent on the tuple definition in the builtins.
1.6
1.7 - for node in maketuple.nodes:
1.8 + for i, node in enumerate(maketuple.nodes):
1.9 self.dispatch(node)
1.10 for t in tuples:
1.11 t.type.namespace.add("value", self.namespace.types)
1.12 + t.type.namespace.add("__value__%d" % i, self.namespace.types)
1.13
1.14 self.namespace.set_types(tuples)
1.15 self.annotate(maketuple)
1.16 @@ -976,7 +977,7 @@
1.17 # Utility methods.
1.18
1.19 def get_builtin_instances(self, node, name):
1.20 - return set([Attribute(None, self.new_instance(node, attr.type)) for attr in self.builtins.namespace[name]])
1.21 + return set([Attribute(None, self.new_instance(node, attr.type)) for attr in self.builtins_namespace[name]])
1.22
1.23 def new_instance(self, node, type):
1.24
2.1 --- a/simplify/ast.py Sun Jun 24 20:06:24 2007 +0200
2.2 +++ b/simplify/ast.py Sun Jun 24 21:55:51 2007 +0200
2.3 @@ -5,6 +5,12 @@
2.4 this module processes AST trees originating from the compiler module and
2.5 produces a result tree consisting of instruction-oriented program nodes.
2.6
2.7 +Some of the simplified nodes will be altered by the fixnames module, principally
2.8 +LoadName and StoreName nodes which, in the case of globals and builtins, will be
2.9 +changed to LoadAttr and StoreAttr respectively.
2.10 +
2.11 +--------
2.12 +
2.13 Copyright (C) 2006, 2007 Paul Boddie <paul@boddie.org.uk>
2.14
2.15 This software is free software; you can redistribute it and/or
2.16 @@ -225,8 +231,8 @@
2.17
2.18 # Assignments.
2.19
2.20 - def visitAssAttr(self, assattr, in_sequence=0):
2.21 - expr = self._visitAssNameOrAttr(assattr, in_sequence)
2.22 + def visitAssAttr(self, assattr, element=None):
2.23 + expr = self._visitAssNameOrAttr(assattr, element)
2.24 lvalue = self.dispatch(assattr.expr)
2.25 result = StoreAttr(assattr, 1, name=assattr.attrname, lvalue=lvalue, expr=expr)
2.26 return result
2.27 @@ -235,30 +241,42 @@
2.28 result = Assign(assign, 1)
2.29 store = StoreTemp(expr=self.dispatch(assign.expr))
2.30 release = ReleaseTemp()
2.31 - result.code = [store] + self.dispatches(assign.nodes, 0) + [release]
2.32 + result.code = [store] + self.dispatches(assign.nodes) + [release]
2.33 return result
2.34
2.35 - def visitAssList(self, asslist, in_sequence=0):
2.36 - if not in_sequence:
2.37 + def visitAssList(self, asslist, element=None):
2.38 + if element is None:
2.39 expr = LoadTemp()
2.40 else:
2.41 - expr = InvokeFunction(asslist, expr=LoadAttr(expr=LoadTemp(), name="next"))
2.42 + expr = LoadAttr(expr=LoadTemp(), name=("__value__%d" % element))
2.43 result = Assign(asslist, 1)
2.44 - store = StoreTemp(expr=InvokeFunction(asslist, expr=LoadAttr(name="__iter__", expr=expr)))
2.45 - release = ReleaseTemp()
2.46 - result.code = [store] + self.dispatches(asslist.nodes, 1) + [release]
2.47 + result.code = [StoreTemp(expr=expr)]
2.48 + for i, node in enumerate(asslist.nodes):
2.49 + result.code.append(self.dispatch(node, i))
2.50 + result.code.append(ReleaseTemp())
2.51 return result
2.52
2.53 visitAssTuple = visitAssList
2.54
2.55 - def _visitAssNameOrAttr(self, node, in_sequence):
2.56 - if not in_sequence:
2.57 + def _visitAssNameOrAttr(self, node, element=None):
2.58 +
2.59 + "Produce a suitable value for assignment from the given 'node'."
2.60 +
2.61 + if element is None:
2.62 return LoadTemp()
2.63 else:
2.64 - return InvokeFunction(node, expr=LoadAttr(expr=LoadTemp(), name="next"))
2.65 + return LoadAttr(expr=LoadTemp(), name=("__value__%d" % element))
2.66 +
2.67 + def visitAssName(self, assname, element=None):
2.68
2.69 - def visitAssName(self, assname, in_sequence=0):
2.70 - expr = self._visitAssNameOrAttr(assname, in_sequence)
2.71 + """
2.72 + Visit the 'assname' node, producing an appropriate StoreName simplified
2.73 + node which if 'element' is None will store a temporary value; otherwise,
2.74 + a special attribute will be obtained from the current temporary value in
2.75 + order to attempt to support optimised sequence assignment.
2.76 + """
2.77 +
2.78 + expr = self._visitAssNameOrAttr(assname, element)
2.79 result = StoreName(assname, 1, name=assname.name, expr=expr)
2.80 return result
2.81
2.82 @@ -1494,9 +1512,9 @@
2.83
2.84 return result
2.85
2.86 - def visitSlice(self, slice, in_sequence=0):
2.87 + def visitSlice(self, slice, element=None):
2.88 return self._visitSlice(slice, self.dispatch(slice.expr), self.dispatch_or_none(slice.lower),
2.89 - self.dispatch_or_none(slice.upper), slice.flags, self._visitAssNameOrAttr(slice, in_sequence))
2.90 + self.dispatch_or_none(slice.upper), slice.flags, self._visitAssNameOrAttr(slice, element))
2.91
2.92 def visitSliceobj(self, sliceobj):
2.93 return InvokeFunction(sliceobj, 1,
2.94 @@ -1561,10 +1579,10 @@
2.95 dstar=None
2.96 )
2.97
2.98 - def visitSubscript(self, subscript, in_sequence=0):
2.99 + def visitSubscript(self, subscript, element=None):
2.100 return self._visitSubscript(
2.101 subscript, self.dispatch(subscript.expr), self._visitSubscriptSubs(subscript, subscript.subs), subscript.flags,
2.102 - self._visitAssNameOrAttr(subscript, in_sequence)
2.103 + self._visitAssNameOrAttr(subscript, element)
2.104 )
2.105
2.106 def visitTryExcept(self, tryexcept):
3.1 --- a/tests/assign.py Sun Jun 24 20:06:24 2007 +0200
3.2 +++ b/tests/assign.py Sun Jun 24 21:55:51 2007 +0200
3.3 @@ -1,6 +1,21 @@
3.4 class A: pass
3.5 a = A()
3.6 +
3.7 a.x = 1, 2, 3
3.8 +a.y = "1", 1, 1.1
3.9 +a.z = 1, a.y, "1"
3.10 +
3.11 c = b = a.x
3.12 +e = d = a.y
3.13 +g = f = a.z
3.14 +
3.15 [x, y, z] = c
3.16 x, y, z = c
3.17 +
3.18 +[p, q, r] = e
3.19 +p, q, r = e
3.20 +
3.21 +[l, m, n] = g
3.22 +l, m, n = g
3.23 +
3.24 +l, (m1, m2, m3), n = g