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"]
19 =head1 Array Manipulation Functions
27 Perl_av_reify(pTHX_ AV *av)
31 PERL_ARGS_ASSERT_AV_REIFY;
32 assert(SvTYPE(av) == SVt_PVAV);
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");
41 while (key > AvFILLp(av) + 1)
42 AvARRAY(av)[--key] = NULL;
44 SV * const sv = AvARRAY(av)[--key];
45 if (sv != &PL_sv_undef)
46 SvREFCNT_inc_simple_void(sv);
48 key = AvARRAY(av) - AvALLOC(av);
50 AvALLOC(av)[--key] = NULL;
58 Pre-extend an array so that it is capable of storing values at indexes
59 C<0..key>. Thus C<av_extend(av,99)> guarantees that the array can store 100
60 elements, i.e. that C<av_store(av, 0, sv)> through C<av_store(av, 99, sv)>
61 on a plain array will work without any further memory allocation.
63 If the av argument is a tied array then will call the C<EXTEND> tied
64 array method with an argument of C<(key+1)>.
70 Perl_av_extend(pTHX_ AV *av, SSize_t key)
74 PERL_ARGS_ASSERT_AV_EXTEND;
75 assert(SvTYPE(av) == SVt_PVAV);
77 mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied);
79 SV *arg1 = sv_newmortal();
80 /* NOTE: the API for av_extend() is NOT the same as the tie method EXTEND.
82 * The C function takes an *index* (assumes 0 indexed arrays) and ensures
83 * that the array is at least as large as the index provided.
85 * The tied array method EXTEND takes a *count* and ensures that the array
86 * is at least that many elements large. Thus we have to +1 the key when
87 * we call the tied method.
89 sv_setiv(arg1, (IV)(key + 1));
90 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(EXTEND), G_DISCARD, 1,
94 av_extend_guts(av,key,&AvMAX(av),&AvALLOC(av),&AvARRAY(av));
97 /* The guts of av_extend. *Not* for general use! */
99 Perl_av_extend_guts(pTHX_ AV *av, SSize_t key, SSize_t *maxp, SV ***allocp,
102 PERL_ARGS_ASSERT_AV_EXTEND_GUTS;
104 if (key < -1) /* -1 is legal */
106 "panic: av_extend_guts() negative count (%" IVdf ")", (IV)key);
113 if (av && *allocp != *arrayp) {
114 ary = *allocp + AvFILLp(av) + 1;
115 tmp = *arrayp - *allocp;
116 Move(*arrayp, *allocp, AvFILLp(av)+1, SV*);
123 if (key > *maxp - 10) {
124 newmax = key + *maxp;
131 #ifdef Perl_safesysmalloc_size
132 /* Whilst it would be quite possible to move this logic around
133 (as I did in the SV code), so as to set AvMAX(av) early,
134 based on calling Perl_safesysmalloc_size() immediately after
135 allocation, I'm not convinced that it is a great idea here.
136 In an array we have to loop round setting everything to
137 NULL, which means writing to memory, potentially lots
138 of it, whereas for the SV buffer case we don't touch the
139 "bonus" memory. So there there is no cost in telling the
140 world about it, whereas here we have to do work before we can
141 tell the world about it, and that work involves writing to
142 memory that might never be read. So, I feel, better to keep
143 the current lazy system of only writing to it if our caller
144 has a need for more space. NWC */
145 newmax = Perl_safesysmalloc_size((void*)*allocp) /
146 sizeof(const SV *) - 1;
151 /* overflow-safe version of newmax = key + *maxp/5 */
153 newmax = (key > SSize_t_MAX - newmax)
154 ? SSize_t_MAX : key + newmax;
157 /* it should really be newmax+1 here, but if newmax
158 * happens to equal SSize_t_MAX, then newmax+1 is
159 * undefined. This means technically we croak one
160 * index lower than we should in theory; in practice
161 * its unlikely the system has SSize_t_MAX/sizeof(SV*)
163 MEM_WRAP_CHECK_s(newmax, SV*, "Out of memory during array extend");
165 #ifdef STRESS_REALLOC
167 SV ** const old_alloc = *allocp;
168 Newx(*allocp, newmax+1, SV*);
169 Copy(old_alloc, *allocp, *maxp + 1, SV*);
173 Renew(*allocp,newmax+1, SV*);
175 #ifdef Perl_safesysmalloc_size
178 ary = *allocp + *maxp + 1;
179 tmp = newmax - *maxp;
180 if (av == PL_curstack) { /* Oops, grew stack (via av_store()?) */
181 PL_stack_sp = *allocp + (PL_stack_sp - PL_stack_base);
182 PL_stack_base = *allocp;
183 PL_stack_max = PL_stack_base + newmax;
187 newmax = key < 3 ? 3 : key;
189 /* see comment above about newmax+1*/
190 MEM_WRAP_CHECK_s(newmax, SV*, "Out of memory during array extend");
192 Newx(*allocp, newmax+1, SV*);
195 *allocp[0] = NULL; /* For the stacks */
197 if (av && AvREAL(av)) {
211 Returns the SV at the specified index in the array. The C<key> is the
212 index. If lval is true, you are guaranteed to get a real SV back (in case
213 it wasn't real before), which you can then modify. Check that the return
214 value is non-null before dereferencing it to a C<SV*>.
216 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
217 more information on how to use this function on tied arrays.
219 The rough perl equivalent is C<$myarray[$key]>.
225 S_adjust_index(pTHX_ AV *av, const MAGIC *mg, SSize_t *keyp)
227 bool adjust_index = 1;
229 /* Handle negative array indices 20020222 MJD */
230 SV * const ref = SvTIED_obj(MUTABLE_SV(av), mg);
232 if (SvROK(ref) && SvOBJECT(SvRV(ref))) {
233 SV * const * const negative_indices_glob =
234 hv_fetchs(SvSTASH(SvRV(ref)), NEGATIVE_INDICES_VAR, 0);
236 if (negative_indices_glob && isGV(*negative_indices_glob)
237 && SvTRUE(GvSV(*negative_indices_glob)))
243 *keyp += AvFILL(av) + 1;
251 Perl_av_fetch(pTHX_ AV *av, SSize_t key, I32 lval)
256 PERL_ARGS_ASSERT_AV_FETCH;
257 assert(SvTYPE(av) == SVt_PVAV);
259 if (UNLIKELY(SvRMAGICAL(av))) {
260 const MAGIC * const tied_magic
261 = mg_find((const SV *)av, PERL_MAGIC_tied);
262 if (tied_magic || mg_find((const SV *)av, PERL_MAGIC_regdata)) {
265 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
270 sv_upgrade(sv, 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(0)) : 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 of SVs. The SVs are copied
399 into the array, so they may be freed after the call to C<av_make>. The new AV
400 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 = MUTABLE_AV(newSV_type(SVt_PVAV));
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;
425 /* avoid av being leaked if croak when calling magic below */
427 PL_tmps_stack[++PL_tmps_ix] = (SV*)av;
428 orig_ix = PL_tmps_ix;
430 for (i = 0; i < size; i++) {
433 /* Don't let sv_setsv swipe, since our source array might
434 have multiple references to the same temp scalar (e.g.
435 from a list slice) */
437 SvGETMAGIC(*strp); /* before newSV, in case it dies */
440 sv_setsv_flags(ary[i], *strp,
441 SV_DO_COW_SVSETSV|SV_NOSTEAL);
444 /* disarm av's leak guard */
445 if (LIKELY(PL_tmps_ix == orig_ix))
448 PL_tmps_stack[orig_ix] = &PL_sv_undef;
456 Frees the all the elements of an array, leaving it empty.
457 The XS equivalent of C<@array = ()>. See also L</av_undef>.
459 Note that it is possible that the actions of a destructor called directly
460 or indirectly by freeing an element of the array could cause the reference
461 count of the array itself to be reduced (e.g. by deleting an entry in the
462 symbol table). So it is a possibility that the AV could have been freed
463 (or even reallocated) on return from the call unless you hold a reference
470 Perl_av_clear(pTHX_ AV *av)
476 PERL_ARGS_ASSERT_AV_CLEAR;
477 assert(SvTYPE(av) == SVt_PVAV);
480 if (SvREFCNT(av) == 0) {
481 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "Attempt to clear deleted array");
486 Perl_croak_no_modify();
488 /* Give any tie a chance to cleanup first */
489 if (SvRMAGICAL(av)) {
490 const MAGIC* const mg = SvMAGIC(av);
491 if (PL_delaymagic && mg && mg->mg_type == PERL_MAGIC_isa)
492 PL_delaymagic |= DM_ARRAY_ISA;
494 mg_clear(MUTABLE_SV(av));
500 if ((real = cBOOL(AvREAL(av)))) {
501 SV** const ary = AvARRAY(av);
502 SSize_t index = AvFILLp(av) + 1;
504 /* avoid av being freed when calling destructors below */
506 PL_tmps_stack[++PL_tmps_ix] = SvREFCNT_inc_simple_NN(av);
507 orig_ix = PL_tmps_ix;
510 SV * const sv = ary[--index];
511 /* undef the slot before freeing the value, because a
512 * destructor might try to modify this array */
517 extra = AvARRAY(av) - AvALLOC(av);
520 AvARRAY(av) = AvALLOC(av);
524 /* disarm av's premature free guard */
525 if (LIKELY(PL_tmps_ix == orig_ix))
528 PL_tmps_stack[orig_ix] = &PL_sv_undef;
536 Undefines the array. The XS equivalent of C<undef(@array)>.
538 As well as freeing all the elements of the array (like C<av_clear()>), this
539 also frees the memory used by the av to store its list of scalars.
541 See L</av_clear> for a note about the array possibly being invalid on
548 Perl_av_undef(pTHX_ AV *av)
551 SSize_t orig_ix = PL_tmps_ix; /* silence bogus warning about possible unitialized use */
553 PERL_ARGS_ASSERT_AV_UNDEF;
554 assert(SvTYPE(av) == SVt_PVAV);
556 /* Give any tie a chance to cleanup first */
557 if (SvTIED_mg((const SV *)av, PERL_MAGIC_tied))
560 real = cBOOL(AvREAL(av));
562 SSize_t key = AvFILLp(av) + 1;
564 /* avoid av being freed when calling destructors below */
566 PL_tmps_stack[++PL_tmps_ix] = SvREFCNT_inc_simple_NN(av);
567 orig_ix = PL_tmps_ix;
570 SvREFCNT_dec(AvARRAY(av)[--key]);
573 Safefree(AvALLOC(av));
576 AvMAX(av) = AvFILLp(av) = -1;
578 if(SvRMAGICAL(av)) mg_clear(MUTABLE_SV(av));
580 /* disarm av's premature free guard */
581 if (LIKELY(PL_tmps_ix == orig_ix))
584 PL_tmps_stack[orig_ix] = &PL_sv_undef;
591 =for apidoc av_create_and_push
593 Push an SV onto the end of the array, creating the array if necessary.
594 A small internal helper function to remove a commonly duplicated idiom.
600 Perl_av_create_and_push(pTHX_ AV **const avp, SV *const val)
602 PERL_ARGS_ASSERT_AV_CREATE_AND_PUSH;
612 Pushes an SV (transferring control of one reference count) onto the end of the
613 array. The array will grow automatically to accommodate the addition.
615 Perl equivalent: C<push @myarray, $val;>.
621 Perl_av_push(pTHX_ AV *av, SV *val)
625 PERL_ARGS_ASSERT_AV_PUSH;
626 assert(SvTYPE(av) == SVt_PVAV);
629 Perl_croak_no_modify();
631 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
632 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(PUSH), G_DISCARD, 1,
636 av_store(av,AvFILLp(av)+1,val);
642 Removes one SV from the end of the array, reducing its size by one and
643 returning the SV (transferring control of one reference count) to the
644 caller. Returns C<&PL_sv_undef> if the array is empty.
646 Perl equivalent: C<pop(@myarray);>
652 Perl_av_pop(pTHX_ AV *av)
657 PERL_ARGS_ASSERT_AV_POP;
658 assert(SvTYPE(av) == SVt_PVAV);
661 Perl_croak_no_modify();
662 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
663 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(POP), 0, 0);
665 retval = newSVsv(retval);
670 retval = AvARRAY(av)[AvFILLp(av)];
671 AvARRAY(av)[AvFILLp(av)--] = NULL;
673 mg_set(MUTABLE_SV(av));
674 return retval ? retval : &PL_sv_undef;
679 =for apidoc av_create_and_unshift_one
681 Unshifts an SV onto the beginning of the array, creating the array if
683 A small internal helper function to remove a commonly duplicated idiom.
689 Perl_av_create_and_unshift_one(pTHX_ AV **const avp, SV *const val)
691 PERL_ARGS_ASSERT_AV_CREATE_AND_UNSHIFT_ONE;
696 return av_store(*avp, 0, val);
700 =for apidoc av_unshift
702 Unshift the given number of C<undef> values onto the beginning of the
703 array. The array will grow automatically to accommodate the addition.
705 Perl equivalent: S<C<unshift @myarray, ((undef) x $num);>>
711 Perl_av_unshift(pTHX_ AV *av, SSize_t num)
716 PERL_ARGS_ASSERT_AV_UNSHIFT;
717 assert(SvTYPE(av) == SVt_PVAV);
720 Perl_croak_no_modify();
722 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
723 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(UNSHIFT),
724 G_DISCARD | G_UNDEF_FILL, num);
730 if (!AvREAL(av) && AvREIFY(av))
732 i = AvARRAY(av) - AvALLOC(av);
740 AvARRAY(av) = AvARRAY(av) - i;
744 const SSize_t i = AvFILLp(av);
745 /* Create extra elements */
746 const SSize_t slide = i > 0 ? i : 0;
748 av_extend(av, i + num);
751 Move(ary, ary + num, i + 1, SV*);
755 /* Make extra elements into a buffer */
757 AvFILLp(av) -= slide;
758 AvARRAY(av) = AvARRAY(av) + slide;
765 Removes one SV from the start of the array, reducing its size by one and
766 returning the SV (transferring control of one reference count) to the
767 caller. Returns C<&PL_sv_undef> if the array is empty.
769 Perl equivalent: C<shift(@myarray);>
775 Perl_av_shift(pTHX_ AV *av)
780 PERL_ARGS_ASSERT_AV_SHIFT;
781 assert(SvTYPE(av) == SVt_PVAV);
784 Perl_croak_no_modify();
785 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
786 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(SHIFT), 0, 0);
788 retval = newSVsv(retval);
793 retval = *AvARRAY(av);
796 AvARRAY(av) = AvARRAY(av) + 1;
800 mg_set(MUTABLE_SV(av));
801 return retval ? retval : &PL_sv_undef;
805 =for apidoc av_top_index
807 Returns the highest index in the array. The number of elements in the
808 array is S<C<av_top_index(av) + 1>>. Returns -1 if the array is empty.
810 The Perl equivalent for this is C<$#myarray>.
812 (A slightly shorter form is C<av_tindex>.)
816 Same as L</av_top_index>. Note that, unlike what the name implies, it returns
817 the highest index in the array, so to get the size of the array you need to use
818 S<C<av_len(av) + 1>>. This is unlike L</sv_len>, which returns what you would
825 Perl_av_len(pTHX_ AV *av)
827 PERL_ARGS_ASSERT_AV_LEN;
829 return av_top_index(av);
835 Set the highest index in the array to the given number, equivalent to
836 Perl's S<C<$#array = $fill;>>.
838 The number of elements in the array will be S<C<fill + 1>> after
839 C<av_fill()> returns. If the array was previously shorter, then the
840 additional elements appended are set to NULL. If the array
841 was longer, then the excess elements are freed. S<C<av_fill(av, -1)>> is
842 the same as C<av_clear(av)>.
847 Perl_av_fill(pTHX_ AV *av, SSize_t fill)
851 PERL_ARGS_ASSERT_AV_FILL;
852 assert(SvTYPE(av) == SVt_PVAV);
856 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
857 SV *arg1 = sv_newmortal();
858 sv_setiv(arg1, (IV)(fill + 1));
859 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(STORESIZE), G_DISCARD,
863 if (fill <= AvMAX(av)) {
864 SSize_t key = AvFILLp(av);
865 SV** const ary = AvARRAY(av);
869 SvREFCNT_dec(ary[key]);
880 mg_set(MUTABLE_SV(av));
883 (void)av_store(av,fill,NULL);
887 =for apidoc av_delete
889 Deletes the element indexed by C<key> from the array, makes the element
890 mortal, and returns it. If C<flags> equals C<G_DISCARD>, the element is
891 freed and NULL is returned. NULL is also returned if C<key> is out of
894 Perl equivalent: S<C<splice(@myarray, $key, 1, undef)>> (with the
895 C<splice> in void context if C<G_DISCARD> is present).
900 Perl_av_delete(pTHX_ AV *av, SSize_t key, I32 flags)
904 PERL_ARGS_ASSERT_AV_DELETE;
905 assert(SvTYPE(av) == SVt_PVAV);
908 Perl_croak_no_modify();
910 if (SvRMAGICAL(av)) {
911 const MAGIC * const tied_magic
912 = mg_find((const SV *)av, PERL_MAGIC_tied);
913 if ((tied_magic || mg_find((const SV *)av, PERL_MAGIC_regdata))) {
916 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
919 svp = av_fetch(av, key, TRUE);
923 if (mg_find(sv, PERL_MAGIC_tiedelem)) {
924 sv_unmagic(sv, PERL_MAGIC_tiedelem); /* No longer an element */
933 key += AvFILL(av) + 1;
938 if (key > AvFILLp(av))
941 if (!AvREAL(av) && AvREIFY(av))
943 sv = AvARRAY(av)[key];
944 AvARRAY(av)[key] = NULL;
945 if (key == AvFILLp(av)) {
948 } while (--key >= 0 && !AvARRAY(av)[key]);
951 mg_set(MUTABLE_SV(av));
954 if (flags & G_DISCARD) {
965 =for apidoc av_exists
967 Returns true if the element indexed by C<key> has been initialized.
969 This relies on the fact that uninitialized array elements are set to
972 Perl equivalent: C<exists($myarray[$key])>.
977 Perl_av_exists(pTHX_ AV *av, SSize_t key)
979 PERL_ARGS_ASSERT_AV_EXISTS;
980 assert(SvTYPE(av) == SVt_PVAV);
982 if (SvRMAGICAL(av)) {
983 const MAGIC * const tied_magic
984 = mg_find((const SV *)av, PERL_MAGIC_tied);
985 const MAGIC * const regdata_magic
986 = mg_find((const SV *)av, PERL_MAGIC_regdata);
987 if (tied_magic || regdata_magic) {
989 /* Handle negative array indices 20020222 MJD */
991 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
995 if(key >= 0 && regdata_magic) {
996 if (key <= AvFILL(av))
1002 SV * const sv = sv_newmortal();
1003 mg_copy(MUTABLE_SV(av), sv, 0, key);
1004 mg = mg_find(sv, PERL_MAGIC_tiedelem);
1006 magic_existspack(sv, mg);
1008 I32 retbool = SvTRUE_nomg_NN(sv);
1009 return cBOOL(retbool);
1017 key += AvFILL(av) + 1;
1022 if (key <= AvFILLp(av) && AvARRAY(av)[key])
1024 if (SvSMAGICAL(AvARRAY(av)[key])
1025 && mg_find(AvARRAY(av)[key], PERL_MAGIC_nonelem))
1034 S_get_aux_mg(pTHX_ AV *av) {
1037 PERL_ARGS_ASSERT_GET_AUX_MG;
1038 assert(SvTYPE(av) == SVt_PVAV);
1040 mg = mg_find((const SV *)av, PERL_MAGIC_arylen_p);
1043 mg = sv_magicext(MUTABLE_SV(av), 0, PERL_MAGIC_arylen_p,
1044 &PL_vtbl_arylen_p, 0, 0);
1046 /* sv_magicext won't set this for us because we pass in a NULL obj */
1047 mg->mg_flags |= MGf_REFCOUNTED;
1053 Perl_av_arylen_p(pTHX_ AV *av) {
1054 MAGIC *const mg = get_aux_mg(av);
1056 PERL_ARGS_ASSERT_AV_ARYLEN_P;
1057 assert(SvTYPE(av) == SVt_PVAV);
1059 return &(mg->mg_obj);
1063 Perl_av_iter_p(pTHX_ AV *av) {
1064 MAGIC *const mg = get_aux_mg(av);
1066 PERL_ARGS_ASSERT_AV_ITER_P;
1067 assert(SvTYPE(av) == SVt_PVAV);
1069 if (sizeof(IV) == sizeof(SSize_t)) {
1070 return (IV *)&(mg->mg_len);
1074 mg->mg_len = IVSIZE;
1076 mg->mg_ptr = (char *) temp;
1078 return (IV *)mg->mg_ptr;
1083 Perl_av_nonelem(pTHX_ AV *av, SSize_t ix) {
1084 SV * const sv = newSV(0);
1085 PERL_ARGS_ASSERT_AV_NONELEM;
1086 if (!av_store(av,ix,sv))
1087 return sv_2mortal(sv); /* has tie magic */
1088 sv_magic(sv, NULL, PERL_MAGIC_nonelem, NULL, 0);
1093 * ex: set ts=8 sts=4 sw=4 et: