This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Perl_hv_fill() can return early if the hash only has 0 or 1 keys.
authorNicholas Clark <nick@ccl4.org>
Mon, 11 Mar 2013 11:18:11 +0000 (11:18 +0000)
committerNicholas Clark <nick@ccl4.org>
Mon, 27 May 2013 08:36:27 +0000 (10:36 +0200)
No keys implies no chains used, so the return value is 0. One key
unambiguously means 1 chain used, and all the others are free. Two or more
keys might share the same chain, or might not, so the calculation can't be
short-circuited.

hv.c

diff --git a/hv.c b/hv.c
index 6476f51..916b64b 100644 (file)
--- a/hv.c
+++ b/hv.c
@@ -1844,6 +1844,11 @@ Perl_hv_fill(pTHX_ HV const *const hv)
 
     PERL_ARGS_ASSERT_HV_FILL;
 
 
     PERL_ARGS_ASSERT_HV_FILL;
 
+    /* No keys implies no buckets used.
+       One key can only possibly mean one bucket used.  */
+    if (HvTOTALKEYS(hv) < 2)
+        return HvTOTALKEYS(hv);
+
     if (ents) {
        HE *const *const last = ents + HvMAX(hv);
        count = last + 1 - ents;
     if (ents) {
        HE *const *const last = ents + HvMAX(hv);
        count = last + 1 - ents;