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

Reply via email to