STINNER Victor <vstin...@python.org> added the comment:
(gdb) print ((PyFunctionObject*)func).func_qualname $29 = 'WeakValueDictionary.__init__.<locals>.remove' This is a temporary remove() function declared in weakref.WeakValueDictionary constructor: class WeakKeyDictionary(_collections_abc.MutableMapping): def __init__(self, dict=None): def remove(k, selfref=ref(self)): ... self._remove = remove ... def __setitem__(self, key, value): self.data[ref(key, self._remove)] = value ... Simplified gdb traceback: Py_FinalizeEx() -> PyImport_Cleanup() -> _PyGC_CollectNoFail() -> delete_garbage() -> func_clear(op=0x7fffe6ebfd30) at /usr/src/debug/python3-3.8.0~b4-1.fc32.x86_64/Objects/funcobject.c:584 Py_CLEAR(op->func_closure); -> tupledealloc() -> cell_dealloc() -> dict_dealloc() -> dictkeys_decref() -> cfield_dealloc () from _cffi_backend -> PyObject_ClearWeakRefs() -> _PyFunction_Vectorcall (func=<function at remote 0x7fffe6ebfd30>, ...) PyImport_Cleanup() calls delete_garbage() which calls func_clear(op=0x7fffe6ebfd30). But while the function closure is destroyed, a cffi object stored in a dict (namespace?) (stored in the function closure) is cleared, and there was a weak reference to this cffi object with a callback... which is the cleared function (Python object 0x7fffe6ebfd30)... -- I don't understand why/how remove() gets a closure. I modified weakref.py to ensure that remove.__closure__ is None: test_weakref still pass. ---------- _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue38006> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com