aboutsummaryrefslogtreecommitdiffstats
path: root/sources/shiboken6
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2024-04-05 11:19:07 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2024-04-09 17:36:41 +0200
commitab4488b000198e35ef8ea91f4b6b915d140435cb (patch)
treea241d6cf18b44320c2813a8c6aeea5c00d08ada3 /sources/shiboken6
parent80fac314f15b202b20ff439c278500c35c44e0ae (diff)
shiboken6: Refactor function virtualMethodReturn()
Remove the TextStream parameter and throw an exception instead of generating an #error if something goes wrong. Task-number: PYSIDE-2602 Change-Id: I56cb0c9b45a4161ce04df273836d77948338c521 Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Diffstat (limited to 'sources/shiboken6')
-rw-r--r--sources/shiboken6/generator/shiboken/cppgenerator.cpp67
-rw-r--r--sources/shiboken6/generator/shiboken/cppgenerator.h16
2 files changed, 53 insertions, 30 deletions
diff --git a/sources/shiboken6/generator/shiboken/cppgenerator.cpp b/sources/shiboken6/generator/shiboken/cppgenerator.cpp
index 46f83436e..1972b0dfb 100644
--- a/sources/shiboken6/generator/shiboken/cppgenerator.cpp
+++ b/sources/shiboken6/generator/shiboken/cppgenerator.cpp
@@ -58,6 +58,8 @@ using namespace Qt::StringLiterals;
static const char shibokenErrorsOccurred[] = "Shiboken::Errors::occurred() != nullptr";
+static constexpr auto virtualMethodStaticReturnVar = "result"_L1;
+
static QString mangleName(QString name)
{
if (name == u"None" || name == u"False" || name == u"True" || name == u"from")
@@ -968,12 +970,19 @@ void CppGenerator::writeVirtualMethodCppCall(TextStream &s,
}
// Determine the return statement (void or a result value).
-QString CppGenerator::virtualMethodReturn(TextStream &s, const ApiExtractorResult &api,
- const AbstractMetaFunctionCPtr &func,
- const FunctionModificationList &functionModifications)
+
+CppGenerator::VirtualMethodReturn
+ CppGenerator::virtualMethodReturn(const ApiExtractorResult &api,
+ const AbstractMetaFunctionCPtr &func,
+ const FunctionModificationList &functionModifications)
{
- if (func->isVoid())
- return u"return;"_s;
+ VirtualMethodReturn result;
+ if (func->isVoid()) {
+ result.statement = "return;"_L1;
+ return result;
+ }
+
+ result.statement = "return "_L1;
const AbstractMetaType &returnType = func->type();
for (const FunctionModification &mod : functionModifications) {
for (const ArgumentModification &argMod : mod.argument_mods()) {
@@ -994,8 +1003,8 @@ QString CppGenerator::virtualMethodReturn(TextStream &s, const ApiExtractorResul
offset = match.capturedStart(1);
}
DefaultValue defaultReturnExpr(DefaultValue::Custom, expr);
- return u"return "_s + defaultReturnExpr.returnValue()
- + u';';
+ result.statement += defaultReturnExpr.returnValue() + u';';
+ return result;
}
}
}
@@ -1007,16 +1016,13 @@ QString CppGenerator::virtualMethodReturn(TextStream &s, const ApiExtractorResul
errorMsg = msgCouldNotFindMinimalConstructor(errorMsg,
func->type().cppSignature(),
errorMessage);
- qCWarning(lcShiboken).noquote().nospace() << errorMsg;
- s << "\n#error " << errorMsg << '\n';
- }
- if (returnType.referenceType() == LValueReference) {
- s << "static " << returnType.typeEntry()->qualifiedCppName()
- << " result;\n";
- return u"return result;"_s;
+ throw Exception(errorMsg);
}
- return u"return "_s + defaultReturnExpr->returnValue()
- + u';';
+
+ result.needsReference = returnType.referenceType() == LValueReference;
+ result.statement += (result.needsReference
+ ? virtualMethodStaticReturnVar : defaultReturnExpr->returnValue()) + u';';
+ return result;
}
// Create an argument for Py_BuildValue() when writing virtual methods.
@@ -1117,6 +1123,12 @@ static const char noArgsCallCondition[] =
static const char inverseNoArgsCallCondition[] =
"#if defined(PYPY_VERSION) || (defined(Py_LIMITED_API) && Py_LIMITED_API < 0x030A0000)\n";
+static inline void writeVirtualMethodStaticReturnVar(TextStream &s, const AbstractMetaFunctionCPtr &func)
+{
+ s << "static " << func->type().typeEntry()->qualifiedCppName() << ' '
+ << virtualMethodStaticReturnVar << ";\n";
+}
+
void CppGenerator::writeVirtualMethodNative(TextStream &s,
const AbstractMetaFunctionCPtr &func,
int cacheIndex) const
@@ -1130,13 +1142,16 @@ void CppGenerator::writeVirtualMethodNative(TextStream &s,
Generator::OriginalTypeDescription)
<< "\n{\n" << indent;
- const QString returnStatement = virtualMethodReturn(s, api(), func,
- func->modifications());
+ const auto returnStatement = virtualMethodReturn(api(), func,
+ func->modifications());
+
+ if (returnStatement.needsReference)
+ writeVirtualMethodStaticReturnVar(s, func);
const bool isAbstract = func->isAbstract();
if (isAbstract && func->isModifiedRemoved()) {
qCWarning(lcShiboken, "%s", qPrintable(msgPureVirtualFunctionRemoved(func.get())));
- s << returnStatement << '\n' << outdent << "}\n\n";
+ s << returnStatement.statement << '\n' << outdent << "}\n\n";
return;
}
@@ -1165,7 +1180,7 @@ void CppGenerator::writeVirtualMethodNative(TextStream &s,
s << "if (m_PyMethodCache[" << cacheIndex << "])" << (multi_line ? " {\n" : "\n")
<< indent;
writeVirtualMethodCppCall(s, func, funcName, snips, lastArg, retType,
- returnStatement, false);
+ returnStatement.statement, false);
s << outdent;
if (multi_line)
s << "}\n";
@@ -1174,7 +1189,7 @@ void CppGenerator::writeVirtualMethodNative(TextStream &s,
// Get out of virtual method call if someone already threw an error.
s << "if (" << shibokenErrorsOccurred << ")\n" << indent
- << returnStatement << '\n' << outdent;
+ << returnStatement.statement << '\n' << outdent;
// PYSIDE-1019: Add info about properties
int propFlag = 0;
@@ -1198,7 +1213,7 @@ void CppGenerator::writeVirtualMethodNative(TextStream &s,
if (useOverrideCaching(func->ownerClass()))
s << "m_PyMethodCache[" << cacheIndex << "] = true;\n";
writeVirtualMethodCppCall(s, func, funcName, snips, lastArg, retType,
- returnStatement, true);
+ returnStatement.statement, true);
s << outdent << "}\n\n"; //WS
writeVirtualMethodPythonOverride(s, func, snips, returnStatement);
@@ -1207,7 +1222,7 @@ void CppGenerator::writeVirtualMethodNative(TextStream &s,
void CppGenerator::writeVirtualMethodPythonOverride(TextStream &s,
const AbstractMetaFunctionCPtr &func,
const CodeSnipList &snips,
- const QString &returnStatement) const
+ const VirtualMethodReturn &returnStatement) const
{
writeConversionRule(s, func, TypeSystem::TargetLangCode, false);
@@ -1303,7 +1318,7 @@ void CppGenerator::writeVirtualMethodPythonOverride(TextStream &s,
s << "if (" << PYTHON_RETURN_VAR << ".isNull()) {\n" << indent
<< "// An error happened in python code!\n"
<< "Shiboken::Errors::storeErrorOrPrint();\n"
- << returnStatement << "\n" << outdent
+ << returnStatement.statement << "\n" << outdent
<< "}\n";
if (invalidateReturn) {
@@ -1330,7 +1345,7 @@ void CppGenerator::writeVirtualMethodPythonOverride(TextStream &s,
<< func->ownerClass()->name() << "\", funcName, "
<< getVirtualFunctionReturnTypeName(func) << ", "
<< "Py_TYPE(" << PYTHON_RETURN_VAR << ")->tp_name);\n"
- << returnStatement << '\n' << outdent
+ << returnStatement.statement << '\n' << outdent
<< "}\n";
} else {
@@ -1352,7 +1367,7 @@ void CppGenerator::writeVirtualMethodPythonOverride(TextStream &s,
<< func->ownerClass()->name() << "\", funcName, "
<< getVirtualFunctionReturnTypeName(func) << ", "
<< "Py_TYPE(" << PYTHON_RETURN_VAR << ")->tp_name);\n"
- << returnStatement << '\n' << outdent
+ << returnStatement.statement << '\n' << outdent
<< "}\n";
}
diff --git a/sources/shiboken6/generator/shiboken/cppgenerator.h b/sources/shiboken6/generator/shiboken/cppgenerator.h
index f69a57249..4c2493094 100644
--- a/sources/shiboken6/generator/shiboken/cppgenerator.h
+++ b/sources/shiboken6/generator/shiboken/cppgenerator.h
@@ -49,6 +49,13 @@ protected:
bool finishGeneration() override;
private:
+ struct VirtualMethodReturn
+ {
+ QString statement;
+ bool needsReference = false;
+ };
+
+
void generateSmartPointerClass(TextStream &s, const GeneratorContext &classContext);
void generateIncludes(TextStream &s, const GeneratorContext &classContext,
const IncludeGroupList &includes = {},
@@ -79,14 +86,15 @@ private:
void writeVirtualMethodPythonOverride(TextStream &s,
const AbstractMetaFunctionCPtr &func,
const CodeSnipList &snips,
- const QString &returnStatement) const;
+ const VirtualMethodReturn &returnStatement) const;
void writeVirtualMethodCppCall(TextStream &s, const AbstractMetaFunctionCPtr &func,
const QString &funcName, const QList<CodeSnip> &snips,
const AbstractMetaArgument *lastArg, const TypeEntryCPtr &retType,
const QString &returnStatement, bool hasGil) const;
- static QString virtualMethodReturn(TextStream &s, const ApiExtractorResult &api,
- const AbstractMetaFunctionCPtr &func,
- const FunctionModificationList &functionModifications);
+
+ static VirtualMethodReturn virtualMethodReturn(const ApiExtractorResult &api,
+ const AbstractMetaFunctionCPtr &func,
+ const FunctionModificationList &functionModifications);
void writeMetaObjectMethod(TextStream &s, const GeneratorContext &classContext) const;
static void writeMetaCast(TextStream &s, const GeneratorContext &classContext);