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);