diff options
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. |