[pypy-svn] r16332 - in pypy/dist/pypy/interpreter: astcompiler pyparser pyparser/test
ludal at codespeak.net
ludal at codespeak.net
Tue Aug 23 19:58:19 CEST 2005
Author: ludal
Date: Tue Aug 23 19:58:15 2005
New Revision: 16332
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/pyassem.py
pypy/dist/pypy/interpreter/astcompiler/pycodegen.py
pypy/dist/pypy/interpreter/astcompiler/symbols.py
pypy/dist/pypy/interpreter/astcompiler/visitor.py
pypy/dist/pypy/interpreter/pyparser/astbuilder.py
pypy/dist/pypy/interpreter/pyparser/test/test_astcompiler.py
Log:
- get rid of the $*$@@#!! visitor pattern used in the compiler module
- add to compile test all the tests from test_astbuilder
- bug fixes of the compiler to make those test pass
Modified: pypy/dist/pypy/interpreter/astcompiler/ast.py
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/ast.py (original)
+++ pypy/dist/pypy/interpreter/astcompiler/ast.py Tue Aug 23 19:58:15 2005
@@ -2,7 +2,7 @@
This file is automatically generated by Tools/compiler/astgen.py
"""
-from consts import CO_VARARGS, CO_VARKEYWORDS
+from consts import CO_VARARGS, CO_VARKEYWORDS, OP_ASSIGN
def flatten(list):
l = []
@@ -34,7 +34,7 @@
return self.getChildren()
def getChildNodes(self):
return [] # implemented by subclasses
- def visit(self, visitor, *args):
+ def accept(self, visitor, *args):
return visitor.visitNode(self, *args)
def flatten(self):
res = []
@@ -47,7 +47,7 @@
return res
class EmptyNode(Node):
- def visit(self, visitor, *args):
+ def accept(self, visitor, *args):
return visitor.visitEmptyNode(self, *args)
class Expression(Node):
@@ -66,7 +66,7 @@
def __repr__(self):
return "Expression(%s)" % (repr(self.node))
- def visit(self, visitor, *args):
+ def accept(self, visitor, *args):
return visitor.visitExpression(self, *args)
class Add(Node):
@@ -84,8 +84,8 @@
def __repr__(self):
return "Add((%s, %s))" % (repr(self.left), repr(self.right))
- def accept(self, visitor, args):
- return visitor.visitAdd(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitAdd(self, *args)
class And(Node):
def __init__(self, nodes, lineno=None):
@@ -103,8 +103,8 @@
def __repr__(self):
return "And(%s)" % (repr(self.nodes),)
- def accept(self, visitor, args):
- return visitor.visitAnd(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitAnd(self, *args)
class AssAttr(Node):
def __init__(self, expr, attrname, flags, lineno=None):
@@ -122,8 +122,8 @@
def __repr__(self):
return "AssAttr(%s, %s, %s)" % (repr(self.expr), repr(self.attrname), repr(self.flags))
- def accept(self, visitor, args):
- return visitor.visitAssAttr(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitAssAttr(self, *args)
class AssList(Node):
def __init__(self, nodes, lineno=None):
@@ -141,8 +141,8 @@
def __repr__(self):
return "AssList(%s)" % (repr(self.nodes),)
- def accept(self, visitor, args):
- return visitor.visitAssList(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitAssList(self, *args)
class AssName(Node):
def __init__(self, name, flags, lineno=None):
@@ -159,8 +159,8 @@
def __repr__(self):
return "AssName(%s, %s)" % (repr(self.name), repr(self.flags))
- def accept(self, visitor, args):
- return visitor.visitAssName(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitAssName(self, *args)
class AssTuple(Node):
def __init__(self, nodes, lineno=None):
@@ -178,8 +178,8 @@
def __repr__(self):
return "AssTuple(%s)" % (repr(self.nodes),)
- def accept(self, visitor, args):
- return visitor.visitAssTuple(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitAssTuple(self, *args)
class Assert(Node):
def __init__(self, test, fail, lineno=None):
@@ -203,8 +203,8 @@
def __repr__(self):
return "Assert(%s, %s)" % (repr(self.test), repr(self.fail))
- def accept(self, visitor, args):
- return visitor.visitAssert(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitAssert(self, *args)
class Assign(Node):
def __init__(self, nodes, expr, lineno=None):
@@ -227,8 +227,8 @@
def __repr__(self):
return "Assign(%s, %s)" % (repr(self.nodes), repr(self.expr))
- def accept(self, visitor, args):
- return visitor.visitAssign(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitAssign(self, *args)
class AugAssign(Node):
def __init__(self, node, op, expr, lineno=None):
@@ -246,8 +246,8 @@
def __repr__(self):
return "AugAssign(%s, %s, %s)" % (repr(self.node), repr(self.op), repr(self.expr))
- def accept(self, visitor, args):
- return visitor.visitAugAssign(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitAugAssign(self, *args)
class Backquote(Node):
def __init__(self, expr, lineno=None):
@@ -263,8 +263,8 @@
def __repr__(self):
return "Backquote(%s)" % (repr(self.expr),)
- def accept(self, visitor, args):
- return visitor.visitBackquote(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitBackquote(self, *args)
class Bitand(Node):
def __init__(self, nodes, lineno=None):
@@ -282,8 +282,8 @@
def __repr__(self):
return "Bitand(%s)" % (repr(self.nodes),)
- def accept(self, visitor, args):
- return visitor.visitBitand(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitBitand(self, *args)
class Bitor(Node):
def __init__(self, nodes, lineno=None):
@@ -301,8 +301,8 @@
def __repr__(self):
return "Bitor(%s)" % (repr(self.nodes),)
- def accept(self, visitor, args):
- return visitor.visitBitor(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitBitor(self, *args)
class Bitxor(Node):
def __init__(self, nodes, lineno=None):
@@ -320,8 +320,8 @@
def __repr__(self):
return "Bitxor(%s)" % (repr(self.nodes),)
- def accept(self, visitor, args):
- return visitor.visitBitxor(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitBitxor(self, *args)
class Break(Node):
def __init__(self, lineno=None):
@@ -336,8 +336,8 @@
def __repr__(self):
return "Break()"
- def accept(self, visitor, args):
- return visitor.visitBreak(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitBreak(self, *args)
class CallFunc(Node):
def __init__(self, node, args, star_args = None, dstar_args = None, lineno=None):
@@ -368,8 +368,8 @@
def __repr__(self):
return "CallFunc(%s, %s, %s, %s)" % (repr(self.node), repr(self.args), repr(self.star_args), repr(self.dstar_args))
- def accept(self, visitor, args):
- return visitor.visitCallFunc(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitCallFunc(self, *args)
class Class(Node):
def __init__(self, name, bases, doc, code, lineno=None):
@@ -396,8 +396,8 @@
def __repr__(self):
return "Class(%s, %s, %s, %s)" % (repr(self.name), repr(self.bases), repr(self.doc), repr(self.code))
- def accept(self, visitor, args):
- return visitor.visitClass(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitClass(self, *args)
class Compare(Node):
def __init__(self, expr, ops, lineno=None):
@@ -420,8 +420,8 @@
def __repr__(self):
return "Compare(%s, %s)" % (repr(self.expr), repr(self.ops))
- def accept(self, visitor, args):
- return visitor.visitCompare(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitCompare(self, *args)
class Const(Node):
def __init__(self, value, lineno=None):
@@ -437,8 +437,8 @@
def __repr__(self):
return "Const(%s)" % (repr(self.value),)
- def accept(self, visitor, args):
- return visitor.visitConst(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitConst(self, *args)
class Continue(Node):
def __init__(self, lineno=None):
@@ -453,8 +453,8 @@
def __repr__(self):
return "Continue()"
- def accept(self, visitor, args):
- return visitor.visitContinue(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitContinue(self, *args)
class Decorators(Node):
def __init__(self, nodes, lineno=None):
@@ -472,8 +472,8 @@
def __repr__(self):
return "Decorators(%s)" % (repr(self.nodes),)
- def accept(self, visitor, args):
- return visitor.visitDecorators(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitDecorators(self, *args)
class Dict(Node):
def __init__(self, items, lineno=None):
@@ -491,8 +491,8 @@
def __repr__(self):
return "Dict(%s)" % (repr(self.items),)
- def accept(self, visitor, args):
- return visitor.visitDict(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitDict(self, *args)
class Discard(Node):
def __init__(self, expr, lineno=None):
@@ -508,8 +508,8 @@
def __repr__(self):
return "Discard(%s)" % (repr(self.expr),)
- def accept(self, visitor, args):
- return visitor.visitDiscard(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitDiscard(self, *args)
class Div(Node):
def __init__(self, (left, right), lineno=None):
@@ -526,8 +526,8 @@
def __repr__(self):
return "Div((%s, %s))" % (repr(self.left), repr(self.right))
- def accept(self, visitor, args):
- return visitor.visitDiv(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitDiv(self, *args)
class Ellipsis(Node):
def __init__(self, lineno=None):
@@ -542,8 +542,8 @@
def __repr__(self):
return "Ellipsis()"
- def accept(self, visitor, args):
- return visitor.visitEllipsis(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitEllipsis(self, *args)
class Exec(Node):
def __init__(self, expr, locals, globals, lineno=None):
@@ -571,8 +571,8 @@
def __repr__(self):
return "Exec(%s, %s, %s)" % (repr(self.expr), repr(self.locals), repr(self.globals))
- def accept(self, visitor, args):
- return visitor.visitExec(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitExec(self, *args)
class FloorDiv(Node):
def __init__(self, (left, right), lineno=None):
@@ -589,8 +589,8 @@
def __repr__(self):
return "FloorDiv((%s, %s))" % (repr(self.left), repr(self.right))
- def accept(self, visitor, args):
- return visitor.visitFloorDiv(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitFloorDiv(self, *args)
class For(Node):
def __init__(self, assign, list, body, else_, lineno=None):
@@ -620,8 +620,8 @@
def __repr__(self):
return "For(%s, %s, %s, %s)" % (repr(self.assign), repr(self.list), repr(self.body), repr(self.else_))
- def accept(self, visitor, args):
- return visitor.visitFor(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitFor(self, *args)
class From(Node):
def __init__(self, modname, names, lineno=None):
@@ -638,8 +638,8 @@
def __repr__(self):
return "From(%s, %s)" % (repr(self.modname), repr(self.names))
- def accept(self, visitor, args):
- return visitor.visitFrom(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitFrom(self, *args)
class Function(Node):
def __init__(self, decorators, name, argnames, defaults, flags, doc, code, lineno=None):
@@ -681,14 +681,14 @@
def __repr__(self):
return "Function(%s, %s, %s, %s, %s, %s, %s)" % (repr(self.decorators), repr(self.name), repr(self.argnames), repr(self.defaults), repr(self.flags), repr(self.doc), repr(self.code))
- def accept(self, visitor, args):
- return visitor.visitFunction(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitFunction(self, *args)
class GenExpr(Node):
def __init__(self, code, lineno=None):
Node.__init__(self, lineno)
self.code = code
- self.argnames = ['[outmost-iterable]']
+ self.argnames = [AssName('[outmost-iterable]', OP_ASSIGN)]
self.varargs = self.kwargs = None
@@ -702,8 +702,8 @@
def __repr__(self):
return "GenExpr(%s)" % (repr(self.code),)
- def accept(self, visitor, args):
- return visitor.visitGenExpr(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitGenExpr(self, *args)
class GenExprFor(Node):
def __init__(self, assign, iter, ifs, lineno=None):
@@ -731,8 +731,8 @@
def __repr__(self):
return "GenExprFor(%s, %s, %s)" % (repr(self.assign), repr(self.iter), repr(self.ifs))
- def accept(self, visitor, args):
- return visitor.visitGenExprFor(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitGenExprFor(self, *args)
class GenExprIf(Node):
def __init__(self, test, lineno=None):
@@ -748,8 +748,8 @@
def __repr__(self):
return "GenExprIf(%s)" % (repr(self.test),)
- def accept(self, visitor, args):
- return visitor.visitGenExprIf(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitGenExprIf(self, *args)
class GenExprInner(Node):
def __init__(self, expr, quals, lineno=None):
@@ -772,8 +772,8 @@
def __repr__(self):
return "GenExprInner(%s, %s)" % (repr(self.expr), repr(self.quals))
- def accept(self, visitor, args):
- return visitor.visitGenExprInner(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitGenExprInner(self, *args)
class Getattr(Node):
def __init__(self, expr, attrname, lineno=None):
@@ -790,8 +790,8 @@
def __repr__(self):
return "Getattr(%s, %s)" % (repr(self.expr), repr(self.attrname))
- def accept(self, visitor, args):
- return visitor.visitGetattr(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitGetattr(self, *args)
class Global(Node):
def __init__(self, names, lineno=None):
@@ -807,8 +807,8 @@
def __repr__(self):
return "Global(%s)" % (repr(self.names),)
- def accept(self, visitor, args):
- return visitor.visitGlobal(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitGlobal(self, *args)
class If(Node):
def __init__(self, tests, else_, lineno=None):
@@ -832,8 +832,8 @@
def __repr__(self):
return "If(%s, %s)" % (repr(self.tests), repr(self.else_))
- def accept(self, visitor, args):
- return visitor.visitIf(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitIf(self, *args)
class Import(Node):
def __init__(self, names, lineno=None):
@@ -849,8 +849,8 @@
def __repr__(self):
return "Import(%s)" % (repr(self.names),)
- def accept(self, visitor, args):
- return visitor.visitImport(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitImport(self, *args)
class Invert(Node):
def __init__(self, expr, lineno=None):
@@ -866,8 +866,8 @@
def __repr__(self):
return "Invert(%s)" % (repr(self.expr),)
- def accept(self, visitor, args):
- return visitor.visitInvert(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitInvert(self, *args)
class Keyword(Node):
def __init__(self, name, expr, lineno=None):
@@ -884,8 +884,8 @@
def __repr__(self):
return "Keyword(%s, %s)" % (repr(self.name), repr(self.expr))
- def accept(self, visitor, args):
- return visitor.visitKeyword(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitKeyword(self, *args)
class Lambda(Node):
def __init__(self, argnames, defaults, flags, code, lineno=None):
@@ -919,8 +919,8 @@
def __repr__(self):
return "Lambda(%s, %s, %s, %s)" % (repr(self.argnames), repr(self.defaults), repr(self.flags), repr(self.code))
- def accept(self, visitor, args):
- return visitor.visitLambda(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitLambda(self, *args)
class LeftShift(Node):
def __init__(self, (left, right), lineno=None):
@@ -937,8 +937,8 @@
def __repr__(self):
return "LeftShift((%s, %s))" % (repr(self.left), repr(self.right))
- def accept(self, visitor, args):
- return visitor.visitLeftShift(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitLeftShift(self, *args)
class List(Node):
def __init__(self, nodes, lineno=None):
@@ -956,8 +956,8 @@
def __repr__(self):
return "List(%s)" % (repr(self.nodes),)
- def accept(self, visitor, args):
- return visitor.visitList(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitList(self, *args)
class ListComp(Node):
def __init__(self, expr, quals, lineno=None):
@@ -980,8 +980,8 @@
def __repr__(self):
return "ListComp(%s, %s)" % (repr(self.expr), repr(self.quals))
- def accept(self, visitor, args):
- return visitor.visitListComp(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitListComp(self, *args)
class ListCompFor(Node):
def __init__(self, assign, list, ifs, lineno=None):
@@ -1007,8 +1007,8 @@
def __repr__(self):
return "ListCompFor(%s, %s, %s)" % (repr(self.assign), repr(self.list), repr(self.ifs))
- def accept(self, visitor, args):
- return visitor.visitListCompFor(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitListCompFor(self, *args)
class ListCompIf(Node):
def __init__(self, test, lineno=None):
@@ -1024,8 +1024,8 @@
def __repr__(self):
return "ListCompIf(%s)" % (repr(self.test),)
- def accept(self, visitor, args):
- return visitor.visitListCompIf(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitListCompIf(self, *args)
class Mod(Node):
def __init__(self, (left, right), lineno=None):
@@ -1042,8 +1042,8 @@
def __repr__(self):
return "Mod((%s, %s))" % (repr(self.left), repr(self.right))
- def accept(self, visitor, args):
- return visitor.visitMod(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitMod(self, *args)
class Module(Node):
def __init__(self, doc, node, lineno=None):
@@ -1060,8 +1060,8 @@
def __repr__(self):
return "Module(%s, %s)" % (repr(self.doc), repr(self.node))
- def accept(self, visitor, args):
- return visitor.visitModule(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitModule(self, *args)
class Mul(Node):
def __init__(self, (left, right), lineno=None):
@@ -1078,8 +1078,8 @@
def __repr__(self):
return "Mul((%s, %s))" % (repr(self.left), repr(self.right))
- def accept(self, visitor, args):
- return visitor.visitMul(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitMul(self, *args)
class Name(Node):
def __init__(self, varname, lineno=None):
@@ -1095,8 +1095,24 @@
def __repr__(self):
return "Name(%s)" % (repr(self.varname),)
- def accept(self, visitor, args):
- return visitor.visitName(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitName(self, *args)
+
+class NoneConst(Node):
+ def __init__(self, lineno=None):
+ Node.__init__(self, lineno)
+
+ def getChildren(self):
+ return ()
+
+ def getChildNodes(self):
+ return ()
+
+ def __repr__(self):
+ return "NoneConst()"
+
+ def accept(self, visitor, *args):
+ return visitor.visitNoneConst(self, *args)
class Not(Node):
def __init__(self, expr, lineno=None):
@@ -1112,8 +1128,25 @@
def __repr__(self):
return "Not(%s)" % (repr(self.expr),)
- def accept(self, visitor, args):
- return visitor.visitNot(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitNot(self, *args)
+
+class NumberConst(Node):
+ def __init__(self, number_value, lineno=None):
+ Node.__init__(self, lineno)
+ self.number_value = number_value
+
+ def getChildren(self):
+ return self.number_value,
+
+ def getChildNodes(self):
+ return []
+
+ def __repr__(self):
+ return "NumberConst(%s)" % (repr(self.number_value),)
+
+ def accept(self, visitor, *args):
+ return visitor.visitNumberConst(self, *args)
class Or(Node):
def __init__(self, nodes, lineno=None):
@@ -1131,8 +1164,8 @@
def __repr__(self):
return "Or(%s)" % (repr(self.nodes),)
- def accept(self, visitor, args):
- return visitor.visitOr(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitOr(self, *args)
class Pass(Node):
def __init__(self, lineno=None):
@@ -1147,8 +1180,8 @@
def __repr__(self):
return "Pass()"
- def accept(self, visitor, args):
- return visitor.visitPass(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitPass(self, *args)
class Power(Node):
def __init__(self, (left, right), lineno=None):
@@ -1165,8 +1198,8 @@
def __repr__(self):
return "Power((%s, %s))" % (repr(self.left), repr(self.right))
- def accept(self, visitor, args):
- return visitor.visitPower(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitPower(self, *args)
class Print(Node):
def __init__(self, nodes, dest, lineno=None):
@@ -1190,8 +1223,8 @@
def __repr__(self):
return "Print(%s, %s)" % (repr(self.nodes), repr(self.dest))
- def accept(self, visitor, args):
- return visitor.visitPrint(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitPrint(self, *args)
class Printnl(Node):
def __init__(self, nodes, dest, lineno=None):
@@ -1215,8 +1248,8 @@
def __repr__(self):
return "Printnl(%s, %s)" % (repr(self.nodes), repr(self.dest))
- def accept(self, visitor, args):
- return visitor.visitPrintnl(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitPrintnl(self, *args)
class Raise(Node):
def __init__(self, expr1, expr2, expr3, lineno=None):
@@ -1245,8 +1278,8 @@
def __repr__(self):
return "Raise(%s, %s, %s)" % (repr(self.expr1), repr(self.expr2), repr(self.expr3))
- def accept(self, visitor, args):
- return visitor.visitRaise(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitRaise(self, *args)
class Return(Node):
def __init__(self, value, lineno=None):
@@ -1262,8 +1295,8 @@
def __repr__(self):
return "Return(%s)" % (repr(self.value),)
- def accept(self, visitor, args):
- return visitor.visitReturn(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitReturn(self, *args)
class RightShift(Node):
def __init__(self, (left, right), lineno=None):
@@ -1280,8 +1313,8 @@
def __repr__(self):
return "RightShift((%s, %s))" % (repr(self.left), repr(self.right))
- def accept(self, visitor, args):
- return visitor.visitRightShift(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitRightShift(self, *args)
class Slice(Node):
def __init__(self, expr, flags, lower, upper, lineno=None):
@@ -1311,8 +1344,8 @@
def __repr__(self):
return "Slice(%s, %s, %s, %s)" % (repr(self.expr), repr(self.flags), repr(self.lower), repr(self.upper))
- def accept(self, visitor, args):
- return visitor.visitSlice(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitSlice(self, *args)
class Sliceobj(Node):
def __init__(self, nodes, lineno=None):
@@ -1330,8 +1363,8 @@
def __repr__(self):
return "Sliceobj(%s)" % (repr(self.nodes),)
- def accept(self, visitor, args):
- return visitor.visitSliceobj(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitSliceobj(self, *args)
class Stmt(Node):
def __init__(self, nodes, lineno=None):
@@ -1349,8 +1382,25 @@
def __repr__(self):
return "Stmt(%s)" % (repr(self.nodes),)
- def accept(self, visitor, args):
- return visitor.visitStmt(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitStmt(self, *args)
+
+class StringConst(Node):
+ def __init__(self, string_value, lineno=None):
+ Node.__init__(self, lineno)
+ self.string_value = string_value
+
+ def getChildren(self):
+ return self.string_value,
+
+ def getChildNodes(self):
+ return []
+
+ def __repr__(self):
+ return "StringConst(%s)" % (repr(self.string_value),)
+
+ def accept(self, visitor, *args):
+ return visitor.visitStringConst(self, *args)
class Sub(Node):
def __init__(self, (left, right), lineno=None):
@@ -1367,8 +1417,8 @@
def __repr__(self):
return "Sub((%s, %s))" % (repr(self.left), repr(self.right))
- def accept(self, visitor, args):
- return visitor.visitSub(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitSub(self, *args)
class Subscript(Node):
def __init__(self, expr, flags, subs, lineno=None):
@@ -1393,8 +1443,8 @@
def __repr__(self):
return "Subscript(%s, %s, %s)" % (repr(self.expr), repr(self.flags), repr(self.subs))
- def accept(self, visitor, args):
- return visitor.visitSubscript(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitSubscript(self, *args)
class TryExcept(Node):
def __init__(self, body, handlers, else_, lineno=None):
@@ -1421,8 +1471,8 @@
def __repr__(self):
return "TryExcept(%s, %s, %s)" % (repr(self.body), repr(self.handlers), repr(self.else_))
- def accept(self, visitor, args):
- return visitor.visitTryExcept(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitTryExcept(self, *args)
class TryFinally(Node):
def __init__(self, body, final, lineno=None):
@@ -1439,8 +1489,8 @@
def __repr__(self):
return "TryFinally(%s, %s)" % (repr(self.body), repr(self.final))
- def accept(self, visitor, args):
- return visitor.visitTryFinally(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitTryFinally(self, *args)
class Tuple(Node):
def __init__(self, nodes, lineno=None):
@@ -1458,8 +1508,8 @@
def __repr__(self):
return "Tuple(%s)" % (repr(self.nodes),)
- def accept(self, visitor, args):
- return visitor.visitTuple(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitTuple(self, *args)
class UnaryAdd(Node):
def __init__(self, expr, lineno=None):
@@ -1475,8 +1525,8 @@
def __repr__(self):
return "UnaryAdd(%s)" % (repr(self.expr),)
- def accept(self, visitor, args):
- return visitor.visitUnaryAdd(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitUnaryAdd(self, *args)
class UnarySub(Node):
def __init__(self, expr, lineno=None):
@@ -1492,8 +1542,8 @@
def __repr__(self):
return "UnarySub(%s)" % (repr(self.expr),)
- def accept(self, visitor, args):
- return visitor.visitUnarySub(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitUnarySub(self, *args)
class While(Node):
def __init__(self, test, body, else_, lineno=None):
@@ -1520,8 +1570,8 @@
def __repr__(self):
return "While(%s, %s, %s)" % (repr(self.test), repr(self.body), repr(self.else_))
- def accept(self, visitor, args):
- return visitor.visitWhile(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitWhile(self, *args)
class Yield(Node):
def __init__(self, value, lineno=None):
@@ -1537,8 +1587,8 @@
def __repr__(self):
return "Yield(%s)" % (repr(self.value),)
- def accept(self, visitor, args):
- return visitor.visitYield(self, args)
+ def accept(self, visitor, *args):
+ return visitor.visitYield(self, *args)
class ASTVisitor(object):
@@ -1547,151 +1597,157 @@
It could also use to identify base type for visit arguments of AST nodes
"""
- def default(self, node, args):
+ def default(self, node, *args):
for child in node.getChildNodes():
- child.visit(self, args)
+ child.accept(self, *args)
- def visitAdd(self, args):
- return self.default( args )
- def visitAnd(self, args):
- return self.default( args )
- def visitAssAttr(self, args):
- return self.default( args )
- def visitAssList(self, args):
- return self.default( args )
- def visitAssName(self, args):
- return self.default( args )
- def visitAssTuple(self, args):
- return self.default( args )
- def visitAssert(self, args):
- return self.default( args )
- def visitAssign(self, args):
- return self.default( args )
- def visitAugAssign(self, args):
- return self.default( args )
- def visitBackquote(self, args):
- return self.default( args )
- def visitBitand(self, args):
- return self.default( args )
- def visitBitor(self, args):
- return self.default( args )
- def visitBitxor(self, args):
- return self.default( args )
- def visitBreak(self, args):
- return self.default( args )
- def visitCallFunc(self, args):
- return self.default( args )
- def visitClass(self, args):
- return self.default( args )
- def visitCompare(self, args):
- return self.default( args )
- def visitConst(self, args):
- return self.default( args )
- def visitContinue(self, args):
- return self.default( args )
- def visitDecorators(self, args):
- return self.default( args )
- def visitDict(self, args):
- return self.default( args )
- def visitDiscard(self, args):
- return self.default( args )
- def visitDiv(self, args):
- return self.default( args )
- def visitEllipsis(self, args):
- return self.default( args )
- def visitExec(self, args):
- return self.default( args )
- def visitFloorDiv(self, args):
- return self.default( args )
- def visitFor(self, args):
- return self.default( args )
- def visitFrom(self, args):
- return self.default( args )
- def visitFunction(self, args):
- return self.default( args )
- def visitGenExpr(self, args):
- return self.default( args )
- def visitGenExprFor(self, args):
- return self.default( args )
- def visitGenExprIf(self, args):
- return self.default( args )
- def visitGenExprInner(self, args):
- return self.default( args )
- def visitGetattr(self, args):
- return self.default( args )
- def visitGlobal(self, args):
- return self.default( args )
- def visitIf(self, args):
- return self.default( args )
- def visitImport(self, args):
- return self.default( args )
- def visitInvert(self, args):
- return self.default( args )
- def visitKeyword(self, args):
- return self.default( args )
- def visitLambda(self, args):
- return self.default( args )
- def visitLeftShift(self, args):
- return self.default( args )
- def visitList(self, args):
- return self.default( args )
- def visitListComp(self, args):
- return self.default( args )
- def visitListCompFor(self, args):
- return self.default( args )
- def visitListCompIf(self, args):
- return self.default( args )
- def visitMod(self, args):
- return self.default( args )
- def visitModule(self, args):
- return self.default( args )
- def visitMul(self, args):
- return self.default( args )
- def visitName(self, args):
- return self.default( args )
- def visitNot(self, args):
- return self.default( args )
- def visitOr(self, args):
- return self.default( args )
- def visitPass(self, args):
- return self.default( args )
- def visitPower(self, args):
- return self.default( args )
- def visitPrint(self, args):
- return self.default( args )
- def visitPrintnl(self, args):
- return self.default( args )
- def visitRaise(self, args):
- return self.default( args )
- def visitReturn(self, args):
- return self.default( args )
- def visitRightShift(self, args):
- return self.default( args )
- def visitSlice(self, args):
- return self.default( args )
- def visitSliceobj(self, args):
- return self.default( args )
- def visitStmt(self, args):
- return self.default( args )
- def visitSub(self, args):
- return self.default( args )
- def visitSubscript(self, args):
- return self.default( args )
- def visitTryExcept(self, args):
- return self.default( args )
- def visitTryFinally(self, args):
- return self.default( args )
- def visitTuple(self, args):
- return self.default( args )
- def visitUnaryAdd(self, args):
- return self.default( args )
- def visitUnarySub(self, args):
- return self.default( args )
- def visitWhile(self, args):
- return self.default( args )
- def visitYield(self, args):
- return self.default( args )
+ def visitAdd(self, node, *args):
+ return self.default( node, *args )
+ def visitAnd(self, node, *args):
+ return self.default( node, *args )
+ def visitAssAttr(self, node, *args):
+ return self.default( node, *args )
+ def visitAssList(self, node, *args):
+ return self.default( node, *args )
+ def visitAssName(self, node, *args):
+ return self.default( node, *args )
+ def visitAssTuple(self, node, *args):
+ return self.default( node, *args )
+ def visitAssert(self, node, *args):
+ return self.default( node, *args )
+ def visitAssign(self, node, *args):
+ return self.default( node, *args )
+ def visitAugAssign(self, node, *args):
+ return self.default( node, *args )
+ def visitBackquote(self, node, *args):
+ return self.default( node, *args )
+ def visitBitand(self, node, *args):
+ return self.default( node, *args )
+ def visitBitor(self, node, *args):
+ return self.default( node, *args )
+ def visitBitxor(self, node, *args):
+ return self.default( node, *args )
+ def visitBreak(self, node, *args):
+ return self.default( node, *args )
+ def visitCallFunc(self, node, *args):
+ return self.default( node, *args )
+ def visitClass(self, node, *args):
+ return self.default( node, *args )
+ def visitCompare(self, node, *args):
+ return self.default( node, *args )
+ def visitConst(self, node, *args):
+ return self.default( node, *args )
+ def visitContinue(self, node, *args):
+ return self.default( node, *args )
+ def visitDecorators(self, node, *args):
+ return self.default( node, *args )
+ def visitDict(self, node, *args):
+ return self.default( node, *args )
+ def visitDiscard(self, node, *args):
+ return self.default( node, *args )
+ def visitDiv(self, node, *args):
+ return self.default( node, *args )
+ def visitEllipsis(self, node, *args):
+ return self.default( node, *args )
+ def visitExec(self, node, *args):
+ return self.default( node, *args )
+ def visitFloorDiv(self, node, *args):
+ return self.default( node, *args )
+ def visitFor(self, node, *args):
+ return self.default( node, *args )
+ def visitFrom(self, node, *args):
+ return self.default( node, *args )
+ def visitFunction(self, node, *args):
+ return self.default( node, *args )
+ def visitGenExpr(self, node, *args):
+ return self.default( node, *args )
+ def visitGenExprFor(self, node, *args):
+ return self.default( node, *args )
+ def visitGenExprIf(self, node, *args):
+ return self.default( node, *args )
+ def visitGenExprInner(self, node, *args):
+ return self.default( node, *args )
+ def visitGetattr(self, node, *args):
+ return self.default( node, *args )
+ def visitGlobal(self, node, *args):
+ return self.default( node, *args )
+ def visitIf(self, node, *args):
+ return self.default( node, *args )
+ def visitImport(self, node, *args):
+ return self.default( node, *args )
+ def visitInvert(self, node, *args):
+ return self.default( node, *args )
+ def visitKeyword(self, node, *args):
+ return self.default( node, *args )
+ def visitLambda(self, node, *args):
+ return self.default( node, *args )
+ def visitLeftShift(self, node, *args):
+ return self.default( node, *args )
+ def visitList(self, node, *args):
+ return self.default( node, *args )
+ def visitListComp(self, node, *args):
+ return self.default( node, *args )
+ def visitListCompFor(self, node, *args):
+ return self.default( node, *args )
+ def visitListCompIf(self, node, *args):
+ return self.default( node, *args )
+ def visitMod(self, node, *args):
+ return self.default( node, *args )
+ def visitModule(self, node, *args):
+ return self.default( node, *args )
+ def visitMul(self, node, *args):
+ return self.default( node, *args )
+ def visitName(self, node, *args):
+ return self.default( node, *args )
+ def visitNoneConst(self, node, *args):
+ return self.default( node, *args )
+ def visitNot(self, node, *args):
+ return self.default( node, *args )
+ def visitNumberConst(self, node, *args):
+ return self.default( node, *args )
+ def visitOr(self, node, *args):
+ return self.default( node, *args )
+ def visitPass(self, node, *args):
+ return self.default( node, *args )
+ def visitPower(self, node, *args):
+ return self.default( node, *args )
+ def visitPrint(self, node, *args):
+ return self.default( node, *args )
+ def visitPrintnl(self, node, *args):
+ return self.default( node, *args )
+ def visitRaise(self, node, *args):
+ return self.default( node, *args )
+ def visitReturn(self, node, *args):
+ return self.default( node, *args )
+ def visitRightShift(self, node, *args):
+ return self.default( node, *args )
+ def visitSlice(self, node, *args):
+ return self.default( node, *args )
+ def visitSliceobj(self, node, *args):
+ return self.default( node, *args )
+ def visitStmt(self, node, *args):
+ return self.default( node, *args )
+ def visitStringConst(self, node, *args):
+ return self.default( node, *args )
+ def visitSub(self, node, *args):
+ return self.default( node, *args )
+ def visitSubscript(self, node, *args):
+ return self.default( node, *args )
+ def visitTryExcept(self, node, *args):
+ return self.default( node, *args )
+ def visitTryFinally(self, node, *args):
+ return self.default( node, *args )
+ def visitTuple(self, node, *args):
+ return self.default( node, *args )
+ def visitUnaryAdd(self, node, *args):
+ return self.default( node, *args )
+ def visitUnarySub(self, node, *args):
+ return self.default( node, *args )
+ def visitWhile(self, node, *args):
+ return self.default( node, *args )
+ def visitYield(self, node, *args):
+ return self.default( node, *args )
for name, obj in globals().items():
if isinstance(obj, type) and issubclass(obj, Node):
Modified: pypy/dist/pypy/interpreter/astcompiler/ast.txt
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/ast.txt (original)
+++ pypy/dist/pypy/interpreter/astcompiler/ast.txt Tue Aug 23 19:58:15 2005
@@ -27,6 +27,9 @@
Return: value
Yield: value
Const: value*
+NoneConst:
+StringConst: string_value*
+NumberConst: number_value*
Print: nodes!, dest&
Printnl: nodes!, dest&
Discard: expr
@@ -92,7 +95,7 @@
self.kwargs = 1
init(GenExpr):
- self.argnames = ['[outmost-iterable]']
+ self.argnames = [AssName('[outmost-iterable]', OP_ASSIGN)]
self.varargs = self.kwargs = None
init(GenExprFor):
Modified: pypy/dist/pypy/interpreter/astcompiler/astgen.py
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/astgen.py (original)
+++ pypy/dist/pypy/interpreter/astcompiler/astgen.py Tue Aug 23 19:58:15 2005
@@ -192,12 +192,12 @@
print >> buf, ' return "%s()"' % self.name
def _gen_visit(self, buf):
- print >> buf, " def accept(self, visitor, args):"
- print >> buf, " return visitor.visit%s(self, args)" % self.name
+ print >> buf, " def accept(self, visitor, *args):"
+ print >> buf, " return visitor.visit%s(self, *args)" % self.name
def gen_base_visit(self, buf):
- print >> buf, " def visit%s(self, args):" % self.name
- print >> buf, " return self.default( args )"
+ print >> buf, " def visit%s(self, node, *args):" % self.name
+ print >> buf, " return self.default( node, *args )"
rx_init = re.compile('init\((.*)\):')
@@ -233,9 +233,9 @@
It could also use to identify base type for visit arguments of AST nodes
"""
- def default(self, node, args):
+ def default(self, node, *args):
for child in node.getChildNodes():
- child.visit(self, args)
+ child.accept(self, *args)
'''
@@ -265,7 +265,7 @@
This file is automatically generated by Tools/compiler/astgen.py
"""
-from consts import CO_VARARGS, CO_VARKEYWORDS
+from consts import CO_VARARGS, CO_VARKEYWORDS, OP_ASSIGN
def flatten(list):
l = []
@@ -297,7 +297,7 @@
return self.getChildren()
def getChildNodes(self):
return [] # implemented by subclasses
- def visit(self, visitor, *args):
+ def accept(self, visitor, *args):
return visitor.visitNode(self, *args)
def flatten(self):
res = []
@@ -310,7 +310,7 @@
return res
class EmptyNode(Node):
- def visit(self, visitor, *args):
+ def accept(self, visitor, *args):
return visitor.visitEmptyNode(self, *args)
class Expression(Node):
@@ -329,7 +329,7 @@
def __repr__(self):
return "Expression(%s)" % (repr(self.node))
- def visit(self, visitor, *args):
+ def accept(self, visitor, *args):
return visitor.visitExpression(self, *args)
### EPILOGUE
Modified: pypy/dist/pypy/interpreter/astcompiler/pyassem.py
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/pyassem.py (original)
+++ pypy/dist/pypy/interpreter/astcompiler/pyassem.py Tue Aug 23 19:58:15 2005
@@ -25,6 +25,7 @@
print " next", self.current.next
print " ", self.current.get_children()
print repr(block)
+ assert block is not None
self.current = block
def nextBlock(self, block=None):
@@ -354,13 +355,19 @@
self.varnames = []
for var in args:
if isinstance(var, ast.AssName):
- self.varnames.append(var.name)
+ _name = var.name
+ assert type(_name) == str
+ self.varnames.append( _name )
elif isinstance(var, TupleArg):
- self.varnames.append(var.getName())
+ _name = var.getName()
+ assert type(_name) == str
+ self.varnames.append( _name )
elif isinstance(var, ast.AssTuple):
for n in var.flatten():
assert isinstance(n, ast.AssName)
- self.varnames.append(n.name)
+ _name = n.name
+ assert type(_name) == str
+ self.varnames.append( _name )
self.stage = RAW
self.orderedblocks = []
Modified: pypy/dist/pypy/interpreter/astcompiler/pycodegen.py
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/pycodegen.py (original)
+++ pypy/dist/pypy/interpreter/astcompiler/pycodegen.py Tue Aug 23 19:58:15 2005
@@ -127,7 +127,7 @@
mtime = struct.pack('<i', mtime)
return self.MAGIC + mtime
-class LocalNameFinder:
+class LocalNameFinder(ast.ASTVisitor):
"""Find local names in scope"""
def __init__(self, names=()):
self.names = misc.Set()
@@ -176,7 +176,7 @@
return 1
return 0
-class CodeGenerator:
+class CodeGenerator(ast.ASTVisitor):
"""Defines basic code generator for Python bytecode
This class is an abstract base class. Concrete subclasses must
@@ -217,23 +217,23 @@
def emit(self, *inst ):
- self.graph.emit( *inst )
+ return self.graph.emit( *inst )
def nextBlock(self, block=None ):
"""graph delegation"""
- self.graph.newBlock( block )
+ return self.graph.nextBlock( block )
def startBlock(self, block ):
"""graph delegation"""
- self.graph.startBlock( block )
+ return self.graph.startBlock( block )
def newBlock(self):
"""graph delegation"""
- self.graph.newBlock()
+ return self.graph.newBlock()
def setDocstring(self, doc):
"""graph delegation"""
- self.graph.setDocstring( doc )
+ return self.graph.setDocstring( doc )
def getCode(self):
"""Return a code object"""
@@ -344,7 +344,7 @@
self.storeName('__doc__')
lnf = walk(node.node, self.NameFinder(), verbose=0)
self.locals.push(lnf.getLocals())
- self.visit(node.node)
+ node.node.accept( self )
self.emit('LOAD_CONST', None)
self.emit('RETURN_VALUE')
@@ -352,7 +352,7 @@
self.set_lineno(node)
self.scopes = self.parseSymbols(node)
self.scope = self.scopes[node]
- self.visit(node.node)
+ node.node.accept( self )
self.emit('RETURN_VALUE')
def visitFunction(self, node):
@@ -367,7 +367,7 @@
def _visitFuncOrLambda(self, node, isLambda=0):
if not isLambda and node.decorators:
for decorator in node.decorators.nodes:
- self.visit(decorator)
+ decorator.accept( self )
ndecorators = len(node.decorators.nodes)
else:
ndecorators = 0
@@ -378,7 +378,7 @@
gen.finish()
self.set_lineno(node)
for default in node.defaults:
- self.visit(default)
+ default.accept( self )
frees = gen.scope.get_free_vars()
if frees:
for name in frees:
@@ -400,7 +400,7 @@
self.set_lineno(node)
self.emit('LOAD_CONST', node.name)
for base in node.bases:
- self.visit(base)
+ base.accept( self )
self.emit('BUILD_TUPLE', len(node.bases))
frees = gen.scope.get_free_vars()
for name in frees:
@@ -427,17 +427,17 @@
# XXX will need to check generator stuff here
continue
self.set_lineno(test)
- self.visit(test)
+ test.accept( self )
nextTest = self.newBlock()
self.emit('JUMP_IF_FALSE', nextTest)
self.nextBlock()
self.emit('POP_TOP')
- self.visit(suite)
+ suite.accept( self )
self.emit('JUMP_FORWARD', end)
self.startBlock(nextTest)
self.emit('POP_TOP')
if node.else_:
- self.visit(node.else_)
+ node.else_.accept( self )
self.nextBlock(end)
def visitWhile(self, node):
@@ -453,12 +453,12 @@
self.setups.push((LOOP, loop))
self.set_lineno(node, force=True)
- self.visit(node.test)
+ node.test.accept( self )
self.emit('JUMP_IF_FALSE', else_ or after)
self.nextBlock()
self.emit('POP_TOP')
- self.visit(node.body)
+ node.body.accept( self )
self.emit('JUMP_ABSOLUTE', loop)
self.startBlock(else_) # or just the POPs if not else clause
@@ -466,7 +466,7 @@
self.emit('POP_BLOCK')
self.setups.pop()
if node.else_:
- self.visit(node.else_)
+ node.else_.accept( self )
self.nextBlock(after)
def visitFor(self, node):
@@ -477,20 +477,20 @@
self.set_lineno(node)
self.emit('SETUP_LOOP', after)
- self.visit(node.list)
+ node.list.accept( self )
self.emit('GET_ITER')
self.nextBlock(start)
self.set_lineno(node, force=1)
self.emit('FOR_ITER', anchor)
- self.visit(node.assign)
- self.visit(node.body)
+ node.assign.accept( self )
+ node.body.accept( self )
self.emit('JUMP_ABSOLUTE', start)
self.nextBlock(anchor)
self.emit('POP_BLOCK')
self.setups.pop()
if node.else_:
- self.visit(node.else_)
+ node.else_.accept( self )
self.nextBlock(after)
def visitBreak(self, node):
@@ -528,11 +528,11 @@
def visitTest(self, node, jump):
end = self.newBlock()
for child in node.nodes[:-1]:
- self.visit(child)
+ child.accept( self )
self.emit(jump, end)
self.nextBlock()
self.emit('POP_TOP')
- self.visit(node.nodes[-1])
+ node.nodes[-1].accept( self )
self.nextBlock(end)
def visitAnd(self, node):
@@ -542,10 +542,10 @@
self.visitTest(node, 'JUMP_IF_TRUE')
def visitCompare(self, node):
- self.visit(node.expr)
+ node.expr.accept( self )
cleanup = self.newBlock()
for op, code in node.ops[:-1]:
- self.visit(code)
+ code.accept( self )
self.emit('DUP_TOP')
self.emit('ROT_THREE')
self.emit('COMPARE_OP', op)
@@ -555,7 +555,7 @@
# now do the last comparison
if node.ops:
op, code = node.ops[-1]
- self.visit(code)
+ code.accept( self )
self.emit('COMPARE_OP', op)
if len(node.ops) > 1:
end = self.newBlock()
@@ -580,16 +580,16 @@
stack = []
for i, for_ in zip(range(len(node.quals)), node.quals):
- start, anchor = self.visit(for_)
+ start, anchor = for_.accept( self )
cont = None
for if_ in for_.ifs:
if cont is None:
cont = self.newBlock()
- self.visit(if_, cont)
+ if_.accept( self, cont)
stack.insert(0, (start, cont, anchor))
self._implicitNameOp('LOAD', append)
- self.visit(node.expr)
+ node.expr.accept( self )
self.emit('CALL_FUNCTION', 1)
self.emit('POP_TOP')
@@ -610,18 +610,18 @@
start = self.newBlock()
anchor = self.newBlock()
- self.visit(node.list)
+ node.list.accept( self )
self.emit('GET_ITER')
self.nextBlock(start)
self.set_lineno(node, force=True)
self.emit('FOR_ITER', anchor)
self.nextBlock()
- self.visit(node.assign)
+ node.assign.accept( self )
return start, anchor
def visitListCompIf(self, node, branch):
self.set_lineno(node, force=True)
- self.visit(node.test)
+ node.test.accept( self )
self.emit('JUMP_IF_FALSE', branch)
self.newBlock()
self.emit('POP_TOP')
@@ -643,7 +643,7 @@
self.emit('MAKE_FUNCTION', 0)
# precomputation of outmost iterable
- self.visit(node.code.quals[0].iter)
+ node.code.quals[0].iter.accept( self )
self.emit('GET_ITER')
self.emit('CALL_FUNCTION', 1)
@@ -653,15 +653,15 @@
stack = []
for i, for_ in zip(range(len(node.quals)), node.quals):
- start, anchor = self.visit(for_)
+ start, anchor = for_.accept( self )
cont = None
for if_ in for_.ifs:
if cont is None:
cont = self.newBlock()
- self.visit(if_, cont)
+ if_.accept( self, cont)
stack.insert(0, (start, cont, anchor))
- self.visit(node.expr)
+ node.expr.accept( self )
self.emit('YIELD_VALUE')
for start, cont, anchor in stack:
@@ -682,19 +682,19 @@
if node.is_outmost:
self.loadName('[outmost-iterable]')
else:
- self.visit(node.iter)
+ node.iter.accept( self )
self.emit('GET_ITER')
self.nextBlock(start)
self.set_lineno(node, force=True)
self.emit('FOR_ITER', anchor)
self.nextBlock()
- self.visit(node.assign)
+ node.assign.accept( self )
return start, anchor
def visitGenExprIf(self, node, branch):
self.set_lineno(node, force=True)
- self.visit(node.test)
+ node.test.accept( self )
self.emit('JUMP_IF_FALSE', branch)
self.newBlock()
self.emit('POP_TOP')
@@ -711,13 +711,13 @@
# loaded as a global even if there is a local name. I guess this
# is a sort of renaming op.
self.nextBlock()
- self.visit(node.test)
+ node.test.accept( self )
self.emit('JUMP_IF_TRUE', end)
self.nextBlock()
self.emit('POP_TOP')
self.emit('LOAD_GLOBAL', 'AssertionError')
if node.fail:
- self.visit(node.fail)
+ node.fail.accept( self )
self.emit('RAISE_VARARGS', 2)
else:
self.emit('RAISE_VARARGS', 1)
@@ -728,13 +728,13 @@
self.set_lineno(node)
n = 0
if node.expr1:
- self.visit(node.expr1)
+ node.expr1.accept( self )
n = n + 1
if node.expr2:
- self.visit(node.expr2)
+ node.expr2.accept( self )
n = n + 1
if node.expr3:
- self.visit(node.expr3)
+ node.expr3.accept( self )
n = n + 1
self.emit('RAISE_VARARGS', n)
@@ -750,7 +750,7 @@
self.emit('SETUP_EXCEPT', handlers)
self.nextBlock(body)
self.setups.push((EXCEPT, body))
- self.visit(node.body)
+ node.body.accept( self )
self.emit('POP_BLOCK')
self.setups.pop()
self.emit('JUMP_FORWARD', lElse)
@@ -762,7 +762,7 @@
self.set_lineno(expr)
if expr:
self.emit('DUP_TOP')
- self.visit(expr)
+ expr.accept( self )
self.emit('COMPARE_OP', 'exception match')
next = self.newBlock()
self.emit('JUMP_IF_FALSE', next)
@@ -770,11 +770,11 @@
self.emit('POP_TOP')
self.emit('POP_TOP')
if target:
- self.visit(target)
+ target.accept( self )
else:
self.emit('POP_TOP')
self.emit('POP_TOP')
- self.visit(body)
+ body.accept( self )
self.emit('JUMP_FORWARD', end)
if expr:
self.nextBlock(next)
@@ -785,7 +785,7 @@
self.emit('END_FINALLY')
if node.else_:
self.nextBlock(lElse)
- self.visit(node.else_)
+ node.else_.accept( self )
self.nextBlock(end)
def visitTryFinally(self, node):
@@ -795,13 +795,13 @@
self.emit('SETUP_FINALLY', final)
self.nextBlock(body)
self.setups.push((TRY_FINALLY, body))
- self.visit(node.body)
+ node.body.accept( self )
self.emit('POP_BLOCK')
self.setups.pop()
self.emit('LOAD_CONST', None)
self.nextBlock(final)
self.setups.push((END_FINALLY, final))
- self.visit(node.final)
+ node.final.accept( self )
self.emit('END_FINALLY')
self.setups.pop()
@@ -809,7 +809,7 @@
def visitDiscard(self, node):
self.set_lineno(node)
- self.visit(node.expr)
+ node.expr.accept( self )
self.emit('POP_TOP')
def visitConst(self, node):
@@ -826,7 +826,7 @@
def visitKeyword(self, node):
self.emit('LOAD_CONST', node.name)
- self.visit(node.expr)
+ node.expr.accept( self )
def visitGlobal(self, node):
# no code to generate
@@ -877,21 +877,21 @@
self.emit('LOAD_ATTR', elt)
def visitGetattr(self, node):
- self.visit(node.expr)
+ node.expr.accept( self )
self.emit('LOAD_ATTR', self.mangle(node.attrname))
# next five implement assignments
def visitAssign(self, node):
self.set_lineno(node)
- self.visit(node.expr)
+ node.expr.accept( self )
dups = len(node.nodes) - 1
for i in range(len(node.nodes)):
elt = node.nodes[i]
if i < dups:
self.emit('DUP_TOP')
if isinstance(elt, ast.Node):
- self.visit(elt)
+ elt.accept( self )
def visitAssName(self, node):
if node.flags == 'OP_ASSIGN':
@@ -903,7 +903,7 @@
print "oops", node.flags
def visitAssAttr(self, node):
- self.visit(node.expr)
+ node.expr.accept( self )
if node.flags == 'OP_ASSIGN':
self.emit('STORE_ATTR', self.mangle(node.attrname))
elif node.flags == 'OP_DELETE':
@@ -916,7 +916,7 @@
if findOp(node) != 'OP_DELETE':
self.emit(op, len(node.nodes))
for child in node.nodes:
- self.visit(child)
+ child.accept( self )
if VERSION > 1:
visitAssTuple = _visitAssSequence
@@ -933,10 +933,10 @@
def visitAugAssign(self, node):
self.set_lineno(node)
aug_node = wrap_aug(node.node)
- self.visit(aug_node, "load")
- self.visit(node.expr)
+ aug_node.accept( self, "load")
+ node.expr.accept( self )
self.emit(self._augmented_opcode[node.op])
- self.visit(aug_node, "store")
+ aug_node.accept( self, "store")
_augmented_opcode = {
'+=' : 'INPLACE_ADD',
@@ -961,7 +961,7 @@
def visitAugGetattr(self, node, mode):
if mode == "load":
- self.visit(node.expr)
+ node.expr.accept( self )
self.emit('DUP_TOP')
self.emit('LOAD_ATTR', self.mangle(node.attrname))
elif mode == "store":
@@ -995,32 +995,32 @@
self.emit('STORE_SUBSCR')
def visitExec(self, node):
- self.visit(node.expr)
+ node.expr.accept( self )
if node.locals is None:
self.emit('LOAD_CONST', None)
else:
- self.visit(node.locals)
+ node.locals.accept( self )
if node.globals is None:
self.emit('DUP_TOP')
else:
- self.visit(node.globals)
+ node.globals.accept( self )
self.emit('EXEC_STMT')
def visitCallFunc(self, node):
pos = 0
kw = 0
self.set_lineno(node)
- self.visit(node.node)
+ node.node.accept( self )
for arg in node.args:
- self.visit(arg)
+ arg.accept( self )
if isinstance(arg, ast.Keyword):
kw = kw + 1
else:
pos = pos + 1
if node.star_args is not None:
- self.visit(node.star_args)
+ node.star_args.accept( self )
if node.dstar_args is not None:
- self.visit(node.dstar_args)
+ node.dstar_args.accept( self )
have_star = node.star_args is not None
have_dstar = node.dstar_args is not None
opcode = callfunc_opcode_info[have_star, have_dstar]
@@ -1029,11 +1029,11 @@
def visitPrint(self, node, newline=0):
self.set_lineno(node)
if node.dest:
- self.visit(node.dest)
+ node.dest.accept( self )
for child in node.nodes:
if node.dest:
self.emit('DUP_TOP')
- self.visit(child)
+ child.accept( self )
if node.dest:
self.emit('ROT_TWO')
self.emit('PRINT_ITEM_TO')
@@ -1051,25 +1051,25 @@
def visitReturn(self, node):
self.set_lineno(node)
- self.visit(node.value)
+ node.value.accept( self )
self.emit('RETURN_VALUE')
def visitYield(self, node):
self.set_lineno(node)
- self.visit(node.value)
+ node.value.accept( self )
self.emit('YIELD_VALUE')
# slice and subscript stuff
def visitSlice(self, node, aug_flag=None):
# aug_flag is used by visitAugSlice
- self.visit(node.expr)
+ node.expr.accept( self )
slice = 0
if node.lower:
- self.visit(node.lower)
+ node.lower.accept( self )
slice = slice | 1
if node.upper:
- self.visit(node.upper)
+ node.upper.accept( self )
slice = slice | 2
if aug_flag:
if slice == 0:
@@ -1089,9 +1089,9 @@
raise
def visitSubscript(self, node, aug_flag=None):
- self.visit(node.expr)
+ node.expr.accept( self )
for sub in node.subs:
- self.visit(sub)
+ sub.accept( self )
if aug_flag:
self.emit('DUP_TOPX', 2)
if len(node.subs) > 1:
@@ -1106,8 +1106,8 @@
# binary ops
def binaryOp(self, node, op):
- self.visit(node.left)
- self.visit(node.right)
+ node.left.accept( self )
+ node.right.accept( self )
self.emit(op)
def visitAdd(self, node):
@@ -1140,7 +1140,7 @@
# unary ops
def unaryOp(self, node, op):
- self.visit(node.expr)
+ node.expr.accept( self )
self.emit(op)
def visitInvert(self, node):
@@ -1164,9 +1164,9 @@
# bit ops
def bitOp(self, nodes, op):
- self.visit(nodes[0])
+ nodes[0].accept( self )
for node in nodes[1:]:
- self.visit(node)
+ node.accept( self )
self.emit(op)
def visitBitand(self, node):
@@ -1186,18 +1186,18 @@
def visitTuple(self, node):
self.set_lineno(node)
for elt in node.nodes:
- self.visit(elt)
+ elt.accept( self )
self.emit('BUILD_TUPLE', len(node.nodes))
def visitList(self, node):
self.set_lineno(node)
for elt in node.nodes:
- self.visit(elt)
+ elt.accept( self )
self.emit('BUILD_LIST', len(node.nodes))
def visitSliceobj(self, node):
for child in node.nodes:
- self.visit(child)
+ child.accept( self )
self.emit('BUILD_SLICE', len(node.nodes))
def visitDict(self, node):
@@ -1205,8 +1205,8 @@
self.emit('BUILD_MAP', 0)
for k, v in node.items:
self.emit('DUP_TOP')
- self.visit(k)
- self.visit(v)
+ k.accept( self )
+ v.accept( self )
self.emit('ROT_THREE')
self.emit('STORE_SUBSCR')
@@ -1259,7 +1259,7 @@
def visitDiscard(self, node):
# XXX Discard means it's an expression. Perhaps this is a bad
# name.
- self.visit(node.expr)
+ node.expr.accept( self )
self.emit('PRINT_EXPR')
class AbstractFunctionCode:
Modified: pypy/dist/pypy/interpreter/astcompiler/symbols.py
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/symbols.py (original)
+++ pypy/dist/pypy/interpreter/astcompiler/symbols.py Tue Aug 23 19:58:15 2005
@@ -211,7 +211,7 @@
def __init__(self, name, module):
self.__super_init(name, module, name)
-class SymbolVisitor:
+class SymbolVisitor(ast.ASTVisitor):
def __init__(self):
self.scopes = {}
self.klass = None
@@ -220,22 +220,22 @@
def visitModule(self, node):
scope = self.module = self.scopes[node] = ModuleScope()
- self.visit(node.node, scope)
+ node.node.accept(self, scope)
visitExpression = visitModule
def visitFunction(self, node, parent):
if node.decorators:
- self.visit(node.decorators, parent)
+ node.decorators.accept(self, parent)
parent.add_def(node.name)
for n in node.defaults:
- self.visit(n, parent)
+ n.accept( self, parent)
scope = FunctionScope(node.name, self.module, self.klass)
if parent.nested or isinstance(parent, FunctionScope):
scope.nested = 1
self.scopes[node] = scope
self._do_args(scope, node.argnames)
- self.visit(node.code, scope)
+ node.code.accept(self, scope)
self.handle_free_vars(scope, parent)
def visitGenExpr(self, node, parent):
@@ -245,24 +245,24 @@
scope.nested = 1
self.scopes[node] = scope
- self.visit(node.code, scope)
+ node.code.accept(self, scope)
self.handle_free_vars(scope, parent)
def visitGenExprInner(self, node, scope):
for genfor in node.quals:
- self.visit(genfor, scope)
+ genfor.accept( self, scope)
- self.visit(node.expr, scope)
+ node.expr.accept( self, scope)
def visitGenExprFor(self, node, scope):
- self.visit(node.assign, scope, 1)
- self.visit(node.iter, scope)
+ node.assign.accept(self, scope, 1)
+ node.iter.accept(self, scope)
for if_ in node.ifs:
- self.visit(if_, scope)
+ if_.accept( self, scope)
def visitGenExprIf(self, node, scope):
- self.visit(node.test, scope)
+ node.test.accept( self, scope)
def visitLambda(self, node, parent, assign=0):
# Lambda is an expression, so it could appear in an expression
@@ -271,13 +271,13 @@
assert not assign
for n in node.defaults:
- self.visit(n, parent)
+ n.accept( self, parent)
scope = LambdaScope(self.module, self.klass)
if parent.nested or isinstance(parent, FunctionScope):
scope.nested = 1
self.scopes[node] = scope
self._do_args(scope, node.argnames)
- self.visit(node.code, scope)
+ node.code.accept(self, scope)
self.handle_free_vars(scope, parent)
def _do_args(self, scope, args):
@@ -296,7 +296,7 @@
def visitClass(self, node, parent):
parent.add_def(node.name)
for n in node.bases:
- self.visit(n, parent)
+ n.accept(self, parent)
scope = ClassScope(node.name, self.module)
if parent.nested or isinstance(parent, FunctionScope):
scope.nested = 1
@@ -306,7 +306,7 @@
self.scopes[node] = scope
prev = self.klass
self.klass = node.name
- self.visit(node.code, scope)
+ node.code.accept(self, scope)
self.klass = prev
self.handle_free_vars(scope, parent)
@@ -325,11 +325,11 @@
# operations that bind new names
def visitFor(self, node, scope):
- self.visit(node.assign, scope, 1)
- self.visit(node.list, scope)
- self.visit(node.body, scope)
+ node.assign.accept( self, scope, 1)
+ node.list.accept( self, scope)
+ node.body.accept( self, scope)
if node.else_:
- self.visit(node.else_, scope)
+ node.else_.accept( self, scope)
def visitFrom(self, node, scope):
for name, asname in node.names:
@@ -362,34 +362,34 @@
the assign flag to their children.
"""
for n in node.nodes:
- self.visit(n, scope, 1)
- self.visit(node.expr, scope)
+ n.accept( self, scope, 1)
+ node.expr.accept( self, scope)
def visitAssName(self, node, scope, assign=1):
scope.add_def(node.name)
def visitAssAttr(self, node, scope, assign=0):
- self.visit(node.expr, scope, 0)
+ node.expr.accept( self, scope, 0)
def visitSubscript(self, node, scope, assign=0):
- self.visit(node.expr, scope, 0)
+ node.expr.accept( self, scope, 0)
for n in node.subs:
- self.visit(n, scope, 0)
+ n.accept( self, scope, 0)
def visitSlice(self, node, scope, assign=0):
- self.visit(node.expr, scope, 0)
+ node.expr.accept( self, scope, 0)
if node.lower:
- self.visit(node.lower, scope, 0)
+ node.lower.accept( self, scope, 0)
if node.upper:
- self.visit(node.upper, scope, 0)
+ node.upper.accept( self, scope, 0)
def visitAugAssign(self, node, scope):
# If the LHS is a name, then this counts as assignment.
# Otherwise, it's just use.
- self.visit(node.node, scope)
+ node.node.accept( self, scope)
if isinstance(node.node, ast.Name):
- self.visit(node.node, scope, 1) # XXX worry about this
- self.visit(node.expr, scope)
+ node.node.accept( self, scope, 1) # XXX worry about this
+ node.expr.accept( self, scope)
# prune if statements if tests are false
@@ -401,16 +401,16 @@
if type(test.value) in self._const_types:
if not test.value:
continue
- self.visit(test, scope)
- self.visit(body, scope)
+ test.accept( self, scope)
+ body.accept( self, scope)
if node.else_:
- self.visit(node.else_, scope)
+ node.else_.accept( self, scope)
# a yield statement signals a generator
def visitYield(self, node, scope):
scope.generator = 1
- self.visit(node.value, scope)
+ node.value.accept( self, scope)
def sort(l):
l = l[:]
Modified: pypy/dist/pypy/interpreter/astcompiler/visitor.py
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/visitor.py (original)
+++ pypy/dist/pypy/interpreter/astcompiler/visitor.py Tue Aug 23 19:58:15 2005
@@ -106,6 +106,10 @@
walker.preorder(tree, visitor)
return walker.visitor
+def walk(tree, visitor, verbose=None):
+ tree.accept( visitor )
+ return visitor
+
def dumpNode(node):
print node.__class__
for attr in dir(node):
Modified: pypy/dist/pypy/interpreter/pyparser/astbuilder.py
==============================================================================
--- pypy/dist/pypy/interpreter/pyparser/astbuilder.py (original)
+++ pypy/dist/pypy/interpreter/pyparser/astbuilder.py Tue Aug 23 19:58:15 2005
@@ -281,7 +281,7 @@
first_child = stmt.nodes[0]
if isinstance(first_child, ast.Discard):
expr = first_child.expr
- if isinstance(expr, StringConst):
+ if isinstance(expr, ast.StringConst):
# This *is* a docstring, remove it from stmt list
del stmt.nodes[0]
doc = expr.string_value
@@ -495,14 +495,14 @@
elif top.name == tok.NAME:
builder.push( ast.Name(top.get_value()) )
elif top.name == tok.NUMBER:
- builder.push(NumberConst(eval_number(top.get_value())))
+ builder.push(ast.NumberConst(eval_number(top.get_value())))
elif top.name == tok.STRING:
# need to concatenate strings in atoms
s = ''
for token in atoms:
assert isinstance(token, TokenObject)
s += eval_string(token.get_value())
- builder.push(StringConst(s))
+ builder.push(ast.StringConst(s))
elif top.name == tok.BACKQUOTE:
builder.push(ast.Backquote(atoms[1]))
else:
@@ -707,7 +707,7 @@
for n in range(0,l,2):
node = atoms[n]
if isinstance(node, TokenObject) and node.name == tok.NEWLINE:
- nodes.append(ast.Discard(NoneConst()))
+ nodes.append(ast.Discard(ast.NoneConst()))
else:
nodes.append(node)
builder.push(ast.Stmt(nodes))
@@ -717,7 +717,7 @@
if len(atoms) > 2:
assert False, "return several stmts not implemented"
elif len(atoms) == 1:
- builder.push(ast.Return(NoneConst(), None)) # XXX lineno
+ builder.push(ast.Return(ast.NoneConst(), None)) # XXX lineno
else:
builder.push(ast.Return(atoms[1], None)) # XXX lineno
@@ -851,7 +851,7 @@
sliceobj_infos = []
for value in sliceinfos:
if value is None:
- sliceobj_infos.append(NoneConst())
+ sliceobj_infos.append(ast.NoneConst())
else:
sliceobj_infos.append(value)
builder.push(SlicelistObject('sliceobj', sliceobj_infos, None))
@@ -1306,40 +1306,6 @@
}
## Stack elements definitions ###################################
-class StringConst(ast.Const):
- """specicifc Const node for strings"""
- def __init__(self, value, lineno=None):
- self.lineno = lineno
- # don't use "value" for attribute's name to avoid confusing
- # the annotator
- self.string_value = value
-
- def __repr__(self):
- return "Const(%s)" % (repr(self.string_value),)
-
- def getChildren(self):
- return self.string_value,
-
-class NumberConst(ast.Const):
- """specific Const node for numbers"""
- def __init__(self, value, lineno=None):
- self.lineno = lineno
- # don't use "value" for attribute's name to avoid confusing
- # the annotator
- self.number_value = value
-
- def __repr__(self):
- return "Const(%s)" % (repr(self.number_value),)
-
- def getChildren(self):
- return self.number_value,
-
-class NoneConst(ast.Const):
- """specific Const node for None (probably not really needed)"""
- def __init__(self, lineno=None):
- self.lineno = lineno
- self.value = None
-
class BaseRuleObject(ast.Node):
"""Base class for unnamed rules"""
Modified: pypy/dist/pypy/interpreter/pyparser/test/test_astcompiler.py
==============================================================================
--- pypy/dist/pypy/interpreter/pyparser/test/test_astcompiler.py (original)
+++ pypy/dist/pypy/interpreter/pyparser/test/test_astcompiler.py Tue Aug 23 19:58:15 2005
@@ -7,6 +7,7 @@
from pypy.interpreter.astcompiler import ast, misc, pycodegen
+from test_astbuilder import TESTS
TARGET_DICT = {
'single' : 'single_input',
@@ -31,17 +32,18 @@
def compare_code( code1, code2 ):
- print "Filename", code1.co_filename, code2.co_filename
+ #print "Filename", code1.co_filename, code2.co_filename
assert code1.co_filename == code2.co_filename
- print repr(code1.co_code)
- print repr(code2.co_code)
+ #print repr(code1.co_code)
+ #print repr(code2.co_code)
assert code1.co_code == code2.co_code
+ assert code1.co_varnames == code2.co_varnames
def check_compile( expr ):
import new
ast_tree = ast_parse_expr( expr )
misc.set_filename("<?>", ast_tree)
- print ast_tree
+ #print ast_tree
codegenerator = pycodegen.InteractiveCodeGenerator(ast_tree)
code1 = new.code(*codegenerator.getCode())
code2 = ast_compile( expr )
@@ -65,3 +67,10 @@
print x,y,z,t,u
"""
check_compile( code )
+
+
+
+def test_basic_astgen():
+ for family in TESTS:
+ for expr in family:
+ yield check_compile, expr
More information about the Pypy-commit
mailing list