perl 3.0 patch #30 patch #29, continued
[p5sagit/p5-mst-13.2.git] / array.c
diff --git a/array.c b/array.c
index 6875d28..aff66ca 100644 (file)
--- a/array.c
+++ b/array.c
@@ -1,4 +1,4 @@
-/* $Header: array.c,v 3.0 89/10/18 15:08:33 lwall Locked $
+/* $Header: array.c,v 3.0.1.3 90/10/15 14:56:17 lwall Locked $
  *
  *    Copyright (c) 1989, Larry Wall
  *
@@ -6,6 +6,15 @@
  *    as specified in the README file that comes with the perl 3.0 kit.
  *
  * $Log:       array.c,v $
+ * Revision 3.0.1.3  90/10/15  14:56:17  lwall
+ * patch29: non-existent array values no longer cause core dumps
+ * 
+ * Revision 3.0.1.2  90/08/13  21:52:20  lwall
+ * patch28: defined(@array) and defined(%array) didn't work right
+ * 
+ * Revision 3.0.1.1  89/11/17  15:02:52  lwall
+ * patch5: nested foreach on same array didn't work
+ * 
  * Revision 3.0  89/10/18  15:08:33  lwall
  * 3.0 baseline
  * 
@@ -32,12 +41,15 @@ int lval;
            return str;
        }
        else
-           return Nullstr;
+           return &str_undef;
     }
-    if (lval && !ar->ary_array[key]) {
-       str = Str_new(6,0);
-       (void)astore(ar,key,str);
-       return str;
+    if (!ar->ary_array[key]) {
+       if (lval) {
+           str = Str_new(6,0);
+           (void)astore(ar,key,str);
+           return str;
+       }
+       return &str_undef;
     }
     return ar->ary_array[key];
 }
@@ -67,10 +79,16 @@ STR *val;
            }
        }
        else {
-           newmax = key + ar->ary_max / 5;
-         resize:
-           Renew(ar->ary_alloc,newmax+1, STR*);
-           Zero(&ar->ary_alloc[ar->ary_max+1], newmax - ar->ary_max, STR*);
+           if (ar->ary_alloc) {
+               newmax = key + ar->ary_max / 5;
+             resize:
+               Renew(ar->ary_alloc,newmax+1, STR*);
+               Zero(&ar->ary_alloc[ar->ary_max+1], newmax - ar->ary_max, STR*);
+           }
+           else {
+               newmax = key < 4 ? 4 : key;
+               Newz(2,ar->ary_alloc, newmax+1, STR*);
+           }
            ar->ary_array = ar->ary_alloc;
            ar->ary_max = newmax;
        }
@@ -97,13 +115,10 @@ STAB *stab;
     register ARRAY *ar;
 
     New(1,ar,1,ARRAY);
-    Newz(2,ar->ary_alloc,5,STR*);
-    ar->ary_array = ar->ary_alloc;
     ar->ary_magic = Str_new(7,0);
+    ar->ary_alloc = ar->ary_array = 0;
     str_magic(ar->ary_magic, stab, '#', Nullch, 0);
-    ar->ary_fill = -1;
-    ar->ary_index = -1;
-    ar->ary_max = 4;
+    ar->ary_max = ar->ary_fill = -1;
     ar->ary_flags = ARF_REAL;
     return ar;
 }
@@ -123,7 +138,6 @@ STR **strp;
     ar->ary_magic = Str_new(8,0);
     str_magic(ar->ary_magic, stab, '#', Nullch, 0);
     ar->ary_fill = size - 1;
-    ar->ary_index = -1;
     ar->ary_max = size - 1;
     ar->ary_flags = 0;
     return ar;
@@ -135,7 +149,7 @@ register ARRAY *ar;
 {
     register int key;
 
-    if (!ar || !(ar->ary_flags & ARF_REAL))
+    if (!ar || !(ar->ary_flags & ARF_REAL) || ar->ary_max < 0)
        return;
     if (key = ar->ary_array - ar->ary_alloc) {
        ar->ary_max += key;