Restored exceptionGuard functionality under CATCH_CONFIG_FAST_COMPILE

This commit is contained in:
Phil Nash 2017-08-08 21:07:30 +01:00
parent 5f91724368
commit 2832e23aa9
3 changed files with 31 additions and 7 deletions

View File

@ -14,7 +14,7 @@
#include "catch_debugger.h" #include "catch_debugger.h"
#include "catch_interfaces_registry_hub.h" #include "catch_interfaces_registry_hub.h"
#include <iostream> // !TBD #include <cassert>
namespace Catch { namespace Catch {
@ -58,6 +58,12 @@ namespace Catch {
{ {
getCurrentContext().getResultCapture()->assertionStarting( m_assertionInfo ); getCurrentContext().getResultCapture()->assertionStarting( m_assertionInfo );
} }
AssertionHandler::~AssertionHandler() {
if ( m_inExceptionGuard ) {
handle( ResultWas::ThrewException, "Exception translation was disabled by CATCH_CONFIG_FAST_COMPILE" );
getCurrentContext().getResultCapture()->exceptionEarlyReported();
}
}
void AssertionHandler::handle( ITransientExpression const& expr ) { void AssertionHandler::handle( ITransientExpression const& expr ) {
@ -125,4 +131,14 @@ namespace Catch {
handle( ResultWas::ThrewException, Catch::translateActiveException().c_str() ); handle( ResultWas::ThrewException, Catch::translateActiveException().c_str() );
} }
void AssertionHandler::setExceptionGuard() {
assert( m_inExceptionGuard == false );
m_inExceptionGuard = true;
}
void AssertionHandler::unsetExceptionGuard() {
assert( m_inExceptionGuard == true );
m_inExceptionGuard = false;
}
} // namespace Catch } // namespace Catch

View File

@ -36,12 +36,15 @@ namespace Catch {
AssertionInfo m_assertionInfo; AssertionInfo m_assertionInfo;
bool m_shouldDebugBreak = false; bool m_shouldDebugBreak = false;
bool m_shouldThrow = false; bool m_shouldThrow = false;
bool m_inExceptionGuard = false;
public: public:
AssertionHandler AssertionHandler
( StringRef macroName, ( StringRef macroName,
SourceLineInfo const& lineInfo, SourceLineInfo const& lineInfo,
StringRef capturedExpression, StringRef capturedExpression,
ResultDisposition::Flags resultDisposition ); ResultDisposition::Flags resultDisposition );
~AssertionHandler();
void handle( ITransientExpression const& expr ); void handle( ITransientExpression const& expr );
@ -60,6 +63,8 @@ namespace Catch {
void reactWithoutDebugBreak() const; void reactWithoutDebugBreak() const;
void useActiveException( ResultDisposition::Flags resultDisposition ); void useActiveException( ResultDisposition::Flags resultDisposition );
void useActiveException(); void useActiveException();
void setExceptionGuard();
void unsetExceptionGuard();
}; };
} // namespace Catch } // namespace Catch

View File

@ -26,14 +26,17 @@
// macro in each assertion // macro in each assertion
#define INTERNAL_CATCH_REACT( resultBuilder ) \ #define INTERNAL_CATCH_REACT( resultBuilder ) \
resultBuilder.react(); resultBuilder.react();
#define INTERNAL_CATCH_REACT2( handler ) \
handler.reactWithDebugBreak();
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// Another way to speed-up compilation is to omit local try-catch for REQUIRE* // Another way to speed-up compilation is to omit local try-catch for REQUIRE*
// macros. // macros.
// This can potentially cause false negative, if the test code catches // This can potentially cause false negative, if the test code catches
// the exception before it propagates back up to the runner. // the exception before it propagates back up to the runner.
#define INTERNAL_CATCH_TRY #define INTERNAL_CATCH_TRY( capturer ) capturer.setExceptionGuard();
#define INTERNAL_CATCH_CATCH( capturer, disposition ) #define INTERNAL_CATCH_CATCH( capturer, disposition ) capturer.unsetExceptionGuard();
#define INTERNAL_CATCH_CATCH2( capturer ) capturer.unsetExceptionGuard();
#else // CATCH_CONFIG_FAST_COMPILE #else // CATCH_CONFIG_FAST_COMPILE
@ -47,9 +50,9 @@
resultBuilder.react(); resultBuilder.react();
#define INTERNAL_CATCH_REACT2( handler ) \ #define INTERNAL_CATCH_REACT2( handler ) \
if( handler.shouldDebugBreak() ) CATCH_BREAK_INTO_DEBUGGER(); \ if( handler.shouldDebugBreak() ) CATCH_BREAK_INTO_DEBUGGER(); \
handler.reactWithDebugBreak(); handler.reactWithoutDebugBreak();
#define INTERNAL_CATCH_TRY try #define INTERNAL_CATCH_TRY( capturer ) try
#define INTERNAL_CATCH_CATCH( capturer, disposition ) catch(...) { capturer.useActiveException( disposition ); } #define INTERNAL_CATCH_CATCH( capturer, disposition ) catch(...) { capturer.useActiveException( disposition ); }
#define INTERNAL_CATCH_CATCH2( capturer ) catch(...) { capturer.useActiveException(); } #define INTERNAL_CATCH_CATCH2( capturer ) catch(...) { capturer.useActiveException(); }
@ -59,7 +62,7 @@
#define INTERNAL_CATCH_TEST( macroName, resultDisposition, ... ) \ #define INTERNAL_CATCH_TEST( macroName, resultDisposition, ... ) \
do { \ do { \
Catch::AssertionHandler catchAssertionHandler( macroName, CATCH_INTERNAL_LINEINFO, #__VA_ARGS__, resultDisposition ); \ Catch::AssertionHandler catchAssertionHandler( macroName, CATCH_INTERNAL_LINEINFO, #__VA_ARGS__, resultDisposition ); \
INTERNAL_CATCH_TRY { \ INTERNAL_CATCH_TRY( catchAssertionHandler ) { \
CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \
catchAssertionHandler.handle( Catch::Decomposer() <= __VA_ARGS__ ); \ catchAssertionHandler.handle( Catch::Decomposer() <= __VA_ARGS__ ); \
CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \
@ -147,7 +150,7 @@
#define INTERNAL_CHECK_THAT( macroName, matcher, resultDisposition, arg ) \ #define INTERNAL_CHECK_THAT( macroName, matcher, resultDisposition, arg ) \
do { \ do { \
Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #arg ", " #matcher, resultDisposition ); \ Catch::ResultBuilder __catchResult( macroName, CATCH_INTERNAL_LINEINFO, #arg ", " #matcher, resultDisposition ); \
INTERNAL_CATCH_TRY { \ INTERNAL_CATCH_TRY( __catchResult ) { \
__catchResult.captureMatch( arg, matcher, #matcher ); \ __catchResult.captureMatch( arg, matcher, #matcher ); \
} INTERNAL_CATCH_CATCH( __catchResult, resultDisposition ) \ } INTERNAL_CATCH_CATCH( __catchResult, resultDisposition ) \
INTERNAL_CATCH_REACT( __catchResult ) \ INTERNAL_CATCH_REACT( __catchResult ) \