[pypy-svn] r17248 - in pypy/dist/pypy/interpreter: astcompiler pyparser/test

pedronis at codespeak.net pedronis at codespeak.net
Mon Sep 5 18:40:36 CEST 2005


Author: pedronis
Date: Mon Sep  5 18:40:34 2005
New Revision: 17248

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/pyparser/test/test_astbuilder.py
Log:
don't use a generic type-problematic flatten_nodes for getChildNodes, put special cases treatment specs into ast.txt itself, 

flatten_nodes(CLASS.attr):
  add to nodelist

added code in astgen.py to support this.



Modified: pypy/dist/pypy/interpreter/astcompiler/ast.py
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/ast.py	(original)
+++ pypy/dist/pypy/interpreter/astcompiler/ast.py	Mon Sep  5 18:40:34 2005
@@ -16,14 +16,14 @@
             l.append(elt)
     return l
 
-def flatten_nodes(list):
-    return [n for n in flatten(list) if isinstance(n, Node)]
+#def flatten_nodes(list):
+#    return [n for n in flatten(list) if isinstance(n, Node)]
 
 nodes = {}
 
 class Node(Wrappable):
     """Abstract base class for ast nodes."""
-    def __init__(self, lineno=-1):
+    def __init__(self, lineno = -1):
         self.lineno = lineno
         self.filename = ""
         
@@ -79,6 +79,7 @@
         self.right = right
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.left, self.right
 
     def getChildNodes(self):
@@ -96,11 +97,12 @@
         self.nodes = nodes
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return tuple(flatten(self.nodes))
 
     def getChildNodes(self):
         nodelist = []
-        nodelist.extend(flatten_nodes(self.nodes))
+        nodelist.extend(self.nodes)
         return nodelist
 
     def __repr__(self):
@@ -117,6 +119,7 @@
         self.flags = flags
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.expr, self.attrname, self.flags
 
     def getChildNodes(self):
@@ -134,11 +137,12 @@
         self.nodes = nodes
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return tuple(flatten(self.nodes))
 
     def getChildNodes(self):
         nodelist = []
-        nodelist.extend(flatten_nodes(self.nodes))
+        nodelist.extend(self.nodes)
         return nodelist
 
     def __repr__(self):
@@ -154,6 +158,7 @@
         self.flags = flags
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.name, self.flags
 
     def getChildNodes(self):
@@ -171,11 +176,12 @@
         self.nodes = nodes
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return tuple(flatten(self.nodes))
 
     def getChildNodes(self):
         nodelist = []
-        nodelist.extend(flatten_nodes(self.nodes))
+        nodelist.extend(self.nodes)
         return nodelist
 
     def __repr__(self):
@@ -191,6 +197,7 @@
         self.fail = fail
 
     def getChildren(self):
+        "NOT_RPYTHON"
         children = []
         children.append(self.test)
         children.append(self.fail)
@@ -216,6 +223,7 @@
         self.expr = expr
 
     def getChildren(self):
+        "NOT_RPYTHON"
         children = []
         children.extend(flatten(self.nodes))
         children.append(self.expr)
@@ -223,7 +231,7 @@
 
     def getChildNodes(self):
         nodelist = []
-        nodelist.extend(flatten_nodes(self.nodes))
+        nodelist.extend(self.nodes)
         nodelist.append(self.expr)
         return nodelist
 
@@ -241,6 +249,7 @@
         self.expr = expr
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.node, self.op, self.expr
 
     def getChildNodes(self):
@@ -258,6 +267,7 @@
         self.expr = expr
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.expr,
 
     def getChildNodes(self):
@@ -275,11 +285,12 @@
         self.nodes = nodes
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return tuple(flatten(self.nodes))
 
     def getChildNodes(self):
         nodelist = []
-        nodelist.extend(flatten_nodes(self.nodes))
+        nodelist.extend(self.nodes)
         return nodelist
 
     def __repr__(self):
@@ -294,11 +305,12 @@
         self.nodes = nodes
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return tuple(flatten(self.nodes))
 
     def getChildNodes(self):
         nodelist = []
-        nodelist.extend(flatten_nodes(self.nodes))
+        nodelist.extend(self.nodes)
         return nodelist
 
     def __repr__(self):
