[Python-checkins] cpython: Use _PyBytesWriter in _PyBytes_FromIterator()

victor.stinner python-checkins at python.org
Wed Oct 14 09:31:45 EDT 2015


https://hg.python.org/cpython/rev/6d59c4bb2dab
changeset: 98751:6d59c4bb2dab
user: Victor Stinner <victor.stinner at gmail.com>
date: Wed Oct 14 14:15:49 2015 +0200
summary:
 Use _PyBytesWriter in _PyBytes_FromIterator()
files:
 Objects/bytesobject.c | 37 +++++++++++++++---------------
 1 files changed, 18 insertions(+), 19 deletions(-)
diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c
--- a/Objects/bytesobject.c
+++ b/Objects/bytesobject.c
@@ -3456,23 +3456,23 @@
 static PyObject *
 _PyBytes_FromIterator(PyObject *x)
 {
- PyObject *new, *it;
+ char *str;
+ PyObject *it;
 Py_ssize_t i, size;
+ _PyBytesWriter writer;
+
+ _PyBytesWriter_Init(&writer);
 
 /* For iterator version, create a string object and resize as needed */
 size = PyObject_LengthHint(x, 64);
 if (size == -1 && PyErr_Occurred())
 return NULL;
- /* Allocate an extra byte to prevent PyBytes_FromStringAndSize() from
- returning a shared empty bytes string. This required because we
- want to call _PyBytes_Resize() the returned object, which we can
- only do on bytes objects with refcount == 1. */
- if (size == 0)
- size = 1;
- new = PyBytes_FromStringAndSize(NULL, size);
- if (new == NULL)
+
+ str = _PyBytesWriter_Alloc(&writer, size);
+ if (str == NULL)
 return NULL;
- assert(Py_REFCNT(new) == 1);
+ writer.overallocate = 1;
+ size = writer.allocated;
 
 /* Get the iterator */
 it = PyObject_GetIter(x);
@@ -3507,21 +3507,20 @@
 
 /* Append the byte */
 if (i >= size) {
- size = 2 * size + 1;
- if (_PyBytes_Resize(&new, size) < 0)
- goto error;
+ str = _PyBytesWriter_Resize(&writer, str, size+1);
+ if (str == NULL)
+ return NULL;
+ size = writer.allocated;
 }
- ((PyBytesObject *)new)->ob_sval[i] = (char) value;
+ *str++ = (char) value;
 }
- _PyBytes_Resize(&new, i);
-
- /* Clean up and return success */
 Py_DECREF(it);
- return new;
+
+ return _PyBytesWriter_Finish(&writer, str);
 
 error:
+ _PyBytesWriter_Dealloc(&writer);
 Py_XDECREF(it);
- Py_XDECREF(new);
 return NULL;
 }
 
-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /