aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2021-10-13 15:52:37 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-10-14 17:59:01 +0000
commit9121b09ab00ae2bcc5a40cd138eb262fbac3fa00 (patch)
treea5c7a0a28ba9ec17043485588c4d7a5829341777
parent706fc86ac231208894ff7e2e8b26bfe596f55a45 (diff)
Add an option to disable implicit conversions
Add option and extract a helper to return the list of implicit conversions depending on it. [ChangeLog][shiboken6] An option to disable implicit conversions has been added. Task-number: PYSIDE-1669 Change-Id: Iaefbbf272a6c033bac10635f48057dd69fc83549 Reviewed-by: Christian Tismer <tismer@stackless.com> (cherry picked from commit 78d929b957bfe200806602e1e1dfedd7e044cb20) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--sources/shiboken6/doc/shibokengenerator.rst5
-rw-r--r--sources/shiboken6/generator/shiboken/cppgenerator.cpp27
-rw-r--r--sources/shiboken6/generator/shiboken/shibokengenerator.cpp29
-rw-r--r--sources/shiboken6/generator/shiboken/shibokengenerator.h7
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 0a237ed8d..bc1f79e52 100644
--- a/sources/shiboken6/generator/shiboken/cppgenerator.cpp
+++ b/sources/shiboken6/generator/shiboken/cppgenerator.cpp
@@ -1550,17 +1550,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";
@@ -1630,7 +1622,7 @@ return result;)";
writePythonToCppConversionFunctions(s, sourceType, targetType, typeCheck, toCppConv, toCppPreConv);
}
- writeCustomConverterFunctions(s, customConversion);
+ writeCustomConverterFunctions(s, typeEntry->customConversion());
}
void CppGenerator::writeCustomConverterFunctions(TextStream &s,
@@ -1737,17 +1729,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";
@@ -1770,7 +1755,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 07c41b1c5..f3e7c1f6d 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));
@@ -2383,6 +2401,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")}
});
@@ -2405,6 +2425,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;
@@ -2515,6 +2539,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 35374b843..645d09121 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);
@@ -314,6 +317,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());
@@ -475,6 +480,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.