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