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