mirror of
https://github.com/python/cpython
synced 2026-09-29 12:10:30 +03:00
gh-117953: Share More Machinery Code Between Builtin and Dynamic Extensions (gh-118204)
This change will make some later changes simpler. It also brings more consistent behavior and lower maintenance costs.
This commit is contained in:
parent
7ccacb220d
commit
529a160be6
3 changed files with 198 additions and 157 deletions
|
|
@ -117,6 +117,7 @@ _Py_ext_module_loader_info_init(struct _Py_ext_module_loader_info *p_info,
|
|||
_Py_ext_module_loader_info_clear(&info);
|
||||
return -1;
|
||||
}
|
||||
assert(PyUnicode_GetLength(name) > 0);
|
||||
info.name = Py_NewRef(name);
|
||||
|
||||
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,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
_Py_ext_module_loader_info_init_for_builtin(
|
||||
struct _Py_ext_module_loader_info *info,
|
||||
PyObject *name)
|
||||
{
|
||||
assert(PyUnicode_Check(name));
|
||||
assert(PyUnicode_FindChar(name, '.', 0, PyUnicode_GetLength(name), -1) == -1);
|
||||
assert(PyUnicode_GetLength(name) > 0);
|
||||
|
||||
PyObject *name_encoded = PyUnicode_AsEncodedString(name, "ascii", NULL);
|
||||
if (name_encoded == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
*info = (struct _Py_ext_module_loader_info){
|
||||
.name=Py_NewRef(name),
|
||||
.name_encoded=name_encoded,
|
||||
/* We won't need filename. */
|
||||
.path=name,
|
||||
.hook_prefix=ascii_only_prefix,
|
||||
.newcontext=NULL,
|
||||
};
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
_Py_ext_module_loader_info_init_from_spec(
|
||||
struct _Py_ext_module_loader_info *p_info,
|
||||
|
|
@ -284,14 +310,20 @@ _PyImport_RunModInitFunc(PyModInitFunction p0,
|
|||
/* single-phase init (legacy) */
|
||||
res.module = m;
|
||||
|
||||
res.def = PyModule_GetDef(m);
|
||||
if (res.def == NULL) {
|
||||
PyErr_Clear();
|
||||
if (!PyModule_Check(m)) {
|
||||
PyErr_Format(PyExc_SystemError,
|
||||
"initialization of %s did not return an extension "
|
||||
"module", name_buf);
|
||||
goto error;
|
||||
}
|
||||
|
||||
res.def = _PyModule_GetDef(m);
|
||||
if (res.def == NULL) {
|
||||
PyErr_Format(PyExc_SystemError,
|
||||
"initialization of %s did not return a valid extension "
|
||||
"module", name_buf);
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
assert(!PyErr_Occurred());
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue