aboutsummaryrefslogtreecommitdiff
path: root/jim.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.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.c')
-rw-r--r--jim.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/jim.c b/jim.c
index 58d47a9..732253f 100644
--- a/jim.c
+++ b/jim.c
@@ -4670,6 +4670,7 @@ Jim_Interp *Jim_CreateInterp(void)
i->unknown = Jim_NewStringObj(i, "unknown", -1);
i->unknown_called = 0;
i->errorProc = i->emptyObj;
+ i->suppress_bgerror = 0;
i->currentScriptObj = Jim_NewEmptyStringObj(i);
Jim_IncrRefCount(i->emptyObj);
Jim_IncrRefCount(i->result);
@@ -9886,17 +9887,24 @@ int Jim_EvalObjBackground(Jim_Interp *interp, Jim_Obj *scriptObjPtr)
retval = Jim_EvalObj(interp, scriptObjPtr);
interp->framePtr = savedFramePtr;
/* Try to report the error (if any) via the bgerror proc */
- if (retval != JIM_OK) {
+ if (retval != JIM_OK && !interp->suppress_bgerror) {
Jim_Obj *objv[2];
+ int rc = JIM_ERR;
objv[0] = Jim_NewStringObj(interp, "bgerror", -1);
objv[1] = Jim_GetResult(interp);
Jim_IncrRefCount(objv[0]);
Jim_IncrRefCount(objv[1]);
- if (Jim_GetCommand(interp, objv[0], JIM_NONE) == NULL || Jim_EvalObjVector(interp, 2, objv) != JIM_OK) {
- /* Report the error to stderr. */
- fprintf(stderr, "Background error:" JIM_NL);
- Jim_PrintErrorMessage(interp);
+ if (Jim_GetCommand(interp, objv[0], JIM_NONE) == NULL || (rc = Jim_EvalObjVector(interp, 2, objv)) != JIM_OK) {
+ if (rc == JIM_BREAK) {
+ /* No more bgerror calls */
+ interp->suppress_bgerror++;
+ }
+ else {
+ /* Report the error to stderr. */
+ fprintf(stderr, "Background error:" JIM_NL);
+ Jim_PrintErrorMessage(interp);
+ }
}
Jim_DecrRefCount(interp, objv[0]);
Jim_DecrRefCount(interp, objv[1]);