HvTOTALKEYS() takes a HV* as argument
authorSteffen Mueller <smueller@cpan.org>
Fri, 3 Feb 2017 08:06:41 +0000 (09:06 +0100)
committerSteffen Mueller <smueller@cpan.org>
Fri, 3 Feb 2017 08:25:55 +0000 (09:25 +0100)
Incidentally, it currently works on SV *'s as well because there's an
explicit cast after an SvANY. Let's not rely on that. This commit also
removes a pointless const in a cast. Again. It takes an HV * as argument.
Let's only change that if we have a strong reason to.

dump.c
hv.c
hv.h
pp_hot.c

diff --git a/dump.c b/dump.c
index 9eb26bc..52b52ca 100644 (file)
--- a/dump.c
+++ b/dump.c
@@ -1892,7 +1892,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
                              (UV)aux->xhv_aux_flags);
         }
        Perl_dump_indent(aTHX_ level, file, "  ARRAY = 0x%" UVxf, PTR2UV(HvARRAY(sv)));
-       usedkeys = HvUSEDKEYS(sv);
+       usedkeys = HvUSEDKEYS(MUTABLE_HV(sv));
        if (HvARRAY(sv) && usedkeys) {
            /* Show distribution of HEs in the ARRAY */
            int freq[200];
diff --git a/hv.c b/hv.c
index e9d5375..efeadb7 100644 (file)
--- a/hv.c
+++ b/hv.c
@@ -990,7 +990,7 @@ Perl_hv_bucket_ratio(pTHX_ HV *hv)
     }
 
     sv = sv_newmortal();
-    if (HvUSEDKEYS((const HV *)hv))
+    if (HvUSEDKEYS((HV *)hv))
         Perl_sv_setpvf(aTHX_ sv, "%ld/%ld",
                 (long)HvFILL(hv), (long)HvMAX(hv) + 1);
     else
diff --git a/hv.h b/hv.h
index b6b22df..8411b5d 100644 (file)
--- a/hv.h
+++ b/hv.h
@@ -325,7 +325,7 @@ C<SV*>.
    ((SvOOK(hv) && HvAUX(hv)->xhv_name_u.xhvnameu_name && HvAUX(hv)->xhv_name_count != -1) \
                                 ? HEK_UTF8(HvENAME_HEK_NN(hv)) : 0)
 
-/* the number of keys (including any placeholders) */
+/* the number of keys (including any placeholders) - NOT PART OF THE API */
 #define XHvTOTALKEYS(xhv)      ((xhv)->xhv_keys)
 
 /*
index aeaecfc..a3ee2a7 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -1039,7 +1039,7 @@ PP(pp_rv2av)
              || (  PL_op->op_private & OPpMAYBE_TRUEBOOL
                 && block_gimme() == G_VOID  ))
              && (!SvRMAGICAL(sv) || !mg_find(sv, PERL_MAGIC_tied)))
-           SETs(HvUSEDKEYS(sv) ? &PL_sv_yes : &PL_sv_no);
+           SETs(HvUSEDKEYS(MUTABLE_HV(sv)) ? &PL_sv_yes : &PL_sv_no);
        else if (gimme == G_SCALAR) {
            dTARG;
            TARG = Perl_hv_scalar(aTHX_ MUTABLE_HV(sv));