mirror of
https://github.com/bkaradzic/bx.git
synced 2026-02-17 20:52:37 +01:00
Added configurable assert handler function.
This commit is contained in:
@@ -113,6 +113,32 @@ namespace bx
|
|||||||
/// Unknown source code location.
|
/// Unknown source code location.
|
||||||
static constexpr LocationFull kUnknownLocationFull("Unknown?", "Unknown?", 0);
|
static constexpr LocationFull kUnknownLocationFull("Unknown?", "Unknown?", 0);
|
||||||
|
|
||||||
|
/// Assert handler function.
|
||||||
|
///
|
||||||
|
/// @param[in] _location Source code location where function is called.
|
||||||
|
/// @param[in] _format Printf style format.
|
||||||
|
/// @param[in] ... Arguments for `_format` specification.
|
||||||
|
///
|
||||||
|
/// @returns True if assert should stop code execution, otherwise returns false.
|
||||||
|
///
|
||||||
|
typedef bool (*AssertHandlerFn)(const Location& _location, const char* _format, va_list _argList);
|
||||||
|
|
||||||
|
/// Set assert handler function.
|
||||||
|
///
|
||||||
|
/// @param[in] _assertHandlerFn Pointer to AssertHandlerFn function.
|
||||||
|
///
|
||||||
|
void setAssertHandler(AssertHandlerFn _assertHandlerFn);
|
||||||
|
|
||||||
|
/// Assert function calls AssertHandlerFn.
|
||||||
|
///
|
||||||
|
/// @param[in] _location Source code location where function is called.
|
||||||
|
/// @param[in] _format Printf style format.
|
||||||
|
/// @param[in] ... Arguments for `_format` specification.
|
||||||
|
///
|
||||||
|
/// @returns True if assert should stop code execution, otherwise returns false.
|
||||||
|
///
|
||||||
|
bool assertFunction(const Location& _location, const char* _format, ...);
|
||||||
|
|
||||||
/// Arithmetic type `Ty` limits.
|
/// Arithmetic type `Ty` limits.
|
||||||
template<typename Ty, bool SignT = isSigned<Ty>()>
|
template<typename Ty, bool SignT = isSigned<Ty>()>
|
||||||
struct LimitsT;
|
struct LimitsT;
|
||||||
|
|||||||
@@ -302,22 +302,22 @@
|
|||||||
} \
|
} \
|
||||||
BX_MACRO_BLOCK_END
|
BX_MACRO_BLOCK_END
|
||||||
|
|
||||||
#define _BX_ASSERT(_condition, _format, ...) \
|
#define _BX_ASSERT(_condition, _format, ...) \
|
||||||
BX_MACRO_BLOCK_BEGIN \
|
BX_MACRO_BLOCK_BEGIN \
|
||||||
if (!BX_IGNORE_C4127(_condition) ) \
|
if (!BX_IGNORE_C4127(_condition) \
|
||||||
{ \
|
&& bx::assertFunction(bx::Location::current(), "ASSERT " #_condition " -> " _format, ##__VA_ARGS__) ) \
|
||||||
BX_TRACE("ASSERT " _format, ##__VA_ARGS__); \
|
{ \
|
||||||
bx::debugBreak(); \
|
bx::debugBreak(); \
|
||||||
} \
|
} \
|
||||||
BX_MACRO_BLOCK_END
|
BX_MACRO_BLOCK_END
|
||||||
|
|
||||||
#define _BX_ASSERT_LOC(_location, _condition, _format, ...) \
|
#define _BX_ASSERT_LOC(_location, _condition, _format, ...) \
|
||||||
BX_MACRO_BLOCK_BEGIN \
|
BX_MACRO_BLOCK_BEGIN \
|
||||||
if (!BX_IGNORE_C4127(_condition) ) \
|
if (!BX_IGNORE_C4127(_condition) \
|
||||||
{ \
|
&& bx::assertFunction(_location, "ASSERT " #_condition " -> " _format, ##__VA_ARGS__) ) \
|
||||||
_BX_TRACE_LOC(_location, "ASSERT " _format, ##__VA_ARGS__); \
|
{ \
|
||||||
bx::debugBreak(); \
|
bx::debugBreak(); \
|
||||||
} \
|
} \
|
||||||
BX_MACRO_BLOCK_END
|
BX_MACRO_BLOCK_END
|
||||||
|
|
||||||
#define _BX_WARN_LOC(_location, _condition, _format, ...) \
|
#define _BX_WARN_LOC(_location, _condition, _format, ...) \
|
||||||
|
|||||||
41
src/bx.cpp
41
src/bx.cpp
@@ -22,6 +22,47 @@ namespace bx
|
|||||||
return LocationFull(_function, _filePath, _line);
|
return LocationFull(_function, _filePath, _line);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool defaultAssertHandler(const Location& _location, const char* _format, va_list _argList)
|
||||||
|
{
|
||||||
|
char temp[8192];
|
||||||
|
int32_t pos = 0;
|
||||||
|
|
||||||
|
pos += snprintf(&temp[pos], max(0, sizeof(temp)-pos), "%s(%d): "
|
||||||
|
, _location.filePath
|
||||||
|
, _location.line
|
||||||
|
);
|
||||||
|
pos += vsnprintf(&temp[pos], max(0, sizeof(temp)-pos), _format, _argList);
|
||||||
|
pos += snprintf(&temp[pos], max(0, sizeof(temp)-pos), "\n");
|
||||||
|
debugOutput(temp);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static AssertHandlerFn s_assertHandler = defaultAssertHandler;
|
||||||
|
|
||||||
|
void setAssertHandler(AssertHandlerFn _assertHandlerFn)
|
||||||
|
{
|
||||||
|
BX_WARN(defaultAssertHandler == s_assertHandler, "Assert handler is already set.");
|
||||||
|
|
||||||
|
if (defaultAssertHandler == s_assertHandler)
|
||||||
|
{
|
||||||
|
s_assertHandler = NULL == _assertHandlerFn
|
||||||
|
? defaultAssertHandler
|
||||||
|
: _assertHandlerFn
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool assertFunction(const Location& _location, const char* _format, ...)
|
||||||
|
{
|
||||||
|
va_list argList;
|
||||||
|
va_start(argList, _format);
|
||||||
|
const bool result = s_assertHandler(_location, _format, argList);
|
||||||
|
va_end(argList);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
void swap(void* _a, void* _b, size_t _numBytes)
|
void swap(void* _a, void* _b, size_t _numBytes)
|
||||||
{
|
{
|
||||||
uint8_t* lhs = (uint8_t*)_a;
|
uint8_t* lhs = (uint8_t*)_a;
|
||||||
|
|||||||
@@ -5,9 +5,25 @@
|
|||||||
|
|
||||||
#define CATCH_CONFIG_RUNNER
|
#define CATCH_CONFIG_RUNNER
|
||||||
#include "test.h"
|
#include "test.h"
|
||||||
|
#include <bx/string.h>
|
||||||
|
|
||||||
|
bool testAssertHandler(const bx::Location& _location, const char* _format, va_list _argList)
|
||||||
|
{
|
||||||
|
bx::printf("%s(%d): ", _location.filePath, _location.line);
|
||||||
|
bx::vprintf(_format, _argList);
|
||||||
|
bx::printf("\n");
|
||||||
|
|
||||||
|
// Throwing exceptions is required for testing asserts being trigged.
|
||||||
|
// Use REQUIRE_THROWS to test asserts.
|
||||||
|
throw std::exception();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
int runAllTests(int _argc, const char* _argv[])
|
int runAllTests(int _argc, const char* _argv[])
|
||||||
{
|
{
|
||||||
|
bx::setAssertHandler(testAssertHandler);
|
||||||
|
|
||||||
DBG("Compiler: " BX_COMPILER_NAME
|
DBG("Compiler: " BX_COMPILER_NAME
|
||||||
", CPU: " BX_CPU_NAME
|
", CPU: " BX_CPU_NAME
|
||||||
", Architecture: " BX_ARCH_NAME
|
", Architecture: " BX_ARCH_NAME
|
||||||
|
|||||||
Reference in New Issue
Block a user