return result
return generate_code
- def create_default_pipeline(context, options):
+ def create_default_pipeline(context, options, result):
from ParseTreeTransforms import WithTransform, PostParse
- from ParseTreeTransforms import AnalyseDeclarationsTransform, AnalyseExpressionsTransform, MarkClosureVisitor
+ from ParseTreeTransforms import AnalyseDeclarationsTransform, AnalyseExpressionsTransform
- from ParseTreeTransforms import CreateClosureClasses
++ from ParseTreeTransforms import CreateClosureClasses, MarkClosureVisitor
from ModuleNode import check_c_classes
return [
self.visitchildren(node)
return node
+class MarkClosureVisitor(VisitorTransform):
+
+ needs_closure = False
+
+ def visit_FuncDefNode(self, node):
+ self.needs_closure = False
+ self.visitchildren(node)
+ node.needs_closure = self.needs_closure
+ self.needs_closure = True
+ return node
+
+ def visit_ClassDefNode(self, node):
+ self.visitchildren(node)
+ self.needs_closure = True
+ return node
+
+ def visit_YieldNode(self, node):
+ self.needs_closure = True
+
+ def visit_Node(self, node):
+ self.visitchildren(node)
+ return node
+
+
+ class CreateClosureClasses(VisitorTransform):
+ # Output closure classes in module scope for all functions
+ # that need it.
+
+ def visit_ModuleNode(self, node):
+ self.module_scope = node.scope
+ self.visitchildren(node)
+ return node
+
+ def create_class_from_scope(self, node, target_module_scope):
+ as_name = temp_name_handle("closure")
+ func_scope = node.local_scope
+
+ entry = target_module_scope.declare_c_class(name = as_name,
+ pos = node.pos, defining = True, implementing = True)
+ class_scope = entry.type.scope
+ for entry in func_scope.entries.values():
+ class_scope.declare_var(pos=node.pos,
+ name=entry.name,
+ cname=entry.cname,
+ type=entry.type,
+ is_cdef=True)
+
+ def visit_FuncDefNode(self, node):
+ self.create_class_from_scope(node, self.module_scope)
+ return node
+
+ def visit_Node(self, node):
+ self.visitchildren(node)
+ return node
+