gh-119182: Use public PyUnicodeWriter in Python-ast.c (#129209)

Replace the private _PyUnicodeWriter API with the public
PyUnicodeWriter API.

Use PyUnicodeWriter_WriteRepr() in ast_repr_list().
This commit is contained in:
Victor Stinner 2025-01-23 01:57:37 +01:00 committed by GitHub
parent 8eb9e76b5b
commit 0093a31273
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 86 additions and 78 deletions

82
Python/Python-ast.c generated
View file

@ -5661,10 +5661,11 @@ ast_repr_list(PyObject *list, int depth)
return PyObject_Repr(list);
}
_PyUnicodeWriter writer;
_PyUnicodeWriter_Init(&writer);
writer.overallocate = 1;
PyObject *items[2] = {NULL, NULL};
PyUnicodeWriter *writer = PyUnicodeWriter_Create(0);
if (writer == NULL) {
goto error;
}
items[0] = PySequence_GetItem(list, 0);
if (!items[0]) {
@ -5678,52 +5679,54 @@ ast_repr_list(PyObject *list, int depth)
}
bool is_list = PyList_Check(list);
if (_PyUnicodeWriter_WriteChar(&writer, is_list ? '[' : '(') < 0) {
if (PyUnicodeWriter_WriteChar(writer, is_list ? '[' : '(') < 0) {
goto error;
}
for (Py_ssize_t i = 0; i < Py_MIN(length, 2); i++) {
PyObject *item = items[i];
PyObject *item_repr;
if (PyType_IsSubtype(Py_TYPE(item), (PyTypeObject *)state->AST_type)) {
item_repr = ast_repr_max_depth((AST_object*)item, depth - 1);
} else {
item_repr = PyObject_Repr(item);
}
if (!item_repr) {
goto error;
}
if (i > 0) {
if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0) {
if (PyUnicodeWriter_WriteUTF8(writer, ", ", 2) < 0) {
goto error;
}
}
if (_PyUnicodeWriter_WriteStr(&writer, item_repr) < 0) {
Py_DECREF(item_repr);
goto error;
}
if (i == 0 && length > 2) {
if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ...", 5) < 0) {
PyObject *item = items[i];
if (PyType_IsSubtype(Py_TYPE(item), (PyTypeObject *)state->AST_type)) {
PyObject *item_repr;
item_repr = ast_repr_max_depth((AST_object*)item, depth - 1);
if (!item_repr) {
goto error;
}
if (PyUnicodeWriter_WriteStr(writer, item_repr) < 0) {
Py_DECREF(item_repr);
goto error;
}
Py_DECREF(item_repr);
} else {
if (PyUnicodeWriter_WriteRepr(writer, item) < 0) {
goto error;
}
}
if (i == 0 && length > 2) {
if (PyUnicodeWriter_WriteUTF8(writer, ", ...", 5) < 0) {
goto error;
}
}
Py_DECREF(item_repr);
}
if (_PyUnicodeWriter_WriteChar(&writer, is_list ? ']' : ')') < 0) {
if (PyUnicodeWriter_WriteChar(writer, is_list ? ']' : ')') < 0) {
goto error;
}
Py_XDECREF(items[0]);
Py_XDECREF(items[1]);
return _PyUnicodeWriter_Finish(&writer);
return PyUnicodeWriter_Finish(writer);
error:
Py_XDECREF(items[0]);
Py_XDECREF(items[1]);
_PyUnicodeWriter_Dealloc(&writer);
PyUnicodeWriter_Discard(writer);
return NULL;
}
@ -5767,14 +5770,15 @@ ast_repr_max_depth(AST_object *self, int depth)
}
const char* tp_name = Py_TYPE(self)->tp_name;
_PyUnicodeWriter writer;
_PyUnicodeWriter_Init(&writer);
writer.overallocate = 1;
if (_PyUnicodeWriter_WriteASCIIString(&writer, tp_name, strlen(tp_name)) < 0) {
PyUnicodeWriter *writer = PyUnicodeWriter_Create(0);
if (writer == NULL) {
goto error;
}
if (_PyUnicodeWriter_WriteChar(&writer, '(') < 0) {
if (PyUnicodeWriter_WriteUTF8(writer, tp_name, -1) < 0) {
goto error;
}
if (PyUnicodeWriter_WriteChar(writer, '(') < 0) {
goto error;
}
@ -5809,13 +5813,13 @@ ast_repr_max_depth(AST_object *self, int depth)
}
if (i > 0) {
if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0) {
if (PyUnicodeWriter_WriteUTF8(writer, ", ", 2) < 0) {
Py_DECREF(name);
Py_DECREF(value_repr);
goto error;
}
}
if (_PyUnicodeWriter_WriteStr(&writer, name) < 0) {
if (PyUnicodeWriter_WriteStr(writer, name) < 0) {
Py_DECREF(name);
Py_DECREF(value_repr);
goto error;
@ -5823,11 +5827,11 @@ ast_repr_max_depth(AST_object *self, int depth)
Py_DECREF(name);
if (_PyUnicodeWriter_WriteChar(&writer, '=') < 0) {
if (PyUnicodeWriter_WriteChar(writer, '=') < 0) {
Py_DECREF(value_repr);
goto error;
}
if (_PyUnicodeWriter_WriteStr(&writer, value_repr) < 0) {
if (PyUnicodeWriter_WriteStr(writer, value_repr) < 0) {
Py_DECREF(value_repr);
goto error;
}
@ -5835,17 +5839,17 @@ ast_repr_max_depth(AST_object *self, int depth)
Py_DECREF(value_repr);
}
if (_PyUnicodeWriter_WriteChar(&writer, ')') < 0) {
if (PyUnicodeWriter_WriteChar(writer, ')') < 0) {
goto error;
}
Py_ReprLeave((PyObject *)self);
Py_DECREF(fields);
return _PyUnicodeWriter_Finish(&writer);
return PyUnicodeWriter_Finish(writer);
error:
Py_ReprLeave((PyObject *)self);
Py_DECREF(fields);
_PyUnicodeWriter_Dealloc(&writer);
PyUnicodeWriter_Discard(writer);
return NULL;
}