From 692c2e663c0b79a598b6155a77bfef7029f80e3f Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 8 Jan 2021 15:00:02 +0100 Subject: [PATCH 1/2] bpo-42866: Add traverse func to _multibytecodec.MultibyteCodec Convert _multibytecodec.MultibyteCodec type to a GC type and adds a traverse function. --- Modules/cjkcodecs/multibytecodec.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c index 4f34b8a82fb94d..60e03275b95004 100644 --- a/Modules/cjkcodecs/multibytecodec.c +++ b/Modules/cjkcodecs/multibytecodec.c @@ -721,11 +721,18 @@ static struct PyMethodDef multibytecodec_methods[] = { {NULL, NULL}, }; +static int +multibytecodec_traverse(PyObject *self, visitproc visit, void *arg) +{ + Py_VISIT(Py_TYPE(self)); + return 0; +} + static void multibytecodec_dealloc(MultibyteCodecObject *self) { PyTypeObject *tp = Py_TYPE(self); - PyObject_Free(self); + tp->tp_free(self); Py_DECREF(tp); } @@ -733,13 +740,14 @@ static PyType_Slot multibytecodec_slots[] = { {Py_tp_dealloc, multibytecodec_dealloc}, {Py_tp_getattro, PyObject_GenericGetAttr}, {Py_tp_methods, multibytecodec_methods}, + {Py_tp_traverse, multibytecodec_traverse}, {0, NULL}, }; static PyType_Spec multibytecodec_spec = { .name = MODULE_NAME ".MultibyteCodec", .basicsize = sizeof(MultibyteCodecObject), - .flags = Py_TPFLAGS_DEFAULT, + .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, .slots = multibytecodec_slots, }; @@ -1944,7 +1952,7 @@ _multibytecodec___create_codec(PyObject *module, PyObject *arg) return NULL; _multibytecodec_state *state = _multibytecodec_get_state(module); - self = PyObject_New(MultibyteCodecObject, state->multibytecodec_type); + self = PyObject_GC_New(MultibyteCodecObject, state->multibytecodec_type); if (self == NULL) return NULL; self->codec = codec; From c039a6eca3a41c7120e5e15960c3d451098c4b6e Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 8 Jan 2021 15:15:08 +0100 Subject: [PATCH 2/2] Track/untrack the instance in the GC --- Modules/cjkcodecs/multibytecodec.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c index 60e03275b95004..5070c983d402c3 100644 --- a/Modules/cjkcodecs/multibytecodec.c +++ b/Modules/cjkcodecs/multibytecodec.c @@ -731,6 +731,7 @@ multibytecodec_traverse(PyObject *self, visitproc visit, void *arg) static void multibytecodec_dealloc(MultibyteCodecObject *self) { + PyObject_GC_UnTrack(self); PyTypeObject *tp = Py_TYPE(self); tp->tp_free(self); Py_DECREF(tp); @@ -1957,6 +1958,7 @@ _multibytecodec___create_codec(PyObject *module, PyObject *arg) return NULL; self->codec = codec; + PyObject_GC_Track(self); return (PyObject *)self; }