3 * Copyright (c) 1991-1997, Larry Wall
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
11 * "...for the Entwives desired order, and plenty, and peace (by which they
12 * meant that things should remain where they had set them)." --Treebeard
18 static void av_reify _((AV* av));
28 while (key > AvFILL(av) + 1)
29 AvARRAY(av)[--key] = &sv_undef;
31 sv = AvARRAY(av)[--key];
34 (void)SvREFCNT_inc(sv);
36 key = AvARRAY(av) - AvALLOC(av);
38 AvALLOC(av)[--key] = &sv_undef;
47 if (key > AvMAX(av)) {
52 if (AvALLOC(av) != AvARRAY(av)) {
53 ary = AvALLOC(av) + AvFILL(av) + 1;
54 tmp = AvARRAY(av) - AvALLOC(av);
55 Move(AvARRAY(av), AvALLOC(av), AvFILL(av)+1, SV*);
57 SvPVX(av) = (char*)AvALLOC(av);
60 ary[--tmp] = &sv_undef;
63 if (key > AvMAX(av) - 10) {
64 newmax = key + AvMAX(av);
70 #ifndef STRANGE_MALLOC
74 newmax = key + AvMAX(av) / 5;
77 Renew(AvALLOC(av),newmax+1, SV*);
79 bytes = (newmax + 1) * sizeof(SV*);
80 #define MALLOC_OVERHEAD 16
81 tmp = MALLOC_OVERHEAD;
82 while (tmp - MALLOC_OVERHEAD < bytes)
84 tmp -= MALLOC_OVERHEAD;
88 New(2,ary, newmax+1, SV*);
89 Copy(AvALLOC(av), ary, AvMAX(av)+1, SV*);
90 if (AvMAX(av) > 64 && !nice_chunk) {
91 nice_chunk = (char*)AvALLOC(av);
92 nice_chunk_size = (AvMAX(av) + 1) * sizeof(SV*);
95 Safefree(AvALLOC(av));
98 ary = AvALLOC(av) + AvMAX(av) + 1;
99 tmp = newmax - AvMAX(av);
100 if (av == curstack) { /* Oops, grew stack (via av_store()?) */
101 stack_sp = AvALLOC(av) + (stack_sp - stack_base);
102 stack_base = AvALLOC(av);
103 stack_max = stack_base + newmax;
107 newmax = key < 4 ? 4 : key;
108 New(2,AvALLOC(av), newmax+1, SV*);
109 ary = AvALLOC(av) + 1;
111 AvALLOC(av)[0] = &sv_undef; /* For the stacks */
115 ary[--tmp] = &sv_undef;
118 SvPVX(av) = (char*)AvALLOC(av);
125 av_fetch(av,key,lval)
135 if (SvRMAGICAL(av)) {
136 if (mg_find((SV*)av,'P')) {
138 mg_copy((SV*)av, sv, 0, key);
145 key += AvFILL(av) + 1;
149 else if (key > AvFILL(av)) {
156 return av_store(av,key,sv);
158 if (AvARRAY(av)[key] == &sv_undef) {
162 return av_store(av,key,sv);
167 && (!AvARRAY(av)[key] /* eg. @_ could have freed elts */
168 || SvTYPE(AvARRAY(av)[key]) == SVTYPEMASK)) {
169 AvARRAY(av)[key] = &sv_undef; /* 1/2 reify */
172 return &AvARRAY(av)[key];
188 if (SvRMAGICAL(av)) {
189 if (mg_find((SV*)av,'P')) {
190 if (val != &sv_undef)
191 mg_copy((SV*)av, val, 0, key);
197 key += AvFILL(av) + 1;
201 if (SvREADONLY(av) && key >= AvFILL(av))
203 if (!AvREAL(av) && AvREIFY(av))
208 if (AvFILL(av) < key) {
210 if (av == curstack && key > stack_sp - stack_base)
211 stack_sp = stack_base + key; /* XPUSH in disguise */
213 ary[++AvFILL(av)] = &sv_undef;
214 while (AvFILL(av) < key);
219 SvREFCNT_dec(ary[key]);
221 if (SvSMAGICAL(av)) {
222 if (val != &sv_undef) {
223 MAGIC* mg = SvMAGIC(av);
224 sv_magic(val, (SV*)av, toLOWER(mg->mg_type), 0, key);
236 av = (AV*)NEWSV(3,0);
237 sv_upgrade((SV *)av, SVt_PVAV);
241 AvMAX(av) = AvFILL(av) = -1;
254 av = (AV*)NEWSV(8,0);
255 sv_upgrade((SV *) av,SVt_PVAV);
256 AvFLAGS(av) = AVf_REAL;
257 if (size) { /* `defined' was returning undef for size==0 anyway. */
260 SvPVX(av) = (char*)ary;
261 AvFILL(av) = size - 1;
262 AvMAX(av) = size - 1;
263 for (i = 0; i < size; i++) {
266 sv_setsv(ary[i], *strp);
281 av = (AV*)NEWSV(9,0);
282 sv_upgrade((SV *)av, SVt_PVAV);
283 New(4,ary,size+1,SV*);
285 Copy(strp,ary,size,SV*);
286 AvFLAGS(av) = AVf_REIFY;
287 SvPVX(av) = (char*)ary;
288 AvFILL(av) = size - 1;
289 AvMAX(av) = size - 1;
306 if (SvREFCNT(av) <= 0) {
307 warn("Attempt to clear deleted array");
310 if (!av || AvMAX(av) < 0)
316 key = AvFILL(av) + 1;
318 SvREFCNT_dec(ary[--key]);
319 ary[key] = &sv_undef;
322 if (key = AvARRAY(av) - AvALLOC(av)) {
324 SvPVX(av) = (char*)AvALLOC(av);
339 key = AvFILL(av) + 1;
341 SvREFCNT_dec(AvARRAY(av)[--key]);
343 Safefree(AvALLOC(av));
346 AvMAX(av) = AvFILL(av) = -1;
348 SvREFCNT_dec(AvARYLEN(av));
360 av_store(av,AvFILL(av)+1,val);
369 if (!av || AvFILL(av) < 0)
373 retval = AvARRAY(av)[AvFILL(av)];
374 AvARRAY(av)[AvFILL(av)--] = &sv_undef;
386 register SV **sstr,**dstr;
392 if (!AvREAL(av) && AvREIFY(av))
394 i = AvARRAY(av) - AvALLOC(av);
402 SvPVX(av) = (char*)(AvARRAY(av) - i);
405 av_extend(av,AvFILL(av)+num);
407 dstr = AvARRAY(av) + AvFILL(av);
410 # pragma loop_opt(off) /* don't loop-optimize the following code */
411 #endif /* BUGGY_MSC5 */
412 for (i = AvFILL(av) - num; i >= 0; --i) {
415 # pragma loop_opt() /* loop-optimization back to command-line setting */
416 #endif /* BUGGY_MSC5 */
419 AvARRAY(av)[--num] = &sv_undef;
429 if (!av || AvFILL(av) < 0)
433 retval = *AvARRAY(av);
435 *AvARRAY(av) = &sv_undef;
436 SvPVX(av) = (char*)(AvARRAY(av) + 1);
457 croak("panic: null array");
460 if (fill <= AvMAX(av)) {
461 I32 key = AvFILL(av);
462 SV** ary = AvARRAY(av);
466 SvREFCNT_dec(ary[key]);
467 ary[key--] = &sv_undef;
472 ary[++key] = &sv_undef;
480 (void)av_store(av,fill,&sv_undef);