Skip to content

Commit

Permalink
Implemented new type converters, but only for wrapper types.
Browse files Browse the repository at this point in the history
  • Loading branch information
Marcelo Lira committed Dec 9, 2011
1 parent 443e74d commit a3f655e
Show file tree
Hide file tree
Showing 15 changed files with 1,728 additions and 348 deletions.
847 changes: 670 additions & 177 deletions generator/cppgenerator.cpp

Large diffs are not rendered by default.

53 changes: 49 additions & 4 deletions generator/cppgenerator.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,11 @@ class CppGenerator : public ShibokenGenerator
void writeMetaObjectMethod(QTextStream& s, const AbstractMetaClass* metaClass);
void writeMetaCast(QTextStream& s, const AbstractMetaClass* metaClass);

void writeConverterFunctions(QTextStream& s, const AbstractMetaClass* metaClass);
void writeCustomConverterFunctions(QTextStream& s, const CustomConversion* customConversion);
void writeConverterRegister(QTextStream& s, const AbstractMetaClass* metaClass);
void writeCustomConverterRegister(QTextStream& s, const CustomConversion* customConversion, const QString& converterVar);

void writeMethodWrapperPreamble(QTextStream& s, OverloadData& overloadData);
void writeConstructorWrapper(QTextStream& s, const AbstractMetaFunctionList overloads);
void writeDestructorWrapper(QTextStream& s, const AbstractMetaClass* metaClass);
Expand Down Expand Up @@ -141,7 +146,49 @@ class CppGenerator : public ShibokenGenerator
void writeFunctionCalls(QTextStream& s, const OverloadData& overloadData);

/// Writes the call to a single function usually from a collection of overloads.
void writeSingleFunctionCall(QTextStream& s, const OverloadData& overloadData, const AbstractMetaFunction* func = 0);
void writeSingleFunctionCall(QTextStream& s, const OverloadData& overloadData, const AbstractMetaFunction* func);

/// Returns the name of a C++ to Python conversion function.
static QString cppToPythonFunctionName(const QString& sourceTypeName, QString targetTypeName = QString());

/// Returns the name of a Python to C++ conversion function.
static QString pythonToCppFunctionName(const QString& sourceTypeName, const QString& targetTypeName);
static QString pythonToCppFunctionName(const AbstractMetaType* sourceType, const AbstractMetaType* targetType);
static QString pythonToCppFunctionName(const CustomConversion::TargetToNativeConversion* toNative, const TypeEntry* targetType);

/// Returns the name of a Python to C++ convertible check function.
static QString convertibleToCppFunctionName(const QString& sourceTypeName, const QString& targetTypeName);
static QString convertibleToCppFunctionName(const AbstractMetaType* sourceType, const AbstractMetaType* targetType);
static QString convertibleToCppFunctionName(const CustomConversion::TargetToNativeConversion* toNative, const TypeEntry* targetType);

/// Writes a C++ to Python conversion function.
void writeCppToPythonFunction(QTextStream& s, const QString& code, const QString& sourceTypeName, QString targetTypeName = QString());
void writeCppToPythonFunction(QTextStream& s, const CustomConversion* customConversion);

/// Writes a Python to C++ conversion function.
void writePythonToCppFunction(QTextStream& s, const QString& code, const QString& sourceTypeName, const QString& targetTypeName);

/// Writes a Python to C++ convertible check function.
void writeIsPythonConvertibleToCppFunction(QTextStream& s,
const QString& sourceTypeName,
const QString& targetTypeName,
const QString& condition,
QString pythonToCppFuncName = QString(),
bool acceptNoneAsCppNull = false);

/// Writes a pair of Python to C++ conversion and check functions.
void writePythonToCppConversionFunctions(QTextStream& s,
const AbstractMetaType* sourceType,
const AbstractMetaType* targetType,
QString typeCheck = QString(),
QString conversion = QString());
/// Writes a pair of Python to C++ conversion and check functions for implicit conversions.
void writePythonToCppConversionFunctions(QTextStream& s,
const CustomConversion::TargetToNativeConversion* toNative,
const TypeEntry* targetType);

void writeAddPythonToCppConversion(QTextStream& s, const QString& converterVar, const QString& pythonToCppFunc, const QString& isConvertibleFunc);

void writeNamedArgumentResolution(QTextStream& s, const AbstractMetaFunction* func, bool usePyArgs);

/// Returns a string containing the name of an argument for the given function and argument index.
Expand All @@ -157,7 +204,7 @@ class CppGenerator : public ShibokenGenerator
void writeSequenceMethods(QTextStream& s, const AbstractMetaClass* metaClass);
void writeTypeAsSequenceDefinition(QTextStream& s, const AbstractMetaClass* metaClass);

/// Writes the struct PyMappingMethods for types thats supports the python mapping protocol
/// Writes the PyMappingMethods structure for types that supports the python mapping protocol.
void writeTypeAsMappingDefinition(QTextStream& s, const AbstractMetaClass* metaClass);
void writeMappingMethods(QTextStream& s, const AbstractMetaClass* metaClass);

Expand Down Expand Up @@ -193,8 +240,6 @@ class CppGenerator : public ShibokenGenerator
/// Writes the implementation of special cast functions, used when we need to cast a class with multiple inheritance.
void writeSpecialCastFunction(QTextStream& s, const AbstractMetaClass* metaClass);

void writeExtendedIsConvertibleFunction(QTextStream& s, const TypeEntry* externalType, const QList<const AbstractMetaClass*>& conversions);
void writeExtendedToCppFunction(QTextStream& s, const TypeEntry* externalType, const QList<const AbstractMetaClass*>& conversions);
void writeExtendedConverterInitialization(QTextStream& s, const TypeEntry* externalType, const QList<const AbstractMetaClass*>& conversions);

void writeParentChildManagement(QTextStream& s, const AbstractMetaFunction* func, bool userHeuristicForReturn);
Expand Down
83 changes: 11 additions & 72 deletions generator/headergenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -564,82 +564,22 @@ void HeaderGenerator::writeTypeConverterImpl(QTextStream& s, const TypeEntry* ty
const QString typeName = "::" + type->qualifiedCppName();

// Write Converter<T>::isConvertible
s << "inline bool Shiboken::Converter< " << typeName << " >::isConvertible(PyObject* pyobj)" << endl;
s << "inline bool Shiboken::Converter< " << typeName << " >::isConvertible(PyObject* pyIn)" << endl;
s << '{' << endl;

if (type->isValue()) {
s << INDENT << "if (ValueTypeConverter< " << typeName << " >::isConvertible(pyobj))" << endl;
Indentation indent(INDENT);
s << INDENT << "return true;" << endl;
}


s << INDENT << "SbkObjectType* shiboType = reinterpret_cast<SbkObjectType*>(SbkType< ";
s << typeName << " >());" << endl;
s << INDENT << "return ";
bool isFirst = true;
foreach (const AbstractMetaFunction* ctor, implicitConvs) {
Indentation indent(INDENT);
if (isFirst)
isFirst = false;
else
s << endl << INDENT << " || ";
if (ctor->isConversionOperator())
s << cpythonCheckFunction(ctor->ownerClass()->typeEntry());
else
s << cpythonCheckFunction(ctor->arguments().first()->type());
s << "(pyobj)";
}
s << endl;
{
Indentation indent(INDENT);
s << INDENT << " || (ObjectType::isExternalConvertible(shiboType, pyobj));" << endl;
}
s << INDENT << "return (bool)Shiboken::Conversions::isPythonToCppValueConvertible((SbkObjectType*)";
s << cpythonTypeNameExt(type) << ", pyIn);" << endl;
s << '}' << endl << endl;

// Write Converter<T>::toCpp function
s << "inline " << typeName << " Shiboken::Converter< " << typeName << " >::toCpp(PyObject* pyobj)" << endl;
s << "inline " << typeName << " Shiboken::Converter< " << typeName << " >::toCpp(PyObject* pyIn)" << endl;
s << '{' << endl;

s << INDENT << "if (PyObject_TypeCheck(pyobj, SbkType< " << typeName << " >()))" << endl;
{
Indentation indent(INDENT);
s << INDENT << "return *" << cpythonWrapperCPtr(type, "pyobj") << ';' << endl;
}

foreach (const AbstractMetaFunction* ctor, implicitConvs) {
if (ctor->isModifiedRemoved())
continue;

s << INDENT << "else ";

QString typeCheck;
QString toCppConv;
QTextStream tcc(&toCppConv);
if (ctor->isConversionOperator()) {
const AbstractMetaClass* metaClass = ctor->ownerClass();
typeCheck = cpythonCheckFunction(metaClass->typeEntry());
writeToCppConversion(tcc, metaClass, "pyobj");
} else {
const AbstractMetaType* argType = ctor->arguments().first()->type();
typeCheck = cpythonCheckFunction(argType);
writeToCppConversion(tcc, argType, 0, "pyobj");
}

s << "if (" << typeCheck << "(pyobj))" << endl;
{
Indentation indent(INDENT);
s << INDENT << "return " << type->name() << '(' << toCppConv << ");" << endl;
}
}

{
s << INDENT << "else" << endl;
{
Indentation indent(INDENT);
s << INDENT << "return Shiboken::ValueTypeConverter< " << typeName << " >::toCpp(pyobj);" << endl;
}
}
s << INDENT << "PythonToCppFunc toCpp = Shiboken::Conversions::isPythonToCppValueConvertible((SbkObjectType*)";
s << cpythonTypeNameExt(type) << ", pyIn);" << endl;
s << INDENT << typeName << " cppOut = ";
writeMinimalConstructorExpression(s, type);
s << ';' << endl;
s << INDENT << "toCpp(pyIn, &cppOut);" << endl;
s << INDENT << "return cppOut;" << endl;
s << '}' << endl << endl;
}

Expand All @@ -666,4 +606,3 @@ void HeaderGenerator::writeInheritedOverloads(QTextStream& s)
s << "; }" << endl;
}
}

Loading

0 comments on commit a3f655e

Please sign in to comment.