[Zope-Checkins] CVS: Zope/lib/python/RestrictedPython/compiler - ast.py:1.3 astgen.py:1.3 future.py:1.3 transformer.py:1.3

Shane Hathaway shane@digicool.com
Mon, 27 Aug 2001 10:40:21 -0400


Update of /cvs-repository/Zope/lib/python/RestrictedPython/compiler
In directory cvs.zope.org:/tmp/cvs-serv15860/compiler

Modified Files:
	ast.py astgen.py future.py transformer.py 
Log Message:
Merged recent changes to the compiler package, adding "yield" support and
fixing bugs.


=== Zope/lib/python/RestrictedPython/compiler/ast.py 1.2 => 1.3 ===
     def asList(self):
         return tuple(asList(self.getChildren()))
+    def getChildNodes(self):
+        return [n for n in self.getChildren() if isinstance(n, Node)]
 
 class EmptyNode(Node):
     def __init__(self):
@@ -188,7 +190,7 @@
     def _getChildren(self):
         return self.left, self.right
     def __repr__(self):
-        return "Sub(%s, %s)" % (repr(self.left), repr(self.right))
+        return "Sub((%s, %s))" % (repr(self.left), repr(self.right))
 
 class ListCompIf(Node):
     nodes["listcompif"] = "ListCompIf"
@@ -207,7 +209,7 @@
     def _getChildren(self):
         return self.left, self.right
     def __repr__(self):
-        return "Div(%s, %s)" % (repr(self.left), repr(self.right))
+        return "Div((%s, %s))" % (repr(self.left), repr(self.right))
 
 class Discard(Node):
     nodes["discard"] = "Discard"
@@ -235,7 +237,7 @@
     def _getChildren(self):
         return self.left, self.right
     def __repr__(self):
-        return "RightShift(%s, %s)" % (repr(self.left), repr(self.right))
+        return "RightShift((%s, %s))" % (repr(self.left), repr(self.right))
 
 class Continue(Node):
     nodes["continue"] = "Continue"
@@ -275,7 +277,7 @@
     def _getChildren(self):
         return self.left, self.right
     def __repr__(self):
-        return "LeftShift(%s, %s)" % (repr(self.left), repr(self.right))
+        return "LeftShift((%s, %s))" % (repr(self.left), repr(self.right))
 
 class Mul(Node):
     nodes["mul"] = "Mul"
@@ -285,7 +287,16 @@
     def _getChildren(self):
         return self.left, self.right
     def __repr__(self):
-        return "Mul(%s, %s)" % (repr(self.left), repr(self.right))
+        return "Mul((%s, %s))" % (repr(self.left), repr(self.right))
+
+class Yield(Node):
+    nodes["yield"] = "Yield"
+    def __init__(self, value):
+        self.value = value
+    def _getChildren(self):
+        return self.value,
+    def __repr__(self):
+        return "Yield(%s)" % (repr(self.value),)
 
 class List(Node):
     nodes["list"] = "List"
@@ -354,7 +365,7 @@
     def _getChildren(self):
         return self.left, self.right
     def __repr__(self):
-        return "Mod(%s, %s)" % (repr(self.left), repr(self.right))
+        return "Mod((%s, %s))" % (repr(self.left), repr(self.right))
 
 class Class(Node):
     nodes["class"] = "Class"
@@ -452,16 +463,16 @@
     def _getChildren(self):
         return self.left, self.right
     def __repr__(self):
-        return "Power(%s, %s)" % (repr(self.left), repr(self.right))
+        return "Power((%s, %s))" % (repr(self.left), repr(self.right))
 
-class Import(Node):
-    nodes["import"] = "Import"
-    def __init__(self, names):
-        self.names = names
+class Ellipsis(Node):
+    nodes["ellipsis"] = "Ellipsis"
+    def __init__(self, ):
+        pass
     def _getChildren(self):
-        return self.names,
+        return ()
     def __repr__(self):
