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