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