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