This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
New [PATCH] use 5.006; use 5.10.0
[perl5.git] / av.c
CommitLineData
a0d0e21e 1/* av.c
79072805 2 *
4bb101f2 3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
54ca4ee7 4 * 2000, 2001, 2002, 2003, 2004, 2005, 2006, 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/*
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
79072805
LW
14 */
15
ccfc67b7
JH
16/*
17=head1 Array Manipulation Functions
18*/
19
79072805 20#include "EXTERN.h"
864dbfa3 21#define PERL_IN_AV_C
79072805
LW
22#include "perl.h"
23
fb73857a 24void
864dbfa3 25Perl_av_reify(pTHX_ AV *av)
a0d0e21e 26{
97aff369 27 dVAR;
a0d0e21e 28 I32 key;
fb73857a 29
ba5d1d60
GA
30 assert(av);
31
3c78fafa
GS
32 if (AvREAL(av))
33 return;
93965878 34#ifdef DEBUGGING
14befaf4 35 if (SvTIED_mg((SV*)av, PERL_MAGIC_tied) && ckWARN_d(WARN_DEBUGGING))
9014280d 36 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING), "av_reify called on tied array");
93965878 37#endif
a0d0e21e 38 key = AvMAX(av) + 1;
93965878 39 while (key > AvFILLp(av) + 1)
3280af22 40 AvARRAY(av)[--key] = &PL_sv_undef;
a0d0e21e 41 while (key) {
4373e329 42 SV * const sv = AvARRAY(av)[--key];
a0d0e21e 43 assert(sv);
411caa50 44 if (sv != &PL_sv_undef)
e2d306cb 45 SvREFCNT_inc_simple_void_NN(sv);
a0d0e21e 46 }
29de640a
CS
47 key = AvARRAY(av) - AvALLOC(av);
48 while (key)
3280af22 49 AvALLOC(av)[--key] = &PL_sv_undef;
62b1ebc2 50 AvREIFY_off(av);
a0d0e21e
LW
51 AvREAL_on(av);
52}
53
cb50131a
CB
54/*
55=for apidoc av_extend
56
57Pre-extend an array. The C<key> is the index to which the array should be
58extended.
59
60=cut
61*/
62
a0d0e21e 63void
864dbfa3 64Perl_av_extend(pTHX_ AV *av, I32 key)
a0d0e21e 65{
97aff369 66 dVAR;
7a5b473e
AL
67 MAGIC *mg;
68
ba5d1d60
GA
69 assert(av);
70
7a5b473e 71 mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied);
823a54a3 72 if (mg) {
93965878
NIS
73 dSP;
74 ENTER;
75 SAVETMPS;
e788e7d3 76 PUSHSTACKi(PERLSI_MAGIC);
924508f0
GS
77 PUSHMARK(SP);
78 EXTEND(SP,2);
33c27489 79 PUSHs(SvTIED_obj((SV*)av, mg));
a60c0954 80 PUSHs(sv_2mortal(newSViv(key+1)));
93965878 81 PUTBACK;
864dbfa3 82 call_method("EXTEND", G_SCALAR|G_DISCARD);
d3acc0f7 83 POPSTACK;
93965878
NIS
84 FREETMPS;
85 LEAVE;
86 return;
87 }
a0d0e21e
LW
88 if (key > AvMAX(av)) {
89 SV** ary;
90 I32 tmp;
91 I32 newmax;
92
93 if (AvALLOC(av) != AvARRAY(av)) {
93965878 94 ary = AvALLOC(av) + AvFILLp(av) + 1;
a0d0e21e 95 tmp = AvARRAY(av) - AvALLOC(av);
93965878 96 Move(AvARRAY(av), AvALLOC(av), AvFILLp(av)+1, SV*);
a0d0e21e 97 AvMAX(av) += tmp;
9c6bc640 98 AvARRAY(av) = AvALLOC(av);
a0d0e21e
LW
99 if (AvREAL(av)) {
100 while (tmp)
3280af22 101 ary[--tmp] = &PL_sv_undef;
a0d0e21e 102 }
a0d0e21e
LW
103 if (key > AvMAX(av) - 10) {
104 newmax = key + AvMAX(av);
105 goto resize;
106 }
107 }
108 else {
2b573ace
JH
109#ifdef PERL_MALLOC_WRAP
110 static const char oom_array_extend[] =
111 "Out of memory during array extend"; /* Duplicated in pp_hot.c */
112#endif
113
a0d0e21e 114 if (AvALLOC(av)) {
516a5887 115#if !defined(STRANGE_MALLOC) && !defined(MYMALLOC)
c1f7b11a
SB
116 MEM_SIZE bytes;
117 IV itmp;
c07a80fd 118#endif
4633a7c4 119
7bab3ede 120#ifdef MYMALLOC
8d6dde3e
IZ
121 newmax = malloced_size((void*)AvALLOC(av))/sizeof(SV*) - 1;
122
123 if (key <= newmax)
124 goto resized;
125#endif
a0d0e21e
LW
126 newmax = key + AvMAX(av) / 5;
127 resize:
2b573ace 128 MEM_WRAP_CHECK_1(newmax+1, SV*, oom_array_extend);
8d6dde3e 129#if defined(STRANGE_MALLOC) || defined(MYMALLOC)
a0d0e21e 130 Renew(AvALLOC(av),newmax+1, SV*);
4633a7c4
LW
131#else
132 bytes = (newmax + 1) * sizeof(SV*);
133#define MALLOC_OVERHEAD 16
c1f7b11a 134 itmp = MALLOC_OVERHEAD;
eb160463 135 while ((MEM_SIZE)(itmp - MALLOC_OVERHEAD) < bytes)
c1f7b11a
SB
136 itmp += itmp;
137 itmp -= MALLOC_OVERHEAD;
138 itmp /= sizeof(SV*);
139 assert(itmp > newmax);
140 newmax = itmp - 1;
141 assert(newmax >= AvMAX(av));
a02a5408 142 Newx(ary, newmax+1, SV*);
4633a7c4 143 Copy(AvALLOC(av), ary, AvMAX(av)+1, SV*);
fba3b22e
MB
144 if (AvMAX(av) > 64)
145 offer_nice_chunk(AvALLOC(av), (AvMAX(av)+1) * sizeof(SV*));
4633a7c4
LW
146 else
147 Safefree(AvALLOC(av));
148 AvALLOC(av) = ary;
149#endif
7bab3ede 150#ifdef MYMALLOC
8d6dde3e 151 resized:
9c5ffd7c 152#endif
a0d0e21e
LW
153 ary = AvALLOC(av) + AvMAX(av) + 1;
154 tmp = newmax - AvMAX(av);
3280af22
NIS
155 if (av == PL_curstack) { /* Oops, grew stack (via av_store()?) */
156 PL_stack_sp = AvALLOC(av) + (PL_stack_sp - PL_stack_base);
157 PL_stack_base = AvALLOC(av);
158 PL_stack_max = PL_stack_base + newmax;
a0d0e21e
LW
159 }
160 }
161 else {
8d6dde3e 162 newmax = key < 3 ? 3 : key;
2b573ace 163 MEM_WRAP_CHECK_1(newmax+1, SV*, oom_array_extend);
a02a5408 164 Newx(AvALLOC(av), newmax+1, SV*);
a0d0e21e
LW
165 ary = AvALLOC(av) + 1;
166 tmp = newmax;
3280af22 167 AvALLOC(av)[0] = &PL_sv_undef; /* For the stacks */
a0d0e21e
LW
168 }
169 if (AvREAL(av)) {
170 while (tmp)
3280af22 171 ary[--tmp] = &PL_sv_undef;
a0d0e21e
LW
172 }
173
9c6bc640 174 AvARRAY(av) = AvALLOC(av);
a0d0e21e
LW
175 AvMAX(av) = newmax;
176 }
177 }
178}
179
cb50131a
CB
180/*
181=for apidoc av_fetch
182
183Returns the SV at the specified index in the array. The C<key> is the
184index. If C<lval> is set then the fetch will be part of a store. Check
185that the return value is non-null before dereferencing it to a C<SV*>.
186
187See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
188more information on how to use this function on tied arrays.
189
190=cut
191*/
192
79072805 193SV**
864dbfa3 194Perl_av_fetch(pTHX_ register AV *av, I32 key, I32 lval)
79072805 195{
97aff369 196 dVAR;
79072805 197
ba5d1d60 198 assert(av);
a0d0e21e 199
6f12eb6d 200 if (SvRMAGICAL(av)) {
35a4481c 201 const MAGIC * const tied_magic = mg_find((SV*)av, PERL_MAGIC_tied);
6f12eb6d 202 if (tied_magic || mg_find((SV*)av, PERL_MAGIC_regdata)) {
e2d306cb
AL
203 SV *sv;
204 if (key < 0) {
205 I32 adjust_index = 1;
206 if (tied_magic) {
207 /* Handle negative array indices 20020222 MJD */
208 SV * const * const negative_indices_glob =
209 hv_fetch(SvSTASH(SvRV(SvTIED_obj((SV *)av, tied_magic))),
210 NEGATIVE_INDICES_VAR, 16, 0);
211
212 if (negative_indices_glob && SvTRUE(GvSV(*negative_indices_glob)))
213 adjust_index = 0;
214 }
6f12eb6d 215
e2d306cb
AL
216 if (adjust_index) {
217 key += AvFILL(av) + 1;
218 if (key < 0)
219 return NULL;
220 }
221 }
6f12eb6d
MJD
222
223 sv = sv_newmortal();
dd28f7bb
DM
224 sv_upgrade(sv, SVt_PVLV);
225 mg_copy((SV*)av, sv, 0, key);
226 LvTYPE(sv) = 't';
227 LvTARG(sv) = sv; /* fake (SV**) */
228 return &(LvTARG(sv));
6f12eb6d
MJD
229 }
230 }
231
93965878
NIS
232 if (key < 0) {
233 key += AvFILL(av) + 1;
234 if (key < 0)
e2d306cb 235 return NULL;
93965878
NIS
236 }
237
93965878 238 if (key > AvFILLp(av)) {
a0d0e21e 239 if (!lval)
e2d306cb
AL
240 return NULL;
241 return av_store(av,key,newSV(0));
79072805 242 }
3280af22 243 if (AvARRAY(av)[key] == &PL_sv_undef) {
4dbf4341 244 emptyness:
e2d306cb
AL
245 if (lval)
246 return av_store(av,key,newSV(0));
247 return NULL;
79072805 248 }
4dbf4341 249 else if (AvREIFY(av)
250 && (!AvARRAY(av)[key] /* eg. @_ could have freed elts */
0565a181 251 || SvIS_FREED(AvARRAY(av)[key]))) {
3280af22 252 AvARRAY(av)[key] = &PL_sv_undef; /* 1/2 reify */
4dbf4341 253 goto emptyness;
254 }
463ee0b2 255 return &AvARRAY(av)[key];
79072805
LW
256}
257
cb50131a
CB
258/*
259=for apidoc av_store
260
261Stores an SV in an array. The array index is specified as C<key>. The
262return value will be NULL if the operation failed or if the value did not
263need to be actually stored within the array (as in the case of tied
264arrays). Otherwise it can be dereferenced to get the original C<SV*>. Note
265that the caller is responsible for suitably incrementing the reference
266count of C<val> before the call, and decrementing it if the function
267returned NULL.
268
269See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
270more information on how to use this function on tied arrays.
271
272=cut
273*/
274
79072805 275SV**
864dbfa3 276Perl_av_store(pTHX_ register AV *av, I32 key, SV *val)
79072805 277{
97aff369 278 dVAR;
79072805
LW
279 SV** ary;
280
ba5d1d60
GA
281 assert(av);
282
725ac12f
NC
283 /* S_regclass relies on being able to pass in a NULL sv
284 (unicode_alternate may be NULL).
285 */
286
43fcc5d2 287 if (!val)
3280af22 288 val = &PL_sv_undef;
463ee0b2 289
6f12eb6d 290 if (SvRMAGICAL(av)) {
35a4481c 291 const MAGIC * const tied_magic = mg_find((SV*)av, PERL_MAGIC_tied);
6f12eb6d
MJD
292 if (tied_magic) {
293 /* Handle negative array indices 20020222 MJD */
294 if (key < 0) {
e2d306cb 295 bool adjust_index = 1;
823a54a3 296 SV * const * const negative_indices_glob =
6f12eb6d
MJD
297 hv_fetch(SvSTASH(SvRV(SvTIED_obj((SV *)av,
298 tied_magic))),
299 NEGATIVE_INDICES_VAR, 16, 0);
300 if (negative_indices_glob
301 && SvTRUE(GvSV(*negative_indices_glob)))
302 adjust_index = 0;
303 if (adjust_index) {
304 key += AvFILL(av) + 1;
305 if (key < 0)
306 return 0;
307 }
308 }
309 if (val != &PL_sv_undef) {
310 mg_copy((SV*)av, val, 0, key);
311 }
e2d306cb 312 return NULL;
6f12eb6d
MJD
313 }
314 }
315
316
a0d0e21e
LW
317 if (key < 0) {
318 key += AvFILL(av) + 1;
319 if (key < 0)
e2d306cb 320 return NULL;
79072805 321 }
93965878 322
43fcc5d2 323 if (SvREADONLY(av) && key >= AvFILL(av))
cea2e8a9 324 Perl_croak(aTHX_ PL_no_modify);
93965878 325
49beac48 326 if (!AvREAL(av) && AvREIFY(av))
a0d0e21e 327 av_reify(av);
a0d0e21e
LW
328 if (key > AvMAX(av))
329 av_extend(av,key);
463ee0b2 330 ary = AvARRAY(av);
93965878 331 if (AvFILLp(av) < key) {
a0d0e21e 332 if (!AvREAL(av)) {
3280af22
NIS
333 if (av == PL_curstack && key > PL_stack_sp - PL_stack_base)
334 PL_stack_sp = PL_stack_base + key; /* XPUSH in disguise */
e2d306cb 335 do {
3280af22 336 ary[++AvFILLp(av)] = &PL_sv_undef;
e2d306cb 337 } while (AvFILLp(av) < key);
79072805 338 }
93965878 339 AvFILLp(av) = key;
79072805 340 }
a0d0e21e
LW
341 else if (AvREAL(av))
342 SvREFCNT_dec(ary[key]);
79072805 343 ary[key] = val;
8990e307 344 if (SvSMAGICAL(av)) {
89c14e2e 345 const MAGIC* const mg = SvMAGIC(av);
3280af22 346 if (val != &PL_sv_undef) {
a0d0e21e
LW
347 sv_magic(val, (SV*)av, toLOWER(mg->mg_type), 0, key);
348 }
89c14e2e
BB
349 if (PL_delaymagic && mg->mg_type == PERL_MAGIC_isa)
350 PL_delaymagic |= DM_ARRAY;
351 else
352 mg_set((SV*)av);
463ee0b2 353 }
79072805
LW
354 return &ary[key];
355}
356
cb50131a
CB
357/*
358=for apidoc newAV
359
360Creates a new AV. The reference count is set to 1.
361
362=cut
363*/
364
79072805 365AV *
864dbfa3 366Perl_newAV(pTHX)
79072805 367{
b9f83d2f 368 register AV * const av = (AV*)newSV_type(SVt_PVAV);
a7f5e44d 369 /* sv_upgrade does AvREAL_only() */
463ee0b2 370 AvALLOC(av) = 0;
9c6bc640 371 AvARRAY(av) = NULL;
93965878 372 AvMAX(av) = AvFILLp(av) = -1;
463ee0b2 373 return av;
79072805
LW
374}
375
cb50131a
CB
376/*
377=for apidoc av_make
378
379Creates a new AV and populates it with a list of SVs. The SVs are copied
380into the array, so they may be freed after the call to av_make. The new AV
381will have a reference count of 1.
382
383=cut
384*/
385
79072805 386AV *
864dbfa3 387Perl_av_make(pTHX_ register I32 size, register SV **strp)
79072805 388{
b9f83d2f 389 register AV * const av = (AV*)newSV_type(SVt_PVAV);
a7f5e44d 390 /* sv_upgrade does AvREAL_only() */
a0288114 391 if (size) { /* "defined" was returning undef for size==0 anyway. */
dd374669
AL
392 register SV** ary;
393 register I32 i;
a02a5408 394 Newx(ary,size,SV*);
573fa4ea 395 AvALLOC(av) = ary;
9c6bc640 396 AvARRAY(av) = ary;
35da51f7 397 AvFILLp(av) = AvMAX(av) = size - 1;
573fa4ea
TB
398 for (i = 0; i < size; i++) {
399 assert (*strp);
561b68a9 400 ary[i] = newSV(0);
573fa4ea
TB
401 sv_setsv(ary[i], *strp);
402 strp++;
403 }
79072805 404 }
463ee0b2 405 return av;
79072805
LW
406}
407
cb50131a
CB
408/*
409=for apidoc av_clear
410
411Clears an array, making it empty. Does not free the memory used by the
412array itself.
413
414=cut
415*/
416
79072805 417void
864dbfa3 418Perl_av_clear(pTHX_ register AV *av)
79072805 419{
97aff369 420 dVAR;
e2d306cb 421 I32 extra;
79072805 422
ba5d1d60 423 assert(av);
7d55f622 424#ifdef DEBUGGING
32da55ab 425 if (SvREFCNT(av) == 0 && ckWARN_d(WARN_DEBUGGING)) {
9014280d 426 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING), "Attempt to clear deleted array");
7d55f622 427 }
428#endif
a0d0e21e 429
39caa665 430 if (SvREADONLY(av))
cea2e8a9 431 Perl_croak(aTHX_ PL_no_modify);
39caa665 432
93965878 433 /* Give any tie a chance to cleanup first */
89c14e2e
BB
434 if (SvRMAGICAL(av)) {
435 const MAGIC* const mg = SvMAGIC(av);
436 if (PL_delaymagic && mg->mg_type == PERL_MAGIC_isa)
437 PL_delaymagic |= DM_ARRAY;
438 else
439 mg_clear((SV*)av);
440 }
93965878 441
a60c0954
NIS
442 if (AvMAX(av) < 0)
443 return;
444
a0d0e21e 445 if (AvREAL(av)) {
823a54a3 446 SV** const ary = AvARRAY(av);
e2d306cb
AL
447 I32 index = AvFILLp(av) + 1;
448 while (index) {
449 SV * const sv = ary[--index];
6b42d12b 450 /* undef the slot before freeing the value, because a
e2d306cb
AL
451 * destructor might try to modify this array */
452 ary[index] = &PL_sv_undef;
6b42d12b 453 SvREFCNT_dec(sv);
a0d0e21e
LW
454 }
455 }
e2d306cb
AL
456 extra = AvARRAY(av) - AvALLOC(av);
457 if (extra) {
458 AvMAX(av) += extra;
9c6bc640 459 AvARRAY(av) = AvALLOC(av);
79072805 460 }
93965878 461 AvFILLp(av) = -1;
fb73857a 462
79072805
LW
463}
464
cb50131a
CB
465/*
466=for apidoc av_undef
467
468Undefines the array. Frees the memory used by the array itself.
469
470=cut
471*/
472
79072805 473void
864dbfa3 474Perl_av_undef(pTHX_ register AV *av)
79072805 475{
ba5d1d60 476 assert(av);
93965878
NIS
477
478 /* Give any tie a chance to cleanup first */
14befaf4 479 if (SvTIED_mg((SV*)av, PERL_MAGIC_tied))
22717f83 480 av_fill(av, -1);
93965878 481
a0d0e21e 482 if (AvREAL(av)) {
a3b680e6 483 register I32 key = AvFILLp(av) + 1;
a0d0e21e
LW
484 while (key)
485 SvREFCNT_dec(AvARRAY(av)[--key]);
486 }
22717f83 487
463ee0b2 488 Safefree(AvALLOC(av));
35da51f7 489 AvALLOC(av) = NULL;
9c6bc640 490 AvARRAY(av) = NULL;
93965878 491 AvMAX(av) = AvFILLp(av) = -1;
22717f83
BB
492
493 if(SvRMAGICAL(av)) mg_clear((SV*)av);
79072805
LW
494}
495
cb50131a 496/*
29a861e7
NC
497
498=for apidoc av_create_and_push
499
500Push an SV onto the end of the array, creating the array if necessary.
501A small internal helper function to remove a commonly duplicated idiom.
502
503=cut
504*/
505
506void
507Perl_av_create_and_push(pTHX_ AV **const avp, SV *const val)
508{
509 if (!*avp)
510 *avp = newAV();
511 av_push(*avp, val);
512}
513
514/*
cb50131a
CB
515=for apidoc av_push
516
517Pushes an SV onto the end of the array. The array will grow automatically
518to accommodate the addition.
519
520=cut
521*/
522
a0d0e21e 523void
864dbfa3 524Perl_av_push(pTHX_ register AV *av, SV *val)
93965878 525{
27da23d5 526 dVAR;
93965878 527 MAGIC *mg;
ba5d1d60
GA
528 assert(av);
529
93965878 530 if (SvREADONLY(av))
cea2e8a9 531 Perl_croak(aTHX_ PL_no_modify);
93965878 532
14befaf4 533 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
93965878 534 dSP;
e788e7d3 535 PUSHSTACKi(PERLSI_MAGIC);
924508f0
GS
536 PUSHMARK(SP);
537 EXTEND(SP,2);
33c27489 538 PUSHs(SvTIED_obj((SV*)av, mg));
93965878 539 PUSHs(val);
a60c0954
NIS
540 PUTBACK;
541 ENTER;
864dbfa3 542 call_method("PUSH", G_SCALAR|G_DISCARD);
a60c0954 543 LEAVE;
d3acc0f7 544 POPSTACK;
93965878
NIS
545 return;
546 }
547 av_store(av,AvFILLp(av)+1,val);
79072805
LW
548}
549
cb50131a
CB
550/*
551=for apidoc av_pop
552
553Pops an SV off the end of the array. Returns C<&PL_sv_undef> if the array
554is empty.
555
556=cut
557*/
558
79072805 559SV *
864dbfa3 560Perl_av_pop(pTHX_ register AV *av)
79072805 561{
27da23d5 562 dVAR;
79072805 563 SV *retval;
93965878 564 MAGIC* mg;
79072805 565
ba5d1d60
GA
566 assert(av);
567
43fcc5d2 568 if (SvREADONLY(av))
cea2e8a9 569 Perl_croak(aTHX_ PL_no_modify);
14befaf4 570 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
93965878 571 dSP;
e788e7d3 572 PUSHSTACKi(PERLSI_MAGIC);
924508f0 573 PUSHMARK(SP);
33c27489 574 XPUSHs(SvTIED_obj((SV*)av, mg));
a60c0954
NIS
575 PUTBACK;
576 ENTER;
864dbfa3 577 if (call_method("POP", G_SCALAR)) {
3280af22 578 retval = newSVsv(*PL_stack_sp--);
93965878 579 } else {
3280af22 580 retval = &PL_sv_undef;
93965878 581 }
a60c0954 582 LEAVE;
d3acc0f7 583 POPSTACK;
93965878
NIS
584 return retval;
585 }
d19c0e07
MJD
586 if (AvFILL(av) < 0)
587 return &PL_sv_undef;
93965878 588 retval = AvARRAY(av)[AvFILLp(av)];
3280af22 589 AvARRAY(av)[AvFILLp(av)--] = &PL_sv_undef;
8990e307 590 if (SvSMAGICAL(av))
463ee0b2 591 mg_set((SV*)av);
79072805
LW
592 return retval;
593}
594
cb50131a 595/*
29a861e7
NC
596
597=for apidoc av_create_and_unshift_one
598
599Unshifts an SV onto the beginning of the array, creating the array if
600necessary.
601A small internal helper function to remove a commonly duplicated idiom.
602
603=cut
604*/
605
606SV **
607Perl_av_create_and_unshift_one(pTHX_ AV **const avp, SV *const val)
608{
609 if (!*avp)
610 *avp = newAV();
611 av_unshift(*avp, 1);
612 return av_store(*avp, 0, val);
613}
614
615/*
cb50131a
CB
616=for apidoc av_unshift
617
618Unshift the given number of C<undef> values onto the beginning of the
619array. The array will grow automatically to accommodate the addition. You
620must then use C<av_store> to assign values to these new elements.
621
622=cut
623*/
624
79072805 625void
864dbfa3 626Perl_av_unshift(pTHX_ register AV *av, register I32 num)
79072805 627{
27da23d5 628 dVAR;
79072805 629 register I32 i;
93965878 630 MAGIC* mg;
79072805 631
ba5d1d60
GA
632 assert(av);
633
43fcc5d2 634 if (SvREADONLY(av))
cea2e8a9 635 Perl_croak(aTHX_ PL_no_modify);
93965878 636
14befaf4 637 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
93965878 638 dSP;
e788e7d3 639 PUSHSTACKi(PERLSI_MAGIC);
924508f0
GS
640 PUSHMARK(SP);
641 EXTEND(SP,1+num);
33c27489 642 PUSHs(SvTIED_obj((SV*)av, mg));
93965878 643 while (num-- > 0) {
3280af22 644 PUSHs(&PL_sv_undef);
93965878
NIS
645 }
646 PUTBACK;
a60c0954 647 ENTER;
864dbfa3 648 call_method("UNSHIFT", G_SCALAR|G_DISCARD);
a60c0954 649 LEAVE;
d3acc0f7 650 POPSTACK;
93965878
NIS
651 return;
652 }
653
d19c0e07
MJD
654 if (num <= 0)
655 return;
49beac48
CS
656 if (!AvREAL(av) && AvREIFY(av))
657 av_reify(av);
a0d0e21e
LW
658 i = AvARRAY(av) - AvALLOC(av);
659 if (i) {
660 if (i > num)
661 i = num;
662 num -= i;
663
664 AvMAX(av) += i;
93965878 665 AvFILLp(av) += i;
9c6bc640 666 AvARRAY(av) = AvARRAY(av) - i;
a0d0e21e 667 }
d2719217 668 if (num) {
a3b680e6 669 register SV **ary;
c86f7df5 670 const I32 i = AvFILLp(av);
e2b534e7 671 /* Create extra elements */
c86f7df5 672 const I32 slide = i > 0 ? i : 0;
e2b534e7 673 num += slide;
67a38de0 674 av_extend(av, i + num);
93965878 675 AvFILLp(av) += num;
67a38de0
NIS
676 ary = AvARRAY(av);
677 Move(ary, ary + num, i + 1, SV*);
678 do {
3280af22 679 ary[--num] = &PL_sv_undef;
67a38de0 680 } while (num);
e2b534e7
BT
681 /* Make extra elements into a buffer */
682 AvMAX(av) -= slide;
683 AvFILLp(av) -= slide;
9c6bc640 684 AvARRAY(av) = AvARRAY(av) + slide;
79072805
LW
685 }
686}
687
cb50131a
CB
688/*
689=for apidoc av_shift
690
691Shifts an SV off the beginning of the array.
692
693=cut
694*/
695
79072805 696SV *
864dbfa3 697Perl_av_shift(pTHX_ register AV *av)
79072805 698{
27da23d5 699 dVAR;
79072805 700 SV *retval;
93965878 701 MAGIC* mg;
79072805 702
ba5d1d60
GA
703 assert(av);
704
43fcc5d2 705 if (SvREADONLY(av))
cea2e8a9 706 Perl_croak(aTHX_ PL_no_modify);
14befaf4 707 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
93965878 708 dSP;
e788e7d3 709 PUSHSTACKi(PERLSI_MAGIC);
924508f0 710 PUSHMARK(SP);
33c27489 711 XPUSHs(SvTIED_obj((SV*)av, mg));
a60c0954
NIS
712 PUTBACK;
713 ENTER;
864dbfa3 714 if (call_method("SHIFT", G_SCALAR)) {
3280af22 715 retval = newSVsv(*PL_stack_sp--);
93965878 716 } else {
3280af22 717 retval = &PL_sv_undef;
a60c0954
NIS
718 }
719 LEAVE;
d3acc0f7 720 POPSTACK;
93965878
NIS
721 return retval;
722 }
d19c0e07
MJD
723 if (AvFILL(av) < 0)
724 return &PL_sv_undef;
463ee0b2 725 retval = *AvARRAY(av);
a0d0e21e 726 if (AvREAL(av))
3280af22 727 *AvARRAY(av) = &PL_sv_undef;
9c6bc640 728 AvARRAY(av) = AvARRAY(av) + 1;
463ee0b2 729 AvMAX(av)--;
93965878 730 AvFILLp(av)--;
8990e307 731 if (SvSMAGICAL(av))
463ee0b2 732 mg_set((SV*)av);
79072805
LW
733 return retval;
734}
735
cb50131a
CB
736/*
737=for apidoc av_len
738
977a499b
GA
739Returns the highest index in the array. The number of elements in the
740array is C<av_len(av) + 1>. Returns -1 if the array is empty.
cb50131a
CB
741
742=cut
743*/
744
79072805 745I32
0d46e09a 746Perl_av_len(pTHX_ register const AV *av)
79072805 747{
ba5d1d60 748 assert(av);
463ee0b2 749 return AvFILL(av);
79072805
LW
750}
751
f3b76584
SC
752/*
753=for apidoc av_fill
754
977a499b 755Set the highest index in the array to the given number, equivalent to
f3b76584
SC
756Perl's C<$#array = $fill;>.
757
977a499b
GA
758The number of elements in the an array will be C<fill + 1> after
759av_fill() returns. If the array was previously shorter then the
760additional elements appended are set to C<PL_sv_undef>. If the array
761was longer, then the excess elements are freed. C<av_fill(av, -1)> is
762the same as C<av_clear(av)>.
763
f3b76584
SC
764=cut
765*/
79072805 766void
864dbfa3 767Perl_av_fill(pTHX_ register AV *av, I32 fill)
79072805 768{
27da23d5 769 dVAR;
93965878 770 MAGIC *mg;
ba5d1d60
GA
771
772 assert(av);
773
79072805
LW
774 if (fill < 0)
775 fill = -1;
14befaf4 776 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
93965878
NIS
777 dSP;
778 ENTER;
779 SAVETMPS;
e788e7d3 780 PUSHSTACKi(PERLSI_MAGIC);
924508f0
GS
781 PUSHMARK(SP);
782 EXTEND(SP,2);
33c27489 783 PUSHs(SvTIED_obj((SV*)av, mg));
a60c0954 784 PUSHs(sv_2mortal(newSViv(fill+1)));
93965878 785 PUTBACK;
864dbfa3 786 call_method("STORESIZE", G_SCALAR|G_DISCARD);
d3acc0f7 787 POPSTACK;
93965878
NIS
788 FREETMPS;
789 LEAVE;
790 return;
791 }
463ee0b2 792 if (fill <= AvMAX(av)) {
93965878 793 I32 key = AvFILLp(av);
fabdb6c0 794 SV** const ary = AvARRAY(av);
a0d0e21e
LW
795
796 if (AvREAL(av)) {
797 while (key > fill) {
798 SvREFCNT_dec(ary[key]);
3280af22 799 ary[key--] = &PL_sv_undef;
a0d0e21e
LW
800 }
801 }
802 else {
803 while (key < fill)
3280af22 804 ary[++key] = &PL_sv_undef;
a0d0e21e
LW
805 }
806
93965878 807 AvFILLp(av) = fill;
8990e307 808 if (SvSMAGICAL(av))
463ee0b2
LW
809 mg_set((SV*)av);
810 }
a0d0e21e 811 else
3280af22 812 (void)av_store(av,fill,&PL_sv_undef);
79072805 813}
c750a3ec 814
f3b76584
SC
815/*
816=for apidoc av_delete
817
818Deletes the element indexed by C<key> from the array. Returns the
a6214072
DM
819deleted element. If C<flags> equals C<G_DISCARD>, the element is freed
820and null is returned.
f3b76584
SC
821
822=cut
823*/
146174a9
CB
824SV *
825Perl_av_delete(pTHX_ AV *av, I32 key, I32 flags)
826{
97aff369 827 dVAR;
146174a9
CB
828 SV *sv;
829
ba5d1d60
GA
830 assert(av);
831
146174a9
CB
832 if (SvREADONLY(av))
833 Perl_croak(aTHX_ PL_no_modify);
6f12eb6d
MJD
834
835 if (SvRMAGICAL(av)) {
35a4481c 836 const MAGIC * const tied_magic = mg_find((SV*)av, PERL_MAGIC_tied);
6f12eb6d
MJD
837 if ((tied_magic || mg_find((SV*)av, PERL_MAGIC_regdata))) {
838 /* Handle negative array indices 20020222 MJD */
35a4481c 839 SV **svp;
6f12eb6d
MJD
840 if (key < 0) {
841 unsigned adjust_index = 1;
842 if (tied_magic) {
823a54a3 843 SV * const * const negative_indices_glob =
6f12eb6d
MJD
844 hv_fetch(SvSTASH(SvRV(SvTIED_obj((SV *)av,
845 tied_magic))),
846 NEGATIVE_INDICES_VAR, 16, 0);
847 if (negative_indices_glob
848 && SvTRUE(GvSV(*negative_indices_glob)))
849 adjust_index = 0;
850 }
851 if (adjust_index) {
852 key += AvFILL(av) + 1;
853 if (key < 0)
fabdb6c0 854 return NULL;
6f12eb6d
MJD
855 }
856 }
857 svp = av_fetch(av, key, TRUE);
858 if (svp) {
859 sv = *svp;
860 mg_clear(sv);
861 if (mg_find(sv, PERL_MAGIC_tiedelem)) {
862 sv_unmagic(sv, PERL_MAGIC_tiedelem); /* No longer an element */
863 return sv;
864 }
fabdb6c0 865 return NULL;
6f12eb6d
MJD
866 }
867 }
868 }
869
146174a9
CB
870 if (key < 0) {
871 key += AvFILL(av) + 1;
872 if (key < 0)
fabdb6c0 873 return NULL;
146174a9 874 }
6f12eb6d 875
146174a9 876 if (key > AvFILLp(av))
fabdb6c0 877 return NULL;
146174a9 878 else {
a6214072
DM
879 if (!AvREAL(av) && AvREIFY(av))
880 av_reify(av);
146174a9
CB
881 sv = AvARRAY(av)[key];
882 if (key == AvFILLp(av)) {
d9c63288 883 AvARRAY(av)[key] = &PL_sv_undef;
146174a9
CB
884 do {
885 AvFILLp(av)--;
886 } while (--key >= 0 && AvARRAY(av)[key] == &PL_sv_undef);
887 }
888 else
889 AvARRAY(av)[key] = &PL_sv_undef;
890 if (SvSMAGICAL(av))
891 mg_set((SV*)av);
892 }
893 if (flags & G_DISCARD) {
894 SvREFCNT_dec(sv);
fabdb6c0 895 sv = NULL;
146174a9 896 }
fdb3bdd0 897 else if (AvREAL(av))
2c8ddff3 898 sv = sv_2mortal(sv);
146174a9
CB
899 return sv;
900}
901
902/*
f3b76584
SC
903=for apidoc av_exists
904
905Returns true if the element indexed by C<key> has been initialized.
146174a9 906
f3b76584
SC
907This relies on the fact that uninitialized array elements are set to
908C<&PL_sv_undef>.
909
910=cut
911*/
146174a9
CB
912bool
913Perl_av_exists(pTHX_ AV *av, I32 key)
914{
97aff369 915 dVAR;
ba5d1d60 916 assert(av);
6f12eb6d
MJD
917
918 if (SvRMAGICAL(av)) {
35a4481c 919 const MAGIC * const tied_magic = mg_find((SV*)av, PERL_MAGIC_tied);
6f12eb6d 920 if (tied_magic || mg_find((SV*)av, PERL_MAGIC_regdata)) {
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 =
6f12eb6d
MJD
928 hv_fetch(SvSTASH(SvRV(SvTIED_obj((SV *)av,
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;
939 }
940 }
941
942 mg_copy((SV*)av, sv, 0, key);
943 mg = mg_find(sv, PERL_MAGIC_tiedelem);
944 if (mg) {
945 magic_existspack(sv, mg);
946 return (bool)SvTRUE(sv);
947 }
948
949 }
950 }
951
146174a9
CB
952 if (key < 0) {
953 key += AvFILL(av) + 1;
954 if (key < 0)
955 return FALSE;
956 }
6f12eb6d 957
146174a9
CB
958 if (key <= AvFILLp(av) && AvARRAY(av)[key] != &PL_sv_undef
959 && AvARRAY(av)[key])
960 {
961 return TRUE;
962 }
963 else
964 return FALSE;
965}
66610fdd 966
a3874608
NC
967SV **
968Perl_av_arylen_p(pTHX_ AV *av) {
969 dVAR;
ba5d1d60
GA
970 MAGIC *mg;
971
972 assert(av);
973
974 mg = mg_find((SV*)av, PERL_MAGIC_arylen_p);
a3874608
NC
975
976 if (!mg) {
1b20cd17
NC
977 mg = sv_magicext((SV*)av, 0, PERL_MAGIC_arylen_p, &PL_vtbl_arylen_p,
978 0, 0);
c82c7adc 979 assert(mg);
a3874608
NC
980 /* sv_magicext won't set this for us because we pass in a NULL obj */
981 mg->mg_flags |= MGf_REFCOUNTED;
982 }
983 return &(mg->mg_obj);
984}
985
66610fdd
RGS
986/*
987 * Local variables:
988 * c-indentation-style: bsd
989 * c-basic-offset: 4
990 * indent-tabs-mode: t
991 * End:
992 *
37442d52
RGS
993 * ex: set ts=8 sts=4 sw=4 noet:
994 */