--_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;
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);
}
}
- /* 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);