aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2025-01-24 11:38:13 +0100
committerGitHub <noreply@github.com>2025-01-24 11:38:13 +0100
commit6e63c4736beebdf912acd391fc437672ee9d362e (patch)
treee1fb0716afc67efe875fab169250cc545038c37d
parentc005ea4951581bd5da7594f29594c9c840ec2fa5 (diff)
downloadcpython-6e63c4736beebdf912acd391fc437672ee9d362e.tar.gz
cpython-6e63c4736beebdf912acd391fc437672ee9d362e.zip
gh-119182: Use public PyUnicodeWriter in _json.c (#129249)
Replace the private _PyUnicodeWriter API with the public PyUnicodeWriter API.
-rw-r--r--Modules/_json.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/Modules/_json.c b/Modules/_json.c
index a99abbe72bf..091bcbfdced 100644
--- a/Modules/_json.c
+++ b/Modules/_json.c
@@ -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;
}