From fcca6e40558e7b146d69ad82b3da2ff19ed5cf76 Mon Sep 17 00:00:00 2001 From: Kent Hansen Date: Tue, 30 Jun 2009 08:53:49 +0200 Subject: port recent changes from qt/master Makes variant conversion work for signal handlers. --- src/script/api/qscriptengine.cpp | 7 +++---- src/script/bridge/qscriptqobject.cpp | 20 +++++++++++++++++--- tests/auto/qscriptqobject/tst_qscriptqobject.cpp | 3 +++ 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(ptr); if (!result.isValid()) result = QScriptValue(QScriptValue::UndefinedValue); - } else if (type == qMetaTypeId()) { - result = scriptValueFromVariant(*reinterpret_cast(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(ptr)); if (typeName.endsWith('*') && !*reinterpret_cast(ptr)) result = QScriptValue(QScriptValue::NullValue); else @@ -2172,7 +2171,7 @@ bool QScriptEnginePrivate::convert(const QScriptValue &value, return false; *reinterpret_cast(ptr) = value; return true; - } else if (type == qMetaTypeId()) { + } else if (name == "QVariant") { *reinterpret_cast(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 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(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()); -- cgit v0.12