Tcl Source Code

Artifact [87d5bf1464]
Login

Artifact 87d5bf14642becab9fae6f4e489e84ded6323705:

Attachment "deleteNS.patch" to ticket [4dbdd9af14] added by mr_calvin 2016-08-31 12:21:58. (unpublished)
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 {