[pypy-svn] r29833 - in pypy/dist/pypy/interpreter/astcompiler: . test

mwh at codespeak.net mwh at codespeak.net
Sat Jul 8 16:06:46 CEST 2006


Author: mwh
Date: Sat Jul  8 16:06:42 2006
New Revision: 29833

Modified:
   pypy/dist/pypy/interpreter/astcompiler/ast.py
   pypy/dist/pypy/interpreter/astcompiler/ast.txt
   pypy/dist/pypy/interpreter/astcompiler/astgen.py
   pypy/dist/pypy/interpreter/astcompiler/test/test_ast.py
Log:
(mwh, misto)
implemented removing nodes from a list of nodes (return None from the visitor
method).
test this, and fix bugs thus uncovered.


Modified: pypy/dist/pypy/interpreter/astcompiler/ast.py
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/ast.py	(original)
+++ pypy/dist/pypy/interpreter/astcompiler/ast.py	Sat Jul  8 16:06:42 2006
@@ -375,7 +375,12 @@
         return visitor.visitAnd(self)
 
     def mutate(self, visitor):
-        self.nodes[:] = [n.mutate(visitor) for n in self.nodes]
+        newlist = []
+        for n in self.nodes:
+            item = n.mutate(visitor)
+            if item is not None:
+                newlist.append(item)
+        self.nodes[:] = newlist
         return visitor.visitAnd(self)
 
     def fget_nodes( space, self):
@@ -405,9 +410,10 @@
         w_item_mutate = space.getattr(w_item, space.wrap("mutate"))
         w_item_mutate_args = Arguments(space, [ w_visitor ])
         w_newitem = space.call_args(w_item_mutate, w_item_mutate_args)
-        newlist_w.append(w_newitem)
+        if not space.is_w(w_newitem, space.w_None):
+            newlist_w.append(w_newitem)
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("nodes"), w_newlist)
     w_visitAnd = space.getattr(w_visitor, space.wrap("visitAnd"))
     w_visitAnd_args = Arguments(space, [ w_self ])
     return space.call_args(w_visitAnd, w_visitAnd_args)
@@ -555,7 +561,12 @@
         return visitor.visitAssList(self)
 
     def mutate(self, visitor):
-        self.nodes[:] = [n.mutate(visitor) for n in self.nodes]
+        newlist = []
+        for n in self.nodes:
+            item = n.mutate(visitor)
+            if item is not None:
+                newlist.append(item)
+        self.nodes[:] = newlist
         return visitor.visitAssList(self)
 
     def fget_nodes( space, self):
@@ -585,9 +596,10 @@
         w_item_mutate = space.getattr(w_item, space.wrap("mutate"))
         w_item_mutate_args = Arguments(space, [ w_visitor ])
         w_newitem = space.call_args(w_item_mutate, w_item_mutate_args)
-        newlist_w.append(w_newitem)
+        if not space.is_w(w_newitem, space.w_None):
+            newlist_w.append(w_newitem)
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("nodes"), w_newlist)
     w_visitAssList = space.getattr(w_visitor, space.wrap("visitAssList"))
     w_visitAssList_args = Arguments(space, [ w_self ])
     return space.call_args(w_visitAssList, w_visitAssList_args)
@@ -692,7 +704,12 @@
         return visitor.visitAssTuple(self)
 
     def mutate(self, visitor):
-        self.nodes[:] = [n.mutate(visitor) for n in self.nodes]
+        newlist = []
+        for n in self.nodes:
+            item = n.mutate(visitor)
+            if item is not None:
+                newlist.append(item)
+        self.nodes[:] = newlist
         return visitor.visitAssTuple(self)
 
     def fget_nodes( space, self):
@@ -722,9 +739,10 @@
         w_item_mutate = space.getattr(w_item, space.wrap("mutate"))
         w_item_mutate_args = Arguments(space, [ w_visitor ])
         w_newitem = space.call_args(w_item_mutate, w_item_mutate_args)
-        newlist_w.append(w_newitem)
+        if not space.is_w(w_newitem, space.w_None):
+            newlist_w.append(w_newitem)
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("nodes"), w_newlist)
     w_visitAssTuple = space.getattr(w_visitor, space.wrap("visitAssTuple"))
     w_visitAssTuple_args = Arguments(space, [ w_self ])
     return space.call_args(w_visitAssTuple, w_visitAssTuple_args)
@@ -846,7 +864,12 @@
         return visitor.visitAssign(self)
 
     def mutate(self, visitor):
-        self.nodes[:] = [n.mutate(visitor) for n in self.nodes]
+        newlist = []
+        for n in self.nodes:
+            item = n.mutate(visitor)
+            if item is not None:
+                newlist.append(item)
+        self.nodes[:] = newlist
         self.expr = self.expr.mutate(visitor)
         return visitor.visitAssign(self)
 
