From 20f694d101ae72d2ffecc28abe90144ffeeb27e4 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Sun, 7 Dec 2014 19:18:23 +0000 Subject: 33911: turn off ERRFLAG_INT for always block. Restore bit thereafter: we probably need a new variable in order to allow user interrupts to be reset in the always block. --- Src/loop.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/Src/loop.c b/Src/loop.c index 69805ea9e..9b0a8d79c 100644 --- a/Src/loop.c +++ b/Src/loop.c @@ -643,7 +643,7 @@ exectry(Estate state, int do_exec) { Wordcode end, always; int endval; - int save_retflag, save_breaks, save_contflag; + int save_retflag, save_breaks, save_contflag, try_interrupt; zlong save_try_errflag, save_try_tryflag; end = state->pc + WC_TRY_SKIP(state->pc[-1]); @@ -671,8 +671,10 @@ exectry(Estate state, int do_exec) /* The always clause. */ save_try_errflag = try_errflag; - try_errflag = (zlong)errflag; - errflag &= ~ERRFLAG_ERROR; + try_errflag = (zlong)(errflag & ERRFLAG_ERROR); + try_interrupt = errflag & ERRFLAG_INT; + /* We need to reset all errors to allow the block to execute */ + errflag = 0; save_retflag = retflag; retflag = 0; save_breaks = breaks; @@ -687,6 +689,17 @@ exectry(Estate state, int do_exec) errflag |= ERRFLAG_ERROR; else errflag &= ~ERRFLAG_ERROR; + /* + * TODO: currently, we always restore the interrupt + * error status. We should have a way of clearing it. + * Doing this with try_errflag (the shell variable TRY_BLOCK_ERROR) + * is probably not a good idea since currently that's documented + * such that setting it to 0 clears errors, and we don't want + * to clear interrupts as a side effect. So it probably needs + * a different variable. + */ + if (try_interrupt) + errflag |= ERRFLAG_INT; try_errflag = save_try_errflag; if (!retflag) retflag = save_retflag; -- cgit 1.4.1