[pypy-commit] pypy py3.3: More fixes to memoryview.

mjacob noreply at buildbot.pypy.org
Thu Feb 26 11:11:33 CET 2015


Author: Manuel Jacob <me at manueljacob.de>
Branch: py3.3
Changeset: r76154:4b6673a65c79
Date: 2015-02-26 11:10 +0100
http://bitbucket.org/pypy/pypy/changeset/4b6673a65c79/

Log:	More fixes to memoryview.

diff --git a/lib-python/3/test/test_memoryview.py b/lib-python/3/test/test_memoryview.py
--- a/lib-python/3/test/test_memoryview.py
+++ b/lib-python/3/test/test_memoryview.py
@@ -11,6 +11,7 @@
 import weakref
 import array
 import io
+from test.support import check_impl_detail
 
 
 try:
@@ -110,10 +111,11 @@
         self.assertRaises(IndexError, setitem, -sys.maxsize, b"a")
         # Wrong index/slice types
         self.assertRaises(TypeError, setitem, 0.0, b"a")
-        self.assertRaises(TypeError, setitem, (0,), b"a")
-        self.assertRaises(TypeError, setitem, (slice(0,1,1), 0), b"a")
-        self.assertRaises(TypeError, setitem, (0, slice(0,1,1)), b"a")
-        self.assertRaises(TypeError, setitem, (0,), b"a")
+        if check_impl_detail():
+            self.assertRaises(TypeError, setitem, (0,), b"a")
+            self.assertRaises(TypeError, setitem, (slice(0,1,1), 0), b"a")
+            self.assertRaises(TypeError, setitem, (0, slice(0,1,1)), b"a")
+            self.assertRaises(TypeError, setitem, (0,), b"a")
         self.assertRaises(TypeError, setitem, "a", b"a")
         # Not implemented: multidimensional slices
         slices = (slice(0,1,1), slice(0,1,2))
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
@@ -5,6 +5,7 @@
 
 from rpython.rlib.buffer import Buffer, SubBuffer
 from rpython.rlib.objectmodel import compute_hash
+from rpython.rlib.rstruct.error import StructError
 from pypy.interpreter.baseobjspace import W_Root
 from pypy.interpreter.error import OperationError, oefmt
 from pypy.interpreter.gateway import interp2app
@@ -98,11 +99,18 @@
         self._check_released(space)
         if self.buf.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, "")
         start, stop, step, size = space.decode_index4(w_index, self.getlength())
         if step == 0:  # index only
             # TODO: this probably isn't very fast
             fmtiter = PackFormatIterator(space, [w_obj], self.itemsize)
-            fmtiter.interpret(self.format)
+            try:
+                fmtiter.interpret(self.format)
+            except StructError as e:
+                raise oefmt(space.w_TypeError,
+                            "memoryview: invalid type for format '%s'",
+                            self.format)
             self.buf.setslice(start * self.itemsize, fmtiter.result.build())
         elif step == 1:
             value = space.buffer_w(w_obj, space.BUF_CONTIG_RO)


More information about the pypy-commit mailing list