aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetafunction.cpp11
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetafunction.h1
-rw-r--r--sources/shiboken6/ApiExtractor/typesystemparser.cpp2
-rw-r--r--sources/shiboken6/doc/typesystem_manipulating_objects.rst5
-rw-r--r--sources/shiboken6/generator/shiboken/shibokengenerator.cpp3
5 files changed, 20 insertions, 2 deletions
diff --git a/sources/shiboken6/ApiExtractor/abstractmetafunction.cpp b/sources/shiboken6/ApiExtractor/abstractmetafunction.cpp
index 7ad39edec..ae782f9e9 100644
--- a/sources/shiboken6/ApiExtractor/abstractmetafunction.cpp
+++ b/sources/shiboken6/ApiExtractor/abstractmetafunction.cpp
@@ -285,6 +285,17 @@ bool AbstractMetaFunction::isModifiedRemoved(const AbstractMetaClass *cls) const
return false;
}
+bool AbstractMetaFunction::isModifiedFinal(const AbstractMetaClass *cls) const
+{
+ if (!isInGlobalScope() && cls == nullptr)
+ cls = d->m_implementingClass;
+ for (const auto &mod : modifications(cls)) {
+ if (mod.modifiers().testFlag(FunctionModification::Final))
+ return true;
+ }
+ return false;
+}
+
bool AbstractMetaFunction::isVoid() const
{
return d->m_type.isVoid();
diff --git a/sources/shiboken6/ApiExtractor/abstractmetafunction.h b/sources/shiboken6/ApiExtractor/abstractmetafunction.h
index 0fa15c2bf..73bdb0eb5 100644
--- a/sources/shiboken6/ApiExtractor/abstractmetafunction.h
+++ b/sources/shiboken6/ApiExtractor/abstractmetafunction.h
@@ -239,6 +239,7 @@ public:
QString debugSignature() const; // including virtual/override/final, etc., for debugging only.
bool isModifiedRemoved(const AbstractMetaClass *cls = nullptr) const;
+ bool isModifiedFinal(const AbstractMetaClass *cls = nullptr) const;
bool isVoid() const;
diff --git a/sources/shiboken6/ApiExtractor/typesystemparser.cpp b/sources/shiboken6/ApiExtractor/typesystemparser.cpp
index 17ed97b0d..9bb562cdb 100644
--- a/sources/shiboken6/ApiExtractor/typesystemparser.cpp
+++ b/sources/shiboken6/ApiExtractor/typesystemparser.cpp
@@ -2748,7 +2748,7 @@ bool TypeSystemParser::parseModifyFunction(const ConditionalStreamReader &reader
return false;
}
const FunctionModification::ModifierFlag m = modifierFlagOpt.value();
- if (m == FunctionModification::Final || m == FunctionModification::NonFinal) {
+ if (m == FunctionModification::NonFinal) {
qCWarning(lcShiboken, "%s",
qPrintable(msgUnimplementedAttributeValueWarning(reader,
accessAttribute(), access)));
diff --git a/sources/shiboken6/doc/typesystem_manipulating_objects.rst b/sources/shiboken6/doc/typesystem_manipulating_objects.rst
index 88aa18390..c8d35cf9c 100644
--- a/sources/shiboken6/doc/typesystem_manipulating_objects.rst
+++ b/sources/shiboken6/doc/typesystem_manipulating_objects.rst
@@ -166,6 +166,7 @@ modify-function
access="public | private | protected"
allow-thread="true | auto | false"
exception-handling="off | auto-off | auto-on | on"
+ final="true | false"
overload-number="number"
rename="..."
snake-case="yes | no | both" />
@@ -240,6 +241,10 @@ modify-function
Numbers should be given for all overloads; otherwise, the order will be in
declaration order.
+ The optional ``final`` attribute can be specified for virtual functions
+ and disables generating the code for overriding the function in Python
+ (native call). This is useful when the result type is not constructible.
+
The ``remove`` attribute is an *optional* boolean attribute, which can
mark the function to be discarded on generation.
diff --git a/sources/shiboken6/generator/shiboken/shibokengenerator.cpp b/sources/shiboken6/generator/shiboken/shibokengenerator.cpp
index e768dcc1a..c85c83e05 100644
--- a/sources/shiboken6/generator/shiboken/shibokengenerator.cpp
+++ b/sources/shiboken6/generator/shiboken/shibokengenerator.cpp
@@ -231,7 +231,8 @@ ShibokenGenerator::FunctionGeneration
// Check on virtuals (including operators).
const bool isAbstract = func->isAbstract();
if (!(isAbstract || func->isVirtual())
- || func->attributes().testFlag(AbstractMetaFunction::FinalCppMethod)) {
+ || func->attributes().testFlag(AbstractMetaFunction::FinalCppMethod)
+ || func->isModifiedFinal()) {
return result;
}