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