gh-119182: Use public PyUnicodeWriter in _json.c (#129249)

Replace the private _PyUnicodeWriter API with the public
PyUnicodeWriter API.
This commit is contained in:
Victor Stinner 2025-01-24 11:38:13 +01:00 committed by GitHub
parent c005ea4951
commit 6e63c4736b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -353,6 +353,13 @@ _build_rval_index_tuple(PyObject *rval, Py_ssize_t idx) {
return tpl; return tpl;
} }
static inline int
_PyUnicodeWriter_IsEmpty(PyUnicodeWriter *writer_pub)
{
_PyUnicodeWriter *writer = (_PyUnicodeWriter*)writer_pub;
return (writer->pos == 0);
}
static PyObject * static PyObject *
scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next_end_ptr) scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next_end_ptr)
{ {
@ -371,9 +378,10 @@ scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next
const void *buf; const void *buf;
int kind; int kind;
_PyUnicodeWriter writer; PyUnicodeWriter *writer = PyUnicodeWriter_Create(0);
_PyUnicodeWriter_Init(&writer); if (writer == NULL) {
writer.overallocate = 1; goto bail;
}
len = PyUnicode_GET_LENGTH(pystr); len = PyUnicode_GET_LENGTH(pystr);
buf = PyUnicode_DATA(pystr); buf = PyUnicode_DATA(pystr);
@ -404,7 +412,7 @@ scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next
if (c == '"') { if (c == '"') {
// Fast path for simple case. // Fast path for simple case.
if (writer.buffer == NULL) { if (_PyUnicodeWriter_IsEmpty(writer)) {
PyObject *ret = PyUnicode_Substring(pystr, end, next); PyObject *ret = PyUnicode_Substring(pystr, end, next);
if (ret == NULL) { if (ret == NULL) {
goto bail; goto bail;
@ -420,7 +428,7 @@ scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next
/* Pick up this chunk if it's not zero length */ /* Pick up this chunk if it's not zero length */
if (next != end) { if (next != end) {
if (_PyUnicodeWriter_WriteSubstring(&writer, pystr, end, next) < 0) { if (PyUnicodeWriter_WriteSubstring(writer, pystr, end, next) < 0) {
goto bail; goto bail;
} }
} }
@ -511,18 +519,18 @@ scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next
end -= 6; end -= 6;
} }
} }
if (_PyUnicodeWriter_WriteChar(&writer, c) < 0) { if (PyUnicodeWriter_WriteChar(writer, c) < 0) {
goto bail; goto bail;
} }
} }
rval = _PyUnicodeWriter_Finish(&writer); rval = PyUnicodeWriter_Finish(writer);
*next_end_ptr = end; *next_end_ptr = end;
return rval; return rval;
bail: bail:
*next_end_ptr = -1; *next_end_ptr = -1;
_PyUnicodeWriter_Dealloc(&writer); PyUnicodeWriter_Discard(writer);
return NULL; return NULL;
} }