diff options
| author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2021-11-10 13:42:06 +0100 |
|---|---|---|
| committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2021-11-11 13:28:04 +0100 |
| commit | 346a4a86fc2d7064e44c0766dd08374d652cdcc1 (patch) | |
| tree | 185442f3ccec0ff25d349eb4cf1f381d44326e4b /sources/pyside6/libpyside/signalmanager.cpp | |
| parent | 4d3b9da999a5ab194b79c9d2f5bcf985ea6d14cc (diff) | |
PySide6: Remove QML dependency from libpyside
Remove the QML error handling from SignalHandler by introducing
a function pointer for this which can set from the QML module.
This allows for removing QtQml from the libpyside dependencies,
removing the need to deploy the QtQml libraries with widget
applications.
[ChangeLog][PySide6] libpyside no longer depends on QtQml.
Change-Id: Iae7dabdd38ea03156f4c00073d84e42ec5a3d892
Reviewed-by: Christian Tismer <tismer@stackless.com>
Diffstat (limited to 'sources/pyside6/libpyside/signalmanager.cpp')
| -rw-r--r-- | sources/pyside6/libpyside/signalmanager.cpp | 51 |
1 files changed, 14 insertions, 37 deletions
diff --git a/sources/pyside6/libpyside/signalmanager.cpp b/sources/pyside6/libpyside/signalmanager.cpp index 26f80dff4..f85a63b31 100644 --- a/sources/pyside6/libpyside/signalmanager.cpp +++ b/sources/pyside6/libpyside/signalmanager.cpp @@ -61,13 +61,6 @@ #include <algorithm> #include <limits> -// These private headers are needed to throw JavaScript exceptions -#if PYSIDE_QML_PRIVATE_API_SUPPORT - #include <private/qv4engine_p.h> - #include <private/qv4context_p.h> - #include <private/qqmldata_p.h> -#endif - #if QSLOT_CODE != 1 || QSIGNAL_CODE != 2 #error QSLOT_CODE and/or QSIGNAL_CODE changed! change the hardcoded stuff to the correct value! #endif @@ -215,6 +208,7 @@ using namespace PySide; struct SignalManager::SignalManagerPrivate { GlobalReceiverV2MapPtr m_globalReceivers; + static SignalManager::QmlMetaCallErrorHandler m_qmlMetaCallErrorHandler; SignalManagerPrivate() : m_globalReceivers(new GlobalReceiverV2Map{}) { @@ -233,6 +227,9 @@ struct SignalManager::SignalManagerPrivate } }; +SignalManager::QmlMetaCallErrorHandler + SignalManager::SignalManagerPrivate::m_qmlMetaCallErrorHandler = nullptr; + static void clearSignalManager() { PySide::SignalManager::instance().clear(); @@ -293,6 +290,11 @@ SignalManager &SignalManager::instance() return me; } +void SignalManager::setQmlMetaCallErrorHandler(QmlMetaCallErrorHandler handler) +{ + SignalManagerPrivate::m_qmlMetaCallErrorHandler = handler; +} + QObject *SignalManager::globalReceiver(QObject *sender, PyObject *callback) { GlobalReceiverV2MapPtr globalReceivers = m_d->m_globalReceivers; @@ -419,41 +421,16 @@ int SignalManager::qt_metacall(QObject *object, QMetaObject::Call call, int id, Py_XDECREF(pp_name); } - // Bubbles Python exceptions up to the Javascript engine, if called from one { Shiboken::GilState gil; if (PyErr_Occurred()) { - -#if PYSIDE_QML_PRIVATE_API_SUPPORT - // This JS engine grabber based off of Qt 5.5's `qjsEngine` function - QQmlData *data = QQmlData::get(object, false); - - if (data && !data->jsWrapper.isNullOrUndefined()) { - QV4::ExecutionEngine *engine = data->jsWrapper.engine(); - if (engine->currentStackFrame != nullptr) { - PyObject *errType, *errValue, *errTraceback; - PyErr_Fetch(&errType, &errValue, &errTraceback); - // PYSIDE-464: The error is only valid before PyErr_Restore, - // PYSIDE-464: therefore we take local copies. - Shiboken::AutoDecRef objStr(PyObject_Str(errValue)); - const QString errString = QLatin1String(Shiboken::String::toCString(objStr)); - const bool isSyntaxError = errType == PyExc_SyntaxError; - const bool isTypeError = errType == PyExc_TypeError; - PyErr_Restore(errType, errValue, errTraceback); - - PyErr_Print(); // Note: PyErr_Print clears the error. - - if (isSyntaxError) { - return engine->throwSyntaxError(errString); - } else if (isTypeError) { - return engine->throwTypeError(errString); - } else { - return engine->throwError(errString); - } - } + // Bubbles Python exceptions up to the Javascript engine, if called from one + if (SignalManagerPrivate::m_qmlMetaCallErrorHandler) { + auto idOpt = SignalManagerPrivate::m_qmlMetaCallErrorHandler(object); + if (idOpt.has_value()) + return idOpt.value(); } -#endif // PYSIDE_QML_PRIVATE_API_SUPPORT int reclimit = Py_GetRecursionLimit(); // Inspired by Python's errors.c: PyErr_GivenExceptionMatches() function. |
