aboutsummaryrefslogtreecommitdiff
path: root/jim-eventloop.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2010-09-16 09:59:48 +1000
committerSteve Bennett <steveb@workware.net.au>2010-10-15 11:02:54 +1000
commit1f3eccbfe50172710a1190bd1d13f03778d587a1 (patch)
treea573dff0f42df6b397ff9a247b82bb434615e3c6 /jim-eventloop.c
parent53e881d6b688f88db7a701794ab85a6ab418425f (diff)
downloadjimtcl-1f3eccbfe50172710a1190bd1d13f03778d587a1.zip
jimtcl-1f3eccbfe50172710a1190bd1d13f03778d587a1.tar.gz
jimtcl-1f3eccbfe50172710a1190bd1d13f03778d587a1.tar.bz2
Fix some eventloop bugs
bgerror is supposed to be suppressed subsequently if it returns break vwait should error on invalid array element vwait should return an empty result Don't accept 'after info' since it isn't supported Also add some eventloop tests Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'jim-eventloop.c')
-rw-r--r--jim-eventloop.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/jim-eventloop.c b/jim-eventloop.c
index ff94f50..0f34dd3 100644
--- a/jim-eventloop.c
+++ b/jim-eventloop.c
@@ -419,9 +419,21 @@ static int JimELVwaitCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
Jim_WrongNumArgs(interp, 1, argv, "name");
return JIM_ERR;
}
+
+ interp->suppress_bgerror = 0;
+
oldValue = Jim_GetGlobalVariable(interp, argv[1], JIM_NONE);
- if (oldValue)
+ if (oldValue) {
Jim_IncrRefCount(oldValue);
+ }
+ else {
+ /* If a result was left, it is an error */
+ int len;
+ Jim_GetString(interp->result, &len);
+ if (len) {
+ return JIM_ERR;
+ }
+ }
while (1) {
Jim_Obj *currValue;
@@ -439,6 +451,8 @@ static int JimELVwaitCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
}
if (oldValue)
Jim_DecrRefCount(interp, oldValue);
+
+ Jim_SetEmptyResult(interp);
return JIM_OK;
}
@@ -461,18 +475,18 @@ static int JimELAfterCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
jim_wide ms, id;
Jim_Obj *objPtr, *idObjPtr;
const char *options[] = {
- "info", "cancel", NULL
+ "cancel", NULL
};
enum
- { INFO, CANCEL, RESTART, EXPIRE, CREATE };
- int option = CREATE;
+ { AFTER_CANCEL, AFTER_INFO, AFTER_RESTART, AFTER_EXPIRE, AFTER_CREATE };
+ int option = AFTER_CREATE;
if (argc < 2) {
Jim_WrongNumArgs(interp, 1, argv, "<after milliseconds> ?script|cancel <id>?");
return JIM_ERR;
}
if (Jim_GetWide(interp, argv[1], &ms) != JIM_OK) {
- if (Jim_GetEnum(interp, argv[1], options, &option, "after options", JIM_ERRMSG) != JIM_OK) {
+ if (Jim_GetEnum(interp, argv[1], options, &option, NULL, JIM_ERRMSG) != JIM_OK) {
return JIM_ERR;
}
}
@@ -483,7 +497,7 @@ static int JimELAfterCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
return JIM_OK;
}
switch (option) {
- case CREATE:
+ case AFTER_CREATE:
Jim_IncrRefCount(argv[2]);
id = Jim_CreateTimeHandler(interp, ms, JimAfterTimeHandler, argv[2],
JimAfterTimeEventFinalizer);
@@ -495,7 +509,7 @@ static int JimELAfterCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
Jim_DecrRefCount(interp, idObjPtr);
Jim_SetResult(interp, objPtr);
return JIM_OK;
- case CANCEL:{
+ case AFTER_CANCEL:{
int tlen;
jim_wide remain = 0;
const char *tok = Jim_GetString(argv[2], &tlen);
@@ -510,8 +524,6 @@ static int JimELAfterCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
Jim_SetResultString(interp, "invalid event", -1);
return JIM_ERR;
}
- default:
- fprintf(stderr, "unserviced option to after %d\n", option);
}
return JIM_OK;
}