Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: Exception handling and "trap" vs. TRAPNAL()
- X-seq: zsh-workers 21814
- From: Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx>
- To: zsh-workers@xxxxxxxxxx
- Subject: Re: Exception handling and "trap" vs. TRAPNAL()
- Date: Mon, 03 Oct 2005 16:50:45 +0000
- In-reply-to: <5929.1128352251@xxxxxxx>
- Mailing-list: contact zsh-workers-help@xxxxxxxxxx; run by ezmlm
- References: <20050929200741.GA1156@DervishD> <20050930124130.45eb0463.pws@xxxxxxx> <20051001153756.GA12183@DervishD> <1051001183818.ZM27904@xxxxxxxxxxxxxxxxxxxxxxx> <20051001202856.GA134@DervishD> <1051002044052.ZM28373@xxxxxxxxxxxxxxxxxxxxxxx> <20051002190940.437F9866F@xxxxxxxxxxxxxxxxxxxxxxxx> <1051002195518.ZM2163@xxxxxxxxxxxxxxxxxxxxxxx> <20051002230027.GA194@DervishD> <1051003013758.ZM3107@xxxxxxxxxxxxxxxxxxxxxxx> <20051003095738.3de5a059.pws@xxxxxxx> <1051003145142.ZM4427@xxxxxxxxxxxxxxxxxxxxxxx> <5929.1128352251@xxxxxxx>
On Oct 3, 4:10pm, Peter Stephenson wrote:
}
} Bart Schaefer wrote:
} > It could also be argued that, if the trap should behave like an "eval",
} > it ought to set $? = 1 when an error occurs inside the trap (but still
} > not cause an interrupt condition). The example of bash2 contradicts
} > that position. Can anyone who is reading this try ksh?
}
} ksh appears to set the status to 1.
Oh, goody.
} > Here's a possible compromise: Use my second patch, but propagate the
} > error if and only if we're in the try-block of an always-construct.
}
} But do you mean how can it test if it's in the try block part? There's
} no explicit test for that at the moment, but it's easy to add a variable.
Yes, that is what I meant.
That gives us something like this (except I'm only half serious about the
emulation part):
Index: Src/loop.c
===================================================================
diff -c -r1.10 loop.c
--- Src/loop.c 18 Feb 2005 17:05:17 -0000 1.10
+++ Src/loop.c 3 Oct 2005 16:31:57 -0000
@@ -627,13 +627,17 @@
try_errflag = -1;
/**/
+zlong
+try_tryflag = 0;
+
+/**/
int
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,7 +646,12 @@
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;
Index: Src/signals.c
===================================================================
RCS file: /extra/cvsroot/zsh/zsh-4.0/Src/signals.c,v
retrieving revision 1.13
diff -c -r1.13 signals.c
--- Src/signals.c 28 May 2005 04:32:49 -0000 1.13
+++ Src/signals.c 3 Oct 2005 16:48:34 -0000
@@ -1003,6 +1003,7 @@
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 @@
* execrestore.
*/
trapret = trapreturn + 1;
- } else if (errflag)
- trapret = 1;
+ }
+ traperr = errflag;
execrestore();
lexrestore();
@@ -1110,6 +1111,10 @@
lastval = trapret-1;
}
} else {
+ if (traperr && emulation != EMULATE_SH)
+ lastval = 1;
+ if (try_tryflag)
+ errflag = traperr;
breaks += obreaks;
if (breaks > loops)
breaks = loops;
Messages sorted by:
Reverse Date,
Date,
Thread,
Author