[pypy-commit] pypy PyBuffer: Create Buffer.setitem_w

rlamy pypy.commits at gmail.com
Mon Apr 10 13:37:22 EDT 2017


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: PyBuffer
Changeset: r91034:c15ffb651607
Date: 2017-04-10 18:22 +0100
http://bitbucket.org/pypy/pypy/changeset/c15ffb651607/

Log:	Create Buffer.setitem_w

diff --git a/pypy/interpreter/buffer.py b/pypy/interpreter/buffer.py
--- a/pypy/interpreter/buffer.py
+++ b/pypy/interpreter/buffer.py
@@ -92,6 +92,25 @@
             fmtiter.interpret(self.getformat())
             return fmtiter.result_w[0]
 
+    def setitem_w(self, space, idx, w_obj):
+        from pypy.objspace.std.bytesobject import getbytevalue
+        from pypy.module.struct.formatiterator import PackFormatIterator
+        itemsize = self.getitemsize()
+        if itemsize == 1:
+            ch = getbytevalue(space, w_obj)
+            self.as_binary()[idx] = ch
+        else:
+            # TODO: this probably isn't very fast
+            fmtiter = PackFormatIterator(space, [w_obj], itemsize)
+            try:
+                fmtiter.interpret(self.getformat())
+            except StructError as e:
+                raise oefmt(space.w_TypeError,
+                            "memoryview: invalid type for format '%s'",
+                            self.getformat())
+            byteval = fmtiter.result.build()
+            self.setslice(idx, byteval)
+
 
 class SimpleBuffer(Buffer):
     _attrs_ = ['readonly', 'data']
@@ -132,6 +151,11 @@
         ch = self.data[idx]
         return space.newint(ord(ch))
 
+    def setitem_w(self, space, idx, w_obj):
+        from pypy.objspace.std.bytesobject import getbytevalue
+        ch = getbytevalue(space, w_obj)
+        self.data[idx] = ch
+
 
 class BinaryBuffer(object):
     """Base class for buffers of bytes"""
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
@@ -11,7 +11,6 @@
 from pypy.interpreter.gateway import interp2app
 from pypy.interpreter.typedef import TypeDef, GetSetProperty,  make_weakref_descr
 from pypy.module.struct.formatiterator import UnpackFormatIterator, PackFormatIterator
-from pypy.objspace.std.bytesobject import getbytevalue
 from rpython.rlib.unroll import unrolling_iterable
 from rpython.rlib.objectmodel import always_inline
 
@@ -267,19 +266,7 @@
             shape = self.getshape()
             strides = self.getstrides()
             idx = self.lookup_dimension(space, shape, strides, 0, 0, start)
-            if itemsize == 1:
-                ch = getbytevalue(space, w_obj)
-                self.buf.setitem(idx, ch)
-            else:
-                # TODO: this probably isn't very fast
-                fmtiter = PackFormatIterator(space, [w_obj], itemsize)
-                try:
-                    fmtiter.interpret(self.getformat())
-                except StructError as e:
-                    raise oefmt(space.w_TypeError,
-                                "memoryview: invalid type for format '%s'",
-                                self.getformat())
-                self.buf.setslice(idx, fmtiter.result.build())
+            self.buf.setitem_w(space, idx, w_obj)
         elif step == 1:
             value = space.buffer_w(w_obj, space.BUF_CONTIG_RO)
             if value.getlength() != slicelength * itemsize:


More information about the pypy-commit mailing list