Author: Ronan Lamy <ronan.l...@gmail.com> Branch: PyBuffer Changeset: r90861:7d94af72aafd Date: 2017-03-29 18:10 +0100 http://bitbucket.org/pypy/pypy/changeset/7d94af72aafd/
Log: Make sure that SubBuffer only receives BinaryBuffers diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py --- a/pypy/interpreter/baseobjspace.py +++ b/pypy/interpreter/baseobjspace.py @@ -1540,7 +1540,7 @@ self._getarg_error("bytes or read-only buffer", w_obj) elif code == 'w*': try: - return w_obj.buffer_w(self, self.BUF_WRITABLE) + return w_obj.buffer_w(self, self.BUF_WRITABLE).as_binary() except OperationError: pass except BufferInterfaceNotFound: @@ -1548,7 +1548,7 @@ self._getarg_error("read-write buffer", w_obj) elif code == 'y*': try: - return w_obj.buffer_w(self, self.BUF_SIMPLE) + return w_obj.buffer_w(self, self.BUF_SIMPLE).as_binary() except BufferInterfaceNotFound: self._getarg_error("bytes-like object", w_obj) elif code == 'y#': diff --git a/pypy/interpreter/buffer.py b/pypy/interpreter/buffer.py --- a/pypy/interpreter/buffer.py +++ b/pypy/interpreter/buffer.py @@ -219,7 +219,7 @@ _attrs_ = ['buffer', 'offset', 'size', 'readonly'] _immutable_ = True - #@signature(types.any(), types.instance(BinaryBuffer), types.int(), types.int(), returns=types.none()) + @signature(types.any(), types.instance(BinaryBuffer), types.int(), types.int(), returns=types.none()) def __init__(self, buffer, offset, size): self.readonly = buffer.readonly if isinstance(buffer, SubBuffer): # don't nest them diff --git a/pypy/module/_io/interp_bufferedio.py b/pypy/module/_io/interp_bufferedio.py --- a/pypy/module/_io/interp_bufferedio.py +++ b/pypy/module/_io/interp_bufferedio.py @@ -577,6 +577,7 @@ return space.newbytes(builder.build()) def _raw_read(self, space, buffer, start, length): + assert buffer is not None length = intmask(length) start = intmask(start) w_buf = space.newbuffer(SimpleBuffer(SubBuffer(buffer, start, length))) diff --git a/pypy/module/struct/interp_struct.py b/pypy/module/struct/interp_struct.py --- a/pypy/module/struct/interp_struct.py +++ b/pypy/module/struct/interp_struct.py @@ -113,7 +113,7 @@ def do_unpack_from(space, format, w_buffer, offset=0): size = _calcsize(space, format) - buf = space.buffer_w(w_buffer, space.BUF_SIMPLE) + buf = space.buffer_w(w_buffer, space.BUF_SIMPLE).as_binary() if offset < 0: offset += buf.getlength() if offset < 0 or (buf.getlength() - offset) < size: @@ -126,7 +126,7 @@ class W_UnpackIter(W_Root): def __init__(self, space, w_struct, w_buffer): - buf = space.buffer_w(w_buffer, space.BUF_SIMPLE) + buf = space.buffer_w(w_buffer, space.BUF_SIMPLE).as_binary() if w_struct.size <= 0: raise oefmt(get_error(space), "cannot iteratively unpack with a struct of length %d", diff --git a/pypy/objspace/std/memoryobject.py b/pypy/objspace/std/memoryobject.py --- a/pypy/objspace/std/memoryobject.py +++ b/pypy/objspace/std/memoryobject.py @@ -149,7 +149,7 @@ return self._tolist(space, buf, self.getlength(), itemsize, fmt, self.getstrides()) else: - return self._tolist_rec(space, buf, 0, 0, fmt) + return self._tolist_rec(space, buf.as_binary(), 0, 0, fmt) def _tolist(self, space, buf, bytecount, itemsize, fmt, strides=None): # TODO: this probably isn't very fast @@ -179,7 +179,7 @@ orig_buf = buf for i in range(dimshape): - buf = SubBuffer(orig_buf, start, stride) + buf = SubBuffer(orig_buf.as_binary(), start, stride) item = self._tolist_rec(space, buf, start, idim+1, fmt) items[i] = item start += stride @@ -233,7 +233,7 @@ start = self._start_from_tuple(space, w_index) - buf = SubBuffer(self.buf, start, view.getitemsize()) + buf = SubBuffer(self.buf.as_binary(), start, view.getitemsize()) fmtiter = UnpackFormatIterator(space, buf) fmtiter.interpret(fmt) return fmtiter.result_w[0] @@ -268,7 +268,7 @@ return space.newint(ord(ch)) else: # TODO: this probably isn't very fast - buf = SubBuffer(self.buf, idx, itemsize) + buf = SubBuffer(self.buf.as_binary(), idx, itemsize) fmtiter = UnpackFormatIterator(space, buf) fmtiter.length = buf.getlength() fmtiter.interpret(self.buf.getformat()) @@ -347,14 +347,12 @@ src = space.buffer_w(w_obj, space.BUF_CONTIG_RO) dst_strides = self.getstrides() dim = 0 - dst = SubBuffer(self.buf, start * itemsize, slicelength * itemsize) + dst = SubBuffer(self.buf.as_binary(), start * itemsize, slicelength * itemsize) src_stride0 = dst_strides[dim] off = 0 src_shape0 = slicelength src_stride0 = src.getstrides()[0] - if isinstance(w_obj, W_MemoryView): - src_stride0 = w_obj.getstrides()[0] for i in range(src_shape0): data.append(src.getslice(off,off+itemsize,1,itemsize)) off += src_stride0 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 @@ -323,6 +323,9 @@ self.data.append(c) self.data = ''.join(self.data) + def as_str(self): + return self.data + def getformat(self): return self.format _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit