From 174ad4a80fa13a843a319c516e703ae74858ad39 Mon Sep 17 00:00:00 2001 From: Bart Schaefer Date: Thu, 15 Dec 2005 04:24:04 +0000 Subject: 21814: error handling for traps in "always" constructs. --- Src/loop.c | 11 ++++++++++- Src/signals.c | 9 +++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) (limited to 'Src') diff --git a/Src/loop.c b/Src/loop.c index 56c76b4bb..a29ac1982 100644 --- a/Src/loop.c +++ b/Src/loop.c @@ -626,6 +626,10 @@ execcase(Estate state, int do_exec) zlong try_errflag = -1; +/**/ +zlong +try_tryflag = 0; + /**/ int exectry(Estate state, int do_exec) @@ -633,7 +637,7 @@ exectry(Estate state, int do_exec) Wordcode end, always; int endval; int save_retflag, save_breaks, save_loops, save_contflag; - zlong save_try_errflag; + zlong save_try_errflag, save_try_tryflag; end = state->pc + WC_TRY_SKIP(state->pc[-1]); always = state->pc + 1 + WC_TRY_SKIP(*state->pc); @@ -642,8 +646,13 @@ exectry(Estate state, int do_exec) cmdpush(CS_CURSH); /* The :try clause */ + save_try_tryflag = try_tryflag; + try_tryflag = 1; + execlist(state, 1, do_exec); + try_tryflag = save_try_tryflag; + /* Don't record errflag here, may be reset. */ endval = lastval; diff --git a/Src/signals.c b/Src/signals.c index e9571ef5b..0b508f869 100644 --- a/Src/signals.c +++ b/Src/signals.c @@ -1003,6 +1003,7 @@ dotrapargs(int sig, int *sigtr, void *sigfn) int trapret = 0; int obreaks = breaks; int isfunc; + int traperr; /* if signal is being ignored or the trap function * * is NULL, then return * @@ -1097,8 +1098,8 @@ dotrapargs(int sig, int *sigtr, void *sigfn) * execrestore. */ trapret = trapreturn + 1; - } else if (errflag) - trapret = 1; + } + traperr = errflag; execrestore(); lexrestore(); @@ -1110,6 +1111,10 @@ dotrapargs(int sig, int *sigtr, void *sigfn) lastval = trapret-1; } } else { + if (traperr && emulation != EMULATE_SH) + lastval = 1; + if (try_tryflag) + errflag = traperr; breaks += obreaks; if (breaks > loops) breaks = loops; -- cgit 1.4.1