Author: Ronan Lamy <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit