Author: Ronan Lamy <ronan.l...@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 + +@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) + +@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) + +@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) + +@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 + +@given(st.binary(), st.binary()) +def test_startswith_basic(u, v): + assert u.startswith(v) is (u[:len(v)] == v) + +@example(b'x', b'', 1) +@example(b'x', b'', 2) +@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 + +@example(b'x', b'', 1, 0) +@example(b'xx', b'', -1, 0) +@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 + +@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) + +@example(b'x', b'', 1) +@example(b'x', b'', 2) +@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 + +@example(b'x', b'', 1, 0) +@example(b'xx', b'', -1, 0) +@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) + +@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) + +@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) + +@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) + +@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 + +@given(st.text(), st.text()) +def test_startswith_basic(u, v): + assert u.startswith(v) is (u[:len(v)] == v) + +@example(u'x', u'', 1) +@example(u'x', u'', 2) +@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 + +@example(u'x', u'', 1, 0) +@example(u'xx', u'', -1, 0) +@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 + +@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) + +@example(u'x', u'', 1) +@example(u'x', u'', 2) +@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 + +@example(u'x', u'', 1, 0) +@example(u'xx', u'', -1, 0) +@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()) -@unwrap_spec(name='fsencode_or_none', mode=int) -def descr_new_cdll(space, w_type, name, mode=-1): - return W_CDLL(space, name, mode) +@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 -@unwrap_spec(name='fsencode_or_none', mode=int) -def descr_new_windll(space, w_type, name, mode=-1): - return W_WinDLL(space, name, mode) +@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 _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit