gh-139156: Use PyBytesWriter in the UTF-7 encoder (#139248)

Replace PyBytes_FromStringAndSize() and _PyBytes_Resize() with the
PyBytesWriter API.
This commit is contained in:
Victor Stinner 2025-09-22 22:49:25 +02:00 committed by GitHub
parent 92ba2c92c4
commit c863349f98
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -4897,33 +4897,27 @@ _PyUnicode_EncodeUTF7(PyObject *str,
int base64WhiteSpace,
const char *errors)
{
int kind;
const void *data;
Py_ssize_t len;
PyObject *v;
int inShift = 0;
Py_ssize_t i;
unsigned int base64bits = 0;
unsigned long base64buffer = 0;
char * out;
const char * start;
kind = PyUnicode_KIND(str);
data = PyUnicode_DATA(str);
len = PyUnicode_GET_LENGTH(str);
if (len == 0)
Py_ssize_t len = PyUnicode_GET_LENGTH(str);
if (len == 0) {
return Py_GetConstant(Py_CONSTANT_EMPTY_BYTES);
}
int kind = PyUnicode_KIND(str);
const void *data = PyUnicode_DATA(str);
/* It might be possible to tighten this worst case */
if (len > PY_SSIZE_T_MAX / 8)
if (len > PY_SSIZE_T_MAX / 8) {
return PyErr_NoMemory();
v = PyBytes_FromStringAndSize(NULL, len * 8);
if (v == NULL)
}
PyBytesWriter *writer = PyBytesWriter_Create(len * 8);
if (writer == NULL) {
return NULL;
}
start = out = PyBytes_AS_STRING(v);
for (i = 0; i < len; ++i) {
int inShift = 0;
unsigned int base64bits = 0;
unsigned long base64buffer = 0;
char *out = PyBytesWriter_GetData(writer);
for (Py_ssize_t i = 0; i < len; ++i) {
Py_UCS4 ch = PyUnicode_READ(kind, data, i);
if (inShift) {
@ -4986,9 +4980,7 @@ _PyUnicode_EncodeUTF7(PyObject *str,
*out++= TO_BASE64(base64buffer << (6-base64bits) );
if (inShift)
*out++ = '-';
if (_PyBytes_Resize(&v, out - start) < 0)
return NULL;
return v;
return PyBytesWriter_FinishWithPointer(writer, out);
}
#undef IS_BASE64