aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/jsruntime/qv4qobjectwrapper.cpp5
-rw-r--r--tests/auto/qml/qjsengine/tst_qjsengine.cpp20
2 files changed, 25 insertions, 0 deletions
diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp
index 1cfd2d88ec..dd58e0609b 100644
--- a/src/qml/jsruntime/qv4qobjectwrapper.cpp
+++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp
@@ -1315,6 +1315,11 @@ static const QQmlPropertyData * RelatedMethod(QObject *object,
methodOffset -= QMetaObject_methods(mo);
}
+ // If we've been called before with the same override index, then
+ // we can't go any further...
+ if (&dummy == current && dummy.coreIndex == current->overrideIndex)
+ return 0;
+
QMetaMethod method = mo->method(current->overrideIndex);
dummy.load(method);
diff --git a/tests/auto/qml/qjsengine/tst_qjsengine.cpp b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
index ed6b5a9d42..3357aa7643 100644
--- a/tests/auto/qml/qjsengine/tst_qjsengine.cpp
+++ b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
@@ -163,6 +163,9 @@ tst_QJSEngine::~tst_QJSEngine()
{
}
+Q_DECLARE_METATYPE(Qt::KeyboardModifier)
+Q_DECLARE_METATYPE(Qt::KeyboardModifiers)
+
class OverloadedSlots : public QObject
{
Q_OBJECT
@@ -175,6 +178,7 @@ signals:
void slotWithoutArgCalled();
void slotWithSingleArgCalled(const QString &arg);
void slotWithArgumentsCalled(const QString &arg1, const QString &arg2, const QString &arg3);
+ void slotWithOverloadedArgumentsCalled(const QString &arg, Qt::KeyboardModifier modifier, Qt::KeyboardModifiers moreModifiers);
public slots:
void slotToCall() { emit slotWithoutArgCalled(); }
@@ -183,6 +187,10 @@ public slots:
{
slotWithArgumentsCalled(arg, arg2, arg3);
}
+ void slotToCall(const QString &arg, Qt::KeyboardModifier modifier, Qt::KeyboardModifiers blah = Qt::ShiftModifier)
+ {
+ emit slotWithOverloadedArgumentsCalled(arg, modifier, blah);
+ }
};
void tst_QJSEngine::callQObjectSlot()
@@ -228,6 +236,18 @@ void tst_QJSEngine::callQObjectSlot()
QCOMPARE(arguments.at(1).toString(), QString("arg2"));
QCOMPARE(arguments.at(2).toString(), QString("arg3"));
}
+
+ {
+ QSignalSpy spy(&dummy, SIGNAL(slotWithOverloadedArgumentsCalled(QString, Qt::KeyboardModifier, Qt::KeyboardModifiers)));
+ eng.evaluate(QStringLiteral("dummy.slotToCall('arg', %1);").arg(QString::number(Qt::ControlModifier)));
+ QCOMPARE(spy.count(), 1);
+
+ const QList<QVariant> arguments = spy.first();
+ QCOMPARE(arguments.at(0).toString(), QString("arg"));
+ QCOMPARE(arguments.at(1).toInt(), int(Qt::ControlModifier));
+ QCOMPARE(int(qvariant_cast<Qt::KeyboardModifiers>(arguments.at(2))), int(Qt::ShiftModifier));
+
+ }
}
void tst_QJSEngine::constructWithParent()