Author: Manuel Jacob
Branch: py3k-memoryview
Changeset: r71665:6f1e8a720ef2
Date: 2014-05-22 04:17 +0200
http://bitbucket.org/pypy/pypy/changeset/6f1e8a720ef2/

Log:    Test and fix memoryview's setslice to support itemsize != 1.

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
@@ -100,13 +100,10 @@
         if step not in (0, 1):
             raise oefmt(space.w_NotImplementedError, "")
         value = space.buffer_w(w_obj, space.BUF_CONTIG_RO)
-        if value.getlength() != size:
+        if value.getlength() != size * self.buf.itemsize:
             raise oefmt(space.w_ValueError,
                         "cannot modify size of memoryview object")
-        if step == 0:  # index only
-            self.buf.setitem(start, value.getitem(0))
-        elif step == 1:
-            self.buf.setslice(start, value.as_str())
+        self.buf.setslice(start * self.buf.itemsize, value.as_str())
 
     def descr_len(self, space):
         self._check_released(space)
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
@@ -127,3 +127,12 @@
             assert cm is v
         raises(ValueError, bytes, v)
         assert "released memory" in repr(v)
+
+    def test_int_array_buffer(self):
+        import array
+        m = memoryview(array.array('i', list(range(10))))
+        assert len(m) == 10
+        assert len(m.tobytes()) == 40
+        assert m[0] == b'\x00\x00\x00\x00'
+        m[0] = b'\x00\x00\x00\x01'
+        assert m[0] == b'\x00\x00\x00\x01'
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to