From: Victor Stinner Date: Tue, 7 Apr 2020 16:36:04 +0000 (+0200) Subject: bpo-40149: Implement traverse in _abc._abc_data (GH-19412) X-Git-Tag: v3.9.0a6~179 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9cc3ebd7e04cb645ac7b2f372eaafa7464e16b9c;p=thirdparty%2FPython%2Fcpython.git bpo-40149: Implement traverse in _abc._abc_data (GH-19412) Implement traverse and clear slots in _abc._abc_data type. --- diff --git a/Misc/NEWS.d/next/Library/2020-04-07-18-06-38.bpo-40149.mMU2iu.rst b/Misc/NEWS.d/next/Library/2020-04-07-18-06-38.bpo-40149.mMU2iu.rst new file mode 100644 index 000000000000..dd8ac3b406d3 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-04-07-18-06-38.bpo-40149.mMU2iu.rst @@ -0,0 +1 @@ +Implement traverse and clear slots in _abc._abc_data type. diff --git a/Modules/_abc.c b/Modules/_abc.c index 62709822f923..1efc98bf72c0 100644 --- a/Modules/_abc.c +++ b/Modules/_abc.c @@ -51,13 +51,29 @@ typedef struct { unsigned long long _abc_negative_cache_version; } _abc_data; +static int +abc_data_traverse(_abc_data *self, visitproc visit, void *arg) +{ + Py_VISIT(self->_abc_registry); + Py_VISIT(self->_abc_cache); + Py_VISIT(self->_abc_negative_cache); + return 0; +} + +static int +abc_data_clear(_abc_data *self) +{ + Py_CLEAR(self->_abc_registry); + Py_CLEAR(self->_abc_cache); + Py_CLEAR(self->_abc_negative_cache); + return 0; +} + static void abc_data_dealloc(_abc_data *self) { PyTypeObject *tp = Py_TYPE(self); - Py_XDECREF(self->_abc_registry); - Py_XDECREF(self->_abc_cache); - Py_XDECREF(self->_abc_negative_cache); + (void)abc_data_clear(self); tp->tp_free(self); Py_DECREF(tp); } @@ -84,13 +100,15 @@ static PyType_Slot _abc_data_type_spec_slots[] = { {Py_tp_doc, (void *)abc_data_doc}, {Py_tp_new, abc_data_new}, {Py_tp_dealloc, abc_data_dealloc}, + {Py_tp_traverse, abc_data_traverse}, + {Py_tp_clear, abc_data_clear}, {0, 0} }; static PyType_Spec _abc_data_type_spec = { .name = "_abc._abc_data", .basicsize = sizeof(_abc_data), - .flags = Py_TPFLAGS_DEFAULT, + .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, .slots = _abc_data_type_spec_slots, };