[pypy-commit] cffi default: Due to a CPython bug, we cannot use setdefault() here

arigo noreply at buildbot.pypy.org
Sun Nov 10 10:03:11 CET 2013


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r1408:1e317570f885
Date: 2013-11-10 10:03 +0100
http://bitbucket.org/cffi/cffi/changeset/1e317570f885/

Log:	Due to a CPython bug, we cannot use setdefault() here

diff --git a/cffi/model.py b/cffi/model.py
--- a/cffi/model.py
+++ b/cffi/model.py
@@ -477,10 +477,17 @@
         res = getattr(ffi._backend, funcname)(*args)
     except NotImplementedError as e:
         raise NotImplementedError("%r: %s" % (srctype, e))
-    # note that setdefault() on WeakValueDictionary is not atomic,
-    # which means that we have to use a lock too
+    # note that setdefault() on WeakValueDictionary is not atomic
+    # and contains a rare bug (http://bugs.python.org/issue19542);
+    # we have to use a lock and do it ourselves
+    cache = ffi._backend.__typecache
     with global_lock:
-        return ffi._backend.__typecache.setdefault(key, res)
+        res1 = cache.get(key)
+        if res1 is None:
+            cache[key] = res
+            return res
+        else:
+            return res1
 
 def pointer_cache(ffi, BType):
     return global_cache('?', ffi, 'new_pointer_type', BType)


More information about the pypy-commit mailing list