summaryrefslogtreecommitdiff
path: root/except.c
diff options
context:
space:
mode:
authorToby Goodwin <toby@paccrat.org>2018-03-17 18:32:40 +0000
committerToby Goodwin <toby@paccrat.org>2018-03-17 18:32:40 +0000
commite7b1461bb4ff9fed1b1240e50726012e365f160d (patch)
tree8187e5070ef89146dbc1db61421207daf9a8b522 /except.c
parentcccdab7ea2bb922413f02698ecc5969c00e7a7aa (diff)
parentd18aac739636fd9ae1f84fef8347f46216fb8d9c (diff)
Merge branch 'continue'
Diffstat (limited to 'except.c')
-rw-r--r--except.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/except.c b/except.c
index 37696c4..aeb1da9 100644
--- a/except.c
+++ b/except.c
@@ -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) {