Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Exception handling and "trap" vs. TRAPNAL()



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