X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=hv.c;h=cebf2f9d250a6edb6e57346996758fa44ae4d019;hb=68ba3c2c674c6fecf165cdd3b5e4da501410ba1a;hp=e71759f9ae30daf4308ada1f7dfd562345ec3fca;hpb=752f6c60047f2fe3834832a1654d72ea5afe3f22;p=p5sagit%2Fp5-mst-13.2.git diff --git a/hv.c b/hv.c index e71759f..cebf2f9 100644 --- a/hv.c +++ b/hv.c @@ -1038,11 +1038,6 @@ S_hv_delete_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen, STATIC void S_hsplit(pTHX_ HV *hv) { - /* Can't make this clear any placeholders first for non-restricted hashes, - as Storable rebuilds restricted hashes by putting in all the - placeholders (first) before turning on the readonly flag. Hence midway - through restoring the hash there are placeholders which need to remain - even though the hash isn't (currently) flagged as restricted. */ register XPVHV* xhv = (XPVHV*)SvANY(hv); I32 oldsize = (I32) xhv->xhv_max+1; /* HvMAX(hv)+1 (sick) */ register I32 newsize = oldsize * 2; @@ -1055,6 +1050,17 @@ S_hsplit(pTHX_ HV *hv) int longest_chain = 0; int was_shared; + /*PerlIO_printf(PerlIO_stderr(), "hsplit called for %p which had %d\n", + hv, (int) oldsize);*/ + + if (HvPLACEHOLDERS(hv) && !SvREADONLY(hv)) { + /* Can make this clear any placeholders first for non-restricted hashes, + even though Storable rebuilds restricted hashes by putting in all the + placeholders (first) before turning on the readonly flag, because + Storable always pre-splits the hash. */ + hv_clear_placeholders(hv); + } + PL_nomemok = TRUE; #if defined(STRANGE_MALLOC) || defined(MYMALLOC) Renew(a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char); @@ -1501,7 +1507,7 @@ Perl_hv_clear_placeholders(pTHX_ HV *hv) if (!entry) continue; - for (; entry; first=0, oentry = &HeNEXT(entry), entry = *oentry) { + for (; entry; entry = *oentry) { if (HeVAL(entry) == &PL_sv_placeholder) { *oentry = HeNEXT(entry); if (first && !*oentry) @@ -1519,6 +1525,9 @@ Perl_hv_clear_placeholders(pTHX_ HV *hv) HvPLACEHOLDERS(hv) = 0; return; } + } else { + oentry = &HeNEXT(entry); + first = 0; } } } while (--i >= 0);