summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2013-12-17 23:32:02 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2013-12-17 23:32:02 (GMT)
commit74940dc9287553536d73e140f5d1c5be139cf713 (patch)
tree9ec1b0833b968b4957452847ee62437917f9b4cf /Lib
parentcac05e2e900f804a9a2c42ce9ab27c17b93a0811 (diff)
parent320b39158ebfd63f25eb5f10dd65792334445eda (diff)
downloadcpython-74940dc9287553536d73e140f5d1c5be139cf713.zip
cpython-74940dc9287553536d73e140f5d1c5be139cf713.tar.gz
cpython-74940dc9287553536d73e140f5d1c5be139cf713.tar.bz2
Issue #20006: Fix sporadic failures in test_weakset.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/_weakrefset.py2
-rw-r--r--Lib/test/test_weakset.py8
2 files changed, 8 insertions, 2 deletions
diff --git a/Lib/_weakrefset.py b/Lib/_weakrefset.py
index 6a98b88..7f9923c 100644
--- a/Lib/_weakrefset.py
+++ b/Lib/_weakrefset.py
@@ -60,6 +60,8 @@ class WeakSet:
for itemref in self.data:
item = itemref()
if item is not None:
+ # Caveat: the iterator will keep a strong reference to
+ # `item` until it is resumed or closed.
yield item
def __len__(self):
diff --git a/Lib/test/test_weakset.py b/Lib/test/test_weakset.py
index 5b782da..fb22879 100644
--- a/Lib/test/test_weakset.py
+++ b/Lib/test/test_weakset.py
@@ -370,10 +370,14 @@ class TestWeakSet(unittest.TestCase):
def testcontext():
try:
it = iter(s)
- next(it)
- del it
+ # Start iterator
+ yielded = ustr(str(next(it)))
# Schedule an item for removal and recreate it
u = ustr(str(items.pop()))
+ if yielded == u:
+ # The iterator still has a reference to the removed item,
+ # advance it (issue #20006).
+ next(it)
gc.collect() # just in case
yield u
finally: