Attachment "deleteNS.patch" to
ticket [4dbdd9af14]
added by
mr_calvin
2016-08-31 12:21:58.
Index: generic/tclVar.c
==================================================================
--- generic/tclVar.c
+++ generic/tclVar.c
@@ -4962,10 +4962,12 @@
/*
* Remove the variable from the table and force it undefined in case
* an unset trace brought it back from the dead.
*/
+
+ TclSetVarUndefined(varPtr);
if (TclIsVarTraced(varPtr)) {
Tcl_HashEntry *tPtr = Tcl_FindHashEntry(&iPtr->varTraces, varPtr);
VarTrace *tracePtr = Tcl_GetHashValue(tPtr);
ActiveVarTrace *activePtr;
Index: tests/var.test
==================================================================
--- tests/var.test
+++ tests/var.test
@@ -577,10 +577,11 @@
}
trace var v u [namespace code traceUnset]
}
list [unset test_ns_var::v] $test_ns_var::info
} -result {{} {test_ns_var::v {} u}}
+
test var-8.2 {TclDeleteNamespaceVars, "unset" traces on ns delete are called with fully-qualified var names} -setup {
catch {namespace delete test_ns_var}
catch {unset a}
} -body {
set info ""
@@ -591,10 +592,26 @@
proc traceUnset {name1 name2 op} {
set ::info [concat $::info [list $name1 $name2 $op]]
}
list [namespace delete test_ns_var] $::info
} -result {{} {::test_ns_var::v {} u}}
+
+test var-8.3 {TclDeleteNamespaceVars, "unset" traces on ns delete revive deleted var} -setup {
+ catch {namespace delete test_ns_var}
+} -body {
+ set info ""
+ set before ""
+ namespace eval test_ns_var {
+ variable v 123
+ trace var v u ::traceUnset
+ }
+ set before [info exists ::test_ns_var::v]
+ proc traceUnset {name1 name2 op} {
+ set ::info [concat $::info [list $name1 $name2 $op] [set $name1 321]]
+ }
+ list [namespace delete ::test_ns_var] $::info $::before [info exists ::test_ns_var::v]
+} -result {{} {::test_ns_var::v {} u 321} 1 0}
test var-9.1 {behaviour of TclGet/SetVar simple get/set} -setup {
catch {unset u}
catch {unset v}
} -constraints testsetnoerr -body {