Damien | ce89a21 | 2013-10-15 22:25:17 +0100 | [diff] [blame] | 1 | // non-local return |
| 2 | // exception handling, basically a stack of setjmp/longjmp buffers |
| 3 | |
| 4 | #include <limits.h> |
| 5 | |
Damien | 152568b | 2013-10-16 00:46:39 +0100 | [diff] [blame] | 6 | //#ifndef __WORDSIZE |
| 7 | //#error __WORDSIZE needs to be defined |
| 8 | //#endif |
Damien | ce89a21 | 2013-10-15 22:25:17 +0100 | [diff] [blame] | 9 | |
| 10 | typedef struct _nlr_buf_t nlr_buf_t; |
| 11 | struct _nlr_buf_t { |
| 12 | // the entries here must all be machine word size |
| 13 | nlr_buf_t *prev; |
| 14 | void *ret_val; |
| 15 | #if __WORDSIZE == 32 |
| 16 | void *regs[6]; |
| 17 | #elif __WORDSIZE == 64 |
| 18 | void *regs[8]; |
| 19 | #else |
Damien | 152568b | 2013-10-16 00:46:39 +0100 | [diff] [blame] | 20 | // hack for thumb |
| 21 | void *regs[10]; |
| 22 | //#error Unsupported __WORDSIZE |
Damien | ce89a21 | 2013-10-15 22:25:17 +0100 | [diff] [blame] | 23 | #endif |
| 24 | }; |
| 25 | |
| 26 | unsigned int nlr_push(nlr_buf_t *); |
Damien | 8b3a7c2 | 2013-10-23 20:20:17 +0100 | [diff] [blame] | 27 | void nlr_pop(void); |
Damien | ce89a21 | 2013-10-15 22:25:17 +0100 | [diff] [blame] | 28 | void nlr_jump(void *val) __attribute__((noreturn)); |