88 * Lib/test/test_capi/test_module.py
99 */
1010
11+ PyABIInfo_VAR (abi_info );
12+
1113static PyObject *
1214module_from_slots_empty (PyObject * self , PyObject * spec )
1315{
@@ -17,6 +19,16 @@ module_from_slots_empty(PyObject *self, PyObject *spec)
1719 return PyModule_FromSlotsAndSpec (slots , spec );
1820}
1921
22+ static PyObject *
23+ module_from_slots_minimal (PyObject * self , PyObject * spec )
24+ {
25+ PyModuleDef_Slot slots [] = {
26+ {Py_mod_abi , & abi_info },
27+ {0 },
28+ };
29+ return PyModule_FromSlotsAndSpec (slots , spec );
30+ }
31+
2032static PyObject *
2133module_from_slots_null (PyObject * self , PyObject * spec )
2234{
@@ -27,6 +39,7 @@ static PyObject *
2739module_from_slots_name (PyObject * self , PyObject * spec )
2840{
2941 PyModuleDef_Slot slots [] = {
42+ {Py_mod_abi , & abi_info },
3043 {Py_mod_name , "currently ignored..." },
3144 {Py_mod_multiple_interpreters , Py_MOD_PER_INTERPRETER_GIL_SUPPORTED },
3245 {Py_mod_gil , Py_MOD_GIL_NOT_USED },
@@ -39,6 +52,7 @@ static PyObject *
3952module_from_slots_doc (PyObject * self , PyObject * spec )
4053{
4154 PyModuleDef_Slot slots [] = {
55+ {Py_mod_abi , & abi_info },
4256 {Py_mod_doc , "the docstring" },
4357 {Py_mod_multiple_interpreters , Py_MOD_PER_INTERPRETER_GIL_SUPPORTED },
4458 {Py_mod_gil , Py_MOD_GIL_NOT_USED },
@@ -51,6 +65,7 @@ static PyObject *
5165module_from_slots_size (PyObject * self , PyObject * spec )
5266{
5367 PyModuleDef_Slot slots [] = {
68+ {Py_mod_abi , & abi_info },
5469 {Py_mod_state_size , (void * )123 },
5570 {Py_mod_multiple_interpreters , Py_MOD_PER_INTERPRETER_GIL_SUPPORTED },
5671 {Py_mod_gil , Py_MOD_GIL_NOT_USED },
@@ -78,6 +93,7 @@ static PyObject *
7893module_from_slots_methods (PyObject * self , PyObject * spec )
7994{
8095 PyModuleDef_Slot slots [] = {
96+ {Py_mod_abi , & abi_info },
8197 {Py_mod_methods , a_methoddef_array },
8298 {Py_mod_multiple_interpreters , Py_MOD_PER_INTERPRETER_GIL_SUPPORTED },
8399 {Py_mod_gil , Py_MOD_GIL_NOT_USED },
@@ -96,6 +112,7 @@ static PyObject *
96112module_from_slots_gc (PyObject * self , PyObject * spec )
97113{
98114 PyModuleDef_Slot slots [] = {
115+ {Py_mod_abi , & abi_info },
99116 {Py_mod_state_traverse , noop_traverse },
100117 {Py_mod_state_clear , noop_clear },
101118 {Py_mod_state_free , noop_free },
@@ -128,6 +145,7 @@ static PyObject *
128145module_from_slots_token (PyObject * self , PyObject * spec )
129146{
130147 PyModuleDef_Slot slots [] = {
148+ {Py_mod_abi , & abi_info },
131149 {Py_mod_token , (void * )& test_token },
132150 {Py_mod_multiple_interpreters , Py_MOD_PER_INTERPRETER_GIL_SUPPORTED },
133151 {Py_mod_gil , Py_MOD_GIL_NOT_USED },
@@ -156,6 +174,7 @@ static PyObject *
156174module_from_slots_exec (PyObject * self , PyObject * spec )
157175{
158176 PyModuleDef_Slot slots [] = {
177+ {Py_mod_abi , & abi_info },
159178 {Py_mod_exec , simple_exec },
160179 {Py_mod_multiple_interpreters , Py_MOD_PER_INTERPRETER_GIL_SUPPORTED },
161180 {Py_mod_gil , Py_MOD_GIL_NOT_USED },
@@ -189,6 +208,7 @@ static PyObject *
189208module_from_slots_create (PyObject * self , PyObject * spec )
190209{
191210 PyModuleDef_Slot slots [] = {
211+ {Py_mod_abi , & abi_info },
192212 {Py_mod_create , create_attr_from_spec },
193213 {Py_mod_multiple_interpreters , Py_MOD_PER_INTERPRETER_GIL_SUPPORTED },
194214 {Py_mod_gil , Py_MOD_GIL_NOT_USED },
@@ -220,6 +240,7 @@ module_from_slots_repeat_slot(PyObject *self, PyObject *spec)
220240 return NULL ;
221241 }
222242 PyModuleDef_Slot slots [] = {
243+ {Py_mod_abi , & abi_info },
223244 {slot_id , "anything" },
224245 {slot_id , "anything else" },
225246 {Py_mod_multiple_interpreters , Py_MOD_PER_INTERPRETER_GIL_SUPPORTED },
@@ -238,6 +259,7 @@ module_from_slots_null_slot(PyObject *self, PyObject *spec)
238259 }
239260 PyModuleDef_Slot slots [] = {
240261 {slot_id , NULL },
262+ {Py_mod_abi , & abi_info },
241263 {Py_mod_multiple_interpreters , Py_MOD_PER_INTERPRETER_GIL_SUPPORTED },
242264 {Py_mod_gil , Py_MOD_GIL_NOT_USED },
243265 {0 },
@@ -254,6 +276,7 @@ module_from_def_slot(PyObject *self, PyObject *spec)
254276 }
255277 PyModuleDef_Slot slots [] = {
256278 {slot_id , "anything" },
279+ {Py_mod_abi , & abi_info },
257280 {Py_mod_multiple_interpreters , Py_MOD_PER_INTERPRETER_GIL_SUPPORTED },
258281 {Py_mod_gil , Py_MOD_GIL_NOT_USED },
259282 {0 },
@@ -285,6 +308,7 @@ static PyModuleDef parrot_def = {
285308 .m_slots = NULL /* set below */ ,
286309};
287310static PyModuleDef_Slot parrot_slots [] = {
311+ {Py_mod_abi , & abi_info },
288312 {Py_mod_name , (void * )parrot_name },
289313 {Py_mod_doc , (void * )parrot_doc },
290314 {Py_mod_state_size , (void * )123 },
@@ -314,6 +338,43 @@ module_from_def_slot_parrot(PyObject *self, PyObject *spec)
314338 return module ;
315339}
316340
341+ static PyObject *
342+ module_from_bad_abiinfo (PyObject * self , PyObject * spec )
343+ {
344+ PyABIInfo bad_abi_info = {
345+ 1 , 0 ,
346+ .abi_version = 0x02080000 ,
347+ };
348+ PyModuleDef_Slot slots [] = {
349+ {Py_mod_abi , & abi_info },
350+ {Py_mod_abi , & bad_abi_info },
351+ {Py_mod_multiple_interpreters , Py_MOD_PER_INTERPRETER_GIL_SUPPORTED },
352+ {Py_mod_gil , Py_MOD_GIL_NOT_USED },
353+ {0 },
354+ };
355+ return PyModule_FromSlotsAndSpec (slots , spec );
356+ }
357+
358+ static PyObject *
359+ module_from_multiple_abiinfo (PyObject * self , PyObject * spec )
360+ {
361+ PyABIInfo extra_abi_info = {
362+ 1 , 0 ,
363+ .flags = PyABIInfo_STABLE | PyABIInfo_FREETHREADING_AGNOSTIC ,
364+ .abi_version = 0x03040000 ,
365+ };
366+ PyModuleDef_Slot slots [] = {
367+ {Py_mod_abi , & abi_info },
368+ {Py_mod_abi , & abi_info },
369+ {Py_mod_abi , & extra_abi_info },
370+ {Py_mod_abi , & extra_abi_info },
371+ {Py_mod_multiple_interpreters , Py_MOD_PER_INTERPRETER_GIL_SUPPORTED },
372+ {Py_mod_gil , Py_MOD_GIL_NOT_USED },
373+ {0 },
374+ };
375+ return PyModule_FromSlotsAndSpec (slots , spec );
376+ }
377+
317378static int
318379another_exec (PyObject * module )
319380{
@@ -344,6 +405,7 @@ static PyObject *
344405module_from_def_multiple_exec (PyObject * self , PyObject * spec )
345406{
346407 static PyModuleDef_Slot slots [] = {
408+ {Py_mod_abi , & abi_info },
347409 {Py_mod_exec , simple_exec },
348410 {Py_mod_exec , another_exec },
349411 {Py_mod_multiple_interpreters , Py_MOD_PER_INTERPRETER_GIL_SUPPORTED },
@@ -399,6 +461,7 @@ pymodule_get_state_size(PyObject *self, PyObject *module)
399461
400462static PyMethodDef test_methods [] = {
401463 {"module_from_slots_empty" , module_from_slots_empty , METH_O },
464+ {"module_from_slots_minimal" , module_from_slots_minimal , METH_O },
402465 {"module_from_slots_null" , module_from_slots_null , METH_O },
403466 {"module_from_slots_name" , module_from_slots_name , METH_O },
404467 {"module_from_slots_doc" , module_from_slots_doc , METH_O },
@@ -413,6 +476,8 @@ static PyMethodDef test_methods[] = {
413476 {"module_from_def_multiple_exec" , module_from_def_multiple_exec , METH_O },
414477 {"module_from_def_slot" , module_from_def_slot , METH_O },
415478 {"module_from_def_slot_parrot" , module_from_def_slot_parrot , METH_O },
479+ {"module_from_bad_abiinfo" , module_from_bad_abiinfo , METH_O },
480+ {"module_from_multiple_abiinfo" , module_from_multiple_abiinfo , METH_O },
416481 {"pymodule_get_token" , pymodule_get_token , METH_O },
417482 {"pymodule_get_def" , pymodule_get_def , METH_O },
418483 {"pymodule_get_state_size" , pymodule_get_state_size , METH_O },
0 commit comments