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 av_extend_guts(av,key,&AvMAX(av),&AvALLOC(av),&AvARRAY(av));
86 /* The guts of av_extend. *Not* for general use! */
88 Perl_av_extend_guts(pTHX_ AV *av, I32 key, SSize_t *maxp, SV ***allocp,
93 PERL_ARGS_ASSERT_AV_EXTEND_GUTS;
100 if (av && *allocp != *arrayp) {
101 ary = *allocp + AvFILLp(av) + 1;
102 tmp = *arrayp - *allocp;
103 Move(*arrayp, *allocp, AvFILLp(av)+1, SV*);
108 ary[--tmp] = &PL_sv_undef;
110 if (key > *maxp - 10) {
111 newmax = key + *maxp;
116 #ifdef PERL_MALLOC_WRAP
117 static const char oom_array_extend[] =
118 "Out of memory during array extend"; /* Duplicated in pp_hot.c */
122 #if !defined(STRANGE_MALLOC) && !defined(MYMALLOC)
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;
147 newmax = key + *maxp / 5;
149 MEM_WRAP_CHECK_1(newmax+1, SV*, oom_array_extend);
150 #if defined(STRANGE_MALLOC) || defined(MYMALLOC)
151 Renew(*allocp,newmax+1, SV*);
153 bytes = (newmax + 1) * sizeof(const SV *);
154 #define MALLOC_OVERHEAD 16
155 itmp = MALLOC_OVERHEAD;
156 while ((MEM_SIZE)(itmp - MALLOC_OVERHEAD) < bytes)
158 itmp -= MALLOC_OVERHEAD;
159 itmp /= sizeof(const SV *);
160 assert(itmp > newmax);
162 assert(newmax >= *maxp);
163 Newx(ary, newmax+1, SV*);
164 Copy(*allocp, ary, *maxp+1, SV*);
168 #ifdef Perl_safesysmalloc_size
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;
180 newmax = key < 3 ? 3 : key;
181 MEM_WRAP_CHECK_1(newmax+1, SV*, oom_array_extend);
182 Newx(*allocp, newmax+1, SV*);
185 *allocp[0] = &PL_sv_undef; /* For the stacks */
187 if (av && AvREAL(av)) {
189 ary[--tmp] = &PL_sv_undef;
201 Returns the SV at the specified index in the array. The C<key> is the
202 index. If lval is true, you are guaranteed to get a real SV back (in case
203 it wasn't real before), which you can then modify. Check that the return
204 value is non-null before dereferencing it to a C<SV*>.
206 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
207 more information on how to use this function on tied arrays.
209 The rough perl equivalent is C<$myarray[$idx]>.
215 Perl_av_fetch(pTHX_ register AV *av, I32 key, I32 lval)
219 PERL_ARGS_ASSERT_AV_FETCH;
220 assert(SvTYPE(av) == SVt_PVAV);
222 if (SvRMAGICAL(av)) {
223 const MAGIC * const tied_magic
224 = mg_find((const SV *)av, PERL_MAGIC_tied);
225 if (tied_magic || mg_find((const SV *)av, PERL_MAGIC_regdata)) {
228 I32 adjust_index = 1;
230 /* Handle negative array indices 20020222 MJD */
231 SV * const * const negative_indices_glob =
232 hv_fetch(SvSTASH(SvRV(SvTIED_obj(MUTABLE_SV(av),
234 NEGATIVE_INDICES_VAR, 16, 0);
236 if (negative_indices_glob && SvTRUE(GvSV(*negative_indices_glob)))
241 key += AvFILL(av) + 1;
248 sv_upgrade(sv, SVt_PVLV);
249 mg_copy(MUTABLE_SV(av), sv, 0, key);
250 if (!tied_magic) /* for regdata, force leavesub to make copies */
253 LvTARG(sv) = sv; /* fake (SV**) */
254 return &(LvTARG(sv));
259 key += AvFILL(av) + 1;
264 if (key > AvFILLp(av) || AvARRAY(av)[key] == &PL_sv_undef) {
266 return lval ? av_store(av,key,newSV(0)) : NULL;
270 && (!AvARRAY(av)[key] /* eg. @_ could have freed elts */
271 || SvIS_FREED(AvARRAY(av)[key]))) {
272 AvARRAY(av)[key] = &PL_sv_undef; /* 1/2 reify */
275 return &AvARRAY(av)[key];
281 Stores an SV in an array. The array index is specified as C<key>. The
282 return value will be NULL if the operation failed or if the value did not
283 need to be actually stored within the array (as in the case of tied
284 arrays). Otherwise, it can be dereferenced
285 to get the C<SV*> that was stored
288 Note that the caller is responsible for suitably incrementing the reference
289 count of C<val> before the call, and decrementing it if the function
292 Approximate Perl equivalent: C<$myarray[$key] = $val;>.
294 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
295 more information on how to use this function on tied arrays.
301 Perl_av_store(pTHX_ register AV *av, I32 key, SV *val)
306 PERL_ARGS_ASSERT_AV_STORE;
307 assert(SvTYPE(av) == SVt_PVAV);
309 /* S_regclass relies on being able to pass in a NULL sv
310 (unicode_alternate may be NULL).
316 if (SvRMAGICAL(av)) {
317 const MAGIC * const tied_magic = mg_find((const SV *)av, PERL_MAGIC_tied);
319 /* Handle negative array indices 20020222 MJD */
321 bool adjust_index = 1;
322 SV * const * const negative_indices_glob =
323 hv_fetch(SvSTASH(SvRV(SvTIED_obj(MUTABLE_SV(av),
325 NEGATIVE_INDICES_VAR, 16, 0);
326 if (negative_indices_glob
327 && SvTRUE(GvSV(*negative_indices_glob)))
330 key += AvFILL(av) + 1;
335 if (val != &PL_sv_undef) {
336 mg_copy(MUTABLE_SV(av), val, 0, key);
344 key += AvFILL(av) + 1;
349 if (SvREADONLY(av) && key >= AvFILL(av))
350 Perl_croak_no_modify(aTHX);
352 if (!AvREAL(av) && AvREIFY(av))
357 if (AvFILLp(av) < key) {
359 if (av == PL_curstack && key > PL_stack_sp - PL_stack_base)
360 PL_stack_sp = PL_stack_base + key; /* XPUSH in disguise */
362 ary[++AvFILLp(av)] = &PL_sv_undef;
363 } while (AvFILLp(av) < key);
368 SvREFCNT_dec(ary[key]);
370 if (SvSMAGICAL(av)) {
371 const MAGIC *mg = SvMAGIC(av);
373 for (; mg; mg = mg->mg_moremagic) {
374 if (!isUPPER(mg->mg_type)) continue;
375 if (val != &PL_sv_undef) {
376 sv_magic(val, MUTABLE_SV(av), toLOWER(mg->mg_type), 0, key);
378 if (PL_delaymagic && mg->mg_type == PERL_MAGIC_isa) {
379 PL_delaymagic |= DM_ARRAY_ISA;
384 mg_set(MUTABLE_SV(av));
392 Creates a new AV and populates it with a list of SVs. The SVs are copied
393 into the array, so they may be freed after the call to av_make. The new AV
394 will have a reference count of 1.
396 Perl equivalent: C<my @new_array = ($scalar1, $scalar2, $scalar3...);>
402 Perl_av_make(pTHX_ register I32 size, register SV **strp)
404 AV * const av = MUTABLE_AV(newSV_type(SVt_PVAV));
405 /* sv_upgrade does AvREAL_only() */
406 PERL_ARGS_ASSERT_AV_MAKE;
407 assert(SvTYPE(av) == SVt_PVAV);
409 if (size) { /* "defined" was returning undef for size==0 anyway. */
415 AvMAX(av) = size - 1;
419 for (i = 0; i < size; i++) {
422 /* Don't let sv_setsv swipe, since our source array might
423 have multiple references to the same temp scalar (e.g.
424 from a list slice) */
426 SvGETMAGIC(*strp); /* before newSV, in case it dies */
429 sv_setsv_flags(ary[i], *strp,
430 SV_DO_COW_SVSETSV|SV_NOSTEAL);
433 SvREFCNT_inc_simple_void_NN(av);
442 Clears an array, making it empty. Does not free the memory the av uses to
443 store its list of scalars. If any destructors are triggered as a result,
444 the av itself may be freed when this function returns.
446 Perl equivalent: C<@myarray = ();>.
452 Perl_av_clear(pTHX_ register AV *av)
458 PERL_ARGS_ASSERT_AV_CLEAR;
459 assert(SvTYPE(av) == SVt_PVAV);
462 if (SvREFCNT(av) == 0) {
463 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "Attempt to clear deleted array");
468 Perl_croak_no_modify(aTHX);
470 /* Give any tie a chance to cleanup first */
471 if (SvRMAGICAL(av)) {
472 const MAGIC* const mg = SvMAGIC(av);
473 if (PL_delaymagic && mg && mg->mg_type == PERL_MAGIC_isa)
474 PL_delaymagic |= DM_ARRAY_ISA;
476 mg_clear(MUTABLE_SV(av));
482 if ((real = !!AvREAL(av))) {
483 SV** const ary = AvARRAY(av);
484 I32 index = AvFILLp(av) + 1;
486 SAVEFREESV(SvREFCNT_inc_simple_NN(av));
488 SV * const sv = ary[--index];
489 /* undef the slot before freeing the value, because a
490 * destructor might try to modify this array */
491 ary[index] = &PL_sv_undef;
495 extra = AvARRAY(av) - AvALLOC(av);
498 AvARRAY(av) = AvALLOC(av);
507 Undefines the array. Frees the memory used by the av to store its list of
508 scalars. If any destructors are triggered as a result, the av itself may
515 Perl_av_undef(pTHX_ register AV *av)
519 PERL_ARGS_ASSERT_AV_UNDEF;
520 assert(SvTYPE(av) == SVt_PVAV);
522 /* Give any tie a chance to cleanup first */
523 if (SvTIED_mg((const SV *)av, PERL_MAGIC_tied))
526 if ((real = !!AvREAL(av))) {
527 I32 key = AvFILLp(av) + 1;
529 SAVEFREESV(SvREFCNT_inc_simple_NN(av));
531 SvREFCNT_dec(AvARRAY(av)[--key]);
534 Safefree(AvALLOC(av));
537 AvMAX(av) = AvFILLp(av) = -1;
539 if(SvRMAGICAL(av)) mg_clear(MUTABLE_SV(av));
545 =for apidoc av_create_and_push
547 Push an SV onto the end of the array, creating the array if necessary.
548 A small internal helper function to remove a commonly duplicated idiom.
554 Perl_av_create_and_push(pTHX_ AV **const avp, SV *const val)
556 PERL_ARGS_ASSERT_AV_CREATE_AND_PUSH;
566 Pushes an SV onto the end of the array. The array will grow automatically
567 to accommodate the addition. This takes ownership of one reference count.
569 Perl equivalent: C<push @myarray, $elem;>.
575 Perl_av_push(pTHX_ register AV *av, SV *val)
580 PERL_ARGS_ASSERT_AV_PUSH;
581 assert(SvTYPE(av) == SVt_PVAV);
584 Perl_croak_no_modify(aTHX);
586 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
587 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, "PUSH", G_DISCARD, 1,
591 av_store(av,AvFILLp(av)+1,val);
597 Pops an SV off the end of the array. Returns C<&PL_sv_undef> if the array
600 Perl equivalent: C<pop(@myarray);>
606 Perl_av_pop(pTHX_ register AV *av)
612 PERL_ARGS_ASSERT_AV_POP;
613 assert(SvTYPE(av) == SVt_PVAV);
616 Perl_croak_no_modify(aTHX);
617 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
618 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, "POP", 0, 0);
620 retval = newSVsv(retval);
625 retval = AvARRAY(av)[AvFILLp(av)];
626 AvARRAY(av)[AvFILLp(av)--] = &PL_sv_undef;
628 mg_set(MUTABLE_SV(av));
634 =for apidoc av_create_and_unshift_one
636 Unshifts an SV onto the beginning of the array, creating the array if
638 A small internal helper function to remove a commonly duplicated idiom.
644 Perl_av_create_and_unshift_one(pTHX_ AV **const avp, SV *const val)
646 PERL_ARGS_ASSERT_AV_CREATE_AND_UNSHIFT_ONE;
651 return av_store(*avp, 0, val);
655 =for apidoc av_unshift
657 Unshift the given number of C<undef> values onto the beginning of the
658 array. The array will grow automatically to accommodate the addition. You
659 must then use C<av_store> to assign values to these new elements.
661 Perl equivalent: C<unshift @myarray, ( (undef) x $n );>
667 Perl_av_unshift(pTHX_ register AV *av, register I32 num)
673 PERL_ARGS_ASSERT_AV_UNSHIFT;
674 assert(SvTYPE(av) == SVt_PVAV);
677 Perl_croak_no_modify(aTHX);
679 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
680 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, "UNSHIFT",
681 G_DISCARD | G_UNDEF_FILL, num);
687 if (!AvREAL(av) && AvREIFY(av))
689 i = AvARRAY(av) - AvALLOC(av);
697 AvARRAY(av) = AvARRAY(av) - i;
701 const I32 i = AvFILLp(av);
702 /* Create extra elements */
703 const I32 slide = i > 0 ? i : 0;
705 av_extend(av, i + num);
708 Move(ary, ary + num, i + 1, SV*);
710 ary[--num] = &PL_sv_undef;
712 /* Make extra elements into a buffer */
714 AvFILLp(av) -= slide;
715 AvARRAY(av) = AvARRAY(av) + slide;
722 Shifts an SV off the beginning of the
723 array. Returns C<&PL_sv_undef> if the
726 Perl equivalent: C<shift(@myarray);>
732 Perl_av_shift(pTHX_ register AV *av)
738 PERL_ARGS_ASSERT_AV_SHIFT;
739 assert(SvTYPE(av) == SVt_PVAV);
742 Perl_croak_no_modify(aTHX);
743 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
744 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, "SHIFT", 0, 0);
746 retval = newSVsv(retval);
751 retval = *AvARRAY(av);
753 *AvARRAY(av) = &PL_sv_undef;
754 AvARRAY(av) = AvARRAY(av) + 1;
758 mg_set(MUTABLE_SV(av));
765 Returns the highest index in the array. The number of elements in the
766 array is C<av_len(av) + 1>. Returns -1 if the array is empty.
768 The Perl equivalent for this is C<$#myarray>.
774 Perl_av_len(pTHX_ AV *av)
776 PERL_ARGS_ASSERT_AV_LEN;
777 assert(SvTYPE(av) == SVt_PVAV);
785 Set the highest index in the array to the given number, equivalent to
786 Perl's C<$#array = $fill;>.
788 The number of elements in the an array will be C<fill + 1> after
789 av_fill() returns. If the array was previously shorter, then the
790 additional elements appended are set to C<PL_sv_undef>. If the array
791 was longer, then the excess elements are freed. C<av_fill(av, -1)> is
792 the same as C<av_clear(av)>.
797 Perl_av_fill(pTHX_ register AV *av, I32 fill)
802 PERL_ARGS_ASSERT_AV_FILL;
803 assert(SvTYPE(av) == SVt_PVAV);
807 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
808 SV *arg1 = sv_newmortal();
809 sv_setiv(arg1, (IV)(fill + 1));
810 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, "STORESIZE", G_DISCARD,
814 if (fill <= AvMAX(av)) {
815 I32 key = AvFILLp(av);
816 SV** const ary = AvARRAY(av);
820 SvREFCNT_dec(ary[key]);
821 ary[key--] = &PL_sv_undef;
826 ary[++key] = &PL_sv_undef;
831 mg_set(MUTABLE_SV(av));
834 (void)av_store(av,fill,&PL_sv_undef);
838 =for apidoc av_delete
840 Deletes the element indexed by C<key> from the array, makes the element mortal,
841 and returns it. If C<flags> equals C<G_DISCARD>, the element is freed and null
842 is returned. Perl equivalent: C<my $elem = delete($myarray[$idx]);> for the
843 non-C<G_DISCARD> version and a void-context C<delete($myarray[$idx]);> for the
844 C<G_DISCARD> version.
849 Perl_av_delete(pTHX_ AV *av, I32 key, I32 flags)
854 PERL_ARGS_ASSERT_AV_DELETE;
855 assert(SvTYPE(av) == SVt_PVAV);
858 Perl_croak_no_modify(aTHX);
860 if (SvRMAGICAL(av)) {
861 const MAGIC * const tied_magic
862 = mg_find((const SV *)av, PERL_MAGIC_tied);
863 if ((tied_magic || mg_find((const SV *)av, PERL_MAGIC_regdata))) {
864 /* Handle negative array indices 20020222 MJD */
867 unsigned adjust_index = 1;
869 SV * const * const negative_indices_glob =
870 hv_fetch(SvSTASH(SvRV(SvTIED_obj(MUTABLE_SV(av),
872 NEGATIVE_INDICES_VAR, 16, 0);
873 if (negative_indices_glob
874 && SvTRUE(GvSV(*negative_indices_glob)))
878 key += AvFILL(av) + 1;
883 svp = av_fetch(av, key, TRUE);
887 if (mg_find(sv, PERL_MAGIC_tiedelem)) {
888 sv_unmagic(sv, PERL_MAGIC_tiedelem); /* No longer an element */
897 key += AvFILL(av) + 1;
902 if (key > AvFILLp(av))
905 if (!AvREAL(av) && AvREIFY(av))
907 sv = AvARRAY(av)[key];
908 if (key == AvFILLp(av)) {
909 AvARRAY(av)[key] = &PL_sv_undef;
912 } while (--key >= 0 && AvARRAY(av)[key] == &PL_sv_undef);
915 AvARRAY(av)[key] = &PL_sv_undef;
917 mg_set(MUTABLE_SV(av));
919 if (flags & G_DISCARD) {
929 =for apidoc av_exists
931 Returns true if the element indexed by C<key> has been initialized.
933 This relies on the fact that uninitialized array elements are set to
936 Perl equivalent: C<exists($myarray[$key])>.
941 Perl_av_exists(pTHX_ AV *av, I32 key)
944 PERL_ARGS_ASSERT_AV_EXISTS;
945 assert(SvTYPE(av) == SVt_PVAV);
947 if (SvRMAGICAL(av)) {
948 const MAGIC * const tied_magic
949 = mg_find((const SV *)av, PERL_MAGIC_tied);
950 const MAGIC * const regdata_magic
951 = mg_find((const SV *)av, PERL_MAGIC_regdata);
952 if (tied_magic || regdata_magic) {
953 SV * const sv = sv_newmortal();
955 /* Handle negative array indices 20020222 MJD */
957 unsigned adjust_index = 1;
959 SV * const * const negative_indices_glob =
960 hv_fetch(SvSTASH(SvRV(SvTIED_obj(MUTABLE_SV(av),
962 NEGATIVE_INDICES_VAR, 16, 0);
963 if (negative_indices_glob
964 && SvTRUE(GvSV(*negative_indices_glob)))
968 key += AvFILL(av) + 1;
976 if(key >= 0 && regdata_magic) {
977 if (key <= AvFILL(av))
983 mg_copy(MUTABLE_SV(av), sv, 0, key);
984 mg = mg_find(sv, PERL_MAGIC_tiedelem);
986 magic_existspack(sv, mg);
987 return cBOOL(SvTRUE_nomg(sv));
994 key += AvFILL(av) + 1;
999 if (key <= AvFILLp(av) && AvARRAY(av)[key] != &PL_sv_undef
1000 && AvARRAY(av)[key])
1009 S_get_aux_mg(pTHX_ AV *av) {
1013 PERL_ARGS_ASSERT_GET_AUX_MG;
1014 assert(SvTYPE(av) == SVt_PVAV);
1016 mg = mg_find((const SV *)av, PERL_MAGIC_arylen_p);
1019 mg = sv_magicext(MUTABLE_SV(av), 0, PERL_MAGIC_arylen_p,
1020 &PL_vtbl_arylen_p, 0, 0);
1022 /* sv_magicext won't set this for us because we pass in a NULL obj */
1023 mg->mg_flags |= MGf_REFCOUNTED;
1029 Perl_av_arylen_p(pTHX_ AV *av) {
1030 MAGIC *const mg = get_aux_mg(av);
1032 PERL_ARGS_ASSERT_AV_ARYLEN_P;
1033 assert(SvTYPE(av) == SVt_PVAV);
1035 return &(mg->mg_obj);
1039 Perl_av_iter_p(pTHX_ AV *av) {
1040 MAGIC *const mg = get_aux_mg(av);
1042 PERL_ARGS_ASSERT_AV_ITER_P;
1043 assert(SvTYPE(av) == SVt_PVAV);
1045 #if IVSIZE == I32SIZE
1046 return (IV *)&(mg->mg_len);
1050 mg->mg_len = IVSIZE;
1052 mg->mg_ptr = (char *) temp;
1054 return (IV *)mg->mg_ptr;
1060 * c-indentation-style: bsd
1062 * indent-tabs-mode: nil
1065 * ex: set ts=8 sts=4 sw=4 et: