@@ -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
0 commit comments