-
-
Notifications
You must be signed in to change notification settings - Fork 33.5k
Closed as not planned
Labels
Description
Feature or enhancement
I propose adding a new PyBytesWriter API to create a Python bytes object.
API:
typedef struct PyBytesWriter PyBytesWriter;
// Create a bytes writer instance.
// On success, set *str and return a new writer.
// On error, set an exception and return NULLL.
PyAPI_FUNC(PyBytesWriter*) PyBytesWriter_Create(
Py_ssize_t size,
char **str);
// Return the final Python bytes object and destroy the writer instance.
// On success, return a bytes object.
// On error, set an exception and return NULL.
PyAPI_FUNC(PyObject *) PyBytesWriter_Finish(
PyBytesWriter *writer,
char *str);
// Disard a writer: deallocate its memory.
PyAPI_FUNC(void) PyBytesWriter_Discard(PyBytesWriter *writer);
// Allocate 'size' bytes to prepare writing into writer.
// On success, return 0.
// On error, set an exception and return -1.
PyAPI_FUNC(int) PyBytesWriter_Prepare(
PyBytesWriter *writer,
char **str,
Py_ssize_t size);
// Write a bytes string into writer.
// On success, return 0.
// On error, set an exception and return -1.
PyAPI_FUNC(int) PyBytesWriter_WriteBytes(
PyBytesWriter *writer,
char **str,
const void *bytes,
Py_ssize_t size);The PyBytesWriter writer is responsible to manage memor and uses overallocation to be more efficient, str is a cursor to write into the bytes string.
The implementation is based on the existing private _PyBytesWriter API which exists for many years and is used by many functions such as ASCII and Latin1 encoders, binascii module, _pickle module, _struct module, bytes methods, etc.
Linked PRs
tomasr8 and Zheaoli