diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-04-04 13:19:00 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-04-06 12:02:07 +0200 |
commit | c78b22d7ab5c147d1d4867e76bf524c31618eccd (patch) | |
tree | 8d8b396bdf6a89482a2e53f1a3707cccd4bb900a | |
parent | e1d596e15ad7bcf8801631d7281a88b98dfebcae (diff) |
shiboken6: Refactor CppGenerator::writeCppSelfDefinition()
Introduce flags for the boolean parameters and extract helper
functions for writing smart pointer cppSelf.
Task-number: PYSIDE-454
Change-Id: I792fc5dcad67468bf639e807aa24b36e1c9f58eb
Reviewed-by: Christian Tismer <tismer@stackless.com>
(cherry picked from commit 545e90b4c434c7380a61113ec377ba56007eb0dc)
Reviewed-by: Shyamnath Premnadh <Shyamnath.Premnadh@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
-rw-r--r-- | sources/shiboken6/generator/shiboken/cppgenerator.cpp | 85 | ||||
-rw-r--r-- | sources/shiboken6/generator/shiboken/cppgenerator.h | 21 |
2 files changed, 73 insertions, 33 deletions
diff --git a/sources/shiboken6/generator/shiboken/cppgenerator.cpp b/sources/shiboken6/generator/shiboken/cppgenerator.cpp index 37a3ce388..9f145d9d0 100644 --- a/sources/shiboken6/generator/shiboken/cppgenerator.cpp +++ b/sources/shiboken6/generator/shiboken/cppgenerator.cpp @@ -1891,8 +1891,12 @@ void CppGenerator::writeMethodWrapperPreamble(TextStream &s,const OverloadData & } else { if (rfunc->implementingClass() && (!rfunc->implementingClass()->isNamespace() && overloadData.hasInstanceFunction())) { - writeCppSelfDefinition(s, rfunc, context, overloadData.hasStaticFunction(), - overloadData.hasClassMethod()); + CppSelfDefinitionFlags flags; + if (overloadData.hasStaticFunction()) + flags.setFlag(CppSelfDefinitionFlag::HasStaticOverload); + if (overloadData.hasClassMethod()) + flags.setFlag(CppSelfDefinitionFlag::HasClassMethodOverload); + writeCppSelfDefinition(s, rfunc, context, flags); } if (!rfunc->isInplaceOperator() && overloadData.hasNonVoidReturnType()) s << "PyObject *" << PYTHON_RETURN_VAR << "{};\n"; @@ -2286,24 +2290,55 @@ void CppGenerator::writeArgumentsInitializer(TextStream &s, const OverloadData & void CppGenerator::writeCppSelfConversion(TextStream &s, const GeneratorContext &context, const QString &className, bool useWrapperClass) { + if (context.forSmartPointer()) { + writeSmartPointerCppSelfConversion(s, context); + return; + } + static const QString pythonSelfVar = QLatin1String("self"); if (useWrapperClass) s << "static_cast<" << className << " *>("; - if (!context.forSmartPointer()) - s << cpythonWrapperCPtr(context.metaClass(), pythonSelfVar); - else - s << cpythonWrapperCPtr(context.preciseType(), pythonSelfVar); + s << cpythonWrapperCPtr(context.metaClass(), pythonSelfVar); if (useWrapperClass) s << ')'; } +void CppGenerator::writeSmartPointerCppSelfConversion(TextStream &s, + const GeneratorContext &context) +{ + Q_ASSERT(context.forSmartPointer()); + s << cpythonWrapperCPtr(context.preciseType(), u"self"_qs); +} + +static inline void writeCppSelfVarDef(TextStream &s, + CppGenerator::CppSelfDefinitionFlags flags = {}) +{ + if (flags.testFlag(CppGenerator::CppSelfAsReference)) + s << "auto &" << CPP_SELF_VAR << " = *"; + else + s << "auto *" << CPP_SELF_VAR << " = "; +} + +void CppGenerator::writeSmartPointerCppSelfDefinition(TextStream &s, + const GeneratorContext &context, + CppSelfDefinitionFlags flags) +{ + Q_ASSERT(context.forSmartPointer()); + writeInvalidPyObjectCheck(s, u"self"_qs); + writeCppSelfVarDef(s, flags); + writeSmartPointerCppSelfConversion(s, context); + s << ";\n"; +} + void CppGenerator::writeCppSelfDefinition(TextStream &s, const GeneratorContext &context, - bool hasStaticOverload, - bool hasClassMethodOverload, - bool cppSelfAsReference) const + CppSelfDefinitionFlags flags) const { - Q_ASSERT(!(cppSelfAsReference && hasStaticOverload)); + Q_ASSERT(!(flags.testFlag(CppSelfAsReference) && flags.testFlag(HasStaticOverload))); + if (context.forSmartPointer()) { + writeSmartPointerCppSelfDefinition(s, context, flags); + return; + } const AbstractMetaClass *metaClass = context.metaClass(); const auto cppWrapper = context.metaClass()->cppWrapper(); @@ -2312,28 +2347,23 @@ void CppGenerator::writeCppSelfDefinition(TextStream &s, const bool useWrapperClass = avoidProtectedHack() && cppWrapper.testFlag(AbstractMetaClass::CppProtectedHackWrapper); Q_ASSERT(!useWrapperClass || context.useWrapper()); - QString className; - if (!context.forSmartPointer()) { - className = useWrapperClass - ? context.wrapperName() - : (QLatin1String("::") + metaClass->qualifiedCppName()); - } else { - className = context.smartPointerWrapperName(); - } + const QString className = useWrapperClass + ? context.wrapperName() + : (QLatin1String("::") + metaClass->qualifiedCppName()); writeInvalidPyObjectCheck(s, QLatin1String("self")); - if (cppSelfAsReference) { - s << "auto &" << CPP_SELF_VAR << " = *"; + if (flags.testFlag(CppSelfAsReference)) { + writeCppSelfVarDef(s, flags); writeCppSelfConversion(s, context, className, useWrapperClass); s << ";\n"; return; } - if (!hasStaticOverload) { - if (!hasClassMethodOverload) { + if (!flags.testFlag(HasStaticOverload)) { + if (!flags.testFlag(HasClassMethodOverload)) { // PYSIDE-131: The single case of a class method for now: tr(). - s << "auto " << CPP_SELF_VAR << " = "; + writeCppSelfVarDef(s, flags); writeCppSelfConversion(s, context, className, useWrapperClass); s << ";\n"; writeUnusedVariableCast(s, QLatin1String(CPP_SELF_VAR)); @@ -2357,8 +2387,7 @@ void CppGenerator::writeCppSelfDefinition(TextStream &s, void CppGenerator::writeCppSelfDefinition(TextStream &s, const AbstractMetaFunctionCPtr &func, const GeneratorContext &context, - bool hasStaticOverload, - bool hasClassMethodOverload) const + CppSelfDefinitionFlags flags) const { if (!func->ownerClass() || func->isConstructor()) return; @@ -2375,7 +2404,7 @@ void CppGenerator::writeCppSelfDefinition(TextStream &s, s << "std::swap(self, " << PYTHON_ARG << ");\n"; } - writeCppSelfDefinition(s, context, hasStaticOverload, hasClassMethodOverload); + writeCppSelfDefinition(s, context, flags); } void CppGenerator::writeErrorSection(TextStream &s, const OverloadData &overloadData) @@ -4740,7 +4769,7 @@ void CppGenerator::writeCopyFunction(TextStream &s, const GeneratorContext &cont const QString className = chopType(cpythonTypeName(metaClass)); s << "static PyObject *" << className << "___copy__(PyObject *self)\n" << "{\n" << indent; - writeCppSelfDefinition(s, context, false, false, true); + writeCppSelfDefinition(s, context, CppSelfDefinitionFlag::CppSelfAsReference); QString conversionCode; if (!context.forSmartPointer()) conversionCode = cpythonToPythonConversionFunction(metaClass); @@ -4961,7 +4990,7 @@ void CppGenerator::writeRichCompareFunction(TextStream &s, s << "static PyObject * "; s << baseName << "_richcompare(PyObject *self, PyObject *" << PYTHON_ARG << ", int op)\n{\n" << indent; - writeCppSelfDefinition(s, context, false, false, true); + writeCppSelfDefinition(s, context, CppSelfDefinitionFlag::CppSelfAsReference); writeUnusedVariableCast(s, QLatin1String(CPP_SELF_VAR)); s << "PyObject *" << PYTHON_RETURN_VAR << "{};\n" << PYTHON_TO_CPPCONVERSION_STRUCT << ' ' << PYTHON_TO_CPP_VAR << ";\n"; diff --git a/sources/shiboken6/generator/shiboken/cppgenerator.h b/sources/shiboken6/generator/shiboken/cppgenerator.h index 4952ee841..10b08da8c 100644 --- a/sources/shiboken6/generator/shiboken/cppgenerator.h +++ b/sources/shiboken6/generator/shiboken/cppgenerator.h @@ -44,6 +44,13 @@ class OverloadDataRootNode; class CppGenerator : public ShibokenGenerator { public: + enum CppSelfDefinitionFlag { + HasStaticOverload = 0x1, + HasClassMethodOverload = 0x2, + CppSelfAsReference = 0x4 + }; + Q_DECLARE_FLAGS(CppSelfDefinitionFlags, CppSelfDefinitionFlag) + CppGenerator(); const char *name() const override { return "Source generator"; } @@ -128,16 +135,18 @@ private: const GeneratorContext &context, const QString &className, bool useWrapperClass); + static void writeSmartPointerCppSelfConversion(TextStream &s, + const GeneratorContext &context); + static void writeSmartPointerCppSelfDefinition(TextStream &s, + const GeneratorContext &, + CppSelfDefinitionFlags flags = {}); void writeCppSelfDefinition(TextStream &s, const AbstractMetaFunctionCPtr &func, const GeneratorContext &context, - bool hasStaticOverload = false, - bool hasClassMethodOverload = false) const; + CppSelfDefinitionFlags flags = {}) const; void writeCppSelfDefinition(TextStream &s, const GeneratorContext &context, - bool hasStaticOverload = false, - bool hasClassMethodOverload = false, - bool cppSelfAsReference = false) const; + CppSelfDefinitionFlags flags = {}) const; static void writeErrorSection(TextStream &s, const OverloadData &overloadData) ; static void writeFunctionReturnErrorCheckSection(TextStream &s, bool hasReturnValue = true); @@ -498,4 +507,6 @@ private: }; }; +Q_DECLARE_OPERATORS_FOR_FLAGS(CppGenerator::CppSelfDefinitionFlags) + #endif // CPPGENERATOR_H |