summaryrefslogtreecommitdiffstats
path: root/src/corelib/plugin/qplugin.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/plugin/qplugin.h')
-rw-r--r--src/corelib/plugin/qplugin.h76
1 files changed, 68 insertions, 8 deletions
diff --git a/src/corelib/plugin/qplugin.h b/src/corelib/plugin/qplugin.h
index 411edba792..a80ee28c52 100644
--- a/src/corelib/plugin/qplugin.h
+++ b/src/corelib/plugin/qplugin.h
@@ -65,7 +65,36 @@ inline constexpr unsigned char qPluginArchRequirements()
typedef QObject *(*QtPluginInstanceFunction)();
struct QPluginMetaData
{
- const uchar *data;
+ static constexpr quint8 CurrentMetaDataVersion = 0;
+ static constexpr char MagicString[] = {
+ 'Q', 'T', 'M', 'E', 'T', 'A', 'D', 'A', 'T', 'A', ' ', '!'
+ };
+
+ template <size_t OSize, typename OO, size_t ISize, typename II>
+ static constexpr void copy(OO (&out)[OSize], II (&in)[ISize])
+ {
+ // std::copy is not constexpr until C++20
+ static_assert(OSize <= ISize, "Output would not be fully initialized");
+ for (size_t i = 0; i < OSize; ++i)
+ out[i] = in[i];
+ }
+
+ struct Header {
+ quint8 version = CurrentMetaDataVersion;
+ quint8 qt_major_version = QT_VERSION_MAJOR;
+ quint8 qt_minor_version = QT_VERSION_MINOR;
+ quint8 plugin_arch_requirements = qPluginArchRequirements();
+ };
+ static_assert(alignof(Header) == 1, "Alignment of header incorrect with this compiler");
+
+ struct MagicHeader {
+ char magic[sizeof(QPluginMetaData::MagicString)] = {};
+ constexpr MagicHeader() { copy(magic, QPluginMetaData::MagicString); }
+ Header header = {};
+ };
+ static_assert(alignof(MagicHeader) == 1, "Alignment of header incorrect with this compiler");
+
+ const void *data;
size_t size;
};
typedef QPluginMetaData (*QtPluginMetaDataFunction)();
@@ -104,6 +133,24 @@ void Q_CORE_EXPORT qRegisterStaticPluginFunction(QStaticPlugin staticPlugin);
# define QT_PLUGIN_METADATA_SECTION
#endif
+// Since Qt 6.3
+template <auto (&PluginMetaData)> class QPluginMetaDataV2
+{
+ struct Payload {
+ QPluginMetaData::MagicHeader header = {};
+ quint8 payload[sizeof(PluginMetaData)] = {};
+ constexpr Payload() { QPluginMetaData::copy(payload, PluginMetaData); }
+ };
+
+#define QT_PLUGIN_METADATAV2_SECTION QT_PLUGIN_METADATA_SECTION
+ Payload payload = {};
+
+public:
+ operator QPluginMetaData() const
+ {
+ return { &payload, sizeof(payload) };
+ }
+};
#define Q_IMPORT_PLUGIN(PLUGIN) \
extern const QT_PREPEND_NAMESPACE(QStaticPlugin) qt_static_plugin_##PLUGIN(); \
@@ -134,25 +181,38 @@ void Q_CORE_EXPORT qRegisterStaticPluginFunction(QStaticPlugin staticPlugin);
}
#if defined(QT_STATICPLUGIN)
+# define QT_MOC_EXPORT_PLUGIN_COMMON(PLUGINCLASS, MANGLEDNAME) \
+ static QT_PREPEND_NAMESPACE(QObject) *qt_plugin_instance_##MANGLEDNAME() \
+ Q_PLUGIN_INSTANCE(PLUGINCLASS) \
+ const QT_PREPEND_NAMESPACE(QStaticPlugin) qt_static_plugin_##MANGLEDNAME() \
+ { return { qt_plugin_instance_##MANGLEDNAME, qt_plugin_query_metadata_##MANGLEDNAME}; } \
+ /**/
# define QT_MOC_EXPORT_PLUGIN(PLUGINCLASS, PLUGINCLASSNAME) \
- static QT_PREPEND_NAMESPACE(QObject) *qt_plugin_instance_##PLUGINCLASSNAME() \
- Q_PLUGIN_INSTANCE(PLUGINCLASS) \
static QPluginMetaData qt_plugin_query_metadata_##PLUGINCLASSNAME() \
{ return { qt_pluginMetaData_##PLUGINCLASSNAME, sizeof qt_pluginMetaData_##PLUGINCLASSNAME }; } \
- const QT_PREPEND_NAMESPACE(QStaticPlugin) qt_static_plugin_##PLUGINCLASSNAME() { \
- return { qt_plugin_instance_##PLUGINCLASSNAME, qt_plugin_query_metadata_##PLUGINCLASSNAME}; \
- }
+ QT_MOC_EXPORT_PLUGIN_COMMON(PLUGINCLASS, PLUGINCLASSNAME)
+# define QT_MOC_EXPORT_PLUGIN_V2(PLUGINCLASS, MANGLEDNAME, MD) \
+ static QT_PREPEND_NAMESPACE(QPluginMetaData) qt_plugin_query_metadata_##MANGLEDNAME() \
+ { static constexpr QPluginMetaDataV2<MD> md{}; return md; } \
+ QT_MOC_EXPORT_PLUGIN_COMMON(PLUGINCLASS, MANGLEDNAME)
#else
+# define QT_MOC_EXPORT_PLUGIN_COMMON(PLUGINCLASS, MANGLEDNAME) \
+ extern "C" Q_DECL_EXPORT QT_PREPEND_NAMESPACE(QObject) *qt_plugin_instance() \
+ Q_PLUGIN_INSTANCE(PLUGINCLASS) \
+ /**/
# define QT_MOC_EXPORT_PLUGIN(PLUGINCLASS, PLUGINCLASSNAME) \
extern "C" Q_DECL_EXPORT \
QPluginMetaData qt_plugin_query_metadata() \
{ return { qt_pluginMetaData_##PLUGINCLASSNAME, sizeof qt_pluginMetaData_##PLUGINCLASSNAME }; } \
- extern "C" Q_DECL_EXPORT QT_PREPEND_NAMESPACE(QObject) *qt_plugin_instance() \
- Q_PLUGIN_INSTANCE(PLUGINCLASS)
+ QT_MOC_EXPORT_PLUGIN_COMMON(PLUGINCLASS, PLUGINCLASSNAME)
+# define QT_MOC_EXPORT_PLUGIN_V2(PLUGINCLASS, MANGLEDNAME, MD) \
+ extern "C" Q_DECL_EXPORT QT_PREPEND_NAMESPACE(QPluginMetaData) qt_plugin_query_metadata() \
+ { static constexpr QT_PLUGIN_METADATAV2_SECTION QPluginMetaDataV2<MD> md{}; return md; } \
+ QT_MOC_EXPORT_PLUGIN_COMMON(PLUGINCLASS, MANGLEDNAME)
#endif
#define Q_EXPORT_PLUGIN(PLUGIN) \