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