[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