summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErlend E. Aasland <erlend.aasland@protonmail.com>2023-05-07 09:20:34 (GMT)
committerGitHub <noreply@github.com>2023-05-07 09:20:34 (GMT)
commit39523796554c41f16e74961f7a90dfc30b0eed64 (patch)
tree6c7188cc441d4b23b0670bf698a559eccd6b8a39
parent472938316a85c706c06ad1b3727a205d5bffcb1f (diff)
downloadcpython-39523796554c41f16e74961f7a90dfc30b0eed64.zip
cpython-39523796554c41f16e74961f7a90dfc30b0eed64.tar.gz
cpython-39523796554c41f16e74961f7a90dfc30b0eed64.tar.bz2
gh-101819: Port _io.PyIncrementalNewlineDecoder_Type to heap type (#104249)
-rw-r--r--Modules/_io/_iomodule.c3
-rw-r--r--Modules/_io/_iomodule.h4
-rw-r--r--Modules/_io/textio.c82
-rw-r--r--Tools/c-analyzer/cpython/globals-to-fix.tsv1
4 files changed, 42 insertions, 48 deletions
diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c
index 99b8a8e..ce9fcca 100644
--- a/Modules/_io/_iomodule.c
+++ b/Modules/_io/_iomodule.c
@@ -660,7 +660,6 @@ struct PyModuleDef _PyIO_Module = {
static PyTypeObject* static_types[] = {
// Base classes
&PyIOBase_Type,
- &PyIncrementalNewlineDecoder_Type,
// PyIOBase_Type subclasses
&PyBufferedIOBase_Type,
@@ -757,7 +756,7 @@ PyInit__io(void)
}
// Base classes
- state->PyIncrementalNewlineDecoder_Type = (PyTypeObject *)Py_NewRef(&PyIncrementalNewlineDecoder_Type);
+ ADD_TYPE(m, state->PyIncrementalNewlineDecoder_Type, &nldecoder_spec, NULL);
// PyIOBase_Type subclasses
state->PyRawIOBase_Type = (PyTypeObject *)Py_NewRef(&PyRawIOBase_Type);
diff --git a/Modules/_io/_iomodule.h b/Modules/_io/_iomodule.h
index c971c98..f191cea 100644
--- a/Modules/_io/_iomodule.h
+++ b/Modules/_io/_iomodule.h
@@ -14,9 +14,6 @@ extern PyTypeObject PyRawIOBase_Type;
extern PyTypeObject PyBufferedIOBase_Type;
extern PyTypeObject PyTextIOBase_Type;
-/* Concrete classes */
-extern PyTypeObject PyIncrementalNewlineDecoder_Type;
-
/* Type specs */
extern PyType_Spec bufferedrandom_spec;
extern PyType_Spec bufferedreader_spec;
@@ -24,6 +21,7 @@ extern PyType_Spec bufferedrwpair_spec;
extern PyType_Spec bufferedwriter_spec;
extern PyType_Spec bytesio_spec;
extern PyType_Spec fileio_spec;
+extern PyType_Spec nldecoder_spec;
extern PyType_Spec stringio_spec;
extern PyType_Spec textiowrapper_spec;
diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c
index 2dba382..070687a 100644
--- a/Modules/_io/textio.c
+++ b/Modules/_io/textio.c
@@ -248,12 +248,32 @@ _io_IncrementalNewlineDecoder___init___impl(nldecoder_object *self,
return 0;
}
-static void
-incrementalnewlinedecoder_dealloc(nldecoder_object *self)
+static int
+incrementalnewlinedecoder_traverse(nldecoder_object *self, visitproc visit,
+ void *arg)
+{
+ Py_VISIT(Py_TYPE(self));
+ Py_VISIT(self->decoder);
+ Py_VISIT(self->errors);
+ return 0;
+}
+
+static int
+incrementalnewlinedecoder_clear(nldecoder_object *self)
{
Py_CLEAR(self->decoder);
Py_CLEAR(self->errors);
- Py_TYPE(self)->tp_free((PyObject *)self);
+ return 0;
+}
+
+static void
+incrementalnewlinedecoder_dealloc(nldecoder_object *self)
+{
+ PyTypeObject *tp = Py_TYPE(self);
+ _PyObject_GC_UNTRACK(self);
+ (void)incrementalnewlinedecoder_clear(self);
+ tp->tp_free((PyObject *)self);
+ Py_DECREF(tp);
}
static int
@@ -3176,45 +3196,23 @@ static PyGetSetDef incrementalnewlinedecoder_getset[] = {
{NULL}
};
-PyTypeObject PyIncrementalNewlineDecoder_Type = {
- PyVarObject_HEAD_INIT(NULL, 0)
- "_io.IncrementalNewlineDecoder", /*tp_name*/
- sizeof(nldecoder_object), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- (destructor)incrementalnewlinedecoder_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, /*tp_flags*/
- _io_IncrementalNewlineDecoder___init____doc__, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /*tp_weaklistoffset*/
- 0, /* tp_iter */
- 0, /* tp_iternext */
- incrementalnewlinedecoder_methods, /* tp_methods */
- 0, /* tp_members */
- incrementalnewlinedecoder_getset, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- _io_IncrementalNewlineDecoder___init__, /* tp_init */
- 0, /* tp_alloc */
- PyType_GenericNew, /* tp_new */
+static PyType_Slot nldecoder_slots[] = {
+ {Py_tp_dealloc, incrementalnewlinedecoder_dealloc},
+ {Py_tp_doc, (void *)_io_IncrementalNewlineDecoder___init____doc__},
+ {Py_tp_methods, incrementalnewlinedecoder_methods},
+ {Py_tp_getset, incrementalnewlinedecoder_getset},
+ {Py_tp_traverse, incrementalnewlinedecoder_traverse},
+ {Py_tp_clear, incrementalnewlinedecoder_clear},
+ {Py_tp_init, _io_IncrementalNewlineDecoder___init__},
+ {0, NULL},
+};
+
+PyType_Spec nldecoder_spec = {
+ .name = "_io.IncrementalNewlineDecoder",
+ .basicsize = sizeof(nldecoder_object),
+ .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
+ Py_TPFLAGS_IMMUTABLETYPE),
+ .slots = nldecoder_slots,
};
diff --git a/Tools/c-analyzer/cpython/globals-to-fix.tsv b/Tools/c-analyzer/cpython/globals-to-fix.tsv
index 165bd74..b195dab 100644
--- a/Tools/c-analyzer/cpython/globals-to-fix.tsv
+++ b/Tools/c-analyzer/cpython/globals-to-fix.tsv
@@ -321,7 +321,6 @@ Modules/_io/bufferedio.c - PyBufferedIOBase_Type -
Modules/_io/bytesio.c - _PyBytesIOBuffer_Type -
Modules/_io/iobase.c - PyIOBase_Type -
Modules/_io/iobase.c - PyRawIOBase_Type -
-Modules/_io/textio.c - PyIncrementalNewlineDecoder_Type -
Modules/_io/textio.c - PyTextIOBase_Type -
Modules/_io/winconsoleio.c - PyWindowsConsoleIO_Type -
Modules/_testcapi/vectorcall.c - MethodDescriptorBase_Type -