diff options
-rw-r--r-- | cppgenerator.cpp | 13 | ||||
-rw-r--r-- | headergenerator.cpp | 27 | ||||
-rw-r--r-- | overloaddata.cpp | 6 |
3 files changed, 35 insertions, 11 deletions
diff --git a/cppgenerator.cpp b/cppgenerator.cpp index 2cc1a05b1..f4cc81a45 100644 --- a/cppgenerator.cpp +++ b/cppgenerator.cpp @@ -222,8 +222,11 @@ void CppGenerator::generateClass(QTextStream &s, const AbstractMetaClass *metaCl foreach (AbstractMetaFunctionList allOverloads, getFunctionGroups(metaClass).values()) { AbstractMetaFunctionList overloads; foreach (AbstractMetaFunction* func, allOverloads) { - if (!func->isAssignmentOperator() && !func->isCastOperator() && !func->isModifiedRemoved() && !func->isPrivate() && - func->ownerClass() == func->implementingClass()) + if (!func->isAssignmentOperator() + && !func->isCastOperator() + && !func->isModifiedRemoved() + && !func->isPrivate() + && func->ownerClass() == func->implementingClass()) overloads.append(func); } @@ -1028,7 +1031,11 @@ void CppGenerator::writeInvalidCppObjectCheck(QTextStream& s, QString pyArgName, QString implicitChecks; QTextStream ic(&implicitChecks); foreach (const AbstractMetaFunction* ctor, implicitConversions(type)) { - const TypeEntry* te = ctor->arguments().first()->type()->typeEntry(); + const TypeEntry* te; + if (ctor->isConversionOperator()) + te = ctor->ownerClass()->typeEntry(); + else + te = ctor->arguments().first()->type()->typeEntry(); if (te->isValue() || te->isObject()) ic << " || " << cpythonCheckFunction(te) << '(' << pyArgName << ')'; } diff --git a/headergenerator.cpp b/headergenerator.cpp index 2d5bbf52e..111809758 100644 --- a/headergenerator.cpp +++ b/headergenerator.cpp @@ -471,7 +471,10 @@ void HeaderGenerator::writeTypeConverterImpl(QTextStream& s, const TypeEntry* ty isFirst = false; else s << endl << INDENT << " || "; - s << cpythonCheckFunction(ctor->arguments().first()->type()); + if (ctor->isConversionOperator()) + s << cpythonCheckFunction(ctor->ownerClass()->typeEntry()); + else + s << cpythonCheckFunction(ctor->arguments().first()->type()); s << "(pyobj)"; } s << ';' << endl; @@ -496,18 +499,28 @@ void HeaderGenerator::writeTypeConverterImpl(QTextStream& s, const TypeEntry* ty Indentation indent(INDENT); s << INDENT; - - const AbstractMetaType* argType = ctor->arguments().first()->type(); if (firstImplicitIf) firstImplicitIf = false; else s << "else "; - s << "if (" << cpythonCheckFunction(argType) << "(pyobj))" << endl; + + QString typeCheck; + QString toCppConv; + QTextStream tcc(&toCppConv); + if (ctor->isConversionOperator()) { + const AbstractMetaClass* metaClass = ctor->ownerClass(); + typeCheck = cpythonCheckFunction(metaClass->typeEntry()); + writeToCppConversion(tcc, metaClass, "pyobj"); + } else { + const AbstractMetaType* argType = ctor->arguments().first()->type(); + typeCheck = cpythonCheckFunction(argType); + writeToCppConversion(tcc, argType, 0, "pyobj"); + } + + s << "if (" << typeCheck << "(pyobj))" << endl; { Indentation indent(INDENT); - s << INDENT << "return " << type->name() << '('; - writeToCppConversion(s, argType, 0, "pyobj"); - s << ");" << endl; + s << INDENT << "return " << type->name() << '(' << toCppConv << ");" << endl; } } s << INDENT << '}' << endl; diff --git a/overloaddata.cpp b/overloaddata.cpp index e2814c4cd..fe7b643c8 100644 --- a/overloaddata.cpp +++ b/overloaddata.cpp @@ -73,7 +73,11 @@ void OverloadData::sortNextOverloads() foreach(OverloadData* ov, m_nextOverloadData) { const AbstractMetaType* targetType = ov->argType(); foreach(AbstractMetaFunction* function, m_generator->implicitConversions(ov->argType())) { - QString convertibleType = function->arguments().first()->type()->typeEntry()->name(); + QString convertibleType; + if (function->isConversionOperator()) + convertibleType = function->ownerClass()->typeEntry()->name(); + else + convertibleType = function->arguments().first()->type()->typeEntry()->name(); if (!map.contains(convertibleType)) continue; |