Author: Richard Plangger <[email protected]>
Branch: py3.5-ssl
Changeset: r88812:429efb9740ad
Date: 2016-12-02 11:15 +0100
http://bitbucket.org/pypy/pypy/changeset/429efb9740ad/
Log: extended test to support the correct indexing of a reveresed
memoryview (test passes partly)
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
@@ -212,12 +212,11 @@
while dim < length:
w_obj = w_tuple.getitem(space, dim)
index = space.getindex_w(w_obj, space.w_IndexError)
- start = self.lookup_dimension(space, start, dim, index)
+ start = self.lookup_dimension(space, self.buf, start, dim, index)
dim += 1
return start
- def lookup_dimension(self, space, start, dim, index):
- view = self.buf
+ def lookup_dimension(self, space, view, start, dim, index):
shape = view.getshape()
strides = view.getstrides()
nitems = shape[dim]
@@ -264,9 +263,16 @@
# ^^^ for a non-slice index, this returns (index, 0, 0, 1)
if step == 0: # index only
itemsize = self.getitemsize()
+ dim = self.getndim()
if itemsize == 1:
- ch = self.buf.getitem(start)
- return space.newint(ord(ch))
+ if dim == 0:
+ raise oefmt(space.w_TypeError, "invalid indexing of 0-dim
memory")
+ elif dim == 1:
+ idx = self.lookup_dimension(space, self, 0, 0, start)
+ ch = self.buf.getitem(idx)
+ return space.newint(ord(ch))
+ else:
+ raise oefmt(space.w_NotImplementedError,
"multi-dimensional sub-views are not implemented")
else:
# TODO: this probably isn't very fast
buf = SubBuffer(self.buf, start*itemsize, itemsize)
@@ -292,7 +298,7 @@
shape = self.getshape()[:]
itemsize = self.getitemsize()
dim = 0
- self.buf = SubBuffer(self.buf, strides[dim] * start,
size*step*itemsize)
+ self.buf = SubBuffer(self.buf, strides[dim] * start, itemsize)
shape[dim] = size
strides[dim] = strides[dim] * step
self.strides = strides
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
@@ -411,8 +411,16 @@
raises(TypeError, "view.cast('h', shape=(3,3))")
def test_reversed(self):
- bytes = b"\x01\x00\x02\x00\x03\x00"
+ bytes = b"\x01\x01\x02\x02\x03\x03"
view = memoryview(bytes)
revlist = list(reversed(view.tolist()))
+ assert view[::-1][0] == 3
+ assert view[::-1][1] == 3
+ assert view[::-1][2] == 2
+ assert view[::-1][3] == 2
+ assert view[::-1][4] == 1
+ assert view[::-1][5] == 1
+ assert view[::-1][-1] == 1
+ assert view[::-1][-2] == 1
assert list(reversed(view)) == revlist
assert list(reversed(view)) == view[::-1].tolist()
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit