summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorandy <andrew.m.goth@gmail.com>2016-12-24 23:58:29 (GMT)
committerandy <andrew.m.goth@gmail.com>2016-12-24 23:58:29 (GMT)
commit7c99a698fd3f179581a181dca262acd85d9a107c (patch)
tree5cd7f57ead4a8c987f0a4cd9e29c8abb2ad024a6
parented7e266bfb3364bdbf7ae0da5edcb20aa597a46c (diff)
downloadtcl-7c99a698fd3f179581a181dca262acd85d9a107c.zip
tcl-7c99a698fd3f179581a181dca262acd85d9a107c.tar.gz
tcl-7c99a698fd3f179581a181dca262acd85d9a107c.tar.bz2
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.
-rw-r--r--generic/tclExecute.c7
-rw-r--r--generic/tclInt.h4
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 \