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