@@ -313,11 +325,12 @@
         self.nodes = nodes
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return tuple(flatten(self.nodes))
 
     def getChildNodes(self):
         nodelist = []
-        nodelist.extend(flatten_nodes(self.nodes))
+        nodelist.extend(self.nodes)
         return nodelist
 
     def __repr__(self):
@@ -331,6 +344,7 @@
         Node.__init__(self, lineno)
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return []
 
     def getChildNodes(self):
@@ -351,6 +365,7 @@
         self.dstar_args = dstar_args
 
     def getChildren(self):
+        "NOT_RPYTHON"
         children = []
         children.append(self.node)
         children.extend(flatten(self.args))
@@ -361,7 +376,7 @@
     def getChildNodes(self):
         nodelist = []
         nodelist.append(self.node)
-        nodelist.extend(flatten_nodes(self.args))
+        nodelist.extend(self.args)
         if self.star_args is not None:
             nodelist.append(self.star_args)
         if self.dstar_args is not None:
@@ -383,6 +398,7 @@
         self.code = code
 
     def getChildren(self):
+        "NOT_RPYTHON"
         children = []
         children.append(self.name)
         children.extend(flatten(self.bases))
@@ -392,7 +408,7 @@
 
     def getChildNodes(self):
         nodelist = []
-        nodelist.extend(flatten_nodes(self.bases))
+        nodelist.extend(self.bases)
         nodelist.append(self.code)
         return nodelist
 
@@ -410,6 +426,7 @@
         self.ops = ops
 
     def getChildren(self):
+        "NOT_RPYTHON"
         children = []
         children.append(self.expr)
         children.extend(flatten(self.ops))
@@ -418,10 +435,9 @@
     def getChildNodes(self):
         nodelist = []
         nodelist.append(self.expr)
-        # this is a replacement of flatten_nodes
+        # ops is a list of couples (op_name, node)
         for op_name, node in self.ops:
             nodelist.append(node)
-        # nodelist.extend(flatten_nodes(self.ops))
         return nodelist
 
     def __repr__(self):
@@ -436,6 +452,7 @@
         self.value = value
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.value,
 
     def getChildNodes(self):
@@ -452,6 +469,7 @@
         Node.__init__(self, lineno)
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return []
 
     def getChildNodes(self):
@@ -469,11 +487,12 @@
         self.nodes = nodes
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return tuple(flatten(self.nodes))
 
     def getChildNodes(self):
         nodelist = []
-        nodelist.extend(flatten_nodes(self.nodes))
+        nodelist.extend(self.nodes)
         return nodelist
 
     def __repr__(self):
@@ -489,15 +508,15 @@
         self.items = items
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return tuple(flatten(self.items))
 
     def getChildNodes(self):
         nodelist = []
-        # replacement for flatten_nodes()
+        # items is a list of couples (node (key), node (value))
         for key, value in self.items:
             nodelist.append(key)
             nodelist.append(value)
-        # nodelist.extend(flatten_nodes(self.items))
         return nodelist
 
     def __repr__(self):
@@ -512,6 +531,7 @@
         self.expr = expr
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.expr,
 
     def getChildNodes(self):
@@ -530,6 +550,7 @@
         self.right = right
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.left, self.right
 
     def getChildNodes(self):
@@ -546,6 +567,7 @@
         Node.__init__(self, lineno)
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return []
 
     def getChildNodes(self):
@@ -565,6 +587,7 @@
         self.globals = globals
 
     def getChildren(self):
+        "NOT_RPYTHON"
         children = []
         children.append(self.expr)
         children.append(self.locals)
@@ -593,6 +616,7 @@
         self.right = right
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.left, self.right
 
     def getChildNodes(self):
@@ -613,6 +637,7 @@
         self.else_ = else_
 
     def getChildren(self):
+        "NOT_RPYTHON"
         children = []
         children.append(self.assign)
         children.append(self.list)
@@ -642,6 +667,7 @@
         self.names = names
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.modname, self.names
 
     def getChildNodes(self):
@@ -672,6 +698,7 @@
 
 
     def getChildren(self):
+        "NOT_RPYTHON"
         children = []
         children.append(self.decorators)
         children.append(self.name)
@@ -686,7 +713,7 @@
         nodelist = []
         if self.decorators is not None:
             nodelist.append(self.decorators)
-        nodelist.extend(flatten_nodes(self.defaults))
+        nodelist.extend(self.defaults)
         nodelist.append(self.code)
         return nodelist
 
@@ -706,6 +733,7 @@
 
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.code,
 
     def getChildNodes(self):
@@ -724,9 +752,11 @@
         self.iter = iter
         self.ifs = ifs
         self.is_outmost = False
+    
 
 
     def getChildren(self):
+        "NOT_RPYTHON"
         children = []
         children.append(self.assign)
         children.append(self.iter)
@@ -737,7 +767,7 @@
         nodelist = []
         nodelist.append(self.assign)
         nodelist.append(self.iter)
-        nodelist.extend(flatten_nodes(self.ifs))
+        nodelist.extend(self.ifs)
         return nodelist
 
     def __repr__(self):
@@ -752,6 +782,7 @@
         self.test = test
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.test,
 
     def getChildNodes(self):
@@ -770,6 +801,7 @@
         self.quals = quals
 
     def getChildren(self):
+        "NOT_RPYTHON"
         children = []
         children.append(self.expr)
         children.extend(flatten(self.quals))
@@ -778,7 +810,7 @@
     def getChildNodes(self):
         nodelist = []
         nodelist.append(self.expr)
-        nodelist.extend(flatten_nodes(self.quals))
+        nodelist.extend(self.quals)
         return nodelist
 
     def __repr__(self):
@@ -794,6 +826,7 @@
         self.attrname = attrname
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.expr, self.attrname
 
     def getChildNodes(self):
@@ -811,6 +844,7 @@
         self.names = names
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.names,
 
     def getChildNodes(self):
@@ -825,10 +859,12 @@
 class If(Node):
     def __init__(self, tests, else_, lineno=-1):
         Node.__init__(self, lineno)
+        # tests is a list of couples (node (test), node (suite))
         self.tests = tests
         self.else_ = else_
 
     def getChildren(self):
+        "NOT_RPYTHON"
         children = []
         children.extend(flatten(self.tests))
         children.append(self.else_)
@@ -836,7 +872,10 @@
 
     def getChildNodes(self):
         nodelist = []
-        nodelist.extend(flatten_nodes(self.tests))
+        # tests is a list of couples (node (test), node (suite))
+        for test, suite in self.items:
+            nodelist.append(test)
+            nodelist.append(suite)
         if self.else_ is not None:
             nodelist.append(self.else_)
         return nodelist
@@ -853,6 +892,7 @@
         self.names = names
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.names,
 
     def getChildNodes(self):
@@ -870,6 +910,7 @@
         self.expr = expr
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.expr,
 
     def getChildNodes(self):
@@ -888,6 +929,7 @@
         self.expr = expr
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.name, self.expr
 
     def getChildNodes(self):
@@ -915,6 +957,7 @@
 
 
     def getChildren(self):
+        "NOT_RPYTHON"
         children = []
         children.append(self.argnames)
         children.extend(flatten(self.defaults))
@@ -924,7 +967,7 @@
 
     def getChildNodes(self):
         nodelist = []
-        nodelist.extend(flatten_nodes(self.defaults))
+        nodelist.extend(self.defaults)
         nodelist.append(self.code)
         return nodelist
 
@@ -941,6 +984,7 @@
         self.right = right
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.left, self.right
 
     def getChildNodes(self):
@@ -958,11 +1002,12 @@
         self.nodes = nodes
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return tuple(flatten(self.nodes))
 
     def getChildNodes(self):
         nodelist = []
-        nodelist.extend(flatten_nodes(self.nodes))
+        nodelist.extend(self.nodes)
         return nodelist
 
     def __repr__(self):
@@ -978,6 +1023,7 @@
         self.quals = quals
 
     def getChildren(self):
+        "NOT_RPYTHON"
         children = []
         children.append(self.expr)
         children.extend(flatten(self.quals))
@@ -986,7 +1032,7 @@
     def getChildNodes(self):
         nodelist = []
         nodelist.append(self.expr)
-        nodelist.extend(flatten_nodes(self.quals))
+        nodelist.extend(self.quals)
         return nodelist
 
     def __repr__(self):
@@ -1003,6 +1049,7 @@
         self.ifs = ifs
 
     def getChildren(self):
+        "NOT_RPYTHON"
         children = []
         children.append(self.assign)
         children.append(self.list)
