diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2015-10-12 11:29:43 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2015-10-12 11:29:43 (GMT) |
commit | 6c2cdae9e6b664a0b3e204773aeb8954ae1508e1 (patch) | |
tree | 9827e325a16cfaa1002a63f53bbacf6888d0489b /Objects/unicodeobject.c | |
parent | c29e29bed1ea1efc1a0cd3178fac96be4d763ecf (diff) | |
download | cpython-6c2cdae9e6b664a0b3e204773aeb8954ae1508e1.zip cpython-6c2cdae9e6b664a0b3e204773aeb8954ae1508e1.tar.gz cpython-6c2cdae9e6b664a0b3e204773aeb8954ae1508e1.tar.bz2 |
Writer APIs: use empty string singletons
Modify _PyBytesWriter_Finish() and _PyUnicodeWriter_Finish() to return the
empty bytes/Unicode string if the string is empty.
Diffstat (limited to 'Objects/unicodeobject.c')
-rw-r--r-- | Objects/unicodeobject.c | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 35df747..4b3746c 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -13715,17 +13715,26 @@ _PyUnicodeWriter_Finish(_PyUnicodeWriter *writer) assert(PyUnicode_GET_LENGTH(str) == writer->pos); return str; } - if (PyUnicode_GET_LENGTH(writer->buffer) != writer->pos) { - PyObject *newbuffer; - newbuffer = resize_compact(writer->buffer, writer->pos); - if (newbuffer == NULL) { - Py_CLEAR(writer->buffer); - return NULL; + if (writer->pos == 0) { + Py_CLEAR(writer->buffer); + + /* Get the empty Unicode string singleton ('') */ + _Py_INCREF_UNICODE_EMPTY(); + str = unicode_empty; + } + else { + str = writer->buffer; + writer->buffer = NULL; + + if (PyUnicode_GET_LENGTH(str) != writer->pos) { + PyObject *str2; + str2 = resize_compact(str, writer->pos); + if (str2 == NULL) + return NULL; + str = str2; } - writer->buffer = newbuffer; } - str = writer->buffer; - writer->buffer = NULL; + assert(_PyUnicode_CheckConsistency(str, 1)); return unicode_result_ready(str); } |