Author: Brian Kearns <bdkea...@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)) -@unwrap_spec(s='bufferstr', errors='str_or_None') -def buffer_encode(space, s, errors='strict'): +@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))]) + +@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) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit