Author: Manuel Jacob <[email protected]>
Branch: py3.3
Changeset: r76147:27e66b7853b7
Date: 2015-02-25 19:07 +0100
http://bitbucket.org/pypy/pypy/changeset/27e66b7853b7/

Log:    Fix (partially) memoryview after merging py3k (which in turn merged
        py3k-memoryview).

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
@@ -9,6 +9,7 @@
 from pypy.interpreter.error import OperationError, oefmt
 from pypy.interpreter.gateway import interp2app
 from pypy.interpreter.typedef import TypeDef, GetSetProperty,  
make_weakref_descr
+from pypy.module.struct.formatiterator import UnpackFormatIterator, 
PackFormatIterator
 
 
 class W_MemoryView(W_Root):
@@ -72,23 +73,20 @@
 
     def descr_tolist(self, space):
         self._check_released(space)
-        buf = self.buf
-        if self.format != 'B':
-            raise oefmt(space.w_NotImplementedError,
-                        "tolist() only supports byte views")
-        result = []
-        for i in range(buf.getlength()):
-            result.append(space.wrap(ord(buf.getitem(i)[0])))
-        return space.newlist(result)
+        # TODO: this probably isn't very fast
+        fmtiter = UnpackFormatIterator(space, self.buf)
+        fmtiter.interpret(self.format * self.getlength())
+        return space.newlist(fmtiter.result_w)
 
     def descr_getitem(self, space, w_index):
         self._check_released(space)
         start, stop, step, size = space.decode_index4(w_index, 
self.getlength())
         if step == 0:  # index only
-            a = start * self.itemsize
-            b = a + self.itemsize
-            return space.wrapbytes(
-                ''.join([self.buf.getitem(i) for i in range(a, b)]))
+            # TODO: this probably isn't very fast
+            buf = SubBuffer(self.buf, start * self.itemsize, self.itemsize)
+            fmtiter = UnpackFormatIterator(space, buf)
+            fmtiter.interpret(self.format)
+            return fmtiter.result_w[0]
         elif step == 1:
             buf = SubBuffer(self.buf, start * self.itemsize,
                             size * self.itemsize)
@@ -101,13 +99,19 @@
         if self.buf.readonly:
             raise oefmt(space.w_TypeError, "cannot modify read-only memory")
         start, stop, step, size = space.decode_index4(w_index, 
self.getlength())
-        if step not in (0, 1):
+        if step == 0:  # index only
+            # TODO: this probably isn't very fast
+            fmtiter = PackFormatIterator(space, [w_obj], self.itemsize)
+            fmtiter.interpret(self.format)
+            self.buf.setslice(start * self.itemsize, fmtiter.result.build())
+        elif step == 1:
+            value = space.buffer_w(w_obj, space.BUF_CONTIG_RO)
+            if value.getlength() != size * self.itemsize:
+                raise oefmt(space.w_ValueError,
+                            "cannot modify size of memoryview object")
+            self.buf.setslice(start * self.itemsize, value.as_str())
+        else:
             raise oefmt(space.w_NotImplementedError, "")
-        value = space.buffer_w(w_obj, space.BUF_CONTIG_RO)
-        if value.getlength() != size * self.itemsize:
-            raise oefmt(space.w_ValueError,
-                        "cannot modify size of memoryview object")
-        self.buf.setslice(start * self.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
@@ -140,9 +140,9 @@
         assert m.itemsize == 4
         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'
+        assert m[0] == 0
+        m[0] = 1
+        assert m[0] == 1
 
     def test_int_array_slice(self):
         import array
@@ -152,10 +152,10 @@
         assert slice.itemsize == 4
         assert len(slice) == 6
         assert len(slice.tobytes()) == 24
-        assert slice[0] in (b'\x00\x00\x00\x02', b'\x02\x00\x00\x00')
-        slice[0] = b'\x00\x00\x00\x01'
-        assert slice[0] == b'\x00\x00\x00\x01'
-        assert m[2] == b'\x00\x00\x00\x01'
+        assert slice[0] == 2
+        slice[0] = 1
+        assert slice[0] == 1
+        assert m[2] == 1
 
     def test_pypy_raw_address_base(self):
         raises(ValueError, memoryview(b"foobar")._pypy_raw_address)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to