summaryrefslogtreecommitdiff
path: root/jim.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2014-03-19 10:33:25 +1000
committerSteve Bennett <steveb@workware.net.au>2014-03-19 10:33:25 +1000
commit301b522de4d98b26034c2e11167730874224e297 (patch)
tree883f4e1296a69fd9013b9325e999cc2a85fd52ba /jim.c
parentfb3d08fe26e26e638a3d30a45ee865ae0628a861 (diff)
jim.c: Restore errors for Jim_EvalFile()
Jim_EvalFile() needs to explictly add an error stack frame. Reported-by: Florian Schäfer <florian.schaefer+github@gmail.com> Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'jim.c')
-rw-r--r--jim.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/jim.c b/jim.c
index cf6fb8d..9c1143d 100644
--- a/jim.c
+++ b/jim.c
@@ -3620,6 +3620,7 @@ static void SubstObjAddTokens(Jim_Interp *interp, struct ScriptObj *script,
* of the script.
*
* On parse error, sets an error message and returns JIM_ERR
+ * (Note: the object is still converted to a script, even if an error occurs)
*/
static int JimSetScriptFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr)
{
@@ -3629,6 +3630,7 @@ static int JimSetScriptFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr)
struct ScriptObj *script;
ParseTokenList tokenlist;
int line = 1;
+ int retcode = JIM_OK;
/* Try to get information about filename / line number */
if (objPtr->typePtr == &sourceObjType) {
@@ -3645,10 +3647,7 @@ static int JimSetScriptFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr)
parser.tline);
}
- if (JimParseCheckMissing(interp, parser.missing.ch) == JIM_ERR) {
- ScriptTokenListFree(&tokenlist);
- return JIM_ERR;
- }
+ retcode = JimParseCheckMissing(interp, parser.missing.ch);
/* Add a final EOF token */
ScriptAddToken(&tokenlist, scriptText + scriptTextLen, 0, JIM_TT_EOF, 0);
@@ -3663,6 +3662,7 @@ static int JimSetScriptFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr)
else {
script->fileNameObj = interp->emptyObj;
}
+ script->linenr = parser.missing.line;
Jim_IncrRefCount(script->fileNameObj);
ScriptObjAddTokens(interp, script, &tokenlist);
@@ -3675,7 +3675,7 @@ static int JimSetScriptFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr)
Jim_SetIntRepPtr(objPtr, script);
objPtr->typePtr = &scriptObjType;
- return JIM_OK;
+ return retcode;
}
/**
@@ -3683,6 +3683,7 @@ static int JimSetScriptFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr)
* an error message in the interp result.
*
* Otherwise returns a parsed script object.
+ * (Note: the object is still converted to a script, even if an error occurs)
*/
ScriptObj *Jim_GetScript(Jim_Interp *interp, Jim_Obj *objPtr)
{
@@ -11019,6 +11020,8 @@ int Jim_EvalFile(Jim_Interp *interp, const char *filename)
/* Now check the script for unmatched braces, etc. */
if (Jim_GetScript(interp, scriptObjPtr) == NULL) {
+ /* EvalFile changes context, so add a stack frame here */
+ JimAddErrorToStack(interp, JIM_ERR, (ScriptObj *)Jim_GetIntRepPtr(scriptObjPtr));
Jim_DecrRefCount(interp, scriptObjPtr);
return JIM_ERR;
}