bpo-1635741: Port itertools module to multiphase initialization (GH-1… · python/cpython@514c469
@@ -4701,31 +4701,9 @@ combinations(p, r)\n\
47014701combinations_with_replacement(p, r)\n\
47024702");
470347034704-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;
47294707PyTypeObject *typelist[] = {
47304708&accumulate_type,
47314709&combinations_type,
@@ -4751,19 +4729,48 @@ PyInit_itertools(void)
47514729 };
4752473047534731Py_SET_TYPE(&teedataobject_type, &PyType_Type);
4754-m = PyModule_Create(&itertoolsmodule);
4755-if (m == NULL) {
4756-return NULL;
4757- }
475847324759-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 }
476747454768-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}