Index: generic/xotcl.c =================================================================== diff -u -ra092bf2730f286db304743019da69e5ecd84eba2 -rf588c8777ffaa66c942be57e8ce4a37c79359bc3 --- generic/xotcl.c (.../xotcl.c) (revision a092bf2730f286db304743019da69e5ecd84eba2) +++ generic/xotcl.c (.../xotcl.c) (revision f588c8777ffaa66c942be57e8ce4a37c79359bc3) @@ -1567,6 +1567,8 @@ #if defined(USE_COMPILED_VAR_RESOLVER) typedef struct xotclResolvedVarInfo { Tcl_ResolvedVarInfo vInfo; /* This must be the first element. */ + XOTclObject *lastObj; + Tcl_Var var; char buffer[64]; /* for now */ } xotclResolvedVarInfo; @@ -1577,6 +1579,9 @@ Tcl_Var var; int new; + if (obj == resVarInfo->lastObj) { + return resVarInfo->var; + } /*fprintf(stderr, "Object Var Resolver, name=%s, obj %p, nsPtr %p\n",resVarInfo->buffer, obj, obj->nsPtr);*/ var = (Tcl_Var)LookupVarFromTable(varTable, resVarInfo->buffer, NULL); @@ -1592,6 +1597,8 @@ var = (Tcl_Var)VarHashCreateVar(varTable, key, &new); DECR_REF_COUNT(key); } + resVarInfo->lastObj = obj; + resVarInfo->var = var; return var; } @@ -1606,6 +1613,7 @@ xotclResolvedVarInfo *vInfoPtr = (xotclResolvedVarInfo *) ckalloc(sizeof(xotclResolvedVarInfo)); vInfoPtr->vInfo.fetchProc = xotclObjectVarResolver; vInfoPtr->vInfo.deleteProc = NULL; + vInfoPtr->lastObj = NULL; memcpy(vInfoPtr->buffer,name+1,length-1); vInfoPtr->buffer[length-1] = 0; *rPtr = (Tcl_ResolvedVarInfo *)vInfoPtr;