aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4engine.cpp
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2025-08-15 10:00:30 +0200
committerUlf Hermann <ulf.hermann@qt.io>2025-08-16 01:33:13 +0200
commita007f6e0d36d46cee32a62876fc3c812f2cfadae (patch)
treeb10f651b36fcb99d5471fc4eb82fe7f8c7993746 /src/qml/jsruntime/qv4engine.cpp
parenta66362ed640ff63a6c77480a8d57382855fc5d58 (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.cpp26
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.