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