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