Browse Source
bpo-9263: _Py_NegativeRefcount() use _PyObject_AssertFailed() (GH-10109)
_Py_NegativeRefcount() now uses _PyObject_AssertFailed() to dump the
object to help debugging.
pull/10116/head
Victor Stinner
8 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with
8 additions and
10 deletions
-
Lib/test/test_capi.py
-
Objects/object.c
|
|
|
@ -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): |
|
|
|
|
|
|
|
@ -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) |
|
|
|
|