aboutsummaryrefslogtreecommitdiffstats
path: root/sources/pyside6/libpyside/signalmanager.cpp
diff options
context:
space:
mode:
authorChristian Tismer <tismer@stackless.com>2023-01-04 12:25:54 +0100
committerChristian Tismer <tismer@stackless.com>2023-01-06 11:37:47 +0100
commitc4076d430ed2a9ca24e3da6cbaec2f432f931b2e (patch)
tree0e399b50447cf05bdb143a6020387e3372d88177 /sources/pyside6/libpyside/signalmanager.cpp
parent1e3ec1ba2a29e59b580fbd9a5cf6e4e91c8994e2 (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.cpp22
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;