diff options
Diffstat (limited to 'sources/shiboken2/generator/shiboken2/cppgenerator.h')
-rw-r--r-- | sources/shiboken2/generator/shiboken2/cppgenerator.h | 115 |
1 files changed, 77 insertions, 38 deletions
diff --git a/sources/shiboken2/generator/shiboken2/cppgenerator.h b/sources/shiboken2/generator/shiboken2/cppgenerator.h index 005518f96..25bb51ef5 100644 --- a/sources/shiboken2/generator/shiboken2/cppgenerator.h +++ b/sources/shiboken2/generator/shiboken2/cppgenerator.h @@ -43,49 +43,61 @@ public: protected: QString fileNameSuffix() const override; - QString fileNameForContext(GeneratorContext &context) const override; + QString fileNameForContext(const GeneratorContext &context) const override; QVector<AbstractMetaFunctionList> filterGroupedOperatorFunctions(const AbstractMetaClass *metaClass, uint query); - void generateClass(QTextStream &s, GeneratorContext &classContext) override; + void generateClass(QTextStream &s, const GeneratorContext &classContext) override; bool finishGeneration() override; private: - void writeConstructorNative(QTextStream &s, const AbstractMetaFunction *func); - void writeDestructorNative(QTextStream &s, const AbstractMetaClass *metaClass); + void writeInitFunc(QTextStream &declStr, QTextStream &callStr, + const Indentor &indent, const QString &initFunctionName, + const TypeEntry *enclosingEntry = nullptr); + void writeCacheResetNative(QTextStream &s, const GeneratorContext &classContext); + void writeConstructorNative(QTextStream &s, const GeneratorContext &classContext, + const AbstractMetaFunction *func); + void writeDestructorNative(QTextStream &s, const GeneratorContext &classContext); QString getVirtualFunctionReturnTypeName(const AbstractMetaFunction *func); - void writeVirtualMethodNative(QTextStream &s, const AbstractMetaFunction *func); - - void writeMetaObjectMethod(QTextStream &s, const AbstractMetaClass *metaClass); - void writeMetaCast(QTextStream &s, const AbstractMetaClass *metaClass); + void writeVirtualMethodNative(QTextStream &s, const AbstractMetaFunction *func, int cacheIndex); + void writeVirtualMethodCppCall(QTextStream &s, const AbstractMetaFunction *func, + const QString &funcName, const CodeSnipList &snips, + const AbstractMetaArgument *lastArg, const TypeEntry *retType, + const QString &returnStatement); + QString virtualMethodReturn(QTextStream &s, + const AbstractMetaFunction *func, + const FunctionModificationList &functionModifications); + void writeMetaObjectMethod(QTextStream &s, const GeneratorContext &classContext); + void writeMetaCast(QTextStream &s, const GeneratorContext &classContext); void writeEnumConverterFunctions(QTextStream &s, const TypeEntry *enumType); void writeEnumConverterFunctions(QTextStream &s, const AbstractMetaEnum *metaEnum); void writeConverterFunctions(QTextStream &s, const AbstractMetaClass *metaClass, - GeneratorContext &classContext); + const GeneratorContext &classContext); void writeCustomConverterFunctions(QTextStream &s, const CustomConversion *customConversion); void writeConverterRegister(QTextStream &s, const AbstractMetaClass *metaClass, - GeneratorContext &classContext); + const GeneratorContext &classContext); void writeCustomConverterRegister(QTextStream &s, const CustomConversion *customConversion, const QString &converterVar); void writeContainerConverterFunctions(QTextStream &s, const AbstractMetaType *containerType); + void writeSmartPointerConverterFunctions(QTextStream &s, const AbstractMetaType *smartPointerType); + void writeMethodWrapperPreamble(QTextStream &s, OverloadData &overloadData, - GeneratorContext &context); + const GeneratorContext &context); void writeConstructorWrapper(QTextStream &s, const AbstractMetaFunctionList &overloads, - GeneratorContext &classContext); + const GeneratorContext &classContext); void writeMethodWrapper(QTextStream &s, const AbstractMetaFunctionList &overloads, - GeneratorContext &classContext); + const GeneratorContext &classContext); void writeArgumentsInitializer(QTextStream &s, OverloadData &overloadData); - void writeCppSelfAssigment(QTextStream &s, const GeneratorContext &context, - const QString &className, bool cppSelfAsReference, - bool useWrapperClass); + void writeCppSelfConversion(QTextStream &s, const GeneratorContext &context, + const QString &className, bool useWrapperClass); void writeCppSelfDefinition(QTextStream &s, const AbstractMetaFunction *func, - GeneratorContext &context, + const GeneratorContext &context, bool hasStaticOverload = false); void writeCppSelfDefinition(QTextStream &s, - GeneratorContext &context, + const GeneratorContext &context, bool hasStaticOverload = false, bool cppSelfAsReference = false); @@ -102,9 +114,17 @@ private: void writeTypeDiscoveryFunction(QTextStream &s, const AbstractMetaClass *metaClass); - void writeSetattroFunction(QTextStream &s, GeneratorContext &context); - void writeGetattroFunction(QTextStream &s, GeneratorContext &context); + void writeSetattroDefinition(QTextStream &s, const AbstractMetaClass *metaClass) const; + void writeSetattroDefaultReturn(QTextStream &s) const; + void writeSmartPointerSetattroFunction(QTextStream &s, const GeneratorContext &context); + void writeSetattroFunction(QTextStream &s, AttroCheck attroCheck, + const GeneratorContext &context); + static void writeGetattroDefinition(QTextStream &s, const AbstractMetaClass *metaClass); + void writeSmartPointerGetattroFunction(QTextStream &s, const GeneratorContext &context); + void writeGetattroFunction(QTextStream &s, AttroCheck attroCheck, + const GeneratorContext &context); QString writeSmartPointerGetterCast(); + QString qObjectGetAttroFunction() const; /** * Writes Python to C++ conversions for arguments on Python wrappers. @@ -173,13 +193,13 @@ private: /// Writes calls to all the possible method/function overloads. void writeFunctionCalls(QTextStream &s, const OverloadData &overloadData, - GeneratorContext &context); + const GeneratorContext &context); /// Writes the call to a single function usually from a collection of overloads. void writeSingleFunctionCall(QTextStream &s, const OverloadData &overloadData, const AbstractMetaFunction *func, - GeneratorContext &context); + const GeneratorContext &context); /// Returns the name of a C++ to Python conversion function. static QString cppToPythonFunctionName(const QString &sourceTypeName, QString targetTypeName = QString()); @@ -227,53 +247,68 @@ private: void writeAddPythonToCppConversion(QTextStream &s, const QString &converterVar, const QString &pythonToCppFunc, const QString &isConvertibleFunc); - void writeNamedArgumentResolution(QTextStream &s, const AbstractMetaFunction *func, bool usePyArgs); + void writeNamedArgumentResolution(QTextStream &s, const AbstractMetaFunction *func, + bool usePyArgs, const OverloadData &overloadData); /// Returns a string containing the name of an argument for the given function and argument index. QString argumentNameFromIndex(const AbstractMetaFunction *func, int argIndex, const AbstractMetaClass **wrappedClass); void writeMethodCall(QTextStream &s, const AbstractMetaFunction *func, - GeneratorContext &context, int maxArgs = 0); + const GeneratorContext &context, int maxArgs = 0); - QString getInitFunctionName(GeneratorContext &context) const; + QString getInitFunctionName(const GeneratorContext &context) const; QString getSimpleClassInitFunctionName(const AbstractMetaClass *metaClass) const; + void writeSignatureStrings(QTextStream &s, QTextStream &signatureStream, + const QString &arrayName, + const char *comment) const; void writeClassRegister(QTextStream &s, const AbstractMetaClass *metaClass, - GeneratorContext &classContext, + const GeneratorContext &classContext, QTextStream &signatureStream); void writeClassDefinition(QTextStream &s, const AbstractMetaClass *metaClass, - GeneratorContext &classContext); + const GeneratorContext &classContext); void writeMethodDefinitionEntry(QTextStream &s, const AbstractMetaFunctionList &overloads); void writeMethodDefinition(QTextStream &s, const AbstractMetaFunctionList &overloads); void writeSignatureInfo(QTextStream &s, const AbstractMetaFunctionList &overloads); /// Writes the implementation of all methods part of python sequence protocol void writeSequenceMethods(QTextStream &s, const AbstractMetaClass *metaClass, - GeneratorContext &context); + const GeneratorContext &context); void writeTypeAsSequenceDefinition(QTextStream &s, const AbstractMetaClass *metaClass); /// 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, - GeneratorContext &context); + const GeneratorContext &context); void writeTypeAsNumberDefinition(QTextStream &s, const AbstractMetaClass *metaClass); void writeTpTraverseFunction(QTextStream &s, const AbstractMetaClass *metaClass); void writeTpClearFunction(QTextStream &s, const AbstractMetaClass *metaClass); - void writeCopyFunction(QTextStream &s, GeneratorContext &context); + void writeCopyFunction(QTextStream &s, const GeneratorContext &context); void writeGetterFunction(QTextStream &s, const AbstractMetaField *metaField, - GeneratorContext &context); + const GeneratorContext &context); + void writeGetterFunction(QTextStream &s, + const QPropertySpec *property, + const GeneratorContext &context); + void writeSetterFunctionPreamble(QTextStream &s, + const QString &name, + const QString &funcName, + const AbstractMetaType *type, + const GeneratorContext &context); void writeSetterFunction(QTextStream &s, const AbstractMetaField *metaField, - GeneratorContext &context); + const GeneratorContext &context); + void writeSetterFunction(QTextStream &s, + const QPropertySpec *property, + const GeneratorContext &context); - void writeRichCompareFunction(QTextStream &s, GeneratorContext &context); + void writeRichCompareFunction(QTextStream &s, const GeneratorContext &context); void writeEnumsInitialization(QTextStream &s, AbstractMetaEnumList &enums); void writeEnumInitialization(QTextStream &s, const AbstractMetaEnum *metaEnum); @@ -284,6 +319,7 @@ private: void writeFlagsToLong(QTextStream &s, const AbstractMetaEnum *cppEnum); void writeFlagsNonZero(QTextStream &s, const AbstractMetaEnum *cppEnum); void writeFlagsNumberMethodsDefinition(QTextStream &s, const AbstractMetaEnum *cppEnum); + void writeFlagsNumberMethodsDefinitions(QTextStream &s, const AbstractMetaEnumList &enums); void writeFlagsBinaryOperator(QTextStream &s, const AbstractMetaEnum *cppEnum, const QString &pyOpName, const QString &cppOpName); void writeFlagsUnaryOperator(QTextStream &s, const AbstractMetaEnum *cppEnum, @@ -299,12 +335,13 @@ private: void writeEnumConverterInitialization(QTextStream &s, const TypeEntry *enumType); void writeEnumConverterInitialization(QTextStream &s, const AbstractMetaEnum *metaEnum); void writeContainerConverterInitialization(QTextStream &s, const AbstractMetaType *type); + void writeSmartPointerConverterInitialization(QTextStream &s, const AbstractMetaType *type); void writeExtendedConverterInitialization(QTextStream &s, const TypeEntry *externalType, const QVector<const AbstractMetaClass *>& conversions); void writeParentChildManagement(QTextStream &s, const AbstractMetaFunction *func, bool userHeuristicForReturn); bool writeParentChildManagement(QTextStream &s, const AbstractMetaFunction *func, int argIndex, bool userHeuristicPolicy); - void writeReturnValueHeuristics(QTextStream &s, const AbstractMetaFunction *func, const QString &self = QLatin1String("self")); - void writeInitQtMetaTypeFunctionBody(QTextStream &s, GeneratorContext &context) const; + void writeReturnValueHeuristics(QTextStream &s, const AbstractMetaFunction *func); + void writeInitQtMetaTypeFunctionBody(QTextStream &s, const GeneratorContext &context) const; /** * Returns the multiple inheritance initializer function for the given class. @@ -329,19 +366,21 @@ private: /// Returns true if generator should produce getters and setters for the given class. bool shouldGenerateGetSetList(const AbstractMetaClass *metaClass); - void writeHashFunction(QTextStream &s, GeneratorContext &context); + void writeHashFunction(QTextStream &s, const GeneratorContext &context); /// Write default implementations for sequence protocol - void writeStdListWrapperMethods(QTextStream &s, GeneratorContext &context); + void writeDefaultSequenceMethods(QTextStream &s, const GeneratorContext &context); /// Helper function for writeStdListWrapperMethods. void writeIndexError(QTextStream &s, const QString &errorMsg); - QString writeReprFunction(QTextStream &s, GeneratorContext &context, uint indirections); + QString writeReprFunction(QTextStream &s, const GeneratorContext &context, uint indirections); const AbstractMetaFunction *boolCast(const AbstractMetaClass *metaClass) const; bool hasBoolCast(const AbstractMetaClass *metaClass) const { return boolCast(metaClass) != nullptr; } + const AbstractMetaType *findSmartPointerInstantiation(const TypeEntry *entry) const; + // Number protocol structure members names. static QHash<QString, QString> m_nbFuncs; |