diff options
-rw-r--r-- | cppgenerator.cpp | 20 | ||||
-rw-r--r-- | headergenerator.cpp | 31 | ||||
-rw-r--r-- | libshiboken/conversions.h | 53 | ||||
-rw-r--r-- | shibokengenerator.cpp | 23 | ||||
-rw-r--r-- | shibokengenerator.h | 4 |
5 files changed, 55 insertions, 76 deletions
diff --git a/cppgenerator.cpp b/cppgenerator.cpp index 4bf739d81..115e1c144 100644 --- a/cppgenerator.cpp +++ b/cppgenerator.cpp @@ -691,19 +691,13 @@ 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 (!implicitConvs.isEmpty()) s << '('; - s << cpythonIsConvertibleFunction(argType, numberType) << '(' << argumentName << ')'; + s << cpythonCheckFunction(argType, numberType) << '(' << argumentName << ')'; - foreach (const AbstractMetaFunction* ctor, implicitConvs) { - s << " || "; - s << cpythonIsConvertibleFunction(ctor->arguments().first()->type(), numberType); - s << '(' << argumentName << ')'; - } - - if (implicitConvs.size() > 0) - s << ')'; + if (!implicitConvs.isEmpty()) + s << " || " << cpythonIsConvertibleFunction(argType) << ')'; } void CppGenerator::writeOverloadedMethodDecisor(QTextStream& s, OverloadData* parentOverloadData) @@ -1557,7 +1551,7 @@ void CppGenerator::writeFlagsBinaryOperator(QTextStream& s, const AbstractMetaEn Q_ASSERT(flagsEntry); QString cppName = cppEnum->typeEntry()->name(); QString cpythonName = cpythonEnumName(cppEnum); - QString checkFunction = cpythonIsConvertibleFunction(cppEnum->typeEntry()); + QString checkFunction = cpythonCheckFunction(cppEnum->typeEntry()); s << "PyObject*" << endl; s << cpythonName << "___" << pyOpName << "__(PyObject* self, PyObject* arg)" << endl; @@ -1598,7 +1592,7 @@ void CppGenerator::writeFlagsInplaceOperator(QTextStream& s, const AbstractMetaE Q_ASSERT(flagsEntry); QString cppName = cppEnum->typeEntry()->name(); QString cpythonName = cpythonEnumName(cppEnum); - QString checkFunction = cpythonIsConvertibleFunction(cppEnum->typeEntry()); + QString checkFunction = cpythonCheckFunction(cppEnum->typeEntry()); s << "PyObject*" << endl; s << cpythonName << "___" << pyOpName << "__(PyObject* self, PyObject* arg)" << endl; @@ -1638,7 +1632,7 @@ void CppGenerator::writeFlagsUnaryOperator(QTextStream& s, const AbstractMetaEnu Q_ASSERT(flagsEntry); QString cppName = cppEnum->typeEntry()->name(); QString cpythonName = cpythonEnumName(cppEnum); - QString checkFunction = cpythonIsConvertibleFunction(cppEnum->typeEntry()); + QString checkFunction = cpythonCheckFunction(cppEnum->typeEntry()); s << "PyObject*" << endl; s << cpythonName << "___" << pyOpName << "__(PyObject* self, PyObject* arg)" << endl; diff --git a/headergenerator.cpp b/headergenerator.cpp index dcdfa948c..bd671012e 100644 --- a/headergenerator.cpp +++ b/headergenerator.cpp @@ -188,9 +188,10 @@ void HeaderGenerator::writeTypeConverterDecl(QTextStream& s, const TypeEntry* ty s << "template<>" << endl; s << "struct Converter< " << cppName << " >" << endl << '{' << endl; - s << INDENT << "static bool isConvertible(const PyObject* pyObj);\n"; - s << INDENT << "static PyObject* toPython(const " << cppName << " cppobj);\n"; - s << INDENT << "static " << cppName << " toCpp(PyObject* pyobj);\n"; + if (implicitConversions(type).size() > 0) + s << INDENT << "static bool isConvertible(PyObject* pyObj);" << endl; + s << INDENT << "static PyObject* toPython(const " << cppName << " cppobj);" << endl; + s << INDENT << "static " << cppName << " toCpp(PyObject* pyobj);" << endl; s << "};" << endl; } @@ -204,10 +205,24 @@ void HeaderGenerator::writeTypeConverterImpl(QTextStream& s, const TypeEntry* ty cppName.append('*'); // write isConvertible function - s << "inline bool Converter<" << cppName << " >::isConvertible(const PyObject* pyObj)\n"; - s << "{\n"; - s << INDENT << "return PyObject_TypeCheck(pyObj, &" << pyTypeName << ");\n"; - s << "}\n"; + AbstractMetaFunctionList implicitConvs = implicitConversions(type); + if (implicitConvs.size() > 0) { + s << "inline bool Converter<" << cppName << " >::isConvertible(PyObject* pyObj)" << endl; + s << '{' << endl; + s << INDENT << "return "; + bool isFirst = true; + foreach (const AbstractMetaFunction* ctor, implicitConvs) { + Indentation indent(INDENT); + if (isFirst) + isFirst = false; + else + s << endl << INDENT << " || "; + s << cpythonCheckFunction(ctor->arguments().first()->type()); + s << "(pyObj)"; + } + s << ';' << endl; + s << '}' << endl; + } // write toPython function s << "inline PyObject* Converter<" << cppName << " >::toPython(const " << cppName << " cppobj)\n"; @@ -269,7 +284,7 @@ void HeaderGenerator::writeTypeConverterImpl(QTextStream& s, const TypeEntry* ty firstImplicitIf = false; else s << "else "; - s << "if (" << cpythonIsConvertibleFunction(argType) << "(pyobj))" << endl; + s << "if (" << cpythonCheckFunction(argType) << "(pyobj))" << endl; { Indentation indent(INDENT); s << INDENT << "return " << cppName << '('; diff --git a/libshiboken/conversions.h b/libshiboken/conversions.h index 6c24780c1..260c184a2 100644 --- a/libshiboken/conversions.h +++ b/libshiboken/conversions.h @@ -45,8 +45,11 @@ namespace Shiboken template <typename T> struct Converter { - static bool isConvertible(const PyObject* pyObj); - static PyObject* toPython(const T cppObj); + static bool isConvertible(PyObject* pyObj) + { + return false; + } + static PyObject* toPython(T cppObj); static T toCpp(PyObject* pyObj); }; @@ -54,10 +57,6 @@ struct Converter template <> struct Converter<void*> { - static bool isConvertible(const PyObject* pyObj) - { - return pyObj != 0; - } static PyObject* toPython(void* cppobj) { PyObject* obj = BindingManager::instance().retrieveWrapper(cppobj); @@ -74,11 +73,11 @@ struct Converter<void*> template <> struct Converter<bool> { - static bool isConvertible(const PyObject* pyObj) + static bool isConvertible(PyObject* pyObj) { - return PyBool_Check(pyObj); + return PyInt_Check(pyObj); } - static PyObject* toPython(const bool cppObj) + static PyObject* toPython(bool cppObj) { return PyBool_FromLong(cppObj); } @@ -91,11 +90,7 @@ struct Converter<bool> template <typename PyIntEquiv> struct Converter_PyInt { - static bool isConvertible(const PyObject* pyObj) - { - return PyInt_Check(pyObj); - } - static PyObject* toPython(const PyIntEquiv cppObj) + static PyObject* toPython(PyIntEquiv cppObj) { return PyInt_FromLong((long) cppObj); } @@ -118,11 +113,7 @@ template <> struct Converter<long> : Converter_PyInt<long> {}; template <> struct Converter<unsigned long> { - static bool isConvertible(const PyObject* pyObj) - { - return PyLong_Check(pyObj); - } - static PyObject* toPython(const unsigned long holder) + static PyObject* toPython(unsigned long holder) { return PyLong_FromUnsignedLong(holder); } @@ -135,11 +126,7 @@ struct Converter<unsigned long> template <> struct Converter<PY_LONG_LONG> { - static bool isConvertible(const PyObject* pyObj) - { - return PyLong_Check(pyObj); - } - static PyObject* toPython(const PY_LONG_LONG holder) + static PyObject* toPython(PY_LONG_LONG holder) { return PyLong_FromLongLong(holder); } @@ -152,11 +139,7 @@ struct Converter<PY_LONG_LONG> template <> struct Converter<unsigned PY_LONG_LONG> { - static bool isConvertible(const PyObject* pyObj) - { - return PyLong_Check(pyObj); - } - static PyObject* toPython(const unsigned PY_LONG_LONG holder) + static PyObject* toPython(unsigned PY_LONG_LONG holder) { return PyLong_FromUnsignedLongLong(holder); } @@ -169,11 +152,7 @@ struct Converter<unsigned PY_LONG_LONG> template <typename PyFloatEquiv> struct Converter_PyFloat { - static bool isConvertible(const PyObject* pyObj) - { - return PyFloat_Check(pyObj); - } - static PyObject* toPython(const PyFloatEquiv holder) + static PyObject* toPython(PyFloatEquiv holder) { return PyFloat_FromDouble((double) holder); } @@ -193,11 +172,7 @@ template <> struct Converter<double> : Converter_PyFloat<double> {}; template <typename CString> struct Converter_CString { - static bool isConvertible(const PyObject* pyObj) - { - return PyString_Check(pyObj); - } - static PyObject* toPython(const CString holder) + static PyObject* toPython(CString holder) { return PyString_FromString(holder); } diff --git a/shibokengenerator.cpp b/shibokengenerator.cpp index 121ded578..c322f8f6e 100644 --- a/shibokengenerator.cpp +++ b/shibokengenerator.cpp @@ -503,11 +503,8 @@ QString ShibokenGenerator::cpythonCheckFunction(const TypeEntry* type, bool gene return checkFunctionName(cpythonBaseName(type), genericNumberType); } -QString ShibokenGenerator::cpythonIsConvertibleFunction(const AbstractMetaType* metaType, bool genericNumberType) +QString ShibokenGenerator::cpythonIsConvertibleFunction(const AbstractMetaType* metaType) { - if (genericNumberType && ShibokenGenerator::isNumber(cpythonBaseName(metaType))) - return "PyNumber_Check"; - QString baseName; QTextStream s(&baseName); writeBaseConversion(s, metaType, 0); @@ -516,13 +513,6 @@ QString ShibokenGenerator::cpythonIsConvertibleFunction(const AbstractMetaType* return baseName; } -QString ShibokenGenerator::cpythonIsConvertibleFunction(const TypeEntry* type, bool genericNumberType) -{ - if (genericNumberType && ShibokenGenerator::isNumber(cpythonBaseName(type))) - return "PyNumber_Check"; - return "Converter<" + type->qualifiedCppName() + " >::isConvertible"; -} - QString ShibokenGenerator::argumentString(const AbstractMetaFunction *func, const AbstractMetaArgument *argument, Options options) const @@ -896,17 +886,22 @@ QStringList ShibokenGenerator::getBaseClasses(const AbstractMetaClass* metaClass return baseClass; } -AbstractMetaFunctionList ShibokenGenerator::implicitConversions(const AbstractMetaType* metaType) const +AbstractMetaFunctionList ShibokenGenerator::implicitConversions(const TypeEntry* type) const { AbstractMetaFunctionList implicits; - if (metaType->isValue()) { - const AbstractMetaClass* metaClass = classes().findClass(metaType->name()); + if (type->isValue()) { + const AbstractMetaClass* metaClass = classes().findClass(type->name()); if (metaClass) implicits = metaClass->implicitConversions(); } return implicits; } +AbstractMetaFunctionList ShibokenGenerator::implicitConversions(const AbstractMetaType* metaType) const +{ + return implicitConversions(metaType->typeEntry()); +} + static void dumpFunction(AbstractMetaFunctionList lst) { qDebug() << "DUMP FUNCTIONS: "; diff --git a/shibokengenerator.h b/shibokengenerator.h index 8463628e9..cbea8d933 100644 --- a/shibokengenerator.h +++ b/shibokengenerator.h @@ -152,8 +152,7 @@ public: QString cpythonTypeName(const TypeEntry* type); QString cpythonCheckFunction(const TypeEntry* type, bool genericNumberType = false); QString cpythonCheckFunction(const AbstractMetaType* metaType, bool genericNumberType = false); - QString cpythonIsConvertibleFunction(const TypeEntry* type, bool genericNumberType = false); - QString cpythonIsConvertibleFunction(const AbstractMetaType* metaType, bool genericNumberType = false); + QString cpythonIsConvertibleFunction(const AbstractMetaType* metaType); QString cpythonFunctionName(const AbstractMetaFunction* func); QString cpythonWrapperCPtr(const AbstractMetaClass* metaClass, QString argName = "self"); @@ -176,6 +175,7 @@ public: QString getFormatUnitString(const AbstractMetaFunction* func) const; AbstractMetaFunctionList implicitConversions(const AbstractMetaType* metaType) const; + AbstractMetaFunctionList implicitConversions(const TypeEntry* type) const; bool doSetup(const QMap<QString, QString>& args); |