Author: Carl Friedrich Bolz-Tereick <cfb...@gmx.de> Branch: py3.6 Changeset: r94600:455b5c86ee7b Date: 2018-05-16 14:38 +0200 http://bitbucket.org/pypy/pypy/changeset/455b5c86ee7b/
Log: merge py3.5 diff --git a/lib-python/conftest.py b/lib-python/conftest.py --- a/lib-python/conftest.py +++ b/lib-python/conftest.py @@ -423,6 +423,7 @@ RegrTest('test_sys_setprofile.py', core=True), RegrTest('test_sys_settrace.py', core=True), RegrTest('test_sysconfig.py'), + RegrTest('test_sysconfig_pypy.py'), RegrTest('test_syslog.py'), RegrTest('test_tarfile.py'), RegrTest('test_tcl.py'), diff --git a/pypy/interpreter/astcompiler/test/test_validate.py b/pypy/interpreter/astcompiler/test/test_validate.py --- a/pypy/interpreter/astcompiler/test/test_validate.py +++ b/pypy/interpreter/astcompiler/test/test_validate.py @@ -1,4 +1,5 @@ import os +from pytest import raises from pypy.interpreter.error import OperationError from pypy.interpreter.baseobjspace import W_Root from pypy.interpreter.astcompiler import ast diff --git a/pypy/interpreter/test/test_app_main.py b/pypy/interpreter/test/test_app_main.py --- a/pypy/interpreter/test/test_app_main.py +++ b/pypy/interpreter/test/test_app_main.py @@ -375,7 +375,7 @@ child.expect('>>>') def test_atexit(self): - skip("Python3 atexit is a builtin module") + py.test.skip("Python3 atexit is a builtin module") child = self.spawn([]) child.expect('>>> ') child.sendline('def f(): print("foobye")') @@ -525,9 +525,9 @@ def test_options_i_m(self, monkeypatch): if sys.platform == "win32": - skip("close_fds is not supported on Windows platforms") + py.test.skip("close_fds is not supported on Windows platforms") if not hasattr(runpy, '_run_module_as_main'): - skip("requires CPython >= 2.6") + py.test.skip("requires CPython >= 2.6") p = os.path.join(os.path.realpath(os.path.dirname(__file__)), 'mymodule.py') p = os.path.abspath(p) monkeypatch.chdir(os.path.dirname(app_main)) @@ -557,7 +557,7 @@ def test_options_u_i(self): if sys.platform == "win32": - skip("close_fds is not supported on Windows platforms") + py.test.skip("close_fds is not supported on Windows platforms") import subprocess, select, os pipe = subprocess.Popen([get_python3(), app_main, "-u", "-i"], stdout=subprocess.PIPE, @@ -614,7 +614,7 @@ del os.environ['PYTHONINSPECT_'] def test_stdout_flushes_before_stdin_blocks(self): - skip("Python3 does not implement this behavior") + py.test.skip("Python3 does not implement this behavior") # This doesn't really test app_main.py, but a behavior that # can only be checked on top of py.py with pexpect. path = getscript(""" @@ -632,7 +632,7 @@ def test_no_space_before_argument(self, monkeypatch): if not hasattr(runpy, '_run_module_as_main'): - skip("requires CPython >= 2.6") + py.test.skip("requires CPython >= 2.6") child = self.spawn(['-cprint("hel" + "lo")']) child.expect('hello') @@ -753,7 +753,7 @@ def test_option_m(self, monkeypatch): if not hasattr(runpy, '_run_module_as_main'): - skip("requires CPython >= 2.6") + py.test.skip("requires CPython >= 2.6") p = os.path.join(os.path.realpath(os.path.dirname(__file__)), 'mymodule.py') p = os.path.abspath(p) monkeypatch.chdir(os.path.dirname(app_main)) @@ -767,7 +767,7 @@ def test_option_m_package(self, monkeypatch): if not hasattr(runpy, '_run_module_as_main'): - skip("requires CPython >= 2.6") + py.test.skip("requires CPython >= 2.6") p = os.path.join(os.path.realpath(os.path.dirname(__file__)), 'mypackage', '__main__.py') p = os.path.abspath(p) diff --git a/pypy/interpreter/unicodehelper.py b/pypy/interpreter/unicodehelper.py --- a/pypy/interpreter/unicodehelper.py +++ b/pypy/interpreter/unicodehelper.py @@ -168,6 +168,222 @@ return decode_utf8(space, string, allow_surrogates=True) # ____________________________________________________________ +# utf-16 + +def str_decode_utf_16(s, size, errors, final=True, + errorhandler=None): + result, length, byteorder = str_decode_utf_16_helper(s, size, errors, final, + errorhandler, "native", + 'utf-16-' + BYTEORDER2) + return result, length + +def str_decode_utf_16_be(s, size, errors, final=True, + errorhandler=None): + result, length, byteorder = str_decode_utf_16_helper(s, size, errors, final, + errorhandler, "big", + 'utf-16-be') + return result, length + +def str_decode_utf_16_le(s, size, errors, final=True, + errorhandler=None): + result, length, byteorder = str_decode_utf_16_helper(s, size, errors, final, + errorhandler, "little", + 'utf-16-le') + return result, length + +def str_decode_utf_16_helper(s, size, errors, final=True, + errorhandler=None, + byteorder="native", + public_encoding_name='utf16'): + if errorhandler is None: + errorhandler = default_unicode_error_decode + bo = 0 + + if BYTEORDER == 'little': + ihi = 1 + ilo = 0 + else: + ihi = 0 + ilo = 1 + + # Check for BOM marks (U+FEFF) in the input and adjust current + # byte order setting accordingly. In native mode, the leading BOM + # mark is skipped, in all other modes, it is copied to the output + # stream as-is (giving a ZWNBSP character). + pos = 0 + if byteorder == 'native': + if size >= 2: + bom = (ord(s[ihi]) << 8) | ord(s[ilo]) + if BYTEORDER == 'little': + if bom == 0xFEFF: + pos += 2 + bo = -1 + elif bom == 0xFFFE: + pos += 2 + bo = 1 + else: + if bom == 0xFEFF: + pos += 2 + bo = 1 + elif bom == 0xFFFE: + pos += 2 + bo = -1 + elif byteorder == 'little': + bo = -1 + else: + bo = 1 + if size == 0: + return u'', 0, bo + if bo == -1: + # force little endian + ihi = 1 + ilo = 0 + + elif bo == 1: + # force big endian + ihi = 0 + ilo = 1 + + result = UnicodeBuilder(size // 2) + + #XXX I think the errors are not correctly handled here + while pos < size: + # remaining bytes at the end? (size should be even) + if len(s) - pos < 2: + if not final: + break + r, pos = errorhandler(errors, public_encoding_name, + "truncated data", + s, pos, len(s)) + result.append(r) + if len(s) - pos < 2: + break + ch = (ord(s[pos + ihi]) << 8) | ord(s[pos + ilo]) + pos += 2 + if ch < 0xD800 or ch > 0xDFFF: + result.append(unichr(ch)) + continue + # UTF-16 code pair: + if len(s) - pos < 2: + pos -= 2 + if not final: + break + errmsg = "unexpected end of data" + r, pos = errorhandler(errors, public_encoding_name, + errmsg, s, pos, len(s)) + result.append(r) + if len(s) - pos < 2: + break + elif 0xD800 <= ch <= 0xDBFF: + ch2 = (ord(s[pos+ihi]) << 8) | ord(s[pos+ilo]) + pos += 2 + if 0xDC00 <= ch2 <= 0xDFFF: + if MAXUNICODE < 65536: + result.append(unichr(ch)) + result.append(unichr(ch2)) + else: + result.append(UNICHR((((ch & 0x3FF)<<10) | + (ch2 & 0x3FF)) + 0x10000)) + continue + else: + r, pos = errorhandler(errors, public_encoding_name, + "illegal UTF-16 surrogate", + s, pos - 4, pos - 2) + result.append(r) + else: + r, pos = errorhandler(errors, public_encoding_name, + "illegal encoding", + s, pos - 2, pos) + result.append(r) + return result.build(), pos, bo + +def _STORECHAR(result, CH, byteorder): + hi = chr(((CH) >> 8) & 0xff) + lo = chr((CH) & 0xff) + if byteorder == 'little': + result.append(lo) + result.append(hi) + else: + result.append(hi) + result.append(lo) + +def unicode_encode_utf_16_helper(s, size, errors, + errorhandler=None, + allow_surrogates=True, + byteorder='little', + public_encoding_name='utf16'): + if errorhandler is None: + errorhandler = default_unicode_error_encode + if size == 0: + if byteorder == 'native': + result = StringBuilder(2) + _STORECHAR(result, 0xFEFF, BYTEORDER) + return result.build() + return "" + + result = StringBuilder(size * 2 + 2) + if byteorder == 'native': + _STORECHAR(result, 0xFEFF, BYTEORDER) + byteorder = BYTEORDER + + pos = 0 + while pos < size: + ch = ord(s[pos]) + pos += 1 + + if ch < 0xD800: + _STORECHAR(result, ch, byteorder) + elif ch >= 0x10000: + _STORECHAR(result, 0xD800 | ((ch-0x10000) >> 10), byteorder) + _STORECHAR(result, 0xDC00 | ((ch-0x10000) & 0x3FF), byteorder) + elif ch >= 0xE000 or allow_surrogates: + _STORECHAR(result, ch, byteorder) + else: + ru, rs, pos = errorhandler(errors, public_encoding_name, + 'surrogates not allowed', + s, pos-1, pos) + if rs is not None: + # py3k only + if len(rs) % 2 != 0: + errorhandler('strict', public_encoding_name, + 'surrogates not allowed', + s, pos-1, pos) + result.append(rs) + continue + for ch in ru: + if ord(ch) < 0xD800: + _STORECHAR(result, ord(ch), byteorder) + else: + errorhandler('strict', public_encoding_name, + 'surrogates not allowed', + s, pos-1, pos) + continue + + return result.build() + +def unicode_encode_utf_16(s, size, errors, + errorhandler=None, + allow_surrogates=True): + return unicode_encode_utf_16_helper(s, size, errors, errorhandler, + allow_surrogates, "native", + 'utf-16-' + BYTEORDER2) + +def unicode_encode_utf_16_be(s, size, errors, + errorhandler=None, + allow_surrogates=True): + return unicode_encode_utf_16_helper(s, size, errors, errorhandler, + allow_surrogates, "big", + 'utf-16-be') + +def unicode_encode_utf_16_le(s, size, errors, + errorhandler=None, + allow_surrogates=True): + return unicode_encode_utf_16_helper(s, size, errors, errorhandler, + allow_surrogates, "little", + 'utf-16-le') + + +# ____________________________________________________________ # utf-32 def str_decode_utf_32(s, size, errors, final=True, diff --git a/pypy/module/_codecs/interp_codecs.py b/pypy/module/_codecs/interp_codecs.py --- a/pypy/module/_codecs/interp_codecs.py +++ b/pypy/module/_codecs/interp_codecs.py @@ -621,8 +621,6 @@ try: func = getattr(unicodehelper, impl_name) except AttributeError: - if hasattr(runicode, 'py3k_' + impl_name): - impl_name = 'py3k_' + impl_name func = getattr(runicode, impl_name) return func diff --git a/pypy/objspace/std/test/test_iterobject.py b/pypy/objspace/std/test/test_iterobject.py --- a/pypy/objspace/std/test/test_iterobject.py +++ b/pypy/objspace/std/test/test_iterobject.py @@ -1,3 +1,4 @@ +import pytest from pypy.objspace.std.iterobject import W_SeqIterObject from pypy.interpreter.error import OperationError @@ -11,8 +12,8 @@ self.body0(w_iter) def body0(self, w_iter): - raises(OperationError, self.space.next, w_iter) - raises(OperationError, self.space.next, w_iter) + pytest.raises(OperationError, self.space.next, w_iter) + pytest.raises(OperationError, self.space.next, w_iter) def test_iter(self): w = self.space.wrap diff --git a/pypy/objspace/std/test/test_listobject.py b/pypy/objspace/std/test/test_listobject.py --- a/pypy/objspace/std/test/test_listobject.py +++ b/pypy/objspace/std/test/test_listobject.py @@ -120,8 +120,8 @@ assert self.space.eq_w(self.space.next(w_iter), w(5)) assert self.space.eq_w(self.space.next(w_iter), w(3)) assert self.space.eq_w(self.space.next(w_iter), w(99)) - raises(OperationError, self.space.next, w_iter) - raises(OperationError, self.space.next, w_iter) + py.test.raises(OperationError, self.space.next, w_iter) + py.test.raises(OperationError, self.space.next, w_iter) def test_contains(self): w = self.space.wrap diff --git a/pypy/objspace/std/test/test_setstrategies.py b/pypy/objspace/std/test/test_setstrategies.py --- a/pypy/objspace/std/test/test_setstrategies.py +++ b/pypy/objspace/std/test/test_setstrategies.py @@ -1,3 +1,4 @@ +import pytest from pypy.objspace.std.setobject import W_SetObject from pypy.objspace.std.setobject import ( BytesIteratorImplementation, BytesSetStrategy, EmptySetStrategy, @@ -58,7 +59,7 @@ s1 = W_SetObject(self.space, self.wrapped([1,2,3,4,5])) s2 = W_SetObject(self.space, self.wrapped([4,5, "six", "seven"])) s3 = s1.intersect(s2) - skip("for now intersection with ObjectStrategy always results in another ObjectStrategy") + pytest.skip("for now intersection with ObjectStrategy always results in another ObjectStrategy") assert s3.strategy is self.space.fromcache(IntegerSetStrategy) def test_clear(self): @@ -93,7 +94,7 @@ s1 = W_SetObject(self.space, self.wrapped([1,2,3,4,5])) s1.descr_discard(self.space, self.space.wrap("five")) - skip("currently not supported") + pytest.skip("currently not supported") assert s1.strategy is self.space.fromcache(IntegerSetStrategy) set_discard__Set_ANY(self.space, s1, self.space.wrap(FakeInt(5))) @@ -112,7 +113,7 @@ s1 = W_SetObject(self.space, self.wrapped([1,2,3,4,5])) assert not s1.has_key(self.space.wrap("five")) - skip("currently not supported") + pytest.skip("currently not supported") assert s1.strategy is self.space.fromcache(IntegerSetStrategy) assert s1.has_key(self.space.wrap(FakeInt(2))) diff --git a/pypy/objspace/std/test/test_tupleobject.py b/pypy/objspace/std/test/test_tupleobject.py --- a/pypy/objspace/std/test/test_tupleobject.py +++ b/pypy/objspace/std/test/test_tupleobject.py @@ -1,3 +1,4 @@ +import pytest from pypy.interpreter.error import OperationError from pypy.objspace.std.tupleobject import W_TupleObject @@ -42,8 +43,8 @@ assert self.space.eq_w(self.space.next(w_iter), w(5)) assert self.space.eq_w(self.space.next(w_iter), w(3)) assert self.space.eq_w(self.space.next(w_iter), w(99)) - raises(OperationError, self.space.next, w_iter) - raises(OperationError, self.space.next, w_iter) + pytest.raises(OperationError, self.space.next, w_iter) + pytest.raises(OperationError, self.space.next, w_iter) def test_contains(self): w = self.space.wrap _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit