X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Fop%2Flocal.t;h=8bfea00b9a4006b5b7fe19f5d58dd0d63b5fe82b;hb=21fa6956243df9cb622bebfa0934ea7923519b4f;hp=a186a705590c8533101ac34d84b43a984c220cc7;hpb=4cb09e0a8a1169d65b9839bce3178d5bddd79127;p=p5sagit%2Fp5-mst-13.2.git diff --git a/t/op/local.t b/t/op/local.t index a186a70..8bfea00 100755 --- a/t/op/local.t +++ b/t/op/local.t @@ -2,9 +2,10 @@ BEGIN { chdir 't' if -d 't'; + @INC = qw(. ../lib); require './test.pl'; } -plan tests => 87; +plan tests => 122; my $list_assignment_supported = 1; @@ -342,3 +343,122 @@ is($@, ""); sub f { ok(0 == $[); } +# sub localisation +{ + package Other; + + sub f1 { "f1" } + sub f2 { "f2" } + + no warnings "redefine"; + { + local *f1 = sub { "g1" }; + ::ok(f1() eq "g1", "localised sub via glob"); + } + ::ok(f1() eq "f1", "localised sub restored"); + { + local $Other::{"f1"} = sub { "h1" }; + ::ok(f1() eq "h1", "localised sub via stash"); + } + ::ok(f1() eq "f1", "localised sub restored"); + { + local @Other::{qw/ f1 f2 /} = (sub { "j1" }, sub { "j2" }); + ::ok(f1() eq "j1", "localised sub via stash slice"); + ::ok(f2() eq "j2", "localised sub via stash slice"); + } + ::ok(f1() eq "f1", "localised sub restored"); + ::ok(f2() eq "f2", "localised sub restored"); +} + +# Localising unicode keys (bug #38815) +{ + my %h; + $h{"\243"} = "pound"; + $h{"\302\240"} = "octects"; + is(scalar keys %h, 2); + { + my $unicode = chr 256; + my $ambigous = "\240" . $unicode; + chop $ambigous; + local $h{$unicode} = 256; + local $h{$ambigous} = 160; + + is(scalar keys %h, 4); + is($h{"\243"}, "pound"); + is($h{$unicode}, 256); + is($h{$ambigous}, 160); + is($h{"\302\240"}, "octects"); + } + is(scalar keys %h, 2); + is($h{"\243"}, "pound"); + is($h{"\302\240"}, "octects"); +} + +# And with slices +{ + my %h; + $h{"\243"} = "pound"; + $h{"\302\240"} = "octects"; + is(scalar keys %h, 2); + { + my $unicode = chr 256; + my $ambigous = "\240" . $unicode; + chop $ambigous; + local @h{$unicode, $ambigous} = (256, 160); + + is(scalar keys %h, 4); + is($h{"\243"}, "pound"); + is($h{$unicode}, 256); + is($h{$ambigous}, 160); + is($h{"\302\240"}, "octects"); + } + is(scalar keys %h, 2); + is($h{"\243"}, "pound"); + is($h{"\302\240"}, "octects"); +} + +# [perl #39012] localizing @_ element then shifting frees element too # soon + +{ + my $x; + my $y = bless [], 'X39012'; + sub X39012::DESTROY { $x++ } + sub { local $_[0]; shift }->($y); + ok(!$x, '[perl #39012]'); + +} + +# when localising a hash element, the key should be copied, not referenced + +{ + my %h=('k1' => 111); + my $k='k1'; + { + local $h{$k}=222; + + is($h{'k1'},222); + $k='k2'; + } + ok(! exists($h{'k2'})); + is($h{'k1'},111); +} +{ + my %h=('k1' => 111); + our $k = 'k1'; # try dynamic too + { + local $h{$k}=222; + is($h{'k1'},222); + $k='k2'; + } + ok(! exists($h{'k2'})); + is($h{'k1'},111); +} + +# Keep this test last, as it can SEGV +{ + local *@; + pass("Localised *@"); + eval {1}; + pass("Can eval with *@ localised"); +} +