Browse Source

Issue #23571: In debug mode, _Py_CheckFunctionResult() now calls

Py_FatalError() instead of using an assertion in debug mode. Py_FatalError()
displays the current exception and the traceback which contain more information
than just the assertion error.
Victor Stinner 11 years ago
parent
commit
3b06dfb9d1
  1. 21
      Objects/abstract.c

21
Objects/abstract.c

@ -2080,16 +2080,6 @@ _Py_CheckFunctionResult(PyObject *func, PyObject *result, const char *where)
assert((func != NULL) ^ (where != NULL));
#ifndef NDEBUG
/* In debug mode: abort() with an assertion error. Use two different
assertions, so if an assertion fails, it's possible to know
if result was set or not and if an exception was raised or not. */
if (result != NULL)
assert(!err_occurred);
else
assert(err_occurred);
#endif
if (result == NULL) {
if (!err_occurred) {
if (func)
@ -2100,7 +2090,7 @@ _Py_CheckFunctionResult(PyObject *func, PyObject *result, const char *where)
PyErr_Format(PyExc_SystemError,
"%s returned NULL without setting an error",
where);
return NULL;
goto error;
}
}
else {
@ -2119,10 +2109,17 @@ _Py_CheckFunctionResult(PyObject *func, PyObject *result, const char *where)
"%s returned a result with an error set",
where);
_PyErr_ChainExceptions(exc, val, tb);
return NULL;
goto error;
}
}
return result;
error:
#ifdef Py_DEBUG
/* Ensure that the bug is catched in debug mode */
Py_FatalError("Function result is invalid");
#endif
return NULL;
}
PyObject *

Loading…
Cancel
Save