diff options
author | Steve Bennett <steveb@workware.net.au> | 2020-06-10 18:59:14 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2020-06-10 19:01:42 +1000 |
commit | 1ac0a1c4f5b3327eb5f415f5f54488c2b800e887 (patch) | |
tree | b60e7077ecf7b346ee1cb65e16de8893a90a477e | |
parent | a3323602c9b803ed69c6f2970ebee8a9cc7fb257 (diff) | |
download | jimtcl-1ac0a1c4f5b3327eb5f415f5f54488c2b800e887.zip jimtcl-1ac0a1c4f5b3327eb5f415f5f54488c2b800e887.tar.gz jimtcl-1ac0a1c4f5b3327eb5f415f5f54488c2b800e887.tar.bz2 |
core: fix regtest TEST 35
The changes in cdfa4637afe broke TEST 35 because the cmd
pointer is dereferenced before checking the procEpoch instead
of afterwards.
Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r-- | jim.c | 18 |
1 files changed, 8 insertions, 10 deletions
@@ -4318,23 +4318,21 @@ static const Jim_ObjType commandObjType = { */ Jim_Cmd *Jim_GetCommand(Jim_Interp *interp, Jim_Obj *objPtr, int flags) { - Jim_Cmd *cmd = NULL; + Jim_Cmd *cmd; /* In order to be valid, the proc epoch must match and * the lookup must have occurred in the same namespace */ - if (objPtr->typePtr == &commandObjType) { - cmd = objPtr->internalRep.cmdValue.cmdPtr; - if (cmd->inUse == 0 || objPtr->internalRep.cmdValue.procEpoch != interp->procEpoch + if (objPtr->typePtr == &commandObjType + && objPtr->internalRep.cmdValue.procEpoch == interp->procEpoch #ifdef jim_ext_namespace - || !Jim_StringEqObj(objPtr->internalRep.cmdValue.nsObj, interp->framePtr->nsObj) + && Jim_StringEqObj(objPtr->internalRep.cmdValue.nsObj, interp->framePtr->nsObj) #endif - ) { - /* Cache is invalid */ - cmd = NULL; - } + && objPtr->internalRep.cmdValue.cmdPtr->inUse) { + /* Cached value is valid */ + cmd = objPtr->internalRep.cmdValue.cmdPtr; } - if (!cmd) { + else { Jim_Obj *qualifiedNameObj = JimQualifyName(interp, objPtr); Jim_HashEntry *he = Jim_FindHashEntry(&interp->commands, qualifiedNameObj); #ifdef jim_ext_namespace |