diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2023-05-03 17:49:56 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2023-05-08 16:02:17 +0200 |
commit | b6a75904d6ea9068fe4e60ad639e05030bcae50d (patch) | |
tree | c11e936cca4b7e45b8919a836dca0f1a443e7c41 | |
parent | 70f2ef37885d11569a6fa40331e8d7ae5eed318c (diff) | |
download | qtdeclarative-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.cpp | 26 | ||||
-rw-r--r-- | tests/auto/qml/qqmlbinding/data/bindingOverwriting2.qml | 21 | ||||
-rw-r--r-- | tests/auto/qml/qqmlbinding/tst_qqmlbinding.cpp | 8 |
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() |