diff options
| author | Christian Tismer <tismer@stackless.com> | 2023-01-04 12:25:54 +0100 |
|---|---|---|
| committer | Christian Tismer <tismer@stackless.com> | 2023-01-06 11:37:47 +0100 |
| commit | c4076d430ed2a9ca24e3da6cbaec2f432f931b2e (patch) | |
| tree | 0e399b50447cf05bdb143a6020387e3372d88177 /sources/pyside6/libpyside/signalmanager.cpp | |
| parent | 1e3ec1ba2a29e59b580fbd9a5cf6e4e91c8994e2 (diff) | |
property/QML: Improve handling of an unknown class name
pysideproperty has Q_ASSERT calls, which cause errors when
a typename is undefined. This behavior is inconsistent and
should either raise an exception or be circumvented.
For compatibility with another implementation, unknown
types are now ignored, and debug and release are consistent.
To obtain an error, run the script with -Werrors . This makes
use of the new exception delay feature.
Task-number: PYSIDE-2160
Change-Id: Ia320edab4b51dd6f6b94a429b8f1f086ce9897f7
Pick-to: 6.4 6.2
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Diffstat (limited to 'sources/pyside6/libpyside/signalmanager.cpp')
| -rw-r--r-- | sources/pyside6/libpyside/signalmanager.cpp | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/sources/pyside6/libpyside/signalmanager.cpp b/sources/pyside6/libpyside/signalmanager.cpp index 7e1bc8c6b..f544bf751 100644 --- a/sources/pyside6/libpyside/signalmanager.cpp +++ b/sources/pyside6/libpyside/signalmanager.cpp @@ -19,6 +19,7 @@ #include <sbkconverter.h> #include <sbkstring.h> #include <sbkstaticstrings.h> +#include <sbkerrors.h> #include <QtCore/QByteArrayView> #include <QtCore/QDebug> @@ -395,7 +396,6 @@ int SignalManager::SignalManagerPrivate::qtPropertyMetacall(QObject *object, auto *pySbkSelf = Shiboken::BindingManager::instance().retrieveWrapper(object); Q_ASSERT(pySbkSelf); auto *pySelf = reinterpret_cast<PyObject *>(pySbkSelf); - Q_ASSERT(pySelf); Shiboken::AutoDecRef pp_name(Shiboken::String::fromCString(mp.name())); PySideProperty *pp = Property::getObject(pySelf, pp_name); if (!pp) { @@ -403,9 +403,25 @@ int SignalManager::SignalManagerPrivate::qtPropertyMetacall(QObject *object, return false; } pp->d->metaCall(pySelf, call, args); - Py_XDECREF(pp); - + Py_DECREF(pp); if (PyErr_Occurred()) { + // PYSIDE-2160: An unknown type was reported. Indicated by StopIteration. + if (PyErr_ExceptionMatches(PyExc_StopIteration)) { + PyObject *excType, *excValue, *excTraceback; + PyErr_Fetch(&excType, &excValue, &excTraceback); + bool ign = call == QMetaObject::WriteProperty; + PyErr_WarnFormat(PyExc_RuntimeWarning, 0, + ign ? "Unknown property type '%s' of QObject '%s' used in fset" + : "Unknown property type '%s' of QObject '%s' used in fget with %R", + pp->d->typeName.constData(), metaObject->className(), excValue); + if (PyErr_Occurred()) + Shiboken::Errors::storeError(); + Py_DECREF(excType); + Py_DECREF(excValue); + Py_XDECREF(excTraceback); + return result; + } + qWarning().noquote().nospace() << "An error occurred executing the property metacall " << call << " on property \"" << mp.name() << "\" of " << object; |
