summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2005-06-10 12:44:30 +0000
committerNicholas Clark <nick@ccl4.org>2005-06-10 12:44:30 +0000
commit404a4710121cff4198e389aea65a2912aad3c5d2 (patch)
treea67d8892f0e1415ee021755fed73948ec1101c47
parent89780818b8545f3b36cf310b8bd887e641799cc2 (diff)
downloadperl-404a4710121cff4198e389aea65a2912aad3c5d2.tar.gz
Work around bug 36211, plus a lot of TODO regression tests for local/
$#... interaction. p4raw-id: //depot/perl@24791
-rw-r--r--scope.c3
-rwxr-xr-xt/op/array.t69
2 files changed, 70 insertions, 2 deletions
diff --git a/scope.c b/scope.c
index 11c81bde94..31a3ebc44b 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 956a934290..698d4dc5a1 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";