diff options
author | Marcelo Lira <marcelo.lira@openbossa.org> | 2009-10-23 13:27:23 -0300 |
---|---|---|
committer | Marcelo Lira <marcelo.lira@openbossa.org> | 2009-10-23 13:27:23 -0300 |
commit | 70ba8b2ea9fcad7a6f88938c1675b45dec320a31 (patch) | |
tree | 96e35d9355a376d2a8a97a270107b229df1aace1 /cppgenerator.cpp | |
parent | 988e86e134ba72d037d9967384085f09c03de43d (diff) |
Revert "The implicit conversions of value types generate a new instance"
This reverts commit 0953187f7b13b8ca410c8db8fa856154cc6729a8.
Diffstat (limited to 'cppgenerator.cpp')
-rw-r--r-- | cppgenerator.cpp | 49 |
1 files changed, 16 insertions, 33 deletions
diff --git a/cppgenerator.cpp b/cppgenerator.cpp index 4c4065b52..596a10951 100644 --- a/cppgenerator.cpp +++ b/cppgenerator.cpp @@ -677,7 +677,12 @@ void CppGenerator::writeErrorSection(QTextStream& s, OverloadData& overloadData) void CppGenerator::writeTypeCheck(QTextStream& s, const OverloadData* overloadData, QString argumentName) { const AbstractMetaType* argType = overloadData->argType(); - AbstractMetaFunctionList implicitConvs = implicitConversions(argType); + AbstractMetaFunctionList implicitConverters; + if (argType->isValue()) { + const AbstractMetaClass* metaClass = classes().findClass(argType->name()); + if (metaClass) + implicitConverters = metaClass->implicitConversions(); + } int alternativeNumericTypes = 0; foreach (OverloadData* pd, overloadData->overloadDataOnPosition(overloadData->argPos())) { @@ -691,18 +696,18 @@ void CppGenerator::writeTypeCheck(QTextStream& s, const OverloadData* overloadDa // PyInt type to be the last entry on a list of overload argument data. bool numberType = alternativeNumericTypes == 1 || ShibokenGenerator::isPyInt(argType); - if (implicitConvs.size() > 0) + if (implicitConverters.size() > 0) s << '('; s << cpythonCheckFunction(argType, numberType) << '(' << argumentName << ')'; - foreach (const AbstractMetaFunction* ctor, implicitConvs) { + foreach (const AbstractMetaFunction* ctor, implicitConverters) { s << " || "; s << cpythonCheckFunction(ctor->arguments().first()->type(), numberType); s << '(' << argumentName << ')'; } - if (implicitConvs.size() > 0) + if (implicitConverters.size() > 0) s << ')'; } @@ -737,7 +742,7 @@ void CppGenerator::writeOverloadedMethodDecisor(QTextStream& s, OverloadData* pa return; } - bool manyArgs = maxArgs > 1 || rfunc->isConstructor(); + bool varargs = maxArgs > 1 || rfunc->isConstructor(); s << INDENT; @@ -766,21 +771,15 @@ void CppGenerator::writeOverloadedMethodDecisor(QTextStream& s, OverloadData* pa } } - // The implicit conversions of value types generate a new instance - // of the type, and this instance must be freed after use. - typedef QPair<int, QString> ArgTypeCheck; - foreach (OverloadData* overloadData, parentOverloadData->nextOverloadData()) { - QList<ArgTypeCheck> implicitConvTypes; - if (maxArgs > 0) { bool signatureFound = overloadData->overloads().size() == 1 && !overloadData->nextArgumentHasDefaultValue(); const AbstractMetaFunction* func = overloadData->overloads()[0]; - QString pyArgName = manyArgs ? QString("pyargs[%1]").arg(overloadData->argPos()) : "arg"; + QString pyArgName = varargs ? QString("pyargs[%1]").arg(overloadData->argPos()) : "arg"; s << "if ("; - if (signatureFound && manyArgs) { + if (signatureFound && varargs) { s << "numArgs == "; s << func->arguments().size() - OverloadData::numberOfRemovedArguments(func); s << " && "; @@ -794,14 +793,13 @@ void CppGenerator::writeOverloadedMethodDecisor(QTextStream& s, OverloadData* pa s << " && PySequence_Size(" << pyArgName << ") == 2"; } - if (signatureFound && manyArgs) { + if (signatureFound && varargs) { int numArgs = func->arguments().size() - OverloadData::numberOfRemovedArguments(func); OverloadData* tmp = overloadData; for (int i = overloadData->argPos() + 1; i < numArgs; i++) { tmp = tmp->nextOverloadData()[0]; s << " && "; - QString currentArgName = QString("pyargs[%1]").arg(i); - writeTypeCheck(s, tmp, currentArgName); + writeTypeCheck(s, tmp, QString("pyargs[%1]").arg(i)); } } s << ") {" << endl; @@ -816,17 +814,12 @@ void CppGenerator::writeOverloadedMethodDecisor(QTextStream& s, OverloadData* pa if (func->argumentRemoved(i + 1)) removed++; QString argName = QString("cpp_arg%1").arg(i); - if (manyArgs) + if (varargs) pyArgName = QString("pyargs[%1]").arg(i); const AbstractMetaType* type = func->arguments()[i + removed]->type(); s << INDENT << translateTypeForWrapperMethod(type, func->implementingClass()); - if (type->isValue()) { + if (type->isValue()) s << "* "; - if (!implicitConversions(type).isEmpty()) { - QString typeCheck = QString("!%1(%2)").arg(cpythonCheckFunction(type)).arg(pyArgName); - implicitConvTypes.append(ArgTypeCheck(i, typeCheck)); - } - } s << ' ' << argName << " = "; writeToCppConversion(s, type, func->implementingClass(), pyArgName); s << ';' << endl; @@ -838,20 +831,10 @@ void CppGenerator::writeOverloadedMethodDecisor(QTextStream& s, OverloadData* pa { Indentation indent(INDENT); writeOverloadedMethodDecisor(s, overloadData); - - foreach (ArgTypeCheck arg, implicitConvTypes) { - s << INDENT << "if (" << arg.second << ')' << endl; - { - Indentation indent(INDENT); - s << INDENT << "delete cpp_arg" << arg.first << ';' << endl; - } - } - } s << INDENT << "} else "; } - if (maxArgs > 0) s << "goto " << cpythonFunctionName(rfunc) << "_TypeError;" << endl; } |