aboutsummaryrefslogtreecommitdiff
path: root/jim.c
diff options
context:
space:
mode:
authoroharboe <oharboe>2009-08-16 11:38:53 +0000
committeroharboe <oharboe>2009-08-16 11:38:53 +0000
commit79fac897afacf3b234bc094567690b10a89b405c (patch)
tree4e10f23fe31715abd6494271145e104d1d77b7f6 /jim.c
parentd0c5df9ca126ccd1dbc40f75e33b016859d0bfe6 (diff)
downloadjimtcl-79fac897afacf3b234bc094567690b10a89b405c.zip
jimtcl-79fac897afacf3b234bc094567690b10a89b405c.tar.gz
jimtcl-79fac897afacf3b234bc094567690b10a89b405c.tar.bz2
2009-08-16 Steve Bennett <steveb@workware.net.au>
* jim.c: If an error occurs when {expand} is in operation, the line number is wrong.
Diffstat (limited to 'jim.c')
-rw-r--r--jim.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/jim.c b/jim.c
index 9f75861..711ef83 100644
--- a/jim.c
+++ b/jim.c
@@ -8556,6 +8556,7 @@ int Jim_EvalObj(Jim_Interp *interp, Jim_Obj *scriptObjPtr)
int i, j = 0, len;
ScriptObj *script;
ScriptToken *token;
+ ScriptToken *cmdtoken = NULL;
int *cs; /* command structure array */
int retcode = JIM_OK;
Jim_Obj *sargv[JIM_EVAL_SARGV_LEN], **argv = NULL, *tmpObjPtr;
@@ -8615,6 +8616,10 @@ int Jim_EvalObj(Jim_Interp *interp, Jim_Obj *scriptObjPtr)
argv = sargv;
else
argv = Jim_Alloc(sizeof(Jim_Obj*)*argc);
+
+ /* This is the command token. Remember it in the case of error */
+ cmdtoken = &token[i];
+
/* Populate the arguments objects. */
for (j = 0; j < argc; j++) {
int tokens = *cs++;
@@ -8707,7 +8712,7 @@ int Jim_EvalObj(Jim_Interp *interp, Jim_Obj *scriptObjPtr)
interp->cmdPrivData = cmd->privData;
retcode = cmd->cmdProc(interp, argc, argv);
if (retcode == JIM_ERR_ADDSTACK) {
- JimAppendStackTrace(interp, "", script->fileName, token[i-argc*2].linenr);
+ JimAppendStackTrace(interp, "", script->fileName, cmdtoken->linenr);
retcode = JIM_ERR;
}
} else {
@@ -8715,7 +8720,7 @@ int Jim_EvalObj(Jim_Interp *interp, Jim_Obj *scriptObjPtr)
if (retcode == JIM_ERR) {
JimAppendStackTrace(interp,
Jim_GetString(argv[0], NULL), script->fileName,
- token[i-argc*2].linenr);
+ cmdtoken->linenr);
}
}
} else {
@@ -8724,11 +8729,10 @@ int Jim_EvalObj(Jim_Interp *interp, Jim_Obj *scriptObjPtr)
if (retcode == JIM_ERR) {
JimAppendStackTrace(interp,
"", script->fileName,
- token[i-argc*2].linenr);
+ cmdtoken->linenr);
}
}
if (retcode != JIM_OK) {
- i -= argc*2; /* point to the command name. */
goto err;
}
/* Decrement the arguments count */
@@ -8751,7 +8755,7 @@ err:
if (retcode == JIM_ERR && !interp->errorFlag) {
interp->errorFlag = 1;
JimSetErrorFileName(interp, script->fileName);
- JimSetErrorLineNumber(interp, token[i].linenr);
+ JimSetErrorLineNumber(interp, cmdtoken ? cmdtoken->linenr : 0);
JimResetStackTrace(interp);
}
Jim_FreeIntRep(interp, scriptObjPtr);