From 6f52a14a7d4dcc357930e43be724deffdb1ab353 Mon Sep 17 00:00:00 2001 From: Lisandro Dalcin Date: Sat, 21 Feb 2009 18:30:54 -0300 Subject: [PATCH] do not use refnanny in module cleanup function --- Cython/Compiler/Code.py | 4 ++++ Cython/Compiler/ModuleNode.py | 30 +++++++++++++++++++----------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/Cython/Compiler/Code.py b/Cython/Compiler/Code.py index f30110e8..356736dc 100644 --- a/Cython/Compiler/Code.py +++ b/Cython/Compiler/Code.py @@ -772,6 +772,10 @@ class CCodeWriter(object): if entry.type.is_pyobject: self.putln("__Pyx_GIVEREF(%s);" % self.entry_as_pyobject(entry)) + def put_var_xgotref(self, entry): + if entry.type.is_pyobject: + self.putln("__Pyx_XGOTREF(%s);" % self.entry_as_pyobject(entry)) + def put_var_xgiveref(self, entry): if entry.type.is_pyobject: self.putln("__Pyx_XGIVEREF(%s);" % self.entry_as_pyobject(entry)) diff --git a/Cython/Compiler/ModuleNode.py b/Cython/Compiler/ModuleNode.py index c6632d65..f37e1884 100644 --- a/Cython/Compiler/ModuleNode.py +++ b/Cython/Compiler/ModuleNode.py @@ -1640,6 +1640,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): if Options.generate_cleanup_code: # this should be replaced by the module's tp_clear in Py3 + env.use_utility_code(import_module_utility_code) code.putln("if (__Pyx_RegisterCleanup()) %s;" % code.error_goto(self.pos)) code.putln("%s = %s;" % (Naming.retval_cname, env.module_cname)) @@ -1670,7 +1671,6 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): def generate_module_cleanup_func(self, env, code): if not Options.generate_cleanup_code: return - env.use_utility_code(import_module_utility_code) env.use_utility_code(register_cleanup_utility_code) # Insert code stream of __Pyx_CleanupGlobals() code.globalstate.insert_cleanupcode_into(code) @@ -1683,25 +1683,33 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): for entry in rev_entries: if entry.visibility != 'extern': if entry.type.is_pyobject and entry.used: - code.put_var_decref_clear(entry) + code.putln("Py_DECREF(%s); %s = 0;" % ( + code.entry_as_pyobject(entry), entry.cname)) code.putln("__Pyx_CleanupGlobals();") if Options.generate_cleanup_code >= 3: code.putln("/*--- Type import cleanup code ---*/") for type, _ in env.types_imported.items(): - code.put_decref("((PyObject*)%s)" % type.typeptr_cname, PyrexTypes.py_object_type) + code.putln("Py_DECREF((PyObject *)%s); %s = 0;" % ( + type.typeptr_cname, type.typeptr_cname)) if Options.cache_builtins: code.putln("/*--- Builtin cleanup code ---*/") for entry in env.cached_builtins: - code.put_var_decref_clear(entry) - code.putln("Py_DECREF(%s); %s = 0;" % (Naming.empty_tuple, Naming.empty_tuple)); + code.put_decref_clear(entry.cname, + PyrexTypes.py_object_type, + nanny=False) code.putln("/*--- Intern cleanup code ---*/") + code.put_decref_clear(Naming.empty_tuple, + PyrexTypes.py_object_type, + nanny=False) for entry in env.pynum_entries: - code.put_var_decref_clear(entry) - if env.all_pystring_entries: - for entry in env.all_pystring_entries: - if entry.is_interned: - code.put_decref_clear( - entry.pystring_cname, PyrexTypes.py_object_type) + code.put_decref_clear(entry.cname, + PyrexTypes.py_object_type, + nanny=False) + for entry in env.all_pystring_entries: + if entry.is_interned: + code.put_decref_clear(entry.pystring_cname, + PyrexTypes.py_object_type, + nanny=False) code.putln("Py_INCREF(Py_None); return Py_None;") code.putln('}') -- 2.26.2