From c9db2725c83dfa49507db40b56f4cd7c9c07d7dc Mon Sep 17 00:00:00 2001 From: Robert Bradshaw Date: Thu, 4 Dec 2008 00:16:19 -0800 Subject: [PATCH] Avoid some trivial tree traversal to speed up compilation. --- Cython/Compiler/Optimize.py | 4 +- Cython/Compiler/ParseTreeTransforms.py | 60 +++++++++++++++++++++++--- 2 files changed, 58 insertions(+), 6 deletions(-) diff --git a/Cython/Compiler/Optimize.py b/Cython/Compiler/Optimize.py index 6dec163e..bddfc6d8 100644 --- a/Cython/Compiler/Optimize.py +++ b/Cython/Compiler/Optimize.py @@ -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. diff --git a/Cython/Compiler/ParseTreeTransforms.py b/Cython/Compiler/ParseTreeTransforms.py index b9e03d15..1387a604 100644 --- a/Cython/Compiler/ParseTreeTransforms.py +++ b/Cython/Compiler/ParseTreeTransforms.py @@ -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 -- 2.26.2