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 00000000000..dd8ac3b406d --- /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 62709822f92..1efc98bf72c 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, };