From 1f64526d8abea4643c1d4fab6561daf2455c8a11 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 12 Sep 2026 03:32:10 +0200 Subject: [PATCH 1/2] gh-155742: Use PyBytesWriter in bytes.translate() Replace soft deprecated _PyBytes_Resize() with PyBytesWriter. --- Objects/bytesobject.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index 27ffc6e869ede3c..32c15a5310f0113 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -2275,7 +2275,6 @@ bytes_translate_impl(PyBytesObject *self, PyObject *table, PyObject *input_obj = (PyObject*)self; const char *output_start, *del_table_chars=NULL; Py_ssize_t inlen, tablen, dellen = 0; - PyObject *result; int trans_table[256]; if (PyBytes_Check(table)) { @@ -2320,13 +2319,13 @@ bytes_translate_impl(PyBytesObject *self, PyObject *table, } inlen = PyBytes_GET_SIZE(input_obj); - result = PyBytes_FromStringAndSize((char *)NULL, inlen); - if (result == NULL) { + PyBytesWriter *writer = PyBytesWriter_Create(inlen); + if (writer == NULL) { PyBuffer_Release(&del_table_view); PyBuffer_Release(&table_view); return NULL; } - output_start = output = PyBytes_AS_STRING(result); + output_start = output = PyBytesWriter_GetData(writer); input = PyBytes_AS_STRING(input_obj); if (dellen == 0 && table_chars != NULL) { @@ -2335,14 +2334,17 @@ bytes_translate_impl(PyBytesObject *self, PyObject *table, c = Py_CHARMASK(*input++); *output++ = table_chars[c]; } + PyObject *result = PyBytesWriter_Finish(writer); + /* Check if anything changed (for returning original object) */ /* We save this check until the end so that the compiler will */ /* unroll the loop above leading to MUCH faster code. */ - if (PyBytes_CheckExact(input_obj)) { + if (result != NULL && PyBytes_CheckExact(input_obj)) { if (memcmp(PyBytes_AS_STRING(input_obj), output_start, inlen) == 0) { Py_SETREF(result, Py_NewRef(input_obj)); } } + PyBuffer_Release(&del_table_view); PyBuffer_Release(&table_view); return result; @@ -2369,13 +2371,11 @@ bytes_translate_impl(PyBytesObject *self, PyObject *table, changed = 1; } if (!changed && PyBytes_CheckExact(input_obj)) { - Py_DECREF(result); + PyBytesWriter_Discard(writer); return Py_NewRef(input_obj); } /* Fix the size of the resulting byte string */ - if (inlen > 0) - _PyBytes_Resize(&result, output - output_start); - return result; + return PyBytesWriter_FinishWithPointer(writer, output); } From eabcc1aa1db5b850f95f6ac05a976e7e42949adc Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 12 Sep 2026 19:16:39 +0200 Subject: [PATCH 2/2] Enhance test_bytes.test_translate() --- Lib/test/test_bytes.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py index e73cd7d5d826bc2..797916e4099b5e4 100644 --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -1116,13 +1116,14 @@ def test_translate(self): self.assertRaises(ValueError, b.translate, bytes(range(255))) c = b.translate(rosetta, b'hello') - self.assertEqual(b, b'hello') - self.assertIsInstance(c, self.type2test) + self.assertEqual(c, b'') + self.assertEqual(type(c), self.type2test) c = b.translate(rosetta) d = b.translate(rosetta, b'') - self.assertEqual(c, d) self.assertEqual(c, b'helle') + self.assertEqual(type(c), self.type2test) + self.assertEqual(d, b'helle') c = b.translate(rosetta, b'l') self.assertEqual(c, b'hee')