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