Posted to tcl by sebres at Thu Apr 11 20:04:14 GMT 2019view pretty

set result {}
proc foo args {}
set BaseFrameLevel [info frame]
eval {
  lappend result [expr {[info frame] - $BaseFrameLevel}] [regexp -inline {^\S+} [dict get [info frame -1] cmd]]
  trace add execution foo enter list
  lappend result [expr {[info frame] - $BaseFrameLevel}] [regexp -inline {^\S+} [dict get [info frame -1] cmd]]
  puts $result
}

set result {}
proc foo args {}
set BaseFrameLevel [info frame]
eval {
  lappend result [expr {[info frame] - $BaseFrameLevel}] [regexp -inline {^\S+} [dict get [info frame -1] cmd]]
  foo 1 2 3 4 5 6; ## ********** no interp traces active, just invokeStk1 get out from tebcresume.
  lappend result [expr {[info frame] - $BaseFrameLevel}] [regexp -inline {^\S+} [dict get [info frame -1] cmd]]
  puts $result
}

set result {}
proc foo args {return}; ## ********** note return!!
set BaseFrameLevel [info frame]
eval {
  lappend result [expr {[info frame] - $BaseFrameLevel}] [regexp -inline {^\S+} [dict get [info frame -1] cmd]]
  trace add execution foo enter list
  lappend result [expr {[info frame] - $BaseFrameLevel}] [regexp -inline {^\S+} [dict get [info frame -1] cmd]]
  puts $result
}
return

Comments

Posted by sebres at Thu Apr 11 20:28:24 GMT 2019 [text] [code]

## so forget trace... ## if it is replaced with something else causing change of compileEpoch, ## e.g. `rename bar buz`... you'd see the same result (1 eval 2 lappend): set result {} proc bar args {} proc foo args {} set BaseFrameLevel [info frame] eval { lappend result [expr {[info frame] - $BaseFrameLevel}] [regexp -inline {^\S+} [dict get [info frame -1] cmd]] rename bar buz; ## ********** cause change of compileEpoch. lappend result [expr {[info frame] - $BaseFrameLevel}] [regexp -inline {^\S+} [dict get [info frame -1] cmd]] puts $result }