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