stop t/op/write.t failures under stdio by always closing files
[p5sagit/p5-mst-13.2.git] / hv.c
diff --git a/hv.c b/hv.c
index 097b599..cebf2f9 100644 (file)
--- a/hv.c
+++ b/hv.c
@@ -1005,6 +1005,7 @@ S_hv_delete_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen,
         * an error.
         */
        if (SvREADONLY(hv)) {
+           SvREFCNT_dec(HeVAL(entry));
            HeVAL(entry) = &PL_sv_placeholder;
            /* We'll be saving this slot, so the number of allocated keys
             * doesn't go down, but the number placeholders goes up */
@@ -1049,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);
@@ -1495,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)
@@ -1513,6 +1525,9 @@ Perl_hv_clear_placeholders(pTHX_ HV *hv)
                    HvPLACEHOLDERS(hv) = 0;
                    return;
                }
+           } else {
+               oentry = &HeNEXT(entry);
+               first = 0;
            }
        }
     } while (--i >= 0);