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