[pypy-commit] pypy py3.5-memoryview: add a new test for a 3 dim, non byte sized memory view

plan_rich pypy.commits at gmail.com
Fri Aug 26 06:44:31 EDT 2016


Author: Richard Plangger <planrichi at gmail.com>
Branch: py3.5-memoryview
Changeset: r86548:21fedb5e1011
Date: 2016-08-26 12:43 +0200
http://bitbucket.org/pypy/pypy/changeset/21fedb5e1011/

Log:	add a new test for a 3 dim, non byte sized memory view

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
@@ -119,13 +119,13 @@
                     space.wrap("sub-views are not implemented"))
 
         if length > ndim:
-            raise oefmt(space.w_NotImplementedError, \
+            raise oefmt(space.w_TypeError, \
                     "cannot index %d-dimension view with %d-element tuple",
                     length, ndim)
 
         start = self._start_from_tuple(space, w_index)
 
-        buf = SubBuffer(self.buf, start, self.itemsize)
+        buf = SubBuffer(self.buf, start, view.getitemsize())
         fmtiter = UnpackFormatIterator(space, buf)
         fmtiter.interpret(fmt)
         return fmtiter.result_w[0]
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,3 +1,4 @@
+import py
 import struct
 from pypy.interpreter.baseobjspace import W_Root
 from pypy.interpreter.gateway import interp2app
@@ -191,18 +192,34 @@
         self.shape.append(space.len_w(w_arr))
         self.data = []
         itemsize = 1
-        for i, w_obj in enumerate(w_arr.getitems_unroll()):
-            ints = []
-            for j, w_i in enumerate(w_obj.getitems_unroll()):
-                ints.append(space.int_w(w_i))
-                self.data.append(space.int_w(w_i))
-            self.arr.append(ints)
+        worklist = [(1,w_arr)]
+        while worklist:
+            dim, w_work = worklist.pop()
+            if space.isinstance_w(w_work, space.w_list):
+                for j, w_obj in enumerate(w_work.getitems_unroll()):
+                    worklist.insert(0, (dim+1, w_obj))
+                continue
+            self.data.append(space.int_w(w_work))
+
+    def getslice(self, start, stop, step, size):
+        items = []
+        bytecount = (stop - start)
+        # data is stores as list of ints, thus this gets around the
+        # issue that one cannot advance in bytes
+        count = bytecount // size
+        start = start // size
+        for i in range(start, start+count, step):
+            items.append(self.getitem(i))
+        return ''.join(items)
+
+    def getformat(self):
+        return self.fmt
 
     def getitem(self, index):
-        return struct.pack(self.fmt, self.data[index])[0]
+        return struct.pack(self.fmt, self.data[index])
 
     def getlength(self):
-        return len(self.data)
+        return len(self.data) * self.itemsize
 
     def getitemsize(self):
         return self.itemsize
@@ -258,3 +275,22 @@
         assert view[2,3] == 11
         assert view[-1,-1] == 11
         assert view[-3,-4] == 0
+
+        try:
+            view.__getitem__((2**63-1,0))
+            assert False, "must not succeed"
+        except IndexError: pass
+
+        try:
+            view.__getitem__((0, 0, 0))
+            assert False, "must not succeed"
+        except TypeError: pass
+
+    def test_tuple_indexing_int(self):
+        content = self.MockArray([ [[1],[2],[3]], [[4],[5],[6]] ],
+                                 dim=3, fmt='i', size=4,
+                                 strides=[12,4,4], shape=[2,3,1])
+        view = memoryview(content)
+        assert view[0,0,0] == 1
+        assert view[-1,2,0] == 6
+


More information about the pypy-commit mailing list