From: Robert Bradshaw Date: Thu, 19 Jun 2008 23:54:55 +0000 (-0700) Subject: merge X-Git-Tag: 0.9.8.1~49^2~114 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=70abf0f1f4a0f5bc2757570104bf4871235d8965;p=cython.git merge --- 70abf0f1f4a0f5bc2757570104bf4871235d8965 diff --cc Cython/Compiler/Main.py index 7b8efb85,48194613..6c77e432 --- a/Cython/Compiler/Main.py +++ b/Cython/Compiler/Main.py @@@ -347,9 -333,10 +333,10 @@@ def create_generate_code(context, optio 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 [ diff --cc Cython/Compiler/ParseTreeTransforms.py index f20400d4,ffb79e71..ccffb974 --- a/Cython/Compiler/ParseTreeTransforms.py +++ b/Cython/Compiler/ParseTreeTransforms.py @@@ -185,26 -184,35 +184,58 @@@ class AnalyseExpressionsTransform(Visit 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 +