aboutsummaryrefslogtreecommitdiff
path: root/jim.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2013-07-22 10:29:42 +1000
committerSteve Bennett <steveb@workware.net.au>2013-07-22 10:46:20 +1000
commitc8df8ad4f5fed5a9c85498987e9b416e69fb3b44 (patch)
treeb68919687ad14c7496c009b42c3da28586ff4954 /jim.c
parent5ca6b7ff651246cec3a09a94fda36dc5872fa759 (diff)
downloadjimtcl-c8df8ad4f5fed5a9c85498987e9b416e69fb3b44.zip
jimtcl-c8df8ad4f5fed5a9c85498987e9b416e69fb3b44.tar.gz
jimtcl-c8df8ad4f5fed5a9c85498987e9b416e69fb3b44.tar.bz2
Ensure that signals can break vwait
The following should break when a handled signal is caught. catch -signal { vwait forever } Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'jim.c')
-rw-r--r--jim.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/jim.c b/jim.c
index b2d5853..d8c71da 100644
--- a/jim.c
+++ b/jim.c
@@ -10516,8 +10516,8 @@ int Jim_EvalObj(Jim_Interp *interp, Jim_Obj *scriptObjPtr)
if (retcode == JIM_OK && argc) {
/* Invoke the command */
retcode = JimInvokeCommand(interp, argc, argv);
- if (interp->signal_level && interp->sigmask) {
- /* Check for a signal after each command */
+ /* Check for a signal after each command */
+ if (Jim_CheckSignal(interp)) {
retcode = JIM_SIGNAL;
}
}
@@ -13679,6 +13679,15 @@ static int Jim_ExitCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg
return JIM_EXIT;
}
+/**
+ * Returns 1 if a signal has been received while
+ * in a catch -signal {} clause.
+ */
+int Jim_CheckSignal(Jim_Interp *interp)
+{
+ return interp->signal_level && interp->sigmask;
+}
+
/* [catch] */
static int Jim_CatchCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
{
@@ -13750,7 +13759,7 @@ static int Jim_CatchCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *ar
}
interp->signal_level += sig;
- if (interp->signal_level && interp->sigmask) {
+ if (Jim_CheckSignal(interp)) {
/* If a signal is set, don't even try to execute the body */
exitCode = JIM_SIGNAL;
}