Add -hiertype option to xsubpp for easier mapping C++ with namespaces.
[p5sagit/p5-mst-13.2.git] / sv.c
1 /*    sv.c
2  *
3  *    Copyright (c) 1991-2002, 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  * "I wonder what the Entish is for 'yes' and 'no'," he thought.
9  *
10  *
11  * This file contains the code that creates, manipulates and destroys
12  * scalar values (SVs). The other types (AV, HV, GV, etc.) reuse the
13  * structure of an SV, so their creation and destruction is handled
14  * here; higher-level functions are in av.c, hv.c, and so on. Opcode
15  * level functions (eg. substr, split, join) for each of the types are
16  * in the pp*.c files.
17  */
18
19 #include "EXTERN.h"
20 #define PERL_IN_SV_C
21 #include "perl.h"
22 #include "regcomp.h"
23
24 #define FCALL *f
25 #define SV_CHECK_THINKFIRST(sv) if (SvTHINKFIRST(sv)) sv_force_normal(sv)
26
27
28 /* ============================================================================
29
30 =head1 Allocation and deallocation of SVs.
31
32 An SV (or AV, HV, etc.) is allocated in two parts: the head (struct sv,
33 av, hv...) contains type and reference count information, as well as a
34 pointer to the body (struct xrv, xpv, xpviv...), which contains fields
35 specific to each type.
36
37 Normally, this allocation is done using arenas, which are approximately
38 1K chunks of memory parcelled up into N heads or bodies. The first slot
39 in each arena is reserved, and is used to hold a link to the next arena.
40 In the case of heads, the unused first slot also contains some flags and
41 a note of the number of slots.  Snaked through each arena chain is a
42 linked list of free items; when this becomes empty, an extra arena is
43 allocated and divided up into N items which are threaded into the free
44 list.
45
46 The following global variables are associated with arenas:
47
48     PL_sv_arenaroot     pointer to list of SV arenas
49     PL_sv_root          pointer to list of free SV structures
50
51     PL_foo_arenaroot    pointer to list of foo arenas,
52     PL_foo_root         pointer to list of free foo bodies
53                             ... for foo in xiv, xnv, xrv, xpv etc.
54
55 Note that some of the larger and more rarely used body types (eg xpvio)
56 are not allocated using arenas, but are instead just malloc()/free()ed as
57 required. Also, if PURIFY is defined, arenas are abandoned altogether,
58 with all items individually malloc()ed. In addition, a few SV heads are
59 not allocated from an arena, but are instead directly created as static
60 or auto variables, eg PL_sv_undef.
61
62 The SV arena serves the secondary purpose of allowing still-live SVs
63 to be located and destroyed during final cleanup.
64
65 At the lowest level, the macros new_SV() and del_SV() grab and free
66 an SV head.  (If debugging with -DD, del_SV() calls the function S_del_sv()
67 to return the SV to the free list with error checking.) new_SV() calls
68 more_sv() / sv_add_arena() to add an extra arena if the free list is empty.
69 SVs in the free list have their SvTYPE field set to all ones.
70
71 Similarly, there are macros new_XIV()/del_XIV(), new_XNV()/del_XNV() etc
72 that allocate and return individual body types. Normally these are mapped
73 to the arena-manipulating functions new_xiv()/del_xiv() etc, but may be
74 instead mapped directly to malloc()/free() if PURIFY is defined. The
75 new/del functions remove from, or add to, the appropriate PL_foo_root
76 list, and call more_xiv() etc to add a new arena if the list is empty.
77
78 At the time of very final cleanup, sv_free_arenas() is called from
79 perl_destruct() to physically free all the arenas allocated since the
80 start of the interpreter.  Note that this also clears PL_he_arenaroot,
81 which is otherwise dealt with in hv.c.
82
83 Manipulation of any of the PL_*root pointers is protected by enclosing
84 LOCK_SV_MUTEX; ... UNLOCK_SV_MUTEX calls which should Do the Right Thing
85 if threads are enabled.
86
87 The function visit() scans the SV arenas list, and calls a specified
88 function for each SV it finds which is still live - ie which has an SvTYPE
89 other than all 1's, and a non-zero SvREFCNT. visit() is used by the
90 following functions (specified as [function that calls visit()] / [function
91 called by visit() for each SV]):
92
93     sv_report_used() / do_report_used()
94                         dump all remaining SVs (debugging aid)
95
96     sv_clean_objs() / do_clean_objs(),do_clean_named_objs()
97                         Attempt to free all objects pointed to by RVs,
98                         and, unless DISABLE_DESTRUCTOR_KLUDGE is defined,
99                         try to do the same for all objects indirectly
100                         referenced by typeglobs too.  Called once from
101                         perl_destruct(), prior to calling sv_clean_all()
102                         below.
103
104     sv_clean_all() / do_clean_all()
105                         SvREFCNT_dec(sv) each remaining SV, possibly
106                         triggering an sv_free(). It also sets the
107                         SVf_BREAK flag on the SV to indicate that the
108                         refcnt has been artificially lowered, and thus
109                         stopping sv_free() from giving spurious warnings
110                         about SVs which unexpectedly have a refcnt
111                         of zero.  called repeatedly from perl_destruct()
112                         until there are no SVs left.
113
114 =head2 Summary
115
116 Private API to rest of sv.c
117
118     new_SV(),  del_SV(),
119
120     new_XIV(), del_XIV(),
121     new_XNV(), del_XNV(),
122     etc
123
124 Public API:
125
126     sv_report_used(), sv_clean_objs(), sv_clean_all(), sv_free_arenas()
127
128
129 =cut
130
131 ============================================================================ */
132
133
134
135 /*
136  * "A time to plant, and a time to uproot what was planted..."
137  */
138
139 #define plant_SV(p) \
140     STMT_START {                                        \
141         SvANY(p) = (void *)PL_sv_root;                  \
142         SvFLAGS(p) = SVTYPEMASK;                        \
143         PL_sv_root = (p);                               \
144         --PL_sv_count;                                  \
145     } STMT_END
146
147 /* sv_mutex must be held while calling uproot_SV() */
148 #define uproot_SV(p) \
149     STMT_START {                                        \
150         (p) = PL_sv_root;                               \
151         PL_sv_root = (SV*)SvANY(p);                     \
152         ++PL_sv_count;                                  \
153     } STMT_END
154
155
156 /* new_SV(): return a new, empty SV head */
157
158 #define new_SV(p) \
159     STMT_START {                                        \
160         LOCK_SV_MUTEX;                                  \
161         if (PL_sv_root)                                 \
162             uproot_SV(p);                               \
163         else                                            \
164             (p) = more_sv();                            \
165         UNLOCK_SV_MUTEX;                                \
166         SvANY(p) = 0;                                   \
167         SvREFCNT(p) = 1;                                \
168         SvFLAGS(p) = 0;                                 \
169     } STMT_END
170
171
172 /* del_SV(): return an empty SV head to the free list */
173
174 #ifdef DEBUGGING
175
176 #define del_SV(p) \
177     STMT_START {                                        \
178         LOCK_SV_MUTEX;                                  \
179         if (DEBUG_D_TEST)                               \
180             del_sv(p);                                  \
181         else                                            \
182             plant_SV(p);                                \
183         UNLOCK_SV_MUTEX;                                \
184     } STMT_END
185
186 STATIC void
187 S_del_sv(pTHX_ SV *p)
188 {
189     if (DEBUG_D_TEST) {
190         SV* sva;
191         SV* sv;
192         SV* svend;
193         int ok = 0;
194         for (sva = PL_sv_arenaroot; sva; sva = (SV *) SvANY(sva)) {
195             sv = sva + 1;
196             svend = &sva[SvREFCNT(sva)];
197             if (p >= sv && p < svend)
198                 ok = 1;
199         }
200         if (!ok) {
201             if (ckWARN_d(WARN_INTERNAL))        
202                 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
203                             "Attempt to free non-arena SV: 0x%"UVxf,
204                             PTR2UV(p));
205             return;
206         }
207     }
208     plant_SV(p);
209 }
210
211 #else /* ! DEBUGGING */
212
213 #define del_SV(p)   plant_SV(p)
214
215 #endif /* DEBUGGING */
216
217
218 /*
219 =head1 SV Manipulation Functions
220
221 =for apidoc sv_add_arena
222
223 Given a chunk of memory, link it to the head of the list of arenas,
224 and split it into a list of free SVs.
225
226 =cut
227 */
228
229 void
230 Perl_sv_add_arena(pTHX_ char *ptr, U32 size, U32 flags)
231 {
232     SV* sva = (SV*)ptr;
233     register SV* sv;
234     register SV* svend;
235     Zero(ptr, size, char);
236
237     /* The first SV in an arena isn't an SV. */
238     SvANY(sva) = (void *) PL_sv_arenaroot;              /* ptr to next arena */
239     SvREFCNT(sva) = size / sizeof(SV);          /* number of SV slots */
240     SvFLAGS(sva) = flags;                       /* FAKE if not to be freed */
241
242     PL_sv_arenaroot = sva;
243     PL_sv_root = sva + 1;
244
245     svend = &sva[SvREFCNT(sva) - 1];
246     sv = sva + 1;
247     while (sv < svend) {
248         SvANY(sv) = (void *)(SV*)(sv + 1);
249         SvFLAGS(sv) = SVTYPEMASK;
250         sv++;
251     }
252     SvANY(sv) = 0;
253     SvFLAGS(sv) = SVTYPEMASK;
254 }
255
256 /* make some more SVs by adding another arena */
257
258 /* sv_mutex must be held while calling more_sv() */
259 STATIC SV*
260 S_more_sv(pTHX)
261 {
262     register SV* sv;
263
264     if (PL_nice_chunk) {
265         sv_add_arena(PL_nice_chunk, PL_nice_chunk_size, 0);
266         PL_nice_chunk = Nullch;
267         PL_nice_chunk_size = 0;
268     }
269     else {
270         char *chunk;                /* must use New here to match call to */
271         New(704,chunk,1008,char);   /* Safefree() in sv_free_arenas()     */
272         sv_add_arena(chunk, 1008, 0);
273     }
274     uproot_SV(sv);
275     return sv;
276 }
277
278 /* visit(): call the named function for each non-free SV in the arenas. */
279
280 STATIC I32
281 S_visit(pTHX_ SVFUNC_t f)
282 {
283     SV* sva;
284     SV* sv;
285     register SV* svend;
286     I32 visited = 0;
287
288     for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
289         svend = &sva[SvREFCNT(sva)];
290         for (sv = sva + 1; sv < svend; ++sv) {
291             if (SvTYPE(sv) != SVTYPEMASK && SvREFCNT(sv)) {
292                 (FCALL)(aTHX_ sv);
293                 ++visited;
294             }
295         }
296     }
297     return visited;
298 }
299
300 #ifdef DEBUGGING
301
302 /* called by sv_report_used() for each live SV */
303
304 static void
305 do_report_used(pTHX_ SV *sv)
306 {
307     if (SvTYPE(sv) != SVTYPEMASK) {
308         PerlIO_printf(Perl_debug_log, "****\n");
309         sv_dump(sv);
310     }
311 }
312 #endif
313
314 /*
315 =for apidoc sv_report_used
316
317 Dump the contents of all SVs not yet freed. (Debugging aid).
318
319 =cut
320 */
321
322 void
323 Perl_sv_report_used(pTHX)
324 {
325 #ifdef DEBUGGING
326     visit(do_report_used);
327 #endif
328 }
329
330 /* called by sv_clean_objs() for each live SV */
331
332 static void
333 do_clean_objs(pTHX_ SV *sv)
334 {
335     SV* rv;
336
337     if (SvROK(sv) && SvOBJECT(rv = SvRV(sv))) {
338         DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(sv)));
339         if (SvWEAKREF(sv)) {
340             sv_del_backref(sv);
341             SvWEAKREF_off(sv);
342             SvRV(sv) = 0;
343         } else {
344             SvROK_off(sv);
345             SvRV(sv) = 0;
346             SvREFCNT_dec(rv);
347         }
348     }
349
350     /* XXX Might want to check arrays, etc. */
351 }
352
353 /* called by sv_clean_objs() for each live SV */
354
355 #ifndef DISABLE_DESTRUCTOR_KLUDGE
356 static void
357 do_clean_named_objs(pTHX_ SV *sv)
358 {
359     if (SvTYPE(sv) == SVt_PVGV && GvGP(sv)) {
360         if ( SvOBJECT(GvSV(sv)) ||
361              (GvAV(sv) && SvOBJECT(GvAV(sv))) ||
362              (GvHV(sv) && SvOBJECT(GvHV(sv))) ||
363              (GvIO(sv) && SvOBJECT(GvIO(sv))) ||
364              (GvCV(sv) && SvOBJECT(GvCV(sv))) )
365         {
366             DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning named glob object:\n "), sv_dump(sv)));
367             SvREFCNT_dec(sv);
368         }
369     }
370 }
371 #endif
372
373 /*
374 =for apidoc sv_clean_objs
375
376 Attempt to destroy all objects not yet freed
377
378 =cut
379 */
380
381 void
382 Perl_sv_clean_objs(pTHX)
383 {
384     PL_in_clean_objs = TRUE;
385     visit(do_clean_objs);
386 #ifndef DISABLE_DESTRUCTOR_KLUDGE
387     /* some barnacles may yet remain, clinging to typeglobs */
388     visit(do_clean_named_objs);
389 #endif
390     PL_in_clean_objs = FALSE;
391 }
392
393 /* called by sv_clean_all() for each live SV */
394
395 static void
396 do_clean_all(pTHX_ SV *sv)
397 {
398     DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%"UVxf"\n", PTR2UV(sv)) ));
399     SvFLAGS(sv) |= SVf_BREAK;
400     SvREFCNT_dec(sv);
401 }
402
403 /*
404 =for apidoc sv_clean_all
405
406 Decrement the refcnt of each remaining SV, possibly triggering a
407 cleanup. This function may have to be called multiple times to free
408 SVs which are in complex self-referential hierarchies.
409
410 =cut
411 */
412
413 I32
414 Perl_sv_clean_all(pTHX)
415 {
416     I32 cleaned;
417     PL_in_clean_all = TRUE;
418     cleaned = visit(do_clean_all);
419     PL_in_clean_all = FALSE;
420     return cleaned;
421 }
422
423 /*
424 =for apidoc sv_free_arenas
425
426 Deallocate the memory used by all arenas. Note that all the individual SV
427 heads and bodies within the arenas must already have been freed.
428
429 =cut
430 */
431
432 void
433 Perl_sv_free_arenas(pTHX)
434 {
435     SV* sva;
436     SV* svanext;
437     XPV *arena, *arenanext;
438
439     /* Free arenas here, but be careful about fake ones.  (We assume
440        contiguity of the fake ones with the corresponding real ones.) */
441
442     for (sva = PL_sv_arenaroot; sva; sva = svanext) {
443         svanext = (SV*) SvANY(sva);
444         while (svanext && SvFAKE(svanext))
445             svanext = (SV*) SvANY(svanext);
446
447         if (!SvFAKE(sva))
448             Safefree((void *)sva);
449     }
450
451     for (arena = PL_xiv_arenaroot; arena; arena = arenanext) {
452         arenanext = (XPV*)arena->xpv_pv;
453         Safefree(arena);
454     }
455     PL_xiv_arenaroot = 0;
456
457     for (arena = PL_xnv_arenaroot; arena; arena = arenanext) {
458         arenanext = (XPV*)arena->xpv_pv;
459         Safefree(arena);
460     }
461     PL_xnv_arenaroot = 0;
462
463     for (arena = PL_xrv_arenaroot; arena; arena = arenanext) {
464         arenanext = (XPV*)arena->xpv_pv;
465         Safefree(arena);
466     }
467     PL_xrv_arenaroot = 0;
468
469     for (arena = PL_xpv_arenaroot; arena; arena = arenanext) {
470         arenanext = (XPV*)arena->xpv_pv;
471         Safefree(arena);
472     }
473     PL_xpv_arenaroot = 0;
474
475     for (arena = (XPV*)PL_xpviv_arenaroot; arena; arena = arenanext) {
476         arenanext = (XPV*)arena->xpv_pv;
477         Safefree(arena);
478     }
479     PL_xpviv_arenaroot = 0;
480
481     for (arena = (XPV*)PL_xpvnv_arenaroot; arena; arena = arenanext) {
482         arenanext = (XPV*)arena->xpv_pv;
483         Safefree(arena);
484     }
485     PL_xpvnv_arenaroot = 0;
486
487     for (arena = (XPV*)PL_xpvcv_arenaroot; arena; arena = arenanext) {
488         arenanext = (XPV*)arena->xpv_pv;
489         Safefree(arena);
490     }
491     PL_xpvcv_arenaroot = 0;
492
493     for (arena = (XPV*)PL_xpvav_arenaroot; arena; arena = arenanext) {
494         arenanext = (XPV*)arena->xpv_pv;
495         Safefree(arena);
496     }
497     PL_xpvav_arenaroot = 0;
498
499     for (arena = (XPV*)PL_xpvhv_arenaroot; arena; arena = arenanext) {
500         arenanext = (XPV*)arena->xpv_pv;
501         Safefree(arena);
502     }
503     PL_xpvhv_arenaroot = 0;
504
505     for (arena = (XPV*)PL_xpvmg_arenaroot; arena; arena = arenanext) {
506         arenanext = (XPV*)arena->xpv_pv;
507         Safefree(arena);
508     }
509     PL_xpvmg_arenaroot = 0;
510
511     for (arena = (XPV*)PL_xpvlv_arenaroot; arena; arena = arenanext) {
512         arenanext = (XPV*)arena->xpv_pv;
513         Safefree(arena);
514     }
515     PL_xpvlv_arenaroot = 0;
516
517     for (arena = (XPV*)PL_xpvbm_arenaroot; arena; arena = arenanext) {
518         arenanext = (XPV*)arena->xpv_pv;
519         Safefree(arena);
520     }
521     PL_xpvbm_arenaroot = 0;
522
523     for (arena = (XPV*)PL_he_arenaroot; arena; arena = arenanext) {
524         arenanext = (XPV*)arena->xpv_pv;
525         Safefree(arena);
526     }
527     PL_he_arenaroot = 0;
528
529     if (PL_nice_chunk)
530         Safefree(PL_nice_chunk);
531     PL_nice_chunk = Nullch;
532     PL_nice_chunk_size = 0;
533     PL_sv_arenaroot = 0;
534     PL_sv_root = 0;
535 }
536
537 /*
538 =for apidoc report_uninit
539
540 Print appropriate "Use of uninitialized variable" warning
541
542 =cut
543 */
544
545 void
546 Perl_report_uninit(pTHX)
547 {
548     if (PL_op)
549         Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
550                     " in ", OP_DESC(PL_op));
551     else
552         Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit, "", "");
553 }
554
555 /* grab a new IV body from the free list, allocating more if necessary */
556
557 STATIC XPVIV*
558 S_new_xiv(pTHX)
559 {
560     IV* xiv;
561     LOCK_SV_MUTEX;
562     if (!PL_xiv_root)
563         more_xiv();
564     xiv = PL_xiv_root;
565     /*
566      * See comment in more_xiv() -- RAM.
567      */
568     PL_xiv_root = *(IV**)xiv;
569     UNLOCK_SV_MUTEX;
570     return (XPVIV*)((char*)xiv - STRUCT_OFFSET(XPVIV, xiv_iv));
571 }
572
573 /* return an IV body to the free list */
574
575 STATIC void
576 S_del_xiv(pTHX_ XPVIV *p)
577 {
578     IV* xiv = (IV*)((char*)(p) + STRUCT_OFFSET(XPVIV, xiv_iv));
579     LOCK_SV_MUTEX;
580     *(IV**)xiv = PL_xiv_root;
581     PL_xiv_root = xiv;
582     UNLOCK_SV_MUTEX;
583 }
584
585 /* allocate another arena's worth of IV bodies */
586
587 STATIC void
588 S_more_xiv(pTHX)
589 {
590     register IV* xiv;
591     register IV* xivend;
592     XPV* ptr;
593     New(705, ptr, 1008/sizeof(XPV), XPV);
594     ptr->xpv_pv = (char*)PL_xiv_arenaroot;      /* linked list of xiv arenas */
595     PL_xiv_arenaroot = ptr;                     /* to keep Purify happy */
596
597     xiv = (IV*) ptr;
598     xivend = &xiv[1008 / sizeof(IV) - 1];
599     xiv += (sizeof(XPV) - 1) / sizeof(IV) + 1;  /* fudge by size of XPV */
600     PL_xiv_root = xiv;
601     while (xiv < xivend) {
602         *(IV**)xiv = (IV *)(xiv + 1);
603         xiv++;
604     }
605     *(IV**)xiv = 0;
606 }
607
608 /* grab a new NV body from the free list, allocating more if necessary */
609
610 STATIC XPVNV*
611 S_new_xnv(pTHX)
612 {
613     NV* xnv;
614     LOCK_SV_MUTEX;
615     if (!PL_xnv_root)
616         more_xnv();
617     xnv = PL_xnv_root;
618     PL_xnv_root = *(NV**)xnv;
619     UNLOCK_SV_MUTEX;
620     return (XPVNV*)((char*)xnv - STRUCT_OFFSET(XPVNV, xnv_nv));
621 }
622
623 /* return an NV body to the free list */
624
625 STATIC void
626 S_del_xnv(pTHX_ XPVNV *p)
627 {
628     NV* xnv = (NV*)((char*)(p) + STRUCT_OFFSET(XPVNV, xnv_nv));
629     LOCK_SV_MUTEX;
630     *(NV**)xnv = PL_xnv_root;
631     PL_xnv_root = xnv;
632     UNLOCK_SV_MUTEX;
633 }
634
635 /* allocate another arena's worth of NV bodies */
636
637 STATIC void
638 S_more_xnv(pTHX)
639 {
640     register NV* xnv;
641     register NV* xnvend;
642     XPV *ptr;
643     New(711, ptr, 1008/sizeof(XPV), XPV);
644     ptr->xpv_pv = (char*)PL_xnv_arenaroot;
645     PL_xnv_arenaroot = ptr;
646
647     xnv = (NV*) ptr;
648     xnvend = &xnv[1008 / sizeof(NV) - 1];
649     xnv += (sizeof(XPVIV) - 1) / sizeof(NV) + 1; /* fudge by sizeof XPVIV */
650     PL_xnv_root = xnv;
651     while (xnv < xnvend) {
652         *(NV**)xnv = (NV*)(xnv + 1);
653         xnv++;
654     }
655     *(NV**)xnv = 0;
656 }
657
658 /* grab a new struct xrv from the free list, allocating more if necessary */
659
660 STATIC XRV*
661 S_new_xrv(pTHX)
662 {
663     XRV* xrv;
664     LOCK_SV_MUTEX;
665     if (!PL_xrv_root)
666         more_xrv();
667     xrv = PL_xrv_root;
668     PL_xrv_root = (XRV*)xrv->xrv_rv;
669     UNLOCK_SV_MUTEX;
670     return xrv;
671 }
672
673 /* return a struct xrv to the free list */
674
675 STATIC void
676 S_del_xrv(pTHX_ XRV *p)
677 {
678     LOCK_SV_MUTEX;
679     p->xrv_rv = (SV*)PL_xrv_root;
680     PL_xrv_root = p;
681     UNLOCK_SV_MUTEX;
682 }
683
684 /* allocate another arena's worth of struct xrv */
685
686 STATIC void
687 S_more_xrv(pTHX)
688 {
689     register XRV* xrv;
690     register XRV* xrvend;
691     XPV *ptr;
692     New(712, ptr, 1008/sizeof(XPV), XPV);
693     ptr->xpv_pv = (char*)PL_xrv_arenaroot;
694     PL_xrv_arenaroot = ptr;
695
696     xrv = (XRV*) ptr;
697     xrvend = &xrv[1008 / sizeof(XRV) - 1];
698     xrv += (sizeof(XPV) - 1) / sizeof(XRV) + 1;
699     PL_xrv_root = xrv;
700     while (xrv < xrvend) {
701         xrv->xrv_rv = (SV*)(xrv + 1);
702         xrv++;
703     }
704     xrv->xrv_rv = 0;
705 }
706
707 /* grab a new struct xpv from the free list, allocating more if necessary */
708
709 STATIC XPV*
710 S_new_xpv(pTHX)
711 {
712     XPV* xpv;
713     LOCK_SV_MUTEX;
714     if (!PL_xpv_root)
715         more_xpv();
716     xpv = PL_xpv_root;
717     PL_xpv_root = (XPV*)xpv->xpv_pv;
718     UNLOCK_SV_MUTEX;
719     return xpv;
720 }
721
722 /* return a struct xpv to the free list */
723
724 STATIC void
725 S_del_xpv(pTHX_ XPV *p)
726 {
727     LOCK_SV_MUTEX;
728     p->xpv_pv = (char*)PL_xpv_root;
729     PL_xpv_root = p;
730     UNLOCK_SV_MUTEX;
731 }
732
733 /* allocate another arena's worth of struct xpv */
734
735 STATIC void
736 S_more_xpv(pTHX)
737 {
738     register XPV* xpv;
739     register XPV* xpvend;
740     New(713, xpv, 1008/sizeof(XPV), XPV);
741     xpv->xpv_pv = (char*)PL_xpv_arenaroot;
742     PL_xpv_arenaroot = xpv;
743
744     xpvend = &xpv[1008 / sizeof(XPV) - 1];
745     PL_xpv_root = ++xpv;
746     while (xpv < xpvend) {
747         xpv->xpv_pv = (char*)(xpv + 1);
748         xpv++;
749     }
750     xpv->xpv_pv = 0;
751 }
752
753 /* grab a new struct xpviv from the free list, allocating more if necessary */
754
755 STATIC XPVIV*
756 S_new_xpviv(pTHX)
757 {
758     XPVIV* xpviv;
759     LOCK_SV_MUTEX;
760     if (!PL_xpviv_root)
761         more_xpviv();
762     xpviv = PL_xpviv_root;
763     PL_xpviv_root = (XPVIV*)xpviv->xpv_pv;
764     UNLOCK_SV_MUTEX;
765     return xpviv;
766 }
767
768 /* return a struct xpviv to the free list */
769
770 STATIC void
771 S_del_xpviv(pTHX_ XPVIV *p)
772 {
773     LOCK_SV_MUTEX;
774     p->xpv_pv = (char*)PL_xpviv_root;
775     PL_xpviv_root = p;
776     UNLOCK_SV_MUTEX;
777 }
778
779 /* allocate another arena's worth of struct xpviv */
780
781 STATIC void
782 S_more_xpviv(pTHX)
783 {
784     register XPVIV* xpviv;
785     register XPVIV* xpvivend;
786     New(714, xpviv, 1008/sizeof(XPVIV), XPVIV);
787     xpviv->xpv_pv = (char*)PL_xpviv_arenaroot;
788     PL_xpviv_arenaroot = xpviv;
789
790     xpvivend = &xpviv[1008 / sizeof(XPVIV) - 1];
791     PL_xpviv_root = ++xpviv;
792     while (xpviv < xpvivend) {
793         xpviv->xpv_pv = (char*)(xpviv + 1);
794         xpviv++;
795     }
796     xpviv->xpv_pv = 0;
797 }
798
799 /* grab a new struct xpvnv from the free list, allocating more if necessary */
800
801 STATIC XPVNV*
802 S_new_xpvnv(pTHX)
803 {
804     XPVNV* xpvnv;
805     LOCK_SV_MUTEX;
806     if (!PL_xpvnv_root)
807         more_xpvnv();
808     xpvnv = PL_xpvnv_root;
809     PL_xpvnv_root = (XPVNV*)xpvnv->xpv_pv;
810     UNLOCK_SV_MUTEX;
811     return xpvnv;
812 }
813
814 /* return a struct xpvnv to the free list */
815
816 STATIC void
817 S_del_xpvnv(pTHX_ XPVNV *p)
818 {
819     LOCK_SV_MUTEX;
820     p->xpv_pv = (char*)PL_xpvnv_root;
821     PL_xpvnv_root = p;
822     UNLOCK_SV_MUTEX;
823 }
824
825 /* allocate another arena's worth of struct xpvnv */
826
827 STATIC void
828 S_more_xpvnv(pTHX)
829 {
830     register XPVNV* xpvnv;
831     register XPVNV* xpvnvend;
832     New(715, xpvnv, 1008/sizeof(XPVNV), XPVNV);
833     xpvnv->xpv_pv = (char*)PL_xpvnv_arenaroot;
834     PL_xpvnv_arenaroot = xpvnv;
835
836     xpvnvend = &xpvnv[1008 / sizeof(XPVNV) - 1];
837     PL_xpvnv_root = ++xpvnv;
838     while (xpvnv < xpvnvend) {
839         xpvnv->xpv_pv = (char*)(xpvnv + 1);
840         xpvnv++;
841     }
842     xpvnv->xpv_pv = 0;
843 }
844
845 /* grab a new struct xpvcv from the free list, allocating more if necessary */
846
847 STATIC XPVCV*
848 S_new_xpvcv(pTHX)
849 {
850     XPVCV* xpvcv;
851     LOCK_SV_MUTEX;
852     if (!PL_xpvcv_root)
853         more_xpvcv();
854     xpvcv = PL_xpvcv_root;
855     PL_xpvcv_root = (XPVCV*)xpvcv->xpv_pv;
856     UNLOCK_SV_MUTEX;
857     return xpvcv;
858 }
859
860 /* return a struct xpvcv to the free list */
861
862 STATIC void
863 S_del_xpvcv(pTHX_ XPVCV *p)
864 {
865     LOCK_SV_MUTEX;
866     p->xpv_pv = (char*)PL_xpvcv_root;
867     PL_xpvcv_root = p;
868     UNLOCK_SV_MUTEX;
869 }
870
871 /* allocate another arena's worth of struct xpvcv */
872
873 STATIC void
874 S_more_xpvcv(pTHX)
875 {
876     register XPVCV* xpvcv;
877     register XPVCV* xpvcvend;
878     New(716, xpvcv, 1008/sizeof(XPVCV), XPVCV);
879     xpvcv->xpv_pv = (char*)PL_xpvcv_arenaroot;
880     PL_xpvcv_arenaroot = xpvcv;
881
882     xpvcvend = &xpvcv[1008 / sizeof(XPVCV) - 1];
883     PL_xpvcv_root = ++xpvcv;
884     while (xpvcv < xpvcvend) {
885         xpvcv->xpv_pv = (char*)(xpvcv + 1);
886         xpvcv++;
887     }
888     xpvcv->xpv_pv = 0;
889 }
890
891 /* grab a new struct xpvav from the free list, allocating more if necessary */
892
893 STATIC XPVAV*
894 S_new_xpvav(pTHX)
895 {
896     XPVAV* xpvav;
897     LOCK_SV_MUTEX;
898     if (!PL_xpvav_root)
899         more_xpvav();
900     xpvav = PL_xpvav_root;
901     PL_xpvav_root = (XPVAV*)xpvav->xav_array;
902     UNLOCK_SV_MUTEX;
903     return xpvav;
904 }
905
906 /* return a struct xpvav to the free list */
907
908 STATIC void
909 S_del_xpvav(pTHX_ XPVAV *p)
910 {
911     LOCK_SV_MUTEX;
912     p->xav_array = (char*)PL_xpvav_root;
913     PL_xpvav_root = p;
914     UNLOCK_SV_MUTEX;
915 }
916
917 /* allocate another arena's worth of struct xpvav */
918
919 STATIC void
920 S_more_xpvav(pTHX)
921 {
922     register XPVAV* xpvav;
923     register XPVAV* xpvavend;
924     New(717, xpvav, 1008/sizeof(XPVAV), XPVAV);
925     xpvav->xav_array = (char*)PL_xpvav_arenaroot;
926     PL_xpvav_arenaroot = xpvav;
927
928     xpvavend = &xpvav[1008 / sizeof(XPVAV) - 1];
929     PL_xpvav_root = ++xpvav;
930     while (xpvav < xpvavend) {
931         xpvav->xav_array = (char*)(xpvav + 1);
932         xpvav++;
933     }
934     xpvav->xav_array = 0;
935 }
936
937 /* grab a new struct xpvhv from the free list, allocating more if necessary */
938
939 STATIC XPVHV*
940 S_new_xpvhv(pTHX)
941 {
942     XPVHV* xpvhv;
943     LOCK_SV_MUTEX;
944     if (!PL_xpvhv_root)
945         more_xpvhv();
946     xpvhv = PL_xpvhv_root;
947     PL_xpvhv_root = (XPVHV*)xpvhv->xhv_array;
948     UNLOCK_SV_MUTEX;
949     return xpvhv;
950 }
951
952 /* return a struct xpvhv to the free list */
953
954 STATIC void
955 S_del_xpvhv(pTHX_ XPVHV *p)
956 {
957     LOCK_SV_MUTEX;
958     p->xhv_array = (char*)PL_xpvhv_root;
959     PL_xpvhv_root = p;
960     UNLOCK_SV_MUTEX;
961 }
962
963 /* allocate another arena's worth of struct xpvhv */
964
965 STATIC void
966 S_more_xpvhv(pTHX)
967 {
968     register XPVHV* xpvhv;
969     register XPVHV* xpvhvend;
970     New(718, xpvhv, 1008/sizeof(XPVHV), XPVHV);
971     xpvhv->xhv_array = (char*)PL_xpvhv_arenaroot;
972     PL_xpvhv_arenaroot = xpvhv;
973
974     xpvhvend = &xpvhv[1008 / sizeof(XPVHV) - 1];
975     PL_xpvhv_root = ++xpvhv;
976     while (xpvhv < xpvhvend) {
977         xpvhv->xhv_array = (char*)(xpvhv + 1);
978         xpvhv++;
979     }
980     xpvhv->xhv_array = 0;
981 }
982
983 /* grab a new struct xpvmg from the free list, allocating more if necessary */
984
985 STATIC XPVMG*
986 S_new_xpvmg(pTHX)
987 {
988     XPVMG* xpvmg;
989     LOCK_SV_MUTEX;
990     if (!PL_xpvmg_root)
991         more_xpvmg();
992     xpvmg = PL_xpvmg_root;
993     PL_xpvmg_root = (XPVMG*)xpvmg->xpv_pv;
994     UNLOCK_SV_MUTEX;
995     return xpvmg;
996 }
997
998 /* return a struct xpvmg to the free list */
999
1000 STATIC void
1001 S_del_xpvmg(pTHX_ XPVMG *p)
1002 {
1003     LOCK_SV_MUTEX;
1004     p->xpv_pv = (char*)PL_xpvmg_root;
1005     PL_xpvmg_root = p;
1006     UNLOCK_SV_MUTEX;
1007 }
1008
1009 /* allocate another arena's worth of struct xpvmg */
1010
1011 STATIC void
1012 S_more_xpvmg(pTHX)
1013 {
1014     register XPVMG* xpvmg;
1015     register XPVMG* xpvmgend;
1016     New(719, xpvmg, 1008/sizeof(XPVMG), XPVMG);
1017     xpvmg->xpv_pv = (char*)PL_xpvmg_arenaroot;
1018     PL_xpvmg_arenaroot = xpvmg;
1019
1020     xpvmgend = &xpvmg[1008 / sizeof(XPVMG) - 1];
1021     PL_xpvmg_root = ++xpvmg;
1022     while (xpvmg < xpvmgend) {
1023         xpvmg->xpv_pv = (char*)(xpvmg + 1);
1024         xpvmg++;
1025     }
1026     xpvmg->xpv_pv = 0;
1027 }
1028
1029 /* grab a new struct xpvlv from the free list, allocating more if necessary */
1030
1031 STATIC XPVLV*
1032 S_new_xpvlv(pTHX)
1033 {
1034     XPVLV* xpvlv;
1035     LOCK_SV_MUTEX;
1036     if (!PL_xpvlv_root)
1037         more_xpvlv();
1038     xpvlv = PL_xpvlv_root;
1039     PL_xpvlv_root = (XPVLV*)xpvlv->xpv_pv;
1040     UNLOCK_SV_MUTEX;
1041     return xpvlv;
1042 }
1043
1044 /* return a struct xpvlv to the free list */
1045
1046 STATIC void
1047 S_del_xpvlv(pTHX_ XPVLV *p)
1048 {
1049     LOCK_SV_MUTEX;
1050     p->xpv_pv = (char*)PL_xpvlv_root;
1051     PL_xpvlv_root = p;
1052     UNLOCK_SV_MUTEX;
1053 }
1054
1055 /* allocate another arena's worth of struct xpvlv */
1056
1057 STATIC void
1058 S_more_xpvlv(pTHX)
1059 {
1060     register XPVLV* xpvlv;
1061     register XPVLV* xpvlvend;
1062     New(720, xpvlv, 1008/sizeof(XPVLV), XPVLV);
1063     xpvlv->xpv_pv = (char*)PL_xpvlv_arenaroot;
1064     PL_xpvlv_arenaroot = xpvlv;
1065
1066     xpvlvend = &xpvlv[1008 / sizeof(XPVLV) - 1];
1067     PL_xpvlv_root = ++xpvlv;
1068     while (xpvlv < xpvlvend) {
1069         xpvlv->xpv_pv = (char*)(xpvlv + 1);
1070         xpvlv++;
1071     }
1072     xpvlv->xpv_pv = 0;
1073 }
1074
1075 /* grab a new struct xpvbm from the free list, allocating more if necessary */
1076
1077 STATIC XPVBM*
1078 S_new_xpvbm(pTHX)
1079 {
1080     XPVBM* xpvbm;
1081     LOCK_SV_MUTEX;
1082     if (!PL_xpvbm_root)
1083         more_xpvbm();
1084     xpvbm = PL_xpvbm_root;
1085     PL_xpvbm_root = (XPVBM*)xpvbm->xpv_pv;
1086     UNLOCK_SV_MUTEX;
1087     return xpvbm;
1088 }
1089
1090 /* return a struct xpvbm to the free list */
1091
1092 STATIC void
1093 S_del_xpvbm(pTHX_ XPVBM *p)
1094 {
1095     LOCK_SV_MUTEX;
1096     p->xpv_pv = (char*)PL_xpvbm_root;
1097     PL_xpvbm_root = p;
1098     UNLOCK_SV_MUTEX;
1099 }
1100
1101 /* allocate another arena's worth of struct xpvbm */
1102
1103 STATIC void
1104 S_more_xpvbm(pTHX)
1105 {
1106     register XPVBM* xpvbm;
1107     register XPVBM* xpvbmend;
1108     New(721, xpvbm, 1008/sizeof(XPVBM), XPVBM);
1109     xpvbm->xpv_pv = (char*)PL_xpvbm_arenaroot;
1110     PL_xpvbm_arenaroot = xpvbm;
1111
1112     xpvbmend = &xpvbm[1008 / sizeof(XPVBM) - 1];
1113     PL_xpvbm_root = ++xpvbm;
1114     while (xpvbm < xpvbmend) {
1115         xpvbm->xpv_pv = (char*)(xpvbm + 1);
1116         xpvbm++;
1117     }
1118     xpvbm->xpv_pv = 0;
1119 }
1120
1121 #ifdef LEAKTEST
1122 #  define my_safemalloc(s)      (void*)safexmalloc(717,s)
1123 #  define my_safefree(p)        safexfree((char*)p)
1124 #else
1125 #  define my_safemalloc(s)      (void*)safemalloc(s)
1126 #  define my_safefree(p)        safefree((char*)p)
1127 #endif
1128
1129 #ifdef PURIFY
1130
1131 #define new_XIV()       my_safemalloc(sizeof(XPVIV))
1132 #define del_XIV(p)      my_safefree(p)
1133
1134 #define new_XNV()       my_safemalloc(sizeof(XPVNV))
1135 #define del_XNV(p)      my_safefree(p)
1136
1137 #define new_XRV()       my_safemalloc(sizeof(XRV))
1138 #define del_XRV(p)      my_safefree(p)
1139
1140 #define new_XPV()       my_safemalloc(sizeof(XPV))
1141 #define del_XPV(p)      my_safefree(p)
1142
1143 #define new_XPVIV()     my_safemalloc(sizeof(XPVIV))
1144 #define del_XPVIV(p)    my_safefree(p)
1145
1146 #define new_XPVNV()     my_safemalloc(sizeof(XPVNV))
1147 #define del_XPVNV(p)    my_safefree(p)
1148
1149 #define new_XPVCV()     my_safemalloc(sizeof(XPVCV))
1150 #define del_XPVCV(p)    my_safefree(p)
1151
1152 #define new_XPVAV()     my_safemalloc(sizeof(XPVAV))
1153 #define del_XPVAV(p)    my_safefree(p)
1154
1155 #define new_XPVHV()     my_safemalloc(sizeof(XPVHV))
1156 #define del_XPVHV(p)    my_safefree(p)
1157
1158 #define new_XPVMG()     my_safemalloc(sizeof(XPVMG))
1159 #define del_XPVMG(p)    my_safefree(p)
1160
1161 #define new_XPVLV()     my_safemalloc(sizeof(XPVLV))
1162 #define del_XPVLV(p)    my_safefree(p)
1163
1164 #define new_XPVBM()     my_safemalloc(sizeof(XPVBM))
1165 #define del_XPVBM(p)    my_safefree(p)
1166
1167 #else /* !PURIFY */
1168
1169 #define new_XIV()       (void*)new_xiv()
1170 #define del_XIV(p)      del_xiv((XPVIV*) p)
1171
1172 #define new_XNV()       (void*)new_xnv()
1173 #define del_XNV(p)      del_xnv((XPVNV*) p)
1174
1175 #define new_XRV()       (void*)new_xrv()
1176 #define del_XRV(p)      del_xrv((XRV*) p)
1177
1178 #define new_XPV()       (void*)new_xpv()
1179 #define del_XPV(p)      del_xpv((XPV *)p)
1180
1181 #define new_XPVIV()     (void*)new_xpviv()
1182 #define del_XPVIV(p)    del_xpviv((XPVIV *)p)
1183
1184 #define new_XPVNV()     (void*)new_xpvnv()
1185 #define del_XPVNV(p)    del_xpvnv((XPVNV *)p)
1186
1187 #define new_XPVCV()     (void*)new_xpvcv()
1188 #define del_XPVCV(p)    del_xpvcv((XPVCV *)p)
1189
1190 #define new_XPVAV()     (void*)new_xpvav()
1191 #define del_XPVAV(p)    del_xpvav((XPVAV *)p)
1192
1193 #define new_XPVHV()     (void*)new_xpvhv()
1194 #define del_XPVHV(p)    del_xpvhv((XPVHV *)p)
1195
1196 #define new_XPVMG()     (void*)new_xpvmg()
1197 #define del_XPVMG(p)    del_xpvmg((XPVMG *)p)
1198
1199 #define new_XPVLV()     (void*)new_xpvlv()
1200 #define del_XPVLV(p)    del_xpvlv((XPVLV *)p)
1201
1202 #define new_XPVBM()     (void*)new_xpvbm()
1203 #define del_XPVBM(p)    del_xpvbm((XPVBM *)p)
1204
1205 #endif /* PURIFY */
1206
1207 #define new_XPVGV()     my_safemalloc(sizeof(XPVGV))
1208 #define del_XPVGV(p)    my_safefree(p)
1209
1210 #define new_XPVFM()     my_safemalloc(sizeof(XPVFM))
1211 #define del_XPVFM(p)    my_safefree(p)
1212
1213 #define new_XPVIO()     my_safemalloc(sizeof(XPVIO))
1214 #define del_XPVIO(p)    my_safefree(p)
1215
1216 /*
1217 =for apidoc sv_upgrade
1218
1219 Upgrade an SV to a more complex form.  Generally adds a new body type to the
1220 SV, then copies across as much information as possible from the old body.
1221 You generally want to use the C<SvUPGRADE> macro wrapper. See also C<svtype>.
1222
1223 =cut
1224 */
1225
1226 bool
1227 Perl_sv_upgrade(pTHX_ register SV *sv, U32 mt)
1228 {
1229     char*       pv = NULL;
1230     U32         cur = 0;
1231     U32         len = 0;
1232     IV          iv = 0;
1233     NV          nv = 0.0;
1234     MAGIC*      magic = NULL;
1235     HV*         stash = Nullhv;
1236
1237     if (mt != SVt_PV && SvREADONLY(sv) && SvFAKE(sv)) {
1238         sv_force_normal(sv);
1239     }
1240
1241     if (SvTYPE(sv) == mt)
1242         return TRUE;
1243
1244     if (mt < SVt_PVIV)
1245         (void)SvOOK_off(sv);
1246
1247     switch (SvTYPE(sv)) {
1248     case SVt_NULL:
1249         pv      = 0;
1250         cur     = 0;
1251         len     = 0;
1252         iv      = 0;
1253         nv      = 0.0;
1254         magic   = 0;
1255         stash   = 0;
1256         break;
1257     case SVt_IV:
1258         pv      = 0;
1259         cur     = 0;
1260         len     = 0;
1261         iv      = SvIVX(sv);
1262         nv      = (NV)SvIVX(sv);
1263         del_XIV(SvANY(sv));
1264         magic   = 0;
1265         stash   = 0;
1266         if (mt == SVt_NV)
1267             mt = SVt_PVNV;
1268         else if (mt < SVt_PVIV)
1269             mt = SVt_PVIV;
1270         break;
1271     case SVt_NV:
1272         pv      = 0;
1273         cur     = 0;
1274         len     = 0;
1275         nv      = SvNVX(sv);
1276         iv      = I_V(nv);
1277         magic   = 0;
1278         stash   = 0;
1279         del_XNV(SvANY(sv));
1280         SvANY(sv) = 0;
1281         if (mt < SVt_PVNV)
1282             mt = SVt_PVNV;
1283         break;
1284     case SVt_RV:
1285         pv      = (char*)SvRV(sv);
1286         cur     = 0;
1287         len     = 0;
1288         iv      = PTR2IV(pv);
1289         nv      = PTR2NV(pv);
1290         del_XRV(SvANY(sv));
1291         magic   = 0;
1292         stash   = 0;
1293         break;
1294     case SVt_PV:
1295         pv      = SvPVX(sv);
1296         cur     = SvCUR(sv);
1297         len     = SvLEN(sv);
1298         iv      = 0;
1299         nv      = 0.0;
1300         magic   = 0;
1301         stash   = 0;
1302         del_XPV(SvANY(sv));
1303         if (mt <= SVt_IV)
1304             mt = SVt_PVIV;
1305         else if (mt == SVt_NV)
1306             mt = SVt_PVNV;
1307         break;
1308     case SVt_PVIV:
1309         pv      = SvPVX(sv);
1310         cur     = SvCUR(sv);
1311         len     = SvLEN(sv);
1312         iv      = SvIVX(sv);
1313         nv      = 0.0;
1314         magic   = 0;
1315         stash   = 0;
1316         del_XPVIV(SvANY(sv));
1317         break;
1318     case SVt_PVNV:
1319         pv      = SvPVX(sv);
1320         cur     = SvCUR(sv);
1321         len     = SvLEN(sv);
1322         iv      = SvIVX(sv);
1323         nv      = SvNVX(sv);
1324         magic   = 0;
1325         stash   = 0;
1326         del_XPVNV(SvANY(sv));
1327         break;
1328     case SVt_PVMG:
1329         pv      = SvPVX(sv);
1330         cur     = SvCUR(sv);
1331         len     = SvLEN(sv);
1332         iv      = SvIVX(sv);
1333         nv      = SvNVX(sv);
1334         magic   = SvMAGIC(sv);
1335         stash   = SvSTASH(sv);
1336         del_XPVMG(SvANY(sv));
1337         break;
1338     default:
1339         Perl_croak(aTHX_ "Can't upgrade that kind of scalar");
1340     }
1341
1342     switch (mt) {
1343     case SVt_NULL:
1344         Perl_croak(aTHX_ "Can't upgrade to undef");
1345     case SVt_IV:
1346         SvANY(sv) = new_XIV();
1347         SvIVX(sv)       = iv;
1348         break;
1349     case SVt_NV:
1350         SvANY(sv) = new_XNV();
1351         SvNVX(sv)       = nv;
1352         break;
1353     case SVt_RV:
1354         SvANY(sv) = new_XRV();
1355         SvRV(sv) = (SV*)pv;
1356         break;
1357     case SVt_PV:
1358         SvANY(sv) = new_XPV();
1359         SvPVX(sv)       = pv;
1360         SvCUR(sv)       = cur;
1361         SvLEN(sv)       = len;
1362         break;
1363     case SVt_PVIV:
1364         SvANY(sv) = new_XPVIV();
1365         SvPVX(sv)       = pv;
1366         SvCUR(sv)       = cur;
1367         SvLEN(sv)       = len;
1368         SvIVX(sv)       = iv;
1369         if (SvNIOK(sv))
1370             (void)SvIOK_on(sv);
1371         SvNOK_off(sv);
1372         break;
1373     case SVt_PVNV:
1374         SvANY(sv) = new_XPVNV();
1375         SvPVX(sv)       = pv;
1376         SvCUR(sv)       = cur;
1377         SvLEN(sv)       = len;
1378         SvIVX(sv)       = iv;
1379         SvNVX(sv)       = nv;
1380         break;
1381     case SVt_PVMG:
1382         SvANY(sv) = new_XPVMG();
1383         SvPVX(sv)       = pv;
1384         SvCUR(sv)       = cur;
1385         SvLEN(sv)       = len;
1386         SvIVX(sv)       = iv;
1387         SvNVX(sv)       = nv;
1388         SvMAGIC(sv)     = magic;
1389         SvSTASH(sv)     = stash;
1390         break;
1391     case SVt_PVLV:
1392         SvANY(sv) = new_XPVLV();
1393         SvPVX(sv)       = pv;
1394         SvCUR(sv)       = cur;
1395         SvLEN(sv)       = len;
1396         SvIVX(sv)       = iv;
1397         SvNVX(sv)       = nv;
1398         SvMAGIC(sv)     = magic;
1399         SvSTASH(sv)     = stash;
1400         LvTARGOFF(sv)   = 0;
1401         LvTARGLEN(sv)   = 0;
1402         LvTARG(sv)      = 0;
1403         LvTYPE(sv)      = 0;
1404         break;
1405     case SVt_PVAV:
1406         SvANY(sv) = new_XPVAV();
1407         if (pv)
1408             Safefree(pv);
1409         SvPVX(sv)       = 0;
1410         AvMAX(sv)       = -1;
1411         AvFILLp(sv)     = -1;
1412         SvIVX(sv)       = 0;
1413         SvNVX(sv)       = 0.0;
1414         SvMAGIC(sv)     = magic;
1415         SvSTASH(sv)     = stash;
1416         AvALLOC(sv)     = 0;
1417         AvARYLEN(sv)    = 0;
1418         AvFLAGS(sv)     = 0;
1419         break;
1420     case SVt_PVHV:
1421         SvANY(sv) = new_XPVHV();
1422         if (pv)
1423             Safefree(pv);
1424         SvPVX(sv)       = 0;
1425         HvFILL(sv)      = 0;
1426         HvMAX(sv)       = 0;
1427         HvTOTALKEYS(sv) = 0;
1428         HvPLACEHOLDERS(sv) = 0;
1429         SvMAGIC(sv)     = magic;
1430         SvSTASH(sv)     = stash;
1431         HvRITER(sv)     = 0;
1432         HvEITER(sv)     = 0;
1433         HvPMROOT(sv)    = 0;
1434         HvNAME(sv)      = 0;
1435         break;
1436     case SVt_PVCV:
1437         SvANY(sv) = new_XPVCV();
1438         Zero(SvANY(sv), 1, XPVCV);
1439         SvPVX(sv)       = pv;
1440         SvCUR(sv)       = cur;
1441         SvLEN(sv)       = len;
1442         SvIVX(sv)       = iv;
1443         SvNVX(sv)       = nv;
1444         SvMAGIC(sv)     = magic;
1445         SvSTASH(sv)     = stash;
1446         break;
1447     case SVt_PVGV:
1448         SvANY(sv) = new_XPVGV();
1449         SvPVX(sv)       = pv;
1450         SvCUR(sv)       = cur;
1451         SvLEN(sv)       = len;
1452         SvIVX(sv)       = iv;
1453         SvNVX(sv)       = nv;
1454         SvMAGIC(sv)     = magic;
1455         SvSTASH(sv)     = stash;
1456         GvGP(sv)        = 0;
1457         GvNAME(sv)      = 0;
1458         GvNAMELEN(sv)   = 0;
1459         GvSTASH(sv)     = 0;
1460         GvFLAGS(sv)     = 0;
1461         break;
1462     case SVt_PVBM:
1463         SvANY(sv) = new_XPVBM();
1464         SvPVX(sv)       = pv;
1465         SvCUR(sv)       = cur;
1466         SvLEN(sv)       = len;
1467         SvIVX(sv)       = iv;
1468         SvNVX(sv)       = nv;
1469         SvMAGIC(sv)     = magic;
1470         SvSTASH(sv)     = stash;
1471         BmRARE(sv)      = 0;
1472         BmUSEFUL(sv)    = 0;
1473         BmPREVIOUS(sv)  = 0;
1474         break;
1475     case SVt_PVFM:
1476         SvANY(sv) = new_XPVFM();
1477         Zero(SvANY(sv), 1, XPVFM);
1478         SvPVX(sv)       = pv;
1479         SvCUR(sv)       = cur;
1480         SvLEN(sv)       = len;
1481         SvIVX(sv)       = iv;
1482         SvNVX(sv)       = nv;
1483         SvMAGIC(sv)     = magic;
1484         SvSTASH(sv)     = stash;
1485         break;
1486     case SVt_PVIO:
1487         SvANY(sv) = new_XPVIO();
1488         Zero(SvANY(sv), 1, XPVIO);
1489         SvPVX(sv)       = pv;
1490         SvCUR(sv)       = cur;
1491         SvLEN(sv)       = len;
1492         SvIVX(sv)       = iv;
1493         SvNVX(sv)       = nv;
1494         SvMAGIC(sv)     = magic;
1495         SvSTASH(sv)     = stash;
1496         IoPAGE_LEN(sv)  = 60;
1497         break;
1498     }
1499     SvFLAGS(sv) &= ~SVTYPEMASK;
1500     SvFLAGS(sv) |= mt;
1501     return TRUE;
1502 }
1503
1504 /*
1505 =for apidoc sv_backoff
1506
1507 Remove any string offset. You should normally use the C<SvOOK_off> macro
1508 wrapper instead.
1509
1510 =cut
1511 */
1512
1513 int
1514 Perl_sv_backoff(pTHX_ register SV *sv)
1515 {
1516     assert(SvOOK(sv));
1517     if (SvIVX(sv)) {
1518         char *s = SvPVX(sv);
1519         SvLEN(sv) += SvIVX(sv);
1520         SvPVX(sv) -= SvIVX(sv);
1521         SvIV_set(sv, 0);
1522         Move(s, SvPVX(sv), SvCUR(sv)+1, char);
1523     }
1524     SvFLAGS(sv) &= ~SVf_OOK;
1525     return 0;
1526 }
1527
1528 /*
1529 =for apidoc sv_grow
1530
1531 Expands the character buffer in the SV.  If necessary, uses C<sv_unref> and
1532 upgrades the SV to C<SVt_PV>.  Returns a pointer to the character buffer.
1533 Use the C<SvGROW> wrapper instead.
1534
1535 =cut
1536 */
1537
1538 char *
1539 Perl_sv_grow(pTHX_ register SV *sv, register STRLEN newlen)
1540 {
1541     register char *s;
1542
1543
1544
1545 #ifdef HAS_64K_LIMIT
1546     if (newlen >= 0x10000) {
1547         PerlIO_printf(Perl_debug_log,
1548                       "Allocation too large: %"UVxf"\n", (UV)newlen);
1549         my_exit(1);
1550     }
1551 #endif /* HAS_64K_LIMIT */
1552     if (SvROK(sv))
1553         sv_unref(sv);
1554     if (SvTYPE(sv) < SVt_PV) {
1555         sv_upgrade(sv, SVt_PV);
1556         s = SvPVX(sv);
1557     }
1558     else if (SvOOK(sv)) {       /* pv is offset? */
1559         sv_backoff(sv);
1560         s = SvPVX(sv);
1561         if (newlen > SvLEN(sv))
1562             newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
1563 #ifdef HAS_64K_LIMIT
1564         if (newlen >= 0x10000)
1565             newlen = 0xFFFF;
1566 #endif
1567     }
1568     else
1569         s = SvPVX(sv);
1570
1571     if (newlen > SvLEN(sv)) {           /* need more room? */
1572         if (SvLEN(sv) && s) {
1573 #if defined(MYMALLOC) && !defined(LEAKTEST)
1574             STRLEN l = malloced_size((void*)SvPVX(sv));
1575             if (newlen <= l) {
1576                 SvLEN_set(sv, l);
1577                 return s;
1578             } else
1579 #endif
1580             Renew(s,newlen,char);
1581         }
1582         else {
1583             /* sv_force_normal_flags() must not try to unshare the new
1584                PVX we allocate below. AMS 20010713 */
1585             if (SvREADONLY(sv) && SvFAKE(sv)) {
1586                 SvFAKE_off(sv);
1587                 SvREADONLY_off(sv);
1588             }
1589             New(703, s, newlen, char);
1590             if (SvPVX(sv) && SvCUR(sv)) {
1591                 Move(SvPVX(sv), s, (newlen < SvCUR(sv)) ? newlen : SvCUR(sv), char);
1592             }
1593         }
1594         SvPV_set(sv, s);
1595         SvLEN_set(sv, newlen);
1596     }
1597     return s;
1598 }
1599
1600 /*
1601 =for apidoc sv_setiv
1602
1603 Copies an integer into the given SV, upgrading first if necessary.
1604 Does not handle 'set' magic.  See also C<sv_setiv_mg>.
1605
1606 =cut
1607 */
1608
1609 void
1610 Perl_sv_setiv(pTHX_ register SV *sv, IV i)
1611 {
1612     SV_CHECK_THINKFIRST(sv);
1613     switch (SvTYPE(sv)) {
1614     case SVt_NULL:
1615         sv_upgrade(sv, SVt_IV);
1616         break;
1617     case SVt_NV:
1618         sv_upgrade(sv, SVt_PVNV);
1619         break;
1620     case SVt_RV:
1621     case SVt_PV:
1622         sv_upgrade(sv, SVt_PVIV);
1623         break;
1624
1625     case SVt_PVGV:
1626     case SVt_PVAV:
1627     case SVt_PVHV:
1628     case SVt_PVCV:
1629     case SVt_PVFM:
1630     case SVt_PVIO:
1631         Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
1632                    OP_DESC(PL_op));
1633     }
1634     (void)SvIOK_only(sv);                       /* validate number */
1635     SvIVX(sv) = i;
1636     SvTAINT(sv);
1637 }
1638
1639 /*
1640 =for apidoc sv_setiv_mg
1641
1642 Like C<sv_setiv>, but also handles 'set' magic.
1643
1644 =cut
1645 */
1646
1647 void
1648 Perl_sv_setiv_mg(pTHX_ register SV *sv, IV i)
1649 {
1650     sv_setiv(sv,i);
1651     SvSETMAGIC(sv);
1652 }
1653
1654 /*
1655 =for apidoc sv_setuv
1656
1657 Copies an unsigned integer into the given SV, upgrading first if necessary.
1658 Does not handle 'set' magic.  See also C<sv_setuv_mg>.
1659
1660 =cut
1661 */
1662
1663 void
1664 Perl_sv_setuv(pTHX_ register SV *sv, UV u)
1665 {
1666     /* With these two if statements:
1667        u=1.49  s=0.52  cu=72.49  cs=10.64  scripts=270  tests=20865
1668
1669        without
1670        u=1.35  s=0.47  cu=73.45  cs=11.43  scripts=270  tests=20865
1671
1672        If you wish to remove them, please benchmark to see what the effect is
1673     */
1674     if (u <= (UV)IV_MAX) {
1675        sv_setiv(sv, (IV)u);
1676        return;
1677     }
1678     sv_setiv(sv, 0);
1679     SvIsUV_on(sv);
1680     SvUVX(sv) = u;
1681 }
1682
1683 /*
1684 =for apidoc sv_setuv_mg
1685
1686 Like C<sv_setuv>, but also handles 'set' magic.
1687
1688 =cut
1689 */
1690
1691 void
1692 Perl_sv_setuv_mg(pTHX_ register SV *sv, UV u)
1693 {
1694     /* With these two if statements:
1695        u=1.49  s=0.52  cu=72.49  cs=10.64  scripts=270  tests=20865
1696
1697        without
1698        u=1.35  s=0.47  cu=73.45  cs=11.43  scripts=270  tests=20865
1699
1700        If you wish to remove them, please benchmark to see what the effect is
1701     */
1702     if (u <= (UV)IV_MAX) {
1703        sv_setiv(sv, (IV)u);
1704     } else {
1705        sv_setiv(sv, 0);
1706        SvIsUV_on(sv);
1707        sv_setuv(sv,u);
1708     }
1709     SvSETMAGIC(sv);
1710 }
1711
1712 /*
1713 =for apidoc sv_setnv
1714
1715 Copies a double into the given SV, upgrading first if necessary.
1716 Does not handle 'set' magic.  See also C<sv_setnv_mg>.
1717
1718 =cut
1719 */
1720
1721 void
1722 Perl_sv_setnv(pTHX_ register SV *sv, NV num)
1723 {
1724     SV_CHECK_THINKFIRST(sv);
1725     switch (SvTYPE(sv)) {
1726     case SVt_NULL:
1727     case SVt_IV:
1728         sv_upgrade(sv, SVt_NV);
1729         break;
1730     case SVt_RV:
1731     case SVt_PV:
1732     case SVt_PVIV:
1733         sv_upgrade(sv, SVt_PVNV);
1734         break;
1735
1736     case SVt_PVGV:
1737     case SVt_PVAV:
1738     case SVt_PVHV:
1739     case SVt_PVCV:
1740     case SVt_PVFM:
1741     case SVt_PVIO:
1742         Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
1743                    OP_NAME(PL_op));
1744     }
1745     SvNVX(sv) = num;
1746     (void)SvNOK_only(sv);                       /* validate number */
1747     SvTAINT(sv);
1748 }
1749
1750 /*
1751 =for apidoc sv_setnv_mg
1752
1753 Like C<sv_setnv>, but also handles 'set' magic.
1754
1755 =cut
1756 */
1757
1758 void
1759 Perl_sv_setnv_mg(pTHX_ register SV *sv, NV num)
1760 {
1761     sv_setnv(sv,num);
1762     SvSETMAGIC(sv);
1763 }
1764
1765 /* Print an "isn't numeric" warning, using a cleaned-up,
1766  * printable version of the offending string
1767  */
1768
1769 STATIC void
1770 S_not_a_number(pTHX_ SV *sv)
1771 {
1772      SV *dsv;
1773      char tmpbuf[64];
1774      char *pv;
1775
1776      if (DO_UTF8(sv)) {
1777           dsv = sv_2mortal(newSVpv("", 0));
1778           pv = sv_uni_display(dsv, sv, 10, 0);
1779      } else {
1780           char *d = tmpbuf;
1781           char *limit = tmpbuf + sizeof(tmpbuf) - 8;
1782           /* each *s can expand to 4 chars + "...\0",
1783              i.e. need room for 8 chars */
1784         
1785           char *s, *end;
1786           for (s = SvPVX(sv), end = s + SvCUR(sv); s < end && d < limit; s++) {
1787                int ch = *s & 0xFF;
1788                if (ch & 128 && !isPRINT_LC(ch)) {
1789                     *d++ = 'M';
1790                     *d++ = '-';
1791                     ch &= 127;
1792                }
1793                if (ch == '\n') {
1794                     *d++ = '\\';
1795                     *d++ = 'n';
1796                }
1797                else if (ch == '\r') {
1798                     *d++ = '\\';
1799                     *d++ = 'r';
1800                }
1801                else if (ch == '\f') {
1802                     *d++ = '\\';
1803                     *d++ = 'f';
1804                }
1805                else if (ch == '\\') {
1806                     *d++ = '\\';
1807                     *d++ = '\\';
1808                }
1809                else if (ch == '\0') {
1810                     *d++ = '\\';
1811                     *d++ = '0';
1812                }
1813                else if (isPRINT_LC(ch))
1814                     *d++ = ch;
1815                else {
1816                     *d++ = '^';
1817                     *d++ = toCTRL(ch);
1818                }
1819           }
1820           if (s < end) {
1821                *d++ = '.';
1822                *d++ = '.';
1823                *d++ = '.';
1824           }
1825           *d = '\0';
1826           pv = tmpbuf;
1827     }
1828
1829     if (PL_op)
1830         Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
1831                     "Argument \"%s\" isn't numeric in %s", pv,
1832                     OP_DESC(PL_op));
1833     else
1834         Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
1835                     "Argument \"%s\" isn't numeric", pv);
1836 }
1837
1838 /*
1839 =for apidoc looks_like_number
1840
1841 Test if the content of an SV looks like a number (or is a number).
1842 C<Inf> and C<Infinity> are treated as numbers (so will not issue a
1843 non-numeric warning), even if your atof() doesn't grok them.
1844
1845 =cut
1846 */
1847
1848 I32
1849 Perl_looks_like_number(pTHX_ SV *sv)
1850 {
1851     register char *sbegin;
1852     STRLEN len;
1853
1854     if (SvPOK(sv)) {
1855         sbegin = SvPVX(sv);
1856         len = SvCUR(sv);
1857     }
1858     else if (SvPOKp(sv))
1859         sbegin = SvPV(sv, len);
1860     else
1861         return 1; /* Historic.  Wrong?  */
1862     return grok_number(sbegin, len, NULL);
1863 }
1864
1865 /* Actually, ISO C leaves conversion of UV to IV undefined, but
1866    until proven guilty, assume that things are not that bad... */
1867
1868 /*
1869    NV_PRESERVES_UV:
1870
1871    As 64 bit platforms often have an NV that doesn't preserve all bits of
1872    an IV (an assumption perl has been based on to date) it becomes necessary
1873    to remove the assumption that the NV always carries enough precision to
1874    recreate the IV whenever needed, and that the NV is the canonical form.
1875    Instead, IV/UV and NV need to be given equal rights. So as to not lose
1876    precision as a side effect of conversion (which would lead to insanity
1877    and the dragon(s) in t/op/numconvert.t getting very angry) the intent is
1878    1) to distinguish between IV/UV/NV slots that have cached a valid
1879       conversion where precision was lost and IV/UV/NV slots that have a
1880       valid conversion which has lost no precision
1881    2) to ensure that if a numeric conversion to one form is requested that
1882       would lose precision, the precise conversion (or differently
1883       imprecise conversion) is also performed and cached, to prevent
1884       requests for different numeric formats on the same SV causing
1885       lossy conversion chains. (lossless conversion chains are perfectly
1886       acceptable (still))
1887
1888
1889    flags are used:
1890    SvIOKp is true if the IV slot contains a valid value
1891    SvIOK  is true only if the IV value is accurate (UV if SvIOK_UV true)
1892    SvNOKp is true if the NV slot contains a valid value
1893    SvNOK  is true only if the NV value is accurate
1894
1895    so
1896    while converting from PV to NV, check to see if converting that NV to an
1897    IV(or UV) would lose accuracy over a direct conversion from PV to
1898    IV(or UV). If it would, cache both conversions, return NV, but mark
1899    SV as IOK NOKp (ie not NOK).
1900
1901    While converting from PV to IV, check to see if converting that IV to an
1902    NV would lose accuracy over a direct conversion from PV to NV. If it
1903    would, cache both conversions, flag similarly.
1904
1905    Before, the SV value "3.2" could become NV=3.2 IV=3 NOK, IOK quite
1906    correctly because if IV & NV were set NV *always* overruled.
1907    Now, "3.2" will become NV=3.2 IV=3 NOK, IOKp, because the flag's meaning
1908    changes - now IV and NV together means that the two are interchangeable:
1909    SvIVX == (IV) SvNVX && SvNVX == (NV) SvIVX;
1910
1911    The benefit of this is that operations such as pp_add know that if
1912    SvIOK is true for both left and right operands, then integer addition
1913    can be used instead of floating point (for cases where the result won't
1914    overflow). Before, floating point was always used, which could lead to
1915    loss of precision compared with integer addition.
1916
1917    * making IV and NV equal status should make maths accurate on 64 bit
1918      platforms
1919    * may speed up maths somewhat if pp_add and friends start to use
1920      integers when possible instead of fp. (Hopefully the overhead in
1921      looking for SvIOK and checking for overflow will not outweigh the
1922      fp to integer speedup)
1923    * will slow down integer operations (callers of SvIV) on "inaccurate"
1924      values, as the change from SvIOK to SvIOKp will cause a call into
1925      sv_2iv each time rather than a macro access direct to the IV slot
1926    * should speed up number->string conversion on integers as IV is
1927      favoured when IV and NV are equally accurate
1928
1929    ####################################################################
1930    You had better be using SvIOK_notUV if you want an IV for arithmetic:
1931    SvIOK is true if (IV or UV), so you might be getting (IV)SvUV.
1932    On the other hand, SvUOK is true iff UV.
1933    ####################################################################
1934
1935    Your mileage will vary depending your CPU's relative fp to integer
1936    performance ratio.
1937 */
1938
1939 #ifndef NV_PRESERVES_UV
1940 #  define IS_NUMBER_UNDERFLOW_IV 1
1941 #  define IS_NUMBER_UNDERFLOW_UV 2
1942 #  define IS_NUMBER_IV_AND_UV    2
1943 #  define IS_NUMBER_OVERFLOW_IV  4
1944 #  define IS_NUMBER_OVERFLOW_UV  5
1945
1946 /* sv_2iuv_non_preserve(): private routine for use by sv_2iv() and sv_2uv() */
1947
1948 /* For sv_2nv these three cases are "SvNOK and don't bother casting"  */
1949 STATIC int
1950 S_sv_2iuv_non_preserve(pTHX_ register SV *sv, I32 numtype)
1951 {
1952     DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_2iuv_non '%s', IV=0x%"UVxf" NV=%"NVgf" inttype=%"UVXf"\n", SvPVX(sv), SvIVX(sv), SvNVX(sv), (UV)numtype));
1953     if (SvNVX(sv) < (NV)IV_MIN) {
1954         (void)SvIOKp_on(sv);
1955         (void)SvNOK_on(sv);
1956         SvIVX(sv) = IV_MIN;
1957         return IS_NUMBER_UNDERFLOW_IV;
1958     }
1959     if (SvNVX(sv) > (NV)UV_MAX) {
1960         (void)SvIOKp_on(sv);
1961         (void)SvNOK_on(sv);
1962         SvIsUV_on(sv);
1963         SvUVX(sv) = UV_MAX;
1964         return IS_NUMBER_OVERFLOW_UV;
1965     }
1966     (void)SvIOKp_on(sv);
1967     (void)SvNOK_on(sv);
1968     /* Can't use strtol etc to convert this string.  (See truth table in
1969        sv_2iv  */
1970     if (SvNVX(sv) <= (UV)IV_MAX) {
1971         SvIVX(sv) = I_V(SvNVX(sv));
1972         if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
1973             SvIOK_on(sv); /* Integer is precise. NOK, IOK */
1974         } else {
1975             /* Integer is imprecise. NOK, IOKp */
1976         }
1977         return SvNVX(sv) < 0 ? IS_NUMBER_UNDERFLOW_UV : IS_NUMBER_IV_AND_UV;
1978     }
1979     SvIsUV_on(sv);
1980     SvUVX(sv) = U_V(SvNVX(sv));
1981     if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
1982         if (SvUVX(sv) == UV_MAX) {
1983             /* As we know that NVs don't preserve UVs, UV_MAX cannot
1984                possibly be preserved by NV. Hence, it must be overflow.
1985                NOK, IOKp */
1986             return IS_NUMBER_OVERFLOW_UV;
1987         }
1988         SvIOK_on(sv); /* Integer is precise. NOK, UOK */
1989     } else {
1990         /* Integer is imprecise. NOK, IOKp */
1991     }
1992     return IS_NUMBER_OVERFLOW_IV;
1993 }
1994 #endif /* !NV_PRESERVES_UV*/
1995
1996 /*
1997 =for apidoc sv_2iv
1998
1999 Return the integer value of an SV, doing any necessary string conversion,
2000 magic etc. Normally used via the C<SvIV(sv)> and C<SvIVx(sv)> macros.
2001
2002 =cut
2003 */
2004
2005 IV
2006 Perl_sv_2iv(pTHX_ register SV *sv)
2007 {
2008     if (!sv)
2009         return 0;
2010     if (SvGMAGICAL(sv)) {
2011         mg_get(sv);
2012         if (SvIOKp(sv))
2013             return SvIVX(sv);
2014         if (SvNOKp(sv)) {
2015             return I_V(SvNVX(sv));
2016         }
2017         if (SvPOKp(sv) && SvLEN(sv))
2018             return asIV(sv);
2019         if (!SvROK(sv)) {
2020             if (!(SvFLAGS(sv) & SVs_PADTMP)) {
2021                 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
2022                     report_uninit();
2023             }
2024             return 0;
2025         }
2026     }
2027     if (SvTHINKFIRST(sv)) {
2028         if (SvROK(sv)) {
2029           SV* tmpstr;
2030           if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
2031                 (SvTYPE(tmpstr) != SVt_RV || (SvRV(tmpstr) != SvRV(sv))))
2032               return SvIV(tmpstr);
2033           return PTR2IV(SvRV(sv));
2034         }
2035         if (SvREADONLY(sv) && SvFAKE(sv)) {
2036             sv_force_normal(sv);
2037         }
2038         if (SvREADONLY(sv) && !SvOK(sv)) {
2039             if (ckWARN(WARN_UNINITIALIZED))
2040                 report_uninit();
2041             return 0;
2042         }
2043     }
2044     if (SvIOKp(sv)) {
2045         if (SvIsUV(sv)) {
2046             return (IV)(SvUVX(sv));
2047         }
2048         else {
2049             return SvIVX(sv);
2050         }
2051     }
2052     if (SvNOKp(sv)) {
2053         /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
2054          * without also getting a cached IV/UV from it at the same time
2055          * (ie PV->NV conversion should detect loss of accuracy and cache
2056          * IV or UV at same time to avoid this.  NWC */
2057
2058         if (SvTYPE(sv) == SVt_NV)
2059             sv_upgrade(sv, SVt_PVNV);
2060
2061         (void)SvIOKp_on(sv);    /* Must do this first, to clear any SvOOK */
2062         /* < not <= as for NV doesn't preserve UV, ((NV)IV_MAX+1) will almost
2063            certainly cast into the IV range at IV_MAX, whereas the correct
2064            answer is the UV IV_MAX +1. Hence < ensures that dodgy boundary
2065            cases go to UV */
2066         if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2067             SvIVX(sv) = I_V(SvNVX(sv));
2068             if (SvNVX(sv) == (NV) SvIVX(sv)
2069 #ifndef NV_PRESERVES_UV
2070                 && (((UV)1 << NV_PRESERVES_UV_BITS) >
2071                     (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
2072                 /* Don't flag it as "accurately an integer" if the number
2073                    came from a (by definition imprecise) NV operation, and
2074                    we're outside the range of NV integer precision */
2075 #endif
2076                 ) {
2077                 SvIOK_on(sv);  /* Can this go wrong with rounding? NWC */
2078                 DEBUG_c(PerlIO_printf(Perl_debug_log,
2079                                       "0x%"UVxf" iv(%"NVgf" => %"IVdf") (precise)\n",
2080                                       PTR2UV(sv),
2081                                       SvNVX(sv),
2082                                       SvIVX(sv)));
2083
2084             } else {
2085                 /* IV not precise.  No need to convert from PV, as NV
2086                    conversion would already have cached IV if it detected
2087                    that PV->IV would be better than PV->NV->IV
2088                    flags already correct - don't set public IOK.  */
2089                 DEBUG_c(PerlIO_printf(Perl_debug_log,
2090                                       "0x%"UVxf" iv(%"NVgf" => %"IVdf") (imprecise)\n",
2091                                       PTR2UV(sv),
2092                                       SvNVX(sv),
2093                                       SvIVX(sv)));
2094             }
2095             /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
2096                but the cast (NV)IV_MIN rounds to a the value less (more
2097                negative) than IV_MIN which happens to be equal to SvNVX ??
2098                Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
2099                NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
2100                (NV)UVX == NVX are both true, but the values differ. :-(
2101                Hopefully for 2s complement IV_MIN is something like
2102                0x8000000000000000 which will be exact. NWC */
2103         }
2104         else {
2105             SvUVX(sv) = U_V(SvNVX(sv));
2106             if (
2107                 (SvNVX(sv) == (NV) SvUVX(sv))
2108 #ifndef  NV_PRESERVES_UV
2109                 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
2110                 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
2111                 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
2112                 /* Don't flag it as "accurately an integer" if the number
2113                    came from a (by definition imprecise) NV operation, and
2114                    we're outside the range of NV integer precision */
2115 #endif
2116                 )
2117                 SvIOK_on(sv);
2118             SvIsUV_on(sv);
2119           ret_iv_max:
2120             DEBUG_c(PerlIO_printf(Perl_debug_log,
2121                                   "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
2122                                   PTR2UV(sv),
2123                                   SvUVX(sv),
2124                                   SvUVX(sv)));
2125             return (IV)SvUVX(sv);
2126         }
2127     }
2128     else if (SvPOKp(sv) && SvLEN(sv)) {
2129         UV value;
2130         int numtype = grok_number(SvPVX(sv), SvCUR(sv), &value);
2131         /* We want to avoid a possible problem when we cache an IV which
2132            may be later translated to an NV, and the resulting NV is not
2133            the same as the direct translation of the initial string
2134            (eg 123.456 can shortcut to the IV 123 with atol(), but we must
2135            be careful to ensure that the value with the .456 is around if the
2136            NV value is requested in the future).
2137         
2138            This means that if we cache such an IV, we need to cache the
2139            NV as well.  Moreover, we trade speed for space, and do not
2140            cache the NV if we are sure it's not needed.
2141          */
2142
2143         /* SVt_PVNV is one higher than SVt_PVIV, hence this order  */
2144         if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2145              == IS_NUMBER_IN_UV) {
2146             /* It's definitely an integer, only upgrade to PVIV */
2147             if (SvTYPE(sv) < SVt_PVIV)
2148                 sv_upgrade(sv, SVt_PVIV);
2149             (void)SvIOK_on(sv);
2150         } else if (SvTYPE(sv) < SVt_PVNV)
2151             sv_upgrade(sv, SVt_PVNV);
2152
2153         /* If NV preserves UV then we only use the UV value if we know that
2154            we aren't going to call atof() below. If NVs don't preserve UVs
2155            then the value returned may have more precision than atof() will
2156            return, even though value isn't perfectly accurate.  */
2157         if ((numtype & (IS_NUMBER_IN_UV
2158 #ifdef NV_PRESERVES_UV
2159                         | IS_NUMBER_NOT_INT
2160 #endif
2161             )) == IS_NUMBER_IN_UV) {
2162             /* This won't turn off the public IOK flag if it was set above  */
2163             (void)SvIOKp_on(sv);
2164
2165             if (!(numtype & IS_NUMBER_NEG)) {
2166                 /* positive */;
2167                 if (value <= (UV)IV_MAX) {
2168                     SvIVX(sv) = (IV)value;
2169                 } else {
2170                     SvUVX(sv) = value;
2171                     SvIsUV_on(sv);
2172                 }
2173             } else {
2174                 /* 2s complement assumption  */
2175                 if (value <= (UV)IV_MIN) {
2176                     SvIVX(sv) = -(IV)value;
2177                 } else {
2178                     /* Too negative for an IV.  This is a double upgrade, but
2179                        I'm assuming it will be rare.  */
2180                     if (SvTYPE(sv) < SVt_PVNV)
2181                         sv_upgrade(sv, SVt_PVNV);
2182                     SvNOK_on(sv);
2183                     SvIOK_off(sv);
2184                     SvIOKp_on(sv);
2185                     SvNVX(sv) = -(NV)value;
2186                     SvIVX(sv) = IV_MIN;
2187                 }
2188             }
2189         }
2190         /* For !NV_PRESERVES_UV and IS_NUMBER_IN_UV and IS_NUMBER_NOT_INT we
2191            will be in the previous block to set the IV slot, and the next
2192            block to set the NV slot.  So no else here.  */
2193         
2194         if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2195             != IS_NUMBER_IN_UV) {
2196             /* It wasn't an (integer that doesn't overflow the UV). */
2197             SvNVX(sv) = Atof(SvPVX(sv));
2198
2199             if (! numtype && ckWARN(WARN_NUMERIC))
2200                 not_a_number(sv);
2201
2202 #if defined(USE_LONG_DOUBLE)
2203             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%" PERL_PRIgldbl ")\n",
2204                                   PTR2UV(sv), SvNVX(sv)));
2205 #else
2206             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"NVgf")\n",
2207                                   PTR2UV(sv), SvNVX(sv)));
2208 #endif
2209
2210
2211 #ifdef NV_PRESERVES_UV
2212             (void)SvIOKp_on(sv);
2213             (void)SvNOK_on(sv);
2214             if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2215                 SvIVX(sv) = I_V(SvNVX(sv));
2216                 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2217                     SvIOK_on(sv);
2218                 } else {
2219                     /* Integer is imprecise. NOK, IOKp */
2220                 }
2221                 /* UV will not work better than IV */
2222             } else {
2223                 if (SvNVX(sv) > (NV)UV_MAX) {
2224                     SvIsUV_on(sv);
2225                     /* Integer is inaccurate. NOK, IOKp, is UV */
2226                     SvUVX(sv) = UV_MAX;
2227                     SvIsUV_on(sv);
2228                 } else {
2229                     SvUVX(sv) = U_V(SvNVX(sv));
2230                     /* 0xFFFFFFFFFFFFFFFF not an issue in here */
2231                     if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2232                         SvIOK_on(sv);
2233                         SvIsUV_on(sv);
2234                     } else {
2235                         /* Integer is imprecise. NOK, IOKp, is UV */
2236                         SvIsUV_on(sv);
2237                     }
2238                 }
2239                 goto ret_iv_max;
2240             }
2241 #else /* NV_PRESERVES_UV */
2242             if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2243                 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
2244                 /* The IV slot will have been set from value returned by
2245                    grok_number above.  The NV slot has just been set using
2246                    Atof.  */
2247                 SvNOK_on(sv);
2248                 assert (SvIOKp(sv));
2249             } else {
2250                 if (((UV)1 << NV_PRESERVES_UV_BITS) >
2251                     U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2252                     /* Small enough to preserve all bits. */
2253                     (void)SvIOKp_on(sv);
2254                     SvNOK_on(sv);
2255                     SvIVX(sv) = I_V(SvNVX(sv));
2256                     if ((NV)(SvIVX(sv)) == SvNVX(sv))
2257                         SvIOK_on(sv);
2258                     /* Assumption: first non-preserved integer is < IV_MAX,
2259                        this NV is in the preserved range, therefore: */
2260                     if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
2261                           < (UV)IV_MAX)) {
2262                         Perl_croak(aTHX_ "sv_2iv assumed (U_V(fabs(SvNVX(sv))) < (UV)IV_MAX) but SvNVX(sv)=%"NVgf" U_V is 0x%"UVxf", IV_MAX is 0x%"UVxf"\n", SvNVX(sv), U_V(SvNVX(sv)), (UV)IV_MAX);
2263                     }
2264                 } else {
2265                     /* IN_UV NOT_INT
2266                          0      0       already failed to read UV.
2267                          0      1       already failed to read UV.
2268                          1      0       you won't get here in this case. IV/UV
2269                                         slot set, public IOK, Atof() unneeded.
2270                          1      1       already read UV.
2271                        so there's no point in sv_2iuv_non_preserve() attempting
2272                        to use atol, strtol, strtoul etc.  */
2273                     if (sv_2iuv_non_preserve (sv, numtype)
2274                         >= IS_NUMBER_OVERFLOW_IV)
2275                     goto ret_iv_max;
2276                 }
2277             }
2278 #endif /* NV_PRESERVES_UV */
2279         }
2280     } else  {
2281         if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
2282             report_uninit();
2283         if (SvTYPE(sv) < SVt_IV)
2284             /* Typically the caller expects that sv_any is not NULL now.  */
2285             sv_upgrade(sv, SVt_IV);
2286         return 0;
2287     }
2288     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
2289         PTR2UV(sv),SvIVX(sv)));
2290     return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
2291 }
2292
2293 /*
2294 =for apidoc sv_2uv
2295
2296 Return the unsigned integer value of an SV, doing any necessary string
2297 conversion, magic etc. Normally used via the C<SvUV(sv)> and C<SvUVx(sv)>
2298 macros.
2299
2300 =cut
2301 */
2302
2303 UV
2304 Perl_sv_2uv(pTHX_ register SV *sv)
2305 {
2306     if (!sv)
2307         return 0;
2308     if (SvGMAGICAL(sv)) {
2309         mg_get(sv);
2310         if (SvIOKp(sv))
2311             return SvUVX(sv);
2312         if (SvNOKp(sv))
2313             return U_V(SvNVX(sv));
2314         if (SvPOKp(sv) && SvLEN(sv))
2315             return asUV(sv);
2316         if (!SvROK(sv)) {
2317             if (!(SvFLAGS(sv) & SVs_PADTMP)) {
2318                 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
2319                     report_uninit();
2320             }
2321             return 0;
2322         }
2323     }
2324     if (SvTHINKFIRST(sv)) {
2325         if (SvROK(sv)) {
2326           SV* tmpstr;
2327           if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
2328                 (SvTYPE(tmpstr) != SVt_RV || (SvRV(tmpstr) != SvRV(sv))))
2329               return SvUV(tmpstr);
2330           return PTR2UV(SvRV(sv));
2331         }
2332         if (SvREADONLY(sv) && SvFAKE(sv)) {
2333             sv_force_normal(sv);
2334         }
2335         if (SvREADONLY(sv) && !SvOK(sv)) {
2336             if (ckWARN(WARN_UNINITIALIZED))
2337                 report_uninit();
2338             return 0;
2339         }
2340     }
2341     if (SvIOKp(sv)) {
2342         if (SvIsUV(sv)) {
2343             return SvUVX(sv);
2344         }
2345         else {
2346             return (UV)SvIVX(sv);
2347         }
2348     }
2349     if (SvNOKp(sv)) {
2350         /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
2351          * without also getting a cached IV/UV from it at the same time
2352          * (ie PV->NV conversion should detect loss of accuracy and cache
2353          * IV or UV at same time to avoid this. */
2354         /* IV-over-UV optimisation - choose to cache IV if possible */
2355
2356         if (SvTYPE(sv) == SVt_NV)
2357             sv_upgrade(sv, SVt_PVNV);
2358
2359         (void)SvIOKp_on(sv);    /* Must do this first, to clear any SvOOK */
2360         if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2361             SvIVX(sv) = I_V(SvNVX(sv));
2362             if (SvNVX(sv) == (NV) SvIVX(sv)
2363 #ifndef NV_PRESERVES_UV
2364                 && (((UV)1 << NV_PRESERVES_UV_BITS) >
2365                     (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
2366                 /* Don't flag it as "accurately an integer" if the number
2367                    came from a (by definition imprecise) NV operation, and
2368                    we're outside the range of NV integer precision */
2369 #endif
2370                 ) {
2371                 SvIOK_on(sv);  /* Can this go wrong with rounding? NWC */
2372                 DEBUG_c(PerlIO_printf(Perl_debug_log,
2373                                       "0x%"UVxf" uv(%"NVgf" => %"IVdf") (precise)\n",
2374                                       PTR2UV(sv),
2375                                       SvNVX(sv),
2376                                       SvIVX(sv)));
2377
2378             } else {
2379                 /* IV not precise.  No need to convert from PV, as NV
2380                    conversion would already have cached IV if it detected
2381                    that PV->IV would be better than PV->NV->IV
2382                    flags already correct - don't set public IOK.  */
2383                 DEBUG_c(PerlIO_printf(Perl_debug_log,
2384                                       "0x%"UVxf" uv(%"NVgf" => %"IVdf") (imprecise)\n",
2385                                       PTR2UV(sv),
2386                                       SvNVX(sv),
2387                                       SvIVX(sv)));
2388             }
2389             /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
2390                but the cast (NV)IV_MIN rounds to a the value less (more
2391                negative) than IV_MIN which happens to be equal to SvNVX ??
2392                Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
2393                NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
2394                (NV)UVX == NVX are both true, but the values differ. :-(
2395                Hopefully for 2s complement IV_MIN is something like
2396                0x8000000000000000 which will be exact. NWC */
2397         }
2398         else {
2399             SvUVX(sv) = U_V(SvNVX(sv));
2400             if (
2401                 (SvNVX(sv) == (NV) SvUVX(sv))
2402 #ifndef  NV_PRESERVES_UV
2403                 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
2404                 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
2405                 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
2406                 /* Don't flag it as "accurately an integer" if the number
2407                    came from a (by definition imprecise) NV operation, and
2408                    we're outside the range of NV integer precision */
2409 #endif
2410                 )
2411                 SvIOK_on(sv);
2412             SvIsUV_on(sv);
2413             DEBUG_c(PerlIO_printf(Perl_debug_log,
2414                                   "0x%"UVxf" 2uv(%"UVuf" => %"IVdf") (as unsigned)\n",
2415                                   PTR2UV(sv),
2416                                   SvUVX(sv),
2417                                   SvUVX(sv)));
2418         }
2419     }
2420     else if (SvPOKp(sv) && SvLEN(sv)) {
2421         UV value;
2422         int numtype = grok_number(SvPVX(sv), SvCUR(sv), &value);
2423
2424         /* We want to avoid a possible problem when we cache a UV which
2425            may be later translated to an NV, and the resulting NV is not
2426            the translation of the initial data.
2427         
2428            This means that if we cache such a UV, we need to cache the
2429            NV as well.  Moreover, we trade speed for space, and do not
2430            cache the NV if not needed.
2431          */
2432
2433         /* SVt_PVNV is one higher than SVt_PVIV, hence this order  */
2434         if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2435              == IS_NUMBER_IN_UV) {
2436             /* It's definitely an integer, only upgrade to PVIV */
2437             if (SvTYPE(sv) < SVt_PVIV)
2438                 sv_upgrade(sv, SVt_PVIV);
2439             (void)SvIOK_on(sv);
2440         } else if (SvTYPE(sv) < SVt_PVNV)
2441             sv_upgrade(sv, SVt_PVNV);
2442
2443         /* If NV preserves UV then we only use the UV value if we know that
2444            we aren't going to call atof() below. If NVs don't preserve UVs
2445            then the value returned may have more precision than atof() will
2446            return, even though it isn't accurate.  */
2447         if ((numtype & (IS_NUMBER_IN_UV
2448 #ifdef NV_PRESERVES_UV
2449                         | IS_NUMBER_NOT_INT
2450 #endif
2451             )) == IS_NUMBER_IN_UV) {
2452             /* This won't turn off the public IOK flag if it was set above  */
2453             (void)SvIOKp_on(sv);
2454
2455             if (!(numtype & IS_NUMBER_NEG)) {
2456                 /* positive */;
2457                 if (value <= (UV)IV_MAX) {
2458                     SvIVX(sv) = (IV)value;
2459                 } else {
2460                     /* it didn't overflow, and it was positive. */
2461                     SvUVX(sv) = value;
2462                     SvIsUV_on(sv);
2463                 }
2464             } else {
2465                 /* 2s complement assumption  */
2466                 if (value <= (UV)IV_MIN) {
2467                     SvIVX(sv) = -(IV)value;
2468                 } else {
2469                     /* Too negative for an IV.  This is a double upgrade, but
2470                        I'm assuming it will be rare.  */
2471                     if (SvTYPE(sv) < SVt_PVNV)
2472                         sv_upgrade(sv, SVt_PVNV);
2473                     SvNOK_on(sv);
2474                     SvIOK_off(sv);
2475                     SvIOKp_on(sv);
2476                     SvNVX(sv) = -(NV)value;
2477                     SvIVX(sv) = IV_MIN;
2478                 }
2479             }
2480         }
2481         
2482         if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2483             != IS_NUMBER_IN_UV) {
2484             /* It wasn't an integer, or it overflowed the UV. */
2485             SvNVX(sv) = Atof(SvPVX(sv));
2486
2487             if (! numtype && ckWARN(WARN_NUMERIC))
2488                     not_a_number(sv);
2489
2490 #if defined(USE_LONG_DOUBLE)
2491             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%" PERL_PRIgldbl ")\n",
2492                                   PTR2UV(sv), SvNVX(sv)));
2493 #else
2494             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"NVgf")\n",
2495                                   PTR2UV(sv), SvNVX(sv)));
2496 #endif
2497
2498 #ifdef NV_PRESERVES_UV
2499             (void)SvIOKp_on(sv);
2500             (void)SvNOK_on(sv);
2501             if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2502                 SvIVX(sv) = I_V(SvNVX(sv));
2503                 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2504                     SvIOK_on(sv);
2505                 } else {
2506                     /* Integer is imprecise. NOK, IOKp */
2507                 }
2508                 /* UV will not work better than IV */
2509             } else {
2510                 if (SvNVX(sv) > (NV)UV_MAX) {
2511                     SvIsUV_on(sv);
2512                     /* Integer is inaccurate. NOK, IOKp, is UV */
2513                     SvUVX(sv) = UV_MAX;
2514                     SvIsUV_on(sv);
2515                 } else {
2516                     SvUVX(sv) = U_V(SvNVX(sv));
2517                     /* 0xFFFFFFFFFFFFFFFF not an issue in here, NVs
2518                        NV preservse UV so can do correct comparison.  */
2519                     if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2520                         SvIOK_on(sv);
2521                         SvIsUV_on(sv);
2522                     } else {
2523                         /* Integer is imprecise. NOK, IOKp, is UV */
2524                         SvIsUV_on(sv);
2525                     }
2526                 }
2527             }
2528 #else /* NV_PRESERVES_UV */
2529             if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2530                 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
2531                 /* The UV slot will have been set from value returned by
2532                    grok_number above.  The NV slot has just been set using
2533                    Atof.  */
2534                 SvNOK_on(sv);
2535                 assert (SvIOKp(sv));
2536             } else {
2537                 if (((UV)1 << NV_PRESERVES_UV_BITS) >
2538                     U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2539                     /* Small enough to preserve all bits. */
2540                     (void)SvIOKp_on(sv);
2541                     SvNOK_on(sv);
2542                     SvIVX(sv) = I_V(SvNVX(sv));
2543                     if ((NV)(SvIVX(sv)) == SvNVX(sv))
2544                         SvIOK_on(sv);
2545                     /* Assumption: first non-preserved integer is < IV_MAX,
2546                        this NV is in the preserved range, therefore: */
2547                     if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
2548                           < (UV)IV_MAX)) {
2549                         Perl_croak(aTHX_ "sv_2uv assumed (U_V(fabs(SvNVX(sv))) < (UV)IV_MAX) but SvNVX(sv)=%"NVgf" U_V is 0x%"UVxf", IV_MAX is 0x%"UVxf"\n", SvNVX(sv), U_V(SvNVX(sv)), (UV)IV_MAX);
2550                     }
2551                 } else
2552                     sv_2iuv_non_preserve (sv, numtype);
2553             }
2554 #endif /* NV_PRESERVES_UV */
2555         }
2556     }
2557     else  {
2558         if (!(SvFLAGS(sv) & SVs_PADTMP)) {
2559             if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
2560                 report_uninit();
2561         }
2562         if (SvTYPE(sv) < SVt_IV)
2563             /* Typically the caller expects that sv_any is not NULL now.  */
2564             sv_upgrade(sv, SVt_IV);
2565         return 0;
2566     }
2567
2568     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
2569                           PTR2UV(sv),SvUVX(sv)));
2570     return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
2571 }
2572
2573 /*
2574 =for apidoc sv_2nv
2575
2576 Return the num value of an SV, doing any necessary string or integer
2577 conversion, magic etc. Normally used via the C<SvNV(sv)> and C<SvNVx(sv)>
2578 macros.
2579
2580 =cut
2581 */
2582
2583 NV
2584 Perl_sv_2nv(pTHX_ register SV *sv)
2585 {
2586     if (!sv)
2587         return 0.0;
2588     if (SvGMAGICAL(sv)) {
2589         mg_get(sv);
2590         if (SvNOKp(sv))
2591             return SvNVX(sv);
2592         if (SvPOKp(sv) && SvLEN(sv)) {
2593             if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) &&
2594                 !grok_number(SvPVX(sv), SvCUR(sv), NULL))
2595                 not_a_number(sv);
2596             return Atof(SvPVX(sv));
2597         }
2598         if (SvIOKp(sv)) {
2599             if (SvIsUV(sv))
2600                 return (NV)SvUVX(sv);
2601             else
2602                 return (NV)SvIVX(sv);
2603         }       
2604         if (!SvROK(sv)) {
2605             if (!(SvFLAGS(sv) & SVs_PADTMP)) {
2606                 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
2607                     report_uninit();
2608             }
2609             return 0;
2610         }
2611     }
2612     if (SvTHINKFIRST(sv)) {
2613         if (SvROK(sv)) {
2614           SV* tmpstr;
2615           if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
2616                 (SvTYPE(tmpstr) != SVt_RV || (SvRV(tmpstr) != SvRV(sv))))
2617               return SvNV(tmpstr);
2618           return PTR2NV(SvRV(sv));
2619         }
2620         if (SvREADONLY(sv) && SvFAKE(sv)) {
2621             sv_force_normal(sv);
2622         }
2623         if (SvREADONLY(sv) && !SvOK(sv)) {
2624             if (ckWARN(WARN_UNINITIALIZED))
2625                 report_uninit();
2626             return 0.0;
2627         }
2628     }
2629     if (SvTYPE(sv) < SVt_NV) {
2630         if (SvTYPE(sv) == SVt_IV)
2631             sv_upgrade(sv, SVt_PVNV);
2632         else
2633             sv_upgrade(sv, SVt_NV);
2634 #ifdef USE_LONG_DOUBLE
2635         DEBUG_c({
2636             STORE_NUMERIC_LOCAL_SET_STANDARD();
2637             PerlIO_printf(Perl_debug_log,
2638                           "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
2639                           PTR2UV(sv), SvNVX(sv));
2640             RESTORE_NUMERIC_LOCAL();
2641         });
2642 #else
2643         DEBUG_c({
2644             STORE_NUMERIC_LOCAL_SET_STANDARD();
2645             PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%"NVgf")\n",
2646                           PTR2UV(sv), SvNVX(sv));
2647             RESTORE_NUMERIC_LOCAL();
2648         });
2649 #endif
2650     }
2651     else if (SvTYPE(sv) < SVt_PVNV)
2652         sv_upgrade(sv, SVt_PVNV);
2653     if (SvNOKp(sv)) {
2654         return SvNVX(sv);
2655     }
2656     if (SvIOKp(sv)) {
2657         SvNVX(sv) = SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv);
2658 #ifdef NV_PRESERVES_UV
2659         SvNOK_on(sv);
2660 #else
2661         /* Only set the public NV OK flag if this NV preserves the IV  */
2662         /* Check it's not 0xFFFFFFFFFFFFFFFF */
2663         if (SvIsUV(sv) ? ((SvUVX(sv) != UV_MAX)&&(SvUVX(sv) == U_V(SvNVX(sv))))
2664                        : (SvIVX(sv) == I_V(SvNVX(sv))))
2665             SvNOK_on(sv);
2666         else
2667             SvNOKp_on(sv);
2668 #endif
2669     }
2670     else if (SvPOKp(sv) && SvLEN(sv)) {
2671         UV value;
2672         int numtype = grok_number(SvPVX(sv), SvCUR(sv), &value);
2673         if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !numtype)
2674             not_a_number(sv);
2675 #ifdef NV_PRESERVES_UV
2676         if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2677             == IS_NUMBER_IN_UV) {
2678             /* It's definitely an integer */
2679             SvNVX(sv) = (numtype & IS_NUMBER_NEG) ? -(NV)value : (NV)value;
2680         } else
2681             SvNVX(sv) = Atof(SvPVX(sv));
2682         SvNOK_on(sv);
2683 #else
2684         SvNVX(sv) = Atof(SvPVX(sv));
2685         /* Only set the public NV OK flag if this NV preserves the value in
2686            the PV at least as well as an IV/UV would.
2687            Not sure how to do this 100% reliably. */
2688         /* if that shift count is out of range then Configure's test is
2689            wonky. We shouldn't be in here with NV_PRESERVES_UV_BITS ==
2690            UV_BITS */
2691         if (((UV)1 << NV_PRESERVES_UV_BITS) >
2692             U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2693             SvNOK_on(sv); /* Definitely small enough to preserve all bits */
2694         } else if (!(numtype & IS_NUMBER_IN_UV)) {
2695             /* Can't use strtol etc to convert this string, so don't try.
2696                sv_2iv and sv_2uv will use the NV to convert, not the PV.  */
2697             SvNOK_on(sv);
2698         } else {
2699             /* value has been set.  It may not be precise.  */
2700             if ((numtype & IS_NUMBER_NEG) && (value > (UV)IV_MIN)) {
2701                 /* 2s complement assumption for (UV)IV_MIN  */
2702                 SvNOK_on(sv); /* Integer is too negative.  */
2703             } else {
2704                 SvNOKp_on(sv);
2705                 SvIOKp_on(sv);
2706
2707                 if (numtype & IS_NUMBER_NEG) {
2708                     SvIVX(sv) = -(IV)value;
2709                 } else if (value <= (UV)IV_MAX) {
2710                     SvIVX(sv) = (IV)value;
2711                 } else {
2712                     SvUVX(sv) = value;
2713                     SvIsUV_on(sv);
2714                 }
2715
2716                 if (numtype & IS_NUMBER_NOT_INT) {
2717                     /* I believe that even if the original PV had decimals,
2718                        they are lost beyond the limit of the FP precision.
2719                        However, neither is canonical, so both only get p
2720                        flags.  NWC, 2000/11/25 */
2721                     /* Both already have p flags, so do nothing */
2722                 } else {
2723                     NV nv = SvNVX(sv);
2724                     if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2725                         if (SvIVX(sv) == I_V(nv)) {
2726                             SvNOK_on(sv);
2727                             SvIOK_on(sv);
2728                         } else {
2729                             SvIOK_on(sv);
2730                             /* It had no "." so it must be integer.  */
2731                         }
2732                     } else {
2733                         /* between IV_MAX and NV(UV_MAX).
2734                            Could be slightly > UV_MAX */
2735
2736                         if (numtype & IS_NUMBER_NOT_INT) {
2737                             /* UV and NV both imprecise.  */
2738                         } else {
2739                             UV nv_as_uv = U_V(nv);
2740
2741                             if (value == nv_as_uv && SvUVX(sv) != UV_MAX) {
2742                                 SvNOK_on(sv);
2743                                 SvIOK_on(sv);
2744                             } else {
2745                                 SvIOK_on(sv);
2746                             }
2747                         }
2748                     }
2749                 }
2750             }
2751         }
2752 #endif /* NV_PRESERVES_UV */
2753     }
2754     else  {
2755         if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
2756             report_uninit();
2757         if (SvTYPE(sv) < SVt_NV)
2758             /* Typically the caller expects that sv_any is not NULL now.  */
2759             /* XXX Ilya implies that this is a bug in callers that assume this
2760                and ideally should be fixed.  */
2761             sv_upgrade(sv, SVt_NV);
2762         return 0.0;
2763     }
2764 #if defined(USE_LONG_DOUBLE)
2765     DEBUG_c({
2766         STORE_NUMERIC_LOCAL_SET_STANDARD();
2767         PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
2768                       PTR2UV(sv), SvNVX(sv));
2769         RESTORE_NUMERIC_LOCAL();
2770     });
2771 #else
2772     DEBUG_c({
2773         STORE_NUMERIC_LOCAL_SET_STANDARD();
2774         PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%"NVgf")\n",
2775                       PTR2UV(sv), SvNVX(sv));
2776         RESTORE_NUMERIC_LOCAL();
2777     });
2778 #endif
2779     return SvNVX(sv);
2780 }
2781
2782 /* asIV(): extract an integer from the string value of an SV.
2783  * Caller must validate PVX  */
2784
2785 STATIC IV
2786 S_asIV(pTHX_ SV *sv)
2787 {
2788     UV value;
2789     int numtype = grok_number(SvPVX(sv), SvCUR(sv), &value);
2790
2791     if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2792         == IS_NUMBER_IN_UV) {
2793         /* It's definitely an integer */
2794         if (numtype & IS_NUMBER_NEG) {
2795             if (value < (UV)IV_MIN)
2796                 return -(IV)value;
2797         } else {
2798             if (value < (UV)IV_MAX)
2799                 return (IV)value;
2800         }
2801     }
2802     if (!numtype) {
2803         if (ckWARN(WARN_NUMERIC))
2804             not_a_number(sv);
2805     }
2806     return I_V(Atof(SvPVX(sv)));
2807 }
2808
2809 /* asUV(): extract an unsigned integer from the string value of an SV
2810  * Caller must validate PVX  */
2811
2812 STATIC UV
2813 S_asUV(pTHX_ SV *sv)
2814 {
2815     UV value;
2816     int numtype = grok_number(SvPVX(sv), SvCUR(sv), &value);
2817
2818     if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2819         == IS_NUMBER_IN_UV) {
2820         /* It's definitely an integer */
2821         if (!(numtype & IS_NUMBER_NEG))
2822             return value;
2823     }
2824     if (!numtype) {
2825         if (ckWARN(WARN_NUMERIC))
2826             not_a_number(sv);
2827     }
2828     return U_V(Atof(SvPVX(sv)));
2829 }
2830
2831 /*
2832 =for apidoc sv_2pv_nolen
2833
2834 Like C<sv_2pv()>, but doesn't return the length too. You should usually
2835 use the macro wrapper C<SvPV_nolen(sv)> instead.
2836 =cut
2837 */
2838
2839 char *
2840 Perl_sv_2pv_nolen(pTHX_ register SV *sv)
2841 {
2842     STRLEN n_a;
2843     return sv_2pv(sv, &n_a);
2844 }
2845
2846 /* uiv_2buf(): private routine for use by sv_2pv_flags(): print an IV or
2847  * UV as a string towards the end of buf, and return pointers to start and
2848  * end of it.
2849  *
2850  * We assume that buf is at least TYPE_CHARS(UV) long.
2851  */
2852
2853 static char *
2854 uiv_2buf(char *buf, IV iv, UV uv, int is_uv, char **peob)
2855 {
2856     char *ptr = buf + TYPE_CHARS(UV);
2857     char *ebuf = ptr;
2858     int sign;
2859
2860     if (is_uv)
2861         sign = 0;
2862     else if (iv >= 0) {
2863         uv = iv;
2864         sign = 0;
2865     } else {
2866         uv = -iv;
2867         sign = 1;
2868     }
2869     do {
2870         *--ptr = '0' + (uv % 10);
2871     } while (uv /= 10);
2872     if (sign)
2873         *--ptr = '-';
2874     *peob = ebuf;
2875     return ptr;
2876 }
2877
2878 /* sv_2pv() is now a macro using Perl_sv_2pv_flags();
2879  * this function provided for binary compatibility only
2880  */
2881
2882 char *
2883 Perl_sv_2pv(pTHX_ register SV *sv, STRLEN *lp)
2884 {
2885     return sv_2pv_flags(sv, lp, SV_GMAGIC);
2886 }
2887
2888 /*
2889 =for apidoc sv_2pv_flags
2890
2891 Returns a pointer to the string value of an SV, and sets *lp to its length.
2892 If flags includes SV_GMAGIC, does an mg_get() first. Coerces sv to a string
2893 if necessary.
2894 Normally invoked via the C<SvPV_flags> macro. C<sv_2pv()> and C<sv_2pv_nomg>
2895 usually end up here too.
2896
2897 =cut
2898 */
2899
2900 char *
2901 Perl_sv_2pv_flags(pTHX_ register SV *sv, STRLEN *lp, I32 flags)
2902 {
2903     register char *s;
2904     int olderrno;
2905     SV *tsv;
2906     char tbuf[64];      /* Must fit sprintf/Gconvert of longest IV/NV */
2907     char *tmpbuf = tbuf;
2908
2909     if (!sv) {
2910         *lp = 0;
2911         return "";
2912     }
2913     if (SvGMAGICAL(sv)) {
2914         if (flags & SV_GMAGIC)
2915             mg_get(sv);
2916         if (SvPOKp(sv)) {
2917             *lp = SvCUR(sv);
2918             return SvPVX(sv);
2919         }
2920         if (SvIOKp(sv)) {
2921             if (SvIsUV(sv))
2922                 (void)sprintf(tmpbuf,"%"UVuf, (UV)SvUVX(sv));
2923             else
2924                 (void)sprintf(tmpbuf,"%"IVdf, (IV)SvIVX(sv));
2925             tsv = Nullsv;
2926             goto tokensave;
2927         }
2928         if (SvNOKp(sv)) {
2929             Gconvert(SvNVX(sv), NV_DIG, 0, tmpbuf);
2930             tsv = Nullsv;
2931             goto tokensave;
2932         }
2933         if (!SvROK(sv)) {
2934             if (!(SvFLAGS(sv) & SVs_PADTMP)) {
2935                 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
2936                     report_uninit();
2937             }
2938             *lp = 0;
2939             return "";
2940         }
2941     }
2942     if (SvTHINKFIRST(sv)) {
2943         if (SvROK(sv)) {
2944             SV* tmpstr;
2945             if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)) &&
2946                 (SvTYPE(tmpstr) != SVt_RV || (SvRV(tmpstr) != SvRV(sv))))
2947                 return SvPV(tmpstr,*lp);
2948             sv = (SV*)SvRV(sv);
2949             if (!sv)
2950                 s = "NULLREF";
2951             else {
2952                 MAGIC *mg;
2953                 
2954                 switch (SvTYPE(sv)) {
2955                 case SVt_PVMG:
2956                     if ( ((SvFLAGS(sv) &
2957                            (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG))
2958                           == (SVs_OBJECT|SVs_RMG))
2959                          && strEQ(s=HvNAME(SvSTASH(sv)), "Regexp")
2960                          && (mg = mg_find(sv, PERL_MAGIC_qr))) {
2961                         regexp *re = (regexp *)mg->mg_obj;
2962
2963                         if (!mg->mg_ptr) {
2964                             char *fptr = "msix";
2965                             char reflags[6];
2966                             char ch;
2967                             int left = 0;
2968                             int right = 4;
2969                             char need_newline = 0;
2970                             U16 reganch = (re->reganch & PMf_COMPILETIME) >> 12;
2971
2972                             while((ch = *fptr++)) {
2973                                 if(reganch & 1) {
2974                                     reflags[left++] = ch;
2975                                 }
2976                                 else {
2977                                     reflags[right--] = ch;
2978                                 }
2979                                 reganch >>= 1;
2980                             }
2981                             if(left != 4) {
2982                                 reflags[left] = '-';
2983                                 left = 5;
2984                             }
2985
2986                             mg->mg_len = re->prelen + 4 + left;
2987                             /*
2988                              * If /x was used, we have to worry about a regex
2989                              * ending with a comment later being embedded
2990                              * within another regex. If so, we don't want this
2991                              * regex's "commentization" to leak out to the
2992                              * right part of the enclosing regex, we must cap
2993                              * it with a newline.
2994                              *
2995                              * So, if /x was used, we scan backwards from the
2996                              * end of the regex. If we find a '#' before we
2997                              * find a newline, we need to add a newline
2998                              * ourself. If we find a '\n' first (or if we
2999                              * don't find '#' or '\n'), we don't need to add
3000                              * anything.  -jfriedl
3001                              */
3002                             if (PMf_EXTENDED & re->reganch)
3003                             {
3004                                 char *endptr = re->precomp + re->prelen;
3005                                 while (endptr >= re->precomp)
3006                                 {
3007                                     char c = *(endptr--);
3008                                     if (c == '\n')
3009                                         break; /* don't need another */
3010                                     if (c == '#') {
3011                                         /* we end while in a comment, so we
3012                                            need a newline */
3013                                         mg->mg_len++; /* save space for it */
3014                                         need_newline = 1; /* note to add it */
3015                                     }
3016                                 }
3017                             }
3018
3019                             New(616, mg->mg_ptr, mg->mg_len + 1 + left, char);
3020                             Copy("(?", mg->mg_ptr, 2, char);
3021                             Copy(reflags, mg->mg_ptr+2, left, char);
3022                             Copy(":", mg->mg_ptr+left+2, 1, char);
3023                             Copy(re->precomp, mg->mg_ptr+3+left, re->prelen, char);
3024                             if (need_newline)
3025                                 mg->mg_ptr[mg->mg_len - 2] = '\n';
3026                             mg->mg_ptr[mg->mg_len - 1] = ')';
3027                             mg->mg_ptr[mg->mg_len] = 0;
3028                         }
3029                         PL_reginterp_cnt += re->program[0].next_off;
3030                         *lp = mg->mg_len;
3031                         return mg->mg_ptr;
3032                     }
3033                                         /* Fall through */
3034                 case SVt_NULL:
3035                 case SVt_IV:
3036                 case SVt_NV:
3037                 case SVt_RV:
3038                 case SVt_PV:
3039                 case SVt_PVIV:
3040                 case SVt_PVNV:
3041                 case SVt_PVBM:  if (SvROK(sv))
3042                                     s = "REF";
3043                                 else
3044                                     s = "SCALAR";               break;
3045                 case SVt_PVLV:  s = "LVALUE";                   break;
3046                 case SVt_PVAV:  s = "ARRAY";                    break;
3047                 case SVt_PVHV:  s = "HASH";                     break;
3048                 case SVt_PVCV:  s = "CODE";                     break;
3049                 case SVt_PVGV:  s = "GLOB";                     break;
3050                 case SVt_PVFM:  s = "FORMAT";                   break;
3051                 case SVt_PVIO:  s = "IO";                       break;
3052                 default:        s = "UNKNOWN";                  break;
3053                 }
3054                 tsv = NEWSV(0,0);
3055                 if (SvOBJECT(sv)) {
3056                     HV *svs = SvSTASH(sv);
3057                     Perl_sv_setpvf(
3058                         aTHX_ tsv, "%s=%s",
3059                         /* [20011101.072] This bandaid for C<package;>
3060                            should eventually be removed. AMS 20011103 */
3061                         (svs ? HvNAME(svs) : "<none>"), s
3062                     );
3063                 }
3064                 else
3065                     sv_setpv(tsv, s);
3066                 Perl_sv_catpvf(aTHX_ tsv, "(0x%"UVxf")", PTR2UV(sv));
3067                 goto tokensaveref;
3068             }
3069             *lp = strlen(s);
3070             return s;
3071         }
3072         if (SvREADONLY(sv) && !SvOK(sv)) {
3073             if (ckWARN(WARN_UNINITIALIZED))
3074                 report_uninit();
3075             *lp = 0;
3076             return "";
3077         }
3078     }
3079     if (SvIOK(sv) || ((SvIOKp(sv) && !SvNOKp(sv)))) {
3080         /* I'm assuming that if both IV and NV are equally valid then
3081            converting the IV is going to be more efficient */
3082         U32 isIOK = SvIOK(sv);
3083         U32 isUIOK = SvIsUV(sv);
3084         char buf[TYPE_CHARS(UV)];
3085         char *ebuf, *ptr;
3086
3087         if (SvTYPE(sv) < SVt_PVIV)
3088             sv_upgrade(sv, SVt_PVIV);
3089         if (isUIOK)
3090             ptr = uiv_2buf(buf, 0, SvUVX(sv), 1, &ebuf);
3091         else
3092             ptr = uiv_2buf(buf, SvIVX(sv), 0, 0, &ebuf);
3093         SvGROW(sv, ebuf - ptr + 1);     /* inlined from sv_setpvn */
3094         Move(ptr,SvPVX(sv),ebuf - ptr,char);
3095         SvCUR_set(sv, ebuf - ptr);
3096         s = SvEND(sv);
3097         *s = '\0';
3098         if (isIOK)
3099             SvIOK_on(sv);
3100         else
3101             SvIOKp_on(sv);
3102         if (isUIOK)
3103             SvIsUV_on(sv);
3104     }
3105     else if (SvNOKp(sv)) {
3106         if (SvTYPE(sv) < SVt_PVNV)
3107             sv_upgrade(sv, SVt_PVNV);
3108         /* The +20 is pure guesswork.  Configure test needed. --jhi */
3109         SvGROW(sv, NV_DIG + 20);
3110         s = SvPVX(sv);
3111         olderrno = errno;       /* some Xenix systems wipe out errno here */
3112 #ifdef apollo
3113         if (SvNVX(sv) == 0.0)
3114             (void)strcpy(s,"0");
3115         else
3116 #endif /*apollo*/
3117         {
3118             Gconvert(SvNVX(sv), NV_DIG, 0, s);
3119         }
3120         errno = olderrno;
3121 #ifdef FIXNEGATIVEZERO
3122         if (*s == '-' && s[1] == '0' && !s[2])
3123             strcpy(s,"0");
3124 #endif
3125         while (*s) s++;
3126 #ifdef hcx
3127         if (s[-1] == '.')
3128             *--s = '\0';
3129 #endif
3130     }
3131     else {
3132         if (ckWARN(WARN_UNINITIALIZED)
3133             && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
3134             report_uninit();
3135         *lp = 0;
3136         if (SvTYPE(sv) < SVt_PV)
3137             /* Typically the caller expects that sv_any is not NULL now.  */
3138             sv_upgrade(sv, SVt_PV);
3139         return "";
3140     }
3141     *lp = s - SvPVX(sv);
3142     SvCUR_set(sv, *lp);
3143     SvPOK_on(sv);
3144     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3145                           PTR2UV(sv),SvPVX(sv)));
3146     return SvPVX(sv);
3147
3148   tokensave:
3149     if (SvROK(sv)) {    /* XXX Skip this when sv_pvn_force calls */
3150         /* Sneaky stuff here */
3151
3152       tokensaveref:
3153         if (!tsv)
3154             tsv = newSVpv(tmpbuf, 0);
3155         sv_2mortal(tsv);
3156         *lp = SvCUR(tsv);
3157         return SvPVX(tsv);
3158     }
3159     else {
3160         STRLEN len;
3161         char *t;
3162
3163         if (tsv) {
3164             sv_2mortal(tsv);
3165             t = SvPVX(tsv);
3166             len = SvCUR(tsv);
3167         }
3168         else {
3169             t = tmpbuf;
3170             len = strlen(tmpbuf);
3171         }
3172 #ifdef FIXNEGATIVEZERO
3173         if (len == 2 && t[0] == '-' && t[1] == '0') {
3174             t = "0";
3175             len = 1;
3176         }
3177 #endif
3178         (void)SvUPGRADE(sv, SVt_PV);
3179         *lp = len;
3180         s = SvGROW(sv, len + 1);
3181         SvCUR_set(sv, len);
3182         (void)strcpy(s, t);
3183         SvPOKp_on(sv);
3184         return s;
3185     }
3186 }
3187
3188 /*
3189 =for apidoc sv_copypv
3190
3191 Copies a stringified representation of the source SV into the
3192 destination SV.  Automatically performs any necessary mg_get and
3193 coercion of numeric values into strings.  Guaranteed to preserve
3194 UTF-8 flag even from overloaded objects.  Similar in nature to
3195 sv_2pv[_flags] but operates directly on an SV instead of just the
3196 string.  Mostly uses sv_2pv_flags to do its work, except when that
3197 would lose the UTF-8'ness of the PV.
3198
3199 =cut
3200 */
3201
3202 void
3203 Perl_sv_copypv(pTHX_ SV *dsv, register SV *ssv)
3204 {
3205     SV *tmpsv = sv_newmortal();
3206
3207     if ( SvTHINKFIRST(ssv) && SvROK(ssv) && SvAMAGIC(ssv) ) {
3208         tmpsv = AMG_CALLun(ssv,string);
3209         if (SvTYPE(tmpsv) != SVt_RV || (SvRV(tmpsv) != SvRV(ssv))) {
3210             SvSetSV(dsv,tmpsv);
3211             return;
3212         }
3213     }
3214     {
3215         STRLEN len;
3216         char *s;
3217         s = SvPV(ssv,len);
3218         sv_setpvn(tmpsv,s,len);
3219         if (SvUTF8(ssv))
3220             SvUTF8_on(tmpsv);
3221         else
3222             SvUTF8_off(tmpsv);
3223         SvSetSV(dsv,tmpsv);
3224     }
3225 }
3226
3227 /*
3228 =for apidoc sv_2pvbyte_nolen
3229
3230 Return a pointer to the byte-encoded representation of the SV.
3231 May cause the SV to be downgraded from UTF8 as a side-effect.
3232
3233 Usually accessed via the C<SvPVbyte_nolen> macro.
3234
3235 =cut
3236 */
3237
3238 char *
3239 Perl_sv_2pvbyte_nolen(pTHX_ register SV *sv)
3240 {
3241     STRLEN n_a;
3242     return sv_2pvbyte(sv, &n_a);
3243 }
3244
3245 /*
3246 =for apidoc sv_2pvbyte
3247
3248 Return a pointer to the byte-encoded representation of the SV, and set *lp
3249 to its length.  May cause the SV to be downgraded from UTF8 as a
3250 side-effect.
3251
3252 Usually accessed via the C<SvPVbyte> macro.
3253
3254 =cut
3255 */
3256
3257 char *
3258 Perl_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
3259 {
3260     sv_utf8_downgrade(sv,0);
3261     return SvPV(sv,*lp);
3262 }
3263
3264 /*
3265 =for apidoc sv_2pvutf8_nolen
3266
3267 Return a pointer to the UTF8-encoded representation of the SV.
3268 May cause the SV to be upgraded to UTF8 as a side-effect.
3269
3270 Usually accessed via the C<SvPVutf8_nolen> macro.
3271
3272 =cut
3273 */
3274
3275 char *
3276 Perl_sv_2pvutf8_nolen(pTHX_ register SV *sv)
3277 {
3278     STRLEN n_a;
3279     return sv_2pvutf8(sv, &n_a);
3280 }
3281
3282 /*
3283 =for apidoc sv_2pvutf8
3284
3285 Return a pointer to the UTF8-encoded representation of the SV, and set *lp
3286 to its length.  May cause the SV to be upgraded to UTF8 as a side-effect.
3287
3288 Usually accessed via the C<SvPVutf8> macro.
3289
3290 =cut
3291 */
3292
3293 char *
3294 Perl_sv_2pvutf8(pTHX_ register SV *sv, STRLEN *lp)
3295 {
3296     sv_utf8_upgrade(sv);
3297     return SvPV(sv,*lp);
3298 }
3299
3300 /*
3301 =for apidoc sv_2bool
3302
3303 This function is only called on magical items, and is only used by
3304 sv_true() or its macro equivalent.
3305
3306 =cut
3307 */
3308
3309 bool
3310 Perl_sv_2bool(pTHX_ register SV *sv)
3311 {
3312     if (SvGMAGICAL(sv))
3313         mg_get(sv);
3314
3315     if (!SvOK(sv))
3316         return 0;
3317     if (SvROK(sv)) {
3318         SV* tmpsv;
3319         if (SvAMAGIC(sv) && (tmpsv=AMG_CALLun(sv,bool_)) &&
3320                 (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
3321             return SvTRUE(tmpsv);
3322       return SvRV(sv) != 0;
3323     }
3324     if (SvPOKp(sv)) {
3325         register XPV* Xpvtmp;
3326         if ((Xpvtmp = (XPV*)SvANY(sv)) &&
3327                 (*Xpvtmp->xpv_pv > '0' ||
3328                 Xpvtmp->xpv_cur > 1 ||
3329                 (Xpvtmp->xpv_cur && *Xpvtmp->xpv_pv != '0')))
3330             return 1;
3331         else
3332             return 0;
3333     }
3334     else {
3335         if (SvIOKp(sv))
3336             return SvIVX(sv) != 0;
3337         else {
3338             if (SvNOKp(sv))
3339                 return SvNVX(sv) != 0.0;
3340             else
3341                 return FALSE;
3342         }
3343     }
3344 }
3345
3346 /*
3347 =for apidoc sv_utf8_upgrade
3348
3349 Convert the PV of an SV to its UTF8-encoded form.
3350 Forces the SV to string form if it is not already.
3351 Always sets the SvUTF8 flag to avoid future validity checks even
3352 if all the bytes have hibit clear.
3353
3354 This is not as a general purpose byte encoding to Unicode interface:
3355 use the Encode extension for that.
3356
3357 =cut
3358 */
3359
3360 /* sv_utf8_upgrade() is now a macro using sv_utf8_upgrade_flags();
3361  * this function provided for binary compatibility only
3362  */
3363
3364
3365 STRLEN
3366 Perl_sv_utf8_upgrade(pTHX_ register SV *sv)
3367 {
3368     return sv_utf8_upgrade_flags(sv, SV_GMAGIC);
3369 }
3370
3371 /*
3372 =for apidoc sv_utf8_upgrade_flags
3373
3374 Convert the PV of an SV to its UTF8-encoded form.
3375 Forces the SV to string form if it is not already.
3376 Always sets the SvUTF8 flag to avoid future validity checks even
3377 if all the bytes have hibit clear. If C<flags> has C<SV_GMAGIC> bit set,
3378 will C<mg_get> on C<sv> if appropriate, else not. C<sv_utf8_upgrade> and
3379 C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
3380
3381 This is not as a general purpose byte encoding to Unicode interface:
3382 use the Encode extension for that.
3383
3384 =cut
3385 */
3386
3387 STRLEN
3388 Perl_sv_utf8_upgrade_flags(pTHX_ register SV *sv, I32 flags)
3389 {
3390     U8 *s, *t, *e;
3391     int  hibit = 0;
3392
3393     if (!sv)
3394         return 0;
3395
3396     if (!SvPOK(sv)) {
3397         STRLEN len = 0;
3398         (void) sv_2pv_flags(sv,&len, flags);
3399         if (!SvPOK(sv))
3400              return len;
3401     }
3402
3403     if (SvUTF8(sv))
3404         return SvCUR(sv);
3405
3406     if (SvREADONLY(sv) && SvFAKE(sv)) {
3407         sv_force_normal(sv);
3408     }
3409
3410     if (PL_encoding)
3411         sv_recode_to_utf8(sv, PL_encoding);
3412     else { /* Assume Latin-1/EBCDIC */
3413          /* This function could be much more efficient if we
3414           * had a FLAG in SVs to signal if there are any hibit
3415           * chars in the PV.  Given that there isn't such a flag
3416           * make the loop as fast as possible. */
3417          s = (U8 *) SvPVX(sv);
3418          e = (U8 *) SvEND(sv);
3419          t = s;
3420          while (t < e) {
3421               U8 ch = *t++;
3422               if ((hibit = !NATIVE_IS_INVARIANT(ch)))
3423                    break;
3424          }
3425          if (hibit) {
3426               STRLEN len;
3427         
3428               len = SvCUR(sv) + 1; /* Plus the \0 */
3429               SvPVX(sv) = (char*)bytes_to_utf8((U8*)s, &len);
3430               SvCUR(sv) = len - 1;
3431               if (SvLEN(sv) != 0)
3432                    Safefree(s); /* No longer using what was there before. */
3433               SvLEN(sv) = len; /* No longer know the real size. */
3434          }
3435          /* Mark as UTF-8 even if no hibit - saves scanning loop */
3436          SvUTF8_on(sv);
3437     }
3438     return SvCUR(sv);
3439 }
3440
3441 /*
3442 =for apidoc sv_utf8_downgrade
3443
3444 Attempt to convert the PV of an SV from UTF8-encoded to byte encoding.
3445 This may not be possible if the PV contains non-byte encoding characters;
3446 if this is the case, either returns false or, if C<fail_ok> is not
3447 true, croaks.
3448
3449 This is not as a general purpose Unicode to byte encoding interface:
3450 use the Encode extension for that.
3451
3452 =cut
3453 */
3454
3455 bool
3456 Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
3457 {
3458     if (SvPOK(sv) && SvUTF8(sv)) {
3459         if (SvCUR(sv)) {
3460             U8 *s;
3461             STRLEN len;
3462
3463             if (SvREADONLY(sv) && SvFAKE(sv))
3464                 sv_force_normal(sv);
3465             s = (U8 *) SvPV(sv, len);
3466             if (!utf8_to_bytes(s, &len)) {
3467                 if (fail_ok)
3468                     return FALSE;
3469                 else {
3470                     if (PL_op)
3471                         Perl_croak(aTHX_ "Wide character in %s",
3472                                    OP_DESC(PL_op));
3473                     else
3474                         Perl_croak(aTHX_ "Wide character");
3475                 }
3476             }
3477             SvCUR(sv) = len;
3478         }
3479     }
3480     SvUTF8_off(sv);
3481     return TRUE;
3482 }
3483
3484 /*
3485 =for apidoc sv_utf8_encode
3486
3487 Convert the PV of an SV to UTF8-encoded, but then turn off the C<SvUTF8>
3488 flag so that it looks like octets again. Used as a building block
3489 for encode_utf8 in Encode.xs
3490
3491 =cut
3492 */
3493
3494 void
3495 Perl_sv_utf8_encode(pTHX_ register SV *sv)
3496 {
3497     (void) sv_utf8_upgrade(sv);
3498     SvUTF8_off(sv);
3499 }
3500
3501 /*
3502 =for apidoc sv_utf8_decode
3503
3504 Convert the octets in the PV from UTF-8 to chars. Scan for validity and then
3505 turn off SvUTF8 if needed so that we see characters. Used as a building block
3506 for decode_utf8 in Encode.xs
3507
3508 =cut
3509 */
3510
3511 bool
3512 Perl_sv_utf8_decode(pTHX_ register SV *sv)
3513 {
3514     if (SvPOK(sv)) {
3515         U8 *c;
3516         U8 *e;
3517
3518         /* The octets may have got themselves encoded - get them back as
3519          * bytes
3520          */
3521         if (!sv_utf8_downgrade(sv, TRUE))
3522             return FALSE;
3523
3524         /* it is actually just a matter of turning the utf8 flag on, but
3525          * we want to make sure everything inside is valid utf8 first.
3526          */
3527         c = (U8 *) SvPVX(sv);
3528         if (!is_utf8_string(c, SvCUR(sv)+1))
3529             return FALSE;
3530         e = (U8 *) SvEND(sv);
3531         while (c < e) {
3532             U8 ch = *c++;
3533             if (!UTF8_IS_INVARIANT(ch)) {
3534                 SvUTF8_on(sv);
3535                 break;
3536             }
3537         }
3538     }
3539     return TRUE;
3540 }
3541
3542 /*
3543 =for apidoc sv_setsv
3544
3545 Copies the contents of the source SV C<ssv> into the destination SV
3546 C<dsv>.  The source SV may be destroyed if it is mortal, so don't use this
3547 function if the source SV needs to be reused. Does not handle 'set' magic.
3548 Loosely speaking, it performs a copy-by-value, obliterating any previous
3549 content of the destination.
3550
3551 You probably want to use one of the assortment of wrappers, such as
3552 C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3553 C<SvSetMagicSV_nosteal>.
3554
3555
3556 =cut
3557 */
3558
3559 /* sv_setsv() is now a macro using Perl_sv_setsv_flags();
3560  * this function provided for binary compatibility only
3561  */
3562
3563 void
3564 Perl_sv_setsv(pTHX_ SV *dstr, register SV *sstr)
3565 {
3566     sv_setsv_flags(dstr, sstr, SV_GMAGIC);
3567 }
3568
3569 /*
3570 =for apidoc sv_setsv_flags
3571
3572 Copies the contents of the source SV C<ssv> into the destination SV
3573 C<dsv>.  The source SV may be destroyed if it is mortal, so don't use this
3574 function if the source SV needs to be reused. Does not handle 'set' magic.
3575 Loosely speaking, it performs a copy-by-value, obliterating any previous
3576 content of the destination.
3577 If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
3578 C<ssv> if appropriate, else not. C<sv_setsv> and C<sv_setsv_nomg> are
3579 implemented in terms of this function.
3580
3581 You probably want to use one of the assortment of wrappers, such as
3582 C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3583 C<SvSetMagicSV_nosteal>.
3584
3585 This is the primary function for copying scalars, and most other
3586 copy-ish functions and macros use this underneath.
3587
3588 =cut
3589 */
3590
3591 void
3592 Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags)
3593 {
3594     register U32 sflags;
3595     register int dtype;
3596     register int stype;
3597
3598     if (sstr == dstr)
3599         return;
3600     SV_CHECK_THINKFIRST(dstr);
3601     if (!sstr)
3602         sstr = &PL_sv_undef;
3603     stype = SvTYPE(sstr);
3604     dtype = SvTYPE(dstr);
3605
3606     SvAMAGIC_off(dstr);
3607
3608     /* There's a lot of redundancy below but we're going for speed here */
3609
3610     switch (stype) {
3611     case SVt_NULL:
3612       undef_sstr:
3613         if (dtype != SVt_PVGV) {
3614             (void)SvOK_off(dstr);
3615             return;
3616         }
3617         break;
3618     case SVt_IV:
3619         if (SvIOK(sstr)) {
3620             switch (dtype) {
3621             case SVt_NULL:
3622                 sv_upgrade(dstr, SVt_IV);
3623                 break;
3624             case SVt_NV:
3625                 sv_upgrade(dstr, SVt_PVNV);
3626                 break;
3627             case SVt_RV:
3628             case SVt_PV:
3629                 sv_upgrade(dstr, SVt_PVIV);
3630                 break;
3631             }
3632             (void)SvIOK_only(dstr);
3633             SvIVX(dstr) = SvIVX(sstr);
3634             if (SvIsUV(sstr))
3635                 SvIsUV_on(dstr);
3636             if (SvTAINTED(sstr))
3637                 SvTAINT(dstr);
3638             return;
3639         }
3640         goto undef_sstr;
3641
3642     case SVt_NV:
3643         if (SvNOK(sstr)) {
3644             switch (dtype) {
3645             case SVt_NULL:
3646             case SVt_IV:
3647                 sv_upgrade(dstr, SVt_NV);
3648                 break;
3649             case SVt_RV:
3650             case SVt_PV:
3651             case SVt_PVIV:
3652                 sv_upgrade(dstr, SVt_PVNV);
3653                 break;
3654             }
3655             SvNVX(dstr) = SvNVX(sstr);
3656             (void)SvNOK_only(dstr);
3657             if (SvTAINTED(sstr))
3658                 SvTAINT(dstr);
3659             return;
3660         }
3661         goto undef_sstr;
3662
3663     case SVt_RV:
3664         if (dtype < SVt_RV)
3665             sv_upgrade(dstr, SVt_RV);
3666         else if (dtype == SVt_PVGV &&
3667                  SvTYPE(SvRV(sstr)) == SVt_PVGV) {
3668             sstr = SvRV(sstr);
3669             if (sstr == dstr) {
3670                 if (GvIMPORTED(dstr) != GVf_IMPORTED
3671                     && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3672                 {
3673                     GvIMPORTED_on(dstr);
3674                 }
3675                 GvMULTI_on(dstr);
3676                 return;
3677             }
3678             goto glob_assign;
3679         }
3680         break;
3681     case SVt_PV:
3682     case SVt_PVFM:
3683         if (dtype < SVt_PV)
3684             sv_upgrade(dstr, SVt_PV);
3685         break;
3686     case SVt_PVIV:
3687         if (dtype < SVt_PVIV)
3688             sv_upgrade(dstr, SVt_PVIV);
3689         break;
3690     case SVt_PVNV:
3691         if (dtype < SVt_PVNV)
3692             sv_upgrade(dstr, SVt_PVNV);
3693         break;
3694     case SVt_PVAV:
3695     case SVt_PVHV:
3696     case SVt_PVCV:
3697     case SVt_PVIO:
3698         if (PL_op)
3699             Perl_croak(aTHX_ "Bizarre copy of %s in %s", sv_reftype(sstr, 0),
3700                 OP_NAME(PL_op));
3701         else
3702             Perl_croak(aTHX_ "Bizarre copy of %s", sv_reftype(sstr, 0));
3703         break;
3704
3705     case SVt_PVGV:
3706         if (dtype <= SVt_PVGV) {
3707   glob_assign:
3708             if (dtype != SVt_PVGV) {
3709                 char *name = GvNAME(sstr);
3710                 STRLEN len = GvNAMELEN(sstr);
3711                 sv_upgrade(dstr, SVt_PVGV);
3712                 sv_magic(dstr, dstr, PERL_MAGIC_glob, Nullch, 0);
3713                 GvSTASH(dstr) = (HV*)SvREFCNT_inc(GvSTASH(sstr));
3714                 GvNAME(dstr) = savepvn(name, len);
3715                 GvNAMELEN(dstr) = len;
3716                 SvFAKE_on(dstr);        /* can coerce to non-glob */
3717             }
3718             /* ahem, death to those who redefine active sort subs */
3719             else if (PL_curstackinfo->si_type == PERLSI_SORT
3720                      && GvCV(dstr) && PL_sortcop == CvSTART(GvCV(dstr)))
3721                 Perl_croak(aTHX_ "Can't redefine active sort subroutine %s",
3722                       GvNAME(dstr));
3723
3724 #ifdef GV_UNIQUE_CHECK
3725                 if (GvUNIQUE((GV*)dstr)) {
3726                     Perl_croak(aTHX_ PL_no_modify);
3727                 }
3728 #endif
3729
3730             (void)SvOK_off(dstr);
3731             GvINTRO_off(dstr);          /* one-shot flag */
3732             gp_free((GV*)dstr);
3733             GvGP(dstr) = gp_ref(GvGP(sstr));
3734             if (SvTAINTED(sstr))
3735                 SvTAINT(dstr);
3736             if (GvIMPORTED(dstr) != GVf_IMPORTED
3737                 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3738             {
3739                 GvIMPORTED_on(dstr);
3740             }
3741             GvMULTI_on(dstr);
3742             return;
3743         }
3744         /* FALL THROUGH */
3745
3746     default:
3747         if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
3748             mg_get(sstr);
3749             if (SvTYPE(sstr) != stype) {
3750                 stype = SvTYPE(sstr);
3751                 if (stype == SVt_PVGV && dtype <= SVt_PVGV)
3752                     goto glob_assign;
3753             }
3754         }
3755         if (stype == SVt_PVLV)
3756             (void)SvUPGRADE(dstr, SVt_PVNV);
3757         else
3758             (void)SvUPGRADE(dstr, stype);
3759     }
3760
3761     sflags = SvFLAGS(sstr);
3762
3763     if (sflags & SVf_ROK) {
3764         if (dtype >= SVt_PV) {
3765             if (dtype == SVt_PVGV) {
3766                 SV *sref = SvREFCNT_inc(SvRV(sstr));
3767                 SV *dref = 0;
3768                 int intro = GvINTRO(dstr);
3769
3770 #ifdef GV_UNIQUE_CHECK
3771                 if (GvUNIQUE((GV*)dstr)) {
3772                     Perl_croak(aTHX_ PL_no_modify);
3773                 }
3774 #endif
3775
3776                 if (intro) {
3777                     GvINTRO_off(dstr);  /* one-shot flag */
3778                     GvLINE(dstr) = CopLINE(PL_curcop);
3779                     GvEGV(dstr) = (GV*)dstr;
3780                 }
3781                 GvMULTI_on(dstr);
3782                 switch (SvTYPE(sref)) {
3783                 case SVt_PVAV:
3784                     if (intro)
3785                         SAVESPTR(GvAV(dstr));
3786                     else
3787                         dref = (SV*)GvAV(dstr);
3788                     GvAV(dstr) = (AV*)sref;
3789                     if (!GvIMPORTED_AV(dstr)
3790                         && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3791                     {
3792                         GvIMPORTED_AV_on(dstr);
3793                     }
3794                     break;
3795                 case SVt_PVHV:
3796                     if (intro)
3797                         SAVESPTR(GvHV(dstr));
3798                     else
3799                         dref = (SV*)GvHV(dstr);
3800                     GvHV(dstr) = (HV*)sref;
3801                     if (!GvIMPORTED_HV(dstr)
3802                         && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3803                     {
3804                         GvIMPORTED_HV_on(dstr);
3805                     }
3806                     break;
3807                 case SVt_PVCV:
3808                     if (intro) {
3809                         if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
3810                             SvREFCNT_dec(GvCV(dstr));
3811                             GvCV(dstr) = Nullcv;
3812                             GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3813                             PL_sub_generation++;
3814                         }
3815                         SAVESPTR(GvCV(dstr));
3816                     }
3817                     else
3818                         dref = (SV*)GvCV(dstr);
3819                     if (GvCV(dstr) != (CV*)sref) {
3820                         CV* cv = GvCV(dstr);
3821                         if (cv) {
3822                             if (!GvCVGEN((GV*)dstr) &&
3823                                 (CvROOT(cv) || CvXSUB(cv)))
3824                             {
3825                                 /* ahem, death to those who redefine
3826                                  * active sort subs */
3827                                 if (PL_curstackinfo->si_type == PERLSI_SORT &&
3828                                       PL_sortcop == CvSTART(cv))
3829                                     Perl_croak(aTHX_
3830                                     "Can't redefine active sort subroutine %s",
3831                                           GvENAME((GV*)dstr));
3832                                 /* Redefining a sub - warning is mandatory if
3833                                    it was a const and its value changed. */
3834                                 if (ckWARN(WARN_REDEFINE)
3835                                     || (CvCONST(cv)
3836                                         && (!CvCONST((CV*)sref)
3837                                             || sv_cmp(cv_const_sv(cv),
3838                                                       cv_const_sv((CV*)sref)))))
3839                                 {
3840                                     Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
3841                                         CvCONST(cv)
3842                                         ? "Constant subroutine %s redefined"
3843                                         : "Subroutine %s redefined",
3844                                         GvENAME((GV*)dstr));
3845                                 }
3846                             }
3847                             if (!intro)
3848                                 cv_ckproto(cv, (GV*)dstr,
3849                                         SvPOK(sref) ? SvPVX(sref) : Nullch);
3850                         }
3851                         GvCV(dstr) = (CV*)sref;
3852                         GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3853                         GvASSUMECV_on(dstr);
3854                         PL_sub_generation++;
3855                     }
3856                     if (!GvIMPORTED_CV(dstr)
3857                         && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3858                     {
3859                         GvIMPORTED_CV_on(dstr);
3860                     }
3861                     break;
3862                 case SVt_PVIO:
3863                     if (intro)
3864                         SAVESPTR(GvIOp(dstr));
3865                     else
3866                         dref = (SV*)GvIOp(dstr);
3867                     GvIOp(dstr) = (IO*)sref;
3868                     break;
3869                 case SVt_PVFM:
3870                     if (intro)
3871                         SAVESPTR(GvFORM(dstr));
3872                     else
3873                         dref = (SV*)GvFORM(dstr);
3874                     GvFORM(dstr) = (CV*)sref;
3875                     break;
3876                 default:
3877                     if (intro)
3878                         SAVESPTR(GvSV(dstr));
3879                     else
3880                         dref = (SV*)GvSV(dstr);
3881                     GvSV(dstr) = sref;
3882                     if (!GvIMPORTED_SV(dstr)
3883                         && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3884                     {
3885                         GvIMPORTED_SV_on(dstr);
3886                     }
3887                     break;
3888                 }
3889                 if (dref)
3890                     SvREFCNT_dec(dref);
3891                 if (intro)
3892                     SAVEFREESV(sref);
3893                 if (SvTAINTED(sstr))
3894                     SvTAINT(dstr);
3895                 return;
3896             }
3897             if (SvPVX(dstr)) {
3898                 (void)SvOOK_off(dstr);          /* backoff */
3899                 if (SvLEN(dstr))
3900                     Safefree(SvPVX(dstr));
3901                 SvLEN(dstr)=SvCUR(dstr)=0;
3902             }
3903         }
3904         (void)SvOK_off(dstr);
3905         SvRV(dstr) = SvREFCNT_inc(SvRV(sstr));
3906         SvROK_on(dstr);
3907         if (sflags & SVp_NOK) {
3908             SvNOKp_on(dstr);
3909             /* Only set the public OK flag if the source has public OK.  */
3910             if (sflags & SVf_NOK)
3911                 SvFLAGS(dstr) |= SVf_NOK;
3912             SvNVX(dstr) = SvNVX(sstr);
3913         }
3914         if (sflags & SVp_IOK) {
3915             (void)SvIOKp_on(dstr);
3916             if (sflags & SVf_IOK)
3917                 SvFLAGS(dstr) |= SVf_IOK;
3918             if (sflags & SVf_IVisUV)
3919                 SvIsUV_on(dstr);
3920             SvIVX(dstr) = SvIVX(sstr);
3921         }
3922         if (SvAMAGIC(sstr)) {
3923             SvAMAGIC_on(dstr);
3924         }
3925     }
3926     else if (sflags & SVp_POK) {
3927
3928         /*
3929          * Check to see if we can just swipe the string.  If so, it's a
3930          * possible small lose on short strings, but a big win on long ones.
3931          * It might even be a win on short strings if SvPVX(dstr)
3932          * has to be allocated and SvPVX(sstr) has to be freed.
3933          */
3934
3935         if (SvTEMP(sstr) &&             /* slated for free anyway? */
3936             SvREFCNT(sstr) == 1 &&      /* and no other references to it? */
3937             !(sflags & SVf_OOK) &&      /* and not involved in OOK hack? */
3938             SvLEN(sstr)         &&      /* and really is a string */
3939                                 /* and won't be needed again, potentially */
3940             !(PL_op && PL_op->op_type == OP_AASSIGN))
3941         {
3942             if (SvPVX(dstr)) {          /* we know that dtype >= SVt_PV */
3943                 if (SvOOK(dstr)) {
3944                     SvFLAGS(dstr) &= ~SVf_OOK;
3945                     Safefree(SvPVX(dstr) - SvIVX(dstr));
3946                 }
3947                 else if (SvLEN(dstr))
3948                     Safefree(SvPVX(dstr));
3949             }
3950             (void)SvPOK_only(dstr);
3951             SvPV_set(dstr, SvPVX(sstr));
3952             SvLEN_set(dstr, SvLEN(sstr));
3953             SvCUR_set(dstr, SvCUR(sstr));
3954
3955             SvTEMP_off(dstr);
3956             (void)SvOK_off(sstr);       /* NOTE: nukes most SvFLAGS on sstr */
3957             SvPV_set(sstr, Nullch);
3958             SvLEN_set(sstr, 0);
3959             SvCUR_set(sstr, 0);
3960             SvTEMP_off(sstr);
3961         }
3962         else {                          /* have to copy actual string */
3963             STRLEN len = SvCUR(sstr);
3964             SvGROW(dstr, len + 1);      /* inlined from sv_setpvn */
3965             Move(SvPVX(sstr),SvPVX(dstr),len,char);
3966             SvCUR_set(dstr, len);
3967             *SvEND(dstr) = '\0';
3968             (void)SvPOK_only(dstr);
3969         }
3970         if (sflags & SVf_UTF8)
3971             SvUTF8_on(dstr);
3972         /*SUPPRESS 560*/
3973         if (sflags & SVp_NOK) {
3974             SvNOKp_on(dstr);
3975             if (sflags & SVf_NOK)
3976                 SvFLAGS(dstr) |= SVf_NOK;
3977             SvNVX(dstr) = SvNVX(sstr);
3978         }
3979         if (sflags & SVp_IOK) {
3980             (void)SvIOKp_on(dstr);
3981             if (sflags & SVf_IOK)
3982                 SvFLAGS(dstr) |= SVf_IOK;
3983             if (sflags & SVf_IVisUV)
3984                 SvIsUV_on(dstr);
3985             SvIVX(dstr) = SvIVX(sstr);
3986         }
3987     }
3988     else if (sflags & SVp_IOK) {
3989         if (sflags & SVf_IOK)
3990             (void)SvIOK_only(dstr);
3991         else {
3992             (void)SvOK_off(dstr);
3993             (void)SvIOKp_on(dstr);
3994         }
3995         /* XXXX Do we want to set IsUV for IV(ROK)?  Be extra safe... */
3996         if (sflags & SVf_IVisUV)
3997             SvIsUV_on(dstr);
3998         SvIVX(dstr) = SvIVX(sstr);
3999         if (sflags & SVp_NOK) {
4000             if (sflags & SVf_NOK)
4001                 (void)SvNOK_on(dstr);
4002             else
4003                 (void)SvNOKp_on(dstr);
4004             SvNVX(dstr) = SvNVX(sstr);
4005         }
4006     }
4007     else if (sflags & SVp_NOK) {
4008         if (sflags & SVf_NOK)
4009             (void)SvNOK_only(dstr);
4010         else {
4011             (void)SvOK_off(dstr);
4012             SvNOKp_on(dstr);
4013         }
4014         SvNVX(dstr) = SvNVX(sstr);
4015     }
4016     else {
4017         if (dtype == SVt_PVGV) {
4018             if (ckWARN(WARN_MISC))
4019                 Perl_warner(aTHX_ packWARN(WARN_MISC), "Undefined value assigned to typeglob");
4020         }
4021         else
4022             (void)SvOK_off(dstr);
4023     }
4024     if (SvTAINTED(sstr))
4025         SvTAINT(dstr);
4026 }
4027
4028 /*
4029 =for apidoc sv_setsv_mg
4030
4031 Like C<sv_setsv>, but also handles 'set' magic.
4032
4033 =cut
4034 */
4035
4036 void
4037 Perl_sv_setsv_mg(pTHX_ SV *dstr, register SV *sstr)
4038 {
4039     sv_setsv(dstr,sstr);
4040     SvSETMAGIC(dstr);
4041 }
4042
4043 /*
4044 =for apidoc sv_setpvn
4045
4046 Copies a string into an SV.  The C<len> parameter indicates the number of
4047 bytes to be copied.  Does not handle 'set' magic.  See C<sv_setpvn_mg>.
4048
4049 =cut
4050 */
4051
4052 void
4053 Perl_sv_setpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
4054 {
4055     register char *dptr;
4056
4057     SV_CHECK_THINKFIRST(sv);
4058     if (!ptr) {
4059         (void)SvOK_off(sv);
4060         return;
4061     }
4062     else {
4063         /* len is STRLEN which is unsigned, need to copy to signed */
4064         IV iv = len;
4065         if (iv < 0)
4066             Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen");
4067     }
4068     (void)SvUPGRADE(sv, SVt_PV);
4069
4070     SvGROW(sv, len + 1);
4071     dptr = SvPVX(sv);
4072     Move(ptr,dptr,len,char);
4073     dptr[len] = '\0';
4074     SvCUR_set(sv, len);
4075     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4076     SvTAINT(sv);
4077 }
4078
4079 /*
4080 =for apidoc sv_setpvn_mg
4081
4082 Like C<sv_setpvn>, but also handles 'set' magic.
4083
4084 =cut
4085 */
4086
4087 void
4088 Perl_sv_setpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
4089 {
4090     sv_setpvn(sv,ptr,len);
4091     SvSETMAGIC(sv);
4092 }
4093
4094 /*
4095 =for apidoc sv_setpv
4096
4097 Copies a string into an SV.  The string must be null-terminated.  Does not
4098 handle 'set' magic.  See C<sv_setpv_mg>.
4099
4100 =cut
4101 */
4102
4103 void
4104 Perl_sv_setpv(pTHX_ register SV *sv, register const char *ptr)
4105 {
4106     register STRLEN len;
4107
4108     SV_CHECK_THINKFIRST(sv);
4109     if (!ptr) {
4110         (void)SvOK_off(sv);
4111         return;
4112     }
4113     len = strlen(ptr);
4114     (void)SvUPGRADE(sv, SVt_PV);
4115
4116     SvGROW(sv, len + 1);
4117     Move(ptr,SvPVX(sv),len+1,char);
4118     SvCUR_set(sv, len);
4119     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4120     SvTAINT(sv);
4121 }
4122
4123 /*
4124 =for apidoc sv_setpv_mg
4125
4126 Like C<sv_setpv>, but also handles 'set' magic.
4127
4128 =cut
4129 */
4130
4131 void
4132 Perl_sv_setpv_mg(pTHX_ register SV *sv, register const char *ptr)
4133 {
4134     sv_setpv(sv,ptr);
4135     SvSETMAGIC(sv);
4136 }
4137
4138 /*
4139 =for apidoc sv_usepvn
4140
4141 Tells an SV to use C<ptr> to find its string value.  Normally the string is
4142 stored inside the SV but sv_usepvn allows the SV to use an outside string.
4143 The C<ptr> should point to memory that was allocated by C<malloc>.  The
4144 string length, C<len>, must be supplied.  This function will realloc the
4145 memory pointed to by C<ptr>, so that pointer should not be freed or used by
4146 the programmer after giving it to sv_usepvn.  Does not handle 'set' magic.
4147 See C<sv_usepvn_mg>.
4148
4149 =cut
4150 */
4151
4152 void
4153 Perl_sv_usepvn(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
4154 {
4155     SV_CHECK_THINKFIRST(sv);
4156     (void)SvUPGRADE(sv, SVt_PV);
4157     if (!ptr) {
4158         (void)SvOK_off(sv);
4159         return;
4160     }
4161     (void)SvOOK_off(sv);
4162     if (SvPVX(sv) && SvLEN(sv))
4163         Safefree(SvPVX(sv));
4164     Renew(ptr, len+1, char);
4165     SvPVX(sv) = ptr;
4166     SvCUR_set(sv, len);
4167     SvLEN_set(sv, len+1);
4168     *SvEND(sv) = '\0';
4169     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4170     SvTAINT(sv);
4171 }
4172
4173 /*
4174 =for apidoc sv_usepvn_mg
4175
4176 Like C<sv_usepvn>, but also handles 'set' magic.
4177
4178 =cut
4179 */
4180
4181 void
4182 Perl_sv_usepvn_mg(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
4183 {
4184     sv_usepvn(sv,ptr,len);
4185     SvSETMAGIC(sv);
4186 }
4187
4188 /*
4189 =for apidoc sv_force_normal_flags
4190
4191 Undo various types of fakery on an SV: if the PV is a shared string, make
4192 a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
4193 an xpvmg. The C<flags> parameter gets passed to  C<sv_unref_flags()>
4194 when unrefing. C<sv_force_normal> calls this function with flags set to 0.
4195
4196 =cut
4197 */
4198
4199 void
4200 Perl_sv_force_normal_flags(pTHX_ register SV *sv, U32 flags)
4201 {
4202     if (SvREADONLY(sv)) {
4203         if (SvFAKE(sv)) {
4204             char *pvx = SvPVX(sv);
4205             STRLEN len = SvCUR(sv);
4206             U32 hash   = SvUVX(sv);
4207             SvGROW(sv, len + 1);
4208             Move(pvx,SvPVX(sv),len,char);
4209             *SvEND(sv) = '\0';
4210             SvFAKE_off(sv);
4211             SvREADONLY_off(sv);
4212             unsharepvn(pvx, SvUTF8(sv) ? -(I32)len : len, hash);
4213         }
4214         else if (PL_curcop != &PL_compiling)
4215             Perl_croak(aTHX_ PL_no_modify);
4216     }
4217     if (SvROK(sv))
4218         sv_unref_flags(sv, flags);
4219     else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
4220         sv_unglob(sv);
4221 }
4222
4223 /*
4224 =for apidoc sv_force_normal
4225
4226 Undo various types of fakery on an SV: if the PV is a shared string, make
4227 a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
4228 an xpvmg. See also C<sv_force_normal_flags>.
4229
4230 =cut
4231 */
4232
4233 void
4234 Perl_sv_force_normal(pTHX_ register SV *sv)
4235 {
4236     sv_force_normal_flags(sv, 0);
4237 }
4238
4239 /*
4240 =for apidoc sv_chop
4241
4242 Efficient removal of characters from the beginning of the string buffer.
4243 SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
4244 the string buffer.  The C<ptr> becomes the first character of the adjusted
4245 string. Uses the "OOK hack".
4246
4247 =cut
4248 */
4249
4250 void
4251 Perl_sv_chop(pTHX_ register SV *sv, register char *ptr)
4252 {
4253     register STRLEN delta;
4254
4255     if (!ptr || !SvPOKp(sv))
4256         return;
4257     SV_CHECK_THINKFIRST(sv);
4258     if (SvTYPE(sv) < SVt_PVIV)
4259         sv_upgrade(sv,SVt_PVIV);
4260
4261     if (!SvOOK(sv)) {
4262         if (!SvLEN(sv)) { /* make copy of shared string */
4263             char *pvx = SvPVX(sv);
4264             STRLEN len = SvCUR(sv);
4265             SvGROW(sv, len + 1);
4266             Move(pvx,SvPVX(sv),len,char);
4267             *SvEND(sv) = '\0';
4268         }
4269         SvIVX(sv) = 0;
4270         SvFLAGS(sv) |= SVf_OOK;
4271     }
4272     SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVp_IOK|SVp_NOK|SVf_IVisUV);
4273     delta = ptr - SvPVX(sv);
4274     SvLEN(sv) -= delta;
4275     SvCUR(sv) -= delta;
4276     SvPVX(sv) += delta;
4277     SvIVX(sv) += delta;
4278 }
4279
4280 /*
4281 =for apidoc sv_catpvn
4282
4283 Concatenates the string onto the end of the string which is in the SV.  The
4284 C<len> indicates number of bytes to copy.  If the SV has the UTF8
4285 status set, then the bytes appended should be valid UTF8.
4286 Handles 'get' magic, but not 'set' magic.  See C<sv_catpvn_mg>.
4287
4288 =cut
4289 */
4290
4291 /* sv_catpvn() is now a macro using Perl_sv_catpvn_flags();
4292  * this function provided for binary compatibility only
4293  */
4294
4295 void
4296 Perl_sv_catpvn(pTHX_ SV *dsv, const char* sstr, STRLEN slen)
4297 {
4298     sv_catpvn_flags(dsv, sstr, slen, SV_GMAGIC);
4299 }
4300
4301 /*
4302 =for apidoc sv_catpvn_flags
4303
4304 Concatenates the string onto the end of the string which is in the SV.  The
4305 C<len> indicates number of bytes to copy.  If the SV has the UTF8
4306 status set, then the bytes appended should be valid UTF8.
4307 If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
4308 appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
4309 in terms of this function.
4310
4311 =cut
4312 */
4313
4314 void
4315 Perl_sv_catpvn_flags(pTHX_ register SV *dsv, register const char *sstr, register STRLEN slen, I32 flags)
4316 {
4317     STRLEN dlen;
4318     char *dstr;
4319
4320     dstr = SvPV_force_flags(dsv, dlen, flags);
4321     SvGROW(dsv, dlen + slen + 1);
4322     if (sstr == dstr)
4323         sstr = SvPVX(dsv);
4324     Move(sstr, SvPVX(dsv) + dlen, slen, char);
4325     SvCUR(dsv) += slen;
4326     *SvEND(dsv) = '\0';
4327     (void)SvPOK_only_UTF8(dsv);         /* validate pointer */
4328     SvTAINT(dsv);
4329 }
4330
4331 /*
4332 =for apidoc sv_catpvn_mg
4333
4334 Like C<sv_catpvn>, but also handles 'set' magic.
4335
4336 =cut
4337 */
4338
4339 void
4340 Perl_sv_catpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
4341 {
4342     sv_catpvn(sv,ptr,len);
4343     SvSETMAGIC(sv);
4344 }
4345
4346 /*
4347 =for apidoc sv_catsv
4348
4349 Concatenates the string from SV C<ssv> onto the end of the string in
4350 SV C<dsv>.  Modifies C<dsv> but not C<ssv>.  Handles 'get' magic, but
4351 not 'set' magic.  See C<sv_catsv_mg>.
4352
4353 =cut */
4354
4355 /* sv_catsv() is now a macro using Perl_sv_catsv_flags();
4356  * this function provided for binary compatibility only
4357  */
4358
4359 void
4360 Perl_sv_catsv(pTHX_ SV *dstr, register SV *sstr)
4361 {
4362     sv_catsv_flags(dstr, sstr, SV_GMAGIC);
4363 }
4364
4365 /*
4366 =for apidoc sv_catsv_flags
4367
4368 Concatenates the string from SV C<ssv> onto the end of the string in
4369 SV C<dsv>.  Modifies C<dsv> but not C<ssv>.  If C<flags> has C<SV_GMAGIC>
4370 bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
4371 and C<sv_catsv_nomg> are implemented in terms of this function.
4372
4373 =cut */
4374
4375 void
4376 Perl_sv_catsv_flags(pTHX_ SV *dsv, register SV *ssv, I32 flags)
4377 {
4378     char *spv;
4379     STRLEN slen;
4380     if (!ssv)
4381         return;
4382     if ((spv = SvPV(ssv, slen))) {
4383         /*  sutf8 and dutf8 were type bool, but under USE_ITHREADS,
4384             gcc version 2.95.2 20000220 (Debian GNU/Linux) for
4385             Linux xxx 2.2.17 on sparc64 with gcc -O2, we erroneously
4386             get dutf8 = 0x20000000, (i.e.  SVf_UTF8) even though
4387             dsv->sv_flags doesn't have that bit set.
4388                 Andy Dougherty  12 Oct 2001
4389         */
4390         I32 sutf8 = DO_UTF8(ssv);
4391         I32 dutf8;
4392
4393         if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
4394             mg_get(dsv);
4395         dutf8 = DO_UTF8(dsv);
4396
4397         if (dutf8 != sutf8) {
4398             if (dutf8) {
4399                 /* Not modifying source SV, so taking a temporary copy. */
4400                 SV* csv = sv_2mortal(newSVpvn(spv, slen));
4401
4402                 sv_utf8_upgrade(csv);
4403                 spv = SvPV(csv, slen);
4404             }
4405             else
4406                 sv_utf8_upgrade_nomg(dsv);
4407         }
4408         sv_catpvn_nomg(dsv, spv, slen);
4409     }
4410 }
4411
4412 /*
4413 =for apidoc sv_catsv_mg
4414
4415 Like C<sv_catsv>, but also handles 'set' magic.
4416
4417 =cut
4418 */
4419
4420 void
4421 Perl_sv_catsv_mg(pTHX_ SV *dsv, register SV *ssv)
4422 {
4423     sv_catsv(dsv,ssv);
4424     SvSETMAGIC(dsv);
4425 }
4426
4427 /*
4428 =for apidoc sv_catpv
4429
4430 Concatenates the string onto the end of the string which is in the SV.
4431 If the SV has the UTF8 status set, then the bytes appended should be
4432 valid UTF8.  Handles 'get' magic, but not 'set' magic.  See C<sv_catpv_mg>.
4433
4434 =cut */
4435
4436 void
4437 Perl_sv_catpv(pTHX_ register SV *sv, register const char *ptr)
4438 {
4439     register STRLEN len;
4440     STRLEN tlen;
4441     char *junk;
4442
4443     if (!ptr)
4444         return;
4445     junk = SvPV_force(sv, tlen);
4446     len = strlen(ptr);
4447     SvGROW(sv, tlen + len + 1);
4448     if (ptr == junk)
4449         ptr = SvPVX(sv);
4450     Move(ptr,SvPVX(sv)+tlen,len+1,char);
4451     SvCUR(sv) += len;
4452     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4453     SvTAINT(sv);
4454 }
4455
4456 /*
4457 =for apidoc sv_catpv_mg
4458
4459 Like C<sv_catpv>, but also handles 'set' magic.
4460
4461 =cut
4462 */
4463
4464 void
4465 Perl_sv_catpv_mg(pTHX_ register SV *sv, register const char *ptr)
4466 {
4467     sv_catpv(sv,ptr);
4468     SvSETMAGIC(sv);
4469 }
4470
4471 /*
4472 =for apidoc newSV
4473
4474 Create a new null SV, or if len > 0, create a new empty SVt_PV type SV
4475 with an initial PV allocation of len+1. Normally accessed via the C<NEWSV>
4476 macro.
4477
4478 =cut
4479 */
4480
4481 SV *
4482 Perl_newSV(pTHX_ STRLEN len)
4483 {
4484     register SV *sv;
4485
4486     new_SV(sv);
4487     if (len) {
4488         sv_upgrade(sv, SVt_PV);
4489         SvGROW(sv, len + 1);
4490     }
4491     return sv;
4492 }
4493 /*
4494 =for apidoc sv_magicext
4495
4496 Adds magic to an SV, upgrading it if necessary. Applies the
4497 supplied vtable and returns pointer to the magic added.
4498
4499 Note that sv_magicext will allow things that sv_magic will not.
4500 In particular you can add magic to SvREADONLY SVs and and more than
4501 one instance of the same 'how'
4502
4503 I C<namelen> is greater then zero then a savepvn() I<copy> of C<name> is stored,
4504 if C<namelen> is zero then C<name> is stored as-is and - as another special
4505 case - if C<(name && namelen == HEf_SVKEY)> then C<name> is assumed to contain
4506 an C<SV*> and has its REFCNT incremented
4507
4508 (This is now used as a subroutine by sv_magic.)
4509
4510 =cut
4511 */
4512 MAGIC * 
4513 Perl_sv_magicext(pTHX_ SV* sv, SV* obj, int how, MGVTBL *vtable,
4514                  const char* name, I32 namlen)
4515 {
4516     MAGIC* mg;
4517
4518     if (SvTYPE(sv) < SVt_PVMG) {
4519         (void)SvUPGRADE(sv, SVt_PVMG);
4520     }
4521     Newz(702,mg, 1, MAGIC);
4522     mg->mg_moremagic = SvMAGIC(sv);
4523     SvMAGIC(sv) = mg;
4524
4525     /* Some magic sontains a reference loop, where the sv and object refer to
4526        each other.  To prevent a reference loop that would prevent such
4527        objects being freed, we look for such loops and if we find one we
4528        avoid incrementing the object refcount. */
4529     if (!obj || obj == sv ||
4530         how == PERL_MAGIC_arylen ||
4531         how == PERL_MAGIC_qr ||
4532         (SvTYPE(obj) == SVt_PVGV &&
4533             (GvSV(obj) == sv || GvHV(obj) == (HV*)sv || GvAV(obj) == (AV*)sv ||
4534             GvCV(obj) == (CV*)sv || GvIOp(obj) == (IO*)sv ||
4535             GvFORM(obj) == (CV*)sv)))
4536     {
4537         mg->mg_obj = obj;
4538     }
4539     else {
4540         mg->mg_obj = SvREFCNT_inc(obj);
4541         mg->mg_flags |= MGf_REFCOUNTED;
4542     }
4543     mg->mg_type = how;
4544     mg->mg_len = namlen;
4545     if (name) {
4546         if (namlen > 0)
4547             mg->mg_ptr = savepvn(name, namlen);
4548         else if (namlen == HEf_SVKEY)
4549             mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
4550         else
4551             mg->mg_ptr = (char *) name;
4552     }
4553     mg->mg_virtual = vtable;
4554
4555     mg_magical(sv);
4556     if (SvGMAGICAL(sv))
4557         SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
4558     return mg;
4559 }
4560
4561 /*
4562 =for apidoc sv_magic
4563
4564 Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
4565 then adds a new magic item of type C<how> to the head of the magic list.
4566
4567 =cut
4568 */
4569
4570 void
4571 Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
4572 {
4573     MAGIC* mg;
4574     MGVTBL *vtable = 0;
4575
4576     if (SvREADONLY(sv)) {
4577         if (PL_curcop != &PL_compiling
4578             && how != PERL_MAGIC_regex_global
4579             && how != PERL_MAGIC_bm
4580             && how != PERL_MAGIC_fm
4581             && how != PERL_MAGIC_sv
4582            )
4583         {
4584             Perl_croak(aTHX_ PL_no_modify);
4585         }
4586     }
4587     if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
4588         if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
4589             /* sv_magic() refuses to add a magic of the same 'how' as an
4590                existing one
4591              */
4592             if (how == PERL_MAGIC_taint)
4593                 mg->mg_len |= 1;
4594             return;
4595         }
4596     }
4597
4598     switch (how) {
4599     case PERL_MAGIC_sv:
4600         vtable = &PL_vtbl_sv;
4601         break;
4602     case PERL_MAGIC_overload:
4603         vtable = &PL_vtbl_amagic;
4604         break;
4605     case PERL_MAGIC_overload_elem:
4606         vtable = &PL_vtbl_amagicelem;
4607         break;
4608     case PERL_MAGIC_overload_table:
4609         vtable = &PL_vtbl_ovrld;
4610         break;
4611     case PERL_MAGIC_bm:
4612         vtable = &PL_vtbl_bm;
4613         break;
4614     case PERL_MAGIC_regdata:
4615         vtable = &PL_vtbl_regdata;
4616         break;
4617     case PERL_MAGIC_regdatum:
4618         vtable = &PL_vtbl_regdatum;
4619         break;
4620     case PERL_MAGIC_env:
4621         vtable = &PL_vtbl_env;
4622         break;
4623     case PERL_MAGIC_fm:
4624         vtable = &PL_vtbl_fm;
4625         break;
4626     case PERL_MAGIC_envelem:
4627         vtable = &PL_vtbl_envelem;
4628         break;
4629     case PERL_MAGIC_regex_global:
4630         vtable = &PL_vtbl_mglob;
4631         break;
4632     case PERL_MAGIC_isa:
4633         vtable = &PL_vtbl_isa;
4634         break;
4635     case PERL_MAGIC_isaelem:
4636         vtable = &PL_vtbl_isaelem;
4637         break;
4638     case PERL_MAGIC_nkeys:
4639         vtable = &PL_vtbl_nkeys;
4640         break;
4641     case PERL_MAGIC_dbfile:
4642         vtable = 0;
4643         break;
4644     case PERL_MAGIC_dbline:
4645         vtable = &PL_vtbl_dbline;
4646         break;
4647 #ifdef USE_5005THREADS
4648     case PERL_MAGIC_mutex:
4649         vtable = &PL_vtbl_mutex;
4650         break;
4651 #endif /* USE_5005THREADS */
4652 #ifdef USE_LOCALE_COLLATE
4653     case PERL_MAGIC_collxfrm:
4654         vtable = &PL_vtbl_collxfrm;
4655         break;
4656 #endif /* USE_LOCALE_COLLATE */
4657     case PERL_MAGIC_tied:
4658         vtable = &PL_vtbl_pack;
4659         break;
4660     case PERL_MAGIC_tiedelem:
4661     case PERL_MAGIC_tiedscalar:
4662         vtable = &PL_vtbl_packelem;
4663         break;
4664     case PERL_MAGIC_qr:
4665         vtable = &PL_vtbl_regexp;
4666         break;
4667     case PERL_MAGIC_sig:
4668         vtable = &PL_vtbl_sig;
4669         break;
4670     case PERL_MAGIC_sigelem:
4671         vtable = &PL_vtbl_sigelem;
4672         break;
4673     case PERL_MAGIC_taint:
4674         vtable = &PL_vtbl_taint;
4675         break;
4676     case PERL_MAGIC_uvar:
4677         vtable = &PL_vtbl_uvar;
4678         break;
4679     case PERL_MAGIC_vec:
4680         vtable = &PL_vtbl_vec;
4681         break;
4682     case PERL_MAGIC_substr:
4683         vtable = &PL_vtbl_substr;
4684         break;
4685     case PERL_MAGIC_defelem:
4686         vtable = &PL_vtbl_defelem;
4687         break;
4688     case PERL_MAGIC_glob:
4689         vtable = &PL_vtbl_glob;
4690         break;
4691     case PERL_MAGIC_arylen:
4692         vtable = &PL_vtbl_arylen;
4693         break;
4694     case PERL_MAGIC_pos:
4695         vtable = &PL_vtbl_pos;
4696         break;
4697     case PERL_MAGIC_backref:
4698         vtable = &PL_vtbl_backref;
4699         break;
4700     case PERL_MAGIC_ext:
4701         /* Reserved for use by extensions not perl internals.           */
4702         /* Useful for attaching extension internal data to perl vars.   */
4703         /* Note that multiple extensions may clash if magical scalars   */
4704         /* etc holding private data from one are passed to another.     */
4705         break;
4706     default:
4707         Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
4708     }
4709
4710     /* Rest of work is done else where */
4711     mg = sv_magicext(sv,obj,how,vtable,name,namlen);
4712
4713     switch (how) {
4714     case PERL_MAGIC_taint:
4715         mg->mg_len = 1;
4716         break;
4717     case PERL_MAGIC_ext:
4718     case PERL_MAGIC_dbfile:
4719         SvRMAGICAL_on(sv);
4720         break;
4721     }
4722 }
4723
4724 /*
4725 =for apidoc sv_unmagic
4726
4727 Removes all magic of type C<type> from an SV.
4728
4729 =cut
4730 */
4731
4732 int
4733 Perl_sv_unmagic(pTHX_ SV *sv, int type)
4734 {
4735     MAGIC* mg;
4736     MAGIC** mgp;
4737     if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
4738         return 0;
4739     mgp = &SvMAGIC(sv);
4740     for (mg = *mgp; mg; mg = *mgp) {
4741         if (mg->mg_type == type) {
4742             MGVTBL* vtbl = mg->mg_virtual;
4743             *mgp = mg->mg_moremagic;
4744             if (vtbl && vtbl->svt_free)
4745                 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
4746             if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
4747                 if (mg->mg_len > 0)
4748                     Safefree(mg->mg_ptr);
4749                 else if (mg->mg_len == HEf_SVKEY)
4750                     SvREFCNT_dec((SV*)mg->mg_ptr);
4751             }
4752             if (mg->mg_flags & MGf_REFCOUNTED)
4753                 SvREFCNT_dec(mg->mg_obj);
4754             Safefree(mg);
4755         }
4756         else
4757             mgp = &mg->mg_moremagic;
4758     }
4759     if (!SvMAGIC(sv)) {
4760         SvMAGICAL_off(sv);
4761        SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_NOK|SVp_POK)) >> PRIVSHIFT;
4762     }
4763
4764     return 0;
4765 }
4766
4767 /*
4768 =for apidoc sv_rvweaken
4769
4770 Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
4771 referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
4772 push a back-reference to this RV onto the array of backreferences
4773 associated with that magic.
4774
4775 =cut
4776 */
4777
4778 SV *
4779 Perl_sv_rvweaken(pTHX_ SV *sv)
4780 {
4781     SV *tsv;
4782     if (!SvOK(sv))  /* let undefs pass */
4783         return sv;
4784     if (!SvROK(sv))
4785         Perl_croak(aTHX_ "Can't weaken a nonreference");
4786     else if (SvWEAKREF(sv)) {
4787         if (ckWARN(WARN_MISC))
4788             Perl_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
4789         return sv;
4790     }
4791     tsv = SvRV(sv);
4792     sv_add_backref(tsv, sv);
4793     SvWEAKREF_on(sv);
4794     SvREFCNT_dec(tsv);
4795     return sv;
4796 }
4797
4798 /* Give tsv backref magic if it hasn't already got it, then push a
4799  * back-reference to sv onto the array associated with the backref magic.
4800  */
4801
4802 STATIC void
4803 S_sv_add_backref(pTHX_ SV *tsv, SV *sv)
4804 {
4805     AV *av;
4806     MAGIC *mg;
4807     if (SvMAGICAL(tsv) && (mg = mg_find(tsv, PERL_MAGIC_backref)))
4808         av = (AV*)mg->mg_obj;
4809     else {
4810         av = newAV();
4811         sv_magic(tsv, (SV*)av, PERL_MAGIC_backref, NULL, 0);
4812         SvREFCNT_dec(av);           /* for sv_magic */
4813     }
4814     av_push(av,sv);
4815 }
4816
4817 /* delete a back-reference to ourselves from the backref magic associated
4818  * with the SV we point to.
4819  */
4820
4821 STATIC void
4822 S_sv_del_backref(pTHX_ SV *sv)
4823 {
4824     AV *av;
4825     SV **svp;
4826     I32 i;
4827     SV *tsv = SvRV(sv);
4828     MAGIC *mg = NULL;
4829     if (!SvMAGICAL(tsv) || !(mg = mg_find(tsv, PERL_MAGIC_backref)))
4830         Perl_croak(aTHX_ "panic: del_backref");
4831     av = (AV *)mg->mg_obj;
4832     svp = AvARRAY(av);
4833     i = AvFILLp(av);
4834     while (i >= 0) {
4835         if (svp[i] == sv) {
4836             svp[i] = &PL_sv_undef; /* XXX */
4837         }
4838         i--;
4839     }
4840 }
4841
4842 /*
4843 =for apidoc sv_insert
4844
4845 Inserts a string at the specified offset/length within the SV. Similar to
4846 the Perl substr() function.
4847
4848 =cut
4849 */
4850
4851 void
4852 Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
4853 {
4854     register char *big;
4855     register char *mid;
4856     register char *midend;
4857     register char *bigend;
4858     register I32 i;
4859     STRLEN curlen;
4860
4861
4862     if (!bigstr)
4863         Perl_croak(aTHX_ "Can't modify non-existent substring");
4864     SvPV_force(bigstr, curlen);
4865     (void)SvPOK_only_UTF8(bigstr);
4866     if (offset + len > curlen) {
4867         SvGROW(bigstr, offset+len+1);
4868         Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
4869         SvCUR_set(bigstr, offset+len);
4870     }
4871
4872     SvTAINT(bigstr);
4873     i = littlelen - len;
4874     if (i > 0) {                        /* string might grow */
4875         big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
4876         mid = big + offset + len;
4877         midend = bigend = big + SvCUR(bigstr);
4878         bigend += i;
4879         *bigend = '\0';
4880         while (midend > mid)            /* shove everything down */
4881             *--bigend = *--midend;
4882         Move(little,big+offset,littlelen,char);
4883         SvCUR(bigstr) += i;
4884         SvSETMAGIC(bigstr);
4885         return;
4886     }
4887     else if (i == 0) {
4888         Move(little,SvPVX(bigstr)+offset,len,char);
4889         SvSETMAGIC(bigstr);
4890         return;
4891     }
4892
4893     big = SvPVX(bigstr);
4894     mid = big + offset;
4895     midend = mid + len;
4896     bigend = big + SvCUR(bigstr);
4897
4898     if (midend > bigend)
4899         Perl_croak(aTHX_ "panic: sv_insert");
4900
4901     if (mid - big > bigend - midend) {  /* faster to shorten from end */
4902         if (littlelen) {
4903             Move(little, mid, littlelen,char);
4904             mid += littlelen;
4905         }
4906         i = bigend - midend;
4907         if (i > 0) {
4908             Move(midend, mid, i,char);
4909             mid += i;
4910         }
4911         *mid = '\0';
4912         SvCUR_set(bigstr, mid - big);
4913     }
4914     /*SUPPRESS 560*/
4915     else if ((i = mid - big)) { /* faster from front */
4916         midend -= littlelen;
4917         mid = midend;
4918         sv_chop(bigstr,midend-i);
4919         big += i;
4920         while (i--)
4921             *--midend = *--big;
4922         if (littlelen)
4923             Move(little, mid, littlelen,char);
4924     }
4925     else if (littlelen) {
4926         midend -= littlelen;
4927         sv_chop(bigstr,midend);
4928         Move(little,midend,littlelen,char);
4929     }
4930     else {
4931         sv_chop(bigstr,midend);
4932     }
4933     SvSETMAGIC(bigstr);
4934 }
4935
4936 /*
4937 =for apidoc sv_replace
4938
4939 Make the first argument a copy of the second, then delete the original.
4940 The target SV physically takes over ownership of the body of the source SV
4941 and inherits its flags; however, the target keeps any magic it owns,
4942 and any magic in the source is discarded.
4943 Note that this is a rather specialist SV copying operation; most of the
4944 time you'll want to use C<sv_setsv> or one of its many macro front-ends.
4945
4946 =cut
4947 */
4948
4949 void
4950 Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
4951 {
4952     U32 refcnt = SvREFCNT(sv);
4953     SV_CHECK_THINKFIRST(sv);
4954     if (SvREFCNT(nsv) != 1 && ckWARN_d(WARN_INTERNAL))
4955         Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "Reference miscount in sv_replace()");
4956     if (SvMAGICAL(sv)) {
4957         if (SvMAGICAL(nsv))
4958             mg_free(nsv);
4959         else
4960             sv_upgrade(nsv, SVt_PVMG);
4961         SvMAGIC(nsv) = SvMAGIC(sv);
4962         SvFLAGS(nsv) |= SvMAGICAL(sv);
4963         SvMAGICAL_off(sv);
4964         SvMAGIC(sv) = 0;
4965     }
4966     SvREFCNT(sv) = 0;
4967     sv_clear(sv);
4968     assert(!SvREFCNT(sv));
4969     StructCopy(nsv,sv,SV);
4970     SvREFCNT(sv) = refcnt;
4971     SvFLAGS(nsv) |= SVTYPEMASK;         /* Mark as freed */
4972     del_SV(nsv);
4973 }
4974
4975 /*
4976 =for apidoc sv_clear
4977
4978 Clear an SV: call any destructors, free up any memory used by the body,
4979 and free the body itself. The SV's head is I<not> freed, although
4980 its type is set to all 1's so that it won't inadvertently be assumed
4981 to be live during global destruction etc.
4982 This function should only be called when REFCNT is zero. Most of the time
4983 you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
4984 instead.
4985
4986 =cut
4987 */
4988
4989 void
4990 Perl_sv_clear(pTHX_ register SV *sv)
4991 {
4992     HV* stash;
4993     assert(sv);
4994     assert(SvREFCNT(sv) == 0);
4995
4996     if (SvOBJECT(sv)) {
4997         if (PL_defstash) {              /* Still have a symbol table? */
4998             dSP;
4999             CV* destructor;
5000             SV tmpref;
5001
5002             Zero(&tmpref, 1, SV);
5003             sv_upgrade(&tmpref, SVt_RV);
5004             SvROK_on(&tmpref);
5005             SvREADONLY_on(&tmpref);     /* DESTROY() could be naughty */
5006             SvREFCNT(&tmpref) = 1;
5007
5008             do {        
5009                 stash = SvSTASH(sv);
5010                 destructor = StashHANDLER(stash,DESTROY);
5011                 if (destructor) {
5012                     ENTER;
5013                     PUSHSTACKi(PERLSI_DESTROY);
5014                     SvRV(&tmpref) = SvREFCNT_inc(sv);
5015                     EXTEND(SP, 2);
5016                     PUSHMARK(SP);
5017                     PUSHs(&tmpref);
5018                     PUTBACK;
5019                     call_sv((SV*)destructor, G_DISCARD|G_EVAL|G_KEEPERR);
5020                     SvREFCNT(sv)--;
5021                     POPSTACK;
5022                     SPAGAIN;
5023                     LEAVE;
5024                 }
5025             } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
5026
5027             del_XRV(SvANY(&tmpref));
5028
5029             if (SvREFCNT(sv)) {
5030                 if (PL_in_clean_objs)
5031                     Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
5032                           HvNAME(stash));
5033                 /* DESTROY gave object new lease on life */
5034                 return;
5035             }
5036         }
5037
5038         if (SvOBJECT(sv)) {
5039             SvREFCNT_dec(SvSTASH(sv));  /* possibly of changed persuasion */
5040             SvOBJECT_off(sv);   /* Curse the object. */
5041             if (SvTYPE(sv) != SVt_PVIO)
5042                 --PL_sv_objcount;       /* XXX Might want something more general */
5043         }
5044     }
5045     if (SvTYPE(sv) >= SVt_PVMG) {
5046         if (SvMAGIC(sv))
5047             mg_free(sv);
5048         if (SvFLAGS(sv) & SVpad_TYPED)
5049             SvREFCNT_dec(SvSTASH(sv));
5050     }
5051     stash = NULL;
5052     switch (SvTYPE(sv)) {
5053     case SVt_PVIO:
5054         if (IoIFP(sv) &&
5055             IoIFP(sv) != PerlIO_stdin() &&
5056             IoIFP(sv) != PerlIO_stdout() &&
5057             IoIFP(sv) != PerlIO_stderr())
5058         {
5059             io_close((IO*)sv, FALSE);
5060         }
5061         if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
5062             PerlDir_close(IoDIRP(sv));
5063         IoDIRP(sv) = (DIR*)NULL;
5064         Safefree(IoTOP_NAME(sv));
5065         Safefree(IoFMT_NAME(sv));
5066         Safefree(IoBOTTOM_NAME(sv));
5067         /* FALL THROUGH */
5068     case SVt_PVBM:
5069         goto freescalar;
5070     case SVt_PVCV:
5071     case SVt_PVFM:
5072         cv_undef((CV*)sv);
5073         goto freescalar;
5074     case SVt_PVHV:
5075         hv_undef((HV*)sv);
5076         break;
5077     case SVt_PVAV:
5078         av_undef((AV*)sv);
5079         break;
5080     case SVt_PVLV:
5081         SvREFCNT_dec(LvTARG(sv));
5082         goto freescalar;
5083     case SVt_PVGV:
5084         gp_free((GV*)sv);
5085         Safefree(GvNAME(sv));
5086         /* cannot decrease stash refcount yet, as we might recursively delete
5087            ourselves when the refcnt drops to zero. Delay SvREFCNT_dec
5088            of stash until current sv is completely gone.
5089            -- JohnPC, 27 Mar 1998 */
5090         stash = GvSTASH(sv);
5091         /* FALL THROUGH */
5092     case SVt_PVMG:
5093     case SVt_PVNV:
5094     case SVt_PVIV:
5095       freescalar:
5096         (void)SvOOK_off(sv);
5097         /* FALL THROUGH */
5098     case SVt_PV:
5099     case SVt_RV:
5100         if (SvROK(sv)) {
5101             if (SvWEAKREF(sv))
5102                 sv_del_backref(sv);
5103             else
5104                 SvREFCNT_dec(SvRV(sv));
5105         }
5106         else if (SvPVX(sv) && SvLEN(sv))
5107             Safefree(SvPVX(sv));
5108         else if (SvPVX(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
5109             unsharepvn(SvPVX(sv),
5110                        SvUTF8(sv) ? -(I32)SvCUR(sv) : SvCUR(sv),
5111                        SvUVX(sv));
5112             SvFAKE_off(sv);
5113         }
5114         break;
5115 /*
5116     case SVt_NV:
5117     case SVt_IV:
5118     case SVt_NULL:
5119         break;
5120 */
5121     }
5122
5123     switch (SvTYPE(sv)) {
5124     case SVt_NULL:
5125         break;
5126     case SVt_IV:
5127         del_XIV(SvANY(sv));
5128         break;
5129     case SVt_NV:
5130         del_XNV(SvANY(sv));
5131         break;
5132     case SVt_RV:
5133         del_XRV(SvANY(sv));
5134         break;
5135     case SVt_PV:
5136         del_XPV(SvANY(sv));
5137         break;
5138     case SVt_PVIV:
5139         del_XPVIV(SvANY(sv));
5140         break;
5141     case SVt_PVNV:
5142         del_XPVNV(SvANY(sv));
5143         break;
5144     case SVt_PVMG:
5145         del_XPVMG(SvANY(sv));
5146         break;
5147     case SVt_PVLV:
5148         del_XPVLV(SvANY(sv));
5149         break;
5150     case SVt_PVAV:
5151         del_XPVAV(SvANY(sv));
5152         break;
5153     case SVt_PVHV:
5154         del_XPVHV(SvANY(sv));
5155         break;
5156     case SVt_PVCV:
5157         del_XPVCV(SvANY(sv));
5158         break;
5159     case SVt_PVGV:
5160         del_XPVGV(SvANY(sv));
5161         /* code duplication for increased performance. */
5162         SvFLAGS(sv) &= SVf_BREAK;
5163         SvFLAGS(sv) |= SVTYPEMASK;
5164         /* decrease refcount of the stash that owns this GV, if any */
5165         if (stash)
5166             SvREFCNT_dec(stash);
5167         return; /* not break, SvFLAGS reset already happened */
5168     case SVt_PVBM:
5169         del_XPVBM(SvANY(sv));
5170         break;
5171     case SVt_PVFM:
5172         del_XPVFM(SvANY(sv));
5173         break;
5174     case SVt_PVIO:
5175         del_XPVIO(SvANY(sv));
5176         break;
5177     }
5178     SvFLAGS(sv) &= SVf_BREAK;
5179     SvFLAGS(sv) |= SVTYPEMASK;
5180 }
5181
5182 /*
5183 =for apidoc sv_newref
5184
5185 Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
5186 instead.
5187
5188 =cut
5189 */
5190
5191 SV *
5192 Perl_sv_newref(pTHX_ SV *sv)
5193 {
5194     if (sv)
5195         ATOMIC_INC(SvREFCNT(sv));
5196     return sv;
5197 }
5198
5199 /*
5200 =for apidoc sv_free
5201
5202 Decrement an SV's reference count, and if it drops to zero, call
5203 C<sv_clear> to invoke destructors and free up any memory used by
5204 the body; finally, deallocate the SV's head itself.
5205 Normally called via a wrapper macro C<SvREFCNT_dec>.
5206
5207 =cut
5208 */
5209
5210 void
5211 Perl_sv_free(pTHX_ SV *sv)
5212 {
5213     int refcount_is_zero;
5214
5215     if (!sv)
5216         return;
5217     if (SvREFCNT(sv) == 0) {
5218         if (SvFLAGS(sv) & SVf_BREAK)
5219             /* this SV's refcnt has been artificially decremented to
5220              * trigger cleanup */
5221             return;
5222         if (PL_in_clean_all) /* All is fair */
5223             return;
5224         if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5225             /* make sure SvREFCNT(sv)==0 happens very seldom */
5226             SvREFCNT(sv) = (~(U32)0)/2;
5227             return;
5228         }
5229         if (ckWARN_d(WARN_INTERNAL))
5230             Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "Attempt to free unreferenced scalar");
5231         return;
5232     }
5233     ATOMIC_DEC_AND_TEST(refcount_is_zero, SvREFCNT(sv));
5234     if (!refcount_is_zero)
5235         return;
5236 #ifdef DEBUGGING
5237     if (SvTEMP(sv)) {
5238         if (ckWARN_d(WARN_DEBUGGING))
5239             Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
5240                         "Attempt to free temp prematurely: SV 0x%"UVxf,
5241                         PTR2UV(sv));
5242         return;
5243     }
5244 #endif
5245     if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5246         /* make sure SvREFCNT(sv)==0 happens very seldom */
5247         SvREFCNT(sv) = (~(U32)0)/2;
5248         return;
5249     }
5250     sv_clear(sv);
5251     if (! SvREFCNT(sv))
5252         del_SV(sv);
5253 }
5254
5255 /*
5256 =for apidoc sv_len
5257
5258 Returns the length of the string in the SV. Handles magic and type
5259 coercion.  See also C<SvCUR>, which gives raw access to the xpv_cur slot.
5260
5261 =cut
5262 */
5263
5264 STRLEN
5265 Perl_sv_len(pTHX_ register SV *sv)
5266 {
5267     STRLEN len;
5268
5269     if (!sv)
5270         return 0;
5271
5272     if (SvGMAGICAL(sv))
5273         len = mg_length(sv);
5274     else
5275         (void)SvPV(sv, len);
5276     return len;
5277 }
5278
5279 /*
5280 =for apidoc sv_len_utf8
5281
5282 Returns the number of characters in the string in an SV, counting wide
5283 UTF8 bytes as a single character. Handles magic and type coercion.
5284
5285 =cut
5286 */
5287
5288 STRLEN
5289 Perl_sv_len_utf8(pTHX_ register SV *sv)
5290 {
5291     if (!sv)
5292         return 0;
5293
5294     if (SvGMAGICAL(sv))
5295         return mg_length(sv);
5296     else
5297     {
5298         STRLEN len;
5299         U8 *s = (U8*)SvPV(sv, len);
5300
5301         return Perl_utf8_length(aTHX_ s, s + len);
5302     }
5303 }
5304
5305 /*
5306 =for apidoc sv_pos_u2b
5307
5308 Converts the value pointed to by offsetp from a count of UTF8 chars from
5309 the start of the string, to a count of the equivalent number of bytes; if
5310 lenp is non-zero, it does the same to lenp, but this time starting from
5311 the offset, rather than from the start of the string. Handles magic and
5312 type coercion.
5313
5314 =cut
5315 */
5316
5317 void
5318 Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
5319 {
5320     U8 *start;
5321     U8 *s;
5322     U8 *send;
5323     I32 uoffset = *offsetp;
5324     STRLEN len;
5325
5326     if (!sv)
5327         return;
5328
5329     start = s = (U8*)SvPV(sv, len);
5330     send = s + len;
5331     while (s < send && uoffset--)
5332         s += UTF8SKIP(s);
5333     if (s >= send)
5334         s = send;
5335     *offsetp = s - start;
5336     if (lenp) {
5337         I32 ulen = *lenp;
5338         start = s;
5339         while (s < send && ulen--)
5340             s += UTF8SKIP(s);
5341         if (s >= send)
5342             s = send;
5343         *lenp = s - start;
5344     }
5345     return;
5346 }
5347
5348 /*
5349 =for apidoc sv_pos_b2u
5350
5351 Converts the value pointed to by offsetp from a count of bytes from the
5352 start of the string, to a count of the equivalent number of UTF8 chars.
5353 Handles magic and type coercion.
5354
5355 =cut
5356 */
5357
5358 void
5359 Perl_sv_pos_b2u(pTHX_ register SV *sv, I32* offsetp)
5360 {
5361     U8 *s;
5362     U8 *send;
5363     STRLEN len;
5364
5365     if (!sv)
5366         return;
5367
5368     s = (U8*)SvPV(sv, len);
5369     if (len < *offsetp)
5370         Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
5371     send = s + *offsetp;
5372     len = 0;
5373     while (s < send) {
5374         STRLEN n;
5375         /* Call utf8n_to_uvchr() to validate the sequence */
5376         utf8n_to_uvchr(s, UTF8SKIP(s), &n, 0);
5377         if (n > 0) {
5378             s += n;
5379             len++;
5380         }
5381         else
5382             break;
5383     }
5384     *offsetp = len;
5385     return;
5386 }
5387
5388 /*
5389 =for apidoc sv_eq
5390
5391 Returns a boolean indicating whether the strings in the two SVs are
5392 identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
5393 coerce its args to strings if necessary.
5394
5395 =cut
5396 */
5397
5398 I32
5399 Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
5400 {
5401     char *pv1;
5402     STRLEN cur1;
5403     char *pv2;
5404     STRLEN cur2;
5405     I32  eq     = 0;
5406     char *tpv   = Nullch;
5407     SV* svrecode = Nullsv;
5408
5409     if (!sv1) {
5410         pv1 = "";
5411         cur1 = 0;
5412     }
5413     else
5414         pv1 = SvPV(sv1, cur1);
5415
5416     if (!sv2){
5417         pv2 = "";
5418         cur2 = 0;
5419     }
5420     else
5421         pv2 = SvPV(sv2, cur2);
5422
5423     if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
5424         /* Differing utf8ness.
5425          * Do not UTF8size the comparands as a side-effect. */
5426          if (PL_encoding) {
5427               if (SvUTF8(sv1)) {
5428                    svrecode = newSVpvn(pv2, cur2);
5429                    sv_recode_to_utf8(svrecode, PL_encoding);
5430                    pv2 = SvPV(svrecode, cur2);
5431               }
5432               else {
5433                    svrecode = newSVpvn(pv1, cur1);
5434                    sv_recode_to_utf8(svrecode, PL_encoding);
5435                    pv1 = SvPV(svrecode, cur1);
5436               }
5437               /* Now both are in UTF-8. */
5438               if (cur1 != cur2)
5439                    return FALSE;
5440          }
5441          else {
5442               bool is_utf8 = TRUE;
5443
5444               if (SvUTF8(sv1)) {
5445                    /* sv1 is the UTF-8 one,
5446                     * if is equal it must be downgrade-able */
5447                    char *pv = (char*)bytes_from_utf8((U8*)pv1,
5448                                                      &cur1, &is_utf8);
5449                    if (pv != pv1)
5450                         pv1 = tpv = pv;
5451               }
5452               else {
5453                    /* sv2 is the UTF-8 one,
5454                     * if is equal it must be downgrade-able */
5455                    char *pv = (char *)bytes_from_utf8((U8*)pv2,
5456                                                       &cur2, &is_utf8);
5457                    if (pv != pv2)
5458                         pv2 = tpv = pv;
5459               }
5460               if (is_utf8) {
5461                    /* Downgrade not possible - cannot be eq */
5462                    return FALSE;
5463               }
5464          }
5465     }
5466
5467     if (cur1 == cur2)
5468         eq = memEQ(pv1, pv2, cur1);
5469         
5470     if (svrecode)
5471          SvREFCNT_dec(svrecode);
5472
5473     if (tpv)
5474         Safefree(tpv);
5475
5476     return eq;
5477 }
5478
5479 /*
5480 =for apidoc sv_cmp
5481
5482 Compares the strings in two SVs.  Returns -1, 0, or 1 indicating whether the
5483 string in C<sv1> is less than, equal to, or greater than the string in
5484 C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
5485 coerce its args to strings if necessary.  See also C<sv_cmp_locale>.
5486
5487 =cut
5488 */
5489
5490 I32
5491 Perl_sv_cmp(pTHX_ register SV *sv1, register SV *sv2)
5492 {
5493     STRLEN cur1, cur2;
5494     char *pv1, *pv2, *tpv = Nullch;
5495     I32  cmp;
5496     SV *svrecode = Nullsv;
5497
5498     if (!sv1) {
5499         pv1 = "";
5500         cur1 = 0;
5501     }
5502     else
5503         pv1 = SvPV(sv1, cur1);
5504
5505     if (!sv2) {
5506         pv2 = "";
5507         cur2 = 0;
5508     }
5509     else
5510         pv2 = SvPV(sv2, cur2);
5511
5512     if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
5513         /* Differing utf8ness.
5514          * Do not UTF8size the comparands as a side-effect. */
5515         if (SvUTF8(sv1)) {
5516             if (PL_encoding) {
5517                  svrecode = newSVpvn(pv2, cur2);
5518                  sv_recode_to_utf8(svrecode, PL_encoding);
5519                  pv2 = SvPV(svrecode, cur2);
5520             }
5521             else {
5522                  pv2 = tpv = (char*)bytes_to_utf8((U8*)pv2, &cur2);
5523             }
5524         }
5525         else {
5526             if (PL_encoding) {
5527                  svrecode = newSVpvn(pv1, cur1);
5528                  sv_recode_to_utf8(svrecode, PL_encoding);
5529                  pv1 = SvPV(svrecode, cur1);
5530             }
5531             else {
5532                  pv1 = tpv = (char*)bytes_to_utf8((U8*)pv1, &cur1);
5533             }
5534         }
5535     }
5536
5537     if (!cur1) {
5538         cmp = cur2 ? -1 : 0;
5539     } else if (!cur2) {
5540         cmp = 1;
5541     } else {
5542         I32 retval = memcmp((void*)pv1, (void*)pv2, cur1 < cur2 ? cur1 : cur2);
5543
5544         if (retval) {
5545             cmp = retval < 0 ? -1 : 1;
5546         } else if (cur1 == cur2) {
5547             cmp = 0;
5548         } else {
5549             cmp = cur1 < cur2 ? -1 : 1;
5550         }
5551     }
5552
5553     if (svrecode)
5554          SvREFCNT_dec(svrecode);
5555
5556     if (tpv)
5557         Safefree(tpv);
5558
5559     return cmp;
5560 }
5561
5562 /*
5563 =for apidoc sv_cmp_locale
5564
5565 Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
5566 'use bytes' aware, handles get magic, and will coerce its args to strings
5567 if necessary.  See also C<sv_cmp_locale>.  See also C<sv_cmp>.
5568
5569 =cut
5570 */
5571
5572 I32
5573 Perl_sv_cmp_locale(pTHX_ register SV *sv1, register SV *sv2)
5574 {
5575 #ifdef USE_LOCALE_COLLATE
5576
5577     char *pv1, *pv2;
5578     STRLEN len1, len2;
5579     I32 retval;
5580
5581     if (PL_collation_standard)
5582         goto raw_compare;
5583
5584     len1 = 0;
5585     pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
5586     len2 = 0;
5587     pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
5588
5589     if (!pv1 || !len1) {
5590         if (pv2 && len2)
5591             return -1;
5592         else
5593             goto raw_compare;
5594     }
5595     else {
5596         if (!pv2 || !len2)
5597             return 1;
5598     }
5599
5600     retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
5601
5602     if (retval)
5603         return retval < 0 ? -1 : 1;
5604
5605     /*
5606      * When the result of collation is equality, that doesn't mean
5607      * that there are no differences -- some locales exclude some
5608      * characters from consideration.  So to avoid false equalities,
5609      * we use the raw string as a tiebreaker.
5610      */
5611
5612   raw_compare:
5613     /* FALL THROUGH */
5614
5615 #endif /* USE_LOCALE_COLLATE */
5616
5617     return sv_cmp(sv1, sv2);
5618 }
5619
5620
5621 #ifdef USE_LOCALE_COLLATE
5622
5623 /*
5624 =for apidoc sv_collxfrm
5625
5626 Add Collate Transform magic to an SV if it doesn't already have it.
5627
5628 Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
5629 scalar data of the variable, but transformed to such a format that a normal
5630 memory comparison can be used to compare the data according to the locale
5631 settings.
5632
5633 =cut
5634 */
5635
5636 char *
5637 Perl_sv_collxfrm(pTHX_ SV *sv, STRLEN *nxp)
5638 {
5639     MAGIC *mg;
5640
5641     mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
5642     if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
5643         char *s, *xf;
5644         STRLEN len, xlen;
5645
5646         if (mg)
5647             Safefree(mg->mg_ptr);
5648         s = SvPV(sv, len);
5649         if ((xf = mem_collxfrm(s, len, &xlen))) {
5650             if (SvREADONLY(sv)) {
5651                 SAVEFREEPV(xf);
5652                 *nxp = xlen;
5653                 return xf + sizeof(PL_collation_ix);
5654             }
5655             if (! mg) {
5656                 sv_magic(sv, 0, PERL_MAGIC_collxfrm, 0, 0);
5657                 mg = mg_find(sv, PERL_MAGIC_collxfrm);
5658                 assert(mg);
5659             }
5660             mg->mg_ptr = xf;
5661             mg->mg_len = xlen;
5662         }
5663         else {
5664             if (mg) {
5665                 mg->mg_ptr = NULL;
5666                 mg->mg_len = -1;
5667             }
5668         }
5669     }
5670     if (mg && mg->mg_ptr) {
5671         *nxp = mg->mg_len;
5672         return mg->mg_ptr + sizeof(PL_collation_ix);
5673     }
5674     else {
5675         *nxp = 0;
5676         return NULL;
5677     }
5678 }
5679
5680 #endif /* USE_LOCALE_COLLATE */
5681
5682 /*
5683 =for apidoc sv_gets
5684
5685 Get a line from the filehandle and store it into the SV, optionally
5686 appending to the currently-stored string.
5687
5688 =cut
5689 */
5690
5691 char *
5692 Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
5693 {
5694     char *rsptr;
5695     STRLEN rslen;
5696     register STDCHAR rslast;
5697     register STDCHAR *bp;
5698     register I32 cnt;
5699     I32 i = 0;
5700     I32 rspara = 0;
5701
5702     SV_CHECK_THINKFIRST(sv);
5703     (void)SvUPGRADE(sv, SVt_PV);
5704
5705     SvSCREAM_off(sv);
5706
5707     if (PL_curcop == &PL_compiling) {
5708         /* we always read code in line mode */
5709         rsptr = "\n";
5710         rslen = 1;
5711     }
5712     else if (RsSNARF(PL_rs)) {
5713         rsptr = NULL;
5714         rslen = 0;
5715     }
5716     else if (RsRECORD(PL_rs)) {
5717       I32 recsize, bytesread;
5718       char *buffer;
5719
5720       /* Grab the size of the record we're getting */
5721       recsize = SvIV(SvRV(PL_rs));
5722       (void)SvPOK_only(sv);    /* Validate pointer */
5723       buffer = SvGROW(sv, recsize + 1);
5724       /* Go yank in */
5725 #ifdef VMS
5726       /* VMS wants read instead of fread, because fread doesn't respect */
5727       /* RMS record boundaries. This is not necessarily a good thing to be */
5728       /* doing, but we've got no other real choice */
5729       bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
5730 #else
5731       bytesread = PerlIO_read(fp, buffer, recsize);
5732 #endif
5733       SvCUR_set(sv, bytesread);
5734       buffer[bytesread] = '\0';
5735       if (PerlIO_isutf8(fp))
5736         SvUTF8_on(sv);
5737       else
5738         SvUTF8_off(sv);
5739       return(SvCUR(sv) ? SvPVX(sv) : Nullch);
5740     }
5741     else if (RsPARA(PL_rs)) {
5742         rsptr = "\n\n";
5743         rslen = 2;
5744         rspara = 1;
5745     }
5746     else {
5747         /* Get $/ i.e. PL_rs into same encoding as stream wants */
5748         if (PerlIO_isutf8(fp)) {
5749             rsptr = SvPVutf8(PL_rs, rslen);
5750         }
5751         else {
5752             if (SvUTF8(PL_rs)) {
5753                 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
5754                     Perl_croak(aTHX_ "Wide character in $/");
5755                 }
5756             }
5757             rsptr = SvPV(PL_rs, rslen);
5758         }
5759     }
5760
5761     rslast = rslen ? rsptr[rslen - 1] : '\0';
5762
5763     if (rspara) {               /* have to do this both before and after */
5764         do {                    /* to make sure file boundaries work right */
5765             if (PerlIO_eof(fp))
5766                 return 0;
5767             i = PerlIO_getc(fp);
5768             if (i != '\n') {
5769                 if (i == -1)
5770                     return 0;
5771                 PerlIO_ungetc(fp,i);
5772                 break;
5773             }
5774         } while (i != EOF);
5775     }
5776
5777     /* See if we know enough about I/O mechanism to cheat it ! */
5778
5779     /* This used to be #ifdef test - it is made run-time test for ease
5780        of abstracting out stdio interface. One call should be cheap
5781        enough here - and may even be a macro allowing compile
5782        time optimization.
5783      */
5784
5785     if (PerlIO_fast_gets(fp)) {
5786
5787     /*
5788      * We're going to steal some values from the stdio struct
5789      * and put EVERYTHING in the innermost loop into registers.
5790      */
5791     register STDCHAR *ptr;
5792     STRLEN bpx;
5793     I32 shortbuffered;
5794
5795 #if defined(VMS) && defined(PERLIO_IS_STDIO)
5796     /* An ungetc()d char is handled separately from the regular
5797      * buffer, so we getc() it back out and stuff it in the buffer.
5798      */
5799     i = PerlIO_getc(fp);
5800     if (i == EOF) return 0;
5801     *(--((*fp)->_ptr)) = (unsigned char) i;
5802     (*fp)->_cnt++;
5803 #endif
5804
5805     /* Here is some breathtakingly efficient cheating */
5806
5807     cnt = PerlIO_get_cnt(fp);                   /* get count into register */
5808     (void)SvPOK_only(sv);               /* validate pointer */
5809     if (SvLEN(sv) - append <= cnt + 1) { /* make sure we have the room */
5810         if (cnt > 80 && SvLEN(sv) > append) {
5811             shortbuffered = cnt - SvLEN(sv) + append + 1;
5812             cnt -= shortbuffered;
5813         }
5814         else {
5815             shortbuffered = 0;
5816             /* remember that cnt can be negative */
5817             SvGROW(sv, append + (cnt <= 0 ? 2 : (cnt + 1)));
5818         }
5819     }
5820     else
5821         shortbuffered = 0;
5822     bp = (STDCHAR*)SvPVX(sv) + append;  /* move these two too to registers */
5823     ptr = (STDCHAR*)PerlIO_get_ptr(fp);
5824     DEBUG_P(PerlIO_printf(Perl_debug_log,
5825         "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
5826     DEBUG_P(PerlIO_printf(Perl_debug_log,
5827         "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
5828                PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
5829                PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
5830     for (;;) {
5831       screamer:
5832         if (cnt > 0) {
5833             if (rslen) {
5834                 while (cnt > 0) {                    /* this     |  eat */
5835                     cnt--;
5836                     if ((*bp++ = *ptr++) == rslast)  /* really   |  dust */
5837                         goto thats_all_folks;        /* screams  |  sed :-) */
5838                 }
5839             }
5840             else {
5841                 Copy(ptr, bp, cnt, char);            /* this     |  eat */
5842                 bp += cnt;                           /* screams  |  dust */
5843                 ptr += cnt;                          /* louder   |  sed :-) */
5844                 cnt = 0;
5845             }
5846         }
5847         
5848         if (shortbuffered) {            /* oh well, must extend */
5849             cnt = shortbuffered;
5850             shortbuffered = 0;
5851             bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
5852             SvCUR_set(sv, bpx);
5853             SvGROW(sv, SvLEN(sv) + append + cnt + 2);
5854             bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
5855             continue;
5856         }
5857
5858         DEBUG_P(PerlIO_printf(Perl_debug_log,
5859                               "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
5860                               PTR2UV(ptr),(long)cnt));
5861         PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
5862 #if 0
5863         DEBUG_P(PerlIO_printf(Perl_debug_log,
5864             "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
5865             PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
5866             PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
5867 #endif
5868         /* This used to call 'filbuf' in stdio form, but as that behaves like
5869            getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
5870            another abstraction.  */
5871         i   = PerlIO_getc(fp);          /* get more characters */
5872 #if 0
5873         DEBUG_P(PerlIO_printf(Perl_debug_log,
5874             "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
5875             PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
5876             PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
5877 #endif
5878         cnt = PerlIO_get_cnt(fp);
5879         ptr = (STDCHAR*)PerlIO_get_ptr(fp);     /* reregisterize cnt and ptr */
5880         DEBUG_P(PerlIO_printf(Perl_debug_log,
5881             "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
5882
5883         if (i == EOF)                   /* all done for ever? */
5884             goto thats_really_all_folks;
5885
5886         bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
5887         SvCUR_set(sv, bpx);
5888         SvGROW(sv, bpx + cnt + 2);
5889         bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
5890
5891         *bp++ = i;                      /* store character from PerlIO_getc */
5892
5893         if (rslen && (STDCHAR)i == rslast)  /* all done for now? */
5894             goto thats_all_folks;
5895     }
5896
5897 thats_all_folks:
5898     if ((rslen > 1 && (bp - (STDCHAR*)SvPVX(sv) < rslen)) ||
5899           memNE((char*)bp - rslen, rsptr, rslen))
5900         goto screamer;                          /* go back to the fray */
5901 thats_really_all_folks:
5902     if (shortbuffered)
5903         cnt += shortbuffered;
5904         DEBUG_P(PerlIO_printf(Perl_debug_log,
5905             "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
5906     PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt);  /* put these back or we're in trouble */
5907     DEBUG_P(PerlIO_printf(Perl_debug_log,
5908         "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
5909         PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
5910         PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
5911     *bp = '\0';
5912     SvCUR_set(sv, bp - (STDCHAR*)SvPVX(sv));    /* set length */
5913     DEBUG_P(PerlIO_printf(Perl_debug_log,
5914         "Screamer: done, len=%ld, string=|%.*s|\n",
5915         (long)SvCUR(sv),(int)SvCUR(sv),SvPVX(sv)));
5916     }
5917    else
5918     {
5919 #ifndef EPOC
5920        /*The big, slow, and stupid way */
5921         STDCHAR buf[8192];
5922 #else
5923         /* Need to work around EPOC SDK features          */
5924         /* On WINS: MS VC5 generates calls to _chkstk,    */
5925         /* if a `large' stack frame is allocated          */
5926         /* gcc on MARM does not generate calls like these */
5927         STDCHAR buf[1024];
5928 #endif
5929
5930 screamer2:
5931         if (rslen) {
5932             register STDCHAR *bpe = buf + sizeof(buf);
5933             bp = buf;
5934             while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = i) != rslast && bp < bpe)
5935                 ; /* keep reading */
5936             cnt = bp - buf;
5937         }
5938         else {
5939             cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
5940             /* Accomodate broken VAXC compiler, which applies U8 cast to
5941              * both args of ?: operator, causing EOF to change into 255
5942              */
5943             if (cnt) { i = (U8)buf[cnt - 1]; } else { i = EOF; }
5944         }
5945
5946         if (append)
5947             sv_catpvn(sv, (char *) buf, cnt);
5948         else
5949             sv_setpvn(sv, (char *) buf, cnt);
5950
5951         if (i != EOF &&                 /* joy */
5952             (!rslen ||
5953              SvCUR(sv) < rslen ||
5954              memNE(SvPVX(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
5955         {
5956             append = -1;
5957             /*
5958              * If we're reading from a TTY and we get a short read,
5959              * indicating that the user hit his EOF character, we need
5960              * to notice it now, because if we try to read from the TTY
5961              * again, the EOF condition will disappear.
5962              *
5963              * The comparison of cnt to sizeof(buf) is an optimization
5964              * that prevents unnecessary calls to feof().
5965              *
5966              * - jik 9/25/96
5967              */
5968             if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
5969                 goto screamer2;
5970         }
5971     }
5972
5973     if (rspara) {               /* have to do this both before and after */
5974         while (i != EOF) {      /* to make sure file boundaries work right */
5975             i = PerlIO_getc(fp);
5976             if (i != '\n') {
5977                 PerlIO_ungetc(fp,i);
5978                 break;
5979             }
5980         }
5981     }
5982
5983     if (PerlIO_isutf8(fp))
5984         SvUTF8_on(sv);
5985     else
5986         SvUTF8_off(sv);
5987
5988     return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
5989 }
5990
5991 /*
5992 =for apidoc sv_inc
5993
5994 Auto-increment of the value in the SV, doing string to numeric conversion
5995 if necessary. Handles 'get' magic.
5996
5997 =cut
5998 */
5999
6000 void
6001 Perl_sv_inc(pTHX_ register SV *sv)
6002 {
6003     register char *d;
6004     int flags;
6005
6006     if (!sv)
6007         return;
6008     if (SvGMAGICAL(sv))
6009         mg_get(sv);
6010     if (SvTHINKFIRST(sv)) {
6011         if (SvREADONLY(sv) && SvFAKE(sv))
6012             sv_force_normal(sv);
6013         if (SvREADONLY(sv)) {
6014             if (PL_curcop != &PL_compiling)
6015                 Perl_croak(aTHX_ PL_no_modify);
6016         }
6017         if (SvROK(sv)) {
6018             IV i;
6019             if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
6020                 return;
6021             i = PTR2IV(SvRV(sv));
6022             sv_unref(sv);
6023             sv_setiv(sv, i);
6024         }
6025     }
6026     flags = SvFLAGS(sv);
6027     if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
6028         /* It's (privately or publicly) a float, but not tested as an
6029            integer, so test it to see. */
6030         (void) SvIV(sv);
6031         flags = SvFLAGS(sv);
6032     }
6033     if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6034         /* It's publicly an integer, or privately an integer-not-float */
6035 #ifdef PERL_PRESERVE_IVUV
6036       oops_its_int:
6037 #endif
6038         if (SvIsUV(sv)) {
6039             if (SvUVX(sv) == UV_MAX)
6040                 sv_setnv(sv, UV_MAX_P1);
6041             else
6042                 (void)SvIOK_only_UV(sv);
6043                 ++SvUVX(sv);
6044         } else {
6045             if (SvIVX(sv) == IV_MAX)
6046                 sv_setuv(sv, (UV)IV_MAX + 1);
6047             else {
6048                 (void)SvIOK_only(sv);
6049                 ++SvIVX(sv);
6050             }   
6051         }
6052         return;
6053     }
6054     if (flags & SVp_NOK) {
6055         (void)SvNOK_only(sv);
6056         SvNVX(sv) += 1.0;
6057         return;
6058     }
6059
6060     if (!(flags & SVp_POK) || !*SvPVX(sv)) {
6061         if ((flags & SVTYPEMASK) < SVt_PVIV)
6062             sv_upgrade(sv, SVt_IV);
6063         (void)SvIOK_only(sv);
6064         SvIVX(sv) = 1;
6065         return;
6066     }
6067     d = SvPVX(sv);
6068     while (isALPHA(*d)) d++;
6069     while (isDIGIT(*d)) d++;
6070     if (*d) {
6071 #ifdef PERL_PRESERVE_IVUV
6072         /* Got to punt this as an integer if needs be, but we don't issue
6073            warnings. Probably ought to make the sv_iv_please() that does
6074            the conversion if possible, and silently.  */
6075         int numtype = grok_number(SvPVX(sv), SvCUR(sv), NULL);
6076         if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6077             /* Need to try really hard to see if it's an integer.
6078                9.22337203685478e+18 is an integer.
6079                but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6080                so $a="9.22337203685478e+18"; $a+0; $a++
6081                needs to be the same as $a="9.22337203685478e+18"; $a++
6082                or we go insane. */
6083         
6084             (void) sv_2iv(sv);
6085             if (SvIOK(sv))
6086                 goto oops_its_int;
6087
6088             /* sv_2iv *should* have made this an NV */
6089             if (flags & SVp_NOK) {
6090                 (void)SvNOK_only(sv);
6091                 SvNVX(sv) += 1.0;
6092                 return;
6093             }
6094             /* I don't think we can get here. Maybe I should assert this
6095                And if we do get here I suspect that sv_setnv will croak. NWC
6096                Fall through. */
6097 #if defined(USE_LONG_DOUBLE)
6098             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",
6099                                   SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6100 #else
6101             DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_inc punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"NVgf"\n",
6102                                   SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6103 #endif
6104         }
6105 #endif /* PERL_PRESERVE_IVUV */
6106         sv_setnv(sv,Atof(SvPVX(sv)) + 1.0);
6107         return;
6108     }
6109     d--;
6110     while (d >= SvPVX(sv)) {
6111         if (isDIGIT(*d)) {
6112             if (++*d <= '9')
6113                 return;
6114             *(d--) = '0';
6115         }
6116         else {
6117 #ifdef EBCDIC
6118             /* MKS: The original code here died if letters weren't consecutive.
6119              * at least it didn't have to worry about non-C locales.  The
6120              * new code assumes that ('z'-'a')==('Z'-'A'), letters are
6121              * arranged in order (although not consecutively) and that only
6122              * [A-Za-z] are accepted by isALPHA in the C locale.
6123              */
6124             if (*d != 'z' && *d != 'Z') {
6125                 do { ++*d; } while (!isALPHA(*d));
6126                 return;
6127             }
6128             *(d--) -= 'z' - 'a';
6129 #else
6130             ++*d;
6131             if (isALPHA(*d))
6132                 return;
6133             *(d--) -= 'z' - 'a' + 1;
6134 #endif
6135         }
6136     }
6137     /* oh,oh, the number grew */
6138     SvGROW(sv, SvCUR(sv) + 2);
6139     SvCUR(sv)++;
6140     for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
6141         *d = d[-1];
6142     if (isDIGIT(d[1]))
6143         *d = '1';
6144     else
6145         *d = d[1];
6146 }
6147
6148 /*
6149 =for apidoc sv_dec
6150
6151 Auto-decrement of the value in the SV, doing string to numeric conversion
6152 if necessary. Handles 'get' magic.
6153
6154 =cut
6155 */
6156
6157 void
6158 Perl_sv_dec(pTHX_ register SV *sv)
6159 {
6160     int flags;
6161
6162     if (!sv)
6163         return;
6164     if (SvGMAGICAL(sv))
6165         mg_get(sv);
6166     if (SvTHINKFIRST(sv)) {
6167         if (SvREADONLY(sv) && SvFAKE(sv))
6168             sv_force_normal(sv);
6169         if (SvREADONLY(sv)) {
6170             if (PL_curcop != &PL_compiling)
6171                 Perl_croak(aTHX_ PL_no_modify);
6172         }
6173         if (SvROK(sv)) {
6174             IV i;
6175             if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
6176                 return;
6177             i = PTR2IV(SvRV(sv));
6178             sv_unref(sv);
6179             sv_setiv(sv, i);
6180         }
6181     }
6182     /* Unlike sv_inc we don't have to worry about string-never-numbers
6183        and keeping them magic. But we mustn't warn on punting */
6184     flags = SvFLAGS(sv);
6185     if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6186         /* It's publicly an integer, or privately an integer-not-float */
6187 #ifdef PERL_PRESERVE_IVUV
6188       oops_its_int:
6189 #endif
6190         if (SvIsUV(sv)) {
6191             if (SvUVX(sv) == 0) {
6192                 (void)SvIOK_only(sv);
6193                 SvIVX(sv) = -1;
6194             }
6195             else {
6196                 (void)SvIOK_only_UV(sv);
6197                 --SvUVX(sv);
6198             }   
6199         } else {
6200             if (SvIVX(sv) == IV_MIN)
6201                 sv_setnv(sv, (NV)IV_MIN - 1.0);
6202             else {
6203                 (void)SvIOK_only(sv);
6204                 --SvIVX(sv);
6205             }   
6206         }
6207         return;
6208     }
6209     if (flags & SVp_NOK) {
6210         SvNVX(sv) -= 1.0;
6211         (void)SvNOK_only(sv);
6212         return;
6213     }
6214     if (!(flags & SVp_POK)) {
6215         if ((flags & SVTYPEMASK) < SVt_PVNV)
6216             sv_upgrade(sv, SVt_NV);
6217         SvNVX(sv) = -1.0;
6218         (void)SvNOK_only(sv);
6219         return;
6220     }
6221 #ifdef PERL_PRESERVE_IVUV
6222     {
6223         int numtype = grok_number(SvPVX(sv), SvCUR(sv), NULL);
6224         if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6225             /* Need to try really hard to see if it's an integer.
6226                9.22337203685478e+18 is an integer.
6227                but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6228                so $a="9.22337203685478e+18"; $a+0; $a--
6229                needs to be the same as $a="9.22337203685478e+18"; $a--
6230                or we go insane. */
6231         
6232             (void) sv_2iv(sv);
6233             if (SvIOK(sv))
6234                 goto oops_its_int;
6235
6236             /* sv_2iv *should* have made this an NV */
6237             if (flags & SVp_NOK) {
6238                 (void)SvNOK_only(sv);
6239                 SvNVX(sv) -= 1.0;
6240                 return;
6241             }
6242             /* I don't think we can get here. Maybe I should assert this
6243                And if we do get here I suspect that sv_setnv will croak. NWC
6244                Fall through. */
6245 #if defined(USE_LONG_DOUBLE)
6246             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",
6247                                   SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6248 #else
6249             DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_dec punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"NVgf"\n",
6250                                   SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6251 #endif
6252         }
6253     }
6254 #endif /* PERL_PRESERVE_IVUV */
6255     sv_setnv(sv,Atof(SvPVX(sv)) - 1.0); /* punt */
6256 }
6257
6258 /*
6259 =for apidoc sv_mortalcopy
6260
6261 Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
6262 The new SV is marked as mortal. It will be destroyed "soon", either by an
6263 explicit call to FREETMPS, or by an implicit call at places such as
6264 statement boundaries.  See also C<sv_newmortal> and C<sv_2mortal>.
6265
6266 =cut
6267 */
6268
6269 /* Make a string that will exist for the duration of the expression
6270  * evaluation.  Actually, it may have to last longer than that, but
6271  * hopefully we won't free it until it has been assigned to a
6272  * permanent location. */
6273
6274 SV *
6275 Perl_sv_mortalcopy(pTHX_ SV *oldstr)
6276 {
6277     register SV *sv;
6278
6279     new_SV(sv);
6280     sv_setsv(sv,oldstr);
6281     EXTEND_MORTAL(1);
6282     PL_tmps_stack[++PL_tmps_ix] = sv;
6283     SvTEMP_on(sv);
6284     return sv;
6285 }
6286
6287 /*
6288 =for apidoc sv_newmortal
6289
6290 Creates a new null SV which is mortal.  The reference count of the SV is
6291 set to 1. It will be destroyed "soon", either by an explicit call to
6292 FREETMPS, or by an implicit call at places such as statement boundaries.
6293 See also C<sv_mortalcopy> and C<sv_2mortal>.
6294
6295 =cut
6296 */
6297
6298 SV *
6299 Perl_sv_newmortal(pTHX)
6300 {
6301     register SV *sv;
6302
6303     new_SV(sv);
6304     SvFLAGS(sv) = SVs_TEMP;
6305     EXTEND_MORTAL(1);
6306     PL_tmps_stack[++PL_tmps_ix] = sv;
6307     return sv;
6308 }
6309
6310 /*
6311 =for apidoc sv_2mortal
6312
6313 Marks an existing SV as mortal.  The SV will be destroyed "soon", either
6314 by an explicit call to FREETMPS, or by an implicit call at places such as
6315 statement boundaries.  See also C<sv_newmortal> and C<sv_mortalcopy>.
6316
6317 =cut
6318 */
6319
6320 SV *
6321 Perl_sv_2mortal(pTHX_ register SV *sv)
6322 {
6323     if (!sv)
6324         return sv;
6325     if (SvREADONLY(sv) && SvIMMORTAL(sv))
6326         return sv;
6327     EXTEND_MORTAL(1);
6328     PL_tmps_stack[++PL_tmps_ix] = sv;
6329     SvTEMP_on(sv);
6330     return sv;
6331 }
6332
6333 /*
6334 =for apidoc newSVpv
6335
6336 Creates a new SV and copies a string into it.  The reference count for the
6337 SV is set to 1.  If C<len> is zero, Perl will compute the length using
6338 strlen().  For efficiency, consider using C<newSVpvn> instead.
6339
6340 =cut
6341 */
6342
6343 SV *
6344 Perl_newSVpv(pTHX_ const char *s, STRLEN len)
6345 {
6346     register SV *sv;
6347
6348     new_SV(sv);
6349     if (!len)
6350         len = strlen(s);
6351     sv_setpvn(sv,s,len);
6352     return sv;
6353 }
6354
6355 /*
6356 =for apidoc newSVpvn
6357
6358 Creates a new SV and copies a string into it.  The reference count for the
6359 SV is set to 1.  Note that if C<len> is zero, Perl will create a zero length
6360 string.  You are responsible for ensuring that the source string is at least
6361 C<len> bytes long.
6362
6363 =cut
6364 */
6365
6366 SV *
6367 Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
6368 {
6369     register SV *sv;
6370
6371     new_SV(sv);
6372     sv_setpvn(sv,s,len);
6373     return sv;
6374 }
6375
6376 /*
6377 =for apidoc newSVpvn_share
6378
6379 Creates a new SV with its SvPVX pointing to a shared string in the string
6380 table. If the string does not already exist in the table, it is created
6381 first.  Turns on READONLY and FAKE.  The string's hash is stored in the UV
6382 slot of the SV; if the C<hash> parameter is non-zero, that value is used;
6383 otherwise the hash is computed.  The idea here is that as the string table
6384 is used for shared hash keys these strings will have SvPVX == HeKEY and
6385 hash lookup will avoid string compare.
6386
6387 =cut
6388 */
6389
6390 SV *
6391 Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
6392 {
6393     register SV *sv;
6394     bool is_utf8 = FALSE;
6395     if (len < 0) {
6396         STRLEN tmplen = -len;
6397         is_utf8 = TRUE;
6398         /* See the note in hv.c:hv_fetch() --jhi */
6399         src = (char*)bytes_from_utf8((U8*)src, &tmplen, &is_utf8);
6400         len = tmplen;
6401     }
6402     if (!hash)
6403         PERL_HASH(hash, src, len);
6404     new_SV(sv);
6405     sv_upgrade(sv, SVt_PVIV);
6406     SvPVX(sv) = sharepvn(src, is_utf8?-len:len, hash);
6407     SvCUR(sv) = len;
6408     SvUVX(sv) = hash;
6409     SvLEN(sv) = 0;
6410     SvREADONLY_on(sv);
6411     SvFAKE_on(sv);
6412     SvPOK_on(sv);
6413     if (is_utf8)
6414         SvUTF8_on(sv);
6415     return sv;
6416 }
6417
6418
6419 #if defined(PERL_IMPLICIT_CONTEXT)
6420
6421 /* pTHX_ magic can't cope with varargs, so this is a no-context
6422  * version of the main function, (which may itself be aliased to us).
6423  * Don't access this version directly.
6424  */
6425
6426 SV *
6427 Perl_newSVpvf_nocontext(const char* pat, ...)
6428 {
6429     dTHX;
6430     register SV *sv;
6431     va_list args;
6432     va_start(args, pat);
6433     sv = vnewSVpvf(pat, &args);
6434     va_end(args);
6435     return sv;
6436 }
6437 #endif
6438
6439 /*
6440 =for apidoc newSVpvf
6441
6442 Creates a new SV and initializes it with the string formatted like
6443 C<sprintf>.
6444
6445 =cut
6446 */
6447
6448 SV *
6449 Perl_newSVpvf(pTHX_ const char* pat, ...)
6450 {
6451     register SV *sv;
6452     va_list args;
6453     va_start(args, pat);
6454     sv = vnewSVpvf(pat, &args);
6455     va_end(args);
6456     return sv;
6457 }
6458
6459 /* backend for newSVpvf() and newSVpvf_nocontext() */
6460
6461 SV *
6462 Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
6463 {
6464     register SV *sv;
6465     new_SV(sv);
6466     sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
6467     return sv;
6468 }
6469
6470 /*
6471 =for apidoc newSVnv
6472
6473 Creates a new SV and copies a floating point value into it.
6474 The reference count for the SV is set to 1.
6475
6476 =cut
6477 */
6478
6479 SV *
6480 Perl_newSVnv(pTHX_ NV n)
6481 {
6482     register SV *sv;
6483
6484     new_SV(sv);
6485     sv_setnv(sv,n);
6486     return sv;
6487 }
6488
6489 /*
6490 =for apidoc newSViv
6491
6492 Creates a new SV and copies an integer into it.  The reference count for the
6493 SV is set to 1.
6494
6495 =cut
6496 */
6497
6498 SV *
6499 Perl_newSViv(pTHX_ IV i)
6500 {
6501     register SV *sv;
6502
6503     new_SV(sv);
6504     sv_setiv(sv,i);
6505     return sv;
6506 }
6507
6508 /*
6509 =for apidoc newSVuv
6510
6511 Creates a new SV and copies an unsigned integer into it.
6512 The reference count for the SV is set to 1.
6513
6514 =cut
6515 */
6516
6517 SV *
6518 Perl_newSVuv(pTHX_ UV u)
6519 {
6520     register SV *sv;
6521
6522     new_SV(sv);
6523     sv_setuv(sv,u);
6524     return sv;
6525 }
6526
6527 /*
6528 =for apidoc newRV_noinc
6529
6530 Creates an RV wrapper for an SV.  The reference count for the original
6531 SV is B<not> incremented.
6532
6533 =cut
6534 */
6535
6536 SV *
6537 Perl_newRV_noinc(pTHX_ SV *tmpRef)
6538 {
6539     register SV *sv;
6540
6541     new_SV(sv);
6542     sv_upgrade(sv, SVt_RV);
6543     SvTEMP_off(tmpRef);
6544     SvRV(sv) = tmpRef;
6545     SvROK_on(sv);
6546     return sv;
6547 }
6548
6549 /* newRV_inc is the official function name to use now.
6550  * newRV_inc is in fact #defined to newRV in sv.h
6551  */
6552
6553 SV *
6554 Perl_newRV(pTHX_ SV *tmpRef)
6555 {
6556     return newRV_noinc(SvREFCNT_inc(tmpRef));
6557 }
6558
6559 /*
6560 =for apidoc newSVsv
6561
6562 Creates a new SV which is an exact duplicate of the original SV.
6563 (Uses C<sv_setsv>).
6564
6565 =cut
6566 */
6567
6568 SV *
6569 Perl_newSVsv(pTHX_ register SV *old)
6570 {
6571     register SV *sv;
6572
6573     if (!old)
6574         return Nullsv;
6575     if (SvTYPE(old) == SVTYPEMASK) {
6576         if (ckWARN_d(WARN_INTERNAL))
6577             Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
6578         return Nullsv;
6579     }
6580     new_SV(sv);
6581     if (SvTEMP(old)) {
6582         SvTEMP_off(old);
6583         sv_setsv(sv,old);
6584         SvTEMP_on(old);
6585     }
6586     else
6587         sv_setsv(sv,old);
6588     return sv;
6589 }
6590
6591 /*
6592 =for apidoc sv_reset
6593
6594 Underlying implementation for the C<reset> Perl function.
6595 Note that the perl-level function is vaguely deprecated.
6596
6597 =cut
6598 */
6599
6600 void
6601 Perl_sv_reset(pTHX_ register char *s, HV *stash)
6602 {
6603     register HE *entry;
6604     register GV *gv;
6605     register SV *sv;
6606     register I32 i;
6607     register PMOP *pm;
6608     register I32 max;
6609     char todo[PERL_UCHAR_MAX+1];
6610
6611     if (!stash)
6612         return;
6613
6614     if (!*s) {          /* reset ?? searches */
6615         for (pm = HvPMROOT(stash); pm; pm = pm->op_pmnext) {
6616             pm->op_pmdynflags &= ~PMdf_USED;
6617         }
6618         return;
6619     }
6620
6621     /* reset variables */
6622
6623     if (!HvARRAY(stash))
6624         return;
6625
6626     Zero(todo, 256, char);
6627     while (*s) {
6628         i = (unsigned char)*s;
6629         if (s[1] == '-') {
6630             s += 2;
6631         }
6632         max = (unsigned char)*s++;
6633         for ( ; i <= max; i++) {
6634             todo[i] = 1;
6635         }
6636         for (i = 0; i <= (I32) HvMAX(stash); i++) {
6637             for (entry = HvARRAY(stash)[i];
6638                  entry;
6639                  entry = HeNEXT(entry))
6640             {
6641                 if (!todo[(U8)*HeKEY(entry)])
6642                     continue;
6643                 gv = (GV*)HeVAL(entry);
6644                 sv = GvSV(gv);
6645                 if (SvTHINKFIRST(sv)) {
6646                     if (!SvREADONLY(sv) && SvROK(sv))
6647                         sv_unref(sv);
6648                     continue;
6649                 }
6650                 (void)SvOK_off(sv);
6651                 if (SvTYPE(sv) >= SVt_PV) {
6652                     SvCUR_set(sv, 0);
6653                     if (SvPVX(sv) != Nullch)
6654                         *SvPVX(sv) = '\0';
6655                     SvTAINT(sv);
6656                 }
6657                 if (GvAV(gv)) {
6658                     av_clear(GvAV(gv));
6659                 }
6660                 if (GvHV(gv) && !HvNAME(GvHV(gv))) {
6661                     hv_clear(GvHV(gv));
6662 #ifdef USE_ENVIRON_ARRAY
6663                     if (gv == PL_envgv)
6664                         environ[0] = Nullch;
6665 #endif
6666                 }
6667             }
6668         }
6669     }
6670 }
6671
6672 /*
6673 =for apidoc sv_2io
6674
6675 Using various gambits, try to get an IO from an SV: the IO slot if its a
6676 GV; or the recursive result if we're an RV; or the IO slot of the symbol
6677 named after the PV if we're a string.
6678
6679 =cut
6680 */
6681
6682 IO*
6683 Perl_sv_2io(pTHX_ SV *sv)
6684 {
6685     IO* io;
6686     GV* gv;
6687     STRLEN n_a;
6688
6689     switch (SvTYPE(sv)) {
6690     case SVt_PVIO:
6691         io = (IO*)sv;
6692         break;
6693     case SVt_PVGV:
6694         gv = (GV*)sv;
6695         io = GvIO(gv);
6696         if (!io)
6697             Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
6698         break;
6699     default:
6700         if (!SvOK(sv))
6701             Perl_croak(aTHX_ PL_no_usym, "filehandle");
6702         if (SvROK(sv))
6703             return sv_2io(SvRV(sv));
6704         gv = gv_fetchpv(SvPV(sv,n_a), FALSE, SVt_PVIO);
6705         if (gv)
6706             io = GvIO(gv);
6707         else
6708             io = 0;
6709         if (!io)
6710             Perl_croak(aTHX_ "Bad filehandle: %s", SvPV(sv,n_a));
6711         break;
6712     }
6713     return io;
6714 }
6715
6716 /*
6717 =for apidoc sv_2cv
6718
6719 Using various gambits, try to get a CV from an SV; in addition, try if
6720 possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
6721
6722 =cut
6723 */
6724
6725 CV *
6726 Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
6727 {
6728     GV *gv = Nullgv;
6729     CV *cv = Nullcv;
6730     STRLEN n_a;
6731
6732     if (!sv)
6733         return *gvp = Nullgv, Nullcv;
6734     switch (SvTYPE(sv)) {
6735     case SVt_PVCV:
6736         *st = CvSTASH(sv);
6737         *gvp = Nullgv;
6738         return (CV*)sv;
6739     case SVt_PVHV:
6740     case SVt_PVAV:
6741         *gvp = Nullgv;
6742         return Nullcv;
6743     case SVt_PVGV:
6744         gv = (GV*)sv;
6745         *gvp = gv;
6746         *st = GvESTASH(gv);
6747         goto fix_gv;
6748
6749     default:
6750         if (SvGMAGICAL(sv))
6751             mg_get(sv);
6752         if (SvROK(sv)) {
6753             SV **sp = &sv;              /* Used in tryAMAGICunDEREF macro. */
6754             tryAMAGICunDEREF(to_cv);
6755
6756             sv = SvRV(sv);
6757             if (SvTYPE(sv) == SVt_PVCV) {
6758                 cv = (CV*)sv;
6759                 *gvp = Nullgv;
6760                 *st = CvSTASH(cv);
6761                 return cv;
6762             }
6763             else if(isGV(sv))
6764                 gv = (GV*)sv;
6765             else
6766                 Perl_croak(aTHX_ "Not a subroutine reference");
6767         }
6768         else if (isGV(sv))
6769             gv = (GV*)sv;
6770         else
6771             gv = gv_fetchpv(SvPV(sv, n_a), lref, SVt_PVCV);
6772         *gvp = gv;
6773         if (!gv)
6774             return Nullcv;
6775         *st = GvESTASH(gv);
6776     fix_gv:
6777         if (lref && !GvCVu(gv)) {
6778             SV *tmpsv;
6779             ENTER;
6780             tmpsv = NEWSV(704,0);
6781             gv_efullname3(tmpsv, gv, Nullch);
6782             /* XXX this is probably not what they think they're getting.
6783              * It has the same effect as "sub name;", i.e. just a forward
6784              * declaration! */
6785             newSUB(start_subparse(FALSE, 0),
6786                    newSVOP(OP_CONST, 0, tmpsv),
6787                    Nullop,
6788                    Nullop);
6789             LEAVE;
6790             if (!GvCVu(gv))
6791                 Perl_croak(aTHX_ "Unable to create sub named \"%s\"", SvPV(sv,n_a));
6792         }
6793         return GvCVu(gv);
6794     }
6795 }
6796
6797 /*
6798 =for apidoc sv_true
6799
6800 Returns true if the SV has a true value by Perl's rules.
6801 Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
6802 instead use an in-line version.
6803
6804 =cut
6805 */
6806
6807 I32
6808 Perl_sv_true(pTHX_ register SV *sv)
6809 {
6810     if (!sv)
6811         return 0;
6812     if (SvPOK(sv)) {
6813         register XPV* tXpv;
6814         if ((tXpv = (XPV*)SvANY(sv)) &&
6815                 (tXpv->xpv_cur > 1 ||
6816                 (tXpv->xpv_cur && *tXpv->xpv_pv != '0')))
6817             return 1;
6818         else
6819             return 0;
6820     }
6821     else {
6822         if (SvIOK(sv))
6823             return SvIVX(sv) != 0;
6824         else {
6825             if (SvNOK(sv))
6826                 return SvNVX(sv) != 0.0;
6827             else
6828                 return sv_2bool(sv);
6829         }
6830     }
6831 }
6832
6833 /*
6834 =for apidoc sv_iv
6835
6836 A private implementation of the C<SvIVx> macro for compilers which can't
6837 cope with complex macro expressions. Always use the macro instead.
6838
6839 =cut
6840 */
6841
6842 IV
6843 Perl_sv_iv(pTHX_ register SV *sv)
6844 {
6845     if (SvIOK(sv)) {
6846         if (SvIsUV(sv))
6847             return (IV)SvUVX(sv);
6848         return SvIVX(sv);
6849     }
6850     return sv_2iv(sv);
6851 }
6852
6853 /*
6854 =for apidoc sv_uv
6855
6856 A private implementation of the C<SvUVx> macro for compilers which can't
6857 cope with complex macro expressions. Always use the macro instead.
6858
6859 =cut
6860 */
6861
6862 UV
6863 Perl_sv_uv(pTHX_ register SV *sv)
6864 {
6865     if (SvIOK(sv)) {
6866         if (SvIsUV(sv))
6867             return SvUVX(sv);
6868         return (UV)SvIVX(sv);
6869     }
6870     return sv_2uv(sv);
6871 }
6872
6873 /*
6874 =for apidoc sv_nv
6875
6876 A private implementation of the C<SvNVx> macro for compilers which can't
6877 cope with complex macro expressions. Always use the macro instead.
6878
6879 =cut
6880 */
6881
6882 NV
6883 Perl_sv_nv(pTHX_ register SV *sv)
6884 {
6885     if (SvNOK(sv))
6886         return SvNVX(sv);
6887     return sv_2nv(sv);
6888 }
6889
6890 /*
6891 =for apidoc sv_pv
6892
6893 Use the C<SvPV_nolen> macro instead
6894
6895 =cut
6896 */
6897
6898 /* sv_pv() is now a macro using SvPV_nolen();
6899  * this function provided for binary compatibility only
6900  */
6901
6902
6903 char *
6904 Perl_sv_pv(pTHX_ SV *sv)
6905 {
6906     STRLEN n_a;
6907
6908     if (SvPOK(sv))
6909         return SvPVX(sv);
6910
6911     return sv_2pv(sv, &n_a);
6912 }
6913
6914 /*
6915 =for apidoc sv_pvn
6916
6917 A private implementation of the C<SvPV> macro for compilers which can't
6918 cope with complex macro expressions. Always use the macro instead.
6919
6920 =cut
6921 */
6922
6923 char *
6924 Perl_sv_pvn(pTHX_ SV *sv, STRLEN *lp)
6925 {
6926     if (SvPOK(sv)) {
6927         *lp = SvCUR(sv);
6928         return SvPVX(sv);
6929     }
6930     return sv_2pv(sv, lp);
6931 }
6932
6933
6934 char *
6935 Perl_sv_pvn_nomg(pTHX_ register SV *sv, STRLEN *lp)
6936 {
6937     if (SvPOK(sv)) {
6938         *lp = SvCUR(sv);
6939         return SvPVX(sv);
6940     }
6941     return sv_2pv_flags(sv, lp, 0);
6942 }
6943
6944 /*
6945 =for apidoc sv_pvn_force
6946
6947 Get a sensible string out of the SV somehow.
6948 A private implementation of the C<SvPV_force> macro for compilers which
6949 can't cope with complex macro expressions. Always use the macro instead.
6950
6951 =cut
6952 */
6953
6954 /* sv_pvn_force() is now a macro using Perl_sv_pvn_force_flags();
6955  * this function provided for binary compatibility only
6956  */
6957
6958 char *
6959 Perl_sv_pvn_force(pTHX_ SV *sv, STRLEN *lp)
6960 {
6961     return sv_pvn_force_flags(sv, lp, SV_GMAGIC);
6962 }
6963
6964 /*
6965 =for apidoc sv_pvn_force_flags
6966
6967 Get a sensible string out of the SV somehow.
6968 If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
6969 appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
6970 implemented in terms of this function.
6971 You normally want to use the various wrapper macros instead: see
6972 C<SvPV_force> and C<SvPV_force_nomg>
6973
6974 =cut
6975 */
6976
6977 char *
6978 Perl_sv_pvn_force_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
6979 {
6980     char *s = NULL;
6981
6982     if (SvTHINKFIRST(sv) && !SvROK(sv))
6983         sv_force_normal(sv);
6984
6985     if (SvPOK(sv)) {
6986         *lp = SvCUR(sv);
6987     }
6988     else {
6989         if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
6990             Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
6991                 OP_NAME(PL_op));
6992         }
6993         else
6994             s = sv_2pv_flags(sv, lp, flags);
6995         if (s != SvPVX(sv)) {   /* Almost, but not quite, sv_setpvn() */
6996             STRLEN len = *lp;
6997         
6998             if (SvROK(sv))
6999                 sv_unref(sv);
7000             (void)SvUPGRADE(sv, SVt_PV);                /* Never FALSE */
7001             SvGROW(sv, len + 1);
7002             Move(s,SvPVX(sv),len,char);
7003             SvCUR_set(sv, len);
7004             *SvEND(sv) = '\0';
7005         }
7006         if (!SvPOK(sv)) {
7007             SvPOK_on(sv);               /* validate pointer */
7008             SvTAINT(sv);
7009             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
7010                                   PTR2UV(sv),SvPVX(sv)));
7011         }
7012     }
7013     return SvPVX(sv);
7014 }
7015
7016 /*
7017 =for apidoc sv_pvbyte
7018
7019 Use C<SvPVbyte_nolen> instead.
7020
7021 =cut
7022 */
7023
7024 /* sv_pvbyte () is now a macro using Perl_sv_2pv_flags();
7025  * this function provided for binary compatibility only
7026  */
7027
7028
7029 char *
7030 Perl_sv_pvbyte(pTHX_ SV *sv)
7031 {
7032     sv_utf8_downgrade(sv,0);
7033     return sv_pv(sv);
7034 }
7035
7036 /*
7037 =for apidoc sv_pvbyten
7038
7039 A private implementation of the C<SvPVbyte> macro for compilers
7040 which can't cope with complex macro expressions. Always use the macro
7041 instead.
7042
7043 =cut
7044 */
7045
7046 char *
7047 Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *lp)
7048 {
7049     sv_utf8_downgrade(sv,0);
7050     return sv_pvn(sv,lp);
7051 }
7052
7053 /*
7054 =for apidoc sv_pvbyten_force
7055
7056 A private implementation of the C<SvPVbytex_force> macro for compilers
7057 which can't cope with complex macro expressions. Always use the macro
7058 instead.
7059
7060 =cut
7061 */
7062
7063 char *
7064 Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
7065 {
7066     sv_utf8_downgrade(sv,0);
7067     return sv_pvn_force(sv,lp);
7068 }
7069
7070 /*
7071 =for apidoc sv_pvutf8
7072
7073 Use the C<SvPVutf8_nolen> macro instead
7074
7075 =cut
7076 */
7077 /* sv_pvutf8 () is now a macro using Perl_sv_2pv_flags();
7078  * this function provided for binary compatibility only
7079  */
7080
7081
7082 char *
7083 Perl_sv_pvutf8(pTHX_ SV *sv)
7084 {
7085     sv_utf8_upgrade(sv);
7086     return sv_pv(sv);
7087 }
7088
7089 /*
7090 =for apidoc sv_pvutf8n
7091
7092 A private implementation of the C<SvPVutf8> macro for compilers
7093 which can't cope with complex macro expressions. Always use the macro
7094 instead.
7095
7096 =cut
7097 */
7098
7099 char *
7100 Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *lp)
7101 {
7102     sv_utf8_upgrade(sv);
7103     return sv_pvn(sv,lp);
7104 }
7105
7106 /*
7107 =for apidoc sv_pvutf8n_force
7108
7109 A private implementation of the C<SvPVutf8_force> macro for compilers
7110 which can't cope with complex macro expressions. Always use the macro
7111 instead.
7112
7113 =cut
7114 */
7115
7116 char *
7117 Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
7118 {
7119     sv_utf8_upgrade(sv);
7120     return sv_pvn_force(sv,lp);
7121 }
7122
7123 /*
7124 =for apidoc sv_reftype
7125
7126 Returns a string describing what the SV is a reference to.
7127
7128 =cut
7129 */
7130
7131 char *
7132 Perl_sv_reftype(pTHX_ SV *sv, int ob)
7133 {
7134     if (ob && SvOBJECT(sv)) {
7135         HV *svs = SvSTASH(sv);
7136         /* [20011101.072] This bandaid for C<package;> should eventually
7137            be removed. AMS 20011103 */
7138         return (svs ? HvNAME(svs) : "<none>");
7139     }
7140     else {
7141         switch (SvTYPE(sv)) {
7142         case SVt_NULL:
7143         case SVt_IV:
7144         case SVt_NV:
7145         case SVt_RV:
7146         case SVt_PV:
7147         case SVt_PVIV:
7148         case SVt_PVNV:
7149         case SVt_PVMG:
7150         case SVt_PVBM:
7151                                 if (SvROK(sv))
7152                                     return "REF";
7153                                 else
7154                                     return "SCALAR";
7155         case SVt_PVLV:          return "LVALUE";
7156         case SVt_PVAV:          return "ARRAY";
7157         case SVt_PVHV:          return "HASH";
7158         case SVt_PVCV:          return "CODE";
7159         case SVt_PVGV:          return "GLOB";
7160         case SVt_PVFM:          return "FORMAT";
7161         case SVt_PVIO:          return "IO";
7162         default:                return "UNKNOWN";
7163         }
7164     }
7165 }
7166
7167 /*
7168 =for apidoc sv_isobject
7169
7170 Returns a boolean indicating whether the SV is an RV pointing to a blessed
7171 object.  If the SV is not an RV, or if the object is not blessed, then this
7172 will return false.
7173
7174 =cut
7175 */
7176
7177 int
7178 Perl_sv_isobject(pTHX_ SV *sv)
7179 {
7180     if (!sv)
7181         return 0;
7182     if (SvGMAGICAL(sv))
7183         mg_get(sv);
7184     if (!SvROK(sv))
7185         return 0;
7186     sv = (SV*)SvRV(sv);
7187     if (!SvOBJECT(sv))
7188         return 0;
7189     return 1;
7190 }
7191
7192 /*
7193 =for apidoc sv_isa
7194
7195 Returns a boolean indicating whether the SV is blessed into the specified
7196 class.  This does not check for subtypes; use C<sv_derived_from> to verify
7197 an inheritance relationship.
7198
7199 =cut
7200 */
7201
7202 int
7203 Perl_sv_isa(pTHX_ SV *sv, const char *name)
7204 {
7205     if (!sv)
7206         return 0;
7207     if (SvGMAGICAL(sv))
7208         mg_get(sv);
7209     if (!SvROK(sv))
7210         return 0;
7211     sv = (SV*)SvRV(sv);
7212     if (!SvOBJECT(sv))
7213         return 0;
7214
7215     return strEQ(HvNAME(SvSTASH(sv)), name);
7216 }
7217
7218 /*
7219 =for apidoc newSVrv
7220
7221 Creates a new SV for the RV, C<rv>, to point to.  If C<rv> is not an RV then
7222 it will be upgraded to one.  If C<classname> is non-null then the new SV will
7223 be blessed in the specified package.  The new SV is returned and its
7224 reference count is 1.
7225
7226 =cut
7227 */
7228
7229 SV*
7230 Perl_newSVrv(pTHX_ SV *rv, const char *classname)
7231 {
7232     SV *sv;
7233
7234     new_SV(sv);
7235
7236     SV_CHECK_THINKFIRST(rv);
7237     SvAMAGIC_off(rv);
7238
7239     if (SvTYPE(rv) >= SVt_PVMG) {
7240         U32 refcnt = SvREFCNT(rv);
7241         SvREFCNT(rv) = 0;
7242         sv_clear(rv);
7243         SvFLAGS(rv) = 0;
7244         SvREFCNT(rv) = refcnt;
7245     }
7246
7247     if (SvTYPE(rv) < SVt_RV)
7248         sv_upgrade(rv, SVt_RV);
7249     else if (SvTYPE(rv) > SVt_RV) {
7250         (void)SvOOK_off(rv);
7251         if (SvPVX(rv) && SvLEN(rv))
7252             Safefree(SvPVX(rv));
7253         SvCUR_set(rv, 0);
7254         SvLEN_set(rv, 0);
7255     }
7256
7257     (void)SvOK_off(rv);
7258     SvRV(rv) = sv;
7259     SvROK_on(rv);
7260
7261     if (classname) {
7262         HV* stash = gv_stashpv(classname, TRUE);
7263         (void)sv_bless(rv, stash);
7264     }
7265     return sv;
7266 }
7267
7268 /*
7269 =for apidoc sv_setref_pv
7270
7271 Copies a pointer into a new SV, optionally blessing the SV.  The C<rv>
7272 argument will be upgraded to an RV.  That RV will be modified to point to
7273 the new SV.  If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
7274 into the SV.  The C<classname> argument indicates the package for the
7275 blessing.  Set C<classname> to C<Nullch> to avoid the blessing.  The new SV
7276 will be returned and will have a reference count of 1.
7277
7278 Do not use with other Perl types such as HV, AV, SV, CV, because those
7279 objects will become corrupted by the pointer copy process.
7280
7281 Note that C<sv_setref_pvn> copies the string while this copies the pointer.
7282
7283 =cut
7284 */
7285
7286 SV*
7287 Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
7288 {
7289     if (!pv) {
7290         sv_setsv(rv, &PL_sv_undef);
7291         SvSETMAGIC(rv);
7292     }
7293     else
7294         sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
7295     return rv;
7296 }
7297
7298 /*
7299 =for apidoc sv_setref_iv
7300
7301 Copies an integer into a new SV, optionally blessing the SV.  The C<rv>
7302 argument will be upgraded to an RV.  That RV will be modified to point to
7303 the new SV.  The C<classname> argument indicates the package for the
7304 blessing.  Set C<classname> to C<Nullch> to avoid the blessing.  The new SV
7305 will be returned and will have a reference count of 1.
7306
7307 =cut
7308 */
7309
7310 SV*
7311 Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
7312 {
7313     sv_setiv(newSVrv(rv,classname), iv);
7314     return rv;
7315 }
7316
7317 /*
7318 =for apidoc sv_setref_uv
7319
7320 Copies an unsigned integer into a new SV, optionally blessing the SV.  The C<rv>
7321 argument will be upgraded to an RV.  That RV will be modified to point to
7322 the new SV.  The C<classname> argument indicates the package for the
7323 blessing.  Set C<classname> to C<Nullch> to avoid the blessing.  The new SV
7324 will be returned and will have a reference count of 1.
7325
7326 =cut
7327 */
7328
7329 SV*
7330 Perl_sv_setref_uv(pTHX_ SV *rv, const char *classname, UV uv)
7331 {
7332     sv_setuv(newSVrv(rv,classname), uv);
7333     return rv;
7334 }
7335
7336 /*
7337 =for apidoc sv_setref_nv
7338
7339 Copies a double into a new SV, optionally blessing the SV.  The C<rv>
7340 argument will be upgraded to an RV.  That RV will be modified to point to
7341 the new SV.  The C<classname> argument indicates the package for the
7342 blessing.  Set C<classname> to C<Nullch> to avoid the blessing.  The new SV
7343 will be returned and will have a reference count of 1.
7344
7345 =cut
7346 */
7347
7348 SV*
7349 Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
7350 {
7351     sv_setnv(newSVrv(rv,classname), nv);
7352     return rv;
7353 }
7354
7355 /*
7356 =for apidoc sv_setref_pvn
7357
7358 Copies a string into a new SV, optionally blessing the SV.  The length of the
7359 string must be specified with C<n>.  The C<rv> argument will be upgraded to
7360 an RV.  That RV will be modified to point to the new SV.  The C<classname>
7361 argument indicates the package for the blessing.  Set C<classname> to
7362 C<Nullch> to avoid the blessing.  The new SV will be returned and will have
7363 a reference count of 1.
7364
7365 Note that C<sv_setref_pv> copies the pointer while this copies the string.
7366
7367 =cut
7368 */
7369
7370 SV*
7371 Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, char *pv, STRLEN n)
7372 {
7373     sv_setpvn(newSVrv(rv,classname), pv, n);
7374     return rv;
7375 }
7376
7377 /*
7378 =for apidoc sv_bless
7379
7380 Blesses an SV into a specified package.  The SV must be an RV.  The package
7381 must be designated by its stash (see C<gv_stashpv()>).  The reference count
7382 of the SV is unaffected.
7383
7384 =cut
7385 */
7386
7387 SV*
7388 Perl_sv_bless(pTHX_ SV *sv, HV *stash)
7389 {
7390     SV *tmpRef;
7391     if (!SvROK(sv))
7392         Perl_croak(aTHX_ "Can't bless non-reference value");
7393     tmpRef = SvRV(sv);
7394     if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
7395         if (SvREADONLY(tmpRef))
7396             Perl_croak(aTHX_ PL_no_modify);
7397         if (SvOBJECT(tmpRef)) {
7398             if (SvTYPE(tmpRef) != SVt_PVIO)
7399                 --PL_sv_objcount;
7400             SvREFCNT_dec(SvSTASH(tmpRef));
7401         }
7402     }
7403     SvOBJECT_on(tmpRef);
7404     if (SvTYPE(tmpRef) != SVt_PVIO)
7405         ++PL_sv_objcount;
7406     (void)SvUPGRADE(tmpRef, SVt_PVMG);
7407     SvSTASH(tmpRef) = (HV*)SvREFCNT_inc(stash);
7408
7409     if (Gv_AMG(stash))
7410         SvAMAGIC_on(sv);
7411     else
7412         SvAMAGIC_off(sv);
7413
7414     if(SvSMAGICAL(tmpRef))
7415         if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
7416             mg_set(tmpRef);
7417
7418
7419
7420     return sv;
7421 }
7422
7423 /* Downgrades a PVGV to a PVMG.
7424  *
7425  * XXX This function doesn't actually appear to be used anywhere
7426  * DAPM 15-Jun-01
7427  */
7428
7429 STATIC void
7430 S_sv_unglob(pTHX_ SV *sv)
7431 {
7432     void *xpvmg;
7433
7434     assert(SvTYPE(sv) == SVt_PVGV);
7435     SvFAKE_off(sv);
7436     if (GvGP(sv))
7437         gp_free((GV*)sv);
7438     if (GvSTASH(sv)) {
7439         SvREFCNT_dec(GvSTASH(sv));
7440         GvSTASH(sv) = Nullhv;
7441     }
7442     sv_unmagic(sv, PERL_MAGIC_glob);
7443     Safefree(GvNAME(sv));
7444     GvMULTI_off(sv);
7445
7446     /* need to keep SvANY(sv) in the right arena */
7447     xpvmg = new_XPVMG();
7448     StructCopy(SvANY(sv), xpvmg, XPVMG);
7449     del_XPVGV(SvANY(sv));
7450     SvANY(sv) = xpvmg;
7451
7452     SvFLAGS(sv) &= ~SVTYPEMASK;
7453     SvFLAGS(sv) |= SVt_PVMG;
7454 }
7455
7456 /*
7457 =for apidoc sv_unref_flags
7458
7459 Unsets the RV status of the SV, and decrements the reference count of
7460 whatever was being referenced by the RV.  This can almost be thought of
7461 as a reversal of C<newSVrv>.  The C<cflags> argument can contain
7462 C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
7463 (otherwise the decrementing is conditional on the reference count being
7464 different from one or the reference being a readonly SV).
7465 See C<SvROK_off>.
7466
7467 =cut
7468 */
7469
7470 void
7471 Perl_sv_unref_flags(pTHX_ SV *sv, U32 flags)
7472 {
7473     SV* rv = SvRV(sv);
7474
7475     if (SvWEAKREF(sv)) {
7476         sv_del_backref(sv);
7477         SvWEAKREF_off(sv);
7478         SvRV(sv) = 0;
7479         return;
7480     }
7481     SvRV(sv) = 0;
7482     SvROK_off(sv);
7483     if (SvREFCNT(rv) != 1 || SvREADONLY(rv) || flags) /* SV_IMMEDIATE_UNREF */
7484         SvREFCNT_dec(rv);
7485     else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
7486         sv_2mortal(rv);         /* Schedule for freeing later */
7487 }
7488
7489 /*
7490 =for apidoc sv_unref
7491
7492 Unsets the RV status of the SV, and decrements the reference count of
7493 whatever was being referenced by the RV.  This can almost be thought of
7494 as a reversal of C<newSVrv>.  This is C<sv_unref_flags> with the C<flag>
7495 being zero.  See C<SvROK_off>.
7496
7497 =cut
7498 */
7499
7500 void
7501 Perl_sv_unref(pTHX_ SV *sv)
7502 {
7503     sv_unref_flags(sv, 0);
7504 }
7505
7506 /*
7507 =for apidoc sv_taint
7508
7509 Taint an SV. Use C<SvTAINTED_on> instead.
7510 =cut
7511 */
7512
7513 void
7514 Perl_sv_taint(pTHX_ SV *sv)
7515 {
7516     sv_magic((sv), Nullsv, PERL_MAGIC_taint, Nullch, 0);
7517 }
7518
7519 /*
7520 =for apidoc sv_untaint
7521
7522 Untaint an SV. Use C<SvTAINTED_off> instead.
7523 =cut
7524 */
7525
7526 void
7527 Perl_sv_untaint(pTHX_ SV *sv)
7528 {
7529     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
7530         MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
7531         if (mg)
7532             mg->mg_len &= ~1;
7533     }
7534 }
7535
7536 /*
7537 =for apidoc sv_tainted
7538
7539 Test an SV for taintedness. Use C<SvTAINTED> instead.
7540 =cut
7541 */
7542
7543 bool
7544 Perl_sv_tainted(pTHX_ SV *sv)
7545 {
7546     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
7547         MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
7548         if (mg && ((mg->mg_len & 1) || ((mg->mg_len & 2) && mg->mg_obj == sv)))
7549             return TRUE;
7550     }
7551     return FALSE;
7552 }
7553
7554 /*
7555 =for apidoc sv_setpviv
7556
7557 Copies an integer into the given SV, also updating its string value.
7558 Does not handle 'set' magic.  See C<sv_setpviv_mg>.
7559
7560 =cut
7561 */
7562
7563 void
7564 Perl_sv_setpviv(pTHX_ SV *sv, IV iv)
7565 {
7566     char buf[TYPE_CHARS(UV)];
7567     char *ebuf;
7568     char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
7569
7570     sv_setpvn(sv, ptr, ebuf - ptr);
7571 }
7572
7573 /*
7574 =for apidoc sv_setpviv_mg
7575
7576 Like C<sv_setpviv>, but also handles 'set' magic.
7577
7578 =cut
7579 */
7580
7581 void
7582 Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv)
7583 {
7584     char buf[TYPE_CHARS(UV)];
7585     char *ebuf;
7586     char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
7587
7588     sv_setpvn(sv, ptr, ebuf - ptr);
7589     SvSETMAGIC(sv);
7590 }
7591
7592 #if defined(PERL_IMPLICIT_CONTEXT)
7593
7594 /* pTHX_ magic can't cope with varargs, so this is a no-context
7595  * version of the main function, (which may itself be aliased to us).
7596  * Don't access this version directly.
7597  */
7598
7599 void
7600 Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
7601 {
7602     dTHX;
7603     va_list args;
7604     va_start(args, pat);
7605     sv_vsetpvf(sv, pat, &args);
7606     va_end(args);
7607 }
7608
7609 /* pTHX_ magic can't cope with varargs, so this is a no-context
7610  * version of the main function, (which may itself be aliased to us).
7611  * Don't access this version directly.
7612  */
7613
7614 void
7615 Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
7616 {
7617     dTHX;
7618     va_list args;
7619     va_start(args, pat);
7620     sv_vsetpvf_mg(sv, pat, &args);
7621     va_end(args);
7622 }
7623 #endif
7624
7625 /*
7626 =for apidoc sv_setpvf
7627
7628 Processes its arguments like C<sprintf> and sets an SV to the formatted
7629 output.  Does not handle 'set' magic.  See C<sv_setpvf_mg>.
7630
7631 =cut
7632 */
7633
7634 void
7635 Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
7636 {
7637     va_list args;
7638     va_start(args, pat);
7639     sv_vsetpvf(sv, pat, &args);
7640     va_end(args);
7641 }
7642
7643 /* backend for C<sv_setpvf> and C<sv_setpvf_nocontext> */
7644
7645 void
7646 Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
7647 {
7648     sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7649 }
7650
7651 /*
7652 =for apidoc sv_setpvf_mg
7653
7654 Like C<sv_setpvf>, but also handles 'set' magic.
7655
7656 =cut
7657 */
7658
7659 void
7660 Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
7661 {
7662     va_list args;
7663     va_start(args, pat);
7664     sv_vsetpvf_mg(sv, pat, &args);
7665     va_end(args);
7666 }
7667
7668 /* backend for C<sv_setpvf_mg> C<setpvf_mg_nocontext> */
7669
7670 void
7671 Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
7672 {
7673     sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7674     SvSETMAGIC(sv);
7675 }
7676
7677 #if defined(PERL_IMPLICIT_CONTEXT)
7678
7679 /* pTHX_ magic can't cope with varargs, so this is a no-context
7680  * version of the main function, (which may itself be aliased to us).
7681  * Don't access this version directly.
7682  */
7683
7684 void
7685 Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
7686 {
7687     dTHX;
7688     va_list args;
7689     va_start(args, pat);
7690     sv_vcatpvf(sv, pat, &args);
7691     va_end(args);
7692 }
7693
7694 /* pTHX_ magic can't cope with varargs, so this is a no-context
7695  * version of the main function, (which may itself be aliased to us).
7696  * Don't access this version directly.
7697  */
7698
7699 void
7700 Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
7701 {
7702     dTHX;
7703     va_list args;
7704     va_start(args, pat);
7705     sv_vcatpvf_mg(sv, pat, &args);
7706     va_end(args);
7707 }
7708 #endif
7709
7710 /*
7711 =for apidoc sv_catpvf
7712
7713 Processes its arguments like C<sprintf> and appends the formatted
7714 output to an SV.  If the appended data contains "wide" characters
7715 (including, but not limited to, SVs with a UTF-8 PV formatted with %s,
7716 and characters >255 formatted with %c), the original SV might get
7717 upgraded to UTF-8.  Handles 'get' magic, but not 'set' magic.
7718 C<SvSETMAGIC()> must typically be called after calling this function
7719 to handle 'set' magic.
7720
7721 =cut */
7722
7723 void
7724 Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
7725 {
7726     va_list args;
7727     va_start(args, pat);
7728     sv_vcatpvf(sv, pat, &args);
7729     va_end(args);
7730 }
7731
7732 /* backend for C<sv_catpvf> and C<catpvf_mg_nocontext> */
7733
7734 void
7735 Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
7736 {
7737     sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7738 }
7739
7740 /*
7741 =for apidoc sv_catpvf_mg
7742
7743 Like C<sv_catpvf>, but also handles 'set' magic.
7744
7745 =cut
7746 */
7747
7748 void
7749 Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
7750 {
7751     va_list args;
7752     va_start(args, pat);
7753     sv_vcatpvf_mg(sv, pat, &args);
7754     va_end(args);
7755 }
7756
7757 /* backend for C<catpvf_mg> and C<catpvf_mg_nocontext> */
7758
7759 void
7760 Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
7761 {
7762     sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7763     SvSETMAGIC(sv);
7764 }
7765
7766 /*
7767 =for apidoc sv_vsetpvfn
7768
7769 Works like C<vcatpvfn> but copies the text into the SV instead of
7770 appending it.
7771
7772 Usually used via one of its frontends C<sv_setpvf> and C<sv_setpvf_mg>.
7773
7774 =cut
7775 */
7776
7777 void
7778 Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
7779 {
7780     sv_setpvn(sv, "", 0);
7781     sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
7782 }
7783
7784 /* private function for use in sv_vcatpvfn via the EXPECT_NUMBER macro */
7785
7786 STATIC I32
7787 S_expect_number(pTHX_ char** pattern)
7788 {
7789     I32 var = 0;
7790     switch (**pattern) {
7791     case '1': case '2': case '3':
7792     case '4': case '5': case '6':
7793     case '7': case '8': case '9':
7794         while (isDIGIT(**pattern))
7795             var = var * 10 + (*(*pattern)++ - '0');
7796     }
7797     return var;
7798 }
7799 #define EXPECT_NUMBER(pattern, var) (var = S_expect_number(aTHX_ &pattern))
7800
7801 /*
7802 =for apidoc sv_vcatpvfn
7803
7804 Processes its arguments like C<vsprintf> and appends the formatted output
7805 to an SV.  Uses an array of SVs if the C style variable argument list is
7806 missing (NULL).  When running with taint checks enabled, indicates via
7807 C<maybe_tainted> if results are untrustworthy (often due to the use of
7808 locales).
7809
7810 Usually used via one of its frontends C<sv_catpvf> and C<sv_catpvf_mg>.
7811
7812 =cut
7813 */
7814
7815 void
7816 Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
7817 {
7818     char *p;
7819     char *q;
7820     char *patend;
7821     STRLEN origlen;
7822     I32 svix = 0;
7823     static char nullstr[] = "(null)";
7824     SV *argsv = Nullsv;
7825     bool has_utf8 = FALSE; /* has the result utf8? */
7826
7827     /* no matter what, this is a string now */
7828     (void)SvPV_force(sv, origlen);
7829
7830     /* special-case "", "%s", and "%_" */
7831     if (patlen == 0)
7832         return;
7833     if (patlen == 2 && pat[0] == '%') {
7834         switch (pat[1]) {
7835         case 's':
7836             if (args) {
7837                 char *s = va_arg(*args, char*);
7838                 sv_catpv(sv, s ? s : nullstr);
7839             }
7840             else if (svix < svmax) {
7841                 sv_catsv(sv, *svargs);
7842                 if (DO_UTF8(*svargs))
7843                     SvUTF8_on(sv);
7844             }
7845             return;
7846         case '_':
7847             if (args) {
7848                 argsv = va_arg(*args, SV*);
7849                 sv_catsv(sv, argsv);
7850                 if (DO_UTF8(argsv))
7851                     SvUTF8_on(sv);
7852                 return;
7853             }
7854             /* See comment on '_' below */
7855             break;
7856         }
7857     }
7858
7859     if (!args && svix < svmax && DO_UTF8(*svargs))
7860         has_utf8 = TRUE;
7861
7862     patend = (char*)pat + patlen;
7863     for (p = (char*)pat; p < patend; p = q) {
7864         bool alt = FALSE;
7865         bool left = FALSE;
7866         bool vectorize = FALSE;
7867         bool vectorarg = FALSE;
7868         bool vec_utf8 = FALSE;
7869         char fill = ' ';
7870         char plus = 0;
7871         char intsize = 0;
7872         STRLEN width = 0;
7873         STRLEN zeros = 0;
7874         bool has_precis = FALSE;
7875         STRLEN precis = 0;
7876         bool is_utf8 = FALSE;  /* is this item utf8?   */
7877         
7878         char esignbuf[4];
7879         U8 utf8buf[UTF8_MAXLEN+1];
7880         STRLEN esignlen = 0;
7881
7882         char *eptr = Nullch;
7883         STRLEN elen = 0;
7884         /* Times 4: a decimal digit takes more than 3 binary digits.
7885          * NV_DIG: mantissa takes than many decimal digits.
7886          * Plus 32: Playing safe. */
7887         char ebuf[IV_DIG * 4 + NV_DIG + 32];
7888         /* large enough for "%#.#f" --chip */
7889         /* what about long double NVs? --jhi */
7890
7891         SV *vecsv;
7892         U8 *vecstr = Null(U8*);
7893         STRLEN veclen = 0;
7894         char c = 0;
7895         int i;
7896         unsigned base = 0;
7897         IV iv = 0;
7898         UV uv = 0;
7899         NV nv;
7900         STRLEN have;
7901         STRLEN need;
7902         STRLEN gap;
7903         char *dotstr = ".";
7904         STRLEN dotstrlen = 1;
7905         I32 efix = 0; /* explicit format parameter index */
7906         I32 ewix = 0; /* explicit width index */
7907         I32 epix = 0; /* explicit precision index */
7908         I32 evix = 0; /* explicit vector index */
7909         bool asterisk = FALSE;
7910
7911         /* echo everything up to the next format specification */
7912         for (q = p; q < patend && *q != '%'; ++q) ;
7913         if (q > p) {
7914             sv_catpvn(sv, p, q - p);
7915             p = q;
7916         }
7917         if (q++ >= patend)
7918             break;
7919
7920 /*
7921     We allow format specification elements in this order:
7922         \d+\$              explicit format parameter index
7923         [-+ 0#]+           flags
7924         \*?(\d+\$)?v       vector with optional (optionally specified) arg
7925         \d+|\*(\d+\$)?     width using optional (optionally specified) arg
7926         \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
7927         [hlqLV]            size
7928     [%bcdefginopsux_DFOUX] format (mandatory)
7929 */
7930         if (EXPECT_NUMBER(q, width)) {
7931             if (*q == '$') {
7932                 ++q;
7933                 efix = width;
7934             } else {
7935                 goto gotwidth;
7936             }
7937         }
7938
7939         /* FLAGS */
7940
7941         while (*q) {
7942             switch (*q) {
7943             case ' ':
7944             case '+':
7945                 plus = *q++;
7946                 continue;
7947
7948             case '-':
7949                 left = TRUE;
7950                 q++;
7951                 continue;
7952
7953             case '0':
7954                 fill = *q++;
7955                 continue;
7956
7957             case '#':
7958                 alt = TRUE;
7959                 q++;
7960                 continue;
7961
7962             default:
7963                 break;
7964             }
7965             break;
7966         }
7967
7968       tryasterisk:
7969         if (*q == '*') {
7970             q++;
7971             if (EXPECT_NUMBER(q, ewix))
7972                 if (*q++ != '$')
7973                     goto unknown;
7974             asterisk = TRUE;
7975         }
7976         if (*q == 'v') {
7977             q++;
7978             if (vectorize)
7979                 goto unknown;
7980             if ((vectorarg = asterisk)) {
7981                 evix = ewix;
7982                 ewix = 0;
7983                 asterisk = FALSE;
7984             }
7985             vectorize = TRUE;
7986             goto tryasterisk;
7987         }
7988
7989         if (!asterisk)
7990             EXPECT_NUMBER(q, width);
7991
7992         if (vectorize) {
7993             if (vectorarg) {
7994                 if (args)
7995                     vecsv = va_arg(*args, SV*);
7996                 else
7997                     vecsv = (evix ? evix <= svmax : svix < svmax) ?
7998                         svargs[ewix ? ewix-1 : svix++] : &PL_sv_undef;
7999                 dotstr = SvPVx(vecsv, dotstrlen);
8000                 if (DO_UTF8(vecsv))
8001                     is_utf8 = TRUE;
8002             }
8003             if (args) {
8004                 vecsv = va_arg(*args, SV*);
8005                 vecstr = (U8*)SvPVx(vecsv,veclen);
8006                 vec_utf8 = DO_UTF8(vecsv);
8007             }
8008             else if (efix ? efix <= svmax : svix < svmax) {
8009                 vecsv = svargs[efix ? efix-1 : svix++];
8010                 vecstr = (U8*)SvPVx(vecsv,veclen);
8011                 vec_utf8 = DO_UTF8(vecsv);
8012             }
8013             else {
8014                 vecstr = (U8*)"";
8015                 veclen = 0;
8016             }
8017         }
8018
8019         if (asterisk) {
8020             if (args)
8021                 i = va_arg(*args, int);
8022             else
8023                 i = (ewix ? ewix <= svmax : svix < svmax) ?
8024                     SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
8025             left |= (i < 0);
8026             width = (i < 0) ? -i : i;
8027         }
8028       gotwidth:
8029
8030         /* PRECISION */
8031
8032         if (*q == '.') {
8033             q++;
8034             if (*q == '*') {
8035                 q++;
8036                 if (EXPECT_NUMBER(q, epix) && *q++ != '$') /* epix currently unused */
8037                     goto unknown;
8038                 if (args)
8039                     i = va_arg(*args, int);
8040                 else
8041                     i = (ewix ? ewix <= svmax : svix < svmax)
8042                         ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
8043                 precis = (i < 0) ? 0 : i;
8044             }
8045             else {
8046                 precis = 0;
8047                 while (isDIGIT(*q))
8048                     precis = precis * 10 + (*q++ - '0');
8049             }
8050             has_precis = TRUE;
8051         }
8052
8053         /* SIZE */
8054
8055         switch (*q) {
8056 #if defined(HAS_QUAD) || (defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE))
8057         case 'L':                       /* Ld */
8058             /* FALL THROUGH */
8059 #endif
8060 #ifdef HAS_QUAD
8061         case 'q':                       /* qd */
8062             intsize = 'q';
8063             q++;
8064             break;
8065 #endif
8066         case 'l':
8067 #if defined(HAS_QUAD) || (defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE))
8068              if (*(q + 1) == 'l') {     /* lld, llf */
8069                 intsize = 'q';
8070                 q += 2;
8071                 break;
8072              }
8073 #endif
8074             /* FALL THROUGH */
8075         case 'h':
8076             /* FALL THROUGH */
8077         case 'V':
8078             intsize = *q++;
8079             break;
8080         }
8081
8082         /* CONVERSION */
8083
8084         if (*q == '%') {
8085             eptr = q++;
8086             elen = 1;
8087             goto string;
8088         }
8089
8090         if (!args)
8091             argsv = (efix ? efix <= svmax : svix < svmax) ?
8092                     svargs[efix ? efix-1 : svix++] : &PL_sv_undef;
8093
8094         switch (c = *q++) {
8095
8096             /* STRINGS */
8097
8098         case 'c':
8099             uv = args ? va_arg(*args, int) : SvIVx(argsv);
8100             if ((uv > 255 ||
8101                  (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
8102                 && !IN_BYTES) {
8103                 eptr = (char*)utf8buf;
8104                 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
8105                 is_utf8 = TRUE;
8106             }
8107             else {
8108                 c = (char)uv;
8109                 eptr = &c;
8110                 elen = 1;
8111             }
8112             goto string;
8113
8114         case 's':
8115             if (args) {
8116                 eptr = va_arg(*args, char*);
8117                 if (eptr)
8118 #ifdef MACOS_TRADITIONAL
8119                   /* On MacOS, %#s format is used for Pascal strings */
8120                   if (alt)
8121                     elen = *eptr++;
8122                   else
8123 #endif
8124                     elen = strlen(eptr);
8125                 else {
8126                     eptr = nullstr;
8127                     elen = sizeof nullstr - 1;
8128                 }
8129             }
8130             else {
8131                 eptr = SvPVx(argsv, elen);
8132                 if (DO_UTF8(argsv)) {
8133                     if (has_precis && precis < elen) {
8134                         I32 p = precis;
8135                         sv_pos_u2b(argsv, &p, 0); /* sticks at end */
8136                         precis = p;
8137                     }
8138                     if (width) { /* fudge width (can't fudge elen) */
8139                         width += elen - sv_len_utf8(argsv);
8140                     }
8141                     is_utf8 = TRUE;
8142                 }
8143             }
8144             goto string;
8145
8146         case '_':
8147             /*
8148              * The "%_" hack might have to be changed someday,
8149              * if ISO or ANSI decide to use '_' for something.
8150              * So we keep it hidden from users' code.
8151              */
8152             if (!args)
8153                 goto unknown;
8154             argsv = va_arg(*args, SV*);
8155             eptr = SvPVx(argsv, elen);
8156             if (DO_UTF8(argsv))
8157                 is_utf8 = TRUE;
8158
8159         string:
8160             vectorize = FALSE;
8161             if (has_precis && elen > precis)
8162                 elen = precis;
8163             break;
8164
8165             /* INTEGERS */
8166
8167         case 'p':
8168             if (alt)
8169                 goto unknown;
8170             uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
8171             base = 16;
8172             goto integer;
8173
8174         case 'D':
8175 #ifdef IV_IS_QUAD
8176             intsize = 'q';
8177 #else
8178             intsize = 'l';
8179 #endif
8180             /* FALL THROUGH */
8181         case 'd':
8182         case 'i':
8183             if (vectorize) {
8184                 STRLEN ulen;
8185                 if (!veclen)
8186                     continue;
8187                 if (vec_utf8)
8188                     uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
8189                                         UTF8_ALLOW_ANYUV);
8190                 else {
8191                     uv = *vecstr;
8192                     ulen = 1;
8193                 }
8194                 vecstr += ulen;
8195                 veclen -= ulen;
8196                 if (plus)
8197                      esignbuf[esignlen++] = plus;
8198             }
8199             else if (args) {
8200                 switch (intsize) {
8201                 case 'h':       iv = (short)va_arg(*args, int); break;
8202                 default:        iv = va_arg(*args, int); break;
8203                 case 'l':       iv = va_arg(*args, long); break;
8204                 case 'V':       iv = va_arg(*args, IV); break;
8205 #ifdef HAS_QUAD
8206                 case 'q':       iv = va_arg(*args, Quad_t); break;
8207 #endif
8208                 }
8209             }
8210             else {
8211                 iv = SvIVx(argsv);
8212                 switch (intsize) {
8213                 case 'h':       iv = (short)iv; break;
8214                 default:        break;
8215                 case 'l':       iv = (long)iv; break;
8216                 case 'V':       break;
8217 #ifdef HAS_QUAD
8218                 case 'q':       iv = (Quad_t)iv; break;
8219 #endif
8220                 }
8221             }
8222             if ( !vectorize )   /* we already set uv above */
8223             {
8224                 if (iv >= 0) {
8225                     uv = iv;
8226                     if (plus)
8227                         esignbuf[esignlen++] = plus;
8228                 }
8229                 else {
8230                     uv = -iv;
8231                     esignbuf[esignlen++] = '-';
8232                 }
8233             }
8234             base = 10;
8235             goto integer;
8236
8237         case 'U':
8238 #ifdef IV_IS_QUAD
8239             intsize = 'q';
8240 #else
8241             intsize = 'l';
8242 #endif
8243             /* FALL THROUGH */
8244         case 'u':
8245             base = 10;
8246             goto uns_integer;
8247
8248         case 'b':
8249             base = 2;
8250             goto uns_integer;
8251
8252         case 'O':
8253 #ifdef IV_IS_QUAD
8254             intsize = 'q';
8255 #else
8256             intsize = 'l';
8257 #endif
8258             /* FALL THROUGH */
8259         case 'o':
8260             base = 8;
8261             goto uns_integer;
8262
8263         case 'X':
8264         case 'x':
8265             base = 16;
8266
8267         uns_integer:
8268             if (vectorize) {
8269                 STRLEN ulen;
8270         vector:
8271                 if (!veclen)
8272                     continue;
8273                 if (vec_utf8)
8274                     uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
8275                                         UTF8_ALLOW_ANYUV);
8276                 else {
8277                     uv = *vecstr;
8278                     ulen = 1;
8279                 }
8280                 vecstr += ulen;
8281                 veclen -= ulen;
8282             }
8283             else if (args) {
8284                 switch (intsize) {
8285                 case 'h':  uv = (unsigned short)va_arg(*args, unsigned); break;
8286                 default:   uv = va_arg(*args, unsigned); break;
8287                 case 'l':  uv = va_arg(*args, unsigned long); break;
8288                 case 'V':  uv = va_arg(*args, UV); break;
8289 #ifdef HAS_QUAD
8290                 case 'q':  uv = va_arg(*args, Quad_t); break;
8291 #endif
8292                 }
8293             }
8294             else {
8295                 uv = SvUVx(argsv);
8296                 switch (intsize) {
8297                 case 'h':       uv = (unsigned short)uv; break;
8298                 default:        break;
8299                 case 'l':       uv = (unsigned long)uv; break;
8300                 case 'V':       break;
8301 #ifdef HAS_QUAD
8302                 case 'q':       uv = (Quad_t)uv; break;
8303 #endif
8304                 }
8305             }
8306
8307         integer:
8308             eptr = ebuf + sizeof ebuf;
8309             switch (base) {
8310                 unsigned dig;
8311             case 16:
8312                 if (!uv)
8313                     alt = FALSE;
8314                 p = (char*)((c == 'X')
8315                             ? "0123456789ABCDEF" : "0123456789abcdef");
8316                 do {
8317                     dig = uv & 15;
8318                     *--eptr = p[dig];
8319                 } while (uv >>= 4);
8320                 if (alt) {
8321                     esignbuf[esignlen++] = '0';
8322                     esignbuf[esignlen++] = c;  /* 'x' or 'X' */
8323                 }
8324                 break;
8325             case 8:
8326                 do {
8327                     dig = uv & 7;
8328                     *--eptr = '0' + dig;
8329                 } while (uv >>= 3);
8330                 if (alt && *eptr != '0')
8331                     *--eptr = '0';
8332                 break;
8333             case 2:
8334                 do {
8335                     dig = uv & 1;
8336                     *--eptr = '0' + dig;
8337                 } while (uv >>= 1);
8338                 if (alt) {
8339                     esignbuf[esignlen++] = '0';
8340                     esignbuf[esignlen++] = 'b';
8341                 }
8342                 break;
8343             default:            /* it had better be ten or less */
8344 #if defined(PERL_Y2KWARN)
8345                 if (ckWARN(WARN_Y2K)) {
8346                     STRLEN n;
8347                     char *s = SvPV(sv,n);
8348                     if (n >= 2 && s[n-2] == '1' && s[n-1] == '9'
8349                         && (n == 2 || !isDIGIT(s[n-3])))
8350                     {
8351                         Perl_warner(aTHX_ packWARN(WARN_Y2K),
8352                                     "Possible Y2K bug: %%%c %s",
8353                                     c, "format string following '19'");
8354                     }
8355                 }
8356 #endif
8357                 do {
8358                     dig = uv % base;
8359                     *--eptr = '0' + dig;
8360                 } while (uv /= base);
8361                 break;
8362             }
8363             elen = (ebuf + sizeof ebuf) - eptr;
8364             if (has_precis) {
8365                 if (precis > elen)
8366                     zeros = precis - elen;
8367                 else if (precis == 0 && elen == 1 && *eptr == '0')
8368                     elen = 0;
8369             }
8370             break;
8371
8372             /* FLOATING POINT */
8373
8374         case 'F':
8375             c = 'f';            /* maybe %F isn't supported here */
8376             /* FALL THROUGH */
8377         case 'e': case 'E':
8378         case 'f':
8379         case 'g': case 'G':
8380
8381             /* This is evil, but floating point is even more evil */
8382
8383             vectorize = FALSE;
8384             nv = args ? va_arg(*args, NV) : SvNVx(argsv);
8385
8386             need = 0;
8387             if (c != 'e' && c != 'E') {
8388                 i = PERL_INT_MIN;
8389                 (void)Perl_frexp(nv, &i);
8390                 if (i == PERL_INT_MIN)
8391                     Perl_die(aTHX_ "panic: frexp");
8392                 if (i > 0)
8393                     need = BIT_DIGITS(i);
8394             }
8395             need += has_precis ? precis : 6; /* known default */
8396             if (need < width)
8397                 need = width;
8398
8399             need += 20; /* fudge factor */
8400             if (PL_efloatsize < need) {
8401                 Safefree(PL_efloatbuf);
8402                 PL_efloatsize = need + 20; /* more fudge */
8403                 New(906, PL_efloatbuf, PL_efloatsize, char);
8404                 PL_efloatbuf[0] = '\0';
8405             }
8406
8407             eptr = ebuf + sizeof ebuf;
8408             *--eptr = '\0';
8409             *--eptr = c;
8410 #if defined(USE_LONG_DOUBLE) && defined(PERL_PRIfldbl)
8411             {
8412                 /* Copy the one or more characters in a long double
8413                  * format before the 'base' ([efgEFG]) character to
8414                  * the format string. */
8415                 static char const prifldbl[] = PERL_PRIfldbl;
8416                 char const *p = prifldbl + sizeof(prifldbl) - 3;
8417                 while (p >= prifldbl) { *--eptr = *p--; }
8418             }
8419 #endif
8420             if (has_precis) {
8421                 base = precis;
8422                 do { *--eptr = '0' + (base % 10); } while (base /= 10);
8423                 *--eptr = '.';
8424             }
8425             if (width) {
8426                 base = width;
8427                 do { *--eptr = '0' + (base % 10); } while (base /= 10);
8428             }
8429             if (fill == '0')
8430                 *--eptr = fill;
8431             if (left)
8432                 *--eptr = '-';
8433             if (plus)
8434                 *--eptr = plus;
8435             if (alt)
8436                 *--eptr = '#';
8437             *--eptr = '%';
8438
8439             /* No taint.  Otherwise we are in the strange situation
8440              * where printf() taints but print($float) doesn't.
8441              * --jhi */
8442             (void)sprintf(PL_efloatbuf, eptr, nv);
8443
8444             eptr = PL_efloatbuf;
8445             elen = strlen(PL_efloatbuf);
8446             break;
8447
8448             /* SPECIAL */
8449
8450         case 'n':
8451             vectorize = FALSE;
8452             i = SvCUR(sv) - origlen;
8453             if (args) {
8454                 switch (intsize) {
8455                 case 'h':       *(va_arg(*args, short*)) = i; break;
8456                 default:        *(va_arg(*args, int*)) = i; break;
8457                 case 'l':       *(va_arg(*args, long*)) = i; break;
8458                 case 'V':       *(va_arg(*args, IV*)) = i; break;
8459 #ifdef HAS_QUAD
8460                 case 'q':       *(va_arg(*args, Quad_t*)) = i; break;
8461 #endif
8462                 }
8463             }
8464             else
8465                 sv_setuv_mg(argsv, (UV)i);
8466             continue;   /* not "break" */
8467
8468             /* UNKNOWN */
8469
8470         default:
8471       unknown:
8472             vectorize = FALSE;
8473             if (!args && ckWARN(WARN_PRINTF) &&
8474                   (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
8475                 SV *msg = sv_newmortal();
8476                 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %s: ",
8477                           (PL_op->op_type == OP_PRTF) ? "printf" : "sprintf");
8478                 if (c) {
8479                     if (isPRINT(c))
8480                         Perl_sv_catpvf(aTHX_ msg,
8481                                        "\"%%%c\"", c & 0xFF);
8482                     else
8483                         Perl_sv_catpvf(aTHX_ msg,
8484                                        "\"%%\\%03"UVof"\"",
8485                                        (UV)c & 0xFF);
8486                 } else
8487                     sv_catpv(msg, "end of string");
8488                 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, msg); /* yes, this is reentrant */
8489             }
8490
8491             /* output mangled stuff ... */
8492             if (c == '\0')
8493                 --q;
8494             eptr = p;
8495             elen = q - p;
8496
8497             /* ... right here, because formatting flags should not apply */
8498             SvGROW(sv, SvCUR(sv) + elen + 1);
8499             p = SvEND(sv);
8500             Copy(eptr, p, elen, char);
8501             p += elen;
8502             *p = '\0';
8503             SvCUR(sv) = p - SvPVX(sv);
8504             continue;   /* not "break" */
8505         }
8506
8507         if (is_utf8 != has_utf8) {
8508              if (is_utf8) {
8509                   if (SvCUR(sv))
8510                        sv_utf8_upgrade(sv);
8511              }
8512              else {
8513                   SV *nsv = sv_2mortal(newSVpvn(eptr, elen));
8514                   sv_utf8_upgrade(nsv);
8515                   eptr = SvPVX(nsv);
8516                   elen = SvCUR(nsv);
8517              }
8518              SvGROW(sv, SvCUR(sv) + elen + 1);
8519              p = SvEND(sv);
8520              *p = '\0';
8521         }
8522         
8523         have = esignlen + zeros + elen;
8524         need = (have > width ? have : width);
8525         gap = need - have;
8526
8527         SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
8528         p = SvEND(sv);
8529         if (esignlen && fill == '0') {
8530             for (i = 0; i < esignlen; i++)
8531                 *p++ = esignbuf[i];
8532         }
8533         if (gap && !left) {
8534             memset(p, fill, gap);
8535             p += gap;
8536         }
8537         if (esignlen && fill != '0') {
8538             for (i = 0; i < esignlen; i++)
8539                 *p++ = esignbuf[i];
8540         }
8541         if (zeros) {
8542             for (i = zeros; i; i--)
8543                 *p++ = '0';
8544         }
8545         if (elen) {
8546             Copy(eptr, p, elen, char);
8547             p += elen;
8548         }
8549         if (gap && left) {
8550             memset(p, ' ', gap);
8551             p += gap;
8552         }
8553         if (vectorize) {
8554             if (veclen) {
8555                 Copy(dotstr, p, dotstrlen, char);
8556                 p += dotstrlen;
8557             }
8558             else
8559                 vectorize = FALSE;              /* done iterating over vecstr */
8560         }
8561         if (is_utf8)
8562             has_utf8 = TRUE;
8563         if (has_utf8)
8564             SvUTF8_on(sv);
8565         *p = '\0';
8566         SvCUR(sv) = p - SvPVX(sv);
8567         if (vectorize) {
8568             esignlen = 0;
8569             goto vector;
8570         }
8571     }
8572 }
8573
8574 /* =========================================================================
8575
8576 =head1 Cloning an interpreter
8577
8578 All the macros and functions in this section are for the private use of
8579 the main function, perl_clone().
8580
8581 The foo_dup() functions make an exact copy of an existing foo thinngy.
8582 During the course of a cloning, a hash table is used to map old addresses
8583 to new addresses. The table is created and manipulated with the
8584 ptr_table_* functions.
8585
8586 =cut
8587
8588 ============================================================================*/
8589
8590
8591 #if defined(USE_ITHREADS)
8592
8593 #if defined(USE_5005THREADS)
8594 #  include "error: USE_5005THREADS and USE_ITHREADS are incompatible"
8595 #endif
8596
8597 #ifndef GpREFCNT_inc
8598 #  define GpREFCNT_inc(gp)      ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
8599 #endif
8600
8601
8602 #define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
8603 #define av_dup(s,t)     (AV*)sv_dup((SV*)s,t)
8604 #define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8605 #define hv_dup(s,t)     (HV*)sv_dup((SV*)s,t)
8606 #define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8607 #define cv_dup(s,t)     (CV*)sv_dup((SV*)s,t)
8608 #define cv_dup_inc(s,t) (CV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8609 #define io_dup(s,t)     (IO*)sv_dup((SV*)s,t)
8610 #define io_dup_inc(s,t) (IO*)SvREFCNT_inc(sv_dup((SV*)s,t))
8611 #define gv_dup(s,t)     (GV*)sv_dup((SV*)s,t)
8612 #define gv_dup_inc(s,t) (GV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8613 #define SAVEPV(p)       (p ? savepv(p) : Nullch)
8614 #define SAVEPVN(p,n)    (p ? savepvn(p,n) : Nullch)
8615
8616
8617 /* Duplicate a regexp. Required reading: pregcomp() and pregfree() in
8618    regcomp.c. AMS 20010712 */
8619
8620 REGEXP *
8621 Perl_re_dup(pTHX_ REGEXP *r, CLONE_PARAMS *param)
8622 {
8623     REGEXP *ret;
8624     int i, len, npar;
8625     struct reg_substr_datum *s;
8626
8627     if (!r)
8628         return (REGEXP *)NULL;
8629
8630     if ((ret = (REGEXP *)ptr_table_fetch(PL_ptr_table, r)))
8631         return ret;
8632
8633     len = r->offsets[0];
8634     npar = r->nparens+1;
8635
8636     Newc(0, ret, sizeof(regexp) + (len+1)*sizeof(regnode), char, regexp);
8637     Copy(r->program, ret->program, len+1, regnode);
8638
8639     New(0, ret->startp, npar, I32);
8640     Copy(r->startp, ret->startp, npar, I32);
8641     New(0, ret->endp, npar, I32);
8642     Copy(r->startp, ret->startp, npar, I32);
8643
8644     New(0, ret->substrs, 1, struct reg_substr_data);
8645     for (s = ret->substrs->data, i = 0; i < 3; i++, s++) {
8646         s->min_offset = r->substrs->data[i].min_offset;
8647         s->max_offset = r->substrs->data[i].max_offset;
8648         s->substr     = sv_dup_inc(r->substrs->data[i].substr, param);
8649         s->utf8_substr = sv_dup_inc(r->substrs->data[i].utf8_substr, param);
8650     }
8651
8652     ret->regstclass = NULL;
8653     if (r->data) {
8654         struct reg_data *d;
8655         int count = r->data->count;
8656
8657         Newc(0, d, sizeof(struct reg_data) + count*sizeof(void *),
8658                 char, struct reg_data);
8659         New(0, d->what, count, U8);
8660
8661         d->count = count;
8662         for (i = 0; i < count; i++) {
8663             d->what[i] = r->data->what[i];
8664             switch (d->what[i]) {
8665             case 's':
8666                 d->data[i] = sv_dup_inc((SV *)r->data->data[i], param);
8667                 break;
8668             case 'p':
8669                 d->data[i] = av_dup_inc((AV *)r->data->data[i], param);
8670                 break;
8671             case 'f':
8672                 /* This is cheating. */
8673                 New(0, d->data[i], 1, struct regnode_charclass_class);
8674                 StructCopy(r->data->data[i], d->data[i],
8675                             struct regnode_charclass_class);
8676                 ret->regstclass = (regnode*)d->data[i];
8677                 break;
8678             case 'o':
8679                 /* Compiled op trees are readonly, and can thus be
8680                    shared without duplication. */
8681                 d->data[i] = (void*)OpREFCNT_inc((OP*)r->data->data[i]);
8682                 break;
8683             case 'n':
8684                 d->data[i] = r->data->data[i];
8685                 break;
8686             }
8687         }
8688
8689         ret->data = d;
8690     }
8691     else
8692         ret->data = NULL;
8693
8694     New(0, ret->offsets, 2*len+1, U32);
8695     Copy(r->offsets, ret->offsets, 2*len+1, U32);
8696
8697     ret->precomp        = SAVEPV(r->precomp);
8698     ret->refcnt         = r->refcnt;
8699     ret->minlen         = r->minlen;
8700     ret->prelen         = r->prelen;
8701     ret->nparens        = r->nparens;
8702     ret->lastparen      = r->lastparen;
8703     ret->lastcloseparen = r->lastcloseparen;
8704     ret->reganch        = r->reganch;
8705
8706     ret->sublen         = r->sublen;
8707
8708     if (RX_MATCH_COPIED(ret))
8709         ret->subbeg  = SAVEPV(r->subbeg);
8710     else
8711         ret->subbeg = Nullch;
8712
8713     ptr_table_store(PL_ptr_table, r, ret);
8714     return ret;
8715 }
8716
8717 /* duplicate a file handle */
8718
8719 PerlIO *
8720 Perl_fp_dup(pTHX_ PerlIO *fp, char type, CLONE_PARAMS *param)
8721 {
8722     PerlIO *ret;
8723     if (!fp)
8724         return (PerlIO*)NULL;
8725
8726     /* look for it in the table first */
8727     ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
8728     if (ret)
8729         return ret;
8730
8731     /* create anew and remember what it is */
8732     ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
8733     ptr_table_store(PL_ptr_table, fp, ret);
8734     return ret;
8735 }
8736
8737 /* duplicate a directory handle */
8738
8739 DIR *
8740 Perl_dirp_dup(pTHX_ DIR *dp)
8741 {
8742     if (!dp)
8743         return (DIR*)NULL;
8744     /* XXX TODO */
8745     return dp;
8746 }
8747
8748 /* duplicate a typeglob */
8749
8750 GP *
8751 Perl_gp_dup(pTHX_ GP *gp, CLONE_PARAMS* param)
8752 {
8753     GP *ret;
8754     if (!gp)
8755         return (GP*)NULL;
8756     /* look for it in the table first */
8757     ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
8758     if (ret)
8759         return ret;
8760
8761     /* create anew and remember what it is */
8762     Newz(0, ret, 1, GP);
8763     ptr_table_store(PL_ptr_table, gp, ret);
8764
8765     /* clone */
8766     ret->gp_refcnt      = 0;                    /* must be before any other dups! */
8767     ret->gp_sv          = sv_dup_inc(gp->gp_sv, param);
8768     ret->gp_io          = io_dup_inc(gp->gp_io, param);
8769     ret->gp_form        = cv_dup_inc(gp->gp_form, param);
8770     ret->gp_av          = av_dup_inc(gp->gp_av, param);
8771     ret->gp_hv          = hv_dup_inc(gp->gp_hv, param);
8772     ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
8773     ret->gp_cv          = cv_dup_inc(gp->gp_cv, param);
8774     ret->gp_cvgen       = gp->gp_cvgen;
8775     ret->gp_flags       = gp->gp_flags;
8776     ret->gp_line        = gp->gp_line;
8777     ret->gp_file        = gp->gp_file;          /* points to COP.cop_file */
8778     return ret;
8779 }
8780
8781 /* duplicate a chain of magic */
8782
8783 MAGIC *
8784 Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS* param)
8785 {
8786     MAGIC *mgprev = (MAGIC*)NULL;
8787     MAGIC *mgret;
8788     if (!mg)
8789         return (MAGIC*)NULL;
8790     /* look for it in the table first */
8791     mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
8792     if (mgret)
8793         return mgret;
8794
8795     for (; mg; mg = mg->mg_moremagic) {
8796         MAGIC *nmg;
8797         Newz(0, nmg, 1, MAGIC);
8798         if (mgprev)
8799             mgprev->mg_moremagic = nmg;
8800         else
8801             mgret = nmg;
8802         nmg->mg_virtual = mg->mg_virtual;       /* XXX copy dynamic vtable? */
8803         nmg->mg_private = mg->mg_private;
8804         nmg->mg_type    = mg->mg_type;
8805         nmg->mg_flags   = mg->mg_flags;
8806         if (mg->mg_type == PERL_MAGIC_qr) {
8807             nmg->mg_obj = (SV*)re_dup((REGEXP*)mg->mg_obj, param);
8808         }
8809         else if(mg->mg_type == PERL_MAGIC_backref) {
8810              AV *av = (AV*) mg->mg_obj;
8811              SV **svp;
8812              I32 i;
8813              nmg->mg_obj = (SV*)newAV();
8814              svp = AvARRAY(av);
8815              i = AvFILLp(av);
8816              while (i >= 0) {
8817                   av_push((AV*)nmg->mg_obj,sv_dup(svp[i],param));
8818                   i--;
8819              }
8820         }
8821         else {
8822             nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
8823                               ? sv_dup_inc(mg->mg_obj, param)
8824                               : sv_dup(mg->mg_obj, param);
8825         }
8826         nmg->mg_len     = mg->mg_len;
8827         nmg->mg_ptr     = mg->mg_ptr;   /* XXX random ptr? */
8828         if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
8829             if (mg->mg_len > 0) {
8830                 nmg->mg_ptr     = SAVEPVN(mg->mg_ptr, mg->mg_len);
8831                 if (mg->mg_type == PERL_MAGIC_overload_table &&
8832                         AMT_AMAGIC((AMT*)mg->mg_ptr))
8833                 {
8834                     AMT *amtp = (AMT*)mg->mg_ptr;
8835                     AMT *namtp = (AMT*)nmg->mg_ptr;
8836                     I32 i;
8837                     for (i = 1; i < NofAMmeth; i++) {
8838                         namtp->table[i] = cv_dup_inc(amtp->table[i], param);
8839                     }
8840                 }
8841             }
8842             else if (mg->mg_len == HEf_SVKEY)
8843                 nmg->mg_ptr     = (char*)sv_dup_inc((SV*)mg->mg_ptr, param);
8844         }
8845         if ((mg->mg_flags & MGf_DUP) && mg->mg_virtual && mg->mg_virtual->svt_dup) {
8846             CALL_FPTR(nmg->mg_virtual->svt_dup)(aTHX_ nmg, param);
8847         }
8848         mgprev = nmg;
8849     }
8850     return mgret;
8851 }
8852
8853 /* create a new pointer-mapping table */
8854
8855 PTR_TBL_t *
8856 Perl_ptr_table_new(pTHX)
8857 {
8858     PTR_TBL_t *tbl;
8859     Newz(0, tbl, 1, PTR_TBL_t);
8860     tbl->tbl_max        = 511;
8861     tbl->tbl_items      = 0;
8862     Newz(0, tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
8863     return tbl;
8864 }
8865
8866 /* map an existing pointer using a table */
8867
8868 void *
8869 Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, void *sv)
8870 {
8871     PTR_TBL_ENT_t *tblent;
8872     UV hash = PTR2UV(sv);
8873     assert(tbl);
8874     tblent = tbl->tbl_ary[hash & tbl->tbl_max];
8875     for (; tblent; tblent = tblent->next) {
8876         if (tblent->oldval == sv)
8877             return tblent->newval;
8878     }
8879     return (void*)NULL;
8880 }
8881
8882 /* add a new entry to a pointer-mapping table */
8883
8884 void
8885 Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, void *oldv, void *newv)
8886 {
8887     PTR_TBL_ENT_t *tblent, **otblent;
8888     /* XXX this may be pessimal on platforms where pointers aren't good
8889      * hash values e.g. if they grow faster in the most significant
8890      * bits */
8891     UV hash = PTR2UV(oldv);
8892     bool i = 1;
8893
8894     assert(tbl);
8895     otblent = &tbl->tbl_ary[hash & tbl->tbl_max];
8896     for (tblent = *otblent; tblent; i=0, tblent = tblent->next) {
8897         if (tblent->oldval == oldv) {
8898             tblent->newval = newv;
8899             tbl->tbl_items++;
8900             return;
8901         }
8902     }
8903     Newz(0, tblent, 1, PTR_TBL_ENT_t);
8904     tblent->oldval = oldv;
8905     tblent->newval = newv;
8906     tblent->next = *otblent;
8907     *otblent = tblent;
8908     tbl->tbl_items++;
8909     if (i && tbl->tbl_items > tbl->tbl_max)
8910         ptr_table_split(tbl);
8911 }
8912
8913 /* double the hash bucket size of an existing ptr table */
8914
8915 void
8916 Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
8917 {
8918     PTR_TBL_ENT_t **ary = tbl->tbl_ary;
8919     UV oldsize = tbl->tbl_max + 1;
8920     UV newsize = oldsize * 2;
8921     UV i;
8922
8923     Renew(ary, newsize, PTR_TBL_ENT_t*);
8924     Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
8925     tbl->tbl_max = --newsize;
8926     tbl->tbl_ary = ary;
8927     for (i=0; i < oldsize; i++, ary++) {
8928         PTR_TBL_ENT_t **curentp, **entp, *ent;
8929         if (!*ary)
8930             continue;
8931         curentp = ary + oldsize;
8932         for (entp = ary, ent = *ary; ent; ent = *entp) {
8933             if ((newsize & PTR2UV(ent->oldval)) != i) {
8934                 *entp = ent->next;
8935                 ent->next = *curentp;
8936                 *curentp = ent;
8937                 continue;
8938             }
8939             else
8940                 entp = &ent->next;
8941         }
8942     }
8943 }
8944
8945 /* remove all the entries from a ptr table */
8946
8947 void
8948 Perl_ptr_table_clear(pTHX_ PTR_TBL_t *tbl)
8949 {
8950     register PTR_TBL_ENT_t **array;
8951     register PTR_TBL_ENT_t *entry;
8952     register PTR_TBL_ENT_t *oentry = Null(PTR_TBL_ENT_t*);
8953     UV riter = 0;
8954     UV max;
8955
8956     if (!tbl || !tbl->tbl_items) {
8957         return;
8958     }
8959
8960     array = tbl->tbl_ary;
8961     entry = array[0];
8962     max = tbl->tbl_max;
8963
8964     for (;;) {
8965         if (entry) {
8966             oentry = entry;
8967             entry = entry->next;
8968             Safefree(oentry);
8969         }
8970         if (!entry) {
8971             if (++riter > max) {
8972                 break;
8973             }
8974             entry = array[riter];
8975         }
8976     }
8977
8978     tbl->tbl_items = 0;
8979 }
8980
8981 /* clear and free a ptr table */
8982
8983 void
8984 Perl_ptr_table_free(pTHX_ PTR_TBL_t *tbl)
8985 {
8986     if (!tbl) {
8987         return;
8988     }
8989     ptr_table_clear(tbl);
8990     Safefree(tbl->tbl_ary);
8991     Safefree(tbl);
8992 }
8993
8994 #ifdef DEBUGGING
8995 char *PL_watch_pvx;
8996 #endif
8997
8998 /* attempt to make everything in the typeglob readonly */
8999
9000 STATIC SV *
9001 S_gv_share(pTHX_ SV *sstr)
9002 {
9003     GV *gv = (GV*)sstr;
9004     SV *sv = &PL_sv_no; /* just need SvREADONLY-ness */
9005
9006     if (GvIO(gv) || GvFORM(gv)) {
9007         GvUNIQUE_off(gv); /* GvIOs cannot be shared. nor can GvFORMs */
9008     }
9009     else if (!GvCV(gv)) {
9010         GvCV(gv) = (CV*)sv;
9011     }
9012     else {
9013         /* CvPADLISTs cannot be shared */
9014         if (!CvXSUB(GvCV(gv))) {
9015             GvUNIQUE_off(gv);
9016         }
9017     }
9018
9019     if (!GvUNIQUE(gv)) {
9020 #if 0
9021         PerlIO_printf(Perl_debug_log, "gv_share: unable to share %s::%s\n",
9022                       HvNAME(GvSTASH(gv)), GvNAME(gv));
9023 #endif
9024         return Nullsv;
9025     }
9026
9027     /*
9028      * write attempts will die with
9029      * "Modification of a read-only value attempted"
9030      */
9031     if (!GvSV(gv)) {
9032         GvSV(gv) = sv;
9033     }
9034     else {
9035         SvREADONLY_on(GvSV(gv));
9036     }
9037
9038     if (!GvAV(gv)) {
9039         GvAV(gv) = (AV*)sv;
9040     }
9041     else {
9042         SvREADONLY_on(GvAV(gv));
9043     }
9044
9045     if (!GvHV(gv)) {
9046         GvHV(gv) = (HV*)sv;
9047     }
9048     else {
9049         SvREADONLY_on(GvAV(gv));
9050     }
9051
9052     return sstr; /* he_dup() will SvREFCNT_inc() */
9053 }
9054
9055 /* duplicate an SV of any type (including AV, HV etc) */
9056
9057 void
9058 Perl_rvpv_dup(pTHX_ SV *dstr, SV *sstr, CLONE_PARAMS* param)
9059 {
9060     if (SvROK(sstr)) {
9061         SvRV(dstr) = SvWEAKREF(sstr)
9062                      ? sv_dup(SvRV(sstr), param)
9063                      : sv_dup_inc(SvRV(sstr), param);
9064     }
9065     else if (SvPVX(sstr)) {
9066         /* Has something there */
9067         if (SvLEN(sstr)) {
9068             /* Normal PV - clone whole allocated space */
9069             SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
9070         }
9071         else {
9072             /* Special case - not normally malloced for some reason */
9073             if (SvREADONLY(sstr) && SvFAKE(sstr)) {
9074                 /* A "shared" PV - clone it as unshared string */
9075                 SvFAKE_off(dstr);
9076                 SvREADONLY_off(dstr);
9077                 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvCUR(sstr));
9078             }
9079             else {
9080                 /* Some other special case - random pointer */
9081                 SvPVX(dstr) = SvPVX(sstr);              
9082             }
9083         }
9084     }
9085     else {
9086         /* Copy the Null */
9087         SvPVX(dstr) = SvPVX(sstr);
9088     }
9089 }
9090
9091 SV *
9092 Perl_sv_dup(pTHX_ SV *sstr, CLONE_PARAMS* param)
9093 {
9094     SV *dstr;
9095
9096     if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
9097         return Nullsv;
9098     /* look for it in the table first */
9099     dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
9100     if (dstr)
9101         return dstr;
9102
9103     /* create anew and remember what it is */
9104     new_SV(dstr);
9105     ptr_table_store(PL_ptr_table, sstr, dstr);
9106
9107     /* clone */
9108     SvFLAGS(dstr)       = SvFLAGS(sstr);
9109     SvFLAGS(dstr)       &= ~SVf_OOK;            /* don't propagate OOK hack */
9110     SvREFCNT(dstr)      = 0;                    /* must be before any other dups! */
9111
9112 #ifdef DEBUGGING
9113     if (SvANY(sstr) && PL_watch_pvx && SvPVX(sstr) == PL_watch_pvx)
9114         PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
9115                       PL_watch_pvx, SvPVX(sstr));
9116 #endif
9117
9118     switch (SvTYPE(sstr)) {
9119     case SVt_NULL:
9120         SvANY(dstr)     = NULL;
9121         break;
9122     case SVt_IV:
9123         SvANY(dstr)     = new_XIV();
9124         SvIVX(dstr)     = SvIVX(sstr);
9125         break;
9126     case SVt_NV:
9127         SvANY(dstr)     = new_XNV();
9128         SvNVX(dstr)     = SvNVX(sstr);
9129         break;
9130     case SVt_RV:
9131         SvANY(dstr)     = new_XRV();
9132         Perl_rvpv_dup(aTHX_ dstr, sstr, param);
9133         break;
9134     case SVt_PV:
9135         SvANY(dstr)     = new_XPV();
9136         SvCUR(dstr)     = SvCUR(sstr);
9137         SvLEN(dstr)     = SvLEN(sstr);
9138         Perl_rvpv_dup(aTHX_ dstr, sstr, param);
9139         break;
9140     case SVt_PVIV:
9141         SvANY(dstr)     = new_XPVIV();
9142         SvCUR(dstr)     = SvCUR(sstr);
9143         SvLEN(dstr)     = SvLEN(sstr);
9144         SvIVX(dstr)     = SvIVX(sstr);
9145         Perl_rvpv_dup(aTHX_ dstr, sstr, param);
9146         break;
9147     case SVt_PVNV:
9148         SvANY(dstr)     = new_XPVNV();
9149         SvCUR(dstr)     = SvCUR(sstr);
9150         SvLEN(dstr)     = SvLEN(sstr);
9151         SvIVX(dstr)     = SvIVX(sstr);
9152         SvNVX(dstr)     = SvNVX(sstr);
9153         Perl_rvpv_dup(aTHX_ dstr, sstr, param);
9154         break;
9155     case SVt_PVMG:
9156         SvANY(dstr)     = new_XPVMG();
9157         SvCUR(dstr)     = SvCUR(sstr);
9158         SvLEN(dstr)     = SvLEN(sstr);
9159         SvIVX(dstr)     = SvIVX(sstr);
9160         SvNVX(dstr)     = SvNVX(sstr);
9161         SvMAGIC(dstr)   = mg_dup(SvMAGIC(sstr), param);
9162         SvSTASH(dstr)   = hv_dup_inc(SvSTASH(sstr), param);
9163         Perl_rvpv_dup(aTHX_ dstr, sstr, param);
9164         break;
9165     case SVt_PVBM:
9166         SvANY(dstr)     = new_XPVBM();
9167         SvCUR(dstr)     = SvCUR(sstr);
9168         SvLEN(dstr)     = SvLEN(sstr);
9169         SvIVX(dstr)     = SvIVX(sstr);
9170         SvNVX(dstr)     = SvNVX(sstr);
9171         SvMAGIC(dstr)   = mg_dup(SvMAGIC(sstr), param);
9172         SvSTASH(dstr)   = hv_dup_inc(SvSTASH(sstr), param);
9173         Perl_rvpv_dup(aTHX_ dstr, sstr, param);
9174         BmRARE(dstr)    = BmRARE(sstr);
9175         BmUSEFUL(dstr)  = BmUSEFUL(sstr);
9176         BmPREVIOUS(dstr)= BmPREVIOUS(sstr);
9177         break;
9178     case SVt_PVLV:
9179         SvANY(dstr)     = new_XPVLV();
9180         SvCUR(dstr)     = SvCUR(sstr);
9181         SvLEN(dstr)     = SvLEN(sstr);
9182         SvIVX(dstr)     = SvIVX(sstr);
9183         SvNVX(dstr)     = SvNVX(sstr);
9184         SvMAGIC(dstr)   = mg_dup(SvMAGIC(sstr), param);
9185         SvSTASH(dstr)   = hv_dup_inc(SvSTASH(sstr), param);
9186         Perl_rvpv_dup(aTHX_ dstr, sstr, param);
9187         LvTARGOFF(dstr) = LvTARGOFF(sstr);      /* XXX sometimes holds PMOP* when DEBUGGING */
9188         LvTARGLEN(dstr) = LvTARGLEN(sstr);
9189         LvTARG(dstr)    = sv_dup_inc(LvTARG(sstr), param);
9190         LvTYPE(dstr)    = LvTYPE(sstr);
9191         break;
9192     case SVt_PVGV:
9193         if (GvUNIQUE((GV*)sstr)) {
9194             SV *share;
9195             if ((share = gv_share(sstr))) {
9196                 del_SV(dstr);
9197                 dstr = share;
9198 #if 0
9199                 PerlIO_printf(Perl_debug_log, "sv_dup: sharing %s::%s\n",
9200                               HvNAME(GvSTASH(share)), GvNAME(share));
9201 #endif
9202                 break;
9203             }
9204         }
9205         SvANY(dstr)     = new_XPVGV();
9206         SvCUR(dstr)     = SvCUR(sstr);
9207         SvLEN(dstr)     = SvLEN(sstr);
9208         SvIVX(dstr)     = SvIVX(sstr);
9209         SvNVX(dstr)     = SvNVX(sstr);
9210         SvMAGIC(dstr)   = mg_dup(SvMAGIC(sstr), param);
9211         SvSTASH(dstr)   = hv_dup_inc(SvSTASH(sstr), param);
9212         Perl_rvpv_dup(aTHX_ dstr, sstr, param);
9213         GvNAMELEN(dstr) = GvNAMELEN(sstr);
9214         GvNAME(dstr)    = SAVEPVN(GvNAME(sstr), GvNAMELEN(sstr));
9215         GvSTASH(dstr)   = hv_dup_inc(GvSTASH(sstr), param);
9216         GvFLAGS(dstr)   = GvFLAGS(sstr);
9217         GvGP(dstr)      = gp_dup(GvGP(sstr), param);
9218         (void)GpREFCNT_inc(GvGP(dstr));
9219         break;
9220     case SVt_PVIO:
9221         SvANY(dstr)     = new_XPVIO();
9222         SvCUR(dstr)     = SvCUR(sstr);
9223         SvLEN(dstr)     = SvLEN(sstr);
9224         SvIVX(dstr)     = SvIVX(sstr);
9225         SvNVX(dstr)     = SvNVX(sstr);
9226         SvMAGIC(dstr)   = mg_dup(SvMAGIC(sstr), param);
9227         SvSTASH(dstr)   = hv_dup_inc(SvSTASH(sstr), param);
9228         Perl_rvpv_dup(aTHX_ dstr, sstr, param);
9229         IoIFP(dstr)     = fp_dup(IoIFP(sstr), IoTYPE(sstr), param);
9230         if (IoOFP(sstr) == IoIFP(sstr))
9231             IoOFP(dstr) = IoIFP(dstr);
9232         else
9233             IoOFP(dstr) = fp_dup(IoOFP(sstr), IoTYPE(sstr), param);
9234         /* PL_rsfp_filters entries have fake IoDIRP() */
9235         if (IoDIRP(sstr) && !(IoFLAGS(sstr) & IOf_FAKE_DIRP))
9236             IoDIRP(dstr)        = dirp_dup(IoDIRP(sstr));
9237         else
9238             IoDIRP(dstr)        = IoDIRP(sstr);
9239         IoLINES(dstr)           = IoLINES(sstr);
9240         IoPAGE(dstr)            = IoPAGE(sstr);
9241         IoPAGE_LEN(dstr)        = IoPAGE_LEN(sstr);
9242         IoLINES_LEFT(dstr)      = IoLINES_LEFT(sstr);
9243         IoTOP_NAME(dstr)        = SAVEPV(IoTOP_NAME(sstr));
9244         IoTOP_GV(dstr)          = gv_dup(IoTOP_GV(sstr), param);
9245         IoFMT_NAME(dstr)        = SAVEPV(IoFMT_NAME(sstr));
9246         IoFMT_GV(dstr)          = gv_dup(IoFMT_GV(sstr), param);
9247         IoBOTTOM_NAME(dstr)     = SAVEPV(IoBOTTOM_NAME(sstr));
9248         IoBOTTOM_GV(dstr)       = gv_dup(IoBOTTOM_GV(sstr), param);
9249         IoSUBPROCESS(dstr)      = IoSUBPROCESS(sstr);
9250         IoTYPE(dstr)            = IoTYPE(sstr);
9251         IoFLAGS(dstr)           = IoFLAGS(sstr);
9252         break;
9253     case SVt_PVAV:
9254         SvANY(dstr)     = new_XPVAV();
9255         SvCUR(dstr)     = SvCUR(sstr);
9256         SvLEN(dstr)     = SvLEN(sstr);
9257         SvIVX(dstr)     = SvIVX(sstr);
9258         SvNVX(dstr)     = SvNVX(sstr);
9259         SvMAGIC(dstr)   = mg_dup(SvMAGIC(sstr), param);
9260         SvSTASH(dstr)   = hv_dup_inc(SvSTASH(sstr), param);
9261         AvARYLEN((AV*)dstr) = sv_dup_inc(AvARYLEN((AV*)sstr), param);
9262         AvFLAGS((AV*)dstr) = AvFLAGS((AV*)sstr);
9263         if (AvARRAY((AV*)sstr)) {
9264             SV **dst_ary, **src_ary;
9265             SSize_t items = AvFILLp((AV*)sstr) + 1;
9266
9267             src_ary = AvARRAY((AV*)sstr);
9268             Newz(0, dst_ary, AvMAX((AV*)sstr)+1, SV*);
9269             ptr_table_store(PL_ptr_table, src_ary, dst_ary);
9270             SvPVX(dstr) = (char*)dst_ary;
9271             AvALLOC((AV*)dstr) = dst_ary;
9272             if (AvREAL((AV*)sstr)) {
9273                 while (items-- > 0)
9274                     *dst_ary++ = sv_dup_inc(*src_ary++, param);
9275             }
9276             else {
9277                 while (items-- > 0)
9278                     *dst_ary++ = sv_dup(*src_ary++, param);
9279             }
9280             items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
9281             while (items-- > 0) {
9282                 *dst_ary++ = &PL_sv_undef;
9283             }
9284         }
9285         else {
9286             SvPVX(dstr)         = Nullch;
9287             AvALLOC((AV*)dstr)  = (SV**)NULL;
9288         }
9289         break;
9290     case SVt_PVHV:
9291         SvANY(dstr)     = new_XPVHV();
9292         SvCUR(dstr)     = SvCUR(sstr);
9293         SvLEN(dstr)     = SvLEN(sstr);
9294         SvIVX(dstr)     = SvIVX(sstr);
9295         SvNVX(dstr)     = SvNVX(sstr);
9296         SvMAGIC(dstr)   = mg_dup(SvMAGIC(sstr), param);
9297         SvSTASH(dstr)   = hv_dup_inc(SvSTASH(sstr), param);
9298         HvRITER((HV*)dstr)      = HvRITER((HV*)sstr);
9299         if (HvARRAY((HV*)sstr)) {
9300             STRLEN i = 0;
9301             XPVHV *dxhv = (XPVHV*)SvANY(dstr);
9302             XPVHV *sxhv = (XPVHV*)SvANY(sstr);
9303             Newz(0, dxhv->xhv_array,
9304                  PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1), char);
9305             while (i <= sxhv->xhv_max) {
9306                 ((HE**)dxhv->xhv_array)[i] = he_dup(((HE**)sxhv->xhv_array)[i],
9307                                                     !!HvSHAREKEYS(sstr), param);
9308                 ++i;
9309             }
9310             dxhv->xhv_eiter = he_dup(sxhv->xhv_eiter, !!HvSHAREKEYS(sstr), param);
9311         }
9312         else {
9313             SvPVX(dstr)         = Nullch;
9314             HvEITER((HV*)dstr)  = (HE*)NULL;
9315         }
9316         HvPMROOT((HV*)dstr)     = HvPMROOT((HV*)sstr);          /* XXX */
9317         HvNAME((HV*)dstr)       = SAVEPV(HvNAME((HV*)sstr));
9318     /* Record stashes for possible cloning in Perl_clone(). */
9319         if(HvNAME((HV*)dstr))
9320             av_push(param->stashes, dstr);
9321         break;
9322     case SVt_PVFM:
9323         SvANY(dstr)     = new_XPVFM();
9324         FmLINES(dstr)   = FmLINES(sstr);
9325         goto dup_pvcv;
9326         /* NOTREACHED */
9327     case SVt_PVCV:
9328         SvANY(dstr)     = new_XPVCV();
9329         dup_pvcv:
9330         SvCUR(dstr)     = SvCUR(sstr);
9331         SvLEN(dstr)     = SvLEN(sstr);
9332         SvIVX(dstr)     = SvIVX(sstr);
9333         SvNVX(dstr)     = SvNVX(sstr);
9334         SvMAGIC(dstr)   = mg_dup(SvMAGIC(sstr), param);
9335         SvSTASH(dstr)   = hv_dup_inc(SvSTASH(sstr), param);
9336         Perl_rvpv_dup(aTHX_ dstr, sstr, param);
9337         CvSTASH(dstr)   = hv_dup(CvSTASH(sstr), param); /* NOTE: not refcounted */
9338         CvSTART(dstr)   = CvSTART(sstr);
9339         CvROOT(dstr)    = OpREFCNT_inc(CvROOT(sstr));
9340         CvXSUB(dstr)    = CvXSUB(sstr);
9341         CvXSUBANY(dstr) = CvXSUBANY(sstr);
9342         if (CvCONST(sstr)) {
9343             CvXSUBANY(dstr).any_ptr = GvUNIQUE(CvGV(sstr)) ?
9344                 SvREFCNT_inc(CvXSUBANY(sstr).any_ptr) :
9345                 sv_dup_inc(CvXSUBANY(sstr).any_ptr, param);
9346         }
9347         CvGV(dstr)      = gv_dup(CvGV(sstr), param);
9348         if (param->flags & CLONEf_COPY_STACKS) {
9349           CvDEPTH(dstr) = CvDEPTH(sstr);
9350         } else {
9351           CvDEPTH(dstr) = 0;
9352         }
9353         if (CvPADLIST(sstr) && !AvREAL(CvPADLIST(sstr))) {
9354             /* XXX padlists are real, but pretend to be not */
9355             AvREAL_on(CvPADLIST(sstr));
9356             CvPADLIST(dstr)     = av_dup_inc(CvPADLIST(sstr), param);
9357             AvREAL_off(CvPADLIST(sstr));
9358             AvREAL_off(CvPADLIST(dstr));
9359         }
9360         else
9361             CvPADLIST(dstr)     = av_dup_inc(CvPADLIST(sstr), param);
9362         if (!CvANON(sstr) || CvCLONED(sstr))
9363             CvOUTSIDE(dstr)     = cv_dup_inc(CvOUTSIDE(sstr), param);
9364         else
9365             CvOUTSIDE(dstr)     = cv_dup(CvOUTSIDE(sstr), param);
9366         CvFLAGS(dstr)   = CvFLAGS(sstr);
9367         CvFILE(dstr) = CvXSUB(sstr) ? CvFILE(sstr) : SAVEPV(CvFILE(sstr));
9368         break;
9369     default:
9370         Perl_croak(aTHX_ "Bizarre SvTYPE [%d]", SvTYPE(sstr));
9371         break;
9372     }
9373
9374     if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
9375         ++PL_sv_objcount;
9376
9377     return dstr;
9378  }
9379
9380 /* duplicate a context */
9381
9382 PERL_CONTEXT *
9383 Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
9384 {
9385     PERL_CONTEXT *ncxs;
9386
9387     if (!cxs)
9388         return (PERL_CONTEXT*)NULL;
9389
9390     /* look for it in the table first */
9391     ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
9392     if (ncxs)
9393         return ncxs;
9394
9395     /* create anew and remember what it is */
9396     Newz(56, ncxs, max + 1, PERL_CONTEXT);
9397     ptr_table_store(PL_ptr_table, cxs, ncxs);
9398
9399     while (ix >= 0) {
9400         PERL_CONTEXT *cx = &cxs[ix];
9401         PERL_CONTEXT *ncx = &ncxs[ix];
9402         ncx->cx_type    = cx->cx_type;
9403         if (CxTYPE(cx) == CXt_SUBST) {
9404             Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
9405         }
9406         else {
9407             ncx->blk_oldsp      = cx->blk_oldsp;
9408             ncx->blk_oldcop     = cx->blk_oldcop;
9409             ncx->blk_oldretsp   = cx->blk_oldretsp;
9410             ncx->blk_oldmarksp  = cx->blk_oldmarksp;
9411             ncx->blk_oldscopesp = cx->blk_oldscopesp;
9412             ncx->blk_oldpm      = cx->blk_oldpm;
9413             ncx->blk_gimme      = cx->blk_gimme;
9414             switch (CxTYPE(cx)) {
9415             case CXt_SUB:
9416                 ncx->blk_sub.cv         = (cx->blk_sub.olddepth == 0
9417                                            ? cv_dup_inc(cx->blk_sub.cv, param)
9418                                            : cv_dup(cx->blk_sub.cv,param));
9419                 ncx->blk_sub.argarray   = (cx->blk_sub.hasargs
9420                                            ? av_dup_inc(cx->blk_sub.argarray, param)
9421                                            : Nullav);
9422                 ncx->blk_sub.savearray  = av_dup_inc(cx->blk_sub.savearray, param);
9423                 ncx->blk_sub.olddepth   = cx->blk_sub.olddepth;
9424                 ncx->blk_sub.hasargs    = cx->blk_sub.hasargs;
9425                 ncx->blk_sub.lval       = cx->blk_sub.lval;
9426                 break;
9427             case CXt_EVAL:
9428                 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
9429                 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
9430                 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv, param);;
9431                 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
9432                 ncx->blk_eval.cur_text  = sv_dup(cx->blk_eval.cur_text, param);
9433                 break;
9434             case CXt_LOOP:
9435                 ncx->blk_loop.label     = cx->blk_loop.label;
9436                 ncx->blk_loop.resetsp   = cx->blk_loop.resetsp;
9437                 ncx->blk_loop.redo_op   = cx->blk_loop.redo_op;
9438                 ncx->blk_loop.next_op   = cx->blk_loop.next_op;
9439                 ncx->blk_loop.last_op   = cx->blk_loop.last_op;
9440                 ncx->blk_loop.iterdata  = (CxPADLOOP(cx)
9441                                            ? cx->blk_loop.iterdata
9442                                            : gv_dup((GV*)cx->blk_loop.iterdata, param));
9443                 ncx->blk_loop.oldcurpad
9444                     = (SV**)ptr_table_fetch(PL_ptr_table,
9445                                             cx->blk_loop.oldcurpad);
9446                 ncx->blk_loop.itersave  = sv_dup_inc(cx->blk_loop.itersave, param);
9447                 ncx->blk_loop.iterlval  = sv_dup_inc(cx->blk_loop.iterlval, param);
9448                 ncx->blk_loop.iterary   = av_dup_inc(cx->blk_loop.iterary, param);
9449                 ncx->blk_loop.iterix    = cx->blk_loop.iterix;
9450                 ncx->blk_loop.itermax   = cx->blk_loop.itermax;
9451                 break;
9452             case CXt_FORMAT:
9453                 ncx->blk_sub.cv         = cv_dup(cx->blk_sub.cv, param);
9454                 ncx->blk_sub.gv         = gv_dup(cx->blk_sub.gv, param);
9455                 ncx->blk_sub.dfoutgv    = gv_dup_inc(cx->blk_sub.dfoutgv, param);
9456                 ncx->blk_sub.hasargs    = cx->blk_sub.hasargs;
9457                 break;
9458             case CXt_BLOCK:
9459             case CXt_NULL:
9460                 break;
9461             }
9462         }
9463         --ix;
9464     }
9465     return ncxs;
9466 }
9467
9468 /* duplicate a stack info structure */
9469
9470 PERL_SI *
9471 Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
9472 {
9473     PERL_SI *nsi;
9474
9475     if (!si)
9476         return (PERL_SI*)NULL;
9477
9478     /* look for it in the table first */
9479     nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
9480     if (nsi)
9481         return nsi;
9482
9483     /* create anew and remember what it is */
9484     Newz(56, nsi, 1, PERL_SI);
9485     ptr_table_store(PL_ptr_table, si, nsi);
9486
9487     nsi->si_stack       = av_dup_inc(si->si_stack, param);
9488     nsi->si_cxix        = si->si_cxix;
9489     nsi->si_cxmax       = si->si_cxmax;
9490     nsi->si_cxstack     = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
9491     nsi->si_type        = si->si_type;
9492     nsi->si_prev        = si_dup(si->si_prev, param);
9493     nsi->si_next        = si_dup(si->si_next, param);
9494     nsi->si_markoff     = si->si_markoff;
9495
9496     return nsi;
9497 }
9498
9499 #define POPINT(ss,ix)   ((ss)[--(ix)].any_i32)
9500 #define TOPINT(ss,ix)   ((ss)[ix].any_i32)
9501 #define POPLONG(ss,ix)  ((ss)[--(ix)].any_long)
9502 #define TOPLONG(ss,ix)  ((ss)[ix].any_long)
9503 #define POPIV(ss,ix)    ((ss)[--(ix)].any_iv)
9504 #define TOPIV(ss,ix)    ((ss)[ix].any_iv)
9505 #define POPPTR(ss,ix)   ((ss)[--(ix)].any_ptr)
9506 #define TOPPTR(ss,ix)   ((ss)[ix].any_ptr)
9507 #define POPDPTR(ss,ix)  ((ss)[--(ix)].any_dptr)
9508 #define TOPDPTR(ss,ix)  ((ss)[ix].any_dptr)
9509 #define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
9510 #define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
9511
9512 /* XXXXX todo */
9513 #define pv_dup_inc(p)   SAVEPV(p)
9514 #define pv_dup(p)       SAVEPV(p)
9515 #define svp_dup_inc(p,pp)       any_dup(p,pp)
9516
9517 /* map any object to the new equivent - either something in the
9518  * ptr table, or something in the interpreter structure
9519  */
9520
9521 void *
9522 Perl_any_dup(pTHX_ void *v, PerlInterpreter *proto_perl)
9523 {
9524     void *ret;
9525
9526     if (!v)
9527         return (void*)NULL;
9528
9529     /* look for it in the table first */
9530     ret = ptr_table_fetch(PL_ptr_table, v);
9531     if (ret)
9532         return ret;
9533
9534     /* see if it is part of the interpreter structure */
9535     if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
9536         ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
9537     else {
9538         ret = v;
9539     }
9540
9541     return ret;
9542 }
9543
9544 /* duplicate the save stack */
9545
9546 ANY *
9547 Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
9548 {
9549     ANY *ss     = proto_perl->Tsavestack;
9550     I32 ix      = proto_perl->Tsavestack_ix;
9551     I32 max     = proto_perl->Tsavestack_max;
9552     ANY *nss;
9553     SV *sv;
9554     GV *gv;
9555     AV *av;
9556     HV *hv;
9557     void* ptr;
9558     int intval;
9559     long longval;
9560     GP *gp;
9561     IV iv;
9562     I32 i;
9563     char *c = NULL;
9564     void (*dptr) (void*);
9565     void (*dxptr) (pTHX_ void*);
9566     OP *o;
9567
9568     Newz(54, nss, max, ANY);
9569
9570     while (ix > 0) {
9571         i = POPINT(ss,ix);
9572         TOPINT(nss,ix) = i;
9573         switch (i) {
9574         case SAVEt_ITEM:                        /* normal string */
9575             sv = (SV*)POPPTR(ss,ix);
9576             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
9577             sv = (SV*)POPPTR(ss,ix);
9578             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
9579             break;
9580         case SAVEt_SV:                          /* scalar reference */
9581             sv = (SV*)POPPTR(ss,ix);
9582             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
9583             gv = (GV*)POPPTR(ss,ix);
9584             TOPPTR(nss,ix) = gv_dup_inc(gv, param);
9585             break;
9586         case SAVEt_GENERIC_PVREF:               /* generic char* */
9587             c = (char*)POPPTR(ss,ix);
9588             TOPPTR(nss,ix) = pv_dup(c);
9589             ptr = POPPTR(ss,ix);
9590             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9591             break;
9592         case SAVEt_SHARED_PVREF:                /* char* in shared space */
9593             c = (char*)POPPTR(ss,ix);
9594             TOPPTR(nss,ix) = savesharedpv(c);
9595             ptr = POPPTR(ss,ix);
9596             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9597             break;
9598         case SAVEt_GENERIC_SVREF:               /* generic sv */
9599         case SAVEt_SVREF:                       /* scalar reference */
9600             sv = (SV*)POPPTR(ss,ix);
9601             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
9602             ptr = POPPTR(ss,ix);
9603             TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
9604             break;
9605         case SAVEt_AV:                          /* array reference */
9606             av = (AV*)POPPTR(ss,ix);
9607             TOPPTR(nss,ix) = av_dup_inc(av, param);
9608             gv = (GV*)POPPTR(ss,ix);
9609             TOPPTR(nss,ix) = gv_dup(gv, param);
9610             break;
9611         case SAVEt_HV:                          /* hash reference */
9612             hv = (HV*)POPPTR(ss,ix);
9613             TOPPTR(nss,ix) = hv_dup_inc(hv, param);
9614             gv = (GV*)POPPTR(ss,ix);
9615             TOPPTR(nss,ix) = gv_dup(gv, param);
9616             break;
9617         case SAVEt_INT:                         /* int reference */
9618             ptr = POPPTR(ss,ix);
9619             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9620             intval = (int)POPINT(ss,ix);
9621             TOPINT(nss,ix) = intval;
9622             break;
9623         case SAVEt_LONG:                        /* long reference */
9624             ptr = POPPTR(ss,ix);
9625             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9626             longval = (long)POPLONG(ss,ix);
9627             TOPLONG(nss,ix) = longval;
9628             break;
9629         case SAVEt_I32:                         /* I32 reference */
9630         case SAVEt_I16:                         /* I16 reference */
9631         case SAVEt_I8:                          /* I8 reference */
9632             ptr = POPPTR(ss,ix);
9633             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9634             i = POPINT(ss,ix);
9635             TOPINT(nss,ix) = i;
9636             break;
9637         case SAVEt_IV:                          /* IV reference */
9638             ptr = POPPTR(ss,ix);
9639             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9640             iv = POPIV(ss,ix);
9641             TOPIV(nss,ix) = iv;
9642             break;
9643         case SAVEt_SPTR:                        /* SV* reference */
9644             ptr = POPPTR(ss,ix);
9645             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9646             sv = (SV*)POPPTR(ss,ix);
9647             TOPPTR(nss,ix) = sv_dup(sv, param);
9648             break;
9649         case SAVEt_VPTR:                        /* random* reference */
9650             ptr = POPPTR(ss,ix);
9651             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9652             ptr = POPPTR(ss,ix);
9653             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9654             break;
9655         case SAVEt_PPTR:                        /* char* reference */
9656             ptr = POPPTR(ss,ix);
9657             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9658             c = (char*)POPPTR(ss,ix);
9659             TOPPTR(nss,ix) = pv_dup(c);
9660             break;
9661         case SAVEt_HPTR:                        /* HV* reference */
9662             ptr = POPPTR(ss,ix);
9663             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9664             hv = (HV*)POPPTR(ss,ix);
9665             TOPPTR(nss,ix) = hv_dup(hv, param);
9666             break;
9667         case SAVEt_APTR:                        /* AV* reference */
9668             ptr = POPPTR(ss,ix);
9669             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9670             av = (AV*)POPPTR(ss,ix);
9671             TOPPTR(nss,ix) = av_dup(av, param);
9672             break;
9673         case SAVEt_NSTAB:
9674             gv = (GV*)POPPTR(ss,ix);
9675             TOPPTR(nss,ix) = gv_dup(gv, param);
9676             break;
9677         case SAVEt_GP:                          /* scalar reference */
9678             gp = (GP*)POPPTR(ss,ix);
9679             TOPPTR(nss,ix) = gp = gp_dup(gp, param);
9680             (void)GpREFCNT_inc(gp);
9681             gv = (GV*)POPPTR(ss,ix);
9682             TOPPTR(nss,ix) = gv_dup_inc(gv, param);
9683             c = (char*)POPPTR(ss,ix);
9684             TOPPTR(nss,ix) = pv_dup(c);
9685             iv = POPIV(ss,ix);
9686             TOPIV(nss,ix) = iv;
9687             iv = POPIV(ss,ix);
9688             TOPIV(nss,ix) = iv;
9689             break;
9690         case SAVEt_FREESV:
9691         case SAVEt_MORTALIZESV:
9692             sv = (SV*)POPPTR(ss,ix);
9693             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
9694             break;
9695         case SAVEt_FREEOP:
9696             ptr = POPPTR(ss,ix);
9697             if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
9698                 /* these are assumed to be refcounted properly */
9699                 switch (((OP*)ptr)->op_type) {
9700                 case OP_LEAVESUB:
9701                 case OP_LEAVESUBLV:
9702                 case OP_LEAVEEVAL:
9703                 case OP_LEAVE:
9704                 case OP_SCOPE:
9705                 case OP_LEAVEWRITE:
9706                     TOPPTR(nss,ix) = ptr;
9707                     o = (OP*)ptr;
9708                     OpREFCNT_inc(o);
9709                     break;
9710                 default:
9711                     TOPPTR(nss,ix) = Nullop;
9712                     break;
9713                 }
9714             }
9715             else
9716                 TOPPTR(nss,ix) = Nullop;
9717             break;
9718         case SAVEt_FREEPV:
9719             c = (char*)POPPTR(ss,ix);
9720             TOPPTR(nss,ix) = pv_dup_inc(c);
9721             break;
9722         case SAVEt_CLEARSV:
9723             longval = POPLONG(ss,ix);
9724             TOPLONG(nss,ix) = longval;
9725             break;
9726         case SAVEt_DELETE:
9727             hv = (HV*)POPPTR(ss,ix);
9728             TOPPTR(nss,ix) = hv_dup_inc(hv, param);
9729             c = (char*)POPPTR(ss,ix);
9730             TOPPTR(nss,ix) = pv_dup_inc(c);
9731             i = POPINT(ss,ix);
9732             TOPINT(nss,ix) = i;
9733             break;
9734         case SAVEt_DESTRUCTOR:
9735             ptr = POPPTR(ss,ix);
9736             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);  /* XXX quite arbitrary */
9737             dptr = POPDPTR(ss,ix);
9738             TOPDPTR(nss,ix) = (void (*)(void*))any_dup((void *)dptr, proto_perl);
9739             break;
9740         case SAVEt_DESTRUCTOR_X:
9741             ptr = POPPTR(ss,ix);
9742             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);  /* XXX quite arbitrary */
9743             dxptr = POPDXPTR(ss,ix);
9744             TOPDXPTR(nss,ix) = (void (*)(pTHX_ void*))any_dup((void *)dxptr, proto_perl);
9745             break;
9746         case SAVEt_REGCONTEXT:
9747         case SAVEt_ALLOC:
9748             i = POPINT(ss,ix);
9749             TOPINT(nss,ix) = i;
9750             ix -= i;
9751             break;
9752         case SAVEt_STACK_POS:           /* Position on Perl stack */
9753             i = POPINT(ss,ix);
9754             TOPINT(nss,ix) = i;
9755             break;
9756         case SAVEt_AELEM:               /* array element */
9757             sv = (SV*)POPPTR(ss,ix);
9758             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
9759             i = POPINT(ss,ix);
9760             TOPINT(nss,ix) = i;
9761             av = (AV*)POPPTR(ss,ix);
9762             TOPPTR(nss,ix) = av_dup_inc(av, param);
9763             break;
9764         case SAVEt_HELEM:               /* hash element */
9765             sv = (SV*)POPPTR(ss,ix);
9766             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
9767             sv = (SV*)POPPTR(ss,ix);
9768             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
9769             hv = (HV*)POPPTR(ss,ix);
9770             TOPPTR(nss,ix) = hv_dup_inc(hv, param);
9771             break;
9772         case SAVEt_OP:
9773             ptr = POPPTR(ss,ix);
9774             TOPPTR(nss,ix) = ptr;
9775             break;
9776         case SAVEt_HINTS:
9777             i = POPINT(ss,ix);
9778             TOPINT(nss,ix) = i;
9779             break;
9780         case SAVEt_COMPPAD:
9781             av = (AV*)POPPTR(ss,ix);
9782             TOPPTR(nss,ix) = av_dup(av, param);
9783             break;
9784         case SAVEt_PADSV:
9785             longval = (long)POPLONG(ss,ix);
9786             TOPLONG(nss,ix) = longval;
9787             ptr = POPPTR(ss,ix);
9788             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9789             sv = (SV*)POPPTR(ss,ix);
9790             TOPPTR(nss,ix) = sv_dup(sv, param);
9791             break;
9792         default:
9793             Perl_croak(aTHX_ "panic: ss_dup inconsistency");
9794         }
9795     }
9796
9797     return nss;
9798 }
9799
9800 /*
9801 =for apidoc perl_clone
9802
9803 Create and return a new interpreter by cloning the current one.
9804
9805 =cut
9806 */
9807
9808 /* XXX the above needs expanding by someone who actually understands it ! */
9809 EXTERN_C PerlInterpreter *
9810 perl_clone_host(PerlInterpreter* proto_perl, UV flags);
9811
9812 PerlInterpreter *
9813 perl_clone(PerlInterpreter *proto_perl, UV flags)
9814 {
9815 #ifdef PERL_IMPLICIT_SYS
9816
9817    /* perlhost.h so we need to call into it
9818    to clone the host, CPerlHost should have a c interface, sky */
9819
9820    if (flags & CLONEf_CLONE_HOST) {
9821        return perl_clone_host(proto_perl,flags);
9822    }
9823    return perl_clone_using(proto_perl, flags,
9824                             proto_perl->IMem,
9825                             proto_perl->IMemShared,
9826                             proto_perl->IMemParse,
9827                             proto_perl->IEnv,
9828                             proto_perl->IStdIO,
9829                             proto_perl->ILIO,
9830                             proto_perl->IDir,
9831                             proto_perl->ISock,
9832                             proto_perl->IProc);
9833 }
9834
9835 PerlInterpreter *
9836 perl_clone_using(PerlInterpreter *proto_perl, UV flags,
9837                  struct IPerlMem* ipM, struct IPerlMem* ipMS,
9838                  struct IPerlMem* ipMP, struct IPerlEnv* ipE,
9839                  struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
9840                  struct IPerlDir* ipD, struct IPerlSock* ipS,
9841                  struct IPerlProc* ipP)
9842 {
9843     /* XXX many of the string copies here can be optimized if they're
9844      * constants; they need to be allocated as common memory and just
9845      * their pointers copied. */
9846
9847     IV i;
9848     CLONE_PARAMS clone_params;
9849     CLONE_PARAMS* param = &clone_params;
9850
9851     PerlInterpreter *my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
9852     PERL_SET_THX(my_perl);
9853
9854 #  ifdef DEBUGGING
9855     memset(my_perl, 0xab, sizeof(PerlInterpreter));
9856     PL_markstack = 0;
9857     PL_scopestack = 0;
9858     PL_savestack = 0;
9859     PL_retstack = 0;
9860     PL_sig_pending = 0;
9861     Zero(&PL_debug_pad, 1, struct perl_debug_pad);
9862 #  else /* !DEBUGGING */
9863     Zero(my_perl, 1, PerlInterpreter);
9864 #  endif        /* DEBUGGING */
9865
9866     /* host pointers */
9867     PL_Mem              = ipM;
9868     PL_MemShared        = ipMS;
9869     PL_MemParse         = ipMP;
9870     PL_Env              = ipE;
9871     PL_StdIO            = ipStd;
9872     PL_LIO              = ipLIO;
9873     PL_Dir              = ipD;
9874     PL_Sock             = ipS;
9875     PL_Proc             = ipP;
9876 #else           /* !PERL_IMPLICIT_SYS */
9877     IV i;
9878     CLONE_PARAMS clone_params;
9879     CLONE_PARAMS* param = &clone_params;
9880     PerlInterpreter *my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
9881     PERL_SET_THX(my_perl);
9882
9883
9884
9885 #    ifdef DEBUGGING
9886     memset(my_perl, 0xab, sizeof(PerlInterpreter));
9887     PL_markstack = 0;
9888     PL_scopestack = 0;
9889     PL_savestack = 0;
9890     PL_retstack = 0;
9891     PL_sig_pending = 0;
9892     Zero(&PL_debug_pad, 1, struct perl_debug_pad);
9893 #    else       /* !DEBUGGING */
9894     Zero(my_perl, 1, PerlInterpreter);
9895 #    endif      /* DEBUGGING */
9896 #endif          /* PERL_IMPLICIT_SYS */
9897     param->flags = flags;
9898
9899     /* arena roots */
9900     PL_xiv_arenaroot    = NULL;
9901     PL_xiv_root         = NULL;
9902     PL_xnv_arenaroot    = NULL;
9903     PL_xnv_root         = NULL;
9904     PL_xrv_arenaroot    = NULL;
9905     PL_xrv_root         = NULL;
9906     PL_xpv_arenaroot    = NULL;
9907     PL_xpv_root         = NULL;
9908     PL_xpviv_arenaroot  = NULL;
9909     PL_xpviv_root       = NULL;
9910     PL_xpvnv_arenaroot  = NULL;
9911     PL_xpvnv_root       = NULL;
9912     PL_xpvcv_arenaroot  = NULL;
9913     PL_xpvcv_root       = NULL;
9914     PL_xpvav_arenaroot  = NULL;
9915     PL_xpvav_root       = NULL;
9916     PL_xpvhv_arenaroot  = NULL;
9917     PL_xpvhv_root       = NULL;
9918     PL_xpvmg_arenaroot  = NULL;
9919     PL_xpvmg_root       = NULL;
9920     PL_xpvlv_arenaroot  = NULL;
9921     PL_xpvlv_root       = NULL;
9922     PL_xpvbm_arenaroot  = NULL;
9923     PL_xpvbm_root       = NULL;
9924     PL_he_arenaroot     = NULL;
9925     PL_he_root          = NULL;
9926     PL_nice_chunk       = NULL;
9927     PL_nice_chunk_size  = 0;
9928     PL_sv_count         = 0;
9929     PL_sv_objcount      = 0;
9930     PL_sv_root          = Nullsv;
9931     PL_sv_arenaroot     = Nullsv;
9932
9933     PL_debug            = proto_perl->Idebug;
9934
9935 #ifdef USE_REENTRANT_API
9936     Perl_reentrant_init(aTHX);
9937 #endif
9938
9939     /* create SV map for pointer relocation */
9940     PL_ptr_table = ptr_table_new();
9941
9942     /* initialize these special pointers as early as possible */
9943     SvANY(&PL_sv_undef)         = NULL;
9944     SvREFCNT(&PL_sv_undef)      = (~(U32)0)/2;
9945     SvFLAGS(&PL_sv_undef)       = SVf_READONLY|SVt_NULL;
9946     ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
9947
9948     SvANY(&PL_sv_no)            = new_XPVNV();
9949     SvREFCNT(&PL_sv_no)         = (~(U32)0)/2;
9950     SvFLAGS(&PL_sv_no)          = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
9951     SvPVX(&PL_sv_no)            = SAVEPVN(PL_No, 0);
9952     SvCUR(&PL_sv_no)            = 0;
9953     SvLEN(&PL_sv_no)            = 1;
9954     SvNVX(&PL_sv_no)            = 0;
9955     ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
9956
9957     SvANY(&PL_sv_yes)           = new_XPVNV();
9958     SvREFCNT(&PL_sv_yes)        = (~(U32)0)/2;
9959     SvFLAGS(&PL_sv_yes)         = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
9960     SvPVX(&PL_sv_yes)           = SAVEPVN(PL_Yes, 1);
9961     SvCUR(&PL_sv_yes)           = 1;
9962     SvLEN(&PL_sv_yes)           = 2;
9963     SvNVX(&PL_sv_yes)           = 1;
9964     ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
9965
9966     /* create (a non-shared!) shared string table */
9967     PL_strtab           = newHV();
9968     HvSHAREKEYS_off(PL_strtab);
9969     hv_ksplit(PL_strtab, 512);
9970     ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
9971
9972     PL_compiling = proto_perl->Icompiling;
9973
9974     /* These two PVs will be free'd special way so must set them same way op.c does */
9975     PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
9976     ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
9977
9978     PL_compiling.cop_file    = savesharedpv(PL_compiling.cop_file);
9979     ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
9980
9981     ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
9982     if (!specialWARN(PL_compiling.cop_warnings))
9983         PL_compiling.cop_warnings = sv_dup_inc(PL_compiling.cop_warnings, param);
9984     if (!specialCopIO(PL_compiling.cop_io))
9985         PL_compiling.cop_io = sv_dup_inc(PL_compiling.cop_io, param);
9986     PL_curcop           = (COP*)any_dup(proto_perl->Tcurcop, proto_perl);
9987
9988     /* pseudo environmental stuff */
9989     PL_origargc         = proto_perl->Iorigargc;
9990     i = PL_origargc;
9991     New(0, PL_origargv, i+1, char*);
9992     PL_origargv[i] = '\0';
9993     while (i-- > 0) {
9994         PL_origargv[i]  = SAVEPV(proto_perl->Iorigargv[i]);
9995     }
9996
9997     param->stashes      = newAV();  /* Setup array of objects to call clone on */
9998
9999 #ifdef PERLIO_LAYERS
10000     /* Clone PerlIO tables as soon as we can handle general xx_dup() */
10001     PerlIO_clone(aTHX_ proto_perl, param);
10002 #endif
10003
10004     PL_envgv            = gv_dup(proto_perl->Ienvgv, param);
10005     PL_incgv            = gv_dup(proto_perl->Iincgv, param);
10006     PL_hintgv           = gv_dup(proto_perl->Ihintgv, param);
10007     PL_origfilename     = SAVEPV(proto_perl->Iorigfilename);
10008     PL_diehook          = sv_dup_inc(proto_perl->Idiehook, param);
10009     PL_warnhook         = sv_dup_inc(proto_perl->Iwarnhook, param);
10010
10011     /* switches */
10012     PL_minus_c          = proto_perl->Iminus_c;
10013     PL_patchlevel       = sv_dup_inc(proto_perl->Ipatchlevel, param);
10014     PL_localpatches     = proto_perl->Ilocalpatches;
10015     PL_splitstr         = proto_perl->Isplitstr;
10016     PL_preprocess       = proto_perl->Ipreprocess;
10017     PL_minus_n          = proto_perl->Iminus_n;
10018     PL_minus_p          = proto_perl->Iminus_p;
10019     PL_minus_l          = proto_perl->Iminus_l;
10020     PL_minus_a          = proto_perl->Iminus_a;
10021     PL_minus_F          = proto_perl->Iminus_F;
10022     PL_doswitches       = proto_perl->Idoswitches;
10023     PL_dowarn           = proto_perl->Idowarn;
10024     PL_doextract        = proto_perl->Idoextract;
10025     PL_sawampersand     = proto_perl->Isawampersand;
10026     PL_unsafe           = proto_perl->Iunsafe;
10027     PL_inplace          = SAVEPV(proto_perl->Iinplace);
10028     PL_e_script         = sv_dup_inc(proto_perl->Ie_script, param);
10029     PL_perldb           = proto_perl->Iperldb;
10030     PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
10031     PL_exit_flags       = proto_perl->Iexit_flags;
10032
10033     /* magical thingies */
10034     /* XXX time(&PL_basetime) when asked for? */
10035     PL_basetime         = proto_perl->Ibasetime;
10036     PL_formfeed         = sv_dup(proto_perl->Iformfeed, param);
10037
10038     PL_maxsysfd         = proto_perl->Imaxsysfd;
10039     PL_multiline        = proto_perl->Imultiline;
10040     PL_statusvalue      = proto_perl->Istatusvalue;
10041 #ifdef VMS
10042     PL_statusvalue_vms  = proto_perl->Istatusvalue_vms;
10043 #endif
10044     PL_encoding         = sv_dup(proto_perl->Iencoding, param);
10045
10046     sv_setpvn(PERL_DEBUG_PAD(0), "", 0);        /* For regex debugging. */
10047     sv_setpvn(PERL_DEBUG_PAD(1), "", 0);        /* ext/re needs these */
10048     sv_setpvn(PERL_DEBUG_PAD(2), "", 0);        /* even without DEBUGGING. */
10049
10050     /* Clone the regex array */
10051     PL_regex_padav = newAV();
10052     {
10053         I32 len = av_len((AV*)proto_perl->Iregex_padav);
10054         SV** regexen = AvARRAY((AV*)proto_perl->Iregex_padav);
10055         av_push(PL_regex_padav,
10056                 sv_dup_inc(regexen[0],param));
10057         for(i = 1; i <= len; i++) {
10058             if(SvREPADTMP(regexen[i])) {
10059               av_push(PL_regex_padav, sv_dup_inc(regexen[i], param));
10060             } else {
10061                 av_push(PL_regex_padav,
10062                     SvREFCNT_inc(
10063                         newSViv(PTR2IV(re_dup(INT2PTR(REGEXP *,
10064                              SvIVX(regexen[i])), param)))
10065                        ));
10066             }
10067         }
10068     }
10069     PL_regex_pad = AvARRAY(PL_regex_padav);
10070
10071     /* shortcuts to various I/O objects */
10072     PL_stdingv          = gv_dup(proto_perl->Istdingv, param);
10073     PL_stderrgv         = gv_dup(proto_perl->Istderrgv, param);
10074     PL_defgv            = gv_dup(proto_perl->Idefgv, param);
10075     PL_argvgv           = gv_dup(proto_perl->Iargvgv, param);
10076     PL_argvoutgv        = gv_dup(proto_perl->Iargvoutgv, param);
10077     PL_argvout_stack    = av_dup_inc(proto_perl->Iargvout_stack, param);
10078
10079     /* shortcuts to regexp stuff */
10080     PL_replgv           = gv_dup(proto_perl->Ireplgv, param);
10081
10082     /* shortcuts to misc objects */
10083     PL_errgv            = gv_dup(proto_perl->Ierrgv, param);
10084
10085     /* shortcuts to debugging objects */
10086     PL_DBgv             = gv_dup(proto_perl->IDBgv, param);
10087     PL_DBline           = gv_dup(proto_perl->IDBline, param);
10088     PL_DBsub            = gv_dup(proto_perl->IDBsub, param);
10089     PL_DBsingle         = sv_dup(proto_perl->IDBsingle, param);
10090     PL_DBtrace          = sv_dup(proto_perl->IDBtrace, param);
10091     PL_DBsignal         = sv_dup(proto_perl->IDBsignal, param);
10092     PL_lineary          = av_dup(proto_perl->Ilineary, param);
10093     PL_dbargs           = av_dup(proto_perl->Idbargs, param);
10094
10095     /* symbol tables */
10096     PL_defstash         = hv_dup_inc(proto_perl->Tdefstash, param);
10097     PL_curstash         = hv_dup(proto_perl->Tcurstash, param);
10098     PL_nullstash       = hv_dup(proto_perl->Inullstash, param);
10099     PL_debstash         = hv_dup(proto_perl->Idebstash, param);
10100     PL_globalstash      = hv_dup(proto_perl->Iglobalstash, param);
10101     PL_curstname        = sv_dup_inc(proto_perl->Icurstname, param);
10102
10103     PL_beginav          = av_dup_inc(proto_perl->Ibeginav, param);
10104     PL_beginav_save     = av_dup_inc(proto_perl->Ibeginav_save, param);
10105     PL_endav            = av_dup_inc(proto_perl->Iendav, param);
10106     PL_checkav          = av_dup_inc(proto_perl->Icheckav, param);
10107     PL_initav           = av_dup_inc(proto_perl->Iinitav, param);
10108
10109     PL_sub_generation   = proto_perl->Isub_generation;
10110
10111     /* funky return mechanisms */
10112     PL_forkprocess      = proto_perl->Iforkprocess;
10113
10114     /* subprocess state */
10115     PL_fdpid            = av_dup_inc(proto_perl->Ifdpid, param);
10116
10117     /* internal state */
10118     PL_tainting         = proto_perl->Itainting;
10119     PL_maxo             = proto_perl->Imaxo;
10120     if (proto_perl->Iop_mask)
10121         PL_op_mask      = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
10122     else
10123         PL_op_mask      = Nullch;
10124
10125     /* current interpreter roots */
10126     PL_main_cv          = cv_dup_inc(proto_perl->Imain_cv, param);
10127     PL_main_root        = OpREFCNT_inc(proto_perl->Imain_root);
10128     PL_main_start       = proto_perl->Imain_start;
10129     PL_eval_root        = proto_perl->Ieval_root;
10130     PL_eval_start       = proto_perl->Ieval_start;
10131
10132     /* runtime control stuff */
10133     PL_curcopdb         = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
10134     PL_copline          = proto_perl->Icopline;
10135
10136     PL_filemode         = proto_perl->Ifilemode;
10137     PL_lastfd           = proto_perl->Ilastfd;
10138     PL_oldname          = proto_perl->Ioldname;         /* XXX not quite right */
10139     PL_Argv             = NULL;
10140     PL_Cmd              = Nullch;
10141     PL_gensym           = proto_perl->Igensym;
10142     PL_preambled        = proto_perl->Ipreambled;
10143     PL_preambleav       = av_dup_inc(proto_perl->Ipreambleav, param);
10144     PL_laststatval      = proto_perl->Ilaststatval;
10145     PL_laststype        = proto_perl->Ilaststype;
10146     PL_mess_sv          = Nullsv;
10147
10148     PL_ors_sv           = sv_dup_inc(proto_perl->Iors_sv, param);
10149     PL_ofmt             = SAVEPV(proto_perl->Iofmt);
10150
10151     /* interpreter atexit processing */
10152     PL_exitlistlen      = proto_perl->Iexitlistlen;
10153     if (PL_exitlistlen) {
10154         New(0, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
10155         Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
10156     }
10157     else
10158         PL_exitlist     = (PerlExitListEntry*)NULL;
10159     PL_modglobal        = hv_dup_inc(proto_perl->Imodglobal, param);
10160     PL_custom_op_names  = hv_dup_inc(proto_perl->Icustom_op_names,param);
10161     PL_custom_op_descs  = hv_dup_inc(proto_perl->Icustom_op_descs,param);
10162
10163     PL_profiledata      = NULL;
10164     PL_rsfp             = fp_dup(proto_perl->Irsfp, '<', param);
10165     /* PL_rsfp_filters entries have fake IoDIRP() */
10166     PL_rsfp_filters     = av_dup_inc(proto_perl->Irsfp_filters, param);
10167
10168     PL_compcv                   = cv_dup(proto_perl->Icompcv, param);
10169     PL_comppad                  = av_dup(proto_perl->Icomppad, param);
10170     PL_comppad_name             = av_dup(proto_perl->Icomppad_name, param);
10171     PL_comppad_name_fill        = proto_perl->Icomppad_name_fill;
10172     PL_comppad_name_floor       = proto_perl->Icomppad_name_floor;
10173     PL_curpad                   = (SV**)ptr_table_fetch(PL_ptr_table,
10174                                                         proto_perl->Tcurpad);
10175
10176 #ifdef HAVE_INTERP_INTERN
10177     sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
10178 #endif
10179
10180     /* more statics moved here */
10181     PL_generation       = proto_perl->Igeneration;
10182     PL_DBcv             = cv_dup(proto_perl->IDBcv, param);
10183
10184     PL_in_clean_objs    = proto_perl->Iin_clean_objs;
10185     PL_in_clean_all     = proto_perl->Iin_clean_all;
10186
10187     PL_uid              = proto_perl->Iuid;
10188     PL_euid             = proto_perl->Ieuid;
10189     PL_gid              = proto_perl->Igid;
10190     PL_egid             = proto_perl->Iegid;
10191     PL_nomemok          = proto_perl->Inomemok;
10192     PL_an               = proto_perl->Ian;
10193     PL_cop_seqmax       = proto_perl->Icop_seqmax;
10194     PL_op_seqmax        = proto_perl->Iop_seqmax;
10195     PL_evalseq          = proto_perl->Ievalseq;
10196     PL_origenviron      = proto_perl->Iorigenviron;     /* XXX not quite right */
10197     PL_origalen         = proto_perl->Iorigalen;
10198     PL_pidstatus        = newHV();                      /* XXX flag for cloning? */
10199     PL_osname           = SAVEPV(proto_perl->Iosname);
10200     PL_sh_path          = proto_perl->Ish_path; /* XXX never deallocated */
10201     PL_sighandlerp      = proto_perl->Isighandlerp;
10202
10203
10204     PL_runops           = proto_perl->Irunops;
10205
10206     Copy(proto_perl->Itokenbuf, PL_tokenbuf, 256, char);
10207
10208 #ifdef CSH
10209     PL_cshlen           = proto_perl->Icshlen;
10210     PL_cshname          = proto_perl->Icshname; /* XXX never deallocated */
10211 #endif
10212
10213     PL_lex_state        = proto_perl->Ilex_state;
10214     PL_lex_defer        = proto_perl->Ilex_defer;
10215     PL_lex_expect       = proto_perl->Ilex_expect;
10216     PL_lex_formbrack    = proto_perl->Ilex_formbrack;
10217     PL_lex_dojoin       = proto_perl->Ilex_dojoin;
10218     PL_lex_starts       = proto_perl->Ilex_starts;
10219     PL_lex_stuff        = sv_dup_inc(proto_perl->Ilex_stuff, param);
10220     PL_lex_repl         = sv_dup_inc(proto_perl->Ilex_repl, param);
10221     PL_lex_op           = proto_perl->Ilex_op;
10222     PL_lex_inpat        = proto_perl->Ilex_inpat;
10223     PL_lex_inwhat       = proto_perl->Ilex_inwhat;
10224     PL_lex_brackets     = proto_perl->Ilex_brackets;
10225     i = (PL_lex_brackets < 120 ? 120 : PL_lex_brackets);
10226     PL_lex_brackstack   = SAVEPVN(proto_perl->Ilex_brackstack,i);
10227     PL_lex_casemods     = proto_perl->Ilex_casemods;
10228     i = (PL_lex_casemods < 12 ? 12 : PL_lex_casemods);
10229     PL_lex_casestack    = SAVEPVN(proto_perl->Ilex_casestack,i);
10230
10231     Copy(proto_perl->Inextval, PL_nextval, 5, YYSTYPE);
10232     Copy(proto_perl->Inexttype, PL_nexttype, 5, I32);
10233     PL_nexttoke         = proto_perl->Inexttoke;
10234
10235     PL_linestr          = sv_dup_inc(proto_perl->Ilinestr, param);
10236     i = proto_perl->Ibufptr - SvPVX(proto_perl->Ilinestr);
10237     PL_bufptr           = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10238     i = proto_perl->Ioldbufptr - SvPVX(proto_perl->Ilinestr);
10239     PL_oldbufptr        = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10240     i = proto_perl->Ioldoldbufptr - SvPVX(proto_perl->Ilinestr);
10241     PL_oldoldbufptr     = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10242     PL_bufend           = SvPVX(PL_linestr) + SvCUR(PL_linestr);
10243     i = proto_perl->Ilinestart - SvPVX(proto_perl->Ilinestr);
10244     PL_linestart        = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10245     PL_pending_ident    = proto_perl->Ipending_ident;
10246     PL_sublex_info      = proto_perl->Isublex_info;     /* XXX not quite right */
10247
10248     PL_expect           = proto_perl->Iexpect;
10249
10250     PL_multi_start      = proto_perl->Imulti_start;
10251     PL_multi_end        = proto_perl->Imulti_end;
10252     PL_multi_open       = proto_perl->Imulti_open;
10253     PL_multi_close      = proto_perl->Imulti_close;
10254
10255     PL_error_count      = proto_perl->Ierror_count;
10256     PL_subline          = proto_perl->Isubline;
10257     PL_subname          = sv_dup_inc(proto_perl->Isubname, param);
10258
10259     PL_min_intro_pending        = proto_perl->Imin_intro_pending;
10260     PL_max_intro_pending        = proto_perl->Imax_intro_pending;
10261     PL_padix                    = proto_perl->Ipadix;
10262     PL_padix_floor              = proto_perl->Ipadix_floor;
10263     PL_pad_reset_pending        = proto_perl->Ipad_reset_pending;
10264
10265     i = proto_perl->Ilast_uni - SvPVX(proto_perl->Ilinestr);
10266     PL_last_uni         = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10267     i = proto_perl->Ilast_lop - SvPVX(proto_perl->Ilinestr);
10268     PL_last_lop         = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10269     PL_last_lop_op      = proto_perl->Ilast_lop_op;
10270     PL_in_my            = proto_perl->Iin_my;
10271     PL_in_my_stash      = hv_dup(proto_perl->Iin_my_stash, param);
10272 #ifdef FCRYPT
10273     PL_cryptseen        = proto_perl->Icryptseen;
10274 #endif
10275
10276     PL_hints            = proto_perl->Ihints;
10277
10278     PL_amagic_generation        = proto_perl->Iamagic_generation;
10279
10280 #ifdef USE_LOCALE_COLLATE
10281     PL_collation_ix     = proto_perl->Icollation_ix;
10282     PL_collation_name   = SAVEPV(proto_perl->Icollation_name);
10283     PL_collation_standard       = proto_perl->Icollation_standard;
10284     PL_collxfrm_base    = proto_perl->Icollxfrm_base;
10285     PL_collxfrm_mult    = proto_perl->Icollxfrm_mult;
10286 #endif /* USE_LOCALE_COLLATE */
10287
10288 #ifdef USE_LOCALE_NUMERIC
10289     PL_numeric_name     = SAVEPV(proto_perl->Inumeric_name);
10290     PL_numeric_standard = proto_perl->Inumeric_standard;
10291     PL_numeric_local    = proto_perl->Inumeric_local;
10292     PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
10293 #endif /* !USE_LOCALE_NUMERIC */
10294
10295     /* utf8 character classes */
10296     PL_utf8_alnum       = sv_dup_inc(proto_perl->Iutf8_alnum, param);
10297     PL_utf8_alnumc      = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
10298     PL_utf8_ascii       = sv_dup_inc(proto_perl->Iutf8_ascii, param);
10299     PL_utf8_alpha       = sv_dup_inc(proto_perl->Iutf8_alpha, param);
10300     PL_utf8_space       = sv_dup_inc(proto_perl->Iutf8_space, param);
10301     PL_utf8_cntrl       = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
10302     PL_utf8_graph       = sv_dup_inc(proto_perl->Iutf8_graph, param);
10303     PL_utf8_digit       = sv_dup_inc(proto_perl->Iutf8_digit, param);
10304     PL_utf8_upper       = sv_dup_inc(proto_perl->Iutf8_upper, param);
10305     PL_utf8_lower       = sv_dup_inc(proto_perl->Iutf8_lower, param);
10306     PL_utf8_print       = sv_dup_inc(proto_perl->Iutf8_print, param);
10307     PL_utf8_punct       = sv_dup_inc(proto_perl->Iutf8_punct, param);
10308     PL_utf8_xdigit      = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
10309     PL_utf8_mark        = sv_dup_inc(proto_perl->Iutf8_mark, param);
10310     PL_utf8_toupper     = sv_dup_inc(proto_perl->Iutf8_toupper, param);
10311     PL_utf8_totitle     = sv_dup_inc(proto_perl->Iutf8_totitle, param);
10312     PL_utf8_tolower     = sv_dup_inc(proto_perl->Iutf8_tolower, param);
10313     PL_utf8_tofold      = sv_dup_inc(proto_perl->Iutf8_tofold, param);
10314
10315     /* swatch cache */
10316     PL_last_swash_hv    = Nullhv;       /* reinits on demand */
10317     PL_last_swash_klen  = 0;
10318     PL_last_swash_key[0]= '\0';
10319     PL_last_swash_tmps  = (U8*)NULL;
10320     PL_last_swash_slen  = 0;
10321
10322     /* perly.c globals */
10323     PL_yydebug          = proto_perl->Iyydebug;
10324     PL_yynerrs          = proto_perl->Iyynerrs;
10325     PL_yyerrflag        = proto_perl->Iyyerrflag;
10326     PL_yychar           = proto_perl->Iyychar;
10327     PL_yyval            = proto_perl->Iyyval;
10328     PL_yylval           = proto_perl->Iyylval;
10329
10330     PL_glob_index       = proto_perl->Iglob_index;
10331     PL_srand_called     = proto_perl->Isrand_called;
10332     PL_uudmap['M']      = 0;            /* reinits on demand */
10333     PL_bitcount         = Nullch;       /* reinits on demand */
10334
10335     if (proto_perl->Ipsig_pend) {
10336         Newz(0, PL_psig_pend, SIG_SIZE, int);
10337     }
10338     else {
10339         PL_psig_pend    = (int*)NULL;
10340     }
10341
10342     if (proto_perl->Ipsig_ptr) {
10343         Newz(0, PL_psig_ptr,  SIG_SIZE, SV*);
10344         Newz(0, PL_psig_name, SIG_SIZE, SV*);
10345         for (i = 1; i < SIG_SIZE; i++) {
10346             PL_psig_ptr[i]  = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
10347             PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
10348         }
10349     }
10350     else {
10351         PL_psig_ptr     = (SV**)NULL;
10352         PL_psig_name    = (SV**)NULL;
10353     }
10354
10355     /* thrdvar.h stuff */
10356
10357     if (flags & CLONEf_COPY_STACKS) {
10358         /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
10359         PL_tmps_ix              = proto_perl->Ttmps_ix;
10360         PL_tmps_max             = proto_perl->Ttmps_max;
10361         PL_tmps_floor           = proto_perl->Ttmps_floor;
10362         Newz(50, PL_tmps_stack, PL_tmps_max, SV*);
10363         i = 0;
10364         while (i <= PL_tmps_ix) {
10365             PL_tmps_stack[i]    = sv_dup_inc(proto_perl->Ttmps_stack[i], param);
10366             ++i;
10367         }
10368
10369         /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
10370         i = proto_perl->Tmarkstack_max - proto_perl->Tmarkstack;
10371         Newz(54, PL_markstack, i, I32);
10372         PL_markstack_max        = PL_markstack + (proto_perl->Tmarkstack_max
10373                                                   - proto_perl->Tmarkstack);
10374         PL_markstack_ptr        = PL_markstack + (proto_perl->Tmarkstack_ptr
10375                                                   - proto_perl->Tmarkstack);
10376         Copy(proto_perl->Tmarkstack, PL_markstack,
10377              PL_markstack_ptr - PL_markstack + 1, I32);
10378
10379         /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
10380          * NOTE: unlike the others! */
10381         PL_scopestack_ix        = proto_perl->Tscopestack_ix;
10382         PL_scopestack_max       = proto_perl->Tscopestack_max;
10383         Newz(54, PL_scopestack, PL_scopestack_max, I32);
10384         Copy(proto_perl->Tscopestack, PL_scopestack, PL_scopestack_ix, I32);
10385
10386         /* next push_return() sets PL_retstack[PL_retstack_ix]
10387          * NOTE: unlike the others! */
10388         PL_retstack_ix          = proto_perl->Tretstack_ix;
10389         PL_retstack_max         = proto_perl->Tretstack_max;
10390         Newz(54, PL_retstack, PL_retstack_max, OP*);
10391         Copy(proto_perl->Tretstack, PL_retstack, PL_retstack_ix, I32);
10392
10393         /* NOTE: si_dup() looks at PL_markstack */
10394         PL_curstackinfo         = si_dup(proto_perl->Tcurstackinfo, param);
10395
10396         /* PL_curstack          = PL_curstackinfo->si_stack; */
10397         PL_curstack             = av_dup(proto_perl->Tcurstack, param);
10398         PL_mainstack            = av_dup(proto_perl->Tmainstack, param);
10399
10400         /* next PUSHs() etc. set *(PL_stack_sp+1) */
10401         PL_stack_base           = AvARRAY(PL_curstack);
10402         PL_stack_sp             = PL_stack_base + (proto_perl->Tstack_sp
10403                                                    - proto_perl->Tstack_base);
10404         PL_stack_max            = PL_stack_base + AvMAX(PL_curstack);
10405
10406         /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
10407          * NOTE: unlike the others! */
10408         PL_savestack_ix         = proto_perl->Tsavestack_ix;
10409         PL_savestack_max        = proto_perl->Tsavestack_max;
10410         /*Newz(54, PL_savestack, PL_savestack_max, ANY);*/
10411         PL_savestack            = ss_dup(proto_perl, param);
10412     }
10413     else {
10414         init_stacks();
10415         ENTER;                  /* perl_destruct() wants to LEAVE; */
10416     }
10417
10418     PL_start_env        = proto_perl->Tstart_env;       /* XXXXXX */
10419     PL_top_env          = &PL_start_env;
10420
10421     PL_op               = proto_perl->Top;
10422
10423     PL_Sv               = Nullsv;
10424     PL_Xpv              = (XPV*)NULL;
10425     PL_na               = proto_perl->Tna;
10426
10427     PL_statbuf          = proto_perl->Tstatbuf;
10428     PL_statcache        = proto_perl->Tstatcache;
10429     PL_statgv           = gv_dup(proto_perl->Tstatgv, param);
10430     PL_statname         = sv_dup_inc(proto_perl->Tstatname, param);
10431 #ifdef HAS_TIMES
10432     PL_timesbuf         = proto_perl->Ttimesbuf;
10433 #endif
10434
10435     PL_tainted          = proto_perl->Ttainted;
10436     PL_curpm            = proto_perl->Tcurpm;   /* XXX No PMOP ref count */
10437     PL_rs               = sv_dup_inc(proto_perl->Trs, param);
10438     PL_last_in_gv       = gv_dup(proto_perl->Tlast_in_gv, param);
10439     PL_ofs_sv           = sv_dup_inc(proto_perl->Tofs_sv, param);
10440     PL_defoutgv         = gv_dup_inc(proto_perl->Tdefoutgv, param);
10441     PL_chopset          = proto_perl->Tchopset; /* XXX never deallocated */
10442     PL_toptarget        = sv_dup_inc(proto_perl->Ttoptarget, param);
10443     PL_bodytarget       = sv_dup_inc(proto_perl->Tbodytarget, param);
10444     PL_formtarget       = sv_dup(proto_perl->Tformtarget, param);
10445
10446     PL_restartop        = proto_perl->Trestartop;
10447     PL_in_eval          = proto_perl->Tin_eval;
10448     PL_delaymagic       = proto_perl->Tdelaymagic;
10449     PL_dirty            = proto_perl->Tdirty;
10450     PL_localizing       = proto_perl->Tlocalizing;
10451
10452 #ifdef PERL_FLEXIBLE_EXCEPTIONS
10453     PL_protect          = proto_perl->Tprotect;
10454 #endif
10455     PL_errors           = sv_dup_inc(proto_perl->Terrors, param);
10456     PL_av_fetch_sv      = Nullsv;
10457     PL_hv_fetch_sv      = Nullsv;
10458     Zero(&PL_hv_fetch_ent_mh, 1, HE);                   /* XXX */
10459     PL_modcount         = proto_perl->Tmodcount;
10460     PL_lastgotoprobe    = Nullop;
10461     PL_dumpindent       = proto_perl->Tdumpindent;
10462
10463     PL_sortcop          = (OP*)any_dup(proto_perl->Tsortcop, proto_perl);
10464     PL_sortstash        = hv_dup(proto_perl->Tsortstash, param);
10465     PL_firstgv          = gv_dup(proto_perl->Tfirstgv, param);
10466     PL_secondgv         = gv_dup(proto_perl->Tsecondgv, param);
10467     PL_sortcxix         = proto_perl->Tsortcxix;
10468     PL_efloatbuf        = Nullch;               /* reinits on demand */
10469     PL_efloatsize       = 0;                    /* reinits on demand */
10470
10471     /* regex stuff */
10472
10473     PL_screamfirst      = NULL;
10474     PL_screamnext       = NULL;
10475     PL_maxscream        = -1;                   /* reinits on demand */
10476     PL_lastscream       = Nullsv;
10477
10478     PL_watchaddr        = NULL;
10479     PL_watchok          = Nullch;
10480
10481     PL_regdummy         = proto_perl->Tregdummy;
10482     PL_regcomp_parse    = Nullch;
10483     PL_regxend          = Nullch;
10484     PL_regcode          = (regnode*)NULL;
10485     PL_regnaughty       = 0;
10486     PL_regsawback       = 0;
10487     PL_regprecomp       = Nullch;
10488     PL_regnpar          = 0;
10489     PL_regsize          = 0;
10490     PL_regflags         = 0;
10491     PL_regseen          = 0;
10492     PL_seen_zerolen     = 0;
10493     PL_seen_evals       = 0;
10494     PL_regcomp_rx       = (regexp*)NULL;
10495     PL_extralen         = 0;
10496     PL_colorset         = 0;            /* reinits PL_colors[] */
10497     /*PL_colors[6]      = {0,0,0,0,0,0};*/
10498     PL_reg_whilem_seen  = 0;
10499     PL_reginput         = Nullch;
10500     PL_regbol           = Nullch;
10501     PL_regeol           = Nullch;
10502     PL_regstartp        = (I32*)NULL;
10503     PL_regendp          = (I32*)NULL;
10504     PL_reglastparen     = (U32*)NULL;
10505     PL_regtill          = Nullch;
10506     PL_reg_start_tmp    = (char**)NULL;
10507     PL_reg_start_tmpl   = 0;
10508     PL_regdata          = (struct reg_data*)NULL;
10509     PL_bostr            = Nullch;
10510     PL_reg_flags        = 0;
10511     PL_reg_eval_set     = 0;
10512     PL_regnarrate       = 0;
10513     PL_regprogram       = (regnode*)NULL;
10514     PL_regindent        = 0;
10515     PL_regcc            = (CURCUR*)NULL;
10516     PL_reg_call_cc      = (struct re_cc_state*)NULL;
10517     PL_reg_re           = (regexp*)NULL;
10518     PL_reg_ganch        = Nullch;
10519     PL_reg_sv           = Nullsv;
10520     PL_reg_match_utf8   = FALSE;
10521     PL_reg_magic        = (MAGIC*)NULL;
10522     PL_reg_oldpos       = 0;
10523     PL_reg_oldcurpm     = (PMOP*)NULL;
10524     PL_reg_curpm        = (PMOP*)NULL;
10525     PL_reg_oldsaved     = Nullch;
10526     PL_reg_oldsavedlen  = 0;
10527     PL_reg_maxiter      = 0;
10528     PL_reg_leftiter     = 0;
10529     PL_reg_poscache     = Nullch;
10530     PL_reg_poscache_size= 0;
10531
10532     /* RE engine - function pointers */
10533     PL_regcompp         = proto_perl->Tregcompp;
10534     PL_regexecp         = proto_perl->Tregexecp;
10535     PL_regint_start     = proto_perl->Tregint_start;
10536     PL_regint_string    = proto_perl->Tregint_string;
10537     PL_regfree          = proto_perl->Tregfree;
10538
10539     PL_reginterp_cnt    = 0;
10540     PL_reg_starttry     = 0;
10541
10542     /* Pluggable optimizer */
10543     PL_peepp            = proto_perl->Tpeepp;
10544
10545     if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
10546         ptr_table_free(PL_ptr_table);
10547         PL_ptr_table = NULL;
10548     }
10549
10550     /* Call the ->CLONE method, if it exists, for each of the stashes
10551        identified by sv_dup() above.
10552     */
10553     while(av_len(param->stashes) != -1) {
10554         HV* stash = (HV*) av_shift(param->stashes);
10555         GV* cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
10556         if (cloner && GvCV(cloner)) {
10557             dSP;
10558             ENTER;
10559             SAVETMPS;
10560             PUSHMARK(SP);
10561            XPUSHs(sv_2mortal(newSVpv(HvNAME(stash), 0)));
10562             PUTBACK;
10563             call_sv((SV*)GvCV(cloner), G_DISCARD);
10564             FREETMPS;
10565             LEAVE;
10566         }
10567     }
10568
10569     SvREFCNT_dec(param->stashes);
10570
10571     return my_perl;
10572 }
10573
10574 #endif /* USE_ITHREADS */
10575
10576 /*
10577 =head1 Unicode Support
10578
10579 =for apidoc sv_recode_to_utf8
10580
10581 The encoding is assumed to be an Encode object, on entry the PV
10582 of the sv is assumed to be octets in that encoding, and the sv
10583 will be converted into Unicode (and UTF-8).
10584
10585 If the sv already is UTF-8 (or if it is not POK), or if the encoding
10586 is not a reference, nothing is done to the sv.  If the encoding is not
10587 an C<Encode::XS> Encoding object, bad things will happen.
10588 (See F<lib/encoding.pm> and L<Encode>).
10589
10590 The PV of the sv is returned.
10591
10592 =cut */
10593
10594 char *
10595 Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
10596 {
10597      if (SvPOK(sv) && !DO_UTF8(sv) && SvROK(encoding)) {
10598           SV *uni;
10599           STRLEN len;
10600           char *s;
10601           dSP;
10602           ENTER;
10603           SAVETMPS;
10604           PUSHMARK(sp);
10605           EXTEND(SP, 3);
10606           XPUSHs(encoding);
10607           XPUSHs(sv);
10608           XPUSHs(&PL_sv_yes);
10609           PUTBACK;
10610           call_method("decode", G_SCALAR);
10611           SPAGAIN;
10612           uni = POPs;
10613           PUTBACK;
10614           s = SvPV(uni, len);
10615           if (s != SvPVX(sv)) {
10616                SvGROW(sv, len);
10617                Move(s, SvPVX(sv), len, char);
10618                SvCUR_set(sv, len);
10619           }
10620           FREETMPS;
10621           LEAVE;
10622           SvUTF8_on(sv);
10623      }
10624      return SvPVX(sv);
10625 }
10626
10627