3 * Copyright (c) 1991-1999, Larry Wall
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
11 * "I wonder what the Entish is for 'yes' and 'no'," he thought.
19 #define SV_CHECK_THINKFIRST(sv) if (SvTHINKFIRST(sv)) sv_force_normal(sv)
21 static void do_report_used(pTHXo_ SV *sv);
22 static void do_clean_objs(pTHXo_ SV *sv);
23 #ifndef DISABLE_DESTRUCTOR_KLUDGE
24 static void do_clean_named_objs(pTHXo_ SV *sv);
26 static void do_clean_all(pTHXo_ SV *sv);
34 (p) = (SV*)safemalloc(sizeof(SV)); \
46 Safefree((char*)(p)); \
51 static I32 registry_size;
53 #define REGHASH(sv,size) ((((U32)(sv)) >> 2) % (size))
55 #define REG_REPLACE(sv,a,b) \
57 void* p = sv->sv_any; \
58 I32 h = REGHASH(sv, registry_size); \
60 while (registry[i] != (a)) { \
61 if (++i >= registry_size) \
64 Perl_die(aTHX_ "SV registry bug"); \
69 #define REG_ADD(sv) REG_REPLACE(sv,Nullsv,sv)
70 #define REG_REMOVE(sv) REG_REPLACE(sv,sv,Nullsv)
73 S_reg_add(pTHX_ SV *sv)
75 if (PL_sv_count >= (registry_size >> 1))
77 SV **oldreg = registry;
78 I32 oldsize = registry_size;
80 registry_size = registry_size ? ((registry_size << 2) + 1) : 2037;
81 Newz(707, registry, registry_size, SV*);
86 for (i = 0; i < oldsize; ++i) {
87 SV* oldsv = oldreg[i];
100 S_reg_remove(pTHX_ SV *sv)
107 S_visit(pTHX_ SVFUNC_t f)
111 for (i = 0; i < registry_size; ++i) {
112 SV* sv = registry[i];
113 if (sv && SvTYPE(sv) != SVTYPEMASK)
119 Perl_sv_add_arena(pTHX_ char *ptr, U32 size, U32 flags)
121 if (!(flags & SVf_FAKE))
128 * "A time to plant, and a time to uproot what was planted..."
131 #define plant_SV(p) \
133 SvANY(p) = (void *)PL_sv_root; \
134 SvFLAGS(p) = SVTYPEMASK; \
139 /* sv_mutex must be held while calling uproot_SV() */
140 #define uproot_SV(p) \
143 PL_sv_root = (SV*)SvANY(p); \
165 if (PL_debug & 32768) \
173 S_del_sv(pTHX_ SV *p)
175 if (PL_debug & 32768) {
180 for (sva = PL_sv_arenaroot; sva; sva = (SV *) SvANY(sva)) {
182 svend = &sva[SvREFCNT(sva)];
183 if (p >= sv && p < svend)
187 if (ckWARN_d(WARN_INTERNAL))
188 Perl_warner(aTHX_ WARN_INTERNAL,
189 "Attempt to free non-arena SV: 0x%"UVxf,
197 #else /* ! DEBUGGING */
199 #define del_SV(p) plant_SV(p)
201 #endif /* DEBUGGING */
204 Perl_sv_add_arena(pTHX_ char *ptr, U32 size, U32 flags)
209 Zero(sva, size, char);
211 /* The first SV in an arena isn't an SV. */
212 SvANY(sva) = (void *) PL_sv_arenaroot; /* ptr to next arena */
213 SvREFCNT(sva) = size / sizeof(SV); /* number of SV slots */
214 SvFLAGS(sva) = flags; /* FAKE if not to be freed */
216 PL_sv_arenaroot = sva;
217 PL_sv_root = sva + 1;
219 svend = &sva[SvREFCNT(sva) - 1];
222 SvANY(sv) = (void *)(SV*)(sv + 1);
223 SvFLAGS(sv) = SVTYPEMASK;
227 SvFLAGS(sv) = SVTYPEMASK;
230 /* sv_mutex must be held while calling more_sv() */
237 sv_add_arena(PL_nice_chunk, PL_nice_chunk_size, 0);
238 PL_nice_chunk = Nullch;
241 char *chunk; /* must use New here to match call to */
242 New(704,chunk,1008,char); /* Safefree() in sv_free_arenas() */
243 sv_add_arena(chunk, 1008, 0);
250 S_visit(pTHX_ SVFUNC_t f)
256 for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
257 svend = &sva[SvREFCNT(sva)];
258 for (sv = sva + 1; sv < svend; ++sv) {
259 if (SvTYPE(sv) != SVTYPEMASK)
268 Perl_sv_report_used(pTHX)
270 visit(do_report_used);
274 Perl_sv_clean_objs(pTHX)
276 PL_in_clean_objs = TRUE;
277 visit(do_clean_objs);
278 #ifndef DISABLE_DESTRUCTOR_KLUDGE
279 /* some barnacles may yet remain, clinging to typeglobs */
280 visit(do_clean_named_objs);
282 PL_in_clean_objs = FALSE;
286 Perl_sv_clean_all(pTHX)
288 PL_in_clean_all = TRUE;
290 PL_in_clean_all = FALSE;
294 Perl_sv_free_arenas(pTHX)
299 /* Free arenas here, but be careful about fake ones. (We assume
300 contiguity of the fake ones with the corresponding real ones.) */
302 for (sva = PL_sv_arenaroot; sva; sva = svanext) {
303 svanext = (SV*) SvANY(sva);
304 while (svanext && SvFAKE(svanext))
305 svanext = (SV*) SvANY(svanext);
308 Safefree((void *)sva);
312 Safefree(PL_nice_chunk);
313 PL_nice_chunk = Nullch;
314 PL_nice_chunk_size = 0;
320 Perl_report_uninit(pTHX)
323 Perl_warner(aTHX_ WARN_UNINITIALIZED, PL_warn_uninit,
324 " in ", PL_op_desc[PL_op->op_type]);
326 Perl_warner(aTHX_ WARN_UNINITIALIZED, PL_warn_uninit, "", "");
338 * See comment in more_xiv() -- RAM.
340 PL_xiv_root = *(IV**)xiv;
342 return (XPVIV*)((char*)xiv - STRUCT_OFFSET(XPVIV, xiv_iv));
346 S_del_xiv(pTHX_ XPVIV *p)
348 IV* xiv = (IV*)((char*)(p) + STRUCT_OFFSET(XPVIV, xiv_iv));
350 *(IV**)xiv = PL_xiv_root;
361 New(705, ptr, 1008/sizeof(XPV), XPV);
362 ptr->xpv_pv = (char*)PL_xiv_arenaroot; /* linked list of xiv arenas */
363 PL_xiv_arenaroot = ptr; /* to keep Purify happy */
366 xivend = &xiv[1008 / sizeof(IV) - 1];
367 xiv += (sizeof(XPV) - 1) / sizeof(IV) + 1; /* fudge by size of XPV */
369 while (xiv < xivend) {
370 *(IV**)xiv = (IV *)(xiv + 1);
384 PL_xnv_root = *(NV**)xnv;
386 return (XPVNV*)((char*)xnv - STRUCT_OFFSET(XPVNV, xnv_nv));
390 S_del_xnv(pTHX_ XPVNV *p)
392 NV* xnv = (NV*)((char*)(p) + STRUCT_OFFSET(XPVNV, xnv_nv));
394 *(NV**)xnv = PL_xnv_root;
404 New(711, xnv, 1008/sizeof(NV), NV);
405 xnvend = &xnv[1008 / sizeof(NV) - 1];
406 xnv += (sizeof(XPVIV) - 1) / sizeof(NV) + 1; /* fudge by sizeof XPVIV */
408 while (xnv < xnvend) {
409 *(NV**)xnv = (NV*)(xnv + 1);
423 PL_xrv_root = (XRV*)xrv->xrv_rv;
429 S_del_xrv(pTHX_ XRV *p)
432 p->xrv_rv = (SV*)PL_xrv_root;
441 register XRV* xrvend;
442 New(712, PL_xrv_root, 1008/sizeof(XRV), XRV);
444 xrvend = &xrv[1008 / sizeof(XRV) - 1];
445 while (xrv < xrvend) {
446 xrv->xrv_rv = (SV*)(xrv + 1);
460 PL_xpv_root = (XPV*)xpv->xpv_pv;
466 S_del_xpv(pTHX_ XPV *p)
469 p->xpv_pv = (char*)PL_xpv_root;
478 register XPV* xpvend;
479 New(713, PL_xpv_root, 1008/sizeof(XPV), XPV);
481 xpvend = &xpv[1008 / sizeof(XPV) - 1];
482 while (xpv < xpvend) {
483 xpv->xpv_pv = (char*)(xpv + 1);
496 xpviv = PL_xpviv_root;
497 PL_xpviv_root = (XPVIV*)xpviv->xpv_pv;
503 S_del_xpviv(pTHX_ XPVIV *p)
506 p->xpv_pv = (char*)PL_xpviv_root;
515 register XPVIV* xpviv;
516 register XPVIV* xpvivend;
517 New(714, PL_xpviv_root, 1008/sizeof(XPVIV), XPVIV);
518 xpviv = PL_xpviv_root;
519 xpvivend = &xpviv[1008 / sizeof(XPVIV) - 1];
520 while (xpviv < xpvivend) {
521 xpviv->xpv_pv = (char*)(xpviv + 1);
535 xpvnv = PL_xpvnv_root;
536 PL_xpvnv_root = (XPVNV*)xpvnv->xpv_pv;
542 S_del_xpvnv(pTHX_ XPVNV *p)
545 p->xpv_pv = (char*)PL_xpvnv_root;
554 register XPVNV* xpvnv;
555 register XPVNV* xpvnvend;
556 New(715, PL_xpvnv_root, 1008/sizeof(XPVNV), XPVNV);
557 xpvnv = PL_xpvnv_root;
558 xpvnvend = &xpvnv[1008 / sizeof(XPVNV) - 1];
559 while (xpvnv < xpvnvend) {
560 xpvnv->xpv_pv = (char*)(xpvnv + 1);
575 xpvcv = PL_xpvcv_root;
576 PL_xpvcv_root = (XPVCV*)xpvcv->xpv_pv;
582 S_del_xpvcv(pTHX_ XPVCV *p)
585 p->xpv_pv = (char*)PL_xpvcv_root;
594 register XPVCV* xpvcv;
595 register XPVCV* xpvcvend;
596 New(716, PL_xpvcv_root, 1008/sizeof(XPVCV), XPVCV);
597 xpvcv = PL_xpvcv_root;
598 xpvcvend = &xpvcv[1008 / sizeof(XPVCV) - 1];
599 while (xpvcv < xpvcvend) {
600 xpvcv->xpv_pv = (char*)(xpvcv + 1);
615 xpvav = PL_xpvav_root;
616 PL_xpvav_root = (XPVAV*)xpvav->xav_array;
622 S_del_xpvav(pTHX_ XPVAV *p)
625 p->xav_array = (char*)PL_xpvav_root;
634 register XPVAV* xpvav;
635 register XPVAV* xpvavend;
636 New(717, PL_xpvav_root, 1008/sizeof(XPVAV), XPVAV);
637 xpvav = PL_xpvav_root;
638 xpvavend = &xpvav[1008 / sizeof(XPVAV) - 1];
639 while (xpvav < xpvavend) {
640 xpvav->xav_array = (char*)(xpvav + 1);
643 xpvav->xav_array = 0;
655 xpvhv = PL_xpvhv_root;
656 PL_xpvhv_root = (XPVHV*)xpvhv->xhv_array;
662 S_del_xpvhv(pTHX_ XPVHV *p)
665 p->xhv_array = (char*)PL_xpvhv_root;
674 register XPVHV* xpvhv;
675 register XPVHV* xpvhvend;
676 New(718, PL_xpvhv_root, 1008/sizeof(XPVHV), XPVHV);
677 xpvhv = PL_xpvhv_root;
678 xpvhvend = &xpvhv[1008 / sizeof(XPVHV) - 1];
679 while (xpvhv < xpvhvend) {
680 xpvhv->xhv_array = (char*)(xpvhv + 1);
683 xpvhv->xhv_array = 0;
694 xpvmg = PL_xpvmg_root;
695 PL_xpvmg_root = (XPVMG*)xpvmg->xpv_pv;
701 S_del_xpvmg(pTHX_ XPVMG *p)
704 p->xpv_pv = (char*)PL_xpvmg_root;
713 register XPVMG* xpvmg;
714 register XPVMG* xpvmgend;
715 New(719, PL_xpvmg_root, 1008/sizeof(XPVMG), XPVMG);
716 xpvmg = PL_xpvmg_root;
717 xpvmgend = &xpvmg[1008 / sizeof(XPVMG) - 1];
718 while (xpvmg < xpvmgend) {
719 xpvmg->xpv_pv = (char*)(xpvmg + 1);
734 xpvlv = PL_xpvlv_root;
735 PL_xpvlv_root = (XPVLV*)xpvlv->xpv_pv;
741 S_del_xpvlv(pTHX_ XPVLV *p)
744 p->xpv_pv = (char*)PL_xpvlv_root;
753 register XPVLV* xpvlv;
754 register XPVLV* xpvlvend;
755 New(720, PL_xpvlv_root, 1008/sizeof(XPVLV), XPVLV);
756 xpvlv = PL_xpvlv_root;
757 xpvlvend = &xpvlv[1008 / sizeof(XPVLV) - 1];
758 while (xpvlv < xpvlvend) {
759 xpvlv->xpv_pv = (char*)(xpvlv + 1);
773 xpvbm = PL_xpvbm_root;
774 PL_xpvbm_root = (XPVBM*)xpvbm->xpv_pv;
780 S_del_xpvbm(pTHX_ XPVBM *p)
783 p->xpv_pv = (char*)PL_xpvbm_root;
792 register XPVBM* xpvbm;
793 register XPVBM* xpvbmend;
794 New(721, PL_xpvbm_root, 1008/sizeof(XPVBM), XPVBM);
795 xpvbm = PL_xpvbm_root;
796 xpvbmend = &xpvbm[1008 / sizeof(XPVBM) - 1];
797 while (xpvbm < xpvbmend) {
798 xpvbm->xpv_pv = (char*)(xpvbm + 1);
805 #define new_XIV() (void*)safemalloc(sizeof(XPVIV))
806 #define del_XIV(p) Safefree((char*)p)
808 #define new_XIV() (void*)new_xiv()
809 #define del_XIV(p) del_xiv((XPVIV*) p)
813 #define new_XNV() (void*)safemalloc(sizeof(XPVNV))
814 #define del_XNV(p) Safefree((char*)p)
816 #define new_XNV() (void*)new_xnv()
817 #define del_XNV(p) del_xnv((XPVNV*) p)
821 #define new_XRV() (void*)safemalloc(sizeof(XRV))
822 #define del_XRV(p) Safefree((char*)p)
824 #define new_XRV() (void*)new_xrv()
825 #define del_XRV(p) del_xrv((XRV*) p)
829 #define new_XPV() (void*)safemalloc(sizeof(XPV))
830 #define del_XPV(p) Safefree((char*)p)
832 #define new_XPV() (void*)new_xpv()
833 #define del_XPV(p) del_xpv((XPV *)p)
837 # define my_safemalloc(s) safemalloc(s)
838 # define my_safefree(s) safefree(s)
841 S_my_safemalloc(MEM_SIZE size)
844 New(717, p, size, char);
847 # define my_safefree(s) Safefree(s)
851 #define new_XPVIV() (void*)safemalloc(sizeof(XPVIV))
852 #define del_XPVIV(p) Safefree((char*)p)
854 #define new_XPVIV() (void*)new_xpviv()
855 #define del_XPVIV(p) del_xpviv((XPVIV *)p)
859 #define new_XPVNV() (void*)safemalloc(sizeof(XPVNV))
860 #define del_XPVNV(p) Safefree((char*)p)
862 #define new_XPVNV() (void*)new_xpvnv()
863 #define del_XPVNV(p) del_xpvnv((XPVNV *)p)
868 #define new_XPVCV() (void*)safemalloc(sizeof(XPVCV))
869 #define del_XPVCV(p) Safefree((char*)p)
871 #define new_XPVCV() (void*)new_xpvcv()
872 #define del_XPVCV(p) del_xpvcv((XPVCV *)p)
876 #define new_XPVAV() (void*)safemalloc(sizeof(XPVAV))
877 #define del_XPVAV(p) Safefree((char*)p)
879 #define new_XPVAV() (void*)new_xpvav()
880 #define del_XPVAV(p) del_xpvav((XPVAV *)p)
884 #define new_XPVHV() (void*)safemalloc(sizeof(XPVHV))
885 #define del_XPVHV(p) Safefree((char*)p)
887 #define new_XPVHV() (void*)new_xpvhv()
888 #define del_XPVHV(p) del_xpvhv((XPVHV *)p)
892 #define new_XPVMG() (void*)safemalloc(sizeof(XPVMG))
893 #define del_XPVMG(p) Safefree((char*)p)
895 #define new_XPVMG() (void*)new_xpvmg()
896 #define del_XPVMG(p) del_xpvmg((XPVMG *)p)
900 #define new_XPVLV() (void*)safemalloc(sizeof(XPVLV))
901 #define del_XPVLV(p) Safefree((char*)p)
903 #define new_XPVLV() (void*)new_xpvlv()
904 #define del_XPVLV(p) del_xpvlv((XPVLV *)p)
907 #define new_XPVGV() (void*)my_safemalloc(sizeof(XPVGV))
908 #define del_XPVGV(p) my_safefree((char*)p)
911 #define new_XPVBM() (void*)safemalloc(sizeof(XPVBM))
912 #define del_XPVBM(p) Safefree((char*)p)
914 #define new_XPVBM() (void*)new_xpvbm()
915 #define del_XPVBM(p) del_xpvbm((XPVBM *)p)
918 #define new_XPVFM() (void*)my_safemalloc(sizeof(XPVFM))
919 #define del_XPVFM(p) my_safefree((char*)p)
921 #define new_XPVIO() (void*)my_safemalloc(sizeof(XPVIO))
922 #define del_XPVIO(p) my_safefree((char*)p)
925 Perl_sv_upgrade(pTHX_ register SV *sv, U32 mt)
935 if (SvTYPE(sv) == mt)
941 switch (SvTYPE(sv)) {
962 else if (mt < SVt_PVIV)
979 pv = (char*)SvRV(sv);
999 else if (mt == SVt_NV)
1010 del_XPVIV(SvANY(sv));
1020 del_XPVNV(SvANY(sv));
1028 magic = SvMAGIC(sv);
1029 stash = SvSTASH(sv);
1030 del_XPVMG(SvANY(sv));
1033 Perl_croak(aTHX_ "Can't upgrade that kind of scalar");
1038 Perl_croak(aTHX_ "Can't upgrade to undef");
1040 SvANY(sv) = new_XIV();
1044 SvANY(sv) = new_XNV();
1048 SvANY(sv) = new_XRV();
1052 SvANY(sv) = new_XPV();
1058 SvANY(sv) = new_XPVIV();
1068 SvANY(sv) = new_XPVNV();
1076 SvANY(sv) = new_XPVMG();
1082 SvMAGIC(sv) = magic;
1083 SvSTASH(sv) = stash;
1086 SvANY(sv) = new_XPVLV();
1092 SvMAGIC(sv) = magic;
1093 SvSTASH(sv) = stash;
1100 SvANY(sv) = new_XPVAV();
1108 SvMAGIC(sv) = magic;
1109 SvSTASH(sv) = stash;
1115 SvANY(sv) = new_XPVHV();
1123 SvMAGIC(sv) = magic;
1124 SvSTASH(sv) = stash;
1131 SvANY(sv) = new_XPVCV();
1132 Zero(SvANY(sv), 1, XPVCV);
1138 SvMAGIC(sv) = magic;
1139 SvSTASH(sv) = stash;
1142 SvANY(sv) = new_XPVGV();
1148 SvMAGIC(sv) = magic;
1149 SvSTASH(sv) = stash;
1157 SvANY(sv) = new_XPVBM();
1163 SvMAGIC(sv) = magic;
1164 SvSTASH(sv) = stash;
1170 SvANY(sv) = new_XPVFM();
1171 Zero(SvANY(sv), 1, XPVFM);
1177 SvMAGIC(sv) = magic;
1178 SvSTASH(sv) = stash;
1181 SvANY(sv) = new_XPVIO();
1182 Zero(SvANY(sv), 1, XPVIO);
1188 SvMAGIC(sv) = magic;
1189 SvSTASH(sv) = stash;
1190 IoPAGE_LEN(sv) = 60;
1193 SvFLAGS(sv) &= ~SVTYPEMASK;
1199 Perl_sv_backoff(pTHX_ register SV *sv)
1203 char *s = SvPVX(sv);
1204 SvLEN(sv) += SvIVX(sv);
1205 SvPVX(sv) -= SvIVX(sv);
1207 Move(s, SvPVX(sv), SvCUR(sv)+1, char);
1209 SvFLAGS(sv) &= ~SVf_OOK;
1214 Perl_sv_grow(pTHX_ register SV *sv, register STRLEN newlen)
1218 #ifdef HAS_64K_LIMIT
1219 if (newlen >= 0x10000) {
1220 PerlIO_printf(Perl_debug_log,
1221 "Allocation too large: %"UVxf"\n", (UV)newlen);
1224 #endif /* HAS_64K_LIMIT */
1227 if (SvTYPE(sv) < SVt_PV) {
1228 sv_upgrade(sv, SVt_PV);
1231 else if (SvOOK(sv)) { /* pv is offset? */
1234 if (newlen > SvLEN(sv))
1235 newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
1236 #ifdef HAS_64K_LIMIT
1237 if (newlen >= 0x10000)
1243 if (newlen > SvLEN(sv)) { /* need more room? */
1244 if (SvLEN(sv) && s) {
1245 #if defined(MYMALLOC) && !defined(PURIFY) && !defined(LEAKTEST)
1246 STRLEN l = malloced_size((void*)SvPVX(sv));
1252 Renew(s,newlen,char);
1255 New(703,s,newlen,char);
1257 SvLEN_set(sv, newlen);
1263 Perl_sv_setiv(pTHX_ register SV *sv, IV i)
1265 SV_CHECK_THINKFIRST(sv);
1266 switch (SvTYPE(sv)) {
1268 sv_upgrade(sv, SVt_IV);
1271 sv_upgrade(sv, SVt_PVNV);
1275 sv_upgrade(sv, SVt_PVIV);
1286 Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
1287 PL_op_desc[PL_op->op_type]);
1290 (void)SvIOK_only(sv); /* validate number */
1296 Perl_sv_setiv_mg(pTHX_ register SV *sv, IV i)
1303 Perl_sv_setuv(pTHX_ register SV *sv, UV u)
1311 Perl_sv_setuv_mg(pTHX_ register SV *sv, UV u)
1318 Perl_sv_setnv(pTHX_ register SV *sv, NV num)
1320 SV_CHECK_THINKFIRST(sv);
1321 switch (SvTYPE(sv)) {
1324 sv_upgrade(sv, SVt_NV);
1329 sv_upgrade(sv, SVt_PVNV);
1340 Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
1341 PL_op_name[PL_op->op_type]);
1345 (void)SvNOK_only(sv); /* validate number */
1350 Perl_sv_setnv_mg(pTHX_ register SV *sv, NV num)
1357 S_not_a_number(pTHX_ SV *sv)
1363 char *limit = tmpbuf + sizeof(tmpbuf) - 8;
1364 /* each *s can expand to 4 chars + "...\0",
1365 i.e. need room for 8 chars */
1367 for (s = SvPVX(sv); *s && d < limit; s++) {
1369 if (ch & 128 && !isPRINT_LC(ch)) {
1378 else if (ch == '\r') {
1382 else if (ch == '\f') {
1386 else if (ch == '\\') {
1390 else if (isPRINT_LC(ch))
1405 Perl_warner(aTHX_ WARN_NUMERIC,
1406 "Argument \"%s\" isn't numeric in %s", tmpbuf,
1407 PL_op_desc[PL_op->op_type]);
1409 Perl_warner(aTHX_ WARN_NUMERIC,
1410 "Argument \"%s\" isn't numeric", tmpbuf);
1413 /* the number can be converted to integer with atol() or atoll() */
1414 #define IS_NUMBER_TO_INT_BY_ATOL 0x01
1415 #define IS_NUMBER_TO_INT_BY_ATOF 0x02 /* atol() may be != atof() */
1416 #define IS_NUMBER_NOT_IV 0x04 /* (IV)atof() may be != atof() */
1417 #define IS_NUMBER_NEG 0x08 /* not good to cache UV */
1419 /* Actually, ISO C leaves conversion of UV to IV undefined, but
1420 until proven guilty, assume that things are not that bad... */
1423 Perl_sv_2iv(pTHX_ register SV *sv)
1427 if (SvGMAGICAL(sv)) {
1432 return I_V(SvNVX(sv));
1434 if (SvPOKp(sv) && SvLEN(sv))
1437 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
1439 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1445 if (SvTHINKFIRST(sv)) {
1448 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
1449 return SvIV(tmpstr);
1450 return PTR2IV(SvRV(sv));
1452 if (SvREADONLY(sv) && !SvOK(sv)) {
1454 if (ckWARN(WARN_UNINITIALIZED))
1461 return (IV)(SvUVX(sv));
1468 /* We can cache the IV/UV value even if it not good enough
1469 * to reconstruct NV, since the conversion to PV will prefer
1473 if (SvTYPE(sv) == SVt_NV)
1474 sv_upgrade(sv, SVt_PVNV);
1477 if (SvNVX(sv) < (NV)IV_MAX + 0.5)
1478 SvIVX(sv) = I_V(SvNVX(sv));
1480 SvUVX(sv) = U_V(SvNVX(sv));
1483 DEBUG_c(PerlIO_printf(Perl_debug_log,
1484 "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
1488 return (IV)SvUVX(sv);
1491 else if (SvPOKp(sv) && SvLEN(sv)) {
1492 I32 numtype = looks_like_number(sv);
1494 /* We want to avoid a possible problem when we cache an IV which
1495 may be later translated to an NV, and the resulting NV is not
1496 the translation of the initial data.
1498 This means that if we cache such an IV, we need to cache the
1499 NV as well. Moreover, we trade speed for space, and do not
1500 cache the NV if not needed.
1502 if (numtype & IS_NUMBER_NOT_IV) {
1503 /* May be not an integer. Need to cache NV if we cache IV
1504 * - otherwise future conversion to NV will be wrong. */
1507 d = Atof(SvPVX(sv));
1509 if (SvTYPE(sv) < SVt_PVNV)
1510 sv_upgrade(sv, SVt_PVNV);
1514 #if defined(USE_LONG_DOUBLE)
1515 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
1516 PTR2UV(sv), SvNVX(sv)));
1518 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%g)\n",
1519 PTR2UV(sv), SvNVX(sv)));
1521 if (SvNVX(sv) < (NV)IV_MAX + 0.5)
1522 SvIVX(sv) = I_V(SvNVX(sv));
1524 SvUVX(sv) = U_V(SvNVX(sv));
1530 /* The NV may be reconstructed from IV - safe to cache IV,
1531 which may be calculated by atol(). */
1532 if (SvTYPE(sv) == SVt_PV)
1533 sv_upgrade(sv, SVt_PVIV);
1535 SvIVX(sv) = Atol(SvPVX(sv));
1537 else { /* Not a number. Cache 0. */
1540 if (SvTYPE(sv) < SVt_PVIV)
1541 sv_upgrade(sv, SVt_PVIV);
1544 if (ckWARN(WARN_NUMERIC))
1550 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
1552 if (SvTYPE(sv) < SVt_IV)
1553 /* Typically the caller expects that sv_any is not NULL now. */
1554 sv_upgrade(sv, SVt_IV);
1557 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
1558 PTR2UV(sv),SvIVX(sv)));
1559 return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
1563 Perl_sv_2uv(pTHX_ register SV *sv)
1567 if (SvGMAGICAL(sv)) {
1572 return U_V(SvNVX(sv));
1573 if (SvPOKp(sv) && SvLEN(sv))
1576 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
1578 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1584 if (SvTHINKFIRST(sv)) {
1587 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
1588 return SvUV(tmpstr);
1589 return PTR2UV(SvRV(sv));
1591 if (SvREADONLY(sv) && !SvOK(sv)) {
1593 if (ckWARN(WARN_UNINITIALIZED))
1603 return (UV)SvIVX(sv);
1607 /* We can cache the IV/UV value even if it not good enough
1608 * to reconstruct NV, since the conversion to PV will prefer
1611 if (SvTYPE(sv) == SVt_NV)
1612 sv_upgrade(sv, SVt_PVNV);
1614 if (SvNVX(sv) >= -0.5) {
1616 SvUVX(sv) = U_V(SvNVX(sv));
1619 SvIVX(sv) = I_V(SvNVX(sv));
1621 DEBUG_c(PerlIO_printf(Perl_debug_log,
1622 "0x%"UVxf" 2uv(%"IVdf" => %"IVdf") (as signed)\n",
1625 (IV)(UV)SvIVX(sv)));
1626 return (UV)SvIVX(sv);
1629 else if (SvPOKp(sv) && SvLEN(sv)) {
1630 I32 numtype = looks_like_number(sv);
1632 /* We want to avoid a possible problem when we cache a UV which
1633 may be later translated to an NV, and the resulting NV is not
1634 the translation of the initial data.
1636 This means that if we cache such a UV, we need to cache the
1637 NV as well. Moreover, we trade speed for space, and do not
1638 cache the NV if not needed.
1640 if (numtype & IS_NUMBER_NOT_IV) {
1641 /* May be not an integer. Need to cache NV if we cache IV
1642 * - otherwise future conversion to NV will be wrong. */
1645 d = Atof(SvPVX(sv));
1647 if (SvTYPE(sv) < SVt_PVNV)
1648 sv_upgrade(sv, SVt_PVNV);
1652 #if defined(USE_LONG_DOUBLE)
1653 DEBUG_c(PerlIO_printf(Perl_debug_log,
1654 "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
1655 PTR2UV(sv), SvNVX(sv)));
1657 DEBUG_c(PerlIO_printf(Perl_debug_log,
1658 "0x%"UVxf" 2nv(%g)\n",
1659 PTR2UV(sv), SvNVX(sv)));
1661 if (SvNVX(sv) < -0.5) {
1662 SvIVX(sv) = I_V(SvNVX(sv));
1665 SvUVX(sv) = U_V(SvNVX(sv));
1669 else if (numtype & IS_NUMBER_NEG) {
1670 /* The NV may be reconstructed from IV - safe to cache IV,
1671 which may be calculated by atol(). */
1672 if (SvTYPE(sv) == SVt_PV)
1673 sv_upgrade(sv, SVt_PVIV);
1675 SvIVX(sv) = (IV)Atol(SvPVX(sv));
1677 else if (numtype) { /* Non-negative */
1678 /* The NV may be reconstructed from UV - safe to cache UV,
1679 which may be calculated by strtoul()/atol. */
1680 if (SvTYPE(sv) == SVt_PV)
1681 sv_upgrade(sv, SVt_PVIV);
1683 (void)SvIsUV_on(sv);
1685 SvUVX(sv) = Strtoul(SvPVX(sv), Null(char**), 10);
1686 #else /* no atou(), but we know the number fits into IV... */
1687 /* The only problem may be if it is negative... */
1688 SvUVX(sv) = (UV)Atol(SvPVX(sv));
1691 else { /* Not a number. Cache 0. */
1694 if (SvTYPE(sv) < SVt_PVIV)
1695 sv_upgrade(sv, SVt_PVIV);
1696 SvUVX(sv) = 0; /* We assume that 0s have the
1697 same bitmap in IV and UV. */
1699 (void)SvIsUV_on(sv);
1700 if (ckWARN(WARN_NUMERIC))
1705 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
1707 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1710 if (SvTYPE(sv) < SVt_IV)
1711 /* Typically the caller expects that sv_any is not NULL now. */
1712 sv_upgrade(sv, SVt_IV);
1716 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
1717 PTR2UV(sv),SvUVX(sv)));
1718 return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
1722 Perl_sv_2nv(pTHX_ register SV *sv)
1726 if (SvGMAGICAL(sv)) {
1730 if (SvPOKp(sv) && SvLEN(sv)) {
1732 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !looks_like_number(sv))
1734 return Atof(SvPVX(sv));
1738 return (NV)SvUVX(sv);
1740 return (NV)SvIVX(sv);
1743 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
1745 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1751 if (SvTHINKFIRST(sv)) {
1754 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)))
1755 return SvNV(tmpstr);
1756 return PTR2NV(SvRV(sv));
1758 if (SvREADONLY(sv) && !SvOK(sv)) {
1760 if (ckWARN(WARN_UNINITIALIZED))
1765 if (SvTYPE(sv) < SVt_NV) {
1766 if (SvTYPE(sv) == SVt_IV)
1767 sv_upgrade(sv, SVt_PVNV);
1769 sv_upgrade(sv, SVt_NV);
1770 #if defined(USE_LONG_DOUBLE)
1772 RESTORE_NUMERIC_STANDARD();
1773 PerlIO_printf(Perl_debug_log,
1774 "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
1775 PTR2UV(sv), SvNVX(sv));
1776 RESTORE_NUMERIC_LOCAL();
1780 RESTORE_NUMERIC_STANDARD();
1781 PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%g)\n",
1782 PTR2UV(sv), SvNVX(sv));
1783 RESTORE_NUMERIC_LOCAL();
1787 else if (SvTYPE(sv) < SVt_PVNV)
1788 sv_upgrade(sv, SVt_PVNV);
1790 (!SvPOKp(sv) || !strchr(SvPVX(sv),'.') || !looks_like_number(sv)))
1792 SvNVX(sv) = SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv);
1794 else if (SvPOKp(sv) && SvLEN(sv)) {
1796 if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !looks_like_number(sv))
1798 SvNVX(sv) = Atof(SvPVX(sv));
1802 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
1804 if (SvTYPE(sv) < SVt_NV)
1805 /* Typically the caller expects that sv_any is not NULL now. */
1806 sv_upgrade(sv, SVt_NV);
1810 #if defined(USE_LONG_DOUBLE)
1812 RESTORE_NUMERIC_STANDARD();
1813 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
1814 PTR2UV(sv), SvNVX(sv));
1815 RESTORE_NUMERIC_LOCAL();
1819 RESTORE_NUMERIC_STANDARD();
1820 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%g)\n",
1821 PTR2UV(sv), SvNVX(sv));
1822 RESTORE_NUMERIC_LOCAL();
1829 S_asIV(pTHX_ SV *sv)
1831 I32 numtype = looks_like_number(sv);
1834 if (numtype & IS_NUMBER_TO_INT_BY_ATOL)
1835 return Atol(SvPVX(sv));
1838 if (ckWARN(WARN_NUMERIC))
1841 d = Atof(SvPVX(sv));
1846 S_asUV(pTHX_ SV *sv)
1848 I32 numtype = looks_like_number(sv);
1851 if (numtype & IS_NUMBER_TO_INT_BY_ATOL)
1852 return Strtoul(SvPVX(sv), Null(char**), 10);
1856 if (ckWARN(WARN_NUMERIC))
1859 return U_V(Atof(SvPVX(sv)));
1863 * Returns a combination of (advisory only - can get false negatives)
1864 * IS_NUMBER_TO_INT_BY_ATOL, IS_NUMBER_TO_INT_BY_ATOF, IS_NUMBER_NOT_IV,
1866 * 0 if does not look like number.
1868 * In fact possible values are 0 and
1869 * IS_NUMBER_TO_INT_BY_ATOL 123
1870 * IS_NUMBER_TO_INT_BY_ATOL | IS_NUMBER_NOT_IV 123.1
1871 * IS_NUMBER_TO_INT_BY_ATOF | IS_NUMBER_NOT_IV 123e0
1872 * with a possible addition of IS_NUMBER_NEG.
1876 Perl_looks_like_number(pTHX_ SV *sv)
1879 register char *send;
1880 register char *sbegin;
1881 register char *nbegin;
1889 else if (SvPOKp(sv))
1890 sbegin = SvPV(sv, len);
1893 send = sbegin + len;
1900 numtype = IS_NUMBER_NEG;
1907 * we return IS_NUMBER_TO_INT_BY_ATOL if the number can be converted
1908 * to _integer_ with atol() and IS_NUMBER_TO_INT_BY_ATOF if you need
1912 /* next must be digit or the radix separator */
1916 } while (isDIGIT(*s));
1918 if (s - nbegin >= TYPE_DIGITS(IV)) /* Cannot cache ato[ul]() */
1919 numtype |= IS_NUMBER_TO_INT_BY_ATOF | IS_NUMBER_NOT_IV;
1921 numtype |= IS_NUMBER_TO_INT_BY_ATOL;
1924 #ifdef USE_LOCALE_NUMERIC
1925 || IS_NUMERIC_RADIX(*s)
1929 numtype |= IS_NUMBER_NOT_IV;
1930 while (isDIGIT(*s)) /* optional digits after the radix */
1935 #ifdef USE_LOCALE_NUMERIC
1936 || IS_NUMERIC_RADIX(*s)
1940 numtype |= IS_NUMBER_TO_INT_BY_ATOL | IS_NUMBER_NOT_IV;
1941 /* no digits before the radix means we need digits after it */
1945 } while (isDIGIT(*s));
1953 /* we can have an optional exponent part */
1954 if (*s == 'e' || *s == 'E') {
1955 numtype &= ~IS_NUMBER_NEG;
1956 numtype |= IS_NUMBER_TO_INT_BY_ATOF | IS_NUMBER_NOT_IV;
1958 if (*s == '+' || *s == '-')
1963 } while (isDIGIT(*s));
1972 if (len == 10 && memEQ(sbegin, "0 but true", 10))
1973 return IS_NUMBER_TO_INT_BY_ATOL;
1978 Perl_sv_2pv_nolen(pTHX_ register SV *sv)
1981 return sv_2pv(sv, &n_a);
1984 /* We assume that buf is at least TYPE_CHARS(UV) long. */
1986 uiv_2buf(char *buf, IV iv, UV uv, int is_uv, char **peob)
1989 char *ptr = buf + TYPE_CHARS(UV);
2004 *--ptr = '0' + (uv % 10);
2013 Perl_sv_2pv(pTHX_ register SV *sv, STRLEN *lp)
2018 char tbuf[64]; /* Must fit sprintf/Gconvert of longest IV/NV */
2019 char *tmpbuf = tbuf;
2025 if (SvGMAGICAL(sv)) {
2033 (void)sprintf(tmpbuf,"%"UVuf, (UV)SvUVX(sv));
2035 (void)sprintf(tmpbuf,"%"IVdf, (IV)SvIVX(sv));
2040 Gconvert(SvNVX(sv), NV_DIG, 0, tmpbuf);
2045 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
2047 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
2054 if (SvTHINKFIRST(sv)) {
2057 if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)))
2058 return SvPV(tmpstr,*lp);
2065 switch (SvTYPE(sv)) {
2067 if ( ((SvFLAGS(sv) &
2068 (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG))
2069 == (SVs_OBJECT|SVs_RMG))
2070 && strEQ(s=HvNAME(SvSTASH(sv)), "Regexp")
2071 && (mg = mg_find(sv, 'r'))) {
2073 regexp *re = (regexp *)mg->mg_obj;
2076 char *fptr = "msix";
2081 U16 reganch = (re->reganch & PMf_COMPILETIME) >> 12;
2083 while(ch = *fptr++) {
2085 reflags[left++] = ch;
2088 reflags[right--] = ch;
2093 reflags[left] = '-';
2097 mg->mg_len = re->prelen + 4 + left;
2098 New(616, mg->mg_ptr, mg->mg_len + 1 + left, char);
2099 Copy("(?", mg->mg_ptr, 2, char);
2100 Copy(reflags, mg->mg_ptr+2, left, char);
2101 Copy(":", mg->mg_ptr+left+2, 1, char);
2102 Copy(re->precomp, mg->mg_ptr+3+left, re->prelen, char);
2103 mg->mg_ptr[mg->mg_len - 1] = ')';
2104 mg->mg_ptr[mg->mg_len] = 0;
2106 PL_reginterp_cnt += re->program[0].next_off;
2118 case SVt_PVBM: s = "SCALAR"; break;
2119 case SVt_PVLV: s = "LVALUE"; break;
2120 case SVt_PVAV: s = "ARRAY"; break;
2121 case SVt_PVHV: s = "HASH"; break;
2122 case SVt_PVCV: s = "CODE"; break;
2123 case SVt_PVGV: s = "GLOB"; break;
2124 case SVt_PVFM: s = "FORMAT"; break;
2125 case SVt_PVIO: s = "IO"; break;
2126 default: s = "UNKNOWN"; break;
2130 Perl_sv_setpvf(aTHX_ tsv, "%s=%s", HvNAME(SvSTASH(sv)), s);
2133 Perl_sv_catpvf(aTHX_ tsv, "(0x%"UVxf")", PTR2UV(sv));
2139 if (SvREADONLY(sv) && !SvOK(sv)) {
2141 if (ckWARN(WARN_UNINITIALIZED))
2147 if (SvNOKp(sv)) { /* See note in sv_2uv() */
2148 /* XXXX 64-bit? IV may have better precision... */
2149 /* I tried changing this for to be 64-bit-aware and
2150 * the t/op/numconvert.t became very, very, angry.
2152 if (SvTYPE(sv) < SVt_PVNV)
2153 sv_upgrade(sv, SVt_PVNV);
2156 olderrno = errno; /* some Xenix systems wipe out errno here */
2158 if (SvNVX(sv) == 0.0)
2159 (void)strcpy(s,"0");
2163 Gconvert(SvNVX(sv), NV_DIG, 0, s);
2166 #ifdef FIXNEGATIVEZERO
2167 if (*s == '-' && s[1] == '0' && !s[2])
2176 else if (SvIOKp(sv)) {
2177 U32 isIOK = SvIOK(sv);
2178 U32 isUIOK = SvIsUV(sv);
2179 char buf[TYPE_CHARS(UV)];
2182 if (SvTYPE(sv) < SVt_PVIV)
2183 sv_upgrade(sv, SVt_PVIV);
2185 ptr = uiv_2buf(buf, 0, SvUVX(sv), 1, &ebuf);
2187 ptr = uiv_2buf(buf, SvIVX(sv), 0, 0, &ebuf);
2188 SvGROW(sv, ebuf - ptr + 1); /* inlined from sv_setpvn */
2189 Move(ptr,SvPVX(sv),ebuf - ptr,char);
2190 SvCUR_set(sv, ebuf - ptr);
2203 if (ckWARN(WARN_UNINITIALIZED)
2204 && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
2209 if (SvTYPE(sv) < SVt_PV)
2210 /* Typically the caller expects that sv_any is not NULL now. */
2211 sv_upgrade(sv, SVt_PV);
2214 *lp = s - SvPVX(sv);
2217 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
2218 PTR2UV(sv),SvPVX(sv)));
2222 if (SvROK(sv)) { /* XXX Skip this when sv_pvn_force calls */
2223 /* Sneaky stuff here */
2227 tsv = newSVpv(tmpbuf, 0);
2243 len = strlen(tmpbuf);
2245 #ifdef FIXNEGATIVEZERO
2246 if (len == 2 && t[0] == '-' && t[1] == '0') {
2251 (void)SvUPGRADE(sv, SVt_PV);
2253 s = SvGROW(sv, len + 1);
2262 Perl_sv_2pvbyte_nolen(pTHX_ register SV *sv)
2264 return sv_2pv_nolen(sv);
2268 Perl_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
2270 return sv_2pv(sv,lp);
2274 Perl_sv_2pvutf8_nolen(pTHX_ register SV *sv)
2276 return sv_2pv_nolen(sv);
2280 Perl_sv_2pvutf8(pTHX_ register SV *sv, STRLEN *lp)
2282 return sv_2pv(sv,lp);
2285 /* This function is only called on magical items */
2287 Perl_sv_2bool(pTHX_ register SV *sv)
2297 if (SvAMAGIC(sv) && (tmpsv = AMG_CALLun(sv,bool_)))
2298 return SvTRUE(tmpsv);
2299 return SvRV(sv) != 0;
2302 register XPV* Xpvtmp;
2303 if ((Xpvtmp = (XPV*)SvANY(sv)) &&
2304 (*Xpvtmp->xpv_pv > '0' ||
2305 Xpvtmp->xpv_cur > 1 ||
2306 (Xpvtmp->xpv_cur && *Xpvtmp->xpv_pv != '0')))
2313 return SvIVX(sv) != 0;
2316 return SvNVX(sv) != 0.0;
2323 /* Note: sv_setsv() should not be called with a source string that needs
2324 * to be reused, since it may destroy the source string if it is marked
2329 Perl_sv_setsv(pTHX_ SV *dstr, register SV *sstr)
2332 register U32 sflags;
2338 SV_CHECK_THINKFIRST(dstr);
2340 sstr = &PL_sv_undef;
2341 stype = SvTYPE(sstr);
2342 dtype = SvTYPE(dstr);
2346 /* There's a lot of redundancy below but we're going for speed here */
2351 if (dtype != SVt_PVGV) {
2352 (void)SvOK_off(dstr);
2360 sv_upgrade(dstr, SVt_IV);
2363 sv_upgrade(dstr, SVt_PVNV);
2367 sv_upgrade(dstr, SVt_PVIV);
2370 (void)SvIOK_only(dstr);
2371 SvIVX(dstr) = SvIVX(sstr);
2384 sv_upgrade(dstr, SVt_NV);
2389 sv_upgrade(dstr, SVt_PVNV);
2392 SvNVX(dstr) = SvNVX(sstr);
2393 (void)SvNOK_only(dstr);
2401 sv_upgrade(dstr, SVt_RV);
2402 else if (dtype == SVt_PVGV &&
2403 SvTYPE(SvRV(sstr)) == SVt_PVGV) {
2406 if (GvIMPORTED(dstr) != GVf_IMPORTED
2407 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
2409 GvIMPORTED_on(dstr);
2420 sv_upgrade(dstr, SVt_PV);
2423 if (dtype < SVt_PVIV)
2424 sv_upgrade(dstr, SVt_PVIV);
2427 if (dtype < SVt_PVNV)
2428 sv_upgrade(dstr, SVt_PVNV);
2435 Perl_croak(aTHX_ "Bizarre copy of %s in %s", sv_reftype(sstr, 0),
2436 PL_op_name[PL_op->op_type]);
2438 Perl_croak(aTHX_ "Bizarre copy of %s", sv_reftype(sstr, 0));
2442 if (dtype <= SVt_PVGV) {
2444 if (dtype != SVt_PVGV) {
2445 char *name = GvNAME(sstr);
2446 STRLEN len = GvNAMELEN(sstr);
2447 sv_upgrade(dstr, SVt_PVGV);
2448 sv_magic(dstr, dstr, '*', name, len);
2449 GvSTASH(dstr) = (HV*)SvREFCNT_inc(GvSTASH(sstr));
2450 GvNAME(dstr) = savepvn(name, len);
2451 GvNAMELEN(dstr) = len;
2452 SvFAKE_on(dstr); /* can coerce to non-glob */
2454 /* ahem, death to those who redefine active sort subs */
2455 else if (PL_curstackinfo->si_type == PERLSI_SORT
2456 && GvCV(dstr) && PL_sortcop == CvSTART(GvCV(dstr)))
2457 Perl_croak(aTHX_ "Can't redefine active sort subroutine %s",
2459 (void)SvOK_off(dstr);
2460 GvINTRO_off(dstr); /* one-shot flag */
2462 GvGP(dstr) = gp_ref(GvGP(sstr));
2464 if (GvIMPORTED(dstr) != GVf_IMPORTED
2465 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
2467 GvIMPORTED_on(dstr);
2475 if (SvGMAGICAL(sstr)) {
2477 if (SvTYPE(sstr) != stype) {
2478 stype = SvTYPE(sstr);
2479 if (stype == SVt_PVGV && dtype <= SVt_PVGV)
2483 if (stype == SVt_PVLV)
2484 (void)SvUPGRADE(dstr, SVt_PVNV);
2486 (void)SvUPGRADE(dstr, stype);
2489 sflags = SvFLAGS(sstr);
2491 if (sflags & SVf_ROK) {
2492 if (dtype >= SVt_PV) {
2493 if (dtype == SVt_PVGV) {
2494 SV *sref = SvREFCNT_inc(SvRV(sstr));
2496 int intro = GvINTRO(dstr);
2501 GvINTRO_off(dstr); /* one-shot flag */
2502 Newz(602,gp, 1, GP);
2503 GvGP(dstr) = gp_ref(gp);
2504 GvSV(dstr) = NEWSV(72,0);
2505 GvLINE(dstr) = CopLINE(PL_curcop);
2506 GvEGV(dstr) = (GV*)dstr;
2509 switch (SvTYPE(sref)) {
2512 SAVESPTR(GvAV(dstr));
2514 dref = (SV*)GvAV(dstr);
2515 GvAV(dstr) = (AV*)sref;
2516 if (GvIMPORTED_AV_off(dstr)
2517 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
2519 GvIMPORTED_AV_on(dstr);
2524 SAVESPTR(GvHV(dstr));
2526 dref = (SV*)GvHV(dstr);
2527 GvHV(dstr) = (HV*)sref;
2528 if (GvIMPORTED_HV_off(dstr)
2529 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
2531 GvIMPORTED_HV_on(dstr);
2536 if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
2537 SvREFCNT_dec(GvCV(dstr));
2538 GvCV(dstr) = Nullcv;
2539 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
2540 PL_sub_generation++;
2542 SAVESPTR(GvCV(dstr));
2545 dref = (SV*)GvCV(dstr);
2546 if (GvCV(dstr) != (CV*)sref) {
2547 CV* cv = GvCV(dstr);
2549 if (!GvCVGEN((GV*)dstr) &&
2550 (CvROOT(cv) || CvXSUB(cv)))
2552 SV *const_sv = cv_const_sv(cv);
2553 bool const_changed = TRUE;
2555 const_changed = sv_cmp(const_sv,
2556 op_const_sv(CvSTART((CV*)sref),
2558 /* ahem, death to those who redefine
2559 * active sort subs */
2560 if (PL_curstackinfo->si_type == PERLSI_SORT &&
2561 PL_sortcop == CvSTART(cv))
2563 "Can't redefine active sort subroutine %s",
2564 GvENAME((GV*)dstr));
2565 if (ckWARN(WARN_REDEFINE) || (const_changed && const_sv)) {
2566 if (!(CvGV(cv) && GvSTASH(CvGV(cv))
2567 && HvNAME(GvSTASH(CvGV(cv)))
2568 && strEQ(HvNAME(GvSTASH(CvGV(cv))),
2570 Perl_warner(aTHX_ WARN_REDEFINE, const_sv ?
2571 "Constant subroutine %s redefined"
2572 : "Subroutine %s redefined",
2573 GvENAME((GV*)dstr));
2576 cv_ckproto(cv, (GV*)dstr,
2577 SvPOK(sref) ? SvPVX(sref) : Nullch);
2579 GvCV(dstr) = (CV*)sref;
2580 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
2581 GvASSUMECV_on(dstr);
2582 PL_sub_generation++;
2584 if (GvIMPORTED_CV_off(dstr)
2585 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
2587 GvIMPORTED_CV_on(dstr);
2592 SAVESPTR(GvIOp(dstr));
2594 dref = (SV*)GvIOp(dstr);
2595 GvIOp(dstr) = (IO*)sref;
2599 SAVESPTR(GvSV(dstr));
2601 dref = (SV*)GvSV(dstr);
2603 if (GvIMPORTED_SV_off(dstr)
2604 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
2606 GvIMPORTED_SV_on(dstr);
2618 (void)SvOOK_off(dstr); /* backoff */
2620 Safefree(SvPVX(dstr));
2621 SvLEN(dstr)=SvCUR(dstr)=0;
2624 (void)SvOK_off(dstr);
2625 SvRV(dstr) = SvREFCNT_inc(SvRV(sstr));
2627 if (sflags & SVp_NOK) {
2629 SvNVX(dstr) = SvNVX(sstr);
2631 if (sflags & SVp_IOK) {
2632 (void)SvIOK_on(dstr);
2633 SvIVX(dstr) = SvIVX(sstr);
2637 if (SvAMAGIC(sstr)) {
2641 else if (sflags & SVp_POK) {
2644 * Check to see if we can just swipe the string. If so, it's a
2645 * possible small lose on short strings, but a big win on long ones.
2646 * It might even be a win on short strings if SvPVX(dstr)
2647 * has to be allocated and SvPVX(sstr) has to be freed.
2650 if (SvTEMP(sstr) && /* slated for free anyway? */
2651 SvREFCNT(sstr) == 1 && /* and no other references to it? */
2652 !(sflags & SVf_OOK)) /* and not involved in OOK hack? */
2654 if (SvPVX(dstr)) { /* we know that dtype >= SVt_PV */
2656 SvFLAGS(dstr) &= ~SVf_OOK;
2657 Safefree(SvPVX(dstr) - SvIVX(dstr));
2659 else if (SvLEN(dstr))
2660 Safefree(SvPVX(dstr));
2662 (void)SvPOK_only(dstr);
2663 SvPV_set(dstr, SvPVX(sstr));
2664 SvLEN_set(dstr, SvLEN(sstr));
2665 SvCUR_set(dstr, SvCUR(sstr));
2667 (void)SvOK_off(sstr);
2668 SvPV_set(sstr, Nullch);
2673 else { /* have to copy actual string */
2674 STRLEN len = SvCUR(sstr);
2676 SvGROW(dstr, len + 1); /* inlined from sv_setpvn */
2677 Move(SvPVX(sstr),SvPVX(dstr),len,char);
2678 SvCUR_set(dstr, len);
2679 *SvEND(dstr) = '\0';
2680 (void)SvPOK_only(dstr);
2685 if (sflags & SVp_NOK) {
2687 SvNVX(dstr) = SvNVX(sstr);
2689 if (sflags & SVp_IOK) {
2690 (void)SvIOK_on(dstr);
2691 SvIVX(dstr) = SvIVX(sstr);
2696 else if (sflags & SVp_NOK) {
2697 SvNVX(dstr) = SvNVX(sstr);
2698 (void)SvNOK_only(dstr);
2700 (void)SvIOK_on(dstr);
2701 SvIVX(dstr) = SvIVX(sstr);
2702 /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
2707 else if (sflags & SVp_IOK) {
2708 (void)SvIOK_only(dstr);
2709 SvIVX(dstr) = SvIVX(sstr);
2714 if (dtype == SVt_PVGV) {
2715 if (ckWARN(WARN_UNSAFE))
2716 Perl_warner(aTHX_ WARN_UNSAFE, "Undefined value assigned to typeglob");
2719 (void)SvOK_off(dstr);
2725 Perl_sv_setsv_mg(pTHX_ SV *dstr, register SV *sstr)
2727 sv_setsv(dstr,sstr);
2732 Perl_sv_setpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
2734 register char *dptr;
2735 assert(len >= 0); /* STRLEN is probably unsigned, so this may
2736 elicit a warning, but it won't hurt. */
2737 SV_CHECK_THINKFIRST(sv);
2742 (void)SvUPGRADE(sv, SVt_PV);
2744 SvGROW(sv, len + 1);
2746 Move(ptr,dptr,len,char);
2749 (void)SvPOK_only(sv); /* validate pointer */
2754 Perl_sv_setpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
2756 sv_setpvn(sv,ptr,len);
2761 Perl_sv_setpv(pTHX_ register SV *sv, register const char *ptr)
2763 register STRLEN len;
2765 SV_CHECK_THINKFIRST(sv);
2771 (void)SvUPGRADE(sv, SVt_PV);
2773 SvGROW(sv, len + 1);
2774 Move(ptr,SvPVX(sv),len+1,char);
2776 (void)SvPOK_only(sv); /* validate pointer */
2781 Perl_sv_setpv_mg(pTHX_ register SV *sv, register const char *ptr)
2788 Perl_sv_usepvn(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
2790 SV_CHECK_THINKFIRST(sv);
2791 (void)SvUPGRADE(sv, SVt_PV);
2796 (void)SvOOK_off(sv);
2797 if (SvPVX(sv) && SvLEN(sv))
2798 Safefree(SvPVX(sv));
2799 Renew(ptr, len+1, char);
2802 SvLEN_set(sv, len+1);
2804 (void)SvPOK_only(sv); /* validate pointer */
2809 Perl_sv_usepvn_mg(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
2811 sv_usepvn(sv,ptr,len);
2816 Perl_sv_force_normal(pTHX_ register SV *sv)
2818 if (SvREADONLY(sv)) {
2820 if (PL_curcop != &PL_compiling)
2821 Perl_croak(aTHX_ PL_no_modify);
2825 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
2830 Perl_sv_chop(pTHX_ register SV *sv, register char *ptr) /* like set but assuming ptr is in sv */
2834 register STRLEN delta;
2836 if (!ptr || !SvPOKp(sv))
2838 SV_CHECK_THINKFIRST(sv);
2839 if (SvTYPE(sv) < SVt_PVIV)
2840 sv_upgrade(sv,SVt_PVIV);
2843 if (!SvLEN(sv)) { /* make copy of shared string */
2844 char *pvx = SvPVX(sv);
2845 STRLEN len = SvCUR(sv);
2846 SvGROW(sv, len + 1);
2847 Move(pvx,SvPVX(sv),len,char);
2851 SvFLAGS(sv) |= SVf_OOK;
2853 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVp_IOK|SVp_NOK|SVf_IVisUV);
2854 delta = ptr - SvPVX(sv);
2862 Perl_sv_catpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
2867 junk = SvPV_force(sv, tlen);
2868 SvGROW(sv, tlen + len + 1);
2871 Move(ptr,SvPVX(sv)+tlen,len,char);
2874 (void)SvPOK_only(sv); /* validate pointer */
2879 Perl_sv_catpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
2881 sv_catpvn(sv,ptr,len);
2886 Perl_sv_catsv(pTHX_ SV *dstr, register SV *sstr)
2892 if (s = SvPV(sstr, len))
2893 sv_catpvn(dstr,s,len);
2897 Perl_sv_catsv_mg(pTHX_ SV *dstr, register SV *sstr)
2899 sv_catsv(dstr,sstr);
2904 Perl_sv_catpv(pTHX_ register SV *sv, register const char *ptr)
2906 register STRLEN len;
2912 junk = SvPV_force(sv, tlen);
2914 SvGROW(sv, tlen + len + 1);
2917 Move(ptr,SvPVX(sv)+tlen,len+1,char);
2919 (void)SvPOK_only(sv); /* validate pointer */
2924 Perl_sv_catpv_mg(pTHX_ register SV *sv, register const char *ptr)
2931 Perl_newSV(pTHX_ STRLEN len)
2937 sv_upgrade(sv, SVt_PV);
2938 SvGROW(sv, len + 1);
2943 /* name is assumed to contain an SV* if (name && namelen == HEf_SVKEY) */
2946 Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
2950 if (SvREADONLY(sv)) {
2952 if (PL_curcop != &PL_compiling && !strchr("gBf", how))
2953 Perl_croak(aTHX_ PL_no_modify);
2955 if (SvMAGICAL(sv) || (how == 't' && SvTYPE(sv) >= SVt_PVMG)) {
2956 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
2963 (void)SvUPGRADE(sv, SVt_PVMG);
2965 Newz(702,mg, 1, MAGIC);
2966 mg->mg_moremagic = SvMAGIC(sv);
2969 if (!obj || obj == sv || how == '#' || how == 'r')
2973 mg->mg_obj = SvREFCNT_inc(obj);
2974 mg->mg_flags |= MGf_REFCOUNTED;
2977 mg->mg_len = namlen;
2980 mg->mg_ptr = savepvn(name, namlen);
2981 else if (namlen == HEf_SVKEY)
2982 mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
2986 mg->mg_virtual = &PL_vtbl_sv;
2989 mg->mg_virtual = &PL_vtbl_amagic;
2992 mg->mg_virtual = &PL_vtbl_amagicelem;
2998 mg->mg_virtual = &PL_vtbl_bm;
3001 mg->mg_virtual = &PL_vtbl_regdata;
3004 mg->mg_virtual = &PL_vtbl_regdatum;
3007 mg->mg_virtual = &PL_vtbl_env;
3010 mg->mg_virtual = &PL_vtbl_fm;
3013 mg->mg_virtual = &PL_vtbl_envelem;
3016 mg->mg_virtual = &PL_vtbl_mglob;
3019 mg->mg_virtual = &PL_vtbl_isa;
3022 mg->mg_virtual = &PL_vtbl_isaelem;
3025 mg->mg_virtual = &PL_vtbl_nkeys;
3032 mg->mg_virtual = &PL_vtbl_dbline;
3036 mg->mg_virtual = &PL_vtbl_mutex;
3038 #endif /* USE_THREADS */
3039 #ifdef USE_LOCALE_COLLATE
3041 mg->mg_virtual = &PL_vtbl_collxfrm;
3043 #endif /* USE_LOCALE_COLLATE */
3045 mg->mg_virtual = &PL_vtbl_pack;
3049 mg->mg_virtual = &PL_vtbl_packelem;
3052 mg->mg_virtual = &PL_vtbl_regexp;
3055 mg->mg_virtual = &PL_vtbl_sig;
3058 mg->mg_virtual = &PL_vtbl_sigelem;
3061 mg->mg_virtual = &PL_vtbl_taint;
3065 mg->mg_virtual = &PL_vtbl_uvar;
3068 mg->mg_virtual = &PL_vtbl_vec;
3071 mg->mg_virtual = &PL_vtbl_substr;
3074 mg->mg_virtual = &PL_vtbl_defelem;
3077 mg->mg_virtual = &PL_vtbl_glob;
3080 mg->mg_virtual = &PL_vtbl_arylen;
3083 mg->mg_virtual = &PL_vtbl_pos;
3086 mg->mg_virtual = &PL_vtbl_backref;
3088 case '~': /* Reserved for use by extensions not perl internals. */
3089 /* Useful for attaching extension internal data to perl vars. */
3090 /* Note that multiple extensions may clash if magical scalars */
3091 /* etc holding private data from one are passed to another. */
3095 Perl_croak(aTHX_ "Don't know how to handle magic of type '%c'", how);
3099 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
3103 Perl_sv_unmagic(pTHX_ SV *sv, int type)
3107 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
3110 for (mg = *mgp; mg; mg = *mgp) {
3111 if (mg->mg_type == type) {
3112 MGVTBL* vtbl = mg->mg_virtual;
3113 *mgp = mg->mg_moremagic;
3114 if (vtbl && vtbl->svt_free)
3115 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
3116 if (mg->mg_ptr && mg->mg_type != 'g')
3117 if (mg->mg_len >= 0)
3118 Safefree(mg->mg_ptr);
3119 else if (mg->mg_len == HEf_SVKEY)
3120 SvREFCNT_dec((SV*)mg->mg_ptr);
3121 if (mg->mg_flags & MGf_REFCOUNTED)
3122 SvREFCNT_dec(mg->mg_obj);
3126 mgp = &mg->mg_moremagic;
3130 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
3137 Perl_sv_rvweaken(pTHX_ SV *sv)
3140 if (!SvOK(sv)) /* let undefs pass */
3143 Perl_croak(aTHX_ "Can't weaken a nonreference");
3144 else if (SvWEAKREF(sv)) {
3146 if (ckWARN(WARN_MISC))
3147 Perl_warner(aTHX_ WARN_MISC, "Reference is already weak");
3151 sv_add_backref(tsv, sv);
3158 S_sv_add_backref(pTHX_ SV *tsv, SV *sv)
3162 if (SvMAGICAL(tsv) && (mg = mg_find(tsv, '<')))
3163 av = (AV*)mg->mg_obj;
3166 sv_magic(tsv, (SV*)av, '<', NULL, 0);
3167 SvREFCNT_dec(av); /* for sv_magic */
3173 S_sv_del_backref(pTHX_ SV *sv)
3180 if (!SvMAGICAL(tsv) || !(mg = mg_find(tsv, '<')))
3181 Perl_croak(aTHX_ "panic: del_backref");
3182 av = (AV *)mg->mg_obj;
3187 svp[i] = &PL_sv_undef; /* XXX */
3194 Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
3198 register char *midend;
3199 register char *bigend;
3205 Perl_croak(aTHX_ "Can't modify non-existent substring");
3206 SvPV_force(bigstr, curlen);
3207 if (offset + len > curlen) {
3208 SvGROW(bigstr, offset+len+1);
3209 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
3210 SvCUR_set(bigstr, offset+len);
3213 i = littlelen - len;
3214 if (i > 0) { /* string might grow */
3215 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
3216 mid = big + offset + len;
3217 midend = bigend = big + SvCUR(bigstr);
3220 while (midend > mid) /* shove everything down */
3221 *--bigend = *--midend;
3222 Move(little,big+offset,littlelen,char);
3228 Move(little,SvPVX(bigstr)+offset,len,char);
3233 big = SvPVX(bigstr);
3236 bigend = big + SvCUR(bigstr);
3238 if (midend > bigend)
3239 Perl_croak(aTHX_ "panic: sv_insert");
3241 if (mid - big > bigend - midend) { /* faster to shorten from end */
3243 Move(little, mid, littlelen,char);
3246 i = bigend - midend;
3248 Move(midend, mid, i,char);
3252 SvCUR_set(bigstr, mid - big);
3255 else if (i = mid - big) { /* faster from front */
3256 midend -= littlelen;
3258 sv_chop(bigstr,midend-i);
3263 Move(little, mid, littlelen,char);
3265 else if (littlelen) {
3266 midend -= littlelen;
3267 sv_chop(bigstr,midend);
3268 Move(little,midend,littlelen,char);
3271 sv_chop(bigstr,midend);
3276 /* make sv point to what nstr did */
3279 Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
3282 U32 refcnt = SvREFCNT(sv);
3283 SV_CHECK_THINKFIRST(sv);
3284 if (SvREFCNT(nsv) != 1 && ckWARN_d(WARN_INTERNAL))
3285 Perl_warner(aTHX_ WARN_INTERNAL, "Reference miscount in sv_replace()");
3286 if (SvMAGICAL(sv)) {
3290 sv_upgrade(nsv, SVt_PVMG);
3291 SvMAGIC(nsv) = SvMAGIC(sv);
3292 SvFLAGS(nsv) |= SvMAGICAL(sv);
3298 assert(!SvREFCNT(sv));
3299 StructCopy(nsv,sv,SV);
3300 SvREFCNT(sv) = refcnt;
3301 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
3306 Perl_sv_clear(pTHX_ register SV *sv)
3310 assert(SvREFCNT(sv) == 0);
3314 if (PL_defstash) { /* Still have a symbol table? */
3319 Zero(&tmpref, 1, SV);
3320 sv_upgrade(&tmpref, SVt_RV);
3322 SvREADONLY_on(&tmpref); /* DESTROY() could be naughty */
3323 SvREFCNT(&tmpref) = 1;
3326 stash = SvSTASH(sv);
3327 destructor = gv_fetchmethod(SvSTASH(sv), "DESTROY");
3330 PUSHSTACKi(PERLSI_DESTROY);
3331 SvRV(&tmpref) = SvREFCNT_inc(sv);
3336 call_sv((SV*)GvCV(destructor),
3337 G_DISCARD|G_EVAL|G_KEEPERR);
3343 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
3345 del_XRV(SvANY(&tmpref));
3348 if (PL_in_clean_objs)
3349 Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
3351 /* DESTROY gave object new lease on life */
3357 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
3358 SvOBJECT_off(sv); /* Curse the object. */
3359 if (SvTYPE(sv) != SVt_PVIO)
3360 --PL_sv_objcount; /* XXX Might want something more general */
3363 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
3366 switch (SvTYPE(sv)) {
3369 IoIFP(sv) != PerlIO_stdin() &&
3370 IoIFP(sv) != PerlIO_stdout() &&
3371 IoIFP(sv) != PerlIO_stderr())
3373 io_close((IO*)sv, FALSE);
3375 if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
3376 PerlDir_close(IoDIRP(sv));
3377 IoDIRP(sv) = (DIR*)NULL;
3378 Safefree(IoTOP_NAME(sv));
3379 Safefree(IoFMT_NAME(sv));
3380 Safefree(IoBOTTOM_NAME(sv));
3395 SvREFCNT_dec(LvTARG(sv));
3399 Safefree(GvNAME(sv));
3400 /* cannot decrease stash refcount yet, as we might recursively delete
3401 ourselves when the refcnt drops to zero. Delay SvREFCNT_dec
3402 of stash until current sv is completely gone.
3403 -- JohnPC, 27 Mar 1998 */
3404 stash = GvSTASH(sv);
3410 (void)SvOOK_off(sv);
3418 SvREFCNT_dec(SvRV(sv));
3420 else if (SvPVX(sv) && SvLEN(sv))
3421 Safefree(SvPVX(sv));
3431 switch (SvTYPE(sv)) {
3447 del_XPVIV(SvANY(sv));
3450 del_XPVNV(SvANY(sv));
3453 del_XPVMG(SvANY(sv));
3456 del_XPVLV(SvANY(sv));
3459 del_XPVAV(SvANY(sv));
3462 del_XPVHV(SvANY(sv));
3465 del_XPVCV(SvANY(sv));
3468 del_XPVGV(SvANY(sv));
3469 /* code duplication for increased performance. */
3470 SvFLAGS(sv) &= SVf_BREAK;
3471 SvFLAGS(sv) |= SVTYPEMASK;
3472 /* decrease refcount of the stash that owns this GV, if any */
3474 SvREFCNT_dec(stash);
3475 return; /* not break, SvFLAGS reset already happened */
3477 del_XPVBM(SvANY(sv));
3480 del_XPVFM(SvANY(sv));
3483 del_XPVIO(SvANY(sv));
3486 SvFLAGS(sv) &= SVf_BREAK;
3487 SvFLAGS(sv) |= SVTYPEMASK;
3491 Perl_sv_newref(pTHX_ SV *sv)
3494 ATOMIC_INC(SvREFCNT(sv));
3499 Perl_sv_free(pTHX_ SV *sv)
3502 int refcount_is_zero;
3506 if (SvREFCNT(sv) == 0) {
3507 if (SvFLAGS(sv) & SVf_BREAK)
3509 if (PL_in_clean_all) /* All is fair */
3511 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
3512 /* make sure SvREFCNT(sv)==0 happens very seldom */
3513 SvREFCNT(sv) = (~(U32)0)/2;
3516 if (ckWARN_d(WARN_INTERNAL))
3517 Perl_warner(aTHX_ WARN_INTERNAL, "Attempt to free unreferenced scalar");
3520 ATOMIC_DEC_AND_TEST(refcount_is_zero, SvREFCNT(sv));
3521 if (!refcount_is_zero)
3525 if (ckWARN_d(WARN_DEBUGGING))
3526 Perl_warner(aTHX_ WARN_DEBUGGING,
3527 "Attempt to free temp prematurely: SV 0x%"UVxf,
3532 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
3533 /* make sure SvREFCNT(sv)==0 happens very seldom */
3534 SvREFCNT(sv) = (~(U32)0)/2;
3543 Perl_sv_len(pTHX_ register SV *sv)
3552 len = mg_length(sv);
3554 junk = SvPV(sv, len);
3559 Perl_sv_len_utf8(pTHX_ register SV *sv)
3570 len = mg_length(sv);
3573 s = (U8*)SvPV(sv, len);
3584 Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
3589 I32 uoffset = *offsetp;
3595 start = s = (U8*)SvPV(sv, len);
3597 while (s < send && uoffset--)
3601 *offsetp = s - start;
3605 while (s < send && ulen--)
3615 Perl_sv_pos_b2u(pTHX_ register SV *sv, I32* offsetp)
3624 s = (U8*)SvPV(sv, len);
3626 Perl_croak(aTHX_ "panic: bad byte offset");
3627 send = s + *offsetp;
3635 if (ckWARN_d(WARN_UTF8))
3636 Perl_warner(aTHX_ WARN_UTF8, "Malformed UTF-8 character");
3644 Perl_sv_eq(pTHX_ register SV *str1, register SV *str2)
3656 pv1 = SvPV(str1, cur1);
3661 pv2 = SvPV(str2, cur2);
3666 return memEQ(pv1, pv2, cur1);
3670 Perl_sv_cmp(pTHX_ register SV *str1, register SV *str2)
3673 char *pv1 = str1 ? SvPV(str1, cur1) : (char *) NULL;
3675 char *pv2 = str2 ? SvPV(str2, cur2) : (char *) NULL;
3679 return cur2 ? -1 : 0;
3684 retval = memcmp((void*)pv1, (void*)pv2, cur1 < cur2 ? cur1 : cur2);
3687 return retval < 0 ? -1 : 1;
3692 return cur1 < cur2 ? -1 : 1;
3696 Perl_sv_cmp_locale(pTHX_ register SV *sv1, register SV *sv2)
3698 #ifdef USE_LOCALE_COLLATE
3704 if (PL_collation_standard)
3708 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
3710 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
3712 if (!pv1 || !len1) {
3723 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
3726 return retval < 0 ? -1 : 1;
3729 * When the result of collation is equality, that doesn't mean
3730 * that there are no differences -- some locales exclude some
3731 * characters from consideration. So to avoid false equalities,
3732 * we use the raw string as a tiebreaker.
3738 #endif /* USE_LOCALE_COLLATE */
3740 return sv_cmp(sv1, sv2);
3743 #ifdef USE_LOCALE_COLLATE
3745 * Any scalar variable may carry an 'o' magic that contains the
3746 * scalar data of the variable transformed to such a format that
3747 * a normal memory comparison can be used to compare the data
3748 * according to the locale settings.
3751 Perl_sv_collxfrm(pTHX_ SV *sv, STRLEN *nxp)
3755 mg = SvMAGICAL(sv) ? mg_find(sv, 'o') : (MAGIC *) NULL;
3756 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
3761 Safefree(mg->mg_ptr);
3763 if ((xf = mem_collxfrm(s, len, &xlen))) {
3764 if (SvREADONLY(sv)) {
3767 return xf + sizeof(PL_collation_ix);
3770 sv_magic(sv, 0, 'o', 0, 0);
3771 mg = mg_find(sv, 'o');
3784 if (mg && mg->mg_ptr) {
3786 return mg->mg_ptr + sizeof(PL_collation_ix);
3794 #endif /* USE_LOCALE_COLLATE */
3797 Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
3802 register STDCHAR rslast;
3803 register STDCHAR *bp;
3807 SV_CHECK_THINKFIRST(sv);
3808 (void)SvUPGRADE(sv, SVt_PV);
3812 if (RsSNARF(PL_rs)) {
3816 else if (RsRECORD(PL_rs)) {
3817 I32 recsize, bytesread;
3820 /* Grab the size of the record we're getting */
3821 recsize = SvIV(SvRV(PL_rs));
3822 (void)SvPOK_only(sv); /* Validate pointer */
3823 buffer = SvGROW(sv, recsize + 1);
3826 /* VMS wants read instead of fread, because fread doesn't respect */
3827 /* RMS record boundaries. This is not necessarily a good thing to be */
3828 /* doing, but we've got no other real choice */
3829 bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
3831 bytesread = PerlIO_read(fp, buffer, recsize);
3833 SvCUR_set(sv, bytesread);
3834 buffer[bytesread] = '\0';
3835 return(SvCUR(sv) ? SvPVX(sv) : Nullch);
3837 else if (RsPARA(PL_rs)) {
3842 rsptr = SvPV(PL_rs, rslen);
3843 rslast = rslen ? rsptr[rslen - 1] : '\0';
3845 if (RsPARA(PL_rs)) { /* have to do this both before and after */
3846 do { /* to make sure file boundaries work right */
3849 i = PerlIO_getc(fp);
3853 PerlIO_ungetc(fp,i);
3859 /* See if we know enough about I/O mechanism to cheat it ! */
3861 /* This used to be #ifdef test - it is made run-time test for ease
3862 of abstracting out stdio interface. One call should be cheap
3863 enough here - and may even be a macro allowing compile
3867 if (PerlIO_fast_gets(fp)) {
3870 * We're going to steal some values from the stdio struct
3871 * and put EVERYTHING in the innermost loop into registers.
3873 register STDCHAR *ptr;
3877 #if defined(VMS) && defined(PERLIO_IS_STDIO)
3878 /* An ungetc()d char is handled separately from the regular
3879 * buffer, so we getc() it back out and stuff it in the buffer.
3881 i = PerlIO_getc(fp);
3882 if (i == EOF) return 0;
3883 *(--((*fp)->_ptr)) = (unsigned char) i;
3887 /* Here is some breathtakingly efficient cheating */
3889 cnt = PerlIO_get_cnt(fp); /* get count into register */
3890 (void)SvPOK_only(sv); /* validate pointer */
3891 if (SvLEN(sv) - append <= cnt + 1) { /* make sure we have the room */
3892 if (cnt > 80 && SvLEN(sv) > append) {
3893 shortbuffered = cnt - SvLEN(sv) + append + 1;
3894 cnt -= shortbuffered;
3898 /* remember that cnt can be negative */
3899 SvGROW(sv, append + (cnt <= 0 ? 2 : (cnt + 1)));
3904 bp = (STDCHAR*)SvPVX(sv) + append; /* move these two too to registers */
3905 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
3906 DEBUG_P(PerlIO_printf(Perl_debug_log,
3907 "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
3908 DEBUG_P(PerlIO_printf(Perl_debug_log,
3909 "Screamer: entering: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
3910 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
3911 PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
3916 while (cnt > 0) { /* this | eat */
3918 if ((*bp++ = *ptr++) == rslast) /* really | dust */
3919 goto thats_all_folks; /* screams | sed :-) */
3923 Copy(ptr, bp, cnt, char); /* this | eat */
3924 bp += cnt; /* screams | dust */
3925 ptr += cnt; /* louder | sed :-) */
3930 if (shortbuffered) { /* oh well, must extend */
3931 cnt = shortbuffered;
3933 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
3935 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
3936 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
3940 DEBUG_P(PerlIO_printf(Perl_debug_log,
3941 "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
3942 PTR2UV(ptr),(long)cnt));
3943 PerlIO_set_ptrcnt(fp, ptr, cnt); /* deregisterize cnt and ptr */
3944 DEBUG_P(PerlIO_printf(Perl_debug_log,
3945 "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
3946 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
3947 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
3948 /* This used to call 'filbuf' in stdio form, but as that behaves like
3949 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
3950 another abstraction. */
3951 i = PerlIO_getc(fp); /* get more characters */
3952 DEBUG_P(PerlIO_printf(Perl_debug_log,
3953 "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
3954 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
3955 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
3956 cnt = PerlIO_get_cnt(fp);
3957 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
3958 DEBUG_P(PerlIO_printf(Perl_debug_log,
3959 "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
3961 if (i == EOF) /* all done for ever? */
3962 goto thats_really_all_folks;
3964 bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
3966 SvGROW(sv, bpx + cnt + 2);
3967 bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
3969 *bp++ = i; /* store character from PerlIO_getc */
3971 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
3972 goto thats_all_folks;
3976 if ((rslen > 1 && (bp - (STDCHAR*)SvPVX(sv) < rslen)) ||
3977 memNE((char*)bp - rslen, rsptr, rslen))
3978 goto screamer; /* go back to the fray */
3979 thats_really_all_folks:
3981 cnt += shortbuffered;
3982 DEBUG_P(PerlIO_printf(Perl_debug_log,
3983 "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
3984 PerlIO_set_ptrcnt(fp, ptr, cnt); /* put these back or we're in trouble */
3985 DEBUG_P(PerlIO_printf(Perl_debug_log,
3986 "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
3987 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
3988 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
3990 SvCUR_set(sv, bp - (STDCHAR*)SvPVX(sv)); /* set length */
3991 DEBUG_P(PerlIO_printf(Perl_debug_log,
3992 "Screamer: done, len=%ld, string=|%.*s|\n",
3993 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX(sv)));
3998 /*The big, slow, and stupid way */
4001 /* Need to work around EPOC SDK features */
4002 /* On WINS: MS VC5 generates calls to _chkstk, */
4003 /* if a `large' stack frame is allocated */
4004 /* gcc on MARM does not generate calls like these */
4010 register STDCHAR *bpe = buf + sizeof(buf);
4012 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = i) != rslast && bp < bpe)
4013 ; /* keep reading */
4017 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
4018 /* Accomodate broken VAXC compiler, which applies U8 cast to
4019 * both args of ?: operator, causing EOF to change into 255
4021 if (cnt) { i = (U8)buf[cnt - 1]; } else { i = EOF; }
4025 sv_catpvn(sv, (char *) buf, cnt);
4027 sv_setpvn(sv, (char *) buf, cnt);
4029 if (i != EOF && /* joy */
4031 SvCUR(sv) < rslen ||
4032 memNE(SvPVX(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
4036 * If we're reading from a TTY and we get a short read,
4037 * indicating that the user hit his EOF character, we need
4038 * to notice it now, because if we try to read from the TTY
4039 * again, the EOF condition will disappear.
4041 * The comparison of cnt to sizeof(buf) is an optimization
4042 * that prevents unnecessary calls to feof().
4046 if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
4051 if (RsPARA(PL_rs)) { /* have to do this both before and after */
4052 while (i != EOF) { /* to make sure file boundaries work right */
4053 i = PerlIO_getc(fp);
4055 PerlIO_ungetc(fp,i);
4062 win32_strip_return(sv);
4065 return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
4070 Perl_sv_inc(pTHX_ register SV *sv)
4079 if (SvTHINKFIRST(sv)) {
4080 if (SvREADONLY(sv)) {
4082 if (PL_curcop != &PL_compiling)
4083 Perl_croak(aTHX_ PL_no_modify);
4087 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
4089 i = PTR2IV(SvRV(sv));
4094 flags = SvFLAGS(sv);
4095 if (flags & SVp_NOK) {
4096 (void)SvNOK_only(sv);
4100 if (flags & SVp_IOK) {
4102 if (SvUVX(sv) == UV_MAX)
4103 sv_setnv(sv, (NV)UV_MAX + 1.0);
4105 (void)SvIOK_only_UV(sv);
4108 if (SvIVX(sv) == IV_MAX)
4109 sv_setnv(sv, (NV)IV_MAX + 1.0);
4111 (void)SvIOK_only(sv);
4117 if (!(flags & SVp_POK) || !*SvPVX(sv)) {
4118 if ((flags & SVTYPEMASK) < SVt_PVNV)
4119 sv_upgrade(sv, SVt_NV);
4121 (void)SvNOK_only(sv);
4125 while (isALPHA(*d)) d++;
4126 while (isDIGIT(*d)) d++;
4128 sv_setnv(sv,Atof(SvPVX(sv)) + 1.0); /* punt */
4132 while (d >= SvPVX(sv)) {
4140 /* MKS: The original code here died if letters weren't consecutive.
4141 * at least it didn't have to worry about non-C locales. The
4142 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
4143 * arranged in order (although not consecutively) and that only
4144 * [A-Za-z] are accepted by isALPHA in the C locale.
4146 if (*d != 'z' && *d != 'Z') {
4147 do { ++*d; } while (!isALPHA(*d));
4150 *(d--) -= 'z' - 'a';
4155 *(d--) -= 'z' - 'a' + 1;
4159 /* oh,oh, the number grew */
4160 SvGROW(sv, SvCUR(sv) + 2);
4162 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
4171 Perl_sv_dec(pTHX_ register SV *sv)
4179 if (SvTHINKFIRST(sv)) {
4180 if (SvREADONLY(sv)) {
4182 if (PL_curcop != &PL_compiling)
4183 Perl_croak(aTHX_ PL_no_modify);
4187 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
4189 i = PTR2IV(SvRV(sv));
4194 flags = SvFLAGS(sv);
4195 if (flags & SVp_NOK) {
4197 (void)SvNOK_only(sv);
4200 if (flags & SVp_IOK) {
4202 if (SvUVX(sv) == 0) {
4203 (void)SvIOK_only(sv);
4207 (void)SvIOK_only_UV(sv);
4211 if (SvIVX(sv) == IV_MIN)
4212 sv_setnv(sv, (NV)IV_MIN - 1.0);
4214 (void)SvIOK_only(sv);
4220 if (!(flags & SVp_POK)) {
4221 if ((flags & SVTYPEMASK) < SVt_PVNV)
4222 sv_upgrade(sv, SVt_NV);
4224 (void)SvNOK_only(sv);
4227 sv_setnv(sv,Atof(SvPVX(sv)) - 1.0); /* punt */
4230 /* Make a string that will exist for the duration of the expression
4231 * evaluation. Actually, it may have to last longer than that, but
4232 * hopefully we won't free it until it has been assigned to a
4233 * permanent location. */
4236 Perl_sv_mortalcopy(pTHX_ SV *oldstr)
4242 sv_setsv(sv,oldstr);
4244 PL_tmps_stack[++PL_tmps_ix] = sv;
4250 Perl_sv_newmortal(pTHX)
4256 SvFLAGS(sv) = SVs_TEMP;
4258 PL_tmps_stack[++PL_tmps_ix] = sv;
4262 /* same thing without the copying */
4265 Perl_sv_2mortal(pTHX_ register SV *sv)
4270 if (SvREADONLY(sv) && SvIMMORTAL(sv))
4273 PL_tmps_stack[++PL_tmps_ix] = sv;
4279 Perl_newSVpv(pTHX_ const char *s, STRLEN len)
4286 sv_setpvn(sv,s,len);
4291 Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
4296 sv_setpvn(sv,s,len);
4300 #if defined(PERL_IMPLICIT_CONTEXT)
4302 Perl_newSVpvf_nocontext(const char* pat, ...)
4307 va_start(args, pat);
4308 sv = vnewSVpvf(pat, &args);
4315 Perl_newSVpvf(pTHX_ const char* pat, ...)
4319 va_start(args, pat);
4320 sv = vnewSVpvf(pat, &args);
4326 Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
4330 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
4335 Perl_newSVnv(pTHX_ NV n)
4345 Perl_newSViv(pTHX_ IV i)
4355 Perl_newRV_noinc(pTHX_ SV *tmpRef)
4361 sv_upgrade(sv, SVt_RV);
4369 Perl_newRV(pTHX_ SV *tmpRef)
4371 return newRV_noinc(SvREFCNT_inc(tmpRef));
4374 /* make an exact duplicate of old */
4377 Perl_newSVsv(pTHX_ register SV *old)
4384 if (SvTYPE(old) == SVTYPEMASK) {
4385 if (ckWARN_d(WARN_INTERNAL))
4386 Perl_warner(aTHX_ WARN_INTERNAL, "semi-panic: attempt to dup freed string");
4401 Perl_sv_reset(pTHX_ register char *s, HV *stash)
4409 char todo[PERL_UCHAR_MAX+1];
4414 if (!*s) { /* reset ?? searches */
4415 for (pm = HvPMROOT(stash); pm; pm = pm->op_pmnext) {
4416 pm->op_pmdynflags &= ~PMdf_USED;
4421 /* reset variables */
4423 if (!HvARRAY(stash))
4426 Zero(todo, 256, char);
4428 i = (unsigned char)*s;
4432 max = (unsigned char)*s++;
4433 for ( ; i <= max; i++) {
4436 for (i = 0; i <= (I32) HvMAX(stash); i++) {
4437 for (entry = HvARRAY(stash)[i];
4439 entry = HeNEXT(entry))
4441 if (!todo[(U8)*HeKEY(entry)])
4443 gv = (GV*)HeVAL(entry);
4445 if (SvTHINKFIRST(sv)) {
4446 if (!SvREADONLY(sv) && SvROK(sv))
4451 if (SvTYPE(sv) >= SVt_PV) {
4453 if (SvPVX(sv) != Nullch)
4460 if (GvHV(gv) && !HvNAME(GvHV(gv))) {
4462 #ifndef VMS /* VMS has no environ array */
4464 environ[0] = Nullch;
4473 Perl_sv_2io(pTHX_ SV *sv)
4479 switch (SvTYPE(sv)) {
4487 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
4491 Perl_croak(aTHX_ PL_no_usym, "filehandle");
4493 return sv_2io(SvRV(sv));
4494 gv = gv_fetchpv(SvPV(sv,n_a), FALSE, SVt_PVIO);
4500 Perl_croak(aTHX_ "Bad filehandle: %s", SvPV(sv,n_a));
4507 Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
4514 return *gvp = Nullgv, Nullcv;
4515 switch (SvTYPE(sv)) {
4535 SV **sp = &sv; /* Used in tryAMAGICunDEREF macro. */
4536 tryAMAGICunDEREF(to_cv);
4539 if (SvTYPE(sv) == SVt_PVCV) {
4548 Perl_croak(aTHX_ "Not a subroutine reference");
4553 gv = gv_fetchpv(SvPV(sv, n_a), lref, SVt_PVCV);
4559 if (lref && !GvCVu(gv)) {
4562 tmpsv = NEWSV(704,0);
4563 gv_efullname3(tmpsv, gv, Nullch);
4564 /* XXX this is probably not what they think they're getting.
4565 * It has the same effect as "sub name;", i.e. just a forward
4567 newSUB(start_subparse(FALSE, 0),
4568 newSVOP(OP_CONST, 0, tmpsv),
4573 Perl_croak(aTHX_ "Unable to create sub named \"%s\"", SvPV(sv,n_a));
4580 Perl_sv_true(pTHX_ register SV *sv)
4587 if ((tXpv = (XPV*)SvANY(sv)) &&
4588 (*tXpv->xpv_pv > '0' ||
4589 tXpv->xpv_cur > 1 ||
4590 (tXpv->xpv_cur && *tXpv->xpv_pv != '0')))
4597 return SvIVX(sv) != 0;
4600 return SvNVX(sv) != 0.0;
4602 return sv_2bool(sv);
4608 Perl_sv_iv(pTHX_ register SV *sv)
4612 return (IV)SvUVX(sv);
4619 Perl_sv_uv(pTHX_ register SV *sv)
4624 return (UV)SvIVX(sv);
4630 Perl_sv_nv(pTHX_ register SV *sv)
4638 Perl_sv_pv(pTHX_ SV *sv)
4645 return sv_2pv(sv, &n_a);
4649 Perl_sv_pvn(pTHX_ SV *sv, STRLEN *lp)
4655 return sv_2pv(sv, lp);
4659 Perl_sv_pvn_force(pTHX_ SV *sv, STRLEN *lp)
4663 if (SvTHINKFIRST(sv) && !SvROK(sv))
4664 sv_force_normal(sv);
4670 if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
4672 Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
4673 PL_op_name[PL_op->op_type]);
4677 if (s != SvPVX(sv)) { /* Almost, but not quite, sv_setpvn() */
4682 (void)SvUPGRADE(sv, SVt_PV); /* Never FALSE */
4683 SvGROW(sv, len + 1);
4684 Move(s,SvPVX(sv),len,char);
4689 SvPOK_on(sv); /* validate pointer */
4691 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
4692 PTR2UV(sv),SvPVX(sv)));
4699 Perl_sv_pvbyte(pTHX_ SV *sv)
4705 Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *lp)
4707 return sv_pvn(sv,lp);
4711 Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
4713 return sv_pvn_force(sv,lp);
4717 Perl_sv_pvutf8(pTHX_ SV *sv)
4723 Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *lp)
4725 return sv_pvn(sv,lp);
4729 Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
4731 return sv_pvn_force(sv,lp);
4735 Perl_sv_reftype(pTHX_ SV *sv, int ob)
4737 if (ob && SvOBJECT(sv))
4738 return HvNAME(SvSTASH(sv));
4740 switch (SvTYPE(sv)) {
4754 case SVt_PVLV: return "LVALUE";
4755 case SVt_PVAV: return "ARRAY";
4756 case SVt_PVHV: return "HASH";
4757 case SVt_PVCV: return "CODE";
4758 case SVt_PVGV: return "GLOB";
4759 case SVt_PVFM: return "FORMAT";
4760 default: return "UNKNOWN";
4766 Perl_sv_isobject(pTHX_ SV *sv)
4781 Perl_sv_isa(pTHX_ SV *sv, const char *name)
4793 return strEQ(HvNAME(SvSTASH(sv)), name);
4797 Perl_newSVrv(pTHX_ SV *rv, const char *classname)
4804 SV_CHECK_THINKFIRST(rv);
4807 if (SvTYPE(rv) < SVt_RV)
4808 sv_upgrade(rv, SVt_RV);
4815 HV* stash = gv_stashpv(classname, TRUE);
4816 (void)sv_bless(rv, stash);
4822 Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
4825 sv_setsv(rv, &PL_sv_undef);
4829 sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
4834 Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
4836 sv_setiv(newSVrv(rv,classname), iv);
4841 Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
4843 sv_setnv(newSVrv(rv,classname), nv);
4848 Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, char *pv, STRLEN n)
4850 sv_setpvn(newSVrv(rv,classname), pv, n);
4855 Perl_sv_bless(pTHX_ SV *sv, HV *stash)
4860 Perl_croak(aTHX_ "Can't bless non-reference value");
4862 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
4863 if (SvREADONLY(tmpRef))
4864 Perl_croak(aTHX_ PL_no_modify);
4865 if (SvOBJECT(tmpRef)) {
4866 if (SvTYPE(tmpRef) != SVt_PVIO)
4868 SvREFCNT_dec(SvSTASH(tmpRef));
4871 SvOBJECT_on(tmpRef);
4872 if (SvTYPE(tmpRef) != SVt_PVIO)
4874 (void)SvUPGRADE(tmpRef, SVt_PVMG);
4875 SvSTASH(tmpRef) = (HV*)SvREFCNT_inc(stash);
4886 S_sv_unglob(pTHX_ SV *sv)
4888 assert(SvTYPE(sv) == SVt_PVGV);
4893 SvREFCNT_dec(GvSTASH(sv));
4894 GvSTASH(sv) = Nullhv;
4896 sv_unmagic(sv, '*');
4897 Safefree(GvNAME(sv));
4899 SvFLAGS(sv) &= ~SVTYPEMASK;
4900 SvFLAGS(sv) |= SVt_PVMG;
4904 Perl_sv_unref(pTHX_ SV *sv)
4908 if (SvWEAKREF(sv)) {
4916 if (SvREFCNT(rv) != 1 || SvREADONLY(rv))
4919 sv_2mortal(rv); /* Schedule for freeing later */
4923 Perl_sv_taint(pTHX_ SV *sv)
4925 sv_magic((sv), Nullsv, 't', Nullch, 0);
4929 Perl_sv_untaint(pTHX_ SV *sv)
4931 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
4932 MAGIC *mg = mg_find(sv, 't');
4939 Perl_sv_tainted(pTHX_ SV *sv)
4941 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
4942 MAGIC *mg = mg_find(sv, 't');
4943 if (mg && ((mg->mg_len & 1) || (mg->mg_len & 2) && mg->mg_obj == sv))
4950 Perl_sv_setpviv(pTHX_ SV *sv, IV iv)
4952 char buf[TYPE_CHARS(UV)];
4954 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
4956 sv_setpvn(sv, ptr, ebuf - ptr);
4961 Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv)
4963 char buf[TYPE_CHARS(UV)];
4965 char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
4967 sv_setpvn(sv, ptr, ebuf - ptr);
4971 #if defined(PERL_IMPLICIT_CONTEXT)
4973 Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
4977 va_start(args, pat);
4978 sv_vsetpvf(sv, pat, &args);
4984 Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
4988 va_start(args, pat);
4989 sv_vsetpvf_mg(sv, pat, &args);
4995 Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
4998 va_start(args, pat);
4999 sv_vsetpvf(sv, pat, &args);
5004 Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
5006 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
5010 Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
5013 va_start(args, pat);
5014 sv_vsetpvf_mg(sv, pat, &args);
5019 Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
5021 sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
5025 #if defined(PERL_IMPLICIT_CONTEXT)
5027 Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
5031 va_start(args, pat);
5032 sv_vcatpvf(sv, pat, &args);
5037 Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
5041 va_start(args, pat);
5042 sv_vcatpvf_mg(sv, pat, &args);
5048 Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
5051 va_start(args, pat);
5052 sv_vcatpvf(sv, pat, &args);
5057 Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
5059 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
5063 Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
5066 va_start(args, pat);
5067 sv_vcatpvf_mg(sv, pat, &args);
5072 Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
5074 sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
5079 Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
5081 sv_setpvn(sv, "", 0);
5082 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
5086 Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
5094 static char nullstr[] = "(null)";
5096 /* no matter what, this is a string now */
5097 (void)SvPV_force(sv, origlen);
5099 /* special-case "", "%s", and "%_" */
5102 if (patlen == 2 && pat[0] == '%') {
5106 char *s = va_arg(*args, char*);
5107 sv_catpv(sv, s ? s : nullstr);
5109 else if (svix < svmax)
5110 sv_catsv(sv, *svargs);
5114 sv_catsv(sv, va_arg(*args, SV*));
5117 /* See comment on '_' below */
5122 patend = (char*)pat + patlen;
5123 for (p = (char*)pat; p < patend; p = q) {
5131 bool has_precis = FALSE;
5136 STRLEN esignlen = 0;
5138 char *eptr = Nullch;
5140 /* Times 4: a decimal digit takes more than 3 binary digits.
5141 * NV_DIG: mantissa takes than many decimal digits.
5142 * Plus 32: Playing safe. */
5143 char ebuf[IV_DIG * 4 + NV_DIG + 32];
5144 /* large enough for "%#.#f" --chip */
5145 /* what about long double NVs? --jhi */
5156 for (q = p; q < patend && *q != '%'; ++q) ;
5158 sv_catpvn(sv, p, q - p);
5196 case '1': case '2': case '3':
5197 case '4': case '5': case '6':
5198 case '7': case '8': case '9':
5201 width = width * 10 + (*q++ - '0');
5206 i = va_arg(*args, int);
5208 i = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
5210 width = (i < 0) ? -i : i;
5221 i = va_arg(*args, int);
5223 i = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
5224 precis = (i < 0) ? 0 : i;
5230 precis = precis * 10 + (*q++ - '0');
5247 if (*(q + 1) == 'l') { /* lld */
5275 uv = va_arg(*args, int);
5277 uv = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
5279 eptr = (char*)utf8buf;
5280 elen = uv_to_utf8((U8*)eptr, uv) - utf8buf;
5284 c = va_arg(*args, int);
5286 c = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
5293 eptr = va_arg(*args, char*);
5295 #ifdef MACOS_TRADITIONAL
5296 /* On MacOS, %#s format is used for Pascal strings */
5301 elen = strlen(eptr);
5304 elen = sizeof nullstr - 1;
5307 else if (svix < svmax) {
5308 eptr = SvPVx(svargs[svix++], elen);
5310 if (has_precis && precis < elen) {
5312 sv_pos_u2b(svargs[svix - 1], &p, 0); /* sticks at end */
5315 if (width) { /* fudge width (can't fudge elen) */
5316 width += elen - sv_len_utf8(svargs[svix - 1]);
5324 * The "%_" hack might have to be changed someday,
5325 * if ISO or ANSI decide to use '_' for something.
5326 * So we keep it hidden from users' code.
5330 eptr = SvPVx(va_arg(*args, SV*), elen);
5333 if (has_precis && elen > precis)
5341 uv = PTR2UV(va_arg(*args, void*));
5343 uv = (svix < svmax) ? PTR2UV(svargs[svix++]) : 0;
5358 case 'h': iv = (short)va_arg(*args, int); break;
5359 default: iv = va_arg(*args, int); break;
5360 case 'l': iv = va_arg(*args, long); break;
5361 case 'V': iv = va_arg(*args, IV); break;
5363 case 'q': iv = va_arg(*args, Quad_t); break;
5368 iv = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
5370 case 'h': iv = (short)iv; break;
5371 default: iv = (int)iv; break;
5372 case 'l': iv = (long)iv; break;
5375 case 'q': iv = (Quad_t)iv; break;
5382 esignbuf[esignlen++] = plus;
5386 esignbuf[esignlen++] = '-';
5424 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
5425 default: uv = va_arg(*args, unsigned); break;
5426 case 'l': uv = va_arg(*args, unsigned long); break;
5427 case 'V': uv = va_arg(*args, UV); break;
5429 case 'q': uv = va_arg(*args, Quad_t); break;
5434 uv = (svix < svmax) ? SvUVx(svargs[svix++]) : 0;
5436 case 'h': uv = (unsigned short)uv; break;
5437 default: uv = (unsigned)uv; break;
5438 case 'l': uv = (unsigned long)uv; break;
5441 case 'q': uv = (Quad_t)uv; break;
5447 eptr = ebuf + sizeof ebuf;
5453 p = (char*)((c == 'X')
5454 ? "0123456789ABCDEF" : "0123456789abcdef");
5460 esignbuf[esignlen++] = '0';
5461 esignbuf[esignlen++] = c; /* 'x' or 'X' */
5467 *--eptr = '0' + dig;
5469 if (alt && *eptr != '0')
5475 *--eptr = '0' + dig;
5478 esignbuf[esignlen++] = '0';
5479 esignbuf[esignlen++] = 'b';
5482 default: /* it had better be ten or less */
5483 #if defined(PERL_Y2KWARN)
5484 if (ckWARN(WARN_MISC)) {
5486 char *s = SvPV(sv,n);
5487 if (n >= 2 && s[n-2] == '1' && s[n-1] == '9'
5488 && (n == 2 || !isDIGIT(s[n-3])))
5490 Perl_warner(aTHX_ WARN_MISC,
5491 "Possible Y2K bug: %%%c %s",
5492 c, "format string following '19'");
5498 *--eptr = '0' + dig;
5499 } while (uv /= base);
5502 elen = (ebuf + sizeof ebuf) - eptr;
5505 zeros = precis - elen;
5506 else if (precis == 0 && elen == 1 && *eptr == '0')
5511 /* FLOATING POINT */
5514 c = 'f'; /* maybe %F isn't supported here */
5520 /* This is evil, but floating point is even more evil */
5523 nv = va_arg(*args, NV);
5525 nv = (svix < svmax) ? SvNVx(svargs[svix++]) : 0.0;
5528 if (c != 'e' && c != 'E') {
5530 (void)frexp(nv, &i);
5531 if (i == PERL_INT_MIN)
5532 Perl_die(aTHX_ "panic: frexp");
5534 need = BIT_DIGITS(i);
5536 need += has_precis ? precis : 6; /* known default */
5540 need += 20; /* fudge factor */
5541 if (PL_efloatsize < need) {
5542 Safefree(PL_efloatbuf);
5543 PL_efloatsize = need + 20; /* more fudge */
5544 New(906, PL_efloatbuf, PL_efloatsize, char);
5545 PL_efloatbuf[0] = '\0';
5548 eptr = ebuf + sizeof ebuf;
5551 #ifdef USE_LONG_DOUBLE
5553 char* p = PERL_PRIfldbl + sizeof(PERL_PRIfldbl) - 3;
5554 while (p >= PERL_PRIfldbl) { *--eptr = *p--; }
5559 do { *--eptr = '0' + (base % 10); } while (base /= 10);
5564 do { *--eptr = '0' + (base % 10); } while (base /= 10);
5577 RESTORE_NUMERIC_STANDARD();
5578 (void)sprintf(PL_efloatbuf, eptr, nv);
5579 RESTORE_NUMERIC_LOCAL();
5582 eptr = PL_efloatbuf;
5583 elen = strlen(PL_efloatbuf);
5589 i = SvCUR(sv) - origlen;
5592 case 'h': *(va_arg(*args, short*)) = i; break;
5593 default: *(va_arg(*args, int*)) = i; break;
5594 case 'l': *(va_arg(*args, long*)) = i; break;
5595 case 'V': *(va_arg(*args, IV*)) = i; break;
5597 case 'q': *(va_arg(*args, Quad_t*)) = i; break;
5601 else if (svix < svmax)
5602 sv_setuv(svargs[svix++], (UV)i);
5603 continue; /* not "break" */
5609 if (!args && ckWARN(WARN_PRINTF) &&
5610 (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
5611 SV *msg = sv_newmortal();
5612 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %s: ",
5613 (PL_op->op_type == OP_PRTF) ? "printf" : "sprintf");
5616 Perl_sv_catpvf(aTHX_ msg,
5617 "\"%%%c\"", c & 0xFF);
5619 Perl_sv_catpvf(aTHX_ msg,
5620 "\"%%\\%03"UVof"\"",
5623 sv_catpv(msg, "end of string");
5624 Perl_warner(aTHX_ WARN_PRINTF, "%_", msg); /* yes, this is reentrant */
5627 /* output mangled stuff ... */
5633 /* ... right here, because formatting flags should not apply */
5634 SvGROW(sv, SvCUR(sv) + elen + 1);
5636 memcpy(p, eptr, elen);
5639 SvCUR(sv) = p - SvPVX(sv);
5640 continue; /* not "break" */
5643 have = esignlen + zeros + elen;
5644 need = (have > width ? have : width);
5647 SvGROW(sv, SvCUR(sv) + need + 1);
5649 if (esignlen && fill == '0') {
5650 for (i = 0; i < esignlen; i++)
5654 memset(p, fill, gap);
5657 if (esignlen && fill != '0') {
5658 for (i = 0; i < esignlen; i++)
5662 for (i = zeros; i; i--)
5666 memcpy(p, eptr, elen);
5670 memset(p, ' ', gap);
5674 SvCUR(sv) = p - SvPVX(sv);
5678 #if defined(USE_ITHREADS)
5680 #if defined(USE_THREADS)
5681 # include "error: USE_THREADS and USE_ITHREADS are incompatible"
5684 #ifndef OpREFCNT_inc
5685 # define OpREFCNT_inc(o) ((o) ? (++(o)->op_targ, (o)) : Nullop)
5688 #ifndef GpREFCNT_inc
5689 # define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
5693 #define sv_dup_inc(s) SvREFCNT_inc(sv_dup(s))
5694 #define av_dup(s) (AV*)sv_dup((SV*)s)
5695 #define av_dup_inc(s) (AV*)SvREFCNT_inc(sv_dup((SV*)s))
5696 #define hv_dup(s) (HV*)sv_dup((SV*)s)
5697 #define hv_dup_inc(s) (HV*)SvREFCNT_inc(sv_dup((SV*)s))
5698 #define cv_dup(s) (CV*)sv_dup((SV*)s)
5699 #define cv_dup_inc(s) (CV*)SvREFCNT_inc(sv_dup((SV*)s))
5700 #define io_dup(s) (IO*)sv_dup((SV*)s)
5701 #define io_dup_inc(s) (IO*)SvREFCNT_inc(sv_dup((SV*)s))
5702 #define gv_dup(s) (GV*)sv_dup((SV*)s)
5703 #define gv_dup_inc(s) (GV*)SvREFCNT_inc(sv_dup((SV*)s))
5704 #define SAVEPV(p) (p ? savepv(p) : Nullch)
5705 #define SAVEPVN(p,n) (p ? savepvn(p,n) : Nullch)
5708 Perl_re_dup(pTHX_ REGEXP *r)
5710 /* XXX fix when pmop->op_pmregexp becomes shared */
5711 return ReREFCNT_inc(r);
5715 Perl_fp_dup(pTHX_ PerlIO *fp, char type)
5719 return (PerlIO*)NULL;
5721 /* look for it in the table first */
5722 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
5726 /* create anew and remember what it is */
5727 ret = PerlIO_fdupopen(fp);
5728 ptr_table_store(PL_ptr_table, fp, ret);
5733 Perl_dirp_dup(pTHX_ DIR *dp)
5742 Perl_gp_dup(pTHX_ GP *gp)
5747 /* look for it in the table first */
5748 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
5752 /* create anew and remember what it is */
5753 Newz(0, ret, 1, GP);
5754 ptr_table_store(PL_ptr_table, gp, ret);
5757 ret->gp_refcnt = 0; /* must be before any other dups! */
5758 ret->gp_sv = sv_dup_inc(gp->gp_sv);
5759 ret->gp_io = io_dup_inc(gp->gp_io);
5760 ret->gp_form = cv_dup_inc(gp->gp_form);
5761 ret->gp_av = av_dup_inc(gp->gp_av);
5762 ret->gp_hv = hv_dup_inc(gp->gp_hv);
5763 ret->gp_egv = gv_dup(gp->gp_egv); /* GvEGV is not refcounted */
5764 ret->gp_cv = cv_dup_inc(gp->gp_cv);
5765 ret->gp_cvgen = gp->gp_cvgen;
5766 ret->gp_flags = gp->gp_flags;
5767 ret->gp_line = gp->gp_line;
5768 ret->gp_file = gp->gp_file; /* points to COP.cop_file */
5773 Perl_mg_dup(pTHX_ MAGIC *mg)
5775 MAGIC *mgret = (MAGIC*)NULL;
5778 return (MAGIC*)NULL;
5779 /* look for it in the table first */
5780 mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
5784 for (; mg; mg = mg->mg_moremagic) {
5786 Newz(0, nmg, 1, MAGIC);
5790 mgprev->mg_moremagic = nmg;
5791 nmg->mg_virtual = mg->mg_virtual; /* XXX copy dynamic vtable? */
5792 nmg->mg_private = mg->mg_private;
5793 nmg->mg_type = mg->mg_type;
5794 nmg->mg_flags = mg->mg_flags;
5795 if (mg->mg_type == 'r') {
5796 nmg->mg_obj = (SV*)re_dup((REGEXP*)mg->mg_obj);
5799 nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
5800 ? sv_dup_inc(mg->mg_obj)
5801 : sv_dup(mg->mg_obj);
5803 nmg->mg_len = mg->mg_len;
5804 nmg->mg_ptr = mg->mg_ptr; /* XXX random ptr? */
5805 if (mg->mg_ptr && mg->mg_type != 'g') {
5806 if (mg->mg_len >= 0) {
5807 nmg->mg_ptr = SAVEPVN(mg->mg_ptr, mg->mg_len);
5808 if (mg->mg_type == 'c' && AMT_AMAGIC((AMT*)mg->mg_ptr)) {
5809 AMT *amtp = (AMT*)mg->mg_ptr;
5810 AMT *namtp = (AMT*)nmg->mg_ptr;
5812 for (i = 1; i < NofAMmeth; i++) {
5813 namtp->table[i] = cv_dup_inc(amtp->table[i]);
5817 else if (mg->mg_len == HEf_SVKEY)
5818 nmg->mg_ptr = (char*)sv_dup_inc((SV*)mg->mg_ptr);
5826 Perl_ptr_table_new(pTHX)
5829 Newz(0, tbl, 1, PTR_TBL_t);
5832 Newz(0, tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
5837 Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, void *sv)
5839 PTR_TBL_ENT_t *tblent;
5842 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
5843 for (; tblent; tblent = tblent->next) {
5844 if (tblent->oldval == sv)
5845 return tblent->newval;
5851 Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, void *oldv, void *newv)
5853 PTR_TBL_ENT_t *tblent, **otblent;
5854 /* XXX this may be pessimal on platforms where pointers aren't good
5855 * hash values e.g. if they grow faster in the most significant
5861 otblent = &tbl->tbl_ary[hash & tbl->tbl_max];
5862 for (tblent = *otblent; tblent; i=0, tblent = tblent->next) {
5863 if (tblent->oldval == oldv) {
5864 tblent->newval = newv;
5869 Newz(0, tblent, 1, PTR_TBL_ENT_t);
5870 tblent->oldval = oldv;
5871 tblent->newval = newv;
5872 tblent->next = *otblent;
5875 if (i && tbl->tbl_items > tbl->tbl_max)
5876 ptr_table_split(tbl);
5880 Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
5882 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
5883 UV oldsize = tbl->tbl_max + 1;
5884 UV newsize = oldsize * 2;
5887 Renew(ary, newsize, PTR_TBL_ENT_t*);
5888 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
5889 tbl->tbl_max = --newsize;
5891 for (i=0; i < oldsize; i++, ary++) {
5892 PTR_TBL_ENT_t **curentp, **entp, *ent;
5895 curentp = ary + oldsize;
5896 for (entp = ary, ent = *ary; ent; ent = *entp) {
5897 if ((newsize & (UV)ent->oldval) != i) {
5899 ent->next = *curentp;
5914 Perl_sv_dup(pTHX_ SV *sstr)
5921 if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
5923 /* look for it in the table first */
5924 dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
5928 /* create anew and remember what it is */
5930 ptr_table_store(PL_ptr_table, sstr, dstr);
5933 SvFLAGS(dstr) = SvFLAGS(sstr);
5934 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
5935 SvREFCNT(dstr) = 0; /* must be before any other dups! */
5938 if (SvANY(sstr) && PL_watch_pvx && SvPVX(sstr) == PL_watch_pvx)
5939 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
5940 PL_watch_pvx, SvPVX(sstr));
5943 switch (SvTYPE(sstr)) {
5948 SvANY(dstr) = new_XIV();
5949 SvIVX(dstr) = SvIVX(sstr);
5952 SvANY(dstr) = new_XNV();
5953 SvNVX(dstr) = SvNVX(sstr);
5956 SvANY(dstr) = new_XRV();
5957 SvRV(dstr) = sv_dup_inc(SvRV(sstr));
5960 SvANY(dstr) = new_XPV();
5961 SvCUR(dstr) = SvCUR(sstr);
5962 SvLEN(dstr) = SvLEN(sstr);
5964 SvRV(dstr) = sv_dup_inc(SvRV(sstr));
5965 else if (SvPVX(sstr) && SvLEN(sstr))
5966 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
5968 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
5971 SvANY(dstr) = new_XPVIV();
5972 SvCUR(dstr) = SvCUR(sstr);
5973 SvLEN(dstr) = SvLEN(sstr);
5974 SvIVX(dstr) = SvIVX(sstr);
5976 SvRV(dstr) = sv_dup_inc(SvRV(sstr));
5977 else if (SvPVX(sstr) && SvLEN(sstr))
5978 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
5980 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
5983 SvANY(dstr) = new_XPVNV();
5984 SvCUR(dstr) = SvCUR(sstr);
5985 SvLEN(dstr) = SvLEN(sstr);
5986 SvIVX(dstr) = SvIVX(sstr);
5987 SvNVX(dstr) = SvNVX(sstr);
5989 SvRV(dstr) = sv_dup_inc(SvRV(sstr));
5990 else if (SvPVX(sstr) && SvLEN(sstr))
5991 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
5993 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
5996 SvANY(dstr) = new_XPVMG();
5997 SvCUR(dstr) = SvCUR(sstr);
5998 SvLEN(dstr) = SvLEN(sstr);
5999 SvIVX(dstr) = SvIVX(sstr);
6000 SvNVX(dstr) = SvNVX(sstr);
6001 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
6002 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
6004 SvRV(dstr) = sv_dup_inc(SvRV(sstr));
6005 else if (SvPVX(sstr) && SvLEN(sstr))
6006 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
6008 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
6011 SvANY(dstr) = new_XPVBM();
6012 SvCUR(dstr) = SvCUR(sstr);
6013 SvLEN(dstr) = SvLEN(sstr);
6014 SvIVX(dstr) = SvIVX(sstr);
6015 SvNVX(dstr) = SvNVX(sstr);
6016 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
6017 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
6019 SvRV(dstr) = sv_dup_inc(SvRV(sstr));
6020 else if (SvPVX(sstr) && SvLEN(sstr))
6021 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
6023 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
6024 BmRARE(dstr) = BmRARE(sstr);
6025 BmUSEFUL(dstr) = BmUSEFUL(sstr);
6026 BmPREVIOUS(dstr)= BmPREVIOUS(sstr);
6029 SvANY(dstr) = new_XPVLV();
6030 SvCUR(dstr) = SvCUR(sstr);
6031 SvLEN(dstr) = SvLEN(sstr);
6032 SvIVX(dstr) = SvIVX(sstr);
6033 SvNVX(dstr) = SvNVX(sstr);
6034 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
6035 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
6037 SvRV(dstr) = sv_dup_inc(SvRV(sstr));
6038 else if (SvPVX(sstr) && SvLEN(sstr))
6039 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
6041 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
6042 LvTARGOFF(dstr) = LvTARGOFF(sstr); /* XXX sometimes holds PMOP* when DEBUGGING */
6043 LvTARGLEN(dstr) = LvTARGLEN(sstr);
6044 LvTARG(dstr) = sv_dup_inc(LvTARG(sstr));
6045 LvTYPE(dstr) = LvTYPE(sstr);
6048 SvANY(dstr) = new_XPVGV();
6049 SvCUR(dstr) = SvCUR(sstr);
6050 SvLEN(dstr) = SvLEN(sstr);
6051 SvIVX(dstr) = SvIVX(sstr);
6052 SvNVX(dstr) = SvNVX(sstr);
6053 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
6054 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
6056 SvRV(dstr) = sv_dup_inc(SvRV(sstr));
6057 else if (SvPVX(sstr) && SvLEN(sstr))
6058 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
6060 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
6061 GvNAMELEN(dstr) = GvNAMELEN(sstr);
6062 GvNAME(dstr) = SAVEPVN(GvNAME(sstr), GvNAMELEN(sstr));
6063 GvSTASH(dstr) = hv_dup_inc(GvSTASH(sstr));
6064 GvFLAGS(dstr) = GvFLAGS(sstr);
6065 GvGP(dstr) = gp_dup(GvGP(sstr));
6066 (void)GpREFCNT_inc(GvGP(dstr));
6069 SvANY(dstr) = new_XPVIO();
6070 SvCUR(dstr) = SvCUR(sstr);
6071 SvLEN(dstr) = SvLEN(sstr);
6072 SvIVX(dstr) = SvIVX(sstr);
6073 SvNVX(dstr) = SvNVX(sstr);
6074 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
6075 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
6077 SvRV(dstr) = sv_dup_inc(SvRV(sstr));
6078 else if (SvPVX(sstr) && SvLEN(sstr))
6079 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
6081 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
6082 IoIFP(dstr) = fp_dup(IoIFP(sstr), IoTYPE(sstr));
6083 if (IoOFP(sstr) == IoIFP(sstr))
6084 IoOFP(dstr) = IoIFP(dstr);
6086 IoOFP(dstr) = fp_dup(IoOFP(sstr), IoTYPE(sstr));
6087 /* PL_rsfp_filters entries have fake IoDIRP() */
6088 if (IoDIRP(sstr) && !(IoFLAGS(sstr) & IOf_FAKE_DIRP))
6089 IoDIRP(dstr) = dirp_dup(IoDIRP(sstr));
6091 IoDIRP(dstr) = IoDIRP(sstr);
6092 IoLINES(dstr) = IoLINES(sstr);
6093 IoPAGE(dstr) = IoPAGE(sstr);
6094 IoPAGE_LEN(dstr) = IoPAGE_LEN(sstr);
6095 IoLINES_LEFT(dstr) = IoLINES_LEFT(sstr);
6096 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(sstr));
6097 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(sstr));
6098 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(sstr));
6099 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(sstr));
6100 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(sstr));
6101 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(sstr));
6102 IoSUBPROCESS(dstr) = IoSUBPROCESS(sstr);
6103 IoTYPE(dstr) = IoTYPE(sstr);
6104 IoFLAGS(dstr) = IoFLAGS(sstr);
6107 SvANY(dstr) = new_XPVAV();
6108 SvCUR(dstr) = SvCUR(sstr);
6109 SvLEN(dstr) = SvLEN(sstr);
6110 SvIVX(dstr) = SvIVX(sstr);
6111 SvNVX(dstr) = SvNVX(sstr);
6112 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
6113 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
6114 AvARYLEN((AV*)dstr) = sv_dup_inc(AvARYLEN((AV*)sstr));
6115 AvFLAGS((AV*)dstr) = AvFLAGS((AV*)sstr);
6116 if (AvARRAY((AV*)sstr)) {
6117 SV **dst_ary, **src_ary;
6118 SSize_t items = AvFILLp((AV*)sstr) + 1;
6120 src_ary = AvARRAY((AV*)sstr);
6121 Newz(0, dst_ary, AvMAX((AV*)sstr)+1, SV*);
6122 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
6123 SvPVX(dstr) = (char*)dst_ary;
6124 AvALLOC((AV*)dstr) = dst_ary;
6125 if (AvREAL((AV*)sstr)) {
6127 *dst_ary++ = sv_dup_inc(*src_ary++);
6131 *dst_ary++ = sv_dup(*src_ary++);
6133 items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
6134 while (items-- > 0) {
6135 *dst_ary++ = &PL_sv_undef;
6139 SvPVX(dstr) = Nullch;
6140 AvALLOC((AV*)dstr) = (SV**)NULL;
6144 SvANY(dstr) = new_XPVHV();
6145 SvCUR(dstr) = SvCUR(sstr);
6146 SvLEN(dstr) = SvLEN(sstr);
6147 SvIVX(dstr) = SvIVX(sstr);
6148 SvNVX(dstr) = SvNVX(sstr);
6149 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
6150 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
6151 HvRITER((HV*)dstr) = HvRITER((HV*)sstr);
6152 if (HvARRAY((HV*)sstr)) {
6155 XPVHV *dxhv = (XPVHV*)SvANY(dstr);
6156 XPVHV *sxhv = (XPVHV*)SvANY(sstr);
6157 Newz(0, dxhv->xhv_array,
6158 PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1), char);
6159 while (i <= sxhv->xhv_max) {
6160 ((HE**)dxhv->xhv_array)[i] = he_dup(((HE**)sxhv->xhv_array)[i],
6161 !!HvSHAREKEYS(sstr));
6164 dxhv->xhv_eiter = he_dup(sxhv->xhv_eiter, !!HvSHAREKEYS(sstr));
6167 SvPVX(dstr) = Nullch;
6168 HvEITER((HV*)dstr) = (HE*)NULL;
6170 HvPMROOT((HV*)dstr) = HvPMROOT((HV*)sstr); /* XXX */
6171 HvNAME((HV*)dstr) = SAVEPV(HvNAME((HV*)sstr));
6174 SvANY(dstr) = new_XPVFM();
6175 FmLINES(dstr) = FmLINES(sstr);
6179 SvANY(dstr) = new_XPVCV();
6181 SvCUR(dstr) = SvCUR(sstr);
6182 SvLEN(dstr) = SvLEN(sstr);
6183 SvIVX(dstr) = SvIVX(sstr);
6184 SvNVX(dstr) = SvNVX(sstr);
6185 SvMAGIC(dstr) = mg_dup(SvMAGIC(sstr));
6186 SvSTASH(dstr) = hv_dup_inc(SvSTASH(sstr));
6187 if (SvPVX(sstr) && SvLEN(sstr))
6188 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
6190 SvPVX(dstr) = SvPVX(sstr); /* XXX shared string/random ptr? */
6191 CvSTASH(dstr) = hv_dup(CvSTASH(sstr));/* NOTE: not refcounted */
6192 CvSTART(dstr) = CvSTART(sstr);
6193 CvROOT(dstr) = OpREFCNT_inc(CvROOT(sstr));
6194 CvXSUB(dstr) = CvXSUB(sstr);
6195 CvXSUBANY(dstr) = CvXSUBANY(sstr);
6196 CvGV(dstr) = gv_dup_inc(CvGV(sstr));
6197 CvDEPTH(dstr) = CvDEPTH(sstr);
6198 if (CvPADLIST(sstr) && !AvREAL(CvPADLIST(sstr))) {
6199 /* XXX padlists are real, but pretend to be not */
6200 AvREAL_on(CvPADLIST(sstr));
6201 CvPADLIST(dstr) = av_dup_inc(CvPADLIST(sstr));
6202 AvREAL_off(CvPADLIST(sstr));
6203 AvREAL_off(CvPADLIST(dstr));
6206 CvPADLIST(dstr) = av_dup_inc(CvPADLIST(sstr));
6207 CvOUTSIDE(dstr) = cv_dup_inc(CvOUTSIDE(sstr));
6208 CvFLAGS(dstr) = CvFLAGS(sstr);
6211 Perl_croak(aTHX_ "Bizarre SvTYPE [%d]", SvTYPE(sstr));
6215 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
6222 Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max)
6227 return (PERL_CONTEXT*)NULL;
6229 /* look for it in the table first */
6230 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
6234 /* create anew and remember what it is */
6235 Newz(56, ncxs, max + 1, PERL_CONTEXT);
6236 ptr_table_store(PL_ptr_table, cxs, ncxs);
6239 PERL_CONTEXT *cx = &cxs[ix];
6240 PERL_CONTEXT *ncx = &ncxs[ix];
6241 ncx->cx_type = cx->cx_type;
6242 if (CxTYPE(cx) == CXt_SUBST) {
6243 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
6246 ncx->blk_oldsp = cx->blk_oldsp;
6247 ncx->blk_oldcop = cx->blk_oldcop;
6248 ncx->blk_oldretsp = cx->blk_oldretsp;
6249 ncx->blk_oldmarksp = cx->blk_oldmarksp;
6250 ncx->blk_oldscopesp = cx->blk_oldscopesp;
6251 ncx->blk_oldpm = cx->blk_oldpm;
6252 ncx->blk_gimme = cx->blk_gimme;
6253 switch (CxTYPE(cx)) {
6255 ncx->blk_sub.cv = (cx->blk_sub.olddepth == 0
6256 ? cv_dup_inc(cx->blk_sub.cv)
6257 : cv_dup(cx->blk_sub.cv));
6258 ncx->blk_sub.argarray = (cx->blk_sub.hasargs
6259 ? av_dup_inc(cx->blk_sub.argarray)
6261 ncx->blk_sub.savearray = av_dup(cx->blk_sub.savearray);
6262 ncx->blk_sub.olddepth = cx->blk_sub.olddepth;
6263 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
6264 ncx->blk_sub.lval = cx->blk_sub.lval;
6267 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
6268 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
6269 ncx->blk_eval.old_name = SAVEPV(cx->blk_eval.old_name);
6270 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
6271 ncx->blk_eval.cur_text = sv_dup(cx->blk_eval.cur_text);
6274 ncx->blk_loop.label = cx->blk_loop.label;
6275 ncx->blk_loop.resetsp = cx->blk_loop.resetsp;
6276 ncx->blk_loop.redo_op = cx->blk_loop.redo_op;
6277 ncx->blk_loop.next_op = cx->blk_loop.next_op;
6278 ncx->blk_loop.last_op = cx->blk_loop.last_op;
6279 ncx->blk_loop.iterdata = (CxPADLOOP(cx)
6280 ? cx->blk_loop.iterdata
6281 : gv_dup((GV*)cx->blk_loop.iterdata));
6282 ncx->blk_loop.itersave = sv_dup_inc(cx->blk_loop.itersave);
6283 ncx->blk_loop.iterlval = sv_dup_inc(cx->blk_loop.iterlval);
6284 ncx->blk_loop.iterary = av_dup_inc(cx->blk_loop.iterary);
6285 ncx->blk_loop.iterix = cx->blk_loop.iterix;
6286 ncx->blk_loop.itermax = cx->blk_loop.itermax;
6289 ncx->blk_sub.cv = cv_dup(cx->blk_sub.cv);
6290 ncx->blk_sub.gv = gv_dup(cx->blk_sub.gv);
6291 ncx->blk_sub.dfoutgv = gv_dup_inc(cx->blk_sub.dfoutgv);
6292 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
6305 Perl_si_dup(pTHX_ PERL_SI *si)
6310 return (PERL_SI*)NULL;
6312 /* look for it in the table first */
6313 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
6317 /* create anew and remember what it is */
6318 Newz(56, nsi, 1, PERL_SI);
6319 ptr_table_store(PL_ptr_table, si, nsi);
6321 nsi->si_stack = av_dup_inc(si->si_stack);
6322 nsi->si_cxix = si->si_cxix;
6323 nsi->si_cxmax = si->si_cxmax;
6324 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax);
6325 nsi->si_type = si->si_type;
6326 nsi->si_prev = si_dup(si->si_prev);
6327 nsi->si_next = si_dup(si->si_next);
6328 nsi->si_markoff = si->si_markoff;
6333 #define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
6334 #define TOPINT(ss,ix) ((ss)[ix].any_i32)
6335 #define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
6336 #define TOPLONG(ss,ix) ((ss)[ix].any_long)
6337 #define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
6338 #define TOPIV(ss,ix) ((ss)[ix].any_iv)
6339 #define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
6340 #define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
6341 #define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
6342 #define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
6343 #define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
6344 #define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
6347 #define pv_dup_inc(p) SAVEPV(p)
6348 #define pv_dup(p) SAVEPV(p)
6349 #define svp_dup_inc(p,pp) any_dup(p,pp)
6352 Perl_any_dup(pTHX_ void *v, PerlInterpreter *proto_perl)
6359 /* look for it in the table first */
6360 ret = ptr_table_fetch(PL_ptr_table, v);
6364 /* see if it is part of the interpreter structure */
6365 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
6366 ret = (void*)(((char*)aTHXo) + (((char*)v) - (char*)proto_perl));
6374 Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl)
6376 ANY *ss = proto_perl->Tsavestack;
6377 I32 ix = proto_perl->Tsavestack_ix;
6378 I32 max = proto_perl->Tsavestack_max;
6391 void (*dptr) (void*);
6392 void (*dxptr) (pTHXo_ void*);
6394 Newz(54, nss, max, ANY);
6400 case SAVEt_ITEM: /* normal string */
6401 sv = (SV*)POPPTR(ss,ix);
6402 TOPPTR(nss,ix) = sv_dup_inc(sv);
6403 sv = (SV*)POPPTR(ss,ix);
6404 TOPPTR(nss,ix) = sv_dup_inc(sv);
6406 case SAVEt_SV: /* scalar reference */
6407 sv = (SV*)POPPTR(ss,ix);
6408 TOPPTR(nss,ix) = sv_dup_inc(sv);
6409 gv = (GV*)POPPTR(ss,ix);
6410 TOPPTR(nss,ix) = gv_dup_inc(gv);
6412 case SAVEt_GENERIC_SVREF: /* generic sv */
6413 case SAVEt_SVREF: /* scalar reference */
6414 sv = (SV*)POPPTR(ss,ix);
6415 TOPPTR(nss,ix) = sv_dup_inc(sv);
6416 ptr = POPPTR(ss,ix);
6417 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
6419 case SAVEt_AV: /* array reference */
6420 av = (AV*)POPPTR(ss,ix);
6421 TOPPTR(nss,ix) = av_dup_inc(av);
6422 gv = (GV*)POPPTR(ss,ix);
6423 TOPPTR(nss,ix) = gv_dup(gv);
6425 case SAVEt_HV: /* hash reference */
6426 hv = (HV*)POPPTR(ss,ix);
6427 TOPPTR(nss,ix) = hv_dup_inc(hv);
6428 gv = (GV*)POPPTR(ss,ix);
6429 TOPPTR(nss,ix) = gv_dup(gv);
6431 case SAVEt_INT: /* int reference */
6432 ptr = POPPTR(ss,ix);
6433 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
6434 intval = (int)POPINT(ss,ix);
6435 TOPINT(nss,ix) = intval;
6437 case SAVEt_LONG: /* long reference */
6438 ptr = POPPTR(ss,ix);
6439 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
6440 longval = (long)POPLONG(ss,ix);
6441 TOPLONG(nss,ix) = longval;
6443 case SAVEt_I32: /* I32 reference */
6444 case SAVEt_I16: /* I16 reference */
6445 case SAVEt_I8: /* I8 reference */
6446 ptr = POPPTR(ss,ix);
6447 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
6451 case SAVEt_IV: /* IV reference */
6452 ptr = POPPTR(ss,ix);
6453 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
6457 case SAVEt_SPTR: /* SV* reference */
6458 ptr = POPPTR(ss,ix);
6459 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
6460 sv = (SV*)POPPTR(ss,ix);
6461 TOPPTR(nss,ix) = sv_dup(sv);
6463 case SAVEt_VPTR: /* random* reference */
6464 ptr = POPPTR(ss,ix);
6465 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
6466 ptr = POPPTR(ss,ix);
6467 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
6469 case SAVEt_PPTR: /* char* reference */
6470 ptr = POPPTR(ss,ix);
6471 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
6472 c = (char*)POPPTR(ss,ix);
6473 TOPPTR(nss,ix) = pv_dup(c);
6475 case SAVEt_HPTR: /* HV* reference */
6476 ptr = POPPTR(ss,ix);
6477 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
6478 hv = (HV*)POPPTR(ss,ix);
6479 TOPPTR(nss,ix) = hv_dup(hv);
6481 case SAVEt_APTR: /* AV* reference */
6482 ptr = POPPTR(ss,ix);
6483 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
6484 av = (AV*)POPPTR(ss,ix);
6485 TOPPTR(nss,ix) = av_dup(av);
6488 gv = (GV*)POPPTR(ss,ix);
6489 TOPPTR(nss,ix) = gv_dup(gv);
6491 case SAVEt_GP: /* scalar reference */
6492 gp = (GP*)POPPTR(ss,ix);
6493 TOPPTR(nss,ix) = gp = gp_dup(gp);
6494 (void)GpREFCNT_inc(gp);
6495 gv = (GV*)POPPTR(ss,ix);
6496 TOPPTR(nss,ix) = gv_dup_inc(c);
6497 c = (char*)POPPTR(ss,ix);
6498 TOPPTR(nss,ix) = pv_dup(c);
6505 sv = (SV*)POPPTR(ss,ix);
6506 TOPPTR(nss,ix) = sv_dup_inc(sv);
6509 ptr = POPPTR(ss,ix);
6510 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
6511 /* these are assumed to be refcounted properly */
6512 switch (((OP*)ptr)->op_type) {
6519 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
6522 TOPPTR(nss,ix) = Nullop;
6527 TOPPTR(nss,ix) = Nullop;
6530 c = (char*)POPPTR(ss,ix);
6531 TOPPTR(nss,ix) = pv_dup_inc(c);
6534 longval = POPLONG(ss,ix);
6535 TOPLONG(nss,ix) = longval;
6538 hv = (HV*)POPPTR(ss,ix);
6539 TOPPTR(nss,ix) = hv_dup_inc(hv);
6540 c = (char*)POPPTR(ss,ix);
6541 TOPPTR(nss,ix) = pv_dup_inc(c);
6545 case SAVEt_DESTRUCTOR:
6546 ptr = POPPTR(ss,ix);
6547 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
6548 dptr = POPDPTR(ss,ix);
6549 TOPDPTR(nss,ix) = (void (*)(void*))any_dup(dptr, proto_perl);
6551 case SAVEt_DESTRUCTOR_X:
6552 ptr = POPPTR(ss,ix);
6553 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
6554 dxptr = POPDXPTR(ss,ix);
6555 TOPDXPTR(nss,ix) = (void (*)(pTHXo_ void*))any_dup(dxptr, proto_perl);
6557 case SAVEt_REGCONTEXT:
6563 case SAVEt_STACK_POS: /* Position on Perl stack */
6567 case SAVEt_AELEM: /* array element */
6568 sv = (SV*)POPPTR(ss,ix);
6569 TOPPTR(nss,ix) = sv_dup_inc(sv);
6572 av = (AV*)POPPTR(ss,ix);
6573 TOPPTR(nss,ix) = av_dup_inc(av);
6575 case SAVEt_HELEM: /* hash element */
6576 sv = (SV*)POPPTR(ss,ix);
6577 TOPPTR(nss,ix) = sv_dup_inc(sv);
6578 sv = (SV*)POPPTR(ss,ix);
6579 TOPPTR(nss,ix) = sv_dup_inc(sv);
6580 hv = (HV*)POPPTR(ss,ix);
6581 TOPPTR(nss,ix) = hv_dup_inc(hv);
6584 ptr = POPPTR(ss,ix);
6585 TOPPTR(nss,ix) = ptr;
6592 Perl_croak(aTHX_ "panic: ss_dup inconsistency");
6604 perl_clone(PerlInterpreter *proto_perl, UV flags)
6607 CPerlObj *pPerl = (CPerlObj*)proto_perl;
6610 #ifdef PERL_IMPLICIT_SYS
6611 return perl_clone_using(proto_perl, flags,
6613 proto_perl->IMemShared,
6614 proto_perl->IMemParse,
6624 perl_clone_using(PerlInterpreter *proto_perl, UV flags,
6625 struct IPerlMem* ipM, struct IPerlMem* ipMS,
6626 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
6627 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
6628 struct IPerlDir* ipD, struct IPerlSock* ipS,
6629 struct IPerlProc* ipP)
6631 /* XXX many of the string copies here can be optimized if they're
6632 * constants; they need to be allocated as common memory and just
6633 * their pointers copied. */
6639 CPerlObj *pPerl = new(ipM) CPerlObj(ipM, ipMS, ipMP, ipE, ipStd, ipLIO,
6641 PERL_SET_INTERP(pPerl);
6642 # else /* !PERL_OBJECT */
6643 PerlInterpreter *my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
6644 PERL_SET_INTERP(my_perl);
6647 memset(my_perl, 0xab, sizeof(PerlInterpreter));
6652 # else /* !DEBUGGING */
6653 Zero(my_perl, 1, PerlInterpreter);
6654 # endif /* DEBUGGING */
6658 PL_MemShared = ipMS;
6666 # endif /* PERL_OBJECT */
6667 #else /* !PERL_IMPLICIT_SYS */
6671 PerlInterpreter *my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
6672 PERL_SET_INTERP(my_perl);
6675 memset(my_perl, 0xab, sizeof(PerlInterpreter));
6680 # else /* !DEBUGGING */
6681 Zero(my_perl, 1, PerlInterpreter);
6682 # endif /* DEBUGGING */
6683 #endif /* PERL_IMPLICIT_SYS */
6686 PL_xiv_arenaroot = NULL;
6691 PL_xpviv_root = NULL;
6692 PL_xpvnv_root = NULL;
6693 PL_xpvcv_root = NULL;
6694 PL_xpvav_root = NULL;
6695 PL_xpvhv_root = NULL;
6696 PL_xpvmg_root = NULL;
6697 PL_xpvlv_root = NULL;
6698 PL_xpvbm_root = NULL;
6700 PL_nice_chunk = NULL;
6701 PL_nice_chunk_size = 0;
6704 PL_sv_root = Nullsv;
6705 PL_sv_arenaroot = Nullsv;
6707 PL_debug = proto_perl->Idebug;
6709 /* create SV map for pointer relocation */
6710 PL_ptr_table = ptr_table_new();
6712 /* initialize these special pointers as early as possible */
6713 SvANY(&PL_sv_undef) = NULL;
6714 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
6715 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
6716 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
6719 SvUPGRADE(&PL_sv_no, SVt_PVNV);
6721 SvANY(&PL_sv_no) = new_XPVNV();
6723 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
6724 SvFLAGS(&PL_sv_no) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
6725 SvPVX(&PL_sv_no) = SAVEPVN(PL_No, 0);
6726 SvCUR(&PL_sv_no) = 0;
6727 SvLEN(&PL_sv_no) = 1;
6728 SvNVX(&PL_sv_no) = 0;
6729 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
6732 SvUPGRADE(&PL_sv_yes, SVt_PVNV);
6734 SvANY(&PL_sv_yes) = new_XPVNV();
6736 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
6737 SvFLAGS(&PL_sv_yes) = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
6738 SvPVX(&PL_sv_yes) = SAVEPVN(PL_Yes, 1);
6739 SvCUR(&PL_sv_yes) = 1;
6740 SvLEN(&PL_sv_yes) = 2;
6741 SvNVX(&PL_sv_yes) = 1;
6742 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
6744 /* create shared string table */
6745 PL_strtab = newHV();
6746 HvSHAREKEYS_off(PL_strtab);
6747 hv_ksplit(PL_strtab, 512);
6748 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
6750 PL_compiling = proto_perl->Icompiling;
6751 PL_compiling.cop_stashpv = SAVEPV(PL_compiling.cop_stashpv);
6752 PL_compiling.cop_file = SAVEPV(PL_compiling.cop_file);
6753 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
6754 if (!specialWARN(PL_compiling.cop_warnings))
6755 PL_compiling.cop_warnings = sv_dup_inc(PL_compiling.cop_warnings);
6756 PL_curcop = (COP*)any_dup(proto_perl->Tcurcop, proto_perl);
6758 /* pseudo environmental stuff */
6759 PL_origargc = proto_perl->Iorigargc;
6761 New(0, PL_origargv, i+1, char*);
6762 PL_origargv[i] = '\0';
6764 PL_origargv[i] = SAVEPV(proto_perl->Iorigargv[i]);
6766 PL_envgv = gv_dup(proto_perl->Ienvgv);
6767 PL_incgv = gv_dup(proto_perl->Iincgv);
6768 PL_hintgv = gv_dup(proto_perl->Ihintgv);
6769 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
6770 PL_diehook = sv_dup_inc(proto_perl->Idiehook);
6771 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook);
6774 PL_minus_c = proto_perl->Iminus_c;
6775 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel);
6776 PL_localpatches = proto_perl->Ilocalpatches;
6777 PL_splitstr = proto_perl->Isplitstr;
6778 PL_preprocess = proto_perl->Ipreprocess;
6779 PL_minus_n = proto_perl->Iminus_n;
6780 PL_minus_p = proto_perl->Iminus_p;
6781 PL_minus_l = proto_perl->Iminus_l;
6782 PL_minus_a = proto_perl->Iminus_a;
6783 PL_minus_F = proto_perl->Iminus_F;
6784 PL_doswitches = proto_perl->Idoswitches;
6785 PL_dowarn = proto_perl->Idowarn;
6786 PL_doextract = proto_perl->Idoextract;
6787 PL_sawampersand = proto_perl->Isawampersand;
6788 PL_unsafe = proto_perl->Iunsafe;
6789 PL_inplace = SAVEPV(proto_perl->Iinplace);
6790 PL_e_script = sv_dup_inc(proto_perl->Ie_script);
6791 PL_perldb = proto_perl->Iperldb;
6792 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
6794 /* magical thingies */
6795 /* XXX time(&PL_basetime) when asked for? */
6796 PL_basetime = proto_perl->Ibasetime;
6797 PL_formfeed = sv_dup(proto_perl->Iformfeed);
6799 PL_maxsysfd = proto_perl->Imaxsysfd;
6800 PL_multiline = proto_perl->Imultiline;
6801 PL_statusvalue = proto_perl->Istatusvalue;
6803 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
6806 /* shortcuts to various I/O objects */
6807 PL_stdingv = gv_dup(proto_perl->Istdingv);
6808 PL_stderrgv = gv_dup(proto_perl->Istderrgv);
6809 PL_defgv = gv_dup(proto_perl->Idefgv);
6810 PL_argvgv = gv_dup(proto_perl->Iargvgv);
6811 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv);
6812 PL_argvout_stack = av_dup(proto_perl->Iargvout_stack);
6814 /* shortcuts to regexp stuff */
6815 PL_replgv = gv_dup(proto_perl->Ireplgv);
6817 /* shortcuts to misc objects */
6818 PL_errgv = gv_dup(proto_perl->Ierrgv);
6820 /* shortcuts to debugging objects */
6821 PL_DBgv = gv_dup(proto_perl->IDBgv);
6822 PL_DBline = gv_dup(proto_perl->IDBline);
6823 PL_DBsub = gv_dup(proto_perl->IDBsub);
6824 PL_DBsingle = sv_dup(proto_perl->IDBsingle);
6825 PL_DBtrace = sv_dup(proto_perl->IDBtrace);
6826 PL_DBsignal = sv_dup(proto_perl->IDBsignal);
6827 PL_lineary = av_dup(proto_perl->Ilineary);
6828 PL_dbargs = av_dup(proto_perl->Idbargs);
6831 PL_defstash = hv_dup_inc(proto_perl->Tdefstash);
6832 PL_curstash = hv_dup(proto_perl->Tcurstash);
6833 PL_debstash = hv_dup(proto_perl->Idebstash);
6834 PL_globalstash = hv_dup(proto_perl->Iglobalstash);
6835 PL_curstname = sv_dup_inc(proto_perl->Icurstname);
6837 PL_beginav = av_dup_inc(proto_perl->Ibeginav);
6838 PL_endav = av_dup_inc(proto_perl->Iendav);
6839 PL_stopav = av_dup_inc(proto_perl->Istopav);
6840 PL_initav = av_dup_inc(proto_perl->Iinitav);
6842 PL_sub_generation = proto_perl->Isub_generation;
6844 /* funky return mechanisms */
6845 PL_forkprocess = proto_perl->Iforkprocess;
6847 /* subprocess state */
6848 PL_fdpid = av_dup_inc(proto_perl->Ifdpid);
6850 /* internal state */
6851 PL_tainting = proto_perl->Itainting;
6852 PL_maxo = proto_perl->Imaxo;
6853 if (proto_perl->Iop_mask)
6854 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
6856 PL_op_mask = Nullch;
6858 /* current interpreter roots */
6859 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv);
6860 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
6861 PL_main_start = proto_perl->Imain_start;
6862 PL_eval_root = OpREFCNT_inc(proto_perl->Ieval_root);
6863 PL_eval_start = proto_perl->Ieval_start;
6865 /* runtime control stuff */
6866 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
6867 PL_copline = proto_perl->Icopline;
6869 PL_filemode = proto_perl->Ifilemode;
6870 PL_lastfd = proto_perl->Ilastfd;
6871 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
6874 PL_gensym = proto_perl->Igensym;
6875 PL_preambled = proto_perl->Ipreambled;
6876 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav);
6877 PL_laststatval = proto_perl->Ilaststatval;
6878 PL_laststype = proto_perl->Ilaststype;
6879 PL_mess_sv = Nullsv;
6881 PL_orslen = proto_perl->Iorslen;
6882 PL_ors = SAVEPVN(proto_perl->Iors, PL_orslen);
6883 PL_ofmt = SAVEPV(proto_perl->Iofmt);
6885 /* interpreter atexit processing */
6886 PL_exitlistlen = proto_perl->Iexitlistlen;
6887 if (PL_exitlistlen) {
6888 New(0, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
6889 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
6892 PL_exitlist = (PerlExitListEntry*)NULL;
6893 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal);
6895 PL_profiledata = NULL;
6896 PL_rsfp = fp_dup(proto_perl->Irsfp, '<');
6897 /* PL_rsfp_filters entries have fake IoDIRP() */
6898 PL_rsfp_filters = av_dup_inc(proto_perl->Irsfp_filters);
6900 PL_compcv = cv_dup(proto_perl->Icompcv);
6901 PL_comppad = av_dup(proto_perl->Icomppad);
6902 PL_comppad_name = av_dup(proto_perl->Icomppad_name);
6903 PL_comppad_name_fill = proto_perl->Icomppad_name_fill;
6904 PL_comppad_name_floor = proto_perl->Icomppad_name_floor;
6905 PL_curpad = (SV**)ptr_table_fetch(PL_ptr_table,
6906 proto_perl->Tcurpad);
6908 #ifdef HAVE_INTERP_INTERN
6909 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
6912 /* more statics moved here */
6913 PL_generation = proto_perl->Igeneration;
6914 PL_DBcv = cv_dup(proto_perl->IDBcv);
6916 PL_in_clean_objs = proto_perl->Iin_clean_objs;
6917 PL_in_clean_all = proto_perl->Iin_clean_all;
6919 PL_uid = proto_perl->Iuid;
6920 PL_euid = proto_perl->Ieuid;
6921 PL_gid = proto_perl->Igid;
6922 PL_egid = proto_perl->Iegid;
6923 PL_nomemok = proto_perl->Inomemok;
6924 PL_an = proto_perl->Ian;
6925 PL_cop_seqmax = proto_perl->Icop_seqmax;
6926 PL_op_seqmax = proto_perl->Iop_seqmax;
6927 PL_evalseq = proto_perl->Ievalseq;
6928 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
6929 PL_origalen = proto_perl->Iorigalen;
6930 PL_pidstatus = newHV(); /* XXX flag for cloning? */
6931 PL_osname = SAVEPV(proto_perl->Iosname);
6932 PL_sh_path = SAVEPV(proto_perl->Ish_path);
6933 PL_sighandlerp = proto_perl->Isighandlerp;
6936 PL_runops = proto_perl->Irunops;
6938 Copy(proto_perl->Itokenbuf, PL_tokenbuf, 256, char);
6941 PL_cshlen = proto_perl->Icshlen;
6942 PL_cshname = SAVEPVN(proto_perl->Icshname, PL_cshlen);
6945 PL_lex_state = proto_perl->Ilex_state;
6946 PL_lex_defer = proto_perl->Ilex_defer;
6947 PL_lex_expect = proto_perl->Ilex_expect;
6948 PL_lex_formbrack = proto_perl->Ilex_formbrack;
6949 PL_lex_dojoin = proto_perl->Ilex_dojoin;
6950 PL_lex_starts = proto_perl->Ilex_starts;
6951 PL_lex_stuff = sv_dup_inc(proto_perl->Ilex_stuff);
6952 PL_lex_repl = sv_dup_inc(proto_perl->Ilex_repl);
6953 PL_lex_op = proto_perl->Ilex_op;
6954 PL_lex_inpat = proto_perl->Ilex_inpat;
6955 PL_lex_inwhat = proto_perl->Ilex_inwhat;
6956 PL_lex_brackets = proto_perl->Ilex_brackets;
6957 i = (PL_lex_brackets < 120 ? 120 : PL_lex_brackets);
6958 PL_lex_brackstack = SAVEPVN(proto_perl->Ilex_brackstack,i);
6959 PL_lex_casemods = proto_perl->Ilex_casemods;
6960 i = (PL_lex_casemods < 12 ? 12 : PL_lex_casemods);
6961 PL_lex_casestack = SAVEPVN(proto_perl->Ilex_casestack,i);
6963 Copy(proto_perl->Inextval, PL_nextval, 5, YYSTYPE);
6964 Copy(proto_perl->Inexttype, PL_nexttype, 5, I32);
6965 PL_nexttoke = proto_perl->Inexttoke;
6967 PL_linestr = sv_dup_inc(proto_perl->Ilinestr);
6968 i = proto_perl->Ibufptr - SvPVX(proto_perl->Ilinestr);
6969 PL_bufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
6970 i = proto_perl->Ioldbufptr - SvPVX(proto_perl->Ilinestr);
6971 PL_oldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
6972 i = proto_perl->Ioldoldbufptr - SvPVX(proto_perl->Ilinestr);
6973 PL_oldoldbufptr = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
6974 PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
6975 i = proto_perl->Ilinestart - SvPVX(proto_perl->Ilinestr);
6976 PL_linestart = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
6977 PL_pending_ident = proto_perl->Ipending_ident;
6978 PL_sublex_info = proto_perl->Isublex_info; /* XXX not quite right */
6980 PL_expect = proto_perl->Iexpect;
6982 PL_multi_start = proto_perl->Imulti_start;
6983 PL_multi_end = proto_perl->Imulti_end;
6984 PL_multi_open = proto_perl->Imulti_open;
6985 PL_multi_close = proto_perl->Imulti_close;
6987 PL_error_count = proto_perl->Ierror_count;
6988 PL_subline = proto_perl->Isubline;
6989 PL_subname = sv_dup_inc(proto_perl->Isubname);
6991 PL_min_intro_pending = proto_perl->Imin_intro_pending;
6992 PL_max_intro_pending = proto_perl->Imax_intro_pending;
6993 PL_padix = proto_perl->Ipadix;
6994 PL_padix_floor = proto_perl->Ipadix_floor;
6995 PL_pad_reset_pending = proto_perl->Ipad_reset_pending;
6997 i = proto_perl->Ilast_uni - SvPVX(proto_perl->Ilinestr);
6998 PL_last_uni = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
6999 i = proto_perl->Ilast_lop - SvPVX(proto_perl->Ilinestr);
7000 PL_last_lop = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
7001 PL_last_lop_op = proto_perl->Ilast_lop_op;
7002 PL_in_my = proto_perl->Iin_my;
7003 PL_in_my_stash = hv_dup(proto_perl->Iin_my_stash);
7005 PL_cryptseen = proto_perl->Icryptseen;
7008 PL_hints = proto_perl->Ihints;
7010 PL_amagic_generation = proto_perl->Iamagic_generation;
7012 #ifdef USE_LOCALE_COLLATE
7013 PL_collation_ix = proto_perl->Icollation_ix;
7014 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
7015 PL_collation_standard = proto_perl->Icollation_standard;
7016 PL_collxfrm_base = proto_perl->Icollxfrm_base;
7017 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
7018 #endif /* USE_LOCALE_COLLATE */
7020 #ifdef USE_LOCALE_NUMERIC
7021 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
7022 PL_numeric_standard = proto_perl->Inumeric_standard;
7023 PL_numeric_local = proto_perl->Inumeric_local;
7024 PL_numeric_radix = proto_perl->Inumeric_radix;
7025 #endif /* !USE_LOCALE_NUMERIC */
7027 /* utf8 character classes */
7028 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum);
7029 PL_utf8_alnumc = sv_dup_inc(proto_perl->Iutf8_alnumc);
7030 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii);
7031 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha);
7032 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space);
7033 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl);
7034 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph);
7035 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit);
7036 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper);
7037 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower);
7038 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print);
7039 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct);
7040 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit);
7041 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark);
7042 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper);
7043 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle);
7044 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower);
7047 PL_last_swash_hv = Nullhv; /* reinits on demand */
7048 PL_last_swash_klen = 0;
7049 PL_last_swash_key[0]= '\0';
7050 PL_last_swash_tmps = (U8*)NULL;
7051 PL_last_swash_slen = 0;
7053 /* perly.c globals */
7054 PL_yydebug = proto_perl->Iyydebug;
7055 PL_yynerrs = proto_perl->Iyynerrs;
7056 PL_yyerrflag = proto_perl->Iyyerrflag;
7057 PL_yychar = proto_perl->Iyychar;
7058 PL_yyval = proto_perl->Iyyval;
7059 PL_yylval = proto_perl->Iyylval;
7061 PL_glob_index = proto_perl->Iglob_index;
7062 PL_srand_called = proto_perl->Isrand_called;
7063 PL_uudmap['M'] = 0; /* reinits on demand */
7064 PL_bitcount = Nullch; /* reinits on demand */
7066 if (proto_perl->Ipsig_ptr) {
7067 int sig_num[] = { SIG_NUM };
7068 Newz(0, PL_psig_ptr, sizeof(sig_num)/sizeof(*sig_num), SV*);
7069 Newz(0, PL_psig_name, sizeof(sig_num)/sizeof(*sig_num), SV*);
7070 for (i = 1; PL_sig_name[i]; i++) {
7071 PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i]);
7072 PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i]);
7076 PL_psig_ptr = (SV**)NULL;
7077 PL_psig_name = (SV**)NULL;
7080 /* thrdvar.h stuff */
7083 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
7084 PL_tmps_ix = proto_perl->Ttmps_ix;
7085 PL_tmps_max = proto_perl->Ttmps_max;
7086 PL_tmps_floor = proto_perl->Ttmps_floor;
7087 Newz(50, PL_tmps_stack, PL_tmps_max, SV*);
7089 while (i <= PL_tmps_ix) {
7090 PL_tmps_stack[i] = sv_dup_inc(proto_perl->Ttmps_stack[i]);
7094 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
7095 i = proto_perl->Tmarkstack_max - proto_perl->Tmarkstack;
7096 Newz(54, PL_markstack, i, I32);
7097 PL_markstack_max = PL_markstack + (proto_perl->Tmarkstack_max
7098 - proto_perl->Tmarkstack);
7099 PL_markstack_ptr = PL_markstack + (proto_perl->Tmarkstack_ptr
7100 - proto_perl->Tmarkstack);
7101 Copy(proto_perl->Tmarkstack, PL_markstack,
7102 PL_markstack_ptr - PL_markstack + 1, I32);
7104 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
7105 * NOTE: unlike the others! */
7106 PL_scopestack_ix = proto_perl->Tscopestack_ix;
7107 PL_scopestack_max = proto_perl->Tscopestack_max;
7108 Newz(54, PL_scopestack, PL_scopestack_max, I32);
7109 Copy(proto_perl->Tscopestack, PL_scopestack, PL_scopestack_ix, I32);
7111 /* next push_return() sets PL_retstack[PL_retstack_ix]
7112 * NOTE: unlike the others! */
7113 PL_retstack_ix = proto_perl->Tretstack_ix;
7114 PL_retstack_max = proto_perl->Tretstack_max;
7115 Newz(54, PL_retstack, PL_retstack_max, OP*);
7116 Copy(proto_perl->Tretstack, PL_retstack, PL_retstack_ix, I32);
7118 /* NOTE: si_dup() looks at PL_markstack */
7119 PL_curstackinfo = si_dup(proto_perl->Tcurstackinfo);
7121 /* PL_curstack = PL_curstackinfo->si_stack; */
7122 PL_curstack = av_dup(proto_perl->Tcurstack);
7123 PL_mainstack = av_dup(proto_perl->Tmainstack);
7125 /* next PUSHs() etc. set *(PL_stack_sp+1) */
7126 PL_stack_base = AvARRAY(PL_curstack);
7127 PL_stack_sp = PL_stack_base + (proto_perl->Tstack_sp
7128 - proto_perl->Tstack_base);
7129 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
7131 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
7132 * NOTE: unlike the others! */
7133 PL_savestack_ix = proto_perl->Tsavestack_ix;
7134 PL_savestack_max = proto_perl->Tsavestack_max;
7135 /*Newz(54, PL_savestack, PL_savestack_max, ANY);*/
7136 PL_savestack = ss_dup(proto_perl);
7142 PL_start_env = proto_perl->Tstart_env; /* XXXXXX */
7143 PL_top_env = &PL_start_env;
7145 PL_op = proto_perl->Top;
7148 PL_Xpv = (XPV*)NULL;
7149 PL_na = proto_perl->Tna;
7151 PL_statbuf = proto_perl->Tstatbuf;
7152 PL_statcache = proto_perl->Tstatcache;
7153 PL_statgv = gv_dup(proto_perl->Tstatgv);
7154 PL_statname = sv_dup_inc(proto_perl->Tstatname);
7156 PL_timesbuf = proto_perl->Ttimesbuf;
7159 PL_tainted = proto_perl->Ttainted;
7160 PL_curpm = proto_perl->Tcurpm; /* XXX No PMOP ref count */
7161 PL_nrs = sv_dup_inc(proto_perl->Tnrs);
7162 PL_rs = sv_dup_inc(proto_perl->Trs);
7163 PL_last_in_gv = gv_dup(proto_perl->Tlast_in_gv);
7164 PL_ofslen = proto_perl->Tofslen;
7165 PL_ofs = SAVEPVN(proto_perl->Tofs, PL_ofslen);
7166 PL_defoutgv = gv_dup_inc(proto_perl->Tdefoutgv);
7167 PL_chopset = proto_perl->Tchopset; /* XXX never deallocated */
7168 PL_toptarget = sv_dup_inc(proto_perl->Ttoptarget);
7169 PL_bodytarget = sv_dup_inc(proto_perl->Tbodytarget);
7170 PL_formtarget = sv_dup(proto_perl->Tformtarget);
7172 PL_restartop = proto_perl->Trestartop;
7173 PL_in_eval = proto_perl->Tin_eval;
7174 PL_delaymagic = proto_perl->Tdelaymagic;
7175 PL_dirty = proto_perl->Tdirty;
7176 PL_localizing = proto_perl->Tlocalizing;
7178 PL_protect = proto_perl->Tprotect;
7179 PL_errors = sv_dup_inc(proto_perl->Terrors);
7180 PL_av_fetch_sv = Nullsv;
7181 PL_hv_fetch_sv = Nullsv;
7182 Zero(&PL_hv_fetch_ent_mh, 1, HE); /* XXX */
7183 PL_modcount = proto_perl->Tmodcount;
7184 PL_lastgotoprobe = Nullop;
7185 PL_dumpindent = proto_perl->Tdumpindent;
7187 PL_sortcop = (OP*)any_dup(proto_perl->Tsortcop, proto_perl);
7188 PL_sortstash = hv_dup(proto_perl->Tsortstash);
7189 PL_firstgv = gv_dup(proto_perl->Tfirstgv);
7190 PL_secondgv = gv_dup(proto_perl->Tsecondgv);
7191 PL_sortcxix = proto_perl->Tsortcxix;
7192 PL_efloatbuf = Nullch; /* reinits on demand */
7193 PL_efloatsize = 0; /* reinits on demand */
7197 PL_screamfirst = NULL;
7198 PL_screamnext = NULL;
7199 PL_maxscream = -1; /* reinits on demand */
7200 PL_lastscream = Nullsv;
7202 PL_watchaddr = NULL;
7203 PL_watchok = Nullch;
7205 PL_regdummy = proto_perl->Tregdummy;
7206 PL_regcomp_parse = Nullch;
7207 PL_regxend = Nullch;
7208 PL_regcode = (regnode*)NULL;
7211 PL_regprecomp = Nullch;
7216 PL_seen_zerolen = 0;
7218 PL_regcomp_rx = (regexp*)NULL;
7220 PL_colorset = 0; /* reinits PL_colors[] */
7221 /*PL_colors[6] = {0,0,0,0,0,0};*/
7222 PL_reg_whilem_seen = 0;
7223 PL_reginput = Nullch;
7226 PL_regstartp = (I32*)NULL;
7227 PL_regendp = (I32*)NULL;
7228 PL_reglastparen = (U32*)NULL;
7229 PL_regtill = Nullch;
7231 PL_reg_start_tmp = (char**)NULL;
7232 PL_reg_start_tmpl = 0;
7233 PL_regdata = (struct reg_data*)NULL;
7236 PL_reg_eval_set = 0;
7238 PL_regprogram = (regnode*)NULL;
7240 PL_regcc = (CURCUR*)NULL;
7241 PL_reg_call_cc = (struct re_cc_state*)NULL;
7242 PL_reg_re = (regexp*)NULL;
7243 PL_reg_ganch = Nullch;
7245 PL_reg_magic = (MAGIC*)NULL;
7247 PL_reg_oldcurpm = (PMOP*)NULL;
7248 PL_reg_curpm = (PMOP*)NULL;
7249 PL_reg_oldsaved = Nullch;
7250 PL_reg_oldsavedlen = 0;
7252 PL_reg_leftiter = 0;
7253 PL_reg_poscache = Nullch;
7254 PL_reg_poscache_size= 0;
7256 /* RE engine - function pointers */
7257 PL_regcompp = proto_perl->Tregcompp;
7258 PL_regexecp = proto_perl->Tregexecp;
7259 PL_regint_start = proto_perl->Tregint_start;
7260 PL_regint_string = proto_perl->Tregint_string;
7261 PL_regfree = proto_perl->Tregfree;
7263 PL_reginterp_cnt = 0;
7264 PL_reg_starttry = 0;
7267 return (PerlInterpreter*)pPerl;
7273 #else /* !USE_ITHREADS */
7279 #endif /* USE_ITHREADS */
7282 do_report_used(pTHXo_ SV *sv)
7284 if (SvTYPE(sv) != SVTYPEMASK) {
7285 PerlIO_printf(Perl_debug_log, "****\n");
7291 do_clean_objs(pTHXo_ SV *sv)
7295 if (SvROK(sv) && SvOBJECT(rv = SvRV(sv))) {
7296 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(sv));)
7302 /* XXX Might want to check arrays, etc. */
7305 #ifndef DISABLE_DESTRUCTOR_KLUDGE
7307 do_clean_named_objs(pTHXo_ SV *sv)
7309 if (SvTYPE(sv) == SVt_PVGV) {
7310 if ( SvOBJECT(GvSV(sv)) ||
7311 GvAV(sv) && SvOBJECT(GvAV(sv)) ||
7312 GvHV(sv) && SvOBJECT(GvHV(sv)) ||
7313 GvIO(sv) && SvOBJECT(GvIO(sv)) ||
7314 GvCV(sv) && SvOBJECT(GvCV(sv)) )
7316 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning named glob object:\n "), sv_dump(sv));)
7324 do_clean_all(pTHXo_ SV *sv)
7326 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%"UVxf"\n", PTR2UV(sv)) );)
7327 SvFLAGS(sv) |= SVf_BREAK;