diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2018-07-20 13:41:25 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2018-07-24 11:10:28 +0000 |
commit | 027893b4955ce9bd08f0e68960806c74d77805e2 (patch) | |
tree | 446daafb37dc35487f300564aec05e61b492abcd /sources/shiboken2/ApiExtractor | |
parent | bbbcc44789a2206c85836fc9656389d00ca7e010 (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')
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; |