aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cppgenerator.cpp20
-rw-r--r--headergenerator.cpp31
-rw-r--r--libshiboken/conversions.h53
-rw-r--r--shibokengenerator.cpp23
-rw-r--r--shibokengenerator.h4
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);