aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cppgenerator.cpp13
-rw-r--r--headergenerator.cpp27
-rw-r--r--overloaddata.cpp6
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;