From: Victor Stinner Date: Tue, 24 Mar 2015 15:28:52 +0000 (+0100) Subject: Issue #23571: Enhance _Py_CheckFunctionResult() X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=944fbcc478e36523add77574e172caf518647c74;p=python Issue #23571: Enhance _Py_CheckFunctionResult() Too bad, sometimes Py_FatalError() is unable to write the exception into sys.stderr (on "AMD64 OpenIndiana 3.x" buildbot, the buildbot was probably out of memory). Call Py_FatalError() with a different message for the two cases (result+error, or no result and no error). --- diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 8a92d6ba29..fbd1466c78 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -185,8 +185,8 @@ class CAPITest(unittest.TestCase): """) rc, out, err = assert_python_failure('-c', code) self.assertRegex(err.replace(b'\r', b''), - br'Fatal Python error: ' - br'Function result is invalid\n' + br'Fatal Python error: a function returned NULL ' + br'without setting an error\n' br'SystemError: returned NULL ' br'without setting an error\n' @@ -212,8 +212,8 @@ class CAPITest(unittest.TestCase): """) rc, out, err = assert_python_failure('-c', code) self.assertRegex(err.replace(b'\r', b''), - br'Fatal Python error: ' - br'Function result is invalid\n' + br'Fatal Python error: a function returned a ' + br'result with an error set\n' br'ValueError\n' br'\n' br'During handling of the above exception, ' diff --git a/Objects/abstract.c b/Objects/abstract.c index 6f8432efef..dc8fb3749d 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -2090,7 +2090,11 @@ _Py_CheckFunctionResult(PyObject *func, PyObject *result, const char *where) PyErr_Format(PyExc_SystemError, "%s returned NULL without setting an error", where); - goto error; +#ifdef Py_DEBUG + /* Ensure that the bug is catched in debug mode */ + Py_FatalError("a function returned NULL without setting an error"); +#endif + return NULL; } } else { @@ -2109,17 +2113,14 @@ _Py_CheckFunctionResult(PyObject *func, PyObject *result, const char *where) "%s returned a result with an error set", where); _PyErr_ChainExceptions(exc, val, tb); - goto error; +#ifdef Py_DEBUG + /* Ensure that the bug is catched in debug mode */ + Py_FatalError("a function returned a result with an error set"); +#endif + return NULL; } } 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 *