mirror of
https://github.com/python/cpython.git
synced 2025-09-19 23:20:25 +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;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue