mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
Repair the same thinko in two places about handling of _Py_RefTotal in
the case of __del__ resurrecting an object. This makes the apparent reference leaks in test_descr go away (which I expected) and also kills off those in test_gc (which is more surprising but less so once you actually think about it a bit).
This commit is contained in:
parent
3bfed9c225
commit
3f3b66823f
2 changed files with 12 additions and 10 deletions
|
@ -670,13 +670,14 @@ instance_dealloc(register PyInstanceObject *inst)
|
|||
_Py_NewReference((PyObject *)inst);
|
||||
inst->ob_refcnt = refcnt;
|
||||
_PyObject_GC_TRACK(inst);
|
||||
/* If Py_REF_DEBUG, the original decref dropped _Py_RefTotal,
|
||||
* but _Py_NewReference bumped it again, so that's a wash.
|
||||
* If Py_TRACE_REFS, _Py_NewReference re-added self to the
|
||||
* object chain, so no more to do there either.
|
||||
/* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
|
||||
* we need to undo that. */
|
||||
_Py_DEC_REFTOTAL;
|
||||
/* If Py_TRACE_REFS, _Py_NewReference re-added self to the
|
||||
* object chain, so no more to do there.
|
||||
* If COUNT_ALLOCS, the original decref bumped tp_frees, and
|
||||
* _Py_NewReference bumped tp_allocs: both of those need to
|
||||
* be undone.
|
||||
* _Py_NewReference bumped tp_allocs: both of those need to be
|
||||
* undone.
|
||||
*/
|
||||
#ifdef COUNT_ALLOCS
|
||||
--inst->ob_type->tp_frees;
|
||||
|
|
|
@ -4837,10 +4837,11 @@ slot_tp_del(PyObject *self)
|
|||
}
|
||||
assert(!PyType_IS_GC(self->ob_type) ||
|
||||
_Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
|
||||
/* If Py_REF_DEBUG, the original decref dropped _Py_RefTotal, but
|
||||
* _Py_NewReference bumped it again, so that's a wash.
|
||||
* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
|
||||
* chain, so no more to do there either.
|
||||
/* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
|
||||
* we need to undo that. */
|
||||
_Py_DEC_REFTOTAL;
|
||||
/* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
|
||||
* chain, so no more to do there.
|
||||
* If COUNT_ALLOCS, the original decref bumped tp_frees, and
|
||||
* _Py_NewReference bumped tp_allocs: both of those need to be
|
||||
* undone.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue