/* 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
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);
}