STINNER Victor <[email protected]> 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 <[email protected]>
<https://bugs.python.org/issue38006>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com