aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--jim.c14
2 files changed, 11 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 0019bcb..239450e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,6 @@
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.
* jim.c/h: If an object is used in subst, then source, a crash will result
* jimsh.c: A script exiting with 'exit 0' would not give a return code of 0
* jim.c: Make [format %c 0] work (embedded nulls)
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);