diff options
author | Steve Bennett <steveb@workware.net.au> | 2014-12-03 13:50:38 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2014-12-09 13:07:55 +1000 |
commit | b807e3c1640870464ced1859c29d200188df12ab (patch) | |
tree | 16c882a2df213df8365316870d9715e282910430 /jim.c | |
parent | 9d6004a26d406aa9331fae3ffcb26be298be552d (diff) | |
download | jimtcl-b807e3c1640870464ced1859c29d200188df12ab.zip jimtcl-b807e3c1640870464ced1859c29d200188df12ab.tar.gz jimtcl-b807e3c1640870464ced1859c29d200188df12ab.tar.bz2 |
add support for [info source ?filename line?]
Allows a script to be created with explicit source info
Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'jim.c')
-rw-r--r-- | jim.c | 41 |
1 files changed, 25 insertions, 16 deletions
@@ -14495,30 +14495,39 @@ static int Jim_InfoCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg break; case INFO_SOURCE:{ - int line; + jim_wide line; Jim_Obj *resObjPtr; Jim_Obj *fileNameObj; - if (argc != 3) { - Jim_WrongNumArgs(interp, 2, argv, "source"); + if (argc != 3 && argc != 5) { + Jim_WrongNumArgs(interp, 2, argv, "source ?filename line?"); return JIM_ERR; } - 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 = Jim_GetScript(interp, argv[2]); - fileNameObj = script->fileNameObj; - line = script->firstline; + if (argc == 5) { + 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); } else { - fileNameObj = interp->emptyObj; - line = 1; + 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 = Jim_GetScript(interp, argv[2]); + fileNameObj = script->fileNameObj; + line = script->firstline; + } + else { + fileNameObj = interp->emptyObj; + line = 1; + } + resObjPtr = Jim_NewListObj(interp, NULL, 0); + Jim_ListAppendElement(interp, resObjPtr, fileNameObj); + Jim_ListAppendElement(interp, resObjPtr, Jim_NewIntObj(interp, line)); } - resObjPtr = Jim_NewListObj(interp, NULL, 0); - Jim_ListAppendElement(interp, resObjPtr, fileNameObj); - Jim_ListAppendElement(interp, resObjPtr, Jim_NewIntObj(interp, line)); Jim_SetResult(interp, resObjPtr); break; } |