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