Author: Manuel Jacob
Branch: py3k-memoryview
Changeset: r66380:4ef858c69a40
Date: 2013-08-28 13:26 +0100
http://bitbucket.org/pypy/pypy/changeset/4ef858c69a40/

Log:    IN-PROGRESS: I'll refactor the internal buffer API on default before
        continuing.

diff --git a/pypy/module/__builtin__/interp_memoryview.py 
b/pypy/module/__builtin__/interp_memoryview.py
--- a/pypy/module/__builtin__/interp_memoryview.py
+++ b/pypy/module/__builtin__/interp_memoryview.py
@@ -44,7 +44,10 @@
     descr_ne = _make_descr__cmp('ne')
 
     def as_str(self):
-        return self.buf.as_str()
+        buf = self.buf
+        # copied and modified from pypy/interpreter/buffer.py
+        n_bytes = buf.getlength() * buf.itemsize
+        return buf.getslice(0, n_bytes, 1, n_bytes)
 
     def getlength(self):
         return self.buf.getlength()
@@ -102,12 +105,28 @@
     def descr_setitem(self, space, w_index, newstring):
         self._check_released(space)
         buf = self.buf
-        if isinstance(buf, buffer.RWBuffer):
-            buf.descr_setitem(space, w_index, newstring)
-        else:
+        if not isinstance(buf, buffer.RWBuffer):
             raise OperationError(space.w_TypeError,
                                  space.wrap("cannot modify read-only memory"))
 
+        # copied and modified from pypy/interpreter/buffer.py
+        start, stop, step, size = space.decode_index4(w_index, 
self.getlength())
+        if step == 0:  # index only
+            if len(newstring) != buf.itemsize:
+                msg = 'cannot modify size of memoryview object'
+                raise OperationError(space.w_ValueError, space.wrap(msg))
+            for i in range(buf.itemsize):
+                buf.setitem(start + i, newstring[i])
+        elif step == 1:
+            if len(newstring) != size * buf.itemsize:
+                msg = 'cannot modify size of memoryview object'
+                raise OperationError(space.w_ValueError, space.wrap(msg))
+            buf.setslice(start, newstring)
+        else:
+            raise OperationError(space.w_ValueError,
+                                 space.wrap("buffer object does not support"
+                                            " slicing with a step"))
+
     def descr_len(self, space):
         self._check_released(space)
         return self.buf.descr_len(space)
diff --git a/pypy/module/array/test/test_array.py 
b/pypy/module/array/test/test_array.py
--- a/pypy/module/array/test/test_array.py
+++ b/pypy/module/array/test/test_array.py
@@ -442,6 +442,11 @@
         a.fromstring(b'some extra text')
         assert buf[:] == b'foobarbazsome extra text'
 
+    def test_memview_multi_tobytes(self):
+        a = self.array('i', list(b"abcdef"))
+        m = memoryview(a)
+        assert m.tobytes() == a.tobytes()
+
     def test_list_methods(self):
         assert repr(self.array('i')) == "array('i')"
         assert repr(self.array('i', [1, 2, 3])) == "array('i', [1, 2, 3])"
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to