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