fix ref-counting for recursive closures:
authorStefan Behnel <scoder@users.berlios.de>
Sun, 3 May 2009 11:33:41 +0000 (13:33 +0200)
committerStefan Behnel <scoder@users.berlios.de>
Sun, 3 May 2009 11:33:41 +0000 (13:33 +0200)
outer scope ref is initialised exactly once on creation and decref-cleared only by scope cleanup (i.e. the inner closure owns the parent reference)

Cython/Compiler/Nodes.py

index e27e41d5d8e82144acd7c5f1639c3f1b0306cdff..c0310320a8bd7fa030dfea11ef38402f87b06b8a 100644 (file)
@@ -1073,8 +1073,10 @@ class FuncDefNode(StatNode, BlockNode):
                             outer_scope_cname,
                             env.scope_class.type.declaration_code(''),
                             Naming.self_cname))
-            code.put_incref(outer_scope_cname, env.scope_class.type)
-            code.put_giveref(outer_scope_cname)
+            if self.needs_closure:
+                # inner closures own a reference to their outer parent
+                code.put_incref(outer_scope_cname, env.scope_class.type)
+                code.put_giveref(outer_scope_cname)
         # ----- Fetch arguments
         self.generate_argument_parsing_code(env, code)
         # If an argument is assigned to in the body, we must