mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
gh-119182: Use public PyUnicodeWriter in _json.c (#129249)
Replace the private _PyUnicodeWriter API with the public PyUnicodeWriter API.
This commit is contained in:
parent
c005ea4951
commit
6e63c4736b
1 changed files with 16 additions and 8 deletions
|
@ -353,6 +353,13 @@ _build_rval_index_tuple(PyObject *rval, Py_ssize_t idx) {
|
|||
return tpl;
|
||||
}
|
||||
|
||||
static inline int
|
||||
_PyUnicodeWriter_IsEmpty(PyUnicodeWriter *writer_pub)
|
||||
{
|
||||
_PyUnicodeWriter *writer = (_PyUnicodeWriter*)writer_pub;
|
||||
return (writer->pos == 0);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
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;
|
||||
int kind;
|
||||
|
||||
_PyUnicodeWriter writer;
|
||||
_PyUnicodeWriter_Init(&writer);
|
||||
writer.overallocate = 1;
|
||||
PyUnicodeWriter *writer = PyUnicodeWriter_Create(0);
|
||||
if (writer == NULL) {
|
||||
goto bail;
|
||||
}
|
||||
|
||||
len = PyUnicode_GET_LENGTH(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 == '"') {
|
||||
// Fast path for simple case.
|
||||
if (writer.buffer == NULL) {
|
||||
if (_PyUnicodeWriter_IsEmpty(writer)) {
|
||||
PyObject *ret = PyUnicode_Substring(pystr, end, next);
|
||||
if (ret == NULL) {
|
||||
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 */
|
||||
if (next != end) {
|
||||
if (_PyUnicodeWriter_WriteSubstring(&writer, pystr, end, next) < 0) {
|
||||
if (PyUnicodeWriter_WriteSubstring(writer, pystr, end, next) < 0) {
|
||||
goto bail;
|
||||
}
|
||||
}
|
||||
|
@ -511,18 +519,18 @@ scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next
|
|||
end -= 6;
|
||||
}
|
||||
}
|
||||
if (_PyUnicodeWriter_WriteChar(&writer, c) < 0) {
|
||||
if (PyUnicodeWriter_WriteChar(writer, c) < 0) {
|
||||
goto bail;
|
||||
}
|
||||
}
|
||||
|
||||
rval = _PyUnicodeWriter_Finish(&writer);
|
||||
rval = PyUnicodeWriter_Finish(writer);
|
||||
*next_end_ptr = end;
|
||||
return rval;
|
||||
|
||||
bail:
|
||||
*next_end_ptr = -1;
|
||||
_PyUnicodeWriter_Dealloc(&writer);
|
||||
PyUnicodeWriter_Discard(writer);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue