os/persistentdata/persistentstorage/sqlite3api/TEST/TCL/tcldistribution/tests/interp.test
First public contribution.
1 # This file tests the multiple interpreter facility of Tcl
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.
7 # Copyright (c) 1995-1996 Sun Microsystems, Inc.
8 # Copyright (c) 1998-1999 by Scriptics Corporation.
10 # See the file "license.terms" for information on usage and redistribution
11 # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
13 # RCS: @(#) $Id: interp.test,v 1.19.2.6 2004/10/28 00:01:07 dgp Exp $
15 if {[lsearch [namespace children] ::tcltest] == -1} {
16 package require tcltest 2.1
17 namespace import -force ::tcltest::*
20 # The set of hidden commands is platform dependent:
22 if {"$tcl_platform(platform)" == "macintosh"} {
23 set hidden_cmds {beep cd echo encoding exit fconfigure file glob load ls open pwd socket source}
25 set hidden_cmds {cd encoding exec exit fconfigure file glob load open pwd socket source}
28 foreach i [interp slaves] {
32 proc equiv {x} {return $x}
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} {
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?"}}
51 # test interp-0.6 was removed
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"}}
70 # Part 1: Basic interpreter creation tests:
71 test interp-2.1 {basic interpreter creation} {
74 test interp-2.2 {basic interpreter creation} {
77 test interp-2.3 {basic interpreter creation} {
78 catch {interp create -safe}
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} {
86 test interp-2.6 {basic interpreter creation} {
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
95 test interp-2.9 {basic interpreter creation} {
96 interp create -safe -- -froboz1
98 test interp-2.10 {basic interpreter creation} {
101 interp create {a x3} -safe
103 test interp-2.11 {anonymous interps vs existing procs} {
104 set x [interp create]
105 regexp "interp(\[0-9]+)" $x dummy thenum
107 proc interp$thenum {} {}
108 set x [interp create]
109 regexp "interp(\[0-9]+)" $x dummy anothernum
110 expr $anothernum > $thenum
112 test interp-2.12 {anonymous interps vs existing procs} {
113 set x [interp create -safe]
114 regexp "interp(\[0-9]+)" $x dummy thenum
116 proc interp$thenum {} {}
117 set x [interp create -safe]
118 regexp "interp(\[0-9]+)" $x dummy anothernum
119 expr $anothernum - $thenum
121 test interp-2.13 {correct default when no $path arg is given} -body {
123 } -match regexp -result {interp[0-9]+}
125 foreach i [interp slaves] {
129 # Part 2: Testing "interp slaves" and "interp exists"
130 test interp-3.1 {testing interp exists and interp slaves} {
133 test interp-3.2 {testing interp exists and interp slaves} {
137 test interp-3.3 {testing interp exists and interp slaves} {
138 interp exists nonexistent
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} {
149 test interp-3.7 {testing interp exists and interp slaves} {
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}
159 test interp-3.10 {testing interp exists and interp slaves} {
163 # Part 3: Testing "interp delete"
164 test interp-3.11 {testing interp delete} {
167 test interp-4.1 {testing interp delete} {
168 catch {interp create a}
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} {
180 test interp-4.5 {testing interp delete} {
184 expr {[lsearch [interp slaves a] x1] >= 0}
186 test interp-4.6 {testing interp delete} {
190 interp delete c1 c2 c3
192 test interp-4.7 {testing interp delete} {
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}}
201 foreach i [interp slaves] {
205 # Part 4: Consistency checking - all nondeleted interpreters should be
207 test interp-5.1 {testing consistency} {
210 test interp-5.2 {testing consistency} {
213 test interp-5.3 {testing consistency} {
214 interp exists nonexistent
217 # Recreate interpreter "a"
220 # Part 5: Testing eval in interpreter object command and with interp command
221 test interp-6.1 {testing eval} {
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}}
231 test interp-6.4 {testing eval} {
235 test interp-6.5 {testing eval} {
237 interp eval {a x2} {proc frob {} {expr 4 * 9}}
238 interp eval {a x2} frob
240 test interp-6.6 {testing eval} {
241 list [catch {interp eval {a x2} foo} msg] $msg
242 } {1 {invalid command name "foo"}}
244 # UTILITY PROCEDURE RUNNING IN MASTER INTERPRETER:
245 proc in_master {args} {
246 return [list seen in master: $args]
249 # Part 6: Testing basic alias creation
250 test interp-7.1 {testing basic alias creation} {
251 a alias foo in_master
253 test interp-7.2 {testing basic alias creation} {
254 a alias bar in_master a1 a2 a3
256 # Test 6.3 has been deleted.
257 test interp-7.3 {testing basic alias creation} {
260 test interp-7.4 {testing basic alias creation} {
262 } {in_master a1 a2 a3}
263 test interp-7.5 {testing basic alias creation} {
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"}}
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
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
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..?"}}
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!}
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
303 lappend res [list [catch p msg] $msg]
305 lappend res [list [catch p msg] $msg]
309 } {{0 ENTER_A} {1 {invalid command name "p"}}}
310 test interp-9.4 {testing aliases and namespace commands} {
311 proc p {} {return GLOBAL}
313 proc p {} {return NAMESPACE}
315 interp alias {} a {} p
317 lappend res [namespace eval tst a]
324 if {[info command nonexistent-command-in-master] != ""} {
325 rename nonexistent-command-in-master {}
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}
334 interp alias a a_alias b b_alias 1 2 3
336 test interp-10.2 {testing aliasing between interpreters} {
337 catch {interp delete a}
338 catch {interp delete b}
341 b eval {proc b_alias {args} {return [list got $args]}}
342 interp alias a a_alias b b_alias 1 2 3
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}
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}
359 test interp-10.5 {testing aliasing between interpreters} {
360 catch {interp delete a}
361 catch {interp delete b}
365 interp alias a a_del b b_del
369 test interp-10.6 {testing aliasing between interpreters} {
370 catch {interp delete a}
371 catch {interp delete 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}
381 interp alias "" foo a zoppo
382 a eval {proc zoppo {x} {list $x $x $x}}
384 a eval {rename zoppo {}}
385 interp alias "" foo a {}
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}
399 a alias boo no_command
402 test interp-11.4 {testing interp target} {
403 catch {interp delete x1}
405 x1 eval interp create x2
406 x1 eval x2 eval interp create x3
407 catch {interp delete 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
414 test interp-11.5 {testing interp target} {
415 catch {interp delete x1}
417 interp create {x1 x2}
418 interp create {x1 x2 x3}
419 catch {interp delete 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] {
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}
435 list [catch {interp target a foo} msg] $msg
436 } {1 {alias "foo" in path "a" not found}}
438 # Part 11: testing "interp issafe"
439 test interp-12.1 {testing interp issafe} {
442 test interp-12.2 {testing interp issafe} {
443 catch {interp delete a}
447 test interp-12.3 {testing interp issafe} {
448 catch {interp delete a}
450 interp create {a x3} -safe
453 test interp-12.4 {testing interp issafe} {
454 catch {interp delete a}
456 interp create {a x3} -safe
457 interp create {a x3 foo}
458 interp issafe {a x3 foo}
461 # Part 12: testing interpreter object command "issafe" sub-command
462 test interp-13.1 {testing foo issafe} {
463 catch {interp delete a}
467 test interp-13.2 {testing foo issafe} {
468 catch {interp delete a}
470 interp create {a x3} -safe
473 test interp-13.3 {testing foo issafe} {
474 catch {interp delete a}
476 interp create {a x3} -safe
477 interp create {a x3 foo}
478 a eval x3 eval foo issafe
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"}}
485 # part 14: testing interp aliases
486 test interp-14.1 {testing interp aliases} {
489 test interp-14.2 {testing interp aliases} {
490 catch {interp delete a}
495 lsort [interp aliases a]
497 test interp-14.3 {testing interp aliases} {
498 catch {interp delete a}
501 interp alias {a x3} froboz "" puts
502 interp aliases {a x3}
504 test interp-14.4 {testing interp alias - alias over master} {
506 catch {interp delete a}
508 list [catch {interp alias "" a a eval} msg] $msg [info commands a]
509 } {1 {cannot define or rename alias "a": interpreter deleted} {}}
511 # part 15: testing file sharing
512 test interp-15.1 {testing file sharing} {
513 catch {interp delete z}
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}
521 set f [open [makeFile {} file-15.2] w]
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
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]
559 string compare [string tolower $x] \
560 [list 1 [format "channel \"%s\" wasn't opened for reading" $f]]
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
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
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]]
588 # Torture tests for interpreter deletion order
590 proc kill {} {interp delete xxx}
592 test interp-15.9 {testing deletion order} {
593 catch {interp delete xxx}
596 list [catch {xxx eval kill} msg] $msg
598 test interp-16.1 {testing deletion order} {
599 catch {interp delete xxx}
601 interp create {xxx yyy}
602 interp alias {xxx yyy} kill "" kill
603 list [catch {interp eval {xxx yyy} kill} msg] $msg
605 test interp-16.2 {testing deletion order} {
606 catch {interp delete xxx}
608 interp create {xxx yyy}
609 interp alias {xxx yyy} kill "" kill
610 list [catch {xxx eval yyy eval kill} msg] $msg
612 test interp-16.3 {testing deletion order} {
613 catch {interp delete xxx}
617 interp alias ddd kill xxx kill
618 set x [ddd eval kill]
622 test interp-16.4 {testing deletion order} {
623 catch {interp delete xxx}
625 interp create {xxx yyy}
626 interp alias {xxx yyy} kill "" kill
628 interp alias ddd kill {xxx yyy} kill
629 set x [ddd eval kill]
633 test interp-16.5 {testing deletion order, bgerror} {
634 catch {interp delete 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
646 # Alias loop prevention testing.
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}
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}
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}
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}
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}}
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.
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"
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}
696 test interp-18.3 {testing Tcl_DeleteInterp vs slaves} {
697 catch {interp delete a}
700 testinterpdelete {a b}
702 test interp-18.4 {testing Tcl_DeleteInterp vs slaves} {
703 catch {interp delete a}
708 test interp-18.5 {testing Tcl_DeleteInterp vs slaves} {
709 catch {interp delete a}
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
716 test interp-18.6 {testing Tcl_DeleteInterp vs slaves} {
717 catch {interp delete a}
720 interp alias {a b} dodel {} dodel
721 proc dodel {x} {testinterpdelete $x}
722 list [catch {interp eval {a b} {dodel a}} msg] $msg
724 test interp-18.7 {eval in deleted interp} {
725 catch {interp delete a}
732 proc dosomething args {
733 puts "I should not have been called!!"
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}
754 proc dosomething args {
755 puts "I should not have been called!!"
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}}
763 test interp-18.9 {eval in deleted interp, bug 495830} {knownBug} {
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} {
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}}
774 # Test alias deletion
776 test interp-19.1 {alias deletion} {
777 catch {interp delete a}
779 interp alias a foo a bar
780 set s [interp alias a foo {}]
784 test interp-19.2 {alias deletion} {
785 catch {interp delete a}
787 catch {interp alias a foo {}} msg
790 } {alias "foo" not found}
791 test interp-19.3 {alias deletion} {
792 catch {interp delete 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
800 } {invalid command name "zop"}
801 test interp-19.4 {alias deletion} {
802 catch {interp delete a}
804 interp alias a foo a bar
805 interp eval a {rename foo zop}
806 catch {interp eval a foo} msg
809 } {invalid command name "foo"}
810 test interp-19.5 {alias deletion} {
811 catch {interp delete 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
820 test interp-19.6 {alias deletion} {
821 catch {interp delete 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]
830 test interp-19.7 {alias deletion, renaming} {
831 catch {interp delete 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]
840 test interp-19.8 {alias deletion, renaming} {
841 catch {interp delete a}
843 interp alias a foo a bar
844 interp eval a rename foo blotz
846 lappend l [interp aliases a]
847 interp alias a foo {}
848 lappend l [interp aliases a]
852 test interp-19.9 {alias deletion, renaming} {
853 catch {interp delete 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]
864 test interp-20.1 {interp hide, interp expose and interp invokehidden} {
865 catch {interp delete a}
867 a eval {proc unknown {x args} {error "invalid command name \"$x\""}}
868 a eval {proc foo {} {}}
870 catch {a eval foo something} msg
873 } {invalid command name "foo"}
874 test interp-20.2 {interp hide, interp expose and interp invokehidden} {
875 catch {interp delete a}
877 a eval {proc unknown {x args} {error "invalid command name \"$x\""}}
880 lappend l [catch {a eval {list 1 2 3}} msg]
883 lappend l [catch {a eval {list 1 2 3}} msg]
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}
891 a eval {proc unknown {x args} {error "invalid command name \"$x\""}}
894 lappend l [catch {a eval {list 1 2 3}} msg]
896 lappend l [catch {a invokehidden list 1 2 3} msg]
899 lappend l [catch {a eval {list 1 2 3}} msg]
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}
907 a eval {proc unknown {x args} {error "invalid command name \"$x\""}}
910 lappend l [catch {a eval {list 1 2 3}} msg]
912 lappend l [catch {a invokehidden list {"" 1 2 3}} msg]
915 lappend l [catch {a eval {list 1 2 3}} msg]
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}
923 a eval {proc unknown {x args} {error "invalid command name \"$x\""}}
926 lappend l [catch {a eval {list 1 2 3}} msg]
928 lappend l [catch {a invokehidden list {{} 1 2 3}} msg]
931 lappend l [catch {a eval {list 1 2 3}} msg]
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}
942 lappend l [catch {a invokehidden list $z 1 2 3} msg]
945 lappend l [catch {a eval list $z 1 2 3} msg]
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}
956 lappend l [catch {a invokehidden list {$z a b c}} msg]
961 test interp-20.8 {interp invokehidden vs variable eval} {
962 catch {interp delete a}
968 lappend l [catch {a invokehidden list {$z a b c}} msg]
973 test interp-20.9 {interp invokehidden vs variable eval} {
974 catch {interp delete a}
980 lappend l [catch {a invokehidden list $z {$z a b c}} msg]
984 } {0 {45 {$z a b c}}}
985 test interp-20.10 {interp hide, interp expose and interp invokehidden} {
986 catch {interp delete a}
988 a eval {proc unknown {x args} {error "invalid command name \"$x\""}}
989 a eval {proc foo {} {}}
991 catch {interp eval a foo something} msg
994 } {invalid command name "foo"}
995 test interp-20.11 {interp hide, interp expose and interp invokehidden} {
996 catch {interp delete a}
998 a eval {proc unknown {x args} {error "invalid command name \"$x\""}}
1001 lappend l [catch {interp eval a {list 1 2 3}} msg]
1003 interp expose a list
1004 lappend l [catch {interp eval a {list 1 2 3}} msg]
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}
1012 a eval {proc unknown {x args} {error "invalid command name \"$x\""}}
1015 lappend l [catch {interp eval a {list 1 2 3}} msg]
1017 lappend l [catch {interp invokehidden a list 1 2 3} msg]
1019 interp expose a list
1020 lappend l [catch {interp eval a {list 1 2 3}} msg]
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}
1028 a eval {proc unknown {x args} {error "invalid command name \"$x\""}}
1031 lappend l [catch {interp eval a {list 1 2 3}} msg]
1033 lappend l [catch {interp invokehidden a list {"" 1 2 3}} msg]
1035 interp expose a list
1036 lappend l [catch {interp eval a {list 1 2 3}} msg]
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}
1044 a eval {proc unknown {x args} {error "invalid command name \"$x\""}}
1047 lappend l [catch {interp eval a {list 1 2 3}} msg]
1049 lappend l [catch {interp invokehidden a list {{} 1 2 3}} msg]
1051 interp expose a list
1052 lappend l [catch {a eval {list 1 2 3}} msg]
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}
1063 lappend l [catch {interp invokehidden a list $z 1 2 3} msg]
1066 lappend l [catch {interp eval a list $z 1 2 3} msg]
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}
1077 lappend l [catch {interp invokehidden a list {$z a b c}} msg]
1082 test interp-20.17 {interp invokehidden vs variable eval} {
1083 catch {interp delete a}
1089 lappend l [catch {interp invokehidden a list {$z a b c}} msg]
1094 test interp-20.18 {interp invokehidden vs variable eval} {
1095 catch {interp delete a}
1101 lappend l [catch {interp invokehidden a list $z {$z a b c}} msg]
1105 } {0 {45 {$z a b c}}}
1106 test interp-20.19 {interp invokehidden vs nested commands} {
1107 catch {interp delete a}
1110 set l [a invokehidden list {[list x y z] f g h} z]
1113 } {{[list x y z] f g h} z}
1114 test interp-20.20 {interp invokehidden vs nested commands} {
1115 catch {interp delete a}
1118 set l [interp invokehidden a list {[list x y z] f g h} z]
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
1126 lappend l [catch {a hide list} msg]
1131 test interp-20.22 {interp hide vs safety} {
1132 catch {interp delete a}
1133 interp create a -safe
1135 lappend l [catch {interp hide a list} msg]
1140 test interp-20.23 {interp hide vs safety} {
1141 catch {interp delete a}
1142 interp create a -safe
1144 lappend l [catch {a eval {interp hide {} list}} msg]
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
1154 lappend l [catch {a eval {interp hide b list}} msg]
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
1164 lappend l [catch {interp hide {a b} list} msg]
1169 test interp-20.26 {interp expoose vs safety} {
1170 catch {interp delete a}
1171 interp create a -safe
1173 lappend l [catch {a hide list} msg]
1175 lappend l [catch {a expose list} msg]
1180 test interp-20.27 {interp expose vs safety} {
1181 catch {interp delete a}
1182 interp create a -safe
1184 lappend l [catch {interp hide a list} msg]
1186 lappend l [catch {interp expose a list} msg]
1191 test interp-20.28 {interp expose vs safety} {
1192 catch {interp delete a}
1193 interp create a -safe
1195 lappend l [catch {a hide list} msg]
1197 lappend l [catch {a eval {interp expose {} list}} msg]
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
1206 lappend l [catch {interp hide a list} msg]
1208 lappend l [catch {a eval {interp expose {} list}} msg]
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
1218 lappend l [catch {interp hide {a b} list} msg]
1220 lappend l [catch {a eval {interp expose b list}} msg]
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
1230 lappend l [catch {interp hide {a b} list} msg]
1232 lappend l [catch {interp expose {a b} list} msg]
1237 test interp-20.32 {interp invokehidden vs safety} {
1238 catch {interp delete a}
1239 interp create a -safe
1242 lappend l [catch {a eval {interp invokehidden {} list a b c}} msg]
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
1252 lappend l [catch {a eval {interp invokehidden {} list a b c}} msg]
1254 lappend l [catch {a invokehidden list a b c} msg]
1258 } {1 {not allowed to invoke hidden commands from safe interpreter}\
1260 test interp-20.34 {interp invokehidden vs safety} {
1261 catch {interp delete a}
1262 interp create a -safe
1264 interp hide {a b} list
1266 lappend l [catch {a eval {interp invokehidden b list a b c}} msg]
1268 lappend l [catch {interp invokehidden {a b} list a b c} msg]
1272 } {1 {not allowed to invoke hidden commands from safe interpreter}\
1274 test interp-20.35 {invokehidden at local level} {
1275 catch {interp delete a}
1291 interp invokehidden a h1
1293 set r [interp eval a p1]
1297 test interp-20.36 {invokehidden at local level} {
1298 catch {interp delete a}
1315 interp invokehidden a h1
1317 set r [interp eval a p1]
1321 test interp-20.37 {invokehidden at local level} {
1322 catch {interp delete a}
1337 interp invokehidden a h1
1339 set r [interp eval a p1]
1343 test interp-20.38 {invokehidden at global level} {
1344 catch {interp delete a}
1359 interp invokehidden a -global h1
1361 set r [catch {interp eval a p1} msg]
1364 } {1 {can't read "z": no such variable}}
1365 test interp-20.39 {invokehidden at global level} {
1366 catch {interp delete a}
1382 interp invokehidden a -global h1
1384 set r [catch {interp eval a p1} msg]
1388 test interp-20.40 {safe, invokehidden at local level} {
1389 catch {interp delete a}
1390 interp create a -safe
1405 interp invokehidden a h1
1407 set r [interp eval a p1]
1411 test interp-20.41 {safe, invokehidden at local level} {
1412 catch {interp delete a}
1413 interp create a -safe
1429 interp invokehidden a h1
1431 set r [interp eval a p1]
1435 test interp-20.42 {safe, invokehidden at local level} {
1436 catch {interp delete a}
1437 interp create a -safe
1451 interp invokehidden a h1
1453 set r [interp eval a p1]
1457 test interp-20.43 {invokehidden at global level} {
1458 catch {interp delete a}
1473 interp invokehidden a -global h1
1475 set r [catch {interp eval a p1} msg]
1478 } {1 {can't read "z": no such variable}}
1479 test interp-20.44 {invokehidden at global level} {
1480 catch {interp delete a}
1496 interp invokehidden a -global h1
1498 set r [catch {interp eval a p1} msg]
1502 test interp-20.45 {interp hide vs namespaces} {
1503 catch {interp delete a}
1506 namespace eval foo {}
1509 set l [list [catch {interp hide a foo::x} msg] $msg]
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}
1517 namespace eval foo {}
1520 set l [list [catch {interp hide a foo::x x} msg] $msg]
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}
1530 set l [list [catch {interp hide a x foo::x} msg] $msg]
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}
1538 namespace eval foo {}
1541 set l [list [catch {interp hide a foo::x bar::x} msg] $msg]
1544 } {1 {cannot use namespace qualifiers in hidden command token (rename)}}
1546 test interp-21.1 {interp hidden} {
1549 test interp-21.2 {interp hidden} {
1552 test interp-21.3 {interp hidden vs interp hide, interp expose} {
1554 lappend l [interp hidden]
1556 lappend l [interp hidden]
1557 interp expose {} pwd
1558 lappend l [interp hidden]
1561 test interp-21.4 {interp hidden} {
1562 catch {interp delete a}
1564 set l [interp hidden a]
1568 test interp-21.5 {interp hidden} {
1569 catch {interp delete a}
1570 interp create -safe a
1571 set l [lsort [interp hidden a]]
1575 test interp-21.6 {interp hidden vs interp hide, interp expose} {
1576 catch {interp delete a}
1579 lappend l [interp hidden a]
1581 lappend l [interp hidden a]
1583 lappend l [interp hidden a]
1587 test interp-21.7 {interp hidden} {
1588 catch {interp delete a}
1594 test interp-21.8 {interp hidden} {
1595 catch {interp delete a}
1596 interp create a -safe
1597 set l [lsort [a hidden]]
1601 test interp-21.9 {interp hidden vs interp hide, interp expose} {
1602 catch {interp delete a}
1605 lappend l [a hidden]
1607 lappend l [a hidden]
1609 lappend l [a hidden]
1614 test interp-22.1 {testing interp marktrusted} {
1615 catch {interp delete a}
1618 lappend l [a issafe]
1619 lappend l [a marktrusted]
1620 lappend l [a issafe]
1624 test interp-22.2 {testing interp marktrusted} {
1625 catch {interp delete a}
1628 lappend l [interp issafe a]
1629 lappend l [interp marktrusted a]
1630 lappend l [interp issafe a]
1634 test interp-22.3 {testing interp marktrusted} {
1635 catch {interp delete a}
1636 interp create a -safe
1638 lappend l [a issafe]
1639 lappend l [a marktrusted]
1640 lappend l [a issafe]
1644 test interp-22.4 {testing interp marktrusted} {
1645 catch {interp delete a}
1646 interp create a -safe
1648 lappend l [interp issafe a]
1649 lappend l [interp marktrusted a]
1650 lappend l [interp issafe a]
1654 test interp-22.5 {testing interp marktrusted} {
1655 catch {interp delete a}
1656 interp create a -safe
1658 catch {a eval {interp marktrusted b}} 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
1666 catch {a eval {b marktrusted}} 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
1674 lappend l [interp issafe a]
1675 interp marktrusted a
1677 lappend l [interp issafe a]
1678 lappend l [interp issafe {a b}]
1682 test interp-22.8 {testing interp marktrusted} {
1683 catch {interp delete a}
1684 interp create a -safe
1686 lappend l [interp issafe a]
1688 lappend l [interp issafe {a b}]
1689 interp marktrusted a
1691 lappend l [interp issafe a]
1692 lappend l [interp issafe {a c}]
1696 test interp-22.9 {testing interp marktrusted} {
1697 catch {interp delete a}
1698 interp create a -safe
1700 lappend l [interp issafe a]
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}]
1712 test interp-23.1 {testing hiding vs aliases} {
1713 catch {interp delete a}
1716 lappend l [interp hidden a]
1718 lappend l [interp aliases a]
1719 lappend l [interp hidden a]
1721 lappend l [interp aliases a]
1722 lappend l [interp hidden a]
1724 lappend l [interp aliases a]
1725 lappend l [interp hidden a]
1728 } {{} bar {} bar bar {} {}}
1729 test interp-23.2 {testing hiding vs aliases} {unixOrPc} {
1730 catch {interp delete a}
1731 interp create a -safe
1733 lappend l [lsort [interp hidden a]]
1735 lappend l [interp aliases a]
1736 lappend l [lsort [interp hidden a]]
1738 lappend l [interp aliases a]
1739 lappend l [lsort [interp hidden a]]
1741 lappend l [interp aliases a]
1742 lappend l [lsort [interp hidden a]]
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}}
1747 test interp-23.3 {testing hiding vs aliases} {macOnly} {
1748 catch {interp delete a}
1749 interp create a -safe
1751 lappend l [lsort [interp hidden a]]
1753 lappend l [interp aliases a]
1754 lappend l [lsort [interp hidden a]]
1756 lappend l [interp aliases a]
1757 lappend l [lsort [interp hidden a]]
1759 lappend l [interp aliases a]
1760 lappend l [lsort [interp hidden a]]
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}}
1765 test interp-24.1 {result resetting on error} {
1766 catch {interp delete a}
1768 proc foo args {error $args}
1769 interp alias a foo {} foo
1770 set l [interp eval a {
1772 lappend l [catch {foo 1 2 3} msg]
1774 lappend l [catch {foo 3 4 5} msg]
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 {
1788 lappend l [catch {foo 1 2 3} msg]
1790 lappend l [catch {foo 3 4 5} msg]
1796 } {1 {1 2 3} 1 {3 4 5}}
1797 test interp-24.3 {result resetting on error} {
1798 catch {interp delete a}
1802 proc foo args {error $args}
1804 interp alias {a b} foo a foo
1805 set l [interp eval {a b} {
1807 lappend l [catch {foo 1 2 3} msg]
1809 lappend l [catch {foo 3 4 5} msg]
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
1821 proc foo args {error $args}
1823 interp alias {a b} foo a foo
1824 set l [interp eval {a b} {
1826 lappend l [catch {foo 1 2 3} msg]
1828 lappend l [catch {foo 3 4 5} msg]
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}
1841 proc foo args {error $args}
1843 interp alias b foo a foo
1844 set l [interp eval b {
1846 lappend l [catch {foo 1 2 3} msg]
1848 lappend l [catch {foo 3 4 5} msg]
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
1861 proc foo args {error $args}
1863 interp alias b foo a foo
1864 set l [interp eval b {
1866 lappend l [catch {foo 1 2 3} msg]
1868 lappend l [catch {foo 3 4 5} msg]
1874 } {1 {1 2 3} 1 {3 4 5}}
1875 test interp-24.7 {result resetting on error} {
1876 catch {interp delete a}
1879 proc foo args {error $args}
1882 lappend l [catch {interp eval a foo 1 2 3} msg]
1884 lappend l [catch {interp eval a foo 3 4 5} msg]
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
1893 proc foo args {error $args}
1896 lappend l [catch {interp eval a foo 1 2 3} msg]
1898 lappend l [catch {interp eval a foo 3 4 5} msg]
1902 } {1 {1 2 3} 1 {3 4 5}}
1903 test interp-24.9 {result resetting on error} {
1904 catch {interp delete a}
1908 proc foo args {error $args}
1912 eval interp eval b foo $args
1916 lappend l [catch {interp eval a foo 1 2 3} msg]
1918 lappend l [catch {interp eval a foo 3 4 5} msg]
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
1928 proc foo args {error $args}
1932 eval interp eval b foo $args
1936 lappend l [catch {interp eval a foo 1 2 3} msg]
1938 lappend l [catch {interp eval a foo 3 4 5} msg]
1942 } {1 {1 2 3} 1 {3 4 5}}
1943 test interp-24.11 {result resetting on error} {
1944 catch {interp delete a}
1948 proc foo args {error $args}
1953 lappend l [catch {eval interp eval b foo $args} msg]
1955 lappend l [catch {eval interp eval b foo $args} msg]
1960 set l [interp eval a foo 1 2 3]
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
1969 proc foo args {error $args}
1974 lappend l [catch {eval interp eval b foo $args} msg]
1976 lappend l [catch {eval interp eval b foo $args} msg]
1981 set l [interp eval a foo 1 2 3]
1984 } {1 {1 2 3} 1 {1 2 3}}
1988 test interp-25.1 {testing aliasing of string commands} {
1989 catch {interp delete a}
1991 a alias exec foo ;# Relies on exec being a string command!
1997 # Interps result transmission
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.
2005 catch {interp delete a}
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]
2017 test interp-26.2 {result code transmission : interp eval indirect} {
2018 # retcode == 2 == return is special
2019 catch {interp delete a}
2021 interp eval a {proc retcode {code} {return -code $code ret$code}}
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
2029 } {-1 ret-1 0 ret0 1 ret1 0 ret2 3 ret3 4 ret4 5 ret5}
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.
2036 catch {interp delete a}
2039 proc MyTestAlias {code} {
2040 return -code $code ret$code
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]]
2050 test interp-26.4 {result code transmission: invoke hidden direct--bug 1637} \
2052 # The known bug is that code 2 is returned, not the -code argument
2053 catch {interp delete a}
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}]
2064 test interp-26.5 {result code transmission: invoke hidden indirect--bug 1637} \
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}
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
2078 } {-1 ret-1 0 ret0 1 ret1 0 ret2 3 ret3 4 ret4 5 ret5}
2080 test interp-26.6 {result code transmission: all combined--bug 1637} \
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} {
2087 lappend aliasTrace $args;
2088 eval interp invokehidden [list $interp] $args
2090 foreach c {return} {
2091 interp hide $interp $c;
2092 interp alias $interp $c {} MyTestAlias $interp $c;
2094 interp eval $interp {proc ret {code} {return -code $code ret$code}}
2097 for {set code -1} {$code<=5} {incr code} {
2098 lappend res [catch {interp eval $interp ret $code} msg] $msg
2100 interp delete $interp;
2102 } {-1 ret-1 0 ret0 1 ret1 0 ret2 3 ret3 4 ret4 5 ret5}
2104 # Some tests might need to be added to check for difference between
2105 # toplevel and non toplevel evals.
2107 # End of return code transmission section
2109 test interp-26.7 {errorInfo transmission: regular interps} {
2110 set interp [interp create];
2111 proc MyError {secret} {
2112 return -code error "msg"
2114 proc MyTestAlias {interp args} {
2115 MyError "some secret"
2117 interp alias $interp test {} MyTestAlias $interp;
2118 set res [interp eval $interp {catch test;set errorInfo}]
2119 interp delete $interp;
2123 "MyError "some secret""
2124 (procedure "MyTestAlias" line 2)
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"
2137 proc MyTestAlias {interp args} {
2138 MyError "some secret"
2140 interp alias $interp test {} MyTestAlias $interp;
2141 set res [interp eval $interp {catch test;set errorInfo}]
2142 interp delete $interp;
2148 # Interps & Namespaces
2149 test interp-27.1 {interp aliases & namespaces} {
2150 set i [interp create];
2152 proc tstAlias {args} {
2154 lappend aliasTrace [list [namespace current] $args];
2156 $i alias foo::bar tstAlias foo::bar;
2157 $i eval foo::bar test
2160 } {{:: {foo::bar test}}}
2162 test interp-27.2 {interp aliases & namespaces} {
2163 set i [interp create];
2165 proc tstAlias {args} {
2167 lappend aliasTrace [list [namespace current] $args];
2169 $i alias foo::bar tstAlias foo::bar;
2170 $i eval namespace eval foo {bar test}
2173 } {{:: {foo::bar test}}}
2175 test interp-27.3 {interp aliases & namespaces} {
2176 set i [interp create];
2178 proc tstAlias {args} {
2180 lappend aliasTrace [list [namespace current] $args];
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}}
2187 } {{:: {foo::bar test}}}
2189 test interp-27.4 {interp aliases & namespaces} {
2190 set i [interp create];
2191 namespace eval foo2 {
2192 variable aliasTrace {};
2194 variable aliasTrace;
2195 lappend aliasTrace [list [namespace current] $args];
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;
2203 } {{::foo2 {foo::bar test}}}
2205 # the following tests are commented out while we don't support
2206 # hiding in namespaces
2208 # test interp-27.5 {interp hidden & namespaces} {
2209 # set i [interp create];
2211 # namespace eval foo {
2213 # return "bar called ([namespace current]) ($args)"
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]
2222 #} {{bar called (::foo) (test1)} {1 {invalid command name "bar"}}}
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} {
2231 # list "master bar called ($v) ([namespace current]) ($args)"\
2232 # [interp invokehidden $interp foo::bar $args];
2236 # namespace eval foo {
2237 # namespace export *
2238 # variable v foo-slave;
2241 # return "slave bar called ($v) ([namespace current]) ($args)"
2245 # set res [list [interp eval $i {namespace eval foo {bar test1}}]]
2247 # $i alias foo::bar foo::bar $i;
2248 # set res [concat $res [interp eval $i {
2250 # namespace eval test {
2251 # variable v foo-test;
2252 # namespace import ::foo::*;
2256 # namespace delete foo;
2259 # } {{slave bar called (foo-slave) (::foo) (test1)} {master bar called (foo-master) (::foo) (test2)} {slave bar called (foo-slave) (::foo) (test2)}}
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} {
2269 # list "master bar called ($v) ([namespace current]) ($args)"\
2270 # [interp invokehidden $interp test::bar $args];
2274 # namespace eval foo {
2275 # namespace export *
2276 # variable v foo-slave;
2279 # return "slave bar called ($v) ([info level 0]) ([uplevel namespace current]) ([namespace current]) ($args)"
2283 # namespace eval test {
2284 # variable v foo-test;
2285 # namespace import ::foo::*;
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;
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)}}
2297 #test interp-27.8 {hiding, namespaces and integrity} {
2298 # namespace eval foo {
2300 # proc bar {} {variable v; set v}
2301 # # next command would currently generate an unknown command "bar" error.
2302 # interp hide {} bar;
2304 # namespace delete foo;
2305 # list [catch {interp invokehidden {} foo} msg] $msg;
2306 #} {1 {invalid hidden command name "foo"}}
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 {
2316 return "dummy foo::list";
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
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?"}}
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"}}
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?"}}
2346 test interp-29.1.4 {interp recursionlimit argument checking} {
2348 set result [catch {interp recursionlimit moo bar} msg]
2351 } {1 {expected integer but got "bar"}}
2353 test interp-29.1.5 {interp recursionlimit argument checking} {
2355 set result [catch {interp recursionlimit moo 0} msg]
2358 } {1 {recursion limit must be > 0}}
2360 test interp-29.1.6 {interp recursionlimit argument checking} {
2362 set result [catch {interp recursionlimit moo -1} msg]
2365 } {1 {recursion limit must be > 0}}
2367 test interp-29.1.7 {interp recursionlimit argument checking} {
2369 set result [catch {interp recursionlimit moo [expr {wide(1)<<32}]} msg]
2371 list $result [string range $msg 0 35]
2372 } {1 {integer value too large to represent}}
2374 test interp-29.1.8 {slave recursionlimit argument checking} {
2376 set result [catch {moo recursionlimit foo bar} msg]
2379 } {1 {wrong # args: should be "moo recursionlimit ?newlimit?"}}
2381 test interp-29.1.9 {slave recursionlimit argument checking} {
2383 set result [catch {moo recursionlimit foo} msg]
2386 } {1 {expected integer but got "foo"}}
2388 test interp-29.1.10 {slave recursionlimit argument checking} {
2390 set result [catch {moo recursionlimit 0} msg]
2393 } {1 {recursion limit must be > 0}}
2395 test interp-29.1.11 {slave recursionlimit argument checking} {
2397 set result [catch {moo recursionlimit -1} msg]
2400 } {1 {recursion limit must be > 0}}
2402 test interp-29.1.12 {slave recursionlimit argument checking} {
2404 set result [catch {moo recursionlimit [expr {wide(1)<<32}]} msg]
2406 list $result [string range $msg 0 35]
2407 } {1 {integer value too large to represent}}
2409 test interp-29.2.1 {query recursion limit} {
2410 interp recursionlimit {}
2413 test interp-29.2.2 {query recursion limit} {
2414 set i [interp create]
2415 set n [interp recursionlimit $i]
2420 test interp-29.2.3 {query recursion limit} {
2421 set i [interp create]
2422 set n [$i recursionlimit]
2427 test interp-29.2.4 {query recursion limit} {
2428 set i [interp create]
2430 set n1 [interp recursionlimit {} 42]
2431 set n2 [interp recursionlimit {}]
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]
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]
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]
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]
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}
2476 list [catch p msg] $msg $i
2480 } {1 {too many nested evaluations (infinite loop?)} 48}
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}
2488 list [catch p msg] $msg $i
2492 } {1 {too many nested evaluations (infinite loop?)} 48}
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}
2500 list [catch p msg] $msg $i
2504 } {1 {too many nested evaluations (infinite loop?)} 48}
2506 test interp-29.3.4 {recursion limit error reporting} {
2508 set r1 [slave eval {
2509 catch { # nesting level 1
2514 interp recursionlimit {} 5
2522 set r2 [slave eval { set msg }]
2525 } {1 {falling back due to new recursion limit}}
2527 test interp-29.3.5 {recursion limit error reporting} {
2529 set r1 [slave eval {
2530 catch { # nesting level 1
2535 interp recursionlimit {} 4
2543 set r2 [slave eval { set msg }]
2546 } {1 {falling back due to new recursion limit}}
2548 test interp-29.3.6 {recursion limit error reporting} {
2550 set r1 [slave eval {
2551 catch { # nesting level 1
2556 interp recursionlimit {} 6
2564 set r2 [slave eval { set msg }]
2569 test interp-29.3.7 {recursion limit error reporting} {
2571 after 0 {interp recursionlimit slave 5}
2572 set r1 [slave eval {
2573 catch { # nesting level 1
2586 set r2 [slave eval { set msg }]
2589 } {1 {too many nested evaluations (infinite loop?)}}
2591 test interp-29.3.8 {recursion limit error reporting} {
2593 after 0 {interp recursionlimit slave 4}
2594 set r1 [slave eval {
2595 catch { # nesting level 1
2608 set r2 [slave eval { set msg }]
2611 } {1 {too many nested evaluations (infinite loop?)}}
2613 test interp-29.3.9 {recursion limit error reporting} {
2615 after 0 {interp recursionlimit slave 6}
2616 set r1 [slave eval {
2617 catch { # nesting level 1
2630 set r2 [slave eval { set msg }]
2635 test interp-29.3.10 {recursion limit error reporting} {
2637 after 0 {slave recursionlimit 4}
2638 set r1 [slave eval {
2639 catch { # nesting level 1
2652 set r2 [slave eval { set msg }]
2655 } {1 {too many nested evaluations (infinite loop?)}}
2657 test interp-29.3.11 {recursion limit error reporting} {
2659 after 0 {slave recursionlimit 5}
2660 set r1 [slave eval {
2661 catch { # nesting level 1
2674 set r2 [slave eval { set msg }]
2677 } {1 {too many nested evaluations (infinite loop?)}}
2679 test interp-29.3.12 {recursion limit error reporting} {
2681 after 0 {slave recursionlimit 6}
2682 set r1 [slave eval {
2683 catch { # nesting level 1
2696 set r2 [slave eval { set msg }]
2701 test interp-29.4.1 {recursion limit inheritance} {
2702 set i [interp create]
2703 set ii [interp eval $i {
2704 interp recursionlimit {} 50
2707 set r [interp eval [list $i $ii] {
2708 proc p {} {incr ::i; p}
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}
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]
2738 list [expr {$before == $after}] $slavelimit
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]
2748 list [expr {$before == $after}] $slavelimit
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]
2758 list [expr {$before == $after}] $slavelimit
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]
2768 list [expr {$before == $after}] $slavelimit
2771 test interp-29.6.1 {safe interpreter recursion limit} {
2772 interp create slave -safe
2773 set n [interp recursionlimit slave]
2778 test interp-29.6.2 {safe interpreter recursion limit} {
2779 interp create slave -safe
2780 set n [slave recursionlimit]
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]
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]
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]
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]
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]
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]
2830 } {1 {permission denied: safe interpreters cannot change recursion limit}}
2832 test interp-29.6.9 {safe interpreter recursion limit} {
2833 interp create slave -safe
2836 interp create slave2 -safe
2838 interp recursionlimit slave2 42
2845 } {1 {permission denied: safe interpreters cannot change recursion limit}}
2847 test interp-29.6.10 {safe interpreter recursion limit} {
2848 interp create slave -safe
2851 interp create slave2 -safe
2853 slave2 recursionlimit 42
2860 } {1 {permission denied: safe interpreters cannot change recursion limit}}
2863 # # Deep recursion (into interps when the regular one fails):
2864 # # still crashes...
2866 # if {[catch p ret]} {
2868 # set i [interp create]
2869 # interp eval $i [list proc p {} [info body p]]
2879 # more tests needed...
2882 #test interp-29.1 {interp and stack (info level)} {
2885 # End of stack-recursion tests
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
2894 test interp-31.1 {alias invocation scope} {
2895 proc mySet {varName value} {
2896 upvar 1 $varName localVar
2900 interp alias {} myNewSet {} mySet
2901 proc testMyNewSet {value} {
2906 set result [testMyNewSet "ok"]
2907 rename testMyNewSet {}
2913 test interp-32.1 { parent's working directory should
2914 be inherited by a child interp } {
2915 cd [temporaryDirectory]
2917 set i [interp create]
2918 set child [$i eval pwd]
2922 lappend parent [pwd]
2923 set i [interp create]
2924 lappend child [$i eval pwd]
2926 file delete cwd_test
2928 cd [workingDirectory]
2929 expr {[string equal $parent $child] ? 1 :
2930 "\{$parent\} != \{$child\}"}
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
2944 foreach i [interp slaves] {
2947 ::tcltest::cleanupTests