os/persistentdata/persistentstorage/sqlite3api/TEST/TCL/tcldistribution/tests/interp.test
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
     1 # This file tests the multiple interpreter facility of Tcl
     2 #
     3 # This file contains a collection of tests for one or more of the Tcl
     4 # built-in commands.  Sourcing this file into Tcl runs the tests and
     5 # generates output for errors.  No output means no errors were found.
     6 #
     7 # Copyright (c) 1995-1996 Sun Microsystems, Inc.
     8 # Copyright (c) 1998-1999 by Scriptics Corporation.
     9 #
    10 # See the file "license.terms" for information on usage and redistribution
    11 # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
    12 #
    13 # RCS: @(#) $Id: interp.test,v 1.19.2.6 2004/10/28 00:01:07 dgp Exp $
    14 
    15 if {[lsearch [namespace children] ::tcltest] == -1} {
    16     package require tcltest 2.1
    17     namespace import -force ::tcltest::*
    18 }
    19 
    20 # The set of hidden commands is platform dependent:
    21 
    22 if {"$tcl_platform(platform)" == "macintosh"} {
    23     set hidden_cmds {beep cd echo encoding exit fconfigure file glob load ls open pwd socket source}
    24 } else {
    25     set hidden_cmds {cd encoding exec exit fconfigure file glob load open pwd socket source}
    26 }
    27 
    28 foreach i [interp slaves] {
    29   interp delete $i
    30 }
    31 
    32 proc equiv {x} {return $x}
    33 
    34 # Part 0: Check out options for interp command
    35 test interp-1.1 {options for interp command} {
    36     list [catch {interp} msg] $msg
    37 } {1 {wrong # args: should be "interp cmd ?arg ...?"}}
    38 test interp-1.2 {options for interp command} {
    39     list [catch {interp frobox} msg] $msg
    40 } {1 {bad option "frobox": must be alias, aliases, create, delete, eval, exists, expose, hide, hidden, issafe, invokehidden, marktrusted, recursionlimit, slaves, share, target, or transfer}}
    41 test interp-1.3 {options for interp command} {
    42     interp delete
    43 } ""
    44 test interp-1.4 {options for interp command} {
    45     list [catch {interp delete foo bar} msg] $msg
    46 } {1 {could not find interpreter "foo"}}
    47 test interp-1.5 {options for interp command} {
    48     list [catch {interp exists foo bar} msg] $msg
    49 } {1 {wrong # args: should be "interp exists ?path?"}}
    50 #
    51 # test interp-0.6 was removed
    52 #
    53 test interp-1.6 {options for interp command} {
    54     list [catch {interp slaves foo bar zop} msg] $msg
    55 } {1 {wrong # args: should be "interp slaves ?path?"}}
    56 test interp-1.7 {options for interp command} {
    57     list [catch {interp hello} msg] $msg
    58 } {1 {bad option "hello": must be alias, aliases, create, delete, eval, exists, expose, hide, hidden, issafe, invokehidden, marktrusted, recursionlimit, slaves, share, target, or transfer}}
    59 test interp-1.8 {options for interp command} {
    60     list [catch {interp -froboz} msg] $msg
    61 } {1 {bad option "-froboz": must be alias, aliases, create, delete, eval, exists, expose, hide, hidden, issafe, invokehidden, marktrusted, recursionlimit, slaves, share, target, or transfer}}
    62 test interp-1.9 {options for interp command} {
    63     list [catch {interp -froboz -safe} msg] $msg
    64 } {1 {bad option "-froboz": must be alias, aliases, create, delete, eval, exists, expose, hide, hidden, issafe, invokehidden, marktrusted, recursionlimit, slaves, share, target, or transfer}} 
    65 test interp-1.10 {options for interp command} {
    66     list [catch {interp target} msg] $msg
    67 } {1 {wrong # args: should be "interp target path alias"}}
    68 
    69 
    70 # Part 1: Basic interpreter creation tests:
    71 test interp-2.1 {basic interpreter creation} {
    72     interp create a
    73 } a
    74 test interp-2.2 {basic interpreter creation} {
    75     catch {interp create}
    76 } 0
    77 test interp-2.3 {basic interpreter creation} {
    78     catch {interp create -safe}
    79 } 0 
    80 test interp-2.4 {basic interpreter creation} {
    81     list [catch {interp create a} msg] $msg
    82 } {1 {interpreter named "a" already exists, cannot create}}
    83 test interp-2.5 {basic interpreter creation} {
    84     interp create b -safe
    85 } b
    86 test interp-2.6 {basic interpreter creation} {
    87     interp create d -safe
    88 } d
    89 test interp-2.7 {basic interpreter creation} {
    90     list [catch {interp create -froboz} msg] $msg
    91 } {1 {bad option "-froboz": must be -safe or --}}
    92 test interp-2.8 {basic interpreter creation} {
    93     interp create -- -froboz
    94 } -froboz
    95 test interp-2.9 {basic interpreter creation} {
    96     interp create -safe -- -froboz1
    97 } -froboz1
    98 test interp-2.10 {basic interpreter creation} {
    99     interp create {a x1}
   100     interp create {a x2}
   101     interp create {a x3} -safe
   102 } {a x3}
   103 test interp-2.11 {anonymous interps vs existing procs} {
   104     set x [interp create]
   105     regexp "interp(\[0-9]+)" $x dummy thenum
   106     interp delete $x
   107     proc interp$thenum {} {}
   108     set x [interp create]
   109     regexp "interp(\[0-9]+)" $x dummy anothernum
   110     expr $anothernum > $thenum
   111 } 1    
   112 test interp-2.12 {anonymous interps vs existing procs} {
   113     set x [interp create -safe]
   114     regexp "interp(\[0-9]+)" $x dummy thenum
   115     interp delete $x
   116     proc interp$thenum {} {}
   117     set x [interp create -safe]
   118     regexp "interp(\[0-9]+)" $x dummy anothernum
   119     expr $anothernum - $thenum
   120 } 1    
   121 test interp-2.13 {correct default when no $path arg is given} -body {
   122     interp create --
   123 } -match regexp -result {interp[0-9]+}
   124     
   125 foreach i [interp slaves] {
   126     interp delete $i
   127 }
   128 
   129 # Part 2: Testing "interp slaves" and "interp exists"
   130 test interp-3.1 {testing interp exists and interp slaves} {
   131     interp slaves
   132 } ""
   133 test interp-3.2 {testing interp exists and interp slaves} {
   134     interp create a
   135     interp exists a
   136 } 1
   137 test interp-3.3 {testing interp exists and interp slaves} {
   138     interp exists nonexistent
   139 } 0
   140 test interp-3.4 {testing interp exists and interp slaves} {
   141     list [catch {interp slaves a b c} msg] $msg
   142 } {1 {wrong # args: should be "interp slaves ?path?"}}
   143 test interp-3.5 {testing interp exists and interp slaves} {
   144     list [catch {interp exists a b c} msg] $msg
   145 } {1 {wrong # args: should be "interp exists ?path?"}}
   146 test interp-3.6 {testing interp exists and interp slaves} {
   147     interp exists
   148 } 1
   149 test interp-3.7 {testing interp exists and interp slaves} {
   150     interp slaves
   151 } a
   152 test interp-3.8 {testing interp exists and interp slaves} {
   153     list [catch {interp slaves a b c} msg] $msg
   154 } {1 {wrong # args: should be "interp slaves ?path?"}}
   155 test interp-3.9 {testing interp exists and interp slaves} {
   156     interp create {a a2} -safe
   157     expr {[lsearch [interp slaves a] a2] >= 0}
   158 } 1
   159 test interp-3.10 {testing interp exists and interp slaves} {
   160     interp exists {a a2}
   161 } 1
   162 
   163 # Part 3: Testing "interp delete"
   164 test interp-3.11 {testing interp delete} {
   165     interp delete
   166 } ""
   167 test interp-4.1 {testing interp delete} {
   168     catch {interp create a}
   169     interp delete a
   170 } ""
   171 test interp-4.2 {testing interp delete} {
   172     list [catch {interp delete nonexistent} msg] $msg
   173 } {1 {could not find interpreter "nonexistent"}}
   174 test interp-4.3 {testing interp delete} {
   175     list [catch {interp delete x y z} msg] $msg
   176 } {1 {could not find interpreter "x"}}
   177 test interp-4.4 {testing interp delete} {
   178     interp delete
   179 } ""
   180 test interp-4.5 {testing interp delete} {
   181     interp create a
   182     interp create {a x1}
   183     interp delete {a x1}
   184     expr {[lsearch [interp slaves a] x1] >= 0}
   185 } 0
   186 test interp-4.6 {testing interp delete} {
   187     interp create c1
   188     interp create c2
   189     interp create c3
   190     interp delete c1 c2 c3
   191 } ""
   192 test interp-4.7 {testing interp delete} {
   193     interp create c1
   194     interp create c2
   195     list [catch {interp delete c1 c2 c3} msg] $msg
   196 } {1 {could not find interpreter "c3"}}
   197 test interp-4.8 {testing interp delete} {
   198     list [catch {interp delete {}} msg] $msg
   199 } {1 {cannot delete the current interpreter}}
   200 
   201 foreach i [interp slaves] {
   202     interp delete $i
   203 }
   204 
   205 # Part 4: Consistency checking - all nondeleted interpreters should be
   206 # there:
   207 test interp-5.1 {testing consistency} {
   208     interp slaves
   209 } ""
   210 test interp-5.2 {testing consistency} {
   211     interp exists a
   212 } 0
   213 test interp-5.3 {testing consistency} {
   214     interp exists nonexistent
   215 } 0
   216 
   217 # Recreate interpreter "a"
   218 interp create a
   219 
   220 # Part 5: Testing eval in interpreter object command and with interp command
   221 test interp-6.1 {testing eval} {
   222     a eval expr 3 + 5
   223 } 8
   224 test interp-6.2 {testing eval} {
   225     list [catch {a eval foo} msg] $msg
   226 } {1 {invalid command name "foo"}}
   227 test interp-6.3 {testing eval} {
   228     a eval {proc foo {} {expr 3 + 5}}
   229     a eval foo
   230 } 8
   231 test interp-6.4 {testing eval} {
   232     interp eval a foo
   233 } 8
   234 
   235 test interp-6.5 {testing eval} {
   236     interp create {a x2}
   237     interp eval {a x2} {proc frob {} {expr 4 * 9}}
   238     interp eval {a x2} frob
   239 } 36
   240 test interp-6.6 {testing eval} {
   241     list [catch {interp eval {a x2} foo} msg] $msg
   242 } {1 {invalid command name "foo"}}
   243 
   244 # UTILITY PROCEDURE RUNNING IN MASTER INTERPRETER:
   245 proc in_master {args} {
   246      return [list seen in master: $args]
   247 }
   248 
   249 # Part 6: Testing basic alias creation
   250 test interp-7.1 {testing basic alias creation} {
   251     a alias foo in_master
   252 } foo
   253 test interp-7.2 {testing basic alias creation} {
   254     a alias bar in_master a1 a2 a3
   255 } bar
   256 # Test 6.3 has been deleted.
   257 test interp-7.3 {testing basic alias creation} {
   258     a alias foo
   259 } in_master
   260 test interp-7.4 {testing basic alias creation} {
   261     a alias bar
   262 } {in_master a1 a2 a3}
   263 test interp-7.5 {testing basic alias creation} {
   264     lsort [a aliases]
   265 } {bar foo}
   266 test interp-7.6 {testing basic aliases arg checking} {
   267     list [catch {a aliases too many args} msg] $msg
   268 } {1 {wrong # args: should be "a aliases"}}
   269 
   270 # Part 7: testing basic alias invocation
   271 test interp-8.1 {testing basic alias invocation} {
   272     catch {interp create a}
   273     a alias foo in_master
   274     a eval foo s1 s2 s3
   275 } {seen in master: {s1 s2 s3}}
   276 test interp-8.2 {testing basic alias invocation} {
   277     catch {interp create a}
   278     a alias bar in_master a1 a2 a3
   279     a eval bar s1 s2 s3
   280 } {seen in master: {a1 a2 a3 s1 s2 s3}}
   281 test interp-8.3 {testing basic alias invocation} {
   282    catch {interp create a}
   283    list [catch {a alias} msg] $msg
   284 } {1 {wrong # args: should be "a alias aliasName ?targetName? ?args..?"}}
   285 
   286 # Part 8: Testing aliases for non-existent or hidden targets
   287 test interp-9.1 {testing aliases for non-existent targets} {
   288     catch {interp create a}
   289     a alias zop nonexistent-command-in-master
   290     list [catch {a eval zop} msg] $msg
   291 } {1 {invalid command name "nonexistent-command-in-master"}}
   292 test interp-9.2 {testing aliases for non-existent targets} {
   293     catch {interp create a}
   294     a alias zop nonexistent-command-in-master
   295     proc nonexistent-command-in-master {} {return i_exist!}
   296     a eval zop
   297 } i_exist!
   298 test interp-9.3 {testing aliases for hidden commands} {
   299     catch {interp create a}
   300     a eval {proc p {} {return ENTER_A}}
   301     interp alias {} p a p
   302     set res {}
   303     lappend res [list [catch p msg] $msg]
   304     interp hide a p
   305     lappend res [list [catch p msg] $msg]
   306     rename p {}
   307     interp delete a
   308     set res
   309  } {{0 ENTER_A} {1 {invalid command name "p"}}}
   310 test interp-9.4 {testing aliases and namespace commands} {
   311     proc p {} {return GLOBAL}
   312     namespace eval tst {
   313 	proc p {} {return NAMESPACE}
   314     }
   315     interp alias {} a {} p
   316     set res [a]
   317     lappend res [namespace eval tst a]
   318     rename p {}
   319     rename a {}
   320     namespace delete tst
   321     set res
   322  } {GLOBAL GLOBAL}
   323 
   324 if {[info command nonexistent-command-in-master] != ""} {
   325     rename nonexistent-command-in-master {}
   326 }
   327 
   328 # Part 9: Aliasing between interpreters
   329 test interp-10.1 {testing aliasing between interpreters} {
   330     catch {interp delete a}
   331     catch {interp delete b}
   332     interp create a
   333     interp create b
   334     interp alias a a_alias b b_alias 1 2 3
   335 } a_alias
   336 test interp-10.2 {testing aliasing between interpreters} {
   337     catch {interp delete a}
   338     catch {interp delete b}
   339     interp create a
   340     interp create b
   341     b eval {proc b_alias {args} {return [list got $args]}}
   342     interp alias a a_alias b b_alias 1 2 3
   343     a eval a_alias a b c
   344 } {got {1 2 3 a b c}}
   345 test interp-10.3 {testing aliasing between interpreters} {
   346     catch {interp delete a}
   347     catch {interp delete b}
   348     interp create a
   349     interp create b
   350     interp alias a a_alias b b_alias 1 2 3
   351     list [catch {a eval a_alias a b c} msg] $msg
   352 } {1 {invalid command name "b_alias"}}
   353 test interp-10.4 {testing aliasing between interpreters} {
   354     catch {interp delete a}
   355     interp create a
   356     a alias a_alias puts
   357     a aliases
   358 } a_alias
   359 test interp-10.5 {testing aliasing between interpreters} {
   360     catch {interp delete a}
   361     catch {interp delete b}
   362     interp create a
   363     interp create b
   364     a alias a_alias puts
   365     interp alias a a_del b b_del
   366     interp delete b
   367     a aliases
   368 } a_alias
   369 test interp-10.6 {testing aliasing between interpreters} {
   370     catch {interp delete a}
   371     catch {interp delete b}
   372     interp create a
   373     interp create b
   374     interp alias a a_command b b_command a1 a2 a3
   375     b alias b_command in_master b1 b2 b3
   376     a eval a_command m1 m2 m3
   377 } {seen in master: {b1 b2 b3 a1 a2 a3 m1 m2 m3}}
   378 test interp-10.7 {testing aliases between interpreters} {
   379     catch {interp delete a}
   380     interp create a
   381     interp alias "" foo a zoppo
   382     a eval {proc zoppo {x} {list $x $x $x}}
   383     set x [foo 33]
   384     a eval {rename zoppo {}}
   385     interp alias "" foo a {}
   386     equiv $x
   387 } {33 33 33}
   388 
   389 # Part 10: Testing "interp target"
   390 test interp-11.1 {testing interp target} {
   391     list [catch {interp target} msg] $msg
   392 } {1 {wrong # args: should be "interp target path alias"}}
   393 test interp-11.2 {testing interp target} {
   394     list [catch {interp target nosuchinterpreter foo} msg] $msg
   395 } {1 {could not find interpreter "nosuchinterpreter"}}
   396 test interp-11.3 {testing interp target} {
   397     catch {interp delete a}
   398     interp create a
   399     a alias boo no_command
   400     interp target a boo
   401 } ""
   402 test interp-11.4 {testing interp target} {
   403     catch {interp delete x1}
   404     interp create x1
   405     x1 eval interp create x2
   406     x1 eval x2 eval interp create x3
   407     catch {interp delete y1}
   408     interp create y1
   409     y1 eval interp create y2
   410     y1 eval y2 eval interp create y3
   411     interp alias {x1 x2 x3} xcommand {y1 y2 y3} ycommand
   412     interp target {x1 x2 x3} xcommand
   413 } {y1 y2 y3}
   414 test interp-11.5 {testing interp target} {
   415     catch {interp delete x1}
   416     interp create x1
   417     interp create {x1 x2}
   418     interp create {x1 x2 x3}
   419     catch {interp delete y1}
   420     interp create y1
   421     interp create {y1 y2}
   422     interp create {y1 y2 y3}
   423     interp alias {x1 x2 x3} xcommand {y1 y2 y3} ycommand
   424     list [catch {x1 eval {interp target {x2 x3} xcommand}} msg] $msg
   425 } {1 {target interpreter for alias "xcommand" in path "x2 x3" is not my descendant}}
   426 test interp-11.6 {testing interp target} {
   427     foreach a [interp aliases] {
   428 	rename $a {}
   429     }
   430     list [catch {interp target {} foo} msg] $msg
   431 } {1 {alias "foo" in path "" not found}}
   432 test interp-11.7 {testing interp target} {
   433     catch {interp delete a}
   434     interp create a
   435     list [catch {interp target a foo} msg] $msg
   436 } {1 {alias "foo" in path "a" not found}}
   437 
   438 # Part 11: testing "interp issafe"
   439 test interp-12.1 {testing interp issafe} {
   440     interp issafe
   441 } 0
   442 test interp-12.2 {testing interp issafe} {
   443     catch {interp delete a}
   444     interp create a
   445     interp issafe a
   446 } 0
   447 test interp-12.3 {testing interp issafe} {
   448     catch {interp delete a}
   449     interp create a
   450     interp create {a x3} -safe
   451     interp issafe {a x3}
   452 } 1
   453 test interp-12.4 {testing interp issafe} {
   454     catch {interp delete a}
   455     interp create a
   456     interp create {a x3} -safe
   457     interp create {a x3 foo}
   458     interp issafe {a x3 foo}
   459 } 1
   460 
   461 # Part 12: testing interpreter object command "issafe" sub-command
   462 test interp-13.1 {testing foo issafe} {
   463     catch {interp delete a}
   464     interp create a
   465     a issafe
   466 } 0
   467 test interp-13.2 {testing foo issafe} {
   468     catch {interp delete a}
   469     interp create a
   470     interp create {a x3} -safe
   471     a eval x3 issafe
   472 } 1
   473 test interp-13.3 {testing foo issafe} {
   474     catch {interp delete a}
   475     interp create a
   476     interp create {a x3} -safe
   477     interp create {a x3 foo}
   478     a eval x3 eval foo issafe
   479 } 1
   480 test interp-13.4 {testing issafe arg checking} {
   481     catch {interp create a}
   482     list [catch {a issafe too many args} msg] $msg
   483 } {1 {wrong # args: should be "a issafe"}}
   484 
   485 # part 14: testing interp aliases
   486 test interp-14.1 {testing interp aliases} {
   487     interp aliases
   488 } ""
   489 test interp-14.2 {testing interp aliases} {
   490     catch {interp delete a}
   491     interp create a
   492     a alias a1 puts
   493     a alias a2 puts
   494     a alias a3 puts
   495     lsort [interp aliases a]
   496 } {a1 a2 a3}
   497 test interp-14.3 {testing interp aliases} {
   498     catch {interp delete a}
   499     interp create a
   500     interp create {a x3}
   501     interp alias {a x3} froboz "" puts
   502     interp aliases {a x3}
   503 } froboz
   504 test interp-14.4 {testing interp alias - alias over master} {
   505     # SF Bug 641195
   506     catch {interp delete a}
   507     interp create a
   508     list [catch {interp alias "" a a eval} msg] $msg [info commands a]
   509 } {1 {cannot define or rename alias "a": interpreter deleted} {}}
   510 
   511 # part 15: testing file sharing
   512 test interp-15.1 {testing file sharing} {
   513     catch {interp delete z}
   514     interp create z
   515     z eval close stdout
   516     list [catch {z eval puts hello} msg] $msg
   517 } {1 {can not find channel named "stdout"}}
   518 test interp-15.2 {testing file sharing} -body {
   519     catch {interp delete z}
   520     interp create z
   521     set f [open [makeFile {} file-15.2] w]
   522     interp share "" $f z
   523     z eval puts $f hello
   524     z eval close $f
   525     close $f
   526 } -cleanup {
   527     removeFile file-15.2
   528 } -result ""
   529 test interp-15.3 {testing file sharing} {
   530     catch {interp delete xsafe}
   531     interp create xsafe -safe
   532     list [catch {xsafe eval puts hello} msg] $msg
   533 } {1 {can not find channel named "stdout"}}
   534 test interp-15.4 {testing file sharing} -body {
   535     catch {interp delete xsafe}
   536     interp create xsafe -safe
   537     set f [open [makeFile {} file-15.4] w]
   538     interp share "" $f xsafe
   539     xsafe eval puts $f hello
   540     xsafe eval close $f
   541     close $f
   542 } -cleanup {
   543     removeFile file-15.4
   544 } -result ""
   545 test interp-15.5 {testing file sharing} {
   546     catch {interp delete xsafe}
   547     interp create xsafe -safe
   548     interp share "" stdout xsafe
   549     list [catch {xsafe eval gets stdout} msg] $msg
   550 } {1 {channel "stdout" wasn't opened for reading}}
   551 test interp-15.6 {testing file sharing} -body {
   552     catch {interp delete xsafe}
   553     interp create xsafe -safe
   554     set f [open [makeFile {} file-15.6] w]
   555     interp share "" $f xsafe
   556     set x [list [catch [list xsafe eval gets $f] msg] $msg]
   557     xsafe eval close $f
   558     close $f
   559     string compare [string tolower $x] \
   560 		[list 1 [format "channel \"%s\" wasn't opened for reading" $f]]
   561 } -cleanup {
   562     removeFile file-15.6
   563 } -result 0
   564 test interp-15.7 {testing file transferring} -body {
   565     catch {interp delete xsafe}
   566     interp create xsafe -safe
   567     set f [open [makeFile {} file-15.7] w]
   568     interp transfer "" $f xsafe
   569     xsafe eval puts $f hello
   570     xsafe eval close $f
   571 } -cleanup {
   572     removeFile file-15.7
   573 } -result ""
   574 test interp-15.8 {testing file transferring} -body {
   575     catch {interp delete xsafe}
   576     interp create xsafe -safe
   577     set f [open [makeFile {} file-15.8] w]
   578     interp transfer "" $f xsafe
   579     xsafe eval close $f
   580     set x [list [catch {close $f} msg] $msg]
   581     string compare [string tolower $x] \
   582 		[list 1 [format "can not find channel named \"%s\"" $f]]
   583 } -cleanup {
   584     removeFile file-15.8
   585 } -result 0
   586 
   587 #
   588 # Torture tests for interpreter deletion order
   589 #
   590 proc kill {} {interp delete xxx}
   591 
   592 test interp-15.9 {testing deletion order} {
   593     catch {interp delete xxx}
   594     interp create xxx
   595     xxx alias kill kill
   596     list [catch {xxx eval kill} msg] $msg
   597 } {0 {}}
   598 test interp-16.1 {testing deletion order} {
   599     catch {interp delete xxx}
   600     interp create xxx
   601     interp create {xxx yyy}
   602     interp alias {xxx yyy} kill "" kill
   603     list [catch {interp eval {xxx yyy} kill} msg] $msg
   604 } {0 {}}
   605 test interp-16.2 {testing deletion order} {
   606     catch {interp delete xxx}
   607     interp create xxx
   608     interp create {xxx yyy}
   609     interp alias {xxx yyy} kill "" kill
   610     list [catch {xxx eval yyy eval kill} msg] $msg
   611 } {0 {}}
   612 test interp-16.3 {testing deletion order} {
   613     catch {interp delete xxx}
   614     interp create xxx
   615     interp create ddd
   616     xxx alias kill kill
   617     interp alias ddd kill xxx kill
   618     set x [ddd eval kill]
   619     interp delete ddd
   620     set x
   621 } ""
   622 test interp-16.4 {testing deletion order} {
   623     catch {interp delete xxx}
   624     interp create xxx
   625     interp create {xxx yyy}
   626     interp alias {xxx yyy} kill "" kill
   627     interp create ddd
   628     interp alias ddd kill {xxx yyy} kill
   629     set x [ddd eval kill]
   630     interp delete ddd
   631     set x
   632 } ""
   633 test interp-16.5 {testing deletion order, bgerror} {
   634     catch {interp delete xxx}
   635     interp create xxx
   636     xxx eval {proc bgerror {args} {exit}}
   637     xxx alias exit kill xxx
   638     proc kill {i} {interp delete $i}
   639     xxx eval after 100 expr a + b
   640     after 200
   641     update
   642     interp exists xxx
   643 } 0
   644 
   645 #
   646 # Alias loop prevention testing.
   647 #
   648 
   649 test interp-17.1 {alias loop prevention} {
   650     list [catch {interp alias {} a {} a} msg] $msg
   651 } {1 {cannot define or rename alias "a": would create a loop}}
   652 test interp-17.2 {alias loop prevention} {
   653     catch {interp delete x}
   654     interp create x
   655     x alias a loop
   656     list [catch {interp alias {} loop x a} msg] $msg
   657 } {1 {cannot define or rename alias "loop": would create a loop}}
   658 test interp-17.3 {alias loop prevention} {
   659     catch {interp delete x}
   660     interp create x
   661     interp alias x a x b
   662     list [catch {interp alias x b x a} msg] $msg
   663 } {1 {cannot define or rename alias "b": would create a loop}}
   664 test interp-17.4 {alias loop prevention} {
   665     catch {interp delete x}
   666     interp create x
   667     interp alias x b x a
   668     list [catch {x eval rename b a} msg] $msg
   669 } {1 {cannot define or rename alias "b": would create a loop}}
   670 test interp-17.5 {alias loop prevention} {
   671     catch {interp delete x}
   672     interp create x
   673     x alias z l1
   674     interp alias {} l2 x z
   675     list [catch {rename l2 l1} msg] $msg
   676 } {1 {cannot define or rename alias "l2": would create a loop}}
   677 
   678 #
   679 # Test robustness of Tcl_DeleteInterp when applied to a slave interpreter.
   680 # If there are bugs in the implementation these tests are likely to expose
   681 # the bugs as a core dump.
   682 #
   683 
   684 if {[info commands testinterpdelete] == ""} {
   685     puts "This application hasn't been compiled with the \"testinterpdelete\""
   686     puts "command, so I can't test slave delete calls"
   687 } else {
   688     test interp-18.1 {testing Tcl_DeleteInterp vs slaves} {
   689 	list [catch {testinterpdelete} msg] $msg
   690     } {1 {wrong # args: should be "testinterpdelete path"}}
   691     test interp-18.2 {testing Tcl_DeleteInterp vs slaves} {
   692 	catch {interp delete a}
   693 	interp create a
   694 	testinterpdelete a
   695     } ""
   696     test interp-18.3 {testing Tcl_DeleteInterp vs slaves} {
   697 	catch {interp delete a}
   698 	interp create a
   699 	interp create {a b}
   700 	testinterpdelete {a b}
   701     } ""
   702     test interp-18.4 {testing Tcl_DeleteInterp vs slaves} {
   703 	catch {interp delete a}
   704 	interp create a
   705 	interp create {a b}
   706 	testinterpdelete a
   707     } ""
   708     test interp-18.5 {testing Tcl_DeleteInterp vs slaves} {
   709 	catch {interp delete a}
   710 	interp create a
   711 	interp create {a b}
   712 	interp alias {a b} dodel {} dodel
   713 	proc dodel {x} {testinterpdelete $x}
   714 	list [catch {interp eval {a b} {dodel {a b}}} msg] $msg
   715     } {0 {}}
   716     test interp-18.6 {testing Tcl_DeleteInterp vs slaves} {
   717 	catch {interp delete a}
   718 	interp create a
   719 	interp create {a b}
   720 	interp alias {a b} dodel {} dodel
   721 	proc dodel {x} {testinterpdelete $x}
   722 	list [catch {interp eval {a b} {dodel a}} msg] $msg
   723     } {0 {}}
   724     test interp-18.7 {eval in deleted interp} {
   725 	catch {interp delete a}
   726 	interp create a
   727 	a eval {
   728 	    proc dodel {} {
   729 		delme
   730 		dosomething else
   731 	    }
   732 	    proc dosomething args {
   733 		puts "I should not have been called!!"
   734 	    }
   735 	}
   736 	a alias delme dela
   737 	proc dela {} {interp delete a}
   738 	list [catch {a eval dodel} msg] $msg
   739     } {1 {attempt to call eval in deleted interpreter}}
   740     test interp-18.8 {eval in deleted interp} {
   741 	catch {interp delete a}
   742 	interp create a
   743 	a eval {
   744 	    interp create b
   745 	    b eval {
   746 		proc dodel {} {
   747 		    dela
   748 		}
   749 	    }
   750 	    proc foo {} {
   751 		b eval dela
   752 		dosomething else
   753 	    }
   754 	    proc dosomething args {
   755 		puts "I should not have been called!!"
   756 	    }
   757 	}
   758 	interp alias {a b} dela {} dela
   759 	proc dela {} {interp delete a}
   760 	list [catch {a eval foo} msg] $msg
   761     } {1 {attempt to call eval in deleted interpreter}}
   762 }
   763 test interp-18.9 {eval in deleted interp, bug 495830} {knownBug} {
   764     interp create tst
   765     interp alias tst suicide {} interp delete tst
   766     list [catch {tst eval {suicide; set a 5}} msg] $msg
   767 } {1 {attempt to call eval in deleted interpreter}}     
   768 test interp-18.10 {eval in deleted interp, bug 495830} {
   769     interp create tst
   770     interp alias tst suicide {} interp delete tst
   771     list [catch {tst eval {set set set; suicide; $set a 5}} msg] $msg
   772 } {1 {attempt to call eval in deleted interpreter}}     
   773 
   774 # Test alias deletion
   775 
   776 test interp-19.1 {alias deletion} {
   777     catch {interp delete a}
   778     interp create a
   779     interp alias a foo a bar
   780     set s [interp alias a foo {}]
   781     interp delete a
   782     set s
   783 } {}
   784 test interp-19.2 {alias deletion} {
   785     catch {interp delete a}
   786     interp create a
   787     catch {interp alias a foo {}} msg
   788     interp delete a
   789     set msg
   790 } {alias "foo" not found}
   791 test interp-19.3 {alias deletion} {
   792     catch {interp delete a}
   793     interp create a
   794     interp alias a foo a bar
   795     interp eval a {rename foo zop}
   796     interp alias a foo a zop
   797     catch {interp eval a foo} msg
   798     interp delete a
   799     set msg
   800 } {invalid command name "zop"}
   801 test interp-19.4 {alias deletion} {
   802     catch {interp delete a}
   803     interp create a
   804     interp alias a foo a bar
   805     interp eval a {rename foo zop}
   806     catch {interp eval a foo} msg
   807     interp delete a
   808     set msg
   809 } {invalid command name "foo"}
   810 test interp-19.5 {alias deletion} {
   811     catch {interp delete a}
   812     interp create a
   813     interp eval a {proc bar {} {return 1}}
   814     interp alias a foo a bar
   815     interp eval a {rename foo zop}
   816     catch {interp eval a zop} msg
   817     interp delete a
   818     set msg
   819 } 1
   820 test interp-19.6 {alias deletion} {
   821     catch {interp delete a}
   822     interp create a
   823     interp alias a foo a bar
   824     interp eval a {rename foo zop}
   825     interp alias a foo a zop
   826     set s [interp aliases a]
   827     interp delete a
   828     set s
   829 } foo
   830 test interp-19.7 {alias deletion, renaming} {
   831     catch {interp delete a}
   832     interp create a
   833     interp alias a foo a bar
   834     interp eval a rename foo blotz
   835     interp alias a foo {}
   836     set s [interp aliases a]
   837     interp delete a
   838     set s
   839 } {}
   840 test interp-19.8 {alias deletion, renaming} {
   841     catch {interp delete a}
   842     interp create a
   843     interp alias a foo a bar
   844     interp eval a rename foo blotz
   845     set l ""
   846     lappend l [interp aliases a]
   847     interp alias a foo {}
   848     lappend l [interp aliases a]
   849     interp delete a
   850     set l
   851 } {foo {}}
   852 test interp-19.9 {alias deletion, renaming} {
   853     catch {interp delete a}
   854     interp create a
   855     interp alias a foo a bar
   856     interp eval a rename foo blotz
   857     interp eval a {proc foo {} {expr 34 * 34}}
   858     interp alias a foo {}
   859     set l [interp eval a foo]
   860     interp delete a
   861     set l
   862 } 1156    
   863 
   864 test interp-20.1 {interp hide, interp expose and interp invokehidden} {
   865     catch {interp delete a}
   866     interp create a
   867     a eval {proc unknown {x args} {error "invalid command name \"$x\""}}
   868     a eval {proc foo {} {}}
   869     a hide foo
   870     catch {a eval foo something} msg
   871     interp delete a
   872     set msg
   873 } {invalid command name "foo"}
   874 test interp-20.2 {interp hide, interp expose and interp invokehidden} {
   875     catch {interp delete a}
   876     interp create a
   877     a eval {proc unknown {x args} {error "invalid command name \"$x\""}}
   878     a hide list
   879     set l ""
   880     lappend l [catch {a eval {list 1 2 3}} msg]
   881     lappend l $msg
   882     a expose list
   883     lappend l [catch {a eval {list 1 2 3}} msg]
   884     lappend l $msg
   885     interp delete a
   886     set l
   887 } {1 {invalid command name "list"} 0 {1 2 3}}
   888 test interp-20.3 {interp hide, interp expose and interp invokehidden} {
   889     catch {interp delete a}
   890     interp create a
   891     a eval {proc unknown {x args} {error "invalid command name \"$x\""}}
   892     a hide list
   893     set l ""
   894     lappend l [catch {a eval {list 1 2 3}} msg]
   895     lappend l $msg
   896     lappend l [catch {a invokehidden list 1 2 3} msg]
   897     lappend l $msg
   898     a expose list
   899     lappend l [catch {a eval {list 1 2 3}} msg]
   900     lappend l $msg
   901     interp delete a
   902     set l
   903 } {1 {invalid command name "list"} 0 {1 2 3} 0 {1 2 3}}
   904 test interp-20.4 {interp hide, interp expose and interp invokehidden -- passing {}} {
   905     catch {interp delete a}
   906     interp create a
   907     a eval {proc unknown {x args} {error "invalid command name \"$x\""}}
   908     a hide list
   909     set l ""
   910     lappend l [catch {a eval {list 1 2 3}} msg]
   911     lappend l $msg
   912     lappend l [catch {a invokehidden list {"" 1 2 3}} msg]
   913     lappend l $msg
   914     a expose list
   915     lappend l [catch {a eval {list 1 2 3}} msg]
   916     lappend l $msg
   917     interp delete a
   918     set l
   919 } {1 {invalid command name "list"} 0 {{"" 1 2 3}} 0 {1 2 3}}
   920 test interp-20.5 {interp hide, interp expose and interp invokehidden -- passing {}} {
   921     catch {interp delete a}
   922     interp create a
   923     a eval {proc unknown {x args} {error "invalid command name \"$x\""}}
   924     a hide list
   925     set l ""
   926     lappend l [catch {a eval {list 1 2 3}} msg]
   927     lappend l $msg
   928     lappend l [catch {a invokehidden list {{} 1 2 3}} msg]
   929     lappend l $msg
   930     a expose list
   931     lappend l [catch {a eval {list 1 2 3}} msg]
   932     lappend l $msg
   933     interp delete a
   934     set l
   935 } {1 {invalid command name "list"} 0 {{{} 1 2 3}} 0 {1 2 3}}
   936 test interp-20.6 {interp invokehidden -- eval args} {
   937     catch {interp delete a}
   938     interp create a
   939     a hide list
   940     set l ""
   941     set z 45
   942     lappend l [catch {a invokehidden list $z 1 2 3} msg]
   943     lappend l $msg
   944     a expose list
   945     lappend l [catch {a eval list $z 1 2 3} msg]
   946     lappend l $msg
   947     interp delete a
   948     set l
   949 } {0 {45 1 2 3} 0 {45 1 2 3}}
   950 test interp-20.7 {interp invokehidden vs variable eval} {
   951     catch {interp delete a}
   952     interp create a
   953     a hide list
   954     set z 45
   955     set l ""
   956     lappend l [catch {a invokehidden list {$z a b c}} msg]
   957     lappend l $msg
   958     interp delete a
   959     set l
   960 } {0 {{$z a b c}}}
   961 test interp-20.8 {interp invokehidden vs variable eval} {
   962     catch {interp delete a}
   963     interp create a
   964     a hide list
   965     a eval set z 89
   966     set z 45
   967     set l ""
   968     lappend l [catch {a invokehidden list {$z a b c}} msg]
   969     lappend l $msg
   970     interp delete a
   971     set l
   972 } {0 {{$z a b c}}}
   973 test interp-20.9 {interp invokehidden vs variable eval} {
   974     catch {interp delete a}
   975     interp create a
   976     a hide list
   977     a eval set z 89
   978     set z 45
   979     set l ""
   980     lappend l [catch {a invokehidden list $z {$z a b c}} msg]
   981     lappend l $msg
   982     interp delete a
   983     set l
   984 } {0 {45 {$z a b c}}}
   985 test interp-20.10 {interp hide, interp expose and interp invokehidden} {
   986     catch {interp delete a}
   987     interp create a
   988     a eval {proc unknown {x args} {error "invalid command name \"$x\""}}
   989     a eval {proc foo {} {}}
   990     interp hide a foo
   991     catch {interp eval a foo something} msg
   992     interp delete a
   993     set msg
   994 } {invalid command name "foo"}
   995 test interp-20.11 {interp hide, interp expose and interp invokehidden} {
   996     catch {interp delete a}
   997     interp create a
   998     a eval {proc unknown {x args} {error "invalid command name \"$x\""}}
   999     interp hide a list
  1000     set l ""
  1001     lappend l [catch {interp eval a {list 1 2 3}} msg]
  1002     lappend l $msg
  1003     interp expose a list
  1004     lappend l [catch {interp eval a {list 1 2 3}} msg]
  1005     lappend l $msg
  1006     interp delete a
  1007     set l
  1008 } {1 {invalid command name "list"} 0 {1 2 3}}
  1009 test interp-20.12 {interp hide, interp expose and interp invokehidden} {
  1010     catch {interp delete a}
  1011     interp create a
  1012     a eval {proc unknown {x args} {error "invalid command name \"$x\""}}
  1013     interp hide a list
  1014     set l ""
  1015     lappend l [catch {interp eval a {list 1 2 3}} msg]
  1016     lappend l $msg
  1017     lappend l [catch {interp invokehidden a list 1 2 3} msg]
  1018     lappend l $msg
  1019     interp expose a list
  1020     lappend l [catch {interp eval a {list 1 2 3}} msg]
  1021     lappend l $msg
  1022     interp delete a
  1023     set l
  1024 } {1 {invalid command name "list"} 0 {1 2 3} 0 {1 2 3}}
  1025 test interp-20.13 {interp hide, interp expose, interp invokehidden -- passing {}} {
  1026     catch {interp delete a}
  1027     interp create a
  1028     a eval {proc unknown {x args} {error "invalid command name \"$x\""}}
  1029     interp hide a list
  1030     set l ""
  1031     lappend l [catch {interp eval a {list 1 2 3}} msg]
  1032     lappend l $msg
  1033     lappend l [catch {interp invokehidden a list {"" 1 2 3}} msg]
  1034     lappend l $msg
  1035     interp expose a list
  1036     lappend l [catch {interp eval a {list 1 2 3}} msg]
  1037     lappend l $msg
  1038     interp delete a
  1039     set l
  1040 } {1 {invalid command name "list"} 0 {{"" 1 2 3}} 0 {1 2 3}}
  1041 test interp-20.14 {interp hide, interp expose, interp invokehidden -- passing {}} {
  1042     catch {interp delete a}
  1043     interp create a
  1044     a eval {proc unknown {x args} {error "invalid command name \"$x\""}}
  1045     interp hide a list
  1046     set l ""
  1047     lappend l [catch {interp eval a {list 1 2 3}} msg]
  1048     lappend l $msg
  1049     lappend l [catch {interp invokehidden a list {{} 1 2 3}} msg]
  1050     lappend l $msg
  1051     interp expose a list
  1052     lappend l [catch {a eval {list 1 2 3}} msg]
  1053     lappend l $msg
  1054     interp delete a
  1055     set l
  1056 } {1 {invalid command name "list"} 0 {{{} 1 2 3}} 0 {1 2 3}}
  1057 test interp-20.15 {interp invokehidden -- eval args} {
  1058     catch {interp delete a}
  1059     interp create a
  1060     interp hide a list
  1061     set l ""
  1062     set z 45
  1063     lappend l [catch {interp invokehidden a list $z 1 2 3} msg]
  1064     lappend l $msg
  1065     a expose list
  1066     lappend l [catch {interp eval a list $z 1 2 3} msg]
  1067     lappend l $msg
  1068     interp delete a
  1069     set l
  1070 } {0 {45 1 2 3} 0 {45 1 2 3}}
  1071 test interp-20.16 {interp invokehidden vs variable eval} {
  1072     catch {interp delete a}
  1073     interp create a
  1074     interp hide a list
  1075     set z 45
  1076     set l ""
  1077     lappend l [catch {interp invokehidden a list {$z a b c}} msg]
  1078     lappend l $msg
  1079     interp delete a
  1080     set l
  1081 } {0 {{$z a b c}}}
  1082 test interp-20.17 {interp invokehidden vs variable eval} {
  1083     catch {interp delete a}
  1084     interp create a
  1085     interp hide a list
  1086     a eval set z 89
  1087     set z 45
  1088     set l ""
  1089     lappend l [catch {interp invokehidden a list {$z a b c}} msg]
  1090     lappend l $msg
  1091     interp delete a
  1092     set l
  1093 } {0 {{$z a b c}}}
  1094 test interp-20.18 {interp invokehidden vs variable eval} {
  1095     catch {interp delete a}
  1096     interp create a
  1097     interp hide a list
  1098     a eval set z 89
  1099     set z 45
  1100     set l ""
  1101     lappend l [catch {interp invokehidden a list $z {$z a b c}} msg]
  1102     lappend l $msg
  1103     interp delete a
  1104     set l
  1105 } {0 {45 {$z a b c}}}
  1106 test interp-20.19 {interp invokehidden vs nested commands} {
  1107     catch {interp delete a}
  1108     interp create a
  1109     a hide list
  1110     set l [a invokehidden list {[list x y z] f g h} z]
  1111     interp delete a
  1112     set l
  1113 } {{[list x y z] f g h} z}
  1114 test interp-20.20 {interp invokehidden vs nested commands} {
  1115     catch {interp delete a}
  1116     interp create a
  1117     a hide list
  1118     set l [interp invokehidden a list {[list x y z] f g h} z]
  1119     interp delete a
  1120     set l
  1121 } {{[list x y z] f g h} z}
  1122 test interp-20.21 {interp hide vs safety} {
  1123     catch {interp delete a}
  1124     interp create a -safe
  1125     set l ""
  1126     lappend l [catch {a hide list} msg]    
  1127     lappend l $msg
  1128     interp delete a
  1129     set l
  1130 } {0 {}}
  1131 test interp-20.22 {interp hide vs safety} {
  1132     catch {interp delete a}
  1133     interp create a -safe
  1134     set l ""
  1135     lappend l [catch {interp hide a list} msg]    
  1136     lappend l $msg
  1137     interp delete a
  1138     set l
  1139 } {0 {}}
  1140 test interp-20.23 {interp hide vs safety} {
  1141     catch {interp delete a}
  1142     interp create a -safe
  1143     set l ""
  1144     lappend l [catch {a eval {interp hide {} list}} msg]    
  1145     lappend l $msg
  1146     interp delete a
  1147     set l
  1148 } {1 {permission denied: safe interpreter cannot hide commands}}
  1149 test interp-20.24 {interp hide vs safety} {
  1150     catch {interp delete a}
  1151     interp create a -safe
  1152     interp create {a b}
  1153     set l ""
  1154     lappend l [catch {a eval {interp hide b list}} msg]    
  1155     lappend l $msg
  1156     interp delete a
  1157     set l
  1158 } {1 {permission denied: safe interpreter cannot hide commands}}
  1159 test interp-20.25 {interp hide vs safety} {
  1160     catch {interp delete a}
  1161     interp create a -safe
  1162     interp create {a b}
  1163     set l ""
  1164     lappend l [catch {interp hide {a b} list} msg]
  1165     lappend l $msg
  1166     interp delete a
  1167     set l
  1168 } {0 {}}
  1169 test interp-20.26 {interp expoose vs safety} {
  1170     catch {interp delete a}
  1171     interp create a -safe
  1172     set l ""
  1173     lappend l [catch {a hide list} msg]    
  1174     lappend l $msg
  1175     lappend l [catch {a expose list} msg]
  1176     lappend l $msg
  1177     interp delete a
  1178     set l
  1179 } {0 {} 0 {}}
  1180 test interp-20.27 {interp expose vs safety} {
  1181     catch {interp delete a}
  1182     interp create a -safe
  1183     set l ""
  1184     lappend l [catch {interp hide a list} msg]    
  1185     lappend l $msg
  1186     lappend l [catch {interp expose a list} msg]    
  1187     lappend l $msg
  1188     interp delete a
  1189     set l
  1190 } {0 {} 0 {}}
  1191 test interp-20.28 {interp expose vs safety} {
  1192     catch {interp delete a}
  1193     interp create a -safe
  1194     set l ""
  1195     lappend l [catch {a hide list} msg]    
  1196     lappend l $msg
  1197     lappend l [catch {a eval {interp expose {} list}} msg]
  1198     lappend l $msg
  1199     interp delete a
  1200     set l
  1201 } {0 {} 1 {permission denied: safe interpreter cannot expose commands}}
  1202 test interp-20.29 {interp expose vs safety} {
  1203     catch {interp delete a}
  1204     interp create a -safe
  1205     set l ""
  1206     lappend l [catch {interp hide a list} msg]    
  1207     lappend l $msg
  1208     lappend l [catch {a eval {interp expose {} list}} msg]    
  1209     lappend l $msg
  1210     interp delete a
  1211     set l
  1212 } {0 {} 1 {permission denied: safe interpreter cannot expose commands}}
  1213 test interp-20.30 {interp expose vs safety} {
  1214     catch {interp delete a}
  1215     interp create a -safe
  1216     interp create {a b}
  1217     set l ""
  1218     lappend l [catch {interp hide {a b} list} msg]    
  1219     lappend l $msg
  1220     lappend l [catch {a eval {interp expose b list}} msg]    
  1221     lappend l $msg
  1222     interp delete a
  1223     set l
  1224 } {0 {} 1 {permission denied: safe interpreter cannot expose commands}}
  1225 test interp-20.31 {interp expose vs safety} {
  1226     catch {interp delete a}
  1227     interp create a -safe
  1228     interp create {a b}
  1229     set l ""
  1230     lappend l [catch {interp hide {a b} list} msg]    
  1231     lappend l $msg
  1232     lappend l [catch {interp expose {a b} list} msg]
  1233     lappend l $msg
  1234     interp delete a
  1235     set l
  1236 } {0 {} 0 {}}
  1237 test interp-20.32 {interp invokehidden vs safety} {
  1238     catch {interp delete a}
  1239     interp create a -safe
  1240     interp hide a list
  1241     set l ""
  1242     lappend l [catch {a eval {interp invokehidden {} list a b c}} msg]
  1243     lappend l $msg
  1244     interp delete a
  1245     set l
  1246 } {1 {not allowed to invoke hidden commands from safe interpreter}}
  1247 test interp-20.33 {interp invokehidden vs safety} {
  1248     catch {interp delete a}
  1249     interp create a -safe
  1250     interp hide a list
  1251     set l ""
  1252     lappend l [catch {a eval {interp invokehidden {} list a b c}} msg]
  1253     lappend l $msg
  1254     lappend l [catch {a invokehidden list a b c} msg]
  1255     lappend l $msg
  1256     interp delete a
  1257     set l
  1258 } {1 {not allowed to invoke hidden commands from safe interpreter}\
  1259 0 {a b c}}
  1260 test interp-20.34 {interp invokehidden vs safety} {
  1261     catch {interp delete a}
  1262     interp create a -safe
  1263     interp create {a b}
  1264     interp hide {a b} list
  1265     set l ""
  1266     lappend l [catch {a eval {interp invokehidden b list a b c}} msg]
  1267     lappend l $msg
  1268     lappend l [catch {interp invokehidden {a b} list a b c} msg]
  1269     lappend l $msg
  1270     interp delete a
  1271     set l
  1272 } {1 {not allowed to invoke hidden commands from safe interpreter}\
  1273 0 {a b c}}
  1274 test interp-20.35 {invokehidden at local level} {
  1275     catch {interp delete a}
  1276     interp create a
  1277     a eval {
  1278 	proc p1 {} {
  1279 	    set z 90
  1280 	    a1
  1281 	    set z
  1282 	}
  1283 	proc h1 {} {
  1284 	    upvar z z
  1285 	    set z 91
  1286 	}
  1287     }
  1288     a hide h1
  1289     a alias a1 a1
  1290     proc a1 {} {
  1291 	interp invokehidden a h1
  1292     }
  1293     set r [interp eval a p1]
  1294     interp delete a
  1295     set r
  1296 } 91
  1297 test interp-20.36 {invokehidden at local level} {
  1298     catch {interp delete a}
  1299     interp create a
  1300     a eval {
  1301 	set z 90
  1302 	proc p1 {} {
  1303 	    global z
  1304 	    a1
  1305 	    set z
  1306 	}
  1307 	proc h1 {} {
  1308 	    upvar z z
  1309 	    set z 91
  1310 	}
  1311     }
  1312     a hide h1
  1313     a alias a1 a1
  1314     proc a1 {} {
  1315 	interp invokehidden a h1
  1316     }
  1317     set r [interp eval a p1]
  1318     interp delete a
  1319     set r
  1320 } 91
  1321 test interp-20.37 {invokehidden at local level} {
  1322     catch {interp delete a}
  1323     interp create a
  1324     a eval {
  1325 	proc p1 {} {
  1326 	    a1
  1327 	    set z
  1328 	}
  1329 	proc h1 {} {
  1330 	    upvar z z
  1331 	    set z 91
  1332 	}
  1333     }
  1334     a hide h1
  1335     a alias a1 a1
  1336     proc a1 {} {
  1337 	interp invokehidden a h1
  1338     }
  1339     set r [interp eval a p1]
  1340     interp delete a
  1341     set r
  1342 } 91
  1343 test interp-20.38 {invokehidden at global level} {
  1344     catch {interp delete a}
  1345     interp create a
  1346     a eval {
  1347 	proc p1 {} {
  1348 	    a1
  1349 	    set z
  1350 	}
  1351 	proc h1 {} {
  1352 	    upvar z z
  1353 	    set z 91
  1354 	}
  1355     }
  1356     a hide h1
  1357     a alias a1 a1
  1358     proc a1 {} {
  1359 	interp invokehidden a -global h1
  1360     }
  1361     set r [catch {interp eval a p1} msg]
  1362     interp delete a
  1363     list $r $msg
  1364 } {1 {can't read "z": no such variable}}
  1365 test interp-20.39 {invokehidden at global level} {
  1366     catch {interp delete a}
  1367     interp create a
  1368     a eval {
  1369 	proc p1 {} {
  1370 	    global z
  1371 	    a1
  1372 	    set z
  1373 	}
  1374 	proc h1 {} {
  1375 	    upvar z z
  1376 	    set z 91
  1377 	}
  1378     }
  1379     a hide h1
  1380     a alias a1 a1
  1381     proc a1 {} {
  1382 	interp invokehidden a -global h1
  1383     }
  1384     set r [catch {interp eval a p1} msg]
  1385     interp delete a
  1386     list $r $msg
  1387 } {0 91}
  1388 test interp-20.40 {safe, invokehidden at local level} {
  1389     catch {interp delete a}
  1390     interp create a -safe
  1391     a eval {
  1392 	proc p1 {} {
  1393 	    set z 90
  1394 	    a1
  1395 	    set z
  1396 	}
  1397 	proc h1 {} {
  1398 	    upvar z z
  1399 	    set z 91
  1400 	}
  1401     }
  1402     a hide h1
  1403     a alias a1 a1
  1404     proc a1 {} {
  1405 	interp invokehidden a h1
  1406     }
  1407     set r [interp eval a p1]
  1408     interp delete a
  1409     set r
  1410 } 91
  1411 test interp-20.41 {safe, invokehidden at local level} {
  1412     catch {interp delete a}
  1413     interp create a -safe
  1414     a eval {
  1415 	set z 90
  1416 	proc p1 {} {
  1417 	    global z
  1418 	    a1
  1419 	    set z
  1420 	}
  1421 	proc h1 {} {
  1422 	    upvar z z
  1423 	    set z 91
  1424 	}
  1425     }
  1426     a hide h1
  1427     a alias a1 a1
  1428     proc a1 {} {
  1429 	interp invokehidden a h1
  1430     }
  1431     set r [interp eval a p1]
  1432     interp delete a
  1433     set r
  1434 } 91
  1435 test interp-20.42 {safe, invokehidden at local level} {
  1436     catch {interp delete a}
  1437     interp create a -safe
  1438     a eval {
  1439 	proc p1 {} {
  1440 	    a1
  1441 	    set z
  1442 	}
  1443 	proc h1 {} {
  1444 	    upvar z z
  1445 	    set z 91
  1446 	}
  1447     }
  1448     a hide h1
  1449     a alias a1 a1
  1450     proc a1 {} {
  1451 	interp invokehidden a h1
  1452     }
  1453     set r [interp eval a p1]
  1454     interp delete a
  1455     set r
  1456 } 91
  1457 test interp-20.43 {invokehidden at global level} {
  1458     catch {interp delete a}
  1459     interp create a
  1460     a eval {
  1461 	proc p1 {} {
  1462 	    a1
  1463 	    set z
  1464 	}
  1465 	proc h1 {} {
  1466 	    upvar z z
  1467 	    set z 91
  1468 	}
  1469     }
  1470     a hide h1
  1471     a alias a1 a1
  1472     proc a1 {} {
  1473 	interp invokehidden a -global h1
  1474     }
  1475     set r [catch {interp eval a p1} msg]
  1476     interp delete a
  1477     list $r $msg
  1478 } {1 {can't read "z": no such variable}}
  1479 test interp-20.44 {invokehidden at global level} {
  1480     catch {interp delete a}
  1481     interp create a
  1482     a eval {
  1483 	proc p1 {} {
  1484 	    global z
  1485 	    a1
  1486 	    set z
  1487 	}
  1488 	proc h1 {} {
  1489 	    upvar z z
  1490 	    set z 91
  1491 	}
  1492     }
  1493     a hide h1
  1494     a alias a1 a1
  1495     proc a1 {} {
  1496 	interp invokehidden a -global h1
  1497     }
  1498     set r [catch {interp eval a p1} msg]
  1499     interp delete a
  1500     list $r $msg
  1501 } {0 91}
  1502 test interp-20.45 {interp hide vs namespaces} {
  1503     catch {interp delete a}
  1504     interp create a
  1505     a eval {
  1506         namespace eval foo {}
  1507 	proc foo::x {} {}
  1508     }
  1509     set l [list [catch {interp hide a foo::x} msg] $msg]
  1510     interp delete a
  1511     set l
  1512 } {1 {cannot use namespace qualifiers in hidden command token (rename)}}
  1513 test interp-20.46 {interp hide vs namespaces} {
  1514     catch {interp delete a}
  1515     interp create a
  1516     a eval {
  1517         namespace eval foo {}
  1518 	proc foo::x {} {}
  1519     }
  1520     set l [list [catch {interp hide a foo::x x} msg] $msg]
  1521     interp delete a
  1522     set l
  1523 } {1 {can only hide global namespace commands (use rename then hide)}}
  1524 test interp-20.47 {interp hide vs namespaces} {
  1525     catch {interp delete a}
  1526     interp create a
  1527     a eval {
  1528 	proc x {} {}
  1529     }
  1530     set l [list [catch {interp hide a x foo::x} msg] $msg]
  1531     interp delete a
  1532     set l
  1533 } {1 {cannot use namespace qualifiers in hidden command token (rename)}}
  1534 test interp-20.48 {interp hide vs namespaces} {
  1535     catch {interp delete a}
  1536     interp create a
  1537     a eval {
  1538         namespace eval foo {}
  1539 	proc foo::x {} {}
  1540     }
  1541     set l [list [catch {interp hide a foo::x bar::x} msg] $msg]
  1542     interp delete a
  1543     set l
  1544 } {1 {cannot use namespace qualifiers in hidden command token (rename)}}
  1545 
  1546 test interp-21.1 {interp hidden} {
  1547     interp hidden {}
  1548 } ""
  1549 test interp-21.2 {interp hidden} {
  1550     interp hidden
  1551 } ""
  1552 test interp-21.3 {interp hidden vs interp hide, interp expose} {
  1553     set l ""
  1554     lappend l [interp hidden]
  1555     interp hide {} pwd
  1556     lappend l [interp hidden]
  1557     interp expose {} pwd
  1558     lappend l [interp hidden]
  1559     set l
  1560 } {{} pwd {}}
  1561 test interp-21.4 {interp hidden} {
  1562     catch {interp delete a}
  1563     interp create a
  1564     set l [interp hidden a]
  1565     interp delete a
  1566     set l
  1567 } ""
  1568 test interp-21.5 {interp hidden} {
  1569     catch {interp delete a}
  1570     interp create -safe a
  1571     set l [lsort [interp hidden a]]
  1572     interp delete a
  1573     set l
  1574 } $hidden_cmds 
  1575 test interp-21.6 {interp hidden vs interp hide, interp expose} {
  1576     catch {interp delete a}
  1577     interp create a
  1578     set l ""
  1579     lappend l [interp hidden a]
  1580     interp hide a pwd
  1581     lappend l [interp hidden a]
  1582     interp expose a pwd
  1583     lappend l [interp hidden a]
  1584     interp delete a
  1585     set l
  1586 } {{} pwd {}}
  1587 test interp-21.7 {interp hidden} {
  1588     catch {interp delete a}
  1589     interp create a
  1590     set l [a hidden]
  1591     interp delete a
  1592     set l
  1593 } ""
  1594 test interp-21.8 {interp hidden} {
  1595     catch {interp delete a}
  1596     interp create a -safe
  1597     set l [lsort [a hidden]]
  1598     interp delete a
  1599     set l
  1600 } $hidden_cmds
  1601 test interp-21.9 {interp hidden vs interp hide, interp expose} {
  1602     catch {interp delete a}
  1603     interp create a
  1604     set l ""
  1605     lappend l [a hidden]
  1606     a hide pwd
  1607     lappend l [a hidden]
  1608     a expose pwd
  1609     lappend l [a hidden]
  1610     interp delete a
  1611     set l
  1612 } {{} pwd {}}
  1613 
  1614 test interp-22.1 {testing interp marktrusted} {
  1615     catch {interp delete a}
  1616     interp create a
  1617     set l ""
  1618     lappend l [a issafe]
  1619     lappend l [a marktrusted]
  1620     lappend l [a issafe]
  1621     interp delete a
  1622     set l
  1623 } {0 {} 0}
  1624 test interp-22.2 {testing interp marktrusted} {
  1625     catch {interp delete a}
  1626     interp create a
  1627     set l ""
  1628     lappend l [interp issafe a]
  1629     lappend l [interp marktrusted a]
  1630     lappend l [interp issafe a]
  1631     interp delete a
  1632     set l
  1633 } {0 {} 0}
  1634 test interp-22.3 {testing interp marktrusted} {
  1635     catch {interp delete a}
  1636     interp create a -safe
  1637     set l ""
  1638     lappend l [a issafe]
  1639     lappend l [a marktrusted]
  1640     lappend l [a issafe]
  1641     interp delete a
  1642     set l
  1643 } {1 {} 0}
  1644 test interp-22.4 {testing interp marktrusted} {
  1645     catch {interp delete a}
  1646     interp create a -safe
  1647     set l ""
  1648     lappend l [interp issafe a]
  1649     lappend l [interp marktrusted a]
  1650     lappend l [interp issafe a]
  1651     interp delete a
  1652     set l
  1653 } {1 {} 0}
  1654 test interp-22.5 {testing interp marktrusted} {
  1655     catch {interp delete a}
  1656     interp create a -safe
  1657     interp create {a b}
  1658     catch {a eval {interp marktrusted b}} msg
  1659     interp delete a
  1660     set msg
  1661 } {permission denied: safe interpreter cannot mark trusted}
  1662 test interp-22.6 {testing interp marktrusted} {
  1663     catch {interp delete a}
  1664     interp create a -safe
  1665     interp create {a b}
  1666     catch {a eval {b marktrusted}} msg
  1667     interp delete a
  1668     set msg
  1669 } {permission denied: safe interpreter cannot mark trusted}
  1670 test interp-22.7 {testing interp marktrusted} {
  1671     catch {interp delete a}
  1672     interp create a -safe
  1673     set l ""
  1674     lappend l [interp issafe a]
  1675     interp marktrusted a
  1676     interp create {a b}
  1677     lappend l [interp issafe a]
  1678     lappend l [interp issafe {a b}]
  1679     interp delete a
  1680     set l
  1681 } {1 0 0}
  1682 test interp-22.8 {testing interp marktrusted} {
  1683     catch {interp delete a}
  1684     interp create a -safe
  1685     set l ""
  1686     lappend l [interp issafe a]
  1687     interp create {a b}
  1688     lappend l [interp issafe {a b}]
  1689     interp marktrusted a
  1690     interp create {a c}
  1691     lappend l [interp issafe a]
  1692     lappend l [interp issafe {a c}]
  1693     interp delete a
  1694     set l
  1695 } {1 1 0 0}
  1696 test interp-22.9 {testing interp marktrusted} {
  1697     catch {interp delete a}
  1698     interp create a -safe
  1699     set l ""
  1700     lappend l [interp issafe a]
  1701     interp create {a b}
  1702     lappend l [interp issafe {a b}]
  1703     interp marktrusted {a b}
  1704     lappend l [interp issafe a]
  1705     lappend l [interp issafe {a b}]
  1706     interp create {a b c}
  1707     lappend l [interp issafe {a b c}]
  1708     interp delete a
  1709     set l
  1710 } {1 1 1 0 0}
  1711 
  1712 test interp-23.1 {testing hiding vs aliases} {
  1713     catch {interp delete a}
  1714     interp create a
  1715     set l ""
  1716     lappend l [interp hidden a]
  1717     a alias bar bar
  1718     lappend l [interp aliases a]
  1719     lappend l [interp hidden a]
  1720     a hide bar
  1721     lappend l [interp aliases a]
  1722     lappend l [interp hidden a]
  1723     a alias bar {}
  1724     lappend l [interp aliases a]
  1725     lappend l [interp hidden a]
  1726     interp delete a
  1727     set l
  1728 } {{} bar {} bar bar {} {}}
  1729 test interp-23.2 {testing hiding vs aliases} {unixOrPc} {
  1730     catch {interp delete a}
  1731     interp create a -safe
  1732     set l ""
  1733     lappend l [lsort [interp hidden a]]
  1734     a alias bar bar
  1735     lappend l [interp aliases a]
  1736     lappend l [lsort [interp hidden a]]
  1737     a hide bar
  1738     lappend l [interp aliases a]
  1739     lappend l [lsort [interp hidden a]]
  1740     a alias bar {}
  1741     lappend l [interp aliases a]
  1742     lappend l [lsort [interp hidden a]]
  1743     interp delete a
  1744     set l
  1745 } {{cd encoding exec exit fconfigure file glob load open pwd socket source} bar {cd encoding exec exit fconfigure file glob load open pwd socket source} bar {bar cd encoding exec exit fconfigure file glob load open pwd socket source} {} {cd encoding exec exit fconfigure file glob load open pwd socket source}} 
  1746 
  1747 test interp-23.3 {testing hiding vs aliases} {macOnly} {
  1748     catch {interp delete a}
  1749     interp create a -safe
  1750     set l ""
  1751     lappend l [lsort [interp hidden a]]
  1752     a alias bar bar
  1753     lappend l [interp aliases a]
  1754     lappend l [lsort [interp hidden a]]
  1755     a hide bar
  1756     lappend l [interp aliases a]
  1757     lappend l [lsort [interp hidden a]]
  1758     a alias bar {}
  1759     lappend l [interp aliases a]
  1760     lappend l [lsort [interp hidden a]]
  1761     interp delete a
  1762     set l
  1763 } {{beep cd echo encoding exit fconfigure file glob load ls open pwd socket source} bar {beep cd echo encoding exit fconfigure file glob load ls open pwd socket source} bar {bar beep cd echo encoding exit fconfigure file glob load ls open pwd socket source} {} {beep cd echo encoding exit fconfigure file glob load ls open pwd socket source}} 
  1764 
  1765 test interp-24.1 {result resetting on error} {
  1766     catch {interp delete a}
  1767     interp create a
  1768     proc foo args {error $args}
  1769     interp alias a foo {} foo
  1770     set l [interp eval a {
  1771 	set l {}
  1772 	lappend l [catch {foo 1 2 3} msg]
  1773 	lappend l $msg
  1774 	lappend l [catch {foo 3 4 5} msg]
  1775 	lappend l $msg
  1776 	set l
  1777     }]
  1778     interp delete a
  1779     set l
  1780 } {1 {1 2 3} 1 {3 4 5}}
  1781 test interp-24.2 {result resetting on error} {
  1782     catch {interp delete a}
  1783     interp create a -safe
  1784     proc foo args {error $args}
  1785     interp alias a foo {} foo
  1786     set l [interp eval a {
  1787 	set l {}
  1788 	lappend l [catch {foo 1 2 3} msg]
  1789 	lappend l $msg
  1790 	lappend l [catch {foo 3 4 5} msg]
  1791 	lappend l $msg
  1792 	set l
  1793     }]
  1794     interp delete a
  1795     set l
  1796 } {1 {1 2 3} 1 {3 4 5}}
  1797 test interp-24.3 {result resetting on error} {
  1798     catch {interp delete a}
  1799     interp create a
  1800     interp create {a b}
  1801     interp eval a {
  1802 	proc foo args {error $args}
  1803     }
  1804     interp alias {a b} foo a foo
  1805     set l [interp eval {a b} {
  1806 	set l {}
  1807 	lappend l [catch {foo 1 2 3} msg]
  1808 	lappend l $msg
  1809 	lappend l [catch {foo 3 4 5} msg]
  1810 	lappend l $msg
  1811 	set l
  1812     }]
  1813     interp delete a
  1814     set l
  1815 } {1 {1 2 3} 1 {3 4 5}}
  1816 test interp-24.4 {result resetting on error} {
  1817     catch {interp delete a}
  1818     interp create a -safe
  1819     interp create {a b}
  1820     interp eval a {
  1821 	proc foo args {error $args}
  1822     }
  1823     interp alias {a b} foo a foo
  1824     set l [interp eval {a b} {
  1825 	set l {}
  1826 	lappend l [catch {foo 1 2 3} msg]
  1827 	lappend l $msg
  1828 	lappend l [catch {foo 3 4 5} msg]
  1829 	lappend l $msg
  1830 	set l
  1831     }]
  1832     interp delete a
  1833     set l
  1834 } {1 {1 2 3} 1 {3 4 5}}
  1835 test interp-24.5 {result resetting on error} {
  1836     catch {interp delete a}
  1837     catch {interp delete b}
  1838     interp create a
  1839     interp create b
  1840     interp eval a {
  1841 	proc foo args {error $args}
  1842     }
  1843     interp alias b foo a foo
  1844     set l [interp eval b {
  1845 	set l {}
  1846 	lappend l [catch {foo 1 2 3} msg]
  1847 	lappend l $msg
  1848 	lappend l [catch {foo 3 4 5} msg]
  1849 	lappend l $msg
  1850 	set l
  1851     }]
  1852     interp delete a
  1853     set l
  1854 } {1 {1 2 3} 1 {3 4 5}}
  1855 test interp-24.6 {result resetting on error} {
  1856     catch {interp delete a}
  1857     catch {interp delete b}
  1858     interp create a -safe
  1859     interp create b -safe
  1860     interp eval a {
  1861 	proc foo args {error $args}
  1862     }
  1863     interp alias b foo a foo
  1864     set l [interp eval b {
  1865 	set l {}
  1866 	lappend l [catch {foo 1 2 3} msg]
  1867 	lappend l $msg
  1868 	lappend l [catch {foo 3 4 5} msg]
  1869 	lappend l $msg
  1870 	set l
  1871     }]
  1872     interp delete a
  1873     set l
  1874 } {1 {1 2 3} 1 {3 4 5}}
  1875 test interp-24.7 {result resetting on error} {
  1876     catch {interp delete a}
  1877     interp create a
  1878     interp eval a {
  1879 	proc foo args {error $args}
  1880     }
  1881     set l {}
  1882     lappend l [catch {interp eval a foo 1 2 3} msg]
  1883     lappend l $msg
  1884     lappend l [catch {interp eval a foo 3 4 5} msg]
  1885     lappend l $msg
  1886     interp delete a
  1887     set l
  1888 } {1 {1 2 3} 1 {3 4 5}}
  1889 test interp-24.8 {result resetting on error} {
  1890     catch {interp delete a}
  1891     interp create a -safe
  1892     interp eval a {
  1893 	proc foo args {error $args}
  1894     }
  1895     set l {}
  1896     lappend l [catch {interp eval a foo 1 2 3} msg]
  1897     lappend l $msg
  1898     lappend l [catch {interp eval a foo 3 4 5} msg]
  1899     lappend l $msg
  1900     interp delete a
  1901     set l
  1902 } {1 {1 2 3} 1 {3 4 5}}
  1903 test interp-24.9 {result resetting on error} {
  1904     catch {interp delete a}
  1905     interp create a
  1906     interp create {a b}
  1907     interp eval {a b} {
  1908 	proc foo args {error $args}
  1909     }
  1910     interp eval a {
  1911 	proc foo args {
  1912 	    eval interp eval b foo $args
  1913 	}
  1914     }
  1915     set l {}
  1916     lappend l [catch {interp eval a foo 1 2 3} msg]
  1917     lappend l $msg
  1918     lappend l [catch {interp eval a foo 3 4 5} msg]
  1919     lappend l $msg
  1920     interp delete a
  1921     set l
  1922 } {1 {1 2 3} 1 {3 4 5}}
  1923 test interp-24.10 {result resetting on error} {
  1924     catch {interp delete a}
  1925     interp create a -safe
  1926     interp create {a b}
  1927     interp eval {a b} {
  1928 	proc foo args {error $args}
  1929     }
  1930     interp eval a {
  1931 	proc foo args {
  1932 	    eval interp eval b foo $args
  1933 	}
  1934     }
  1935     set l {}
  1936     lappend l [catch {interp eval a foo 1 2 3} msg]
  1937     lappend l $msg
  1938     lappend l [catch {interp eval a foo 3 4 5} msg]
  1939     lappend l $msg
  1940     interp delete a
  1941     set l
  1942 } {1 {1 2 3} 1 {3 4 5}}
  1943 test interp-24.11 {result resetting on error} {
  1944     catch {interp delete a}
  1945     interp create a
  1946     interp create {a b}
  1947     interp eval {a b} {
  1948 	proc foo args {error $args}
  1949     }
  1950     interp eval a {
  1951 	proc foo args {
  1952 	    set l {}
  1953 	    lappend l [catch {eval interp eval b foo $args} msg]
  1954 	    lappend l $msg
  1955 	    lappend l [catch {eval interp eval b foo $args} msg]
  1956 	    lappend l $msg
  1957 	    set l
  1958 	}
  1959     }
  1960     set l [interp eval a foo 1 2 3]
  1961     interp delete a
  1962     set l
  1963 } {1 {1 2 3} 1 {1 2 3}}
  1964 test interp-24.12 {result resetting on error} {
  1965     catch {interp delete a}
  1966     interp create a -safe
  1967     interp create {a b}
  1968     interp eval {a b} {
  1969 	proc foo args {error $args}
  1970     }
  1971     interp eval a {
  1972 	proc foo args {
  1973 	    set l {}
  1974 	    lappend l [catch {eval interp eval b foo $args} msg]
  1975 	    lappend l $msg
  1976 	    lappend l [catch {eval interp eval b foo $args} msg]
  1977 	    lappend l $msg
  1978 	    set l
  1979 	}
  1980     }
  1981     set l [interp eval a foo 1 2 3]
  1982     interp delete a
  1983     set l
  1984 } {1 {1 2 3} 1 {1 2 3}}
  1985 
  1986 unset hidden_cmds
  1987 
  1988 test interp-25.1 {testing aliasing of string commands} {
  1989     catch {interp delete a}
  1990     interp create a
  1991     a alias exec foo		;# Relies on exec being a string command!
  1992     interp delete a
  1993 } ""
  1994 
  1995 
  1996 #
  1997 # Interps result transmission
  1998 #
  1999 
  2000 test interp-26.1 {result code transmission : interp eval direct} {
  2001     # Test that all the possibles error codes from Tcl get passed up
  2002     # from the slave interp's context to the master, even though the
  2003     # slave nominally thinks the command is running at the root level.
  2004     
  2005     catch {interp delete a}
  2006     interp create a
  2007     set res {}
  2008     # use a for so if a return -code break 'escapes' we would notice
  2009     for {set code -1} {$code<=5} {incr code} {
  2010 	lappend res [catch {interp eval a return -code $code} msg]
  2011     }
  2012     interp delete a
  2013     set res
  2014 } {-1 0 1 2 3 4 5}
  2015 
  2016 
  2017 test interp-26.2 {result code transmission : interp eval indirect} {
  2018     # retcode == 2 == return is special
  2019     catch {interp delete a}
  2020     interp create a
  2021     interp eval a {proc retcode {code} {return -code $code ret$code}}
  2022     set res {}
  2023     # use a for so if a return -code break 'escapes' we would notice
  2024     for {set code -1} {$code<=5} {incr code} {
  2025 	lappend res [catch {interp eval a retcode $code} msg] $msg
  2026     }
  2027     interp delete a
  2028     set res
  2029 } {-1 ret-1 0 ret0 1 ret1 0 ret2 3 ret3 4 ret4 5 ret5}
  2030 
  2031 test interp-26.3 {result code transmission : aliases} {
  2032     # Test that all the possibles error codes from Tcl get passed up
  2033     # from the slave interp's context to the master, even though the
  2034     # slave nominally thinks the command is running at the root level.
  2035     
  2036     catch {interp delete a}
  2037     interp create a
  2038     set res {}
  2039     proc MyTestAlias {code} {
  2040 	return -code $code ret$code
  2041     }
  2042     interp alias a Test {} MyTestAlias
  2043     for {set code -1} {$code<=5} {incr code} {
  2044 	lappend res [interp eval a [list catch [list Test $code] msg]]
  2045     }
  2046     interp delete a
  2047     set res
  2048 } {-1 0 1 2 3 4 5}
  2049 
  2050 test interp-26.4 {result code transmission: invoke hidden direct--bug 1637} \
  2051 	{knownBug} {
  2052     # The known bug is that code 2 is returned, not the -code argument
  2053     catch {interp delete a}
  2054     interp create a
  2055     set res {}
  2056     interp hide a return
  2057     for {set code -1} {$code<=5} {incr code} {
  2058 	lappend res [catch {interp invokehidden a return -code $code ret$code}]
  2059     }
  2060     interp delete a
  2061     set res
  2062 } {-1 0 1 2 3 4 5}
  2063 
  2064 test interp-26.5 {result code transmission: invoke hidden indirect--bug 1637} \
  2065 	{knownBug} {
  2066     # The known bug is that the break and continue should raise errors
  2067     # that they are used outside a loop.
  2068     catch {interp delete a}
  2069     interp create a
  2070     set res {}
  2071     interp eval a {proc retcode {code} {return -code $code ret$code}}
  2072     interp hide a retcode
  2073     for {set code -1} {$code<=5} {incr code} {
  2074 	lappend res [catch {interp invokehidden a retcode $code} msg] $msg
  2075     }
  2076     interp delete a
  2077     set res
  2078 } {-1 ret-1 0 ret0 1 ret1 0 ret2 3 ret3 4 ret4 5 ret5}
  2079 
  2080 test interp-26.6 {result code transmission: all combined--bug 1637} \
  2081 	{knownBug} {
  2082     # Test that all the possibles error codes from Tcl get passed
  2083     # In both directions.  This doesn't work.
  2084     set interp [interp create];
  2085     proc MyTestAlias {interp args} {
  2086 	global aliasTrace;
  2087 	lappend aliasTrace $args;
  2088 	eval interp invokehidden [list $interp] $args
  2089     }
  2090     foreach c {return} {
  2091 	interp hide $interp  $c;
  2092         interp alias $interp $c {} MyTestAlias $interp $c;
  2093     }
  2094     interp eval $interp {proc ret {code} {return -code $code ret$code}}
  2095     set res {}
  2096     set aliasTrace {}
  2097     for {set code -1} {$code<=5} {incr code} {
  2098 	lappend res [catch {interp eval $interp ret $code} msg] $msg
  2099     }
  2100     interp delete $interp;
  2101     set res
  2102 } {-1 ret-1 0 ret0 1 ret1 0 ret2 3 ret3 4 ret4 5 ret5}
  2103 
  2104 # Some tests might need to be added to check for difference between
  2105 # toplevel and non toplevel evals.
  2106 
  2107 # End of return code transmission section
  2108 
  2109 test interp-26.7 {errorInfo transmission: regular interps} {
  2110     set interp [interp create];
  2111     proc MyError {secret} {
  2112 	return -code error "msg"
  2113     }
  2114     proc MyTestAlias {interp args} {
  2115 	MyError "some secret"
  2116     }
  2117     interp alias $interp test {} MyTestAlias $interp;
  2118     set res [interp eval $interp {catch test;set errorInfo}]
  2119     interp delete $interp;
  2120     set res
  2121 } {msg
  2122     while executing
  2123 "MyError "some secret""
  2124     (procedure "MyTestAlias" line 2)
  2125     invoked from within
  2126 "test"}
  2127 
  2128 test interp-26.8 {errorInfo transmission: safe interps--bug 1637} {knownBug} {
  2129     # this test fails because the errorInfo is fully transmitted
  2130     # whether the interp is safe or not.  The errorInfo should never
  2131     # report data from the master interpreter because it could
  2132     # contain sensitive information.
  2133     set interp [interp create -safe];
  2134     proc MyError {secret} {
  2135 	return -code error "msg"
  2136     }
  2137     proc MyTestAlias {interp args} {
  2138 	MyError "some secret"
  2139     }
  2140     interp alias $interp test {} MyTestAlias $interp;
  2141     set res [interp eval $interp {catch test;set errorInfo}]
  2142     interp delete $interp;
  2143     set res
  2144 } {msg
  2145     while executing
  2146 "test"}
  2147 
  2148 # Interps & Namespaces
  2149 test interp-27.1 {interp aliases & namespaces} {
  2150     set i [interp create];
  2151     set aliasTrace {};
  2152     proc tstAlias {args} { 
  2153 	global aliasTrace;
  2154 	lappend aliasTrace [list [namespace current] $args];
  2155     }
  2156     $i alias foo::bar tstAlias foo::bar;
  2157     $i eval foo::bar test
  2158     interp delete $i
  2159     set aliasTrace;
  2160 } {{:: {foo::bar test}}}
  2161 
  2162 test interp-27.2 {interp aliases & namespaces} {
  2163     set i [interp create];
  2164     set aliasTrace {};
  2165     proc tstAlias {args} { 
  2166 	global aliasTrace;
  2167 	lappend aliasTrace [list [namespace current] $args];
  2168     }
  2169     $i alias foo::bar tstAlias foo::bar;
  2170     $i eval namespace eval foo {bar test}
  2171     interp delete $i
  2172     set aliasTrace;
  2173 } {{:: {foo::bar test}}}
  2174 
  2175 test interp-27.3 {interp aliases & namespaces} {
  2176     set i [interp create];
  2177     set aliasTrace {};
  2178     proc tstAlias {args} { 
  2179 	global aliasTrace;
  2180 	lappend aliasTrace [list [namespace current] $args];
  2181     }
  2182     interp eval $i {namespace eval foo {proc bar {} {error "bar called"}}}
  2183     interp alias $i foo::bar {} tstAlias foo::bar;
  2184     interp eval $i {namespace eval foo {bar test}}
  2185     interp delete $i
  2186     set aliasTrace;
  2187 } {{:: {foo::bar test}}}
  2188 
  2189 test interp-27.4 {interp aliases & namespaces} {
  2190     set i [interp create];
  2191     namespace eval foo2 {
  2192 	variable aliasTrace {};
  2193 	proc bar {args} { 
  2194 	    variable aliasTrace;
  2195 	    lappend aliasTrace [list [namespace current] $args];
  2196 	}
  2197     }
  2198     $i alias foo::bar foo2::bar foo::bar;
  2199     $i eval namespace eval foo {bar test}
  2200     set r $foo2::aliasTrace;
  2201     namespace delete foo2;
  2202     set r
  2203 } {{::foo2 {foo::bar test}}}
  2204 
  2205 # the following tests are commented out while we don't support
  2206 # hiding in namespaces
  2207 
  2208 # test interp-27.5 {interp hidden & namespaces} {
  2209 #    set i [interp create];
  2210 #    interp eval $i {
  2211 #        namespace eval foo {
  2212 #	    proc bar {args} {
  2213 #		return "bar called ([namespace current]) ($args)"
  2214 #	    }
  2215 #	}
  2216 #    }
  2217 #    set res [list [interp eval $i {namespace eval foo {bar test1}}]]
  2218 #    interp hide $i foo::bar;
  2219 #    lappend res [list [catch {interp eval $i {namespace eval foo {bar test2}}} msg] $msg]
  2220 #    interp delete $i;
  2221 #    set res;
  2222 #} {{bar called (::foo) (test1)} {1 {invalid command name "bar"}}}
  2223 
  2224 # test interp-27.6 {interp hidden & aliases & namespaces} {
  2225 #     set i [interp create];
  2226 #     set v root-master;
  2227 #     namespace eval foo {
  2228 # 	variable v foo-master;
  2229 # 	proc bar {interp args} {
  2230 # 	    variable v;
  2231 # 	    list "master bar called ($v) ([namespace current]) ($args)"\
  2232 # 		    [interp invokehidden $interp foo::bar $args];
  2233 # 	}
  2234 #     }
  2235 #     interp eval $i {
  2236 #        namespace eval foo {
  2237 # 	    namespace export *
  2238 # 	    variable v foo-slave;
  2239 # 	    proc bar {args} {
  2240 # 		variable v;
  2241 # 		return "slave bar called ($v) ([namespace current]) ($args)"
  2242 # 	    }
  2243 # 	}
  2244 #     }
  2245 #     set res [list [interp eval $i {namespace eval foo {bar test1}}]]
  2246 #     $i hide foo::bar;
  2247 #     $i alias foo::bar foo::bar $i;
  2248 #     set res [concat $res [interp eval $i {
  2249 # 	set v root-slave;
  2250 #         namespace eval test {
  2251 # 	    variable v foo-test;
  2252 # 	    namespace import ::foo::*;
  2253 # 	    bar test2
  2254 #         }
  2255 #     }]]
  2256 #     namespace delete foo;
  2257 #     interp delete $i;
  2258 #     set res
  2259 # } {{slave bar called (foo-slave) (::foo) (test1)} {master bar called (foo-master) (::foo) (test2)} {slave bar called (foo-slave) (::foo) (test2)}}
  2260 
  2261 
  2262 # test interp-27.7 {interp hidden & aliases & imports & namespaces} {
  2263 #     set i [interp create];
  2264 #     set v root-master;
  2265 #     namespace eval mfoo {
  2266 # 	variable v foo-master;
  2267 # 	proc bar {interp args} {
  2268 # 	    variable v;
  2269 # 	    list "master bar called ($v) ([namespace current]) ($args)"\
  2270 # 		    [interp invokehidden $interp test::bar $args];
  2271 # 	}
  2272 #     }
  2273 #     interp eval $i {
  2274 #       namespace eval foo {
  2275 # 	    namespace export *
  2276 # 	    variable v foo-slave;
  2277 # 	    proc bar {args} {
  2278 # 		variable v;
  2279 # 		return "slave bar called ($v) ([info level 0]) ([uplevel namespace current]) ([namespace current]) ($args)"
  2280 # 	    }
  2281 # 	}
  2282 # 	set v root-slave;
  2283 #       namespace eval test {
  2284 # 	    variable v foo-test;
  2285 # 	    namespace import ::foo::*;
  2286 #         }
  2287 #     }
  2288 #     set res [list [interp eval $i {namespace eval test {bar test1}}]]
  2289 #     $i hide test::bar;
  2290 #     $i alias test::bar mfoo::bar $i;
  2291 #     set res [concat $res [interp eval $i {test::bar test2}]];
  2292 #     namespace delete mfoo;
  2293 #     interp delete $i;
  2294 #     set res
  2295 # } {{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)}}
  2296 
  2297 #test interp-27.8 {hiding, namespaces and integrity} {
  2298 #    namespace eval foo {
  2299 #	variable v 3;
  2300 #	proc bar {} {variable v; set v}
  2301 #	# next command would currently generate an unknown command "bar" error.
  2302 #	interp hide {} bar;
  2303 #    }
  2304 #    namespace delete foo;
  2305 #    list [catch {interp invokehidden {} foo} msg] $msg;
  2306 #} {1 {invalid hidden command name "foo"}}
  2307 
  2308 
  2309 test interp-28.1 {getting fooled by slave's namespace ?} {
  2310     set i [interp create -safe];
  2311     proc master {interp args} {interp hide $interp list}
  2312     $i alias master master $i;
  2313     set r [interp eval $i {
  2314         namespace eval foo {
  2315 	    proc list {args} {
  2316 		return "dummy foo::list";
  2317 	    }
  2318 	    master;
  2319 	}
  2320 	info commands list
  2321     }]
  2322     interp delete $i;
  2323     set r
  2324 } {}
  2325 
  2326 # Part 29: recursion limit
  2327 #  29.1.*  Argument checking
  2328 #  29.2.*  Reading and setting the recursion limit
  2329 #  29.3.*  Does the recursion limit work?
  2330 #  29.4.*  Recursion limit inheritance by sub-interpreters
  2331 #  29.5.*  Confirming the recursionlimit command does not affect the parent
  2332 #  29.6.*  Safe interpreter restriction
  2333 
  2334 test interp-29.1.1 {interp recursionlimit argument checking} {
  2335     list [catch {interp recursionlimit} msg] $msg
  2336 } {1 {wrong # args: should be "interp recursionlimit path ?newlimit?"}}
  2337 
  2338 test interp-29.1.2 {interp recursionlimit argument checking} {
  2339     list [catch {interp recursionlimit foo bar} msg] $msg
  2340 } {1 {could not find interpreter "foo"}}
  2341 
  2342 test interp-29.1.3 {interp recursionlimit argument checking} {
  2343     list [catch {interp recursionlimit foo bar baz} msg] $msg
  2344 } {1 {wrong # args: should be "interp recursionlimit path ?newlimit?"}}
  2345 
  2346 test interp-29.1.4 {interp recursionlimit argument checking} {
  2347     interp create moo
  2348     set result [catch {interp recursionlimit moo bar} msg]
  2349     interp delete moo
  2350     list $result $msg
  2351 } {1 {expected integer but got "bar"}}
  2352 
  2353 test interp-29.1.5 {interp recursionlimit argument checking} {
  2354     interp create moo
  2355     set result [catch {interp recursionlimit moo 0} msg]
  2356     interp delete moo
  2357     list $result $msg
  2358 } {1 {recursion limit must be > 0}}
  2359 
  2360 test interp-29.1.6 {interp recursionlimit argument checking} {
  2361     interp create moo
  2362     set result [catch {interp recursionlimit moo -1} msg]
  2363     interp delete moo
  2364     list $result $msg
  2365 } {1 {recursion limit must be > 0}}
  2366 
  2367 test interp-29.1.7 {interp recursionlimit argument checking} {
  2368     interp create moo
  2369     set result [catch {interp recursionlimit moo [expr {wide(1)<<32}]} msg]
  2370     interp delete moo
  2371     list $result [string range $msg 0 35]
  2372 } {1 {integer value too large to represent}}
  2373 
  2374 test interp-29.1.8 {slave recursionlimit argument checking} {
  2375     interp create moo
  2376     set result [catch {moo recursionlimit foo bar} msg]
  2377     interp delete moo
  2378     list $result $msg
  2379 } {1 {wrong # args: should be "moo recursionlimit ?newlimit?"}}
  2380 
  2381 test interp-29.1.9 {slave recursionlimit argument checking} {
  2382     interp create moo
  2383     set result [catch {moo recursionlimit foo} msg]
  2384     interp delete moo
  2385     list $result $msg
  2386 } {1 {expected integer but got "foo"}}
  2387 
  2388 test interp-29.1.10 {slave recursionlimit argument checking} {
  2389     interp create moo
  2390     set result [catch {moo recursionlimit 0} msg]
  2391     interp delete moo
  2392     list $result $msg
  2393 } {1 {recursion limit must be > 0}}
  2394 
  2395 test interp-29.1.11 {slave recursionlimit argument checking} {
  2396     interp create moo
  2397     set result [catch {moo recursionlimit -1} msg]
  2398     interp delete moo
  2399     list $result $msg
  2400 } {1 {recursion limit must be > 0}}
  2401 
  2402 test interp-29.1.12 {slave recursionlimit argument checking} {
  2403     interp create moo
  2404     set result [catch {moo recursionlimit [expr {wide(1)<<32}]} msg]
  2405     interp delete moo
  2406     list $result [string range $msg 0 35]
  2407 } {1 {integer value too large to represent}}
  2408 
  2409 test interp-29.2.1 {query recursion limit} {
  2410     interp recursionlimit {}
  2411 } 1000
  2412 
  2413 test interp-29.2.2 {query recursion limit} {
  2414     set i [interp create]
  2415     set n [interp recursionlimit $i]
  2416     interp delete $i
  2417     set n
  2418 } 1000
  2419 
  2420 test interp-29.2.3 {query recursion limit} {
  2421     set i [interp create]
  2422     set n [$i recursionlimit]
  2423     interp delete $i
  2424     set n
  2425 } 1000
  2426 
  2427 test interp-29.2.4 {query recursion limit} {
  2428     set i [interp create]
  2429     set r [$i eval {
  2430 	set n1 [interp recursionlimit {} 42]
  2431 	set n2 [interp recursionlimit {}]
  2432 	list $n1 $n2
  2433     }]
  2434     interp delete $i
  2435     set r
  2436 } {42 42}
  2437 
  2438 test interp-29.2.5 {query recursion limit} {
  2439     set i [interp create]
  2440     set n1 [interp recursionlimit $i 42]
  2441     set n2 [interp recursionlimit $i]
  2442     interp delete $i
  2443     list $n1 $n2
  2444 } {42 42}
  2445 
  2446 test interp-29.2.6 {query recursion limit} {
  2447     set i [interp create]
  2448     set n1 [interp recursionlimit $i 42]
  2449     set n2 [$i recursionlimit]
  2450     interp delete $i
  2451     list $n1 $n2
  2452 } {42 42}
  2453 
  2454 test interp-29.2.7 {query recursion limit} {
  2455     set i [interp create]
  2456     set n1 [$i recursionlimit 42]
  2457     set n2 [interp recursionlimit $i]
  2458     interp delete $i
  2459     list $n1 $n2
  2460 } {42 42}
  2461 
  2462 test interp-29.2.8 {query recursion limit} {
  2463     set i [interp create]
  2464     set n1 [$i recursionlimit 42]
  2465     set n2 [$i recursionlimit]
  2466     interp delete $i
  2467     list $n1 $n2
  2468 } {42 42}
  2469 
  2470 test interp-29.3.1 {recursion limit} {
  2471     set i [interp create]
  2472     set r [interp eval $i {
  2473 	interp recursionlimit {} 50
  2474 	proc p {} {incr ::i; p}
  2475 	set i 0
  2476 	list [catch p msg] $msg $i
  2477     }]
  2478     interp delete $i
  2479     set r
  2480 } {1 {too many nested evaluations (infinite loop?)} 48}
  2481 
  2482 test interp-29.3.2 {recursion limit} {
  2483     set i [interp create]
  2484     interp recursionlimit $i 50
  2485     set r [interp eval $i {
  2486 	proc p {} {incr ::i; p}
  2487 	set i 0
  2488 	list [catch p msg] $msg $i
  2489     }]
  2490    interp delete $i
  2491    set r
  2492 } {1 {too many nested evaluations (infinite loop?)} 48}
  2493 
  2494 test interp-29.3.3 {recursion limit} {
  2495     set i [interp create]
  2496     $i recursionlimit 50
  2497     set r [interp eval $i {
  2498 	proc p {} {incr ::i; p}
  2499 	set i 0
  2500 	list [catch p msg] $msg $i
  2501     }]
  2502    interp delete $i
  2503    set r
  2504 } {1 {too many nested evaluations (infinite loop?)} 48}
  2505 
  2506 test interp-29.3.4 {recursion limit error reporting} {
  2507     interp create slave
  2508     set r1 [slave eval {
  2509         catch { 		# nesting level 1
  2510 	    eval {		# 2
  2511 	        eval {		# 3
  2512 		    eval {	# 4
  2513 		        eval {	# 5
  2514 			     interp recursionlimit {} 5
  2515 			     set x ok
  2516 			}
  2517 		    }
  2518 		}
  2519 	    }
  2520 	} msg
  2521     }]
  2522     set r2 [slave eval { set msg }]
  2523     interp delete slave
  2524     list $r1 $r2
  2525 } {1 {falling back due to new recursion limit}}
  2526 
  2527 test interp-29.3.5 {recursion limit error reporting} {
  2528     interp create slave
  2529     set r1 [slave eval {
  2530         catch {			# nesting level 1
  2531 	    eval {		# 2
  2532 	        eval {		# 3
  2533 		    eval {	# 4
  2534 		        eval {	# 5
  2535 			    interp recursionlimit {} 4
  2536 			    set x ok
  2537 			}
  2538 		    }
  2539 		}
  2540 	    }
  2541 	} msg
  2542     }]
  2543     set r2 [slave eval { set msg }]
  2544     interp delete slave
  2545     list $r1 $r2
  2546 } {1 {falling back due to new recursion limit}}
  2547 
  2548 test interp-29.3.6 {recursion limit error reporting} {
  2549     interp create slave
  2550     set r1 [slave eval {
  2551         catch {			# nesting level 1
  2552 	    eval {		# 2
  2553 	        eval {		# 3
  2554 		    eval {	# 4
  2555 		        eval {	# 5
  2556 			    interp recursionlimit {} 6
  2557 			    set x ok
  2558 			}
  2559 		    }
  2560 		}
  2561 	    }
  2562 	} msg
  2563     }]
  2564     set r2 [slave eval { set msg }]
  2565     interp delete slave
  2566     list $r1 $r2
  2567 } {0 ok}
  2568 
  2569 test interp-29.3.7 {recursion limit error reporting} {
  2570     interp create slave
  2571     after 0 {interp recursionlimit slave 5}
  2572     set r1 [slave eval {
  2573         catch { 		# nesting level 1
  2574 	    eval {		# 2
  2575 	        eval {		# 3
  2576 		    eval {	# 4
  2577 		        eval {	# 5
  2578 			     update
  2579 			     set x ok
  2580 			}
  2581 		    }
  2582 		}
  2583 	    }
  2584 	} msg
  2585     }]
  2586     set r2 [slave eval { set msg }]
  2587     interp delete slave
  2588     list $r1 $r2
  2589 } {1 {too many nested evaluations (infinite loop?)}}
  2590 
  2591 test interp-29.3.8 {recursion limit error reporting} {
  2592     interp create slave
  2593     after 0 {interp recursionlimit slave 4}
  2594     set r1 [slave eval {
  2595         catch { 		# nesting level 1
  2596 	    eval {		# 2
  2597 	        eval {		# 3
  2598 		    eval {	# 4
  2599 		        eval {	# 5
  2600 			     update
  2601 			     set x ok
  2602 			}
  2603 		    }
  2604 		}
  2605 	    }
  2606 	} msg
  2607     }]
  2608     set r2 [slave eval { set msg }]
  2609     interp delete slave
  2610     list $r1 $r2
  2611 } {1 {too many nested evaluations (infinite loop?)}}
  2612 
  2613 test interp-29.3.9 {recursion limit error reporting} {
  2614     interp create slave
  2615     after 0 {interp recursionlimit slave 6}
  2616     set r1 [slave eval {
  2617         catch { 		# nesting level 1
  2618 	    eval {		# 2
  2619 	        eval {		# 3
  2620 		    eval {	# 4
  2621 		        eval {	# 5
  2622 			     update
  2623 			     set x ok
  2624 			}
  2625 		    }
  2626 		}
  2627 	    }
  2628 	} msg
  2629     }]
  2630     set r2 [slave eval { set msg }]
  2631     interp delete slave
  2632     list $r1 $r2
  2633 } {0 ok}
  2634 
  2635 test interp-29.3.10 {recursion limit error reporting} {
  2636     interp create slave
  2637     after 0 {slave recursionlimit 4}
  2638     set r1 [slave eval {
  2639         catch { 		# nesting level 1
  2640 	    eval {		# 2
  2641 	        eval {		# 3
  2642 		    eval {	# 4
  2643 		        eval {	# 5
  2644 			     update
  2645 			     set x ok
  2646 			}
  2647 		    }
  2648 		}
  2649 	    }
  2650 	} msg
  2651     }]
  2652     set r2 [slave eval { set msg }]
  2653     interp delete slave
  2654     list $r1 $r2
  2655 } {1 {too many nested evaluations (infinite loop?)}}
  2656 
  2657 test interp-29.3.11 {recursion limit error reporting} {
  2658     interp create slave
  2659     after 0 {slave recursionlimit 5}
  2660     set r1 [slave eval {
  2661         catch { 		# nesting level 1
  2662 	    eval {		# 2
  2663 	        eval {		# 3
  2664 		    eval {	# 4
  2665 		        eval {	# 5
  2666 			     update
  2667 			     set x ok
  2668 			}
  2669 		    }
  2670 		}
  2671 	    }
  2672 	} msg
  2673     }]
  2674     set r2 [slave eval { set msg }]
  2675     interp delete slave
  2676     list $r1 $r2
  2677 } {1 {too many nested evaluations (infinite loop?)}}
  2678 
  2679 test interp-29.3.12 {recursion limit error reporting} {
  2680     interp create slave
  2681     after 0 {slave recursionlimit 6}
  2682     set r1 [slave eval {
  2683         catch { 		# nesting level 1
  2684 	    eval {		# 2
  2685 	        eval {		# 3
  2686 		    eval {	# 4
  2687 		        eval {	# 5
  2688 			     update
  2689 			     set x ok
  2690 			}
  2691 		    }
  2692 		}
  2693 	    }
  2694 	} msg
  2695     }]
  2696     set r2 [slave eval { set msg }]
  2697     interp delete slave
  2698     list $r1 $r2
  2699 } {0 ok}
  2700 
  2701 test interp-29.4.1 {recursion limit inheritance} {
  2702     set i [interp create]
  2703     set ii [interp eval $i {
  2704 	interp recursionlimit {} 50
  2705 	interp create
  2706     }]
  2707     set r [interp eval [list $i $ii] {
  2708 	proc p {} {incr ::i; p}
  2709 	set i 0
  2710 	catch p
  2711 	set i
  2712     }]
  2713    interp delete $i
  2714    set r
  2715 } 49
  2716 
  2717 test interp-29.4.2 {recursion limit inheritance} {
  2718     set i [interp create]
  2719     $i recursionlimit 50
  2720     set ii [interp eval $i {interp create}]
  2721     set r [interp eval [list $i $ii] {
  2722 	proc p {} {incr ::i; p}
  2723 	set i 0
  2724 	catch p
  2725 	set i
  2726     }]
  2727    interp delete $i
  2728    set r
  2729 } 49
  2730 
  2731 test interp-29.5.1 {does slave recursion limit affect master?} {
  2732     set before [interp recursionlimit {}]
  2733     set i [interp create]
  2734     interp recursionlimit $i 20000
  2735     set after [interp recursionlimit {}]
  2736     set slavelimit [interp recursionlimit $i]
  2737     interp delete $i
  2738     list [expr {$before == $after}] $slavelimit
  2739 } {1 20000}
  2740 
  2741 test interp-29.5.2 {does slave recursion limit affect master?} {
  2742     set before [interp recursionlimit {}]
  2743     set i [interp create]
  2744     interp recursionlimit $i 20000
  2745     set after [interp recursionlimit {}]
  2746     set slavelimit [$i recursionlimit]
  2747     interp delete $i
  2748     list [expr {$before == $after}] $slavelimit
  2749 } {1 20000}
  2750 
  2751 test interp-29.5.3 {does slave recursion limit affect master?} {
  2752     set before [interp recursionlimit {}]
  2753     set i [interp create]
  2754     $i recursionlimit 20000
  2755     set after [interp recursionlimit {}]
  2756     set slavelimit [interp recursionlimit $i]
  2757     interp delete $i
  2758     list [expr {$before == $after}] $slavelimit
  2759 } {1 20000}
  2760 
  2761 test interp-29.5.4 {does slave recursion limit affect master?} {
  2762     set before [interp recursionlimit {}]
  2763     set i [interp create]
  2764     $i recursionlimit 20000
  2765     set after [interp recursionlimit {}]
  2766     set slavelimit [$i recursionlimit]
  2767     interp delete $i
  2768     list [expr {$before == $after}] $slavelimit
  2769 } {1 20000}
  2770 
  2771 test interp-29.6.1 {safe interpreter recursion limit} {
  2772     interp create slave -safe
  2773     set n [interp recursionlimit slave]
  2774     interp delete slave
  2775     set n
  2776 } 1000
  2777 
  2778 test interp-29.6.2 {safe interpreter recursion limit} {
  2779     interp create slave -safe
  2780     set n [slave recursionlimit]
  2781     interp delete slave
  2782     set n
  2783 } 1000
  2784 
  2785 test interp-29.6.3 {safe interpreter recursion limit} {
  2786     interp create slave -safe
  2787     set n1 [interp recursionlimit slave 42]
  2788     set n2 [interp recursionlimit slave]
  2789     interp delete slave
  2790     list $n1 $n2
  2791 } {42 42}
  2792 
  2793 test interp-29.6.4 {safe interpreter recursion limit} {
  2794     interp create slave -safe
  2795     set n1 [slave recursionlimit 42]
  2796     set n2 [interp recursionlimit slave]
  2797     interp delete slave
  2798     list $n1 $n2
  2799 } {42 42}
  2800 
  2801 test interp-29.6.5 {safe interpreter recursion limit} {
  2802     interp create slave -safe
  2803     set n1 [interp recursionlimit slave 42]
  2804     set n2 [slave recursionlimit]
  2805     interp delete slave
  2806     list $n1 $n2
  2807 } {42 42}
  2808 
  2809 test interp-29.6.6 {safe interpreter recursion limit} {
  2810     interp create slave -safe
  2811     set n1 [slave recursionlimit 42]
  2812     set n2 [slave recursionlimit]
  2813     interp delete slave
  2814     list $n1 $n2
  2815 } {42 42}
  2816 
  2817 test interp-29.6.7 {safe interpreter recursion limit} {
  2818     interp create slave -safe
  2819     set n1 [slave recursionlimit 42]
  2820     set n2 [slave recursionlimit]
  2821     interp delete slave
  2822     list $n1 $n2
  2823 } {42 42}
  2824 
  2825 test interp-29.6.8 {safe interpreter recursion limit} {
  2826     interp create slave -safe
  2827     set n [catch {slave eval {interp recursionlimit {} 42}} msg]
  2828     interp delete slave
  2829     list $n $msg
  2830 } {1 {permission denied: safe interpreters cannot change recursion limit}}
  2831 
  2832 test interp-29.6.9 {safe interpreter recursion limit} {
  2833     interp create slave -safe
  2834     set result [
  2835 	slave eval {
  2836 	    interp create slave2 -safe
  2837 	    set n [catch {
  2838 	        interp recursionlimit slave2 42
  2839             } msg]
  2840             list $n $msg
  2841         }
  2842     ]
  2843     interp delete slave
  2844     set result
  2845 } {1 {permission denied: safe interpreters cannot change recursion limit}}
  2846 
  2847 test interp-29.6.10 {safe interpreter recursion limit} {
  2848     interp create slave -safe
  2849     set result [
  2850         slave eval {
  2851 	    interp create slave2 -safe
  2852 	    set n [catch {
  2853 	        slave2 recursionlimit 42
  2854             } msg]
  2855             list $n $msg
  2856         }
  2857     ]
  2858     interp delete slave
  2859     set result
  2860 } {1 {permission denied: safe interpreters cannot change recursion limit}}
  2861 
  2862 
  2863 #    # Deep recursion (into interps when the regular one fails):
  2864 #    # still crashes...
  2865 #    proc p {} {
  2866 #	if {[catch p ret]} {
  2867 #	    catch {
  2868 #		set i [interp create]
  2869 #		interp eval $i [list proc p {} [info body p]]
  2870 #		interp eval $i p
  2871 #	    }
  2872 #	    interp delete $i
  2873 #	    return ok
  2874 #	}
  2875 #	return $ret
  2876 #    }
  2877 #    p
  2878 
  2879 # more tests needed...
  2880 
  2881 # Interp & stack
  2882 #test interp-29.1 {interp and stack (info level)} {
  2883 #} {}
  2884 
  2885 # End of stack-recursion tests
  2886 
  2887 # This test dumps core in Tcl 8.0.3!
  2888 test interp-30.1 {deletion of aliases inside namespaces} {
  2889     set i [interp create]
  2890     $i alias ns::cmd list
  2891     $i alias ns::cmd {}
  2892 } {}
  2893 
  2894 test interp-31.1 {alias invocation scope} {
  2895     proc mySet {varName value} {
  2896 	upvar 1 $varName localVar
  2897 	set localVar $value
  2898     }
  2899 
  2900     interp alias {} myNewSet {} mySet
  2901     proc testMyNewSet {value} {
  2902 	myNewSet a $value
  2903 	return $a
  2904     }
  2905     catch {unset a}
  2906     set result [testMyNewSet "ok"]
  2907     rename testMyNewSet {}
  2908     rename mySet {}
  2909     rename myNewSet {}
  2910     set result
  2911 } ok
  2912 
  2913 test interp-32.1 { parent's working directory should
  2914                    be inherited by a child interp } {
  2915     cd [temporaryDirectory]
  2916     set parent [pwd]
  2917     set i [interp create]
  2918     set child [$i eval pwd]
  2919     interp delete $i
  2920     file mkdir cwd_test
  2921     cd cwd_test
  2922     lappend parent [pwd]
  2923     set i [interp create]
  2924     lappend child [$i eval pwd]
  2925     cd ..
  2926     file delete cwd_test
  2927     interp delete $i
  2928     cd [workingDirectory]
  2929     expr {[string equal $parent $child] ? 1 :
  2930              "\{$parent\} != \{$child\}"}
  2931 } 1
  2932 
  2933 test interp-33.1 {refCounting for target words of alias [Bug 730244]} {
  2934     # This test will panic if Bug 730244 is not fixed.
  2935     set i [interp create]
  2936     proc testHelper args {rename testHelper {}; return $args}
  2937     # Note: interp names are simple words by default
  2938     trace add execution testHelper enter "interp alias $i alias {} ;#"
  2939     interp alias $i alias {} testHelper this
  2940     $i eval alias 
  2941 } this
  2942 
  2943 # cleanup
  2944 foreach i [interp slaves] {
  2945   interp delete $i
  2946 }
  2947 ::tcltest::cleanupTests
  2948 return