From 027bf97633269b9ba11ff4e8e17a13af925472b4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 24 Oct 2020 14:28:56 +0530 Subject: [PATCH] Move more extension modules to multi-phase initialization --- .../gui2/tweak_book/editor/syntax/html.c | 45 +++++++++---------- src/calibre/utils/certgen.c | 32 ++++++------- src/tinycss/tokenizer.c | 33 +++++++------- 3 files changed, 50 insertions(+), 60 deletions(-) diff --git a/src/calibre/gui2/tweak_book/editor/syntax/html.c b/src/calibre/gui2/tweak_book/editor/syntax/html.c index b43dd764cf..638879cffc 100644 --- a/src/calibre/gui2/tweak_book/editor/syntax/html.c +++ b/src/calibre/gui2/tweak_book/editor/syntax/html.c @@ -482,35 +482,21 @@ static PyMethodDef html_methods[] = { {NULL, NULL, 0, NULL} }; -static struct PyModuleDef html_module = { - /* m_base */ PyModuleDef_HEAD_INIT, - /* m_name */ "html_syntax_highlighter", - /* m_doc */ "Speedups for the html syntax highlighter", - /* m_size */ -1, - /* m_methods */ html_methods, - /* m_slots */ 0, - /* m_traverse */ 0, - /* m_clear */ 0, - /* m_free */ 0, -}; - -CALIBRE_MODINIT_FUNC PyInit_html_syntax_highlighter(void) { - PyObject *temp, *mod = PyModule_Create(&html_module); - if (mod == NULL) return NULL; - +static int +exec_module(PyObject *mod) { if (PyType_Ready(&html_TagType) < 0) - return NULL; + return -1; if (PyType_Ready(&html_StateType) < 0) - return NULL; + return -1; - temp = Py_BuildValue("ssssssss", "b", "strong", "h1", "h2", "h3", "h4", "h5", "h6", "h7"); - if (temp == NULL) return NULL; + PyObject *temp = Py_BuildValue("ssssssss", "b", "strong", "h1", "h2", "h3", "h4", "h5", "h6", "h7"); + if (temp == NULL) return -1; bold_tags = PyFrozenSet_New(temp); Py_DECREF(temp); temp = NULL; temp = Py_BuildValue("ss", "i", "em"); - if (temp == NULL) return NULL; + if (temp == NULL) return -1; italic_tags = PyFrozenSet_New(temp); Py_DECREF(temp); temp = NULL; @@ -521,7 +507,7 @@ CALIBRE_MODINIT_FUNC PyInit_html_syntax_highlighter(void) { Py_XDECREF(bold_tags); Py_XDECREF(italic_tags); Py_XDECREF(zero); - return NULL; + return -1; } Py_INCREF(&html_TagType); @@ -530,6 +516,17 @@ CALIBRE_MODINIT_FUNC PyInit_html_syntax_highlighter(void) { PyModule_AddObject(mod, "State", (PyObject *)&html_StateType); PyModule_AddObject(mod, "bold_tags", bold_tags); PyModule_AddObject(mod, "italic_tags", italic_tags); - - 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 = "html_syntax_highlighter", + .m_doc = "Speedups for the html syntax highlighter", + .m_methods = html_methods, + .m_slots = slots, +}; + +CALIBRE_MODINIT_FUNC PyInit_html_syntax_highlighter(void) { return PyModuleDef_Init(&module_def); } diff --git a/src/calibre/utils/certgen.c b/src/calibre/utils/certgen.c index bb6f494b1e..a22ea1fc9a 100644 --- a/src/calibre/utils/certgen.c +++ b/src/calibre/utils/certgen.c @@ -379,25 +379,21 @@ static PyMethodDef certgen_methods[] = { }; -static struct PyModuleDef certgen_module = { - /* m_base */ PyModuleDef_HEAD_INIT, - /* m_name */ "certgen", - /* m_doc */ "OpenSSL bindings to easily create certificates/certificate authorities.", - /* m_size */ -1, - /* m_methods */ certgen_methods, - /* m_slots */ 0, - /* m_traverse */ 0, - /* m_clear */ 0, - /* m_free */ 0, -}; - -CALIBRE_MODINIT_FUNC PyInit_certgen(void) { - PyObject *mod = PyModule_Create(&certgen_module); - if (mod == NULL) return NULL; - +static int +exec_module(PyObject *module) { OpenSSL_add_all_algorithms(); ERR_load_crypto_strings(); ERR_load_BIO_strings(); - - 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 = "certgen", + .m_doc = "OpenSSL bindings to easily create certificates/certificate authorities.", + .m_methods = certgen_methods, + .m_slots = slots, +}; + +CALIBRE_MODINIT_FUNC PyInit_certgen(void) { return PyModuleDef_Init(&module_def); } diff --git a/src/tinycss/tokenizer.c b/src/tinycss/tokenizer.c index 67ba9e5c1c..50b4d4f7fc 100644 --- a/src/tinycss/tokenizer.c +++ b/src/tinycss/tokenizer.c @@ -451,24 +451,21 @@ static PyMethodDef tokenizer_methods[] = { {NULL, NULL, 0, NULL} }; -static struct PyModuleDef tokenizer_module = { - /* m_base */ PyModuleDef_HEAD_INIT, - /* m_name */ "tokenizer", - /* m_doc */ "Implementation of tokenizer in C for speed.", - /* m_size */ -1, - /* m_methods */ tokenizer_methods, - /* m_slots */ 0, - /* m_traverse */ 0, - /* m_clear */ 0, - /* m_free */ 0, -}; - -CALIBRE_MODINIT_FUNC PyInit_tokenizer(void) { - if (PyType_Ready(&tokenizer_TokenType) < 0) return NULL; - - PyObject *mod = PyModule_Create(&tokenizer_module); - if (mod == NULL) return NULL; +static int +exec_module(PyObject *mod) { + if (PyType_Ready(&tokenizer_TokenType) < 0) return -1; Py_INCREF(&tokenizer_TokenType); PyModule_AddObject(mod, "Token", (PyObject *) &tokenizer_TokenType); - 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 = "tokenizer", + .m_doc = "Implementation of tokenizer in C for speed.", + .m_methods = tokenizer_methods, + .m_slots = slots, +}; + +CALIBRE_MODINIT_FUNC PyInit_tokenizer(void) { return PyModuleDef_Init(&module_def); }