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]

Reply via email to