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
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.
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
15 * [p.476 of _The Lord of the Rings_, III/iv: "Treebeard"]
23 Perl_av_reify(pTHX_ AV *av)
27 PERL_ARGS_ASSERT_AV_REIFY;
28 assert(SvTYPE(av) == SVt_PVAV);
33 if (SvTIED_mg((const SV *)av, PERL_MAGIC_tied))
34 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "av_reify called on tied array");
37 while (key > AvFILLp(av) + 1)
38 AvARRAY(av)[--key] = NULL;
40 SV * const sv = AvARRAY(av)[--key];
41 if (sv != &PL_sv_undef)
42 SvREFCNT_inc_simple_void(sv);
44 key = AvARRAY(av) - AvALLOC(av);
46 AvALLOC(av)[--key] = NULL;
54 Pre-extend an array so that it is capable of storing values at indexes
55 C<0..key>. Thus C<av_extend(av,99)> guarantees that the array can store 100
56 elements, i.e. that C<av_store(av, 0, sv)> through C<av_store(av, 99, sv)>
57 on a plain array will work without any further memory allocation.
59 If the av argument is a tied array then will call the C<EXTEND> tied
60 array method with an argument of C<(key+1)>.
66 Perl_av_extend(pTHX_ AV *av, SSize_t key)
70 PERL_ARGS_ASSERT_AV_EXTEND;
71 assert(SvTYPE(av) == SVt_PVAV);
73 mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied);
75 SV *arg1 = sv_newmortal();
76 /* NOTE: the API for av_extend() is NOT the same as the tie method EXTEND.
78 * The C function takes an *index* (assumes 0 indexed arrays) and ensures
79 * that the array is at least as large as the index provided.
81 * The tied array method EXTEND takes a *count* and ensures that the array
82 * is at least that many elements large. Thus we have to +1 the key when
83 * we call the tied method.
85 sv_setiv(arg1, (IV)(key + 1));
86 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(EXTEND), G_DISCARD, 1,
90 av_extend_guts(av,key,&AvMAX(av),&AvALLOC(av),&AvARRAY(av));
93 /* The guts of av_extend. *Not* for general use! */
94 /* Also called directly from pp_assign, padlist_store, padnamelist_store */
96 Perl_av_extend_guts(pTHX_ AV *av, SSize_t key, SSize_t *maxp, SV ***allocp,
99 PERL_ARGS_ASSERT_AV_EXTEND_GUTS;
101 if (key < -1) /* -1 is legal */
103 "panic: av_extend_guts() negative count (%" IVdf ")", (IV)key);
106 SSize_t ary_offset = *maxp + 1;
110 if (av && *allocp != *arrayp) { /* a shifted SV* array exists */
111 to_null = *arrayp - *allocp;
113 ary_offset = AvFILLp(av) + 1;
115 Move(*arrayp, *allocp, AvFILLp(av)+1, SV*);
117 if (key > *maxp - 10) {
118 newmax = key + *maxp;
121 } else if (*allocp) { /* a full SV* array exists */
123 #ifdef Perl_safesysmalloc_size
124 /* Whilst it would be quite possible to move this logic around
125 (as I did in the SV code), so as to set AvMAX(av) early,
126 based on calling Perl_safesysmalloc_size() immediately after
127 allocation, I'm not convinced that it is a great idea here.
128 In an array we have to loop round setting everything to
129 NULL, which means writing to memory, potentially lots
130 of it, whereas for the SV buffer case we don't touch the
131 "bonus" memory. So there there is no cost in telling the
132 world about it, whereas here we have to do work before we can
133 tell the world about it, and that work involves writing to
134 memory that might never be read. So, I feel, better to keep
135 the current lazy system of only writing to it if our caller
136 has a need for more space. NWC */
137 newmax = Perl_safesysmalloc_size((void*)*allocp) /
138 sizeof(const SV *) - 1;
143 /* overflow-safe version of newmax = key + *maxp/5 */
145 newmax = (key > SSize_t_MAX - newmax)
146 ? SSize_t_MAX : key + newmax;
149 /* it should really be newmax+1 here, but if newmax
150 * happens to equal SSize_t_MAX, then newmax+1 is
151 * undefined. This means technically we croak one
152 * index lower than we should in theory; in practice
153 * its unlikely the system has SSize_t_MAX/sizeof(SV*)
155 MEM_WRAP_CHECK_s(newmax, SV*, "Out of memory during array extend");
157 #ifdef STRESS_REALLOC
159 SV ** const old_alloc = *allocp;
160 Newx(*allocp, newmax+1, SV*);
161 Copy(old_alloc, *allocp, *maxp + 1, SV*);
165 Renew(*allocp,newmax+1, SV*);
167 #ifdef Perl_safesysmalloc_size
170 to_null += newmax - *maxp;
173 /* See GH#18014 for discussion of when this might be needed: */
174 if (av == PL_curstack) { /* Oops, grew stack (via av_store()?) */
175 PL_stack_sp = *allocp + (PL_stack_sp - PL_stack_base);
176 PL_stack_base = *allocp;
177 PL_stack_max = PL_stack_base + newmax;
179 } else { /* there is no SV* array yet */
180 *maxp = key < 3 ? 3 : key;
182 /* see comment above about newmax+1*/
183 MEM_WRAP_CHECK_s(*maxp, SV*,
184 "Out of memory during array extend");
186 /* Newxz isn't used below because testing showed it to be slower
187 * than Newx+Zero (also slower than Newx + the previous while
188 * loop) for small arrays, which are very common in perl. */
189 Newx(*allocp, *maxp+1, SV*);
190 /* Stacks require only the first element to be &PL_sv_undef
191 * (set elsewhere). However, since non-stack AVs are likely
192 * to dominate in modern production applications, stacks
193 * don't get any special treatment here.
194 * See https://github.com/Perl/perl5/pull/18690 for more detail */
200 if (av && AvREAL(av)) {
202 Zero(*allocp + ary_offset,to_null,SV*);
212 Returns the SV at the specified index in the array. The C<key> is the
213 index. If C<lval> is true, you are guaranteed to get a real SV back (in case
214 it wasn't real before), which you can then modify. Check that the return
215 value is non-NULL before dereferencing it to a C<SV*>.
217 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
218 more information on how to use this function on tied arrays.
220 The rough perl equivalent is C<$myarray[$key]>.
226 S_adjust_index(pTHX_ AV *av, const MAGIC *mg, SSize_t *keyp)
228 bool adjust_index = 1;
230 /* Handle negative array indices 20020222 MJD */
231 SV * const ref = SvTIED_obj(MUTABLE_SV(av), mg);
233 if (SvROK(ref) && SvOBJECT(SvRV(ref))) {
234 SV * const * const negative_indices_glob =
235 hv_fetchs(SvSTASH(SvRV(ref)), NEGATIVE_INDICES_VAR, 0);
237 if (negative_indices_glob && isGV(*negative_indices_glob)
238 && SvTRUE(GvSV(*negative_indices_glob)))
244 *keyp += AvFILL(av) + 1;
252 Perl_av_fetch(pTHX_ AV *av, SSize_t key, I32 lval)
257 PERL_ARGS_ASSERT_AV_FETCH;
258 assert(SvTYPE(av) == SVt_PVAV);
260 if (UNLIKELY(SvRMAGICAL(av))) {
261 const MAGIC * const tied_magic
262 = mg_find((const SV *)av, PERL_MAGIC_tied);
263 if (tied_magic || mg_find((const SV *)av, PERL_MAGIC_regdata)) {
266 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
270 sv = newSV_type_mortal(SVt_PVLV);
271 mg_copy(MUTABLE_SV(av), sv, 0, key);
272 if (!tied_magic) /* for regdata, force leavesub to make copies */
275 LvTARG(sv) = sv; /* fake (SV**) */
276 return &(LvTARG(sv));
281 size = AvFILLp(av) + 1;
282 key += neg * size; /* handle negative index without using branch */
284 /* the cast from SSize_t to Size_t allows both (key < 0) and (key >= size)
285 * to be tested as a single condition */
286 if ((Size_t)key >= (Size_t)size) {
292 if (!AvARRAY(av)[key]) {
294 return lval ? av_store(av,key,newSV_type(SVt_NULL)) : NULL;
297 return &AvARRAY(av)[key];
303 Stores an SV in an array. The array index is specified as C<key>. The
304 return value will be C<NULL> if the operation failed or if the value did not
305 need to be actually stored within the array (as in the case of tied
306 arrays). Otherwise, it can be dereferenced
307 to get the C<SV*> that was stored
310 Note that the caller is responsible for suitably incrementing the reference
311 count of C<val> before the call, and decrementing it if the function
314 Approximate Perl equivalent: C<splice(@myarray, $key, 1, $val)>.
316 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
317 more information on how to use this function on tied arrays.
323 Perl_av_store(pTHX_ AV *av, SSize_t key, SV *val)
327 PERL_ARGS_ASSERT_AV_STORE;
328 assert(SvTYPE(av) == SVt_PVAV);
330 /* S_regclass relies on being able to pass in a NULL sv
331 (unicode_alternate may be NULL).
334 if (SvRMAGICAL(av)) {
335 const MAGIC * const tied_magic = mg_find((const SV *)av, PERL_MAGIC_tied);
338 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
342 mg_copy(MUTABLE_SV(av), val, 0, key);
350 key += AvFILL(av) + 1;
355 if (SvREADONLY(av) && key >= AvFILL(av))
356 Perl_croak_no_modify();
358 if (!AvREAL(av) && AvREIFY(av))
363 if (AvFILLp(av) < key) {
365 if (av == PL_curstack && key > PL_stack_sp - PL_stack_base)
366 PL_stack_sp = PL_stack_base + key; /* XPUSH in disguise */
368 ary[++AvFILLp(av)] = NULL;
369 } while (AvFILLp(av) < key);
374 SvREFCNT_dec(ary[key]);
376 if (SvSMAGICAL(av)) {
377 const MAGIC *mg = SvMAGIC(av);
379 for (; mg; mg = mg->mg_moremagic) {
380 if (!isUPPER(mg->mg_type)) continue;
382 sv_magic(val, MUTABLE_SV(av), toLOWER(mg->mg_type), 0, key);
384 if (PL_delaymagic && mg->mg_type == PERL_MAGIC_isa) {
385 PL_delaymagic |= DM_ARRAY_ISA;
390 mg_set(MUTABLE_SV(av));
398 Creates a new AV and populates it with a list (C<**strp>, length C<size>) of
399 SVs. A copy is made of each SV, so their refcounts are not changed. The new
400 AV will have a reference count of 1.
402 Perl equivalent: C<my @new_array = ($scalar1, $scalar2, $scalar3...);>
408 Perl_av_make(pTHX_ SSize_t size, SV **strp)
410 AV * const av = newAV();
411 /* sv_upgrade does AvREAL_only() */
412 PERL_ARGS_ASSERT_AV_MAKE;
413 assert(SvTYPE(av) == SVt_PVAV);
415 if (size) { /* "defined" was returning undef for size==0 anyway. */
423 AvMAX(av) = size - 1;
424 /* avoid av being leaked if croak when calling magic below */
426 PL_tmps_stack[++PL_tmps_ix] = (SV*)av;
427 orig_ix = PL_tmps_ix;
429 for (i = 0; i < size; i++) {
432 /* Don't let sv_setsv swipe, since our source array might
433 have multiple references to the same temp scalar (e.g.
434 from a list slice) */
436 SvGETMAGIC(*strp); /* before newSV, in case it dies */
438 ary[i] = newSV_type(SVt_NULL);
439 sv_setsv_flags(ary[i], *strp,
440 SV_DO_COW_SVSETSV|SV_NOSTEAL);
443 /* disarm av's leak guard */
444 if (LIKELY(PL_tmps_ix == orig_ix))
447 PL_tmps_stack[orig_ix] = &PL_sv_undef;
455 Creates a new AV and populates it with values copied from an existing AV. The
456 new AV will have a reference count of 1, and will contain newly created SVs
457 copied from the original SV. The original source will remain unchanged.
459 Perl equivalent: C<my @new_array = @existing_array;>
465 Perl_newAVav(pTHX_ AV *oav)
467 PERL_ARGS_ASSERT_NEWAVAV;
469 Size_t count = av_count(oav);
471 if(UNLIKELY(!oav) || count == 0)
474 AV *ret = newAV_alloc_x(count);
476 /* avoid ret being leaked if croak when calling magic below */
478 PL_tmps_stack[++PL_tmps_ix] = (SV *)ret;
479 SSize_t ret_at_tmps_ix = PL_tmps_ix;
482 if(LIKELY(!SvRMAGICAL(oav) && AvREAL(oav) && (SvTYPE(oav) == SVt_PVAV))) {
483 for(i = 0; i < count; i++) {
484 SV **svp = av_fetch_simple(oav, i, 0);
485 av_push_simple(ret, svp ? newSVsv(*svp) : &PL_sv_undef);
488 for(i = 0; i < count; i++) {
489 SV **svp = av_fetch(oav, i, 0);
490 av_push_simple(ret, svp ? newSVsv(*svp) : &PL_sv_undef);
494 /* disarm leak guard */
495 if(LIKELY(PL_tmps_ix == ret_at_tmps_ix))
498 PL_tmps_stack[ret_at_tmps_ix] = &PL_sv_undef;
506 Creates a new AV and populates it with keys and values copied from an existing
507 HV. The new AV will have a reference count of 1, and will contain newly
508 created SVs copied from the original HV. The original source will remain
511 Perl equivalent: C<my @new_array = %existing_hash;>
517 Perl_newAVhv(pTHX_ HV *ohv)
519 PERL_ARGS_ASSERT_NEWAVHV;
524 bool tied = SvRMAGICAL(ohv) && mg_find(MUTABLE_SV(ohv), PERL_MAGIC_tied);
526 Size_t nkeys = hv_iterinit(ohv);
527 /* This number isn't perfect but it doesn't matter; it only has to be
528 * close to make the initial allocation about the right size
530 AV *ret = newAV_alloc_xz(nkeys ? nkeys * 2 : 2);
532 /* avoid ret being leaked if croak when calling magic below */
534 PL_tmps_stack[++PL_tmps_ix] = (SV *)ret;
535 SSize_t ret_at_tmps_ix = PL_tmps_ix;
539 while((he = hv_iternext(ohv))) {
541 av_push_simple(ret, newSVsv(hv_iterkeysv(he)));
542 av_push_simple(ret, newSVsv(hv_iterval(ohv, he)));
545 av_push_simple(ret, newSVhek(HeKEY_hek(he)));
546 av_push_simple(ret, HeVAL(he) ? newSVsv(HeVAL(he)) : &PL_sv_undef);
550 /* disarm leak guard */
551 if(LIKELY(PL_tmps_ix == ret_at_tmps_ix))
554 PL_tmps_stack[ret_at_tmps_ix] = &PL_sv_undef;
562 Frees all the elements of an array, leaving it empty.
563 The XS equivalent of C<@array = ()>. See also L</av_undef>.
565 Note that it is possible that the actions of a destructor called directly
566 or indirectly by freeing an element of the array could cause the reference
567 count of the array itself to be reduced (e.g. by deleting an entry in the
568 symbol table). So it is a possibility that the AV could have been freed
569 (or even reallocated) on return from the call unless you hold a reference
576 Perl_av_clear(pTHX_ AV *av)
582 PERL_ARGS_ASSERT_AV_CLEAR;
583 assert(SvTYPE(av) == SVt_PVAV);
586 if (SvREFCNT(av) == 0) {
587 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "Attempt to clear deleted array");
592 Perl_croak_no_modify();
594 /* Give any tie a chance to cleanup first */
595 if (SvRMAGICAL(av)) {
596 const MAGIC* const mg = SvMAGIC(av);
597 if (PL_delaymagic && mg && mg->mg_type == PERL_MAGIC_isa)
598 PL_delaymagic |= DM_ARRAY_ISA;
600 mg_clear(MUTABLE_SV(av));
606 if ((real = cBOOL(AvREAL(av)))) {
607 SV** const ary = AvARRAY(av);
608 SSize_t index = AvFILLp(av) + 1;
610 /* avoid av being freed when calling destructors below */
612 PL_tmps_stack[++PL_tmps_ix] = SvREFCNT_inc_simple_NN(av);
613 orig_ix = PL_tmps_ix;
616 SV * const sv = ary[--index];
617 /* undef the slot before freeing the value, because a
618 * destructor might try to modify this array */
623 extra = AvARRAY(av) - AvALLOC(av);
626 AvARRAY(av) = AvALLOC(av);
630 /* disarm av's premature free guard */
631 if (LIKELY(PL_tmps_ix == orig_ix))
634 PL_tmps_stack[orig_ix] = &PL_sv_undef;
642 Undefines the array. The XS equivalent of C<undef(@array)>.
644 As well as freeing all the elements of the array (like C<av_clear()>), this
645 also frees the memory used by the av to store its list of scalars.
647 See L</av_clear> for a note about the array possibly being invalid on
654 Perl_av_undef(pTHX_ AV *av)
657 SSize_t orig_ix = PL_tmps_ix; /* silence bogus warning about possible unitialized use */
659 PERL_ARGS_ASSERT_AV_UNDEF;
660 assert(SvTYPE(av) == SVt_PVAV);
662 /* Give any tie a chance to cleanup first */
663 if (SvTIED_mg((const SV *)av, PERL_MAGIC_tied))
666 real = cBOOL(AvREAL(av));
668 SSize_t key = AvFILLp(av) + 1;
670 /* avoid av being freed when calling destructors below */
672 PL_tmps_stack[++PL_tmps_ix] = SvREFCNT_inc_simple_NN(av);
673 orig_ix = PL_tmps_ix;
676 SvREFCNT_dec(AvARRAY(av)[--key]);
679 Safefree(AvALLOC(av));
682 AvMAX(av) = AvFILLp(av) = -1;
684 if(SvRMAGICAL(av)) mg_clear(MUTABLE_SV(av));
686 /* disarm av's premature free guard */
687 if (LIKELY(PL_tmps_ix == orig_ix))
690 PL_tmps_stack[orig_ix] = &PL_sv_undef;
697 =for apidoc av_create_and_push
699 Push an SV onto the end of the array, creating the array if necessary.
700 A small internal helper function to remove a commonly duplicated idiom.
706 Perl_av_create_and_push(pTHX_ AV **const avp, SV *const val)
708 PERL_ARGS_ASSERT_AV_CREATE_AND_PUSH;
718 Pushes an SV (transferring control of one reference count) onto the end of the
719 array. The array will grow automatically to accommodate the addition.
721 Perl equivalent: C<push @myarray, $val;>.
727 Perl_av_push(pTHX_ AV *av, SV *val)
731 PERL_ARGS_ASSERT_AV_PUSH;
732 assert(SvTYPE(av) == SVt_PVAV);
735 Perl_croak_no_modify();
737 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
738 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(PUSH), G_DISCARD, 1,
742 av_store(av,AvFILLp(av)+1,val);
748 Removes one SV from the end of the array, reducing its size by one and
749 returning the SV (transferring control of one reference count) to the
750 caller. Returns C<&PL_sv_undef> if the array is empty.
752 Perl equivalent: C<pop(@myarray);>
758 Perl_av_pop(pTHX_ AV *av)
763 PERL_ARGS_ASSERT_AV_POP;
764 assert(SvTYPE(av) == SVt_PVAV);
767 Perl_croak_no_modify();
768 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
769 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(POP), 0, 0);
771 retval = newSVsv(retval);
776 retval = AvARRAY(av)[AvFILLp(av)];
777 AvARRAY(av)[AvFILLp(av)--] = NULL;
779 mg_set(MUTABLE_SV(av));
780 return retval ? retval : &PL_sv_undef;
785 =for apidoc av_create_and_unshift_one
787 Unshifts an SV onto the beginning of the array, creating the array if
789 A small internal helper function to remove a commonly duplicated idiom.
795 Perl_av_create_and_unshift_one(pTHX_ AV **const avp, SV *const val)
797 PERL_ARGS_ASSERT_AV_CREATE_AND_UNSHIFT_ONE;
802 return av_store(*avp, 0, val);
806 =for apidoc av_unshift
808 Unshift the given number of C<undef> values onto the beginning of the
809 array. The array will grow automatically to accommodate the addition.
811 Perl equivalent: S<C<unshift @myarray, ((undef) x $num);>>
817 Perl_av_unshift(pTHX_ AV *av, SSize_t num)
822 PERL_ARGS_ASSERT_AV_UNSHIFT;
823 assert(SvTYPE(av) == SVt_PVAV);
826 Perl_croak_no_modify();
828 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
829 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(UNSHIFT),
830 G_DISCARD | G_UNDEF_FILL, num);
836 if (!AvREAL(av) && AvREIFY(av))
838 i = AvARRAY(av) - AvALLOC(av);
846 AvARRAY(av) = AvARRAY(av) - i;
850 const SSize_t i = AvFILLp(av);
851 /* Create extra elements */
852 const SSize_t slide = i > 0 ? i : 0;
854 av_extend(av, i + num);
857 Move(ary, ary + num, i + 1, SV*);
861 /* Make extra elements into a buffer */
863 AvFILLp(av) -= slide;
864 AvARRAY(av) = AvARRAY(av) + slide;
871 Removes one SV from the start of the array, reducing its size by one and
872 returning the SV (transferring control of one reference count) to the
873 caller. Returns C<&PL_sv_undef> if the array is empty.
875 Perl equivalent: C<shift(@myarray);>
881 Perl_av_shift(pTHX_ AV *av)
886 PERL_ARGS_ASSERT_AV_SHIFT;
887 assert(SvTYPE(av) == SVt_PVAV);
890 Perl_croak_no_modify();
891 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
892 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(SHIFT), 0, 0);
894 retval = newSVsv(retval);
899 retval = *AvARRAY(av);
902 AvARRAY(av) = AvARRAY(av) + 1;
906 mg_set(MUTABLE_SV(av));
907 return retval ? retval : &PL_sv_undef;
911 =for apidoc av_tindex
912 =for apidoc_item av_top_index
914 These behave identically.
915 If the array C<av> is empty, these return -1; otherwise they return the maximum
916 value of the indices of all the array elements which are currently defined in
919 They process 'get' magic.
921 The Perl equivalent for these is C<$#av>.
923 Use C<L</av_count>> to get the number of elements in an array.
927 Same as L</av_top_index>. Note that, unlike what the name implies, it returns
928 the maximum index in the array. This is unlike L</sv_len>, which returns what
931 B<To get the true number of elements in the array, instead use C<L</av_count>>>.
937 Perl_av_len(pTHX_ AV *av)
939 PERL_ARGS_ASSERT_AV_LEN;
941 return av_top_index(av);
947 Set the highest index in the array to the given number, equivalent to
948 Perl's S<C<$#array = $fill;>>.
950 The number of elements in the array will be S<C<fill + 1>> after
951 C<av_fill()> returns. If the array was previously shorter, then the
952 additional elements appended are set to NULL. If the array
953 was longer, then the excess elements are freed. S<C<av_fill(av, -1)>> is
954 the same as C<av_clear(av)>.
959 Perl_av_fill(pTHX_ AV *av, SSize_t fill)
963 PERL_ARGS_ASSERT_AV_FILL;
964 assert(SvTYPE(av) == SVt_PVAV);
968 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
969 SV *arg1 = sv_newmortal();
970 sv_setiv(arg1, (IV)(fill + 1));
971 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(STORESIZE), G_DISCARD,
975 if (fill <= AvMAX(av)) {
976 SSize_t key = AvFILLp(av);
977 SV** const ary = AvARRAY(av);
981 SvREFCNT_dec(ary[key]);
992 mg_set(MUTABLE_SV(av));
995 (void)av_store(av,fill,NULL);
999 =for apidoc av_delete
1001 Deletes the element indexed by C<key> from the array, makes the element
1002 mortal, and returns it. If C<flags> equals C<G_DISCARD>, the element is
1003 freed and NULL is returned. NULL is also returned if C<key> is out of
1006 Perl equivalent: S<C<splice(@myarray, $key, 1, undef)>> (with the
1007 C<splice> in void context if C<G_DISCARD> is present).
1012 Perl_av_delete(pTHX_ AV *av, SSize_t key, I32 flags)
1016 PERL_ARGS_ASSERT_AV_DELETE;
1017 assert(SvTYPE(av) == SVt_PVAV);
1020 Perl_croak_no_modify();
1022 if (SvRMAGICAL(av)) {
1023 const MAGIC * const tied_magic
1024 = mg_find((const SV *)av, PERL_MAGIC_tied);
1025 if ((tied_magic || mg_find((const SV *)av, PERL_MAGIC_regdata))) {
1028 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
1031 svp = av_fetch(av, key, TRUE);
1035 if (mg_find(sv, PERL_MAGIC_tiedelem)) {
1036 sv_unmagic(sv, PERL_MAGIC_tiedelem); /* No longer an element */
1045 key += AvFILL(av) + 1;
1050 if (key > AvFILLp(av))
1053 if (!AvREAL(av) && AvREIFY(av))
1055 sv = AvARRAY(av)[key];
1056 AvARRAY(av)[key] = NULL;
1057 if (key == AvFILLp(av)) {
1060 } while (--key >= 0 && !AvARRAY(av)[key]);
1063 mg_set(MUTABLE_SV(av));
1066 if (flags & G_DISCARD) {
1067 SvREFCNT_dec_NN(sv);
1070 else if (AvREAL(av))
1077 =for apidoc av_exists
1079 Returns true if the element indexed by C<key> has been initialized.
1081 This relies on the fact that uninitialized array elements are set to
1084 Perl equivalent: C<exists($myarray[$key])>.
1089 Perl_av_exists(pTHX_ AV *av, SSize_t key)
1091 PERL_ARGS_ASSERT_AV_EXISTS;
1092 assert(SvTYPE(av) == SVt_PVAV);
1094 if (SvRMAGICAL(av)) {
1095 const MAGIC * const tied_magic
1096 = mg_find((const SV *)av, PERL_MAGIC_tied);
1097 const MAGIC * const regdata_magic
1098 = mg_find((const SV *)av, PERL_MAGIC_regdata);
1099 if (tied_magic || regdata_magic) {
1101 /* Handle negative array indices 20020222 MJD */
1103 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
1107 if(key >= 0 && regdata_magic) {
1108 if (key <= AvFILL(av))
1114 SV * const sv = sv_newmortal();
1115 mg_copy(MUTABLE_SV(av), sv, 0, key);
1116 mg = mg_find(sv, PERL_MAGIC_tiedelem);
1118 magic_existspack(sv, mg);
1120 I32 retbool = SvTRUE_nomg_NN(sv);
1121 return cBOOL(retbool);
1129 key += AvFILL(av) + 1;
1134 if (key <= AvFILLp(av) && AvARRAY(av)[key])
1136 if (SvSMAGICAL(AvARRAY(av)[key])
1137 && mg_find(AvARRAY(av)[key], PERL_MAGIC_nonelem))
1146 S_get_aux_mg(pTHX_ AV *av) {
1149 PERL_ARGS_ASSERT_GET_AUX_MG;
1150 assert(SvTYPE(av) == SVt_PVAV);
1152 mg = mg_find((const SV *)av, PERL_MAGIC_arylen_p);
1155 mg = sv_magicext(MUTABLE_SV(av), 0, PERL_MAGIC_arylen_p,
1156 &PL_vtbl_arylen_p, 0, 0);
1158 /* sv_magicext won't set this for us because we pass in a NULL obj */
1159 mg->mg_flags |= MGf_REFCOUNTED;
1165 Perl_av_arylen_p(pTHX_ AV *av) {
1166 MAGIC *const mg = get_aux_mg(av);
1168 PERL_ARGS_ASSERT_AV_ARYLEN_P;
1169 assert(SvTYPE(av) == SVt_PVAV);
1171 return &(mg->mg_obj);
1175 Perl_av_iter_p(pTHX_ AV *av) {
1176 MAGIC *const mg = get_aux_mg(av);
1178 PERL_ARGS_ASSERT_AV_ITER_P;
1179 assert(SvTYPE(av) == SVt_PVAV);
1181 if (sizeof(IV) == sizeof(SSize_t)) {
1182 return (IV *)&(mg->mg_len);
1186 mg->mg_len = IVSIZE;
1188 mg->mg_ptr = (char *) temp;
1190 return (IV *)mg->mg_ptr;
1195 Perl_av_nonelem(pTHX_ AV *av, SSize_t ix) {
1196 SV * const sv = newSV_type(SVt_NULL);
1197 PERL_ARGS_ASSERT_AV_NONELEM;
1198 if (!av_store(av,ix,sv))
1199 return sv_2mortal(sv); /* has tie magic */
1200 sv_magic(sv, NULL, PERL_MAGIC_nonelem, NULL, 0);
1205 * ex: set ts=8 sts=4 sw=4 et: