summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Objects/bytesobject.c23
-rw-r--r--Objects/unicodeobject.c27
2 files changed, 32 insertions, 18 deletions
diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c
index 4b31271..532051e 100644
--- a/Objects/bytesobject.c
+++ b/Objects/bytesobject.c
@@ -4019,19 +4019,24 @@ _PyBytesWriter_Finish(_PyBytesWriter *writer, void *str)
_PyBytesWriter_CheckConsistency(writer, str);
pos = _PyBytesWriter_GetPos(writer, str);
- if (!writer->use_small_buffer) {
+ if (pos == 0) {
+ Py_CLEAR(writer->buffer);
+ /* Get the empty byte string singleton */
+ result = PyBytes_FromStringAndSize(NULL, 0);
+ }
+ else if (writer->use_small_buffer) {
+ result = PyBytes_FromStringAndSize(writer->small_buffer, pos);
+ }
+ else {
+ result = writer->buffer;
+ writer->buffer = NULL;
+
if (pos != writer->allocated) {
- if (_PyBytes_Resize(&writer->buffer, pos)) {
- assert(writer->buffer == NULL);
+ if (_PyBytes_Resize(&result, pos)) {
+ assert(result == NULL);
return NULL;
}
}
-
- result = writer->buffer;
- writer->buffer = NULL;
- }
- else {
- result = PyBytes_FromStringAndSize(writer->small_buffer, pos);
}
return result;
}
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);
}