Author: Ronan Lamy <ronan.l...@gmail.com> Branch: PyBuffer-backport Changeset: r91204:4f1fa0d61a99 Date: 2017-05-08 19:13 +0100 http://bitbucket.org/pypy/pypy/changeset/4f1fa0d61a99/
Log: progress diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py --- a/pypy/interpreter/baseobjspace.py +++ b/pypy/interpreter/baseobjspace.py @@ -1504,10 +1504,15 @@ 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() + except OperationError: + self._getarg_error("convertible to a buffer", w_obj) + except BufferInterfaceNotFound: + pass + try: return w_obj.readbuf_w(self) except BufferInterfaceNotFound: - raise oefmt(self.w_TypeError, - "expected a readable buffer object") + self._getarg_error("convertible to a buffer", w_obj) def writebuf_w(self, w_obj): # Old buffer interface, returns a writeable buffer (PyObject_AsWriteBuffer) @@ -1549,12 +1554,10 @@ if self.isinstance_w(w_obj, self.w_unicode): return self.str(w_obj).readbuf_w(self) try: - return w_obj.buffer_w(self, 0) - except BufferInterfaceNotFound: - pass - try: - return w_obj.readbuf_w(self) - except BufferInterfaceNotFound: + return self.readbuf_w(w_obj) + except OperationError as e: + if not e.match(self, self.w_TypeError): + raise self._getarg_error("string or buffer", w_obj) elif code == 's#': if self.isinstance_w(w_obj, self.w_bytes): 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 @@ -4,6 +4,7 @@ from pypy.module._cffi_backend import cdataobj, ctypeptr, ctypearray from pypy.module._cffi_backend import ctypestruct from pypy.objspace.std.bufferobject import W_Buffer +from pypy.interpreter.buffer import SimpleView from rpython.rlib.buffer import Buffer from rpython.rtyper.annlowlevel import llstr @@ -60,7 +61,7 @@ if space.isinstance_w(w_other, space.w_unicode): return space.w_NotImplemented try: - other_buf = space.buffer_w(w_other, space.BUF_SIMPLE) + other_buf = space.readbuf_w(w_other) except OperationError as e: if e.async(space): raise diff --git a/pypy/module/_cffi_backend/func.py b/pypy/module/_cffi_backend/func.py --- a/pypy/module/_cffi_backend/func.py +++ b/pypy/module/_cffi_backend/func.py @@ -105,24 +105,10 @@ # ____________________________________________________________ def _fetch_as_read_buffer(space, w_x): - # xxx do we really need to implement the same mess as in CPython 2.7 - # w.r.t. buffers and memoryviews?? - try: - buf = space.readbuf_w(w_x) - except OperationError as e: - if not e.match(space, space.w_TypeError): - raise - buf = space.buffer_w(w_x, space.BUF_SIMPLE) - return buf + return space.readbuf_w(w_x) def _fetch_as_write_buffer(space, w_x): - try: - buf = space.writebuf_w(w_x) - except OperationError as e: - if not e.match(space, space.w_TypeError): - raise - buf = space.buffer_w(w_x, space.BUF_WRITABLE) - return buf + return space.writebuf_w(w_x) @unwrap_spec(w_ctype=ctypeobj.W_CType) def from_buffer(space, w_ctype, w_x): diff --git a/pypy/module/_rawffi/buffer.py b/pypy/module/_rawffi/buffer.py --- a/pypy/module/_rawffi/buffer.py +++ b/pypy/module/_rawffi/buffer.py @@ -1,5 +1,6 @@ +from rpython.rtyper.lltypesystem import rffi + from rpython.rlib.buffer import Buffer -from rpython.rtyper.lltypesystem import rffi # XXX not the most efficient implementation diff --git a/pypy/module/_rawffi/interp_rawffi.py b/pypy/module/_rawffi/interp_rawffi.py --- a/pypy/module/_rawffi/interp_rawffi.py +++ b/pypy/module/_rawffi/interp_rawffi.py @@ -1,5 +1,6 @@ import sys from pypy.interpreter.baseobjspace import W_Root +from pypy.interpreter.buffer import SimpleView from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import interp_attrproperty @@ -371,13 +372,7 @@ self._ll_buffer = self.ll_buffer def buffer_w(self, space, flags): - return RawFFIBuffer(self) - - def readbuf_w(self, space): - return RawFFIBuffer(self) - - def writebuf_w(self, space): - return RawFFIBuffer(self) + return SimpleView(RawFFIBuffer(self)) def getrawsize(self): raise NotImplementedError("abstract base class") diff --git a/pypy/module/struct/test/test_struct.py b/pypy/module/struct/test/test_struct.py --- a/pypy/module/struct/test/test_struct.py +++ b/pypy/module/struct/test/test_struct.py @@ -382,6 +382,7 @@ raises(self.struct.error, self.struct.unpack, "i", b) def test_pack_unpack_buffer(self): + import sys import array b = array.array('c', '\x00' * 19) sz = self.struct.calcsize("ii") @@ -391,9 +392,11 @@ self.struct.pack("ii", 17, 42) + '\x00' * (19-sz-2)) exc = raises(TypeError, self.struct.pack_into, "ii", buffer(b), 0, 17, 42) - assert str(exc.value) == "must be read-write buffer, not buffer" + if '__pypy__' in sys.modules: + assert str(exc.value) == "must be read-write buffer, not buffer" exc = raises(TypeError, self.struct.pack_into, "ii", 'test', 0, 17, 42) - assert str(exc.value) == "must be read-write buffer, not str" + if '__pypy__' in sys.modules: + assert str(exc.value) == "must be read-write buffer, not str" exc = raises(self.struct.error, self.struct.pack_into, "ii", b[0:1], 0, 17, 42) assert str(exc.value) == "pack_into requires a buffer of at least 8 bytes" diff --git a/pypy/objspace/std/strbufobject.py b/pypy/objspace/std/strbufobject.py --- a/pypy/objspace/std/strbufobject.py +++ b/pypy/objspace/std/strbufobject.py @@ -2,9 +2,9 @@ import py -from pypy.objspace.std.bytesobject import (W_AbstractBytesObject, - W_BytesObject, StringBuffer) +from pypy.objspace.std.bytesobject import W_AbstractBytesObject, W_BytesObject from pypy.interpreter.gateway import interp2app, unwrap_spec +from pypy.interpreter.buffer import SimpleView, StringBuffer from pypy.interpreter.error import OperationError from rpython.rlib.rstring import StringBuilder @@ -38,10 +38,7 @@ return self.force() def buffer_w(self, space, flags): - return StringBuffer(self.force()) - - def readbuf_w(self, space): - return StringBuffer(self.force()) + return SimpleView(StringBuffer(self.force())) def descr_len(self, space): return space.newint(self.length) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit