use strict; use warnings;
use PadWalker;
# All these bugs were reported by Dave Mitchell; he's the first
# person to get his very own test script.
print "1..8\n";
# Does PadWalker work if it's called from a closure?
sub f {
my $x = shift;
sub {
my $t = shift;
my $x_val = ${PadWalker::peek_my(0)->{'$x'}};
print ($x_val eq $x ? "ok $t\n" : "not ok $t # $x_val\n");
}
}
f(6)->(1);
# Even if the sub 'f' has been blown away?
my $f = f('eh?');
undef &f;
$f->(2);
# If there's no reference to the value, we expect to get undef;
# if there is, we expect to get the value.
sub h {
my $x = my $y = 'fixed';
sub {
my $vals = PadWalker::peek_my(0);
my $x_ref = $vals->{'$x'};
my $y_ref = $vals->{'$y'};
# There is a difference in behaviour between different versions
# of Perl here. Since a0d2bbd5c47035a4f7369e4fddd46b502764d86e
# we don’t see unclosed variables in the pad at all.
print (!defined($x_ref)||!defined($$x_ref) ? "ok 3\n" : "not ok 3 # $x_ref\n");
print (defined($y_ref) ? "ok 4\n" : "not ok 4\n");
print ($$y_ref eq 'fixed' ? "ok 5\n" : "not ok 5 # $$y_ref\n");
my $unused = $y;
}
}
h()->();
# How well do we cope with one variable masking another?
my $x = 1;
sub g {
my $x = 2;
my $v_x = ${PadWalker::peek_my(0)->{'$x'}};
print ($v_x eq 2 ? "ok 6\n" : "not ok 6 # $v_x\n");
}
g();
no warnings 'misc'; # I know it masks an earlier declaration -
# that's the whole point!
my $x = 'final value';
my $v_x = ${PadWalker::peek_my(0)->{'$x'}};
print ($v_x eq $x ? "ok 7\n" : "not ok 7 # $v_x\n");
# An 'our' variable should mask a 'my':
our $x;
$x = $x; # Stop old perls from giving 'used only once' warning
print (exists PadWalker::peek_my(0)->{'$x'} ? "not ok 8\n" : "ok 8\n");