@@ -883,9 +906,10 @@
         w_item_mutate = space.getattr(w_item, space.wrap("mutate"))
         w_item_mutate_args = Arguments(space, [ w_visitor ])
         w_newitem = space.call_args(w_item_mutate, w_item_mutate_args)
-        newlist_w.append(w_newitem)
+        if not space.is_w(w_newitem, space.w_None):
+            newlist_w.append(w_newitem)
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("nodes"), w_newlist)
     w_expr = space.getattr(w_self, space.wrap("expr"))
     w_mutate_expr = space.getattr(w_expr, space.wrap("mutate"))
     w_mutate_expr_args = Arguments(space, [ w_visitor ])
@@ -1146,7 +1170,12 @@
         return visitor.visitBitand(self)
 
     def mutate(self, visitor):
-        self.nodes[:] = [n.mutate(visitor) for n in self.nodes]
+        newlist = []
+        for n in self.nodes:
+            item = n.mutate(visitor)
+            if item is not None:
+                newlist.append(item)
+        self.nodes[:] = newlist
         return visitor.visitBitand(self)
 
     def fget_nodes( space, self):
@@ -1176,9 +1205,10 @@
         w_item_mutate = space.getattr(w_item, space.wrap("mutate"))
         w_item_mutate_args = Arguments(space, [ w_visitor ])
         w_newitem = space.call_args(w_item_mutate, w_item_mutate_args)
-        newlist_w.append(w_newitem)
+        if not space.is_w(w_newitem, space.w_None):
+            newlist_w.append(w_newitem)
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("nodes"), w_newlist)
     w_visitBitand = space.getattr(w_visitor, space.wrap("visitBitand"))
     w_visitBitand_args = Arguments(space, [ w_self ])
     return space.call_args(w_visitBitand, w_visitBitand_args)
@@ -1211,7 +1241,12 @@
         return visitor.visitBitor(self)
 
     def mutate(self, visitor):
-        self.nodes[:] = [n.mutate(visitor) for n in self.nodes]
+        newlist = []
+        for n in self.nodes:
+            item = n.mutate(visitor)
+            if item is not None:
+                newlist.append(item)
+        self.nodes[:] = newlist
         return visitor.visitBitor(self)
 
     def fget_nodes( space, self):
@@ -1241,9 +1276,10 @@
         w_item_mutate = space.getattr(w_item, space.wrap("mutate"))
         w_item_mutate_args = Arguments(space, [ w_visitor ])
         w_newitem = space.call_args(w_item_mutate, w_item_mutate_args)
-        newlist_w.append(w_newitem)
+        if not space.is_w(w_newitem, space.w_None):
+            newlist_w.append(w_newitem)
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("nodes"), w_newlist)
     w_visitBitor = space.getattr(w_visitor, space.wrap("visitBitor"))
     w_visitBitor_args = Arguments(space, [ w_self ])
     return space.call_args(w_visitBitor, w_visitBitor_args)
@@ -1276,7 +1312,12 @@
         return visitor.visitBitxor(self)
 
     def mutate(self, visitor):
-        self.nodes[:] = [n.mutate(visitor) for n in self.nodes]
+        newlist = []
+        for n in self.nodes:
+            item = n.mutate(visitor)
+            if item is not None:
+                newlist.append(item)
+        self.nodes[:] = newlist
         return visitor.visitBitxor(self)
 
     def fget_nodes( space, self):
@@ -1306,9 +1347,10 @@
         w_item_mutate = space.getattr(w_item, space.wrap("mutate"))
         w_item_mutate_args = Arguments(space, [ w_visitor ])
         w_newitem = space.call_args(w_item_mutate, w_item_mutate_args)
-        newlist_w.append(w_newitem)
+        if not space.is_w(w_newitem, space.w_None):
+            newlist_w.append(w_newitem)
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("nodes"), w_newlist)
     w_visitBitxor = space.getattr(w_visitor, space.wrap("visitBitxor"))
     w_visitBitxor_args = Arguments(space, [ w_self ])
     return space.call_args(w_visitBitxor, w_visitBitxor_args)
@@ -1397,7 +1439,12 @@
 
     def mutate(self, visitor):
         self.node = self.node.mutate(visitor)
-        self.args[:] = [n.mutate(visitor) for n in self.args]
+        newlist = []
+        for n in self.args:
+            item = n.mutate(visitor)
+            if item is not None:
+                newlist.append(item)
+        self.args[:] = newlist
         if self.star_args is not None:
             self.star_args = self.star_args.mutate(visitor)
         if self.dstar_args is not None:
