summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2023-05-03 17:49:56 +0200
committerUlf Hermann <ulf.hermann@qt.io>2023-05-08 16:02:17 +0200
commitb6a75904d6ea9068fe4e60ad639e05030bcae50d (patch)
treec11e936cca4b7e45b8919a836dca0f1a443e7c41
parent70f2ef37885d11569a6fa40331e8d7ae5eed318c (diff)
downloadqtdeclarative-b6a75904d6ea9068fe4e60ad639e05030bcae50d.tar.gz
QML: Don't crash when monitoring binding removal
There are more bindings kinds around. Fixes: QTBUG-113353 Change-Id: If545f56bd61c238431883be3eb013841d96b18bb Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> (cherry picked from commit 567130e2d06a37b8615db7858050dfa0579ced93)
-rw-r--r--src/qml/jsruntime/qv4qobjectwrapper.cpp26
-rw-r--r--tests/auto/qml/qqmlbinding/data/bindingOverwriting2.qml21
-rw-r--r--tests/auto/qml/qqmlbinding/tst_qqmlbinding.cpp8
3 files changed, 47 insertions, 8 deletions
diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp
index 694b7828b6..fa57a2d91d 100644
--- a/src/qml/jsruntime/qv4qobjectwrapper.cpp
+++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp
@@ -551,14 +551,26 @@ void QObjectWrapper::setProperty(
if (Q_UNLIKELY(lcBindingRemoval().isInfoEnabled())) {
if (auto binding = QQmlPropertyPrivate::binding(object, QQmlPropertyIndex(property->coreIndex()))) {
- Q_ASSERT(binding->kind() == QQmlAbstractBinding::QmlBinding);
- const auto qmlBinding = static_cast<const QQmlBinding*>(binding);
const auto stackFrame = engine->currentStackFrame;
- qCInfo(lcBindingRemoval,
- "Overwriting binding on %s::%s at %s:%d that was initially bound at %s",
- object->metaObject()->className(), qPrintable(property->name(object)),
- qPrintable(stackFrame->source()), stackFrame->lineNumber(),
- qPrintable(qmlBinding->expressionIdentifier()));
+ switch (binding->kind()) {
+ case QQmlAbstractBinding::QmlBinding: {
+ const auto qmlBinding = static_cast<const QQmlBinding*>(binding);
+ qCInfo(lcBindingRemoval,
+ "Overwriting binding on %s::%s at %s:%d that was initially bound at %s",
+ object->metaObject()->className(), qPrintable(property->name(object)),
+ qPrintable(stackFrame->source()), stackFrame->lineNumber(),
+ qPrintable(qmlBinding->expressionIdentifier()));
+ break;
+ }
+ case QQmlAbstractBinding::ValueTypeProxy:
+ case QQmlAbstractBinding::PropertyToPropertyBinding: {
+ qCInfo(lcBindingRemoval,
+ "Overwriting binding on %s::%s at %s:%d",
+ object->metaObject()->className(), qPrintable(property->name(object)),
+ qPrintable(stackFrame->source()), stackFrame->lineNumber());
+ break;
+ }
+ }
}
}
QQmlPropertyPrivate::removeBinding(object, QQmlPropertyIndex(property->coreIndex()));
diff --git a/tests/auto/qml/qqmlbinding/data/bindingOverwriting2.qml b/tests/auto/qml/qqmlbinding/data/bindingOverwriting2.qml
new file mode 100644
index 0000000000..8d15185506
--- /dev/null
+++ b/tests/auto/qml/qqmlbinding/data/bindingOverwriting2.qml
@@ -0,0 +1,21 @@
+pragma ComponentBehavior: Bound
+import QtQuick
+
+ListView {
+ id: list
+ property int i: 0
+
+ model: 1
+ delegate: Item {
+ id: cellRootID
+ required property int index
+ Timer {
+ interval: 1
+ running: true
+ onTriggered: {
+ cellRootID.index = index + 123
+ list.i = cellRootID.index
+ }
+ }
+ }
+}
diff --git a/tests/auto/qml/qqmlbinding/tst_qqmlbinding.cpp b/tests/auto/qml/qqmlbinding/tst_qqmlbinding.cpp
index 2d6d47c5b1..237a92f070 100644
--- a/tests/auto/qml/qqmlbinding/tst_qqmlbinding.cpp
+++ b/tests/auto/qml/qqmlbinding/tst_qqmlbinding.cpp
@@ -459,9 +459,15 @@ void tst_qqmlbinding::bindingOverwriting()
QQmlComponent c(&engine, testFileUrl("bindingOverwriting.qml"));
QScopedPointer<QQuickItem> item {qobject_cast<QQuickItem*>(c.create())};
QVERIFY(item);
+ QCOMPARE(messageHandler.messages().size(), 2);
+
+ QQmlComponent c2(&engine, testFileUrl("bindingOverwriting2.qml"));
+ QScopedPointer<QObject> o(c2.create());
+ QVERIFY(o);
+ QTRY_COMPARE(o->property("i").toInt(), 123);
+ QCOMPARE(messageHandler.messages().size(), 3);
QLoggingCategory::setFilterRules(QString());
- QCOMPARE(messageHandler.messages().size(), 2);
}
void tst_qqmlbinding::bindToQmlComponent()