diff options
3 files changed, 33 insertions, 7 deletions
diff --git a/src/declarative/qml/v8/qv8engine.cpp b/src/declarative/qml/v8/qv8engine.cpp index 21084802e0..33c87b7196 100644 --- a/src/declarative/qml/v8/qv8engine.cpp +++ b/src/declarative/qml/v8/qv8engine.cpp @@ -460,13 +460,7 @@ QVariant QV8Engine::toBasicVariant(v8::Handle<v8::Value> value) int length = properties->Length(); if (length == 0) return QVariant(); - - QVariantMap map; - for (int ii = 0; ii < length; ++ii) { - v8::Handle<v8::Value> property = properties->Get(ii); - map.insert(toString(property), toVariant(object->Get(property), -1)); - } - return map; + return variantMapFromJS(object); } return QVariant(); diff --git a/tests/auto/declarative/qdeclarativeecmascript/data/objectConversion.qml b/tests/auto/declarative/qdeclarativeecmascript/data/objectConversion.qml new file mode 100644 index 0000000000..67fc342db3 --- /dev/null +++ b/tests/auto/declarative/qdeclarativeecmascript/data/objectConversion.qml @@ -0,0 +1,16 @@ +import QtQuick 2.0 + +Rectangle { + width: 360 + height: 360 + + function circularObject() { + var a = {} + var b = {} + + a.test = 100; + a.c = b; + b.c = a; + return a; + } +} diff --git a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp index 537965ccf8..9200e0f5f2 100644 --- a/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp +++ b/tests/auto/declarative/qdeclarativeecmascript/tst_qdeclarativeecmascript.cpp @@ -152,6 +152,7 @@ private slots: void propertyChangeSlots(); void elementAssign(); void objectPassThroughSignals(); + void objectConversion(); void booleanConversion(); void handleReferenceManagement(); void stringArg(); @@ -3314,6 +3315,21 @@ void tst_qdeclarativeecmascript::objectPassThroughSignals() delete object; } +// QTBUG-21626 +void tst_qdeclarativeecmascript::objectConversion() +{ + QDeclarativeComponent component(&engine, TEST_FILE("objectConversion.qml")); + + QObject *object = component.create(); + QVERIFY(object != 0); + QVariant retn; + QMetaObject::invokeMethod(object, "circularObject", Q_RETURN_ARG(QVariant, retn)); + QCOMPARE(retn.value<QVariantMap>().value("test"), QVariant(100)); + + delete object; +} + + // QTBUG-20242 void tst_qdeclarativeecmascript::booleanConversion() { |