]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-1635741: Port _collections module to multiphase initialization (GH-19074)
authorDong-hee Na <donghee.na92@gmail.com>
Thu, 19 Mar 2020 16:16:04 +0000 (01:16 +0900)
committerGitHub <noreply@github.com>
Thu, 19 Mar 2020 16:16:04 +0000 (17:16 +0100)
Misc/NEWS.d/next/Core and Builtins/2020-03-19-23-34-22.bpo-1635741.ayunLM.rst [new file with mode: 0644]
Modules/_collectionsmodule.c

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 (file)
index 0000000..458df4a
--- /dev/null
@@ -0,0 +1 @@
+Port _collections module to multiphase initialization (:pep:`489`).
index fd0e4edcddfdbe22fbd55315188cfa205332f512..a595e5b5ea341c2e2d30b5b6145f126d3eda5a78 100644 (file)
@@ -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);
 }