proc get_location {} {
set caller_framelevel [expr [info frame] - 1]
set up [expr $caller_framelevel - 1]
set fr [expr $caller_framelevel - 0]
set location "[uplevel $up {info script}]:[dict get [info frame $fr] line]"
return $location
}
proc p1 {} {
puts [get_location]
}
puts [get_location]
if {true} {
puts [get_location]
if {1} {
puts [get_location]
}
}
proc p2 {} {
p1
}
proc p3 {} {
eval "p1"
}
proc p4 {} {
uplevel 1 {p1}
}
proc try {procname} {
puts "== $procname =="
catch {eval $procname} err
if {$err!=""} {puts "$err\n"}
}
try p1
try p2
try p3
try p4
cHJvYyBnZXRfbG9jYXRpb24ge30gewoJc2V0IGNhbGxlcl9mcmFtZWxldmVsIFtleHByIFtpbmZvIGZyYW1lXSAtIDFdCglzZXQgdXAgW2V4cHIgJGNhbGxlcl9mcmFtZWxldmVsIC0gMV0KCXNldCBmciBbZXhwciAkY2FsbGVyX2ZyYW1lbGV2ZWwgLSAwXQoJc2V0IGxvY2F0aW9uICJbdXBsZXZlbCAkdXAge2luZm8gc2NyaXB0fV06W2RpY3QgZ2V0IFtpbmZvIGZyYW1lICRmcl0gbGluZV0iCglyZXR1cm4gJGxvY2F0aW9uCn0KCnByb2MgcDEge30gewoJcHV0cyBbZ2V0X2xvY2F0aW9uXQp9CgpwdXRzIFtnZXRfbG9jYXRpb25dCgppZiB7dHJ1ZX0gewoJcHV0cyBbZ2V0X2xvY2F0aW9uXQoKCWlmIHsxfSB7CgkJcHV0cyBbZ2V0X2xvY2F0aW9uXQoJfQp9Cgpwcm9jIHAyIHt9IHsKCXAxCn0KCnByb2MgcDMge30gewoJZXZhbCAicDEiCn0KCnByb2MgcDQge30gewoJdXBsZXZlbCAxIHtwMX0KfQoKcHJvYyB0cnkge3Byb2NuYW1lfSB7CglwdXRzICI9PSAkcHJvY25hbWUgPT0iCgljYXRjaCB7ZXZhbCAkcHJvY25hbWV9IGVycgoJaWYgeyRlcnIhPSIifSB7cHV0cyAiJGVyclxuIn0KfQoKdHJ5IHAxCnRyeSBwMgp0cnkgcDMKdHJ5IHA0Cg==