bpo-38006: Avoid closure in weakref.WeakValueDictionary (GH-15641)
weakref.WeakValueDictionary defines a local remove() function used as
callback for weak references. This function was created with a
closure. Modify the implementation to avoid the closure.
(cherry picked from commit a2af05a0d3
)
Co-authored-by: Victor Stinner <vstinner@redhat.com>
This commit is contained in:
parent
b6ef8f2beb
commit
78d15faf6c
|
@ -1785,6 +1785,11 @@ class MappingTestCase(TestBase):
|
|||
# copying should not result in a crash.
|
||||
self.check_threaded_weak_dict_copy(weakref.WeakValueDictionary, True)
|
||||
|
||||
@support.cpython_only
|
||||
def test_remove_closure(self):
|
||||
d = weakref.WeakValueDictionary()
|
||||
self.assertIsNone(d._remove.__closure__)
|
||||
|
||||
|
||||
from test import mapping_tests
|
||||
|
||||
|
|
|
@ -108,12 +108,12 @@ class WeakValueDictionary(_collections_abc.MutableMapping):
|
|||
else:
|
||||
# Atomic removal is necessary since this function
|
||||
# can be called asynchronously by the GC
|
||||
_atomic_removal(d, wr.key)
|
||||
_atomic_removal(self.data, wr.key)
|
||||
self._remove = remove
|
||||
# A list of keys to be removed
|
||||
self._pending_removals = []
|
||||
self._iterating = set()
|
||||
self.data = d = {}
|
||||
self.data = {}
|
||||
self.update(other, **kw)
|
||||
|
||||
def _commit_removals(self):
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
weakref.WeakValueDictionary defines a local remove() function used as
|
||||
callback for weak references. This function was created with a closure.
|
||||
Modify the implementation to avoid the closure.
|
Loading…
Reference in New Issue