diff options
author | Stefan Behnel <stefan_ml@behnel.de> | 2019-03-04 15:55:47 +0100 |
---|---|---|
committer | Stefan Behnel <stefan_ml@behnel.de> | 2019-03-04 15:55:47 +0100 |
commit | 566fc5c0f8da48b3bc6d1277173b7c958e589a45 (patch) | |
tree | dc48679b9c19beb64e1f535065e0c788fe3cba6c /Cython/Compiler/ModuleNode.py | |
parent | 7941b93adee1b8f3be102cbbafac392a051fc904 (diff) | |
download | cython-566fc5c0f8da48b3bc6d1277173b7c958e589a45.tar.gz |
Keep owned references to builtins module, "cython_runtime" module and preimport module to prevent crashes when they get removed from sys.modules. Generate cleanup code for them in the end.
Closes #2885.
Diffstat (limited to 'Cython/Compiler/ModuleNode.py')
-rw-r--r-- | Cython/Compiler/ModuleNode.py | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/Cython/Compiler/ModuleNode.py b/Cython/Compiler/ModuleNode.py index a3bce639a..4d8c30c00 100644 --- a/Cython/Compiler/ModuleNode.py +++ b/Cython/Compiler/ModuleNode.py @@ -2704,11 +2704,11 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): # if entry.type.is_pyobject and entry.used: # code.putln("Py_DECREF(%s); %s = 0;" % ( # code.entry_as_pyobject(entry), entry.cname)) - code.putln('#if CYTHON_COMPILING_IN_PYPY') - code.putln('Py_CLEAR(%s);' % Naming.builtins_cname) - code.putln('#endif') - code.put_decref_clear(env.module_dict_cname, py_object_type, - nanny=False, clear_before_decref=True) + if Options.pre_import is not None: + code.put_decref_clear(Naming.preimport_cname, py_object_type, + nanny=False, clear_before_decref=True) + for cname in [Naming.cython_runtime_cname, env.module_dict_cname, Naming.builtins_cname]: + code.put_decref_clear(cname, py_object_type, nanny=False, clear_before_decref=True) def generate_main_method(self, env, code): module_is_main = "%s%s" % (Naming.module_is_main, self.full_module_name.replace('.', '__')) @@ -2815,13 +2815,12 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): '%s = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); %s' % ( Naming.builtins_cname, code.error_goto_if_null(Naming.builtins_cname, self.pos))) + code.put_incref(Naming.builtins_cname, py_object_type, nanny=False) code.putln( '%s = PyImport_AddModule((char *) "cython_runtime"); %s' % ( Naming.cython_runtime_cname, code.error_goto_if_null(Naming.cython_runtime_cname, self.pos))) - code.putln('#if CYTHON_COMPILING_IN_PYPY') - code.putln('Py_INCREF(%s);' % Naming.builtins_cname) - code.putln('#endif') + code.put_incref(Naming.cython_runtime_cname, py_object_type, nanny=False) code.putln( 'if (PyObject_SetAttrString(%s, "__builtins__", %s) < 0) %s;' % ( env.module_cname, @@ -2833,6 +2832,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): Naming.preimport_cname, Options.pre_import, code.error_goto_if_null(Naming.preimport_cname, self.pos))) + code.put_incref(Naming.preimport_cname, py_object_type, nanny=False) def generate_global_init_code(self, env, code): # Generate code to initialise global PyObject * |