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

Reply via email to