| 1 | // |
| 2 | // m3_exception.h |
| 3 | // |
| 4 | // Created by Steven Massey on 7/5/19. |
| 5 | // Copyright © 2019 Steven Massey. All rights reserved. |
| 6 | // |
| 7 | // some macros to emulate try/catch |
| 8 | |
| 9 | #ifndef m3_exception_h |
| 10 | #define m3_exception_h |
| 11 | |
| 12 | #include "m3_config.h" |
| 13 | |
| 14 | # if d_m3EnableExceptionBreakpoint |
| 15 | |
| 16 | // declared in m3_info.c |
| 17 | void ExceptionBreakpoint (cstr_t i_exception, cstr_t i_message); |
| 18 | |
| 19 | # define EXCEPTION_PRINT(ERROR) ExceptionBreakpoint (ERROR, (__FILE__ ":" M3_STR(__LINE__))) |
| 20 | |
| 21 | # else |
| 22 | # define EXCEPTION_PRINT(...) |
| 23 | # endif |
| 24 | |
| 25 | |
| 26 | #define _try M3Result result = m3Err_none; |
| 27 | #define _(TRY) { result = TRY; if (M3_UNLIKELY(result)) { EXCEPTION_PRINT (result); goto _catch; } } |
| 28 | #define _throw(ERROR) { result = ERROR; EXCEPTION_PRINT (result); goto _catch; } |
| 29 | #define _throwif(ERROR, COND) if (M3_UNLIKELY(COND)) { _throw(ERROR); } |
| 30 | |
| 31 | #define _throwifnull(PTR) _throwif (m3Err_mallocFailed, !(PTR)) |
| 32 | |
| 33 | #endif // m3_exception_h |
| 34 | |