/* Forward declaration */
Py_LOCAL_INLINE(Py_ssize_t) _PyBytesWriter_GetSize(_PyBytesWriter *writer,
char *str);
+static void* _PyBytesWriter_ResizeAndUpdatePointer(PyBytesWriter *writer,
+ Py_ssize_t size, void *data);
+static Py_ssize_t _PyBytesWriter_GetAllocated(PyBytesWriter *writer);
#define CHARACTERS _Py_SINGLETON(bytes_characters)
PyObject*
_PyBytes_FromHex(PyObject *string, int use_bytearray)
{
- char *buf;
Py_ssize_t hexlen, invalid_char;
unsigned int top, bot;
const Py_UCS1 *str, *start, *end;
- _PyBytesWriter writer;
+ PyBytesWriter *writer = NULL;
Py_buffer view;
view.obj = NULL;
- _PyBytesWriter_Init(&writer);
- writer.use_bytearray = use_bytearray;
-
if (PyUnicode_Check(string)) {
hexlen = PyUnicode_GET_LENGTH(string);
}
/* This overestimates if there are spaces */
- buf = _PyBytesWriter_Alloc(&writer, hexlen / 2);
- if (buf == NULL) {
+ if (use_bytearray) {
+ writer = _PyBytesWriter_CreateByteArray(hexlen / 2);
+ }
+ else {
+ writer = PyBytesWriter_Create(hexlen / 2);
+ }
+ if (writer == NULL) {
goto release_buffer;
}
+ char *buf = PyBytesWriter_GetData(writer);
start = str;
end = str + hexlen;
if (view.obj != NULL) {
PyBuffer_Release(&view);
}
- return _PyBytesWriter_Finish(&writer, buf);
+ return PyBytesWriter_FinishWithPointer(writer, buf);
error:
if (invalid_char == -1) {
"non-hexadecimal number found in "
"fromhex() arg at position %zd", invalid_char);
}
- _PyBytesWriter_Dealloc(&writer);
+ PyBytesWriter_Discard(writer);
release_buffer:
if (view.obj != NULL) {
static PyObject*
_PyBytes_FromBuffer(PyObject *x)
{
- PyObject *new;
Py_buffer view;
-
if (PyObject_GetBuffer(x, &view, PyBUF_FULL_RO) < 0)
return NULL;
- new = PyBytes_FromStringAndSize(NULL, view.len);
- if (!new)
+ PyBytesWriter *writer = PyBytesWriter_Create(view.len);
+ if (writer == NULL) {
goto fail;
- if (PyBuffer_ToContiguous(((PyBytesObject *)new)->ob_sval,
- &view, view.len, 'C') < 0)
+ }
+
+ if (PyBuffer_ToContiguous(PyBytesWriter_GetData(writer),
+ &view, view.len, 'C') < 0) {
goto fail;
+ }
+
PyBuffer_Release(&view);
- return new;
+ return PyBytesWriter_Finish(writer);
fail:
- Py_XDECREF(new);
+ PyBytesWriter_Discard(writer);
PyBuffer_Release(&view);
return NULL;
}
static PyObject*
_PyBytes_FromList(PyObject *x)
{
- Py_ssize_t i, size = PyList_GET_SIZE(x);
- Py_ssize_t value;
- char *str;
- PyObject *item;
- _PyBytesWriter writer;
-
- _PyBytesWriter_Init(&writer);
- str = _PyBytesWriter_Alloc(&writer, size);
- if (str == NULL)
+ Py_ssize_t size = PyList_GET_SIZE(x);
+ PyBytesWriter *writer = PyBytesWriter_Create(size);
+ if (writer == NULL) {
return NULL;
- writer.overallocate = 1;
- size = writer.allocated;
+ }
+ char *str = PyBytesWriter_GetData(writer);
+ size = _PyBytesWriter_GetAllocated(writer);
- for (i = 0; i < PyList_GET_SIZE(x); i++) {
- item = PyList_GET_ITEM(x, i);
+ for (Py_ssize_t i = 0; i < PyList_GET_SIZE(x); i++) {
+ PyObject *item = PyList_GET_ITEM(x, i);
Py_INCREF(item);
- value = PyNumber_AsSsize_t(item, NULL);
+ Py_ssize_t value = PyNumber_AsSsize_t(item, NULL);
Py_DECREF(item);
if (value == -1 && PyErr_Occurred())
goto error;
}
if (i >= size) {
- str = _PyBytesWriter_Resize(&writer, str, size+1);
- if (str == NULL)
- return NULL;
- size = writer.allocated;
+ str = _PyBytesWriter_ResizeAndUpdatePointer(writer, size + 1, str);
+ if (str == NULL) {
+ goto error;
+ }
+ size = _PyBytesWriter_GetAllocated(writer);
}
*str++ = (char) value;
}
- return _PyBytesWriter_Finish(&writer, str);
+ return PyBytesWriter_FinishWithPointer(writer, str);
- error:
- _PyBytesWriter_Dealloc(&writer);
+error:
+ PyBytesWriter_Discard(writer);
return NULL;
}
static PyObject*
_PyBytes_FromTuple(PyObject *x)
{
- PyObject *bytes;
Py_ssize_t i, size = PyTuple_GET_SIZE(x);
Py_ssize_t value;
- char *str;
PyObject *item;
- bytes = PyBytes_FromStringAndSize(NULL, size);
- if (bytes == NULL)
+ PyBytesWriter *writer = PyBytesWriter_Create(size);
+ if (writer == NULL) {
return NULL;
- str = ((PyBytesObject *)bytes)->ob_sval;
+ }
+ char *str = PyBytesWriter_GetData(writer);
for (i = 0; i < size; i++) {
item = PyTuple_GET_ITEM(x, i);
}
*str++ = (char) value;
}
- return bytes;
+ return PyBytesWriter_Finish(writer);
error:
- Py_DECREF(bytes);
+ PyBytesWriter_Discard(writer);
return NULL;
}
static PyObject *
_PyBytes_FromIterator(PyObject *it, PyObject *x)
{
- char *str;
Py_ssize_t i, size;
- _PyBytesWriter writer;
/* For iterator version, create a bytes object and resize as needed */
size = PyObject_LengthHint(x, 64);
if (size == -1 && PyErr_Occurred())
return NULL;
- _PyBytesWriter_Init(&writer);
- str = _PyBytesWriter_Alloc(&writer, size);
- if (str == NULL)
+ PyBytesWriter *writer = PyBytesWriter_Create(size);
+ if (writer == NULL) {
return NULL;
- writer.overallocate = 1;
- size = writer.allocated;
+ }
+ char *str = PyBytesWriter_GetData(writer);
+ size = _PyBytesWriter_GetAllocated(writer);
/* Run the iterator to exhaustion */
for (i = 0; ; i++) {
/* Append the byte */
if (i >= size) {
- str = _PyBytesWriter_Resize(&writer, str, size+1);
- if (str == NULL)
- return NULL;
- size = writer.allocated;
+ str = _PyBytesWriter_ResizeAndUpdatePointer(writer, size + 1, str);
+ if (str == NULL) {
+ goto error;
+ }
+ size = _PyBytesWriter_GetAllocated(writer);
}
*str++ = (char) value;
}
-
- return _PyBytesWriter_Finish(&writer, str);
+ return PyBytesWriter_FinishWithPointer(writer, str);
error:
- _PyBytesWriter_Dealloc(&writer);
+ PyBytesWriter_Discard(writer);
return NULL;
}
}
+static Py_ssize_t
+_PyBytesWriter_GetAllocated(PyBytesWriter *writer)
+{
+ return byteswriter_allocated(writer);
+}
+
+
int
PyBytesWriter_Resize(PyBytesWriter *writer, Py_ssize_t size)
{
}
+static void*
+_PyBytesWriter_ResizeAndUpdatePointer(PyBytesWriter *writer, Py_ssize_t size,
+ void *data)
+{
+ Py_ssize_t pos = (char*)data - byteswriter_data(writer);
+ if (PyBytesWriter_Resize(writer, size) < 0) {
+ return NULL;
+ }
+ return byteswriter_data(writer) + pos;
+}
+
+
int
PyBytesWriter_Grow(PyBytesWriter *writer, Py_ssize_t size)
{