@@ -1461,9 +1508,10 @@
         w_item_mutate = space.getattr(w_item, space.wrap("mutate"))
         w_item_mutate_args = Arguments(space, [ w_visitor ])
         w_newitem = space.call_args(w_item_mutate, w_item_mutate_args)
-        newlist_w.append(w_newitem)
+        if not space.is_w(w_newitem, space.w_None):
+            newlist_w.append(w_newitem)
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("args"), w_newlist)
     w_star_args = space.getattr(w_self, space.wrap("star_args"))
     if not space.is_w(w_star_args, space.w_None):
         w_mutate_star_args = space.getattr(w_star_args, space.wrap("mutate"))
@@ -1522,7 +1570,12 @@
         return visitor.visitClass(self)
 
     def mutate(self, visitor):
-        self.bases[:] = [n.mutate(visitor) for n in self.bases]
+        newlist = []
+        for n in self.bases:
+            item = n.mutate(visitor)
+            if item is not None:
+                newlist.append(item)
+        self.bases[:] = newlist
         self.code = self.code.mutate(visitor)
         return visitor.visitClass(self)
 
@@ -1572,9 +1625,10 @@
         w_item_mutate = space.getattr(w_item, space.wrap("mutate"))
         w_item_mutate_args = Arguments(space, [ w_visitor ])
         w_newitem = space.call_args(w_item_mutate, w_item_mutate_args)
-        newlist_w.append(w_newitem)
+        if not space.is_w(w_newitem, space.w_None):
+            newlist_w.append(w_newitem)
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("bases"), w_newlist)
     w_code = space.getattr(w_self, space.wrap("code"))
     w_mutate_code = space.getattr(w_code, space.wrap("mutate"))
     w_mutate_code_args = Arguments(space, [ w_visitor ])
@@ -1691,7 +1745,7 @@
         
         newlist_w.append(space.newtuple([w_opname, w_newnode]))
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("ops"), w_newlist)
     w_visitCompare = space.getattr(w_visitor, space.wrap("visitCompare"))
     w_visitCompare_args = Arguments(space, [ w_self ])
     return space.call_args(w_visitCompare, w_visitCompare_args)
@@ -1908,7 +1962,12 @@
         return visitor.visitDecorators(self)
 
     def mutate(self, visitor):
-        self.nodes[:] = [n.mutate(visitor) for n in self.nodes]
+        newlist = []
+        for n in self.nodes:
+            item = n.mutate(visitor)
+            if item is not None:
+                newlist.append(item)
+        self.nodes[:] = newlist
         return visitor.visitDecorators(self)
 
     def fget_nodes( space, self):
@@ -1938,9 +1997,10 @@
         w_item_mutate = space.getattr(w_item, space.wrap("mutate"))
         w_item_mutate_args = Arguments(space, [ w_visitor ])
         w_newitem = space.call_args(w_item_mutate, w_item_mutate_args)
-        newlist_w.append(w_newitem)
+        if not space.is_w(w_newitem, space.w_None):
+            newlist_w.append(w_newitem)
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("nodes"), w_newlist)
     w_visitDecorators = space.getattr(w_visitor, space.wrap("visitDecorators"))
     w_visitDecorators_args = Arguments(space, [ w_self ])
     return space.call_args(w_visitDecorators, w_visitDecorators_args)
@@ -2035,7 +2095,7 @@
         
         newlist_w.append(space.newtuple([w_newkey, w_newvalue]))
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("items"), w_newlist)
     w_visitDict = space.getattr(w_visitor, space.wrap("visitDict"))
     w_visitDict_args = Arguments(space, [ w_self ])
     return space.call_args(w_visitDict, w_visitDict_args)
@@ -2646,8 +2706,18 @@
     def mutate(self, visitor):
         if self.decorators is not None:
             self.decorators = self.decorators.mutate(visitor)
-        self.argnames[:] = [n.mutate(visitor) for n in self.argnames]
-        self.defaults[:] = [n.mutate(visitor) for n in self.defaults]
+        newlist = []
+        for n in self.argnames:
+            item = n.mutate(visitor)
+            if item is not None:
+                newlist.append(item)
+        self.argnames[:] = newlist
+        newlist = []
+        for n in self.defaults:
+            item = n.mutate(visitor)
+            if item is not None:
+                newlist.append(item)
+        self.defaults[:] = newlist
         self.code = self.code.mutate(visitor)
         return visitor.visitFunction(self)
 
@@ -2727,9 +2797,10 @@
         w_item_mutate = space.getattr(w_item, space.wrap("mutate"))
         w_item_mutate_args = Arguments(space, [ w_visitor ])
         w_newitem = space.call_args(w_item_mutate, w_item_mutate_args)
-        newlist_w.append(w_newitem)
+        if not space.is_w(w_newitem, space.w_None):
+            newlist_w.append(w_newitem)
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("argnames"), w_newlist)
     w_list = space.getattr(w_self, space.wrap("defaults"))
     list_w = space.unpackiterable(w_list)
     newlist_w = []
@@ -2737,9 +2808,10 @@
         w_item_mutate = space.getattr(w_item, space.wrap("mutate"))
         w_item_mutate_args = Arguments(space, [ w_visitor ])
         w_newitem = space.call_args(w_item_mutate, w_item_mutate_args)
-        newlist_w.append(w_newitem)
+        if not space.is_w(w_newitem, space.w_None):
+            newlist_w.append(w_newitem)
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("defaults"), w_newlist)
     w_code = space.getattr(w_self, space.wrap("code"))
     w_mutate_code = space.getattr(w_code, space.wrap("mutate"))
     w_mutate_code_args = Arguments(space, [ w_visitor ])
@@ -2858,7 +2930,12 @@
     def mutate(self, visitor):
         self.assign = self.assign.mutate(visitor)
         self.iter = self.iter.mutate(visitor)
-        self.ifs[:] = [n.mutate(visitor) for n in self.ifs]
+        newlist = []
+        for n in self.ifs:
+            item = n.mutate(visitor)
+            if item is not None:
+                newlist.append(item)
+        self.ifs[:] = newlist
         return visitor.visitGenExprFor(self)
 
     def fget_assign( space, self):
@@ -2912,9 +2989,10 @@
         w_item_mutate = space.getattr(w_item, space.wrap("mutate"))
         w_item_mutate_args = Arguments(space, [ w_visitor ])
         w_newitem = space.call_args(w_item_mutate, w_item_mutate_args)
-        newlist_w.append(w_newitem)
+        if not space.is_w(w_newitem, space.w_None):
+            newlist_w.append(w_newitem)
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("ifs"), w_newlist)
     w_visitGenExprFor = space.getattr(w_visitor, space.wrap("visitGenExprFor"))
     w_visitGenExprFor_args = Arguments(space, [ w_self ])
     return space.call_args(w_visitGenExprFor, w_visitGenExprFor_args)
@@ -3012,7 +3090,12 @@
 
     def mutate(self, visitor):
         self.expr = self.expr.mutate(visitor)
-        self.quals[:] = [n.mutate(visitor) for n in self.quals]
+        newlist = []
+        for n in self.quals:
+            item = n.mutate(visitor)
+            if item is not None:
+                newlist.append(item)
+        self.quals[:] = newlist
         return visitor.visitGenExprInner(self)
 
     def fget_expr( space, self):
@@ -3054,9 +3137,10 @@
         w_item_mutate = space.getattr(w_item, space.wrap("mutate"))
         w_item_mutate_args = Arguments(space, [ w_visitor ])
         w_newitem = space.call_args(w_item_mutate, w_item_mutate_args)
-        newlist_w.append(w_newitem)
+        if not space.is_w(w_newitem, space.w_None):
+            newlist_w.append(w_newitem)
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("quals"), w_newlist)
     w_visitGenExprInner = space.getattr(w_visitor, space.wrap("visitGenExprInner"))
     w_visitGenExprInner_args = Arguments(space, [ w_self ])
     return space.call_args(w_visitGenExprInner, w_visitGenExprInner_args)
@@ -3286,7 +3370,7 @@
         newlist_w.append(space.newtuple([w_newtest, w_newsuite]))
     
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("tests"), w_newlist)
     w_else_ = space.getattr(w_self, space.wrap("else_"))
     if not space.is_w(w_else_, space.w_None):
         w_mutate_else_ = space.getattr(w_else_, space.wrap("mutate"))
@@ -3538,8 +3622,18 @@
         return visitor.visitLambda(self)
 
     def mutate(self, visitor):
-        self.argnames[:] = [n.mutate(visitor) for n in self.argnames]
-        self.defaults[:] = [n.mutate(visitor) for n in self.defaults]
+        newlist = []
+        for n in self.argnames:
+            item = n.mutate(visitor)
+            if item is not None:
+                newlist.append(item)
+        self.argnames[:] = newlist
+        newlist = []
+        for n in self.defaults:
+            item = n.mutate(visitor)
+            if item is not None:
+                newlist.append(item)
+        self.defaults[:] = newlist
         self.code = self.code.mutate(visitor)
         return visitor.visitLambda(self)
 
@@ -3590,9 +3684,10 @@
         w_item_mutate = space.getattr(w_item, space.wrap("mutate"))
         w_item_mutate_args = Arguments(space, [ w_visitor ])
         w_newitem = space.call_args(w_item_mutate, w_item_mutate_args)
