|
71 | 71 | #define _assertm(condition, message, call) \
|
72 | 72 | do{ \
|
73 | 73 | if (!(condition)) { \
|
74 |
| - std::cerr << "Assert at " \ |
| 74 | + std::cerr << "Assert at `" \ |
75 | 75 | << __FILE__ \
|
76 | 76 | << ":" \
|
77 | 77 | << __LINE__ \
|
78 |
| - << " in " \ |
| 78 | + << "` in `" \ |
79 | 79 | << __FUNCTION__ \
|
80 |
| - << "failed. " \ |
| 80 | + << "` failed. " \ |
81 | 81 | << message; \
|
82 | 82 | call; \
|
83 | 83 | } \
|
|
89 | 89 | if (!(condition)) { \
|
90 | 90 | const clang::SourceManager& _sm = sm; \
|
91 | 91 | clang::SourceLocation _loc = loc; \
|
92 |
| - std::cerr << "Assert at " \ |
| 92 | + std::cerr << "Assert at `" \ |
93 | 93 | << __FILE__ \
|
94 | 94 | << ":" \
|
95 | 95 | << __LINE__ \
|
96 |
| - << " in " \ |
| 96 | + << "` in `" \ |
97 | 97 | << __FUNCTION__ \
|
98 |
| - << "failed. " \ |
| 98 | + << "` failed. " \ |
99 | 99 | << message \
|
100 |
| - << " Filename " \ |
| 100 | + << " Filename `" \ |
101 | 101 | << _sm.getFilename(_loc).str() \
|
102 | 102 | << ":" \
|
103 | 103 | << _sm.getSpellingLineNumber(_loc) \
|
104 |
| - << "\n"; \ |
| 104 | + << "`\n"; \ |
105 | 105 | call; \
|
106 | 106 | } \
|
107 | 107 | }while(0)
|
108 | 108 |
|
109 | 109 | // Macros which output messages to console if parsing encounters oddity.
|
110 |
| -// If _DEBUG is defined but DEBUG_NO_ABORT is not macros abort. |
| 110 | +// In debug builds, macros abort unless DEBUG_NO_ABORT is defined. |
111 | 111 | //
|
112 | 112 | // Macro assertm outputs a message if condition is false.
|
113 | 113 | // Macro assertml outputs a message and parsing file and line on given source manager and source line.
|
114 | 114 | //
|
115 | 115 | // assertml adds newline ending.
|
116 |
| -#if defined(_DEBUG) && !defined(DEBUG_NO_ABORT) |
117 |
| -#define assertm(condition, message) _assertm(condition, message, abort()) |
118 |
| -#define assertml(condition, message, sm, source) _assertml(condition, message, sm, source, abort()) |
| 116 | +#ifdef NDEBUG |
| 117 | +#define debug_break() ((void)0) |
| 118 | +#define debug_fail() ((void)0) |
119 | 119 | #else
|
120 |
| -#define assertm(condition, message) _assertm(condition, message, ) |
121 |
| -#define assertml(condition, message, sm, source) _assertml(condition, message, sm, source, ) |
| 120 | + |
| 121 | +#if __GNUC__ |
| 122 | +#define debug_break() \ |
| 123 | + __builtin_trap() |
| 124 | +#elif _MSC_VER |
| 125 | +#define debug_break() \ |
| 126 | + __debugbreak() |
| 127 | +#else |
| 128 | +#define debug_break(c) \ |
| 129 | + *reinterpret_cast<volatile int*>(0) = 47283; |
| 130 | +#endif |
| 131 | + |
| 132 | +#ifdef DEBUG_NO_ABORT |
| 133 | +#define debug_fail() debug_break() |
| 134 | +#else |
| 135 | +#define debug_fail() debug_break(); abort() |
| 136 | +#endif |
| 137 | + |
122 | 138 | #endif
|
123 | 139 |
|
| 140 | +#define assertm(condition, message) _assertm(condition, message, debug_fail()) |
| 141 | +#define assertml(condition, message, sm, source) _assertml(condition, message, sm, source, debug_fail()) |
| 142 | + |
124 | 143 | using namespace CppSharp::CppParser;
|
125 | 144 |
|
126 | 145 | // We use this as a placeholder for pointer values that should be ignored.
|
|
0 commit comments