1.1 --- a/simplify.py Sun Jul 09 14:45:36 2006 +0200
1.2 +++ b/simplify.py Tue Jul 11 00:53:56 2006 +0200
1.3 @@ -62,6 +62,12 @@
1.4 results.append(self.dispatch(node, *args))
1.5 return results
1.6
1.7 + def dispatch_or_none(self, node, *args):
1.8 + if node is not None:
1.9 + return self.dispatch(node, *args)
1.10 + else:
1.11 + return LoadName(name="None")
1.12 +
1.13 # Placeholder or deletion transformations.
1.14
1.15 def visitStmt(self, stmt):
1.16 @@ -234,23 +240,43 @@
1.17 # Simple augmented assignment: name += expr
1.18
1.19 if isinstance(augassign.node, compiler.ast.Name):
1.20 - node = self.dispatch(augassign.node)
1.21 + name = augassign.node
1.22 + node = self.dispatch(name)
1.23 get_incremented = StoreTemp(
1.24 expr=Invoke(expr=LoadAttr(expr=node, name=self.augassign_methods[augassign.op]), args=[expr])
1.25 )
1.26 - store = StoreName(expr=LoadTemp(), name=augassign.node.name)
1.27 + store = StoreName(expr=LoadTemp(), name=name.name)
1.28 result.code = [get_incremented, store, ReleaseTemp()]
1.29
1.30 # Complicated augmented assignment: expr.attr += expr
1.31
1.32 elif isinstance(augassign.node, compiler.ast.Getattr):
1.33 - store_expr = StoreTemp(index=1, expr=self.dispatch(augassign.node.expr))
1.34 - node_attr = LoadAttr(expr=LoadTemp(index=1), name=augassign.node.attrname)
1.35 +
1.36 + # <expr> -> <expr>.attr.__xxx__(
1.37 +
1.38 + getattr = augassign.node
1.39 + store_expr = StoreTemp(index="expr", expr=self.dispatch(getattr.expr))
1.40 + node_attr = LoadAttr(expr=LoadTemp(index="expr"), name=getattr.attrname)
1.41 get_incremented = StoreTemp(
1.42 expr=Invoke(expr=LoadAttr(expr=node_attr, name=self.augassign_methods[augassign.op]), args=[expr])
1.43 )
1.44 - store = StoreAttr(expr=LoadTemp(), lvalue=LoadTemp(index=1), name=augassign.node.attrname)
1.45 - result.code = [store_expr, get_incremented, store, ReleaseTemp(index=1), ReleaseTemp()]
1.46 + store = StoreAttr(expr=LoadTemp(), lvalue=LoadTemp(index="expr"), name=getattr.attrname)
1.47 + result.code = [store_expr, get_incremented, store, ReleaseTemp(index="expr"), ReleaseTemp()]
1.48 +
1.49 + # Complicated augassign using slices and subscripts.
1.50 +
1.51 + elif isinstance(augassign.node, compiler.ast.Slice):
1.52 + slice = augassign.node
1.53 + store_expr = StoreTemp(index="expr", expr=self.dispatch(slice.expr))
1.54 + store_lower = StoreTemp(index="lower", expr=self.dispatch_or_none(slice.lower))
1.55 + store_upper = StoreTemp(index="upper", expr=self.dispatch_or_none(slice.upper))
1.56 + node_slice = self._visitSlice(LoadTemp(index="expr"), LoadTemp(index="lower"), LoadTemp(index="upper"), "OP_APPLY")
1.57 + get_incremented = StoreTemp(
1.58 + expr=Invoke(expr=LoadAttr(expr=node_slice, name=self.augassign_methods[augassign.op]), args=[expr])
1.59 + )
1.60 + store = self._visitSlice(LoadTemp(index="expr"), LoadTemp(index="lower"), LoadTemp(index="upper"), "OP_ASSIGN", expr)
1.61 + result.code = [store_expr, store_lower, store_upper, get_incremented, store,
1.62 + ReleaseTemp(index="expr"), ReleaseTemp(index="lower"), ReleaseTemp(index="upper"), ReleaseTemp()]
1.63
1.64 else:
1.65 raise NotImplementedError, augassign.node.__class__
1.66 @@ -294,6 +320,28 @@
1.67 result = StoreAttr(assattr, name=assattr.attrname, lvalue=lvalue, expr=expr)
1.68 return result
1.69
1.70 + def _visitSlice(self, expr, lower, upper, flags, value=None):
1.71 + if flags == "OP_ASSIGN":
1.72 + args = [value]
1.73 + result = Invoke(expr=LoadAttr(expr=expr, name="__setslice__"))
1.74 + elif flags == "OP_APPLY":
1.75 + args = []
1.76 + result = Invoke(expr=LoadAttr(expr=expr, name="__getslice__"))
1.77 + else:
1.78 + raise NotImplementedError, flags
1.79 +
1.80 + # Add the dimensions.
1.81 +
1.82 + args.insert(0, lower)
1.83 + args.insert(1, upper)
1.84 +
1.85 + result.args = args
1.86 + return result
1.87 +
1.88 + def visitSlice(self, slice, in_sequence=0):
1.89 + value = self._visitAssNameOrAttr(slice, in_sequence)
1.90 + return self._visitSlice(self.dispatch(slice.expr), self.dispatch_or_none(slice.lower), self.dispatch_or_none(slice.upper), slice.flags, value)
1.91 +
1.92 # Invocation and subprogram transformations.
1.93
1.94 def _visitFunction(self, function, subprogram):