Skip to content

Commit 9ca2700

Browse files
Use _PyImport_RunModInitFunc() in create_builtin().
1 parent a1d1258 commit 9ca2700

File tree

3 files changed

+50
-15
lines changed

3 files changed

+50
-15
lines changed

Include/internal/pycore_importdl.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ extern int _Py_ext_module_loader_info_init(
3636
struct _Py_ext_module_loader_info *info,
3737
PyObject *name,
3838
PyObject *filename);
39+
extern int _Py_ext_module_loader_info_init_for_builtin(
40+
struct _Py_ext_module_loader_info *p_info,
41+
PyObject *name);
3942
extern int _Py_ext_module_loader_info_init_from_spec(
4043
struct _Py_ext_module_loader_info *info,
4144
PyObject *spec);

Python/import.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1472,7 +1472,7 @@ create_builtin(PyThreadState *tstate, PyObject *name, PyObject *spec)
14721472
PyModuleDef *def = NULL;
14731473

14741474
struct _Py_ext_module_loader_info info;
1475-
if (_Py_ext_module_loader_info_init(&info, name, NULL) < 0) {
1475+
if (_Py_ext_module_loader_info_init_for_builtin(&info, name) < 0) {
14761476
return NULL;
14771477
}
14781478

@@ -1506,26 +1506,24 @@ create_builtin(PyThreadState *tstate, PyObject *name, PyObject *spec)
15061506
goto finally;
15071507
}
15081508

1509-
mod = p0();
1510-
if (mod == NULL) {
1509+
struct _Py_ext_module_loader_result res;
1510+
if (_PyImport_RunModInitFunc(p0, &info, &res) < 0) {
15111511
goto finally;
15121512
}
15131513

1514-
if (PyObject_TypeCheck(mod, &PyModuleDef_Type)) {
1515-
def = (PyModuleDef*)mod;
1514+
mod = res.module;
1515+
res.module = NULL;
1516+
def = res.def;
1517+
assert(def != NULL);
1518+
1519+
if (mod == NULL) {
15161520
assert(!is_singlephase(def));
15171521
mod = PyModule_FromDefAndSpec(def, spec);
15181522
if (mod == NULL) {
15191523
goto finally;
15201524
}
15211525
}
15221526
else {
1523-
assert(PyModule_Check(mod));
1524-
def = PyModule_GetDef(mod);
1525-
if (def == NULL) {
1526-
Py_CLEAR(mod);
1527-
goto finally;
1528-
}
15291527
assert(is_singlephase(def));
15301528

15311529
/* Remember pointer to module init function. */
@@ -1540,12 +1538,14 @@ create_builtin(PyThreadState *tstate, PyObject *name, PyObject *spec)
15401538
singlephase.m_dict = PyModule_GetDict(mod);
15411539
assert(singlephase.m_dict != NULL);
15421540
}
1541+
15431542
if (update_global_state_for_extension(
15441543
tstate, info.name, info.path, def, &singlephase) < 0)
15451544
{
15461545
Py_CLEAR(mod);
15471546
goto finally;
15481547
}
1548+
15491549
PyObject *modules = get_modules_dict(tstate, true);
15501550
if (finish_singlephase_extension(
15511551
tstate, mod, def, info.name, modules) < 0)
@@ -3942,7 +3942,7 @@ _imp_create_dynamic_impl(PyObject *module, PyObject *spec, PyObject *file)
39423942
}
39433943

39443944
/* Remember pointer to module init function. */
3945-
res.def->m_base.m_init = p0;
3945+
def->m_base.m_init = p0;
39463946

39473947
/* Remember the filename as the __file__ attribute */
39483948
if (PyModule_AddObjectRef(mod, "__file__", info.filename) < 0) {

Python/importdl.c

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ _Py_ext_module_loader_info_init(struct _Py_ext_module_loader_info *p_info,
117117
_Py_ext_module_loader_info_clear(&info);
118118
return -1;
119119
}
120+
assert(PyUnicode_GetLength(name) > 0);
120121
info.name = Py_NewRef(name);
121122

122123
info.name_encoded = get_encoded_name(info.name, &info.hook_prefix);
@@ -158,6 +159,31 @@ _Py_ext_module_loader_info_init(struct _Py_ext_module_loader_info *p_info,
158159
return 0;
159160
}
160161

162+
int
163+
_Py_ext_module_loader_info_init_for_builtin(
164+
struct _Py_ext_module_loader_info *info,
165+
PyObject *name)
166+
{
167+
assert(PyUnicode_Check(name));
168+
assert(PyUnicode_FindChar(name, '.', 0, PyUnicode_GetLength(name), -1) == -1);
169+
assert(PyUnicode_GetLength(name) > 0);
170+
171+
PyObject *name_encoded = PyUnicode_AsEncodedString(name, "ascii", NULL);
172+
if (name_encoded == NULL) {
173+
return -1;
174+
}
175+
176+
*info = (struct _Py_ext_module_loader_info){
177+
.name=Py_NewRef(name),
178+
.name_encoded=name_encoded,
179+
/* We won't need filename. */
180+
.path=name,
181+
.hook_prefix=ascii_only_prefix,
182+
.newcontext=NULL,
183+
};
184+
return 0;
185+
}
186+
161187
int
162188
_Py_ext_module_loader_info_init_from_spec(
163189
struct _Py_ext_module_loader_info *p_info,
@@ -280,14 +306,20 @@ _PyImport_RunModInitFunc(PyModInitFunction p0,
280306
/* single-phase init (legacy) */
281307
res.module = m;
282308

283-
res.def = PyModule_GetDef(m);
284-
if (res.def == NULL) {
285-
PyErr_Clear();
309+
if (!PyModule_Check(m)) {
286310
PyErr_Format(PyExc_SystemError,
287311
"initialization of %s did not return an extension "
288312
"module", name_buf);
289313
goto error;
290314
}
315+
316+
res.def = _PyModule_GetDef(m);
317+
if (res.def == NULL) {
318+
PyErr_Format(PyExc_SystemError,
319+
"initialization of %s did not return a valid extension "
320+
"module", name_buf);
321+
goto error;
322+
}
291323
}
292324

293325
assert(!PyErr_Occurred());

0 commit comments

Comments
 (0)