From 7c99a698fd3f179581a181dca262acd85d9a107c Mon Sep 17 00:00:00 2001 From: andy Date: Sat, 24 Dec 2016 23:58:29 +0000 Subject: Bug [46a2410650]: Create macro TclIsVarArraySearched to check if an array variable has an active search, and modify INST_UNSET_ARRAY to fall back on the slow unset method for array elements within an array being searched. The slow unset method involves a call to DeleteSearches() which stops all active searches. --- generic/tclExecute.c | 7 ++++--- generic/tclInt.h | 4 ++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/generic/tclExecute.c b/generic/tclExecute.c index 9103da0..d46353e 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.c @@ -4034,12 +4034,13 @@ TEBCresume( } TRACE(("%s %u \"%.30s\" => ", (flags ? "normal" : "noerr"), opnd, O2S(part2Ptr))); - if (TclIsVarArray(arrayPtr) && !UnsetTraced(arrayPtr)) { + if (TclIsVarArray(arrayPtr) && !UnsetTraced(arrayPtr) + && !TclIsVarArraySearched(arrayPtr)) { varPtr = VarHashFindVar(arrayPtr->value.tablePtr, part2Ptr); if (varPtr && TclIsVarDirectUnsettable(varPtr)) { /* - * No nasty traces and element exists, so we can proceed to - * unset it. Might still not exist though... + * No nasty traces or searchesw and element exists, so we can + * proceed to unset it. Might still not exist though... */ if (!TclIsVarUndefined(varPtr)) { diff --git a/generic/tclInt.h b/generic/tclInt.h index ede6411..f8c3ddd 100644 --- a/generic/tclInt.h +++ b/generic/tclInt.h @@ -804,6 +804,7 @@ typedef struct VarInHash { * MODULE_SCOPE int TclIsVarTemporary(Var *varPtr); * MODULE_SCOPE int TclIsVarArgument(Var *varPtr); * MODULE_SCOPE int TclIsVarResolved(Var *varPtr); + * MODULE_SCOPE int TclIsVarArraySearched(Var *varPtr); */ #define TclIsVarScalar(varPtr) \ @@ -845,6 +846,9 @@ typedef struct VarInHash { #define TclIsVarDeadHash(varPtr) \ ((varPtr)->flags & VAR_DEAD_HASH) +#define TclIsVarArraySearched(varPtr) \ + ((varPtr)->flags & VAR_SEARCH_ACTIVE) + #define TclGetVarNsPtr(varPtr) \ (TclIsVarInHash(varPtr) \ ? ((TclVarHashTable *) ((((VarInHash *) (varPtr))->entry.tablePtr)))->nsPtr \ -- cgit v0.12