aboutsummaryrefslogtreecommitdiffstats
path: root/sources/shiboken2/ApiExtractor
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2018-07-20 13:41:25 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2018-07-24 11:10:28 +0000
commit027893b4955ce9bd08f0e68960806c74d77805e2 (patch)
tree446daafb37dc35487f300564aec05e61b492abcd /sources/shiboken2/ApiExtractor
parentbbbcc44789a2206c85836fc9656389d00ca7e010 (diff)
shiboken: Add exception specification to clang parser
For exception handling, calls into C++ might need to wrapped in try/catch. Detect noexcept functions for which this can be omitted. Task-number: PYSIDE-62 Change-Id: I37aced91ace184edf211a457a60c131d516a4037 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'sources/shiboken2/ApiExtractor')
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp1
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetalang.cpp4
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetalang.h5
-rw-r--r--sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp8
-rw-r--r--sources/shiboken2/ApiExtractor/parser/codemodel.cpp12
-rw-r--r--sources/shiboken2/ApiExtractor/parser/codemodel.h5
6 files changed, 35 insertions, 0 deletions
diff --git a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp
index 4aa5d72dd..5a2f75f31 100644
--- a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp
+++ b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp
@@ -1941,6 +1941,7 @@ AbstractMetaFunction *AbstractMetaBuilderPrivate::traverseFunction(const Functio
// Additional check for assignment/move assignment down below
metaFunction->setFunctionType(functionTypeFromCodeModel(functionItem->functionType()));
metaFunction->setConstant(functionItem->isConstant());
+ metaFunction->setNoExcept(functionItem->isNoExcept());
if (ReportHandler::isDebug(ReportHandler::MediumDebug))
qCDebug(lcShiboken).noquote().nospace() << " - " << functionName << "()";
diff --git a/sources/shiboken2/ApiExtractor/abstractmetalang.cpp b/sources/shiboken2/ApiExtractor/abstractmetalang.cpp
index de7182c71..ffc138968 100644
--- a/sources/shiboken2/ApiExtractor/abstractmetalang.cpp
+++ b/sources/shiboken2/ApiExtractor/abstractmetalang.cpp
@@ -395,6 +395,7 @@ AbstractMetaFunction::AbstractMetaFunction()
m_reverse(false),
m_userAdded(false),
m_explicit(false),
+ m_isNoExcept(false),
m_pointerOperator(false),
m_isCallOperator(false)
{
@@ -514,6 +515,7 @@ AbstractMetaFunction *AbstractMetaFunction::copy() const
if (type())
cpy->setType(type()->copy());
cpy->setConstant(isConstant());
+ cpy->setNoExcept(isNoExcept());
for (AbstractMetaArgument *arg : m_arguments)
cpy->addArgument(arg->copy());
@@ -1100,6 +1102,8 @@ void AbstractMetaFunction::formatDebugVerbose(QDebug &d) const
d << " [userAdded]";
if (m_explicit)
d << " [explicit]";
+ if (m_isNoExcept)
+ d << " [noexcept]";
if (m_pointerOperator)
d << " [operator->]";
if (m_isCallOperator)
diff --git a/sources/shiboken2/ApiExtractor/abstractmetalang.h b/sources/shiboken2/ApiExtractor/abstractmetalang.h
index d84a82af3..da3b72e1c 100644
--- a/sources/shiboken2/ApiExtractor/abstractmetalang.h
+++ b/sources/shiboken2/ApiExtractor/abstractmetalang.h
@@ -835,6 +835,10 @@ public:
}
static bool isConversionOperator(const QString& funcName);
+
+ bool isNoExcept() const { return m_isNoExcept; }
+ void setNoExcept(bool n) { m_isNoExcept = n; }
+
bool isConversionOperator() const
{
return isConversionOperator(originalName());
@@ -1098,6 +1102,7 @@ private:
uint m_reverse : 1;
uint m_userAdded : 1;
uint m_explicit : 1;
+ uint m_isNoExcept : 1;
uint m_pointerOperator : 1;
uint m_isCallOperator : 1;
};
diff --git a/sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp b/sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp
index 1623e6a6e..e3d7d0273 100644
--- a/sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp
+++ b/sources/shiboken2/ApiExtractor/clangparser/clangbuilder.cpp
@@ -268,6 +268,14 @@ FunctionModelItem BuilderPrivate::createFunction(const CXCursor &cursor,
result->setFunctionType(t);
result->setScope(m_scope);
result->setStatic(clang_Cursor_getStorageClass(cursor) == CX_SC_Static);
+ switch (clang_getCursorExceptionSpecificationType(cursor)) {
+ case CXCursor_ExceptionSpecificationKind_BasicNoexcept:
+ case CXCursor_ExceptionSpecificationKind_ComputedNoexcept:
+ result->setNoExcept(true);
+ break;
+ default:
+ break;
+ }
switch (clang_getCursorAvailability(cursor)) {
case CXAvailability_Available:
break;
diff --git a/sources/shiboken2/ApiExtractor/parser/codemodel.cpp b/sources/shiboken2/ApiExtractor/parser/codemodel.cpp
index 2c8042dc0..485222bb0 100644
--- a/sources/shiboken2/ApiExtractor/parser/codemodel.cpp
+++ b/sources/shiboken2/ApiExtractor/parser/codemodel.cpp
@@ -979,6 +979,16 @@ void _FunctionModelItem::setVariadics(bool isVariadics)
m_isVariadics = isVariadics;
}
+bool _FunctionModelItem::isNoExcept() const
+{
+ return m_isNoExcept;
+}
+
+void _FunctionModelItem::setNoExcept(bool n)
+{
+ m_isNoExcept = n;
+}
+
bool _FunctionModelItem::isDeleted() const
{
return m_isDeleted;
@@ -1091,6 +1101,8 @@ void _FunctionModelItem::formatDebug(QDebug &d) const
d << " [abstract]";
if (m_isExplicit)
d << " [explicit]";
+ if (m_isNoExcept)
+ d << " [noexcept]";
if (m_isInvokable)
d << " [invokable]";
formatModelItemList(d, ", arguments=", m_arguments);
diff --git a/sources/shiboken2/ApiExtractor/parser/codemodel.h b/sources/shiboken2/ApiExtractor/parser/codemodel.h
index a2cbcd6c0..eef2bf281 100644
--- a/sources/shiboken2/ApiExtractor/parser/codemodel.h
+++ b/sources/shiboken2/ApiExtractor/parser/codemodel.h
@@ -603,8 +603,12 @@ public:
bool isVariadics() const;
void setVariadics(bool isVariadics);
+
bool isSimilar(const FunctionModelItem &other) const;
+ bool isNoExcept() const;
+ void setNoExcept(bool n);
+
#ifndef QT_NO_DEBUG_STREAM
void formatDebug(QDebug &d) const override;
#endif
@@ -623,6 +627,7 @@ private:
uint m_isAbstract: 1;
uint m_isExplicit: 1;
uint m_isVariadics: 1;
+ uint m_isNoExcept : 1;
uint m_isInvokable : 1; // Qt
};
uint m_flags;