|
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