This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Promote v5.36 usage and feature bundles doc
[perl5.git] / av.c
CommitLineData
a0d0e21e 1/* av.c
79072805 2 *
1129b882
NC
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
79072805
LW
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 *
a0d0e21e
LW
9 */
10
11/*
4ac71550
TC
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"]
79072805
LW
16 */
17
18#include "EXTERN.h"
864dbfa3 19#define PERL_IN_AV_C
79072805
LW
20#include "perl.h"
21
fb73857a 22void
864dbfa3 23Perl_av_reify(pTHX_ AV *av)
a0d0e21e 24{
c70927a6 25 SSize_t key;
fb73857a 26
7918f24d 27 PERL_ARGS_ASSERT_AV_REIFY;
2fed2a1b 28 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 29
3c78fafa 30 if (AvREAL(av))
1604cfb0 31 return;
93965878 32#ifdef DEBUGGING
9b387841 33 if (SvTIED_mg((const SV *)av, PERL_MAGIC_tied))
1604cfb0 34 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "av_reify called on tied array");
93965878 35#endif
a0d0e21e 36 key = AvMAX(av) + 1;
93965878 37 while (key > AvFILLp(av) + 1)
1604cfb0 38 AvARRAY(av)[--key] = NULL;
a0d0e21e 39 while (key) {
1604cfb0
MS
40 SV * const sv = AvARRAY(av)[--key];
41 if (sv != &PL_sv_undef)
42 SvREFCNT_inc_simple_void(sv);
a0d0e21e 43 }
29de640a
CS
44 key = AvARRAY(av) - AvALLOC(av);
45 while (key)
1604cfb0 46 AvALLOC(av)[--key] = NULL;
62b1ebc2 47 AvREIFY_off(av);
a0d0e21e
LW
48 AvREAL_on(av);
49}
50
cb50131a
CB
51/*
52=for apidoc av_extend
53
2b301921
YO
54Pre-extend an array so that it is capable of storing values at indexes
55C<0..key>. Thus C<av_extend(av,99)> guarantees that the array can store 100
56elements, i.e. that C<av_store(av, 0, sv)> through C<av_store(av, 99, sv)>
57on a plain array will work without any further memory allocation.
58
59If the av argument is a tied array then will call the C<EXTEND> tied
60array method with an argument of C<(key+1)>.
cb50131a
CB
61
62=cut
63*/
64
a0d0e21e 65void
fc16c392 66Perl_av_extend(pTHX_ AV *av, SSize_t key)
a0d0e21e 67{
7a5b473e
AL
68 MAGIC *mg;
69
7918f24d 70 PERL_ARGS_ASSERT_AV_EXTEND;
2fed2a1b 71 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 72
ad64d0ec 73 mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied);
823a54a3 74 if (mg) {
1604cfb0 75 SV *arg1 = sv_newmortal();
2b301921
YO
76 /* NOTE: the API for av_extend() is NOT the same as the tie method EXTEND.
77 *
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.
80 *
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.
84 */
1604cfb0
MS
85 sv_setiv(arg1, (IV)(key + 1));
86 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(EXTEND), G_DISCARD, 1,
87 arg1);
88 return;
93965878 89 }
7261499d
FC
90 av_extend_guts(av,key,&AvMAX(av),&AvALLOC(av),&AvARRAY(av));
91}
92
93/* The guts of av_extend. *Not* for general use! */
399fef93 94/* Also called directly from pp_assign, padlist_store, padnamelist_store */
7261499d 95void
fc16c392 96Perl_av_extend_guts(pTHX_ AV *av, SSize_t key, SSize_t *maxp, SV ***allocp,
440c1856 97 SV ***arrayp)
7261499d 98{
7261499d
FC
99 PERL_ARGS_ASSERT_AV_EXTEND_GUTS;
100
6768377c
DM
101 if (key < -1) /* -1 is legal */
102 Perl_croak(aTHX_
147e3846 103 "panic: av_extend_guts() negative count (%" IVdf ")", (IV)key);
6768377c 104
7261499d 105 if (key > *maxp) {
399fef93
RL
106 SSize_t ary_offset = *maxp + 1;
107 SSize_t to_null = 0;
108 SSize_t newmax = 0;
109
110 if (av && *allocp != *arrayp) { /* a shifted SV* array exists */
111 to_null = *arrayp - *allocp;
112 *maxp += to_null;
ce9f3c9c 113 ary_offset = AvFILLp(av) + 1;
440c1856 114
440c1856 115 Move(*arrayp, *allocp, AvFILLp(av)+1, SV*);
399fef93 116
440c1856
RL
117 if (key > *maxp - 10) {
118 newmax = key + *maxp;
119 goto resize;
120 }
399fef93 121 } else if (*allocp) { /* a full SV* array exists */
4633a7c4 122
ca7c1a29 123#ifdef Perl_safesysmalloc_size
440c1856
RL
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;
139
140 if (key <= newmax)
141 goto resized;
8d6dde3e 142#endif
440c1856
RL
143 /* overflow-safe version of newmax = key + *maxp/5 */
144 newmax = *maxp / 5;
145 newmax = (key > SSize_t_MAX - newmax)
146 ? SSize_t_MAX : key + newmax;
147 resize:
399fef93
RL
148 {
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*)
154 * bytes to spare! */
155 MEM_WRAP_CHECK_s(newmax, SV*, "Out of memory during array extend");
156 }
865e3ae0 157#ifdef STRESS_REALLOC
440c1856
RL
158 {
159 SV ** const old_alloc = *allocp;
160 Newx(*allocp, newmax+1, SV*);
161 Copy(old_alloc, *allocp, *maxp + 1, SV*);
162 Safefree(old_alloc);
163 }
865e3ae0 164#else
440c1856 165 Renew(*allocp,newmax+1, SV*);
865e3ae0 166#endif
ca7c1a29 167#ifdef Perl_safesysmalloc_size
440c1856 168 resized:
9c5ffd7c 169#endif
399fef93
RL
170 to_null += newmax - *maxp;
171 *maxp = newmax;
172
173 /* See GH#18014 for discussion of when this might be needed: */
174 if (av == PL_curstack) { /* Oops, grew stack (via av_store()?) */
440c1856
RL
175 PL_stack_sp = *allocp + (PL_stack_sp - PL_stack_base);
176 PL_stack_base = *allocp;
177 PL_stack_max = PL_stack_base + newmax;
178 }
399fef93
RL
179 } else { /* there is no SV* array yet */
180 *maxp = key < 3 ? 3 : key;
440c1856
RL
181 {
182 /* see comment above about newmax+1*/
399fef93
RL
183 MEM_WRAP_CHECK_s(*maxp, SV*,
184 "Out of memory during array extend");
440c1856 185 }
399fef93
RL
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
60eec70f
HS
193 * don't get any special treatment here.
194 * See https://github.com/Perl/perl5/pull/18690 for more detail */
399fef93
RL
195 ary_offset = 0;
196 to_null = *maxp+1;
197 goto zero;
440c1856 198 }
399fef93 199
440c1856 200 if (av && AvREAL(av)) {
399fef93
RL
201 zero:
202 Zero(*allocp + ary_offset,to_null,SV*);
440c1856
RL
203 }
204
205 *arrayp = *allocp;
a0d0e21e
LW
206 }
207}
208
cb50131a
CB
209/*
210=for apidoc av_fetch
211
212Returns the SV at the specified index in the array. The C<key> is the
e815fc9e 213index. If C<lval> is true, you are guaranteed to get a real SV back (in case
1a328862 214it wasn't real before), which you can then modify. Check that the return
e815fc9e 215value is non-NULL before dereferencing it to a C<SV*>.
cb50131a
CB
216
217See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
218more information on how to use this function on tied arrays.
219
17b0bd77 220The rough perl equivalent is C<$myarray[$key]>.
3347919d 221
cb50131a
CB
222=cut
223*/
224
ac9f75b5 225static bool
c70927a6 226S_adjust_index(pTHX_ AV *av, const MAGIC *mg, SSize_t *keyp)
ac9f75b5
FC
227{
228 bool adjust_index = 1;
229 if (mg) {
1604cfb0
MS
230 /* Handle negative array indices 20020222 MJD */
231 SV * const ref = SvTIED_obj(MUTABLE_SV(av), mg);
232 SvGETMAGIC(ref);
233 if (SvROK(ref) && SvOBJECT(SvRV(ref))) {
234 SV * const * const negative_indices_glob =
235 hv_fetchs(SvSTASH(SvRV(ref)), NEGATIVE_INDICES_VAR, 0);
236
237 if (negative_indices_glob && isGV(*negative_indices_glob)
238 && SvTRUE(GvSV(*negative_indices_glob)))
239 adjust_index = 0;
240 }
ac9f75b5
FC
241 }
242
243 if (adjust_index) {
1604cfb0
MS
244 *keyp += AvFILL(av) + 1;
245 if (*keyp < 0)
246 return FALSE;
ac9f75b5
FC
247 }
248 return TRUE;
249}
250
79072805 251SV**
c70927a6 252Perl_av_fetch(pTHX_ AV *av, SSize_t key, I32 lval)
79072805 253{
f4d8be8b
DM
254 SSize_t neg;
255 SSize_t size;
256
7918f24d 257 PERL_ARGS_ASSERT_AV_FETCH;
2fed2a1b 258 assert(SvTYPE(av) == SVt_PVAV);
a0d0e21e 259
11b62bc4 260 if (UNLIKELY(SvRMAGICAL(av))) {
ad64d0ec 261 const MAGIC * const tied_magic
1604cfb0 262 = mg_find((const SV *)av, PERL_MAGIC_tied);
ad64d0ec 263 if (tied_magic || mg_find((const SV *)av, PERL_MAGIC_regdata)) {
1604cfb0
MS
264 SV *sv;
265 if (key < 0) {
266 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
267 return NULL;
268 }
6f12eb6d 269
7ea8b04b 270 sv = newSV_type_mortal(SVt_PVLV);
1604cfb0
MS
271 mg_copy(MUTABLE_SV(av), sv, 0, key);
272 if (!tied_magic) /* for regdata, force leavesub to make copies */
273 SvTEMP_off(sv);
274 LvTYPE(sv) = 't';
275 LvTARG(sv) = sv; /* fake (SV**) */
276 return &(LvTARG(sv));
6f12eb6d
MJD
277 }
278 }
279
f4d8be8b 280 neg = (key < 0);
25cf9644 281 size = AvFILLp(av) + 1;
f4d8be8b
DM
282 key += neg * size; /* handle negative index without using branch */
283
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) {
1604cfb0
MS
287 if (UNLIKELY(neg))
288 return NULL;
f4d8be8b 289 goto emptyness;
93965878 290 }
f4d8be8b
DM
291
292 if (!AvARRAY(av)[key]) {
55d3f3e5 293 emptyness:
8fcb2425 294 return lval ? av_store(av,key,newSV_type(SVt_NULL)) : NULL;
79072805 295 }
55d3f3e5 296
463ee0b2 297 return &AvARRAY(av)[key];
79072805
LW
298}
299
cb50131a
CB
300/*
301=for apidoc av_store
302
303Stores an SV in an array. The array index is specified as C<key>. The
796b6530 304return value will be C<NULL> if the operation failed or if the value did not
cb50131a 305need to be actually stored within the array (as in the case of tied
72d33970 306arrays). Otherwise, it can be dereferenced
4f540dd3 307to get the C<SV*> that was stored
f0b90de1
SF
308there (= C<val>)).
309
310Note that the caller is responsible for suitably incrementing the reference
cb50131a 311count of C<val> before the call, and decrementing it if the function
796b6530 312returned C<NULL>.
cb50131a 313
17b0bd77 314Approximate Perl equivalent: C<splice(@myarray, $key, 1, $val)>.
f0b90de1 315
cb50131a
CB
316See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
317more information on how to use this function on tied arrays.
318
319=cut
320*/
321
79072805 322SV**
c70927a6 323Perl_av_store(pTHX_ AV *av, SSize_t key, SV *val)
79072805 324{
79072805
LW
325 SV** ary;
326
7918f24d 327 PERL_ARGS_ASSERT_AV_STORE;
2fed2a1b 328 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 329
725ac12f
NC
330 /* S_regclass relies on being able to pass in a NULL sv
331 (unicode_alternate may be NULL).
332 */
333
6f12eb6d 334 if (SvRMAGICAL(av)) {
ad64d0ec 335 const MAGIC * const tied_magic = mg_find((const SV *)av, PERL_MAGIC_tied);
6f12eb6d 336 if (tied_magic) {
6f12eb6d 337 if (key < 0) {
1604cfb0 338 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
6f12eb6d 339 return 0;
6f12eb6d 340 }
1604cfb0
MS
341 if (val) {
342 mg_copy(MUTABLE_SV(av), val, 0, key);
343 }
344 return NULL;
6f12eb6d
MJD
345 }
346 }
347
348
a0d0e21e 349 if (key < 0) {
1604cfb0
MS
350 key += AvFILL(av) + 1;
351 if (key < 0)
352 return NULL;
79072805 353 }
93965878 354
43fcc5d2 355 if (SvREADONLY(av) && key >= AvFILL(av))
1604cfb0 356 Perl_croak_no_modify();
93965878 357
49beac48 358 if (!AvREAL(av) && AvREIFY(av))
1604cfb0 359 av_reify(av);
a0d0e21e 360 if (key > AvMAX(av))
1604cfb0 361 av_extend(av,key);
463ee0b2 362 ary = AvARRAY(av);
93965878 363 if (AvFILLp(av) < key) {
1604cfb0
MS
364 if (!AvREAL(av)) {
365 if (av == PL_curstack && key > PL_stack_sp - PL_stack_base)
366 PL_stack_sp = PL_stack_base + key; /* XPUSH in disguise */
367 do {
368 ary[++AvFILLp(av)] = NULL;
369 } while (AvFILLp(av) < key);
370 }
371 AvFILLp(av) = key;
79072805 372 }
811f8a24 373 else if (AvREAL(av))
1604cfb0 374 SvREFCNT_dec(ary[key]);
79072805 375 ary[key] = val;
8990e307 376 if (SvSMAGICAL(av)) {
1604cfb0
MS
377 const MAGIC *mg = SvMAGIC(av);
378 bool set = TRUE;
379 for (; mg; mg = mg->mg_moremagic) {
380 if (!isUPPER(mg->mg_type)) continue;
381 if (val) {
382 sv_magic(val, MUTABLE_SV(av), toLOWER(mg->mg_type), 0, key);
383 }
384 if (PL_delaymagic && mg->mg_type == PERL_MAGIC_isa) {
385 PL_delaymagic |= DM_ARRAY_ISA;
386 set = FALSE;
387 }
388 }
389 if (set)
390 mg_set(MUTABLE_SV(av));
463ee0b2 391 }
79072805
LW
392 return &ary[key];
393}
394
cb50131a 395/*
cb50131a
CB
396=for apidoc av_make
397
e815fc9e
KW
398Creates a new AV and populates it with a list (C<**strp>, length C<size>) of
399SVs. A copy is made of each SV, so their refcounts are not changed. The new
400AV will have a reference count of 1.
cb50131a 401
775f1d61
SF
402Perl equivalent: C<my @new_array = ($scalar1, $scalar2, $scalar3...);>
403
cb50131a
CB
404=cut
405*/
406
79072805 407AV *
c70927a6 408Perl_av_make(pTHX_ SSize_t size, SV **strp)
79072805 409{
f73391e4 410 AV * const av = newAV();
a7f5e44d 411 /* sv_upgrade does AvREAL_only() */
7918f24d 412 PERL_ARGS_ASSERT_AV_MAKE;
2fed2a1b
NC
413 assert(SvTYPE(av) == SVt_PVAV);
414
a0288114 415 if (size) { /* "defined" was returning undef for size==0 anyway. */
eb578fdb 416 SV** ary;
c70927a6 417 SSize_t i;
be988557
DM
418 SSize_t orig_ix;
419
1604cfb0
MS
420 Newx(ary,size,SV*);
421 AvALLOC(av) = ary;
422 AvARRAY(av) = ary;
423 AvMAX(av) = size - 1;
be988557
DM
424 /* avoid av being leaked if croak when calling magic below */
425 EXTEND_MORTAL(1);
426 PL_tmps_stack[++PL_tmps_ix] = (SV*)av;
427 orig_ix = PL_tmps_ix;
428
1604cfb0
MS
429 for (i = 0; i < size; i++) {
430 assert (*strp);
2b676593 431
1604cfb0
MS
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) */
2b676593 435
1604cfb0
MS
436 SvGETMAGIC(*strp); /* before newSV, in case it dies */
437 AvFILLp(av)++;
8fcb2425 438 ary[i] = newSV_type(SVt_NULL);
1604cfb0
MS
439 sv_setsv_flags(ary[i], *strp,
440 SV_DO_COW_SVSETSV|SV_NOSTEAL);
441 strp++;
442 }
be988557
DM
443 /* disarm av's leak guard */
444 if (LIKELY(PL_tmps_ix == orig_ix))
445 PL_tmps_ix--;
446 else
447 PL_tmps_stack[orig_ix] = &PL_sv_undef;
79072805 448 }
463ee0b2 449 return av;
79072805
LW
450}
451
cb50131a 452/*
5f6512c9
PE
453=for apidoc newAVav
454
455Creates a new AV and populates it with values copied from an existing AV. The
456new AV will have a reference count of 1, and will contain newly created SVs
457copied from the original SV. The original source will remain unchanged.
458
459Perl equivalent: C<my @new_array = @existing_array;>
460
461=cut
462*/
463
464AV *
465Perl_newAVav(pTHX_ AV *oav)
466{
467 PERL_ARGS_ASSERT_NEWAVAV;
468
80c024ac 469 Size_t count = av_count(oav);
3b6b0454
RL
470
471 if(UNLIKELY(!oav) || count == 0)
5f6512c9
PE
472 return newAV();
473
3b6b0454 474 AV *ret = newAV_alloc_x(count);
5f6512c9
PE
475
476 /* avoid ret being leaked if croak when calling magic below */
477 EXTEND_MORTAL(1);
478 PL_tmps_stack[++PL_tmps_ix] = (SV *)ret;
479 SSize_t ret_at_tmps_ix = PL_tmps_ix;
480
80c024ac
RL
481 Size_t i;
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);
486 }
487 } else {
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);
491 }
5f6512c9
PE
492 }
493
494 /* disarm leak guard */
495 if(LIKELY(PL_tmps_ix == ret_at_tmps_ix))
496 PL_tmps_ix--;
497 else
498 PL_tmps_stack[ret_at_tmps_ix] = &PL_sv_undef;
499
500 return ret;
501}
502
503/*
504=for apidoc newAVhv
505
506Creates a new AV and populates it with keys and values copied from an existing
507HV. The new AV will have a reference count of 1, and will contain newly
508created SVs copied from the original HV. The original source will remain
509unchanged.
510
511Perl equivalent: C<my @new_array = %existing_hash;>
512
513=cut
514*/
515
516AV *
517Perl_newAVhv(pTHX_ HV *ohv)
518{
519 PERL_ARGS_ASSERT_NEWAVHV;
520
521 if(UNLIKELY(!ohv))
522 return newAV();
523
524 bool tied = SvRMAGICAL(ohv) && mg_find(MUTABLE_SV(ohv), PERL_MAGIC_tied);
525
f98a2322 526 Size_t nkeys = hv_iterinit(ohv);
3b6b0454
RL
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
529 */
1805204a 530 AV *ret = newAV_alloc_xz(nkeys ? nkeys * 2 : 2);
5f6512c9
PE
531
532 /* avoid ret being leaked if croak when calling magic below */
533 EXTEND_MORTAL(1);
534 PL_tmps_stack[++PL_tmps_ix] = (SV *)ret;
535 SSize_t ret_at_tmps_ix = PL_tmps_ix;
536
5f6512c9
PE
537
538 HE *he;
539 while((he = hv_iternext(ohv))) {
540 if(tied) {
f98a2322
RL
541 av_push_simple(ret, newSVsv(hv_iterkeysv(he)));
542 av_push_simple(ret, newSVsv(hv_iterval(ohv, he)));
5f6512c9
PE
543 }
544 else {
f98a2322
RL
545 av_push_simple(ret, newSVhek(HeKEY_hek(he)));
546 av_push_simple(ret, HeVAL(he) ? newSVsv(HeVAL(he)) : &PL_sv_undef);
5f6512c9
PE
547 }
548 }
549
550 /* disarm leak guard */
551 if(LIKELY(PL_tmps_ix == ret_at_tmps_ix))
552 PL_tmps_ix--;
553 else
554 PL_tmps_stack[ret_at_tmps_ix] = &PL_sv_undef;
555
556 return ret;
557}
558
559/*
cb50131a
CB
560=for apidoc av_clear
561
bb8005f7 562Frees all the elements of an array, leaving it empty.
a4395eba 563The XS equivalent of C<@array = ()>. See also L</av_undef>.
8b9a1153 564
a4395eba
DM
565Note that it is possible that the actions of a destructor called directly
566or indirectly by freeing an element of the array could cause the reference
567count of the array itself to be reduced (e.g. by deleting an entry in the
568symbol 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
570to it.
cb50131a
CB
571
572=cut
573*/
574
79072805 575void
5aaab254 576Perl_av_clear(pTHX_ AV *av)
79072805 577{
c70927a6 578 SSize_t extra;
60edcf09 579 bool real;
be988557 580 SSize_t orig_ix = 0;
79072805 581
7918f24d 582 PERL_ARGS_ASSERT_AV_CLEAR;
2fed2a1b
NC
583 assert(SvTYPE(av) == SVt_PVAV);
584
7d55f622 585#ifdef DEBUGGING
9b387841 586 if (SvREFCNT(av) == 0) {
1604cfb0 587 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "Attempt to clear deleted array");
7d55f622 588 }
589#endif
a0d0e21e 590
39caa665 591 if (SvREADONLY(av))
1604cfb0 592 Perl_croak_no_modify();
39caa665 593
93965878 594 /* Give any tie a chance to cleanup first */
89c14e2e 595 if (SvRMAGICAL(av)) {
1604cfb0
MS
596 const MAGIC* const mg = SvMAGIC(av);
597 if (PL_delaymagic && mg && mg->mg_type == PERL_MAGIC_isa)
598 PL_delaymagic |= DM_ARRAY_ISA;
89c14e2e 599 else
1604cfb0 600 mg_clear(MUTABLE_SV(av));
89c14e2e 601 }
93965878 602
a60c0954 603 if (AvMAX(av) < 0)
1604cfb0 604 return;
a60c0954 605
be988557 606 if ((real = cBOOL(AvREAL(av)))) {
1604cfb0
MS
607 SV** const ary = AvARRAY(av);
608 SSize_t index = AvFILLp(av) + 1;
be988557
DM
609
610 /* avoid av being freed when calling destructors below */
611 EXTEND_MORTAL(1);
612 PL_tmps_stack[++PL_tmps_ix] = SvREFCNT_inc_simple_NN(av);
613 orig_ix = PL_tmps_ix;
614
1604cfb0
MS
615 while (index) {
616 SV * const sv = ary[--index];
617 /* undef the slot before freeing the value, because a
618 * destructor might try to modify this array */
619 ary[index] = NULL;
620 SvREFCNT_dec(sv);
621 }
a0d0e21e 622 }
e2d306cb
AL
623 extra = AvARRAY(av) - AvALLOC(av);
624 if (extra) {
1604cfb0
MS
625 AvMAX(av) += extra;
626 AvARRAY(av) = AvALLOC(av);
79072805 627 }
93965878 628 AvFILLp(av) = -1;
be988557
DM
629 if (real) {
630 /* disarm av's premature free guard */
631 if (LIKELY(PL_tmps_ix == orig_ix))
632 PL_tmps_ix--;
633 else
634 PL_tmps_stack[orig_ix] = &PL_sv_undef;
635 SvREFCNT_dec_NN(av);
636 }
79072805
LW
637}
638
cb50131a
CB
639/*
640=for apidoc av_undef
641
a4395eba
DM
642Undefines the array. The XS equivalent of C<undef(@array)>.
643
644As well as freeing all the elements of the array (like C<av_clear()>), this
645also frees the memory used by the av to store its list of scalars.
646
647See L</av_clear> for a note about the array possibly being invalid on
648return.
cb50131a
CB
649
650=cut
651*/
652
79072805 653void
5aaab254 654Perl_av_undef(pTHX_ AV *av)
79072805 655{
60edcf09 656 bool real;
84610c52 657 SSize_t orig_ix = PL_tmps_ix; /* silence bogus warning about possible unitialized use */
60edcf09 658
7918f24d 659 PERL_ARGS_ASSERT_AV_UNDEF;
2fed2a1b 660 assert(SvTYPE(av) == SVt_PVAV);
93965878
NIS
661
662 /* Give any tie a chance to cleanup first */
ad64d0ec 663 if (SvTIED_mg((const SV *)av, PERL_MAGIC_tied))
1604cfb0 664 av_fill(av, -1);
93965878 665
84610c52
YO
666 real = cBOOL(AvREAL(av));
667 if (real) {
1604cfb0 668 SSize_t key = AvFILLp(av) + 1;
be988557
DM
669
670 /* avoid av being freed when calling destructors below */
671 EXTEND_MORTAL(1);
672 PL_tmps_stack[++PL_tmps_ix] = SvREFCNT_inc_simple_NN(av);
673 orig_ix = PL_tmps_ix;
674
1604cfb0
MS
675 while (key)
676 SvREFCNT_dec(AvARRAY(av)[--key]);
a0d0e21e 677 }
22717f83 678
463ee0b2 679 Safefree(AvALLOC(av));
35da51f7 680 AvALLOC(av) = NULL;
9c6bc640 681 AvARRAY(av) = NULL;
93965878 682 AvMAX(av) = AvFILLp(av) = -1;
22717f83 683
ad64d0ec 684 if(SvRMAGICAL(av)) mg_clear(MUTABLE_SV(av));
be988557
DM
685 if (real) {
686 /* disarm av's premature free guard */
687 if (LIKELY(PL_tmps_ix == orig_ix))
688 PL_tmps_ix--;
689 else
690 PL_tmps_stack[orig_ix] = &PL_sv_undef;
691 SvREFCNT_dec_NN(av);
692 }
79072805
LW
693}
694
cb50131a 695/*
29a861e7
NC
696
697=for apidoc av_create_and_push
698
699Push an SV onto the end of the array, creating the array if necessary.
700A small internal helper function to remove a commonly duplicated idiom.
701
702=cut
703*/
704
705void
706Perl_av_create_and_push(pTHX_ AV **const avp, SV *const val)
707{
7918f24d 708 PERL_ARGS_ASSERT_AV_CREATE_AND_PUSH;
2fed2a1b 709
832a378e
KW
710 if (!*avp)
711 *avp = newAV();
712 av_push(*avp, val);
29a861e7
NC
713}
714
715/*
cb50131a
CB
716=for apidoc av_push
717
b895c103
KW
718Pushes an SV (transferring control of one reference count) onto the end of the
719array. The array will grow automatically to accommodate the addition.
cb50131a 720
17b0bd77 721Perl equivalent: C<push @myarray, $val;>.
f0b90de1 722
cb50131a
CB
723=cut
724*/
725
a0d0e21e 726void
5aaab254 727Perl_av_push(pTHX_ AV *av, SV *val)
93965878
NIS
728{
729 MAGIC *mg;
7918f24d
NC
730
731 PERL_ARGS_ASSERT_AV_PUSH;
2fed2a1b 732 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 733
93965878 734 if (SvREADONLY(av))
1604cfb0 735 Perl_croak_no_modify();
93965878 736
ad64d0ec 737 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
1604cfb0
MS
738 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(PUSH), G_DISCARD, 1,
739 val);
740 return;
93965878
NIS
741 }
742 av_store(av,AvFILLp(av)+1,val);
79072805
LW
743}
744
cb50131a
CB
745/*
746=for apidoc av_pop
747
f5d13a25
KW
748Removes one SV from the end of the array, reducing its size by one and
749returning the SV (transferring control of one reference count) to the
750caller. Returns C<&PL_sv_undef> if the array is empty.
cb50131a 751
f0b90de1
SF
752Perl equivalent: C<pop(@myarray);>
753
cb50131a
CB
754=cut
755*/
756
79072805 757SV *
5aaab254 758Perl_av_pop(pTHX_ AV *av)
79072805
LW
759{
760 SV *retval;
93965878 761 MAGIC* mg;
79072805 762
7918f24d 763 PERL_ARGS_ASSERT_AV_POP;
2fed2a1b 764 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 765
43fcc5d2 766 if (SvREADONLY(av))
1604cfb0 767 Perl_croak_no_modify();
ad64d0ec 768 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
1604cfb0
MS
769 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(POP), 0, 0);
770 if (retval)
771 retval = newSVsv(retval);
772 return retval;
93965878 773 }
d19c0e07 774 if (AvFILL(av) < 0)
1604cfb0 775 return &PL_sv_undef;
93965878 776 retval = AvARRAY(av)[AvFILLp(av)];
ce0d59fd 777 AvARRAY(av)[AvFILLp(av)--] = NULL;
8990e307 778 if (SvSMAGICAL(av))
1604cfb0 779 mg_set(MUTABLE_SV(av));
ce0d59fd 780 return retval ? retval : &PL_sv_undef;
79072805
LW
781}
782
cb50131a 783/*
29a861e7
NC
784
785=for apidoc av_create_and_unshift_one
786
787Unshifts an SV onto the beginning of the array, creating the array if
788necessary.
789A small internal helper function to remove a commonly duplicated idiom.
790
791=cut
792*/
793
794SV **
795Perl_av_create_and_unshift_one(pTHX_ AV **const avp, SV *const val)
796{
7918f24d 797 PERL_ARGS_ASSERT_AV_CREATE_AND_UNSHIFT_ONE;
2fed2a1b 798
832a378e
KW
799 if (!*avp)
800 *avp = newAV();
801 av_unshift(*avp, 1);
802 return av_store(*avp, 0, val);
29a861e7
NC
803}
804
805/*
cb50131a
CB
806=for apidoc av_unshift
807
808Unshift the given number of C<undef> values onto the beginning of the
17b0bd77 809array. The array will grow automatically to accommodate the addition.
cb50131a 810
17b0bd77 811Perl equivalent: S<C<unshift @myarray, ((undef) x $num);>>
f703fc96 812
cb50131a
CB
813=cut
814*/
815
79072805 816void
c70927a6 817Perl_av_unshift(pTHX_ AV *av, SSize_t num)
79072805 818{
c70927a6 819 SSize_t i;
93965878 820 MAGIC* mg;
79072805 821
7918f24d 822 PERL_ARGS_ASSERT_AV_UNSHIFT;
2fed2a1b 823 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 824
43fcc5d2 825 if (SvREADONLY(av))
1604cfb0 826 Perl_croak_no_modify();
93965878 827
ad64d0ec 828 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
1604cfb0
MS
829 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(UNSHIFT),
830 G_DISCARD | G_UNDEF_FILL, num);
831 return;
93965878
NIS
832 }
833
d19c0e07
MJD
834 if (num <= 0)
835 return;
49beac48 836 if (!AvREAL(av) && AvREIFY(av))
1604cfb0 837 av_reify(av);
a0d0e21e
LW
838 i = AvARRAY(av) - AvALLOC(av);
839 if (i) {
1604cfb0
MS
840 if (i > num)
841 i = num;
842 num -= i;
a0d0e21e 843
1604cfb0
MS
844 AvMAX(av) += i;
845 AvFILLp(av) += i;
846 AvARRAY(av) = AvARRAY(av) - i;
a0d0e21e 847 }
d2719217 848 if (num) {
1604cfb0
MS
849 SV **ary;
850 const SSize_t i = AvFILLp(av);
851 /* Create extra elements */
852 const SSize_t slide = i > 0 ? i : 0;
853 num += slide;
854 av_extend(av, i + num);
855 AvFILLp(av) += num;
856 ary = AvARRAY(av);
857 Move(ary, ary + num, i + 1, SV*);
858 do {
859 ary[--num] = NULL;
860 } while (num);
861 /* Make extra elements into a buffer */
862 AvMAX(av) -= slide;
863 AvFILLp(av) -= slide;
864 AvARRAY(av) = AvARRAY(av) + slide;
79072805
LW
865 }
866}
867
cb50131a
CB
868/*
869=for apidoc av_shift
870
dbc2ea0c
S
871Removes one SV from the start of the array, reducing its size by one and
872returning the SV (transferring control of one reference count) to the
873caller. Returns C<&PL_sv_undef> if the array is empty.
cb50131a 874
f0b90de1
SF
875Perl equivalent: C<shift(@myarray);>
876
cb50131a
CB
877=cut
878*/
879
79072805 880SV *
5aaab254 881Perl_av_shift(pTHX_ AV *av)
79072805
LW
882{
883 SV *retval;
93965878 884 MAGIC* mg;
79072805 885
7918f24d 886 PERL_ARGS_ASSERT_AV_SHIFT;
2fed2a1b 887 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 888
43fcc5d2 889 if (SvREADONLY(av))
1604cfb0 890 Perl_croak_no_modify();
ad64d0ec 891 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
1604cfb0
MS
892 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(SHIFT), 0, 0);
893 if (retval)
894 retval = newSVsv(retval);
895 return retval;
93965878 896 }
d19c0e07
MJD
897 if (AvFILL(av) < 0)
898 return &PL_sv_undef;
463ee0b2 899 retval = *AvARRAY(av);
a0d0e21e 900 if (AvREAL(av))
1604cfb0 901 *AvARRAY(av) = NULL;
9c6bc640 902 AvARRAY(av) = AvARRAY(av) + 1;
463ee0b2 903 AvMAX(av)--;
93965878 904 AvFILLp(av)--;
8990e307 905 if (SvSMAGICAL(av))
1604cfb0 906 mg_set(MUTABLE_SV(av));
ce0d59fd 907 return retval ? retval : &PL_sv_undef;
79072805
LW
908}
909
cb50131a 910/*
a56541eb
KW
911=for apidoc av_tindex
912=for apidoc_item av_top_index
cb50131a 913
a56541eb
KW
914These behave identically.
915If the array C<av> is empty, these return -1; otherwise they return the maximum
916value of the indices of all the array elements which are currently defined in
917C<av>.
cb50131a 918
a56541eb 919They process 'get' magic.
a8676f70 920
a56541eb
KW
921The Perl equivalent for these is C<$#av>.
922
923Use C<L</av_count>> to get the number of elements in an array.
12719193 924
36baafc9
KW
925=for apidoc av_len
926
b985ae61 927Same as L</av_top_index>. Note that, unlike what the name implies, it returns
a56541eb 928the maximum index in the array. This is unlike L</sv_len>, which returns what
87306e06
KW
929you would expect.
930
931B<To get the true number of elements in the array, instead use C<L</av_count>>>.
36baafc9 932
cb50131a
CB
933=cut
934*/
935
c70927a6 936SSize_t
bb5dd93d 937Perl_av_len(pTHX_ AV *av)
79072805 938{
7918f24d 939 PERL_ARGS_ASSERT_AV_LEN;
36baafc9 940
be3a7a5d 941 return av_top_index(av);
36baafc9
KW
942}
943
f3b76584
SC
944/*
945=for apidoc av_fill
946
977a499b 947Set the highest index in the array to the given number, equivalent to
61b16eb9 948Perl's S<C<$#array = $fill;>>.
f3b76584 949
61b16eb9 950The number of elements in the array will be S<C<fill + 1>> after
796b6530 951C<av_fill()> returns. If the array was previously shorter, then the
ce0d59fd 952additional elements appended are set to NULL. If the array
61b16eb9 953was longer, then the excess elements are freed. S<C<av_fill(av, -1)>> is
977a499b
GA
954the same as C<av_clear(av)>.
955
f3b76584
SC
956=cut
957*/
79072805 958void
c70927a6 959Perl_av_fill(pTHX_ AV *av, SSize_t fill)
79072805 960{
93965878 961 MAGIC *mg;
ba5d1d60 962
7918f24d 963 PERL_ARGS_ASSERT_AV_FILL;
2fed2a1b 964 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 965
79072805 966 if (fill < 0)
1604cfb0 967 fill = -1;
ad64d0ec 968 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
1604cfb0
MS
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,
972 1, arg1);
973 return;
93965878 974 }
463ee0b2 975 if (fill <= AvMAX(av)) {
1604cfb0
MS
976 SSize_t key = AvFILLp(av);
977 SV** const ary = AvARRAY(av);
978
979 if (AvREAL(av)) {
980 while (key > fill) {
981 SvREFCNT_dec(ary[key]);
982 ary[key--] = NULL;
983 }
984 }
985 else {
986 while (key < fill)
987 ary[++key] = NULL;
988 }
989
990 AvFILLp(av) = fill;
991 if (SvSMAGICAL(av))
992 mg_set(MUTABLE_SV(av));
463ee0b2 993 }
a0d0e21e 994 else
1604cfb0 995 (void)av_store(av,fill,NULL);
79072805 996}
c750a3ec 997
f3b76584
SC
998/*
999=for apidoc av_delete
1000
17b0bd77
DM
1001Deletes the element indexed by C<key> from the array, makes the element
1002mortal, and returns it. If C<flags> equals C<G_DISCARD>, the element is
1003freed and NULL is returned. NULL is also returned if C<key> is out of
1004range.
1005
1006Perl equivalent: S<C<splice(@myarray, $key, 1, undef)>> (with the
1007C<splice> in void context if C<G_DISCARD> is present).
f3b76584
SC
1008
1009=cut
1010*/
146174a9 1011SV *
c70927a6 1012Perl_av_delete(pTHX_ AV *av, SSize_t key, I32 flags)
146174a9
CB
1013{
1014 SV *sv;
1015
7918f24d 1016 PERL_ARGS_ASSERT_AV_DELETE;
2fed2a1b 1017 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 1018
146174a9 1019 if (SvREADONLY(av))
1604cfb0 1020 Perl_croak_no_modify();
6f12eb6d
MJD
1021
1022 if (SvRMAGICAL(av)) {
ad64d0ec 1023 const MAGIC * const tied_magic
1604cfb0 1024 = mg_find((const SV *)av, PERL_MAGIC_tied);
ad64d0ec 1025 if ((tied_magic || mg_find((const SV *)av, PERL_MAGIC_regdata))) {
35a4481c 1026 SV **svp;
6f12eb6d 1027 if (key < 0) {
1604cfb0
MS
1028 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
1029 return NULL;
6f12eb6d
MJD
1030 }
1031 svp = av_fetch(av, key, TRUE);
1032 if (svp) {
1033 sv = *svp;
1034 mg_clear(sv);
1035 if (mg_find(sv, PERL_MAGIC_tiedelem)) {
1036 sv_unmagic(sv, PERL_MAGIC_tiedelem); /* No longer an element */
1037 return sv;
1038 }
1604cfb0 1039 return NULL;
6f12eb6d
MJD
1040 }
1041 }
1042 }
1043
146174a9 1044 if (key < 0) {
1604cfb0
MS
1045 key += AvFILL(av) + 1;
1046 if (key < 0)
1047 return NULL;
146174a9 1048 }
6f12eb6d 1049
146174a9 1050 if (key > AvFILLp(av))
1604cfb0 1051 return NULL;
146174a9 1052 else {
1604cfb0
MS
1053 if (!AvREAL(av) && AvREIFY(av))
1054 av_reify(av);
1055 sv = AvARRAY(av)[key];
1056 AvARRAY(av)[key] = NULL;
1057 if (key == AvFILLp(av)) {
1058 do {
1059 AvFILLp(av)--;
1060 } while (--key >= 0 && !AvARRAY(av)[key]);
1061 }
1062 if (SvSMAGICAL(av))
1063 mg_set(MUTABLE_SV(av));
146174a9 1064 }
725995b4 1065 if(sv != NULL) {
1604cfb0
MS
1066 if (flags & G_DISCARD) {
1067 SvREFCNT_dec_NN(sv);
1068 return NULL;
1069 }
1070 else if (AvREAL(av))
1071 sv_2mortal(sv);
146174a9
CB
1072 }
1073 return sv;
1074}
1075
1076/*
f3b76584
SC
1077=for apidoc av_exists
1078
1079Returns true if the element indexed by C<key> has been initialized.
146174a9 1080
f3b76584 1081This relies on the fact that uninitialized array elements are set to
796b6530 1082C<NULL>.
f3b76584 1083
b7ff7ff2
SF
1084Perl equivalent: C<exists($myarray[$key])>.
1085
f3b76584
SC
1086=cut
1087*/
146174a9 1088bool
c70927a6 1089Perl_av_exists(pTHX_ AV *av, SSize_t key)
146174a9 1090{
7918f24d 1091 PERL_ARGS_ASSERT_AV_EXISTS;
2fed2a1b 1092 assert(SvTYPE(av) == SVt_PVAV);
6f12eb6d
MJD
1093
1094 if (SvRMAGICAL(av)) {
ad64d0ec 1095 const MAGIC * const tied_magic
1604cfb0 1096 = mg_find((const SV *)av, PERL_MAGIC_tied);
54a4274e
PM
1097 const MAGIC * const regdata_magic
1098 = mg_find((const SV *)av, PERL_MAGIC_regdata);
1099 if (tied_magic || regdata_magic) {
6f12eb6d
MJD
1100 MAGIC *mg;
1101 /* Handle negative array indices 20020222 MJD */
1102 if (key < 0) {
1604cfb0 1103 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
6f12eb6d 1104 return FALSE;
6f12eb6d
MJD
1105 }
1106
54a4274e
PM
1107 if(key >= 0 && regdata_magic) {
1108 if (key <= AvFILL(av))
1109 return TRUE;
1110 else
1111 return FALSE;
1112 }
1604cfb0
MS
1113 {
1114 SV * const sv = sv_newmortal();
1115 mg_copy(MUTABLE_SV(av), sv, 0, key);
1116 mg = mg_find(sv, PERL_MAGIC_tiedelem);
1117 if (mg) {
1118 magic_existspack(sv, mg);
1119 {
1120 I32 retbool = SvTRUE_nomg_NN(sv);
1121 return cBOOL(retbool);
1122 }
1123 }
1124 }
6f12eb6d
MJD
1125 }
1126 }
1127
146174a9 1128 if (key < 0) {
1604cfb0
MS
1129 key += AvFILL(av) + 1;
1130 if (key < 0)
1131 return FALSE;
146174a9 1132 }
6f12eb6d 1133
ce0d59fd 1134 if (key <= AvFILLp(av) && AvARRAY(av)[key])
146174a9 1135 {
1604cfb0
MS
1136 if (SvSMAGICAL(AvARRAY(av)[key])
1137 && mg_find(AvARRAY(av)[key], PERL_MAGIC_nonelem))
1138 return FALSE;
1139 return TRUE;
146174a9
CB
1140 }
1141 else
1604cfb0 1142 return FALSE;
146174a9 1143}
66610fdd 1144
c33269f7 1145static MAGIC *
878d132a 1146S_get_aux_mg(pTHX_ AV *av) {
ba5d1d60
GA
1147 MAGIC *mg;
1148
7918f24d 1149 PERL_ARGS_ASSERT_GET_AUX_MG;
2fed2a1b 1150 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 1151
ad64d0ec 1152 mg = mg_find((const SV *)av, PERL_MAGIC_arylen_p);
a3874608
NC
1153
1154 if (!mg) {
1604cfb0
MS
1155 mg = sv_magicext(MUTABLE_SV(av), 0, PERL_MAGIC_arylen_p,
1156 &PL_vtbl_arylen_p, 0, 0);
1157 assert(mg);
1158 /* sv_magicext won't set this for us because we pass in a NULL obj */
1159 mg->mg_flags |= MGf_REFCOUNTED;
a3874608 1160 }
878d132a
NC
1161 return mg;
1162}
1163
1164SV **
1165Perl_av_arylen_p(pTHX_ AV *av) {
1166 MAGIC *const mg = get_aux_mg(av);
7918f24d
NC
1167
1168 PERL_ARGS_ASSERT_AV_ARYLEN_P;
2fed2a1b 1169 assert(SvTYPE(av) == SVt_PVAV);
7918f24d 1170
a3874608
NC
1171 return &(mg->mg_obj);
1172}
1173
453d94a9 1174IV *
878d132a
NC
1175Perl_av_iter_p(pTHX_ AV *av) {
1176 MAGIC *const mg = get_aux_mg(av);
7918f24d
NC
1177
1178 PERL_ARGS_ASSERT_AV_ITER_P;
2fed2a1b 1179 assert(SvTYPE(av) == SVt_PVAV);
7918f24d 1180
4803e7f7 1181 if (sizeof(IV) == sizeof(SSize_t)) {
1604cfb0 1182 return (IV *)&(mg->mg_len);
4803e7f7 1183 } else {
1604cfb0
MS
1184 if (!mg->mg_ptr) {
1185 IV *temp;
1186 mg->mg_len = IVSIZE;
1187 Newxz(temp, 1, IV);
1188 mg->mg_ptr = (char *) temp;
1189 }
1190 return (IV *)mg->mg_ptr;
453d94a9 1191 }
878d132a
NC
1192}
1193
1f1dcfb5
FC
1194SV *
1195Perl_av_nonelem(pTHX_ AV *av, SSize_t ix) {
8fcb2425 1196 SV * const sv = newSV_type(SVt_NULL);
1f1dcfb5
FC
1197 PERL_ARGS_ASSERT_AV_NONELEM;
1198 if (!av_store(av,ix,sv))
1604cfb0 1199 return sv_2mortal(sv); /* has tie magic */
1f1dcfb5
FC
1200 sv_magic(sv, NULL, PERL_MAGIC_nonelem, NULL, 0);
1201 return sv;
1202}
1203
66610fdd 1204/*
14d04a33 1205 * ex: set ts=8 sts=4 sw=4 et:
37442d52 1206 */