mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-15 23:20:36 +01:00
Core/Miscc: Add file/line/function information to ASSERT_NOTNULL
This commit is contained in:
@@ -17,10 +17,11 @@
|
||||
|
||||
#include "Errors.h"
|
||||
#include "StringFormat.h"
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <thread>
|
||||
#include <cstdarg>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
|
||||
/**
|
||||
@file Errors.cpp
|
||||
@@ -51,55 +52,60 @@ extern "C" { TC_COMMON_API char const* TrinityAssertionFailedMessage = nullptr;
|
||||
|
||||
namespace
|
||||
{
|
||||
std::string FormatAssertionMessage(char const* format, va_list args)
|
||||
void FormatAssertionMessageTo(std::string& formatted, char const* format, va_list args) noexcept
|
||||
{
|
||||
std::string formatted;
|
||||
va_list len;
|
||||
|
||||
va_copy(len, args);
|
||||
int32 length = vsnprintf(nullptr, 0, format, len);
|
||||
va_end(len);
|
||||
|
||||
formatted.resize(length);
|
||||
vsnprintf(&formatted[0], length + 1, format, args);
|
||||
|
||||
return formatted;
|
||||
std::size_t offset = formatted.length();
|
||||
formatted.resize(offset + length);
|
||||
vsnprintf(&formatted[offset], length + 1, format, args);
|
||||
}
|
||||
}
|
||||
|
||||
namespace Trinity
|
||||
{
|
||||
|
||||
void Assert(char const* file, int line, char const* function, std::string debugInfo, char const* message)
|
||||
void Assert(char const* file, int line, char const* function, char const* message, std::string debugInfo) noexcept
|
||||
{
|
||||
std::string formattedMessage = StringFormat("\n{}:{} in {} ASSERTION FAILED:\n {}\n", file, line, function, message) + debugInfo + '\n';
|
||||
std::string formattedMessage = StringFormat("\n{}:{} in {} ASSERTION FAILED:\n {}\n{}\n", file, line, function, message, debugInfo);
|
||||
fprintf(stderr, "%s", formattedMessage.c_str());
|
||||
fflush(stderr);
|
||||
Crash(formattedMessage.c_str());
|
||||
}
|
||||
|
||||
void Assert(char const* file, int line, char const* function, std::string debugInfo, char const* message, char const* format, ...)
|
||||
void Assert(char const* file, int line, char const* function, char const* message, std::string debugInfo, char const* format, ...) noexcept
|
||||
{
|
||||
va_list args;
|
||||
va_start(args, format);
|
||||
|
||||
std::string formattedMessage = StringFormat("\n{}:{} in {} ASSERTION FAILED:\n {}\n", file, line, function, message) + FormatAssertionMessage(format, args) + '\n' + debugInfo + '\n';
|
||||
std::string formattedMessage = StringFormat("\n{}:{} in {} ASSERTION FAILED:\n {}\n", file, line, function, message);
|
||||
FormatAssertionMessageTo(formattedMessage, format, args);
|
||||
va_end(args);
|
||||
|
||||
formattedMessage.append(1, '\n');
|
||||
formattedMessage.append(debugInfo);
|
||||
formattedMessage.append(1, '\n');
|
||||
|
||||
fprintf(stderr, "%s", formattedMessage.c_str());
|
||||
fflush(stderr);
|
||||
|
||||
Crash(formattedMessage.c_str());
|
||||
}
|
||||
|
||||
void Fatal(char const* file, int line, char const* function, char const* message, ...)
|
||||
void Fatal(char const* file, int line, char const* function, char const* message, ...) noexcept
|
||||
{
|
||||
va_list args;
|
||||
va_start(args, message);
|
||||
|
||||
std::string formattedMessage = StringFormat("\n{}:{} in {} FATAL ERROR:\n", file, line, function) + FormatAssertionMessage(message, args) + '\n';
|
||||
std::string formattedMessage = StringFormat("\n{}:{} in {} FATAL ERROR:\n", file, line, function);
|
||||
FormatAssertionMessageTo(formattedMessage, message, args);
|
||||
va_end(args);
|
||||
|
||||
formattedMessage.append(1, '\n');
|
||||
|
||||
fprintf(stderr, "%s", formattedMessage.c_str());
|
||||
fflush(stderr);
|
||||
|
||||
@@ -107,7 +113,7 @@ void Fatal(char const* file, int line, char const* function, char const* message
|
||||
Crash(formattedMessage.c_str());
|
||||
}
|
||||
|
||||
void Error(char const* file, int line, char const* function, char const* message)
|
||||
void Error(char const* file, int line, char const* function, char const* message) noexcept
|
||||
{
|
||||
std::string formattedMessage = StringFormat("\n{}:{} in {} ERROR:\n {}\n", file, line, function, message);
|
||||
fprintf(stderr, "%s", formattedMessage.c_str());
|
||||
@@ -115,13 +121,13 @@ void Error(char const* file, int line, char const* function, char const* message
|
||||
Crash(formattedMessage.c_str());
|
||||
}
|
||||
|
||||
void Warning(char const* file, int line, char const* function, char const* message)
|
||||
void Warning(char const* file, int line, char const* function, char const* message) noexcept
|
||||
{
|
||||
fprintf(stderr, "\n%s:%i in %s WARNING:\n %s\n",
|
||||
file, line, function, message);
|
||||
}
|
||||
|
||||
void Abort(char const* file, int line, char const* function)
|
||||
void Abort(char const* file, int line, char const* function) noexcept
|
||||
{
|
||||
std::string formattedMessage = StringFormat("\n{}:{} in {} ABORTED.\n", file, line, function);
|
||||
fprintf(stderr, "%s", formattedMessage.c_str());
|
||||
@@ -129,21 +135,24 @@ void Abort(char const* file, int line, char const* function)
|
||||
Crash(formattedMessage.c_str());
|
||||
}
|
||||
|
||||
void Abort(char const* file, int line, char const* function, char const* message, ...)
|
||||
void Abort(char const* file, int line, char const* function, char const* message, ...) noexcept
|
||||
{
|
||||
va_list args;
|
||||
va_start(args, message);
|
||||
|
||||
std::string formattedMessage = StringFormat("\n{}:{} in {} ABORTED:\n", file, line, function) + FormatAssertionMessage(message, args) + '\n';
|
||||
std::string formattedMessage = StringFormat("\n{}:{} in {} ABORTED:\n", file, line, function);
|
||||
FormatAssertionMessageTo(formattedMessage, message, args);
|
||||
va_end(args);
|
||||
|
||||
formattedMessage.append(1, '\n');
|
||||
|
||||
fprintf(stderr, "%s", formattedMessage.c_str());
|
||||
fflush(stderr);
|
||||
|
||||
Crash(formattedMessage.c_str());
|
||||
}
|
||||
|
||||
void AbortHandler(int sigval)
|
||||
void AbortHandler(int sigval) noexcept
|
||||
{
|
||||
// nothing useful to log here, no way to pass args
|
||||
std::string formattedMessage = StringFormat("Caught signal {}\n", sigval);
|
||||
@@ -151,7 +160,6 @@ void AbortHandler(int sigval)
|
||||
fflush(stderr);
|
||||
Crash(formattedMessage.c_str());
|
||||
}
|
||||
|
||||
} // namespace Trinity
|
||||
|
||||
std::string GetDebugInfo()
|
||||
|
||||
@@ -21,26 +21,37 @@
|
||||
#include "Define.h"
|
||||
#include <string>
|
||||
|
||||
TC_COMMON_API std::string GetDebugInfo();
|
||||
|
||||
namespace Trinity
|
||||
{
|
||||
[[noreturn]] TC_COMMON_API void Assert(char const* file, int line, char const* function, std::string debugInfo, char const* message);
|
||||
[[noreturn]] TC_COMMON_API void Assert(char const* file, int line, char const* function, std::string debugInfo, char const* message, char const* format, ...) ATTR_PRINTF(6, 7);
|
||||
[[noreturn]] TC_COMMON_API void Assert(char const* file, int line, char const* function, char const* message, std::string debugInfo) noexcept;
|
||||
[[noreturn]] TC_COMMON_API void Assert(char const* file, int line, char const* function, char const* message, std::string debugInfo, char const* format, ...) noexcept ATTR_PRINTF(6, 7);
|
||||
|
||||
[[noreturn]] TC_COMMON_API void Fatal(char const* file, int line, char const* function, char const* message, ...) ATTR_PRINTF(4, 5);
|
||||
[[noreturn]] TC_COMMON_API void Fatal(char const* file, int line, char const* function, char const* message, ...) noexcept ATTR_PRINTF(4, 5);
|
||||
|
||||
[[noreturn]] TC_COMMON_API void Error(char const* file, int line, char const* function, char const* message);
|
||||
[[noreturn]] TC_COMMON_API void Error(char const* file, int line, char const* function, char const* message) noexcept;
|
||||
|
||||
[[noreturn]] TC_COMMON_API void Abort(char const* file, int line, char const* function);
|
||||
[[noreturn]] TC_COMMON_API void Abort(char const* file, int line, char const* function, char const* message, ...);
|
||||
[[noreturn]] TC_COMMON_API void Abort(char const* file, int line, char const* function) noexcept;
|
||||
[[noreturn]] TC_COMMON_API void Abort(char const* file, int line, char const* function, char const* message, ...) noexcept;
|
||||
|
||||
TC_COMMON_API void Warning(char const* file, int line, char const* function, char const* message);
|
||||
TC_COMMON_API void Warning(char const* file, int line, char const* function, char const* message) noexcept;
|
||||
|
||||
[[noreturn]] TC_COMMON_API void AbortHandler(int sigval);
|
||||
[[noreturn]] TC_COMMON_API void AbortHandler(int sigval) noexcept;
|
||||
|
||||
namespace Impl
|
||||
{
|
||||
template <typename T>
|
||||
inline T* AssertNotNull(T* pointer, char const* file, int line, char const* function, char const* message) noexcept
|
||||
{
|
||||
if (pointer) [[likely]]
|
||||
return pointer;
|
||||
|
||||
Assert(file, line, function, message, ::GetDebugInfo());
|
||||
}
|
||||
}
|
||||
} // namespace Trinity
|
||||
|
||||
TC_COMMON_API std::string GetDebugInfo();
|
||||
|
||||
#if TRINITY_COMPILER == TRINITY_COMPILER_MICROSOFT
|
||||
#define ASSERT_BEGIN __pragma(warning(push)) __pragma(warning(disable: 4127))
|
||||
#define ASSERT_END __pragma(warning(pop))
|
||||
@@ -53,8 +64,8 @@ TC_COMMON_API std::string GetDebugInfo();
|
||||
#define EXCEPTION_ASSERTION_FAILURE 0xC0000420L
|
||||
#endif
|
||||
|
||||
#define WPAssert(cond, ...) ASSERT_BEGIN do { if (!(cond)) [[unlikely]] Trinity::Assert(__FILE__, __LINE__, __FUNCTION__, GetDebugInfo(), #cond, ##__VA_ARGS__); } while(0) ASSERT_END
|
||||
#define WPAssert_NODEBUGINFO(cond, ...) ASSERT_BEGIN do { if (!(cond)) [[unlikely]] Trinity::Assert(__FILE__, __LINE__, __FUNCTION__, "", #cond, ##__VA_ARGS__); } while(0) ASSERT_END
|
||||
#define WPAssert(cond, ...) ASSERT_BEGIN do { if (!(cond)) [[unlikely]] Trinity::Assert(__FILE__, __LINE__, __FUNCTION__, #cond, GetDebugInfo(), ##__VA_ARGS__); } while(0) ASSERT_END
|
||||
#define WPAssert_NODEBUGINFO(cond, ...) ASSERT_BEGIN do { if (!(cond)) [[unlikely]] Trinity::Assert(__FILE__, __LINE__, __FUNCTION__, #cond, ::GetDebugInfo(), ##__VA_ARGS__); } while(0) ASSERT_END
|
||||
#define WPFatal(cond, ...) ASSERT_BEGIN do { if (!(cond)) [[unlikely]] Trinity::Fatal(__FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); } while(0) ASSERT_END
|
||||
#define WPError(cond, msg) ASSERT_BEGIN do { if (!(cond)) [[unlikely]] Trinity::Error(__FILE__, __LINE__, __FUNCTION__, (msg)); } while(0) ASSERT_END
|
||||
#define WPWarning(cond, msg) ASSERT_BEGIN do { if (!(cond)) [[unlikely]] Trinity::Warning(__FILE__, __LINE__, __FUNCTION__, (msg)); } while(0) ASSERT_END
|
||||
@@ -64,9 +75,11 @@ TC_COMMON_API std::string GetDebugInfo();
|
||||
#ifdef PERFORMANCE_PROFILING
|
||||
#define ASSERT(cond, ...) ((void)0)
|
||||
#define ASSERT_NODEBUGINFO(cond, ...) ((void)0)
|
||||
#define ASSERT_NOTNULL(pointer) (pointer)
|
||||
#else
|
||||
#define ASSERT WPAssert
|
||||
#define ASSERT_NODEBUGINFO WPAssert_NODEBUGINFO
|
||||
#define ASSERT_NOTNULL(pointer) Trinity::Impl::AssertNotNull(pointer, __FILE__, __LINE__, __FUNCTION__, #pointer)
|
||||
#endif
|
||||
|
||||
#define ASSERT_WITH_SIDE_EFFECTS WPAssert
|
||||
@@ -74,13 +87,4 @@ TC_COMMON_API std::string GetDebugInfo();
|
||||
#define ABORT WPAbort
|
||||
#define ABORT_MSG WPAbort_MSG
|
||||
|
||||
template <typename T>
|
||||
inline T* ASSERT_NOTNULL_IMPL(T* pointer, char const* expr)
|
||||
{
|
||||
ASSERT(pointer, "%s", expr);
|
||||
return pointer;
|
||||
}
|
||||
|
||||
#define ASSERT_NOTNULL(pointer) ASSERT_NOTNULL_IMPL(pointer, #pointer)
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user