@@ -1013,7 +1060,7 @@
         nodelist = []
         nodelist.append(self.assign)
         nodelist.append(self.list)
-        nodelist.extend(flatten_nodes(self.ifs))
+        nodelist.extend(self.ifs)
         return nodelist
 
     def __repr__(self):
@@ -1028,6 +1075,7 @@
         self.test = test
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.test,
 
     def getChildNodes(self):
@@ -1046,6 +1094,7 @@
         self.right = right
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.left, self.right
 
     def getChildNodes(self):
@@ -1064,6 +1113,7 @@
         self.node = node
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.doc, self.node
 
     def getChildNodes(self):
@@ -1082,6 +1132,7 @@
         self.right = right
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.left, self.right
 
     def getChildNodes(self):
@@ -1099,6 +1150,7 @@
         self.varname = varname
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.varname,
 
     def getChildNodes(self):
@@ -1115,6 +1167,7 @@
         Node.__init__(self, lineno)
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return []
 
     def getChildNodes(self):
@@ -1132,6 +1185,7 @@
         self.expr = expr
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.expr,
 
     def getChildNodes(self):
@@ -1149,6 +1203,7 @@
         self.number_value = number_value
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.number_value,
 
     def getChildNodes(self):
@@ -1166,11 +1221,12 @@
         self.nodes = nodes
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return tuple(flatten(self.nodes))
 
     def getChildNodes(self):
         nodelist = []
-        nodelist.extend(flatten_nodes(self.nodes))
+        nodelist.extend(self.nodes)
         return nodelist
 
     def __repr__(self):
@@ -1184,6 +1240,7 @@
         Node.__init__(self, lineno)
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return []
 
     def getChildNodes(self):
@@ -1202,6 +1259,7 @@
         self.right = right
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.left, self.right
 
     def getChildNodes(self):
@@ -1220,6 +1278,7 @@
         self.dest = dest
 
     def getChildren(self):
+        "NOT_RPYTHON"
         children = []
         children.extend(flatten(self.nodes))
         children.append(self.dest)
@@ -1227,7 +1286,7 @@
 
     def getChildNodes(self):
         nodelist = []
-        nodelist.extend(flatten_nodes(self.nodes))
+        nodelist.extend(self.nodes)
         if self.dest is not None:
             nodelist.append(self.dest)
         return nodelist
@@ -1245,6 +1304,7 @@
         self.dest = dest
 
     def getChildren(self):
+        "NOT_RPYTHON"
         children = []
         children.extend(flatten(self.nodes))
         children.append(self.dest)
@@ -1252,7 +1312,7 @@
 
     def getChildNodes(self):
         nodelist = []
-        nodelist.extend(flatten_nodes(self.nodes))
+        nodelist.extend(self.nodes)
         if self.dest is not None:
             nodelist.append(self.dest)
         return nodelist
@@ -1271,6 +1331,7 @@
         self.expr3 = expr3
 
     def getChildren(self):
+        "NOT_RPYTHON"
         children = []
         children.append(self.expr1)
         children.append(self.expr2)
@@ -1299,6 +1360,7 @@
         self.value = value
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.value,
 
     def getChildNodes(self):
@@ -1317,6 +1379,7 @@
         self.right = right
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.left, self.right
 
     def getChildNodes(self):
@@ -1337,6 +1400,7 @@
         self.upper = upper
 
     def getChildren(self):
+        "NOT_RPYTHON"
         children = []
         children.append(self.expr)
         children.append(self.flags)
@@ -1365,11 +1429,12 @@
         self.nodes = nodes
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return tuple(flatten(self.nodes))
 
     def getChildNodes(self):
         nodelist = []
-        nodelist.extend(flatten_nodes(self.nodes))
+        nodelist.extend(self.nodes)
         return nodelist
 
     def __repr__(self):
@@ -1384,11 +1449,12 @@
         self.nodes = nodes
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return tuple(flatten(self.nodes))
 
     def getChildNodes(self):
         nodelist = []
-        nodelist.extend(flatten_nodes(self.nodes))
+        nodelist.extend(self.nodes)
         return nodelist
 
     def __repr__(self):
@@ -1403,6 +1469,7 @@
         self.string_value = string_value
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.string_value,
 
     def getChildNodes(self):
@@ -1421,6 +1488,7 @@
         self.right = right
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.left, self.right
 
     def getChildNodes(self):
@@ -1440,6 +1508,7 @@
         self.subs = subs
 
     def getChildren(self):
+        "NOT_RPYTHON"
         children = []
         children.append(self.expr)
         children.append(self.flags)
@@ -1449,7 +1518,7 @@
     def getChildNodes(self):
         nodelist = []
         nodelist.append(self.expr)
-        nodelist.extend(flatten_nodes(self.subs))
+        nodelist.extend(self.subs)
         return nodelist
 
     def __repr__(self):
@@ -1467,6 +1536,7 @@
         self.else_ = else_
 
     def getChildren(self):
+        "NOT_RPYTHON"
         children = []
         children.append(self.body)
         children.extend(flatten(self.handlers))
@@ -1476,7 +1546,7 @@
     def getChildNodes(self):
         nodelist = []
         nodelist.append(self.body)
-        # replacement for flatten_nodes(self.handlers)
+        # handlers is a list of triplets (expr1, expr2, body)
         for expr1, expr2, body in self.handlers:
             if expr1 is not None:
                 nodelist.append(expr1)
@@ -1501,6 +1571,7 @@
         self.final = final
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.body, self.final
 
     def getChildNodes(self):
@@ -1518,11 +1589,12 @@
         self.nodes = nodes
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return tuple(flatten(self.nodes))
 
     def getChildNodes(self):
         nodelist = []
-        nodelist.extend(flatten_nodes(self.nodes))
+        nodelist.extend(self.nodes)
         return nodelist
 
     def __repr__(self):
@@ -1537,6 +1609,7 @@
         self.expr = expr
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.expr,
 
     def getChildNodes(self):
@@ -1554,6 +1627,7 @@
         self.expr = expr
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.expr,
 
     def getChildNodes(self):
@@ -1573,6 +1647,7 @@
         self.else_ = else_
 
     def getChildren(self):
+        "NOT_RPYTHON"
         children = []
         children.append(self.test)
         children.append(self.body)
@@ -1599,6 +1674,7 @@
         self.value = value
 
     def getChildren(self):
+        "NOT_RPYTHON"
         return self.value,
 
     def getChildNodes(self):
