Refnanny: Fix for return from module init function
authorDag Sverre Seljebotn <dagss@student.matnat.uio.no>
Wed, 7 Jan 2009 14:05:35 +0000 (15:05 +0100)
committerDag Sverre Seljebotn <dagss@student.matnat.uio.no>
Wed, 7 Jan 2009 14:05:35 +0000 (15:05 +0100)
Cython/Compiler/ModuleNode.py
Cython/Compiler/Nodes.py

index 353ab7b62547be4264944721cf0fd00f785cd0fe..00b70e1f1e654f081c4470c36b859b148b016ddd 100644 (file)
@@ -1588,6 +1588,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
         code.putln(header3)
         code.putln("#endif")
         code.putln("{")
+        code.putln("PyObject* %s;" % Naming.retval_cname)
         tempdecl_code = code.insertion_point()
 
         code.putln('__Pyx_SetupRefcountContext("%s");' % header3)
@@ -1637,20 +1638,26 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
             # this should be replaced by the module's tp_clear in Py3
             code.putln("if (__Pyx_RegisterCleanup()) %s;" % code.error_goto(self.pos))
 
-        code.putln("#if PY_MAJOR_VERSION < 3")
-        code.putln("return;")
-        code.putln("#else")
-        code.putln("return %s;" % env.module_cname)
-        code.putln("#endif")
+        code.putln("%s = %s;" % (Naming.retval_cname, env.module_cname))
+        code.put_goto(code.return_label)
         code.put_label(code.error_label)
         code.put_var_xdecrefs(env.temp_entries)
         code.putln('__Pyx_AddTraceback("%s");' % env.qualified_name)
         env.use_utility_code(Nodes.traceback_utility_code)
-        code.putln("#if PY_MAJOR_VERSION >= 3")
-        code.putln("return NULL;")
+        code.putln("%s = NULL;" % Naming.retval_cname)
+        code.put_label(code.return_label)
+        code.putln('if (__Pyx_FinishRefcountContext() == -1) {')
+        code.putln(code.set_error_info(self.pos))
+        code.putln('__Pyx_AddTraceback("%s");' % env.qualified_name)
+        code.putln('%s = NULL;' % Naming.retval_cname)
+        code.putln('}')
+        code.putln("#if PY_MAJOR_VERSION < 3")
+        code.putln("return;")
+        code.putln("#else")
+        code.putln("return %s;" % Naming.retval_cname)
         code.putln("#endif")
         code.putln('}')
-        
+
         tempdecl_code.put_var_declarations(env.temp_entries)
         tempdecl_code.put_temp_declarations(code.funcstate)
 
index 7efc68374b2bcf34af13c5e3cc78659ef2b21b07..86f6841eb31c6dfdd5b3a52557ea2e4c9e1f6219 100644 (file)
@@ -1137,6 +1137,7 @@ class FuncDefNode(StatNode, BlockNode):
             code.putln("PyGILState_Release(_save);")
         # code.putln("/* TODO: decref scope object */")
         # ----- Return
+        # This code is duplicated in ModuleNode.generate_module_init_func
         default_retval = self.return_type.default_value
         err_val = self.error_value()
         if err_val is None and default_retval: