static PyObject *
_bufferedreader_read_generic(buffered *self, Py_ssize_t n)
{
- PyObject *res = NULL;
Py_ssize_t current_size, remaining, written;
- char *out;
current_size = Py_SAFE_DOWNCAST(READAHEAD(self), Py_off_t, Py_ssize_t);
if (n <= current_size)
return _bufferedreader_read_fast(self, n);
- res = PyBytes_FromStringAndSize(NULL, n);
- if (res == NULL)
+ PyBytesWriter *writer = PyBytesWriter_Create(n);
+ if (writer == NULL) {
goto error;
- out = PyBytes_AS_STRING(res);
+ }
+ char *out = PyBytesWriter_GetData(writer);
+
remaining = n;
written = 0;
if (current_size > 0) {
if (r == 0 || r == -2) {
/* EOF occurred or read() would block. */
if (r == 0 || written > 0) {
- if (_PyBytes_Resize(&res, written))
- goto error;
- return res;
+ return PyBytesWriter_FinishWithSize(writer, written);
}
- Py_DECREF(res);
+ PyBytesWriter_Discard(writer);
Py_RETURN_NONE;
}
remaining -= r;
if (r == 0 || r == -2) {
/* EOF occurred or read() would block. */
if (r == 0 || written > 0) {
- if (_PyBytes_Resize(&res, written))
- goto error;
- return res;
+ return PyBytesWriter_FinishWithSize(writer, written);
}
- Py_DECREF(res);
+ PyBytesWriter_Discard(writer);
Py_RETURN_NONE;
}
if (remaining > r) {
break;
}
- return res;
+ return PyBytesWriter_Finish(writer);
error:
- Py_XDECREF(res);
+ PyBytesWriter_Discard(writer);
return NULL;
}