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