From ec7598c64132341ffec3934a78bad178846da36b Mon Sep 17 00:00:00 2001 From: Nicholas Clark Date: Fri, 3 Sep 2021 08:21:35 +0000 Subject: [PATCH] Use HvTOTALKEYS() in place of HvARRAY() in various boolean tests This is a better choice for an "is it empty?" optimisation, as HvARRAY() can be non-NULL even when there actually are no keys. --- dump.c | 8 ++++---- hv.c | 4 ++-- sv.c | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/dump.c b/dump.c index c5c2d9e6ef43..07a84b771308 100644 --- a/dump.c +++ b/dump.c @@ -686,7 +686,7 @@ Perl_dump_packsubs_perl(pTHX_ const HV *stash, bool justperl) PERL_ARGS_ASSERT_DUMP_PACKSUBS_PERL; - if (!HvARRAY(stash)) + if (!HvTOTALKEYS(stash)) return; for (i = 0; i <= (I32) HvMAX(stash); i++) { const HE *entry; @@ -2207,12 +2207,12 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo } if (nest < maxnest) { HV * const hv = MUTABLE_HV(sv); - STRLEN i; - HE *he; - if (HvARRAY(hv)) { + if (HvTOTALKEYS(hv)) { + STRLEN i; int count = maxnest - nest; for (i=0; i <= HvMAX(hv); i++) { + HE *he; for (he = HvARRAY(hv)[i]; he; he = HeNEXT(he)) { U32 hash; SV * keysv; diff --git a/hv.c b/hv.c index 05ed075aee31..1738c78785b3 100644 --- a/hv.c +++ b/hv.c @@ -1164,7 +1164,7 @@ S_hv_delete_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen, } } xhv = (XPVHV*)SvANY(hv); - if (!HvARRAY(hv)) + if (!HvTOTALKEYS(hv)) return NULL; if (is_utf8 && !(k_flags & HVhek_KEYCANONICAL)) { @@ -1809,7 +1809,7 @@ Perl_hv_clear(pTHX_ HV *hv) EXTEND_MORTAL(1); PL_tmps_stack[++PL_tmps_ix] = SvREFCNT_inc_simple_NN(hv); orig_ix = PL_tmps_ix; - if (SvREADONLY(hv) && HvARRAY(hv) != NULL) { + if (SvREADONLY(hv) && HvTOTALKEYS(hv)) { /* restricted hash: convert all keys to placeholders */ STRLEN i; for (i = 0; i <= xhv->xhv_max; i++) { diff --git a/sv.c b/sv.c index 286abc545e00..8d6650092373 100644 --- a/sv.c +++ b/sv.c @@ -9905,7 +9905,7 @@ Perl_sv_resetpvn(pTHX_ const char *s, STRLEN len, HV * const stash) /* reset variables */ - if (!HvARRAY(stash)) + if (!HvTOTALKEYS(stash)) return; Zero(todo, 256, char); @@ -16235,7 +16235,7 @@ S_find_hash_subscript(pTHX_ const HV *const hv, const SV *const val) PERL_ARGS_ASSERT_FIND_HASH_SUBSCRIPT; - if (!hv || SvMAGICAL(hv) || !HvARRAY(hv) || + if (!hv || SvMAGICAL(hv) || !HvTOTALKEYS(hv) || (HvTOTALKEYS(hv) > FUV_MAX_SEARCH_SIZE)) return NULL;