bpo-1635741: Port itertools module to multiphase initialization (GH-1… · python/cpython@514c469

@@ -4701,31 +4701,9 @@ combinations(p, r)\n\

47014701

combinations_with_replacement(p, r)\n\

47024702

");

470347034704-4705-

static PyMethodDef module_methods[] = {

4706-

ITERTOOLS_TEE_METHODDEF

4707-

{NULL, NULL} /* sentinel */

4708-

};

4709-4710-4711-

static struct PyModuleDef itertoolsmodule = {

4712-

PyModuleDef_HEAD_INIT,

4713-

"itertools",

4714-

module_doc,

4715-

-1,

4716-

module_methods,

4717-

NULL,

4718-

NULL,

4719-

NULL,

4720-

NULL

4721-

};

4722-4723-

PyMODINIT_FUNC

4724-

PyInit_itertools(void)

4704+

static int

4705+

itertoolsmodule_exec(PyObject *m)

47254706

{

4726-

int i;

4727-

PyObject *m;

4728-

const char *name;

47294707

PyTypeObject *typelist[] = {

47304708

&accumulate_type,

47314709

&combinations_type,

@@ -4751,19 +4729,48 @@ PyInit_itertools(void)

47514729

};

4752473047534731

Py_SET_TYPE(&teedataobject_type, &PyType_Type);

4754-

m = PyModule_Create(&itertoolsmodule);

4755-

if (m == NULL) {

4756-

return NULL;

4757-

}

475847324759-

for (i=0 ; typelist[i] != NULL ; i++) {

4760-

if (PyType_Ready(typelist[i]) < 0) {

4761-

return NULL;

4733+

for (int i = 0; typelist[i] != NULL; i++) {

4734+

PyTypeObject *type = typelist[i];

4735+

if (PyType_Ready(type) < 0) {

4736+

return -1;

4737+

}

4738+

const char *name = _PyType_Name(type);

4739+

Py_INCREF(type);

4740+

if (PyModule_AddObject(m, name, (PyObject *)type) < 0) {

4741+

Py_DECREF(type);

4742+

return -1;

47624743

}

4763-

name = _PyType_Name(typelist[i]);

4764-

Py_INCREF(typelist[i]);

4765-

PyModule_AddObject(m, name, (PyObject *)typelist[i]);

47664744

}

476747454768-

return m;

4746+

return 0;

4747+

}

4748+4749+

static struct PyModuleDef_Slot itertoolsmodule_slots[] = {

4750+

{Py_mod_exec, itertoolsmodule_exec},

4751+

{0, NULL}

4752+

};

4753+4754+

static PyMethodDef module_methods[] = {

4755+

ITERTOOLS_TEE_METHODDEF

4756+

{NULL, NULL} /* sentinel */

4757+

};

4758+4759+4760+

static struct PyModuleDef itertoolsmodule = {

4761+

PyModuleDef_HEAD_INIT,

4762+

"itertools",

4763+

module_doc,

4764+

0,

4765+

module_methods,

4766+

itertoolsmodule_slots,

4767+

NULL,

4768+

NULL,

4769+

NULL

4770+

};

4771+4772+

PyMODINIT_FUNC

4773+

PyInit_itertools(void)

4774+

{

4775+

return PyModuleDef_Init(&itertoolsmodule);

47694776

}