Author: Amaury Forgeot d'Arc <[email protected]>
Branch: py3.3
Changeset: r74262:08cf1895bd3e
Date: 2014-10-27 23:47 +0100
http://bitbucket.org/pypy/pypy/changeset/08cf1895bd3e/
Log: memoryobject items are now integers, just like a bytes object.
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,20 +11,31 @@
from pypy.interpreter.typedef import TypeDef, GetSetProperty,
make_weakref_descr
-def _buffer_setitem(space, buf, w_index, w_obj):
+def _buffer_setitem(space, buf, w_index, w_obj, as_int=False):
+ # This function is also used by _cffi_backend, but cffi.buffer()
+ # works with single byte characters, whereas memory object uses
+ # numbers.
if buf.readonly:
raise oefmt(space.w_TypeError, "cannot modify read-only memory")
start, stop, step, size = space.decode_index4(w_index, buf.getlength())
- if step not in (0, 1):
+ if step == 0: # index only
+ if as_int:
+ value = chr(space.int_w(w_obj))
+ else:
+ val = space.buffer_w(w_obj, space.BUF_CONTIG_RO)
+ if val.getlength() != 1:
+ raise oefmt(space.w_ValueError,
+ "cannot modify size of memoryview object")
+ value = val.getitem(0)
+ buf.setitem(start, value)
+ elif step == 1:
+ value = space.buffer_w(w_obj, space.BUF_CONTIG_RO)
+ if value.getlength() != size:
+ raise oefmt(space.w_ValueError,
+ "cannot modify size of memoryview object")
+ buf.setslice(start, value.as_str())
+ else:
raise oefmt(space.w_NotImplementedError, "")
- value = space.buffer_w(w_obj, space.BUF_CONTIG_RO)
- if value.getlength() != size:
- raise oefmt(space.w_ValueError,
- "cannot modify size of memoryview object")
- if step == 0: # index only
- buf.setitem(start, value.getitem(0))
- elif step == 1:
- buf.setslice(start, value.as_str())
class W_MemoryView(W_Root):
@@ -93,17 +104,17 @@
def descr_getitem(self, space, w_index):
self._check_released(space)
start, stop, step, size = space.decode_index4(w_index,
self.getlength())
- if step not in (0, 1):
- raise oefmt(space.w_NotImplementedError, "")
if step == 0: # index only
- return space.wrapbytes(self.buf.getitem(start))
- else:
+ return space.wrap(ord(self.buf.getitem(start)))
+ elif step == 1:
buf = SubBuffer(self.buf, start, size)
return W_MemoryView(buf)
+ else:
+ raise oefmt(space.w_NotImplementedError, "")
def descr_setitem(self, space, w_index, w_obj):
self._check_released(space)
- _buffer_setitem(space, self.buf, w_index, w_obj)
+ _buffer_setitem(space, self.buf, w_index, w_obj, as_int=True)
def descr_len(self, space):
self._check_released(space)
diff --git a/pypy/objspace/std/test/test_memoryobject.py
b/pypy/objspace/std/test/test_memoryobject.py
--- a/pypy/objspace/std/test/test_memoryobject.py
+++ b/pypy/objspace/std/test/test_memoryobject.py
@@ -5,11 +5,11 @@
v = memoryview(b"abc")
assert v.tobytes() == b"abc"
assert len(v) == 3
- assert v[0] == b'a'
- assert list(v) == [b'a', b'b', b'c']
+ assert v[0] == ord('a')
+ assert list(v) == [97, 98, 99]
assert v.tolist() == [97, 98, 99]
- assert v[1] == b"b"
- assert v[-1] == b"c"
+ assert v[1] == ord("b")
+ assert v[-1] == ord("c")
exc = raises(TypeError, "v[1] = b'x'")
assert str(exc.value) == "cannot modify read-only memory"
assert v.readonly is True
@@ -23,15 +23,15 @@
data = bytearray(b'abcefg')
v = memoryview(data)
assert v.readonly is False
- v[0] = b'z'
+ v[0] = ord('z')
assert data == bytearray(eval("b'zbcefg'"))
v[1:4] = b'123'
assert data == bytearray(eval("b'z123fg'"))
v[0:3] = v[2:5]
assert data == bytearray(eval("b'23f3fg'"))
- exc = raises(ValueError, "v[2] = b'spam'")
+ exc = raises(ValueError, "v[2:3] = b'spam'")
assert str(exc.value) == "cannot modify size of memoryview object"
- exc = raises(NotImplementedError, "v[0:2:2] = 'spam'")
+ exc = raises(NotImplementedError, "v[0:2:2] = b'spam'")
assert str(exc.value) == ""
def test_memoryview_attrs(self):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit