3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 * 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 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
17 =head1 Array Manipulation Functions
25 Perl_av_reify(pTHX_ AV *av)
30 PERL_ARGS_ASSERT_AV_REIFY;
31 assert(SvTYPE(av) == SVt_PVAV);
36 if (SvTIED_mg((SV*)av, PERL_MAGIC_tied) && ckWARN_d(WARN_DEBUGGING))
37 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING), "av_reify called on tied array");
40 while (key > AvFILLp(av) + 1)
41 AvARRAY(av)[--key] = &PL_sv_undef;
43 SV * const sv = AvARRAY(av)[--key];
45 if (sv != &PL_sv_undef)
46 SvREFCNT_inc_simple_void_NN(sv);
48 key = AvARRAY(av) - AvALLOC(av);
50 AvALLOC(av)[--key] = &PL_sv_undef;
58 Pre-extend an array. The C<key> is the index to which the array should be
65 Perl_av_extend(pTHX_ AV *av, I32 key)
70 PERL_ARGS_ASSERT_AV_EXTEND;
71 assert(SvTYPE(av) == SVt_PVAV);
73 mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied);
78 PUSHSTACKi(PERLSI_MAGIC);
81 PUSHs(SvTIED_obj((SV*)av, mg));
84 call_method("EXTEND", G_SCALAR|G_DISCARD);
90 if (key > AvMAX(av)) {
95 if (AvALLOC(av) != AvARRAY(av)) {
96 ary = AvALLOC(av) + AvFILLp(av) + 1;
97 tmp = AvARRAY(av) - AvALLOC(av);
98 Move(AvARRAY(av), AvALLOC(av), AvFILLp(av)+1, SV*);
100 AvARRAY(av) = AvALLOC(av);
103 ary[--tmp] = &PL_sv_undef;
105 if (key > AvMAX(av) - 10) {
106 newmax = key + AvMAX(av);
111 #ifdef PERL_MALLOC_WRAP
112 static const char oom_array_extend[] =
113 "Out of memory during array extend"; /* Duplicated in pp_hot.c */
117 #if !defined(STRANGE_MALLOC) && !defined(MYMALLOC)
122 #ifdef Perl_safesysmalloc_size
123 /* Whilst it would be quite possible to move this logic around
124 (as I did in the SV code), so as to set AvMAX(av) early,
125 based on calling Perl_safesysmalloc_size() immediately after
126 allocation, I'm not convinced that it is a great idea here.
127 In an array we have to loop round setting everything to
128 &PL_sv_undef, which means writing to memory, potentially lots
129 of it, whereas for the SV buffer case we don't touch the
130 "bonus" memory. So there there is no cost in telling the
131 world about it, whereas here we have to do work before we can
132 tell the world about it, and that work involves writing to
133 memory that might never be read. So, I feel, better to keep
134 the current lazy system of only writing to it if our caller
135 has a need for more space. NWC */
136 newmax = Perl_safesysmalloc_size((void*)AvALLOC(av)) /
142 newmax = key + AvMAX(av) / 5;
144 MEM_WRAP_CHECK_1(newmax+1, SV*, oom_array_extend);
145 #if defined(STRANGE_MALLOC) || defined(MYMALLOC)
146 Renew(AvALLOC(av),newmax+1, SV*);
148 bytes = (newmax + 1) * sizeof(SV*);
149 #define MALLOC_OVERHEAD 16
150 itmp = MALLOC_OVERHEAD;
151 while ((MEM_SIZE)(itmp - MALLOC_OVERHEAD) < bytes)
153 itmp -= MALLOC_OVERHEAD;
155 assert(itmp > newmax);
157 assert(newmax >= AvMAX(av));
158 Newx(ary, newmax+1, SV*);
159 Copy(AvALLOC(av), ary, AvMAX(av)+1, SV*);
161 offer_nice_chunk(AvALLOC(av), (AvMAX(av)+1) * sizeof(SV*));
163 Safefree(AvALLOC(av));
166 #ifdef Perl_safesysmalloc_size
169 ary = AvALLOC(av) + AvMAX(av) + 1;
170 tmp = newmax - AvMAX(av);
171 if (av == PL_curstack) { /* Oops, grew stack (via av_store()?) */
172 PL_stack_sp = AvALLOC(av) + (PL_stack_sp - PL_stack_base);
173 PL_stack_base = AvALLOC(av);
174 PL_stack_max = PL_stack_base + newmax;
178 newmax = key < 3 ? 3 : key;
179 MEM_WRAP_CHECK_1(newmax+1, SV*, oom_array_extend);
180 Newx(AvALLOC(av), newmax+1, SV*);
181 ary = AvALLOC(av) + 1;
183 AvALLOC(av)[0] = &PL_sv_undef; /* For the stacks */
187 ary[--tmp] = &PL_sv_undef;
190 AvARRAY(av) = AvALLOC(av);
199 Returns the SV at the specified index in the array. The C<key> is the
200 index. If C<lval> is set then the fetch will be part of a store. Check
201 that the return value is non-null before dereferencing it to a C<SV*>.
203 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
204 more information on how to use this function on tied arrays.
210 Perl_av_fetch(pTHX_ register AV *av, I32 key, I32 lval)
214 PERL_ARGS_ASSERT_AV_FETCH;
215 assert(SvTYPE(av) == SVt_PVAV);
217 if (SvRMAGICAL(av)) {
218 const MAGIC * const tied_magic = mg_find((SV*)av, PERL_MAGIC_tied);
219 if (tied_magic || mg_find((SV*)av, PERL_MAGIC_regdata)) {
222 I32 adjust_index = 1;
224 /* Handle negative array indices 20020222 MJD */
225 SV * const * const negative_indices_glob =
226 hv_fetch(SvSTASH(SvRV(SvTIED_obj((SV *)av, tied_magic))),
227 NEGATIVE_INDICES_VAR, 16, 0);
229 if (negative_indices_glob && SvTRUE(GvSV(*negative_indices_glob)))
234 key += AvFILL(av) + 1;
241 sv_upgrade(sv, SVt_PVLV);
242 mg_copy((SV*)av, sv, 0, key);
244 LvTARG(sv) = sv; /* fake (SV**) */
245 return &(LvTARG(sv));
250 key += AvFILL(av) + 1;
255 if (key > AvFILLp(av)) {
258 return av_store(av,key,newSV(0));
260 if (AvARRAY(av)[key] == &PL_sv_undef) {
263 return av_store(av,key,newSV(0));
267 && (!AvARRAY(av)[key] /* eg. @_ could have freed elts */
268 || SvIS_FREED(AvARRAY(av)[key]))) {
269 AvARRAY(av)[key] = &PL_sv_undef; /* 1/2 reify */
272 return &AvARRAY(av)[key];
278 Stores an SV in an array. The array index is specified as C<key>. The
279 return value will be NULL if the operation failed or if the value did not
280 need to be actually stored within the array (as in the case of tied
281 arrays). Otherwise it can be dereferenced to get the original C<SV*>. Note
282 that the caller is responsible for suitably incrementing the reference
283 count of C<val> before the call, and decrementing it if the function
286 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
287 more information on how to use this function on tied arrays.
293 Perl_av_store(pTHX_ register AV *av, I32 key, SV *val)
298 PERL_ARGS_ASSERT_AV_STORE;
299 assert(SvTYPE(av) == SVt_PVAV);
301 /* S_regclass relies on being able to pass in a NULL sv
302 (unicode_alternate may be NULL).
308 if (SvRMAGICAL(av)) {
309 const MAGIC * const tied_magic = mg_find((SV*)av, PERL_MAGIC_tied);
311 /* Handle negative array indices 20020222 MJD */
313 bool adjust_index = 1;
314 SV * const * const negative_indices_glob =
315 hv_fetch(SvSTASH(SvRV(SvTIED_obj((SV *)av,
317 NEGATIVE_INDICES_VAR, 16, 0);
318 if (negative_indices_glob
319 && SvTRUE(GvSV(*negative_indices_glob)))
322 key += AvFILL(av) + 1;
327 if (val != &PL_sv_undef) {
328 mg_copy((SV*)av, val, 0, key);
336 key += AvFILL(av) + 1;
341 if (SvREADONLY(av) && key >= AvFILL(av))
342 Perl_croak(aTHX_ PL_no_modify);
344 if (!AvREAL(av) && AvREIFY(av))
349 if (AvFILLp(av) < key) {
351 if (av == PL_curstack && key > PL_stack_sp - PL_stack_base)
352 PL_stack_sp = PL_stack_base + key; /* XPUSH in disguise */
354 ary[++AvFILLp(av)] = &PL_sv_undef;
355 } while (AvFILLp(av) < key);
360 SvREFCNT_dec(ary[key]);
362 if (SvSMAGICAL(av)) {
363 const MAGIC* const mg = SvMAGIC(av);
364 if (val != &PL_sv_undef) {
365 sv_magic(val, (SV*)av, toLOWER(mg->mg_type), 0, key);
367 if (PL_delaymagic && mg->mg_type == PERL_MAGIC_isa)
368 PL_delaymagic |= DM_ARRAY;
378 Creates a new AV and populates it with a list of SVs. The SVs are copied
379 into the array, so they may be freed after the call to av_make. The new AV
380 will have a reference count of 1.
386 Perl_av_make(pTHX_ register I32 size, register SV **strp)
388 register AV * const av = (AV*)newSV_type(SVt_PVAV);
389 /* sv_upgrade does AvREAL_only() */
390 PERL_ARGS_ASSERT_AV_MAKE;
391 assert(SvTYPE(av) == SVt_PVAV);
393 if (size) { /* "defined" was returning undef for size==0 anyway. */
399 AvFILLp(av) = AvMAX(av) = size - 1;
400 for (i = 0; i < size; i++) {
403 sv_setsv(ary[i], *strp);
413 Clears an array, making it empty. Does not free the memory used by the
420 Perl_av_clear(pTHX_ register AV *av)
425 PERL_ARGS_ASSERT_AV_CLEAR;
426 assert(SvTYPE(av) == SVt_PVAV);
429 if (SvREFCNT(av) == 0 && ckWARN_d(WARN_DEBUGGING)) {
430 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING), "Attempt to clear deleted array");
435 Perl_croak(aTHX_ PL_no_modify);
437 /* Give any tie a chance to cleanup first */
438 if (SvRMAGICAL(av)) {
439 const MAGIC* const mg = SvMAGIC(av);
440 if (PL_delaymagic && mg && mg->mg_type == PERL_MAGIC_isa)
441 PL_delaymagic |= DM_ARRAY;
450 SV** const ary = AvARRAY(av);
451 I32 index = AvFILLp(av) + 1;
453 SV * const sv = ary[--index];
454 /* undef the slot before freeing the value, because a
455 * destructor might try to modify this array */
456 ary[index] = &PL_sv_undef;
460 extra = AvARRAY(av) - AvALLOC(av);
463 AvARRAY(av) = AvALLOC(av);
472 Undefines the array. Frees the memory used by the array itself.
478 Perl_av_undef(pTHX_ register AV *av)
480 PERL_ARGS_ASSERT_AV_UNDEF;
481 assert(SvTYPE(av) == SVt_PVAV);
483 /* Give any tie a chance to cleanup first */
484 if (SvTIED_mg((SV*)av, PERL_MAGIC_tied))
488 register I32 key = AvFILLp(av) + 1;
490 SvREFCNT_dec(AvARRAY(av)[--key]);
493 Safefree(AvALLOC(av));
496 AvMAX(av) = AvFILLp(av) = -1;
498 if(SvRMAGICAL(av)) mg_clear((SV*)av);
503 =for apidoc av_create_and_push
505 Push an SV onto the end of the array, creating the array if necessary.
506 A small internal helper function to remove a commonly duplicated idiom.
512 Perl_av_create_and_push(pTHX_ AV **const avp, SV *const val)
514 PERL_ARGS_ASSERT_AV_CREATE_AND_PUSH;
524 Pushes an SV onto the end of the array. The array will grow automatically
525 to accommodate the addition.
531 Perl_av_push(pTHX_ register AV *av, SV *val)
536 PERL_ARGS_ASSERT_AV_PUSH;
537 assert(SvTYPE(av) == SVt_PVAV);
540 Perl_croak(aTHX_ PL_no_modify);
542 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
544 PUSHSTACKi(PERLSI_MAGIC);
547 PUSHs(SvTIED_obj((SV*)av, mg));
551 call_method("PUSH", G_SCALAR|G_DISCARD);
556 av_store(av,AvFILLp(av)+1,val);
562 Pops an SV off the end of the array. Returns C<&PL_sv_undef> if the array
569 Perl_av_pop(pTHX_ register AV *av)
575 PERL_ARGS_ASSERT_AV_POP;
576 assert(SvTYPE(av) == SVt_PVAV);
579 Perl_croak(aTHX_ PL_no_modify);
580 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
582 PUSHSTACKi(PERLSI_MAGIC);
584 XPUSHs(SvTIED_obj((SV*)av, mg));
587 if (call_method("POP", G_SCALAR)) {
588 retval = newSVsv(*PL_stack_sp--);
590 retval = &PL_sv_undef;
598 retval = AvARRAY(av)[AvFILLp(av)];
599 AvARRAY(av)[AvFILLp(av)--] = &PL_sv_undef;
607 =for apidoc av_create_and_unshift_one
609 Unshifts an SV onto the beginning of the array, creating the array if
611 A small internal helper function to remove a commonly duplicated idiom.
617 Perl_av_create_and_unshift_one(pTHX_ AV **const avp, SV *const val)
619 PERL_ARGS_ASSERT_AV_CREATE_AND_UNSHIFT_ONE;
624 return av_store(*avp, 0, val);
628 =for apidoc av_unshift
630 Unshift the given number of C<undef> values onto the beginning of the
631 array. The array will grow automatically to accommodate the addition. You
632 must then use C<av_store> to assign values to these new elements.
638 Perl_av_unshift(pTHX_ register AV *av, register I32 num)
644 PERL_ARGS_ASSERT_AV_UNSHIFT;
645 assert(SvTYPE(av) == SVt_PVAV);
648 Perl_croak(aTHX_ PL_no_modify);
650 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
652 PUSHSTACKi(PERLSI_MAGIC);
655 PUSHs(SvTIED_obj((SV*)av, mg));
661 call_method("UNSHIFT", G_SCALAR|G_DISCARD);
669 if (!AvREAL(av) && AvREIFY(av))
671 i = AvARRAY(av) - AvALLOC(av);
679 AvARRAY(av) = AvARRAY(av) - i;
683 const I32 i = AvFILLp(av);
684 /* Create extra elements */
685 const I32 slide = i > 0 ? i : 0;
687 av_extend(av, i + num);
690 Move(ary, ary + num, i + 1, SV*);
692 ary[--num] = &PL_sv_undef;
694 /* Make extra elements into a buffer */
696 AvFILLp(av) -= slide;
697 AvARRAY(av) = AvARRAY(av) + slide;
704 Shifts an SV off the beginning of the array.
710 Perl_av_shift(pTHX_ register AV *av)
716 PERL_ARGS_ASSERT_AV_SHIFT;
717 assert(SvTYPE(av) == SVt_PVAV);
720 Perl_croak(aTHX_ PL_no_modify);
721 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
723 PUSHSTACKi(PERLSI_MAGIC);
725 XPUSHs(SvTIED_obj((SV*)av, mg));
728 if (call_method("SHIFT", G_SCALAR)) {
729 retval = newSVsv(*PL_stack_sp--);
731 retval = &PL_sv_undef;
739 retval = *AvARRAY(av);
741 *AvARRAY(av) = &PL_sv_undef;
742 AvARRAY(av) = AvARRAY(av) + 1;
753 Returns the highest index in the array. The number of elements in the
754 array is C<av_len(av) + 1>. Returns -1 if the array is empty.
760 Perl_av_len(pTHX_ register const AV *av)
762 PERL_ARGS_ASSERT_AV_LEN;
763 assert(SvTYPE(av) == SVt_PVAV);
771 Set the highest index in the array to the given number, equivalent to
772 Perl's C<$#array = $fill;>.
774 The number of elements in the an array will be C<fill + 1> after
775 av_fill() returns. If the array was previously shorter then the
776 additional elements appended are set to C<PL_sv_undef>. If the array
777 was longer, then the excess elements are freed. C<av_fill(av, -1)> is
778 the same as C<av_clear(av)>.
783 Perl_av_fill(pTHX_ register AV *av, I32 fill)
788 PERL_ARGS_ASSERT_AV_FILL;
789 assert(SvTYPE(av) == SVt_PVAV);
793 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
797 PUSHSTACKi(PERLSI_MAGIC);
800 PUSHs(SvTIED_obj((SV*)av, mg));
803 call_method("STORESIZE", G_SCALAR|G_DISCARD);
809 if (fill <= AvMAX(av)) {
810 I32 key = AvFILLp(av);
811 SV** const ary = AvARRAY(av);
815 SvREFCNT_dec(ary[key]);
816 ary[key--] = &PL_sv_undef;
821 ary[++key] = &PL_sv_undef;
829 (void)av_store(av,fill,&PL_sv_undef);
833 =for apidoc av_delete
835 Deletes the element indexed by C<key> from the array. Returns the
836 deleted element. If C<flags> equals C<G_DISCARD>, the element is freed
837 and null is returned.
842 Perl_av_delete(pTHX_ AV *av, I32 key, I32 flags)
847 PERL_ARGS_ASSERT_AV_DELETE;
848 assert(SvTYPE(av) == SVt_PVAV);
851 Perl_croak(aTHX_ PL_no_modify);
853 if (SvRMAGICAL(av)) {
854 const MAGIC * const tied_magic = mg_find((SV*)av, PERL_MAGIC_tied);
855 if ((tied_magic || mg_find((SV*)av, PERL_MAGIC_regdata))) {
856 /* Handle negative array indices 20020222 MJD */
859 unsigned adjust_index = 1;
861 SV * const * const negative_indices_glob =
862 hv_fetch(SvSTASH(SvRV(SvTIED_obj((SV *)av,
864 NEGATIVE_INDICES_VAR, 16, 0);
865 if (negative_indices_glob
866 && SvTRUE(GvSV(*negative_indices_glob)))
870 key += AvFILL(av) + 1;
875 svp = av_fetch(av, key, TRUE);
879 if (mg_find(sv, PERL_MAGIC_tiedelem)) {
880 sv_unmagic(sv, PERL_MAGIC_tiedelem); /* No longer an element */
889 key += AvFILL(av) + 1;
894 if (key > AvFILLp(av))
897 if (!AvREAL(av) && AvREIFY(av))
899 sv = AvARRAY(av)[key];
900 if (key == AvFILLp(av)) {
901 AvARRAY(av)[key] = &PL_sv_undef;
904 } while (--key >= 0 && AvARRAY(av)[key] == &PL_sv_undef);
907 AvARRAY(av)[key] = &PL_sv_undef;
911 if (flags & G_DISCARD) {
921 =for apidoc av_exists
923 Returns true if the element indexed by C<key> has been initialized.
925 This relies on the fact that uninitialized array elements are set to
931 Perl_av_exists(pTHX_ AV *av, I32 key)
934 PERL_ARGS_ASSERT_AV_EXISTS;
935 assert(SvTYPE(av) == SVt_PVAV);
937 if (SvRMAGICAL(av)) {
938 const MAGIC * const tied_magic = mg_find((SV*)av, PERL_MAGIC_tied);
939 if (tied_magic || mg_find((SV*)av, PERL_MAGIC_regdata)) {
940 SV * const sv = sv_newmortal();
942 /* Handle negative array indices 20020222 MJD */
944 unsigned adjust_index = 1;
946 SV * const * const negative_indices_glob =
947 hv_fetch(SvSTASH(SvRV(SvTIED_obj((SV *)av,
949 NEGATIVE_INDICES_VAR, 16, 0);
950 if (negative_indices_glob
951 && SvTRUE(GvSV(*negative_indices_glob)))
955 key += AvFILL(av) + 1;
961 mg_copy((SV*)av, sv, 0, key);
962 mg = mg_find(sv, PERL_MAGIC_tiedelem);
964 magic_existspack(sv, mg);
965 return (bool)SvTRUE(sv);
972 key += AvFILL(av) + 1;
977 if (key <= AvFILLp(av) && AvARRAY(av)[key] != &PL_sv_undef
987 S_get_aux_mg(pTHX_ AV *av) {
991 PERL_ARGS_ASSERT_GET_AUX_MG;
992 assert(SvTYPE(av) == SVt_PVAV);
994 mg = mg_find((SV*)av, PERL_MAGIC_arylen_p);
997 mg = sv_magicext((SV*)av, 0, PERL_MAGIC_arylen_p, &PL_vtbl_arylen_p,
1000 /* sv_magicext won't set this for us because we pass in a NULL obj */
1001 mg->mg_flags |= MGf_REFCOUNTED;
1007 Perl_av_arylen_p(pTHX_ AV *av) {
1008 MAGIC *const mg = get_aux_mg(av);
1010 PERL_ARGS_ASSERT_AV_ARYLEN_P;
1011 assert(SvTYPE(av) == SVt_PVAV);
1013 return &(mg->mg_obj);
1017 Perl_av_iter_p(pTHX_ AV *av) {
1018 MAGIC *const mg = get_aux_mg(av);
1020 PERL_ARGS_ASSERT_AV_ITER_P;
1021 assert(SvTYPE(av) == SVt_PVAV);
1023 #if IVSIZE == I32SIZE
1024 return (IV *)&(mg->mg_len);
1028 mg->mg_len = IVSIZE;
1030 mg->mg_ptr = (char *) temp;
1032 return (IV *)mg->mg_ptr;
1038 * c-indentation-style: bsd
1040 * indent-tabs-mode: t
1043 * ex: set ts=8 sts=4 sw=4 noet: