aboutsummaryrefslogtreecommitdiffstats
path: root/cppgenerator.cpp
diff options
context:
space:
mode:
authorHugo Lima <hugo.lima@openbossa.org>2010-02-19 16:55:07 -0200
committerMarcelo Lira <marcelo.lira@openbossa.org>2010-02-19 18:59:23 -0300
commit08acf3d1c3f5fd364ebd29ae00f48b6f6ad2f97d (patch)
tree1a95a3a974948dc80cb56b957a4ce1dc88735743 /cppgenerator.cpp
parenta49868b79fe2c02106b7d89a502d3a86a7027398 (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.cpp24
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() : "");