summaryrefslogtreecommitdiff
path: root/hv.c
diff options
context:
space:
mode:
authorDavid Mitchell <davem@iabyn.com>2017-07-19 09:11:33 +0100
committerDavid Mitchell <davem@iabyn.com>2017-07-27 11:30:24 +0100
commit87c9dcef06a83be89762b31d506a075cd0c79990 (patch)
tree98d7c5bb836a832edbc842d8b1a5f94a229d3740 /hv.c
parentaf3b1cba4fa1f9302496ccf5135bf61703227009 (diff)
downloadperl-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.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/hv.c b/hv.c
index 37518c4ff4..96228b398c 100644
--- a/hv.c
+++ b/hv.c
@@ -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));
}
}