diff options
-rw-r--r-- | hv.c | 5 | ||||
-rw-r--r-- | sv.c | 4 |
2 files changed, 5 insertions, 4 deletions
@@ -1663,11 +1663,12 @@ S_hfreeentries(pTHX_ HV *hv) { STRLEN index = 0; XPVHV * const xhv = (XPVHV*)SvANY(hv); + SV *sv; PERL_ARGS_ASSERT_HFREEENTRIES; - while (xhv->xhv_keys) { - SvREFCNT_dec(Perl_hfree_next_entry(aTHX_ hv, &index)); + while ((sv = Perl_hfree_next_entry(aTHX_ hv, &index))||xhv->xhv_keys) { + SvREFCNT_dec(sv); } } @@ -6180,7 +6180,8 @@ Perl_sv_clear(pTHX_ SV *const orig_sv) goto free_body; } } else if (SvTYPE(iter_sv) == SVt_PVHV) { - if (!HvTOTALKEYS((HV *)iter_sv)) { + sv = Perl_hfree_next_entry(aTHX_ (HV*)iter_sv, &hash_index); + if (!sv && !HvTOTALKEYS((HV *)iter_sv)) { /* no more elements of current HV to free */ sv = iter_sv; type = SvTYPE(sv); @@ -6197,7 +6198,6 @@ Perl_sv_clear(pTHX_ SV *const orig_sv) assert(!HvARRAY((HV*)sv)); goto free_body; } - sv = Perl_hfree_next_entry(aTHX_ (HV*)iter_sv, &hash_index); } /* unrolled SvREFCNT_dec and sv_free2 follows: */ |