From: David Mitchell Date: Tue, 4 May 2010 13:37:04 +0000 (+0100) Subject: make 'local $tied' untied X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=191ad7eff570fc96c93993e4358f83e2033365d6;p=p5sagit%2Fp5-mst-13.2.git make 'local $tied' untied When localising a tied scalar, don't make the scalar tied --- diff --git a/mg.c b/mg.c index ccb5b82..7c7c03e 100644 --- a/mg.c +++ b/mg.c @@ -179,6 +179,7 @@ S_is_container_magic(const MAGIC *mg) case PERL_MAGIC_rhash: case PERL_MAGIC_symtab: case PERL_MAGIC_tied: /* treat as value, so 'local @tied' isn't tied */ + case PERL_MAGIC_tiedscalar: /* so 'local $scalar' isn't tied */ return 0; default: return 1; diff --git a/t/op/local.t b/t/op/local.t index f664df4..fababb7 100644 --- a/t/op/local.t +++ b/t/op/local.t @@ -5,7 +5,7 @@ BEGIN { @INC = qw(. ../lib); require './test.pl'; } -plan tests => 306; +plan tests => 310; my $list_assignment_supported = 1; @@ -781,6 +781,33 @@ like( runperl(stderr => 1, 'index(q(a), foo);' . 'local *g=${::}{foo};print q(ok);'), "ok", "[perl #52740]"); +# localising a tied scalar should give you an untied var +{ + package TS; + sub TIESCALAR { bless \my $self, shift } + + my $s; + sub FETCH { $s .= ":F=${$_[0]}"; ${$_[0]} } + sub STORE { $s .= ":S($_[1])"; ${$_[0]} = $_[1]; } + + package main; + tie $ts, 'TS'; + $ts = 1; + { + $s .= ':L1'; + local $ts; + $s .= ':L2'; + is($ts, undef, 'local tied scalar initially undef'); + $ts = 2; + is($ts, 2, 'local tied scalar now has a value'); + $s .= ':E'; + } + is($ts, 1, 'restored tied scalar has correct value'); + $ts = 3; + is($s, ':S(1):L1:F=1:L2:E:F=1:S(3)', + "local tied scalar shouldn't call methods"); +} + # Keep this test last, as it can SEGV { local *@;