[964] | 1 | /* |
---|
| 2 | Copyright (C) 2005-2006 Feeling Software Inc. |
---|
| 3 | MIT License: http://www.opensource.org/licenses/mit-license.php |
---|
| 4 | */ |
---|
| 5 | |
---|
| 6 | /** |
---|
| 7 | @file FUAssert.h |
---|
| 8 | This file contains a simple debugging assertion mechanism. |
---|
| 9 | */ |
---|
| 10 | |
---|
| 11 | #ifndef _FU_ASSERT_H_ |
---|
| 12 | #define _FU_ASSERT_H_ |
---|
| 13 | |
---|
| 14 | /** |
---|
| 15 | Breaks into the debugger. |
---|
| 16 | In debug builds, this intentionally crashes the application. |
---|
| 17 | In release builds, this is an empty function. |
---|
| 18 | */ |
---|
| 19 | |
---|
| 20 | #ifdef _DEBUG |
---|
| 21 | #ifdef WIN32 |
---|
| 22 | #define __DEBUGGER_BREAK \ |
---|
| 23 | static bool ignoreAssert = false; \ |
---|
| 24 | if (!ignoreAssert) { \ |
---|
| 25 | fchar message[1024]; \ |
---|
| 26 | fsnprintf(message, 1024, FC("[%s@%u] Assertion failed.\nAbort: Enter debugger.\nRetry: Continue execution.\nIgnore: Do not assert at this line for the duration of the application."), FC(__FILE__), __LINE__); \ |
---|
| 27 | message[1023] = 0; \ |
---|
| 28 | int32 buttonPressed = MessageBox(NULL, message, FC("Assertion failed."), MB_ABORTRETRYIGNORE | MB_ICONWARNING); \ |
---|
| 29 | if (buttonPressed == IDABORT) { \ |
---|
| 30 | __asm int 3 \ |
---|
| 31 | } else if (buttonPressed == IDRETRY) {} \ |
---|
| 32 | else if (buttonPressed == IDIGNORE) { ignoreAssert = true; } } |
---|
| 33 | |
---|
| 34 | #else |
---|
| 35 | |
---|
| 36 | // On non-Windows platforms: force a crash? |
---|
| 37 | #define __DEBUGGER_BREAK { \ |
---|
| 38 | uint32* __p = NULL; \ |
---|
| 39 | uint32 __v = *__p; \ |
---|
| 40 | *__p = 0xD1ED0D1E; \ |
---|
| 41 | __v = __v + 1; } |
---|
| 42 | |
---|
| 43 | #endif // WIN32 |
---|
| 44 | #else |
---|
| 45 | |
---|
| 46 | /** |
---|
| 47 | Breaks into the debugger. |
---|
| 48 | In debug builds, this intentionally crashes the application. |
---|
| 49 | In release builds, this is an empty function. |
---|
| 50 | */ |
---|
| 51 | #define __DEBUGGER_BREAK |
---|
| 52 | |
---|
| 53 | #endif // _DEBUG |
---|
| 54 | |
---|
| 55 | /** Forces the debugger to break, or take the fall-back. |
---|
| 56 | @param command The fall_back command to execute. */ |
---|
| 57 | #define FUFail(command) { __DEBUGGER_BREAK; command; } |
---|
| 58 | |
---|
| 59 | /** Asserts that a condition is met. |
---|
| 60 | Use this macro, instead of 'if' statements |
---|
| 61 | when you are asserting for a programmer's error. |
---|
| 62 | @param condition The condition to assert. |
---|
| 63 | @param fall_back The command to execute if the condition is not met. */ |
---|
| 64 | #define FUAssert(condition, fall_back) { if (!(condition)) { __DEBUGGER_BREAK; fall_back; } } |
---|
| 65 | |
---|
| 66 | #ifdef _DEBUG |
---|
| 67 | #ifdef WIN32 |
---|
| 68 | |
---|
| 69 | #define FUCheckMemory(fallback) FUAssert(_CrtCheckMemory(), fallback); |
---|
| 70 | |
---|
| 71 | #else // WIN32 |
---|
| 72 | |
---|
| 73 | // I don't know if there is a Linux equivalent. |
---|
| 74 | #define FUCheckMemory(fallback) |
---|
| 75 | |
---|
| 76 | #endif // WIN32 |
---|
| 77 | #else // _DEBUG |
---|
| 78 | |
---|
| 79 | /** Asserts that the memory is intact. |
---|
| 80 | This function is only supported on Windows, debug builds right now: |
---|
| 81 | it uses the _CrtCheckMemory function and is very expensive. */ |
---|
| 82 | #define FUCheckMemory(fallback) |
---|
| 83 | |
---|
| 84 | #endif |
---|
| 85 | |
---|
| 86 | #endif // _FU_ASSERT_H_ |
---|