Author: Richard Plangger <planri...@gmail.com>
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
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to