diff options
Diffstat (limited to 'tests/interp.test')
| -rw-r--r-- | tests/interp.test | 1738 |
1 files changed, 809 insertions, 929 deletions
diff --git a/tests/interp.test b/tests/interp.test index fa263e2..510ab4a 100644 --- a/tests/interp.test +++ b/tests/interp.test @@ -4,62 +4,60 @@ # built-in commands. Sourcing this file into Tcl runs the tests and # generates output for errors. No output means no errors were found. # -# Copyright © 1995-1996 Sun Microsystems, Inc. -# Copyright © 1998-1999 Scriptics Corporation. +# Copyright (c) 1995-1996 Sun Microsystems, Inc. +# Copyright (c) 1998-1999 by Scriptics Corporation. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. -if {"::tcltest" ni [namespace children]} { - package require tcltest 2.5 +if {[lsearch [namespace children] ::tcltest] == -1} { + package require tcltest 2.1 namespace import -force ::tcltest::* } -::tcltest::loadTestedCommands -catch [list package require -exact tcl::test [info patchlevel]] - testConstraint testinterpdelete [llength [info commands testinterpdelete]] -set hidden_cmds {cd encoding exec exit fconfigure file glob load open pwd socket source tcl:encoding:dirs tcl:encoding:system tcl:file:atime tcl:file:attributes tcl:file:copy tcl:file:delete tcl:file:dirname tcl:file:executable tcl:file:exists tcl:file:extension tcl:file:isdirectory tcl:file:isfile tcl:file:link tcl:file:lstat tcl:file:mkdir tcl:file:mtime tcl:file:nativename tcl:file:normalize tcl:file:owned tcl:file:readable tcl:file:readlink tcl:file:rename tcl:file:rootname tcl:file:size tcl:file:stat tcl:file:tail tcl:file:tempdir tcl:file:tempfile tcl:file:type tcl:file:volumes tcl:file:writable tcl:info:cmdtype tcl:info:nameofexecutable tcl:process:autopurge tcl:process:list tcl:process:purge tcl:process:status tcl:zipfs:lmkimg tcl:zipfs:lmkzip tcl:zipfs:mkimg tcl:zipfs:mkkey tcl:zipfs:mkzip tcl:zipfs:mount tcl:zipfs:mount_data tcl:zipfs:unmount unload} +set hidden_cmds {cd encoding exec exit fconfigure file glob load open pwd socket source unload} -foreach i [interp children] { +foreach i [interp slaves] { interp delete $i } - + # Part 0: Check out options for interp command -test interp-1.1 {options for interp command} -returnCodes error -body { - interp -} -result {wrong # args: should be "interp cmd ?arg ...?"} -test interp-1.2 {options for interp command} -returnCodes error -body { - interp frobox -} -result {bad option "frobox": must be alias, aliases, bgerror, cancel, children, create, debug, delete, eval, exists, expose, hide, hidden, issafe, invokehidden, limit, marktrusted, recursionlimit, share, target, or transfer} +test interp-1.1 {options for interp command} { + list [catch {interp} msg] $msg +} {1 {wrong # args: should be "interp cmd ?arg ...?"}} +test interp-1.2 {options for interp command} { + list [catch {interp frobox} msg] $msg +} {1 {bad option "frobox": must be alias, aliases, bgerror, create, debug, delete, eval, exists, expose, hide, hidden, issafe, invokehidden, limit, marktrusted, recursionlimit, slaves, share, target, or transfer}} test interp-1.3 {options for interp command} { interp delete } "" -test interp-1.4 {options for interp command} -returnCodes error -body { - interp delete foo bar -} -result {could not find interpreter "foo"} -test interp-1.5 {options for interp command} -returnCodes error -body { - interp exists foo bar -} -result {wrong # args: should be "interp exists ?path?"} +test interp-1.4 {options for interp command} { + list [catch {interp delete foo bar} msg] $msg +} {1 {could not find interpreter "foo"}} +test interp-1.5 {options for interp command} { + list [catch {interp exists foo bar} msg] $msg +} {1 {wrong # args: should be "interp exists ?path?"}} # # test interp-0.6 was removed # -test interp-1.6 {options for interp command} -returnCodes error -body { - interp children foo bar zop -} -result {wrong # args: should be "interp children ?path?"} -test interp-1.7 {options for interp command} -returnCodes error -body { - interp hello -} -result {bad option "hello": must be alias, aliases, bgerror, cancel, children, create, debug, delete, eval, exists, expose, hide, hidden, issafe, invokehidden, limit, marktrusted, recursionlimit, share, target, or transfer} -test interp-1.8 {options for interp command} -returnCodes error -body { - interp -froboz -} -result {bad option "-froboz": must be alias, aliases, bgerror, cancel, children, create, debug, delete, eval, exists, expose, hide, hidden, issafe, invokehidden, limit, marktrusted, recursionlimit, share, target, or transfer} -test interp-1.9 {options for interp command} -returnCodes error -body { - interp -froboz -safe -} -result {bad option "-froboz": must be alias, aliases, bgerror, cancel, children, create, debug, delete, eval, exists, expose, hide, hidden, issafe, invokehidden, limit, marktrusted, recursionlimit, share, target, or transfer} -test interp-1.10 {options for interp command} -returnCodes error -body { - interp target -} -result {wrong # args: should be "interp target path alias"} +test interp-1.6 {options for interp command} { + list [catch {interp slaves foo bar zop} msg] $msg +} {1 {wrong # args: should be "interp slaves ?path?"}} +test interp-1.7 {options for interp command} { + list [catch {interp hello} msg] $msg +} {1 {bad option "hello": must be alias, aliases, bgerror, create, debug, delete, eval, exists, expose, hide, hidden, issafe, invokehidden, limit, marktrusted, recursionlimit, slaves, share, target, or transfer}} +test interp-1.8 {options for interp command} { + list [catch {interp -froboz} msg] $msg +} {1 {bad option "-froboz": must be alias, aliases, bgerror, create, debug, delete, eval, exists, expose, hide, hidden, issafe, invokehidden, limit, marktrusted, recursionlimit, slaves, share, target, or transfer}} +test interp-1.9 {options for interp command} { + list [catch {interp -froboz -safe} msg] $msg +} {1 {bad option "-froboz": must be alias, aliases, bgerror, create, debug, delete, eval, exists, expose, hide, hidden, issafe, invokehidden, limit, marktrusted, recursionlimit, slaves, share, target, or transfer}} +test interp-1.10 {options for interp command} { + list [catch {interp target} msg] $msg +} {1 {wrong # args: should be "interp target path alias"}} + # Part 1: Basic interpreter creation tests: test interp-2.1 {basic interpreter creation} { @@ -70,12 +68,10 @@ test interp-2.2 {basic interpreter creation} { } 0 test interp-2.3 {basic interpreter creation} { catch {interp create -safe} -} 0 -test interp-2.4 {basic interpreter creation} -setup { - catch {interp create a} -} -returnCodes error -body { - interp create a -} -result {interpreter named "a" already exists, cannot create} +} 0 +test interp-2.4 {basic interpreter creation} { + list [catch {interp create a} msg] $msg +} {1 {interpreter named "a" already exists, cannot create}} test interp-2.5 {basic interpreter creation} { interp create b -safe } b @@ -91,13 +87,11 @@ test interp-2.8 {basic interpreter creation} { test interp-2.9 {basic interpreter creation} { interp create -safe -- -froboz1 } -froboz1 -test interp-2.10 {basic interpreter creation} -setup { - catch {interp create a} -} -body { +test interp-2.10 {basic interpreter creation} { interp create {a x1} interp create {a x2} interp create {a x3} -safe -} -result {a x3} +} {a x3} test interp-2.11 {anonymous interps vs existing procs} { set x [interp create] regexp "interp(\[0-9]+)" $x dummy thenum @@ -105,8 +99,8 @@ test interp-2.11 {anonymous interps vs existing procs} { proc interp$thenum {} {} set x [interp create] regexp "interp(\[0-9]+)" $x dummy anothernum - expr {$anothernum > $thenum} -} 1 + expr $anothernum > $thenum +} 1 test interp-2.12 {anonymous interps vs existing procs} { set x [interp create -safe] regexp "interp(\[0-9]+)" $x dummy thenum @@ -114,56 +108,49 @@ test interp-2.12 {anonymous interps vs existing procs} { proc interp$thenum {} {} set x [interp create -safe] regexp "interp(\[0-9]+)" $x dummy anothernum - expr {$anothernum - $thenum} -} 1 + expr $anothernum - $thenum +} 1 test interp-2.13 {correct default when no $path arg is given} -body { interp create -- } -match regexp -result {interp[0-9]+} - -foreach i [interp children] { + +foreach i [interp slaves] { interp delete $i } -# Part 2: Testing "interp children" and "interp exists" -test interp-3.1 {testing interp exists and interp children} { - interp children +# Part 2: Testing "interp slaves" and "interp exists" +test interp-3.1 {testing interp exists and interp slaves} { + interp slaves } "" -test interp-3.2 {testing interp exists and interp children} { +test interp-3.2 {testing interp exists and interp slaves} { interp create a interp exists a } 1 -test interp-3.3 {testing interp exists and interp children} { +test interp-3.3 {testing interp exists and interp slaves} { interp exists nonexistent } 0 -test interp-3.4 {testing interp exists and interp children} -body { - interp children a b c -} -returnCodes error -result {wrong # args: should be "interp children ?path?"} -test interp-3.5 {testing interp exists and interp children} -body { - interp exists a b c -} -returnCodes error -result {wrong # args: should be "interp exists ?path?"} -test interp-3.6 {testing interp exists and interp children} { +test interp-3.4 {testing interp exists and interp slaves} { + list [catch {interp slaves a b c} msg] $msg +} {1 {wrong # args: should be "interp slaves ?path?"}} +test interp-3.5 {testing interp exists and interp slaves} { + list [catch {interp exists a b c} msg] $msg +} {1 {wrong # args: should be "interp exists ?path?"}} +test interp-3.6 {testing interp exists and interp slaves} { interp exists } 1 -test interp-3.7 {testing interp exists and interp children} -setup { - catch {interp create a} -} -body { - interp children -} -result a -test interp-3.8 {testing interp exists and interp children} -body { - interp children a b c -} -returnCodes error -result {wrong # args: should be "interp children ?path?"} -test interp-3.9 {testing interp exists and interp children} -setup { - catch {interp create a} -} -body { +test interp-3.7 {testing interp exists and interp slaves} { + interp slaves +} a +test interp-3.8 {testing interp exists and interp slaves} { + list [catch {interp slaves a b c} msg] $msg +} {1 {wrong # args: should be "interp slaves ?path?"}} +test interp-3.9 {testing interp exists and interp slaves} { interp create {a a2} -safe - expr {"a2" in [interp children a]} -} -result 1 -test interp-3.10 {testing interp exists and interp children} -setup { - catch {interp create a} - catch {interp create {a a2}} -} -body { + expr {[lsearch [interp slaves a] a2] >= 0} +} 1 +test interp-3.10 {testing interp exists and interp slaves} { interp exists {a a2} -} -result 1 +} 1 # Part 3: Testing "interp delete" test interp-3.11 {testing interp delete} { @@ -173,12 +160,12 @@ test interp-4.1 {testing interp delete} { catch {interp create a} interp delete a } "" -test interp-4.2 {testing interp delete} -returnCodes error -body { - interp delete nonexistent -} -result {could not find interpreter "nonexistent"} -test interp-4.3 {testing interp delete} -returnCodes error -body { - interp delete x y z -} -result {could not find interpreter "x"} +test interp-4.2 {testing interp delete} { + list [catch {interp delete nonexistent} msg] $msg +} {1 {could not find interpreter "nonexistent"}} +test interp-4.3 {testing interp delete} { + list [catch {interp delete x y z} msg] $msg +} {1 {could not find interpreter "x"}} test interp-4.4 {testing interp delete} { interp delete } "" @@ -186,7 +173,7 @@ test interp-4.5 {testing interp delete} { interp create a interp create {a x1} interp delete {a x1} - expr {"x1" in [interp children a]} + expr {[lsearch [interp slaves a] x1] >= 0} } 0 test interp-4.6 {testing interp delete} { interp create c1 @@ -194,23 +181,23 @@ test interp-4.6 {testing interp delete} { interp create c3 interp delete c1 c2 c3 } "" -test interp-4.7 {testing interp delete} -returnCodes error -body { +test interp-4.7 {testing interp delete} { interp create c1 interp create c2 - interp delete c1 c2 c3 -} -result {could not find interpreter "c3"} -test interp-4.8 {testing interp delete} -returnCodes error -body { - interp delete {} -} -result {cannot delete the current interpreter} + list [catch {interp delete c1 c2 c3} msg] $msg +} {1 {could not find interpreter "c3"}} +test interp-4.8 {testing interp delete} { + list [catch {interp delete {}} msg] $msg +} {1 {cannot delete the current interpreter}} -foreach i [interp children] { +foreach i [interp slaves] { interp delete $i } # Part 4: Consistency checking - all nondeleted interpreters should be # there: test interp-5.1 {testing consistency} { - interp children + interp slaves } "" test interp-5.2 {testing consistency} { interp exists a @@ -224,83 +211,80 @@ interp create a # Part 5: Testing eval in interpreter object command and with interp command test interp-6.1 {testing eval} { - a eval expr {{3 + 5}} + a eval expr 3 + 5 } 8 -test interp-6.2 {testing eval} -returnCodes error -body { - a eval foo -} -result {invalid command name "foo"} +test interp-6.2 {testing eval} { + list [catch {a eval foo} msg] $msg +} {1 {invalid command name "foo"}} test interp-6.3 {testing eval} { - a eval {proc foo {} {expr {3 + 5}}} + a eval {proc foo {} {expr 3 + 5}} a eval foo } 8 -catch {a eval {proc foo {} {expr {3 + 5}}}} test interp-6.4 {testing eval} { interp eval a foo } 8 + test interp-6.5 {testing eval} { interp create {a x2} - interp eval {a x2} {proc frob {} {expr {4 * 9}}} + interp eval {a x2} {proc frob {} {expr 4 * 9}} interp eval {a x2} frob } 36 -catch {interp create {a x2}} -test interp-6.6 {testing eval} -returnCodes error -body { - interp eval {a x2} foo -} -result {invalid command name "foo"} - -# UTILITY PROCEDURE RUNNING IN PARENT INTERPRETER: -proc in_parent {args} { - return [list seen in parent: $args] +test interp-6.6 {testing eval} { + list [catch {interp eval {a x2} foo} msg] $msg +} {1 {invalid command name "foo"}} + +# UTILITY PROCEDURE RUNNING IN MASTER INTERPRETER: +proc in_master {args} { + return [list seen in master: $args] } # Part 6: Testing basic alias creation test interp-7.1 {testing basic alias creation} { - a alias foo in_parent + a alias foo in_master } foo -catch {a alias foo in_parent} test interp-7.2 {testing basic alias creation} { - a alias bar in_parent a1 a2 a3 + a alias bar in_master a1 a2 a3 } bar -catch {a alias bar in_parent a1 a2 a3} # Test 6.3 has been deleted. test interp-7.3 {testing basic alias creation} { a alias foo -} in_parent +} in_master test interp-7.4 {testing basic alias creation} { a alias bar -} {in_parent a1 a2 a3} +} {in_master a1 a2 a3} test interp-7.5 {testing basic alias creation} { lsort [a aliases] } {bar foo} -test interp-7.6 {testing basic aliases arg checking} -returnCodes error -body { - a aliases too many args -} -result {wrong # args: should be "a aliases"} +test interp-7.6 {testing basic aliases arg checking} { + list [catch {a aliases too many args} msg] $msg +} {1 {wrong # args: should be "a aliases"}} # Part 7: testing basic alias invocation test interp-8.1 {testing basic alias invocation} { catch {interp create a} - a alias foo in_parent + a alias foo in_master a eval foo s1 s2 s3 -} {seen in parent: {s1 s2 s3}} +} {seen in master: {s1 s2 s3}} test interp-8.2 {testing basic alias invocation} { catch {interp create a} - a alias bar in_parent a1 a2 a3 + a alias bar in_master a1 a2 a3 a eval bar s1 s2 s3 -} {seen in parent: {a1 a2 a3 s1 s2 s3}} -test interp-8.3 {testing basic alias invocation} -returnCodes error -body { +} {seen in master: {a1 a2 a3 s1 s2 s3}} +test interp-8.3 {testing basic alias invocation} { catch {interp create a} - a alias -} -result {wrong # args: should be "a alias aliasName ?targetName? ?arg ...?"} + list [catch {a alias} msg] $msg +} {1 {wrong # args: should be "a alias aliasName ?targetName? ?args..?"}} # Part 8: Testing aliases for non-existent or hidden targets test interp-9.1 {testing aliases for non-existent targets} { catch {interp create a} - a alias zop nonexistent-command-in-parent + a alias zop nonexistent-command-in-master list [catch {a eval zop} msg] $msg -} {1 {invalid command name "nonexistent-command-in-parent"}} +} {1 {invalid command name "nonexistent-command-in-master"}} test interp-9.2 {testing aliases for non-existent targets} { catch {interp create a} - a alias zop nonexistent-command-in-parent - proc nonexistent-command-in-parent {} {return i_exist!} + a alias zop nonexistent-command-in-master + proc nonexistent-command-in-master {} {return i_exist!} a eval zop } i_exist! test interp-9.3 {testing aliases for hidden commands} { @@ -329,8 +313,8 @@ test interp-9.4 {testing aliases and namespace commands} { set res } {GLOBAL GLOBAL} -if {[info command nonexistent-command-in-parent] != ""} { - rename nonexistent-command-in-parent {} +if {[info command nonexistent-command-in-master] != ""} { + rename nonexistent-command-in-master {} } # Part 9: Aliasing between interpreters @@ -380,9 +364,9 @@ test interp-10.6 {testing aliasing between interpreters} { interp create a interp create b interp alias a a_command b b_command a1 a2 a3 - b alias b_command in_parent b1 b2 b3 + b alias b_command in_master b1 b2 b3 a eval a_command m1 m2 m3 -} {seen in parent: {b1 b2 b3 a1 a2 a3 m1 m2 m3}} +} {seen in master: {b1 b2 b3 a1 a2 a3 m1 m2 m3}} test interp-10.7 {testing aliases between interpreters} { catch {interp delete a} interp create a @@ -447,78 +431,83 @@ test interp-11.7 {testing interp target} { test interp-12.1 {testing interp issafe} { interp issafe } 0 -test interp-12.2 {testing interp issafe} { +test interp-12.2 {testing interp issafe} -setup { catch {interp delete a} +} -body { interp create a interp issafe a -} 0 -test interp-12.3 {testing interp issafe} { +} -result 0 +test interp-12.3 {testing interp issafe} -setup { catch {interp delete a} +} -body { interp create a interp create {a x3} -safe interp issafe {a x3} -} 1 -test interp-12.4 {testing interp issafe} { +} -result 1 +test interp-12.4 {testing interp issafe} -setup { catch {interp delete a} +} -body { interp create a interp create {a x3} -safe interp create {a x3 foo} interp issafe {a x3 foo} -} 1 +} -result 1 # Part 12: testing interpreter object command "issafe" sub-command -test interp-13.1 {testing foo issafe} { +test interp-13.1 {testing foo issafe} -setup { catch {interp delete a} +} -body { interp create a a issafe -} 0 -test interp-13.2 {testing foo issafe} { +} -result 0 +test interp-13.2 {testing foo issafe} -setup { catch {interp delete a} +} -body { interp create a interp create {a x3} -safe a eval x3 issafe -} 1 -test interp-13.3 {testing foo issafe} { +} -result 1 +test interp-13.3 {testing foo issafe} -setup { catch {interp delete a} +} -body { interp create a interp create {a x3} -safe interp create {a x3 foo} a eval x3 eval foo issafe -} 1 -test interp-13.4 {testing issafe arg checking} { +} -result 1 +test interp-13.4 {testing issafe arg checking} -body { catch {interp create a} - list [catch {a issafe too many args} msg] $msg -} {1 {wrong # args: should be "a issafe"}} + a issafe too many args +} -returnCodes error -result {wrong # args: should be "a issafe"} # part 14: testing interp aliases -test interp-14.1 {testing interp aliases} -setup { - interp create abc -} -body { - interp eval abc {interp aliases} -} -cleanup { - interp delete abc -} -result "" -test interp-14.2 {testing interp aliases} { +test interp-14.1 {testing interp aliases} { + interp aliases +} "" +test interp-14.2 {testing interp aliases} -setup { catch {interp delete a} +} -body { interp create a a alias a1 puts a alias a2 puts a alias a3 puts lsort [interp aliases a] -} {a1 a2 a3} -test interp-14.3 {testing interp aliases} { +} -result {a1 a2 a3} +test interp-14.3 {testing interp aliases} -setup { catch {interp delete a} +} -body { interp create a interp create {a x3} interp alias {a x3} froboz "" puts interp aliases {a x3} -} froboz -test interp-14.4 {testing interp alias - alias over parent} { - # SF Bug 641195 +} -result froboz +test interp-14.4 {testing interp alias - alias over master} -setup { catch {interp delete a} +} -body { + # SF Bug 641195 interp create a list [catch {interp alias "" a a eval} msg] $msg [info commands a] -} {1 {cannot define or rename alias "a": interpreter deleted} {}} +} -result {1 {cannot define or rename alias "a": interpreter deleted} {}} test interp-14.5 {testing interp-alias: wrong # args} -body { proc setx x {set x} interp alias {} a {} setx @@ -606,18 +595,6 @@ test interp-14.10 {testing interp-alias: error messages} -setup { invoked from within "a 1"} -test interp-14.11 {{interp alias} {target named the empty string} {bug 2bf56185}} -setup { - set interp [interp create [info cmdcount]] - interp eval $interp { - proc {} args {return $args} - } - -} -body { - interp alias {} p1 $interp {} - p1 one two three -} -cleanup { - interp delete $interp -} -result {one two three} # part 15: testing file sharing test interp-15.1 {testing file sharing} { @@ -699,7 +676,8 @@ test interp-15.8 {testing file transferring} -body { # Torture tests for interpreter deletion order # proc kill {} {interp delete xxx} -test interp-16.0 {testing deletion order} { + +test interp-15.9 {testing deletion order} { catch {interp delete xxx} interp create xxx xxx alias kill kill @@ -746,7 +724,7 @@ test interp-16.5 {testing deletion order, bgerror} { xxx eval {proc bgerror {args} {exit}} xxx alias exit kill xxx proc kill {i} {interp delete $i} - xxx eval after 100 expr {a + b} + xxx eval after 100 expr a + b after 200 update interp exists xxx @@ -793,32 +771,32 @@ test interp-17.6 {alias loop prevention} { } {1 {cannot define or rename alias "b": would create a loop}} # -# Test robustness of Tcl_DeleteInterp when applied to a child interpreter. +# Test robustness of Tcl_DeleteInterp when applied to a slave interpreter. # If there are bugs in the implementation these tests are likely to expose # the bugs as a core dump. # -test interp-18.1 {testing Tcl_DeleteInterp vs children} testinterpdelete { +test interp-18.1 {testing Tcl_DeleteInterp vs slaves} testinterpdelete { list [catch {testinterpdelete} msg] $msg } {1 {wrong # args: should be "testinterpdelete path"}} -test interp-18.2 {testing Tcl_DeleteInterp vs children} testinterpdelete { +test interp-18.2 {testing Tcl_DeleteInterp vs slaves} testinterpdelete { catch {interp delete a} interp create a testinterpdelete a } "" -test interp-18.3 {testing Tcl_DeleteInterp vs children} testinterpdelete { +test interp-18.3 {testing Tcl_DeleteInterp vs slaves} testinterpdelete { catch {interp delete a} interp create a interp create {a b} testinterpdelete {a b} } "" -test interp-18.4 {testing Tcl_DeleteInterp vs children} testinterpdelete { +test interp-18.4 {testing Tcl_DeleteInterp vs slaves} testinterpdelete { catch {interp delete a} interp create a interp create {a b} testinterpdelete a } "" -test interp-18.5 {testing Tcl_DeleteInterp vs children} testinterpdelete { +test interp-18.5 {testing Tcl_DeleteInterp vs slaves} testinterpdelete { catch {interp delete a} interp create a interp create {a b} @@ -826,7 +804,7 @@ test interp-18.5 {testing Tcl_DeleteInterp vs children} testinterpdelete { proc dodel {x} {testinterpdelete $x} list [catch {interp eval {a b} {dodel {a b}}} msg] $msg } {0 {}} -test interp-18.6 {testing Tcl_DeleteInterp vs children} testinterpdelete { +test interp-18.6 {testing Tcl_DeleteInterp vs slaves} testinterpdelete { catch {interp delete a} interp create a interp create {a b} @@ -876,12 +854,12 @@ test interp-18.9 {eval in deleted interp, bug 495830} { interp create tst interp alias tst suicide {} interp delete tst list [catch {tst eval {suicide; set a 5}} msg] $msg -} {1 {attempt to call eval in deleted interpreter}} +} {1 {attempt to call eval in deleted interpreter}} test interp-18.10 {eval in deleted interp, bug 495830} { interp create tst interp alias tst suicide {} interp delete tst list [catch {tst eval {set set set; suicide; $set a 5}} msg] $msg -} {1 {attempt to call eval in deleted interpreter}} +} {1 {attempt to call eval in deleted interpreter}} # Test alias deletion @@ -966,12 +944,12 @@ test interp-19.9 {alias deletion, renaming} { interp create a interp alias a foo a bar interp eval a rename foo blotz - interp eval a {proc foo {} {expr {34 * 34}}} + interp eval a {proc foo {} {expr 34 * 34}} interp alias a foo {} set l [interp eval a foo] interp delete a set l -} 1156 +} 1156 test interp-20.1 {interp hide, interp expose and interp invokehidden} { set a [interp create] @@ -1192,7 +1170,7 @@ test interp-20.21 {interp hide vs safety} { catch {interp delete a} interp create a -safe set l "" - lappend l [catch {a hide list} msg] + lappend l [catch {a hide list} msg] lappend l $msg interp delete a set l @@ -1201,7 +1179,7 @@ test interp-20.22 {interp hide vs safety} { catch {interp delete a} interp create a -safe set l "" - lappend l [catch {interp hide a list} msg] + lappend l [catch {interp hide a list} msg] lappend l $msg interp delete a set l @@ -1210,7 +1188,7 @@ test interp-20.23 {interp hide vs safety} { catch {interp delete a} interp create a -safe set l "" - lappend l [catch {a eval {interp hide {} list}} msg] + lappend l [catch {a eval {interp hide {} list}} msg] lappend l $msg interp delete a set l @@ -1220,7 +1198,7 @@ test interp-20.24 {interp hide vs safety} { interp create a -safe interp create {a b} set l "" - lappend l [catch {a eval {interp hide b list}} msg] + lappend l [catch {a eval {interp hide b list}} msg] lappend l $msg interp delete a set l @@ -1239,7 +1217,7 @@ test interp-20.26 {interp expoose vs safety} { catch {interp delete a} interp create a -safe set l "" - lappend l [catch {a hide list} msg] + lappend l [catch {a hide list} msg] lappend l $msg lappend l [catch {a expose list} msg] lappend l $msg @@ -1250,9 +1228,9 @@ test interp-20.27 {interp expose vs safety} { catch {interp delete a} interp create a -safe set l "" - lappend l [catch {interp hide a list} msg] + lappend l [catch {interp hide a list} msg] lappend l $msg - lappend l [catch {interp expose a list} msg] + lappend l [catch {interp expose a list} msg] lappend l $msg interp delete a set l @@ -1261,7 +1239,7 @@ test interp-20.28 {interp expose vs safety} { catch {interp delete a} interp create a -safe set l "" - lappend l [catch {a hide list} msg] + lappend l [catch {a hide list} msg] lappend l $msg lappend l [catch {a eval {interp expose {} list}} msg] lappend l $msg @@ -1272,9 +1250,9 @@ test interp-20.29 {interp expose vs safety} { catch {interp delete a} interp create a -safe set l "" - lappend l [catch {interp hide a list} msg] + lappend l [catch {interp hide a list} msg] lappend l $msg - lappend l [catch {a eval {interp expose {} list}} msg] + lappend l [catch {a eval {interp expose {} list}} msg] lappend l $msg interp delete a set l @@ -1284,9 +1262,9 @@ test interp-20.30 {interp expose vs safety} { interp create a -safe interp create {a b} set l "" - lappend l [catch {interp hide {a b} list} msg] + lappend l [catch {interp hide {a b} list} msg] lappend l $msg - lappend l [catch {a eval {interp expose b list}} msg] + lappend l [catch {a eval {interp expose b list}} msg] lappend l $msg interp delete a set l @@ -1296,7 +1274,7 @@ test interp-20.31 {interp expose vs safety} { interp create a -safe interp create {a b} set l "" - lappend l [catch {interp hide {a b} list} msg] + lappend l [catch {interp hide {a b} list} msg] lappend l $msg lappend l [catch {interp expose {a b} list} msg] lappend l $msg @@ -1615,36 +1593,15 @@ test interp-20.49 {interp invokehidden -namespace} -setup { set script [makeFile { set x [namespace current] } script] - interp create -safe child + interp create -safe slave } -body { - child invokehidden -namespace ::foo source $script - child eval {set ::foo::x} + slave invokehidden -namespace ::foo source $script + slave eval {set ::foo::x} } -cleanup { - interp delete child + interp delete slave removeFile script } -result ::foo -test interp-20.50 {Bug 2486550} -setup { - interp create child -} -body { - child hide coroutine - child invokehidden coroutine -} -cleanup { - interp delete child -} -returnCodes error -match glob -result * -test interp-20.50.1 {Bug 2486550} -setup { - interp create child -} -body { - child hide coroutine - catch {child invokehidden coroutine} m o - dict get $o -errorinfo -} -cleanup { - unset -nocomplain m 0 - interp delete child -} -result {wrong # args: should be "coroutine name cmd ?arg ...?" - while executing -"coroutine" - invoked from within -"child invokehidden coroutine"} + test interp-21.1 {interp hidden} { interp hidden {} @@ -1652,73 +1609,67 @@ test interp-21.1 {interp hidden} { test interp-21.2 {interp hidden} { interp hidden } "" -test interp-21.3 {interp hidden vs interp hide, interp expose} -setup { +test interp-21.3 {interp hidden vs interp hide, interp expose} { set l "" -} -body { lappend l [interp hidden] interp hide {} pwd lappend l [interp hidden] interp expose {} pwd lappend l [interp hidden] -} -result {{} pwd {}} -test interp-21.4 {interp hidden} -setup { + set l +} {{} pwd {}} +test interp-21.4 {interp hidden} { catch {interp delete a} -} -body { interp create a - interp hidden a -} -cleanup { + set l [interp hidden a] interp delete a -} -result "" -test interp-21.5 {interp hidden} -setup { + set l +} "" +test interp-21.5 {interp hidden} { catch {interp delete a} -} -body { interp create -safe a - lsort [interp hidden a] -} -cleanup { + set l [lsort [interp hidden a]] interp delete a -} -result $hidden_cmds -test interp-21.6 {interp hidden vs interp hide, interp expose} -setup { + set l +} $hidden_cmds +test interp-21.6 {interp hidden vs interp hide, interp expose} { catch {interp delete a} - set l "" -} -body { interp create a + set l "" lappend l [interp hidden a] interp hide a pwd lappend l [interp hidden a] interp expose a pwd lappend l [interp hidden a] -} -cleanup { interp delete a -} -result {{} pwd {}} -test interp-21.7 {interp hidden} -setup { + set l +} {{} pwd {}} +test interp-21.7 {interp hidden} { catch {interp delete a} -} -body { interp create a - a hidden -} -cleanup { + set l [a hidden] interp delete a -} -result "" -test interp-21.8 {interp hidden} -setup { + set l +} "" +test interp-21.8 {interp hidden} { catch {interp delete a} -} -body { interp create a -safe - lsort [a hidden] -} -cleanup { + set l [lsort [a hidden]] interp delete a -} -result $hidden_cmds -test interp-21.9 {interp hidden vs interp hide, interp expose} -setup { + set l +} $hidden_cmds +test interp-21.9 {interp hidden vs interp hide, interp expose} { catch {interp delete a} - set l "" -} -body { interp create a + set l "" lappend l [a hidden] a hide pwd lappend l [a hidden] a expose pwd lappend l [a hidden] -} -cleanup { interp delete a -} -result {{} pwd {}} + set l +} {{} pwd {}} test interp-22.1 {testing interp marktrusted} { catch {interp delete a} @@ -1818,161 +1769,183 @@ test interp-22.9 {testing interp marktrusted} { set l } {1 1 1 0 0} -test interp-23.1 {testing hiding vs aliases: unsafe interp} -setup { +test interp-23.1 {testing hiding vs aliases} { catch {interp delete a} - set l "" -} -body { interp create a + set l "" lappend l [interp hidden a] a alias bar bar - lappend l [interp aliases a] [interp hidden a] + lappend l [interp aliases a] + lappend l [interp hidden a] a hide bar - lappend l [interp aliases a] [interp hidden a] + lappend l [interp aliases a] + lappend l [interp hidden a] a alias bar {} - lappend l [interp aliases a] [interp hidden a] -} -cleanup { + lappend l [interp aliases a] + lappend l [interp hidden a] interp delete a -} -result {{} bar {} bar bar {} {}} -test interp-23.2 {testing hiding vs aliases: safe interp} -setup { + set l +} {{} bar {} bar bar {} {}} +test interp-23.2 {testing hiding vs aliases} {unixOrPc} { catch {interp delete a} - set l "" -} -constraints {unixOrWin} -body { interp create a -safe + set l "" lappend l [lsort [interp hidden a]] a alias bar bar - lappend l [lsort [interp aliases a]] [lsort [interp hidden a]] + lappend l [lsort [interp aliases a]] + lappend l [lsort [interp hidden a]] a hide bar - lappend l [lsort [interp aliases a]] [lsort [interp hidden a]] + lappend l [lsort [interp aliases a]] + lappend l [lsort [interp hidden a]] a alias bar {} - lappend l [lsort [interp aliases a]] [lsort [interp hidden a]] -} -cleanup { + lappend l [lsort [interp aliases a]] + lappend l [lsort [interp hidden a]] interp delete a -} -result [list $hidden_cmds {bar clock} $hidden_cmds {bar clock} [lsort [concat $hidden_cmds bar]] {clock} $hidden_cmds] + set l +} {{cd encoding exec exit fconfigure file glob load open pwd socket source unload} {::tcl::mathfunc::max ::tcl::mathfunc::min bar clock} {cd encoding exec exit fconfigure file glob load open pwd socket source unload} {::tcl::mathfunc::max ::tcl::mathfunc::min bar clock} {bar cd encoding exec exit fconfigure file glob load open pwd socket source unload} {::tcl::mathfunc::max ::tcl::mathfunc::min clock} {cd encoding exec exit fconfigure file glob load open pwd socket source unload}} -test interp-24.1 {result resetting on error} -setup { +test interp-24.1 {result resetting on error} { catch {interp delete a} -} -body { interp create a - interp alias a foo {} apply {args {error $args}} - interp eval a { - lappend l [catch {foo 1 2 3} msg] $msg - lappend l [catch {foo 3 4 5} msg] $msg - } -} -cleanup { + proc foo args {error $args} + interp alias a foo {} foo + set l [interp eval a { + set l {} + lappend l [catch {foo 1 2 3} msg] + lappend l $msg + lappend l [catch {foo 3 4 5} msg] + lappend l $msg + set l + }] interp delete a -} -result {1 {1 2 3} 1 {3 4 5}} -test interp-24.2 {result resetting on error} -setup { + rename foo {} + set l +} {1 {1 2 3} 1 {3 4 5}} +test interp-24.2 {result resetting on error} { catch {interp delete a} -} -body { interp create a -safe - interp alias a foo {} apply {args {error $args}} - interp eval a { - lappend l [catch {foo 1 2 3} msg] $msg - lappend l [catch {foo 3 4 5} msg] $msg - } -} -cleanup { + proc foo args {error $args} + interp alias a foo {} foo + set l [interp eval a { + set l {} + lappend l [catch {foo 1 2 3} msg] + lappend l $msg + lappend l [catch {foo 3 4 5} msg] + lappend l $msg + set l + }] interp delete a -} -result {1 {1 2 3} 1 {3 4 5}} -test interp-24.3 {result resetting on error} -setup { + rename foo {} + set l +} {1 {1 2 3} 1 {3 4 5}} +test interp-24.3 {result resetting on error} { catch {interp delete a} -} -body { interp create a interp create {a b} interp eval a { proc foo args {error $args} } interp alias {a b} foo a foo - interp eval {a b} { - lappend l [catch {foo 1 2 3} msg] $msg - lappend l [catch {foo 3 4 5} msg] $msg - } -} -cleanup { + set l [interp eval {a b} { + set l {} + lappend l [catch {foo 1 2 3} msg] + lappend l $msg + lappend l [catch {foo 3 4 5} msg] + lappend l $msg + set l + }] interp delete a -} -result {1 {1 2 3} 1 {3 4 5}} -test interp-24.4 {result resetting on error} -setup { + set l +} {1 {1 2 3} 1 {3 4 5}} +test interp-24.4 {result resetting on error} { catch {interp delete a} -} -body { interp create a -safe interp create {a b} interp eval a { proc foo args {error $args} } interp alias {a b} foo a foo - interp eval {a b} { + set l [interp eval {a b} { + set l {} lappend l [catch {foo 1 2 3} msg] lappend l $msg lappend l [catch {foo 3 4 5} msg] lappend l $msg - } -} -cleanup { + set l + }] interp delete a -} -result {1 {1 2 3} 1 {3 4 5}} -test interp-24.5 {result resetting on error} -setup { + set l +} {1 {1 2 3} 1 {3 4 5}} +test interp-24.5 {result resetting on error} { catch {interp delete a} catch {interp delete b} -} -body { interp create a interp create b interp eval a { proc foo args {error $args} } interp alias b foo a foo - interp eval b { - lappend l [catch {foo 1 2 3} msg] $msg - lappend l [catch {foo 3 4 5} msg] $msg - } -} -cleanup { + set l [interp eval b { + set l {} + lappend l [catch {foo 1 2 3} msg] + lappend l $msg + lappend l [catch {foo 3 4 5} msg] + lappend l $msg + set l + }] interp delete a - interp delete b -} -result {1 {1 2 3} 1 {3 4 5}} -test interp-24.6 {result resetting on error} -setup { + set l +} {1 {1 2 3} 1 {3 4 5}} +test interp-24.6 {result resetting on error} { catch {interp delete a} catch {interp delete b} -} -body { interp create a -safe interp create b -safe interp eval a { proc foo args {error $args} } interp alias b foo a foo - interp eval b { - lappend l [catch {foo 1 2 3} msg] $msg - lappend l [catch {foo 3 4 5} msg] $msg - } -} -cleanup { + set l [interp eval b { + set l {} + lappend l [catch {foo 1 2 3} msg] + lappend l $msg + lappend l [catch {foo 3 4 5} msg] + lappend l $msg + set l + }] interp delete a - interp delete b -} -result {1 {1 2 3} 1 {3 4 5}} -test interp-24.7 {result resetting on error} -setup { + set l +} {1 {1 2 3} 1 {3 4 5}} +test interp-24.7 {result resetting on error} { catch {interp delete a} - set l {} -} -body { interp create a interp eval a { proc foo args {error $args} } - lappend l [catch {interp eval a foo 1 2 3} msg] $msg - lappend l [catch {interp eval a foo 3 4 5} msg] $msg -} -cleanup { + set l {} + lappend l [catch {interp eval a foo 1 2 3} msg] + lappend l $msg + lappend l [catch {interp eval a foo 3 4 5} msg] + lappend l $msg interp delete a -} -result {1 {1 2 3} 1 {3 4 5}} -test interp-24.8 {result resetting on error} -setup { + set l +} {1 {1 2 3} 1 {3 4 5}} +test interp-24.8 {result resetting on error} { catch {interp delete a} - set l {} -} -body { interp create a -safe interp eval a { proc foo args {error $args} } - lappend l [catch {interp eval a foo 1 2 3} msg] $msg - lappend l [catch {interp eval a foo 3 4 5} msg] $msg -} -cleanup { + set l {} + lappend l [catch {interp eval a foo 1 2 3} msg] + lappend l $msg + lappend l [catch {interp eval a foo 3 4 5} msg] + lappend l $msg interp delete a -} -result {1 {1 2 3} 1 {3 4 5}} -test interp-24.9 {result resetting on error} -setup { + set l +} {1 {1 2 3} 1 {3 4 5}} +test interp-24.9 {result resetting on error} { catch {interp delete a} - set l {} -} -body { interp create a interp create {a b} interp eval {a b} { @@ -1983,15 +1956,16 @@ test interp-24.9 {result resetting on error} -setup { eval interp eval b foo $args } } - lappend l [catch {interp eval a foo 1 2 3} msg] $msg - lappend l [catch {interp eval a foo 3 4 5} msg] $msg -} -cleanup { + set l {} + lappend l [catch {interp eval a foo 1 2 3} msg] + lappend l $msg + lappend l [catch {interp eval a foo 3 4 5} msg] + lappend l $msg interp delete a -} -result {1 {1 2 3} 1 {3 4 5}} -test interp-24.10 {result resetting on error} -setup { + set l +} {1 {1 2 3} 1 {3 4 5}} +test interp-24.10 {result resetting on error} { catch {interp delete a} - set l {} -} -body { interp create a -safe interp create {a b} interp eval {a b} { @@ -2002,14 +1976,16 @@ test interp-24.10 {result resetting on error} -setup { eval interp eval b foo $args } } - lappend l [catch {interp eval a foo 1 2 3} msg] $msg - lappend l [catch {interp eval a foo 3 4 5} msg] $msg -} -cleanup { + set l {} + lappend l [catch {interp eval a foo 1 2 3} msg] + lappend l $msg + lappend l [catch {interp eval a foo 3 4 5} msg] + lappend l $msg interp delete a -} -result {1 {1 2 3} 1 {3 4 5}} -test interp-24.11 {result resetting on error} -setup { + set l +} {1 {1 2 3} 1 {3 4 5}} +test interp-24.11 {result resetting on error} { catch {interp delete a} -} -body { interp create a interp create {a b} interp eval {a b} { @@ -2017,17 +1993,20 @@ test interp-24.11 {result resetting on error} -setup { } interp eval a { proc foo args { - lappend l [catch {eval interp eval b foo $args} msg] $msg - lappend l [catch {eval interp eval b foo $args} msg] $msg + set l {} + lappend l [catch {eval interp eval b foo $args} msg] + lappend l $msg + lappend l [catch {eval interp eval b foo $args} msg] + lappend l $msg + set l } } - interp eval a foo 1 2 3 -} -cleanup { + set l [interp eval a foo 1 2 3] interp delete a -} -result {1 {1 2 3} 1 {1 2 3}} -test interp-24.12 {result resetting on error} -setup { + set l +} {1 {1 2 3} 1 {1 2 3}} +test interp-24.12 {result resetting on error} { catch {interp delete a} -} -body { interp create a -safe interp create {a b} interp eval {a b} { @@ -2035,22 +2014,28 @@ test interp-24.12 {result resetting on error} -setup { } interp eval a { proc foo args { - lappend l [catch {eval interp eval b foo $args} msg] $msg - lappend l [catch {eval interp eval b foo $args} msg] $msg + set l {} + lappend l [catch {eval interp eval b foo $args} msg] + lappend l $msg + lappend l [catch {eval interp eval b foo $args} msg] + lappend l $msg + set l } } - interp eval a foo 1 2 3 -} -cleanup { + set l [interp eval a foo 1 2 3] interp delete a -} -result {1 {1 2 3} 1 {1 2 3}} + set l +} {1 {1 2 3} 1 {1 2 3}} + +unset hidden_cmds -test interp-25.1 {testing aliasing of string commands} -setup { +test interp-25.1 {testing aliasing of string commands} { catch {interp delete a} -} -body { interp create a a alias exec foo ;# Relies on exec being a string command! interp delete a -} -result "" +} "" + # # Interps result transmission @@ -2058,8 +2043,9 @@ test interp-25.1 {testing aliasing of string commands} -setup { test interp-26.1 {result code transmission : interp eval direct} { # Test that all the possibles error codes from Tcl get passed up - # from the child interp's context to the parent, even though the - # child nominally thinks the command is running at the root level. + # from the slave interp's context to the master, even though the + # slave nominally thinks the command is running at the root level. + catch {interp delete a} interp create a set res {} @@ -2070,6 +2056,8 @@ test interp-26.1 {result code transmission : interp eval direct} { interp delete a set res } {-1 0 1 2 3 4 5} + + test interp-26.2 {result code transmission : interp eval indirect} { # retcode == 2 == return is special catch {interp delete a} @@ -2083,10 +2071,12 @@ test interp-26.2 {result code transmission : interp eval indirect} { interp delete a set res } {-1 ret-1 0 ret0 1 ret1 0 ret2 3 ret3 4 ret4 5 ret5} + test interp-26.3 {result code transmission : aliases} { - # Test that all the possibles error codes from Tcl get passed up from the - # child interp's context to the parent, even though the child nominally - # thinks the command is running at the root level. + # Test that all the possibles error codes from Tcl get passed up + # from the slave interp's context to the master, even though the + # slave nominally thinks the command is running at the root level. + catch {interp delete a} interp create a set res {} @@ -2100,6 +2090,7 @@ test interp-26.3 {result code transmission : aliases} { interp delete a set res } {-1 0 1 2 3 4 5} + test interp-26.4 {result code transmission: invoke hidden direct--bug 1637} \ {knownBug} { # The known bug is that code 2 is returned, not the -code argument @@ -2113,35 +2104,36 @@ test interp-26.4 {result code transmission: invoke hidden direct--bug 1637} \ interp delete a set res } {-1 0 1 2 3 4 5} -test interp-26.5 {result code transmission: invoke hidden indirect--bug 1637} -setup { + +test interp-26.5 {result code transmission: invoke hidden indirect--bug 1637} \ + {knownBug} { + # The known bug is that the break and continue should raise errors + # that they are used outside a loop. catch {interp delete a} interp create a -} -body { - # The known bug is that the break and continue should raise errors that - # they are used outside a loop. set res {} interp eval a {proc retcode {code} {return -code $code ret$code}} interp hide a retcode for {set code -1} {$code<=5} {incr code} { lappend res [catch {interp invokehidden a retcode $code} msg] $msg } - return $res -} -cleanup { interp delete a -} -result {-1 ret-1 0 ret0 1 ret1 2 ret2 3 ret3 4 ret4 5 ret5} -test interp-26.6 {result code transmission: all combined--bug 1637} -setup { - set interp [interp create] -} -constraints knownBug -body { - # Test that all the possibles error codes from Tcl get passed in both - # directions. This doesn't work. + set res +} {-1 ret-1 0 ret0 1 ret1 0 ret2 3 ret3 4 ret4 5 ret5} + +test interp-26.6 {result code transmission: all combined--bug 1637} \ + {knownBug} { + # Test that all the possibles error codes from Tcl get passed + # In both directions. This doesn't work. + set interp [interp create]; proc MyTestAlias {interp args} { - global aliasTrace - lappend aliasTrace $args + global aliasTrace; + lappend aliasTrace $args; interp invokehidden $interp {*}$args } foreach c {return} { - interp hide $interp $c - interp alias $interp $c {} MyTestAlias $interp $c + interp hide $interp $c; + interp alias $interp $c {} MyTestAlias $interp $c; } interp eval $interp {proc ret {code} {return -code $code ret$code}} set res {} @@ -2149,247 +2141,248 @@ test interp-26.6 {result code transmission: all combined--bug 1637} -setup { for {set code -1} {$code<=5} {incr code} { lappend res [catch {interp eval $interp ret $code} msg] $msg } - return $res -} -cleanup { - interp delete $interp -} -result {-1 ret-1 0 ret0 1 ret1 0 ret2 3 ret3 4 ret4 5 ret5} -# Some tests might need to be added to check for difference between toplevel -# and non-toplevel evals. + interp delete $interp; + set res +} {-1 ret-1 0 ret0 1 ret1 0 ret2 3 ret3 4 ret4 5 ret5} + +# Some tests might need to be added to check for difference between +# toplevel and non toplevel evals. + # End of return code transmission section -test interp-26.7 {errorInfo transmission: regular interps} -setup { - set interp [interp create] -} -body { + +test interp-26.7 {errorInfo transmission: regular interps} { + set interp [interp create]; proc MyError {secret} { return -code error "msg" } proc MyTestAlias {interp args} { MyError "some secret" } - interp alias $interp test {} MyTestAlias $interp - interp eval $interp {catch test;set ::errorInfo} -} -cleanup { - interp delete $interp -} -result {msg + interp alias $interp test {} MyTestAlias $interp; + set res [interp eval $interp {catch test;set ::errorInfo}] + interp delete $interp; + set res +} {msg while executing "MyError "some secret"" (procedure "MyTestAlias" line 2) invoked from within "test"} -test interp-26.8 {errorInfo transmission: safe interps--bug 1637} -setup { - set interp [interp create -safe] -} -constraints knownBug -body { - # this test fails because the errorInfo is fully transmitted whether the - # interp is safe or not. The errorInfo should never report data from the - # parent interpreter because it could contain sensitive information. + +test interp-26.8 {errorInfo transmission: safe interps--bug 1637} {knownBug} { + # this test fails because the errorInfo is fully transmitted + # whether the interp is safe or not. The errorInfo should never + # report data from the master interpreter because it could + # contain sensitive information. + set interp [interp create -safe]; proc MyError {secret} { return -code error "msg" } proc MyTestAlias {interp args} { MyError "some secret" } - interp alias $interp test {} MyTestAlias $interp - interp eval $interp {catch test;set ::errorInfo} -} -cleanup { - interp delete $interp -} -result {msg + interp alias $interp test {} MyTestAlias $interp; + set res [interp eval $interp {catch test;set ::errorInfo}] + interp delete $interp; + set res +} {msg while executing "test"} # Interps & Namespaces -test interp-27.1 {interp aliases & namespaces} -setup { - set i [interp create] -} -body { - set aliasTrace {} - proc tstAlias {args} { - global aliasTrace - lappend aliasTrace [list [namespace current] $args] - } - $i alias foo::bar tstAlias foo::bar +test interp-27.1 {interp aliases & namespaces} { + set i [interp create]; + set aliasTrace {}; + proc tstAlias {args} { + global aliasTrace; + lappend aliasTrace [list [namespace current] $args]; + } + $i alias foo::bar tstAlias foo::bar; $i eval foo::bar test - return $aliasTrace -} -cleanup { interp delete $i -} -result {{:: {foo::bar test}}} -test interp-27.2 {interp aliases & namespaces} -setup { - set i [interp create] -} -body { - set aliasTrace {} - proc tstAlias {args} { - global aliasTrace - lappend aliasTrace [list [namespace current] $args] - } - $i alias foo::bar tstAlias foo::bar + set aliasTrace; +} {{:: {foo::bar test}}} + +test interp-27.2 {interp aliases & namespaces} { + set i [interp create]; + set aliasTrace {}; + proc tstAlias {args} { + global aliasTrace; + lappend aliasTrace [list [namespace current] $args]; + } + $i alias foo::bar tstAlias foo::bar; $i eval namespace eval foo {bar test} - return $aliasTrace -} -cleanup { interp delete $i -} -result {{:: {foo::bar test}}} -test interp-27.3 {interp aliases & namespaces} -setup { - set i [interp create] -} -body { - set aliasTrace {} - proc tstAlias {args} { - global aliasTrace - lappend aliasTrace [list [namespace current] $args] + set aliasTrace; +} {{:: {foo::bar test}}} + +test interp-27.3 {interp aliases & namespaces} { + set i [interp create]; + set aliasTrace {}; + proc tstAlias {args} { + global aliasTrace; + lappend aliasTrace [list [namespace current] $args]; } interp eval $i {namespace eval foo {proc bar {} {error "bar called"}}} - interp alias $i foo::bar {} tstAlias foo::bar + interp alias $i foo::bar {} tstAlias foo::bar; interp eval $i {namespace eval foo {bar test}} - return $aliasTrace -} -cleanup { interp delete $i -} -result {{:: {foo::bar test}}} -test interp-27.4 {interp aliases & namespaces} -setup { - set i [interp create] -} -body { + set aliasTrace; +} {{:: {foo::bar test}}} + +test interp-27.4 {interp aliases & namespaces} { + set i [interp create]; namespace eval foo2 { - variable aliasTrace {} - proc bar {args} { - variable aliasTrace - lappend aliasTrace [list [namespace current] $args] + variable aliasTrace {}; + proc bar {args} { + variable aliasTrace; + lappend aliasTrace [list [namespace current] $args]; } } - $i alias foo::bar foo2::bar foo::bar + $i alias foo::bar foo2::bar foo::bar; $i eval namespace eval foo {bar test} - return $foo2::aliasTrace -} -cleanup { - namespace delete foo2 - interp delete $i -} -result {{::foo2 {foo::bar test}}} -test interp-27.5 {interp hidden & namespaces} -setup { - set i [interp create] -} -constraints knownBug -body { - interp eval $i { - namespace eval foo { - proc bar {args} { - return "bar called ([namespace current]) ($args)" - } - } - } - set res [list [interp eval $i {namespace eval foo {bar test1}}]] - interp hide $i foo::bar - lappend res [list [catch {interp eval $i {namespace eval foo {bar test2}}} msg] $msg] -} -cleanup { - interp delete $i -} -result {{bar called (::foo) (test1)} {1 {invalid command name "bar"}}} -test interp-27.6 {interp hidden & aliases & namespaces} -setup { - set i [interp create] -} -constraints knownBug -body { - set v root-parent - namespace eval foo { - variable v foo-parent - proc bar {interp args} { - variable v - list "parent bar called ($v) ([namespace current]) ($args)"\ - [interp invokehidden $interp foo::bar $args] - } - } - interp eval $i { - namespace eval foo { - namespace export * - variable v foo-child - proc bar {args} { - variable v - return "child bar called ($v) ([namespace current]) ($args)" - } - } - } - set res [list [interp eval $i {namespace eval foo {bar test1}}]] - $i hide foo::bar - $i alias foo::bar foo::bar $i - set res [concat $res [interp eval $i { - set v root-child - namespace eval test { - variable v foo-test - namespace import ::foo::* - bar test2 - } - }]] -} -cleanup { - namespace delete foo - interp delete $i -} -result {{child bar called (foo-child) (::foo) (test1)} {parent bar called (foo-parent) (::foo) (test2)} {child bar called (foo-child) (::foo) (test2)}} -test interp-27.7 {interp hidden & aliases & imports & namespaces} -setup { - set i [interp create] -} -constraints knownBug -body { - set v root-parent - namespace eval mfoo { - variable v foo-parent - proc bar {interp args} { - variable v - list "parent bar called ($v) ([namespace current]) ($args)"\ - [interp invokehidden $interp test::bar $args] - } - } - interp eval $i { - namespace eval foo { - namespace export * - variable v foo-child - proc bar {args} { - variable v - return "child bar called ($v) ([info level 0]) ([uplevel namespace current]) ([namespace current]) ($args)" - } - } - set v root-child - namespace eval test { - variable v foo-test - namespace import ::foo::* - } - } - set res [list [interp eval $i {namespace eval test {bar test1}}]] - $i hide test::bar - $i alias test::bar mfoo::bar $i - set res [concat $res [interp eval $i {test::bar test2}]] -} -cleanup { - namespace delete mfoo - interp delete $i -} -result {{child bar called (foo-child) (bar test1) (::tcltest) (::foo) (test1)} {parent bar called (foo-parent) (::mfoo) (test2)} {child bar called (foo-child) (test::bar test2) (::) (::foo) (test2)}} -test interp-27.8 {hiding, namespaces and integrity} knownBug { - namespace eval foo { - variable v 3 - proc bar {} {variable v; set v} - # next command would currently generate an unknown command "bar" error. - interp hide {} bar - } - namespace delete foo - list [catch {interp invokehidden {} foo::bar} msg] $msg -} {1 {invalid hidden command name "foo"}} - -test interp-28.1 {getting fooled by child's namespace ?} -setup { - set i [interp create -safe] - proc parent {interp args} {interp hide $interp list} -} -body { - $i alias parent parent $i + set r $foo2::aliasTrace; + namespace delete foo2; + set r +} {{::foo2 {foo::bar test}}} + +# the following tests are commented out while we don't support +# hiding in namespaces + +# test interp-27.5 {interp hidden & namespaces} { +# set i [interp create]; +# interp eval $i { +# namespace eval foo { +# proc bar {args} { +# return "bar called ([namespace current]) ($args)" +# } +# } +# } +# set res [list [interp eval $i {namespace eval foo {bar test1}}]] +# interp hide $i foo::bar; +# lappend res [list [catch {interp eval $i {namespace eval foo {bar test2}}} msg] $msg] +# interp delete $i; +# set res; +#} {{bar called (::foo) (test1)} {1 {invalid command name "bar"}}} + +# test interp-27.6 {interp hidden & aliases & namespaces} { +# set i [interp create]; +# set v root-master; +# namespace eval foo { +# variable v foo-master; +# proc bar {interp args} { +# variable v; +# list "master bar called ($v) ([namespace current]) ($args)"\ +# [interp invokehidden $interp foo::bar $args]; +# } +# } +# interp eval $i { +# namespace eval foo { +# namespace export * +# variable v foo-slave; +# proc bar {args} { +# variable v; +# return "slave bar called ($v) ([namespace current]) ($args)" +# } +# } +# } +# set res [list [interp eval $i {namespace eval foo {bar test1}}]] +# $i hide foo::bar; +# $i alias foo::bar foo::bar $i; +# set res [concat $res [interp eval $i { +# set v root-slave; +# namespace eval test { +# variable v foo-test; +# namespace import ::foo::*; +# bar test2 +# } +# }]] +# namespace delete foo; +# interp delete $i; +# set res +# } {{slave bar called (foo-slave) (::foo) (test1)} {master bar called (foo-master) (::foo) (test2)} {slave bar called (foo-slave) (::foo) (test2)}} + + +# test interp-27.7 {interp hidden & aliases & imports & namespaces} { +# set i [interp create]; +# set v root-master; +# namespace eval mfoo { +# variable v foo-master; +# proc bar {interp args} { +# variable v; +# list "master bar called ($v) ([namespace current]) ($args)"\ +# [interp invokehidden $interp test::bar $args]; +# } +# } +# interp eval $i { +# namespace eval foo { +# namespace export * +# variable v foo-slave; +# proc bar {args} { +# variable v; +# return "slave bar called ($v) ([info level 0]) ([uplevel namespace current]) ([namespace current]) ($args)" +# } +# } +# set v root-slave; +# namespace eval test { +# variable v foo-test; +# namespace import ::foo::*; +# } +# } +# set res [list [interp eval $i {namespace eval test {bar test1}}]] +# $i hide test::bar; +# $i alias test::bar mfoo::bar $i; +# set res [concat $res [interp eval $i {test::bar test2}]]; +# namespace delete mfoo; +# interp delete $i; +# set res +# } {{slave bar called (foo-slave) (bar test1) (::tcltest) (::foo) (test1)} {master bar called (foo-master) (::mfoo) (test2)} {slave bar called (foo-slave) (test::bar test2) (::) (::foo) (test2)}} + +#test interp-27.8 {hiding, namespaces and integrity} { +# namespace eval foo { +# variable v 3; +# proc bar {} {variable v; set v} +# # next command would currently generate an unknown command "bar" error. +# interp hide {} bar; +# } +# namespace delete foo; +# list [catch {interp invokehidden {} foo} msg] $msg; +#} {1 {invalid hidden command name "foo"}} + + +test interp-28.1 {getting fooled by slave's namespace ?} { + set i [interp create -safe]; + proc master {interp args} {interp hide $interp list} + $i alias master master $i; set r [interp eval $i { namespace eval foo { proc list {args} { - return "dummy foo::list" + return "dummy foo::list"; } - parent + master; } info commands list }] -} -cleanup { - rename parent {} - interp delete $i -} -result {} -test interp-28.2 {parent's nsName cache should not cross} -setup { + interp delete $i; + set r +} {} + +test interp-28.2 {master's nsName cache should not cross} { set i [interp create] - $i eval {proc filter lst {lsearch -all -inline -not $lst "::tcl"}} -} -body { - $i eval { + set res [$i eval { set x {namespace children ::} set y [list namespace children ::] - namespace delete {*}[filter [{*}$y]] + namespace delete [{*}$y] set j [interp create] - $j alias filter filter - $j eval {namespace delete {*}[filter [namespace children ::]]} + $j eval {namespace delete {*}[namespace children ::]} namespace eval foo {} - list [filter [eval $x]] [filter [eval $y]] [filter [$j eval $x]] [filter [$j eval $y]] - } -} -cleanup { + set res [list [eval $x] [eval $y] [$j eval $x] [$j eval $y]] + interp delete $j + set res + }] interp delete $i -} -result {::foo ::foo {} {}} + set res +} {::foo ::foo {} {}} # Part 29: recursion limit # 29.1.* Argument checking @@ -2402,81 +2395,96 @@ test interp-28.2 {parent's nsName cache should not cross} -setup { test interp-29.1.1 {interp recursionlimit argument checking} { list [catch {interp recursionlimit} msg] $msg } {1 {wrong # args: should be "interp recursionlimit path ?newlimit?"}} + test interp-29.1.2 {interp recursionlimit argument checking} { list [catch {interp recursionlimit foo bar} msg] $msg } {1 {could not find interpreter "foo"}} + test interp-29.1.3 {interp recursionlimit argument checking} { list [catch {interp recursionlimit foo bar baz} msg] $msg } {1 {wrong # args: should be "interp recursionlimit path ?newlimit?"}} + test interp-29.1.4 {interp recursionlimit argument checking} { interp create moo set result [catch {interp recursionlimit moo bar} msg] interp delete moo list $result $msg } {1 {expected integer but got "bar"}} + test interp-29.1.5 {interp recursionlimit argument checking} { interp create moo set result [catch {interp recursionlimit moo 0} msg] interp delete moo list $result $msg } {1 {recursion limit must be > 0}} + test interp-29.1.6 {interp recursionlimit argument checking} { interp create moo set result [catch {interp recursionlimit moo -1} msg] interp delete moo list $result $msg } {1 {recursion limit must be > 0}} + test interp-29.1.7 {interp recursionlimit argument checking} { interp create moo set result [catch {interp recursionlimit moo [expr {wide(1)<<32}]} msg] interp delete moo list $result [string range $msg 0 35] } {1 {integer value too large to represent}} -test interp-29.1.8 {child recursionlimit argument checking} { + +test interp-29.1.8 {slave recursionlimit argument checking} { interp create moo set result [catch {moo recursionlimit foo bar} msg] interp delete moo list $result $msg } {1 {wrong # args: should be "moo recursionlimit ?newlimit?"}} -test interp-29.1.9 {child recursionlimit argument checking} { + +test interp-29.1.9 {slave recursionlimit argument checking} { interp create moo set result [catch {moo recursionlimit foo} msg] interp delete moo list $result $msg } {1 {expected integer but got "foo"}} -test interp-29.1.10 {child recursionlimit argument checking} { + +test interp-29.1.10 {slave recursionlimit argument checking} { interp create moo set result [catch {moo recursionlimit 0} msg] interp delete moo list $result $msg } {1 {recursion limit must be > 0}} -test interp-29.1.11 {child recursionlimit argument checking} { + +test interp-29.1.11 {slave recursionlimit argument checking} { interp create moo set result [catch {moo recursionlimit -1} msg] interp delete moo list $result $msg } {1 {recursion limit must be > 0}} -test interp-29.1.12 {child recursionlimit argument checking} { + +test interp-29.1.12 {slave recursionlimit argument checking} { interp create moo set result [catch {moo recursionlimit [expr {wide(1)<<32}]} msg] interp delete moo list $result [string range $msg 0 35] } {1 {integer value too large to represent}} + test interp-29.2.1 {query recursion limit} { interp recursionlimit {} } 1000 + test interp-29.2.2 {query recursion limit} { set i [interp create] set n [interp recursionlimit $i] interp delete $i set n } 1000 + test interp-29.2.3 {query recursion limit} { set i [interp create] set n [$i recursionlimit] interp delete $i set n } 1000 + test interp-29.2.4 {query recursion limit} { set i [interp create] set r [$i eval { @@ -2487,6 +2495,7 @@ test interp-29.2.4 {query recursion limit} { interp delete $i set r } {42 42} + test interp-29.2.5 {query recursion limit} { set i [interp create] set n1 [interp recursionlimit $i 42] @@ -2494,6 +2503,7 @@ test interp-29.2.5 {query recursion limit} { interp delete $i list $n1 $n2 } {42 42} + test interp-29.2.6 {query recursion limit} { set i [interp create] set n1 [interp recursionlimit $i 42] @@ -2501,6 +2511,7 @@ test interp-29.2.6 {query recursion limit} { interp delete $i list $n1 $n2 } {42 42} + test interp-29.2.7 {query recursion limit} { set i [interp create] set n1 [$i recursionlimit 42] @@ -2508,6 +2519,7 @@ test interp-29.2.7 {query recursion limit} { interp delete $i list $n1 $n2 } {42 42} + test interp-29.2.8 {query recursion limit} { set i [interp create] set n1 [$i recursionlimit 42] @@ -2515,6 +2527,7 @@ test interp-29.2.8 {query recursion limit} { interp delete $i list $n1 $n2 } {42 42} + test interp-29.3.1 {recursion limit} { set i [interp create] set r [interp eval $i { @@ -2525,7 +2538,8 @@ test interp-29.3.1 {recursion limit} { }] interp delete $i set r -} {1 {too many nested evaluations (infinite loop?)} 49} +} {1 {too many nested evaluations (infinite loop?)} 48} + test interp-29.3.2 {recursion limit} { set i [interp create] interp recursionlimit $i 50 @@ -2536,7 +2550,8 @@ test interp-29.3.2 {recursion limit} { }] interp delete $i set r -} {1 {too many nested evaluations (infinite loop?)} 49} +} {1 {too many nested evaluations (infinite loop?)} 48} + test interp-29.3.3 {recursion limit} { set i [interp create] $i recursionlimit 50 @@ -2547,10 +2562,11 @@ test interp-29.3.3 {recursion limit} { }] interp delete $i set r -} {1 {too many nested evaluations (infinite loop?)} 49} +} {1 {too many nested evaluations (infinite loop?)} 48} + test interp-29.3.4 {recursion limit error reporting} { - interp create child - set r1 [child eval { + interp create slave + set r1 [slave eval { catch { # nesting level 1 eval { # 2 eval { # 3 @@ -2564,13 +2580,14 @@ test interp-29.3.4 {recursion limit error reporting} { } } msg }] - set r2 [child eval { set msg }] - interp delete child + set r2 [slave eval { set msg }] + interp delete slave list $r1 $r2 } {1 {falling back due to new recursion limit}} + test interp-29.3.5 {recursion limit error reporting} { - interp create child - set r1 [child eval { + interp create slave + set r1 [slave eval { catch { # nesting level 1 eval { # 2 eval { # 3 @@ -2584,13 +2601,14 @@ test interp-29.3.5 {recursion limit error reporting} { } } msg }] - set r2 [child eval { set msg }] - interp delete child + set r2 [slave eval { set msg }] + interp delete slave list $r1 $r2 } {1 {falling back due to new recursion limit}} + test interp-29.3.6 {recursion limit error reporting} { - interp create child - set r1 [child eval { + interp create slave + set r1 [slave eval { catch { # nesting level 1 eval { # 2 eval { # 3 @@ -2604,166 +2622,59 @@ test interp-29.3.6 {recursion limit error reporting} { } } msg }] - set r2 [child eval { set msg }] - interp delete child - list $r1 $r2 -} {0 ok} -# -# Note that TEBC does not verify the interp's nesting level itself; the nesting -# level will only be verified when it invokes a non-bcc'd command. -# -test interp-29.3.7a {recursion limit error reporting} { - interp create child - after 0 {interp recursionlimit child 5} - set r1 [child eval { - catch { # nesting level 1 - eval { # 2 - eval { # 3 - eval { # 4 - eval { # 5 - update - set x ok - } - } - } - } - } msg - }] - set r2 [child eval { set msg }] - interp delete child - list $r1 $r2 -} {0 ok} -test interp-29.3.7b {recursion limit error reporting} { - interp create child - after 0 {interp recursionlimit child 5} - set r1 [child eval { - catch { # nesting level 1 - eval { # 2 - eval { # 3 - eval { # 4 - update - eval { # 5 - set x ok - } - } - } - } - } msg - }] - set r2 [child eval { set msg }] - interp delete child + set r2 [slave eval { set msg }] + interp delete slave list $r1 $r2 } {0 ok} -test interp-29.3.7c {recursion limit error reporting} { - interp create child - after 0 {interp recursionlimit child 5} - set r1 [child eval { + +test interp-29.3.7 {recursion limit error reporting} { + interp create slave + after 0 {interp recursionlimit slave 5} + set r1 [slave eval { catch { # nesting level 1 eval { # 2 eval { # 3 eval { # 4 eval { # 5 - update - set set set - $set x ok + update + set x ok } } } } } msg }] - set r2 [child eval { set msg }] - interp delete child + set r2 [slave eval { set msg }] + interp delete slave list $r1 $r2 } {1 {too many nested evaluations (infinite loop?)}} -test interp-29.3.8a {recursion limit error reporting} { - interp create child - after 0 {interp recursionlimit child 4} - set r1 [child eval { - catch { # nesting level 1 - eval { # 2 - eval { # 3 - eval { # 4 - eval { # 5 - update - set x ok - } - } - } - } - } msg - }] - set r2 [child eval { set msg }] - interp delete child - list $r1 $r2 -} {0 ok} -test interp-29.3.8b {recursion limit error reporting} { - interp create child - after 0 {interp recursionlimit child 4} - set r1 [child eval { + +test interp-29.3.8 {recursion limit error reporting} { + interp create slave + after 0 {interp recursionlimit slave 4} + set r1 [slave eval { catch { # nesting level 1 eval { # 2 eval { # 3 eval { # 4 - update eval { # 5 - set x ok + update + set x ok } } } } } msg }] - set r2 [child eval { set msg }] - interp delete child + set r2 [slave eval { set msg }] + interp delete slave list $r1 $r2 } {1 {too many nested evaluations (infinite loop?)}} -test interp-29.3.9a {recursion limit error reporting} { - interp create child - after 0 {interp recursionlimit child 6} - set r1 [child eval { - catch { # nesting level 1 - eval { # 2 - eval { # 3 - eval { # 4 - eval { # 5 - update - set x ok - } - } - } - } - } msg - }] - set r2 [child eval { set msg }] - interp delete child - list $r1 $r2 -} {0 ok} -test interp-29.3.9b {recursion limit error reporting} { - interp create child - after 0 {interp recursionlimit child 6} - set r1 [child eval { - catch { # nesting level 1 - eval { # 2 - eval { # 3 - eval { # 4 - eval { # 5 - set set set - $set x ok - } - } - } - } - } msg - }] - set r2 [child eval { set msg }] - interp delete child - list $r1 $r2 -} {0 ok} -test interp-29.3.10a {recursion limit error reporting} { - interp create child - after 0 {child recursionlimit 4} - set r1 [child eval { + +test interp-29.3.9 {recursion limit error reporting} { + interp create slave + after 0 {interp recursionlimit slave 6} + set r1 [slave eval { catch { # nesting level 1 eval { # 2 eval { # 3 @@ -2777,117 +2688,77 @@ test interp-29.3.10a {recursion limit error reporting} { } } msg }] - set r2 [child eval { set msg }] - interp delete child + set r2 [slave eval { set msg }] + interp delete slave list $r1 $r2 } {0 ok} -test interp-29.3.10b {recursion limit error reporting} { - interp create child - after 0 {child recursionlimit 4} - set r1 [child eval { + +test interp-29.3.10 {recursion limit error reporting} { + interp create slave + after 0 {slave recursionlimit 4} + set r1 [slave eval { catch { # nesting level 1 eval { # 2 eval { # 3 eval { # 4 - update eval { # 5 - set x ok + update + set x ok } } } } } msg }] - set r2 [child eval { set msg }] - interp delete child + set r2 [slave eval { set msg }] + interp delete slave list $r1 $r2 } {1 {too many nested evaluations (infinite loop?)}} -test interp-29.3.11a {recursion limit error reporting} { - interp create child - after 0 {child recursionlimit 5} - set r1 [child eval { - catch { # nesting level 1 - eval { # 2 - eval { # 3 - eval { # 4 - eval { # 5 - update - set x ok - } - } - } - } - } msg - }] - set r2 [child eval { set msg }] - interp delete child - list $r1 $r2 -} {0 ok} -test interp-29.3.11b {recursion limit error reporting} { - interp create child - after 0 {child recursionlimit 5} - set r1 [child eval { + +test interp-29.3.11 {recursion limit error reporting} { + interp create slave + after 0 {slave recursionlimit 5} + set r1 [slave eval { catch { # nesting level 1 eval { # 2 eval { # 3 eval { # 4 eval { # 5 - update - set set set - $set x ok + update + set x ok } } } } } msg }] - set r2 [child eval { set msg }] - interp delete child + set r2 [slave eval { set msg }] + interp delete slave list $r1 $r2 } {1 {too many nested evaluations (infinite loop?)}} -test interp-29.3.12a {recursion limit error reporting} { - interp create child - after 0 {child recursionlimit 6} - set r1 [child eval { - catch { # nesting level 1 - eval { # 2 - eval { # 3 - eval { # 4 - eval { # 5 - update - set x ok - } - } - } - } - } msg - }] - set r2 [child eval { set msg }] - interp delete child - list $r1 $r2 -} {0 ok} -test interp-29.3.12b {recursion limit error reporting} { - interp create child - after 0 {child recursionlimit 6} - set r1 [child eval { + +test interp-29.3.12 {recursion limit error reporting} { + interp create slave + after 0 {slave recursionlimit 6} + set r1 [slave eval { catch { # nesting level 1 eval { # 2 eval { # 3 eval { # 4 eval { # 5 - update - set set set - $set x ok + update + set x ok } } } } } msg }] - set r2 [child eval { set msg }] - interp delete child + set r2 [slave eval { set msg }] + interp delete slave list $r1 $r2 } {0 ok} + test interp-29.4.1 {recursion limit inheritance} { set i [interp create] set ii [interp eval $i { @@ -2902,7 +2773,8 @@ test interp-29.4.1 {recursion limit inheritance} { }] interp delete $i set r -} 50 +} 49 + test interp-29.4.2 {recursion limit inheritance} { set i [interp create] $i recursionlimit 50 @@ -2915,122 +2787,136 @@ test interp-29.4.2 {recursion limit inheritance} { }] interp delete $i set r -} 50 -test interp-29.5.1 {does child recursion limit affect parent?} { +} 49 + +test interp-29.5.1 {does slave recursion limit affect master?} { set before [interp recursionlimit {}] set i [interp create] interp recursionlimit $i 20000 set after [interp recursionlimit {}] - set childlimit [interp recursionlimit $i] + set slavelimit [interp recursionlimit $i] interp delete $i - list [expr {$before == $after}] $childlimit + list [expr {$before == $after}] $slavelimit } {1 20000} -test interp-29.5.2 {does child recursion limit affect parent?} { + +test interp-29.5.2 {does slave recursion limit affect master?} { set before [interp recursionlimit {}] set i [interp create] interp recursionlimit $i 20000 set after [interp recursionlimit {}] - set childlimit [$i recursionlimit] + set slavelimit [$i recursionlimit] interp delete $i - list [expr {$before == $after}] $childlimit + list [expr {$before == $after}] $slavelimit } {1 20000} -test interp-29.5.3 {does child recursion limit affect parent?} { + +test interp-29.5.3 {does slave recursion limit affect master?} { set before [interp recursionlimit {}] set i [interp create] $i recursionlimit 20000 set after [interp recursionlimit {}] - set childlimit [interp recursionlimit $i] + set slavelimit [interp recursionlimit $i] interp delete $i - list [expr {$before == $after}] $childlimit + list [expr {$before == $after}] $slavelimit } {1 20000} -test interp-29.5.4 {does child recursion limit affect parent?} { + +test interp-29.5.4 {does slave recursion limit affect master?} { set before [interp recursionlimit {}] set i [interp create] $i recursionlimit 20000 set after [interp recursionlimit {}] - set childlimit [$i recursionlimit] + set slavelimit [$i recursionlimit] interp delete $i - list [expr {$before == $after}] $childlimit + list [expr {$before == $after}] $slavelimit } {1 20000} + test interp-29.6.1 {safe interpreter recursion limit} { - interp create child -safe - set n [interp recursionlimit child] - interp delete child + interp create slave -safe + set n [interp recursionlimit slave] + interp delete slave set n } 1000 + test interp-29.6.2 {safe interpreter recursion limit} { - interp create child -safe - set n [child recursionlimit] - interp delete child + interp create slave -safe + set n [slave recursionlimit] + interp delete slave set n } 1000 + test interp-29.6.3 {safe interpreter recursion limit} { - interp create child -safe - set n1 [interp recursionlimit child 42] - set n2 [interp recursionlimit child] - interp delete child + interp create slave -safe + set n1 [interp recursionlimit slave 42] + set n2 [interp recursionlimit slave] + interp delete slave list $n1 $n2 } {42 42} + test interp-29.6.4 {safe interpreter recursion limit} { - interp create child -safe - set n1 [child recursionlimit 42] - set n2 [interp recursionlimit child] - interp delete child + interp create slave -safe + set n1 [slave recursionlimit 42] + set n2 [interp recursionlimit slave] + interp delete slave list $n1 $n2 } {42 42} + test interp-29.6.5 {safe interpreter recursion limit} { - interp create child -safe - set n1 [interp recursionlimit child 42] - set n2 [child recursionlimit] - interp delete child + interp create slave -safe + set n1 [interp recursionlimit slave 42] + set n2 [slave recursionlimit] + interp delete slave list $n1 $n2 } {42 42} + test interp-29.6.6 {safe interpreter recursion limit} { - interp create child -safe - set n1 [child recursionlimit 42] - set n2 [child recursionlimit] - interp delete child + interp create slave -safe + set n1 [slave recursionlimit 42] + set n2 [slave recursionlimit] + interp delete slave list $n1 $n2 } {42 42} + test interp-29.6.7 {safe interpreter recursion limit} { - interp create child -safe - set n1 [child recursionlimit 42] - set n2 [child recursionlimit] - interp delete child + interp create slave -safe + set n1 [slave recursionlimit 42] + set n2 [slave recursionlimit] + interp delete slave list $n1 $n2 } {42 42} + test interp-29.6.8 {safe interpreter recursion limit} { - interp create child -safe - set n [catch {child eval {interp recursionlimit {} 42}} msg] - interp delete child + interp create slave -safe + set n [catch {slave eval {interp recursionlimit {} 42}} msg] + interp delete slave list $n $msg } {1 {permission denied: safe interpreters cannot change recursion limit}} + test interp-29.6.9 {safe interpreter recursion limit} { - interp create child -safe + interp create slave -safe set result [ - child eval { - interp create child2 -safe + slave eval { + interp create slave2 -safe set n [catch { - interp recursionlimit child2 42 + interp recursionlimit slave2 42 } msg] list $n $msg } ] - interp delete child + interp delete slave set result } {1 {permission denied: safe interpreters cannot change recursion limit}} + test interp-29.6.10 {safe interpreter recursion limit} { - interp create child -safe + interp create slave -safe set result [ - child eval { - interp create child2 -safe + slave eval { + interp create slave2 -safe set n [catch { - child2 recursionlimit 42 + slave2 recursionlimit 42 } msg] list $n $msg } ] - interp delete child + interp delete slave set result } {1 {permission denied: safe interpreters cannot change recursion limit}} @@ -3071,12 +2957,13 @@ test interp-31.1 {alias invocation scope} { upvar 1 $varName localVar set localVar $value } + interp alias {} myNewSet {} mySet proc testMyNewSet {value} { myNewSet a $value return $a } - unset -nocomplain a + catch {unset a} set result [testMyNewSet "ok"] rename testMyNewSet {} rename mySet {} @@ -3084,9 +2971,8 @@ test interp-31.1 {alias invocation scope} { set result } ok -test interp-32.1 {parent's working directory should be inherited by a child interp} -setup { +test interp-32.1 {parent's working directory should be inherited by a child interp} { cd [temporaryDirectory] -} -body { set parent [pwd] set i [interp create] set child [$i eval pwd] @@ -3099,11 +2985,10 @@ test interp-32.1 {parent's working directory should be inherited by a child inte cd .. file delete cwd_test interp delete $i + cd [workingDirectory] expr {[string equal $parent $child] ? 1 : "\{$parent\} != \{$child\}"} -} -cleanup { - cd [workingDirectory] -} -result 1 +} 1 test interp-33.1 {refCounting for target words of alias [Bug 730244]} { # This test will panic if Bug 730244 is not fixed. @@ -3171,7 +3056,7 @@ test interp-34.3.1 {basic test of limits - pure inside-command loop} -body { } } # We use a time limit here; command limits don't trap this case - $i limit time -seconds [expr {[clock seconds] + 2}] + $i limit time -seconds [expr {[clock seconds]+2}] $i eval foobar } -returnCodes error -result {time limit exceeded} -cleanup { interp delete $i @@ -3193,8 +3078,8 @@ test interp-34.4 {limits with callbacks: extending limits} -setup { } -body { interp alias $i foo {} cb1 set curlim [$i eval info cmdcount] - $i limit command -command "cb2 [expr {$curlim + 100}]" \ - -value [expr {$curlim + 10}] + $i limit command -command "cb2 [expr $curlim+100]" \ + -value [expr {$curlim+10}] $i eval {for {set i 0} {$i<10} {incr i} {foo}} list $a $b $c } -result {6 4 b} -cleanup { @@ -3222,7 +3107,7 @@ test interp-34.5 {limits with callbacks: removing limits} -setup { } -body { interp alias $i foo {} cb1 set curlim [$i eval info cmdcount] - $i limit command -command "cb2 {}" -value [expr {$curlim + 10}] + $i limit command -command "cb2 {}" -value [expr {$curlim+10}] $i eval {for {set i 0} {$i<10} {incr i} {foo}} list $a $b $c } -result {6 4 b} -cleanup { @@ -3247,7 +3132,7 @@ test interp-34.6 {limits with callbacks: removing limits and handlers} -setup { } -body { interp alias $i foo {} cb1 set curlim [$i eval info cmdcount] - $i limit command -command cb2 -value [expr {$curlim + 10}] + $i limit command -command cb2 -value [expr {$curlim+10}] $i eval {for {set i 0} {$i<10} {incr i} {foo}} list $a $b $c } -result {6 4 b} -cleanup { @@ -3266,7 +3151,7 @@ test interp-34.7 {limits with callbacks: deleting the handler interp} -setup { proc cb2 {args} { global c i curlim set c b - $i limit command -value [expr {$curlim + 1000}] + $i limit command -value [expr {$curlim+1000}] trapToParent } } @@ -3289,7 +3174,7 @@ test interp-34.7 {limits with callbacks: deleting the handler interp} -setup { set c a interp alias $i foo {} cb1 set curlim [$i eval info cmdcount] - $i limit command -command cb2 -value [expr {$curlim + 10}] + $i limit command -command cb2 -value [expr {$curlim+10}] } $i eval { $i eval { @@ -3304,7 +3189,7 @@ test interp-34.7 {limits with callbacks: deleting the handler interp} -setup { # Bug 1085023 test interp-34.8 {time limits trigger in vwaits} -body { set i [interp create] - interp limit $i time -seconds [expr {[clock seconds] + 1}] -granularity 1 + interp limit $i time -seconds [expr {[clock seconds]+1}] -granularity 1 $i eval { set x {} vwait x @@ -3321,7 +3206,7 @@ test interp-34.9 {time limits trigger in blocking after} { } msg] set t1 [clock seconds] interp delete $i - list $code $msg [expr {($t1-$t0) < 3 ? "OK" : $t1-$t0}] + list $code $msg [expr {($t1-$t0) < 3 ? "OK" : $t1-$t0}] } {1 {time limit exceeded} OK} test interp-34.10 {time limits trigger in vwaits: Bug 1221395} -body { set i [interp create] @@ -3352,8 +3237,8 @@ test interp-34.11 {time limit extension in callbacks} -setup { } -body { set i [interp create] set t0 [clock seconds] - $i limit time -seconds [expr {$t0 + 1}] -granularity 1 \ - -command "cb1 $i [expr {$t0 + 2}]" + $i limit time -seconds [expr {$t0+1}] -granularity 1 \ + -command "cb1 $i [expr {$t0+2}]" set ::result {} lappend ::result [catch { $i eval { @@ -3380,8 +3265,8 @@ test interp-34.12 {time limit extension in callbacks} -setup { } -body { set i [interp create] set t0 [clock seconds] - set ::times "[expr {$t0 + 2}] [expr {$t0 + 100}]" - $i limit time -seconds [expr {$t0 + 1}] -granularity 1 -command "cb1 $i" + set ::times "[expr {$t0+2}] [expr {$t0+100}]" + $i limit time -seconds [expr {$t0+1}] -granularity 1 -command "cb1 $i" set ::result {} lappend ::result [catch { $i eval { @@ -3412,10 +3297,10 @@ test interp-34.13 {time limit granularity and vwait: Bug 2891362} -setup { test interp-35.1 {interp limit syntax} -body { interp limit -} -returnCodes error -result {wrong # args: should be "interp limit path limitType ?-option value ...?"} +} -returnCodes error -result {wrong # args: should be "interp limit path limitType ?options?"} test interp-35.2 {interp limit syntax} -body { interp limit {} -} -returnCodes error -result {wrong # args: should be "interp limit path limitType ?-option value ...?"} +} -returnCodes error -result {wrong # args: should be "interp limit path limitType ?options?"} test interp-35.3 {interp limit syntax} -body { interp limit {} foo } -returnCodes error -result {bad limit type "foo": must be commands or time} @@ -3524,7 +3409,7 @@ test interp-35.19 {interp limit syntax} -body { interp limit $i time -seconds -1 } -cleanup { interp delete $i -} -match glob -returnCodes error -result {seconds must be between 0 and *} +} -returnCodes error -result {seconds must be at least 0} test interp-35.20 {interp limit syntax} -body { set i [interp create] interp limit $i time -millis foobar @@ -3536,7 +3421,7 @@ test interp-35.21 {interp limit syntax} -body { interp limit $i time -millis -1 } -cleanup { interp delete $i -} -match glob -returnCodes error -result {milliseconds must be between 0 and *} +} -returnCodes error -result {milliseconds must be at least 0} test interp-35.22 {interp time limits normalize milliseconds} -body { set i [interp create] interp limit $i time -seconds 1 -millis 1500 @@ -3555,58 +3440,59 @@ test interp-35.24 {interp time limits can't touch current interp} -body { test interp-36.1 {interp bgerror syntax} -body { interp bgerror } -returnCodes error -result {wrong # args: should be "interp bgerror path ?cmdPrefix?"} -test interp-36.2 {interp bgerror syntax} -body { +test interp-36.2 {interp bgerror syntax} -body { interp bgerror x y z } -returnCodes error -result {wrong # args: should be "interp bgerror path ?cmdPrefix?"} test interp-36.3 {interp bgerror syntax} -setup { - interp create child + interp create slave } -body { - child bgerror x y + slave bgerror x y } -cleanup { - interp delete child -} -returnCodes error -result {wrong # args: should be "child bgerror ?cmdPrefix?"} -test interp-36.4 {ChildBgerror syntax} -setup { - interp create child + interp delete slave +} -returnCodes error -result {wrong # args: should be "slave bgerror ?cmdPrefix?"} +test interp-36.4 {SlaveBgerror syntax} -setup { + interp create slave } -body { - child bgerror \{ + slave bgerror \{ } -cleanup { - interp delete child + interp delete slave } -returnCodes error -result {cmdPrefix must be list of length >= 1} -test interp-36.5 {ChildBgerror syntax} -setup { - interp create child +test interp-36.5 {SlaveBgerror syntax} -setup { + interp create slave } -body { - child bgerror {} + slave bgerror {} } -cleanup { - interp delete child + interp delete slave } -returnCodes error -result {cmdPrefix must be list of length >= 1} -test interp-36.6 {ChildBgerror returns handler} -setup { - interp create child +test interp-36.6 {SlaveBgerror returns handler} -setup { + interp create slave } -body { - child bgerror {foo bar soom} + slave bgerror {foo bar soom} } -cleanup { - interp delete child + interp delete slave } -result {foo bar soom} -test interp-36.7 {ChildBgerror sets error handler of child [1999035]} -setup { - interp create child - child alias handler handler - child bgerror handler + +test interp-36.7 {SlaveBgerror sets error handler of slave [1999035]} -setup { + interp create slave + slave alias handler handler + slave bgerror handler variable result {untouched} proc handler {args} { - variable result - set result [lindex $args 0] + variable result + set result [lindex $args 0] } } -body { - child eval { - variable done {} - after 0 error foo - after 10 [list ::set [namespace which -variable done] {}] - vwait [namespace which -variable done] + slave eval { + variable done {} + after 0 error foo + after 10 [list ::set [namespace which -variable done] {}] + vwait [namespace which -variable done] } set result } -cleanup { variable result {} - unset -nocomplain result - interp delete child + unset result + interp delete slave } -result foo test interp-37.1 {safe interps and min() and max(): Bug 2895741} -setup { @@ -3615,10 +3501,10 @@ test interp-37.1 {safe interps and min() and max(): Bug 2895741} -setup { set result {} } -body { interp create {a b} -safe - lappend result [interp eval a {expr {min(5,2,3)*max(7,13,11)}}] - lappend result [interp eval {a b} {expr {min(5,2,3)*max(7,13,11)}}] + lappend result [interp eval a {expr min(5,2,3)*max(7,13,11)}] + lappend result [interp eval {a b} {expr min(5,2,3)*max(7,13,11)}] } -cleanup { - unset -nocomplain result + unset result interp delete a } -result {26 26} @@ -3639,7 +3525,7 @@ test interp-38.2 {interp debug env var} -setup { } -body { interp debug a } -cleanup { - unset -nocomplain ::env(TCL_INTERP_DEBUG_FRAME) + unset ::env(TCL_INTERP_DEBUG_FRAME) interp delete a } -result {-frame 1} test interp-38.3 {interp debug wrong args} -body { @@ -3647,10 +3533,10 @@ test interp-38.3 {interp debug wrong args} -body { } -returnCodes { error } -result {wrong # args: should be "interp debug path ?-frame ?bool??"} -test interp-38.4 {interp debug basic setup} -constraints {!singleTestInterp} -body { +test interp-38.4 {interp debug basic setup} -body { interp debug {} } -result {-frame 0} -test interp-38.5 {interp debug basic setup} -constraints {!singleTestInterp} -body { +test interp-38.5 {interp debug basic setup} -body { interp debug {} -f } -result {0} test interp-38.6 {interp debug basic setup} -body { @@ -3664,16 +3550,10 @@ test interp-38.8 {interp debug basic setup} -body { } -returnCodes { error } -result {wrong # args: should be "interp debug path ?-frame ?bool??"} - + # cleanup -unset -nocomplain hidden_cmds -foreach i [interp children] { +foreach i [interp slaves] { interp delete $i } ::tcltest::cleanupTests return - -# Local Variables: -# mode: tcl -# fill-column: 78 -# End: |
