This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Call get-magic once for *glob=$tied
authorFather Chrysostomos <sprout@cpan.org>
Thu, 8 Sep 2011 21:51:07 +0000 (14:51 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Fri, 9 Sep 2011 01:03:47 +0000 (18:03 -0700)
This is a regression in 5.10.0.

pod/perldelta.pod
sv.c
t/op/tie_fetch_count.t

index d7eddd7..f527418 100644 (file)
@@ -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
 
diff --git a/sv.c b/sv.c
index f555e44..bb9dbd3 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -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);
index 5337c05..41d7308 100644 (file)
@@ -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 +";