From ae76fbd559e8e30a6cb4c448bf4c924cbd79841b Mon Sep 17 00:00:00 2001 From: dgp Date: Fri, 20 Apr 2018 20:17:17 +0000 Subject: DeleteArray has only one caller. It is called on the "dummy" variable that is created during unset, and which cannot be reached by resolving any name. It cannot have VAR_SEARCH_ACTIVE set because the sole thing that sets that flag is an [array startsearch] applied to a named variable. --- generic/tclVar.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/generic/tclVar.c b/generic/tclVar.c index c4952be..ed16c9f 100644 --- a/generic/tclVar.c +++ b/generic/tclVar.c @@ -5324,9 +5324,6 @@ DeleteArray( Tcl_Obj *objPtr; VarTrace *tracePtr; - if (varPtr->flags & VAR_SEARCH_ACTIVE) { - DeleteSearches(iPtr, varPtr); - } for (elPtr = VarHashFirstVar(varPtr->value.tablePtr, &search); elPtr != NULL; elPtr = VarHashNextVar(&search)) { if (TclIsVarScalar(elPtr) && (elPtr->value.objPtr != NULL)) { -- cgit v0.12 From 8e06fd796be19c40e0e82a7d9c9e54d34e975504 Mon Sep 17 00:00:00 2001 From: dgp Date: Sun, 22 Apr 2018 13:22:20 +0000 Subject: [46a2410650] compiled [unset] was bypassing cleanup of active array search. Overdue thanks to Andy Goth for tests and report. --- generic/tclExecute.c | 3 ++- tests/var.test | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/generic/tclExecute.c b/generic/tclExecute.c index 5bc5c2d..af44323 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.c @@ -4169,7 +4169,8 @@ TEBCresume( } TRACE(("%s %u \"%.30s\" => ", (flags ? "normal" : "noerr"), opnd, O2S(part2Ptr))); - if (TclIsVarArray(arrayPtr) && !UnsetTraced(arrayPtr)) { + if (TclIsVarArray(arrayPtr) && !UnsetTraced(arrayPtr) + && !(arrayPtr->flags & VAR_SEARCH_ACTIVE)) { varPtr = VarHashFindVar(arrayPtr->value.tablePtr, part2Ptr); if (varPtr && TclIsVarDirectUnsettable(varPtr)) { /* diff --git a/tests/var.test b/tests/var.test index b235e5d..8d86fce 100644 --- a/tests/var.test +++ b/tests/var.test @@ -776,6 +776,22 @@ test var-13.1 {Tcl_UnsetVar2, unset array with trace set on element} -setup { } set x "If you see this, it worked" } -result "If you see this, it worked" +test var-13.2 {unset array with search, bug 46a2410650} -body { + apply {{} { + array set a {aa 11 bb 22 cc 33 dd 44 ee 55 ff 66} + set s [array startsearch a] + unset a([array nextelement a $s]) + array nextelement a $s + }} +} -returnCodes error -result {couldn't find search "s-1-a"} +test var-13.3 {unset array with search, SIGSEGV, bug 46a2410650} -body { + apply {{} { + array set a {aa 11 bb 22 cc 33 dd 44 ee 55 ff 66} + set s [array startsearch a] + unset a(ff) + array nextelement a $s + }} +} -returnCodes error -result {couldn't find search "s-1-a"} test var-14.1 {array names syntax} -body { array names foo bar baz snafu -- cgit v0.12