Regenerate embed.h
[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,
663f364b 4 * 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 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
7918f24d 30 PERL_ARGS_ASSERT_AV_REIFY;
ba5d1d60 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
7918f24d 69 PERL_ARGS_ASSERT_AV_EXTEND;
ba5d1d60 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));
6e449a3a 80 mPUSHi(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;
9c6bc640 98 AvARRAY(av) = 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
9c6bc640 174 AvARRAY(av) = 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
7918f24d 198 PERL_ARGS_ASSERT_AV_FETCH;
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
7918f24d 281 PERL_ARGS_ASSERT_AV_STORE;
ba5d1d60 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)) {
89c14e2e 345 const MAGIC* const mg = SvMAGIC(av);
3280af22 346 if (val != &PL_sv_undef) {
a0d0e21e 347 sv_magic(val, (SV*)av, toLOWER(mg->mg_type), 0, key);
348 }
89c14e2e 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 354 return &ary[key];
355}
356
cb50131a 357/*
cb50131a 358=for apidoc av_make
359
360Creates a new AV and populates it with a list of SVs. The SVs are copied
361into the array, so they may be freed after the call to av_make. The new AV
362will have a reference count of 1.
363
364=cut
365*/
366
79072805 367AV *
864dbfa3 368Perl_av_make(pTHX_ register I32 size, register SV **strp)
79072805 369{
b9f83d2f 370 register AV * const av = (AV*)newSV_type(SVt_PVAV);
a7f5e44d 371 /* sv_upgrade does AvREAL_only() */
7918f24d 372 PERL_ARGS_ASSERT_AV_MAKE;
a0288114 373 if (size) { /* "defined" was returning undef for size==0 anyway. */
dd374669 374 register SV** ary;
375 register I32 i;
a02a5408 376 Newx(ary,size,SV*);
573fa4ea 377 AvALLOC(av) = ary;
9c6bc640 378 AvARRAY(av) = ary;
35da51f7 379 AvFILLp(av) = AvMAX(av) = size - 1;
573fa4ea 380 for (i = 0; i < size; i++) {
381 assert (*strp);
561b68a9 382 ary[i] = newSV(0);
573fa4ea 383 sv_setsv(ary[i], *strp);
384 strp++;
385 }
79072805 386 }
463ee0b2 387 return av;
79072805 388}
389
cb50131a 390/*
391=for apidoc av_clear
392
393Clears an array, making it empty. Does not free the memory used by the
394array itself.
395
396=cut
397*/
398
79072805 399void
864dbfa3 400Perl_av_clear(pTHX_ register AV *av)
79072805 401{
97aff369 402 dVAR;
e2d306cb 403 I32 extra;
79072805 404
7918f24d 405 PERL_ARGS_ASSERT_AV_CLEAR;
7d55f622 406#ifdef DEBUGGING
32da55ab 407 if (SvREFCNT(av) == 0 && ckWARN_d(WARN_DEBUGGING)) {
9014280d 408 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING), "Attempt to clear deleted array");
7d55f622 409 }
410#endif
a0d0e21e 411
39caa665 412 if (SvREADONLY(av))
cea2e8a9 413 Perl_croak(aTHX_ PL_no_modify);
39caa665 414
93965878 415 /* Give any tie a chance to cleanup first */
89c14e2e 416 if (SvRMAGICAL(av)) {
417 const MAGIC* const mg = SvMAGIC(av);
418 if (PL_delaymagic && mg->mg_type == PERL_MAGIC_isa)
419 PL_delaymagic |= DM_ARRAY;
420 else
421 mg_clear((SV*)av);
422 }
93965878 423
a60c0954 424 if (AvMAX(av) < 0)
425 return;
426
a0d0e21e 427 if (AvREAL(av)) {
823a54a3 428 SV** const ary = AvARRAY(av);
e2d306cb 429 I32 index = AvFILLp(av) + 1;
430 while (index) {
431 SV * const sv = ary[--index];
6b42d12b 432 /* undef the slot before freeing the value, because a
e2d306cb 433 * destructor might try to modify this array */
434 ary[index] = &PL_sv_undef;
6b42d12b 435 SvREFCNT_dec(sv);
a0d0e21e 436 }
437 }
e2d306cb 438 extra = AvARRAY(av) - AvALLOC(av);
439 if (extra) {
440 AvMAX(av) += extra;
9c6bc640 441 AvARRAY(av) = AvALLOC(av);
79072805 442 }
93965878 443 AvFILLp(av) = -1;
fb73857a 444
79072805 445}
446
cb50131a 447/*
448=for apidoc av_undef
449
450Undefines the array. Frees the memory used by the array itself.
451
452=cut
453*/
454
79072805 455void
864dbfa3 456Perl_av_undef(pTHX_ register AV *av)
79072805 457{
7918f24d 458 PERL_ARGS_ASSERT_AV_UNDEF;
93965878 459
460 /* Give any tie a chance to cleanup first */
14befaf4 461 if (SvTIED_mg((SV*)av, PERL_MAGIC_tied))
22717f83 462 av_fill(av, -1);
93965878 463
a0d0e21e 464 if (AvREAL(av)) {
a3b680e6 465 register I32 key = AvFILLp(av) + 1;
a0d0e21e 466 while (key)
467 SvREFCNT_dec(AvARRAY(av)[--key]);
468 }
22717f83 469
463ee0b2 470 Safefree(AvALLOC(av));
35da51f7 471 AvALLOC(av) = NULL;
9c6bc640 472 AvARRAY(av) = NULL;
93965878 473 AvMAX(av) = AvFILLp(av) = -1;
22717f83 474
475 if(SvRMAGICAL(av)) mg_clear((SV*)av);
79072805 476}
477
cb50131a 478/*
29a861e7 479
480=for apidoc av_create_and_push
481
482Push an SV onto the end of the array, creating the array if necessary.
483A small internal helper function to remove a commonly duplicated idiom.
484
485=cut
486*/
487
488void
489Perl_av_create_and_push(pTHX_ AV **const avp, SV *const val)
490{
7918f24d 491 PERL_ARGS_ASSERT_AV_CREATE_AND_PUSH;
29a861e7 492 if (!*avp)
493 *avp = newAV();
494 av_push(*avp, val);
495}
496
497/*
cb50131a 498=for apidoc av_push
499
500Pushes an SV onto the end of the array. The array will grow automatically
501to accommodate the addition.
502
503=cut
504*/
505
a0d0e21e 506void
864dbfa3 507Perl_av_push(pTHX_ register AV *av, SV *val)
93965878 508{
27da23d5 509 dVAR;
93965878 510 MAGIC *mg;
7918f24d 511
512 PERL_ARGS_ASSERT_AV_PUSH;
ba5d1d60 513
93965878 514 if (SvREADONLY(av))
cea2e8a9 515 Perl_croak(aTHX_ PL_no_modify);
93965878 516
14befaf4 517 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
93965878 518 dSP;
e788e7d3 519 PUSHSTACKi(PERLSI_MAGIC);
924508f0 520 PUSHMARK(SP);
521 EXTEND(SP,2);
33c27489 522 PUSHs(SvTIED_obj((SV*)av, mg));
93965878 523 PUSHs(val);
a60c0954 524 PUTBACK;
525 ENTER;
864dbfa3 526 call_method("PUSH", G_SCALAR|G_DISCARD);
a60c0954 527 LEAVE;
d3acc0f7 528 POPSTACK;
93965878 529 return;
530 }
531 av_store(av,AvFILLp(av)+1,val);
79072805 532}
533
cb50131a 534/*
535=for apidoc av_pop
536
537Pops an SV off the end of the array. Returns C<&PL_sv_undef> if the array
538is empty.
539
540=cut
541*/
542
79072805 543SV *
864dbfa3 544Perl_av_pop(pTHX_ register AV *av)
79072805 545{
27da23d5 546 dVAR;
79072805 547 SV *retval;
93965878 548 MAGIC* mg;
79072805 549
7918f24d 550 PERL_ARGS_ASSERT_AV_POP;
ba5d1d60 551
43fcc5d2 552 if (SvREADONLY(av))
cea2e8a9 553 Perl_croak(aTHX_ PL_no_modify);
14befaf4 554 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
93965878 555 dSP;
e788e7d3 556 PUSHSTACKi(PERLSI_MAGIC);
924508f0 557 PUSHMARK(SP);
33c27489 558 XPUSHs(SvTIED_obj((SV*)av, mg));
a60c0954 559 PUTBACK;
560 ENTER;
864dbfa3 561 if (call_method("POP", G_SCALAR)) {
3280af22 562 retval = newSVsv(*PL_stack_sp--);
93965878 563 } else {
3280af22 564 retval = &PL_sv_undef;
93965878 565 }
a60c0954 566 LEAVE;
d3acc0f7 567 POPSTACK;
93965878 568 return retval;
569 }
d19c0e07 570 if (AvFILL(av) < 0)
571 return &PL_sv_undef;
93965878 572 retval = AvARRAY(av)[AvFILLp(av)];
3280af22 573 AvARRAY(av)[AvFILLp(av)--] = &PL_sv_undef;
8990e307 574 if (SvSMAGICAL(av))
463ee0b2 575 mg_set((SV*)av);
79072805 576 return retval;
577}
578
cb50131a 579/*
29a861e7 580
581=for apidoc av_create_and_unshift_one
582
583Unshifts an SV onto the beginning of the array, creating the array if
584necessary.
585A small internal helper function to remove a commonly duplicated idiom.
586
587=cut
588*/
589
590SV **
591Perl_av_create_and_unshift_one(pTHX_ AV **const avp, SV *const val)
592{
7918f24d 593 PERL_ARGS_ASSERT_AV_CREATE_AND_UNSHIFT_ONE;
29a861e7 594 if (!*avp)
595 *avp = newAV();
596 av_unshift(*avp, 1);
597 return av_store(*avp, 0, val);
598}
599
600/*
cb50131a 601=for apidoc av_unshift
602
603Unshift the given number of C<undef> values onto the beginning of the
604array. The array will grow automatically to accommodate the addition. You
605must then use C<av_store> to assign values to these new elements.
606
607=cut
608*/
609
79072805 610void
864dbfa3 611Perl_av_unshift(pTHX_ register AV *av, register I32 num)
79072805 612{
27da23d5 613 dVAR;
79072805 614 register I32 i;
93965878 615 MAGIC* mg;
79072805 616
7918f24d 617 PERL_ARGS_ASSERT_AV_UNSHIFT;
ba5d1d60 618
43fcc5d2 619 if (SvREADONLY(av))
cea2e8a9 620 Perl_croak(aTHX_ PL_no_modify);
93965878 621
14befaf4 622 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
93965878 623 dSP;
e788e7d3 624 PUSHSTACKi(PERLSI_MAGIC);
924508f0 625 PUSHMARK(SP);
626 EXTEND(SP,1+num);
33c27489 627 PUSHs(SvTIED_obj((SV*)av, mg));
93965878 628 while (num-- > 0) {
3280af22 629 PUSHs(&PL_sv_undef);
93965878 630 }
631 PUTBACK;
a60c0954 632 ENTER;
864dbfa3 633 call_method("UNSHIFT", G_SCALAR|G_DISCARD);
a60c0954 634 LEAVE;
d3acc0f7 635 POPSTACK;
93965878 636 return;
637 }
638
d19c0e07 639 if (num <= 0)
640 return;
49beac48 641 if (!AvREAL(av) && AvREIFY(av))
642 av_reify(av);
a0d0e21e 643 i = AvARRAY(av) - AvALLOC(av);
644 if (i) {
645 if (i > num)
646 i = num;
647 num -= i;
648
649 AvMAX(av) += i;
93965878 650 AvFILLp(av) += i;
9c6bc640 651 AvARRAY(av) = AvARRAY(av) - i;
a0d0e21e 652 }
d2719217 653 if (num) {
a3b680e6 654 register SV **ary;
c86f7df5 655 const I32 i = AvFILLp(av);
e2b534e7 656 /* Create extra elements */
c86f7df5 657 const I32 slide = i > 0 ? i : 0;
e2b534e7 658 num += slide;
67a38de0 659 av_extend(av, i + num);
93965878 660 AvFILLp(av) += num;
67a38de0 661 ary = AvARRAY(av);
662 Move(ary, ary + num, i + 1, SV*);
663 do {
3280af22 664 ary[--num] = &PL_sv_undef;
67a38de0 665 } while (num);
e2b534e7 666 /* Make extra elements into a buffer */
667 AvMAX(av) -= slide;
668 AvFILLp(av) -= slide;
9c6bc640 669 AvARRAY(av) = AvARRAY(av) + slide;
79072805 670 }
671}
672
cb50131a 673/*
674=for apidoc av_shift
675
676Shifts an SV off the beginning of the array.
677
678=cut
679*/
680
79072805 681SV *
864dbfa3 682Perl_av_shift(pTHX_ register AV *av)
79072805 683{
27da23d5 684 dVAR;
79072805 685 SV *retval;
93965878 686 MAGIC* mg;
79072805 687
7918f24d 688 PERL_ARGS_ASSERT_AV_SHIFT;
ba5d1d60 689
43fcc5d2 690 if (SvREADONLY(av))
cea2e8a9 691 Perl_croak(aTHX_ PL_no_modify);
14befaf4 692 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
93965878 693 dSP;
e788e7d3 694 PUSHSTACKi(PERLSI_MAGIC);
924508f0 695 PUSHMARK(SP);
33c27489 696 XPUSHs(SvTIED_obj((SV*)av, mg));
a60c0954 697 PUTBACK;
698 ENTER;
864dbfa3 699 if (call_method("SHIFT", G_SCALAR)) {
3280af22 700 retval = newSVsv(*PL_stack_sp--);
93965878 701 } else {
3280af22 702 retval = &PL_sv_undef;
a60c0954 703 }
704 LEAVE;
d3acc0f7 705 POPSTACK;
93965878 706 return retval;
707 }
d19c0e07 708 if (AvFILL(av) < 0)
709 return &PL_sv_undef;
463ee0b2 710 retval = *AvARRAY(av);
a0d0e21e 711 if (AvREAL(av))
3280af22 712 *AvARRAY(av) = &PL_sv_undef;
9c6bc640 713 AvARRAY(av) = AvARRAY(av) + 1;
463ee0b2 714 AvMAX(av)--;
93965878 715 AvFILLp(av)--;
8990e307 716 if (SvSMAGICAL(av))
463ee0b2 717 mg_set((SV*)av);
79072805 718 return retval;
719}
720
cb50131a 721/*
722=for apidoc av_len
723
977a499b 724Returns the highest index in the array. The number of elements in the
725array is C<av_len(av) + 1>. Returns -1 if the array is empty.
cb50131a 726
727=cut
728*/
729
79072805 730I32
0d46e09a 731Perl_av_len(pTHX_ register const AV *av)
79072805 732{
7918f24d 733 PERL_ARGS_ASSERT_AV_LEN;
463ee0b2 734 return AvFILL(av);
79072805 735}
736
f3b76584 737/*
738=for apidoc av_fill
739
977a499b 740Set the highest index in the array to the given number, equivalent to
f3b76584 741Perl's C<$#array = $fill;>.
742
977a499b 743The number of elements in the an array will be C<fill + 1> after
744av_fill() returns. If the array was previously shorter then the
745additional elements appended are set to C<PL_sv_undef>. If the array
746was longer, then the excess elements are freed. C<av_fill(av, -1)> is
747the same as C<av_clear(av)>.
748
f3b76584 749=cut
750*/
79072805 751void
864dbfa3 752Perl_av_fill(pTHX_ register AV *av, I32 fill)
79072805 753{
27da23d5 754 dVAR;
93965878 755 MAGIC *mg;
ba5d1d60 756
7918f24d 757 PERL_ARGS_ASSERT_AV_FILL;
ba5d1d60 758
79072805 759 if (fill < 0)
760 fill = -1;
14befaf4 761 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
93965878 762 dSP;
763 ENTER;
764 SAVETMPS;
e788e7d3 765 PUSHSTACKi(PERLSI_MAGIC);
924508f0 766 PUSHMARK(SP);
767 EXTEND(SP,2);
33c27489 768 PUSHs(SvTIED_obj((SV*)av, mg));
6e449a3a 769 mPUSHi(fill + 1);
93965878 770 PUTBACK;
864dbfa3 771 call_method("STORESIZE", G_SCALAR|G_DISCARD);
d3acc0f7 772 POPSTACK;
93965878 773 FREETMPS;
774 LEAVE;
775 return;
776 }
463ee0b2 777 if (fill <= AvMAX(av)) {
93965878 778 I32 key = AvFILLp(av);
fabdb6c0 779 SV** const ary = AvARRAY(av);
a0d0e21e 780
781 if (AvREAL(av)) {
782 while (key > fill) {
783 SvREFCNT_dec(ary[key]);
3280af22 784 ary[key--] = &PL_sv_undef;
a0d0e21e 785 }
786 }
787 else {
788 while (key < fill)
3280af22 789 ary[++key] = &PL_sv_undef;
a0d0e21e 790 }
791
93965878 792 AvFILLp(av) = fill;
8990e307 793 if (SvSMAGICAL(av))
463ee0b2 794 mg_set((SV*)av);
795 }
a0d0e21e 796 else
3280af22 797 (void)av_store(av,fill,&PL_sv_undef);
79072805 798}
c750a3ec 799
f3b76584 800/*
801=for apidoc av_delete
802
803Deletes the element indexed by C<key> from the array. Returns the
a6214072 804deleted element. If C<flags> equals C<G_DISCARD>, the element is freed
805and null is returned.
f3b76584 806
807=cut
808*/
146174a9 809SV *
810Perl_av_delete(pTHX_ AV *av, I32 key, I32 flags)
811{
97aff369 812 dVAR;
146174a9 813 SV *sv;
814
7918f24d 815 PERL_ARGS_ASSERT_AV_DELETE;
ba5d1d60 816
146174a9 817 if (SvREADONLY(av))
818 Perl_croak(aTHX_ PL_no_modify);
6f12eb6d 819
820 if (SvRMAGICAL(av)) {
35a4481c 821 const MAGIC * const tied_magic = mg_find((SV*)av, PERL_MAGIC_tied);
6f12eb6d 822 if ((tied_magic || mg_find((SV*)av, PERL_MAGIC_regdata))) {
823 /* Handle negative array indices 20020222 MJD */
35a4481c 824 SV **svp;
6f12eb6d 825 if (key < 0) {
826 unsigned adjust_index = 1;
827 if (tied_magic) {
823a54a3 828 SV * const * const negative_indices_glob =
6f12eb6d 829 hv_fetch(SvSTASH(SvRV(SvTIED_obj((SV *)av,
830 tied_magic))),
831 NEGATIVE_INDICES_VAR, 16, 0);
832 if (negative_indices_glob
833 && SvTRUE(GvSV(*negative_indices_glob)))
834 adjust_index = 0;
835 }
836 if (adjust_index) {
837 key += AvFILL(av) + 1;
838 if (key < 0)
fabdb6c0 839 return NULL;
6f12eb6d 840 }
841 }
842 svp = av_fetch(av, key, TRUE);
843 if (svp) {
844 sv = *svp;
845 mg_clear(sv);
846 if (mg_find(sv, PERL_MAGIC_tiedelem)) {
847 sv_unmagic(sv, PERL_MAGIC_tiedelem); /* No longer an element */
848 return sv;
849 }
fabdb6c0 850 return NULL;
6f12eb6d 851 }
852 }
853 }
854
146174a9 855 if (key < 0) {
856 key += AvFILL(av) + 1;
857 if (key < 0)
fabdb6c0 858 return NULL;
146174a9 859 }
6f12eb6d 860
146174a9 861 if (key > AvFILLp(av))
fabdb6c0 862 return NULL;
146174a9 863 else {
a6214072 864 if (!AvREAL(av) && AvREIFY(av))
865 av_reify(av);
146174a9 866 sv = AvARRAY(av)[key];
867 if (key == AvFILLp(av)) {
d9c63288 868 AvARRAY(av)[key] = &PL_sv_undef;
146174a9 869 do {
870 AvFILLp(av)--;
871 } while (--key >= 0 && AvARRAY(av)[key] == &PL_sv_undef);
872 }
873 else
874 AvARRAY(av)[key] = &PL_sv_undef;
875 if (SvSMAGICAL(av))
876 mg_set((SV*)av);
877 }
878 if (flags & G_DISCARD) {
879 SvREFCNT_dec(sv);
fabdb6c0 880 sv = NULL;
146174a9 881 }
fdb3bdd0 882 else if (AvREAL(av))
2c8ddff3 883 sv = sv_2mortal(sv);
146174a9 884 return sv;
885}
886
887/*
f3b76584 888=for apidoc av_exists
889
890Returns true if the element indexed by C<key> has been initialized.
146174a9 891
f3b76584 892This relies on the fact that uninitialized array elements are set to
893C<&PL_sv_undef>.
894
895=cut
896*/
146174a9 897bool
898Perl_av_exists(pTHX_ AV *av, I32 key)
899{
97aff369 900 dVAR;
7918f24d 901 PERL_ARGS_ASSERT_AV_EXISTS;
6f12eb6d 902
903 if (SvRMAGICAL(av)) {
35a4481c 904 const MAGIC * const tied_magic = mg_find((SV*)av, PERL_MAGIC_tied);
6f12eb6d 905 if (tied_magic || mg_find((SV*)av, PERL_MAGIC_regdata)) {
fabdb6c0 906 SV * const sv = sv_newmortal();
6f12eb6d 907 MAGIC *mg;
908 /* Handle negative array indices 20020222 MJD */
909 if (key < 0) {
910 unsigned adjust_index = 1;
911 if (tied_magic) {
823a54a3 912 SV * const * const negative_indices_glob =
6f12eb6d 913 hv_fetch(SvSTASH(SvRV(SvTIED_obj((SV *)av,
914 tied_magic))),
915 NEGATIVE_INDICES_VAR, 16, 0);
916 if (negative_indices_glob
917 && SvTRUE(GvSV(*negative_indices_glob)))
918 adjust_index = 0;
919 }
920 if (adjust_index) {
921 key += AvFILL(av) + 1;
922 if (key < 0)
923 return FALSE;
924 }
925 }
926
927 mg_copy((SV*)av, sv, 0, key);
928 mg = mg_find(sv, PERL_MAGIC_tiedelem);
929 if (mg) {
930 magic_existspack(sv, mg);
931 return (bool)SvTRUE(sv);
932 }
933
934 }
935 }
936
146174a9 937 if (key < 0) {
938 key += AvFILL(av) + 1;
939 if (key < 0)
940 return FALSE;
941 }
6f12eb6d 942
146174a9 943 if (key <= AvFILLp(av) && AvARRAY(av)[key] != &PL_sv_undef
944 && AvARRAY(av)[key])
945 {
946 return TRUE;
947 }
948 else
949 return FALSE;
950}
66610fdd 951
878d132a 952MAGIC *
953S_get_aux_mg(pTHX_ AV *av) {
a3874608 954 dVAR;
ba5d1d60 955 MAGIC *mg;
956
7918f24d 957 PERL_ARGS_ASSERT_GET_AUX_MG;
ba5d1d60 958
959 mg = mg_find((SV*)av, PERL_MAGIC_arylen_p);
a3874608 960
961 if (!mg) {
1b20cd17 962 mg = sv_magicext((SV*)av, 0, PERL_MAGIC_arylen_p, &PL_vtbl_arylen_p,
963 0, 0);
c82c7adc 964 assert(mg);
a3874608 965 /* sv_magicext won't set this for us because we pass in a NULL obj */
966 mg->mg_flags |= MGf_REFCOUNTED;
967 }
878d132a 968 return mg;
969}
970
971SV **
972Perl_av_arylen_p(pTHX_ AV *av) {
973 MAGIC *const mg = get_aux_mg(av);
7918f24d 974
975 PERL_ARGS_ASSERT_AV_ARYLEN_P;
976
a3874608 977 return &(mg->mg_obj);
978}
979
453d94a9 980IV *
878d132a 981Perl_av_iter_p(pTHX_ AV *av) {
982 MAGIC *const mg = get_aux_mg(av);
7918f24d 983
984 PERL_ARGS_ASSERT_AV_ITER_P;
985
453d94a9 986#if IVSIZE == I32SIZE
20bff64c 987 return (IV *)&(mg->mg_len);
453d94a9 988#else
989 if (!mg->mg_ptr) {
156d2b43 990 IV *temp;
453d94a9 991 mg->mg_len = IVSIZE;
156d2b43 992 Newxz(temp, 1, IV);
993 mg->mg_ptr = (char *) temp;
453d94a9 994 }
995 return (IV *)mg->mg_ptr;
996#endif
878d132a 997}
998
66610fdd 999/*
1000 * Local variables:
1001 * c-indentation-style: bsd
1002 * c-basic-offset: 4
1003 * indent-tabs-mode: t
1004 * End:
1005 *
37442d52 1006 * ex: set ts=8 sts=4 sw=4 noet:
1007 */