Skip to content

Commit 6ca25df

Browse files
Multi-phase init
1 parent 2224356 commit 6ca25df

File tree

1 file changed

+27
-30
lines changed

1 file changed

+27
-30
lines changed

Modules/_elementtree.c

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4312,19 +4312,6 @@ static PyMethodDef _functions[] = {
43124312
{NULL, NULL}
43134313
};
43144314

4315-
4316-
static struct PyModuleDef elementtreemodule = {
4317-
PyModuleDef_HEAD_INIT,
4318-
"_elementtree",
4319-
NULL,
4320-
sizeof(elementtreestate),
4321-
_functions,
4322-
NULL,
4323-
elementtree_traverse,
4324-
elementtree_clear,
4325-
elementtree_free
4326-
};
4327-
43284315
#define CREATE_TYPE(module, type, spec) \
43294316
do { \
43304317
if (type != NULL) { \
@@ -4336,21 +4323,10 @@ do { \
43364323
} \
43374324
} while (0)
43384325

4339-
PyMODINIT_FUNC
4340-
PyInit__elementtree(void)
4326+
static int
4327+
module_exec(PyObject *m)
43414328
{
4342-
PyObject *m = NULL;
4343-
elementtreestate *st = NULL;
4344-
4345-
m = PyState_FindModule(&elementtreemodule);
4346-
if (m) {
4347-
return Py_NewRef(m);
4348-
}
4349-
4350-
m = PyModule_Create(&elementtreemodule);
4351-
if (!m)
4352-
goto error;
4353-
st = get_elementtree_state(m);
4329+
elementtreestate *st = get_elementtree_state(m);
43544330

43554331
/* Initialize object types */
43564332
CREATE_TYPE(m, st->ElementIter_Type, &elementiter_spec);
@@ -4435,9 +4411,30 @@ PyInit__elementtree(void)
44354411
}
44364412
}
44374413

4438-
return m;
4414+
return 0;
44394415

44404416
error:
4441-
Py_XDECREF(m);
4442-
return NULL;
4417+
return -1;
4418+
}
4419+
4420+
static struct PyModuleDef_Slot elementtree_slots[] = {
4421+
{Py_mod_exec, module_exec},
4422+
{0, NULL},
4423+
};
4424+
4425+
static struct PyModuleDef elementtreemodule = {
4426+
.m_base = PyModuleDef_HEAD_INIT,
4427+
.m_name = "_elementtree",
4428+
.m_size = sizeof(elementtreestate),
4429+
.m_methods = _functions,
4430+
.m_slots = elementtree_slots,
4431+
.m_traverse = elementtree_traverse,
4432+
.m_clear = elementtree_clear,
4433+
.m_free = elementtree_free,
4434+
};
4435+
4436+
PyMODINIT_FUNC
4437+
PyInit__elementtree(void)
4438+
{
4439+
return PyModuleDef_Init(&elementtreemodule);
44434440
}

0 commit comments

Comments
 (0)