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
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.
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
15 * [p.476 of _The Lord of the Rings_, III/iv: "Treebeard"]
19 =head1 Array Manipulation Functions
27 Perl_av_reify(pTHX_ AV *av)
32 PERL_ARGS_ASSERT_AV_REIFY;
33 assert(SvTYPE(av) == SVt_PVAV);
38 if (SvTIED_mg((const SV *)av, PERL_MAGIC_tied))
39 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "av_reify called on tied array");
42 while (key > AvFILLp(av) + 1)
43 AvARRAY(av)[--key] = NULL;
45 SV * const sv = AvARRAY(av)[--key];
46 if (sv != &PL_sv_undef)
47 SvREFCNT_inc_simple_void(sv);
49 key = AvARRAY(av) - AvALLOC(av);
51 AvALLOC(av)[--key] = NULL;
59 Pre-extend an array. The C<key> is the index to which the array should be
66 Perl_av_extend(pTHX_ AV *av, SSize_t key)
71 PERL_ARGS_ASSERT_AV_EXTEND;
72 assert(SvTYPE(av) == SVt_PVAV);
74 mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied);
76 SV *arg1 = sv_newmortal();
77 sv_setiv(arg1, (IV)(key + 1));
78 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(EXTEND), G_DISCARD, 1,
82 av_extend_guts(av,key,&AvMAX(av),&AvALLOC(av),&AvARRAY(av));
85 /* The guts of av_extend. *Not* for general use! */
87 Perl_av_extend_guts(pTHX_ AV *av, SSize_t key, SSize_t *maxp, SV ***allocp,
92 PERL_ARGS_ASSERT_AV_EXTEND_GUTS;
99 if (av && *allocp != *arrayp) {
100 ary = *allocp + AvFILLp(av) + 1;
101 tmp = *arrayp - *allocp;
102 Move(*arrayp, *allocp, AvFILLp(av)+1, SV*);
109 if (key > *maxp - 10) {
110 newmax = key + *maxp;
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;
137 newmax = key + *maxp / 5;
140 #ifdef PERL_MALLOC_WRAP /* Duplicated in pp_hot.c */
141 static const char oom_array_extend[] =
142 "Out of memory during array extend";
144 MEM_WRAP_CHECK_1(newmax+1, SV*, oom_array_extend);
146 Renew(*allocp,newmax+1, SV*);
147 #ifdef Perl_safesysmalloc_size
150 ary = *allocp + *maxp + 1;
151 tmp = newmax - *maxp;
152 if (av == PL_curstack) { /* Oops, grew stack (via av_store()?) */
153 PL_stack_sp = *allocp + (PL_stack_sp - PL_stack_base);
154 PL_stack_base = *allocp;
155 PL_stack_max = PL_stack_base + newmax;
159 newmax = key < 3 ? 3 : key;
161 #ifdef PERL_MALLOC_WRAP /* Duplicated in pp_hot.c */
162 static const char oom_array_extend[] =
163 "Out of memory during array extend";
165 MEM_WRAP_CHECK_1(newmax+1, SV*, oom_array_extend);
167 Newx(*allocp, newmax+1, SV*);
170 *allocp[0] = NULL; /* For the stacks */
172 if (av && AvREAL(av)) {
186 Returns the SV at the specified index in the array. The C<key> is the
187 index. If lval is true, you are guaranteed to get a real SV back (in case
188 it wasn't real before), which you can then modify. Check that the return
189 value is non-null before dereferencing it to a C<SV*>.
191 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
192 more information on how to use this function on tied arrays.
194 The rough perl equivalent is C<$myarray[$idx]>.
200 S_adjust_index(pTHX_ AV *av, const MAGIC *mg, SSize_t *keyp)
202 bool adjust_index = 1;
204 /* Handle negative array indices 20020222 MJD */
205 SV * const ref = SvTIED_obj(MUTABLE_SV(av), mg);
207 if (SvROK(ref) && SvOBJECT(SvRV(ref))) {
208 SV * const * const negative_indices_glob =
209 hv_fetchs(SvSTASH(SvRV(ref)), NEGATIVE_INDICES_VAR, 0);
211 if (negative_indices_glob && isGV(*negative_indices_glob)
212 && SvTRUE(GvSV(*negative_indices_glob)))
218 *keyp += AvFILL(av) + 1;
226 Perl_av_fetch(pTHX_ AV *av, SSize_t key, I32 lval)
230 PERL_ARGS_ASSERT_AV_FETCH;
231 assert(SvTYPE(av) == SVt_PVAV);
233 if (SvRMAGICAL(av)) {
234 const MAGIC * const tied_magic
235 = mg_find((const SV *)av, PERL_MAGIC_tied);
236 if (tied_magic || mg_find((const SV *)av, PERL_MAGIC_regdata)) {
239 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
244 sv_upgrade(sv, SVt_PVLV);
245 mg_copy(MUTABLE_SV(av), sv, 0, key);
246 if (!tied_magic) /* for regdata, force leavesub to make copies */
249 LvTARG(sv) = sv; /* fake (SV**) */
250 return &(LvTARG(sv));
255 key += AvFILL(av) + 1;
260 if (key > AvFILLp(av) || !AvARRAY(av)[key]) {
262 return lval ? av_store(av,key,newSV(0)) : NULL;
266 && (!AvARRAY(av)[key] /* eg. @_ could have freed elts */
267 || SvIS_FREED(AvARRAY(av)[key]))) {
268 AvARRAY(av)[key] = NULL; /* 1/2 reify */
271 return &AvARRAY(av)[key];
277 Stores an SV in an array. The array index is specified as C<key>. The
278 return value will be NULL if the operation failed or if the value did not
279 need to be actually stored within the array (as in the case of tied
280 arrays). Otherwise, it can be dereferenced
281 to get the C<SV*> that was stored
284 Note that the caller is responsible for suitably incrementing the reference
285 count of C<val> before the call, and decrementing it if the function
288 Approximate Perl equivalent: C<$myarray[$key] = $val;>.
290 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
291 more information on how to use this function on tied arrays.
297 Perl_av_store(pTHX_ AV *av, SSize_t key, SV *val)
302 PERL_ARGS_ASSERT_AV_STORE;
303 assert(SvTYPE(av) == SVt_PVAV);
305 /* S_regclass relies on being able to pass in a NULL sv
306 (unicode_alternate may be NULL).
309 if (SvRMAGICAL(av)) {
310 const MAGIC * const tied_magic = mg_find((const SV *)av, PERL_MAGIC_tied);
313 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
317 mg_copy(MUTABLE_SV(av), val, 0, key);
325 key += AvFILL(av) + 1;
330 if (SvREADONLY(av) && key >= AvFILL(av))
331 Perl_croak_no_modify();
333 if (!AvREAL(av) && AvREIFY(av))
338 if (AvFILLp(av) < key) {
340 if (av == PL_curstack && key > PL_stack_sp - PL_stack_base)
341 PL_stack_sp = PL_stack_base + key; /* XPUSH in disguise */
343 ary[++AvFILLp(av)] = NULL;
344 } while (AvFILLp(av) < key);
349 SvREFCNT_dec(ary[key]);
351 if (SvSMAGICAL(av)) {
352 const MAGIC *mg = SvMAGIC(av);
354 for (; mg; mg = mg->mg_moremagic) {
355 if (!isUPPER(mg->mg_type)) continue;
357 sv_magic(val, MUTABLE_SV(av), toLOWER(mg->mg_type), 0, key);
359 if (PL_delaymagic && mg->mg_type == PERL_MAGIC_isa) {
360 PL_delaymagic |= DM_ARRAY_ISA;
365 mg_set(MUTABLE_SV(av));
373 Creates a new AV and populates it with a list of SVs. The SVs are copied
374 into the array, so they may be freed after the call to av_make. The new AV
375 will have a reference count of 1.
377 Perl equivalent: C<my @new_array = ($scalar1, $scalar2, $scalar3...);>
383 Perl_av_make(pTHX_ SSize_t size, SV **strp)
385 AV * const av = MUTABLE_AV(newSV_type(SVt_PVAV));
386 /* sv_upgrade does AvREAL_only() */
387 PERL_ARGS_ASSERT_AV_MAKE;
388 assert(SvTYPE(av) == SVt_PVAV);
390 if (size) { /* "defined" was returning undef for size==0 anyway. */
396 AvMAX(av) = size - 1;
400 for (i = 0; i < size; i++) {
403 /* Don't let sv_setsv swipe, since our source array might
404 have multiple references to the same temp scalar (e.g.
405 from a list slice) */
407 SvGETMAGIC(*strp); /* before newSV, in case it dies */
410 sv_setsv_flags(ary[i], *strp,
411 SV_DO_COW_SVSETSV|SV_NOSTEAL);
414 SvREFCNT_inc_simple_void_NN(av);
423 Clears an array, making it empty. Does not free the memory the av uses to
424 store its list of scalars. If any destructors are triggered as a result,
425 the av itself may be freed when this function returns.
427 Perl equivalent: C<@myarray = ();>.
433 Perl_av_clear(pTHX_ AV *av)
439 PERL_ARGS_ASSERT_AV_CLEAR;
440 assert(SvTYPE(av) == SVt_PVAV);
443 if (SvREFCNT(av) == 0) {
444 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "Attempt to clear deleted array");
449 Perl_croak_no_modify();
451 /* Give any tie a chance to cleanup first */
452 if (SvRMAGICAL(av)) {
453 const MAGIC* const mg = SvMAGIC(av);
454 if (PL_delaymagic && mg && mg->mg_type == PERL_MAGIC_isa)
455 PL_delaymagic |= DM_ARRAY_ISA;
457 mg_clear(MUTABLE_SV(av));
463 if ((real = !!AvREAL(av))) {
464 SV** const ary = AvARRAY(av);
465 SSize_t index = AvFILLp(av) + 1;
467 SAVEFREESV(SvREFCNT_inc_simple_NN(av));
469 SV * const sv = ary[--index];
470 /* undef the slot before freeing the value, because a
471 * destructor might try to modify this array */
476 extra = AvARRAY(av) - AvALLOC(av);
479 AvARRAY(av) = AvALLOC(av);
488 Undefines the array. Frees the memory used by the av to store its list of
489 scalars. If any destructors are triggered as a result, the av itself may
496 Perl_av_undef(pTHX_ AV *av)
500 PERL_ARGS_ASSERT_AV_UNDEF;
501 assert(SvTYPE(av) == SVt_PVAV);
503 /* Give any tie a chance to cleanup first */
504 if (SvTIED_mg((const SV *)av, PERL_MAGIC_tied))
507 if ((real = !!AvREAL(av))) {
508 SSize_t key = AvFILLp(av) + 1;
510 SAVEFREESV(SvREFCNT_inc_simple_NN(av));
512 SvREFCNT_dec(AvARRAY(av)[--key]);
515 Safefree(AvALLOC(av));
518 AvMAX(av) = AvFILLp(av) = -1;
520 if(SvRMAGICAL(av)) mg_clear(MUTABLE_SV(av));
526 =for apidoc av_create_and_push
528 Push an SV onto the end of the array, creating the array if necessary.
529 A small internal helper function to remove a commonly duplicated idiom.
535 Perl_av_create_and_push(pTHX_ AV **const avp, SV *const val)
537 PERL_ARGS_ASSERT_AV_CREATE_AND_PUSH;
547 Pushes an SV onto the end of the array. The array will grow automatically
548 to accommodate the addition. This takes ownership of one reference count.
550 Perl equivalent: C<push @myarray, $elem;>.
556 Perl_av_push(pTHX_ AV *av, SV *val)
561 PERL_ARGS_ASSERT_AV_PUSH;
562 assert(SvTYPE(av) == SVt_PVAV);
565 Perl_croak_no_modify();
567 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
568 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(PUSH), G_DISCARD, 1,
572 av_store(av,AvFILLp(av)+1,val);
578 Removes one SV from the end of the array, reducing its size by one and
579 returning the SV (transferring control of one reference count) to the
580 caller. Returns C<&PL_sv_undef> if the array is empty.
582 Perl equivalent: C<pop(@myarray);>
588 Perl_av_pop(pTHX_ AV *av)
594 PERL_ARGS_ASSERT_AV_POP;
595 assert(SvTYPE(av) == SVt_PVAV);
598 Perl_croak_no_modify();
599 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
600 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(POP), 0, 0);
602 retval = newSVsv(retval);
607 retval = AvARRAY(av)[AvFILLp(av)];
608 AvARRAY(av)[AvFILLp(av)--] = NULL;
610 mg_set(MUTABLE_SV(av));
611 return retval ? retval : &PL_sv_undef;
616 =for apidoc av_create_and_unshift_one
618 Unshifts an SV onto the beginning of the array, creating the array if
620 A small internal helper function to remove a commonly duplicated idiom.
626 Perl_av_create_and_unshift_one(pTHX_ AV **const avp, SV *const val)
628 PERL_ARGS_ASSERT_AV_CREATE_AND_UNSHIFT_ONE;
633 return av_store(*avp, 0, val);
637 =for apidoc av_unshift
639 Unshift the given number of C<undef> values onto the beginning of the
640 array. The array will grow automatically to accommodate the addition. You
641 must then use C<av_store> to assign values to these new elements.
643 Perl equivalent: C<unshift @myarray, ( (undef) x $n );>
649 Perl_av_unshift(pTHX_ AV *av, SSize_t num)
655 PERL_ARGS_ASSERT_AV_UNSHIFT;
656 assert(SvTYPE(av) == SVt_PVAV);
659 Perl_croak_no_modify();
661 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
662 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(UNSHIFT),
663 G_DISCARD | G_UNDEF_FILL, num);
669 if (!AvREAL(av) && AvREIFY(av))
671 i = AvARRAY(av) - AvALLOC(av);
679 AvARRAY(av) = AvARRAY(av) - i;
683 const SSize_t i = AvFILLp(av);
684 /* Create extra elements */
685 const SSize_t slide = i > 0 ? i : 0;
687 av_extend(av, i + num);
690 Move(ary, ary + num, i + 1, SV*);
694 /* Make extra elements into a buffer */
696 AvFILLp(av) -= slide;
697 AvARRAY(av) = AvARRAY(av) + slide;
704 Removes one SV from the start of the array, reducing its size by one and
705 returning the SV (transferring control of one reference count) to the
706 caller. Returns C<&PL_sv_undef> if the array is empty.
708 Perl equivalent: C<shift(@myarray);>
714 Perl_av_shift(pTHX_ AV *av)
720 PERL_ARGS_ASSERT_AV_SHIFT;
721 assert(SvTYPE(av) == SVt_PVAV);
724 Perl_croak_no_modify();
725 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
726 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(SHIFT), 0, 0);
728 retval = newSVsv(retval);
733 retval = *AvARRAY(av);
736 AvARRAY(av) = AvARRAY(av) + 1;
740 mg_set(MUTABLE_SV(av));
741 return retval ? retval : &PL_sv_undef;
745 =for apidoc av_top_index
747 Returns the highest index in the array. The number of elements in the
748 array is C<av_top_index(av) + 1>. Returns -1 if the array is empty.
750 The Perl equivalent for this is C<$#myarray>.
752 (A slightly shorter form is C<av_tindex>.)
756 Same as L</av_top_index>. Returns the highest index in the array. Note that the
757 return value is +1 what its name implies it returns; and hence differs in
758 meaning from what the similarly named L</sv_len> returns.
764 Perl_av_len(pTHX_ AV *av)
766 PERL_ARGS_ASSERT_AV_LEN;
768 return av_top_index(av);
774 Set the highest index in the array to the given number, equivalent to
775 Perl's C<$#array = $fill;>.
777 The number of elements in the an array will be C<fill + 1> after
778 av_fill() returns. If the array was previously shorter, then the
779 additional elements appended are set to NULL. If the array
780 was longer, then the excess elements are freed. C<av_fill(av, -1)> is
781 the same as C<av_clear(av)>.
786 Perl_av_fill(pTHX_ AV *av, SSize_t fill)
791 PERL_ARGS_ASSERT_AV_FILL;
792 assert(SvTYPE(av) == SVt_PVAV);
796 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
797 SV *arg1 = sv_newmortal();
798 sv_setiv(arg1, (IV)(fill + 1));
799 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(STORESIZE), G_DISCARD,
803 if (fill <= AvMAX(av)) {
804 SSize_t key = AvFILLp(av);
805 SV** const ary = AvARRAY(av);
809 SvREFCNT_dec(ary[key]);
820 mg_set(MUTABLE_SV(av));
823 (void)av_store(av,fill,NULL);
827 =for apidoc av_delete
829 Deletes the element indexed by C<key> from the array, makes the element mortal,
830 and returns it. If C<flags> equals C<G_DISCARD>, the element is freed and null
831 is returned. Perl equivalent: C<my $elem = delete($myarray[$idx]);> for the
832 non-C<G_DISCARD> version and a void-context C<delete($myarray[$idx]);> for the
833 C<G_DISCARD> version.
838 Perl_av_delete(pTHX_ AV *av, SSize_t key, I32 flags)
843 PERL_ARGS_ASSERT_AV_DELETE;
844 assert(SvTYPE(av) == SVt_PVAV);
847 Perl_croak_no_modify();
849 if (SvRMAGICAL(av)) {
850 const MAGIC * const tied_magic
851 = mg_find((const SV *)av, PERL_MAGIC_tied);
852 if ((tied_magic || mg_find((const SV *)av, PERL_MAGIC_regdata))) {
855 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
858 svp = av_fetch(av, key, TRUE);
862 if (mg_find(sv, PERL_MAGIC_tiedelem)) {
863 sv_unmagic(sv, PERL_MAGIC_tiedelem); /* No longer an element */
872 key += AvFILL(av) + 1;
877 if (key > AvFILLp(av))
880 if (!AvREAL(av) && AvREIFY(av))
882 sv = AvARRAY(av)[key];
883 if (key == AvFILLp(av)) {
884 AvARRAY(av)[key] = NULL;
887 } while (--key >= 0 && !AvARRAY(av)[key]);
890 AvARRAY(av)[key] = NULL;
892 mg_set(MUTABLE_SV(av));
894 if (flags & G_DISCARD) {
904 =for apidoc av_exists
906 Returns true if the element indexed by C<key> has been initialized.
908 This relies on the fact that uninitialized array elements are set to
911 Perl equivalent: C<exists($myarray[$key])>.
916 Perl_av_exists(pTHX_ AV *av, SSize_t key)
919 PERL_ARGS_ASSERT_AV_EXISTS;
920 assert(SvTYPE(av) == SVt_PVAV);
922 if (SvRMAGICAL(av)) {
923 const MAGIC * const tied_magic
924 = mg_find((const SV *)av, PERL_MAGIC_tied);
925 const MAGIC * const regdata_magic
926 = mg_find((const SV *)av, PERL_MAGIC_regdata);
927 if (tied_magic || regdata_magic) {
929 /* Handle negative array indices 20020222 MJD */
931 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
935 if(key >= 0 && regdata_magic) {
936 if (key <= AvFILL(av))
942 SV * const sv = sv_newmortal();
943 mg_copy(MUTABLE_SV(av), sv, 0, key);
944 mg = mg_find(sv, PERL_MAGIC_tiedelem);
946 magic_existspack(sv, mg);
948 I32 retbool = SvTRUE_nomg_NN(sv);
949 return cBOOL(retbool);
957 key += AvFILL(av) + 1;
962 if (key <= AvFILLp(av) && AvARRAY(av)[key])
971 S_get_aux_mg(pTHX_ AV *av) {
975 PERL_ARGS_ASSERT_GET_AUX_MG;
976 assert(SvTYPE(av) == SVt_PVAV);
978 mg = mg_find((const SV *)av, PERL_MAGIC_arylen_p);
981 mg = sv_magicext(MUTABLE_SV(av), 0, PERL_MAGIC_arylen_p,
982 &PL_vtbl_arylen_p, 0, 0);
984 /* sv_magicext won't set this for us because we pass in a NULL obj */
985 mg->mg_flags |= MGf_REFCOUNTED;
991 Perl_av_arylen_p(pTHX_ AV *av) {
992 MAGIC *const mg = get_aux_mg(av);
994 PERL_ARGS_ASSERT_AV_ARYLEN_P;
995 assert(SvTYPE(av) == SVt_PVAV);
997 return &(mg->mg_obj);
1001 Perl_av_iter_p(pTHX_ AV *av) {
1002 MAGIC *const mg = get_aux_mg(av);
1004 PERL_ARGS_ASSERT_AV_ITER_P;
1005 assert(SvTYPE(av) == SVt_PVAV);
1007 #if IVSIZE == I32SIZE
1008 return (IV *)&(mg->mg_len);
1012 mg->mg_len = IVSIZE;
1014 mg->mg_ptr = (char *) temp;
1016 return (IV *)mg->mg_ptr;
1022 * c-indentation-style: bsd
1024 * indent-tabs-mode: nil
1027 * ex: set ts=8 sts=4 sw=4 et: