[pypy-commit] pypy py3.5: hg merge default
rlamy
pypy.commits at gmail.com
Sat Nov 4 17:14:29 EDT 2017
Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: py3.5
Changeset: r92931:a433b30d93a4
Date: 2017-11-04 21:06 +0000
http://bitbucket.org/pypy/pypy/changeset/a433b30d93a4/
Log: hg merge default
diff --git a/extra_tests/requirements.txt b/extra_tests/requirements.txt
new file mode 100644
--- /dev/null
+++ b/extra_tests/requirements.txt
@@ -0,0 +1,2 @@
+pytest
+hypothesis
diff --git a/extra_tests/test_bytes.py b/extra_tests/test_bytes.py
new file mode 100644
--- /dev/null
+++ b/extra_tests/test_bytes.py
@@ -0,0 +1,82 @@
+from hypothesis import strategies as st
+from hypothesis import given, example
+
+ at given(st.binary(), st.binary(), st.binary())
+def test_find(u, prefix, suffix):
+ s = prefix + u + suffix
+ assert 0 <= s.find(u) <= len(prefix)
+ assert s.find(u, len(prefix), len(s) - len(suffix)) == len(prefix)
+
+ at given(st.binary(), st.binary(), st.binary())
+def test_index(u, prefix, suffix):
+ s = prefix + u + suffix
+ assert 0 <= s.index(u) <= len(prefix)
+ assert s.index(u, len(prefix), len(s) - len(suffix)) == len(prefix)
+
+ at given(st.binary(), st.binary(), st.binary())
+def test_rfind(u, prefix, suffix):
+ s = prefix + u + suffix
+ assert s.rfind(u) >= len(prefix)
+ assert s.rfind(u, len(prefix), len(s) - len(suffix)) == len(prefix)
+
+ at given(st.binary(), st.binary(), st.binary())
+def test_rindex(u, prefix, suffix):
+ s = prefix + u + suffix
+ assert s.rindex(u) >= len(prefix)
+ assert s.rindex(u, len(prefix), len(s) - len(suffix)) == len(prefix)
+
+def adjust_indices(u, start, end):
+ if end < 0:
+ end = max(end + len(u), 0)
+ else:
+ end = min(end, len(u))
+ if start < 0:
+ start = max(start + len(u), 0)
+ return start, end
+
+ at given(st.binary(), st.binary())
+def test_startswith_basic(u, v):
+ assert u.startswith(v) is (u[:len(v)] == v)
+
+ at example(b'x', b'', 1)
+ at example(b'x', b'', 2)
+ at given(st.binary(), st.binary(), st.integers())
+def test_startswith_start(u, v, start):
+ expected = u[start:].startswith(v) if v else (start <= len(u))
+ assert u.startswith(v, start) is expected
+
+ at example(b'x', b'', 1, 0)
+ at example(b'xx', b'', -1, 0)
+ at given(st.binary(), st.binary(), st.integers(), st.integers())
+def test_startswith_3(u, v, start, end):
+ if v:
+ expected = u[start:end].startswith(v)
+ else: # CPython leaks implementation details in this case
+ start0, end0 = adjust_indices(u, start, end)
+ expected = start0 <= len(u) and start0 <= end0
+ assert u.startswith(v, start, end) is expected
+
+ at given(st.binary(), st.binary())
+def test_endswith_basic(u, v):
+ if len(v) > len(u):
+ assert u.endswith(v) is False
+ else:
+ assert u.endswith(v) is (u[len(u) - len(v):] == v)
+
+ at example(b'x', b'', 1)
+ at example(b'x', b'', 2)
+ at given(st.binary(), st.binary(), st.integers())
+def test_endswith_2(u, v, start):
+ expected = u[start:].endswith(v) if v else (start <= len(u))
+ assert u.endswith(v, start) is expected
+
+ at example(b'x', b'', 1, 0)
+ at example(b'xx', b'', -1, 0)
+ at given(st.binary(), st.binary(), st.integers(), st.integers())
+def test_endswith_3(u, v, start, end):
+ if v:
+ expected = u[start:end].endswith(v)
+ else: # CPython leaks implementation details in this case
+ start0, end0 = adjust_indices(u, start, end)
+ expected = start0 <= len(u) and start0 <= end0
+ assert u.endswith(v, start, end) is expected
diff --git a/extra_tests/test_unicode.py b/extra_tests/test_unicode.py
--- a/extra_tests/test_unicode.py
+++ b/extra_tests/test_unicode.py
@@ -1,3 +1,4 @@
+import sys
import pytest
from hypothesis import strategies as st
from hypothesis import given, settings, example
@@ -32,3 +33,89 @@
@given(s=st.text())
def test_composition(s, norm1, norm2, norm3):
assert normalize(norm2, normalize(norm1, s)) == normalize(norm3, s)
+
+ at given(st.text(), st.text(), st.text())
+def test_find(u, prefix, suffix):
+ s = prefix + u + suffix
+ assert 0 <= s.find(u) <= len(prefix)
+ assert s.find(u, len(prefix), len(s) - len(suffix)) == len(prefix)
+
+ at given(st.text(), st.text(), st.text())
+def test_index(u, prefix, suffix):
+ s = prefix + u + suffix
+ assert 0 <= s.index(u) <= len(prefix)
+ assert s.index(u, len(prefix), len(s) - len(suffix)) == len(prefix)
+
+ at given(st.text(), st.text(), st.text())
+def test_rfind(u, prefix, suffix):
+ s = prefix + u + suffix
+ assert s.rfind(u) >= len(prefix)
+ assert s.rfind(u, len(prefix), len(s) - len(suffix)) == len(prefix)
+
+ at given(st.text(), st.text(), st.text())
+def test_rindex(u, prefix, suffix):
+ s = prefix + u + suffix
+ assert s.rindex(u) >= len(prefix)
+ assert s.rindex(u, len(prefix), len(s) - len(suffix)) == len(prefix)
+
+def adjust_indices(u, start, end):
+ if end < 0:
+ end = max(end + len(u), 0)
+ else:
+ end = min(end, len(u))
+ if start < 0:
+ start = max(start + len(u), 0)
+ return start, end
+
+ at given(st.text(), st.text())
+def test_startswith_basic(u, v):
+ assert u.startswith(v) is (u[:len(v)] == v)
+
+ at example(u'x', u'', 1)
+ at example(u'x', u'', 2)
+ at given(st.text(), st.text(), st.integers())
+def test_startswith_2(u, v, start):
+ if v or sys.version_info[0] == 2:
+ expected = u[start:].startswith(v)
+ else: # CPython leaks implementation details in this case
+ expected = start <= len(u)
+ assert u.startswith(v, start) is expected
+
+ at example(u'x', u'', 1, 0)
+ at example(u'xx', u'', -1, 0)
+ at given(st.text(), st.text(), st.integers(), st.integers())
+def test_startswith_3(u, v, start, end):
+ if v or sys.version_info[0] == 2:
+ expected = u[start:end].startswith(v)
+ else: # CPython leaks implementation details in this case
+ start0, end0 = adjust_indices(u, start, end)
+ expected = start0 <= len(u) and start0 <= end0
+ assert u.startswith(v, start, end) is expected
+
+ at given(st.text(), st.text())
+def test_endswith_basic(u, v):
+ if len(v) > len(u):
+ assert u.endswith(v) is False
+ else:
+ assert u.endswith(v) is (u[len(u) - len(v):] == v)
+
+ at example(u'x', u'', 1)
+ at example(u'x', u'', 2)
+ at given(st.text(), st.text(), st.integers())
+def test_endswith_2(u, v, start):
+ if v or sys.version_info[0] == 2:
+ expected = u[start:].endswith(v)
+ else: # CPython leaks implementation details in this case
+ expected = start <= len(u)
+ assert u.endswith(v, start) is expected
+
+ at example(u'x', u'', 1, 0)
+ at example(u'xx', u'', -1, 0)
+ at given(st.text(), st.text(), st.integers(), st.integers())
+def test_endswith_3(u, v, start, end):
+ if v or sys.version_info[0] == 2:
+ expected = u[start:end].endswith(v)
+ else: # CPython leaks implementation details in this case
+ start0, end0 = adjust_indices(u, start, end)
+ expected = start0 <= len(u) and start0 <= end0
+ assert u.endswith(v, start, end) is expected
diff --git a/lib-python/2.7/ctypes/__init__.py b/lib-python/2.7/ctypes/__init__.py
--- a/lib-python/2.7/ctypes/__init__.py
+++ b/lib-python/2.7/ctypes/__init__.py
@@ -360,14 +360,15 @@
self._FuncPtr = _FuncPtr
if handle is None:
- if flags & _FUNCFLAG_CDECL:
- pypy_dll = _ffi.CDLL(name, mode)
- else:
- pypy_dll = _ffi.WinDLL(name, mode)
- self.__pypy_dll__ = pypy_dll
- handle = int(pypy_dll)
- if _sys.maxint > 2 ** 32:
- handle = int(handle) # long -> int
+ handle = 0
+ if flags & _FUNCFLAG_CDECL:
+ pypy_dll = _ffi.CDLL(name, mode, handle)
+ else:
+ pypy_dll = _ffi.WinDLL(name, mode, handle)
+ self.__pypy_dll__ = pypy_dll
+ handle = int(pypy_dll)
+ if _sys.maxint > 2 ** 32:
+ handle = int(handle) # long -> int
self._handle = handle
def __repr__(self):
diff --git a/lib_pypy/_ctypes_test.py b/lib_pypy/_ctypes_test.py
--- a/lib_pypy/_ctypes_test.py
+++ b/lib_pypy/_ctypes_test.py
@@ -21,5 +21,11 @@
with fp:
imp.load_module('_ctypes_test', fp, filename, description)
except ImportError:
+ if os.name == 'nt':
+ # hack around finding compilers on win32
+ try:
+ import setuptools
+ except ImportError:
+ pass
print('could not find _ctypes_test in %s' % output_dir)
_pypy_testcapi.compile_shared('_ctypes_test.c', '_ctypes_test', output_dir)
diff --git a/lib_pypy/_testcapi.py b/lib_pypy/_testcapi.py
--- a/lib_pypy/_testcapi.py
+++ b/lib_pypy/_testcapi.py
@@ -17,6 +17,12 @@
with fp:
imp.load_module('_testcapi', fp, filename, description)
except ImportError:
+ if os.name == 'nt':
+ # hack around finding compilers on win32
+ try:
+ import setuptools
+ except ImportError:
+ pass
_pypy_testcapi.compile_shared(cfile, '_testcapi', output_dir)
diff --git a/pypy/doc/whatsnew-head.rst b/pypy/doc/whatsnew-head.rst
--- a/pypy/doc/whatsnew-head.rst
+++ b/pypy/doc/whatsnew-head.rst
@@ -10,3 +10,13 @@
.. branch: docs-osx-brew-openssl
+.. branch: keep-debug-symbols
+Add a smartstrip tool, which can optionally keep the debug symbols in a
+separate file, instead of just stripping them away. Use it in packaging
+
+.. branch: bsd-patches
+Fix failures on FreeBSD, contributed by David Naylor as patches on the issue
+tracker (issues 2694, 2695, 2696, 2697)
+
+.. branch: run-extra-tests
+Run extra_tests/ in buildbot
diff --git a/pypy/goal/getnightly.py b/pypy/goal/getnightly.py
--- a/pypy/goal/getnightly.py
+++ b/pypy/goal/getnightly.py
@@ -15,7 +15,7 @@
arch = 'linux'
cmd = 'wget "%s"'
TAR_OPTIONS += ' --wildcards'
- binfiles = "'*/bin/pypy3' '*/bin/libpypy3-c.so'"
+ binfiles = "'*/bin/pypy3*' '*/bin/libpypy3-c.so*'"
if os.uname()[-1].startswith('arm'):
arch += '-armhf-raspbian'
elif sys.platform.startswith('darwin'):
diff --git a/pypy/module/_rawffi/alt/interp_funcptr.py b/pypy/module/_rawffi/alt/interp_funcptr.py
--- a/pypy/module/_rawffi/alt/interp_funcptr.py
+++ b/pypy/module/_rawffi/alt/interp_funcptr.py
@@ -314,7 +314,7 @@
# ========================================================================
class W_CDLL(W_Root):
- def __init__(self, space, name, mode):
+ def __init__(self, space, name, mode, handle):
self.flags = libffi.FUNCFLAG_CDECL
self.space = space
if name is None:
@@ -322,7 +322,7 @@
else:
self.name = name
try:
- self.cdll = libffi.CDLL(name, mode)
+ self.cdll = libffi.CDLL(name, mode, handle)
except DLOpenError as e:
raise wrap_dlopenerror(space, e, self.name)
except OSError as e:
@@ -344,9 +344,9 @@
def getidentifier(self, space):
return space.newint(self.cdll.getidentifier())
- at unwrap_spec(name='fsencode_or_none', mode=int)
-def descr_new_cdll(space, w_type, name, mode=-1):
- return W_CDLL(space, name, mode)
+ at unwrap_spec(name='fsencode_or_none', mode=int, handle=int)
+def descr_new_cdll(space, w_type, name, mode=-1, handle=0):
+ return W_CDLL(space, name, mode, handle)
W_CDLL.typedef = TypeDef(
@@ -359,13 +359,13 @@
)
class W_WinDLL(W_CDLL):
- def __init__(self, space, name, mode):
- W_CDLL.__init__(self, space, name, mode)
+ def __init__(self, space, name, mode, handle):
+ W_CDLL.__init__(self, space, name, mode, handle)
self.flags = libffi.FUNCFLAG_STDCALL
- at unwrap_spec(name='fsencode_or_none', mode=int)
-def descr_new_windll(space, w_type, name, mode=-1):
- return W_WinDLL(space, name, mode)
+ at unwrap_spec(name='fsencode_or_none', mode=int, handle=int)
+def descr_new_windll(space, w_type, name, mode=-1, handle=0):
+ return W_WinDLL(space, name, mode, handle)
W_WinDLL.typedef = TypeDef(
@@ -380,4 +380,4 @@
# ========================================================================
def get_libc(space):
- return W_CDLL(space, get_libc_name(), -1)
+ return W_CDLL(space, get_libc_name(), -1, 0)
diff --git a/pypy/module/_vmprof/test/test__vmprof.py b/pypy/module/_vmprof/test/test__vmprof.py
--- a/pypy/module/_vmprof/test/test__vmprof.py
+++ b/pypy/module/_vmprof/test/test__vmprof.py
@@ -1,3 +1,4 @@
+import py
import sys
from rpython.tool.udir import udir
from pypy.tool.pytest.objspace import gettestobjspace
@@ -110,6 +111,7 @@
_vmprof.disable()
assert _vmprof.is_enabled() is False
+ @py.test.mark.xfail(sys.platform.startswith('freebsd'), reason = "not implemented")
def test_get_profile_path(self):
import _vmprof
tmpfile = open(self.tmpfilename, 'wb')
diff --git a/pypy/module/termios/test/test_termios.py b/pypy/module/termios/test/test_termios.py
--- a/pypy/module/termios/test/test_termios.py
+++ b/pypy/module/termios/test/test_termios.py
@@ -7,9 +7,6 @@
if os.name != 'posix':
py.test.skip('termios module only available on unix')
-if sys.platform.startswith('freebsd'):
- raise Exception('XXX seems to hangs on FreeBSD9')
-
class TestTermios(object):
def setup_class(cls):
try:
diff --git a/pypy/module/test_lib_pypy/pyrepl/__init__.py b/pypy/module/test_lib_pypy/pyrepl/__init__.py
--- a/pypy/module/test_lib_pypy/pyrepl/__init__.py
+++ b/pypy/module/test_lib_pypy/pyrepl/__init__.py
@@ -1,6 +1,3 @@
import sys
import lib_pypy.pyrepl
sys.modules['pyrepl'] = sys.modules['lib_pypy.pyrepl']
-
-if sys.platform.startswith('freebsd'):
- raise Exception('XXX seems to hangs on FreeBSD9')
diff --git a/pypy/module/test_lib_pypy/pyrepl/test_readline.py b/pypy/module/test_lib_pypy/pyrepl/test_readline.py
--- a/pypy/module/test_lib_pypy/pyrepl/test_readline.py
+++ b/pypy/module/test_lib_pypy/pyrepl/test_readline.py
@@ -4,7 +4,7 @@
@pytest.mark.skipif("os.name != 'posix' or 'darwin' in sys.platform or "
- "'kfreebsd' in sys.platform")
+ "'freebsd' in sys.platform")
def test_raw_input():
import os
import pty
diff --git a/pypy/module/zipimport/test/test_zipimport.py b/pypy/module/zipimport/test/test_zipimport.py
--- a/pypy/module/zipimport/test/test_zipimport.py
+++ b/pypy/module/zipimport/test/test_zipimport.py
@@ -196,19 +196,19 @@
m0 = self.get_pyc()[0]
m0 ^= 0x04
test_pyc = bytes([m0]) + self.get_pyc()[1:]
- self.writefile("uu.pyc", test_pyc)
+ self.writefile("xxbad_pyc.pyc", test_pyc)
raises(zipimport.ZipImportError,
- "__import__('uu', globals(), locals(), [])")
- assert 'uu' not in sys.modules
+ "__import__('xxbad_pyc', globals(), locals(), [])")
+ assert 'xxbad_pyc' not in sys.modules
def test_force_py(self):
import sys
m0 = self.get_pyc()[0]
m0 ^= 0x04
test_pyc = bytes([m0]) + self.get_pyc()[1:]
- self.writefile("uu.pyc", test_pyc)
- self.writefile("uu.py", "def f(x): return x")
- mod = __import__("uu", globals(), locals(), [])
+ self.writefile("xxforce_py.pyc", test_pyc)
+ self.writefile("xxforce_py.py", "def f(x): return x")
+ mod = __import__("xxforce_py", globals(), locals(), [])
assert mod.f(3) == 3
def test_sys_modules(self):
diff --git a/pypy/tool/cpyext/extbuild.py b/pypy/tool/cpyext/extbuild.py
--- a/pypy/tool/cpyext/extbuild.py
+++ b/pypy/tool/cpyext/extbuild.py
@@ -246,13 +246,13 @@
if sys.platform == 'win32':
compile_extra = ["/we4013"]
link_extra = ["/LIBPATH:" + os.path.join(sys.exec_prefix, 'libs')]
- elif sys.platform == 'darwin':
- compile_extra = link_extra = None
- pass
elif sys.platform.startswith('linux'):
compile_extra = [
"-O0", "-g", "-Werror=implicit-function-declaration", "-fPIC"]
link_extra = None
+ else:
+ compile_extra = link_extra = None
+ pass
return ExtensionCompiler(
builddir_base=base_dir,
include_extra=[get_python_inc()],
diff --git a/pypy/tool/release/package.py b/pypy/tool/release/package.py
--- a/pypy/tool/release/package.py
+++ b/pypy/tool/release/package.py
@@ -224,8 +224,9 @@
old_dir = os.getcwd()
try:
os.chdir(str(builddir))
- for source, target in binaries:
- smartstrip(bindir.join(target), keep_debug=options.keep_debug)
+ if not _fake:
+ for source, target in binaries:
+ smartstrip(bindir.join(target), keep_debug=options.keep_debug)
#
if USE_ZIPFILE_MODULE:
import zipfile
diff --git a/pypy/tool/release/smartstrip.py b/pypy/tool/release/smartstrip.py
--- a/pypy/tool/release/smartstrip.py
+++ b/pypy/tool/release/smartstrip.py
@@ -19,6 +19,9 @@
if sys.platform == 'linux2':
os.system("objcopy --only-keep-debug %s %s" % (exe, debug))
os.system("objcopy --add-gnu-debuglink=%s %s" % (debug, exe))
+ perm = debug.stat().mode
+ perm &= ~(0111) # remove the 'x' bit
+ debug.chmod(perm)
def smartstrip(exe, keep_debug=True):
exe = py.path.local(exe)
diff --git a/pypy/tool/release/test/test_smartstrip.py b/pypy/tool/release/test/test_smartstrip.py
--- a/pypy/tool/release/test/test_smartstrip.py
+++ b/pypy/tool/release/test/test_smartstrip.py
@@ -42,6 +42,9 @@
smartstrip(exe, keep_debug=True)
debug = tmpdir.join("myprog.debug")
assert debug.check(file=True)
+ perm = debug.stat().mode & 0777
+ assert perm & 0111 == 0 # 'x' bit not set
+ #
info = info_symbol(exe, "foo")
assert info == "foo in section .text of %s" % exe
#
diff --git a/rpython/rlib/libffi.py b/rpython/rlib/libffi.py
--- a/rpython/rlib/libffi.py
+++ b/rpython/rlib/libffi.py
@@ -434,11 +434,12 @@
# XXX: it partially duplicate the code in clibffi.py
class CDLL(object):
- def __init__(self, libname, mode=-1):
+ def __init__(self, libname, mode=-1, lib=0):
"""Load the library, or raises DLOpenError."""
- self.lib = rffi.cast(DLLHANDLE, 0)
- with rffi.scoped_str2charp(libname) as ll_libname:
- self.lib = dlopen(ll_libname, mode)
+ self.lib = rffi.cast(DLLHANDLE, lib)
+ if lib == 0:
+ with rffi.scoped_str2charp(libname) as ll_libname:
+ self.lib = dlopen(ll_libname, mode)
def __del__(self):
if self.lib:
diff --git a/rpython/rlib/rvmprof/cintf.py b/rpython/rlib/rvmprof/cintf.py
--- a/rpython/rlib/rvmprof/cintf.py
+++ b/rpython/rlib/rvmprof/cintf.py
@@ -47,7 +47,10 @@
# Guessing a BSD-like Unix platform
compile_extra += ['-DVMPROF_UNIX']
compile_extra += ['-DVMPROF_MAC']
- _libs = []
+ if sys.platform.startswith('freebsd'):
+ _libs = ['unwind']
+ else:
+ _libs = []
eci_kwds = dict(
diff --git a/rpython/rtyper/lltypesystem/ll2ctypes.py b/rpython/rtyper/lltypesystem/ll2ctypes.py
--- a/rpython/rtyper/lltypesystem/ll2ctypes.py
+++ b/rpython/rtyper/lltypesystem/ll2ctypes.py
@@ -1147,7 +1147,7 @@
libc_name = get_libc_name() # Make sure the name is determined during import, not at runtime
if _FREEBSD:
RTLD_DEFAULT = -2 # see <dlfcn.h>
- rtld_default_lib = ctypes.CDLL("RTLD_DEFAULT", handle=RTLD_DEFAULT, **load_library_kwargs)
+ rtld_default_lib = ctypes.CDLL("ld-elf.so.1", handle=RTLD_DEFAULT, **load_library_kwargs)
# XXX is this always correct???
standard_c_lib = ctypes.CDLL(libc_name, **load_library_kwargs)
@@ -1243,7 +1243,7 @@
if cfunc is None:
if _FREEBSD and funcname in ('dlopen', 'fdlopen', 'dlsym', 'dlfunc', 'dlerror', 'dlclose'):
- cfunc = get_on_lib(rtld_default_lib, funcname)
+ cfunc = rtld_default_lib[funcname]
else:
cfunc = get_on_lib(standard_c_lib, funcname)
# XXX magic: on Windows try to load the function from 'kernel32' too
More information about the pypy-commit
mailing list