From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11468 invoked from network); 2 May 2000 11:15:39 -0000 Received: from sunsite.auc.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 2 May 2000 11:15:39 -0000 Received: (qmail 29333 invoked by alias); 2 May 2000 11:15:28 -0000 Mailing-List: contact zsh-workers-help@sunsite.auc.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 11059 Received: (qmail 29323 invoked from network); 2 May 2000 11:15:27 -0000 Date: Tue, 2 May 2000 13:15:15 +0200 (MET DST) Message-Id: <200005021115.NAA02390@beta.informatik.hu-berlin.de> From: Sven Wischnowsky To: zsh-workers@sunsite.auc.dk In-reply-to: Peter Stephenson's message of Tue, 02 May 2000 10:19:42 +0100 Subject: Re: TRAPZERR() in chpwd() Peter Stephenson wrote: > Paul Ackersviller wrote: > > I believe the change must've come after 3.1.6, since it exhibits the same > > behaviour as 3.0.7 in my experience. It's only 3.1.7-pre-1 and (some?) > > development versions leading up to it. > > Right, I think it's the wordcode stuff. I'm pretty sure I spent some time > (possibly more than once...) getting this right a fair while ago. > > Sven, can you confirm that this is the right fix before I commit it? Or if > not, what is, because this can't be too far away from the right answer. > It seems to work with all the basic tests I've tried. It made things like `false && echo a; echo b' fail. The `echo b' wasn't executed. Hm, why not just setting dontrap unconditionally in the WC_SUBLIST_AND branch? Seems to work fine. No, wait, `{ false && true } || false' doesn't trigger the trap. Hm, is this an old bug? The simplest way to solve this is by saving and restoring donetrap around the execution of the pipelines. I haven't committed the patch... does anyone see a problem with it? Bye Sven Index: Src/exec.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/exec.c,v retrieving revision 1.5 diff -u -r1.5 exec.c --- Src/exec.c 2000/04/10 09:18:27 1.5 +++ Src/exec.c 2000/05/02 11:14:45 @@ -770,7 +770,7 @@ static int donetrap; Wordcode next; wordcode code; - int ret, cj, csp, ltype; + int ret, cj, csp, ltype, odt; int old_pline_level, old_list_pipe, oldlineno; /* * ERREXIT only forces the shell to exit if the last command in a && @@ -809,6 +809,7 @@ code = *state->pc++; while (wc_code(code) == WC_SUBLIST) { next = state->pc + WC_SUBLIST_SKIP(code); + odt = donetrap; if (!oldnoerrexit) noerrexit = (WC_SUBLIST_TYPE(code) != WC_SUBLIST_END); switch (WC_SUBLIST_TYPE(code)) { @@ -818,6 +819,7 @@ execsimple(state); else execpline(state, code, ltype, (ltype & Z_END) && exiting); + donetrap = odt; state->pc = next; goto sublist_done; break; @@ -827,6 +829,7 @@ if ((ret = ((WC_SUBLIST_FLAGS(code) & WC_SUBLIST_SIMPLE) ? execsimple(state) : execpline(state, code, Z_SYNC, 0)))) { + donetrap = odt; state->pc = next; code = *state->pc++; next = state->pc + WC_SUBLIST_SKIP(code); @@ -843,7 +846,9 @@ donetrap = 1; goto sublist_done; } - } + donetrap = 1; + } else + donetrap = odt; cmdpush(CS_CMDAND); break; case WC_SUBLIST_OR: @@ -852,6 +857,7 @@ if (!(ret = ((WC_SUBLIST_FLAGS(code) & WC_SUBLIST_SIMPLE) ? execsimple(state) : execpline(state, code, Z_SYNC, 0)))) { + donetrap = odt; state->pc = next; code = *state->pc++; next = state->pc + WC_SUBLIST_SKIP(code); @@ -868,7 +874,8 @@ donetrap = 1; goto sublist_done; } - } + } else + donetrap = odt; cmdpush(CS_CMDOR); break; } -- Sven Wischnowsky wischnow@informatik.hu-berlin.de