Updated for Second Edition.
[p5sagit/p5-mst-13.2.git] / av.c
diff --git a/av.c b/av.c
index dfd25df..cad6eae 100644 (file)
--- a/av.c
+++ b/av.c
@@ -153,12 +153,19 @@ I32 lval;
        return av_store(av,key,sv);
     }
     if (AvARRAY(av)[key] == &sv_undef) {
+    emptyness:
        if (lval) {
            sv = NEWSV(6,0);
            return av_store(av,key,sv);
        }
        return 0;
     }
+    else if (AvREIFY(av)
+            && (!AvARRAY(av)[key]      /* eg. @_ could have freed elts */
+                || SvTYPE(AvARRAY(av)[key]) == SVTYPEMASK)) {
+       AvARRAY(av)[key] = &sv_undef;   /* 1/2 reify */
+       goto emptyness;
+    }
     return &AvARRAY(av)[key];
 }
 
@@ -327,10 +334,6 @@ register AV *av;
        while (key)
            SvREFCNT_dec(AvARRAY(av)[--key]);
     }
-    if (key = AvARRAY(av) - AvALLOC(av)) {
-       AvMAX(av) += key;
-       SvPVX(av) = (char*)AvALLOC(av);
-    }
     Safefree(AvALLOC(av));
     AvALLOC(av) = 0;
     SvPVX(av) = 0;