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
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. Returns C<&PL_sv_undef> if the
711 Perl_av_shift(pTHX_ register AV *av)
717 PERL_ARGS_ASSERT_AV_SHIFT;
718 assert(SvTYPE(av) == SVt_PVAV);
721 Perl_croak(aTHX_ PL_no_modify);
722 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
724 PUSHSTACKi(PERLSI_MAGIC);
726 XPUSHs(SvTIED_obj((SV*)av, mg));
729 if (call_method("SHIFT", G_SCALAR)) {
730 retval = newSVsv(*PL_stack_sp--);
732 retval = &PL_sv_undef;
740 retval = *AvARRAY(av);
742 *AvARRAY(av) = &PL_sv_undef;
743 AvARRAY(av) = AvARRAY(av) + 1;
754 Returns the highest index in the array. The number of elements in the
755 array is C<av_len(av) + 1>. Returns -1 if the array is empty.
761 Perl_av_len(pTHX_ register const AV *av)
763 PERL_ARGS_ASSERT_AV_LEN;
764 assert(SvTYPE(av) == SVt_PVAV);
772 Set the highest index in the array to the given number, equivalent to
773 Perl's C<$#array = $fill;>.
775 The number of elements in the an array will be C<fill + 1> after
776 av_fill() returns. If the array was previously shorter then the
777 additional elements appended are set to C<PL_sv_undef>. If the array
778 was longer, then the excess elements are freed. C<av_fill(av, -1)> is
779 the same as C<av_clear(av)>.
784 Perl_av_fill(pTHX_ register AV *av, I32 fill)
789 PERL_ARGS_ASSERT_AV_FILL;
790 assert(SvTYPE(av) == SVt_PVAV);
794 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
798 PUSHSTACKi(PERLSI_MAGIC);
801 PUSHs(SvTIED_obj((SV*)av, mg));
804 call_method("STORESIZE", G_SCALAR|G_DISCARD);
810 if (fill <= AvMAX(av)) {
811 I32 key = AvFILLp(av);
812 SV** const ary = AvARRAY(av);
816 SvREFCNT_dec(ary[key]);
817 ary[key--] = &PL_sv_undef;
822 ary[++key] = &PL_sv_undef;
830 (void)av_store(av,fill,&PL_sv_undef);
834 =for apidoc av_delete
836 Deletes the element indexed by C<key> from the array. Returns the
837 deleted element. If C<flags> equals C<G_DISCARD>, the element is freed
838 and null is returned.
843 Perl_av_delete(pTHX_ AV *av, I32 key, I32 flags)
848 PERL_ARGS_ASSERT_AV_DELETE;
849 assert(SvTYPE(av) == SVt_PVAV);
852 Perl_croak(aTHX_ PL_no_modify);
854 if (SvRMAGICAL(av)) {
855 const MAGIC * const tied_magic = mg_find((SV*)av, PERL_MAGIC_tied);
856 if ((tied_magic || mg_find((SV*)av, PERL_MAGIC_regdata))) {
857 /* Handle negative array indices 20020222 MJD */
860 unsigned adjust_index = 1;
862 SV * const * const negative_indices_glob =
863 hv_fetch(SvSTASH(SvRV(SvTIED_obj((SV *)av,
865 NEGATIVE_INDICES_VAR, 16, 0);
866 if (negative_indices_glob
867 && SvTRUE(GvSV(*negative_indices_glob)))
871 key += AvFILL(av) + 1;
876 svp = av_fetch(av, key, TRUE);
880 if (mg_find(sv, PERL_MAGIC_tiedelem)) {
881 sv_unmagic(sv, PERL_MAGIC_tiedelem); /* No longer an element */
890 key += AvFILL(av) + 1;
895 if (key > AvFILLp(av))
898 if (!AvREAL(av) && AvREIFY(av))
900 sv = AvARRAY(av)[key];
901 if (key == AvFILLp(av)) {
902 AvARRAY(av)[key] = &PL_sv_undef;
905 } while (--key >= 0 && AvARRAY(av)[key] == &PL_sv_undef);
908 AvARRAY(av)[key] = &PL_sv_undef;
912 if (flags & G_DISCARD) {
922 =for apidoc av_exists
924 Returns true if the element indexed by C<key> has been initialized.
926 This relies on the fact that uninitialized array elements are set to
932 Perl_av_exists(pTHX_ AV *av, I32 key)
935 PERL_ARGS_ASSERT_AV_EXISTS;
936 assert(SvTYPE(av) == SVt_PVAV);
938 if (SvRMAGICAL(av)) {
939 const MAGIC * const tied_magic = mg_find((SV*)av, PERL_MAGIC_tied);
940 if (tied_magic || mg_find((SV*)av, PERL_MAGIC_regdata)) {
941 SV * const sv = sv_newmortal();
943 /* Handle negative array indices 20020222 MJD */
945 unsigned adjust_index = 1;
947 SV * const * const negative_indices_glob =
948 hv_fetch(SvSTASH(SvRV(SvTIED_obj((SV *)av,
950 NEGATIVE_INDICES_VAR, 16, 0);
951 if (negative_indices_glob
952 && SvTRUE(GvSV(*negative_indices_glob)))
956 key += AvFILL(av) + 1;
962 mg_copy((SV*)av, sv, 0, key);
963 mg = mg_find(sv, PERL_MAGIC_tiedelem);
965 magic_existspack(sv, mg);
966 return (bool)SvTRUE(sv);
973 key += AvFILL(av) + 1;
978 if (key <= AvFILLp(av) && AvARRAY(av)[key] != &PL_sv_undef
988 S_get_aux_mg(pTHX_ AV *av) {
992 PERL_ARGS_ASSERT_GET_AUX_MG;
993 assert(SvTYPE(av) == SVt_PVAV);
995 mg = mg_find((SV*)av, PERL_MAGIC_arylen_p);
998 mg = sv_magicext((SV*)av, 0, PERL_MAGIC_arylen_p, &PL_vtbl_arylen_p,
1001 /* sv_magicext won't set this for us because we pass in a NULL obj */
1002 mg->mg_flags |= MGf_REFCOUNTED;
1008 Perl_av_arylen_p(pTHX_ AV *av) {
1009 MAGIC *const mg = get_aux_mg(av);
1011 PERL_ARGS_ASSERT_AV_ARYLEN_P;
1012 assert(SvTYPE(av) == SVt_PVAV);
1014 return &(mg->mg_obj);
1018 Perl_av_iter_p(pTHX_ AV *av) {
1019 MAGIC *const mg = get_aux_mg(av);
1021 PERL_ARGS_ASSERT_AV_ITER_P;
1022 assert(SvTYPE(av) == SVt_PVAV);
1024 #if IVSIZE == I32SIZE
1025 return (IV *)&(mg->mg_len);
1029 mg->mg_len = IVSIZE;
1031 mg->mg_ptr = (char *) temp;
1033 return (IV *)mg->mg_ptr;
1039 * c-indentation-style: bsd
1041 * indent-tabs-mode: t
1044 * ex: set ts=8 sts=4 sw=4 noet: