This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
sv.c: Don’t flip flags so many times in glob_assign_glob
authorFather Chrysostomos <sprout@cpan.org>
Thu, 13 Feb 2014 22:32:22 +0000 (14:32 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Sat, 15 Feb 2014 15:01:39 +0000 (07:01 -0800)
We only need to turn off the SvOK flags when the destination was not
already a glob.

Up till now, the code was doing SvOK_off twice, and
isGV_with_GP_on/off several times to avoid assertion failures.

If we already have a glob, then the only SvOK flags that can be on
already are SVpgv_GP (which needs to be on) and possibly SVf_UTF8,
which is harmless.

The only difference is that now the dumped glob in this one-liner will
have its UTF8 flag set:

$ ./perl -Ilib -MDevel::Peek -e 'use utf8; "".*φου; *φου = *bar; Dump *φου'

whereas it didn’t before.  That is of no consequence, as the UTF8 flag
is only meaningful after stringification, which resets it.

sv.c

diff --git a/sv.c b/sv.c
index 89b5a89..48f5dc7 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -3713,8 +3713,6 @@ S_glob_assign_glob(pTHX_ SV *const dstr, SV *const sstr, const int dtype)
            }
            SvUPGRADE(dstr, SVt_PVGV);
            (void)SvOK_off(dstr);
-           /* We have to turn this on here, even though we turn it off
-              below, as GvSTASH will fail an assertion otherwise. */
            isGV_with_GP_on(dstr);
        }
        GvSTASH(dstr) = GvSTASH(sstr);
@@ -3778,9 +3776,6 @@ S_glob_assign_glob(pTHX_ SV *const dstr, SV *const sstr, const int dtype)
     }
 
     gp_free(MUTABLE_GV(dstr));
-    isGV_with_GP_off(dstr); /* SvOK_off does not like globs. */
-    (void)SvOK_off(dstr);
-    isGV_with_GP_on(dstr);
     GvINTRO_off(dstr);         /* one-shot flag */
     GvGP_set(dstr, gp_ref(GvGP(sstr)));
     if (SvTAINTED(sstr))