mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 12:17:11 +01:00 
			
		
		
		
	Clear unscoped messages lazily
This improves the fast path performance for successful assertions by about 7%, at the cost of potentially keeping around the message allocation longer.
This commit is contained in:
		| @@ -296,6 +296,10 @@ namespace Catch { | ||||
|         } | ||||
|  | ||||
|         { | ||||
|             if ( m_clearMessageScopes ) { | ||||
|                 m_messageScopes.clear(); | ||||
|                 m_clearMessageScopes = false; | ||||
|             } | ||||
|             auto _ = scopedDeactivate( *m_outputRedirect ); | ||||
|             m_reporter->assertionEnded( AssertionStats( result, m_messages, m_totals ) ); | ||||
|         } | ||||
| @@ -524,9 +528,9 @@ namespace Catch { | ||||
|  | ||||
|     void RunContext::assertionPassedFastPath(SourceLineInfo lineInfo) { | ||||
|         m_lastKnownLineInfo = lineInfo; | ||||
|         m_lastAssertionPassed = true; | ||||
|         ++m_totals.assertions.passed; | ||||
|         m_messageScopes.clear(); | ||||
|         m_lastAssertionPassed = true; | ||||
|         m_clearMessageScopes = true; | ||||
|     } | ||||
|  | ||||
|     bool RunContext::aborting() const { | ||||
|   | ||||
| @@ -148,7 +148,8 @@ namespace Catch { | ||||
|         Totals m_totals; | ||||
|         IEventListenerPtr m_reporter; | ||||
|         std::vector<MessageInfo> m_messages; | ||||
|         std::vector<ScopedMessage> m_messageScopes; /* Keeps owners of so-called unscoped messages. */ | ||||
|         // Owners for the UNSCOPED_X information macro | ||||
|         std::vector<ScopedMessage> m_messageScopes; | ||||
|         SourceLineInfo m_lastKnownLineInfo; | ||||
|         std::vector<SectionEndInfo> m_unfinishedSections; | ||||
|         std::vector<ITracker*> m_activeSections; | ||||
| @@ -158,6 +159,9 @@ namespace Catch { | ||||
|         // Caches m_config->abortAfter() to avoid vptr calls/allow inlining | ||||
|         size_t m_abortAfterXFailedAssertions; | ||||
|         bool m_lastAssertionPassed = false; | ||||
|         // Should we clear message scopes before sending off the messages to reporter? | ||||
|         // Set in `assertionPassedFastPath` to avoid doing the full clear there. | ||||
|         bool m_clearMessageScopes = false; | ||||
|         bool m_shouldReportUnexpected = true; | ||||
|         // Caches whether `assertionStarting` events should be sent to the reporter. | ||||
|         bool m_reportAssertionStarting; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Martin Hořeňovský
					Martin Hořeňovský