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)
31 PERL_ARGS_ASSERT_AV_REIFY;
32 assert(SvTYPE(av) == SVt_PVAV);
37 if (SvTIED_mg((const SV *)av, PERL_MAGIC_tied))
38 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "av_reify called on tied array");
41 while (key > AvFILLp(av) + 1)
42 AvARRAY(av)[--key] = NULL;
44 SV * const sv = AvARRAY(av)[--key];
45 if (sv != &PL_sv_undef)
46 SvREFCNT_inc_simple_void(sv);
48 key = AvARRAY(av) - AvALLOC(av);
50 AvALLOC(av)[--key] = NULL;
58 Pre-extend an array. The C<key> is the index to which the array should be
65 Perl_av_extend(pTHX_ AV *av, SSize_t key)
69 PERL_ARGS_ASSERT_AV_EXTEND;
70 assert(SvTYPE(av) == SVt_PVAV);
72 mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied);
74 SV *arg1 = sv_newmortal();
75 sv_setiv(arg1, (IV)(key + 1));
76 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(EXTEND), G_DISCARD, 1,
80 av_extend_guts(av,key,&AvMAX(av),&AvALLOC(av),&AvARRAY(av));
83 /* The guts of av_extend. *Not* for general use! */
85 Perl_av_extend_guts(pTHX_ AV *av, SSize_t key, SSize_t *maxp, SV ***allocp,
88 PERL_ARGS_ASSERT_AV_EXTEND_GUTS;
90 if (key < -1) /* -1 is legal */
92 "panic: av_extend_guts() negative count (%"IVdf")", (IV)key);
99 if (av && *allocp != *arrayp) {
100 ary = *allocp + AvFILLp(av) + 1;
101 tmp = *arrayp - *allocp;
102 Move(*arrayp, *allocp, AvFILLp(av)+1, SV*);
109 if (key > *maxp - 10) {
110 newmax = key + *maxp;
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;
137 /* overflow-safe version of newmax = key + *maxp/5 */
139 newmax = (key > SSize_t_MAX - newmax)
140 ? SSize_t_MAX : key + newmax;
143 #ifdef PERL_MALLOC_WRAP /* Duplicated in pp_hot.c */
144 static const char oom_array_extend[] =
145 "Out of memory during array extend";
147 /* it should really be newmax+1 here, but if newmax
148 * happens to equal SSize_t_MAX, then newmax+1 is
149 * undefined. This means technically we croak one
150 * index lower than we should in theory; in practice
151 * its unlikely the system has SSize_t_MAX/sizeof(SV*)
153 MEM_WRAP_CHECK_1(newmax, SV*, oom_array_extend);
155 #ifdef STRESS_REALLOC
157 SV ** const old_alloc = *allocp;
158 Newx(*allocp, newmax+1, SV*);
159 Copy(old_alloc, *allocp, *maxp + 1, SV*);
163 Renew(*allocp,newmax+1, SV*);
165 #ifdef Perl_safesysmalloc_size
168 ary = *allocp + *maxp + 1;
169 tmp = newmax - *maxp;
170 if (av == PL_curstack) { /* Oops, grew stack (via av_store()?) */
171 PL_stack_sp = *allocp + (PL_stack_sp - PL_stack_base);
172 PL_stack_base = *allocp;
173 PL_stack_max = PL_stack_base + newmax;
177 newmax = key < 3 ? 3 : key;
179 #ifdef PERL_MALLOC_WRAP /* Duplicated in pp_hot.c */
180 static const char oom_array_extend[] =
181 "Out of memory during array extend";
183 /* see comment above about newmax+1*/
184 MEM_WRAP_CHECK_1(newmax, SV*, oom_array_extend);
186 Newx(*allocp, newmax+1, SV*);
189 *allocp[0] = NULL; /* For the stacks */
191 if (av && AvREAL(av)) {
205 Returns the SV at the specified index in the array. The C<key> is the
206 index. If lval is true, you are guaranteed to get a real SV back (in case
207 it wasn't real before), which you can then modify. Check that the return
208 value is non-null before dereferencing it to a C<SV*>.
210 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
211 more information on how to use this function on tied arrays.
213 The rough perl equivalent is C<$myarray[$idx]>.
219 S_adjust_index(pTHX_ AV *av, const MAGIC *mg, SSize_t *keyp)
221 bool adjust_index = 1;
223 /* Handle negative array indices 20020222 MJD */
224 SV * const ref = SvTIED_obj(MUTABLE_SV(av), mg);
226 if (SvROK(ref) && SvOBJECT(SvRV(ref))) {
227 SV * const * const negative_indices_glob =
228 hv_fetchs(SvSTASH(SvRV(ref)), NEGATIVE_INDICES_VAR, 0);
230 if (negative_indices_glob && isGV(*negative_indices_glob)
231 && SvTRUE(GvSV(*negative_indices_glob)))
237 *keyp += AvFILL(av) + 1;
245 Perl_av_fetch(pTHX_ AV *av, SSize_t key, I32 lval)
247 PERL_ARGS_ASSERT_AV_FETCH;
248 assert(SvTYPE(av) == SVt_PVAV);
250 if (UNLIKELY(SvRMAGICAL(av))) {
251 const MAGIC * const tied_magic
252 = mg_find((const SV *)av, PERL_MAGIC_tied);
253 if (tied_magic || mg_find((const SV *)av, PERL_MAGIC_regdata)) {
256 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
261 sv_upgrade(sv, SVt_PVLV);
262 mg_copy(MUTABLE_SV(av), sv, 0, key);
263 if (!tied_magic) /* for regdata, force leavesub to make copies */
266 LvTARG(sv) = sv; /* fake (SV**) */
267 return &(LvTARG(sv));
272 key += AvFILLp(av) + 1;
273 if (UNLIKELY(key < 0))
275 assert(key <= AvFILLp(av));
276 if (!AvARRAY(av)[key])
279 else if (key > AvFILLp(av) || !AvARRAY(av)[key]) {
281 return lval ? av_store(av,key,newSV(0)) : NULL;
284 if (UNLIKELY(AvREIFY(av) && SvIS_FREED(AvARRAY(av)[key]))) {
285 /* eg. @_ could have freed elts */
286 AvARRAY(av)[key] = NULL; /* 1/2 reify */
289 return &AvARRAY(av)[key];
295 Stores an SV in an array. The array index is specified as C<key>. The
296 return value will be C<NULL> if the operation failed or if the value did not
297 need to be actually stored within the array (as in the case of tied
298 arrays). Otherwise, it can be dereferenced
299 to get the C<SV*> that was stored
302 Note that the caller is responsible for suitably incrementing the reference
303 count of C<val> before the call, and decrementing it if the function
306 Approximate Perl equivalent: C<$myarray[$key] = $val;>.
308 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
309 more information on how to use this function on tied arrays.
315 Perl_av_store(pTHX_ AV *av, SSize_t key, SV *val)
319 PERL_ARGS_ASSERT_AV_STORE;
320 assert(SvTYPE(av) == SVt_PVAV);
322 /* S_regclass relies on being able to pass in a NULL sv
323 (unicode_alternate may be NULL).
326 if (SvRMAGICAL(av)) {
327 const MAGIC * const tied_magic = mg_find((const SV *)av, PERL_MAGIC_tied);
330 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
334 mg_copy(MUTABLE_SV(av), val, 0, key);
342 key += AvFILL(av) + 1;
347 if (SvREADONLY(av) && key >= AvFILL(av))
348 Perl_croak_no_modify();
350 if (!AvREAL(av) && AvREIFY(av))
355 if (AvFILLp(av) < key) {
357 if (av == PL_curstack && key > PL_stack_sp - PL_stack_base)
358 PL_stack_sp = PL_stack_base + key; /* XPUSH in disguise */
360 ary[++AvFILLp(av)] = NULL;
361 } while (AvFILLp(av) < key);
366 SvREFCNT_dec(ary[key]);
368 if (SvSMAGICAL(av)) {
369 const MAGIC *mg = SvMAGIC(av);
371 for (; mg; mg = mg->mg_moremagic) {
372 if (!isUPPER(mg->mg_type)) continue;
374 sv_magic(val, MUTABLE_SV(av), toLOWER(mg->mg_type), 0, key);
376 if (PL_delaymagic && mg->mg_type == PERL_MAGIC_isa) {
377 PL_delaymagic |= DM_ARRAY_ISA;
382 mg_set(MUTABLE_SV(av));
390 Creates a new AV and populates it with a list of SVs. The SVs are copied
391 into the array, so they may be freed after the call to C<av_make>. The new AV
392 will have a reference count of 1.
394 Perl equivalent: C<my @new_array = ($scalar1, $scalar2, $scalar3...);>
400 Perl_av_make(pTHX_ SSize_t size, SV **strp)
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);
407 if (size) { /* "defined" was returning undef for size==0 anyway. */
413 AvMAX(av) = size - 1;
417 for (i = 0; i < size; i++) {
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) */
424 SvGETMAGIC(*strp); /* before newSV, in case it dies */
427 sv_setsv_flags(ary[i], *strp,
428 SV_DO_COW_SVSETSV|SV_NOSTEAL);
431 SvREFCNT_inc_simple_void_NN(av);
440 Frees the all the elements of an array, leaving it empty.
441 The XS equivalent of C<@array = ()>. See also L</av_undef>.
443 Note that it is possible that the actions of a destructor called directly
444 or indirectly by freeing an element of the array could cause the reference
445 count of the array itself to be reduced (e.g. by deleting an entry in the
446 symbol table). So it is a possibility that the AV could have been freed
447 (or even reallocated) on return from the call unless you hold a reference
454 Perl_av_clear(pTHX_ AV *av)
459 PERL_ARGS_ASSERT_AV_CLEAR;
460 assert(SvTYPE(av) == SVt_PVAV);
463 if (SvREFCNT(av) == 0) {
464 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "Attempt to clear deleted array");
469 Perl_croak_no_modify();
471 /* Give any tie a chance to cleanup first */
472 if (SvRMAGICAL(av)) {
473 const MAGIC* const mg = SvMAGIC(av);
474 if (PL_delaymagic && mg && mg->mg_type == PERL_MAGIC_isa)
475 PL_delaymagic |= DM_ARRAY_ISA;
477 mg_clear(MUTABLE_SV(av));
483 if ((real = !!AvREAL(av))) {
484 SV** const ary = AvARRAY(av);
485 SSize_t index = AvFILLp(av) + 1;
487 SAVEFREESV(SvREFCNT_inc_simple_NN(av));
489 SV * const sv = ary[--index];
490 /* undef the slot before freeing the value, because a
491 * destructor might try to modify this array */
496 extra = AvARRAY(av) - AvALLOC(av);
499 AvARRAY(av) = AvALLOC(av);
508 Undefines the array. The XS equivalent of C<undef(@array)>.
510 As well as freeing all the elements of the array (like C<av_clear()>), this
511 also frees the memory used by the av to store its list of scalars.
513 See L</av_clear> for a note about the array possibly being invalid on
520 Perl_av_undef(pTHX_ AV *av)
524 PERL_ARGS_ASSERT_AV_UNDEF;
525 assert(SvTYPE(av) == SVt_PVAV);
527 /* Give any tie a chance to cleanup first */
528 if (SvTIED_mg((const SV *)av, PERL_MAGIC_tied))
531 if ((real = !!AvREAL(av))) {
532 SSize_t key = AvFILLp(av) + 1;
534 SAVEFREESV(SvREFCNT_inc_simple_NN(av));
536 SvREFCNT_dec(AvARRAY(av)[--key]);
539 Safefree(AvALLOC(av));
542 AvMAX(av) = AvFILLp(av) = -1;
544 if(SvRMAGICAL(av)) mg_clear(MUTABLE_SV(av));
550 =for apidoc av_create_and_push
552 Push an SV onto the end of the array, creating the array if necessary.
553 A small internal helper function to remove a commonly duplicated idiom.
559 Perl_av_create_and_push(pTHX_ AV **const avp, SV *const val)
561 PERL_ARGS_ASSERT_AV_CREATE_AND_PUSH;
571 Pushes an SV (transferring control of one reference count) onto the end of the
572 array. The array will grow automatically to accommodate the addition.
574 Perl equivalent: C<push @myarray, $elem;>.
580 Perl_av_push(pTHX_ AV *av, SV *val)
584 PERL_ARGS_ASSERT_AV_PUSH;
585 assert(SvTYPE(av) == SVt_PVAV);
588 Perl_croak_no_modify();
590 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
591 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(PUSH), G_DISCARD, 1,
595 av_store(av,AvFILLp(av)+1,val);
601 Removes one SV from the end of the array, reducing its size by one and
602 returning the SV (transferring control of one reference count) to the
603 caller. Returns C<&PL_sv_undef> if the array is empty.
605 Perl equivalent: C<pop(@myarray);>
611 Perl_av_pop(pTHX_ AV *av)
616 PERL_ARGS_ASSERT_AV_POP;
617 assert(SvTYPE(av) == SVt_PVAV);
620 Perl_croak_no_modify();
621 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
622 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(POP), 0, 0);
624 retval = newSVsv(retval);
629 retval = AvARRAY(av)[AvFILLp(av)];
630 AvARRAY(av)[AvFILLp(av)--] = NULL;
632 mg_set(MUTABLE_SV(av));
633 return retval ? retval : &PL_sv_undef;
638 =for apidoc av_create_and_unshift_one
640 Unshifts an SV onto the beginning of the array, creating the array if
642 A small internal helper function to remove a commonly duplicated idiom.
648 Perl_av_create_and_unshift_one(pTHX_ AV **const avp, SV *const val)
650 PERL_ARGS_ASSERT_AV_CREATE_AND_UNSHIFT_ONE;
655 return av_store(*avp, 0, val);
659 =for apidoc av_unshift
661 Unshift the given number of C<undef> values onto the beginning of the
662 array. The array will grow automatically to accommodate the addition. You
663 must then use C<av_store> to assign values to these new elements.
665 Perl equivalent: S<C<unshift @myarray, ( (undef) x $n );>>
671 Perl_av_unshift(pTHX_ AV *av, SSize_t num)
676 PERL_ARGS_ASSERT_AV_UNSHIFT;
677 assert(SvTYPE(av) == SVt_PVAV);
680 Perl_croak_no_modify();
682 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
683 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(UNSHIFT),
684 G_DISCARD | G_UNDEF_FILL, num);
690 if (!AvREAL(av) && AvREIFY(av))
692 i = AvARRAY(av) - AvALLOC(av);
700 AvARRAY(av) = AvARRAY(av) - i;
704 const SSize_t i = AvFILLp(av);
705 /* Create extra elements */
706 const SSize_t slide = i > 0 ? i : 0;
708 av_extend(av, i + num);
711 Move(ary, ary + num, i + 1, SV*);
715 /* Make extra elements into a buffer */
717 AvFILLp(av) -= slide;
718 AvARRAY(av) = AvARRAY(av) + slide;
725 Removes one SV from the start of the array, reducing its size by one and
726 returning the SV (transferring control of one reference count) to the
727 caller. Returns C<&PL_sv_undef> if the array is empty.
729 Perl equivalent: C<shift(@myarray);>
735 Perl_av_shift(pTHX_ AV *av)
740 PERL_ARGS_ASSERT_AV_SHIFT;
741 assert(SvTYPE(av) == SVt_PVAV);
744 Perl_croak_no_modify();
745 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
746 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(SHIFT), 0, 0);
748 retval = newSVsv(retval);
753 retval = *AvARRAY(av);
756 AvARRAY(av) = AvARRAY(av) + 1;
760 mg_set(MUTABLE_SV(av));
761 return retval ? retval : &PL_sv_undef;
765 =for apidoc av_top_index
767 Returns the highest index in the array. The number of elements in the
768 array is S<C<av_top_index(av) + 1>>. Returns -1 if the array is empty.
770 The Perl equivalent for this is C<$#myarray>.
772 (A slightly shorter form is C<av_tindex>.)
776 Same as L</av_top_index>. Note that, unlike what the name implies, it returns
777 the highest index in the array, so to get the size of the array you need to use
778 S<C<av_len(av) + 1>>. This is unlike L</sv_len>, which returns what you would
785 Perl_av_len(pTHX_ AV *av)
787 PERL_ARGS_ASSERT_AV_LEN;
789 return av_top_index(av);
795 Set the highest index in the array to the given number, equivalent to
796 Perl's S<C<$#array = $fill;>>.
798 The number of elements in the array will be S<C<fill + 1>> after
799 C<av_fill()> returns. If the array was previously shorter, then the
800 additional elements appended are set to NULL. If the array
801 was longer, then the excess elements are freed. S<C<av_fill(av, -1)>> is
802 the same as C<av_clear(av)>.
807 Perl_av_fill(pTHX_ AV *av, SSize_t fill)
811 PERL_ARGS_ASSERT_AV_FILL;
812 assert(SvTYPE(av) == SVt_PVAV);
816 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
817 SV *arg1 = sv_newmortal();
818 sv_setiv(arg1, (IV)(fill + 1));
819 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(STORESIZE), G_DISCARD,
823 if (fill <= AvMAX(av)) {
824 SSize_t key = AvFILLp(av);
825 SV** const ary = AvARRAY(av);
829 SvREFCNT_dec(ary[key]);
840 mg_set(MUTABLE_SV(av));
843 (void)av_store(av,fill,NULL);
847 =for apidoc av_delete
849 Deletes the element indexed by C<key> from the array, makes the element mortal,
850 and returns it. If C<flags> equals C<G_DISCARD>, the element is freed and null
851 is returned. Perl equivalent: S<C<my $elem = delete($myarray[$idx]);>> for the
852 non-C<G_DISCARD> version and a void-context S<C<delete($myarray[$idx]);>> for the
853 C<G_DISCARD> version.
858 Perl_av_delete(pTHX_ AV *av, SSize_t key, I32 flags)
862 PERL_ARGS_ASSERT_AV_DELETE;
863 assert(SvTYPE(av) == SVt_PVAV);
866 Perl_croak_no_modify();
868 if (SvRMAGICAL(av)) {
869 const MAGIC * const tied_magic
870 = mg_find((const SV *)av, PERL_MAGIC_tied);
871 if ((tied_magic || mg_find((const SV *)av, PERL_MAGIC_regdata))) {
874 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
877 svp = av_fetch(av, key, TRUE);
881 if (mg_find(sv, PERL_MAGIC_tiedelem)) {
882 sv_unmagic(sv, PERL_MAGIC_tiedelem); /* No longer an element */
891 key += AvFILL(av) + 1;
896 if (key > AvFILLp(av))
899 if (!AvREAL(av) && AvREIFY(av))
901 sv = AvARRAY(av)[key];
902 AvARRAY(av)[key] = NULL;
903 if (key == AvFILLp(av)) {
906 } while (--key >= 0 && !AvARRAY(av)[key]);
909 mg_set(MUTABLE_SV(av));
912 if (flags & G_DISCARD) {
923 =for apidoc av_exists
925 Returns true if the element indexed by C<key> has been initialized.
927 This relies on the fact that uninitialized array elements are set to
930 Perl equivalent: C<exists($myarray[$key])>.
935 Perl_av_exists(pTHX_ AV *av, SSize_t key)
937 PERL_ARGS_ASSERT_AV_EXISTS;
938 assert(SvTYPE(av) == SVt_PVAV);
940 if (SvRMAGICAL(av)) {
941 const MAGIC * const tied_magic
942 = mg_find((const SV *)av, PERL_MAGIC_tied);
943 const MAGIC * const regdata_magic
944 = mg_find((const SV *)av, PERL_MAGIC_regdata);
945 if (tied_magic || regdata_magic) {
947 /* Handle negative array indices 20020222 MJD */
949 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
953 if(key >= 0 && regdata_magic) {
954 if (key <= AvFILL(av))
960 SV * const sv = sv_newmortal();
961 mg_copy(MUTABLE_SV(av), sv, 0, key);
962 mg = mg_find(sv, PERL_MAGIC_tiedelem);
964 magic_existspack(sv, mg);
966 I32 retbool = SvTRUE_nomg_NN(sv);
967 return cBOOL(retbool);
975 key += AvFILL(av) + 1;
980 if (key <= AvFILLp(av) && AvARRAY(av)[key])
989 S_get_aux_mg(pTHX_ AV *av) {
992 PERL_ARGS_ASSERT_GET_AUX_MG;
993 assert(SvTYPE(av) == SVt_PVAV);
995 mg = mg_find((const SV *)av, PERL_MAGIC_arylen_p);
998 mg = sv_magicext(MUTABLE_SV(av), 0, PERL_MAGIC_arylen_p,
999 &PL_vtbl_arylen_p, 0, 0);
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;
1038 * ex: set ts=8 sts=4 sw=4 et: