diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2024-04-05 11:19:07 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2024-04-09 17:36:41 +0200 |
commit | ab4488b000198e35ef8ea91f4b6b915d140435cb (patch) | |
tree | a241d6cf18b44320c2813a8c6aeea5c00d08ada3 /sources/shiboken6/generator | |
parent | 80fac314f15b202b20ff439c278500c35c44e0ae (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/generator')
-rw-r--r-- | sources/shiboken6/generator/shiboken/cppgenerator.cpp | 67 | ||||
-rw-r--r-- | sources/shiboken6/generator/shiboken/cppgenerator.h | 16 |
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); |