summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2011-09-08 14:51:07 -0700
committerFather Chrysostomos <sprout@cpan.org>2011-09-08 18:03:47 -0700
commit8d4393cf0f53c9e46fd1338d29417f254bd6d1cd (patch)
tree5fe7a45e7a313ecc3c4d932384cb4987001ad8f0
parenta9feb6cb11fbf4270519aa7318b89f5becccd87c (diff)
downloadperl-8d4393cf0f53c9e46fd1338d29417f254bd6d1cd.tar.gz
Call get-magic once for *glob=$tied
This is a regression in 5.10.0.
-rw-r--r--pod/perldelta.pod3
-rw-r--r--sv.c6
-rw-r--r--t/op/tie_fetch_count.t6
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
diff --git a/sv.c b/sv.c
index f555e44c36..bb9dbd3723 100644
--- 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);
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 +";