trace.test
来自「tcl是工具命令语言」· TEST 代码 · 共 2,078 行 · 第 1/5 页
TEST
2,078 行
set info {} trace add execution foo leave [list traceDelete foo] foo 1 list $info [catch {trace info execution foo} res] $res} {{{foo 1} 0 1 leave} 1 {unknown command "foo"}}proc foo {a} { set b $a}test trace-25.3 {delete command during enter then leave trace} { set info {} trace add execution foo enter [list traceDelete foo] trace add execution foo leave [list traceDelete foo] catch {foo 1} err list $err $info [catch {trace info execution foo} res] $res} {{invalid command name "foo"} {{foo 1} enter} 1 {unknown command "foo"}}proc foo {a} { set b $a}proc traceExecute2 {args} { global info lappend info $args}# This shows the peculiar consequences of having two traces# at the same time: as well as tracing the procedure you wanttest trace-25.4 {order dependencies of two enter traces} { set info {} trace add execution foo enter [list traceExecute traceExecute] trace add execution foo enter [list traceExecute2 traceExecute2] catch {foo 1} err trace remove execution foo enter [list traceExecute traceExecute] trace remove execution foo enter [list traceExecute2 traceExecute2] join [list $err [join $info \n] [trace info execution foo]] "\n"} {1traceExecute2 {foo 1} entertraceExecute {foo 1} enter}test trace-25.5 {order dependencies of two step traces} { set info {} trace add execution foo enterstep [list traceExecute traceExecute] trace add execution foo enterstep [list traceExecute2 traceExecute2] catch {foo 1} err trace remove execution foo enterstep [list traceExecute traceExecute] trace remove execution foo enterstep [list traceExecute2 traceExecute2] join [list $err [join $info \n] [trace info execution foo]] "\n"} {1traceExecute2 {set b 1} entersteptraceExecute {set b 1} enterstep}# We don't want the result string (5th argument), or the results# will get unmanageable.proc tracePostExecute {args} { global info lappend info [concat [lrange $args 0 2] [lindex $args 4]]}proc tracePostExecute2 {args} { global info lappend info [concat [lrange $args 0 2] [lindex $args 4]]}test trace-25.6 {order dependencies of two leave traces} { set info {} trace add execution foo leave [list tracePostExecute tracePostExecute] trace add execution foo leave [list tracePostExecute2 tracePostExecute2] catch {foo 1} err trace remove execution foo leave [list tracePostExecute tracePostExecute] trace remove execution foo leave [list tracePostExecute2 tracePostExecute2] join [list $err [join $info \n] [trace info execution foo]] "\n"} {1tracePostExecute {foo 1} 0 leavetracePostExecute2 {foo 1} 0 leave}test trace-25.7 {order dependencies of two leavestep traces} { set info {} trace add execution foo leavestep [list tracePostExecute tracePostExecute] trace add execution foo leavestep [list tracePostExecute2 tracePostExecute2] catch {foo 1} err trace remove execution foo leavestep [list tracePostExecute tracePostExecute] trace remove execution foo leavestep [list tracePostExecute2 tracePostExecute2] join [list $err [join $info \n] [trace info execution foo]] "\n"} {1tracePostExecute {set b 1} 0 leavesteptracePostExecute2 {set b 1} 0 leavestep}proc foo {a} { set b $a}proc traceDelete {cmd args} { rename $cmd {} global info set info $args}test trace-25.8 {delete command during enter leave and enter/leave-step traces} { set info {} trace add execution foo enter [list traceDelete foo] trace add execution foo leave [list traceDelete foo] trace add execution foo enterstep [list traceDelete foo] trace add execution foo leavestep [list traceDelete foo] catch {foo 1} err list $err $info [catch {trace info execution foo} res] $res} {{invalid command name "foo"} {{foo 1} enter} 1 {unknown command "foo"}}proc foo {a} { set b $a}test trace-25.9 {delete command during enter leave and leavestep traces} { set info {} trace add execution foo enter [list traceDelete foo] trace add execution foo leave [list traceDelete foo] trace add execution foo leavestep [list traceDelete foo] catch {foo 1} err list $err $info [catch {trace info execution foo} res] $res} {{invalid command name "foo"} {{foo 1} enter} 1 {unknown command "foo"}}proc foo {a} { set b $a}test trace-25.10 {delete command during leave and leavestep traces} { set info {} trace add execution foo leave [list traceDelete foo] trace add execution foo leavestep [list traceDelete foo] catch {foo 1} err list $err $info [catch {trace info execution foo} res] $res} {1 {{set b 1} 0 1 leavestep} 1 {unknown command "foo"}}proc foo {a} { set b $a}test trace-25.11 {delete command during enter and enterstep traces} { set info {} trace add execution foo enter [list traceDelete foo] trace add execution foo enterstep [list traceDelete foo] catch {foo 1} err list $err $info [catch {trace info execution foo} res] $res} {{invalid command name "foo"} {{foo 1} enter} 1 {unknown command "foo"}}test trace-26.1 {trace targetCmd when invoked through an alias} { proc foo {args} { set b $args } set info {} trace add execution foo enter [list traceExecute foo] interp alias {} bar {} foo 1 bar 2 trace remove execution foo enter [list traceExecute foo] set info} {{foo {foo 1 2} enter}}test trace-26.2 {trace targetCmd when invoked through an alias} { proc foo {args} { set b $args } set info {} trace add execution foo enter [list traceExecute foo] interp create child interp alias child bar {} foo 1 child eval bar 2 interp delete child trace remove execution foo enter [list traceExecute foo] set info} {{foo {foo 1 2} enter}}test trace-27.1 {memory leak in rename trace (604609)} { catch {rename bar {}} proc foo {} {error foo} trace add command foo rename {rename foo "" ;#} rename foo bar info commands foo} {}test trace-27.2 {command trace remove nonsense} { list [catch {trace remove command thisdoesntexist \ {delete rename} bar} res] $res} {1 {unknown command "thisdoesntexist"}}test trace-27.3 {command trace info nonsense} { list [catch {trace info command thisdoesntexist} res] $res} {1 {unknown command "thisdoesntexist"}}test trace-28.1 {enterstep and leavestep traces with update idletasks (615043)} { catch {rename foo {}} proc foo {} { set a 1 update idletasks set b 1 } set info {} trace add execution foo {enter enterstep leavestep leave} \ [list traceExecute foo] update after idle {set a "idle"} foo trace remove execution foo {enter enterstep leavestep leave} \ [list traceExecute foo] rename foo {} catch {unset a} join $info "\n"} {foo foo enterfoo {set a 1} enterstepfoo {set a 1} 0 1 leavestepfoo {update idletasks} enterstepfoo {set a idle} enterstepfoo {set a idle} 0 idle leavestepfoo {update idletasks} 0 {} leavestepfoo {set b 1} enterstepfoo {set b 1} 0 1 leavestepfoo foo 0 1 leave}test trace-28.2 {exec traces with 'error'} { set info {} set res {} proc foo {} { if {[catch {bar}]} { return "error" } else { return "ok" } } proc bar {} { error "msg" } lappend res [foo] trace add execution foo {enter enterstep leave leavestep} \ [list traceExecute foo] # With the trace active lappend res [foo] trace remove execution foo {enter enterstep leave leavestep} \ [list traceExecute foo] list $res [join $info \n]} {{error error} {foo foo enterfoo {if {[catch {bar}]} { return "error" } else { return "ok" }} enterstepfoo {catch bar} enterstepfoo bar enterstepfoo {error msg} enterstepfoo {error msg} 1 msg leavestepfoo bar 1 msg leavestepfoo {catch bar} 0 1 leavestepfoo {return error} enterstepfoo {return error} 2 error leavestepfoo {if {[catch {bar}]} { return "error" } else { return "ok" }} 2 error leavestepfoo foo 0 error leave}}test trace-28.3 {exec traces with 'return -code error'} { set info {} set res {} proc foo {} { if {[catch {bar}]} { return "error" } else { return "ok" } } proc bar {} { return -code error "msg" } lappend res [foo] trace add execution foo {enter enterstep leave leavestep} \ [list traceExecute foo] # With the trace active lappend res [foo] trace remove execution foo {enter enterstep leave leavestep} \ [list traceExecute foo] list $res [join $info \n]} {{error error} {foo foo enterfoo {if {[catch {bar}]} { return "error" } else { return "ok" }} enterstepfoo {catch bar} enterstepfoo bar enterstepfoo {return -code error msg} enterstepfoo {return -code error msg} 2 msg leavestepfoo bar 1 msg leavestepfoo {catch bar} 0 1 leavestepfoo {return error} enterstepfoo {return error} 2 error leavestepfoo {if {[catch {bar}]} { return "error" } else { return "ok" }} 2 error leavestepfoo foo 0 error leave}}test trace-28.4 {exec traces in slave with 'return -code error'} {knownBug} { interp create slave interp alias slave traceExecute {} traceExecute set res [interp eval slave { set info {} set res {} proc foo {} { if {[catch {bar}]} { return "error" } else { return "ok" } } proc bar {} { return -code error "msg" } lappend res [foo] trace add execution foo {enter enterstep leave leavestep} \ [list traceExecute foo] # With the trace active lappend res [foo] trace remove execution foo {enter enterstep leave leavestep} \ [list traceExecute foo] list $res [join $info \n] }] interp delete slave set res} {{error error} {foo foo enterfoo {if {[catch {bar}]} { return "error" } else { return "ok" }} enterstepfoo {catch bar} enterstepfoo bar enterstepfoo {return -code error msg} enterstepfoo {return -code error msg} 2 msg leavestepfoo bar 1 msg leavestepfoo {catch bar} 0 1 leavestepfoo {return error} enterstepfoo {return error} 2 error leavestepfoo {if {[catch {bar}]} { return "error" } else { return "ok" }} 2 error leavestepfoo foo 0 error leave}}test trace-28.5 {exec traces} { set info {} proc foo {args} { set a 1 } trace add execution foo {enter enterstep leave leavestep} \ [list traceExecute foo] after idle [list foo test-28.4] update # Complicated way of removing traces set ti [lindex [eval [list trace info execution ::foo]] 0] if {[llength $ti]} { eval [concat [list trace remove execution foo] $ti] } join $info \n} {foo {foo test-28.4} enterfoo {set a 1} enterstepfoo {set a 1} 0 1 leavestepfoo {foo test-28.4} 0 1 leave}test trace-28.6 {exec traces firing order} { set info {} proc enterStep {cmd op} {lappend ::info "enter $cmd/$op"} proc leaveStep {cmd code result op} {lappend ::info "leave $cmd/$code/$result/$op"} proc foo x { set b x=$x incr x } trace add execution foo enterstep enterStep trace add execution foo leavestep leaveStep foo 42 rename foo {} join $info \n} {enter set b x=42/enterstepleave set b x=42/0/x=42/leavestepenter incr x/enterstepleave incr x/0/43/leavestep}test trace-28.7 {exec trace information} { set info {} proc foo x { incr x } proc bar {args} {} trace add execution foo {enter leave en
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?