From 5ee23584f2d96beaae1e0f1591f0fdfba9cb7965 Mon Sep 17 00:00:00 2001 From: Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com> Date: Mon, 15 May 2023 23:37:21 +0000 Subject: [PATCH 1/3] visit instance dict --- Modules/_io/_iomodule.h | 8 ++++++++ Modules/_io/bufferedio.c | 1 + Modules/_io/iobase.c | 7 +------ Modules/_io/textio.c | 1 + 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Modules/_io/_iomodule.h b/Modules/_io/_iomodule.h index afd638a120ba08..b97215d89138b4 100644 --- a/Modules/_io/_iomodule.h +++ b/Modules/_io/_iomodule.h @@ -195,3 +195,11 @@ extern PyObject *_PyIOBase_cannot_pickle(PyObject *self, PyObject *args); #ifdef HAVE_WINDOWS_CONSOLE_IO extern char _PyIO_get_console_type(PyObject *); #endif + + +typedef struct { + PyObject_HEAD + + PyObject *dict; + PyObject *weakreflist; +} iobase; diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c index 7a0c516411c73b..b6dff7777a5b9a 100644 --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -2428,6 +2428,7 @@ static int bufferediobase_traverse(PyObject *self, visitproc visit, void *arg) { Py_VISIT(Py_TYPE(self)); + Py_VISIT(((iobase *)self)->dict); return 0; } diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c index 14d48813aefe83..a489bc30e88535 100644 --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -26,12 +26,6 @@ class _io._RawIOBase "PyObject *" "clinic_state()->PyRawIOBase_Type" * IOBase class, an abstract class */ -typedef struct { - PyObject_HEAD - - PyObject *dict; - PyObject *weakreflist; -} iobase; PyDoc_STRVAR(iobase_doc, "The abstract base class for all I/O classes.\n" @@ -1040,6 +1034,7 @@ static int rawiobase_traverse(PyObject *self, visitproc visit, void *arg) { Py_VISIT(Py_TYPE(self)); + Py_VISIT(((iobase *)self)->dict); return 0; } diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index e858a1fb498f82..f736db1b232adb 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -171,6 +171,7 @@ static int textiobase_traverse(PyObject *self, visitproc visit, void *arg) { Py_VISIT(Py_TYPE(self)); + Py_VISIT(((iobase *)self)->dict); return 0; } From 1e710b403a7df12a92f89a307910ceae385cd3cd Mon Sep 17 00:00:00 2001 From: Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com> Date: Tue, 16 May 2023 11:34:22 +0000 Subject: [PATCH 2/3] fix by inheriting vsitor --- Modules/_io/_iomodule.h | 8 -------- Modules/_io/bufferedio.c | 11 +---------- Modules/_io/iobase.c | 17 +++++++---------- Modules/_io/textio.c | 10 +--------- 4 files changed, 9 insertions(+), 37 deletions(-) diff --git a/Modules/_io/_iomodule.h b/Modules/_io/_iomodule.h index b97215d89138b4..afd638a120ba08 100644 --- a/Modules/_io/_iomodule.h +++ b/Modules/_io/_iomodule.h @@ -195,11 +195,3 @@ extern PyObject *_PyIOBase_cannot_pickle(PyObject *self, PyObject *args); #ifdef HAVE_WINDOWS_CONSOLE_IO extern char _PyIO_get_console_type(PyObject *); #endif - - -typedef struct { - PyObject_HEAD - - PyObject *dict; - PyObject *weakreflist; -} iobase; diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c index b6dff7777a5b9a..d980588ec44461 100644 --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -2424,14 +2424,6 @@ _io_BufferedRandom___init___impl(buffered *self, PyObject *raw, #include "clinic/bufferedio.c.h" #undef clinic_state -static int -bufferediobase_traverse(PyObject *self, visitproc visit, void *arg) -{ - Py_VISIT(Py_TYPE(self)); - Py_VISIT(((iobase *)self)->dict); - return 0; -} - static PyMethodDef bufferediobase_methods[] = { _IO__BUFFEREDIOBASE_DETACH_METHODDEF _IO__BUFFEREDIOBASE_READ_METHODDEF @@ -2445,13 +2437,12 @@ static PyMethodDef bufferediobase_methods[] = { static PyType_Slot bufferediobase_slots[] = { {Py_tp_doc, (void *)bufferediobase_doc}, {Py_tp_methods, bufferediobase_methods}, - {Py_tp_traverse, bufferediobase_traverse}, {0, NULL}, }; PyType_Spec bufferediobase_spec = { .name = "_io._BufferedIOBase", - .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | + .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_IMMUTABLETYPE), .slots = bufferediobase_slots, }; diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c index a489bc30e88535..43784c7115607d 100644 --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -26,6 +26,12 @@ class _io._RawIOBase "PyObject *" "clinic_state()->PyRawIOBase_Type" * IOBase class, an abstract class */ +typedef struct { + PyObject_HEAD + + PyObject *dict; + PyObject *weakreflist; +} iobase; PyDoc_STRVAR(iobase_doc, "The abstract base class for all I/O classes.\n" @@ -1030,14 +1036,6 @@ rawiobase_write(PyObject *self, PyObject *args) return NULL; } -static int -rawiobase_traverse(PyObject *self, visitproc visit, void *arg) -{ - Py_VISIT(Py_TYPE(self)); - Py_VISIT(((iobase *)self)->dict); - return 0; -} - static PyMethodDef rawiobase_methods[] = { _IO__RAWIOBASE_READ_METHODDEF _IO__RAWIOBASE_READALL_METHODDEF @@ -1049,13 +1047,12 @@ static PyMethodDef rawiobase_methods[] = { static PyType_Slot rawiobase_slots[] = { {Py_tp_doc, (void *)rawiobase_doc}, {Py_tp_methods, rawiobase_methods}, - {Py_tp_traverse, rawiobase_traverse}, {0, NULL}, }; PyType_Spec rawiobase_spec = { .name = "_io._RawIOBase", - .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | + .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_IMMUTABLETYPE), .slots = rawiobase_slots, }; diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index f736db1b232adb..4109b38d65a6e5 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -167,13 +167,6 @@ textiobase_errors_get(PyObject *self, void *context) Py_RETURN_NONE; } -static int -textiobase_traverse(PyObject *self, visitproc visit, void *arg) -{ - Py_VISIT(Py_TYPE(self)); - Py_VISIT(((iobase *)self)->dict); - return 0; -} static PyMethodDef textiobase_methods[] = { _IO__TEXTIOBASE_DETACH_METHODDEF @@ -194,13 +187,12 @@ static PyType_Slot textiobase_slots[] = { {Py_tp_doc, (void *)textiobase_doc}, {Py_tp_methods, textiobase_methods}, {Py_tp_getset, textiobase_getset}, - {Py_tp_traverse, textiobase_traverse}, {0, NULL}, }; PyType_Spec textiobase_spec = { .name = "_io._TextIOBase", - .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC | + .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_IMMUTABLETYPE), .slots = textiobase_slots, }; From 78c12ff40fc00e30d57d02ea0868274750781a90 Mon Sep 17 00:00:00 2001 From: Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com> Date: Tue, 16 May 2023 11:39:55 +0000 Subject: [PATCH 3/3] Add comment --- Modules/_io/bufferedio.c | 1 + Modules/_io/iobase.c | 1 + Modules/_io/textio.c | 1 + 3 files changed, 3 insertions(+) diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c index d980588ec44461..f30d54a5e11b0a 100644 --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -2440,6 +2440,7 @@ static PyType_Slot bufferediobase_slots[] = { {0, NULL}, }; +/* Do not set Py_TPFLAGS_HAVE_GC so that tp_traverse and tp_clear are inherited */ PyType_Spec bufferediobase_spec = { .name = "_io._BufferedIOBase", .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c index 43784c7115607d..bcb498d9c5b5de 100644 --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -1050,6 +1050,7 @@ static PyType_Slot rawiobase_slots[] = { {0, NULL}, }; +/* Do not set Py_TPFLAGS_HAVE_GC so that tp_traverse and tp_clear are inherited */ PyType_Spec rawiobase_spec = { .name = "_io._RawIOBase", .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c index 4109b38d65a6e5..46411c70a96753 100644 --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -190,6 +190,7 @@ static PyType_Slot textiobase_slots[] = { {0, NULL}, }; +/* Do not set Py_TPFLAGS_HAVE_GC so that tp_traverse and tp_clear are inherited */ PyType_Spec textiobase_spec = { .name = "_io._TextIOBase", .flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |