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