diff options
4 files changed, 47 insertions, 21 deletions
diff --git a/sources/shiboken6/doc/shibokengenerator.rst b/sources/shiboken6/doc/shibokengenerator.rst index ddc2c64a1..d42827c0e 100644 --- a/sources/shiboken6/doc/shibokengenerator.rst +++ b/sources/shiboken6/doc/shibokengenerator.rst @@ -124,6 +124,11 @@ Options If a class has an operator bool, it will be used to compute the value of boolean casts (see :ref:`bool-cast`). +.. _no-implicit-conversions: + +``--no-implicit-conversions`` + Do not generate implicit_conversions for function arguments. + .. _api-version: ``--api-version=<version>`` diff --git a/sources/shiboken6/generator/shiboken/cppgenerator.cpp b/sources/shiboken6/generator/shiboken/cppgenerator.cpp index a479ba8fa..b7d826d3d 100644 --- a/sources/shiboken6/generator/shiboken/cppgenerator.cpp +++ b/sources/shiboken6/generator/shiboken/cppgenerator.cpp @@ -1548,17 +1548,9 @@ return result;)"; s << '\n'; // User provided implicit conversions. - CustomConversion *customConversion = metaClass->typeEntry()->customConversion(); - + auto *typeEntry = metaClass->typeEntry(); // Implicit conversions. - AbstractMetaFunctionCList implicitConvs; - if (!customConversion || !customConversion->replaceOriginalTargetToNativeConversions()) { - const auto &allImplicitConvs = api().implicitConversions(metaClass->typeEntry()); - for (const auto &func : allImplicitConvs) { - if (!func->isUserAdded()) - implicitConvs << func; - } - } + const AbstractMetaFunctionCList implicitConvs = implicitConversions(typeEntry); if (!implicitConvs.isEmpty()) s << "// Implicit conversions.\n"; @@ -1624,7 +1616,7 @@ return result;)"; writePythonToCppConversionFunctions(s, sourceType, targetType, typeCheck, toCppConv, toCppPreConv); } - writeCustomConverterFunctions(s, customConversion); + writeCustomConverterFunctions(s, typeEntry->customConversion()); } void CppGenerator::writeCustomConverterFunctions(TextStream &s, @@ -1730,17 +1722,10 @@ void CppGenerator::writeConverterRegister(TextStream &s, const AbstractMetaClass writeAddPythonToCppConversion(s, QLatin1String("converter"), toCpp, isConv); // User provided implicit conversions. - CustomConversion *customConversion = metaClass->typeEntry()->customConversion(); + auto *typeEntry = metaClass->typeEntry(); // Add implicit conversions. - AbstractMetaFunctionCList implicitConvs; - if (!customConversion || !customConversion->replaceOriginalTargetToNativeConversions()) { - const auto &allImplicitConvs = api().implicitConversions(metaClass->typeEntry()); - for (const auto &func : allImplicitConvs) { - if (!func->isUserAdded()) - implicitConvs << func; - } - } + const AbstractMetaFunctionCList implicitConvs = implicitConversions(typeEntry); if (!implicitConvs.isEmpty()) s << "// Add implicit conversions to type converter.\n"; @@ -1764,7 +1749,7 @@ void CppGenerator::writeConverterRegister(TextStream &s, const AbstractMetaClass writeAddPythonToCppConversion(s, QLatin1String("converter"), toCpp, isConv); } - writeCustomConverterRegister(s, customConversion, QLatin1String("converter")); + writeCustomConverterRegister(s, typeEntry->customConversion(), u"converter"_qs); } void CppGenerator::writeCustomConverterRegister(TextStream &s, const CustomConversion *customConversion, diff --git a/sources/shiboken6/generator/shiboken/shibokengenerator.cpp b/sources/shiboken6/generator/shiboken/shibokengenerator.cpp index 2e4284a59..92a3d07fe 100644 --- a/sources/shiboken6/generator/shiboken/shibokengenerator.cpp +++ b/sources/shiboken6/generator/shiboken/shibokengenerator.cpp @@ -60,6 +60,7 @@ static const char DISABLE_VERBOSE_ERROR_MESSAGES[] = "disable-verbose-error-mess static const char USE_ISNULL_AS_NB_NONZERO[] = "use-isnull-as-nb_nonzero"; static const char USE_OPERATOR_BOOL_AS_NB_NONZERO[] = "use-operator-bool-as-nb_nonzero"; static const char WRAPPER_DIAGNOSTICS[] = "wrapper-diagnostics"; +static const char NO_IMPLICIT_CONVERSIONS[] = "no-implicit-conversions"; const char *CPP_ARG = "cppArg"; const char *CPP_ARG_REMOVED = "removed_cppArg"; @@ -241,6 +242,23 @@ bool ShibokenGenerator::shouldWriteVirtualMethodNative(const AbstractMetaFunctio && !func->attributes().testFlag(AbstractMetaFunction::FinalCppMethod)); } +AbstractMetaFunctionCList ShibokenGenerator::implicitConversions(const TypeEntry *t) const +{ + if (!generateImplicitConversions()) + return {}; + auto *customConversion = t->customConversion(); + if (customConversion && customConversion->replaceOriginalTargetToNativeConversions()) + return {}; + + auto result = api().implicitConversions(t); + auto end = std::remove_if(result.begin(), result.end(), + [](const AbstractMetaFunctionCPtr &f) { + return f->isUserAdded(); + }); + result.erase(end, result.end()); + return result; +} + QString ShibokenGenerator::wrapperName(const AbstractMetaClass *metaClass) const { Q_ASSERT(shouldGenerateCppWrapper(metaClass)); @@ -2322,6 +2340,8 @@ Generator::OptionDescriptions ShibokenGenerator::options() const {QLatin1String(USE_OPERATOR_BOOL_AS_NB_NONZERO), QLatin1String("If a class has an operator bool, it will be used to compute\n" "the value of boolean casts")}, + {QLatin1String(NO_IMPLICIT_CONVERSIONS), + u"Do not generate implicit_conversions for function arguments."_qs}, {QLatin1String(WRAPPER_DIAGNOSTICS), QLatin1String("Generate diagnostic code around wrappers")} }); @@ -2344,6 +2364,10 @@ bool ShibokenGenerator::handleOption(const QString &key, const QString &value) return (m_useOperatorBoolAsNbNonZero = true); if (key == QLatin1String(AVOID_PROTECTED_HACK)) return (m_avoidProtectedHack = true); + if (key == QLatin1String(NO_IMPLICIT_CONVERSIONS)) { + return m_generateImplicitConversions = false; + return true; + } if (key == QLatin1String(WRAPPER_DIAGNOSTICS)) return (m_wrapperDiagnostics = true); return false; @@ -2454,6 +2478,11 @@ bool ShibokenGenerator::avoidProtectedHack() const return m_avoidProtectedHack; } +bool ShibokenGenerator::generateImplicitConversions() const +{ + return m_generateImplicitConversions; +} + QString ShibokenGenerator::moduleCppPrefix(const QString &moduleName) { QString result = moduleName.isEmpty() ? packageName() : moduleName; diff --git a/sources/shiboken6/generator/shiboken/shibokengenerator.h b/sources/shiboken6/generator/shiboken/shibokengenerator.h index 80a01e34f..7e8d0b290 100644 --- a/sources/shiboken6/generator/shiboken/shibokengenerator.h +++ b/sources/shiboken6/generator/shiboken/shibokengenerator.h @@ -195,6 +195,9 @@ protected: /// Condition to call WriteVirtualMethodNative. Was extracted because also used to count these calls. bool shouldWriteVirtualMethodNative(const AbstractMetaFunctionCPtr &func) const; + // Return a list of implicit conversions if generation is enabled. + AbstractMetaFunctionCList implicitConversions(const TypeEntry *t) const; + QString wrapperName(const AbstractMetaClass *metaClass) const; static QString fullPythonClassName(const AbstractMetaClass *metaClass); @@ -298,6 +301,8 @@ protected: bool useOperatorBoolAsNbNonZero() const; /// Returns true if the generated code should use the "#define protected public" hack. bool avoidProtectedHack() const; + /// Generate implicit conversions of function arguments + bool generateImplicitConversions() const; static QString cppApiVariableName(const QString &moduleName = QString()); static QString pythonModuleObjectName(const QString &moduleName = QString()); static QString convertersVariableName(const QString &moduleName = QString()); @@ -459,6 +464,8 @@ private: bool m_useIsNullAsNbNonZero = false; bool m_useOperatorBoolAsNbNonZero = false; bool m_avoidProtectedHack = false; + // FIXME PYSIDE 7 Flip generateImplicitConversions default or remove? + bool m_generateImplicitConversions = true; bool m_wrapperDiagnostics = false; /// Type system converter variable replacement names and regular expressions. |