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

``