David Golden wrote:
> On Tue, Sep 9, 2008 at 6:10 PM, Michael G Schwern <[EMAIL PROTECTED]> wrote:
>> Taking a knife to CORE::caller() and then calling someone else's functions
>> and
>> expecting them to work is not a good idea.
>
> The problem is that we want Sub::Uplevel to do what people expect if
> they have already taken a knife to CORE::caller for some stupid
> reason, since nothing in Perl stops them from doing so.
Indeed, but that doesn't mean you need to wave a knife around in your tests.
It can be simulated just fine with a working caller() that increments a
variable.
>> After some poking around, the test fails because "use vars" depends on
>> caller() and caller() is bleeding on the floor. It used to work because
>> Test::More happened to load vars.pm before caller() got the knife. Now it
>> doesn't, it uses our().
>
> Looks like this is fixable in Sub::Uplevel just by avoiding vars.
> Since Schwern has declared 5.005 dead and the toolchain is moving on,
> I'll convert to "our" as well and make 5.006 a requirement.
[Slow motion leap towards the time bomb] Noooooooooooooooo!!!!!
With caller() broken, anything that Sub::Uplevel uses which depends on it
working may fail. This includes core dependencies, like Exporter which works
here only because Test::More loads it before caller() gets scrambled. It's a
matter of time before some dependency changes what loads again and the test
fails.
You can see it all go wrong again by cutting out Test::More.
$ cat ~/tmp/bug.plx
sub _reverse_caller(;$) {
my $height = $_[0];
my @caller = CORE::caller(++$height);
$caller[0] = reverse $caller[0];
if( wantarray and [EMAIL PROTECTED] ) {
return @caller[0..2];
}
elsif (wantarray) {
return @caller;
}
else {
return $caller[0];
}
}
BEGIN {
my $old_W = $^W;
$^W = 0;
*CORE::GLOBAL::caller = \&_reverse_caller;
$^W = $old_W;
}
use Sub::Uplevel;
uplevel(0, sub { print caller });
$ perl -Ilib ~/tmp/bug.plx
Undefined subroutine &main::uplevel called at /Users/schwern/tmp/bug.plx line
26.
And that's after I replaced all the uses of vars.pm with our().
--
I do have a cause though. It's obscenity. I'm for it.
- Tom Lehrer