__import__ is loaded at reification time

This commit is contained in:
Dino Viehland 2025-10-08 13:33:16 -07:00
parent c5efb20d48
commit 0c246bc79d
4 changed files with 26 additions and 38 deletions

View file

@ -3766,9 +3766,13 @@ _PyImport_LoadLazyImportTstate(PyThreadState *tstate, PyObject *lazy_import)
PyObject *globals = PyEval_GetGlobals();
PyObject *import_func;
if (PyMapping_GetOptionalItem(lz->lz_builtins, &_Py_ID(__import__), &import_func) < 0) {
return NULL;
}
if (full) {
obj = _PyEval_ImportNameWithImport(tstate,
lz->lz_import_func,
import_func,
globals,
globals,
lz->lz_from,
@ -3777,10 +3781,11 @@ _PyImport_LoadLazyImportTstate(PyThreadState *tstate, PyObject *lazy_import)
} else {
PyObject *name = PyUnicode_Substring(lz->lz_from, 0, dot);
if (name == NULL) {
Py_DECREF(import_func);
goto error;
}
obj = _PyEval_ImportNameWithImport(tstate,
lz->lz_import_func,
import_func,
globals,
globals,
name,
@ -3788,7 +3793,7 @@ _PyImport_LoadLazyImportTstate(PyThreadState *tstate, PyObject *lazy_import)
_PyLong_GetZero());
Py_DECREF(name);
}
Py_DECREF(import_func);
if (obj == NULL) {
goto error;
}
@ -4113,7 +4118,7 @@ get_mod_dict(PyObject *module)
}
static int
register_lazy_on_parent(PyThreadState *tstate, PyObject *name, PyObject *import_func)
register_lazy_on_parent(PyThreadState *tstate, PyObject *name, PyObject *builtins)
{
int ret = -1;
PyObject *parent = NULL;
@ -4183,7 +4188,7 @@ register_lazy_on_parent(PyThreadState *tstate, PyObject *name, PyObject *import_
goto done;
}
if (PyDict_CheckExact(parent_dict) && !PyDict_Contains(parent_dict, child)) {
PyObject *lazy_module_attr = _PyLazyImport_New(import_func, parent, child);
PyObject *lazy_module_attr = _PyLazyImport_New(builtins, parent, child);
if (lazy_module_attr == NULL) {
goto done;
}
@ -4211,7 +4216,7 @@ register_lazy_on_parent(PyThreadState *tstate, PyObject *name, PyObject *import_
PyObject *
_PyImport_LazyImportModuleLevelObject(PyThreadState *tstate,
PyObject *name, PyObject *import_func,
PyObject *name, PyObject *builtins,
PyObject *globals, PyObject *locals,
PyObject *fromlist, int level)
{
@ -4253,8 +4258,8 @@ _PyImport_LazyImportModuleLevelObject(PyThreadState *tstate,
}
}
PyObject *res = _PyLazyImport_New(import_func, abs_name, fromlist);
if (register_lazy_on_parent(tstate, abs_name, import_func) < 0) {
PyObject *res = _PyLazyImport_New(builtins, abs_name, fromlist);
if (register_lazy_on_parent(tstate, abs_name, builtins) < 0) {
Py_DECREF(res);
res = NULL;
}
@ -5302,15 +5307,7 @@ _imp__set_lazy_attributes_impl(PyObject *module, PyObject *child_module,
continue;
}
PyObject *builtins = _PyEval_GetBuiltins(tstate);
PyObject *import_func;
if (PyMapping_GetOptionalItem(builtins, &_Py_ID(__import__), &import_func) < 0) {
goto error;
} else if (import_func == NULL) {
_PyErr_SetString(tstate, PyExc_ImportError, "__import__ not found");
goto error;
}
PyObject *lazy_module_attr = _PyLazyImport_New(import_func, name, attr_name);
PyObject *lazy_module_attr = _PyLazyImport_New(builtins, name, attr_name);
if (lazy_module_attr == NULL) {
goto error;
}