Skip to content

Commit 0c246bc

Browse files
committed
__import__ is loaded at reification time
1 parent c5efb20 commit 0c246bc

File tree

4 files changed

+26
-38
lines changed

4 files changed

+26
-38
lines changed

Include/internal/pycore_lazyimportobject.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ PyAPI_DATA(PyTypeObject) PyLazyImport_Type;
1313

1414
typedef struct {
1515
PyObject_HEAD
16-
PyObject *lz_import_func;
16+
PyObject *lz_builtins;
1717
PyObject *lz_from;
1818
PyObject *lz_attr;
1919
/* Frame information for the original import location */

Objects/lazyimportobject.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
#include "pycore_interpframe.h"
99

1010
PyObject *
11-
_PyLazyImport_New(PyObject *import_func, PyObject *from, PyObject *attr)
11+
_PyLazyImport_New(PyObject *builtins, PyObject *from, PyObject *attr)
1212
{
1313
PyLazyImportObject *m;
1414
if (!from || !PyUnicode_Check(from)) {
@@ -23,8 +23,8 @@ _PyLazyImport_New(PyObject *import_func, PyObject *from, PyObject *attr)
2323
if (m == NULL) {
2424
return NULL;
2525
}
26-
Py_XINCREF(import_func);
27-
m->lz_import_func = import_func;
26+
Py_XINCREF(builtins);
27+
m->lz_builtins = builtins;
2828
Py_INCREF(from);
2929
m->lz_from = from;
3030
Py_XINCREF(attr);
@@ -52,7 +52,7 @@ static void
5252
lazy_import_dealloc(PyLazyImportObject *m)
5353
{
5454
PyObject_GC_UnTrack(m);
55-
Py_XDECREF(m->lz_import_func);
55+
Py_XDECREF(m->lz_builtins);
5656
Py_XDECREF(m->lz_from);
5757
Py_XDECREF(m->lz_attr);
5858
Py_XDECREF(m->lz_code);
@@ -88,7 +88,7 @@ lazy_import_repr(PyLazyImportObject *m)
8888
static int
8989
lazy_import_traverse(PyLazyImportObject *m, visitproc visit, void *arg)
9090
{
91-
Py_VISIT(m->lz_import_func);
91+
Py_VISIT(m->lz_builtins);
9292
Py_VISIT(m->lz_from);
9393
Py_VISIT(m->lz_attr);
9494
Py_VISIT(m->lz_code);
@@ -98,7 +98,7 @@ lazy_import_traverse(PyLazyImportObject *m, visitproc visit, void *arg)
9898
static int
9999
lazy_import_clear(PyLazyImportObject *m)
100100
{
101-
Py_CLEAR(m->lz_import_func);
101+
Py_CLEAR(m->lz_builtins);
102102
Py_CLEAR(m->lz_from);
103103
Py_CLEAR(m->lz_attr);
104104
Py_CLEAR(m->lz_code);

Python/ceval.c

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3089,14 +3089,6 @@ _PyEval_LazyImportName(PyThreadState *tstate, PyObject *builtins, PyObject *glob
30893089
return _PyEval_ImportName(tstate, builtins, globals, locals, name, fromlist, level);
30903090
}
30913091

3092-
PyObject *import_func;
3093-
if (PyMapping_GetOptionalItem(builtins, &_Py_ID(__import__), &import_func) < 0) {
3094-
goto error;
3095-
} else if (import_func == NULL) {
3096-
_PyErr_SetString(tstate, PyExc_ImportError, "__import__ not found");
3097-
goto error;
3098-
}
3099-
31003092
PyObject *lazy_import_func;
31013093
if (PyMapping_GetOptionalItem(builtins, &_Py_ID(__lazy_import__), &lazy_import_func) < 0) {
31023094
goto error;
@@ -3116,16 +3108,15 @@ _PyEval_LazyImportName(PyThreadState *tstate, PyObject *builtins, PyObject *glob
31163108
}
31173109

31183110
res = _PyImport_LazyImportModuleLevelObject(
3119-
tstate, name, import_func, globals, locals, fromlist, ilevel
3111+
tstate, name, builtins, globals, locals, fromlist, ilevel
31203112
);
31213113
goto error;
31223114
}
31233115

3124-
PyObject* args[6] = {name, globals, locals, fromlist, level, import_func};
3116+
PyObject* args[6] = {name, globals, locals, fromlist, level, builtins};
31253117
res = PyObject_Vectorcall(lazy_import_func, args, 6, NULL);
31263118
error:
31273119
Py_XDECREF(lazy_import_func);
3128-
Py_XDECREF(import_func);
31293120
return res;
31303121
}
31313122

@@ -3323,20 +3314,20 @@ _PyEval_LazyImportFrom(PyThreadState *tstate, PyObject *v, PyObject *name)
33233314
if (d->lz_attr != NULL) {
33243315
if (PyUnicode_Check(d->lz_attr)) {
33253316
PyObject *from = PyUnicode_FromFormat("%U.%U", d->lz_from, d->lz_attr);
3326-
ret = _PyLazyImport_New(d->lz_import_func, from, name);
3317+
ret = _PyLazyImport_New(d->lz_builtins, from, name);
33273318
Py_DECREF(from);
33283319
return ret;
33293320
}
33303321
} else {
33313322
Py_ssize_t dot = PyUnicode_FindChar(d->lz_from, '.', 0, PyUnicode_GET_LENGTH(d->lz_from), 1);
33323323
if (dot >= 0) {
33333324
PyObject *from = PyUnicode_Substring(d->lz_from, 0, dot);
3334-
ret = _PyLazyImport_New(d->lz_import_func, from, name);
3325+
ret = _PyLazyImport_New(d->lz_builtins, from, name);
33353326
Py_DECREF(from);
33363327
return ret;
33373328
}
33383329
}
3339-
ret = _PyLazyImport_New(d->lz_import_func, d->lz_from, name);
3330+
ret = _PyLazyImport_New(d->lz_builtins, d->lz_from, name);
33403331
return ret;
33413332
}
33423333

Python/import.c

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3766,9 +3766,13 @@ _PyImport_LoadLazyImportTstate(PyThreadState *tstate, PyObject *lazy_import)
37663766

37673767
PyObject *globals = PyEval_GetGlobals();
37683768

3769+
PyObject *import_func;
3770+
if (PyMapping_GetOptionalItem(lz->lz_builtins, &_Py_ID(__import__), &import_func) < 0) {
3771+
return NULL;
3772+
}
37693773
if (full) {
37703774
obj = _PyEval_ImportNameWithImport(tstate,
3771-
lz->lz_import_func,
3775+
import_func,
37723776
globals,
37733777
globals,
37743778
lz->lz_from,
@@ -3777,18 +3781,19 @@ _PyImport_LoadLazyImportTstate(PyThreadState *tstate, PyObject *lazy_import)
37773781
} else {
37783782
PyObject *name = PyUnicode_Substring(lz->lz_from, 0, dot);
37793783
if (name == NULL) {
3784+
Py_DECREF(import_func);
37803785
goto error;
37813786
}
37823787
obj = _PyEval_ImportNameWithImport(tstate,
3783-
lz->lz_import_func,
3788+
import_func,
37843789
globals,
37853790
globals,
37863791
name,
37873792
fromlist,
37883793
_PyLong_GetZero());
37893794
Py_DECREF(name);
37903795
}
3791-
3796+
Py_DECREF(import_func);
37923797
if (obj == NULL) {
37933798
goto error;
37943799
}
@@ -4113,7 +4118,7 @@ get_mod_dict(PyObject *module)
41134118
}
41144119

41154120
static int
4116-
register_lazy_on_parent(PyThreadState *tstate, PyObject *name, PyObject *import_func)
4121+
register_lazy_on_parent(PyThreadState *tstate, PyObject *name, PyObject *builtins)
41174122
{
41184123
int ret = -1;
41194124
PyObject *parent = NULL;
@@ -4183,7 +4188,7 @@ register_lazy_on_parent(PyThreadState *tstate, PyObject *name, PyObject *import_
41834188
goto done;
41844189
}
41854190
if (PyDict_CheckExact(parent_dict) && !PyDict_Contains(parent_dict, child)) {
4186-
PyObject *lazy_module_attr = _PyLazyImport_New(import_func, parent, child);
4191+
PyObject *lazy_module_attr = _PyLazyImport_New(builtins, parent, child);
41874192
if (lazy_module_attr == NULL) {
41884193
goto done;
41894194
}
@@ -4211,7 +4216,7 @@ register_lazy_on_parent(PyThreadState *tstate, PyObject *name, PyObject *import_
42114216

42124217
PyObject *
42134218
_PyImport_LazyImportModuleLevelObject(PyThreadState *tstate,
4214-
PyObject *name, PyObject *import_func,
4219+
PyObject *name, PyObject *builtins,
42154220
PyObject *globals, PyObject *locals,
42164221
PyObject *fromlist, int level)
42174222
{
@@ -4253,8 +4258,8 @@ _PyImport_LazyImportModuleLevelObject(PyThreadState *tstate,
42534258
}
42544259
}
42554260

4256-
PyObject *res = _PyLazyImport_New(import_func, abs_name, fromlist);
4257-
if (register_lazy_on_parent(tstate, abs_name, import_func) < 0) {
4261+
PyObject *res = _PyLazyImport_New(builtins, abs_name, fromlist);
4262+
if (register_lazy_on_parent(tstate, abs_name, builtins) < 0) {
42584263
Py_DECREF(res);
42594264
res = NULL;
42604265
}
@@ -5302,15 +5307,7 @@ _imp__set_lazy_attributes_impl(PyObject *module, PyObject *child_module,
53025307
continue;
53035308
}
53045309
PyObject *builtins = _PyEval_GetBuiltins(tstate);
5305-
PyObject *import_func;
5306-
if (PyMapping_GetOptionalItem(builtins, &_Py_ID(__import__), &import_func) < 0) {
5307-
goto error;
5308-
} else if (import_func == NULL) {
5309-
_PyErr_SetString(tstate, PyExc_ImportError, "__import__ not found");
5310-
goto error;
5311-
}
5312-
5313-
PyObject *lazy_module_attr = _PyLazyImport_New(import_func, name, attr_name);
5310+
PyObject *lazy_module_attr = _PyLazyImport_New(builtins, name, attr_name);
53145311
if (lazy_module_attr == NULL) {
53155312
goto error;
53165313
}

0 commit comments

Comments
 (0)