aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/jsapi/qjsvalue.cpp6
-rw-r--r--tests/auto/qml/qjsvalue/tst_qjsvalue.cpp15
2 files changed, 19 insertions, 2 deletions
diff --git a/src/qml/jsapi/qjsvalue.cpp b/src/qml/jsapi/qjsvalue.cpp
index fe388f3b52..5c246bf2fd 100644
--- a/src/qml/jsapi/qjsvalue.cpp
+++ b/src/qml/jsapi/qjsvalue.cpp
@@ -591,8 +591,10 @@ QVariant QJSValue::toVariant() const
if (val.isString())
return QVariant(val.toQString());
- if (QV4::Managed *m = val.as<QV4::Managed>())
- return m->engine()->toVariant(val, /*typeHint*/ -1, /*createJSValueForObjects*/ false);
+ if (QV4::Managed *m = val.as<QV4::Managed>()) {
+ return m->engine()->toVariant(val, /*typeHint*/ -1,
+ /*createJSValueForObjects*/ val.isFunctionObject());
+ }
Q_ASSERT(false);
return QVariant();
diff --git a/tests/auto/qml/qjsvalue/tst_qjsvalue.cpp b/tests/auto/qml/qjsvalue/tst_qjsvalue.cpp
index 0ae1fb6dfb..7f35282e89 100644
--- a/tests/auto/qml/qjsvalue/tst_qjsvalue.cpp
+++ b/tests/auto/qml/qjsvalue/tst_qjsvalue.cpp
@@ -1077,6 +1077,21 @@ void tst_QJSValue::toVariant()
qInstallMessageHandler(handler);
}
+
+ // function
+ {
+ QJSValue func = eng.evaluate("(function() { return 5 + 5 })");
+ QVERIFY(func.isCallable());
+ QCOMPARE(func.call().toInt(), 10);
+
+ QVariant funcVar = func.toVariant();
+ QVERIFY(funcVar.isValid());
+ QCOMPARE(funcVar.metaType(), QMetaType::fromType<QJSValue>());
+
+ QJSValue func2 = eng.toScriptValue(funcVar);
+ QVERIFY(func2.isCallable());
+ QCOMPARE(func2.call().toInt(), 10);
+ }
}
void tst_QJSValue::toQObject_nonQObject_data()