diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2014-03-28 16:02:45 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-03-28 16:25:34 +0100 |
commit | bc030defad916b073ede55d7a7ad8db9a41e0ad2 (patch) | |
tree | 4cae2fe211c306ea50d52e3057b5fe0db4f6d28a | |
parent | 1526771ebf473af8a65bce77cfd16be67b6eb944 (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.cpp | 6 | ||||
-rw-r--r-- | tests/auto/qml/qjsengine/tst_qjsengine.cpp | 8 |
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() |