Author: Manuel Jacob
Branch: py3k-memoryview
Changeset: r66380:4ef858c69a40
Date: 2013-08-28 13:26 +0100
http://bitbucket.org/pypy/pypy/changeset/4ef858c69a40/
Log: IN-PROGRESS: I'll refactor the internal buffer API on default before
continuing.
diff --git a/pypy/module/__builtin__/interp_memoryview.py
b/pypy/module/__builtin__/interp_memoryview.py
--- a/pypy/module/__builtin__/interp_memoryview.py
+++ b/pypy/module/__builtin__/interp_memoryview.py
@@ -44,7 +44,10 @@
descr_ne = _make_descr__cmp('ne')
def as_str(self):
- return self.buf.as_str()
+ buf = self.buf
+ # copied and modified from pypy/interpreter/buffer.py
+ n_bytes = buf.getlength() * buf.itemsize
+ return buf.getslice(0, n_bytes, 1, n_bytes)
def getlength(self):
return self.buf.getlength()
@@ -102,12 +105,28 @@
def descr_setitem(self, space, w_index, newstring):
self._check_released(space)
buf = self.buf
- if isinstance(buf, buffer.RWBuffer):
- buf.descr_setitem(space, w_index, newstring)
- else:
+ if not isinstance(buf, buffer.RWBuffer):
raise OperationError(space.w_TypeError,
space.wrap("cannot modify read-only memory"))
+ # copied and modified from pypy/interpreter/buffer.py
+ start, stop, step, size = space.decode_index4(w_index,
self.getlength())
+ if step == 0: # index only
+ if len(newstring) != buf.itemsize:
+ msg = 'cannot modify size of memoryview object'
+ raise OperationError(space.w_ValueError, space.wrap(msg))
+ for i in range(buf.itemsize):
+ buf.setitem(start + i, newstring[i])
+ elif step == 1:
+ if len(newstring) != size * buf.itemsize:
+ msg = 'cannot modify size of memoryview object'
+ raise OperationError(space.w_ValueError, space.wrap(msg))
+ buf.setslice(start, newstring)
+ else:
+ raise OperationError(space.w_ValueError,
+ space.wrap("buffer object does not support"
+ " slicing with a step"))
+
def descr_len(self, space):
self._check_released(space)
return self.buf.descr_len(space)
diff --git a/pypy/module/array/test/test_array.py
b/pypy/module/array/test/test_array.py
--- a/pypy/module/array/test/test_array.py
+++ b/pypy/module/array/test/test_array.py
@@ -442,6 +442,11 @@
a.fromstring(b'some extra text')
assert buf[:] == b'foobarbazsome extra text'
+ def test_memview_multi_tobytes(self):
+ a = self.array('i', list(b"abcdef"))
+ m = memoryview(a)
+ assert m.tobytes() == a.tobytes()
+
def test_list_methods(self):
assert repr(self.array('i')) == "array('i')"
assert repr(self.array('i', [1, 2, 3])) == "array('i', [1, 2, 3])"
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit