[Python-checkins] cpython (2.7): Issue #20006: Fix sporadic failures in test_weakset.

antoine.pitrou python-checkins at python.org
Wed Dec 18 00:28:44 CET 2013


http://hg.python.org/cpython/rev/226c37c209fc
changeset:   88032:226c37c209fc
branch:      2.7
parent:      88029:ebace0a5a33e
user:        Antoine Pitrou <solipsis at pitrou.net>
date:        Wed Dec 18 00:28:36 2013 +0100
summary:
  Issue #20006: Fix sporadic failures in test_weakset.

files:
  Lib/_weakrefset.py       |  2 ++
  Lib/test/test_weakset.py |  7 ++++++-
  2 files changed, 8 insertions(+), 1 deletions(-)


diff --git a/Lib/_weakrefset.py b/Lib/_weakrefset.py
--- a/Lib/_weakrefset.py
+++ b/Lib/_weakrefset.py
@@ -60,6 +60,8 @@
             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
--- a/Lib/test/test_weakset.py
+++ b/Lib/test/test_weakset.py
@@ -473,9 +473,14 @@
         def testcontext():
             try:
                 it = iter(s)
-                next(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:

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list