about summary refs log tree commit diff
path: root/Src
diff options
context:
space:
mode:
authorPaul Ackersviller <packersv@users.sourceforge.net>2007-11-11 20:15:49 +0000
committerPaul Ackersviller <packersv@users.sourceforge.net>2007-11-11 20:15:49 +0000
commita2579351a1a33f97fa14e3993b5091e04598f992 (patch)
tree43c44a25d2e243c6d47e234092a6c57193cb5403 /Src
parentc106b106e54083b9726ab2d522162c4a7e68e7ae (diff)
downloadzsh-a2579351a1a33f97fa14e3993b5091e04598f992.tar.gz
zsh-a2579351a1a33f97fa14e3993b5091e04598f992.tar.xz
zsh-a2579351a1a33f97fa14e3993b5091e04598f992.zip
Merge of 23101: : ZERR traps had various odd features when combined with function returns.
Diffstat (limited to 'Src')
-rw-r--r--Src/signals.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/Src/signals.c b/Src/signals.c
index 8b70c880a..a6c60b604 100644
--- a/Src/signals.c
+++ b/Src/signals.c
@@ -975,6 +975,7 @@ dotrapargs(int sig, int *sigtr, void *sigfn)
     char *name, num[4];
     int trapret = 0;
     int obreaks = breaks;
+    int oretflag = retflag;
     int isfunc;
 
     /* if signal is being ignored or the trap function		      *
@@ -1012,7 +1013,7 @@ dotrapargs(int sig, int *sigtr, void *sigfn)
 
     lexsave();
     execsave();
-    breaks = 0;
+    breaks = retflag = 0;
     runhookdef(BEFORETRAPHOOK, NULL);
     if (*sigtr & ZSIG_FUNC) {
 	int osc = sfcontext;
@@ -1079,11 +1080,16 @@ dotrapargs(int sig, int *sigtr, void *sigfn)
 	if (isfunc) {
 	    breaks = loops;
 	    errflag = 1;
+	    lastval = trapret;
 	} else {
 	    lastval = trapret-1;
 	}
+	/* return triggered */
+	retflag = 1;
     } else {
 	breaks += obreaks;
+	/* return not triggered: restore old flag */
+	retflag = oretflag;
 	if (breaks > loops)
 	    breaks = loops;
     }