summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog21
-rw-r--r--tests/append.test51
-rw-r--r--tests/appendComp.test162
3 files changed, 203 insertions, 31 deletions
diff --git a/ChangeLog b/ChangeLog
index 9a5b854..4c9f2d7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,24 @@
+2001-07-03 Jeff Hobbs <jeffh@ActiveState.com>
+
+ * generic/tclVar.c (Tcl_GetVar2Ex): added ability to recognize
+ TCL_TRACE_READS flags to cause creation of part1 in TclLookupVar
+ to make sure newly created array will get read traces triggered
+ appropriately. This is called by Tcl_ObjGetVar2, Tcl_GetVar, and
+ Tcl_GetVar2.
+ (TclSetIndexedScalar, TclSetElementOfIndexedArray): added read
+ trace triggering for lappend case.
+ (Tcl_LappendObjCmd): pass TCL_TRACE_READS to Tcl_ObjGetVar2 to
+ trigger possible read traces for new arrays.
+
+ * generic/tclExecute.c (TclExecuteByteCode): added TCL_TRACE_READS
+ flag to INST_LAPPEND(_ARRAY)_STK case to trigger read traces for
+ newly created arrays. Removed unnecessary #ifdef for
+ TCL_COMPILE_DEBUG in INST_LOAD_SCALAR1 case.
+
+ * tests/append.test:
+ * tests/appendComp.test: added tests for read trace triggering for
+ append and lappend.
+
2001-07-03 Mo DeJong <mdejong@redhat.com>
* tests/clock.test (clock-2.5): Adjust test so that it passes
diff --git a/tests/append.test b/tests/append.test
index a96d977..58c0de7 100644
--- a/tests/append.test
+++ b/tests/append.test
@@ -11,7 +11,7 @@
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
-# RCS: @(#) $Id: append.test,v 1.6 2001/05/17 02:18:53 hobbs Exp $
+# RCS: @(#) $Id: append.test,v 1.7 2001/07/03 23:39:24 hobbs Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
@@ -131,6 +131,18 @@ test append-4.17 {lappend command} {
catch {unset x}
lappend x
} {}
+test append-4.18 {lappend command} {
+ catch {unset x}
+ lappend x {}
+} {{}}
+test append-4.19 {lappend command} {
+ catch {unset x}
+ lappend x(0)
+} {}
+test append-4.20 {lappend command} {
+ catch {unset x}
+ lappend x(0) abc
+} {abc}
proc check {var size} {
set l [llength $var]
@@ -146,6 +158,7 @@ proc check {var size} {
return ok
}
test append-5.1 {long lappends} {
+ catch {unset x}
set x ""
for {set i 0} {$i < 300} {set i [expr $i+1]} {
lappend x "item $i"
@@ -173,6 +186,42 @@ test append-7.1 {lappend-created var and error in trace on that var} {
lappend x 1
list [info exists x] [catch {set x} msg] $msg
} {0 1 {can't read "x": no such variable}}
+test append-7.2 {lappend var triggers read trace} {
+ catch {unset myvar}
+ catch {unset ::result}
+ trace variable myvar r foo
+ proc foo {args} {append ::result $args}
+ lappend myvar a
+ list [catch {set ::result} msg] $msg
+} {0 {myvar {} r}}
+test append-7.3 {lappend var triggers read trace, array var} {
+ # The behavior of read triggers on lappend changed in 8.0 to
+ # not trigger them, and was changed back in 8.4.
+ catch {unset myvar}
+ catch {unset ::result}
+ trace variable myvar r foo
+ proc foo {args} {append ::result $args}
+ lappend myvar(b) a
+ list [catch {set ::result} msg] $msg
+} {0 {myvar b r}}
+test append-7.4 {lappend var triggers read trace, array var exists} {
+ catch {unset myvar}
+ catch {unset ::result}
+ set myvar(0) 1
+ trace variable myvar r foo
+ proc foo {args} {append ::result $args}
+ lappend myvar(b) a
+ list [catch {set ::result} msg] $msg
+} {0 {myvar b r}}
+test append-7.5 {append var does not trigger read trace} {
+ catch {unset myvar}
+ catch {unset ::result}
+ trace variable myvar r foo
+ proc foo {args} {append ::result $args}
+ append myvar a
+ info exists ::result
+} {0}
+
catch {unset i x result y}
catch {rename foo ""}
diff --git a/tests/appendComp.test b/tests/appendComp.test
index 0e7a768..9692e2c 100644
--- a/tests/appendComp.test
+++ b/tests/appendComp.test
@@ -11,7 +11,7 @@
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
-# RCS: @(#) $Id: appendComp.test,v 1.2 2001/05/17 02:21:06 hobbs Exp $
+# RCS: @(#) $Id: appendComp.test,v 1.3 2001/07/03 23:39:24 hobbs Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
@@ -19,19 +19,19 @@ if {[lsearch [namespace children] ::tcltest] == -1} {
}
catch {unset x}
-test append-1.1 {append command} {
+test appendComp-1.1 {append command} {
catch {unset x}
proc foo {} {append ::x 1 2 abc "long string"}
list [foo] $x
} {{12abclong string} {12abclong string}}
-test append-1.2 {append command} {
+test appendComp-1.2 {append command} {
proc foo {} {
set x ""
list [append x first] [append x second] [append x third] $x
}
foo
} {first firstsecond firstsecondthird firstsecondthird}
-test append-1.3 {append command} {
+test appendComp-1.3 {append command} {
proc foo {} {
set x "abcd"
append x
@@ -39,7 +39,7 @@ test append-1.3 {append command} {
foo
} abcd
-test append-2.1 {long appends} {
+test appendComp-2.1 {long appends} {
proc foo {} {
set x ""
for {set i 0} {$i < 1000} {set i [expr $i+1]} {
@@ -54,18 +54,18 @@ test append-2.1 {long appends} {
foo
} 1
-test append-3.1 {append errors} {
+test appendComp-3.1 {append errors} {
proc foo {} {append}
list [catch {foo} msg] $msg
} {1 {wrong # args: should be "append varName ?value value ...?"}}
-test append-3.2 {append errors} {
+test appendComp-3.2 {append errors} {
proc foo {} {
set x ""
append x(0) 44
}
list [catch {foo} msg] $msg
} {1 {can't set "x(0)": variable isn't array}}
-test append-3.3 {append errors} {
+test appendComp-3.3 {append errors} {
proc foo {} {
catch {unset x}
append x
@@ -73,7 +73,7 @@ test append-3.3 {append errors} {
list [catch {foo} msg] $msg
} {1 {can't read "x": no such variable}}
-test append-4.1 {lappend command} {
+test appendComp-4.1 {lappend command} {
proc foo {} {
global x
catch {unset x}
@@ -81,14 +81,14 @@ test append-4.1 {lappend command} {
}
list [foo] $x
} {{1 2 abc {long string}} {1 2 abc {long string}}}
-test append-4.2 {lappend command} {
+test appendComp-4.2 {lappend command} {
proc foo {} {
set x ""
list [lappend x first] [lappend x second] [lappend x third] $x
}
foo
} {first {first second} {first second third} {first second third}}
-test append-4.3 {lappend command} {
+test appendComp-4.3 {lappend command} {
proc foo {} {
global x
set x old
@@ -99,105 +99,113 @@ test append-4.3 {lappend command} {
rename foo {}
set result
} {new}
-test append-4.4 {lappend command} {
+test appendComp-4.4 {lappend command} {
proc foo {} {
set x {}
lappend x \{\ abc
}
foo
} {\{\ abc}
-test append-4.5 {lappend command} {
+test appendComp-4.5 {lappend command} {
proc foo {} {
set x {}
lappend x \{ abc
}
foo
} {\{ abc}
-test append-4.6 {lappend command} {
+test appendComp-4.6 {lappend command} {
proc foo {} {
set x {1 2 3}
lappend x
}
foo
} {1 2 3}
-test append-4.7 {lappend command} {
+test appendComp-4.7 {lappend command} {
proc foo {} {
set x "a\{"
lappend x abc
}
foo
} "a\\\{ abc"
-test append-4.8 {lappend command} {
+test appendComp-4.8 {lappend command} {
proc foo {} {
set x "\\\{"
lappend x abc
}
foo
} "\\{ abc"
-test append-4.9 {lappend command} {
+test appendComp-4.9 {lappend command} {
proc foo {} {
set x " \{"
list [catch {lappend x abc} msg] $msg
}
foo
} {1 {unmatched open brace in list}}
-test append-4.10 {lappend command} {
+test appendComp-4.10 {lappend command} {
proc foo {} {
set x " \{"
list [catch {lappend x abc} msg] $msg
}
foo
} {1 {unmatched open brace in list}}
-test append-4.11 {lappend command} {
+test appendComp-4.11 {lappend command} {
proc foo {} {
set x "\{\{\{"
list [catch {lappend x abc} msg] $msg
}
foo
} {1 {unmatched open brace in list}}
-test append-4.12 {lappend command} {
+test appendComp-4.12 {lappend command} {
proc foo {} {
set x "x \{\{\{"
list [catch {lappend x abc} msg] $msg
}
foo
} {1 {unmatched open brace in list}}
-test append-4.13 {lappend command} {
+test appendComp-4.13 {lappend command} {
proc foo {} {
set x "x\{\{\{"
lappend x abc
}
foo
} "x\\\{\\\{\\\{ abc"
-test append-4.14 {lappend command} {
+test appendComp-4.14 {lappend command} {
proc foo {} {
set x " "
lappend x abc
}
foo
} "abc"
-test append-4.15 {lappend command} {
+test appendComp-4.15 {lappend command} {
proc foo {} {
set x "\\ "
lappend x abc
}
foo
} "{ } abc"
-test append-4.16 {lappend command} {
+test appendComp-4.16 {lappend command} {
proc foo {} {
set x "x "
lappend x abc
}
foo
} "x abc"
-test append-4.17 {lappend command} {
+test appendComp-4.17 {lappend command} {
proc foo {} { lappend x }
foo
} {}
-test append-4.18 {lappend command} {
+test appendComp-4.18 {lappend command} {
proc foo {} { lappend x {} }
foo
} {{}}
+test append-4.19 {lappend command} {
+ proc foo {} { lappend x(0) }
+ foo
+} {}
+test append-4.20 {lappend command} {
+ proc foo {} { lappend x(0) abc }
+ foo
+} {abc}
proc check {var size} {
set l [llength $var]
@@ -212,7 +220,8 @@ proc check {var size} {
}
return ok
}
-test append-5.1 {long lappends} {
+test appendComp-5.1 {long lappends} {
+ catch {unset x}
set x ""
for {set i 0} {$i < 300} {set i [expr $i+1]} {
lappend x "item $i"
@@ -220,11 +229,11 @@ test append-5.1 {long lappends} {
check $x 300
} ok
-test append-6.1 {lappend errors} {
+test appendComp-6.1 {lappend errors} {
proc foo {} {lappend}
list [catch {foo} msg] $msg
} {1 {wrong # args: should be "lappend varName ?value value ...?"}}
-test append-6.2 {lappend errors} {
+test appendComp-6.2 {lappend errors} {
proc foo {} {
set x ""
lappend x(0) 44
@@ -232,7 +241,7 @@ test append-6.2 {lappend errors} {
list [catch {foo} msg] $msg
} {1 {can't set "x(0)": variable isn't array}}
-test append-7.1 {lappend-created var and error in trace on that var} {
+test appendComp-7.1 {lappendComp-created var and error in trace on that var} {
proc bar {} {
global x
catch {rename foo ""}
@@ -248,6 +257,99 @@ test append-7.1 {lappend-created var and error in trace on that var} {
}
bar
} {0 1 {can't read "x": no such variable}}
+test appendComp-7.2 {lappend var triggers read trace, index var} {
+ proc bar {} {
+ catch {unset myvar}
+ catch {unset ::result}
+ trace variable myvar r foo
+ proc foo {args} {append ::result $args}
+ lappend myvar a
+ list [catch {set ::result} msg] $msg
+ }
+ bar
+} {0 {myvar {} r}}
+test appendComp-7.3 {lappend var triggers read trace, stack var} {
+ proc bar {} {
+ catch {unset ::myvar}
+ catch {unset ::result}
+ trace variable ::myvar r foo
+ proc foo {args} {append ::result $args}
+ lappend ::myvar a
+ list [catch {set ::result} msg] $msg
+ }
+ bar
+} {0 {::myvar {} r}}
+test appendComp-7.4 {lappend var triggers read trace, array var} {
+ # The behavior of read triggers on lappend changed in 8.0 to
+ # not trigger them. Maybe not correct, but been there a while.
+ proc bar {} {
+ catch {unset myvar}
+ catch {unset ::result}
+ trace variable myvar r foo
+ proc foo {args} {append ::result $args}
+ lappend myvar(b) a
+ list [catch {set ::result} msg] $msg
+ }
+ bar
+} {0 {myvar b r}}
+test appendComp-7.5 {lappend var triggers read trace, array var} {
+ # The behavior of read triggers on lappend changed in 8.0 to
+ # not trigger them. Maybe not correct, but been there a while.
+ proc bar {} {
+ catch {unset myvar}
+ catch {unset ::result}
+ trace variable myvar r foo
+ proc foo {args} {append ::result $args}
+ lappend myvar(b) a b
+ list [catch {set ::result} msg] $msg
+ }
+ bar
+} {0 {myvar b r}}
+test appendComp-7.6 {lappend var triggers read trace, array var exists} {
+ proc bar {} {
+ catch {unset myvar}
+ catch {unset ::result}
+ set myvar(0) 1
+ trace variable myvar r foo
+ proc foo {args} {append ::result $args}
+ lappend myvar(b) a
+ list [catch {set ::result} msg] $msg
+ }
+ bar
+} {0 {myvar b r}}
+test appendComp-7.7 {lappend var triggers read trace, array stack var} {
+ proc bar {} {
+ catch {unset ::myvar}
+ catch {unset ::result}
+ trace variable ::myvar r foo
+ proc foo {args} {append ::result $args}
+ lappend ::myvar(b) a
+ list [catch {set ::result} msg] $msg
+ }
+ bar
+} {0 {::myvar b r}}
+test appendComp-7.8 {lappend var triggers read trace, array stack var} {
+ proc bar {} {
+ catch {unset ::myvar}
+ catch {unset ::result}
+ trace variable ::myvar r foo
+ proc foo {args} {append ::result $args}
+ lappend ::myvar(b) a b
+ list [catch {set ::result} msg] $msg
+ }
+ bar
+} {0 {::myvar b r}}
+test appendComp-7.9 {append var does not trigger read trace} {
+ proc bar {} {
+ catch {unset myvar}
+ catch {unset ::result}
+ trace variable myvar r foo
+ proc foo {args} {append ::result $args}
+ append myvar a
+ info exists ::result
+ }
+ bar
+} {0}
catch {unset i x result y}
catch {rename foo ""}