summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2015-03-24 15:28:52 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2015-03-24 15:28:52 (GMT)
commit944fbcc478e36523add77574e172caf518647c74 (patch)
tree2aaa3be535201b0b936dc64bd878a7b4eadb0f59
parent381a9bce9762fe2db4a7951f689df4d06ba53f79 (diff)
downloadcpython-944fbcc478e36523add77574e172caf518647c74.zip
cpython-944fbcc478e36523add77574e172caf518647c74.tar.gz
cpython-944fbcc478e36523add77574e172caf518647c74.tar.bz2
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).
-rw-r--r--Lib/test/test_capi.py8
-rw-r--r--Objects/abstract.c19
2 files changed, 14 insertions, 13 deletions
diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py
index 8a92d6b..fbd1466 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: <built-in function '
br'return_null_without_error> 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 6f8432e..dc8fb37 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 *