about summary refs log tree commit diff
path: root/Src/loop.c
diff options
context:
space:
mode:
authorTanaka Akira <akr@users.sourceforge.net>2000-01-31 12:06:08 +0000
committerTanaka Akira <akr@users.sourceforge.net>2000-01-31 12:06:08 +0000
commitb3185342b0f8305c0338e4d0b771b5bc1e71af17 (patch)
treed1ab0f1704742399410197dec7b438bac31b612b /Src/loop.c
parent203a6449791d2575c6907c04f808349d190d4d9a (diff)
downloadzsh-b3185342b0f8305c0338e4d0b771b5bc1e71af17.tar.gz
zsh-b3185342b0f8305c0338e4d0b771b5bc1e71af17.tar.xz
zsh-b3185342b0f8305c0338e4d0b771b5bc1e71af17.zip
zsh-workers/9496
Diffstat (limited to 'Src/loop.c')
-rw-r--r--Src/loop.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/Src/loop.c b/Src/loop.c
index dcdd79e13..f413d4167 100644
--- a/Src/loop.c
+++ b/Src/loop.c
@@ -138,6 +138,8 @@ execfor(Estate state, int do_exec)
 		break;
 	    contflag = 0;
 	}
+	if (retflag)
+	    break;
 	if (iscond && !errflag) {
 	    str = dupstring(advance);
 	    if (isset(XTRACE)) {
@@ -258,7 +260,7 @@ execselect(Estate state, int do_exec)
 		break;
 	    contflag = 0;
 	}
-	if (errflag)
+	if (retflag || errflag)
 	    break;
     }
   done:
@@ -357,6 +359,10 @@ execwhile(Estate state, int do_exec)
 	    lastval = oldval;
 	    break;
 	}
+	if (retflag) {
+	    lastval = oldval;
+	    break;
+	}
 	execlist(state, 1, 0);
 	if (breaks) {
 	    breaks--;
@@ -364,11 +370,13 @@ execwhile(Estate state, int do_exec)
 		break;
 	    contflag = 0;
 	}
-	freeheap();
 	if (errflag) {
 	    lastval = 1;
 	    break;
 	}
+	if (retflag)
+	    break;
+	freeheap();
 	oldval = lastval;
     }
     cmdpop();
@@ -410,6 +418,8 @@ execrepeat(Estate state, int do_exec)
 	    lastval = 1;
 	    break;
 	}
+	if (retflag)
+	    break;
     }
     cmdpop();
     popheap();
@@ -447,6 +457,8 @@ execif(Estate state, int do_exec)
 	    run = 1;
 	    break;
 	}
+	if (retflag)
+	    break;
 	s = 1;
 	state->pc = next;
     }
@@ -532,7 +544,7 @@ execcase(Estate state, int do_exec)
 	if (pprog && pattry(pprog, word)) {
 	    execlist(state, 1, ((WC_CASE_TYPE(code) == WC_CASE_OR) &&
 				do_exec));
-	    while (wc_code(code) == WC_CASE &&
+	    while (!retflag && wc_code(code) == WC_CASE &&
 		   WC_CASE_TYPE(code) == WC_CASE_AND) {
 		state->pc = next;
 		code = *state->pc;