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