e348643ee25ae84d2659edaecca6635df2d8b9a7
[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     /* something big */
920     { sizeof(struct regexp), sizeof(struct regexp), 0,
921       SVt_REGEXP, FALSE, HADNV, HASARENA, FIT_ARENA(0, sizeof(struct regexp))
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 sentinels 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 = newSVpvs_flags("", SVs_TEMP);
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                     /* FIXME - get rid of this cast away of const, or work out
2717                        how to do it better.  */
2718                     temp.mg_obj = (SV *)referent;
2719                     assert(temp.mg_obj);
2720                     (str) = CALLREG_AS_STR(&temp,lp,&flags,&haseval);
2721                     if (flags & 1)
2722                         SvUTF8_on(sv);
2723                     else
2724                         SvUTF8_off(sv);
2725                     PL_reginterp_cnt += haseval;
2726                     return str;
2727                 } else {
2728                     const char *const typestr = sv_reftype(referent, 0);
2729                     const STRLEN typelen = strlen(typestr);
2730                     UV addr = PTR2UV(referent);
2731                     const char *stashname = NULL;
2732                     STRLEN stashnamelen = 0; /* hush, gcc */
2733                     const char *buffer_end;
2734
2735                     if (SvOBJECT(referent)) {
2736                         const HEK *const name = HvNAME_HEK(SvSTASH(referent));
2737
2738                         if (name) {
2739                             stashname = HEK_KEY(name);
2740                             stashnamelen = HEK_LEN(name);
2741
2742                             if (HEK_UTF8(name)) {
2743                                 SvUTF8_on(sv);
2744                             } else {
2745                                 SvUTF8_off(sv);
2746                             }
2747                         } else {
2748                             stashname = "__ANON__";
2749                             stashnamelen = 8;
2750                         }
2751                         len = stashnamelen + 1 /* = */ + typelen + 3 /* (0x */
2752                             + 2 * sizeof(UV) + 2 /* )\0 */;
2753                     } else {
2754                         len = typelen + 3 /* (0x */
2755                             + 2 * sizeof(UV) + 2 /* )\0 */;
2756                     }
2757
2758                     Newx(buffer, len, char);
2759                     buffer_end = retval = buffer + len;
2760
2761                     /* Working backwards  */
2762                     *--retval = '\0';
2763                     *--retval = ')';
2764                     do {
2765                         *--retval = PL_hexdigit[addr & 15];
2766                     } while (addr >>= 4);
2767                     *--retval = 'x';
2768                     *--retval = '0';
2769                     *--retval = '(';
2770
2771                     retval -= typelen;
2772                     memcpy(retval, typestr, typelen);
2773
2774                     if (stashname) {
2775                         *--retval = '=';
2776                         retval -= stashnamelen;
2777                         memcpy(retval, stashname, stashnamelen);
2778                     }
2779                     /* retval may not neccesarily have reached the start of the
2780                        buffer here.  */
2781                     assert (retval >= buffer);
2782
2783                     len = buffer_end - retval - 1; /* -1 for that \0  */
2784                 }
2785                 if (lp)
2786                     *lp = len;
2787                 SAVEFREEPV(buffer);
2788                 return retval;
2789             }
2790         }
2791         if (SvREADONLY(sv) && !SvOK(sv)) {
2792             if (ckWARN(WARN_UNINITIALIZED))
2793                 report_uninit(sv);
2794             if (lp)
2795                 *lp = 0;
2796             return (char *)"";
2797         }
2798     }
2799     if (SvIOK(sv) || ((SvIOKp(sv) && !SvNOKp(sv)))) {
2800         /* I'm assuming that if both IV and NV are equally valid then
2801            converting the IV is going to be more efficient */
2802         const U32 isUIOK = SvIsUV(sv);
2803         char buf[TYPE_CHARS(UV)];
2804         char *ebuf, *ptr;
2805         STRLEN len;
2806
2807         if (SvTYPE(sv) < SVt_PVIV)
2808             sv_upgrade(sv, SVt_PVIV);
2809         ptr = uiv_2buf(buf, SvIVX(sv), SvUVX(sv), isUIOK, &ebuf);
2810         len = ebuf - ptr;
2811         /* inlined from sv_setpvn */
2812         s = SvGROW_mutable(sv, len + 1);
2813         Move(ptr, s, len, char);
2814         s += len;
2815         *s = '\0';
2816     }
2817     else if (SvNOKp(sv)) {
2818         const int olderrno = errno;
2819         if (SvTYPE(sv) < SVt_PVNV)
2820             sv_upgrade(sv, SVt_PVNV);
2821         /* The +20 is pure guesswork.  Configure test needed. --jhi */
2822         s = SvGROW_mutable(sv, NV_DIG + 20);
2823         /* some Xenix systems wipe out errno here */
2824 #ifdef apollo
2825         if (SvNVX(sv) == 0.0)
2826             my_strlcpy(s, "0", SvLEN(sv));
2827         else
2828 #endif /*apollo*/
2829         {
2830             Gconvert(SvNVX(sv), NV_DIG, 0, s);
2831         }
2832         errno = olderrno;
2833 #ifdef FIXNEGATIVEZERO
2834         if (*s == '-' && s[1] == '0' && !s[2]) {
2835             s[0] = '0';
2836             s[1] = 0;
2837         }
2838 #endif
2839         while (*s) s++;
2840 #ifdef hcx
2841         if (s[-1] == '.')
2842             *--s = '\0';
2843 #endif
2844     }
2845     else {
2846         if (isGV_with_GP(sv))
2847             return glob_2pv((GV *)sv, lp);
2848
2849         if (!PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP) && ckWARN(WARN_UNINITIALIZED))
2850             report_uninit(sv);
2851         if (lp)
2852             *lp = 0;
2853         if (SvTYPE(sv) < SVt_PV)
2854             /* Typically the caller expects that sv_any is not NULL now.  */
2855             sv_upgrade(sv, SVt_PV);
2856         return (char *)"";
2857     }
2858     {
2859         const STRLEN len = s - SvPVX_const(sv);
2860         if (lp) 
2861             *lp = len;
2862         SvCUR_set(sv, len);
2863     }
2864     SvPOK_on(sv);
2865     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
2866                           PTR2UV(sv),SvPVX_const(sv)));
2867     if (flags & SV_CONST_RETURN)
2868         return (char *)SvPVX_const(sv);
2869     if (flags & SV_MUTABLE_RETURN)
2870         return SvPVX_mutable(sv);
2871     return SvPVX(sv);
2872 }
2873
2874 /*
2875 =for apidoc sv_copypv
2876
2877 Copies a stringified representation of the source SV into the
2878 destination SV.  Automatically performs any necessary mg_get and
2879 coercion of numeric values into strings.  Guaranteed to preserve
2880 UTF8 flag even from overloaded objects.  Similar in nature to
2881 sv_2pv[_flags] but operates directly on an SV instead of just the
2882 string.  Mostly uses sv_2pv_flags to do its work, except when that
2883 would lose the UTF-8'ness of the PV.
2884
2885 =cut
2886 */
2887
2888 void
2889 Perl_sv_copypv(pTHX_ SV *dsv, register SV *ssv)
2890 {
2891     STRLEN len;
2892     const char * const s = SvPV_const(ssv,len);
2893     sv_setpvn(dsv,s,len);
2894     if (SvUTF8(ssv))
2895         SvUTF8_on(dsv);
2896     else
2897         SvUTF8_off(dsv);
2898 }
2899
2900 /*
2901 =for apidoc sv_2pvbyte
2902
2903 Return a pointer to the byte-encoded representation of the SV, and set *lp
2904 to its length.  May cause the SV to be downgraded from UTF-8 as a
2905 side-effect.
2906
2907 Usually accessed via the C<SvPVbyte> macro.
2908
2909 =cut
2910 */
2911
2912 char *
2913 Perl_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
2914 {
2915     sv_utf8_downgrade(sv,0);
2916     return lp ? SvPV(sv,*lp) : SvPV_nolen(sv);
2917 }
2918
2919 /*
2920 =for apidoc sv_2pvutf8
2921
2922 Return a pointer to the UTF-8-encoded representation of the SV, and set *lp
2923 to its length.  May cause the SV to be upgraded to UTF-8 as a side-effect.
2924
2925 Usually accessed via the C<SvPVutf8> macro.
2926
2927 =cut
2928 */
2929
2930 char *
2931 Perl_sv_2pvutf8(pTHX_ register SV *sv, STRLEN *lp)
2932 {
2933     sv_utf8_upgrade(sv);
2934     return lp ? SvPV(sv,*lp) : SvPV_nolen(sv);
2935 }
2936
2937
2938 /*
2939 =for apidoc sv_2bool
2940
2941 This function is only called on magical items, and is only used by
2942 sv_true() or its macro equivalent.
2943
2944 =cut
2945 */
2946
2947 bool
2948 Perl_sv_2bool(pTHX_ register SV *sv)
2949 {
2950     dVAR;
2951     SvGETMAGIC(sv);
2952
2953     if (!SvOK(sv))
2954         return 0;
2955     if (SvROK(sv)) {
2956         if (SvAMAGIC(sv)) {
2957             SV * const tmpsv = AMG_CALLun(sv,bool_);
2958             if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
2959                 return (bool)SvTRUE(tmpsv);
2960         }
2961         return SvRV(sv) != 0;
2962     }
2963     if (SvPOKp(sv)) {
2964         register XPV* const Xpvtmp = (XPV*)SvANY(sv);
2965         if (Xpvtmp &&
2966                 (*sv->sv_u.svu_pv > '0' ||
2967                 Xpvtmp->xpv_cur > 1 ||
2968                 (Xpvtmp->xpv_cur && *sv->sv_u.svu_pv != '0')))
2969             return 1;
2970         else
2971             return 0;
2972     }
2973     else {
2974         if (SvIOKp(sv))
2975             return SvIVX(sv) != 0;
2976         else {
2977             if (SvNOKp(sv))
2978                 return SvNVX(sv) != 0.0;
2979             else {
2980                 if (isGV_with_GP(sv))
2981                     return TRUE;
2982                 else
2983                     return FALSE;
2984             }
2985         }
2986     }
2987 }
2988
2989 /*
2990 =for apidoc sv_utf8_upgrade
2991
2992 Converts the PV of an SV to its UTF-8-encoded form.
2993 Forces the SV to string form if it is not already.
2994 Always sets the SvUTF8 flag to avoid future validity checks even
2995 if all the bytes have hibit clear.
2996
2997 This is not as a general purpose byte encoding to Unicode interface:
2998 use the Encode extension for that.
2999
3000 =for apidoc sv_utf8_upgrade_flags
3001
3002 Converts the PV of an SV to its UTF-8-encoded form.
3003 Forces the SV to string form if it is not already.
3004 Always sets the SvUTF8 flag to avoid future validity checks even
3005 if all the bytes have hibit clear. If C<flags> has C<SV_GMAGIC> bit set,
3006 will C<mg_get> on C<sv> if appropriate, else not. C<sv_utf8_upgrade> and
3007 C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
3008
3009 This is not as a general purpose byte encoding to Unicode interface:
3010 use the Encode extension for that.
3011
3012 =cut
3013 */
3014
3015 STRLEN
3016 Perl_sv_utf8_upgrade_flags(pTHX_ register SV *sv, I32 flags)
3017 {
3018     dVAR;
3019     if (sv == &PL_sv_undef)
3020         return 0;
3021     if (!SvPOK(sv)) {
3022         STRLEN len = 0;
3023         if (SvREADONLY(sv) && (SvPOKp(sv) || SvIOKp(sv) || SvNOKp(sv))) {
3024             (void) sv_2pv_flags(sv,&len, flags);
3025             if (SvUTF8(sv))
3026                 return len;
3027         } else {
3028             (void) SvPV_force(sv,len);
3029         }
3030     }
3031
3032     if (SvUTF8(sv)) {
3033         return SvCUR(sv);
3034     }
3035
3036     if (SvIsCOW(sv)) {
3037         sv_force_normal_flags(sv, 0);
3038     }
3039
3040     if (PL_encoding && !(flags & SV_UTF8_NO_ENCODING))
3041         sv_recode_to_utf8(sv, PL_encoding);
3042     else { /* Assume Latin-1/EBCDIC */
3043         /* This function could be much more efficient if we
3044          * had a FLAG in SVs to signal if there are any hibit
3045          * chars in the PV.  Given that there isn't such a flag
3046          * make the loop as fast as possible. */
3047         const U8 * const s = (U8 *) SvPVX_const(sv);
3048         const U8 * const e = (U8 *) SvEND(sv);
3049         const U8 *t = s;
3050         
3051         while (t < e) {
3052             const U8 ch = *t++;
3053             /* Check for hi bit */
3054             if (!NATIVE_IS_INVARIANT(ch)) {
3055                 STRLEN len = SvCUR(sv) + 1; /* Plus the \0 */
3056                 U8 * const recoded = bytes_to_utf8((U8*)s, &len);
3057
3058                 SvPV_free(sv); /* No longer using what was there before. */
3059                 SvPV_set(sv, (char*)recoded);
3060                 SvCUR_set(sv, len - 1);
3061                 SvLEN_set(sv, len); /* No longer know the real size. */
3062                 break;
3063             }
3064         }
3065         /* Mark as UTF-8 even if no hibit - saves scanning loop */
3066         SvUTF8_on(sv);
3067     }
3068     return SvCUR(sv);
3069 }
3070
3071 /*
3072 =for apidoc sv_utf8_downgrade
3073
3074 Attempts to convert the PV of an SV from characters to bytes.
3075 If the PV contains a character beyond byte, this conversion will fail;
3076 in this case, either returns false or, if C<fail_ok> is not
3077 true, croaks.
3078
3079 This is not as a general purpose Unicode to byte encoding interface:
3080 use the Encode extension for that.
3081
3082 =cut
3083 */
3084
3085 bool
3086 Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
3087 {
3088     dVAR;
3089     if (SvPOKp(sv) && SvUTF8(sv)) {
3090         if (SvCUR(sv)) {
3091             U8 *s;
3092             STRLEN len;
3093
3094             if (SvIsCOW(sv)) {
3095                 sv_force_normal_flags(sv, 0);
3096             }
3097             s = (U8 *) SvPV(sv, len);
3098             if (!utf8_to_bytes(s, &len)) {
3099                 if (fail_ok)
3100                     return FALSE;
3101                 else {
3102                     if (PL_op)
3103                         Perl_croak(aTHX_ "Wide character in %s",
3104                                    OP_DESC(PL_op));
3105                     else
3106                         Perl_croak(aTHX_ "Wide character");
3107                 }
3108             }
3109             SvCUR_set(sv, len);
3110         }
3111     }
3112     SvUTF8_off(sv);
3113     return TRUE;
3114 }
3115
3116 /*
3117 =for apidoc sv_utf8_encode
3118
3119 Converts the PV of an SV to UTF-8, but then turns the C<SvUTF8>
3120 flag off so that it looks like octets again.
3121
3122 =cut
3123 */
3124
3125 void
3126 Perl_sv_utf8_encode(pTHX_ register SV *sv)
3127 {
3128     if (SvIsCOW(sv)) {
3129         sv_force_normal_flags(sv, 0);
3130     }
3131     if (SvREADONLY(sv)) {
3132         Perl_croak(aTHX_ PL_no_modify);
3133     }
3134     (void) sv_utf8_upgrade(sv);
3135     SvUTF8_off(sv);
3136 }
3137
3138 /*
3139 =for apidoc sv_utf8_decode
3140
3141 If the PV of the SV is an octet sequence in UTF-8
3142 and contains a multiple-byte character, the C<SvUTF8> flag is turned on
3143 so that it looks like a character. If the PV contains only single-byte
3144 characters, the C<SvUTF8> flag stays being off.
3145 Scans PV for validity and returns false if the PV is invalid UTF-8.
3146
3147 =cut
3148 */
3149
3150 bool
3151 Perl_sv_utf8_decode(pTHX_ register SV *sv)
3152 {
3153     if (SvPOKp(sv)) {
3154         const U8 *c;
3155         const U8 *e;
3156
3157         /* The octets may have got themselves encoded - get them back as
3158          * bytes
3159          */
3160         if (!sv_utf8_downgrade(sv, TRUE))
3161             return FALSE;
3162
3163         /* it is actually just a matter of turning the utf8 flag on, but
3164          * we want to make sure everything inside is valid utf8 first.
3165          */
3166         c = (const U8 *) SvPVX_const(sv);
3167         if (!is_utf8_string(c, SvCUR(sv)+1))
3168             return FALSE;
3169         e = (const U8 *) SvEND(sv);
3170         while (c < e) {
3171             const U8 ch = *c++;
3172             if (!UTF8_IS_INVARIANT(ch)) {
3173                 SvUTF8_on(sv);
3174                 break;
3175             }
3176         }
3177     }
3178     return TRUE;
3179 }
3180
3181 /*
3182 =for apidoc sv_setsv
3183
3184 Copies the contents of the source SV C<ssv> into the destination SV
3185 C<dsv>.  The source SV may be destroyed if it is mortal, so don't use this
3186 function if the source SV needs to be reused. Does not handle 'set' magic.
3187 Loosely speaking, it performs a copy-by-value, obliterating any previous
3188 content of the destination.
3189
3190 You probably want to use one of the assortment of wrappers, such as
3191 C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3192 C<SvSetMagicSV_nosteal>.
3193
3194 =for apidoc sv_setsv_flags
3195
3196 Copies the contents of the source SV C<ssv> into the destination SV
3197 C<dsv>.  The source SV may be destroyed if it is mortal, so don't use this
3198 function if the source SV needs to be reused. Does not handle 'set' magic.
3199 Loosely speaking, it performs a copy-by-value, obliterating any previous
3200 content of the destination.
3201 If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
3202 C<ssv> if appropriate, else not. If the C<flags> parameter has the
3203 C<NOSTEAL> bit set then the buffers of temps will not be stolen. <sv_setsv>
3204 and C<sv_setsv_nomg> are implemented in terms of this function.
3205
3206 You probably want to use one of the assortment of wrappers, such as
3207 C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3208 C<SvSetMagicSV_nosteal>.
3209
3210 This is the primary function for copying scalars, and most other
3211 copy-ish functions and macros use this underneath.
3212
3213 =cut
3214 */
3215
3216 static void
3217 S_glob_assign_glob(pTHX_ SV *dstr, SV *sstr, const int dtype)
3218 {
3219     I32 mro_changes = 0; /* 1 = method, 2 = isa */
3220
3221     if (dtype != SVt_PVGV) {
3222         const char * const name = GvNAME(sstr);
3223         const STRLEN len = GvNAMELEN(sstr);
3224         {
3225             if (dtype >= SVt_PV) {
3226                 SvPV_free(dstr);
3227                 SvPV_set(dstr, 0);
3228                 SvLEN_set(dstr, 0);
3229                 SvCUR_set(dstr, 0);
3230             }
3231             SvUPGRADE(dstr, SVt_PVGV);
3232             (void)SvOK_off(dstr);
3233             /* FIXME - why are we doing this, then turning it off and on again
3234                below?  */
3235             isGV_with_GP_on(dstr);
3236         }
3237         GvSTASH(dstr) = GvSTASH(sstr);
3238         if (GvSTASH(dstr))
3239             Perl_sv_add_backref(aTHX_ (SV*)GvSTASH(dstr), dstr);
3240         gv_name_set((GV *)dstr, name, len, GV_ADD);
3241         SvFAKE_on(dstr);        /* can coerce to non-glob */
3242     }
3243
3244 #ifdef GV_UNIQUE_CHECK
3245     if (GvUNIQUE((GV*)dstr)) {
3246         Perl_croak(aTHX_ PL_no_modify);
3247     }
3248 #endif
3249
3250     if(GvGP((GV*)sstr)) {
3251         /* If source has method cache entry, clear it */
3252         if(GvCVGEN(sstr)) {
3253             SvREFCNT_dec(GvCV(sstr));
3254             GvCV(sstr) = NULL;
3255             GvCVGEN(sstr) = 0;
3256         }
3257         /* If source has a real method, then a method is
3258            going to change */
3259         else if(GvCV((GV*)sstr)) {
3260             mro_changes = 1;
3261         }
3262     }
3263
3264     /* If dest already had a real method, that's a change as well */
3265     if(!mro_changes && GvGP((GV*)dstr) && GvCVu((GV*)dstr)) {
3266         mro_changes = 1;
3267     }
3268
3269     if(strEQ(GvNAME((GV*)dstr),"ISA"))
3270         mro_changes = 2;
3271
3272     gp_free((GV*)dstr);
3273     isGV_with_GP_off(dstr);
3274     (void)SvOK_off(dstr);
3275     isGV_with_GP_on(dstr);
3276     GvINTRO_off(dstr);          /* one-shot flag */
3277     GvGP(dstr) = gp_ref(GvGP(sstr));
3278     if (SvTAINTED(sstr))
3279         SvTAINT(dstr);
3280     if (GvIMPORTED(dstr) != GVf_IMPORTED
3281         && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3282         {
3283             GvIMPORTED_on(dstr);
3284         }
3285     GvMULTI_on(dstr);
3286     if(mro_changes == 2) mro_isa_changed_in(GvSTASH(dstr));
3287     else if(mro_changes) mro_method_changed_in(GvSTASH(dstr));
3288     return;
3289 }
3290
3291 static void
3292 S_glob_assign_ref(pTHX_ SV *dstr, SV *sstr) {
3293     SV * const sref = SvREFCNT_inc(SvRV(sstr));
3294     SV *dref = NULL;
3295     const int intro = GvINTRO(dstr);
3296     SV **location;
3297     U8 import_flag = 0;
3298     const U32 stype = SvTYPE(sref);
3299
3300
3301 #ifdef GV_UNIQUE_CHECK
3302     if (GvUNIQUE((GV*)dstr)) {
3303         Perl_croak(aTHX_ PL_no_modify);
3304     }
3305 #endif
3306
3307     if (intro) {
3308         GvINTRO_off(dstr);      /* one-shot flag */
3309         GvLINE(dstr) = CopLINE(PL_curcop);
3310         GvEGV(dstr) = (GV*)dstr;
3311     }
3312     GvMULTI_on(dstr);
3313     switch (stype) {
3314     case SVt_PVCV:
3315         location = (SV **) &GvCV(dstr);
3316         import_flag = GVf_IMPORTED_CV;
3317         goto common;
3318     case SVt_PVHV:
3319         location = (SV **) &GvHV(dstr);
3320         import_flag = GVf_IMPORTED_HV;
3321         goto common;
3322     case SVt_PVAV:
3323         location = (SV **) &GvAV(dstr);
3324         import_flag = GVf_IMPORTED_AV;
3325         goto common;
3326     case SVt_PVIO:
3327         location = (SV **) &GvIOp(dstr);
3328         goto common;
3329     case SVt_PVFM:
3330         location = (SV **) &GvFORM(dstr);
3331     default:
3332         location = &GvSV(dstr);
3333         import_flag = GVf_IMPORTED_SV;
3334     common:
3335         if (intro) {
3336             if (stype == SVt_PVCV) {
3337                 /*if (GvCVGEN(dstr) && (GvCV(dstr) != (CV*)sref || GvCVGEN(dstr))) {*/
3338                 if (GvCVGEN(dstr)) {
3339                     SvREFCNT_dec(GvCV(dstr));
3340                     GvCV(dstr) = NULL;
3341                     GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3342                 }
3343             }
3344             SAVEGENERICSV(*location);
3345         }
3346         else
3347             dref = *location;
3348         if (stype == SVt_PVCV && (*location != sref || GvCVGEN(dstr))) {
3349             CV* const cv = (CV*)*location;
3350             if (cv) {
3351                 if (!GvCVGEN((GV*)dstr) &&
3352                     (CvROOT(cv) || CvXSUB(cv)))
3353                     {
3354                         /* Redefining a sub - warning is mandatory if
3355                            it was a const and its value changed. */
3356                         if (CvCONST(cv) && CvCONST((CV*)sref)
3357                             && cv_const_sv(cv) == cv_const_sv((CV*)sref)) {
3358                             NOOP;
3359                             /* They are 2 constant subroutines generated from
3360                                the same constant. This probably means that
3361                                they are really the "same" proxy subroutine
3362                                instantiated in 2 places. Most likely this is
3363                                when a constant is exported twice.  Don't warn.
3364                             */
3365                         }
3366                         else if (ckWARN(WARN_REDEFINE)
3367                                  || (CvCONST(cv)
3368                                      && (!CvCONST((CV*)sref)
3369                                          || sv_cmp(cv_const_sv(cv),
3370                                                    cv_const_sv((CV*)sref))))) {
3371                             Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
3372                                         (const char *)
3373                                         (CvCONST(cv)
3374                                          ? "Constant subroutine %s::%s redefined"
3375                                          : "Subroutine %s::%s redefined"),
3376                                         HvNAME_get(GvSTASH((GV*)dstr)),
3377                                         GvENAME((GV*)dstr));
3378                         }
3379                     }
3380                 if (!intro)
3381                     cv_ckproto_len(cv, (GV*)dstr,
3382                                    SvPOK(sref) ? SvPVX_const(sref) : NULL,
3383                                    SvPOK(sref) ? SvCUR(sref) : 0);
3384             }
3385             GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3386             GvASSUMECV_on(dstr);
3387             if(GvSTASH(dstr)) mro_method_changed_in(GvSTASH(dstr)); /* sub foo { 1 } sub bar { 2 } *bar = \&foo */
3388         }
3389         *location = sref;
3390         if (import_flag && !(GvFLAGS(dstr) & import_flag)
3391             && CopSTASH_ne(PL_curcop, GvSTASH(dstr))) {
3392             GvFLAGS(dstr) |= import_flag;
3393         }
3394         break;
3395     }
3396     SvREFCNT_dec(dref);
3397     if (SvTAINTED(sstr))
3398         SvTAINT(dstr);
3399     return;
3400 }
3401
3402 void
3403 Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags)
3404 {
3405     dVAR;
3406     register U32 sflags;
3407     register int dtype;
3408     register svtype stype;
3409
3410     if (sstr == dstr)
3411         return;
3412
3413     if (SvIS_FREED(dstr)) {
3414         Perl_croak(aTHX_ "panic: attempt to copy value %" SVf
3415                    " to a freed scalar %p", SVfARG(sstr), (void *)dstr);
3416     }
3417     SV_CHECK_THINKFIRST_COW_DROP(dstr);
3418     if (!sstr)
3419         sstr = &PL_sv_undef;
3420     if (SvIS_FREED(sstr)) {
3421         Perl_croak(aTHX_ "panic: attempt to copy freed scalar %p to %p",
3422                    (void*)sstr, (void*)dstr);
3423     }
3424     stype = SvTYPE(sstr);
3425     dtype = SvTYPE(dstr);
3426
3427     (void)SvAMAGIC_off(dstr);
3428     if ( SvVOK(dstr) )
3429     {
3430         /* need to nuke the magic */
3431         mg_free(dstr);
3432         SvRMAGICAL_off(dstr);
3433     }
3434
3435     /* There's a lot of redundancy below but we're going for speed here */
3436
3437     switch (stype) {
3438     case SVt_NULL:
3439       undef_sstr:
3440         if (dtype != SVt_PVGV) {
3441             (void)SvOK_off(dstr);
3442             return;
3443         }
3444         break;
3445     case SVt_IV:
3446         if (SvIOK(sstr)) {
3447             switch (dtype) {
3448             case SVt_NULL:
3449                 sv_upgrade(dstr, SVt_IV);
3450                 break;
3451             case SVt_NV:
3452             case SVt_PV:
3453                 sv_upgrade(dstr, SVt_PVIV);
3454                 break;
3455             case SVt_PVGV:
3456                 goto end_of_first_switch;
3457             }
3458             (void)SvIOK_only(dstr);
3459             SvIV_set(dstr,  SvIVX(sstr));
3460             if (SvIsUV(sstr))
3461                 SvIsUV_on(dstr);
3462             /* SvTAINTED can only be true if the SV has taint magic, which in
3463                turn means that the SV type is PVMG (or greater). This is the
3464                case statement for SVt_IV, so this cannot be true (whatever gcov
3465                may say).  */
3466             assert(!SvTAINTED(sstr));
3467             return;
3468         }
3469         if (!SvROK(sstr))
3470             goto undef_sstr;
3471         if (dtype < SVt_PV && dtype != SVt_IV)
3472             sv_upgrade(dstr, SVt_IV);
3473         break;
3474
3475     case SVt_NV:
3476         if (SvNOK(sstr)) {
3477             switch (dtype) {
3478             case SVt_NULL:
3479             case SVt_IV:
3480                 sv_upgrade(dstr, SVt_NV);
3481                 break;
3482             case SVt_PV:
3483             case SVt_PVIV:
3484                 sv_upgrade(dstr, SVt_PVNV);
3485                 break;
3486             case SVt_PVGV:
3487                 goto end_of_first_switch;
3488             }
3489             SvNV_set(dstr, SvNVX(sstr));
3490             (void)SvNOK_only(dstr);
3491             /* SvTAINTED can only be true if the SV has taint magic, which in
3492                turn means that the SV type is PVMG (or greater). This is the
3493                case statement for SVt_NV, so this cannot be true (whatever gcov
3494                may say).  */
3495             assert(!SvTAINTED(sstr));
3496             return;
3497         }
3498         goto undef_sstr;
3499
3500     case SVt_PVFM:
3501 #ifdef PERL_OLD_COPY_ON_WRITE
3502         if ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS) {
3503             if (dtype < SVt_PVIV)
3504                 sv_upgrade(dstr, SVt_PVIV);
3505             break;
3506         }
3507         /* Fall through */
3508 #endif
3509     case SVt_PV:
3510         if (dtype < SVt_PV)
3511             sv_upgrade(dstr, SVt_PV);
3512         break;
3513     case SVt_PVIV:
3514         if (dtype < SVt_PVIV)
3515             sv_upgrade(dstr, SVt_PVIV);
3516         break;
3517     case SVt_PVNV:
3518         if (dtype < SVt_PVNV)
3519             sv_upgrade(dstr, SVt_PVNV);
3520         break;
3521     default:
3522         {
3523         const char * const type = sv_reftype(sstr,0);
3524         if (PL_op)
3525             Perl_croak(aTHX_ "Bizarre copy of %s in %s", type, OP_NAME(PL_op));
3526         else
3527             Perl_croak(aTHX_ "Bizarre copy of %s", type);
3528         }
3529         break;
3530
3531         /* case SVt_BIND: */
3532     case SVt_PVLV:
3533     case SVt_PVGV:
3534         if (isGV_with_GP(sstr) && dtype <= SVt_PVGV) {
3535             glob_assign_glob(dstr, sstr, dtype);
3536             return;
3537         }
3538         /* SvVALID means that this PVGV is playing at being an FBM.  */
3539         /*FALLTHROUGH*/
3540
3541     case SVt_PVMG:
3542         if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
3543             mg_get(sstr);
3544             if (SvTYPE(sstr) != stype) {
3545                 stype = SvTYPE(sstr);
3546                 if (isGV_with_GP(sstr) && stype == SVt_PVGV && dtype <= SVt_PVGV) {
3547                     glob_assign_glob(dstr, sstr, dtype);
3548                     return;
3549                 }
3550             }
3551         }
3552         if (stype == SVt_PVLV)
3553             SvUPGRADE(dstr, SVt_PVNV);
3554         else
3555             SvUPGRADE(dstr, (svtype)stype);
3556     }
3557  end_of_first_switch:
3558
3559     /* dstr may have been upgraded.  */
3560     dtype = SvTYPE(dstr);
3561     sflags = SvFLAGS(sstr);
3562
3563     if (dtype == SVt_PVCV || dtype == SVt_PVFM) {
3564         /* Assigning to a subroutine sets the prototype.  */
3565         if (SvOK(sstr)) {
3566             STRLEN len;
3567             const char *const ptr = SvPV_const(sstr, len);
3568
3569             SvGROW(dstr, len + 1);
3570             Copy(ptr, SvPVX(dstr), len + 1, char);
3571             SvCUR_set(dstr, len);
3572             SvPOK_only(dstr);
3573             SvFLAGS(dstr) |= sflags & SVf_UTF8;
3574         } else {
3575             SvOK_off(dstr);
3576         }
3577     } else if (dtype == SVt_PVAV || dtype == SVt_PVHV) {
3578         const char * const type = sv_reftype(dstr,0);
3579         if (PL_op)
3580             Perl_croak(aTHX_ "Cannot copy to %s in %s", type, OP_NAME(PL_op));
3581         else
3582             Perl_croak(aTHX_ "Cannot copy to %s", type);
3583     } else if (sflags & SVf_ROK) {
3584         if (isGV_with_GP(dstr) && dtype == SVt_PVGV
3585             && SvTYPE(SvRV(sstr)) == SVt_PVGV) {
3586             sstr = SvRV(sstr);
3587             if (sstr == dstr) {
3588                 if (GvIMPORTED(dstr) != GVf_IMPORTED
3589                     && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3590                 {
3591                     GvIMPORTED_on(dstr);
3592                 }
3593                 GvMULTI_on(dstr);
3594                 return;
3595             }
3596             glob_assign_glob(dstr, sstr, dtype);
3597             return;
3598         }
3599
3600         if (dtype >= SVt_PV) {
3601             if (dtype == SVt_PVGV && isGV_with_GP(dstr)) {
3602                 glob_assign_ref(dstr, sstr);
3603                 return;
3604             }
3605             if (SvPVX_const(dstr)) {
3606                 SvPV_free(dstr);
3607                 SvLEN_set(dstr, 0);
3608                 SvCUR_set(dstr, 0);
3609             }
3610         }
3611         (void)SvOK_off(dstr);
3612         SvRV_set(dstr, SvREFCNT_inc(SvRV(sstr)));
3613         SvFLAGS(dstr) |= sflags & SVf_ROK;
3614         assert(!(sflags & SVp_NOK));
3615         assert(!(sflags & SVp_IOK));
3616         assert(!(sflags & SVf_NOK));
3617         assert(!(sflags & SVf_IOK));
3618     }
3619     else if (dtype == SVt_PVGV && isGV_with_GP(dstr)) {
3620         if (!(sflags & SVf_OK)) {
3621             if (ckWARN(WARN_MISC))
3622                 Perl_warner(aTHX_ packWARN(WARN_MISC),
3623                             "Undefined value assigned to typeglob");
3624         }
3625         else {
3626             GV *gv = gv_fetchsv(sstr, GV_ADD, SVt_PVGV);
3627             if (dstr != (SV*)gv) {
3628                 if (GvGP(dstr))
3629                     gp_free((GV*)dstr);
3630                 GvGP(dstr) = gp_ref(GvGP(gv));
3631             }
3632         }
3633     }
3634     else if (sflags & SVp_POK) {
3635         bool isSwipe = 0;
3636
3637         /*
3638          * Check to see if we can just swipe the string.  If so, it's a
3639          * possible small lose on short strings, but a big win on long ones.
3640          * It might even be a win on short strings if SvPVX_const(dstr)
3641          * has to be allocated and SvPVX_const(sstr) has to be freed.
3642          * Likewise if we can set up COW rather than doing an actual copy, we
3643          * drop to the else clause, as the swipe code and the COW setup code
3644          * have much in common.
3645          */
3646
3647         /* Whichever path we take through the next code, we want this true,
3648            and doing it now facilitates the COW check.  */
3649         (void)SvPOK_only(dstr);
3650
3651         if (
3652             /* If we're already COW then this clause is not true, and if COW
3653                is allowed then we drop down to the else and make dest COW 
3654                with us.  If caller hasn't said that we're allowed to COW
3655                shared hash keys then we don't do the COW setup, even if the
3656                source scalar is a shared hash key scalar.  */
3657             (((flags & SV_COW_SHARED_HASH_KEYS)
3658                ? (sflags & (SVf_FAKE|SVf_READONLY)) != (SVf_FAKE|SVf_READONLY)
3659                : 1 /* If making a COW copy is forbidden then the behaviour we
3660                        desire is as if the source SV isn't actually already
3661                        COW, even if it is.  So we act as if the source flags
3662                        are not COW, rather than actually testing them.  */
3663               )
3664 #ifndef PERL_OLD_COPY_ON_WRITE
3665              /* The change that added SV_COW_SHARED_HASH_KEYS makes the logic
3666                 when PERL_OLD_COPY_ON_WRITE is defined a little wrong.
3667                 Conceptually PERL_OLD_COPY_ON_WRITE being defined should
3668                 override SV_COW_SHARED_HASH_KEYS, because it means "always COW"
3669                 but in turn, it's somewhat dead code, never expected to go
3670                 live, but more kept as a placeholder on how to do it better
3671                 in a newer implementation.  */
3672              /* If we are COW and dstr is a suitable target then we drop down
3673                 into the else and make dest a COW of us.  */
3674              || (SvFLAGS(dstr) & CAN_COW_MASK) != CAN_COW_FLAGS
3675 #endif
3676              )
3677             &&
3678             !(isSwipe =
3679                  (sflags & SVs_TEMP) &&   /* slated for free anyway? */
3680                  !(sflags & SVf_OOK) &&   /* and not involved in OOK hack? */
3681                  (!(flags & SV_NOSTEAL)) &&
3682                                         /* and we're allowed to steal temps */
3683                  SvREFCNT(sstr) == 1 &&   /* and no other references to it? */
3684                  SvLEN(sstr)    &&        /* and really is a string */
3685                                 /* and won't be needed again, potentially */
3686               !(PL_op && PL_op->op_type == OP_AASSIGN))
3687 #ifdef PERL_OLD_COPY_ON_WRITE
3688             && ((flags & SV_COW_SHARED_HASH_KEYS)
3689                 ? (!((sflags & CAN_COW_MASK) == CAN_COW_FLAGS
3690                      && (SvFLAGS(dstr) & CAN_COW_MASK) == CAN_COW_FLAGS
3691                      && SvTYPE(sstr) >= SVt_PVIV))
3692                 : 1)
3693 #endif
3694             ) {
3695             /* Failed the swipe test, and it's not a shared hash key either.
3696                Have to copy the string.  */
3697             STRLEN len = SvCUR(sstr);
3698             SvGROW(dstr, len + 1);      /* inlined from sv_setpvn */
3699             Move(SvPVX_const(sstr),SvPVX(dstr),len,char);
3700             SvCUR_set(dstr, len);
3701             *SvEND(dstr) = '\0';
3702         } else {
3703             /* If PERL_OLD_COPY_ON_WRITE is not defined, then isSwipe will always
3704                be true in here.  */
3705             /* Either it's a shared hash key, or it's suitable for
3706                copy-on-write or we can swipe the string.  */
3707             if (DEBUG_C_TEST) {
3708                 PerlIO_printf(Perl_debug_log, "Copy on write: sstr --> dstr\n");
3709                 sv_dump(sstr);
3710                 sv_dump(dstr);
3711             }
3712 #ifdef PERL_OLD_COPY_ON_WRITE
3713             if (!isSwipe) {
3714                 /* I believe I should acquire a global SV mutex if
3715                    it's a COW sv (not a shared hash key) to stop
3716                    it going un copy-on-write.
3717                    If the source SV has gone un copy on write between up there
3718                    and down here, then (assert() that) it is of the correct
3719                    form to make it copy on write again */
3720                 if ((sflags & (SVf_FAKE | SVf_READONLY))
3721                     != (SVf_FAKE | SVf_READONLY)) {
3722                     SvREADONLY_on(sstr);
3723                     SvFAKE_on(sstr);
3724                     /* Make the source SV into a loop of 1.
3725                        (about to become 2) */
3726                     SV_COW_NEXT_SV_SET(sstr, sstr);
3727                 }
3728             }
3729 #endif
3730             /* Initial code is common.  */
3731             if (SvPVX_const(dstr)) {    /* we know that dtype >= SVt_PV */
3732                 SvPV_free(dstr);
3733             }
3734
3735             if (!isSwipe) {
3736                 /* making another shared SV.  */
3737                 STRLEN cur = SvCUR(sstr);
3738                 STRLEN len = SvLEN(sstr);
3739 #ifdef PERL_OLD_COPY_ON_WRITE
3740                 if (len) {
3741                     assert (SvTYPE(dstr) >= SVt_PVIV);
3742                     /* SvIsCOW_normal */
3743                     /* splice us in between source and next-after-source.  */
3744                     SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
3745                     SV_COW_NEXT_SV_SET(sstr, dstr);
3746                     SvPV_set(dstr, SvPVX_mutable(sstr));
3747                 } else
3748 #endif
3749                 {
3750                     /* SvIsCOW_shared_hash */
3751                     DEBUG_C(PerlIO_printf(Perl_debug_log,
3752                                           "Copy on write: Sharing hash\n"));
3753
3754                     assert (SvTYPE(dstr) >= SVt_PV);
3755                     SvPV_set(dstr,
3756                              HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)))));
3757                 }
3758                 SvLEN_set(dstr, len);
3759                 SvCUR_set(dstr, cur);
3760                 SvREADONLY_on(dstr);
3761                 SvFAKE_on(dstr);
3762                 /* Relesase a global SV mutex.  */
3763             }
3764             else
3765                 {       /* Passes the swipe test.  */
3766                 SvPV_set(dstr, SvPVX_mutable(sstr));
3767                 SvLEN_set(dstr, SvLEN(sstr));
3768                 SvCUR_set(dstr, SvCUR(sstr));
3769
3770                 SvTEMP_off(dstr);
3771                 (void)SvOK_off(sstr);   /* NOTE: nukes most SvFLAGS on sstr */
3772                 SvPV_set(sstr, NULL);
3773                 SvLEN_set(sstr, 0);
3774                 SvCUR_set(sstr, 0);
3775                 SvTEMP_off(sstr);
3776             }
3777         }
3778         if (sflags & SVp_NOK) {
3779             SvNV_set(dstr, SvNVX(sstr));
3780         }
3781         if (sflags & SVp_IOK) {
3782             SvOOK_off(dstr);
3783             SvIV_set(dstr, SvIVX(sstr));
3784             /* Must do this otherwise some other overloaded use of 0x80000000
3785                gets confused. I guess SVpbm_VALID */
3786             if (sflags & SVf_IVisUV)
3787                 SvIsUV_on(dstr);
3788         }
3789         SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_NOK|SVp_NOK|SVf_UTF8);
3790         {
3791             const MAGIC * const smg = SvVSTRING_mg(sstr);
3792             if (smg) {
3793                 sv_magic(dstr, NULL, PERL_MAGIC_vstring,
3794                          smg->mg_ptr, smg->mg_len);
3795                 SvRMAGICAL_on(dstr);
3796             }
3797         }
3798     }
3799     else if (sflags & (SVp_IOK|SVp_NOK)) {
3800         (void)SvOK_off(dstr);
3801         SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_IVisUV|SVf_NOK|SVp_NOK);
3802         if (sflags & SVp_IOK) {
3803             /* XXXX Do we want to set IsUV for IV(ROK)?  Be extra safe... */
3804             SvIV_set(dstr, SvIVX(sstr));
3805         }
3806         if (sflags & SVp_NOK) {
3807             SvNV_set(dstr, SvNVX(sstr));
3808         }
3809     }
3810     else {
3811         if (isGV_with_GP(sstr)) {
3812             /* This stringification rule for globs is spread in 3 places.
3813                This feels bad. FIXME.  */
3814             const U32 wasfake = sflags & SVf_FAKE;
3815
3816             /* FAKE globs can get coerced, so need to turn this off
3817                temporarily if it is on.  */
3818             SvFAKE_off(sstr);
3819             gv_efullname3(dstr, (GV *)sstr, "*");
3820             SvFLAGS(sstr) |= wasfake;
3821         }
3822         else
3823             (void)SvOK_off(dstr);
3824     }
3825     if (SvTAINTED(sstr))
3826         SvTAINT(dstr);
3827 }
3828
3829 /*
3830 =for apidoc sv_setsv_mg
3831
3832 Like C<sv_setsv>, but also handles 'set' magic.
3833
3834 =cut
3835 */
3836
3837 void
3838 Perl_sv_setsv_mg(pTHX_ SV *dstr, register SV *sstr)
3839 {
3840     sv_setsv(dstr,sstr);
3841     SvSETMAGIC(dstr);
3842 }
3843
3844 #ifdef PERL_OLD_COPY_ON_WRITE
3845 SV *
3846 Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
3847 {
3848     STRLEN cur = SvCUR(sstr);
3849     STRLEN len = SvLEN(sstr);
3850     register char *new_pv;
3851
3852     if (DEBUG_C_TEST) {
3853         PerlIO_printf(Perl_debug_log, "Fast copy on write: %p -> %p\n",
3854                       (void*)sstr, (void*)dstr);
3855         sv_dump(sstr);
3856         if (dstr)
3857                     sv_dump(dstr);
3858     }
3859
3860     if (dstr) {
3861         if (SvTHINKFIRST(dstr))
3862             sv_force_normal_flags(dstr, SV_COW_DROP_PV);
3863         else if (SvPVX_const(dstr))
3864             Safefree(SvPVX_const(dstr));
3865     }
3866     else
3867         new_SV(dstr);
3868     SvUPGRADE(dstr, SVt_PVIV);
3869
3870     assert (SvPOK(sstr));
3871     assert (SvPOKp(sstr));
3872     assert (!SvIOK(sstr));
3873     assert (!SvIOKp(sstr));
3874     assert (!SvNOK(sstr));
3875     assert (!SvNOKp(sstr));
3876
3877     if (SvIsCOW(sstr)) {
3878
3879         if (SvLEN(sstr) == 0) {
3880             /* source is a COW shared hash key.  */
3881             DEBUG_C(PerlIO_printf(Perl_debug_log,
3882                                   "Fast copy on write: Sharing hash\n"));
3883             new_pv = HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr))));
3884             goto common_exit;
3885         }
3886         SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
3887     } else {
3888         assert ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS);
3889         SvUPGRADE(sstr, SVt_PVIV);
3890         SvREADONLY_on(sstr);
3891         SvFAKE_on(sstr);
3892         DEBUG_C(PerlIO_printf(Perl_debug_log,
3893                               "Fast copy on write: Converting sstr to COW\n"));
3894         SV_COW_NEXT_SV_SET(dstr, sstr);
3895     }
3896     SV_COW_NEXT_SV_SET(sstr, dstr);
3897     new_pv = SvPVX_mutable(sstr);
3898
3899   common_exit:
3900     SvPV_set(dstr, new_pv);
3901     SvFLAGS(dstr) = (SVt_PVIV|SVf_POK|SVp_POK|SVf_FAKE|SVf_READONLY);
3902     if (SvUTF8(sstr))
3903         SvUTF8_on(dstr);
3904     SvLEN_set(dstr, len);
3905     SvCUR_set(dstr, cur);
3906     if (DEBUG_C_TEST) {
3907         sv_dump(dstr);
3908     }
3909     return dstr;
3910 }
3911 #endif
3912
3913 /*
3914 =for apidoc sv_setpvn
3915
3916 Copies a string into an SV.  The C<len> parameter indicates the number of
3917 bytes to be copied.  If the C<ptr> argument is NULL the SV will become
3918 undefined.  Does not handle 'set' magic.  See C<sv_setpvn_mg>.
3919
3920 =cut
3921 */
3922
3923 void
3924 Perl_sv_setpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
3925 {
3926     dVAR;
3927     register char *dptr;
3928
3929     SV_CHECK_THINKFIRST_COW_DROP(sv);
3930     if (!ptr) {
3931         (void)SvOK_off(sv);
3932         return;
3933     }
3934     else {
3935         /* len is STRLEN which is unsigned, need to copy to signed */
3936         const IV iv = len;
3937         if (iv < 0)
3938             Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen");
3939     }
3940     SvUPGRADE(sv, SVt_PV);
3941
3942     dptr = SvGROW(sv, len + 1);
3943     Move(ptr,dptr,len,char);
3944     dptr[len] = '\0';
3945     SvCUR_set(sv, len);
3946     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
3947     SvTAINT(sv);
3948 }
3949
3950 /*
3951 =for apidoc sv_setpvn_mg
3952
3953 Like C<sv_setpvn>, but also handles 'set' magic.
3954
3955 =cut
3956 */
3957
3958 void
3959 Perl_sv_setpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
3960 {
3961     sv_setpvn(sv,ptr,len);
3962     SvSETMAGIC(sv);
3963 }
3964
3965 /*
3966 =for apidoc sv_setpv
3967
3968 Copies a string into an SV.  The string must be null-terminated.  Does not
3969 handle 'set' magic.  See C<sv_setpv_mg>.
3970
3971 =cut
3972 */
3973
3974 void
3975 Perl_sv_setpv(pTHX_ register SV *sv, register const char *ptr)
3976 {
3977     dVAR;
3978     register STRLEN len;
3979
3980     SV_CHECK_THINKFIRST_COW_DROP(sv);
3981     if (!ptr) {
3982         (void)SvOK_off(sv);
3983         return;
3984     }
3985     len = strlen(ptr);
3986     SvUPGRADE(sv, SVt_PV);
3987
3988     SvGROW(sv, len + 1);
3989     Move(ptr,SvPVX(sv),len+1,char);
3990     SvCUR_set(sv, len);
3991     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
3992     SvTAINT(sv);
3993 }
3994
3995 /*
3996 =for apidoc sv_setpv_mg
3997
3998 Like C<sv_setpv>, but also handles 'set' magic.
3999
4000 =cut
4001 */
4002
4003 void
4004 Perl_sv_setpv_mg(pTHX_ register SV *sv, register const char *ptr)
4005 {
4006     sv_setpv(sv,ptr);
4007     SvSETMAGIC(sv);
4008 }
4009
4010 /*
4011 =for apidoc sv_usepvn_flags
4012
4013 Tells an SV to use C<ptr> to find its string value.  Normally the
4014 string is stored inside the SV but sv_usepvn allows the SV to use an
4015 outside string.  The C<ptr> should point to memory that was allocated
4016 by C<malloc>.  The string length, C<len>, must be supplied.  By default
4017 this function will realloc (i.e. move) the memory pointed to by C<ptr>,
4018 so that pointer should not be freed or used by the programmer after
4019 giving it to sv_usepvn, and neither should any pointers from "behind"
4020 that pointer (e.g. ptr + 1) be used.
4021
4022 If C<flags> & SV_SMAGIC is true, will call SvSETMAGIC. If C<flags> &
4023 SV_HAS_TRAILING_NUL is true, then C<ptr[len]> must be NUL, and the realloc
4024 will be skipped. (i.e. the buffer is actually at least 1 byte longer than
4025 C<len>, and already meets the requirements for storing in C<SvPVX>)
4026
4027 =cut
4028 */
4029
4030 void
4031 Perl_sv_usepvn_flags(pTHX_ SV *sv, char *ptr, STRLEN len, U32 flags)
4032 {
4033     dVAR;
4034     STRLEN allocate;
4035     SV_CHECK_THINKFIRST_COW_DROP(sv);
4036     SvUPGRADE(sv, SVt_PV);
4037     if (!ptr) {
4038         (void)SvOK_off(sv);
4039         if (flags & SV_SMAGIC)
4040             SvSETMAGIC(sv);
4041         return;
4042     }
4043     if (SvPVX_const(sv))
4044         SvPV_free(sv);
4045
4046 #ifdef DEBUGGING
4047     if (flags & SV_HAS_TRAILING_NUL)
4048         assert(ptr[len] == '\0');
4049 #endif
4050
4051     allocate = (flags & SV_HAS_TRAILING_NUL)
4052         ? len + 1: PERL_STRLEN_ROUNDUP(len + 1);
4053     if (flags & SV_HAS_TRAILING_NUL) {
4054         /* It's long enough - do nothing.
4055            Specfically Perl_newCONSTSUB is relying on this.  */
4056     } else {
4057 #ifdef DEBUGGING
4058         /* Force a move to shake out bugs in callers.  */
4059         char *new_ptr = (char*)safemalloc(allocate);
4060         Copy(ptr, new_ptr, len, char);
4061         PoisonFree(ptr,len,char);
4062         Safefree(ptr);
4063         ptr = new_ptr;
4064 #else
4065         ptr = (char*) saferealloc (ptr, allocate);
4066 #endif
4067     }
4068     SvPV_set(sv, ptr);
4069     SvCUR_set(sv, len);
4070     SvLEN_set(sv, allocate);
4071     if (!(flags & SV_HAS_TRAILING_NUL)) {
4072         ptr[len] = '\0';
4073     }
4074     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4075     SvTAINT(sv);
4076     if (flags & SV_SMAGIC)
4077         SvSETMAGIC(sv);
4078 }
4079
4080 #ifdef PERL_OLD_COPY_ON_WRITE
4081 /* Need to do this *after* making the SV normal, as we need the buffer
4082    pointer to remain valid until after we've copied it.  If we let go too early,
4083    another thread could invalidate it by unsharing last of the same hash key
4084    (which it can do by means other than releasing copy-on-write Svs)
4085    or by changing the other copy-on-write SVs in the loop.  */
4086 STATIC void
4087 S_sv_release_COW(pTHX_ register SV *sv, const char *pvx, SV *after)
4088 {
4089     { /* this SV was SvIsCOW_normal(sv) */
4090          /* we need to find the SV pointing to us.  */
4091         SV *current = SV_COW_NEXT_SV(after);
4092
4093         if (current == sv) {
4094             /* The SV we point to points back to us (there were only two of us
4095                in the loop.)
4096                Hence other SV is no longer copy on write either.  */
4097             SvFAKE_off(after);
4098             SvREADONLY_off(after);
4099         } else {
4100             /* We need to follow the pointers around the loop.  */
4101             SV *next;
4102             while ((next = SV_COW_NEXT_SV(current)) != sv) {
4103                 assert (next);
4104                 current = next;
4105                  /* don't loop forever if the structure is bust, and we have
4106                     a pointer into a closed loop.  */
4107                 assert (current != after);
4108                 assert (SvPVX_const(current) == pvx);
4109             }
4110             /* Make the SV before us point to the SV after us.  */
4111             SV_COW_NEXT_SV_SET(current, after);
4112         }
4113     }
4114 }
4115 #endif
4116 /*
4117 =for apidoc sv_force_normal_flags
4118
4119 Undo various types of fakery on an SV: if the PV is a shared string, make
4120 a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
4121 an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
4122 we do the copy, and is also used locally. If C<SV_COW_DROP_PV> is set
4123 then a copy-on-write scalar drops its PV buffer (if any) and becomes
4124 SvPOK_off rather than making a copy. (Used where this scalar is about to be
4125 set to some other value.) In addition, the C<flags> parameter gets passed to
4126 C<sv_unref_flags()> when unrefing. C<sv_force_normal> calls this function
4127 with flags set to 0.
4128
4129 =cut
4130 */
4131
4132 void
4133 Perl_sv_force_normal_flags(pTHX_ register SV *sv, U32 flags)
4134 {
4135     dVAR;
4136 #ifdef PERL_OLD_COPY_ON_WRITE
4137     if (SvREADONLY(sv)) {
4138         /* At this point I believe I should acquire a global SV mutex.  */
4139         if (SvFAKE(sv)) {
4140             const char * const pvx = SvPVX_const(sv);
4141             const STRLEN len = SvLEN(sv);
4142             const STRLEN cur = SvCUR(sv);
4143             /* next COW sv in the loop.  If len is 0 then this is a shared-hash
4144                key scalar, so we mustn't attempt to call SV_COW_NEXT_SV(), as
4145                we'll fail an assertion.  */
4146             SV * const next = len ? SV_COW_NEXT_SV(sv) : 0;
4147
4148             if (DEBUG_C_TEST) {
4149                 PerlIO_printf(Perl_debug_log,
4150                               "Copy on write: Force normal %ld\n",
4151                               (long) flags);
4152                 sv_dump(sv);
4153             }
4154             SvFAKE_off(sv);
4155             SvREADONLY_off(sv);
4156             /* This SV doesn't own the buffer, so need to Newx() a new one:  */
4157             SvPV_set(sv, NULL);
4158             SvLEN_set(sv, 0);
4159             if (flags & SV_COW_DROP_PV) {
4160                 /* OK, so we don't need to copy our buffer.  */
4161                 SvPOK_off(sv);
4162             } else {
4163                 SvGROW(sv, cur + 1);
4164                 Move(pvx,SvPVX(sv),cur,char);
4165                 SvCUR_set(sv, cur);
4166                 *SvEND(sv) = '\0';
4167             }
4168             if (len) {
4169                 sv_release_COW(sv, pvx, next);
4170             } else {
4171                 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
4172             }
4173             if (DEBUG_C_TEST) {
4174                 sv_dump(sv);
4175             }
4176         }
4177         else if (IN_PERL_RUNTIME)
4178             Perl_croak(aTHX_ PL_no_modify);
4179         /* At this point I believe that I can drop the global SV mutex.  */
4180     }
4181 #else
4182     if (SvREADONLY(sv)) {
4183         if (SvFAKE(sv)) {
4184             const char * const pvx = SvPVX_const(sv);
4185             const STRLEN len = SvCUR(sv);
4186             SvFAKE_off(sv);
4187             SvREADONLY_off(sv);
4188             SvPV_set(sv, NULL);
4189             SvLEN_set(sv, 0);
4190             SvGROW(sv, len + 1);
4191             Move(pvx,SvPVX(sv),len,char);
4192             *SvEND(sv) = '\0';
4193             unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
4194         }
4195         else if (IN_PERL_RUNTIME)
4196             Perl_croak(aTHX_ PL_no_modify);
4197     }
4198 #endif
4199     if (SvROK(sv))
4200         sv_unref_flags(sv, flags);
4201     else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
4202         sv_unglob(sv);
4203 }
4204
4205 /*
4206 =for apidoc sv_chop
4207
4208 Efficient removal of characters from the beginning of the string buffer.
4209 SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
4210 the string buffer.  The C<ptr> becomes the first character of the adjusted
4211 string. Uses the "OOK hack".
4212 Beware: after this function returns, C<ptr> and SvPVX_const(sv) may no longer
4213 refer to the same chunk of data.
4214
4215 =cut
4216 */
4217
4218 void
4219 Perl_sv_chop(pTHX_ register SV *sv, register const char *ptr)
4220 {
4221     register STRLEN delta;
4222     if (!ptr || !SvPOKp(sv))
4223         return;
4224     delta = ptr - SvPVX_const(sv);
4225     if (!delta) {
4226         /* Nothing to do.  */
4227         return;
4228     }
4229     assert(ptr > SvPVX_const(sv));
4230     SV_CHECK_THINKFIRST(sv);
4231     if (SvTYPE(sv) < SVt_PVIV)
4232         sv_upgrade(sv,SVt_PVIV);
4233
4234     if (!SvOOK(sv)) {
4235         if (!SvLEN(sv)) { /* make copy of shared string */
4236             const char *pvx = SvPVX_const(sv);
4237             const STRLEN len = SvCUR(sv);
4238             SvGROW(sv, len + 1);
4239             Move(pvx,SvPVX(sv),len,char);
4240             *SvEND(sv) = '\0';
4241         }
4242         SvIV_set(sv, 0);
4243         /* Same SvOOK_on but SvOOK_on does a SvIOK_off
4244            and we do that anyway inside the SvNIOK_off
4245         */
4246         SvFLAGS(sv) |= SVf_OOK;
4247     }
4248     SvNIOK_off(sv);
4249     SvLEN_set(sv, SvLEN(sv) - delta);
4250     SvCUR_set(sv, SvCUR(sv) - delta);
4251     SvPV_set(sv, SvPVX(sv) + delta);
4252     SvIV_set(sv, SvIVX(sv) + delta);
4253 #ifdef DEBUGGING
4254     {
4255         /* Fill the preceding buffer with sentinals to verify that no-one is
4256            using it.  */
4257         U8 *p = (U8*) SvPVX(sv);
4258         const U8 *const real_start = p - SvIVX(sv);
4259         while (p > real_start) {
4260             --p;
4261             *p = (U8)PTR2UV(p);
4262         }
4263     }
4264 #endif
4265 }
4266
4267 /*
4268 =for apidoc sv_catpvn
4269
4270 Concatenates the string onto the end of the string which is in the SV.  The
4271 C<len> indicates number of bytes to copy.  If the SV has the UTF-8
4272 status set, then the bytes appended should be valid UTF-8.
4273 Handles 'get' magic, but not 'set' magic.  See C<sv_catpvn_mg>.
4274
4275 =for apidoc sv_catpvn_flags
4276
4277 Concatenates the string onto the end of the string which is in the SV.  The
4278 C<len> indicates number of bytes to copy.  If the SV has the UTF-8
4279 status set, then the bytes appended should be valid UTF-8.
4280 If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
4281 appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
4282 in terms of this function.
4283
4284 =cut
4285 */
4286
4287 void
4288 Perl_sv_catpvn_flags(pTHX_ register SV *dsv, register const char *sstr, register STRLEN slen, I32 flags)
4289 {
4290     dVAR;
4291     STRLEN dlen;
4292     const char * const dstr = SvPV_force_flags(dsv, dlen, flags);
4293
4294     SvGROW(dsv, dlen + slen + 1);
4295     if (sstr == dstr)
4296         sstr = SvPVX_const(dsv);
4297     Move(sstr, SvPVX(dsv) + dlen, slen, char);
4298     SvCUR_set(dsv, SvCUR(dsv) + slen);
4299     *SvEND(dsv) = '\0';
4300     (void)SvPOK_only_UTF8(dsv);         /* validate pointer */
4301     SvTAINT(dsv);
4302     if (flags & SV_SMAGIC)
4303         SvSETMAGIC(dsv);
4304 }
4305
4306 /*
4307 =for apidoc sv_catsv
4308
4309 Concatenates the string from SV C<ssv> onto the end of the string in
4310 SV C<dsv>.  Modifies C<dsv> but not C<ssv>.  Handles 'get' magic, but
4311 not 'set' magic.  See C<sv_catsv_mg>.
4312
4313 =for apidoc sv_catsv_flags
4314
4315 Concatenates the string from SV C<ssv> onto the end of the string in
4316 SV C<dsv>.  Modifies C<dsv> but not C<ssv>.  If C<flags> has C<SV_GMAGIC>
4317 bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
4318 and C<sv_catsv_nomg> are implemented in terms of this function.
4319
4320 =cut */
4321
4322 void
4323 Perl_sv_catsv_flags(pTHX_ SV *dsv, register SV *ssv, I32 flags)
4324 {
4325     dVAR;
4326     if (ssv) {
4327         STRLEN slen;
4328         const char *spv = SvPV_const(ssv, slen);
4329         if (spv) {
4330             /*  sutf8 and dutf8 were type bool, but under USE_ITHREADS,
4331                 gcc version 2.95.2 20000220 (Debian GNU/Linux) for
4332                 Linux xxx 2.2.17 on sparc64 with gcc -O2, we erroneously
4333                 get dutf8 = 0x20000000, (i.e.  SVf_UTF8) even though
4334                 dsv->sv_flags doesn't have that bit set.
4335                 Andy Dougherty  12 Oct 2001
4336             */
4337             const I32 sutf8 = DO_UTF8(ssv);
4338             I32 dutf8;
4339
4340             if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
4341                 mg_get(dsv);
4342             dutf8 = DO_UTF8(dsv);
4343
4344             if (dutf8 != sutf8) {
4345                 if (dutf8) {
4346                     /* Not modifying source SV, so taking a temporary copy. */
4347                     SV* const csv = newSVpvn_flags(spv, slen, SVs_TEMP);
4348
4349                     sv_utf8_upgrade(csv);
4350                     spv = SvPV_const(csv, slen);
4351                 }
4352                 else
4353                     sv_utf8_upgrade_nomg(dsv);
4354             }
4355             sv_catpvn_nomg(dsv, spv, slen);
4356         }
4357     }
4358     if (flags & SV_SMAGIC)
4359         SvSETMAGIC(dsv);
4360 }
4361
4362 /*
4363 =for apidoc sv_catpv
4364
4365 Concatenates the string onto the end of the string which is in the SV.
4366 If the SV has the UTF-8 status set, then the bytes appended should be
4367 valid UTF-8.  Handles 'get' magic, but not 'set' magic.  See C<sv_catpv_mg>.
4368
4369 =cut */
4370
4371 void
4372 Perl_sv_catpv(pTHX_ register SV *sv, register const char *ptr)
4373 {
4374     dVAR;
4375     register STRLEN len;
4376     STRLEN tlen;
4377     char *junk;
4378
4379     if (!ptr)
4380         return;
4381     junk = SvPV_force(sv, tlen);
4382     len = strlen(ptr);
4383     SvGROW(sv, tlen + len + 1);
4384     if (ptr == junk)
4385         ptr = SvPVX_const(sv);
4386     Move(ptr,SvPVX(sv)+tlen,len+1,char);
4387     SvCUR_set(sv, SvCUR(sv) + len);
4388     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4389     SvTAINT(sv);
4390 }
4391
4392 /*
4393 =for apidoc sv_catpv_mg
4394
4395 Like C<sv_catpv>, but also handles 'set' magic.
4396
4397 =cut
4398 */
4399
4400 void
4401 Perl_sv_catpv_mg(pTHX_ register SV *sv, register const char *ptr)
4402 {
4403     sv_catpv(sv,ptr);
4404     SvSETMAGIC(sv);
4405 }
4406
4407 /*
4408 =for apidoc newSV
4409
4410 Creates a new SV.  A non-zero C<len> parameter indicates the number of
4411 bytes of preallocated string space the SV should have.  An extra byte for a
4412 trailing NUL is also reserved.  (SvPOK is not set for the SV even if string
4413 space is allocated.)  The reference count for the new SV is set to 1.
4414
4415 In 5.9.3, newSV() replaces the older NEWSV() API, and drops the first
4416 parameter, I<x>, a debug aid which allowed callers to identify themselves.
4417 This aid has been superseded by a new build option, PERL_MEM_LOG (see
4418 L<perlhack/PERL_MEM_LOG>).  The older API is still there for use in XS
4419 modules supporting older perls.
4420
4421 =cut
4422 */
4423
4424 SV *
4425 Perl_newSV(pTHX_ STRLEN len)
4426 {
4427     dVAR;
4428     register SV *sv;
4429
4430     new_SV(sv);
4431     if (len) {
4432         sv_upgrade(sv, SVt_PV);
4433         SvGROW(sv, len + 1);
4434     }
4435     return sv;
4436 }
4437 /*
4438 =for apidoc sv_magicext
4439
4440 Adds magic to an SV, upgrading it if necessary. Applies the
4441 supplied vtable and returns a pointer to the magic added.
4442
4443 Note that C<sv_magicext> will allow things that C<sv_magic> will not.
4444 In particular, you can add magic to SvREADONLY SVs, and add more than
4445 one instance of the same 'how'.
4446
4447 If C<namlen> is greater than zero then a C<savepvn> I<copy> of C<name> is
4448 stored, if C<namlen> is zero then C<name> is stored as-is and - as another
4449 special case - if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
4450 to contain an C<SV*> and is stored as-is with its REFCNT incremented.
4451
4452 (This is now used as a subroutine by C<sv_magic>.)
4453
4454 =cut
4455 */
4456 MAGIC * 
4457 Perl_sv_magicext(pTHX_ SV* sv, SV* obj, int how, const MGVTBL *vtable,
4458                  const char* name, I32 namlen)
4459 {
4460     dVAR;
4461     MAGIC* mg;
4462
4463     SvUPGRADE(sv, SVt_PVMG);
4464     Newxz(mg, 1, MAGIC);
4465     mg->mg_moremagic = SvMAGIC(sv);
4466     SvMAGIC_set(sv, mg);
4467
4468     /* Sometimes a magic contains a reference loop, where the sv and
4469        object refer to each other.  To prevent a reference loop that
4470        would prevent such objects being freed, we look for such loops
4471        and if we find one we avoid incrementing the object refcount.
4472
4473        Note we cannot do this to avoid self-tie loops as intervening RV must
4474        have its REFCNT incremented to keep it in existence.
4475
4476     */
4477     if (!obj || obj == sv ||
4478         how == PERL_MAGIC_arylen ||
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         /* FIXME for plugins */
5236         pregfree2(sv);
5237         goto freescalar;
5238     case SVt_PVCV:
5239     case SVt_PVFM:
5240         cv_undef((CV*)sv);
5241         goto freescalar;
5242     case SVt_PVHV:
5243         Perl_hv_kill_backrefs(aTHX_ (HV*)sv);
5244         hv_undef((HV*)sv);
5245         break;
5246     case SVt_PVAV:
5247         if (PL_comppad == (AV*)sv) {
5248             PL_comppad = NULL;
5249             PL_curpad = NULL;
5250         }
5251         av_undef((AV*)sv);
5252         break;
5253     case SVt_PVLV:
5254         if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
5255             SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv)));
5256             HeNEXT((HE*)LvTARG(sv)) = PL_hv_fetch_ent_mh;
5257             PL_hv_fetch_ent_mh = (HE*)LvTARG(sv);
5258         }
5259         else if (LvTYPE(sv) != 't') /* unless tie: unrefcnted fake SV**  */
5260             SvREFCNT_dec(LvTARG(sv));
5261     case SVt_PVGV:
5262         if (isGV_with_GP(sv)) {
5263             if(GvCVu((GV*)sv) && (stash = GvSTASH((GV*)sv)) && HvNAME_get(stash))
5264                 mro_method_changed_in(stash);
5265             gp_free((GV*)sv);
5266             if (GvNAME_HEK(sv))
5267                 unshare_hek(GvNAME_HEK(sv));
5268             /* If we're in a stash, we don't own a reference to it. However it does
5269                have a back reference to us, which needs to be cleared.  */
5270             if (!SvVALID(sv) && (stash = GvSTASH(sv)))
5271                     sv_del_backref((SV*)stash, sv);
5272         }
5273         /* FIXME. There are probably more unreferenced pointers to SVs in the
5274            interpreter struct that we should check and tidy in a similar
5275            fashion to this:  */
5276         if ((GV*)sv == PL_last_in_gv)
5277             PL_last_in_gv = NULL;
5278     case SVt_PVMG:
5279     case SVt_PVNV:
5280     case SVt_PVIV:
5281       freescalar:
5282         /* Don't bother with SvOOK_off(sv); as we're only going to free it.  */
5283         if (SvOOK(sv)) {
5284             SvPV_set(sv, SvPVX_mutable(sv) - SvIVX(sv));
5285             /* Don't even bother with turning off the OOK flag.  */
5286         }
5287     case SVt_PV:
5288         if (SvROK(sv)) {
5289             SV * const target = SvRV(sv);
5290             if (SvWEAKREF(sv))
5291                 sv_del_backref(target, sv);
5292             else
5293                 SvREFCNT_dec(target);
5294         }
5295 #ifdef PERL_OLD_COPY_ON_WRITE
5296         else if (SvPVX_const(sv)) {
5297             if (SvIsCOW(sv)) {
5298                 /* I believe I need to grab the global SV mutex here and
5299                    then recheck the COW status.  */
5300                 if (DEBUG_C_TEST) {
5301                     PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
5302                     sv_dump(sv);
5303                 }
5304                 if (SvLEN(sv)) {
5305                     sv_release_COW(sv, SvPVX_const(sv), SV_COW_NEXT_SV(sv));
5306                 } else {
5307                     unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
5308                 }
5309
5310                 /* And drop it here.  */
5311                 SvFAKE_off(sv);
5312             } else if (SvLEN(sv)) {
5313                 Safefree(SvPVX_const(sv));
5314             }
5315         }
5316 #else
5317         else if (SvPVX_const(sv) && SvLEN(sv))
5318             Safefree(SvPVX_mutable(sv));
5319         else if (SvPVX_const(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
5320             unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
5321             SvFAKE_off(sv);
5322         }
5323 #endif
5324         break;
5325     case SVt_NV:
5326         break;
5327     }
5328
5329     SvFLAGS(sv) &= SVf_BREAK;
5330     SvFLAGS(sv) |= SVTYPEMASK;
5331
5332     if (sv_type_details->arena) {
5333         del_body(((char *)SvANY(sv) + sv_type_details->offset),
5334                  &PL_body_roots[type]);
5335     }
5336     else if (sv_type_details->body_size) {
5337         my_safefree(SvANY(sv));
5338     }
5339 }
5340
5341 /*
5342 =for apidoc sv_newref
5343
5344 Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
5345 instead.
5346
5347 =cut
5348 */
5349
5350 SV *
5351 Perl_sv_newref(pTHX_ SV *sv)
5352 {
5353     PERL_UNUSED_CONTEXT;
5354     if (sv)
5355         (SvREFCNT(sv))++;
5356     return sv;
5357 }
5358
5359 /*
5360 =for apidoc sv_free
5361
5362 Decrement an SV's reference count, and if it drops to zero, call
5363 C<sv_clear> to invoke destructors and free up any memory used by
5364 the body; finally, deallocate the SV's head itself.
5365 Normally called via a wrapper macro C<SvREFCNT_dec>.
5366
5367 =cut
5368 */
5369
5370 void
5371 Perl_sv_free(pTHX_ SV *sv)
5372 {
5373     dVAR;
5374     if (!sv)
5375         return;
5376     if (SvREFCNT(sv) == 0) {
5377         if (SvFLAGS(sv) & SVf_BREAK)
5378             /* this SV's refcnt has been artificially decremented to
5379              * trigger cleanup */
5380             return;
5381         if (PL_in_clean_all) /* All is fair */
5382             return;
5383         if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5384             /* make sure SvREFCNT(sv)==0 happens very seldom */
5385             SvREFCNT(sv) = (~(U32)0)/2;
5386             return;
5387         }
5388         if (ckWARN_d(WARN_INTERNAL)) {
5389             Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
5390                         "Attempt to free unreferenced scalar: SV 0x%"UVxf
5391                         pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
5392 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
5393             Perl_dump_sv_child(aTHX_ sv);
5394 #else
5395   #ifdef DEBUG_LEAKING_SCALARS
5396         sv_dump(sv);
5397   #endif
5398 #endif
5399         }
5400         return;
5401     }
5402     if (--(SvREFCNT(sv)) > 0)
5403         return;
5404     Perl_sv_free2(aTHX_ sv);
5405 }
5406
5407 void
5408 Perl_sv_free2(pTHX_ SV *sv)
5409 {
5410     dVAR;
5411 #ifdef DEBUGGING
5412     if (SvTEMP(sv)) {
5413         if (ckWARN_d(WARN_DEBUGGING))
5414             Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
5415                         "Attempt to free temp prematurely: SV 0x%"UVxf
5416                         pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
5417         return;
5418     }
5419 #endif
5420     if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5421         /* make sure SvREFCNT(sv)==0 happens very seldom */
5422         SvREFCNT(sv) = (~(U32)0)/2;
5423         return;
5424     }
5425     sv_clear(sv);
5426     if (! SvREFCNT(sv))
5427         del_SV(sv);
5428 }
5429
5430 /*
5431 =for apidoc sv_len
5432
5433 Returns the length of the string in the SV. Handles magic and type
5434 coercion.  See also C<SvCUR>, which gives raw access to the xpv_cur slot.
5435
5436 =cut
5437 */
5438
5439 STRLEN
5440 Perl_sv_len(pTHX_ register SV *sv)
5441 {
5442     STRLEN len;
5443
5444     if (!sv)
5445         return 0;
5446
5447     if (SvGMAGICAL(sv))
5448         len = mg_length(sv);
5449     else
5450         (void)SvPV_const(sv, len);
5451     return len;
5452 }
5453
5454 /*
5455 =for apidoc sv_len_utf8
5456
5457 Returns the number of characters in the string in an SV, counting wide
5458 UTF-8 bytes as a single character. Handles magic and type coercion.
5459
5460 =cut
5461 */
5462
5463 /*
5464  * The length is cached in PERL_UTF8_magic, in the mg_len field.  Also the
5465  * mg_ptr is used, by sv_pos_u2b() and sv_pos_b2u() - see the comments below.
5466  * (Note that the mg_len is not the length of the mg_ptr field.
5467  * This allows the cache to store the character length of the string without
5468  * needing to malloc() extra storage to attach to the mg_ptr.)
5469  *
5470  */
5471
5472 STRLEN
5473 Perl_sv_len_utf8(pTHX_ register SV *sv)
5474 {
5475     if (!sv)
5476         return 0;
5477
5478     if (SvGMAGICAL(sv))
5479         return mg_length(sv);
5480     else
5481     {
5482         STRLEN len;
5483         const U8 *s = (U8*)SvPV_const(sv, len);
5484
5485         if (PL_utf8cache) {
5486             STRLEN ulen;
5487             MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : NULL;
5488
5489             if (mg && mg->mg_len != -1) {
5490                 ulen = mg->mg_len;
5491                 if (PL_utf8cache < 0) {
5492                     const STRLEN real = Perl_utf8_length(aTHX_ s, s + len);
5493                     if (real != ulen) {
5494                         /* Need to turn the assertions off otherwise we may
5495                            recurse infinitely while printing error messages.
5496                         */
5497                         SAVEI8(PL_utf8cache);
5498                         PL_utf8cache = 0;
5499                         Perl_croak(aTHX_ "panic: sv_len_utf8 cache %"UVuf
5500                                    " real %"UVuf" for %"SVf,
5501                                    (UV) ulen, (UV) real, SVfARG(sv));
5502                     }
5503                 }
5504             }
5505             else {
5506                 ulen = Perl_utf8_length(aTHX_ s, s + len);
5507                 if (!SvREADONLY(sv)) {
5508                     if (!mg) {
5509                         mg = sv_magicext(sv, 0, PERL_MAGIC_utf8,
5510                                          &PL_vtbl_utf8, 0, 0);
5511                     }
5512                     assert(mg);
5513                     mg->mg_len = ulen;
5514                 }
5515             }
5516             return ulen;
5517         }
5518         return Perl_utf8_length(aTHX_ s, s + len);
5519     }
5520 }
5521
5522 /* Walk forwards to find the byte corresponding to the passed in UTF-8
5523    offset.  */
5524 static STRLEN
5525 S_sv_pos_u2b_forwards(const U8 *const start, const U8 *const send,
5526                       STRLEN uoffset)
5527 {
5528     const U8 *s = start;
5529
5530     while (s < send && uoffset--)
5531         s += UTF8SKIP(s);
5532     if (s > send) {
5533         /* This is the existing behaviour. Possibly it should be a croak, as
5534            it's actually a bounds error  */
5535         s = send;
5536     }
5537     return s - start;
5538 }
5539
5540 /* Given the length of the string in both bytes and UTF-8 characters, decide
5541    whether to walk forwards or backwards to find the byte corresponding to
5542    the passed in UTF-8 offset.  */
5543 static STRLEN
5544 S_sv_pos_u2b_midway(const U8 *const start, const U8 *send,
5545                       STRLEN uoffset, STRLEN uend)
5546 {
5547     STRLEN backw = uend - uoffset;
5548     if (uoffset < 2 * backw) {
5549         /* The assumption is that going forwards is twice the speed of going
5550            forward (that's where the 2 * backw comes from).
5551            (The real figure of course depends on the UTF-8 data.)  */
5552         return sv_pos_u2b_forwards(start, send, uoffset);
5553     }
5554
5555     while (backw--) {
5556         send--;
5557         while (UTF8_IS_CONTINUATION(*send))
5558             send--;
5559     }
5560     return send - start;
5561 }
5562
5563 /* For the string representation of the given scalar, find the byte
5564    corresponding to the passed in UTF-8 offset.  uoffset0 and boffset0
5565    give another position in the string, *before* the sought offset, which
5566    (which is always true, as 0, 0 is a valid pair of positions), which should
5567    help reduce the amount of linear searching.
5568    If *mgp is non-NULL, it should point to the UTF-8 cache magic, which
5569    will be used to reduce the amount of linear searching. The cache will be
5570    created if necessary, and the found value offered to it for update.  */
5571 static STRLEN
5572 S_sv_pos_u2b_cached(pTHX_ SV *sv, MAGIC **mgp, const U8 *const start,
5573                     const U8 *const send, STRLEN uoffset,
5574                     STRLEN uoffset0, STRLEN boffset0) {
5575     STRLEN boffset = 0; /* Actually always set, but let's keep gcc happy.  */
5576     bool found = FALSE;
5577
5578     assert (uoffset >= uoffset0);
5579
5580     if (SvMAGICAL(sv) && !SvREADONLY(sv) && PL_utf8cache
5581         && (*mgp || (*mgp = mg_find(sv, PERL_MAGIC_utf8)))) {
5582         if ((*mgp)->mg_ptr) {
5583             STRLEN *cache = (STRLEN *) (*mgp)->mg_ptr;
5584             if (cache[0] == uoffset) {
5585                 /* An exact match. */
5586                 return cache[1];
5587             }
5588             if (cache[2] == uoffset) {
5589                 /* An exact match. */
5590                 return cache[3];
5591             }
5592
5593             if (cache[0] < uoffset) {
5594                 /* The cache already knows part of the way.   */
5595                 if (cache[0] > uoffset0) {
5596                     /* The cache knows more than the passed in pair  */
5597                     uoffset0 = cache[0];
5598                     boffset0 = cache[1];
5599                 }
5600                 if ((*mgp)->mg_len != -1) {
5601                     /* And we know the end too.  */
5602                     boffset = boffset0
5603                         + sv_pos_u2b_midway(start + boffset0, send,
5604                                               uoffset - uoffset0,
5605                                               (*mgp)->mg_len - uoffset0);
5606                 } else {
5607                     boffset = boffset0
5608                         + sv_pos_u2b_forwards(start + boffset0,
5609                                                 send, uoffset - uoffset0);
5610                 }
5611             }
5612             else if (cache[2] < uoffset) {
5613                 /* We're between the two cache entries.  */
5614                 if (cache[2] > uoffset0) {
5615                     /* and the cache knows more than the passed in pair  */
5616                     uoffset0 = cache[2];
5617                     boffset0 = cache[3];
5618                 }
5619
5620                 boffset = boffset0
5621                     + sv_pos_u2b_midway(start + boffset0,
5622                                           start + cache[1],
5623                                           uoffset - uoffset0,
5624                                           cache[0] - uoffset0);
5625             } else {
5626                 boffset = boffset0
5627                     + sv_pos_u2b_midway(start + boffset0,
5628                                           start + cache[3],
5629                                           uoffset - uoffset0,
5630                                           cache[2] - uoffset0);
5631             }
5632             found = TRUE;
5633         }
5634         else if ((*mgp)->mg_len != -1) {
5635             /* If we can take advantage of a passed in offset, do so.  */
5636             /* In fact, offset0 is either 0, or less than offset, so don't
5637                need to worry about the other possibility.  */
5638             boffset = boffset0
5639                 + sv_pos_u2b_midway(start + boffset0, send,
5640                                       uoffset - uoffset0,
5641                                       (*mgp)->mg_len - uoffset0);
5642             found = TRUE;
5643         }
5644     }
5645
5646     if (!found || PL_utf8cache < 0) {
5647         const STRLEN real_boffset
5648             = boffset0 + sv_pos_u2b_forwards(start + boffset0,
5649                                                send, uoffset - uoffset0);
5650
5651         if (found && PL_utf8cache < 0) {
5652             if (real_boffset != boffset) {
5653                 /* Need to turn the assertions off otherwise we may recurse
5654                    infinitely while printing error messages.  */
5655                 SAVEI8(PL_utf8cache);
5656                 PL_utf8cache = 0;
5657                 Perl_croak(aTHX_ "panic: sv_pos_u2b_cache cache %"UVuf
5658                            " real %"UVuf" for %"SVf,
5659                            (UV) boffset, (UV) real_boffset, SVfARG(sv));
5660             }
5661         }
5662         boffset = real_boffset;
5663     }
5664
5665     S_utf8_mg_pos_cache_update(aTHX_ sv, mgp, boffset, uoffset, send - start);
5666     return boffset;
5667 }
5668
5669
5670 /*
5671 =for apidoc sv_pos_u2b
5672
5673 Converts the value pointed to by offsetp from a count of UTF-8 chars from
5674 the start of the string, to a count of the equivalent number of bytes; if
5675 lenp is non-zero, it does the same to lenp, but this time starting from
5676 the offset, rather than from the start of the string. Handles magic and
5677 type coercion.
5678
5679 =cut
5680 */
5681
5682 /*
5683  * sv_pos_u2b() uses, like sv_pos_b2u(), the mg_ptr of the potential
5684  * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
5685  * byte offsets.  See also the comments of S_utf8_mg_pos_cache_update().
5686  *
5687  */
5688
5689 void
5690 Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
5691 {
5692     const U8 *start;
5693     STRLEN len;
5694
5695     if (!sv)
5696         return;
5697
5698     start = (U8*)SvPV_const(sv, len);
5699     if (len) {
5700         STRLEN uoffset = (STRLEN) *offsetp;
5701         const U8 * const send = start + len;
5702         MAGIC *mg = NULL;
5703         const STRLEN boffset = sv_pos_u2b_cached(sv, &mg, start, send,
5704                                              uoffset, 0, 0);
5705
5706         *offsetp = (I32) boffset;
5707
5708         if (lenp) {
5709             /* Convert the relative offset to absolute.  */
5710             const STRLEN uoffset2 = uoffset + (STRLEN) *lenp;
5711             const STRLEN boffset2
5712                 = sv_pos_u2b_cached(sv, &mg, start, send, uoffset2,
5713                                       uoffset, boffset) - boffset;
5714
5715             *lenp = boffset2;
5716         }
5717     }
5718     else {
5719          *offsetp = 0;
5720          if (lenp)
5721               *lenp = 0;
5722     }
5723
5724     return;
5725 }
5726
5727 /* Create and update the UTF8 magic offset cache, with the proffered utf8/
5728    byte length pairing. The (byte) length of the total SV is passed in too,
5729    as blen, because for some (more esoteric) SVs, the call to SvPV_const()
5730    may not have updated SvCUR, so we can't rely on reading it directly.
5731
5732    The proffered utf8/byte length pairing isn't used if the cache already has
5733    two pairs, and swapping either for the proffered pair would increase the
5734    RMS of the intervals between known byte offsets.
5735
5736    The cache itself consists of 4 STRLEN values
5737    0: larger UTF-8 offset
5738    1: corresponding byte offset
5739    2: smaller UTF-8 offset
5740    3: corresponding byte offset
5741
5742    Unused cache pairs have the value 0, 0.
5743    Keeping the cache "backwards" means that the invariant of
5744    cache[0] >= cache[2] is maintained even with empty slots, which means that
5745    the code that uses it doesn't need to worry if only 1 entry has actually
5746    been set to non-zero.  It also makes the "position beyond the end of the
5747    cache" logic much simpler, as the first slot is always the one to start
5748    from.   
5749 */
5750 static void
5751 S_utf8_mg_pos_cache_update(pTHX_ SV *sv, MAGIC **mgp, STRLEN byte, STRLEN utf8,
5752                            STRLEN blen)
5753 {
5754     STRLEN *cache;
5755     if (SvREADONLY(sv))
5756         return;
5757
5758     if (!*mgp) {
5759         *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, (MGVTBL*)&PL_vtbl_utf8, 0,
5760                            0);
5761         (*mgp)->mg_len = -1;
5762     }
5763     assert(*mgp);
5764
5765     if (!(cache = (STRLEN *)(*mgp)->mg_ptr)) {
5766         Newxz(cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
5767         (*mgp)->mg_ptr = (char *) cache;
5768     }
5769     assert(cache);
5770
5771     if (PL_utf8cache < 0) {
5772         const U8 *start = (const U8 *) SvPVX_const(sv);
5773         const STRLEN realutf8 = utf8_length(start, start + byte);
5774
5775         if (realutf8 != utf8) {
5776             /* Need to turn the assertions off otherwise we may recurse
5777                infinitely while printing error messages.  */
5778             SAVEI8(PL_utf8cache);
5779             PL_utf8cache = 0;
5780             Perl_croak(aTHX_ "panic: utf8_mg_pos_cache_update cache %"UVuf
5781                        " real %"UVuf" for %"SVf, (UV) utf8, (UV) realutf8, SVfARG(sv));
5782         }
5783     }
5784
5785     /* Cache is held with the later position first, to simplify the code
5786        that deals with unbounded ends.  */
5787        
5788     ASSERT_UTF8_CACHE(cache);
5789     if (cache[1] == 0) {
5790         /* Cache is totally empty  */
5791         cache[0] = utf8;
5792         cache[1] = byte;
5793     } else if (cache[3] == 0) {
5794         if (byte > cache[1]) {
5795             /* New one is larger, so goes first.  */
5796             cache[2] = cache[0];
5797             cache[3] = cache[1];
5798             cache[0] = utf8;
5799             cache[1] = byte;
5800         } else {
5801             cache[2] = utf8;
5802             cache[3] = byte;
5803         }
5804     } else {
5805 #define THREEWAY_SQUARE(a,b,c,d) \
5806             ((float)((d) - (c))) * ((float)((d) - (c))) \
5807             + ((float)((c) - (b))) * ((float)((c) - (b))) \
5808                + ((float)((b) - (a))) * ((float)((b) - (a)))
5809
5810         /* Cache has 2 slots in use, and we know three potential pairs.
5811            Keep the two that give the lowest RMS distance. Do the
5812            calcualation in bytes simply because we always know the byte
5813            length.  squareroot has the same ordering as the positive value,
5814            so don't bother with the actual square root.  */
5815         const float existing = THREEWAY_SQUARE(0, cache[3], cache[1], blen);
5816         if (byte > cache[1]) {
5817             /* New position is after the existing pair of pairs.  */
5818             const float keep_earlier
5819                 = THREEWAY_SQUARE(0, cache[3], byte, blen);
5820             const float keep_later
5821                 = THREEWAY_SQUARE(0, cache[1], byte, blen);
5822
5823             if (keep_later < keep_earlier) {
5824                 if (keep_later < existing) {
5825                     cache[2] = cache[0];
5826                     cache[3] = cache[1];
5827                     cache[0] = utf8;
5828                     cache[1] = byte;
5829                 }
5830             }
5831             else {
5832                 if (keep_earlier < existing) {
5833                     cache[0] = utf8;
5834                     cache[1] = byte;
5835                 }
5836             }
5837         }
5838         else if (byte > cache[3]) {
5839             /* New position is between the existing pair of pairs.  */
5840             const float keep_earlier
5841                 = THREEWAY_SQUARE(0, cache[3], byte, blen);
5842             const float keep_later
5843                 = THREEWAY_SQUARE(0, byte, cache[1], blen);
5844
5845             if (keep_later < keep_earlier) {
5846                 if (keep_later < existing) {
5847                     cache[2] = utf8;
5848                     cache[3] = byte;
5849                 }
5850             }
5851             else {
5852                 if (keep_earlier < existing) {
5853                     cache[0] = utf8;
5854                     cache[1] = byte;
5855                 }
5856             }
5857         }
5858         else {
5859             /* New position is before the existing pair of pairs.  */
5860             const float keep_earlier
5861                 = THREEWAY_SQUARE(0, byte, cache[3], blen);
5862             const float keep_later
5863                 = THREEWAY_SQUARE(0, byte, cache[1], blen);
5864
5865             if (keep_later < keep_earlier) {
5866                 if (keep_later < existing) {
5867                     cache[2] = utf8;
5868                     cache[3] = byte;
5869                 }
5870             }
5871             else {
5872                 if (keep_earlier < existing) {
5873                     cache[0] = cache[2];
5874                     cache[1] = cache[3];
5875                     cache[2] = utf8;
5876                     cache[3] = byte;
5877                 }
5878             }
5879         }
5880     }
5881     ASSERT_UTF8_CACHE(cache);
5882 }
5883
5884 /* We already know all of the way, now we may be able to walk back.  The same
5885    assumption is made as in S_sv_pos_u2b_midway(), namely that walking
5886    backward is half the speed of walking forward. */
5887 static STRLEN
5888 S_sv_pos_b2u_midway(pTHX_ const U8 *s, const U8 *const target, const U8 *end,
5889                     STRLEN endu)
5890 {
5891     const STRLEN forw = target - s;
5892     STRLEN backw = end - target;
5893
5894     if (forw < 2 * backw) {
5895         return utf8_length(s, target);
5896     }
5897
5898     while (end > target) {
5899         end--;
5900         while (UTF8_IS_CONTINUATION(*end)) {
5901             end--;
5902         }
5903         endu--;
5904     }
5905     return endu;
5906 }
5907
5908 /*
5909 =for apidoc sv_pos_b2u
5910
5911 Converts the value pointed to by offsetp from a count of bytes from the
5912 start of the string, to a count of the equivalent number of UTF-8 chars.
5913 Handles magic and type coercion.
5914
5915 =cut
5916 */
5917
5918 /*
5919  * sv_pos_b2u() uses, like sv_pos_u2b(), the mg_ptr of the potential
5920  * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
5921  * byte offsets.
5922  *
5923  */
5924 void
5925 Perl_sv_pos_b2u(pTHX_ register SV* sv, I32* offsetp)
5926 {
5927     const U8* s;
5928     const STRLEN byte = *offsetp;
5929     STRLEN len = 0; /* Actually always set, but let's keep gcc happy.  */
5930     STRLEN blen;
5931     MAGIC* mg = NULL;
5932     const U8* send;
5933     bool found = FALSE;
5934
5935     if (!sv)
5936         return;
5937
5938     s = (const U8*)SvPV_const(sv, blen);
5939
5940     if (blen < byte)
5941         Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
5942
5943     send = s + byte;
5944
5945     if (SvMAGICAL(sv) && !SvREADONLY(sv) && PL_utf8cache
5946         && (mg = mg_find(sv, PERL_MAGIC_utf8))) {
5947         if (mg->mg_ptr) {
5948             STRLEN * const cache = (STRLEN *) mg->mg_ptr;
5949             if (cache[1] == byte) {
5950                 /* An exact match. */
5951                 *offsetp = cache[0];
5952                 return;
5953             }
5954             if (cache[3] == byte) {
5955                 /* An exact match. */
5956                 *offsetp = cache[2];
5957                 return;
5958             }
5959
5960             if (cache[1] < byte) {
5961                 /* We already know part of the way. */
5962                 if (mg->mg_len != -1) {
5963                     /* Actually, we know the end too.  */
5964                     len = cache[0]
5965                         + S_sv_pos_b2u_midway(aTHX_ s + cache[1], send,
5966                                               s + blen, mg->mg_len - cache[0]);
5967                 } else {
5968                     len = cache[0] + utf8_length(s + cache[1], send);
5969                 }
5970             }
5971             else if (cache[3] < byte) {
5972                 /* We're between the two cached pairs, so we do the calculation
5973                    offset by the byte/utf-8 positions for the earlier pair,
5974                    then add the utf-8 characters from the string start to
5975                    there.  */
5976                 len = S_sv_pos_b2u_midway(aTHX_ s + cache[3], send,
5977                                           s + cache[1], cache[0] - cache[2])
5978                     + cache[2];
5979
5980             }
5981             else { /* cache[3] > byte */
5982                 len = S_sv_pos_b2u_midway(aTHX_ s, send, s + cache[3],
5983                                           cache[2]);
5984
5985             }
5986             ASSERT_UTF8_CACHE(cache);
5987             found = TRUE;
5988         } else if (mg->mg_len != -1) {
5989             len = S_sv_pos_b2u_midway(aTHX_ s, send, s + blen, mg->mg_len);
5990             found = TRUE;
5991         }
5992     }
5993     if (!found || PL_utf8cache < 0) {
5994         const STRLEN real_len = utf8_length(s, send);
5995
5996         if (found && PL_utf8cache < 0) {
5997             if (len != real_len) {
5998                 /* Need to turn the assertions off otherwise we may recurse
5999                    infinitely while printing error messages.  */
6000                 SAVEI8(PL_utf8cache);
6001                 PL_utf8cache = 0;
6002                 Perl_croak(aTHX_ "panic: sv_pos_b2u cache %"UVuf
6003                            " real %"UVuf" for %"SVf,
6004                            (UV) len, (UV) real_len, SVfARG(sv));
6005             }
6006         }
6007         len = real_len;
6008     }
6009     *offsetp = len;
6010
6011     S_utf8_mg_pos_cache_update(aTHX_ sv, &mg, byte, len, blen);
6012 }
6013
6014 /*
6015 =for apidoc sv_eq
6016
6017 Returns a boolean indicating whether the strings in the two SVs are
6018 identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6019 coerce its args to strings if necessary.
6020
6021 =cut
6022 */
6023
6024 I32
6025 Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
6026 {
6027     dVAR;
6028     const char *pv1;
6029     STRLEN cur1;
6030     const char *pv2;
6031     STRLEN cur2;
6032     I32  eq     = 0;
6033     char *tpv   = NULL;
6034     SV* svrecode = NULL;
6035
6036     if (!sv1) {
6037         pv1 = "";
6038         cur1 = 0;
6039     }
6040     else {
6041         /* if pv1 and pv2 are the same, second SvPV_const call may
6042          * invalidate pv1, so we may need to make a copy */
6043         if (sv1 == sv2 && (SvTHINKFIRST(sv1) || SvGMAGICAL(sv1))) {
6044             pv1 = SvPV_const(sv1, cur1);
6045             sv1 = newSVpvn_flags(pv1, cur1, SVs_TEMP | SvUTF8(sv2));
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 /*
7003 =for apidoc newSVpvn_flags
7004
7005 Creates a new SV and copies a string into it.  The reference count for the
7006 SV is set to 1.  Note that if C<len> is zero, Perl will create a zero length
7007 string.  You are responsible for ensuring that the source string is at least
7008 C<len> bytes long.  If the C<s> argument is NULL the new SV will be undefined.
7009 Currently the only flag bits accepted are C<SVf_UTF8> and C<SVs_TEMP>.
7010 If C<SVs_TEMP> is set, then C<sv2mortal()> is called on the result before
7011 returning. If C<SVf_UTF8> is set, then it will be set on the new SV.
7012 C<newSVpvn_utf8()> is a convenience wrapper for this function, defined as
7013
7014     #define newSVpvn_utf8(s, len, u)                    \
7015         newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0)
7016
7017 =cut
7018 */
7019
7020 SV *
7021 Perl_newSVpvn_flags(pTHX_ const char *s, STRLEN len, U32 flags)
7022 {
7023     dVAR;
7024     register SV *sv;
7025
7026     /* All the flags we don't support must be zero.
7027        And we're new code so I'm going to assert this from the start.  */
7028     assert(!(flags & ~(SVf_UTF8|SVs_TEMP)));
7029     new_SV(sv);
7030     sv_setpvn(sv,s,len);
7031     SvFLAGS(sv) |= (flags & SVf_UTF8);
7032     return (flags & SVs_TEMP) ? sv_2mortal(sv) : sv;
7033 }
7034
7035 /*
7036 =for apidoc sv_2mortal
7037
7038 Marks an existing SV as mortal.  The SV will be destroyed "soon", either
7039 by an explicit call to FREETMPS, or by an implicit call at places such as
7040 statement boundaries.  SvTEMP() is turned on which means that the SV's
7041 string buffer can be "stolen" if this SV is copied. See also C<sv_newmortal>
7042 and C<sv_mortalcopy>.
7043
7044 =cut
7045 */
7046
7047 SV *
7048 Perl_sv_2mortal(pTHX_ register SV *sv)
7049 {
7050     dVAR;
7051     if (!sv)
7052         return NULL;
7053     if (SvREADONLY(sv) && SvIMMORTAL(sv))
7054         return sv;
7055     EXTEND_MORTAL(1);
7056     PL_tmps_stack[++PL_tmps_ix] = sv;
7057     SvTEMP_on(sv);
7058     return sv;
7059 }
7060
7061 /*
7062 =for apidoc newSVpv
7063
7064 Creates a new SV and copies a string into it.  The reference count for the
7065 SV is set to 1.  If C<len> is zero, Perl will compute the length using
7066 strlen().  For efficiency, consider using C<newSVpvn> instead.
7067
7068 =cut
7069 */
7070
7071 SV *
7072 Perl_newSVpv(pTHX_ const char *s, STRLEN len)
7073 {
7074     dVAR;
7075     register SV *sv;
7076
7077     new_SV(sv);
7078     sv_setpvn(sv, s, len || s == NULL ? len : strlen(s));
7079     return sv;
7080 }
7081
7082 /*
7083 =for apidoc newSVpvn
7084
7085 Creates a new SV and copies a string into it.  The reference count for the
7086 SV is set to 1.  Note that if C<len> is zero, Perl will create a zero length
7087 string.  You are responsible for ensuring that the source string is at least
7088 C<len> bytes long.  If the C<s> argument is NULL the new SV will be undefined.
7089
7090 =cut
7091 */
7092
7093 SV *
7094 Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
7095 {
7096     dVAR;
7097     register SV *sv;
7098
7099     new_SV(sv);
7100     sv_setpvn(sv,s,len);
7101     return sv;
7102 }
7103
7104 /*
7105 =for apidoc newSVhek
7106
7107 Creates a new SV from the hash key structure.  It will generate scalars that
7108 point to the shared string table where possible. Returns a new (undefined)
7109 SV if the hek is NULL.
7110
7111 =cut
7112 */
7113
7114 SV *
7115 Perl_newSVhek(pTHX_ const HEK *hek)
7116 {
7117     dVAR;
7118     if (!hek) {
7119         SV *sv;
7120
7121         new_SV(sv);
7122         return sv;
7123     }
7124
7125     if (HEK_LEN(hek) == HEf_SVKEY) {
7126         return newSVsv(*(SV**)HEK_KEY(hek));
7127     } else {
7128         const int flags = HEK_FLAGS(hek);
7129         if (flags & HVhek_WASUTF8) {
7130             /* Trouble :-)
7131                Andreas would like keys he put in as utf8 to come back as utf8
7132             */
7133             STRLEN utf8_len = HEK_LEN(hek);
7134             const U8 *as_utf8 = bytes_to_utf8 ((U8*)HEK_KEY(hek), &utf8_len);
7135             SV * const sv = newSVpvn ((const char*)as_utf8, utf8_len);
7136
7137             SvUTF8_on (sv);
7138             Safefree (as_utf8); /* bytes_to_utf8() allocates a new string */
7139             return sv;
7140         } else if (flags & (HVhek_REHASH|HVhek_UNSHARED)) {
7141             /* We don't have a pointer to the hv, so we have to replicate the
7142                flag into every HEK. This hv is using custom a hasing
7143                algorithm. Hence we can't return a shared string scalar, as
7144                that would contain the (wrong) hash value, and might get passed
7145                into an hv routine with a regular hash.
7146                Similarly, a hash that isn't using shared hash keys has to have
7147                the flag in every key so that we know not to try to call
7148                share_hek_kek on it.  */
7149
7150             SV * const sv = newSVpvn (HEK_KEY(hek), HEK_LEN(hek));
7151             if (HEK_UTF8(hek))
7152                 SvUTF8_on (sv);
7153             return sv;
7154         }
7155         /* This will be overwhelminly the most common case.  */
7156         {
7157             /* Inline most of newSVpvn_share(), because share_hek_hek() is far
7158                more efficient than sharepvn().  */
7159             SV *sv;
7160
7161             new_SV(sv);
7162             sv_upgrade(sv, SVt_PV);
7163             SvPV_set(sv, (char *)HEK_KEY(share_hek_hek(hek)));
7164             SvCUR_set(sv, HEK_LEN(hek));
7165             SvLEN_set(sv, 0);
7166             SvREADONLY_on(sv);
7167             SvFAKE_on(sv);
7168             SvPOK_on(sv);
7169             if (HEK_UTF8(hek))
7170                 SvUTF8_on(sv);
7171             return sv;
7172         }
7173     }
7174 }
7175
7176 /*
7177 =for apidoc newSVpvn_share
7178
7179 Creates a new SV with its SvPVX_const pointing to a shared string in the string
7180 table. If the string does not already exist in the table, it is created
7181 first.  Turns on READONLY and FAKE. If the C<hash> parameter is non-zero, that
7182 value is used; otherwise the hash is computed. The string's hash can be later
7183 be retrieved from the SV with the C<SvSHARED_HASH()> macro. The idea here is
7184 that as the string table is used for shared hash keys these strings will have
7185 SvPVX_const == HeKEY and hash lookup will avoid string compare.
7186
7187 =cut
7188 */
7189
7190 SV *
7191 Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
7192 {
7193     dVAR;
7194     register SV *sv;
7195     bool is_utf8 = FALSE;
7196     const char *const orig_src = src;
7197
7198     if (len < 0) {
7199         STRLEN tmplen = -len;
7200         is_utf8 = TRUE;
7201         /* See the note in hv.c:hv_fetch() --jhi */
7202         src = (char*)bytes_from_utf8((const U8*)src, &tmplen, &is_utf8);
7203         len = tmplen;
7204     }
7205     if (!hash)
7206         PERL_HASH(hash, src, len);
7207     new_SV(sv);
7208     sv_upgrade(sv, SVt_PV);
7209     SvPV_set(sv, sharepvn(src, is_utf8?-len:len, hash));
7210     SvCUR_set(sv, len);
7211     SvLEN_set(sv, 0);
7212     SvREADONLY_on(sv);
7213     SvFAKE_on(sv);
7214     SvPOK_on(sv);
7215     if (is_utf8)
7216         SvUTF8_on(sv);
7217     if (src != orig_src)
7218         Safefree(src);
7219     return sv;
7220 }
7221
7222
7223 #if defined(PERL_IMPLICIT_CONTEXT)
7224
7225 /* pTHX_ magic can't cope with varargs, so this is a no-context
7226  * version of the main function, (which may itself be aliased to us).
7227  * Don't access this version directly.
7228  */
7229
7230 SV *
7231 Perl_newSVpvf_nocontext(const char* pat, ...)
7232 {
7233     dTHX;
7234     register SV *sv;
7235     va_list args;
7236     va_start(args, pat);
7237     sv = vnewSVpvf(pat, &args);
7238     va_end(args);
7239     return sv;
7240 }
7241 #endif
7242
7243 /*
7244 =for apidoc newSVpvf
7245
7246 Creates a new SV and initializes it with the string formatted like
7247 C<sprintf>.
7248
7249 =cut
7250 */
7251
7252 SV *
7253 Perl_newSVpvf(pTHX_ const char* pat, ...)
7254 {
7255     register SV *sv;
7256     va_list args;
7257     va_start(args, pat);
7258     sv = vnewSVpvf(pat, &args);
7259     va_end(args);
7260     return sv;
7261 }
7262
7263 /* backend for newSVpvf() and newSVpvf_nocontext() */
7264
7265 SV *
7266 Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
7267 {
7268     dVAR;
7269     register SV *sv;
7270     new_SV(sv);
7271     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
7272     return sv;
7273 }
7274
7275 /*
7276 =for apidoc newSVnv
7277
7278 Creates a new SV and copies a floating point value into it.
7279 The reference count for the SV is set to 1.
7280
7281 =cut
7282 */
7283
7284 SV *
7285 Perl_newSVnv(pTHX_ NV n)
7286 {
7287     dVAR;
7288     register SV *sv;
7289
7290     new_SV(sv);
7291     sv_setnv(sv,n);
7292     return sv;
7293 }
7294
7295 /*
7296 =for apidoc newSViv
7297
7298 Creates a new SV and copies an integer into it.  The reference count for the
7299 SV is set to 1.
7300
7301 =cut
7302 */
7303
7304 SV *
7305 Perl_newSViv(pTHX_ IV i)
7306 {
7307     dVAR;
7308     register SV *sv;
7309
7310     new_SV(sv);
7311     sv_setiv(sv,i);
7312     return sv;
7313 }
7314
7315 /*
7316 =for apidoc newSVuv
7317
7318 Creates a new SV and copies an unsigned integer into it.
7319 The reference count for the SV is set to 1.
7320
7321 =cut
7322 */
7323
7324 SV *
7325 Perl_newSVuv(pTHX_ UV u)
7326 {
7327     dVAR;
7328     register SV *sv;
7329
7330     new_SV(sv);
7331     sv_setuv(sv,u);
7332     return sv;
7333 }
7334
7335 /*
7336 =for apidoc newSV_type
7337
7338 Creates a new SV, of the type specified.  The reference count for the new SV
7339 is set to 1.
7340
7341 =cut
7342 */
7343
7344 SV *
7345 Perl_newSV_type(pTHX_ svtype type)
7346 {
7347     register SV *sv;
7348
7349     new_SV(sv);
7350     sv_upgrade(sv, type);
7351     return sv;
7352 }
7353
7354 /*
7355 =for apidoc newRV_noinc
7356
7357 Creates an RV wrapper for an SV.  The reference count for the original
7358 SV is B<not> incremented.
7359
7360 =cut
7361 */
7362
7363 SV *
7364 Perl_newRV_noinc(pTHX_ SV *tmpRef)
7365 {
7366     dVAR;
7367     register SV *sv = newSV_type(SVt_IV);
7368     SvTEMP_off(tmpRef);
7369     SvRV_set(sv, tmpRef);
7370     SvROK_on(sv);
7371     return sv;
7372 }
7373
7374 /* newRV_inc is the official function name to use now.
7375  * newRV_inc is in fact #defined to newRV in sv.h
7376  */
7377
7378 SV *
7379 Perl_newRV(pTHX_ SV *sv)
7380 {
7381     dVAR;
7382     return newRV_noinc(SvREFCNT_inc_simple_NN(sv));
7383 }
7384
7385 /*
7386 =for apidoc newSVsv
7387
7388 Creates a new SV which is an exact duplicate of the original SV.
7389 (Uses C<sv_setsv>).
7390
7391 =cut
7392 */
7393
7394 SV *
7395 Perl_newSVsv(pTHX_ register SV *old)
7396 {
7397     dVAR;
7398     register SV *sv;
7399
7400     if (!old)
7401         return NULL;
7402     if (SvTYPE(old) == SVTYPEMASK) {
7403         if (ckWARN_d(WARN_INTERNAL))
7404             Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
7405         return NULL;
7406     }
7407     new_SV(sv);
7408     /* SV_GMAGIC is the default for sv_setv()
7409        SV_NOSTEAL prevents TEMP buffers being, well, stolen, and saves games
7410        with SvTEMP_off and SvTEMP_on round a call to sv_setsv.  */
7411     sv_setsv_flags(sv, old, SV_GMAGIC | SV_NOSTEAL);
7412     return sv;
7413 }
7414
7415 /*
7416 =for apidoc sv_reset
7417
7418 Underlying implementation for the C<reset> Perl function.
7419 Note that the perl-level function is vaguely deprecated.
7420
7421 =cut
7422 */
7423
7424 void
7425 Perl_sv_reset(pTHX_ register const char *s, HV *stash)
7426 {
7427     dVAR;
7428     char todo[PERL_UCHAR_MAX+1];
7429
7430     if (!stash)
7431         return;
7432
7433     if (!*s) {          /* reset ?? searches */
7434         MAGIC * const mg = mg_find((SV *)stash, PERL_MAGIC_symtab);
7435         if (mg) {
7436             const U32 count = mg->mg_len / sizeof(PMOP**);
7437             PMOP **pmp = (PMOP**) mg->mg_ptr;
7438             PMOP *const *const end = pmp + count;
7439
7440             while (pmp < end) {
7441 #ifdef USE_ITHREADS
7442                 SvREADONLY_off(PL_regex_pad[(*pmp)->op_pmoffset]);
7443 #else
7444                 (*pmp)->op_pmflags &= ~PMf_USED;
7445 #endif
7446                 ++pmp;
7447             }
7448         }
7449         return;
7450     }
7451
7452     /* reset variables */
7453
7454     if (!HvARRAY(stash))
7455         return;
7456
7457     Zero(todo, 256, char);
7458     while (*s) {
7459         I32 max;
7460         I32 i = (unsigned char)*s;
7461         if (s[1] == '-') {
7462             s += 2;
7463         }
7464         max = (unsigned char)*s++;
7465         for ( ; i <= max; i++) {
7466             todo[i] = 1;
7467         }
7468         for (i = 0; i <= (I32) HvMAX(stash); i++) {
7469             HE *entry;
7470             for (entry = HvARRAY(stash)[i];
7471                  entry;
7472                  entry = HeNEXT(entry))
7473             {
7474                 register GV *gv;
7475                 register SV *sv;
7476
7477                 if (!todo[(U8)*HeKEY(entry)])
7478                     continue;
7479                 gv = (GV*)HeVAL(entry);
7480                 sv = GvSV(gv);
7481                 if (sv) {
7482                     if (SvTHINKFIRST(sv)) {
7483                         if (!SvREADONLY(sv) && SvROK(sv))
7484                             sv_unref(sv);
7485                         /* XXX Is this continue a bug? Why should THINKFIRST
7486                            exempt us from resetting arrays and hashes?  */
7487                         continue;
7488                     }
7489                     SvOK_off(sv);
7490                     if (SvTYPE(sv) >= SVt_PV) {
7491                         SvCUR_set(sv, 0);
7492                         if (SvPVX_const(sv) != NULL)
7493                             *SvPVX(sv) = '\0';
7494                         SvTAINT(sv);
7495                     }
7496                 }
7497                 if (GvAV(gv)) {
7498                     av_clear(GvAV(gv));
7499                 }
7500                 if (GvHV(gv) && !HvNAME_get(GvHV(gv))) {
7501 #if defined(VMS)
7502                     Perl_die(aTHX_ "Can't reset %%ENV on this system");
7503 #else /* ! VMS */
7504                     hv_clear(GvHV(gv));
7505 #  if defined(USE_ENVIRON_ARRAY)
7506                     if (gv == PL_envgv)
7507                         my_clearenv();
7508 #  endif /* USE_ENVIRON_ARRAY */
7509 #endif /* VMS */
7510                 }
7511             }
7512         }
7513     }
7514 }
7515
7516 /*
7517 =for apidoc sv_2io
7518
7519 Using various gambits, try to get an IO from an SV: the IO slot if its a
7520 GV; or the recursive result if we're an RV; or the IO slot of the symbol
7521 named after the PV if we're a string.
7522
7523 =cut
7524 */
7525
7526 IO*
7527 Perl_sv_2io(pTHX_ SV *sv)
7528 {
7529     IO* io;
7530     GV* gv;
7531
7532     switch (SvTYPE(sv)) {
7533     case SVt_PVIO:
7534         io = (IO*)sv;
7535         break;
7536     case SVt_PVGV:
7537         gv = (GV*)sv;
7538         io = GvIO(gv);
7539         if (!io)
7540             Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
7541         break;
7542     default:
7543         if (!SvOK(sv))
7544             Perl_croak(aTHX_ PL_no_usym, "filehandle");
7545         if (SvROK(sv))
7546             return sv_2io(SvRV(sv));
7547         gv = gv_fetchsv(sv, 0, SVt_PVIO);
7548         if (gv)
7549             io = GvIO(gv);
7550         else
7551             io = 0;
7552         if (!io)
7553             Perl_croak(aTHX_ "Bad filehandle: %"SVf, SVfARG(sv));
7554         break;
7555     }
7556     return io;
7557 }
7558
7559 /*
7560 =for apidoc sv_2cv
7561
7562 Using various gambits, try to get a CV from an SV; in addition, try if
7563 possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
7564 The flags in C<lref> are passed to sv_fetchsv.
7565
7566 =cut
7567 */
7568
7569 CV *
7570 Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
7571 {
7572     dVAR;
7573     GV *gv = NULL;
7574     CV *cv = NULL;
7575
7576     if (!sv) {
7577         *st = NULL;
7578         *gvp = NULL;
7579         return NULL;
7580     }
7581     switch (SvTYPE(sv)) {
7582     case SVt_PVCV:
7583         *st = CvSTASH(sv);
7584         *gvp = NULL;
7585         return (CV*)sv;
7586     case SVt_PVHV:
7587     case SVt_PVAV:
7588         *st = NULL;
7589         *gvp = NULL;
7590         return NULL;
7591     case SVt_PVGV:
7592         gv = (GV*)sv;
7593         *gvp = gv;
7594         *st = GvESTASH(gv);
7595         goto fix_gv;
7596
7597     default:
7598         SvGETMAGIC(sv);
7599         if (SvROK(sv)) {
7600             SV * const *sp = &sv;       /* Used in tryAMAGICunDEREF macro. */
7601             tryAMAGICunDEREF(to_cv);
7602
7603             sv = SvRV(sv);
7604             if (SvTYPE(sv) == SVt_PVCV) {
7605                 cv = (CV*)sv;
7606                 *gvp = NULL;
7607                 *st = CvSTASH(cv);
7608                 return cv;
7609             }
7610             else if(isGV(sv))
7611                 gv = (GV*)sv;
7612             else
7613                 Perl_croak(aTHX_ "Not a subroutine reference");
7614         }
7615         else if (isGV(sv))
7616             gv = (GV*)sv;
7617         else
7618             gv = gv_fetchsv(sv, lref, SVt_PVCV);
7619         *gvp = gv;
7620         if (!gv) {
7621             *st = NULL;
7622             return NULL;
7623         }
7624         /* Some flags to gv_fetchsv mean don't really create the GV  */
7625         if (SvTYPE(gv) != SVt_PVGV) {
7626             *st = NULL;
7627             return NULL;
7628         }
7629         *st = GvESTASH(gv);
7630     fix_gv:
7631         if (lref && !GvCVu(gv)) {
7632             SV *tmpsv;
7633             ENTER;
7634             tmpsv = newSV(0);
7635             gv_efullname3(tmpsv, gv, NULL);
7636             /* XXX this is probably not what they think they're getting.
7637              * It has the same effect as "sub name;", i.e. just a forward
7638              * declaration! */
7639             newSUB(start_subparse(FALSE, 0),
7640                    newSVOP(OP_CONST, 0, tmpsv),
7641                    NULL, NULL);
7642             LEAVE;
7643             if (!GvCVu(gv))
7644                 Perl_croak(aTHX_ "Unable to create sub named \"%"SVf"\"",
7645                            SVfARG(sv));
7646         }
7647         return GvCVu(gv);
7648     }
7649 }
7650
7651 /*
7652 =for apidoc sv_true
7653
7654 Returns true if the SV has a true value by Perl's rules.
7655 Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
7656 instead use an in-line version.
7657
7658 =cut
7659 */
7660
7661 I32
7662 Perl_sv_true(pTHX_ register SV *sv)
7663 {
7664     if (!sv)
7665         return 0;
7666     if (SvPOK(sv)) {
7667         register const XPV* const tXpv = (XPV*)SvANY(sv);
7668         if (tXpv &&
7669                 (tXpv->xpv_cur > 1 ||
7670                 (tXpv->xpv_cur && *sv->sv_u.svu_pv != '0')))
7671             return 1;
7672         else
7673             return 0;
7674     }
7675     else {
7676         if (SvIOK(sv))
7677             return SvIVX(sv) != 0;
7678         else {
7679             if (SvNOK(sv))
7680                 return SvNVX(sv) != 0.0;
7681             else
7682                 return sv_2bool(sv);
7683         }
7684     }
7685 }
7686
7687 /*
7688 =for apidoc sv_pvn_force
7689
7690 Get a sensible string out of the SV somehow.
7691 A private implementation of the C<SvPV_force> macro for compilers which
7692 can't cope with complex macro expressions. Always use the macro instead.
7693
7694 =for apidoc sv_pvn_force_flags
7695
7696 Get a sensible string out of the SV somehow.
7697 If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
7698 appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
7699 implemented in terms of this function.
7700 You normally want to use the various wrapper macros instead: see
7701 C<SvPV_force> and C<SvPV_force_nomg>
7702
7703 =cut
7704 */
7705
7706 char *
7707 Perl_sv_pvn_force_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
7708 {
7709     dVAR;
7710     if (SvTHINKFIRST(sv) && !SvROK(sv))
7711         sv_force_normal_flags(sv, 0);
7712
7713     if (SvPOK(sv)) {
7714         if (lp)
7715             *lp = SvCUR(sv);
7716     }
7717     else {
7718         char *s;
7719         STRLEN len;
7720  
7721         if (SvREADONLY(sv) && !(flags & SV_MUTABLE_RETURN)) {
7722             const char * const ref = sv_reftype(sv,0);
7723             if (PL_op)
7724                 Perl_croak(aTHX_ "Can't coerce readonly %s to string in %s",
7725                            ref, OP_NAME(PL_op));
7726             else
7727                 Perl_croak(aTHX_ "Can't coerce readonly %s to string", ref);
7728         }
7729         if ((SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM)
7730             || isGV_with_GP(sv))
7731             Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
7732                 OP_NAME(PL_op));
7733         s = sv_2pv_flags(sv, &len, flags);
7734         if (lp)
7735             *lp = len;
7736
7737         if (s != SvPVX_const(sv)) {     /* Almost, but not quite, sv_setpvn() */
7738             if (SvROK(sv))
7739                 sv_unref(sv);
7740             SvUPGRADE(sv, SVt_PV);              /* Never FALSE */
7741             SvGROW(sv, len + 1);
7742             Move(s,SvPVX(sv),len,char);
7743             SvCUR_set(sv, len);
7744             SvPVX(sv)[len] = '\0';
7745         }
7746         if (!SvPOK(sv)) {
7747             SvPOK_on(sv);               /* validate pointer */
7748             SvTAINT(sv);
7749             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
7750                                   PTR2UV(sv),SvPVX_const(sv)));
7751         }
7752     }
7753     return SvPVX_mutable(sv);
7754 }
7755
7756 /*
7757 =for apidoc sv_pvbyten_force
7758
7759 The backend for the C<SvPVbytex_force> macro. Always use the macro instead.
7760
7761 =cut
7762 */
7763
7764 char *
7765 Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
7766 {
7767     sv_pvn_force(sv,lp);
7768     sv_utf8_downgrade(sv,0);
7769     *lp = SvCUR(sv);
7770     return SvPVX(sv);
7771 }
7772
7773 /*
7774 =for apidoc sv_pvutf8n_force
7775
7776 The backend for the C<SvPVutf8x_force> macro. Always use the macro instead.
7777
7778 =cut
7779 */
7780
7781 char *
7782 Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
7783 {
7784     sv_pvn_force(sv,lp);
7785     sv_utf8_upgrade(sv);
7786     *lp = SvCUR(sv);
7787     return SvPVX(sv);
7788 }
7789
7790 /*
7791 =for apidoc sv_reftype
7792
7793 Returns a string describing what the SV is a reference to.
7794
7795 =cut
7796 */
7797
7798 const char *
7799 Perl_sv_reftype(pTHX_ const SV *sv, int ob)
7800 {
7801     /* The fact that I don't need to downcast to char * everywhere, only in ?:
7802        inside return suggests a const propagation bug in g++.  */
7803     if (ob && SvOBJECT(sv)) {
7804         char * const name = HvNAME_get(SvSTASH(sv));
7805         return name ? name : (char *) "__ANON__";
7806     }
7807     else {
7808         switch (SvTYPE(sv)) {
7809         case SVt_NULL:
7810         case SVt_IV:
7811         case SVt_NV:
7812         case SVt_PV:
7813         case SVt_PVIV:
7814         case SVt_PVNV:
7815         case SVt_PVMG:
7816                                 if (SvVOK(sv))
7817                                     return "VSTRING";
7818                                 if (SvROK(sv))
7819                                     return "REF";
7820                                 else
7821                                     return "SCALAR";
7822
7823         case SVt_PVLV:          return (char *)  (SvROK(sv) ? "REF"
7824                                 /* tied lvalues should appear to be
7825                                  * scalars for backwards compatitbility */
7826                                 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
7827                                     ? "SCALAR" : "LVALUE");
7828         case SVt_PVAV:          return "ARRAY";
7829         case SVt_PVHV:          return "HASH";
7830         case SVt_PVCV:          return "CODE";
7831         case SVt_PVGV:          return "GLOB";
7832         case SVt_PVFM:          return "FORMAT";
7833         case SVt_PVIO:          return "IO";
7834         case SVt_BIND:          return "BIND";
7835         case SVt_REGEXP:        return "Regexp"; /* FIXME? to "REGEXP"  */
7836         default:                return "UNKNOWN";
7837         }
7838     }
7839 }
7840
7841 /*
7842 =for apidoc sv_isobject
7843
7844 Returns a boolean indicating whether the SV is an RV pointing to a blessed
7845 object.  If the SV is not an RV, or if the object is not blessed, then this
7846 will return false.
7847
7848 =cut
7849 */
7850
7851 int
7852 Perl_sv_isobject(pTHX_ SV *sv)
7853 {
7854     if (!sv)
7855         return 0;
7856     SvGETMAGIC(sv);
7857     if (!SvROK(sv))
7858         return 0;
7859     sv = (SV*)SvRV(sv);
7860     if (!SvOBJECT(sv))
7861         return 0;
7862     return 1;
7863 }
7864
7865 /*
7866 =for apidoc sv_isa
7867
7868 Returns a boolean indicating whether the SV is blessed into the specified
7869 class.  This does not check for subtypes; use C<sv_derived_from> to verify
7870 an inheritance relationship.
7871
7872 =cut
7873 */
7874
7875 int
7876 Perl_sv_isa(pTHX_ SV *sv, const char *name)
7877 {
7878     const char *hvname;
7879     if (!sv)
7880         return 0;
7881     SvGETMAGIC(sv);
7882     if (!SvROK(sv))
7883         return 0;
7884     sv = (SV*)SvRV(sv);
7885     if (!SvOBJECT(sv))
7886         return 0;
7887     hvname = HvNAME_get(SvSTASH(sv));
7888     if (!hvname)
7889         return 0;
7890
7891     return strEQ(hvname, name);
7892 }
7893
7894 /*
7895 =for apidoc newSVrv
7896
7897 Creates a new SV for the RV, C<rv>, to point to.  If C<rv> is not an RV then
7898 it will be upgraded to one.  If C<classname> is non-null then the new SV will
7899 be blessed in the specified package.  The new SV is returned and its
7900 reference count is 1.
7901
7902 =cut
7903 */
7904
7905 SV*
7906 Perl_newSVrv(pTHX_ SV *rv, const char *classname)
7907 {
7908     dVAR;
7909     SV *sv;
7910
7911     new_SV(sv);
7912
7913     SV_CHECK_THINKFIRST_COW_DROP(rv);
7914     (void)SvAMAGIC_off(rv);
7915
7916     if (SvTYPE(rv) >= SVt_PVMG) {
7917         const U32 refcnt = SvREFCNT(rv);
7918         SvREFCNT(rv) = 0;
7919         sv_clear(rv);
7920         SvFLAGS(rv) = 0;
7921         SvREFCNT(rv) = refcnt;
7922
7923         sv_upgrade(rv, SVt_IV);
7924     } else if (SvROK(rv)) {
7925         SvREFCNT_dec(SvRV(rv));
7926     } else {
7927         prepare_SV_for_RV(rv);
7928     }
7929
7930     SvOK_off(rv);
7931     SvRV_set(rv, sv);
7932     SvROK_on(rv);
7933
7934     if (classname) {
7935         HV* const stash = gv_stashpv(classname, GV_ADD);
7936         (void)sv_bless(rv, stash);
7937     }
7938     return sv;
7939 }
7940
7941 /*
7942 =for apidoc sv_setref_pv
7943
7944 Copies a pointer into a new SV, optionally blessing the SV.  The C<rv>
7945 argument will be upgraded to an RV.  That RV will be modified to point to
7946 the new SV.  If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
7947 into the SV.  The C<classname> argument indicates the package for the
7948 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
7949 will have a reference count of 1, and the RV will be returned.
7950
7951 Do not use with other Perl types such as HV, AV, SV, CV, because those
7952 objects will become corrupted by the pointer copy process.
7953
7954 Note that C<sv_setref_pvn> copies the string while this copies the pointer.
7955
7956 =cut
7957 */
7958
7959 SV*
7960 Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
7961 {
7962     dVAR;
7963     if (!pv) {
7964         sv_setsv(rv, &PL_sv_undef);
7965         SvSETMAGIC(rv);
7966     }
7967     else
7968         sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
7969     return rv;
7970 }
7971
7972 /*
7973 =for apidoc sv_setref_iv
7974
7975 Copies an integer into a new SV, optionally blessing the SV.  The C<rv>
7976 argument will be upgraded to an RV.  That RV will be modified to point to
7977 the new SV.  The C<classname> argument indicates the package for the
7978 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
7979 will have a reference count of 1, and the RV will be returned.
7980
7981 =cut
7982 */
7983
7984 SV*
7985 Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
7986 {
7987     sv_setiv(newSVrv(rv,classname), iv);
7988     return rv;
7989 }
7990
7991 /*
7992 =for apidoc sv_setref_uv
7993
7994 Copies an unsigned integer into a new SV, optionally blessing the SV.  The C<rv>
7995 argument will be upgraded to an RV.  That RV will be modified to point to
7996 the new SV.  The C<classname> argument indicates the package for the
7997 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
7998 will have a reference count of 1, and the RV will be returned.
7999
8000 =cut
8001 */
8002
8003 SV*
8004 Perl_sv_setref_uv(pTHX_ SV *rv, const char *classname, UV uv)
8005 {
8006     sv_setuv(newSVrv(rv,classname), uv);
8007     return rv;
8008 }
8009
8010 /*
8011 =for apidoc sv_setref_nv
8012
8013 Copies a double into a new SV, optionally blessing the SV.  The C<rv>
8014 argument will be upgraded to an RV.  That RV will be modified to point to
8015 the new SV.  The C<classname> argument indicates the package for the
8016 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
8017 will have a reference count of 1, and the RV will be returned.
8018
8019 =cut
8020 */
8021
8022 SV*
8023 Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
8024 {
8025     sv_setnv(newSVrv(rv,classname), nv);
8026     return rv;
8027 }
8028
8029 /*
8030 =for apidoc sv_setref_pvn
8031
8032 Copies a string into a new SV, optionally blessing the SV.  The length of the
8033 string must be specified with C<n>.  The C<rv> argument will be upgraded to
8034 an RV.  That RV will be modified to point to the new SV.  The C<classname>
8035 argument indicates the package for the blessing.  Set C<classname> to
8036 C<NULL> to avoid the blessing.  The new SV will have a reference count
8037 of 1, and the RV will be returned.
8038
8039 Note that C<sv_setref_pv> copies the pointer while this copies the string.
8040
8041 =cut
8042 */
8043
8044 SV*
8045 Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, const char *pv, STRLEN n)
8046 {
8047     sv_setpvn(newSVrv(rv,classname), pv, n);
8048     return rv;
8049 }
8050
8051 /*
8052 =for apidoc sv_bless
8053
8054 Blesses an SV into a specified package.  The SV must be an RV.  The package
8055 must be designated by its stash (see C<gv_stashpv()>).  The reference count
8056 of the SV is unaffected.
8057
8058 =cut
8059 */
8060
8061 SV*
8062 Perl_sv_bless(pTHX_ SV *sv, HV *stash)
8063 {
8064     dVAR;
8065     SV *tmpRef;
8066     if (!SvROK(sv))
8067         Perl_croak(aTHX_ "Can't bless non-reference value");
8068     tmpRef = SvRV(sv);
8069     if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
8070         if (SvIsCOW(tmpRef))
8071             sv_force_normal_flags(tmpRef, 0);
8072         if (SvREADONLY(tmpRef))
8073             Perl_croak(aTHX_ PL_no_modify);
8074         if (SvOBJECT(tmpRef)) {
8075             if (SvTYPE(tmpRef) != SVt_PVIO)
8076                 --PL_sv_objcount;
8077             SvREFCNT_dec(SvSTASH(tmpRef));
8078         }
8079     }
8080     SvOBJECT_on(tmpRef);
8081     if (SvTYPE(tmpRef) != SVt_PVIO)
8082         ++PL_sv_objcount;
8083     SvUPGRADE(tmpRef, SVt_PVMG);
8084     SvSTASH_set(tmpRef, (HV*)SvREFCNT_inc_simple(stash));
8085
8086     if (Gv_AMG(stash))
8087         SvAMAGIC_on(sv);
8088     else
8089         (void)SvAMAGIC_off(sv);
8090
8091     if(SvSMAGICAL(tmpRef))
8092         if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
8093             mg_set(tmpRef);
8094
8095
8096
8097     return sv;
8098 }
8099
8100 /* Downgrades a PVGV to a PVMG.
8101  */
8102
8103 STATIC void
8104 S_sv_unglob(pTHX_ SV *sv)
8105 {
8106     dVAR;
8107     void *xpvmg;
8108     HV *stash;
8109     SV * const temp = sv_newmortal();
8110
8111     assert(SvTYPE(sv) == SVt_PVGV);
8112     SvFAKE_off(sv);
8113     gv_efullname3(temp, (GV *) sv, "*");
8114
8115     if (GvGP(sv)) {
8116         if(GvCVu((GV*)sv) && (stash = GvSTASH((GV*)sv)) && HvNAME_get(stash))
8117             mro_method_changed_in(stash);
8118         gp_free((GV*)sv);
8119     }
8120     if (GvSTASH(sv)) {
8121         sv_del_backref((SV*)GvSTASH(sv), sv);
8122         GvSTASH(sv) = NULL;
8123     }
8124     GvMULTI_off(sv);
8125     if (GvNAME_HEK(sv)) {
8126         unshare_hek(GvNAME_HEK(sv));
8127     }
8128     isGV_with_GP_off(sv);
8129
8130     /* need to keep SvANY(sv) in the right arena */
8131     xpvmg = new_XPVMG();
8132     StructCopy(SvANY(sv), xpvmg, XPVMG);
8133     del_XPVGV(SvANY(sv));
8134     SvANY(sv) = xpvmg;
8135
8136     SvFLAGS(sv) &= ~SVTYPEMASK;
8137     SvFLAGS(sv) |= SVt_PVMG;
8138
8139     /* Intentionally not calling any local SET magic, as this isn't so much a
8140        set operation as merely an internal storage change.  */
8141     sv_setsv_flags(sv, temp, 0);
8142 }
8143
8144 /*
8145 =for apidoc sv_unref_flags
8146
8147 Unsets the RV status of the SV, and decrements the reference count of
8148 whatever was being referenced by the RV.  This can almost be thought of
8149 as a reversal of C<newSVrv>.  The C<cflags> argument can contain
8150 C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
8151 (otherwise the decrementing is conditional on the reference count being
8152 different from one or the reference being a readonly SV).
8153 See C<SvROK_off>.
8154
8155 =cut
8156 */
8157
8158 void
8159 Perl_sv_unref_flags(pTHX_ SV *ref, U32 flags)
8160 {
8161     SV* const target = SvRV(ref);
8162
8163     if (SvWEAKREF(ref)) {
8164         sv_del_backref(target, ref);
8165         SvWEAKREF_off(ref);
8166         SvRV_set(ref, NULL);
8167         return;
8168     }
8169     SvRV_set(ref, NULL);
8170     SvROK_off(ref);
8171     /* You can't have a || SvREADONLY(target) here, as $a = $$a, where $a was
8172        assigned to as BEGIN {$a = \"Foo"} will fail.  */
8173     if (SvREFCNT(target) != 1 || (flags & SV_IMMEDIATE_UNREF))
8174         SvREFCNT_dec(target);
8175     else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
8176         sv_2mortal(target);     /* Schedule for freeing later */
8177 }
8178
8179 /*
8180 =for apidoc sv_untaint
8181
8182 Untaint an SV. Use C<SvTAINTED_off> instead.
8183 =cut
8184 */
8185
8186 void
8187 Perl_sv_untaint(pTHX_ SV *sv)
8188 {
8189     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
8190         MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
8191         if (mg)
8192             mg->mg_len &= ~1;
8193     }
8194 }
8195
8196 /*
8197 =for apidoc sv_tainted
8198
8199 Test an SV for taintedness. Use C<SvTAINTED> instead.
8200 =cut
8201 */
8202
8203 bool
8204 Perl_sv_tainted(pTHX_ SV *sv)
8205 {
8206     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
8207         const MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
8208         if (mg && (mg->mg_len & 1) )
8209             return TRUE;
8210     }
8211     return FALSE;
8212 }
8213
8214 /*
8215 =for apidoc sv_setpviv
8216
8217 Copies an integer into the given SV, also updating its string value.
8218 Does not handle 'set' magic.  See C<sv_setpviv_mg>.
8219
8220 =cut
8221 */
8222
8223 void
8224 Perl_sv_setpviv(pTHX_ SV *sv, IV iv)
8225 {
8226     char buf[TYPE_CHARS(UV)];
8227     char *ebuf;
8228     char * const ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
8229
8230     sv_setpvn(sv, ptr, ebuf - ptr);
8231 }
8232
8233 /*
8234 =for apidoc sv_setpviv_mg
8235
8236 Like C<sv_setpviv>, but also handles 'set' magic.
8237
8238 =cut
8239 */
8240
8241 void
8242 Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv)
8243 {
8244     sv_setpviv(sv, iv);
8245     SvSETMAGIC(sv);
8246 }
8247
8248 #if defined(PERL_IMPLICIT_CONTEXT)
8249
8250 /* pTHX_ magic can't cope with varargs, so this is a no-context
8251  * version of the main function, (which may itself be aliased to us).
8252  * Don't access this version directly.
8253  */
8254
8255 void
8256 Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
8257 {
8258     dTHX;
8259     va_list args;
8260     va_start(args, pat);
8261     sv_vsetpvf(sv, pat, &args);
8262     va_end(args);
8263 }
8264
8265 /* pTHX_ magic can't cope with varargs, so this is a no-context
8266  * version of the main function, (which may itself be aliased to us).
8267  * Don't access this version directly.
8268  */
8269
8270 void
8271 Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
8272 {
8273     dTHX;
8274     va_list args;
8275     va_start(args, pat);
8276     sv_vsetpvf_mg(sv, pat, &args);
8277     va_end(args);
8278 }
8279 #endif
8280
8281 /*
8282 =for apidoc sv_setpvf
8283
8284 Works like C<sv_catpvf> but copies the text into the SV instead of
8285 appending it.  Does not handle 'set' magic.  See C<sv_setpvf_mg>.
8286
8287 =cut
8288 */
8289
8290 void
8291 Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
8292 {
8293     va_list args;
8294     va_start(args, pat);
8295     sv_vsetpvf(sv, pat, &args);
8296     va_end(args);
8297 }
8298
8299 /*
8300 =for apidoc sv_vsetpvf
8301
8302 Works like C<sv_vcatpvf> but copies the text into the SV instead of
8303 appending it.  Does not handle 'set' magic.  See C<sv_vsetpvf_mg>.
8304
8305 Usually used via its frontend C<sv_setpvf>.
8306
8307 =cut
8308 */
8309
8310 void
8311 Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
8312 {
8313     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
8314 }
8315
8316 /*
8317 =for apidoc sv_setpvf_mg
8318
8319 Like C<sv_setpvf>, but also handles 'set' magic.
8320
8321 =cut
8322 */
8323
8324 void
8325 Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
8326 {
8327     va_list args;
8328     va_start(args, pat);
8329     sv_vsetpvf_mg(sv, pat, &args);
8330     va_end(args);
8331 }
8332
8333 /*
8334 =for apidoc sv_vsetpvf_mg
8335
8336 Like C<sv_vsetpvf>, but also handles 'set' magic.
8337
8338 Usually used via its frontend C<sv_setpvf_mg>.
8339
8340 =cut
8341 */
8342
8343 void
8344 Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
8345 {
8346     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
8347     SvSETMAGIC(sv);
8348 }
8349
8350 #if defined(PERL_IMPLICIT_CONTEXT)
8351
8352 /* pTHX_ magic can't cope with varargs, so this is a no-context
8353  * version of the main function, (which may itself be aliased to us).
8354  * Don't access this version directly.
8355  */
8356
8357 void
8358 Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
8359 {
8360     dTHX;
8361     va_list args;
8362     va_start(args, pat);
8363     sv_vcatpvf(sv, pat, &args);
8364     va_end(args);
8365 }
8366
8367 /* pTHX_ magic can't cope with varargs, so this is a no-context
8368  * version of the main function, (which may itself be aliased to us).
8369  * Don't access this version directly.
8370  */
8371
8372 void
8373 Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
8374 {
8375     dTHX;
8376     va_list args;
8377     va_start(args, pat);
8378     sv_vcatpvf_mg(sv, pat, &args);
8379     va_end(args);
8380 }
8381 #endif
8382
8383 /*
8384 =for apidoc sv_catpvf
8385
8386 Processes its arguments like C<sprintf> and appends the formatted
8387 output to an SV.  If the appended data contains "wide" characters
8388 (including, but not limited to, SVs with a UTF-8 PV formatted with %s,
8389 and characters >255 formatted with %c), the original SV might get
8390 upgraded to UTF-8.  Handles 'get' magic, but not 'set' magic.  See
8391 C<sv_catpvf_mg>. If the original SV was UTF-8, the pattern should be
8392 valid UTF-8; if the original SV was bytes, the pattern should be too.
8393
8394 =cut */
8395
8396 void
8397 Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
8398 {
8399     va_list args;
8400     va_start(args, pat);
8401     sv_vcatpvf(sv, pat, &args);
8402     va_end(args);
8403 }
8404
8405 /*
8406 =for apidoc sv_vcatpvf
8407
8408 Processes its arguments like C<vsprintf> and appends the formatted output
8409 to an SV.  Does not handle 'set' magic.  See C<sv_vcatpvf_mg>.
8410
8411 Usually used via its frontend C<sv_catpvf>.
8412
8413 =cut
8414 */
8415
8416 void
8417 Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
8418 {
8419     sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
8420 }
8421
8422 /*
8423 =for apidoc sv_catpvf_mg
8424
8425 Like C<sv_catpvf>, but also handles 'set' magic.
8426
8427 =cut
8428 */
8429
8430 void
8431 Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
8432 {
8433     va_list args;
8434     va_start(args, pat);
8435     sv_vcatpvf_mg(sv, pat, &args);
8436     va_end(args);
8437 }
8438
8439 /*
8440 =for apidoc sv_vcatpvf_mg
8441
8442 Like C<sv_vcatpvf>, but also handles 'set' magic.
8443
8444 Usually used via its frontend C<sv_catpvf_mg>.
8445
8446 =cut
8447 */
8448
8449 void
8450 Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
8451 {
8452     sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
8453     SvSETMAGIC(sv);
8454 }
8455
8456 /*
8457 =for apidoc sv_vsetpvfn
8458
8459 Works like C<sv_vcatpvfn> but copies the text into the SV instead of
8460 appending it.
8461
8462 Usually used via one of its frontends C<sv_vsetpvf> and C<sv_vsetpvf_mg>.
8463
8464 =cut
8465 */
8466
8467 void
8468 Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
8469 {
8470     sv_setpvn(sv, "", 0);
8471     sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
8472 }
8473
8474 STATIC I32
8475 S_expect_number(pTHX_ char** pattern)
8476 {
8477     dVAR;
8478     I32 var = 0;
8479     switch (**pattern) {
8480     case '1': case '2': case '3':
8481     case '4': case '5': case '6':
8482     case '7': case '8': case '9':
8483         var = *(*pattern)++ - '0';
8484         while (isDIGIT(**pattern)) {
8485             const I32 tmp = var * 10 + (*(*pattern)++ - '0');
8486             if (tmp < var)
8487                 Perl_croak(aTHX_ "Integer overflow in format string for %s", (PL_op ? OP_NAME(PL_op) : "sv_vcatpvfn"));
8488             var = tmp;
8489         }
8490     }
8491     return var;
8492 }
8493
8494 STATIC char *
8495 S_F0convert(NV nv, char *endbuf, STRLEN *len)
8496 {
8497     const int neg = nv < 0;
8498     UV uv;
8499
8500     if (neg)
8501         nv = -nv;
8502     if (nv < UV_MAX) {
8503         char *p = endbuf;
8504         nv += 0.5;
8505         uv = (UV)nv;
8506         if (uv & 1 && uv == nv)
8507             uv--;                       /* Round to even */
8508         do {
8509             const unsigned dig = uv % 10;
8510             *--p = '0' + dig;
8511         } while (uv /= 10);
8512         if (neg)
8513             *--p = '-';
8514         *len = endbuf - p;
8515         return p;
8516     }
8517     return NULL;
8518 }
8519
8520
8521 /*
8522 =for apidoc sv_vcatpvfn
8523
8524 Processes its arguments like C<vsprintf> and appends the formatted output
8525 to an SV.  Uses an array of SVs if the C style variable argument list is
8526 missing (NULL).  When running with taint checks enabled, indicates via
8527 C<maybe_tainted> if results are untrustworthy (often due to the use of
8528 locales).
8529
8530 Usually used via one of its frontends C<sv_vcatpvf> and C<sv_vcatpvf_mg>.
8531
8532 =cut
8533 */
8534
8535
8536 #define VECTORIZE_ARGS  vecsv = va_arg(*args, SV*);\
8537                         vecstr = (U8*)SvPV_const(vecsv,veclen);\
8538                         vec_utf8 = DO_UTF8(vecsv);
8539
8540 /* XXX maybe_tainted is never assigned to, so the doc above is lying. */
8541
8542 void
8543 Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
8544 {
8545     dVAR;
8546     char *p;
8547     char *q;
8548     const char *patend;
8549     STRLEN origlen;
8550     I32 svix = 0;
8551     static const char nullstr[] = "(null)";
8552     SV *argsv = NULL;
8553     bool has_utf8 = DO_UTF8(sv);    /* has the result utf8? */
8554     const bool pat_utf8 = has_utf8; /* the pattern is in utf8? */
8555     SV *nsv = NULL;
8556     /* Times 4: a decimal digit takes more than 3 binary digits.
8557      * NV_DIG: mantissa takes than many decimal digits.
8558      * Plus 32: Playing safe. */
8559     char ebuf[IV_DIG * 4 + NV_DIG + 32];
8560     /* large enough for "%#.#f" --chip */
8561     /* what about long double NVs? --jhi */
8562
8563     PERL_UNUSED_ARG(maybe_tainted);
8564
8565     /* no matter what, this is a string now */
8566     (void)SvPV_force(sv, origlen);
8567
8568     /* special-case "", "%s", and "%-p" (SVf - see below) */
8569     if (patlen == 0)
8570         return;
8571     if (patlen == 2 && pat[0] == '%' && pat[1] == 's') {
8572         if (args) {
8573             const char * const s = va_arg(*args, char*);
8574             sv_catpv(sv, s ? s : nullstr);
8575         }
8576         else if (svix < svmax) {
8577             sv_catsv(sv, *svargs);
8578         }
8579         return;
8580     }
8581     if (args && patlen == 3 && pat[0] == '%' &&
8582                 pat[1] == '-' && pat[2] == 'p') {
8583         argsv = (SV*)va_arg(*args, void*);
8584         sv_catsv(sv, argsv);
8585         return;
8586     }
8587
8588 #ifndef USE_LONG_DOUBLE
8589     /* special-case "%.<number>[gf]" */
8590     if ( !args && patlen <= 5 && pat[0] == '%' && pat[1] == '.'
8591          && (pat[patlen-1] == 'g' || pat[patlen-1] == 'f') ) {
8592         unsigned digits = 0;
8593         const char *pp;
8594
8595         pp = pat + 2;
8596         while (*pp >= '0' && *pp <= '9')
8597             digits = 10 * digits + (*pp++ - '0');
8598         if (pp - pat == (int)patlen - 1) {
8599             NV nv;
8600
8601             if (svix < svmax)
8602                 nv = SvNV(*svargs);
8603             else
8604                 return;
8605             if (*pp == 'g') {
8606                 /* Add check for digits != 0 because it seems that some
8607                    gconverts are buggy in this case, and we don't yet have
8608                    a Configure test for this.  */
8609                 if (digits && digits < sizeof(ebuf) - NV_DIG - 10) {
8610                      /* 0, point, slack */
8611                     Gconvert(nv, (int)digits, 0, ebuf);
8612                     sv_catpv(sv, ebuf);
8613                     if (*ebuf)  /* May return an empty string for digits==0 */
8614                         return;
8615                 }
8616             } else if (!digits) {
8617                 STRLEN l;
8618
8619                 if ((p = F0convert(nv, ebuf + sizeof ebuf, &l))) {
8620                     sv_catpvn(sv, p, l);
8621                     return;
8622                 }
8623             }
8624         }
8625     }
8626 #endif /* !USE_LONG_DOUBLE */
8627
8628     if (!args && svix < svmax && DO_UTF8(*svargs))
8629         has_utf8 = TRUE;
8630
8631     patend = (char*)pat + patlen;
8632     for (p = (char*)pat; p < patend; p = q) {
8633         bool alt = FALSE;
8634         bool left = FALSE;
8635         bool vectorize = FALSE;
8636         bool vectorarg = FALSE;
8637         bool vec_utf8 = FALSE;
8638         char fill = ' ';
8639         char plus = 0;
8640         char intsize = 0;
8641         STRLEN width = 0;
8642         STRLEN zeros = 0;
8643         bool has_precis = FALSE;
8644         STRLEN precis = 0;
8645         const I32 osvix = svix;
8646         bool is_utf8 = FALSE;  /* is this item utf8?   */
8647 #ifdef HAS_LDBL_SPRINTF_BUG
8648         /* This is to try to fix a bug with irix/nonstop-ux/powerux and
8649            with sfio - Allen <allens@cpan.org> */
8650         bool fix_ldbl_sprintf_bug = FALSE;
8651 #endif
8652
8653         char esignbuf[4];
8654         U8 utf8buf[UTF8_MAXBYTES+1];
8655         STRLEN esignlen = 0;
8656
8657         const char *eptr = NULL;
8658         STRLEN elen = 0;
8659         SV *vecsv = NULL;
8660         const U8 *vecstr = NULL;
8661         STRLEN veclen = 0;
8662         char c = 0;
8663         int i;
8664         unsigned base = 0;
8665         IV iv = 0;
8666         UV uv = 0;
8667         /* we need a long double target in case HAS_LONG_DOUBLE but
8668            not USE_LONG_DOUBLE
8669         */
8670 #if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
8671         long double nv;
8672 #else
8673         NV nv;
8674 #endif
8675         STRLEN have;
8676         STRLEN need;
8677         STRLEN gap;
8678         const char *dotstr = ".";
8679         STRLEN dotstrlen = 1;
8680         I32 efix = 0; /* explicit format parameter index */
8681         I32 ewix = 0; /* explicit width index */
8682         I32 epix = 0; /* explicit precision index */
8683         I32 evix = 0; /* explicit vector index */
8684         bool asterisk = FALSE;
8685
8686         /* echo everything up to the next format specification */
8687         for (q = p; q < patend && *q != '%'; ++q) ;
8688         if (q > p) {
8689             if (has_utf8 && !pat_utf8)
8690                 sv_catpvn_utf8_upgrade(sv, p, q - p, nsv);
8691             else
8692                 sv_catpvn(sv, p, q - p);
8693             p = q;
8694         }
8695         if (q++ >= patend)
8696             break;
8697
8698 /*
8699     We allow format specification elements in this order:
8700         \d+\$              explicit format parameter index
8701         [-+ 0#]+           flags
8702         v|\*(\d+\$)?v      vector with optional (optionally specified) arg
8703         0                  flag (as above): repeated to allow "v02"     
8704         \d+|\*(\d+\$)?     width using optional (optionally specified) arg
8705         \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
8706         [hlqLV]            size
8707     [%bcdefginopsuxDFOUX] format (mandatory)
8708 */
8709
8710         if (args) {
8711 /*  
8712         As of perl5.9.3, printf format checking is on by default.
8713         Internally, perl uses %p formats to provide an escape to
8714         some extended formatting.  This block deals with those
8715         extensions: if it does not match, (char*)q is reset and
8716         the normal format processing code is used.
8717
8718         Currently defined extensions are:
8719                 %p              include pointer address (standard)      
8720                 %-p     (SVf)   include an SV (previously %_)
8721                 %-<num>p        include an SV with precision <num>      
8722                 %<num>p         reserved for future extensions
8723
8724         Robin Barker 2005-07-14
8725
8726                 %1p     (VDf)   removed.  RMB 2007-10-19
8727 */
8728             char* r = q; 
8729             bool sv = FALSE;    
8730             STRLEN n = 0;
8731             if (*q == '-')
8732                 sv = *q++;
8733             n = expect_number(&q);
8734             if (*q++ == 'p') {
8735                 if (sv) {                       /* SVf */
8736                     if (n) {
8737                         precis = n;
8738                         has_precis = TRUE;
8739                     }
8740                     argsv = (SV*)va_arg(*args, void*);
8741                     eptr = SvPV_const(argsv, elen);
8742                     if (DO_UTF8(argsv))
8743                         is_utf8 = TRUE;
8744                     goto string;
8745                 }
8746                 else if (n) {
8747                     if (ckWARN_d(WARN_INTERNAL))
8748                         Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
8749                         "internal %%<num>p might conflict with future printf extensions");
8750                 }
8751             }
8752             q = r; 
8753         }
8754
8755         if ( (width = expect_number(&q)) ) {
8756             if (*q == '$') {
8757                 ++q;
8758                 efix = width;
8759             } else {
8760                 goto gotwidth;
8761             }
8762         }
8763
8764         /* FLAGS */
8765
8766         while (*q) {
8767             switch (*q) {
8768             case ' ':
8769             case '+':
8770                 if (plus == '+' && *q == ' ') /* '+' over ' ' */
8771                     q++;
8772                 else
8773                     plus = *q++;
8774                 continue;
8775
8776             case '-':
8777                 left = TRUE;
8778                 q++;
8779                 continue;
8780
8781             case '0':
8782                 fill = *q++;
8783                 continue;
8784
8785             case '#':
8786                 alt = TRUE;
8787                 q++;
8788                 continue;
8789
8790             default:
8791                 break;
8792             }
8793             break;
8794         }
8795
8796       tryasterisk:
8797         if (*q == '*') {
8798             q++;
8799             if ( (ewix = expect_number(&q)) )
8800                 if (*q++ != '$')
8801                     goto unknown;
8802             asterisk = TRUE;
8803         }
8804         if (*q == 'v') {
8805             q++;
8806             if (vectorize)
8807                 goto unknown;
8808             if ((vectorarg = asterisk)) {
8809                 evix = ewix;
8810                 ewix = 0;
8811                 asterisk = FALSE;
8812             }
8813             vectorize = TRUE;
8814             goto tryasterisk;
8815         }
8816
8817         if (!asterisk)
8818         {
8819             if( *q == '0' )
8820                 fill = *q++;
8821             width = expect_number(&q);
8822         }
8823
8824         if (vectorize) {
8825             if (vectorarg) {
8826                 if (args)
8827                     vecsv = va_arg(*args, SV*);
8828                 else if (evix) {
8829                     vecsv = (evix > 0 && evix <= svmax)
8830                         ? svargs[evix-1] : &PL_sv_undef;
8831                 } else {
8832                     vecsv = svix < svmax ? svargs[svix++] : &PL_sv_undef;
8833                 }
8834                 dotstr = SvPV_const(vecsv, dotstrlen);
8835                 /* Keep the DO_UTF8 test *after* the SvPV call, else things go
8836                    bad with tied or overloaded values that return UTF8.  */
8837                 if (DO_UTF8(vecsv))
8838                     is_utf8 = TRUE;
8839                 else if (has_utf8) {
8840                     vecsv = sv_mortalcopy(vecsv);
8841                     sv_utf8_upgrade(vecsv);
8842                     dotstr = SvPV_const(vecsv, dotstrlen);
8843                     is_utf8 = TRUE;
8844                 }                   
8845             }
8846             if (args) {
8847                 VECTORIZE_ARGS
8848             }
8849             else if (efix ? (efix > 0 && efix <= svmax) : svix < svmax) {
8850                 vecsv = svargs[efix ? efix-1 : svix++];
8851                 vecstr = (U8*)SvPV_const(vecsv,veclen);
8852                 vec_utf8 = DO_UTF8(vecsv);
8853
8854                 /* if this is a version object, we need to convert
8855                  * back into v-string notation and then let the
8856                  * vectorize happen normally
8857                  */
8858                 if (sv_derived_from(vecsv, "version")) {
8859                     char *version = savesvpv(vecsv);
8860                     if ( hv_exists((HV*)SvRV(vecsv), "alpha", 5 ) ) {
8861                         Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
8862                         "vector argument not supported with alpha versions");
8863                         goto unknown;
8864                     }
8865                     vecsv = sv_newmortal();
8866                     scan_vstring(version, version + veclen, vecsv);
8867                     vecstr = (U8*)SvPV_const(vecsv, veclen);
8868                     vec_utf8 = DO_UTF8(vecsv);
8869                     Safefree(version);
8870                 }
8871             }
8872             else {
8873                 vecstr = (U8*)"";
8874                 veclen = 0;
8875             }
8876         }
8877
8878         if (asterisk) {
8879             if (args)
8880                 i = va_arg(*args, int);
8881             else
8882                 i = (ewix ? ewix <= svmax : svix < svmax) ?
8883                     SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
8884             left |= (i < 0);
8885             width = (i < 0) ? -i : i;
8886         }
8887       gotwidth:
8888
8889         /* PRECISION */
8890
8891         if (*q == '.') {
8892             q++;
8893             if (*q == '*') {
8894                 q++;
8895                 if ( ((epix = expect_number(&q))) && (*q++ != '$') )
8896                     goto unknown;
8897                 /* XXX: todo, support specified precision parameter */
8898                 if (epix)
8899                     goto unknown;
8900                 if (args)
8901                     i = va_arg(*args, int);
8902                 else
8903                     i = (ewix ? ewix <= svmax : svix < svmax)
8904                         ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
8905                 precis = i;
8906                 has_precis = !(i < 0);
8907             }
8908             else {
8909                 precis = 0;
8910                 while (isDIGIT(*q))
8911                     precis = precis * 10 + (*q++ - '0');
8912                 has_precis = TRUE;
8913             }
8914         }
8915
8916         /* SIZE */
8917
8918         switch (*q) {
8919 #ifdef WIN32
8920         case 'I':                       /* Ix, I32x, and I64x */
8921 #  ifdef WIN64
8922             if (q[1] == '6' && q[2] == '4') {
8923                 q += 3;
8924                 intsize = 'q';
8925                 break;
8926             }
8927 #  endif
8928             if (q[1] == '3' && q[2] == '2') {
8929                 q += 3;
8930                 break;
8931             }
8932 #  ifdef WIN64
8933             intsize = 'q';
8934 #  endif
8935             q++;
8936             break;
8937 #endif
8938 #if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
8939         case 'L':                       /* Ld */
8940             /*FALLTHROUGH*/
8941 #ifdef HAS_QUAD
8942         case 'q':                       /* qd */
8943 #endif
8944             intsize = 'q';
8945             q++;
8946             break;
8947 #endif
8948         case 'l':
8949 #if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
8950             if (*(q + 1) == 'l') {      /* lld, llf */
8951                 intsize = 'q';
8952                 q += 2;
8953                 break;
8954              }
8955 #endif
8956             /*FALLTHROUGH*/
8957         case 'h':
8958             /*FALLTHROUGH*/
8959         case 'V':
8960             intsize = *q++;
8961             break;
8962         }
8963
8964         /* CONVERSION */
8965
8966         if (*q == '%') {
8967             eptr = q++;
8968             elen = 1;
8969             if (vectorize) {
8970                 c = '%';
8971                 goto unknown;
8972             }
8973             goto string;
8974         }
8975
8976         if (!vectorize && !args) {
8977             if (efix) {
8978                 const I32 i = efix-1;
8979                 argsv = (i >= 0 && i < svmax) ? svargs[i] : &PL_sv_undef;
8980             } else {
8981                 argsv = (svix >= 0 && svix < svmax)
8982                     ? svargs[svix++] : &PL_sv_undef;
8983             }
8984         }
8985
8986         switch (c = *q++) {
8987
8988             /* STRINGS */
8989
8990         case 'c':
8991             if (vectorize)
8992                 goto unknown;
8993             uv = (args) ? va_arg(*args, int) : SvIV(argsv);
8994             if ((uv > 255 ||
8995                  (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
8996                 && !IN_BYTES) {
8997                 eptr = (char*)utf8buf;
8998                 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
8999                 is_utf8 = TRUE;
9000             }
9001             else {
9002                 c = (char)uv;
9003                 eptr = &c;
9004                 elen = 1;
9005             }
9006             goto string;
9007
9008         case 's':
9009             if (vectorize)
9010                 goto unknown;
9011             if (args) {
9012                 eptr = va_arg(*args, char*);
9013                 if (eptr)
9014 #ifdef MACOS_TRADITIONAL
9015                   /* On MacOS, %#s format is used for Pascal strings */
9016                   if (alt)
9017                     elen = *eptr++;
9018                   else
9019 #endif
9020                     elen = strlen(eptr);
9021                 else {
9022                     eptr = (char *)nullstr;
9023                     elen = sizeof nullstr - 1;
9024                 }
9025             }
9026             else {
9027                 eptr = SvPV_const(argsv, elen);
9028                 if (DO_UTF8(argsv)) {
9029                     I32 old_precis = precis;
9030                     if (has_precis && precis < elen) {
9031                         I32 p = precis;
9032                         sv_pos_u2b(argsv, &p, 0); /* sticks at end */
9033                         precis = p;
9034                     }
9035                     if (width) { /* fudge width (can't fudge elen) */
9036                         if (has_precis && precis < elen)
9037                             width += precis - old_precis;
9038                         else
9039                             width += elen - sv_len_utf8(argsv);
9040                     }
9041                     is_utf8 = TRUE;
9042                 }
9043             }
9044
9045         string:
9046             if (has_precis && elen > precis)
9047                 elen = precis;
9048             break;
9049
9050             /* INTEGERS */
9051
9052         case 'p':
9053             if (alt || vectorize)
9054                 goto unknown;
9055             uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
9056             base = 16;
9057             goto integer;
9058
9059         case 'D':
9060 #ifdef IV_IS_QUAD
9061             intsize = 'q';
9062 #else
9063             intsize = 'l';
9064 #endif
9065             /*FALLTHROUGH*/
9066         case 'd':
9067         case 'i':
9068 #if vdNUMBER
9069         format_vd:
9070 #endif
9071             if (vectorize) {
9072                 STRLEN ulen;
9073                 if (!veclen)
9074                     continue;
9075                 if (vec_utf8)
9076                     uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9077                                         UTF8_ALLOW_ANYUV);
9078                 else {
9079                     uv = *vecstr;
9080                     ulen = 1;
9081                 }
9082                 vecstr += ulen;
9083                 veclen -= ulen;
9084                 if (plus)
9085                      esignbuf[esignlen++] = plus;
9086             }
9087             else if (args) {
9088                 switch (intsize) {
9089                 case 'h':       iv = (short)va_arg(*args, int); break;
9090                 case 'l':       iv = va_arg(*args, long); break;
9091                 case 'V':       iv = va_arg(*args, IV); break;
9092                 default:        iv = va_arg(*args, int); break;
9093 #ifdef HAS_QUAD
9094                 case 'q':       iv = va_arg(*args, Quad_t); break;
9095 #endif
9096                 }
9097             }
9098             else {
9099                 IV tiv = SvIV(argsv); /* work around GCC bug #13488 */
9100                 switch (intsize) {
9101                 case 'h':       iv = (short)tiv; break;
9102                 case 'l':       iv = (long)tiv; break;
9103                 case 'V':
9104                 default:        iv = tiv; break;
9105 #ifdef HAS_QUAD
9106                 case 'q':       iv = (Quad_t)tiv; break;
9107 #endif
9108                 }
9109             }
9110             if ( !vectorize )   /* we already set uv above */
9111             {
9112                 if (iv >= 0) {
9113                     uv = iv;
9114                     if (plus)
9115                         esignbuf[esignlen++] = plus;
9116                 }
9117                 else {
9118                     uv = -iv;
9119                     esignbuf[esignlen++] = '-';
9120                 }
9121             }
9122             base = 10;
9123             goto integer;
9124
9125         case 'U':
9126 #ifdef IV_IS_QUAD
9127             intsize = 'q';
9128 #else
9129             intsize = 'l';
9130 #endif
9131             /*FALLTHROUGH*/
9132         case 'u':
9133             base = 10;
9134             goto uns_integer;
9135
9136         case 'B':
9137         case 'b':
9138             base = 2;
9139             goto uns_integer;
9140
9141         case 'O':
9142 #ifdef IV_IS_QUAD
9143             intsize = 'q';
9144 #else
9145             intsize = 'l';
9146 #endif
9147             /*FALLTHROUGH*/
9148         case 'o':
9149             base = 8;
9150             goto uns_integer;
9151
9152         case 'X':
9153         case 'x':
9154             base = 16;
9155
9156         uns_integer:
9157             if (vectorize) {
9158                 STRLEN ulen;
9159         vector:
9160                 if (!veclen)
9161                     continue;
9162                 if (vec_utf8)
9163                     uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9164                                         UTF8_ALLOW_ANYUV);
9165                 else {
9166                     uv = *vecstr;
9167                     ulen = 1;
9168                 }
9169                 vecstr += ulen;
9170                 veclen -= ulen;
9171             }
9172             else if (args) {
9173                 switch (intsize) {
9174                 case 'h':  uv = (unsigned short)va_arg(*args, unsigned); break;
9175                 case 'l':  uv = va_arg(*args, unsigned long); break;
9176                 case 'V':  uv = va_arg(*args, UV); break;
9177                 default:   uv = va_arg(*args, unsigned); break;
9178 #ifdef HAS_QUAD
9179                 case 'q':  uv = va_arg(*args, Uquad_t); break;
9180 #endif
9181                 }
9182             }
9183             else {
9184                 UV tuv = SvUV(argsv); /* work around GCC bug #13488 */
9185                 switch (intsize) {
9186                 case 'h':       uv = (unsigned short)tuv; break;
9187                 case 'l':       uv = (unsigned long)tuv; break;
9188                 case 'V':
9189                 default:        uv = tuv; break;
9190 #ifdef HAS_QUAD
9191                 case 'q':       uv = (Uquad_t)tuv; break;
9192 #endif
9193                 }
9194             }
9195
9196         integer:
9197             {
9198                 char *ptr = ebuf + sizeof ebuf;
9199                 bool tempalt = uv ? alt : FALSE; /* Vectors can't change alt */
9200                 zeros = 0;
9201
9202                 switch (base) {
9203                     unsigned dig;
9204                 case 16:
9205                     p = (char *)((c == 'X') ? PL_hexdigit + 16 : PL_hexdigit);
9206                     do {
9207                         dig = uv & 15;
9208                         *--ptr = p[dig];
9209                     } while (uv >>= 4);
9210                     if (tempalt) {
9211                         esignbuf[esignlen++] = '0';
9212                         esignbuf[esignlen++] = c;  /* 'x' or 'X' */
9213                     }
9214                     break;
9215                 case 8:
9216                     do {
9217                         dig = uv & 7;
9218                         *--ptr = '0' + dig;
9219                     } while (uv >>= 3);
9220                     if (alt && *ptr != '0')
9221                         *--ptr = '0';
9222                     break;
9223                 case 2:
9224                     do {
9225                         dig = uv & 1;
9226                         *--ptr = '0' + dig;
9227                     } while (uv >>= 1);
9228                     if (tempalt) {
9229                         esignbuf[esignlen++] = '0';
9230                         esignbuf[esignlen++] = c;
9231                     }
9232                     break;
9233                 default:                /* it had better be ten or less */
9234                     do {
9235                         dig = uv % base;
9236                         *--ptr = '0' + dig;
9237                     } while (uv /= base);
9238                     break;
9239                 }
9240                 elen = (ebuf + sizeof ebuf) - ptr;
9241                 eptr = ptr;
9242                 if (has_precis) {
9243                     if (precis > elen)
9244                         zeros = precis - elen;
9245                     else if (precis == 0 && elen == 1 && *eptr == '0'
9246                              && !(base == 8 && alt)) /* "%#.0o" prints "0" */
9247                         elen = 0;
9248
9249                 /* a precision nullifies the 0 flag. */
9250                     if (fill == '0')
9251                         fill = ' ';
9252                 }
9253             }
9254             break;
9255
9256             /* FLOATING POINT */
9257
9258         case 'F':
9259             c = 'f';            /* maybe %F isn't supported here */
9260             /*FALLTHROUGH*/
9261         case 'e': case 'E':
9262         case 'f':
9263         case 'g': case 'G':
9264             if (vectorize)
9265                 goto unknown;
9266
9267             /* This is evil, but floating point is even more evil */
9268
9269             /* for SV-style calling, we can only get NV
9270                for C-style calling, we assume %f is double;
9271                for simplicity we allow any of %Lf, %llf, %qf for long double
9272             */
9273             switch (intsize) {
9274             case 'V':
9275 #if defined(USE_LONG_DOUBLE)
9276                 intsize = 'q';
9277 #endif
9278                 break;
9279 /* [perl #20339] - we should accept and ignore %lf rather than die */
9280             case 'l':
9281                 /*FALLTHROUGH*/
9282             default:
9283 #if defined(USE_LONG_DOUBLE)
9284                 intsize = args ? 0 : 'q';
9285 #endif
9286                 break;
9287             case 'q':
9288 #if defined(HAS_LONG_DOUBLE)
9289                 break;
9290 #else
9291                 /*FALLTHROUGH*/
9292 #endif
9293             case 'h':
9294                 goto unknown;
9295             }
9296
9297             /* now we need (long double) if intsize == 'q', else (double) */
9298             nv = (args) ?
9299 #if LONG_DOUBLESIZE > DOUBLESIZE
9300                 intsize == 'q' ?
9301                     va_arg(*args, long double) :
9302                     va_arg(*args, double)
9303 #else
9304                     va_arg(*args, double)
9305 #endif
9306                 : SvNV(argsv);
9307
9308             need = 0;
9309             /* nv * 0 will be NaN for NaN, +Inf and -Inf, and 0 for anything
9310                else. frexp() has some unspecified behaviour for those three */
9311             if (c != 'e' && c != 'E' && (nv * 0) == 0) {
9312                 i = PERL_INT_MIN;
9313                 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
9314                    will cast our (long double) to (double) */
9315                 (void)Perl_frexp(nv, &i);
9316                 if (i == PERL_INT_MIN)
9317                     Perl_die(aTHX_ "panic: frexp");
9318                 if (i > 0)
9319                     need = BIT_DIGITS(i);
9320             }
9321             need += has_precis ? precis : 6; /* known default */
9322
9323             if (need < width)
9324                 need = width;
9325
9326 #ifdef HAS_LDBL_SPRINTF_BUG
9327             /* This is to try to fix a bug with irix/nonstop-ux/powerux and
9328                with sfio - Allen <allens@cpan.org> */
9329
9330 #  ifdef DBL_MAX
9331 #    define MY_DBL_MAX DBL_MAX
9332 #  else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
9333 #    if DOUBLESIZE >= 8
9334 #      define MY_DBL_MAX 1.7976931348623157E+308L
9335 #    else
9336 #      define MY_DBL_MAX 3.40282347E+38L
9337 #    endif
9338 #  endif
9339
9340 #  ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
9341 #    define MY_DBL_MAX_BUG 1L
9342 #  else
9343 #    define MY_DBL_MAX_BUG MY_DBL_MAX
9344 #  endif
9345
9346 #  ifdef DBL_MIN
9347 #    define MY_DBL_MIN DBL_MIN
9348 #  else  /* XXX guessing! -Allen */
9349 #    if DOUBLESIZE >= 8
9350 #      define MY_DBL_MIN 2.2250738585072014E-308L
9351 #    else
9352 #      define MY_DBL_MIN 1.17549435E-38L
9353 #    endif
9354 #  endif
9355
9356             if ((intsize == 'q') && (c == 'f') &&
9357                 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
9358                 (need < DBL_DIG)) {
9359                 /* it's going to be short enough that
9360                  * long double precision is not needed */
9361
9362                 if ((nv <= 0L) && (nv >= -0L))
9363                     fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
9364                 else {
9365                     /* would use Perl_fp_class as a double-check but not
9366                      * functional on IRIX - see perl.h comments */
9367
9368                     if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
9369                         /* It's within the range that a double can represent */
9370 #if defined(DBL_MAX) && !defined(DBL_MIN)
9371                         if ((nv >= ((long double)1/DBL_MAX)) ||
9372                             (nv <= (-(long double)1/DBL_MAX)))
9373 #endif
9374                         fix_ldbl_sprintf_bug = TRUE;
9375                     }
9376                 }
9377                 if (fix_ldbl_sprintf_bug == TRUE) {
9378                     double temp;
9379
9380                     intsize = 0;
9381                     temp = (double)nv;
9382                     nv = (NV)temp;
9383                 }
9384             }
9385
9386 #  undef MY_DBL_MAX
9387 #  undef MY_DBL_MAX_BUG
9388 #  undef MY_DBL_MIN
9389
9390 #endif /* HAS_LDBL_SPRINTF_BUG */
9391
9392             need += 20; /* fudge factor */
9393             if (PL_efloatsize < need) {
9394                 Safefree(PL_efloatbuf);
9395                 PL_efloatsize = need + 20; /* more fudge */
9396                 Newx(PL_efloatbuf, PL_efloatsize, char);
9397                 PL_efloatbuf[0] = '\0';
9398             }
9399
9400             if ( !(width || left || plus || alt) && fill != '0'
9401                  && has_precis && intsize != 'q' ) {    /* Shortcuts */
9402                 /* See earlier comment about buggy Gconvert when digits,
9403                    aka precis is 0  */
9404                 if ( c == 'g' && precis) {
9405                     Gconvert((NV)nv, (int)precis, 0, PL_efloatbuf);
9406                     /* May return an empty string for digits==0 */
9407                     if (*PL_efloatbuf) {
9408                         elen = strlen(PL_efloatbuf);
9409                         goto float_converted;
9410                     }
9411                 } else if ( c == 'f' && !precis) {
9412                     if ((eptr = F0convert(nv, ebuf + sizeof ebuf, &elen)))
9413                         break;
9414                 }
9415             }
9416             {
9417                 char *ptr = ebuf + sizeof ebuf;
9418                 *--ptr = '\0';
9419                 *--ptr = c;
9420                 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
9421 #if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
9422                 if (intsize == 'q') {
9423                     /* Copy the one or more characters in a long double
9424                      * format before the 'base' ([efgEFG]) character to
9425                      * the format string. */
9426                     static char const prifldbl[] = PERL_PRIfldbl;
9427                     char const *p = prifldbl + sizeof(prifldbl) - 3;
9428                     while (p >= prifldbl) { *--ptr = *p--; }
9429                 }
9430 #endif
9431                 if (has_precis) {
9432                     base = precis;
9433                     do { *--ptr = '0' + (base % 10); } while (base /= 10);
9434                     *--ptr = '.';
9435                 }
9436                 if (width) {
9437                     base = width;
9438                     do { *--ptr = '0' + (base % 10); } while (base /= 10);
9439                 }
9440                 if (fill == '0')
9441                     *--ptr = fill;
9442                 if (left)
9443                     *--ptr = '-';
9444                 if (plus)
9445                     *--ptr = plus;
9446                 if (alt)
9447                     *--ptr = '#';
9448                 *--ptr = '%';
9449
9450                 /* No taint.  Otherwise we are in the strange situation
9451                  * where printf() taints but print($float) doesn't.
9452                  * --jhi */
9453 #if defined(HAS_LONG_DOUBLE)
9454                 elen = ((intsize == 'q')
9455                         ? my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, nv)
9456                         : my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, (double)nv));
9457 #else
9458                 elen = my_sprintf(PL_efloatbuf, ptr, nv);
9459 #endif
9460             }
9461         float_converted:
9462             eptr = PL_efloatbuf;
9463             break;
9464
9465             /* SPECIAL */
9466
9467         case 'n':
9468             if (vectorize)
9469                 goto unknown;
9470             i = SvCUR(sv) - origlen;
9471             if (args) {
9472                 switch (intsize) {
9473                 case 'h':       *(va_arg(*args, short*)) = i; break;
9474                 default:        *(va_arg(*args, int*)) = i; break;
9475                 case 'l':       *(va_arg(*args, long*)) = i; break;
9476                 case 'V':       *(va_arg(*args, IV*)) = i; break;
9477 #ifdef HAS_QUAD
9478                 case 'q':       *(va_arg(*args, Quad_t*)) = i; break;
9479 #endif
9480                 }
9481             }
9482             else
9483                 sv_setuv_mg(argsv, (UV)i);
9484             continue;   /* not "break" */
9485
9486             /* UNKNOWN */
9487
9488         default:
9489       unknown:
9490             if (!args
9491                 && (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)
9492                 && ckWARN(WARN_PRINTF))
9493             {
9494                 SV * const msg = sv_newmortal();
9495                 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
9496                           (PL_op->op_type == OP_PRTF) ? "" : "s");
9497                 if (c) {
9498                     if (isPRINT(c))
9499                         Perl_sv_catpvf(aTHX_ msg,
9500                                        "\"%%%c\"", c & 0xFF);
9501                     else
9502                         Perl_sv_catpvf(aTHX_ msg,
9503                                        "\"%%\\%03"UVof"\"",
9504                                        (UV)c & 0xFF);
9505                 } else
9506                     sv_catpvs(msg, "end of string");
9507                 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, SVfARG(msg)); /* yes, this is reentrant */
9508             }
9509
9510             /* output mangled stuff ... */
9511             if (c == '\0')
9512                 --q;
9513             eptr = p;
9514             elen = q - p;
9515
9516             /* ... right here, because formatting flags should not apply */
9517             SvGROW(sv, SvCUR(sv) + elen + 1);
9518             p = SvEND(sv);
9519             Copy(eptr, p, elen, char);
9520             p += elen;
9521             *p = '\0';
9522             SvCUR_set(sv, p - SvPVX_const(sv));
9523             svix = osvix;
9524             continue;   /* not "break" */
9525         }
9526
9527         if (is_utf8 != has_utf8) {
9528             if (is_utf8) {
9529                 if (SvCUR(sv))
9530                     sv_utf8_upgrade(sv);
9531             }
9532             else {
9533                 const STRLEN old_elen = elen;
9534                 SV * const nsv = newSVpvn_flags(eptr, elen, SVs_TEMP);
9535                 sv_utf8_upgrade(nsv);
9536                 eptr = SvPVX_const(nsv);
9537                 elen = SvCUR(nsv);
9538
9539                 if (width) { /* fudge width (can't fudge elen) */
9540                     width += elen - old_elen;
9541                 }
9542                 is_utf8 = TRUE;
9543             }
9544         }
9545
9546         have = esignlen + zeros + elen;
9547         if (have < zeros)
9548             Perl_croak_nocontext(PL_memory_wrap);
9549
9550         need = (have > width ? have : width);
9551         gap = need - have;
9552
9553         if (need >= (((STRLEN)~0) - SvCUR(sv) - dotstrlen - 1))
9554             Perl_croak_nocontext(PL_memory_wrap);
9555         SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
9556         p = SvEND(sv);
9557         if (esignlen && fill == '0') {
9558             int i;
9559             for (i = 0; i < (int)esignlen; i++)
9560                 *p++ = esignbuf[i];
9561         }
9562         if (gap && !left) {
9563             memset(p, fill, gap);
9564             p += gap;
9565         }
9566         if (esignlen && fill != '0') {
9567             int i;
9568             for (i = 0; i < (int)esignlen; i++)
9569                 *p++ = esignbuf[i];
9570         }
9571         if (zeros) {
9572             int i;
9573             for (i = zeros; i; i--)
9574                 *p++ = '0';
9575         }
9576         if (elen) {
9577             Copy(eptr, p, elen, char);
9578             p += elen;
9579         }
9580         if (gap && left) {
9581             memset(p, ' ', gap);
9582             p += gap;
9583         }
9584         if (vectorize) {
9585             if (veclen) {
9586                 Copy(dotstr, p, dotstrlen, char);
9587                 p += dotstrlen;
9588             }
9589             else
9590                 vectorize = FALSE;              /* done iterating over vecstr */
9591         }
9592         if (is_utf8)
9593             has_utf8 = TRUE;
9594         if (has_utf8)
9595             SvUTF8_on(sv);
9596         *p = '\0';
9597         SvCUR_set(sv, p - SvPVX_const(sv));
9598         if (vectorize) {
9599             esignlen = 0;
9600             goto vector;
9601         }
9602     }
9603 }
9604
9605 /* =========================================================================
9606
9607 =head1 Cloning an interpreter
9608
9609 All the macros and functions in this section are for the private use of
9610 the main function, perl_clone().
9611
9612 The foo_dup() functions make an exact copy of an existing foo thingy.
9613 During the course of a cloning, a hash table is used to map old addresses
9614 to new addresses. The table is created and manipulated with the
9615 ptr_table_* functions.
9616
9617 =cut
9618
9619 ============================================================================*/
9620
9621
9622 #if defined(USE_ITHREADS)
9623
9624 /* XXX Remove this so it doesn't have to go thru the macro and return for nothing */
9625 #ifndef GpREFCNT_inc
9626 #  define GpREFCNT_inc(gp)      ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
9627 #endif
9628
9629
9630 /* Certain cases in Perl_ss_dup have been merged, by relying on the fact
9631    that currently av_dup, gv_dup and hv_dup are the same as sv_dup.
9632    If this changes, please unmerge ss_dup.  */
9633 #define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
9634 #define sv_dup_inc_NN(s,t)      SvREFCNT_inc_NN(sv_dup(s,t))
9635 #define av_dup(s,t)     (AV*)sv_dup((SV*)s,t)
9636 #define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9637 #define hv_dup(s,t)     (HV*)sv_dup((SV*)s,t)
9638 #define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9639 #define cv_dup(s,t)     (CV*)sv_dup((SV*)s,t)
9640 #define cv_dup_inc(s,t) (CV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9641 #define io_dup(s,t)     (IO*)sv_dup((SV*)s,t)
9642 #define io_dup_inc(s,t) (IO*)SvREFCNT_inc(sv_dup((SV*)s,t))
9643 #define gv_dup(s,t)     (GV*)sv_dup((SV*)s,t)
9644 #define gv_dup_inc(s,t) (GV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9645 #define SAVEPV(p)       ((p) ? savepv(p) : NULL)
9646 #define SAVEPVN(p,n)    ((p) ? savepvn(p,n) : NULL)
9647
9648 /* clone a parser */
9649
9650 yy_parser *
9651 Perl_parser_dup(pTHX_ const yy_parser *proto, CLONE_PARAMS* param)
9652 {
9653     yy_parser *parser;
9654
9655     if (!proto)
9656         return NULL;
9657
9658     /* look for it in the table first */
9659     parser = (yy_parser *)ptr_table_fetch(PL_ptr_table, proto);
9660     if (parser)
9661         return parser;
9662
9663     /* create anew and remember what it is */
9664     Newxz(parser, 1, yy_parser);
9665     ptr_table_store(PL_ptr_table, proto, parser);
9666
9667     parser->yyerrstatus = 0;
9668     parser->yychar = YYEMPTY;           /* Cause a token to be read.  */
9669
9670     /* XXX these not yet duped */
9671     parser->old_parser = NULL;
9672     parser->stack = NULL;
9673     parser->ps = NULL;
9674     parser->stack_size = 0;
9675     /* XXX parser->stack->state = 0; */
9676
9677     /* XXX eventually, just Copy() most of the parser struct ? */
9678
9679     parser->lex_brackets = proto->lex_brackets;
9680     parser->lex_casemods = proto->lex_casemods;
9681     parser->lex_brackstack = savepvn(proto->lex_brackstack,
9682                     (proto->lex_brackets < 120 ? 120 : proto->lex_brackets));
9683     parser->lex_casestack = savepvn(proto->lex_casestack,
9684                     (proto->lex_casemods < 12 ? 12 : proto->lex_casemods));
9685     parser->lex_defer   = proto->lex_defer;
9686     parser->lex_dojoin  = proto->lex_dojoin;
9687     parser->lex_expect  = proto->lex_expect;
9688     parser->lex_formbrack = proto->lex_formbrack;
9689     parser->lex_inpat   = proto->lex_inpat;
9690     parser->lex_inwhat  = proto->lex_inwhat;
9691     parser->lex_op      = proto->lex_op;
9692     parser->lex_repl    = sv_dup_inc(proto->lex_repl, param);
9693     parser->lex_starts  = proto->lex_starts;
9694     parser->lex_stuff   = sv_dup_inc(proto->lex_stuff, param);
9695     parser->multi_close = proto->multi_close;
9696     parser->multi_open  = proto->multi_open;
9697     parser->multi_start = proto->multi_start;
9698     parser->multi_end   = proto->multi_end;
9699     parser->pending_ident = proto->pending_ident;
9700     parser->preambled   = proto->preambled;
9701     parser->sublex_info = proto->sublex_info; /* XXX not quite right */
9702     parser->linestr     = sv_dup_inc(proto->linestr, param);
9703     parser->expect      = proto->expect;
9704     parser->copline     = proto->copline;
9705     parser->last_lop_op = proto->last_lop_op;
9706     parser->lex_state   = proto->lex_state;
9707     parser->rsfp        = fp_dup(proto->rsfp, '<', param);
9708     /* rsfp_filters entries have fake IoDIRP() */
9709     parser->rsfp_filters= av_dup_inc(proto->rsfp_filters, param);
9710     parser->in_my       = proto->in_my;
9711     parser->in_my_stash = hv_dup(proto->in_my_stash, param);
9712     parser->error_count = proto->error_count;
9713
9714
9715     parser->linestr     = sv_dup_inc(proto->linestr, param);
9716
9717     {
9718         char * const ols = SvPVX(proto->linestr);
9719         char * const ls  = SvPVX(parser->linestr);
9720
9721         parser->bufptr      = ls + (proto->bufptr >= ols ?
9722                                     proto->bufptr -  ols : 0);
9723         parser->oldbufptr   = ls + (proto->oldbufptr >= ols ?
9724                                     proto->oldbufptr -  ols : 0);
9725         parser->oldoldbufptr= ls + (proto->oldoldbufptr >= ols ?
9726                                     proto->oldoldbufptr -  ols : 0);
9727         parser->linestart   = ls + (proto->linestart >= ols ?
9728                                     proto->linestart -  ols : 0);
9729         parser->last_uni    = ls + (proto->last_uni >= ols ?
9730                                     proto->last_uni -  ols : 0);
9731         parser->last_lop    = ls + (proto->last_lop >= ols ?
9732                                     proto->last_lop -  ols : 0);
9733
9734         parser->bufend      = ls + SvCUR(parser->linestr);
9735     }
9736
9737     Copy(proto->tokenbuf, parser->tokenbuf, 256, char);
9738
9739
9740 #ifdef PERL_MAD
9741     parser->endwhite    = proto->endwhite;
9742     parser->faketokens  = proto->faketokens;
9743     parser->lasttoke    = proto->lasttoke;
9744     parser->nextwhite   = proto->nextwhite;
9745     parser->realtokenstart = proto->realtokenstart;
9746     parser->skipwhite   = proto->skipwhite;
9747     parser->thisclose   = proto->thisclose;
9748     parser->thismad     = proto->thismad;
9749     parser->thisopen    = proto->thisopen;
9750     parser->thisstuff   = proto->thisstuff;
9751     parser->thistoken   = proto->thistoken;
9752     parser->thiswhite   = proto->thiswhite;
9753
9754     Copy(proto->nexttoke, parser->nexttoke, 5, NEXTTOKE);
9755     parser->curforce    = proto->curforce;
9756 #else
9757     Copy(proto->nextval, parser->nextval, 5, YYSTYPE);
9758     Copy(proto->nexttype, parser->nexttype, 5,  I32);
9759     parser->nexttoke    = proto->nexttoke;
9760 #endif
9761     return parser;
9762 }
9763
9764
9765 /* duplicate a file handle */
9766
9767 PerlIO *
9768 Perl_fp_dup(pTHX_ PerlIO *fp, char type, CLONE_PARAMS *param)
9769 {
9770     PerlIO *ret;
9771
9772     PERL_UNUSED_ARG(type);
9773
9774     if (!fp)
9775         return (PerlIO*)NULL;
9776
9777     /* look for it in the table first */
9778     ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
9779     if (ret)
9780         return ret;
9781
9782     /* create anew and remember what it is */
9783     ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
9784     ptr_table_store(PL_ptr_table, fp, ret);
9785     return ret;
9786 }
9787
9788 /* duplicate a directory handle */
9789
9790 DIR *
9791 Perl_dirp_dup(pTHX_ DIR *dp)
9792 {
9793     PERL_UNUSED_CONTEXT;
9794     if (!dp)
9795         return (DIR*)NULL;
9796     /* XXX TODO */
9797     return dp;
9798 }
9799
9800 /* duplicate a typeglob */
9801
9802 GP *
9803 Perl_gp_dup(pTHX_ GP *gp, CLONE_PARAMS* param)
9804 {
9805     GP *ret;
9806
9807     if (!gp)
9808         return (GP*)NULL;
9809     /* look for it in the table first */
9810     ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
9811     if (ret)
9812         return ret;
9813
9814     /* create anew and remember what it is */
9815     Newxz(ret, 1, GP);
9816     ptr_table_store(PL_ptr_table, gp, ret);
9817
9818     /* clone */
9819     ret->gp_refcnt      = 0;                    /* must be before any other dups! */
9820     ret->gp_sv          = sv_dup_inc(gp->gp_sv, param);
9821     ret->gp_io          = io_dup_inc(gp->gp_io, param);
9822     ret->gp_form        = cv_dup_inc(gp->gp_form, param);
9823     ret->gp_av          = av_dup_inc(gp->gp_av, param);
9824     ret->gp_hv          = hv_dup_inc(gp->gp_hv, param);
9825     ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
9826     ret->gp_cv          = cv_dup_inc(gp->gp_cv, param);
9827     ret->gp_cvgen       = gp->gp_cvgen;
9828     ret->gp_line        = gp->gp_line;
9829     ret->gp_file_hek    = hek_dup(gp->gp_file_hek, param);
9830     return ret;
9831 }
9832
9833 /* duplicate a chain of magic */
9834
9835 MAGIC *
9836 Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS* param)
9837 {
9838     MAGIC *mgprev = (MAGIC*)NULL;
9839     MAGIC *mgret;
9840     if (!mg)
9841         return (MAGIC*)NULL;
9842     /* look for it in the table first */
9843     mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
9844     if (mgret)
9845         return mgret;
9846
9847     for (; mg; mg = mg->mg_moremagic) {
9848         MAGIC *nmg;
9849         Newxz(nmg, 1, MAGIC);
9850         if (mgprev)
9851             mgprev->mg_moremagic = nmg;
9852         else
9853             mgret = nmg;
9854         nmg->mg_virtual = mg->mg_virtual;       /* XXX copy dynamic vtable? */
9855         nmg->mg_private = mg->mg_private;
9856         nmg->mg_type    = mg->mg_type;
9857         nmg->mg_flags   = mg->mg_flags;
9858         /* FIXME for plugins
9859         if (mg->mg_type == PERL_MAGIC_qr) {
9860             nmg->mg_obj = (SV*)CALLREGDUPE((REGEXP*)mg->mg_obj, param);
9861         }
9862         else
9863         */
9864         if(mg->mg_type == PERL_MAGIC_backref) {
9865             /* The backref AV has its reference count deliberately bumped by
9866                1.  */
9867             nmg->mg_obj = SvREFCNT_inc(av_dup_inc((AV*) mg->mg_obj, param));
9868         }
9869         else {
9870             nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
9871                               ? sv_dup_inc(mg->mg_obj, param)
9872                               : sv_dup(mg->mg_obj, param);
9873         }
9874         nmg->mg_len     = mg->mg_len;
9875         nmg->mg_ptr     = mg->mg_ptr;   /* XXX random ptr? */
9876         if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
9877             if (mg->mg_len > 0) {
9878                 nmg->mg_ptr     = SAVEPVN(mg->mg_ptr, mg->mg_len);
9879                 if (mg->mg_type == PERL_MAGIC_overload_table &&
9880                         AMT_AMAGIC((AMT*)mg->mg_ptr))
9881                 {
9882                     const AMT * const amtp = (AMT*)mg->mg_ptr;
9883                     AMT * const namtp = (AMT*)nmg->mg_ptr;
9884                     I32 i;
9885                     for (i = 1; i < NofAMmeth; i++) {
9886                         namtp->table[i] = cv_dup_inc(amtp->table[i], param);
9887                     }
9888                 }
9889             }
9890             else if (mg->mg_len == HEf_SVKEY)
9891                 nmg->mg_ptr     = (char*)sv_dup_inc((SV*)mg->mg_ptr, param);
9892         }
9893         if ((mg->mg_flags & MGf_DUP) && mg->mg_virtual && mg->mg_virtual->svt_dup) {
9894             CALL_FPTR(nmg->mg_virtual->svt_dup)(aTHX_ nmg, param);
9895         }
9896         mgprev = nmg;
9897     }
9898     return mgret;
9899 }
9900
9901 #endif /* USE_ITHREADS */
9902
9903 /* create a new pointer-mapping table */
9904
9905 PTR_TBL_t *
9906 Perl_ptr_table_new(pTHX)
9907 {
9908     PTR_TBL_t *tbl;
9909     PERL_UNUSED_CONTEXT;
9910
9911     Newxz(tbl, 1, PTR_TBL_t);
9912     tbl->tbl_max        = 511;
9913     tbl->tbl_items      = 0;
9914     Newxz(tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
9915     return tbl;
9916 }
9917
9918 #define PTR_TABLE_HASH(ptr) \
9919   ((PTR2UV(ptr) >> 3) ^ (PTR2UV(ptr) >> (3 + 7)) ^ (PTR2UV(ptr) >> (3 + 17)))
9920
9921 /* 
9922    we use the PTE_SVSLOT 'reservation' made above, both here (in the
9923    following define) and at call to new_body_inline made below in 
9924    Perl_ptr_table_store()
9925  */
9926
9927 #define del_pte(p)     del_body_type(p, PTE_SVSLOT)
9928
9929 /* map an existing pointer using a table */
9930
9931 STATIC PTR_TBL_ENT_t *
9932 S_ptr_table_find(PTR_TBL_t *tbl, const void *sv) {
9933     PTR_TBL_ENT_t *tblent;
9934     const UV hash = PTR_TABLE_HASH(sv);
9935     assert(tbl);
9936     tblent = tbl->tbl_ary[hash & tbl->tbl_max];
9937     for (; tblent; tblent = tblent->next) {
9938         if (tblent->oldval == sv)
9939             return tblent;
9940     }
9941     return NULL;
9942 }
9943
9944 void *
9945 Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, const void *sv)
9946 {
9947     PTR_TBL_ENT_t const *const tblent = ptr_table_find(tbl, sv);
9948     PERL_UNUSED_CONTEXT;
9949     return tblent ? tblent->newval : NULL;
9950 }
9951
9952 /* add a new entry to a pointer-mapping table */
9953
9954 void
9955 Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, const void *oldsv, void *newsv)
9956 {
9957     PTR_TBL_ENT_t *tblent = ptr_table_find(tbl, oldsv);
9958     PERL_UNUSED_CONTEXT;
9959
9960     if (tblent) {
9961         tblent->newval = newsv;
9962     } else {
9963         const UV entry = PTR_TABLE_HASH(oldsv) & tbl->tbl_max;
9964
9965         new_body_inline(tblent, PTE_SVSLOT);
9966
9967         tblent->oldval = oldsv;
9968         tblent->newval = newsv;
9969         tblent->next = tbl->tbl_ary[entry];
9970         tbl->tbl_ary[entry] = tblent;
9971         tbl->tbl_items++;
9972         if (tblent->next && tbl->tbl_items > tbl->tbl_max)
9973             ptr_table_split(tbl);
9974     }
9975 }
9976
9977 /* double the hash bucket size of an existing ptr table */
9978
9979 void
9980 Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
9981 {
9982     PTR_TBL_ENT_t **ary = tbl->tbl_ary;
9983     const UV oldsize = tbl->tbl_max + 1;
9984     UV newsize = oldsize * 2;
9985     UV i;
9986     PERL_UNUSED_CONTEXT;
9987
9988     Renew(ary, newsize, PTR_TBL_ENT_t*);
9989     Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
9990     tbl->tbl_max = --newsize;
9991     tbl->tbl_ary = ary;
9992     for (i=0; i < oldsize; i++, ary++) {
9993         PTR_TBL_ENT_t **curentp, **entp, *ent;
9994         if (!*ary)
9995             continue;
9996         curentp = ary + oldsize;
9997         for (entp = ary, ent = *ary; ent; ent = *entp) {
9998             if ((newsize & PTR_TABLE_HASH(ent->oldval)) != i) {
9999                 *entp = ent->next;
10000                 ent->next = *curentp;
10001                 *curentp = ent;
10002                 continue;
10003             }
10004             else
10005                 entp = &ent->next;
10006         }
10007     }
10008 }
10009
10010 /* remove all the entries from a ptr table */
10011
10012 void
10013 Perl_ptr_table_clear(pTHX_ PTR_TBL_t *tbl)
10014 {
10015     if (tbl && tbl->tbl_items) {
10016         register PTR_TBL_ENT_t * const * const array = tbl->tbl_ary;
10017         UV riter = tbl->tbl_max;
10018
10019         do {
10020             PTR_TBL_ENT_t *entry = array[riter];
10021
10022             while (entry) {
10023                 PTR_TBL_ENT_t * const oentry = entry;
10024                 entry = entry->next;
10025                 del_pte(oentry);
10026             }
10027         } while (riter--);
10028
10029         tbl->tbl_items = 0;
10030     }
10031 }
10032
10033 /* clear and free a ptr table */
10034
10035 void
10036 Perl_ptr_table_free(pTHX_ PTR_TBL_t *tbl)
10037 {
10038     if (!tbl) {
10039         return;
10040     }
10041     ptr_table_clear(tbl);
10042     Safefree(tbl->tbl_ary);
10043     Safefree(tbl);
10044 }
10045
10046 #if defined(USE_ITHREADS)
10047
10048 void
10049 Perl_rvpv_dup(pTHX_ SV *dstr, const SV *sstr, CLONE_PARAMS* param)
10050 {
10051     if (SvROK(sstr)) {
10052         SvRV_set(dstr, SvWEAKREF(sstr)
10053                        ? sv_dup(SvRV(sstr), param)
10054                        : sv_dup_inc(SvRV(sstr), param));
10055
10056     }
10057     else if (SvPVX_const(sstr)) {
10058         /* Has something there */
10059         if (SvLEN(sstr)) {
10060             /* Normal PV - clone whole allocated space */
10061             SvPV_set(dstr, SAVEPVN(SvPVX_const(sstr), SvLEN(sstr)-1));
10062             if (SvREADONLY(sstr) && SvFAKE(sstr)) {
10063                 /* Not that normal - actually sstr is copy on write.
10064                    But we are a true, independant SV, so:  */
10065                 SvREADONLY_off(dstr);
10066                 SvFAKE_off(dstr);
10067             }
10068         }
10069         else {
10070             /* Special case - not normally malloced for some reason */
10071             if (isGV_with_GP(sstr)) {
10072                 /* Don't need to do anything here.  */
10073             }
10074             else if ((SvREADONLY(sstr) && SvFAKE(sstr))) {
10075                 /* A "shared" PV - clone it as "shared" PV */
10076                 SvPV_set(dstr,
10077                          HEK_KEY(hek_dup(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)),
10078                                          param)));
10079             }
10080             else {
10081                 /* Some other special case - random pointer */
10082                 SvPV_set(dstr, SvPVX(sstr));            
10083             }
10084         }
10085     }
10086     else {
10087         /* Copy the NULL */
10088         SvPV_set(dstr, NULL);
10089     }
10090 }
10091
10092 /* duplicate an SV of any type (including AV, HV etc) */
10093
10094 SV *
10095 Perl_sv_dup(pTHX_ const SV *sstr, CLONE_PARAMS* param)
10096 {
10097     dVAR;
10098     SV *dstr;
10099
10100     if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
10101         return NULL;
10102     /* look for it in the table first */
10103     dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
10104     if (dstr)
10105         return dstr;
10106
10107     if(param->flags & CLONEf_JOIN_IN) {
10108         /** We are joining here so we don't want do clone
10109             something that is bad **/
10110         if (SvTYPE(sstr) == SVt_PVHV) {
10111             const HEK * const hvname = HvNAME_HEK(sstr);
10112             if (hvname)
10113                 /** don't clone stashes if they already exist **/
10114                 return (SV*)gv_stashpvn(HEK_KEY(hvname), HEK_LEN(hvname), 0);
10115         }
10116     }
10117
10118     /* create anew and remember what it is */
10119     new_SV(dstr);
10120
10121 #ifdef DEBUG_LEAKING_SCALARS
10122     dstr->sv_debug_optype = sstr->sv_debug_optype;
10123     dstr->sv_debug_line = sstr->sv_debug_line;
10124     dstr->sv_debug_inpad = sstr->sv_debug_inpad;
10125     dstr->sv_debug_cloned = 1;
10126     dstr->sv_debug_file = savepv(sstr->sv_debug_file);
10127 #endif
10128
10129     ptr_table_store(PL_ptr_table, sstr, dstr);
10130
10131     /* clone */
10132     SvFLAGS(dstr)       = SvFLAGS(sstr);
10133     SvFLAGS(dstr)       &= ~SVf_OOK;            /* don't propagate OOK hack */
10134     SvREFCNT(dstr)      = 0;                    /* must be before any other dups! */
10135
10136 #ifdef DEBUGGING
10137     if (SvANY(sstr) && PL_watch_pvx && SvPVX_const(sstr) == PL_watch_pvx)
10138         PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
10139                       (void*)PL_watch_pvx, SvPVX_const(sstr));
10140 #endif
10141
10142     /* don't clone objects whose class has asked us not to */
10143     if (SvOBJECT(sstr) && ! (SvFLAGS(SvSTASH(sstr)) & SVphv_CLONEABLE)) {
10144         SvFLAGS(dstr) = 0;
10145         return dstr;
10146     }
10147
10148     switch (SvTYPE(sstr)) {
10149     case SVt_NULL:
10150         SvANY(dstr)     = NULL;
10151         break;
10152     case SVt_IV:
10153         SvANY(dstr)     = (XPVIV*)((char*)&(dstr->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
10154         if(SvROK(sstr)) {
10155             Perl_rvpv_dup(aTHX_ dstr, sstr, param);
10156         } else {
10157             SvIV_set(dstr, SvIVX(sstr));
10158         }
10159         break;
10160     case SVt_NV:
10161         SvANY(dstr)     = new_XNV();
10162         SvNV_set(dstr, SvNVX(sstr));
10163         break;
10164         /* case SVt_BIND: */
10165     default:
10166         {
10167             /* These are all the types that need complex bodies allocating.  */
10168             void *new_body;
10169             const svtype sv_type = SvTYPE(sstr);
10170             const struct body_details *const sv_type_details
10171                 = bodies_by_type + sv_type;
10172
10173             switch (sv_type) {
10174             default:
10175                 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
10176                 break;
10177
10178             case SVt_PVGV:
10179                 if (GvUNIQUE((GV*)sstr)) {
10180                     NOOP;   /* Do sharing here, and fall through */
10181                 }
10182             case SVt_PVIO:
10183             case SVt_PVFM:
10184             case SVt_PVHV:
10185             case SVt_PVAV:
10186             case SVt_PVCV:
10187             case SVt_PVLV:
10188             case SVt_REGEXP:
10189             case SVt_PVMG:
10190             case SVt_PVNV:
10191             case SVt_PVIV:
10192             case SVt_PV:
10193                 assert(sv_type_details->body_size);
10194                 if (sv_type_details->arena) {
10195                     new_body_inline(new_body, sv_type);
10196                     new_body
10197                         = (void*)((char*)new_body - sv_type_details->offset);
10198                 } else {
10199                     new_body = new_NOARENA(sv_type_details);
10200                 }
10201             }
10202             assert(new_body);
10203             SvANY(dstr) = new_body;
10204
10205 #ifndef PURIFY
10206             Copy(((char*)SvANY(sstr)) + sv_type_details->offset,
10207                  ((char*)SvANY(dstr)) + sv_type_details->offset,
10208                  sv_type_details->copy, char);
10209 #else
10210             Copy(((char*)SvANY(sstr)),
10211                  ((char*)SvANY(dstr)),
10212                  sv_type_details->body_size + sv_type_details->offset, char);
10213 #endif
10214
10215             if (sv_type != SVt_PVAV && sv_type != SVt_PVHV
10216                 && !isGV_with_GP(dstr))
10217                 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
10218
10219             /* The Copy above means that all the source (unduplicated) pointers
10220                are now in the destination.  We can check the flags and the
10221                pointers in either, but it's possible that there's less cache
10222                missing by always going for the destination.
10223                FIXME - instrument and check that assumption  */
10224             if (sv_type >= SVt_PVMG) {
10225                 if ((sv_type == SVt_PVMG) && SvPAD_OUR(dstr)) {
10226                     SvOURSTASH_set(dstr, hv_dup_inc(SvOURSTASH(dstr), param));
10227                 } else if (SvMAGIC(dstr))
10228                     SvMAGIC_set(dstr, mg_dup(SvMAGIC(dstr), param));
10229                 if (SvSTASH(dstr))
10230                     SvSTASH_set(dstr, hv_dup_inc(SvSTASH(dstr), param));
10231             }
10232
10233             /* The cast silences a GCC warning about unhandled types.  */
10234             switch ((int)sv_type) {
10235             case SVt_PV:
10236                 break;
10237             case SVt_PVIV:
10238                 break;
10239             case SVt_PVNV:
10240                 break;
10241             case SVt_PVMG:
10242                 break;
10243             case SVt_REGEXP:
10244                 /* FIXME for plugins */
10245                 re_dup_guts(sstr, dstr, param);
10246                 break;
10247             case SVt_PVLV:
10248                 /* XXX LvTARGOFF sometimes holds PMOP* when DEBUGGING */
10249                 if (LvTYPE(dstr) == 't') /* for tie: unrefcnted fake (SV**) */
10250                     LvTARG(dstr) = dstr;
10251                 else if (LvTYPE(dstr) == 'T') /* for tie: fake HE */
10252                     LvTARG(dstr) = (SV*)he_dup((HE*)LvTARG(dstr), 0, param);
10253                 else
10254                     LvTARG(dstr) = sv_dup_inc(LvTARG(dstr), param);
10255             case SVt_PVGV:
10256                 if(isGV_with_GP(sstr)) {
10257                     if (GvNAME_HEK(dstr))
10258                         GvNAME_HEK(dstr) = hek_dup(GvNAME_HEK(dstr), param);
10259                     /* Don't call sv_add_backref here as it's going to be
10260                        created as part of the magic cloning of the symbol
10261                        table.  */
10262                     /* Danger Will Robinson - GvGP(dstr) isn't initialised
10263                        at the point of this comment.  */
10264                     GvSTASH(dstr) = hv_dup(GvSTASH(dstr), param);
10265                     GvGP(dstr)  = gp_dup(GvGP(sstr), param);
10266                     (void)GpREFCNT_inc(GvGP(dstr));
10267                 } else
10268                     Perl_rvpv_dup(aTHX_ dstr, sstr, param);
10269                 break;
10270             case SVt_PVIO:
10271                 IoIFP(dstr)     = fp_dup(IoIFP(dstr), IoTYPE(dstr), param);
10272                 if (IoOFP(dstr) == IoIFP(sstr))
10273                     IoOFP(dstr) = IoIFP(dstr);
10274                 else
10275                     IoOFP(dstr) = fp_dup(IoOFP(dstr), IoTYPE(dstr), param);
10276                 /* PL_parser->rsfp_filters entries have fake IoDIRP() */
10277                 if(IoFLAGS(dstr) & IOf_FAKE_DIRP) {
10278                     /* I have no idea why fake dirp (rsfps)
10279                        should be treated differently but otherwise
10280                        we end up with leaks -- sky*/
10281                     IoTOP_GV(dstr)      = gv_dup_inc(IoTOP_GV(dstr), param);
10282                     IoFMT_GV(dstr)      = gv_dup_inc(IoFMT_GV(dstr), param);
10283                     IoBOTTOM_GV(dstr)   = gv_dup_inc(IoBOTTOM_GV(dstr), param);
10284                 } else {
10285                     IoTOP_GV(dstr)      = gv_dup(IoTOP_GV(dstr), param);
10286                     IoFMT_GV(dstr)      = gv_dup(IoFMT_GV(dstr), param);
10287                     IoBOTTOM_GV(dstr)   = gv_dup(IoBOTTOM_GV(dstr), param);
10288                     if (IoDIRP(dstr)) {
10289                         IoDIRP(dstr)    = dirp_dup(IoDIRP(dstr));
10290                     } else {
10291                         NOOP;
10292                         /* IoDIRP(dstr) is already a copy of IoDIRP(sstr)  */
10293                     }
10294                 }
10295                 IoTOP_NAME(dstr)        = SAVEPV(IoTOP_NAME(dstr));
10296                 IoFMT_NAME(dstr)        = SAVEPV(IoFMT_NAME(dstr));
10297                 IoBOTTOM_NAME(dstr)     = SAVEPV(IoBOTTOM_NAME(dstr));
10298                 break;
10299             case SVt_PVAV:
10300                 if (AvARRAY((AV*)sstr)) {
10301                     SV **dst_ary, **src_ary;
10302                     SSize_t items = AvFILLp((AV*)sstr) + 1;
10303
10304                     src_ary = AvARRAY((AV*)sstr);
10305                     Newxz(dst_ary, AvMAX((AV*)sstr)+1, SV*);
10306                     ptr_table_store(PL_ptr_table, src_ary, dst_ary);
10307                     AvARRAY((AV*)dstr) = dst_ary;
10308                     AvALLOC((AV*)dstr) = dst_ary;
10309                     if (AvREAL((AV*)sstr)) {
10310                         while (items-- > 0)
10311                             *dst_ary++ = sv_dup_inc(*src_ary++, param);
10312                     }
10313                     else {
10314                         while (items-- > 0)
10315                             *dst_ary++ = sv_dup(*src_ary++, param);
10316                     }
10317                     items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
10318                     while (items-- > 0) {
10319                         *dst_ary++ = &PL_sv_undef;
10320                     }
10321                 }
10322                 else {
10323                     AvARRAY((AV*)dstr)  = NULL;
10324                     AvALLOC((AV*)dstr)  = (SV**)NULL;
10325                 }
10326                 break;
10327             case SVt_PVHV:
10328                 if (HvARRAY((HV*)sstr)) {
10329                     STRLEN i = 0;
10330                     const bool sharekeys = !!HvSHAREKEYS(sstr);
10331                     XPVHV * const dxhv = (XPVHV*)SvANY(dstr);
10332                     XPVHV * const sxhv = (XPVHV*)SvANY(sstr);
10333                     char *darray;
10334                     Newx(darray, PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1)
10335                         + (SvOOK(sstr) ? sizeof(struct xpvhv_aux) : 0),
10336                         char);
10337                     HvARRAY(dstr) = (HE**)darray;
10338                     while (i <= sxhv->xhv_max) {
10339                         const HE * const source = HvARRAY(sstr)[i];
10340                         HvARRAY(dstr)[i] = source
10341                             ? he_dup(source, sharekeys, param) : 0;
10342                         ++i;
10343                     }
10344                     if (SvOOK(sstr)) {
10345                         HEK *hvname;
10346                         const struct xpvhv_aux * const saux = HvAUX(sstr);
10347                         struct xpvhv_aux * const daux = HvAUX(dstr);
10348                         /* This flag isn't copied.  */
10349                         /* SvOOK_on(hv) attacks the IV flags.  */
10350                         SvFLAGS(dstr) |= SVf_OOK;
10351
10352                         hvname = saux->xhv_name;
10353                         daux->xhv_name = hvname ? hek_dup(hvname, param) : hvname;
10354
10355                         daux->xhv_riter = saux->xhv_riter;
10356                         daux->xhv_eiter = saux->xhv_eiter
10357                             ? he_dup(saux->xhv_eiter,
10358                                         (bool)!!HvSHAREKEYS(sstr), param) : 0;
10359                         daux->xhv_backreferences =
10360                             saux->xhv_backreferences
10361                                 ? (AV*) SvREFCNT_inc(
10362                                         sv_dup((SV*)saux->xhv_backreferences, param))
10363                                 : 0;
10364
10365                         daux->xhv_mro_meta = saux->xhv_mro_meta
10366                             ? mro_meta_dup(saux->xhv_mro_meta, param)
10367                             : 0;
10368
10369                         /* Record stashes for possible cloning in Perl_clone(). */
10370                         if (hvname)
10371                             av_push(param->stashes, dstr);
10372                     }
10373                 }
10374                 else
10375                     HvARRAY((HV*)dstr) = NULL;
10376                 break;
10377             case SVt_PVCV:
10378                 if (!(param->flags & CLONEf_COPY_STACKS)) {
10379                     CvDEPTH(dstr) = 0;
10380                 }
10381             case SVt_PVFM:
10382                 /* NOTE: not refcounted */
10383                 CvSTASH(dstr)   = hv_dup(CvSTASH(dstr), param);
10384                 OP_REFCNT_LOCK;
10385                 if (!CvISXSUB(dstr))
10386                     CvROOT(dstr) = OpREFCNT_inc(CvROOT(dstr));
10387                 OP_REFCNT_UNLOCK;
10388                 if (CvCONST(dstr) && CvISXSUB(dstr)) {
10389                     CvXSUBANY(dstr).any_ptr = GvUNIQUE(CvGV(dstr)) ?
10390                         SvREFCNT_inc(CvXSUBANY(dstr).any_ptr) :
10391                         sv_dup_inc((SV *)CvXSUBANY(dstr).any_ptr, param);
10392                 }
10393                 /* don't dup if copying back - CvGV isn't refcounted, so the
10394                  * duped GV may never be freed. A bit of a hack! DAPM */
10395                 CvGV(dstr)      = (param->flags & CLONEf_JOIN_IN) ?
10396                     NULL : gv_dup(CvGV(dstr), param) ;
10397                 PAD_DUP(CvPADLIST(dstr), CvPADLIST(sstr), param);
10398                 CvOUTSIDE(dstr) =
10399                     CvWEAKOUTSIDE(sstr)
10400                     ? cv_dup(    CvOUTSIDE(dstr), param)
10401                     : cv_dup_inc(CvOUTSIDE(dstr), param);
10402                 if (!CvISXSUB(dstr))
10403                     CvFILE(dstr) = SAVEPV(CvFILE(dstr));
10404                 break;
10405             }
10406         }
10407     }
10408
10409     if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
10410         ++PL_sv_objcount;
10411
10412     return dstr;
10413  }
10414
10415 /* duplicate a context */
10416
10417 PERL_CONTEXT *
10418 Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
10419 {
10420     PERL_CONTEXT *ncxs;
10421
10422     if (!cxs)
10423         return (PERL_CONTEXT*)NULL;
10424
10425     /* look for it in the table first */
10426     ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
10427     if (ncxs)
10428         return ncxs;
10429
10430     /* create anew and remember what it is */
10431     Newxz(ncxs, max + 1, PERL_CONTEXT);
10432     ptr_table_store(PL_ptr_table, cxs, ncxs);
10433
10434     while (ix >= 0) {
10435         PERL_CONTEXT * const cx = &cxs[ix];
10436         PERL_CONTEXT * const ncx = &ncxs[ix];
10437         ncx->cx_type    = cx->cx_type;
10438         if (CxTYPE(cx) == CXt_SUBST) {
10439             Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
10440         }
10441         else {
10442             ncx->blk_oldsp      = cx->blk_oldsp;
10443             ncx->blk_oldcop     = cx->blk_oldcop;
10444             ncx->blk_oldmarksp  = cx->blk_oldmarksp;
10445             ncx->blk_oldscopesp = cx->blk_oldscopesp;
10446             ncx->blk_oldpm      = cx->blk_oldpm;
10447             ncx->blk_gimme      = cx->blk_gimme;
10448             switch (CxTYPE(cx)) {
10449             case CXt_SUB:
10450                 ncx->blk_sub.cv         = (cx->blk_sub.olddepth == 0
10451                                            ? cv_dup_inc(cx->blk_sub.cv, param)
10452                                            : cv_dup(cx->blk_sub.cv,param));
10453                 ncx->blk_sub.argarray   = (cx->blk_sub.hasargs
10454                                            ? av_dup_inc(cx->blk_sub.argarray, param)
10455                                            : NULL);
10456                 ncx->blk_sub.savearray  = av_dup_inc(cx->blk_sub.savearray, param);
10457                 ncx->blk_sub.olddepth   = cx->blk_sub.olddepth;
10458                 ncx->blk_sub.hasargs    = cx->blk_sub.hasargs;
10459                 ncx->blk_sub.lval       = cx->blk_sub.lval;
10460                 ncx->blk_sub.retop      = cx->blk_sub.retop;
10461                 ncx->blk_sub.oldcomppad = (PAD*)ptr_table_fetch(PL_ptr_table,
10462                                            cx->blk_sub.oldcomppad);
10463                 break;
10464             case CXt_EVAL:
10465                 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
10466                 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
10467                 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv, param);
10468                 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
10469                 ncx->blk_eval.cur_text  = sv_dup(cx->blk_eval.cur_text, param);
10470                 ncx->blk_eval.retop = cx->blk_eval.retop;
10471                 break;
10472             case CXt_LOOP:
10473                 ncx->blk_loop.label     = cx->blk_loop.label;
10474                 ncx->blk_loop.resetsp   = cx->blk_loop.resetsp;
10475                 ncx->blk_loop.my_op     = cx->blk_loop.my_op;
10476                 ncx->blk_loop.iterdata  = (CxPADLOOP(cx)
10477                                            ? cx->blk_loop.iterdata
10478                                            : gv_dup((GV*)cx->blk_loop.iterdata, param));
10479                 ncx->blk_loop.oldcomppad
10480                     = (PAD*)ptr_table_fetch(PL_ptr_table,
10481                                             cx->blk_loop.oldcomppad);
10482                 ncx->blk_loop.itersave  = sv_dup_inc(cx->blk_loop.itersave, param);
10483                 ncx->blk_loop.iterlval  = sv_dup_inc(cx->blk_loop.iterlval, param);
10484                 ncx->blk_loop.iterary   = av_dup_inc(cx->blk_loop.iterary, param);
10485                 ncx->blk_loop.iterix    = cx->blk_loop.iterix;
10486                 ncx->blk_loop.itermax   = cx->blk_loop.itermax;
10487                 break;
10488             case CXt_FORMAT:
10489                 ncx->blk_sub.cv         = cv_dup(cx->blk_sub.cv, param);
10490                 ncx->blk_sub.gv         = gv_dup(cx->blk_sub.gv, param);
10491                 ncx->blk_sub.dfoutgv    = gv_dup_inc(cx->blk_sub.dfoutgv, param);
10492                 ncx->blk_sub.hasargs    = cx->blk_sub.hasargs;
10493                 ncx->blk_sub.retop      = cx->blk_sub.retop;
10494                 break;
10495             case CXt_BLOCK:
10496             case CXt_NULL:
10497                 break;
10498             }
10499         }
10500         --ix;
10501     }
10502     return ncxs;
10503 }
10504
10505 /* duplicate a stack info structure */
10506
10507 PERL_SI *
10508 Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
10509 {
10510     PERL_SI *nsi;
10511
10512     if (!si)
10513         return (PERL_SI*)NULL;
10514
10515     /* look for it in the table first */
10516     nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
10517     if (nsi)
10518         return nsi;
10519
10520     /* create anew and remember what it is */
10521     Newxz(nsi, 1, PERL_SI);
10522     ptr_table_store(PL_ptr_table, si, nsi);
10523
10524     nsi->si_stack       = av_dup_inc(si->si_stack, param);
10525     nsi->si_cxix        = si->si_cxix;
10526     nsi->si_cxmax       = si->si_cxmax;
10527     nsi->si_cxstack     = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
10528     nsi->si_type        = si->si_type;
10529     nsi->si_prev        = si_dup(si->si_prev, param);
10530     nsi->si_next        = si_dup(si->si_next, param);
10531     nsi->si_markoff     = si->si_markoff;
10532
10533     return nsi;
10534 }
10535
10536 #define POPINT(ss,ix)   ((ss)[--(ix)].any_i32)
10537 #define TOPINT(ss,ix)   ((ss)[ix].any_i32)
10538 #define POPLONG(ss,ix)  ((ss)[--(ix)].any_long)
10539 #define TOPLONG(ss,ix)  ((ss)[ix].any_long)
10540 #define POPIV(ss,ix)    ((ss)[--(ix)].any_iv)
10541 #define TOPIV(ss,ix)    ((ss)[ix].any_iv)
10542 #define POPBOOL(ss,ix)  ((ss)[--(ix)].any_bool)
10543 #define TOPBOOL(ss,ix)  ((ss)[ix].any_bool)
10544 #define POPPTR(ss,ix)   ((ss)[--(ix)].any_ptr)
10545 #define TOPPTR(ss,ix)   ((ss)[ix].any_ptr)
10546 #define POPDPTR(ss,ix)  ((ss)[--(ix)].any_dptr)
10547 #define TOPDPTR(ss,ix)  ((ss)[ix].any_dptr)
10548 #define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
10549 #define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
10550
10551 /* XXXXX todo */
10552 #define pv_dup_inc(p)   SAVEPV(p)
10553 #define pv_dup(p)       SAVEPV(p)
10554 #define svp_dup_inc(p,pp)       any_dup(p,pp)
10555
10556 /* map any object to the new equivent - either something in the
10557  * ptr table, or something in the interpreter structure
10558  */
10559
10560 void *
10561 Perl_any_dup(pTHX_ void *v, const PerlInterpreter *proto_perl)
10562 {
10563     void *ret;
10564
10565     if (!v)
10566         return (void*)NULL;
10567
10568     /* look for it in the table first */
10569     ret = ptr_table_fetch(PL_ptr_table, v);
10570     if (ret)
10571         return ret;
10572
10573     /* see if it is part of the interpreter structure */
10574     if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
10575         ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
10576     else {
10577         ret = v;
10578     }
10579
10580     return ret;
10581 }
10582
10583 /* duplicate the save stack */
10584
10585 ANY *
10586 Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
10587 {
10588     dVAR;
10589     ANY * const ss      = proto_perl->Isavestack;
10590     const I32 max       = proto_perl->Isavestack_max;
10591     I32 ix              = proto_perl->Isavestack_ix;
10592     ANY *nss;
10593     SV *sv;
10594     GV *gv;
10595     AV *av;
10596     HV *hv;
10597     void* ptr;
10598     int intval;
10599     long longval;
10600     GP *gp;
10601     IV iv;
10602     I32 i;
10603     char *c = NULL;
10604     void (*dptr) (void*);
10605     void (*dxptr) (pTHX_ void*);
10606
10607     Newxz(nss, max, ANY);
10608
10609     while (ix > 0) {
10610         const I32 type = POPINT(ss,ix);
10611         TOPINT(nss,ix) = type;
10612         switch (type) {
10613         case SAVEt_HELEM:               /* hash element */
10614             sv = (SV*)POPPTR(ss,ix);
10615             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
10616             /* fall through */
10617         case SAVEt_ITEM:                        /* normal string */
10618         case SAVEt_SV:                          /* scalar reference */
10619             sv = (SV*)POPPTR(ss,ix);
10620             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
10621             /* fall through */
10622         case SAVEt_FREESV:
10623         case SAVEt_MORTALIZESV:
10624             sv = (SV*)POPPTR(ss,ix);
10625             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
10626             break;
10627         case SAVEt_SHARED_PVREF:                /* char* in shared space */
10628             c = (char*)POPPTR(ss,ix);
10629             TOPPTR(nss,ix) = savesharedpv(c);
10630             ptr = POPPTR(ss,ix);
10631             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10632             break;
10633         case SAVEt_GENERIC_SVREF:               /* generic sv */
10634         case SAVEt_SVREF:                       /* scalar reference */
10635             sv = (SV*)POPPTR(ss,ix);
10636             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
10637             ptr = POPPTR(ss,ix);
10638             TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
10639             break;
10640         case SAVEt_HV:                          /* hash reference */
10641         case SAVEt_AV:                          /* array reference */
10642             sv = (SV*) POPPTR(ss,ix);
10643             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
10644             /* fall through */
10645         case SAVEt_COMPPAD:
10646         case SAVEt_NSTAB:
10647             sv = (SV*) POPPTR(ss,ix);
10648             TOPPTR(nss,ix) = sv_dup(sv, param);
10649             break;
10650         case SAVEt_INT:                         /* int reference */
10651             ptr = POPPTR(ss,ix);
10652             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10653             intval = (int)POPINT(ss,ix);
10654             TOPINT(nss,ix) = intval;
10655             break;
10656         case SAVEt_LONG:                        /* long reference */
10657             ptr = POPPTR(ss,ix);
10658             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10659             /* fall through */
10660         case SAVEt_CLEARSV:
10661             longval = (long)POPLONG(ss,ix);
10662             TOPLONG(nss,ix) = longval;
10663             break;
10664         case SAVEt_I32:                         /* I32 reference */
10665         case SAVEt_I16:                         /* I16 reference */
10666         case SAVEt_I8:                          /* I8 reference */
10667         case SAVEt_COP_ARYBASE:                 /* call CopARYBASE_set */
10668             ptr = POPPTR(ss,ix);
10669             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10670             i = POPINT(ss,ix);
10671             TOPINT(nss,ix) = i;
10672             break;
10673         case SAVEt_IV:                          /* IV reference */
10674             ptr = POPPTR(ss,ix);
10675             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10676             iv = POPIV(ss,ix);
10677             TOPIV(nss,ix) = iv;
10678             break;
10679         case SAVEt_HPTR:                        /* HV* reference */
10680         case SAVEt_APTR:                        /* AV* reference */
10681         case SAVEt_SPTR:                        /* SV* reference */
10682             ptr = POPPTR(ss,ix);
10683             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10684             sv = (SV*)POPPTR(ss,ix);
10685             TOPPTR(nss,ix) = sv_dup(sv, param);
10686             break;
10687         case SAVEt_VPTR:                        /* random* reference */
10688             ptr = POPPTR(ss,ix);
10689             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10690             ptr = POPPTR(ss,ix);
10691             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10692             break;
10693         case SAVEt_GENERIC_PVREF:               /* generic char* */
10694         case SAVEt_PPTR:                        /* char* reference */
10695             ptr = POPPTR(ss,ix);
10696             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10697             c = (char*)POPPTR(ss,ix);
10698             TOPPTR(nss,ix) = pv_dup(c);
10699             break;
10700         case SAVEt_GP:                          /* scalar reference */
10701             gp = (GP*)POPPTR(ss,ix);
10702             TOPPTR(nss,ix) = gp = gp_dup(gp, param);
10703             (void)GpREFCNT_inc(gp);
10704             gv = (GV*)POPPTR(ss,ix);
10705             TOPPTR(nss,ix) = gv_dup_inc(gv, param);
10706             break;
10707         case SAVEt_FREEOP:
10708             ptr = POPPTR(ss,ix);
10709             if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
10710                 /* these are assumed to be refcounted properly */
10711                 OP *o;
10712                 switch (((OP*)ptr)->op_type) {
10713                 case OP_LEAVESUB:
10714                 case OP_LEAVESUBLV:
10715                 case OP_LEAVEEVAL:
10716                 case OP_LEAVE:
10717                 case OP_SCOPE:
10718                 case OP_LEAVEWRITE:
10719                     TOPPTR(nss,ix) = ptr;
10720                     o = (OP*)ptr;
10721                     OP_REFCNT_LOCK;
10722                     (void) OpREFCNT_inc(o);
10723                     OP_REFCNT_UNLOCK;
10724                     break;
10725                 default:
10726                     TOPPTR(nss,ix) = NULL;
10727                     break;
10728                 }
10729             }
10730             else
10731                 TOPPTR(nss,ix) = NULL;
10732             break;
10733         case SAVEt_FREEPV:
10734             c = (char*)POPPTR(ss,ix);
10735             TOPPTR(nss,ix) = pv_dup_inc(c);
10736             break;
10737         case SAVEt_DELETE:
10738             hv = (HV*)POPPTR(ss,ix);
10739             TOPPTR(nss,ix) = hv_dup_inc(hv, param);
10740             c = (char*)POPPTR(ss,ix);
10741             TOPPTR(nss,ix) = pv_dup_inc(c);
10742             /* fall through */
10743         case SAVEt_STACK_POS:           /* Position on Perl stack */
10744             i = POPINT(ss,ix);
10745             TOPINT(nss,ix) = i;
10746             break;
10747         case SAVEt_DESTRUCTOR:
10748             ptr = POPPTR(ss,ix);
10749             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);  /* XXX quite arbitrary */
10750             dptr = POPDPTR(ss,ix);
10751             TOPDPTR(nss,ix) = DPTR2FPTR(void (*)(void*),
10752                                         any_dup(FPTR2DPTR(void *, dptr),
10753                                                 proto_perl));
10754             break;
10755         case SAVEt_DESTRUCTOR_X:
10756             ptr = POPPTR(ss,ix);
10757             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);  /* XXX quite arbitrary */
10758             dxptr = POPDXPTR(ss,ix);
10759             TOPDXPTR(nss,ix) = DPTR2FPTR(void (*)(pTHX_ void*),
10760                                          any_dup(FPTR2DPTR(void *, dxptr),
10761                                                  proto_perl));
10762             break;
10763         case SAVEt_REGCONTEXT:
10764         case SAVEt_ALLOC:
10765             i = POPINT(ss,ix);
10766             TOPINT(nss,ix) = i;
10767             ix -= i;
10768             break;
10769         case SAVEt_AELEM:               /* array element */
10770             sv = (SV*)POPPTR(ss,ix);
10771             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
10772             i = POPINT(ss,ix);
10773             TOPINT(nss,ix) = i;
10774             av = (AV*)POPPTR(ss,ix);
10775             TOPPTR(nss,ix) = av_dup_inc(av, param);
10776             break;
10777         case SAVEt_OP:
10778             ptr = POPPTR(ss,ix);
10779             TOPPTR(nss,ix) = ptr;
10780             break;
10781         case SAVEt_HINTS:
10782             i = POPINT(ss,ix);
10783             TOPINT(nss,ix) = i;
10784             ptr = POPPTR(ss,ix);
10785             if (ptr) {
10786                 HINTS_REFCNT_LOCK;
10787                 ((struct refcounted_he *)ptr)->refcounted_he_refcnt++;
10788                 HINTS_REFCNT_UNLOCK;
10789             }
10790             TOPPTR(nss,ix) = ptr;
10791             if (i & HINT_LOCALIZE_HH) {
10792                 hv = (HV*)POPPTR(ss,ix);
10793                 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
10794             }
10795             break;
10796         case SAVEt_PADSV:
10797             longval = (long)POPLONG(ss,ix);
10798             TOPLONG(nss,ix) = longval;
10799             ptr = POPPTR(ss,ix);
10800             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10801             sv = (SV*)POPPTR(ss,ix);
10802             TOPPTR(nss,ix) = sv_dup(sv, param);
10803             break;
10804         case SAVEt_BOOL:
10805             ptr = POPPTR(ss,ix);
10806             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10807             longval = (long)POPBOOL(ss,ix);
10808             TOPBOOL(nss,ix) = (bool)longval;
10809             break;
10810         case SAVEt_SET_SVFLAGS:
10811             i = POPINT(ss,ix);
10812             TOPINT(nss,ix) = i;
10813             i = POPINT(ss,ix);
10814             TOPINT(nss,ix) = i;
10815             sv = (SV*)POPPTR(ss,ix);
10816             TOPPTR(nss,ix) = sv_dup(sv, param);
10817             break;
10818         case SAVEt_RE_STATE:
10819             {
10820                 const struct re_save_state *const old_state
10821                     = (struct re_save_state *)
10822                     (ss + ix - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
10823                 struct re_save_state *const new_state
10824                     = (struct re_save_state *)
10825                     (nss + ix - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
10826
10827                 Copy(old_state, new_state, 1, struct re_save_state);
10828                 ix -= SAVESTACK_ALLOC_FOR_RE_SAVE_STATE;
10829
10830                 new_state->re_state_bostr
10831                     = pv_dup(old_state->re_state_bostr);
10832                 new_state->re_state_reginput
10833                     = pv_dup(old_state->re_state_reginput);
10834                 new_state->re_state_regeol
10835                     = pv_dup(old_state->re_state_regeol);
10836                 new_state->re_state_regoffs
10837                     = (regexp_paren_pair*)
10838                         any_dup(old_state->re_state_regoffs, proto_perl);
10839                 new_state->re_state_reglastparen
10840                     = (U32*) any_dup(old_state->re_state_reglastparen, 
10841                               proto_perl);
10842                 new_state->re_state_reglastcloseparen
10843                     = (U32*)any_dup(old_state->re_state_reglastcloseparen,
10844                               proto_perl);
10845                 /* XXX This just has to be broken. The old save_re_context
10846                    code did SAVEGENERICPV(PL_reg_start_tmp);
10847                    PL_reg_start_tmp is char **.
10848                    Look above to what the dup code does for
10849                    SAVEt_GENERIC_PVREF
10850                    It can never have worked.
10851                    So this is merely a faithful copy of the exiting bug:  */
10852                 new_state->re_state_reg_start_tmp
10853                     = (char **) pv_dup((char *)
10854                                       old_state->re_state_reg_start_tmp);
10855                 /* I assume that it only ever "worked" because no-one called
10856                    (pseudo)fork while the regexp engine had re-entered itself.
10857                 */
10858 #ifdef PERL_OLD_COPY_ON_WRITE
10859                 new_state->re_state_nrs
10860                     = sv_dup(old_state->re_state_nrs, param);
10861 #endif
10862                 new_state->re_state_reg_magic
10863                     = (MAGIC*) any_dup(old_state->re_state_reg_magic, 
10864                                proto_perl);
10865                 new_state->re_state_reg_oldcurpm
10866                     = (PMOP*) any_dup(old_state->re_state_reg_oldcurpm, 
10867                               proto_perl);
10868                 new_state->re_state_reg_curpm
10869                     = (PMOP*)  any_dup(old_state->re_state_reg_curpm, 
10870                                proto_perl);
10871                 new_state->re_state_reg_oldsaved
10872                     = pv_dup(old_state->re_state_reg_oldsaved);
10873                 new_state->re_state_reg_poscache
10874                     = pv_dup(old_state->re_state_reg_poscache);
10875                 new_state->re_state_reg_starttry
10876                     = pv_dup(old_state->re_state_reg_starttry);
10877                 break;
10878             }
10879         case SAVEt_COMPILE_WARNINGS:
10880             ptr = POPPTR(ss,ix);
10881             TOPPTR(nss,ix) = DUP_WARNINGS((STRLEN*)ptr);
10882             break;
10883         case SAVEt_PARSER:
10884             ptr = POPPTR(ss,ix);
10885             TOPPTR(nss,ix) = parser_dup((const yy_parser*)ptr, param);
10886             break;
10887         default:
10888             Perl_croak(aTHX_
10889                        "panic: ss_dup inconsistency (%"IVdf")", (IV) type);
10890         }
10891     }
10892
10893     return nss;
10894 }
10895
10896
10897 /* if sv is a stash, call $class->CLONE_SKIP(), and set the SVphv_CLONEABLE
10898  * flag to the result. This is done for each stash before cloning starts,
10899  * so we know which stashes want their objects cloned */
10900
10901 static void
10902 do_mark_cloneable_stash(pTHX_ SV *sv)
10903 {
10904     const HEK * const hvname = HvNAME_HEK((HV*)sv);
10905     if (hvname) {
10906         GV* const cloner = gv_fetchmethod_autoload((HV*)sv, "CLONE_SKIP", 0);
10907         SvFLAGS(sv) |= SVphv_CLONEABLE; /* clone objects by default */
10908         if (cloner && GvCV(cloner)) {
10909             dSP;
10910             UV status;
10911
10912             ENTER;
10913             SAVETMPS;
10914             PUSHMARK(SP);
10915             XPUSHs(sv_2mortal(newSVhek(hvname)));
10916             PUTBACK;
10917             call_sv((SV*)GvCV(cloner), G_SCALAR);
10918             SPAGAIN;
10919             status = POPu;
10920             PUTBACK;
10921             FREETMPS;
10922             LEAVE;
10923             if (status)
10924                 SvFLAGS(sv) &= ~SVphv_CLONEABLE;
10925         }
10926     }
10927 }
10928
10929
10930
10931 /*
10932 =for apidoc perl_clone
10933
10934 Create and return a new interpreter by cloning the current one.
10935
10936 perl_clone takes these flags as parameters:
10937
10938 CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
10939 without it we only clone the data and zero the stacks,
10940 with it we copy the stacks and the new perl interpreter is
10941 ready to run at the exact same point as the previous one.
10942 The pseudo-fork code uses COPY_STACKS while the
10943 threads->create doesn't.
10944
10945 CLONEf_KEEP_PTR_TABLE
10946 perl_clone keeps a ptr_table with the pointer of the old
10947 variable as a key and the new variable as a value,
10948 this allows it to check if something has been cloned and not
10949 clone it again but rather just use the value and increase the
10950 refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
10951 the ptr_table using the function
10952 C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
10953 reason to keep it around is if you want to dup some of your own
10954 variable who are outside the graph perl scans, example of this
10955 code is in threads.xs create
10956
10957 CLONEf_CLONE_HOST
10958 This is a win32 thing, it is ignored on unix, it tells perls
10959 win32host code (which is c++) to clone itself, this is needed on
10960 win32 if you want to run two threads at the same time,
10961 if you just want to do some stuff in a separate perl interpreter
10962 and then throw it away and return to the original one,
10963 you don't need to do anything.
10964
10965 =cut
10966 */
10967
10968 /* XXX the above needs expanding by someone who actually understands it ! */
10969 EXTERN_C PerlInterpreter *
10970 perl_clone_host(PerlInterpreter* proto_perl, UV flags);
10971
10972 PerlInterpreter *
10973 perl_clone(PerlInterpreter *proto_perl, UV flags)
10974 {
10975    dVAR;
10976 #ifdef PERL_IMPLICIT_SYS
10977
10978    /* perlhost.h so we need to call into it
10979    to clone the host, CPerlHost should have a c interface, sky */
10980
10981    if (flags & CLONEf_CLONE_HOST) {
10982        return perl_clone_host(proto_perl,flags);
10983    }
10984    return perl_clone_using(proto_perl, flags,
10985                             proto_perl->IMem,
10986                             proto_perl->IMemShared,
10987                             proto_perl->IMemParse,
10988                             proto_perl->IEnv,
10989                             proto_perl->IStdIO,
10990                             proto_perl->ILIO,
10991                             proto_perl->IDir,
10992                             proto_perl->ISock,
10993                             proto_perl->IProc);
10994 }
10995
10996 PerlInterpreter *
10997 perl_clone_using(PerlInterpreter *proto_perl, UV flags,
10998                  struct IPerlMem* ipM, struct IPerlMem* ipMS,
10999                  struct IPerlMem* ipMP, struct IPerlEnv* ipE,
11000                  struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
11001                  struct IPerlDir* ipD, struct IPerlSock* ipS,
11002                  struct IPerlProc* ipP)
11003 {
11004     /* XXX many of the string copies here can be optimized if they're
11005      * constants; they need to be allocated as common memory and just
11006      * their pointers copied. */
11007
11008     IV i;
11009     CLONE_PARAMS clone_params;
11010     CLONE_PARAMS* const param = &clone_params;
11011
11012     PerlInterpreter * const my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, 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
11033     /* host pointers */
11034     PL_Mem              = ipM;
11035     PL_MemShared        = ipMS;
11036     PL_MemParse         = ipMP;
11037     PL_Env              = ipE;
11038     PL_StdIO            = ipStd;
11039     PL_LIO              = ipLIO;
11040     PL_Dir              = ipD;
11041     PL_Sock             = ipS;
11042     PL_Proc             = ipP;
11043 #else           /* !PERL_IMPLICIT_SYS */
11044     IV i;
11045     CLONE_PARAMS clone_params;
11046     CLONE_PARAMS* param = &clone_params;
11047     PerlInterpreter * const my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
11048     /* for each stash, determine whether its objects should be cloned */
11049     S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
11050     PERL_SET_THX(my_perl);
11051
11052 #    ifdef DEBUGGING
11053     PoisonNew(my_perl, 1, PerlInterpreter);
11054     PL_op = NULL;
11055     PL_curcop = NULL;
11056     PL_markstack = 0;
11057     PL_scopestack = 0;
11058     PL_savestack = 0;
11059     PL_savestack_ix = 0;
11060     PL_savestack_max = -1;
11061     PL_sig_pending = 0;
11062     PL_parser = NULL;
11063     Zero(&PL_debug_pad, 1, struct perl_debug_pad);
11064 #    else       /* !DEBUGGING */
11065     Zero(my_perl, 1, PerlInterpreter);
11066 #    endif      /* DEBUGGING */
11067 #endif          /* PERL_IMPLICIT_SYS */
11068     param->flags = flags;
11069     param->proto_perl = proto_perl;
11070
11071     INIT_TRACK_MEMPOOL(my_perl->Imemory_debug_header, my_perl);
11072
11073     PL_body_arenas = NULL;
11074     Zero(&PL_body_roots, 1, PL_body_roots);
11075     
11076     PL_nice_chunk       = NULL;
11077     PL_nice_chunk_size  = 0;
11078     PL_sv_count         = 0;
11079     PL_sv_objcount      = 0;
11080     PL_sv_root          = NULL;
11081     PL_sv_arenaroot     = NULL;
11082
11083     PL_debug            = proto_perl->Idebug;
11084
11085     PL_hash_seed        = proto_perl->Ihash_seed;
11086     PL_rehash_seed      = proto_perl->Irehash_seed;
11087
11088 #ifdef USE_REENTRANT_API
11089     /* XXX: things like -Dm will segfault here in perlio, but doing
11090      *  PERL_SET_CONTEXT(proto_perl);
11091      * breaks too many other things
11092      */
11093     Perl_reentrant_init(aTHX);
11094 #endif
11095
11096     /* create SV map for pointer relocation */
11097     PL_ptr_table = ptr_table_new();
11098
11099     /* initialize these special pointers as early as possible */
11100     SvANY(&PL_sv_undef)         = NULL;
11101     SvREFCNT(&PL_sv_undef)      = (~(U32)0)/2;
11102     SvFLAGS(&PL_sv_undef)       = SVf_READONLY|SVt_NULL;
11103     ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
11104
11105     SvANY(&PL_sv_no)            = new_XPVNV();
11106     SvREFCNT(&PL_sv_no)         = (~(U32)0)/2;
11107     SvFLAGS(&PL_sv_no)          = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
11108                                   |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
11109     SvPV_set(&PL_sv_no, savepvn(PL_No, 0));
11110     SvCUR_set(&PL_sv_no, 0);
11111     SvLEN_set(&PL_sv_no, 1);
11112     SvIV_set(&PL_sv_no, 0);
11113     SvNV_set(&PL_sv_no, 0);
11114     ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
11115
11116     SvANY(&PL_sv_yes)           = new_XPVNV();
11117     SvREFCNT(&PL_sv_yes)        = (~(U32)0)/2;
11118     SvFLAGS(&PL_sv_yes)         = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
11119                                   |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
11120     SvPV_set(&PL_sv_yes, savepvn(PL_Yes, 1));
11121     SvCUR_set(&PL_sv_yes, 1);
11122     SvLEN_set(&PL_sv_yes, 2);
11123     SvIV_set(&PL_sv_yes, 1);
11124     SvNV_set(&PL_sv_yes, 1);
11125     ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
11126
11127     /* create (a non-shared!) shared string table */
11128     PL_strtab           = newHV();
11129     HvSHAREKEYS_off(PL_strtab);
11130     hv_ksplit(PL_strtab, HvTOTALKEYS(proto_perl->Istrtab));
11131     ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
11132
11133     PL_compiling = proto_perl->Icompiling;
11134
11135     /* These two PVs will be free'd special way so must set them same way op.c does */
11136     PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
11137     ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
11138
11139     PL_compiling.cop_file    = savesharedpv(PL_compiling.cop_file);
11140     ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
11141
11142     ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
11143     PL_compiling.cop_warnings = DUP_WARNINGS(PL_compiling.cop_warnings);
11144     if (PL_compiling.cop_hints_hash) {
11145         HINTS_REFCNT_LOCK;
11146         PL_compiling.cop_hints_hash->refcounted_he_refcnt++;
11147         HINTS_REFCNT_UNLOCK;
11148     }
11149     PL_curcop           = (COP*)any_dup(proto_perl->Icurcop, proto_perl);
11150 #ifdef PERL_DEBUG_READONLY_OPS
11151     PL_slabs = NULL;
11152     PL_slab_count = 0;
11153 #endif
11154
11155     /* pseudo environmental stuff */
11156     PL_origargc         = proto_perl->Iorigargc;
11157     PL_origargv         = proto_perl->Iorigargv;
11158
11159     param->stashes      = newAV();  /* Setup array of objects to call clone on */
11160
11161     /* Set tainting stuff before PerlIO_debug can possibly get called */
11162     PL_tainting         = proto_perl->Itainting;
11163     PL_taint_warn       = proto_perl->Itaint_warn;
11164
11165 #ifdef PERLIO_LAYERS
11166     /* Clone PerlIO tables as soon as we can handle general xx_dup() */
11167     PerlIO_clone(aTHX_ proto_perl, param);
11168 #endif
11169
11170     PL_envgv            = gv_dup(proto_perl->Ienvgv, param);
11171     PL_incgv            = gv_dup(proto_perl->Iincgv, param);
11172     PL_hintgv           = gv_dup(proto_perl->Ihintgv, param);
11173     PL_origfilename     = SAVEPV(proto_perl->Iorigfilename);
11174     PL_diehook          = sv_dup_inc(proto_perl->Idiehook, param);
11175     PL_warnhook         = sv_dup_inc(proto_perl->Iwarnhook, param);
11176
11177     /* switches */
11178     PL_minus_c          = proto_perl->Iminus_c;
11179     PL_patchlevel       = sv_dup_inc(proto_perl->Ipatchlevel, param);
11180     PL_localpatches     = proto_perl->Ilocalpatches;
11181     PL_splitstr         = proto_perl->Isplitstr;
11182     PL_preprocess       = proto_perl->Ipreprocess;
11183     PL_minus_n          = proto_perl->Iminus_n;
11184     PL_minus_p          = proto_perl->Iminus_p;
11185     PL_minus_l          = proto_perl->Iminus_l;
11186     PL_minus_a          = proto_perl->Iminus_a;
11187     PL_minus_E          = proto_perl->Iminus_E;
11188     PL_minus_F          = proto_perl->Iminus_F;
11189     PL_doswitches       = proto_perl->Idoswitches;
11190     PL_dowarn           = proto_perl->Idowarn;
11191     PL_doextract        = proto_perl->Idoextract;
11192     PL_sawampersand     = proto_perl->Isawampersand;
11193     PL_unsafe           = proto_perl->Iunsafe;
11194     PL_inplace          = SAVEPV(proto_perl->Iinplace);
11195     PL_e_script         = sv_dup_inc(proto_perl->Ie_script, param);
11196     PL_perldb           = proto_perl->Iperldb;
11197     PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
11198     PL_exit_flags       = proto_perl->Iexit_flags;
11199
11200     /* magical thingies */
11201     /* XXX time(&PL_basetime) when asked for? */
11202     PL_basetime         = proto_perl->Ibasetime;
11203     PL_formfeed         = sv_dup(proto_perl->Iformfeed, param);
11204
11205     PL_maxsysfd         = proto_perl->Imaxsysfd;
11206     PL_statusvalue      = proto_perl->Istatusvalue;
11207 #ifdef VMS
11208     PL_statusvalue_vms  = proto_perl->Istatusvalue_vms;
11209 #else
11210     PL_statusvalue_posix = proto_perl->Istatusvalue_posix;
11211 #endif
11212     PL_encoding         = sv_dup(proto_perl->Iencoding, param);
11213
11214     sv_setpvn(PERL_DEBUG_PAD(0), "", 0);        /* For regex debugging. */
11215     sv_setpvn(PERL_DEBUG_PAD(1), "", 0);        /* ext/re needs these */
11216     sv_setpvn(PERL_DEBUG_PAD(2), "", 0);        /* even without DEBUGGING. */
11217
11218    
11219     /* RE engine related */
11220     Zero(&PL_reg_state, 1, struct re_save_state);
11221     PL_reginterp_cnt    = 0;
11222     PL_regmatch_slab    = NULL;
11223     
11224     /* Clone the regex array */
11225     PL_regex_padav = newAV();
11226     {
11227         const I32 len = av_len((AV*)proto_perl->Iregex_padav);
11228         SV* const * const regexen = AvARRAY((AV*)proto_perl->Iregex_padav);
11229         IV i;
11230         av_push(PL_regex_padav, sv_dup_inc_NN(regexen[0],param));
11231         for(i = 1; i <= len; i++) {
11232             const SV * const regex = regexen[i];
11233             /* FIXME for plugins
11234                         newSViv(PTR2IV(CALLREGDUPE(
11235                                 INT2PTR(REGEXP *, SvIVX(regex)), param))))
11236             */
11237             /* And while we're at it, can we FIXME on the whole hiding 
11238                pointer inside an IV hack? */
11239             SV * const sv =
11240                 SvREPADTMP(regex)
11241                     ? sv_dup_inc(regex, param)
11242                     : SvREFCNT_inc(
11243                         newSViv(PTR2IV(sv_dup_inc(INT2PTR(REGEXP *, SvIVX(regex)), param))))
11244                 ;
11245             if (SvFLAGS(regex) & SVf_BREAK)
11246                 SvFLAGS(sv) |= SVf_BREAK; /* unrefcnted PL_curpm */
11247             av_push(PL_regex_padav, sv);
11248         }
11249     }
11250     PL_regex_pad = AvARRAY(PL_regex_padav);
11251
11252     /* shortcuts to various I/O objects */
11253     PL_stdingv          = gv_dup(proto_perl->Istdingv, param);
11254     PL_stderrgv         = gv_dup(proto_perl->Istderrgv, param);
11255     PL_defgv            = gv_dup(proto_perl->Idefgv, param);
11256     PL_argvgv           = gv_dup(proto_perl->Iargvgv, param);
11257     PL_argvoutgv        = gv_dup(proto_perl->Iargvoutgv, param);
11258     PL_argvout_stack    = av_dup_inc(proto_perl->Iargvout_stack, param);
11259
11260     /* shortcuts to regexp stuff */
11261     PL_replgv           = gv_dup(proto_perl->Ireplgv, param);
11262
11263     /* shortcuts to misc objects */
11264     PL_errgv            = gv_dup(proto_perl->Ierrgv, param);
11265
11266     /* shortcuts to debugging objects */
11267     PL_DBgv             = gv_dup(proto_perl->IDBgv, param);
11268     PL_DBline           = gv_dup(proto_perl->IDBline, param);
11269     PL_DBsub            = gv_dup(proto_perl->IDBsub, param);
11270     PL_DBsingle         = sv_dup(proto_perl->IDBsingle, param);
11271     PL_DBtrace          = sv_dup(proto_perl->IDBtrace, param);
11272     PL_DBsignal         = sv_dup(proto_perl->IDBsignal, param);
11273     PL_dbargs           = av_dup(proto_perl->Idbargs, param);
11274
11275     /* symbol tables */
11276     PL_defstash         = hv_dup_inc(proto_perl->Idefstash, param);
11277     PL_curstash         = hv_dup(proto_perl->Icurstash, param);
11278     PL_debstash         = hv_dup(proto_perl->Idebstash, param);
11279     PL_globalstash      = hv_dup(proto_perl->Iglobalstash, param);
11280     PL_curstname        = sv_dup_inc(proto_perl->Icurstname, param);
11281
11282     PL_beginav          = av_dup_inc(proto_perl->Ibeginav, param);
11283     PL_beginav_save     = av_dup_inc(proto_perl->Ibeginav_save, param);
11284     PL_checkav_save     = av_dup_inc(proto_perl->Icheckav_save, param);
11285     PL_unitcheckav      = av_dup_inc(proto_perl->Iunitcheckav, param);
11286     PL_unitcheckav_save = av_dup_inc(proto_perl->Iunitcheckav_save, param);
11287     PL_endav            = av_dup_inc(proto_perl->Iendav, param);
11288     PL_checkav          = av_dup_inc(proto_perl->Icheckav, param);
11289     PL_initav           = av_dup_inc(proto_perl->Iinitav, param);
11290
11291     PL_sub_generation   = proto_perl->Isub_generation;
11292     PL_isarev           = hv_dup_inc(proto_perl->Iisarev, param);
11293
11294     /* funky return mechanisms */
11295     PL_forkprocess      = proto_perl->Iforkprocess;
11296
11297     /* subprocess state */
11298     PL_fdpid            = av_dup_inc(proto_perl->Ifdpid, param);
11299
11300     /* internal state */
11301     PL_maxo             = proto_perl->Imaxo;
11302     if (proto_perl->Iop_mask)
11303         PL_op_mask      = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
11304     else
11305         PL_op_mask      = NULL;
11306     /* PL_asserting        = proto_perl->Iasserting; */
11307
11308     /* current interpreter roots */
11309     PL_main_cv          = cv_dup_inc(proto_perl->Imain_cv, param);
11310     OP_REFCNT_LOCK;
11311     PL_main_root        = OpREFCNT_inc(proto_perl->Imain_root);
11312     OP_REFCNT_UNLOCK;
11313     PL_main_start       = proto_perl->Imain_start;
11314     PL_eval_root        = proto_perl->Ieval_root;
11315     PL_eval_start       = proto_perl->Ieval_start;
11316
11317     /* runtime control stuff */
11318     PL_curcopdb         = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
11319
11320     PL_filemode         = proto_perl->Ifilemode;
11321     PL_lastfd           = proto_perl->Ilastfd;
11322     PL_oldname          = proto_perl->Ioldname;         /* XXX not quite right */
11323     PL_Argv             = NULL;
11324     PL_Cmd              = NULL;
11325     PL_gensym           = proto_perl->Igensym;
11326     PL_preambleav       = av_dup_inc(proto_perl->Ipreambleav, param);
11327     PL_laststatval      = proto_perl->Ilaststatval;
11328     PL_laststype        = proto_perl->Ilaststype;
11329     PL_mess_sv          = NULL;
11330
11331     PL_ors_sv           = sv_dup_inc(proto_perl->Iors_sv, param);
11332
11333     /* interpreter atexit processing */
11334     PL_exitlistlen      = proto_perl->Iexitlistlen;
11335     if (PL_exitlistlen) {
11336         Newx(PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11337         Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11338     }
11339     else
11340         PL_exitlist     = (PerlExitListEntry*)NULL;
11341
11342     PL_my_cxt_size = proto_perl->Imy_cxt_size;
11343     if (PL_my_cxt_size) {
11344         Newx(PL_my_cxt_list, PL_my_cxt_size, void *);
11345         Copy(proto_perl->Imy_cxt_list, PL_my_cxt_list, PL_my_cxt_size, void *);
11346 #ifdef PERL_GLOBAL_STRUCT_PRIVATE
11347         Newx(PL_my_cxt_keys, PL_my_cxt_size, const char *);
11348         Copy(proto_perl->Imy_cxt_keys, PL_my_cxt_keys, PL_my_cxt_size, char *);
11349 #endif
11350     }
11351     else {
11352         PL_my_cxt_list  = (void**)NULL;
11353 #ifdef PERL_GLOBAL_STRUCT_PRIVATE
11354         PL_my_cxt_keys  = (const char**)NULL;
11355 #endif
11356     }
11357     PL_modglobal        = hv_dup_inc(proto_perl->Imodglobal, param);
11358     PL_custom_op_names  = hv_dup_inc(proto_perl->Icustom_op_names,param);
11359     PL_custom_op_descs  = hv_dup_inc(proto_perl->Icustom_op_descs,param);
11360
11361     PL_profiledata      = NULL;
11362
11363     PL_compcv                   = cv_dup(proto_perl->Icompcv, param);
11364
11365     PAD_CLONE_VARS(proto_perl, param);
11366
11367 #ifdef HAVE_INTERP_INTERN
11368     sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
11369 #endif
11370
11371     /* more statics moved here */
11372     PL_generation       = proto_perl->Igeneration;
11373     PL_DBcv             = cv_dup(proto_perl->IDBcv, param);
11374
11375     PL_in_clean_objs    = proto_perl->Iin_clean_objs;
11376     PL_in_clean_all     = proto_perl->Iin_clean_all;
11377
11378     PL_uid              = proto_perl->Iuid;
11379     PL_euid             = proto_perl->Ieuid;
11380     PL_gid              = proto_perl->Igid;
11381     PL_egid             = proto_perl->Iegid;
11382     PL_nomemok          = proto_perl->Inomemok;
11383     PL_an               = proto_perl->Ian;
11384     PL_evalseq          = proto_perl->Ievalseq;
11385     PL_origenviron      = proto_perl->Iorigenviron;     /* XXX not quite right */
11386     PL_origalen         = proto_perl->Iorigalen;
11387 #ifdef PERL_USES_PL_PIDSTATUS
11388     PL_pidstatus        = newHV();                      /* XXX flag for cloning? */
11389 #endif
11390     PL_osname           = SAVEPV(proto_perl->Iosname);
11391     PL_sighandlerp      = proto_perl->Isighandlerp;
11392
11393     PL_runops           = proto_perl->Irunops;
11394
11395     PL_parser           = parser_dup(proto_perl->Iparser, param);
11396
11397     PL_subline          = proto_perl->Isubline;
11398     PL_subname          = sv_dup_inc(proto_perl->Isubname, param);
11399
11400 #ifdef FCRYPT
11401     PL_cryptseen        = proto_perl->Icryptseen;
11402 #endif
11403
11404     PL_hints            = proto_perl->Ihints;
11405
11406     PL_amagic_generation        = proto_perl->Iamagic_generation;
11407
11408 #ifdef USE_LOCALE_COLLATE
11409     PL_collation_ix     = proto_perl->Icollation_ix;
11410     PL_collation_name   = SAVEPV(proto_perl->Icollation_name);
11411     PL_collation_standard       = proto_perl->Icollation_standard;
11412     PL_collxfrm_base    = proto_perl->Icollxfrm_base;
11413     PL_collxfrm_mult    = proto_perl->Icollxfrm_mult;
11414 #endif /* USE_LOCALE_COLLATE */
11415
11416 #ifdef USE_LOCALE_NUMERIC
11417     PL_numeric_name     = SAVEPV(proto_perl->Inumeric_name);
11418     PL_numeric_standard = proto_perl->Inumeric_standard;
11419     PL_numeric_local    = proto_perl->Inumeric_local;
11420     PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
11421 #endif /* !USE_LOCALE_NUMERIC */
11422
11423     /* utf8 character classes */
11424     PL_utf8_alnum       = sv_dup_inc(proto_perl->Iutf8_alnum, param);
11425     PL_utf8_alnumc      = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
11426     PL_utf8_ascii       = sv_dup_inc(proto_perl->Iutf8_ascii, param);
11427     PL_utf8_alpha       = sv_dup_inc(proto_perl->Iutf8_alpha, param);
11428     PL_utf8_space       = sv_dup_inc(proto_perl->Iutf8_space, param);
11429     PL_utf8_cntrl       = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
11430     PL_utf8_graph       = sv_dup_inc(proto_perl->Iutf8_graph, param);
11431     PL_utf8_digit       = sv_dup_inc(proto_perl->Iutf8_digit, param);
11432     PL_utf8_upper       = sv_dup_inc(proto_perl->Iutf8_upper, param);
11433     PL_utf8_lower       = sv_dup_inc(proto_perl->Iutf8_lower, param);
11434     PL_utf8_print       = sv_dup_inc(proto_perl->Iutf8_print, param);
11435     PL_utf8_punct       = sv_dup_inc(proto_perl->Iutf8_punct, param);
11436     PL_utf8_xdigit      = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
11437     PL_utf8_mark        = sv_dup_inc(proto_perl->Iutf8_mark, param);
11438     PL_utf8_toupper     = sv_dup_inc(proto_perl->Iutf8_toupper, param);
11439     PL_utf8_totitle     = sv_dup_inc(proto_perl->Iutf8_totitle, param);
11440     PL_utf8_tolower     = sv_dup_inc(proto_perl->Iutf8_tolower, param);
11441     PL_utf8_tofold      = sv_dup_inc(proto_perl->Iutf8_tofold, param);
11442     PL_utf8_idstart     = sv_dup_inc(proto_perl->Iutf8_idstart, param);
11443     PL_utf8_idcont      = sv_dup_inc(proto_perl->Iutf8_idcont, param);
11444
11445     /* Did the locale setup indicate UTF-8? */
11446     PL_utf8locale       = proto_perl->Iutf8locale;
11447     /* Unicode features (see perlrun/-C) */
11448     PL_unicode          = proto_perl->Iunicode;
11449
11450     /* Pre-5.8 signals control */
11451     PL_signals          = proto_perl->Isignals;
11452
11453     /* times() ticks per second */
11454     PL_clocktick        = proto_perl->Iclocktick;
11455
11456     /* Recursion stopper for PerlIO_find_layer */
11457     PL_in_load_module   = proto_perl->Iin_load_module;
11458
11459     /* sort() routine */
11460     PL_sort_RealCmp     = proto_perl->Isort_RealCmp;
11461
11462     /* Not really needed/useful since the reenrant_retint is "volatile",
11463      * but do it for consistency's sake. */
11464     PL_reentrant_retint = proto_perl->Ireentrant_retint;
11465
11466     /* Hooks to shared SVs and locks. */
11467     PL_sharehook        = proto_perl->Isharehook;
11468     PL_lockhook         = proto_perl->Ilockhook;
11469     PL_unlockhook       = proto_perl->Iunlockhook;
11470     PL_threadhook       = proto_perl->Ithreadhook;
11471     PL_destroyhook      = proto_perl->Idestroyhook;
11472
11473 #ifdef THREADS_HAVE_PIDS
11474     PL_ppid             = proto_perl->Ippid;
11475 #endif
11476
11477     /* swatch cache */
11478     PL_last_swash_hv    = NULL; /* reinits on demand */
11479     PL_last_swash_klen  = 0;
11480     PL_last_swash_key[0]= '\0';
11481     PL_last_swash_tmps  = (U8*)NULL;
11482     PL_last_swash_slen  = 0;
11483
11484     PL_glob_index       = proto_perl->Iglob_index;
11485     PL_srand_called     = proto_perl->Isrand_called;
11486     PL_bitcount         = NULL; /* reinits on demand */
11487
11488     if (proto_perl->Ipsig_pend) {
11489         Newxz(PL_psig_pend, SIG_SIZE, int);
11490     }
11491     else {
11492         PL_psig_pend    = (int*)NULL;
11493     }
11494
11495     if (proto_perl->Ipsig_ptr) {
11496         Newxz(PL_psig_ptr,  SIG_SIZE, SV*);
11497         Newxz(PL_psig_name, SIG_SIZE, SV*);
11498         for (i = 1; i < SIG_SIZE; i++) {
11499             PL_psig_ptr[i]  = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
11500             PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
11501         }
11502     }
11503     else {
11504         PL_psig_ptr     = (SV**)NULL;
11505         PL_psig_name    = (SV**)NULL;
11506     }
11507
11508     /* intrpvar.h stuff */
11509
11510     if (flags & CLONEf_COPY_STACKS) {
11511         /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
11512         PL_tmps_ix              = proto_perl->Itmps_ix;
11513         PL_tmps_max             = proto_perl->Itmps_max;
11514         PL_tmps_floor           = proto_perl->Itmps_floor;
11515         Newxz(PL_tmps_stack, PL_tmps_max, SV*);
11516         i = 0;
11517         while (i <= PL_tmps_ix) {
11518             PL_tmps_stack[i]    = sv_dup_inc(proto_perl->Itmps_stack[i], param);
11519             ++i;
11520         }
11521
11522         /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
11523         i = proto_perl->Imarkstack_max - proto_perl->Imarkstack;
11524         Newxz(PL_markstack, i, I32);
11525         PL_markstack_max        = PL_markstack + (proto_perl->Imarkstack_max
11526                                                   - proto_perl->Imarkstack);
11527         PL_markstack_ptr        = PL_markstack + (proto_perl->Imarkstack_ptr
11528                                                   - proto_perl->Imarkstack);
11529         Copy(proto_perl->Imarkstack, PL_markstack,
11530              PL_markstack_ptr - PL_markstack + 1, I32);
11531
11532         /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
11533          * NOTE: unlike the others! */
11534         PL_scopestack_ix        = proto_perl->Iscopestack_ix;
11535         PL_scopestack_max       = proto_perl->Iscopestack_max;
11536         Newxz(PL_scopestack, PL_scopestack_max, I32);
11537         Copy(proto_perl->Iscopestack, PL_scopestack, PL_scopestack_ix, I32);
11538
11539         /* NOTE: si_dup() looks at PL_markstack */
11540         PL_curstackinfo         = si_dup(proto_perl->Icurstackinfo, param);
11541
11542         /* PL_curstack          = PL_curstackinfo->si_stack; */
11543         PL_curstack             = av_dup(proto_perl->Icurstack, param);
11544         PL_mainstack            = av_dup(proto_perl->Imainstack, param);
11545
11546         /* next PUSHs() etc. set *(PL_stack_sp+1) */
11547         PL_stack_base           = AvARRAY(PL_curstack);
11548         PL_stack_sp             = PL_stack_base + (proto_perl->Istack_sp
11549                                                    - proto_perl->Istack_base);
11550         PL_stack_max            = PL_stack_base + AvMAX(PL_curstack);
11551
11552         /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
11553          * NOTE: unlike the others! */
11554         PL_savestack_ix         = proto_perl->Isavestack_ix;
11555         PL_savestack_max        = proto_perl->Isavestack_max;
11556         /*Newxz(PL_savestack, PL_savestack_max, ANY);*/
11557         PL_savestack            = ss_dup(proto_perl, param);
11558     }
11559     else {
11560         init_stacks();
11561         ENTER;                  /* perl_destruct() wants to LEAVE; */
11562
11563         /* although we're not duplicating the tmps stack, we should still
11564          * add entries for any SVs on the tmps stack that got cloned by a
11565          * non-refcount means (eg a temp in @_); otherwise they will be
11566          * orphaned
11567          */
11568         for (i = 0; i<= proto_perl->Itmps_ix; i++) {
11569             SV * const nsv = (SV*)ptr_table_fetch(PL_ptr_table,
11570                     proto_perl->Itmps_stack[i]);
11571             if (nsv && !SvREFCNT(nsv)) {
11572                 EXTEND_MORTAL(1);
11573                 PL_tmps_stack[++PL_tmps_ix] = SvREFCNT_inc_simple(nsv);
11574             }
11575         }
11576     }
11577
11578     PL_start_env        = proto_perl->Istart_env;       /* XXXXXX */
11579     PL_top_env          = &PL_start_env;
11580
11581     PL_op               = proto_perl->Iop;
11582
11583     PL_Sv               = NULL;
11584     PL_Xpv              = (XPV*)NULL;
11585     my_perl->Ina        = proto_perl->Ina;
11586
11587     PL_statbuf          = proto_perl->Istatbuf;
11588     PL_statcache        = proto_perl->Istatcache;
11589     PL_statgv           = gv_dup(proto_perl->Istatgv, param);
11590     PL_statname         = sv_dup_inc(proto_perl->Istatname, param);
11591 #ifdef HAS_TIMES
11592     PL_timesbuf         = proto_perl->Itimesbuf;
11593 #endif
11594
11595     PL_tainted          = proto_perl->Itainted;
11596     PL_curpm            = proto_perl->Icurpm;   /* XXX No PMOP ref count */
11597     PL_rs               = sv_dup_inc(proto_perl->Irs, param);
11598     PL_last_in_gv       = gv_dup(proto_perl->Ilast_in_gv, param);
11599     PL_ofs_sv           = sv_dup_inc(proto_perl->Iofs_sv, param);
11600     PL_defoutgv         = gv_dup_inc(proto_perl->Idefoutgv, param);
11601     PL_chopset          = proto_perl->Ichopset; /* XXX never deallocated */
11602     PL_toptarget        = sv_dup_inc(proto_perl->Itoptarget, param);
11603     PL_bodytarget       = sv_dup_inc(proto_perl->Ibodytarget, param);
11604     PL_formtarget       = sv_dup(proto_perl->Iformtarget, param);
11605
11606     PL_restartop        = proto_perl->Irestartop;
11607     PL_in_eval          = proto_perl->Iin_eval;
11608     PL_delaymagic       = proto_perl->Idelaymagic;
11609     PL_dirty            = proto_perl->Idirty;
11610     PL_localizing       = proto_perl->Ilocalizing;
11611
11612     PL_errors           = sv_dup_inc(proto_perl->Ierrors, param);
11613     PL_hv_fetch_ent_mh  = NULL;
11614     PL_modcount         = proto_perl->Imodcount;
11615     PL_lastgotoprobe    = NULL;
11616     PL_dumpindent       = proto_perl->Idumpindent;
11617
11618     PL_sortcop          = (OP*)any_dup(proto_perl->Isortcop, proto_perl);
11619     PL_sortstash        = hv_dup(proto_perl->Isortstash, param);
11620     PL_firstgv          = gv_dup(proto_perl->Ifirstgv, param);
11621     PL_secondgv         = gv_dup(proto_perl->Isecondgv, param);
11622     PL_efloatbuf        = NULL;         /* reinits on demand */
11623     PL_efloatsize       = 0;                    /* reinits on demand */
11624
11625     /* regex stuff */
11626
11627     PL_screamfirst      = NULL;
11628     PL_screamnext       = NULL;
11629     PL_maxscream        = -1;                   /* reinits on demand */
11630     PL_lastscream       = NULL;
11631
11632
11633     PL_regdummy         = proto_perl->Iregdummy;
11634     PL_colorset         = 0;            /* reinits PL_colors[] */
11635     /*PL_colors[6]      = {0,0,0,0,0,0};*/
11636
11637
11638
11639     /* Pluggable optimizer */
11640     PL_peepp            = proto_perl->Ipeepp;
11641
11642     PL_stashcache       = newHV();
11643
11644     PL_watchaddr        = (char **) ptr_table_fetch(PL_ptr_table,
11645                                             proto_perl->Iwatchaddr);
11646     PL_watchok          = PL_watchaddr ? * PL_watchaddr : NULL;
11647     if (PL_debug && PL_watchaddr) {
11648         PerlIO_printf(Perl_debug_log,
11649           "WATCHING: %"UVxf" cloned as %"UVxf" with value %"UVxf"\n",
11650           PTR2UV(proto_perl->Iwatchaddr), PTR2UV(PL_watchaddr),
11651           PTR2UV(PL_watchok));
11652     }
11653
11654     if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
11655         ptr_table_free(PL_ptr_table);
11656         PL_ptr_table = NULL;
11657     }
11658
11659     /* Call the ->CLONE method, if it exists, for each of the stashes
11660        identified by sv_dup() above.
11661     */
11662     while(av_len(param->stashes) != -1) {
11663         HV* const stash = (HV*) av_shift(param->stashes);
11664         GV* const cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
11665         if (cloner && GvCV(cloner)) {
11666             dSP;
11667             ENTER;
11668             SAVETMPS;
11669             PUSHMARK(SP);
11670             XPUSHs(sv_2mortal(newSVhek(HvNAME_HEK(stash))));
11671             PUTBACK;
11672             call_sv((SV*)GvCV(cloner), G_DISCARD);
11673             FREETMPS;
11674             LEAVE;
11675         }
11676     }
11677
11678     SvREFCNT_dec(param->stashes);
11679
11680     /* orphaned? eg threads->new inside BEGIN or use */
11681     if (PL_compcv && ! SvREFCNT(PL_compcv)) {
11682         SvREFCNT_inc_simple_void(PL_compcv);
11683         SAVEFREESV(PL_compcv);
11684     }
11685
11686     return my_perl;
11687 }
11688
11689 #endif /* USE_ITHREADS */
11690
11691 /*
11692 =head1 Unicode Support
11693
11694 =for apidoc sv_recode_to_utf8
11695
11696 The encoding is assumed to be an Encode object, on entry the PV
11697 of the sv is assumed to be octets in that encoding, and the sv
11698 will be converted into Unicode (and UTF-8).
11699
11700 If the sv already is UTF-8 (or if it is not POK), or if the encoding
11701 is not a reference, nothing is done to the sv.  If the encoding is not
11702 an C<Encode::XS> Encoding object, bad things will happen.
11703 (See F<lib/encoding.pm> and L<Encode>).
11704
11705 The PV of the sv is returned.
11706
11707 =cut */
11708
11709 char *
11710 Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
11711 {
11712     dVAR;
11713     if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
11714         SV *uni;
11715         STRLEN len;
11716         const char *s;
11717         dSP;
11718         ENTER;
11719         SAVETMPS;
11720         save_re_context();
11721         PUSHMARK(sp);
11722         EXTEND(SP, 3);
11723         XPUSHs(encoding);
11724         XPUSHs(sv);
11725 /*
11726   NI-S 2002/07/09
11727   Passing sv_yes is wrong - it needs to be or'ed set of constants
11728   for Encode::XS, while UTf-8 decode (currently) assumes a true value means
11729   remove converted chars from source.
11730
11731   Both will default the value - let them.
11732
11733         XPUSHs(&PL_sv_yes);
11734 */
11735         PUTBACK;
11736         call_method("decode", G_SCALAR);
11737         SPAGAIN;
11738         uni = POPs;
11739         PUTBACK;
11740         s = SvPV_const(uni, len);
11741         if (s != SvPVX_const(sv)) {
11742             SvGROW(sv, len + 1);
11743             Move(s, SvPVX(sv), len + 1, char);
11744             SvCUR_set(sv, len);
11745         }
11746         FREETMPS;
11747         LEAVE;
11748         SvUTF8_on(sv);
11749         return SvPVX(sv);
11750     }
11751     return SvPOKp(sv) ? SvPVX(sv) : NULL;
11752 }
11753
11754 /*
11755 =for apidoc sv_cat_decode
11756
11757 The encoding is assumed to be an Encode object, the PV of the ssv is
11758 assumed to be octets in that encoding and decoding the input starts
11759 from the position which (PV + *offset) pointed to.  The dsv will be
11760 concatenated the decoded UTF-8 string from ssv.  Decoding will terminate
11761 when the string tstr appears in decoding output or the input ends on
11762 the PV of the ssv. The value which the offset points will be modified
11763 to the last input position on the ssv.
11764
11765 Returns TRUE if the terminator was found, else returns FALSE.
11766
11767 =cut */
11768
11769 bool
11770 Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
11771                    SV *ssv, int *offset, char *tstr, int tlen)
11772 {
11773     dVAR;
11774     bool ret = FALSE;
11775     if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) {
11776         SV *offsv;
11777         dSP;
11778         ENTER;
11779         SAVETMPS;
11780         save_re_context();
11781         PUSHMARK(sp);
11782         EXTEND(SP, 6);
11783         XPUSHs(encoding);
11784         XPUSHs(dsv);
11785         XPUSHs(ssv);
11786         XPUSHs(offsv = sv_2mortal(newSViv(*offset)));
11787         XPUSHs(newSVpvn_flags(tstr, tlen, SVs_TEMP));
11788         PUTBACK;
11789         call_method("cat_decode", G_SCALAR);
11790         SPAGAIN;
11791         ret = SvTRUE(TOPs);
11792         *offset = SvIV(offsv);
11793         PUTBACK;
11794         FREETMPS;
11795         LEAVE;
11796     }
11797     else
11798         Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
11799     return ret;
11800
11801 }
11802
11803 /* ---------------------------------------------------------------------
11804  *
11805  * support functions for report_uninit()
11806  */
11807
11808 /* the maxiumum size of array or hash where we will scan looking
11809  * for the undefined element that triggered the warning */
11810
11811 #define FUV_MAX_SEARCH_SIZE 1000
11812
11813 /* Look for an entry in the hash whose value has the same SV as val;
11814  * If so, return a mortal copy of the key. */
11815
11816 STATIC SV*
11817 S_find_hash_subscript(pTHX_ HV *hv, SV* val)
11818 {
11819     dVAR;
11820     register HE **array;
11821     I32 i;
11822
11823     if (!hv || SvMAGICAL(hv) || !HvARRAY(hv) ||
11824                         (HvTOTALKEYS(hv) > FUV_MAX_SEARCH_SIZE))
11825         return NULL;
11826
11827     array = HvARRAY(hv);
11828
11829     for (i=HvMAX(hv); i>0; i--) {
11830         register HE *entry;
11831         for (entry = array[i]; entry; entry = HeNEXT(entry)) {
11832             if (HeVAL(entry) != val)
11833                 continue;
11834             if (    HeVAL(entry) == &PL_sv_undef ||
11835                     HeVAL(entry) == &PL_sv_placeholder)
11836                 continue;
11837             if (!HeKEY(entry))
11838                 return NULL;
11839             if (HeKLEN(entry) == HEf_SVKEY)
11840                 return sv_mortalcopy(HeKEY_sv(entry));
11841             return sv_2mortal(newSVhek(HeKEY_hek(entry)));
11842         }
11843     }
11844     return NULL;
11845 }
11846
11847 /* Look for an entry in the array whose value has the same SV as val;
11848  * If so, return the index, otherwise return -1. */
11849
11850 STATIC I32
11851 S_find_array_subscript(pTHX_ AV *av, SV* val)
11852 {
11853     dVAR;
11854     if (!av || SvMAGICAL(av) || !AvARRAY(av) ||
11855                         (AvFILLp(av) > FUV_MAX_SEARCH_SIZE))
11856         return -1;
11857
11858     if (val != &PL_sv_undef) {
11859         SV ** const svp = AvARRAY(av);
11860         I32 i;
11861
11862         for (i=AvFILLp(av); i>=0; i--)
11863             if (svp[i] == val)
11864                 return i;
11865     }
11866     return -1;
11867 }
11868
11869 /* S_varname(): return the name of a variable, optionally with a subscript.
11870  * If gv is non-zero, use the name of that global, along with gvtype (one
11871  * of "$", "@", "%"); otherwise use the name of the lexical at pad offset
11872  * targ.  Depending on the value of the subscript_type flag, return:
11873  */
11874
11875 #define FUV_SUBSCRIPT_NONE      1       /* "@foo"          */
11876 #define FUV_SUBSCRIPT_ARRAY     2       /* "$foo[aindex]"  */
11877 #define FUV_SUBSCRIPT_HASH      3       /* "$foo{keyname}" */
11878 #define FUV_SUBSCRIPT_WITHIN    4       /* "within @foo"   */
11879
11880 STATIC SV*
11881 S_varname(pTHX_ GV *gv, const char gvtype, PADOFFSET targ,
11882         SV* keyname, I32 aindex, int subscript_type)
11883 {
11884
11885     SV * const name = sv_newmortal();
11886     if (gv) {
11887         char buffer[2];
11888         buffer[0] = gvtype;
11889         buffer[1] = 0;
11890
11891         /* as gv_fullname4(), but add literal '^' for $^FOO names  */
11892
11893         gv_fullname4(name, gv, buffer, 0);
11894
11895         if ((unsigned int)SvPVX(name)[1] <= 26) {
11896             buffer[0] = '^';
11897             buffer[1] = SvPVX(name)[1] + 'A' - 1;
11898
11899             /* Swap the 1 unprintable control character for the 2 byte pretty
11900                version - ie substr($name, 1, 1) = $buffer; */
11901             sv_insert(name, 1, 1, buffer, 2);
11902         }
11903     }
11904     else {
11905         CV * const cv = find_runcv(NULL);
11906         SV *sv;
11907         AV *av;
11908
11909         if (!cv || !CvPADLIST(cv))
11910             return NULL;
11911         av = (AV*)(*av_fetch(CvPADLIST(cv), 0, FALSE));
11912         sv = *av_fetch(av, targ, FALSE);
11913         sv_setpvn(name, SvPV_nolen_const(sv), SvCUR(sv));
11914     }
11915
11916     if (subscript_type == FUV_SUBSCRIPT_HASH) {
11917         SV * const sv = newSV(0);
11918         *SvPVX(name) = '$';
11919         Perl_sv_catpvf(aTHX_ name, "{%s}",
11920             pv_display(sv,SvPVX_const(keyname), SvCUR(keyname), 0, 32));
11921         SvREFCNT_dec(sv);
11922     }
11923     else if (subscript_type == FUV_SUBSCRIPT_ARRAY) {
11924         *SvPVX(name) = '$';
11925         Perl_sv_catpvf(aTHX_ name, "[%"IVdf"]", (IV)aindex);
11926     }
11927     else if (subscript_type == FUV_SUBSCRIPT_WITHIN)
11928         Perl_sv_insert(aTHX_ name, 0, 0,  STR_WITH_LEN("within "));
11929
11930     return name;
11931 }
11932
11933
11934 /*
11935 =for apidoc find_uninit_var
11936
11937 Find the name of the undefined variable (if any) that caused the operator o
11938 to issue a "Use of uninitialized value" warning.
11939 If match is true, only return a name if it's value matches uninit_sv.
11940 So roughly speaking, if a unary operator (such as OP_COS) generates a
11941 warning, then following the direct child of the op may yield an
11942 OP_PADSV or OP_GV that gives the name of the undefined variable. On the
11943 other hand, with OP_ADD there are two branches to follow, so we only print
11944 the variable name if we get an exact match.
11945
11946 The name is returned as a mortal SV.
11947
11948 Assumes that PL_op is the op that originally triggered the error, and that
11949 PL_comppad/PL_curpad points to the currently executing pad.
11950
11951 =cut
11952 */
11953
11954 STATIC SV *
11955 S_find_uninit_var(pTHX_ OP* obase, SV* uninit_sv, bool match)
11956 {
11957     dVAR;
11958     SV *sv;
11959     AV *av;
11960     GV *gv;
11961     OP *o, *o2, *kid;
11962
11963     if (!obase || (match && (!uninit_sv || uninit_sv == &PL_sv_undef ||
11964                             uninit_sv == &PL_sv_placeholder)))
11965         return NULL;
11966
11967     switch (obase->op_type) {
11968
11969     case OP_RV2AV:
11970     case OP_RV2HV:
11971     case OP_PADAV:
11972     case OP_PADHV:
11973       {
11974         const bool pad  = (obase->op_type == OP_PADAV || obase->op_type == OP_PADHV);
11975         const bool hash = (obase->op_type == OP_PADHV || obase->op_type == OP_RV2HV);
11976         I32 index = 0;
11977         SV *keysv = NULL;
11978         int subscript_type = FUV_SUBSCRIPT_WITHIN;
11979
11980         if (pad) { /* @lex, %lex */
11981             sv = PAD_SVl(obase->op_targ);
11982             gv = NULL;
11983         }
11984         else {
11985             if (cUNOPx(obase)->op_first->op_type == OP_GV) {
11986             /* @global, %global */
11987                 gv = cGVOPx_gv(cUNOPx(obase)->op_first);
11988                 if (!gv)
11989                     break;
11990                 sv = hash ? (SV*)GvHV(gv): (SV*)GvAV(gv);
11991             }
11992             else /* @{expr}, %{expr} */
11993                 return find_uninit_var(cUNOPx(obase)->op_first,
11994                                                     uninit_sv, match);
11995         }
11996
11997         /* attempt to find a match within the aggregate */
11998         if (hash) {
11999             keysv = find_hash_subscript((HV*)sv, uninit_sv);
12000             if (keysv)
12001                 subscript_type = FUV_SUBSCRIPT_HASH;
12002         }
12003         else {
12004             index = find_array_subscript((AV*)sv, uninit_sv);
12005             if (index >= 0)
12006                 subscript_type = FUV_SUBSCRIPT_ARRAY;
12007         }
12008
12009         if (match && subscript_type == FUV_SUBSCRIPT_WITHIN)
12010             break;
12011
12012         return varname(gv, hash ? '%' : '@', obase->op_targ,
12013                                     keysv, index, subscript_type);
12014       }
12015
12016     case OP_PADSV:
12017         if (match && PAD_SVl(obase->op_targ) != uninit_sv)
12018             break;
12019         return varname(NULL, '$', obase->op_targ,
12020                                     NULL, 0, FUV_SUBSCRIPT_NONE);
12021
12022     case OP_GVSV:
12023         gv = cGVOPx_gv(obase);
12024         if (!gv || (match && GvSV(gv) != uninit_sv))
12025             break;
12026         return varname(gv, '$', 0, NULL, 0, FUV_SUBSCRIPT_NONE);
12027
12028     case OP_AELEMFAST:
12029         if (obase->op_flags & OPf_SPECIAL) { /* lexical array */
12030             if (match) {
12031                 SV **svp;
12032                 av = (AV*)PAD_SV(obase->op_targ);
12033                 if (!av || SvRMAGICAL(av))
12034                     break;
12035                 svp = av_fetch(av, (I32)obase->op_private, FALSE);
12036                 if (!svp || *svp != uninit_sv)
12037                     break;
12038             }
12039             return varname(NULL, '$', obase->op_targ,
12040                     NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
12041         }
12042         else {
12043             gv = cGVOPx_gv(obase);
12044             if (!gv)
12045                 break;
12046             if (match) {
12047                 SV **svp;
12048                 av = GvAV(gv);
12049                 if (!av || SvRMAGICAL(av))
12050                     break;
12051                 svp = av_fetch(av, (I32)obase->op_private, FALSE);
12052                 if (!svp || *svp != uninit_sv)
12053                     break;
12054             }
12055             return varname(gv, '$', 0,
12056                     NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
12057         }
12058         break;
12059
12060     case OP_EXISTS:
12061         o = cUNOPx(obase)->op_first;
12062         if (!o || o->op_type != OP_NULL ||
12063                 ! (o->op_targ == OP_AELEM || o->op_targ == OP_HELEM))
12064             break;
12065         return find_uninit_var(cBINOPo->op_last, uninit_sv, match);
12066
12067     case OP_AELEM:
12068     case OP_HELEM:
12069         if (PL_op == obase)
12070             /* $a[uninit_expr] or $h{uninit_expr} */
12071             return find_uninit_var(cBINOPx(obase)->op_last, uninit_sv, match);
12072
12073         gv = NULL;
12074         o = cBINOPx(obase)->op_first;
12075         kid = cBINOPx(obase)->op_last;
12076
12077         /* get the av or hv, and optionally the gv */
12078         sv = NULL;
12079         if  (o->op_type == OP_PADAV || o->op_type == OP_PADHV) {
12080             sv = PAD_SV(o->op_targ);
12081         }
12082         else if ((o->op_type == OP_RV2AV || o->op_type == OP_RV2HV)
12083                 && cUNOPo->op_first->op_type == OP_GV)
12084         {
12085             gv = cGVOPx_gv(cUNOPo->op_first);
12086             if (!gv)
12087                 break;
12088             sv = o->op_type == OP_RV2HV ? (SV*)GvHV(gv) : (SV*)GvAV(gv);
12089         }
12090         if (!sv)
12091             break;
12092
12093         if (kid && kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid))) {
12094             /* index is constant */
12095             if (match) {
12096                 if (SvMAGICAL(sv))
12097                     break;
12098                 if (obase->op_type == OP_HELEM) {
12099                     HE* he = hv_fetch_ent((HV*)sv, cSVOPx_sv(kid), 0, 0);
12100                     if (!he || HeVAL(he) != uninit_sv)
12101                         break;
12102                 }
12103                 else {
12104                     SV * const * const svp = av_fetch((AV*)sv, SvIV(cSVOPx_sv(kid)), FALSE);
12105                     if (!svp || *svp != uninit_sv)
12106                         break;
12107                 }
12108             }
12109             if (obase->op_type == OP_HELEM)
12110                 return varname(gv, '%', o->op_targ,
12111                             cSVOPx_sv(kid), 0, FUV_SUBSCRIPT_HASH);
12112             else
12113                 return varname(gv, '@', o->op_targ, NULL,
12114                             SvIV(cSVOPx_sv(kid)), FUV_SUBSCRIPT_ARRAY);
12115         }
12116         else  {
12117             /* index is an expression;
12118              * attempt to find a match within the aggregate */
12119             if (obase->op_type == OP_HELEM) {
12120                 SV * const keysv = find_hash_subscript((HV*)sv, uninit_sv);
12121                 if (keysv)
12122                     return varname(gv, '%', o->op_targ,
12123                                                 keysv, 0, FUV_SUBSCRIPT_HASH);
12124             }
12125             else {
12126                 const I32 index = find_array_subscript((AV*)sv, uninit_sv);
12127                 if (index >= 0)
12128                     return varname(gv, '@', o->op_targ,
12129                                         NULL, index, FUV_SUBSCRIPT_ARRAY);
12130             }
12131             if (match)
12132                 break;
12133             return varname(gv,
12134                 (o->op_type == OP_PADAV || o->op_type == OP_RV2AV)
12135                 ? '@' : '%',
12136                 o->op_targ, NULL, 0, FUV_SUBSCRIPT_WITHIN);
12137         }
12138         break;
12139
12140     case OP_AASSIGN:
12141         /* only examine RHS */
12142         return find_uninit_var(cBINOPx(obase)->op_first, uninit_sv, match);
12143
12144     case OP_OPEN:
12145         o = cUNOPx(obase)->op_first;
12146         if (o->op_type == OP_PUSHMARK)
12147             o = o->op_sibling;
12148
12149         if (!o->op_sibling) {
12150             /* one-arg version of open is highly magical */
12151
12152             if (o->op_type == OP_GV) { /* open FOO; */
12153                 gv = cGVOPx_gv(o);
12154                 if (match && GvSV(gv) != uninit_sv)
12155                     break;
12156                 return varname(gv, '$', 0,
12157                             NULL, 0, FUV_SUBSCRIPT_NONE);
12158             }
12159             /* other possibilities not handled are:
12160              * open $x; or open my $x;  should return '${*$x}'
12161              * open expr;               should return '$'.expr ideally
12162              */
12163              break;
12164         }
12165         goto do_op;
12166
12167     /* ops where $_ may be an implicit arg */
12168     case OP_TRANS:
12169     case OP_SUBST:
12170     case OP_MATCH:
12171         if ( !(obase->op_flags & OPf_STACKED)) {
12172             if (uninit_sv == ((obase->op_private & OPpTARGET_MY)
12173                                  ? PAD_SVl(obase->op_targ)
12174                                  : DEFSV))
12175             {
12176                 sv = sv_newmortal();
12177                 sv_setpvn(sv, "$_", 2);
12178                 return sv;
12179             }
12180         }
12181         goto do_op;
12182
12183     case OP_PRTF:
12184     case OP_PRINT:
12185     case OP_SAY:
12186         /* skip filehandle as it can't produce 'undef' warning  */
12187         o = cUNOPx(obase)->op_first;
12188         if ((obase->op_flags & OPf_STACKED) && o->op_type == OP_PUSHMARK)
12189             o = o->op_sibling->op_sibling;
12190         goto do_op2;
12191
12192
12193     case OP_RV2SV:
12194     case OP_CUSTOM:
12195         match = 1; /* XS or custom code could trigger random warnings */
12196         goto do_op;
12197
12198     case OP_ENTERSUB:
12199     case OP_GOTO:
12200         /* XXX tmp hack: these two may call an XS sub, and currently
12201           XS subs don't have a SUB entry on the context stack, so CV and
12202           pad determination goes wrong, and BAD things happen. So, just
12203           don't try to determine the value under those circumstances.
12204           Need a better fix at dome point. DAPM 11/2007 */
12205         break;
12206
12207     case OP_POS:
12208         /* def-ness of rval pos() is independent of the def-ness of its arg */
12209         if ( !(obase->op_flags & OPf_MOD))
12210             break;
12211
12212     case OP_SCHOMP:
12213     case OP_CHOMP:
12214         if (SvROK(PL_rs) && uninit_sv == SvRV(PL_rs))
12215             return newSVpvs_flags("${$/}", SVs_TEMP);
12216         /*FALLTHROUGH*/
12217
12218     default:
12219     do_op:
12220         if (!(obase->op_flags & OPf_KIDS))
12221             break;
12222         o = cUNOPx(obase)->op_first;
12223         
12224     do_op2:
12225         if (!o)
12226             break;
12227
12228         /* if all except one arg are constant, or have no side-effects,
12229          * or are optimized away, then it's unambiguous */
12230         o2 = NULL;
12231         for (kid=o; kid; kid = kid->op_sibling) {
12232             if (kid) {
12233                 const OPCODE type = kid->op_type;
12234                 if ( (type == OP_CONST && SvOK(cSVOPx_sv(kid)))
12235                   || (type == OP_NULL  && ! (kid->op_flags & OPf_KIDS))
12236                   || (type == OP_PUSHMARK)
12237                 )
12238                 continue;
12239             }
12240             if (o2) { /* more than one found */
12241                 o2 = NULL;
12242                 break;
12243             }
12244             o2 = kid;
12245         }
12246         if (o2)
12247             return find_uninit_var(o2, uninit_sv, match);
12248
12249         /* scan all args */
12250         while (o) {
12251             sv = find_uninit_var(o, uninit_sv, 1);
12252             if (sv)
12253                 return sv;
12254             o = o->op_sibling;
12255         }
12256         break;
12257     }
12258     return NULL;
12259 }
12260
12261
12262 /*
12263 =for apidoc report_uninit
12264
12265 Print appropriate "Use of uninitialized variable" warning
12266
12267 =cut
12268 */
12269
12270 void
12271 Perl_report_uninit(pTHX_ SV* uninit_sv)
12272 {
12273     dVAR;
12274     if (PL_op) {
12275         SV* varname = NULL;
12276         if (uninit_sv) {
12277             varname = find_uninit_var(PL_op, uninit_sv,0);
12278             if (varname)
12279                 sv_insert(varname, 0, 0, " ", 1);
12280         }
12281         Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
12282                 varname ? SvPV_nolen_const(varname) : "",
12283                 " in ", OP_DESC(PL_op));
12284     }
12285     else
12286         Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
12287                     "", "", "");
12288 }
12289
12290 /*
12291  * Local variables:
12292  * c-indentation-style: bsd
12293  * c-basic-offset: 4
12294  * indent-tabs-mode: t
12295  * End:
12296  *
12297  * ex: set ts=8 sts=4 sw=4 noet:
12298  */