# HG changeset patch # User paulb@jeremy # Date 1152917244 -7200 # Node ID fbac48c3637bd33245001772412885c7873d3028 # Parent 73af1fbf7da137be6561c97941c9aa31965b9f6a Fixed augmented slice assignments. Added the missing special methods for augmented assignment. diff -r 73af1fbf7da1 -r fbac48c3637b simplify.py --- a/simplify.py Sat Jul 15 00:46:12 2006 +0200 +++ b/simplify.py Sat Jul 15 00:47:24 2006 +0200 @@ -270,7 +270,9 @@ # Assignments. augassign_methods = { - "+=" : "__iadd__", "-=" : "__isub__", "*=" : "__imul__", "/=" : "__idiv__" + "+=" : "__iadd__", "-=" : "__isub__", "*=" : "__imul__", "/=" : "__idiv__", + "%=" : "__imod__", "**=" : "__ipow__", "<<=" : "__ilshift__", ">>=" : "__irshift__", + "&=" : "__iand__", "^=" : "__ixor__", "|=" : "__ior__" } def visitAugAssign(self, augassign): @@ -288,11 +290,11 @@ store = StoreName(expr=LoadTemp(), name=name.name) result.code = [get_incremented, store, ReleaseTemp()] - # Complicated augmented assignment: expr.attr += expr + # Complicated augmented assignment: lvalue.attr += expr elif isinstance(augassign.node, compiler.ast.Getattr): - # -> .attr.__xxx__( + # -> setattr(, getattr(, "attr").__xxx__(expr)) getattr = augassign.node store_expr = StoreTemp(index="expr", expr=self.dispatch(getattr.expr)) @@ -303,9 +305,12 @@ store = StoreAttr(expr=LoadTemp(), lvalue=LoadTemp(index="expr"), name=getattr.attrname) result.code = [store_expr, get_incremented, store, ReleaseTemp(index="expr"), ReleaseTemp()] - # Complicated augassign using slices and subscripts. + # Complicated augassign using slices: lvalue[lower:upper] += expr elif isinstance(augassign.node, compiler.ast.Slice): + + # , , -> .__setslice__(, , .__getslice__(, ).__xxx__(expr)) + slice = augassign.node store_expr = StoreTemp(index="expr", expr=self.dispatch(slice.expr)) store_lower = StoreTemp(index="lower", expr=self.dispatch_or_none(slice.lower)) @@ -314,7 +319,7 @@ get_incremented = StoreTemp( expr=Invoke(expr=LoadAttr(expr=node_slice, name=self.augassign_methods[augassign.op]), args=[expr]) ) - store = self._visitSlice(LoadTemp(index="expr"), LoadTemp(index="lower"), LoadTemp(index="upper"), "OP_ASSIGN", expr) + store = self._visitSlice(LoadTemp(index="expr"), LoadTemp(index="lower"), LoadTemp(index="upper"), "OP_ASSIGN", LoadTemp()) result.code = [store_expr, store_lower, store_upper, get_incremented, store, ReleaseTemp(index="expr"), ReleaseTemp(index="lower"), ReleaseTemp(index="upper"), ReleaseTemp()]