Mercurial > cpython-lru_cache-weakref
diff Python/errors.c @ 84704:48a869a39e2d
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.
| author | Victor Stinner <victor.stinner@gmail.com> |
|---|---|
| date | Thu, 18 Jul 2013 01:41:08 +0200 |
| parents | 573f7d485ce8 |
| children | 9b77b3ee6fb8 |
line wrap: on
line diff
--- a/Python/errors.c Thu Jul 18 01:42:04 2013 +0200 +++ b/Python/errors.c Thu Jul 18 01:41:08 2013 +0200 @@ -71,6 +71,11 @@ 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 @@ 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);
