Avoid some trivial tree traversal to speed up compilation.
authorRobert Bradshaw <robertwb@math.washington.edu>
Thu, 4 Dec 2008 08:16:19 +0000 (00:16 -0800)
committerRobert Bradshaw <robertwb@math.washington.edu>
Thu, 4 Dec 2008 08:16:19 +0000 (00:16 -0800)
Cython/Compiler/Optimize.py
Cython/Compiler/ParseTreeTransforms.py

index 6dec163efa1577d98cca01959328b6c6bd70cccf..bddfc6d800b9646dcd3f7de8c00668ba5a10cd33 100644 (file)
@@ -8,6 +8,8 @@ import TypeSlots
 import Symtab
 from StringEncoding import EncodedString
 
+from ParseTreeTransforms import SkipDeclarations
+
 #def unwrap_node(node):
 #    while isinstance(node, ExprNodes.PersistentNode):
 #        node = node.arg
@@ -292,7 +294,7 @@ class SwitchTransform(Visitor.VisitorTransform):
         return node
                               
 
-class FlattenInListTransform(Visitor.VisitorTransform):
+class FlattenInListTransform(Visitor.VisitorTransform, SkipDeclarations):
     """
     This transformation flattens "x in [val1, ..., valn]" into a sequential list
     of comparisons. 
index b9e03d15a67689fbc73118e0c75fb34436f9d98d..1387a6049b70eba86a03c1ac82a8121c409dcbe0 100644 (file)
@@ -12,6 +12,33 @@ except NameError:
     from sets import Set as set
 import copy
 
+class SkipDeclarations:
+    """
+    Variable and function declarations can often have a deep tree structure, 
+    and yet most transformations don't need to descend to this depth. 
+    
+    Declaration nodes are removed after AnalyseDeclarationsTransform, so there 
+    is no need to use this for transformations after that point. 
+    """
+    def visit_CTypeDefNode(self, node):
+        return node
+    
+    def visit_CVarDefNode(self, node):
+        return node
+    
+    def visit_CDeclaratorNode(self, node):
+        return node
+    
+    def visit_CBaseTypeNode(self, node):
+        return node
+    
+    def visit_CEnumDefNode(self, node):
+        return node
+
+    def visit_CStructOrUnionDefNode(self, node):
+        return node
+
+
 class NormalizeTree(CythonTransform):
     """
     This transform fixes up a few things after parsing
@@ -77,6 +104,9 @@ class NormalizeTree(CythonTransform):
         else:
             return []
 
+    def visit_CDeclaratorNode(self, node):
+        return node    
+
 
 class PostParseError(CompileError): pass
 
@@ -202,7 +232,7 @@ class PostParse(CythonTransform):
             raise PostParseError(node.pos, ERR_BUF_LOCALONLY)
         return node
 
-class PxdPostParse(CythonTransform):
+class PxdPostParse(CythonTransform, SkipDeclarations):
     """
     Basic interpretation/validity checking that should only be
     done on pxd trees.
@@ -267,8 +297,8 @@ class PxdPostParse(CythonTransform):
             return None
         else:
             return node
-
-class InterpretCompilerDirectives(CythonTransform):
+    
+class InterpretCompilerDirectives(CythonTransform, SkipDeclarations):
     """
     After parsing, options can be stored in a number of places:
     - #cython-comments at the top of the file (stored in ModuleNode)
@@ -457,7 +487,7 @@ class InterpretCompilerDirectives(CythonTransform):
         else:
             return self.visit_Node(node)
 
-class WithTransform(CythonTransform):
+class WithTransform(CythonTransform, SkipDeclarations):
 
     # EXCINFO is manually set to a variable that contains
     # the exc_info() tuple that can be generated by the enclosing except
@@ -524,8 +554,13 @@ class WithTransform(CythonTransform):
             excinfo_temp.ref(node.pos))
 
         return TempsBlockNode(node.pos, temps=[excinfo_temp], body=result)
+        
+    def visit_ExprNode(self, node):
+        # With statements are never inside expressions.
+        return node
+        
 
-class DecoratorTransform(CythonTransform):
+class DecoratorTransform(CythonTransform, SkipDeclarations):
 
     def visit_DefNode(self, func_node):
         if not func_node.decorators:
@@ -587,6 +622,21 @@ property NAME:
     # analysis and can be dropped. The analysis was performed
     # on these nodes in a seperate recursive process from the
     # enclosing function or module, so we can simply drop them.
+    def visit_CDeclaratorNode(self, node):
+        return node
+    
+    def visit_CTypeDefNode(self, node):
+        return node
+
+    def visit_CBaseTypeNode(self, node):
+        return None
+    
+    def visit_CEnumDefNode(self, node):
+        return None
+
+    def visit_CStructOrUnionDefNode(self, node):
+        return None
+
     def visit_CVarDefNode(self, node):
         if node.need_properties:
             # cdef public attributes may need type testing on