f5f6421d2d29b79cfd2689e5a9d771ddd7918e4a
[p5sagit/p5-mst-13.2.git] / sv.c
1 /*    sv.c
2  *
3  *    Copyright (c) 1991-2000, Larry Wall
4  *
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.
7  *
8  */
9
10 /*
11  * "I wonder what the Entish is for 'yes' and 'no'," he thought.
12  */
13
14 #include "EXTERN.h"
15 #define PERL_IN_SV_C
16 #include "perl.h"
17
18 #define FCALL *f
19 #define SV_CHECK_THINKFIRST(sv) if (SvTHINKFIRST(sv)) sv_force_normal(sv)
20
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);
25 #endif
26 static void do_clean_all(pTHXo_ SV *sv);
27
28 /*
29  * "A time to plant, and a time to uproot what was planted..."
30  */
31
32 #define plant_SV(p) \
33     STMT_START {                                        \
34         SvANY(p) = (void *)PL_sv_root;                  \
35         SvFLAGS(p) = SVTYPEMASK;                        \
36         PL_sv_root = (p);                               \
37         --PL_sv_count;                                  \
38     } STMT_END
39
40 /* sv_mutex must be held while calling uproot_SV() */
41 #define uproot_SV(p) \
42     STMT_START {                                        \
43         (p) = PL_sv_root;                               \
44         PL_sv_root = (SV*)SvANY(p);                     \
45         ++PL_sv_count;                                  \
46     } STMT_END
47
48 #define new_SV(p) \
49     STMT_START {                                        \
50         LOCK_SV_MUTEX;                                  \
51         if (PL_sv_root)                                 \
52             uproot_SV(p);                               \
53         else                                            \
54             (p) = more_sv();                            \
55         UNLOCK_SV_MUTEX;                                \
56         SvANY(p) = 0;                                   \
57         SvREFCNT(p) = 1;                                \
58         SvFLAGS(p) = 0;                                 \
59     } STMT_END
60
61 #ifdef DEBUGGING
62
63 #define del_SV(p) \
64     STMT_START {                                        \
65         LOCK_SV_MUTEX;                                  \
66         if (PL_debug & 32768)                           \
67             del_sv(p);                                  \
68         else                                            \
69             plant_SV(p);                                \
70         UNLOCK_SV_MUTEX;                                \
71     } STMT_END
72
73 STATIC void
74 S_del_sv(pTHX_ SV *p)
75 {
76     if (PL_debug & 32768) {
77         SV* sva;
78         SV* sv;
79         SV* svend;
80         int ok = 0;
81         for (sva = PL_sv_arenaroot; sva; sva = (SV *) SvANY(sva)) {
82             sv = sva + 1;
83             svend = &sva[SvREFCNT(sva)];
84             if (p >= sv && p < svend)
85                 ok = 1;
86         }
87         if (!ok) {
88             if (ckWARN_d(WARN_INTERNAL))        
89                 Perl_warner(aTHX_ WARN_INTERNAL,
90                             "Attempt to free non-arena SV: 0x%"UVxf,
91                             PTR2UV(p));
92             return;
93         }
94     }
95     plant_SV(p);
96 }
97
98 #else /* ! DEBUGGING */
99
100 #define del_SV(p)   plant_SV(p)
101
102 #endif /* DEBUGGING */
103
104 void
105 Perl_sv_add_arena(pTHX_ char *ptr, U32 size, U32 flags)
106 {
107     SV* sva = (SV*)ptr;
108     register SV* sv;
109     register SV* svend;
110     Zero(ptr, size, char);
111
112     /* The first SV in an arena isn't an SV. */
113     SvANY(sva) = (void *) PL_sv_arenaroot;              /* ptr to next arena */
114     SvREFCNT(sva) = size / sizeof(SV);          /* number of SV slots */
115     SvFLAGS(sva) = flags;                       /* FAKE if not to be freed */
116
117     PL_sv_arenaroot = sva;
118     PL_sv_root = sva + 1;
119
120     svend = &sva[SvREFCNT(sva) - 1];
121     sv = sva + 1;
122     while (sv < svend) {
123         SvANY(sv) = (void *)(SV*)(sv + 1);
124         SvFLAGS(sv) = SVTYPEMASK;
125         sv++;
126     }
127     SvANY(sv) = 0;
128     SvFLAGS(sv) = SVTYPEMASK;
129 }
130
131 /* sv_mutex must be held while calling more_sv() */
132 STATIC SV*
133 S_more_sv(pTHX)
134 {
135     register SV* sv;
136
137     if (PL_nice_chunk) {
138         sv_add_arena(PL_nice_chunk, PL_nice_chunk_size, 0);
139         PL_nice_chunk = Nullch;
140     }
141     else {
142         char *chunk;                /* must use New here to match call to */
143         New(704,chunk,1008,char);   /* Safefree() in sv_free_arenas()     */
144         sv_add_arena(chunk, 1008, 0);
145     }
146     uproot_SV(sv);
147     return sv;
148 }
149
150 STATIC void
151 S_visit(pTHX_ SVFUNC_t f)
152 {
153     SV* sva;
154     SV* sv;
155     register SV* svend;
156
157     for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
158         svend = &sva[SvREFCNT(sva)];
159         for (sv = sva + 1; sv < svend; ++sv) {
160             if (SvTYPE(sv) != SVTYPEMASK)
161                 (FCALL)(aTHXo_ sv);
162         }
163     }
164 }
165
166 void
167 Perl_sv_report_used(pTHX)
168 {
169     visit(do_report_used);
170 }
171
172 void
173 Perl_sv_clean_objs(pTHX)
174 {
175     PL_in_clean_objs = TRUE;
176     visit(do_clean_objs);
177 #ifndef DISABLE_DESTRUCTOR_KLUDGE
178     /* some barnacles may yet remain, clinging to typeglobs */
179     visit(do_clean_named_objs);
180 #endif
181     PL_in_clean_objs = FALSE;
182 }
183
184 void
185 Perl_sv_clean_all(pTHX)
186 {
187     PL_in_clean_all = TRUE;
188     visit(do_clean_all);
189     PL_in_clean_all = FALSE;
190 }
191
192 void
193 Perl_sv_free_arenas(pTHX)
194 {
195     SV* sva;
196     SV* svanext;
197     XPV *arena, *arenanext;
198
199     /* Free arenas here, but be careful about fake ones.  (We assume
200        contiguity of the fake ones with the corresponding real ones.) */
201
202     for (sva = PL_sv_arenaroot; sva; sva = svanext) {
203         svanext = (SV*) SvANY(sva);
204         while (svanext && SvFAKE(svanext))
205             svanext = (SV*) SvANY(svanext);
206
207         if (!SvFAKE(sva))
208             Safefree((void *)sva);
209     }
210
211     for (arena = PL_xiv_arenaroot; arena; arena = arenanext) {
212         arenanext = (XPV*)arena->xpv_pv;
213         Safefree(arena);
214     }
215     PL_xiv_arenaroot = 0;
216
217     for (arena = PL_xnv_arenaroot; arena; arena = arenanext) {
218         arenanext = (XPV*)arena->xpv_pv;
219         Safefree(arena);
220     }
221     PL_xnv_arenaroot = 0;
222
223     for (arena = PL_xrv_arenaroot; arena; arena = arenanext) {
224         arenanext = (XPV*)arena->xpv_pv;
225         Safefree(arena);
226     }
227     PL_xrv_arenaroot = 0;
228
229     for (arena = PL_xpv_arenaroot; arena; arena = arenanext) {
230         arenanext = (XPV*)arena->xpv_pv;
231         Safefree(arena);
232     }
233     PL_xpv_arenaroot = 0;
234
235     for (arena = (XPV*)PL_xpviv_arenaroot; arena; arena = arenanext) {
236         arenanext = (XPV*)arena->xpv_pv;
237         Safefree(arena);
238     }
239     PL_xpviv_arenaroot = 0;
240
241     for (arena = (XPV*)PL_xpvnv_arenaroot; arena; arena = arenanext) {
242         arenanext = (XPV*)arena->xpv_pv;
243         Safefree(arena);
244     }
245     PL_xpvnv_arenaroot = 0;
246
247     for (arena = (XPV*)PL_xpvcv_arenaroot; arena; arena = arenanext) {
248         arenanext = (XPV*)arena->xpv_pv;
249         Safefree(arena);
250     }
251     PL_xpvcv_arenaroot = 0;
252
253     for (arena = (XPV*)PL_xpvav_arenaroot; arena; arena = arenanext) {
254         arenanext = (XPV*)arena->xpv_pv;
255         Safefree(arena);
256     }
257     PL_xpvav_arenaroot = 0;
258
259     for (arena = (XPV*)PL_xpvhv_arenaroot; arena; arena = arenanext) {
260         arenanext = (XPV*)arena->xpv_pv;
261         Safefree(arena);
262     }
263     PL_xpvhv_arenaroot = 0;
264
265     for (arena = (XPV*)PL_xpvmg_arenaroot; arena; arena = arenanext) {
266         arenanext = (XPV*)arena->xpv_pv;
267         Safefree(arena);
268     }
269     PL_xpvmg_arenaroot = 0;
270
271     for (arena = (XPV*)PL_xpvlv_arenaroot; arena; arena = arenanext) {
272         arenanext = (XPV*)arena->xpv_pv;
273         Safefree(arena);
274     }
275     PL_xpvlv_arenaroot = 0;
276
277     for (arena = (XPV*)PL_xpvbm_arenaroot; arena; arena = arenanext) {
278         arenanext = (XPV*)arena->xpv_pv;
279         Safefree(arena);
280     }
281     PL_xpvbm_arenaroot = 0;
282
283     for (arena = (XPV*)PL_he_arenaroot; arena; arena = arenanext) {
284         arenanext = (XPV*)arena->xpv_pv;
285         Safefree(arena);
286     }
287     PL_he_arenaroot = 0;
288
289     if (PL_nice_chunk)
290         Safefree(PL_nice_chunk);
291     PL_nice_chunk = Nullch;
292     PL_nice_chunk_size = 0;
293     PL_sv_arenaroot = 0;
294     PL_sv_root = 0;
295 }
296
297 void
298 Perl_report_uninit(pTHX)
299 {
300     if (PL_op)
301         Perl_warner(aTHX_ WARN_UNINITIALIZED, PL_warn_uninit,
302                     " in ", PL_op_desc[PL_op->op_type]);
303     else
304         Perl_warner(aTHX_ WARN_UNINITIALIZED, PL_warn_uninit, "", "");
305 }
306
307 STATIC XPVIV*
308 S_new_xiv(pTHX)
309 {
310     IV* xiv;
311     LOCK_SV_MUTEX;
312     if (!PL_xiv_root)
313         more_xiv();
314     xiv = PL_xiv_root;
315     /*
316      * See comment in more_xiv() -- RAM.
317      */
318     PL_xiv_root = *(IV**)xiv;
319     UNLOCK_SV_MUTEX;
320     return (XPVIV*)((char*)xiv - STRUCT_OFFSET(XPVIV, xiv_iv));
321 }
322
323 STATIC void
324 S_del_xiv(pTHX_ XPVIV *p)
325 {
326     IV* xiv = (IV*)((char*)(p) + STRUCT_OFFSET(XPVIV, xiv_iv));
327     LOCK_SV_MUTEX;
328     *(IV**)xiv = PL_xiv_root;
329     PL_xiv_root = xiv;
330     UNLOCK_SV_MUTEX;
331 }
332
333 STATIC void
334 S_more_xiv(pTHX)
335 {
336     register IV* xiv;
337     register IV* xivend;
338     XPV* ptr;
339     New(705, ptr, 1008/sizeof(XPV), XPV);
340     ptr->xpv_pv = (char*)PL_xiv_arenaroot;              /* linked list of xiv arenas */
341     PL_xiv_arenaroot = ptr;                     /* to keep Purify happy */
342
343     xiv = (IV*) ptr;
344     xivend = &xiv[1008 / sizeof(IV) - 1];
345     xiv += (sizeof(XPV) - 1) / sizeof(IV) + 1;   /* fudge by size of XPV */
346     PL_xiv_root = xiv;
347     while (xiv < xivend) {
348         *(IV**)xiv = (IV *)(xiv + 1);
349         xiv++;
350     }
351     *(IV**)xiv = 0;
352 }
353
354 STATIC XPVNV*
355 S_new_xnv(pTHX)
356 {
357     NV* xnv;
358     LOCK_SV_MUTEX;
359     if (!PL_xnv_root)
360         more_xnv();
361     xnv = PL_xnv_root;
362     PL_xnv_root = *(NV**)xnv;
363     UNLOCK_SV_MUTEX;
364     return (XPVNV*)((char*)xnv - STRUCT_OFFSET(XPVNV, xnv_nv));
365 }
366
367 STATIC void
368 S_del_xnv(pTHX_ XPVNV *p)
369 {
370     NV* xnv = (NV*)((char*)(p) + STRUCT_OFFSET(XPVNV, xnv_nv));
371     LOCK_SV_MUTEX;
372     *(NV**)xnv = PL_xnv_root;
373     PL_xnv_root = xnv;
374     UNLOCK_SV_MUTEX;
375 }
376
377 STATIC void
378 S_more_xnv(pTHX)
379 {
380     register NV* xnv;
381     register NV* xnvend;
382     XPV *ptr;
383     New(711, ptr, 1008/sizeof(XPV), XPV);
384     ptr->xpv_pv = (char*)PL_xnv_arenaroot;
385     PL_xnv_arenaroot = ptr;
386
387     xnv = (NV*) ptr;
388     xnvend = &xnv[1008 / sizeof(NV) - 1];
389     xnv += (sizeof(XPVIV) - 1) / sizeof(NV) + 1; /* fudge by sizeof XPVIV */
390     PL_xnv_root = xnv;
391     while (xnv < xnvend) {
392         *(NV**)xnv = (NV*)(xnv + 1);
393         xnv++;
394     }
395     *(NV**)xnv = 0;
396 }
397
398 STATIC XRV*
399 S_new_xrv(pTHX)
400 {
401     XRV* xrv;
402     LOCK_SV_MUTEX;
403     if (!PL_xrv_root)
404         more_xrv();
405     xrv = PL_xrv_root;
406     PL_xrv_root = (XRV*)xrv->xrv_rv;
407     UNLOCK_SV_MUTEX;
408     return xrv;
409 }
410
411 STATIC void
412 S_del_xrv(pTHX_ XRV *p)
413 {
414     LOCK_SV_MUTEX;
415     p->xrv_rv = (SV*)PL_xrv_root;
416     PL_xrv_root = p;
417     UNLOCK_SV_MUTEX;
418 }
419
420 STATIC void
421 S_more_xrv(pTHX)
422 {
423     register XRV* xrv;
424     register XRV* xrvend;
425     XPV *ptr;
426     New(712, ptr, 1008/sizeof(XPV), XPV);
427     ptr->xpv_pv = (char*)PL_xrv_arenaroot;
428     PL_xrv_arenaroot = ptr;
429
430     xrv = (XRV*) ptr;
431     xrvend = &xrv[1008 / sizeof(XRV) - 1];
432     xrv += (sizeof(XPV) - 1) / sizeof(XRV) + 1;
433     PL_xrv_root = xrv;
434     while (xrv < xrvend) {
435         xrv->xrv_rv = (SV*)(xrv + 1);
436         xrv++;
437     }
438     xrv->xrv_rv = 0;
439 }
440
441 STATIC XPV*
442 S_new_xpv(pTHX)
443 {
444     XPV* xpv;
445     LOCK_SV_MUTEX;
446     if (!PL_xpv_root)
447         more_xpv();
448     xpv = PL_xpv_root;
449     PL_xpv_root = (XPV*)xpv->xpv_pv;
450     UNLOCK_SV_MUTEX;
451     return xpv;
452 }
453
454 STATIC void
455 S_del_xpv(pTHX_ XPV *p)
456 {
457     LOCK_SV_MUTEX;
458     p->xpv_pv = (char*)PL_xpv_root;
459     PL_xpv_root = p;
460     UNLOCK_SV_MUTEX;
461 }
462
463 STATIC void
464 S_more_xpv(pTHX)
465 {
466     register XPV* xpv;
467     register XPV* xpvend;
468     New(713, xpv, 1008/sizeof(XPV), XPV);
469     xpv->xpv_pv = (char*)PL_xpv_arenaroot;
470     PL_xpv_arenaroot = xpv;
471
472     xpvend = &xpv[1008 / sizeof(XPV) - 1];
473     PL_xpv_root = ++xpv;
474     while (xpv < xpvend) {
475         xpv->xpv_pv = (char*)(xpv + 1);
476         xpv++;
477     }
478     xpv->xpv_pv = 0;
479 }
480
481 STATIC XPVIV*
482 S_new_xpviv(pTHX)
483 {
484     XPVIV* xpviv;
485     LOCK_SV_MUTEX;
486     if (!PL_xpviv_root)
487         more_xpviv();
488     xpviv = PL_xpviv_root;
489     PL_xpviv_root = (XPVIV*)xpviv->xpv_pv;
490     UNLOCK_SV_MUTEX;
491     return xpviv;
492 }
493
494 STATIC void
495 S_del_xpviv(pTHX_ XPVIV *p)
496 {
497     LOCK_SV_MUTEX;
498     p->xpv_pv = (char*)PL_xpviv_root;
499     PL_xpviv_root = p;
500     UNLOCK_SV_MUTEX;
501 }
502
503 STATIC void
504 S_more_xpviv(pTHX)
505 {
506     register XPVIV* xpviv;
507     register XPVIV* xpvivend;
508     New(714, xpviv, 1008/sizeof(XPVIV), XPVIV);
509     xpviv->xpv_pv = (char*)PL_xpviv_arenaroot;
510     PL_xpviv_arenaroot = xpviv;
511
512     xpvivend = &xpviv[1008 / sizeof(XPVIV) - 1];
513     PL_xpviv_root = ++xpviv;
514     while (xpviv < xpvivend) {
515         xpviv->xpv_pv = (char*)(xpviv + 1);
516         xpviv++;
517     }
518     xpviv->xpv_pv = 0;
519 }
520
521 STATIC XPVNV*
522 S_new_xpvnv(pTHX)
523 {
524     XPVNV* xpvnv;
525     LOCK_SV_MUTEX;
526     if (!PL_xpvnv_root)
527         more_xpvnv();
528     xpvnv = PL_xpvnv_root;
529     PL_xpvnv_root = (XPVNV*)xpvnv->xpv_pv;
530     UNLOCK_SV_MUTEX;
531     return xpvnv;
532 }
533
534 STATIC void
535 S_del_xpvnv(pTHX_ XPVNV *p)
536 {
537     LOCK_SV_MUTEX;
538     p->xpv_pv = (char*)PL_xpvnv_root;
539     PL_xpvnv_root = p;
540     UNLOCK_SV_MUTEX;
541 }
542
543 STATIC void
544 S_more_xpvnv(pTHX)
545 {
546     register XPVNV* xpvnv;
547     register XPVNV* xpvnvend;
548     New(715, xpvnv, 1008/sizeof(XPVNV), XPVNV);
549     xpvnv->xpv_pv = (char*)PL_xpvnv_arenaroot;
550     PL_xpvnv_arenaroot = xpvnv;
551
552     xpvnvend = &xpvnv[1008 / sizeof(XPVNV) - 1];
553     PL_xpvnv_root = ++xpvnv;
554     while (xpvnv < xpvnvend) {
555         xpvnv->xpv_pv = (char*)(xpvnv + 1);
556         xpvnv++;
557     }
558     xpvnv->xpv_pv = 0;
559 }
560
561 STATIC XPVCV*
562 S_new_xpvcv(pTHX)
563 {
564     XPVCV* xpvcv;
565     LOCK_SV_MUTEX;
566     if (!PL_xpvcv_root)
567         more_xpvcv();
568     xpvcv = PL_xpvcv_root;
569     PL_xpvcv_root = (XPVCV*)xpvcv->xpv_pv;
570     UNLOCK_SV_MUTEX;
571     return xpvcv;
572 }
573
574 STATIC void
575 S_del_xpvcv(pTHX_ XPVCV *p)
576 {
577     LOCK_SV_MUTEX;
578     p->xpv_pv = (char*)PL_xpvcv_root;
579     PL_xpvcv_root = p;
580     UNLOCK_SV_MUTEX;
581 }
582
583 STATIC void
584 S_more_xpvcv(pTHX)
585 {
586     register XPVCV* xpvcv;
587     register XPVCV* xpvcvend;
588     New(716, xpvcv, 1008/sizeof(XPVCV), XPVCV);
589     xpvcv->xpv_pv = (char*)PL_xpvcv_arenaroot;
590     PL_xpvcv_arenaroot = xpvcv;
591
592     xpvcvend = &xpvcv[1008 / sizeof(XPVCV) - 1];
593     PL_xpvcv_root = ++xpvcv;
594     while (xpvcv < xpvcvend) {
595         xpvcv->xpv_pv = (char*)(xpvcv + 1);
596         xpvcv++;
597     }
598     xpvcv->xpv_pv = 0;
599 }
600
601 STATIC XPVAV*
602 S_new_xpvav(pTHX)
603 {
604     XPVAV* xpvav;
605     LOCK_SV_MUTEX;
606     if (!PL_xpvav_root)
607         more_xpvav();
608     xpvav = PL_xpvav_root;
609     PL_xpvav_root = (XPVAV*)xpvav->xav_array;
610     UNLOCK_SV_MUTEX;
611     return xpvav;
612 }
613
614 STATIC void
615 S_del_xpvav(pTHX_ XPVAV *p)
616 {
617     LOCK_SV_MUTEX;
618     p->xav_array = (char*)PL_xpvav_root;
619     PL_xpvav_root = p;
620     UNLOCK_SV_MUTEX;
621 }
622
623 STATIC void
624 S_more_xpvav(pTHX)
625 {
626     register XPVAV* xpvav;
627     register XPVAV* xpvavend;
628     New(717, xpvav, 1008/sizeof(XPVAV), XPVAV);
629     xpvav->xav_array = (char*)PL_xpvav_arenaroot;
630     PL_xpvav_arenaroot = xpvav;
631
632     xpvavend = &xpvav[1008 / sizeof(XPVAV) - 1];
633     PL_xpvav_root = ++xpvav;
634     while (xpvav < xpvavend) {
635         xpvav->xav_array = (char*)(xpvav + 1);
636         xpvav++;
637     }
638     xpvav->xav_array = 0;
639 }
640
641 STATIC XPVHV*
642 S_new_xpvhv(pTHX)
643 {
644     XPVHV* xpvhv;
645     LOCK_SV_MUTEX;
646     if (!PL_xpvhv_root)
647         more_xpvhv();
648     xpvhv = PL_xpvhv_root;
649     PL_xpvhv_root = (XPVHV*)xpvhv->xhv_array;
650     UNLOCK_SV_MUTEX;
651     return xpvhv;
652 }
653
654 STATIC void
655 S_del_xpvhv(pTHX_ XPVHV *p)
656 {
657     LOCK_SV_MUTEX;
658     p->xhv_array = (char*)PL_xpvhv_root;
659     PL_xpvhv_root = p;
660     UNLOCK_SV_MUTEX;
661 }
662
663 STATIC void
664 S_more_xpvhv(pTHX)
665 {
666     register XPVHV* xpvhv;
667     register XPVHV* xpvhvend;
668     New(718, xpvhv, 1008/sizeof(XPVHV), XPVHV);
669     xpvhv->xhv_array = (char*)PL_xpvhv_arenaroot;
670     PL_xpvhv_arenaroot = xpvhv;
671
672     xpvhvend = &xpvhv[1008 / sizeof(XPVHV) - 1];
673     PL_xpvhv_root = ++xpvhv;
674     while (xpvhv < xpvhvend) {
675         xpvhv->xhv_array = (char*)(xpvhv + 1);
676         xpvhv++;
677     }
678     xpvhv->xhv_array = 0;
679 }
680
681 STATIC XPVMG*
682 S_new_xpvmg(pTHX)
683 {
684     XPVMG* xpvmg;
685     LOCK_SV_MUTEX;
686     if (!PL_xpvmg_root)
687         more_xpvmg();
688     xpvmg = PL_xpvmg_root;
689     PL_xpvmg_root = (XPVMG*)xpvmg->xpv_pv;
690     UNLOCK_SV_MUTEX;
691     return xpvmg;
692 }
693
694 STATIC void
695 S_del_xpvmg(pTHX_ XPVMG *p)
696 {
697     LOCK_SV_MUTEX;
698     p->xpv_pv = (char*)PL_xpvmg_root;
699     PL_xpvmg_root = p;
700     UNLOCK_SV_MUTEX;
701 }
702
703 STATIC void
704 S_more_xpvmg(pTHX)
705 {
706     register XPVMG* xpvmg;
707     register XPVMG* xpvmgend;
708     New(719, xpvmg, 1008/sizeof(XPVMG), XPVMG);
709     xpvmg->xpv_pv = (char*)PL_xpvmg_arenaroot;
710     PL_xpvmg_arenaroot = xpvmg;
711
712     xpvmgend = &xpvmg[1008 / sizeof(XPVMG) - 1];
713     PL_xpvmg_root = ++xpvmg;
714     while (xpvmg < xpvmgend) {
715         xpvmg->xpv_pv = (char*)(xpvmg + 1);
716         xpvmg++;
717     }
718     xpvmg->xpv_pv = 0;
719 }
720
721 STATIC XPVLV*
722 S_new_xpvlv(pTHX)
723 {
724     XPVLV* xpvlv;
725     LOCK_SV_MUTEX;
726     if (!PL_xpvlv_root)
727         more_xpvlv();
728     xpvlv = PL_xpvlv_root;
729     PL_xpvlv_root = (XPVLV*)xpvlv->xpv_pv;
730     UNLOCK_SV_MUTEX;
731     return xpvlv;
732 }
733
734 STATIC void
735 S_del_xpvlv(pTHX_ XPVLV *p)
736 {
737     LOCK_SV_MUTEX;
738     p->xpv_pv = (char*)PL_xpvlv_root;
739     PL_xpvlv_root = p;
740     UNLOCK_SV_MUTEX;
741 }
742
743 STATIC void
744 S_more_xpvlv(pTHX)
745 {
746     register XPVLV* xpvlv;
747     register XPVLV* xpvlvend;
748     New(720, xpvlv, 1008/sizeof(XPVLV), XPVLV);
749     xpvlv->xpv_pv = (char*)PL_xpvlv_arenaroot;
750     PL_xpvlv_arenaroot = xpvlv;
751
752     xpvlvend = &xpvlv[1008 / sizeof(XPVLV) - 1];
753     PL_xpvlv_root = ++xpvlv;
754     while (xpvlv < xpvlvend) {
755         xpvlv->xpv_pv = (char*)(xpvlv + 1);
756         xpvlv++;
757     }
758     xpvlv->xpv_pv = 0;
759 }
760
761 STATIC XPVBM*
762 S_new_xpvbm(pTHX)
763 {
764     XPVBM* xpvbm;
765     LOCK_SV_MUTEX;
766     if (!PL_xpvbm_root)
767         more_xpvbm();
768     xpvbm = PL_xpvbm_root;
769     PL_xpvbm_root = (XPVBM*)xpvbm->xpv_pv;
770     UNLOCK_SV_MUTEX;
771     return xpvbm;
772 }
773
774 STATIC void
775 S_del_xpvbm(pTHX_ XPVBM *p)
776 {
777     LOCK_SV_MUTEX;
778     p->xpv_pv = (char*)PL_xpvbm_root;
779     PL_xpvbm_root = p;
780     UNLOCK_SV_MUTEX;
781 }
782
783 STATIC void
784 S_more_xpvbm(pTHX)
785 {
786     register XPVBM* xpvbm;
787     register XPVBM* xpvbmend;
788     New(721, xpvbm, 1008/sizeof(XPVBM), XPVBM);
789     xpvbm->xpv_pv = (char*)PL_xpvbm_arenaroot;
790     PL_xpvbm_arenaroot = xpvbm;
791
792     xpvbmend = &xpvbm[1008 / sizeof(XPVBM) - 1];
793     PL_xpvbm_root = ++xpvbm;
794     while (xpvbm < xpvbmend) {
795         xpvbm->xpv_pv = (char*)(xpvbm + 1);
796         xpvbm++;
797     }
798     xpvbm->xpv_pv = 0;
799 }
800
801 #ifdef LEAKTEST
802 #  define my_safemalloc(s)      (void*)safexmalloc(717,s)
803 #  define my_safefree(p)        safexfree((char*)p)
804 #else
805 #  define my_safemalloc(s)      (void*)safemalloc(s)
806 #  define my_safefree(p)        safefree((char*)p)
807 #endif
808
809 #ifdef PURIFY
810
811 #define new_XIV()       my_safemalloc(sizeof(XPVIV))
812 #define del_XIV(p)      my_safefree(p)
813
814 #define new_XNV()       my_safemalloc(sizeof(XPVNV))
815 #define del_XNV(p)      my_safefree(p)
816
817 #define new_XRV()       my_safemalloc(sizeof(XRV))
818 #define del_XRV(p)      my_safefree(p)
819
820 #define new_XPV()       my_safemalloc(sizeof(XPV))
821 #define del_XPV(p)      my_safefree(p)
822
823 #define new_XPVIV()     my_safemalloc(sizeof(XPVIV))
824 #define del_XPVIV(p)    my_safefree(p)
825
826 #define new_XPVNV()     my_safemalloc(sizeof(XPVNV))
827 #define del_XPVNV(p)    my_safefree(p)
828
829 #define new_XPVCV()     my_safemalloc(sizeof(XPVCV))
830 #define del_XPVCV(p)    my_safefree(p)
831
832 #define new_XPVAV()     my_safemalloc(sizeof(XPVAV))
833 #define del_XPVAV(p)    my_safefree(p)
834
835 #define new_XPVHV()     my_safemalloc(sizeof(XPVHV))
836 #define del_XPVHV(p)    my_safefree(p)
837
838 #define new_XPVMG()     my_safemalloc(sizeof(XPVMG))
839 #define del_XPVMG(p)    my_safefree(p)
840
841 #define new_XPVLV()     my_safemalloc(sizeof(XPVLV))
842 #define del_XPVLV(p)    my_safefree(p)
843
844 #define new_XPVBM()     my_safemalloc(sizeof(XPVBM))
845 #define del_XPVBM(p)    my_safefree(p)
846
847 #else /* !PURIFY */
848
849 #define new_XIV()       (void*)new_xiv()
850 #define del_XIV(p)      del_xiv((XPVIV*) p)
851
852 #define new_XNV()       (void*)new_xnv()
853 #define del_XNV(p)      del_xnv((XPVNV*) p)
854
855 #define new_XRV()       (void*)new_xrv()
856 #define del_XRV(p)      del_xrv((XRV*) p)
857
858 #define new_XPV()       (void*)new_xpv()
859 #define del_XPV(p)      del_xpv((XPV *)p)
860
861 #define new_XPVIV()     (void*)new_xpviv()
862 #define del_XPVIV(p)    del_xpviv((XPVIV *)p)
863
864 #define new_XPVNV()     (void*)new_xpvnv()
865 #define del_XPVNV(p)    del_xpvnv((XPVNV *)p)
866
867 #define new_XPVCV()     (void*)new_xpvcv()
868 #define del_XPVCV(p)    del_xpvcv((XPVCV *)p)
869
870 #define new_XPVAV()     (void*)new_xpvav()
871 #define del_XPVAV(p)    del_xpvav((XPVAV *)p)
872
873 #define new_XPVHV()     (void*)new_xpvhv()
874 #define del_XPVHV(p)    del_xpvhv((XPVHV *)p)
875
876 #define new_XPVMG()     (void*)new_xpvmg()
877 #define del_XPVMG(p)    del_xpvmg((XPVMG *)p)
878
879 #define new_XPVLV()     (void*)new_xpvlv()
880 #define del_XPVLV(p)    del_xpvlv((XPVLV *)p)
881
882 #define new_XPVBM()     (void*)new_xpvbm()
883 #define del_XPVBM(p)    del_xpvbm((XPVBM *)p)
884
885 #endif /* PURIFY */
886
887 #define new_XPVGV()     my_safemalloc(sizeof(XPVGV))
888 #define del_XPVGV(p)    my_safefree(p)
889
890 #define new_XPVFM()     my_safemalloc(sizeof(XPVFM))
891 #define del_XPVFM(p)    my_safefree(p)
892
893 #define new_XPVIO()     my_safemalloc(sizeof(XPVIO))
894 #define del_XPVIO(p)    my_safefree(p)
895
896 /*
897 =for apidoc sv_upgrade
898
899 Upgrade an SV to a more complex form.  Use C<SvUPGRADE>.  See
900 C<svtype>.
901
902 =cut
903 */
904
905 bool
906 Perl_sv_upgrade(pTHX_ register SV *sv, U32 mt)
907 {
908     char*       pv;
909     U32         cur;
910     U32         len;
911     IV          iv;
912     NV          nv;
913     MAGIC*      magic;
914     HV*         stash;
915
916     if (SvTYPE(sv) == mt)
917         return TRUE;
918
919     if (mt < SVt_PVIV)
920         (void)SvOOK_off(sv);
921
922     switch (SvTYPE(sv)) {
923     case SVt_NULL:
924         pv      = 0;
925         cur     = 0;
926         len     = 0;
927         iv      = 0;
928         nv      = 0.0;
929         magic   = 0;
930         stash   = 0;
931         break;
932     case SVt_IV:
933         pv      = 0;
934         cur     = 0;
935         len     = 0;
936         iv      = SvIVX(sv);
937         nv      = (NV)SvIVX(sv);
938         del_XIV(SvANY(sv));
939         magic   = 0;
940         stash   = 0;
941         if (mt == SVt_NV)
942             mt = SVt_PVNV;
943         else if (mt < SVt_PVIV)
944             mt = SVt_PVIV;
945         break;
946     case SVt_NV:
947         pv      = 0;
948         cur     = 0;
949         len     = 0;
950         nv      = SvNVX(sv);
951         iv      = I_V(nv);
952         magic   = 0;
953         stash   = 0;
954         del_XNV(SvANY(sv));
955         SvANY(sv) = 0;
956         if (mt < SVt_PVNV)
957             mt = SVt_PVNV;
958         break;
959     case SVt_RV:
960         pv      = (char*)SvRV(sv);
961         cur     = 0;
962         len     = 0;
963         iv      = PTR2IV(pv);
964         nv      = PTR2NV(pv);
965         del_XRV(SvANY(sv));
966         magic   = 0;
967         stash   = 0;
968         break;
969     case SVt_PV:
970         pv      = SvPVX(sv);
971         cur     = SvCUR(sv);
972         len     = SvLEN(sv);
973         iv      = 0;
974         nv      = 0.0;
975         magic   = 0;
976         stash   = 0;
977         del_XPV(SvANY(sv));
978         if (mt <= SVt_IV)
979             mt = SVt_PVIV;
980         else if (mt == SVt_NV)
981             mt = SVt_PVNV;
982         break;
983     case SVt_PVIV:
984         pv      = SvPVX(sv);
985         cur     = SvCUR(sv);
986         len     = SvLEN(sv);
987         iv      = SvIVX(sv);
988         nv      = 0.0;
989         magic   = 0;
990         stash   = 0;
991         del_XPVIV(SvANY(sv));
992         break;
993     case SVt_PVNV:
994         pv      = SvPVX(sv);
995         cur     = SvCUR(sv);
996         len     = SvLEN(sv);
997         iv      = SvIVX(sv);
998         nv      = SvNVX(sv);
999         magic   = 0;
1000         stash   = 0;
1001         del_XPVNV(SvANY(sv));
1002         break;
1003     case SVt_PVMG:
1004         pv      = SvPVX(sv);
1005         cur     = SvCUR(sv);
1006         len     = SvLEN(sv);
1007         iv      = SvIVX(sv);
1008         nv      = SvNVX(sv);
1009         magic   = SvMAGIC(sv);
1010         stash   = SvSTASH(sv);
1011         del_XPVMG(SvANY(sv));
1012         break;
1013     default:
1014         Perl_croak(aTHX_ "Can't upgrade that kind of scalar");
1015     }
1016
1017     switch (mt) {
1018     case SVt_NULL:
1019         Perl_croak(aTHX_ "Can't upgrade to undef");
1020     case SVt_IV:
1021         SvANY(sv) = new_XIV();
1022         SvIVX(sv)       = iv;
1023         break;
1024     case SVt_NV:
1025         SvANY(sv) = new_XNV();
1026         SvNVX(sv)       = nv;
1027         break;
1028     case SVt_RV:
1029         SvANY(sv) = new_XRV();
1030         SvRV(sv) = (SV*)pv;
1031         break;
1032     case SVt_PV:
1033         SvANY(sv) = new_XPV();
1034         SvPVX(sv)       = pv;
1035         SvCUR(sv)       = cur;
1036         SvLEN(sv)       = len;
1037         break;
1038     case SVt_PVIV:
1039         SvANY(sv) = new_XPVIV();
1040         SvPVX(sv)       = pv;
1041         SvCUR(sv)       = cur;
1042         SvLEN(sv)       = len;
1043         SvIVX(sv)       = iv;
1044         if (SvNIOK(sv))
1045             (void)SvIOK_on(sv);
1046         SvNOK_off(sv);
1047         break;
1048     case SVt_PVNV:
1049         SvANY(sv) = new_XPVNV();
1050         SvPVX(sv)       = pv;
1051         SvCUR(sv)       = cur;
1052         SvLEN(sv)       = len;
1053         SvIVX(sv)       = iv;
1054         SvNVX(sv)       = nv;
1055         break;
1056     case SVt_PVMG:
1057         SvANY(sv) = new_XPVMG();
1058         SvPVX(sv)       = pv;
1059         SvCUR(sv)       = cur;
1060         SvLEN(sv)       = len;
1061         SvIVX(sv)       = iv;
1062         SvNVX(sv)       = nv;
1063         SvMAGIC(sv)     = magic;
1064         SvSTASH(sv)     = stash;
1065         break;
1066     case SVt_PVLV:
1067         SvANY(sv) = new_XPVLV();
1068         SvPVX(sv)       = pv;
1069         SvCUR(sv)       = cur;
1070         SvLEN(sv)       = len;
1071         SvIVX(sv)       = iv;
1072         SvNVX(sv)       = nv;
1073         SvMAGIC(sv)     = magic;
1074         SvSTASH(sv)     = stash;
1075         LvTARGOFF(sv)   = 0;
1076         LvTARGLEN(sv)   = 0;
1077         LvTARG(sv)      = 0;
1078         LvTYPE(sv)      = 0;
1079         break;
1080     case SVt_PVAV:
1081         SvANY(sv) = new_XPVAV();
1082         if (pv)
1083             Safefree(pv);
1084         SvPVX(sv)       = 0;
1085         AvMAX(sv)       = -1;
1086         AvFILLp(sv)     = -1;
1087         SvIVX(sv)       = 0;
1088         SvNVX(sv)       = 0.0;
1089         SvMAGIC(sv)     = magic;
1090         SvSTASH(sv)     = stash;
1091         AvALLOC(sv)     = 0;
1092         AvARYLEN(sv)    = 0;
1093         AvFLAGS(sv)     = 0;
1094         break;
1095     case SVt_PVHV:
1096         SvANY(sv) = new_XPVHV();
1097         if (pv)
1098             Safefree(pv);
1099         SvPVX(sv)       = 0;
1100         HvFILL(sv)      = 0;
1101         HvMAX(sv)       = 0;
1102         HvKEYS(sv)      = 0;
1103         SvNVX(sv)       = 0.0;
1104         SvMAGIC(sv)     = magic;
1105         SvSTASH(sv)     = stash;
1106         HvRITER(sv)     = 0;
1107         HvEITER(sv)     = 0;
1108         HvPMROOT(sv)    = 0;
1109         HvNAME(sv)      = 0;
1110         break;
1111     case SVt_PVCV:
1112         SvANY(sv) = new_XPVCV();
1113         Zero(SvANY(sv), 1, XPVCV);
1114         SvPVX(sv)       = pv;
1115         SvCUR(sv)       = cur;
1116         SvLEN(sv)       = len;
1117         SvIVX(sv)       = iv;
1118         SvNVX(sv)       = nv;
1119         SvMAGIC(sv)     = magic;
1120         SvSTASH(sv)     = stash;
1121         break;
1122     case SVt_PVGV:
1123         SvANY(sv) = new_XPVGV();
1124         SvPVX(sv)       = pv;
1125         SvCUR(sv)       = cur;
1126         SvLEN(sv)       = len;
1127         SvIVX(sv)       = iv;
1128         SvNVX(sv)       = nv;
1129         SvMAGIC(sv)     = magic;
1130         SvSTASH(sv)     = stash;
1131         GvGP(sv)        = 0;
1132         GvNAME(sv)      = 0;
1133         GvNAMELEN(sv)   = 0;
1134         GvSTASH(sv)     = 0;
1135         GvFLAGS(sv)     = 0;
1136         break;
1137     case SVt_PVBM:
1138         SvANY(sv) = new_XPVBM();
1139         SvPVX(sv)       = pv;
1140         SvCUR(sv)       = cur;
1141         SvLEN(sv)       = len;
1142         SvIVX(sv)       = iv;
1143         SvNVX(sv)       = nv;
1144         SvMAGIC(sv)     = magic;
1145         SvSTASH(sv)     = stash;
1146         BmRARE(sv)      = 0;
1147         BmUSEFUL(sv)    = 0;
1148         BmPREVIOUS(sv)  = 0;
1149         break;
1150     case SVt_PVFM:
1151         SvANY(sv) = new_XPVFM();
1152         Zero(SvANY(sv), 1, XPVFM);
1153         SvPVX(sv)       = pv;
1154         SvCUR(sv)       = cur;
1155         SvLEN(sv)       = len;
1156         SvIVX(sv)       = iv;
1157         SvNVX(sv)       = nv;
1158         SvMAGIC(sv)     = magic;
1159         SvSTASH(sv)     = stash;
1160         break;
1161     case SVt_PVIO:
1162         SvANY(sv) = new_XPVIO();
1163         Zero(SvANY(sv), 1, XPVIO);
1164         SvPVX(sv)       = pv;
1165         SvCUR(sv)       = cur;
1166         SvLEN(sv)       = len;
1167         SvIVX(sv)       = iv;
1168         SvNVX(sv)       = nv;
1169         SvMAGIC(sv)     = magic;
1170         SvSTASH(sv)     = stash;
1171         IoPAGE_LEN(sv)  = 60;
1172         break;
1173     }
1174     SvFLAGS(sv) &= ~SVTYPEMASK;
1175     SvFLAGS(sv) |= mt;
1176     return TRUE;
1177 }
1178
1179 int
1180 Perl_sv_backoff(pTHX_ register SV *sv)
1181 {
1182     assert(SvOOK(sv));
1183     if (SvIVX(sv)) {
1184         char *s = SvPVX(sv);
1185         SvLEN(sv) += SvIVX(sv);
1186         SvPVX(sv) -= SvIVX(sv);
1187         SvIV_set(sv, 0);
1188         Move(s, SvPVX(sv), SvCUR(sv)+1, char);
1189     }
1190     SvFLAGS(sv) &= ~SVf_OOK;
1191     return 0;
1192 }
1193
1194 /*
1195 =for apidoc sv_grow
1196
1197 Expands the character buffer in the SV.  This will use C<sv_unref> and will
1198 upgrade the SV to C<SVt_PV>.  Returns a pointer to the character buffer.
1199 Use C<SvGROW>.
1200
1201 =cut
1202 */
1203
1204 char *
1205 Perl_sv_grow(pTHX_ register SV *sv, register STRLEN newlen)
1206 {
1207     register char *s;
1208
1209 #ifdef HAS_64K_LIMIT
1210     if (newlen >= 0x10000) {
1211         PerlIO_printf(Perl_debug_log,
1212                       "Allocation too large: %"UVxf"\n", (UV)newlen);
1213         my_exit(1);
1214     }
1215 #endif /* HAS_64K_LIMIT */
1216     if (SvROK(sv))
1217         sv_unref(sv);
1218     if (SvTYPE(sv) < SVt_PV) {
1219         sv_upgrade(sv, SVt_PV);
1220         s = SvPVX(sv);
1221     }
1222     else if (SvOOK(sv)) {       /* pv is offset? */
1223         sv_backoff(sv);
1224         s = SvPVX(sv);
1225         if (newlen > SvLEN(sv))
1226             newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
1227 #ifdef HAS_64K_LIMIT
1228         if (newlen >= 0x10000)
1229             newlen = 0xFFFF;
1230 #endif
1231     }
1232     else
1233         s = SvPVX(sv);
1234     if (newlen > SvLEN(sv)) {           /* need more room? */
1235         if (SvLEN(sv) && s) {
1236 #if defined(MYMALLOC) && !defined(LEAKTEST)
1237             STRLEN l = malloced_size((void*)SvPVX(sv));
1238             if (newlen <= l) {
1239                 SvLEN_set(sv, l);
1240                 return s;
1241             } else
1242 #endif
1243             Renew(s,newlen,char);
1244         }
1245         else
1246             New(703,s,newlen,char);
1247         SvPV_set(sv, s);
1248         SvLEN_set(sv, newlen);
1249     }
1250     return s;
1251 }
1252
1253 /*
1254 =for apidoc sv_setiv
1255
1256 Copies an integer into the given SV.  Does not handle 'set' magic.  See
1257 C<sv_setiv_mg>.
1258
1259 =cut
1260 */
1261
1262 void
1263 Perl_sv_setiv(pTHX_ register SV *sv, IV i)
1264 {
1265     SV_CHECK_THINKFIRST(sv);
1266     switch (SvTYPE(sv)) {
1267     case SVt_NULL:
1268         sv_upgrade(sv, SVt_IV);
1269         break;
1270     case SVt_NV:
1271         sv_upgrade(sv, SVt_PVNV);
1272         break;
1273     case SVt_RV:
1274     case SVt_PV:
1275         sv_upgrade(sv, SVt_PVIV);
1276         break;
1277
1278     case SVt_PVGV:
1279     case SVt_PVAV:
1280     case SVt_PVHV:
1281     case SVt_PVCV:
1282     case SVt_PVFM:
1283     case SVt_PVIO:
1284         {
1285             dTHR;
1286             Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
1287                   PL_op_desc[PL_op->op_type]);
1288         }
1289     }
1290     (void)SvIOK_only(sv);                       /* validate number */
1291     SvIVX(sv) = i;
1292     SvTAINT(sv);
1293 }
1294
1295 /*
1296 =for apidoc sv_setiv_mg
1297
1298 Like C<sv_setiv>, but also handles 'set' magic.
1299
1300 =cut
1301 */
1302
1303 void
1304 Perl_sv_setiv_mg(pTHX_ register SV *sv, IV i)
1305 {
1306     sv_setiv(sv,i);
1307     SvSETMAGIC(sv);
1308 }
1309
1310 /*
1311 =for apidoc sv_setuv
1312
1313 Copies an unsigned integer into the given SV.  Does not handle 'set' magic.
1314 See C<sv_setuv_mg>.
1315
1316 =cut
1317 */
1318
1319 void
1320 Perl_sv_setuv(pTHX_ register SV *sv, UV u)
1321 {
1322     sv_setiv(sv, 0);
1323     SvIsUV_on(sv);
1324     SvUVX(sv) = u;
1325 }
1326
1327 /*
1328 =for apidoc sv_setuv_mg
1329
1330 Like C<sv_setuv>, but also handles 'set' magic.
1331
1332 =cut
1333 */
1334
1335 void
1336 Perl_sv_setuv_mg(pTHX_ register SV *sv, UV u)
1337 {
1338     sv_setuv(sv,u);
1339     SvSETMAGIC(sv);
1340 }
1341
1342 /*
1343 =for apidoc sv_setnv
1344
1345 Copies a double into the given SV.  Does not handle 'set' magic.  See
1346 C<sv_setnv_mg>.
1347
1348 =cut
1349 */
1350
1351 void
1352 Perl_sv_setnv(pTHX_ register SV *sv, NV num)
1353 {
1354     SV_CHECK_THINKFIRST(sv);
1355     switch (SvTYPE(sv)) {
1356     case SVt_NULL:
1357     case SVt_IV:
1358         sv_upgrade(sv, SVt_NV);
1359         break;
1360     case SVt_RV:
1361     case SVt_PV:
1362     case SVt_PVIV:
1363         sv_upgrade(sv, SVt_PVNV);
1364         break;
1365
1366     case SVt_PVGV:
1367     case SVt_PVAV:
1368     case SVt_PVHV:
1369     case SVt_PVCV:
1370     case SVt_PVFM:
1371     case SVt_PVIO:
1372         {
1373             dTHR;
1374             Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
1375                   PL_op_name[PL_op->op_type]);
1376         }
1377     }
1378     SvNVX(sv) = num;
1379     (void)SvNOK_only(sv);                       /* validate number */
1380     SvTAINT(sv);
1381 }
1382
1383 /*
1384 =for apidoc sv_setnv_mg
1385
1386 Like C<sv_setnv>, but also handles 'set' magic.
1387
1388 =cut
1389 */
1390
1391 void
1392 Perl_sv_setnv_mg(pTHX_ register SV *sv, NV num)
1393 {
1394     sv_setnv(sv,num);
1395     SvSETMAGIC(sv);
1396 }
1397
1398 STATIC void
1399 S_not_a_number(pTHX_ SV *sv)
1400 {
1401     dTHR;
1402     char tmpbuf[64];
1403     char *d = tmpbuf;
1404     char *s;
1405     char *limit = tmpbuf + sizeof(tmpbuf) - 8;
1406                   /* each *s can expand to 4 chars + "...\0",
1407                      i.e. need room for 8 chars */
1408
1409     for (s = SvPVX(sv); *s && d < limit; s++) {
1410         int ch = *s & 0xFF;
1411         if (ch & 128 && !isPRINT_LC(ch)) {
1412             *d++ = 'M';
1413             *d++ = '-';
1414             ch &= 127;
1415         }
1416         if (ch == '\n') {
1417             *d++ = '\\';
1418             *d++ = 'n';
1419         }
1420         else if (ch == '\r') {
1421             *d++ = '\\';
1422             *d++ = 'r';
1423         }
1424         else if (ch == '\f') {
1425             *d++ = '\\';
1426             *d++ = 'f';
1427         }
1428         else if (ch == '\\') {
1429             *d++ = '\\';
1430             *d++ = '\\';
1431         }
1432         else if (isPRINT_LC(ch))
1433             *d++ = ch;
1434         else {
1435             *d++ = '^';
1436             *d++ = toCTRL(ch);
1437         }
1438     }
1439     if (*s) {
1440         *d++ = '.';
1441         *d++ = '.';
1442         *d++ = '.';
1443     }
1444     *d = '\0';
1445
1446     if (PL_op)
1447         Perl_warner(aTHX_ WARN_NUMERIC,
1448                     "Argument \"%s\" isn't numeric in %s", tmpbuf,
1449                 PL_op_desc[PL_op->op_type]);
1450     else
1451         Perl_warner(aTHX_ WARN_NUMERIC,
1452                     "Argument \"%s\" isn't numeric", tmpbuf);
1453 }
1454
1455 /* the number can be converted to integer with atol() or atoll() */
1456 #define IS_NUMBER_TO_INT_BY_ATOL 0x01
1457 #define IS_NUMBER_TO_INT_BY_ATOF 0x02 /* atol() may be != atof() */
1458 #define IS_NUMBER_NOT_IV         0x04 /* (IV)atof() may be != atof() */
1459 #define IS_NUMBER_NEG            0x08 /* not good to cache UV */
1460 #define IS_NUMBER_INFINITY       0x10 /* this is big */
1461
1462 /* Actually, ISO C leaves conversion of UV to IV undefined, but
1463    until proven guilty, assume that things are not that bad... */
1464
1465 IV
1466 Perl_sv_2iv(pTHX_ register SV *sv)
1467 {
1468     if (!sv)
1469         return 0;
1470     if (SvGMAGICAL(sv)) {
1471         mg_get(sv);
1472         if (SvIOKp(sv))
1473             return SvIVX(sv);
1474         if (SvNOKp(sv)) {
1475             return I_V(SvNVX(sv));
1476         }
1477         if (SvPOKp(sv) && SvLEN(sv))
1478             return asIV(sv);
1479         if (!SvROK(sv)) {
1480             if (!(SvFLAGS(sv) & SVs_PADTMP)) {
1481                 dTHR;
1482                 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1483                     report_uninit();
1484             }
1485             return 0;
1486         }
1487     }
1488     if (SvTHINKFIRST(sv)) {
1489         if (SvROK(sv)) {
1490           SV* tmpstr;
1491           if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
1492               return SvIV(tmpstr);
1493           return PTR2IV(SvRV(sv));
1494         }
1495         if (SvREADONLY(sv) && !SvOK(sv)) {
1496             dTHR;
1497             if (ckWARN(WARN_UNINITIALIZED))
1498                 report_uninit();
1499             return 0;
1500         }
1501     }
1502     if (SvIOKp(sv)) {
1503         if (SvIsUV(sv)) {
1504             return (IV)(SvUVX(sv));
1505         }
1506         else {
1507             return SvIVX(sv);
1508         }
1509     }
1510     if (SvNOKp(sv)) {
1511         /* We can cache the IV/UV value even if it not good enough
1512          * to reconstruct NV, since the conversion to PV will prefer
1513          * NV over IV/UV.
1514          */
1515
1516         if (SvTYPE(sv) == SVt_NV)
1517             sv_upgrade(sv, SVt_PVNV);
1518
1519         (void)SvIOK_on(sv);
1520         if (SvNVX(sv) < (NV)IV_MAX + 0.5)
1521             SvIVX(sv) = I_V(SvNVX(sv));
1522         else {
1523             SvUVX(sv) = U_V(SvNVX(sv));
1524             SvIsUV_on(sv);
1525           ret_iv_max:
1526             DEBUG_c(PerlIO_printf(Perl_debug_log,
1527                                   "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
1528                                   PTR2UV(sv),
1529                                   SvUVX(sv),
1530                                   SvUVX(sv)));
1531             return (IV)SvUVX(sv);
1532         }
1533     }
1534     else if (SvPOKp(sv) && SvLEN(sv)) {
1535         I32 numtype = looks_like_number(sv);
1536
1537         /* We want to avoid a possible problem when we cache an IV which
1538            may be later translated to an NV, and the resulting NV is not
1539            the translation of the initial data.
1540         
1541            This means that if we cache such an IV, we need to cache the
1542            NV as well.  Moreover, we trade speed for space, and do not
1543            cache the NV if not needed.
1544          */
1545         if (numtype & IS_NUMBER_NOT_IV) {
1546             /* May be not an integer.  Need to cache NV if we cache IV
1547              * - otherwise future conversion to NV will be wrong.  */
1548             NV d;
1549
1550             d = Atof(SvPVX(sv));
1551
1552             if (SvTYPE(sv) < SVt_PVNV)
1553                 sv_upgrade(sv, SVt_PVNV);
1554             SvNVX(sv) = d;
1555             (void)SvNOK_on(sv);
1556             (void)SvIOK_on(sv);
1557 #if defined(USE_LONG_DOUBLE)
1558             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
1559                                   PTR2UV(sv), SvNVX(sv)));
1560 #else
1561             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%g)\n",
1562                                   PTR2UV(sv), SvNVX(sv)));
1563 #endif
1564             if (SvNVX(sv) < (NV)IV_MAX + 0.5)
1565                 SvIVX(sv) = I_V(SvNVX(sv));
1566             else {
1567                 SvUVX(sv) = U_V(SvNVX(sv));
1568                 SvIsUV_on(sv);
1569                 goto ret_iv_max;
1570             }
1571         }
1572         else {  /* The NV may be reconstructed from IV - safe to cache IV,
1573                    which may be calculated by atol(). */
1574             if (SvTYPE(sv) < SVt_PVIV)
1575                 sv_upgrade(sv, SVt_PVIV);
1576             (void)SvIOK_on(sv);
1577             SvIVX(sv) = Atol(SvPVX(sv));
1578             if (! numtype && ckWARN(WARN_NUMERIC))
1579                 not_a_number(sv);
1580         }
1581     }
1582     else  {
1583         dTHR;
1584         if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
1585             report_uninit();
1586         if (SvTYPE(sv) < SVt_IV)
1587             /* Typically the caller expects that sv_any is not NULL now.  */
1588             sv_upgrade(sv, SVt_IV);
1589         return 0;
1590     }
1591     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
1592         PTR2UV(sv),SvIVX(sv)));
1593     return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
1594 }
1595
1596 UV
1597 Perl_sv_2uv(pTHX_ register SV *sv)
1598 {
1599     if (!sv)
1600         return 0;
1601     if (SvGMAGICAL(sv)) {
1602         mg_get(sv);
1603         if (SvIOKp(sv))
1604             return SvUVX(sv);
1605         if (SvNOKp(sv))
1606             return U_V(SvNVX(sv));
1607         if (SvPOKp(sv) && SvLEN(sv))
1608             return asUV(sv);
1609         if (!SvROK(sv)) {
1610             if (!(SvFLAGS(sv) & SVs_PADTMP)) {
1611                 dTHR;
1612                 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1613                     report_uninit();
1614             }
1615             return 0;
1616         }
1617     }
1618     if (SvTHINKFIRST(sv)) {
1619         if (SvROK(sv)) {
1620           SV* tmpstr;
1621           if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
1622               return SvUV(tmpstr);
1623           return PTR2UV(SvRV(sv));
1624         }
1625         if (SvREADONLY(sv) && !SvOK(sv)) {
1626             dTHR;
1627             if (ckWARN(WARN_UNINITIALIZED))
1628                 report_uninit();
1629             return 0;
1630         }
1631     }
1632     if (SvIOKp(sv)) {
1633         if (SvIsUV(sv)) {
1634             return SvUVX(sv);
1635         }
1636         else {
1637             return (UV)SvIVX(sv);
1638         }
1639     }
1640     if (SvNOKp(sv)) {
1641         /* We can cache the IV/UV value even if it not good enough
1642          * to reconstruct NV, since the conversion to PV will prefer
1643          * NV over IV/UV.
1644          */
1645         if (SvTYPE(sv) == SVt_NV)
1646             sv_upgrade(sv, SVt_PVNV);
1647         (void)SvIOK_on(sv);
1648         if (SvNVX(sv) >= -0.5) {
1649             SvIsUV_on(sv);
1650             SvUVX(sv) = U_V(SvNVX(sv));
1651         }
1652         else {
1653             SvIVX(sv) = I_V(SvNVX(sv));
1654           ret_zero:
1655             DEBUG_c(PerlIO_printf(Perl_debug_log,
1656                                   "0x%"UVxf" 2uv(%"IVdf" => %"IVdf") (as signed)\n",
1657                                   PTR2UV(sv),
1658                                   SvIVX(sv),
1659                                   (IV)(UV)SvIVX(sv)));
1660             return (UV)SvIVX(sv);
1661         }
1662     }
1663     else if (SvPOKp(sv) && SvLEN(sv)) {
1664         I32 numtype = looks_like_number(sv);
1665
1666         /* We want to avoid a possible problem when we cache a UV which
1667            may be later translated to an NV, and the resulting NV is not
1668            the translation of the initial data.
1669         
1670            This means that if we cache such a UV, we need to cache the
1671            NV as well.  Moreover, we trade speed for space, and do not
1672            cache the NV if not needed.
1673          */
1674         if (numtype & IS_NUMBER_NOT_IV) {
1675             /* May be not an integer.  Need to cache NV if we cache IV
1676              * - otherwise future conversion to NV will be wrong.  */
1677             NV d;
1678
1679             d = Atof(SvPVX(sv));
1680
1681             if (SvTYPE(sv) < SVt_PVNV)
1682                 sv_upgrade(sv, SVt_PVNV);
1683             SvNVX(sv) = d;
1684             (void)SvNOK_on(sv);
1685             (void)SvIOK_on(sv);
1686 #if defined(USE_LONG_DOUBLE)
1687             DEBUG_c(PerlIO_printf(Perl_debug_log,
1688                                   "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
1689                                   PTR2UV(sv), SvNVX(sv)));
1690 #else
1691             DEBUG_c(PerlIO_printf(Perl_debug_log,
1692                                   "0x%"UVxf" 2nv(%g)\n",
1693                                   PTR2UV(sv), SvNVX(sv)));
1694 #endif
1695             if (SvNVX(sv) < -0.5) {
1696                 SvIVX(sv) = I_V(SvNVX(sv));
1697                 goto ret_zero;
1698             } else {
1699                 SvUVX(sv) = U_V(SvNVX(sv));
1700                 SvIsUV_on(sv);
1701             }
1702         }
1703         else if (numtype & IS_NUMBER_NEG) {
1704             /* The NV may be reconstructed from IV - safe to cache IV,
1705                which may be calculated by atol(). */
1706             if (SvTYPE(sv) == SVt_PV)
1707                 sv_upgrade(sv, SVt_PVIV);
1708             (void)SvIOK_on(sv);
1709             SvIVX(sv) = (IV)Atol(SvPVX(sv));
1710         }
1711         else if (numtype) {             /* Non-negative */
1712             /* The NV may be reconstructed from UV - safe to cache UV,
1713                which may be calculated by strtoul()/atol. */
1714             if (SvTYPE(sv) == SVt_PV)
1715                 sv_upgrade(sv, SVt_PVIV);
1716             (void)SvIOK_on(sv);
1717             (void)SvIsUV_on(sv);
1718 #ifdef HAS_STRTOUL
1719             SvUVX(sv) = Strtoul(SvPVX(sv), Null(char**), 10);
1720 #else                   /* no atou(), but we know the number fits into IV... */
1721                         /* The only problem may be if it is negative... */
1722             SvUVX(sv) = (UV)Atol(SvPVX(sv));
1723 #endif
1724         }
1725         else {                          /* Not a number.  Cache 0. */
1726             dTHR;
1727
1728             if (SvTYPE(sv) < SVt_PVIV)
1729                 sv_upgrade(sv, SVt_PVIV);
1730             (void)SvIOK_on(sv);
1731             (void)SvIsUV_on(sv);
1732             SvUVX(sv) = 0;              /* We assume that 0s have the
1733                                            same bitmap in IV and UV. */
1734             if (ckWARN(WARN_NUMERIC))
1735                 not_a_number(sv);
1736         }
1737     }
1738     else  {
1739         if (!(SvFLAGS(sv) & SVs_PADTMP)) {
1740             dTHR;
1741             if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1742                 report_uninit();
1743         }
1744         if (SvTYPE(sv) < SVt_IV)
1745             /* Typically the caller expects that sv_any is not NULL now.  */
1746             sv_upgrade(sv, SVt_IV);
1747         return 0;
1748     }
1749
1750     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
1751                           PTR2UV(sv),SvUVX(sv)));
1752     return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
1753 }
1754
1755 NV
1756 Perl_sv_2nv(pTHX_ register SV *sv)
1757 {
1758     if (!sv)
1759         return 0.0;
1760     if (SvGMAGICAL(sv)) {
1761         mg_get(sv);
1762         if (SvNOKp(sv))
1763             return SvNVX(sv);
1764         if (SvPOKp(sv) && SvLEN(sv)) {
1765             dTHR;
1766             if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !looks_like_number(sv))
1767                 not_a_number(sv);
1768             return Atof(SvPVX(sv));
1769         }
1770         if (SvIOKp(sv)) {
1771             if (SvIsUV(sv))
1772                 return (NV)SvUVX(sv);
1773             else
1774                 return (NV)SvIVX(sv);
1775         }       
1776         if (!SvROK(sv)) {
1777             if (!(SvFLAGS(sv) & SVs_PADTMP)) {
1778                 dTHR;
1779                 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
1780                     report_uninit();
1781             }
1782             return 0;
1783         }
1784     }
1785     if (SvTHINKFIRST(sv)) {
1786         if (SvROK(sv)) {
1787           SV* tmpstr;
1788           if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)))
1789               return SvNV(tmpstr);
1790           return PTR2NV(SvRV(sv));
1791         }
1792         if (SvREADONLY(sv) && !SvOK(sv)) {
1793             dTHR;
1794             if (ckWARN(WARN_UNINITIALIZED))
1795                 report_uninit();
1796             return 0.0;
1797         }
1798     }
1799     if (SvTYPE(sv) < SVt_NV) {
1800         if (SvTYPE(sv) == SVt_IV)
1801             sv_upgrade(sv, SVt_PVNV);
1802         else
1803             sv_upgrade(sv, SVt_NV);
1804 #if defined(USE_LONG_DOUBLE)
1805         DEBUG_c({
1806             STORE_NUMERIC_LOCAL_SET_STANDARD();
1807             PerlIO_printf(Perl_debug_log,
1808                           "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
1809                           PTR2UV(sv), SvNVX(sv));
1810             RESTORE_NUMERIC_LOCAL();
1811         });
1812 #else
1813         DEBUG_c({
1814             STORE_NUMERIC_LOCAL_SET_STANDARD();
1815             PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%g)\n",
1816                           PTR2UV(sv), SvNVX(sv));
1817             RESTORE_NUMERIC_LOCAL();
1818         });
1819 #endif
1820     }
1821     else if (SvTYPE(sv) < SVt_PVNV)
1822         sv_upgrade(sv, SVt_PVNV);
1823     if (SvIOKp(sv) &&
1824             (!SvPOKp(sv) || !strchr(SvPVX(sv),'.') || !looks_like_number(sv)))
1825     {
1826         SvNVX(sv) = SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv);
1827     }
1828     else if (SvPOKp(sv) && SvLEN(sv)) {
1829         dTHR;
1830         if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !looks_like_number(sv))
1831             not_a_number(sv);
1832         SvNVX(sv) = Atof(SvPVX(sv));
1833     }
1834     else  {
1835         dTHR;
1836         if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
1837             report_uninit();
1838         if (SvTYPE(sv) < SVt_NV)
1839             /* Typically the caller expects that sv_any is not NULL now.  */
1840             sv_upgrade(sv, SVt_NV);
1841         return 0.0;
1842     }
1843     SvNOK_on(sv);
1844 #if defined(USE_LONG_DOUBLE)
1845     DEBUG_c({
1846         STORE_NUMERIC_LOCAL_SET_STANDARD();
1847         PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
1848                       PTR2UV(sv), SvNVX(sv));
1849         RESTORE_NUMERIC_LOCAL();
1850     });
1851 #else
1852     DEBUG_c({
1853         STORE_NUMERIC_LOCAL_SET_STANDARD();
1854         PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%g)\n",
1855                       PTR2UV(sv), SvNVX(sv));
1856         RESTORE_NUMERIC_LOCAL();
1857     });
1858 #endif
1859     return SvNVX(sv);
1860 }
1861
1862 STATIC IV
1863 S_asIV(pTHX_ SV *sv)
1864 {
1865     I32 numtype = looks_like_number(sv);
1866     NV d;
1867
1868     if (numtype & IS_NUMBER_TO_INT_BY_ATOL)
1869         return Atol(SvPVX(sv));
1870     if (!numtype) {
1871         dTHR;
1872         if (ckWARN(WARN_NUMERIC))
1873             not_a_number(sv);
1874     }
1875     d = Atof(SvPVX(sv));
1876     return I_V(d);
1877 }
1878
1879 STATIC UV
1880 S_asUV(pTHX_ SV *sv)
1881 {
1882     I32 numtype = looks_like_number(sv);
1883
1884 #ifdef HAS_STRTOUL
1885     if (numtype & IS_NUMBER_TO_INT_BY_ATOL)
1886         return Strtoul(SvPVX(sv), Null(char**), 10);
1887 #endif
1888     if (!numtype) {
1889         dTHR;
1890         if (ckWARN(WARN_NUMERIC))
1891             not_a_number(sv);
1892     }
1893     return U_V(Atof(SvPVX(sv)));
1894 }
1895
1896 /*
1897  * Returns a combination of (advisory only - can get false negatives)
1898  *      IS_NUMBER_TO_INT_BY_ATOL, IS_NUMBER_TO_INT_BY_ATOF, IS_NUMBER_NOT_IV,
1899  *      IS_NUMBER_NEG
1900  * 0 if does not look like number.
1901  *
1902  * In fact possible values are 0 and
1903  * IS_NUMBER_TO_INT_BY_ATOL                             123
1904  * IS_NUMBER_TO_INT_BY_ATOL | IS_NUMBER_NOT_IV          123.1
1905  * IS_NUMBER_TO_INT_BY_ATOF | IS_NUMBER_NOT_IV          123e0
1906  * IS_NUMBER_INFINITY
1907  * with a possible addition of IS_NUMBER_NEG.
1908  */
1909
1910 /*
1911 =for apidoc looks_like_number
1912
1913 Test if an the content of an SV looks like a number (or is a
1914 number).
1915
1916 =cut
1917 */
1918
1919 I32
1920 Perl_looks_like_number(pTHX_ SV *sv)
1921 {
1922     register char *s;
1923     register char *send;
1924     register char *sbegin;
1925     register char *nbegin;
1926     I32 numtype = 0;
1927     I32 sawinf  = 0;
1928     STRLEN len;
1929
1930     if (SvPOK(sv)) {
1931         sbegin = SvPVX(sv);
1932         len = SvCUR(sv);
1933     }
1934     else if (SvPOKp(sv))
1935         sbegin = SvPV(sv, len);
1936     else
1937         return 1;
1938     send = sbegin + len;
1939
1940     s = sbegin;
1941     while (isSPACE(*s))
1942         s++;
1943     if (*s == '-') {
1944         s++;
1945         numtype = IS_NUMBER_NEG;
1946     }
1947     else if (*s == '+')
1948         s++;
1949
1950     nbegin = s;
1951     /*
1952      * we return IS_NUMBER_TO_INT_BY_ATOL if the number can be converted
1953      * to _integer_ with atol() and IS_NUMBER_TO_INT_BY_ATOF if you need
1954      * (int)atof().
1955      */
1956
1957     /* next must be digit or the radix separator or beginning of infinity */
1958     if (isDIGIT(*s)) {
1959         do {
1960             s++;
1961         } while (isDIGIT(*s));
1962
1963         if (s - nbegin >= TYPE_DIGITS(IV))      /* Cannot cache ato[ul]() */
1964             numtype |= IS_NUMBER_TO_INT_BY_ATOF | IS_NUMBER_NOT_IV;
1965         else
1966             numtype |= IS_NUMBER_TO_INT_BY_ATOL;
1967
1968         if (*s == '.'
1969 #ifdef USE_LOCALE_NUMERIC
1970             || IS_NUMERIC_RADIX(*s)
1971 #endif
1972             ) {
1973             s++;
1974             numtype |= IS_NUMBER_NOT_IV;
1975             while (isDIGIT(*s))  /* optional digits after the radix */
1976                 s++;
1977         }
1978     }
1979     else if (*s == '.'
1980 #ifdef USE_LOCALE_NUMERIC
1981             || IS_NUMERIC_RADIX(*s)
1982 #endif
1983             ) {
1984         s++;
1985         numtype |= IS_NUMBER_TO_INT_BY_ATOL | IS_NUMBER_NOT_IV;
1986         /* no digits before the radix means we need digits after it */
1987         if (isDIGIT(*s)) {
1988             do {
1989                 s++;
1990             } while (isDIGIT(*s));
1991         }
1992         else
1993             return 0;
1994     }
1995     else if (*s == 'I' || *s == 'i') {
1996         s++; if (*s != 'N' && *s != 'n') return 0;
1997         s++; if (*s != 'F' && *s != 'f') return 0;
1998         s++; if (*s == 'I' || *s == 'i') {
1999             s++; if (*s != 'N' && *s != 'n') return 0;
2000             s++; if (*s != 'I' && *s != 'i') return 0;
2001             s++; if (*s != 'T' && *s != 't') return 0;
2002             s++; if (*s != 'Y' && *s != 'y') return 0;
2003         }
2004         sawinf = 1;
2005     }
2006     else
2007         return 0;
2008
2009     if (sawinf)
2010         numtype = IS_NUMBER_INFINITY;
2011     else {
2012         /* we can have an optional exponent part */
2013         if (*s == 'e' || *s == 'E') {
2014             numtype &= ~IS_NUMBER_NEG;
2015             numtype |= IS_NUMBER_TO_INT_BY_ATOF | IS_NUMBER_NOT_IV;
2016             s++;
2017             if (*s == '+' || *s == '-')
2018                 s++;
2019             if (isDIGIT(*s)) {
2020                 do {
2021                     s++;
2022                 } while (isDIGIT(*s));
2023             }
2024             else
2025                 return 0;
2026         }
2027     }
2028     while (isSPACE(*s))
2029         s++;
2030     if (s >= send)
2031         return numtype;
2032     if (len == 10 && memEQ(sbegin, "0 but true", 10))
2033         return IS_NUMBER_TO_INT_BY_ATOL;
2034     return 0;
2035 }
2036
2037 char *
2038 Perl_sv_2pv_nolen(pTHX_ register SV *sv)
2039 {
2040     STRLEN n_a;
2041     return sv_2pv(sv, &n_a);
2042 }
2043
2044 /* We assume that buf is at least TYPE_CHARS(UV) long. */
2045 static char *
2046 uiv_2buf(char *buf, IV iv, UV uv, int is_uv, char **peob)
2047 {
2048     char *ptr = buf + TYPE_CHARS(UV);
2049     char *ebuf = ptr;
2050     int sign;
2051
2052     if (is_uv)
2053         sign = 0;
2054     else if (iv >= 0) {
2055         uv = iv;
2056         sign = 0;
2057     } else {
2058         uv = -iv;
2059         sign = 1;
2060     }
2061     do {
2062         *--ptr = '0' + (uv % 10);
2063     } while (uv /= 10);
2064     if (sign)
2065         *--ptr = '-';
2066     *peob = ebuf;
2067     return ptr;
2068 }
2069
2070 char *
2071 Perl_sv_2pv(pTHX_ register SV *sv, STRLEN *lp)
2072 {
2073     register char *s;
2074     int olderrno;
2075     SV *tsv;
2076     char tbuf[64];      /* Must fit sprintf/Gconvert of longest IV/NV */
2077     char *tmpbuf = tbuf;
2078
2079     if (!sv) {
2080         *lp = 0;
2081         return "";
2082     }
2083     if (SvGMAGICAL(sv)) {
2084         mg_get(sv);
2085         if (SvPOKp(sv)) {
2086             *lp = SvCUR(sv);
2087             return SvPVX(sv);
2088         }
2089         if (SvIOKp(sv)) {
2090             if (SvIsUV(sv))
2091                 (void)sprintf(tmpbuf,"%"UVuf, (UV)SvUVX(sv));
2092             else
2093                 (void)sprintf(tmpbuf,"%"IVdf, (IV)SvIVX(sv));
2094             tsv = Nullsv;
2095             goto tokensave;
2096         }
2097         if (SvNOKp(sv)) {
2098             Gconvert(SvNVX(sv), NV_DIG, 0, tmpbuf);
2099             tsv = Nullsv;
2100             goto tokensave;
2101         }
2102         if (!SvROK(sv)) {
2103             if (!(SvFLAGS(sv) & SVs_PADTMP)) {
2104                 dTHR;
2105                 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
2106                     report_uninit();
2107             }
2108             *lp = 0;
2109             return "";
2110         }
2111     }
2112     if (SvTHINKFIRST(sv)) {
2113         if (SvROK(sv)) {
2114             SV* tmpstr;
2115             if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)))
2116                 return SvPV(tmpstr,*lp);
2117             sv = (SV*)SvRV(sv);
2118             if (!sv)
2119                 s = "NULLREF";
2120             else {
2121                 MAGIC *mg;
2122                 
2123                 switch (SvTYPE(sv)) {
2124                 case SVt_PVMG:
2125                     if ( ((SvFLAGS(sv) &
2126                            (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG))
2127                           == (SVs_OBJECT|SVs_RMG))
2128                          && strEQ(s=HvNAME(SvSTASH(sv)), "Regexp")
2129                          && (mg = mg_find(sv, 'r'))) {
2130                         dTHR;
2131                         regexp *re = (regexp *)mg->mg_obj;
2132
2133                         if (!mg->mg_ptr) {
2134                             char *fptr = "msix";
2135                             char reflags[6];
2136                             char ch;
2137                             int left = 0;
2138                             int right = 4;
2139                             U16 reganch = (re->reganch & PMf_COMPILETIME) >> 12;
2140
2141                             while((ch = *fptr++)) {
2142                                 if(reganch & 1) {
2143                                     reflags[left++] = ch;
2144                                 }
2145                                 else {
2146                                     reflags[right--] = ch;
2147                                 }
2148                                 reganch >>= 1;
2149                             }
2150                             if(left != 4) {
2151                                 reflags[left] = '-';
2152                                 left = 5;
2153                             }
2154
2155                             mg->mg_len = re->prelen + 4 + left;
2156                             New(616, mg->mg_ptr, mg->mg_len + 1 + left, char);
2157                             Copy("(?", mg->mg_ptr, 2, char);
2158                             Copy(reflags, mg->mg_ptr+2, left, char);
2159                             Copy(":", mg->mg_ptr+left+2, 1, char);
2160                             Copy(re->precomp, mg->mg_ptr+3+left, re->prelen, char);
2161                             mg->mg_ptr[mg->mg_len - 1] = ')';
2162                             mg->mg_ptr[mg->mg_len] = 0;
2163                         }
2164                         PL_reginterp_cnt += re->program[0].next_off;
2165                         *lp = mg->mg_len;
2166                         return mg->mg_ptr;
2167                     }
2168                                         /* Fall through */
2169                 case SVt_NULL:
2170                 case SVt_IV:
2171                 case SVt_NV:
2172                 case SVt_RV:
2173                 case SVt_PV:
2174                 case SVt_PVIV:
2175                 case SVt_PVNV:
2176                 case SVt_PVBM:  if (SvROK(sv))
2177                                     s = "REF";
2178                                 else
2179                                     s = "SCALAR";               break;
2180                 case SVt_PVLV:  s = "LVALUE";                   break;
2181                 case SVt_PVAV:  s = "ARRAY";                    break;
2182                 case SVt_PVHV:  s = "HASH";                     break;
2183                 case SVt_PVCV:  s = "CODE";                     break;
2184                 case SVt_PVGV:  s = "GLOB";                     break;
2185                 case SVt_PVFM:  s = "FORMAT";                   break;
2186                 case SVt_PVIO:  s = "IO";                       break;
2187                 default:        s = "UNKNOWN";                  break;
2188                 }
2189                 tsv = NEWSV(0,0);
2190                 if (SvOBJECT(sv))
2191                     Perl_sv_setpvf(aTHX_ tsv, "%s=%s", HvNAME(SvSTASH(sv)), s);
2192                 else
2193                     sv_setpv(tsv, s);
2194                 Perl_sv_catpvf(aTHX_ tsv, "(0x%"UVxf")", PTR2UV(sv));
2195                 goto tokensaveref;
2196             }
2197             *lp = strlen(s);
2198             return s;
2199         }
2200         if (SvREADONLY(sv) && !SvOK(sv)) {
2201             dTHR;
2202             if (ckWARN(WARN_UNINITIALIZED))
2203                 report_uninit();
2204             *lp = 0;
2205             return "";
2206         }
2207     }
2208     if (SvNOKp(sv)) {                   /* See note in sv_2uv() */
2209         /* XXXX 64-bit?  IV may have better precision... */
2210         /* I tried changing this to be 64-bit-aware and
2211          * the t/op/numconvert.t became very, very, angry.
2212          * --jhi Sep 1999 */
2213         if (SvTYPE(sv) < SVt_PVNV)
2214             sv_upgrade(sv, SVt_PVNV);
2215         /* The +20 is pure guesswork.  Configure test needed. --jhi */
2216         SvGROW(sv, NV_DIG + 20);
2217         s = SvPVX(sv);
2218         olderrno = errno;       /* some Xenix systems wipe out errno here */
2219 #ifdef apollo
2220         if (SvNVX(sv) == 0.0)
2221             (void)strcpy(s,"0");
2222         else
2223 #endif /*apollo*/
2224         {
2225             Gconvert(SvNVX(sv), NV_DIG, 0, s);
2226         }
2227         errno = olderrno;
2228 #ifdef FIXNEGATIVEZERO
2229         if (*s == '-' && s[1] == '0' && !s[2])
2230             strcpy(s,"0");
2231 #endif
2232         while (*s) s++;
2233 #ifdef hcx
2234         if (s[-1] == '.')
2235             *--s = '\0';
2236 #endif
2237     }
2238     else if (SvIOKp(sv)) {
2239         U32 isIOK = SvIOK(sv);
2240         U32 isUIOK = SvIsUV(sv);
2241         char buf[TYPE_CHARS(UV)];
2242         char *ebuf, *ptr;
2243
2244         if (SvTYPE(sv) < SVt_PVIV)
2245             sv_upgrade(sv, SVt_PVIV);
2246         if (isUIOK)
2247             ptr = uiv_2buf(buf, 0, SvUVX(sv), 1, &ebuf);
2248         else
2249             ptr = uiv_2buf(buf, SvIVX(sv), 0, 0, &ebuf);
2250         SvGROW(sv, ebuf - ptr + 1);     /* inlined from sv_setpvn */
2251         Move(ptr,SvPVX(sv),ebuf - ptr,char);
2252         SvCUR_set(sv, ebuf - ptr);
2253         s = SvEND(sv);
2254         *s = '\0';
2255         if (isIOK)
2256             SvIOK_on(sv);
2257         else
2258             SvIOKp_on(sv);
2259         if (isUIOK)
2260             SvIsUV_on(sv);
2261         SvPOK_on(sv);
2262     }
2263     else {
2264         dTHR;
2265         if (ckWARN(WARN_UNINITIALIZED)
2266             && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
2267         {
2268             report_uninit();
2269         }
2270         *lp = 0;
2271         if (SvTYPE(sv) < SVt_PV)
2272             /* Typically the caller expects that sv_any is not NULL now.  */
2273             sv_upgrade(sv, SVt_PV);
2274         return "";
2275     }
2276     *lp = s - SvPVX(sv);
2277     SvCUR_set(sv, *lp);
2278     SvPOK_on(sv);
2279     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
2280                           PTR2UV(sv),SvPVX(sv)));
2281     return SvPVX(sv);
2282
2283   tokensave:
2284     if (SvROK(sv)) {    /* XXX Skip this when sv_pvn_force calls */
2285         /* Sneaky stuff here */
2286
2287       tokensaveref:
2288         if (!tsv)
2289             tsv = newSVpv(tmpbuf, 0);
2290         sv_2mortal(tsv);
2291         *lp = SvCUR(tsv);
2292         return SvPVX(tsv);
2293     }
2294     else {
2295         STRLEN len;
2296         char *t;
2297
2298         if (tsv) {
2299             sv_2mortal(tsv);
2300             t = SvPVX(tsv);
2301             len = SvCUR(tsv);
2302         }
2303         else {
2304             t = tmpbuf;
2305             len = strlen(tmpbuf);
2306         }
2307 #ifdef FIXNEGATIVEZERO
2308         if (len == 2 && t[0] == '-' && t[1] == '0') {
2309             t = "0";
2310             len = 1;
2311         }
2312 #endif
2313         (void)SvUPGRADE(sv, SVt_PV);
2314         *lp = len;
2315         s = SvGROW(sv, len + 1);
2316         SvCUR_set(sv, len);
2317         (void)strcpy(s, t);
2318         SvPOKp_on(sv);
2319         return s;
2320     }
2321 }
2322
2323 char *
2324 Perl_sv_2pvbyte_nolen(pTHX_ register SV *sv)
2325 {
2326     STRLEN n_a;
2327     return sv_2pvbyte(sv, &n_a);
2328 }
2329
2330 char *
2331 Perl_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
2332 {
2333     return sv_2pv(sv,lp);
2334 }
2335
2336 char *
2337 Perl_sv_2pvutf8_nolen(pTHX_ register SV *sv)
2338 {
2339     STRLEN n_a;
2340     return sv_2pvutf8(sv, &n_a);
2341 }
2342
2343 char *
2344 Perl_sv_2pvutf8(pTHX_ register SV *sv, STRLEN *lp)
2345 {
2346     sv_utf8_upgrade(sv);
2347     return sv_2pv(sv,lp);
2348 }
2349
2350 /* This function is only called on magical items */
2351 bool
2352 Perl_sv_2bool(pTHX_ register SV *sv)
2353 {
2354     if (SvGMAGICAL(sv))
2355         mg_get(sv);
2356
2357     if (!SvOK(sv))
2358         return 0;
2359     if (SvROK(sv)) {
2360         dTHR;
2361         SV* tmpsv;
2362         if (SvAMAGIC(sv) && (tmpsv = AMG_CALLun(sv,bool_)))
2363             return SvTRUE(tmpsv);
2364       return SvRV(sv) != 0;
2365     }
2366     if (SvPOKp(sv)) {
2367         register XPV* Xpvtmp;
2368         if ((Xpvtmp = (XPV*)SvANY(sv)) &&
2369                 (*Xpvtmp->xpv_pv > '0' ||
2370                 Xpvtmp->xpv_cur > 1 ||
2371                 (Xpvtmp->xpv_cur && *Xpvtmp->xpv_pv != '0')))
2372             return 1;
2373         else
2374             return 0;
2375     }
2376     else {
2377         if (SvIOKp(sv))
2378             return SvIVX(sv) != 0;
2379         else {
2380             if (SvNOKp(sv))
2381                 return SvNVX(sv) != 0.0;
2382             else
2383                 return FALSE;
2384         }
2385     }
2386 }
2387
2388 /*
2389 =for apidoc sv_utf8_upgrade
2390
2391 Convert the PV of an SV to its UTF8-encoded form.
2392
2393 =cut
2394 */
2395
2396 void
2397 Perl_sv_utf8_upgrade(pTHX_ register SV *sv)
2398 {
2399     char *s, *t;
2400     bool hibit;
2401
2402     if (!sv || !SvPOK(sv) || SvUTF8(sv))
2403         return;
2404
2405     /* This function could be much more efficient if we had a FLAG in SVs
2406      * to signal if there are any hibit chars in the PV.
2407      */
2408     for (s = t = SvPVX(sv), hibit = FALSE; t < SvEND(sv) && !hibit; t++)
2409         if (*t & 0x80)
2410             hibit = TRUE;
2411
2412     if (hibit) {
2413         STRLEN len = SvCUR(sv) + 1; /* Plus the \0 */
2414         SvPVX(sv) = (char*)bytes_to_utf8((U8*)s, &len);
2415         SvCUR(sv) = len - 1;
2416         SvLEN(sv) = len; /* No longer know the real size. */
2417         SvUTF8_on(sv);
2418         Safefree(s); /* No longer using what was there before. */
2419     }
2420 }
2421
2422 /*
2423 =for apidoc sv_utf8_downgrade
2424
2425 Attempt to convert the PV of an SV from UTF8-encoded to byte encoding.
2426 This may not be possible if the PV contains non-byte encoding characters;
2427 if this is the case, either returns false or, if C<fail_ok> is not
2428 true, croaks.
2429
2430 =cut
2431 */
2432
2433 bool
2434 Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
2435 {
2436     if (SvPOK(sv) && SvUTF8(sv)) {
2437         char *c = SvPVX(sv);
2438         STRLEN len = SvCUR(sv) + 1;     /* include trailing NUL */
2439         if (!utf8_to_bytes((U8*)c, &len)) {
2440             if (fail_ok)
2441                 return FALSE;
2442             else
2443                 Perl_croak("big byte");
2444         }
2445         SvCUR(sv) = len - 1;
2446         SvUTF8_off(sv);
2447     }
2448     return TRUE;
2449 }
2450
2451 /*
2452 =for apidoc sv_utf8_encode
2453
2454 Convert the PV of an SV to UTF8-encoded, but then turn off the C<SvUTF8>
2455 flag so that it looks like bytes again. Nothing calls this.
2456
2457 =cut
2458 */
2459
2460 void
2461 Perl_sv_utf8_encode(pTHX_ register SV *sv)
2462 {
2463     sv_utf8_upgrade(sv);
2464     SvUTF8_off(sv);
2465 }
2466
2467 bool
2468 Perl_sv_utf8_decode(pTHX_ register SV *sv)
2469 {
2470     if (SvPOK(sv)) {
2471         char *c;
2472         bool has_utf = FALSE;
2473         if (!sv_utf8_downgrade(sv, TRUE))
2474             return FALSE;
2475
2476         /* it is actually just a matter of turning the utf8 flag on, but
2477          * we want to make sure everything inside is valid utf8 first.
2478          */
2479         c = SvPVX(sv);
2480         if (!is_utf8_string((U8*)c, SvCUR(sv)+1))
2481             return FALSE;
2482
2483         while (c < SvEND(sv)) {
2484             if (*c++ & 0x80) {
2485                 SvUTF8_on(sv);
2486                 break;
2487             }
2488         }
2489     }
2490     return TRUE;
2491 }
2492
2493
2494 /* Note: sv_setsv() should not be called with a source string that needs
2495  * to be reused, since it may destroy the source string if it is marked
2496  * as temporary.
2497  */
2498
2499 /*
2500 =for apidoc sv_setsv
2501
2502 Copies the contents of the source SV C<ssv> into the destination SV C<dsv>.
2503 The source SV may be destroyed if it is mortal.  Does not handle 'set'
2504 magic.  See the macro forms C<SvSetSV>, C<SvSetSV_nosteal> and
2505 C<sv_setsv_mg>.
2506
2507 =cut
2508 */
2509
2510 void
2511 Perl_sv_setsv(pTHX_ SV *dstr, register SV *sstr)
2512 {
2513     dTHR;
2514     register U32 sflags;
2515     register int dtype;
2516     register int stype;
2517
2518     if (sstr == dstr)
2519         return;
2520     SV_CHECK_THINKFIRST(dstr);
2521     if (!sstr)
2522         sstr = &PL_sv_undef;
2523     stype = SvTYPE(sstr);
2524     dtype = SvTYPE(dstr);
2525
2526     SvAMAGIC_off(dstr);
2527
2528     /* There's a lot of redundancy below but we're going for speed here */
2529
2530     switch (stype) {
2531     case SVt_NULL:
2532       undef_sstr:
2533         if (dtype != SVt_PVGV) {
2534             (void)SvOK_off(dstr);
2535             return;
2536         }
2537         break;
2538     case SVt_IV:
2539         if (SvIOK(sstr)) {
2540             switch (dtype) {
2541             case SVt_NULL:
2542                 sv_upgrade(dstr, SVt_IV);
2543                 break;
2544             case SVt_NV:
2545                 sv_upgrade(dstr, SVt_PVNV);
2546                 break;
2547             case SVt_RV:
2548             case SVt_PV:
2549                 sv_upgrade(dstr, SVt_PVIV);
2550                 break;
2551             }
2552             (void)SvIOK_only(dstr);
2553             SvIVX(dstr) = SvIVX(sstr);
2554             if (SvIsUV(sstr))
2555                 SvIsUV_on(dstr);
2556             SvTAINT(dstr);
2557             return;
2558         }
2559         goto undef_sstr;
2560
2561     case SVt_NV:
2562         if (SvNOK(sstr)) {
2563             switch (dtype) {
2564             case SVt_NULL:
2565             case SVt_IV:
2566                 sv_upgrade(dstr, SVt_NV);
2567                 break;
2568             case SVt_RV:
2569             case SVt_PV:
2570             case SVt_PVIV:
2571                 sv_upgrade(dstr, SVt_PVNV);
2572                 break;
2573             }
2574             SvNVX(dstr) = SvNVX(sstr);
2575             (void)SvNOK_only(dstr);
2576             SvTAINT(dstr);
2577             return;
2578         }
2579         goto undef_sstr;
2580
2581     case SVt_RV:
2582         if (dtype < SVt_RV)
2583             sv_upgrade(dstr, SVt_RV);
2584         else if (dtype == SVt_PVGV &&
2585                  SvTYPE(SvRV(sstr)) == SVt_PVGV) {
2586             sstr = SvRV(sstr);
2587             if (sstr == dstr) {
2588                 if (GvIMPORTED(dstr) != GVf_IMPORTED
2589                     && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
2590                 {
2591                     GvIMPORTED_on(dstr);
2592                 }
2593                 GvMULTI_on(dstr);
2594                 return;
2595             }
2596             goto glob_assign;
2597         }
2598         break;
2599     case SVt_PV:
2600     case SVt_PVFM:
2601         if (dtype < SVt_PV)
2602             sv_upgrade(dstr, SVt_PV);
2603         break;
2604     case SVt_PVIV:
2605         if (dtype < SVt_PVIV)
2606             sv_upgrade(dstr, SVt_PVIV);
2607         break;
2608     case SVt_PVNV:
2609         if (dtype < SVt_PVNV)
2610             sv_upgrade(dstr, SVt_PVNV);
2611         break;
2612     case SVt_PVAV:
2613     case SVt_PVHV:
2614     case SVt_PVCV:
2615     case SVt_PVIO:
2616         if (PL_op)
2617             Perl_croak(aTHX_ "Bizarre copy of %s in %s", sv_reftype(sstr, 0),
2618                 PL_op_name[PL_op->op_type]);
2619         else
2620             Perl_croak(aTHX_ "Bizarre copy of %s", sv_reftype(sstr, 0));
2621         break;
2622
2623     case SVt_PVGV:
2624         if (dtype <= SVt_PVGV) {
2625   glob_assign:
2626             if (dtype != SVt_PVGV) {
2627                 char *name = GvNAME(sstr);
2628                 STRLEN len = GvNAMELEN(sstr);
2629                 sv_upgrade(dstr, SVt_PVGV);
2630                 sv_magic(dstr, dstr, '*', Nullch, 0);
2631                 GvSTASH(dstr) = (HV*)SvREFCNT_inc(GvSTASH(sstr));
2632                 GvNAME(dstr) = savepvn(name, len);
2633                 GvNAMELEN(dstr) = len;
2634                 SvFAKE_on(dstr);        /* can coerce to non-glob */
2635             }
2636             /* ahem, death to those who redefine active sort subs */
2637             else if (PL_curstackinfo->si_type == PERLSI_SORT
2638                      && GvCV(dstr) && PL_sortcop == CvSTART(GvCV(dstr)))
2639                 Perl_croak(aTHX_ "Can't redefine active sort subroutine %s",
2640                       GvNAME(dstr));
2641             (void)SvOK_off(dstr);
2642             GvINTRO_off(dstr);          /* one-shot flag */
2643             gp_free((GV*)dstr);
2644             GvGP(dstr) = gp_ref(GvGP(sstr));
2645             SvTAINT(dstr);
2646             if (GvIMPORTED(dstr) != GVf_IMPORTED
2647                 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
2648             {
2649                 GvIMPORTED_on(dstr);
2650             }
2651             GvMULTI_on(dstr);
2652             return;
2653         }
2654         /* FALL THROUGH */
2655
2656     default:
2657         if (SvGMAGICAL(sstr)) {
2658             mg_get(sstr);
2659             if (SvTYPE(sstr) != stype) {
2660                 stype = SvTYPE(sstr);
2661                 if (stype == SVt_PVGV && dtype <= SVt_PVGV)
2662                     goto glob_assign;
2663             }
2664         }
2665         if (stype == SVt_PVLV)
2666             (void)SvUPGRADE(dstr, SVt_PVNV);
2667         else
2668             (void)SvUPGRADE(dstr, stype);
2669     }
2670
2671     sflags = SvFLAGS(sstr);
2672
2673     if (sflags & SVf_ROK) {
2674         if (dtype >= SVt_PV) {
2675             if (dtype == SVt_PVGV) {
2676                 SV *sref = SvREFCNT_inc(SvRV(sstr));
2677                 SV *dref = 0;
2678                 int intro = GvINTRO(dstr);
2679
2680                 if (intro) {
2681                     GP *gp;
2682                     gp_free((GV*)dstr);
2683                     GvINTRO_off(dstr);  /* one-shot flag */
2684                     Newz(602,gp, 1, GP);
2685                     GvGP(dstr) = gp_ref(gp);
2686                     GvSV(dstr) = NEWSV(72,0);
2687                     GvLINE(dstr) = CopLINE(PL_curcop);
2688                     GvEGV(dstr) = (GV*)dstr;
2689                 }
2690                 GvMULTI_on(dstr);
2691                 switch (SvTYPE(sref)) {
2692                 case SVt_PVAV:
2693                     if (intro)
2694                         SAVESPTR(GvAV(dstr));
2695                     else
2696                         dref = (SV*)GvAV(dstr);
2697                     GvAV(dstr) = (AV*)sref;
2698                     if (!GvIMPORTED_AV(dstr)
2699                         && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
2700                     {
2701                         GvIMPORTED_AV_on(dstr);
2702                     }
2703                     break;
2704                 case SVt_PVHV:
2705                     if (intro)
2706                         SAVESPTR(GvHV(dstr));
2707                     else
2708                         dref = (SV*)GvHV(dstr);
2709                     GvHV(dstr) = (HV*)sref;
2710                     if (!GvIMPORTED_HV(dstr)
2711                         && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
2712                     {
2713                         GvIMPORTED_HV_on(dstr);
2714                     }
2715                     break;
2716                 case SVt_PVCV:
2717                     if (intro) {
2718                         if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
2719                             SvREFCNT_dec(GvCV(dstr));
2720                             GvCV(dstr) = Nullcv;
2721                             GvCVGEN(dstr) = 0; /* Switch off cacheness. */
2722                             PL_sub_generation++;
2723                         }
2724                         SAVESPTR(GvCV(dstr));
2725                     }
2726                     else
2727                         dref = (SV*)GvCV(dstr);
2728                     if (GvCV(dstr) != (CV*)sref) {
2729                         CV* cv = GvCV(dstr);
2730                         if (cv) {
2731                             if (!GvCVGEN((GV*)dstr) &&
2732                                 (CvROOT(cv) || CvXSUB(cv)))
2733                             {
2734                                 SV *const_sv = cv_const_sv(cv);
2735                                 bool const_changed = TRUE;
2736                                 if(const_sv)
2737                                     const_changed = sv_cmp(const_sv,
2738                                            op_const_sv(CvSTART((CV*)sref),
2739                                                        (CV*)sref));
2740                                 /* ahem, death to those who redefine
2741                                  * active sort subs */
2742                                 if (PL_curstackinfo->si_type == PERLSI_SORT &&
2743                                       PL_sortcop == CvSTART(cv))
2744                                     Perl_croak(aTHX_
2745                                     "Can't redefine active sort subroutine %s",
2746                                           GvENAME((GV*)dstr));
2747                                 if ((const_changed && const_sv) || ckWARN(WARN_REDEFINE))
2748                                     Perl_warner(aTHX_ WARN_REDEFINE, const_sv ?
2749                                              "Constant subroutine %s redefined"
2750                                              : "Subroutine %s redefined",
2751                                              GvENAME((GV*)dstr));
2752                             }
2753                             cv_ckproto(cv, (GV*)dstr,
2754                                        SvPOK(sref) ? SvPVX(sref) : Nullch);
2755                         }
2756                         GvCV(dstr) = (CV*)sref;
2757                         GvCVGEN(dstr) = 0; /* Switch off cacheness. */
2758                         GvASSUMECV_on(dstr);
2759                         PL_sub_generation++;
2760                     }
2761                     if (!GvIMPORTED_CV(dstr)
2762                         && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
2763                     {
2764                         GvIMPORTED_CV_on(dstr);
2765                     }
2766                     break;
2767                 case SVt_PVIO:
2768                     if (intro)
2769                         SAVESPTR(GvIOp(dstr));
2770                     else
2771                         dref = (SV*)GvIOp(dstr);
2772                     GvIOp(dstr) = (IO*)sref;
2773                     break;
2774                 case SVt_PVFM:
2775                     if (intro)
2776                         SAVESPTR(GvFORM(dstr));
2777                     else
2778                         dref = (SV*)GvFORM(dstr);
2779                     GvFORM(dstr) = (CV*)sref;
2780                     break;
2781                 default:
2782                     if (intro)
2783                         SAVESPTR(GvSV(dstr));
2784                     else
2785                         dref = (SV*)GvSV(dstr);
2786                     GvSV(dstr) = sref;
2787                     if (!GvIMPORTED_SV(dstr)
2788                         && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
2789                     {
2790                         GvIMPORTED_SV_on(dstr);
2791                     }
2792                     break;
2793                 }
2794                 if (dref)
2795                     SvREFCNT_dec(dref);
2796                 if (intro)
2797                     SAVEFREESV(sref);
2798                 SvTAINT(dstr);
2799                 return;
2800             }
2801             if (SvPVX(dstr)) {
2802                 (void)SvOOK_off(dstr);          /* backoff */
2803                 if (SvLEN(dstr))
2804                     Safefree(SvPVX(dstr));
2805                 SvLEN(dstr)=SvCUR(dstr)=0;
2806             }
2807         }
2808         (void)SvOK_off(dstr);
2809         SvRV(dstr) = SvREFCNT_inc(SvRV(sstr));
2810         SvROK_on(dstr);
2811         if (sflags & SVp_NOK) {
2812             SvNOK_on(dstr);
2813             SvNVX(dstr) = SvNVX(sstr);
2814         }
2815         if (sflags & SVp_IOK) {
2816             (void)SvIOK_on(dstr);
2817             SvIVX(dstr) = SvIVX(sstr);
2818             if (sflags & SVf_IVisUV)
2819                 SvIsUV_on(dstr);
2820         }
2821         if (SvAMAGIC(sstr)) {
2822             SvAMAGIC_on(dstr);
2823         }
2824     }
2825     else if (sflags & SVp_POK) {
2826
2827         /*
2828          * Check to see if we can just swipe the string.  If so, it's a
2829          * possible small lose on short strings, but a big win on long ones.
2830          * It might even be a win on short strings if SvPVX(dstr)
2831          * has to be allocated and SvPVX(sstr) has to be freed.
2832          */
2833
2834         if (SvTEMP(sstr) &&             /* slated for free anyway? */
2835             SvREFCNT(sstr) == 1 &&      /* and no other references to it? */
2836             !(sflags & SVf_OOK) &&      /* and not involved in OOK hack? */
2837             SvLEN(sstr))                        /* and really is a string */
2838         {
2839             if (SvPVX(dstr)) {          /* we know that dtype >= SVt_PV */
2840                 if (SvOOK(dstr)) {
2841                     SvFLAGS(dstr) &= ~SVf_OOK;
2842                     Safefree(SvPVX(dstr) - SvIVX(dstr));
2843                 }
2844                 else if (SvLEN(dstr))
2845                     Safefree(SvPVX(dstr));
2846             }
2847             (void)SvPOK_only(dstr);
2848             SvPV_set(dstr, SvPVX(sstr));
2849             SvLEN_set(dstr, SvLEN(sstr));
2850             SvCUR_set(dstr, SvCUR(sstr));
2851
2852             SvTEMP_off(dstr);
2853             (void)SvOK_off(sstr);               /* NOTE: nukes most SvFLAGS on sstr */
2854             SvPV_set(sstr, Nullch);
2855             SvLEN_set(sstr, 0);
2856             SvCUR_set(sstr, 0);
2857             SvTEMP_off(sstr);
2858         }
2859         else {                                  /* have to copy actual string */
2860             STRLEN len = SvCUR(sstr);
2861
2862             SvGROW(dstr, len + 1);              /* inlined from sv_setpvn */
2863             Move(SvPVX(sstr),SvPVX(dstr),len,char);
2864             SvCUR_set(dstr, len);
2865             *SvEND(dstr) = '\0';
2866             (void)SvPOK_only(dstr);
2867         }
2868         if ((sflags & SVf_UTF8) && !IN_BYTE)
2869             SvUTF8_on(dstr);
2870         /*SUPPRESS 560*/
2871         if (sflags & SVp_NOK) {
2872             SvNOK_on(dstr);
2873             SvNVX(dstr) = SvNVX(sstr);
2874         }
2875         if (sflags & SVp_IOK) {
2876             (void)SvIOK_on(dstr);
2877             SvIVX(dstr) = SvIVX(sstr);
2878             if (sflags & SVf_IVisUV)
2879                 SvIsUV_on(dstr);
2880         }
2881     }
2882     else if (sflags & SVp_NOK) {
2883         SvNVX(dstr) = SvNVX(sstr);
2884         (void)SvNOK_only(dstr);
2885         if (sflags & SVf_IOK) {
2886             (void)SvIOK_on(dstr);
2887             SvIVX(dstr) = SvIVX(sstr);
2888             /* XXXX Do we want to set IsUV for IV(ROK)?  Be extra safe... */
2889             if (sflags & SVf_IVisUV)
2890                 SvIsUV_on(dstr);
2891         }
2892     }
2893     else if (sflags & SVp_IOK) {
2894         (void)SvIOK_only(dstr);
2895         SvIVX(dstr) = SvIVX(sstr);
2896         if (sflags & SVf_IVisUV)
2897             SvIsUV_on(dstr);
2898     }
2899     else {
2900         if (dtype == SVt_PVGV) {
2901             if (ckWARN(WARN_MISC))
2902                 Perl_warner(aTHX_ WARN_MISC, "Undefined value assigned to typeglob");
2903         }
2904         else
2905             (void)SvOK_off(dstr);
2906     }
2907     SvTAINT(dstr);
2908 }
2909
2910 /*
2911 =for apidoc sv_setsv_mg
2912
2913 Like C<sv_setsv>, but also handles 'set' magic.
2914
2915 =cut
2916 */
2917
2918 void
2919 Perl_sv_setsv_mg(pTHX_ SV *dstr, register SV *sstr)
2920 {
2921     sv_setsv(dstr,sstr);
2922     SvSETMAGIC(dstr);
2923 }
2924
2925 /*
2926 =for apidoc sv_setpvn
2927
2928 Copies a string into an SV.  The C<len> parameter indicates the number of
2929 bytes to be copied.  Does not handle 'set' magic.  See C<sv_setpvn_mg>.
2930
2931 =cut
2932 */
2933
2934 void
2935 Perl_sv_setpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
2936 {
2937     register char *dptr;
2938     assert(len >= 0);  /* STRLEN is probably unsigned, so this may
2939                           elicit a warning, but it won't hurt. */
2940     SV_CHECK_THINKFIRST(sv);
2941     if (!ptr) {
2942         (void)SvOK_off(sv);
2943         return;
2944     }
2945     (void)SvUPGRADE(sv, SVt_PV);
2946
2947     SvGROW(sv, len + 1);
2948     dptr = SvPVX(sv);
2949     Move(ptr,dptr,len,char);
2950     dptr[len] = '\0';
2951     SvCUR_set(sv, len);
2952     (void)SvPOK_only(sv);               /* validate pointer */
2953     SvTAINT(sv);
2954 }
2955
2956 /*
2957 =for apidoc sv_setpvn_mg
2958
2959 Like C<sv_setpvn>, but also handles 'set' magic.
2960
2961 =cut
2962 */
2963
2964 void
2965 Perl_sv_setpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
2966 {
2967     sv_setpvn(sv,ptr,len);
2968     SvSETMAGIC(sv);
2969 }
2970
2971 /*
2972 =for apidoc sv_setpv
2973
2974 Copies a string into an SV.  The string must be null-terminated.  Does not
2975 handle 'set' magic.  See C<sv_setpv_mg>.
2976
2977 =cut
2978 */
2979
2980 void
2981 Perl_sv_setpv(pTHX_ register SV *sv, register const char *ptr)
2982 {
2983     register STRLEN len;
2984
2985     SV_CHECK_THINKFIRST(sv);
2986     if (!ptr) {
2987         (void)SvOK_off(sv);
2988         return;
2989     }
2990     len = strlen(ptr);
2991     (void)SvUPGRADE(sv, SVt_PV);
2992
2993     SvGROW(sv, len + 1);
2994     Move(ptr,SvPVX(sv),len+1,char);
2995     SvCUR_set(sv, len);
2996     (void)SvPOK_only(sv);               /* validate pointer */
2997     SvTAINT(sv);
2998 }
2999
3000 /*
3001 =for apidoc sv_setpv_mg
3002
3003 Like C<sv_setpv>, but also handles 'set' magic.
3004
3005 =cut
3006 */
3007
3008 void
3009 Perl_sv_setpv_mg(pTHX_ register SV *sv, register const char *ptr)
3010 {
3011     sv_setpv(sv,ptr);
3012     SvSETMAGIC(sv);
3013 }
3014
3015 /*
3016 =for apidoc sv_usepvn
3017
3018 Tells an SV to use C<ptr> to find its string value.  Normally the string is
3019 stored inside the SV but sv_usepvn allows the SV to use an outside string.
3020 The C<ptr> should point to memory that was allocated by C<malloc>.  The
3021 string length, C<len>, must be supplied.  This function will realloc the
3022 memory pointed to by C<ptr>, so that pointer should not be freed or used by
3023 the programmer after giving it to sv_usepvn.  Does not handle 'set' magic.
3024 See C<sv_usepvn_mg>.
3025
3026 =cut
3027 */
3028
3029 void
3030 Perl_sv_usepvn(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
3031 {
3032     SV_CHECK_THINKFIRST(sv);
3033     (void)SvUPGRADE(sv, SVt_PV);
3034     if (!ptr) {
3035         (void)SvOK_off(sv);
3036         return;
3037     }
3038     (void)SvOOK_off(sv);
3039     if (SvPVX(sv) && SvLEN(sv))
3040         Safefree(SvPVX(sv));
3041     Renew(ptr, len+1, char);
3042     SvPVX(sv) = ptr;
3043     SvCUR_set(sv, len);
3044     SvLEN_set(sv, len+1);
3045     *SvEND(sv) = '\0';
3046     (void)SvPOK_only(sv);               /* validate pointer */
3047     SvTAINT(sv);
3048 }
3049
3050 /*
3051 =for apidoc sv_usepvn_mg
3052
3053 Like C<sv_usepvn>, but also handles 'set' magic.
3054
3055 =cut
3056 */
3057
3058 void
3059 Perl_sv_usepvn_mg(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
3060 {
3061     sv_usepvn(sv,ptr,len);
3062     SvSETMAGIC(sv);
3063 }
3064
3065 void
3066 Perl_sv_force_normal(pTHX_ register SV *sv)
3067 {
3068     if (SvREADONLY(sv)) {
3069         dTHR;
3070         if (SvFAKE(sv)) {
3071             char *pvx = SvPVX(sv);
3072             STRLEN len = SvCUR(sv);
3073             U32 hash   = SvUVX(sv);
3074             SvGROW(sv, len + 1);
3075             Move(pvx,SvPVX(sv),len,char);
3076             *SvEND(sv) = '\0';
3077             SvFAKE_off(sv);
3078             SvREADONLY_off(sv);
3079             unsharepvn(pvx,len,hash);
3080         }
3081         else if (PL_curcop != &PL_compiling)
3082             Perl_croak(aTHX_ PL_no_modify);
3083     }
3084     if (SvROK(sv))
3085         sv_unref(sv);
3086     else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
3087         sv_unglob(sv);
3088 }
3089
3090 /*
3091 =for apidoc sv_chop
3092
3093 Efficient removal of characters from the beginning of the string buffer.
3094 SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
3095 the string buffer.  The C<ptr> becomes the first character of the adjusted
3096 string.
3097
3098 =cut
3099 */
3100
3101 void
3102 Perl_sv_chop(pTHX_ register SV *sv, register char *ptr) /* like set but assuming ptr is in sv */
3103
3104
3105 {
3106     register STRLEN delta;
3107
3108     if (!ptr || !SvPOKp(sv))
3109         return;
3110     SV_CHECK_THINKFIRST(sv);
3111     if (SvTYPE(sv) < SVt_PVIV)
3112         sv_upgrade(sv,SVt_PVIV);
3113
3114     if (!SvOOK(sv)) {
3115         if (!SvLEN(sv)) { /* make copy of shared string */
3116             char *pvx = SvPVX(sv);
3117             STRLEN len = SvCUR(sv);
3118             SvGROW(sv, len + 1);
3119             Move(pvx,SvPVX(sv),len,char);
3120             *SvEND(sv) = '\0';
3121         }
3122         SvIVX(sv) = 0;
3123         SvFLAGS(sv) |= SVf_OOK;
3124     }
3125     SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVp_IOK|SVp_NOK|SVf_IVisUV);
3126     delta = ptr - SvPVX(sv);
3127     SvLEN(sv) -= delta;
3128     SvCUR(sv) -= delta;
3129     SvPVX(sv) += delta;
3130     SvIVX(sv) += delta;
3131 }
3132
3133 /*
3134 =for apidoc sv_catpvn
3135
3136 Concatenates the string onto the end of the string which is in the SV.  The
3137 C<len> indicates number of bytes to copy.  Handles 'get' magic, but not
3138 'set' magic.  See C<sv_catpvn_mg>.
3139
3140 =cut
3141 */
3142
3143 void
3144 Perl_sv_catpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
3145 {
3146     STRLEN tlen;
3147     char *junk;
3148
3149     junk = SvPV_force(sv, tlen);
3150     SvGROW(sv, tlen + len + 1);
3151     if (ptr == junk)
3152         ptr = SvPVX(sv);
3153     Move(ptr,SvPVX(sv)+tlen,len,char);
3154     SvCUR(sv) += len;
3155     *SvEND(sv) = '\0';
3156     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
3157     SvTAINT(sv);
3158 }
3159
3160 /*
3161 =for apidoc sv_catpvn_mg
3162
3163 Like C<sv_catpvn>, but also handles 'set' magic.
3164
3165 =cut
3166 */
3167
3168 void
3169 Perl_sv_catpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
3170 {
3171     sv_catpvn(sv,ptr,len);
3172     SvSETMAGIC(sv);
3173 }
3174
3175 /*
3176 =for apidoc sv_catsv
3177
3178 Concatenates the string from SV C<ssv> onto the end of the string in SV
3179 C<dsv>.  Handles 'get' magic, but not 'set' magic.  See C<sv_catsv_mg>.
3180
3181 =cut
3182 */
3183
3184 void
3185 Perl_sv_catsv(pTHX_ SV *dstr, register SV *sstr)
3186 {
3187     char *s;
3188     STRLEN len;
3189     if (!sstr)
3190         return;
3191     if ((s = SvPV(sstr, len))) {
3192         if (DO_UTF8(sstr)) {
3193             sv_utf8_upgrade(dstr);
3194             sv_catpvn(dstr,s,len);
3195             SvUTF8_on(dstr);
3196         }
3197         else
3198             sv_catpvn(dstr,s,len);
3199     }
3200 }
3201
3202 /*
3203 =for apidoc sv_catsv_mg
3204
3205 Like C<sv_catsv>, but also handles 'set' magic.
3206
3207 =cut
3208 */
3209
3210 void
3211 Perl_sv_catsv_mg(pTHX_ SV *dstr, register SV *sstr)
3212 {
3213     sv_catsv(dstr,sstr);
3214     SvSETMAGIC(dstr);
3215 }
3216
3217 /*
3218 =for apidoc sv_catpv
3219
3220 Concatenates the string onto the end of the string which is in the SV.
3221 Handles 'get' magic, but not 'set' magic.  See C<sv_catpv_mg>.
3222
3223 =cut
3224 */
3225
3226 void
3227 Perl_sv_catpv(pTHX_ register SV *sv, register const char *ptr)
3228 {
3229     register STRLEN len;
3230     STRLEN tlen;
3231     char *junk;
3232
3233     if (!ptr)
3234         return;
3235     junk = SvPV_force(sv, tlen);
3236     len = strlen(ptr);
3237     SvGROW(sv, tlen + len + 1);
3238     if (ptr == junk)
3239         ptr = SvPVX(sv);
3240     Move(ptr,SvPVX(sv)+tlen,len+1,char);
3241     SvCUR(sv) += len;
3242     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
3243     SvTAINT(sv);
3244 }
3245
3246 /*
3247 =for apidoc sv_catpv_mg
3248
3249 Like C<sv_catpv>, but also handles 'set' magic.
3250
3251 =cut
3252 */
3253
3254 void
3255 Perl_sv_catpv_mg(pTHX_ register SV *sv, register const char *ptr)
3256 {
3257     sv_catpv(sv,ptr);
3258     SvSETMAGIC(sv);
3259 }
3260
3261 SV *
3262 Perl_newSV(pTHX_ STRLEN len)
3263 {
3264     register SV *sv;
3265
3266     new_SV(sv);
3267     if (len) {
3268         sv_upgrade(sv, SVt_PV);
3269         SvGROW(sv, len + 1);
3270     }
3271     return sv;
3272 }
3273
3274 /* name is assumed to contain an SV* if (name && namelen == HEf_SVKEY) */
3275
3276 /*
3277 =for apidoc sv_magic
3278
3279 Adds magic to an SV.
3280
3281 =cut
3282 */
3283
3284 void
3285 Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
3286 {
3287     MAGIC* mg;
3288
3289     if (SvREADONLY(sv)) {
3290         dTHR;
3291         if (PL_curcop != &PL_compiling && !strchr("gBf", how))
3292             Perl_croak(aTHX_ PL_no_modify);
3293     }
3294     if (SvMAGICAL(sv) || (how == 't' && SvTYPE(sv) >= SVt_PVMG)) {
3295         if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
3296             if (how == 't')
3297                 mg->mg_len |= 1;
3298             return;
3299         }
3300     }
3301     else {
3302         (void)SvUPGRADE(sv, SVt_PVMG);
3303     }
3304     Newz(702,mg, 1, MAGIC);
3305     mg->mg_moremagic = SvMAGIC(sv);
3306
3307     SvMAGIC(sv) = mg;
3308     if (!obj || obj == sv || how == '#' || how == 'r')
3309         mg->mg_obj = obj;
3310     else {
3311         dTHR;
3312         mg->mg_obj = SvREFCNT_inc(obj);
3313         mg->mg_flags |= MGf_REFCOUNTED;
3314     }
3315     mg->mg_type = how;
3316     mg->mg_len = namlen;
3317     if (name)
3318         if (namlen >= 0)
3319             mg->mg_ptr = savepvn(name, namlen);
3320         else if (namlen == HEf_SVKEY)
3321             mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
3322
3323     switch (how) {
3324     case 0:
3325         mg->mg_virtual = &PL_vtbl_sv;
3326         break;
3327     case 'A':
3328         mg->mg_virtual = &PL_vtbl_amagic;
3329         break;
3330     case 'a':
3331         mg->mg_virtual = &PL_vtbl_amagicelem;
3332         break;
3333     case 'c':
3334         mg->mg_virtual = 0;
3335         break;
3336     case 'B':
3337         mg->mg_virtual = &PL_vtbl_bm;
3338         break;
3339     case 'D':
3340         mg->mg_virtual = &PL_vtbl_regdata;
3341         break;
3342     case 'd':
3343         mg->mg_virtual = &PL_vtbl_regdatum;
3344         break;
3345     case 'E':
3346         mg->mg_virtual = &PL_vtbl_env;
3347         break;
3348     case 'f':
3349         mg->mg_virtual = &PL_vtbl_fm;
3350         break;
3351     case 'e':
3352         mg->mg_virtual = &PL_vtbl_envelem;
3353         break;
3354     case 'g':
3355         mg->mg_virtual = &PL_vtbl_mglob;
3356         break;
3357     case 'I':
3358         mg->mg_virtual = &PL_vtbl_isa;
3359         break;
3360     case 'i':
3361         mg->mg_virtual = &PL_vtbl_isaelem;
3362         break;
3363     case 'k':
3364         mg->mg_virtual = &PL_vtbl_nkeys;
3365         break;
3366     case 'L':
3367         SvRMAGICAL_on(sv);
3368         mg->mg_virtual = 0;
3369         break;
3370     case 'l':
3371         mg->mg_virtual = &PL_vtbl_dbline;
3372         break;
3373 #ifdef USE_THREADS
3374     case 'm':
3375         mg->mg_virtual = &PL_vtbl_mutex;
3376         break;
3377 #endif /* USE_THREADS */
3378 #ifdef USE_LOCALE_COLLATE
3379     case 'o':
3380         mg->mg_virtual = &PL_vtbl_collxfrm;
3381         break;
3382 #endif /* USE_LOCALE_COLLATE */
3383     case 'P':
3384         mg->mg_virtual = &PL_vtbl_pack;
3385         break;
3386     case 'p':
3387     case 'q':
3388         mg->mg_virtual = &PL_vtbl_packelem;
3389         break;
3390     case 'r':
3391         mg->mg_virtual = &PL_vtbl_regexp;
3392         break;
3393     case 'S':
3394         mg->mg_virtual = &PL_vtbl_sig;
3395         break;
3396     case 's':
3397         mg->mg_virtual = &PL_vtbl_sigelem;
3398         break;
3399     case 't':
3400         mg->mg_virtual = &PL_vtbl_taint;
3401         mg->mg_len = 1;
3402         break;
3403     case 'U':
3404         mg->mg_virtual = &PL_vtbl_uvar;
3405         break;
3406     case 'v':
3407         mg->mg_virtual = &PL_vtbl_vec;
3408         break;
3409     case 'x':
3410         mg->mg_virtual = &PL_vtbl_substr;
3411         break;
3412     case 'y':
3413         mg->mg_virtual = &PL_vtbl_defelem;
3414         break;
3415     case '*':
3416         mg->mg_virtual = &PL_vtbl_glob;
3417         break;
3418     case '#':
3419         mg->mg_virtual = &PL_vtbl_arylen;
3420         break;
3421     case '.':
3422         mg->mg_virtual = &PL_vtbl_pos;
3423         break;
3424     case '<':
3425         mg->mg_virtual = &PL_vtbl_backref;
3426         break;
3427     case '~':   /* Reserved for use by extensions not perl internals.   */
3428         /* Useful for attaching extension internal data to perl vars.   */
3429         /* Note that multiple extensions may clash if magical scalars   */
3430         /* etc holding private data from one are passed to another.     */
3431         SvRMAGICAL_on(sv);
3432         break;
3433     default:
3434         Perl_croak(aTHX_ "Don't know how to handle magic of type '%c'", how);
3435     }
3436     mg_magical(sv);
3437     if (SvGMAGICAL(sv))
3438         SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
3439 }
3440
3441 /*
3442 =for apidoc sv_unmagic
3443
3444 Removes magic from an SV.
3445
3446 =cut
3447 */
3448
3449 int
3450 Perl_sv_unmagic(pTHX_ SV *sv, int type)
3451 {
3452     MAGIC* mg;
3453     MAGIC** mgp;
3454     if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
3455         return 0;
3456     mgp = &SvMAGIC(sv);
3457     for (mg = *mgp; mg; mg = *mgp) {
3458         if (mg->mg_type == type) {
3459             MGVTBL* vtbl = mg->mg_virtual;
3460             *mgp = mg->mg_moremagic;
3461             if (vtbl && vtbl->svt_free)
3462                 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
3463             if (mg->mg_ptr && mg->mg_type != 'g')
3464                 if (mg->mg_len >= 0)
3465                     Safefree(mg->mg_ptr);
3466                 else if (mg->mg_len == HEf_SVKEY)
3467                     SvREFCNT_dec((SV*)mg->mg_ptr);
3468             if (mg->mg_flags & MGf_REFCOUNTED)
3469                 SvREFCNT_dec(mg->mg_obj);
3470             Safefree(mg);
3471         }
3472         else
3473             mgp = &mg->mg_moremagic;
3474     }
3475     if (!SvMAGIC(sv)) {
3476         SvMAGICAL_off(sv);
3477         SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
3478     }
3479
3480     return 0;
3481 }
3482
3483 /*
3484 =for apidoc sv_rvweaken
3485
3486 Weaken a reference.
3487
3488 =cut
3489 */
3490
3491 SV *
3492 Perl_sv_rvweaken(pTHX_ SV *sv)
3493 {
3494     SV *tsv;
3495     if (!SvOK(sv))  /* let undefs pass */
3496         return sv;
3497     if (!SvROK(sv))
3498         Perl_croak(aTHX_ "Can't weaken a nonreference");
3499     else if (SvWEAKREF(sv)) {
3500         dTHR;
3501         if (ckWARN(WARN_MISC))
3502             Perl_warner(aTHX_ WARN_MISC, "Reference is already weak");
3503         return sv;
3504     }
3505     tsv = SvRV(sv);
3506     sv_add_backref(tsv, sv);
3507     SvWEAKREF_on(sv);
3508     SvREFCNT_dec(tsv);
3509     return sv;
3510 }
3511
3512 STATIC void
3513 S_sv_add_backref(pTHX_ SV *tsv, SV *sv)
3514 {
3515     AV *av;
3516     MAGIC *mg;
3517     if (SvMAGICAL(tsv) && (mg = mg_find(tsv, '<')))
3518         av = (AV*)mg->mg_obj;
3519     else {
3520         av = newAV();
3521         sv_magic(tsv, (SV*)av, '<', NULL, 0);
3522         SvREFCNT_dec(av);           /* for sv_magic */
3523     }
3524     av_push(av,sv);
3525 }
3526
3527 STATIC void
3528 S_sv_del_backref(pTHX_ SV *sv)
3529 {
3530     AV *av;
3531     SV **svp;
3532     I32 i;
3533     SV *tsv = SvRV(sv);
3534     MAGIC *mg;
3535     if (!SvMAGICAL(tsv) || !(mg = mg_find(tsv, '<')))
3536         Perl_croak(aTHX_ "panic: del_backref");
3537     av = (AV *)mg->mg_obj;
3538     svp = AvARRAY(av);
3539     i = AvFILLp(av);
3540     while (i >= 0) {
3541         if (svp[i] == sv) {
3542             svp[i] = &PL_sv_undef; /* XXX */
3543         }
3544         i--;
3545     }
3546 }
3547
3548 /*
3549 =for apidoc sv_insert
3550
3551 Inserts a string at the specified offset/length within the SV. Similar to
3552 the Perl substr() function.
3553
3554 =cut
3555 */
3556
3557 void
3558 Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
3559 {
3560     register char *big;
3561     register char *mid;
3562     register char *midend;
3563     register char *bigend;
3564     register I32 i;
3565     STRLEN curlen;
3566
3567
3568     if (!bigstr)
3569         Perl_croak(aTHX_ "Can't modify non-existent substring");
3570     SvPV_force(bigstr, curlen);
3571     (void)SvPOK_only_UTF8(bigstr);
3572     if (offset + len > curlen) {
3573         SvGROW(bigstr, offset+len+1);
3574         Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
3575         SvCUR_set(bigstr, offset+len);
3576     }
3577
3578     SvTAINT(bigstr);
3579     i = littlelen - len;
3580     if (i > 0) {                        /* string might grow */
3581         big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
3582         mid = big + offset + len;
3583         midend = bigend = big + SvCUR(bigstr);
3584         bigend += i;
3585         *bigend = '\0';
3586         while (midend > mid)            /* shove everything down */
3587             *--bigend = *--midend;
3588         Move(little,big+offset,littlelen,char);
3589         SvCUR(bigstr) += i;
3590         SvSETMAGIC(bigstr);
3591         return;
3592     }
3593     else if (i == 0) {
3594         Move(little,SvPVX(bigstr)+offset,len,char);
3595         SvSETMAGIC(bigstr);
3596         return;
3597     }
3598
3599     big = SvPVX(bigstr);
3600     mid = big + offset;
3601     midend = mid + len;
3602     bigend = big + SvCUR(bigstr);
3603
3604     if (midend > bigend)
3605         Perl_croak(aTHX_ "panic: sv_insert");
3606
3607     if (mid - big > bigend - midend) {  /* faster to shorten from end */
3608         if (littlelen) {
3609             Move(little, mid, littlelen,char);
3610             mid += littlelen;
3611         }
3612         i = bigend - midend;
3613         if (i > 0) {
3614             Move(midend, mid, i,char);
3615             mid += i;
3616         }
3617         *mid = '\0';
3618         SvCUR_set(bigstr, mid - big);
3619     }
3620     /*SUPPRESS 560*/
3621     else if ((i = mid - big)) { /* faster from front */
3622         midend -= littlelen;
3623         mid = midend;
3624         sv_chop(bigstr,midend-i);
3625         big += i;
3626         while (i--)
3627             *--midend = *--big;
3628         if (littlelen)
3629             Move(little, mid, littlelen,char);
3630     }
3631     else if (littlelen) {
3632         midend -= littlelen;
3633         sv_chop(bigstr,midend);
3634         Move(little,midend,littlelen,char);
3635     }
3636     else {
3637         sv_chop(bigstr,midend);
3638     }
3639     SvSETMAGIC(bigstr);
3640 }
3641
3642 /*
3643 =for apidoc sv_replace
3644
3645 Make the first argument a copy of the second, then delete the original.
3646
3647 =cut
3648 */
3649
3650 void
3651 Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
3652 {
3653     dTHR;
3654     U32 refcnt = SvREFCNT(sv);
3655     SV_CHECK_THINKFIRST(sv);
3656     if (SvREFCNT(nsv) != 1 && ckWARN_d(WARN_INTERNAL))
3657         Perl_warner(aTHX_ WARN_INTERNAL, "Reference miscount in sv_replace()");
3658     if (SvMAGICAL(sv)) {
3659         if (SvMAGICAL(nsv))
3660             mg_free(nsv);
3661         else
3662             sv_upgrade(nsv, SVt_PVMG);
3663         SvMAGIC(nsv) = SvMAGIC(sv);
3664         SvFLAGS(nsv) |= SvMAGICAL(sv);
3665         SvMAGICAL_off(sv);
3666         SvMAGIC(sv) = 0;
3667     }
3668     SvREFCNT(sv) = 0;
3669     sv_clear(sv);
3670     assert(!SvREFCNT(sv));
3671     StructCopy(nsv,sv,SV);
3672     SvREFCNT(sv) = refcnt;
3673     SvFLAGS(nsv) |= SVTYPEMASK;         /* Mark as freed */
3674     del_SV(nsv);
3675 }
3676
3677 /*
3678 =for apidoc sv_clear
3679
3680 Clear an SV, making it empty. Does not free the memory used by the SV
3681 itself.
3682
3683 =cut
3684 */
3685
3686 void
3687 Perl_sv_clear(pTHX_ register SV *sv)
3688 {
3689     HV* stash;
3690     assert(sv);
3691     assert(SvREFCNT(sv) == 0);
3692
3693     if (SvOBJECT(sv)) {
3694         dTHR;
3695         if (PL_defstash) {              /* Still have a symbol table? */
3696             djSP;
3697             GV* destructor;
3698             SV tmpref;
3699
3700             Zero(&tmpref, 1, SV);
3701             sv_upgrade(&tmpref, SVt_RV);
3702             SvROK_on(&tmpref);
3703             SvREADONLY_on(&tmpref);     /* DESTROY() could be naughty */
3704             SvREFCNT(&tmpref) = 1;
3705
3706             do {
3707                 stash = SvSTASH(sv);
3708                 destructor = gv_fetchmethod(SvSTASH(sv), "DESTROY");
3709                 if (destructor) {
3710                     ENTER;
3711                     PUSHSTACKi(PERLSI_DESTROY);
3712                     SvRV(&tmpref) = SvREFCNT_inc(sv);
3713                     EXTEND(SP, 2);
3714                     PUSHMARK(SP);
3715                     PUSHs(&tmpref);
3716                     PUTBACK;
3717                     call_sv((SV*)GvCV(destructor),
3718                             G_DISCARD|G_EVAL|G_KEEPERR);
3719                     SvREFCNT(sv)--;
3720                     POPSTACK;
3721                     SPAGAIN;
3722                     LEAVE;
3723                 }
3724             } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
3725
3726             del_XRV(SvANY(&tmpref));
3727
3728             if (SvREFCNT(sv)) {
3729                 if (PL_in_clean_objs)
3730                     Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
3731                           HvNAME(stash));
3732                 /* DESTROY gave object new lease on life */
3733                 return;
3734             }
3735         }
3736
3737         if (SvOBJECT(sv)) {
3738             SvREFCNT_dec(SvSTASH(sv));  /* possibly of changed persuasion */
3739             SvOBJECT_off(sv);   /* Curse the object. */
3740             if (SvTYPE(sv) != SVt_PVIO)
3741                 --PL_sv_objcount;       /* XXX Might want something more general */
3742         }
3743     }
3744     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
3745         mg_free(sv);
3746     stash = NULL;
3747     switch (SvTYPE(sv)) {
3748     case SVt_PVIO:
3749         if (IoIFP(sv) &&
3750             IoIFP(sv) != PerlIO_stdin() &&
3751             IoIFP(sv) != PerlIO_stdout() &&
3752             IoIFP(sv) != PerlIO_stderr())
3753         {
3754             io_close((IO*)sv, FALSE);
3755         }
3756         if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
3757             PerlDir_close(IoDIRP(sv));
3758         IoDIRP(sv) = (DIR*)NULL;
3759         Safefree(IoTOP_NAME(sv));
3760         Safefree(IoFMT_NAME(sv));
3761         Safefree(IoBOTTOM_NAME(sv));
3762         /* FALL THROUGH */
3763     case SVt_PVBM:
3764         goto freescalar;
3765     case SVt_PVCV:
3766     case SVt_PVFM:
3767         cv_undef((CV*)sv);
3768         goto freescalar;
3769     case SVt_PVHV:
3770         hv_undef((HV*)sv);
3771         break;
3772     case SVt_PVAV:
3773         av_undef((AV*)sv);
3774         break;
3775     case SVt_PVLV:
3776         SvREFCNT_dec(LvTARG(sv));
3777         goto freescalar;
3778     case SVt_PVGV:
3779         gp_free((GV*)sv);
3780         Safefree(GvNAME(sv));
3781         /* cannot decrease stash refcount yet, as we might recursively delete
3782            ourselves when the refcnt drops to zero. Delay SvREFCNT_dec
3783            of stash until current sv is completely gone.
3784            -- JohnPC, 27 Mar 1998 */
3785         stash = GvSTASH(sv);
3786         /* FALL THROUGH */
3787     case SVt_PVMG:
3788     case SVt_PVNV:
3789     case SVt_PVIV:
3790       freescalar:
3791         (void)SvOOK_off(sv);
3792         /* FALL THROUGH */
3793     case SVt_PV:
3794     case SVt_RV:
3795         if (SvROK(sv)) {
3796             if (SvWEAKREF(sv))
3797                 sv_del_backref(sv);
3798             else
3799                 SvREFCNT_dec(SvRV(sv));
3800         }
3801         else if (SvPVX(sv) && SvLEN(sv))
3802             Safefree(SvPVX(sv));
3803         else if (SvPVX(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
3804             unsharepvn(SvPVX(sv),SvCUR(sv),SvUVX(sv));
3805             SvFAKE_off(sv);
3806         }
3807         break;
3808 /*
3809     case SVt_NV:
3810     case SVt_IV:
3811     case SVt_NULL:
3812         break;
3813 */
3814     }
3815
3816     switch (SvTYPE(sv)) {
3817     case SVt_NULL:
3818         break;
3819     case SVt_IV:
3820         del_XIV(SvANY(sv));
3821         break;
3822     case SVt_NV:
3823         del_XNV(SvANY(sv));
3824         break;
3825     case SVt_RV:
3826         del_XRV(SvANY(sv));
3827         break;
3828     case SVt_PV:
3829         del_XPV(SvANY(sv));
3830         break;
3831     case SVt_PVIV:
3832         del_XPVIV(SvANY(sv));
3833         break;
3834     case SVt_PVNV:
3835         del_XPVNV(SvANY(sv));
3836         break;
3837     case SVt_PVMG:
3838         del_XPVMG(SvANY(sv));
3839         break;
3840     case SVt_PVLV:
3841         del_XPVLV(SvANY(sv));
3842         break;
3843     case SVt_PVAV:
3844         del_XPVAV(SvANY(sv));
3845         break;
3846     case SVt_PVHV:
3847         del_XPVHV(SvANY(sv));
3848         break;
3849     case SVt_PVCV:
3850         del_XPVCV(SvANY(sv));
3851         break;
3852     case SVt_PVGV:
3853         del_XPVGV(SvANY(sv));
3854         /* code duplication for increased performance. */
3855         SvFLAGS(sv) &= SVf_BREAK;
3856         SvFLAGS(sv) |= SVTYPEMASK;
3857         /* decrease refcount of the stash that owns this GV, if any */
3858         if (stash)
3859             SvREFCNT_dec(stash);
3860         return; /* not break, SvFLAGS reset already happened */
3861     case SVt_PVBM:
3862         del_XPVBM(SvANY(sv));
3863         break;
3864     case SVt_PVFM:
3865         del_XPVFM(SvANY(sv));
3866         break;
3867     case SVt_PVIO:
3868         del_XPVIO(SvANY(sv));
3869         break;
3870     }
3871     SvFLAGS(sv) &= SVf_BREAK;
3872     SvFLAGS(sv) |= SVTYPEMASK;
3873 }
3874
3875 SV *
3876 Perl_sv_newref(pTHX_ SV *sv)
3877 {
3878     if (sv)
3879         ATOMIC_INC(SvREFCNT(sv));
3880     return sv;
3881 }
3882
3883 /*
3884 =for apidoc sv_free
3885
3886 Free the memory used by an SV.
3887
3888 =cut
3889 */
3890
3891 void
3892 Perl_sv_free(pTHX_ SV *sv)
3893 {
3894     dTHR;
3895     int refcount_is_zero;
3896
3897     if (!sv)
3898         return;
3899     if (SvREFCNT(sv) == 0) {
3900         if (SvFLAGS(sv) & SVf_BREAK)
3901             return;
3902         if (PL_in_clean_all) /* All is fair */
3903             return;
3904         if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
3905             /* make sure SvREFCNT(sv)==0 happens very seldom */
3906             SvREFCNT(sv) = (~(U32)0)/2;
3907             return;
3908         }
3909         if (ckWARN_d(WARN_INTERNAL))
3910             Perl_warner(aTHX_ WARN_INTERNAL, "Attempt to free unreferenced scalar");
3911         return;
3912     }
3913     ATOMIC_DEC_AND_TEST(refcount_is_zero, SvREFCNT(sv));
3914     if (!refcount_is_zero)
3915         return;
3916 #ifdef DEBUGGING
3917     if (SvTEMP(sv)) {
3918         if (ckWARN_d(WARN_DEBUGGING))
3919             Perl_warner(aTHX_ WARN_DEBUGGING,
3920                         "Attempt to free temp prematurely: SV 0x%"UVxf,
3921                         PTR2UV(sv));
3922         return;
3923     }
3924 #endif
3925     if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
3926         /* make sure SvREFCNT(sv)==0 happens very seldom */
3927         SvREFCNT(sv) = (~(U32)0)/2;
3928         return;
3929     }
3930     sv_clear(sv);
3931     if (! SvREFCNT(sv))
3932         del_SV(sv);
3933 }
3934
3935 /*
3936 =for apidoc sv_len
3937
3938 Returns the length of the string in the SV.  See also C<SvCUR>.
3939
3940 =cut
3941 */
3942
3943 STRLEN
3944 Perl_sv_len(pTHX_ register SV *sv)
3945 {
3946     char *junk;
3947     STRLEN len;
3948
3949     if (!sv)
3950         return 0;
3951
3952     if (SvGMAGICAL(sv))
3953         len = mg_length(sv);
3954     else
3955         junk = SvPV(sv, len);
3956     return len;
3957 }
3958
3959 /*
3960 =for apidoc sv_len_utf8
3961
3962 Returns the number of characters in the string in an SV, counting wide
3963 UTF8 bytes as a single character.
3964
3965 =cut
3966 */
3967
3968 STRLEN
3969 Perl_sv_len_utf8(pTHX_ register SV *sv)
3970 {
3971     U8 *s;
3972     U8 *send;
3973     STRLEN len;
3974
3975     if (!sv)
3976         return 0;
3977
3978 #ifdef NOTYET
3979     if (SvGMAGICAL(sv))
3980         len = mg_length(sv);
3981     else
3982 #endif
3983         s = (U8*)SvPV(sv, len);
3984     send = s + len;
3985     len = 0;
3986     while (s < send) {
3987         s += UTF8SKIP(s);
3988         len++;
3989     }
3990     return len;
3991 }
3992
3993 void
3994 Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
3995 {
3996     U8 *start;
3997     U8 *s;
3998     U8 *send;
3999     I32 uoffset = *offsetp;
4000     STRLEN len;
4001
4002     if (!sv)
4003         return;
4004
4005     start = s = (U8*)SvPV(sv, len);
4006     send = s + len;
4007     while (s < send && uoffset--)
4008         s += UTF8SKIP(s);
4009     if (s >= send)
4010         s = send;
4011     *offsetp = s - start;
4012     if (lenp) {
4013         I32 ulen = *lenp;
4014         start = s;
4015         while (s < send && ulen--)
4016             s += UTF8SKIP(s);
4017         if (s >= send)
4018             s = send;
4019         *lenp = s - start;
4020     }
4021     return;
4022 }
4023
4024 void
4025 Perl_sv_pos_b2u(pTHX_ register SV *sv, I32* offsetp)
4026 {
4027     U8 *s;
4028     U8 *send;
4029     STRLEN len;
4030
4031     if (!sv)
4032         return;
4033
4034     s = (U8*)SvPV(sv, len);
4035     if (len < *offsetp)
4036         Perl_croak(aTHX_ "panic: bad byte offset");
4037     send = s + *offsetp;
4038     len = 0;
4039     while (s < send) {
4040         s += UTF8SKIP(s);
4041         ++len;
4042     }
4043     if (s != send) {
4044         dTHR;
4045         if (ckWARN_d(WARN_UTF8))
4046             Perl_warner(aTHX_ WARN_UTF8, "Malformed UTF-8 character");
4047         --len;
4048     }
4049     *offsetp = len;
4050     return;
4051 }
4052
4053 /*
4054 =for apidoc sv_eq
4055
4056 Returns a boolean indicating whether the strings in the two SVs are
4057 identical.
4058
4059 =cut
4060 */
4061
4062 I32
4063 Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
4064 {
4065     char *pv1;
4066     STRLEN cur1;
4067     char *pv2;
4068     STRLEN cur2;
4069     I32  eq     = 0;
4070     bool pv1tmp = FALSE;
4071     bool pv2tmp = FALSE;
4072
4073     if (!sv1) {
4074         pv1 = "";
4075         cur1 = 0;
4076     }
4077     else
4078         pv1 = SvPV(sv1, cur1);
4079
4080     if (!sv2){
4081         pv2 = "";
4082         cur2 = 0;
4083     }
4084     else
4085         pv2 = SvPV(sv2, cur2);
4086
4087     /* do not utf8ize the comparands as a side-effect */
4088     if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTE && 0) {
4089         if (SvUTF8(sv1)) {
4090             pv2 = (char*)bytes_to_utf8((U8*)pv2, &cur2);
4091             pv2tmp = TRUE;
4092         }
4093         else {
4094             pv1 = (char*)bytes_to_utf8((U8*)pv1, &cur1);
4095             pv1tmp = TRUE;
4096         }
4097     }
4098
4099     if (cur1 == cur2)
4100         eq = memEQ(pv1, pv2, cur1);
4101         
4102     if (pv1tmp)
4103         Safefree(pv1);
4104     if (pv2tmp)
4105         Safefree(pv2);
4106
4107     return eq;
4108 }
4109
4110 /*
4111 =for apidoc sv_cmp
4112
4113 Compares the strings in two SVs.  Returns -1, 0, or 1 indicating whether the
4114 string in C<sv1> is less than, equal to, or greater than the string in
4115 C<sv2>.
4116
4117 =cut
4118 */
4119
4120 I32
4121 Perl_sv_cmp(pTHX_ register SV *sv1, register SV *sv2)
4122 {
4123     STRLEN cur1, cur2;
4124     char *pv1, *pv2;
4125     I32  cmp;
4126     bool pv1tmp = FALSE;
4127     bool pv2tmp = FALSE;
4128
4129     if (!sv1) {
4130         pv1 = "";
4131         cur1 = 0;
4132     }
4133     else
4134         pv1 = SvPV(sv1, cur1);
4135
4136     if (!sv2){
4137         pv2 = "";
4138         cur2 = 0;
4139     }
4140     else
4141         pv2 = SvPV(sv2, cur2);
4142
4143     /* do not utf8ize the comparands as a side-effect */
4144     if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTE) {
4145         if (SvUTF8(sv1)) {
4146             pv2 = (char*)bytes_to_utf8((U8*)pv2, &cur2);
4147             pv2tmp = TRUE;
4148         }
4149         else {
4150             pv1 = (char*)bytes_to_utf8((U8*)pv1, &cur1);
4151             pv1tmp = TRUE;
4152         }
4153     }
4154
4155     if (!cur1) {
4156         cmp = cur2 ? -1 : 0;
4157     } else if (!cur2) {
4158         cmp = 1;
4159     } else {
4160         I32 retval = memcmp((void*)pv1, (void*)pv2, cur1 < cur2 ? cur1 : cur2);
4161
4162         if (retval) {
4163             cmp = retval < 0 ? -1 : 1;
4164         } else if (cur1 == cur2) {
4165             cmp = 0;
4166         } else {
4167             cmp = cur1 < cur2 ? -1 : 1;
4168         }
4169     }
4170
4171     if (pv1tmp)
4172         Safefree(pv1);
4173     if (pv2tmp)
4174         Safefree(pv2);
4175
4176     return cmp;
4177 }
4178
4179 /*
4180 =for apidoc sv_cmp_locale
4181
4182 Compares the strings in two SVs in a locale-aware manner. See
4183 L</sv_cmp_locale>
4184
4185 =cut
4186 */
4187
4188 I32
4189 Perl_sv_cmp_locale(pTHX_ register SV *sv1, register SV *sv2)
4190 {
4191 #ifdef USE_LOCALE_COLLATE
4192
4193     char *pv1, *pv2;
4194     STRLEN len1, len2;
4195     I32 retval;
4196
4197     if (PL_collation_standard)
4198         goto raw_compare;
4199
4200     len1 = 0;
4201     pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
4202     len2 = 0;
4203     pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
4204
4205     if (!pv1 || !len1) {
4206         if (pv2 && len2)
4207             return -1;
4208         else
4209             goto raw_compare;
4210     }
4211     else {
4212         if (!pv2 || !len2)
4213             return 1;
4214     }
4215
4216     retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
4217
4218     if (retval)
4219         return retval < 0 ? -1 : 1;
4220
4221     /*
4222      * When the result of collation is equality, that doesn't mean
4223      * that there are no differences -- some locales exclude some
4224      * characters from consideration.  So to avoid false equalities,
4225      * we use the raw string as a tiebreaker.
4226      */
4227
4228   raw_compare:
4229     /* FALL THROUGH */
4230
4231 #endif /* USE_LOCALE_COLLATE */
4232
4233     return sv_cmp(sv1, sv2);
4234 }
4235
4236 #ifdef USE_LOCALE_COLLATE
4237 /*
4238  * Any scalar variable may carry an 'o' magic that contains the
4239  * scalar data of the variable transformed to such a format that
4240  * a normal memory comparison can be used to compare the data
4241  * according to the locale settings.
4242  */
4243 char *
4244 Perl_sv_collxfrm(pTHX_ SV *sv, STRLEN *nxp)
4245 {
4246     MAGIC *mg;
4247
4248     mg = SvMAGICAL(sv) ? mg_find(sv, 'o') : (MAGIC *) NULL;
4249     if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
4250         char *s, *xf;
4251         STRLEN len, xlen;
4252
4253         if (mg)
4254             Safefree(mg->mg_ptr);
4255         s = SvPV(sv, len);
4256         if ((xf = mem_collxfrm(s, len, &xlen))) {
4257             if (SvREADONLY(sv)) {
4258                 SAVEFREEPV(xf);
4259                 *nxp = xlen;
4260                 return xf + sizeof(PL_collation_ix);
4261             }
4262             if (! mg) {
4263                 sv_magic(sv, 0, 'o', 0, 0);
4264                 mg = mg_find(sv, 'o');
4265                 assert(mg);
4266             }
4267             mg->mg_ptr = xf;
4268             mg->mg_len = xlen;
4269         }
4270         else {
4271             if (mg) {
4272                 mg->mg_ptr = NULL;
4273                 mg->mg_len = -1;
4274             }
4275         }
4276     }
4277     if (mg && mg->mg_ptr) {
4278         *nxp = mg->mg_len;
4279         return mg->mg_ptr + sizeof(PL_collation_ix);
4280     }
4281     else {
4282         *nxp = 0;
4283         return NULL;
4284     }
4285 }
4286
4287 #endif /* USE_LOCALE_COLLATE */
4288
4289 /*
4290 =for apidoc sv_gets
4291
4292 Get a line from the filehandle and store it into the SV, optionally
4293 appending to the currently-stored string.
4294
4295 =cut
4296 */
4297
4298 char *
4299 Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
4300 {
4301     dTHR;
4302     char *rsptr;
4303     STRLEN rslen;
4304     register STDCHAR rslast;
4305     register STDCHAR *bp;
4306     register I32 cnt;
4307     I32 i;
4308
4309     SV_CHECK_THINKFIRST(sv);
4310     (void)SvUPGRADE(sv, SVt_PV);
4311
4312     SvSCREAM_off(sv);
4313
4314     if (RsSNARF(PL_rs)) {
4315         rsptr = NULL;
4316         rslen = 0;
4317     }
4318     else if (RsRECORD(PL_rs)) {
4319       I32 recsize, bytesread;
4320       char *buffer;
4321
4322       /* Grab the size of the record we're getting */
4323       recsize = SvIV(SvRV(PL_rs));
4324       (void)SvPOK_only(sv);    /* Validate pointer */
4325       buffer = SvGROW(sv, recsize + 1);
4326       /* Go yank in */
4327 #ifdef VMS
4328       /* VMS wants read instead of fread, because fread doesn't respect */
4329       /* RMS record boundaries. This is not necessarily a good thing to be */
4330       /* doing, but we've got no other real choice */
4331       bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
4332 #else
4333       bytesread = PerlIO_read(fp, buffer, recsize);
4334 #endif
4335       SvCUR_set(sv, bytesread);
4336       buffer[bytesread] = '\0';
4337       return(SvCUR(sv) ? SvPVX(sv) : Nullch);
4338     }
4339     else if (RsPARA(PL_rs)) {
4340         rsptr = "\n\n";
4341         rslen = 2;
4342     }
4343     else
4344         rsptr = SvPV(PL_rs, rslen);
4345     rslast = rslen ? rsptr[rslen - 1] : '\0';
4346
4347     if (RsPARA(PL_rs)) {                /* have to do this both before and after */
4348         do {                    /* to make sure file boundaries work right */
4349             if (PerlIO_eof(fp))
4350                 return 0;
4351             i = PerlIO_getc(fp);
4352             if (i != '\n') {
4353                 if (i == -1)
4354                     return 0;
4355                 PerlIO_ungetc(fp,i);
4356                 break;
4357             }
4358         } while (i != EOF);
4359     }
4360
4361     /* See if we know enough about I/O mechanism to cheat it ! */
4362
4363     /* This used to be #ifdef test - it is made run-time test for ease
4364        of abstracting out stdio interface. One call should be cheap
4365        enough here - and may even be a macro allowing compile
4366        time optimization.
4367      */
4368
4369     if (PerlIO_fast_gets(fp)) {
4370
4371     /*
4372      * We're going to steal some values from the stdio struct
4373      * and put EVERYTHING in the innermost loop into registers.
4374      */
4375     register STDCHAR *ptr;
4376     STRLEN bpx;
4377     I32 shortbuffered;
4378
4379 #if defined(VMS) && defined(PERLIO_IS_STDIO)
4380     /* An ungetc()d char is handled separately from the regular
4381      * buffer, so we getc() it back out and stuff it in the buffer.
4382      */
4383     i = PerlIO_getc(fp);
4384     if (i == EOF) return 0;
4385     *(--((*fp)->_ptr)) = (unsigned char) i;
4386     (*fp)->_cnt++;
4387 #endif
4388
4389     /* Here is some breathtakingly efficient cheating */
4390
4391     cnt = PerlIO_get_cnt(fp);                   /* get count into register */
4392     (void)SvPOK_only(sv);               /* validate pointer */
4393     if (SvLEN(sv) - append <= cnt + 1) { /* make sure we have the room */
4394         if (cnt > 80 && SvLEN(sv) > append) {
4395             shortbuffered = cnt - SvLEN(sv) + append + 1;
4396             cnt -= shortbuffered;
4397         }
4398         else {
4399             shortbuffered = 0;
4400             /* remember that cnt can be negative */
4401             SvGROW(sv, append + (cnt <= 0 ? 2 : (cnt + 1)));
4402         }
4403     }
4404     else
4405         shortbuffered = 0;
4406     bp = (STDCHAR*)SvPVX(sv) + append;  /* move these two too to registers */
4407     ptr = (STDCHAR*)PerlIO_get_ptr(fp);
4408     DEBUG_P(PerlIO_printf(Perl_debug_log,
4409         "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
4410     DEBUG_P(PerlIO_printf(Perl_debug_log,
4411         "Screamer: entering: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
4412                PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
4413                PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
4414     for (;;) {
4415       screamer:
4416         if (cnt > 0) {
4417             if (rslen) {
4418                 while (cnt > 0) {                    /* this     |  eat */
4419                     cnt--;
4420                     if ((*bp++ = *ptr++) == rslast)  /* really   |  dust */
4421                         goto thats_all_folks;        /* screams  |  sed :-) */
4422                 }
4423             }
4424             else {
4425                 Copy(ptr, bp, cnt, char);            /* this     |  eat */
4426                 bp += cnt;                           /* screams  |  dust */
4427                 ptr += cnt;                          /* louder   |  sed :-) */
4428                 cnt = 0;
4429             }
4430         }
4431         
4432         if (shortbuffered) {            /* oh well, must extend */
4433             cnt = shortbuffered;
4434             shortbuffered = 0;
4435             bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
4436             SvCUR_set(sv, bpx);
4437             SvGROW(sv, SvLEN(sv) + append + cnt + 2);
4438             bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
4439             continue;
4440         }
4441
4442         DEBUG_P(PerlIO_printf(Perl_debug_log,
4443                               "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
4444                               PTR2UV(ptr),(long)cnt));
4445         PerlIO_set_ptrcnt(fp, ptr, cnt); /* deregisterize cnt and ptr */
4446         DEBUG_P(PerlIO_printf(Perl_debug_log,
4447             "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
4448             PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
4449             PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
4450         /* This used to call 'filbuf' in stdio form, but as that behaves like
4451            getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
4452            another abstraction.  */
4453         i   = PerlIO_getc(fp);          /* get more characters */
4454         DEBUG_P(PerlIO_printf(Perl_debug_log,
4455             "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
4456             PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
4457             PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
4458         cnt = PerlIO_get_cnt(fp);
4459         ptr = (STDCHAR*)PerlIO_get_ptr(fp);     /* reregisterize cnt and ptr */
4460         DEBUG_P(PerlIO_printf(Perl_debug_log,
4461             "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
4462
4463         if (i == EOF)                   /* all done for ever? */
4464             goto thats_really_all_folks;
4465
4466         bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
4467         SvCUR_set(sv, bpx);
4468         SvGROW(sv, bpx + cnt + 2);
4469         bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
4470
4471         *bp++ = i;                      /* store character from PerlIO_getc */
4472
4473         if (rslen && (STDCHAR)i == rslast)  /* all done for now? */
4474             goto thats_all_folks;
4475     }
4476
4477 thats_all_folks:
4478     if ((rslen > 1 && (bp - (STDCHAR*)SvPVX(sv) < rslen)) ||
4479           memNE((char*)bp - rslen, rsptr, rslen))
4480         goto screamer;                          /* go back to the fray */
4481 thats_really_all_folks:
4482     if (shortbuffered)
4483         cnt += shortbuffered;
4484         DEBUG_P(PerlIO_printf(Perl_debug_log,
4485             "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
4486     PerlIO_set_ptrcnt(fp, ptr, cnt);    /* put these back or we're in trouble */
4487     DEBUG_P(PerlIO_printf(Perl_debug_log,
4488         "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
4489         PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
4490         PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
4491     *bp = '\0';
4492     SvCUR_set(sv, bp - (STDCHAR*)SvPVX(sv));    /* set length */
4493     DEBUG_P(PerlIO_printf(Perl_debug_log,
4494         "Screamer: done, len=%ld, string=|%.*s|\n",
4495         (long)SvCUR(sv),(int)SvCUR(sv),SvPVX(sv)));
4496     }
4497    else
4498     {
4499 #ifndef EPOC
4500        /*The big, slow, and stupid way */
4501         STDCHAR buf[8192];
4502 #else
4503         /* Need to work around EPOC SDK features          */
4504         /* On WINS: MS VC5 generates calls to _chkstk,    */
4505         /* if a `large' stack frame is allocated          */
4506         /* gcc on MARM does not generate calls like these */
4507         STDCHAR buf[1024];
4508 #endif
4509
4510 screamer2:
4511         if (rslen) {
4512             register STDCHAR *bpe = buf + sizeof(buf);
4513             bp = buf;
4514             while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = i) != rslast && bp < bpe)
4515                 ; /* keep reading */
4516             cnt = bp - buf;
4517         }
4518         else {
4519             cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
4520             /* Accomodate broken VAXC compiler, which applies U8 cast to
4521              * both args of ?: operator, causing EOF to change into 255
4522              */
4523             if (cnt) { i = (U8)buf[cnt - 1]; } else { i = EOF; }
4524         }
4525
4526         if (append)
4527             sv_catpvn(sv, (char *) buf, cnt);
4528         else
4529             sv_setpvn(sv, (char *) buf, cnt);
4530
4531         if (i != EOF &&                 /* joy */
4532             (!rslen ||
4533              SvCUR(sv) < rslen ||
4534              memNE(SvPVX(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
4535         {
4536             append = -1;
4537             /*
4538              * If we're reading from a TTY and we get a short read,
4539              * indicating that the user hit his EOF character, we need
4540              * to notice it now, because if we try to read from the TTY
4541              * again, the EOF condition will disappear.
4542              *
4543              * The comparison of cnt to sizeof(buf) is an optimization
4544              * that prevents unnecessary calls to feof().
4545              *
4546              * - jik 9/25/96
4547              */
4548             if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
4549                 goto screamer2;
4550         }
4551     }
4552
4553     if (RsPARA(PL_rs)) {                /* have to do this both before and after */
4554         while (i != EOF) {      /* to make sure file boundaries work right */
4555             i = PerlIO_getc(fp);
4556             if (i != '\n') {
4557                 PerlIO_ungetc(fp,i);
4558                 break;
4559             }
4560         }
4561     }
4562
4563     return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
4564 }
4565
4566
4567 /*
4568 =for apidoc sv_inc
4569
4570 Auto-increment of the value in the SV.
4571
4572 =cut
4573 */
4574
4575 void
4576 Perl_sv_inc(pTHX_ register SV *sv)
4577 {
4578     register char *d;
4579     int flags;
4580
4581     if (!sv)
4582         return;
4583     if (SvGMAGICAL(sv))
4584         mg_get(sv);
4585     if (SvTHINKFIRST(sv)) {
4586         if (SvREADONLY(sv)) {
4587             dTHR;
4588             if (PL_curcop != &PL_compiling)
4589                 Perl_croak(aTHX_ PL_no_modify);
4590         }
4591         if (SvROK(sv)) {
4592             IV i;
4593             if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
4594                 return;
4595             i = PTR2IV(SvRV(sv));
4596             sv_unref(sv);
4597             sv_setiv(sv, i);
4598         }
4599     }
4600     flags = SvFLAGS(sv);
4601     if (flags & SVp_NOK) {
4602         (void)SvNOK_only(sv);
4603         SvNVX(sv) += 1.0;
4604         return;
4605     }
4606     if (flags & SVp_IOK) {
4607         if (SvIsUV(sv)) {
4608             if (SvUVX(sv) == UV_MAX)
4609                 sv_setnv(sv, (NV)UV_MAX + 1.0);
4610             else
4611                 (void)SvIOK_only_UV(sv);
4612                 ++SvUVX(sv);
4613         } else {
4614             if (SvIVX(sv) == IV_MAX)
4615                 sv_setnv(sv, (NV)IV_MAX + 1.0);
4616             else {
4617                 (void)SvIOK_only(sv);
4618                 ++SvIVX(sv);
4619             }   
4620         }
4621         return;
4622     }
4623     if (!(flags & SVp_POK) || !*SvPVX(sv)) {
4624         if ((flags & SVTYPEMASK) < SVt_PVNV)
4625             sv_upgrade(sv, SVt_NV);
4626         SvNVX(sv) = 1.0;
4627         (void)SvNOK_only(sv);
4628         return;
4629     }
4630     d = SvPVX(sv);
4631     while (isALPHA(*d)) d++;
4632     while (isDIGIT(*d)) d++;
4633     if (*d) {
4634         sv_setnv(sv,Atof(SvPVX(sv)) + 1.0);  /* punt */
4635         return;
4636     }
4637     d--;
4638     while (d >= SvPVX(sv)) {
4639         if (isDIGIT(*d)) {
4640             if (++*d <= '9')
4641                 return;
4642             *(d--) = '0';
4643         }
4644         else {
4645 #ifdef EBCDIC
4646             /* MKS: The original code here died if letters weren't consecutive.
4647              * at least it didn't have to worry about non-C locales.  The
4648              * new code assumes that ('z'-'a')==('Z'-'A'), letters are
4649              * arranged in order (although not consecutively) and that only
4650              * [A-Za-z] are accepted by isALPHA in the C locale.
4651              */
4652             if (*d != 'z' && *d != 'Z') {
4653                 do { ++*d; } while (!isALPHA(*d));
4654                 return;
4655             }
4656             *(d--) -= 'z' - 'a';
4657 #else
4658             ++*d;
4659             if (isALPHA(*d))
4660                 return;
4661             *(d--) -= 'z' - 'a' + 1;
4662 #endif
4663         }
4664     }
4665     /* oh,oh, the number grew */
4666     SvGROW(sv, SvCUR(sv) + 2);
4667     SvCUR(sv)++;
4668     for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
4669         *d = d[-1];
4670     if (isDIGIT(d[1]))
4671         *d = '1';
4672     else
4673         *d = d[1];
4674 }
4675
4676 /*
4677 =for apidoc sv_dec
4678
4679 Auto-decrement of the value in the SV.
4680
4681 =cut
4682 */
4683
4684 void
4685 Perl_sv_dec(pTHX_ register SV *sv)
4686 {
4687     int flags;
4688
4689     if (!sv)
4690         return;
4691     if (SvGMAGICAL(sv))
4692         mg_get(sv);
4693     if (SvTHINKFIRST(sv)) {
4694         if (SvREADONLY(sv)) {
4695             dTHR;
4696             if (PL_curcop != &PL_compiling)
4697                 Perl_croak(aTHX_ PL_no_modify);
4698         }
4699         if (SvROK(sv)) {
4700             IV i;
4701             if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
4702                 return;
4703             i = PTR2IV(SvRV(sv));
4704             sv_unref(sv);
4705             sv_setiv(sv, i);
4706         }
4707     }
4708     flags = SvFLAGS(sv);
4709     if (flags & SVp_NOK) {
4710         SvNVX(sv) -= 1.0;
4711         (void)SvNOK_only(sv);
4712         return;
4713     }
4714     if (flags & SVp_IOK) {
4715         if (SvIsUV(sv)) {
4716             if (SvUVX(sv) == 0) {
4717                 (void)SvIOK_only(sv);
4718                 SvIVX(sv) = -1;
4719             }
4720             else {
4721                 (void)SvIOK_only_UV(sv);
4722                 --SvUVX(sv);
4723             }   
4724         } else {
4725             if (SvIVX(sv) == IV_MIN)
4726                 sv_setnv(sv, (NV)IV_MIN - 1.0);
4727             else {
4728                 (void)SvIOK_only(sv);
4729                 --SvIVX(sv);
4730             }   
4731         }
4732         return;
4733     }
4734     if (!(flags & SVp_POK)) {
4735         if ((flags & SVTYPEMASK) < SVt_PVNV)
4736             sv_upgrade(sv, SVt_NV);
4737         SvNVX(sv) = -1.0;
4738         (void)SvNOK_only(sv);
4739         return;
4740     }
4741     sv_setnv(sv,Atof(SvPVX(sv)) - 1.0); /* punt */
4742 }
4743
4744 /*
4745 =for apidoc sv_mortalcopy
4746
4747 Creates a new SV which is a copy of the original SV.  The new SV is marked
4748 as mortal.
4749
4750 =cut
4751 */
4752
4753 /* Make a string that will exist for the duration of the expression
4754  * evaluation.  Actually, it may have to last longer than that, but
4755  * hopefully we won't free it until it has been assigned to a
4756  * permanent location. */
4757
4758 SV *
4759 Perl_sv_mortalcopy(pTHX_ SV *oldstr)
4760 {
4761     dTHR;
4762     register SV *sv;
4763
4764     new_SV(sv);
4765     sv_setsv(sv,oldstr);
4766     EXTEND_MORTAL(1);
4767     PL_tmps_stack[++PL_tmps_ix] = sv;
4768     SvTEMP_on(sv);
4769     return sv;
4770 }
4771
4772 /*
4773 =for apidoc sv_newmortal
4774
4775 Creates a new SV which is mortal.  The reference count of the SV is set to 1.
4776
4777 =cut
4778 */
4779
4780 SV *
4781 Perl_sv_newmortal(pTHX)
4782 {
4783     dTHR;
4784     register SV *sv;
4785
4786     new_SV(sv);
4787     SvFLAGS(sv) = SVs_TEMP;
4788     EXTEND_MORTAL(1);
4789     PL_tmps_stack[++PL_tmps_ix] = sv;
4790     return sv;
4791 }
4792
4793 /*
4794 =for apidoc sv_2mortal
4795
4796 Marks an SV as mortal.  The SV will be destroyed when the current context
4797 ends.
4798
4799 =cut
4800 */
4801
4802 /* same thing without the copying */
4803
4804 SV *
4805 Perl_sv_2mortal(pTHX_ register SV *sv)
4806 {
4807     dTHR;
4808     if (!sv)
4809         return sv;
4810     if (SvREADONLY(sv) && SvIMMORTAL(sv))
4811         return sv;
4812     EXTEND_MORTAL(1);
4813     PL_tmps_stack[++PL_tmps_ix] = sv;
4814     SvTEMP_on(sv);
4815     return sv;
4816 }
4817
4818 /*
4819 =for apidoc newSVpv
4820
4821 Creates a new SV and copies a string into it.  The reference count for the
4822 SV is set to 1.  If C<len> is zero, Perl will compute the length using
4823 strlen().  For efficiency, consider using C<newSVpvn> instead.
4824
4825 =cut
4826 */
4827
4828 SV *
4829 Perl_newSVpv(pTHX_ const char *s, STRLEN len)
4830 {
4831     register SV *sv;
4832
4833     new_SV(sv);
4834     if (!len)
4835         len = strlen(s);
4836     sv_setpvn(sv,s,len);
4837     return sv;
4838 }
4839
4840 /*
4841 =for apidoc newSVpvn
4842
4843 Creates a new SV and copies a string into it.  The reference count for the
4844 SV is set to 1.  Note that if C<len> is zero, Perl will create a zero length
4845 string.  You are responsible for ensuring that the source string is at least
4846 C<len> bytes long.
4847
4848 =cut
4849 */
4850
4851 SV *
4852 Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
4853 {
4854     register SV *sv;
4855
4856     new_SV(sv);
4857     sv_setpvn(sv,s,len);
4858     return sv;
4859 }
4860
4861 /*
4862 =for apidoc newSVpvn_share
4863
4864 Creates a new SV and populates it with a string from
4865 the string table. Turns on READONLY and FAKE.
4866 The idea here is that as string table is used for shared hash
4867 keys these strings will have SvPVX == HeKEY and hash lookup
4868 will avoid string compare.
4869
4870 =cut
4871 */
4872
4873 SV *
4874 Perl_newSVpvn_share(pTHX_ const char *src, STRLEN len, U32 hash)
4875 {
4876     register SV *sv;
4877     if (!hash)
4878         PERL_HASH(hash, src, len);
4879     new_SV(sv);
4880     sv_upgrade(sv, SVt_PVIV);
4881     SvPVX(sv) = sharepvn(src, len, hash);
4882     SvCUR(sv) = len;
4883     SvUVX(sv) = hash;
4884     SvLEN(sv) = 0;
4885     SvREADONLY_on(sv);
4886     SvFAKE_on(sv);
4887     SvPOK_on(sv);
4888     return sv;
4889 }
4890
4891 #if defined(PERL_IMPLICIT_CONTEXT)
4892 SV *
4893 Perl_newSVpvf_nocontext(const char* pat, ...)
4894 {
4895     dTHX;
4896     register SV *sv;
4897     va_list args;
4898     va_start(args, pat);
4899     sv = vnewSVpvf(pat, &args);
4900     va_end(args);
4901     return sv;
4902 }
4903 #endif
4904
4905 /*
4906 =for apidoc newSVpvf
4907
4908 Creates a new SV an initialize it with the string formatted like
4909 C<sprintf>.
4910
4911 =cut
4912 */
4913
4914 SV *
4915 Perl_newSVpvf(pTHX_ const char* pat, ...)
4916 {
4917     register SV *sv;
4918     va_list args;
4919     va_start(args, pat);
4920     sv = vnewSVpvf(pat, &args);
4921     va_end(args);
4922     return sv;
4923 }
4924
4925 SV *
4926 Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
4927 {
4928     register SV *sv;
4929     new_SV(sv);
4930     sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
4931     return sv;
4932 }
4933
4934 /*
4935 =for apidoc newSVnv
4936
4937 Creates a new SV and copies a floating point value into it.
4938 The reference count for the SV is set to 1.
4939
4940 =cut
4941 */
4942
4943 SV *
4944 Perl_newSVnv(pTHX_ NV n)
4945 {
4946     register SV *sv;
4947
4948     new_SV(sv);
4949     sv_setnv(sv,n);
4950     return sv;
4951 }
4952
4953 /*
4954 =for apidoc newSViv
4955
4956 Creates a new SV and copies an integer into it.  The reference count for the
4957 SV is set to 1.
4958
4959 =cut
4960 */
4961
4962 SV *
4963 Perl_newSViv(pTHX_ IV i)
4964 {
4965     register SV *sv;
4966
4967     new_SV(sv);
4968     sv_setiv(sv,i);
4969     return sv;
4970 }
4971
4972 /*
4973 =for apidoc newSVuv
4974
4975 Creates a new SV and copies an unsigned integer into it.
4976 The reference count for the SV is set to 1.
4977
4978 =cut
4979 */
4980
4981 SV *
4982 Perl_newSVuv(pTHX_ UV u)
4983 {
4984     register SV *sv;
4985
4986     new_SV(sv);
4987     sv_setuv(sv,u);
4988     return sv;
4989 }
4990
4991 /*
4992 =for apidoc newRV_noinc
4993
4994 Creates an RV wrapper for an SV.  The reference count for the original
4995 SV is B<not> incremented.
4996
4997 =cut
4998 */
4999
5000 SV *
5001 Perl_newRV_noinc(pTHX_ SV *tmpRef)
5002 {
5003     dTHR;
5004     register SV *sv;
5005
5006     new_SV(sv);
5007     sv_upgrade(sv, SVt_RV);
5008     SvTEMP_off(tmpRef);
5009     SvRV(sv) = tmpRef;
5010     SvROK_on(sv);
5011     return sv;
5012 }
5013
5014 /* newRV_inc is #defined to newRV in sv.h */
5015 SV *
5016 Perl_newRV(pTHX_ SV *tmpRef)
5017 {
5018     return newRV_noinc(SvREFCNT_inc(tmpRef));
5019 }
5020
5021 /*
5022 =for apidoc newSVsv
5023
5024 Creates a new SV which is an exact duplicate of the original SV.
5025
5026 =cut
5027 */
5028
5029 /* make an exact duplicate of old */
5030
5031 SV *
5032 Perl_newSVsv(pTHX_ register SV *old)
5033 {
5034     dTHR;
5035     register SV *sv;
5036
5037     if (!old)
5038         return Nullsv;
5039     if (SvTYPE(old) == SVTYPEMASK) {
5040         if (ckWARN_d(WARN_INTERNAL))
5041             Perl_warner(aTHX_ WARN_INTERNAL, "semi-panic: attempt to dup freed string");
5042         return Nullsv;
5043     }
5044     new_SV(sv);
5045     if (SvTEMP(old)) {
5046         SvTEMP_off(old);
5047         sv_setsv(sv,old);
5048         SvTEMP_on(old);
5049     }
5050     else
5051         sv_setsv(sv,old);
5052     return sv;
5053 }
5054
5055 void
5056 Perl_sv_reset(pTHX_ register char *s, HV *stash)
5057 {
5058     register HE *entry;
5059     register GV *gv;
5060     register SV *sv;
5061     register I32 i;
5062     register PMOP *pm;
5063     register I32 max;
5064     char todo[PERL_UCHAR_MAX+1];
5065
5066     if (!stash)
5067         return;
5068
5069     if (!*s) {          /* reset ?? searches */
5070         for (pm = HvPMROOT(stash); pm; pm = pm->op_pmnext) {
5071             pm->op_pmdynflags &= ~PMdf_USED;
5072         }
5073         return;
5074     }
5075
5076     /* reset variables */
5077
5078     if (!HvARRAY(stash))
5079         return;
5080
5081     Zero(todo, 256, char);
5082     while (*s) {
5083         i = (unsigned char)*s;
5084         if (s[1] == '-') {
5085             s += 2;
5086         }
5087         max = (unsigned char)*s++;
5088         for ( ; i <= max; i++) {
5089             todo[i] = 1;
5090         }
5091         for (i = 0; i <= (I32) HvMAX(stash); i++) {
5092             for (entry = HvARRAY(stash)[i];
5093                  entry;
5094                  entry = HeNEXT(entry))
5095             {
5096                 if (!todo[(U8)*HeKEY(entry)])
5097                     continue;
5098                 gv = (GV*)HeVAL(entry);
5099                 sv = GvSV(gv);
5100                 if (SvTHINKFIRST(sv)) {
5101                     if (!SvREADONLY(sv) && SvROK(sv))
5102                         sv_unref(sv);
5103                     continue;
5104                 }
5105                 (void)SvOK_off(sv);
5106                 if (SvTYPE(sv) >= SVt_PV) {
5107                     SvCUR_set(sv, 0);
5108                     if (SvPVX(sv) != Nullch)
5109                         *SvPVX(sv) = '\0';
5110                     SvTAINT(sv);
5111                 }
5112                 if (GvAV(gv)) {
5113                     av_clear(GvAV(gv));
5114                 }
5115                 if (GvHV(gv) && !HvNAME(GvHV(gv))) {
5116                     hv_clear(GvHV(gv));
5117 #ifndef VMS  /* VMS has no environ array */
5118                     if (gv == PL_envgv)
5119                         environ[0] = Nullch;
5120 #endif
5121                 }
5122             }
5123         }
5124     }
5125 }
5126
5127 IO*
5128 Perl_sv_2io(pTHX_ SV *sv)
5129 {
5130     IO* io;
5131     GV* gv;
5132     STRLEN n_a;
5133
5134     switch (SvTYPE(sv)) {
5135     case SVt_PVIO:
5136         io = (IO*)sv;
5137         break;
5138     case SVt_PVGV:
5139         gv = (GV*)sv;
5140         io = GvIO(gv);
5141         if (!io)
5142             Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
5143         break;
5144     default:
5145         if (!SvOK(sv))
5146             Perl_croak(aTHX_ PL_no_usym, "filehandle");
5147         if (SvROK(sv))
5148             return sv_2io(SvRV(sv));
5149         gv = gv_fetchpv(SvPV(sv,n_a), FALSE, SVt_PVIO);
5150         if (gv)
5151             io = GvIO(gv);
5152         else
5153             io = 0;
5154         if (!io)
5155             Perl_croak(aTHX_ "Bad filehandle: %s", SvPV(sv,n_a));
5156         break;
5157     }
5158     return io;
5159 }
5160
5161 CV *
5162 Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
5163 {
5164     GV *gv;
5165     CV *cv;
5166     STRLEN n_a;
5167
5168     if (!sv)
5169         return *gvp = Nullgv, Nullcv;
5170     switch (SvTYPE(sv)) {
5171     case SVt_PVCV:
5172         *st = CvSTASH(sv);
5173         *gvp = Nullgv;
5174         return (CV*)sv;
5175     case SVt_PVHV:
5176     case SVt_PVAV:
5177         *gvp = Nullgv;
5178         return Nullcv;
5179     case SVt_PVGV:
5180         gv = (GV*)sv;
5181         *gvp = gv;
5182         *st = GvESTASH(gv);
5183         goto fix_gv;
5184
5185     default:
5186         if (SvGMAGICAL(sv))
5187             mg_get(sv);
5188         if (SvROK(sv)) {
5189             dTHR;
5190             SV **sp = &sv;              /* Used in tryAMAGICunDEREF macro. */
5191             tryAMAGICunDEREF(to_cv);
5192
5193             sv = SvRV(sv);
5194             if (SvTYPE(sv) == SVt_PVCV) {
5195                 cv = (CV*)sv;
5196                 *gvp = Nullgv;
5197                 *st = CvSTASH(cv);
5198                 return cv;
5199             }
5200             else if(isGV(sv))
5201                 gv = (GV*)sv;
5202             else
5203                 Perl_croak(aTHX_ "Not a subroutine reference");
5204         }
5205         else if (isGV(sv))
5206             gv = (GV*)sv;
5207         else
5208             gv = gv_fetchpv(SvPV(sv, n_a), lref, SVt_PVCV);
5209         *gvp = gv;
5210         if (!gv)
5211             return Nullcv;
5212         *st = GvESTASH(gv);
5213     fix_gv:
5214         if (lref && !GvCVu(gv)) {
5215             SV *tmpsv;
5216             ENTER;
5217             tmpsv = NEWSV(704,0);
5218             gv_efullname3(tmpsv, gv, Nullch);
5219             /* XXX this is probably not what they think they're getting.
5220              * It has the same effect as "sub name;", i.e. just a forward
5221              * declaration! */
5222             newSUB(start_subparse(FALSE, 0),
5223                    newSVOP(OP_CONST, 0, tmpsv),
5224                    Nullop,
5225                    Nullop);
5226             LEAVE;
5227             if (!GvCVu(gv))
5228                 Perl_croak(aTHX_ "Unable to create sub named \"%s\"", SvPV(sv,n_a));
5229         }
5230         return GvCVu(gv);
5231     }
5232 }
5233
5234 /*
5235 =for apidoc sv_true
5236
5237 Returns true if the SV has a true value by Perl's rules.
5238
5239 =cut
5240 */
5241
5242 I32
5243 Perl_sv_true(pTHX_ register SV *sv)
5244 {
5245     dTHR;
5246     if (!sv)
5247         return 0;
5248     if (SvPOK(sv)) {
5249         register XPV* tXpv;
5250         if ((tXpv = (XPV*)SvANY(sv)) &&
5251                 (tXpv->xpv_cur > 1 ||
5252                 (tXpv->xpv_cur && *tXpv->xpv_pv != '0')))
5253             return 1;
5254         else
5255             return 0;
5256     }
5257     else {
5258         if (SvIOK(sv))
5259             return SvIVX(sv) != 0;
5260         else {
5261             if (SvNOK(sv))
5262                 return SvNVX(sv) != 0.0;
5263             else
5264                 return sv_2bool(sv);
5265         }
5266     }
5267 }
5268
5269 IV
5270 Perl_sv_iv(pTHX_ register SV *sv)
5271 {
5272     if (SvIOK(sv)) {
5273         if (SvIsUV(sv))
5274             return (IV)SvUVX(sv);
5275         return SvIVX(sv);
5276     }
5277     return sv_2iv(sv);
5278 }
5279
5280 UV
5281 Perl_sv_uv(pTHX_ register SV *sv)
5282 {
5283     if (SvIOK(sv)) {
5284         if (SvIsUV(sv))
5285             return SvUVX(sv);
5286         return (UV)SvIVX(sv);
5287     }
5288     return sv_2uv(sv);
5289 }
5290
5291 NV
5292 Perl_sv_nv(pTHX_ register SV *sv)
5293 {
5294     if (SvNOK(sv))
5295         return SvNVX(sv);
5296     return sv_2nv(sv);
5297 }
5298
5299 char *
5300 Perl_sv_pv(pTHX_ SV *sv)
5301 {
5302     STRLEN n_a;
5303
5304     if (SvPOK(sv))
5305         return SvPVX(sv);
5306
5307     return sv_2pv(sv, &n_a);
5308 }
5309
5310 char *
5311 Perl_sv_pvn(pTHX_ SV *sv, STRLEN *lp)
5312 {
5313     if (SvPOK(sv)) {
5314         *lp = SvCUR(sv);
5315         return SvPVX(sv);
5316     }
5317     return sv_2pv(sv, lp);
5318 }
5319
5320 /*
5321 =for apidoc sv_pvn_force
5322
5323 Get a sensible string out of the SV somehow.
5324
5325 =cut
5326 */
5327
5328 char *
5329 Perl_sv_pvn_force(pTHX_ SV *sv, STRLEN *lp)
5330 {
5331     char *s;
5332
5333     if (SvTHINKFIRST(sv) && !SvROK(sv))
5334         sv_force_normal(sv);
5335
5336     if (SvPOK(sv)) {
5337         *lp = SvCUR(sv);
5338     }
5339     else {
5340         if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
5341             dTHR;
5342             Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
5343                 PL_op_name[PL_op->op_type]);
5344         }
5345         else
5346             s = sv_2pv(sv, lp);
5347         if (s != SvPVX(sv)) {   /* Almost, but not quite, sv_setpvn() */
5348             STRLEN len = *lp;
5349         
5350             if (SvROK(sv))
5351                 sv_unref(sv);
5352             (void)SvUPGRADE(sv, SVt_PV);                /* Never FALSE */
5353             SvGROW(sv, len + 1);
5354             Move(s,SvPVX(sv),len,char);
5355             SvCUR_set(sv, len);
5356             *SvEND(sv) = '\0';
5357         }
5358         if (!SvPOK(sv)) {
5359             SvPOK_on(sv);               /* validate pointer */
5360             SvTAINT(sv);
5361             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
5362                                   PTR2UV(sv),SvPVX(sv)));
5363         }
5364     }
5365     return SvPVX(sv);
5366 }
5367
5368 char *
5369 Perl_sv_pvbyte(pTHX_ SV *sv)
5370 {
5371     return sv_pv(sv);
5372 }
5373
5374 char *
5375 Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *lp)
5376 {
5377     return sv_pvn(sv,lp);
5378 }
5379
5380 char *
5381 Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
5382 {
5383     return sv_pvn_force(sv,lp);
5384 }
5385
5386 char *
5387 Perl_sv_pvutf8(pTHX_ SV *sv)
5388 {
5389     sv_utf8_upgrade(sv);
5390     return sv_pv(sv);
5391 }
5392
5393 char *
5394 Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *lp)
5395 {
5396     sv_utf8_upgrade(sv);
5397     return sv_pvn(sv,lp);
5398 }
5399
5400 /*
5401 =for apidoc sv_pvutf8n_force
5402
5403 Get a sensible UTF8-encoded string out of the SV somehow. See
5404 L</sv_pvn_force>.
5405
5406 =cut
5407 */
5408
5409 char *
5410 Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
5411 {
5412     sv_utf8_upgrade(sv);
5413     return sv_pvn_force(sv,lp);
5414 }
5415
5416 /*
5417 =for apidoc sv_reftype
5418
5419 Returns a string describing what the SV is a reference to.
5420
5421 =cut
5422 */
5423
5424 char *
5425 Perl_sv_reftype(pTHX_ SV *sv, int ob)
5426 {
5427     if (ob && SvOBJECT(sv))
5428         return HvNAME(SvSTASH(sv));
5429     else {
5430         switch (SvTYPE(sv)) {
5431         case SVt_NULL:
5432         case SVt_IV:
5433         case SVt_NV:
5434         case SVt_RV:
5435         case SVt_PV:
5436         case SVt_PVIV:
5437         case SVt_PVNV:
5438         case SVt_PVMG:
5439         case SVt_PVBM:
5440                                 if (SvROK(sv))
5441                                     return "REF";
5442                                 else
5443                                     return "SCALAR";
5444         case SVt_PVLV:          return "LVALUE";
5445         case SVt_PVAV:          return "ARRAY";
5446         case SVt_PVHV:          return "HASH";
5447         case SVt_PVCV:          return "CODE";
5448         case SVt_PVGV:          return "GLOB";
5449         case SVt_PVFM:          return "FORMAT";
5450         case SVt_PVIO:          return "IO";
5451         default:                return "UNKNOWN";
5452         }
5453     }
5454 }
5455
5456 /*
5457 =for apidoc sv_isobject
5458
5459 Returns a boolean indicating whether the SV is an RV pointing to a blessed
5460 object.  If the SV is not an RV, or if the object is not blessed, then this
5461 will return false.
5462
5463 =cut
5464 */
5465
5466 int
5467 Perl_sv_isobject(pTHX_ SV *sv)
5468 {
5469     if (!sv)
5470         return 0;
5471     if (SvGMAGICAL(sv))
5472         mg_get(sv);
5473     if (!SvROK(sv))
5474         return 0;
5475     sv = (SV*)SvRV(sv);
5476     if (!SvOBJECT(sv))
5477         return 0;
5478     return 1;
5479 }
5480
5481 /*
5482 =for apidoc sv_isa
5483
5484 Returns a boolean indicating whether the SV is blessed into the specified
5485 class.  This does not check for subtypes; use C<sv_derived_from> to verify
5486 an inheritance relationship.
5487
5488 =cut
5489 */
5490
5491 int
5492 Perl_sv_isa(pTHX_ SV *sv, const char *name)
5493 {
5494     if (!sv)
5495         return 0;
5496     if (SvGMAGICAL(sv))
5497         mg_get(sv);
5498     if (!SvROK(sv))
5499         return 0;
5500     sv = (SV*)SvRV(sv);
5501     if (!SvOBJECT(sv))
5502         return 0;
5503
5504     return strEQ(HvNAME(SvSTASH(sv)), name);
5505 }
5506
5507 /*
5508 =for apidoc newSVrv
5509
5510 Creates a new SV for the RV, C<rv>, to point to.  If C<rv> is not an RV then
5511 it will be upgraded to one.  If C<classname> is non-null then the new SV will
5512 be blessed in the specified package.  The new SV is returned and its
5513 reference count is 1.
5514
5515 =cut
5516 */
5517
5518 SV*
5519 Perl_newSVrv(pTHX_ SV *rv, const char *classname)
5520 {
5521     dTHR;
5522     SV *sv;
5523
5524     new_SV(sv);
5525
5526     SV_CHECK_THINKFIRST(rv);
5527     SvAMAGIC_off(rv);
5528
5529     if (SvTYPE(rv) >= SVt_PVMG) {
5530         U32 refcnt = SvREFCNT(rv);
5531         SvREFCNT(rv) = 0;
5532         sv_clear(rv);
5533         SvFLAGS(rv) = 0;
5534         SvREFCNT(rv) = refcnt;
5535     }
5536
5537     if (SvTYPE(rv) < SVt_RV)
5538         sv_upgrade(rv, SVt_RV);
5539     else if (SvTYPE(rv) > SVt_RV) {
5540         (void)SvOOK_off(rv);
5541         if (SvPVX(rv) && SvLEN(rv))
5542             Safefree(SvPVX(rv));
5543         SvCUR_set(rv, 0);
5544         SvLEN_set(rv, 0);
5545     }
5546
5547     (void)SvOK_off(rv);
5548     SvRV(rv) = sv;
5549     SvROK_on(rv);
5550
5551     if (classname) {
5552         HV* stash = gv_stashpv(classname, TRUE);
5553         (void)sv_bless(rv, stash);
5554     }
5555     return sv;
5556 }
5557
5558 /*
5559 =for apidoc sv_setref_pv
5560
5561 Copies a pointer into a new SV, optionally blessing the SV.  The C<rv>
5562 argument will be upgraded to an RV.  That RV will be modified to point to
5563 the new SV.  If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
5564 into the SV.  The C<classname> argument indicates the package for the
5565 blessing.  Set C<classname> to C<Nullch> to avoid the blessing.  The new SV
5566 will be returned and will have a reference count of 1.
5567
5568 Do not use with other Perl types such as HV, AV, SV, CV, because those
5569 objects will become corrupted by the pointer copy process.
5570
5571 Note that C<sv_setref_pvn> copies the string while this copies the pointer.
5572
5573 =cut
5574 */
5575
5576 SV*
5577 Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
5578 {
5579     if (!pv) {
5580         sv_setsv(rv, &PL_sv_undef);
5581         SvSETMAGIC(rv);
5582     }
5583     else
5584         sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
5585     return rv;
5586 }
5587
5588 /*
5589 =for apidoc sv_setref_iv
5590
5591 Copies an integer into a new SV, optionally blessing the SV.  The C<rv>
5592 argument will be upgraded to an RV.  That RV will be modified to point to
5593 the new SV.  The C<classname> argument indicates the package for the
5594 blessing.  Set C<classname> to C<Nullch> to avoid the blessing.  The new SV
5595 will be returned and will have a reference count of 1.
5596
5597 =cut
5598 */
5599
5600 SV*
5601 Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
5602 {
5603     sv_setiv(newSVrv(rv,classname), iv);
5604     return rv;
5605 }
5606
5607 /*
5608 =for apidoc sv_setref_nv
5609
5610 Copies a double into a new SV, optionally blessing the SV.  The C<rv>
5611 argument will be upgraded to an RV.  That RV will be modified to point to
5612 the new SV.  The C<classname> argument indicates the package for the
5613 blessing.  Set C<classname> to C<Nullch> to avoid the blessing.  The new SV
5614 will be returned and will have a reference count of 1.
5615
5616 =cut
5617 */
5618
5619 SV*
5620 Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
5621 {
5622     sv_setnv(newSVrv(rv,classname), nv);
5623     return rv;
5624 }
5625
5626 /*
5627 =for apidoc sv_setref_pvn
5628
5629 Copies a string into a new SV, optionally blessing the SV.  The length of the
5630 string must be specified with C<n>.  The C<rv> argument will be upgraded to
5631 an RV.  That RV will be modified to point to the new SV.  The C<classname>
5632 argument indicates the package for the blessing.  Set C<classname> to
5633 C<Nullch> to avoid the blessing.  The new SV will be returned and will have
5634 a reference count of 1.
5635
5636 Note that C<sv_setref_pv> copies the pointer while this copies the string.
5637
5638 =cut
5639 */
5640
5641 SV*
5642 Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, char *pv, STRLEN n)
5643 {
5644     sv_setpvn(newSVrv(rv,classname), pv, n);
5645     return rv;
5646 }
5647
5648 /*
5649 =for apidoc sv_bless
5650
5651 Blesses an SV into a specified package.  The SV must be an RV.  The package
5652 must be designated by its stash (see C<gv_stashpv()>).  The reference count
5653 of the SV is unaffected.
5654
5655 =cut
5656 */
5657
5658 SV*
5659 Perl_sv_bless(pTHX_ SV *sv, HV *stash)
5660 {
5661     dTHR;
5662     SV *tmpRef;
5663     if (!SvROK(sv))
5664         Perl_croak(aTHX_ "Can't bless non-reference value");
5665     tmpRef = SvRV(sv);
5666     if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
5667         if (SvREADONLY(tmpRef))
5668             Perl_croak(aTHX_ PL_no_modify);
5669         if (SvOBJECT(tmpRef)) {
5670             if (SvTYPE(tmpRef) != SVt_PVIO)
5671                 --PL_sv_objcount;
5672             SvREFCNT_dec(SvSTASH(tmpRef));
5673         }
5674     }
5675     SvOBJECT_on(tmpRef);
5676     if (SvTYPE(tmpRef) != SVt_PVIO)
5677         ++PL_sv_objcount;
5678     (void)SvUPGRADE(tmpRef, SVt_PVMG);
5679     SvSTASH(tmpRef) = (HV*)SvREFCNT_inc(stash);
5680
5681     if (Gv_AMG(stash))
5682         SvAMAGIC_on(sv);
5683     else
5684         SvAMAGIC_off(sv);
5685
5686     return sv;
5687 }
5688
5689 STATIC void
5690 S_sv_unglob(pTHX_ SV *sv)
5691 {
5692     void *xpvmg;
5693
5694     assert(SvTYPE(sv) == SVt_PVGV);
5695     SvFAKE_off(sv);
5696     if (GvGP(sv))
5697         gp_free((GV*)sv);
5698     if (GvSTASH(sv)) {
5699         SvREFCNT_dec(GvSTASH(sv));
5700         GvSTASH(sv) = Nullhv;
5701     }
5702     sv_unmagic(sv, '*');
5703     Safefree(GvNAME(sv));
5704     GvMULTI_off(sv);
5705
5706     /* need to keep SvANY(sv) in the right arena */
5707     xpvmg = new_XPVMG();
5708     StructCopy(SvANY(sv), xpvmg, XPVMG);
5709     del_XPVGV(SvANY(sv));
5710     SvANY(sv) = xpvmg;
5711
5712     SvFLAGS(sv) &= ~SVTYPEMASK;
5713     SvFLAGS(sv) |= SVt_PVMG;
5714 }
5715
5716 /*
5717 =for apidoc sv_unref
5718
5719 Unsets the RV status of the SV, and decrements the reference count of
5720 whatever was being referenced by the RV.  This can almost be thought of
5721 as a reversal of C<newSVrv>.  See C<SvROK_off>.
5722
5723 =cut
5724 */
5725
5726 void
5727 Perl_sv_unref(pTHX_ SV *sv)
5728 {
5729     SV* rv = SvRV(sv);
5730
5731     if (SvWEAKREF(sv)) {
5732         sv_del_backref(sv);
5733         SvWEAKREF_off(sv);
5734         SvRV(sv) = 0;
5735         return;
5736     }
5737     SvRV(sv) = 0;
5738     SvROK_off(sv);
5739     if (SvREFCNT(rv) != 1 || SvREADONLY(rv))
5740         SvREFCNT_dec(rv);
5741     else
5742         sv_2mortal(rv);         /* Schedule for freeing later */
5743 }
5744
5745 void
5746 Perl_sv_taint(pTHX_ SV *sv)
5747 {
5748     sv_magic((sv), Nullsv, 't', Nullch, 0);
5749 }
5750
5751 void
5752 Perl_sv_untaint(pTHX_ SV *sv)
5753 {
5754     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
5755         MAGIC *mg = mg_find(sv, 't');
5756         if (mg)
5757             mg->mg_len &= ~1;
5758     }
5759 }
5760
5761 bool
5762 Perl_sv_tainted(pTHX_ SV *sv)
5763 {
5764     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
5765         MAGIC *mg = mg_find(sv, 't');
5766         if (mg && ((mg->mg_len & 1) || ((mg->mg_len & 2) && mg->mg_obj == sv)))
5767             return TRUE;
5768     }
5769     return FALSE;
5770 }
5771
5772 /*
5773 =for apidoc sv_setpviv
5774
5775 Copies an integer into the given SV, also updating its string value.
5776 Does not handle 'set' magic.  See C<sv_setpviv_mg>.
5777
5778 =cut
5779 */
5780
5781 void
5782 Perl_sv_setpviv(pTHX_ SV *sv, IV iv)
5783 {
5784     char buf[TYPE_CHARS(UV)];
5785     char *ebuf;
5786     char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
5787
5788     sv_setpvn(sv, ptr, ebuf - ptr);
5789 }
5790
5791
5792 /*
5793 =for apidoc sv_setpviv_mg
5794
5795 Like C<sv_setpviv>, but also handles 'set' magic.
5796
5797 =cut
5798 */
5799
5800 void
5801 Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv)
5802 {
5803     char buf[TYPE_CHARS(UV)];
5804     char *ebuf;
5805     char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
5806
5807     sv_setpvn(sv, ptr, ebuf - ptr);
5808     SvSETMAGIC(sv);
5809 }
5810
5811 #if defined(PERL_IMPLICIT_CONTEXT)
5812 void
5813 Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
5814 {
5815     dTHX;
5816     va_list args;
5817     va_start(args, pat);
5818     sv_vsetpvf(sv, pat, &args);
5819     va_end(args);
5820 }
5821
5822
5823 void
5824 Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
5825 {
5826     dTHX;
5827     va_list args;
5828     va_start(args, pat);
5829     sv_vsetpvf_mg(sv, pat, &args);
5830     va_end(args);
5831 }
5832 #endif
5833
5834 /*
5835 =for apidoc sv_setpvf
5836
5837 Processes its arguments like C<sprintf> and sets an SV to the formatted
5838 output.  Does not handle 'set' magic.  See C<sv_setpvf_mg>.
5839
5840 =cut
5841 */
5842
5843 void
5844 Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
5845 {
5846     va_list args;
5847     va_start(args, pat);
5848     sv_vsetpvf(sv, pat, &args);
5849     va_end(args);
5850 }
5851
5852 void
5853 Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
5854 {
5855     sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
5856 }
5857
5858 /*
5859 =for apidoc sv_setpvf_mg
5860
5861 Like C<sv_setpvf>, but also handles 'set' magic.
5862
5863 =cut
5864 */
5865
5866 void
5867 Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
5868 {
5869     va_list args;
5870     va_start(args, pat);
5871     sv_vsetpvf_mg(sv, pat, &args);
5872     va_end(args);
5873 }
5874
5875 void
5876 Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
5877 {
5878     sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
5879     SvSETMAGIC(sv);
5880 }
5881
5882 #if defined(PERL_IMPLICIT_CONTEXT)
5883 void
5884 Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
5885 {
5886     dTHX;
5887     va_list args;
5888     va_start(args, pat);
5889     sv_vcatpvf(sv, pat, &args);
5890     va_end(args);
5891 }
5892
5893 void
5894 Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
5895 {
5896     dTHX;
5897     va_list args;
5898     va_start(args, pat);
5899     sv_vcatpvf_mg(sv, pat, &args);
5900     va_end(args);
5901 }
5902 #endif
5903
5904 /*
5905 =for apidoc sv_catpvf
5906
5907 Processes its arguments like C<sprintf> and appends the formatted output
5908 to an SV.  Handles 'get' magic, but not 'set' magic.  C<SvSETMAGIC()> must
5909 typically be called after calling this function to handle 'set' magic.
5910
5911 =cut
5912 */
5913
5914 void
5915 Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
5916 {
5917     va_list args;
5918     va_start(args, pat);
5919     sv_vcatpvf(sv, pat, &args);
5920     va_end(args);
5921 }
5922
5923 void
5924 Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
5925 {
5926     sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
5927 }
5928
5929 /*
5930 =for apidoc sv_catpvf_mg
5931
5932 Like C<sv_catpvf>, but also handles 'set' magic.
5933
5934 =cut
5935 */
5936
5937 void
5938 Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
5939 {
5940     va_list args;
5941     va_start(args, pat);
5942     sv_vcatpvf_mg(sv, pat, &args);
5943     va_end(args);
5944 }
5945
5946 void
5947 Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
5948 {
5949     sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
5950     SvSETMAGIC(sv);
5951 }
5952
5953 /*
5954 =for apidoc sv_vsetpvfn
5955
5956 Works like C<vcatpvfn> but copies the text into the SV instead of
5957 appending it.
5958
5959 =cut
5960 */
5961
5962 void
5963 Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
5964 {
5965     sv_setpvn(sv, "", 0);
5966     sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
5967 }
5968
5969 /*
5970 =for apidoc sv_vcatpvfn
5971
5972 Processes its arguments like C<vsprintf> and appends the formatted output
5973 to an SV.  Uses an array of SVs if the C style variable argument list is
5974 missing (NULL).  When running with taint checks enabled, indicates via
5975 C<maybe_tainted> if results are untrustworthy (often due to the use of
5976 locales).
5977
5978 =cut
5979 */
5980
5981 void
5982 Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
5983 {
5984     dTHR;
5985     char *p;
5986     char *q;
5987     char *patend;
5988     STRLEN origlen;
5989     I32 svix = 0;
5990     static char nullstr[] = "(null)";
5991     SV *argsv;
5992
5993     /* no matter what, this is a string now */
5994     (void)SvPV_force(sv, origlen);
5995
5996     /* special-case "", "%s", and "%_" */
5997     if (patlen == 0)
5998         return;
5999     if (patlen == 2 && pat[0] == '%') {
6000         switch (pat[1]) {
6001         case 's':
6002             if (args) {
6003                 char *s = va_arg(*args, char*);
6004                 sv_catpv(sv, s ? s : nullstr);
6005             }
6006             else if (svix < svmax) {
6007                 sv_catsv(sv, *svargs);
6008                 if (DO_UTF8(*svargs))
6009                     SvUTF8_on(sv);
6010             }
6011             return;
6012         case '_':
6013             if (args) {
6014                 argsv = va_arg(*args, SV*);
6015                 sv_catsv(sv, argsv);
6016                 if (DO_UTF8(argsv))
6017                     SvUTF8_on(sv);
6018                 return;
6019             }
6020             /* See comment on '_' below */
6021             break;
6022         }
6023     }
6024
6025     patend = (char*)pat + patlen;
6026     for (p = (char*)pat; p < patend; p = q) {
6027         bool alt = FALSE;
6028         bool left = FALSE;
6029         bool vectorize = FALSE;
6030         bool utf = FALSE;
6031         char fill = ' ';
6032         char plus = 0;
6033         char intsize = 0;
6034         STRLEN width = 0;
6035         STRLEN zeros = 0;
6036         bool has_precis = FALSE;
6037         STRLEN precis = 0;
6038         bool is_utf = FALSE;
6039
6040         char esignbuf[4];
6041         U8 utf8buf[UTF8_MAXLEN];
6042         STRLEN esignlen = 0;
6043
6044         char *eptr = Nullch;
6045         STRLEN elen = 0;
6046         /* Times 4: a decimal digit takes more than 3 binary digits.
6047          * NV_DIG: mantissa takes than many decimal digits.
6048          * Plus 32: Playing safe. */
6049         char ebuf[IV_DIG * 4 + NV_DIG + 32];
6050         /* large enough for "%#.#f" --chip */
6051         /* what about long double NVs? --jhi */
6052
6053         SV *vecsv;
6054         U8 *vecstr = Null(U8*);
6055         STRLEN veclen = 0;
6056         char c;
6057         int i;
6058         unsigned base;
6059         IV iv;
6060         UV uv;
6061         NV nv;
6062         STRLEN have;
6063         STRLEN need;
6064         STRLEN gap;
6065         char *dotstr = ".";
6066         STRLEN dotstrlen = 1;
6067
6068         for (q = p; q < patend && *q != '%'; ++q) ;
6069         if (q > p) {
6070             sv_catpvn(sv, p, q - p);
6071             p = q;
6072         }
6073         if (q++ >= patend)
6074             break;
6075
6076         /* FLAGS */
6077
6078         while (*q) {
6079             switch (*q) {
6080             case ' ':
6081             case '+':
6082                 plus = *q++;
6083                 continue;
6084
6085             case '-':
6086                 left = TRUE;
6087                 q++;
6088                 continue;
6089
6090             case '0':
6091                 fill = *q++;
6092                 continue;
6093
6094             case '#':
6095                 alt = TRUE;
6096                 q++;
6097                 continue;
6098
6099             case '*':                   /* printf("%*vX",":",$ipv6addr) */
6100                 if (q[1] != 'v')
6101                     break;
6102                 q++;
6103                 if (args)
6104                     vecsv = va_arg(*args, SV*);
6105                 else if (svix < svmax)
6106                     vecsv = svargs[svix++];
6107                 else
6108                     continue;
6109                 dotstr = SvPVx(vecsv,dotstrlen);
6110                 if (DO_UTF8(vecsv))
6111                     is_utf = TRUE;
6112                 /* FALL THROUGH */
6113
6114             case 'v':
6115                 vectorize = TRUE;
6116                 q++;
6117                 continue;
6118
6119             default:
6120                 break;
6121             }
6122             break;
6123         }
6124
6125         /* WIDTH */
6126
6127         switch (*q) {
6128         case '1': case '2': case '3':
6129         case '4': case '5': case '6':
6130         case '7': case '8': case '9':
6131             width = 0;
6132             while (isDIGIT(*q))
6133                 width = width * 10 + (*q++ - '0');
6134             break;
6135
6136         case '*':
6137             if (args)
6138                 i = va_arg(*args, int);
6139             else
6140                 i = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
6141             left |= (i < 0);
6142             width = (i < 0) ? -i : i;
6143             q++;
6144             break;
6145         }
6146
6147         /* PRECISION */
6148
6149         if (*q == '.') {
6150             q++;
6151             if (*q == '*') {
6152                 if (args)
6153                     i = va_arg(*args, int);
6154                 else
6155                     i = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
6156                 precis = (i < 0) ? 0 : i;
6157                 q++;
6158             }
6159             else {
6160                 precis = 0;
6161                 while (isDIGIT(*q))
6162                     precis = precis * 10 + (*q++ - '0');
6163             }
6164             has_precis = TRUE;
6165         }
6166
6167         if (vectorize) {
6168             if (args) {
6169                 vecsv = va_arg(*args, SV*);
6170                 vecstr = (U8*)SvPVx(vecsv,veclen);
6171                 utf = DO_UTF8(vecsv);
6172             }
6173             else if (svix < svmax) {
6174                 vecsv = svargs[svix++];
6175                 vecstr = (U8*)SvPVx(vecsv,veclen);
6176                 utf = DO_UTF8(vecsv);
6177             }
6178             else {
6179                 vecstr = (U8*)"";
6180                 veclen = 0;
6181             }
6182         }
6183
6184         /* SIZE */
6185
6186         switch (*q) {
6187 #if defined(HAS_QUAD) || (defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE))
6188         case 'L':                       /* Ld */
6189             /* FALL THROUGH */
6190 #endif
6191 #ifdef HAS_QUAD
6192         case 'q':                       /* qd */
6193             intsize = 'q';
6194             q++;
6195             break;
6196 #endif
6197         case 'l':
6198 #if defined(HAS_QUAD) || (defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE))
6199              if (*(q + 1) == 'l') {     /* lld, llf */
6200                 intsize = 'q';
6201                 q += 2;
6202                 break;
6203              }
6204 #endif
6205             /* FALL THROUGH */
6206         case 'h':
6207             /* FALL THROUGH */
6208         case 'V':
6209             intsize = *q++;
6210             break;
6211         }
6212
6213         /* CONVERSION */
6214
6215         switch (c = *q++) {
6216
6217             /* STRINGS */
6218
6219         case '%':
6220             eptr = q - 1;
6221             elen = 1;
6222             goto string;
6223
6224         case 'c':
6225             if (args)
6226                 uv = va_arg(*args, int);
6227             else
6228                 uv = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
6229             if ((uv > 255 || (uv > 127 && SvUTF8(sv))) && !IN_BYTE) {
6230                 eptr = (char*)utf8buf;
6231                 elen = uv_to_utf8((U8*)eptr, uv) - utf8buf;
6232                 is_utf = TRUE;
6233             }
6234             else {
6235                 c = (char)uv;
6236                 eptr = &c;
6237                 elen = 1;
6238             }
6239             goto string;
6240
6241         case 's':
6242             if (args) {
6243                 eptr = va_arg(*args, char*);
6244                 if (eptr)
6245 #ifdef MACOS_TRADITIONAL
6246                   /* On MacOS, %#s format is used for Pascal strings */
6247                   if (alt)
6248                     elen = *eptr++;
6249                   else
6250 #endif
6251                     elen = strlen(eptr);
6252                 else {
6253                     eptr = nullstr;
6254                     elen = sizeof nullstr - 1;
6255                 }
6256             }
6257             else if (svix < svmax) {
6258                 argsv = svargs[svix++];
6259                 eptr = SvPVx(argsv, elen);
6260                 if (DO_UTF8(argsv)) {
6261                     if (has_precis && precis < elen) {
6262                         I32 p = precis;
6263                         sv_pos_u2b(argsv, &p, 0); /* sticks at end */
6264                         precis = p;
6265                     }
6266                     if (width) { /* fudge width (can't fudge elen) */
6267                         width += elen - sv_len_utf8(argsv);
6268                     }
6269                     is_utf = TRUE;
6270                 }
6271             }
6272             goto string;
6273
6274         case '_':
6275             /*
6276              * The "%_" hack might have to be changed someday,
6277              * if ISO or ANSI decide to use '_' for something.
6278              * So we keep it hidden from users' code.
6279              */
6280             if (!args)
6281                 goto unknown;
6282             argsv = va_arg(*args,SV*);
6283             eptr = SvPVx(argsv, elen);
6284             if (DO_UTF8(argsv))
6285                 is_utf = TRUE;
6286
6287         string:
6288             vectorize = FALSE;
6289             if (has_precis && elen > precis)
6290                 elen = precis;
6291             break;
6292
6293             /* INTEGERS */
6294
6295         case 'p':
6296             if (alt)
6297                 goto unknown;
6298             if (args)
6299                 uv = PTR2UV(va_arg(*args, void*));
6300             else
6301                 uv = (svix < svmax) ? PTR2UV(svargs[svix++]) : 0;
6302             base = 16;
6303             goto integer;
6304
6305         case 'D':
6306 #ifdef IV_IS_QUAD
6307             intsize = 'q';
6308 #else
6309             intsize = 'l';
6310 #endif
6311             /* FALL THROUGH */
6312         case 'd':
6313         case 'i':
6314             if (vectorize) {
6315                 I32 ulen;
6316                 if (!veclen) {
6317                     vectorize = FALSE;
6318                     break;
6319                 }
6320                 if (utf)
6321                     iv = (IV)utf8_to_uv(vecstr, &ulen, 0);
6322                 else {
6323                     iv = *vecstr;
6324                     ulen = 1;
6325                 }
6326                 vecstr += ulen;
6327                 veclen -= ulen;
6328             }
6329             else if (args) {
6330                 switch (intsize) {
6331                 case 'h':       iv = (short)va_arg(*args, int); break;
6332                 default:        iv = va_arg(*args, int); break;
6333                 case 'l':       iv = va_arg(*args, long); break;
6334                 case 'V':       iv = va_arg(*args, IV); break;
6335 #ifdef HAS_QUAD
6336                 case 'q':       iv = va_arg(*args, Quad_t); break;
6337 #endif
6338                 }
6339             }
6340             else {
6341                 iv = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
6342                 switch (intsize) {
6343                 case 'h':       iv = (short)iv; break;
6344                 default:        break;
6345                 case 'l':       iv = (long)iv; break;
6346                 case 'V':       break;
6347 #ifdef HAS_QUAD
6348                 case 'q':       iv = (Quad_t)iv; break;
6349 #endif
6350                 }
6351             }
6352             if (iv >= 0) {
6353                 uv = iv;
6354                 if (plus)
6355                     esignbuf[esignlen++] = plus;
6356             }
6357             else {
6358                 uv = -iv;
6359                 esignbuf[esignlen++] = '-';
6360             }
6361             base = 10;
6362             goto integer;
6363
6364         case 'U':
6365 #ifdef IV_IS_QUAD
6366             intsize = 'q';
6367 #else
6368             intsize = 'l';
6369 #endif
6370             /* FALL THROUGH */
6371         case 'u':
6372             base = 10;
6373             goto uns_integer;
6374
6375         case 'b':
6376             base = 2;
6377             goto uns_integer;
6378
6379         case 'O':
6380 #ifdef IV_IS_QUAD
6381             intsize = 'q';
6382 #else
6383             intsize = 'l';
6384 #endif
6385             /* FALL THROUGH */
6386         case 'o':
6387             base = 8;
6388             goto uns_integer;
6389
6390         case 'X':
6391         case 'x':
6392             base = 16;
6393
6394         uns_integer:
6395             if (vectorize) {
6396                 I32 ulen;
6397         vector:
6398                 if (!veclen) {
6399                     vectorize = FALSE;
6400                     break;
6401                 }
6402                 if (utf)
6403                     uv = utf8_to_uv(vecstr, &ulen, 0);
6404                 else {
6405                     uv = *vecstr;
6406                     ulen = 1;
6407                 }
6408                 vecstr += ulen;
6409                 veclen -= ulen;
6410             }
6411             else if (args) {
6412                 switch (intsize) {
6413                 case 'h':  uv = (unsigned short)va_arg(*args, unsigned); break;
6414                 default:   uv = va_arg(*args, unsigned); break;
6415                 case 'l':  uv = va_arg(*args, unsigned long); break;
6416                 case 'V':  uv = va_arg(*args, UV); break;
6417 #ifdef HAS_QUAD
6418                 case 'q':  uv = va_arg(*args, Quad_t); break;
6419 #endif
6420                 }
6421             }
6422             else {
6423                 uv = (svix < svmax) ? SvUVx(svargs[svix++]) : 0;
6424                 switch (intsize) {
6425                 case 'h':       uv = (unsigned short)uv; break;
6426                 default:        break;
6427                 case 'l':       uv = (unsigned long)uv; break;
6428                 case 'V':       break;
6429 #ifdef HAS_QUAD
6430                 case 'q':       uv = (Quad_t)uv; break;
6431 #endif
6432                 }
6433             }
6434
6435         integer:
6436             eptr = ebuf + sizeof ebuf;
6437             switch (base) {
6438                 unsigned dig;
6439             case 16:
6440                 if (!uv)
6441                     alt = FALSE;
6442                 p = (char*)((c == 'X')
6443                             ? "0123456789ABCDEF" : "0123456789abcdef");
6444                 do {
6445                     dig = uv & 15;
6446                     *--eptr = p[dig];
6447                 } while (uv >>= 4);
6448                 if (alt) {
6449                     esignbuf[esignlen++] = '0';
6450                     esignbuf[esignlen++] = c;  /* 'x' or 'X' */
6451                 }
6452                 break;
6453             case 8:
6454                 do {
6455                     dig = uv & 7;
6456                     *--eptr = '0' + dig;
6457                 } while (uv >>= 3);
6458                 if (alt && *eptr != '0')
6459                     *--eptr = '0';
6460                 break;
6461             case 2:
6462                 do {
6463                     dig = uv & 1;
6464                     *--eptr = '0' + dig;
6465                 } while (uv >>= 1);
6466                 if (alt) {
6467                     esignbuf[esignlen++] = '0';
6468                     esignbuf[esignlen++] = 'b';
6469                 }
6470                 break;
6471             default:            /* it had better be ten or less */
6472 #if defined(PERL_Y2KWARN)
6473                 if (ckWARN(WARN_Y2K)) {
6474                     STRLEN n;
6475                     char *s = SvPV(sv,n);
6476                     if (n >= 2 && s[n-2] == '1' && s[n-1] == '9'
6477                         && (n == 2 || !isDIGIT(s[n-3])))
6478                     {
6479                         Perl_warner(aTHX_ WARN_Y2K,
6480                                     "Possible Y2K bug: %%%c %s",
6481                                     c, "format string following '19'");
6482                     }
6483                 }
6484 #endif
6485                 do {
6486                     dig = uv % base;
6487                     *--eptr = '0' + dig;
6488                 } while (uv /= base);
6489                 break;
6490             }
6491             elen = (ebuf + sizeof ebuf) - eptr;
6492             if (has_precis) {
6493                 if (precis > elen)
6494                     zeros = precis - elen;
6495                 else if (precis == 0 && elen == 1 && *eptr == '0')
6496                     elen = 0;
6497             }
6498             break;
6499
6500             /* FLOATING POINT */
6501
6502         case 'F':
6503             c = 'f';            /* maybe %F isn't supported here */
6504             /* FALL THROUGH */
6505         case 'e': case 'E':
6506         case 'f':
6507         case 'g': case 'G':
6508
6509             /* This is evil, but floating point is even more evil */
6510
6511             vectorize = FALSE;
6512             if (args)
6513                 nv = va_arg(*args, NV);
6514             else
6515                 nv = (svix < svmax) ? SvNVx(svargs[svix++]) : 0.0;
6516
6517             need = 0;
6518             if (c != 'e' && c != 'E') {
6519                 i = PERL_INT_MIN;
6520                 (void)Perl_frexp(nv, &i);
6521                 if (i == PERL_INT_MIN)
6522                     Perl_die(aTHX_ "panic: frexp");
6523                 if (i > 0)
6524                     need = BIT_DIGITS(i);
6525             }
6526             need += has_precis ? precis : 6; /* known default */
6527             if (need < width)
6528                 need = width;
6529
6530             need += 20; /* fudge factor */
6531             if (PL_efloatsize < need) {
6532                 Safefree(PL_efloatbuf);
6533                 PL_efloatsize = need + 20; /* more fudge */
6534                 New(906, PL_efloatbuf, PL_efloatsize, char);
6535                 PL_efloatbuf[0] = '\0';
6536             }
6537
6538             eptr = ebuf + sizeof ebuf;
6539             *--eptr = '\0';
6540             *--eptr = c;
6541 #if defined(USE_LONG_DOUBLE) && defined(PERL_PRIfldbl)
6542             {
6543                 /* Copy the one or more characters in a long double
6544                  * format before the 'base' ([efgEFG]) character to
6545                  * the format string. */
6546                 static char const prifldbl[] = PERL_PRIfldbl;
6547                 char const *p = prifldbl + sizeof(prifldbl) - 3;
6548                 while (p >= prifldbl) { *--eptr = *p--; }
6549             }
6550 #endif
6551             if (has_precis) {
6552                 base = precis;
6553                 do { *--eptr = '0' + (base % 10); } while (base /= 10);
6554                 *--eptr = '.';
6555             }
6556             if (width) {
6557                 base = width;
6558                 do { *--eptr = '0' + (base % 10); } while (base /= 10);
6559             }
6560             if (fill == '0')
6561                 *--eptr = fill;
6562             if (left)
6563                 *--eptr = '-';
6564             if (plus)
6565                 *--eptr = plus;
6566             if (alt)
6567                 *--eptr = '#';
6568             *--eptr = '%';
6569
6570             {
6571                 STORE_NUMERIC_STANDARD_SET_LOCAL();
6572 #ifdef USE_LOCALE_NUMERIC
6573                 if (!was_standard && maybe_tainted)
6574                     *maybe_tainted = TRUE;
6575 #endif
6576                 (void)sprintf(PL_efloatbuf, eptr, nv);
6577                 RESTORE_NUMERIC_STANDARD();
6578             }
6579
6580             eptr = PL_efloatbuf;
6581             elen = strlen(PL_efloatbuf);
6582             break;
6583
6584             /* SPECIAL */
6585
6586         case 'n':
6587             vectorize = FALSE;
6588             i = SvCUR(sv) - origlen;
6589             if (args) {
6590                 switch (intsize) {
6591                 case 'h':       *(va_arg(*args, short*)) = i; break;
6592                 default:        *(va_arg(*args, int*)) = i; break;
6593                 case 'l':       *(va_arg(*args, long*)) = i; break;
6594                 case 'V':       *(va_arg(*args, IV*)) = i; break;
6595 #ifdef HAS_QUAD
6596                 case 'q':       *(va_arg(*args, Quad_t*)) = i; break;
6597 #endif
6598                 }
6599             }
6600             else if (svix < svmax)
6601                 sv_setuv_mg(svargs[svix++], (UV)i);
6602             continue;   /* not "break" */
6603
6604             /* UNKNOWN */
6605
6606         default:
6607       unknown:
6608             vectorize = FALSE;
6609             if (!args && ckWARN(WARN_PRINTF) &&
6610                   (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
6611                 SV *msg = sv_newmortal();
6612                 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %s: ",
6613                           (PL_op->op_type == OP_PRTF) ? "printf" : "sprintf");
6614                 if (c) {
6615                     if (isPRINT(c))
6616                         Perl_sv_catpvf(aTHX_ msg,
6617                                        "\"%%%c\"", c & 0xFF);
6618                     else
6619                         Perl_sv_catpvf(aTHX_ msg,
6620                                        "\"%%\\%03"UVof"\"",
6621                                        (UV)c & 0xFF);
6622                 } else
6623                     sv_catpv(msg, "end of string");
6624                 Perl_warner(aTHX_ WARN_PRINTF, "%"SVf, msg); /* yes, this is reentrant */
6625             }
6626
6627             /* output mangled stuff ... */
6628             if (c == '\0')
6629                 --q;
6630             eptr = p;
6631             elen = q - p;
6632
6633             /* ... right here, because formatting flags should not apply */
6634             SvGROW(sv, SvCUR(sv) + elen + 1);
6635             p = SvEND(sv);
6636             memcpy(p, eptr, elen);
6637             p += elen;
6638             *p = '\0';
6639             SvCUR(sv) = p - SvPVX(sv);
6640             continue;   /* not "break" */
6641         }
6642
6643         have = esignlen + zeros + elen;
6644         need = (have > width ? have : width);
6645         gap = need - have;
6646
6647         SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
6648         p = SvEND(sv);
6649         if (esignlen && fill == '0') {
6650             for (i = 0; i < esignlen; i++)
6651                 *p++ = esignbuf[i];
6652         }
6653         if (gap && !left) {
6654             memset(p, fill, gap);
6655             p += gap;
6656         }
6657         if (esignlen && fill != '0') {
6658             for (i = 0; i < esignlen; i++)
6659                 *p++ = esignbuf[i];
6660         }
6661         if (zeros) {
6662             for (i = zeros; i; i--)
6663                 *p++ = '0';
6664         }
6665         if (elen) {
6666             memcpy(p, eptr, elen);
6667             p += elen;
6668         }
6669         if (gap && left) {
6670             memset(p, ' ', gap);
6671             p += gap;
6672         }
6673         if (vectorize) {
6674             if (veclen) {
6675                 memcpy(p, dotstr, dotstrlen);
6676                 p += dotstrlen;
6677             }
6678             else
6679                 vectorize = FALSE;              /* done iterating over vecstr */
6680         }
6681         if (is_utf)
6682             SvUTF8_on(sv);
6683         *p = '\0';
6684         SvCUR(sv) = p - SvPVX(sv);
6685         if (vectorize) {
6686             esignlen = 0;
6687             goto vector;
6688         }
6689     }
6690 }
6691
6692 #if defined(USE_ITHREADS)
6693
6694 #if defined(USE_THREADS)
6695 #  include "error: USE_THREADS and USE_ITHREADS are incompatible"
6696 #endif
6697
6698 #ifndef GpREFCNT_inc
6699 #  define GpREFCNT_inc(gp)      ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
6700 #endif
6701
6702
6703 #define sv_dup_inc(s)   SvREFCNT_inc(sv_dup(s))
6704 #define av_dup(s)       (AV*)sv_dup((SV*)s)
6705 #define av_dup_inc(s)   (AV*)SvREFCNT_inc(sv_dup((SV*)s))
6706 #define hv_dup(s)       (HV*)sv_dup((SV*)s)
6707 #define hv_dup_inc(s)   (HV*)SvREFCNT_inc(sv_dup((SV*)s))
6708 #define cv_dup(s)       (CV*)sv_dup((SV*)s)
6709 #define cv_dup_inc(s)   (CV*)SvREFCNT_inc(sv_dup((SV*)s))
6710 #define io_dup(s)       (IO*)sv_dup((SV*)s)
6711 #define io_dup_inc(s)   (IO*)SvREFCNT_inc(sv_dup((SV*)s))
6712 #define gv_dup(s)       (GV*)sv_dup((SV*)s)
6713 #define gv_dup_inc(s)   (GV*)SvREFCNT_inc(sv_dup((SV*)s))
6714 #define SAVEPV(p)       (p ? savepv(p) : Nullch)
6715 #define SAVEPVN(p,n)    (p ? savepvn(p,n) : Nullch)
6716
6717 REGEXP *
6718 Perl_re_dup(pTHX_ REGEXP *r)
6719 {
6720     /* XXX fix when pmop->op_pmregexp becomes shared */
6721     return ReREFCNT_inc(r);
6722 }
6723
6724 PerlIO *
6725 Perl_fp_dup(pTHX_ PerlIO *fp, char type)
6726 {
6727     PerlIO *ret;
6728     if (!fp)
6729         return (PerlIO*)NULL;
6730
6731     /* look for it in the table first */
6732     ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
6733     if (ret)
6734         return ret;
6735
6736     /* create anew and remember what it is */
6737     ret = PerlIO_fdupopen(fp);
6738     ptr_table_store(PL_ptr_table, fp, ret);
6739     return ret;
6740 }
6741
6742 DIR *
6743 Perl_dirp_dup(pTHX_ DIR *dp)
6744 {
6745     if (!dp)
6746         return (DIR*)NULL;
6747     /* XXX TODO */
6748     return dp;
6749 }
6750
6751 GP *
6752 Perl_gp_dup(pTHX_ GP *gp)
6753 {
6754     GP *ret;
6755     if (!gp)
6756         return (GP*)NULL;
6757     /* look for it in the table first */
6758     ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
6759     if (ret)
6760         return ret;
6761
6762     /* create anew and remember what it is */
6763     Newz(0, ret, 1, GP);
6764     ptr_table_store(PL_ptr_table, gp, ret);
6765
6766     /* clone */
6767     ret->gp_refcnt      = 0;                    /* must be before any other dups! */
6768     ret->gp_sv          = sv_dup_inc(gp->gp_sv);
6769     ret->gp_io          = io_dup_inc(gp->gp_io);
6770     ret->gp_form        = cv_dup_inc(gp->gp_form);
6771     ret->gp_av          = av_dup_inc(gp->gp_av);
6772     ret->gp_hv          = hv_dup_inc(gp->gp_hv);
6773     ret->gp_egv         = gv_dup(gp->gp_egv);   /* GvEGV is not refcounted */
6774     ret->gp_cv          = cv_dup_inc(gp->gp_cv);
6775     ret->gp_cvgen       = gp->gp_cvgen;
6776     ret->gp_flags       = gp->gp_flags;
6777     ret->gp_line        = gp->gp_line;
6778     ret->gp_file        = gp->gp_file;          /* points to COP.cop_file */
6779     return ret;
6780 }
6781
6782 MAGIC *
6783 Perl_mg_dup(pTHX_ MAGIC *mg)
6784 {
6785     MAGIC *mgret = (MAGIC*)NULL;
6786     MAGIC *mgprev;
6787     if (!mg)
6788         return (MAGIC*)NULL;
6789     /* look for it in the table first */
6790     mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
6791     if (mgret)
6792         return mgret;
6793
6794     for (; mg; mg = mg->mg_moremagic) {
6795         MAGIC *nmg;
6796         Newz(0, nmg, 1, MAGIC);
6797         if (!mgret)
6798             mgret = nmg;
6799         else
6800             mgprev->mg_moremagic = nmg;
6801         nmg->mg_virtual = mg->mg_virtual;       /* XXX copy dynamic vtable? */
6802         nmg->mg_private = mg->mg_private;
6803         nmg->mg_type    = mg->mg_type;
6804         nmg->mg_flags   = mg->mg_flags;
6805         if (mg->mg_type == 'r') {
6806             nmg->mg_obj = (SV*)re_dup((REGEXP*)mg->mg_obj);
6807         }
6808         else {
6809             nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
6810                               ? sv_dup_inc(mg->mg_obj)
6811                               : sv_dup(mg->mg_obj);
6812         }
6813         nmg->mg_len     = mg->mg_len;
6814         nmg->mg_ptr     = mg->mg_ptr;   /* XXX random ptr? */
6815         if (mg->mg_ptr && mg->mg_type != 'g') {
6816             if (mg->mg_len >= 0) {
6817                 nmg->mg_ptr     = SAVEPVN(mg->mg_ptr, mg->mg_len);
6818                 if (mg->mg_type == 'c' && AMT_AMAGIC((AMT*)mg->mg_ptr)) {
6819                     AMT *amtp = (AMT*)mg->mg_ptr;
6820                     AMT *namtp = (AMT*)nmg->mg_ptr;
6821                     I32 i;
6822                     for (i = 1; i < NofAMmeth; i++) {
6823                         namtp->table[i] = cv_dup_inc(amtp->table[i]);
6824                     }
6825                 }
6826             }
6827             else if (mg->mg_len == HEf_SVKEY)
6828                 nmg->mg_ptr     = (char*)sv_dup_inc((SV*)mg->mg_ptr);
6829         }
6830         mgprev = nmg;
6831     }
6832     return mgret;
6833 }
6834
6835 PTR_TBL_t *
6836 Perl_ptr_table_new(pTHX)
6837 {
6838     PTR_TBL_t *tbl;
6839     Newz(0, tbl, 1, PTR_TBL_t);
6840     tbl->tbl_max        = 511;
6841     tbl->tbl_items      = 0;
6842     Newz(0, tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
6843     return tbl;
6844 }
6845
6846 void *
6847 Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, void *sv)
6848 {
6849     PTR_TBL_ENT_t *tblent;
6850     UV hash = PTR2UV(sv);
6851     assert(tbl);
6852     tblent = tbl->tbl_ary[hash & tbl->tbl_max];
6853     for (; tblent; tblent = tblent->next) {
6854         if (tblent->oldval == sv)
6855             return tblent->newval;
6856     }
6857     return (void*)NULL;
6858 }
6859
6860 void
6861 Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, void *oldv, void *newv)
6862 {
6863     PTR_TBL_ENT_t *tblent, **otblent;
6864     /* XXX this may be pessimal on platforms where pointers aren't good
6865      * hash values e.g. if they grow faster in the most significant
6866      * bits */
6867     UV hash = PTR2UV(oldv);
6868     bool i = 1;
6869
6870     assert(tbl);
6871     otblent = &tbl->tbl_ary[hash & tbl->tbl_max];
6872     for (tblent = *otblent; tblent; i=0, tblent = tblent->next) {
6873         if (tblent->oldval == oldv) {
6874             tblent->newval = newv;
6875             tbl->tbl_items++;
6876             return;
6877         }
6878     }
6879     Newz(0, tblent, 1, PTR_TBL_ENT_t);
6880     tblent->oldval = oldv;
6881     tblent->newval = newv;
6882     tblent->next = *otblent;
6883     *otblent = tblent;
6884     tbl->tbl_items++;
6885     if (i && tbl->tbl_items > tbl->tbl_max)
6886         ptr_table_split(tbl);
6887 }
6888
6889 void
6890 Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
6891 {
6892     PTR_TBL_ENT_t **ary = tbl->tbl_ary;
6893     UV oldsize = tbl->tbl_max + 1;
6894     UV newsize = oldsize * 2;
6895     UV i;
6896
6897     Renew(ary, newsize, PTR_TBL_ENT_t*);
6898     Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
6899     tbl->tbl_max = --newsize;
6900     tbl->tbl_ary = ary;
6901     for (i=0; i < oldsize; i++, ary++) {
6902         PTR_TBL_ENT_t **curentp, **entp, *ent;
6903         if (!*ary)
6904             continue;
6905         curentp = ary + oldsize;
6906         for (entp = ary, ent = *ary; ent; ent = *entp) {
6907             if ((newsize & PTR2UV(ent->oldval)) != i) {
6908                 *entp = ent->next;
6909                 ent->next = *curentp;
6910                 *curentp = ent;
6911                 continue;
6912             }
6913             else
6914                 entp = &ent->next;
6915         }
6916     }
6917 }
6918
6919 #ifdef DEBUGGING
6920 char *PL_watch_pvx;
6921 #endif
6922
6923 SV *
6924 Perl_sv_dup(pTHX_ SV *sstr)
6925 {
6926     SV *dstr;
6927
6928     if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
6929         return Nullsv;
6930     /* look for it in the table first */
6931     dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
6932     if (dstr)
6933         return dstr;
6934
6935     /* create anew and remember what it is */
6936     new_SV(dstr);
6937     ptr_table_store(PL_ptr_table, sstr, dstr);
6938
6939     /* clone */
6940     SvFLAGS(dstr)       = SvFLAGS(sstr);
6941     SvFLAGS(dstr)       &= ~SVf_OOK;            /* don't propagate OOK hack */
6942     SvREFCNT(dstr)      = 0;                    /* must be before any other dups! */
6943
6944 #ifdef DEBUGGING
6945     if (SvANY(sstr) && PL_watch_pvx && SvPVX(sstr) == PL_watch_pvx)
6946         PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
6947                       PL_watch_pvx, SvPVX(sstr));
6948 #endif
6949
6950     switch (SvTYPE(sstr)) {
6951     case SVt_NULL:
6952         SvANY(dstr)     = NULL;
6953         break;
6954     case SVt_IV:
6955         SvANY(dstr)     = new_XIV();
6956         SvIVX(dstr)     = SvIVX(sstr);
6957         break;
6958     case SVt_NV:
6959         SvANY(dstr)     = new_XNV();
6960         SvNVX(dstr)     = SvNVX(sstr);
6961         break;
6962     case SVt_RV:
6963         SvANY(dstr)     = new_XRV();
6964         SvRV(dstr)      = sv_dup_inc(SvRV(sstr));
6965         break;
6966     case SVt_PV:
6967         SvANY(dstr)     = new_XPV();
6968         SvCUR(dstr)     = SvCUR(sstr);
6969         SvLEN(dstr)     = SvLEN(sstr);
6970         if (SvROK(sstr))
6971             SvRV(dstr)  = sv_dup_inc(SvRV(sstr));
6972         else if (SvPVX(sstr) && SvLEN(sstr))
6973             SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
6974         else
6975             SvPVX(dstr) = SvPVX(sstr);          /* XXX shared string/random ptr? */
6976         break;
6977     case SVt_PVIV:
6978         SvANY(dstr)     = new_XPVIV();
6979         SvCUR(dstr)     = SvCUR(sstr);
6980         SvLEN(dstr)     = SvLEN(sstr);
6981         SvIVX(dstr)     = SvIVX(sstr);
6982         if (SvROK(sstr))
6983             SvRV(dstr)  = sv_dup_inc(SvRV(sstr));
6984         else if (SvPVX(sstr) && SvLEN(sstr))
6985             SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
6986         else
6987             SvPVX(dstr) = SvPVX(sstr);          /* XXX shared string/random ptr? */
6988         break;
6989     case SVt_PVNV:
6990         SvANY(dstr)     = new_XPVNV();
6991         SvCUR(dstr)     = SvCUR(sstr);
6992         SvLEN(dstr)     = SvLEN(sstr);
6993         SvIVX(dstr)     = SvIVX(sstr);
6994         SvNVX(dstr)     = SvNVX(sstr);
6995         if (SvROK(sstr))
6996             SvRV(dstr)  = sv_dup_inc(SvRV(sstr));
6997         else if (SvPVX(sstr) && SvLEN(sstr))
6998             SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
6999         else
7000             SvPVX(dstr) = SvPVX(sstr);          /* XXX shared string/random ptr? */
7001         break;
7002     case SVt_PVMG:
7003         SvANY(dstr)     = new_XPVMG();
7004         SvCUR(dstr)     = SvCUR(sstr);
7005         SvLEN(dstr)     = SvLEN(sstr);
7006         SvIVX(dstr)     = SvIVX(sstr);
7007         SvNVX(dstr)     = SvNVX(sstr);
7008         SvMAGIC(dstr)   = mg_dup(SvMAGIC(sstr));
7009         SvSTASH(dstr)   = hv_dup_inc(SvSTASH(sstr));
7010         if (SvROK(sstr))
7011             SvRV(dstr)  = sv_dup_inc(SvRV(sstr));
7012         else if (SvPVX(sstr) && SvLEN(sstr))
7013             SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
7014         else
7015             SvPVX(dstr) = SvPVX(sstr);          /* XXX shared string/random ptr? */
7016         break;
7017     case SVt_PVBM:
7018         SvANY(dstr)     = new_XPVBM();
7019         SvCUR(dstr)     = SvCUR(sstr);
7020         SvLEN(dstr)     = SvLEN(sstr);
7021         SvIVX(dstr)     = SvIVX(sstr);
7022         SvNVX(dstr)     = SvNVX(sstr);
7023         SvMAGIC(dstr)   = mg_dup(SvMAGIC(sstr));
7024         SvSTASH(dstr)   = hv_dup_inc(SvSTASH(sstr));
7025         if (SvROK(sstr))
7026             SvRV(dstr)  = sv_dup_inc(SvRV(sstr));
7027         else if (SvPVX(sstr) && SvLEN(sstr))
7028             SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
7029         else
7030             SvPVX(dstr) = SvPVX(sstr);          /* XXX shared string/random ptr? */
7031         BmRARE(dstr)    = BmRARE(sstr);
7032         BmUSEFUL(dstr)  = BmUSEFUL(sstr);
7033         BmPREVIOUS(dstr)= BmPREVIOUS(sstr);
7034         break;
7035     case SVt_PVLV:
7036         SvANY(dstr)     = new_XPVLV();
7037         SvCUR(dstr)     = SvCUR(sstr);
7038         SvLEN(dstr)     = SvLEN(sstr);
7039         SvIVX(dstr)     = SvIVX(sstr);
7040         SvNVX(dstr)     = SvNVX(sstr);
7041         SvMAGIC(dstr)   = mg_dup(SvMAGIC(sstr));
7042         SvSTASH(dstr)   = hv_dup_inc(SvSTASH(sstr));
7043         if (SvROK(sstr))
7044             SvRV(dstr)  = sv_dup_inc(SvRV(sstr));
7045         else if (SvPVX(sstr) && SvLEN(sstr))
7046             SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
7047         else
7048             SvPVX(dstr) = SvPVX(sstr);          /* XXX shared string/random ptr? */
7049         LvTARGOFF(dstr) = LvTARGOFF(sstr);      /* XXX sometimes holds PMOP* when DEBUGGING */
7050         LvTARGLEN(dstr) = LvTARGLEN(sstr);
7051         LvTARG(dstr)    = sv_dup_inc(LvTARG(sstr));
7052         LvTYPE(dstr)    = LvTYPE(sstr);
7053         break;
7054     case SVt_PVGV:
7055         SvANY(dstr)     = new_XPVGV();
7056         SvCUR(dstr)     = SvCUR(sstr);
7057         SvLEN(dstr)     = SvLEN(sstr);
7058         SvIVX(dstr)     = SvIVX(sstr);
7059         SvNVX(dstr)     = SvNVX(sstr);
7060         SvMAGIC(dstr)   = mg_dup(SvMAGIC(sstr));
7061         SvSTASH(dstr)   = hv_dup_inc(SvSTASH(sstr));
7062         if (SvROK(sstr))
7063             SvRV(dstr)  = sv_dup_inc(SvRV(sstr));
7064         else if (SvPVX(sstr) && SvLEN(sstr))
7065             SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
7066         else
7067             SvPVX(dstr) = SvPVX(sstr);          /* XXX shared string/random ptr? */
7068         GvNAMELEN(dstr) = GvNAMELEN(sstr);
7069         GvNAME(dstr)    = SAVEPVN(GvNAME(sstr), GvNAMELEN(sstr));
7070         GvSTASH(dstr)   = hv_dup_inc(GvSTASH(sstr));
7071         GvFLAGS(dstr)   = GvFLAGS(sstr);
7072         GvGP(dstr)      = gp_dup(GvGP(sstr));
7073         (void)GpREFCNT_inc(GvGP(dstr));
7074         break;
7075     case SVt_PVIO:
7076         SvANY(dstr)     = new_XPVIO();
7077         SvCUR(dstr)     = SvCUR(sstr);
7078         SvLEN(dstr)     = SvLEN(sstr);
7079         SvIVX(dstr)     = SvIVX(sstr);
7080         SvNVX(dstr)     = SvNVX(sstr);
7081         SvMAGIC(dstr)   = mg_dup(SvMAGIC(sstr));
7082         SvSTASH(dstr)   = hv_dup_inc(SvSTASH(sstr));
7083         if (SvROK(sstr))
7084             SvRV(dstr)  = sv_dup_inc(SvRV(sstr));
7085         else if (SvPVX(sstr) && SvLEN(sstr))
7086             SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
7087         else
7088             SvPVX(dstr) = SvPVX(sstr);          /* XXX shared string/random ptr? */
7089         IoIFP(dstr)     = fp_dup(IoIFP(sstr), IoTYPE(sstr));
7090         if (IoOFP(sstr) == IoIFP(sstr))
7091             IoOFP(dstr) = IoIFP(dstr);
7092         else
7093             IoOFP(dstr) = fp_dup(IoOFP(sstr), IoTYPE(sstr));
7094         /* PL_rsfp_filters entries have fake IoDIRP() */
7095         if (IoDIRP(sstr) && !(IoFLAGS(sstr) & IOf_FAKE_DIRP))
7096             IoDIRP(dstr)        = dirp_dup(IoDIRP(sstr));
7097         else
7098             IoDIRP(dstr)        = IoDIRP(sstr);
7099         IoLINES(dstr)           = IoLINES(sstr);
7100         IoPAGE(dstr)            = IoPAGE(sstr);
7101         IoPAGE_LEN(dstr)        = IoPAGE_LEN(sstr);
7102         IoLINES_LEFT(dstr)      = IoLINES_LEFT(sstr);
7103         IoTOP_NAME(dstr)        = SAVEPV(IoTOP_NAME(sstr));
7104         IoTOP_GV(dstr)          = gv_dup(IoTOP_GV(sstr));
7105         IoFMT_NAME(dstr)        = SAVEPV(IoFMT_NAME(sstr));
7106         IoFMT_GV(dstr)          = gv_dup(IoFMT_GV(sstr));
7107         IoBOTTOM_NAME(dstr)     = SAVEPV(IoBOTTOM_NAME(sstr));
7108         IoBOTTOM_GV(dstr)       = gv_dup(IoBOTTOM_GV(sstr));
7109         IoSUBPROCESS(dstr)      = IoSUBPROCESS(sstr);
7110         IoTYPE(dstr)            = IoTYPE(sstr);
7111         IoFLAGS(dstr)           = IoFLAGS(sstr);
7112         break;
7113     case SVt_PVAV:
7114         SvANY(dstr)     = new_XPVAV();
7115         SvCUR(dstr)     = SvCUR(sstr);
7116         SvLEN(dstr)     = SvLEN(sstr);
7117         SvIVX(dstr)     = SvIVX(sstr);
7118         SvNVX(dstr)     = SvNVX(sstr);
7119         SvMAGIC(dstr)   = mg_dup(SvMAGIC(sstr));
7120         SvSTASH(dstr)   = hv_dup_inc(SvSTASH(sstr));
7121         AvARYLEN((AV*)dstr) = sv_dup_inc(AvARYLEN((AV*)sstr));
7122         AvFLAGS((AV*)dstr) = AvFLAGS((AV*)sstr);
7123         if (AvARRAY((AV*)sstr)) {
7124             SV **dst_ary, **src_ary;
7125             SSize_t items = AvFILLp((AV*)sstr) + 1;
7126
7127             src_ary = AvARRAY((AV*)sstr);
7128             Newz(0, dst_ary, AvMAX((AV*)sstr)+1, SV*);
7129             ptr_table_store(PL_ptr_table, src_ary, dst_ary);
7130             SvPVX(dstr) = (char*)dst_ary;
7131             AvALLOC((AV*)dstr) = dst_ary;
7132             if (AvREAL((AV*)sstr)) {
7133                 while (items-- > 0)
7134                     *dst_ary++ = sv_dup_inc(*src_ary++);
7135             }
7136             else {
7137                 while (items-- > 0)
7138                     *dst_ary++ = sv_dup(*src_ary++);
7139             }
7140             items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
7141             while (items-- > 0) {
7142                 *dst_ary++ = &PL_sv_undef;
7143             }
7144         }
7145         else {
7146             SvPVX(dstr)         = Nullch;
7147             AvALLOC((AV*)dstr)  = (SV**)NULL;
7148         }
7149         break;
7150     case SVt_PVHV:
7151         SvANY(dstr)     = new_XPVHV();
7152         SvCUR(dstr)     = SvCUR(sstr);
7153         SvLEN(dstr)     = SvLEN(sstr);
7154         SvIVX(dstr)     = SvIVX(sstr);
7155         SvNVX(dstr)     = SvNVX(sstr);
7156         SvMAGIC(dstr)   = mg_dup(SvMAGIC(sstr));
7157         SvSTASH(dstr)   = hv_dup_inc(SvSTASH(sstr));
7158         HvRITER((HV*)dstr)      = HvRITER((HV*)sstr);
7159         if (HvARRAY((HV*)sstr)) {
7160             STRLEN i = 0;
7161             XPVHV *dxhv = (XPVHV*)SvANY(dstr);
7162             XPVHV *sxhv = (XPVHV*)SvANY(sstr);
7163             Newz(0, dxhv->xhv_array,
7164                  PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1), char);
7165             while (i <= sxhv->xhv_max) {
7166                 ((HE**)dxhv->xhv_array)[i] = he_dup(((HE**)sxhv->xhv_array)[i],
7167                                                     !!HvSHAREKEYS(sstr));
7168                 ++i;
7169             }
7170             dxhv->xhv_eiter = he_dup(sxhv->xhv_eiter, !!HvSHAREKEYS(sstr));
7171         }
7172         else {
7173             SvPVX(dstr)         = Nullch;
7174             HvEITER((HV*)dstr)  = (HE*)NULL;
7175         }
7176         HvPMROOT((HV*)dstr)     = HvPMROOT((HV*)sstr);          /* XXX */
7177         HvNAME((HV*)dstr)       = SAVEPV(HvNAME((HV*)sstr));
7178         break;
7179     case SVt_PVFM:
7180         SvANY(dstr)     = new_XPVFM();
7181         FmLINES(dstr)   = FmLINES(sstr);
7182         goto dup_pvcv;
7183         /* NOTREACHED */
7184     case SVt_PVCV:
7185         SvANY(dstr)     = new_XPVCV();
7186 dup_pvcv:
7187         SvCUR(dstr)     = SvCUR(sstr);
7188         SvLEN(dstr)     = SvLEN(sstr);
7189         SvIVX(dstr)     = SvIVX(sstr);
7190         SvNVX(dstr)     = SvNVX(sstr);
7191         SvMAGIC(dstr)   = mg_dup(SvMAGIC(sstr));
7192         SvSTASH(dstr)   = hv_dup_inc(SvSTASH(sstr));
7193         if (SvPVX(sstr) && SvLEN(sstr))
7194             SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
7195         else
7196             SvPVX(dstr) = SvPVX(sstr);          /* XXX shared string/random ptr? */
7197         CvSTASH(dstr)   = hv_dup(CvSTASH(sstr));/* NOTE: not refcounted */
7198         CvSTART(dstr)   = CvSTART(sstr);
7199         CvROOT(dstr)    = OpREFCNT_inc(CvROOT(sstr));
7200         CvXSUB(dstr)    = CvXSUB(sstr);
7201         CvXSUBANY(dstr) = CvXSUBANY(sstr);
7202         CvGV(dstr)      = gv_dup_inc(CvGV(sstr));
7203         CvDEPTH(dstr)   = CvDEPTH(sstr);
7204         if (CvPADLIST(sstr) && !AvREAL(CvPADLIST(sstr))) {
7205             /* XXX padlists are real, but pretend to be not */
7206             AvREAL_on(CvPADLIST(sstr));
7207             CvPADLIST(dstr)     = av_dup_inc(CvPADLIST(sstr));
7208             AvREAL_off(CvPADLIST(sstr));
7209             AvREAL_off(CvPADLIST(dstr));
7210         }
7211         else
7212             CvPADLIST(dstr)     = av_dup_inc(CvPADLIST(sstr));
7213         CvOUTSIDE(dstr) = cv_dup_inc(CvOUTSIDE(sstr));
7214         CvFLAGS(dstr)   = CvFLAGS(sstr);
7215         break;
7216     default:
7217         Perl_croak(aTHX_ "Bizarre SvTYPE [%d]", SvTYPE(sstr));
7218         break;
7219     }
7220
7221     if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
7222         ++PL_sv_objcount;
7223
7224     return dstr;
7225 }
7226
7227 PERL_CONTEXT *
7228 Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max)
7229 {
7230     PERL_CONTEXT *ncxs;
7231
7232     if (!cxs)
7233         return (PERL_CONTEXT*)NULL;
7234
7235     /* look for it in the table first */
7236     ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
7237     if (ncxs)
7238         return ncxs;
7239
7240     /* create anew and remember what it is */
7241     Newz(56, ncxs, max + 1, PERL_CONTEXT);
7242     ptr_table_store(PL_ptr_table, cxs, ncxs);
7243
7244     while (ix >= 0) {
7245         PERL_CONTEXT *cx = &cxs[ix];
7246         PERL_CONTEXT *ncx = &ncxs[ix];
7247         ncx->cx_type    = cx->cx_type;
7248         if (CxTYPE(cx) == CXt_SUBST) {
7249             Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
7250         }
7251         else {
7252             ncx->blk_oldsp      = cx->blk_oldsp;
7253             ncx->blk_oldcop     = cx->blk_oldcop;
7254             ncx->blk_oldretsp   = cx->blk_oldretsp;
7255             ncx->blk_oldmarksp  = cx->blk_oldmarksp;
7256             ncx->blk_oldscopesp = cx->blk_oldscopesp;
7257             ncx->blk_oldpm      = cx->blk_oldpm;
7258             ncx->blk_gimme      = cx->blk_gimme;
7259             switch (CxTYPE(cx)) {
7260             case CXt_SUB:
7261                 ncx->blk_sub.cv         = (cx->blk_sub.olddepth == 0
7262                                            ? cv_dup_inc(cx->blk_sub.cv)
7263                                            : cv_dup(cx->blk_sub.cv));
7264                 ncx->blk_sub.argarray   = (cx->blk_sub.hasargs
7265                                            ? av_dup_inc(cx->blk_sub.argarray)
7266                                            : Nullav);
7267                 ncx->blk_sub.savearray  = av_dup(cx->blk_sub.savearray);
7268                 ncx->blk_sub.olddepth   = cx->blk_sub.olddepth;
7269                 ncx->blk_sub.hasargs    = cx->blk_sub.hasargs;
7270                 ncx->blk_sub.lval       = cx->blk_sub.lval;
7271                 break;
7272             case CXt_EVAL:
7273                 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
7274                 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
7275                 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv);
7276                 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
7277                 ncx->blk_eval.cur_text  = sv_dup(cx->blk_eval.cur_text);
7278                 break;
7279             case CXt_LOOP:
7280                 ncx->blk_loop.label     = cx->blk_loop.label;
7281                 ncx->blk_loop.resetsp   = cx->blk_loop.resetsp;
7282                 ncx->blk_loop.redo_op   = cx->blk_loop.redo_op;
7283                 ncx->blk_loop.next_op   = cx->blk_loop.next_op;
7284                 ncx->blk_loop.last_op   = cx->blk_loop.last_op;
7285                 ncx->blk_loop.iterdata  = (CxPADLOOP(cx)
7286                                            ? cx->blk_loop.iterdata
7287                                            : gv_dup((GV*)cx->blk_loop.iterdata));
7288                 ncx->blk_loop.oldcurpad
7289                     = (SV**)ptr_table_fetch(PL_ptr_table,
7290                                             cx->blk_loop.oldcurpad);
7291                 ncx->blk_loop.itersave  = sv_dup_inc(cx->blk_loop.itersave);
7292                 ncx->blk_loop.iterlval  = sv_dup_inc(cx->blk_loop.iterlval);
7293                 ncx->blk_loop.iterary   = av_dup_inc(cx->blk_loop.iterary);
7294                 ncx->blk_loop.iterix    = cx->blk_loop.iterix;
7295                 ncx->blk_loop.itermax   = cx->blk_loop.itermax;
7296                 break;
7297             case CXt_FORMAT:
7298                 ncx->blk_sub.cv         = cv_dup(cx->blk_sub.cv);
7299                 ncx->blk_sub.gv         = gv_dup(cx->blk_sub.gv);
7300                 ncx->blk_sub.dfoutgv    = gv_dup_inc(cx->blk_sub.dfoutgv);
7301                 ncx->blk_sub.hasargs    = cx->blk_sub.hasargs;
7302                 break;
7303             case CXt_BLOCK:
7304             case CXt_NULL:
7305                 break;
7306             }
7307         }
7308         --ix;
7309     }
7310     return ncxs;
7311 }
7312
7313 PERL_SI *
7314 Perl_si_dup(pTHX_ PERL_SI *si)
7315 {
7316     PERL_SI *nsi;
7317
7318     if (!si)
7319         return (PERL_SI*)NULL;
7320
7321     /* look for it in the table first */
7322     nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
7323     if (nsi)
7324         return nsi;
7325
7326     /* create anew and remember what it is */
7327     Newz(56, nsi, 1, PERL_SI);
7328     ptr_table_store(PL_ptr_table, si, nsi);
7329
7330     nsi->si_stack       = av_dup_inc(si->si_stack);
7331     nsi->si_cxix        = si->si_cxix;
7332     nsi->si_cxmax       = si->si_cxmax;
7333     nsi->si_cxstack     = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax);
7334     nsi->si_type        = si->si_type;
7335     nsi->si_prev        = si_dup(si->si_prev);
7336     nsi->si_next        = si_dup(si->si_next);
7337     nsi->si_markoff     = si->si_markoff;
7338
7339     return nsi;
7340 }
7341
7342 #define POPINT(ss,ix)   ((ss)[--(ix)].any_i32)
7343 #define TOPINT(ss,ix)   ((ss)[ix].any_i32)
7344 #define POPLONG(ss,ix)  ((ss)[--(ix)].any_long)
7345 #define TOPLONG(ss,ix)  ((ss)[ix].any_long)
7346 #define POPIV(ss,ix)    ((ss)[--(ix)].any_iv)
7347 #define TOPIV(ss,ix)    ((ss)[ix].any_iv)
7348 #define POPPTR(ss,ix)   ((ss)[--(ix)].any_ptr)
7349 #define TOPPTR(ss,ix)   ((ss)[ix].any_ptr)
7350 #define POPDPTR(ss,ix)  ((ss)[--(ix)].any_dptr)
7351 #define TOPDPTR(ss,ix)  ((ss)[ix].any_dptr)
7352 #define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
7353 #define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
7354
7355 /* XXXXX todo */
7356 #define pv_dup_inc(p)   SAVEPV(p)
7357 #define pv_dup(p)       SAVEPV(p)
7358 #define svp_dup_inc(p,pp)       any_dup(p,pp)
7359
7360 void *
7361 Perl_any_dup(pTHX_ void *v, PerlInterpreter *proto_perl)
7362 {
7363     void *ret;
7364
7365     if (!v)
7366         return (void*)NULL;
7367
7368     /* look for it in the table first */
7369     ret = ptr_table_fetch(PL_ptr_table, v);
7370     if (ret)
7371         return ret;
7372
7373     /* see if it is part of the interpreter structure */
7374     if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
7375         ret = (void*)(((char*)aTHXo) + (((char*)v) - (char*)proto_perl));
7376     else
7377         ret = v;
7378
7379     return ret;
7380 }
7381
7382 ANY *
7383 Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl)
7384 {
7385     ANY *ss     = proto_perl->Tsavestack;
7386     I32 ix      = proto_perl->Tsavestack_ix;
7387     I32 max     = proto_perl->Tsavestack_max;
7388     ANY *nss;
7389     SV *sv;
7390     GV *gv;
7391     AV *av;
7392     HV *hv;
7393     void* ptr;
7394     int intval;
7395     long longval;
7396     GP *gp;
7397     IV iv;
7398     I32 i;
7399     char *c;
7400     void (*dptr) (void*);
7401     void (*dxptr) (pTHXo_ void*);
7402     OP *o;
7403
7404     Newz(54, nss, max, ANY);
7405
7406     while (ix > 0) {
7407         i = POPINT(ss,ix);
7408         TOPINT(nss,ix) = i;
7409         switch (i) {
7410         case SAVEt_ITEM:                        /* normal string */
7411             sv = (SV*)POPPTR(ss,ix);
7412             TOPPTR(nss,ix) = sv_dup_inc(sv);
7413             sv = (SV*)POPPTR(ss,ix);
7414             TOPPTR(nss,ix) = sv_dup_inc(sv);
7415             break;
7416         case SAVEt_SV:                          /* scalar reference */
7417             sv = (SV*)POPPTR(ss,ix);
7418             TOPPTR(nss,ix) = sv_dup_inc(sv);
7419             gv = (GV*)POPPTR(ss,ix);
7420             TOPPTR(nss,ix) = gv_dup_inc(gv);
7421             break;
7422         case SAVEt_GENERIC_PVREF:               /* generic char* */
7423             c = (char*)POPPTR(ss,ix);
7424             TOPPTR(nss,ix) = pv_dup(c);
7425             ptr = POPPTR(ss,ix);
7426             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
7427             break;
7428         case SAVEt_GENERIC_SVREF:               /* generic sv */
7429         case SAVEt_SVREF:                       /* scalar reference */
7430             sv = (SV*)POPPTR(ss,ix);
7431             TOPPTR(nss,ix) = sv_dup_inc(sv);
7432             ptr = POPPTR(ss,ix);
7433             TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
7434             break;
7435         case SAVEt_AV:                          /* array reference */
7436             av = (AV*)POPPTR(ss,ix);
7437             TOPPTR(nss,ix) = av_dup_inc(av);
7438             gv = (GV*)POPPTR(ss,ix);
7439             TOPPTR(nss,ix) = gv_dup(gv);
7440             break;
7441         case SAVEt_HV:                          /* hash reference */
7442             hv = (HV*)POPPTR(ss,ix);
7443             TOPPTR(nss,ix) = hv_dup_inc(hv);
7444             gv = (GV*)POPPTR(ss,ix);
7445             TOPPTR(nss,ix) = gv_dup(gv);
7446             break;
7447         case SAVEt_INT:                         /* int reference */
7448             ptr = POPPTR(ss,ix);
7449             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
7450             intval = (int)POPINT(ss,ix);
7451             TOPINT(nss,ix) = intval;
7452             break;
7453         case SAVEt_LONG:                        /* long reference */
7454             ptr = POPPTR(ss,ix);
7455             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
7456             longval = (long)POPLONG(ss,ix);
7457             TOPLONG(nss,ix) = longval;
7458             break;
7459         case SAVEt_I32:                         /* I32 reference */
7460         case SAVEt_I16:                         /* I16 reference */
7461         case SAVEt_I8:                          /* I8 reference */
7462             ptr = POPPTR(ss,ix);
7463             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
7464             i = POPINT(ss,ix);
7465             TOPINT(nss,ix) = i;
7466             break;
7467         case SAVEt_IV:                          /* IV reference */
7468             ptr = POPPTR(ss,ix);
7469             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
7470             iv = POPIV(ss,ix);
7471             TOPIV(nss,ix) = iv;
7472             break;
7473         case SAVEt_SPTR:                        /* SV* reference */
7474             ptr = POPPTR(ss,ix);
7475             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
7476             sv = (SV*)POPPTR(ss,ix);
7477             TOPPTR(nss,ix) = sv_dup(sv);
7478             break;
7479         case SAVEt_VPTR:                        /* random* reference */
7480             ptr = POPPTR(ss,ix);
7481             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
7482             ptr = POPPTR(ss,ix);
7483             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
7484             break;
7485         case SAVEt_PPTR:                        /* char* reference */
7486             ptr = POPPTR(ss,ix);
7487             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
7488             c = (char*)POPPTR(ss,ix);
7489             TOPPTR(nss,ix) = pv_dup(c);
7490             break;
7491         case SAVEt_HPTR:                        /* HV* reference */
7492             ptr = POPPTR(ss,ix);
7493             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
7494             hv = (HV*)POPPTR(ss,ix);
7495             TOPPTR(nss,ix) = hv_dup(hv);
7496             break;
7497         case SAVEt_APTR:                        /* AV* reference */
7498             ptr = POPPTR(ss,ix);
7499             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
7500             av = (AV*)POPPTR(ss,ix);
7501             TOPPTR(nss,ix) = av_dup(av);
7502             break;
7503         case SAVEt_NSTAB:
7504             gv = (GV*)POPPTR(ss,ix);
7505             TOPPTR(nss,ix) = gv_dup(gv);
7506             break;
7507         case SAVEt_GP:                          /* scalar reference */
7508             gp = (GP*)POPPTR(ss,ix);
7509             TOPPTR(nss,ix) = gp = gp_dup(gp);
7510             (void)GpREFCNT_inc(gp);
7511             gv = (GV*)POPPTR(ss,ix);
7512             TOPPTR(nss,ix) = gv_dup_inc(c);
7513             c = (char*)POPPTR(ss,ix);
7514             TOPPTR(nss,ix) = pv_dup(c);
7515             iv = POPIV(ss,ix);
7516             TOPIV(nss,ix) = iv;
7517             iv = POPIV(ss,ix);
7518             TOPIV(nss,ix) = iv;
7519             break;
7520         case SAVEt_FREESV:
7521             sv = (SV*)POPPTR(ss,ix);
7522             TOPPTR(nss,ix) = sv_dup_inc(sv);
7523             break;
7524         case SAVEt_FREEOP:
7525             ptr = POPPTR(ss,ix);
7526             if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
7527                 /* these are assumed to be refcounted properly */
7528                 switch (((OP*)ptr)->op_type) {
7529                 case OP_LEAVESUB:
7530                 case OP_LEAVESUBLV:
7531                 case OP_LEAVEEVAL:
7532                 case OP_LEAVE:
7533                 case OP_SCOPE:
7534                 case OP_LEAVEWRITE:
7535                     TOPPTR(nss,ix) = ptr;
7536                     o = (OP*)ptr;
7537                     OpREFCNT_inc(o);
7538                     break;
7539                 default:
7540                     TOPPTR(nss,ix) = Nullop;
7541                     break;
7542                 }
7543             }
7544             else
7545                 TOPPTR(nss,ix) = Nullop;
7546             break;
7547         case SAVEt_FREEPV:
7548             c = (char*)POPPTR(ss,ix);
7549             TOPPTR(nss,ix) = pv_dup_inc(c);
7550             break;
7551         case SAVEt_CLEARSV:
7552             longval = POPLONG(ss,ix);
7553             TOPLONG(nss,ix) = longval;
7554             break;
7555         case SAVEt_DELETE:
7556             hv = (HV*)POPPTR(ss,ix);
7557             TOPPTR(nss,ix) = hv_dup_inc(hv);
7558             c = (char*)POPPTR(ss,ix);
7559             TOPPTR(nss,ix) = pv_dup_inc(c);
7560             i = POPINT(ss,ix);
7561             TOPINT(nss,ix) = i;
7562             break;
7563         case SAVEt_DESTRUCTOR:
7564             ptr = POPPTR(ss,ix);
7565             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);  /* XXX quite arbitrary */
7566             dptr = POPDPTR(ss,ix);
7567             TOPDPTR(nss,ix) = (void (*)(void*))any_dup((void *)dptr, proto_perl);
7568             break;
7569         case SAVEt_DESTRUCTOR_X:
7570             ptr = POPPTR(ss,ix);
7571             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);  /* XXX quite arbitrary */
7572             dxptr = POPDXPTR(ss,ix);
7573             TOPDXPTR(nss,ix) = (void (*)(pTHXo_ void*))any_dup((void *)dxptr, proto_perl);
7574             break;
7575         case SAVEt_REGCONTEXT:
7576         case SAVEt_ALLOC:
7577             i = POPINT(ss,ix);
7578             TOPINT(nss,ix) = i;
7579             ix -= i;
7580             break;
7581         case SAVEt_STACK_POS:           /* Position on Perl stack */
7582             i = POPINT(ss,ix);
7583             TOPINT(nss,ix) = i;
7584             break;
7585         case SAVEt_AELEM:               /* array element */
7586             sv = (SV*)POPPTR(ss,ix);
7587             TOPPTR(nss,ix) = sv_dup_inc(sv);
7588             i = POPINT(ss,ix);
7589             TOPINT(nss,ix) = i;
7590             av = (AV*)POPPTR(ss,ix);
7591             TOPPTR(nss,ix) = av_dup_inc(av);
7592             break;
7593         case SAVEt_HELEM:               /* hash element */
7594             sv = (SV*)POPPTR(ss,ix);
7595             TOPPTR(nss,ix) = sv_dup_inc(sv);
7596             sv = (SV*)POPPTR(ss,ix);
7597             TOPPTR(nss,ix) = sv_dup_inc(sv);
7598             hv = (HV*)POPPTR(ss,ix);
7599             TOPPTR(nss,ix) = hv_dup_inc(hv);
7600             break;
7601         case SAVEt_OP:
7602             ptr = POPPTR(ss,ix);
7603             TOPPTR(nss,ix) = ptr;
7604             break;
7605         case SAVEt_HINTS:
7606             i = POPINT(ss,ix);
7607             TOPINT(nss,ix) = i;
7608             break;
7609         case SAVEt_COMPPAD:
7610             av = (AV*)POPPTR(ss,ix);
7611             TOPPTR(nss,ix) = av_dup(av);
7612             break;
7613         default:
7614             Perl_croak(aTHX_ "panic: ss_dup inconsistency");
7615         }
7616     }
7617
7618     return nss;
7619 }
7620
7621 #ifdef PERL_OBJECT
7622 #include "XSUB.h"
7623 #endif
7624
7625 PerlInterpreter *
7626 perl_clone(PerlInterpreter *proto_perl, UV flags)
7627 {
7628 #ifdef PERL_OBJECT
7629     CPerlObj *pPerl = (CPerlObj*)proto_perl;
7630 #endif
7631
7632 #ifdef PERL_IMPLICIT_SYS
7633     return perl_clone_using(proto_perl, flags,
7634                             proto_perl->IMem,
7635                             proto_perl->IMemShared,
7636                             proto_perl->IMemParse,
7637                             proto_perl->IEnv,
7638                             proto_perl->IStdIO,
7639                             proto_perl->ILIO,
7640                             proto_perl->IDir,
7641                             proto_perl->ISock,
7642                             proto_perl->IProc);
7643 }
7644
7645 PerlInterpreter *
7646 perl_clone_using(PerlInterpreter *proto_perl, UV flags,
7647                  struct IPerlMem* ipM, struct IPerlMem* ipMS,
7648                  struct IPerlMem* ipMP, struct IPerlEnv* ipE,
7649                  struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
7650                  struct IPerlDir* ipD, struct IPerlSock* ipS,
7651                  struct IPerlProc* ipP)
7652 {
7653     /* XXX many of the string copies here can be optimized if they're
7654      * constants; they need to be allocated as common memory and just
7655      * their pointers copied. */
7656
7657     IV i;
7658 #  ifdef PERL_OBJECT
7659     CPerlObj *pPerl = new(ipM) CPerlObj(ipM, ipMS, ipMP, ipE, ipStd, ipLIO,
7660                                         ipD, ipS, ipP);
7661     PERL_SET_THX(pPerl);
7662 #  else         /* !PERL_OBJECT */
7663     PerlInterpreter *my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
7664     PERL_SET_THX(my_perl);
7665
7666 #    ifdef DEBUGGING
7667     memset(my_perl, 0xab, sizeof(PerlInterpreter));
7668     PL_markstack = 0;
7669     PL_scopestack = 0;
7670     PL_savestack = 0;
7671     PL_retstack = 0;
7672 #    else       /* !DEBUGGING */
7673     Zero(my_perl, 1, PerlInterpreter);
7674 #    endif      /* DEBUGGING */
7675
7676     /* host pointers */
7677     PL_Mem              = ipM;
7678     PL_MemShared        = ipMS;
7679     PL_MemParse         = ipMP;
7680     PL_Env              = ipE;
7681     PL_StdIO            = ipStd;
7682     PL_LIO              = ipLIO;
7683     PL_Dir              = ipD;
7684     PL_Sock             = ipS;
7685     PL_Proc             = ipP;
7686 #  endif        /* PERL_OBJECT */
7687 #else           /* !PERL_IMPLICIT_SYS */
7688     IV i;
7689     PerlInterpreter *my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
7690     PERL_SET_THX(my_perl);
7691
7692 #    ifdef DEBUGGING
7693     memset(my_perl, 0xab, sizeof(PerlInterpreter));
7694     PL_markstack = 0;
7695     PL_scopestack = 0;
7696     PL_savestack = 0;
7697     PL_retstack = 0;
7698 #    else       /* !DEBUGGING */
7699     Zero(my_perl, 1, PerlInterpreter);
7700 #    endif      /* DEBUGGING */
7701 #endif          /* PERL_IMPLICIT_SYS */
7702
7703     /* arena roots */
7704     PL_xiv_arenaroot    = NULL;
7705     PL_xiv_root         = NULL;
7706     PL_xnv_arenaroot    = NULL;
7707     PL_xnv_root         = NULL;
7708     PL_xrv_arenaroot    = NULL;
7709     PL_xrv_root         = NULL;
7710     PL_xpv_arenaroot    = NULL;
7711     PL_xpv_root         = NULL;
7712     PL_xpviv_arenaroot  = NULL;
7713     PL_xpviv_root       = NULL;
7714     PL_xpvnv_arenaroot  = NULL;
7715     PL_xpvnv_root       = NULL;
7716     PL_xpvcv_arenaroot  = NULL;
7717     PL_xpvcv_root       = NULL;
7718     PL_xpvav_arenaroot  = NULL;
7719     PL_xpvav_root       = NULL;
7720     PL_xpvhv_arenaroot  = NULL;
7721     PL_xpvhv_root       = NULL;
7722     PL_xpvmg_arenaroot  = NULL;
7723     PL_xpvmg_root       = NULL;
7724     PL_xpvlv_arenaroot  = NULL;
7725     PL_xpvlv_root       = NULL;
7726     PL_xpvbm_arenaroot  = NULL;
7727     PL_xpvbm_root       = NULL;
7728     PL_he_arenaroot     = NULL;
7729     PL_he_root          = NULL;
7730     PL_nice_chunk       = NULL;
7731     PL_nice_chunk_size  = 0;
7732     PL_sv_count         = 0;
7733     PL_sv_objcount      = 0;
7734     PL_sv_root          = Nullsv;
7735     PL_sv_arenaroot     = Nullsv;
7736
7737     PL_debug            = proto_perl->Idebug;
7738
7739     /* create SV map for pointer relocation */
7740     PL_ptr_table = ptr_table_new();
7741
7742     /* initialize these special pointers as early as possible */
7743     SvANY(&PL_sv_undef)         = NULL;
7744     SvREFCNT(&PL_sv_undef)      = (~(U32)0)/2;
7745     SvFLAGS(&PL_sv_undef)       = SVf_READONLY|SVt_NULL;
7746     ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
7747
7748 #ifdef PERL_OBJECT
7749     SvUPGRADE(&PL_sv_no, SVt_PVNV);
7750 #else
7751     SvANY(&PL_sv_no)            = new_XPVNV();
7752 #endif
7753     SvREFCNT(&PL_sv_no)         = (~(U32)0)/2;
7754     SvFLAGS(&PL_sv_no)          = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
7755     SvPVX(&PL_sv_no)            = SAVEPVN(PL_No, 0);
7756     SvCUR(&PL_sv_no)            = 0;
7757     SvLEN(&PL_sv_no)            = 1;
7758     SvNVX(&PL_sv_no)            = 0;
7759     ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
7760
7761 #ifdef PERL_OBJECT
7762     SvUPGRADE(&PL_sv_yes, SVt_PVNV);
7763 #else
7764     SvANY(&PL_sv_yes)           = new_XPVNV();
7765 #endif
7766     SvREFCNT(&PL_sv_yes)        = (~(U32)0)/2;
7767     SvFLAGS(&PL_sv_yes)         = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
7768     SvPVX(&PL_sv_yes)           = SAVEPVN(PL_Yes, 1);
7769     SvCUR(&PL_sv_yes)           = 1;
7770     SvLEN(&PL_sv_yes)           = 2;
7771     SvNVX(&PL_sv_yes)           = 1;
7772     ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
7773
7774     /* create shared string table */
7775     PL_strtab           = newHV();
7776     HvSHAREKEYS_off(PL_strtab);
7777     hv_ksplit(PL_strtab, 512);
7778     ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
7779
7780     PL_compiling                = proto_perl->Icompiling;
7781     PL_compiling.cop_stashpv    = SAVEPV(PL_compiling.cop_stashpv);
7782     PL_compiling.cop_file       = SAVEPV(PL_compiling.cop_file);
7783     ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
7784     if (!specialWARN(PL_compiling.cop_warnings))
7785         PL_compiling.cop_warnings = sv_dup_inc(PL_compiling.cop_warnings);
7786     PL_curcop           = (COP*)any_dup(proto_perl->Tcurcop, proto_perl);
7787
7788     /* pseudo environmental stuff */
7789     PL_origargc         = proto_perl->Iorigargc;
7790     i = PL_origargc;
7791     New(0, PL_origargv, i+1, char*);
7792     PL_origargv[i] = '\0';
7793     while (i-- > 0) {
7794         PL_origargv[i]  = SAVEPV(proto_perl->Iorigargv[i]);
7795     }
7796     PL_envgv            = gv_dup(proto_perl->Ienvgv);
7797     PL_incgv            = gv_dup(proto_perl->Iincgv);
7798     PL_hintgv           = gv_dup(proto_perl->Ihintgv);
7799     PL_origfilename     = SAVEPV(proto_perl->Iorigfilename);
7800     PL_diehook          = sv_dup_inc(proto_perl->Idiehook);
7801     PL_warnhook         = sv_dup_inc(proto_perl->Iwarnhook);
7802
7803     /* switches */
7804     PL_minus_c          = proto_perl->Iminus_c;
7805     PL_patchlevel       = sv_dup_inc(proto_perl->Ipatchlevel);
7806     PL_localpatches     = proto_perl->Ilocalpatches;
7807     PL_splitstr         = proto_perl->Isplitstr;
7808     PL_preprocess       = proto_perl->Ipreprocess;
7809     PL_minus_n          = proto_perl->Iminus_n;
7810     PL_minus_p          = proto_perl->Iminus_p;
7811     PL_minus_l          = proto_perl->Iminus_l;
7812     PL_minus_a          = proto_perl->Iminus_a;
7813     PL_minus_F          = proto_perl->Iminus_F;
7814     PL_doswitches       = proto_perl->Idoswitches;
7815     PL_dowarn           = proto_perl->Idowarn;
7816     PL_doextract        = proto_perl->Idoextract;
7817     PL_sawampersand     = proto_perl->Isawampersand;
7818     PL_unsafe           = proto_perl->Iunsafe;
7819     PL_inplace          = SAVEPV(proto_perl->Iinplace);
7820     PL_e_script         = sv_dup_inc(proto_perl->Ie_script);
7821     PL_perldb           = proto_perl->Iperldb;
7822     PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
7823
7824     /* magical thingies */
7825     /* XXX time(&PL_basetime) when asked for? */
7826     PL_basetime         = proto_perl->Ibasetime;
7827     PL_formfeed         = sv_dup(proto_perl->Iformfeed);
7828
7829     PL_maxsysfd         = proto_perl->Imaxsysfd;
7830     PL_multiline        = proto_perl->Imultiline;
7831     PL_statusvalue      = proto_perl->Istatusvalue;
7832 #ifdef VMS
7833     PL_statusvalue_vms  = proto_perl->Istatusvalue_vms;
7834 #endif
7835
7836     /* shortcuts to various I/O objects */
7837     PL_stdingv          = gv_dup(proto_perl->Istdingv);
7838     PL_stderrgv         = gv_dup(proto_perl->Istderrgv);
7839     PL_defgv            = gv_dup(proto_perl->Idefgv);
7840     PL_argvgv           = gv_dup(proto_perl->Iargvgv);
7841     PL_argvoutgv        = gv_dup(proto_perl->Iargvoutgv);
7842     PL_argvout_stack    = av_dup(proto_perl->Iargvout_stack);
7843
7844     /* shortcuts to regexp stuff */
7845     PL_replgv           = gv_dup(proto_perl->Ireplgv);
7846
7847     /* shortcuts to misc objects */
7848     PL_errgv            = gv_dup(proto_perl->Ierrgv);
7849
7850     /* shortcuts to debugging objects */
7851     PL_DBgv             = gv_dup(proto_perl->IDBgv);
7852     PL_DBline           = gv_dup(proto_perl->IDBline);
7853     PL_DBsub            = gv_dup(proto_perl->IDBsub);
7854     PL_DBsingle         = sv_dup(proto_perl->IDBsingle);
7855     PL_DBtrace          = sv_dup(proto_perl->IDBtrace);
7856     PL_DBsignal         = sv_dup(proto_perl->IDBsignal);
7857     PL_lineary          = av_dup(proto_perl->Ilineary);
7858     PL_dbargs           = av_dup(proto_perl->Idbargs);
7859
7860     /* symbol tables */
7861     PL_defstash         = hv_dup_inc(proto_perl->Tdefstash);
7862     PL_curstash         = hv_dup(proto_perl->Tcurstash);
7863     PL_debstash         = hv_dup(proto_perl->Idebstash);
7864     PL_globalstash      = hv_dup(proto_perl->Iglobalstash);
7865     PL_curstname        = sv_dup_inc(proto_perl->Icurstname);
7866
7867     PL_beginav          = av_dup_inc(proto_perl->Ibeginav);
7868     PL_endav            = av_dup_inc(proto_perl->Iendav);
7869     PL_checkav          = av_dup_inc(proto_perl->Icheckav);
7870     PL_initav           = av_dup_inc(proto_perl->Iinitav);
7871
7872     PL_sub_generation   = proto_perl->Isub_generation;
7873
7874     /* funky return mechanisms */
7875     PL_forkprocess      = proto_perl->Iforkprocess;
7876
7877     /* subprocess state */
7878     PL_fdpid            = av_dup_inc(proto_perl->Ifdpid);
7879
7880     /* internal state */
7881     PL_tainting         = proto_perl->Itainting;
7882     PL_maxo             = proto_perl->Imaxo;
7883     if (proto_perl->Iop_mask)
7884         PL_op_mask      = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
7885     else
7886         PL_op_mask      = Nullch;
7887
7888     /* current interpreter roots */
7889     PL_main_cv          = cv_dup_inc(proto_perl->Imain_cv);
7890     PL_main_root        = OpREFCNT_inc(proto_perl->Imain_root);
7891     PL_main_start       = proto_perl->Imain_start;
7892     PL_eval_root        = proto_perl->Ieval_root;
7893     PL_eval_start       = proto_perl->Ieval_start;
7894
7895     /* runtime control stuff */
7896     PL_curcopdb         = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
7897     PL_copline          = proto_perl->Icopline;
7898
7899     PL_filemode         = proto_perl->Ifilemode;
7900     PL_lastfd           = proto_perl->Ilastfd;
7901     PL_oldname          = proto_perl->Ioldname;         /* XXX not quite right */
7902     PL_Argv             = NULL;
7903     PL_Cmd              = Nullch;
7904     PL_gensym           = proto_perl->Igensym;
7905     PL_preambled        = proto_perl->Ipreambled;
7906     PL_preambleav       = av_dup_inc(proto_perl->Ipreambleav);
7907     PL_laststatval      = proto_perl->Ilaststatval;
7908     PL_laststype        = proto_perl->Ilaststype;
7909     PL_mess_sv          = Nullsv;
7910
7911     PL_orslen           = proto_perl->Iorslen;
7912     PL_ors              = SAVEPVN(proto_perl->Iors, PL_orslen);
7913     PL_ofmt             = SAVEPV(proto_perl->Iofmt);
7914
7915     /* interpreter atexit processing */
7916     PL_exitlistlen      = proto_perl->Iexitlistlen;
7917     if (PL_exitlistlen) {
7918         New(0, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
7919         Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
7920     }
7921     else
7922         PL_exitlist     = (PerlExitListEntry*)NULL;
7923     PL_modglobal        = hv_dup_inc(proto_perl->Imodglobal);
7924
7925     PL_profiledata      = NULL;
7926     PL_rsfp             = fp_dup(proto_perl->Irsfp, '<');
7927     /* PL_rsfp_filters entries have fake IoDIRP() */
7928     PL_rsfp_filters     = av_dup_inc(proto_perl->Irsfp_filters);
7929
7930     PL_compcv                   = cv_dup(proto_perl->Icompcv);
7931     PL_comppad                  = av_dup(proto_perl->Icomppad);
7932     PL_comppad_name             = av_dup(proto_perl->Icomppad_name);
7933     PL_comppad_name_fill        = proto_perl->Icomppad_name_fill;
7934     PL_comppad_name_floor       = proto_perl->Icomppad_name_floor;
7935     PL_curpad                   = (SV**)ptr_table_fetch(PL_ptr_table,
7936                                                         proto_perl->Tcurpad);
7937
7938 #ifdef HAVE_INTERP_INTERN
7939     sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
7940 #endif
7941
7942     /* more statics moved here */
7943     PL_generation       = proto_perl->Igeneration;
7944     PL_DBcv             = cv_dup(proto_perl->IDBcv);
7945
7946     PL_in_clean_objs    = proto_perl->Iin_clean_objs;
7947     PL_in_clean_all     = proto_perl->Iin_clean_all;
7948
7949     PL_uid              = proto_perl->Iuid;
7950     PL_euid             = proto_perl->Ieuid;
7951     PL_gid              = proto_perl->Igid;
7952     PL_egid             = proto_perl->Iegid;
7953     PL_nomemok          = proto_perl->Inomemok;
7954     PL_an               = proto_perl->Ian;
7955     PL_cop_seqmax       = proto_perl->Icop_seqmax;
7956     PL_op_seqmax        = proto_perl->Iop_seqmax;
7957     PL_evalseq          = proto_perl->Ievalseq;
7958     PL_origenviron      = proto_perl->Iorigenviron;     /* XXX not quite right */
7959     PL_origalen         = proto_perl->Iorigalen;
7960     PL_pidstatus        = newHV();                      /* XXX flag for cloning? */
7961     PL_osname           = SAVEPV(proto_perl->Iosname);
7962     PL_sh_path          = SAVEPV(proto_perl->Ish_path);
7963     PL_sighandlerp      = proto_perl->Isighandlerp;
7964
7965
7966     PL_runops           = proto_perl->Irunops;
7967
7968     Copy(proto_perl->Itokenbuf, PL_tokenbuf, 256, char);
7969
7970 #ifdef CSH
7971     PL_cshlen           = proto_perl->Icshlen;
7972     PL_cshname          = SAVEPVN(proto_perl->Icshname, PL_cshlen);
7973 #endif
7974
7975     PL_lex_state        = proto_perl->Ilex_state;
7976     PL_lex_defer        = proto_perl->Ilex_defer;
7977     PL_lex_expect       = proto_perl->Ilex_expect;
7978     PL_lex_formbrack    = proto_perl->Ilex_formbrack;
7979     PL_lex_dojoin       = proto_perl->Ilex_dojoin;
7980     PL_lex_starts       = proto_perl->Ilex_starts;
7981     PL_lex_stuff        = sv_dup_inc(proto_perl->Ilex_stuff);
7982     PL_lex_repl         = sv_dup_inc(proto_perl->Ilex_repl);
7983     PL_lex_op           = proto_perl->Ilex_op;
7984     PL_lex_inpat        = proto_perl->Ilex_inpat;
7985     PL_lex_inwhat       = proto_perl->Ilex_inwhat;
7986     PL_lex_brackets     = proto_perl->Ilex_brackets;
7987     i = (PL_lex_brackets < 120 ? 120 : PL_lex_brackets);
7988     PL_lex_brackstack   = SAVEPVN(proto_perl->Ilex_brackstack,i);
7989     PL_lex_casemods     = proto_perl->Ilex_casemods;
7990     i = (PL_lex_casemods < 12 ? 12 : PL_lex_casemods);
7991     PL_lex_casestack    = SAVEPVN(proto_perl->Ilex_casestack,i);
7992
7993     Copy(proto_perl->Inextval, PL_nextval, 5, YYSTYPE);
7994     Copy(proto_perl->Inexttype, PL_nexttype, 5, I32);
7995     PL_nexttoke         = proto_perl->Inexttoke;
7996
7997     PL_linestr          = sv_dup_inc(proto_perl->Ilinestr);
7998     i = proto_perl->Ibufptr - SvPVX(proto_perl->Ilinestr);
7999     PL_bufptr           = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
8000     i = proto_perl->Ioldbufptr - SvPVX(proto_perl->Ilinestr);
8001     PL_oldbufptr        = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
8002     i = proto_perl->Ioldoldbufptr - SvPVX(proto_perl->Ilinestr);
8003     PL_oldoldbufptr     = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
8004     PL_bufend           = SvPVX(PL_linestr) + SvCUR(PL_linestr);
8005     i = proto_perl->Ilinestart - SvPVX(proto_perl->Ilinestr);
8006     PL_linestart        = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
8007     PL_pending_ident    = proto_perl->Ipending_ident;
8008     PL_sublex_info      = proto_perl->Isublex_info;     /* XXX not quite right */
8009
8010     PL_expect           = proto_perl->Iexpect;
8011
8012     PL_multi_start      = proto_perl->Imulti_start;
8013     PL_multi_end        = proto_perl->Imulti_end;
8014     PL_multi_open       = proto_perl->Imulti_open;
8015     PL_multi_close      = proto_perl->Imulti_close;
8016
8017     PL_error_count      = proto_perl->Ierror_count;
8018     PL_subline          = proto_perl->Isubline;
8019     PL_subname          = sv_dup_inc(proto_perl->Isubname);
8020
8021     PL_min_intro_pending        = proto_perl->Imin_intro_pending;
8022     PL_max_intro_pending        = proto_perl->Imax_intro_pending;
8023     PL_padix                    = proto_perl->Ipadix;
8024     PL_padix_floor              = proto_perl->Ipadix_floor;
8025     PL_pad_reset_pending        = proto_perl->Ipad_reset_pending;
8026
8027     i = proto_perl->Ilast_uni - SvPVX(proto_perl->Ilinestr);
8028     PL_last_uni         = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
8029     i = proto_perl->Ilast_lop - SvPVX(proto_perl->Ilinestr);
8030     PL_last_lop         = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
8031     PL_last_lop_op      = proto_perl->Ilast_lop_op;
8032     PL_in_my            = proto_perl->Iin_my;
8033     PL_in_my_stash      = hv_dup(proto_perl->Iin_my_stash);
8034 #ifdef FCRYPT
8035     PL_cryptseen        = proto_perl->Icryptseen;
8036 #endif
8037
8038     PL_hints            = proto_perl->Ihints;
8039
8040     PL_amagic_generation        = proto_perl->Iamagic_generation;
8041
8042 #ifdef USE_LOCALE_COLLATE
8043     PL_collation_ix     = proto_perl->Icollation_ix;
8044     PL_collation_name   = SAVEPV(proto_perl->Icollation_name);
8045     PL_collation_standard       = proto_perl->Icollation_standard;
8046     PL_collxfrm_base    = proto_perl->Icollxfrm_base;
8047     PL_collxfrm_mult    = proto_perl->Icollxfrm_mult;
8048 #endif /* USE_LOCALE_COLLATE */
8049
8050 #ifdef USE_LOCALE_NUMERIC
8051     PL_numeric_name     = SAVEPV(proto_perl->Inumeric_name);
8052     PL_numeric_standard = proto_perl->Inumeric_standard;
8053     PL_numeric_local    = proto_perl->Inumeric_local;
8054     PL_numeric_radix    = proto_perl->Inumeric_radix;
8055 #endif /* !USE_LOCALE_NUMERIC */
8056
8057     /* utf8 character classes */
8058     PL_utf8_alnum       = sv_dup_inc(proto_perl->Iutf8_alnum);
8059     PL_utf8_alnumc      = sv_dup_inc(proto_perl->Iutf8_alnumc);
8060     PL_utf8_ascii       = sv_dup_inc(proto_perl->Iutf8_ascii);
8061     PL_utf8_alpha       = sv_dup_inc(proto_perl->Iutf8_alpha);
8062     PL_utf8_space       = sv_dup_inc(proto_perl->Iutf8_space);
8063     PL_utf8_cntrl       = sv_dup_inc(proto_perl->Iutf8_cntrl);
8064     PL_utf8_graph       = sv_dup_inc(proto_perl->Iutf8_graph);
8065     PL_utf8_digit       = sv_dup_inc(proto_perl->Iutf8_digit);
8066     PL_utf8_upper       = sv_dup_inc(proto_perl->Iutf8_upper);
8067     PL_utf8_lower       = sv_dup_inc(proto_perl->Iutf8_lower);
8068     PL_utf8_print       = sv_dup_inc(proto_perl->Iutf8_print);
8069     PL_utf8_punct       = sv_dup_inc(proto_perl->Iutf8_punct);
8070     PL_utf8_xdigit      = sv_dup_inc(proto_perl->Iutf8_xdigit);
8071     PL_utf8_mark        = sv_dup_inc(proto_perl->Iutf8_mark);
8072     PL_utf8_toupper     = sv_dup_inc(proto_perl->Iutf8_toupper);
8073     PL_utf8_totitle     = sv_dup_inc(proto_perl->Iutf8_totitle);
8074     PL_utf8_tolower     = sv_dup_inc(proto_perl->Iutf8_tolower);
8075
8076     /* swatch cache */
8077     PL_last_swash_hv    = Nullhv;       /* reinits on demand */
8078     PL_last_swash_klen  = 0;
8079     PL_last_swash_key[0]= '\0';
8080     PL_last_swash_tmps  = (U8*)NULL;
8081     PL_last_swash_slen  = 0;
8082
8083     /* perly.c globals */
8084     PL_yydebug          = proto_perl->Iyydebug;
8085     PL_yynerrs          = proto_perl->Iyynerrs;
8086     PL_yyerrflag        = proto_perl->Iyyerrflag;
8087     PL_yychar           = proto_perl->Iyychar;
8088     PL_yyval            = proto_perl->Iyyval;
8089     PL_yylval           = proto_perl->Iyylval;
8090
8091     PL_glob_index       = proto_perl->Iglob_index;
8092     PL_srand_called     = proto_perl->Isrand_called;
8093     PL_uudmap['M']      = 0;            /* reinits on demand */
8094     PL_bitcount         = Nullch;       /* reinits on demand */
8095
8096     if (proto_perl->Ipsig_ptr) {
8097         int sig_num[] = { SIG_NUM };
8098         Newz(0, PL_psig_ptr, sizeof(sig_num)/sizeof(*sig_num), SV*);
8099         Newz(0, PL_psig_name, sizeof(sig_num)/sizeof(*sig_num), SV*);
8100         for (i = 1; PL_sig_name[i]; i++) {
8101             PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i]);
8102             PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i]);
8103         }
8104     }
8105     else {
8106         PL_psig_ptr     = (SV**)NULL;
8107         PL_psig_name    = (SV**)NULL;
8108     }
8109
8110     /* thrdvar.h stuff */
8111
8112     if (flags & 1) {
8113         /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
8114         PL_tmps_ix              = proto_perl->Ttmps_ix;
8115         PL_tmps_max             = proto_perl->Ttmps_max;
8116         PL_tmps_floor           = proto_perl->Ttmps_floor;
8117         Newz(50, PL_tmps_stack, PL_tmps_max, SV*);
8118         i = 0;
8119         while (i <= PL_tmps_ix) {
8120             PL_tmps_stack[i]    = sv_dup_inc(proto_perl->Ttmps_stack[i]);
8121             ++i;
8122         }
8123
8124         /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
8125         i = proto_perl->Tmarkstack_max - proto_perl->Tmarkstack;
8126         Newz(54, PL_markstack, i, I32);
8127         PL_markstack_max        = PL_markstack + (proto_perl->Tmarkstack_max
8128                                                   - proto_perl->Tmarkstack);
8129         PL_markstack_ptr        = PL_markstack + (proto_perl->Tmarkstack_ptr
8130                                                   - proto_perl->Tmarkstack);
8131         Copy(proto_perl->Tmarkstack, PL_markstack,
8132              PL_markstack_ptr - PL_markstack + 1, I32);
8133
8134         /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
8135          * NOTE: unlike the others! */
8136         PL_scopestack_ix        = proto_perl->Tscopestack_ix;
8137         PL_scopestack_max       = proto_perl->Tscopestack_max;
8138         Newz(54, PL_scopestack, PL_scopestack_max, I32);
8139         Copy(proto_perl->Tscopestack, PL_scopestack, PL_scopestack_ix, I32);
8140
8141         /* next push_return() sets PL_retstack[PL_retstack_ix]
8142          * NOTE: unlike the others! */
8143         PL_retstack_ix          = proto_perl->Tretstack_ix;
8144         PL_retstack_max         = proto_perl->Tretstack_max;
8145         Newz(54, PL_retstack, PL_retstack_max, OP*);
8146         Copy(proto_perl->Tretstack, PL_retstack, PL_retstack_ix, I32);
8147
8148         /* NOTE: si_dup() looks at PL_markstack */
8149         PL_curstackinfo         = si_dup(proto_perl->Tcurstackinfo);
8150
8151         /* PL_curstack          = PL_curstackinfo->si_stack; */
8152         PL_curstack             = av_dup(proto_perl->Tcurstack);
8153         PL_mainstack            = av_dup(proto_perl->Tmainstack);
8154
8155         /* next PUSHs() etc. set *(PL_stack_sp+1) */
8156         PL_stack_base           = AvARRAY(PL_curstack);
8157         PL_stack_sp             = PL_stack_base + (proto_perl->Tstack_sp
8158                                                    - proto_perl->Tstack_base);
8159         PL_stack_max            = PL_stack_base + AvMAX(PL_curstack);
8160
8161         /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
8162          * NOTE: unlike the others! */
8163         PL_savestack_ix         = proto_perl->Tsavestack_ix;
8164         PL_savestack_max        = proto_perl->Tsavestack_max;
8165         /*Newz(54, PL_savestack, PL_savestack_max, ANY);*/
8166         PL_savestack            = ss_dup(proto_perl);
8167     }
8168     else {
8169         init_stacks();
8170         ENTER;                  /* perl_destruct() wants to LEAVE; */
8171     }
8172
8173     PL_start_env        = proto_perl->Tstart_env;       /* XXXXXX */
8174     PL_top_env          = &PL_start_env;
8175
8176     PL_op               = proto_perl->Top;
8177
8178     PL_Sv               = Nullsv;
8179     PL_Xpv              = (XPV*)NULL;
8180     PL_na               = proto_perl->Tna;
8181
8182     PL_statbuf          = proto_perl->Tstatbuf;
8183     PL_statcache        = proto_perl->Tstatcache;
8184     PL_statgv           = gv_dup(proto_perl->Tstatgv);
8185     PL_statname         = sv_dup_inc(proto_perl->Tstatname);
8186 #ifdef HAS_TIMES
8187     PL_timesbuf         = proto_perl->Ttimesbuf;
8188 #endif
8189
8190     PL_tainted          = proto_perl->Ttainted;
8191     PL_curpm            = proto_perl->Tcurpm;   /* XXX No PMOP ref count */
8192     PL_nrs              = sv_dup_inc(proto_perl->Tnrs);
8193     PL_rs               = sv_dup_inc(proto_perl->Trs);
8194     PL_last_in_gv       = gv_dup(proto_perl->Tlast_in_gv);
8195     PL_ofslen           = proto_perl->Tofslen;
8196     PL_ofs              = SAVEPVN(proto_perl->Tofs, PL_ofslen);
8197     PL_defoutgv         = gv_dup_inc(proto_perl->Tdefoutgv);
8198     PL_chopset          = proto_perl->Tchopset; /* XXX never deallocated */
8199     PL_toptarget        = sv_dup_inc(proto_perl->Ttoptarget);
8200     PL_bodytarget       = sv_dup_inc(proto_perl->Tbodytarget);
8201     PL_formtarget       = sv_dup(proto_perl->Tformtarget);
8202
8203     PL_restartop        = proto_perl->Trestartop;
8204     PL_in_eval          = proto_perl->Tin_eval;
8205     PL_delaymagic       = proto_perl->Tdelaymagic;
8206     PL_dirty            = proto_perl->Tdirty;
8207     PL_localizing       = proto_perl->Tlocalizing;
8208
8209 #ifdef PERL_FLEXIBLE_EXCEPTIONS
8210     PL_protect          = proto_perl->Tprotect;
8211 #endif
8212     PL_errors           = sv_dup_inc(proto_perl->Terrors);
8213     PL_av_fetch_sv      = Nullsv;
8214     PL_hv_fetch_sv      = Nullsv;
8215     Zero(&PL_hv_fetch_ent_mh, 1, HE);                   /* XXX */
8216     PL_modcount         = proto_perl->Tmodcount;
8217     PL_lastgotoprobe    = Nullop;
8218     PL_dumpindent       = proto_perl->Tdumpindent;
8219
8220     PL_sortcop          = (OP*)any_dup(proto_perl->Tsortcop, proto_perl);
8221     PL_sortstash        = hv_dup(proto_perl->Tsortstash);
8222     PL_firstgv          = gv_dup(proto_perl->Tfirstgv);
8223     PL_secondgv         = gv_dup(proto_perl->Tsecondgv);
8224     PL_sortcxix         = proto_perl->Tsortcxix;
8225     PL_efloatbuf        = Nullch;               /* reinits on demand */
8226     PL_efloatsize       = 0;                    /* reinits on demand */
8227
8228     /* regex stuff */
8229
8230     PL_screamfirst      = NULL;
8231     PL_screamnext       = NULL;
8232     PL_maxscream        = -1;                   /* reinits on demand */
8233     PL_lastscream       = Nullsv;
8234
8235     PL_watchaddr        = NULL;
8236     PL_watchok          = Nullch;
8237
8238     PL_regdummy         = proto_perl->Tregdummy;
8239     PL_regcomp_parse    = Nullch;
8240     PL_regxend          = Nullch;
8241     PL_regcode          = (regnode*)NULL;
8242     PL_regnaughty       = 0;
8243     PL_regsawback       = 0;
8244     PL_regprecomp       = Nullch;
8245     PL_regnpar          = 0;
8246     PL_regsize          = 0;
8247     PL_regflags         = 0;
8248     PL_regseen          = 0;
8249     PL_seen_zerolen     = 0;
8250     PL_seen_evals       = 0;
8251     PL_regcomp_rx       = (regexp*)NULL;
8252     PL_extralen         = 0;
8253     PL_colorset         = 0;            /* reinits PL_colors[] */
8254     /*PL_colors[6]      = {0,0,0,0,0,0};*/
8255     PL_reg_whilem_seen  = 0;
8256     PL_reginput         = Nullch;
8257     PL_regbol           = Nullch;
8258     PL_regeol           = Nullch;
8259     PL_regstartp        = (I32*)NULL;
8260     PL_regendp          = (I32*)NULL;
8261     PL_reglastparen     = (U32*)NULL;
8262     PL_regtill          = Nullch;
8263     PL_regprev          = '\n';
8264     PL_reg_start_tmp    = (char**)NULL;
8265     PL_reg_start_tmpl   = 0;
8266     PL_regdata          = (struct reg_data*)NULL;
8267     PL_bostr            = Nullch;
8268     PL_reg_flags        = 0;
8269     PL_reg_eval_set     = 0;
8270     PL_regnarrate       = 0;
8271     PL_regprogram       = (regnode*)NULL;
8272     PL_regindent        = 0;
8273     PL_regcc            = (CURCUR*)NULL;
8274     PL_reg_call_cc      = (struct re_cc_state*)NULL;
8275     PL_reg_re           = (regexp*)NULL;
8276     PL_reg_ganch        = Nullch;
8277     PL_reg_sv           = Nullsv;
8278     PL_reg_magic        = (MAGIC*)NULL;
8279     PL_reg_oldpos       = 0;
8280     PL_reg_oldcurpm     = (PMOP*)NULL;
8281     PL_reg_curpm        = (PMOP*)NULL;
8282     PL_reg_oldsaved     = Nullch;
8283     PL_reg_oldsavedlen  = 0;
8284     PL_reg_maxiter      = 0;
8285     PL_reg_leftiter     = 0;
8286     PL_reg_poscache     = Nullch;
8287     PL_reg_poscache_size= 0;
8288
8289     /* RE engine - function pointers */
8290     PL_regcompp         = proto_perl->Tregcompp;
8291     PL_regexecp         = proto_perl->Tregexecp;
8292     PL_regint_start     = proto_perl->Tregint_start;
8293     PL_regint_string    = proto_perl->Tregint_string;
8294     PL_regfree          = proto_perl->Tregfree;
8295
8296     PL_reginterp_cnt    = 0;
8297     PL_reg_starttry     = 0;
8298
8299 #ifdef PERL_OBJECT
8300     return (PerlInterpreter*)pPerl;
8301 #else
8302     return my_perl;
8303 #endif
8304 }
8305
8306 #else   /* !USE_ITHREADS */
8307
8308 #ifdef PERL_OBJECT
8309 #include "XSUB.h"
8310 #endif
8311
8312 #endif /* USE_ITHREADS */
8313
8314 static void
8315 do_report_used(pTHXo_ SV *sv)
8316 {
8317     if (SvTYPE(sv) != SVTYPEMASK) {
8318         PerlIO_printf(Perl_debug_log, "****\n");
8319         sv_dump(sv);
8320     }
8321 }
8322
8323 static void
8324 do_clean_objs(pTHXo_ SV *sv)
8325 {
8326     SV* rv;
8327
8328     if (SvROK(sv) && SvOBJECT(rv = SvRV(sv))) {
8329         DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(sv));)
8330         if (SvWEAKREF(sv)) {
8331             sv_del_backref(sv);
8332             SvWEAKREF_off(sv);
8333             SvRV(sv) = 0;
8334         } else {
8335             SvROK_off(sv);
8336             SvRV(sv) = 0;
8337             SvREFCNT_dec(rv);
8338         }
8339     }
8340
8341     /* XXX Might want to check arrays, etc. */
8342 }
8343
8344 #ifndef DISABLE_DESTRUCTOR_KLUDGE
8345 static void
8346 do_clean_named_objs(pTHXo_ SV *sv)
8347 {
8348     if (SvTYPE(sv) == SVt_PVGV && GvGP(sv)) {
8349         if ( SvOBJECT(GvSV(sv)) ||
8350              (GvAV(sv) && SvOBJECT(GvAV(sv))) ||
8351              (GvHV(sv) && SvOBJECT(GvHV(sv))) ||
8352              (GvIO(sv) && SvOBJECT(GvIO(sv))) ||
8353              (GvCV(sv) && SvOBJECT(GvCV(sv))) )
8354         {
8355             DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning named glob object:\n "), sv_dump(sv));)
8356             SvREFCNT_dec(sv);
8357         }
8358     }
8359 }
8360 #endif
8361
8362 static void
8363 do_clean_all(pTHXo_ SV *sv)
8364 {
8365     DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%"UVxf"\n", PTR2UV(sv)) );)
8366     SvFLAGS(sv) |= SVf_BREAK;
8367     SvREFCNT_dec(sv);
8368 }
8369