#5227 tailcall clashes with execution traces

current: 8.6.0
open
miguel sofer
5
2013-04-09
2013-04-09
Don Porter
No

working on 3610393, I constructed this script to
see how ensemble redirections play with execution
traces, and found an issue with [tailcall]:

namespace eval foo {
namespace export *
proc target {} {puts Hit!}
proc bar {} {tailcall target}
namespace ensemble create
}
proc harness {} {
foo target
foo bar
}
proc handle {cmd args} {
puts "Command [lindex $cmd 0] resolves to:"
puts "\t'[uplevel 1 [list ::namespace which -command [lindex $cmd 0]]]'"
puts "\t\tResolved at level [uplevel 1 {info level}]"
}
trace add execution harness enterstep handle
harness

Output:

Command foo resolves to:
'::foo'
Resolved at level 1
Command ::foo::target resolves to:
'::foo::target'
Resolved at level 1
Command puts resolves to:
'::puts'
Resolved at level 2
Hit!
Command foo resolves to:
'::foo'
Resolved at level 1
Command ::foo::bar resolves to:
'::foo::bar'
Resolved at level 1
Command tailcall resolves to:
'::tailcall'
Resolved at level 2
Command target resolves to:
''
Resolved at level 1
Command puts resolves to:
'::puts'
Resolved at level 2
Hit!

The commonality with oo forwards is that
tailcall also causes command name resolution
to be done early, in a context that may/does not
appear in a stack frame at the time the command
execution (and its execution traces) fire.

Discussion