Co-authored-by: Brett Cannon <brett@python.org>
Co-authored-by: Victor Stinner <vstinner@python.org>
def test_create_builtin(self):
class Spec:
def test_create_builtin(self):
class Spec:
+ spec.name = "sys"
+ self.assertIs(_imp.create_builtin(spec), sys)
+
+ spec.name = None
with self.assertRaisesRegex(TypeError, 'name must be string, not NoneType'):
_imp.create_builtin(spec)
with self.assertRaisesRegex(TypeError, 'name must be string, not NoneType'):
_imp.create_builtin(spec)
+ # gh-142029
+ spec.name = "nonexistent_lib"
+ with self.assertRaises(ModuleNotFoundError):
+ _imp.create_builtin(spec)
with self.assertRaisesRegex(ValueError, 'name must not be empty'):
_imp.create_builtin(spec)
with self.assertRaisesRegex(ValueError, 'name must not be empty'):
_imp.create_builtin(spec)
--- /dev/null
+Raise :exc:`ModuleNotFoundError` instead of crashing when a nonexistent module
+is used as a name in ``_imp.create_builtin()``.
-static PyModInitFunction
-lookup_inittab_initfunc(const struct _Py_ext_module_loader_info* info)
+static struct _inittab*
+lookup_inittab_entry(const struct _Py_ext_module_loader_info* info)
{
for (struct _inittab *p = INITTAB; p->name != NULL; p++) {
if (_PyUnicode_EqualToASCIIString(info->name, p->name)) {
{
for (struct _inittab *p = INITTAB; p->name != NULL; p++) {
if (_PyUnicode_EqualToASCIIString(info->name, p->name)) {
- return (PyModInitFunction)p->initfunc;
_extensions_cache_delete(info.path, info.name);
}
_extensions_cache_delete(info.path, info.name);
}
- PyModInitFunction p0 = initfunc;
- if (p0 == NULL) {
- p0 = lookup_inittab_initfunc(&info);
- if (p0 == NULL) {
- /* Cannot re-init internal module ("sys" or "builtins") */
- assert(is_core_module(tstate->interp, info.name, info.path));
- mod = import_add_module(tstate, info.name);
+ PyModInitFunction p0 = NULL;
+ if (initfunc == NULL) {
+ struct _inittab *entry = lookup_inittab_entry(&info);
+ if (entry == NULL) {
+ mod = NULL;
+ _PyErr_SetModuleNotFoundError(name);
+
+ p0 = (PyModInitFunction)entry->initfunc;
+ else {
+ p0 = initfunc;
+ }
+
+ if (p0 == NULL) {
+ /* Cannot re-init internal module ("sys" or "builtins") */
+ assert(is_core_module(tstate->interp, info.name, info.path));
+ mod = import_add_module(tstate, info.name);
+ goto finally;
+ }
+
#ifdef Py_GIL_DISABLED
// This call (and the corresponding call to _PyImport_CheckGILForModule())
#ifdef Py_GIL_DISABLED
// This call (and the corresponding call to _PyImport_CheckGILForModule())