aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp12
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetalang.cpp29
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetalang.h12
-rw-r--r--sources/shiboken2/ApiExtractor/tests/testaddfunction.cpp2
-rw-r--r--sources/shiboken2/ApiExtractor/typesystem.cpp13
-rw-r--r--sources/shiboken2/ApiExtractor/typesystem.h2
-rw-r--r--sources/shiboken2/ApiExtractor/typesystem_p.h1
7 files changed, 48 insertions, 23 deletions
diff --git a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp
index 8373889d4..6e95e79e7 100644
--- a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp
+++ b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp
@@ -1596,17 +1596,7 @@ AbstractMetaFunction* AbstractMetaBuilderPrivate::traverseFunction(const AddedFu
AbstractMetaFunction* AbstractMetaBuilderPrivate::traverseFunction(const AddedFunctionPtr &addedFunc,
AbstractMetaClass *metaClass)
{
- AbstractMetaFunction *metaFunction = new AbstractMetaFunction;
- metaFunction->setConstant(addedFunc->isConstant());
- metaFunction->setName(addedFunc->name());
- metaFunction->setOriginalName(addedFunc->name());
- AbstractMetaClass::Attributes visibility =
- addedFunc->access() == AddedFunction::Public
- ? AbstractMetaAttributes::Public : AbstractMetaAttributes::Protected;
- metaFunction->setVisibility(visibility);
- metaFunction->setUserAdded(true);
- AbstractMetaAttributes::Attribute isStatic = addedFunc->isStatic() ? AbstractMetaFunction::Static : AbstractMetaFunction::None;
- metaFunction->setAttributes(metaFunction->attributes() | AbstractMetaAttributes::FinalInTargetLang | isStatic);
+ AbstractMetaFunction *metaFunction = new AbstractMetaFunction(addedFunc);
metaFunction->setType(translateType(addedFunc->returnType()));
diff --git a/sources/shiboken2/ApiExtractor/abstractmetalang.cpp b/sources/shiboken2/ApiExtractor/abstractmetalang.cpp
index 00d2ffb89..512efef58 100644
--- a/sources/shiboken2/ApiExtractor/abstractmetalang.cpp
+++ b/sources/shiboken2/ApiExtractor/abstractmetalang.cpp
@@ -452,10 +452,32 @@ QDebug operator<<(QDebug d, const AbstractMetaArgument *aa)
* AbstractMetaFunction
*/
+AbstractMetaFunction::AbstractMetaFunction(const AddedFunctionPtr &addedFunc) :
+ AbstractMetaFunction()
+{
+ m_addedFunction = addedFunc;
+ setConstant(addedFunc->isConstant());
+ setName(addedFunc->name());
+ setOriginalName(addedFunc->name());
+ auto atts = attributes() | AbstractMetaAttributes::FinalInTargetLang;
+ switch (addedFunc->access()) {
+ case AddedFunction::InvalidAccess:
+ break;
+ case AddedFunction::Protected:
+ atts |= AbstractMetaAttributes::Protected;
+ break;
+ case AddedFunction::Public:
+ atts |= AbstractMetaAttributes::Public;
+ break;
+ }
+ if (addedFunc->isStatic())
+ atts |= AbstractMetaFunction::Static;
+ setAttributes(atts);
+}
+
AbstractMetaFunction::AbstractMetaFunction()
: m_constant(false),
m_reverse(false),
- m_userAdded(false),
m_explicit(false),
m_pointerOperator(false),
m_isCallOperator(false)
@@ -579,6 +601,7 @@ AbstractMetaFunction *AbstractMetaFunction::copy() const
cpy->setExceptionSpecification(m_exceptionSpecification);
cpy->setAllowThreadModification(m_allowThreadModification);
cpy->setExceptionHandlingModification(m_exceptionHandlingModification);
+ cpy->m_addedFunction = m_addedFunction;
for (AbstractMetaArgument *arg : m_arguments)
cpy->addArgument(arg->copy());
@@ -942,6 +965,8 @@ QString AbstractMetaFunction::debugSignature() const
FunctionModificationList AbstractMetaFunction::modifications(const AbstractMetaClass* implementor) const
{
+ if (!m_addedFunction.isNull())
+ return m_addedFunction->modifications;
if (!implementor)
implementor = ownerClass();
@@ -1279,7 +1304,7 @@ void AbstractMetaFunction::formatDebugVerbose(QDebug &d) const
d << " [const]";
if (m_reverse)
d << " [reverse]";
- if (m_userAdded)
+ if (isUserAdded())
d << " [userAdded]";
if (m_explicit)
d << " [explicit]";
diff --git a/sources/shiboken2/ApiExtractor/abstractmetalang.h b/sources/shiboken2/ApiExtractor/abstractmetalang.h
index 4dbae94d2..ef4cef2b4 100644
--- a/sources/shiboken2/ApiExtractor/abstractmetalang.h
+++ b/sources/shiboken2/ApiExtractor/abstractmetalang.h
@@ -783,6 +783,7 @@ public:
Q_FLAG(CompareResultFlag)
AbstractMetaFunction();
+ explicit AbstractMetaFunction(const AddedFunctionPtr &addedFunc);
~AbstractMetaFunction();
QString name() const
@@ -1003,14 +1004,7 @@ public:
}
/// Returns true if the AbstractMetaFunction was added by the user via the type system description.
- bool isUserAdded() const
- {
- return m_userAdded;
- }
- void setUserAdded(bool userAdded)
- {
- m_userAdded = userAdded;
- }
+ bool isUserAdded() const { return !m_addedFunction.isNull(); }
QString toString() const
{
@@ -1118,9 +1112,9 @@ private:
const AbstractMetaClass *m_declaringClass = nullptr;
QPropertySpec *m_propertySpec = nullptr;
AbstractMetaArgumentList m_arguments;
+ AddedFunctionPtr m_addedFunction;
uint m_constant : 1;
uint m_reverse : 1;
- uint m_userAdded : 1;
uint m_explicit : 1;
uint m_pointerOperator : 1;
uint m_isCallOperator : 1;
diff --git a/sources/shiboken2/ApiExtractor/tests/testaddfunction.cpp b/sources/shiboken2/ApiExtractor/tests/testaddfunction.cpp
index db49942c9..53b9467b1 100644
--- a/sources/shiboken2/ApiExtractor/tests/testaddfunction.cpp
+++ b/sources/shiboken2/ApiExtractor/tests/testaddfunction.cpp
@@ -265,7 +265,7 @@ void TestAddFunction::testAddFunctionAtModuleLevel()
QCOMPARE(addedFuncs.size(), 1);
- FunctionModificationList mods = typeDb->functionModifications(QLatin1String("func(int,int)"));
+ const FunctionModificationList mods = addedFuncs.constFirst()->modifications;
QCOMPARE(mods.size(), 1);
QVERIFY(mods.first().isCodeInjection());
diff --git a/sources/shiboken2/ApiExtractor/typesystem.cpp b/sources/shiboken2/ApiExtractor/typesystem.cpp
index e35c997d0..079be5377 100644
--- a/sources/shiboken2/ApiExtractor/typesystem.cpp
+++ b/sources/shiboken2/ApiExtractor/typesystem.cpp
@@ -674,6 +674,17 @@ bool Handler::endElement(const QStringRef &localName)
}
}
break;
+ case StackElement::AddFunction: {
+ // Leaving add-function: Assign all modifications to the added function
+ StackElementContext *top = m_contextStack.top();
+ const int modIndex = top->addedFunctionModificationIndex;
+ top->addedFunctionModificationIndex = -1;
+ Q_ASSERT(modIndex >= 0);
+ Q_ASSERT(!top->addedFunctions.isEmpty());
+ while (modIndex < top->functionMods.size())
+ top->addedFunctions.last()->modifications.append(top->functionMods.takeAt(modIndex));
+ }
+ break;
case StackElement::NativeToTarget:
case StackElement::AddConversion: {
CustomConversion* customConversion = static_cast<TypeEntry*>(m_current->entry)->customConversion();
@@ -2025,6 +2036,8 @@ bool Handler::parseAddFunction(const QXmlStreamReader &,
}
m_contextStack.top()->addedFunctions << func;
+ m_contextStack.top()->addedFunctionModificationIndex =
+ m_contextStack.top()->functionMods.size();
FunctionModification mod;
if (!mod.setSignature(m_currentSignature, &m_error))
diff --git a/sources/shiboken2/ApiExtractor/typesystem.h b/sources/shiboken2/ApiExtractor/typesystem.h
index e2123ea4f..f089bb6e0 100644
--- a/sources/shiboken2/ApiExtractor/typesystem.h
+++ b/sources/shiboken2/ApiExtractor/typesystem.h
@@ -476,6 +476,8 @@ struct AddedFunction
return m_isStatic;
}
+ FunctionModificationList modifications;
+
private:
QString m_name;
QVector<TypeInfo> m_arguments;
diff --git a/sources/shiboken2/ApiExtractor/typesystem_p.h b/sources/shiboken2/ApiExtractor/typesystem_p.h
index a119b2a97..df1390cc3 100644
--- a/sources/shiboken2/ApiExtractor/typesystem_p.h
+++ b/sources/shiboken2/ApiExtractor/typesystem_p.h
@@ -132,6 +132,7 @@ struct StackElementContext
FunctionModificationList functionMods;
FieldModificationList fieldMods;
DocModificationList docModifications;
+ int addedFunctionModificationIndex = -1;
};
class Handler