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