3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 * 2000, 2001, 2002, 2003, 2004, 2005 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)
32 if (SvTIED_mg((SV*)av, PERL_MAGIC_tied) && ckWARN_d(WARN_DEBUGGING))
33 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING), "av_reify called on tied array");
36 while (key > AvFILLp(av) + 1)
37 AvARRAY(av)[--key] = &PL_sv_undef;
39 SV * const sv = AvARRAY(av)[--key];
41 if (sv != &PL_sv_undef)
42 (void)SvREFCNT_inc(sv);
44 key = AvARRAY(av) - AvALLOC(av);
46 AvALLOC(av)[--key] = &PL_sv_undef;
54 Pre-extend an array. The C<key> is the index to which the array should be
61 Perl_av_extend(pTHX_ AV *av, I32 key)
63 MAGIC * const mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied);
68 PUSHSTACKi(PERLSI_MAGIC);
71 PUSHs(SvTIED_obj((SV*)av, mg));
72 PUSHs(sv_2mortal(newSViv(key+1)));
74 call_method("EXTEND", G_SCALAR|G_DISCARD);
80 if (key > AvMAX(av)) {
85 if (AvALLOC(av) != AvARRAY(av)) {
86 ary = AvALLOC(av) + AvFILLp(av) + 1;
87 tmp = AvARRAY(av) - AvALLOC(av);
88 Move(AvARRAY(av), AvALLOC(av), AvFILLp(av)+1, SV*);
90 SvPV_set(av, (char*)AvALLOC(av));
93 ary[--tmp] = &PL_sv_undef;
95 if (key > AvMAX(av) - 10) {
96 newmax = key + AvMAX(av);
101 #ifdef PERL_MALLOC_WRAP
102 static const char oom_array_extend[] =
103 "Out of memory during array extend"; /* Duplicated in pp_hot.c */
107 #if !defined(STRANGE_MALLOC) && !defined(MYMALLOC)
113 newmax = malloced_size((void*)AvALLOC(av))/sizeof(SV*) - 1;
118 newmax = key + AvMAX(av) / 5;
120 MEM_WRAP_CHECK_1(newmax+1, SV*, oom_array_extend);
121 #if defined(STRANGE_MALLOC) || defined(MYMALLOC)
122 Renew(AvALLOC(av),newmax+1, SV*);
124 bytes = (newmax + 1) * sizeof(SV*);
125 #define MALLOC_OVERHEAD 16
126 itmp = MALLOC_OVERHEAD;
127 while ((MEM_SIZE)(itmp - MALLOC_OVERHEAD) < bytes)
129 itmp -= MALLOC_OVERHEAD;
131 assert(itmp > newmax);
133 assert(newmax >= AvMAX(av));
134 Newx(ary, newmax+1, SV*);
135 Copy(AvALLOC(av), ary, AvMAX(av)+1, SV*);
137 offer_nice_chunk(AvALLOC(av), (AvMAX(av)+1) * sizeof(SV*));
139 Safefree(AvALLOC(av));
145 ary = AvALLOC(av) + AvMAX(av) + 1;
146 tmp = newmax - AvMAX(av);
147 if (av == PL_curstack) { /* Oops, grew stack (via av_store()?) */
148 PL_stack_sp = AvALLOC(av) + (PL_stack_sp - PL_stack_base);
149 PL_stack_base = AvALLOC(av);
150 PL_stack_max = PL_stack_base + newmax;
154 newmax = key < 3 ? 3 : key;
155 MEM_WRAP_CHECK_1(newmax+1, SV*, oom_array_extend);
156 Newx(AvALLOC(av), newmax+1, SV*);
157 ary = AvALLOC(av) + 1;
159 AvALLOC(av)[0] = &PL_sv_undef; /* For the stacks */
163 ary[--tmp] = &PL_sv_undef;
166 SvPV_set(av, (char*)AvALLOC(av));
175 Returns the SV at the specified index in the array. The C<key> is the
176 index. If C<lval> is set then the fetch will be part of a store. Check
177 that the return value is non-null before dereferencing it to a C<SV*>.
179 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
180 more information on how to use this function on tied arrays.
186 Perl_av_fetch(pTHX_ register AV *av, I32 key, I32 lval)
193 if (SvRMAGICAL(av)) {
194 const MAGIC * const tied_magic = mg_find((SV*)av, PERL_MAGIC_tied);
195 if (tied_magic || mg_find((SV*)av, PERL_MAGIC_regdata)) {
196 U32 adjust_index = 1;
198 if (tied_magic && key < 0) {
199 /* Handle negative array indices 20020222 MJD */
200 SV * const * const negative_indices_glob =
201 hv_fetch(SvSTASH(SvRV(SvTIED_obj((SV *)av,
203 NEGATIVE_INDICES_VAR, 16, 0);
205 if (negative_indices_glob
206 && SvTRUE(GvSV(*negative_indices_glob)))
210 if (key < 0 && adjust_index) {
211 key += AvFILL(av) + 1;
217 sv_upgrade(sv, SVt_PVLV);
218 mg_copy((SV*)av, sv, 0, key);
220 LvTARG(sv) = sv; /* fake (SV**) */
221 return &(LvTARG(sv));
226 key += AvFILL(av) + 1;
231 if (key > AvFILLp(av)) {
235 return av_store(av,key,sv);
237 if (AvARRAY(av)[key] == &PL_sv_undef) {
241 return av_store(av,key,sv);
246 && (!AvARRAY(av)[key] /* eg. @_ could have freed elts */
247 || SvIS_FREED(AvARRAY(av)[key]))) {
248 AvARRAY(av)[key] = &PL_sv_undef; /* 1/2 reify */
251 return &AvARRAY(av)[key];
257 Stores an SV in an array. The array index is specified as C<key>. The
258 return value will be NULL if the operation failed or if the value did not
259 need to be actually stored within the array (as in the case of tied
260 arrays). Otherwise it can be dereferenced to get the original C<SV*>. Note
261 that the caller is responsible for suitably incrementing the reference
262 count of C<val> before the call, and decrementing it if the function
265 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
266 more information on how to use this function on tied arrays.
272 Perl_av_store(pTHX_ register AV *av, I32 key, SV *val)
281 if (SvRMAGICAL(av)) {
282 const MAGIC * const tied_magic = mg_find((SV*)av, PERL_MAGIC_tied);
284 /* Handle negative array indices 20020222 MJD */
286 unsigned adjust_index = 1;
287 SV * const * const negative_indices_glob =
288 hv_fetch(SvSTASH(SvRV(SvTIED_obj((SV *)av,
290 NEGATIVE_INDICES_VAR, 16, 0);
291 if (negative_indices_glob
292 && SvTRUE(GvSV(*negative_indices_glob)))
295 key += AvFILL(av) + 1;
300 if (val != &PL_sv_undef) {
301 mg_copy((SV*)av, val, 0, key);
309 key += AvFILL(av) + 1;
314 if (SvREADONLY(av) && key >= AvFILL(av))
315 Perl_croak(aTHX_ PL_no_modify);
317 if (!AvREAL(av) && AvREIFY(av))
322 if (AvFILLp(av) < key) {
324 if (av == PL_curstack && key > PL_stack_sp - PL_stack_base)
325 PL_stack_sp = PL_stack_base + key; /* XPUSH in disguise */
327 ary[++AvFILLp(av)] = &PL_sv_undef;
328 while (AvFILLp(av) < key);
333 SvREFCNT_dec(ary[key]);
335 if (SvSMAGICAL(av)) {
336 if (val != &PL_sv_undef) {
337 MAGIC* mg = SvMAGIC(av);
338 sv_magic(val, (SV*)av, toLOWER(mg->mg_type), 0, key);
348 Creates a new AV. The reference count is set to 1.
356 register AV * const av = (AV*)NEWSV(3,0);
358 sv_upgrade((SV *)av, SVt_PVAV);
359 /* sv_upgrade does AvREAL_only() */
361 SvPV_set(av, (char*)0);
362 AvMAX(av) = AvFILLp(av) = -1;
369 Creates a new AV and populates it with a list of SVs. The SVs are copied
370 into the array, so they may be freed after the call to av_make. The new AV
371 will have a reference count of 1.
377 Perl_av_make(pTHX_ register I32 size, register SV **strp)
379 register AV * const av = (AV*)NEWSV(8,0);
381 sv_upgrade((SV *) av,SVt_PVAV);
382 /* sv_upgrade does AvREAL_only() */
383 if (size) { /* "defined" was returning undef for size==0 anyway. */
388 SvPV_set(av, (char*)ary);
389 AvFILLp(av) = size - 1;
390 AvMAX(av) = size - 1;
391 for (i = 0; i < size; i++) {
394 sv_setsv(ary[i], *strp);
404 Clears an array, making it empty. Does not free the memory used by the
411 Perl_av_clear(pTHX_ register AV *av)
416 if (SvREFCNT(av) == 0 && ckWARN_d(WARN_DEBUGGING)) {
417 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING), "Attempt to clear deleted array");
424 Perl_croak(aTHX_ PL_no_modify);
426 /* Give any tie a chance to cleanup first */
434 SV** const ary = AvARRAY(av);
435 key = AvFILLp(av) + 1;
437 SV * const sv = ary[--key];
438 /* undef the slot before freeing the value, because a
439 * destructor might try to modify this arrray */
440 ary[key] = &PL_sv_undef;
444 if ((key = AvARRAY(av) - AvALLOC(av))) {
446 SvPV_set(av, (char*)AvALLOC(av));
455 Undefines the array. Frees the memory used by the array itself.
461 Perl_av_undef(pTHX_ register AV *av)
466 /* Give any tie a chance to cleanup first */
467 if (SvTIED_mg((SV*)av, PERL_MAGIC_tied))
468 av_fill(av, -1); /* mg_clear() ? */
471 register I32 key = AvFILLp(av) + 1;
473 SvREFCNT_dec(AvARRAY(av)[--key]);
475 Safefree(AvALLOC(av));
477 SvPV_set(av, (char*)0);
478 AvMAX(av) = AvFILLp(av) = -1;
484 Pushes an SV onto the end of the array. The array will grow automatically
485 to accommodate the addition.
491 Perl_av_push(pTHX_ register AV *av, SV *val)
498 Perl_croak(aTHX_ PL_no_modify);
500 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
502 PUSHSTACKi(PERLSI_MAGIC);
505 PUSHs(SvTIED_obj((SV*)av, mg));
509 call_method("PUSH", G_SCALAR|G_DISCARD);
514 av_store(av,AvFILLp(av)+1,val);
520 Pops an SV off the end of the array. Returns C<&PL_sv_undef> if the array
527 Perl_av_pop(pTHX_ register AV *av)
536 Perl_croak(aTHX_ PL_no_modify);
537 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
539 PUSHSTACKi(PERLSI_MAGIC);
541 XPUSHs(SvTIED_obj((SV*)av, mg));
544 if (call_method("POP", G_SCALAR)) {
545 retval = newSVsv(*PL_stack_sp--);
547 retval = &PL_sv_undef;
555 retval = AvARRAY(av)[AvFILLp(av)];
556 AvARRAY(av)[AvFILLp(av)--] = &PL_sv_undef;
563 =for apidoc av_unshift
565 Unshift the given number of C<undef> values onto the beginning of the
566 array. The array will grow automatically to accommodate the addition. You
567 must then use C<av_store> to assign values to these new elements.
573 Perl_av_unshift(pTHX_ register AV *av, register I32 num)
582 Perl_croak(aTHX_ PL_no_modify);
584 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
586 PUSHSTACKi(PERLSI_MAGIC);
589 PUSHs(SvTIED_obj((SV*)av, mg));
595 call_method("UNSHIFT", G_SCALAR|G_DISCARD);
603 if (!AvREAL(av) && AvREIFY(av))
605 i = AvARRAY(av) - AvALLOC(av);
613 SvPV_set(av, (char*)(AvARRAY(av) - i));
619 /* Create extra elements */
620 slide = i > 0 ? i : 0;
622 av_extend(av, i + num);
625 Move(ary, ary + num, i + 1, SV*);
627 ary[--num] = &PL_sv_undef;
629 /* Make extra elements into a buffer */
631 AvFILLp(av) -= slide;
632 SvPV_set(av, (char*)(AvARRAY(av) + slide));
639 Shifts an SV off the beginning of the array.
645 Perl_av_shift(pTHX_ register AV *av)
654 Perl_croak(aTHX_ PL_no_modify);
655 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
657 PUSHSTACKi(PERLSI_MAGIC);
659 XPUSHs(SvTIED_obj((SV*)av, mg));
662 if (call_method("SHIFT", G_SCALAR)) {
663 retval = newSVsv(*PL_stack_sp--);
665 retval = &PL_sv_undef;
673 retval = *AvARRAY(av);
675 *AvARRAY(av) = &PL_sv_undef;
676 SvPV_set(av, (char*)(AvARRAY(av) + 1));
687 Returns the highest index in the array. Returns -1 if the array is
694 Perl_av_len(pTHX_ register const AV *av)
702 Ensure than an array has a given number of elements, equivalent to
703 Perl's C<$#array = $fill;>.
708 Perl_av_fill(pTHX_ register AV *av, I32 fill)
713 Perl_croak(aTHX_ "panic: null array");
716 if ((mg = SvTIED_mg((SV*)av, PERL_MAGIC_tied))) {
720 PUSHSTACKi(PERLSI_MAGIC);
723 PUSHs(SvTIED_obj((SV*)av, mg));
724 PUSHs(sv_2mortal(newSViv(fill+1)));
726 call_method("STORESIZE", G_SCALAR|G_DISCARD);
732 if (fill <= AvMAX(av)) {
733 I32 key = AvFILLp(av);
734 SV** ary = AvARRAY(av);
738 SvREFCNT_dec(ary[key]);
739 ary[key--] = &PL_sv_undef;
744 ary[++key] = &PL_sv_undef;
752 (void)av_store(av,fill,&PL_sv_undef);
756 =for apidoc av_delete
758 Deletes the element indexed by C<key> from the array. Returns the
759 deleted element. If C<flags> equals C<G_DISCARD>, the element is freed
760 and null is returned.
765 Perl_av_delete(pTHX_ AV *av, I32 key, I32 flags)
772 Perl_croak(aTHX_ PL_no_modify);
774 if (SvRMAGICAL(av)) {
775 const MAGIC * const tied_magic = mg_find((SV*)av, PERL_MAGIC_tied);
776 if ((tied_magic || mg_find((SV*)av, PERL_MAGIC_regdata))) {
777 /* Handle negative array indices 20020222 MJD */
780 unsigned adjust_index = 1;
782 SV * const * const negative_indices_glob =
783 hv_fetch(SvSTASH(SvRV(SvTIED_obj((SV *)av,
785 NEGATIVE_INDICES_VAR, 16, 0);
786 if (negative_indices_glob
787 && SvTRUE(GvSV(*negative_indices_glob)))
791 key += AvFILL(av) + 1;
796 svp = av_fetch(av, key, TRUE);
800 if (mg_find(sv, PERL_MAGIC_tiedelem)) {
801 sv_unmagic(sv, PERL_MAGIC_tiedelem); /* No longer an element */
810 key += AvFILL(av) + 1;
815 if (key > AvFILLp(av))
818 if (!AvREAL(av) && AvREIFY(av))
820 sv = AvARRAY(av)[key];
821 if (key == AvFILLp(av)) {
822 AvARRAY(av)[key] = &PL_sv_undef;
825 } while (--key >= 0 && AvARRAY(av)[key] == &PL_sv_undef);
828 AvARRAY(av)[key] = &PL_sv_undef;
832 if (flags & G_DISCARD) {
842 =for apidoc av_exists
844 Returns true if the element indexed by C<key> has been initialized.
846 This relies on the fact that uninitialized array elements are set to
852 Perl_av_exists(pTHX_ AV *av, I32 key)
858 if (SvRMAGICAL(av)) {
859 const MAGIC * const tied_magic = mg_find((SV*)av, PERL_MAGIC_tied);
860 if (tied_magic || mg_find((SV*)av, PERL_MAGIC_regdata)) {
861 SV *sv = sv_newmortal();
863 /* Handle negative array indices 20020222 MJD */
865 unsigned adjust_index = 1;
867 SV * const * const negative_indices_glob =
868 hv_fetch(SvSTASH(SvRV(SvTIED_obj((SV *)av,
870 NEGATIVE_INDICES_VAR, 16, 0);
871 if (negative_indices_glob
872 && SvTRUE(GvSV(*negative_indices_glob)))
876 key += AvFILL(av) + 1;
882 mg_copy((SV*)av, sv, 0, key);
883 mg = mg_find(sv, PERL_MAGIC_tiedelem);
885 magic_existspack(sv, mg);
886 return (bool)SvTRUE(sv);
893 key += AvFILL(av) + 1;
898 if (key <= AvFILLp(av) && AvARRAY(av)[key] != &PL_sv_undef
908 Perl_av_arylen_p(pTHX_ AV *av) {
910 MAGIC *mg = mg_find((SV*)av, PERL_MAGIC_arylen_p);
913 mg = sv_magicext((SV*)av, 0, PERL_MAGIC_arylen_p, &PL_vtbl_arylen_p,
917 Perl_die(aTHX_ "panic: av_arylen_p");
919 /* sv_magicext won't set this for us because we pass in a NULL obj */
920 mg->mg_flags |= MGf_REFCOUNTED;
922 return &(mg->mg_obj);
927 * c-indentation-style: bsd
929 * indent-tabs-mode: t
932 * ex: set ts=8 sts=4 sw=4 noet: