summaryrefslogtreecommitdiff
path: root/Cython/Compiler/ModuleNode.py
diff options
context:
space:
mode:
authorStefan Behnel <stefan_ml@behnel.de>2013-01-03 16:57:07 +0100
committerStefan Behnel <stefan_ml@behnel.de>2013-01-03 16:57:07 +0100
commit4c77de2bc3f5441ff94ba76994194b33bdf0c971 (patch)
tree804705b79007c63fecedc0cc70eb60debbe90749 /Cython/Compiler/ModuleNode.py
parentcc788b95993a83aa9241aee118fd824631adefe4 (diff)
downloadcython-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.py13
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,