diff options
-rw-r--r-- | Misc/NEWS.d/next/Core and Builtins/2020-03-19-23-34-22.bpo-1635741.ayunLM.rst | 1 | ||||
-rw-r--r-- | Modules/_collectionsmodule.c | 84 |
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); } |