Author: Amaury Forgeot d'Arc <[email protected]>
Branch: py3k
Changeset: r59158:c43d66f237cd
Date: 2012-12-01 12:00 +0100
http://bitbucket.org/pypy/pypy/changeset/c43d66f237cd/

Log:    Fix mmap module: m[0] is now a range(256) number.

diff --git a/pypy/interpreter/buffer.py b/pypy/interpreter/buffer.py
--- a/pypy/interpreter/buffer.py
+++ b/pypy/interpreter/buffer.py
@@ -253,10 +253,16 @@
 
     def getitem(self, index):
         space = self.space
-        s = space.str_w(space.getitem(self.w_obj, space.wrap(index)))
+        w_value = space.getitem(self.w_obj, space.wrap(index))
+        try:
+            return chr(space.int_w(w_value))
+        except OperationError as exc:
+            if not e.match(space, space.w_TypeError):
+                raise
+        s = space.bytes_w(w_value)
         if len(s) != 1:
             raise OperationError(space.w_ValueError,
-                                 space.wrap("character expected, got string"))
+                                 space.wrap("single byte expected, got 
string"))
         char = s[0]   # annotator hint
         return char
 
diff --git a/pypy/module/mmap/interp_mmap.py b/pypy/module/mmap/interp_mmap.py
--- a/pypy/module/mmap/interp_mmap.py
+++ b/pypy/module/mmap/interp_mmap.py
@@ -21,7 +21,7 @@
 
     def read_byte(self):
         try:
-            return self.space.wrapbytes(self.mmap.read_byte())
+            return self.space.wrap(ord(self.mmap.read_byte()))
         except RValueError, v:
             raise OperationError(self.space.w_ValueError,
                                  self.space.wrap(v.message))
@@ -86,10 +86,10 @@
             raise OperationError(self.space.w_ValueError,
                                  self.space.wrap(v.message))
 
-    @unwrap_spec(byte='bufferstr')
+    @unwrap_spec(byte=int)
     def write_byte(self, byte):
         try:
-            self.mmap.write_byte(byte)
+            self.mmap.write_byte(chr(byte))
         except RValueError, v:
             raise OperationError(self.space.w_ValueError,
                                  self.space.wrap(v.message))
@@ -172,7 +172,7 @@
         space = self.space
         start, stop, step = space.decode_index(w_index, self.mmap.size)
         if step == 0:  # index only
-            return space.wrapbytes(self.mmap.getitem(start))
+            return space.wrap(ord(self.mmap.getitem(start)))
         else:
             res = "".join([self.mmap.getitem(i)
                            for i in range(start, stop, step)])
@@ -180,19 +180,18 @@
 
     def descr_setitem(self, w_index, w_value):
         space = self.space
-        value = space.realstr_w(w_value)
         self.check_valid()
-
         self.check_writeable()
 
         start, stop, step, length = space.decode_index4(w_index, 
self.mmap.size)
         if step == 0:  # index only
-            if len(value) != 1:
-                raise OperationError(space.w_ValueError,
-                                     space.wrap("mmap assignment must be "
-                                                "single-character string"))
-            self.mmap.setitem(start, value)
+            value = space.int_w(w_value)
+            if not 0 <= value < 256:
+                raise OperationError(space.w_ValueError, space.wrap(
+                        "mmap item value must be in range(0, 256)"))
+            self.mmap.setitem(start, chr(value))
         else:
+            value = space.realstr_w(w_value)
             if len(value) != length:
                 raise OperationError(space.w_ValueError,
                           space.wrap("mmap slice assignment is wrong size"))
diff --git a/pypy/module/mmap/test/test_mmap.py 
b/pypy/module/mmap/test/test_mmap.py
--- a/pypy/module/mmap/test/test_mmap.py
+++ b/pypy/module/mmap/test/test_mmap.py
@@ -448,6 +448,8 @@
         raises((IndexError, ValueError), fn)
         def fn(): m[:2] = b"z" * 5
         raises((IndexError, ValueError), fn)
+        def fn(): m[0] = 256
+        raises(ValueError, fn)
         m[1:3] = b'xx'
         assert m.read(6) == b"fxxbar"
         m[0] = ord('x')
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to