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