cpython: 0a9143d7b097 (original) (raw)
--- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -654,6 +654,7 @@ resize_compact(PyObject *unicode, Py_ssi Py_ssize_t new_size; int share_wstr; PyObject *new_unicode;
- assert(unicode_modifiable(unicode)); assert(PyUnicode_IS_READY(unicode)); assert(PyUnicode_IS_COMPACT(unicode)); @@ -690,6 +691,7 @@ resize_compact(PyObject *unicode, Py_ssi } PyUnicode_WRITE(PyUnicode_KIND(unicode), PyUnicode_DATA(unicode), length, 0);
- assert(_PyUnicode_CheckConsistency(unicode, 0)); return unicode; }
@@ -1603,7 +1605,6 @@ unicode_resize(PyObject **p_unicode, Py_ if (new_unicode == NULL) return -1; *p_unicode = new_unicode;
} return resize_inplace(unicode, length); @@ -13690,6 +13691,7 @@ unicode_writer_prepare(struct unicode_wr Py_ssize_t length, Py_UCS4 maxchar)assert(_PyUnicode_CheckConsistency(*p_unicode, 0));[](#l1.23) return 0;[](#l1.24)
if (length > PY_SSIZE_T_MAX - writer->pos) { PyErr_NoMemory(); @@ -13697,37 +13699,31 @@ unicode_writer_prepare(struct unicode_wr } newlen = writer->pos + length;
/* overallocate 25% to limit the number of resize */[](#l1.42)
if (newlen > PY_SSIZE_T_MAX - newlen / 4)[](#l1.43)
writer->length = newlen;[](#l1.44)
else[](#l1.45)
writer->length = newlen + newlen / 4;[](#l1.46)
/* resize + widen */[](#l1.48)
newbuffer = PyUnicode_New(writer->length, maxchar);[](#l1.49)
if (newbuffer == NULL)[](#l1.50)
return -1;[](#l1.51)
PyUnicode_CopyCharacters(newbuffer, 0,[](#l1.52)
writer->buffer, 0, writer->pos);[](#l1.53)
Py_DECREF(writer->buffer);[](#l1.54)
writer->buffer = newbuffer;[](#l1.55)
unicode_writer_update(writer);[](#l1.56)
return 0;[](#l1.57)
- } if (newlen > writer->length) { /* 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;
if (PyUnicode_Resize(&writer->buffer, writer->length) < 0)[](#l1.65)
return -1;[](#l1.66)
if (maxchar > writer->maxchar) {[](#l1.68)
/* resize + widen */[](#l1.69)
newbuffer = PyUnicode_New(writer->length, maxchar);[](#l1.70)
if (newbuffer == NULL)[](#l1.71)
return -1;[](#l1.72)
PyUnicode_CopyCharacters(newbuffer, 0,[](#l1.73)
writer->buffer, 0, writer->pos);[](#l1.74)
Py_DECREF(writer->buffer);[](#l1.75)
}[](#l1.76)
else {[](#l1.77)
newbuffer = resize_compact(writer->buffer, writer->length);[](#l1.78)
if (newbuffer == NULL)[](#l1.79)
return -1;[](#l1.80)
}[](#l1.81)
}writer->buffer = newbuffer;[](#l1.82) unicode_writer_update(writer);[](#l1.83)