diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2023-10-19 13:11:56 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2023-10-24 18:44:54 +0200 |
commit | 360b5091f35127164f8655d60a21702a92985b06 (patch) | |
tree | 7b8788c573463b69fb0754fa7050a2bb55af3719 /tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp | |
parent | 5fc4c09a958c5f78aa9f69cee2c45eef9a5166b8 (diff) |
QtQml: Use array data for QmlListWrapper's "owned" mode
We don't want to get surprised by QObjects being deleted while we're
still holding on to them. Also, we want to mark them when gc'ing and we
want to use the write barrier when replacing them. We already have an
array data since QmlListWrapper is an object. Let's use it.
Pick-to: 6.6 6.5
Task-number: QTBUG-117793
Change-Id: I921514bc2de994884c41bd6af19a7c2ac746cd92
Reviewed-by: Semih Yavuz <semih.yavuz@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp')
-rw-r--r-- | tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp index 832d458b1c..228b6451f8 100644 --- a/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp +++ b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp @@ -433,6 +433,7 @@ private slots: void multiVersionSingletons(); void typeAnnotationCycle(); + void corpseInQmlList(); private: QQmlEngine engine; @@ -8323,6 +8324,53 @@ void tst_qqmllanguage::typeAnnotationCycle() QCOMPARE(o->property("b").value<QObject*>(), o.data()); } +void tst_qqmllanguage::corpseInQmlList() +{ + QQmlEngine engine; + QQmlComponent c(&engine, testFileUrl("corpseInQmlList.qml")); + QVERIFY2(c.isReady(), qPrintable(c.errorString())); + + QScopedPointer<QObject> o(c.create()); + QVERIFY(!o.isNull()); + + QScopedPointer<QObject> a(new QObject); + QMetaObject::invokeMethod(o.data(), "setB", Q_ARG(QObject *, a.data())); + + QJSValue b = o->property("b").value<QJSValue>(); + QQmlListProperty<QObject> list + = qjsvalue_cast<QQmlListProperty<QObject>>(b.property(QStringLiteral("b"))); + + QCOMPARE(list.count(&list), 1); + QCOMPARE(list.at(&list, 0), a.data()); + + a.reset(); + + b = o->property("b").value<QJSValue>(); + list = qjsvalue_cast<QQmlListProperty<QObject>>(b.property(QStringLiteral("b"))); + + QCOMPARE(list.count(&list), 1); + QCOMPARE(list.at(&list, 0), nullptr); + + // The list itself is still alive: + + list.append(&list, o.data()); + QCOMPARE(list.count(&list), 2); + QCOMPARE(list.at(&list, 0), nullptr); + QCOMPARE(list.at(&list, 1), o.data()); + + list.replace(&list, 0, o.data()); + QCOMPARE(list.count(&list), 2); + QCOMPARE(list.at(&list, 0), o.data()); + QCOMPARE(list.at(&list, 1), o.data()); + + list.removeLast(&list); + QCOMPARE(list.count(&list), 1); + QCOMPARE(list.at(&list, 0), o.data()); + + list.clear(&list); + QCOMPARE(list.count(&list), 0); +} + QTEST_MAIN(tst_qqmllanguage) #include "tst_qqmllanguage.moc" |