Author: Manuel Jacob <[email protected]>
Branch: py3.5
Changeset: r90782:9ca6b5dc03b0
Date: 2017-03-21 23:56 +0100
http://bitbucket.org/pypy/pypy/changeset/9ca6b5dc03b0/
Log: hg merge default
diff --git a/lib-python/2.7/weakref.py b/lib-python/2.7/weakref.py
--- a/lib-python/2.7/weakref.py
+++ b/lib-python/2.7/weakref.py
@@ -36,9 +36,9 @@
except ImportError:
def _delitem_if_value_is(d, key, value):
try:
- if self.data[key] is value: # fall-back: there is a potential
+ if d[key] is value: # fall-back: there is a potential
# race condition in multithreaded programs HERE
- del self.data[key]
+ del d[key]
except KeyError:
pass
diff --git a/pypy/doc/build.rst b/pypy/doc/build.rst
--- a/pypy/doc/build.rst
+++ b/pypy/doc/build.rst
@@ -107,22 +107,22 @@
apt-get install gcc make libffi-dev pkg-config libz-dev libbz2-dev \
libsqlite3-dev libncurses-dev libexpat1-dev libssl-dev libgdbm-dev \
- tk-dev libgc-dev \
+ tk-dev libgc-dev python-cffi \
liblzma-dev # For lzma on PyPy3.
On Fedora::
dnf install gcc make libffi-devel pkgconfig zlib-devel bzip2-devel \
sqlite-devel ncurses-devel expat-devel openssl-devel tk-devel \
- gdbm-devel \
+ gdbm-devel python-cffi\
xz-devel # For lzma on PyPy3.
On SLES11::
zypper install gcc make python-devel pkg-config \
zlib-devel libopenssl-devel libbz2-devel sqlite3-devel \
- libexpat-devel libffi-devel python-curses \
- xz-devel # For lzma on PyPy3.
+ libexpat-devel libffi-devel python-curses python-cffi \
+ xz-devel # For lzma on PyPy3.
(XXX plus the SLES11 version of libgdbm-dev and tk-dev)
On Mac OS X, most of these build-time dependencies are installed alongside
diff --git a/pypy/module/_cffi_backend/cffi1_module.py
b/pypy/module/_cffi_backend/cffi1_module.py
--- a/pypy/module/_cffi_backend/cffi1_module.py
+++ b/pypy/module/_cffi_backend/cffi1_module.py
@@ -48,3 +48,4 @@
w_modules_dict = space.sys.get('modules')
space.setitem(w_modules_dict, w_name, module)
space.setitem(w_modules_dict, space.newtext(name + '.lib'), lib)
+ return module
diff --git a/pypy/module/cpyext/api.py b/pypy/module/cpyext/api.py
--- a/pypy/module/cpyext/api.py
+++ b/pypy/module/cpyext/api.py
@@ -1489,10 +1489,6 @@
copy_header_files(cts, trunk_include, use_micronumpy)
-def _load_from_cffi(space, name, path, initptr):
- from pypy.module._cffi_backend import cffi1_module
- cffi1_module.load_cffi1_module(space, name, path, initptr)
-
@unwrap_spec(path='fsencode', name='text')
def load_extension_module(space, path, name):
# note: this is used both to load CPython-API-style C extension
@@ -1526,11 +1522,11 @@
pass
else:
try:
- _load_from_cffi(space, name, path, initptr)
+ from pypy.module._cffi_backend import cffi1_module
+ return cffi1_module.load_cffi1_module(space, name, path,
initptr)
except:
rdynload.dlclose(dll)
raise
- return
#
if space.config.objspace.usemodules.cpyext:
also_look_for = 'PyInit_%s' % (basename,)
@@ -1539,8 +1535,7 @@
except KeyError:
pass
else:
- load_cpyext_module(space, name, path, dll, initptr)
- return
+ return load_cpyext_module(space, name, path, dll, initptr)
if look_for is not None:
look_for += ' or ' + also_look_for
else:
@@ -1559,9 +1554,10 @@
space.getbuiltinmodule("cpyext") # mandatory to init cpyext
state = space.fromcache(State)
- if state.find_extension(name, path) is not None:
+ w_mod = state.find_extension(name, path)
+ if w_mod is not None:
rdynload.dlclose(dll)
- return
+ return w_mod
old_context = state.package_context
state.package_context = name, path
try:
@@ -1571,6 +1567,7 @@
finally:
state.package_context = old_context
state.fixup_extension(w_mod, name, path)
+ return w_mod
@specialize.ll()
def generic_cpy_call(space, func, *args):
diff --git a/pypy/module/cpyext/state.py b/pypy/module/cpyext/state.py
--- a/pypy/module/cpyext/state.py
+++ b/pypy/module/cpyext/state.py
@@ -163,6 +163,7 @@
w_dict = w_mod.getdict(space)
w_copy = space.call_method(w_dict, 'copy')
self.extensions[path] = w_copy
+ return w_mod
def _rawrefcount_perform(space):
diff --git a/pypy/module/imp/importing.py b/pypy/module/imp/importing.py
--- a/pypy/module/imp/importing.py
+++ b/pypy/module/imp/importing.py
@@ -128,7 +128,7 @@
def load_c_extension(space, filename, modulename):
from pypy.module.cpyext.api import load_extension_module
- load_extension_module(space, filename, modulename)
+ return load_extension_module(space, filename, modulename)
# NB. cpyext.api.load_extension_module() can also delegate to _cffi_backend
# __________________________________________________________________
diff --git a/pypy/module/imp/interp_imp.py b/pypy/module/imp/interp_imp.py
--- a/pypy/module/imp/interp_imp.py
+++ b/pypy/module/imp/interp_imp.py
@@ -52,8 +52,8 @@
w_modulename = space.getattr(w_spec, space.newtext("name"))
w_path = space.getattr(w_spec, space.newtext("origin"))
filename = space.fsencode_w(w_path)
- importing.load_c_extension(space, filename, space.text_w(w_modulename))
- return importing.check_sys_modules(space, w_modulename)
+ return importing.load_c_extension(space, filename,
+ space.text_w(w_modulename))
def create_builtin(space, w_spec):
w_name = space.getattr(w_spec, space.newtext("name"))
diff --git a/pypy/objspace/std/dictmultiobject.py
b/pypy/objspace/std/dictmultiobject.py
--- a/pypy/objspace/std/dictmultiobject.py
+++ b/pypy/objspace/std/dictmultiobject.py
@@ -1007,6 +1007,8 @@
else:
return d.pop(key, w_default)
elif self._never_equal_to(space.type(w_key)):
+ if w_default is not None:
+ return w_default
raise KeyError
else:
self.switch_to_object_strategy(w_dict)
diff --git a/pypy/objspace/std/test/test_dictmultiobject.py
b/pypy/objspace/std/test/test_dictmultiobject.py
--- a/pypy/objspace/std/test/test_dictmultiobject.py
+++ b/pypy/objspace/std/test/test_dictmultiobject.py
@@ -227,6 +227,10 @@
assert len(dd) == 1
raises(KeyError, dd.pop, 33)
+ assert d.pop("abc", None) is None
+ raises(KeyError, d.pop, "abc")
+ assert len(d) == 2
+
def test_items(self):
d = {1: 2, 3: 4}
its = list(d.items())
diff --git a/rpython/rlib/rthread.py b/rpython/rlib/rthread.py
--- a/rpython/rlib/rthread.py
+++ b/rpython/rlib/rthread.py
@@ -429,7 +429,11 @@
gc._trace_callback(callback, arg, p + offset)
llop.threadlocalref_release(lltype.Void)
_lambda_trace_tlref = lambda: _trace_tlref
- TRACETLREF = lltype.GcStruct('TRACETLREF')
+ # WAAAH obscurity: can't use a name that may be non-unique,
+ # otherwise the types compare equal, even though we call
+ # register_custom_trace_hook() to register different trace
+ # functions...
+ TRACETLREF = lltype.GcStruct('TRACETLREF%d' % unique_id)
_tracetlref_obj = lltype.malloc(TRACETLREF, immortal=True)
@staticmethod
diff --git a/rpython/rlib/rurandom.py b/rpython/rlib/rurandom.py
--- a/rpython/rlib/rurandom.py
+++ b/rpython/rlib/rurandom.py
@@ -99,8 +99,11 @@
eci = eci.merge(ExternalCompilationInfo(includes=['linux/random.h']))
class CConfig:
_compilation_info_ = eci
- GRND_NONBLOCK = rffi_platform.ConstantInteger('GRND_NONBLOCK')
+ GRND_NONBLOCK = rffi_platform.DefinedConstantInteger(
+ 'GRND_NONBLOCK')
globals().update(rffi_platform.configure(CConfig))
+ if GRND_NONBLOCK is None:
+ GRND_NONBLOCK = 0x0001 # from linux/random.h
# On Linux, use the syscall() function because the GNU libc doesn't
# expose the Linux getrandom() syscall yet.
diff --git a/rpython/rlib/test/test_rthread.py
b/rpython/rlib/test/test_rthread.py
--- a/rpython/rlib/test/test_rthread.py
+++ b/rpython/rlib/test/test_rthread.py
@@ -262,15 +262,23 @@
py.test.skip("no __thread support here")
class FooBar(object):
- pass
+ def __init__(self, a, b):
+ self.lst = [a, b]
t = ThreadLocalReference(FooBar)
+ t2 = ThreadLocalReference(FooBar)
def tset():
- x1 = FooBar()
+ x1 = FooBar(40, 2)
t.set(x1)
return weakref.ref(x1)
tset._dont_inline_ = True
+ def t2set():
+ x1 = FooBar(50, 3)
+ t2.set(x1)
+ return weakref.ref(x1)
+ t2set._dont_inline_ = True
+
class WrFromThread:
pass
wr_from_thread = WrFromThread()
@@ -279,22 +287,30 @@
config = objectmodel.fetch_translated_config()
assert t.automatic_keepalive(config) is True
wr = tset()
- import gc; gc.collect() # 'x1' should not be collected
- x2 = t.get()
+ wr2 = t2set()
+ import gc; gc.collect() # the two 'x1' should not be collected
+ x1 = t.get()
+ assert x1 is not None
+ assert wr() is not None
+ assert wr() is x1
+ assert x1.lst == [40, 2]
+ x2 = t2.get()
assert x2 is not None
- assert wr() is not None
- assert wr() is x2
- return wr
+ assert wr2() is not None
+ assert wr2() is x2
+ assert x2.lst == [50, 3]
+ return wr, wr2
def thread_entry_point():
- wr = f()
+ wr, wr2 = f()
wr_from_thread.wr = wr
+ wr_from_thread.wr2 = wr2
wr_from_thread.seen = True
def main():
wr_from_thread.seen = False
start_new_thread(thread_entry_point, ())
- wr1 = f()
+ wr1, wr2 = f()
count = 0
while True:
time.sleep(0.5)
@@ -302,10 +318,15 @@
break
count += 1
assert wr_from_thread.seen is True
- wr2 = wr_from_thread.wr
- import gc; gc.collect() # wr2() should be collected here
+ wr_other_1 = wr_from_thread.wr
+ wr_other_2 = wr_from_thread.wr2
+ import gc; gc.collect() # wr_other_*() should be collected
here
assert wr1() is not None # this thread, still running
- assert wr2() is None # other thread, not running any more
+ assert wr2() is not None # this thread, still running
+ assert wr_other_1() is None # other thread, not running any more
+ assert wr_other_2() is None # other thread, not running any more
+ assert wr1().lst == [40, 2]
+ assert wr2().lst == [50, 3]
return 42
extra_options = {'no__thread': no__thread, 'shared': True}
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit