diff options
author | Hugo Lima <hugo.lima@openbossa.org> | 2010-02-19 16:55:07 -0200 |
---|---|---|
committer | Marcelo Lira <marcelo.lira@openbossa.org> | 2010-02-19 18:59:23 -0300 |
commit | 08acf3d1c3f5fd364ebd29ae00f48b6f6ad2f97d (patch) | |
tree | 1a95a3a974948dc80cb56b957a4ce1dc88735743 /cppgenerator.cpp | |
parent | a49868b79fe2c02106b7d89a502d3a86a7027398 (diff) |
Fix bug on overload resolution when the generator needs to decide if
it can expect the argument to be any number type or an explicty type,
e.g. float.
Reviewed by Luciano Wolf <luciano.wolf@openbossa.org>
Diffstat (limited to 'cppgenerator.cpp')
-rw-r--r-- | cppgenerator.cpp | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/cppgenerator.cpp b/cppgenerator.cpp index 458b4ca75..6657b1100 100644 --- a/cppgenerator.cpp +++ b/cppgenerator.cpp @@ -796,7 +796,7 @@ void CppGenerator::writeMethodWrapper(QTextStream& s, const AbstractMetaFunction //DEBUG // if (rfunc->name() == "operator+" && rfunc->ownerClass()->name() == "Str") { -// QString dumpFile = QString("/tmp/%1_%2.dot").arg(m_packageName).arg(pythonOperatorFunctionName(rfunc)).toLower(); +// QString dumpFile = QString("/tmp/%1_%2.dot").arg(moduleName()).arg(pythonOperatorFunctionName(rfunc)).toLower(); // overloadData.dumpGraph(dumpFile); // } //DEBUG @@ -1073,18 +1073,28 @@ void CppGenerator::writeTypeCheck(QTextStream& s, const AbstractMetaType* argTyp void CppGenerator::writeTypeCheck(QTextStream& s, const OverloadData* overloadData, QString argumentName) { - const AbstractMetaType* argType = overloadData->argType(); - QSet<const TypeEntry*> numericTypes; - foreach (OverloadData* pd, overloadData->overloadDataOnPosition(overloadData->argPos())) { - if (!pd->argType()->isPrimitive()) + int argPos = overloadData->argument(overloadData->referenceFunction())->argumentIndex(); + + foreach (const AbstractMetaFunction* func, overloadData->previousOverloadData()->overloads()) { + AbstractMetaArgumentList args = func->arguments(); + if (args.isEmpty()) + continue; + + int offset = OverloadData::numberOfRemovedArguments(func, argPos); + + if ((argPos + offset) >= args.size()) continue; - if (ShibokenGenerator::isNumber(pd->argType()->typeEntry())) - numericTypes << pd->argType()->typeEntry(); + AbstractMetaArgument* arg = args.at(argPos + offset); + if (!arg->type()->isPrimitive()) + continue; + if (ShibokenGenerator::isNumber(arg->type()->typeEntry())) + numericTypes << arg->type()->typeEntry(); } // This condition trusts that the OverloadData object will arrange for // PyInt type to come after the more precise numeric types (e.g. float) + const AbstractMetaType* argType = overloadData->argType(); bool numberType = numericTypes.count() == 1 || ShibokenGenerator::isPyInt(argType); QString customType = (overloadData->hasArgumentTypeReplace() ? overloadData->argumentTypeReplaced() : ""); |