[Python-checkins] bpo-35059: Enhance _PyObject_AssertFailed() (GH-10642)
Victor Stinner
webhook-mailer at python.org
Wed Nov 21 17:53:47 EST 2018
https://github.com/python/cpython/commit/f1d002c1e094922b0f17a820f90ff102d68ab253
commit: f1d002c1e094922b0f17a820f90ff102d68ab253
branch: master
author: Victor Stinner <vstinner at redhat.com>
committer: GitHub <noreply at github.com>
date: 2018-11-21T23:53:44+01:00
summary:
bpo-35059: Enhance _PyObject_AssertFailed() (GH-10642)
Enhance _PyObject_AssertFailed()
* Exchange 'expr' and 'msg' parameters
* 'expr' and 'func' arguments can now be NULL
files:
M Include/object.h
M Lib/test/test_capi.py
M Objects/object.c
diff --git a/Include/object.h b/Include/object.h
index 48ce9d2b970a..0d84d3604f0a 100644
--- a/Include/object.h
+++ b/Include/object.h
@@ -1158,8 +1158,8 @@ _PyObject_DebugTypeStats(FILE *out);
((expr) \
? (void)(0) \
: _PyObject_AssertFailed((obj), \
- (msg), \
Py_STRINGIFY(expr), \
+ (msg), \
__FILE__, \
__LINE__, \
__func__))
@@ -1169,11 +1169,13 @@ _PyObject_DebugTypeStats(FILE *out);
/* Declare and define _PyObject_AssertFailed() even when NDEBUG is defined,
to avoid causing compiler/linker errors when building extensions without
- NDEBUG against a Python built with NDEBUG defined. */
+ NDEBUG against a Python built with NDEBUG defined.
+
+ msg, expr and function can be NULL. */
PyAPI_FUNC(void) _PyObject_AssertFailed(
PyObject *obj,
- const char *msg,
const char *expr,
+ const char *msg,
const char *file,
int line,
const char *function);
diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py
index 3c8c3f02bf78..7c68b2c0fc2c 100644
--- a/Lib/test/test_capi.py
+++ b/Lib/test/test_capi.py
@@ -330,7 +330,7 @@ def test_negative_refcount(self):
rc, out, err = assert_python_failure('-c', code)
self.assertRegex(err,
br'_testcapimodule\.c:[0-9]+: '
- br'_Py_NegativeRefcount: Assertion ".*" failed; '
+ br'_Py_NegativeRefcount: Assertion failed: '
br'object has negative ref count')
diff --git a/Objects/object.c b/Objects/object.c
index 801b205c9b6b..9d2614bb6d11 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -205,8 +205,7 @@ void _Py_dec_count(PyTypeObject *tp)
void
_Py_NegativeRefcount(const char *filename, int lineno, PyObject *op)
{
- _PyObject_AssertFailed(op, "object has negative ref count",
- "op->ob_refcnt >= 0",
+ _PyObject_AssertFailed(op, NULL, "object has negative ref count",
filename, lineno, __func__);
}
@@ -2219,20 +2218,25 @@ _PyTrash_thread_destroy_chain(void)
void
-_PyObject_AssertFailed(PyObject *obj, const char *msg, const char *expr,
+_PyObject_AssertFailed(PyObject *obj, const char *expr, const char *msg,
const char *file, int line, const char *function)
{
- fprintf(stderr,
- "%s:%d: %s: Assertion \"%s\" failed",
- file, line, function, expr);
+ fprintf(stderr, "%s:%d: ", file, line);
+ if (function) {
+ fprintf(stderr, "%s: ", function);
+ }
fflush(stderr);
-
- if (msg) {
- fprintf(stderr, "; %s.\n", msg);
+ if (expr) {
+ fprintf(stderr, "Assertion \"%s\" failed", expr);
}
else {
- fprintf(stderr, ".\n");
+ fprintf(stderr, "Assertion failed");
+ }
+ fflush(stderr);
+ if (msg) {
+ fprintf(stderr, ": %s", msg);
}
+ fprintf(stderr, "\n");
fflush(stderr);
if (obj == NULL) {
More information about the Python-checkins
mailing list