Author: Ronan Lamy <[email protected]>
Branch: PyBuffer
Changeset: r91123:10cb464da2fc
Date: 2017-04-25 15:38 +0100
http://bitbucket.org/pypy/pypy/changeset/10cb464da2fc/

Log:    Move new_slice() method to PyBuffer, and BufferSlice to
        pypy.interpreter.buffer

diff --git a/pypy/interpreter/buffer.py b/pypy/interpreter/buffer.py
--- a/pypy/interpreter/buffer.py
+++ b/pypy/interpreter/buffer.py
@@ -141,6 +141,9 @@
         data = self.getbytes(offset, itemsize)
         return self.value_from_bytes(space, data)
 
+    def new_slice(self, start, step, slicelength):
+        return BufferSlice(self, start, step, slicelength)
+
     def setitem_w(self, space, idx, w_obj):
         offset = self.get_offset(space, 0, idx)
         itemsize = self.getitemsize()
@@ -246,10 +249,73 @@
         ch = self.data[idx]
         return space.newint(ord(ch))
 
+    def new_slice(self, start, step, slicelength):
+        if step == 1:
+            return SimpleBuffer(SubBuffer(self.data, start, slicelength))
+        else:
+            return BufferSlice(self, start, step, slicelength)
+
     def setitem_w(self, space, idx, w_obj):
         idx = self.get_offset(space, 0, idx)
         self.data[idx] = space.byte_w(w_obj)
 
+class BufferSlice(PyBuffer):
+    _immutable_ = True
+    _attrs_ = ['buf', 'readonly', 'shape', 'strides', 'start', 'step']
+    def __init__(self, buf, start, step, length):
+        self.buf = buf
+        self.readonly = self.buf.readonly
+        self.strides = buf.getstrides()[:]
+        itemsize = buf.getitemsize()
+        self.start = start
+        self.step = step
+        self.strides[0] *= step
+        self.shape = buf.getshape()[:]
+        self.shape[0] = length
+
+    def getlength(self):
+        return self.shape[0] * self.getitemsize()
+
+    def getbytes(self, start, size):
+        offset = self.start * self.buf.getstrides()[0]
+        return self.buf.getbytes(offset + start, size)
+
+    def setbytes(self, start, string):
+        if len(string) == 0:
+            return        # otherwise, adding self.offset might make 'start'
+                          # out of bounds
+        offset = self.start * self.buf.getstrides()[0]
+        self.buf.setbytes(offset + start, string)
+
+    def get_raw_address(self):
+        from rpython.rtyper.lltypesystem import rffi
+        offset = self.start * self.buf.getstrides()[0]
+        return rffi.ptradd(self.buf.get_raw_address(), offset)
+
+    def getformat(self):
+        return self.buf.getformat()
+
+    def getitemsize(self):
+        return self.buf.getitemsize()
+
+    def getndim(self):
+        return self.buf.getndim()
+
+    def getshape(self):
+        return self.shape
+
+    def getstrides(self):
+        return self.strides
+
+    def parent_index(self, idx):
+        return self.start + self.step * idx
+
+    def w_getitem(self, space, idx):
+        return self.buf.w_getitem(space, self.parent_index(idx))
+
+    def setitem_w(self, space, idx, w_obj):
+        return self.buf.setitem_w(space, self.parent_index(idx), w_obj)
+
 
 class BinaryBuffer(object):
     """Base class for buffers of bytes"""
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
@@ -160,19 +160,11 @@
             else:
                 raise oefmt(space.w_NotImplementedError, "multi-dimensional 
sub-views are not implemented")
         elif is_slice:
-            return self.new_slice(start, stop, step, slicelength, 0)
+            return W_MemoryView(self.buf.new_slice(start, step, slicelength))
         # multi index is handled at the top of this function
         else:
             raise TypeError("memoryview: invalid slice key")
 
-    def new_slice(self, start, stop, step, slicelength, dim):
-        pybuf = self.buf
-        if step == 1 and isinstance(pybuf, SimpleBuffer):
-            sliced = SimpleBuffer(SubBuffer(pybuf.data, start, slicelength))
-        else:
-            sliced = BufferSlice(pybuf, start, step, slicelength)
-        return W_MemoryView(sliced)
-
     def init_len(self):
         self.length = self.bytecount_from_shape()
 
@@ -593,63 +585,6 @@
                 _IsFortranContiguous(ndim, shape, strides, itemsize))
     return 0
 
-class BufferSlice(PyBuffer):
-    _immutable_ = True
-    _attrs_ = ['buf', 'readonly', 'shape', 'strides', 'start', 'step']
-    def __init__(self, buf, start, step, length):
-        self.buf = buf
-        self.readonly = self.buf.readonly
-        self.strides = buf.getstrides()[:]
-        itemsize = buf.getitemsize()
-        self.start = start
-        self.step = step
-        self.strides[0] *= step
-        self.shape = buf.getshape()[:]
-        self.shape[0] = length
-
-    def getlength(self):
-        return self.shape[0] * self.getitemsize()
-
-    def getbytes(self, start, size):
-        offset = self.start * self.buf.getstrides()[0]
-        return self.buf.getbytes(offset + start, size)
-
-    def setbytes(self, start, string):
-        if len(string) == 0:
-            return        # otherwise, adding self.offset might make 'start'
-                          # out of bounds
-        offset = self.start * self.buf.getstrides()[0]
-        self.buf.setbytes(offset + start, string)
-
-    def get_raw_address(self):
-        from rpython.rtyper.lltypesystem import rffi
-        offset = self.start * self.buf.getstrides()[0]
-        return rffi.ptradd(self.buf.get_raw_address(), offset)
-
-    def getformat(self):
-        return self.buf.getformat()
-
-    def getitemsize(self):
-        return self.buf.getitemsize()
-
-    def getndim(self):
-        return self.buf.getndim()
-
-    def getshape(self):
-        return self.shape
-
-    def getstrides(self):
-        return self.strides
-
-    def parent_index(self, idx):
-        return self.start + self.step * idx
-
-    def w_getitem(self, space, idx):
-        return self.buf.w_getitem(space, self.parent_index(idx))
-
-    def setitem_w(self, space, idx, w_obj):
-        return self.buf.setitem_w(space, self.parent_index(idx), w_obj)
-
 
 class BufferViewBase(PyBuffer):
     _immutable_ = True
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to