From e02ae467a7e41320b6e6fd4e477d527b1176bd24 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 24 Oct 2020 14:37:43 +0530 Subject: [PATCH] More multi-phase init --- .../gui2/tweak_book/diff/_patiencediff_c.c | 35 +++++++--------- src/calibre/utils/icu.c | 40 +++++++++---------- src/calibre/utils/matcher.c | 39 ++++++++---------- 3 files changed, 50 insertions(+), 64 deletions(-) diff --git a/src/calibre/gui2/tweak_book/diff/_patiencediff_c.c b/src/calibre/gui2/tweak_book/diff/_patiencediff_c.c index 6d951e98fa..f2b4ec29ba 100644 --- a/src/calibre/gui2/tweak_book/diff/_patiencediff_c.c +++ b/src/calibre/gui2/tweak_book/diff/_patiencediff_c.c @@ -1255,30 +1255,25 @@ static PyMethodDef _patiencediff_c_methods[] = { {NULL, NULL, 0, NULL} }; -static struct PyModuleDef _patiencediff_c_module = { - /* m_base */ PyModuleDef_HEAD_INIT, - /* m_name */ "_patiencediff_c", - /* m_doc */ "C implementation of PatienceSequenceMatcher.", - /* m_size */ -1, - /* m_methods */ _patiencediff_c_methods, - /* m_slots */ 0, - /* m_traverse */ 0, - /* m_clear */ 0, - /* m_free */ 0, -}; - -CALIBRE_MODINIT_FUNC PyInit__patiencediff_c(void) { +static int +exec_module(PyObject *mod) { if (PyType_Ready(&PatienceSequenceMatcherType) < 0) - return NULL; - - PyObject *mod = PyModule_Create(&_patiencediff_c_module); - if (mod == NULL) return NULL; - + return -1; Py_INCREF(&PatienceSequenceMatcherType); PyModule_AddObject(mod, "PatienceSequenceMatcher_c", (PyObject *)&PatienceSequenceMatcherType); + return 0; - return mod; } -/* vim: sw=4 et */ +static PyModuleDef_Slot slots[] = { {Py_mod_exec, exec_module}, {0, NULL} }; + +static struct PyModuleDef module_def = { + .m_base = PyModuleDef_HEAD_INIT, + .m_name = "_patiencediff_c", + .m_doc = "C implementation of PatienceSequenceMatcher.", + .m_methods = _patiencediff_c_methods, + .m_slots = slots, +}; + +CALIBRE_MODINIT_FUNC PyInit__patiencediff_c(void) { return PyModuleDef_Init(&module_def); } diff --git a/src/calibre/utils/icu.c b/src/calibre/utils/icu.c index 2625c4def8..62d05de310 100644 --- a/src/calibre/utils/icu.c +++ b/src/calibre/utils/icu.c @@ -1222,19 +1222,8 @@ static PyMethodDef icu_methods[] = { {NULL} /* Sentinel */ }; -static struct PyModuleDef icu_module = { - /* m_base */ PyModuleDef_HEAD_INIT, - /* m_name */ "icu", - /* m_doc */ "Wrapper for the ICU internationalization library", - /* m_size */ -1, - /* m_methods */ icu_methods, - /* m_slots */ 0, - /* m_traverse */ 0, - /* m_clear */ 0, - /* m_free */ 0, -}; - -CALIBRE_MODINIT_FUNC PyInit_icu(void) { +static int +exec_module(PyObject *mod) { UVersionInfo ver, uver; UErrorCode status = U_ZERO_ERROR; char version[U_MAX_VERSION_STRING_LENGTH+1] = {0}, uversion[U_MAX_VERSION_STRING_LENGTH+5] = {0}; @@ -1242,7 +1231,7 @@ CALIBRE_MODINIT_FUNC PyInit_icu(void) { u_init(&status); if (U_FAILURE(status)) { PyErr_Format(PyExc_RuntimeError, "u_init() failed with error: %s", u_errorName(status)); - return NULL; + return -1; } u_getVersion(ver); u_versionToString(ver, version); @@ -1250,13 +1239,9 @@ CALIBRE_MODINIT_FUNC PyInit_icu(void) { u_versionToString(uver, uversion); if (PyType_Ready(&icu_CollatorType) < 0) - return NULL; + return -1; if (PyType_Ready(&icu_BreakIteratorType) < 0) - return NULL; - - PyObject *mod = PyModule_Create(&icu_module); - - if (mod == NULL) return NULL; + return -1; Py_INCREF(&icu_CollatorType); Py_INCREF(&icu_BreakIteratorType); PyModule_AddObject(mod, "Collator", (PyObject *)&icu_CollatorType); @@ -1298,6 +1283,19 @@ CALIBRE_MODINIT_FUNC PyInit_icu(void) { ADDUCONST(UBRK_LINE); ADDUCONST(UBRK_SENTENCE); - return mod; + return 0; } + +static PyModuleDef_Slot slots[] = { {Py_mod_exec, exec_module}, {0, NULL} }; + +static struct PyModuleDef module_def = { + .m_base = PyModuleDef_HEAD_INIT, + .m_name = "icu", + .m_doc = "Wrapper for the ICU internationalization library", + .m_methods = icu_methods, + .m_slots = slots, +}; + +CALIBRE_MODINIT_FUNC PyInit_icu(void) { return PyModuleDef_Init(&module_def); } + // }}} diff --git a/src/calibre/utils/matcher.c b/src/calibre/utils/matcher.c index d8c7d67d3d..f38a7082ce 100644 --- a/src/calibre/utils/matcher.c +++ b/src/calibre/utils/matcher.c @@ -501,31 +501,24 @@ static PyTypeObject MatcherType = { // {{{ /* tp_new */ PyType_GenericNew, }; // }}} -static struct PyModuleDef matcher_module = { - /* m_base */ PyModuleDef_HEAD_INIT, - /* m_name */ "matcher", - /* m_doc */ "Find subsequence matches.", - /* m_size */ -1, - /* m_methods */ 0, - /* m_slots */ 0, - /* m_traverse */ 0, - /* m_clear */ 0, - /* m_free */ 0, -}; - -CALIBRE_MODINIT_FUNC PyInit_matcher(void) { - PyObject *mod = PyModule_Create(&matcher_module); - if (mod == NULL) return NULL; - - if (PyType_Ready(&MatcherType) < 0) { - return NULL; - } - +static int +exec_module(PyObject *mod) { + if (PyType_Ready(&MatcherType) < 0) return -1; Py_INCREF(&MatcherType); if(PyModule_AddObject(mod, "Matcher", (PyObject *)&MatcherType) < 0) { Py_DECREF(&MatcherType); - return NULL; + return -1; } - - return mod; + return 0; } + +static PyModuleDef_Slot slots[] = { {Py_mod_exec, exec_module}, {0, NULL} }; + +static struct PyModuleDef module_def = { + .m_base = PyModuleDef_HEAD_INIT, + .m_name = "matcher", + .m_doc = "Find subsequence matches.", + .m_slots = slots, +}; + +CALIBRE_MODINIT_FUNC PyInit_matcher(void) { return PyModuleDef_Init(&module_def); }