+static void av_reify _((AV* av));
+
+static void
+av_reify(av)
+AV* av;
+{
+ I32 key;
+ SV* sv;
+
+ key = AvMAX(av) + 1;
+ while (key > AvFILL(av) + 1)
+ AvARRAY(av)[--key] = &sv_undef;
+ while (key) {
+ sv = AvARRAY(av)[--key];
+ assert(sv);
+ if (sv != &sv_undef)
+ (void)SvREFCNT_inc(sv);
+ }
+ key = AvARRAY(av) - AvALLOC(av);
+ while (key)
+ AvALLOC(av)[--key] = &sv_undef;
+ AvREAL_on(av);
+}
+
+void
+av_extend(av,key)
+AV *av;
+I32 key;
+{
+ if (key > AvMAX(av)) {
+ SV** ary;
+ I32 tmp;
+ I32 newmax;
+
+ if (AvALLOC(av) != AvARRAY(av)) {
+ ary = AvALLOC(av) + AvFILL(av) + 1;
+ tmp = AvARRAY(av) - AvALLOC(av);
+ Move(AvARRAY(av), AvALLOC(av), AvFILL(av)+1, SV*);
+ AvMAX(av) += tmp;
+ SvPVX(av) = (char*)AvALLOC(av);
+ if (AvREAL(av)) {
+ while (tmp)
+ ary[--tmp] = &sv_undef;
+ }
+
+ if (key > AvMAX(av) - 10) {
+ newmax = key + AvMAX(av);
+ goto resize;
+ }
+ }
+ 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 == curstack) { /* Oops, grew stack (via av_store()?) */
+ stack_sp = AvALLOC(av) + (stack_sp - stack_base);
+ stack_base = AvALLOC(av);
+ stack_max = stack_base + newmax;
+ }
+ }
+ else {
+ newmax = key < 4 ? 4 : key;
+ New(2,AvALLOC(av), newmax+1, SV*);
+ ary = AvALLOC(av) + 1;
+ tmp = newmax;
+ AvALLOC(av)[0] = &sv_undef; /* For the stacks */
+ }
+ if (AvREAL(av)) {
+ while (tmp)
+ ary[--tmp] = &sv_undef;
+ }
+
+ SvPVX(av) = (char*)AvALLOC(av);
+ AvMAX(av) = newmax;
+ }
+ }
+}
+