diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-06-23 14:19:42 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-06-27 15:19:44 +0200 |
commit | 105814f28760fb58f11e067d21edc28c0b92e235 (patch) | |
tree | 234e401c73bc49898b22613113739be2664eff7a /sources | |
parent | 71d97ff54ba2ea225d4fb215b3dbbf7feeab489a (diff) |
shiboken6: Fix mapping of arguments when writing virtual methods
When generating the code for virtual methods, removed argument
were not properly taken into account. Add a mapping method for
this to AbstractMetaFunction.
Change-Id: I6caf6bd676256affa7c9b85b36bec74a1c642be2
Reviewed-by: Shyamnath Premnadh <Shyamnath.Premnadh@qt.io>
Reviewed-by: Christian Tismer <tismer@stackless.com>
Diffstat (limited to 'sources')
5 files changed, 38 insertions, 9 deletions
diff --git a/sources/shiboken6/ApiExtractor/abstractmetafunction.cpp b/sources/shiboken6/ApiExtractor/abstractmetafunction.cpp index 981dff929..0d51893c1 100644 --- a/sources/shiboken6/ApiExtractor/abstractmetafunction.cpp +++ b/sources/shiboken6/ApiExtractor/abstractmetafunction.cpp @@ -555,6 +555,18 @@ int AbstractMetaFunction::actualMinimumArgumentCount() const return count; } +int AbstractMetaFunction::actualArgumentIndex(int index) const +{ + if (index < 0 || index >= int(d->m_arguments.size())) + throw Exception(msgArgumentIndexOutOfRange(this, index)); + int result = 0; + for (int i = 0; i < index; ++i) { + if (!d->m_arguments.at(i).isModifiedRemoved()) + ++result; + } + return result; +} + // Returns reference counts for argument at idx, or all arguments if idx == -2 QList<ReferenceCount> AbstractMetaFunction::referenceCounts(const AbstractMetaClass *cls, int idx) const { diff --git a/sources/shiboken6/ApiExtractor/abstractmetafunction.h b/sources/shiboken6/ApiExtractor/abstractmetafunction.h index de85ba409..052528c64 100644 --- a/sources/shiboken6/ApiExtractor/abstractmetafunction.h +++ b/sources/shiboken6/ApiExtractor/abstractmetafunction.h @@ -263,6 +263,8 @@ public: void setArguments(const AbstractMetaArgumentList &arguments); void addArgument(const AbstractMetaArgument &argument); int actualMinimumArgumentCount() const; + // Return the argument index accounting for the isModifiedRemoved arguments [0..n-1] + int actualArgumentIndex(int index) const; bool isDeprecated() const; bool isDestructor() const { return functionType() == DestructorFunction; } diff --git a/sources/shiboken6/ApiExtractor/messages.cpp b/sources/shiboken6/ApiExtractor/messages.cpp index c923a2ad9..e91aef5cc 100644 --- a/sources/shiboken6/ApiExtractor/messages.cpp +++ b/sources/shiboken6/ApiExtractor/messages.cpp @@ -58,6 +58,14 @@ QString msgNoFunctionForModification(const AbstractMetaClass *klass, return result; } +QString msgArgumentIndexOutOfRange(const AbstractMetaFunction *func, int index) +{ + QString result; + QTextStream str(&result); + str <<"Index " << index << " out of range for " << func->classQualifiedSignature() << '.'; + return result; +} + QString msgTypeModificationFailed(const QString &type, int n, const AbstractMetaFunction *func, const QString &why) diff --git a/sources/shiboken6/ApiExtractor/messages.h b/sources/shiboken6/ApiExtractor/messages.h index e4ab18b05..4a23c6487 100644 --- a/sources/shiboken6/ApiExtractor/messages.h +++ b/sources/shiboken6/ApiExtractor/messages.h @@ -36,6 +36,8 @@ QString msgUnnamedArgumentDefaultExpression(const AbstractMetaClass *context, int n, const QString &className, const AbstractMetaFunction *f); +QString msgArgumentIndexOutOfRange(const AbstractMetaFunction *func, int index); + QString msgNoFunctionForModification(const AbstractMetaClass *klass, const QString &signature, const QString &originalSignature, diff --git a/sources/shiboken6/generator/shiboken/cppgenerator.cpp b/sources/shiboken6/generator/shiboken/cppgenerator.cpp index 672b3d50c..04bd8b4f9 100644 --- a/sources/shiboken6/generator/shiboken/cppgenerator.cpp +++ b/sources/shiboken6/generator/shiboken/cppgenerator.cpp @@ -1285,21 +1285,26 @@ void CppGenerator::writeVirtualMethodNative(TextStream &s, } bool invalidateReturn = false; - QSet<int> invalidateArgs; + QList<int> invalidateArgs; for (const FunctionModification &funcMod : func->modifications()) { for (const ArgumentModification &argMod : funcMod.argument_mods()) { const int index = argMod.index(); - if (argMod.resetAfterUse() && !invalidateArgs.contains(index)) { - invalidateArgs.insert(index); - s << "bool invalidateArg" << index - << " = PyTuple_GET_ITEM(" << PYTHON_ARGS << ", " - << index - 1 << ")->ob_refcnt == 1;\n"; - } else if (index == 0 && - argMod.targetOwnerShip() == TypeSystem::CppOwnership) { - invalidateReturn = true; + if (index == 0) { + if (argMod.targetOwnerShip() == TypeSystem::CppOwnership) + invalidateReturn = true; + } else { + const int actualIndex = func->actualArgumentIndex(index - 1) + 1; + if (argMod.resetAfterUse() && !invalidateArgs.contains(actualIndex)) { + invalidateArgs.append(actualIndex); + s << "bool invalidateArg" << actualIndex + << " = PyTuple_GET_ITEM(" << PYTHON_ARGS << ", " + << actualIndex - 1 << ")->ob_refcnt == 1;\n"; + } } } } + std::sort(invalidateArgs.begin(), invalidateArgs.end()); + s << '\n'; if (!snips.isEmpty()) { |