This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Add note for BLEAD point release to release_managers_guide.pod
[perl5.git] / av.c
... / ...
CommitLineData
1/* av.c
2 *
3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4 * 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
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 *
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
14 *
15 * [p.476 of _The Lord of the Rings_, III/iv: "Treebeard"]
16 */
17
18/*
19=head1 Array Manipulation Functions
20*/
21
22#include "EXTERN.h"
23#define PERL_IN_AV_C
24#include "perl.h"
25
26void
27Perl_av_reify(pTHX_ AV *av)
28{
29 SSize_t key;
30
31 PERL_ARGS_ASSERT_AV_REIFY;
32 assert(SvTYPE(av) == SVt_PVAV);
33
34 if (AvREAL(av))
35 return;
36#ifdef DEBUGGING
37 if (SvTIED_mg((const SV *)av, PERL_MAGIC_tied))
38 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "av_reify called on tied array");
39#endif
40 key = AvMAX(av) + 1;
41 while (key > AvFILLp(av) + 1)
42 AvARRAY(av)[--key] = NULL;
43 while (key) {
44 SV * const sv = AvARRAY(av)[--key];
45 if (sv != &PL_sv_undef)
46 SvREFCNT_inc_simple_void(sv);
47 }
48 key = AvARRAY(av) - AvALLOC(av);
49 while (key)
50 AvALLOC(av)[--key] = NULL;
51 AvREIFY_off(av);
52 AvREAL_on(av);
53}
54
55/*
56=for apidoc av_extend
57
58Pre-extend an array. The C<key> is the index to which the array should be
59extended.
60
61=cut
62*/
63
64void
65Perl_av_extend(pTHX_ AV *av, SSize_t key)
66{
67 MAGIC *mg;
68
69 PERL_ARGS_ASSERT_AV_EXTEND;
70 assert(SvTYPE(av) == SVt_PVAV);
71
72 mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied);
73 if (mg) {
74 SV *arg1 = sv_newmortal();
75 sv_setiv(arg1, (IV)(key + 1));
76 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(EXTEND), G_DISCARD, 1,
77 arg1);
78 return;
79 }
80 av_extend_guts(av,key,&AvMAX(av),&AvALLOC(av),&AvARRAY(av));
81}
82
83/* The guts of av_extend. *Not* for general use! */
84void
85Perl_av_extend_guts(pTHX_ AV *av, SSize_t key, SSize_t *maxp, SV ***allocp,
86 SV ***arrayp)
87{
88 PERL_ARGS_ASSERT_AV_EXTEND_GUTS;
89
90 if (key < -1) /* -1 is legal */
91 Perl_croak(aTHX_
92 "panic: av_extend_guts() negative count (%" IVdf ")", (IV)key);
93
94 if (key > *maxp) {
95 SV** ary;
96 SSize_t tmp;
97 SSize_t newmax;
98
99 if (av && *allocp != *arrayp) {
100 ary = *allocp + AvFILLp(av) + 1;
101 tmp = *arrayp - *allocp;
102 Move(*arrayp, *allocp, AvFILLp(av)+1, SV*);
103 *maxp += tmp;
104 *arrayp = *allocp;
105 if (AvREAL(av)) {
106 while (tmp)
107 ary[--tmp] = NULL;
108 }
109 if (key > *maxp - 10) {
110 newmax = key + *maxp;
111 goto resize;
112 }
113 }
114 else {
115 if (*allocp) {
116
117#ifdef Perl_safesysmalloc_size
118 /* Whilst it would be quite possible to move this logic around
119 (as I did in the SV code), so as to set AvMAX(av) early,
120 based on calling Perl_safesysmalloc_size() immediately after
121 allocation, I'm not convinced that it is a great idea here.
122 In an array we have to loop round setting everything to
123 NULL, which means writing to memory, potentially lots
124 of it, whereas for the SV buffer case we don't touch the
125 "bonus" memory. So there there is no cost in telling the
126 world about it, whereas here we have to do work before we can
127 tell the world about it, and that work involves writing to
128 memory that might never be read. So, I feel, better to keep
129 the current lazy system of only writing to it if our caller
130 has a need for more space. NWC */
131 newmax = Perl_safesysmalloc_size((void*)*allocp) /
132 sizeof(const SV *) - 1;
133
134 if (key <= newmax)
135 goto resized;
136#endif
137 /* overflow-safe version of newmax = key + *maxp/5 */
138 newmax = *maxp / 5;
139 newmax = (key > SSize_t_MAX - newmax)
140 ? SSize_t_MAX : key + newmax;
141 resize:
142 {
143 /* it should really be newmax+1 here, but if newmax
144 * happens to equal SSize_t_MAX, then newmax+1 is
145 * undefined. This means technically we croak one
146 * index lower than we should in theory; in practice
147 * its unlikely the system has SSize_t_MAX/sizeof(SV*)
148 * bytes to spare! */
149 MEM_WRAP_CHECK_s(newmax, SV*, "Out of memory during array extend");
150 }
151#ifdef STRESS_REALLOC
152 {
153 SV ** const old_alloc = *allocp;
154 Newx(*allocp, newmax+1, SV*);
155 Copy(old_alloc, *allocp, *maxp + 1, SV*);
156 Safefree(old_alloc);
157 }
158#else
159 Renew(*allocp,newmax+1, SV*);
160#endif
161#ifdef Perl_safesysmalloc_size
162 resized:
163#endif
164 ary = *allocp + *maxp + 1;
165 tmp = newmax - *maxp;
166 if (av == PL_curstack) { /* Oops, grew stack (via av_store()?) */
167 PL_stack_sp = *allocp + (PL_stack_sp - PL_stack_base);
168 PL_stack_base = *allocp;
169 PL_stack_max = PL_stack_base + newmax;
170 }
171 }
172 else {
173 newmax = key < 3 ? 3 : key;
174 {
175 /* see comment above about newmax+1*/
176 MEM_WRAP_CHECK_s(newmax, SV*, "Out of memory during array extend");
177 }
178 Newx(*allocp, newmax+1, SV*);
179 ary = *allocp + 1;
180 tmp = newmax;
181 *allocp[0] = NULL; /* For the stacks */
182 }
183 if (av && AvREAL(av)) {
184 while (tmp)
185 ary[--tmp] = NULL;
186 }
187
188 *arrayp = *allocp;
189 *maxp = newmax;
190 }
191 }
192}
193
194/*
195=for apidoc av_fetch
196
197Returns the SV at the specified index in the array. The C<key> is the
198index. If lval is true, you are guaranteed to get a real SV back (in case
199it wasn't real before), which you can then modify. Check that the return
200value is non-null before dereferencing it to a C<SV*>.
201
202See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
203more information on how to use this function on tied arrays.
204
205The rough perl equivalent is C<$myarray[$key]>.
206
207=cut
208*/
209
210static bool
211S_adjust_index(pTHX_ AV *av, const MAGIC *mg, SSize_t *keyp)
212{
213 bool adjust_index = 1;
214 if (mg) {
215 /* Handle negative array indices 20020222 MJD */
216 SV * const ref = SvTIED_obj(MUTABLE_SV(av), mg);
217 SvGETMAGIC(ref);
218 if (SvROK(ref) && SvOBJECT(SvRV(ref))) {
219 SV * const * const negative_indices_glob =
220 hv_fetchs(SvSTASH(SvRV(ref)), NEGATIVE_INDICES_VAR, 0);
221
222 if (negative_indices_glob && isGV(*negative_indices_glob)
223 && SvTRUE(GvSV(*negative_indices_glob)))
224 adjust_index = 0;
225 }
226 }
227
228 if (adjust_index) {
229 *keyp += AvFILL(av) + 1;
230 if (*keyp < 0)
231 return FALSE;
232 }
233 return TRUE;
234}
235
236SV**
237Perl_av_fetch(pTHX_ AV *av, SSize_t key, I32 lval)
238{
239 SSize_t neg;
240 SSize_t size;
241
242 PERL_ARGS_ASSERT_AV_FETCH;
243 assert(SvTYPE(av) == SVt_PVAV);
244
245 if (UNLIKELY(SvRMAGICAL(av))) {
246 const MAGIC * const tied_magic
247 = mg_find((const SV *)av, PERL_MAGIC_tied);
248 if (tied_magic || mg_find((const SV *)av, PERL_MAGIC_regdata)) {
249 SV *sv;
250 if (key < 0) {
251 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
252 return NULL;
253 }
254
255 sv = sv_newmortal();
256 sv_upgrade(sv, SVt_PVLV);
257 mg_copy(MUTABLE_SV(av), sv, 0, key);
258 if (!tied_magic) /* for regdata, force leavesub to make copies */
259 SvTEMP_off(sv);
260 LvTYPE(sv) = 't';
261 LvTARG(sv) = sv; /* fake (SV**) */
262 return &(LvTARG(sv));
263 }
264 }
265
266 neg = (key < 0);
267 size = AvFILLp(av) + 1;
268 key += neg * size; /* handle negative index without using branch */
269
270 /* the cast from SSize_t to Size_t allows both (key < 0) and (key >= size)
271 * to be tested as a single condition */
272 if ((Size_t)key >= (Size_t)size) {
273 if (UNLIKELY(neg))
274 return NULL;
275 goto emptyness;
276 }
277
278 if (!AvARRAY(av)[key]) {
279 emptyness:
280 return lval ? av_store(av,key,newSV(0)) : NULL;
281 }
282
283 return &AvARRAY(av)[key];
284}
285
286/*
287=for apidoc av_store
288
289Stores an SV in an array. The array index is specified as C<key>. The
290return value will be C<NULL> if the operation failed or if the value did not
291need to be actually stored within the array (as in the case of tied
292arrays). Otherwise, it can be dereferenced
293to get the C<SV*> that was stored
294there (= C<val>)).
295
296Note that the caller is responsible for suitably incrementing the reference
297count of C<val> before the call, and decrementing it if the function
298returned C<NULL>.
299
300Approximate Perl equivalent: C<splice(@myarray, $key, 1, $val)>.
301
302See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
303more information on how to use this function on tied arrays.
304
305=cut
306*/
307
308SV**
309Perl_av_store(pTHX_ AV *av, SSize_t key, SV *val)
310{
311 SV** ary;
312
313 PERL_ARGS_ASSERT_AV_STORE;
314 assert(SvTYPE(av) == SVt_PVAV);
315
316 /* S_regclass relies on being able to pass in a NULL sv
317 (unicode_alternate may be NULL).
318 */
319
320 if (SvRMAGICAL(av)) {
321 const MAGIC * const tied_magic = mg_find((const SV *)av, PERL_MAGIC_tied);
322 if (tied_magic) {
323 if (key < 0) {
324 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
325 return 0;
326 }
327 if (val) {
328 mg_copy(MUTABLE_SV(av), val, 0, key);
329 }
330 return NULL;
331 }
332 }
333
334
335 if (key < 0) {
336 key += AvFILL(av) + 1;
337 if (key < 0)
338 return NULL;
339 }
340
341 if (SvREADONLY(av) && key >= AvFILL(av))
342 Perl_croak_no_modify();
343
344 if (!AvREAL(av) && AvREIFY(av))
345 av_reify(av);
346 if (key > AvMAX(av))
347 av_extend(av,key);
348 ary = AvARRAY(av);
349 if (AvFILLp(av) < key) {
350 if (!AvREAL(av)) {
351 if (av == PL_curstack && key > PL_stack_sp - PL_stack_base)
352 PL_stack_sp = PL_stack_base + key; /* XPUSH in disguise */
353 do {
354 ary[++AvFILLp(av)] = NULL;
355 } while (AvFILLp(av) < key);
356 }
357 AvFILLp(av) = key;
358 }
359 else if (AvREAL(av))
360 SvREFCNT_dec(ary[key]);
361 ary[key] = val;
362 if (SvSMAGICAL(av)) {
363 const MAGIC *mg = SvMAGIC(av);
364 bool set = TRUE;
365 for (; mg; mg = mg->mg_moremagic) {
366 if (!isUPPER(mg->mg_type)) continue;
367 if (val) {
368 sv_magic(val, MUTABLE_SV(av), toLOWER(mg->mg_type), 0, key);
369 }
370 if (PL_delaymagic && mg->mg_type == PERL_MAGIC_isa) {
371 PL_delaymagic |= DM_ARRAY_ISA;
372 set = FALSE;
373 }
374 }
375 if (set)
376 mg_set(MUTABLE_SV(av));
377 }
378 return &ary[key];
379}
380
381/*
382=for apidoc av_make
383
384Creates a new AV and populates it with a list of SVs. The SVs are copied
385into the array, so they may be freed after the call to C<av_make>. The new AV
386will have a reference count of 1.
387
388Perl equivalent: C<my @new_array = ($scalar1, $scalar2, $scalar3...);>
389
390=cut
391*/
392
393AV *
394Perl_av_make(pTHX_ SSize_t size, SV **strp)
395{
396 AV * const av = MUTABLE_AV(newSV_type(SVt_PVAV));
397 /* sv_upgrade does AvREAL_only() */
398 PERL_ARGS_ASSERT_AV_MAKE;
399 assert(SvTYPE(av) == SVt_PVAV);
400
401 if (size) { /* "defined" was returning undef for size==0 anyway. */
402 SV** ary;
403 SSize_t i;
404 SSize_t orig_ix;
405
406 Newx(ary,size,SV*);
407 AvALLOC(av) = ary;
408 AvARRAY(av) = ary;
409 AvMAX(av) = size - 1;
410 AvFILLp(av) = -1;
411 /* avoid av being leaked if croak when calling magic below */
412 EXTEND_MORTAL(1);
413 PL_tmps_stack[++PL_tmps_ix] = (SV*)av;
414 orig_ix = PL_tmps_ix;
415
416 for (i = 0; i < size; i++) {
417 assert (*strp);
418
419 /* Don't let sv_setsv swipe, since our source array might
420 have multiple references to the same temp scalar (e.g.
421 from a list slice) */
422
423 SvGETMAGIC(*strp); /* before newSV, in case it dies */
424 AvFILLp(av)++;
425 ary[i] = newSV(0);
426 sv_setsv_flags(ary[i], *strp,
427 SV_DO_COW_SVSETSV|SV_NOSTEAL);
428 strp++;
429 }
430 /* disarm av's leak guard */
431 if (LIKELY(PL_tmps_ix == orig_ix))
432 PL_tmps_ix--;
433 else
434 PL_tmps_stack[orig_ix] = &PL_sv_undef;
435 }
436 return av;
437}
438
439/*
440=for apidoc av_clear
441
442Frees the all the elements of an array, leaving it empty.
443The XS equivalent of C<@array = ()>. See also L</av_undef>.
444
445Note that it is possible that the actions of a destructor called directly
446or indirectly by freeing an element of the array could cause the reference
447count of the array itself to be reduced (e.g. by deleting an entry in the
448symbol table). So it is a possibility that the AV could have been freed
449(or even reallocated) on return from the call unless you hold a reference
450to it.
451
452=cut
453*/
454
455void
456Perl_av_clear(pTHX_ AV *av)
457{
458 SSize_t extra;
459 bool real;
460 SSize_t orig_ix = 0;
461
462 PERL_ARGS_ASSERT_AV_CLEAR;
463 assert(SvTYPE(av) == SVt_PVAV);
464
465#ifdef DEBUGGING
466 if (SvREFCNT(av) == 0) {
467 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "Attempt to clear deleted array");
468 }
469#endif
470
471 if (SvREADONLY(av))
472 Perl_croak_no_modify();
473
474 /* Give any tie a chance to cleanup first */
475 if (SvRMAGICAL(av)) {
476 const MAGIC* const mg = SvMAGIC(av);
477 if (PL_delaymagic && mg && mg->mg_type == PERL_MAGIC_isa)
478 PL_delaymagic |= DM_ARRAY_ISA;
479 else
480 mg_clear(MUTABLE_SV(av));
481 }
482
483 if (AvMAX(av) < 0)
484 return;
485
486 if ((real = cBOOL(AvREAL(av)))) {
487 SV** const ary = AvARRAY(av);
488 SSize_t index = AvFILLp(av) + 1;
489
490 /* avoid av being freed when calling destructors below */
491 EXTEND_MORTAL(1);
492 PL_tmps_stack[++PL_tmps_ix] = SvREFCNT_inc_simple_NN(av);
493 orig_ix = PL_tmps_ix;
494
495 while (index) {
496 SV * const sv = ary[--index];
497 /* undef the slot before freeing the value, because a
498 * destructor might try to modify this array */
499 ary[index] = NULL;
500 SvREFCNT_dec(sv);
501 }
502 }
503 extra = AvARRAY(av) - AvALLOC(av);
504 if (extra) {
505 AvMAX(av) += extra;
506 AvARRAY(av) = AvALLOC(av);
507 }
508 AvFILLp(av) = -1;
509 if (real) {
510 /* disarm av's premature free guard */
511 if (LIKELY(PL_tmps_ix == orig_ix))
512 PL_tmps_ix--;
513 else
514 PL_tmps_stack[orig_ix] = &PL_sv_undef;
515 SvREFCNT_dec_NN(av);
516 }
517}
518
519/*
520=for apidoc av_undef
521
522Undefines the array. The XS equivalent of C<undef(@array)>.
523
524As well as freeing all the elements of the array (like C<av_clear()>), this
525also frees the memory used by the av to store its list of scalars.
526
527See L</av_clear> for a note about the array possibly being invalid on
528return.
529
530=cut
531*/
532
533void
534Perl_av_undef(pTHX_ AV *av)
535{
536 bool real;
537 SSize_t orig_ix = PL_tmps_ix; /* silence bogus warning about possible unitialized use */
538
539 PERL_ARGS_ASSERT_AV_UNDEF;
540 assert(SvTYPE(av) == SVt_PVAV);
541
542 /* Give any tie a chance to cleanup first */
543 if (SvTIED_mg((const SV *)av, PERL_MAGIC_tied))
544 av_fill(av, -1);
545
546 real = cBOOL(AvREAL(av));
547 if (real) {
548 SSize_t key = AvFILLp(av) + 1;
549
550 /* avoid av being freed when calling destructors below */
551 EXTEND_MORTAL(1);
552 PL_tmps_stack[++PL_tmps_ix] = SvREFCNT_inc_simple_NN(av);
553 orig_ix = PL_tmps_ix;
554
555 while (key)
556 SvREFCNT_dec(AvARRAY(av)[--key]);
557 }
558
559 Safefree(AvALLOC(av));
560 AvALLOC(av) = NULL;
561 AvARRAY(av) = NULL;
562 AvMAX(av) = AvFILLp(av) = -1;
563
564 if(SvRMAGICAL(av)) mg_clear(MUTABLE_SV(av));
565 if (real) {
566 /* disarm av's premature free guard */
567 if (LIKELY(PL_tmps_ix == orig_ix))
568 PL_tmps_ix--;
569 else
570 PL_tmps_stack[orig_ix] = &PL_sv_undef;
571 SvREFCNT_dec_NN(av);
572 }
573}
574
575/*
576
577=for apidoc av_create_and_push
578
579Push an SV onto the end of the array, creating the array if necessary.
580A small internal helper function to remove a commonly duplicated idiom.
581
582=cut
583*/
584
585void
586Perl_av_create_and_push(pTHX_ AV **const avp, SV *const val)
587{
588 PERL_ARGS_ASSERT_AV_CREATE_AND_PUSH;
589
590 if (!*avp)
591 *avp = newAV();
592 av_push(*avp, val);
593}
594
595/*
596=for apidoc av_push
597
598Pushes an SV (transferring control of one reference count) onto the end of the
599array. The array will grow automatically to accommodate the addition.
600
601Perl equivalent: C<push @myarray, $val;>.
602
603=cut
604*/
605
606void
607Perl_av_push(pTHX_ AV *av, SV *val)
608{
609 MAGIC *mg;
610
611 PERL_ARGS_ASSERT_AV_PUSH;
612 assert(SvTYPE(av) == SVt_PVAV);
613
614 if (SvREADONLY(av))
615 Perl_croak_no_modify();
616
617 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
618 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(PUSH), G_DISCARD, 1,
619 val);
620 return;
621 }
622 av_store(av,AvFILLp(av)+1,val);
623}
624
625/*
626=for apidoc av_pop
627
628Removes one SV from the end of the array, reducing its size by one and
629returning the SV (transferring control of one reference count) to the
630caller. Returns C<&PL_sv_undef> if the array is empty.
631
632Perl equivalent: C<pop(@myarray);>
633
634=cut
635*/
636
637SV *
638Perl_av_pop(pTHX_ AV *av)
639{
640 SV *retval;
641 MAGIC* mg;
642
643 PERL_ARGS_ASSERT_AV_POP;
644 assert(SvTYPE(av) == SVt_PVAV);
645
646 if (SvREADONLY(av))
647 Perl_croak_no_modify();
648 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
649 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(POP), 0, 0);
650 if (retval)
651 retval = newSVsv(retval);
652 return retval;
653 }
654 if (AvFILL(av) < 0)
655 return &PL_sv_undef;
656 retval = AvARRAY(av)[AvFILLp(av)];
657 AvARRAY(av)[AvFILLp(av)--] = NULL;
658 if (SvSMAGICAL(av))
659 mg_set(MUTABLE_SV(av));
660 return retval ? retval : &PL_sv_undef;
661}
662
663/*
664
665=for apidoc av_create_and_unshift_one
666
667Unshifts an SV onto the beginning of the array, creating the array if
668necessary.
669A small internal helper function to remove a commonly duplicated idiom.
670
671=cut
672*/
673
674SV **
675Perl_av_create_and_unshift_one(pTHX_ AV **const avp, SV *const val)
676{
677 PERL_ARGS_ASSERT_AV_CREATE_AND_UNSHIFT_ONE;
678
679 if (!*avp)
680 *avp = newAV();
681 av_unshift(*avp, 1);
682 return av_store(*avp, 0, val);
683}
684
685/*
686=for apidoc av_unshift
687
688Unshift the given number of C<undef> values onto the beginning of the
689array. The array will grow automatically to accommodate the addition.
690
691Perl equivalent: S<C<unshift @myarray, ((undef) x $num);>>
692
693=cut
694*/
695
696void
697Perl_av_unshift(pTHX_ AV *av, SSize_t num)
698{
699 SSize_t i;
700 MAGIC* mg;
701
702 PERL_ARGS_ASSERT_AV_UNSHIFT;
703 assert(SvTYPE(av) == SVt_PVAV);
704
705 if (SvREADONLY(av))
706 Perl_croak_no_modify();
707
708 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
709 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(UNSHIFT),
710 G_DISCARD | G_UNDEF_FILL, num);
711 return;
712 }
713
714 if (num <= 0)
715 return;
716 if (!AvREAL(av) && AvREIFY(av))
717 av_reify(av);
718 i = AvARRAY(av) - AvALLOC(av);
719 if (i) {
720 if (i > num)
721 i = num;
722 num -= i;
723
724 AvMAX(av) += i;
725 AvFILLp(av) += i;
726 AvARRAY(av) = AvARRAY(av) - i;
727 }
728 if (num) {
729 SV **ary;
730 const SSize_t i = AvFILLp(av);
731 /* Create extra elements */
732 const SSize_t slide = i > 0 ? i : 0;
733 num += slide;
734 av_extend(av, i + num);
735 AvFILLp(av) += num;
736 ary = AvARRAY(av);
737 Move(ary, ary + num, i + 1, SV*);
738 do {
739 ary[--num] = NULL;
740 } while (num);
741 /* Make extra elements into a buffer */
742 AvMAX(av) -= slide;
743 AvFILLp(av) -= slide;
744 AvARRAY(av) = AvARRAY(av) + slide;
745 }
746}
747
748/*
749=for apidoc av_shift
750
751Removes one SV from the start of the array, reducing its size by one and
752returning the SV (transferring control of one reference count) to the
753caller. Returns C<&PL_sv_undef> if the array is empty.
754
755Perl equivalent: C<shift(@myarray);>
756
757=cut
758*/
759
760SV *
761Perl_av_shift(pTHX_ AV *av)
762{
763 SV *retval;
764 MAGIC* mg;
765
766 PERL_ARGS_ASSERT_AV_SHIFT;
767 assert(SvTYPE(av) == SVt_PVAV);
768
769 if (SvREADONLY(av))
770 Perl_croak_no_modify();
771 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
772 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(SHIFT), 0, 0);
773 if (retval)
774 retval = newSVsv(retval);
775 return retval;
776 }
777 if (AvFILL(av) < 0)
778 return &PL_sv_undef;
779 retval = *AvARRAY(av);
780 if (AvREAL(av))
781 *AvARRAY(av) = NULL;
782 AvARRAY(av) = AvARRAY(av) + 1;
783 AvMAX(av)--;
784 AvFILLp(av)--;
785 if (SvSMAGICAL(av))
786 mg_set(MUTABLE_SV(av));
787 return retval ? retval : &PL_sv_undef;
788}
789
790/*
791=for apidoc av_top_index
792
793Returns the highest index in the array. The number of elements in the
794array is S<C<av_top_index(av) + 1>>. Returns -1 if the array is empty.
795
796The Perl equivalent for this is C<$#myarray>.
797
798(A slightly shorter form is C<av_tindex>.)
799
800=for apidoc av_len
801
802Same as L</av_top_index>. Note that, unlike what the name implies, it returns
803the highest index in the array, so to get the size of the array you need to use
804S<C<av_len(av) + 1>>. This is unlike L</sv_len>, which returns what you would
805expect.
806
807=cut
808*/
809
810SSize_t
811Perl_av_len(pTHX_ AV *av)
812{
813 PERL_ARGS_ASSERT_AV_LEN;
814
815 return av_top_index(av);
816}
817
818/*
819=for apidoc av_fill
820
821Set the highest index in the array to the given number, equivalent to
822Perl's S<C<$#array = $fill;>>.
823
824The number of elements in the array will be S<C<fill + 1>> after
825C<av_fill()> returns. If the array was previously shorter, then the
826additional elements appended are set to NULL. If the array
827was longer, then the excess elements are freed. S<C<av_fill(av, -1)>> is
828the same as C<av_clear(av)>.
829
830=cut
831*/
832void
833Perl_av_fill(pTHX_ AV *av, SSize_t fill)
834{
835 MAGIC *mg;
836
837 PERL_ARGS_ASSERT_AV_FILL;
838 assert(SvTYPE(av) == SVt_PVAV);
839
840 if (fill < 0)
841 fill = -1;
842 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
843 SV *arg1 = sv_newmortal();
844 sv_setiv(arg1, (IV)(fill + 1));
845 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(STORESIZE), G_DISCARD,
846 1, arg1);
847 return;
848 }
849 if (fill <= AvMAX(av)) {
850 SSize_t key = AvFILLp(av);
851 SV** const ary = AvARRAY(av);
852
853 if (AvREAL(av)) {
854 while (key > fill) {
855 SvREFCNT_dec(ary[key]);
856 ary[key--] = NULL;
857 }
858 }
859 else {
860 while (key < fill)
861 ary[++key] = NULL;
862 }
863
864 AvFILLp(av) = fill;
865 if (SvSMAGICAL(av))
866 mg_set(MUTABLE_SV(av));
867 }
868 else
869 (void)av_store(av,fill,NULL);
870}
871
872/*
873=for apidoc av_delete
874
875Deletes the element indexed by C<key> from the array, makes the element
876mortal, and returns it. If C<flags> equals C<G_DISCARD>, the element is
877freed and NULL is returned. NULL is also returned if C<key> is out of
878range.
879
880Perl equivalent: S<C<splice(@myarray, $key, 1, undef)>> (with the
881C<splice> in void context if C<G_DISCARD> is present).
882
883=cut
884*/
885SV *
886Perl_av_delete(pTHX_ AV *av, SSize_t key, I32 flags)
887{
888 SV *sv;
889
890 PERL_ARGS_ASSERT_AV_DELETE;
891 assert(SvTYPE(av) == SVt_PVAV);
892
893 if (SvREADONLY(av))
894 Perl_croak_no_modify();
895
896 if (SvRMAGICAL(av)) {
897 const MAGIC * const tied_magic
898 = mg_find((const SV *)av, PERL_MAGIC_tied);
899 if ((tied_magic || mg_find((const SV *)av, PERL_MAGIC_regdata))) {
900 SV **svp;
901 if (key < 0) {
902 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
903 return NULL;
904 }
905 svp = av_fetch(av, key, TRUE);
906 if (svp) {
907 sv = *svp;
908 mg_clear(sv);
909 if (mg_find(sv, PERL_MAGIC_tiedelem)) {
910 sv_unmagic(sv, PERL_MAGIC_tiedelem); /* No longer an element */
911 return sv;
912 }
913 return NULL;
914 }
915 }
916 }
917
918 if (key < 0) {
919 key += AvFILL(av) + 1;
920 if (key < 0)
921 return NULL;
922 }
923
924 if (key > AvFILLp(av))
925 return NULL;
926 else {
927 if (!AvREAL(av) && AvREIFY(av))
928 av_reify(av);
929 sv = AvARRAY(av)[key];
930 AvARRAY(av)[key] = NULL;
931 if (key == AvFILLp(av)) {
932 do {
933 AvFILLp(av)--;
934 } while (--key >= 0 && !AvARRAY(av)[key]);
935 }
936 if (SvSMAGICAL(av))
937 mg_set(MUTABLE_SV(av));
938 }
939 if(sv != NULL) {
940 if (flags & G_DISCARD) {
941 SvREFCNT_dec_NN(sv);
942 return NULL;
943 }
944 else if (AvREAL(av))
945 sv_2mortal(sv);
946 }
947 return sv;
948}
949
950/*
951=for apidoc av_exists
952
953Returns true if the element indexed by C<key> has been initialized.
954
955This relies on the fact that uninitialized array elements are set to
956C<NULL>.
957
958Perl equivalent: C<exists($myarray[$key])>.
959
960=cut
961*/
962bool
963Perl_av_exists(pTHX_ AV *av, SSize_t key)
964{
965 PERL_ARGS_ASSERT_AV_EXISTS;
966 assert(SvTYPE(av) == SVt_PVAV);
967
968 if (SvRMAGICAL(av)) {
969 const MAGIC * const tied_magic
970 = mg_find((const SV *)av, PERL_MAGIC_tied);
971 const MAGIC * const regdata_magic
972 = mg_find((const SV *)av, PERL_MAGIC_regdata);
973 if (tied_magic || regdata_magic) {
974 MAGIC *mg;
975 /* Handle negative array indices 20020222 MJD */
976 if (key < 0) {
977 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
978 return FALSE;
979 }
980
981 if(key >= 0 && regdata_magic) {
982 if (key <= AvFILL(av))
983 return TRUE;
984 else
985 return FALSE;
986 }
987 {
988 SV * const sv = sv_newmortal();
989 mg_copy(MUTABLE_SV(av), sv, 0, key);
990 mg = mg_find(sv, PERL_MAGIC_tiedelem);
991 if (mg) {
992 magic_existspack(sv, mg);
993 {
994 I32 retbool = SvTRUE_nomg_NN(sv);
995 return cBOOL(retbool);
996 }
997 }
998 }
999 }
1000 }
1001
1002 if (key < 0) {
1003 key += AvFILL(av) + 1;
1004 if (key < 0)
1005 return FALSE;
1006 }
1007
1008 if (key <= AvFILLp(av) && AvARRAY(av)[key])
1009 {
1010 if (SvSMAGICAL(AvARRAY(av)[key])
1011 && mg_find(AvARRAY(av)[key], PERL_MAGIC_nonelem))
1012 return FALSE;
1013 return TRUE;
1014 }
1015 else
1016 return FALSE;
1017}
1018
1019static MAGIC *
1020S_get_aux_mg(pTHX_ AV *av) {
1021 MAGIC *mg;
1022
1023 PERL_ARGS_ASSERT_GET_AUX_MG;
1024 assert(SvTYPE(av) == SVt_PVAV);
1025
1026 mg = mg_find((const SV *)av, PERL_MAGIC_arylen_p);
1027
1028 if (!mg) {
1029 mg = sv_magicext(MUTABLE_SV(av), 0, PERL_MAGIC_arylen_p,
1030 &PL_vtbl_arylen_p, 0, 0);
1031 assert(mg);
1032 /* sv_magicext won't set this for us because we pass in a NULL obj */
1033 mg->mg_flags |= MGf_REFCOUNTED;
1034 }
1035 return mg;
1036}
1037
1038SV **
1039Perl_av_arylen_p(pTHX_ AV *av) {
1040 MAGIC *const mg = get_aux_mg(av);
1041
1042 PERL_ARGS_ASSERT_AV_ARYLEN_P;
1043 assert(SvTYPE(av) == SVt_PVAV);
1044
1045 return &(mg->mg_obj);
1046}
1047
1048IV *
1049Perl_av_iter_p(pTHX_ AV *av) {
1050 MAGIC *const mg = get_aux_mg(av);
1051
1052 PERL_ARGS_ASSERT_AV_ITER_P;
1053 assert(SvTYPE(av) == SVt_PVAV);
1054
1055 if (sizeof(IV) == sizeof(SSize_t)) {
1056 return (IV *)&(mg->mg_len);
1057 } else {
1058 if (!mg->mg_ptr) {
1059 IV *temp;
1060 mg->mg_len = IVSIZE;
1061 Newxz(temp, 1, IV);
1062 mg->mg_ptr = (char *) temp;
1063 }
1064 return (IV *)mg->mg_ptr;
1065 }
1066}
1067
1068SV *
1069Perl_av_nonelem(pTHX_ AV *av, SSize_t ix) {
1070 SV * const sv = newSV(0);
1071 PERL_ARGS_ASSERT_AV_NONELEM;
1072 if (!av_store(av,ix,sv))
1073 return sv_2mortal(sv); /* has tie magic */
1074 sv_magic(sv, NULL, PERL_MAGIC_nonelem, NULL, 0);
1075 return sv;
1076}
1077
1078/*
1079 * ex: set ts=8 sts=4 sw=4 et:
1080 */