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