Skip to content

Commit 514c469

Browse files
authored
bpo-1635741: Port itertools module to multiphase initialization (GH-19044)
1 parent ebf6bb9 commit 514c469

File tree

2 files changed

+43
-35
lines changed

2 files changed

+43
-35
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Port itertools module to multiphase initialization (:pep:`489`).

Modules/itertoolsmodule.c

+42-35
Original file line numberDiff line numberDiff line change
@@ -4701,31 +4701,9 @@ combinations(p, r)\n\
47014701
combinations_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

Comments
 (0)