This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
charnames.t: Fix test that passed whether or not it should
[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)) {
89c14e2e 365 const MAGIC* const mg = SvMAGIC(av);
3280af22 366 if (val != &PL_sv_undef) {
ad64d0ec 367 sv_magic(val, MUTABLE_SV(av), toLOWER(mg->mg_type), 0, key);
a0d0e21e 368 }
89c14e2e 369 if (PL_delaymagic && mg->mg_type == PERL_MAGIC_isa)
354b0578 370 PL_delaymagic |= DM_ARRAY_ISA;
89c14e2e 371 else
ad64d0ec 372 mg_set(MUTABLE_SV(av));
463ee0b2 373 }
79072805
LW
374 return &ary[key];
375}
376
cb50131a 377/*
cb50131a
CB
378=for apidoc av_make
379
380Creates a new AV and populates it with a list of SVs. The SVs are copied
381into the array, so they may be freed after the call to av_make. The new AV
382will have a reference count of 1.
383
775f1d61
SF
384Perl equivalent: C<my @new_array = ($scalar1, $scalar2, $scalar3...);>
385
cb50131a
CB
386=cut
387*/
388
79072805 389AV *
864dbfa3 390Perl_av_make(pTHX_ register I32 size, register SV **strp)
79072805 391{
502c6561 392 register AV * const av = MUTABLE_AV(newSV_type(SVt_PVAV));
a7f5e44d 393 /* sv_upgrade does AvREAL_only() */
7918f24d 394 PERL_ARGS_ASSERT_AV_MAKE;
2fed2a1b
NC
395 assert(SvTYPE(av) == SVt_PVAV);
396
a0288114 397 if (size) { /* "defined" was returning undef for size==0 anyway. */
dd374669
AL
398 register SV** ary;
399 register I32 i;
a02a5408 400 Newx(ary,size,SV*);
573fa4ea 401 AvALLOC(av) = ary;
9c6bc640 402 AvARRAY(av) = ary;
35da51f7 403 AvFILLp(av) = AvMAX(av) = size - 1;
573fa4ea
TB
404 for (i = 0; i < size; i++) {
405 assert (*strp);
2b676593
BB
406
407 /* Don't let sv_setsv swipe, since our source array might
408 have multiple references to the same temp scalar (e.g.
409 from a list slice) */
410
561b68a9 411 ary[i] = newSV(0);
2b676593
BB
412 sv_setsv_flags(ary[i], *strp,
413 SV_GMAGIC|SV_DO_COW_SVSETSV|SV_NOSTEAL);
573fa4ea
TB
414 strp++;
415 }
79072805 416 }
463ee0b2 417 return av;
79072805
LW
418}
419
cb50131a
CB
420/*
421=for apidoc av_clear
422
423Clears an array, making it empty. Does not free the memory used by the
4f540dd3 424array itself. Perl equivalent: C<@myarray = ();>.
cb50131a
CB
425
426=cut
427*/
428
79072805 429void
864dbfa3 430Perl_av_clear(pTHX_ register AV *av)
79072805 431{
97aff369 432 dVAR;
e2d306cb 433 I32 extra;
79072805 434
7918f24d 435 PERL_ARGS_ASSERT_AV_CLEAR;
2fed2a1b
NC
436 assert(SvTYPE(av) == SVt_PVAV);
437
7d55f622 438#ifdef DEBUGGING
9b387841
NC
439 if (SvREFCNT(av) == 0) {
440 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "Attempt to clear deleted array");
7d55f622 441 }
442#endif
a0d0e21e 443
39caa665 444 if (SvREADONLY(av))
6ad8f254 445 Perl_croak_no_modify(aTHX);
39caa665 446
93965878 447 /* Give any tie a chance to cleanup first */
89c14e2e
BB
448 if (SvRMAGICAL(av)) {
449 const MAGIC* const mg = SvMAGIC(av);
b63c7c55 450 if (PL_delaymagic && mg && mg->mg_type == PERL_MAGIC_isa)
354b0578 451 PL_delaymagic |= DM_ARRAY_ISA;
89c14e2e 452 else
ad64d0ec 453 mg_clear(MUTABLE_SV(av));
89c14e2e 454 }
93965878 455
a60c0954
NIS
456 if (AvMAX(av) < 0)
457 return;
458
a0d0e21e 459 if (AvREAL(av)) {
823a54a3 460 SV** const ary = AvARRAY(av);
e2d306cb
AL
461 I32 index = AvFILLp(av) + 1;
462 while (index) {
463 SV * const sv = ary[--index];
6b42d12b 464 /* undef the slot before freeing the value, because a
e2d306cb
AL
465 * destructor might try to modify this array */
466 ary[index] = &PL_sv_undef;
6b42d12b 467 SvREFCNT_dec(sv);
a0d0e21e
LW
468 }
469 }
e2d306cb
AL
470 extra = AvARRAY(av) - AvALLOC(av);
471 if (extra) {
472 AvMAX(av) += extra;
9c6bc640 473 AvARRAY(av) = AvALLOC(av);
79072805 474 }
93965878 475 AvFILLp(av) = -1;
fb73857a 476
79072805
LW
477}
478
cb50131a
CB
479/*
480=for apidoc av_undef
481
482Undefines the array. Frees the memory used by the array itself.
483
484=cut
485*/
486
79072805 487void
864dbfa3 488Perl_av_undef(pTHX_ register AV *av)
79072805 489{
7918f24d 490 PERL_ARGS_ASSERT_AV_UNDEF;
2fed2a1b 491 assert(SvTYPE(av) == SVt_PVAV);
93965878
NIS
492
493 /* Give any tie a chance to cleanup first */
ad64d0ec 494 if (SvTIED_mg((const SV *)av, PERL_MAGIC_tied))
22717f83 495 av_fill(av, -1);
93965878 496
a0d0e21e 497 if (AvREAL(av)) {
a3b680e6 498 register I32 key = AvFILLp(av) + 1;
a0d0e21e
LW
499 while (key)
500 SvREFCNT_dec(AvARRAY(av)[--key]);
501 }
22717f83 502
463ee0b2 503 Safefree(AvALLOC(av));
35da51f7 504 AvALLOC(av) = NULL;
9c6bc640 505 AvARRAY(av) = NULL;
93965878 506 AvMAX(av) = AvFILLp(av) = -1;
22717f83 507
ad64d0ec 508 if(SvRMAGICAL(av)) mg_clear(MUTABLE_SV(av));
79072805
LW
509}
510
cb50131a 511/*
29a861e7
NC
512
513=for apidoc av_create_and_push
514
515Push an SV onto the end of the array, creating the array if necessary.
516A small internal helper function to remove a commonly duplicated idiom.
517
518=cut
519*/
520
521void
522Perl_av_create_and_push(pTHX_ AV **const avp, SV *const val)
523{
7918f24d 524 PERL_ARGS_ASSERT_AV_CREATE_AND_PUSH;
2fed2a1b 525
29a861e7
NC
526 if (!*avp)
527 *avp = newAV();
528 av_push(*avp, val);
529}
530
531/*
cb50131a
CB
532=for apidoc av_push
533
534Pushes an SV onto the end of the array. The array will grow automatically
4f540dd3 535to accommodate the addition. This takes ownership of one reference count.
cb50131a 536
f0b90de1
SF
537Perl equivalent: C<push @myarray, $elem;>.
538
cb50131a
CB
539=cut
540*/
541
a0d0e21e 542void
864dbfa3 543Perl_av_push(pTHX_ register AV *av, SV *val)
93965878 544{
27da23d5 545 dVAR;
93965878 546 MAGIC *mg;
7918f24d
NC
547
548 PERL_ARGS_ASSERT_AV_PUSH;
2fed2a1b 549 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 550
93965878 551 if (SvREADONLY(av))
6ad8f254 552 Perl_croak_no_modify(aTHX);
93965878 553
ad64d0ec 554 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
046b0c7d
NC
555 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, "PUSH", G_DISCARD, 1,
556 val);
93965878
NIS
557 return;
558 }
559 av_store(av,AvFILLp(av)+1,val);
79072805
LW
560}
561
cb50131a
CB
562/*
563=for apidoc av_pop
564
565Pops an SV off the end of the array. Returns C<&PL_sv_undef> if the array
566is empty.
567
f0b90de1
SF
568Perl equivalent: C<pop(@myarray);>
569
cb50131a
CB
570=cut
571*/
572
79072805 573SV *
864dbfa3 574Perl_av_pop(pTHX_ register AV *av)
79072805 575{
27da23d5 576 dVAR;
79072805 577 SV *retval;
93965878 578 MAGIC* mg;
79072805 579
7918f24d 580 PERL_ARGS_ASSERT_AV_POP;
2fed2a1b 581 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 582
43fcc5d2 583 if (SvREADONLY(av))
6ad8f254 584 Perl_croak_no_modify(aTHX);
ad64d0ec 585 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
046b0c7d 586 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, "POP", 0, 0);
efaf3674
DM
587 if (retval)
588 retval = newSVsv(retval);
93965878
NIS
589 return retval;
590 }
d19c0e07
MJD
591 if (AvFILL(av) < 0)
592 return &PL_sv_undef;
93965878 593 retval = AvARRAY(av)[AvFILLp(av)];
3280af22 594 AvARRAY(av)[AvFILLp(av)--] = &PL_sv_undef;
8990e307 595 if (SvSMAGICAL(av))
ad64d0ec 596 mg_set(MUTABLE_SV(av));
79072805
LW
597 return retval;
598}
599
cb50131a 600/*
29a861e7
NC
601
602=for apidoc av_create_and_unshift_one
603
604Unshifts an SV onto the beginning of the array, creating the array if
605necessary.
606A small internal helper function to remove a commonly duplicated idiom.
607
608=cut
609*/
610
611SV **
612Perl_av_create_and_unshift_one(pTHX_ AV **const avp, SV *const val)
613{
7918f24d 614 PERL_ARGS_ASSERT_AV_CREATE_AND_UNSHIFT_ONE;
2fed2a1b 615
29a861e7
NC
616 if (!*avp)
617 *avp = newAV();
618 av_unshift(*avp, 1);
619 return av_store(*avp, 0, val);
620}
621
622/*
cb50131a
CB
623=for apidoc av_unshift
624
625Unshift the given number of C<undef> values onto the beginning of the
626array. The array will grow automatically to accommodate the addition. You
627must then use C<av_store> to assign values to these new elements.
628
f0b90de1
SF
629Perl equivalent: C<unshift @myarray, ( (undef) x $n );>
630
cb50131a
CB
631=cut
632*/
633
79072805 634void
864dbfa3 635Perl_av_unshift(pTHX_ register AV *av, register I32 num)
79072805 636{
27da23d5 637 dVAR;
79072805 638 register I32 i;
93965878 639 MAGIC* mg;
79072805 640
7918f24d 641 PERL_ARGS_ASSERT_AV_UNSHIFT;
2fed2a1b 642 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 643
43fcc5d2 644 if (SvREADONLY(av))
6ad8f254 645 Perl_croak_no_modify(aTHX);
93965878 646
ad64d0ec 647 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
046b0c7d
NC
648 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, "UNSHIFT",
649 G_DISCARD | G_UNDEF_FILL, num);
93965878
NIS
650 return;
651 }
652
d19c0e07
MJD
653 if (num <= 0)
654 return;
49beac48
CS
655 if (!AvREAL(av) && AvREIFY(av))
656 av_reify(av);
a0d0e21e
LW
657 i = AvARRAY(av) - AvALLOC(av);
658 if (i) {
659 if (i > num)
660 i = num;
661 num -= i;
662
663 AvMAX(av) += i;
93965878 664 AvFILLp(av) += i;
9c6bc640 665 AvARRAY(av) = AvARRAY(av) - i;
a0d0e21e 666 }
d2719217 667 if (num) {
a3b680e6 668 register SV **ary;
c86f7df5 669 const I32 i = AvFILLp(av);
e2b534e7 670 /* Create extra elements */
c86f7df5 671 const I32 slide = i > 0 ? i : 0;
e2b534e7 672 num += slide;
67a38de0 673 av_extend(av, i + num);
93965878 674 AvFILLp(av) += num;
67a38de0
NIS
675 ary = AvARRAY(av);
676 Move(ary, ary + num, i + 1, SV*);
677 do {
3280af22 678 ary[--num] = &PL_sv_undef;
67a38de0 679 } while (num);
e2b534e7
BT
680 /* Make extra elements into a buffer */
681 AvMAX(av) -= slide;
682 AvFILLp(av) -= slide;
9c6bc640 683 AvARRAY(av) = AvARRAY(av) + slide;
79072805
LW
684 }
685}
686
cb50131a
CB
687/*
688=for apidoc av_shift
689
4f540dd3
FC
690Shifts an SV off the beginning of the
691array. Returns C<&PL_sv_undef> if the
6ae70e43 692array is empty.
cb50131a 693
f0b90de1
SF
694Perl equivalent: C<shift(@myarray);>
695
cb50131a
CB
696=cut
697*/
698
79072805 699SV *
864dbfa3 700Perl_av_shift(pTHX_ register AV *av)
79072805 701{
27da23d5 702 dVAR;
79072805 703 SV *retval;
93965878 704 MAGIC* mg;
79072805 705
7918f24d 706 PERL_ARGS_ASSERT_AV_SHIFT;
2fed2a1b 707 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 708
43fcc5d2 709 if (SvREADONLY(av))
6ad8f254 710 Perl_croak_no_modify(aTHX);
ad64d0ec 711 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
046b0c7d 712 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, "SHIFT", 0, 0);
efaf3674
DM
713 if (retval)
714 retval = newSVsv(retval);
93965878
NIS
715 return retval;
716 }
d19c0e07
MJD
717 if (AvFILL(av) < 0)
718 return &PL_sv_undef;
463ee0b2 719 retval = *AvARRAY(av);
a0d0e21e 720 if (AvREAL(av))
3280af22 721 *AvARRAY(av) = &PL_sv_undef;
9c6bc640 722 AvARRAY(av) = AvARRAY(av) + 1;
463ee0b2 723 AvMAX(av)--;
93965878 724 AvFILLp(av)--;
8990e307 725 if (SvSMAGICAL(av))
ad64d0ec 726 mg_set(MUTABLE_SV(av));
79072805
LW
727 return retval;
728}
729
cb50131a
CB
730/*
731=for apidoc av_len
732
977a499b
GA
733Returns the highest index in the array. The number of elements in the
734array is C<av_len(av) + 1>. Returns -1 if the array is empty.
cb50131a 735
a8676f70
SF
736The Perl equivalent for this is C<$#myarray>.
737
cb50131a
CB
738=cut
739*/
740
79072805 741I32
bb5dd93d 742Perl_av_len(pTHX_ AV *av)
79072805 743{
7918f24d 744 PERL_ARGS_ASSERT_AV_LEN;
2fed2a1b
NC
745 assert(SvTYPE(av) == SVt_PVAV);
746
463ee0b2 747 return AvFILL(av);
79072805
LW
748}
749
f3b76584
SC
750/*
751=for apidoc av_fill
752
977a499b 753Set the highest index in the array to the given number, equivalent to
f3b76584
SC
754Perl's C<$#array = $fill;>.
755
977a499b 756The number of elements in the an array will be C<fill + 1> after
1a3362a5 757av_fill() returns. If the array was previously shorter, then the
977a499b
GA
758additional elements appended are set to C<PL_sv_undef>. If the array
759was longer, then the excess elements are freed. C<av_fill(av, -1)> is
760the same as C<av_clear(av)>.
761
f3b76584
SC
762=cut
763*/
79072805 764void
864dbfa3 765Perl_av_fill(pTHX_ register AV *av, I32 fill)
79072805 766{
27da23d5 767 dVAR;
93965878 768 MAGIC *mg;
ba5d1d60 769
7918f24d 770 PERL_ARGS_ASSERT_AV_FILL;
2fed2a1b 771 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 772
79072805
LW
773 if (fill < 0)
774 fill = -1;
ad64d0ec 775 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
efaf3674
DM
776 SV *arg1 = sv_newmortal();
777 sv_setiv(arg1, (IV)(fill + 1));
046b0c7d
NC
778 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, "STORESIZE", G_DISCARD,
779 1, arg1);
93965878
NIS
780 return;
781 }
463ee0b2 782 if (fill <= AvMAX(av)) {
93965878 783 I32 key = AvFILLp(av);
fabdb6c0 784 SV** const ary = AvARRAY(av);
a0d0e21e
LW
785
786 if (AvREAL(av)) {
787 while (key > fill) {
788 SvREFCNT_dec(ary[key]);
3280af22 789 ary[key--] = &PL_sv_undef;
a0d0e21e
LW
790 }
791 }
792 else {
793 while (key < fill)
3280af22 794 ary[++key] = &PL_sv_undef;
a0d0e21e
LW
795 }
796
93965878 797 AvFILLp(av) = fill;
8990e307 798 if (SvSMAGICAL(av))
ad64d0ec 799 mg_set(MUTABLE_SV(av));
463ee0b2 800 }
a0d0e21e 801 else
3280af22 802 (void)av_store(av,fill,&PL_sv_undef);
79072805 803}
c750a3ec 804
f3b76584
SC
805/*
806=for apidoc av_delete
807
3025a2e4
CS
808Deletes the element indexed by C<key> from the array, makes the element mortal,
809and returns it. If C<flags> equals C<G_DISCARD>, the element is freed and null
810is returned. Perl equivalent: C<my $elem = delete($myarray[$idx]);> for the
811non-C<G_DISCARD> version and a void-context C<delete($myarray[$idx]);> for the
812C<G_DISCARD> version.
f3b76584
SC
813
814=cut
815*/
146174a9
CB
816SV *
817Perl_av_delete(pTHX_ AV *av, I32 key, I32 flags)
818{
97aff369 819 dVAR;
146174a9
CB
820 SV *sv;
821
7918f24d 822 PERL_ARGS_ASSERT_AV_DELETE;
2fed2a1b 823 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 824
146174a9 825 if (SvREADONLY(av))
6ad8f254 826 Perl_croak_no_modify(aTHX);
6f12eb6d
MJD
827
828 if (SvRMAGICAL(av)) {
ad64d0ec
NC
829 const MAGIC * const tied_magic
830 = mg_find((const SV *)av, PERL_MAGIC_tied);
831 if ((tied_magic || mg_find((const SV *)av, PERL_MAGIC_regdata))) {
6f12eb6d 832 /* Handle negative array indices 20020222 MJD */
35a4481c 833 SV **svp;
6f12eb6d
MJD
834 if (key < 0) {
835 unsigned adjust_index = 1;
836 if (tied_magic) {
823a54a3 837 SV * const * const negative_indices_glob =
ad64d0ec 838 hv_fetch(SvSTASH(SvRV(SvTIED_obj(MUTABLE_SV(av),
6f12eb6d
MJD
839 tied_magic))),
840 NEGATIVE_INDICES_VAR, 16, 0);
841 if (negative_indices_glob
842 && SvTRUE(GvSV(*negative_indices_glob)))
843 adjust_index = 0;
844 }
845 if (adjust_index) {
846 key += AvFILL(av) + 1;
847 if (key < 0)
fabdb6c0 848 return NULL;
6f12eb6d
MJD
849 }
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)) {
d9c63288 877 AvARRAY(av)[key] = &PL_sv_undef;
146174a9
CB
878 do {
879 AvFILLp(av)--;
880 } while (--key >= 0 && AvARRAY(av)[key] == &PL_sv_undef);
881 }
882 else
883 AvARRAY(av)[key] = &PL_sv_undef;
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
SC
901This relies on the fact that uninitialized array elements are set to
902C<&PL_sv_undef>.
903
b7ff7ff2
SF
904Perl equivalent: C<exists($myarray[$key])>.
905
f3b76584
SC
906=cut
907*/
146174a9
CB
908bool
909Perl_av_exists(pTHX_ AV *av, I32 key)
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) {
fabdb6c0 921 SV * const sv = sv_newmortal();
6f12eb6d
MJD
922 MAGIC *mg;
923 /* Handle negative array indices 20020222 MJD */
924 if (key < 0) {
925 unsigned adjust_index = 1;
926 if (tied_magic) {
823a54a3 927 SV * const * const negative_indices_glob =
ad64d0ec 928 hv_fetch(SvSTASH(SvRV(SvTIED_obj(MUTABLE_SV(av),
6f12eb6d
MJD
929 tied_magic))),
930 NEGATIVE_INDICES_VAR, 16, 0);
931 if (negative_indices_glob
932 && SvTRUE(GvSV(*negative_indices_glob)))
933 adjust_index = 0;
934 }
935 if (adjust_index) {
936 key += AvFILL(av) + 1;
937 if (key < 0)
938 return FALSE;
54a4274e
PM
939 else
940 return TRUE;
6f12eb6d
MJD
941 }
942 }
943
54a4274e
PM
944 if(key >= 0 && regdata_magic) {
945 if (key <= AvFILL(av))
946 return TRUE;
947 else
948 return FALSE;
949 }
950
ad64d0ec 951 mg_copy(MUTABLE_SV(av), sv, 0, key);
6f12eb6d
MJD
952 mg = mg_find(sv, PERL_MAGIC_tiedelem);
953 if (mg) {
954 magic_existspack(sv, mg);
f2338a2e 955 return cBOOL(SvTRUE(sv));
6f12eb6d
MJD
956 }
957
958 }
959 }
960
146174a9
CB
961 if (key < 0) {
962 key += AvFILL(av) + 1;
963 if (key < 0)
964 return FALSE;
965 }
6f12eb6d 966
146174a9
CB
967 if (key <= AvFILLp(av) && AvARRAY(av)[key] != &PL_sv_undef
968 && AvARRAY(av)[key])
969 {
970 return TRUE;
971 }
972 else
973 return FALSE;
974}
66610fdd 975
c33269f7 976static MAGIC *
878d132a 977S_get_aux_mg(pTHX_ AV *av) {
a3874608 978 dVAR;
ba5d1d60
GA
979 MAGIC *mg;
980
7918f24d 981 PERL_ARGS_ASSERT_GET_AUX_MG;
2fed2a1b 982 assert(SvTYPE(av) == SVt_PVAV);
ba5d1d60 983
ad64d0ec 984 mg = mg_find((const SV *)av, PERL_MAGIC_arylen_p);
a3874608
NC
985
986 if (!mg) {
ad64d0ec
NC
987 mg = sv_magicext(MUTABLE_SV(av), 0, PERL_MAGIC_arylen_p,
988 &PL_vtbl_arylen_p, 0, 0);
c82c7adc 989 assert(mg);
a3874608
NC
990 /* sv_magicext won't set this for us because we pass in a NULL obj */
991 mg->mg_flags |= MGf_REFCOUNTED;
992 }
878d132a
NC
993 return mg;
994}
995
996SV **
997Perl_av_arylen_p(pTHX_ AV *av) {
998 MAGIC *const mg = get_aux_mg(av);
7918f24d
NC
999
1000 PERL_ARGS_ASSERT_AV_ARYLEN_P;
2fed2a1b 1001 assert(SvTYPE(av) == SVt_PVAV);
7918f24d 1002
a3874608
NC
1003 return &(mg->mg_obj);
1004}
1005
453d94a9 1006IV *
878d132a
NC
1007Perl_av_iter_p(pTHX_ AV *av) {
1008 MAGIC *const mg = get_aux_mg(av);
7918f24d
NC
1009
1010 PERL_ARGS_ASSERT_AV_ITER_P;
2fed2a1b 1011 assert(SvTYPE(av) == SVt_PVAV);
7918f24d 1012
453d94a9 1013#if IVSIZE == I32SIZE
20bff64c 1014 return (IV *)&(mg->mg_len);
453d94a9
NC
1015#else
1016 if (!mg->mg_ptr) {
156d2b43 1017 IV *temp;
453d94a9 1018 mg->mg_len = IVSIZE;
156d2b43
NC
1019 Newxz(temp, 1, IV);
1020 mg->mg_ptr = (char *) temp;
453d94a9
NC
1021 }
1022 return (IV *)mg->mg_ptr;
1023#endif
878d132a
NC
1024}
1025
66610fdd
RGS
1026/*
1027 * Local variables:
1028 * c-indentation-style: bsd
1029 * c-basic-offset: 4
1030 * indent-tabs-mode: t
1031 * End:
1032 *
37442d52
RGS
1033 * ex: set ts=8 sts=4 sw=4 noet:
1034 */