]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-129813, PEP 782: Optimize byteswriter_resize() (#139101)
authorVictor Stinner <vstinner@python.org>
Thu, 18 Sep 2025 09:52:16 +0000 (10:52 +0100)
committerGitHub <noreply@github.com>
Thu, 18 Sep 2025 09:52:16 +0000 (09:52 +0000)
There is no need to copy the small_buffer in PyBytesWriter_Create().

Objects/bytesobject.c

index cd314fdd5b1e14a5cc26389f71aefa09d4d98734..07237ceaa647e669f15d5431a6ebbf38c8ad2f20 100644 (file)
@@ -3801,7 +3801,7 @@ byteswriter_allocated(PyBytesWriter *writer)
 
 
 static inline int
-byteswriter_resize(PyBytesWriter *writer, Py_ssize_t size, int overallocate)
+byteswriter_resize(PyBytesWriter *writer, Py_ssize_t size, int resize)
 {
     assert(size >= 0);
 
@@ -3810,7 +3810,7 @@ byteswriter_resize(PyBytesWriter *writer, Py_ssize_t size, int overallocate)
         return 0;
     }
 
-    if (overallocate & writer->overallocate) {
+    if (resize & writer->overallocate) {
         if (size <= (PY_SSIZE_T_MAX - size / OVERALLOCATE_FACTOR)) {
             size += size / OVERALLOCATE_FACTOR;
         }
@@ -3834,25 +3834,29 @@ byteswriter_resize(PyBytesWriter *writer, Py_ssize_t size, int overallocate)
         if (writer->obj == NULL) {
             return -1;
         }
-        assert((size_t)size > sizeof(writer->small_buffer));
-        memcpy(PyByteArray_AS_STRING(writer->obj),
-               writer->small_buffer,
-               sizeof(writer->small_buffer));
+        if (resize) {
+            assert((size_t)size > sizeof(writer->small_buffer));
+            memcpy(PyByteArray_AS_STRING(writer->obj),
+                   writer->small_buffer,
+                   sizeof(writer->small_buffer));
+        }
     }
     else {
         writer->obj = PyBytes_FromStringAndSize(NULL, size);
         if (writer->obj == NULL) {
             return -1;
         }
-        assert((size_t)size > sizeof(writer->small_buffer));
-        memcpy(PyBytes_AS_STRING(writer->obj),
-               writer->small_buffer,
-               sizeof(writer->small_buffer));
+        if (resize) {
+            assert((size_t)size > sizeof(writer->small_buffer));
+            memcpy(PyBytes_AS_STRING(writer->obj),
+                   writer->small_buffer,
+                   sizeof(writer->small_buffer));
+        }
     }
 
 #ifdef Py_DEBUG
     Py_ssize_t allocated = byteswriter_allocated(writer);
-    if (overallocate && allocated > old_allocated) {
+    if (resize && allocated > old_allocated) {
         memset(byteswriter_data(writer) + old_allocated, 0xff,
                allocated - old_allocated);
     }