bpo-40149: Implement traverse in _abc._abc_data (GH-19412) · python/cpython@9cc3ebd (original) (raw)
`@@ -51,13 +51,29 @@ typedef struct {
`
51
51
`unsigned long long _abc_negative_cache_version;
`
52
52
`} _abc_data;
`
53
53
``
``
54
`+
static int
`
``
55
`+
abc_data_traverse(_abc_data *self, visitproc visit, void *arg)
`
``
56
`+
{
`
``
57
`+
Py_VISIT(self->_abc_registry);
`
``
58
`+
Py_VISIT(self->_abc_cache);
`
``
59
`+
Py_VISIT(self->_abc_negative_cache);
`
``
60
`+
return 0;
`
``
61
`+
}
`
``
62
+
``
63
`+
static int
`
``
64
`+
abc_data_clear(_abc_data *self)
`
``
65
`+
{
`
``
66
`+
Py_CLEAR(self->_abc_registry);
`
``
67
`+
Py_CLEAR(self->_abc_cache);
`
``
68
`+
Py_CLEAR(self->_abc_negative_cache);
`
``
69
`+
return 0;
`
``
70
`+
}
`
``
71
+
54
72
`static void
`
55
73
`abc_data_dealloc(_abc_data *self)
`
56
74
`{
`
57
75
`PyTypeObject *tp = Py_TYPE(self);
`
58
``
`-
Py_XDECREF(self->_abc_registry);
`
59
``
`-
Py_XDECREF(self->_abc_cache);
`
60
``
`-
Py_XDECREF(self->_abc_negative_cache);
`
``
76
`+
(void)abc_data_clear(self);
`
61
77
`tp->tp_free(self);
`
62
78
`Py_DECREF(tp);
`
63
79
`}
`
`@@ -84,13 +100,15 @@ static PyType_Slot _abc_data_type_spec_slots[] = {
`
84
100
` {Py_tp_doc, (void *)abc_data_doc},
`
85
101
` {Py_tp_new, abc_data_new},
`
86
102
` {Py_tp_dealloc, abc_data_dealloc},
`
``
103
`+
{Py_tp_traverse, abc_data_traverse},
`
``
104
`+
{Py_tp_clear, abc_data_clear},
`
87
105
` {0, 0}
`
88
106
`};
`
89
107
``
90
108
`static PyType_Spec _abc_data_type_spec = {
`
91
109
` .name = "_abc._abc_data",
`
92
110
` .basicsize = sizeof(_abc_data),
`
93
``
`-
.flags = Py_TPFLAGS_DEFAULT,
`
``
111
`+
.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
`
94
112
` .slots = _abc_data_type_spec_slots,
`
95
113
`};
`
96
114
``