https://github.com/python/cpython/commit/0ed5fed22af7d2d917feba8cb9fb09d0bbbc4166
commit: 0ed5fed22af7d2d917feba8cb9fb09d0bbbc4166
branch: main
author: Inada Naoki <[email protected]>
committer: methane <[email protected]>
date: 2026-09-12T16:47:28+09:00
summary:

io: Use a PyBytesWriter for IOBase.readline (#157024)

files:
M Modules/_io/iobase.c

diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c
index 1253f124108bdbf..b6d10c8568feb68 100644
--- a/Modules/_io/iobase.c
+++ b/Modules/_io/iobase.c
@@ -571,20 +571,19 @@ _io__IOBase_readline_impl(PyObject *self, Py_ssize_t 
limit)
 {
     /* For backwards compatibility, a (slowish) readline(). */
 
-    PyObject *peek, *buffer, *result;
-    Py_ssize_t old_size = -1;
+    PyObject *peek;
 
     if (PyObject_GetOptionalAttr(self, &_Py_ID(peek), &peek) < 0) {
         return NULL;
     }
 
-    buffer = PyByteArray_FromStringAndSize(NULL, 0);
-    if (buffer == NULL) {
+    PyBytesWriter *writer = PyBytesWriter_Create(0);
+    if (writer == NULL) {
         Py_XDECREF(peek);
         return NULL;
     }
 
-    while (limit < 0 || PyByteArray_GET_SIZE(buffer) < limit) {
+    while (limit < 0 || PyBytesWriter_GetSize(writer) < limit) {
         Py_ssize_t nreadahead = 1;
         PyObject *b;
 
@@ -650,28 +649,25 @@ _io__IOBase_readline_impl(PyObject *self, Py_ssize_t 
limit)
             break;
         }
 
-        old_size = PyByteArray_GET_SIZE(buffer);
-        if (PyByteArray_Resize(buffer, old_size + PyBytes_GET_SIZE(b)) < 0) {
+        if (PyBytesWriter_WriteBytes(writer,
+                                     PyBytes_AS_STRING(b),
+                                     PyBytes_GET_SIZE(b)) < 0) {
             Py_DECREF(b);
             goto fail;
         }
-        memcpy(PyByteArray_AS_STRING(buffer) + old_size,
-               PyBytes_AS_STRING(b), PyBytes_GET_SIZE(b));
 
         Py_DECREF(b);
 
-        if (PyByteArray_AS_STRING(buffer)[PyByteArray_GET_SIZE(buffer) - 1] == 
'\n')
+        char *data = PyBytesWriter_GetData(writer);
+        if (data[PyBytesWriter_GetSize(writer) - 1] == '\n')
             break;
     }
 
-    result = PyBytes_FromStringAndSize(PyByteArray_AS_STRING(buffer),
-                                       PyByteArray_GET_SIZE(buffer));
     Py_XDECREF(peek);
-    Py_DECREF(buffer);
-    return result;
+    return PyBytesWriter_Finish(writer);
   fail:
     Py_XDECREF(peek);
-    Py_DECREF(buffer);
+    PyBytesWriter_Discard(writer);
     return NULL;
 }
 

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to