Commit 4d5f94b8 authored by Victor Stinner's avatar Victor Stinner Committed by GitHub

bpo-38070: Enhance visit_decref() debug trace (GH-16631)

subtract_refs() now pass the parent object to visit_decref() which
pass it to _PyObject_ASSERT(). So if the "is freed" assertion fails,
the parent is used in debug trace, rather than the freed object. The
parent object is more likely to contain useful information. Freed
objects cannot be inspected are are displayed as "<object at xxx is
freed>" with no other detail.
parent 36e33c36
......@@ -373,9 +373,9 @@ update_refs(PyGC_Head *containers)
/* A traversal callback for subtract_refs. */
static int
visit_decref(PyObject *op, void *data)
visit_decref(PyObject *op, void *parent)
{
_PyObject_ASSERT(op, !_PyObject_IsFreed(op));
_PyObject_ASSERT(_PyObject_CAST(parent), !_PyObject_IsFreed(op));
if (PyObject_IS_GC(op)) {
PyGC_Head *gc = AS_GC(op);
......@@ -401,10 +401,11 @@ subtract_refs(PyGC_Head *containers)
traverseproc traverse;
PyGC_Head *gc = GC_NEXT(containers);
for (; gc != containers; gc = GC_NEXT(gc)) {
traverse = Py_TYPE(FROM_GC(gc))->tp_traverse;
PyObject *op = FROM_GC(gc);
traverse = Py_TYPE(op)->tp_traverse;
(void) traverse(FROM_GC(gc),
(visitproc)visit_decref,
NULL);
op);
}
}
......
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