Kaydet (Commit) 944fbcc4 authored tarafından Victor Stinner's avatar Victor Stinner

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).
üst 381a9bce
...@@ -185,8 +185,8 @@ class CAPITest(unittest.TestCase): ...@@ -185,8 +185,8 @@ class CAPITest(unittest.TestCase):
""") """)
rc, out, err = assert_python_failure('-c', code) rc, out, err = assert_python_failure('-c', code)
self.assertRegex(err.replace(b'\r', b''), self.assertRegex(err.replace(b'\r', b''),
br'Fatal Python error: ' br'Fatal Python error: a function returned NULL '
br'Function result is invalid\n' br'without setting an error\n'
br'SystemError: <built-in function ' br'SystemError: <built-in function '
br'return_null_without_error> returned NULL ' br'return_null_without_error> returned NULL '
br'without setting an error\n' br'without setting an error\n'
...@@ -212,8 +212,8 @@ class CAPITest(unittest.TestCase): ...@@ -212,8 +212,8 @@ class CAPITest(unittest.TestCase):
""") """)
rc, out, err = assert_python_failure('-c', code) rc, out, err = assert_python_failure('-c', code)
self.assertRegex(err.replace(b'\r', b''), self.assertRegex(err.replace(b'\r', b''),
br'Fatal Python error: ' br'Fatal Python error: a function returned a '
br'Function result is invalid\n' br'result with an error set\n'
br'ValueError\n' br'ValueError\n'
br'\n' br'\n'
br'During handling of the above exception, ' br'During handling of the above exception, '
......
...@@ -2090,7 +2090,11 @@ _Py_CheckFunctionResult(PyObject *func, PyObject *result, const char *where) ...@@ -2090,7 +2090,11 @@ _Py_CheckFunctionResult(PyObject *func, PyObject *result, const char *where)
PyErr_Format(PyExc_SystemError, PyErr_Format(PyExc_SystemError,
"%s returned NULL without setting an error", "%s returned NULL without setting an error",
where); 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 { else {
...@@ -2109,17 +2113,14 @@ _Py_CheckFunctionResult(PyObject *func, PyObject *result, const char *where) ...@@ -2109,17 +2113,14 @@ _Py_CheckFunctionResult(PyObject *func, PyObject *result, const char *where)
"%s returned a result with an error set", "%s returned a result with an error set",
where); where);
_PyErr_ChainExceptions(exc, val, tb); _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; 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 * PyObject *
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment