diff options
author | Steve Bennett <steveb@workware.net.au> | 2017-09-16 13:29:34 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2017-09-16 15:37:27 +1000 |
commit | 06df03f78cb1b23f4e9bd10d7f7f4fab3a16e86f (patch) | |
tree | 7bb35d916ee7ff3706db6b0d83c63a63660ca96d | |
parent | eb1918117c0ae5f2b67d441f2ed459718e79cad4 (diff) | |
download | jimtcl-06df03f78cb1b23f4e9bd10d7f7f4fab3a16e86f.zip jimtcl-06df03f78cb1b23f4e9bd10d7f7f4fab3a16e86f.tar.gz jimtcl-06df03f78cb1b23f4e9bd10d7f7f4fab3a16e86f.tar.bz2 |
defer: fast lookup existence of $jim::defer
This speeds up call frame destruction in the common
case that $jim::defer does not exist.
Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r-- | jim.c | 11 |
1 files changed, 9 insertions, 2 deletions
@@ -5034,10 +5034,17 @@ static int JimDeleteLocalProcs(Jim_Interp *interp, Jim_Stack *localCommands) */ static int JimInvokeDefer(Jim_Interp *interp, int retcode) { - Jim_Obj *objPtr = Jim_GetVariableStr(interp, "jim::defer", JIM_NONE); - int ret = JIM_OK; + Jim_Obj *objPtr; + + /* Fast check for the likely case that the variable doesn't exist */ + if (Jim_FindHashEntry(&interp->framePtr->vars, "jim::defer") == NULL) { + return retcode; + } + + objPtr = Jim_GetVariableStr(interp, "jim::defer", JIM_NONE); if (objPtr) { + int ret = JIM_OK; int i; int listLen = Jim_ListLength(interp, objPtr); Jim_Obj *resultObjPtr; |