This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
re-apply some xhv_backreferences notes and stuff
[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
ccfc67b7
JH
18/*
19=head1 Array Manipulation Functions
20*/
21
79072805 22#include "EXTERN.h"
864dbfa3 23#define PERL_IN_AV_C
79072805
LW
24#include "perl.h"
25
fb73857a 26void
864dbfa3 27Perl_av_reify(pTHX_ AV *av)
a0d0e21e 28{
97aff369 29 dVAR;
a0d0e21e 30 I32 key;
fb73857a 31
7918f24d 32 PERL_ARGS_ASSERT_AV_REIFY;
2fed2a1b 33 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 34
3c78fafa
GS
35 if (AvREAL(av))
36 return;
93965878 37#ifdef DEBUGGING
9b387841
NC
38 if (SvTIED_mg((const SV *)av, PERL_MAGIC_tied))
39 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "av_reify called on tied array");
93965878 40#endif
a0d0e21e 41 key = AvMAX(av) + 1;
93965878 42 while (key > AvFILLp(av) + 1)
3280af22 43 AvARRAY(av)[--key] = &PL_sv_undef;
a0d0e21e 44 while (key) {
4373e329 45 SV * const sv = AvARRAY(av)[--key];
a0d0e21e 46 assert(sv);
411caa50 47 if (sv != &PL_sv_undef)
e2d306cb 48 SvREFCNT_inc_simple_void_NN(sv);
a0d0e21e 49 }
29de640a
CS
50 key = AvARRAY(av) - AvALLOC(av);
51 while (key)
3280af22 52 AvALLOC(av)[--key] = &PL_sv_undef;
62b1ebc2 53 AvREIFY_off(av);
a0d0e21e
LW
54 AvREAL_on(av);
55}
56
cb50131a
CB
57/*
58=for apidoc av_extend
59
60Pre-extend an array. The C<key> is the index to which the array should be
61extended.
62
63=cut
64*/
65
a0d0e21e 66void
864dbfa3 67Perl_av_extend(pTHX_ AV *av, I32 key)
a0d0e21e 68{
97aff369 69 dVAR;
7a5b473e
AL
70 MAGIC *mg;
71
7918f24d 72 PERL_ARGS_ASSERT_AV_EXTEND;
2fed2a1b 73 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 74
ad64d0ec 75 mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied);
823a54a3 76 if (mg) {
efaf3674
DM
77 SV *arg1 = sv_newmortal();
78 sv_setiv(arg1, (IV)(key + 1));
046b0c7d
NC
79 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, "EXTEND", G_DISCARD, 1,
80 arg1);
93965878
NIS
81 return;
82 }
a0d0e21e
LW
83 if (key > AvMAX(av)) {
84 SV** ary;
85 I32 tmp;
86 I32 newmax;
87
88 if (AvALLOC(av) != AvARRAY(av)) {
93965878 89 ary = AvALLOC(av) + AvFILLp(av) + 1;
a0d0e21e 90 tmp = AvARRAY(av) - AvALLOC(av);
93965878 91 Move(AvARRAY(av), AvALLOC(av), AvFILLp(av)+1, SV*);
a0d0e21e 92 AvMAX(av) += tmp;
9c6bc640 93 AvARRAY(av) = AvALLOC(av);
a0d0e21e
LW
94 if (AvREAL(av)) {
95 while (tmp)
3280af22 96 ary[--tmp] = &PL_sv_undef;
a0d0e21e 97 }
a0d0e21e
LW
98 if (key > AvMAX(av) - 10) {
99 newmax = key + AvMAX(av);
100 goto resize;
101 }
102 }
103 else {
2b573ace
JH
104#ifdef PERL_MALLOC_WRAP
105 static const char oom_array_extend[] =
106 "Out of memory during array extend"; /* Duplicated in pp_hot.c */
107#endif
108
a0d0e21e 109 if (AvALLOC(av)) {
516a5887 110#if !defined(STRANGE_MALLOC) && !defined(MYMALLOC)
c1f7b11a
SB
111 MEM_SIZE bytes;
112 IV itmp;
c07a80fd 113#endif
4633a7c4 114
ca7c1a29 115#ifdef Perl_safesysmalloc_size
e050cc0e
NC
116 /* Whilst it would be quite possible to move this logic around
117 (as I did in the SV code), so as to set AvMAX(av) early,
118 based on calling Perl_safesysmalloc_size() immediately after
119 allocation, I'm not convinced that it is a great idea here.
120 In an array we have to loop round setting everything to
121 &PL_sv_undef, which means writing to memory, potentially lots
122 of it, whereas for the SV buffer case we don't touch the
123 "bonus" memory. So there there is no cost in telling the
124 world about it, whereas here we have to do work before we can
125 tell the world about it, and that work involves writing to
126 memory that might never be read. So, I feel, better to keep
127 the current lazy system of only writing to it if our caller
128 has a need for more space. NWC */
ca7c1a29 129 newmax = Perl_safesysmalloc_size((void*)AvALLOC(av)) /
260890ed 130 sizeof(const SV *) - 1;
8d6dde3e
IZ
131
132 if (key <= newmax)
133 goto resized;
134#endif
a0d0e21e
LW
135 newmax = key + AvMAX(av) / 5;
136 resize:
2b573ace 137 MEM_WRAP_CHECK_1(newmax+1, SV*, oom_array_extend);
8d6dde3e 138#if defined(STRANGE_MALLOC) || defined(MYMALLOC)
a0d0e21e 139 Renew(AvALLOC(av),newmax+1, SV*);
4633a7c4 140#else
260890ed 141 bytes = (newmax + 1) * sizeof(const SV *);
4633a7c4 142#define MALLOC_OVERHEAD 16
c1f7b11a 143 itmp = MALLOC_OVERHEAD;
eb160463 144 while ((MEM_SIZE)(itmp - MALLOC_OVERHEAD) < bytes)
c1f7b11a
SB
145 itmp += itmp;
146 itmp -= MALLOC_OVERHEAD;
260890ed 147 itmp /= sizeof(const SV *);
c1f7b11a
SB
148 assert(itmp > newmax);
149 newmax = itmp - 1;
150 assert(newmax >= AvMAX(av));
a02a5408 151 Newx(ary, newmax+1, SV*);
4633a7c4 152 Copy(AvALLOC(av), ary, AvMAX(av)+1, SV*);
fba3b22e 153 if (AvMAX(av) > 64)
260890ed
NC
154 offer_nice_chunk(AvALLOC(av),
155 (AvMAX(av)+1) * sizeof(const SV *));
4633a7c4
LW
156 else
157 Safefree(AvALLOC(av));
158 AvALLOC(av) = ary;
159#endif
ca7c1a29 160#ifdef Perl_safesysmalloc_size
8d6dde3e 161 resized:
9c5ffd7c 162#endif
a0d0e21e
LW
163 ary = AvALLOC(av) + AvMAX(av) + 1;
164 tmp = newmax - AvMAX(av);
3280af22
NIS
165 if (av == PL_curstack) { /* Oops, grew stack (via av_store()?) */
166 PL_stack_sp = AvALLOC(av) + (PL_stack_sp - PL_stack_base);
167 PL_stack_base = AvALLOC(av);
168 PL_stack_max = PL_stack_base + newmax;
a0d0e21e
LW
169 }
170 }
171 else {
8d6dde3e 172 newmax = key < 3 ? 3 : key;
2b573ace 173 MEM_WRAP_CHECK_1(newmax+1, SV*, oom_array_extend);
a02a5408 174 Newx(AvALLOC(av), newmax+1, SV*);
a0d0e21e
LW
175 ary = AvALLOC(av) + 1;
176 tmp = newmax;
3280af22 177 AvALLOC(av)[0] = &PL_sv_undef; /* For the stacks */
a0d0e21e
LW
178 }
179 if (AvREAL(av)) {
180 while (tmp)
3280af22 181 ary[--tmp] = &PL_sv_undef;
a0d0e21e
LW
182 }
183
9c6bc640 184 AvARRAY(av) = AvALLOC(av);
a0d0e21e
LW
185 AvMAX(av) = newmax;
186 }
187 }
188}
189
cb50131a
CB
190/*
191=for apidoc av_fetch
192
193Returns the SV at the specified index in the array. The C<key> is the
1a328862
SF
194index. If lval is true, you are guaranteed to get a real SV back (in case
195it wasn't real before), which you can then modify. Check that the return
196value is non-null before dereferencing it to a C<SV*>.
cb50131a
CB
197
198See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
199more information on how to use this function on tied arrays.
200
1a328862 201The rough perl equivalent is C<$myarray[$idx]>.
cb50131a
CB
202=cut
203*/
204
79072805 205SV**
864dbfa3 206Perl_av_fetch(pTHX_ register AV *av, I32 key, I32 lval)
79072805 207{
97aff369 208 dVAR;
79072805 209
7918f24d 210 PERL_ARGS_ASSERT_AV_FETCH;
2fed2a1b 211 assert(SvTYPE(av) == SVt_PVAV);
a0d0e21e 212
6f12eb6d 213 if (SvRMAGICAL(av)) {
ad64d0ec
NC
214 const MAGIC * const tied_magic
215 = mg_find((const SV *)av, PERL_MAGIC_tied);
216 if (tied_magic || mg_find((const SV *)av, PERL_MAGIC_regdata)) {
e2d306cb
AL
217 SV *sv;
218 if (key < 0) {
219 I32 adjust_index = 1;
220 if (tied_magic) {
221 /* Handle negative array indices 20020222 MJD */
222 SV * const * const negative_indices_glob =
ad64d0ec
NC
223 hv_fetch(SvSTASH(SvRV(SvTIED_obj(MUTABLE_SV(av),
224 tied_magic))),
e2d306cb
AL
225 NEGATIVE_INDICES_VAR, 16, 0);
226
227 if (negative_indices_glob && SvTRUE(GvSV(*negative_indices_glob)))
228 adjust_index = 0;
229 }
6f12eb6d 230
e2d306cb
AL
231 if (adjust_index) {
232 key += AvFILL(av) + 1;
233 if (key < 0)
234 return NULL;
235 }
236 }
6f12eb6d
MJD
237
238 sv = sv_newmortal();
dd28f7bb 239 sv_upgrade(sv, SVt_PVLV);
ad64d0ec 240 mg_copy(MUTABLE_SV(av), sv, 0, key);
2d961f6d
DM
241 if (!tied_magic) /* for regdata, force leavesub to make copies */
242 SvTEMP_off(sv);
dd28f7bb
DM
243 LvTYPE(sv) = 't';
244 LvTARG(sv) = sv; /* fake (SV**) */
245 return &(LvTARG(sv));
6f12eb6d
MJD
246 }
247 }
248
93965878
NIS
249 if (key < 0) {
250 key += AvFILL(av) + 1;
251 if (key < 0)
e2d306cb 252 return NULL;
93965878
NIS
253 }
254
93965878 255 if (key > AvFILLp(av)) {
a0d0e21e 256 if (!lval)
e2d306cb
AL
257 return NULL;
258 return av_store(av,key,newSV(0));
79072805 259 }
3280af22 260 if (AvARRAY(av)[key] == &PL_sv_undef) {
4dbf4341 261 emptyness:
e2d306cb
AL
262 if (lval)
263 return av_store(av,key,newSV(0));
264 return NULL;
79072805 265 }
4dbf4341 266 else if (AvREIFY(av)
267 && (!AvARRAY(av)[key] /* eg. @_ could have freed elts */
0565a181 268 || SvIS_FREED(AvARRAY(av)[key]))) {
3280af22 269 AvARRAY(av)[key] = &PL_sv_undef; /* 1/2 reify */
4dbf4341 270 goto emptyness;
271 }
463ee0b2 272 return &AvARRAY(av)[key];
79072805
LW
273}
274
cb50131a
CB
275/*
276=for apidoc av_store
277
278Stores an SV in an array. The array index is specified as C<key>. The
279return value will be NULL if the operation failed or if the value did not
280need to be actually stored within the array (as in the case of tied
281arrays). Otherwise it can be dereferenced to get the original C<SV*>. Note
282that the caller is responsible for suitably incrementing the reference
283count of C<val> before the call, and decrementing it if the function
284returned NULL.
285
286See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
287more information on how to use this function on tied arrays.
288
289=cut
290*/
291
79072805 292SV**
864dbfa3 293Perl_av_store(pTHX_ register AV *av, I32 key, SV *val)
79072805 294{
97aff369 295 dVAR;
79072805
LW
296 SV** ary;
297
7918f24d 298 PERL_ARGS_ASSERT_AV_STORE;
2fed2a1b 299 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 300
725ac12f
NC
301 /* S_regclass relies on being able to pass in a NULL sv
302 (unicode_alternate may be NULL).
303 */
304
43fcc5d2 305 if (!val)
3280af22 306 val = &PL_sv_undef;
463ee0b2 307
6f12eb6d 308 if (SvRMAGICAL(av)) {
ad64d0ec 309 const MAGIC * const tied_magic = mg_find((const SV *)av, PERL_MAGIC_tied);
6f12eb6d
MJD
310 if (tied_magic) {
311 /* Handle negative array indices 20020222 MJD */
312 if (key < 0) {
e2d306cb 313 bool adjust_index = 1;
823a54a3 314 SV * const * const negative_indices_glob =
ad64d0ec 315 hv_fetch(SvSTASH(SvRV(SvTIED_obj(MUTABLE_SV(av),
6f12eb6d
MJD
316 tied_magic))),
317 NEGATIVE_INDICES_VAR, 16, 0);
318 if (negative_indices_glob
319 && SvTRUE(GvSV(*negative_indices_glob)))
320 adjust_index = 0;
321 if (adjust_index) {
322 key += AvFILL(av) + 1;
323 if (key < 0)
324 return 0;
325 }
326 }
327 if (val != &PL_sv_undef) {
ad64d0ec 328 mg_copy(MUTABLE_SV(av), val, 0, key);
6f12eb6d 329 }
e2d306cb 330 return NULL;
6f12eb6d
MJD
331 }
332 }
333
334
a0d0e21e
LW
335 if (key < 0) {
336 key += AvFILL(av) + 1;
337 if (key < 0)
e2d306cb 338 return NULL;
79072805 339 }
93965878 340
43fcc5d2 341 if (SvREADONLY(av) && key >= AvFILL(av))
6ad8f254 342 Perl_croak_no_modify(aTHX);
93965878 343
49beac48 344 if (!AvREAL(av) && AvREIFY(av))
a0d0e21e 345 av_reify(av);
a0d0e21e
LW
346 if (key > AvMAX(av))
347 av_extend(av,key);
463ee0b2 348 ary = AvARRAY(av);
93965878 349 if (AvFILLp(av) < key) {
a0d0e21e 350 if (!AvREAL(av)) {
3280af22
NIS
351 if (av == PL_curstack && key > PL_stack_sp - PL_stack_base)
352 PL_stack_sp = PL_stack_base + key; /* XPUSH in disguise */
e2d306cb 353 do {
3280af22 354 ary[++AvFILLp(av)] = &PL_sv_undef;
e2d306cb 355 } while (AvFILLp(av) < key);
79072805 356 }
93965878 357 AvFILLp(av) = key;
79072805 358 }
a0d0e21e
LW
359 else if (AvREAL(av))
360 SvREFCNT_dec(ary[key]);
79072805 361 ary[key] = val;
8990e307 362 if (SvSMAGICAL(av)) {
89c14e2e 363 const MAGIC* const mg = SvMAGIC(av);
3280af22 364 if (val != &PL_sv_undef) {
ad64d0ec 365 sv_magic(val, MUTABLE_SV(av), toLOWER(mg->mg_type), 0, key);
a0d0e21e 366 }
89c14e2e 367 if (PL_delaymagic && mg->mg_type == PERL_MAGIC_isa)
354b0578 368 PL_delaymagic |= DM_ARRAY_ISA;
89c14e2e 369 else
ad64d0ec 370 mg_set(MUTABLE_SV(av));
463ee0b2 371 }
79072805
LW
372 return &ary[key];
373}
374
cb50131a 375/*
cb50131a
CB
376=for apidoc av_make
377
378Creates a new AV and populates it with a list of SVs. The SVs are copied
379into the array, so they may be freed after the call to av_make. The new AV
380will have a reference count of 1.
381
775f1d61
SF
382Perl equivalent: C<my @new_array = ($scalar1, $scalar2, $scalar3...);>
383
cb50131a
CB
384=cut
385*/
386
79072805 387AV *
864dbfa3 388Perl_av_make(pTHX_ register I32 size, register SV **strp)
79072805 389{
502c6561 390 register AV * const av = MUTABLE_AV(newSV_type(SVt_PVAV));
a7f5e44d 391 /* sv_upgrade does AvREAL_only() */
7918f24d 392 PERL_ARGS_ASSERT_AV_MAKE;
2fed2a1b
NC
393 assert(SvTYPE(av) == SVt_PVAV);
394
a0288114 395 if (size) { /* "defined" was returning undef for size==0 anyway. */
dd374669
AL
396 register SV** ary;
397 register I32 i;
a02a5408 398 Newx(ary,size,SV*);
573fa4ea 399 AvALLOC(av) = ary;
9c6bc640 400 AvARRAY(av) = ary;
35da51f7 401 AvFILLp(av) = AvMAX(av) = size - 1;
573fa4ea
TB
402 for (i = 0; i < size; i++) {
403 assert (*strp);
2b676593
BB
404
405 /* Don't let sv_setsv swipe, since our source array might
406 have multiple references to the same temp scalar (e.g.
407 from a list slice) */
408
561b68a9 409 ary[i] = newSV(0);
2b676593
BB
410 sv_setsv_flags(ary[i], *strp,
411 SV_GMAGIC|SV_DO_COW_SVSETSV|SV_NOSTEAL);
573fa4ea
TB
412 strp++;
413 }
79072805 414 }
463ee0b2 415 return av;
79072805
LW
416}
417
cb50131a
CB
418/*
419=for apidoc av_clear
420
421Clears an array, making it empty. Does not free the memory used by the
31bde0ac 422array itself. Perl equivalent: C<@myarray = ();>.
cb50131a
CB
423
424=cut
425*/
426
79072805 427void
864dbfa3 428Perl_av_clear(pTHX_ register AV *av)
79072805 429{
97aff369 430 dVAR;
e2d306cb 431 I32 extra;
79072805 432
7918f24d 433 PERL_ARGS_ASSERT_AV_CLEAR;
2fed2a1b
NC
434 assert(SvTYPE(av) == SVt_PVAV);
435
7d55f622 436#ifdef DEBUGGING
9b387841
NC
437 if (SvREFCNT(av) == 0) {
438 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "Attempt to clear deleted array");
7d55f622 439 }
440#endif
a0d0e21e 441
39caa665 442 if (SvREADONLY(av))
6ad8f254 443 Perl_croak_no_modify(aTHX);
39caa665 444
93965878 445 /* Give any tie a chance to cleanup first */
89c14e2e
BB
446 if (SvRMAGICAL(av)) {
447 const MAGIC* const mg = SvMAGIC(av);
b63c7c55 448 if (PL_delaymagic && mg && mg->mg_type == PERL_MAGIC_isa)
354b0578 449 PL_delaymagic |= DM_ARRAY_ISA;
89c14e2e 450 else
ad64d0ec 451 mg_clear(MUTABLE_SV(av));
89c14e2e 452 }
93965878 453
a60c0954
NIS
454 if (AvMAX(av) < 0)
455 return;
456
a0d0e21e 457 if (AvREAL(av)) {
823a54a3 458 SV** const ary = AvARRAY(av);
e2d306cb
AL
459 I32 index = AvFILLp(av) + 1;
460 while (index) {
461 SV * const sv = ary[--index];
6b42d12b 462 /* undef the slot before freeing the value, because a
e2d306cb
AL
463 * destructor might try to modify this array */
464 ary[index] = &PL_sv_undef;
6b42d12b 465 SvREFCNT_dec(sv);
a0d0e21e
LW
466 }
467 }
e2d306cb
AL
468 extra = AvARRAY(av) - AvALLOC(av);
469 if (extra) {
470 AvMAX(av) += extra;
9c6bc640 471 AvARRAY(av) = AvALLOC(av);
79072805 472 }
93965878 473 AvFILLp(av) = -1;
fb73857a 474
79072805
LW
475}
476
cb50131a
CB
477/*
478=for apidoc av_undef
479
480Undefines the array. Frees the memory used by the array itself.
481
482=cut
483*/
484
79072805 485void
864dbfa3 486Perl_av_undef(pTHX_ register AV *av)
79072805 487{
7918f24d 488 PERL_ARGS_ASSERT_AV_UNDEF;
2fed2a1b 489 assert(SvTYPE(av) == SVt_PVAV);
93965878
NIS
490
491 /* Give any tie a chance to cleanup first */
ad64d0ec 492 if (SvTIED_mg((const SV *)av, PERL_MAGIC_tied))
22717f83 493 av_fill(av, -1);
93965878 494
a0d0e21e 495 if (AvREAL(av)) {
a3b680e6 496 register I32 key = AvFILLp(av) + 1;
a0d0e21e
LW
497 while (key)
498 SvREFCNT_dec(AvARRAY(av)[--key]);
499 }
22717f83 500
463ee0b2 501 Safefree(AvALLOC(av));
35da51f7 502 AvALLOC(av) = NULL;
9c6bc640 503 AvARRAY(av) = NULL;
93965878 504 AvMAX(av) = AvFILLp(av) = -1;
22717f83 505
ad64d0ec 506 if(SvRMAGICAL(av)) mg_clear(MUTABLE_SV(av));
79072805
LW
507}
508
cb50131a 509/*
29a861e7
NC
510
511=for apidoc av_create_and_push
512
513Push an SV onto the end of the array, creating the array if necessary.
514A small internal helper function to remove a commonly duplicated idiom.
515
516=cut
517*/
518
519void
520Perl_av_create_and_push(pTHX_ AV **const avp, SV *const val)
521{
7918f24d 522 PERL_ARGS_ASSERT_AV_CREATE_AND_PUSH;
2fed2a1b 523
29a861e7
NC
524 if (!*avp)
525 *avp = newAV();
526 av_push(*avp, val);
527}
528
529/*
cb50131a
CB
530=for apidoc av_push
531
532Pushes an SV onto the end of the array. The array will grow automatically
f629640b
S
533to accommodate the addition. Like C<av_store>, this takes ownership of one
534reference count.
cb50131a
CB
535
536=cut
537*/
538
a0d0e21e 539void
864dbfa3 540Perl_av_push(pTHX_ register AV *av, SV *val)
93965878 541{
27da23d5 542 dVAR;
93965878 543 MAGIC *mg;
7918f24d
NC
544
545 PERL_ARGS_ASSERT_AV_PUSH;
2fed2a1b 546 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 547
93965878 548 if (SvREADONLY(av))
6ad8f254 549 Perl_croak_no_modify(aTHX);
93965878 550
ad64d0ec 551 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
046b0c7d
NC
552 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, "PUSH", G_DISCARD, 1,
553 val);
93965878
NIS
554 return;
555 }
556 av_store(av,AvFILLp(av)+1,val);
79072805
LW
557}
558
cb50131a
CB
559/*
560=for apidoc av_pop
561
562Pops an SV off the end of the array. Returns C<&PL_sv_undef> if the array
563is empty.
564
565=cut
566*/
567
79072805 568SV *
864dbfa3 569Perl_av_pop(pTHX_ register AV *av)
79072805 570{
27da23d5 571 dVAR;
79072805 572 SV *retval;
93965878 573 MAGIC* mg;
79072805 574
7918f24d 575 PERL_ARGS_ASSERT_AV_POP;
2fed2a1b 576 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 577
43fcc5d2 578 if (SvREADONLY(av))
6ad8f254 579 Perl_croak_no_modify(aTHX);
ad64d0ec 580 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
046b0c7d 581 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, "POP", 0, 0);
efaf3674
DM
582 if (retval)
583 retval = newSVsv(retval);
93965878
NIS
584 return retval;
585 }
d19c0e07
MJD
586 if (AvFILL(av) < 0)
587 return &PL_sv_undef;
93965878 588 retval = AvARRAY(av)[AvFILLp(av)];
3280af22 589 AvARRAY(av)[AvFILLp(av)--] = &PL_sv_undef;
8990e307 590 if (SvSMAGICAL(av))
ad64d0ec 591 mg_set(MUTABLE_SV(av));
79072805
LW
592 return retval;
593}
594
cb50131a 595/*
29a861e7
NC
596
597=for apidoc av_create_and_unshift_one
598
599Unshifts an SV onto the beginning of the array, creating the array if
600necessary.
601A small internal helper function to remove a commonly duplicated idiom.
602
603=cut
604*/
605
606SV **
607Perl_av_create_and_unshift_one(pTHX_ AV **const avp, SV *const val)
608{
7918f24d 609 PERL_ARGS_ASSERT_AV_CREATE_AND_UNSHIFT_ONE;
2fed2a1b 610
29a861e7
NC
611 if (!*avp)
612 *avp = newAV();
613 av_unshift(*avp, 1);
614 return av_store(*avp, 0, val);
615}
616
617/*
cb50131a
CB
618=for apidoc av_unshift
619
620Unshift the given number of C<undef> values onto the beginning of the
621array. The array will grow automatically to accommodate the addition. You
622must then use C<av_store> to assign values to these new elements.
623
624=cut
625*/
626
79072805 627void
864dbfa3 628Perl_av_unshift(pTHX_ register AV *av, register I32 num)
79072805 629{
27da23d5 630 dVAR;
79072805 631 register I32 i;
93965878 632 MAGIC* mg;
79072805 633
7918f24d 634 PERL_ARGS_ASSERT_AV_UNSHIFT;
2fed2a1b 635 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 636
43fcc5d2 637 if (SvREADONLY(av))
6ad8f254 638 Perl_croak_no_modify(aTHX);
93965878 639
ad64d0ec 640 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
046b0c7d
NC
641 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, "UNSHIFT",
642 G_DISCARD | G_UNDEF_FILL, num);
93965878
NIS
643 return;
644 }
645
d19c0e07
MJD
646 if (num <= 0)
647 return;
49beac48
CS
648 if (!AvREAL(av) && AvREIFY(av))
649 av_reify(av);
a0d0e21e
LW
650 i = AvARRAY(av) - AvALLOC(av);
651 if (i) {
652 if (i > num)
653 i = num;
654 num -= i;
655
656 AvMAX(av) += i;
93965878 657 AvFILLp(av) += i;
9c6bc640 658 AvARRAY(av) = AvARRAY(av) - i;
a0d0e21e 659 }
d2719217 660 if (num) {
a3b680e6 661 register SV **ary;
c86f7df5 662 const I32 i = AvFILLp(av);
e2b534e7 663 /* Create extra elements */
c86f7df5 664 const I32 slide = i > 0 ? i : 0;
e2b534e7 665 num += slide;
67a38de0 666 av_extend(av, i + num);
93965878 667 AvFILLp(av) += num;
67a38de0
NIS
668 ary = AvARRAY(av);
669 Move(ary, ary + num, i + 1, SV*);
670 do {
3280af22 671 ary[--num] = &PL_sv_undef;
67a38de0 672 } while (num);
e2b534e7
BT
673 /* Make extra elements into a buffer */
674 AvMAX(av) -= slide;
675 AvFILLp(av) -= slide;
9c6bc640 676 AvARRAY(av) = AvARRAY(av) + slide;
79072805
LW
677 }
678}
679
cb50131a
CB
680/*
681=for apidoc av_shift
682
6ae70e43
CJ
683Shifts an SV off the beginning of the array. Returns C<&PL_sv_undef> if the
684array is empty.
cb50131a
CB
685
686=cut
687*/
688
79072805 689SV *
864dbfa3 690Perl_av_shift(pTHX_ register AV *av)
79072805 691{
27da23d5 692 dVAR;
79072805 693 SV *retval;
93965878 694 MAGIC* mg;
79072805 695
7918f24d 696 PERL_ARGS_ASSERT_AV_SHIFT;
2fed2a1b 697 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 698
43fcc5d2 699 if (SvREADONLY(av))
6ad8f254 700 Perl_croak_no_modify(aTHX);
ad64d0ec 701 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
046b0c7d 702 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, "SHIFT", 0, 0);
efaf3674
DM
703 if (retval)
704 retval = newSVsv(retval);
93965878
NIS
705 return retval;
706 }
d19c0e07
MJD
707 if (AvFILL(av) < 0)
708 return &PL_sv_undef;
463ee0b2 709 retval = *AvARRAY(av);
a0d0e21e 710 if (AvREAL(av))
3280af22 711 *AvARRAY(av) = &PL_sv_undef;
9c6bc640 712 AvARRAY(av) = AvARRAY(av) + 1;
463ee0b2 713 AvMAX(av)--;
93965878 714 AvFILLp(av)--;
8990e307 715 if (SvSMAGICAL(av))
ad64d0ec 716 mg_set(MUTABLE_SV(av));
79072805
LW
717 return retval;
718}
719
cb50131a
CB
720/*
721=for apidoc av_len
722
977a499b
GA
723Returns the highest index in the array. The number of elements in the
724array is C<av_len(av) + 1>. Returns -1 if the array is empty.
cb50131a 725
a8676f70
SF
726The Perl equivalent for this is C<$#myarray>.
727
cb50131a
CB
728=cut
729*/
730
79072805 731I32
bb5dd93d 732Perl_av_len(pTHX_ AV *av)
79072805 733{
7918f24d 734 PERL_ARGS_ASSERT_AV_LEN;
2fed2a1b
NC
735 assert(SvTYPE(av) == SVt_PVAV);
736
463ee0b2 737 return AvFILL(av);
79072805
LW
738}
739
f3b76584
SC
740/*
741=for apidoc av_fill
742
977a499b 743Set the highest index in the array to the given number, equivalent to
f3b76584
SC
744Perl's C<$#array = $fill;>.
745
977a499b 746The number of elements in the an array will be C<fill + 1> after
1a3362a5 747av_fill() returns. If the array was previously shorter, then the
977a499b
GA
748additional elements appended are set to C<PL_sv_undef>. If the array
749was longer, then the excess elements are freed. C<av_fill(av, -1)> is
750the same as C<av_clear(av)>.
751
f3b76584
SC
752=cut
753*/
79072805 754void
864dbfa3 755Perl_av_fill(pTHX_ register AV *av, I32 fill)
79072805 756{
27da23d5 757 dVAR;
93965878 758 MAGIC *mg;
ba5d1d60 759
7918f24d 760 PERL_ARGS_ASSERT_AV_FILL;
2fed2a1b 761 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 762
79072805
LW
763 if (fill < 0)
764 fill = -1;
ad64d0ec 765 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
efaf3674
DM
766 SV *arg1 = sv_newmortal();
767 sv_setiv(arg1, (IV)(fill + 1));
046b0c7d
NC
768 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, "STORESIZE", G_DISCARD,
769 1, arg1);
93965878
NIS
770 return;
771 }
463ee0b2 772 if (fill <= AvMAX(av)) {
93965878 773 I32 key = AvFILLp(av);
fabdb6c0 774 SV** const ary = AvARRAY(av);
a0d0e21e
LW
775
776 if (AvREAL(av)) {
777 while (key > fill) {
778 SvREFCNT_dec(ary[key]);
3280af22 779 ary[key--] = &PL_sv_undef;
a0d0e21e
LW
780 }
781 }
782 else {
783 while (key < fill)
3280af22 784 ary[++key] = &PL_sv_undef;
a0d0e21e
LW
785 }
786
93965878 787 AvFILLp(av) = fill;
8990e307 788 if (SvSMAGICAL(av))
ad64d0ec 789 mg_set(MUTABLE_SV(av));
463ee0b2 790 }
a0d0e21e 791 else
3280af22 792 (void)av_store(av,fill,&PL_sv_undef);
79072805 793}
c750a3ec 794
f3b76584
SC
795/*
796=for apidoc av_delete
797
798Deletes the element indexed by C<key> from the array. Returns the
a6214072 799deleted element. If C<flags> equals C<G_DISCARD>, the element is freed
71282cab
SF
800and null is returned. Perl equivalent: C<my $elem = delete($myarray[$idx]);>
801for the non-C<G_DISCARD> version and a void-context C<delete($myarray[$idx]);>
802for the C<G_DISCARD> version.
f3b76584
SC
803
804=cut
805*/
146174a9
CB
806SV *
807Perl_av_delete(pTHX_ AV *av, I32 key, I32 flags)
808{
97aff369 809 dVAR;
146174a9
CB
810 SV *sv;
811
7918f24d 812 PERL_ARGS_ASSERT_AV_DELETE;
2fed2a1b 813 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 814
146174a9 815 if (SvREADONLY(av))
6ad8f254 816 Perl_croak_no_modify(aTHX);
6f12eb6d
MJD
817
818 if (SvRMAGICAL(av)) {
ad64d0ec
NC
819 const MAGIC * const tied_magic
820 = mg_find((const SV *)av, PERL_MAGIC_tied);
821 if ((tied_magic || mg_find((const SV *)av, PERL_MAGIC_regdata))) {
6f12eb6d 822 /* Handle negative array indices 20020222 MJD */
35a4481c 823 SV **svp;
6f12eb6d
MJD
824 if (key < 0) {
825 unsigned adjust_index = 1;
826 if (tied_magic) {
823a54a3 827 SV * const * const negative_indices_glob =
ad64d0ec 828 hv_fetch(SvSTASH(SvRV(SvTIED_obj(MUTABLE_SV(av),
6f12eb6d
MJD
829 tied_magic))),
830 NEGATIVE_INDICES_VAR, 16, 0);
831 if (negative_indices_glob
832 && SvTRUE(GvSV(*negative_indices_glob)))
833 adjust_index = 0;
834 }
835 if (adjust_index) {
836 key += AvFILL(av) + 1;
837 if (key < 0)
fabdb6c0 838 return NULL;
6f12eb6d
MJD
839 }
840 }
841 svp = av_fetch(av, key, TRUE);
842 if (svp) {
843 sv = *svp;
844 mg_clear(sv);
845 if (mg_find(sv, PERL_MAGIC_tiedelem)) {
846 sv_unmagic(sv, PERL_MAGIC_tiedelem); /* No longer an element */
847 return sv;
848 }
fabdb6c0 849 return NULL;
6f12eb6d
MJD
850 }
851 }
852 }
853
146174a9
CB
854 if (key < 0) {
855 key += AvFILL(av) + 1;
856 if (key < 0)
fabdb6c0 857 return NULL;
146174a9 858 }
6f12eb6d 859
146174a9 860 if (key > AvFILLp(av))
fabdb6c0 861 return NULL;
146174a9 862 else {
a6214072
DM
863 if (!AvREAL(av) && AvREIFY(av))
864 av_reify(av);
146174a9
CB
865 sv = AvARRAY(av)[key];
866 if (key == AvFILLp(av)) {
d9c63288 867 AvARRAY(av)[key] = &PL_sv_undef;
146174a9
CB
868 do {
869 AvFILLp(av)--;
870 } while (--key >= 0 && AvARRAY(av)[key] == &PL_sv_undef);
871 }
872 else
873 AvARRAY(av)[key] = &PL_sv_undef;
874 if (SvSMAGICAL(av))
ad64d0ec 875 mg_set(MUTABLE_SV(av));
146174a9
CB
876 }
877 if (flags & G_DISCARD) {
878 SvREFCNT_dec(sv);
fabdb6c0 879 sv = NULL;
146174a9 880 }
fdb3bdd0 881 else if (AvREAL(av))
2c8ddff3 882 sv = sv_2mortal(sv);
146174a9
CB
883 return sv;
884}
885
886/*
f3b76584
SC
887=for apidoc av_exists
888
889Returns true if the element indexed by C<key> has been initialized.
146174a9 890
f3b76584
SC
891This relies on the fact that uninitialized array elements are set to
892C<&PL_sv_undef>.
893
b7ff7ff2
SF
894Perl equivalent: C<exists($myarray[$key])>.
895
f3b76584
SC
896=cut
897*/
146174a9
CB
898bool
899Perl_av_exists(pTHX_ AV *av, I32 key)
900{
97aff369 901 dVAR;
7918f24d 902 PERL_ARGS_ASSERT_AV_EXISTS;
2fed2a1b 903 assert(SvTYPE(av) == SVt_PVAV);
6f12eb6d
MJD
904
905 if (SvRMAGICAL(av)) {
ad64d0ec
NC
906 const MAGIC * const tied_magic
907 = mg_find((const SV *)av, PERL_MAGIC_tied);
908 if (tied_magic || mg_find((const SV *)av, PERL_MAGIC_regdata)) {
fabdb6c0 909 SV * const sv = sv_newmortal();
6f12eb6d
MJD
910 MAGIC *mg;
911 /* Handle negative array indices 20020222 MJD */
912 if (key < 0) {
913 unsigned adjust_index = 1;
914 if (tied_magic) {
823a54a3 915 SV * const * const negative_indices_glob =
ad64d0ec 916 hv_fetch(SvSTASH(SvRV(SvTIED_obj(MUTABLE_SV(av),
6f12eb6d
MJD
917 tied_magic))),
918 NEGATIVE_INDICES_VAR, 16, 0);
919 if (negative_indices_glob
920 && SvTRUE(GvSV(*negative_indices_glob)))
921 adjust_index = 0;
922 }
923 if (adjust_index) {
924 key += AvFILL(av) + 1;
925 if (key < 0)
926 return FALSE;
927 }
928 }
929
ad64d0ec 930 mg_copy(MUTABLE_SV(av), sv, 0, key);
6f12eb6d
MJD
931 mg = mg_find(sv, PERL_MAGIC_tiedelem);
932 if (mg) {
933 magic_existspack(sv, mg);
f2338a2e 934 return cBOOL(SvTRUE(sv));
6f12eb6d
MJD
935 }
936
937 }
938 }
939
146174a9
CB
940 if (key < 0) {
941 key += AvFILL(av) + 1;
942 if (key < 0)
943 return FALSE;
944 }
6f12eb6d 945
146174a9
CB
946 if (key <= AvFILLp(av) && AvARRAY(av)[key] != &PL_sv_undef
947 && AvARRAY(av)[key])
948 {
949 return TRUE;
950 }
951 else
952 return FALSE;
953}
66610fdd 954
c33269f7 955static MAGIC *
878d132a 956S_get_aux_mg(pTHX_ AV *av) {
a3874608 957 dVAR;
ba5d1d60
GA
958 MAGIC *mg;
959
7918f24d 960 PERL_ARGS_ASSERT_GET_AUX_MG;
2fed2a1b 961 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 962
ad64d0ec 963 mg = mg_find((const SV *)av, PERL_MAGIC_arylen_p);
a3874608
NC
964
965 if (!mg) {
ad64d0ec
NC
966 mg = sv_magicext(MUTABLE_SV(av), 0, PERL_MAGIC_arylen_p,
967 &PL_vtbl_arylen_p, 0, 0);
c82c7adc 968 assert(mg);
a3874608
NC
969 /* sv_magicext won't set this for us because we pass in a NULL obj */
970 mg->mg_flags |= MGf_REFCOUNTED;
971 }
878d132a
NC
972 return mg;
973}
974
975SV **
976Perl_av_arylen_p(pTHX_ AV *av) {
977 MAGIC *const mg = get_aux_mg(av);
7918f24d
NC
978
979 PERL_ARGS_ASSERT_AV_ARYLEN_P;
2fed2a1b 980 assert(SvTYPE(av) == SVt_PVAV);
7918f24d 981
a3874608
NC
982 return &(mg->mg_obj);
983}
984
453d94a9 985IV *
878d132a
NC
986Perl_av_iter_p(pTHX_ AV *av) {
987 MAGIC *const mg = get_aux_mg(av);
7918f24d
NC
988
989 PERL_ARGS_ASSERT_AV_ITER_P;
2fed2a1b 990 assert(SvTYPE(av) == SVt_PVAV);
7918f24d 991
453d94a9 992#if IVSIZE == I32SIZE
20bff64c 993 return (IV *)&(mg->mg_len);
453d94a9
NC
994#else
995 if (!mg->mg_ptr) {
156d2b43 996 IV *temp;
453d94a9 997 mg->mg_len = IVSIZE;
156d2b43
NC
998 Newxz(temp, 1, IV);
999 mg->mg_ptr = (char *) temp;
453d94a9
NC
1000 }
1001 return (IV *)mg->mg_ptr;
1002#endif
878d132a
NC
1003}
1004
66610fdd
RGS
1005/*
1006 * Local variables:
1007 * c-indentation-style: bsd
1008 * c-basic-offset: 4
1009 * indent-tabs-mode: t
1010 * End:
1011 *
37442d52
RGS
1012 * ex: set ts=8 sts=4 sw=4 noet:
1013 */