Author: Richard Plangger <[email protected]>
Branch: py3.5-memoryview
Changeset: r86735:0b1786c769bb
Date: 2016-08-30 15:21 +0200
http://bitbucket.org/pypy/pypy/changeset/0b1786c769bb/

Log:    pass another test for extended slicing by implementing copying for
        multi dim. buffer/memoryviews

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
@@ -109,9 +109,35 @@
     descr_ne = _make_descr__cmp('ne')
 
     def as_str(self):
+        return ''.join(self.copy_buffer())
+
+    def copy_buffer(self):
         buf = self.buf
         n_bytes = buf.getlength()
-        return buf.getslice(0, n_bytes, 1, n_bytes)
+        data = []
+        self._copy_rec(0, data, 0)
+        return data
+
+    def _copy_rec(self, idim, data, off):
+        shapes = self.getshape()
+        shape = shapes[idim]
+
+        if self.getndim()-1 == idim:
+            self._copy_base(data,off)
+            return
+
+        for i in range(shape):
+            self._copy_rec(idim+1,data,off)
+            off += strides[idim]
+
+    def _copy_base(self, data, off):
+        shapes = self.getshape()
+        step = shapes[0] // self.getitemsize()
+        strides = self.getstrides()
+        for i in range(step):
+            bytes = self.buf.getslice(off, off+self.itemsize, 1, self.itemsize)
+            data.append(bytes)
+            off += strides[0]
 
     def getlength(self):
         if self.length != -1:
@@ -251,15 +277,16 @@
 
     def slice(self, start, stop, step, size):
         # modifies the buffer, shape and stride to allow step to be > 1
-        # NOTE that start, stop, are already byte offsets
+        # NOTE that start & stop are already byte offsets
         # TODO subbuffer
         strides = self.getstrides()[:]
         shape = self.getshape()[:]
         itemsize = self.itemsize
         dim = 0
-        self.buf = SubBuffer(self.buf, start + strides[dim] * (start // 
itemsize), self.buf.getlength())
+        length = self.buf.getlength()
+        self.buf = SubBuffer(self.buf, strides[dim] * start, size)
         shape[dim] = size
-        strides[dim] = strides[dim] * step
+        strides[dim] = strides[dim] * step * itemsize
         self.strides = strides
         self.shape = shape
 
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to