diff options
author | Stefan Behnel <stefan_ml@behnel.de> | 2013-01-03 16:57:07 +0100 |
---|---|---|
committer | Stefan Behnel <stefan_ml@behnel.de> | 2013-01-03 16:57:07 +0100 |
commit | 4c77de2bc3f5441ff94ba76994194b33bdf0c971 (patch) | |
tree | 804705b79007c63fecedc0cc70eb60debbe90749 /Cython/Compiler/ModuleNode.py | |
parent | cc788b95993a83aa9241aee118fd824631adefe4 (diff) | |
download | cython-4c77de2bc3f5441ff94ba76994194b33bdf0c971.tar.gz |
generate safer cleanup code that also works in the case something goes badly wrong early at module init time
--HG--
extra : rebase_source : 015495e6aee6c59b11ee9169d2ad597ff54bfd0c
Diffstat (limited to 'Cython/Compiler/ModuleNode.py')
-rw-r--r-- | Cython/Compiler/ModuleNode.py | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/Cython/Compiler/ModuleNode.py b/Cython/Compiler/ModuleNode.py index b4d8b2306..99b4b4fe9 100644 --- a/Cython/Compiler/ModuleNode.py +++ b/Cython/Compiler/ModuleNode.py @@ -2010,23 +2010,28 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): for entry in rev_entries: if entry.visibility != 'extern': if entry.type.is_pyobject and entry.used: - code.putln("Py_DECREF(%s); %s = 0;" % ( - code.entry_as_pyobject(entry), entry.cname)) + code.put_decref_clear(entry.cname, + entry.type, + clear_before_decref=True, + nanny=False) code.putln("__Pyx_CleanupGlobals();") if Options.generate_cleanup_code >= 3: code.putln("/*--- Type import cleanup code ---*/") for type, _ in env.types_imported.items(): - code.putln("Py_DECREF((PyObject *)%s); %s = 0;" % ( - type.typeptr_cname, type.typeptr_cname)) + code.put_decref_clear(type.typeptr_cname, type, + clear_before_decref=True, + nanny=False) if Options.cache_builtins: code.putln("/*--- Builtin cleanup code ---*/") for entry in env.cached_builtins: code.put_decref_clear(entry.cname, PyrexTypes.py_object_type, + clear_before_decref=True, nanny=False) code.putln("/*--- Intern cleanup code ---*/") code.put_decref_clear(Naming.empty_tuple, PyrexTypes.py_object_type, + clear_before_decref=True, nanny=False) # for entry in env.pynum_entries: # code.put_decref_clear(entry.cname, |