Refactoring in av.c
[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,
54ca4ee7 4 * 2000, 2001, 2002, 2003, 2004, 2005, 2006, 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{
97aff369 27 dVAR;
a0d0e21e 28 I32 key;
fb73857a 29
ba5d1d60 30 assert(av);
31
3c78fafa 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 47 key = AvARRAY(av) - AvALLOC(av);
48 while (key)
3280af22 49 AvALLOC(av)[--key] = &PL_sv_undef;
62b1ebc2 50 AvREIFY_off(av);
a0d0e21e 51 AvREAL_on(av);
52}
53
cb50131a 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 67 MAGIC *mg;
68
ba5d1d60 69 assert(av);
70
7a5b473e 71 mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied);
823a54a3 72 if (mg) {
93965878 73 dSP;
74 ENTER;
75 SAVETMPS;
e788e7d3 76 PUSHSTACKi(PERLSI_MAGIC);
924508f0 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 84 FREETMPS;
85 LEAVE;
86 return;
87 }
a0d0e21e 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;
f880fe2f 98 SvPV_set(av, (char*)AvALLOC(av));
a0d0e21e 99 if (AvREAL(av)) {
100 while (tmp)
3280af22 101 ary[--tmp] = &PL_sv_undef;
a0d0e21e 102 }
a0d0e21e 103 if (key > AvMAX(av) - 10) {
104 newmax = key + AvMAX(av);
105 goto resize;
106 }
107 }
108 else {
2b573ace 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 116 MEM_SIZE bytes;
117 IV itmp;
c07a80fd 118#endif
4633a7c4 119
7bab3ede 120#ifdef MYMALLOC
8d6dde3e 121 newmax = malloced_size((void*)AvALLOC(av))/sizeof(SV*) - 1;
122
123 if (key <= newmax)
124 goto resized;
125#endif
a0d0e21e 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 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 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 144 if (AvMAX(av) > 64)
145 offer_nice_chunk(AvALLOC(av), (AvMAX(av)+1) * sizeof(SV*));
4633a7c4 146 else
147 Safefree(AvALLOC(av));
148 AvALLOC(av) = ary;
149#endif
7bab3ede 150#ifdef MYMALLOC
8d6dde3e 151 resized:
9c5ffd7c 152#endif
a0d0e21e 153 ary = AvALLOC(av) + AvMAX(av) + 1;
154 tmp = newmax - AvMAX(av);
3280af22 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 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 165 ary = AvALLOC(av) + 1;
166 tmp = newmax;
3280af22 167 AvALLOC(av)[0] = &PL_sv_undef; /* For the stacks */
a0d0e21e 168 }
169 if (AvREAL(av)) {
170 while (tmp)
3280af22 171 ary[--tmp] = &PL_sv_undef;
a0d0e21e 172 }
173
f880fe2f 174 SvPV_set(av, (char*)AvALLOC(av));
a0d0e21e 175 AvMAX(av) = newmax;
176 }
177 }
178}
179
cb50131a 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 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 216 if (adjust_index) {
217 key += AvFILL(av) + 1;
218 if (key < 0)
219 return NULL;
220 }
221 }
6f12eb6d 222
223 sv = sv_newmortal();
dd28f7bb 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 229 }
230 }
231
93965878 232 if (key < 0) {
233 key += AvFILL(av) + 1;
234 if (key < 0)
e2d306cb 235 return NULL;
93965878 236 }
237
93965878 238 if (key > AvFILLp(av)) {
a0d0e21e 239 if (!lval)
e2d306cb 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 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 256}
257
cb50131a 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 279 SV** ary;
280
ba5d1d60 281 assert(av);
282
725ac12f 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 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 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 313 }
314 }
315
316
a0d0e21e 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 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 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 341 else if (AvREAL(av))
342 SvREFCNT_dec(ary[key]);
79072805 343 ary[key] = val;
8990e307 344 if (SvSMAGICAL(av)) {
3280af22 345 if (val != &PL_sv_undef) {
fabdb6c0 346 const MAGIC* const mg = SvMAGIC(av);
a0d0e21e 347 sv_magic(val, (SV*)av, toLOWER(mg->mg_type), 0, key);
348 }
463ee0b2 349 mg_set((SV*)av);
350 }
79072805 351 return &ary[key];
352}
353
cb50131a 354/*
355=for apidoc newAV
356
357Creates a new AV. The reference count is set to 1.
358
359=cut
360*/
361
79072805 362AV *
864dbfa3 363Perl_newAV(pTHX)
79072805 364{
561b68a9 365 register AV * const av = (AV*)newSV(0);
79072805 366
a0d0e21e 367 sv_upgrade((SV *)av, SVt_PVAV);
a7f5e44d 368 /* sv_upgrade does AvREAL_only() */
463ee0b2 369 AvALLOC(av) = 0;
6136c704 370 SvPV_set(av, NULL);
93965878 371 AvMAX(av) = AvFILLp(av) = -1;
463ee0b2 372 return av;
79072805 373}
374
cb50131a 375/*
376=for apidoc av_make
377
378Creates a new AV and populates it with a list of SVs. The SVs are copied
379into the array, so they may be freed after the call to av_make. The new AV
380will have a reference count of 1.
381
382=cut
383*/
384
79072805 385AV *
864dbfa3 386Perl_av_make(pTHX_ register I32 size, register SV **strp)
79072805 387{
561b68a9 388 register AV * const av = (AV*)newSV(0);
79072805 389
a0d0e21e 390 sv_upgrade((SV *) av,SVt_PVAV);
a7f5e44d 391 /* sv_upgrade does AvREAL_only() */
a0288114 392 if (size) { /* "defined" was returning undef for size==0 anyway. */
dd374669 393 register SV** ary;
394 register I32 i;
a02a5408 395 Newx(ary,size,SV*);
573fa4ea 396 AvALLOC(av) = ary;
f880fe2f 397 SvPV_set(av, (char*)ary);
93965878 398 AvFILLp(av) = size - 1;
573fa4ea 399 AvMAX(av) = size - 1;
400 for (i = 0; i < size; i++) {
401 assert (*strp);
561b68a9 402 ary[i] = newSV(0);
573fa4ea 403 sv_setsv(ary[i], *strp);
404 strp++;
405 }
79072805 406 }
463ee0b2 407 return av;
79072805 408}
409
cb50131a 410/*
411=for apidoc av_clear
412
413Clears an array, making it empty. Does not free the memory used by the
414array itself.
415
416=cut
417*/
418
79072805 419void
864dbfa3 420Perl_av_clear(pTHX_ register AV *av)
79072805 421{
97aff369 422 dVAR;
e2d306cb 423 I32 extra;
79072805 424
ba5d1d60 425 assert(av);
7d55f622 426#ifdef DEBUGGING
32da55ab 427 if (SvREFCNT(av) == 0 && ckWARN_d(WARN_DEBUGGING)) {
9014280d 428 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING), "Attempt to clear deleted array");
7d55f622 429 }
430#endif
a0d0e21e 431
39caa665 432 if (SvREADONLY(av))
cea2e8a9 433 Perl_croak(aTHX_ PL_no_modify);
39caa665 434
93965878 435 /* Give any tie a chance to cleanup first */
436 if (SvRMAGICAL(av))
437 mg_clear((SV*)av);
438
a60c0954 439 if (AvMAX(av) < 0)
440 return;
441
a0d0e21e 442 if (AvREAL(av)) {
823a54a3 443 SV** const ary = AvARRAY(av);
e2d306cb 444 I32 index = AvFILLp(av) + 1;
445 while (index) {
446 SV * const sv = ary[--index];
6b42d12b 447 /* undef the slot before freeing the value, because a
e2d306cb 448 * destructor might try to modify this array */
449 ary[index] = &PL_sv_undef;
6b42d12b 450 SvREFCNT_dec(sv);
a0d0e21e 451 }
452 }
e2d306cb 453 extra = AvARRAY(av) - AvALLOC(av);
454 if (extra) {
455 AvMAX(av) += extra;
f880fe2f 456 SvPV_set(av, (char*)AvALLOC(av));
79072805 457 }
93965878 458 AvFILLp(av) = -1;
fb73857a 459
79072805 460}
461
cb50131a 462/*
463=for apidoc av_undef
464
465Undefines the array. Frees the memory used by the array itself.
466
467=cut
468*/
469
79072805 470void
864dbfa3 471Perl_av_undef(pTHX_ register AV *av)
79072805 472{
ba5d1d60 473 assert(av);
93965878 474
475 /* Give any tie a chance to cleanup first */
14befaf4 476 if (SvTIED_mg((SV*)av, PERL_MAGIC_tied))
93965878 477 av_fill(av, -1); /* mg_clear() ? */
478
a0d0e21e 479 if (AvREAL(av)) {
a3b680e6 480 register I32 key = AvFILLp(av) + 1;
a0d0e21e 481 while (key)
482 SvREFCNT_dec(AvARRAY(av)[--key]);
483 }
463ee0b2 484 Safefree(AvALLOC(av));
485 AvALLOC(av) = 0;
6136c704 486 SvPV_set(av, NULL);
93965878 487 AvMAX(av) = AvFILLp(av) = -1;
79072805 488}
489
cb50131a 490/*
491=for apidoc av_push
492
493Pushes an SV onto the end of the array. The array will grow automatically
494to accommodate the addition.
495
496=cut
497*/
498
a0d0e21e 499void
864dbfa3 500Perl_av_push(pTHX_ register AV *av, SV *val)
93965878 501{
27da23d5 502 dVAR;
93965878 503 MAGIC *mg;
ba5d1d60 504 assert(av);
505
93965878 506 if (SvREADONLY(av))
cea2e8a9 507 Perl_croak(aTHX_ PL_no_modify);
93965878 508
14befaf4 509 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
93965878 510 dSP;
e788e7d3 511 PUSHSTACKi(PERLSI_MAGIC);
924508f0 512 PUSHMARK(SP);
513 EXTEND(SP,2);
33c27489 514 PUSHs(SvTIED_obj((SV*)av, mg));
93965878 515 PUSHs(val);
a60c0954 516 PUTBACK;
517 ENTER;
864dbfa3 518 call_method("PUSH", G_SCALAR|G_DISCARD);
a60c0954 519 LEAVE;
d3acc0f7 520 POPSTACK;
93965878 521 return;
522 }
523 av_store(av,AvFILLp(av)+1,val);
79072805 524}
525
cb50131a 526/*
527=for apidoc av_pop
528
529Pops an SV off the end of the array. Returns C<&PL_sv_undef> if the array
530is empty.
531
532=cut
533*/
534
79072805 535SV *
864dbfa3 536Perl_av_pop(pTHX_ register AV *av)
79072805 537{
27da23d5 538 dVAR;
79072805 539 SV *retval;
93965878 540 MAGIC* mg;
79072805 541
ba5d1d60 542 assert(av);
543
43fcc5d2 544 if (SvREADONLY(av))
cea2e8a9 545 Perl_croak(aTHX_ PL_no_modify);
14befaf4 546 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
93965878 547 dSP;
e788e7d3 548 PUSHSTACKi(PERLSI_MAGIC);
924508f0 549 PUSHMARK(SP);
33c27489 550 XPUSHs(SvTIED_obj((SV*)av, mg));
a60c0954 551 PUTBACK;
552 ENTER;
864dbfa3 553 if (call_method("POP", G_SCALAR)) {
3280af22 554 retval = newSVsv(*PL_stack_sp--);
93965878 555 } else {
3280af22 556 retval = &PL_sv_undef;
93965878 557 }
a60c0954 558 LEAVE;
d3acc0f7 559 POPSTACK;
93965878 560 return retval;
561 }
d19c0e07 562 if (AvFILL(av) < 0)
563 return &PL_sv_undef;
93965878 564 retval = AvARRAY(av)[AvFILLp(av)];
3280af22 565 AvARRAY(av)[AvFILLp(av)--] = &PL_sv_undef;
8990e307 566 if (SvSMAGICAL(av))
463ee0b2 567 mg_set((SV*)av);
79072805 568 return retval;
569}
570
cb50131a 571/*
572=for apidoc av_unshift
573
574Unshift the given number of C<undef> values onto the beginning of the
575array. The array will grow automatically to accommodate the addition. You
576must then use C<av_store> to assign values to these new elements.
577
578=cut
579*/
580
79072805 581void
864dbfa3 582Perl_av_unshift(pTHX_ register AV *av, register I32 num)
79072805 583{
27da23d5 584 dVAR;
79072805 585 register I32 i;
93965878 586 MAGIC* mg;
79072805 587
ba5d1d60 588 assert(av);
589
43fcc5d2 590 if (SvREADONLY(av))
cea2e8a9 591 Perl_croak(aTHX_ PL_no_modify);
93965878 592
14befaf4 593 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
93965878 594 dSP;
e788e7d3 595 PUSHSTACKi(PERLSI_MAGIC);
924508f0 596 PUSHMARK(SP);
597 EXTEND(SP,1+num);
33c27489 598 PUSHs(SvTIED_obj((SV*)av, mg));
93965878 599 while (num-- > 0) {
3280af22 600 PUSHs(&PL_sv_undef);
93965878 601 }
602 PUTBACK;
a60c0954 603 ENTER;
864dbfa3 604 call_method("UNSHIFT", G_SCALAR|G_DISCARD);
a60c0954 605 LEAVE;
d3acc0f7 606 POPSTACK;
93965878 607 return;
608 }
609
d19c0e07 610 if (num <= 0)
611 return;
49beac48 612 if (!AvREAL(av) && AvREIFY(av))
613 av_reify(av);
a0d0e21e 614 i = AvARRAY(av) - AvALLOC(av);
615 if (i) {
616 if (i > num)
617 i = num;
618 num -= i;
619
620 AvMAX(av) += i;
93965878 621 AvFILLp(av) += i;
f880fe2f 622 SvPV_set(av, (char*)(AvARRAY(av) - i));
a0d0e21e 623 }
d2719217 624 if (num) {
a3b680e6 625 register SV **ary;
626 I32 slide;
67a38de0 627 i = AvFILLp(av);
e2b534e7 628 /* Create extra elements */
629 slide = i > 0 ? i : 0;
630 num += slide;
67a38de0 631 av_extend(av, i + num);
93965878 632 AvFILLp(av) += num;
67a38de0 633 ary = AvARRAY(av);
634 Move(ary, ary + num, i + 1, SV*);
635 do {
3280af22 636 ary[--num] = &PL_sv_undef;
67a38de0 637 } while (num);
e2b534e7 638 /* Make extra elements into a buffer */
639 AvMAX(av) -= slide;
640 AvFILLp(av) -= slide;
f880fe2f 641 SvPV_set(av, (char*)(AvARRAY(av) + slide));
79072805 642 }
643}
644
cb50131a 645/*
646=for apidoc av_shift
647
648Shifts an SV off the beginning of the array.
649
650=cut
651*/
652
79072805 653SV *
864dbfa3 654Perl_av_shift(pTHX_ register AV *av)
79072805 655{
27da23d5 656 dVAR;
79072805 657 SV *retval;
93965878 658 MAGIC* mg;
79072805 659
ba5d1d60 660 assert(av);
661
43fcc5d2 662 if (SvREADONLY(av))
cea2e8a9 663 Perl_croak(aTHX_ PL_no_modify);
14befaf4 664 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
93965878 665 dSP;
e788e7d3 666 PUSHSTACKi(PERLSI_MAGIC);
924508f0 667 PUSHMARK(SP);
33c27489 668 XPUSHs(SvTIED_obj((SV*)av, mg));
a60c0954 669 PUTBACK;
670 ENTER;
864dbfa3 671 if (call_method("SHIFT", G_SCALAR)) {
3280af22 672 retval = newSVsv(*PL_stack_sp--);
93965878 673 } else {
3280af22 674 retval = &PL_sv_undef;
a60c0954 675 }
676 LEAVE;
d3acc0f7 677 POPSTACK;
93965878 678 return retval;
679 }
d19c0e07 680 if (AvFILL(av) < 0)
681 return &PL_sv_undef;
463ee0b2 682 retval = *AvARRAY(av);
a0d0e21e 683 if (AvREAL(av))
3280af22 684 *AvARRAY(av) = &PL_sv_undef;
f880fe2f 685 SvPV_set(av, (char*)(AvARRAY(av) + 1));
463ee0b2 686 AvMAX(av)--;
93965878 687 AvFILLp(av)--;
8990e307 688 if (SvSMAGICAL(av))
463ee0b2 689 mg_set((SV*)av);
79072805 690 return retval;
691}
692
cb50131a 693/*
694=for apidoc av_len
695
696Returns the highest index in the array. Returns -1 if the array is
697empty.
698
699=cut
700*/
701
79072805 702I32
0d46e09a 703Perl_av_len(pTHX_ register const AV *av)
79072805 704{
ba5d1d60 705 assert(av);
463ee0b2 706 return AvFILL(av);
79072805 707}
708
f3b76584 709/*
710=for apidoc av_fill
711
712Ensure than an array has a given number of elements, equivalent to
713Perl's C<$#array = $fill;>.
714
715=cut
716*/
79072805 717void
864dbfa3 718Perl_av_fill(pTHX_ register AV *av, I32 fill)
79072805 719{
27da23d5 720 dVAR;
93965878 721 MAGIC *mg;
ba5d1d60 722
723 assert(av);
724
79072805 725 if (fill < 0)
726 fill = -1;
14befaf4 727 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
93965878 728 dSP;
729 ENTER;
730 SAVETMPS;
e788e7d3 731 PUSHSTACKi(PERLSI_MAGIC);
924508f0 732 PUSHMARK(SP);
733 EXTEND(SP,2);
33c27489 734 PUSHs(SvTIED_obj((SV*)av, mg));
a60c0954 735 PUSHs(sv_2mortal(newSViv(fill+1)));
93965878 736 PUTBACK;
864dbfa3 737 call_method("STORESIZE", G_SCALAR|G_DISCARD);
d3acc0f7 738 POPSTACK;
93965878 739 FREETMPS;
740 LEAVE;
741 return;
742 }
463ee0b2 743 if (fill <= AvMAX(av)) {
93965878 744 I32 key = AvFILLp(av);
fabdb6c0 745 SV** const ary = AvARRAY(av);
a0d0e21e 746
747 if (AvREAL(av)) {
748 while (key > fill) {
749 SvREFCNT_dec(ary[key]);
3280af22 750 ary[key--] = &PL_sv_undef;
a0d0e21e 751 }
752 }
753 else {
754 while (key < fill)
3280af22 755 ary[++key] = &PL_sv_undef;
a0d0e21e 756 }
757
93965878 758 AvFILLp(av) = fill;
8990e307 759 if (SvSMAGICAL(av))
463ee0b2 760 mg_set((SV*)av);
761 }
a0d0e21e 762 else
3280af22 763 (void)av_store(av,fill,&PL_sv_undef);
79072805 764}
c750a3ec 765
f3b76584 766/*
767=for apidoc av_delete
768
769Deletes the element indexed by C<key> from the array. Returns the
a6214072 770deleted element. If C<flags> equals C<G_DISCARD>, the element is freed
771and null is returned.
f3b76584 772
773=cut
774*/
146174a9 775SV *
776Perl_av_delete(pTHX_ AV *av, I32 key, I32 flags)
777{
97aff369 778 dVAR;
146174a9 779 SV *sv;
780
ba5d1d60 781 assert(av);
782
146174a9 783 if (SvREADONLY(av))
784 Perl_croak(aTHX_ PL_no_modify);
6f12eb6d 785
786 if (SvRMAGICAL(av)) {
35a4481c 787 const MAGIC * const tied_magic = mg_find((SV*)av, PERL_MAGIC_tied);
6f12eb6d 788 if ((tied_magic || mg_find((SV*)av, PERL_MAGIC_regdata))) {
789 /* Handle negative array indices 20020222 MJD */
35a4481c 790 SV **svp;
6f12eb6d 791 if (key < 0) {
792 unsigned adjust_index = 1;
793 if (tied_magic) {
823a54a3 794 SV * const * const negative_indices_glob =
6f12eb6d 795 hv_fetch(SvSTASH(SvRV(SvTIED_obj((SV *)av,
796 tied_magic))),
797 NEGATIVE_INDICES_VAR, 16, 0);
798 if (negative_indices_glob
799 && SvTRUE(GvSV(*negative_indices_glob)))
800 adjust_index = 0;
801 }
802 if (adjust_index) {
803 key += AvFILL(av) + 1;
804 if (key < 0)
fabdb6c0 805 return NULL;
6f12eb6d 806 }
807 }
808 svp = av_fetch(av, key, TRUE);
809 if (svp) {
810 sv = *svp;
811 mg_clear(sv);
812 if (mg_find(sv, PERL_MAGIC_tiedelem)) {
813 sv_unmagic(sv, PERL_MAGIC_tiedelem); /* No longer an element */
814 return sv;
815 }
fabdb6c0 816 return NULL;
6f12eb6d 817 }
818 }
819 }
820
146174a9 821 if (key < 0) {
822 key += AvFILL(av) + 1;
823 if (key < 0)
fabdb6c0 824 return NULL;
146174a9 825 }
6f12eb6d 826
146174a9 827 if (key > AvFILLp(av))
fabdb6c0 828 return NULL;
146174a9 829 else {
a6214072 830 if (!AvREAL(av) && AvREIFY(av))
831 av_reify(av);
146174a9 832 sv = AvARRAY(av)[key];
833 if (key == AvFILLp(av)) {
d9c63288 834 AvARRAY(av)[key] = &PL_sv_undef;
146174a9 835 do {
836 AvFILLp(av)--;
837 } while (--key >= 0 && AvARRAY(av)[key] == &PL_sv_undef);
838 }
839 else
840 AvARRAY(av)[key] = &PL_sv_undef;
841 if (SvSMAGICAL(av))
842 mg_set((SV*)av);
843 }
844 if (flags & G_DISCARD) {
845 SvREFCNT_dec(sv);
fabdb6c0 846 sv = NULL;
146174a9 847 }
fdb3bdd0 848 else if (AvREAL(av))
2c8ddff3 849 sv = sv_2mortal(sv);
146174a9 850 return sv;
851}
852
853/*
f3b76584 854=for apidoc av_exists
855
856Returns true if the element indexed by C<key> has been initialized.
146174a9 857
f3b76584 858This relies on the fact that uninitialized array elements are set to
859C<&PL_sv_undef>.
860
861=cut
862*/
146174a9 863bool
864Perl_av_exists(pTHX_ AV *av, I32 key)
865{
97aff369 866 dVAR;
ba5d1d60 867 assert(av);
6f12eb6d 868
869 if (SvRMAGICAL(av)) {
35a4481c 870 const MAGIC * const tied_magic = mg_find((SV*)av, PERL_MAGIC_tied);
6f12eb6d 871 if (tied_magic || mg_find((SV*)av, PERL_MAGIC_regdata)) {
fabdb6c0 872 SV * const sv = sv_newmortal();
6f12eb6d 873 MAGIC *mg;
874 /* Handle negative array indices 20020222 MJD */
875 if (key < 0) {
876 unsigned adjust_index = 1;
877 if (tied_magic) {
823a54a3 878 SV * const * const negative_indices_glob =
6f12eb6d 879 hv_fetch(SvSTASH(SvRV(SvTIED_obj((SV *)av,
880 tied_magic))),
881 NEGATIVE_INDICES_VAR, 16, 0);
882 if (negative_indices_glob
883 && SvTRUE(GvSV(*negative_indices_glob)))
884 adjust_index = 0;
885 }
886 if (adjust_index) {
887 key += AvFILL(av) + 1;
888 if (key < 0)
889 return FALSE;
890 }
891 }
892
893 mg_copy((SV*)av, sv, 0, key);
894 mg = mg_find(sv, PERL_MAGIC_tiedelem);
895 if (mg) {
896 magic_existspack(sv, mg);
897 return (bool)SvTRUE(sv);
898 }
899
900 }
901 }
902
146174a9 903 if (key < 0) {
904 key += AvFILL(av) + 1;
905 if (key < 0)
906 return FALSE;
907 }
6f12eb6d 908
146174a9 909 if (key <= AvFILLp(av) && AvARRAY(av)[key] != &PL_sv_undef
910 && AvARRAY(av)[key])
911 {
912 return TRUE;
913 }
914 else
915 return FALSE;
916}
66610fdd 917
a3874608 918SV **
919Perl_av_arylen_p(pTHX_ AV *av) {
920 dVAR;
ba5d1d60 921 MAGIC *mg;
922
923 assert(av);
924
925 mg = mg_find((SV*)av, PERL_MAGIC_arylen_p);
a3874608 926
927 if (!mg) {
1b20cd17 928 mg = sv_magicext((SV*)av, 0, PERL_MAGIC_arylen_p, &PL_vtbl_arylen_p,
929 0, 0);
c82c7adc 930 assert(mg);
a3874608 931 /* sv_magicext won't set this for us because we pass in a NULL obj */
932 mg->mg_flags |= MGf_REFCOUNTED;
933 }
934 return &(mg->mg_obj);
935}
936
66610fdd 937/*
938 * Local variables:
939 * c-indentation-style: bsd
940 * c-basic-offset: 4
941 * indent-tabs-mode: t
942 * End:
943 *
37442d52 944 * ex: set ts=8 sts=4 sw=4 noet:
945 */