]> granicus.if.org Git - python/commitdiff
Repair the same thinko in two places about handling of _Py_RefTotal in
authorMichael W. Hudson <mwh@python.net>
Tue, 3 Aug 2004 10:21:03 +0000 (10:21 +0000)
committerMichael W. Hudson <mwh@python.net>
Tue, 3 Aug 2004 10:21:03 +0000 (10:21 +0000)
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).

Objects/classobject.c
Objects/typeobject.c

index 17a564678170ee207f4e2e58db7c35647263665b..bdbcd6a1b31e777e215652ac7f476cc785a6d918 100644 (file)
@@ -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;
index 1a052c78c145dfd55c4772ab1e6dd260f5ef0d8c..b33b21c62963200c9dd4f168d0e111e2c6603885 100644 (file)
@@ -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.