Change to use $^O and &Cwd:cwd
[p5sagit/p5-mst-13.2.git] / av.c
diff --git a/av.c b/av.c
index 7116cc4..b27ec76 100644 (file)
--- a/av.c
+++ b/av.c
@@ -64,9 +64,34 @@ I32 key;
        }
        else {
            if (AvALLOC(av)) {
+#ifndef STRANGE_MALLOC
+               U32 bytes;
+#endif
+
                newmax = key + AvMAX(av) / 5;
              resize:
+#ifdef STRANGE_MALLOC
                Renew(AvALLOC(av),newmax+1, SV*);
+#else
+               bytes = (newmax + 1) * sizeof(SV*);
+#define MALLOC_OVERHEAD 16
+               tmp = MALLOC_OVERHEAD;
+               while (tmp - MALLOC_OVERHEAD < bytes)
+                   tmp += tmp;
+               tmp -= MALLOC_OVERHEAD;
+               tmp /= sizeof(SV*);
+               assert(tmp > newmax);
+               newmax = tmp - 1;
+               New(2,ary, newmax+1, SV*);
+               Copy(AvALLOC(av), ary, AvMAX(av)+1, SV*);
+               if (AvMAX(av) > 64 && !nice_chunk) {
+                   nice_chunk = (char*)AvALLOC(av);
+                   nice_chunk_size = (AvMAX(av) + 1) * sizeof(SV*);
+               }
+               else
+                   Safefree(AvALLOC(av));
+               AvALLOC(av) = ary;
+#endif
                ary = AvALLOC(av) + AvMAX(av) + 1;
                tmp = newmax - AvMAX(av);
                if (av == stack) {      /* Oops, grew stack (via av_store()?) */