mirror of
https://github.com/python/cpython.git
synced 2025-08-31 14:07:50 +00:00
Issue #14687: Cleanup unicode_writer_prepare()
"Inline" PyUnicode_Resize(): call directly resize_compact()
This commit is contained in:
parent
f2c76aa6cb
commit
7989157e49
1 changed files with 20 additions and 24 deletions
|
@ -654,6 +654,7 @@ resize_compact(PyObject *unicode, Py_ssize_t length)
|
||||||
Py_ssize_t new_size;
|
Py_ssize_t new_size;
|
||||||
int share_wstr;
|
int share_wstr;
|
||||||
PyObject *new_unicode;
|
PyObject *new_unicode;
|
||||||
|
assert(unicode_modifiable(unicode));
|
||||||
assert(PyUnicode_IS_READY(unicode));
|
assert(PyUnicode_IS_READY(unicode));
|
||||||
assert(PyUnicode_IS_COMPACT(unicode));
|
assert(PyUnicode_IS_COMPACT(unicode));
|
||||||
|
|
||||||
|
@ -690,6 +691,7 @@ resize_compact(PyObject *unicode, Py_ssize_t length)
|
||||||
}
|
}
|
||||||
PyUnicode_WRITE(PyUnicode_KIND(unicode), PyUnicode_DATA(unicode),
|
PyUnicode_WRITE(PyUnicode_KIND(unicode), PyUnicode_DATA(unicode),
|
||||||
length, 0);
|
length, 0);
|
||||||
|
assert(_PyUnicode_CheckConsistency(unicode, 0));
|
||||||
return unicode;
|
return unicode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1603,7 +1605,6 @@ unicode_resize(PyObject **p_unicode, Py_ssize_t length)
|
||||||
if (new_unicode == NULL)
|
if (new_unicode == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
*p_unicode = new_unicode;
|
*p_unicode = new_unicode;
|
||||||
assert(_PyUnicode_CheckConsistency(*p_unicode, 0));
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return resize_inplace(unicode, length);
|
return resize_inplace(unicode, length);
|
||||||
|
@ -13690,6 +13691,7 @@ unicode_writer_prepare(struct unicode_writer_t *writer,
|
||||||
Py_ssize_t length, Py_UCS4 maxchar)
|
Py_ssize_t length, Py_UCS4 maxchar)
|
||||||
{
|
{
|
||||||
Py_ssize_t newlen;
|
Py_ssize_t newlen;
|
||||||
|
PyObject *newbuffer;
|
||||||
|
|
||||||
if (length > PY_SSIZE_T_MAX - writer->pos) {
|
if (length > PY_SSIZE_T_MAX - writer->pos) {
|
||||||
PyErr_NoMemory();
|
PyErr_NoMemory();
|
||||||
|
@ -13697,37 +13699,31 @@ unicode_writer_prepare(struct unicode_writer_t *writer,
|
||||||
}
|
}
|
||||||
newlen = writer->pos + length;
|
newlen = writer->pos + length;
|
||||||
|
|
||||||
if (newlen > writer->length && maxchar > writer->maxchar) {
|
|
||||||
PyObject *newbuffer;
|
|
||||||
|
|
||||||
/* overallocate 25% to limit the number of resize */
|
|
||||||
if (newlen > PY_SSIZE_T_MAX - newlen / 4)
|
|
||||||
writer->length = newlen;
|
|
||||||
else
|
|
||||||
writer->length = newlen + newlen / 4;
|
|
||||||
|
|
||||||
/* resize + widen */
|
|
||||||
newbuffer = PyUnicode_New(writer->length, maxchar);
|
|
||||||
if (newbuffer == NULL)
|
|
||||||
return -1;
|
|
||||||
PyUnicode_CopyCharacters(newbuffer, 0,
|
|
||||||
writer->buffer, 0, writer->pos);
|
|
||||||
Py_DECREF(writer->buffer);
|
|
||||||
writer->buffer = newbuffer;
|
|
||||||
unicode_writer_update(writer);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (newlen > writer->length) {
|
if (newlen > writer->length) {
|
||||||
/* overallocate 25% to limit the number of resize */
|
/* overallocate 25% to limit the number of resize */
|
||||||
if (newlen > PY_SSIZE_T_MAX - newlen / 4)
|
if (newlen > PY_SSIZE_T_MAX - newlen / 4)
|
||||||
writer->length = newlen;
|
writer->length = newlen;
|
||||||
else
|
else
|
||||||
writer->length = newlen + newlen / 4;
|
writer->length = newlen + newlen / 4;
|
||||||
if (PyUnicode_Resize(&writer->buffer, writer->length) < 0)
|
|
||||||
return -1;
|
if (maxchar > writer->maxchar) {
|
||||||
|
/* resize + widen */
|
||||||
|
newbuffer = PyUnicode_New(writer->length, maxchar);
|
||||||
|
if (newbuffer == NULL)
|
||||||
|
return -1;
|
||||||
|
PyUnicode_CopyCharacters(newbuffer, 0,
|
||||||
|
writer->buffer, 0, writer->pos);
|
||||||
|
Py_DECREF(writer->buffer);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
newbuffer = resize_compact(writer->buffer, writer->length);
|
||||||
|
if (newbuffer == NULL)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
writer->buffer = newbuffer;
|
||||||
unicode_writer_update(writer);
|
unicode_writer_update(writer);
|
||||||
}
|
}
|
||||||
if (maxchar > writer->maxchar) {
|
else if (maxchar > writer->maxchar) {
|
||||||
if (unicode_widen(&writer->buffer, writer->pos, maxchar) < 0)
|
if (unicode_widen(&writer->buffer, writer->pos, maxchar) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
unicode_writer_update(writer);
|
unicode_writer_update(writer);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue