@@ -155,7 +155,6 @@ static void JimPrngSeed(Jim_Interp *interp, unsigned char *seed, int seedLen);
155
155
static void JimRandomBytes(Jim_Interp *interp, void *dest, unsigned int len);
156
156
static int JimSetNewVariable(Jim_HashTable *ht, Jim_Obj *nameObjPtr, Jim_VarVal *vv);
157
157
static Jim_VarVal *JimFindVariable(Jim_HashTable *ht, Jim_Obj *nameObjPtr);
158
- static void JimSetErrorStack(Jim_Interp *interp);
159
158
static int SetVariableFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr);
160
159
161
160
#define JIM_DICT_SUGAR 100 /* Only returned by SetVariableFromAny() */
@@ -3357,6 +3356,7 @@ typedef struct ScriptObj
3357
3356
static void JimSetScriptFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr);
3358
3357
static int JimParseCheckMissing(Jim_Interp *interp, int ch);
3359
3358
static ScriptObj *JimGetScript(Jim_Interp *interp, Jim_Obj *objPtr);
3359
+ static void JimSetErrorStack(Jim_Interp *interp, ScriptObj *script);
3360
3360
3361
3361
void FreeScriptInternalRep(Jim_Interp *interp, Jim_Obj *objPtr)
3362
3362
{
@@ -6050,16 +6050,27 @@ static void JimSetStackTrace(Jim_Interp *interp, Jim_Obj *stackTraceObj)
6050
6050
interp->errorFlag = 1;
6051
6051
}
6052
6052
6053
- static void JimSetErrorStack(Jim_Interp *interp)
6053
+ static void JimSetErrorStack(Jim_Interp *interp, ScriptObj *script )
6054
6054
{
6055
6055
if (!interp->errorFlag) {
6056
6056
int i;
6057
6057
Jim_Obj *stackTrace = Jim_NewListObj(interp, NULL, 0);
6058
6058
6059
- for (i = 0; i <= interp->procLevel; i++) {
6060
- Jim_EvalFrame *frame = JimGetEvalFrameByProcLevel(interp, -i);
6061
- if (frame) {
6062
- JimAddStackFrame(interp, frame, stackTrace);
6059
+ if (interp->procLevel == 0 && script) {
6060
+ /* If this is at the top level and there is a script, use the script info
6061
+ * rather than the proc info
6062
+ */
6063
+ Jim_ListAppendElement(interp, stackTrace, interp->emptyObj);
6064
+ Jim_ListAppendElement(interp, stackTrace, script->fileNameObj);
6065
+ Jim_ListAppendElement(interp, stackTrace, Jim_NewIntObj(interp, script->linenr));
6066
+ Jim_ListAppendElement(interp, stackTrace, interp->emptyObj);
6067
+ }
6068
+ else {
6069
+ for (i = 0; i <= interp->procLevel; i++) {
6070
+ Jim_EvalFrame *frame = JimGetEvalFrameByProcLevel(interp, -i);
6071
+ if (frame) {
6072
+ JimAddStackFrame(interp, frame, stackTrace);
6073
+ }
6063
6074
}
6064
6075
}
6065
6076
JimSetStackTrace(interp, stackTrace);
@@ -10862,7 +10873,7 @@ static int JimInvokeCommand(Jim_Interp *interp, int objc, Jim_Obj *const *objv)
10862
10873
retcode = cmdPtr->u.native.cmdProc(interp, objc, objv);
10863
10874
}
10864
10875
if (retcode == JIM_ERR) {
10865
- JimSetErrorStack(interp);
10876
+ JimSetErrorStack(interp, NULL );
10866
10877
}
10867
10878
}
10868
10879
@@ -10900,7 +10911,7 @@ static int JimInvokeCommand(Jim_Interp *interp, int objc, Jim_Obj *const *objv)
10900
10911
JimDecrCmdRefCount(interp, cmdPtr);
10901
10912
10902
10913
if (retcode == JIM_ERR) {
10903
- JimSetErrorStack(interp);
10914
+ JimSetErrorStack(interp, NULL );
10904
10915
}
10905
10916
10906
10917
if (interp->framePtr->tailcallObj) {
@@ -11157,7 +11168,7 @@ int Jim_EvalObj(Jim_Interp *interp, Jim_Obj *scriptObjPtr)
11157
11168
Jim_IncrRefCount(scriptObjPtr); /* Make sure it's shared. */
11158
11169
script = JimGetScript(interp, scriptObjPtr);
11159
11170
if (JimParseCheckMissing(interp, script->missing) == JIM_ERR) {
11160
- JimSetErrorStack(interp);
11171
+ JimSetErrorStack(interp, script );
11161
11172
Jim_DecrRefCount(interp, scriptObjPtr);
11162
11173
return JIM_ERR;
11163
11174
}
@@ -11360,7 +11371,7 @@ int Jim_EvalObj(Jim_Interp *interp, Jim_Obj *scriptObjPtr)
11360
11371
11361
11372
/* Possibly add to the error stack trace */
11362
11373
if (retcode == JIM_ERR) {
11363
- JimSetErrorStack(interp);
11374
+ JimSetErrorStack(interp, NULL );
11364
11375
}
11365
11376
11366
11377
JimPopEvalFrame(interp);
0 commit comments