This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate:
[perl5.git] / av.c
CommitLineData
a0d0e21e 1/* av.c
79072805 2 *
e6906430 3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
31ab2e0d 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) {
065cbbe5 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;
0da6cfda 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 {
0912201f
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
2fe0f101 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:
0912201f 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));
cd7a8267 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
2fe0f101 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;
0912201f 156 MEM_WRAP_CHECK_1(newmax+1, SV*, oom_array_extend);
cd7a8267 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
0da6cfda 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
5b7ea690 194 if (SvRMAGICAL(av)) {
7120cae1 195 const MAGIC * const tied_magic = mg_find((SV*)av, PERL_MAGIC_tied);
5b7ea690
JH
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();
73c86719
JH
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));
5b7ea690
JH
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
5b7ea690 282 if (SvRMAGICAL(av)) {
7120cae1 283 const MAGIC * const tied_magic = mg_find((SV*)av, PERL_MAGIC_tied);
5b7ea690
JH
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);
463ee0b2
LW
361 AvREAL_on(av);
362 AvALLOC(av) = 0;
0da6cfda 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);
a0d0e21e 385 AvFLAGS(av) = AVf_REAL;
5332c881 386 if (size) { /* "defined" was returning undef for size==0 anyway. */
0473add9
AL
387 register SV** ary;
388 register I32 i;
cd7a8267 389 Newx(ary,size,SV*);
573fa4ea 390 AvALLOC(av) = ary;
0da6cfda 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);
cd7a8267 412 Newx(ary,size+1,SV*);
463ee0b2 413 AvALLOC(av) = ary;
79072805 414 Copy(strp,ary,size,SV*);
a0d0e21e 415 AvFLAGS(av) = AVf_REIFY;
0da6cfda 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)) {
0473add9 460 SV** ary = AvARRAY(av);
93965878 461 key = AvFILLp(av) + 1;
a0d0e21e 462 while (key) {
137365c5
JH
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;
137365c5 467 SvREFCNT_dec(sv);
a0d0e21e
LW
468 }
469 }
155aba94 470 if ((key = AvARRAY(av) - AvALLOC(av))) {
463ee0b2 471 AvMAX(av) += key;
0da6cfda 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)) {
8c18bf38 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;
0da6cfda 503 SvPV_set(av, (char*)0);
93965878 504 AvMAX(av) = AvFILLp(av) = -1;
748a9306
LW
505 if (AvARYLEN(av)) {
506 SvREFCNT_dec(AvARYLEN(av));
507 AvARYLEN(av) = 0;
508 }
79072805
LW
509}
510
cb50131a
CB
511/*
512=for apidoc av_push
513
514Pushes an SV onto the end of the array. The array will grow automatically
515to accommodate the addition.
516
517=cut
518*/
519
a0d0e21e 520void
864dbfa3 521Perl_av_push(pTHX_ register AV *av, SV *val)
93965878
NIS
522{
523 MAGIC *mg;
a0d0e21e
LW
524 if (!av)
525 return;
93965878 526 if (SvREADONLY(av))
cea2e8a9 527 Perl_croak(aTHX_ PL_no_modify);
93965878 528
14befaf4 529 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
93965878 530 dSP;
e788e7d3 531 PUSHSTACKi(PERLSI_MAGIC);
924508f0
GS
532 PUSHMARK(SP);
533 EXTEND(SP,2);
33c27489 534 PUSHs(SvTIED_obj((SV*)av, mg));
93965878 535 PUSHs(val);
a60c0954
NIS
536 PUTBACK;
537 ENTER;
864dbfa3 538 call_method("PUSH", G_SCALAR|G_DISCARD);
a60c0954 539 LEAVE;
d3acc0f7 540 POPSTACK;
93965878
NIS
541 return;
542 }
543 av_store(av,AvFILLp(av)+1,val);
79072805
LW
544}
545
cb50131a
CB
546/*
547=for apidoc av_pop
548
549Pops an SV off the end of the array. Returns C<&PL_sv_undef> if the array
550is empty.
551
552=cut
553*/
554
79072805 555SV *
864dbfa3 556Perl_av_pop(pTHX_ register AV *av)
79072805
LW
557{
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
LW
602{
603 register I32 i;
93965878 604 MAGIC* mg;
79072805 605
d19c0e07 606 if (!av)
79072805 607 return;
43fcc5d2 608 if (SvREADONLY(av))
cea2e8a9 609 Perl_croak(aTHX_ PL_no_modify);
93965878 610
14befaf4 611 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
93965878 612 dSP;
e788e7d3 613 PUSHSTACKi(PERLSI_MAGIC);
924508f0
GS
614 PUSHMARK(SP);
615 EXTEND(SP,1+num);
33c27489 616 PUSHs(SvTIED_obj((SV*)av, mg));
93965878 617 while (num-- > 0) {
3280af22 618 PUSHs(&PL_sv_undef);
93965878
NIS
619 }
620 PUTBACK;
a60c0954 621 ENTER;
864dbfa3 622 call_method("UNSHIFT", G_SCALAR|G_DISCARD);
a60c0954 623 LEAVE;
d3acc0f7 624 POPSTACK;
93965878
NIS
625 return;
626 }
627
d19c0e07
MJD
628 if (num <= 0)
629 return;
49beac48
CS
630 if (!AvREAL(av) && AvREIFY(av))
631 av_reify(av);
a0d0e21e
LW
632 i = AvARRAY(av) - AvALLOC(av);
633 if (i) {
634 if (i > num)
635 i = num;
636 num -= i;
637
638 AvMAX(av) += i;
93965878 639 AvFILLp(av) += i;
0da6cfda 640 SvPV_set(av, (char*)(AvARRAY(av) - i));
a0d0e21e 641 }
d2719217 642 if (num) {
8c18bf38
AL
643 register SV **ary;
644 I32 slide;
67a38de0 645 i = AvFILLp(av);
e2b534e7
BT
646 /* Create extra elements */
647 slide = i > 0 ? i : 0;
648 num += slide;
67a38de0 649 av_extend(av, i + num);
93965878 650 AvFILLp(av) += num;
67a38de0
NIS
651 ary = AvARRAY(av);
652 Move(ary, ary + num, i + 1, SV*);
653 do {
3280af22 654 ary[--num] = &PL_sv_undef;
67a38de0 655 } while (num);
e2b534e7
BT
656 /* Make extra elements into a buffer */
657 AvMAX(av) -= slide;
658 AvFILLp(av) -= slide;
0da6cfda 659 SvPV_set(av, (char*)(AvARRAY(av) + slide));
79072805
LW
660 }
661}
662
cb50131a
CB
663/*
664=for apidoc av_shift
665
666Shifts an SV off the beginning of the array.
667
668=cut
669*/
670
79072805 671SV *
864dbfa3 672Perl_av_shift(pTHX_ register AV *av)
79072805
LW
673{
674 SV *retval;
93965878 675 MAGIC* mg;
79072805 676
d19c0e07 677 if (!av)
3280af22 678 return &PL_sv_undef;
43fcc5d2 679 if (SvREADONLY(av))
cea2e8a9 680 Perl_croak(aTHX_ PL_no_modify);
14befaf4 681 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
93965878 682 dSP;
e788e7d3 683 PUSHSTACKi(PERLSI_MAGIC);
924508f0 684 PUSHMARK(SP);
33c27489 685 XPUSHs(SvTIED_obj((SV*)av, mg));
a60c0954
NIS
686 PUTBACK;
687 ENTER;
864dbfa3 688 if (call_method("SHIFT", G_SCALAR)) {
3280af22 689 retval = newSVsv(*PL_stack_sp--);
93965878 690 } else {
3280af22 691 retval = &PL_sv_undef;
a60c0954
NIS
692 }
693 LEAVE;
d3acc0f7 694 POPSTACK;
93965878
NIS
695 return retval;
696 }
d19c0e07
MJD
697 if (AvFILL(av) < 0)
698 return &PL_sv_undef;
463ee0b2 699 retval = *AvARRAY(av);
a0d0e21e 700 if (AvREAL(av))
3280af22 701 *AvARRAY(av) = &PL_sv_undef;
0da6cfda 702 SvPV_set(av, (char*)(AvARRAY(av) + 1));
463ee0b2 703 AvMAX(av)--;
93965878 704 AvFILLp(av)--;
8990e307 705 if (SvSMAGICAL(av))
463ee0b2 706 mg_set((SV*)av);
79072805
LW
707 return retval;
708}
709
cb50131a
CB
710/*
711=for apidoc av_len
712
713Returns the highest index in the array. Returns -1 if the array is
714empty.
715
716=cut
717*/
718
79072805 719I32
864dbfa3 720Perl_av_len(pTHX_ register AV *av)
79072805 721{
463ee0b2 722 return AvFILL(av);
79072805
LW
723}
724
f3b76584
SC
725/*
726=for apidoc av_fill
727
728Ensure than an array has a given number of elements, equivalent to
729Perl's C<$#array = $fill;>.
730
731=cut
732*/
79072805 733void
864dbfa3 734Perl_av_fill(pTHX_ register AV *av, I32 fill)
79072805 735{
93965878 736 MAGIC *mg;
a0d0e21e 737 if (!av)
cea2e8a9 738 Perl_croak(aTHX_ "panic: null array");
79072805
LW
739 if (fill < 0)
740 fill = -1;
14befaf4 741 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
93965878
NIS
742 dSP;
743 ENTER;
744 SAVETMPS;
e788e7d3 745 PUSHSTACKi(PERLSI_MAGIC);
924508f0
GS
746 PUSHMARK(SP);
747 EXTEND(SP,2);
33c27489 748 PUSHs(SvTIED_obj((SV*)av, mg));
a60c0954 749 PUSHs(sv_2mortal(newSViv(fill+1)));
93965878 750 PUTBACK;
864dbfa3 751 call_method("STORESIZE", G_SCALAR|G_DISCARD);
d3acc0f7 752 POPSTACK;
93965878
NIS
753 FREETMPS;
754 LEAVE;
755 return;
756 }
463ee0b2 757 if (fill <= AvMAX(av)) {
93965878 758 I32 key = AvFILLp(av);
a0d0e21e
LW
759 SV** ary = AvARRAY(av);
760
761 if (AvREAL(av)) {
762 while (key > fill) {
763 SvREFCNT_dec(ary[key]);
3280af22 764 ary[key--] = &PL_sv_undef;
a0d0e21e
LW
765 }
766 }
767 else {
768 while (key < fill)
3280af22 769 ary[++key] = &PL_sv_undef;
a0d0e21e
LW
770 }
771
93965878 772 AvFILLp(av) = fill;
8990e307 773 if (SvSMAGICAL(av))
463ee0b2
LW
774 mg_set((SV*)av);
775 }
a0d0e21e 776 else
3280af22 777 (void)av_store(av,fill,&PL_sv_undef);
79072805 778}
c750a3ec 779
f3b76584
SC
780/*
781=for apidoc av_delete
782
783Deletes the element indexed by C<key> from the array. Returns the
13057ebc
DM
784deleted element. If C<flags> equals C<G_DISCARD>, the element is freed
785and null is returned.
f3b76584
SC
786
787=cut
788*/
146174a9
CB
789SV *
790Perl_av_delete(pTHX_ AV *av, I32 key, I32 flags)
791{
792 SV *sv;
793
794 if (!av)
795 return Nullsv;
796 if (SvREADONLY(av))
797 Perl_croak(aTHX_ PL_no_modify);
5b7ea690
JH
798
799 if (SvRMAGICAL(av)) {
7120cae1 800 const MAGIC * const tied_magic = mg_find((SV*)av, PERL_MAGIC_tied);
5b7ea690
JH
801 if ((tied_magic || mg_find((SV*)av, PERL_MAGIC_regdata))) {
802 /* Handle negative array indices 20020222 MJD */
7120cae1 803 SV **svp;
5b7ea690
JH
804 if (key < 0) {
805 unsigned adjust_index = 1;
806 if (tied_magic) {
807 SV **negative_indices_glob =
808 hv_fetch(SvSTASH(SvRV(SvTIED_obj((SV *)av,
809 tied_magic))),
810 NEGATIVE_INDICES_VAR, 16, 0);
811 if (negative_indices_glob
812 && SvTRUE(GvSV(*negative_indices_glob)))
813 adjust_index = 0;
814 }
815 if (adjust_index) {
816 key += AvFILL(av) + 1;
817 if (key < 0)
818 return Nullsv;
819 }
820 }
821 svp = av_fetch(av, key, TRUE);
822 if (svp) {
823 sv = *svp;
824 mg_clear(sv);
825 if (mg_find(sv, PERL_MAGIC_tiedelem)) {
826 sv_unmagic(sv, PERL_MAGIC_tiedelem); /* No longer an element */
827 return sv;
828 }
829 return Nullsv;
830 }
831 }
832 }
833
146174a9
CB
834 if (key < 0) {
835 key += AvFILL(av) + 1;
836 if (key < 0)
837 return Nullsv;
838 }
5b7ea690 839
146174a9
CB
840 if (key > AvFILLp(av))
841 return Nullsv;
842 else {
13057ebc
DM
843 if (!AvREAL(av) && AvREIFY(av))
844 av_reify(av);
146174a9
CB
845 sv = AvARRAY(av)[key];
846 if (key == AvFILLp(av)) {
d9c63288 847 AvARRAY(av)[key] = &PL_sv_undef;
146174a9
CB
848 do {
849 AvFILLp(av)--;
850 } while (--key >= 0 && AvARRAY(av)[key] == &PL_sv_undef);
851 }
852 else
853 AvARRAY(av)[key] = &PL_sv_undef;
854 if (SvSMAGICAL(av))
855 mg_set((SV*)av);
856 }
857 if (flags & G_DISCARD) {
858 SvREFCNT_dec(sv);
859 sv = Nullsv;
860 }
240fcc4a
JC
861 else if (AvREAL(av))
862 sv = sv_2mortal(sv);
146174a9
CB
863 return sv;
864}
865
866/*
f3b76584
SC
867=for apidoc av_exists
868
869Returns true if the element indexed by C<key> has been initialized.
146174a9 870
f3b76584
SC
871This relies on the fact that uninitialized array elements are set to
872C<&PL_sv_undef>.
873
874=cut
875*/
146174a9
CB
876bool
877Perl_av_exists(pTHX_ AV *av, I32 key)
878{
879 if (!av)
880 return FALSE;
5b7ea690
JH
881
882
883 if (SvRMAGICAL(av)) {
7120cae1 884 const MAGIC * const tied_magic = mg_find((SV*)av, PERL_MAGIC_tied);
5b7ea690
JH
885 if (tied_magic || mg_find((SV*)av, PERL_MAGIC_regdata)) {
886 SV *sv = sv_newmortal();
887 MAGIC *mg;
888 /* Handle negative array indices 20020222 MJD */
889 if (key < 0) {
890 unsigned adjust_index = 1;
891 if (tied_magic) {
892 SV **negative_indices_glob =
893 hv_fetch(SvSTASH(SvRV(SvTIED_obj((SV *)av,
894 tied_magic))),
895 NEGATIVE_INDICES_VAR, 16, 0);
896 if (negative_indices_glob
897 && SvTRUE(GvSV(*negative_indices_glob)))
898 adjust_index = 0;
899 }
900 if (adjust_index) {
901 key += AvFILL(av) + 1;
902 if (key < 0)
903 return FALSE;
904 }
905 }
906
907 mg_copy((SV*)av, sv, 0, key);
908 mg = mg_find(sv, PERL_MAGIC_tiedelem);
909 if (mg) {
910 magic_existspack(sv, mg);
911 return (bool)SvTRUE(sv);
912 }
913
914 }
915 }
916
146174a9
CB
917 if (key < 0) {
918 key += AvFILL(av) + 1;
919 if (key < 0)
920 return FALSE;
921 }
5b7ea690 922
146174a9
CB
923 if (key <= AvFILLp(av) && AvARRAY(av)[key] != &PL_sv_undef
924 && AvARRAY(av)[key])
925 {
926 return TRUE;
927 }
928 else
929 return FALSE;
930}
57079c46
GA
931
932/* AVHV: Support for treating arrays as if they were hashes. The
933 * first element of the array should be a hash reference that maps
934 * hash keys to array indices.
935 */
936
72311751 937STATIC I32
cea2e8a9 938S_avhv_index_sv(pTHX_ SV* sv)
57079c46
GA
939{
940 I32 index = SvIV(sv);
941 if (index < 1)
cea2e8a9 942 Perl_croak(aTHX_ "Bad index while coercing array into hash");
57079c46
GA
943 return index;
944}
945
10c8fecd
GS
946STATIC I32
947S_avhv_index(pTHX_ AV *av, SV *keysv, U32 hash)
948{
949 HV *keys;
950 HE *he;
951 STRLEN n_a;
952
953 keys = avhv_keys(av);
954 he = hv_fetch_ent(keys, keysv, FALSE, hash);
955 if (!he)
956 Perl_croak(aTHX_ "No such pseudo-hash field \"%s\"", SvPV(keysv,n_a));
957 return avhv_index_sv(HeVAL(he));
958}
959
5d5aaa5e 960HV*
864dbfa3 961Perl_avhv_keys(pTHX_ AV *av)
5d5aaa5e 962{
57079c46 963 SV **keysp = av_fetch(av, 0, FALSE);
5d5aaa5e 964 if (keysp) {
d627ae4e
MB
965 SV *sv = *keysp;
966 if (SvGMAGICAL(sv))
967 mg_get(sv);
968 if (SvROK(sv)) {
db7db7ca 969 if (ckWARN(WARN_DEPRECATED) && !sv_isa(sv, "pseudohash"))
557f9ce7 970 Perl_warner(aTHX_ packWARN(WARN_DEPRECATED),
db7db7ca 971 "Pseudo-hashes are deprecated");
d627ae4e
MB
972 sv = SvRV(sv);
973 if (SvTYPE(sv) == SVt_PVHV)
57079c46 974 return (HV*)sv;
5d5aaa5e
JP
975 }
976 }
cea2e8a9 977 Perl_croak(aTHX_ "Can't coerce array into hash");
72311751 978 return Nullhv;
c750a3ec
MB
979}
980
981SV**
10c8fecd
GS
982Perl_avhv_store_ent(pTHX_ AV *av, SV *keysv, SV *val, U32 hash)
983{
984 return av_store(av, avhv_index(av, keysv, hash), val);
985}
986
987SV**
864dbfa3 988Perl_avhv_fetch_ent(pTHX_ AV *av, SV *keysv, I32 lval, U32 hash)
97fcbf96 989{
10c8fecd 990 return av_fetch(av, avhv_index(av, keysv, hash), lval);
5bc6513d
MB
991}
992
146174a9
CB
993SV *
994Perl_avhv_delete_ent(pTHX_ AV *av, SV *keysv, I32 flags, U32 hash)
995{
996 HV *keys = avhv_keys(av);
997 HE *he;
998
999 he = hv_fetch_ent(keys, keysv, FALSE, hash);
1000 if (!he || !SvOK(HeVAL(he)))
1001 return Nullsv;
1002
1003 return av_delete(av, avhv_index_sv(HeVAL(he)), flags);
1004}
1005
1006/* Check for the existence of an element named by a given key.
1007 *
1008 */
c750a3ec 1009bool
864dbfa3 1010Perl_avhv_exists_ent(pTHX_ AV *av, SV *keysv, U32 hash)
97fcbf96 1011{
5d5aaa5e 1012 HV *keys = avhv_keys(av);
146174a9
CB
1013 HE *he;
1014
1015 he = hv_fetch_ent(keys, keysv, FALSE, hash);
1016 if (!he || !SvOK(HeVAL(he)))
1017 return FALSE;
1018
1019 return av_exists(av, avhv_index_sv(HeVAL(he)));
97fcbf96
MB
1020}
1021
c750a3ec 1022HE *
864dbfa3 1023Perl_avhv_iternext(pTHX_ AV *av)
c750a3ec 1024{
5d5aaa5e
JP
1025 HV *keys = avhv_keys(av);
1026 return hv_iternext(keys);
c750a3ec
MB
1027}
1028
1029SV *
864dbfa3 1030Perl_avhv_iterval(pTHX_ AV *av, register HE *entry)
c750a3ec 1031{
57079c46
GA
1032 SV *sv = hv_iterval(avhv_keys(av), entry);
1033 return *av_fetch(av, avhv_index_sv(sv), TRUE);
c750a3ec 1034}
d8294a4d
NC
1035
1036/*
1037 * Local variables:
1038 * c-indentation-style: bsd
1039 * c-basic-offset: 4
1040 * indent-tabs-mode: t
1041 * End:
1042 *
1043 * ex: set ts=8 sts=4 sw=4 noet:
1044 */