This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
perldelta: Regex sets are no longer experimental
[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/*
0b1c19ab
RL
396=for apidoc av_new_alloc
397
e815fc9e
KW
398This implements L<perlapi/C<newAV_alloc_x>>
399and L<perlapi/C<newAV_alloc_xz>>, which are the public API for this
400functionality.
401
0b1c19ab
RL
402Creates a new AV and allocates its SV* array.
403
e815fc9e 404This is similar to, but more efficient than doing:
0b1c19ab
RL
405
406 AV *av = newAV();
407 av_extend(av, key);
408
158b05f8 409The size parameter is used to pre-allocate a SV* array large enough to
e815fc9e 410hold at least elements C<0..(size-1)>. C<size> must be at least 1.
0b1c19ab 411
e815fc9e
KW
412The C<zeroflag> parameter controls whether or not the array is NULL
413initialized.
0b1c19ab
RL
414
415=cut
416*/
417
418AV *
419Perl_av_new_alloc(pTHX_ SSize_t size, bool zeroflag)
420{
421 AV * const av = newAV();
422 SV** ary;
423 PERL_ARGS_ASSERT_AV_NEW_ALLOC;
424 assert(size > 0);
425
426 Newx(ary, size, SV*); /* Newx performs the memwrap check */
427 AvALLOC(av) = ary;
428 AvARRAY(av) = ary;
429 AvMAX(av) = size - 1;
430
431 if (zeroflag)
432 Zero(ary, size, SV*);
433
434 return av;
435}
436
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
CB
494/*
495=for apidoc av_clear
496
bb8005f7 497Frees all the elements of an array, leaving it empty.
a4395eba 498The XS equivalent of C<@array = ()>. See also L</av_undef>.
8b9a1153 499
a4395eba
DM
500Note that it is possible that the actions of a destructor called directly
501or indirectly by freeing an element of the array could cause the reference
502count of the array itself to be reduced (e.g. by deleting an entry in the
503symbol table). So it is a possibility that the AV could have been freed
504(or even reallocated) on return from the call unless you hold a reference
505to it.
cb50131a
CB
506
507=cut
508*/
509
79072805 510void
5aaab254 511Perl_av_clear(pTHX_ AV *av)
79072805 512{
c70927a6 513 SSize_t extra;
60edcf09 514 bool real;
be988557 515 SSize_t orig_ix = 0;
79072805 516
7918f24d 517 PERL_ARGS_ASSERT_AV_CLEAR;
2fed2a1b
NC
518 assert(SvTYPE(av) == SVt_PVAV);
519
7d55f622 520#ifdef DEBUGGING
9b387841 521 if (SvREFCNT(av) == 0) {
1604cfb0 522 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "Attempt to clear deleted array");
7d55f622 523 }
524#endif
a0d0e21e 525
39caa665 526 if (SvREADONLY(av))
1604cfb0 527 Perl_croak_no_modify();
39caa665 528
93965878 529 /* Give any tie a chance to cleanup first */
89c14e2e 530 if (SvRMAGICAL(av)) {
1604cfb0
MS
531 const MAGIC* const mg = SvMAGIC(av);
532 if (PL_delaymagic && mg && mg->mg_type == PERL_MAGIC_isa)
533 PL_delaymagic |= DM_ARRAY_ISA;
89c14e2e 534 else
1604cfb0 535 mg_clear(MUTABLE_SV(av));
89c14e2e 536 }
93965878 537
a60c0954 538 if (AvMAX(av) < 0)
1604cfb0 539 return;
a60c0954 540
be988557 541 if ((real = cBOOL(AvREAL(av)))) {
1604cfb0
MS
542 SV** const ary = AvARRAY(av);
543 SSize_t index = AvFILLp(av) + 1;
be988557
DM
544
545 /* avoid av being freed when calling destructors below */
546 EXTEND_MORTAL(1);
547 PL_tmps_stack[++PL_tmps_ix] = SvREFCNT_inc_simple_NN(av);
548 orig_ix = PL_tmps_ix;
549
1604cfb0
MS
550 while (index) {
551 SV * const sv = ary[--index];
552 /* undef the slot before freeing the value, because a
553 * destructor might try to modify this array */
554 ary[index] = NULL;
555 SvREFCNT_dec(sv);
556 }
a0d0e21e 557 }
e2d306cb
AL
558 extra = AvARRAY(av) - AvALLOC(av);
559 if (extra) {
1604cfb0
MS
560 AvMAX(av) += extra;
561 AvARRAY(av) = AvALLOC(av);
79072805 562 }
93965878 563 AvFILLp(av) = -1;
be988557
DM
564 if (real) {
565 /* disarm av's premature free guard */
566 if (LIKELY(PL_tmps_ix == orig_ix))
567 PL_tmps_ix--;
568 else
569 PL_tmps_stack[orig_ix] = &PL_sv_undef;
570 SvREFCNT_dec_NN(av);
571 }
79072805
LW
572}
573
cb50131a
CB
574/*
575=for apidoc av_undef
576
a4395eba
DM
577Undefines the array. The XS equivalent of C<undef(@array)>.
578
579As well as freeing all the elements of the array (like C<av_clear()>), this
580also frees the memory used by the av to store its list of scalars.
581
582See L</av_clear> for a note about the array possibly being invalid on
583return.
cb50131a
CB
584
585=cut
586*/
587
79072805 588void
5aaab254 589Perl_av_undef(pTHX_ AV *av)
79072805 590{
60edcf09 591 bool real;
84610c52 592 SSize_t orig_ix = PL_tmps_ix; /* silence bogus warning about possible unitialized use */
60edcf09 593
7918f24d 594 PERL_ARGS_ASSERT_AV_UNDEF;
2fed2a1b 595 assert(SvTYPE(av) == SVt_PVAV);
93965878
NIS
596
597 /* Give any tie a chance to cleanup first */
ad64d0ec 598 if (SvTIED_mg((const SV *)av, PERL_MAGIC_tied))
1604cfb0 599 av_fill(av, -1);
93965878 600
84610c52
YO
601 real = cBOOL(AvREAL(av));
602 if (real) {
1604cfb0 603 SSize_t key = AvFILLp(av) + 1;
be988557
DM
604
605 /* avoid av being freed when calling destructors below */
606 EXTEND_MORTAL(1);
607 PL_tmps_stack[++PL_tmps_ix] = SvREFCNT_inc_simple_NN(av);
608 orig_ix = PL_tmps_ix;
609
1604cfb0
MS
610 while (key)
611 SvREFCNT_dec(AvARRAY(av)[--key]);
a0d0e21e 612 }
22717f83 613
463ee0b2 614 Safefree(AvALLOC(av));
35da51f7 615 AvALLOC(av) = NULL;
9c6bc640 616 AvARRAY(av) = NULL;
93965878 617 AvMAX(av) = AvFILLp(av) = -1;
22717f83 618
ad64d0ec 619 if(SvRMAGICAL(av)) mg_clear(MUTABLE_SV(av));
be988557
DM
620 if (real) {
621 /* disarm av's premature free guard */
622 if (LIKELY(PL_tmps_ix == orig_ix))
623 PL_tmps_ix--;
624 else
625 PL_tmps_stack[orig_ix] = &PL_sv_undef;
626 SvREFCNT_dec_NN(av);
627 }
79072805
LW
628}
629
cb50131a 630/*
29a861e7
NC
631
632=for apidoc av_create_and_push
633
634Push an SV onto the end of the array, creating the array if necessary.
635A small internal helper function to remove a commonly duplicated idiom.
636
637=cut
638*/
639
640void
641Perl_av_create_and_push(pTHX_ AV **const avp, SV *const val)
642{
7918f24d 643 PERL_ARGS_ASSERT_AV_CREATE_AND_PUSH;
2fed2a1b 644
832a378e
KW
645 if (!*avp)
646 *avp = newAV();
647 av_push(*avp, val);
29a861e7
NC
648}
649
650/*
cb50131a
CB
651=for apidoc av_push
652
b895c103
KW
653Pushes an SV (transferring control of one reference count) onto the end of the
654array. The array will grow automatically to accommodate the addition.
cb50131a 655
17b0bd77 656Perl equivalent: C<push @myarray, $val;>.
f0b90de1 657
cb50131a
CB
658=cut
659*/
660
a0d0e21e 661void
5aaab254 662Perl_av_push(pTHX_ AV *av, SV *val)
93965878
NIS
663{
664 MAGIC *mg;
7918f24d
NC
665
666 PERL_ARGS_ASSERT_AV_PUSH;
2fed2a1b 667 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 668
93965878 669 if (SvREADONLY(av))
1604cfb0 670 Perl_croak_no_modify();
93965878 671
ad64d0ec 672 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
1604cfb0
MS
673 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(PUSH), G_DISCARD, 1,
674 val);
675 return;
93965878
NIS
676 }
677 av_store(av,AvFILLp(av)+1,val);
79072805
LW
678}
679
cb50131a
CB
680/*
681=for apidoc av_pop
682
f5d13a25
KW
683Removes one SV from the end of the array, reducing its size by one and
684returning the SV (transferring control of one reference count) to the
685caller. Returns C<&PL_sv_undef> if the array is empty.
cb50131a 686
f0b90de1
SF
687Perl equivalent: C<pop(@myarray);>
688
cb50131a
CB
689=cut
690*/
691
79072805 692SV *
5aaab254 693Perl_av_pop(pTHX_ AV *av)
79072805
LW
694{
695 SV *retval;
93965878 696 MAGIC* mg;
79072805 697
7918f24d 698 PERL_ARGS_ASSERT_AV_POP;
2fed2a1b 699 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 700
43fcc5d2 701 if (SvREADONLY(av))
1604cfb0 702 Perl_croak_no_modify();
ad64d0ec 703 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
1604cfb0
MS
704 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(POP), 0, 0);
705 if (retval)
706 retval = newSVsv(retval);
707 return retval;
93965878 708 }
d19c0e07 709 if (AvFILL(av) < 0)
1604cfb0 710 return &PL_sv_undef;
93965878 711 retval = AvARRAY(av)[AvFILLp(av)];
ce0d59fd 712 AvARRAY(av)[AvFILLp(av)--] = NULL;
8990e307 713 if (SvSMAGICAL(av))
1604cfb0 714 mg_set(MUTABLE_SV(av));
ce0d59fd 715 return retval ? retval : &PL_sv_undef;
79072805
LW
716}
717
cb50131a 718/*
29a861e7
NC
719
720=for apidoc av_create_and_unshift_one
721
722Unshifts an SV onto the beginning of the array, creating the array if
723necessary.
724A small internal helper function to remove a commonly duplicated idiom.
725
726=cut
727*/
728
729SV **
730Perl_av_create_and_unshift_one(pTHX_ AV **const avp, SV *const val)
731{
7918f24d 732 PERL_ARGS_ASSERT_AV_CREATE_AND_UNSHIFT_ONE;
2fed2a1b 733
832a378e
KW
734 if (!*avp)
735 *avp = newAV();
736 av_unshift(*avp, 1);
737 return av_store(*avp, 0, val);
29a861e7
NC
738}
739
740/*
cb50131a
CB
741=for apidoc av_unshift
742
743Unshift the given number of C<undef> values onto the beginning of the
17b0bd77 744array. The array will grow automatically to accommodate the addition.
cb50131a 745
17b0bd77 746Perl equivalent: S<C<unshift @myarray, ((undef) x $num);>>
f703fc96 747
cb50131a
CB
748=cut
749*/
750
79072805 751void
c70927a6 752Perl_av_unshift(pTHX_ AV *av, SSize_t num)
79072805 753{
c70927a6 754 SSize_t i;
93965878 755 MAGIC* mg;
79072805 756
7918f24d 757 PERL_ARGS_ASSERT_AV_UNSHIFT;
2fed2a1b 758 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 759
43fcc5d2 760 if (SvREADONLY(av))
1604cfb0 761 Perl_croak_no_modify();
93965878 762
ad64d0ec 763 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
1604cfb0
MS
764 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(UNSHIFT),
765 G_DISCARD | G_UNDEF_FILL, num);
766 return;
93965878
NIS
767 }
768
d19c0e07
MJD
769 if (num <= 0)
770 return;
49beac48 771 if (!AvREAL(av) && AvREIFY(av))
1604cfb0 772 av_reify(av);
a0d0e21e
LW
773 i = AvARRAY(av) - AvALLOC(av);
774 if (i) {
1604cfb0
MS
775 if (i > num)
776 i = num;
777 num -= i;
a0d0e21e 778
1604cfb0
MS
779 AvMAX(av) += i;
780 AvFILLp(av) += i;
781 AvARRAY(av) = AvARRAY(av) - i;
a0d0e21e 782 }
d2719217 783 if (num) {
1604cfb0
MS
784 SV **ary;
785 const SSize_t i = AvFILLp(av);
786 /* Create extra elements */
787 const SSize_t slide = i > 0 ? i : 0;
788 num += slide;
789 av_extend(av, i + num);
790 AvFILLp(av) += num;
791 ary = AvARRAY(av);
792 Move(ary, ary + num, i + 1, SV*);
793 do {
794 ary[--num] = NULL;
795 } while (num);
796 /* Make extra elements into a buffer */
797 AvMAX(av) -= slide;
798 AvFILLp(av) -= slide;
799 AvARRAY(av) = AvARRAY(av) + slide;
79072805
LW
800 }
801}
802
cb50131a
CB
803/*
804=for apidoc av_shift
805
dbc2ea0c
S
806Removes one SV from the start of the array, reducing its size by one and
807returning the SV (transferring control of one reference count) to the
808caller. Returns C<&PL_sv_undef> if the array is empty.
cb50131a 809
f0b90de1
SF
810Perl equivalent: C<shift(@myarray);>
811
cb50131a
CB
812=cut
813*/
814
79072805 815SV *
5aaab254 816Perl_av_shift(pTHX_ AV *av)
79072805
LW
817{
818 SV *retval;
93965878 819 MAGIC* mg;
79072805 820
7918f24d 821 PERL_ARGS_ASSERT_AV_SHIFT;
2fed2a1b 822 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 823
43fcc5d2 824 if (SvREADONLY(av))
1604cfb0 825 Perl_croak_no_modify();
ad64d0ec 826 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
1604cfb0
MS
827 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(SHIFT), 0, 0);
828 if (retval)
829 retval = newSVsv(retval);
830 return retval;
93965878 831 }
d19c0e07
MJD
832 if (AvFILL(av) < 0)
833 return &PL_sv_undef;
463ee0b2 834 retval = *AvARRAY(av);
a0d0e21e 835 if (AvREAL(av))
1604cfb0 836 *AvARRAY(av) = NULL;
9c6bc640 837 AvARRAY(av) = AvARRAY(av) + 1;
463ee0b2 838 AvMAX(av)--;
93965878 839 AvFILLp(av)--;
8990e307 840 if (SvSMAGICAL(av))
1604cfb0 841 mg_set(MUTABLE_SV(av));
ce0d59fd 842 return retval ? retval : &PL_sv_undef;
79072805
LW
843}
844
cb50131a 845/*
a56541eb
KW
846=for apidoc av_tindex
847=for apidoc_item av_top_index
cb50131a 848
a56541eb
KW
849These behave identically.
850If the array C<av> is empty, these return -1; otherwise they return the maximum
851value of the indices of all the array elements which are currently defined in
852C<av>.
cb50131a 853
a56541eb 854They process 'get' magic.
a8676f70 855
a56541eb
KW
856The Perl equivalent for these is C<$#av>.
857
858Use C<L</av_count>> to get the number of elements in an array.
12719193 859
36baafc9
KW
860=for apidoc av_len
861
b985ae61 862Same as L</av_top_index>. Note that, unlike what the name implies, it returns
a56541eb 863the maximum index in the array. This is unlike L</sv_len>, which returns what
87306e06
KW
864you would expect.
865
866B<To get the true number of elements in the array, instead use C<L</av_count>>>.
36baafc9 867
cb50131a
CB
868=cut
869*/
870
c70927a6 871SSize_t
bb5dd93d 872Perl_av_len(pTHX_ AV *av)
79072805 873{
7918f24d 874 PERL_ARGS_ASSERT_AV_LEN;
36baafc9 875
be3a7a5d 876 return av_top_index(av);
36baafc9
KW
877}
878
f3b76584
SC
879/*
880=for apidoc av_fill
881
977a499b 882Set the highest index in the array to the given number, equivalent to
61b16eb9 883Perl's S<C<$#array = $fill;>>.
f3b76584 884
61b16eb9 885The number of elements in the array will be S<C<fill + 1>> after
796b6530 886C<av_fill()> returns. If the array was previously shorter, then the
ce0d59fd 887additional elements appended are set to NULL. If the array
61b16eb9 888was longer, then the excess elements are freed. S<C<av_fill(av, -1)>> is
977a499b
GA
889the same as C<av_clear(av)>.
890
f3b76584
SC
891=cut
892*/
79072805 893void
c70927a6 894Perl_av_fill(pTHX_ AV *av, SSize_t fill)
79072805 895{
93965878 896 MAGIC *mg;
ba5d1d60 897
7918f24d 898 PERL_ARGS_ASSERT_AV_FILL;
2fed2a1b 899 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 900
79072805 901 if (fill < 0)
1604cfb0 902 fill = -1;
ad64d0ec 903 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
1604cfb0
MS
904 SV *arg1 = sv_newmortal();
905 sv_setiv(arg1, (IV)(fill + 1));
906 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(STORESIZE), G_DISCARD,
907 1, arg1);
908 return;
93965878 909 }
463ee0b2 910 if (fill <= AvMAX(av)) {
1604cfb0
MS
911 SSize_t key = AvFILLp(av);
912 SV** const ary = AvARRAY(av);
913
914 if (AvREAL(av)) {
915 while (key > fill) {
916 SvREFCNT_dec(ary[key]);
917 ary[key--] = NULL;
918 }
919 }
920 else {
921 while (key < fill)
922 ary[++key] = NULL;
923 }
924
925 AvFILLp(av) = fill;
926 if (SvSMAGICAL(av))
927 mg_set(MUTABLE_SV(av));
463ee0b2 928 }
a0d0e21e 929 else
1604cfb0 930 (void)av_store(av,fill,NULL);
79072805 931}
c750a3ec 932
f3b76584
SC
933/*
934=for apidoc av_delete
935
17b0bd77
DM
936Deletes the element indexed by C<key> from the array, makes the element
937mortal, and returns it. If C<flags> equals C<G_DISCARD>, the element is
938freed and NULL is returned. NULL is also returned if C<key> is out of
939range.
940
941Perl equivalent: S<C<splice(@myarray, $key, 1, undef)>> (with the
942C<splice> in void context if C<G_DISCARD> is present).
f3b76584
SC
943
944=cut
945*/
146174a9 946SV *
c70927a6 947Perl_av_delete(pTHX_ AV *av, SSize_t key, I32 flags)
146174a9
CB
948{
949 SV *sv;
950
7918f24d 951 PERL_ARGS_ASSERT_AV_DELETE;
2fed2a1b 952 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 953
146174a9 954 if (SvREADONLY(av))
1604cfb0 955 Perl_croak_no_modify();
6f12eb6d
MJD
956
957 if (SvRMAGICAL(av)) {
ad64d0ec 958 const MAGIC * const tied_magic
1604cfb0 959 = mg_find((const SV *)av, PERL_MAGIC_tied);
ad64d0ec 960 if ((tied_magic || mg_find((const SV *)av, PERL_MAGIC_regdata))) {
35a4481c 961 SV **svp;
6f12eb6d 962 if (key < 0) {
1604cfb0
MS
963 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
964 return NULL;
6f12eb6d
MJD
965 }
966 svp = av_fetch(av, key, TRUE);
967 if (svp) {
968 sv = *svp;
969 mg_clear(sv);
970 if (mg_find(sv, PERL_MAGIC_tiedelem)) {
971 sv_unmagic(sv, PERL_MAGIC_tiedelem); /* No longer an element */
972 return sv;
973 }
1604cfb0 974 return NULL;
6f12eb6d
MJD
975 }
976 }
977 }
978
146174a9 979 if (key < 0) {
1604cfb0
MS
980 key += AvFILL(av) + 1;
981 if (key < 0)
982 return NULL;
146174a9 983 }
6f12eb6d 984
146174a9 985 if (key > AvFILLp(av))
1604cfb0 986 return NULL;
146174a9 987 else {
1604cfb0
MS
988 if (!AvREAL(av) && AvREIFY(av))
989 av_reify(av);
990 sv = AvARRAY(av)[key];
991 AvARRAY(av)[key] = NULL;
992 if (key == AvFILLp(av)) {
993 do {
994 AvFILLp(av)--;
995 } while (--key >= 0 && !AvARRAY(av)[key]);
996 }
997 if (SvSMAGICAL(av))
998 mg_set(MUTABLE_SV(av));
146174a9 999 }
725995b4 1000 if(sv != NULL) {
1604cfb0
MS
1001 if (flags & G_DISCARD) {
1002 SvREFCNT_dec_NN(sv);
1003 return NULL;
1004 }
1005 else if (AvREAL(av))
1006 sv_2mortal(sv);
146174a9
CB
1007 }
1008 return sv;
1009}
1010
1011/*
f3b76584
SC
1012=for apidoc av_exists
1013
1014Returns true if the element indexed by C<key> has been initialized.
146174a9 1015
f3b76584 1016This relies on the fact that uninitialized array elements are set to
796b6530 1017C<NULL>.
f3b76584 1018
b7ff7ff2
SF
1019Perl equivalent: C<exists($myarray[$key])>.
1020
f3b76584
SC
1021=cut
1022*/
146174a9 1023bool
c70927a6 1024Perl_av_exists(pTHX_ AV *av, SSize_t key)
146174a9 1025{
7918f24d 1026 PERL_ARGS_ASSERT_AV_EXISTS;
2fed2a1b 1027 assert(SvTYPE(av) == SVt_PVAV);
6f12eb6d
MJD
1028
1029 if (SvRMAGICAL(av)) {
ad64d0ec 1030 const MAGIC * const tied_magic
1604cfb0 1031 = mg_find((const SV *)av, PERL_MAGIC_tied);
54a4274e
PM
1032 const MAGIC * const regdata_magic
1033 = mg_find((const SV *)av, PERL_MAGIC_regdata);
1034 if (tied_magic || regdata_magic) {
6f12eb6d
MJD
1035 MAGIC *mg;
1036 /* Handle negative array indices 20020222 MJD */
1037 if (key < 0) {
1604cfb0 1038 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
6f12eb6d 1039 return FALSE;
6f12eb6d
MJD
1040 }
1041
54a4274e
PM
1042 if(key >= 0 && regdata_magic) {
1043 if (key <= AvFILL(av))
1044 return TRUE;
1045 else
1046 return FALSE;
1047 }
1604cfb0
MS
1048 {
1049 SV * const sv = sv_newmortal();
1050 mg_copy(MUTABLE_SV(av), sv, 0, key);
1051 mg = mg_find(sv, PERL_MAGIC_tiedelem);
1052 if (mg) {
1053 magic_existspack(sv, mg);
1054 {
1055 I32 retbool = SvTRUE_nomg_NN(sv);
1056 return cBOOL(retbool);
1057 }
1058 }
1059 }
6f12eb6d
MJD
1060 }
1061 }
1062
146174a9 1063 if (key < 0) {
1604cfb0
MS
1064 key += AvFILL(av) + 1;
1065 if (key < 0)
1066 return FALSE;
146174a9 1067 }
6f12eb6d 1068
ce0d59fd 1069 if (key <= AvFILLp(av) && AvARRAY(av)[key])
146174a9 1070 {
1604cfb0
MS
1071 if (SvSMAGICAL(AvARRAY(av)[key])
1072 && mg_find(AvARRAY(av)[key], PERL_MAGIC_nonelem))
1073 return FALSE;
1074 return TRUE;
146174a9
CB
1075 }
1076 else
1604cfb0 1077 return FALSE;
146174a9 1078}
66610fdd 1079
c33269f7 1080static MAGIC *
878d132a 1081S_get_aux_mg(pTHX_ AV *av) {
ba5d1d60
GA
1082 MAGIC *mg;
1083
7918f24d 1084 PERL_ARGS_ASSERT_GET_AUX_MG;
2fed2a1b 1085 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 1086
ad64d0ec 1087 mg = mg_find((const SV *)av, PERL_MAGIC_arylen_p);
a3874608
NC
1088
1089 if (!mg) {
1604cfb0
MS
1090 mg = sv_magicext(MUTABLE_SV(av), 0, PERL_MAGIC_arylen_p,
1091 &PL_vtbl_arylen_p, 0, 0);
1092 assert(mg);
1093 /* sv_magicext won't set this for us because we pass in a NULL obj */
1094 mg->mg_flags |= MGf_REFCOUNTED;
a3874608 1095 }
878d132a
NC
1096 return mg;
1097}
1098
1099SV **
1100Perl_av_arylen_p(pTHX_ AV *av) {
1101 MAGIC *const mg = get_aux_mg(av);
7918f24d
NC
1102
1103 PERL_ARGS_ASSERT_AV_ARYLEN_P;
2fed2a1b 1104 assert(SvTYPE(av) == SVt_PVAV);
7918f24d 1105
a3874608
NC
1106 return &(mg->mg_obj);
1107}
1108
453d94a9 1109IV *
878d132a
NC
1110Perl_av_iter_p(pTHX_ AV *av) {
1111 MAGIC *const mg = get_aux_mg(av);
7918f24d
NC
1112
1113 PERL_ARGS_ASSERT_AV_ITER_P;
2fed2a1b 1114 assert(SvTYPE(av) == SVt_PVAV);
7918f24d 1115
4803e7f7 1116 if (sizeof(IV) == sizeof(SSize_t)) {
1604cfb0 1117 return (IV *)&(mg->mg_len);
4803e7f7 1118 } else {
1604cfb0
MS
1119 if (!mg->mg_ptr) {
1120 IV *temp;
1121 mg->mg_len = IVSIZE;
1122 Newxz(temp, 1, IV);
1123 mg->mg_ptr = (char *) temp;
1124 }
1125 return (IV *)mg->mg_ptr;
453d94a9 1126 }
878d132a
NC
1127}
1128
1f1dcfb5
FC
1129SV *
1130Perl_av_nonelem(pTHX_ AV *av, SSize_t ix) {
8fcb2425 1131 SV * const sv = newSV_type(SVt_NULL);
1f1dcfb5
FC
1132 PERL_ARGS_ASSERT_AV_NONELEM;
1133 if (!av_store(av,ix,sv))
1604cfb0 1134 return sv_2mortal(sv); /* has tie magic */
1f1dcfb5
FC
1135 sv_magic(sv, NULL, PERL_MAGIC_nonelem, NULL, 0);
1136 return sv;
1137}
1138
66610fdd 1139/*
14d04a33 1140 * ex: set ts=8 sts=4 sw=4 et:
37442d52 1141 */