aboutsummaryrefslogtreecommitdiff
path: root/jim.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2014-12-03 13:50:38 +1000
committerSteve Bennett <steveb@workware.net.au>2014-12-09 13:07:55 +1000
commitb807e3c1640870464ced1859c29d200188df12ab (patch)
tree16c882a2df213df8365316870d9715e282910430 /jim.c
parent9d6004a26d406aa9331fae3ffcb26be298be552d (diff)
downloadjimtcl-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.c41
1 files changed, 25 insertions, 16 deletions
diff --git a/jim.c b/jim.c
index 7db453a..be5406a 100644
--- a/jim.c
+++ b/jim.c
@@ -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;
}