> > I beleive there could be some sort of optimization when
> some things are done
> > at first invoke, and never done if subroutine never called...
> > But this is irrelevant in our case, I beleive.
>
> I don't find it irrelevant since it's this that makes Tcl drop
> ownership of the perl CV.
I meant relying on implementation/optimization details isn't a way to go.
Not "irrelevant" but rather "inapplicable"
> > > Perhaps there is no hope for getting rid of %anon_refs
> and the current
> > > CV leakage.
I think I got it.
Actually when I tried approach in pure-perl test code, I seem to reach the
needed behaviour.
First, I tried simple code borrowed from your example. I was surprised to
know that subroutine is different each loop iteration, and this helped me.
my $a = 1;
for (0..3) {
$s = sub { $a };
$srefs{"$s"}++;
}
print STDERR '[[',(join '++',sort keys %srefs),']]';
------------------------------
Then following code has all desired behaviour within subs, as they seem to
properly deleted at their time:
my %srefs; # srefs = "stringinfied references"
package better_sub;
sub DESTROY {
my $s = shift;
delete $srefs{"$s"};
print STDERR "I ($s) did my cleanup and go away\n";
}
package main;
my $a = 1;
for (0..3) {
$s = sub { $a };
bless $s, better_sub;
$t = $s if $_==2;
$srefs{"$s"}++;
}
#check if they are callable;
print STDERR '{{',$s->(),$s->(),$t->(),$t->(),"}}\n";
undef $s;
undef $t;
print STDERR '[[',(join '++',sort keys %srefs),']]';
----------------------------------------------------------------------
When I played with this (still simple) code, I came into conclusion that it
does what required. (otherwise please let me know)
I beleive you do not need to go to XS level to implement proper
de-allocation of subroutines.
Or, they could be pure-perl at first, and then go to XS for efficiency
later.
I can try to go this way to check the concept, but most likely this will be
at next weekend, so if you can try this approach sooner, please do so.
> > - keep Tcl-interpreter-wise %anon_refs, and delete all
> references from it
> > when interpreter is destroyed.
>
> I don't see much point in this as the Tcl interpreter will usually
> live as long as the app lives.
indeed.
Vadim.