This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
typo fix for Thread
[perl5.git] / av.c
1 /*    av.c
2  *
3  *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4  *    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
5  *
6  *    You may distribute under the terms of either the GNU General Public
7  *    License or the Artistic License, as specified in the README file.
8  *
9  */
10
11 /*
12  * '...for the Entwives desired order, and plenty, and peace (by which they
13  *  meant that things should remain where they had set them).' --Treebeard
14  *
15  *     [p.476 of _The Lord of the Rings_, III/iv: "Treebeard"]
16  */
17
18 /*
19 =head1 Array Manipulation Functions
20 */
21
22 #include "EXTERN.h"
23 #define PERL_IN_AV_C
24 #include "perl.h"
25
26 void
27 Perl_av_reify(pTHX_ AV *av)
28 {
29     dVAR;
30     I32 key;
31
32     PERL_ARGS_ASSERT_AV_REIFY;
33     assert(SvTYPE(av) == SVt_PVAV);
34
35     if (AvREAL(av))
36         return;
37 #ifdef DEBUGGING
38     if (SvTIED_mg((const SV *)av, PERL_MAGIC_tied))
39         Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "av_reify called on tied array");
40 #endif
41     key = AvMAX(av) + 1;
42     while (key > AvFILLp(av) + 1)
43         AvARRAY(av)[--key] = &PL_sv_undef;
44     while (key) {
45         SV * const sv = AvARRAY(av)[--key];
46         assert(sv);
47         if (sv != &PL_sv_undef)
48             SvREFCNT_inc_simple_void_NN(sv);
49     }
50     key = AvARRAY(av) - AvALLOC(av);
51     while (key)
52         AvALLOC(av)[--key] = &PL_sv_undef;
53     AvREIFY_off(av);
54     AvREAL_on(av);
55 }
56
57 /*
58 =for apidoc av_extend
59
60 Pre-extend an array.  The C<key> is the index to which the array should be
61 extended.
62
63 =cut
64 */
65
66 void
67 Perl_av_extend(pTHX_ AV *av, I32 key)
68 {
69     dVAR;
70     MAGIC *mg;
71
72     PERL_ARGS_ASSERT_AV_EXTEND;
73     assert(SvTYPE(av) == SVt_PVAV);
74
75     mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied);
76     if (mg) {
77         SV *arg1 = sv_newmortal();
78         sv_setiv(arg1, (IV)(key + 1));
79         Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, "EXTEND", G_DISCARD, 1,
80                             arg1);
81         return;
82     }
83     av_extend_guts(av,key,&AvMAX(av),&AvALLOC(av),&AvARRAY(av));
84 }    
85
86 /* The guts of av_extend.  *Not* for general use! */
87 void
88 Perl_av_extend_guts(pTHX_ AV *av, I32 key, SSize_t *maxp, SV ***allocp,
89                           SV ***arrayp)
90 {
91     dVAR;
92
93     PERL_ARGS_ASSERT_AV_EXTEND_GUTS;
94
95     if (key > *maxp) {
96         SV** ary;
97         I32 tmp;
98         I32 newmax;
99
100         if (av && *allocp != *arrayp) {
101             ary = *allocp + AvFILLp(av) + 1;
102             tmp = *arrayp - *allocp;
103             Move(*arrayp, *allocp, AvFILLp(av)+1, SV*);
104             *maxp += tmp;
105             *arrayp = *allocp;
106             if (AvREAL(av)) {
107                 while (tmp)
108                     ary[--tmp] = &PL_sv_undef;
109             }
110             if (key > *maxp - 10) {
111                 newmax = key + *maxp;
112                 goto resize;
113             }
114         }
115         else {
116 #ifdef PERL_MALLOC_WRAP
117             static const char oom_array_extend[] =
118               "Out of memory during array extend"; /* Duplicated in pp_hot.c */
119 #endif
120
121             if (*allocp) {
122
123 #ifdef Perl_safesysmalloc_size
124                 /* Whilst it would be quite possible to move this logic around
125                    (as I did in the SV code), so as to set AvMAX(av) early,
126                    based on calling Perl_safesysmalloc_size() immediately after
127                    allocation, I'm not convinced that it is a great idea here.
128                    In an array we have to loop round setting everything to
129                    &PL_sv_undef, which means writing to memory, potentially lots
130                    of it, whereas for the SV buffer case we don't touch the
131                    "bonus" memory. So there there is no cost in telling the
132                    world about it, whereas here we have to do work before we can
133                    tell the world about it, and that work involves writing to
134                    memory that might never be read. So, I feel, better to keep
135                    the current lazy system of only writing to it if our caller
136                    has a need for more space. NWC  */
137                 newmax = Perl_safesysmalloc_size((void*)*allocp) /
138                     sizeof(const SV *) - 1;
139
140                 if (key <= newmax) 
141                     goto resized;
142 #endif 
143                 newmax = key + *maxp / 5;
144               resize:
145                 MEM_WRAP_CHECK_1(newmax+1, SV*, oom_array_extend);
146                 Renew(*allocp,newmax+1, SV*);
147 #ifdef Perl_safesysmalloc_size
148               resized:
149 #endif
150                 ary = *allocp + *maxp + 1;
151                 tmp = newmax - *maxp;
152                 if (av == PL_curstack) {        /* Oops, grew stack (via av_store()?) */
153                     PL_stack_sp = *allocp + (PL_stack_sp - PL_stack_base);
154                     PL_stack_base = *allocp;
155                     PL_stack_max = PL_stack_base + newmax;
156                 }
157             }
158             else {
159                 newmax = key < 3 ? 3 : key;
160                 MEM_WRAP_CHECK_1(newmax+1, SV*, oom_array_extend);
161                 Newx(*allocp, newmax+1, SV*);
162                 ary = *allocp + 1;
163                 tmp = newmax;
164                 *allocp[0] = &PL_sv_undef;      /* For the stacks */
165             }
166             if (av && AvREAL(av)) {
167                 while (tmp)
168                     ary[--tmp] = &PL_sv_undef;
169             }
170             
171             *arrayp = *allocp;
172             *maxp = newmax;
173         }
174     }
175 }
176
177 /*
178 =for apidoc av_fetch
179
180 Returns the SV at the specified index in the array.  The C<key> is the
181 index.  If lval is true, you are guaranteed to get a real SV back (in case
182 it wasn't real before), which you can then modify.  Check that the return
183 value is non-null before dereferencing it to a C<SV*>.
184
185 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
186 more information on how to use this function on tied arrays. 
187
188 The rough perl equivalent is C<$myarray[$idx]>.
189
190 =cut
191 */
192
193 static bool
194 S_adjust_index(pTHX_ AV *av, const MAGIC *mg, I32 *keyp)
195 {
196     bool adjust_index = 1;
197     if (mg) {
198         /* Handle negative array indices 20020222 MJD */
199         SV * const ref = SvTIED_obj(MUTABLE_SV(av), mg);
200         SvGETMAGIC(ref);
201         if (SvROK(ref) && SvOBJECT(SvRV(ref))) {
202             SV * const * const negative_indices_glob =
203                 hv_fetchs(SvSTASH(SvRV(ref)), NEGATIVE_INDICES_VAR, 0);
204
205             if (negative_indices_glob && SvTRUE(GvSV(*negative_indices_glob)))
206                 adjust_index = 0;
207         }
208     }
209
210     if (adjust_index) {
211         *keyp += AvFILL(av) + 1;
212         if (*keyp < 0)
213             return FALSE;
214     }
215     return TRUE;
216 }
217
218 SV**
219 Perl_av_fetch(pTHX_ AV *av, I32 key, I32 lval)
220 {
221     dVAR;
222
223     PERL_ARGS_ASSERT_AV_FETCH;
224     assert(SvTYPE(av) == SVt_PVAV);
225
226     if (SvRMAGICAL(av)) {
227         const MAGIC * const tied_magic
228             = mg_find((const SV *)av, PERL_MAGIC_tied);
229         if (tied_magic || mg_find((const SV *)av, PERL_MAGIC_regdata)) {
230             SV *sv;
231             if (key < 0) {
232                 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
233                         return NULL;
234             }
235
236             sv = sv_newmortal();
237             sv_upgrade(sv, SVt_PVLV);
238             mg_copy(MUTABLE_SV(av), sv, 0, key);
239             if (!tied_magic) /* for regdata, force leavesub to make copies */
240                 SvTEMP_off(sv);
241             LvTYPE(sv) = 't';
242             LvTARG(sv) = sv; /* fake (SV**) */
243             return &(LvTARG(sv));
244         }
245     }
246
247     if (key < 0) {
248         key += AvFILL(av) + 1;
249         if (key < 0)
250             return NULL;
251     }
252
253     if (key > AvFILLp(av) || AvARRAY(av)[key] == &PL_sv_undef) {
254       emptyness:
255         return lval ? av_store(av,key,newSV(0)) : NULL;
256     }
257
258     if (AvREIFY(av)
259              && (!AvARRAY(av)[key]      /* eg. @_ could have freed elts */
260                  || SvIS_FREED(AvARRAY(av)[key]))) {
261         AvARRAY(av)[key] = &PL_sv_undef;        /* 1/2 reify */
262         goto emptyness;
263     }
264     return &AvARRAY(av)[key];
265 }
266
267 /*
268 =for apidoc av_store
269
270 Stores an SV in an array.  The array index is specified as C<key>.  The
271 return value will be NULL if the operation failed or if the value did not
272 need to be actually stored within the array (as in the case of tied
273 arrays). Otherwise, it can be dereferenced
274 to get the C<SV*> that was stored
275 there (= C<val>)).
276
277 Note that the caller is responsible for suitably incrementing the reference
278 count of C<val> before the call, and decrementing it if the function
279 returned NULL.
280
281 Approximate Perl equivalent: C<$myarray[$key] = $val;>.
282
283 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
284 more information on how to use this function on tied arrays.
285
286 =cut
287 */
288
289 SV**
290 Perl_av_store(pTHX_ AV *av, I32 key, SV *val)
291 {
292     dVAR;
293     SV** ary;
294
295     PERL_ARGS_ASSERT_AV_STORE;
296     assert(SvTYPE(av) == SVt_PVAV);
297
298     /* S_regclass relies on being able to pass in a NULL sv
299        (unicode_alternate may be NULL).
300     */
301
302     if (!val)
303         val = &PL_sv_undef;
304
305     if (SvRMAGICAL(av)) {
306         const MAGIC * const tied_magic = mg_find((const SV *)av, PERL_MAGIC_tied);
307         if (tied_magic) {
308             if (key < 0) {
309                 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
310                         return 0;
311             }
312             if (val != &PL_sv_undef) {
313                 mg_copy(MUTABLE_SV(av), val, 0, key);
314             }
315             return NULL;
316         }
317     }
318
319
320     if (key < 0) {
321         key += AvFILL(av) + 1;
322         if (key < 0)
323             return NULL;
324     }
325
326     if (SvREADONLY(av) && key >= AvFILL(av))
327         Perl_croak_no_modify();
328
329     if (!AvREAL(av) && AvREIFY(av))
330         av_reify(av);
331     if (key > AvMAX(av))
332         av_extend(av,key);
333     ary = AvARRAY(av);
334     if (AvFILLp(av) < key) {
335         if (!AvREAL(av)) {
336             if (av == PL_curstack && key > PL_stack_sp - PL_stack_base)
337                 PL_stack_sp = PL_stack_base + key;      /* XPUSH in disguise */
338             do {
339                 ary[++AvFILLp(av)] = &PL_sv_undef;
340             } while (AvFILLp(av) < key);
341         }
342         AvFILLp(av) = key;
343     }
344     else if (AvREAL(av))
345         SvREFCNT_dec(ary[key]);
346     ary[key] = val;
347     if (SvSMAGICAL(av)) {
348         const MAGIC *mg = SvMAGIC(av);
349         bool set = TRUE;
350         for (; mg; mg = mg->mg_moremagic) {
351           if (!isUPPER(mg->mg_type)) continue;
352           if (val != &PL_sv_undef) {
353             sv_magic(val, MUTABLE_SV(av), toLOWER(mg->mg_type), 0, key);
354           }
355           if (PL_delaymagic && mg->mg_type == PERL_MAGIC_isa) {
356             PL_delaymagic |= DM_ARRAY_ISA;
357             set = FALSE;
358           }
359         }
360         if (set)
361            mg_set(MUTABLE_SV(av));
362     }
363     return &ary[key];
364 }
365
366 /*
367 =for apidoc av_make
368
369 Creates a new AV and populates it with a list of SVs.  The SVs are copied
370 into the array, so they may be freed after the call to av_make.  The new AV
371 will have a reference count of 1.
372
373 Perl equivalent: C<my @new_array = ($scalar1, $scalar2, $scalar3...);>
374
375 =cut
376 */
377
378 AV *
379 Perl_av_make(pTHX_ I32 size, SV **strp)
380 {
381     AV * const av = MUTABLE_AV(newSV_type(SVt_PVAV));
382     /* sv_upgrade does AvREAL_only()  */
383     PERL_ARGS_ASSERT_AV_MAKE;
384     assert(SvTYPE(av) == SVt_PVAV);
385
386     if (size) {         /* "defined" was returning undef for size==0 anyway. */
387         SV** ary;
388         I32 i;
389         Newx(ary,size,SV*);
390         AvALLOC(av) = ary;
391         AvARRAY(av) = ary;
392         AvMAX(av) = size - 1;
393         AvFILLp(av) = -1;
394         ENTER;
395         SAVEFREESV(av);
396         for (i = 0; i < size; i++) {
397             assert (*strp);
398
399             /* Don't let sv_setsv swipe, since our source array might
400                have multiple references to the same temp scalar (e.g.
401                from a list slice) */
402
403             SvGETMAGIC(*strp); /* before newSV, in case it dies */
404             AvFILLp(av)++;
405             ary[i] = newSV(0);
406             sv_setsv_flags(ary[i], *strp,
407                            SV_DO_COW_SVSETSV|SV_NOSTEAL);
408             strp++;
409         }
410         SvREFCNT_inc_simple_void_NN(av);
411         LEAVE;
412     }
413     return av;
414 }
415
416 /*
417 =for apidoc av_clear
418
419 Clears an array, making it empty.  Does not free the memory the av uses to
420 store its list of scalars.  If any destructors are triggered as a result,
421 the av itself may be freed when this function returns.
422
423 Perl equivalent: C<@myarray = ();>.
424
425 =cut
426 */
427
428 void
429 Perl_av_clear(pTHX_ AV *av)
430 {
431     dVAR;
432     I32 extra;
433     bool real;
434
435     PERL_ARGS_ASSERT_AV_CLEAR;
436     assert(SvTYPE(av) == SVt_PVAV);
437
438 #ifdef DEBUGGING
439     if (SvREFCNT(av) == 0) {
440         Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "Attempt to clear deleted array");
441     }
442 #endif
443
444     if (SvREADONLY(av))
445         Perl_croak_no_modify();
446
447     /* Give any tie a chance to cleanup first */
448     if (SvRMAGICAL(av)) {
449         const MAGIC* const mg = SvMAGIC(av);
450         if (PL_delaymagic && mg && mg->mg_type == PERL_MAGIC_isa)
451             PL_delaymagic |= DM_ARRAY_ISA;
452         else
453             mg_clear(MUTABLE_SV(av)); 
454     }
455
456     if (AvMAX(av) < 0)
457         return;
458
459     if ((real = !!AvREAL(av))) {
460         SV** const ary = AvARRAY(av);
461         I32 index = AvFILLp(av) + 1;
462         ENTER;
463         SAVEFREESV(SvREFCNT_inc_simple_NN(av));
464         while (index) {
465             SV * const sv = ary[--index];
466             /* undef the slot before freeing the value, because a
467              * destructor might try to modify this array */
468             ary[index] = &PL_sv_undef;
469             SvREFCNT_dec(sv);
470         }
471     }
472     extra = AvARRAY(av) - AvALLOC(av);
473     if (extra) {
474         AvMAX(av) += extra;
475         AvARRAY(av) = AvALLOC(av);
476     }
477     AvFILLp(av) = -1;
478     if (real) LEAVE;
479 }
480
481 /*
482 =for apidoc av_undef
483
484 Undefines the array.  Frees the memory used by the av to store its list of
485 scalars.  If any destructors are triggered as a result, the av itself may
486 be freed.
487
488 =cut
489 */
490
491 void
492 Perl_av_undef(pTHX_ AV *av)
493 {
494     bool real;
495
496     PERL_ARGS_ASSERT_AV_UNDEF;
497     assert(SvTYPE(av) == SVt_PVAV);
498
499     /* Give any tie a chance to cleanup first */
500     if (SvTIED_mg((const SV *)av, PERL_MAGIC_tied)) 
501         av_fill(av, -1);
502
503     if ((real = !!AvREAL(av))) {
504         I32 key = AvFILLp(av) + 1;
505         ENTER;
506         SAVEFREESV(SvREFCNT_inc_simple_NN(av));
507         while (key)
508             SvREFCNT_dec(AvARRAY(av)[--key]);
509     }
510
511     Safefree(AvALLOC(av));
512     AvALLOC(av) = NULL;
513     AvARRAY(av) = NULL;
514     AvMAX(av) = AvFILLp(av) = -1;
515
516     if(SvRMAGICAL(av)) mg_clear(MUTABLE_SV(av));
517     if(real) LEAVE;
518 }
519
520 /*
521
522 =for apidoc av_create_and_push
523
524 Push an SV onto the end of the array, creating the array if necessary.
525 A small internal helper function to remove a commonly duplicated idiom.
526
527 =cut
528 */
529
530 void
531 Perl_av_create_and_push(pTHX_ AV **const avp, SV *const val)
532 {
533     PERL_ARGS_ASSERT_AV_CREATE_AND_PUSH;
534
535     if (!*avp)
536         *avp = newAV();
537     av_push(*avp, val);
538 }
539
540 /*
541 =for apidoc av_push
542
543 Pushes an SV onto the end of the array.  The array will grow automatically
544 to accommodate the addition.  This takes ownership of one reference count.
545
546 Perl equivalent: C<push @myarray, $elem;>.
547
548 =cut
549 */
550
551 void
552 Perl_av_push(pTHX_ AV *av, SV *val)
553 {             
554     dVAR;
555     MAGIC *mg;
556
557     PERL_ARGS_ASSERT_AV_PUSH;
558     assert(SvTYPE(av) == SVt_PVAV);
559
560     if (SvREADONLY(av))
561         Perl_croak_no_modify();
562
563     if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
564         Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, "PUSH", G_DISCARD, 1,
565                             val);
566         return;
567     }
568     av_store(av,AvFILLp(av)+1,val);
569 }
570
571 /*
572 =for apidoc av_pop
573
574 Removes one SV from the end of the array, reducing its size by one and
575 returning the SV (transferring control of one reference count) to the
576 caller.  Returns C<&PL_sv_undef> if the array is empty.
577
578 Perl equivalent: C<pop(@myarray);>
579
580 =cut
581 */
582
583 SV *
584 Perl_av_pop(pTHX_ AV *av)
585 {
586     dVAR;
587     SV *retval;
588     MAGIC* mg;
589
590     PERL_ARGS_ASSERT_AV_POP;
591     assert(SvTYPE(av) == SVt_PVAV);
592
593     if (SvREADONLY(av))
594         Perl_croak_no_modify();
595     if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
596         retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, "POP", 0, 0);
597         if (retval)
598             retval = newSVsv(retval);
599         return retval;
600     }
601     if (AvFILL(av) < 0)
602         return &PL_sv_undef;
603     retval = AvARRAY(av)[AvFILLp(av)];
604     AvARRAY(av)[AvFILLp(av)--] = &PL_sv_undef;
605     if (SvSMAGICAL(av))
606         mg_set(MUTABLE_SV(av));
607     return retval;
608 }
609
610 /*
611
612 =for apidoc av_create_and_unshift_one
613
614 Unshifts an SV onto the beginning of the array, creating the array if
615 necessary.
616 A small internal helper function to remove a commonly duplicated idiom.
617
618 =cut
619 */
620
621 SV **
622 Perl_av_create_and_unshift_one(pTHX_ AV **const avp, SV *const val)
623 {
624     PERL_ARGS_ASSERT_AV_CREATE_AND_UNSHIFT_ONE;
625
626     if (!*avp)
627         *avp = newAV();
628     av_unshift(*avp, 1);
629     return av_store(*avp, 0, val);
630 }
631
632 /*
633 =for apidoc av_unshift
634
635 Unshift the given number of C<undef> values onto the beginning of the
636 array.  The array will grow automatically to accommodate the addition.  You
637 must then use C<av_store> to assign values to these new elements.
638
639 Perl equivalent: C<unshift @myarray, ( (undef) x $n );>
640
641 =cut
642 */
643
644 void
645 Perl_av_unshift(pTHX_ AV *av, I32 num)
646 {
647     dVAR;
648     I32 i;
649     MAGIC* mg;
650
651     PERL_ARGS_ASSERT_AV_UNSHIFT;
652     assert(SvTYPE(av) == SVt_PVAV);
653
654     if (SvREADONLY(av))
655         Perl_croak_no_modify();
656
657     if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
658         Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, "UNSHIFT",
659                             G_DISCARD | G_UNDEF_FILL, num);
660         return;
661     }
662
663     if (num <= 0)
664       return;
665     if (!AvREAL(av) && AvREIFY(av))
666         av_reify(av);
667     i = AvARRAY(av) - AvALLOC(av);
668     if (i) {
669         if (i > num)
670             i = num;
671         num -= i;
672     
673         AvMAX(av) += i;
674         AvFILLp(av) += i;
675         AvARRAY(av) = AvARRAY(av) - i;
676     }
677     if (num) {
678         SV **ary;
679         const I32 i = AvFILLp(av);
680         /* Create extra elements */
681         const I32 slide = i > 0 ? i : 0;
682         num += slide;
683         av_extend(av, i + num);
684         AvFILLp(av) += num;
685         ary = AvARRAY(av);
686         Move(ary, ary + num, i + 1, SV*);
687         do {
688             ary[--num] = &PL_sv_undef;
689         } while (num);
690         /* Make extra elements into a buffer */
691         AvMAX(av) -= slide;
692         AvFILLp(av) -= slide;
693         AvARRAY(av) = AvARRAY(av) + slide;
694     }
695 }
696
697 /*
698 =for apidoc av_shift
699
700 Shifts an SV off the beginning of the
701 array.  Returns C<&PL_sv_undef> if the 
702 array is empty.
703
704 Perl equivalent: C<shift(@myarray);>
705
706 =cut
707 */
708
709 SV *
710 Perl_av_shift(pTHX_ AV *av)
711 {
712     dVAR;
713     SV *retval;
714     MAGIC* mg;
715
716     PERL_ARGS_ASSERT_AV_SHIFT;
717     assert(SvTYPE(av) == SVt_PVAV);
718
719     if (SvREADONLY(av))
720         Perl_croak_no_modify();
721     if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
722         retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, "SHIFT", 0, 0);
723         if (retval)
724             retval = newSVsv(retval);
725         return retval;
726     }
727     if (AvFILL(av) < 0)
728       return &PL_sv_undef;
729     retval = *AvARRAY(av);
730     if (AvREAL(av))
731         *AvARRAY(av) = &PL_sv_undef;
732     AvARRAY(av) = AvARRAY(av) + 1;
733     AvMAX(av)--;
734     AvFILLp(av)--;
735     if (SvSMAGICAL(av))
736         mg_set(MUTABLE_SV(av));
737     return retval;
738 }
739
740 /*
741 =for apidoc av_top_index
742
743 Returns the highest index in the array.  The number of elements in the
744 array is C<av_top_index(av) + 1>.  Returns -1 if the array is empty.
745
746 The Perl equivalent for this is C<$#myarray>.
747
748 (A slightly shorter form is C<av_tindex>.)
749
750 =for apidoc av_len
751
752 Same as L</av_top_index>.  Returns the highest index in the array.  Note that the
753 return value is +1 what its name implies it returns; and hence differs in
754 meaning from what the similarly named L</sv_len> returns.
755
756 =cut
757 */
758
759 I32
760 Perl_av_len(pTHX_ AV *av)
761 {
762     PERL_ARGS_ASSERT_AV_LEN;
763
764     return av_top_index(av);
765 }
766
767 /*
768 =for apidoc av_fill
769
770 Set the highest index in the array to the given number, equivalent to
771 Perl's C<$#array = $fill;>.
772
773 The number of elements in the an array will be C<fill + 1> after
774 av_fill() returns.  If the array was previously shorter, then the
775 additional elements appended are set to C<PL_sv_undef>.  If the array
776 was longer, then the excess elements are freed.  C<av_fill(av, -1)> is
777 the same as C<av_clear(av)>.
778
779 =cut
780 */
781 void
782 Perl_av_fill(pTHX_ AV *av, I32 fill)
783 {
784     dVAR;
785     MAGIC *mg;
786
787     PERL_ARGS_ASSERT_AV_FILL;
788     assert(SvTYPE(av) == SVt_PVAV);
789
790     if (fill < 0)
791         fill = -1;
792     if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
793         SV *arg1 = sv_newmortal();
794         sv_setiv(arg1, (IV)(fill + 1));
795         Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, "STORESIZE", G_DISCARD,
796                             1, arg1);
797         return;
798     }
799     if (fill <= AvMAX(av)) {
800         I32 key = AvFILLp(av);
801         SV** const ary = AvARRAY(av);
802
803         if (AvREAL(av)) {
804             while (key > fill) {
805                 SvREFCNT_dec(ary[key]);
806                 ary[key--] = &PL_sv_undef;
807             }
808         }
809         else {
810             while (key < fill)
811                 ary[++key] = &PL_sv_undef;
812         }
813             
814         AvFILLp(av) = fill;
815         if (SvSMAGICAL(av))
816             mg_set(MUTABLE_SV(av));
817     }
818     else
819         (void)av_store(av,fill,&PL_sv_undef);
820 }
821
822 /*
823 =for apidoc av_delete
824
825 Deletes the element indexed by C<key> from the array, makes the element mortal,
826 and returns it.  If C<flags> equals C<G_DISCARD>, the element is freed and null
827 is returned.  Perl equivalent: C<my $elem = delete($myarray[$idx]);> for the
828 non-C<G_DISCARD> version and a void-context C<delete($myarray[$idx]);> for the
829 C<G_DISCARD> version.
830
831 =cut
832 */
833 SV *
834 Perl_av_delete(pTHX_ AV *av, I32 key, I32 flags)
835 {
836     dVAR;
837     SV *sv;
838
839     PERL_ARGS_ASSERT_AV_DELETE;
840     assert(SvTYPE(av) == SVt_PVAV);
841
842     if (SvREADONLY(av))
843         Perl_croak_no_modify();
844
845     if (SvRMAGICAL(av)) {
846         const MAGIC * const tied_magic
847             = mg_find((const SV *)av, PERL_MAGIC_tied);
848         if ((tied_magic || mg_find((const SV *)av, PERL_MAGIC_regdata))) {
849             SV **svp;
850             if (key < 0) {
851                 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
852                         return NULL;
853             }
854             svp = av_fetch(av, key, TRUE);
855             if (svp) {
856                 sv = *svp;
857                 mg_clear(sv);
858                 if (mg_find(sv, PERL_MAGIC_tiedelem)) {
859                     sv_unmagic(sv, PERL_MAGIC_tiedelem); /* No longer an element */
860                     return sv;
861                 }
862                 return NULL;
863             }
864         }
865     }
866
867     if (key < 0) {
868         key += AvFILL(av) + 1;
869         if (key < 0)
870             return NULL;
871     }
872
873     if (key > AvFILLp(av))
874         return NULL;
875     else {
876         if (!AvREAL(av) && AvREIFY(av))
877             av_reify(av);
878         sv = AvARRAY(av)[key];
879         if (key == AvFILLp(av)) {
880             AvARRAY(av)[key] = &PL_sv_undef;
881             do {
882                 AvFILLp(av)--;
883             } while (--key >= 0 && AvARRAY(av)[key] == &PL_sv_undef);
884         }
885         else
886             AvARRAY(av)[key] = &PL_sv_undef;
887         if (SvSMAGICAL(av))
888             mg_set(MUTABLE_SV(av));
889     }
890     if (flags & G_DISCARD) {
891         SvREFCNT_dec(sv);
892         sv = NULL;
893     }
894     else if (AvREAL(av))
895         sv = sv_2mortal(sv);
896     return sv;
897 }
898
899 /*
900 =for apidoc av_exists
901
902 Returns true if the element indexed by C<key> has been initialized.
903
904 This relies on the fact that uninitialized array elements are set to
905 C<&PL_sv_undef>.
906
907 Perl equivalent: C<exists($myarray[$key])>.
908
909 =cut
910 */
911 bool
912 Perl_av_exists(pTHX_ AV *av, I32 key)
913 {
914     dVAR;
915     PERL_ARGS_ASSERT_AV_EXISTS;
916     assert(SvTYPE(av) == SVt_PVAV);
917
918     if (SvRMAGICAL(av)) {
919         const MAGIC * const tied_magic
920             = mg_find((const SV *)av, PERL_MAGIC_tied);
921         const MAGIC * const regdata_magic
922             = mg_find((const SV *)av, PERL_MAGIC_regdata);
923         if (tied_magic || regdata_magic) {
924             MAGIC *mg;
925             /* Handle negative array indices 20020222 MJD */
926             if (key < 0) {
927                 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
928                         return FALSE;
929             }
930
931             if(key >= 0 && regdata_magic) {
932                 if (key <= AvFILL(av))
933                     return TRUE;
934                 else
935                     return FALSE;
936             }
937             {
938                 SV * const sv = sv_newmortal();
939                 mg_copy(MUTABLE_SV(av), sv, 0, key);
940                 mg = mg_find(sv, PERL_MAGIC_tiedelem);
941                 if (mg) {
942                     magic_existspack(sv, mg);
943                     {
944                         I32 retbool = SvTRUE_nomg_NN(sv);
945                         return cBOOL(retbool);
946                     }
947                 }
948             }
949         }
950     }
951
952     if (key < 0) {
953         key += AvFILL(av) + 1;
954         if (key < 0)
955             return FALSE;
956     }
957
958     if (key <= AvFILLp(av) && AvARRAY(av)[key] != &PL_sv_undef
959         && AvARRAY(av)[key])
960     {
961         return TRUE;
962     }
963     else
964         return FALSE;
965 }
966
967 static MAGIC *
968 S_get_aux_mg(pTHX_ AV *av) {
969     dVAR;
970     MAGIC *mg;
971
972     PERL_ARGS_ASSERT_GET_AUX_MG;
973     assert(SvTYPE(av) == SVt_PVAV);
974
975     mg = mg_find((const SV *)av, PERL_MAGIC_arylen_p);
976
977     if (!mg) {
978         mg = sv_magicext(MUTABLE_SV(av), 0, PERL_MAGIC_arylen_p,
979                          &PL_vtbl_arylen_p, 0, 0);
980         assert(mg);
981         /* sv_magicext won't set this for us because we pass in a NULL obj  */
982         mg->mg_flags |= MGf_REFCOUNTED;
983     }
984     return mg;
985 }
986
987 SV **
988 Perl_av_arylen_p(pTHX_ AV *av) {
989     MAGIC *const mg = get_aux_mg(av);
990
991     PERL_ARGS_ASSERT_AV_ARYLEN_P;
992     assert(SvTYPE(av) == SVt_PVAV);
993
994     return &(mg->mg_obj);
995 }
996
997 IV *
998 Perl_av_iter_p(pTHX_ AV *av) {
999     MAGIC *const mg = get_aux_mg(av);
1000
1001     PERL_ARGS_ASSERT_AV_ITER_P;
1002     assert(SvTYPE(av) == SVt_PVAV);
1003
1004 #if IVSIZE == I32SIZE
1005     return (IV *)&(mg->mg_len);
1006 #else
1007     if (!mg->mg_ptr) {
1008         IV *temp;
1009         mg->mg_len = IVSIZE;
1010         Newxz(temp, 1, IV);
1011         mg->mg_ptr = (char *) temp;
1012     }
1013     return (IV *)mg->mg_ptr;
1014 #endif
1015 }
1016
1017 /*
1018  * Local variables:
1019  * c-indentation-style: bsd
1020  * c-basic-offset: 4
1021  * indent-tabs-mode: nil
1022  * End:
1023  *
1024  * ex: set ts=8 sts=4 sw=4 et:
1025  */