Skip to content

Commit 49e83e3

Browse files
authored
gh-139156: Use PyBytesWriter in PyUnicode_AsRawUnicodeEscapeString() (#139250)
Replace PyBytes_FromStringAndSize() and _PyBytes_Resize() with the PyBytesWriter API.
1 parent c497694 commit 49e83e3

File tree

1 file changed

+13
-24
lines changed

1 file changed

+13
-24
lines changed

Objects/unicodeobject.c

Lines changed: 13 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7141,41 +7141,34 @@ PyUnicode_DecodeRawUnicodeEscape(const char *s,
71417141
PyObject *
71427142
PyUnicode_AsRawUnicodeEscapeString(PyObject *unicode)
71437143
{
7144-
PyObject *repr;
7145-
char *p;
7146-
Py_ssize_t expandsize, pos;
7147-
int kind;
7148-
const void *data;
7149-
Py_ssize_t len;
7150-
71517144
if (!PyUnicode_Check(unicode)) {
71527145
PyErr_BadArgument();
71537146
return NULL;
71547147
}
7155-
kind = PyUnicode_KIND(unicode);
7156-
data = PyUnicode_DATA(unicode);
7157-
len = PyUnicode_GET_LENGTH(unicode);
7148+
int kind = PyUnicode_KIND(unicode);
7149+
const void *data = PyUnicode_DATA(unicode);
7150+
Py_ssize_t len = PyUnicode_GET_LENGTH(unicode);
7151+
if (len == 0) {
7152+
return Py_GetConstant(Py_CONSTANT_EMPTY_BYTES);
7153+
}
71587154
if (kind == PyUnicode_1BYTE_KIND) {
71597155
return PyBytes_FromStringAndSize(data, len);
71607156
}
71617157

71627158
/* 4 byte characters can take up 10 bytes, 2 byte characters can take up 6
71637159
bytes, and 1 byte characters 4. */
7164-
expandsize = kind * 2 + 2;
7165-
7160+
Py_ssize_t expandsize = kind * 2 + 2;
71667161
if (len > PY_SSIZE_T_MAX / expandsize) {
71677162
return PyErr_NoMemory();
71687163
}
7169-
repr = PyBytes_FromStringAndSize(NULL, expandsize * len);
7170-
if (repr == NULL) {
7164+
7165+
PyBytesWriter *writer = PyBytesWriter_Create(expandsize * len);
7166+
if (writer == NULL) {
71717167
return NULL;
71727168
}
7173-
if (len == 0) {
7174-
return repr;
7175-
}
7169+
char *p = PyBytesWriter_GetData(writer);
71767170

7177-
p = PyBytes_AS_STRING(repr);
7178-
for (pos = 0; pos < len; pos++) {
7171+
for (Py_ssize_t pos = 0; pos < len; pos++) {
71797172
Py_UCS4 ch = PyUnicode_READ(kind, data, pos);
71807173

71817174
/* U+0000-U+00ff range: Copy 8-bit characters as-is */
@@ -7207,11 +7200,7 @@ PyUnicode_AsRawUnicodeEscapeString(PyObject *unicode)
72077200
}
72087201
}
72097202

7210-
assert(p > PyBytes_AS_STRING(repr));
7211-
if (_PyBytes_Resize(&repr, p - PyBytes_AS_STRING(repr)) < 0) {
7212-
return NULL;
7213-
}
7214-
return repr;
7203+
return PyBytesWriter_FinishWithPointer(writer, p);
72157204
}
72167205

72177206
/* --- Latin-1 Codec ------------------------------------------------------ */

0 commit comments

Comments
 (0)