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