diff options
author | Father Chrysostomos <sprout@cpan.org> | 2011-09-08 14:51:07 -0700 |
---|---|---|
committer | Father Chrysostomos <sprout@cpan.org> | 2011-09-08 18:03:47 -0700 |
commit | 8d4393cf0f53c9e46fd1338d29417f254bd6d1cd (patch) | |
tree | 5fe7a45e7a313ecc3c4d932384cb4987001ad8f0 | |
parent | a9feb6cb11fbf4270519aa7318b89f5becccd87c (diff) | |
download | perl-8d4393cf0f53c9e46fd1338d29417f254bd6d1cd.tar.gz |
Call get-magic once for *glob=$tied
This is a regression in 5.10.0.
-rw-r--r-- | pod/perldelta.pod | 3 | ||||
-rw-r--r-- | sv.c | 6 | ||||
-rw-r--r-- | t/op/tie_fetch_count.t | 6 |
3 files changed, 12 insertions, 3 deletions
diff --git a/pod/perldelta.pod b/pod/perldelta.pod index d7eddd7c4f..f5274185bc 100644 --- a/pod/perldelta.pod +++ b/pod/perldelta.pod @@ -543,7 +543,8 @@ equivalent to C<setpgrp($foo,0)>. =item * -An assignment like C<*$tied = \&{"..."}> now calls FETCH only once. +Assignments like C<*$tied = \&{"..."}> and C<*glob = $tied> now call FETCH +only once. =back @@ -4161,7 +4161,11 @@ Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV* sstr, const I32 flags) "Undefined value assigned to typeglob"); } else { - GV *gv = gv_fetchsv(sstr, GV_ADD, SVt_PVGV); + STRLEN len; + const char *nambeg = SvPV_nomg_const(sstr, len); + GV *gv = gv_fetchpvn_flags( + nambeg, len, SvUTF8(sstr)|GV_ADD, SVt_PVGV + ); if (dstr != (const SV *)gv) { const char * const name = GvNAME((const GV *)dstr); const STRLEN len = GvNAMELEN(dstr); diff --git a/t/op/tie_fetch_count.t b/t/op/tie_fetch_count.t index 5337c05277..41d73087bf 100644 --- a/t/op/tie_fetch_count.t +++ b/t/op/tie_fetch_count.t @@ -7,7 +7,7 @@ BEGIN { chdir 't' if -d 't'; @INC = '../lib'; require './test.pl'; - plan (tests => 219); + plan (tests => 220); } use strict; @@ -43,6 +43,10 @@ tie my $var => 'main', 1; # Assignment. $dummy = $var ; check_count "="; +{ + no warnings 'once'; + *dummy = $var ; check_count '*glob = $tied'; +} # Unary +/- $dummy = +$var ; check_count "unary +"; |