diff options
author | Shantanu <12621235+hauntsaninja@users.noreply.github.com> | 2024-12-10 04:55:20 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-12-10 04:55:20 (GMT) |
commit | 3983527c3a6b389e373a233e514919555853ccb3 (patch) | |
tree | 7a9bbb49fc4b6e8b6996f25635db330978bde525 /Python | |
parent | 58c753827ac7aa3d7f1495ac206c28bf2f6c67e8 (diff) | |
download | cpython-3983527c3a6b389e373a233e514919555853ccb3.zip cpython-3983527c3a6b389e373a233e514919555853ccb3.tar.gz cpython-3983527c3a6b389e373a233e514919555853ccb3.tar.bz2 |
gh-127651: Use __file__ in diagnostics if origin is missing (#127660)
See the left hand side in https://github.com/python/cpython/pull/123929/files#diff-c22186367cbe20233e843261998dc027ae5f1f8c0d2e778abfa454ae74cc59deL2840-L2849
---------
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Diffstat (limited to 'Python')
-rw-r--r-- | Python/ceval.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/Python/ceval.c b/Python/ceval.c index 6795a16..5eda033 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2859,6 +2859,20 @@ _PyEval_ImportFrom(PyThreadState *tstate, PyObject *v, PyObject *name) } } + if (origin == NULL) { + // Fall back to __file__ for diagnostics if we don't have + // an origin that is a location + origin = PyModule_GetFilenameObject(v); + if (origin == NULL) { + if (!PyErr_ExceptionMatches(PyExc_SystemError)) { + goto done; + } + // PyModule_GetFilenameObject raised "module filename missing" + _PyErr_Clear(tstate); + } + assert(origin == NULL || PyUnicode_Check(origin)); + } + if (is_possibly_shadowing_stdlib) { assert(origin); errmsg = PyUnicode_FromFormat( @@ -2919,9 +2933,11 @@ _PyEval_ImportFrom(PyThreadState *tstate, PyObject *v, PyObject *name) } done_with_errmsg: - /* NULL checks for errmsg, mod_name, origin done by PyErr_SetImportError. */ - _PyErr_SetImportErrorWithNameFrom(errmsg, mod_name, origin, name); - Py_DECREF(errmsg); + if (errmsg != NULL) { + /* NULL checks for mod_name and origin done by _PyErr_SetImportErrorWithNameFrom */ + _PyErr_SetImportErrorWithNameFrom(errmsg, mod_name, origin, name); + Py_DECREF(errmsg); + } done: Py_XDECREF(origin); |