From ce8123b19ac37b114030bda7494508c361b97be5 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 30 Apr 2019 10:52:20 +0200 Subject: shiboken: Refactor code generating multiple inheritance - Remove the check function hasMultipleInheritanceInAncestry(), which is nearly identical to getMultipleInheritingClass(). - Modernize the generated code to use C++ casts, uintptr_t and streamline Change-Id: I68f52c2cbf1a589fd31c9c73919365176c56932e Reviewed-by: Christian Tismer --- .../shiboken2/generator/shiboken2/cppgenerator.cpp | 37 ++++++++++------------ .../generator/shiboken2/shibokengenerator.cpp | 11 +------ .../generator/shiboken2/shibokengenerator.h | 6 ++-- 3 files changed, 20 insertions(+), 34 deletions(-) diff --git a/sources/shiboken2/generator/shiboken2/cppgenerator.cpp b/sources/shiboken2/generator/shiboken2/cppgenerator.cpp index 67f8f1a7b..4b0b99317 100644 --- a/sources/shiboken2/generator/shiboken2/cppgenerator.cpp +++ b/sources/shiboken2/generator/shiboken2/cppgenerator.cpp @@ -330,8 +330,8 @@ void CppGenerator::generateClass(QTextStream &s, GeneratorContext &classContext) // The multiple inheritance initialization function // needs the 'set' class from C++ STL. - if (hasMultipleInheritanceInAncestry(metaClass)) - s << "#include " << endl; + if (getMultipleInheritingClass(metaClass) != nullptr) + s << "#include \n#include \n"; if (metaClass->generateExceptionHandling()) s << "#include " << endl; @@ -3553,11 +3553,18 @@ QStringList CppGenerator::getAncestorMultipleInheritance(const AbstractMetaClass const AbstractMetaClassList &baseClases = getBaseClasses(metaClass); if (!baseClases.isEmpty()) { for (const AbstractMetaClass *baseClass : baseClases) { - result.append(QString::fromLatin1("((size_t) static_cast(class_ptr)) - base") - .arg(baseClass->qualifiedCppName())); - result.append(QString::fromLatin1("((size_t) static_cast((%2*)((void*)class_ptr))) - base") - .arg(baseClass->qualifiedCppName(), metaClass->qualifiedCppName())); + QString offset; + QTextStream(&offset) << "reinterpret_cast(static_castqualifiedCppName() << "*>(class_ptr)) - base"; + result.append(offset); + offset.clear(); + QTextStream(&offset) << "reinterpret_cast(static_castqualifiedCppName() << "*>(static_castqualifiedCppName() + << "*>(static_cast(class_ptr)))) - base"; + result.append(offset); } + for (const AbstractMetaClass *baseClass : baseClases) result.append(getAncestorMultipleInheritance(baseClass)); } @@ -3579,25 +3586,17 @@ void CppGenerator::writeMultipleInheritanceInitializerFunction(QTextStream& s, c { Indentation indent(INDENT); s << INDENT << "std::set offsets;" << endl; - s << INDENT << "std::set::iterator it;" << endl; - s << INDENT << "const " << className << "* class_ptr = reinterpret_cast(cptr);" << endl; - s << INDENT << "size_t base = (size_t) class_ptr;" << endl; + s << INDENT << "const auto* class_ptr = reinterpret_cast(cptr);" << endl; + s << INDENT << "const auto base = reinterpret_cast(class_ptr);" << endl; for (const QString &ancestor : ancestors) - s << INDENT << "offsets.insert(" << ancestor << ");" << endl; + s << INDENT << "offsets.insert(int(" << ancestor << "));" << endl; s << endl; s << INDENT << "offsets.erase(0);" << endl; s << endl; - s << INDENT << "int i = 0;" << endl; - s << INDENT << "for (it = offsets.begin(); it != offsets.end(); it++) {" << endl; - { - Indentation indent(INDENT); - s << INDENT << "mi_offsets[i] = *it;" << endl; - s << INDENT << "i++;" << endl; - } - s << INDENT << '}' << endl; + s << INDENT << "std::copy(offsets.cbegin(), offsets.cend(), mi_offsets);\n"; } s << INDENT << '}' << endl; s << INDENT << "return mi_offsets;" << endl; @@ -3748,8 +3747,6 @@ void CppGenerator::writeExtendedConverterInitialization(QTextStream& s, const Ty QString CppGenerator::multipleInheritanceInitializerFunctionName(const AbstractMetaClass* metaClass) { - if (!hasMultipleInheritanceInAncestry(metaClass)) - return QString(); return cpythonBaseName(metaClass->typeEntry()) + QLatin1String("_mi_init"); } diff --git a/sources/shiboken2/generator/shiboken2/shibokengenerator.cpp b/sources/shiboken2/generator/shiboken2/shibokengenerator.cpp index 12efb68c3..44405c700 100644 --- a/sources/shiboken2/generator/shiboken2/shibokengenerator.cpp +++ b/sources/shiboken2/generator/shiboken2/shibokengenerator.cpp @@ -2178,15 +2178,6 @@ bool ShibokenGenerator::injectedCodeUsesArgument(const AbstractMetaFunction* fun return false; } -bool ShibokenGenerator::hasMultipleInheritanceInAncestry(const AbstractMetaClass* metaClass) -{ - if (!metaClass || metaClass->baseClassNames().isEmpty()) - return false; - if (metaClass->baseClassNames().size() > 1) - return true; - return hasMultipleInheritanceInAncestry(metaClass->baseClass()); -} - bool ShibokenGenerator::classNeedsGetattroFunction(const AbstractMetaClass* metaClass) { return getGeneratorClassInfo(metaClass).needsGetattroFunction; @@ -2269,7 +2260,7 @@ AbstractMetaClassList ShibokenGenerator::getBaseClasses(const AbstractMetaClass* const AbstractMetaClass* ShibokenGenerator::getMultipleInheritingClass(const AbstractMetaClass* metaClass) { if (!metaClass || metaClass->baseClassNames().isEmpty()) - return 0; + return nullptr; if (metaClass->baseClassNames().size() > 1) return metaClass; return getMultipleInheritingClass(metaClass->baseClass()); diff --git a/sources/shiboken2/generator/shiboken2/shibokengenerator.h b/sources/shiboken2/generator/shiboken2/shibokengenerator.h index ebfc059de..f5f291526 100644 --- a/sources/shiboken2/generator/shiboken2/shibokengenerator.h +++ b/sources/shiboken2/generator/shiboken2/shibokengenerator.h @@ -183,8 +183,8 @@ protected: Options options = NoOption, int arg_count = -1) const; - /// Returns true if there are cases of multiple inheritance in any of its ancestors. - bool hasMultipleInheritanceInAncestry(const AbstractMetaClass* metaClass); + /// Returns the top-most class that has multiple inheritance in the ancestry. + static const AbstractMetaClass *getMultipleInheritingClass(const AbstractMetaClass* metaClass); /// Returns true if the class needs to have a getattro function. bool classNeedsGetattroFunction(const AbstractMetaClass* metaClass); @@ -198,8 +198,6 @@ protected: /// Returns a list of parent classes for a given class. AbstractMetaClassList getBaseClasses(const AbstractMetaClass* metaClass) const; - const AbstractMetaClass* getMultipleInheritingClass(const AbstractMetaClass* metaClass); - void writeToPythonConversion(QTextStream& s, const AbstractMetaType* type, const AbstractMetaClass* context, const QString& argumentName); void writeToCppConversion(QTextStream& s, const AbstractMetaType* type, const AbstractMetaClass* context, const QString& inArgName, const QString& outArgName); -- cgit v1.2.3