cc65ab283d80e2dd5a511ba63d8bb3c816223ce1
[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' + (char)(uv % 10);
2871     } while (uv /= 10);
2872     if (sign)
2873         *--ptr = '-';
2874     *peob = ebuf;
2875     return ptr;
2876 }
2877
2878 /*
2879 =for apidoc sv_2pv_flags
2880
2881 Returns a pointer to the string value of an SV, and sets *lp to its length.
2882 If flags includes SV_GMAGIC, does an mg_get() first. Coerces sv to a string
2883 if necessary.
2884 Normally invoked via the C<SvPV_flags> macro. C<sv_2pv()> and C<sv_2pv_nomg>
2885 usually end up here too.
2886
2887 =cut
2888 */
2889
2890 char *
2891 Perl_sv_2pv_flags(pTHX_ register SV *sv, STRLEN *lp, I32 flags)
2892 {
2893     register char *s;
2894     int olderrno;
2895     SV *tsv;
2896     char tbuf[64];      /* Must fit sprintf/Gconvert of longest IV/NV */
2897     char *tmpbuf = tbuf;
2898
2899     if (!sv) {
2900         *lp = 0;
2901         return "";
2902     }
2903     if (SvGMAGICAL(sv)) {
2904         if (flags & SV_GMAGIC)
2905             mg_get(sv);
2906         if (SvPOKp(sv)) {
2907             *lp = SvCUR(sv);
2908             return SvPVX(sv);
2909         }
2910         if (SvIOKp(sv)) {
2911             if (SvIsUV(sv))
2912                 (void)sprintf(tmpbuf,"%"UVuf, (UV)SvUVX(sv));
2913             else
2914                 (void)sprintf(tmpbuf,"%"IVdf, (IV)SvIVX(sv));
2915             tsv = Nullsv;
2916             goto tokensave;
2917         }
2918         if (SvNOKp(sv)) {
2919             Gconvert(SvNVX(sv), NV_DIG, 0, tmpbuf);
2920             tsv = Nullsv;
2921             goto tokensave;
2922         }
2923         if (!SvROK(sv)) {
2924             if (!(SvFLAGS(sv) & SVs_PADTMP)) {
2925                 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
2926                     report_uninit();
2927             }
2928             *lp = 0;
2929             return "";
2930         }
2931     }
2932     if (SvTHINKFIRST(sv)) {
2933         if (SvROK(sv)) {
2934             SV* tmpstr;
2935             if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)) &&
2936                 (SvTYPE(tmpstr) != SVt_RV || (SvRV(tmpstr) != SvRV(sv))))
2937                 return SvPV(tmpstr,*lp);
2938             sv = (SV*)SvRV(sv);
2939             if (!sv)
2940                 s = "NULLREF";
2941             else {
2942                 MAGIC *mg;
2943                 
2944                 switch (SvTYPE(sv)) {
2945                 case SVt_PVMG:
2946                     if ( ((SvFLAGS(sv) &
2947                            (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG))
2948                           == (SVs_OBJECT|SVs_RMG))
2949                          && strEQ(s=HvNAME(SvSTASH(sv)), "Regexp")
2950                          && (mg = mg_find(sv, PERL_MAGIC_qr))) {
2951                         regexp *re = (regexp *)mg->mg_obj;
2952
2953                         if (!mg->mg_ptr) {
2954                             char *fptr = "msix";
2955                             char reflags[6];
2956                             char ch;
2957                             int left = 0;
2958                             int right = 4;
2959                             char need_newline = 0;
2960                             U16 reganch = (U16)((re->reganch & PMf_COMPILETIME) >> 12);
2961
2962                             while((ch = *fptr++)) {
2963                                 if(reganch & 1) {
2964                                     reflags[left++] = ch;
2965                                 }
2966                                 else {
2967                                     reflags[right--] = ch;
2968                                 }
2969                                 reganch >>= 1;
2970                             }
2971                             if(left != 4) {
2972                                 reflags[left] = '-';
2973                                 left = 5;
2974                             }
2975
2976                             mg->mg_len = re->prelen + 4 + left;
2977                             /*
2978                              * If /x was used, we have to worry about a regex
2979                              * ending with a comment later being embedded
2980                              * within another regex. If so, we don't want this
2981                              * regex's "commentization" to leak out to the
2982                              * right part of the enclosing regex, we must cap
2983                              * it with a newline.
2984                              *
2985                              * So, if /x was used, we scan backwards from the
2986                              * end of the regex. If we find a '#' before we
2987                              * find a newline, we need to add a newline
2988                              * ourself. If we find a '\n' first (or if we
2989                              * don't find '#' or '\n'), we don't need to add
2990                              * anything.  -jfriedl
2991                              */
2992                             if (PMf_EXTENDED & re->reganch)
2993                             {
2994                                 char *endptr = re->precomp + re->prelen;
2995                                 while (endptr >= re->precomp)
2996                                 {
2997                                     char c = *(endptr--);
2998                                     if (c == '\n')
2999                                         break; /* don't need another */
3000                                     if (c == '#') {
3001                                         /* we end while in a comment, so we
3002                                            need a newline */
3003                                         mg->mg_len++; /* save space for it */
3004                                         need_newline = 1; /* note to add it */
3005                                     }
3006                                 }
3007                             }
3008
3009                             New(616, mg->mg_ptr, mg->mg_len + 1 + left, char);
3010                             Copy("(?", mg->mg_ptr, 2, char);
3011                             Copy(reflags, mg->mg_ptr+2, left, char);
3012                             Copy(":", mg->mg_ptr+left+2, 1, char);
3013                             Copy(re->precomp, mg->mg_ptr+3+left, re->prelen, char);
3014                             if (need_newline)
3015                                 mg->mg_ptr[mg->mg_len - 2] = '\n';
3016                             mg->mg_ptr[mg->mg_len - 1] = ')';
3017                             mg->mg_ptr[mg->mg_len] = 0;
3018                         }
3019                         PL_reginterp_cnt += re->program[0].next_off;
3020                         *lp = mg->mg_len;
3021                         return mg->mg_ptr;
3022                     }
3023                                         /* Fall through */
3024                 case SVt_NULL:
3025                 case SVt_IV:
3026                 case SVt_NV:
3027                 case SVt_RV:
3028                 case SVt_PV:
3029                 case SVt_PVIV:
3030                 case SVt_PVNV:
3031                 case SVt_PVBM:  if (SvROK(sv))
3032                                     s = "REF";
3033                                 else
3034                                     s = "SCALAR";               break;
3035                 case SVt_PVLV:  s = "LVALUE";                   break;
3036                 case SVt_PVAV:  s = "ARRAY";                    break;
3037                 case SVt_PVHV:  s = "HASH";                     break;
3038                 case SVt_PVCV:  s = "CODE";                     break;
3039                 case SVt_PVGV:  s = "GLOB";                     break;
3040                 case SVt_PVFM:  s = "FORMAT";                   break;
3041                 case SVt_PVIO:  s = "IO";                       break;
3042                 default:        s = "UNKNOWN";                  break;
3043                 }
3044                 tsv = NEWSV(0,0);
3045                 if (SvOBJECT(sv)) {
3046                     HV *svs = SvSTASH(sv);
3047                     Perl_sv_setpvf(
3048                         aTHX_ tsv, "%s=%s",
3049                         /* [20011101.072] This bandaid for C<package;>
3050                            should eventually be removed. AMS 20011103 */
3051                         (svs ? HvNAME(svs) : "<none>"), s
3052                     );
3053                 }
3054                 else
3055                     sv_setpv(tsv, s);
3056                 Perl_sv_catpvf(aTHX_ tsv, "(0x%"UVxf")", PTR2UV(sv));
3057                 goto tokensaveref;
3058             }
3059             *lp = strlen(s);
3060             return s;
3061         }
3062         if (SvREADONLY(sv) && !SvOK(sv)) {
3063             if (ckWARN(WARN_UNINITIALIZED))
3064                 report_uninit();
3065             *lp = 0;
3066             return "";
3067         }
3068     }
3069     if (SvIOK(sv) || ((SvIOKp(sv) && !SvNOKp(sv)))) {
3070         /* I'm assuming that if both IV and NV are equally valid then
3071            converting the IV is going to be more efficient */
3072         U32 isIOK = SvIOK(sv);
3073         U32 isUIOK = SvIsUV(sv);
3074         char buf[TYPE_CHARS(UV)];
3075         char *ebuf, *ptr;
3076
3077         if (SvTYPE(sv) < SVt_PVIV)
3078             sv_upgrade(sv, SVt_PVIV);
3079         if (isUIOK)
3080             ptr = uiv_2buf(buf, 0, SvUVX(sv), 1, &ebuf);
3081         else
3082             ptr = uiv_2buf(buf, SvIVX(sv), 0, 0, &ebuf);
3083         SvGROW(sv, (STRLEN)(ebuf - ptr + 1));   /* inlined from sv_setpvn */
3084         Move(ptr,SvPVX(sv),ebuf - ptr,char);
3085         SvCUR_set(sv, ebuf - ptr);
3086         s = SvEND(sv);
3087         *s = '\0';
3088         if (isIOK)
3089             SvIOK_on(sv);
3090         else
3091             SvIOKp_on(sv);
3092         if (isUIOK)
3093             SvIsUV_on(sv);
3094     }
3095     else if (SvNOKp(sv)) {
3096         if (SvTYPE(sv) < SVt_PVNV)
3097             sv_upgrade(sv, SVt_PVNV);
3098         /* The +20 is pure guesswork.  Configure test needed. --jhi */
3099         SvGROW(sv, NV_DIG + 20);
3100         s = SvPVX(sv);
3101         olderrno = errno;       /* some Xenix systems wipe out errno here */
3102 #ifdef apollo
3103         if (SvNVX(sv) == 0.0)
3104             (void)strcpy(s,"0");
3105         else
3106 #endif /*apollo*/
3107         {
3108             Gconvert(SvNVX(sv), NV_DIG, 0, s);
3109         }
3110         errno = olderrno;
3111 #ifdef FIXNEGATIVEZERO
3112         if (*s == '-' && s[1] == '0' && !s[2])
3113             strcpy(s,"0");
3114 #endif
3115         while (*s) s++;
3116 #ifdef hcx
3117         if (s[-1] == '.')
3118             *--s = '\0';
3119 #endif
3120     }
3121     else {
3122         if (ckWARN(WARN_UNINITIALIZED)
3123             && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
3124             report_uninit();
3125         *lp = 0;
3126         if (SvTYPE(sv) < SVt_PV)
3127             /* Typically the caller expects that sv_any is not NULL now.  */
3128             sv_upgrade(sv, SVt_PV);
3129         return "";
3130     }
3131     *lp = s - SvPVX(sv);
3132     SvCUR_set(sv, *lp);
3133     SvPOK_on(sv);
3134     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3135                           PTR2UV(sv),SvPVX(sv)));
3136     return SvPVX(sv);
3137
3138   tokensave:
3139     if (SvROK(sv)) {    /* XXX Skip this when sv_pvn_force calls */
3140         /* Sneaky stuff here */
3141
3142       tokensaveref:
3143         if (!tsv)
3144             tsv = newSVpv(tmpbuf, 0);
3145         sv_2mortal(tsv);
3146         *lp = SvCUR(tsv);
3147         return SvPVX(tsv);
3148     }
3149     else {
3150         STRLEN len;
3151         char *t;
3152
3153         if (tsv) {
3154             sv_2mortal(tsv);
3155             t = SvPVX(tsv);
3156             len = SvCUR(tsv);
3157         }
3158         else {
3159             t = tmpbuf;
3160             len = strlen(tmpbuf);
3161         }
3162 #ifdef FIXNEGATIVEZERO
3163         if (len == 2 && t[0] == '-' && t[1] == '0') {
3164             t = "0";
3165             len = 1;
3166         }
3167 #endif
3168         (void)SvUPGRADE(sv, SVt_PV);
3169         *lp = len;
3170         s = SvGROW(sv, len + 1);
3171         SvCUR_set(sv, len);
3172         (void)strcpy(s, t);
3173         SvPOKp_on(sv);
3174         return s;
3175     }
3176 }
3177
3178 /*
3179 =for apidoc sv_copypv
3180
3181 Copies a stringified representation of the source SV into the
3182 destination SV.  Automatically performs any necessary mg_get and
3183 coercion of numeric values into strings.  Guaranteed to preserve
3184 UTF-8 flag even from overloaded objects.  Similar in nature to
3185 sv_2pv[_flags] but operates directly on an SV instead of just the
3186 string.  Mostly uses sv_2pv_flags to do its work, except when that
3187 would lose the UTF-8'ness of the PV.
3188
3189 =cut
3190 */
3191
3192 void
3193 Perl_sv_copypv(pTHX_ SV *dsv, register SV *ssv)
3194 {
3195     SV *tmpsv = sv_newmortal();
3196
3197     if ( SvTHINKFIRST(ssv) && SvROK(ssv) && SvAMAGIC(ssv) ) {
3198         tmpsv = AMG_CALLun(ssv,string);
3199         if (SvTYPE(tmpsv) != SVt_RV || (SvRV(tmpsv) != SvRV(ssv))) {
3200             SvSetSV(dsv,tmpsv);
3201             return;
3202         }
3203     }
3204     {
3205         STRLEN len;
3206         char *s;
3207         s = SvPV(ssv,len);
3208         sv_setpvn(tmpsv,s,len);
3209         if (SvUTF8(ssv))
3210             SvUTF8_on(tmpsv);
3211         else
3212             SvUTF8_off(tmpsv);
3213         SvSetSV(dsv,tmpsv);
3214     }
3215 }
3216
3217 /*
3218 =for apidoc sv_2pvbyte_nolen
3219
3220 Return a pointer to the byte-encoded representation of the SV.
3221 May cause the SV to be downgraded from UTF8 as a side-effect.
3222
3223 Usually accessed via the C<SvPVbyte_nolen> macro.
3224
3225 =cut
3226 */
3227
3228 char *
3229 Perl_sv_2pvbyte_nolen(pTHX_ register SV *sv)
3230 {
3231     STRLEN n_a;
3232     return sv_2pvbyte(sv, &n_a);
3233 }
3234
3235 /*
3236 =for apidoc sv_2pvbyte
3237
3238 Return a pointer to the byte-encoded representation of the SV, and set *lp
3239 to its length.  May cause the SV to be downgraded from UTF8 as a
3240 side-effect.
3241
3242 Usually accessed via the C<SvPVbyte> macro.
3243
3244 =cut
3245 */
3246
3247 char *
3248 Perl_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
3249 {
3250     sv_utf8_downgrade(sv,0);
3251     return SvPV(sv,*lp);
3252 }
3253
3254 /*
3255 =for apidoc sv_2pvutf8_nolen
3256
3257 Return a pointer to the UTF8-encoded representation of the SV.
3258 May cause the SV to be upgraded to UTF8 as a side-effect.
3259
3260 Usually accessed via the C<SvPVutf8_nolen> macro.
3261
3262 =cut
3263 */
3264
3265 char *
3266 Perl_sv_2pvutf8_nolen(pTHX_ register SV *sv)
3267 {
3268     STRLEN n_a;
3269     return sv_2pvutf8(sv, &n_a);
3270 }
3271
3272 /*
3273 =for apidoc sv_2pvutf8
3274
3275 Return a pointer to the UTF8-encoded representation of the SV, and set *lp
3276 to its length.  May cause the SV to be upgraded to UTF8 as a side-effect.
3277
3278 Usually accessed via the C<SvPVutf8> macro.
3279
3280 =cut
3281 */
3282
3283 char *
3284 Perl_sv_2pvutf8(pTHX_ register SV *sv, STRLEN *lp)
3285 {
3286     sv_utf8_upgrade(sv);
3287     return SvPV(sv,*lp);
3288 }
3289
3290 /*
3291 =for apidoc sv_2bool
3292
3293 This function is only called on magical items, and is only used by
3294 sv_true() or its macro equivalent.
3295
3296 =cut
3297 */
3298
3299 bool
3300 Perl_sv_2bool(pTHX_ register SV *sv)
3301 {
3302     if (SvGMAGICAL(sv))
3303         mg_get(sv);
3304
3305     if (!SvOK(sv))
3306         return 0;
3307     if (SvROK(sv)) {
3308         SV* tmpsv;
3309         if (SvAMAGIC(sv) && (tmpsv=AMG_CALLun(sv,bool_)) &&
3310                 (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
3311             return (bool)SvTRUE(tmpsv);
3312       return SvRV(sv) != 0;
3313     }
3314     if (SvPOKp(sv)) {
3315         register XPV* Xpvtmp;
3316         if ((Xpvtmp = (XPV*)SvANY(sv)) &&
3317                 (*Xpvtmp->xpv_pv > '0' ||
3318                 Xpvtmp->xpv_cur > 1 ||
3319                 (Xpvtmp->xpv_cur && *Xpvtmp->xpv_pv != '0')))
3320             return 1;
3321         else
3322             return 0;
3323     }
3324     else {
3325         if (SvIOKp(sv))
3326             return SvIVX(sv) != 0;
3327         else {
3328             if (SvNOKp(sv))
3329                 return SvNVX(sv) != 0.0;
3330             else
3331                 return FALSE;
3332         }
3333     }
3334 }
3335
3336 /*
3337 =for apidoc sv_utf8_upgrade
3338
3339 Convert the PV of an SV to its UTF8-encoded form.
3340 Forces the SV to string form if it is not already.
3341 Always sets the SvUTF8 flag to avoid future validity checks even
3342 if all the bytes have hibit clear.
3343
3344 This is not as a general purpose byte encoding to Unicode interface:
3345 use the Encode extension for that.
3346
3347 =for apidoc sv_utf8_upgrade_flags
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. If C<flags> has C<SV_GMAGIC> bit set,
3353 will C<mg_get> on C<sv> if appropriate, else not. C<sv_utf8_upgrade> and
3354 C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
3355
3356 This is not as a general purpose byte encoding to Unicode interface:
3357 use the Encode extension for that.
3358
3359 =cut
3360 */
3361
3362 STRLEN
3363 Perl_sv_utf8_upgrade_flags(pTHX_ register SV *sv, I32 flags)
3364 {
3365     U8 *s, *t, *e;
3366     int  hibit = 0;
3367
3368     if (!sv)
3369         return 0;
3370
3371     if (!SvPOK(sv)) {
3372         STRLEN len = 0;
3373         (void) sv_2pv_flags(sv,&len, flags);
3374         if (!SvPOK(sv))
3375              return len;
3376     }
3377
3378     if (SvUTF8(sv))
3379         return SvCUR(sv);
3380
3381     if (SvREADONLY(sv) && SvFAKE(sv)) {
3382         sv_force_normal(sv);
3383     }
3384
3385     if (PL_encoding)
3386         sv_recode_to_utf8(sv, PL_encoding);
3387     else { /* Assume Latin-1/EBCDIC */
3388          /* This function could be much more efficient if we
3389           * had a FLAG in SVs to signal if there are any hibit
3390           * chars in the PV.  Given that there isn't such a flag
3391           * make the loop as fast as possible. */
3392          s = (U8 *) SvPVX(sv);
3393          e = (U8 *) SvEND(sv);
3394          t = s;
3395          while (t < e) {
3396               U8 ch = *t++;
3397               if ((hibit = !NATIVE_IS_INVARIANT(ch)))
3398                    break;
3399          }
3400          if (hibit) {
3401               STRLEN len;
3402         
3403               len = SvCUR(sv) + 1; /* Plus the \0 */
3404               SvPVX(sv) = (char*)bytes_to_utf8((U8*)s, &len);
3405               SvCUR(sv) = len - 1;
3406               if (SvLEN(sv) != 0)
3407                    Safefree(s); /* No longer using what was there before. */
3408               SvLEN(sv) = len; /* No longer know the real size. */
3409          }
3410          /* Mark as UTF-8 even if no hibit - saves scanning loop */
3411          SvUTF8_on(sv);
3412     }
3413     return SvCUR(sv);
3414 }
3415
3416 /*
3417 =for apidoc sv_utf8_downgrade
3418
3419 Attempt to convert the PV of an SV from UTF8-encoded to byte encoding.
3420 This may not be possible if the PV contains non-byte encoding characters;
3421 if this is the case, either returns false or, if C<fail_ok> is not
3422 true, croaks.
3423
3424 This is not as a general purpose Unicode to byte encoding interface:
3425 use the Encode extension for that.
3426
3427 =cut
3428 */
3429
3430 bool
3431 Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
3432 {
3433     if (SvPOK(sv) && SvUTF8(sv)) {
3434         if (SvCUR(sv)) {
3435             U8 *s;
3436             STRLEN len;
3437
3438             if (SvREADONLY(sv) && SvFAKE(sv))
3439                 sv_force_normal(sv);
3440             s = (U8 *) SvPV(sv, len);
3441             if (!utf8_to_bytes(s, &len)) {
3442                 if (fail_ok)
3443                     return FALSE;
3444                 else {
3445                     if (PL_op)
3446                         Perl_croak(aTHX_ "Wide character in %s",
3447                                    OP_DESC(PL_op));
3448                     else
3449                         Perl_croak(aTHX_ "Wide character");
3450                 }
3451             }
3452             SvCUR(sv) = len;
3453         }
3454     }
3455     SvUTF8_off(sv);
3456     return TRUE;
3457 }
3458
3459 /*
3460 =for apidoc sv_utf8_encode
3461
3462 Convert the PV of an SV to UTF8-encoded, but then turn off the C<SvUTF8>
3463 flag so that it looks like octets again. Used as a building block
3464 for encode_utf8 in Encode.xs
3465
3466 =cut
3467 */
3468
3469 void
3470 Perl_sv_utf8_encode(pTHX_ register SV *sv)
3471 {
3472     (void) sv_utf8_upgrade(sv);
3473     SvUTF8_off(sv);
3474 }
3475
3476 /*
3477 =for apidoc sv_utf8_decode
3478
3479 Convert the octets in the PV from UTF-8 to chars. Scan for validity and then
3480 turn off SvUTF8 if needed so that we see characters. Used as a building block
3481 for decode_utf8 in Encode.xs
3482
3483 =cut
3484 */
3485
3486 bool
3487 Perl_sv_utf8_decode(pTHX_ register SV *sv)
3488 {
3489     if (SvPOK(sv)) {
3490         U8 *c;
3491         U8 *e;
3492
3493         /* The octets may have got themselves encoded - get them back as
3494          * bytes
3495          */
3496         if (!sv_utf8_downgrade(sv, TRUE))
3497             return FALSE;
3498
3499         /* it is actually just a matter of turning the utf8 flag on, but
3500          * we want to make sure everything inside is valid utf8 first.
3501          */
3502         c = (U8 *) SvPVX(sv);
3503         if (!is_utf8_string(c, SvCUR(sv)+1))
3504             return FALSE;
3505         e = (U8 *) SvEND(sv);
3506         while (c < e) {
3507             U8 ch = *c++;
3508             if (!UTF8_IS_INVARIANT(ch)) {
3509                 SvUTF8_on(sv);
3510                 break;
3511             }
3512         }
3513     }
3514     return TRUE;
3515 }
3516
3517 /*
3518 =for apidoc sv_setsv
3519
3520 Copies the contents of the source SV C<ssv> into the destination SV
3521 C<dsv>.  The source SV may be destroyed if it is mortal, so don't use this
3522 function if the source SV needs to be reused. Does not handle 'set' magic.
3523 Loosely speaking, it performs a copy-by-value, obliterating any previous
3524 content of the destination.
3525
3526 You probably want to use one of the assortment of wrappers, such as
3527 C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3528 C<SvSetMagicSV_nosteal>.
3529
3530 =for apidoc sv_setsv_flags
3531
3532 Copies the contents of the source SV C<ssv> into the destination SV
3533 C<dsv>.  The source SV may be destroyed if it is mortal, so don't use this
3534 function if the source SV needs to be reused. Does not handle 'set' magic.
3535 Loosely speaking, it performs a copy-by-value, obliterating any previous
3536 content of the destination.
3537 If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
3538 C<ssv> if appropriate, else not. C<sv_setsv> and C<sv_setsv_nomg> are
3539 implemented in terms of this function.
3540
3541 You probably want to use one of the assortment of wrappers, such as
3542 C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3543 C<SvSetMagicSV_nosteal>.
3544
3545 This is the primary function for copying scalars, and most other
3546 copy-ish functions and macros use this underneath.
3547
3548 =cut
3549 */
3550
3551 void
3552 Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags)
3553 {
3554     register U32 sflags;
3555     register int dtype;
3556     register int stype;
3557
3558     if (sstr == dstr)
3559         return;
3560     SV_CHECK_THINKFIRST(dstr);
3561     if (!sstr)
3562         sstr = &PL_sv_undef;
3563     stype = SvTYPE(sstr);
3564     dtype = SvTYPE(dstr);
3565
3566     SvAMAGIC_off(dstr);
3567
3568     /* There's a lot of redundancy below but we're going for speed here */
3569
3570     switch (stype) {
3571     case SVt_NULL:
3572       undef_sstr:
3573         if (dtype != SVt_PVGV) {
3574             (void)SvOK_off(dstr);
3575             return;
3576         }
3577         break;
3578     case SVt_IV:
3579         if (SvIOK(sstr)) {
3580             switch (dtype) {
3581             case SVt_NULL:
3582                 sv_upgrade(dstr, SVt_IV);
3583                 break;
3584             case SVt_NV:
3585                 sv_upgrade(dstr, SVt_PVNV);
3586                 break;
3587             case SVt_RV:
3588             case SVt_PV:
3589                 sv_upgrade(dstr, SVt_PVIV);
3590                 break;
3591             }
3592             (void)SvIOK_only(dstr);
3593             SvIVX(dstr) = SvIVX(sstr);
3594             if (SvIsUV(sstr))
3595                 SvIsUV_on(dstr);
3596             if (SvTAINTED(sstr))
3597                 SvTAINT(dstr);
3598             return;
3599         }
3600         goto undef_sstr;
3601
3602     case SVt_NV:
3603         if (SvNOK(sstr)) {
3604             switch (dtype) {
3605             case SVt_NULL:
3606             case SVt_IV:
3607                 sv_upgrade(dstr, SVt_NV);
3608                 break;
3609             case SVt_RV:
3610             case SVt_PV:
3611             case SVt_PVIV:
3612                 sv_upgrade(dstr, SVt_PVNV);
3613                 break;
3614             }
3615             SvNVX(dstr) = SvNVX(sstr);
3616             (void)SvNOK_only(dstr);
3617             if (SvTAINTED(sstr))
3618                 SvTAINT(dstr);
3619             return;
3620         }
3621         goto undef_sstr;
3622
3623     case SVt_RV:
3624         if (dtype < SVt_RV)
3625             sv_upgrade(dstr, SVt_RV);
3626         else if (dtype == SVt_PVGV &&
3627                  SvTYPE(SvRV(sstr)) == SVt_PVGV) {
3628             sstr = SvRV(sstr);
3629             if (sstr == dstr) {
3630                 if (GvIMPORTED(dstr) != GVf_IMPORTED
3631                     && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3632                 {
3633                     GvIMPORTED_on(dstr);
3634                 }
3635                 GvMULTI_on(dstr);
3636                 return;
3637             }
3638             goto glob_assign;
3639         }
3640         break;
3641     case SVt_PV:
3642     case SVt_PVFM:
3643         if (dtype < SVt_PV)
3644             sv_upgrade(dstr, SVt_PV);
3645         break;
3646     case SVt_PVIV:
3647         if (dtype < SVt_PVIV)
3648             sv_upgrade(dstr, SVt_PVIV);
3649         break;
3650     case SVt_PVNV:
3651         if (dtype < SVt_PVNV)
3652             sv_upgrade(dstr, SVt_PVNV);
3653         break;
3654     case SVt_PVAV:
3655     case SVt_PVHV:
3656     case SVt_PVCV:
3657     case SVt_PVIO:
3658         if (PL_op)
3659             Perl_croak(aTHX_ "Bizarre copy of %s in %s", sv_reftype(sstr, 0),
3660                 OP_NAME(PL_op));
3661         else
3662             Perl_croak(aTHX_ "Bizarre copy of %s", sv_reftype(sstr, 0));
3663         break;
3664
3665     case SVt_PVGV:
3666         if (dtype <= SVt_PVGV) {
3667   glob_assign:
3668             if (dtype != SVt_PVGV) {
3669                 char *name = GvNAME(sstr);
3670                 STRLEN len = GvNAMELEN(sstr);
3671                 sv_upgrade(dstr, SVt_PVGV);
3672                 sv_magic(dstr, dstr, PERL_MAGIC_glob, Nullch, 0);
3673                 GvSTASH(dstr) = (HV*)SvREFCNT_inc(GvSTASH(sstr));
3674                 GvNAME(dstr) = savepvn(name, len);
3675                 GvNAMELEN(dstr) = len;
3676                 SvFAKE_on(dstr);        /* can coerce to non-glob */
3677             }
3678             /* ahem, death to those who redefine active sort subs */
3679             else if (PL_curstackinfo->si_type == PERLSI_SORT
3680                      && GvCV(dstr) && PL_sortcop == CvSTART(GvCV(dstr)))
3681                 Perl_croak(aTHX_ "Can't redefine active sort subroutine %s",
3682                       GvNAME(dstr));
3683
3684 #ifdef GV_UNIQUE_CHECK
3685                 if (GvUNIQUE((GV*)dstr)) {
3686                     Perl_croak(aTHX_ PL_no_modify);
3687                 }
3688 #endif
3689
3690             (void)SvOK_off(dstr);
3691             GvINTRO_off(dstr);          /* one-shot flag */
3692             gp_free((GV*)dstr);
3693             GvGP(dstr) = gp_ref(GvGP(sstr));
3694             if (SvTAINTED(sstr))
3695                 SvTAINT(dstr);
3696             if (GvIMPORTED(dstr) != GVf_IMPORTED
3697                 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3698             {
3699                 GvIMPORTED_on(dstr);
3700             }
3701             GvMULTI_on(dstr);
3702             return;
3703         }
3704         /* FALL THROUGH */
3705
3706     default:
3707         if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
3708             mg_get(sstr);
3709             if ((int)SvTYPE(sstr) != stype) {
3710                 stype = SvTYPE(sstr);
3711                 if (stype == SVt_PVGV && dtype <= SVt_PVGV)
3712                     goto glob_assign;
3713             }
3714         }
3715         if (stype == SVt_PVLV)
3716             (void)SvUPGRADE(dstr, SVt_PVNV);
3717         else
3718             (void)SvUPGRADE(dstr, (U32)stype);
3719     }
3720
3721     sflags = SvFLAGS(sstr);
3722
3723     if (sflags & SVf_ROK) {
3724         if (dtype >= SVt_PV) {
3725             if (dtype == SVt_PVGV) {
3726                 SV *sref = SvREFCNT_inc(SvRV(sstr));
3727                 SV *dref = 0;
3728                 int intro = GvINTRO(dstr);
3729
3730 #ifdef GV_UNIQUE_CHECK
3731                 if (GvUNIQUE((GV*)dstr)) {
3732                     Perl_croak(aTHX_ PL_no_modify);
3733                 }
3734 #endif
3735
3736                 if (intro) {
3737                     GvINTRO_off(dstr);  /* one-shot flag */
3738                     GvLINE(dstr) = CopLINE(PL_curcop);
3739                     GvEGV(dstr) = (GV*)dstr;
3740                 }
3741                 GvMULTI_on(dstr);
3742                 switch (SvTYPE(sref)) {
3743                 case SVt_PVAV:
3744                     if (intro)
3745                         SAVESPTR(GvAV(dstr));
3746                     else
3747                         dref = (SV*)GvAV(dstr);
3748                     GvAV(dstr) = (AV*)sref;
3749                     if (!GvIMPORTED_AV(dstr)
3750                         && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3751                     {
3752                         GvIMPORTED_AV_on(dstr);
3753                     }
3754                     break;
3755                 case SVt_PVHV:
3756                     if (intro)
3757                         SAVESPTR(GvHV(dstr));
3758                     else
3759                         dref = (SV*)GvHV(dstr);
3760                     GvHV(dstr) = (HV*)sref;
3761                     if (!GvIMPORTED_HV(dstr)
3762                         && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3763                     {
3764                         GvIMPORTED_HV_on(dstr);
3765                     }
3766                     break;
3767                 case SVt_PVCV:
3768                     if (intro) {
3769                         if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
3770                             SvREFCNT_dec(GvCV(dstr));
3771                             GvCV(dstr) = Nullcv;
3772                             GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3773                             PL_sub_generation++;
3774                         }
3775                         SAVESPTR(GvCV(dstr));
3776                     }
3777                     else
3778                         dref = (SV*)GvCV(dstr);
3779                     if (GvCV(dstr) != (CV*)sref) {
3780                         CV* cv = GvCV(dstr);
3781                         if (cv) {
3782                             if (!GvCVGEN((GV*)dstr) &&
3783                                 (CvROOT(cv) || CvXSUB(cv)))
3784                             {
3785                                 /* ahem, death to those who redefine
3786                                  * active sort subs */
3787                                 if (PL_curstackinfo->si_type == PERLSI_SORT &&
3788                                       PL_sortcop == CvSTART(cv))
3789                                     Perl_croak(aTHX_
3790                                     "Can't redefine active sort subroutine %s",
3791                                           GvENAME((GV*)dstr));
3792                                 /* Redefining a sub - warning is mandatory if
3793                                    it was a const and its value changed. */
3794                                 if (ckWARN(WARN_REDEFINE)
3795                                     || (CvCONST(cv)
3796                                         && (!CvCONST((CV*)sref)
3797                                             || sv_cmp(cv_const_sv(cv),
3798                                                       cv_const_sv((CV*)sref)))))
3799                                 {
3800                                     Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
3801                                         CvCONST(cv)
3802                                         ? "Constant subroutine %s::%s redefined"
3803                                         : "Subroutine %s::%s redefined",
3804                                         HvNAME(GvSTASH((GV*)dstr)),
3805                                         GvENAME((GV*)dstr));
3806                                 }
3807                             }
3808                             if (!intro)
3809                                 cv_ckproto(cv, (GV*)dstr,
3810                                         SvPOK(sref) ? SvPVX(sref) : Nullch);
3811                         }
3812                         GvCV(dstr) = (CV*)sref;
3813                         GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3814                         GvASSUMECV_on(dstr);
3815                         PL_sub_generation++;
3816                     }
3817                     if (!GvIMPORTED_CV(dstr)
3818                         && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3819                     {
3820                         GvIMPORTED_CV_on(dstr);
3821                     }
3822                     break;
3823                 case SVt_PVIO:
3824                     if (intro)
3825                         SAVESPTR(GvIOp(dstr));
3826                     else
3827                         dref = (SV*)GvIOp(dstr);
3828                     GvIOp(dstr) = (IO*)sref;
3829                     break;
3830                 case SVt_PVFM:
3831                     if (intro)
3832                         SAVESPTR(GvFORM(dstr));
3833                     else
3834                         dref = (SV*)GvFORM(dstr);
3835                     GvFORM(dstr) = (CV*)sref;
3836                     break;
3837                 default:
3838                     if (intro)
3839                         SAVESPTR(GvSV(dstr));
3840                     else
3841                         dref = (SV*)GvSV(dstr);
3842                     GvSV(dstr) = sref;
3843                     if (!GvIMPORTED_SV(dstr)
3844                         && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3845                     {
3846                         GvIMPORTED_SV_on(dstr);
3847                     }
3848                     break;
3849                 }
3850                 if (dref)
3851                     SvREFCNT_dec(dref);
3852                 if (intro)
3853                     SAVEFREESV(sref);
3854                 if (SvTAINTED(sstr))
3855                     SvTAINT(dstr);
3856                 return;
3857             }
3858             if (SvPVX(dstr)) {
3859                 (void)SvOOK_off(dstr);          /* backoff */
3860                 if (SvLEN(dstr))
3861                     Safefree(SvPVX(dstr));
3862                 SvLEN(dstr)=SvCUR(dstr)=0;
3863             }
3864         }
3865         (void)SvOK_off(dstr);
3866         SvRV(dstr) = SvREFCNT_inc(SvRV(sstr));
3867         SvROK_on(dstr);
3868         if (sflags & SVp_NOK) {
3869             SvNOKp_on(dstr);
3870             /* Only set the public OK flag if the source has public OK.  */
3871             if (sflags & SVf_NOK)
3872                 SvFLAGS(dstr) |= SVf_NOK;
3873             SvNVX(dstr) = SvNVX(sstr);
3874         }
3875         if (sflags & SVp_IOK) {
3876             (void)SvIOKp_on(dstr);
3877             if (sflags & SVf_IOK)
3878                 SvFLAGS(dstr) |= SVf_IOK;
3879             if (sflags & SVf_IVisUV)
3880                 SvIsUV_on(dstr);
3881             SvIVX(dstr) = SvIVX(sstr);
3882         }
3883         if (SvAMAGIC(sstr)) {
3884             SvAMAGIC_on(dstr);
3885         }
3886     }
3887     else if (sflags & SVp_POK) {
3888
3889         /*
3890          * Check to see if we can just swipe the string.  If so, it's a
3891          * possible small lose on short strings, but a big win on long ones.
3892          * It might even be a win on short strings if SvPVX(dstr)
3893          * has to be allocated and SvPVX(sstr) has to be freed.
3894          */
3895
3896         if (SvTEMP(sstr) &&             /* slated for free anyway? */
3897             SvREFCNT(sstr) == 1 &&      /* and no other references to it? */
3898             !(sflags & SVf_OOK) &&      /* and not involved in OOK hack? */
3899             SvLEN(sstr)         &&      /* and really is a string */
3900                                 /* and won't be needed again, potentially */
3901             !(PL_op && PL_op->op_type == OP_AASSIGN))
3902         {
3903             if (SvPVX(dstr)) {          /* we know that dtype >= SVt_PV */
3904                 if (SvOOK(dstr)) {
3905                     SvFLAGS(dstr) &= ~SVf_OOK;
3906                     Safefree(SvPVX(dstr) - SvIVX(dstr));
3907                 }
3908                 else if (SvLEN(dstr))
3909                     Safefree(SvPVX(dstr));
3910             }
3911             (void)SvPOK_only(dstr);
3912             SvPV_set(dstr, SvPVX(sstr));
3913             SvLEN_set(dstr, SvLEN(sstr));
3914             SvCUR_set(dstr, SvCUR(sstr));
3915
3916             SvTEMP_off(dstr);
3917             (void)SvOK_off(sstr);       /* NOTE: nukes most SvFLAGS on sstr */
3918             SvPV_set(sstr, Nullch);
3919             SvLEN_set(sstr, 0);
3920             SvCUR_set(sstr, 0);
3921             SvTEMP_off(sstr);
3922         }
3923         else {                          /* have to copy actual string */
3924             STRLEN len = SvCUR(sstr);
3925             SvGROW(dstr, len + 1);      /* inlined from sv_setpvn */
3926             Move(SvPVX(sstr),SvPVX(dstr),len,char);
3927             SvCUR_set(dstr, len);
3928             *SvEND(dstr) = '\0';
3929             (void)SvPOK_only(dstr);
3930         }
3931         if (sflags & SVf_UTF8)
3932             SvUTF8_on(dstr);
3933         /*SUPPRESS 560*/
3934         if (sflags & SVp_NOK) {
3935             SvNOKp_on(dstr);
3936             if (sflags & SVf_NOK)
3937                 SvFLAGS(dstr) |= SVf_NOK;
3938             SvNVX(dstr) = SvNVX(sstr);
3939         }
3940         if (sflags & SVp_IOK) {
3941             (void)SvIOKp_on(dstr);
3942             if (sflags & SVf_IOK)
3943                 SvFLAGS(dstr) |= SVf_IOK;
3944             if (sflags & SVf_IVisUV)
3945                 SvIsUV_on(dstr);
3946             SvIVX(dstr) = SvIVX(sstr);
3947         }
3948     }
3949     else if (sflags & SVp_IOK) {
3950         if (sflags & SVf_IOK)
3951             (void)SvIOK_only(dstr);
3952         else {
3953             (void)SvOK_off(dstr);
3954             (void)SvIOKp_on(dstr);
3955         }
3956         /* XXXX Do we want to set IsUV for IV(ROK)?  Be extra safe... */
3957         if (sflags & SVf_IVisUV)
3958             SvIsUV_on(dstr);
3959         SvIVX(dstr) = SvIVX(sstr);
3960         if (sflags & SVp_NOK) {
3961             if (sflags & SVf_NOK)
3962                 (void)SvNOK_on(dstr);
3963             else
3964                 (void)SvNOKp_on(dstr);
3965             SvNVX(dstr) = SvNVX(sstr);
3966         }
3967     }
3968     else if (sflags & SVp_NOK) {
3969         if (sflags & SVf_NOK)
3970             (void)SvNOK_only(dstr);
3971         else {
3972             (void)SvOK_off(dstr);
3973             SvNOKp_on(dstr);
3974         }
3975         SvNVX(dstr) = SvNVX(sstr);
3976     }
3977     else {
3978         if (dtype == SVt_PVGV) {
3979             if (ckWARN(WARN_MISC))
3980                 Perl_warner(aTHX_ packWARN(WARN_MISC), "Undefined value assigned to typeglob");
3981         }
3982         else
3983             (void)SvOK_off(dstr);
3984     }
3985     if (SvTAINTED(sstr))
3986         SvTAINT(dstr);
3987 }
3988
3989 /*
3990 =for apidoc sv_setsv_mg
3991
3992 Like C<sv_setsv>, but also handles 'set' magic.
3993
3994 =cut
3995 */
3996
3997 void
3998 Perl_sv_setsv_mg(pTHX_ SV *dstr, register SV *sstr)
3999 {
4000     sv_setsv(dstr,sstr);
4001     SvSETMAGIC(dstr);
4002 }
4003
4004 /*
4005 =for apidoc sv_setpvn
4006
4007 Copies a string into an SV.  The C<len> parameter indicates the number of
4008 bytes to be copied.  Does not handle 'set' magic.  See C<sv_setpvn_mg>.
4009
4010 =cut
4011 */
4012
4013 void
4014 Perl_sv_setpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
4015 {
4016     register char *dptr;
4017
4018     SV_CHECK_THINKFIRST(sv);
4019     if (!ptr) {
4020         (void)SvOK_off(sv);
4021         return;
4022     }
4023     else {
4024         /* len is STRLEN which is unsigned, need to copy to signed */
4025         IV iv = len;
4026         if (iv < 0)
4027             Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen");
4028     }
4029     (void)SvUPGRADE(sv, SVt_PV);
4030
4031     SvGROW(sv, len + 1);
4032     dptr = SvPVX(sv);
4033     Move(ptr,dptr,len,char);
4034     dptr[len] = '\0';
4035     SvCUR_set(sv, len);
4036     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4037     SvTAINT(sv);
4038 }
4039
4040 /*
4041 =for apidoc sv_setpvn_mg
4042
4043 Like C<sv_setpvn>, but also handles 'set' magic.
4044
4045 =cut
4046 */
4047
4048 void
4049 Perl_sv_setpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
4050 {
4051     sv_setpvn(sv,ptr,len);
4052     SvSETMAGIC(sv);
4053 }
4054
4055 /*
4056 =for apidoc sv_setpv
4057
4058 Copies a string into an SV.  The string must be null-terminated.  Does not
4059 handle 'set' magic.  See C<sv_setpv_mg>.
4060
4061 =cut
4062 */
4063
4064 void
4065 Perl_sv_setpv(pTHX_ register SV *sv, register const char *ptr)
4066 {
4067     register STRLEN len;
4068
4069     SV_CHECK_THINKFIRST(sv);
4070     if (!ptr) {
4071         (void)SvOK_off(sv);
4072         return;
4073     }
4074     len = strlen(ptr);
4075     (void)SvUPGRADE(sv, SVt_PV);
4076
4077     SvGROW(sv, len + 1);
4078     Move(ptr,SvPVX(sv),len+1,char);
4079     SvCUR_set(sv, len);
4080     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4081     SvTAINT(sv);
4082 }
4083
4084 /*
4085 =for apidoc sv_setpv_mg
4086
4087 Like C<sv_setpv>, but also handles 'set' magic.
4088
4089 =cut
4090 */
4091
4092 void
4093 Perl_sv_setpv_mg(pTHX_ register SV *sv, register const char *ptr)
4094 {
4095     sv_setpv(sv,ptr);
4096     SvSETMAGIC(sv);
4097 }
4098
4099 /*
4100 =for apidoc sv_usepvn
4101
4102 Tells an SV to use C<ptr> to find its string value.  Normally the string is
4103 stored inside the SV but sv_usepvn allows the SV to use an outside string.
4104 The C<ptr> should point to memory that was allocated by C<malloc>.  The
4105 string length, C<len>, must be supplied.  This function will realloc the
4106 memory pointed to by C<ptr>, so that pointer should not be freed or used by
4107 the programmer after giving it to sv_usepvn.  Does not handle 'set' magic.
4108 See C<sv_usepvn_mg>.
4109
4110 =cut
4111 */
4112
4113 void
4114 Perl_sv_usepvn(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
4115 {
4116     SV_CHECK_THINKFIRST(sv);
4117     (void)SvUPGRADE(sv, SVt_PV);
4118     if (!ptr) {
4119         (void)SvOK_off(sv);
4120         return;
4121     }
4122     (void)SvOOK_off(sv);
4123     if (SvPVX(sv) && SvLEN(sv))
4124         Safefree(SvPVX(sv));
4125     Renew(ptr, len+1, char);
4126     SvPVX(sv) = ptr;
4127     SvCUR_set(sv, len);
4128     SvLEN_set(sv, len+1);
4129     *SvEND(sv) = '\0';
4130     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4131     SvTAINT(sv);
4132 }
4133
4134 /*
4135 =for apidoc sv_usepvn_mg
4136
4137 Like C<sv_usepvn>, but also handles 'set' magic.
4138
4139 =cut
4140 */
4141
4142 void
4143 Perl_sv_usepvn_mg(pTHX_ register SV *sv, register char *ptr, register STRLEN len)
4144 {
4145     sv_usepvn(sv,ptr,len);
4146     SvSETMAGIC(sv);
4147 }
4148
4149 /*
4150 =for apidoc sv_force_normal_flags
4151
4152 Undo various types of fakery on an SV: if the PV is a shared string, make
4153 a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
4154 an xpvmg. The C<flags> parameter gets passed to  C<sv_unref_flags()>
4155 when unrefing. C<sv_force_normal> calls this function with flags set to 0.
4156
4157 =cut
4158 */
4159
4160 void
4161 Perl_sv_force_normal_flags(pTHX_ register SV *sv, U32 flags)
4162 {
4163     if (SvREADONLY(sv)) {
4164         if (SvFAKE(sv)) {
4165             char *pvx = SvPVX(sv);
4166             STRLEN len = SvCUR(sv);
4167             U32 hash   = SvUVX(sv);
4168             SvGROW(sv, len + 1);
4169             Move(pvx,SvPVX(sv),len,char);
4170             *SvEND(sv) = '\0';
4171             SvFAKE_off(sv);
4172             SvREADONLY_off(sv);
4173             unsharepvn(pvx, SvUTF8(sv) ? -(I32)len : len, hash);
4174         }
4175         else if (PL_curcop != &PL_compiling)
4176             Perl_croak(aTHX_ PL_no_modify);
4177     }
4178     if (SvROK(sv))
4179         sv_unref_flags(sv, flags);
4180     else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
4181         sv_unglob(sv);
4182 }
4183
4184 /*
4185 =for apidoc sv_force_normal
4186
4187 Undo various types of fakery on an SV: if the PV is a shared string, make
4188 a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
4189 an xpvmg. See also C<sv_force_normal_flags>.
4190
4191 =cut
4192 */
4193
4194 void
4195 Perl_sv_force_normal(pTHX_ register SV *sv)
4196 {
4197     sv_force_normal_flags(sv, 0);
4198 }
4199
4200 /*
4201 =for apidoc sv_chop
4202
4203 Efficient removal of characters from the beginning of the string buffer.
4204 SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
4205 the string buffer.  The C<ptr> becomes the first character of the adjusted
4206 string. Uses the "OOK hack".
4207
4208 =cut
4209 */
4210
4211 void
4212 Perl_sv_chop(pTHX_ register SV *sv, register char *ptr)
4213 {
4214     register STRLEN delta;
4215
4216     if (!ptr || !SvPOKp(sv))
4217         return;
4218     SV_CHECK_THINKFIRST(sv);
4219     if (SvTYPE(sv) < SVt_PVIV)
4220         sv_upgrade(sv,SVt_PVIV);
4221
4222     if (!SvOOK(sv)) {
4223         if (!SvLEN(sv)) { /* make copy of shared string */
4224             char *pvx = SvPVX(sv);
4225             STRLEN len = SvCUR(sv);
4226             SvGROW(sv, len + 1);
4227             Move(pvx,SvPVX(sv),len,char);
4228             *SvEND(sv) = '\0';
4229         }
4230         SvIVX(sv) = 0;
4231         SvFLAGS(sv) |= SVf_OOK;
4232     }
4233     SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVp_IOK|SVp_NOK|SVf_IVisUV);
4234     delta = ptr - SvPVX(sv);
4235     SvLEN(sv) -= delta;
4236     SvCUR(sv) -= delta;
4237     SvPVX(sv) += delta;
4238     SvIVX(sv) += delta;
4239 }
4240
4241 /*
4242 =for apidoc sv_catpvn
4243
4244 Concatenates the string onto the end of the string which is in the SV.  The
4245 C<len> indicates number of bytes to copy.  If the SV has the UTF8
4246 status set, then the bytes appended should be valid UTF8.
4247 Handles 'get' magic, but not 'set' magic.  See C<sv_catpvn_mg>.
4248
4249 =for apidoc sv_catpvn_flags
4250
4251 Concatenates the string onto the end of the string which is in the SV.  The
4252 C<len> indicates number of bytes to copy.  If the SV has the UTF8
4253 status set, then the bytes appended should be valid UTF8.
4254 If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
4255 appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
4256 in terms of this function.
4257
4258 =cut
4259 */
4260
4261 void
4262 Perl_sv_catpvn_flags(pTHX_ register SV *dsv, register const char *sstr, register STRLEN slen, I32 flags)
4263 {
4264     STRLEN dlen;
4265     char *dstr;
4266
4267     dstr = SvPV_force_flags(dsv, dlen, flags);
4268     SvGROW(dsv, dlen + slen + 1);
4269     if (sstr == dstr)
4270         sstr = SvPVX(dsv);
4271     Move(sstr, SvPVX(dsv) + dlen, slen, char);
4272     SvCUR(dsv) += slen;
4273     *SvEND(dsv) = '\0';
4274     (void)SvPOK_only_UTF8(dsv);         /* validate pointer */
4275     SvTAINT(dsv);
4276 }
4277
4278 /*
4279 =for apidoc sv_catpvn_mg
4280
4281 Like C<sv_catpvn>, but also handles 'set' magic.
4282
4283 =cut
4284 */
4285
4286 void
4287 Perl_sv_catpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
4288 {
4289     sv_catpvn(sv,ptr,len);
4290     SvSETMAGIC(sv);
4291 }
4292
4293 /*
4294 =for apidoc sv_catsv
4295
4296 Concatenates the string from SV C<ssv> onto the end of the string in
4297 SV C<dsv>.  Modifies C<dsv> but not C<ssv>.  Handles 'get' magic, but
4298 not 'set' magic.  See C<sv_catsv_mg>.
4299
4300 =for apidoc sv_catsv_flags
4301
4302 Concatenates the string from SV C<ssv> onto the end of the string in
4303 SV C<dsv>.  Modifies C<dsv> but not C<ssv>.  If C<flags> has C<SV_GMAGIC>
4304 bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
4305 and C<sv_catsv_nomg> are implemented in terms of this function.
4306
4307 =cut */
4308
4309 void
4310 Perl_sv_catsv_flags(pTHX_ SV *dsv, register SV *ssv, I32 flags)
4311 {
4312     char *spv;
4313     STRLEN slen;
4314     if (!ssv)
4315         return;
4316     if ((spv = SvPV(ssv, slen))) {
4317         /*  sutf8 and dutf8 were type bool, but under USE_ITHREADS,
4318             gcc version 2.95.2 20000220 (Debian GNU/Linux) for
4319             Linux xxx 2.2.17 on sparc64 with gcc -O2, we erroneously
4320             get dutf8 = 0x20000000, (i.e.  SVf_UTF8) even though
4321             dsv->sv_flags doesn't have that bit set.
4322                 Andy Dougherty  12 Oct 2001
4323         */
4324         I32 sutf8 = DO_UTF8(ssv);
4325         I32 dutf8;
4326
4327         if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
4328             mg_get(dsv);
4329         dutf8 = DO_UTF8(dsv);
4330
4331         if (dutf8 != sutf8) {
4332             if (dutf8) {
4333                 /* Not modifying source SV, so taking a temporary copy. */
4334                 SV* csv = sv_2mortal(newSVpvn(spv, slen));
4335
4336                 sv_utf8_upgrade(csv);
4337                 spv = SvPV(csv, slen);
4338             }
4339             else
4340                 sv_utf8_upgrade_nomg(dsv);
4341         }
4342         sv_catpvn_nomg(dsv, spv, slen);
4343     }
4344 }
4345
4346 /*
4347 =for apidoc sv_catsv_mg
4348
4349 Like C<sv_catsv>, but also handles 'set' magic.
4350
4351 =cut
4352 */
4353
4354 void
4355 Perl_sv_catsv_mg(pTHX_ SV *dsv, register SV *ssv)
4356 {
4357     sv_catsv(dsv,ssv);
4358     SvSETMAGIC(dsv);
4359 }
4360
4361 /*
4362 =for apidoc sv_catpv
4363
4364 Concatenates the string onto the end of the string which is in the SV.
4365 If the SV has the UTF8 status set, then the bytes appended should be
4366 valid UTF8.  Handles 'get' magic, but not 'set' magic.  See C<sv_catpv_mg>.
4367
4368 =cut */
4369
4370 void
4371 Perl_sv_catpv(pTHX_ register SV *sv, register const char *ptr)
4372 {
4373     register STRLEN len;
4374     STRLEN tlen;
4375     char *junk;
4376
4377     if (!ptr)
4378         return;
4379     junk = SvPV_force(sv, tlen);
4380     len = strlen(ptr);
4381     SvGROW(sv, tlen + len + 1);
4382     if (ptr == junk)
4383         ptr = SvPVX(sv);
4384     Move(ptr,SvPVX(sv)+tlen,len+1,char);
4385     SvCUR(sv) += len;
4386     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4387     SvTAINT(sv);
4388 }
4389
4390 /*
4391 =for apidoc sv_catpv_mg
4392
4393 Like C<sv_catpv>, but also handles 'set' magic.
4394
4395 =cut
4396 */
4397
4398 void
4399 Perl_sv_catpv_mg(pTHX_ register SV *sv, register const char *ptr)
4400 {
4401     sv_catpv(sv,ptr);
4402     SvSETMAGIC(sv);
4403 }
4404
4405 /*
4406 =for apidoc newSV
4407
4408 Create a new null SV, or if len > 0, create a new empty SVt_PV type SV
4409 with an initial PV allocation of len+1. Normally accessed via the C<NEWSV>
4410 macro.
4411
4412 =cut
4413 */
4414
4415 SV *
4416 Perl_newSV(pTHX_ STRLEN len)
4417 {
4418     register SV *sv;
4419
4420     new_SV(sv);
4421     if (len) {
4422         sv_upgrade(sv, SVt_PV);
4423         SvGROW(sv, len + 1);
4424     }
4425     return sv;
4426 }
4427 /*
4428 =for apidoc sv_magicext
4429
4430 Adds magic to an SV, upgrading it if necessary. Applies the
4431 supplied vtable and returns pointer to the magic added.
4432
4433 Note that sv_magicext will allow things that sv_magic will not.
4434 In particular you can add magic to SvREADONLY SVs and and more than
4435 one instance of the same 'how'
4436
4437 I C<namelen> is greater then zero then a savepvn() I<copy> of C<name> is stored,
4438 if C<namelen> is zero then C<name> is stored as-is and - as another special
4439 case - if C<(name && namelen == HEf_SVKEY)> then C<name> is assumed to contain
4440 an C<SV*> and has its REFCNT incremented
4441
4442 (This is now used as a subroutine by sv_magic.)
4443
4444 =cut
4445 */
4446 MAGIC * 
4447 Perl_sv_magicext(pTHX_ SV* sv, SV* obj, int how, MGVTBL *vtable,
4448                  const char* name, I32 namlen)
4449 {
4450     MAGIC* mg;
4451
4452     if (SvTYPE(sv) < SVt_PVMG) {
4453         (void)SvUPGRADE(sv, SVt_PVMG);
4454     }
4455     Newz(702,mg, 1, MAGIC);
4456     mg->mg_moremagic = SvMAGIC(sv);
4457     SvMAGIC(sv) = mg;
4458
4459     /* Some magic sontains a reference loop, where the sv and object refer to
4460        each other.  To prevent a reference loop that would prevent such
4461        objects being freed, we look for such loops and if we find one we
4462        avoid incrementing the object refcount. */
4463     if (!obj || obj == sv ||
4464         how == PERL_MAGIC_arylen ||
4465         how == PERL_MAGIC_qr ||
4466         (SvTYPE(obj) == SVt_PVGV &&
4467             (GvSV(obj) == sv || GvHV(obj) == (HV*)sv || GvAV(obj) == (AV*)sv ||
4468             GvCV(obj) == (CV*)sv || GvIOp(obj) == (IO*)sv ||
4469             GvFORM(obj) == (CV*)sv)))
4470     {
4471         mg->mg_obj = obj;
4472     }
4473     else {
4474         mg->mg_obj = SvREFCNT_inc(obj);
4475         mg->mg_flags |= MGf_REFCOUNTED;
4476     }
4477     mg->mg_type = how;
4478     mg->mg_len = namlen;
4479     if (name) {
4480         if (namlen > 0)
4481             mg->mg_ptr = savepvn(name, namlen);
4482         else if (namlen == HEf_SVKEY)
4483             mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
4484         else
4485             mg->mg_ptr = (char *) name;
4486     }
4487     mg->mg_virtual = vtable;
4488
4489     mg_magical(sv);
4490     if (SvGMAGICAL(sv))
4491         SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
4492     return mg;
4493 }
4494
4495 /*
4496 =for apidoc sv_magic
4497
4498 Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
4499 then adds a new magic item of type C<how> to the head of the magic list.
4500
4501 =cut
4502 */
4503
4504 void
4505 Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
4506 {
4507     MAGIC* mg;
4508     MGVTBL *vtable = 0;
4509
4510     if (SvREADONLY(sv)) {
4511         if (PL_curcop != &PL_compiling
4512             && how != PERL_MAGIC_regex_global
4513             && how != PERL_MAGIC_bm
4514             && how != PERL_MAGIC_fm
4515             && how != PERL_MAGIC_sv
4516            )
4517         {
4518             Perl_croak(aTHX_ PL_no_modify);
4519         }
4520     }
4521     if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
4522         if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
4523             /* sv_magic() refuses to add a magic of the same 'how' as an
4524                existing one
4525              */
4526             if (how == PERL_MAGIC_taint)
4527                 mg->mg_len |= 1;
4528             return;
4529         }
4530     }
4531
4532     switch (how) {
4533     case PERL_MAGIC_sv:
4534         vtable = &PL_vtbl_sv;
4535         break;
4536     case PERL_MAGIC_overload:
4537         vtable = &PL_vtbl_amagic;
4538         break;
4539     case PERL_MAGIC_overload_elem:
4540         vtable = &PL_vtbl_amagicelem;
4541         break;
4542     case PERL_MAGIC_overload_table:
4543         vtable = &PL_vtbl_ovrld;
4544         break;
4545     case PERL_MAGIC_bm:
4546         vtable = &PL_vtbl_bm;
4547         break;
4548     case PERL_MAGIC_regdata:
4549         vtable = &PL_vtbl_regdata;
4550         break;
4551     case PERL_MAGIC_regdatum:
4552         vtable = &PL_vtbl_regdatum;
4553         break;
4554     case PERL_MAGIC_env:
4555         vtable = &PL_vtbl_env;
4556         break;
4557     case PERL_MAGIC_fm:
4558         vtable = &PL_vtbl_fm;
4559         break;
4560     case PERL_MAGIC_envelem:
4561         vtable = &PL_vtbl_envelem;
4562         break;
4563     case PERL_MAGIC_regex_global:
4564         vtable = &PL_vtbl_mglob;
4565         break;
4566     case PERL_MAGIC_isa:
4567         vtable = &PL_vtbl_isa;
4568         break;
4569     case PERL_MAGIC_isaelem:
4570         vtable = &PL_vtbl_isaelem;
4571         break;
4572     case PERL_MAGIC_nkeys:
4573         vtable = &PL_vtbl_nkeys;
4574         break;
4575     case PERL_MAGIC_dbfile:
4576         vtable = 0;
4577         break;
4578     case PERL_MAGIC_dbline:
4579         vtable = &PL_vtbl_dbline;
4580         break;
4581 #ifdef USE_5005THREADS
4582     case PERL_MAGIC_mutex:
4583         vtable = &PL_vtbl_mutex;
4584         break;
4585 #endif /* USE_5005THREADS */
4586 #ifdef USE_LOCALE_COLLATE
4587     case PERL_MAGIC_collxfrm:
4588         vtable = &PL_vtbl_collxfrm;
4589         break;
4590 #endif /* USE_LOCALE_COLLATE */
4591     case PERL_MAGIC_tied:
4592         vtable = &PL_vtbl_pack;
4593         break;
4594     case PERL_MAGIC_tiedelem:
4595     case PERL_MAGIC_tiedscalar:
4596         vtable = &PL_vtbl_packelem;
4597         break;
4598     case PERL_MAGIC_qr:
4599         vtable = &PL_vtbl_regexp;
4600         break;
4601     case PERL_MAGIC_sig:
4602         vtable = &PL_vtbl_sig;
4603         break;
4604     case PERL_MAGIC_sigelem:
4605         vtable = &PL_vtbl_sigelem;
4606         break;
4607     case PERL_MAGIC_taint:
4608         vtable = &PL_vtbl_taint;
4609         break;
4610     case PERL_MAGIC_uvar:
4611         vtable = &PL_vtbl_uvar;
4612         break;
4613     case PERL_MAGIC_vec:
4614         vtable = &PL_vtbl_vec;
4615         break;
4616     case PERL_MAGIC_substr:
4617         vtable = &PL_vtbl_substr;
4618         break;
4619     case PERL_MAGIC_defelem:
4620         vtable = &PL_vtbl_defelem;
4621         break;
4622     case PERL_MAGIC_glob:
4623         vtable = &PL_vtbl_glob;
4624         break;
4625     case PERL_MAGIC_arylen:
4626         vtable = &PL_vtbl_arylen;
4627         break;
4628     case PERL_MAGIC_pos:
4629         vtable = &PL_vtbl_pos;
4630         break;
4631     case PERL_MAGIC_backref:
4632         vtable = &PL_vtbl_backref;
4633         break;
4634     case PERL_MAGIC_ext:
4635         /* Reserved for use by extensions not perl internals.           */
4636         /* Useful for attaching extension internal data to perl vars.   */
4637         /* Note that multiple extensions may clash if magical scalars   */
4638         /* etc holding private data from one are passed to another.     */
4639         break;
4640     default:
4641         Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
4642     }
4643
4644     /* Rest of work is done else where */
4645     mg = sv_magicext(sv,obj,how,vtable,name,namlen);
4646
4647     switch (how) {
4648     case PERL_MAGIC_taint:
4649         mg->mg_len = 1;
4650         break;
4651     case PERL_MAGIC_ext:
4652     case PERL_MAGIC_dbfile:
4653         SvRMAGICAL_on(sv);
4654         break;
4655     }
4656 }
4657
4658 /*
4659 =for apidoc sv_unmagic
4660
4661 Removes all magic of type C<type> from an SV.
4662
4663 =cut
4664 */
4665
4666 int
4667 Perl_sv_unmagic(pTHX_ SV *sv, int type)
4668 {
4669     MAGIC* mg;
4670     MAGIC** mgp;
4671     if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
4672         return 0;
4673     mgp = &SvMAGIC(sv);
4674     for (mg = *mgp; mg; mg = *mgp) {
4675         if (mg->mg_type == type) {
4676             MGVTBL* vtbl = mg->mg_virtual;
4677             *mgp = mg->mg_moremagic;
4678             if (vtbl && vtbl->svt_free)
4679                 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
4680             if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
4681                 if (mg->mg_len > 0)
4682                     Safefree(mg->mg_ptr);
4683                 else if (mg->mg_len == HEf_SVKEY)
4684                     SvREFCNT_dec((SV*)mg->mg_ptr);
4685             }
4686             if (mg->mg_flags & MGf_REFCOUNTED)
4687                 SvREFCNT_dec(mg->mg_obj);
4688             Safefree(mg);
4689         }
4690         else
4691             mgp = &mg->mg_moremagic;
4692     }
4693     if (!SvMAGIC(sv)) {
4694         SvMAGICAL_off(sv);
4695        SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_NOK|SVp_POK)) >> PRIVSHIFT;
4696     }
4697
4698     return 0;
4699 }
4700
4701 /*
4702 =for apidoc sv_rvweaken
4703
4704 Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
4705 referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
4706 push a back-reference to this RV onto the array of backreferences
4707 associated with that magic.
4708
4709 =cut
4710 */
4711
4712 SV *
4713 Perl_sv_rvweaken(pTHX_ SV *sv)
4714 {
4715     SV *tsv;
4716     if (!SvOK(sv))  /* let undefs pass */
4717         return sv;
4718     if (!SvROK(sv))
4719         Perl_croak(aTHX_ "Can't weaken a nonreference");
4720     else if (SvWEAKREF(sv)) {
4721         if (ckWARN(WARN_MISC))
4722             Perl_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
4723         return sv;
4724     }
4725     tsv = SvRV(sv);
4726     sv_add_backref(tsv, sv);
4727     SvWEAKREF_on(sv);
4728     SvREFCNT_dec(tsv);
4729     return sv;
4730 }
4731
4732 /* Give tsv backref magic if it hasn't already got it, then push a
4733  * back-reference to sv onto the array associated with the backref magic.
4734  */
4735
4736 STATIC void
4737 S_sv_add_backref(pTHX_ SV *tsv, SV *sv)
4738 {
4739     AV *av;
4740     MAGIC *mg;
4741     if (SvMAGICAL(tsv) && (mg = mg_find(tsv, PERL_MAGIC_backref)))
4742         av = (AV*)mg->mg_obj;
4743     else {
4744         av = newAV();
4745         sv_magic(tsv, (SV*)av, PERL_MAGIC_backref, NULL, 0);
4746         SvREFCNT_dec(av);           /* for sv_magic */
4747     }
4748     av_push(av,sv);
4749 }
4750
4751 /* delete a back-reference to ourselves from the backref magic associated
4752  * with the SV we point to.
4753  */
4754
4755 STATIC void
4756 S_sv_del_backref(pTHX_ SV *sv)
4757 {
4758     AV *av;
4759     SV **svp;
4760     I32 i;
4761     SV *tsv = SvRV(sv);
4762     MAGIC *mg = NULL;
4763     if (!SvMAGICAL(tsv) || !(mg = mg_find(tsv, PERL_MAGIC_backref)))
4764         Perl_croak(aTHX_ "panic: del_backref");
4765     av = (AV *)mg->mg_obj;
4766     svp = AvARRAY(av);
4767     i = AvFILLp(av);
4768     while (i >= 0) {
4769         if (svp[i] == sv) {
4770             svp[i] = &PL_sv_undef; /* XXX */
4771         }
4772         i--;
4773     }
4774 }
4775
4776 /*
4777 =for apidoc sv_insert
4778
4779 Inserts a string at the specified offset/length within the SV. Similar to
4780 the Perl substr() function.
4781
4782 =cut
4783 */
4784
4785 void
4786 Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
4787 {
4788     register char *big;
4789     register char *mid;
4790     register char *midend;
4791     register char *bigend;
4792     register I32 i;
4793     STRLEN curlen;
4794
4795
4796     if (!bigstr)
4797         Perl_croak(aTHX_ "Can't modify non-existent substring");
4798     SvPV_force(bigstr, curlen);
4799     (void)SvPOK_only_UTF8(bigstr);
4800     if (offset + len > curlen) {
4801         SvGROW(bigstr, offset+len+1);
4802         Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
4803         SvCUR_set(bigstr, offset+len);
4804     }
4805
4806     SvTAINT(bigstr);
4807     i = littlelen - len;
4808     if (i > 0) {                        /* string might grow */
4809         big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
4810         mid = big + offset + len;
4811         midend = bigend = big + SvCUR(bigstr);
4812         bigend += i;
4813         *bigend = '\0';
4814         while (midend > mid)            /* shove everything down */
4815             *--bigend = *--midend;
4816         Move(little,big+offset,littlelen,char);
4817         SvCUR(bigstr) += i;
4818         SvSETMAGIC(bigstr);
4819         return;
4820     }
4821     else if (i == 0) {
4822         Move(little,SvPVX(bigstr)+offset,len,char);
4823         SvSETMAGIC(bigstr);
4824         return;
4825     }
4826
4827     big = SvPVX(bigstr);
4828     mid = big + offset;
4829     midend = mid + len;
4830     bigend = big + SvCUR(bigstr);
4831
4832     if (midend > bigend)
4833         Perl_croak(aTHX_ "panic: sv_insert");
4834
4835     if (mid - big > bigend - midend) {  /* faster to shorten from end */
4836         if (littlelen) {
4837             Move(little, mid, littlelen,char);
4838             mid += littlelen;
4839         }
4840         i = bigend - midend;
4841         if (i > 0) {
4842             Move(midend, mid, i,char);
4843             mid += i;
4844         }
4845         *mid = '\0';
4846         SvCUR_set(bigstr, mid - big);
4847     }
4848     /*SUPPRESS 560*/
4849     else if ((i = mid - big)) { /* faster from front */
4850         midend -= littlelen;
4851         mid = midend;
4852         sv_chop(bigstr,midend-i);
4853         big += i;
4854         while (i--)
4855             *--midend = *--big;
4856         if (littlelen)
4857             Move(little, mid, littlelen,char);
4858     }
4859     else if (littlelen) {
4860         midend -= littlelen;
4861         sv_chop(bigstr,midend);
4862         Move(little,midend,littlelen,char);
4863     }
4864     else {
4865         sv_chop(bigstr,midend);
4866     }
4867     SvSETMAGIC(bigstr);
4868 }
4869
4870 /*
4871 =for apidoc sv_replace
4872
4873 Make the first argument a copy of the second, then delete the original.
4874 The target SV physically takes over ownership of the body of the source SV
4875 and inherits its flags; however, the target keeps any magic it owns,
4876 and any magic in the source is discarded.
4877 Note that this is a rather specialist SV copying operation; most of the
4878 time you'll want to use C<sv_setsv> or one of its many macro front-ends.
4879
4880 =cut
4881 */
4882
4883 void
4884 Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
4885 {
4886     U32 refcnt = SvREFCNT(sv);
4887     SV_CHECK_THINKFIRST(sv);
4888     if (SvREFCNT(nsv) != 1 && ckWARN_d(WARN_INTERNAL))
4889         Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "Reference miscount in sv_replace()");
4890     if (SvMAGICAL(sv)) {
4891         if (SvMAGICAL(nsv))
4892             mg_free(nsv);
4893         else
4894             sv_upgrade(nsv, SVt_PVMG);
4895         SvMAGIC(nsv) = SvMAGIC(sv);
4896         SvFLAGS(nsv) |= SvMAGICAL(sv);
4897         SvMAGICAL_off(sv);
4898         SvMAGIC(sv) = 0;
4899     }
4900     SvREFCNT(sv) = 0;
4901     sv_clear(sv);
4902     assert(!SvREFCNT(sv));
4903     StructCopy(nsv,sv,SV);
4904     SvREFCNT(sv) = refcnt;
4905     SvFLAGS(nsv) |= SVTYPEMASK;         /* Mark as freed */
4906     del_SV(nsv);
4907 }
4908
4909 /*
4910 =for apidoc sv_clear
4911
4912 Clear an SV: call any destructors, free up any memory used by the body,
4913 and free the body itself. The SV's head is I<not> freed, although
4914 its type is set to all 1's so that it won't inadvertently be assumed
4915 to be live during global destruction etc.
4916 This function should only be called when REFCNT is zero. Most of the time
4917 you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
4918 instead.
4919
4920 =cut
4921 */
4922
4923 void
4924 Perl_sv_clear(pTHX_ register SV *sv)
4925 {
4926     HV* stash;
4927     assert(sv);
4928     assert(SvREFCNT(sv) == 0);
4929
4930     if (SvOBJECT(sv)) {
4931         if (PL_defstash) {              /* Still have a symbol table? */
4932             dSP;
4933             CV* destructor;
4934             SV tmpref;
4935
4936             Zero(&tmpref, 1, SV);
4937             sv_upgrade(&tmpref, SVt_RV);
4938             SvROK_on(&tmpref);
4939             SvREADONLY_on(&tmpref);     /* DESTROY() could be naughty */
4940             SvREFCNT(&tmpref) = 1;
4941
4942             do {        
4943                 stash = SvSTASH(sv);
4944                 destructor = StashHANDLER(stash,DESTROY);
4945                 if (destructor) {
4946                     ENTER;
4947                     PUSHSTACKi(PERLSI_DESTROY);
4948                     SvRV(&tmpref) = SvREFCNT_inc(sv);
4949                     EXTEND(SP, 2);
4950                     PUSHMARK(SP);
4951                     PUSHs(&tmpref);
4952                     PUTBACK;
4953                     call_sv((SV*)destructor, G_DISCARD|G_EVAL|G_KEEPERR);
4954                     SvREFCNT(sv)--;
4955                     POPSTACK;
4956                     SPAGAIN;
4957                     LEAVE;
4958                 }
4959             } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
4960
4961             del_XRV(SvANY(&tmpref));
4962
4963             if (SvREFCNT(sv)) {
4964                 if (PL_in_clean_objs)
4965                     Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
4966                           HvNAME(stash));
4967                 /* DESTROY gave object new lease on life */
4968                 return;
4969             }
4970         }
4971
4972         if (SvOBJECT(sv)) {
4973             SvREFCNT_dec(SvSTASH(sv));  /* possibly of changed persuasion */
4974             SvOBJECT_off(sv);   /* Curse the object. */
4975             if (SvTYPE(sv) != SVt_PVIO)
4976                 --PL_sv_objcount;       /* XXX Might want something more general */
4977         }
4978     }
4979     if (SvTYPE(sv) >= SVt_PVMG) {
4980         if (SvMAGIC(sv))
4981             mg_free(sv);
4982         if (SvFLAGS(sv) & SVpad_TYPED)
4983             SvREFCNT_dec(SvSTASH(sv));
4984     }
4985     stash = NULL;
4986     switch (SvTYPE(sv)) {
4987     case SVt_PVIO:
4988         if (IoIFP(sv) &&
4989             IoIFP(sv) != PerlIO_stdin() &&
4990             IoIFP(sv) != PerlIO_stdout() &&
4991             IoIFP(sv) != PerlIO_stderr())
4992         {
4993             io_close((IO*)sv, FALSE);
4994         }
4995         if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
4996             PerlDir_close(IoDIRP(sv));
4997         IoDIRP(sv) = (DIR*)NULL;
4998         Safefree(IoTOP_NAME(sv));
4999         Safefree(IoFMT_NAME(sv));
5000         Safefree(IoBOTTOM_NAME(sv));
5001         /* FALL THROUGH */
5002     case SVt_PVBM:
5003         goto freescalar;
5004     case SVt_PVCV:
5005     case SVt_PVFM:
5006         cv_undef((CV*)sv);
5007         goto freescalar;
5008     case SVt_PVHV:
5009         hv_undef((HV*)sv);
5010         break;
5011     case SVt_PVAV:
5012         av_undef((AV*)sv);
5013         break;
5014     case SVt_PVLV:
5015         SvREFCNT_dec(LvTARG(sv));
5016         goto freescalar;
5017     case SVt_PVGV:
5018         gp_free((GV*)sv);
5019         Safefree(GvNAME(sv));
5020         /* cannot decrease stash refcount yet, as we might recursively delete
5021            ourselves when the refcnt drops to zero. Delay SvREFCNT_dec
5022            of stash until current sv is completely gone.
5023            -- JohnPC, 27 Mar 1998 */
5024         stash = GvSTASH(sv);
5025         /* FALL THROUGH */
5026     case SVt_PVMG:
5027     case SVt_PVNV:
5028     case SVt_PVIV:
5029       freescalar:
5030         (void)SvOOK_off(sv);
5031         /* FALL THROUGH */
5032     case SVt_PV:
5033     case SVt_RV:
5034         if (SvROK(sv)) {
5035             if (SvWEAKREF(sv))
5036                 sv_del_backref(sv);
5037             else
5038                 SvREFCNT_dec(SvRV(sv));
5039         }
5040         else if (SvPVX(sv) && SvLEN(sv))
5041             Safefree(SvPVX(sv));
5042         else if (SvPVX(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
5043             unsharepvn(SvPVX(sv),
5044                        SvUTF8(sv) ? -(I32)SvCUR(sv) : SvCUR(sv),
5045                        SvUVX(sv));
5046             SvFAKE_off(sv);
5047         }
5048         break;
5049 /*
5050     case SVt_NV:
5051     case SVt_IV:
5052     case SVt_NULL:
5053         break;
5054 */
5055     }
5056
5057     switch (SvTYPE(sv)) {
5058     case SVt_NULL:
5059         break;
5060     case SVt_IV:
5061         del_XIV(SvANY(sv));
5062         break;
5063     case SVt_NV:
5064         del_XNV(SvANY(sv));
5065         break;
5066     case SVt_RV:
5067         del_XRV(SvANY(sv));
5068         break;
5069     case SVt_PV:
5070         del_XPV(SvANY(sv));
5071         break;
5072     case SVt_PVIV:
5073         del_XPVIV(SvANY(sv));
5074         break;
5075     case SVt_PVNV:
5076         del_XPVNV(SvANY(sv));
5077         break;
5078     case SVt_PVMG:
5079         del_XPVMG(SvANY(sv));
5080         break;
5081     case SVt_PVLV:
5082         del_XPVLV(SvANY(sv));
5083         break;
5084     case SVt_PVAV:
5085         del_XPVAV(SvANY(sv));
5086         break;
5087     case SVt_PVHV:
5088         del_XPVHV(SvANY(sv));
5089         break;
5090     case SVt_PVCV:
5091         del_XPVCV(SvANY(sv));
5092         break;
5093     case SVt_PVGV:
5094         del_XPVGV(SvANY(sv));
5095         /* code duplication for increased performance. */
5096         SvFLAGS(sv) &= SVf_BREAK;
5097         SvFLAGS(sv) |= SVTYPEMASK;
5098         /* decrease refcount of the stash that owns this GV, if any */
5099         if (stash)
5100             SvREFCNT_dec(stash);
5101         return; /* not break, SvFLAGS reset already happened */
5102     case SVt_PVBM:
5103         del_XPVBM(SvANY(sv));
5104         break;
5105     case SVt_PVFM:
5106         del_XPVFM(SvANY(sv));
5107         break;
5108     case SVt_PVIO:
5109         del_XPVIO(SvANY(sv));
5110         break;
5111     }
5112     SvFLAGS(sv) &= SVf_BREAK;
5113     SvFLAGS(sv) |= SVTYPEMASK;
5114 }
5115
5116 /*
5117 =for apidoc sv_newref
5118
5119 Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
5120 instead.
5121
5122 =cut
5123 */
5124
5125 SV *
5126 Perl_sv_newref(pTHX_ SV *sv)
5127 {
5128     if (sv)
5129         ATOMIC_INC(SvREFCNT(sv));
5130     return sv;
5131 }
5132
5133 /*
5134 =for apidoc sv_free
5135
5136 Decrement an SV's reference count, and if it drops to zero, call
5137 C<sv_clear> to invoke destructors and free up any memory used by
5138 the body; finally, deallocate the SV's head itself.
5139 Normally called via a wrapper macro C<SvREFCNT_dec>.
5140
5141 =cut
5142 */
5143
5144 void
5145 Perl_sv_free(pTHX_ SV *sv)
5146 {
5147     int refcount_is_zero;
5148
5149     if (!sv)
5150         return;
5151     if (SvREFCNT(sv) == 0) {
5152         if (SvFLAGS(sv) & SVf_BREAK)
5153             /* this SV's refcnt has been artificially decremented to
5154              * trigger cleanup */
5155             return;
5156         if (PL_in_clean_all) /* All is fair */
5157             return;
5158         if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5159             /* make sure SvREFCNT(sv)==0 happens very seldom */
5160             SvREFCNT(sv) = (~(U32)0)/2;
5161             return;
5162         }
5163         if (ckWARN_d(WARN_INTERNAL))
5164             Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "Attempt to free unreferenced scalar");
5165         return;
5166     }
5167     ATOMIC_DEC_AND_TEST(refcount_is_zero, SvREFCNT(sv));
5168     if (!refcount_is_zero)
5169         return;
5170 #ifdef DEBUGGING
5171     if (SvTEMP(sv)) {
5172         if (ckWARN_d(WARN_DEBUGGING))
5173             Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
5174                         "Attempt to free temp prematurely: SV 0x%"UVxf,
5175                         PTR2UV(sv));
5176         return;
5177     }
5178 #endif
5179     if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5180         /* make sure SvREFCNT(sv)==0 happens very seldom */
5181         SvREFCNT(sv) = (~(U32)0)/2;
5182         return;
5183     }
5184     sv_clear(sv);
5185     if (! SvREFCNT(sv))
5186         del_SV(sv);
5187 }
5188
5189 /*
5190 =for apidoc sv_len
5191
5192 Returns the length of the string in the SV. Handles magic and type
5193 coercion.  See also C<SvCUR>, which gives raw access to the xpv_cur slot.
5194
5195 =cut
5196 */
5197
5198 STRLEN
5199 Perl_sv_len(pTHX_ register SV *sv)
5200 {
5201     STRLEN len;
5202
5203     if (!sv)
5204         return 0;
5205
5206     if (SvGMAGICAL(sv))
5207         len = mg_length(sv);
5208     else
5209         (void)SvPV(sv, len);
5210     return len;
5211 }
5212
5213 /*
5214 =for apidoc sv_len_utf8
5215
5216 Returns the number of characters in the string in an SV, counting wide
5217 UTF8 bytes as a single character. Handles magic and type coercion.
5218
5219 =cut
5220 */
5221
5222 STRLEN
5223 Perl_sv_len_utf8(pTHX_ register SV *sv)
5224 {
5225     if (!sv)
5226         return 0;
5227
5228     if (SvGMAGICAL(sv))
5229         return mg_length(sv);
5230     else
5231     {
5232         STRLEN len;
5233         U8 *s = (U8*)SvPV(sv, len);
5234
5235         return Perl_utf8_length(aTHX_ s, s + len);
5236     }
5237 }
5238
5239 /*
5240 =for apidoc sv_pos_u2b
5241
5242 Converts the value pointed to by offsetp from a count of UTF8 chars from
5243 the start of the string, to a count of the equivalent number of bytes; if
5244 lenp is non-zero, it does the same to lenp, but this time starting from
5245 the offset, rather than from the start of the string. Handles magic and
5246 type coercion.
5247
5248 =cut
5249 */
5250
5251 void
5252 Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
5253 {
5254     U8 *start;
5255     U8 *s;
5256     U8 *send;
5257     I32 uoffset = *offsetp;
5258     STRLEN len;
5259
5260     if (!sv)
5261         return;
5262
5263     start = s = (U8*)SvPV(sv, len);
5264     send = s + len;
5265     while (s < send && uoffset--)
5266         s += UTF8SKIP(s);
5267     if (s >= send)
5268         s = send;
5269     *offsetp = s - start;
5270     if (lenp) {
5271         I32 ulen = *lenp;
5272         start = s;
5273         while (s < send && ulen--)
5274             s += UTF8SKIP(s);
5275         if (s >= send)
5276             s = send;
5277         *lenp = s - start;
5278     }
5279     return;
5280 }
5281
5282 /*
5283 =for apidoc sv_pos_b2u
5284
5285 Converts the value pointed to by offsetp from a count of bytes from the
5286 start of the string, to a count of the equivalent number of UTF8 chars.
5287 Handles magic and type coercion.
5288
5289 =cut
5290 */
5291
5292 void
5293 Perl_sv_pos_b2u(pTHX_ register SV *sv, I32* offsetp)
5294 {
5295     U8 *s;
5296     U8 *send;
5297     STRLEN len;
5298
5299     if (!sv)
5300         return;
5301
5302     s = (U8*)SvPV(sv, len);
5303     if ((I32)len < *offsetp)
5304         Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
5305     send = s + *offsetp;
5306     len = 0;
5307     while (s < send) {
5308         STRLEN n;
5309         /* Call utf8n_to_uvchr() to validate the sequence */
5310         utf8n_to_uvchr(s, UTF8SKIP(s), &n, 0);
5311         if (n > 0) {
5312             s += n;
5313             len++;
5314         }
5315         else
5316             break;
5317     }
5318     *offsetp = len;
5319     return;
5320 }
5321
5322 /*
5323 =for apidoc sv_eq
5324
5325 Returns a boolean indicating whether the strings in the two SVs are
5326 identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
5327 coerce its args to strings if necessary.
5328
5329 =cut
5330 */
5331
5332 I32
5333 Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
5334 {
5335     char *pv1;
5336     STRLEN cur1;
5337     char *pv2;
5338     STRLEN cur2;
5339     I32  eq     = 0;
5340     char *tpv   = Nullch;
5341     SV* svrecode = Nullsv;
5342
5343     if (!sv1) {
5344         pv1 = "";
5345         cur1 = 0;
5346     }
5347     else
5348         pv1 = SvPV(sv1, cur1);
5349
5350     if (!sv2){
5351         pv2 = "";
5352         cur2 = 0;
5353     }
5354     else
5355         pv2 = SvPV(sv2, cur2);
5356
5357     if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
5358         /* Differing utf8ness.
5359          * Do not UTF8size the comparands as a side-effect. */
5360          if (PL_encoding) {
5361               if (SvUTF8(sv1)) {
5362                    svrecode = newSVpvn(pv2, cur2);
5363                    sv_recode_to_utf8(svrecode, PL_encoding);
5364                    pv2 = SvPV(svrecode, cur2);
5365               }
5366               else {
5367                    svrecode = newSVpvn(pv1, cur1);
5368                    sv_recode_to_utf8(svrecode, PL_encoding);
5369                    pv1 = SvPV(svrecode, cur1);
5370               }
5371               /* Now both are in UTF-8. */
5372               if (cur1 != cur2)
5373                    return FALSE;
5374          }
5375          else {
5376               bool is_utf8 = TRUE;
5377
5378               if (SvUTF8(sv1)) {
5379                    /* sv1 is the UTF-8 one,
5380                     * if is equal it must be downgrade-able */
5381                    char *pv = (char*)bytes_from_utf8((U8*)pv1,
5382                                                      &cur1, &is_utf8);
5383                    if (pv != pv1)
5384                         pv1 = tpv = pv;
5385               }
5386               else {
5387                    /* sv2 is the UTF-8 one,
5388                     * if is equal it must be downgrade-able */
5389                    char *pv = (char *)bytes_from_utf8((U8*)pv2,
5390                                                       &cur2, &is_utf8);
5391                    if (pv != pv2)
5392                         pv2 = tpv = pv;
5393               }
5394               if (is_utf8) {
5395                    /* Downgrade not possible - cannot be eq */
5396                    return FALSE;
5397               }
5398          }
5399     }
5400
5401     if (cur1 == cur2)
5402         eq = memEQ(pv1, pv2, cur1);
5403         
5404     if (svrecode)
5405          SvREFCNT_dec(svrecode);
5406
5407     if (tpv)
5408         Safefree(tpv);
5409
5410     return eq;
5411 }
5412
5413 /*
5414 =for apidoc sv_cmp
5415
5416 Compares the strings in two SVs.  Returns -1, 0, or 1 indicating whether the
5417 string in C<sv1> is less than, equal to, or greater than the string in
5418 C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
5419 coerce its args to strings if necessary.  See also C<sv_cmp_locale>.
5420
5421 =cut
5422 */
5423
5424 I32
5425 Perl_sv_cmp(pTHX_ register SV *sv1, register SV *sv2)
5426 {
5427     STRLEN cur1, cur2;
5428     char *pv1, *pv2, *tpv = Nullch;
5429     I32  cmp;
5430     SV *svrecode = Nullsv;
5431
5432     if (!sv1) {
5433         pv1 = "";
5434         cur1 = 0;
5435     }
5436     else
5437         pv1 = SvPV(sv1, cur1);
5438
5439     if (!sv2) {
5440         pv2 = "";
5441         cur2 = 0;
5442     }
5443     else
5444         pv2 = SvPV(sv2, cur2);
5445
5446     if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
5447         /* Differing utf8ness.
5448          * Do not UTF8size the comparands as a side-effect. */
5449         if (SvUTF8(sv1)) {
5450             if (PL_encoding) {
5451                  svrecode = newSVpvn(pv2, cur2);
5452                  sv_recode_to_utf8(svrecode, PL_encoding);
5453                  pv2 = SvPV(svrecode, cur2);
5454             }
5455             else {
5456                  pv2 = tpv = (char*)bytes_to_utf8((U8*)pv2, &cur2);
5457             }
5458         }
5459         else {
5460             if (PL_encoding) {
5461                  svrecode = newSVpvn(pv1, cur1);
5462                  sv_recode_to_utf8(svrecode, PL_encoding);
5463                  pv1 = SvPV(svrecode, cur1);
5464             }
5465             else {
5466                  pv1 = tpv = (char*)bytes_to_utf8((U8*)pv1, &cur1);
5467             }
5468         }
5469     }
5470
5471     if (!cur1) {
5472         cmp = cur2 ? -1 : 0;
5473     } else if (!cur2) {
5474         cmp = 1;
5475     } else {
5476         I32 retval = memcmp((void*)pv1, (void*)pv2, cur1 < cur2 ? cur1 : cur2);
5477
5478         if (retval) {
5479             cmp = retval < 0 ? -1 : 1;
5480         } else if (cur1 == cur2) {
5481             cmp = 0;
5482         } else {
5483             cmp = cur1 < cur2 ? -1 : 1;
5484         }
5485     }
5486
5487     if (svrecode)
5488          SvREFCNT_dec(svrecode);
5489
5490     if (tpv)
5491         Safefree(tpv);
5492
5493     return cmp;
5494 }
5495
5496 /*
5497 =for apidoc sv_cmp_locale
5498
5499 Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
5500 'use bytes' aware, handles get magic, and will coerce its args to strings
5501 if necessary.  See also C<sv_cmp_locale>.  See also C<sv_cmp>.
5502
5503 =cut
5504 */
5505
5506 I32
5507 Perl_sv_cmp_locale(pTHX_ register SV *sv1, register SV *sv2)
5508 {
5509 #ifdef USE_LOCALE_COLLATE
5510
5511     char *pv1, *pv2;
5512     STRLEN len1, len2;
5513     I32 retval;
5514
5515     if (PL_collation_standard)
5516         goto raw_compare;
5517
5518     len1 = 0;
5519     pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
5520     len2 = 0;
5521     pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
5522
5523     if (!pv1 || !len1) {
5524         if (pv2 && len2)
5525             return -1;
5526         else
5527             goto raw_compare;
5528     }
5529     else {
5530         if (!pv2 || !len2)
5531             return 1;
5532     }
5533
5534     retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
5535
5536     if (retval)
5537         return retval < 0 ? -1 : 1;
5538
5539     /*
5540      * When the result of collation is equality, that doesn't mean
5541      * that there are no differences -- some locales exclude some
5542      * characters from consideration.  So to avoid false equalities,
5543      * we use the raw string as a tiebreaker.
5544      */
5545
5546   raw_compare:
5547     /* FALL THROUGH */
5548
5549 #endif /* USE_LOCALE_COLLATE */
5550
5551     return sv_cmp(sv1, sv2);
5552 }
5553
5554
5555 #ifdef USE_LOCALE_COLLATE
5556
5557 /*
5558 =for apidoc sv_collxfrm
5559
5560 Add Collate Transform magic to an SV if it doesn't already have it.
5561
5562 Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
5563 scalar data of the variable, but transformed to such a format that a normal
5564 memory comparison can be used to compare the data according to the locale
5565 settings.
5566
5567 =cut
5568 */
5569
5570 char *
5571 Perl_sv_collxfrm(pTHX_ SV *sv, STRLEN *nxp)
5572 {
5573     MAGIC *mg;
5574
5575     mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
5576     if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
5577         char *s, *xf;
5578         STRLEN len, xlen;
5579
5580         if (mg)
5581             Safefree(mg->mg_ptr);
5582         s = SvPV(sv, len);
5583         if ((xf = mem_collxfrm(s, len, &xlen))) {
5584             if (SvREADONLY(sv)) {
5585                 SAVEFREEPV(xf);
5586                 *nxp = xlen;
5587                 return xf + sizeof(PL_collation_ix);
5588             }
5589             if (! mg) {
5590                 sv_magic(sv, 0, PERL_MAGIC_collxfrm, 0, 0);
5591                 mg = mg_find(sv, PERL_MAGIC_collxfrm);
5592                 assert(mg);
5593             }
5594             mg->mg_ptr = xf;
5595             mg->mg_len = xlen;
5596         }
5597         else {
5598             if (mg) {
5599                 mg->mg_ptr = NULL;
5600                 mg->mg_len = -1;
5601             }
5602         }
5603     }
5604     if (mg && mg->mg_ptr) {
5605         *nxp = mg->mg_len;
5606         return mg->mg_ptr + sizeof(PL_collation_ix);
5607     }
5608     else {
5609         *nxp = 0;
5610         return NULL;
5611     }
5612 }
5613
5614 #endif /* USE_LOCALE_COLLATE */
5615
5616 /*
5617 =for apidoc sv_gets
5618
5619 Get a line from the filehandle and store it into the SV, optionally
5620 appending to the currently-stored string.
5621
5622 =cut
5623 */
5624
5625 char *
5626 Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
5627 {
5628     char *rsptr;
5629     STRLEN rslen;
5630     register STDCHAR rslast;
5631     register STDCHAR *bp;
5632     register I32 cnt;
5633     I32 i = 0;
5634     I32 rspara = 0;
5635
5636     SV_CHECK_THINKFIRST(sv);
5637     (void)SvUPGRADE(sv, SVt_PV);
5638
5639     SvSCREAM_off(sv);
5640
5641     if (PL_curcop == &PL_compiling) {
5642         /* we always read code in line mode */
5643         rsptr = "\n";
5644         rslen = 1;
5645     }
5646     else if (RsSNARF(PL_rs)) {
5647         rsptr = NULL;
5648         rslen = 0;
5649     }
5650     else if (RsRECORD(PL_rs)) {
5651       I32 recsize, bytesread;
5652       char *buffer;
5653
5654       /* Grab the size of the record we're getting */
5655       recsize = SvIV(SvRV(PL_rs));
5656       (void)SvPOK_only(sv);    /* Validate pointer */
5657       buffer = SvGROW(sv, (STRLEN)(recsize + 1));
5658       /* Go yank in */
5659 #ifdef VMS
5660       /* VMS wants read instead of fread, because fread doesn't respect */
5661       /* RMS record boundaries. This is not necessarily a good thing to be */
5662       /* doing, but we've got no other real choice */
5663       bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
5664 #else
5665       bytesread = PerlIO_read(fp, buffer, recsize);
5666 #endif
5667       SvCUR_set(sv, bytesread);
5668       buffer[bytesread] = '\0';
5669       if (PerlIO_isutf8(fp))
5670         SvUTF8_on(sv);
5671       else
5672         SvUTF8_off(sv);
5673       return(SvCUR(sv) ? SvPVX(sv) : Nullch);
5674     }
5675     else if (RsPARA(PL_rs)) {
5676         rsptr = "\n\n";
5677         rslen = 2;
5678         rspara = 1;
5679     }
5680     else {
5681         /* Get $/ i.e. PL_rs into same encoding as stream wants */
5682         if (PerlIO_isutf8(fp)) {
5683             rsptr = SvPVutf8(PL_rs, rslen);
5684         }
5685         else {
5686             if (SvUTF8(PL_rs)) {
5687                 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
5688                     Perl_croak(aTHX_ "Wide character in $/");
5689                 }
5690             }
5691             rsptr = SvPV(PL_rs, rslen);
5692         }
5693     }
5694
5695     rslast = rslen ? rsptr[rslen - 1] : '\0';
5696
5697     if (rspara) {               /* have to do this both before and after */
5698         do {                    /* to make sure file boundaries work right */
5699             if (PerlIO_eof(fp))
5700                 return 0;
5701             i = PerlIO_getc(fp);
5702             if (i != '\n') {
5703                 if (i == -1)
5704                     return 0;
5705                 PerlIO_ungetc(fp,i);
5706                 break;
5707             }
5708         } while (i != EOF);
5709     }
5710
5711     /* See if we know enough about I/O mechanism to cheat it ! */
5712
5713     /* This used to be #ifdef test - it is made run-time test for ease
5714        of abstracting out stdio interface. One call should be cheap
5715        enough here - and may even be a macro allowing compile
5716        time optimization.
5717      */
5718
5719     if (PerlIO_fast_gets(fp)) {
5720
5721     /*
5722      * We're going to steal some values from the stdio struct
5723      * and put EVERYTHING in the innermost loop into registers.
5724      */
5725     register STDCHAR *ptr;
5726     STRLEN bpx;
5727     I32 shortbuffered;
5728
5729 #if defined(VMS) && defined(PERLIO_IS_STDIO)
5730     /* An ungetc()d char is handled separately from the regular
5731      * buffer, so we getc() it back out and stuff it in the buffer.
5732      */
5733     i = PerlIO_getc(fp);
5734     if (i == EOF) return 0;
5735     *(--((*fp)->_ptr)) = (unsigned char) i;
5736     (*fp)->_cnt++;
5737 #endif
5738
5739     /* Here is some breathtakingly efficient cheating */
5740
5741     cnt = PerlIO_get_cnt(fp);                   /* get count into register */
5742     (void)SvPOK_only(sv);               /* validate pointer */
5743     if ((I32)(SvLEN(sv) - append) <= cnt + 1) { /* make sure we have the room */
5744         if (cnt > 80 && (I32)SvLEN(sv) > append) {
5745             shortbuffered = cnt - SvLEN(sv) + append + 1;
5746             cnt -= shortbuffered;
5747         }
5748         else {
5749             shortbuffered = 0;
5750             /* remember that cnt can be negative */
5751             SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
5752         }
5753     }
5754     else
5755         shortbuffered = 0;
5756     bp = (STDCHAR*)SvPVX(sv) + append;  /* move these two too to registers */
5757     ptr = (STDCHAR*)PerlIO_get_ptr(fp);
5758     DEBUG_P(PerlIO_printf(Perl_debug_log,
5759         "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
5760     DEBUG_P(PerlIO_printf(Perl_debug_log,
5761         "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
5762                PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
5763                PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
5764     for (;;) {
5765       screamer:
5766         if (cnt > 0) {
5767             if (rslen) {
5768                 while (cnt > 0) {                    /* this     |  eat */
5769                     cnt--;
5770                     if ((*bp++ = *ptr++) == rslast)  /* really   |  dust */
5771                         goto thats_all_folks;        /* screams  |  sed :-) */
5772                 }
5773             }
5774             else {
5775                 Copy(ptr, bp, cnt, char);            /* this     |  eat */
5776                 bp += cnt;                           /* screams  |  dust */
5777                 ptr += cnt;                          /* louder   |  sed :-) */
5778                 cnt = 0;
5779             }
5780         }
5781         
5782         if (shortbuffered) {            /* oh well, must extend */
5783             cnt = shortbuffered;
5784             shortbuffered = 0;
5785             bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
5786             SvCUR_set(sv, bpx);
5787             SvGROW(sv, SvLEN(sv) + append + cnt + 2);
5788             bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
5789             continue;
5790         }
5791
5792         DEBUG_P(PerlIO_printf(Perl_debug_log,
5793                               "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
5794                               PTR2UV(ptr),(long)cnt));
5795         PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
5796 #if 0
5797         DEBUG_P(PerlIO_printf(Perl_debug_log,
5798             "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
5799             PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
5800             PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
5801 #endif
5802         /* This used to call 'filbuf' in stdio form, but as that behaves like
5803            getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
5804            another abstraction.  */
5805         i   = PerlIO_getc(fp);          /* get more characters */
5806 #if 0
5807         DEBUG_P(PerlIO_printf(Perl_debug_log,
5808             "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
5809             PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
5810             PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
5811 #endif
5812         cnt = PerlIO_get_cnt(fp);
5813         ptr = (STDCHAR*)PerlIO_get_ptr(fp);     /* reregisterize cnt and ptr */
5814         DEBUG_P(PerlIO_printf(Perl_debug_log,
5815             "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
5816
5817         if (i == EOF)                   /* all done for ever? */
5818             goto thats_really_all_folks;
5819
5820         bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
5821         SvCUR_set(sv, bpx);
5822         SvGROW(sv, bpx + cnt + 2);
5823         bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
5824
5825         *bp++ = (STDCHAR)i;             /* store character from PerlIO_getc */
5826
5827         if (rslen && (STDCHAR)i == rslast)  /* all done for now? */
5828             goto thats_all_folks;
5829     }
5830
5831 thats_all_folks:
5832     if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX(sv)) < rslen) ||
5833           memNE((char*)bp - rslen, rsptr, rslen))
5834         goto screamer;                          /* go back to the fray */
5835 thats_really_all_folks:
5836     if (shortbuffered)
5837         cnt += shortbuffered;
5838         DEBUG_P(PerlIO_printf(Perl_debug_log,
5839             "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
5840     PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt);  /* put these back or we're in trouble */
5841     DEBUG_P(PerlIO_printf(Perl_debug_log,
5842         "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
5843         PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
5844         PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
5845     *bp = '\0';
5846     SvCUR_set(sv, bp - (STDCHAR*)SvPVX(sv));    /* set length */
5847     DEBUG_P(PerlIO_printf(Perl_debug_log,
5848         "Screamer: done, len=%ld, string=|%.*s|\n",
5849         (long)SvCUR(sv),(int)SvCUR(sv),SvPVX(sv)));
5850     }
5851    else
5852     {
5853 #ifndef EPOC
5854        /*The big, slow, and stupid way */
5855         STDCHAR buf[8192];
5856 #else
5857         /* Need to work around EPOC SDK features          */
5858         /* On WINS: MS VC5 generates calls to _chkstk,    */
5859         /* if a `large' stack frame is allocated          */
5860         /* gcc on MARM does not generate calls like these */
5861         STDCHAR buf[1024];
5862 #endif
5863
5864 screamer2:
5865         if (rslen) {
5866             register STDCHAR *bpe = buf + sizeof(buf);
5867             bp = buf;
5868             while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
5869                 ; /* keep reading */
5870             cnt = bp - buf;
5871         }
5872         else {
5873             cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
5874             /* Accomodate broken VAXC compiler, which applies U8 cast to
5875              * both args of ?: operator, causing EOF to change into 255
5876              */
5877             if (cnt) { i = (U8)buf[cnt - 1]; } else { i = EOF; }
5878         }
5879
5880         if (append)
5881             sv_catpvn(sv, (char *) buf, cnt);
5882         else
5883             sv_setpvn(sv, (char *) buf, cnt);
5884
5885         if (i != EOF &&                 /* joy */
5886             (!rslen ||
5887              SvCUR(sv) < rslen ||
5888              memNE(SvPVX(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
5889         {
5890             append = -1;
5891             /*
5892              * If we're reading from a TTY and we get a short read,
5893              * indicating that the user hit his EOF character, we need
5894              * to notice it now, because if we try to read from the TTY
5895              * again, the EOF condition will disappear.
5896              *
5897              * The comparison of cnt to sizeof(buf) is an optimization
5898              * that prevents unnecessary calls to feof().
5899              *
5900              * - jik 9/25/96
5901              */
5902             if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
5903                 goto screamer2;
5904         }
5905     }
5906
5907     if (rspara) {               /* have to do this both before and after */
5908         while (i != EOF) {      /* to make sure file boundaries work right */
5909             i = PerlIO_getc(fp);
5910             if (i != '\n') {
5911                 PerlIO_ungetc(fp,i);
5912                 break;
5913             }
5914         }
5915     }
5916
5917     if (PerlIO_isutf8(fp))
5918         SvUTF8_on(sv);
5919     else
5920         SvUTF8_off(sv);
5921
5922     return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
5923 }
5924
5925 /*
5926 =for apidoc sv_inc
5927
5928 Auto-increment of the value in the SV, doing string to numeric conversion
5929 if necessary. Handles 'get' magic.
5930
5931 =cut
5932 */
5933
5934 void
5935 Perl_sv_inc(pTHX_ register SV *sv)
5936 {
5937     register char *d;
5938     int flags;
5939
5940     if (!sv)
5941         return;
5942     if (SvGMAGICAL(sv))
5943         mg_get(sv);
5944     if (SvTHINKFIRST(sv)) {
5945         if (SvREADONLY(sv) && SvFAKE(sv))
5946             sv_force_normal(sv);
5947         if (SvREADONLY(sv)) {
5948             if (PL_curcop != &PL_compiling)
5949                 Perl_croak(aTHX_ PL_no_modify);
5950         }
5951         if (SvROK(sv)) {
5952             IV i;
5953             if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
5954                 return;
5955             i = PTR2IV(SvRV(sv));
5956             sv_unref(sv);
5957             sv_setiv(sv, i);
5958         }
5959     }
5960     flags = SvFLAGS(sv);
5961     if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
5962         /* It's (privately or publicly) a float, but not tested as an
5963            integer, so test it to see. */
5964         (void) SvIV(sv);
5965         flags = SvFLAGS(sv);
5966     }
5967     if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
5968         /* It's publicly an integer, or privately an integer-not-float */
5969 #ifdef PERL_PRESERVE_IVUV
5970       oops_its_int:
5971 #endif
5972         if (SvIsUV(sv)) {
5973             if (SvUVX(sv) == UV_MAX)
5974                 sv_setnv(sv, UV_MAX_P1);
5975             else
5976                 (void)SvIOK_only_UV(sv);
5977                 ++SvUVX(sv);
5978         } else {
5979             if (SvIVX(sv) == IV_MAX)
5980                 sv_setuv(sv, (UV)IV_MAX + 1);
5981             else {
5982                 (void)SvIOK_only(sv);
5983                 ++SvIVX(sv);
5984             }   
5985         }
5986         return;
5987     }
5988     if (flags & SVp_NOK) {
5989         (void)SvNOK_only(sv);
5990         SvNVX(sv) += 1.0;
5991         return;
5992     }
5993
5994     if (!(flags & SVp_POK) || !*SvPVX(sv)) {
5995         if ((flags & SVTYPEMASK) < SVt_PVIV)
5996             sv_upgrade(sv, SVt_IV);
5997         (void)SvIOK_only(sv);
5998         SvIVX(sv) = 1;
5999         return;
6000     }
6001     d = SvPVX(sv);
6002     while (isALPHA(*d)) d++;
6003     while (isDIGIT(*d)) d++;
6004     if (*d) {
6005 #ifdef PERL_PRESERVE_IVUV
6006         /* Got to punt this as an integer if needs be, but we don't issue
6007            warnings. Probably ought to make the sv_iv_please() that does
6008            the conversion if possible, and silently.  */
6009         int numtype = grok_number(SvPVX(sv), SvCUR(sv), NULL);
6010         if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6011             /* Need to try really hard to see if it's an integer.
6012                9.22337203685478e+18 is an integer.
6013                but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6014                so $a="9.22337203685478e+18"; $a+0; $a++
6015                needs to be the same as $a="9.22337203685478e+18"; $a++
6016                or we go insane. */
6017         
6018             (void) sv_2iv(sv);
6019             if (SvIOK(sv))
6020                 goto oops_its_int;
6021
6022             /* sv_2iv *should* have made this an NV */
6023             if (flags & SVp_NOK) {
6024                 (void)SvNOK_only(sv);
6025                 SvNVX(sv) += 1.0;
6026                 return;
6027             }
6028             /* I don't think we can get here. Maybe I should assert this
6029                And if we do get here I suspect that sv_setnv will croak. NWC
6030                Fall through. */
6031 #if defined(USE_LONG_DOUBLE)
6032             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",
6033                                   SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6034 #else
6035             DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_inc punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"NVgf"\n",
6036                                   SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6037 #endif
6038         }
6039 #endif /* PERL_PRESERVE_IVUV */
6040         sv_setnv(sv,Atof(SvPVX(sv)) + 1.0);
6041         return;
6042     }
6043     d--;
6044     while (d >= SvPVX(sv)) {
6045         if (isDIGIT(*d)) {
6046             if (++*d <= '9')
6047                 return;
6048             *(d--) = '0';
6049         }
6050         else {
6051 #ifdef EBCDIC
6052             /* MKS: The original code here died if letters weren't consecutive.
6053              * at least it didn't have to worry about non-C locales.  The
6054              * new code assumes that ('z'-'a')==('Z'-'A'), letters are
6055              * arranged in order (although not consecutively) and that only
6056              * [A-Za-z] are accepted by isALPHA in the C locale.
6057              */
6058             if (*d != 'z' && *d != 'Z') {
6059                 do { ++*d; } while (!isALPHA(*d));
6060                 return;
6061             }
6062             *(d--) -= 'z' - 'a';
6063 #else
6064             ++*d;
6065             if (isALPHA(*d))
6066                 return;
6067             *(d--) -= 'z' - 'a' + 1;
6068 #endif
6069         }
6070     }
6071     /* oh,oh, the number grew */
6072     SvGROW(sv, SvCUR(sv) + 2);
6073     SvCUR(sv)++;
6074     for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
6075         *d = d[-1];
6076     if (isDIGIT(d[1]))
6077         *d = '1';
6078     else
6079         *d = d[1];
6080 }
6081
6082 /*
6083 =for apidoc sv_dec
6084
6085 Auto-decrement of the value in the SV, doing string to numeric conversion
6086 if necessary. Handles 'get' magic.
6087
6088 =cut
6089 */
6090
6091 void
6092 Perl_sv_dec(pTHX_ register SV *sv)
6093 {
6094     int flags;
6095
6096     if (!sv)
6097         return;
6098     if (SvGMAGICAL(sv))
6099         mg_get(sv);
6100     if (SvTHINKFIRST(sv)) {
6101         if (SvREADONLY(sv) && SvFAKE(sv))
6102             sv_force_normal(sv);
6103         if (SvREADONLY(sv)) {
6104             if (PL_curcop != &PL_compiling)
6105                 Perl_croak(aTHX_ PL_no_modify);
6106         }
6107         if (SvROK(sv)) {
6108             IV i;
6109             if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
6110                 return;
6111             i = PTR2IV(SvRV(sv));
6112             sv_unref(sv);
6113             sv_setiv(sv, i);
6114         }
6115     }
6116     /* Unlike sv_inc we don't have to worry about string-never-numbers
6117        and keeping them magic. But we mustn't warn on punting */
6118     flags = SvFLAGS(sv);
6119     if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6120         /* It's publicly an integer, or privately an integer-not-float */
6121 #ifdef PERL_PRESERVE_IVUV
6122       oops_its_int:
6123 #endif
6124         if (SvIsUV(sv)) {
6125             if (SvUVX(sv) == 0) {
6126                 (void)SvIOK_only(sv);
6127                 SvIVX(sv) = -1;
6128             }
6129             else {
6130                 (void)SvIOK_only_UV(sv);
6131                 --SvUVX(sv);
6132             }   
6133         } else {
6134             if (SvIVX(sv) == IV_MIN)
6135                 sv_setnv(sv, (NV)IV_MIN - 1.0);
6136             else {
6137                 (void)SvIOK_only(sv);
6138                 --SvIVX(sv);
6139             }   
6140         }
6141         return;
6142     }
6143     if (flags & SVp_NOK) {
6144         SvNVX(sv) -= 1.0;
6145         (void)SvNOK_only(sv);
6146         return;
6147     }
6148     if (!(flags & SVp_POK)) {
6149         if ((flags & SVTYPEMASK) < SVt_PVNV)
6150             sv_upgrade(sv, SVt_NV);
6151         SvNVX(sv) = -1.0;
6152         (void)SvNOK_only(sv);
6153         return;
6154     }
6155 #ifdef PERL_PRESERVE_IVUV
6156     {
6157         int numtype = grok_number(SvPVX(sv), SvCUR(sv), NULL);
6158         if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6159             /* Need to try really hard to see if it's an integer.
6160                9.22337203685478e+18 is an integer.
6161                but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6162                so $a="9.22337203685478e+18"; $a+0; $a--
6163                needs to be the same as $a="9.22337203685478e+18"; $a--
6164                or we go insane. */
6165         
6166             (void) sv_2iv(sv);
6167             if (SvIOK(sv))
6168                 goto oops_its_int;
6169
6170             /* sv_2iv *should* have made this an NV */
6171             if (flags & SVp_NOK) {
6172                 (void)SvNOK_only(sv);
6173                 SvNVX(sv) -= 1.0;
6174                 return;
6175             }
6176             /* I don't think we can get here. Maybe I should assert this
6177                And if we do get here I suspect that sv_setnv will croak. NWC
6178                Fall through. */
6179 #if defined(USE_LONG_DOUBLE)
6180             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",
6181                                   SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6182 #else
6183             DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_dec punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"NVgf"\n",
6184                                   SvPVX(sv), SvIVX(sv), SvNVX(sv)));
6185 #endif
6186         }
6187     }
6188 #endif /* PERL_PRESERVE_IVUV */
6189     sv_setnv(sv,Atof(SvPVX(sv)) - 1.0); /* punt */
6190 }
6191
6192 /*
6193 =for apidoc sv_mortalcopy
6194
6195 Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
6196 The new SV is marked as mortal. It will be destroyed "soon", either by an
6197 explicit call to FREETMPS, or by an implicit call at places such as
6198 statement boundaries.  See also C<sv_newmortal> and C<sv_2mortal>.
6199
6200 =cut
6201 */
6202
6203 /* Make a string that will exist for the duration of the expression
6204  * evaluation.  Actually, it may have to last longer than that, but
6205  * hopefully we won't free it until it has been assigned to a
6206  * permanent location. */
6207
6208 SV *
6209 Perl_sv_mortalcopy(pTHX_ SV *oldstr)
6210 {
6211     register SV *sv;
6212
6213     new_SV(sv);
6214     sv_setsv(sv,oldstr);
6215     EXTEND_MORTAL(1);
6216     PL_tmps_stack[++PL_tmps_ix] = sv;
6217     SvTEMP_on(sv);
6218     return sv;
6219 }
6220
6221 /*
6222 =for apidoc sv_newmortal
6223
6224 Creates a new null SV which is mortal.  The reference count of the SV is
6225 set to 1. It will be destroyed "soon", either by an explicit call to
6226 FREETMPS, or by an implicit call at places such as statement boundaries.
6227 See also C<sv_mortalcopy> and C<sv_2mortal>.
6228
6229 =cut
6230 */
6231
6232 SV *
6233 Perl_sv_newmortal(pTHX)
6234 {
6235     register SV *sv;
6236
6237     new_SV(sv);
6238     SvFLAGS(sv) = SVs_TEMP;
6239     EXTEND_MORTAL(1);
6240     PL_tmps_stack[++PL_tmps_ix] = sv;
6241     return sv;
6242 }
6243
6244 /*
6245 =for apidoc sv_2mortal
6246
6247 Marks an existing SV as mortal.  The SV will be destroyed "soon", either
6248 by an explicit call to FREETMPS, or by an implicit call at places such as
6249 statement boundaries.  See also C<sv_newmortal> and C<sv_mortalcopy>.
6250
6251 =cut
6252 */
6253
6254 SV *
6255 Perl_sv_2mortal(pTHX_ register SV *sv)
6256 {
6257     if (!sv)
6258         return sv;
6259     if (SvREADONLY(sv) && SvIMMORTAL(sv))
6260         return sv;
6261     EXTEND_MORTAL(1);
6262     PL_tmps_stack[++PL_tmps_ix] = sv;
6263     SvTEMP_on(sv);
6264     return sv;
6265 }
6266
6267 /*
6268 =for apidoc newSVpv
6269
6270 Creates a new SV and copies a string into it.  The reference count for the
6271 SV is set to 1.  If C<len> is zero, Perl will compute the length using
6272 strlen().  For efficiency, consider using C<newSVpvn> instead.
6273
6274 =cut
6275 */
6276
6277 SV *
6278 Perl_newSVpv(pTHX_ const char *s, STRLEN len)
6279 {
6280     register SV *sv;
6281
6282     new_SV(sv);
6283     if (!len)
6284         len = strlen(s);
6285     sv_setpvn(sv,s,len);
6286     return sv;
6287 }
6288
6289 /*
6290 =for apidoc newSVpvn
6291
6292 Creates a new SV and copies a string into it.  The reference count for the
6293 SV is set to 1.  Note that if C<len> is zero, Perl will create a zero length
6294 string.  You are responsible for ensuring that the source string is at least
6295 C<len> bytes long.
6296
6297 =cut
6298 */
6299
6300 SV *
6301 Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
6302 {
6303     register SV *sv;
6304
6305     new_SV(sv);
6306     sv_setpvn(sv,s,len);
6307     return sv;
6308 }
6309
6310 /*
6311 =for apidoc newSVpvn_share
6312
6313 Creates a new SV with its SvPVX pointing to a shared string in the string
6314 table. If the string does not already exist in the table, it is created
6315 first.  Turns on READONLY and FAKE.  The string's hash is stored in the UV
6316 slot of the SV; if the C<hash> parameter is non-zero, that value is used;
6317 otherwise the hash is computed.  The idea here is that as the string table
6318 is used for shared hash keys these strings will have SvPVX == HeKEY and
6319 hash lookup will avoid string compare.
6320
6321 =cut
6322 */
6323
6324 SV *
6325 Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
6326 {
6327     register SV *sv;
6328     bool is_utf8 = FALSE;
6329     if (len < 0) {
6330         STRLEN tmplen = -len;
6331         is_utf8 = TRUE;
6332         /* See the note in hv.c:hv_fetch() --jhi */
6333         src = (char*)bytes_from_utf8((U8*)src, &tmplen, &is_utf8);
6334         len = tmplen;
6335     }
6336     if (!hash)
6337         PERL_HASH(hash, src, len);
6338     new_SV(sv);
6339     sv_upgrade(sv, SVt_PVIV);
6340     SvPVX(sv) = sharepvn(src, is_utf8?-len:len, hash);
6341     SvCUR(sv) = len;
6342     SvUVX(sv) = hash;
6343     SvLEN(sv) = 0;
6344     SvREADONLY_on(sv);
6345     SvFAKE_on(sv);
6346     SvPOK_on(sv);
6347     if (is_utf8)
6348         SvUTF8_on(sv);
6349     return sv;
6350 }
6351
6352
6353 #if defined(PERL_IMPLICIT_CONTEXT)
6354
6355 /* pTHX_ magic can't cope with varargs, so this is a no-context
6356  * version of the main function, (which may itself be aliased to us).
6357  * Don't access this version directly.
6358  */
6359
6360 SV *
6361 Perl_newSVpvf_nocontext(const char* pat, ...)
6362 {
6363     dTHX;
6364     register SV *sv;
6365     va_list args;
6366     va_start(args, pat);
6367     sv = vnewSVpvf(pat, &args);
6368     va_end(args);
6369     return sv;
6370 }
6371 #endif
6372
6373 /*
6374 =for apidoc newSVpvf
6375
6376 Creates a new SV and initializes it with the string formatted like
6377 C<sprintf>.
6378
6379 =cut
6380 */
6381
6382 SV *
6383 Perl_newSVpvf(pTHX_ const char* pat, ...)
6384 {
6385     register SV *sv;
6386     va_list args;
6387     va_start(args, pat);
6388     sv = vnewSVpvf(pat, &args);
6389     va_end(args);
6390     return sv;
6391 }
6392
6393 /* backend for newSVpvf() and newSVpvf_nocontext() */
6394
6395 SV *
6396 Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
6397 {
6398     register SV *sv;
6399     new_SV(sv);
6400     sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
6401     return sv;
6402 }
6403
6404 /*
6405 =for apidoc newSVnv
6406
6407 Creates a new SV and copies a floating point value into it.
6408 The reference count for the SV is set to 1.
6409
6410 =cut
6411 */
6412
6413 SV *
6414 Perl_newSVnv(pTHX_ NV n)
6415 {
6416     register SV *sv;
6417
6418     new_SV(sv);
6419     sv_setnv(sv,n);
6420     return sv;
6421 }
6422
6423 /*
6424 =for apidoc newSViv
6425
6426 Creates a new SV and copies an integer into it.  The reference count for the
6427 SV is set to 1.
6428
6429 =cut
6430 */
6431
6432 SV *
6433 Perl_newSViv(pTHX_ IV i)
6434 {
6435     register SV *sv;
6436
6437     new_SV(sv);
6438     sv_setiv(sv,i);
6439     return sv;
6440 }
6441
6442 /*
6443 =for apidoc newSVuv
6444
6445 Creates a new SV and copies an unsigned integer into it.
6446 The reference count for the SV is set to 1.
6447
6448 =cut
6449 */
6450
6451 SV *
6452 Perl_newSVuv(pTHX_ UV u)
6453 {
6454     register SV *sv;
6455
6456     new_SV(sv);
6457     sv_setuv(sv,u);
6458     return sv;
6459 }
6460
6461 /*
6462 =for apidoc newRV_noinc
6463
6464 Creates an RV wrapper for an SV.  The reference count for the original
6465 SV is B<not> incremented.
6466
6467 =cut
6468 */
6469
6470 SV *
6471 Perl_newRV_noinc(pTHX_ SV *tmpRef)
6472 {
6473     register SV *sv;
6474
6475     new_SV(sv);
6476     sv_upgrade(sv, SVt_RV);
6477     SvTEMP_off(tmpRef);
6478     SvRV(sv) = tmpRef;
6479     SvROK_on(sv);
6480     return sv;
6481 }
6482
6483 /* newRV_inc is the official function name to use now.
6484  * newRV_inc is in fact #defined to newRV in sv.h
6485  */
6486
6487 SV *
6488 Perl_newRV(pTHX_ SV *tmpRef)
6489 {
6490     return newRV_noinc(SvREFCNT_inc(tmpRef));
6491 }
6492
6493 /*
6494 =for apidoc newSVsv
6495
6496 Creates a new SV which is an exact duplicate of the original SV.
6497 (Uses C<sv_setsv>).
6498
6499 =cut
6500 */
6501
6502 SV *
6503 Perl_newSVsv(pTHX_ register SV *old)
6504 {
6505     register SV *sv;
6506
6507     if (!old)
6508         return Nullsv;
6509     if (SvTYPE(old) == SVTYPEMASK) {
6510         if (ckWARN_d(WARN_INTERNAL))
6511             Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
6512         return Nullsv;
6513     }
6514     new_SV(sv);
6515     if (SvTEMP(old)) {
6516         SvTEMP_off(old);
6517         sv_setsv(sv,old);
6518         SvTEMP_on(old);
6519     }
6520     else
6521         sv_setsv(sv,old);
6522     return sv;
6523 }
6524
6525 /*
6526 =for apidoc sv_reset
6527
6528 Underlying implementation for the C<reset> Perl function.
6529 Note that the perl-level function is vaguely deprecated.
6530
6531 =cut
6532 */
6533
6534 void
6535 Perl_sv_reset(pTHX_ register char *s, HV *stash)
6536 {
6537     register HE *entry;
6538     register GV *gv;
6539     register SV *sv;
6540     register I32 i;
6541     register PMOP *pm;
6542     register I32 max;
6543     char todo[PERL_UCHAR_MAX+1];
6544
6545     if (!stash)
6546         return;
6547
6548     if (!*s) {          /* reset ?? searches */
6549         for (pm = HvPMROOT(stash); pm; pm = pm->op_pmnext) {
6550             pm->op_pmdynflags &= ~PMdf_USED;
6551         }
6552         return;
6553     }
6554
6555     /* reset variables */
6556
6557     if (!HvARRAY(stash))
6558         return;
6559
6560     Zero(todo, 256, char);
6561     while (*s) {
6562         i = (unsigned char)*s;
6563         if (s[1] == '-') {
6564             s += 2;
6565         }
6566         max = (unsigned char)*s++;
6567         for ( ; i <= max; i++) {
6568             todo[i] = 1;
6569         }
6570         for (i = 0; i <= (I32) HvMAX(stash); i++) {
6571             for (entry = HvARRAY(stash)[i];
6572                  entry;
6573                  entry = HeNEXT(entry))
6574             {
6575                 if (!todo[(U8)*HeKEY(entry)])
6576                     continue;
6577                 gv = (GV*)HeVAL(entry);
6578                 sv = GvSV(gv);
6579                 if (SvTHINKFIRST(sv)) {
6580                     if (!SvREADONLY(sv) && SvROK(sv))
6581                         sv_unref(sv);
6582                     continue;
6583                 }
6584                 (void)SvOK_off(sv);
6585                 if (SvTYPE(sv) >= SVt_PV) {
6586                     SvCUR_set(sv, 0);
6587                     if (SvPVX(sv) != Nullch)
6588                         *SvPVX(sv) = '\0';
6589                     SvTAINT(sv);
6590                 }
6591                 if (GvAV(gv)) {
6592                     av_clear(GvAV(gv));
6593                 }
6594                 if (GvHV(gv) && !HvNAME(GvHV(gv))) {
6595                     hv_clear(GvHV(gv));
6596 #ifdef USE_ENVIRON_ARRAY
6597                     if (gv == PL_envgv)
6598                         environ[0] = Nullch;
6599 #endif
6600                 }
6601             }
6602         }
6603     }
6604 }
6605
6606 /*
6607 =for apidoc sv_2io
6608
6609 Using various gambits, try to get an IO from an SV: the IO slot if its a
6610 GV; or the recursive result if we're an RV; or the IO slot of the symbol
6611 named after the PV if we're a string.
6612
6613 =cut
6614 */
6615
6616 IO*
6617 Perl_sv_2io(pTHX_ SV *sv)
6618 {
6619     IO* io;
6620     GV* gv;
6621     STRLEN n_a;
6622
6623     switch (SvTYPE(sv)) {
6624     case SVt_PVIO:
6625         io = (IO*)sv;
6626         break;
6627     case SVt_PVGV:
6628         gv = (GV*)sv;
6629         io = GvIO(gv);
6630         if (!io)
6631             Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
6632         break;
6633     default:
6634         if (!SvOK(sv))
6635             Perl_croak(aTHX_ PL_no_usym, "filehandle");
6636         if (SvROK(sv))
6637             return sv_2io(SvRV(sv));
6638         gv = gv_fetchpv(SvPV(sv,n_a), FALSE, SVt_PVIO);
6639         if (gv)
6640             io = GvIO(gv);
6641         else
6642             io = 0;
6643         if (!io)
6644             Perl_croak(aTHX_ "Bad filehandle: %s", SvPV(sv,n_a));
6645         break;
6646     }
6647     return io;
6648 }
6649
6650 /*
6651 =for apidoc sv_2cv
6652
6653 Using various gambits, try to get a CV from an SV; in addition, try if
6654 possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
6655
6656 =cut
6657 */
6658
6659 CV *
6660 Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
6661 {
6662     GV *gv = Nullgv;
6663     CV *cv = Nullcv;
6664     STRLEN n_a;
6665
6666     if (!sv)
6667         return *gvp = Nullgv, Nullcv;
6668     switch (SvTYPE(sv)) {
6669     case SVt_PVCV:
6670         *st = CvSTASH(sv);
6671         *gvp = Nullgv;
6672         return (CV*)sv;
6673     case SVt_PVHV:
6674     case SVt_PVAV:
6675         *gvp = Nullgv;
6676         return Nullcv;
6677     case SVt_PVGV:
6678         gv = (GV*)sv;
6679         *gvp = gv;
6680         *st = GvESTASH(gv);
6681         goto fix_gv;
6682
6683     default:
6684         if (SvGMAGICAL(sv))
6685             mg_get(sv);
6686         if (SvROK(sv)) {
6687             SV **sp = &sv;              /* Used in tryAMAGICunDEREF macro. */
6688             tryAMAGICunDEREF(to_cv);
6689
6690             sv = SvRV(sv);
6691             if (SvTYPE(sv) == SVt_PVCV) {
6692                 cv = (CV*)sv;
6693                 *gvp = Nullgv;
6694                 *st = CvSTASH(cv);
6695                 return cv;
6696             }
6697             else if(isGV(sv))
6698                 gv = (GV*)sv;
6699             else
6700                 Perl_croak(aTHX_ "Not a subroutine reference");
6701         }
6702         else if (isGV(sv))
6703             gv = (GV*)sv;
6704         else
6705             gv = gv_fetchpv(SvPV(sv, n_a), lref, SVt_PVCV);
6706         *gvp = gv;
6707         if (!gv)
6708             return Nullcv;
6709         *st = GvESTASH(gv);
6710     fix_gv:
6711         if (lref && !GvCVu(gv)) {
6712             SV *tmpsv;
6713             ENTER;
6714             tmpsv = NEWSV(704,0);
6715             gv_efullname3(tmpsv, gv, Nullch);
6716             /* XXX this is probably not what they think they're getting.
6717              * It has the same effect as "sub name;", i.e. just a forward
6718              * declaration! */
6719             newSUB(start_subparse(FALSE, 0),
6720                    newSVOP(OP_CONST, 0, tmpsv),
6721                    Nullop,
6722                    Nullop);
6723             LEAVE;
6724             if (!GvCVu(gv))
6725                 Perl_croak(aTHX_ "Unable to create sub named \"%s\"", SvPV(sv,n_a));
6726         }
6727         return GvCVu(gv);
6728     }
6729 }
6730
6731 /*
6732 =for apidoc sv_true
6733
6734 Returns true if the SV has a true value by Perl's rules.
6735 Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
6736 instead use an in-line version.
6737
6738 =cut
6739 */
6740
6741 I32
6742 Perl_sv_true(pTHX_ register SV *sv)
6743 {
6744     if (!sv)
6745         return 0;
6746     if (SvPOK(sv)) {
6747         register XPV* tXpv;
6748         if ((tXpv = (XPV*)SvANY(sv)) &&
6749                 (tXpv->xpv_cur > 1 ||
6750                 (tXpv->xpv_cur && *tXpv->xpv_pv != '0')))
6751             return 1;
6752         else
6753             return 0;
6754     }
6755     else {
6756         if (SvIOK(sv))
6757             return SvIVX(sv) != 0;
6758         else {
6759             if (SvNOK(sv))
6760                 return SvNVX(sv) != 0.0;
6761             else
6762                 return sv_2bool(sv);
6763         }
6764     }
6765 }
6766
6767 /*
6768 =for apidoc sv_iv
6769
6770 A private implementation of the C<SvIVx> macro for compilers which can't
6771 cope with complex macro expressions. Always use the macro instead.
6772
6773 =cut
6774 */
6775
6776 IV
6777 Perl_sv_iv(pTHX_ register SV *sv)
6778 {
6779     if (SvIOK(sv)) {
6780         if (SvIsUV(sv))
6781             return (IV)SvUVX(sv);
6782         return SvIVX(sv);
6783     }
6784     return sv_2iv(sv);
6785 }
6786
6787 /*
6788 =for apidoc sv_uv
6789
6790 A private implementation of the C<SvUVx> macro for compilers which can't
6791 cope with complex macro expressions. Always use the macro instead.
6792
6793 =cut
6794 */
6795
6796 UV
6797 Perl_sv_uv(pTHX_ register SV *sv)
6798 {
6799     if (SvIOK(sv)) {
6800         if (SvIsUV(sv))
6801             return SvUVX(sv);
6802         return (UV)SvIVX(sv);
6803     }
6804     return sv_2uv(sv);
6805 }
6806
6807 /*
6808 =for apidoc sv_nv
6809
6810 A private implementation of the C<SvNVx> macro for compilers which can't
6811 cope with complex macro expressions. Always use the macro instead.
6812
6813 =cut
6814 */
6815
6816 NV
6817 Perl_sv_nv(pTHX_ register SV *sv)
6818 {
6819     if (SvNOK(sv))
6820         return SvNVX(sv);
6821     return sv_2nv(sv);
6822 }
6823
6824 /*
6825 =for apidoc sv_pv
6826
6827 Use the C<SvPV_nolen> macro instead
6828
6829 =for apidoc sv_pvn
6830
6831 A private implementation of the C<SvPV> macro for compilers which can't
6832 cope with complex macro expressions. Always use the macro instead.
6833
6834 =cut
6835 */
6836
6837 char *
6838 Perl_sv_pvn(pTHX_ SV *sv, STRLEN *lp)
6839 {
6840     if (SvPOK(sv)) {
6841         *lp = SvCUR(sv);
6842         return SvPVX(sv);
6843     }
6844     return sv_2pv(sv, lp);
6845 }
6846
6847
6848 char *
6849 Perl_sv_pvn_nomg(pTHX_ register SV *sv, STRLEN *lp)
6850 {
6851     if (SvPOK(sv)) {
6852         *lp = SvCUR(sv);
6853         return SvPVX(sv);
6854     }
6855     return sv_2pv_flags(sv, lp, 0);
6856 }
6857
6858 /*
6859 =for apidoc sv_pvn_force
6860
6861 Get a sensible string out of the SV somehow.
6862 A private implementation of the C<SvPV_force> macro for compilers which
6863 can't cope with complex macro expressions. Always use the macro instead.
6864
6865 =for apidoc sv_pvn_force_flags
6866
6867 Get a sensible string out of the SV somehow.
6868 If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
6869 appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
6870 implemented in terms of this function.
6871 You normally want to use the various wrapper macros instead: see
6872 C<SvPV_force> and C<SvPV_force_nomg>
6873
6874 =cut
6875 */
6876
6877 char *
6878 Perl_sv_pvn_force_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
6879 {
6880     char *s = NULL;
6881
6882     if (SvTHINKFIRST(sv) && !SvROK(sv))
6883         sv_force_normal(sv);
6884
6885     if (SvPOK(sv)) {
6886         *lp = SvCUR(sv);
6887     }
6888     else {
6889         if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
6890             Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
6891                 OP_NAME(PL_op));
6892         }
6893         else
6894             s = sv_2pv_flags(sv, lp, flags);
6895         if (s != SvPVX(sv)) {   /* Almost, but not quite, sv_setpvn() */
6896             STRLEN len = *lp;
6897         
6898             if (SvROK(sv))
6899                 sv_unref(sv);
6900             (void)SvUPGRADE(sv, SVt_PV);                /* Never FALSE */
6901             SvGROW(sv, len + 1);
6902             Move(s,SvPVX(sv),len,char);
6903             SvCUR_set(sv, len);
6904             *SvEND(sv) = '\0';
6905         }
6906         if (!SvPOK(sv)) {
6907             SvPOK_on(sv);               /* validate pointer */
6908             SvTAINT(sv);
6909             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
6910                                   PTR2UV(sv),SvPVX(sv)));
6911         }
6912     }
6913     return SvPVX(sv);
6914 }
6915
6916 /*
6917 =for apidoc sv_pvbyte
6918
6919 Use C<SvPVbyte_nolen> instead.
6920
6921 =for apidoc sv_pvbyten
6922
6923 A private implementation of the C<SvPVbyte> macro for compilers
6924 which can't cope with complex macro expressions. Always use the macro
6925 instead.
6926
6927 =cut
6928 */
6929
6930 char *
6931 Perl_sv_pvbyten(pTHX_ SV *sv, STRLEN *lp)
6932 {
6933     sv_utf8_downgrade(sv,0);
6934     return sv_pvn(sv,lp);
6935 }
6936
6937 /*
6938 =for apidoc sv_pvbyten_force
6939
6940 A private implementation of the C<SvPVbytex_force> macro for compilers
6941 which can't cope with complex macro expressions. Always use the macro
6942 instead.
6943
6944 =cut
6945 */
6946
6947 char *
6948 Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
6949 {
6950     sv_utf8_downgrade(sv,0);
6951     return sv_pvn_force(sv,lp);
6952 }
6953
6954 /*
6955 =for apidoc sv_pvutf8
6956
6957 Use the C<SvPVutf8_nolen> macro instead
6958
6959 =for apidoc sv_pvutf8n
6960
6961 A private implementation of the C<SvPVutf8> macro for compilers
6962 which can't cope with complex macro expressions. Always use the macro
6963 instead.
6964
6965 =cut
6966 */
6967
6968 char *
6969 Perl_sv_pvutf8n(pTHX_ SV *sv, STRLEN *lp)
6970 {
6971     sv_utf8_upgrade(sv);
6972     return sv_pvn(sv,lp);
6973 }
6974
6975 /*
6976 =for apidoc sv_pvutf8n_force
6977
6978 A private implementation of the C<SvPVutf8_force> macro for compilers
6979 which can't cope with complex macro expressions. Always use the macro
6980 instead.
6981
6982 =cut
6983 */
6984
6985 char *
6986 Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
6987 {
6988     sv_utf8_upgrade(sv);
6989     return sv_pvn_force(sv,lp);
6990 }
6991
6992 /*
6993 =for apidoc sv_reftype
6994
6995 Returns a string describing what the SV is a reference to.
6996
6997 =cut
6998 */
6999
7000 char *
7001 Perl_sv_reftype(pTHX_ SV *sv, int ob)
7002 {
7003     if (ob && SvOBJECT(sv)) {
7004         HV *svs = SvSTASH(sv);
7005         /* [20011101.072] This bandaid for C<package;> should eventually
7006            be removed. AMS 20011103 */
7007         return (svs ? HvNAME(svs) : "<none>");
7008     }
7009     else {
7010         switch (SvTYPE(sv)) {
7011         case SVt_NULL:
7012         case SVt_IV:
7013         case SVt_NV:
7014         case SVt_RV:
7015         case SVt_PV:
7016         case SVt_PVIV:
7017         case SVt_PVNV:
7018         case SVt_PVMG:
7019         case SVt_PVBM:
7020                                 if (SvROK(sv))
7021                                     return "REF";
7022                                 else
7023                                     return "SCALAR";
7024         case SVt_PVLV:          return "LVALUE";
7025         case SVt_PVAV:          return "ARRAY";
7026         case SVt_PVHV:          return "HASH";
7027         case SVt_PVCV:          return "CODE";
7028         case SVt_PVGV:          return "GLOB";
7029         case SVt_PVFM:          return "FORMAT";
7030         case SVt_PVIO:          return "IO";
7031         default:                return "UNKNOWN";
7032         }
7033     }
7034 }
7035
7036 /*
7037 =for apidoc sv_isobject
7038
7039 Returns a boolean indicating whether the SV is an RV pointing to a blessed
7040 object.  If the SV is not an RV, or if the object is not blessed, then this
7041 will return false.
7042
7043 =cut
7044 */
7045
7046 int
7047 Perl_sv_isobject(pTHX_ SV *sv)
7048 {
7049     if (!sv)
7050         return 0;
7051     if (SvGMAGICAL(sv))
7052         mg_get(sv);
7053     if (!SvROK(sv))
7054         return 0;
7055     sv = (SV*)SvRV(sv);
7056     if (!SvOBJECT(sv))
7057         return 0;
7058     return 1;
7059 }
7060
7061 /*
7062 =for apidoc sv_isa
7063
7064 Returns a boolean indicating whether the SV is blessed into the specified
7065 class.  This does not check for subtypes; use C<sv_derived_from> to verify
7066 an inheritance relationship.
7067
7068 =cut
7069 */
7070
7071 int
7072 Perl_sv_isa(pTHX_ SV *sv, const char *name)
7073 {
7074     if (!sv)
7075         return 0;
7076     if (SvGMAGICAL(sv))
7077         mg_get(sv);
7078     if (!SvROK(sv))
7079         return 0;
7080     sv = (SV*)SvRV(sv);
7081     if (!SvOBJECT(sv))
7082         return 0;
7083
7084     return strEQ(HvNAME(SvSTASH(sv)), name);
7085 }
7086
7087 /*
7088 =for apidoc newSVrv
7089
7090 Creates a new SV for the RV, C<rv>, to point to.  If C<rv> is not an RV then
7091 it will be upgraded to one.  If C<classname> is non-null then the new SV will
7092 be blessed in the specified package.  The new SV is returned and its
7093 reference count is 1.
7094
7095 =cut
7096 */
7097
7098 SV*
7099 Perl_newSVrv(pTHX_ SV *rv, const char *classname)
7100 {
7101     SV *sv;
7102
7103     new_SV(sv);
7104
7105     SV_CHECK_THINKFIRST(rv);
7106     SvAMAGIC_off(rv);
7107
7108     if (SvTYPE(rv) >= SVt_PVMG) {
7109         U32 refcnt = SvREFCNT(rv);
7110         SvREFCNT(rv) = 0;
7111         sv_clear(rv);
7112         SvFLAGS(rv) = 0;
7113         SvREFCNT(rv) = refcnt;
7114     }
7115
7116     if (SvTYPE(rv) < SVt_RV)
7117         sv_upgrade(rv, SVt_RV);
7118     else if (SvTYPE(rv) > SVt_RV) {
7119         (void)SvOOK_off(rv);
7120         if (SvPVX(rv) && SvLEN(rv))
7121             Safefree(SvPVX(rv));
7122         SvCUR_set(rv, 0);
7123         SvLEN_set(rv, 0);
7124     }
7125
7126     (void)SvOK_off(rv);
7127     SvRV(rv) = sv;
7128     SvROK_on(rv);
7129
7130     if (classname) {
7131         HV* stash = gv_stashpv(classname, TRUE);
7132         (void)sv_bless(rv, stash);
7133     }
7134     return sv;
7135 }
7136
7137 /*
7138 =for apidoc sv_setref_pv
7139
7140 Copies a pointer into a new SV, optionally blessing the SV.  The C<rv>
7141 argument will be upgraded to an RV.  That RV will be modified to point to
7142 the new SV.  If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
7143 into the SV.  The C<classname> argument indicates the package for the
7144 blessing.  Set C<classname> to C<Nullch> to avoid the blessing.  The new SV
7145 will be returned and will have a reference count of 1.
7146
7147 Do not use with other Perl types such as HV, AV, SV, CV, because those
7148 objects will become corrupted by the pointer copy process.
7149
7150 Note that C<sv_setref_pvn> copies the string while this copies the pointer.
7151
7152 =cut
7153 */
7154
7155 SV*
7156 Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
7157 {
7158     if (!pv) {
7159         sv_setsv(rv, &PL_sv_undef);
7160         SvSETMAGIC(rv);
7161     }
7162     else
7163         sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
7164     return rv;
7165 }
7166
7167 /*
7168 =for apidoc sv_setref_iv
7169
7170 Copies an integer into a new SV, optionally blessing the SV.  The C<rv>
7171 argument will be upgraded to an RV.  That RV will be modified to point to
7172 the new SV.  The C<classname> argument indicates the package for the
7173 blessing.  Set C<classname> to C<Nullch> to avoid the blessing.  The new SV
7174 will be returned and will have a reference count of 1.
7175
7176 =cut
7177 */
7178
7179 SV*
7180 Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
7181 {
7182     sv_setiv(newSVrv(rv,classname), iv);
7183     return rv;
7184 }
7185
7186 /*
7187 =for apidoc sv_setref_uv
7188
7189 Copies an unsigned integer into a new SV, optionally blessing the SV.  The C<rv>
7190 argument will be upgraded to an RV.  That RV will be modified to point to
7191 the new SV.  The C<classname> argument indicates the package for the
7192 blessing.  Set C<classname> to C<Nullch> to avoid the blessing.  The new SV
7193 will be returned and will have a reference count of 1.
7194
7195 =cut
7196 */
7197
7198 SV*
7199 Perl_sv_setref_uv(pTHX_ SV *rv, const char *classname, UV uv)
7200 {
7201     sv_setuv(newSVrv(rv,classname), uv);
7202     return rv;
7203 }
7204
7205 /*
7206 =for apidoc sv_setref_nv
7207
7208 Copies a double into a new SV, optionally blessing the SV.  The C<rv>
7209 argument will be upgraded to an RV.  That RV will be modified to point to
7210 the new SV.  The C<classname> argument indicates the package for the
7211 blessing.  Set C<classname> to C<Nullch> to avoid the blessing.  The new SV
7212 will be returned and will have a reference count of 1.
7213
7214 =cut
7215 */
7216
7217 SV*
7218 Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
7219 {
7220     sv_setnv(newSVrv(rv,classname), nv);
7221     return rv;
7222 }
7223
7224 /*
7225 =for apidoc sv_setref_pvn
7226
7227 Copies a string into a new SV, optionally blessing the SV.  The length of the
7228 string must be specified with C<n>.  The C<rv> argument will be upgraded to
7229 an RV.  That RV will be modified to point to the new SV.  The C<classname>
7230 argument indicates the package for the blessing.  Set C<classname> to
7231 C<Nullch> to avoid the blessing.  The new SV will be returned and will have
7232 a reference count of 1.
7233
7234 Note that C<sv_setref_pv> copies the pointer while this copies the string.
7235
7236 =cut
7237 */
7238
7239 SV*
7240 Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, char *pv, STRLEN n)
7241 {
7242     sv_setpvn(newSVrv(rv,classname), pv, n);
7243     return rv;
7244 }
7245
7246 /*
7247 =for apidoc sv_bless
7248
7249 Blesses an SV into a specified package.  The SV must be an RV.  The package
7250 must be designated by its stash (see C<gv_stashpv()>).  The reference count
7251 of the SV is unaffected.
7252
7253 =cut
7254 */
7255
7256 SV*
7257 Perl_sv_bless(pTHX_ SV *sv, HV *stash)
7258 {
7259     SV *tmpRef;
7260     if (!SvROK(sv))
7261         Perl_croak(aTHX_ "Can't bless non-reference value");
7262     tmpRef = SvRV(sv);
7263     if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
7264         if (SvREADONLY(tmpRef))
7265             Perl_croak(aTHX_ PL_no_modify);
7266         if (SvOBJECT(tmpRef)) {
7267             if (SvTYPE(tmpRef) != SVt_PVIO)
7268                 --PL_sv_objcount;
7269             SvREFCNT_dec(SvSTASH(tmpRef));
7270         }
7271     }
7272     SvOBJECT_on(tmpRef);
7273     if (SvTYPE(tmpRef) != SVt_PVIO)
7274         ++PL_sv_objcount;
7275     (void)SvUPGRADE(tmpRef, SVt_PVMG);
7276     SvSTASH(tmpRef) = (HV*)SvREFCNT_inc(stash);
7277
7278     if (Gv_AMG(stash))
7279         SvAMAGIC_on(sv);
7280     else
7281         SvAMAGIC_off(sv);
7282
7283     if(SvSMAGICAL(tmpRef))
7284         if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
7285             mg_set(tmpRef);
7286
7287
7288
7289     return sv;
7290 }
7291
7292 /* Downgrades a PVGV to a PVMG.
7293  *
7294  * XXX This function doesn't actually appear to be used anywhere
7295  * DAPM 15-Jun-01
7296  */
7297
7298 STATIC void
7299 S_sv_unglob(pTHX_ SV *sv)
7300 {
7301     void *xpvmg;
7302
7303     assert(SvTYPE(sv) == SVt_PVGV);
7304     SvFAKE_off(sv);
7305     if (GvGP(sv))
7306         gp_free((GV*)sv);
7307     if (GvSTASH(sv)) {
7308         SvREFCNT_dec(GvSTASH(sv));
7309         GvSTASH(sv) = Nullhv;
7310     }
7311     sv_unmagic(sv, PERL_MAGIC_glob);
7312     Safefree(GvNAME(sv));
7313     GvMULTI_off(sv);
7314
7315     /* need to keep SvANY(sv) in the right arena */
7316     xpvmg = new_XPVMG();
7317     StructCopy(SvANY(sv), xpvmg, XPVMG);
7318     del_XPVGV(SvANY(sv));
7319     SvANY(sv) = xpvmg;
7320
7321     SvFLAGS(sv) &= ~SVTYPEMASK;
7322     SvFLAGS(sv) |= SVt_PVMG;
7323 }
7324
7325 /*
7326 =for apidoc sv_unref_flags
7327
7328 Unsets the RV status of the SV, and decrements the reference count of
7329 whatever was being referenced by the RV.  This can almost be thought of
7330 as a reversal of C<newSVrv>.  The C<cflags> argument can contain
7331 C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
7332 (otherwise the decrementing is conditional on the reference count being
7333 different from one or the reference being a readonly SV).
7334 See C<SvROK_off>.
7335
7336 =cut
7337 */
7338
7339 void
7340 Perl_sv_unref_flags(pTHX_ SV *sv, U32 flags)
7341 {
7342     SV* rv = SvRV(sv);
7343
7344     if (SvWEAKREF(sv)) {
7345         sv_del_backref(sv);
7346         SvWEAKREF_off(sv);
7347         SvRV(sv) = 0;
7348         return;
7349     }
7350     SvRV(sv) = 0;
7351     SvROK_off(sv);
7352     if (SvREFCNT(rv) != 1 || SvREADONLY(rv) || flags) /* SV_IMMEDIATE_UNREF */
7353         SvREFCNT_dec(rv);
7354     else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
7355         sv_2mortal(rv);         /* Schedule for freeing later */
7356 }
7357
7358 /*
7359 =for apidoc sv_unref
7360
7361 Unsets the RV status of the SV, and decrements the reference count of
7362 whatever was being referenced by the RV.  This can almost be thought of
7363 as a reversal of C<newSVrv>.  This is C<sv_unref_flags> with the C<flag>
7364 being zero.  See C<SvROK_off>.
7365
7366 =cut
7367 */
7368
7369 void
7370 Perl_sv_unref(pTHX_ SV *sv)
7371 {
7372     sv_unref_flags(sv, 0);
7373 }
7374
7375 /*
7376 =for apidoc sv_taint
7377
7378 Taint an SV. Use C<SvTAINTED_on> instead.
7379 =cut
7380 */
7381
7382 void
7383 Perl_sv_taint(pTHX_ SV *sv)
7384 {
7385     sv_magic((sv), Nullsv, PERL_MAGIC_taint, Nullch, 0);
7386 }
7387
7388 /*
7389 =for apidoc sv_untaint
7390
7391 Untaint an SV. Use C<SvTAINTED_off> instead.
7392 =cut
7393 */
7394
7395 void
7396 Perl_sv_untaint(pTHX_ SV *sv)
7397 {
7398     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
7399         MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
7400         if (mg)
7401             mg->mg_len &= ~1;
7402     }
7403 }
7404
7405 /*
7406 =for apidoc sv_tainted
7407
7408 Test an SV for taintedness. Use C<SvTAINTED> instead.
7409 =cut
7410 */
7411
7412 bool
7413 Perl_sv_tainted(pTHX_ SV *sv)
7414 {
7415     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
7416         MAGIC *mg = mg_find(sv, PERL_MAGIC_taint);
7417         if (mg && ((mg->mg_len & 1) || ((mg->mg_len & 2) && mg->mg_obj == sv)))
7418             return TRUE;
7419     }
7420     return FALSE;
7421 }
7422
7423 /*
7424 =for apidoc sv_setpviv
7425
7426 Copies an integer into the given SV, also updating its string value.
7427 Does not handle 'set' magic.  See C<sv_setpviv_mg>.
7428
7429 =cut
7430 */
7431
7432 void
7433 Perl_sv_setpviv(pTHX_ SV *sv, IV iv)
7434 {
7435     char buf[TYPE_CHARS(UV)];
7436     char *ebuf;
7437     char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
7438
7439     sv_setpvn(sv, ptr, ebuf - ptr);
7440 }
7441
7442 /*
7443 =for apidoc sv_setpviv_mg
7444
7445 Like C<sv_setpviv>, but also handles 'set' magic.
7446
7447 =cut
7448 */
7449
7450 void
7451 Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv)
7452 {
7453     char buf[TYPE_CHARS(UV)];
7454     char *ebuf;
7455     char *ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
7456
7457     sv_setpvn(sv, ptr, ebuf - ptr);
7458     SvSETMAGIC(sv);
7459 }
7460
7461 #if defined(PERL_IMPLICIT_CONTEXT)
7462
7463 /* pTHX_ magic can't cope with varargs, so this is a no-context
7464  * version of the main function, (which may itself be aliased to us).
7465  * Don't access this version directly.
7466  */
7467
7468 void
7469 Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
7470 {
7471     dTHX;
7472     va_list args;
7473     va_start(args, pat);
7474     sv_vsetpvf(sv, pat, &args);
7475     va_end(args);
7476 }
7477
7478 /* pTHX_ magic can't cope with varargs, so this is a no-context
7479  * version of the main function, (which may itself be aliased to us).
7480  * Don't access this version directly.
7481  */
7482
7483 void
7484 Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
7485 {
7486     dTHX;
7487     va_list args;
7488     va_start(args, pat);
7489     sv_vsetpvf_mg(sv, pat, &args);
7490     va_end(args);
7491 }
7492 #endif
7493
7494 /*
7495 =for apidoc sv_setpvf
7496
7497 Processes its arguments like C<sprintf> and sets an SV to the formatted
7498 output.  Does not handle 'set' magic.  See C<sv_setpvf_mg>.
7499
7500 =cut
7501 */
7502
7503 void
7504 Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
7505 {
7506     va_list args;
7507     va_start(args, pat);
7508     sv_vsetpvf(sv, pat, &args);
7509     va_end(args);
7510 }
7511
7512 /* backend for C<sv_setpvf> and C<sv_setpvf_nocontext> */
7513
7514 void
7515 Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
7516 {
7517     sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7518 }
7519
7520 /*
7521 =for apidoc sv_setpvf_mg
7522
7523 Like C<sv_setpvf>, but also handles 'set' magic.
7524
7525 =cut
7526 */
7527
7528 void
7529 Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
7530 {
7531     va_list args;
7532     va_start(args, pat);
7533     sv_vsetpvf_mg(sv, pat, &args);
7534     va_end(args);
7535 }
7536
7537 /* backend for C<sv_setpvf_mg> C<setpvf_mg_nocontext> */
7538
7539 void
7540 Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
7541 {
7542     sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7543     SvSETMAGIC(sv);
7544 }
7545
7546 #if defined(PERL_IMPLICIT_CONTEXT)
7547
7548 /* pTHX_ magic can't cope with varargs, so this is a no-context
7549  * version of the main function, (which may itself be aliased to us).
7550  * Don't access this version directly.
7551  */
7552
7553 void
7554 Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
7555 {
7556     dTHX;
7557     va_list args;
7558     va_start(args, pat);
7559     sv_vcatpvf(sv, pat, &args);
7560     va_end(args);
7561 }
7562
7563 /* pTHX_ magic can't cope with varargs, so this is a no-context
7564  * version of the main function, (which may itself be aliased to us).
7565  * Don't access this version directly.
7566  */
7567
7568 void
7569 Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
7570 {
7571     dTHX;
7572     va_list args;
7573     va_start(args, pat);
7574     sv_vcatpvf_mg(sv, pat, &args);
7575     va_end(args);
7576 }
7577 #endif
7578
7579 /*
7580 =for apidoc sv_catpvf
7581
7582 Processes its arguments like C<sprintf> and appends the formatted
7583 output to an SV.  If the appended data contains "wide" characters
7584 (including, but not limited to, SVs with a UTF-8 PV formatted with %s,
7585 and characters >255 formatted with %c), the original SV might get
7586 upgraded to UTF-8.  Handles 'get' magic, but not 'set' magic.
7587 C<SvSETMAGIC()> must typically be called after calling this function
7588 to handle 'set' magic.
7589
7590 =cut */
7591
7592 void
7593 Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
7594 {
7595     va_list args;
7596     va_start(args, pat);
7597     sv_vcatpvf(sv, pat, &args);
7598     va_end(args);
7599 }
7600
7601 /* backend for C<sv_catpvf> and C<catpvf_mg_nocontext> */
7602
7603 void
7604 Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
7605 {
7606     sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7607 }
7608
7609 /*
7610 =for apidoc sv_catpvf_mg
7611
7612 Like C<sv_catpvf>, but also handles 'set' magic.
7613
7614 =cut
7615 */
7616
7617 void
7618 Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
7619 {
7620     va_list args;
7621     va_start(args, pat);
7622     sv_vcatpvf_mg(sv, pat, &args);
7623     va_end(args);
7624 }
7625
7626 /* backend for C<catpvf_mg> and C<catpvf_mg_nocontext> */
7627
7628 void
7629 Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
7630 {
7631     sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
7632     SvSETMAGIC(sv);
7633 }
7634
7635 /*
7636 =for apidoc sv_vsetpvfn
7637
7638 Works like C<vcatpvfn> but copies the text into the SV instead of
7639 appending it.
7640
7641 Usually used via one of its frontends C<sv_setpvf> and C<sv_setpvf_mg>.
7642
7643 =cut
7644 */
7645
7646 void
7647 Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
7648 {
7649     sv_setpvn(sv, "", 0);
7650     sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
7651 }
7652
7653 /* private function for use in sv_vcatpvfn via the EXPECT_NUMBER macro */
7654
7655 STATIC I32
7656 S_expect_number(pTHX_ char** pattern)
7657 {
7658     I32 var = 0;
7659     switch (**pattern) {
7660     case '1': case '2': case '3':
7661     case '4': case '5': case '6':
7662     case '7': case '8': case '9':
7663         while (isDIGIT(**pattern))
7664             var = var * 10 + (*(*pattern)++ - '0');
7665     }
7666     return var;
7667 }
7668 #define EXPECT_NUMBER(pattern, var) (var = S_expect_number(aTHX_ &pattern))
7669
7670 /*
7671 =for apidoc sv_vcatpvfn
7672
7673 Processes its arguments like C<vsprintf> and appends the formatted output
7674 to an SV.  Uses an array of SVs if the C style variable argument list is
7675 missing (NULL).  When running with taint checks enabled, indicates via
7676 C<maybe_tainted> if results are untrustworthy (often due to the use of
7677 locales).
7678
7679 Usually used via one of its frontends C<sv_catpvf> and C<sv_catpvf_mg>.
7680
7681 =cut
7682 */
7683
7684 void
7685 Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
7686 {
7687     char *p;
7688     char *q;
7689     char *patend;
7690     STRLEN origlen;
7691     I32 svix = 0;
7692     static char nullstr[] = "(null)";
7693     SV *argsv = Nullsv;
7694     bool has_utf8 = FALSE; /* has the result utf8? */
7695
7696     /* no matter what, this is a string now */
7697     (void)SvPV_force(sv, origlen);
7698
7699     /* special-case "", "%s", and "%_" */
7700     if (patlen == 0)
7701         return;
7702     if (patlen == 2 && pat[0] == '%') {
7703         switch (pat[1]) {
7704         case 's':
7705             if (args) {
7706                 char *s = va_arg(*args, char*);
7707                 sv_catpv(sv, s ? s : nullstr);
7708             }
7709             else if (svix < svmax) {
7710                 sv_catsv(sv, *svargs);
7711                 if (DO_UTF8(*svargs))
7712                     SvUTF8_on(sv);
7713             }
7714             return;
7715         case '_':
7716             if (args) {
7717                 argsv = va_arg(*args, SV*);
7718                 sv_catsv(sv, argsv);
7719                 if (DO_UTF8(argsv))
7720                     SvUTF8_on(sv);
7721                 return;
7722             }
7723             /* See comment on '_' below */
7724             break;
7725         }
7726     }
7727
7728     if (!args && svix < svmax && DO_UTF8(*svargs))
7729         has_utf8 = TRUE;
7730
7731     patend = (char*)pat + patlen;
7732     for (p = (char*)pat; p < patend; p = q) {
7733         bool alt = FALSE;
7734         bool left = FALSE;
7735         bool vectorize = FALSE;
7736         bool vectorarg = FALSE;
7737         bool vec_utf8 = FALSE;
7738         char fill = ' ';
7739         char plus = 0;
7740         char intsize = 0;
7741         STRLEN width = 0;
7742         STRLEN zeros = 0;
7743         bool has_precis = FALSE;
7744         STRLEN precis = 0;
7745         bool is_utf8 = FALSE;  /* is this item utf8?   */
7746         
7747         char esignbuf[4];
7748         U8 utf8buf[UTF8_MAXLEN+1];
7749         STRLEN esignlen = 0;
7750
7751         char *eptr = Nullch;
7752         STRLEN elen = 0;
7753         /* Times 4: a decimal digit takes more than 3 binary digits.
7754          * NV_DIG: mantissa takes than many decimal digits.
7755          * Plus 32: Playing safe. */
7756         char ebuf[IV_DIG * 4 + NV_DIG + 32];
7757         /* large enough for "%#.#f" --chip */
7758         /* what about long double NVs? --jhi */
7759
7760         SV *vecsv;
7761         U8 *vecstr = Null(U8*);
7762         STRLEN veclen = 0;
7763         char c = 0;
7764         int i;
7765         unsigned base = 0;
7766         IV iv = 0;
7767         UV uv = 0;
7768         NV nv;
7769         STRLEN have;
7770         STRLEN need;
7771         STRLEN gap;
7772         char *dotstr = ".";
7773         STRLEN dotstrlen = 1;
7774         I32 efix = 0; /* explicit format parameter index */
7775         I32 ewix = 0; /* explicit width index */
7776         I32 epix = 0; /* explicit precision index */
7777         I32 evix = 0; /* explicit vector index */
7778         bool asterisk = FALSE;
7779
7780         /* echo everything up to the next format specification */
7781         for (q = p; q < patend && *q != '%'; ++q) ;
7782         if (q > p) {
7783             sv_catpvn(sv, p, q - p);
7784             p = q;
7785         }
7786         if (q++ >= patend)
7787             break;
7788
7789 /*
7790     We allow format specification elements in this order:
7791         \d+\$              explicit format parameter index
7792         [-+ 0#]+           flags
7793         \*?(\d+\$)?v       vector with optional (optionally specified) arg
7794         \d+|\*(\d+\$)?     width using optional (optionally specified) arg
7795         \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
7796         [hlqLV]            size
7797     [%bcdefginopsux_DFOUX] format (mandatory)
7798 */
7799         if (EXPECT_NUMBER(q, width)) {
7800             if (*q == '$') {
7801                 ++q;
7802                 efix = width;
7803             } else {
7804                 goto gotwidth;
7805             }
7806         }
7807
7808         /* FLAGS */
7809
7810         while (*q) {
7811             switch (*q) {
7812             case ' ':
7813             case '+':
7814                 plus = *q++;
7815                 continue;
7816
7817             case '-':
7818                 left = TRUE;
7819                 q++;
7820                 continue;
7821
7822             case '0':
7823                 fill = *q++;
7824                 continue;
7825
7826             case '#':
7827                 alt = TRUE;
7828                 q++;
7829                 continue;
7830
7831             default:
7832                 break;
7833             }
7834             break;
7835         }
7836
7837       tryasterisk:
7838         if (*q == '*') {
7839             q++;
7840             if (EXPECT_NUMBER(q, ewix))
7841                 if (*q++ != '$')
7842                     goto unknown;
7843             asterisk = TRUE;
7844         }
7845         if (*q == 'v') {
7846             q++;
7847             if (vectorize)
7848                 goto unknown;
7849             if ((vectorarg = asterisk)) {
7850                 evix = ewix;
7851                 ewix = 0;
7852                 asterisk = FALSE;
7853             }
7854             vectorize = TRUE;
7855             goto tryasterisk;
7856         }
7857
7858         if (!asterisk)
7859             EXPECT_NUMBER(q, width);
7860
7861         if (vectorize) {
7862             if (vectorarg) {
7863                 if (args)
7864                     vecsv = va_arg(*args, SV*);
7865                 else
7866                     vecsv = (evix ? evix <= svmax : svix < svmax) ?
7867                         svargs[ewix ? ewix-1 : svix++] : &PL_sv_undef;
7868                 dotstr = SvPVx(vecsv, dotstrlen);
7869                 if (DO_UTF8(vecsv))
7870                     is_utf8 = TRUE;
7871             }
7872             if (args) {
7873                 vecsv = va_arg(*args, SV*);
7874                 vecstr = (U8*)SvPVx(vecsv,veclen);
7875                 vec_utf8 = DO_UTF8(vecsv);
7876             }
7877             else if (efix ? efix <= svmax : svix < svmax) {
7878                 vecsv = svargs[efix ? efix-1 : svix++];
7879                 vecstr = (U8*)SvPVx(vecsv,veclen);
7880                 vec_utf8 = DO_UTF8(vecsv);
7881             }
7882             else {
7883                 vecstr = (U8*)"";
7884                 veclen = 0;
7885             }
7886         }
7887
7888         if (asterisk) {
7889             if (args)
7890                 i = va_arg(*args, int);
7891             else
7892                 i = (ewix ? ewix <= svmax : svix < svmax) ?
7893                     SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
7894             left |= (i < 0);
7895             width = (i < 0) ? -i : i;
7896         }
7897       gotwidth:
7898
7899         /* PRECISION */
7900
7901         if (*q == '.') {
7902             q++;
7903             if (*q == '*') {
7904                 q++;
7905                 if (EXPECT_NUMBER(q, epix) && *q++ != '$') /* epix currently unused */
7906                     goto unknown;
7907                 if (args)
7908                     i = va_arg(*args, int);
7909                 else
7910                     i = (ewix ? ewix <= svmax : svix < svmax)
7911                         ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
7912                 precis = (i < 0) ? 0 : i;
7913             }
7914             else {
7915                 precis = 0;
7916                 while (isDIGIT(*q))
7917                     precis = precis * 10 + (*q++ - '0');
7918             }
7919             has_precis = TRUE;
7920         }
7921
7922         /* SIZE */
7923
7924         switch (*q) {
7925 #ifdef WIN32
7926         case 'I':                       /* Ix, I32x, and I64x */
7927 #  ifdef WIN64
7928             if (q[1] == '6' && q[2] == '4') {
7929                 q += 3;
7930                 intsize = 'q';
7931                 break;
7932             }
7933 #  endif
7934             if (q[1] == '3' && q[2] == '2') {
7935                 q += 3;
7936                 break;
7937             }
7938 #  ifdef WIN64
7939             intsize = 'q';
7940 #  endif
7941             q++;
7942             break;
7943 #endif
7944 #if defined(HAS_QUAD) || (defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE))
7945         case 'L':                       /* Ld */
7946             /* FALL THROUGH */
7947 #endif
7948 #ifdef HAS_QUAD
7949         case 'q':                       /* qd */
7950             intsize = 'q';
7951             q++;
7952             break;
7953 #endif
7954         case 'l':
7955 #if defined(HAS_QUAD) || (defined(HAS_LONG_DOUBLE) && defined(USE_LONG_DOUBLE))
7956              if (*(q + 1) == 'l') {     /* lld, llf */
7957                 intsize = 'q';
7958                 q += 2;
7959                 break;
7960              }
7961 #endif
7962             /* FALL THROUGH */
7963         case 'h':
7964             /* FALL THROUGH */
7965         case 'V':
7966             intsize = *q++;
7967             break;
7968         }
7969
7970         /* CONVERSION */
7971
7972         if (*q == '%') {
7973             eptr = q++;
7974             elen = 1;
7975             goto string;
7976         }
7977
7978         if (!args)
7979             argsv = (efix ? efix <= svmax : svix < svmax) ?
7980                     svargs[efix ? efix-1 : svix++] : &PL_sv_undef;
7981
7982         switch (c = *q++) {
7983
7984             /* STRINGS */
7985
7986         case 'c':
7987             uv = args ? va_arg(*args, int) : SvIVx(argsv);
7988             if ((uv > 255 ||
7989                  (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
7990                 && !IN_BYTES) {
7991                 eptr = (char*)utf8buf;
7992                 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
7993                 is_utf8 = TRUE;
7994             }
7995             else {
7996                 c = (char)uv;
7997                 eptr = &c;
7998                 elen = 1;
7999             }
8000             goto string;
8001
8002         case 's':
8003             if (args) {
8004                 eptr = va_arg(*args, char*);
8005                 if (eptr)
8006 #ifdef MACOS_TRADITIONAL
8007                   /* On MacOS, %#s format is used for Pascal strings */
8008                   if (alt)
8009                     elen = *eptr++;
8010                   else
8011 #endif
8012                     elen = strlen(eptr);
8013                 else {
8014                     eptr = nullstr;
8015                     elen = sizeof nullstr - 1;
8016                 }
8017             }
8018             else {
8019                 eptr = SvPVx(argsv, elen);
8020                 if (DO_UTF8(argsv)) {
8021                     if (has_precis && precis < elen) {
8022                         I32 p = precis;
8023                         sv_pos_u2b(argsv, &p, 0); /* sticks at end */
8024                         precis = p;
8025                     }
8026                     if (width) { /* fudge width (can't fudge elen) */
8027                         width += elen - sv_len_utf8(argsv);
8028                     }
8029                     is_utf8 = TRUE;
8030                 }
8031             }
8032             goto string;
8033
8034         case '_':
8035             /*
8036              * The "%_" hack might have to be changed someday,
8037              * if ISO or ANSI decide to use '_' for something.
8038              * So we keep it hidden from users' code.
8039              */
8040             if (!args)
8041                 goto unknown;
8042             argsv = va_arg(*args, SV*);
8043             eptr = SvPVx(argsv, elen);
8044             if (DO_UTF8(argsv))
8045                 is_utf8 = TRUE;
8046
8047         string:
8048             vectorize = FALSE;
8049             if (has_precis && elen > precis)
8050                 elen = precis;
8051             break;
8052
8053             /* INTEGERS */
8054
8055         case 'p':
8056             if (alt)
8057                 goto unknown;
8058             uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
8059             base = 16;
8060             goto integer;
8061
8062         case 'D':
8063 #ifdef IV_IS_QUAD
8064             intsize = 'q';
8065 #else
8066             intsize = 'l';
8067 #endif
8068             /* FALL THROUGH */
8069         case 'd':
8070         case 'i':
8071             if (vectorize) {
8072                 STRLEN ulen;
8073                 if (!veclen)
8074                     continue;
8075                 if (vec_utf8)
8076                     uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
8077                                         UTF8_ALLOW_ANYUV);
8078                 else {
8079                     uv = *vecstr;
8080                     ulen = 1;
8081                 }
8082                 vecstr += ulen;
8083                 veclen -= ulen;
8084                 if (plus)
8085                      esignbuf[esignlen++] = plus;
8086             }
8087             else if (args) {
8088                 switch (intsize) {
8089                 case 'h':       iv = (short)va_arg(*args, int); break;
8090                 default:        iv = va_arg(*args, int); break;
8091                 case 'l':       iv = va_arg(*args, long); break;
8092                 case 'V':       iv = va_arg(*args, IV); break;
8093 #ifdef HAS_QUAD
8094                 case 'q':       iv = va_arg(*args, Quad_t); break;
8095 #endif
8096                 }
8097             }
8098             else {
8099                 iv = SvIVx(argsv);
8100                 switch (intsize) {
8101                 case 'h':       iv = (short)iv; break;
8102                 default:        break;
8103                 case 'l':       iv = (long)iv; break;
8104                 case 'V':       break;
8105 #ifdef HAS_QUAD
8106                 case 'q':       iv = (Quad_t)iv; break;
8107 #endif
8108                 }
8109             }
8110             if ( !vectorize )   /* we already set uv above */
8111             {
8112                 if (iv >= 0) {
8113                     uv = iv;
8114                     if (plus)
8115                         esignbuf[esignlen++] = plus;
8116                 }
8117                 else {
8118                     uv = -iv;
8119                     esignbuf[esignlen++] = '-';
8120                 }
8121             }
8122             base = 10;
8123             goto integer;
8124
8125         case 'U':
8126 #ifdef IV_IS_QUAD
8127             intsize = 'q';
8128 #else
8129             intsize = 'l';
8130 #endif
8131             /* FALL THROUGH */
8132         case 'u':
8133             base = 10;
8134             goto uns_integer;
8135
8136         case 'b':
8137             base = 2;
8138             goto uns_integer;
8139
8140         case 'O':
8141 #ifdef IV_IS_QUAD
8142             intsize = 'q';
8143 #else
8144             intsize = 'l';
8145 #endif
8146             /* FALL THROUGH */
8147         case 'o':
8148             base = 8;
8149             goto uns_integer;
8150
8151         case 'X':
8152         case 'x':
8153             base = 16;
8154
8155         uns_integer:
8156             if (vectorize) {
8157                 STRLEN ulen;
8158         vector:
8159                 if (!veclen)
8160                     continue;
8161                 if (vec_utf8)
8162                     uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
8163                                         UTF8_ALLOW_ANYUV);
8164                 else {
8165                     uv = *vecstr;
8166                     ulen = 1;
8167                 }
8168                 vecstr += ulen;
8169                 veclen -= ulen;
8170             }
8171             else if (args) {
8172                 switch (intsize) {
8173                 case 'h':  uv = (unsigned short)va_arg(*args, unsigned); break;
8174                 default:   uv = va_arg(*args, unsigned); break;
8175                 case 'l':  uv = va_arg(*args, unsigned long); break;
8176                 case 'V':  uv = va_arg(*args, UV); break;
8177 #ifdef HAS_QUAD
8178                 case 'q':  uv = va_arg(*args, Quad_t); break;
8179 #endif
8180                 }
8181             }
8182             else {
8183                 uv = SvUVx(argsv);
8184                 switch (intsize) {
8185                 case 'h':       uv = (unsigned short)uv; break;
8186                 default:        break;
8187                 case 'l':       uv = (unsigned long)uv; break;
8188                 case 'V':       break;
8189 #ifdef HAS_QUAD
8190                 case 'q':       uv = (Quad_t)uv; break;
8191 #endif
8192                 }
8193             }
8194
8195         integer:
8196             eptr = ebuf + sizeof ebuf;
8197             switch (base) {
8198                 unsigned dig;
8199             case 16:
8200                 if (!uv)
8201                     alt = FALSE;
8202                 p = (char*)((c == 'X')
8203                             ? "0123456789ABCDEF" : "0123456789abcdef");
8204                 do {
8205                     dig = uv & 15;
8206                     *--eptr = p[dig];
8207                 } while (uv >>= 4);
8208                 if (alt) {
8209                     esignbuf[esignlen++] = '0';
8210                     esignbuf[esignlen++] = c;  /* 'x' or 'X' */
8211                 }
8212                 break;
8213             case 8:
8214                 do {
8215                     dig = uv & 7;
8216                     *--eptr = '0' + dig;
8217                 } while (uv >>= 3);
8218                 if (alt && *eptr != '0')
8219                     *--eptr = '0';
8220                 break;
8221             case 2:
8222                 do {
8223                     dig = uv & 1;
8224                     *--eptr = '0' + dig;
8225                 } while (uv >>= 1);
8226                 if (alt) {
8227                     esignbuf[esignlen++] = '0';
8228                     esignbuf[esignlen++] = 'b';
8229                 }
8230                 break;
8231             default:            /* it had better be ten or less */
8232 #if defined(PERL_Y2KWARN)
8233                 if (ckWARN(WARN_Y2K)) {
8234                     STRLEN n;
8235                     char *s = SvPV(sv,n);
8236                     if (n >= 2 && s[n-2] == '1' && s[n-1] == '9'
8237                         && (n == 2 || !isDIGIT(s[n-3])))
8238                     {
8239                         Perl_warner(aTHX_ packWARN(WARN_Y2K),
8240                                     "Possible Y2K bug: %%%c %s",
8241                                     c, "format string following '19'");
8242                     }
8243                 }
8244 #endif
8245                 do {
8246                     dig = uv % base;
8247                     *--eptr = '0' + dig;
8248                 } while (uv /= base);
8249                 break;
8250             }
8251             elen = (ebuf + sizeof ebuf) - eptr;
8252             if (has_precis) {
8253                 if (precis > elen)
8254                     zeros = precis - elen;
8255                 else if (precis == 0 && elen == 1 && *eptr == '0')
8256                     elen = 0;
8257             }
8258             break;
8259
8260             /* FLOATING POINT */
8261
8262         case 'F':
8263             c = 'f';            /* maybe %F isn't supported here */
8264             /* FALL THROUGH */
8265         case 'e': case 'E':
8266         case 'f':
8267         case 'g': case 'G':
8268
8269             /* This is evil, but floating point is even more evil */
8270
8271             vectorize = FALSE;
8272             nv = args ? va_arg(*args, NV) : SvNVx(argsv);
8273
8274             need = 0;
8275             if (c != 'e' && c != 'E') {
8276                 i = PERL_INT_MIN;
8277                 (void)Perl_frexp(nv, &i);
8278                 if (i == PERL_INT_MIN)
8279                     Perl_die(aTHX_ "panic: frexp");
8280                 if (i > 0)
8281                     need = BIT_DIGITS(i);
8282             }
8283             need += has_precis ? precis : 6; /* known default */
8284             if (need < width)
8285                 need = width;
8286
8287             need += 20; /* fudge factor */
8288             if (PL_efloatsize < need) {
8289                 Safefree(PL_efloatbuf);
8290                 PL_efloatsize = need + 20; /* more fudge */
8291                 New(906, PL_efloatbuf, PL_efloatsize, char);
8292                 PL_efloatbuf[0] = '\0';
8293             }
8294
8295             eptr = ebuf + sizeof ebuf;
8296             *--eptr = '\0';
8297             *--eptr = c;
8298 #if defined(USE_LONG_DOUBLE) && defined(PERL_PRIfldbl)
8299             {
8300                 /* Copy the one or more characters in a long double
8301                  * format before the 'base' ([efgEFG]) character to
8302                  * the format string. */
8303                 static char const prifldbl[] = PERL_PRIfldbl;
8304                 char const *p = prifldbl + sizeof(prifldbl) - 3;
8305                 while (p >= prifldbl) { *--eptr = *p--; }
8306             }
8307 #endif
8308             if (has_precis) {
8309                 base = precis;
8310                 do { *--eptr = '0' + (base % 10); } while (base /= 10);
8311                 *--eptr = '.';
8312             }
8313             if (width) {
8314                 base = width;
8315                 do { *--eptr = '0' + (base % 10); } while (base /= 10);
8316             }
8317             if (fill == '0')
8318                 *--eptr = fill;
8319             if (left)
8320                 *--eptr = '-';
8321             if (plus)
8322                 *--eptr = plus;
8323             if (alt)
8324                 *--eptr = '#';
8325             *--eptr = '%';
8326
8327             /* No taint.  Otherwise we are in the strange situation
8328              * where printf() taints but print($float) doesn't.
8329              * --jhi */
8330             (void)sprintf(PL_efloatbuf, eptr, nv);
8331
8332             eptr = PL_efloatbuf;
8333             elen = strlen(PL_efloatbuf);
8334             break;
8335
8336             /* SPECIAL */
8337
8338         case 'n':
8339             vectorize = FALSE;
8340             i = SvCUR(sv) - origlen;
8341             if (args) {
8342                 switch (intsize) {
8343                 case 'h':       *(va_arg(*args, short*)) = i; break;
8344                 default:        *(va_arg(*args, int*)) = i; break;
8345                 case 'l':       *(va_arg(*args, long*)) = i; break;
8346                 case 'V':       *(va_arg(*args, IV*)) = i; break;
8347 #ifdef HAS_QUAD
8348                 case 'q':       *(va_arg(*args, Quad_t*)) = i; break;
8349 #endif
8350                 }
8351             }
8352             else
8353                 sv_setuv_mg(argsv, (UV)i);
8354             continue;   /* not "break" */
8355
8356             /* UNKNOWN */
8357
8358         default:
8359       unknown:
8360             vectorize = FALSE;
8361             if (!args && ckWARN(WARN_PRINTF) &&
8362                   (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
8363                 SV *msg = sv_newmortal();
8364                 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %s: ",
8365                           (PL_op->op_type == OP_PRTF) ? "printf" : "sprintf");
8366                 if (c) {
8367                     if (isPRINT(c))
8368                         Perl_sv_catpvf(aTHX_ msg,
8369                                        "\"%%%c\"", c & 0xFF);
8370                     else
8371                         Perl_sv_catpvf(aTHX_ msg,
8372                                        "\"%%\\%03"UVof"\"",
8373                                        (UV)c & 0xFF);
8374                 } else
8375                     sv_catpv(msg, "end of string");
8376                 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, msg); /* yes, this is reentrant */
8377             }
8378
8379             /* output mangled stuff ... */
8380             if (c == '\0')
8381                 --q;
8382             eptr = p;
8383             elen = q - p;
8384
8385             /* ... right here, because formatting flags should not apply */
8386             SvGROW(sv, SvCUR(sv) + elen + 1);
8387             p = SvEND(sv);
8388             Copy(eptr, p, elen, char);
8389             p += elen;
8390             *p = '\0';
8391             SvCUR(sv) = p - SvPVX(sv);
8392             continue;   /* not "break" */
8393         }
8394
8395         if (is_utf8 != has_utf8) {
8396              if (is_utf8) {
8397                   if (SvCUR(sv))
8398                        sv_utf8_upgrade(sv);
8399              }
8400              else {
8401                   SV *nsv = sv_2mortal(newSVpvn(eptr, elen));
8402                   sv_utf8_upgrade(nsv);
8403                   eptr = SvPVX(nsv);
8404                   elen = SvCUR(nsv);
8405              }
8406              SvGROW(sv, SvCUR(sv) + elen + 1);
8407              p = SvEND(sv);
8408              *p = '\0';
8409         }
8410         
8411         have = esignlen + zeros + elen;
8412         need = (have > width ? have : width);
8413         gap = need - have;
8414
8415         SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
8416         p = SvEND(sv);
8417         if (esignlen && fill == '0') {
8418             for (i = 0; i < (int)esignlen; i++)
8419                 *p++ = esignbuf[i];
8420         }
8421         if (gap && !left) {
8422             memset(p, fill, gap);
8423             p += gap;
8424         }
8425         if (esignlen && fill != '0') {
8426             for (i = 0; i < (int)esignlen; i++)
8427                 *p++ = esignbuf[i];
8428         }
8429         if (zeros) {
8430             for (i = zeros; i; i--)
8431                 *p++ = '0';
8432         }
8433         if (elen) {
8434             Copy(eptr, p, elen, char);
8435             p += elen;
8436         }
8437         if (gap && left) {
8438             memset(p, ' ', gap);
8439             p += gap;
8440         }
8441         if (vectorize) {
8442             if (veclen) {
8443                 Copy(dotstr, p, dotstrlen, char);
8444                 p += dotstrlen;
8445             }
8446             else
8447                 vectorize = FALSE;              /* done iterating over vecstr */
8448         }
8449         if (is_utf8)
8450             has_utf8 = TRUE;
8451         if (has_utf8)
8452             SvUTF8_on(sv);
8453         *p = '\0';
8454         SvCUR(sv) = p - SvPVX(sv);
8455         if (vectorize) {
8456             esignlen = 0;
8457             goto vector;
8458         }
8459     }
8460 }
8461
8462 /* =========================================================================
8463
8464 =head1 Cloning an interpreter
8465
8466 All the macros and functions in this section are for the private use of
8467 the main function, perl_clone().
8468
8469 The foo_dup() functions make an exact copy of an existing foo thinngy.
8470 During the course of a cloning, a hash table is used to map old addresses
8471 to new addresses. The table is created and manipulated with the
8472 ptr_table_* functions.
8473
8474 =cut
8475
8476 ============================================================================*/
8477
8478
8479 #if defined(USE_ITHREADS)
8480
8481 #if defined(USE_5005THREADS)
8482 #  include "error: USE_5005THREADS and USE_ITHREADS are incompatible"
8483 #endif
8484
8485 #ifndef GpREFCNT_inc
8486 #  define GpREFCNT_inc(gp)      ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
8487 #endif
8488
8489
8490 #define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
8491 #define av_dup(s,t)     (AV*)sv_dup((SV*)s,t)
8492 #define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8493 #define hv_dup(s,t)     (HV*)sv_dup((SV*)s,t)
8494 #define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8495 #define cv_dup(s,t)     (CV*)sv_dup((SV*)s,t)
8496 #define cv_dup_inc(s,t) (CV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8497 #define io_dup(s,t)     (IO*)sv_dup((SV*)s,t)
8498 #define io_dup_inc(s,t) (IO*)SvREFCNT_inc(sv_dup((SV*)s,t))
8499 #define gv_dup(s,t)     (GV*)sv_dup((SV*)s,t)
8500 #define gv_dup_inc(s,t) (GV*)SvREFCNT_inc(sv_dup((SV*)s,t))
8501 #define SAVEPV(p)       (p ? savepv(p) : Nullch)
8502 #define SAVEPVN(p,n)    (p ? savepvn(p,n) : Nullch)
8503
8504
8505 /* Duplicate a regexp. Required reading: pregcomp() and pregfree() in
8506    regcomp.c. AMS 20010712 */
8507
8508 REGEXP *
8509 Perl_re_dup(pTHX_ REGEXP *r, CLONE_PARAMS *param)
8510 {
8511     REGEXP *ret;
8512     int i, len, npar;
8513     struct reg_substr_datum *s;
8514
8515     if (!r)
8516         return (REGEXP *)NULL;
8517
8518     if ((ret = (REGEXP *)ptr_table_fetch(PL_ptr_table, r)))
8519         return ret;
8520
8521     len = r->offsets[0];
8522     npar = r->nparens+1;
8523
8524     Newc(0, ret, sizeof(regexp) + (len+1)*sizeof(regnode), char, regexp);
8525     Copy(r->program, ret->program, len+1, regnode);
8526
8527     New(0, ret->startp, npar, I32);
8528     Copy(r->startp, ret->startp, npar, I32);
8529     New(0, ret->endp, npar, I32);
8530     Copy(r->startp, ret->startp, npar, I32);
8531
8532     New(0, ret->substrs, 1, struct reg_substr_data);
8533     for (s = ret->substrs->data, i = 0; i < 3; i++, s++) {
8534         s->min_offset = r->substrs->data[i].min_offset;
8535         s->max_offset = r->substrs->data[i].max_offset;
8536         s->substr     = sv_dup_inc(r->substrs->data[i].substr, param);
8537         s->utf8_substr = sv_dup_inc(r->substrs->data[i].utf8_substr, param);
8538     }
8539
8540     ret->regstclass = NULL;
8541     if (r->data) {
8542         struct reg_data *d;
8543         int count = r->data->count;
8544
8545         Newc(0, d, sizeof(struct reg_data) + count*sizeof(void *),
8546                 char, struct reg_data);
8547         New(0, d->what, count, U8);
8548
8549         d->count = count;
8550         for (i = 0; i < count; i++) {
8551             d->what[i] = r->data->what[i];
8552             switch (d->what[i]) {
8553             case 's':
8554                 d->data[i] = sv_dup_inc((SV *)r->data->data[i], param);
8555                 break;
8556             case 'p':
8557                 d->data[i] = av_dup_inc((AV *)r->data->data[i], param);
8558                 break;
8559             case 'f':
8560                 /* This is cheating. */
8561                 New(0, d->data[i], 1, struct regnode_charclass_class);
8562                 StructCopy(r->data->data[i], d->data[i],
8563                             struct regnode_charclass_class);
8564                 ret->regstclass = (regnode*)d->data[i];
8565                 break;
8566             case 'o':
8567                 /* Compiled op trees are readonly, and can thus be
8568                    shared without duplication. */
8569                 d->data[i] = (void*)OpREFCNT_inc((OP*)r->data->data[i]);
8570                 break;
8571             case 'n':
8572                 d->data[i] = r->data->data[i];
8573                 break;
8574             }
8575         }
8576
8577         ret->data = d;
8578     }
8579     else
8580         ret->data = NULL;
8581
8582     New(0, ret->offsets, 2*len+1, U32);
8583     Copy(r->offsets, ret->offsets, 2*len+1, U32);
8584
8585     ret->precomp        = SAVEPV(r->precomp);
8586     ret->refcnt         = r->refcnt;
8587     ret->minlen         = r->minlen;
8588     ret->prelen         = r->prelen;
8589     ret->nparens        = r->nparens;
8590     ret->lastparen      = r->lastparen;
8591     ret->lastcloseparen = r->lastcloseparen;
8592     ret->reganch        = r->reganch;
8593
8594     ret->sublen         = r->sublen;
8595
8596     if (RX_MATCH_COPIED(ret))
8597         ret->subbeg  = SAVEPV(r->subbeg);
8598     else
8599         ret->subbeg = Nullch;
8600
8601     ptr_table_store(PL_ptr_table, r, ret);
8602     return ret;
8603 }
8604
8605 /* duplicate a file handle */
8606
8607 PerlIO *
8608 Perl_fp_dup(pTHX_ PerlIO *fp, char type, CLONE_PARAMS *param)
8609 {
8610     PerlIO *ret;
8611     if (!fp)
8612         return (PerlIO*)NULL;
8613
8614     /* look for it in the table first */
8615     ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
8616     if (ret)
8617         return ret;
8618
8619     /* create anew and remember what it is */
8620     ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
8621     ptr_table_store(PL_ptr_table, fp, ret);
8622     return ret;
8623 }
8624
8625 /* duplicate a directory handle */
8626
8627 DIR *
8628 Perl_dirp_dup(pTHX_ DIR *dp)
8629 {
8630     if (!dp)
8631         return (DIR*)NULL;
8632     /* XXX TODO */
8633     return dp;
8634 }
8635
8636 /* duplicate a typeglob */
8637
8638 GP *
8639 Perl_gp_dup(pTHX_ GP *gp, CLONE_PARAMS* param)
8640 {
8641     GP *ret;
8642     if (!gp)
8643         return (GP*)NULL;
8644     /* look for it in the table first */
8645     ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
8646     if (ret)
8647         return ret;
8648
8649     /* create anew and remember what it is */
8650     Newz(0, ret, 1, GP);
8651     ptr_table_store(PL_ptr_table, gp, ret);
8652
8653     /* clone */
8654     ret->gp_refcnt      = 0;                    /* must be before any other dups! */
8655     ret->gp_sv          = sv_dup_inc(gp->gp_sv, param);
8656     ret->gp_io          = io_dup_inc(gp->gp_io, param);
8657     ret->gp_form        = cv_dup_inc(gp->gp_form, param);
8658     ret->gp_av          = av_dup_inc(gp->gp_av, param);
8659     ret->gp_hv          = hv_dup_inc(gp->gp_hv, param);
8660     ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
8661     ret->gp_cv          = cv_dup_inc(gp->gp_cv, param);
8662     ret->gp_cvgen       = gp->gp_cvgen;
8663     ret->gp_flags       = gp->gp_flags;
8664     ret->gp_line        = gp->gp_line;
8665     ret->gp_file        = gp->gp_file;          /* points to COP.cop_file */
8666     return ret;
8667 }
8668
8669 /* duplicate a chain of magic */
8670
8671 MAGIC *
8672 Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS* param)
8673 {
8674     MAGIC *mgprev = (MAGIC*)NULL;
8675     MAGIC *mgret;
8676     if (!mg)
8677         return (MAGIC*)NULL;
8678     /* look for it in the table first */
8679     mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
8680     if (mgret)
8681         return mgret;
8682
8683     for (; mg; mg = mg->mg_moremagic) {
8684         MAGIC *nmg;
8685         Newz(0, nmg, 1, MAGIC);
8686         if (mgprev)
8687             mgprev->mg_moremagic = nmg;
8688         else
8689             mgret = nmg;
8690         nmg->mg_virtual = mg->mg_virtual;       /* XXX copy dynamic vtable? */
8691         nmg->mg_private = mg->mg_private;
8692         nmg->mg_type    = mg->mg_type;
8693         nmg->mg_flags   = mg->mg_flags;
8694         if (mg->mg_type == PERL_MAGIC_qr) {
8695             nmg->mg_obj = (SV*)re_dup((REGEXP*)mg->mg_obj, param);
8696         }
8697         else if(mg->mg_type == PERL_MAGIC_backref) {
8698              AV *av = (AV*) mg->mg_obj;
8699              SV **svp;
8700              I32 i;
8701              nmg->mg_obj = (SV*)newAV();
8702              svp = AvARRAY(av);
8703              i = AvFILLp(av);
8704              while (i >= 0) {
8705                   av_push((AV*)nmg->mg_obj,sv_dup(svp[i],param));
8706                   i--;
8707              }
8708         }
8709         else {
8710             nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
8711                               ? sv_dup_inc(mg->mg_obj, param)
8712                               : sv_dup(mg->mg_obj, param);
8713         }
8714         nmg->mg_len     = mg->mg_len;
8715         nmg->mg_ptr     = mg->mg_ptr;   /* XXX random ptr? */
8716         if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
8717             if (mg->mg_len > 0) {
8718                 nmg->mg_ptr     = SAVEPVN(mg->mg_ptr, mg->mg_len);
8719                 if (mg->mg_type == PERL_MAGIC_overload_table &&
8720                         AMT_AMAGIC((AMT*)mg->mg_ptr))
8721                 {
8722                     AMT *amtp = (AMT*)mg->mg_ptr;
8723                     AMT *namtp = (AMT*)nmg->mg_ptr;
8724                     I32 i;
8725                     for (i = 1; i < NofAMmeth; i++) {
8726                         namtp->table[i] = cv_dup_inc(amtp->table[i], param);
8727                     }
8728                 }
8729             }
8730             else if (mg->mg_len == HEf_SVKEY)
8731                 nmg->mg_ptr     = (char*)sv_dup_inc((SV*)mg->mg_ptr, param);
8732         }
8733         if ((mg->mg_flags & MGf_DUP) && mg->mg_virtual && mg->mg_virtual->svt_dup) {
8734             CALL_FPTR(nmg->mg_virtual->svt_dup)(aTHX_ nmg, param);
8735         }
8736         mgprev = nmg;
8737     }
8738     return mgret;
8739 }
8740
8741 /* create a new pointer-mapping table */
8742
8743 PTR_TBL_t *
8744 Perl_ptr_table_new(pTHX)
8745 {
8746     PTR_TBL_t *tbl;
8747     Newz(0, tbl, 1, PTR_TBL_t);
8748     tbl->tbl_max        = 511;
8749     tbl->tbl_items      = 0;
8750     Newz(0, tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
8751     return tbl;
8752 }
8753
8754 /* map an existing pointer using a table */
8755
8756 void *
8757 Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, void *sv)
8758 {
8759     PTR_TBL_ENT_t *tblent;
8760     UV hash = PTR2UV(sv);
8761     assert(tbl);
8762     tblent = tbl->tbl_ary[hash & tbl->tbl_max];
8763     for (; tblent; tblent = tblent->next) {
8764         if (tblent->oldval == sv)
8765             return tblent->newval;
8766     }
8767     return (void*)NULL;
8768 }
8769
8770 /* add a new entry to a pointer-mapping table */
8771
8772 void
8773 Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, void *oldv, void *newv)
8774 {
8775     PTR_TBL_ENT_t *tblent, **otblent;
8776     /* XXX this may be pessimal on platforms where pointers aren't good
8777      * hash values e.g. if they grow faster in the most significant
8778      * bits */
8779     UV hash = PTR2UV(oldv);
8780     bool i = 1;
8781
8782     assert(tbl);
8783     otblent = &tbl->tbl_ary[hash & tbl->tbl_max];
8784     for (tblent = *otblent; tblent; i=0, tblent = tblent->next) {
8785         if (tblent->oldval == oldv) {
8786             tblent->newval = newv;
8787             tbl->tbl_items++;
8788             return;
8789         }
8790     }
8791     Newz(0, tblent, 1, PTR_TBL_ENT_t);
8792     tblent->oldval = oldv;
8793     tblent->newval = newv;
8794     tblent->next = *otblent;
8795     *otblent = tblent;
8796     tbl->tbl_items++;
8797     if (i && tbl->tbl_items > tbl->tbl_max)
8798         ptr_table_split(tbl);
8799 }
8800
8801 /* double the hash bucket size of an existing ptr table */
8802
8803 void
8804 Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
8805 {
8806     PTR_TBL_ENT_t **ary = tbl->tbl_ary;
8807     UV oldsize = tbl->tbl_max + 1;
8808     UV newsize = oldsize * 2;
8809     UV i;
8810
8811     Renew(ary, newsize, PTR_TBL_ENT_t*);
8812     Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
8813     tbl->tbl_max = --newsize;
8814     tbl->tbl_ary = ary;
8815     for (i=0; i < oldsize; i++, ary++) {
8816         PTR_TBL_ENT_t **curentp, **entp, *ent;
8817         if (!*ary)
8818             continue;
8819         curentp = ary + oldsize;
8820         for (entp = ary, ent = *ary; ent; ent = *entp) {
8821             if ((newsize & PTR2UV(ent->oldval)) != i) {
8822                 *entp = ent->next;
8823                 ent->next = *curentp;
8824                 *curentp = ent;
8825                 continue;
8826             }
8827             else
8828                 entp = &ent->next;
8829         }
8830     }
8831 }
8832
8833 /* remove all the entries from a ptr table */
8834
8835 void
8836 Perl_ptr_table_clear(pTHX_ PTR_TBL_t *tbl)
8837 {
8838     register PTR_TBL_ENT_t **array;
8839     register PTR_TBL_ENT_t *entry;
8840     register PTR_TBL_ENT_t *oentry = Null(PTR_TBL_ENT_t*);
8841     UV riter = 0;
8842     UV max;
8843
8844     if (!tbl || !tbl->tbl_items) {
8845         return;
8846     }
8847
8848     array = tbl->tbl_ary;
8849     entry = array[0];
8850     max = tbl->tbl_max;
8851
8852     for (;;) {
8853         if (entry) {
8854             oentry = entry;
8855             entry = entry->next;
8856             Safefree(oentry);
8857         }
8858         if (!entry) {
8859             if (++riter > max) {
8860                 break;
8861             }
8862             entry = array[riter];
8863         }
8864     }
8865
8866     tbl->tbl_items = 0;
8867 }
8868
8869 /* clear and free a ptr table */
8870
8871 void
8872 Perl_ptr_table_free(pTHX_ PTR_TBL_t *tbl)
8873 {
8874     if (!tbl) {
8875         return;
8876     }
8877     ptr_table_clear(tbl);
8878     Safefree(tbl->tbl_ary);
8879     Safefree(tbl);
8880 }
8881
8882 #ifdef DEBUGGING
8883 char *PL_watch_pvx;
8884 #endif
8885
8886 /* attempt to make everything in the typeglob readonly */
8887
8888 STATIC SV *
8889 S_gv_share(pTHX_ SV *sstr)
8890 {
8891     GV *gv = (GV*)sstr;
8892     SV *sv = &PL_sv_no; /* just need SvREADONLY-ness */
8893
8894     if (GvIO(gv) || GvFORM(gv)) {
8895         GvUNIQUE_off(gv); /* GvIOs cannot be shared. nor can GvFORMs */
8896     }
8897     else if (!GvCV(gv)) {
8898         GvCV(gv) = (CV*)sv;
8899     }
8900     else {
8901         /* CvPADLISTs cannot be shared */
8902         if (!CvXSUB(GvCV(gv))) {
8903             GvUNIQUE_off(gv);
8904         }
8905     }
8906
8907     if (!GvUNIQUE(gv)) {
8908 #if 0
8909         PerlIO_printf(Perl_debug_log, "gv_share: unable to share %s::%s\n",
8910                       HvNAME(GvSTASH(gv)), GvNAME(gv));
8911 #endif
8912         return Nullsv;
8913     }
8914
8915     /*
8916      * write attempts will die with
8917      * "Modification of a read-only value attempted"
8918      */
8919     if (!GvSV(gv)) {
8920         GvSV(gv) = sv;
8921     }
8922     else {
8923         SvREADONLY_on(GvSV(gv));
8924     }
8925
8926     if (!GvAV(gv)) {
8927         GvAV(gv) = (AV*)sv;
8928     }
8929     else {
8930         SvREADONLY_on(GvAV(gv));
8931     }
8932
8933     if (!GvHV(gv)) {
8934         GvHV(gv) = (HV*)sv;
8935     }
8936     else {
8937         SvREADONLY_on(GvAV(gv));
8938     }
8939
8940     return sstr; /* he_dup() will SvREFCNT_inc() */
8941 }
8942
8943 /* duplicate an SV of any type (including AV, HV etc) */
8944
8945 void
8946 Perl_rvpv_dup(pTHX_ SV *dstr, SV *sstr, CLONE_PARAMS* param)
8947 {
8948     if (SvROK(sstr)) {
8949         SvRV(dstr) = SvWEAKREF(sstr)
8950                      ? sv_dup(SvRV(sstr), param)
8951                      : sv_dup_inc(SvRV(sstr), param);
8952     }
8953     else if (SvPVX(sstr)) {
8954         /* Has something there */
8955         if (SvLEN(sstr)) {
8956             /* Normal PV - clone whole allocated space */
8957             SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
8958         }
8959         else {
8960             /* Special case - not normally malloced for some reason */
8961             if (SvREADONLY(sstr) && SvFAKE(sstr)) {
8962                 /* A "shared" PV - clone it as unshared string */
8963                 SvFAKE_off(dstr);
8964                 SvREADONLY_off(dstr);
8965                 SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvCUR(sstr));
8966             }
8967             else {
8968                 /* Some other special case - random pointer */
8969                 SvPVX(dstr) = SvPVX(sstr);              
8970             }
8971         }
8972     }
8973     else {
8974         /* Copy the Null */
8975         SvPVX(dstr) = SvPVX(sstr);
8976     }
8977 }
8978
8979 SV *
8980 Perl_sv_dup(pTHX_ SV *sstr, CLONE_PARAMS* param)
8981 {
8982     SV *dstr;
8983
8984     if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
8985         return Nullsv;
8986     /* look for it in the table first */
8987     dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
8988     if (dstr)
8989         return dstr;
8990
8991     /* create anew and remember what it is */
8992     new_SV(dstr);
8993     ptr_table_store(PL_ptr_table, sstr, dstr);
8994
8995     /* clone */
8996     SvFLAGS(dstr)       = SvFLAGS(sstr);
8997     SvFLAGS(dstr)       &= ~SVf_OOK;            /* don't propagate OOK hack */
8998     SvREFCNT(dstr)      = 0;                    /* must be before any other dups! */
8999
9000 #ifdef DEBUGGING
9001     if (SvANY(sstr) && PL_watch_pvx && SvPVX(sstr) == PL_watch_pvx)
9002         PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
9003                       PL_watch_pvx, SvPVX(sstr));
9004 #endif
9005
9006     switch (SvTYPE(sstr)) {
9007     case SVt_NULL:
9008         SvANY(dstr)     = NULL;
9009         break;
9010     case SVt_IV:
9011         SvANY(dstr)     = new_XIV();
9012         SvIVX(dstr)     = SvIVX(sstr);
9013         break;
9014     case SVt_NV:
9015         SvANY(dstr)     = new_XNV();
9016         SvNVX(dstr)     = SvNVX(sstr);
9017         break;
9018     case SVt_RV:
9019         SvANY(dstr)     = new_XRV();
9020         Perl_rvpv_dup(aTHX_ dstr, sstr, param);
9021         break;
9022     case SVt_PV:
9023         SvANY(dstr)     = new_XPV();
9024         SvCUR(dstr)     = SvCUR(sstr);
9025         SvLEN(dstr)     = SvLEN(sstr);
9026         Perl_rvpv_dup(aTHX_ dstr, sstr, param);
9027         break;
9028     case SVt_PVIV:
9029         SvANY(dstr)     = new_XPVIV();
9030         SvCUR(dstr)     = SvCUR(sstr);
9031         SvLEN(dstr)     = SvLEN(sstr);
9032         SvIVX(dstr)     = SvIVX(sstr);
9033         Perl_rvpv_dup(aTHX_ dstr, sstr, param);
9034         break;
9035     case SVt_PVNV:
9036         SvANY(dstr)     = new_XPVNV();
9037         SvCUR(dstr)     = SvCUR(sstr);
9038         SvLEN(dstr)     = SvLEN(sstr);
9039         SvIVX(dstr)     = SvIVX(sstr);
9040         SvNVX(dstr)     = SvNVX(sstr);
9041         Perl_rvpv_dup(aTHX_ dstr, sstr, param);
9042         break;
9043     case SVt_PVMG:
9044         SvANY(dstr)     = new_XPVMG();
9045         SvCUR(dstr)     = SvCUR(sstr);
9046         SvLEN(dstr)     = SvLEN(sstr);
9047         SvIVX(dstr)     = SvIVX(sstr);
9048         SvNVX(dstr)     = SvNVX(sstr);
9049         SvMAGIC(dstr)   = mg_dup(SvMAGIC(sstr), param);
9050         SvSTASH(dstr)   = hv_dup_inc(SvSTASH(sstr), param);
9051         Perl_rvpv_dup(aTHX_ dstr, sstr, param);
9052         break;
9053     case SVt_PVBM:
9054         SvANY(dstr)     = new_XPVBM();
9055         SvCUR(dstr)     = SvCUR(sstr);
9056         SvLEN(dstr)     = SvLEN(sstr);
9057         SvIVX(dstr)     = SvIVX(sstr);
9058         SvNVX(dstr)     = SvNVX(sstr);
9059         SvMAGIC(dstr)   = mg_dup(SvMAGIC(sstr), param);
9060         SvSTASH(dstr)   = hv_dup_inc(SvSTASH(sstr), param);
9061         Perl_rvpv_dup(aTHX_ dstr, sstr, param);
9062         BmRARE(dstr)    = BmRARE(sstr);
9063         BmUSEFUL(dstr)  = BmUSEFUL(sstr);
9064         BmPREVIOUS(dstr)= BmPREVIOUS(sstr);
9065         break;
9066     case SVt_PVLV:
9067         SvANY(dstr)     = new_XPVLV();
9068         SvCUR(dstr)     = SvCUR(sstr);
9069         SvLEN(dstr)     = SvLEN(sstr);
9070         SvIVX(dstr)     = SvIVX(sstr);
9071         SvNVX(dstr)     = SvNVX(sstr);
9072         SvMAGIC(dstr)   = mg_dup(SvMAGIC(sstr), param);
9073         SvSTASH(dstr)   = hv_dup_inc(SvSTASH(sstr), param);
9074         Perl_rvpv_dup(aTHX_ dstr, sstr, param);
9075         LvTARGOFF(dstr) = LvTARGOFF(sstr);      /* XXX sometimes holds PMOP* when DEBUGGING */
9076         LvTARGLEN(dstr) = LvTARGLEN(sstr);
9077         LvTARG(dstr)    = sv_dup_inc(LvTARG(sstr), param);
9078         LvTYPE(dstr)    = LvTYPE(sstr);
9079         break;
9080     case SVt_PVGV:
9081         if (GvUNIQUE((GV*)sstr)) {
9082             SV *share;
9083             if ((share = gv_share(sstr))) {
9084                 del_SV(dstr);
9085                 dstr = share;
9086 #if 0
9087                 PerlIO_printf(Perl_debug_log, "sv_dup: sharing %s::%s\n",
9088                               HvNAME(GvSTASH(share)), GvNAME(share));
9089 #endif
9090                 break;
9091             }
9092         }
9093         SvANY(dstr)     = new_XPVGV();
9094         SvCUR(dstr)     = SvCUR(sstr);
9095         SvLEN(dstr)     = SvLEN(sstr);
9096         SvIVX(dstr)     = SvIVX(sstr);
9097         SvNVX(dstr)     = SvNVX(sstr);
9098         SvMAGIC(dstr)   = mg_dup(SvMAGIC(sstr), param);
9099         SvSTASH(dstr)   = hv_dup_inc(SvSTASH(sstr), param);
9100         Perl_rvpv_dup(aTHX_ dstr, sstr, param);
9101         GvNAMELEN(dstr) = GvNAMELEN(sstr);
9102         GvNAME(dstr)    = SAVEPVN(GvNAME(sstr), GvNAMELEN(sstr));
9103         GvSTASH(dstr)   = hv_dup_inc(GvSTASH(sstr), param);
9104         GvFLAGS(dstr)   = GvFLAGS(sstr);
9105         GvGP(dstr)      = gp_dup(GvGP(sstr), param);
9106         (void)GpREFCNT_inc(GvGP(dstr));
9107         break;
9108     case SVt_PVIO:
9109         SvANY(dstr)     = new_XPVIO();
9110         SvCUR(dstr)     = SvCUR(sstr);
9111         SvLEN(dstr)     = SvLEN(sstr);
9112         SvIVX(dstr)     = SvIVX(sstr);
9113         SvNVX(dstr)     = SvNVX(sstr);
9114         SvMAGIC(dstr)   = mg_dup(SvMAGIC(sstr), param);
9115         SvSTASH(dstr)   = hv_dup_inc(SvSTASH(sstr), param);
9116         Perl_rvpv_dup(aTHX_ dstr, sstr, param);
9117         IoIFP(dstr)     = fp_dup(IoIFP(sstr), IoTYPE(sstr), param);
9118         if (IoOFP(sstr) == IoIFP(sstr))
9119             IoOFP(dstr) = IoIFP(dstr);
9120         else
9121             IoOFP(dstr) = fp_dup(IoOFP(sstr), IoTYPE(sstr), param);
9122         /* PL_rsfp_filters entries have fake IoDIRP() */
9123         if (IoDIRP(sstr) && !(IoFLAGS(sstr) & IOf_FAKE_DIRP))
9124             IoDIRP(dstr)        = dirp_dup(IoDIRP(sstr));
9125         else
9126             IoDIRP(dstr)        = IoDIRP(sstr);
9127         IoLINES(dstr)           = IoLINES(sstr);
9128         IoPAGE(dstr)            = IoPAGE(sstr);
9129         IoPAGE_LEN(dstr)        = IoPAGE_LEN(sstr);
9130         IoLINES_LEFT(dstr)      = IoLINES_LEFT(sstr);
9131         IoTOP_NAME(dstr)        = SAVEPV(IoTOP_NAME(sstr));
9132         IoTOP_GV(dstr)          = gv_dup(IoTOP_GV(sstr), param);
9133         IoFMT_NAME(dstr)        = SAVEPV(IoFMT_NAME(sstr));
9134         IoFMT_GV(dstr)          = gv_dup(IoFMT_GV(sstr), param);
9135         IoBOTTOM_NAME(dstr)     = SAVEPV(IoBOTTOM_NAME(sstr));
9136         IoBOTTOM_GV(dstr)       = gv_dup(IoBOTTOM_GV(sstr), param);
9137         IoSUBPROCESS(dstr)      = IoSUBPROCESS(sstr);
9138         IoTYPE(dstr)            = IoTYPE(sstr);
9139         IoFLAGS(dstr)           = IoFLAGS(sstr);
9140         break;
9141     case SVt_PVAV:
9142         SvANY(dstr)     = new_XPVAV();
9143         SvCUR(dstr)     = SvCUR(sstr);
9144         SvLEN(dstr)     = SvLEN(sstr);
9145         SvIVX(dstr)     = SvIVX(sstr);
9146         SvNVX(dstr)     = SvNVX(sstr);
9147         SvMAGIC(dstr)   = mg_dup(SvMAGIC(sstr), param);
9148         SvSTASH(dstr)   = hv_dup_inc(SvSTASH(sstr), param);
9149         AvARYLEN((AV*)dstr) = sv_dup_inc(AvARYLEN((AV*)sstr), param);
9150         AvFLAGS((AV*)dstr) = AvFLAGS((AV*)sstr);
9151         if (AvARRAY((AV*)sstr)) {
9152             SV **dst_ary, **src_ary;
9153             SSize_t items = AvFILLp((AV*)sstr) + 1;
9154
9155             src_ary = AvARRAY((AV*)sstr);
9156             Newz(0, dst_ary, AvMAX((AV*)sstr)+1, SV*);
9157             ptr_table_store(PL_ptr_table, src_ary, dst_ary);
9158             SvPVX(dstr) = (char*)dst_ary;
9159             AvALLOC((AV*)dstr) = dst_ary;
9160             if (AvREAL((AV*)sstr)) {
9161                 while (items-- > 0)
9162                     *dst_ary++ = sv_dup_inc(*src_ary++, param);
9163             }
9164             else {
9165                 while (items-- > 0)
9166                     *dst_ary++ = sv_dup(*src_ary++, param);
9167             }
9168             items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
9169             while (items-- > 0) {
9170                 *dst_ary++ = &PL_sv_undef;
9171             }
9172         }
9173         else {
9174             SvPVX(dstr)         = Nullch;
9175             AvALLOC((AV*)dstr)  = (SV**)NULL;
9176         }
9177         break;
9178     case SVt_PVHV:
9179         SvANY(dstr)     = new_XPVHV();
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         HvRITER((HV*)dstr)      = HvRITER((HV*)sstr);
9187         if (HvARRAY((HV*)sstr)) {
9188             STRLEN i = 0;
9189             XPVHV *dxhv = (XPVHV*)SvANY(dstr);
9190             XPVHV *sxhv = (XPVHV*)SvANY(sstr);
9191             Newz(0, dxhv->xhv_array,
9192                  PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1), char);
9193             while (i <= sxhv->xhv_max) {
9194                 ((HE**)dxhv->xhv_array)[i] = he_dup(((HE**)sxhv->xhv_array)[i],
9195                                                     (bool)!!HvSHAREKEYS(sstr),
9196                                                     param);
9197                 ++i;
9198             }
9199             dxhv->xhv_eiter = he_dup(sxhv->xhv_eiter,
9200                                      (bool)!!HvSHAREKEYS(sstr), param);
9201         }
9202         else {
9203             SvPVX(dstr)         = Nullch;
9204             HvEITER((HV*)dstr)  = (HE*)NULL;
9205         }
9206         HvPMROOT((HV*)dstr)     = HvPMROOT((HV*)sstr);          /* XXX */
9207         HvNAME((HV*)dstr)       = SAVEPV(HvNAME((HV*)sstr));
9208     /* Record stashes for possible cloning in Perl_clone(). */
9209         if(HvNAME((HV*)dstr))
9210             av_push(param->stashes, dstr);
9211         break;
9212     case SVt_PVFM:
9213         SvANY(dstr)     = new_XPVFM();
9214         FmLINES(dstr)   = FmLINES(sstr);
9215         goto dup_pvcv;
9216         /* NOTREACHED */
9217     case SVt_PVCV:
9218         SvANY(dstr)     = new_XPVCV();
9219         dup_pvcv:
9220         SvCUR(dstr)     = SvCUR(sstr);
9221         SvLEN(dstr)     = SvLEN(sstr);
9222         SvIVX(dstr)     = SvIVX(sstr);
9223         SvNVX(dstr)     = SvNVX(sstr);
9224         SvMAGIC(dstr)   = mg_dup(SvMAGIC(sstr), param);
9225         SvSTASH(dstr)   = hv_dup_inc(SvSTASH(sstr), param);
9226         Perl_rvpv_dup(aTHX_ dstr, sstr, param);
9227         CvSTASH(dstr)   = hv_dup(CvSTASH(sstr), param); /* NOTE: not refcounted */
9228         CvSTART(dstr)   = CvSTART(sstr);
9229         CvROOT(dstr)    = OpREFCNT_inc(CvROOT(sstr));
9230         CvXSUB(dstr)    = CvXSUB(sstr);
9231         CvXSUBANY(dstr) = CvXSUBANY(sstr);
9232         if (CvCONST(sstr)) {
9233             CvXSUBANY(dstr).any_ptr = GvUNIQUE(CvGV(sstr)) ?
9234                 SvREFCNT_inc(CvXSUBANY(sstr).any_ptr) :
9235                 sv_dup_inc(CvXSUBANY(sstr).any_ptr, param);
9236         }
9237         CvGV(dstr)      = gv_dup(CvGV(sstr), param);
9238         if (param->flags & CLONEf_COPY_STACKS) {
9239           CvDEPTH(dstr) = CvDEPTH(sstr);
9240         } else {
9241           CvDEPTH(dstr) = 0;
9242         }
9243         if (CvPADLIST(sstr) && !AvREAL(CvPADLIST(sstr))) {
9244             /* XXX padlists are real, but pretend to be not */
9245             AvREAL_on(CvPADLIST(sstr));
9246             CvPADLIST(dstr)     = av_dup_inc(CvPADLIST(sstr), param);
9247             AvREAL_off(CvPADLIST(sstr));
9248             AvREAL_off(CvPADLIST(dstr));
9249         }
9250         else
9251             CvPADLIST(dstr)     = av_dup_inc(CvPADLIST(sstr), param);
9252         if (!CvANON(sstr) || CvCLONED(sstr))
9253             CvOUTSIDE(dstr)     = cv_dup_inc(CvOUTSIDE(sstr), param);
9254         else
9255             CvOUTSIDE(dstr)     = cv_dup(CvOUTSIDE(sstr), param);
9256         CvFLAGS(dstr)   = CvFLAGS(sstr);
9257         CvFILE(dstr) = CvXSUB(sstr) ? CvFILE(sstr) : SAVEPV(CvFILE(sstr));
9258         break;
9259     default:
9260         Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
9261         break;
9262     }
9263
9264     if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
9265         ++PL_sv_objcount;
9266
9267     return dstr;
9268  }
9269
9270 /* duplicate a context */
9271
9272 PERL_CONTEXT *
9273 Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
9274 {
9275     PERL_CONTEXT *ncxs;
9276
9277     if (!cxs)
9278         return (PERL_CONTEXT*)NULL;
9279
9280     /* look for it in the table first */
9281     ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
9282     if (ncxs)
9283         return ncxs;
9284
9285     /* create anew and remember what it is */
9286     Newz(56, ncxs, max + 1, PERL_CONTEXT);
9287     ptr_table_store(PL_ptr_table, cxs, ncxs);
9288
9289     while (ix >= 0) {
9290         PERL_CONTEXT *cx = &cxs[ix];
9291         PERL_CONTEXT *ncx = &ncxs[ix];
9292         ncx->cx_type    = cx->cx_type;
9293         if (CxTYPE(cx) == CXt_SUBST) {
9294             Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
9295         }
9296         else {
9297             ncx->blk_oldsp      = cx->blk_oldsp;
9298             ncx->blk_oldcop     = cx->blk_oldcop;
9299             ncx->blk_oldretsp   = cx->blk_oldretsp;
9300             ncx->blk_oldmarksp  = cx->blk_oldmarksp;
9301             ncx->blk_oldscopesp = cx->blk_oldscopesp;
9302             ncx->blk_oldpm      = cx->blk_oldpm;
9303             ncx->blk_gimme      = cx->blk_gimme;
9304             switch (CxTYPE(cx)) {
9305             case CXt_SUB:
9306                 ncx->blk_sub.cv         = (cx->blk_sub.olddepth == 0
9307                                            ? cv_dup_inc(cx->blk_sub.cv, param)
9308                                            : cv_dup(cx->blk_sub.cv,param));
9309                 ncx->blk_sub.argarray   = (cx->blk_sub.hasargs
9310                                            ? av_dup_inc(cx->blk_sub.argarray, param)
9311                                            : Nullav);
9312                 ncx->blk_sub.savearray  = av_dup_inc(cx->blk_sub.savearray, param);
9313                 ncx->blk_sub.olddepth   = cx->blk_sub.olddepth;
9314                 ncx->blk_sub.hasargs    = cx->blk_sub.hasargs;
9315                 ncx->blk_sub.lval       = cx->blk_sub.lval;
9316                 break;
9317             case CXt_EVAL:
9318                 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
9319                 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
9320                 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv, param);;
9321                 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
9322                 ncx->blk_eval.cur_text  = sv_dup(cx->blk_eval.cur_text, param);
9323                 break;
9324             case CXt_LOOP:
9325                 ncx->blk_loop.label     = cx->blk_loop.label;
9326                 ncx->blk_loop.resetsp   = cx->blk_loop.resetsp;
9327                 ncx->blk_loop.redo_op   = cx->blk_loop.redo_op;
9328                 ncx->blk_loop.next_op   = cx->blk_loop.next_op;
9329                 ncx->blk_loop.last_op   = cx->blk_loop.last_op;
9330                 ncx->blk_loop.iterdata  = (CxPADLOOP(cx)
9331                                            ? cx->blk_loop.iterdata
9332                                            : gv_dup((GV*)cx->blk_loop.iterdata, param));
9333                 ncx->blk_loop.oldcurpad
9334                     = (SV**)ptr_table_fetch(PL_ptr_table,
9335                                             cx->blk_loop.oldcurpad);
9336                 ncx->blk_loop.itersave  = sv_dup_inc(cx->blk_loop.itersave, param);
9337                 ncx->blk_loop.iterlval  = sv_dup_inc(cx->blk_loop.iterlval, param);
9338                 ncx->blk_loop.iterary   = av_dup_inc(cx->blk_loop.iterary, param);
9339                 ncx->blk_loop.iterix    = cx->blk_loop.iterix;
9340                 ncx->blk_loop.itermax   = cx->blk_loop.itermax;
9341                 break;
9342             case CXt_FORMAT:
9343                 ncx->blk_sub.cv         = cv_dup(cx->blk_sub.cv, param);
9344                 ncx->blk_sub.gv         = gv_dup(cx->blk_sub.gv, param);
9345                 ncx->blk_sub.dfoutgv    = gv_dup_inc(cx->blk_sub.dfoutgv, param);
9346                 ncx->blk_sub.hasargs    = cx->blk_sub.hasargs;
9347                 break;
9348             case CXt_BLOCK:
9349             case CXt_NULL:
9350                 break;
9351             }
9352         }
9353         --ix;
9354     }
9355     return ncxs;
9356 }
9357
9358 /* duplicate a stack info structure */
9359
9360 PERL_SI *
9361 Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
9362 {
9363     PERL_SI *nsi;
9364
9365     if (!si)
9366         return (PERL_SI*)NULL;
9367
9368     /* look for it in the table first */
9369     nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
9370     if (nsi)
9371         return nsi;
9372
9373     /* create anew and remember what it is */
9374     Newz(56, nsi, 1, PERL_SI);
9375     ptr_table_store(PL_ptr_table, si, nsi);
9376
9377     nsi->si_stack       = av_dup_inc(si->si_stack, param);
9378     nsi->si_cxix        = si->si_cxix;
9379     nsi->si_cxmax       = si->si_cxmax;
9380     nsi->si_cxstack     = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
9381     nsi->si_type        = si->si_type;
9382     nsi->si_prev        = si_dup(si->si_prev, param);
9383     nsi->si_next        = si_dup(si->si_next, param);
9384     nsi->si_markoff     = si->si_markoff;
9385
9386     return nsi;
9387 }
9388
9389 #define POPINT(ss,ix)   ((ss)[--(ix)].any_i32)
9390 #define TOPINT(ss,ix)   ((ss)[ix].any_i32)
9391 #define POPLONG(ss,ix)  ((ss)[--(ix)].any_long)
9392 #define TOPLONG(ss,ix)  ((ss)[ix].any_long)
9393 #define POPIV(ss,ix)    ((ss)[--(ix)].any_iv)
9394 #define TOPIV(ss,ix)    ((ss)[ix].any_iv)
9395 #define POPPTR(ss,ix)   ((ss)[--(ix)].any_ptr)
9396 #define TOPPTR(ss,ix)   ((ss)[ix].any_ptr)
9397 #define POPDPTR(ss,ix)  ((ss)[--(ix)].any_dptr)
9398 #define TOPDPTR(ss,ix)  ((ss)[ix].any_dptr)
9399 #define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
9400 #define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
9401
9402 /* XXXXX todo */
9403 #define pv_dup_inc(p)   SAVEPV(p)
9404 #define pv_dup(p)       SAVEPV(p)
9405 #define svp_dup_inc(p,pp)       any_dup(p,pp)
9406
9407 /* map any object to the new equivent - either something in the
9408  * ptr table, or something in the interpreter structure
9409  */
9410
9411 void *
9412 Perl_any_dup(pTHX_ void *v, PerlInterpreter *proto_perl)
9413 {
9414     void *ret;
9415
9416     if (!v)
9417         return (void*)NULL;
9418
9419     /* look for it in the table first */
9420     ret = ptr_table_fetch(PL_ptr_table, v);
9421     if (ret)
9422         return ret;
9423
9424     /* see if it is part of the interpreter structure */
9425     if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
9426         ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
9427     else {
9428         ret = v;
9429     }
9430
9431     return ret;
9432 }
9433
9434 /* duplicate the save stack */
9435
9436 ANY *
9437 Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
9438 {
9439     ANY *ss     = proto_perl->Tsavestack;
9440     I32 ix      = proto_perl->Tsavestack_ix;
9441     I32 max     = proto_perl->Tsavestack_max;
9442     ANY *nss;
9443     SV *sv;
9444     GV *gv;
9445     AV *av;
9446     HV *hv;
9447     void* ptr;
9448     int intval;
9449     long longval;
9450     GP *gp;
9451     IV iv;
9452     I32 i;
9453     char *c = NULL;
9454     void (*dptr) (void*);
9455     void (*dxptr) (pTHX_ void*);
9456     OP *o;
9457
9458     Newz(54, nss, max, ANY);
9459
9460     while (ix > 0) {
9461         i = POPINT(ss,ix);
9462         TOPINT(nss,ix) = i;
9463         switch (i) {
9464         case SAVEt_ITEM:                        /* normal string */
9465             sv = (SV*)POPPTR(ss,ix);
9466             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
9467             sv = (SV*)POPPTR(ss,ix);
9468             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
9469             break;
9470         case SAVEt_SV:                          /* scalar reference */
9471             sv = (SV*)POPPTR(ss,ix);
9472             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
9473             gv = (GV*)POPPTR(ss,ix);
9474             TOPPTR(nss,ix) = gv_dup_inc(gv, param);
9475             break;
9476         case SAVEt_GENERIC_PVREF:               /* generic char* */
9477             c = (char*)POPPTR(ss,ix);
9478             TOPPTR(nss,ix) = pv_dup(c);
9479             ptr = POPPTR(ss,ix);
9480             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9481             break;
9482         case SAVEt_SHARED_PVREF:                /* char* in shared space */
9483             c = (char*)POPPTR(ss,ix);
9484             TOPPTR(nss,ix) = savesharedpv(c);
9485             ptr = POPPTR(ss,ix);
9486             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9487             break;
9488         case SAVEt_GENERIC_SVREF:               /* generic sv */
9489         case SAVEt_SVREF:                       /* scalar reference */
9490             sv = (SV*)POPPTR(ss,ix);
9491             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
9492             ptr = POPPTR(ss,ix);
9493             TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
9494             break;
9495         case SAVEt_AV:                          /* array reference */
9496             av = (AV*)POPPTR(ss,ix);
9497             TOPPTR(nss,ix) = av_dup_inc(av, param);
9498             gv = (GV*)POPPTR(ss,ix);
9499             TOPPTR(nss,ix) = gv_dup(gv, param);
9500             break;
9501         case SAVEt_HV:                          /* hash reference */
9502             hv = (HV*)POPPTR(ss,ix);
9503             TOPPTR(nss,ix) = hv_dup_inc(hv, param);
9504             gv = (GV*)POPPTR(ss,ix);
9505             TOPPTR(nss,ix) = gv_dup(gv, param);
9506             break;
9507         case SAVEt_INT:                         /* int reference */
9508             ptr = POPPTR(ss,ix);
9509             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9510             intval = (int)POPINT(ss,ix);
9511             TOPINT(nss,ix) = intval;
9512             break;
9513         case SAVEt_LONG:                        /* long reference */
9514             ptr = POPPTR(ss,ix);
9515             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9516             longval = (long)POPLONG(ss,ix);
9517             TOPLONG(nss,ix) = longval;
9518             break;
9519         case SAVEt_I32:                         /* I32 reference */
9520         case SAVEt_I16:                         /* I16 reference */
9521         case SAVEt_I8:                          /* I8 reference */
9522             ptr = POPPTR(ss,ix);
9523             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9524             i = POPINT(ss,ix);
9525             TOPINT(nss,ix) = i;
9526             break;
9527         case SAVEt_IV:                          /* IV reference */
9528             ptr = POPPTR(ss,ix);
9529             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9530             iv = POPIV(ss,ix);
9531             TOPIV(nss,ix) = iv;
9532             break;
9533         case SAVEt_SPTR:                        /* SV* reference */
9534             ptr = POPPTR(ss,ix);
9535             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9536             sv = (SV*)POPPTR(ss,ix);
9537             TOPPTR(nss,ix) = sv_dup(sv, param);
9538             break;
9539         case SAVEt_VPTR:                        /* random* reference */
9540             ptr = POPPTR(ss,ix);
9541             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9542             ptr = POPPTR(ss,ix);
9543             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9544             break;
9545         case SAVEt_PPTR:                        /* char* reference */
9546             ptr = POPPTR(ss,ix);
9547             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9548             c = (char*)POPPTR(ss,ix);
9549             TOPPTR(nss,ix) = pv_dup(c);
9550             break;
9551         case SAVEt_HPTR:                        /* HV* reference */
9552             ptr = POPPTR(ss,ix);
9553             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9554             hv = (HV*)POPPTR(ss,ix);
9555             TOPPTR(nss,ix) = hv_dup(hv, param);
9556             break;
9557         case SAVEt_APTR:                        /* AV* reference */
9558             ptr = POPPTR(ss,ix);
9559             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9560             av = (AV*)POPPTR(ss,ix);
9561             TOPPTR(nss,ix) = av_dup(av, param);
9562             break;
9563         case SAVEt_NSTAB:
9564             gv = (GV*)POPPTR(ss,ix);
9565             TOPPTR(nss,ix) = gv_dup(gv, param);
9566             break;
9567         case SAVEt_GP:                          /* scalar reference */
9568             gp = (GP*)POPPTR(ss,ix);
9569             TOPPTR(nss,ix) = gp = gp_dup(gp, param);
9570             (void)GpREFCNT_inc(gp);
9571             gv = (GV*)POPPTR(ss,ix);
9572             TOPPTR(nss,ix) = gv_dup_inc(gv, param);
9573             c = (char*)POPPTR(ss,ix);
9574             TOPPTR(nss,ix) = pv_dup(c);
9575             iv = POPIV(ss,ix);
9576             TOPIV(nss,ix) = iv;
9577             iv = POPIV(ss,ix);
9578             TOPIV(nss,ix) = iv;
9579             break;
9580         case SAVEt_FREESV:
9581         case SAVEt_MORTALIZESV:
9582             sv = (SV*)POPPTR(ss,ix);
9583             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
9584             break;
9585         case SAVEt_FREEOP:
9586             ptr = POPPTR(ss,ix);
9587             if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
9588                 /* these are assumed to be refcounted properly */
9589                 switch (((OP*)ptr)->op_type) {
9590                 case OP_LEAVESUB:
9591                 case OP_LEAVESUBLV:
9592                 case OP_LEAVEEVAL:
9593                 case OP_LEAVE:
9594                 case OP_SCOPE:
9595                 case OP_LEAVEWRITE:
9596                     TOPPTR(nss,ix) = ptr;
9597                     o = (OP*)ptr;
9598                     OpREFCNT_inc(o);
9599                     break;
9600                 default:
9601                     TOPPTR(nss,ix) = Nullop;
9602                     break;
9603                 }
9604             }
9605             else
9606                 TOPPTR(nss,ix) = Nullop;
9607             break;
9608         case SAVEt_FREEPV:
9609             c = (char*)POPPTR(ss,ix);
9610             TOPPTR(nss,ix) = pv_dup_inc(c);
9611             break;
9612         case SAVEt_CLEARSV:
9613             longval = POPLONG(ss,ix);
9614             TOPLONG(nss,ix) = longval;
9615             break;
9616         case SAVEt_DELETE:
9617             hv = (HV*)POPPTR(ss,ix);
9618             TOPPTR(nss,ix) = hv_dup_inc(hv, param);
9619             c = (char*)POPPTR(ss,ix);
9620             TOPPTR(nss,ix) = pv_dup_inc(c);
9621             i = POPINT(ss,ix);
9622             TOPINT(nss,ix) = i;
9623             break;
9624         case SAVEt_DESTRUCTOR:
9625             ptr = POPPTR(ss,ix);
9626             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);  /* XXX quite arbitrary */
9627             dptr = POPDPTR(ss,ix);
9628             TOPDPTR(nss,ix) = (void (*)(void*))any_dup((void *)dptr, proto_perl);
9629             break;
9630         case SAVEt_DESTRUCTOR_X:
9631             ptr = POPPTR(ss,ix);
9632             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);  /* XXX quite arbitrary */
9633             dxptr = POPDXPTR(ss,ix);
9634             TOPDXPTR(nss,ix) = (void (*)(pTHX_ void*))any_dup((void *)dxptr, proto_perl);
9635             break;
9636         case SAVEt_REGCONTEXT:
9637         case SAVEt_ALLOC:
9638             i = POPINT(ss,ix);
9639             TOPINT(nss,ix) = i;
9640             ix -= i;
9641             break;
9642         case SAVEt_STACK_POS:           /* Position on Perl stack */
9643             i = POPINT(ss,ix);
9644             TOPINT(nss,ix) = i;
9645             break;
9646         case SAVEt_AELEM:               /* array element */
9647             sv = (SV*)POPPTR(ss,ix);
9648             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
9649             i = POPINT(ss,ix);
9650             TOPINT(nss,ix) = i;
9651             av = (AV*)POPPTR(ss,ix);
9652             TOPPTR(nss,ix) = av_dup_inc(av, param);
9653             break;
9654         case SAVEt_HELEM:               /* hash element */
9655             sv = (SV*)POPPTR(ss,ix);
9656             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
9657             sv = (SV*)POPPTR(ss,ix);
9658             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
9659             hv = (HV*)POPPTR(ss,ix);
9660             TOPPTR(nss,ix) = hv_dup_inc(hv, param);
9661             break;
9662         case SAVEt_OP:
9663             ptr = POPPTR(ss,ix);
9664             TOPPTR(nss,ix) = ptr;
9665             break;
9666         case SAVEt_HINTS:
9667             i = POPINT(ss,ix);
9668             TOPINT(nss,ix) = i;
9669             break;
9670         case SAVEt_COMPPAD:
9671             av = (AV*)POPPTR(ss,ix);
9672             TOPPTR(nss,ix) = av_dup(av, param);
9673             break;
9674         case SAVEt_PADSV:
9675             longval = (long)POPLONG(ss,ix);
9676             TOPLONG(nss,ix) = longval;
9677             ptr = POPPTR(ss,ix);
9678             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
9679             sv = (SV*)POPPTR(ss,ix);
9680             TOPPTR(nss,ix) = sv_dup(sv, param);
9681             break;
9682         default:
9683             Perl_croak(aTHX_ "panic: ss_dup inconsistency");
9684         }
9685     }
9686
9687     return nss;
9688 }
9689
9690 /*
9691 =for apidoc perl_clone
9692
9693 Create and return a new interpreter by cloning the current one.
9694
9695 =cut
9696 */
9697
9698 /* XXX the above needs expanding by someone who actually understands it ! */
9699 EXTERN_C PerlInterpreter *
9700 perl_clone_host(PerlInterpreter* proto_perl, UV flags);
9701
9702 PerlInterpreter *
9703 perl_clone(PerlInterpreter *proto_perl, UV flags)
9704 {
9705 #ifdef PERL_IMPLICIT_SYS
9706
9707    /* perlhost.h so we need to call into it
9708    to clone the host, CPerlHost should have a c interface, sky */
9709
9710    if (flags & CLONEf_CLONE_HOST) {
9711        return perl_clone_host(proto_perl,flags);
9712    }
9713    return perl_clone_using(proto_perl, flags,
9714                             proto_perl->IMem,
9715                             proto_perl->IMemShared,
9716                             proto_perl->IMemParse,
9717                             proto_perl->IEnv,
9718                             proto_perl->IStdIO,
9719                             proto_perl->ILIO,
9720                             proto_perl->IDir,
9721                             proto_perl->ISock,
9722                             proto_perl->IProc);
9723 }
9724
9725 PerlInterpreter *
9726 perl_clone_using(PerlInterpreter *proto_perl, UV flags,
9727                  struct IPerlMem* ipM, struct IPerlMem* ipMS,
9728                  struct IPerlMem* ipMP, struct IPerlEnv* ipE,
9729                  struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
9730                  struct IPerlDir* ipD, struct IPerlSock* ipS,
9731                  struct IPerlProc* ipP)
9732 {
9733     /* XXX many of the string copies here can be optimized if they're
9734      * constants; they need to be allocated as common memory and just
9735      * their pointers copied. */
9736
9737     IV i;
9738     CLONE_PARAMS clone_params;
9739     CLONE_PARAMS* param = &clone_params;
9740
9741     PerlInterpreter *my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
9742     PERL_SET_THX(my_perl);
9743
9744 #  ifdef DEBUGGING
9745     memset(my_perl, 0xab, sizeof(PerlInterpreter));
9746     PL_markstack = 0;
9747     PL_scopestack = 0;
9748     PL_savestack = 0;
9749     PL_retstack = 0;
9750     PL_sig_pending = 0;
9751     Zero(&PL_debug_pad, 1, struct perl_debug_pad);
9752 #  else /* !DEBUGGING */
9753     Zero(my_perl, 1, PerlInterpreter);
9754 #  endif        /* DEBUGGING */
9755
9756     /* host pointers */
9757     PL_Mem              = ipM;
9758     PL_MemShared        = ipMS;
9759     PL_MemParse         = ipMP;
9760     PL_Env              = ipE;
9761     PL_StdIO            = ipStd;
9762     PL_LIO              = ipLIO;
9763     PL_Dir              = ipD;
9764     PL_Sock             = ipS;
9765     PL_Proc             = ipP;
9766 #else           /* !PERL_IMPLICIT_SYS */
9767     IV i;
9768     CLONE_PARAMS clone_params;
9769     CLONE_PARAMS* param = &clone_params;
9770     PerlInterpreter *my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
9771     PERL_SET_THX(my_perl);
9772
9773
9774
9775 #    ifdef DEBUGGING
9776     memset(my_perl, 0xab, sizeof(PerlInterpreter));
9777     PL_markstack = 0;
9778     PL_scopestack = 0;
9779     PL_savestack = 0;
9780     PL_retstack = 0;
9781     PL_sig_pending = 0;
9782     Zero(&PL_debug_pad, 1, struct perl_debug_pad);
9783 #    else       /* !DEBUGGING */
9784     Zero(my_perl, 1, PerlInterpreter);
9785 #    endif      /* DEBUGGING */
9786 #endif          /* PERL_IMPLICIT_SYS */
9787     param->flags = flags;
9788
9789     /* arena roots */
9790     PL_xiv_arenaroot    = NULL;
9791     PL_xiv_root         = NULL;
9792     PL_xnv_arenaroot    = NULL;
9793     PL_xnv_root         = NULL;
9794     PL_xrv_arenaroot    = NULL;
9795     PL_xrv_root         = NULL;
9796     PL_xpv_arenaroot    = NULL;
9797     PL_xpv_root         = NULL;
9798     PL_xpviv_arenaroot  = NULL;
9799     PL_xpviv_root       = NULL;
9800     PL_xpvnv_arenaroot  = NULL;
9801     PL_xpvnv_root       = NULL;
9802     PL_xpvcv_arenaroot  = NULL;
9803     PL_xpvcv_root       = NULL;
9804     PL_xpvav_arenaroot  = NULL;
9805     PL_xpvav_root       = NULL;
9806     PL_xpvhv_arenaroot  = NULL;
9807     PL_xpvhv_root       = NULL;
9808     PL_xpvmg_arenaroot  = NULL;
9809     PL_xpvmg_root       = NULL;
9810     PL_xpvlv_arenaroot  = NULL;
9811     PL_xpvlv_root       = NULL;
9812     PL_xpvbm_arenaroot  = NULL;
9813     PL_xpvbm_root       = NULL;
9814     PL_he_arenaroot     = NULL;
9815     PL_he_root          = NULL;
9816     PL_nice_chunk       = NULL;
9817     PL_nice_chunk_size  = 0;
9818     PL_sv_count         = 0;
9819     PL_sv_objcount      = 0;
9820     PL_sv_root          = Nullsv;
9821     PL_sv_arenaroot     = Nullsv;
9822
9823     PL_debug            = proto_perl->Idebug;
9824
9825 #ifdef USE_REENTRANT_API
9826     Perl_reentrant_init(aTHX);
9827 #endif
9828
9829     /* create SV map for pointer relocation */
9830     PL_ptr_table = ptr_table_new();
9831
9832     /* initialize these special pointers as early as possible */
9833     SvANY(&PL_sv_undef)         = NULL;
9834     SvREFCNT(&PL_sv_undef)      = (~(U32)0)/2;
9835     SvFLAGS(&PL_sv_undef)       = SVf_READONLY|SVt_NULL;
9836     ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
9837
9838     SvANY(&PL_sv_no)            = new_XPVNV();
9839     SvREFCNT(&PL_sv_no)         = (~(U32)0)/2;
9840     SvFLAGS(&PL_sv_no)          = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
9841     SvPVX(&PL_sv_no)            = SAVEPVN(PL_No, 0);
9842     SvCUR(&PL_sv_no)            = 0;
9843     SvLEN(&PL_sv_no)            = 1;
9844     SvNVX(&PL_sv_no)            = 0;
9845     ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
9846
9847     SvANY(&PL_sv_yes)           = new_XPVNV();
9848     SvREFCNT(&PL_sv_yes)        = (~(U32)0)/2;
9849     SvFLAGS(&PL_sv_yes)         = SVp_NOK|SVf_NOK|SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
9850     SvPVX(&PL_sv_yes)           = SAVEPVN(PL_Yes, 1);
9851     SvCUR(&PL_sv_yes)           = 1;
9852     SvLEN(&PL_sv_yes)           = 2;
9853     SvNVX(&PL_sv_yes)           = 1;
9854     ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
9855
9856     /* create (a non-shared!) shared string table */
9857     PL_strtab           = newHV();
9858     HvSHAREKEYS_off(PL_strtab);
9859     hv_ksplit(PL_strtab, 512);
9860     ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
9861
9862     PL_compiling = proto_perl->Icompiling;
9863
9864     /* These two PVs will be free'd special way so must set them same way op.c does */
9865     PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
9866     ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
9867
9868     PL_compiling.cop_file    = savesharedpv(PL_compiling.cop_file);
9869     ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
9870
9871     ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
9872     if (!specialWARN(PL_compiling.cop_warnings))
9873         PL_compiling.cop_warnings = sv_dup_inc(PL_compiling.cop_warnings, param);
9874     if (!specialCopIO(PL_compiling.cop_io))
9875         PL_compiling.cop_io = sv_dup_inc(PL_compiling.cop_io, param);
9876     PL_curcop           = (COP*)any_dup(proto_perl->Tcurcop, proto_perl);
9877
9878     /* pseudo environmental stuff */
9879     PL_origargc         = proto_perl->Iorigargc;
9880     i = PL_origargc;
9881     New(0, PL_origargv, i+1, char*);
9882     PL_origargv[i] = '\0';
9883     while (i-- > 0) {
9884         PL_origargv[i]  = SAVEPV(proto_perl->Iorigargv[i]);
9885     }
9886
9887     param->stashes      = newAV();  /* Setup array of objects to call clone on */
9888
9889 #ifdef PERLIO_LAYERS
9890     /* Clone PerlIO tables as soon as we can handle general xx_dup() */
9891     PerlIO_clone(aTHX_ proto_perl, param);
9892 #endif
9893
9894     PL_envgv            = gv_dup(proto_perl->Ienvgv, param);
9895     PL_incgv            = gv_dup(proto_perl->Iincgv, param);
9896     PL_hintgv           = gv_dup(proto_perl->Ihintgv, param);
9897     PL_origfilename     = SAVEPV(proto_perl->Iorigfilename);
9898     PL_diehook          = sv_dup_inc(proto_perl->Idiehook, param);
9899     PL_warnhook         = sv_dup_inc(proto_perl->Iwarnhook, param);
9900
9901     /* switches */
9902     PL_minus_c          = proto_perl->Iminus_c;
9903     PL_patchlevel       = sv_dup_inc(proto_perl->Ipatchlevel, param);
9904     PL_localpatches     = proto_perl->Ilocalpatches;
9905     PL_splitstr         = proto_perl->Isplitstr;
9906     PL_preprocess       = proto_perl->Ipreprocess;
9907     PL_minus_n          = proto_perl->Iminus_n;
9908     PL_minus_p          = proto_perl->Iminus_p;
9909     PL_minus_l          = proto_perl->Iminus_l;
9910     PL_minus_a          = proto_perl->Iminus_a;
9911     PL_minus_F          = proto_perl->Iminus_F;
9912     PL_doswitches       = proto_perl->Idoswitches;
9913     PL_dowarn           = proto_perl->Idowarn;
9914     PL_doextract        = proto_perl->Idoextract;
9915     PL_sawampersand     = proto_perl->Isawampersand;
9916     PL_unsafe           = proto_perl->Iunsafe;
9917     PL_inplace          = SAVEPV(proto_perl->Iinplace);
9918     PL_e_script         = sv_dup_inc(proto_perl->Ie_script, param);
9919     PL_perldb           = proto_perl->Iperldb;
9920     PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
9921     PL_exit_flags       = proto_perl->Iexit_flags;
9922
9923     /* magical thingies */
9924     /* XXX time(&PL_basetime) when asked for? */
9925     PL_basetime         = proto_perl->Ibasetime;
9926     PL_formfeed         = sv_dup(proto_perl->Iformfeed, param);
9927
9928     PL_maxsysfd         = proto_perl->Imaxsysfd;
9929     PL_multiline        = proto_perl->Imultiline;
9930     PL_statusvalue      = proto_perl->Istatusvalue;
9931 #ifdef VMS
9932     PL_statusvalue_vms  = proto_perl->Istatusvalue_vms;
9933 #endif
9934     PL_encoding         = sv_dup(proto_perl->Iencoding, param);
9935
9936     sv_setpvn(PERL_DEBUG_PAD(0), "", 0);        /* For regex debugging. */
9937     sv_setpvn(PERL_DEBUG_PAD(1), "", 0);        /* ext/re needs these */
9938     sv_setpvn(PERL_DEBUG_PAD(2), "", 0);        /* even without DEBUGGING. */
9939
9940     /* Clone the regex array */
9941     PL_regex_padav = newAV();
9942     {
9943         I32 len = av_len((AV*)proto_perl->Iregex_padav);
9944         SV** regexen = AvARRAY((AV*)proto_perl->Iregex_padav);
9945         av_push(PL_regex_padav,
9946                 sv_dup_inc(regexen[0],param));
9947         for(i = 1; i <= len; i++) {
9948             if(SvREPADTMP(regexen[i])) {
9949               av_push(PL_regex_padav, sv_dup_inc(regexen[i], param));
9950             } else {
9951                 av_push(PL_regex_padav,
9952                     SvREFCNT_inc(
9953                         newSViv(PTR2IV(re_dup(INT2PTR(REGEXP *,
9954                              SvIVX(regexen[i])), param)))
9955                        ));
9956             }
9957         }
9958     }
9959     PL_regex_pad = AvARRAY(PL_regex_padav);
9960
9961     /* shortcuts to various I/O objects */
9962     PL_stdingv          = gv_dup(proto_perl->Istdingv, param);
9963     PL_stderrgv         = gv_dup(proto_perl->Istderrgv, param);
9964     PL_defgv            = gv_dup(proto_perl->Idefgv, param);
9965     PL_argvgv           = gv_dup(proto_perl->Iargvgv, param);
9966     PL_argvoutgv        = gv_dup(proto_perl->Iargvoutgv, param);
9967     PL_argvout_stack    = av_dup_inc(proto_perl->Iargvout_stack, param);
9968
9969     /* shortcuts to regexp stuff */
9970     PL_replgv           = gv_dup(proto_perl->Ireplgv, param);
9971
9972     /* shortcuts to misc objects */
9973     PL_errgv            = gv_dup(proto_perl->Ierrgv, param);
9974
9975     /* shortcuts to debugging objects */
9976     PL_DBgv             = gv_dup(proto_perl->IDBgv, param);
9977     PL_DBline           = gv_dup(proto_perl->IDBline, param);
9978     PL_DBsub            = gv_dup(proto_perl->IDBsub, param);
9979     PL_DBsingle         = sv_dup(proto_perl->IDBsingle, param);
9980     PL_DBtrace          = sv_dup(proto_perl->IDBtrace, param);
9981     PL_DBsignal         = sv_dup(proto_perl->IDBsignal, param);
9982     PL_lineary          = av_dup(proto_perl->Ilineary, param);
9983     PL_dbargs           = av_dup(proto_perl->Idbargs, param);
9984
9985     /* symbol tables */
9986     PL_defstash         = hv_dup_inc(proto_perl->Tdefstash, param);
9987     PL_curstash         = hv_dup(proto_perl->Tcurstash, param);
9988     PL_nullstash       = hv_dup(proto_perl->Inullstash, param);
9989     PL_debstash         = hv_dup(proto_perl->Idebstash, param);
9990     PL_globalstash      = hv_dup(proto_perl->Iglobalstash, param);
9991     PL_curstname        = sv_dup_inc(proto_perl->Icurstname, param);
9992
9993     PL_beginav          = av_dup_inc(proto_perl->Ibeginav, param);
9994     PL_beginav_save     = av_dup_inc(proto_perl->Ibeginav_save, param);
9995     PL_endav            = av_dup_inc(proto_perl->Iendav, param);
9996     PL_checkav          = av_dup_inc(proto_perl->Icheckav, param);
9997     PL_initav           = av_dup_inc(proto_perl->Iinitav, param);
9998
9999     PL_sub_generation   = proto_perl->Isub_generation;
10000
10001     /* funky return mechanisms */
10002     PL_forkprocess      = proto_perl->Iforkprocess;
10003
10004     /* subprocess state */
10005     PL_fdpid            = av_dup_inc(proto_perl->Ifdpid, param);
10006
10007     /* internal state */
10008     PL_tainting         = proto_perl->Itainting;
10009     PL_maxo             = proto_perl->Imaxo;
10010     if (proto_perl->Iop_mask)
10011         PL_op_mask      = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
10012     else
10013         PL_op_mask      = Nullch;
10014
10015     /* current interpreter roots */
10016     PL_main_cv          = cv_dup_inc(proto_perl->Imain_cv, param);
10017     PL_main_root        = OpREFCNT_inc(proto_perl->Imain_root);
10018     PL_main_start       = proto_perl->Imain_start;
10019     PL_eval_root        = proto_perl->Ieval_root;
10020     PL_eval_start       = proto_perl->Ieval_start;
10021
10022     /* runtime control stuff */
10023     PL_curcopdb         = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
10024     PL_copline          = proto_perl->Icopline;
10025
10026     PL_filemode         = proto_perl->Ifilemode;
10027     PL_lastfd           = proto_perl->Ilastfd;
10028     PL_oldname          = proto_perl->Ioldname;         /* XXX not quite right */
10029     PL_Argv             = NULL;
10030     PL_Cmd              = Nullch;
10031     PL_gensym           = proto_perl->Igensym;
10032     PL_preambled        = proto_perl->Ipreambled;
10033     PL_preambleav       = av_dup_inc(proto_perl->Ipreambleav, param);
10034     PL_laststatval      = proto_perl->Ilaststatval;
10035     PL_laststype        = proto_perl->Ilaststype;
10036     PL_mess_sv          = Nullsv;
10037
10038     PL_ors_sv           = sv_dup_inc(proto_perl->Iors_sv, param);
10039     PL_ofmt             = SAVEPV(proto_perl->Iofmt);
10040
10041     /* interpreter atexit processing */
10042     PL_exitlistlen      = proto_perl->Iexitlistlen;
10043     if (PL_exitlistlen) {
10044         New(0, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
10045         Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
10046     }
10047     else
10048         PL_exitlist     = (PerlExitListEntry*)NULL;
10049     PL_modglobal        = hv_dup_inc(proto_perl->Imodglobal, param);
10050     PL_custom_op_names  = hv_dup_inc(proto_perl->Icustom_op_names,param);
10051     PL_custom_op_descs  = hv_dup_inc(proto_perl->Icustom_op_descs,param);
10052
10053     PL_profiledata      = NULL;
10054     PL_rsfp             = fp_dup(proto_perl->Irsfp, '<', param);
10055     /* PL_rsfp_filters entries have fake IoDIRP() */
10056     PL_rsfp_filters     = av_dup_inc(proto_perl->Irsfp_filters, param);
10057
10058     PL_compcv                   = cv_dup(proto_perl->Icompcv, param);
10059     PL_comppad                  = av_dup(proto_perl->Icomppad, param);
10060     PL_comppad_name             = av_dup(proto_perl->Icomppad_name, param);
10061     PL_comppad_name_fill        = proto_perl->Icomppad_name_fill;
10062     PL_comppad_name_floor       = proto_perl->Icomppad_name_floor;
10063     PL_curpad                   = (SV**)ptr_table_fetch(PL_ptr_table,
10064                                                         proto_perl->Tcurpad);
10065
10066 #ifdef HAVE_INTERP_INTERN
10067     sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
10068 #endif
10069
10070     /* more statics moved here */
10071     PL_generation       = proto_perl->Igeneration;
10072     PL_DBcv             = cv_dup(proto_perl->IDBcv, param);
10073
10074     PL_in_clean_objs    = proto_perl->Iin_clean_objs;
10075     PL_in_clean_all     = proto_perl->Iin_clean_all;
10076
10077     PL_uid              = proto_perl->Iuid;
10078     PL_euid             = proto_perl->Ieuid;
10079     PL_gid              = proto_perl->Igid;
10080     PL_egid             = proto_perl->Iegid;
10081     PL_nomemok          = proto_perl->Inomemok;
10082     PL_an               = proto_perl->Ian;
10083     PL_cop_seqmax       = proto_perl->Icop_seqmax;
10084     PL_op_seqmax        = proto_perl->Iop_seqmax;
10085     PL_evalseq          = proto_perl->Ievalseq;
10086     PL_origenviron      = proto_perl->Iorigenviron;     /* XXX not quite right */
10087     PL_origalen         = proto_perl->Iorigalen;
10088     PL_pidstatus        = newHV();                      /* XXX flag for cloning? */
10089     PL_osname           = SAVEPV(proto_perl->Iosname);
10090     PL_sh_path          = proto_perl->Ish_path; /* XXX never deallocated */
10091     PL_sighandlerp      = proto_perl->Isighandlerp;
10092
10093
10094     PL_runops           = proto_perl->Irunops;
10095
10096     Copy(proto_perl->Itokenbuf, PL_tokenbuf, 256, char);
10097
10098 #ifdef CSH
10099     PL_cshlen           = proto_perl->Icshlen;
10100     PL_cshname          = proto_perl->Icshname; /* XXX never deallocated */
10101 #endif
10102
10103     PL_lex_state        = proto_perl->Ilex_state;
10104     PL_lex_defer        = proto_perl->Ilex_defer;
10105     PL_lex_expect       = proto_perl->Ilex_expect;
10106     PL_lex_formbrack    = proto_perl->Ilex_formbrack;
10107     PL_lex_dojoin       = proto_perl->Ilex_dojoin;
10108     PL_lex_starts       = proto_perl->Ilex_starts;
10109     PL_lex_stuff        = sv_dup_inc(proto_perl->Ilex_stuff, param);
10110     PL_lex_repl         = sv_dup_inc(proto_perl->Ilex_repl, param);
10111     PL_lex_op           = proto_perl->Ilex_op;
10112     PL_lex_inpat        = proto_perl->Ilex_inpat;
10113     PL_lex_inwhat       = proto_perl->Ilex_inwhat;
10114     PL_lex_brackets     = proto_perl->Ilex_brackets;
10115     i = (PL_lex_brackets < 120 ? 120 : PL_lex_brackets);
10116     PL_lex_brackstack   = SAVEPVN(proto_perl->Ilex_brackstack,i);
10117     PL_lex_casemods     = proto_perl->Ilex_casemods;
10118     i = (PL_lex_casemods < 12 ? 12 : PL_lex_casemods);
10119     PL_lex_casestack    = SAVEPVN(proto_perl->Ilex_casestack,i);
10120
10121     Copy(proto_perl->Inextval, PL_nextval, 5, YYSTYPE);
10122     Copy(proto_perl->Inexttype, PL_nexttype, 5, I32);
10123     PL_nexttoke         = proto_perl->Inexttoke;
10124
10125     PL_linestr          = sv_dup_inc(proto_perl->Ilinestr, param);
10126     i = proto_perl->Ibufptr - SvPVX(proto_perl->Ilinestr);
10127     PL_bufptr           = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10128     i = proto_perl->Ioldbufptr - SvPVX(proto_perl->Ilinestr);
10129     PL_oldbufptr        = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10130     i = proto_perl->Ioldoldbufptr - SvPVX(proto_perl->Ilinestr);
10131     PL_oldoldbufptr     = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10132     PL_bufend           = SvPVX(PL_linestr) + SvCUR(PL_linestr);
10133     i = proto_perl->Ilinestart - SvPVX(proto_perl->Ilinestr);
10134     PL_linestart        = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10135     PL_pending_ident    = proto_perl->Ipending_ident;
10136     PL_sublex_info      = proto_perl->Isublex_info;     /* XXX not quite right */
10137
10138     PL_expect           = proto_perl->Iexpect;
10139
10140     PL_multi_start      = proto_perl->Imulti_start;
10141     PL_multi_end        = proto_perl->Imulti_end;
10142     PL_multi_open       = proto_perl->Imulti_open;
10143     PL_multi_close      = proto_perl->Imulti_close;
10144
10145     PL_error_count      = proto_perl->Ierror_count;
10146     PL_subline          = proto_perl->Isubline;
10147     PL_subname          = sv_dup_inc(proto_perl->Isubname, param);
10148
10149     PL_min_intro_pending        = proto_perl->Imin_intro_pending;
10150     PL_max_intro_pending        = proto_perl->Imax_intro_pending;
10151     PL_padix                    = proto_perl->Ipadix;
10152     PL_padix_floor              = proto_perl->Ipadix_floor;
10153     PL_pad_reset_pending        = proto_perl->Ipad_reset_pending;
10154
10155     i = proto_perl->Ilast_uni - SvPVX(proto_perl->Ilinestr);
10156     PL_last_uni         = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10157     i = proto_perl->Ilast_lop - SvPVX(proto_perl->Ilinestr);
10158     PL_last_lop         = SvPVX(PL_linestr) + (i < 0 ? 0 : i);
10159     PL_last_lop_op      = proto_perl->Ilast_lop_op;
10160     PL_in_my            = proto_perl->Iin_my;
10161     PL_in_my_stash      = hv_dup(proto_perl->Iin_my_stash, param);
10162 #ifdef FCRYPT
10163     PL_cryptseen        = proto_perl->Icryptseen;
10164 #endif
10165
10166     PL_hints            = proto_perl->Ihints;
10167
10168     PL_amagic_generation        = proto_perl->Iamagic_generation;
10169
10170 #ifdef USE_LOCALE_COLLATE
10171     PL_collation_ix     = proto_perl->Icollation_ix;
10172     PL_collation_name   = SAVEPV(proto_perl->Icollation_name);
10173     PL_collation_standard       = proto_perl->Icollation_standard;
10174     PL_collxfrm_base    = proto_perl->Icollxfrm_base;
10175     PL_collxfrm_mult    = proto_perl->Icollxfrm_mult;
10176 #endif /* USE_LOCALE_COLLATE */
10177
10178 #ifdef USE_LOCALE_NUMERIC
10179     PL_numeric_name     = SAVEPV(proto_perl->Inumeric_name);
10180     PL_numeric_standard = proto_perl->Inumeric_standard;
10181     PL_numeric_local    = proto_perl->Inumeric_local;
10182     PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
10183 #endif /* !USE_LOCALE_NUMERIC */
10184
10185     /* utf8 character classes */
10186     PL_utf8_alnum       = sv_dup_inc(proto_perl->Iutf8_alnum, param);
10187     PL_utf8_alnumc      = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
10188     PL_utf8_ascii       = sv_dup_inc(proto_perl->Iutf8_ascii, param);
10189     PL_utf8_alpha       = sv_dup_inc(proto_perl->Iutf8_alpha, param);
10190     PL_utf8_space       = sv_dup_inc(proto_perl->Iutf8_space, param);
10191     PL_utf8_cntrl       = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
10192     PL_utf8_graph       = sv_dup_inc(proto_perl->Iutf8_graph, param);
10193     PL_utf8_digit       = sv_dup_inc(proto_perl->Iutf8_digit, param);
10194     PL_utf8_upper       = sv_dup_inc(proto_perl->Iutf8_upper, param);
10195     PL_utf8_lower       = sv_dup_inc(proto_perl->Iutf8_lower, param);
10196     PL_utf8_print       = sv_dup_inc(proto_perl->Iutf8_print, param);
10197     PL_utf8_punct       = sv_dup_inc(proto_perl->Iutf8_punct, param);
10198     PL_utf8_xdigit      = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
10199     PL_utf8_mark        = sv_dup_inc(proto_perl->Iutf8_mark, param);
10200     PL_utf8_toupper     = sv_dup_inc(proto_perl->Iutf8_toupper, param);
10201     PL_utf8_totitle     = sv_dup_inc(proto_perl->Iutf8_totitle, param);
10202     PL_utf8_tolower     = sv_dup_inc(proto_perl->Iutf8_tolower, param);
10203     PL_utf8_tofold      = sv_dup_inc(proto_perl->Iutf8_tofold, param);
10204     PL_utf8_idstart     = sv_dup_inc(proto_perl->Iutf8_idstart, param);
10205     PL_utf8_idcont      = sv_dup_inc(proto_perl->Iutf8_idcont, param);
10206
10207     /* swatch cache */
10208     PL_last_swash_hv    = Nullhv;       /* reinits on demand */
10209     PL_last_swash_klen  = 0;
10210     PL_last_swash_key[0]= '\0';
10211     PL_last_swash_tmps  = (U8*)NULL;
10212     PL_last_swash_slen  = 0;
10213
10214     /* perly.c globals */
10215     PL_yydebug          = proto_perl->Iyydebug;
10216     PL_yynerrs          = proto_perl->Iyynerrs;
10217     PL_yyerrflag        = proto_perl->Iyyerrflag;
10218     PL_yychar           = proto_perl->Iyychar;
10219     PL_yyval            = proto_perl->Iyyval;
10220     PL_yylval           = proto_perl->Iyylval;
10221
10222     PL_glob_index       = proto_perl->Iglob_index;
10223     PL_srand_called     = proto_perl->Isrand_called;
10224     PL_uudmap['M']      = 0;            /* reinits on demand */
10225     PL_bitcount         = Nullch;       /* reinits on demand */
10226
10227     if (proto_perl->Ipsig_pend) {
10228         Newz(0, PL_psig_pend, SIG_SIZE, int);
10229     }
10230     else {
10231         PL_psig_pend    = (int*)NULL;
10232     }
10233
10234     if (proto_perl->Ipsig_ptr) {
10235         Newz(0, PL_psig_ptr,  SIG_SIZE, SV*);
10236         Newz(0, PL_psig_name, SIG_SIZE, SV*);
10237         for (i = 1; i < SIG_SIZE; i++) {
10238             PL_psig_ptr[i]  = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
10239             PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
10240         }
10241     }
10242     else {
10243         PL_psig_ptr     = (SV**)NULL;
10244         PL_psig_name    = (SV**)NULL;
10245     }
10246
10247     /* thrdvar.h stuff */
10248
10249     if (flags & CLONEf_COPY_STACKS) {
10250         /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
10251         PL_tmps_ix              = proto_perl->Ttmps_ix;
10252         PL_tmps_max             = proto_perl->Ttmps_max;
10253         PL_tmps_floor           = proto_perl->Ttmps_floor;
10254         Newz(50, PL_tmps_stack, PL_tmps_max, SV*);
10255         i = 0;
10256         while (i <= PL_tmps_ix) {
10257             PL_tmps_stack[i]    = sv_dup_inc(proto_perl->Ttmps_stack[i], param);
10258             ++i;
10259         }
10260
10261         /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
10262         i = proto_perl->Tmarkstack_max - proto_perl->Tmarkstack;
10263         Newz(54, PL_markstack, i, I32);
10264         PL_markstack_max        = PL_markstack + (proto_perl->Tmarkstack_max
10265                                                   - proto_perl->Tmarkstack);
10266         PL_markstack_ptr        = PL_markstack + (proto_perl->Tmarkstack_ptr
10267                                                   - proto_perl->Tmarkstack);
10268         Copy(proto_perl->Tmarkstack, PL_markstack,
10269              PL_markstack_ptr - PL_markstack + 1, I32);
10270
10271         /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
10272          * NOTE: unlike the others! */
10273         PL_scopestack_ix        = proto_perl->Tscopestack_ix;
10274         PL_scopestack_max       = proto_perl->Tscopestack_max;
10275         Newz(54, PL_scopestack, PL_scopestack_max, I32);
10276         Copy(proto_perl->Tscopestack, PL_scopestack, PL_scopestack_ix, I32);
10277
10278         /* next push_return() sets PL_retstack[PL_retstack_ix]
10279          * NOTE: unlike the others! */
10280         PL_retstack_ix          = proto_perl->Tretstack_ix;
10281         PL_retstack_max         = proto_perl->Tretstack_max;
10282         Newz(54, PL_retstack, PL_retstack_max, OP*);
10283         Copy(proto_perl->Tretstack, PL_retstack, PL_retstack_ix, OP*);
10284
10285         /* NOTE: si_dup() looks at PL_markstack */
10286         PL_curstackinfo         = si_dup(proto_perl->Tcurstackinfo, param);
10287
10288         /* PL_curstack          = PL_curstackinfo->si_stack; */
10289         PL_curstack             = av_dup(proto_perl->Tcurstack, param);
10290         PL_mainstack            = av_dup(proto_perl->Tmainstack, param);
10291
10292         /* next PUSHs() etc. set *(PL_stack_sp+1) */
10293         PL_stack_base           = AvARRAY(PL_curstack);
10294         PL_stack_sp             = PL_stack_base + (proto_perl->Tstack_sp
10295                                                    - proto_perl->Tstack_base);
10296         PL_stack_max            = PL_stack_base + AvMAX(PL_curstack);
10297
10298         /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
10299          * NOTE: unlike the others! */
10300         PL_savestack_ix         = proto_perl->Tsavestack_ix;
10301         PL_savestack_max        = proto_perl->Tsavestack_max;
10302         /*Newz(54, PL_savestack, PL_savestack_max, ANY);*/
10303         PL_savestack            = ss_dup(proto_perl, param);
10304     }
10305     else {
10306         init_stacks();
10307         ENTER;                  /* perl_destruct() wants to LEAVE; */
10308     }
10309
10310     PL_start_env        = proto_perl->Tstart_env;       /* XXXXXX */
10311     PL_top_env          = &PL_start_env;
10312
10313     PL_op               = proto_perl->Top;
10314
10315     PL_Sv               = Nullsv;
10316     PL_Xpv              = (XPV*)NULL;
10317     PL_na               = proto_perl->Tna;
10318
10319     PL_statbuf          = proto_perl->Tstatbuf;
10320     PL_statcache        = proto_perl->Tstatcache;
10321     PL_statgv           = gv_dup(proto_perl->Tstatgv, param);
10322     PL_statname         = sv_dup_inc(proto_perl->Tstatname, param);
10323 #ifdef HAS_TIMES
10324     PL_timesbuf         = proto_perl->Ttimesbuf;
10325 #endif
10326
10327     PL_tainted          = proto_perl->Ttainted;
10328     PL_curpm            = proto_perl->Tcurpm;   /* XXX No PMOP ref count */
10329     PL_rs               = sv_dup_inc(proto_perl->Trs, param);
10330     PL_last_in_gv       = gv_dup(proto_perl->Tlast_in_gv, param);
10331     PL_ofs_sv           = sv_dup_inc(proto_perl->Tofs_sv, param);
10332     PL_defoutgv         = gv_dup_inc(proto_perl->Tdefoutgv, param);
10333     PL_chopset          = proto_perl->Tchopset; /* XXX never deallocated */
10334     PL_toptarget        = sv_dup_inc(proto_perl->Ttoptarget, param);
10335     PL_bodytarget       = sv_dup_inc(proto_perl->Tbodytarget, param);
10336     PL_formtarget       = sv_dup(proto_perl->Tformtarget, param);
10337
10338     PL_restartop        = proto_perl->Trestartop;
10339     PL_in_eval          = proto_perl->Tin_eval;
10340     PL_delaymagic       = proto_perl->Tdelaymagic;
10341     PL_dirty            = proto_perl->Tdirty;
10342     PL_localizing       = proto_perl->Tlocalizing;
10343
10344 #ifdef PERL_FLEXIBLE_EXCEPTIONS
10345     PL_protect          = proto_perl->Tprotect;
10346 #endif
10347     PL_errors           = sv_dup_inc(proto_perl->Terrors, param);
10348     PL_av_fetch_sv      = Nullsv;
10349     PL_hv_fetch_sv      = Nullsv;
10350     Zero(&PL_hv_fetch_ent_mh, 1, HE);                   /* XXX */
10351     PL_modcount         = proto_perl->Tmodcount;
10352     PL_lastgotoprobe    = Nullop;
10353     PL_dumpindent       = proto_perl->Tdumpindent;
10354
10355     PL_sortcop          = (OP*)any_dup(proto_perl->Tsortcop, proto_perl);
10356     PL_sortstash        = hv_dup(proto_perl->Tsortstash, param);
10357     PL_firstgv          = gv_dup(proto_perl->Tfirstgv, param);
10358     PL_secondgv         = gv_dup(proto_perl->Tsecondgv, param);
10359     PL_sortcxix         = proto_perl->Tsortcxix;
10360     PL_efloatbuf        = Nullch;               /* reinits on demand */
10361     PL_efloatsize       = 0;                    /* reinits on demand */
10362
10363     /* regex stuff */
10364
10365     PL_screamfirst      = NULL;
10366     PL_screamnext       = NULL;
10367     PL_maxscream        = -1;                   /* reinits on demand */
10368     PL_lastscream       = Nullsv;
10369
10370     PL_watchaddr        = NULL;
10371     PL_watchok          = Nullch;
10372
10373     PL_regdummy         = proto_perl->Tregdummy;
10374     PL_regcomp_parse    = Nullch;
10375     PL_regxend          = Nullch;
10376     PL_regcode          = (regnode*)NULL;
10377     PL_regnaughty       = 0;
10378     PL_regsawback       = 0;
10379     PL_regprecomp       = Nullch;
10380     PL_regnpar          = 0;
10381     PL_regsize          = 0;
10382     PL_regflags         = 0;
10383     PL_regseen          = 0;
10384     PL_seen_zerolen     = 0;
10385     PL_seen_evals       = 0;
10386     PL_regcomp_rx       = (regexp*)NULL;
10387     PL_extralen         = 0;
10388     PL_colorset         = 0;            /* reinits PL_colors[] */
10389     /*PL_colors[6]      = {0,0,0,0,0,0};*/
10390     PL_reg_whilem_seen  = 0;
10391     PL_reginput         = Nullch;
10392     PL_regbol           = Nullch;
10393     PL_regeol           = Nullch;
10394     PL_regstartp        = (I32*)NULL;
10395     PL_regendp          = (I32*)NULL;
10396     PL_reglastparen     = (U32*)NULL;
10397     PL_regtill          = Nullch;
10398     PL_reg_start_tmp    = (char**)NULL;
10399     PL_reg_start_tmpl   = 0;
10400     PL_regdata          = (struct reg_data*)NULL;
10401     PL_bostr            = Nullch;
10402     PL_reg_flags        = 0;
10403     PL_reg_eval_set     = 0;
10404     PL_regnarrate       = 0;
10405     PL_regprogram       = (regnode*)NULL;
10406     PL_regindent        = 0;
10407     PL_regcc            = (CURCUR*)NULL;
10408     PL_reg_call_cc      = (struct re_cc_state*)NULL;
10409     PL_reg_re           = (regexp*)NULL;
10410     PL_reg_ganch        = Nullch;
10411     PL_reg_sv           = Nullsv;
10412     PL_reg_match_utf8   = FALSE;
10413     PL_reg_magic        = (MAGIC*)NULL;
10414     PL_reg_oldpos       = 0;
10415     PL_reg_oldcurpm     = (PMOP*)NULL;
10416     PL_reg_curpm        = (PMOP*)NULL;
10417     PL_reg_oldsaved     = Nullch;
10418     PL_reg_oldsavedlen  = 0;
10419     PL_reg_maxiter      = 0;
10420     PL_reg_leftiter     = 0;
10421     PL_reg_poscache     = Nullch;
10422     PL_reg_poscache_size= 0;
10423
10424     /* RE engine - function pointers */
10425     PL_regcompp         = proto_perl->Tregcompp;
10426     PL_regexecp         = proto_perl->Tregexecp;
10427     PL_regint_start     = proto_perl->Tregint_start;
10428     PL_regint_string    = proto_perl->Tregint_string;
10429     PL_regfree          = proto_perl->Tregfree;
10430
10431     PL_reginterp_cnt    = 0;
10432     PL_reg_starttry     = 0;
10433
10434     /* Pluggable optimizer */
10435     PL_peepp            = proto_perl->Tpeepp;
10436
10437     if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
10438         ptr_table_free(PL_ptr_table);
10439         PL_ptr_table = NULL;
10440     }
10441
10442     /* Call the ->CLONE method, if it exists, for each of the stashes
10443        identified by sv_dup() above.
10444     */
10445     while(av_len(param->stashes) != -1) {
10446         HV* stash = (HV*) av_shift(param->stashes);
10447         GV* cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
10448         if (cloner && GvCV(cloner)) {
10449             dSP;
10450             ENTER;
10451             SAVETMPS;
10452             PUSHMARK(SP);
10453            XPUSHs(sv_2mortal(newSVpv(HvNAME(stash), 0)));
10454             PUTBACK;
10455             call_sv((SV*)GvCV(cloner), G_DISCARD);
10456             FREETMPS;
10457             LEAVE;
10458         }
10459     }
10460
10461     SvREFCNT_dec(param->stashes);
10462
10463     return my_perl;
10464 }
10465
10466 #endif /* USE_ITHREADS */
10467
10468 /*
10469 =head1 Unicode Support
10470
10471 =for apidoc sv_recode_to_utf8
10472
10473 The encoding is assumed to be an Encode object, on entry the PV
10474 of the sv is assumed to be octets in that encoding, and the sv
10475 will be converted into Unicode (and UTF-8).
10476
10477 If the sv already is UTF-8 (or if it is not POK), or if the encoding
10478 is not a reference, nothing is done to the sv.  If the encoding is not
10479 an C<Encode::XS> Encoding object, bad things will happen.
10480 (See F<lib/encoding.pm> and L<Encode>).
10481
10482 The PV of the sv is returned.
10483
10484 =cut */
10485
10486 char *
10487 Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
10488 {
10489      if (SvPOK(sv) && !DO_UTF8(sv) && SvROK(encoding)) {
10490           SV *uni;
10491           STRLEN len;
10492           char *s;
10493           dSP;
10494           ENTER;
10495           SAVETMPS;
10496           PUSHMARK(sp);
10497           EXTEND(SP, 3);
10498           XPUSHs(encoding);
10499           XPUSHs(sv);
10500           XPUSHs(&PL_sv_yes);
10501           PUTBACK;
10502           call_method("decode", G_SCALAR);
10503           SPAGAIN;
10504           uni = POPs;
10505           PUTBACK;
10506           s = SvPV(uni, len);
10507           if (s != SvPVX(sv)) {
10508                SvGROW(sv, len);
10509                Move(s, SvPVX(sv), len, char);
10510                SvCUR_set(sv, len);
10511           }
10512           FREETMPS;
10513           LEAVE;
10514           SvUTF8_on(sv);
10515      }
10516      return SvPVX(sv);
10517 }
10518
10519