From 566fc5c0f8da48b3bc6d1277173b7c958e589a45 Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Mon, 4 Mar 2019 15:55:47 +0100 Subject: 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. --- Cython/Compiler/ModuleNode.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'Cython/Compiler/ModuleNode.py') 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 * -- cgit v1.2.1