4#include "Stroika/Foundation/StroikaPreComp.h"
11#include "Stroika/Foundation/Debug/Debugger.h"
16#if qStroika_Foundation_Common_Platform_POSIX
22using namespace Stroika::Foundation::Debug;
26#if qStroika_Foundation_Debug_AssertionsChecked
29 void DefaultAssertionHandler_ (
const wchar_t* assertCategory,
const wchar_t* assertionText,
const wchar_t* fileName,
int lineNum,
30 const wchar_t* functionName)
noexcept
33 String msg =
"{} ({}) failed in '{}'; {}:{}"_f(assertCategory ==
nullptr ? L
"Unknown assertion" : assertCategory,
34 assertionText == nullptr ? L
"" : assertionText, functionName == nullptr ? L
"" : functionName,
35 fileName == nullptr ? L
"" : fileName, lineNum);
37#if qStroika_Foundation_Common_Platform_POSIX
38 fprintf (stderr,
"%s\n", msg.
AsNarrowSDKString (AllowMissingCharacterErrorsFlag::eIgnoreErrors).c_str ());
40#if qStroika_Foundation_Debug_DefaultTracingOn
42 wstring tmp{Debug::BackTrace::Capture ()};
43 if (not tmp.empty ()) {
48 DropIntoDebuggerIfPresent ();
50#if qStroika_Foundation_Common_Platform_POSIX
51 fprintf (stderr,
"ABORTING...\n");
58 void DefaultWeakAssertionHandler_ (
const wchar_t* assertCategory,
const wchar_t* assertionText,
const wchar_t* fileName,
int lineNum,
59 const wchar_t* functionName)
noexcept
61 String msg =
"{} ({}) failed in '{}'; {}:{}"_f(assertCategory ==
nullptr ? L
"Unknown weak assertion" : assertCategory,
62 assertionText == nullptr ? L
"" : assertionText, functionName == nullptr ? L
"" : functionName,
63 fileName == nullptr ? L
"" : fileName, lineNum);
65#if qStroika_Foundation_Common_Platform_POSIX
66 fprintf (stderr,
"%s\n", msg.
AsNarrowSDKString (AllowMissingCharacterErrorsFlag::eIgnoreErrors).c_str ());
68#if qStroika_Foundation_Debug_DefaultTracingOn
70 wstring tmp{Debug::BackTrace::Capture ()};
71 if (not tmp.empty ()) {
80 atomic<AssertionHandlerType> sAssertFailureHandler_{DefaultAssertionHandler_};
81 atomic<AssertionHandlerType> sWeakAssertFailureHandler_{DefaultWeakAssertionHandler_};
91 return sAssertFailureHandler_;
101 return DefaultAssertionHandler_;
111 sAssertFailureHandler_ = (assertionHandler ==
nullptr) ? DefaultAssertionHandler_ : assertionHandler;
115 void (*sLegacyHandlerDelegate2_) (
const char* assertCategory,
const char* assertionText,
const char* fileName,
int lineNum,
116 const char* functionName)
noexcept;
119 const char* fileName,
int lineNum,
const char* functionName)
noexcept)
121 sLegacyHandlerDelegate2_ = legacyHandler;
122 auto wrapper = [] (
const wchar_t* assertCategory,
const wchar_t* assertionText,
const wchar_t* fileName,
int lineNum,
123 const wchar_t* functionName)
noexcept {
129 sLegacyHandlerDelegate2_ (narrowAssertCategory.c_str (), narrowAssert.c_str (), narrowFile.c_str (), lineNum, narrowFunctionName.c_str ());
145 return sWeakAssertFailureHandler_;
155 return DefaultWeakAssertionHandler_;
165 sWeakAssertFailureHandler_ = (assertionHandler ==
nullptr) ? DefaultWeakAssertionHandler_ : assertionHandler;
169 void (*sLegacyWeakHandlerDelegate2_) (
const char* assertCategory,
const char* assertionText,
const char* fileName,
int lineNum,
170 const char* functionName)
noexcept;
173 const char* fileName,
int lineNum,
const char* functionName)
noexcept)
175 sLegacyWeakHandlerDelegate2_ = legacyHandler;
176 auto wrapper = [] (
const wchar_t* assertCategory,
const wchar_t* assertionText,
const wchar_t* fileName,
int lineNum,
177 const wchar_t* functionName)
noexcept {
183 sLegacyHandlerDelegate2_ (narrowAssertCategory.c_str (), narrowAssert.c_str (), narrowFile.c_str (), lineNum, narrowFunctionName.c_str ());
192[[noreturn]]
void Stroika::Foundation::Debug::Private_::Assertion_Failure_Handler_ (
const wchar_t* assertCategory,
const wchar_t* assertionText,
193 const wchar_t* fileName,
int lineNum,
const char* functionName)
noexcept
195 static bool s_InTrap =
false;
203 (sAssertFailureHandler_.load ()) (assertCategory, assertionText, fileName, lineNum, Characters::NarrowSDK2Wide (functionName).c_str ());
209#if qCompilerAndStdLib_quick_exit_Buggy
216void Stroika::Foundation::Debug::Private_::Weak_Assertion_Failure_Handler_ (
const wchar_t* assertCategory,
const wchar_t* assertionText,
217 const wchar_t* fileName,
int lineNum,
const char* functionName)
noexcept
219 (sWeakAssertFailureHandler_.load ()) (assertCategory, assertionText, fileName, lineNum, Characters::NarrowSDK2Wide (functionName).c_str ());
void SetWeakAssertionHandler(AssertionHandlerType assertionHandler)
void SetAssertionHandler(AssertionHandlerType assertionHandler)
AssertionHandlerType GetAssertionHandler()
#define qStroika_Foundation_Debug_AssertionsChecked
The qStroika_Foundation_Debug_AssertionsChecked flag determines if assertions are checked and validat...
void(*)(const wchar_t *assertCategory, const wchar_t *assertionText, const wchar_t *fileName, int lineNum, const wchar_t *functionName) noexcept AssertionHandlerType
#define CompileTimeFlagChecker_SOURCE(NS_PREFIX, NAME, VALUE)
String is like std::u32string, except it is much easier to use, often much more space efficient,...
nonvirtual string AsNarrowSDKString() const