Fix an edge case whereby the __del__() method of a classic class could

create a new weakref to the object.
This commit is contained in:
Guido van Rossum 2008-01-18 20:53:37 +00:00
parent 0f99b71bd0
commit d187381b81
1 changed files with 10 additions and 0 deletions

View File

@ -646,6 +646,16 @@ instance_dealloc(register PyInstanceObject *inst)
*/ */
assert(inst->ob_refcnt > 0); assert(inst->ob_refcnt > 0);
if (--inst->ob_refcnt == 0) { if (--inst->ob_refcnt == 0) {
/* New weakrefs could be created during the finalizer call.
If this occurs, clear them out without calling their
finalizers since they might rely on part of the object
being finalized that has already been destroyed. */
while (inst->in_weakreflist != NULL) {
_PyWeakref_ClearRef((PyWeakReference *)
(inst->in_weakreflist));
}
Py_DECREF(inst->in_class); Py_DECREF(inst->in_class);
Py_XDECREF(inst->in_dict); Py_XDECREF(inst->in_dict);
PyObject_GC_Del(inst); PyObject_GC_Del(inst);