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
15 * [p.476 of _The Lord of the Rings_, III/iv: "Treebeard"]
19 =head1 Array Manipulation Functions
27 Perl_av_reify(pTHX_ AV *av)
32 PERL_ARGS_ASSERT_AV_REIFY;
33 assert(SvTYPE(av) == SVt_PVAV);
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");
42 while (key > AvFILLp(av) + 1)
43 AvARRAY(av)[--key] = &PL_sv_undef;
45 SV * const sv = AvARRAY(av)[--key];
47 if (sv != &PL_sv_undef)
48 SvREFCNT_inc_simple_void_NN(sv);
50 key = AvARRAY(av) - AvALLOC(av);
52 AvALLOC(av)[--key] = &PL_sv_undef;
60 Pre-extend an array. The C<key> is the index to which the array should be
67 Perl_av_extend(pTHX_ AV *av, I32 key)
72 PERL_ARGS_ASSERT_AV_EXTEND;
73 assert(SvTYPE(av) == SVt_PVAV);
75 mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied);
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,
83 if (key > AvMAX(av)) {
88 if (AvALLOC(av) != AvARRAY(av)) {
89 ary = AvALLOC(av) + AvFILLp(av) + 1;
90 tmp = AvARRAY(av) - AvALLOC(av);
91 Move(AvARRAY(av), AvALLOC(av), AvFILLp(av)+1, SV*);
93 AvARRAY(av) = AvALLOC(av);
96 ary[--tmp] = &PL_sv_undef;
98 if (key > AvMAX(av) - 10) {
99 newmax = key + AvMAX(av);
104 #ifdef PERL_MALLOC_WRAP
105 static const char oom_array_extend[] =
106 "Out of memory during array extend"; /* Duplicated in pp_hot.c */
110 #if !defined(STRANGE_MALLOC) && !defined(MYMALLOC)
115 #ifdef Perl_safesysmalloc_size
116 /* Whilst it would be quite possible to move this logic around
117 (as I did in the SV code), so as to set AvMAX(av) early,
118 based on calling Perl_safesysmalloc_size() immediately after
119 allocation, I'm not convinced that it is a great idea here.
120 In an array we have to loop round setting everything to
121 &PL_sv_undef, which means writing to memory, potentially lots
122 of it, whereas for the SV buffer case we don't touch the
123 "bonus" memory. So there there is no cost in telling the
124 world about it, whereas here we have to do work before we can
125 tell the world about it, and that work involves writing to
126 memory that might never be read. So, I feel, better to keep
127 the current lazy system of only writing to it if our caller
128 has a need for more space. NWC */
129 newmax = Perl_safesysmalloc_size((void*)AvALLOC(av)) /
130 sizeof(const SV *) - 1;
135 newmax = key + AvMAX(av) / 5;
137 MEM_WRAP_CHECK_1(newmax+1, SV*, oom_array_extend);
138 #if defined(STRANGE_MALLOC) || defined(MYMALLOC)
139 Renew(AvALLOC(av),newmax+1, SV*);
141 bytes = (newmax + 1) * sizeof(const SV *);
142 #define MALLOC_OVERHEAD 16
143 itmp = MALLOC_OVERHEAD;
144 while ((MEM_SIZE)(itmp - MALLOC_OVERHEAD) < bytes)
146 itmp -= MALLOC_OVERHEAD;
147 itmp /= sizeof(const SV *);
148 assert(itmp > newmax);
150 assert(newmax >= AvMAX(av));
151 Newx(ary, newmax+1, SV*);
152 Copy(AvALLOC(av), ary, AvMAX(av)+1, SV*);
153 Safefree(AvALLOC(av));
156 #ifdef Perl_safesysmalloc_size
159 ary = AvALLOC(av) + AvMAX(av) + 1;
160 tmp = newmax - AvMAX(av);
161 if (av == PL_curstack) { /* Oops, grew stack (via av_store()?) */
162 PL_stack_sp = AvALLOC(av) + (PL_stack_sp - PL_stack_base);
163 PL_stack_base = AvALLOC(av);
164 PL_stack_max = PL_stack_base + newmax;
168 newmax = key < 3 ? 3 : key;
169 MEM_WRAP_CHECK_1(newmax+1, SV*, oom_array_extend);
170 Newx(AvALLOC(av), newmax+1, SV*);
171 ary = AvALLOC(av) + 1;
173 AvALLOC(av)[0] = &PL_sv_undef; /* For the stacks */
177 ary[--tmp] = &PL_sv_undef;
180 AvARRAY(av) = AvALLOC(av);
189 Returns the SV at the specified index in the array. The C<key> is the
190 index. If lval is true, you are guaranteed to get a real SV back (in case
191 it wasn't real before), which you can then modify. Check that the return
192 value is non-null before dereferencing it to a C<SV*>.
194 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
195 more information on how to use this function on tied arrays.
197 The rough perl equivalent is C<$myarray[$idx]>.
203 Perl_av_fetch(pTHX_ register AV *av, I32 key, I32 lval)
207 PERL_ARGS_ASSERT_AV_FETCH;
208 assert(SvTYPE(av) == SVt_PVAV);
210 if (SvRMAGICAL(av)) {
211 const MAGIC * const tied_magic
212 = mg_find((const SV *)av, PERL_MAGIC_tied);
213 if (tied_magic || mg_find((const SV *)av, PERL_MAGIC_regdata)) {
216 I32 adjust_index = 1;
218 /* Handle negative array indices 20020222 MJD */
219 SV * const * const negative_indices_glob =
220 hv_fetch(SvSTASH(SvRV(SvTIED_obj(MUTABLE_SV(av),
222 NEGATIVE_INDICES_VAR, 16, 0);
224 if (negative_indices_glob && SvTRUE(GvSV(*negative_indices_glob)))
229 key += AvFILL(av) + 1;
236 sv_upgrade(sv, SVt_PVLV);
237 mg_copy(MUTABLE_SV(av), sv, 0, key);
238 if (!tied_magic) /* for regdata, force leavesub to make copies */
241 LvTARG(sv) = sv; /* fake (SV**) */
242 return &(LvTARG(sv));
247 key += AvFILL(av) + 1;
252 if (key > AvFILLp(av)) {
255 return av_store(av,key,newSV(0));
257 if (AvARRAY(av)[key] == &PL_sv_undef) {
260 return av_store(av,key,newSV(0));
264 && (!AvARRAY(av)[key] /* eg. @_ could have freed elts */
265 || SvIS_FREED(AvARRAY(av)[key]))) {
266 AvARRAY(av)[key] = &PL_sv_undef; /* 1/2 reify */
269 return &AvARRAY(av)[key];
275 Stores an SV in an array. The array index is specified as C<key>. The
276 return value will be NULL if the operation failed or if the value did not
277 need to be actually stored within the array (as in the case of tied
278 arrays). Otherwise, it can be dereferenced
279 to get the C<SV*> that was stored
282 Note 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 Approximate Perl equivalent: C<$myarray[$key] = $val;>.
288 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
289 more information on how to use this function on tied arrays.
295 Perl_av_store(pTHX_ register AV *av, I32 key, SV *val)
300 PERL_ARGS_ASSERT_AV_STORE;
301 assert(SvTYPE(av) == SVt_PVAV);
303 /* S_regclass relies on being able to pass in a NULL sv
304 (unicode_alternate may be NULL).
310 if (SvRMAGICAL(av)) {
311 const MAGIC * const tied_magic = mg_find((const SV *)av, PERL_MAGIC_tied);
313 /* Handle negative array indices 20020222 MJD */
315 bool adjust_index = 1;
316 SV * const * const negative_indices_glob =
317 hv_fetch(SvSTASH(SvRV(SvTIED_obj(MUTABLE_SV(av),
319 NEGATIVE_INDICES_VAR, 16, 0);
320 if (negative_indices_glob
321 && SvTRUE(GvSV(*negative_indices_glob)))
324 key += AvFILL(av) + 1;
329 if (val != &PL_sv_undef) {
330 mg_copy(MUTABLE_SV(av), val, 0, key);
338 key += AvFILL(av) + 1;
343 if (SvREADONLY(av) && key >= AvFILL(av))
344 Perl_croak_no_modify(aTHX);
346 if (!AvREAL(av) && AvREIFY(av))
351 if (AvFILLp(av) < key) {
353 if (av == PL_curstack && key > PL_stack_sp - PL_stack_base)
354 PL_stack_sp = PL_stack_base + key; /* XPUSH in disguise */
356 ary[++AvFILLp(av)] = &PL_sv_undef;
357 } while (AvFILLp(av) < key);
362 SvREFCNT_dec(ary[key]);
364 if (SvSMAGICAL(av)) {
365 const MAGIC *mg = SvMAGIC(av);
367 for (; mg; mg = mg->mg_moremagic) {
368 if (!isUPPER(mg->mg_type)) continue;
369 if (val != &PL_sv_undef) {
370 sv_magic(val, MUTABLE_SV(av), toLOWER(mg->mg_type), 0, key);
372 if (PL_delaymagic && mg->mg_type == PERL_MAGIC_isa) {
373 PL_delaymagic |= DM_ARRAY_ISA;
378 mg_set(MUTABLE_SV(av));
386 Creates a new AV and populates it with a list of SVs. The SVs are copied
387 into the array, so they may be freed after the call to av_make. The new AV
388 will have a reference count of 1.
390 Perl equivalent: C<my @new_array = ($scalar1, $scalar2, $scalar3...);>
396 Perl_av_make(pTHX_ register I32 size, register SV **strp)
398 register AV * const av = MUTABLE_AV(newSV_type(SVt_PVAV));
399 /* sv_upgrade does AvREAL_only() */
400 PERL_ARGS_ASSERT_AV_MAKE;
401 assert(SvTYPE(av) == SVt_PVAV);
403 if (size) { /* "defined" was returning undef for size==0 anyway. */
409 AvFILLp(av) = AvMAX(av) = size - 1;
410 for (i = 0; i < size; i++) {
413 /* Don't let sv_setsv swipe, since our source array might
414 have multiple references to the same temp scalar (e.g.
415 from a list slice) */
418 sv_setsv_flags(ary[i], *strp,
419 SV_GMAGIC|SV_DO_COW_SVSETSV|SV_NOSTEAL);
429 Clears an array, making it empty. Does not free the memory the av uses to
430 store its list of scalars. If any destructors are triggered as a result,
431 the av itself may be freed when this function returns.
433 Perl equivalent: C<@myarray = ();>.
439 Perl_av_clear(pTHX_ register AV *av)
445 PERL_ARGS_ASSERT_AV_CLEAR;
446 assert(SvTYPE(av) == SVt_PVAV);
449 if (SvREFCNT(av) == 0) {
450 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "Attempt to clear deleted array");
455 Perl_croak_no_modify(aTHX);
457 /* Give any tie a chance to cleanup first */
458 if (SvRMAGICAL(av)) {
459 const MAGIC* const mg = SvMAGIC(av);
460 if (PL_delaymagic && mg && mg->mg_type == PERL_MAGIC_isa)
461 PL_delaymagic |= DM_ARRAY_ISA;
463 mg_clear(MUTABLE_SV(av));
469 if ((real = !!AvREAL(av))) {
470 SV** const ary = AvARRAY(av);
471 I32 index = AvFILLp(av) + 1;
473 SAVEFREESV(SvREFCNT_inc_simple_NN(av));
475 SV * const sv = ary[--index];
476 /* undef the slot before freeing the value, because a
477 * destructor might try to modify this array */
478 ary[index] = &PL_sv_undef;
482 extra = AvARRAY(av) - AvALLOC(av);
485 AvARRAY(av) = AvALLOC(av);
494 Undefines the array. Frees the memory used by the av to store its list of
495 scalars. If any destructors are triggered as a result, the av itself may
502 Perl_av_undef(pTHX_ register AV *av)
506 PERL_ARGS_ASSERT_AV_UNDEF;
507 assert(SvTYPE(av) == SVt_PVAV);
509 /* Give any tie a chance to cleanup first */
510 if (SvTIED_mg((const SV *)av, PERL_MAGIC_tied))
513 if ((real = !!AvREAL(av))) {
514 register I32 key = AvFILLp(av) + 1;
516 SAVEFREESV(SvREFCNT_inc_simple_NN(av));
518 SvREFCNT_dec(AvARRAY(av)[--key]);
521 Safefree(AvALLOC(av));
524 AvMAX(av) = AvFILLp(av) = -1;
526 if(SvRMAGICAL(av)) mg_clear(MUTABLE_SV(av));
532 =for apidoc av_create_and_push
534 Push an SV onto the end of the array, creating the array if necessary.
535 A small internal helper function to remove a commonly duplicated idiom.
541 Perl_av_create_and_push(pTHX_ AV **const avp, SV *const val)
543 PERL_ARGS_ASSERT_AV_CREATE_AND_PUSH;
553 Pushes an SV onto the end of the array. The array will grow automatically
554 to accommodate the addition. This takes ownership of one reference count.
556 Perl equivalent: C<push @myarray, $elem;>.
562 Perl_av_push(pTHX_ register AV *av, SV *val)
567 PERL_ARGS_ASSERT_AV_PUSH;
568 assert(SvTYPE(av) == SVt_PVAV);
571 Perl_croak_no_modify(aTHX);
573 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
574 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, "PUSH", G_DISCARD, 1,
578 av_store(av,AvFILLp(av)+1,val);
584 Pops an SV off the end of the array. Returns C<&PL_sv_undef> if the array
587 Perl equivalent: C<pop(@myarray);>
593 Perl_av_pop(pTHX_ register AV *av)
599 PERL_ARGS_ASSERT_AV_POP;
600 assert(SvTYPE(av) == SVt_PVAV);
603 Perl_croak_no_modify(aTHX);
604 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
605 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, "POP", 0, 0);
607 retval = newSVsv(retval);
612 retval = AvARRAY(av)[AvFILLp(av)];
613 AvARRAY(av)[AvFILLp(av)--] = &PL_sv_undef;
615 mg_set(MUTABLE_SV(av));
621 =for apidoc av_create_and_unshift_one
623 Unshifts an SV onto the beginning of the array, creating the array if
625 A small internal helper function to remove a commonly duplicated idiom.
631 Perl_av_create_and_unshift_one(pTHX_ AV **const avp, SV *const val)
633 PERL_ARGS_ASSERT_AV_CREATE_AND_UNSHIFT_ONE;
638 return av_store(*avp, 0, val);
642 =for apidoc av_unshift
644 Unshift the given number of C<undef> values onto the beginning of the
645 array. The array will grow automatically to accommodate the addition. You
646 must then use C<av_store> to assign values to these new elements.
648 Perl equivalent: C<unshift @myarray, ( (undef) x $n );>
654 Perl_av_unshift(pTHX_ register AV *av, register I32 num)
660 PERL_ARGS_ASSERT_AV_UNSHIFT;
661 assert(SvTYPE(av) == SVt_PVAV);
664 Perl_croak_no_modify(aTHX);
666 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
667 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, "UNSHIFT",
668 G_DISCARD | G_UNDEF_FILL, num);
674 if (!AvREAL(av) && AvREIFY(av))
676 i = AvARRAY(av) - AvALLOC(av);
684 AvARRAY(av) = AvARRAY(av) - i;
688 const I32 i = AvFILLp(av);
689 /* Create extra elements */
690 const I32 slide = i > 0 ? i : 0;
692 av_extend(av, i + num);
695 Move(ary, ary + num, i + 1, SV*);
697 ary[--num] = &PL_sv_undef;
699 /* Make extra elements into a buffer */
701 AvFILLp(av) -= slide;
702 AvARRAY(av) = AvARRAY(av) + slide;
709 Shifts an SV off the beginning of the
710 array. Returns C<&PL_sv_undef> if the
713 Perl equivalent: C<shift(@myarray);>
719 Perl_av_shift(pTHX_ register AV *av)
725 PERL_ARGS_ASSERT_AV_SHIFT;
726 assert(SvTYPE(av) == SVt_PVAV);
729 Perl_croak_no_modify(aTHX);
730 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
731 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, "SHIFT", 0, 0);
733 retval = newSVsv(retval);
738 retval = *AvARRAY(av);
740 *AvARRAY(av) = &PL_sv_undef;
741 AvARRAY(av) = AvARRAY(av) + 1;
745 mg_set(MUTABLE_SV(av));
752 Returns the highest index in the array. The number of elements in the
753 array is C<av_len(av) + 1>. Returns -1 if the array is empty.
755 The Perl equivalent for this is C<$#myarray>.
761 Perl_av_len(pTHX_ 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((const SV *)av, PERL_MAGIC_tied))) {
795 SV *arg1 = sv_newmortal();
796 sv_setiv(arg1, (IV)(fill + 1));
797 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, "STORESIZE", G_DISCARD,
801 if (fill <= AvMAX(av)) {
802 I32 key = AvFILLp(av);
803 SV** const ary = AvARRAY(av);
807 SvREFCNT_dec(ary[key]);
808 ary[key--] = &PL_sv_undef;
813 ary[++key] = &PL_sv_undef;
818 mg_set(MUTABLE_SV(av));
821 (void)av_store(av,fill,&PL_sv_undef);
825 =for apidoc av_delete
827 Deletes the element indexed by C<key> from the array, makes the element mortal,
828 and returns it. If C<flags> equals C<G_DISCARD>, the element is freed and null
829 is returned. Perl equivalent: C<my $elem = delete($myarray[$idx]);> for the
830 non-C<G_DISCARD> version and a void-context C<delete($myarray[$idx]);> for the
831 C<G_DISCARD> version.
836 Perl_av_delete(pTHX_ AV *av, I32 key, I32 flags)
841 PERL_ARGS_ASSERT_AV_DELETE;
842 assert(SvTYPE(av) == SVt_PVAV);
845 Perl_croak_no_modify(aTHX);
847 if (SvRMAGICAL(av)) {
848 const MAGIC * const tied_magic
849 = mg_find((const SV *)av, PERL_MAGIC_tied);
850 if ((tied_magic || mg_find((const SV *)av, PERL_MAGIC_regdata))) {
851 /* Handle negative array indices 20020222 MJD */
854 unsigned adjust_index = 1;
856 SV * const * const negative_indices_glob =
857 hv_fetch(SvSTASH(SvRV(SvTIED_obj(MUTABLE_SV(av),
859 NEGATIVE_INDICES_VAR, 16, 0);
860 if (negative_indices_glob
861 && SvTRUE(GvSV(*negative_indices_glob)))
865 key += AvFILL(av) + 1;
870 svp = av_fetch(av, key, TRUE);
874 if (mg_find(sv, PERL_MAGIC_tiedelem)) {
875 sv_unmagic(sv, PERL_MAGIC_tiedelem); /* No longer an element */
884 key += AvFILL(av) + 1;
889 if (key > AvFILLp(av))
892 if (!AvREAL(av) && AvREIFY(av))
894 sv = AvARRAY(av)[key];
895 if (key == AvFILLp(av)) {
896 AvARRAY(av)[key] = &PL_sv_undef;
899 } while (--key >= 0 && AvARRAY(av)[key] == &PL_sv_undef);
902 AvARRAY(av)[key] = &PL_sv_undef;
904 mg_set(MUTABLE_SV(av));
906 if (flags & G_DISCARD) {
916 =for apidoc av_exists
918 Returns true if the element indexed by C<key> has been initialized.
920 This relies on the fact that uninitialized array elements are set to
923 Perl equivalent: C<exists($myarray[$key])>.
928 Perl_av_exists(pTHX_ AV *av, I32 key)
931 PERL_ARGS_ASSERT_AV_EXISTS;
932 assert(SvTYPE(av) == SVt_PVAV);
934 if (SvRMAGICAL(av)) {
935 const MAGIC * const tied_magic
936 = mg_find((const SV *)av, PERL_MAGIC_tied);
937 const MAGIC * const regdata_magic
938 = mg_find((const SV *)av, PERL_MAGIC_regdata);
939 if (tied_magic || regdata_magic) {
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(MUTABLE_SV(av),
949 NEGATIVE_INDICES_VAR, 16, 0);
950 if (negative_indices_glob
951 && SvTRUE(GvSV(*negative_indices_glob)))
955 key += AvFILL(av) + 1;
963 if(key >= 0 && regdata_magic) {
964 if (key <= AvFILL(av))
970 mg_copy(MUTABLE_SV(av), sv, 0, key);
971 mg = mg_find(sv, PERL_MAGIC_tiedelem);
973 magic_existspack(sv, mg);
974 return cBOOL(SvTRUE(sv));
981 key += AvFILL(av) + 1;
986 if (key <= AvFILLp(av) && AvARRAY(av)[key] != &PL_sv_undef
996 S_get_aux_mg(pTHX_ AV *av) {
1000 PERL_ARGS_ASSERT_GET_AUX_MG;
1001 assert(SvTYPE(av) == SVt_PVAV);
1003 mg = mg_find((const SV *)av, PERL_MAGIC_arylen_p);
1006 mg = sv_magicext(MUTABLE_SV(av), 0, PERL_MAGIC_arylen_p,
1007 &PL_vtbl_arylen_p, 0, 0);
1009 /* sv_magicext won't set this for us because we pass in a NULL obj */
1010 mg->mg_flags |= MGf_REFCOUNTED;
1016 Perl_av_arylen_p(pTHX_ AV *av) {
1017 MAGIC *const mg = get_aux_mg(av);
1019 PERL_ARGS_ASSERT_AV_ARYLEN_P;
1020 assert(SvTYPE(av) == SVt_PVAV);
1022 return &(mg->mg_obj);
1026 Perl_av_iter_p(pTHX_ AV *av) {
1027 MAGIC *const mg = get_aux_mg(av);
1029 PERL_ARGS_ASSERT_AV_ITER_P;
1030 assert(SvTYPE(av) == SVt_PVAV);
1032 #if IVSIZE == I32SIZE
1033 return (IV *)&(mg->mg_len);
1037 mg->mg_len = IVSIZE;
1039 mg->mg_ptr = (char *) temp;
1041 return (IV *)mg->mg_ptr;
1047 * c-indentation-style: bsd
1049 * indent-tabs-mode: t
1052 * ex: set ts=8 sts=4 sw=4 noet: