#endif
#if defined(PERL_IN_HV_C)
-s |void |hsplit |NN HV *hv
+s |void |hsplit |NN HV *hv|STRLEN const oldsize|STRLEN newsize
s |void |hfreeentries |NN HV *hv
s |SV* |hv_free_ent_ret|NN HV *hv|NN HE *entry
sa |HE* |new_he
# if defined(PERL_IN_HV_C)
#define clear_placeholders(a,b) S_clear_placeholders(aTHX_ a,b)
#define hfreeentries(a) S_hfreeentries(aTHX_ a)
-#define hsplit(a) S_hsplit(aTHX_ a)
+#define hsplit(a,b,c) S_hsplit(aTHX_ a,b,c)
#define hv_auxinit S_hv_auxinit
#define hv_delete_common(a,b,c,d,e,f,g) S_hv_delete_common(aTHX_ a,b,c,d,e,f,g)
#define hv_free_ent_ret(a,b) S_hv_free_ent_ret(aTHX_ a,b)
xhv->xhv_keys++; /* HvTOTALKEYS(hv)++ */
if ( DO_HSPLIT(xhv) ) {
+ const STRLEN oldsize = xhv->xhv_max + 1;
+
/* This logic was in S_hsplit, but as the shared string table can't
contain placeholders, and we are the only other caller of S_hsplit,
it could only trigger from this callsite. So move it here. */
readonly flag, because Storable always pre-splits the hash. */
hv_clear_placeholders(hv);
}
- hsplit(hv);
+ hsplit(hv, oldsize, oldsize * 2);
}
if (return_svp) {
}
STATIC void
-S_hsplit(pTHX_ HV *hv)
+S_hsplit(pTHX_ HV *hv, STRLEN const oldsize, STRLEN newsize)
{
dVAR;
- XPVHV* const xhv = (XPVHV*)SvANY(hv);
- const I32 oldsize = (I32) xhv->xhv_max+1; /* HvMAX(hv)+1 (sick) */
- I32 newsize = oldsize * 2;
- I32 i;
+ STRLEN i;
char *a = (char*) HvARRAY(hv);
HE **aep;
PL_nomemok = FALSE;
Zero(&a[oldsize * sizeof(HE*)], (newsize-oldsize) * sizeof(HE*), char); /* zero 2nd half*/
- xhv->xhv_max = --newsize; /* HvMAX(hv) = --newsize */
+ HvMAX(hv) = --newsize;
HvARRAY(hv) = (HE**) a;
aep = (HE**)a;
xhv->xhv_keys++; /* HvTOTALKEYS(hv)++ */
if (!next) { /* initial entry? */
} else if ( DO_HSPLIT(xhv) ) {
- hsplit(PL_strtab);
+ const STRLEN oldsize = xhv->xhv_max + 1;
+ hsplit(PL_strtab, oldsize, oldsize * 2);
}
}
#define PERL_ARGS_ASSERT_HFREEENTRIES \
assert(hv)
-STATIC void S_hsplit(pTHX_ HV *hv)
+STATIC void S_hsplit(pTHX_ HV *hv, STRLEN const oldsize, STRLEN newsize)
__attribute__nonnull__(pTHX_1);
#define PERL_ARGS_ASSERT_HSPLIT \
assert(hv)