aboutsummaryrefslogtreecommitdiff
path: root/py/nlrsetjmp.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2017-04-12 13:50:31 +1000
committerDamien George <damien.p.george@gmail.com>2017-04-12 13:50:31 +1000
commit08242eed2677cde806fd9c0de33138a8491293a2 (patch)
treef452a3b75efb4f7c5ace348927207f55f53c28ed /py/nlrsetjmp.c
parentfe79234ca0e371af4c252e31e218d81d8171deee (diff)
py/nlrsetjmp: Add check for failed NLR jump.
Also optimise the function so it only needs to call the MP_STATE_THREAD macro once (following how other nlr code is written).
Diffstat (limited to 'py/nlrsetjmp.c')
-rw-r--r--py/nlrsetjmp.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/py/nlrsetjmp.c b/py/nlrsetjmp.c
index 43a13156f..c3873e0b6 100644
--- a/py/nlrsetjmp.c
+++ b/py/nlrsetjmp.c
@@ -29,10 +29,14 @@
#if MICROPY_NLR_SETJMP
void nlr_setjmp_jump(void *val) {
- nlr_buf_t *buf = MP_STATE_THREAD(nlr_top);
- MP_STATE_THREAD(nlr_top) = buf->prev;
- buf->ret_val = val;
- longjmp(buf->jmpbuf, 1);
+ nlr_buf_t **top_ptr = &MP_STATE_THREAD(nlr_top);
+ nlr_buf_t *top = *top_ptr;
+ if (top == NULL) {
+ nlr_jump_fail(val);
+ }
+ top->ret_val = val;
+ *top_ptr = top->prev;
+ longjmp(top->jmpbuf, 1);
}
#endif