summaryrefslogtreecommitdiff
path: root/jim.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2017-09-16 12:54:47 +1000
committerSteve Bennett <steveb@workware.net.au>2017-09-16 15:37:38 +1000
commit68125a71ad36e150ec4ca7c596064840a2fbc8ae (patch)
treeb8b5955237b9b432ca2ed5d18e571d921cb74430 /jim.c
parent06df03f78cb1b23f4e9bd10d7f7f4fab3a16e86f (diff)
perf: cache successful Jim_GetEnum() results
When Jim_GetEnum() succeeds, cache the result in the object to speed up subsequent identical calls to Jim_GetEnum() Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'jim.c')
-rw-r--r--jim.c36
1 files changed, 33 insertions, 3 deletions
diff --git a/jim.c b/jim.c
index 4489f50..4a7d2de 100644
--- a/jim.c
+++ b/jim.c
@@ -15416,6 +15416,19 @@ int Jim_CheckShowCommands(Jim_Interp *interp, Jim_Obj *objPtr, const char *const
return JIM_ERR;
}
+/* internal rep is stored in ptrIntvalue
+ * ptr = tablePtr
+ * int1 = flags
+ * int2 = index
+ */
+static const Jim_ObjType getEnumObjType = {
+ "get-enum",
+ NULL,
+ NULL,
+ NULL,
+ JIM_TYPE_REFERENCES
+};
+
int Jim_GetEnum(Jim_Interp *interp, Jim_Obj *objPtr,
const char *const *tablePtr, int *indexPtr, const char *name, int flags)
{
@@ -15424,15 +15437,24 @@ int Jim_GetEnum(Jim_Interp *interp, Jim_Obj *objPtr,
int i;
int match = -1;
int arglen;
- const char *arg = Jim_GetString(objPtr, &arglen);
+ const char *arg;
+
+ if (objPtr->typePtr == &getEnumObjType) {
+ if (objPtr->internalRep.ptrIntValue.ptr == tablePtr && objPtr->internalRep.ptrIntValue.int1 == flags) {
+ *indexPtr = objPtr->internalRep.ptrIntValue.int2;
+ return JIM_OK;
+ }
+ }
+
+ arg = Jim_GetString(objPtr, &arglen);
*indexPtr = -1;
for (entryPtr = tablePtr, i = 0; *entryPtr != NULL; entryPtr++, i++) {
if (Jim_CompareStringImmediate(interp, objPtr, *entryPtr)) {
/* Found an exact match */
- *indexPtr = i;
- return JIM_OK;
+ match = i;
+ goto found;
}
if (flags & JIM_ENUM_ABBREV) {
/* Accept an unambiguous abbreviation.
@@ -15453,6 +15475,14 @@ int Jim_GetEnum(Jim_Interp *interp, Jim_Obj *objPtr,
/* If we had an unambiguous partial match */
if (match >= 0) {
+ found:
+ /* Record the match in the object */
+ Jim_FreeIntRep(interp, objPtr);
+ objPtr->typePtr = &getEnumObjType;
+ objPtr->internalRep.ptrIntValue.ptr = (void *)tablePtr;
+ objPtr->internalRep.ptrIntValue.int1 = flags;
+ objPtr->internalRep.ptrIntValue.int2 = match;
+ /* Return the result */
*indexPtr = match;
return JIM_OK;
}