summaryrefslogtreecommitdiffstats
path: root/src/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/common')
-rw-r--r--src/common/assert.cpp10
-rw-r--r--src/common/assert.h45
2 files changed, 20 insertions, 35 deletions
diff --git a/src/common/assert.cpp b/src/common/assert.cpp
index 1a85faccf..6026b7dc2 100644
--- a/src/common/assert.cpp
+++ b/src/common/assert.cpp
@@ -6,13 +6,9 @@
#include "common/settings.h"
-void assert_check_condition(bool cond, std::function<void()>&& on_failure) {
- if (!cond) [[unlikely]] {
- on_failure();
-
- if (Settings::values.use_debug_asserts) {
- Crash();
- }
+void assert_fail_impl() {
+ if (Settings::values.use_debug_asserts) {
+ Crash();
}
}
diff --git a/src/common/assert.h b/src/common/assert.h
index fb7808657..8c927fcc0 100644
--- a/src/common/assert.h
+++ b/src/common/assert.h
@@ -4,47 +4,36 @@
#pragma once
-#include <functional>
-
#include "common/logging/log.h"
// Sometimes we want to try to continue even after hitting an assert.
// However touching this file yields a global recompilation as this header is included almost
// everywhere. So let's just move the handling of the failed assert to a single cpp file.
-// For asserts we'd like to keep all the junk executed when an assert happens away from the
-// important code in the function. One way of doing this is to put all the relevant code inside a
-// lambda and force the compiler to not inline it.
-void assert_check_condition(bool cond, std::function<void()>&& on_failure);
-
+void assert_fail_impl();
[[noreturn]] void unreachable_impl();
+#ifdef _MSC_VER
+#define YUZU_NO_INLINE __declspec(noinline)
+#else
+#define YUZU_NO_INLINE __attribute__((noinline))
+#endif
+
#define ASSERT(_a_) \
- do { \
- if (std::is_constant_evaluated()) { \
- if (!(_a_)) { \
- /* Will trigger compile error here */ \
- assert_check_condition(bool(_a_), \
- [] { LOG_CRITICAL(Debug, "Assertion Failed!"); }); \
- } \
- } else { \
- assert_check_condition(bool(_a_), [] { LOG_CRITICAL(Debug, "Assertion Failed!"); }); \
+ ([&]() YUZU_NO_INLINE { \
+ if (!(_a_)) [[unlikely]] { \
+ LOG_CRITICAL(Debug, "Assertion Failed!"); \
+ assert_fail_impl(); \
} \
- } while (0)
+ }())
#define ASSERT_MSG(_a_, ...) \
- do { \
- if (std::is_constant_evaluated()) { \
- if (!(_a_)) { \
- /* Will trigger compile error here */ \
- assert_check_condition(bool(_a_), \
- [] { LOG_CRITICAL(Debug, "Assertion Failed!"); }); \
- } \
- } else { \
- assert_check_condition( \
- bool(_a_), [&] { LOG_CRITICAL(Debug, "Assertion Failed!\n" __VA_ARGS__); }); \
+ ([&]() YUZU_NO_INLINE { \
+ if (!(_a_)) [[unlikely]] { \
+ LOG_CRITICAL(Debug, "Assertion Failed!\n" __VA_ARGS__); \
+ assert_fail_impl(); \
} \
- } while (0)
+ }())
#define UNREACHABLE() \
do { \