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