mirror of
https://github.com/python/cpython.git
synced 2025-08-04 17:08:35 +00:00
Add _PyUnicodeWriter_WriteSubstring() function
Write a function to enable more optimizations: * If the substring is the whole string and overallocation is disabled, just keep a reference to the string, don't copy characters * Avoid a call to the expensive _PyUnicode_FindMaxChar() function when possible
This commit is contained in:
parent
4489e927a6
commit
cfc4c13b04
4 changed files with 57 additions and 21 deletions
|
@ -869,25 +869,19 @@ do_markup(SubString *input, PyObject *args, PyObject *kwargs,
|
|||
SubString literal;
|
||||
SubString field_name;
|
||||
SubString format_spec;
|
||||
Py_UCS4 conversion, maxchar;
|
||||
Py_ssize_t sublen;
|
||||
int err;
|
||||
Py_UCS4 conversion;
|
||||
|
||||
MarkupIterator_init(&iter, input->str, input->start, input->end);
|
||||
while ((result = MarkupIterator_next(&iter, &literal, &field_present,
|
||||
&field_name, &format_spec,
|
||||
&conversion,
|
||||
&format_spec_needs_expanding)) == 2) {
|
||||
sublen = literal.end - literal.start;
|
||||
if (sublen) {
|
||||
maxchar = _PyUnicode_FindMaxChar(literal.str,
|
||||
literal.start, literal.end);
|
||||
err = _PyUnicodeWriter_Prepare(writer, sublen, maxchar);
|
||||
if (err == -1)
|
||||
if (literal.end != literal.start) {
|
||||
if (!field_present && iter.str.start == iter.str.end)
|
||||
writer->overallocate = 0;
|
||||
if (_PyUnicodeWriter_WriteSubstring(writer, literal.str,
|
||||
literal.start, literal.end) < 0)
|
||||
return 0;
|
||||
_PyUnicode_FastCopyCharacters(writer->buffer, writer->pos,
|
||||
literal.str, literal.start, sublen);
|
||||
writer->pos += sublen;
|
||||
}
|
||||
|
||||
if (field_present) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue