diff options
| author | Ulf Hermann <ulf.hermann@qt.io> | 2025-08-15 10:00:30 +0200 |
|---|---|---|
| committer | Ulf Hermann <ulf.hermann@qt.io> | 2025-08-16 01:33:13 +0200 |
| commit | a007f6e0d36d46cee32a62876fc3c812f2cfadae (patch) | |
| tree | b10f651b36fcb99d5471fc4eb82fe7f8c7993746 /src/qml/jsruntime/qv4engine.cpp | |
| parent | a66362ed640ff63a6c77480a8d57382855fc5d58 (diff) | |
QtQml: Add method to generate a QVariantHash from a JS object
This generalizes the QVariantMap code path.
Pick-to: 6.10 6.9 6.8
Task-number: QTBUG-139025
Change-Id: Ibbdc1da974d3c166474c4bd02fb4c70d8df3e688
Reviewed-by: Semih Yavuz <semih.yavuz@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4engine.cpp')
| -rw-r--r-- | src/qml/jsruntime/qv4engine.cpp | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp index 196ee7e76e..c963d6689b 100644 --- a/src/qml/jsruntime/qv4engine.cpp +++ b/src/qml/jsruntime/qv4engine.cpp @@ -1699,10 +1699,12 @@ QVariant ExecutionEngine::toVariant( return ::toVariant(value, typeHint, behavior, nullptr); } -static QVariantMap objectToVariantMap(const QV4::Object *o, V4ObjectSet *visitedObjects, - JSToQVariantConversionBehavior conversionBehvior) +template<typename Association> +Association objectToVariantAssociation( + const QV4::Object *o, V4ObjectSet *visitedObjects, + JSToQVariantConversionBehavior conversionBehvior) { - QVariantMap map; + Association association; QV4::Scope scope(o->engine()); QV4::ObjectIterator it(scope, o, QV4::ObjectIterator::EnumerableOnly); QV4::ScopedValue name(scope); @@ -1713,11 +1715,11 @@ static QVariantMap objectToVariantMap(const QV4::Object *o, V4ObjectSet *visited break; QString key = name->toQStringNoThrow(); - map.insert(key, ::toVariant( + association.insert(key, ::toVariant( val, /*type hint*/ QMetaType {}, conversionBehvior, visitedObjects)); } - return map; + return association; } static QVariant objectToVariant(const QV4::Object *o, V4ObjectSet *visitedObjects, @@ -1762,7 +1764,7 @@ static QVariant objectToVariant(const QV4::Object *o, V4ObjectSet *visitedObject But the Aggressive path is used only in QJSValue::toVariant which is documented to be lossy */ - result = objectToVariantMap(o, visitedObjects, conversionBehvior); + result = objectToVariantAssociation<QVariantMap>(o, visitedObjects, conversionBehvior); } else { // If it's not a plain object, we can only save it as QJSValue. result = QVariant::fromValue(QJSValuePrivate::fromReturnedValue(o->asReturnedValue())); @@ -1995,7 +1997,17 @@ QVariantMap ExecutionEngine::variantMapFromJS(const Object *o) Q_ASSERT(o); V4ObjectSet visitedObjects; visitedObjects.insert(o->d()); - return objectToVariantMap(o, &visitedObjects, JSToQVariantConversionBehavior::Safish); + return objectToVariantAssociation<QVariantMap>( + o, &visitedObjects, JSToQVariantConversionBehavior::Safish); +} + +QVariantHash ExecutionEngine::variantHashFromJS(const Object *o) +{ + Q_ASSERT(o); + V4ObjectSet visitedObjects; + visitedObjects.insert(o->d()); + return objectToVariantAssociation<QVariantHash>( + o, &visitedObjects, JSToQVariantConversionBehavior::Safish); } // Converts the meta-type defined by the given type and data to JS. |
