aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cppgenerator.cpp16
-rw-r--r--cppgenerator.h3
2 files changed, 16 insertions, 3 deletions
diff --git a/cppgenerator.cpp b/cppgenerator.cpp
index e3574d7cf..2d41edb28 100644
--- a/cppgenerator.cpp
+++ b/cppgenerator.cpp
@@ -1080,12 +1080,22 @@ void CppGenerator::writeMethodCall(QTextStream& s, const AbstractMetaFunction* f
}
}
+QStringList CppGenerator::getAncestorMultipleInheritance(const AbstractMetaClass* metaClass)
+{
+ QStringList result = metaClass->baseClassNames();
+ if (!result.isEmpty()) {
+ foreach (const AbstractMetaClass* pClass, getBaseClasses(metaClass))
+ result.append(getAncestorMultipleInheritance(pClass));
+ }
+ return result;
+}
void CppGenerator::writeMultipleInheritanceInitializerFunction(QTextStream& s, const AbstractMetaClass* metaClass)
{
QString className = metaClass->qualifiedCppName();
+ QStringList ancestors = getAncestorMultipleInheritance(metaClass);
s << "static int mi_offsets[] = { ";
- for (int i = 0; i < metaClass->baseClassNames().size(); i++)
+ for (int i = 0; i < ancestors.size(); i++)
s << "-1, ";
s << "-1 };" << endl;
s << "int*" << endl;
@@ -1097,9 +1107,9 @@ void CppGenerator::writeMultipleInheritanceInitializerFunction(QTextStream& s, c
s << INDENT << "const " << className << "* class_ptr = reinterpret_cast<const " << className << "*>(cptr);" << endl;
s << INDENT << "size_t base = (size_t) class_ptr;" << endl;
int i = 0;
- foreach (QString parentName, metaClass->baseClassNames()) {
+ foreach (QString ancestor, ancestors) {
s << INDENT << "mi_offsets[" << i << "] = ";
- s << "((size_t) static_cast<const " << parentName << "*>(class_ptr)) - base;" << endl;
+ s << "((size_t) static_cast<const " << ancestor << "*>(class_ptr)) - base;" << endl;
i++;
}
}
diff --git a/cppgenerator.h b/cppgenerator.h
index 87df8e4a1..4e7709da6 100644
--- a/cppgenerator.h
+++ b/cppgenerator.h
@@ -121,6 +121,9 @@ private:
*/
QString multipleInheritanceInitializerFunctionName(const AbstractMetaClass* metaClass);
+ /// Returns a list of all classes to which the given class could be casted.
+ QStringList getAncestorMultipleInheritance(const AbstractMetaClass* metaClass);
+
/// Returns true if the given class supports the python sequence protocol
bool supportsSequenceProtocol(const AbstractMetaClass* metaClass);
// Maps special function names to function parameters and return types