diff options
author | Paul Ackersviller <packersv@users.sourceforge.net> | 2007-11-11 20:15:49 +0000 |
---|---|---|
committer | Paul Ackersviller <packersv@users.sourceforge.net> | 2007-11-11 20:15:49 +0000 |
commit | a2579351a1a33f97fa14e3993b5091e04598f992 (patch) | |
tree | 43c44a25d2e243c6d47e234092a6c57193cb5403 /Src | |
parent | c106b106e54083b9726ab2d522162c4a7e68e7ae (diff) | |
download | zsh-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.c | 8 |
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; } |