Tcl Source Code

Artifact [1e89ea098c]
Login

Artifact 1e89ea098c9a0761e9ca5457537b011537ca6a25:

Attachment "upvar.patch" to ticket [1587442fff] added by msofer 2006-10-31 03:05:56.
Index: doc/upvar.n
===================================================================
RCS file: /cvsroot/tcl/tcl/doc/upvar.n,v
retrieving revision 1.12
diff -u -r1.12 upvar.n
--- doc/upvar.n	10 May 2005 18:34:03 -0000	1.12
+++ doc/upvar.n	30 Oct 2006 19:57:59 -0000
@@ -29,7 +29,8 @@
 by that name in the procedure frame given by \fIlevel\fR (or at
 global level, if \fIlevel\fR is \fB#0\fR) accessible
 in the current procedure by the name given in the corresponding
-\fImyVar\fR argument.
+\fImyVar\fR argument. It is an error for \fImyVar\fR to be a qualified
+name, i.e., to contain the substring "::".
 The variable named by \fIotherVar\fR need not exist at the time of the
 call;  it will be created the first time \fImyVar\fR is referenced, just like
 an ordinary variable.  There must not exist a variable by the
Index: generic/tclVar.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclVar.c,v
retrieving revision 1.126
diff -u -r1.126 tclVar.c
--- generic/tclVar.c	27 Oct 2006 13:20:33 -0000	1.126
+++ generic/tclVar.c	30 Oct 2006 19:58:01 -0000
@@ -3320,6 +3320,17 @@
 		return TCL_ERROR;
 	    }
 	}
+	p = strstr(myName, "::");
+	if (p != NULL) {
+	    /*
+	     * myName looks like a qualified name
+	     */
+	    
+	    Tcl_AppendResult((Tcl_Interp *) iPtr, "bad variable name \"",
+		    myName, "\": upvar won't create a variable ",
+		    "with a name containing '::'", NULL);
+	    return TCL_ERROR;
+	}
 
 	/*
 	 * Lookup and eventually create the new variable. Set the flag bit
Index: tests/var.test
===================================================================
RCS file: /cvsroot/tcl/tcl/tests/var.test,v
retrieving revision 1.27
diff -u -r1.27 var.test
--- tests/var.test	9 Oct 2006 19:15:45 -0000	1.27
+++ tests/var.test	30 Oct 2006 19:58:03 -0000
@@ -243,14 +243,16 @@
         set vvv
     }
 } {121212}
-test var-3.7 {MakeUpvar, my var has ::s} {
+test var-3.7 {MakeUpvar, my var has ::s} -body {
     catch {unset a}
     set a 789789
     upvar #0 a test_ns_var::lnk
     namespace eval test_ns_var {
         set lnk
     }
-} {789789}
+} -returnCodes {
+    error
+} -result {bad variable name "test_ns_var::lnk": upvar won't create a variable with a name containing '::'}
 test var-3.8 {MakeUpvar, my var already exists in global ns} {
     catch {unset aaaaa}
     catch {unset xxxxx}
@@ -263,7 +265,7 @@
     catch {unset aaaaa}
     set aaaaa 789789
     list [catch {upvar #0 aaaaa test_ns_fred::lnk} msg] $msg
-} {1 {can't create "test_ns_fred::lnk": parent namespace doesn't exist}}
+} {1 {bad variable name "test_ns_fred::lnk": upvar won't create a variable with a name containing '::'}}
 test var-3.10 {MakeUpvar, } {
     namespace eval {} {
 	set bar 0