Read-only mirrors. Development, issues and pull requests are on GitHub.

summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorMartin Hořeňovský2025-07-21 19:45:43 +0200
committerMartin Hořeňovský2025-07-21 21:50:51 +0200
commit5aa8d113215bd9a97ecc1a2f3fc9506947a2fa57 (patch)
treebec8098a6e8809026ead0eaabb9ca00762f4d040
parent9c5c21df82372b9d266f6b6bc1cf0edd71337109 (diff)
downloadcatch3-5aa8d113215bd9a97ecc1a2f3fc9506947a2fa57.tar.gz
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.
-rw-r--r--src/catch2/internal/catch_run_context.cpp8
-rw-r--r--src/catch2/internal/catch_run_context.hpp6
2 files changed, 11 insertions, 3 deletions
diff --git a/src/catch2/internal/catch_run_context.cpp b/src/catch2/internal/catch_run_context.cpp
index 118d37f8..dca16618 100644
--- a/src/catch2/internal/catch_run_context.cpp
+++ b/src/catch2/internal/catch_run_context.cpp
@@ -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 {
diff --git a/src/catch2/internal/catch_run_context.hpp b/src/catch2/internal/catch_run_context.hpp
index 6e9f21f7..c8cc974a 100644
--- a/src/catch2/internal/catch_run_context.hpp
+++ b/src/catch2/internal/catch_run_context.hpp
@@ -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;