Author: Ronan Lamy <[email protected]>
Branch: PyBuffer-backport
Changeset: r91237:d5640fcd6769
Date: 2017-05-11 02:16 +0100
http://bitbucket.org/pypy/pypy/changeset/d5640fcd6769/

Log:    Restore py2 semantics for memoryview.__getitem__ and .__setitem__

diff --git a/pypy/interpreter/buffer.py b/pypy/interpreter/buffer.py
--- a/pypy/interpreter/buffer.py
+++ b/pypy/interpreter/buffer.py
@@ -1,4 +1,3 @@
-from rpython.rlib.rstruct.error import StructError
 from rpython.rlib.buffer import StringBuffer, SubBuffer
 
 from pypy.interpreter.error import oefmt
@@ -69,18 +68,6 @@
         fmtiter.interpret(self.getformat())
         return fmtiter.result_w[0]
 
-    def bytes_from_value(self, space, w_val):
-        from pypy.module.struct.formatiterator import PackFormatIterator
-        itemsize = self.getitemsize()
-        fmtiter = PackFormatIterator(space, [w_val], itemsize)
-        try:
-            fmtiter.interpret(self.getformat())
-        except StructError as e:
-            raise oefmt(space.w_TypeError,
-                        "memoryview: invalid type for format '%s'",
-                        self.getformat())
-        return fmtiter.result.build()
-
     def _copy_buffer(self):
         if self.getndim() == 0:
             itemsize = self.getitemsize()
@@ -136,17 +123,11 @@
         itemsize = self.getitemsize()
         # TODO: this probably isn't very fast
         data = self.getbytes(offset, itemsize)
-        return self.value_from_bytes(space, data)
+        return space.newbytes(data)
 
     def new_slice(self, start, step, slicelength):
         return BufferSlice(self, start, step, slicelength)
 
-    def setitem_w(self, space, idx, w_obj):
-        offset = self.get_offset(space, 0, idx)
-        # TODO: this probably isn't very fast
-        byteval = self.bytes_from_value(space, w_obj)
-        self.setbytes(offset, byteval)
-
     def w_tolist(self, space):
         dim = self.getndim()
         if dim == 0:
@@ -253,10 +234,6 @@
         else:
             return BufferSlice(self, start, step, slicelength)
 
-    def setitem_w(self, space, idx, w_obj):
-        idx = self.get_offset(space, 0, idx)
-        self.data[idx] = space.byte_w(w_obj)
-
 
 class BufferSlice(BufferView):
     _immutable_ = True
@@ -316,6 +293,3 @@
         real_start = start + self.start
         real_step = self.step * step
         return BufferSlice(self.parent, real_start, real_step, slicelength)
-
-    def setitem_w(self, space, idx, w_obj):
-        return self.parent.setitem_w(space, self.parent_index(idx), w_obj)
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
@@ -145,7 +145,11 @@
         start, stop, step, slicelength = self._decode_index(space, w_index, 
is_slice)
         itemsize = self.getitemsize()
         if step == 0:  # index only
-            self.view.setitem_w(space, start, w_obj)
+            value = space.buffer_w(w_obj, space.BUF_CONTIG_RO)
+            if value.getitemsize() != itemsize:
+                raise oefmt(space.w_TypeError,
+                            "mismatching itemsizes for %T and %T", self, w_obj)
+            self.view.setbytes(start * itemsize, value.getbytes(0, itemsize))
         elif step == 1:
             value = space.buffer_w(w_obj, space.BUF_CONTIG_RO)
             if value.getlength() != slicelength * itemsize:
@@ -311,4 +315,4 @@
     elif (fort == 'A'):
         return (_IsCContiguous(ndim, shape, strides, itemsize) or
                 _IsFortranContiguous(ndim, shape, strides, itemsize))
-    return 0
\ No newline at end of file
+    return 0
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to