From: Nicholas Clark Date: Fri, 10 Jun 2005 12:44:30 +0000 (+0000) Subject: Work around bug 36211, plus a lot of TODO regression tests for local/ X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=404a4710121cff4198e389aea65a2912aad3c5d2;p=p5sagit%2Fp5-mst-13.2.git Work around bug 36211, plus a lot of TODO regression tests for local/ $#... interaction. p4raw-id: //depot/perl@24791 --- diff --git a/scope.c b/scope.c index 11c81bd..31a3ebc 100644 --- a/scope.c +++ b/scope.c @@ -755,6 +755,9 @@ Perl_leave_scope(pTHX_ I32 base) gv = (GV*)SSPOPPTR; if (GvAV(gv)) { AV * const goner = GvAV(gv); + /* FIXME - this is a temporary hack until we work out what + the correct behaviour for magic should be. */ + sv_unmagic((SV*)goner, PERL_MAGIC_arylen_p); SvMAGIC_set(av, SvMAGIC(goner)); SvFLAGS((SV*)av) |= SvMAGICAL(goner); SvMAGICAL_off(goner); diff --git a/t/op/array.t b/t/op/array.t index 956a934..698d4dc 100755 --- a/t/op/array.t +++ b/t/op/array.t @@ -2,12 +2,12 @@ BEGIN { chdir 't' if -d 't'; - @INC = '.', '../lib'; + @INC = ('.', '../lib'); } require 'test.pl'; -plan (91); +plan (111); # # @foo, @bar, and @ary are also used from tie-stdarray after tie-ing them @@ -294,3 +294,68 @@ sub test_arylen { test_arylen ($a); test_arylen (do {my @a; \$#a}); } + +{ + use vars '@array'; + + my $outer = \$#array; + is ($$outer, -1); + is (scalar @array, 0); + + $$outer = 3; + is ($$outer, 3); + is (scalar @array, 4); + + my $ref = \@array; + + local $TODO = '$#foo semantics with local @foo not fixed yet'; + + my $inner; + { + local @array; + $inner = \$#array; + + is ($$inner, -1); + is (scalar @array, 0); + $$outer = 6; + + is (scalar @$ref, 7); + + is ($$inner, -1); + is (scalar @array, 0); + + $$inner = 42; + } + + is (scalar @array, 7); + is ($$outer, 6); + + is ($$inner, 0, "This is emergent behaviour"); + + is (scalar @array, 7); + is ($$outer, 6); + + $$inner = 1; + + is (scalar @array, 7); + is ($$outer, 6); + + $$inner = 503; # Bang! + + is (scalar @array, 7); + is ($$outer, 6); +} + +{ + # Bug #36211 + use vars '@array'; + for (1,2) { + { + local @a; + is ($#a, -1); + @a=(1..4) + } + } +} + +"We're included by lib/Tie/Array/std.t so we need to return something true";