-        newlist_w.append(w_newitem)
+        if not space.is_w(w_newitem, space.w_None):
+            newlist_w.append(w_newitem)
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("argnames"), w_newlist)
     w_list = space.getattr(w_self, space.wrap("defaults"))
     list_w = space.unpackiterable(w_list)
     newlist_w = []
@@ -3600,9 +3695,10 @@
         w_item_mutate = space.getattr(w_item, space.wrap("mutate"))
         w_item_mutate_args = Arguments(space, [ w_visitor ])
         w_newitem = space.call_args(w_item_mutate, w_item_mutate_args)
-        newlist_w.append(w_newitem)
+        if not space.is_w(w_newitem, space.w_None):
+            newlist_w.append(w_newitem)
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("defaults"), w_newlist)
     w_code = space.getattr(w_self, space.wrap("code"))
     w_mutate_code = space.getattr(w_code, space.wrap("mutate"))
     w_mutate_code_args = Arguments(space, [ w_visitor ])
@@ -3716,7 +3812,12 @@
         return visitor.visitList(self)
 
     def mutate(self, visitor):
-        self.nodes[:] = [n.mutate(visitor) for n in self.nodes]
+        newlist = []
+        for n in self.nodes:
+            item = n.mutate(visitor)
+            if item is not None:
+                newlist.append(item)
+        self.nodes[:] = newlist
         return visitor.visitList(self)
 
     def fget_nodes( space, self):
@@ -3746,9 +3847,10 @@
         w_item_mutate = space.getattr(w_item, space.wrap("mutate"))
         w_item_mutate_args = Arguments(space, [ w_visitor ])
         w_newitem = space.call_args(w_item_mutate, w_item_mutate_args)
-        newlist_w.append(w_newitem)
+        if not space.is_w(w_newitem, space.w_None):
+            newlist_w.append(w_newitem)
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("nodes"), w_newlist)
     w_visitList = space.getattr(w_visitor, space.wrap("visitList"))
     w_visitList_args = Arguments(space, [ w_self ])
     return space.call_args(w_visitList, w_visitList_args)
@@ -3787,7 +3889,12 @@
 
     def mutate(self, visitor):
         self.expr = self.expr.mutate(visitor)
-        self.quals[:] = [n.mutate(visitor) for n in self.quals]
+        newlist = []
+        for n in self.quals:
+            item = n.mutate(visitor)
+            if item is not None:
+                newlist.append(item)
+        self.quals[:] = newlist
         return visitor.visitListComp(self)
 
     def fget_expr( space, self):
@@ -3829,9 +3936,10 @@
         w_item_mutate = space.getattr(w_item, space.wrap("mutate"))
         w_item_mutate_args = Arguments(space, [ w_visitor ])
         w_newitem = space.call_args(w_item_mutate, w_item_mutate_args)
-        newlist_w.append(w_newitem)
+        if not space.is_w(w_newitem, space.w_None):
+            newlist_w.append(w_newitem)
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("quals"), w_newlist)
     w_visitListComp = space.getattr(w_visitor, space.wrap("visitListComp"))
     w_visitListComp_args = Arguments(space, [ w_self ])
     return space.call_args(w_visitListComp, w_visitListComp_args)
@@ -3875,7 +3983,12 @@
     def mutate(self, visitor):
         self.assign = self.assign.mutate(visitor)
         self.list = self.list.mutate(visitor)
-        self.ifs[:] = [n.mutate(visitor) for n in self.ifs]
+        newlist = []
+        for n in self.ifs:
+            item = n.mutate(visitor)
+            if item is not None:
+                newlist.append(item)
+        self.ifs[:] = newlist
         return visitor.visitListCompFor(self)
 
     def fget_assign( space, self):
@@ -3929,9 +4042,10 @@
         w_item_mutate = space.getattr(w_item, space.wrap("mutate"))
         w_item_mutate_args = Arguments(space, [ w_visitor ])
         w_newitem = space.call_args(w_item_mutate, w_item_mutate_args)
-        newlist_w.append(w_newitem)
+        if not space.is_w(w_newitem, space.w_None):
+            newlist_w.append(w_newitem)
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("ifs"), w_newlist)
     w_visitListCompFor = space.getattr(w_visitor, space.wrap("visitListCompFor"))
     w_visitListCompFor_args = Arguments(space, [ w_self ])
     return space.call_args(w_visitListCompFor, w_visitListCompFor_args)
@@ -4382,7 +4496,12 @@
         return visitor.visitOr(self)
 
     def mutate(self, visitor):
-        self.nodes[:] = [n.mutate(visitor) for n in self.nodes]
+        newlist = []
+        for n in self.nodes:
+            item = n.mutate(visitor)
+            if item is not None:
+                newlist.append(item)
+        self.nodes[:] = newlist
         return visitor.visitOr(self)
 
     def fget_nodes( space, self):
@@ -4412,9 +4531,10 @@
         w_item_mutate = space.getattr(w_item, space.wrap("mutate"))
         w_item_mutate_args = Arguments(space, [ w_visitor ])
         w_newitem = space.call_args(w_item_mutate, w_item_mutate_args)
-        newlist_w.append(w_newitem)
+        if not space.is_w(w_newitem, space.w_None):
+            newlist_w.append(w_newitem)
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("nodes"), w_newlist)
     w_visitOr = space.getattr(w_visitor, space.wrap("visitOr"))
     w_visitOr_args = Arguments(space, [ w_self ])
     return space.call_args(w_visitOr, w_visitOr_args)
@@ -4567,7 +4687,12 @@
         return visitor.visitPrint(self)
 
     def mutate(self, visitor):
-        self.nodes[:] = [n.mutate(visitor) for n in self.nodes]
+        newlist = []
+        for n in self.nodes:
+            item = n.mutate(visitor)
+            if item is not None:
+                newlist.append(item)
+        self.nodes[:] = newlist
         if self.dest is not None:
             self.dest = self.dest.mutate(visitor)
         return visitor.visitPrint(self)
@@ -4608,9 +4733,10 @@
         w_item_mutate = space.getattr(w_item, space.wrap("mutate"))
         w_item_mutate_args = Arguments(space, [ w_visitor ])
         w_newitem = space.call_args(w_item_mutate, w_item_mutate_args)
-        newlist_w.append(w_newitem)
+        if not space.is_w(w_newitem, space.w_None):
+            newlist_w.append(w_newitem)
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("nodes"), w_newlist)
     w_dest = space.getattr(w_self, space.wrap("dest"))
     if not space.is_w(w_dest, space.w_None):
         w_mutate_dest = space.getattr(w_dest, space.wrap("mutate"))
@@ -4657,7 +4783,12 @@
         return visitor.visitPrintnl(self)
 
     def mutate(self, visitor):
-        self.nodes[:] = [n.mutate(visitor) for n in self.nodes]
+        newlist = []
+        for n in self.nodes:
+            item = n.mutate(visitor)
+            if item is not None:
+                newlist.append(item)
+        self.nodes[:] = newlist
         if self.dest is not None:
             self.dest = self.dest.mutate(visitor)
         return visitor.visitPrintnl(self)
@@ -4698,9 +4829,10 @@
         w_item_mutate = space.getattr(w_item, space.wrap("mutate"))
         w_item_mutate_args = Arguments(space, [ w_visitor ])
         w_newitem = space.call_args(w_item_mutate, w_item_mutate_args)
-        newlist_w.append(w_newitem)
+        if not space.is_w(w_newitem, space.w_None):
+            newlist_w.append(w_newitem)
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("nodes"), w_newlist)
     w_dest = space.getattr(w_self, space.wrap("dest"))
     if not space.is_w(w_dest, space.w_None):
         w_mutate_dest = space.getattr(w_dest, space.wrap("mutate"))
@@ -5107,7 +5239,12 @@
         return visitor.visitSliceobj(self)
 
     def mutate(self, visitor):
-        self.nodes[:] = [n.mutate(visitor) for n in self.nodes]
+        newlist = []
+        for n in self.nodes:
+            item = n.mutate(visitor)
+            if item is not None:
+                newlist.append(item)
+        self.nodes[:] = newlist
         return visitor.visitSliceobj(self)
 
     def fget_nodes( space, self):
@@ -5137,9 +5274,10 @@
         w_item_mutate = space.getattr(w_item, space.wrap("mutate"))
         w_item_mutate_args = Arguments(space, [ w_visitor ])
         w_newitem = space.call_args(w_item_mutate, w_item_mutate_args)
-        newlist_w.append(w_newitem)
+        if not space.is_w(w_newitem, space.w_None):
+            newlist_w.append(w_newitem)
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("nodes"), w_newlist)
     w_visitSliceobj = space.getattr(w_visitor, space.wrap("visitSliceobj"))
     w_visitSliceobj_args = Arguments(space, [ w_self ])
     return space.call_args(w_visitSliceobj, w_visitSliceobj_args)
@@ -5172,7 +5310,12 @@
         return visitor.visitStmt(self)
 
     def mutate(self, visitor):
-        self.nodes[:] = [n.mutate(visitor) for n in self.nodes]
+        newlist = []
+        for n in self.nodes:
+            item = n.mutate(visitor)
+            if item is not None:
+                newlist.append(item)
+        self.nodes[:] = newlist
         return visitor.visitStmt(self)
 
     def fget_nodes( space, self):
