summaryrefslogtreecommitdiffstats
path: root/Modules/itertoolsmodule.c
diff options
context:
space:
mode:
authorDong-hee Na <donghee.na92@gmail.com>2020-03-17 17:46:24 (GMT)
committerGitHub <noreply@github.com>2020-03-17 17:46:24 (GMT)
commit514c469719f149e1722a91a9d0c63bf89dfefb2a (patch)
tree308bfc904b0ec12e6f89263c688d90f9d0fbd6dd /Modules/itertoolsmodule.c
parentebf6bb9f5ef032d1646b418ebbb645ea0b217da6 (diff)
downloadcpython-514c469719f149e1722a91a9d0c63bf89dfefb2a.zip
cpython-514c469719f149e1722a91a9d0c63bf89dfefb2a.tar.gz
cpython-514c469719f149e1722a91a9d0c63bf89dfefb2a.tar.bz2
bpo-1635741: Port itertools module to multiphase initialization (GH-19044)
Diffstat (limited to 'Modules/itertoolsmodule.c')
-rw-r--r--Modules/itertoolsmodule.c77
1 files changed, 42 insertions, 35 deletions
diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c
index 9505fd4..72fd3d7 100644
--- a/Modules/itertoolsmodule.c
+++ b/Modules/itertoolsmodule.c
@@ -4701,31 +4701,9 @@ combinations(p, r)\n\
combinations_with_replacement(p, r)\n\
");
-
-static PyMethodDef module_methods[] = {
- ITERTOOLS_TEE_METHODDEF
- {NULL, NULL} /* sentinel */
-};
-
-
-static struct PyModuleDef itertoolsmodule = {
- PyModuleDef_HEAD_INIT,
- "itertools",
- module_doc,
- -1,
- module_methods,
- NULL,
- NULL,
- NULL,
- NULL
-};
-
-PyMODINIT_FUNC
-PyInit_itertools(void)
+static int
+itertoolsmodule_exec(PyObject *m)
{
- int i;
- PyObject *m;
- const char *name;
PyTypeObject *typelist[] = {
&accumulate_type,
&combinations_type,
@@ -4751,19 +4729,48 @@ PyInit_itertools(void)
};
Py_SET_TYPE(&teedataobject_type, &PyType_Type);
- m = PyModule_Create(&itertoolsmodule);
- if (m == NULL) {
- return NULL;
- }
- for (i=0 ; typelist[i] != NULL ; i++) {
- if (PyType_Ready(typelist[i]) < 0) {
- return NULL;
+ for (int i = 0; typelist[i] != NULL; i++) {
+ PyTypeObject *type = typelist[i];
+ if (PyType_Ready(type) < 0) {
+ return -1;
+ }
+ const char *name = _PyType_Name(type);
+ Py_INCREF(type);
+ if (PyModule_AddObject(m, name, (PyObject *)type) < 0) {
+ Py_DECREF(type);
+ return -1;
}
- name = _PyType_Name(typelist[i]);
- Py_INCREF(typelist[i]);
- PyModule_AddObject(m, name, (PyObject *)typelist[i]);
}
- return m;
+ return 0;
+}
+
+static struct PyModuleDef_Slot itertoolsmodule_slots[] = {
+ {Py_mod_exec, itertoolsmodule_exec},
+ {0, NULL}
+};
+
+static PyMethodDef module_methods[] = {
+ ITERTOOLS_TEE_METHODDEF
+ {NULL, NULL} /* sentinel */
+};
+
+
+static struct PyModuleDef itertoolsmodule = {
+ PyModuleDef_HEAD_INIT,
+ "itertools",
+ module_doc,
+ 0,
+ module_methods,
+ itertoolsmodule_slots,
+ NULL,
+ NULL,
+ NULL
+};
+
+PyMODINIT_FUNC
+PyInit_itertools(void)
+{
+ return PyModuleDef_Init(&itertoolsmodule);
}