Skip to content

Commit

Permalink
pythongh-119182: Use public PyUnicodeWriter in Python-ast.c (python#1…
Browse files Browse the repository at this point in the history
…29209)

Replace the private _PyUnicodeWriter API with the public
PyUnicodeWriter API.

Use PyUnicodeWriter_WriteRepr() in ast_repr_list().
  • Loading branch information
vstinner authored Jan 23, 2025
1 parent 8eb9e76 commit 0093a31
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 70 deletions.
74 changes: 39 additions & 35 deletions Parser/asdl_c.py
Original file line number Diff line number Diff line change
Expand Up @@ -1462,10 +1462,11 @@ def visitModule(self, mod):
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]) {
Expand All @@ -1479,52 +1480,54 @@ def visitModule(self, mod):
}
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 (i > 0) {
if (PyUnicodeWriter_WriteUTF8(writer, ", ", 2) < 0) {
goto error;
}
}
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);
} else {
item_repr = PyObject_Repr(item);
}
if (!item_repr) {
goto error;
}
if (i > 0) {
if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0) {
if (!item_repr) {
goto error;
}
if (PyUnicodeWriter_WriteStr(writer, item_repr) < 0) {
Py_DECREF(item_repr);
goto error;
}
}
if (_PyUnicodeWriter_WriteStr(&writer, item_repr) < 0) {
Py_DECREF(item_repr);
goto error;
} else {
if (PyUnicodeWriter_WriteRepr(writer, item) < 0) {
goto error;
}
}
if (i == 0 && length > 2) {
if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ...", 5) < 0) {
Py_DECREF(item_repr);
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;
}
Expand Down Expand Up @@ -1568,14 +1571,15 @@ def visitModule(self, mod):
}
const char* tp_name = Py_TYPE(self)->tp_name;
_PyUnicodeWriter writer;
_PyUnicodeWriter_Init(&writer);
writer.overallocate = 1;
PyUnicodeWriter *writer = PyUnicodeWriter_Create(0);
if (writer == NULL) {
goto error;
}
if (_PyUnicodeWriter_WriteASCIIString(&writer, tp_name, strlen(tp_name)) < 0) {
if (PyUnicodeWriter_WriteUTF8(writer, tp_name, -1) < 0) {
goto error;
}
if (_PyUnicodeWriter_WriteChar(&writer, '(') < 0) {
if (PyUnicodeWriter_WriteChar(writer, '(') < 0) {
goto error;
}
Expand Down Expand Up @@ -1610,43 +1614,43 @@ def visitModule(self, mod):
}
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;
}
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;
}
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;
}
Expand Down
74 changes: 39 additions & 35 deletions Python/Python-ast.c

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 0093a31

Please sign in to comment.