summaryrefslogtreecommitdiff
path: root/Cython/Compiler/ModuleNode.py
diff options
context:
space:
mode:
authorStefan Behnel <stefan_ml@behnel.de>2019-03-04 15:55:47 +0100
committerStefan Behnel <stefan_ml@behnel.de>2019-03-04 15:55:47 +0100
commit566fc5c0f8da48b3bc6d1277173b7c958e589a45 (patch)
treedc48679b9c19beb64e1f535065e0c788fe3cba6c /Cython/Compiler/ModuleNode.py
parent7941b93adee1b8f3be102cbbafac392a051fc904 (diff)
downloadcython-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.py16
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 *