Commit aaa5c5f9 authored by Stefan Behnel's avatar Stefan Behnel

compile classes in Visitor.py into real extension classes

parent 6bb7b10d
...@@ -49,10 +49,7 @@ class IterationTransform(Visitor.VisitorTransform): ...@@ -49,10 +49,7 @@ class IterationTransform(Visitor.VisitorTransform):
PyDict_Next_entry = Symtab.Entry( PyDict_Next_entry = Symtab.Entry(
PyDict_Next_name, PyDict_Next_name, PyDict_Next_func_type) PyDict_Next_name, PyDict_Next_name, PyDict_Next_func_type)
def visit_Node(self, node): visit_Node = Visitor.VisitorTransform.recurse_to_children
# descend into statements (loops) and nodes (comprehensions)
self.visitchildren(node)
return node
def visit_ModuleNode(self, node): def visit_ModuleNode(self, node):
self.current_scope = node.scope self.current_scope = node.scope
...@@ -361,10 +358,7 @@ class SwitchTransform(Visitor.VisitorTransform): ...@@ -361,10 +358,7 @@ class SwitchTransform(Visitor.VisitorTransform):
cases = cases, cases = cases,
else_clause = node.else_clause) else_clause = node.else_clause)
visit_Node = Visitor.VisitorTransform.recurse_to_children
def visit_Node(self, node):
self.visitchildren(node)
return node
class FlattenInListTransform(Visitor.VisitorTransform, SkipDeclarations): class FlattenInListTransform(Visitor.VisitorTransform, SkipDeclarations):
...@@ -417,9 +411,7 @@ class FlattenInListTransform(Visitor.VisitorTransform, SkipDeclarations): ...@@ -417,9 +411,7 @@ class FlattenInListTransform(Visitor.VisitorTransform, SkipDeclarations):
condition = reduce(concat, conds) condition = reduce(concat, conds)
return UtilNodes.EvalWithTempExprNode(lhs, condition) return UtilNodes.EvalWithTempExprNode(lhs, condition)
def visit_Node(self, node): visit_Node = Visitor.VisitorTransform.recurse_to_children
self.visitchildren(node)
return node
class FlattenBuiltinTypeCreation(Visitor.VisitorTransform): class FlattenBuiltinTypeCreation(Visitor.VisitorTransform):
...@@ -534,9 +526,7 @@ class FlattenBuiltinTypeCreation(Visitor.VisitorTransform): ...@@ -534,9 +526,7 @@ class FlattenBuiltinTypeCreation(Visitor.VisitorTransform):
return node return node
return node.arg return node.arg
def visit_Node(self, node): visit_Node = Visitor.VisitorTransform.recurse_to_children
self.visitchildren(node)
return node
class ConstantFolding(Visitor.VisitorTransform, SkipDeclarations): class ConstantFolding(Visitor.VisitorTransform, SkipDeclarations):
...@@ -614,9 +604,7 @@ class ConstantFolding(Visitor.VisitorTransform, SkipDeclarations): ...@@ -614,9 +604,7 @@ class ConstantFolding(Visitor.VisitorTransform, SkipDeclarations):
self.current_scope = old_scope self.current_scope = old_scope
return node return node
def visit_Node(self, node): visit_Node = Visitor.VisitorTransform.recurse_to_children
self.visitchildren(node)
return node
class FinalOptimizePhase(Visitor.CythonTransform): class FinalOptimizePhase(Visitor.CythonTransform):
......
...@@ -21,9 +21,7 @@ class NameNodeCollector(TreeVisitor): ...@@ -21,9 +21,7 @@ class NameNodeCollector(TreeVisitor):
super(NameNodeCollector, self).__init__() super(NameNodeCollector, self).__init__()
self.name_nodes = [] self.name_nodes = []
def visit_Node(self, node): visit_Node = TreeVisitor.visitchildren
self.visitchildren(node)
return node
def visit_NameNode(self, node): def visit_NameNode(self, node):
self.name_nodes.append(node) self.name_nodes.append(node)
...@@ -422,10 +420,6 @@ class InterpretCompilerDirectives(CythonTransform, SkipDeclarations): ...@@ -422,10 +420,6 @@ class InterpretCompilerDirectives(CythonTransform, SkipDeclarations):
else: else:
node.cython_attribute = self.option_names.get(node.name) node.cython_attribute = self.option_names.get(node.name)
return node return node
def visit_Node(self, node):
self.visitchildren(node)
return node
def try_to_parse_option(self, node): def try_to_parse_option(self, node):
# If node is the contents of an option (in a with statement or # If node is the contents of an option (in a with statement or
...@@ -595,10 +589,7 @@ class ComprehensionTransform(VisitorTransform): ...@@ -595,10 +589,7 @@ class ComprehensionTransform(VisitorTransform):
self.visitchildren(node) self.visitchildren(node)
return node return node
def visit_Node(self, node): visit_Node = VisitorTransform.recurse_to_children
# descend into statements (loops) and nodes (comprehensions)
self.visitchildren(node)
return node
def visit_ComprehensionNode(self, node): def visit_ComprehensionNode(self, node):
if type(node.loop) not in (Nodes.ForInStatNode, if type(node.loop) not in (Nodes.ForInStatNode,
......
cdef class BasicVisitor:
cdef object dispatch_table
cpdef visit(self, obj)
cdef class TreeVisitor(BasicVisitor):
cdef public access_path
cpdef visitchild(self, child, parent, attrname, idx)
cdef class VisitorTransform(TreeVisitor):
cpdef visitchildren(self, parent, attrs=*)
cpdef recurse_to_children(self, node)
cdef class CythonTransform(VisitorTransform):
cdef public context
cdef public current_directives
...@@ -143,7 +143,8 @@ class VisitorTransform(TreeVisitor): ...@@ -143,7 +143,8 @@ class VisitorTransform(TreeVisitor):
are within a StatListNode or similar before doing this.) are within a StatListNode or similar before doing this.)
""" """
def visitchildren(self, parent, attrs=None): def visitchildren(self, parent, attrs=None):
result = super(VisitorTransform, self).visitchildren(parent, attrs) # result = super(VisitorTransform, self).visitchildren(parent, attrs)
result = TreeVisitor.visitchildren(self, parent, attrs)
for attr, newnode in result.iteritems(): for attr, newnode in result.iteritems():
if not isinstance(newnode, list): if not isinstance(newnode, list):
setattr(parent, attr, newnode) setattr(parent, attr, newnode)
...@@ -158,6 +159,10 @@ class VisitorTransform(TreeVisitor): ...@@ -158,6 +159,10 @@ class VisitorTransform(TreeVisitor):
newlist.append(x) newlist.append(x)
setattr(parent, attr, newlist) setattr(parent, attr, newlist)
return result return result
def recurse_to_children(self, node):
self.visitchildren(node)
return node
def __call__(self, root): def __call__(self, root):
return self.visit(root) return self.visit(root)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment