https://github.com/python/cpython/commit/a65236bb394dabe6915b3bc0839c6dda5f444425
commit: a65236bb394dabe6915b3bc0839c6dda5f444425
branch: main
author: Victor Stinner <[email protected]>
committer: vstinner <[email protected]>
date: 2025-09-13T18:26:49+02:00
summary:
gh-129813, PEP 782: Use PyBytesWriter in pickle and struct (#138833)
Replace the private _PyBytesWriter API with the new public
PyBytesWriter API.
files:
M Modules/_pickle.c
M Modules/_struct.c
diff --git a/Modules/_pickle.c b/Modules/_pickle.c
index 0774e91039ec41..bfb2830f3893d6 100644
--- a/Modules/_pickle.c
+++ b/Modules/_pickle.c
@@ -2612,31 +2612,26 @@ save_picklebuffer(PickleState *st, PicklerObject *self,
PyObject *obj)
static PyObject *
raw_unicode_escape(PyObject *obj)
{
- char *p;
- Py_ssize_t i, size;
- const void *data;
- int kind;
- _PyBytesWriter writer;
+ Py_ssize_t size = PyUnicode_GET_LENGTH(obj);
+ const void *data = PyUnicode_DATA(obj);
+ int kind = PyUnicode_KIND(obj);
- _PyBytesWriter_Init(&writer);
-
- size = PyUnicode_GET_LENGTH(obj);
- data = PyUnicode_DATA(obj);
- kind = PyUnicode_KIND(obj);
-
- p = _PyBytesWriter_Alloc(&writer, size);
- if (p == NULL)
- goto error;
- writer.overallocate = 1;
+ Py_ssize_t alloc = size;
+ PyBytesWriter *writer = PyBytesWriter_Create(alloc);
+ if (writer == NULL) {
+ return NULL;
+ }
+ char *p = PyBytesWriter_GetData(writer);
- for (i=0; i < size; i++) {
+ for (Py_ssize_t i=0; i < size; i++) {
Py_UCS4 ch = PyUnicode_READ(kind, data, i);
/* Map 32-bit characters to '\Uxxxxxxxx' */
if (ch >= 0x10000) {
/* -1: subtract 1 preallocated byte */
- p = _PyBytesWriter_Prepare(&writer, p, 10-1);
- if (p == NULL)
+ p = PyBytesWriter_GrowAndUpdatePointer(writer, 10-1, p);
+ if (p == NULL) {
goto error;
+ }
*p++ = '\\';
*p++ = 'U';
@@ -2655,9 +2650,10 @@ raw_unicode_escape(PyObject *obj)
ch == 0x1a)
{
/* -1: subtract 1 preallocated byte */
- p = _PyBytesWriter_Prepare(&writer, p, 6-1);
- if (p == NULL)
+ p = PyBytesWriter_GrowAndUpdatePointer(writer, 6-1, p);
+ if (p == NULL) {
goto error;
+ }
*p++ = '\\';
*p++ = 'u';
@@ -2671,10 +2667,10 @@ raw_unicode_escape(PyObject *obj)
*p++ = (char) ch;
}
- return _PyBytesWriter_Finish(&writer, p);
+ return PyBytesWriter_FinishWithPointer(writer, p);
error:
- _PyBytesWriter_Dealloc(&writer);
+ PyBytesWriter_Discard(writer);
return NULL;
}
diff --git a/Modules/_struct.c b/Modules/_struct.c
index 3fad35a8c94ee2..f09252e82c3915 100644
--- a/Modules/_struct.c
+++ b/Modules/_struct.c
@@ -2189,7 +2189,6 @@ strings.");
static PyObject *
s_pack(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
{
- char *buf;
PyStructObject *soself;
_structmodulestate *state = get_struct_state_structinst(self);
@@ -2205,21 +2204,19 @@ s_pack(PyObject *self, PyObject *const *args,
Py_ssize_t nargs)
}
/* Allocate a new string */
- _PyBytesWriter writer;
- _PyBytesWriter_Init(&writer);
- buf = _PyBytesWriter_Alloc(&writer, soself->s_size);
- if (buf == NULL) {
- _PyBytesWriter_Dealloc(&writer);
+ PyBytesWriter *writer = PyBytesWriter_Create(soself->s_size);
+ if (writer == NULL) {
return NULL;
}
+ char *buf = PyBytesWriter_GetData(writer);
/* Call the guts */
if ( s_pack_internal(soself, args, 0, buf, state) != 0 ) {
- _PyBytesWriter_Dealloc(&writer);
+ PyBytesWriter_Discard(writer);
return NULL;
}
- return _PyBytesWriter_Finish(&writer, buf + soself->s_size);
+ return PyBytesWriter_FinishWithSize(writer, soself->s_size);
}
PyDoc_STRVAR(s_pack_into__doc__,
_______________________________________________
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]