Issue #25698: Importing module if the stack is too deep no longer replaces
imported module with the empty one.
diff --git a/Python/import.c b/Python/import.c
index e47ce63..96f7d47 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -632,27 +632,45 @@
Because the former action is most common, THIS DOES NOT RETURN A
'NEW' REFERENCE! */
-PyObject *
-PyImport_AddModule(const char *name)
+static PyObject *
+_PyImport_AddModuleObject(PyObject *name)
{
PyObject *modules = PyImport_GetModuleDict();
PyObject *m;
- if ((m = PyDict_GetItemString(modules, name)) != NULL &&
- PyModule_Check(m))
+ if ((m = _PyDict_GetItemWithError(modules, name)) != NULL &&
+ PyModule_Check(m)) {
return m;
- m = PyModule_New(name);
- if (m == NULL)
+ }
+ if (PyErr_Occurred()) {
return NULL;
- if (PyDict_SetItemString(modules, name, m) != 0) {
+ }
+ m = PyModule_New(PyString_AS_STRING(name));
+ if (m == NULL) {
+ return NULL;
+ }
+ if (PyDict_SetItem(modules, name, m) != 0) {
Py_DECREF(m);
return NULL;
}
+ assert(Py_REFCNT(m) > 1);
Py_DECREF(m); /* Yes, it still exists, in modules! */
return m;
}
+PyObject *
+PyImport_AddModule(const char *name)
+{
+ PyObject *nameobj, *module;
+ nameobj = PyString_FromString(name);
+ if (nameobj == NULL)
+ return NULL;
+ module = _PyImport_AddModuleObject(nameobj);
+ Py_DECREF(nameobj);
+ return module;
+}
+
/* Remove name from sys.modules, if it's there. */
static void
remove_module(const char *name)