72 lines
1.5 KiB
C
72 lines
1.5 KiB
C
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <assert.h> // 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
|