diff options
author | oharboe <oharboe> | 2009-08-16 11:38:53 +0000 |
---|---|---|
committer | oharboe <oharboe> | 2009-08-16 11:38:53 +0000 |
commit | 79fac897afacf3b234bc094567690b10a89b405c (patch) | |
tree | 4e10f23fe31715abd6494271145e104d1d77b7f6 /jim.c | |
parent | d0c5df9ca126ccd1dbc40f75e33b016859d0bfe6 (diff) | |
download | jimtcl-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.c | 14 |
1 files changed, 9 insertions, 5 deletions
@@ -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); |