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]