[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