aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/src/Modules/_io/stringio.c
diff options
context:
space:
mode:
authorshadchin <shadchin@yandex-team.com>2024-02-12 07:53:52 +0300
committerDaniil Cherednik <dcherednik@ydb.tech>2024-02-14 14:26:16 +0000
commit31f2a419764a8ba77c2a970cfc80056c6cd06756 (patch)
treec1995d239eba8571cefc640f6648e1d5dd4ce9e2 /contrib/tools/python3/src/Modules/_io/stringio.c
parentfe2ef02b38d9c85d80060963b265a1df9f38c3bb (diff)
downloadydb-31f2a419764a8ba77c2a970cfc80056c6cd06756.tar.gz
Update Python from 3.11.8 to 3.12.2
Diffstat (limited to 'contrib/tools/python3/src/Modules/_io/stringio.c')
-rw-r--r--contrib/tools/python3/src/Modules/_io/stringio.c143
1 files changed, 68 insertions, 75 deletions
diff --git a/contrib/tools/python3/src/Modules/_io/stringio.c b/contrib/tools/python3/src/Modules/_io/stringio.c
index 3fe02d3592..3eb25704b4 100644
--- a/contrib/tools/python3/src/Modules/_io/stringio.c
+++ b/contrib/tools/python3/src/Modules/_io/stringio.c
@@ -1,7 +1,6 @@
#define PY_SSIZE_T_CLEAN
#include "Python.h"
#include <stddef.h> // offsetof()
-#include "pycore_accu.h"
#include "pycore_object.h"
#include "_iomodule.h"
@@ -14,9 +13,9 @@
/*[clinic input]
module _io
-class _io.StringIO "stringio *" "&PyStringIO_Type"
+class _io.StringIO "stringio *" "clinic_state()->PyStringIO_Type"
[clinic start generated code]*/
-/*[clinic end generated code: output=da39a3ee5e6b4b0d input=c17bc0f42165cd7d]*/
+/*[clinic end generated code: output=da39a3ee5e6b4b0d input=2693eada0658d470]*/
typedef struct {
PyObject_HEAD
@@ -27,12 +26,12 @@ typedef struct {
/* The stringio object can be in two states: accumulating or realized.
In accumulating state, the internal buffer contains nothing and
- the contents are given by the embedded _PyAccu structure.
+ the contents are given by the embedded _PyUnicodeWriter structure.
In realized state, the internal buffer is meaningful and the
- _PyAccu is destroyed.
+ _PyUnicodeWriter is destroyed.
*/
int state;
- _PyAccu accu;
+ _PyUnicodeWriter writer;
char ok; /* initialized? */
char closed;
@@ -44,6 +43,7 @@ typedef struct {
PyObject *dict;
PyObject *weakreflist;
+ _PyIO_State *module_state;
} stringio;
static int _io_StringIO___init__(PyObject *self, PyObject *args, PyObject *kwargs);
@@ -126,12 +126,14 @@ resize_buffer(stringio *self, size_t size)
static PyObject *
make_intermediate(stringio *self)
{
- PyObject *intermediate = _PyAccu_Finish(&self->accu);
+ PyObject *intermediate = _PyUnicodeWriter_Finish(&self->writer);
self->state = STATE_REALIZED;
if (intermediate == NULL)
return NULL;
- if (_PyAccu_Init(&self->accu) ||
- _PyAccu_Accumulate(&self->accu, intermediate)) {
+
+ _PyUnicodeWriter_Init(&self->writer);
+ self->writer.overallocate = 1;
+ if (_PyUnicodeWriter_WriteStr(&self->writer, intermediate)) {
Py_DECREF(intermediate);
return NULL;
}
@@ -150,7 +152,7 @@ realize(stringio *self)
assert(self->state == STATE_ACCUMULATING);
self->state = STATE_REALIZED;
- intermediate = _PyAccu_Finish(&self->accu);
+ intermediate = _PyUnicodeWriter_Finish(&self->writer);
if (intermediate == NULL)
return -1;
@@ -187,14 +189,12 @@ write_str(stringio *self, PyObject *obj)
self->decoder, obj, 1 /* always final */);
}
else {
- decoded = obj;
- Py_INCREF(decoded);
+ decoded = Py_NewRef(obj);
}
if (self->writenl) {
PyObject *translated = PyUnicode_Replace(
decoded, &_Py_STR(newline), self->writenl, -1);
- Py_DECREF(decoded);
- decoded = translated;
+ Py_SETREF(decoded, translated);
}
if (decoded == NULL)
return -1;
@@ -218,7 +218,7 @@ write_str(stringio *self, PyObject *obj)
if (self->state == STATE_ACCUMULATING) {
if (self->string_size == self->pos) {
- if (_PyAccu_Accumulate(&self->accu, decoded))
+ if (_PyUnicodeWriter_WriteStr(&self->writer, decoded))
goto fail;
goto success;
}
@@ -402,7 +402,7 @@ stringio_iternext(stringio *self)
CHECK_CLOSED(self);
ENSURE_REALIZED(self);
- if (Py_IS_TYPE(self, &PyStringIO_Type)) {
+ if (Py_IS_TYPE(self, self->module_state->PyStringIO_Type)) {
/* Skip method call overhead for speed */
line = _stringio_readline(self, -1);
}
@@ -572,7 +572,7 @@ _io_StringIO_close_impl(stringio *self)
/* Free up some memory */
if (resize_buffer(self, 0) < 0)
return NULL;
- _PyAccu_Destroy(&self->accu);
+ _PyUnicodeWriter_Dealloc(&self->writer);
Py_CLEAR(self->readnl);
Py_CLEAR(self->writenl);
Py_CLEAR(self->decoder);
@@ -582,6 +582,10 @@ _io_StringIO_close_impl(stringio *self)
static int
stringio_traverse(stringio *self, visitproc visit, void *arg)
{
+ Py_VISIT(Py_TYPE(self));
+ Py_VISIT(self->readnl);
+ Py_VISIT(self->writenl);
+ Py_VISIT(self->decoder);
Py_VISIT(self->dict);
return 0;
}
@@ -589,6 +593,9 @@ stringio_traverse(stringio *self, visitproc visit, void *arg)
static int
stringio_clear(stringio *self)
{
+ Py_CLEAR(self->readnl);
+ Py_CLEAR(self->writenl);
+ Py_CLEAR(self->decoder);
Py_CLEAR(self->dict);
return 0;
}
@@ -596,20 +603,20 @@ stringio_clear(stringio *self)
static void
stringio_dealloc(stringio *self)
{
+ PyTypeObject *tp = Py_TYPE(self);
_PyObject_GC_UNTRACK(self);
self->ok = 0;
if (self->buf) {
PyMem_Free(self->buf);
self->buf = NULL;
}
- _PyAccu_Destroy(&self->accu);
- Py_CLEAR(self->readnl);
- Py_CLEAR(self->writenl);
- Py_CLEAR(self->decoder);
- Py_CLEAR(self->dict);
- if (self->weakreflist != NULL)
+ _PyUnicodeWriter_Dealloc(&self->writer);
+ (void)stringio_clear(self);
+ if (self->weakreflist != NULL) {
PyObject_ClearWeakRefs((PyObject *) self);
- Py_TYPE(self)->tp_free(self);
+ }
+ tp->tp_free(self);
+ Py_DECREF(tp);
}
static PyObject *
@@ -687,7 +694,7 @@ _io_StringIO___init___impl(stringio *self, PyObject *value,
self->ok = 0;
- _PyAccu_Destroy(&self->accu);
+ _PyUnicodeWriter_Dealloc(&self->writer);
Py_CLEAR(self->readnl);
Py_CLEAR(self->writenl);
Py_CLEAR(self->decoder);
@@ -709,13 +716,13 @@ _io_StringIO___init___impl(stringio *self, PyObject *value,
is pointless for StringIO)
*/
if (newline != NULL && newline[0] == '\r') {
- self->writenl = self->readnl;
- Py_INCREF(self->writenl);
+ self->writenl = Py_NewRef(self->readnl);
}
+ _PyIO_State *module_state = find_io_state_by_def(Py_TYPE(self));
if (self->readuniversal) {
self->decoder = PyObject_CallFunctionObjArgs(
- (PyObject *)&PyIncrementalNewlineDecoder_Type,
+ (PyObject *)module_state->PyIncrementalNewlineDecoder_Type,
Py_None, self->readtranslate ? Py_True : Py_False, NULL);
if (self->decoder == NULL)
return -1;
@@ -742,12 +749,12 @@ _io_StringIO___init___impl(stringio *self, PyObject *value,
/* Empty stringio object, we can start by accumulating */
if (resize_buffer(self, 0) < 0)
return -1;
- if (_PyAccu_Init(&self->accu))
- return -1;
+ _PyUnicodeWriter_Init(&self->writer);
+ self->writer.overallocate = 1;
self->state = STATE_ACCUMULATING;
}
self->pos = 0;
-
+ self->module_state = module_state;
self->closed = 0;
self->ok = 1;
return 0;
@@ -822,8 +829,7 @@ stringio_getstate(stringio *self, PyObject *Py_UNUSED(ignored))
if (initvalue == NULL)
return NULL;
if (self->dict == NULL) {
- Py_INCREF(Py_None);
- dict = Py_None;
+ dict = Py_NewRef(Py_None);
}
else {
dict = PyDict_Copy(self->dict);
@@ -933,8 +939,7 @@ stringio_setstate(stringio *self, PyObject *state)
return NULL;
}
else {
- Py_INCREF(dict);
- self->dict = dict;
+ self->dict = Py_NewRef(dict);
}
}
@@ -967,7 +972,9 @@ stringio_newlines(stringio *self, void *context)
return PyObject_GetAttr(self->decoder, &_Py_ID(newlines));
}
+#define clinic_state() (find_io_state_by_def(Py_TYPE(self)))
#include "clinic/stringio.c.h"
+#undef clinic_state
static struct PyMethodDef stringio_methods[] = {
_IO_STRINGIO_CLOSE_METHODDEF
@@ -1001,44 +1008,30 @@ static PyGetSetDef stringio_getset[] = {
{NULL}
};
-PyTypeObject PyStringIO_Type = {
- PyVarObject_HEAD_INIT(NULL, 0)
- "_io.StringIO", /*tp_name*/
- sizeof(stringio), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- (destructor)stringio_dealloc, /*tp_dealloc*/
- 0, /*tp_vectorcall_offset*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_as_async*/
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash*/
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
- | Py_TPFLAGS_HAVE_GC, /*tp_flags*/
- _io_StringIO___init____doc__, /*tp_doc*/
- (traverseproc)stringio_traverse, /*tp_traverse*/
- (inquiry)stringio_clear, /*tp_clear*/
- 0, /*tp_richcompare*/
- offsetof(stringio, weakreflist), /*tp_weaklistoffset*/
- 0, /*tp_iter*/
- (iternextfunc)stringio_iternext, /*tp_iternext*/
- stringio_methods, /*tp_methods*/
- 0, /*tp_members*/
- stringio_getset, /*tp_getset*/
- 0, /*tp_base*/
- 0, /*tp_dict*/
- 0, /*tp_descr_get*/
- 0, /*tp_descr_set*/
- offsetof(stringio, dict), /*tp_dictoffset*/
- _io_StringIO___init__, /*tp_init*/
- 0, /*tp_alloc*/
- stringio_new, /*tp_new*/
+static struct PyMemberDef stringio_members[] = {
+ {"__weaklistoffset__", T_PYSSIZET, offsetof(stringio, weakreflist), READONLY},
+ {"__dictoffset__", T_PYSSIZET, offsetof(stringio, dict), READONLY},
+ {NULL},
+};
+
+static PyType_Slot stringio_slots[] = {
+ {Py_tp_dealloc, stringio_dealloc},
+ {Py_tp_doc, (void *)_io_StringIO___init____doc__},
+ {Py_tp_traverse, stringio_traverse},
+ {Py_tp_clear, stringio_clear},
+ {Py_tp_iternext, stringio_iternext},
+ {Py_tp_methods, stringio_methods},
+ {Py_tp_members, stringio_members},
+ {Py_tp_getset, stringio_getset},
+ {Py_tp_init, _io_StringIO___init__},
+ {Py_tp_new, stringio_new},
+ {0, NULL},
+};
+
+PyType_Spec stringio_spec = {
+ .name = "_io.StringIO",
+ .basicsize = sizeof(stringio),
+ .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
+ Py_TPFLAGS_IMMUTABLETYPE),
+ .slots = stringio_slots,
};