Author: Ronan Lamy <ronan.l...@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: _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit