From da1b470b54fd46dc223bddd06dad761326df4e56 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 24 Oct 2020 20:09:42 +0530 Subject: [PATCH] More multi-phase init for extensions --- src/calibre/ebooks/compression/palmdoc.c | 31 ++++++------- src/calibre/ebooks/djvu/bzzdecoder.c | 30 +++++-------- src/calibre/srv/html_as_json.cpp | 28 +++++------- src/calibre/utils/podofo/podofo.cpp | 56 ++++++++---------------- 4 files changed, 54 insertions(+), 91 deletions(-) diff --git a/src/calibre/ebooks/compression/palmdoc.c b/src/calibre/ebooks/compression/palmdoc.c index a661b401a5..45eac58fd2 100644 --- a/src/calibre/ebooks/compression/palmdoc.c +++ b/src/calibre/ebooks/compression/palmdoc.c @@ -197,22 +197,17 @@ static PyMethodDef cPalmdoc_methods[] = { {NULL, NULL, 0, NULL} }; -static struct PyModuleDef cPalmdoc_module = { - /* m_base */ PyModuleDef_HEAD_INIT, - /* m_name */ "cPalmdoc", - /* m_doc */ cPalmdoc_doc, - /* m_size */ -1, - /* m_methods */ cPalmdoc_methods, - /* m_slots */ 0, - /* m_traverse */ 0, - /* m_clear */ 0, - /* m_free */ 0, -}; -CALIBRE_MODINIT_FUNC PyInit_cPalmdoc(void) { - PyObject *m = PyModule_Create(&cPalmdoc_module); - if (m == NULL) { - return NULL; - } +static int +exec_module(PyObject *module) { return 0; } - return m; -} +static PyModuleDef_Slot slots[] = { {Py_mod_exec, exec_module}, {0, NULL} }; + +static struct PyModuleDef module_def = { + .m_base = PyModuleDef_HEAD_INIT, + .m_name = "cPalmdoc", + .m_doc = cPalmdoc_doc, + .m_methods = cPalmdoc_methods, + .m_slots = slots, +}; + +CALIBRE_MODINIT_FUNC PyInit_cPalmdoc(void) { return PyModuleDef_Init(&module_def); } diff --git a/src/calibre/ebooks/djvu/bzzdecoder.c b/src/calibre/ebooks/djvu/bzzdecoder.c index a9e2c75427..be0d13fdb9 100644 --- a/src/calibre/ebooks/djvu/bzzdecoder.c +++ b/src/calibre/ebooks/djvu/bzzdecoder.c @@ -694,22 +694,16 @@ static PyMethodDef bzzdec_methods[] = { {NULL, NULL, 0, NULL} }; -#define INITMODULE -static struct PyModuleDef bzzdec_module = { - /* m_base */ PyModuleDef_HEAD_INIT, - /* m_name */ "bzzdec", - /* m_doc */ bzzdec_doc, - /* m_size */ -1, - /* m_methods */ bzzdec_methods, - /* m_slots */ 0, - /* m_traverse */ 0, - /* m_clear */ 0, - /* m_free */ 0, +static int +exec_module(PyObject *module) { 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 = "bzzdec", + .m_doc = bzzdec_doc, + .m_methods = bzzdec_methods, + .m_slots = slots, }; -CALIBRE_MODINIT_FUNC PyInit_bzzdec(void) { - PyObject *m = PyModule_Create(&bzzdec_module); - if (m == NULL) { - return NULL; - } - return m; -} + +CALIBRE_MODINIT_FUNC PyInit_bzzdec(void) { return PyModuleDef_Init(&module_def); } diff --git a/src/calibre/srv/html_as_json.cpp b/src/calibre/srv/html_as_json.cpp index 9408ef3633..9cfaa0f17b 100644 --- a/src/calibre/srv/html_as_json.cpp +++ b/src/calibre/srv/html_as_json.cpp @@ -430,23 +430,17 @@ static PyMethodDef methods[] = { }, {NULL} /* Sentinel */ }; +static int +exec_module(PyObject *mod) { return 0; } + +static PyModuleDef_Slot slots[] = { {Py_mod_exec, (void*)exec_module}, {0, NULL} }; + +static struct PyModuleDef module_def = {PyModuleDef_HEAD_INIT}; -static struct PyModuleDef hmod = { - /* m_base */ PyModuleDef_HEAD_INIT, - /* m_name */ "html_as_json", - /* m_doc */ doc, - /* m_size */ -1, - /* m_methods */ methods, - /* m_slots */ 0, - /* m_traverse */ 0, - /* m_clear */ 0, - /* m_free */ 0, -}; CALIBRE_MODINIT_FUNC PyInit_html_as_json(void) { - PyObject* m = PyModule_Create(&hmod); - if (m == NULL) { - return NULL; - } - return m; + module_def.m_name = "html_as_json"; + module_def.m_slots = slots; + module_def.m_doc = doc; + module_def.m_methods = methods; + return PyModuleDef_Init(&module_def); } -// }}} diff --git a/src/calibre/utils/podofo/podofo.cpp b/src/calibre/utils/podofo/podofo.cpp index fc4f8d099d..7769f9e1a6 100644 --- a/src/calibre/utils/podofo/podofo.cpp +++ b/src/calibre/utils/podofo/podofo.cpp @@ -36,50 +36,30 @@ PyLogMessage log_message; static char podofo_doc[] = "Wrapper for the PoDoFo PDF library"; -static PyMethodDef podofo_methods[] = { - {NULL} /* Sentinel */ -}; - -static struct PyModuleDef podofo_module = { - /* m_base */ PyModuleDef_HEAD_INIT, - /* m_name */ "podofo", - /* m_doc */ podofo_doc, - /* m_size */ -1, - /* m_methods */ podofo_methods, - /* m_slots */ 0, - /* m_traverse */ 0, - /* m_clear */ 0, - /* m_free */ 0, -}; -CALIBRE_MODINIT_FUNC PyInit_podofo(void) { - PyObject* m; - - if (PyType_Ready(&pdf::PDFDocType) < 0) { - return NULL; - } - - if (PyType_Ready(&pdf::PDFOutlineItemType) < 0) { - return NULL; - } +static int +exec_module(PyObject *m) { + if (PyType_Ready(&pdf::PDFDocType) < 0) return -1; + if (PyType_Ready(&pdf::PDFOutlineItemType) < 0) return -1; pdf::Error = PyErr_NewException((char*)"podofo.Error", NULL, NULL); - if (pdf::Error == NULL) { - return NULL; - } + if (pdf::Error == NULL) return -1; + PyModule_AddObject(m, "Error", pdf::Error); PdfError::SetLogMessageCallback((PdfError::LogMessageCallback*)&log_message); - PdfError::EnableDebug(false); - m = PyModule_Create(&podofo_module); - if (m == NULL) { - return NULL; - } - Py_INCREF(&pdf::PDFDocType); PyModule_AddObject(m, "PDFDoc", (PyObject *)&pdf::PDFDocType); - - PyModule_AddObject(m, "Error", pdf::Error); - - return m; + return 0; +} + +static PyModuleDef_Slot slots[] = { {Py_mod_exec, (void*)exec_module}, {0, NULL} }; + +static struct PyModuleDef module_def = {PyModuleDef_HEAD_INIT}; + +CALIBRE_MODINIT_FUNC PyInit_podofo(void) { + module_def.m_name = "podofo"; + module_def.m_doc = podofo_doc; + module_def.m_slots = slots; + return PyModuleDef_Init(&module_def); }