Author: Ronan Lamy <ronan.l...@gmail.com> Branch: PyBuffer Changeset: r91065:b87693784bb0 Date: 2017-04-17 18:17 +0100 http://bitbucket.org/pypy/pypy/changeset/b87693784bb0/
Log: simplify and document PyBuffer.getbytes() diff --git a/pypy/interpreter/buffer.py b/pypy/interpreter/buffer.py --- a/pypy/interpreter/buffer.py +++ b/pypy/interpreter/buffer.py @@ -19,7 +19,14 @@ "Returns an interp-level string with the whole content of the buffer." return ''.join(self._copy_buffer()) - def getbytes(self, start, stop, step, size): + def getbytes(self, start, size): + """Return `size` bytes starting at byte offset `start`. + + This is a low-level operation, it is up to the caller to ensure that + the data requested actually correspond to items accessible from the + PyBuffer. + Note that `start` may be negative, e.g. if the buffer is reversed. + """ raise NotImplementedError def setbytes(self, start, string): @@ -72,7 +79,7 @@ def _copy_buffer(self): if self.getndim() == 0: itemsize = self.getitemsize() - return [self.getbytes(0, itemsize, 1, itemsize)] + return [self.getbytes(0, itemsize)] data = [] self._copy_rec(0, data, 0) return data @@ -98,7 +105,7 @@ bytesize = self.getlength() copiedbytes = 0 for i in range(step): - bytes = self.getbytes(off, off+itemsize, 1, itemsize) + bytes = self.getbytes(off, itemsize) data.append(bytes) copiedbytes += len(bytes) off += strides[0] @@ -124,7 +131,7 @@ offset = self.get_offset(space, 0, idx) itemsize = self.getitemsize() # TODO: this probably isn't very fast - data = self.getbytes(offset, offset + itemsize, 1, itemsize) + data = self.getbytes(offset, itemsize) return self.value_from_bytes(space, data) def setitem_w(self, space, idx, w_obj): @@ -158,9 +165,8 @@ if dim >= self.getndim(): bytecount = (stride * dimshape) values_w = [ - self.value_from_bytes( - space, self.getbytes(pos, pos + itemsize, 1, itemsize)) - for pos in range(start, start + bytecount, stride)] + self.value_from_bytes(space, self.getbytes(pos, itemsize)) + for pos in range(start, start + bytecount, stride)] return space.newlist(values_w) items = [None] * dimshape @@ -186,9 +192,8 @@ def as_str(self): return self.data.as_str() - def getbytes(self, start, stop, step, size): - assert step == 1 - return self.data[start:stop] + def getbytes(self, start, size): + return self.data[start:start + size] def setbytes(self, offset, s): self.data.setslice(offset, s) diff --git a/pypy/module/array/interp_array.py b/pypy/module/array/interp_array.py --- a/pypy/module/array/interp_array.py +++ b/pypy/module/array/interp_array.py @@ -897,8 +897,8 @@ def as_str(self): return self.data.as_str() - def getbytes(self, start, stop, step, size): - return self.data.getslice(start, stop, step, size) + def getbytes(self, start, size): + return self.data[start:start + size] def setbytes(self, offset, s): return self.data.setslice(offset, s) diff --git a/pypy/module/cpyext/slotdefs.py b/pypy/module/cpyext/slotdefs.py --- a/pypy/module/cpyext/slotdefs.py +++ b/pypy/module/cpyext/slotdefs.py @@ -380,8 +380,8 @@ def getlength(self): return self.size - def getbytes(self, start, stop, step, size): - return ''.join([self.ptr[i] for i in range(start, stop, step)]) + def getbytes(self, start, size): + return ''.join([self.ptr[i] for i in range(start, start + size)]) def setbytes(self, start, string): # absolutely no safety checks, what could go wrong? 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 @@ -131,7 +131,7 @@ start = self._start_from_tuple(space, w_index) itemsize = self.getitemsize() - data = view.getbytes(start, start + itemsize, 1, itemsize) + data = view.getbytes(start, itemsize) return view.value_from_bytes(space, data) def _decode_index(self, space, w_index, is_slice): @@ -223,7 +223,7 @@ src_shape0 = slicelength src_stride0 = src.getstrides()[0] for i in range(src_shape0): - data.append(src.getbytes(off,off+itemsize,1,itemsize)) + data.append(src.getbytes(off, itemsize)) off += src_stride0 off = 0 dst_stride0 = self.getstrides()[0] * step @@ -589,7 +589,7 @@ class BufferSlice(PyBuffer): _immutable_ = True - _attrs_ = ['buf', 'readonly', 'shape', 'strides', 'offset', 'step'] + _attrs_ = ['buf', 'readonly', 'shape', 'strides', 'start', 'step'] def __init__(self, buf, start, step, length): self.buf = buf self.readonly = self.buf.readonly @@ -604,12 +604,9 @@ def getlength(self): return self.shape[0] * self.getitemsize() - def getbytes(self, start, stop, step, size): - if start == stop: - return '' # otherwise, adding self.offset might make them - # out of bounds + def getbytes(self, start, size): offset = self.start * self.buf.getstrides()[0] - return self.buf.getbytes(offset + start, offset + stop, step, size) + return self.buf.getbytes(offset + start, size) def setbytes(self, start, string): if len(string) == 0: @@ -661,8 +658,8 @@ def as_str_and_offset_maybe(self): return self.parent.as_str_and_offset_maybe() - def getbytes(self, start, stop, step, size): - return self.parent.getbytes(start, stop, step, size) + def getbytes(self, start, size): + return self.parent.getbytes(start, size) def setbytes(self, start, string): self.parent.setbytes(start, string) 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 @@ -337,8 +337,8 @@ def getformat(self): return self.format - def getbytes(self, start, stop, step, size): - return self.data[start:stop] + def getbytes(self, start, size): + return self.data[start:start + size] def getlength(self): return len(self.data) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit