Skip to content

Commit 9b35f7c

Browse files
authored
gh-129813, PEP 782: Use PyBytesWriter in bufferedio.c (#139121)
Replace PyBytes_FromStringAndSize(NULL, size) and _PyBytes_Resize() with the new public PyBytesWriter API.
1 parent 446587c commit 9b35f7c

File tree

1 file changed

+11
-15
lines changed

1 file changed

+11
-15
lines changed

Modules/_io/bufferedio.c

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1789,18 +1789,18 @@ _bufferedreader_read_fast(buffered *self, Py_ssize_t n)
17891789
static PyObject *
17901790
_bufferedreader_read_generic(buffered *self, Py_ssize_t n)
17911791
{
1792-
PyObject *res = NULL;
17931792
Py_ssize_t current_size, remaining, written;
1794-
char *out;
17951793

17961794
current_size = Py_SAFE_DOWNCAST(READAHEAD(self), Py_off_t, Py_ssize_t);
17971795
if (n <= current_size)
17981796
return _bufferedreader_read_fast(self, n);
17991797

1800-
res = PyBytes_FromStringAndSize(NULL, n);
1801-
if (res == NULL)
1798+
PyBytesWriter *writer = PyBytesWriter_Create(n);
1799+
if (writer == NULL) {
18021800
goto error;
1803-
out = PyBytes_AS_STRING(res);
1801+
}
1802+
char *out = PyBytesWriter_GetData(writer);
1803+
18041804
remaining = n;
18051805
written = 0;
18061806
if (current_size > 0) {
@@ -1829,11 +1829,9 @@ _bufferedreader_read_generic(buffered *self, Py_ssize_t n)
18291829
if (r == 0 || r == -2) {
18301830
/* EOF occurred or read() would block. */
18311831
if (r == 0 || written > 0) {
1832-
if (_PyBytes_Resize(&res, written))
1833-
goto error;
1834-
return res;
1832+
return PyBytesWriter_FinishWithSize(writer, written);
18351833
}
1836-
Py_DECREF(res);
1834+
PyBytesWriter_Discard(writer);
18371835
Py_RETURN_NONE;
18381836
}
18391837
remaining -= r;
@@ -1853,11 +1851,9 @@ _bufferedreader_read_generic(buffered *self, Py_ssize_t n)
18531851
if (r == 0 || r == -2) {
18541852
/* EOF occurred or read() would block. */
18551853
if (r == 0 || written > 0) {
1856-
if (_PyBytes_Resize(&res, written))
1857-
goto error;
1858-
return res;
1854+
return PyBytesWriter_FinishWithSize(writer, written);
18591855
}
1860-
Py_DECREF(res);
1856+
PyBytesWriter_Discard(writer);
18611857
Py_RETURN_NONE;
18621858
}
18631859
if (remaining > r) {
@@ -1876,10 +1872,10 @@ _bufferedreader_read_generic(buffered *self, Py_ssize_t n)
18761872
break;
18771873
}
18781874

1879-
return res;
1875+
return PyBytesWriter_Finish(writer);
18801876

18811877
error:
1882-
Py_XDECREF(res);
1878+
PyBytesWriter_Discard(writer);
18831879
return NULL;
18841880
}
18851881

0 commit comments

Comments
 (0)