https://github.com/python/cpython/commit/e814e6b38bc87ff91c3ba73cfe90a1b803142bc2
commit: e814e6b38bc87ff91c3ba73cfe90a1b803142bc2
branch: main
author: Victor Stinner <[email protected]>
committer: vstinner <[email protected]>
date: 2025-09-15T23:49:28+02:00
summary:
gh-129813, PEP 782: Use PyBytesWriter in FileIO.read() (#138955)
Replace PyBytes_FromStringAndSize(NULL, size) and _PyBytes_Resize()
with the new public PyBytesWriter API.
files:
M Modules/_io/fileio.c
diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c
index ed731da32beb43..9992d48a1d8fc7 100644
--- a/Modules/_io/fileio.c
+++ b/Modules/_io/fileio.c
@@ -862,10 +862,6 @@ static PyObject *
_io_FileIO_read_impl(fileio *self, PyTypeObject *cls, Py_ssize_t size)
/*[clinic end generated code: output=bbd749c7c224143e input=752d1ad3db8564a5]*/
{
- char *ptr;
- Py_ssize_t n;
- PyObject *bytes;
-
if (self->fd < 0)
return err_closed();
if (!self->readable) {
@@ -880,16 +876,17 @@ _io_FileIO_read_impl(fileio *self, PyTypeObject *cls,
Py_ssize_t size)
size = _PY_READ_MAX;
}
- bytes = PyBytes_FromStringAndSize(NULL, size);
- if (bytes == NULL)
+ PyBytesWriter *writer = PyBytesWriter_Create(size);
+ if (writer == NULL) {
return NULL;
- ptr = PyBytes_AS_STRING(bytes);
+ }
+ char *ptr = PyBytesWriter_GetData(writer);
- n = _Py_read(self->fd, ptr, size);
+ Py_ssize_t n = _Py_read(self->fd, ptr, size);
if (n == -1) {
- /* copy errno because Py_DECREF() can indirectly modify it */
+ // copy errno because PyBytesWriter_Discard() can indirectly modify it
int err = errno;
- Py_DECREF(bytes);
+ PyBytesWriter_Discard(writer);
if (err == EAGAIN) {
PyErr_Clear();
Py_RETURN_NONE;
@@ -897,14 +894,7 @@ _io_FileIO_read_impl(fileio *self, PyTypeObject *cls,
Py_ssize_t size)
return NULL;
}
- if (n != size) {
- if (_PyBytes_Resize(&bytes, n) < 0) {
- Py_CLEAR(bytes);
- return NULL;
- }
- }
-
- return (PyObject *) bytes;
+ return PyBytesWriter_FinishWithSize(writer, n);
}
/*[clinic input]
_______________________________________________
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]