Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r44720:1519b3513e1f Date: 2011-06-05 16:43 +0200 http://bitbucket.org/pypy/pypy/changeset/1519b3513e1f/
Log: Test and fix. 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 @@ -33,10 +33,14 @@ w_res = space.call_function(w_errorhandler, w_exc) if (not space.is_true(space.isinstance(w_res, space.w_tuple)) or space.len_w(w_res) != 2): + if decode: + msg = ("decoding error handler must return " + "(unicode, int) tuple, not %s") + else: + msg = ("encoding error handler must return " + "(unicode, int) tuple, not %s") raise operationerrfmt( - space.w_TypeError, - "encoding error handler must return " - "(unicode, int) tuple, not %s", + space.w_TypeError, msg, space.str_w(space.repr(w_res))) w_replace, w_newpos = space.fixedview(w_res, 2) newpos = space.int_w(w_newpos) @@ -50,7 +54,9 @@ replace = space.unicode_w(w_replace) return replace, newpos else: - replace = space.str_w(w_replace) + from pypy.objspace.std.unicodetype import encode_object + w_str = encode_object(space, w_replace, encoding, None) + replace = space.str_w(w_str) return replace, newpos return unicode_call_errorhandler 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 @@ -540,6 +540,17 @@ else: assert res == u"\x00\x00\x01\x00\x00" # UCS2 build + def test_encode_error_bad_handler(self): + import codecs + codecs.register_error("test.bad_handler", lambda e: (repl, 1)) + assert u"xyz".encode("latin-1", "test.bad_handler") == "xyz" + repl = u"\u1234" + raises(UnicodeEncodeError, u"\u5678".encode, "latin-1", + "test.bad_handler") + repl = u"\u00E9" + s = u"\u5678".encode("latin-1", "test.bad_handler") + assert s == '\xe9' + def test_charmap_encode(self): assert 'xxx'.encode('charmap') == 'xxx' _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit