Skip to content

Commit 03e4fce

Browse files
committed
port _curses_panel to multi-phase
1 parent a02efe4 commit 03e4fce

File tree

1 file changed

+37
-41
lines changed

1 file changed

+37
-41
lines changed

Modules/_curses_panel.c

+37-41
Original file line numberDiff line numberDiff line change
@@ -610,7 +610,6 @@ _curses_panel_update_panels_impl(PyObject *module)
610610
Py_RETURN_NONE;
611611
}
612612

613-
614613
/* List of functions defined in the module */
615614

616615
static PyMethodDef PyCurses_methods[] = {
@@ -622,57 +621,54 @@ static PyMethodDef PyCurses_methods[] = {
622621
};
623622

624623
/* Initialization function for the module */
625-
626-
627-
static struct PyModuleDef _curses_panelmodule = {
628-
PyModuleDef_HEAD_INIT,
629-
"_curses_panel",
630-
NULL,
631-
sizeof(_curses_panelstate),
632-
PyCurses_methods,
633-
NULL,
634-
_curses_panel_traverse,
635-
_curses_panel_clear,
636-
_curses_panel_free
637-
};
638-
639-
PyMODINIT_FUNC
640-
PyInit__curses_panel(void)
624+
static int
625+
_curses_exec(PyObject *m)
641626
{
642-
PyObject *m, *d, *v;
643-
644-
/* Create the module and add the functions */
645-
m = PyModule_Create(&_curses_panelmodule);
646-
if (m == NULL)
647-
goto fail;
648-
d = PyModule_GetDict(m);
649-
627+
_curses_panel_state *st = get_curses_panelstate(m);
650628
/* Initialize object type */
651-
v = PyType_FromSpec(&PyCursesPanel_Type_spec);
652-
if (v == NULL)
653-
goto fail;
654-
((PyTypeObject *)v)->tp_new = NULL;
655-
get_curses_panelstate(m)->PyCursesPanel_Type = v;
629+
st->PyCursesPanel_Type = PyType_FromSpec(&PyCursesPanel_Type_spec);
630+
if (st->PyCursesPanel_Type == NULL)
631+
return -1;
632+
633+
if (PyModule_AddType(m, st->PyCursesPanel_Type) < 0)
634+
return -1;
656635

657636
import_curses();
658637
if (PyErr_Occurred())
659-
goto fail;
638+
return -1;
660639

640+
PyObject *d = PyModule_GetDict(m);
661641
/* For exception _curses_panel.error */
662-
get_curses_panelstate(m)->PyCursesError = PyErr_NewException("_curses_panel.error", NULL, NULL);
663-
PyDict_SetItemString(d, "error", get_curses_panelstate(m)->PyCursesError);
642+
st->PyCursesError = PyErr_NewException("_curses_panel.error", NULL, NULL);
643+
PyDict_SetItemString(d, "error", st->PyCursesError);
664644

665645
/* Make the version available */
666-
v = PyUnicode_FromString(PyCursesVersion);
646+
PyObject *v = PyUnicode_FromString(PyCursesVersion);
667647
PyDict_SetItemString(d, "version", v);
668648
PyDict_SetItemString(d, "__version__", v);
669649
Py_DECREF(v);
670650

671-
Py_INCREF(get_curses_panelstate(m)->PyCursesPanel_Type);
672-
PyModule_AddObject(m, "panel",
673-
(PyObject *)get_curses_panelstate(m)->PyCursesPanel_Type);
674-
return m;
675-
fail:
676-
Py_XDECREF(m);
677-
return NULL;
651+
return 0;
678652
}
653+
654+
static PyModuleDef_Slot _curses_slots[] = {
655+
{Py_mod_exec, _curses_exec},
656+
{0, NULL}
657+
};
658+
659+
static struct PyModuleDef _curses_panelmodule = {
660+
PyModuleDef_HEAD_INIT,
661+
.m_name = "_curses_panel",
662+
.m_size = sizeof(_curses_panelstate),
663+
.m_methods = PyCurses_methods,
664+
.m_slots = _curses_slots,
665+
.m_traverse = _curses_panel_traverse,
666+
.m_clear = _curses_panel_clear,
667+
.m_free = _curses_panel_free
668+
};
669+
670+
PyMODINIT_FUNC
671+
PyInit__curses_panel(void)
672+
{
673+
return PyModuleDef_Init(&_curses_panelmodule);
674+
}

0 commit comments

Comments
 (0)