Author: Richard Plangger <[email protected]>
Branch: py3.5-ssl
Changeset: r88819:a62844213890
Date: 2016-12-02 13:46 +0100
http://bitbucket.org/pypy/pypy/changeset/a62844213890/
Log: test that checks multidim. memoryview tolist + reversed
diff --git a/pypy/module/struct/formatiterator.py
b/pypy/module/struct/formatiterator.py
--- a/pypy/module/struct/formatiterator.py
+++ b/pypy/module/struct/formatiterator.py
@@ -135,9 +135,8 @@
def read(self, count):
if self.strides:
- end = self.pos + count * self.strides[0]
- else:
- end = self.pos + count
+ count = self.strides[0]
+ end = self.pos + count
if end > self.length:
raise StructError("unpack str size too short for format")
s = self.buf.getslice(self.pos, end, 1, count)
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
@@ -167,18 +167,20 @@
raise NotImplementedError
elif dim == 1:
itemsize = self.getitemsize()
- return self._tolist(space, buf, self.getlength() // itemsize, fmt)
+ return self._tolist(space, buf, self.getlength(), itemsize, fmt,
+ self.getstrides())
else:
return self._tolist_rec(space, buf, 0, 0, fmt)
- def _tolist(self, space, buf, count, fmt):
+ def _tolist(self, space, buf, bytecount, itemsize, fmt, strides=None):
# 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 = self.getlength()
- fmtiter.strides = self.getstrides()
+ fmtiter.length = bytecount
+ fmtiter.strides = strides
fmtiter.interpret(fmt * count)
return space.newlist(fmtiter.result_w)
@@ -193,12 +195,13 @@
#
if dim >= self.getndim():
bytecount = (stride * dimshape)
- count = bytecount // itemsize
- return self._tolist(space, buf, count, fmt)
+ return self._tolist(space, buf, bytecount, itemsize, fmt, [stride])
items = [None] * dimshape
for i in range(dimshape):
- item = self._tolist_rec(space, SubBuffer(buf, start, stride),
start, idim+1, fmt)
+ import pdb; pdb.set_trace()
+ buf = SubBuffer(buf, start, stride)
+ item = self._tolist_rec(space, buf, start, idim+1, fmt)
items[i] = item
start += stride
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
@@ -1,4 +1,5 @@
import py
+import pytest
import struct
from pypy.interpreter.baseobjspace import W_Root
from pypy.interpreter.gateway import interp2app
@@ -424,3 +425,18 @@
assert view[::-1][-2] == 1
assert list(reversed(view)) == revlist
assert list(reversed(view)) == view[::-1].tolist()
+
+class AppTestMemoryViewReversed(object):
+ spaceconfig = dict(usemodules=['array'])
+ def test_reversed_non_bytes(self):
+ import array
+ items = [1,2,3,9,7,5]
+ formats = ['h']
+ for fmt in formats:
+ bytes = array.array(fmt, items)
+ view = memoryview(bytes)
+ bview = view.cast('b')
+ rview = bview.cast(fmt, shape=(2,3))
+ assert rview.tolist() == [[1,2,3],[9,7,5]]
+ assert rview[::-1].tolist() == [[3,2,1], [5,7,9]]
+ raises(NotImplementedError, list, reversed(rview))
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit