Issue #28774: Simplified encoding a str result of an error handler in ASCII

and Latin1 encoders.
This commit is contained in:
Serhiy Storchaka 2016-11-23 15:13:00 +02:00
parent d04d8474df
commit 99250d5c63

View file

@ -6814,33 +6814,19 @@ unicode_encode_ucs1(PyObject *unicode,
if (PyUnicode_READY(rep) < 0)
goto onError;
if (PyUnicode_IS_ASCII(rep)) {
/* Fast path: all characters are smaller than limit */
assert(limit >= 128);
assert(PyUnicode_KIND(rep) == PyUnicode_1BYTE_KIND);
str = _PyBytesWriter_WriteBytes(&writer, str,
PyUnicode_DATA(rep),
PyUnicode_GET_LENGTH(rep));
}
else {
Py_ssize_t repsize = PyUnicode_GET_LENGTH(rep);
str = _PyBytesWriter_Prepare(&writer, str, repsize);
if (str == NULL)
goto onError;
/* check if there is anything unencodable in the
replacement and copy it to the output */
for (i = 0; repsize-->0; ++i, ++str) {
ch = PyUnicode_READ_CHAR(rep, i);
if (ch >= limit) {
raise_encode_exception(&exc, encoding, unicode,
collstart, collend, reason);
goto onError;
}
*str = (char)ch;
}
if (limit == 256 ?
PyUnicode_KIND(rep) != PyUnicode_1BYTE_KIND :
!PyUnicode_IS_ASCII(rep))
{
/* Not all characters are smaller than limit */
raise_encode_exception(&exc, encoding, unicode,
collstart, collend, reason);
goto onError;
}
assert(PyUnicode_KIND(rep) == PyUnicode_1BYTE_KIND);
str = _PyBytesWriter_WriteBytes(&writer, str,
PyUnicode_DATA(rep),
PyUnicode_GET_LENGTH(rep));
}
pos = newpos;
Py_CLEAR(rep);