> > 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

in my example I intentionally did not stored reference to subroutine into a
hash, so to remain reference count intact, and to check whether distruction
come in proper order

As I realized afterwards, the root of a problem is a bit on other side,
namely why the module releases CVs.


> 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.

yes, I clearly understand that.

While all code in newer Tcl.xs looks correct, I want to figure out
refcounting problem in more detail for myself.

Vadim.

Reply via email to