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