diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2012-05-03 11:43:07 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2012-05-03 11:43:07 (GMT) |
commit | 7989157e49b65433e7c2c2fb53c27333262f3b36 (patch) | |
tree | e2070aa4110cff6d059c5611cd59b4da99b9957b | |
parent | f2c76aa6cb35ffc556058812daa2123487ac019b (diff) | |
download | cpython-7989157e49b65433e7c2c2fb53c27333262f3b36.zip cpython-7989157e49b65433e7c2c2fb53c27333262f3b36.tar.gz cpython-7989157e49b65433e7c2c2fb53c27333262f3b36.tar.bz2 |
Issue #14687: Cleanup unicode_writer_prepare()
"Inline" PyUnicode_Resize(): call directly resize_compact()
-rw-r--r-- | Objects/unicodeobject.c | 42 |
1 files changed, 19 insertions, 23 deletions
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 2c308bc..52f4246 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -654,6 +654,7 @@ resize_compact(PyObject *unicode, Py_ssize_t length) 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_ssize_t length) } 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_ssize_t length) if (new_unicode == NULL) return -1; *p_unicode = new_unicode; - assert(_PyUnicode_CheckConsistency(*p_unicode, 0)); return 0; } 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 newlen; + PyObject *newbuffer; if (length > PY_SSIZE_T_MAX - writer->pos) { PyErr_NoMemory(); @@ -13697,37 +13699,31 @@ unicode_writer_prepare(struct unicode_writer_t *writer, } newlen = writer->pos + length; - if (newlen > writer->length && maxchar > writer->maxchar) { - PyObject *newbuffer; - + 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; - /* 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); + 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); - return 0; - } - 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) - return -1; - unicode_writer_update(writer); } - if (maxchar > writer->maxchar) { + else if (maxchar > writer->maxchar) { if (unicode_widen(&writer->buffer, writer->pos, maxchar) < 0) return -1; unicode_writer_update(writer); |