Skip to content

Commit 12dcb16

Browse files
committed
Fix call to QMetaObject::invokeMethod in Qt 6.5
1 parent 102ae77 commit 12dcb16

File tree

1 file changed

+17
-15
lines changed

1 file changed

+17
-15
lines changed

qmetaobject/src/qtdeclarative.rs

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ cpp! {{
2929
#include <QtQuick/QtQuick>
3030
#include <QtCore/QDebug>
3131
#include <QtQml/QQmlComponent>
32-
32+
3333
#ifdef NO_WIDGETS
3434
# define QAPPLICATION QGuiApplication
3535
# include <QtGui/QGuiApplication>
@@ -206,6 +206,8 @@ impl QmlEngine {
206206
let args_size = args.len();
207207
let args_ptr = args.as_ptr();
208208

209+
assert!(args_size <= 9);
210+
209211
cpp!(unsafe [
210212
self as "QmlEngineHolder *",
211213
name as "QByteArray",
@@ -219,23 +221,23 @@ impl QmlEngine {
219221
}
220222
QVariant ret;
221223
#if QT_VERSION >= QT_VERSION_CHECK(6,5,0)
222-
QMetaMethodArgument args[9] = {};
224+
#define INVOKE_METHOD(...) QMetaObject::invokeMethod(robjs.first(), name, qReturnArg(ret), __VA_ARGS__);
223225
#else
224-
QGenericArgument args[9] = {};
226+
#define INVOKE_METHOD(...) QMetaObject::invokeMethod(robjs.first(), name, Q_RETURN_ARG(QVariant, ret), __VA_ARGS__);
225227
#endif
226-
for (uint i = 0; i < args_size; ++i) {
227-
args[i] = Q_ARG(QVariant, args_ptr[i]);
228+
switch (args_size) {
229+
case 0: INVOKE_METHOD() break;
230+
case 1: INVOKE_METHOD(Q_ARG(QVariant, args_ptr[0])); break;
231+
case 2: INVOKE_METHOD(Q_ARG(QVariant, args_ptr[0]), Q_ARG(QVariant, args_ptr[1])); break;
232+
case 3: INVOKE_METHOD(Q_ARG(QVariant, args_ptr[0]), Q_ARG(QVariant, args_ptr[1]), Q_ARG(QVariant, args_ptr[2])); break;
233+
case 4: INVOKE_METHOD(Q_ARG(QVariant, args_ptr[0]), Q_ARG(QVariant, args_ptr[1]), Q_ARG(QVariant, args_ptr[2]), Q_ARG(QVariant, args_ptr[3])); break;
234+
case 5: INVOKE_METHOD(Q_ARG(QVariant, args_ptr[0]), Q_ARG(QVariant, args_ptr[1]), Q_ARG(QVariant, args_ptr[2]), Q_ARG(QVariant, args_ptr[3]), Q_ARG(QVariant, args_ptr[4])); break;
235+
case 6: INVOKE_METHOD(Q_ARG(QVariant, args_ptr[0]), Q_ARG(QVariant, args_ptr[1]), Q_ARG(QVariant, args_ptr[2]), Q_ARG(QVariant, args_ptr[3]), Q_ARG(QVariant, args_ptr[4]), Q_ARG(QVariant, args_ptr[5])); break;
236+
case 7: INVOKE_METHOD(Q_ARG(QVariant, args_ptr[0]), Q_ARG(QVariant, args_ptr[1]), Q_ARG(QVariant, args_ptr[2]), Q_ARG(QVariant, args_ptr[3]), Q_ARG(QVariant, args_ptr[4]), Q_ARG(QVariant, args_ptr[5]), Q_ARG(QVariant, args_ptr[6])); break;
237+
case 8: INVOKE_METHOD(Q_ARG(QVariant, args_ptr[0]), Q_ARG(QVariant, args_ptr[1]), Q_ARG(QVariant, args_ptr[2]), Q_ARG(QVariant, args_ptr[3]), Q_ARG(QVariant, args_ptr[4]), Q_ARG(QVariant, args_ptr[5]), Q_ARG(QVariant, args_ptr[6]), Q_ARG(QVariant, args_ptr[7])); break;
238+
case 9: INVOKE_METHOD(Q_ARG(QVariant, args_ptr[0]), Q_ARG(QVariant, args_ptr[1]), Q_ARG(QVariant, args_ptr[2]), Q_ARG(QVariant, args_ptr[3]), Q_ARG(QVariant, args_ptr[4]), Q_ARG(QVariant, args_ptr[5]), Q_ARG(QVariant, args_ptr[6]), Q_ARG(QVariant, args_ptr[7]), Q_ARG(QVariant, args_ptr[8])); break;
228239
}
229-
QMetaObject::invokeMethod(
230-
robjs.first(),
231-
name,
232-
#if QT_VERSION >= QT_VERSION_CHECK(6,5,0)
233-
qReturnArg(ret),
234-
#else
235-
Q_RETURN_ARG(QVariant, ret),
236-
#endif
237-
args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8]
238-
);
240+
#undef INVOKE_METHOD
239241
return ret;
240242
})
241243
}

0 commit comments

Comments
 (0)