Author: Ronan Lamy <[email protected]>
Branch: PyBuffer
Changeset: r91064:30be5c409ea0
Date: 2017-04-17 17:56 +0100
http://bitbucket.org/pypy/pypy/changeset/30be5c409ea0/

Log:    fix .tolist() on slices

diff --git a/pypy/interpreter/buffer.py b/pypy/interpreter/buffer.py
--- a/pypy/interpreter/buffer.py
+++ b/pypy/interpreter/buffer.py
@@ -144,22 +144,9 @@
             values_w = [self.w_getitem(space, i) for i in range(n)]
             return space.newlist(values_w)
         else:
-            return self._tolist_rec(space, self.as_binary(), 0, 0, fmt)
+            return self._tolist_rec(space, 0, 0)
 
-    def _tolist(self, space, buf, bytecount, itemsize, fmt, strides=None):
-        from pypy.module.struct.formatiterator import UnpackFormatIterator
-        # TODO: this probably isn't very fast
-        count = bytecount // itemsize
-        fmtiter = UnpackFormatIterator(space, buf)
-        # patch the length, necessary buffer might have offset
-        # which leads to wrong length calculation if e.g. the
-        # memoryview is reversed
-        fmtiter.length = bytecount
-        fmtiter.strides = strides
-        fmtiter.interpret(fmt * count)
-        return space.newlist(fmtiter.result_w)
-
-    def _tolist_rec(self, space, buf, start, idim, fmt):
+    def _tolist_rec(self, space, start, idim):
         strides = self.getstrides()
         shape = self.getshape()
         #
@@ -170,13 +157,15 @@
         #
         if dim >= self.getndim():
             bytecount = (stride * dimshape)
-            return self._tolist(space, buf, bytecount, itemsize, fmt, [stride])
+            values_w = [
+                self.value_from_bytes(
+                    space, self.getbytes(pos, pos + itemsize, 1, itemsize))
+                for pos in range(start, start + bytecount, stride)]
+            return space.newlist(values_w)
+
         items = [None] * dimshape
-
-        orig_buf = buf
         for i in range(dimshape):
-            buf = SubBuffer(orig_buf, start, stride)
-            item = self._tolist_rec(space, buf, start, idim + 1, fmt)
+            item = self._tolist_rec(space, start, idim + 1)
             items[i] = item
             start += stride
 
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
@@ -608,20 +608,20 @@
         if start == stop:
             return ''     # otherwise, adding self.offset might make them
                           # out of bounds
-        offset = self.start * self.getitemsize()
+        offset = self.start * self.buf.getstrides()[0]
         return self.buf.getbytes(offset + start, offset + stop, step, 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.getitemsize()
+        offset = self.start * self.buf.getstrides()[0]
         self.buf.setbytes(offset + start, string)
 
     def get_raw_address(self):
         from rpython.rtyper.lltypesystem import rffi
-        ptr = self.buf.get_raw_address()
-        return rffi.ptradd(ptr, self.start * self.getitemsize())
+        offset = self.start * self.buf.getstrides()[0]
+        return rffi.ptradd(self.buf.get_raw_address(), offset)
 
     def getformat(self):
         return self.buf.getformat()
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to