@@ -5202,9 +5345,10 @@
         w_item_mutate = space.getattr(w_item, space.wrap("mutate"))
         w_item_mutate_args = Arguments(space, [ w_visitor ])
         w_newitem = space.call_args(w_item_mutate, w_item_mutate_args)
-        newlist_w.append(w_newitem)
+        if not space.is_w(w_newitem, space.w_None):
+            newlist_w.append(w_newitem)
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("nodes"), w_newlist)
     w_visitStmt = space.getattr(w_visitor, space.wrap("visitStmt"))
     w_visitStmt_args = Arguments(space, [ w_self ])
     return space.call_args(w_visitStmt, w_visitStmt_args)
@@ -5520,7 +5664,7 @@
         
         newlist_w.append(space.newtuple([w_newexpr1, w_newexpr2, w_newbody]))
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("handlers"), w_newlist)
     w_else_ = space.getattr(w_self, space.wrap("else_"))
     if not space.is_w(w_else_, space.w_None):
         w_mutate_else_ = space.getattr(w_else_, space.wrap("mutate"))
@@ -5635,7 +5779,12 @@
         return visitor.visitTuple(self)
 
     def mutate(self, visitor):
-        self.nodes[:] = [n.mutate(visitor) for n in self.nodes]
+        newlist = []
+        for n in self.nodes:
+            item = n.mutate(visitor)
+            if item is not None:
+                newlist.append(item)
+        self.nodes[:] = newlist
         return visitor.visitTuple(self)
 
     def fget_nodes( space, self):
@@ -5665,9 +5814,10 @@
         w_item_mutate = space.getattr(w_item, space.wrap("mutate"))
         w_item_mutate_args = Arguments(space, [ w_visitor ])
         w_newitem = space.call_args(w_item_mutate, w_item_mutate_args)
-        newlist_w.append(w_newitem)
+        if not space.is_w(w_newitem, space.w_None):
+            newlist_w.append(w_newitem)
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("nodes"), w_newlist)
     w_visitTuple = space.getattr(w_visitor, space.wrap("visitTuple"))
     w_visitTuple_args = Arguments(space, [ w_self ])
     return space.call_args(w_visitTuple, w_visitTuple_args)

Modified: pypy/dist/pypy/interpreter/astcompiler/ast.txt
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/ast.txt	(original)
+++ pypy/dist/pypy/interpreter/astcompiler/ast.txt	Sat Jul  8 16:06:42 2006
@@ -337,7 +337,7 @@
         
         newlist_w.append(space.newtuple([w_opname, w_newnode]))
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("ops"), w_newlist)
     w_visitCompare = space.getattr(w_visitor, space.wrap("visitCompare"))
     w_visitCompare_args = Arguments(space, [ w_self ])
     return space.call_args(w_visitCompare, w_visitCompare_args)
@@ -373,7 +373,7 @@
         
         newlist_w.append(space.newtuple([w_newkey, w_newvalue]))
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("items"), w_newlist)
     w_visitDict = space.getattr(w_visitor, space.wrap("visitDict"))
     w_visitDict_args = Arguments(space, [ w_self ])
     return space.call_args(w_visitDict, w_visitDict_args)
@@ -409,7 +409,7 @@
         newlist_w.append(space.newtuple([w_newtest, w_newsuite]))
     
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("tests"), w_newlist)
     w_else_ = space.getattr(w_self, space.wrap("else_"))
     if not space.is_w(w_else_, space.w_None):
         w_mutate_else_ = space.getattr(w_else_, space.wrap("mutate"))
@@ -471,7 +471,7 @@
         
         newlist_w.append(space.newtuple([w_newexpr1, w_newexpr2, w_newbody]))
     w_newlist = space.newlist(newlist_w)
-    space.setslice(w_list, space.w_None, space.w_None, w_newlist)
+    space.setattr(w_self, space.wrap("handlers"), w_newlist)
     w_else_ = space.getattr(w_self, space.wrap("else_"))
     if not space.is_w(w_else_, space.w_None):
         w_mutate_else_ = space.getattr(w_else_, space.wrap("mutate"))

Modified: pypy/dist/pypy/interpreter/astcompiler/astgen.py
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/astgen.py	(original)
+++ pypy/dist/pypy/interpreter/astcompiler/astgen.py	Sat Jul  8 16:06:42 2006
@@ -311,7 +311,12 @@
                     print >> buf, "        if self.%s is not None:" % (argname,)
                     print >> buf, "            self.%s = self.%s.mutate(visitor)" % (argname,argname)
                 elif self.argprops[argname] == P_NESTED:
