diff -r e5a78f7c2dcb Lib/test/test_codecs.py --- a/Lib/test/test_codecs.py Fri Feb 07 10:06:39 2014 +0200 +++ b/Lib/test/test_codecs.py Fri Feb 07 19:46:39 2014 +0200 @@ -852,13 +852,40 @@ def test_partial(self): self.check_partial( - "a+-b", + 'a+-b\x00c\x80d\u0100e\U00010000f', [ - "a", - "a", - "a+", - "a+-", - "a+-b", + 'a', + 'a', + 'a+', + 'a+-', + 'a+-b', + 'a+-b', + 'a+-b', + 'a+-b', + 'a+-b', + 'a+-b\x00', + 'a+-b\x00c', + 'a+-b\x00c', + 'a+-b\x00c', + 'a+-b\x00c', + 'a+-b\x00c', + 'a+-b\x00c\x80', + 'a+-b\x00c\x80d', + 'a+-b\x00c\x80d', + 'a+-b\x00c\x80d', + 'a+-b\x00c\x80d', + 'a+-b\x00c\x80d', + 'a+-b\x00c\x80d\u0100', + 'a+-b\x00c\x80d\u0100e', + 'a+-b\x00c\x80d\u0100e', + 'a+-b\x00c\x80d\u0100e', + 'a+-b\x00c\x80d\u0100e', + 'a+-b\x00c\x80d\u0100e', + 'a+-b\x00c\x80d\u0100e', + 'a+-b\x00c\x80d\u0100e', + 'a+-b\x00c\x80d\u0100e', + 'a+-b\x00c\x80d\u0100e\U00010000', + 'a+-b\x00c\x80d\u0100e\U00010000f', ] ) diff -r e5a78f7c2dcb Objects/unicodeobject.c --- a/Objects/unicodeobject.c Fri Feb 07 10:06:39 2014 +0200 +++ b/Objects/unicodeobject.c Fri Feb 07 19:46:39 2014 +0200 @@ -4474,8 +4474,16 @@ /* return state */ if (consumed) { if (inShift) { + *consumed = startinpos; + if (outpos != shiftOutStart && + PyUnicode_MAX_CHAR_VALUE(unicode) > 127) { + PyObject *result = PyUnicode_FromKindAndData( + PyUnicode_KIND(unicode), PyUnicode_DATA(unicode), + shiftOutStart); + Py_DECREF(unicode); + unicode = result; + } outpos = shiftOutStart; /* back off output */ - *consumed = startinpos; } else { *consumed = s-starts;