summaryrefslogtreecommitdiffstats
path: root/Python/import.c
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2023-06-20 06:48:14 (GMT)
committerGitHub <noreply@github.com>2023-06-20 06:48:14 (GMT)
commit03f1a132eeb34c738812161947ef171b21d58c25 (patch)
treeefb632b4c885e58425bfd563c92137ef60f7d72d /Python/import.c
parent7f97c8e367869e2aebe9f28bc5f8d4ce36448878 (diff)
downloadcpython-03f1a132eeb34c738812161947ef171b21d58c25.zip
cpython-03f1a132eeb34c738812161947ef171b21d58c25.tar.gz
cpython-03f1a132eeb34c738812161947ef171b21d58c25.tar.bz2
gh-105922: Add PyImport_AddModuleRef() function (#105923)
* Add tests on PyImport_AddModuleRef(), PyImport_AddModule() and PyImport_AddModuleObject(). * pythonrun.c: Replace Py_XNewRef(PyImport_AddModule(name)) with PyImport_AddModuleRef(name).
Diffstat (limited to 'Python/import.c')
-rw-r--r--Python/import.c39
1 files changed, 29 insertions, 10 deletions
diff --git a/Python/import.c b/Python/import.c
index 779af55..969902a 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -351,19 +351,37 @@ import_add_module(PyThreadState *tstate, PyObject *name)
}
PyObject *
+PyImport_AddModuleRef(const char *name)
+{
+ PyObject *name_obj = PyUnicode_FromString(name);
+ if (name_obj == NULL) {
+ return NULL;
+ }
+ PyThreadState *tstate = _PyThreadState_GET();
+ PyObject *module = import_add_module(tstate, name_obj);
+ Py_DECREF(name_obj);
+ return module;
+}
+
+
+PyObject *
PyImport_AddModuleObject(PyObject *name)
{
PyThreadState *tstate = _PyThreadState_GET();
PyObject *mod = import_add_module(tstate, name);
- if (mod) {
- PyObject *ref = PyWeakref_NewRef(mod, NULL);
- Py_DECREF(mod);
- if (ref == NULL) {
- return NULL;
- }
- mod = PyWeakref_GetObject(ref);
- Py_DECREF(ref);
+ if (!mod) {
+ return NULL;
}
+
+ // gh-86160: PyImport_AddModuleObject() returns a borrowed reference
+ PyObject *ref = PyWeakref_NewRef(mod, NULL);
+ Py_DECREF(mod);
+ if (ref == NULL) {
+ return NULL;
+ }
+
+ mod = PyWeakref_GetObject(ref);
+ Py_DECREF(ref);
return mod; /* borrowed reference */
}
@@ -2240,11 +2258,12 @@ init_importlib(PyThreadState *tstate, PyObject *sysmod)
if (PyImport_ImportFrozenModule("_frozen_importlib") <= 0) {
return -1;
}
- PyObject *importlib = PyImport_AddModule("_frozen_importlib"); // borrowed
+
+ PyObject *importlib = PyImport_AddModuleRef("_frozen_importlib");
if (importlib == NULL) {
return -1;
}
- IMPORTLIB(interp) = Py_NewRef(importlib);
+ IMPORTLIB(interp) = importlib;
// Import the _imp module
if (verbose) {