aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2019-04-30 10:52:20 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2019-05-03 18:03:54 +0000
commitce8123b19ac37b114030bda7494508c361b97be5 (patch)
tree2e3d2dd9d63c42d85573e9caabaf3b22b334c1a6
parent4281bc61bdb7dad335d0f83eece249217e57af60 (diff)
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 <tismer@stackless.com>
-rw-r--r--sources/shiboken2/generator/shiboken2/cppgenerator.cpp37
-rw-r--r--sources/shiboken2/generator/shiboken2/shibokengenerator.cpp11
-rw-r--r--sources/shiboken2/generator/shiboken2/shibokengenerator.h6
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 <set>" << endl;
+ if (getMultipleInheritingClass(metaClass) != nullptr)
+ s << "#include <algorithm>\n#include <set>\n";
if (metaClass->generateExceptionHandling())
s << "#include <exception>" << 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<const %1*>(class_ptr)) - base")
- .arg(baseClass->qualifiedCppName()));
- result.append(QString::fromLatin1("((size_t) static_cast<const %1*>((%2*)((void*)class_ptr))) - base")
- .arg(baseClass->qualifiedCppName(), metaClass->qualifiedCppName()));
+ QString offset;
+ QTextStream(&offset) << "reinterpret_cast<uintptr_t>(static_cast<const "
+ << baseClass->qualifiedCppName() << "*>(class_ptr)) - base";
+ result.append(offset);
+ offset.clear();
+ QTextStream(&offset) << "reinterpret_cast<uintptr_t>(static_cast<const "
+ << baseClass->qualifiedCppName() << "*>(static_cast<const "
+ << metaClass->qualifiedCppName()
+ << "*>(static_cast<const void*>(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<int> offsets;" << endl;
- s << INDENT << "std::set<int>::iterator it;" << endl;
- s << INDENT << "const " << className << "* class_ptr = reinterpret_cast<const " << className << "*>(cptr);" << endl;
- s << INDENT << "size_t base = (size_t) class_ptr;" << endl;
+ s << INDENT << "const auto* class_ptr = reinterpret_cast<const " << className << "*>(cptr);" << endl;
+ s << INDENT << "const auto base = reinterpret_cast<uintptr_t>(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);