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