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:
parent
0f99b71bd0
commit
d187381b81
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue