Gisle Aas <[EMAIL PROTECTED]> writes: > The current Tcl.pm code works because it does '$srefs{"$s"} = $s' > instead of the '$srefs{"$s"}++' you do above. This keeps the code > alive even after $s and $t are cleared.
Looking closer this isn't really true. The $srefs reference is not really needed as the client data saved in XS(Tcl_CreateCommand) also contains a reference to the CV. This reference is cleared in Tcl_PerlCallDeleteProc if the Tcl command is deleted. Consider this test program: use Tcl; use Devel::Peek; my $i = Tcl->new; my $cv = sub { $i }; Dump($cv); $i->call("puts", $cv); Dump($cv); You will see that the REFCNT on the $cv is 1 before the $i->call and 3 after. The reason it is 3 is that %anon_refs stores one reference and the client data of the Tcl command created stores another. The only reason for the %anon_refs reference seems to be to make $i->return_ref($name) able to return it. It's not needed to keep the CV alive until Tcl calls it. --Gisle