From 417b438c96c19bacd40e57307c7c6adba72a413c Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Mon, 15 Mar 2021 10:34:57 +0100 Subject: Fix crash in dumpcpp-generated code QWidget/QObject were generated as base classes for the generated class, which is no longer correct after the introduction of the QAxBaseWidget/Object classes. Pass the correct base QMetaObject and simplify the code since there is always a base class now. Pick-to: 6.1 Change-Id: I822f2de4ce65785cd45dc3b4adf1923efae556be Reviewed-by: Volker Hilsheimer --- tools/dumpcpp/main.cpp | 30 ++++++++++++------------------ tools/dumpcpp/moc.cpp | 7 ++----- tools/dumpcpp/moc.h | 2 +- 3 files changed, 15 insertions(+), 24 deletions(-) (limited to 'tools') diff --git a/tools/dumpcpp/main.cpp b/tools/dumpcpp/main.cpp index a7dbbea..092a3c0 100644 --- a/tools/dumpcpp/main.cpp +++ b/tools/dumpcpp/main.cpp @@ -29,6 +29,7 @@ #include "moc.h" #include +#include #include #include #include @@ -41,7 +42,6 @@ #include #include #include -#include #include #include #include @@ -549,7 +549,6 @@ bool generateClassImpl(QTextStream &out, const QMetaObject *mo, const QByteArray qualifiedClassName += className; const QString moCode = mocCode(mo, QLatin1String(qualifiedClassName), - category.testFlag(ActiveX) ? QLatin1String("QWidget") : QLatin1String("QObject"), errorString); if (moCode.isEmpty()) { out << "#error moc error\n"; @@ -615,6 +614,13 @@ static void writeForwardDeclaration(QTextStream &declOut, const QByteArray &clas } } +static const QMetaObject *baseMetaObject(ObjectCategories c) +{ + return c.testFlag(ActiveX) + ? &QAxBaseWidget::staticMetaObject + : &QAxBaseObject::staticMetaObject; +} + bool generateTypeLibrary(QString typeLibFile, QString outname, const QString &nameSpace, ObjectCategories category) { @@ -726,16 +732,10 @@ bool generateTypeLibrary(QString typeLibFile, QString outname, // trigger meta object to collect references to other type libraries switch (typekind) { case TKIND_COCLASS: - if (category & ActiveX) - metaObject = qax_readClassInfo(typelib, typeinfo, &QWidget::staticMetaObject); - else - metaObject = qax_readClassInfo(typelib, typeinfo, &QObject::staticMetaObject); + metaObject = qax_readClassInfo(typelib, typeinfo, baseMetaObject(category)); break; case TKIND_DISPATCH: - if (category & ActiveX) - metaObject = qax_readInterfaceInfo(typelib, typeinfo, &QWidget::staticMetaObject); - else - metaObject = qax_readInterfaceInfo(typelib, typeinfo, &QObject::staticMetaObject); + metaObject = qax_readInterfaceInfo(typelib, typeinfo, baseMetaObject(category)); break; case TKIND_RECORD: case TKIND_ENUM: @@ -864,16 +864,10 @@ bool generateTypeLibrary(QString typeLibFile, QString outname, switch (typekind) { case TKIND_COCLASS: - if (object_category & ActiveX) - metaObject = qax_readClassInfo(typelib, typeinfo, &QWidget::staticMetaObject); - else - metaObject = qax_readClassInfo(typelib, typeinfo, &QObject::staticMetaObject); + metaObject = qax_readClassInfo(typelib, typeinfo, baseMetaObject(object_category)); break; case TKIND_DISPATCH: - if (object_category & ActiveX) - metaObject = qax_readInterfaceInfo(typelib, typeinfo, &QWidget::staticMetaObject); - else - metaObject = qax_readInterfaceInfo(typelib, typeinfo, &QObject::staticMetaObject); + metaObject = qax_readInterfaceInfo(typelib, typeinfo, baseMetaObject(object_category)); break; case TKIND_INTERFACE: { // only stub: QTBUG-27792, explicitly disable copy in inherited // class to make related error messages clearer diff --git a/tools/dumpcpp/moc.cpp b/tools/dumpcpp/moc.cpp index e405b0a..f4747f3 100644 --- a/tools/dumpcpp/moc.cpp +++ b/tools/dumpcpp/moc.cpp @@ -262,16 +262,13 @@ static QString cleanCode(QString code, const QString &className, const QString & } QString mocCode(const QMetaObject *mo, const QString &qualifiedClassName, - QString baseClass, QString *errorString) + QString *errorString) { QStringList name = qualifiedClassName.split(QLatin1String("::")); if (name.isEmpty()) name.append(QLatin1String(mo->className())); - if (baseClass.isEmpty()) { - if (const auto sc = mo->superClass()) - baseClass = QLatin1String(sc->className()); - } + const QString baseClass = QLatin1String(mo->superClass()->className()); const QString tempPattern = QDir::tempPath() + QLatin1Char('/') + name.constLast().toLower() + QLatin1String("_XXXXXX.h"); diff --git a/tools/dumpcpp/moc.h b/tools/dumpcpp/moc.h index 30a5030..0222615 100644 --- a/tools/dumpcpp/moc.h +++ b/tools/dumpcpp/moc.h @@ -41,7 +41,7 @@ QByteArray setterName(const QByteArray &propertyName); void formatCppEnum(QTextStream &str, const QMetaEnum &metaEnum); QString mocCode(const QMetaObject *, const QString &qualifiedClassName, - QString baseClass, QString *errorString); + QString *errorString); QT_END_NAMESPACE -- cgit v1.2.3