diff options
Diffstat (limited to 'Python')
-rw-r--r-- | Python/errors.c | 25 | ||||
-rw-r--r-- | Python/import.c | 3 | ||||
-rw-r--r-- | Python/importlib.h | 4 |
3 files changed, 26 insertions, 6 deletions
diff --git a/Python/errors.c b/Python/errors.c index 1f955b5..89021aa 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -619,12 +619,25 @@ PyObject *PyErr_SetFromWindowsErrWithUnicodeFilename( #endif /* MS_WINDOWS */ PyObject * -PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path) +PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg, + PyObject *name, PyObject *path) { + int issubclass; PyObject *args, *kwargs, *error; - if (msg == NULL) + issubclass = PyObject_IsSubclass(exception, PyExc_ImportError); + if (issubclass < 0) { + return NULL; + } + else if (!issubclass) { + PyErr_SetString(PyExc_TypeError, "expected a subclass of ImportError"); + return NULL; + } + + if (msg == NULL) { + PyErr_SetString(PyExc_TypeError, "expected a message argument"); return NULL; + } args = PyTuple_New(1); if (args == NULL) @@ -649,7 +662,7 @@ PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path) PyDict_SetItemString(kwargs, "name", name); PyDict_SetItemString(kwargs, "path", path); - error = PyObject_Call(PyExc_ImportError, args, kwargs); + error = PyObject_Call(exception, args, kwargs); if (error != NULL) { PyErr_SetObject((PyObject *)Py_TYPE(error), error); Py_DECREF(error); @@ -661,6 +674,12 @@ PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path) return NULL; } +PyObject * +PyErr_SetImportError(PyObject *msg, PyObject *name, PyObject *path) +{ + return PyErr_SetImportErrorSubclass(PyExc_ImportError, msg, name, path); +} + void _PyErr_BadInternalCall(const char *filename, int lineno) { diff --git a/Python/import.c b/Python/import.c index 0bb46d2..fad54e6 100644 --- a/Python/import.c +++ b/Python/import.c @@ -1436,7 +1436,8 @@ PyImport_ImportModuleLevelObject(PyObject *name, PyObject *given_globals, PyObject *msg = PyUnicode_FromFormat("import of %R halted; " "None in sys.modules", abs_name); if (msg != NULL) { - PyErr_SetImportError(msg, abs_name, NULL); + PyErr_SetImportErrorSubclass(PyExc_ModuleNotFoundError, msg, + abs_name, NULL); Py_DECREF(msg); } mod = NULL; diff --git a/Python/importlib.h b/Python/importlib.h index 4067631..e2f60c9 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -3239,8 +3239,8 @@ const unsigned char _Py_M__importlib[] = { 0,114,64,1,0,0,114,59,1,0,0,114,96,0,0,0, 114,56,1,0,0,114,7,0,0,0,114,145,0,0,0,114, 69,1,0,0,244,11,0,0,0,95,103,99,100,95,105,109, - 112,111,114,116,114,97,0,0,0,114,46,0,0,0,114,156, - 0,0,0,114,98,0,0,0,40,5,0,0,0,114,66,0, + 112,111,114,116,114,97,0,0,0,114,46,0,0,0,114,66, + 1,0,0,114,98,0,0,0,40,5,0,0,0,114,66,0, 0,0,114,57,1,0,0,114,58,1,0,0,114,160,0,0, 0,114,139,0,0,0,114,4,0,0,0,114,4,0,0,0, 114,5,0,0,0,114,70,1,0,0,61,6,0,0,115,26, |