Author: Matti Picus <[email protected]>
Branch: py3.6
Changeset: r96833:da82c5ed6895
Date: 2019-06-21 01:42 +0300
http://bitbucket.org/pypy/pypy/changeset/da82c5ed6895/

Log:    merge setitem2d which allows more than 1d indexing of
        memoryview.__setitem__

diff --git a/pypy/doc/whatsnew-pypy3-head.rst b/pypy/doc/whatsnew-pypy3-head.rst
--- a/pypy/doc/whatsnew-pypy3-head.rst
+++ b/pypy/doc/whatsnew-pypy3-head.rst
@@ -12,3 +12,7 @@
 .. branch: winmultiprocessing
 
 Improve multiprocessing support on win32
+
+.. branch: setitem2d
+
+Allow 2d indexing in ``memoryview.__setitem__`` (issue bb-3028)
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
@@ -132,6 +132,24 @@
         data = view.getbytes(start, itemsize)
         return view.value_from_bytes(space, data)
 
+    def _setitem_tuple_indexed(self, space, w_index, w_obj):
+        view = self.view
+        length = space.len_w(w_index)
+        ndim = view.getndim()
+        if length < ndim:
+            raise oefmt(space.w_NotImplementedError,
+                        "sub-views are not implemented")
+
+        if length > ndim:
+            raise oefmt(space.w_TypeError, \
+                    "cannot index %d-dimension view with %d-element tuple",
+                    length, ndim)
+
+        start = self._start_from_tuple(space, w_index)
+        itemsize = self.getitemsize()
+        val = self.view.bytes_from_value(space, w_obj)
+        self.view.setbytes(start * itemsize, val)
+
     def _decode_index(self, space, w_index, is_slice):
         shape = self.getshape()
         if len(shape) == 0:
@@ -184,7 +202,7 @@
         if self.view.readonly:
             raise oefmt(space.w_TypeError, "cannot modify read-only memory")
         if space.isinstance_w(w_index, space.w_tuple):
-            raise oefmt(space.w_NotImplementedError, "")
+            return self._setitem_tuple_indexed(space, w_index, w_obj)
         start, stop, step, size = space.decode_index4(w_index, 
self.getlength())
         is_slice = space.isinstance_w(w_index, space.w_slice)
         start, stop, step, slicelength = self._decode_index(space, w_index, 
is_slice)
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
@@ -287,6 +287,19 @@
         assert m2.itemsize == m1.itemsize
         assert m2.shape == m1.shape
 
+    def test_2d(self):
+        m = memoryview(bytearray(b'1234123412341234'))
+        assert m[3] == ord('4')
+        m[3] = ord('z')
+        assert m[3] == ord('z')
+        m = m.cast('B', shape=(4, 4))
+        assert m[2, 3] == ord('4')
+        m[2, 3] = ord('a')
+        assert m[2, 3] == ord('a') 
+        raises(TypeError, m.__setitem__, (2, 3), bytearray(b'12'))
+        # slices in 2d memoryviews are not supported at all
+        raises(TypeError, m.__getitem__, (slice(None), 3))
+
 class AppTestCtypes(object):
     spaceconfig = dict(usemodules=['sys', '_rawffi'])
 
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to