diff options
| author | Toby Goodwin <toby@paccrat.org> | 2018-03-17 18:32:40 +0000 |
|---|---|---|
| committer | Toby Goodwin <toby@paccrat.org> | 2018-03-17 18:32:40 +0000 |
| commit | e7b1461bb4ff9fed1b1240e50726012e365f160d (patch) | |
| tree | 8187e5070ef89146dbc1db61421207daf9a8b522 /except.c | |
| parent | cccdab7ea2bb922413f02698ecc5969c00e7a7aa (diff) | |
| parent | d18aac739636fd9ae1f84fef8347f46216fb8d9c (diff) | |
Merge branch 'continue'
Diffstat (limited to 'except.c')
| -rw-r--r-- | except.c | 9 |
1 files changed, 6 insertions, 3 deletions
@@ -22,13 +22,14 @@ extern void except(ecodes e, Edata data, Estack *ex) { estack = ex; estack->e = e; estack->data = data; - if (e == eError || e == eBreak || e == eReturn) + if (e == eError || e == eBreak || e == eReturn || e == eContinue) estack->interactive = interactive; } /* remove an exception, restore last interactive value */ -extern void unexcept() { +extern void unexcept(ecodes e) { + assert(e == estack->e); switch (estack->e) { default: break; @@ -66,8 +67,10 @@ extern void rc_raise(ecodes e) { exit(1); /* child processes exit on an error/signal */ for (; estack != NULL; estack = estack->prev) if (estack->e != e) { - if (e == eBreak && estack->e != eArena && estack->e != eVarstack) + if (e == eBreak && (estack->e != eArena && estack->e != eVarstack && estack->e != eContinue)) rc_error("break outside of loop"); + else if (e == eContinue && (estack->e != eVarstack)) + rc_error("continue outside of loop"); else if (e == eReturn && estack->e == eError) /* can return from loops inside functions */ rc_error("return outside of function"); switch (estack->e) { |