|
30 | 30 | // exception handling, basically a stack of setjmp/longjmp buffers |
31 | 31 |
|
32 | 32 | #include <limits.h> |
33 | | -#include <setjmp.h> |
34 | 33 | #include <assert.h> |
35 | 34 |
|
36 | 35 | #include "py/mpconfig.h" |
37 | 36 |
|
38 | | -typedef struct _nlr_buf_t nlr_buf_t; |
39 | | -struct _nlr_buf_t { |
40 | | - // the entries here must all be machine word size |
41 | | - nlr_buf_t *prev; |
42 | | - void *ret_val; // always a concrete object (an exception instance) |
43 | | -#if !defined(MICROPY_NLR_SETJMP) || !MICROPY_NLR_SETJMP |
| 37 | +// If MICROPY_NLR_SETJMP is not enabled then auto-detect the machine arch |
| 38 | +#if !MICROPY_NLR_SETJMP |
44 | 39 | #if defined(__i386__) |
45 | | - void *regs[6]; |
| 40 | + #define MICROPY_NLR_X86 (1) |
| 41 | + #define MICROPY_NLR_NUM_REGS (6) |
46 | 42 | #elif defined(__x86_64__) |
47 | | - #if defined(__CYGWIN__) |
48 | | - void *regs[12]; |
49 | | - #else |
50 | | - void *regs[8]; |
51 | | - #endif |
| 43 | + #define MICROPY_NLR_X64 (1) |
| 44 | + #if defined(__CYGWIN__) |
| 45 | + #define MICROPY_NLR_NUM_REGS (12) |
| 46 | + #else |
| 47 | + #define MICROPY_NLR_NUM_REGS (8) |
| 48 | + #endif |
52 | 49 | #elif defined(__thumb2__) || defined(__thumb__) || defined(__arm__) |
53 | | - void *regs[10]; |
| 50 | + #define MICROPY_NLR_THUMB (1) |
| 51 | + #define MICROPY_NLR_NUM_REGS (10) |
54 | 52 | #elif defined(__xtensa__) |
55 | | - void *regs[10]; |
| 53 | + #define MICROPY_NLR_XTENSA (1) |
| 54 | + #define MICROPY_NLR_NUM_REGS (10) |
56 | 55 | #else |
57 | 56 | #define MICROPY_NLR_SETJMP (1) |
58 | 57 | //#warning "No native NLR support for this arch, using setjmp implementation" |
59 | 58 | #endif |
60 | 59 | #endif |
61 | 60 |
|
62 | 61 | #if MICROPY_NLR_SETJMP |
63 | | - jmp_buf jmpbuf; |
| 62 | +#include <setjmp.h> |
64 | 63 | #endif |
65 | 64 |
|
| 65 | +typedef struct _nlr_buf_t nlr_buf_t; |
| 66 | +struct _nlr_buf_t { |
| 67 | + // the entries here must all be machine word size |
| 68 | + nlr_buf_t *prev; |
| 69 | + void *ret_val; // always a concrete object (an exception instance) |
| 70 | + |
| 71 | + #if MICROPY_NLR_SETJMP |
| 72 | + jmp_buf jmpbuf; |
| 73 | + #else |
| 74 | + void *regs[MICROPY_NLR_NUM_REGS]; |
| 75 | + #endif |
| 76 | + |
66 | 77 | #if MICROPY_ENABLE_PYSTACK |
67 | 78 | void *pystack; |
68 | 79 | #endif |
@@ -123,7 +134,6 @@ NORETURN void nlr_jump_fail(void *val); |
123 | 134 | /* |
124 | 135 | #define nlr_push(val) \ |
125 | 136 | printf("nlr_push: before: nlr_top=%p, val=%p\n", MP_STATE_THREAD(nlr_top), val),assert(MP_STATE_THREAD(nlr_top) != val),nlr_push(val) |
126 | | -#endif |
127 | 137 | */ |
128 | 138 | #endif |
129 | 139 |
|
|
0 commit comments