From: Michael W. Hudson Date: Tue, 3 Aug 2004 10:21:03 +0000 (+0000) Subject: Repair the same thinko in two places about handling of _Py_RefTotal in X-Git-Tag: v2.4a2~49 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3f3b66823f899868b86722d586a6cd00df4cbad9;p=python 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). --- diff --git a/Objects/classobject.c b/Objects/classobject.c index 17a5646781..bdbcd6a1b3 100644 --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -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; diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 1a052c78c1..b33b21c629 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -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.