diff --git a/src/qml/jsruntime/qv4variantassociationobject_p.h b/src/qml/jsruntime/qv4variantassociationobject_p.h index bee30910e9..c0813a0f40 100644 --- a/src/qml/jsruntime/qv4variantassociationobject_p.h +++ b/src/qml/jsruntime/qv4variantassociationobject_p.h @@ -50,6 +50,8 @@ namespace QV4 { DECLARE_HEAP_OBJECT(VariantAssociationObject, ReferenceObject) { + DECLARE_MARKOBJECTS(VariantAssociationObject) + enum class AssociationType: quint8 { VariantMap, VariantHash diff --git a/tests/auto/qml/qv4mm/tst_qv4mm.cpp b/tests/auto/qml/qv4mm/tst_qv4mm.cpp index b26951c86e..7a7f6bd918 100644 --- a/tests/auto/qml/qv4mm/tst_qv4mm.cpp +++ b/tests/auto/qml/qv4mm/tst_qv4mm.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #if QT_CONFIG(qml_jit) #include #endif @@ -47,6 +48,7 @@ private slots: void forInOnProxyMarksTarget(); void allocWithMemberDataMidwayDrain(); void markObjectWrappersAfterMarkWeakValues(); + void variantAssociationObjectMarksMember(); }; tst_qv4mm::tst_qv4mm() @@ -835,6 +837,29 @@ void tst_qv4mm::markObjectWrappersAfterMarkWeakValues() QCOMPARE(qvariant_cast(retrieved)->objectName(), "yep"); } +void tst_qv4mm::variantAssociationObjectMarksMember() +{ + QJSEngine jsEngine; + QV4::ExecutionEngine &engine = *jsEngine.handle(); + + QV4::Scope scope(&engine); + QVariantHash assoc; + assoc[QLatin1String("test")] = 2; + QV4::ScopedObject o(scope, engine.newObject()); + QV4::Scoped varAssocObject( + scope, + QV4::VariantAssociationPrototype::fromQVariantHash(&engine, assoc, o->d(), -1, QV4::Heap::ReferenceObject::NoFlag) + ); + bool hasProperty = false; + // ensure that the propertyIndexMapping gets initialized + varAssocObject->getElement(QLatin1String("test"), &hasProperty); + QVERIFY(hasProperty); + gc(engine); + auto mapping = varAssocObject->d()->propertyIndexMapping; + QVERIFY(mapping); + QVERIFY(mapping->inUse()); +} + QTEST_MAIN(tst_qv4mm) #include "tst_qv4mm.moc"