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