From b8ae885ab8252f37b149472c288cf0d1c812324d Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Mon, 25 Aug 2008 17:28:13 +0000 Subject: 25532: problem skipping assignments etc. with setopt ERREXIT --- ChangeLog | 6 ++++++ Src/exec.c | 7 ++++--- Test/C03traps.ztst | 14 ++++++++++++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 475539651..a94adf2fe 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2008-08-25 Peter Stephenson + + * 25532, Src/exec.c, Test/C03traps.ztst: skipping next command + didn't work if it was an assignment or other form tagged as + "simple". + 2008-08-24 Clint Adams * 25521: Completion/Unix/Command/_git: get merge strategies from diff --git a/Src/exec.c b/Src/exec.c index 4cd97b3df..aef97b216 100644 --- a/Src/exec.c +++ b/Src/exec.c @@ -1068,7 +1068,7 @@ execlist(Estate state, int dont_change_job, int exiting) lineno = lnp1 - 1; } - if (sigtrapped[SIGDEBUG] && isset(DEBUGBEFORECMD)) { + if (sigtrapped[SIGDEBUG] && isset(DEBUGBEFORECMD) && !intrap) { int oerrexit_opt = opts[ERREXIT]; opts[ERREXIT] = 0; noerrexit = 1; @@ -1086,11 +1086,12 @@ execlist(Estate state, int dont_change_job, int exiting) donedebug = isset(ERREXIT) ? 2 : 1; opts[ERREXIT] = oerrexit_opt; } else - donedebug = 0; + donedebug = intrap ? 1 : 0; if (ltype & Z_SIMPLE) { next = state->pc + WC_LIST_SKIP(code); - execsimple(state); + if (donedebug != 2) + execsimple(state); state->pc = next; goto sublist_done; } diff --git a/Test/C03traps.ztst b/Test/C03traps.ztst index b663e296f..1e0b4088f 100644 --- a/Test/C03traps.ztst +++ b/Test/C03traps.ztst @@ -415,6 +415,20 @@ >3 three >5 five + # Assignments are a special case, since they use a simpler + # wordcode type, so we need to test skipping them separately. + fn() { + setopt localtraps localoptions debugbeforecmd + trap '(( LINENO == 4 )) && setopt errexit' DEBUG + x=three + x=four + print $LINENO $x + [[ -o errexit ]] && print "Hey, ERREXIT is set!" + } + fn +1:Skip assignment from DEBUG trap +>5 three + %clean rm -f TRAPEXIT -- cgit 1.4.1