diff options
author | Christian Tismer <tismer@stackless.com> | 2020-09-02 12:51:10 +0200 |
---|---|---|
committer | Christian Tismer <tismer@stackless.com> | 2020-09-04 12:52:16 +0200 |
commit | fedc289138bd912384e71a91e49ef9ee7b8a0fbb (patch) | |
tree | 284ff4982d53157a226d9f13a51bc4fbcdbaa661 /sources/shiboken2/libshiboken/signature.cpp | |
parent | 2bd69b9877f7b240512f03b4df042adf9acea744 (diff) |
signature: Use a clean init function to initialize it
After the quick hack replacing "type.__signature__" by
'eval("type.__signature__")', we now use a clean initialization
function `_init_pyside_extension` that is implanted into the
__builtins__ module.
This is the first of a series of improvements and simplifications
that will be applied slowly with low priority.
Task-number: PYSIDE-829
Task-number: PYSIDE-510
Change-Id: I9951239c73d02f47272f1a531fb4886c8181b9a7
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Diffstat (limited to 'sources/shiboken2/libshiboken/signature.cpp')
-rw-r--r-- | sources/shiboken2/libshiboken/signature.cpp | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/sources/shiboken2/libshiboken/signature.cpp b/sources/shiboken2/libshiboken/signature.cpp index e2c02a196..70f1e8de7 100644 --- a/sources/shiboken2/libshiboken/signature.cpp +++ b/sources/shiboken2/libshiboken/signature.cpp @@ -98,6 +98,7 @@ static PyObject *PySide_BuildSignatureProps(PyObject *class_mod); static void init_module_1(void); static void init_module_2(void); +static PyObject *_init_pyside_extension(PyObject * /* self */, PyObject * /* args */); static PyObject * CreateSignature(PyObject *props, PyObject *key) @@ -486,8 +487,14 @@ static const unsigned char PySide_SignatureLoader[] = { #include "embed/signature_bootstrap_inc.h" }; +// This function will be inserted into __builtins__. +static PyMethodDef init_methods[] = { + {"_init_pyside_extension", (PyCFunction)_init_pyside_extension, METH_NOARGS}, + {nullptr, nullptr} +}; + static safe_globals_struc * -init_phase_1(void) +init_phase_1(PyMethodDef *init_meth) { { auto *p = reinterpret_cast<safe_globals_struc *> @@ -582,6 +589,12 @@ init_phase_1(void) // This function will be disabled until phase 2 is done. p->finish_import_func = nullptr; + // Initialize the explicit init function. + Shiboken::AutoDecRef init(PyCFunction_NewEx(init_meth, nullptr, nullptr)); + if (init.isNull() + || PyDict_SetItemString(PyEval_GetBuiltins(), init_meth->ml_name, init) != 0) + goto error; + return p; } error: @@ -870,6 +883,14 @@ get_signature(PyObject * /* self */, PyObject *args) Py_RETURN_NONE; } +static PyObject * +_init_pyside_extension(PyObject * /* self */, PyObject * /* args */) +{ + init_module_1(); + init_module_2(); + Py_RETURN_NONE; +} + //////////////////////////////////////////////////////////////////////////// // // This special Type_Ready does certain initializations earlier with @@ -955,7 +976,7 @@ init_module_1(void) static int init_done = 0; if (!init_done) { - pyside_globals = init_phase_1(); + pyside_globals = init_phase_1(init_methods); if (pyside_globals != nullptr) init_done = 1; } |