mirror of
https://github.com/python/cpython.git
synced 2025-08-22 17:55:18 +00:00
Issue #18408: PyEval_EvalFrameEx() and PyEval_CallObjectWithKeywords() now fail
with an assertion error if they are called with an exception set (PyErr_Occurred()). If these functions are called with an exception set, the exception may be cleared and so the caller looses its exception. Add also assertions to PyEval_CallObjectWithKeywords() and call_function() to check if the function succeed with no exception set, or the function failed with an exception set.
This commit is contained in:
parent
e9af4cface
commit
ace47d7efd
3 changed files with 42 additions and 0 deletions
|
@ -71,6 +71,11 @@ PyErr_SetObject(PyObject *exception, PyObject *value)
|
|||
if (value == NULL || !PyExceptionInstance_Check(value)) {
|
||||
/* We must normalize the value right now */
|
||||
PyObject *args, *fixed_value;
|
||||
#ifdef Py_DEBUG
|
||||
/* in debug mode, PyEval_EvalFrameEx() fails with an assertion
|
||||
error if an exception is set when it is called */
|
||||
PyErr_Clear();
|
||||
#endif
|
||||
if (value == NULL || value == Py_None)
|
||||
args = PyTuple_New(0);
|
||||
else if (PyTuple_Check(value)) {
|
||||
|
@ -707,6 +712,12 @@ PyErr_Format(PyObject *exception, const char *format, ...)
|
|||
va_start(vargs);
|
||||
#endif
|
||||
|
||||
#ifdef Py_DEBUG
|
||||
/* in debug mode, PyEval_EvalFrameEx() fails with an assertion error
|
||||
if an exception is set when it is called */
|
||||
PyErr_Clear();
|
||||
#endif
|
||||
|
||||
string = PyUnicode_FromFormatV(format, vargs);
|
||||
PyErr_SetObject(exception, string);
|
||||
Py_XDECREF(string);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue