https://github.com/python/cpython/commit/0093a31273898930e5fb19ff5d1655c4458a2056
commit: 0093a31273898930e5fb19ff5d1655c4458a2056
branch: main
author: Victor Stinner <[email protected]>
committer: vstinner <[email protected]>
date: 2025-01-23T00:57:37Z
summary:
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().
files:
M Parser/asdl_c.py
M Python/Python-ast.c
diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py
index 853a3e99807bca..7b2df738119115 100755
--- a/Parser/asdl_c.py
+++ b/Parser/asdl_c.py
@@ -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]) {
@@ -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;
}
@@ -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;
}
@@ -1610,13 +1614,13 @@ 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;
@@ -1624,11 +1628,11 @@ def visitModule(self, mod):
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;
}
@@ -1636,17 +1640,17 @@ def visitModule(self, mod):
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;
}
diff --git a/Python/Python-ast.c b/Python/Python-ast.c
index 41299b29705848..7038e3c92ab8f0 100644
--- a/Python/Python-ast.c
+++ b/Python/Python-ast.c
@@ -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 (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;
}
@@ -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;
+ 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;
}
@@ -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;
}
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]