diff options
author | Victor Stinner <vstinner@python.org> | 2023-09-01 10:43:30 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-09-01 10:43:30 (GMT) |
commit | b936cf4fe084474970ea43dba24386f1b08e75ce (patch) | |
tree | 1e6d94b328a13412f523d6a05c065e4526b57512 /Python/initconfig.c | |
parent | 844f4c2e12a7c637d1de93dbbb0718be06553510 (diff) | |
download | cpython-b936cf4fe084474970ea43dba24386f1b08e75ce.zip cpython-b936cf4fe084474970ea43dba24386f1b08e75ce.tar.gz cpython-b936cf4fe084474970ea43dba24386f1b08e75ce.tar.bz2 |
gh-108634: PyInterpreterState_New() no longer calls Py_FatalError() (#108748)
pycore_create_interpreter() now returns a status, rather than
calling Py_FatalError().
* PyInterpreterState_New() now calls Py_ExitStatusException() instead
of calling Py_FatalError() directly.
* Replace Py_FatalError() with PyStatus in init_interpreter() and
_PyObject_InitState().
* _PyErr_SetFromPyStatus() now raises RuntimeError, instead of
ValueError. It can now call PyErr_NoMemory(), raise MemoryError,
if it detects _PyStatus_NO_MEMORY() error message.
Diffstat (limited to 'Python/initconfig.c')
-rw-r--r-- | Python/initconfig.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/Python/initconfig.c b/Python/initconfig.c index 3281b3c..f9c5c64 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -335,21 +335,34 @@ int PyStatus_IsExit(PyStatus status) int PyStatus_Exception(PyStatus status) { return _PyStatus_EXCEPTION(status); } -PyObject* +void _PyErr_SetFromPyStatus(PyStatus status) { if (!_PyStatus_IS_ERROR(status)) { PyErr_Format(PyExc_SystemError, - "%s() expects an error PyStatus", - _PyStatus_GET_FUNC()); + "_PyErr_SetFromPyStatus() status is not an error"); + return; } - else if (status.func) { - PyErr_Format(PyExc_ValueError, "%s: %s", status.func, status.err_msg); + + const char *err_msg = status.err_msg; + if (err_msg == NULL || strlen(err_msg) == 0) { + PyErr_Format(PyExc_SystemError, + "_PyErr_SetFromPyStatus() status has no error message"); + return; + } + + if (strcmp(err_msg, _PyStatus_NO_MEMORY_ERRMSG) == 0) { + PyErr_NoMemory(); + return; + } + + const char *func = status.func; + if (func) { + PyErr_Format(PyExc_RuntimeError, "%s: %s", func, err_msg); } else { - PyErr_Format(PyExc_ValueError, "%s", status.err_msg); + PyErr_Format(PyExc_RuntimeError, "%s", err_msg); } - return NULL; } |