summaryrefslogtreecommitdiffstats
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
parentebf6bb9f5ef032d1646b418ebbb645ea0b217da6 (diff)
downloadcpython-514c469719f149e1722a91a9d0c63bf89dfefb2a.zip
cpython-514c469719f149e1722a91a9d0c63bf89dfefb2a.tar.gz
cpython-514c469719f149e1722a91a9d0c63bf89dfefb2a.tar.bz2
bpo-1635741: Port itertools module to multiphase initialization (GH-19044)
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2020-03-18-00-17-26.bpo-1635741.7AtdhP.rst1
-rw-r--r--Modules/itertoolsmodule.c77
2 files changed, 43 insertions, 35 deletions
diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-03-18-00-17-26.bpo-1635741.7AtdhP.rst b/Misc/NEWS.d/next/Core and Builtins/2020-03-18-00-17-26.bpo-1635741.7AtdhP.rst
new file mode 100644
index 0000000..2347203
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2020-03-18-00-17-26.bpo-1635741.7AtdhP.rst
@@ -0,0 +1 @@
+Port itertools module to multiphase initialization (:pep:`489`).
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);
}