aboutsummaryrefslogtreecommitdiffstats
path: root/sources
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2022-06-23 14:19:42 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2022-06-27 15:19:44 +0200
commit105814f28760fb58f11e067d21edc28c0b92e235 (patch)
tree234e401c73bc49898b22613113739be2664eff7a /sources
parent71d97ff54ba2ea225d4fb215b3dbbf7feeab489a (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')
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetafunction.cpp12
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetafunction.h2
-rw-r--r--sources/shiboken6/ApiExtractor/messages.cpp8
-rw-r--r--sources/shiboken6/ApiExtractor/messages.h2
-rw-r--r--sources/shiboken6/generator/shiboken/cppgenerator.cpp23
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()) {