summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOlivier Goffart <ogoffart@woboq.com>2014-08-16 11:36:48 +0200
committerOlivier Goffart <ogoffart@woboq.com>2014-10-28 10:12:52 +0100
commitd49e7acc2bb98ae9416a532dac1f18e972fffb88 (patch)
tree5baf68c5829c193084971b03249b05c6bd6cf96e
parentaf3bd5037aeb9b842193f0e21cd5c03572b6dac6 (diff)
moc: Have a staticMetaCall in the Q_GADGET metaobject
This provides a way to invoke Q_INVOKABLE method Change-Id: I301cec2a21c2889fb9dde0b1eb6e92d0bd561bd7 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
-rw-r--r--src/corelib/kernel/qobjectdefs.h3
-rw-r--r--src/tools/moc/generator.cpp13
2 files changed, 11 insertions, 5 deletions
diff --git a/src/corelib/kernel/qobjectdefs.h b/src/corelib/kernel/qobjectdefs.h
index 25e43d0ca0..38ee31b250 100644
--- a/src/corelib/kernel/qobjectdefs.h
+++ b/src/corelib/kernel/qobjectdefs.h
@@ -159,7 +159,8 @@ private: \
#define Q_GADGET \
public: \
static const QMetaObject staticMetaObject; \
-private:
+private: \
+ Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **);
#endif // QT_NO_META_MACROS
#else // Q_MOC_RUN
diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp
index dd032e46f6..b9c46300e4 100644
--- a/src/tools/moc/generator.cpp
+++ b/src/tools/moc/generator.cpp
@@ -425,7 +425,8 @@ void Generator::generateCode()
//
// Generate internal qt_static_metacall() function
//
- if (cdef->hasQObject && !isQt)
+ const bool hasStaticMetaCall = (cdef->hasQObject || !cdef->methodList.isEmpty()) && !isQt;
+ if (hasStaticMetaCall)
generateStaticMetacall();
//
@@ -513,7 +514,7 @@ void Generator::generateCode()
fprintf(out, "qt_meta_stringdata_%s.data,\n"
" qt_meta_data_%s, ", qualifiedClassNameIdentifier.constData(),
qualifiedClassNameIdentifier.constData());
- if (cdef->hasQObject && !isQt)
+ if (hasStaticMetaCall)
fprintf(out, " qt_static_metacall, ");
else
fprintf(out, " 0, ");
@@ -1246,10 +1247,14 @@ void Generator::generateStaticMetacall()
else
fprintf(out, " ");
fprintf(out, "if (_c == QMetaObject::InvokeMetaMethod) {\n");
+ if (cdef->hasQObject) {
#ifndef QT_NO_DEBUG
- fprintf(out, " Q_ASSERT(staticMetaObject.cast(_o));\n");
+ fprintf(out, " Q_ASSERT(staticMetaObject.cast(_o));\n");
#endif
- fprintf(out, " %s *_t = static_cast<%s *>(_o);\n", cdef->classname.constData(), cdef->classname.constData());
+ fprintf(out, " %s *_t = static_cast<%s *>(_o);\n", cdef->classname.constData(), cdef->classname.constData());
+ } else {
+ fprintf(out, " %s *_t = reinterpret_cast<%s *>(_o);\n", cdef->classname.constData(), cdef->classname.constData());
+ }
fprintf(out, " switch (_id) {\n");
for (int methodindex = 0; methodindex < methodList.size(); ++methodindex) {
const FunctionDef &f = methodList.at(methodindex);