1 #ifndef FAILPLATFORMSPECIFIC_H
2 #define FAILPLATFORMSPECIFIC_H
12 volatile const char * file;
15 MFMErrorEnvironmentPointer_t prev;
21 __thread MFMErrorEnvironmentPointer_t * MFMPtrToErrEnvStackPtr;
23 extern "C" void MFMPrintErrorEnvironment(FILE * stream, MFMErrorEnvironmentPointer_t errenv) ;
25 extern "C" void MFMPrintError(FILE * stream,
const char * file,
const int line,
const int code) ;
27 extern "C" void MFMFailHere(
const char * file,
const int line,
const int code) __attribute__ ((noreturn));
28 extern "C" void MFMLongJmpHere(jmp_buf buffer,
const int toThrow) __attribute__ ((noreturn));
31 #define MFM_FAIL_CODE_NUMBER(code) (MFM_FAIL_CODE_REASON_##code)
34 ((MFMPtrToErrEnvStackPtr && *MFMPtrToErrEnvStackPtr)? \
35 ((*MFMPtrToErrEnvStackPtr)->file = __FILE__, \
36 (*MFMPtrToErrEnvStackPtr)->lineno = __LINE__, \
37 MFMLongJmpHere((*MFMPtrToErrEnvStackPtr)->buffer, \
38 MFM_FAIL_CODE_NUMBER(code)),0) : \
39 (MFMFailHere(__FILE__,__LINE__, \
40 MFM_FAIL_CODE_NUMBER(code)),0))
92 #define unwind_protect(cleanup,block) \
94 MFMErrorEnvironment unwindProtect_errorEnvironment; \
95 unwindProtect_errorEnvironment.prev = (*MFMPtrToErrEnvStackPtr); \
96 (*MFMPtrToErrEnvStackPtr) = &unwindProtect_errorEnvironment; \
97 if ((unwindProtect_errorEnvironment.thrown = \
98 setjmp(unwindProtect_errorEnvironment.buffer)) != 0) { \
103 (*MFMPtrToErrEnvStackPtr) = (*MFMPtrToErrEnvStackPtr)->prev; \
104 if (unwindProtect_errorEnvironment.thrown) { \
105 int MFMThrownFailCode __attribute__ ((unused)) = \
106 unwindProtect_errorEnvironment.thrown; \
Definition: FailPlatformSpecific.h:10
const char * MFMFailCodeReason(int failCode)
Definition: Fail.cpp:14