gh-155742: Use PyBytesWriter in io _textiowrapper_writeflush() (#155743) · python/cpython@d557d64

GitHub

Original file line numberDiff line numberDiff line change@@ -1671,17 +1671,17 @@ _textiowrapper_writeflush(textio *self)

16711671 }

16721672else {

16731673assert(PyList_Check(pending));

1674-b=PyBytes_FromStringAndSize(NULL, self->pending_bytes_count);

1675-if (b==NULL) {

1674+PyBytesWriter*writer=PyBytesWriter_Create(self->pending_bytes_count);

1675+if (writer==NULL) {

16761676return-1;

16771677 }

167816781679-char*buf=PyBytes_AsString(b);

1679+char*buf=PyBytesWriter_GetData(writer);

16801680Py_ssize_tpos=0;

1681168116821682for (Py_ssize_ti=0; i<PyList_GET_SIZE(pending); i++) {

16831683PyObject*obj=PyList_GET_ITEM(pending, i);

1684-char*src;

1684+constchar*src;

16851685Py_ssize_tlen;

16861686if (PyUnicode_Check(obj)) {

16871687assert(PyUnicode_IS_ASCII(obj));

@@ -1690,15 +1690,18 @@ _textiowrapper_writeflush(textio *self)

16901690 }

16911691else {

16921692assert(PyBytes_Check(obj));

1693-if (PyBytes_AsStringAndSize(obj, &src, &len) <0) {

1694-Py_DECREF(b);

1695-return-1;

1696- }

1693+src=PyBytes_AS_STRING(obj);

1694+len=PyBytes_GET_SIZE(obj);

16971695 }

16981696memcpy(buf+pos, src, len);

16991697pos+=len;

17001698 }

17011699assert(pos==self->pending_bytes_count);

1700+1701+b=PyBytesWriter_Finish(writer);

1702+if (b==NULL) {

1703+return-1;

1704+ }

17021705 }

1703170617041707self->pending_bytes_count=0;