This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #77498] Assignment ignores magick when the RHS holds a glob
authorFather Chrysostomos <sprout@cpan.org>
Mon, 25 Oct 2010 17:00:47 +0000 (10:00 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Mon, 25 Oct 2010 17:45:57 +0000 (10:45 -0700)
pp.c
sv.c
t/op/gmagic.t

diff --git a/pp.c b/pp.c
index d05425c..6811ba0 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -221,7 +221,7 @@ PP(pp_rv2gv)
        save_gp(MUTABLE_GV(sv), !(PL_op->op_flags & OPf_SPECIAL));
     if (sv && SvFAKE(sv)) {
        SV *newsv = sv_newmortal();
-       sv_setsv(newsv, sv);
+       sv_setsv_flags(newsv, sv, 0);
        SvFAKE_off(newsv);
        SETs(newsv);
     }
diff --git a/sv.c b/sv.c
index 14b8b39..05e13e5 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -3933,22 +3933,17 @@ Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV* sstr, const I32 flags)
        /* case SVt_BIND: */
     case SVt_PVLV:
     case SVt_PVGV:
-       if (isGV_with_GP(sstr) && dtype <= SVt_PVLV) {
-           glob_assign_glob(dstr, sstr, dtype);
-           return;
-       }
        /* SvVALID means that this PVGV is playing at being an FBM.  */
-       /*FALLTHROUGH*/
 
     case SVt_PVMG:
        if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
            mg_get(sstr);
            if (SvTYPE(sstr) != stype)
                stype = SvTYPE(sstr);
-           if (isGV_with_GP(sstr) && dtype <= SVt_PVLV) {
+       }
+       if (isGV_with_GP(sstr) && dtype <= SVt_PVLV) {
                    glob_assign_glob(dstr, sstr, dtype);
                    return;
-           }
        }
        if (stype == SVt_PVLV)
            SvUPGRADE(dstr, SVt_PVNV);
index ce05aff..65441a6 100644 (file)
@@ -6,7 +6,7 @@ BEGIN {
     @INC = '../lib';
 }
 
-print "1..20\n";
+print "1..22\n";
 
 my $t = 1;
 tie my $c => 'Tie::Monitor';
@@ -54,6 +54,13 @@ ok_string($s, '00', 3, 1);
 $s = chop($c);
 ok_string($s, '0', 1, 1);
 
+# Assignment should not ignore magic when the last thing assigned
+# was a glob
+$c = *strat;
+$s = $c;
+ok_string $s, *strat, 1, 1;
+
+
 # adapted from Tie::Counter by Abigail
 package Tie::Monitor;