]> granicus.if.org Git - python/commitdiff
Fix for SF 742911. We now clear the weakrefs *before* calling __del__
authorGuido van Rossum <guido@python.org>
Thu, 29 May 2003 14:29:23 +0000 (14:29 +0000)
committerGuido van Rossum <guido@python.org>
Thu, 29 May 2003 14:29:23 +0000 (14:29 +0000)
or emptying __dict__, just as we do for classic classes.

Objects/typeobject.c

index 18b50fc1872b20960015c4c3e9e34f9e2514cc96..93f34ed1f9c15f68f0e69ee719394085f6a9126f 100644 (file)
@@ -638,13 +638,6 @@ subtype_dealloc(PyObject *self)
        --_PyTrash_delete_nesting;
        _PyObject_GC_TRACK(self); /* We'll untrack for real later */
 
-       /* Maybe call finalizer; exit early if resurrected */
-       if (type->tp_del) {
-               type->tp_del(self);
-               if (self->ob_refcnt > 0)
-                       goto endlabel;
-       }
-
        /* Find the nearest base with a different tp_dealloc
           and clear slots while we're at it */
        base = type;
@@ -655,6 +648,18 @@ subtype_dealloc(PyObject *self)
                assert(base);
        }
 
+       /* If we added a weaklist, we clear it.  Do this *before* calling
+          the finalizer (__del__) or clearing the instance dict. */
+       if (type->tp_weaklistoffset && !base->tp_weaklistoffset)
+               PyObject_ClearWeakRefs(self);
+
+       /* Maybe call finalizer; exit early if resurrected */
+       if (type->tp_del) {
+               type->tp_del(self);
+               if (self->ob_refcnt > 0)
+                       goto endlabel;
+       }
+
        /* If we added a dict, DECREF it */
        if (type->tp_dictoffset && !base->tp_dictoffset) {
                PyObject **dictptr = _PyObject_GetDictPtr(self);
@@ -667,10 +672,6 @@ subtype_dealloc(PyObject *self)
                }
        }
 
-       /* If we added weaklist, we clear it */
-       if (type->tp_weaklistoffset && !base->tp_weaklistoffset)
-               PyObject_ClearWeakRefs(self);
-
        /* Finalize GC if the base doesn't do GC and we do */
        if (!PyType_IS_GC(base))
                _PyObject_GC_UNTRACK(self);