@@ -20,13 +20,26 @@ _Py_IDENTIFIER(_abc_impl);
20
20
_Py_IDENTIFIER (__subclasscheck__ );
21
21
_Py_IDENTIFIER (__subclasshook__ );
22
22
23
+ typedef struct {
24
+ PyTypeObject * _abc_data_type ;
25
+ } _abcmodule_state ;
26
+
23
27
/* A global counter that is incremented each time a class is
24
28
registered as a virtual subclass of anything. It forces the
25
29
negative cache to be cleared before its next use.
26
30
Note: this counter is private. Use `abc.get_cache_token()` for
27
31
external code. */
32
+ // FIXME: PEP 573: Move abc_invalidation_counter into _abcmodule_state.
28
33
static unsigned long long abc_invalidation_counter = 0 ;
29
34
35
+ static inline _abcmodule_state *
36
+ get_abc_state (PyObject * module )
37
+ {
38
+ void * state = PyModule_GetState (module );
39
+ assert (state != NULL );
40
+ return (_abcmodule_state * )state ;
41
+ }
42
+
30
43
/* This object stores internal state for ABCs.
31
44
Note that we can use normal sets for caches,
32
45
since they are never iterated over. */
@@ -41,10 +54,12 @@ typedef struct {
41
54
static void
42
55
abc_data_dealloc (_abc_data * self )
43
56
{
57
+ PyTypeObject * tp = Py_TYPE (self );
44
58
Py_XDECREF (self -> _abc_registry );
45
59
Py_XDECREF (self -> _abc_cache );
46
60
Py_XDECREF (self -> _abc_negative_cache );
47
- Py_TYPE (self )-> tp_free (self );
61
+ tp -> tp_free (self );
62
+ Py_DECREF (tp );
48
63
}
49
64
50
65
static PyObject *
@@ -65,24 +80,29 @@ abc_data_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
65
80
PyDoc_STRVAR (abc_data_doc ,
66
81
"Internal state held by ABC machinery." );
67
82
68
- static PyTypeObject _abc_data_type = {
69
- PyVarObject_HEAD_INIT (NULL , 0 )
70
- "_abc_data" , /*tp_name*/
71
- sizeof (_abc_data ), /*tp_basicsize*/
72
- .tp_dealloc = (destructor )abc_data_dealloc ,
73
- .tp_flags = Py_TPFLAGS_DEFAULT ,
74
- .tp_alloc = PyType_GenericAlloc ,
75
- .tp_new = abc_data_new ,
83
+ static PyType_Slot _abc_data_type_spec_slots [] = {
84
+ {Py_tp_doc , (void * )abc_data_doc },
85
+ {Py_tp_new , abc_data_new },
86
+ {Py_tp_dealloc , abc_data_dealloc },
87
+ {0 , 0 }
88
+ };
89
+
90
+ static PyType_Spec _abc_data_type_spec = {
91
+ .name = "_abc._abc_data" ,
92
+ .basicsize = sizeof (_abc_data ),
93
+ .flags = Py_TPFLAGS_DEFAULT ,
94
+ .slots = _abc_data_type_spec_slots ,
76
95
};
77
96
78
97
static _abc_data *
79
- _get_impl (PyObject * self )
98
+ _get_impl (PyObject * module , PyObject * self )
80
99
{
100
+ _abcmodule_state * state = get_abc_state (module );
81
101
PyObject * impl = _PyObject_GetAttrId (self , & PyId__abc_impl );
82
102
if (impl == NULL ) {
83
103
return NULL ;
84
104
}
85
- if (!Py_IS_TYPE (impl , & _abc_data_type )) {
105
+ if (!Py_IS_TYPE (impl , state -> _abc_data_type )) {
86
106
PyErr_SetString (PyExc_TypeError , "_abc_impl is set to a wrong type" );
87
107
Py_DECREF (impl );
88
108
return NULL ;
@@ -179,7 +199,7 @@ static PyObject *
179
199
_abc__reset_registry (PyObject * module , PyObject * self )
180
200
/*[clinic end generated code: output=92d591a43566cc10 input=12a0b7eb339ac35c]*/
181
201
{
182
- _abc_data * impl = _get_impl (self );
202
+ _abc_data * impl = _get_impl (module , self );
183
203
if (impl == NULL ) {
184
204
return NULL ;
185
205
}
@@ -206,7 +226,7 @@ static PyObject *
206
226
_abc__reset_caches (PyObject * module , PyObject * self )
207
227
/*[clinic end generated code: output=f296f0d5c513f80c input=c0ac616fd8acfb6f]*/
208
228
{
209
- _abc_data * impl = _get_impl (self );
229
+ _abc_data * impl = _get_impl (module , self );
210
230
if (impl == NULL ) {
211
231
return NULL ;
212
232
}
@@ -241,7 +261,7 @@ static PyObject *
241
261
_abc__get_dump (PyObject * module , PyObject * self )
242
262
/*[clinic end generated code: output=9d9569a8e2c1c443 input=2c5deb1bfe9e3c79]*/
243
263
{
244
- _abc_data * impl = _get_impl (self );
264
+ _abc_data * impl = _get_impl (module , self );
245
265
if (impl == NULL ) {
246
266
return NULL ;
247
267
}
@@ -391,13 +411,14 @@ static PyObject *
391
411
_abc__abc_init (PyObject * module , PyObject * self )
392
412
/*[clinic end generated code: output=594757375714cda1 input=8d7fe470ff77f029]*/
393
413
{
414
+ _abcmodule_state * state = get_abc_state (module );
394
415
PyObject * data ;
395
416
if (compute_abstract_methods (self ) < 0 ) {
396
417
return NULL ;
397
418
}
398
419
399
420
/* Set up inheritance registry. */
400
- data = abc_data_new (& _abc_data_type , NULL , NULL );
421
+ data = abc_data_new (state -> _abc_data_type , NULL , NULL );
401
422
if (data == NULL ) {
402
423
return NULL ;
403
424
}
@@ -446,7 +467,7 @@ _abc__abc_register_impl(PyObject *module, PyObject *self, PyObject *subclass)
446
467
if (result < 0 ) {
447
468
return NULL ;
448
469
}
449
- _abc_data * impl = _get_impl (self );
470
+ _abc_data * impl = _get_impl (module , self );
450
471
if (impl == NULL ) {
451
472
return NULL ;
452
473
}
@@ -480,7 +501,7 @@ _abc__abc_instancecheck_impl(PyObject *module, PyObject *self,
480
501
/*[clinic end generated code: output=b8b5148f63b6b56f input=a4f4525679261084]*/
481
502
{
482
503
PyObject * subtype , * result = NULL , * subclass = NULL ;
483
- _abc_data * impl = _get_impl (self );
504
+ _abc_data * impl = _get_impl (module , self );
484
505
if (impl == NULL ) {
485
506
return NULL ;
486
507
}
@@ -576,7 +597,7 @@ _abc__abc_subclasscheck_impl(PyObject *module, PyObject *self,
576
597
PyObject * ok , * subclasses = NULL , * result = NULL ;
577
598
Py_ssize_t pos ;
578
599
int incache ;
579
- _abc_data * impl = _get_impl (self );
600
+ _abc_data * impl = _get_impl (module , self );
580
601
if (impl == NULL ) {
581
602
return NULL ;
582
603
}
@@ -795,7 +816,7 @@ _abc_get_cache_token_impl(PyObject *module)
795
816
return PyLong_FromUnsignedLongLong (abc_invalidation_counter );
796
817
}
797
818
798
- static struct PyMethodDef module_functions [] = {
819
+ static struct PyMethodDef _abcmodule_methods [] = {
799
820
_ABC_GET_CACHE_TOKEN_METHODDEF
800
821
_ABC__ABC_INIT_METHODDEF
801
822
_ABC__RESET_REGISTRY_METHODDEF
@@ -808,30 +829,54 @@ static struct PyMethodDef module_functions[] = {
808
829
};
809
830
810
831
static int
811
- _abc_exec (PyObject * module )
832
+ _abcmodule_exec (PyObject * module )
812
833
{
813
- if (PyType_Ready (& _abc_data_type ) < 0 ) {
834
+ _abcmodule_state * state = get_abc_state (module );
835
+ state -> _abc_data_type = (PyTypeObject * )PyType_FromSpec (& _abc_data_type_spec );
836
+ if (state -> _abc_data_type == NULL ) {
814
837
return -1 ;
815
838
}
816
- _abc_data_type .tp_doc = abc_data_doc ;
839
+
840
+ return 0 ;
841
+ }
842
+
843
+ static int
844
+ _abcmodule_traverse (PyObject * module , visitproc visit , void * arg )
845
+ {
846
+ _abcmodule_state * state = get_abc_state (module );
847
+ Py_VISIT (state -> _abc_data_type );
817
848
return 0 ;
818
849
}
819
850
820
- static PyModuleDef_Slot _abc_slots [] = {
821
- {Py_mod_exec , _abc_exec },
851
+ static int
852
+ _abcmodule_clear (PyObject * module )
853
+ {
854
+ _abcmodule_state * state = get_abc_state (module );
855
+ Py_CLEAR (state -> _abc_data_type );
856
+ return 0 ;
857
+ }
858
+
859
+ static void
860
+ _abcmodule_free (void * module )
861
+ {
862
+ _abcmodule_clear ((PyObject * )module );
863
+ }
864
+
865
+ static PyModuleDef_Slot _abcmodule_slots [] = {
866
+ {Py_mod_exec , _abcmodule_exec },
822
867
{0 , NULL }
823
868
};
824
869
825
870
static struct PyModuleDef _abcmodule = {
826
871
PyModuleDef_HEAD_INIT ,
827
872
"_abc" ,
828
873
_abc__doc__ ,
829
- 0 ,
830
- module_functions ,
831
- _abc_slots ,
832
- NULL ,
833
- NULL ,
834
- NULL
874
+ sizeof ( _abcmodule_state ) ,
875
+ _abcmodule_methods ,
876
+ _abcmodule_slots ,
877
+ _abcmodule_traverse ,
878
+ _abcmodule_clear ,
879
+ _abcmodule_free ,
835
880
};
836
881
837
882
PyMODINIT_FUNC
0 commit comments