diff options
author | David Mitchell <davem@iabyn.com> | 2017-07-19 09:11:33 +0100 |
---|---|---|
committer | David Mitchell <davem@iabyn.com> | 2017-07-27 11:30:24 +0100 |
commit | 87c9dcef06a83be89762b31d506a075cd0c79990 (patch) | |
tree | 98d7c5bb836a832edbc842d8b1a5f94a229d3740 /hv.c | |
parent | af3b1cba4fa1f9302496ccf5135bf61703227009 (diff) | |
download | perl-87c9dcef06a83be89762b31d506a075cd0c79990.tar.gz |
Perl_hv_pushkv(): unroll hv_iterkeysv()
Do our own mortal stack extending and handling.
Diffstat (limited to 'hv.c')
-rw-r--r-- | hv.c | 18 |
1 files changed, 12 insertions, 6 deletions
@@ -995,14 +995,20 @@ Perl_hv_pushkv(pTHX_ HV *hv) } } else { - SSize_t extend_size; - /* 2*HvUSEDKEYS() should never be big enough to truncate or wrap */ - assert(HvUSEDKEYS(hv) <= (SSize_t_MAX >> 1)); - extend_size = (SSize_t)HvUSEDKEYS(hv) * 2; - EXTEND(SP, extend_size); + Size_t nkeys = HvUSEDKEYS(hv); + SSize_t nkv; + /* 2*nkeys() should never be big enough to truncate or wrap */ + assert(nkeys <= (SSize_t_MAX >> 1)); + nkv = nkeys * 2; + + EXTEND_MORTAL(nkeys); + EXTEND(SP, nkv); while ((entry = hv_iternext(hv))) { - PUSHs(hv_iterkeysv(entry)); + SV *keysv = newSVhek(HeKEY_hek(entry)); + SvTEMP_on(keysv); + PL_tmps_stack[++PL_tmps_ix] = keysv; + PUSHs(keysv); PUSHs(HeVAL(entry)); } } |