summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2020-03-19-23-34-22.bpo-1635741.ayunLM.rst1
-rw-r--r--Modules/_collectionsmodule.c84
2 files changed, 43 insertions, 42 deletions
diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-03-19-23-34-22.bpo-1635741.ayunLM.rst b/Misc/NEWS.d/next/Core and Builtins/2020-03-19-23-34-22.bpo-1635741.ayunLM.rst
new file mode 100644
index 0000000..458df4a
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2020-03-19-23-34-22.bpo-1635741.ayunLM.rst
@@ -0,0 +1 @@
+Port _collections module to multiphase initialization (:pep:`489`).
diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c
index fd0e4ed..a595e5b 100644
--- a/Modules/_collectionsmodule.c
+++ b/Modules/_collectionsmodule.c
@@ -2546,24 +2546,59 @@ static PyTypeObject tuplegetter_type = {
/* module level code ********************************************************/
-PyDoc_STRVAR(module_doc,
+PyDoc_STRVAR(collections_doc,
"High performance data structures.\n\
- deque: ordered collection accessible from endpoints only\n\
- defaultdict: dict subclass with a default value factory\n\
");
-static struct PyMethodDef module_functions[] = {
+static struct PyMethodDef collections_methods[] = {
_COLLECTIONS__COUNT_ELEMENTS_METHODDEF
{NULL, NULL} /* sentinel */
};
+static int
+collections_exec(PyObject *module) {
+ PyTypeObject *typelist[] = {
+ &deque_type,
+ &defdict_type,
+ &PyODict_Type,
+ &dequeiter_type,
+ &dequereviter_type,
+ &tuplegetter_type,
+ NULL,
+ };
+
+ defdict_type.tp_base = &PyDict_Type;
+
+ 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(module, name, (PyObject *)type) < 0) {
+ Py_DECREF(type);
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+static struct PyModuleDef_Slot collections_slots[] = {
+ {Py_mod_exec, collections_exec},
+ {0, NULL}
+};
+
static struct PyModuleDef _collectionsmodule = {
PyModuleDef_HEAD_INIT,
"_collections",
- module_doc,
- -1,
- module_functions,
- NULL,
+ collections_doc,
+ 0,
+ collections_methods,
+ collections_slots,
NULL,
NULL,
NULL
@@ -2572,40 +2607,5 @@ static struct PyModuleDef _collectionsmodule = {
PyMODINIT_FUNC
PyInit__collections(void)
{
- PyObject *m;
-
- m = PyModule_Create(&_collectionsmodule);
- if (m == NULL)
- return NULL;
-
- if (PyType_Ready(&deque_type) < 0)
- return NULL;
- Py_INCREF(&deque_type);
- PyModule_AddObject(m, "deque", (PyObject *)&deque_type);
-
- defdict_type.tp_base = &PyDict_Type;
- if (PyType_Ready(&defdict_type) < 0)
- return NULL;
- Py_INCREF(&defdict_type);
- PyModule_AddObject(m, "defaultdict", (PyObject *)&defdict_type);
-
- Py_INCREF(&PyODict_Type);
- PyModule_AddObject(m, "OrderedDict", (PyObject *)&PyODict_Type);
-
- if (PyType_Ready(&dequeiter_type) < 0)
- return NULL;
- Py_INCREF(&dequeiter_type);
- PyModule_AddObject(m, "_deque_iterator", (PyObject *)&dequeiter_type);
-
- if (PyType_Ready(&dequereviter_type) < 0)
- return NULL;
- Py_INCREF(&dequereviter_type);
- PyModule_AddObject(m, "_deque_reverse_iterator", (PyObject *)&dequereviter_type);
-
- if (PyType_Ready(&tuplegetter_type) < 0)
- return NULL;
- Py_INCREF(&tuplegetter_type);
- PyModule_AddObject(m, "_tuplegetter", (PyObject *)&tuplegetter_type);
-
- return m;
+ return PyModuleDef_Init(&_collectionsmodule);
}