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