| 1 | # Commands covered:  proc, return, global | 
|---|
| 2 | # | 
|---|
| 3 | # This file, proc-old.test, includes the original set of tests for Tcl's | 
|---|
| 4 | # proc, return, and global commands. There is now a new file proc.test | 
|---|
| 5 | # that contains tests for the tclProc.c source file. | 
|---|
| 6 | # | 
|---|
| 7 | # Sourcing this file into Tcl runs the tests and generates output for | 
|---|
| 8 | # errors.  No output means no errors were found. | 
|---|
| 9 | # | 
|---|
| 10 | # Copyright (c) 1991-1993 The Regents of the University of California. | 
|---|
| 11 | # Copyright (c) 1994-1997 Sun Microsystems, Inc. | 
|---|
| 12 | # Copyright (c) 1998-1999 by Scriptics Corporation. | 
|---|
| 13 | # | 
|---|
| 14 | # See the file "license.terms" for information on usage and redistribution | 
|---|
| 15 | # of this file, and for a DISCLAIMER OF ALL WARRANTIES. | 
|---|
| 16 | # | 
|---|
| 17 | # RCS: @(#) $Id: proc-old.test,v 1.15 2006/10/09 19:15:45 msofer Exp $ | 
|---|
| 18 |  | 
|---|
| 19 | if {[lsearch [namespace children] ::tcltest] == -1} { | 
|---|
| 20 |     package require tcltest | 
|---|
| 21 |     namespace import -force ::tcltest::* | 
|---|
| 22 | } | 
|---|
| 23 |  | 
|---|
| 24 | catch {rename t1 ""} | 
|---|
| 25 | catch {rename foo ""} | 
|---|
| 26 |  | 
|---|
| 27 | proc tproc {} {return a; return b} | 
|---|
| 28 | test proc-old-1.1 {simple procedure call and return} {tproc} a | 
|---|
| 29 | proc tproc x { | 
|---|
| 30 |     set x [expr $x+1] | 
|---|
| 31 |     return $x | 
|---|
| 32 | } | 
|---|
| 33 | test proc-old-1.2 {simple procedure call and return} {tproc 2} 3 | 
|---|
| 34 | test proc-old-1.3 {simple procedure call and return} { | 
|---|
| 35 |     proc tproc {} {return foo} | 
|---|
| 36 | } {} | 
|---|
| 37 | test proc-old-1.4 {simple procedure call and return} { | 
|---|
| 38 |     proc tproc {} {return} | 
|---|
| 39 |     tproc | 
|---|
| 40 | } {} | 
|---|
| 41 | proc tproc1 {a}   {incr a; return $a} | 
|---|
| 42 | proc tproc2 {a b} {incr a; return $a} | 
|---|
| 43 | test proc-old-1.5 {simple procedure call and return (2 procs with same body but different parameters)} { | 
|---|
| 44 |     list [tproc1 123] [tproc2 456 789] | 
|---|
| 45 | } {124 457} | 
|---|
| 46 | test proc-old-1.6 {simple procedure call and return (shared proc body string)} { | 
|---|
| 47 |     set x {} | 
|---|
| 48 |     proc tproc {} {}   ;# body is shared with x | 
|---|
| 49 |     list [tproc] [append x foo] | 
|---|
| 50 | } {{} foo} | 
|---|
| 51 |  | 
|---|
| 52 | test proc-old-2.1 {local and global variables} { | 
|---|
| 53 |     proc tproc x { | 
|---|
| 54 |         set x [expr $x+1] | 
|---|
| 55 |         return $x | 
|---|
| 56 |     } | 
|---|
| 57 |     set x 42 | 
|---|
| 58 |     list [tproc 6] $x | 
|---|
| 59 | } {7 42} | 
|---|
| 60 | test proc-old-2.2 {local and global variables} { | 
|---|
| 61 |     proc tproc x { | 
|---|
| 62 |         set y [expr $x+1] | 
|---|
| 63 |         return $y | 
|---|
| 64 |     } | 
|---|
| 65 |     set y 18 | 
|---|
| 66 |     list [tproc 6] $y | 
|---|
| 67 | } {7 18} | 
|---|
| 68 | test proc-old-2.3 {local and global variables} { | 
|---|
| 69 |     proc tproc x { | 
|---|
| 70 |         global y | 
|---|
| 71 |         set y [expr $x+1] | 
|---|
| 72 |         return $y | 
|---|
| 73 |     } | 
|---|
| 74 |     set y 189 | 
|---|
| 75 |     list [tproc 6] $y | 
|---|
| 76 | } {7 7} | 
|---|
| 77 | test proc-old-2.4 {local and global variables} { | 
|---|
| 78 |     proc tproc x { | 
|---|
| 79 |         global y | 
|---|
| 80 |         return [expr $x+$y] | 
|---|
| 81 |     } | 
|---|
| 82 |     set y 189 | 
|---|
| 83 |     list [tproc 6] $y | 
|---|
| 84 | } {195 189} | 
|---|
| 85 | catch {unset _undefined_} | 
|---|
| 86 | test proc-old-2.5 {local and global variables} { | 
|---|
| 87 |     proc tproc x { | 
|---|
| 88 |         global _undefined_ | 
|---|
| 89 |         return $_undefined_ | 
|---|
| 90 |     } | 
|---|
| 91 |     list [catch {tproc xxx} msg] $msg | 
|---|
| 92 | } {1 {can't read "_undefined_": no such variable}} | 
|---|
| 93 | test proc-old-2.6 {local and global variables} { | 
|---|
| 94 |     set a 114 | 
|---|
| 95 |     set b 115 | 
|---|
| 96 |     global a b | 
|---|
| 97 |     list $a $b | 
|---|
| 98 | } {114 115} | 
|---|
| 99 |  | 
|---|
| 100 | proc do {cmd} {eval $cmd} | 
|---|
| 101 | test proc-old-3.1 {local and global arrays} { | 
|---|
| 102 |     catch {unset a} | 
|---|
| 103 |     set a(0) 22 | 
|---|
| 104 |     list [catch {do {global a; set a(0)}} msg] $msg | 
|---|
| 105 | } {0 22} | 
|---|
| 106 | test proc-old-3.2 {local and global arrays} { | 
|---|
| 107 |     catch {unset a} | 
|---|
| 108 |     set a(x) 22 | 
|---|
| 109 |     list [catch {do {global a; set a(x) newValue}} msg] $msg $a(x) | 
|---|
| 110 | } {0 newValue newValue} | 
|---|
| 111 | test proc-old-3.3 {local and global arrays} { | 
|---|
| 112 |     catch {unset a} | 
|---|
| 113 |     set a(x) 22 | 
|---|
| 114 |     set a(y) 33 | 
|---|
| 115 |     list [catch {do {global a; unset a(y)}; array names a} msg] $msg | 
|---|
| 116 | } {0 x} | 
|---|
| 117 | test proc-old-3.4 {local and global arrays} { | 
|---|
| 118 |     catch {unset a} | 
|---|
| 119 |     set a(x) 22 | 
|---|
| 120 |     set a(y) 33 | 
|---|
| 121 |     list [catch {do {global a; unset a; info exists a}} msg] $msg \ | 
|---|
| 122 |             [info exists a] | 
|---|
| 123 | } {0 0 0} | 
|---|
| 124 | test proc-old-3.5 {local and global arrays} { | 
|---|
| 125 |     catch {unset a} | 
|---|
| 126 |     set a(x) 22 | 
|---|
| 127 |     set a(y) 33 | 
|---|
| 128 |     list [catch {do {global a; unset a(y); array names a}} msg] $msg | 
|---|
| 129 | } {0 x} | 
|---|
| 130 | catch {unset a} | 
|---|
| 131 | test proc-old-3.6 {local and global arrays} { | 
|---|
| 132 |     catch {unset a} | 
|---|
| 133 |     set a(x) 22 | 
|---|
| 134 |     set a(y) 33 | 
|---|
| 135 |     do {global a; do {global a; unset a}; set a(z) 22} | 
|---|
| 136 |     list [catch {array names a} msg] $msg | 
|---|
| 137 | } {0 z} | 
|---|
| 138 | test proc-old-3.7 {local and global arrays} { | 
|---|
| 139 |     proc t1 {args} {global info; set info 1} | 
|---|
| 140 |     catch {unset a} | 
|---|
| 141 |     set info {} | 
|---|
| 142 |     do {global a; trace var a(1) w t1} | 
|---|
| 143 |     set a(1) 44 | 
|---|
| 144 |     set info | 
|---|
| 145 | } 1 | 
|---|
| 146 | test proc-old-3.8 {local and global arrays} { | 
|---|
| 147 |     proc t1 {args} {global info; set info 1} | 
|---|
| 148 |     catch {unset a} | 
|---|
| 149 |     trace var a(1) w t1 | 
|---|
| 150 |     set info {} | 
|---|
| 151 |     do {global a; trace vdelete a(1) w t1} | 
|---|
| 152 |     set a(1) 44 | 
|---|
| 153 |     set info | 
|---|
| 154 | } {} | 
|---|
| 155 | test proc-old-3.9 {local and global arrays} { | 
|---|
| 156 |     proc t1 {args} {global info; set info 1} | 
|---|
| 157 |     catch {unset a} | 
|---|
| 158 |     trace var a(1) w t1 | 
|---|
| 159 |     do {global a; trace vinfo a(1)} | 
|---|
| 160 | } {{w t1}} | 
|---|
| 161 | catch {unset a} | 
|---|
| 162 |  | 
|---|
| 163 | test proc-old-30.1 {arguments and defaults} { | 
|---|
| 164 |     proc tproc {x y z} { | 
|---|
| 165 |         return [list $x $y $z] | 
|---|
| 166 |     } | 
|---|
| 167 |     tproc 11 12 13 | 
|---|
| 168 | } {11 12 13} | 
|---|
| 169 | test proc-old-30.2 {arguments and defaults} { | 
|---|
| 170 |     proc tproc {x y z} { | 
|---|
| 171 |         return [list $x $y $z] | 
|---|
| 172 |     } | 
|---|
| 173 |     list [catch {tproc 11 12} msg] $msg | 
|---|
| 174 | } {1 {wrong # args: should be "tproc x y z"}} | 
|---|
| 175 | test proc-old-30.3 {arguments and defaults} { | 
|---|
| 176 |     proc tproc {x y z} { | 
|---|
| 177 |         return [list $x $y $z] | 
|---|
| 178 |     } | 
|---|
| 179 |     list [catch {tproc 11 12 13 14} msg] $msg | 
|---|
| 180 | } {1 {wrong # args: should be "tproc x y z"}} | 
|---|
| 181 | test proc-old-30.4 {arguments and defaults} { | 
|---|
| 182 |     proc tproc {x {y y-default} {z z-default}} { | 
|---|
| 183 |         return [list $x $y $z] | 
|---|
| 184 |     } | 
|---|
| 185 |     tproc 11 12 13 | 
|---|
| 186 | } {11 12 13} | 
|---|
| 187 | test proc-old-30.5 {arguments and defaults} { | 
|---|
| 188 |     proc tproc {x {y y-default} {z z-default}} { | 
|---|
| 189 |         return [list $x $y $z] | 
|---|
| 190 |     } | 
|---|
| 191 |     tproc 11 12 | 
|---|
| 192 | } {11 12 z-default} | 
|---|
| 193 | test proc-old-30.6 {arguments and defaults} { | 
|---|
| 194 |     proc tproc {x {y y-default} {z z-default}} { | 
|---|
| 195 |         return [list $x $y $z] | 
|---|
| 196 |     } | 
|---|
| 197 |     tproc 11 | 
|---|
| 198 | } {11 y-default z-default} | 
|---|
| 199 | test proc-old-30.7 {arguments and defaults} { | 
|---|
| 200 |     proc tproc {x {y y-default} {z z-default}} { | 
|---|
| 201 |         return [list $x $y $z] | 
|---|
| 202 |     } | 
|---|
| 203 |     list [catch {tproc} msg] $msg | 
|---|
| 204 | } {1 {wrong # args: should be "tproc x ?y? ?z?"}} | 
|---|
| 205 | test proc-old-30.8 {arguments and defaults} { | 
|---|
| 206 |     list [catch { | 
|---|
| 207 |         proc tproc {x {y y-default} z} { | 
|---|
| 208 |             return [list $x $y $z] | 
|---|
| 209 |         } | 
|---|
| 210 |         tproc 2 3 | 
|---|
| 211 |     } msg] $msg | 
|---|
| 212 | } {1 {wrong # args: should be "tproc x ?y? z"}} | 
|---|
| 213 | test proc-old-30.9 {arguments and defaults} { | 
|---|
| 214 |     proc tproc {x {y y-default} args} { | 
|---|
| 215 |         return [list $x $y $args] | 
|---|
| 216 |     } | 
|---|
| 217 |     tproc 2 3 4 5 | 
|---|
| 218 | } {2 3 {4 5}} | 
|---|
| 219 | test proc-old-30.10 {arguments and defaults} { | 
|---|
| 220 |     proc tproc {x {y y-default} args} { | 
|---|
| 221 |         return [list $x $y $args] | 
|---|
| 222 |     } | 
|---|
| 223 |     tproc 2 3 | 
|---|
| 224 | } {2 3 {}} | 
|---|
| 225 | test proc-old-30.11 {arguments and defaults} { | 
|---|
| 226 |     proc tproc {x {y y-default} args} { | 
|---|
| 227 |         return [list $x $y $args] | 
|---|
| 228 |     } | 
|---|
| 229 |     tproc 2 | 
|---|
| 230 | } {2 y-default {}} | 
|---|
| 231 | test proc-old-30.12 {arguments and defaults} { | 
|---|
| 232 |     proc tproc {x {y y-default} args} { | 
|---|
| 233 |         return [list $x $y $args] | 
|---|
| 234 |     } | 
|---|
| 235 |     list [catch {tproc} msg] $msg | 
|---|
| 236 | } {1 {wrong # args: should be "tproc x ?y? ..."}} | 
|---|
| 237 |  | 
|---|
| 238 | test proc-old-4.1 {variable numbers of arguments} { | 
|---|
| 239 |     proc tproc args {return $args} | 
|---|
| 240 |     tproc | 
|---|
| 241 | } {} | 
|---|
| 242 | test proc-old-4.2 {variable numbers of arguments} { | 
|---|
| 243 |     proc tproc args {return $args} | 
|---|
| 244 |     tproc 1 2 3 4 5 6 7 8 | 
|---|
| 245 | } {1 2 3 4 5 6 7 8} | 
|---|
| 246 | test proc-old-4.3 {variable numbers of arguments} { | 
|---|
| 247 |     proc tproc args {return $args} | 
|---|
| 248 |     tproc 1 {2 3} {4 {5 6} {{{7}}}} 8 | 
|---|
| 249 | } {1 {2 3} {4 {5 6} {{{7}}}} 8} | 
|---|
| 250 | test proc-old-4.4 {variable numbers of arguments} { | 
|---|
| 251 |     proc tproc {x y args} {return $args} | 
|---|
| 252 |     tproc 1 2 3 4 5 6 7 | 
|---|
| 253 | } {3 4 5 6 7} | 
|---|
| 254 | test proc-old-4.5 {variable numbers of arguments} { | 
|---|
| 255 |     proc tproc {x y args} {return $args} | 
|---|
| 256 |     tproc 1 2 | 
|---|
| 257 | } {} | 
|---|
| 258 | test proc-old-4.6 {variable numbers of arguments} { | 
|---|
| 259 |     proc tproc {x missing args} {return $args} | 
|---|
| 260 |     list [catch {tproc 1} msg] $msg | 
|---|
| 261 | } {1 {wrong # args: should be "tproc x missing ..."}} | 
|---|
| 262 |  | 
|---|
| 263 | test proc-old-5.1 {error conditions} { | 
|---|
| 264 |     list [catch {proc} msg] $msg | 
|---|
| 265 | } {1 {wrong # args: should be "proc name args body"}} | 
|---|
| 266 | test proc-old-5.2 {error conditions} { | 
|---|
| 267 |     list [catch {proc tproc b} msg] $msg | 
|---|
| 268 | } {1 {wrong # args: should be "proc name args body"}} | 
|---|
| 269 | test proc-old-5.3 {error conditions} { | 
|---|
| 270 |     list [catch {proc tproc b c d e} msg] $msg | 
|---|
| 271 | } {1 {wrong # args: should be "proc name args body"}} | 
|---|
| 272 | test proc-old-5.4 {error conditions} { | 
|---|
| 273 |     list [catch {proc tproc \{xyz {return foo}} msg] $msg | 
|---|
| 274 | } {1 {unmatched open brace in list}} | 
|---|
| 275 | test proc-old-5.5 {error conditions} { | 
|---|
| 276 |     list [catch {proc tproc {{} y} {return foo}} msg] $msg | 
|---|
| 277 | } {1 {argument with no name}} | 
|---|
| 278 | test proc-old-5.6 {error conditions} { | 
|---|
| 279 |     list [catch {proc tproc {{} y} {return foo}} msg] $msg | 
|---|
| 280 | } {1 {argument with no name}} | 
|---|
| 281 | test proc-old-5.7 {error conditions} { | 
|---|
| 282 |     list [catch {proc tproc {{x 1 2} y} {return foo}} msg] $msg | 
|---|
| 283 | } {1 {too many fields in argument specifier "x 1 2"}} | 
|---|
| 284 | test proc-old-5.8 {error conditions} { | 
|---|
| 285 |     catch {return} | 
|---|
| 286 | } 2 | 
|---|
| 287 | test proc-old-5.9 {error conditions} { | 
|---|
| 288 |     list [catch {global} msg] $msg | 
|---|
| 289 | } {1 {wrong # args: should be "global varName ?varName ...?"}} | 
|---|
| 290 | proc tproc {} { | 
|---|
| 291 |     set a 22 | 
|---|
| 292 |     global a | 
|---|
| 293 | } | 
|---|
| 294 | test proc-old-5.10 {error conditions} { | 
|---|
| 295 |     list [catch {tproc} msg] $msg | 
|---|
| 296 | } {1 {variable "a" already exists}} | 
|---|
| 297 | test proc-old-5.11 {error conditions} { | 
|---|
| 298 |     catch {rename tproc {}} | 
|---|
| 299 |     catch { | 
|---|
| 300 |         proc tproc {x {} z} {return foo} | 
|---|
| 301 |     } | 
|---|
| 302 |     list [catch {tproc 1} msg] $msg | 
|---|
| 303 | } {1 {invalid command name "tproc"}} | 
|---|
| 304 | test proc-old-5.12 {error conditions} { | 
|---|
| 305 |     proc tproc {} { | 
|---|
| 306 |         set a 22 | 
|---|
| 307 |         error "error in procedure" | 
|---|
| 308 |         return | 
|---|
| 309 |     } | 
|---|
| 310 |     list [catch tproc msg] $msg | 
|---|
| 311 | } {1 {error in procedure}} | 
|---|
| 312 | test proc-old-5.13 {error conditions} { | 
|---|
| 313 |     proc tproc {} { | 
|---|
| 314 |         set a 22 | 
|---|
| 315 |         error "error in procedure" | 
|---|
| 316 |         return | 
|---|
| 317 |     } | 
|---|
| 318 |     catch tproc msg | 
|---|
| 319 |     set ::errorInfo | 
|---|
| 320 | } {error in procedure | 
|---|
| 321 |     while executing | 
|---|
| 322 | "error "error in procedure"" | 
|---|
| 323 |     (procedure "tproc" line 3) | 
|---|
| 324 |     invoked from within | 
|---|
| 325 | "tproc"} | 
|---|
| 326 | test proc-old-5.14 {error conditions} { | 
|---|
| 327 |     proc tproc {} { | 
|---|
| 328 |         set a 22 | 
|---|
| 329 |         break | 
|---|
| 330 |         return | 
|---|
| 331 |     } | 
|---|
| 332 |     catch tproc msg | 
|---|
| 333 |     set ::errorInfo | 
|---|
| 334 | } {invoked "break" outside of a loop | 
|---|
| 335 |     (procedure "tproc" line 1) | 
|---|
| 336 |     invoked from within | 
|---|
| 337 | "tproc"} | 
|---|
| 338 | test proc-old-5.15 {error conditions} { | 
|---|
| 339 |     proc tproc {} { | 
|---|
| 340 |         set a 22 | 
|---|
| 341 |         continue | 
|---|
| 342 |         return | 
|---|
| 343 |     } | 
|---|
| 344 |     catch tproc msg | 
|---|
| 345 |     set ::errorInfo | 
|---|
| 346 | } {invoked "continue" outside of a loop | 
|---|
| 347 |     (procedure "tproc" line 1) | 
|---|
| 348 |     invoked from within | 
|---|
| 349 | "tproc"} | 
|---|
| 350 | test proc-old-5.16 {error conditions} { | 
|---|
| 351 |     proc foo args { | 
|---|
| 352 |         global fooMsg | 
|---|
| 353 |         set fooMsg "foo was called: $args" | 
|---|
| 354 |     } | 
|---|
| 355 |     proc tproc {} { | 
|---|
| 356 |         set x 44 | 
|---|
| 357 |         trace var x u foo | 
|---|
| 358 |         while {$x < 100} { | 
|---|
| 359 |             error "Nested error" | 
|---|
| 360 |         } | 
|---|
| 361 |     } | 
|---|
| 362 |     set fooMsg "foo not called" | 
|---|
| 363 |     list [catch tproc msg] $msg $::errorInfo $fooMsg | 
|---|
| 364 | } {1 {Nested error} {Nested error | 
|---|
| 365 |     while executing | 
|---|
| 366 | "error "Nested error"" | 
|---|
| 367 |     (procedure "tproc" line 5) | 
|---|
| 368 |     invoked from within | 
|---|
| 369 | "tproc"} {foo was called: x {} u}} | 
|---|
| 370 |  | 
|---|
| 371 | # The tests below will really only be useful when run under Purify or | 
|---|
| 372 | # some other system that can detect accesses to freed memory... | 
|---|
| 373 |  | 
|---|
| 374 | test proc-old-6.1 {procedure that redefines itself} { | 
|---|
| 375 |     proc tproc {} { | 
|---|
| 376 |         proc tproc {} { | 
|---|
| 377 |             return 44 | 
|---|
| 378 |         } | 
|---|
| 379 |         return 45 | 
|---|
| 380 |     } | 
|---|
| 381 |     tproc | 
|---|
| 382 | } 45 | 
|---|
| 383 | test proc-old-6.2 {procedure that deletes itself} { | 
|---|
| 384 |     proc tproc {} { | 
|---|
| 385 |         rename tproc {} | 
|---|
| 386 |         return 45 | 
|---|
| 387 |     } | 
|---|
| 388 |     tproc | 
|---|
| 389 | } 45 | 
|---|
| 390 |  | 
|---|
| 391 | proc tproc code { | 
|---|
| 392 |     return -code $code abc | 
|---|
| 393 | } | 
|---|
| 394 | test proc-old-7.1 {return with special completion code} { | 
|---|
| 395 |     list [catch {tproc ok} msg] $msg | 
|---|
| 396 | } {0 abc} | 
|---|
| 397 | test proc-old-7.2 {return with special completion code} { | 
|---|
| 398 |     list [catch {tproc error} msg] $msg $::errorInfo $::errorCode | 
|---|
| 399 | } {1 abc {abc | 
|---|
| 400 |     while executing | 
|---|
| 401 | "tproc error"} NONE} | 
|---|
| 402 | test proc-old-7.3 {return with special completion code} { | 
|---|
| 403 |     list [catch {tproc return} msg] $msg | 
|---|
| 404 | } {2 abc} | 
|---|
| 405 | test proc-old-7.4 {return with special completion code} { | 
|---|
| 406 |     list [catch {tproc break} msg] $msg | 
|---|
| 407 | } {3 abc} | 
|---|
| 408 | test proc-old-7.5 {return with special completion code} { | 
|---|
| 409 |     list [catch {tproc continue} msg] $msg | 
|---|
| 410 | } {4 abc} | 
|---|
| 411 | test proc-old-7.6 {return with special completion code} { | 
|---|
| 412 |     list [catch {tproc -14} msg] $msg | 
|---|
| 413 | } {-14 abc} | 
|---|
| 414 | test proc-old-7.7 {return with special completion code} { | 
|---|
| 415 |     list [catch {tproc gorp} msg] $msg | 
|---|
| 416 | } {1 {bad completion code "gorp": must be ok, error, return, break, continue, or an integer}} | 
|---|
| 417 | test proc-old-7.8 {return with special completion code} { | 
|---|
| 418 |     list [catch {tproc 10b} msg] $msg | 
|---|
| 419 | } {1 {bad completion code "10b": must be ok, error, return, break, continue, or an integer}} | 
|---|
| 420 | test proc-old-7.9 {return with special completion code} { | 
|---|
| 421 |     proc tproc2 {} { | 
|---|
| 422 |         tproc return | 
|---|
| 423 |     } | 
|---|
| 424 |     list [catch tproc2 msg] $msg | 
|---|
| 425 | } {0 abc} | 
|---|
| 426 | test proc-old-7.10 {return with special completion code} { | 
|---|
| 427 |     proc tproc2 {} { | 
|---|
| 428 |         return -code error | 
|---|
| 429 |     } | 
|---|
| 430 |     list [catch tproc2 msg] $msg | 
|---|
| 431 | } {1 {}} | 
|---|
| 432 | test proc-old-7.11 {return with special completion code} { | 
|---|
| 433 |     proc tproc2 {} { | 
|---|
| 434 |         global errorCode errorInfo | 
|---|
| 435 |         catch {open _bad_file_name r} msg | 
|---|
| 436 |         return -code error -errorinfo $errorInfo -errorcode $errorCode $msg | 
|---|
| 437 |     } | 
|---|
| 438 |     set msg [list [catch tproc2 msg] $msg $::errorInfo $::errorCode] | 
|---|
| 439 |     regsub -all [file join {} _bad_file_name] $msg "_bad_file_name" msg | 
|---|
| 440 |     normalizeMsg $msg | 
|---|
| 441 | } {1 {couldn't open "_bad_file_name": no such file or directory} {couldn't open "_bad_file_name": no such file or directory | 
|---|
| 442 |     while executing | 
|---|
| 443 | "open _bad_file_name r" | 
|---|
| 444 |     invoked from within | 
|---|
| 445 | "tproc2"} {posix enoent {no such file or directory}}} | 
|---|
| 446 | test proc-old-7.12 {return with special completion code} { | 
|---|
| 447 |     proc tproc2 {} { | 
|---|
| 448 |         global errorCode errorInfo | 
|---|
| 449 |         catch {open _bad_file_name r} msg | 
|---|
| 450 |         return -code error -errorcode $errorCode $msg | 
|---|
| 451 |     } | 
|---|
| 452 |     set msg [list [catch tproc2 msg] $msg $::errorInfo $::errorCode] | 
|---|
| 453 |     regsub -all [file join {} _bad_file_name] $msg "_bad_file_name" msg | 
|---|
| 454 |     normalizeMsg $msg | 
|---|
| 455 | } {1 {couldn't open "_bad_file_name": no such file or directory} {couldn't open "_bad_file_name": no such file or directory | 
|---|
| 456 |     while executing | 
|---|
| 457 | "tproc2"} {posix enoent {no such file or directory}}} | 
|---|
| 458 | test proc-old-7.13 {return with special completion code} { | 
|---|
| 459 |     proc tproc2 {} { | 
|---|
| 460 |         global errorCode errorInfo | 
|---|
| 461 |         catch {open _bad_file_name r} msg | 
|---|
| 462 |         return -code error -errorinfo $errorInfo $msg | 
|---|
| 463 |     } | 
|---|
| 464 |     set msg [list [catch tproc2 msg] $msg $::errorInfo $::errorCode] | 
|---|
| 465 |     regsub -all [file join {} _bad_file_name] $msg "_bad_file_name" msg | 
|---|
| 466 |     normalizeMsg $msg | 
|---|
| 467 | } {1 {couldn't open "_bad_file_name": no such file or directory} {couldn't open "_bad_file_name": no such file or directory | 
|---|
| 468 |     while executing | 
|---|
| 469 | "open _bad_file_name r" | 
|---|
| 470 |     invoked from within | 
|---|
| 471 | "tproc2"} none} | 
|---|
| 472 | test proc-old-7.14 {return with special completion code} { | 
|---|
| 473 |     proc tproc2 {} { | 
|---|
| 474 |         global errorCode errorInfo | 
|---|
| 475 |         catch {open _bad_file_name r} msg | 
|---|
| 476 |         return -code error $msg | 
|---|
| 477 |     } | 
|---|
| 478 |     set msg [list [catch tproc2 msg] $msg $::errorInfo $::errorCode] | 
|---|
| 479 |     regsub -all [file join {} _bad_file_name] $msg "_bad_file_name" msg | 
|---|
| 480 |     normalizeMsg $msg | 
|---|
| 481 | } {1 {couldn't open "_bad_file_name": no such file or directory} {couldn't open "_bad_file_name": no such file or directory | 
|---|
| 482 |     while executing | 
|---|
| 483 | "tproc2"} none} | 
|---|
| 484 | test proc-old-7.15 {return with special completion code} { | 
|---|
| 485 |     list [catch {return -badOption foo message} msg] $msg | 
|---|
| 486 | } {2 message} | 
|---|
| 487 |  | 
|---|
| 488 | test proc-old-8.1 {unset and undefined local arrays} { | 
|---|
| 489 |     proc t1 {} { | 
|---|
| 490 |         foreach v {xxx, yyy} { | 
|---|
| 491 |             catch {unset $v} | 
|---|
| 492 |         } | 
|---|
| 493 |         set yyy(foo) bar | 
|---|
| 494 |     } | 
|---|
| 495 |     t1 | 
|---|
| 496 | } bar | 
|---|
| 497 |  | 
|---|
| 498 | test proc-old-9.1 {empty command name} { | 
|---|
| 499 |     catch {rename {} ""} | 
|---|
| 500 |     proc t1 {args} { | 
|---|
| 501 |         return | 
|---|
| 502 |     } | 
|---|
| 503 |     set v [t1] | 
|---|
| 504 |     catch {$v} | 
|---|
| 505 | } 1 | 
|---|
| 506 |  | 
|---|
| 507 | test proc-old-10.1 {ByteCode epoch change during recursive proc execution} { | 
|---|
| 508 |     proc t1 x { | 
|---|
| 509 |         set y 20 | 
|---|
| 510 |         rename expr expr.old | 
|---|
| 511 |         rename expr.old expr | 
|---|
| 512 |         if $x then {t1 0} ;# recursive call after foo's code is invalidated | 
|---|
| 513 |         return 20 | 
|---|
| 514 |     } | 
|---|
| 515 |     t1 1 | 
|---|
| 516 | } 20 | 
|---|
| 517 |  | 
|---|
| 518 | # cleanup | 
|---|
| 519 | catch {rename t1 ""} | 
|---|
| 520 | catch {rename foo ""} | 
|---|
| 521 | ::tcltest::cleanupTests | 
|---|
| 522 | return | 
|---|