bpo-1635741: Port _collections module to multiphase initialization (GH-19074)

This commit is contained in:
Dong-hee Na 2020-03-20 01:16:04 +09:00 committed by GitHub
parent 9052f7a41b
commit 77248a2889
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 43 additions and 42 deletions

View File

@ -0,0 +1 @@
Port _collections module to multiphase initialization (:pep:`489`).

View 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);
}