@@ -1616,7 +1692,7 @@
     method in replacement of the former visitor.visit = walker.dispatch
     It could also use to identify base type for visit arguments of AST nodes
     """
-    
+
     def default(self, node):
         for child in node.getChildNodes():
             child.accept(self)

Modified: pypy/dist/pypy/interpreter/astcompiler/ast.txt
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/ast.txt	(original)
+++ pypy/dist/pypy/interpreter/astcompiler/ast.txt	Mon Sep  5 18:40:34 2005
@@ -100,3 +100,30 @@
 
 init(GenExprFor):
     self.is_outmost = False
+
+flatten_nodes(Compare.ops):
+    # ops is a list of couples (op_name, node)
+    for op_name, node in self.ops:
+        nodelist.append(node)
+
+flatten_nodes(TryExcept.handlers):
+    # handlers is a list of triplets (expr1, expr2, body)
+    for expr1, expr2, body in self.handlers:
+        if expr1 is not None:
+            nodelist.append(expr1)
+        if expr2 is not None:
+            nodelist.append(expr2)
+        if body is not None:
+            nodelist.append(body)
+
+flatten_nodes(Dict.items):
+    # items is a list of couples (node (key), node (value))
+    for key, value in self.items:
+        nodelist.append(key)
+        nodelist.append(value)
+
+flatten_nodes(If.tests):
+    # tests is a list of couples (node (test), node (suite))
+    for test, suite in self.items:
+        nodelist.append(test)
+        nodelist.append(suite)

Modified: pypy/dist/pypy/interpreter/astcompiler/astgen.py
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/astgen.py	(original)
+++ pypy/dist/pypy/interpreter/astcompiler/astgen.py	Mon Sep  5 18:40:34 2005
@@ -50,6 +50,7 @@
         self.argprops = self.get_argprops()
         self.nargs = len(self.argnames)
         self.init = []
+        self.flatten_nodes = {}
         self.parent = parent
 
     def setup_parent(self, classes):
@@ -130,12 +131,15 @@
             print >> buf, "        Node.__init__(self, lineno)"
         if self.argnames:
             for name in self.argnames:
+                if name in self.flatten_nodes:
+                    print >>buf, "    %s" % self.flatten_nodes[name][0].rstrip()
                 print >> buf, "        self.%s = %s" % (name, name)
         if self.init:
             print >> buf, "".join(["    " + line for line in self.init])
 
     def _gen_getChildren(self, buf):
         print >> buf, "    def getChildren(self):"
+        print >> buf, '        "NOT_RPYTHON"'        
         if len(self.argnames) == 0:
             print >> buf, "        return []"
         else:
@@ -184,8 +188,15 @@
                                "            nodelist.append(self.%s)")
                         print >> buf, tmp % (name, name)
                     elif self.argprops[name] == P_NESTED:
-                        print >> buf, template % ("extend", "flatten_nodes(",
-                                                  name, ")")
+                        if name not in self.flatten_nodes:
+                            print >> buf, template % ("extend", "",
+                                                      name, "")
+                        else:
+                            flat_logic = self.flatten_nodes[name]
+                            while not flat_logic[-1].strip():
+                                flat_logic.pop()
+                            flat_logic[-1] = flat_logic[-1].rstrip()
+                            print >> buf, "".join(["    " + line for line in flat_logic])
                     elif self.argprops[name] == P_NODE:
                         print >> buf, template % ("append", "", name, "")
                 print >> buf, "        return nodelist"
@@ -214,16 +225,27 @@
         print >> buf, "        return self.default( node )"
 
 rx_init = re.compile('init\((.*)\):')
+rx_flatten_nodes = re.compile('flatten_nodes\((.*)\.(.*)\):')
 
 def parse_spec(file):
     classes = {}
     cur = None
+    kind = None
     for line in fileinput.input(file):
-        if line.strip().startswith('#'):
-            continue
-        mo = rx_init.search(line)
+        mo = None
+        comment = line.strip().startswith('#')
+        if not comment:
+            mo = rx_init.search(line)
+            if mo:
+                kind = 'init'
+            else:
+                mo = rx_flatten_nodes.search(line)
+                if mo:
+                    kind = 'flatten_nodes'
         if mo is None:
             if cur is None:
+                if comment:
+                    continue
                 # a normal entry
                 try:
                     name, args = line.split(':')
@@ -236,13 +258,22 @@
                     parent = None
                 classes[name] = NodeInfo(name, args, parent)
                 cur = None
-            else:
+            elif kind == 'init':
                 # some code for the __init__ method
                 cur.init.append(line)
-        else:
+            elif kind == 'flatten_nodes':
+                cur.flatten_nodes['_cur_'].append(line)
+        elif kind == 'init':
             # some extra code for a Node's __init__ method
             name = mo.group(1)
             cur = classes[name]
+        elif kind == 'flatten_nodes':
+            # special case for getChildNodes flattening
+            name = mo.group(1)
+            attr = mo.group(2)
+            cur = classes[name]
+            cur.flatten_nodes[attr] = cur.flatten_nodes['_cur_'] = []
+            
     for node in classes.values():
         node.setup_parent(classes)
     return sorted(classes.values(), key=lambda n: n.name)
@@ -300,8 +331,8 @@
             l.append(elt)
     return l
 
-def flatten_nodes(list):
-    return [n for n in flatten(list) if isinstance(n, Node)]
+#def flatten_nodes(list):
+#    return [n for n in flatten(list) if isinstance(n, Node)]
 
 nodes = {}
 

Modified: pypy/dist/pypy/interpreter/pyparser/test/test_astbuilder.py
==============================================================================
--- pypy/dist/pypy/interpreter/pyparser/test/test_astbuilder.py	(original)
+++ pypy/dist/pypy/interpreter/pyparser/test/test_astbuilder.py	Mon Sep  5 18:40:34 2005
@@ -32,10 +32,10 @@
 
 
 def nodes_equal(left, right):
-    if type(left)!=type(right):
-        return False
     if not isinstance(left,stable_ast.Node) or not isinstance(right,ast_ast.Node):
         return left==right
+    if left.__class__.__name__ != right.__class__.__name__:
+        return False    
     if isinstance(left,stable_ast.Function) and isinstance(right,ast_ast.Function):
         left_nodes = list(left.getChildren())
         right_nodes = list(right.getChildren())



More information about the Pypy-commit mailing list