This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Renumber SVf_IsCOW
authorFather Chrysostomos <sprout@cpan.org>
Sat, 20 Sep 2014 04:48:27 +0000 (21:48 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Sat, 20 Sep 2014 16:25:01 +0000 (09:25 -0700)
and free up a bit.

dump.c
sv.c
sv.h

diff --git a/dump.c b/dump.c
index c848dcd..ccfa8b5 100644 (file)
--- a/dump.c
+++ b/dump.c
@@ -1307,9 +1307,7 @@ const struct flag_to_name second_sv_flags_names[] = {
     {SVf_OOK, "OOK,"},
     {SVf_FAKE, "FAKE,"},
     {SVf_READONLY, "READONLY,"},
-    {SVf_IsCOW, "IsCOW,"},
     {SVf_BREAK, "BREAK,"},
-    {SVf_AMAGIC, "OVERLOAD,"},
     {SVp_IOK, "pIOK,"},
     {SVp_NOK, "pNOK,"},
     {SVp_POK, "pPOK,"}
@@ -1339,6 +1337,7 @@ const struct flag_to_name hv_flags_names[] = {
     {SVphv_SHAREKEYS, "SHAREKEYS,"},
     {SVphv_LAZYDEL, "LAZYDEL,"},
     {SVphv_HASKFLAGS, "HASKFLAGS,"},
+    {SVf_AMAGIC, "OVERLOAD,"},
     {SVphv_CLONEABLE, "CLONEABLE,"}
 };
 
@@ -1442,6 +1441,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
                                sv_catpv(d, "ROK,");
        if (SvWEAKREF(sv))      sv_catpv(d, "WEAKREF,");
     }
+    if (flags & SVf_IsCOW && type != SVt_PVHV) sv_catpvs(d, "IsCOW,");
     append_flags(d, flags, second_sv_flags_names);
     if (flags & SVp_SCREAM && type != SVt_PVHV && !isGV_with_GP(sv)
                           && type != SVt_PVAV) {
diff --git a/sv.c b/sv.c
index 566c0e6..8e88d31 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -5155,7 +5155,7 @@ Perl_sv_force_normal_flags(pTHX_ SV *const sv, const U32 flags)
 
     if (SvREADONLY(sv))
        Perl_croak_no_modify();
-    else if (SvIsCOW(sv))
+    else if (SvIsCOW(sv) && LIKELY(SvTYPE(sv) != SVt_PVHV))
        S_sv_uncow(aTHX_ sv, flags);
     if (SvROK(sv))
        sv_unref_flags(sv, flags);
diff --git a/sv.h b/sv.h
index f3d2e4e..fee683f 100644 (file)
--- a/sv.h
+++ b/sv.h
@@ -362,8 +362,6 @@ perform the upgrade if necessary.  See C<svtype>.
                                       GvIMPORTED_CV_on() if it needs to be
                                       expanded to a real GV */
 #define SVpad_NAMELIST SVp_SCREAM  /* AV is a padnamelist */
-#define SVf_IsCOW      0x00010000  /* copy on write (shared hash key if
-                                      SvLEN == 0) */
 #define SVs_PADTMP     0x00020000  /* in use as tmp; only if ! SVs_PADMY */
 #define SVs_PADSTALE   0x00020000  /* lexical has gone out of scope;
                                        only valid for SVs_PADMY */
@@ -403,10 +401,10 @@ perform the upgrade if necessary.  See C<svtype>.
 
 #define PRIVSHIFT 4    /* (SVp_?OK >> PRIVSHIFT) == SVf_?OK */
 
+/* Note that SVf_AMAGIC is now only set on stashes.  */
 #define SVf_AMAGIC     0x10000000  /* has magical overloaded methods */
-
-/* note that SVf_AMAGIC is now only set on stashes, so this bit is free
- * for non-HV SVs */
+#define SVf_IsCOW      0x10000000  /* copy on write (shared hash key if
+                                      SvLEN == 0) */
 
 /* Ensure this value does not clash with the GV_ADD* flags in gv.h, or the
    CV_CKPROTO_* flags in op.c, or the padadd_* flags in pad.h: */