Skip to content

Commit

Permalink
jim api: expose functions to get and set source info
Browse files Browse the repository at this point in the history
Signed-off-by: Steve Bennett <steveb@workware.net.au>
  • Loading branch information
msteveb committed Aug 28, 2024
1 parent c7bc39c commit 1092956
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 58 deletions.
109 changes: 51 additions & 58 deletions jim.c
Original file line number Diff line number Diff line change
Expand Up @@ -3199,17 +3199,6 @@ void DupSourceInternalRep(Jim_Interp *interp, Jim_Obj *srcPtr, Jim_Obj *dupPtr)
Jim_IncrRefCount(dupPtr->internalRep.sourceValue.fileNameObj);
}

static void JimSetSourceInfo(Jim_Interp *interp, Jim_Obj *objPtr,
Jim_Obj *fileNameObj, int lineNumber)
{
JimPanic((Jim_IsShared(objPtr), "JimSetSourceInfo called with shared object"));
JimPanic((objPtr->typePtr != NULL, "JimSetSourceInfo called with typed object"));
Jim_IncrRefCount(fileNameObj);
objPtr->internalRep.sourceValue.fileNameObj = fileNameObj;
objPtr->internalRep.sourceValue.lineNumber = lineNumber;
objPtr->typePtr = &sourceObjType;
}

/* -----------------------------------------------------------------------------
* ScriptLine Object
*
Expand Down Expand Up @@ -3611,7 +3600,7 @@ static void ScriptObjAddTokens(Jim_Interp *interp, struct ScriptObj *script,
/* Every object is initially a string of type 'source', but the
* internal type may be specialized during execution of the
* script. */
JimSetSourceInfo(interp, token->objPtr, script->fileNameObj, t->line);
Jim_SetSourceInfo(interp, token->objPtr, script->fileNameObj, t->line);
token++;
}
}
Expand Down Expand Up @@ -3694,6 +3683,39 @@ static int JimParseCheckMissing(Jim_Interp *interp, int ch)
return JIM_ERR;
}

Jim_Obj *Jim_GetSourceInfo(Jim_Interp *interp, Jim_Obj *objPtr, int *lineptr)
{
int line;
Jim_Obj *fileNameObj;

if (objPtr->typePtr == &sourceObjType) {
fileNameObj = objPtr->internalRep.sourceValue.fileNameObj;
line = objPtr->internalRep.sourceValue.lineNumber;
}
else if (objPtr->typePtr == &scriptObjType) {
ScriptObj *script = JimGetScript(interp, objPtr);
fileNameObj = script->fileNameObj;
line = script->firstline;
}
else {
fileNameObj = interp->emptyObj;
line = 1;
}
*lineptr = line;
return fileNameObj;
}

void Jim_SetSourceInfo(Jim_Interp *interp, Jim_Obj *objPtr,
Jim_Obj *fileNameObj, int lineNumber)
{
JimPanic((Jim_IsShared(objPtr), "Jim_SetSourceInfo called with shared object"));
Jim_FreeIntRep(interp, objPtr);
Jim_IncrRefCount(fileNameObj);
objPtr->internalRep.sourceValue.fileNameObj = fileNameObj;
objPtr->internalRep.sourceValue.lineNumber = lineNumber;
objPtr->typePtr = &sourceObjType;
}

/**
* Similar to ScriptObjAddTokens(), but for subst objects.
*/
Expand Down Expand Up @@ -3732,12 +3754,11 @@ static void JimSetScriptFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr)
struct JimParserCtx parser;
struct ScriptObj *script;
ParseTokenList tokenlist;
int line = 1;
Jim_Obj *fileNameObj;
int line;

/* Try to get information about filename / line number */
if (objPtr->typePtr == &sourceObjType) {
line = objPtr->internalRep.sourceValue.lineNumber;
}
fileNameObj = Jim_GetSourceInfo(interp, objPtr, &line);

/* Initially parse the script into tokens (in tokenlist) */
ScriptTokenListInit(&tokenlist);
Expand All @@ -3756,12 +3777,7 @@ static void JimSetScriptFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr)
script = Jim_Alloc(sizeof(*script));
memset(script, 0, sizeof(*script));
script->inUse = 1;
if (objPtr->typePtr == &sourceObjType) {
script->fileNameObj = objPtr->internalRep.sourceValue.fileNameObj;
}
else {
script->fileNameObj = interp->emptyObj;
}
script->fileNameObj = fileNameObj;
Jim_IncrRefCount(script->fileNameObj);
script->missing = parser.missing.ch;
script->linenr = parser.missing.line;
Expand Down Expand Up @@ -6812,14 +6828,7 @@ static int SetListFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr)
}

/* Try to preserve information about filename / line number */
if (objPtr->typePtr == &sourceObjType) {
fileNameObj = objPtr->internalRep.sourceValue.fileNameObj;
linenr = objPtr->internalRep.sourceValue.lineNumber;
}
else {
fileNameObj = interp->emptyObj;
linenr = 1;
}
fileNameObj = Jim_GetSourceInfo(interp, objPtr, &linenr);
Jim_IncrRefCount(fileNameObj);

/* Get the string representation */
Expand All @@ -6843,7 +6852,7 @@ static int SetListFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr)
if (parser.tt != JIM_TT_STR && parser.tt != JIM_TT_ESC)
continue;
elementPtr = JimParserGetTokenObj(interp, &parser);
JimSetSourceInfo(interp, elementPtr, fileNameObj, parser.tline);
Jim_SetSourceInfo(interp, elementPtr, fileNameObj, parser.tline);
ListAppendElement(objPtr, elementPtr);
}
}
Expand Down Expand Up @@ -9642,7 +9651,7 @@ static int ExprTreeBuildTree(Jim_Interp *interp, struct ExprBuilder *builder, in
objPtr = Jim_NewStringObj(interp, t->token, t->len);
if (t->type == JIM_TT_CMD) {
/* Only commands need source info */
JimSetSourceInfo(interp, objPtr, builder->fileNameObj, t->line);
Jim_SetSourceInfo(interp, objPtr, builder->fileNameObj, t->line);
}
}

Expand Down Expand Up @@ -9742,14 +9751,7 @@ static int SetExprFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr)
int rc = JIM_ERR;

/* Try to get information about filename / line number */
if (objPtr->typePtr == &sourceObjType) {
fileNameObj = objPtr->internalRep.sourceValue.fileNameObj;
line = objPtr->internalRep.sourceValue.lineNumber;
}
else {
fileNameObj = interp->emptyObj;
line = 1;
}
fileNameObj = Jim_GetSourceInfo(interp, objPtr, &line);
Jim_IncrRefCount(fileNameObj);

exprText = Jim_GetString(objPtr, &exprTextLen);
Expand Down Expand Up @@ -11108,7 +11110,9 @@ static Jim_Obj *JimInterpolateTokens(Jim_Interp *interp, const ScriptToken * tok
}
else if (tokens && intv[0] && intv[0]->typePtr == &sourceObjType) {
/* The first interpolated token is source, so preserve the source info */
JimSetSourceInfo(interp, objPtr, intv[0]->internalRep.sourceValue.fileNameObj, intv[0]->internalRep.sourceValue.lineNumber);
int line;
Jim_Obj *fileNameObj = Jim_GetSourceInfo(interp, intv[0], &line);
Jim_SetSourceInfo(interp, objPtr, fileNameObj, line);
}


Expand Down Expand Up @@ -11629,7 +11633,7 @@ int Jim_EvalSource(Jim_Interp *interp, const char *filename, int lineno, const c
scriptObjPtr = Jim_NewStringObj(interp, script, -1);
Jim_IncrRefCount(scriptObjPtr);
if (filename) {
JimSetSourceInfo(interp, scriptObjPtr, Jim_NewStringObj(interp, filename, -1), lineno);
Jim_SetSourceInfo(interp, scriptObjPtr, Jim_NewStringObj(interp, filename, -1), lineno);
}
retval = Jim_EvalObj(interp, scriptObjPtr);
Jim_DecrRefCount(interp, scriptObjPtr);
Expand Down Expand Up @@ -11716,7 +11720,7 @@ int Jim_EvalFile(Jim_Interp *interp, const char *filename)
}

filenameObj = Jim_NewStringObj(interp, filename, -1);
JimSetSourceInfo(interp, scriptObjPtr, filenameObj, 1);
Jim_SetSourceInfo(interp, scriptObjPtr, filenameObj, 1);

oldFilenameObj = JimPushInterpObj(interp->currentFilenameObj, filenameObj);

Expand Down Expand Up @@ -15743,7 +15747,6 @@ static int Jim_InfoCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg
return JIM_OK;

case INFO_SOURCE:{
jim_wide line;
Jim_Obj *resObjPtr;
Jim_Obj *fileNameObj;

Expand All @@ -15752,26 +15755,16 @@ static int Jim_InfoCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg
return JIM_ERR;
}
if (argc == 5) {
jim_wide line;
if (Jim_GetWide(interp, argv[4], &line) != JIM_OK) {
return JIM_ERR;
}
resObjPtr = Jim_NewStringObj(interp, Jim_String(argv[2]), Jim_Length(argv[2]));
JimSetSourceInfo(interp, resObjPtr, argv[3], line);
Jim_SetSourceInfo(interp, resObjPtr, argv[3], line);
}
else {
if (argv[2]->typePtr == &sourceObjType) {
fileNameObj = argv[2]->internalRep.sourceValue.fileNameObj;
line = argv[2]->internalRep.sourceValue.lineNumber;
}
else if (argv[2]->typePtr == &scriptObjType) {
ScriptObj *script = JimGetScript(interp, argv[2]);
fileNameObj = script->fileNameObj;
line = script->firstline;
}
else {
fileNameObj = interp->emptyObj;
line = 1;
}
int line;
fileNameObj = Jim_GetSourceInfo(interp, argv[2], &line);
resObjPtr = Jim_NewListObj(interp, NULL, 0);
Jim_ListAppendElement(interp, resObjPtr, fileNameObj);
Jim_ListAppendElement(interp, resObjPtr, Jim_NewIntObj(interp, line));
Expand Down
8 changes: 8 additions & 0 deletions jim.h
Original file line number Diff line number Diff line change
Expand Up @@ -699,6 +699,14 @@ JIM_EXPORT int Jim_EvalNamespace(Jim_Interp *interp, Jim_Obj *scriptObj, Jim_Obj
JIM_EXPORT int Jim_SubstObj (Jim_Interp *interp, Jim_Obj *substObjPtr,
Jim_Obj **resObjPtrPtr, int flags);

/* source information */
JIM_EXPORT Jim_Obj *Jim_GetSourceInfo(Jim_Interp *interp, Jim_Obj *objPtr,
int *lineptr);
/* may only be called on an unshared object */
JIM_EXPORT void Jim_SetSourceInfo(Jim_Interp *interp, Jim_Obj *objPtr,
Jim_Obj *fileNameObj, int lineNumber);


/* stack */
JIM_EXPORT void Jim_InitStack(Jim_Stack *stack);
JIM_EXPORT void Jim_FreeStack(Jim_Stack *stack);
Expand Down

0 comments on commit 1092956

Please sign in to comment.