@@ -4701,31 +4701,9 @@ combinations(p, r)\n\
47014701combinations_with_replacement(p, r)\n\
47024702" );
47034703
4704-
4705- static PyMethodDef module_methods [] = {
4706- ITERTOOLS_TEE_METHODDEF
4707- {NULL , NULL } /* sentinel */
4708- };
4709-
4710-
4711- static struct PyModuleDef itertoolsmodule = {
4712- PyModuleDef_HEAD_INIT ,
4713- "itertools" ,
4714- module_doc ,
4715- -1 ,
4716- module_methods ,
4717- NULL ,
4718- NULL ,
4719- NULL ,
4720- NULL
4721- };
4722-
4723- PyMODINIT_FUNC
4724- PyInit_itertools (void )
4704+ static int
4705+ itertoolsmodule_exec (PyObject * m )
47254706{
4726- int i ;
4727- PyObject * m ;
4728- const char * name ;
47294707 PyTypeObject * typelist [] = {
47304708 & accumulate_type ,
47314709 & combinations_type ,
@@ -4751,19 +4729,48 @@ PyInit_itertools(void)
47514729 };
47524730
47534731 Py_SET_TYPE (& teedataobject_type , & PyType_Type );
4754- m = PyModule_Create (& itertoolsmodule );
4755- if (m == NULL ) {
4756- return NULL ;
4757- }
47584732
4759- for (i = 0 ; typelist [i ] != NULL ; i ++ ) {
4760- if (PyType_Ready (typelist [i ]) < 0 ) {
4761- return NULL ;
4733+ for (int i = 0 ; typelist [i ] != NULL ; i ++ ) {
4734+ PyTypeObject * type = typelist [i ];
4735+ if (PyType_Ready (type ) < 0 ) {
4736+ return -1 ;
4737+ }
4738+ const char * name = _PyType_Name (type );
4739+ Py_INCREF (type );
4740+ if (PyModule_AddObject (m , name , (PyObject * )type ) < 0 ) {
4741+ Py_DECREF (type );
4742+ return -1 ;
47624743 }
4763- name = _PyType_Name (typelist [i ]);
4764- Py_INCREF (typelist [i ]);
4765- PyModule_AddObject (m , name , (PyObject * )typelist [i ]);
47664744 }
47674745
4768- return m ;
4746+ return 0 ;
4747+ }
4748+
4749+ static struct PyModuleDef_Slot itertoolsmodule_slots [] = {
4750+ {Py_mod_exec , itertoolsmodule_exec },
4751+ {0 , NULL }
4752+ };
4753+
4754+ static PyMethodDef module_methods [] = {
4755+ ITERTOOLS_TEE_METHODDEF
4756+ {NULL , NULL } /* sentinel */
4757+ };
4758+
4759+
4760+ static struct PyModuleDef itertoolsmodule = {
4761+ PyModuleDef_HEAD_INIT ,
4762+ "itertools" ,
4763+ module_doc ,
4764+ 0 ,
4765+ module_methods ,
4766+ itertoolsmodule_slots ,
4767+ NULL ,
4768+ NULL ,
4769+ NULL
4770+ };
4771+
4772+ PyMODINIT_FUNC
4773+ PyInit_itertools (void )
4774+ {
4775+ return PyModuleDef_Init (& itertoolsmodule );
47694776}
0 commit comments