1.1 --- a/simplify.py Sat Jul 08 22:59:43 2006 +0200
1.2 +++ b/simplify.py Sun Jul 09 13:45:27 2006 +0200
1.3 @@ -30,16 +30,16 @@
1.4 """
1.5 A simplifying visitor for AST nodes.
1.6
1.7 - Covered: AssAttr, AssList, AssName, AssTuple, Assign, Break, CallFunc,
1.8 - Class, Const, Continue, Dict, Discard, For, Function, Getattr,
1.9 - Global, If, Keyword, Lambda, List, Module, Name, Pass, Return,
1.10 - Stmt, TryExcept, TryFinally, Tuple, While.
1.11 + Covered: AssAttr, AssList, AssName, AssTuple, Assign, AugAssign, Break,
1.12 + CallFunc, Class, Const, Continue, Dict, Discard, For, Function,
1.13 + Getattr, Global, If, Keyword, Lambda, List, Module, Name, Pass,
1.14 + Return, Stmt, TryExcept, TryFinally, Tuple, While.
1.15
1.16 - Missing: Add, And, Assert, AugAssign, Backquote, Bitand, Bitor, Bitxor,
1.17 - Compare, Decorators, Div, Ellipsis, Exec, FloorDiv, From, Import,
1.18 - Invert, LeftShift, ListComp, ListCompFor, ListCompIf, Mod, Mul,
1.19 - Not, Or, Power, Print, Printnl, Raise, RightShift, Slice,
1.20 - Sliceobj, Sub, Subscript, UnaryAdd, UnarySub, Yield.
1.21 + Missing: Add, And, Assert, Backquote, Bitand, Bitor, Bitxor, Compare,
1.22 + Decorators, Div, Ellipsis, Exec, FloorDiv, From, Import, Invert,
1.23 + LeftShift, ListComp, ListCompFor, ListCompIf, Mod, Mul, Not, Or,
1.24 + Power, Print, Printnl, Raise, RightShift, Slice, Sliceobj, Sub,
1.25 + Subscript, UnaryAdd, UnarySub, Yield.
1.26 """
1.27
1.28 def __init__(self):
1.29 @@ -185,6 +185,40 @@
1.30
1.31 # Assignments.
1.32
1.33 + augassign_methods = {
1.34 + "+=" : "__iadd__", "-=" : "__isub__", "*=" : "__imul__", "/=" : "__idiv__"
1.35 + }
1.36 +
1.37 + def visitAugAssign(self, augassign):
1.38 + result = Assign(augassign)
1.39 + expr = self.dispatch(augassign.expr)
1.40 +
1.41 + # Simple augmented assignment: name += expr
1.42 +
1.43 + if isinstance(augassign.node, compiler.ast.Name):
1.44 + node = self.dispatch(augassign.node)
1.45 + get_incremented = StoreTemp(
1.46 + expr=Invoke(expr=LoadAttr(expr=node, name=self.augassign_methods[augassign.op]), args=[expr])
1.47 + )
1.48 + store = StoreName(expr=LoadTemp(), name=augassign.node.name)
1.49 + result.code = [get_incremented, store, ReleaseTemp()]
1.50 +
1.51 + # Complicated augmented assignment: expr.attr += expr
1.52 +
1.53 + elif isinstance(augassign.node, compiler.ast.Getattr):
1.54 + store_expr = StoreTemp(index=1, expr=self.dispatch(augassign.node.expr))
1.55 + node_attr = LoadAttr(expr=LoadTemp(index=1), name=augassign.node.attrname)
1.56 + get_incremented = StoreTemp(
1.57 + expr=Invoke(expr=LoadAttr(expr=node_attr, name=self.augassign_methods[augassign.op]), args=[expr])
1.58 + )
1.59 + store = StoreAttr(expr=LoadTemp(), lvalue=LoadTemp(index=1), name=augassign.node.attrname)
1.60 + result.code = [store_expr, get_incremented, store, ReleaseTemp(index=1), ReleaseTemp()]
1.61 +
1.62 + else:
1.63 + raise NotImplementedError, augassign.node.__class__
1.64 +
1.65 + return result
1.66 +
1.67 def visitAssign(self, assign):
1.68 result = Assign(assign)
1.69 store = StoreTemp(expr=self.dispatch(assign.expr))