summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/script/api/qscriptengine.cpp7
-rw-r--r--src/script/bridge/qscriptqobject.cpp20
-rw-r--r--tests/auto/qscriptqobject/tst_qscriptqobject.cpp3
3 files changed, 23 insertions, 7 deletions
diff --git a/src/script/api/qscriptengine.cpp b/src/script/api/qscriptengine.cpp
index a8071ba..9e789bf 100644
--- a/src/script/api/qscriptengine.cpp
+++ b/src/script/api/qscriptengine.cpp
@@ -46,7 +46,6 @@
#endif
Q_DECLARE_METATYPE(QScriptValue)
-Q_DECLARE_METATYPE(QVariant)
#ifndef QT_NO_QOBJECT
Q_DECLARE_METATYPE(QObjectList)
#endif
@@ -1982,8 +1981,6 @@ QScriptValue QScriptEnginePrivate::create(int type, const void *ptr)
result = *reinterpret_cast<const QScriptValue*>(ptr);
if (!result.isValid())
result = QScriptValue(QScriptValue::UndefinedValue);
- } else if (type == qMetaTypeId<QVariant>()) {
- result = scriptValueFromVariant(*reinterpret_cast<const QVariant*>(ptr));
}
#ifndef QT_NO_QOBJECT
@@ -2000,6 +1997,8 @@ QScriptValue QScriptEnginePrivate::create(int type, const void *ptr)
else {
QByteArray typeName = QMetaType::typeName(type);
+ if (typeName == "QVariant")
+ result = scriptValueFromVariant(*reinterpret_cast<const QVariant*>(ptr));
if (typeName.endsWith('*') && !*reinterpret_cast<void* const *>(ptr))
result = QScriptValue(QScriptValue::NullValue);
else
@@ -2172,7 +2171,7 @@ bool QScriptEnginePrivate::convert(const QScriptValue &value,
return false;
*reinterpret_cast<QScriptValue*>(ptr) = value;
return true;
- } else if (type == qMetaTypeId<QVariant>()) {
+ } else if (name == "QVariant") {
*reinterpret_cast<QVariant*>(ptr) = value.toVariant();
return true;
}
diff --git a/src/script/bridge/qscriptqobject.cpp b/src/script/bridge/qscriptqobject.cpp
index da301a0..b0cfefc 100644
--- a/src/script/bridge/qscriptqobject.cpp
+++ b/src/script/bridge/qscriptqobject.cpp
@@ -1419,10 +1419,24 @@ void QObjectConnectionManager::execute(int slotIndex, void **argv)
QVector<JSC::JSValue> argsVector;
argsVector.resize(argc);
for (int i = 0; i < argc; ++i) {
- int argType = QMetaType::type(parameterTypes.at(i));
// ### optimize -- no need to convert via QScriptValue
- QScriptValue arg = engine->create(argType, argv[i + 1]);
- argsVector[i] = engine->scriptValueToJSCValue(arg);
+ QScriptValue actual;
+ void *arg = argv[i + 1];
+ QByteArray typeName = parameterTypes.at(i);
+ int argType = QMetaType::type(parameterTypes.at(i));
+ if (!argType) {
+ if (typeName == "QVariant") {
+ actual = engine->scriptValueFromVariant(*reinterpret_cast<QVariant*>(arg));
+ } else {
+ qWarning("QScriptEngine: Unable to handle unregistered datatype '%s' "
+ "when invoking handler of signal %s::%s",
+ typeName.constData(), meta->className(), method.signature());
+ actual = QScriptValue(QScriptValue::UndefinedValue);
+ }
+ } else {
+ actual = engine->create(argType, arg);
+ }
+ argsVector[i] = engine->scriptValueToJSCValue(actual);
}
JSC::ArgList jscArgs(argsVector.data(), argsVector.size());
diff --git a/tests/auto/qscriptqobject/tst_qscriptqobject.cpp b/tests/auto/qscriptqobject/tst_qscriptqobject.cpp
index 5f1bb1f..969e80f 100644
--- a/tests/auto/qscriptqobject/tst_qscriptqobject.cpp
+++ b/tests/auto/qscriptqobject/tst_qscriptqobject.cpp
@@ -1613,6 +1613,7 @@ void tst_QScriptExtQObject::connectAndDisconnect()
QCOMPARE(m_engine->evaluate("gotSignal").toBoolean(), true);
QCOMPARE(m_engine->evaluate("signalArgs.length").toNumber(), 0.0);
QVERIFY(m_engine->evaluate("slotThisObject").strictlyEquals(m_engine->evaluate("otherObject")));
+ QEXPECT_FAIL("", "__qt_sender__ not implemented", Continue);
QVERIFY(m_engine->evaluate("signalSender").strictlyEquals(m_engine->evaluate("myObject")));
QCOMPARE(m_engine->evaluate("slotThisObject").property("name").toString(), QLatin1String("foo"));
QVERIFY(m_engine->evaluate("myObject.mySignal.disconnect(otherObject, myHandler)").isUndefined());
@@ -1624,6 +1625,7 @@ void tst_QScriptExtQObject::connectAndDisconnect()
QCOMPARE(m_engine->evaluate("gotSignal").toBoolean(), true);
QCOMPARE(m_engine->evaluate("signalArgs.length").toNumber(), 1.0);
QVERIFY(m_engine->evaluate("slotThisObject").strictlyEquals(m_engine->evaluate("yetAnotherObject")));
+ QEXPECT_FAIL("", "__qt_sender__ not implemented", Continue);
QVERIFY(m_engine->evaluate("signalSender").strictlyEquals(m_engine->evaluate("myObject")));
QCOMPARE(m_engine->evaluate("slotThisObject").property("name").toString(), QLatin1String("bar"));
QVERIFY(m_engine->evaluate("myObject.mySignal2.disconnect(yetAnotherObject, myHandler)").isUndefined());
@@ -1634,6 +1636,7 @@ void tst_QScriptExtQObject::connectAndDisconnect()
QCOMPARE(m_engine->evaluate("gotSignal").toBoolean(), true);
QCOMPARE(m_engine->evaluate("signalArgs.length").toNumber(), 1.0);
QCOMPARE(m_engine->evaluate("slotThisObject").toQObject(), (QObject *)m_myObject);
+ QEXPECT_FAIL("", "__qt_sender__ not implemented", Continue);
QVERIFY(m_engine->evaluate("signalSender").strictlyEquals(m_engine->evaluate("myObject")));
QVERIFY(m_engine->evaluate("myObject.mySignal2.disconnect(myObject, myHandler)").isUndefined());