diff options
author | Victor Stinner <vstinner@redhat.com> | 2018-10-26 00:12:34 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-26 00:12:34 (GMT) |
commit | 3ec9af75f6825a32f369ee182a388c365db241b6 (patch) | |
tree | 24c62eb4ca7b34034abb7eb5b1a0eff083f41b99 | |
parent | c89a93271447ec65e83a1dc7605e62dbf272cafd (diff) | |
download | cpython-3ec9af75f6825a32f369ee182a388c365db241b6.zip cpython-3ec9af75f6825a32f369ee182a388c365db241b6.tar.gz cpython-3ec9af75f6825a32f369ee182a388c365db241b6.tar.bz2 |
bpo-9263: _Py_NegativeRefcount() use _PyObject_AssertFailed() (GH-10109)
_Py_NegativeRefcount() now uses _PyObject_AssertFailed() to dump the
object to help debugging.
-rw-r--r-- | Lib/test/test_capi.py | 5 | ||||
-rw-r--r-- | Objects/object.c | 13 |
2 files changed, 8 insertions, 10 deletions
diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index a732f4f..b3600eb 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -329,8 +329,9 @@ class CAPITest(unittest.TestCase): """) rc, out, err = assert_python_failure('-c', code) self.assertRegex(err, - br'_testcapimodule\.c:[0-9]+ object at .* ' - br'has negative ref count', err) + br'_testcapimodule\.c:[0-9]+: ' + br'_Py_NegativeRefcount: Assertion ".*" failed; ' + br'object has negative ref count') class TestPendingCalls(unittest.TestCase): diff --git a/Objects/object.c b/Objects/object.c index 2252f98..d6f27ff 100644 --- a/Objects/object.c +++ b/Objects/object.c @@ -205,13 +205,9 @@ void dec_count(PyTypeObject *tp) void _Py_NegativeRefcount(const char *filename, int lineno, PyObject *op) { - char buf[300]; - - PyOS_snprintf(buf, sizeof(buf), - "%s:%i object at %p has negative ref count " - "%" PY_FORMAT_SIZE_T "d", - filename, lineno, op, op->ob_refcnt); - Py_FatalError(buf); + _PyObject_AssertFailed(op, "object has negative ref count", + "op->ob_refcnt >= 0", + filename, lineno, __func__); } #endif /* Py_REF_DEBUG */ @@ -356,13 +352,14 @@ PyObject_Print(PyObject *op, FILE *fp, int flags) Py_END_ALLOW_THREADS } else { - if (op->ob_refcnt <= 0) + if (op->ob_refcnt <= 0) { /* XXX(twouters) cast refcount to long until %zd is universally available */ Py_BEGIN_ALLOW_THREADS fprintf(fp, "<refcnt %ld at %p>", (long)op->ob_refcnt, op); Py_END_ALLOW_THREADS + } else { PyObject *s; if (flags & Py_PRINT_RAW) |