[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
Fri, 21 Dec 2001 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)