Author: Matti Picus <matti.pi...@gmail.com> Branch: unicode-utf8-py3 Changeset: r95022:9283282e9030 Date: 2018-08-22 12:23 +0300 http://bitbucket.org/pypy/pypy/changeset/9283282e9030/
Log: merge py3.5 into branch diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py --- a/pypy/interpreter/baseobjspace.py +++ b/pypy/interpreter/baseobjspace.py @@ -1520,10 +1520,19 @@ if readonly and flags & self.BUF_WRITABLE == self.BUF_WRITABLE: raise oefmt(self.w_BufferError, "Object is not writable.") + def _try_buffer_w(self, w_obj, flags): + if not we_are_translated(): + if w_obj.buffer_w.im_func != W_Root.buffer_w.im_func: + # when 'buffer_w()' is overridden in the subclass of + # W_Root, we need to specify __buffer="read" or + # __buffer="read-write" in the TypeDef. + assert type(w_obj).typedef.buffer is not None + return w_obj.buffer_w(self, flags) + def buffer_w(self, w_obj, flags): # New buffer interface, returns a buffer based on flags (PyObject_GetBuffer) try: - return w_obj.buffer_w(self, flags) + return self._try_buffer_w(w_obj, flags) except BufferInterfaceNotFound: raise oefmt(self.w_TypeError, "'%T' does not support the buffer interface", w_obj) @@ -1531,14 +1540,14 @@ def readbuf_w(self, w_obj): # Old buffer interface, returns a readonly buffer (PyObject_AsReadBuffer) try: - return w_obj.buffer_w(self, self.BUF_SIMPLE).as_readbuf() + return self._try_buffer_w(w_obj, self.BUF_SIMPLE).as_readbuf() except BufferInterfaceNotFound: self._getarg_error("bytes-like object", w_obj) def writebuf_w(self, w_obj): # Old buffer interface, returns a writeable buffer (PyObject_AsWriteBuffer) try: - return w_obj.buffer_w(self, self.BUF_WRITABLE).as_writebuf() + return self._try_buffer_w(w_obj, self.BUF_WRITABLE).as_writebuf() except (BufferInterfaceNotFound, OperationError): self._getarg_error("read-write bytes-like object", w_obj) @@ -1572,7 +1581,7 @@ # NB. CPython forbids surrogates here return StringBuffer(w_obj.text_w(self)) try: - return w_obj.buffer_w(self, self.BUF_SIMPLE).as_readbuf() + return self._try_buffer_w(w_obj, self.BUF_SIMPLE).as_readbuf() except BufferInterfaceNotFound: self._getarg_error("bytes or buffer", w_obj) elif code == 's#': @@ -1584,7 +1593,7 @@ if self.isinstance_w(w_obj, self.w_unicode): # NB. CPython forbids return w_obj.text_w(self) # surrogates here try: - return w_obj.buffer_w(self, self.BUF_SIMPLE).as_str() + return self._try_buffer_w(w_obj, self.BUF_SIMPLE).as_str() except BufferInterfaceNotFound: self._getarg_error("bytes or read-only buffer", w_obj) elif code == 'w*': diff --git a/pypy/interpreter/typedef.py b/pypy/interpreter/typedef.py --- a/pypy/interpreter/typedef.py +++ b/pypy/interpreter/typedef.py @@ -28,6 +28,9 @@ self.bases = bases # Used in cpyext to fill tp_as_buffer slots assert __buffer in {None, 'read-write', 'read'}, "Unknown value for __buffer" + for base in bases: + if __buffer is None: + __buffer = base.buffer self.buffer = __buffer self.heaptype = False self.hasdict = '__dict__' in rawdict diff --git a/pypy/module/_cffi_backend/cbuffer.py b/pypy/module/_cffi_backend/cbuffer.py --- a/pypy/module/_cffi_backend/cbuffer.py +++ b/pypy/module/_cffi_backend/cbuffer.py @@ -156,7 +156,7 @@ return MiniBuffer(LLBuffer(ptr, size), w_cdata) MiniBuffer.typedef = TypeDef( - "_cffi_backend.buffer", + "_cffi_backend.buffer", None, None, "read-write", __new__ = interp2app(MiniBuffer___new__), __len__ = interp2app(MiniBuffer.descr_len), __getitem__ = interp2app(MiniBuffer.descr_getitem), diff --git a/pypy/module/_rawffi/array.py b/pypy/module/_rawffi/array.py --- a/pypy/module/_rawffi/array.py +++ b/pypy/module/_rawffi/array.py @@ -191,7 +191,7 @@ W_ArrayInstance.typedef = TypeDef( - 'ArrayInstance', + 'ArrayInstance', None, None, "read-write", __repr__ = interp2app(W_ArrayInstance.descr_repr), __setitem__ = interp2app(W_ArrayInstance.descr_setitem), __getitem__ = interp2app(W_ArrayInstance.descr_getitem), @@ -215,7 +215,7 @@ self._free() W_ArrayInstanceAutoFree.typedef = TypeDef( - 'ArrayInstanceAutoFree', + 'ArrayInstanceAutoFree', None, None, "read-write", __repr__ = interp2app(W_ArrayInstance.descr_repr), __setitem__ = interp2app(W_ArrayInstance.descr_setitem), __getitem__ = interp2app(W_ArrayInstance.descr_getitem), diff --git a/pypy/module/_rawffi/callback.py b/pypy/module/_rawffi/callback.py --- a/pypy/module/_rawffi/callback.py +++ b/pypy/module/_rawffi/callback.py @@ -135,7 +135,7 @@ return W_CallbackPtr(space, w_callable, w_args, w_result, flags) W_CallbackPtr.typedef = TypeDef( - 'CallbackPtr', + 'CallbackPtr', None, None, "read", __new__ = interp2app(descr_new_callbackptr), byptr = interp2app(W_CallbackPtr.byptr), buffer = GetSetProperty(W_CallbackPtr.getbuffer), diff --git a/pypy/module/_rawffi/structure.py b/pypy/module/_rawffi/structure.py --- a/pypy/module/_rawffi/structure.py +++ b/pypy/module/_rawffi/structure.py @@ -379,7 +379,7 @@ W_StructureInstance.typedef = TypeDef( - 'StructureInstance', + 'StructureInstance', None, None, "read-write", __repr__ = interp2app(W_StructureInstance.descr_repr), __getattr__ = interp2app(W_StructureInstance.getattr), __setattr__ = interp2app(W_StructureInstance.setattr), @@ -401,7 +401,7 @@ self._free() W_StructureInstanceAutoFree.typedef = TypeDef( - 'StructureInstanceAutoFree', + 'StructureInstanceAutoFree', None, None, "read-write", __repr__ = interp2app(W_StructureInstance.descr_repr), __getattr__ = interp2app(W_StructureInstance.getattr), __setattr__ = interp2app(W_StructureInstance.setattr), diff --git a/pypy/module/cpyext/test/test_buffer.py b/pypy/module/cpyext/test/test_buffer.py --- a/pypy/module/cpyext/test/test_buffer.py +++ b/pypy/module/cpyext/test/test_buffer.py @@ -9,13 +9,21 @@ void* buf; Py_ssize_t buf_len; if (PyObject_AsWriteBuffer(args, &buf, &buf_len) < 0) { - PyErr_SetString(PyExc_ValueError, "bad value"); + //PyErr_SetString(PyExc_ValueError, "bad value"); return NULL; } return PyLong_FromLong(buf_len); """)]) assert module.write_buffer_len(bytearray(b'123')) == 3 assert module.write_buffer_len(array.array('i', [1, 2, 3])) == 12 + # + import _cffi_backend + BChar = _cffi_backend.new_primitive_type("char") + BCharPtr = _cffi_backend.new_pointer_type(BChar) + BCharArray = _cffi_backend.new_array_type(BCharPtr, None) + p = _cffi_backend.newp(BCharArray, b"abcde") + bb = _cffi_backend.buffer(p) + assert module.write_buffer_len(bb) == 6 class AppTestMmap(AppTestCpythonExtensionBase): diff --git a/pypy/module/cpyext/test/test_cpyext.py b/pypy/module/cpyext/test/test_cpyext.py --- a/pypy/module/cpyext/test/test_cpyext.py +++ b/pypy/module/cpyext/test/test_cpyext.py @@ -138,6 +138,7 @@ """Base class for all cpyext tests.""" spaceconfig = dict(usemodules=['cpyext', 'thread', 'struct', 'array', 'itertools', 'time', 'binascii', 'mmap', + '_cffi_backend', ]) @classmethod diff --git a/pypy/module/micronumpy/boxes.py b/pypy/module/micronumpy/boxes.py --- a/pypy/module/micronumpy/boxes.py +++ b/pypy/module/micronumpy/boxes.py @@ -656,7 +656,7 @@ def descr__getattr__(self, space, w_key): return space.getattr(self.w_obj, w_key) -W_GenericBox.typedef = TypeDef("numpy.generic", +W_GenericBox.typedef = TypeDef("numpy.generic", None, None, "read-write", __new__ = interp2app(W_GenericBox.descr__new__.im_func), __getitem__ = interp2app(W_GenericBox.descr_getitem), diff --git a/pypy/module/posix/interp_posix.py b/pypy/module/posix/interp_posix.py --- a/pypy/module/posix/interp_posix.py +++ b/pypy/module/posix/interp_posix.py @@ -2408,7 +2408,7 @@ if _WIN32: have_functions.append("HAVE_MS_WINDOWS") -def get_terminal_size(space, w_fd=None): +def _get_terminal_size(space, w_fd=None): if w_fd is None: fd = rfile.RFile(rfile.c_stdout(), close2=(None, None)).fileno() else: @@ -2448,7 +2448,13 @@ w_columns = space.newint(r_uint(winsize.c_ws_col)) w_lines = space.newint(r_uint(winsize.c_ws_row)) + return w_columns, w_lines +def get_terminal_size(space, w_fd=None): + try: + w_columns, w_lines = _get_terminal_size(space, w_fd) + except OSError as e: + raise wrap_oserror(space, e, eintr_retry=False) w_tuple = space.newtuple([w_columns, w_lines]) w_terminal_size = space.getattr(space.getbuiltinmodule(os.name), space.newtext('terminal_size')) diff --git a/pypy/module/posix/test/test_posix2.py b/pypy/module/posix/test/test_posix2.py --- a/pypy/module/posix/test/test_posix2.py +++ b/pypy/module/posix/test/test_posix2.py @@ -1488,6 +1488,16 @@ raises(OSError, os.getxattr, self.path, 'user.test') assert os.listxattr(self.path, follow_symlinks=False) == init_names + def test_get_terminal_size(self): + os = self.posix + for args in [(), (1,), (0,), (42421,)]: + try: + w, h = os.get_terminal_size(*args) + except (ValueError, OSError): + continue + assert isinstance(w, int) + assert isinstance(h, int) + class AppTestEnvironment(object): def setup_class(cls): diff --git a/pypy/objspace/fake/objspace.py b/pypy/objspace/fake/objspace.py --- a/pypy/objspace/fake/objspace.py +++ b/pypy/objspace/fake/objspace.py @@ -369,6 +369,9 @@ def warn(self, w_msg, w_warningcls, stacklevel=2): pass + def _try_buffer_w(self, w_obj, flags): + return w_obj.buffer_w(self, flags) + # ---------- def translates(self, func=None, argtypes=None, seeobj_w=[], **kwds): diff --git a/pypy/objspace/std/test/test_memoryobject.py b/pypy/objspace/std/test/test_memoryobject.py --- a/pypy/objspace/std/test/test_memoryobject.py +++ b/pypy/objspace/std/test/test_memoryobject.py @@ -376,7 +376,7 @@ return MockBuffer(space, self.w_list, self.w_dim, self.w_fmt, \ self.w_size, self.w_strides, self.w_shape) -W_MockArray.typedef = TypeDef("MockArray", +W_MockArray.typedef = TypeDef("MockArray", None, None, "read-write", __new__ = interp2app(W_MockArray.descr_new), ) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit