[pypy-commit] extradoc extradoc: Yet another weakdict issue
arigo
pypy.commits at gmail.com
Wed Nov 30 04:46:43 EST 2016
Author: Armin Rigo <arigo at tunes.org>
Branch: extradoc
Changeset: r5755:b2c2c758f9a7
Date: 2016-11-30 10:46 +0100
http://bitbucket.org/pypy/extradoc/changeset/b2c2c758f9a7/
Log: Yet another weakdict issue
diff --git a/planning/py3.5/cpython-crashers.rst b/planning/py3.5/cpython-crashers.rst
--- a/planning/py3.5/cpython-crashers.rst
+++ b/planning/py3.5/cpython-crashers.rst
@@ -172,6 +172,38 @@
* _collectionsmodule.c: deque_repr uses "[...]" as repr if recursion is
detected. I'd suggest that "deque(...)" is clearer---it's not a list.
+* weak dicts (both kinds) and weak sets have an implementation of
+ __len__ which doesn't give the "expected" result on PyPy, and in some
+ cases on CPython too. I'm not sure what is expected and what is not.
+ Here is an example on CPython 3.5.2+ (using a thread to run the weakref
+ callbacks only, not to explicitly inspect or modify 'd')::
+
+ import weakref, _thread
+ from queue import Queue
+
+ queue = Queue()
+ def subthread(queue):
+ while True:
+ queue.get()
+ _thread.start_new_thread(subthread, (queue,))
+
+ class X:
+ pass
+ d = weakref.WeakValueDictionary()
+ while True:
+ x = X()
+ d[52] = x
+ queue.put(x)
+ del x
+ while list(d) != []:
+ pass
+ assert len(d) == 0 # we've checked that list(d)==[], but this may fail
+
+ On CPython I've seen the assert fail only after editing the function
+ WeakValueDictionary.__init__.remove() to add ``time.sleep(0.01)`` as
+ the first line. Otherwise I guess the timings happen to make that test
+ pass.
+
Other issues of "dubious IMHO" status
-------------------------------------
More information about the pypy-commit
mailing list