aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2014-03-28 16:02:45 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-03-28 16:25:34 +0100
commitbc030defad916b073ede55d7a7ad8db9a41e0ad2 (patch)
tree4cae2fe211c306ea50d52e3057b5fe0db4f6d28a
parent1526771ebf473af8a65bce77cfd16be67b6eb944 (diff)
Fix crash in conversion from QVariantMap to QJSValue
When the key is an array index, use arraySet instead of trying to insert an array index as internal class member. Task-number: QTBUG-37854 Change-Id: I23f01cc9d6be98b57d3f13ac7ee847298e9632a3 Reviewed-by: Matt Broadstone <mbroadst@gmail.com> Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
-rw-r--r--src/qml/qml/v8/qv8engine.cpp6
-rw-r--r--tests/auto/qml/qjsengine/tst_qjsengine.cpp8
2 files changed, 13 insertions, 1 deletions
diff --git a/src/qml/qml/v8/qv8engine.cpp b/src/qml/qml/v8/qv8engine.cpp
index 61b466a5db..8305649177 100644
--- a/src/qml/qml/v8/qv8engine.cpp
+++ b/src/qml/qml/v8/qv8engine.cpp
@@ -601,7 +601,11 @@ QV4::ReturnedValue QV8Engine::variantMapToJS(const QVariantMap &vmap)
for (it = vmap.constBegin(); it != vmap.constEnd(); ++it) {
s = m_v4Engine->newIdentifier(it.key());
v = variantToJS(it.value());
- o->insertMember(s, v);
+ uint idx = s->asArrayIndex();
+ if (idx < UINT_MAX)
+ o->arraySet(idx, v);
+ else
+ o->insertMember(s, v);
}
return o.asReturnedValue();
}
diff --git a/tests/auto/qml/qjsengine/tst_qjsengine.cpp b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
index 5e6b2dd808..518d3e9897 100644
--- a/tests/auto/qml/qjsengine/tst_qjsengine.cpp
+++ b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
@@ -1230,6 +1230,14 @@ void tst_QJSEngine::valueConversion_QVariant()
QCOMPARE(qjsvalue_cast<QVariant>(QJSValue(123)), QVariant(123));
QVERIFY(eng.toScriptValue(QVariant(QMetaType::VoidStar, 0)).isNull());
+
+ {
+ QVariantMap map;
+ map.insert("42", "the answer to life the universe and everything");
+ QJSValue val = eng.toScriptValue(map);
+ QVERIFY(val.isObject());
+ QCOMPARE(val.property(42).toString(), map.value(QStringLiteral("42")).toString());
+ }
}
void tst_QJSEngine::valueConversion_basic2()