[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