https://github.com/python/cpython/commit/237e1dda035485022a56d3f396ceff5f16fed301
commit: 237e1dda035485022a56d3f396ceff5f16fed301
branch: main
author: Victor Stinner <[email protected]>
committer: vstinner <[email protected]>
date: 2026-09-15T12:32:26Z
summary:
gh-155742: Use PyBytesWriter in CJK codecs (#157535)
Replace soft deprecated PyBytes_FromStringAndSize() with
PyBytesWriter.
Replace PyBytes_FromStringAndSize(NULL, 0) with
Py_GetConstant(Py_CONSTANT_EMPTY_BYTES).
files:
M Modules/cjkcodecs/multibytecodec.c
diff --git a/Modules/cjkcodecs/multibytecodec.c
b/Modules/cjkcodecs/multibytecodec.c
index 5eb1533bdfc118e..5fb3ec45a388755 100644
--- a/Modules/cjkcodecs/multibytecodec.c
+++ b/Modules/cjkcodecs/multibytecodec.c
@@ -82,7 +82,8 @@ typedef struct {
PyObject *inobj;
Py_ssize_t inpos, inlen;
unsigned char *outbuf, *outbuf_end;
- PyObject *excobj, *outobj;
+ PyObject *excobj;
+ PyBytesWriter *writer;
} MultibyteEncodeBuffer;
typedef struct {
@@ -209,8 +210,8 @@ expand_encodebuffer(MultibyteEncodeBuffer *buf, Py_ssize_t
esize)
Py_ssize_t orgpos, orgsize, incsize;
orgpos = (Py_ssize_t)((char *)buf->outbuf -
- PyBytes_AS_STRING(buf->outobj));
- orgsize = PyBytes_GET_SIZE(buf->outobj);
+ (char *)PyBytesWriter_GetData(buf->writer));
+ orgsize = PyBytesWriter_GetSize(buf->writer);
incsize = (esize < (orgsize >> 1) ? (orgsize >> 1) | 1 : esize);
if (orgsize > PY_SSIZE_T_MAX - incsize) {
@@ -218,12 +219,12 @@ expand_encodebuffer(MultibyteEncodeBuffer *buf,
Py_ssize_t esize)
return -1;
}
- if (_PyBytes_Resize(&buf->outobj, orgsize + incsize) == -1)
+ if (PyBytesWriter_Resize(buf->writer, orgsize + incsize) == -1)
return -1;
- buf->outbuf = (unsigned char *)PyBytes_AS_STRING(buf->outobj) +orgpos;
- buf->outbuf_end = (unsigned char *)PyBytes_AS_STRING(buf->outobj)
- + PyBytes_GET_SIZE(buf->outobj);
+ unsigned char *data = PyBytesWriter_GetData(buf->writer);
+ buf->outbuf = data + orgpos;
+ buf->outbuf_end = data + PyBytesWriter_GetSize(buf->writer);
return 0;
}
@@ -503,7 +504,7 @@ multibytecodec_encode(const MultibyteCodec *codec,
PyObject *errors, int flags)
{
MultibyteEncodeBuffer buf;
- Py_ssize_t finalsize, r = 0;
+ Py_ssize_t r = 0;
Py_ssize_t datalen;
int kind;
const void *data;
@@ -511,10 +512,10 @@ multibytecodec_encode(const MultibyteCodec *codec,
datalen = PyUnicode_GET_LENGTH(text);
if (datalen == 0 && !(flags & MBENC_RESET))
- return PyBytes_FromStringAndSize(NULL, 0);
+ return Py_GetConstant(Py_CONSTANT_EMPTY_BYTES);
buf.excobj = NULL;
- buf.outobj = NULL;
+ buf.writer = NULL;
buf.inobj = text; /* borrowed reference */
buf.inpos = 0;
buf.inlen = datalen;
@@ -526,11 +527,11 @@ multibytecodec_encode(const MultibyteCodec *codec,
goto errorexit;
}
- buf.outobj = PyBytes_FromStringAndSize(NULL, datalen * 2 + 16);
- if (buf.outobj == NULL)
+ buf.writer = PyBytesWriter_Create(datalen * 2 + 16);
+ if (buf.writer == NULL)
goto errorexit;
- buf.outbuf = (unsigned char *)PyBytes_AS_STRING(buf.outobj);
- buf.outbuf_end = buf.outbuf + PyBytes_GET_SIZE(buf.outobj);
+ buf.outbuf = (unsigned char *)PyBytesWriter_GetData(buf.writer);
+ buf.outbuf_end = buf.outbuf + PyBytesWriter_GetSize(buf.writer);
while (buf.inpos < buf.inlen) {
/* we don't reuse inleft and outleft here.
@@ -563,21 +564,14 @@ multibytecodec_encode(const MultibyteCodec *codec,
goto errorexit;
}
- finalsize = (Py_ssize_t)((char *)buf.outbuf -
- PyBytes_AS_STRING(buf.outobj));
-
- if (finalsize != PyBytes_GET_SIZE(buf.outobj))
- if (_PyBytes_Resize(&buf.outobj, finalsize) == -1)
- goto errorexit;
-
if (inpos_t)
*inpos_t = buf.inpos;
Py_XDECREF(buf.excobj);
- return buf.outobj;
+ return PyBytesWriter_FinishWithPointer(buf.writer, buf.outbuf);
errorexit:
Py_XDECREF(buf.excobj);
- Py_XDECREF(buf.outobj);
+ PyBytesWriter_Discard(buf.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]