#include #include #include // for now #include "../include/except.h" struct Except_Frame *except_stack = NULL; void except_raise(const struct Exception *e, const char *file,int line) { #ifdef WIN32 struct Except_Frame *p; if (except_index == -1) except_init(); p = TlsGetValue(except_index); #else struct Except_Frame *p = except_stack; #endif assert(e); if (p == NULL) { fprintf(stderr, "Uncaught exception"); if (e->reason) fprintf(stderr, " %s", e->reason); else fprintf(stderr, " at 0x%p", (void*)e); if (file && line > 0) fprintf(stderr, " raised at %s:%d\n", file, line); fprintf(stderr, "aborting...\n"); fflush(stderr); abort(); } p->exception = e; p->file = file; p->line = line; #ifdef WIN32 except_pop(); #else except_stack = except_stack->prev; #endif longjmp(p->env, EXCEPT_STATE_RAISED); } #ifdef WIN32 _CRTIMP void __cdecl _assert(void *, void *, unsigned); #undef assert #define assert(e) ((e) || (_assert(#e, __FILE__, __LINE__), 0)) int except_index = -1; void except_init(void) { BOOL cond; except_index = TlsAlloc(); assert(except_index != TLS_OUT_OF_INDEXES); cond = TlsSetValue(except_index, NULL); assert(cond == TRUE); } void Except_push(Except_Frame *fp) { BOOL cond; fp->prev = TlsGetValue(except_index); cond = TlsSetValue(except_index, fp); assert(cond == TRUE); } void Except_pop(void) { BOOL cond; Except_Frame *tos = TlsGetValue(Except_index); cond = TlsSetValue(except_index, tos->prev); assert(cond == TRUE); } #endif