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