diff options
author | Damien George <damien.p.george@gmail.com> | 2017-04-12 13:50:31 +1000 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2017-04-12 13:50:31 +1000 |
commit | 08242eed2677cde806fd9c0de33138a8491293a2 (patch) | |
tree | f452a3b75efb4f7c5ace348927207f55f53c28ed /py/nlrsetjmp.c | |
parent | fe79234ca0e371af4c252e31e218d81d8171deee (diff) | |
download | micropython-08242eed2677cde806fd9c0de33138a8491293a2.tar.gz micropython-08242eed2677cde806fd9c0de33138a8491293a2.zip |
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.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/py/nlrsetjmp.c b/py/nlrsetjmp.c index 43a13156f2..c3873e0b6d 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 |