Commit e24f88f8 authored by Stefan Behnel's avatar Stefan Behnel

merge

parents f36dbda7 6f52a14a
...@@ -772,6 +772,10 @@ class CCodeWriter(object): ...@@ -772,6 +772,10 @@ class CCodeWriter(object):
if entry.type.is_pyobject: if entry.type.is_pyobject:
self.putln("__Pyx_GIVEREF(%s);" % self.entry_as_pyobject(entry)) 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): def put_var_xgiveref(self, entry):
if entry.type.is_pyobject: if entry.type.is_pyobject:
self.putln("__Pyx_XGIVEREF(%s);" % self.entry_as_pyobject(entry)) self.putln("__Pyx_XGIVEREF(%s);" % self.entry_as_pyobject(entry))
......
...@@ -1640,6 +1640,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): ...@@ -1640,6 +1640,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
if Options.generate_cleanup_code: if Options.generate_cleanup_code:
# this should be replaced by the module's tp_clear in Py3 # 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("if (__Pyx_RegisterCleanup()) %s;" % code.error_goto(self.pos))
code.putln("%s = %s;" % (Naming.retval_cname, env.module_cname)) code.putln("%s = %s;" % (Naming.retval_cname, env.module_cname))
...@@ -1670,7 +1671,6 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): ...@@ -1670,7 +1671,6 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
def generate_module_cleanup_func(self, env, code): def generate_module_cleanup_func(self, env, code):
if not Options.generate_cleanup_code: if not Options.generate_cleanup_code:
return return
env.use_utility_code(import_module_utility_code)
env.use_utility_code(register_cleanup_utility_code) env.use_utility_code(register_cleanup_utility_code)
# Insert code stream of __Pyx_CleanupGlobals() # Insert code stream of __Pyx_CleanupGlobals()
code.globalstate.insert_cleanupcode_into(code) code.globalstate.insert_cleanupcode_into(code)
...@@ -1683,25 +1683,33 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): ...@@ -1683,25 +1683,33 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
for entry in rev_entries: for entry in rev_entries:
if entry.visibility != 'extern': if entry.visibility != 'extern':
if entry.type.is_pyobject and entry.used: 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();") code.putln("__Pyx_CleanupGlobals();")
if Options.generate_cleanup_code >= 3: if Options.generate_cleanup_code >= 3:
code.putln("/*--- Type import cleanup code ---*/") code.putln("/*--- Type import cleanup code ---*/")
for type, _ in env.types_imported.items(): 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: if Options.cache_builtins:
code.putln("/*--- Builtin cleanup code ---*/") code.putln("/*--- Builtin cleanup code ---*/")
for entry in env.cached_builtins: for entry in env.cached_builtins:
code.put_var_decref_clear(entry) code.put_decref_clear(entry.cname,
code.putln("Py_DECREF(%s); %s = 0;" % (Naming.empty_tuple, Naming.empty_tuple)); PyrexTypes.py_object_type,
nanny=False)
code.putln("/*--- Intern cleanup code ---*/") code.putln("/*--- Intern cleanup code ---*/")
code.put_decref_clear(Naming.empty_tuple,
PyrexTypes.py_object_type,
nanny=False)
for entry in env.pynum_entries: for entry in env.pynum_entries:
code.put_var_decref_clear(entry) code.put_decref_clear(entry.cname,
if env.all_pystring_entries: PyrexTypes.py_object_type,
nanny=False)
for entry in env.all_pystring_entries: for entry in env.all_pystring_entries:
if entry.is_interned: if entry.is_interned:
code.put_decref_clear( code.put_decref_clear(entry.pystring_cname,
entry.pystring_cname, PyrexTypes.py_object_type) PyrexTypes.py_object_type,
nanny=False)
code.putln("Py_INCREF(Py_None); return Py_None;") code.putln("Py_INCREF(Py_None); return Py_None;")
code.putln('}') code.putln('}')
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment