aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2010-09-16 09:45:18 +1000
committerSteve Bennett <steveb@workware.net.au>2010-10-15 11:02:53 +1000
commit6c3dfbc2842400da314f139a043b908cda499839 (patch)
treec2a87929f4e7b4aec639252c7a3b88f5d9e4765f
parent03f330c8223deddc8050205d3c275e6e260684b4 (diff)
downloadjimtcl-6c3dfbc2842400da314f139a043b908cda499839.zip
jimtcl-6c3dfbc2842400da314f139a043b908cda499839.tar.gz
jimtcl-6c3dfbc2842400da314f139a043b908cda499839.tar.bz2
Add support for 'info references'
Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r--jim.c37
-rw-r--r--jim_tcl.txt5
2 files changed, 37 insertions, 5 deletions
diff --git a/jim.c b/jim.c
index bf241c9..0e69842 100644
--- a/jim.c
+++ b/jim.c
@@ -4321,7 +4321,7 @@ int SetReferenceFromAny(Jim_Interp *interp, Jim_Obj *objPtr)
if (!isrefchar(start[12 + i]))
goto badformat;
}
- /* Extract info from the refernece. */
+ /* Extract info from the reference. */
memcpy(refId, start + 14 + JIM_REFERENCE_TAGLEN, 20);
refId[20] = '\0';
/* Try to convert the ID into a jim_wide */
@@ -12730,9 +12730,28 @@ static int Jim_FinalizeCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const
return JIM_OK;
}
-/* TODO */
+/* [info references] */
+static int JimInfoReferences(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
+{
+ Jim_Obj *listObjPtr;
+ Jim_HashTableIterator *htiter;
+ Jim_HashEntry *he;
+
+ listObjPtr = Jim_NewListObj(interp, NULL, 0);
-/* [info references] (list of all the references/finalizers) */
+ htiter = Jim_GetHashTableIterator(&interp->references);
+ while ((he = Jim_NextHashEntry(htiter)) != NULL) {
+ char buf[JIM_REFERENCE_SPACE];
+ Jim_Reference *refPtr = he->val;
+ const jim_wide *refId = he->key;
+
+ JimFormatReference(buf, refPtr, *refId);
+ Jim_ListAppendElement(interp, listObjPtr, Jim_NewStringObj(interp, buf, -1));
+ }
+ Jim_FreeHashTableIterator(htiter);
+ Jim_SetResult(interp, listObjPtr);
+ return JIM_OK;
+}
#endif
/* [rename] */
@@ -12869,13 +12888,14 @@ static int Jim_InfoCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg
static const char *commands[] = {
"body", "commands", "procs", "exists", "globals", "level", "frame", "locals",
"vars", "version", "patchlevel", "complete", "args", "hostname",
- "script", "source", "stacktrace", "nameofexecutable", "returncodes", NULL
+ "script", "source", "stacktrace", "nameofexecutable", "returncodes",
+ "references", NULL
};
enum
{ INFO_BODY, INFO_COMMANDS, INFO_PROCS, INFO_EXISTS, INFO_GLOBALS, INFO_LEVEL, INFO_FRAME,
INFO_LOCALS, INFO_VARS, INFO_VERSION, INFO_PATCHLEVEL, INFO_COMPLETE, INFO_ARGS,
INFO_HOSTNAME, INFO_SCRIPT, INFO_SOURCE, INFO_STACKTRACE, INFO_NAMEOFEXECUTABLE,
- INFO_RETURNCODES
+ INFO_RETURNCODES, INFO_REFERENCES,
};
if (argc < 2) {
@@ -13065,6 +13085,13 @@ static int Jim_InfoCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg
return JIM_ERR;
}
break;
+ case INFO_REFERENCES:
+#ifdef JIM_REFERENCES
+ return JimInfoReferences(interp, argc, argv);
+#else
+ Jim_SetResultString(interp, "not supported", -1);
+ return JIM_ERR;
+#endif
}
return JIM_OK;
}
diff --git a/jim_tcl.txt b/jim_tcl.txt
index 4679425..af16a55 100644
--- a/jim_tcl.txt
+++ b/jim_tcl.txt
@@ -78,6 +78,7 @@ Since v0.62:
16. Event handlers works better if an error occurs. eof handler has been removed.
17. 'exec' now sets $::errorCode, and catch sets opts(-errorcode) for exit status
18. Command pipelines via open "|..." are now supported
+19. Add 'info references'
Since v0.61:
@@ -2397,6 +2398,10 @@ The legal *option*'s (which may be abbreviated) are:
are returned. Matching is determined using the same rules as for
'string match'.
++*info references*+::
+ Returns a list of all references which have not yet been garbage
+ collected.
+
+*info returncodes* ?'code'?+::
Returns a list representing the mapping of standard return codes
to names. e.g. +{0 ok 1 error 2 return ...}+. If a code is given,