Do I understand correctly that you don't want to call $orig_destroy in your version to avoid the leak (from it looking at $^V) but also don't want to look at $^V yourself, which you might condition off of to decide whether $orig_destroy should run, in case that leaks? Can you use the old version variable $] instead or would that also leak?
Duane Bronson <[email protected]> writes: > By the time we update to a new version of Perl, I will not likely > remember this kludge, so I'm hoping to future-proof it. > > Calling $orig_destroy will still run "unless ($^V ...)" and thus leak > memory, so I can't future-proof that way. Now, if I can add a > destructor to the class 'version', maybe I can future proof that way, > although I've tried that and failed. I think it might be a bug in the > comparison logic (overloading?), but I can't find that code. Is that > built into perl? > > Duane > >> On Dec 13, 2016, at 4:30 PM, Ben Tilly <[email protected]> wrote: >> >> Module upgrades may not be likely, but I was responding to the first >> question which was: >> >> "...I suspect there are better methods that won't break with a future >> version of IO::All." >> >> On Tue, Dec 13, 2016 at 1:26 PM, Conor Walsh <[email protected] >> <mailto:[email protected]>> wrote: >> On Tue, Dec 13, 2016 at 4:20 PM, Ben Tilly <[email protected] >> <mailto:[email protected]>> wrote: >> > The reason to call the original DESTROY is so that if a future version of >> > IO::All adds logic to the DESTROY, you will still run that new code. >> >> This is an excellent point, but it does not sound like surprise module >> upgrades are a likely problem in Duane's world. >> > > >> On Dec 13, 2016, at 4:20 PM, Ben Tilly <[email protected]> wrote: >> >> The reason to call the original DESTROY is so that if a future version of >> IO::All adds logic to the DESTROY, you will still run that new code. While >> still running the code that you know you need to run. >> >> In fact I would suggest the following instead: >> >> use IO::All; >> { >> no warnings 'redefine'; >> my $orig_destroy = *IO::All::DESTROY{CODE}; >> sub IO::All::DESTROY { >> my $self = shift; >> no warnings; >> untie *$self if tied *$self; >> $orig_destroy->($self, @_) if $orig_destroy; >> } >> } >> >> Now the custom code that you run is limited to what you are afraid that >> their DESTROY gets wrong. >> >> (Note that my original version had a bug. I said IO::ALL::DESTROY when it >> needed to be IO::All::DESTROY.) > > > > > Duane Bronson > [email protected] <mailto:[email protected]> > http://www.nerdlogic.com/ <http://www.nerdlogic.com/> > 5 Goden St. > Belmont, MA 02478 > 617.515.2909 > > > > > > _______________________________________________ > Boston-pm mailing list > [email protected] > http://mail.pm.org/mailman/listinfo/boston-pm > -- Mike Small [email protected] _______________________________________________ Boston-pm mailing list [email protected] http://mail.pm.org/mailman/listinfo/boston-pm