-        return "Import(%s)" % (repr(self.names),)
+        return "Ellipsis()"
 
 class Return(Node):
     nodes["return"] = "Return"
@@ -480,7 +491,7 @@
     def _getChildren(self):
         return self.left, self.right
     def __repr__(self):
-        return "Add(%s, %s)" % (repr(self.left), repr(self.right))
+        return "Add((%s, %s))" % (repr(self.left), repr(self.right))
 
 class Function(Node):
     nodes["function"] = "Function"
@@ -525,14 +536,14 @@
     def __repr__(self):
         return "Subscript(%s, %s, %s)" % (repr(self.expr), repr(self.flags), repr(self.subs))
 
-class Ellipsis(Node):
-    nodes["ellipsis"] = "Ellipsis"
-    def __init__(self, ):
-        pass
+class Import(Node):
+    nodes["import"] = "Import"
+    def __init__(self, names):
+        self.names = names
     def _getChildren(self):
-        return ()
+        return self.names,
     def __repr__(self):
-        return "Ellipsis()"
+        return "Import(%s)" % (repr(self.names),)
 
 class Print(Node):
     nodes["print"] = "Print"


=== Zope/lib/python/RestrictedPython/compiler/astgen.py 1.2 => 1.3 ===
         if self.argnames:
             fmt = COMMA.join(["%s"] * self.nargs)
+            if '(' in self.args:
+                fmt = '(%s)' % fmt
             vals = ["repr(self.%s)" % name for name in self.argnames]
             vals = COMMA.join(vals)
             if self.nargs == 1:
@@ -171,6 +173,8 @@
         return flatten(self._getChildren())
     def asList(self):
         return tuple(asList(self.getChildren()))
+    def getChildNodes(self):
+        return [n for n in self.getChildren() if isinstance(n, Node)]
 
 class EmptyNode(Node):
     def __init__(self):


=== Zope/lib/python/RestrictedPython/compiler/future.py 1.2 => 1.3 ===
 class FutureParser:
 
-    features = ("nested_scopes",)
+    features = ("nested_scopes", "generators", "division")
     
     def __init__(self):
         self.found = {} # set
 
     def visitModule(self, node):
-        if node.doc is None:
-            off = 0
-        else:
-            off = 1
-
         stmt = node.node
-        for s in stmt.nodes[off:]:
+        for s in stmt.nodes:
             if not self.check_stmt(s):
                 break
 


=== Zope/lib/python/RestrictedPython/compiler/transformer.py 1.2 => 1.3 ===
     def file_input(self, nodelist):
         doc = self.get_docstring(nodelist, symbol.file_input)
+        if doc is not None:
+            i = 1
+        else:
+            i = 0
         stmts = []
-        for node in nodelist:
+        for node in nodelist[i:]:
             if node[0] != token.ENDMARKER and node[0] != token.NEWLINE:
                 self.com_append_stmt(stmts, node)
         return Module(doc, Stmt(stmts))
@@ -340,6 +344,11 @@
         n.lineno = nodelist[0][2]
         return n
 
+    def yield_stmt(self, nodelist):
+        n = Yield(self.com_node(nodelist[1]))
+        n.lineno = nodelist[0][2]
+        return n
+
     def raise_stmt(self, nodelist):
         # raise: [test [',' test [',' test]]]
         if len(nodelist) > 5:
@@ -1245,6 +1254,7 @@
     symbol.continue_stmt,
     symbol.return_stmt,
     symbol.raise_stmt,
+    #symbol.yield_stmt,
     symbol.import_stmt,
     symbol.global_stmt,
     symbol.exec_stmt,
@@ -1270,6 +1280,9 @@
     symbol.power,
     symbol.atom,
     ]
+
+if hasattr(symbol, 'yield_stmt'):
+    _legal_node_types.append(symbol.yield_stmt)
 
 _assign_types = [
     symbol.test,