summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
Diffstat (limited to 'Objects')
-rw-r--r--Objects/typeobject.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 18b50fc..93f34ed 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -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);