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