aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2022-04-04 13:19:00 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2022-04-06 12:02:07 +0200
commitc78b22d7ab5c147d1d4867e76bf524c31618eccd (patch)
tree8d8b396bdf6a89482a2e53f1a3707cccd4bb900a
parente1d596e15ad7bcf8801631d7281a88b98dfebcae (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.cpp85
-rw-r--r--sources/shiboken6/generator/shiboken/cppgenerator.h21
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