[pypy-commit] pypy refactor-buffer-api: correct _codecs.{char, read}buffer_encode
bdkearns
noreply at buildbot.pypy.org
Thu Apr 24 09:40:37 CEST 2014
Author: Brian Kearns <bdkearns at gmail.com>
Branch: refactor-buffer-api
Changeset: r70924:1569ceab7693
Date: 2014-04-24 03:20 -0400
http://bitbucket.org/pypy/pypy/changeset/1569ceab7693/
Log: correct _codecs.{char,read}buffer_encode
diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py
--- a/pypy/interpreter/baseobjspace.py
+++ b/pypy/interpreter/baseobjspace.py
@@ -1411,7 +1411,7 @@
if self.is_none(w_obj):
name = "None"
else:
- name = self.type(w_obj).getname(self)
+ name = self.type(w_obj).get_module_type_name()
raise oefmt(self.w_TypeError, "must be %s, not %s", expected, name)
@specialize.arg(1)
@@ -1429,6 +1429,15 @@
return w_obj.readbuf_w(self)
except TypeError:
self._getarg_error("string or buffer", w_obj)
+ elif code == 's#':
+ if self.isinstance_w(w_obj, self.w_str):
+ return w_obj.str_w(self)
+ if self.isinstance_w(w_obj, self.w_unicode):
+ return self.str(w_obj).str_w(self)
+ try:
+ return w_obj.readbuf_w(self).as_str()
+ except TypeError:
+ self._getarg_error("string or read-only buffer")
elif code == 'w*':
try:
try:
@@ -1441,6 +1450,11 @@
return w_obj.writebuf_w(self)
except TypeError:
self._getarg_error("read-write buffer", w_obj)
+ elif code == 't#':
+ try:
+ return w_obj.charbuf_w(self)
+ except TypeError:
+ self._getarg_error("string or read-only character buffer", w_obj)
else:
assert False
diff --git a/pypy/module/_codecs/__init__.py b/pypy/module/_codecs/__init__.py
--- a/pypy/module/_codecs/__init__.py
+++ b/pypy/module/_codecs/__init__.py
@@ -72,8 +72,8 @@
'utf_32_le_decode' : 'interp_codecs.utf_32_le_decode',
'utf_32_le_encode' : 'interp_codecs.utf_32_le_encode',
'utf_32_ex_decode' : 'interp_codecs.utf_32_ex_decode',
- 'charbuffer_encode': 'interp_codecs.buffer_encode',
- 'readbuffer_encode': 'interp_codecs.buffer_encode',
+ 'charbuffer_encode': 'interp_codecs.charbuffer_encode',
+ 'readbuffer_encode': 'interp_codecs.readbuffer_encode',
'charmap_decode' : 'interp_codecs.charmap_decode',
'charmap_encode' : 'interp_codecs.charmap_encode',
'escape_encode' : 'interp_codecs.escape_encode',
diff --git a/pypy/module/_codecs/interp_codecs.py b/pypy/module/_codecs/interp_codecs.py
--- a/pypy/module/_codecs/interp_codecs.py
+++ b/pypy/module/_codecs/interp_codecs.py
@@ -321,8 +321,14 @@
w_res = space.call_function(w_encoder, w_obj, space.wrap(errors))
return space.getitem(w_res, space.wrap(0))
- at unwrap_spec(s='bufferstr', errors='str_or_None')
-def buffer_encode(space, s, errors='strict'):
+ at unwrap_spec(errors='str_or_None')
+def readbuffer_encode(space, w_data, errors='strict'):
+ s = space.getarg_w('s#', w_data)
+ return space.newtuple([space.wrap(s), space.wrap(len(s))])
+
+ at unwrap_spec(errors='str_or_None')
+def charbuffer_encode(space, w_data, errors='strict'):
+ s = space.getarg_w('t#', w_data)
return space.newtuple([space.wrap(s), space.wrap(len(s))])
@unwrap_spec(errors=str)
diff --git a/pypy/module/_codecs/test/test_codecs.py b/pypy/module/_codecs/test/test_codecs.py
--- a/pypy/module/_codecs/test/test_codecs.py
+++ b/pypy/module/_codecs/test/test_codecs.py
@@ -420,9 +420,13 @@
for (i, line) in enumerate(reader):
assert line == s[i]
- def test_array(self):
+ def test_buffer_encode(self):
import _codecs, array
- _codecs.readbuffer_encode(array.array('c', 'spam')) == ('spam', 4)
+ assert _codecs.readbuffer_encode(array.array('c', 'spam')) == ('spam', 4)
+ exc = raises(TypeError, _codecs.charbuffer_encode, array.array('c', 'spam'))
+ assert str(exc.value) == "must be string or read-only character buffer, not array.array"
+ assert _codecs.readbuffer_encode(u"test") == ('test', 4)
+ assert _codecs.charbuffer_encode(u"test") == ('test', 4)
def test_utf8sig(self):
import codecs
diff --git a/pypy/objspace/fake/objspace.py b/pypy/objspace/fake/objspace.py
--- a/pypy/objspace/fake/objspace.py
+++ b/pypy/objspace/fake/objspace.py
@@ -73,6 +73,9 @@
def get_module(self):
return w_some_obj()
+ def get_module_type_name(self):
+ return self.name
+
def w_some_obj():
if NonConstant(False):
return W_Root()
diff --git a/pypy/objspace/std/unicodeobject.py b/pypy/objspace/std/unicodeobject.py
--- a/pypy/objspace/std/unicodeobject.py
+++ b/pypy/objspace/std/unicodeobject.py
@@ -76,6 +76,8 @@
raise OperationError(space.w_TypeError, space.wrap(
"cannot use unicode as modifiable buffer"))
+ charbuf_w = str_w
+
def listview_unicode(w_self):
return _create_list_from_unicode(w_self._value)
More information about the pypy-commit
mailing list