diff options
author | Steve Bennett <steveb@workware.net.au> | 2017-09-16 12:54:47 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2017-09-16 15:37:38 +1000 |
commit | 68125a71ad36e150ec4ca7c596064840a2fbc8ae (patch) | |
tree | b8b5955237b9b432ca2ed5d18e571d921cb74430 | |
parent | 06df03f78cb1b23f4e9bd10d7f7f4fab3a16e86f (diff) | |
download | jimtcl-68125a71ad36e150ec4ca7c596064840a2fbc8ae.zip jimtcl-68125a71ad36e150ec4ca7c596064840a2fbc8ae.tar.gz jimtcl-68125a71ad36e150ec4ca7c596064840a2fbc8ae.tar.bz2 |
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>
-rw-r--r-- | jim.c | 36 | ||||
-rw-r--r-- | jim.h | 6 |
2 files changed, 39 insertions, 3 deletions
@@ -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; } @@ -293,6 +293,12 @@ typedef struct Jim_Obj { void *ptr1; void *ptr2; } twoPtrValue; + /* Generic pointer, int, int value */ + struct { + void *ptr; + int int1; + int int2; + } ptrIntValue; /* Variable object */ struct { struct Jim_Var *varPtr; |