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