From 7f99a69e25ee3ae99c3b4ba713b8c6b5e8e60135 Mon Sep 17 00:00:00 2001 From: Fabian Kosmale Date: Tue, 2 Feb 2021 14:24:40 +0100 Subject: QQmlIRLoader: Actually load RequiredPropertyExtraData If a QML component wants to mark properties of its "parent" component as required, it can do so via required propertyName The information about those properties is stored in a RequiredPropertyExtraData data structure. This structure is already serialized to disk in the QQmlIRWriter. However, we neglected to restore it so far in the loader. Fixes: QTBUG-90538 Change-Id: I789daff9bc881e4f35c942c77f5116b5284de81b Reviewed-by: Ulf Hermann (cherry picked from commit b322a971f06823a4356f2b3aa331501aa4d0dc7f) Reviewed-by: Qt Cherry-pick Bot --- src/qml/qml/qqmlirloader.cpp | 7 +++++++ tests/auto/qml/qmlcachegen/data/posthocrequired.qml | 5 +++++ tests/auto/qml/qmlcachegen/tst_qmlcachegen.cpp | 12 ++++++++++++ 3 files changed, 24 insertions(+) create mode 100644 tests/auto/qml/qmlcachegen/data/posthocrequired.qml diff --git a/src/qml/qml/qqmlirloader.cpp b/src/qml/qml/qqmlirloader.cpp index 121ac25ced..6f763707d1 100644 --- a/src/qml/qml/qqmlirloader.cpp +++ b/src/qml/qml/qqmlirloader.cpp @@ -208,6 +208,13 @@ QmlIR::Object *QQmlIRLoader::loadObject(const QV4::CompiledData::Object *seriali object->inlineComponents->append(ic); } + const QV4::CompiledData::RequiredPropertyExtraData *serializedRequiredPropertyExtraData = serializedObject->requiredPropertyExtraDataTable(); + for (uint i = 0u; i < serializedObject->nRequiredPropertyExtraData; ++i, ++serializedRequiredPropertyExtraData) { + QmlIR::RequiredPropertyExtraData *extra = pool->New(); + *static_cast(extra) = *serializedRequiredPropertyExtraData; + object->requiredPropertyExtraDatas->append(extra); + } + return object; } diff --git a/tests/auto/qml/qmlcachegen/data/posthocrequired.qml b/tests/auto/qml/qmlcachegen/data/posthocrequired.qml new file mode 100644 index 0000000000..3b32d9fe8f --- /dev/null +++ b/tests/auto/qml/qmlcachegen/data/posthocrequired.qml @@ -0,0 +1,5 @@ +import QtQuick 2.15 + +Item { + required x +} diff --git a/tests/auto/qml/qmlcachegen/tst_qmlcachegen.cpp b/tests/auto/qml/qmlcachegen/tst_qmlcachegen.cpp index bc6451dac0..b999b5b9d1 100644 --- a/tests/auto/qml/qmlcachegen/tst_qmlcachegen.cpp +++ b/tests/auto/qml/qmlcachegen/tst_qmlcachegen.cpp @@ -77,6 +77,7 @@ private slots: void parameterAdjustment(); void inlineComponent(); + void posthocRequired(); }; // A wrapper around QQmlComponent to ensure the temporary reference counts @@ -704,6 +705,17 @@ void tst_qmlcachegen::inlineComponent() QVERIFY(!obj.isNull()); } +void tst_qmlcachegen::posthocRequired() +{ + bool ok = generateCache(testFile("posthocrequired.qml")); + QVERIFY(ok); + QQmlEngine engine; + CleanlyLoadingComponent component(&engine, testFileUrl("posthocrequired.qml")); + QScopedPointer obj(component.create()); + QVERIFY(obj.isNull() && component.isError()); + QVERIFY(component.errorString().contains(QStringLiteral("Required property x was not initialized"))); +} + QTEST_GUILESS_MAIN(tst_qmlcachegen) #include "tst_qmlcachegen.moc" -- cgit v1.2.3