aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2017-09-16 13:29:34 +1000
committerSteve Bennett <steveb@workware.net.au>2017-09-16 15:37:27 +1000
commit06df03f78cb1b23f4e9bd10d7f7f4fab3a16e86f (patch)
tree7bb35d916ee7ff3706db6b0d83c63a63660ca96d
parenteb1918117c0ae5f2b67d441f2ed459718e79cad4 (diff)
downloadjimtcl-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.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/jim.c b/jim.c
index 131924c..4489f50 100644
--- a/jim.c
+++ b/jim.c
@@ -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;