[Python-checkins] CVS: python/dist/src/Lib/compiler ast.py,1.19,1.19.8.1 pycodegen.py,1.58,1.58.4.1 symbols.py,1.10,1.10.8.1
Jeremy Hylton
jhylton@users.sourceforge.net
2001年12月21日 06:41:04 -0800
Update of /cvsroot/python/python/dist/src/Lib/compiler
In directory usw-pr-cvs1:/tmp/cvs-serv23307
Modified Files:
Tag: release22-branch
ast.py pycodegen.py symbols.py
Log Message:
Fix 'eval' mode of compiler.compile().
Based on suggestion by Shane Hathaway.
Add an artifical Expression() node to the AST. This node serves only
to make the ExpressionCodeGenerator simpler and more like the Module
version. An Expression() wraps the actual expression node compiled in
'eval' mode.
Add visitExpression() to CodeGenerator and SymbolVisitor.
Index: ast.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/compiler/ast.py,v
retrieving revision 1.19
retrieving revision 1.19.8.1
diff -C2 -d -r1.19 -r1.19.8.1
*** ast.py 2001年10月18日 21:57:37 1.19
--- ast.py 2001年12月21日 14:41:02 1.19.8.1
***************
*** 283,286 ****
--- 283,301 ----
return "Module(%s, %s)" % (repr(self.doc), repr(self.node))
+ class Expression(Node):
+ # Expression is an artifical node class to support "eval"
+ nodes["expression"] = "Expression"
+ def __init__(self, expr):
+ self.expr = expr
+
+ def getChildren(self):
+ return self.expr,
+
+ def getChildNodes(self):
+ return self.expr,
+
+ def __repr__(self):
+ return "Expression(%s)" % (repr(self.expr))
+
class UnaryAdd(Node):
nodes["unaryadd"] = "UnaryAdd"
Index: pycodegen.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/compiler/pycodegen.py,v
retrieving revision 1.58
retrieving revision 1.58.4.1
diff -C2 -d -r1.58 -r1.58.4.1
*** pycodegen.py 2001年11月27日 23:35:10 1.58
--- pycodegen.py 2001年12月21日 14:41:02 1.58.4.1
***************
*** 35,38 ****
--- 35,39 ----
END_FINALLY = 4
+ # XXX this doesn't seem to be used
class BlockStack(misc.Stack):
__super_init = misc.Stack.__init__
***************
*** 352,355 ****
--- 353,363 ----
self.emit('RETURN_VALUE')
+ def visitExpression(self, node):
+ self.set_lineno(node)
+ self.scopes = self.parseSymbols(node)
+ self.scope = self.scopes[node]
+ self.visit(node.expr)
+ self.emit('RETURN_VALUE')
+
def visitFunction(self, node):
self._visitFuncOrLambda(node, isLambda=0)
***************
*** 1159,1165 ****
self.graph = pyassem.PyFlowGraph("<expression>", tree.filename)
self.__super_init()
! self.set_lineno(tree)
! walk(tree, self)
! self.emit('RETURN_VALUE')
def get_module(self):
--- 1167,1171 ----
self.graph = pyassem.PyFlowGraph("<expression>", tree.filename)
self.__super_init()
! walk(ast.Expression(tree), self)
def get_module(self):
***************
*** 1182,1185 ****
--- 1188,1192 ----
def get_module(self):
return self
+
def visitDiscard(self, node):
# XXX Discard means it's an expression. Perhaps this is a bad
***************
*** 1300,1304 ****
self.graph.setFreeVars(self.scope.get_free_vars())
self.graph.setCellVars(self.scope.get_cell_vars())
- ## self.graph.setFlag(CO_NESTED)
def generateArgList(arglist):
--- 1307,1310 ----
Index: symbols.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/compiler/symbols.py,v
retrieving revision 1.10
retrieving revision 1.10.8.1
diff -C2 -d -r1.10 -r1.10.8.1
*** symbols.py 2001年10月18日 21:57:37 1.10
--- symbols.py 2001年12月21日 14:41:02 1.10.8.1
***************
*** 207,210 ****
--- 207,212 ----
self.visit(node.node, scope)
+ visitExpression = visitModule
+
def visitFunction(self, node, parent):
parent.add_def(node.name)