This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
corelist.pl - Update RMG to reflect recent changes
[perl5.git] / hv.c
diff --git a/hv.c b/hv.c
index 22d5603..3cb0b07 100644 (file)
--- a/hv.c
+++ b/hv.c
@@ -1062,8 +1062,7 @@ S_hv_delete_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen,
                Safefree(key);
            return NULL;
        }
-       if (SvREADONLY(hv) && HeVAL(entry) && SvREADONLY(HeVAL(entry))
-        && !SvIsCOW(HeVAL(entry))) {
+       if (SvREADONLY(hv) && HeVAL(entry) && SvREADONLY(HeVAL(entry))) {
            hv_notallowed(k_flags, key, klen,
                            "Attempt to delete readonly key '%"SVf"' from"
                            " a restricted hash");
@@ -1537,7 +1536,7 @@ Perl_hv_clear(pTHX_ HV *hv)
                /* not already placeholder */
                if (HeVAL(entry) != &PL_sv_placeholder) {
                    if (HeVAL(entry)) {
-                       if (SvREADONLY(HeVAL(entry)) && !SvIsCOW(HeVAL(entry))) {
+                       if (SvREADONLY(HeVAL(entry))) {
                            SV* const keysv = hv_iterkeysv(entry);
                            Perl_croak_nocontext(
                                "Attempt to delete readonly key '%"SVf"' from a restricted hash",
@@ -1828,10 +1827,10 @@ Perl_hv_undef_flags(pTHX_ HV *hv, U32 flags)
            SvREFCNT_dec(meta->mro_linear_current);
        SvREFCNT_dec(meta->mro_nextmethod);
        SvREFCNT_dec(meta->isa);
+       SvREFCNT_dec(meta->super);
        Safefree(meta);
        aux->xhv_mro_meta = NULL;
       }
-      SvREFCNT_dec(aux->xhv_super);
       if (!aux->xhv_name_u.xhvnameu_name && ! aux->xhv_backreferences)
        SvFLAGS(hv) &= ~SVf_OOK;
     }
@@ -1983,7 +1982,6 @@ S_hv_auxinit(pTHX_ HV *hv) {
     iter->xhv_name_count = 0;
     iter->xhv_backreferences = 0;
     iter->xhv_mro_meta = NULL;
-    iter->xhv_super = NULL;
     return iter;
 }
 
@@ -3124,12 +3122,12 @@ Perl_refcounted_he_fetch_pvn(pTHX_ const struct refcounted_he *chain,
        const char *keyend = keypv + keylen, *p;
        STRLEN nonascii_count = 0;
        for (p = keypv; p != keyend; p++) {
-           U8 c = (U8)*p;
-           if (c & 0x80) {
-               if (!((c & 0xfe) == 0xc2 && ++p != keyend &&
-                           (((U8)*p) & 0xc0) == 0x80))
+           if (! UTF8_IS_INVARIANT(*p)) {
+               if (! UTF8_IS_NEXT_CHAR_DOWNGRADEABLE(p, keyend)) {
                    goto canonicalised_key;
+                }
                nonascii_count++;
+                p++;
            }
        }
        if (nonascii_count) {
@@ -3141,8 +3139,13 @@ Perl_refcounted_he_fetch_pvn(pTHX_ const struct refcounted_he *chain,
            keypv = q;
            for (; p != keyend; p++, q++) {
                U8 c = (U8)*p;
-               *q = (char)
-                   ((c & 0x80) ? ((c & 0x03) << 6) | (((U8)*++p) & 0x3f) : c);
+                if (UTF8_IS_INVARIANT(c)) {
+                    *q = (char) c;
+                }
+                else {
+                    p++;
+                    *q = (char) TWO_BYTE_UTF8_TO_NATIVE(c, *p);
+                }
            }
        }
        flags &= ~REFCOUNTED_HE_KEY_UTF8;
@@ -3294,12 +3297,12 @@ Perl_refcounted_he_new_pvn(pTHX_ struct refcounted_he *parent,
        const char *keyend = keypv + keylen, *p;
        STRLEN nonascii_count = 0;
        for (p = keypv; p != keyend; p++) {
-           U8 c = (U8)*p;
-           if (c & 0x80) {
-               if (!((c & 0xfe) == 0xc2 && ++p != keyend &&
-                           (((U8)*p) & 0xc0) == 0x80))
+           if (! UTF8_IS_INVARIANT(*p)) {
+               if (! UTF8_IS_NEXT_CHAR_DOWNGRADEABLE(p, keyend)) {
                    goto canonicalised_key;
+                }
                nonascii_count++;
+                p++;
            }
        }
        if (nonascii_count) {
@@ -3311,8 +3314,13 @@ Perl_refcounted_he_new_pvn(pTHX_ struct refcounted_he *parent,
            keypv = q;
            for (; p != keyend; p++, q++) {
                U8 c = (U8)*p;
-               *q = (char)
-                   ((c & 0x80) ? ((c & 0x03) << 6) | (((U8)*++p) & 0x3f) : c);
+                if (UTF8_IS_INVARIANT(c)) {
+                    *q = (char) c;
+                }
+                else {
+                    p++;
+                    *q = (char) TWO_BYTE_UTF8_TO_NATIVE(c, *p);
+                }
            }
        }
        flags &= ~REFCOUNTED_HE_KEY_UTF8;