aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2024-01-31 08:09:00 +1000
committerSteve Bennett <steveb@workware.net.au>2024-02-02 11:20:41 +1000
commita227bf74d2fc5013fed3d3de025086c586bc950c (patch)
tree144875000ec85d5f65c89898846bd0de22b7e978
parentadb3252e5b213579ad26f101c25461c78829569c (diff)
downloadjimtcl-a227bf74d2fc5013fed3d3de025086c586bc950c.zip
jimtcl-a227bf74d2fc5013fed3d3de025086c586bc950c.tar.gz
jimtcl-a227bf74d2fc5013fed3d3de025086c586bc950c.tar.bz2
xtrace: fix core dump if tracing Jim_EvalObjVector()
Where a NULL script is pushed on the stack Fixes #290 Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r--jim.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/jim.c b/jim.c
index c8dc5ce..396c662 100644
--- a/jim.c
+++ b/jim.c
@@ -10714,13 +10714,18 @@ static int JimTraceCallback(Jim_Interp *interp, const char *type, int argc, Jim_
Jim_Obj *nargv[7];
Jim_Obj *traceCmdObj = interp->traceCmdObj;
Jim_Obj *resultObj = Jim_GetResult(interp);
+ ScriptObj *script = NULL;
+
/* Where were we called from? */
- ScriptObj *script = JimGetScript(interp, interp->evalFrame->scriptObj);
+ /* This may be NULL for Jim_EvalObjVector() */
+ if (interp->evalFrame->scriptObj) {
+ script = JimGetScript(interp, interp->evalFrame->scriptObj);
+ }
nargv[0] = traceCmdObj;
nargv[1] = Jim_NewStringObj(interp, type, -1);
- nargv[2] = script->fileNameObj;
- nargv[3] = Jim_NewIntObj(interp, script->linenr);
+ nargv[2] = script ? script->fileNameObj : interp->emptyObj;
+ nargv[3] = Jim_NewIntObj(interp, script ? script->linenr : 1);
nargv[4] = resultObj;
nargv[5] = argv[0];
nargv[6] = Jim_NewListObj(interp, argv + 1, argc - 1);
@@ -10921,6 +10926,7 @@ int Jim_EvalObjVector(Jim_Interp *interp, int objc, Jim_Obj *const *objv)
for (i = 0; i < objc; i++)
Jim_IncrRefCount(objv[i]);
+ /* Note that we have no source for this command so push NULL as the scriptObj */
JimPushEvalFrame(interp, &frame, NULL);
retcode = JimInvokeCommand(interp, objc, objv);