-                    print >> buf, "        self.%s[:] = [n.mutate(visitor) for n in self.%s]" % (argname,argname)
+                    print >> buf, "        newlist = []"
+                    print >> buf, "        for n in self.%s:"%(argname)
+                    print >> buf, "            item = n.mutate(visitor)"
+                    print >> buf, "            if item is not None:"
+                    print >> buf, "                newlist.append(item)"
+                    print >> buf, "        self.%s[:] = newlist"%(argname)
         print >> buf, "        return visitor.visit%s(self)" % self.name
 
     def _gen_fget_func(self, buf, attr, prop ):
@@ -396,9 +401,10 @@
                 print >> buf, '        w_item_mutate = space.getattr(w_item, space.wrap("mutate"))'
                 print >> buf, '        w_item_mutate_args = Arguments(space, [ w_visitor ])'
                 print >> buf, '        w_newitem = space.call_args(w_item_mutate, w_item_mutate_args)'
-                print >> buf, '        newlist_w.append(w_newitem)'
+                print >> buf, '        if not space.is_w(w_newitem, space.w_None):'
+                print >> buf, '            newlist_w.append(w_newitem)'
                 print >> buf, '    w_newlist = space.newlist(newlist_w)'
-                print >> buf, '    space.setslice(w_list, space.w_None, space.w_None, w_newlist)'
+                print >> buf, '    space.setattr(w_self, space.wrap("%s"), w_newlist)'%(argname)
                 
     
         print >> buf, '    w_visit%s = space.getattr(w_visitor, space.wrap("visit%s"))' % (self.name,

Modified: pypy/dist/pypy/interpreter/astcompiler/test/test_ast.py
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/test/test_ast.py	(original)
+++ pypy/dist/pypy/interpreter/astcompiler/test/test_ast.py	Sat Jul  8 16:06:42 2006
@@ -46,9 +46,30 @@
         src = '1 > 3'
         ast = source2ast(FakeSpace(), src)
         ast.mutate(BaseVisitor())
-         
+
+    def test_mutate_elision(self):
+        class ConstRemover(BaseVisitor):
+            def visitConst(self, const):
+                return None
+        listast = source2ast(FakeSpace(), "[1, 2]")
+        listast = listast.mutate(ConstRemover())
+        listnode = listast.node.nodes[0].expr
+        assert isinstance(listnode, ast.List)
+        assert len(listnode.nodes) == 0
 
 class AppTestMutate:
+    def setup_class(cls):
+        cls.w_BaseVisitor, = cls.space.unpackiterable(cls.space.appexec([], '''():
+        class BaseVisitor:
+            def __getattr__(self, attr):
+                if attr.startswith('visit'):
+                    return self.default
+                else:
+                    raise AttributeError(attr)
+            def default(self, node):
+                return node
+        return BaseVisitor,'''))
+    
     def test_mutate_add(self):
         import parser
         c1 = parser.ASTConst(1)
@@ -69,16 +90,8 @@
 
     def test_mutate_strange_cases(self):
         import parser
-        class BaseVisitor:
-            def __getattr__(self, attr):
-                if attr.startswith('visit'):
-                    return self.default
-                else:
-                    raise AttributeError(attr)
-            def default(self, node):
-                return node
         ast = parser.source2ast('if a: b')
-        ast.mutate(BaseVisitor())
+        ast.mutate(self.BaseVisitor())
         
         src = '''
 try:
@@ -87,13 +100,32 @@
     pass
         '''
         ast = parser.source2ast(src)
-        ast.mutate(BaseVisitor())
+        ast.mutate(self.BaseVisitor())
 
         src = '{1:2}'
         ast = parser.source2ast(src)
-        ast.mutate(BaseVisitor())
+        ast.mutate(self.BaseVisitor())
 
         src = '1 > 3'
         ast = parser.source2ast(src)
-        ast.mutate(BaseVisitor())
-        
+        ast.mutate(self.BaseVisitor())
+
+    def test_mutate_tuple(self):
+        from parser import source2ast, ASTConst, ASTTuple
+        class TupleChanger(self.BaseVisitor):
+            def visitConst(self, const):
+                return ASTConst(1)
+        tup = ASTTuple([ASTConst(2)])
+        tup = tup.mutate(TupleChanger())
+        assert tup.nodes[0].value == 1
+
+    def test_mutate_elision(self):
+        from parser import source2ast, ASTConst, ASTList
+        class ConstRemover(self.BaseVisitor):
+            def visitConst(self, const):
+                return None
+        listast = source2ast("[1, 2]")
+        listast = listast.mutate(ConstRemover())
+        listnode = listast.node.nodes[0].expr
+        assert isinstance(listnode, ASTList)
+        assert len(listnode.nodes) == 0



More information about the Pypy-commit mailing list