This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
perldelta: typo fixes and wordsmithing
[perl5.git] / sv.c
1 /*    sv.c
2  *
3  *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4  *    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by Larry Wall
5  *    and others
6  *
7  *    You may distribute under the terms of either the GNU General Public
8  *    License or the Artistic License, as specified in the README file.
9  *
10  */
11
12 /*
13  * 'I wonder what the Entish is for "yes" and "no",' he thought.
14  *                                                      --Pippin
15  *
16  *     [p.480 of _The Lord of the Rings_, III/iv: "Treebeard"]
17  */
18
19 /*
20  *
21  *
22  * This file contains the code that creates, manipulates and destroys
23  * scalar values (SVs). The other types (AV, HV, GV, etc.) reuse the
24  * structure of an SV, so their creation and destruction is handled
25  * here; higher-level functions are in av.c, hv.c, and so on. Opcode
26  * level functions (eg. substr, split, join) for each of the types are
27  * in the pp*.c files.
28  */
29
30 #include "EXTERN.h"
31 #define PERL_IN_SV_C
32 #include "perl.h"
33 #include "regcomp.h"
34 #ifdef __VMS
35 # include <rms.h>
36 #endif
37
38 #ifdef __Lynx__
39 /* Missing proto on LynxOS */
40   char *gconvert(double, int, int,  char *);
41 #endif
42
43 #ifdef USE_QUADMATH
44 #  define SNPRINTF_G(nv, buffer, size, ndig) \
45     quadmath_snprintf(buffer, size, "%.*Qg", (int)ndig, (NV)(nv))
46 #else
47 #  define SNPRINTF_G(nv, buffer, size, ndig) \
48     PERL_UNUSED_RESULT(Gconvert((NV)(nv), (int)ndig, 0, buffer))
49 #endif
50
51 #ifndef SV_COW_THRESHOLD
52 #    define SV_COW_THRESHOLD                    0   /* COW iff len > K */
53 #endif
54 #ifndef SV_COWBUF_THRESHOLD
55 #    define SV_COWBUF_THRESHOLD                 1250 /* COW iff len > K */
56 #endif
57 #ifndef SV_COW_MAX_WASTE_THRESHOLD
58 #    define SV_COW_MAX_WASTE_THRESHOLD          80   /* COW iff (len - cur) < K */
59 #endif
60 #ifndef SV_COWBUF_WASTE_THRESHOLD
61 #    define SV_COWBUF_WASTE_THRESHOLD           80   /* COW iff (len - cur) < K */
62 #endif
63 #ifndef SV_COW_MAX_WASTE_FACTOR_THRESHOLD
64 #    define SV_COW_MAX_WASTE_FACTOR_THRESHOLD   2    /* COW iff len < (cur * K) */
65 #endif
66 #ifndef SV_COWBUF_WASTE_FACTOR_THRESHOLD
67 #    define SV_COWBUF_WASTE_FACTOR_THRESHOLD    2    /* COW iff len < (cur * K) */
68 #endif
69 /* Work around compiler warnings about unsigned >= THRESHOLD when thres-
70    hold is 0. */
71 #if SV_COW_THRESHOLD
72 # define GE_COW_THRESHOLD(cur) ((cur) >= SV_COW_THRESHOLD)
73 #else
74 # define GE_COW_THRESHOLD(cur) 1
75 #endif
76 #if SV_COWBUF_THRESHOLD
77 # define GE_COWBUF_THRESHOLD(cur) ((cur) >= SV_COWBUF_THRESHOLD)
78 #else
79 # define GE_COWBUF_THRESHOLD(cur) 1
80 #endif
81 #if SV_COW_MAX_WASTE_THRESHOLD
82 # define GE_COW_MAX_WASTE_THRESHOLD(cur,len) (((len)-(cur)) < SV_COW_MAX_WASTE_THRESHOLD)
83 #else
84 # define GE_COW_MAX_WASTE_THRESHOLD(cur,len) 1
85 #endif
86 #if SV_COWBUF_WASTE_THRESHOLD
87 # define GE_COWBUF_WASTE_THRESHOLD(cur,len) (((len)-(cur)) < SV_COWBUF_WASTE_THRESHOLD)
88 #else
89 # define GE_COWBUF_WASTE_THRESHOLD(cur,len) 1
90 #endif
91 #if SV_COW_MAX_WASTE_FACTOR_THRESHOLD
92 # define GE_COW_MAX_WASTE_FACTOR_THRESHOLD(cur,len) ((len) < SV_COW_MAX_WASTE_FACTOR_THRESHOLD * (cur))
93 #else
94 # define GE_COW_MAX_WASTE_FACTOR_THRESHOLD(cur,len) 1
95 #endif
96 #if SV_COWBUF_WASTE_FACTOR_THRESHOLD
97 # define GE_COWBUF_WASTE_FACTOR_THRESHOLD(cur,len) ((len) < SV_COWBUF_WASTE_FACTOR_THRESHOLD * (cur))
98 #else
99 # define GE_COWBUF_WASTE_FACTOR_THRESHOLD(cur,len) 1
100 #endif
101
102 #define CHECK_COW_THRESHOLD(cur,len) (\
103     GE_COW_THRESHOLD((cur)) && \
104     GE_COW_MAX_WASTE_THRESHOLD((cur),(len)) && \
105     GE_COW_MAX_WASTE_FACTOR_THRESHOLD((cur),(len)) \
106 )
107 #define CHECK_COWBUF_THRESHOLD(cur,len) (\
108     GE_COWBUF_THRESHOLD((cur)) && \
109     GE_COWBUF_WASTE_THRESHOLD((cur),(len)) && \
110     GE_COWBUF_WASTE_FACTOR_THRESHOLD((cur),(len)) \
111 )
112
113 #ifdef PERL_UTF8_CACHE_ASSERT
114 /* if adding more checks watch out for the following tests:
115  *   t/op/index.t t/op/length.t t/op/pat.t t/op/substr.t
116  *   lib/utf8.t lib/Unicode/Collate/t/index.t
117  * --jhi
118  */
119 #   define ASSERT_UTF8_CACHE(cache) \
120     STMT_START { if (cache) { assert((cache)[0] <= (cache)[1]); \
121                               assert((cache)[2] <= (cache)[3]); \
122                               assert((cache)[3] <= (cache)[1]);} \
123                               } STMT_END
124 #else
125 #   define ASSERT_UTF8_CACHE(cache) NOOP
126 #endif
127
128 #ifdef PERL_OLD_COPY_ON_WRITE
129 #define SV_COW_NEXT_SV(sv)      INT2PTR(SV *,SvUVX(sv))
130 #define SV_COW_NEXT_SV_SET(current,next)        SvUV_set(current, PTR2UV(next))
131 #endif
132
133 /* ============================================================================
134
135 =head1 Allocation and deallocation of SVs.
136 An SV (or AV, HV, etc.) is allocated in two parts: the head (struct
137 sv, av, hv...) contains type and reference count information, and for
138 many types, a pointer to the body (struct xrv, xpv, xpviv...), which
139 contains fields specific to each type.  Some types store all they need
140 in the head, so don't have a body.
141
142 In all but the most memory-paranoid configurations (ex: PURIFY), heads
143 and bodies are allocated out of arenas, which by default are
144 approximately 4K chunks of memory parcelled up into N heads or bodies.
145 Sv-bodies are allocated by their sv-type, guaranteeing size
146 consistency needed to allocate safely from arrays.
147
148 For SV-heads, the first slot in each arena is reserved, and holds a
149 link to the next arena, some flags, and a note of the number of slots.
150 Snaked through each arena chain is a linked list of free items; when
151 this becomes empty, an extra arena is allocated and divided up into N
152 items which are threaded into the free list.
153
154 SV-bodies are similar, but they use arena-sets by default, which
155 separate the link and info from the arena itself, and reclaim the 1st
156 slot in the arena.  SV-bodies are further described later.
157
158 The following global variables are associated with arenas:
159
160  PL_sv_arenaroot     pointer to list of SV arenas
161  PL_sv_root          pointer to list of free SV structures
162
163  PL_body_arenas      head of linked-list of body arenas
164  PL_body_roots[]     array of pointers to list of free bodies of svtype
165                      arrays are indexed by the svtype needed
166
167 A few special SV heads are not allocated from an arena, but are
168 instead directly created in the interpreter structure, eg PL_sv_undef.
169 The size of arenas can be changed from the default by setting
170 PERL_ARENA_SIZE appropriately at compile time.
171
172 The SV arena serves the secondary purpose of allowing still-live SVs
173 to be located and destroyed during final cleanup.
174
175 At the lowest level, the macros new_SV() and del_SV() grab and free
176 an SV head.  (If debugging with -DD, del_SV() calls the function S_del_sv()
177 to return the SV to the free list with error checking.) new_SV() calls
178 more_sv() / sv_add_arena() to add an extra arena if the free list is empty.
179 SVs in the free list have their SvTYPE field set to all ones.
180
181 At the time of very final cleanup, sv_free_arenas() is called from
182 perl_destruct() to physically free all the arenas allocated since the
183 start of the interpreter.
184
185 The function visit() scans the SV arenas list, and calls a specified
186 function for each SV it finds which is still live - ie which has an SvTYPE
187 other than all 1's, and a non-zero SvREFCNT. visit() is used by the
188 following functions (specified as [function that calls visit()] / [function
189 called by visit() for each SV]):
190
191     sv_report_used() / do_report_used()
192                         dump all remaining SVs (debugging aid)
193
194     sv_clean_objs() / do_clean_objs(),do_clean_named_objs(),
195                       do_clean_named_io_objs(),do_curse()
196                         Attempt to free all objects pointed to by RVs,
197                         try to do the same for all objects indir-
198                         ectly referenced by typeglobs too, and
199                         then do a final sweep, cursing any
200                         objects that remain.  Called once from
201                         perl_destruct(), prior to calling sv_clean_all()
202                         below.
203
204     sv_clean_all() / do_clean_all()
205                         SvREFCNT_dec(sv) each remaining SV, possibly
206                         triggering an sv_free(). It also sets the
207                         SVf_BREAK flag on the SV to indicate that the
208                         refcnt has been artificially lowered, and thus
209                         stopping sv_free() from giving spurious warnings
210                         about SVs which unexpectedly have a refcnt
211                         of zero.  called repeatedly from perl_destruct()
212                         until there are no SVs left.
213
214 =head2 Arena allocator API Summary
215
216 Private API to rest of sv.c
217
218     new_SV(),  del_SV(),
219
220     new_XPVNV(), del_XPVGV(),
221     etc
222
223 Public API:
224
225     sv_report_used(), sv_clean_objs(), sv_clean_all(), sv_free_arenas()
226
227 =cut
228
229  * ========================================================================= */
230
231 /*
232  * "A time to plant, and a time to uproot what was planted..."
233  */
234
235 #ifdef PERL_MEM_LOG
236 #  define MEM_LOG_NEW_SV(sv, file, line, func)  \
237             Perl_mem_log_new_sv(sv, file, line, func)
238 #  define MEM_LOG_DEL_SV(sv, file, line, func)  \
239             Perl_mem_log_del_sv(sv, file, line, func)
240 #else
241 #  define MEM_LOG_NEW_SV(sv, file, line, func)  NOOP
242 #  define MEM_LOG_DEL_SV(sv, file, line, func)  NOOP
243 #endif
244
245 #ifdef DEBUG_LEAKING_SCALARS
246 #  define FREE_SV_DEBUG_FILE(sv) STMT_START { \
247         if ((sv)->sv_debug_file) PerlMemShared_free((sv)->sv_debug_file); \
248     } STMT_END
249 #  define DEBUG_SV_SERIAL(sv)                                               \
250     DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) del_SV\n",    \
251             PTR2UV(sv), (long)(sv)->sv_debug_serial))
252 #else
253 #  define FREE_SV_DEBUG_FILE(sv)
254 #  define DEBUG_SV_SERIAL(sv)   NOOP
255 #endif
256
257 #ifdef PERL_POISON
258 #  define SvARENA_CHAIN(sv)     ((sv)->sv_u.svu_rv)
259 #  define SvARENA_CHAIN_SET(sv,val)     (sv)->sv_u.svu_rv = MUTABLE_SV((val))
260 /* Whilst I'd love to do this, it seems that things like to check on
261    unreferenced scalars
262 #  define POISON_SV_HEAD(sv)    PoisonNew(sv, 1, struct STRUCT_SV)
263 */
264 #  define POISON_SV_HEAD(sv)    PoisonNew(&SvANY(sv), 1, void *), \
265                                 PoisonNew(&SvREFCNT(sv), 1, U32)
266 #else
267 #  define SvARENA_CHAIN(sv)     SvANY(sv)
268 #  define SvARENA_CHAIN_SET(sv,val)     SvANY(sv) = (void *)(val)
269 #  define POISON_SV_HEAD(sv)
270 #endif
271
272 /* Mark an SV head as unused, and add to free list.
273  *
274  * If SVf_BREAK is set, skip adding it to the free list, as this SV had
275  * its refcount artificially decremented during global destruction, so
276  * there may be dangling pointers to it. The last thing we want in that
277  * case is for it to be reused. */
278
279 #define plant_SV(p) \
280     STMT_START {                                        \
281         const U32 old_flags = SvFLAGS(p);                       \
282         MEM_LOG_DEL_SV(p, __FILE__, __LINE__, FUNCTION__);  \
283         DEBUG_SV_SERIAL(p);                             \
284         FREE_SV_DEBUG_FILE(p);                          \
285         POISON_SV_HEAD(p);                              \
286         SvFLAGS(p) = SVTYPEMASK;                        \
287         if (!(old_flags & SVf_BREAK)) {         \
288             SvARENA_CHAIN_SET(p, PL_sv_root);   \
289             PL_sv_root = (p);                           \
290         }                                               \
291         --PL_sv_count;                                  \
292     } STMT_END
293
294 #define uproot_SV(p) \
295     STMT_START {                                        \
296         (p) = PL_sv_root;                               \
297         PL_sv_root = MUTABLE_SV(SvARENA_CHAIN(p));              \
298         ++PL_sv_count;                                  \
299     } STMT_END
300
301
302 /* make some more SVs by adding another arena */
303
304 STATIC SV*
305 S_more_sv(pTHX)
306 {
307     SV* sv;
308     char *chunk;                /* must use New here to match call to */
309     Newx(chunk,PERL_ARENA_SIZE,char);  /* Safefree() in sv_free_arenas() */
310     sv_add_arena(chunk, PERL_ARENA_SIZE, 0);
311     uproot_SV(sv);
312     return sv;
313 }
314
315 /* new_SV(): return a new, empty SV head */
316
317 #ifdef DEBUG_LEAKING_SCALARS
318 /* provide a real function for a debugger to play with */
319 STATIC SV*
320 S_new_SV(pTHX_ const char *file, int line, const char *func)
321 {
322     SV* sv;
323
324     if (PL_sv_root)
325         uproot_SV(sv);
326     else
327         sv = S_more_sv(aTHX);
328     SvANY(sv) = 0;
329     SvREFCNT(sv) = 1;
330     SvFLAGS(sv) = 0;
331     sv->sv_debug_optype = PL_op ? PL_op->op_type : 0;
332     sv->sv_debug_line = (U16) (PL_parser && PL_parser->copline != NOLINE
333                 ? PL_parser->copline
334                 :  PL_curcop
335                     ? CopLINE(PL_curcop)
336                     : 0
337             );
338     sv->sv_debug_inpad = 0;
339     sv->sv_debug_parent = NULL;
340     sv->sv_debug_file = PL_curcop ? savesharedpv(CopFILE(PL_curcop)): NULL;
341
342     sv->sv_debug_serial = PL_sv_serial++;
343
344     MEM_LOG_NEW_SV(sv, file, line, func);
345     DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) new_SV (from %s:%d [%s])\n",
346             PTR2UV(sv), (long)sv->sv_debug_serial, file, line, func));
347
348     return sv;
349 }
350 #  define new_SV(p) (p)=S_new_SV(aTHX_ __FILE__, __LINE__, FUNCTION__)
351
352 #else
353 #  define new_SV(p) \
354     STMT_START {                                        \
355         if (PL_sv_root)                                 \
356             uproot_SV(p);                               \
357         else                                            \
358             (p) = S_more_sv(aTHX);                      \
359         SvANY(p) = 0;                                   \
360         SvREFCNT(p) = 1;                                \
361         SvFLAGS(p) = 0;                                 \
362         MEM_LOG_NEW_SV(p, __FILE__, __LINE__, FUNCTION__);  \
363     } STMT_END
364 #endif
365
366
367 /* del_SV(): return an empty SV head to the free list */
368
369 #ifdef DEBUGGING
370
371 #define del_SV(p) \
372     STMT_START {                                        \
373         if (DEBUG_D_TEST)                               \
374             del_sv(p);                                  \
375         else                                            \
376             plant_SV(p);                                \
377     } STMT_END
378
379 STATIC void
380 S_del_sv(pTHX_ SV *p)
381 {
382     PERL_ARGS_ASSERT_DEL_SV;
383
384     if (DEBUG_D_TEST) {
385         SV* sva;
386         bool ok = 0;
387         for (sva = PL_sv_arenaroot; sva; sva = MUTABLE_SV(SvANY(sva))) {
388             const SV * const sv = sva + 1;
389             const SV * const svend = &sva[SvREFCNT(sva)];
390             if (p >= sv && p < svend) {
391                 ok = 1;
392                 break;
393             }
394         }
395         if (!ok) {
396             Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),
397                              "Attempt to free non-arena SV: 0x%"UVxf
398                              pTHX__FORMAT, PTR2UV(p) pTHX__VALUE);
399             return;
400         }
401     }
402     plant_SV(p);
403 }
404
405 #else /* ! DEBUGGING */
406
407 #define del_SV(p)   plant_SV(p)
408
409 #endif /* DEBUGGING */
410
411 /*
412  * Bodyless IVs and NVs!
413  *
414  * Since 5.9.2, we can avoid allocating a body for SVt_IV-type SVs.
415  * Since the larger IV-holding variants of SVs store their integer
416  * values in their respective bodies, the family of SvIV() accessor
417  * macros would  naively have to branch on the SV type to find the
418  * integer value either in the HEAD or BODY. In order to avoid this
419  * expensive branch, a clever soul has deployed a great hack:
420  * We set up the SvANY pointer such that instead of pointing to a
421  * real body, it points into the memory before the location of the
422  * head. We compute this pointer such that the location of
423  * the integer member of the hypothetical body struct happens to
424  * be the same as the location of the integer member of the bodyless
425  * SV head. This now means that the SvIV() family of accessors can
426  * always read from the (hypothetical or real) body via SvANY.
427  *
428  * Since the 5.21 dev series, we employ the same trick for NVs
429  * if the architecture can support it (NVSIZE <= IVSIZE).
430  */
431
432 /* The following two macros compute the necessary offsets for the above
433  * trick and store them in SvANY for SvIV() (and friends) to use. */
434 #define SET_SVANY_FOR_BODYLESS_IV(sv) \
435         SvANY(sv) = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv))
436
437 #define SET_SVANY_FOR_BODYLESS_NV(sv) \
438         SvANY(sv) = (XPVNV*)((char*)&(sv->sv_u.svu_nv) - STRUCT_OFFSET(XPVNV, xnv_u.xnv_nv))
439
440 /*
441 =head1 SV Manipulation Functions
442
443 =for apidoc sv_add_arena
444
445 Given a chunk of memory, link it to the head of the list of arenas,
446 and split it into a list of free SVs.
447
448 =cut
449 */
450
451 static void
452 S_sv_add_arena(pTHX_ char *const ptr, const U32 size, const U32 flags)
453 {
454     SV *const sva = MUTABLE_SV(ptr);
455     SV* sv;
456     SV* svend;
457
458     PERL_ARGS_ASSERT_SV_ADD_ARENA;
459
460     /* The first SV in an arena isn't an SV. */
461     SvANY(sva) = (void *) PL_sv_arenaroot;              /* ptr to next arena */
462     SvREFCNT(sva) = size / sizeof(SV);          /* number of SV slots */
463     SvFLAGS(sva) = flags;                       /* FAKE if not to be freed */
464
465     PL_sv_arenaroot = sva;
466     PL_sv_root = sva + 1;
467
468     svend = &sva[SvREFCNT(sva) - 1];
469     sv = sva + 1;
470     while (sv < svend) {
471         SvARENA_CHAIN_SET(sv, (sv + 1));
472 #ifdef DEBUGGING
473         SvREFCNT(sv) = 0;
474 #endif
475         /* Must always set typemask because it's always checked in on cleanup
476            when the arenas are walked looking for objects.  */
477         SvFLAGS(sv) = SVTYPEMASK;
478         sv++;
479     }
480     SvARENA_CHAIN_SET(sv, 0);
481 #ifdef DEBUGGING
482     SvREFCNT(sv) = 0;
483 #endif
484     SvFLAGS(sv) = SVTYPEMASK;
485 }
486
487 /* visit(): call the named function for each non-free SV in the arenas
488  * whose flags field matches the flags/mask args. */
489
490 STATIC I32
491 S_visit(pTHX_ SVFUNC_t f, const U32 flags, const U32 mask)
492 {
493     SV* sva;
494     I32 visited = 0;
495
496     PERL_ARGS_ASSERT_VISIT;
497
498     for (sva = PL_sv_arenaroot; sva; sva = MUTABLE_SV(SvANY(sva))) {
499         const SV * const svend = &sva[SvREFCNT(sva)];
500         SV* sv;
501         for (sv = sva + 1; sv < svend; ++sv) {
502             if (SvTYPE(sv) != (svtype)SVTYPEMASK
503                     && (sv->sv_flags & mask) == flags
504                     && SvREFCNT(sv))
505             {
506                 (*f)(aTHX_ sv);
507                 ++visited;
508             }
509         }
510     }
511     return visited;
512 }
513
514 #ifdef DEBUGGING
515
516 /* called by sv_report_used() for each live SV */
517
518 static void
519 do_report_used(pTHX_ SV *const sv)
520 {
521     if (SvTYPE(sv) != (svtype)SVTYPEMASK) {
522         PerlIO_printf(Perl_debug_log, "****\n");
523         sv_dump(sv);
524     }
525 }
526 #endif
527
528 /*
529 =for apidoc sv_report_used
530
531 Dump the contents of all SVs not yet freed (debugging aid).
532
533 =cut
534 */
535
536 void
537 Perl_sv_report_used(pTHX)
538 {
539 #ifdef DEBUGGING
540     visit(do_report_used, 0, 0);
541 #else
542     PERL_UNUSED_CONTEXT;
543 #endif
544 }
545
546 /* called by sv_clean_objs() for each live SV */
547
548 static void
549 do_clean_objs(pTHX_ SV *const ref)
550 {
551     assert (SvROK(ref));
552     {
553         SV * const target = SvRV(ref);
554         if (SvOBJECT(target)) {
555             DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(ref)));
556             if (SvWEAKREF(ref)) {
557                 sv_del_backref(target, ref);
558                 SvWEAKREF_off(ref);
559                 SvRV_set(ref, NULL);
560             } else {
561                 SvROK_off(ref);
562                 SvRV_set(ref, NULL);
563                 SvREFCNT_dec_NN(target);
564             }
565         }
566     }
567 }
568
569
570 /* clear any slots in a GV which hold objects - except IO;
571  * called by sv_clean_objs() for each live GV */
572
573 static void
574 do_clean_named_objs(pTHX_ SV *const sv)
575 {
576     SV *obj;
577     assert(SvTYPE(sv) == SVt_PVGV);
578     assert(isGV_with_GP(sv));
579     if (!GvGP(sv))
580         return;
581
582     /* freeing GP entries may indirectly free the current GV;
583      * hold onto it while we mess with the GP slots */
584     SvREFCNT_inc(sv);
585
586     if ( ((obj = GvSV(sv) )) && SvOBJECT(obj)) {
587         DEBUG_D((PerlIO_printf(Perl_debug_log,
588                 "Cleaning named glob SV object:\n "), sv_dump(obj)));
589         GvSV(sv) = NULL;
590         SvREFCNT_dec_NN(obj);
591     }
592     if ( ((obj = MUTABLE_SV(GvAV(sv)) )) && SvOBJECT(obj)) {
593         DEBUG_D((PerlIO_printf(Perl_debug_log,
594                 "Cleaning named glob AV object:\n "), sv_dump(obj)));
595         GvAV(sv) = NULL;
596         SvREFCNT_dec_NN(obj);
597     }
598     if ( ((obj = MUTABLE_SV(GvHV(sv)) )) && SvOBJECT(obj)) {
599         DEBUG_D((PerlIO_printf(Perl_debug_log,
600                 "Cleaning named glob HV object:\n "), sv_dump(obj)));
601         GvHV(sv) = NULL;
602         SvREFCNT_dec_NN(obj);
603     }
604     if ( ((obj = MUTABLE_SV(GvCV(sv)) )) && SvOBJECT(obj)) {
605         DEBUG_D((PerlIO_printf(Perl_debug_log,
606                 "Cleaning named glob CV object:\n "), sv_dump(obj)));
607         GvCV_set(sv, NULL);
608         SvREFCNT_dec_NN(obj);
609     }
610     SvREFCNT_dec_NN(sv); /* undo the inc above */
611 }
612
613 /* clear any IO slots in a GV which hold objects (except stderr, defout);
614  * called by sv_clean_objs() for each live GV */
615
616 static void
617 do_clean_named_io_objs(pTHX_ SV *const sv)
618 {
619     SV *obj;
620     assert(SvTYPE(sv) == SVt_PVGV);
621     assert(isGV_with_GP(sv));
622     if (!GvGP(sv) || sv == (SV*)PL_stderrgv || sv == (SV*)PL_defoutgv)
623         return;
624
625     SvREFCNT_inc(sv);
626     if ( ((obj = MUTABLE_SV(GvIO(sv)) )) && SvOBJECT(obj)) {
627         DEBUG_D((PerlIO_printf(Perl_debug_log,
628                 "Cleaning named glob IO object:\n "), sv_dump(obj)));
629         GvIOp(sv) = NULL;
630         SvREFCNT_dec_NN(obj);
631     }
632     SvREFCNT_dec_NN(sv); /* undo the inc above */
633 }
634
635 /* Void wrapper to pass to visit() */
636 static void
637 do_curse(pTHX_ SV * const sv) {
638     if ((PL_stderrgv && GvGP(PL_stderrgv) && (SV*)GvIO(PL_stderrgv) == sv)
639      || (PL_defoutgv && GvGP(PL_defoutgv) && (SV*)GvIO(PL_defoutgv) == sv))
640         return;
641     (void)curse(sv, 0);
642 }
643
644 /*
645 =for apidoc sv_clean_objs
646
647 Attempt to destroy all objects not yet freed.
648
649 =cut
650 */
651
652 void
653 Perl_sv_clean_objs(pTHX)
654 {
655     GV *olddef, *olderr;
656     PL_in_clean_objs = TRUE;
657     visit(do_clean_objs, SVf_ROK, SVf_ROK);
658     /* Some barnacles may yet remain, clinging to typeglobs.
659      * Run the non-IO destructors first: they may want to output
660      * error messages, close files etc */
661     visit(do_clean_named_objs, SVt_PVGV|SVpgv_GP, SVTYPEMASK|SVp_POK|SVpgv_GP);
662     visit(do_clean_named_io_objs, SVt_PVGV|SVpgv_GP, SVTYPEMASK|SVp_POK|SVpgv_GP);
663     /* And if there are some very tenacious barnacles clinging to arrays,
664        closures, or what have you.... */
665     visit(do_curse, SVs_OBJECT, SVs_OBJECT);
666     olddef = PL_defoutgv;
667     PL_defoutgv = NULL; /* disable skip of PL_defoutgv */
668     if (olddef && isGV_with_GP(olddef))
669         do_clean_named_io_objs(aTHX_ MUTABLE_SV(olddef));
670     olderr = PL_stderrgv;
671     PL_stderrgv = NULL; /* disable skip of PL_stderrgv */
672     if (olderr && isGV_with_GP(olderr))
673         do_clean_named_io_objs(aTHX_ MUTABLE_SV(olderr));
674     SvREFCNT_dec(olddef);
675     PL_in_clean_objs = FALSE;
676 }
677
678 /* called by sv_clean_all() for each live SV */
679
680 static void
681 do_clean_all(pTHX_ SV *const sv)
682 {
683     if (sv == (const SV *) PL_fdpid || sv == (const SV *)PL_strtab) {
684         /* don't clean pid table and strtab */
685         return;
686     }
687     DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%"UVxf"\n", PTR2UV(sv)) ));
688     SvFLAGS(sv) |= SVf_BREAK;
689     SvREFCNT_dec_NN(sv);
690 }
691
692 /*
693 =for apidoc sv_clean_all
694
695 Decrement the refcnt of each remaining SV, possibly triggering a
696 cleanup.  This function may have to be called multiple times to free
697 SVs which are in complex self-referential hierarchies.
698
699 =cut
700 */
701
702 I32
703 Perl_sv_clean_all(pTHX)
704 {
705     I32 cleaned;
706     PL_in_clean_all = TRUE;
707     cleaned = visit(do_clean_all, 0,0);
708     return cleaned;
709 }
710
711 /*
712   ARENASETS: a meta-arena implementation which separates arena-info
713   into struct arena_set, which contains an array of struct
714   arena_descs, each holding info for a single arena.  By separating
715   the meta-info from the arena, we recover the 1st slot, formerly
716   borrowed for list management.  The arena_set is about the size of an
717   arena, avoiding the needless malloc overhead of a naive linked-list.
718
719   The cost is 1 arena-set malloc per ~320 arena-mallocs, + the unused
720   memory in the last arena-set (1/2 on average).  In trade, we get
721   back the 1st slot in each arena (ie 1.7% of a CV-arena, less for
722   smaller types).  The recovery of the wasted space allows use of
723   small arenas for large, rare body types, by changing array* fields
724   in body_details_by_type[] below.
725 */
726 struct arena_desc {
727     char       *arena;          /* the raw storage, allocated aligned */
728     size_t      size;           /* its size ~4k typ */
729     svtype      utype;          /* bodytype stored in arena */
730 };
731
732 struct arena_set;
733
734 /* Get the maximum number of elements in set[] such that struct arena_set
735    will fit within PERL_ARENA_SIZE, which is probably just under 4K, and
736    therefore likely to be 1 aligned memory page.  */
737
738 #define ARENAS_PER_SET  ((PERL_ARENA_SIZE - sizeof(struct arena_set*) \
739                           - 2 * sizeof(int)) / sizeof (struct arena_desc))
740
741 struct arena_set {
742     struct arena_set* next;
743     unsigned int   set_size;    /* ie ARENAS_PER_SET */
744     unsigned int   curr;        /* index of next available arena-desc */
745     struct arena_desc set[ARENAS_PER_SET];
746 };
747
748 /*
749 =for apidoc sv_free_arenas
750
751 Deallocate the memory used by all arenas.  Note that all the individual SV
752 heads and bodies within the arenas must already have been freed.
753
754 =cut
755
756 */
757 void
758 Perl_sv_free_arenas(pTHX)
759 {
760     SV* sva;
761     SV* svanext;
762     unsigned int i;
763
764     /* Free arenas here, but be careful about fake ones.  (We assume
765        contiguity of the fake ones with the corresponding real ones.) */
766
767     for (sva = PL_sv_arenaroot; sva; sva = svanext) {
768         svanext = MUTABLE_SV(SvANY(sva));
769         while (svanext && SvFAKE(svanext))
770             svanext = MUTABLE_SV(SvANY(svanext));
771
772         if (!SvFAKE(sva))
773             Safefree(sva);
774     }
775
776     {
777         struct arena_set *aroot = (struct arena_set*) PL_body_arenas;
778
779         while (aroot) {
780             struct arena_set *current = aroot;
781             i = aroot->curr;
782             while (i--) {
783                 assert(aroot->set[i].arena);
784                 Safefree(aroot->set[i].arena);
785             }
786             aroot = aroot->next;
787             Safefree(current);
788         }
789     }
790     PL_body_arenas = 0;
791
792     i = PERL_ARENA_ROOTS_SIZE;
793     while (i--)
794         PL_body_roots[i] = 0;
795
796     PL_sv_arenaroot = 0;
797     PL_sv_root = 0;
798 }
799
800 /*
801   Here are mid-level routines that manage the allocation of bodies out
802   of the various arenas.  There are 5 kinds of arenas:
803
804   1. SV-head arenas, which are discussed and handled above
805   2. regular body arenas
806   3. arenas for reduced-size bodies
807   4. Hash-Entry arenas
808
809   Arena types 2 & 3 are chained by body-type off an array of
810   arena-root pointers, which is indexed by svtype.  Some of the
811   larger/less used body types are malloced singly, since a large
812   unused block of them is wasteful.  Also, several svtypes dont have
813   bodies; the data fits into the sv-head itself.  The arena-root
814   pointer thus has a few unused root-pointers (which may be hijacked
815   later for arena types 4,5)
816
817   3 differs from 2 as an optimization; some body types have several
818   unused fields in the front of the structure (which are kept in-place
819   for consistency).  These bodies can be allocated in smaller chunks,
820   because the leading fields arent accessed.  Pointers to such bodies
821   are decremented to point at the unused 'ghost' memory, knowing that
822   the pointers are used with offsets to the real memory.
823
824
825 =head1 SV-Body Allocation
826
827 =cut
828
829 Allocation of SV-bodies is similar to SV-heads, differing as follows;
830 the allocation mechanism is used for many body types, so is somewhat
831 more complicated, it uses arena-sets, and has no need for still-live
832 SV detection.
833
834 At the outermost level, (new|del)_X*V macros return bodies of the
835 appropriate type.  These macros call either (new|del)_body_type or
836 (new|del)_body_allocated macro pairs, depending on specifics of the
837 type.  Most body types use the former pair, the latter pair is used to
838 allocate body types with "ghost fields".
839
840 "ghost fields" are fields that are unused in certain types, and
841 consequently don't need to actually exist.  They are declared because
842 they're part of a "base type", which allows use of functions as
843 methods.  The simplest examples are AVs and HVs, 2 aggregate types
844 which don't use the fields which support SCALAR semantics.
845
846 For these types, the arenas are carved up into appropriately sized
847 chunks, we thus avoid wasted memory for those unaccessed members.
848 When bodies are allocated, we adjust the pointer back in memory by the
849 size of the part not allocated, so it's as if we allocated the full
850 structure.  (But things will all go boom if you write to the part that
851 is "not there", because you'll be overwriting the last members of the
852 preceding structure in memory.)
853
854 We calculate the correction using the STRUCT_OFFSET macro on the first
855 member present.  If the allocated structure is smaller (no initial NV
856 actually allocated) then the net effect is to subtract the size of the NV
857 from the pointer, to return a new pointer as if an initial NV were actually
858 allocated.  (We were using structures named *_allocated for this, but
859 this turned out to be a subtle bug, because a structure without an NV
860 could have a lower alignment constraint, but the compiler is allowed to
861 optimised accesses based on the alignment constraint of the actual pointer
862 to the full structure, for example, using a single 64 bit load instruction
863 because it "knows" that two adjacent 32 bit members will be 8-byte aligned.)
864
865 This is the same trick as was used for NV and IV bodies.  Ironically it
866 doesn't need to be used for NV bodies any more, because NV is now at
867 the start of the structure.  IV bodies, and also in some builds NV bodies,
868 don't need it either, because they are no longer allocated.
869
870 In turn, the new_body_* allocators call S_new_body(), which invokes
871 new_body_inline macro, which takes a lock, and takes a body off the
872 linked list at PL_body_roots[sv_type], calling Perl_more_bodies() if
873 necessary to refresh an empty list.  Then the lock is released, and
874 the body is returned.
875
876 Perl_more_bodies allocates a new arena, and carves it up into an array of N
877 bodies, which it strings into a linked list.  It looks up arena-size
878 and body-size from the body_details table described below, thus
879 supporting the multiple body-types.
880
881 If PURIFY is defined, or PERL_ARENA_SIZE=0, arenas are not used, and
882 the (new|del)_X*V macros are mapped directly to malloc/free.
883
884 For each sv-type, struct body_details bodies_by_type[] carries
885 parameters which control these aspects of SV handling:
886
887 Arena_size determines whether arenas are used for this body type, and if
888 so, how big they are.  PURIFY or PERL_ARENA_SIZE=0 set this field to
889 zero, forcing individual mallocs and frees.
890
891 Body_size determines how big a body is, and therefore how many fit into
892 each arena.  Offset carries the body-pointer adjustment needed for
893 "ghost fields", and is used in *_allocated macros.
894
895 But its main purpose is to parameterize info needed in
896 Perl_sv_upgrade().  The info here dramatically simplifies the function
897 vs the implementation in 5.8.8, making it table-driven.  All fields
898 are used for this, except for arena_size.
899
900 For the sv-types that have no bodies, arenas are not used, so those
901 PL_body_roots[sv_type] are unused, and can be overloaded.  In
902 something of a special case, SVt_NULL is borrowed for HE arenas;
903 PL_body_roots[HE_SVSLOT=SVt_NULL] is filled by S_more_he, but the
904 bodies_by_type[SVt_NULL] slot is not used, as the table is not
905 available in hv.c.
906
907 */
908
909 struct body_details {
910     U8 body_size;       /* Size to allocate  */
911     U8 copy;            /* Size of structure to copy (may be shorter)  */
912     U8 offset;          /* Size of unalloced ghost fields to first alloced field*/
913     PERL_BITFIELD8 type : 4;        /* We have space for a sanity check. */
914     PERL_BITFIELD8 cant_upgrade : 1;/* Cannot upgrade this type */
915     PERL_BITFIELD8 zero_nv : 1;     /* zero the NV when upgrading from this */
916     PERL_BITFIELD8 arena : 1;       /* Allocated from an arena */
917     U32 arena_size;                 /* Size of arena to allocate */
918 };
919
920 #define HADNV FALSE
921 #define NONV TRUE
922
923
924 #ifdef PURIFY
925 /* With -DPURFIY we allocate everything directly, and don't use arenas.
926    This seems a rather elegant way to simplify some of the code below.  */
927 #define HASARENA FALSE
928 #else
929 #define HASARENA TRUE
930 #endif
931 #define NOARENA FALSE
932
933 /* Size the arenas to exactly fit a given number of bodies.  A count
934    of 0 fits the max number bodies into a PERL_ARENA_SIZE.block,
935    simplifying the default.  If count > 0, the arena is sized to fit
936    only that many bodies, allowing arenas to be used for large, rare
937    bodies (XPVFM, XPVIO) without undue waste.  The arena size is
938    limited by PERL_ARENA_SIZE, so we can safely oversize the
939    declarations.
940  */
941 #define FIT_ARENA0(body_size)                           \
942     ((size_t)(PERL_ARENA_SIZE / body_size) * body_size)
943 #define FIT_ARENAn(count,body_size)                     \
944     ( count * body_size <= PERL_ARENA_SIZE)             \
945     ? count * body_size                                 \
946     : FIT_ARENA0 (body_size)
947 #define FIT_ARENA(count,body_size)                      \
948    (U32)(count                                          \
949     ? FIT_ARENAn (count, body_size)                     \
950     : FIT_ARENA0 (body_size))
951
952 /* Calculate the length to copy. Specifically work out the length less any
953    final padding the compiler needed to add.  See the comment in sv_upgrade
954    for why copying the padding proved to be a bug.  */
955
956 #define copy_length(type, last_member) \
957         STRUCT_OFFSET(type, last_member) \
958         + sizeof (((type*)SvANY((const SV *)0))->last_member)
959
960 static const struct body_details bodies_by_type[] = {
961     /* HEs use this offset for their arena.  */
962     { 0, 0, 0, SVt_NULL, FALSE, NONV, NOARENA, 0 },
963
964     /* IVs are in the head, so the allocation size is 0.  */
965     { 0,
966       sizeof(IV), /* This is used to copy out the IV body.  */
967       STRUCT_OFFSET(XPVIV, xiv_iv), SVt_IV, FALSE, NONV,
968       NOARENA /* IVS don't need an arena  */, 0
969     },
970
971 #if NVSIZE <= IVSIZE
972     { 0, sizeof(NV),
973       STRUCT_OFFSET(XPVNV, xnv_u),
974       SVt_NV, FALSE, HADNV, NOARENA, 0 },
975 #else
976     { sizeof(NV), sizeof(NV),
977       STRUCT_OFFSET(XPVNV, xnv_u),
978       SVt_NV, FALSE, HADNV, HASARENA, FIT_ARENA(0, sizeof(NV)) },
979 #endif
980
981     { sizeof(XPV) - STRUCT_OFFSET(XPV, xpv_cur),
982       copy_length(XPV, xpv_len) - STRUCT_OFFSET(XPV, xpv_cur),
983       + STRUCT_OFFSET(XPV, xpv_cur),
984       SVt_PV, FALSE, NONV, HASARENA,
985       FIT_ARENA(0, sizeof(XPV) - STRUCT_OFFSET(XPV, xpv_cur)) },
986
987     { sizeof(XINVLIST) - STRUCT_OFFSET(XPV, xpv_cur),
988       copy_length(XINVLIST, is_offset) - STRUCT_OFFSET(XPV, xpv_cur),
989       + STRUCT_OFFSET(XPV, xpv_cur),
990       SVt_INVLIST, TRUE, NONV, HASARENA,
991       FIT_ARENA(0, sizeof(XINVLIST) - STRUCT_OFFSET(XPV, xpv_cur)) },
992
993     { sizeof(XPVIV) - STRUCT_OFFSET(XPV, xpv_cur),
994       copy_length(XPVIV, xiv_u) - STRUCT_OFFSET(XPV, xpv_cur),
995       + STRUCT_OFFSET(XPV, xpv_cur),
996       SVt_PVIV, FALSE, NONV, HASARENA,
997       FIT_ARENA(0, sizeof(XPVIV) - STRUCT_OFFSET(XPV, xpv_cur)) },
998
999     { sizeof(XPVNV) - STRUCT_OFFSET(XPV, xpv_cur),
1000       copy_length(XPVNV, xnv_u) - STRUCT_OFFSET(XPV, xpv_cur),
1001       + STRUCT_OFFSET(XPV, xpv_cur),
1002       SVt_PVNV, FALSE, HADNV, HASARENA,
1003       FIT_ARENA(0, sizeof(XPVNV) - STRUCT_OFFSET(XPV, xpv_cur)) },
1004
1005     { sizeof(XPVMG), copy_length(XPVMG, xnv_u), 0, SVt_PVMG, FALSE, HADNV,
1006       HASARENA, FIT_ARENA(0, sizeof(XPVMG)) },
1007
1008     { sizeof(regexp),
1009       sizeof(regexp),
1010       0,
1011       SVt_REGEXP, TRUE, NONV, HASARENA,
1012       FIT_ARENA(0, sizeof(regexp))
1013     },
1014
1015     { sizeof(XPVGV), sizeof(XPVGV), 0, SVt_PVGV, TRUE, HADNV,
1016       HASARENA, FIT_ARENA(0, sizeof(XPVGV)) },
1017     
1018     { sizeof(XPVLV), sizeof(XPVLV), 0, SVt_PVLV, TRUE, HADNV,
1019       HASARENA, FIT_ARENA(0, sizeof(XPVLV)) },
1020
1021     { sizeof(XPVAV),
1022       copy_length(XPVAV, xav_alloc),
1023       0,
1024       SVt_PVAV, TRUE, NONV, HASARENA,
1025       FIT_ARENA(0, sizeof(XPVAV)) },
1026
1027     { sizeof(XPVHV),
1028       copy_length(XPVHV, xhv_max),
1029       0,
1030       SVt_PVHV, TRUE, NONV, HASARENA,
1031       FIT_ARENA(0, sizeof(XPVHV)) },
1032
1033     { sizeof(XPVCV),
1034       sizeof(XPVCV),
1035       0,
1036       SVt_PVCV, TRUE, NONV, HASARENA,
1037       FIT_ARENA(0, sizeof(XPVCV)) },
1038
1039     { sizeof(XPVFM),
1040       sizeof(XPVFM),
1041       0,
1042       SVt_PVFM, TRUE, NONV, NOARENA,
1043       FIT_ARENA(20, sizeof(XPVFM)) },
1044
1045     { sizeof(XPVIO),
1046       sizeof(XPVIO),
1047       0,
1048       SVt_PVIO, TRUE, NONV, HASARENA,
1049       FIT_ARENA(24, sizeof(XPVIO)) },
1050 };
1051
1052 #define new_body_allocated(sv_type)             \
1053     (void *)((char *)S_new_body(aTHX_ sv_type)  \
1054              - bodies_by_type[sv_type].offset)
1055
1056 /* return a thing to the free list */
1057
1058 #define del_body(thing, root)                           \
1059     STMT_START {                                        \
1060         void ** const thing_copy = (void **)thing;      \
1061         *thing_copy = *root;                            \
1062         *root = (void*)thing_copy;                      \
1063     } STMT_END
1064
1065 #ifdef PURIFY
1066 #if !(NVSIZE <= IVSIZE)
1067 #  define new_XNV()     safemalloc(sizeof(XPVNV))
1068 #endif
1069 #define new_XPVNV()     safemalloc(sizeof(XPVNV))
1070 #define new_XPVMG()     safemalloc(sizeof(XPVMG))
1071
1072 #define del_XPVGV(p)    safefree(p)
1073
1074 #else /* !PURIFY */
1075
1076 #if !(NVSIZE <= IVSIZE)
1077 #  define new_XNV()     new_body_allocated(SVt_NV)
1078 #endif
1079 #define new_XPVNV()     new_body_allocated(SVt_PVNV)
1080 #define new_XPVMG()     new_body_allocated(SVt_PVMG)
1081
1082 #define del_XPVGV(p)    del_body(p + bodies_by_type[SVt_PVGV].offset,   \
1083                                  &PL_body_roots[SVt_PVGV])
1084
1085 #endif /* PURIFY */
1086
1087 /* no arena for you! */
1088
1089 #define new_NOARENA(details) \
1090         safemalloc((details)->body_size + (details)->offset)
1091 #define new_NOARENAZ(details) \
1092         safecalloc((details)->body_size + (details)->offset, 1)
1093
1094 void *
1095 Perl_more_bodies (pTHX_ const svtype sv_type, const size_t body_size,
1096                   const size_t arena_size)
1097 {
1098     void ** const root = &PL_body_roots[sv_type];
1099     struct arena_desc *adesc;
1100     struct arena_set *aroot = (struct arena_set *) PL_body_arenas;
1101     unsigned int curr;
1102     char *start;
1103     const char *end;
1104     const size_t good_arena_size = Perl_malloc_good_size(arena_size);
1105 #if defined(DEBUGGING) && defined(PERL_GLOBAL_STRUCT)
1106     dVAR;
1107 #endif
1108 #if defined(DEBUGGING) && !defined(PERL_GLOBAL_STRUCT_PRIVATE)
1109     static bool done_sanity_check;
1110
1111     /* PERL_GLOBAL_STRUCT_PRIVATE cannot coexist with global
1112      * variables like done_sanity_check. */
1113     if (!done_sanity_check) {
1114         unsigned int i = SVt_LAST;
1115
1116         done_sanity_check = TRUE;
1117
1118         while (i--)
1119             assert (bodies_by_type[i].type == i);
1120     }
1121 #endif
1122
1123     assert(arena_size);
1124
1125     /* may need new arena-set to hold new arena */
1126     if (!aroot || aroot->curr >= aroot->set_size) {
1127         struct arena_set *newroot;
1128         Newxz(newroot, 1, struct arena_set);
1129         newroot->set_size = ARENAS_PER_SET;
1130         newroot->next = aroot;
1131         aroot = newroot;
1132         PL_body_arenas = (void *) newroot;
1133         DEBUG_m(PerlIO_printf(Perl_debug_log, "new arenaset %p\n", (void*)aroot));
1134     }
1135
1136     /* ok, now have arena-set with at least 1 empty/available arena-desc */
1137     curr = aroot->curr++;
1138     adesc = &(aroot->set[curr]);
1139     assert(!adesc->arena);
1140     
1141     Newx(adesc->arena, good_arena_size, char);
1142     adesc->size = good_arena_size;
1143     adesc->utype = sv_type;
1144     DEBUG_m(PerlIO_printf(Perl_debug_log, "arena %d added: %p size %"UVuf"\n", 
1145                           curr, (void*)adesc->arena, (UV)good_arena_size));
1146
1147     start = (char *) adesc->arena;
1148
1149     /* Get the address of the byte after the end of the last body we can fit.
1150        Remember, this is integer division:  */
1151     end = start + good_arena_size / body_size * body_size;
1152
1153     /* computed count doesn't reflect the 1st slot reservation */
1154 #if defined(MYMALLOC) || defined(HAS_MALLOC_GOOD_SIZE)
1155     DEBUG_m(PerlIO_printf(Perl_debug_log,
1156                           "arena %p end %p arena-size %d (from %d) type %d "
1157                           "size %d ct %d\n",
1158                           (void*)start, (void*)end, (int)good_arena_size,
1159                           (int)arena_size, sv_type, (int)body_size,
1160                           (int)good_arena_size / (int)body_size));
1161 #else
1162     DEBUG_m(PerlIO_printf(Perl_debug_log,
1163                           "arena %p end %p arena-size %d type %d size %d ct %d\n",
1164                           (void*)start, (void*)end,
1165                           (int)arena_size, sv_type, (int)body_size,
1166                           (int)good_arena_size / (int)body_size));
1167 #endif
1168     *root = (void *)start;
1169
1170     while (1) {
1171         /* Where the next body would start:  */
1172         char * const next = start + body_size;
1173
1174         if (next >= end) {
1175             /* This is the last body:  */
1176             assert(next == end);
1177
1178             *(void **)start = 0;
1179             return *root;
1180         }
1181
1182         *(void**) start = (void *)next;
1183         start = next;
1184     }
1185 }
1186
1187 /* grab a new thing from the free list, allocating more if necessary.
1188    The inline version is used for speed in hot routines, and the
1189    function using it serves the rest (unless PURIFY).
1190 */
1191 #define new_body_inline(xpv, sv_type) \
1192     STMT_START { \
1193         void ** const r3wt = &PL_body_roots[sv_type]; \
1194         xpv = (PTR_TBL_ENT_t*) (*((void **)(r3wt))      \
1195           ? *((void **)(r3wt)) : Perl_more_bodies(aTHX_ sv_type, \
1196                                              bodies_by_type[sv_type].body_size,\
1197                                              bodies_by_type[sv_type].arena_size)); \
1198         *(r3wt) = *(void**)(xpv); \
1199     } STMT_END
1200
1201 #ifndef PURIFY
1202
1203 STATIC void *
1204 S_new_body(pTHX_ const svtype sv_type)
1205 {
1206     void *xpv;
1207     new_body_inline(xpv, sv_type);
1208     return xpv;
1209 }
1210
1211 #endif
1212
1213 static const struct body_details fake_rv =
1214     { 0, 0, 0, SVt_IV, FALSE, NONV, NOARENA, 0 };
1215
1216 /*
1217 =for apidoc sv_upgrade
1218
1219 Upgrade an SV to a more complex form.  Generally adds a new body type to the
1220 SV, then copies across as much information as possible from the old body.
1221 It croaks if the SV is already in a more complex form than requested.  You
1222 generally want to use the C<SvUPGRADE> macro wrapper, which checks the type
1223 before calling C<sv_upgrade>, and hence does not croak.  See also
1224 C<svtype>.
1225
1226 =cut
1227 */
1228
1229 void
1230 Perl_sv_upgrade(pTHX_ SV *const sv, svtype new_type)
1231 {
1232     void*       old_body;
1233     void*       new_body;
1234     const svtype old_type = SvTYPE(sv);
1235     const struct body_details *new_type_details;
1236     const struct body_details *old_type_details
1237         = bodies_by_type + old_type;
1238     SV *referant = NULL;
1239
1240     PERL_ARGS_ASSERT_SV_UPGRADE;
1241
1242     if (old_type == new_type)
1243         return;
1244
1245     /* This clause was purposefully added ahead of the early return above to
1246        the shared string hackery for (sort {$a <=> $b} keys %hash), with the
1247        inference by Nick I-S that it would fix other troublesome cases. See
1248        changes 7162, 7163 (f130fd4589cf5fbb24149cd4db4137c8326f49c1 and parent)
1249
1250        Given that shared hash key scalars are no longer PVIV, but PV, there is
1251        no longer need to unshare so as to free up the IVX slot for its proper
1252        purpose. So it's safe to move the early return earlier.  */
1253
1254     if (new_type > SVt_PVMG && SvIsCOW(sv)) {
1255         sv_force_normal_flags(sv, 0);
1256     }
1257
1258     old_body = SvANY(sv);
1259
1260     /* Copying structures onto other structures that have been neatly zeroed
1261        has a subtle gotcha. Consider XPVMG
1262
1263        +------+------+------+------+------+-------+-------+
1264        |     NV      | CUR  | LEN  |  IV  | MAGIC | STASH |
1265        +------+------+------+------+------+-------+-------+
1266        0      4      8     12     16     20      24      28
1267
1268        where NVs are aligned to 8 bytes, so that sizeof that structure is
1269        actually 32 bytes long, with 4 bytes of padding at the end:
1270
1271        +------+------+------+------+------+-------+-------+------+
1272        |     NV      | CUR  | LEN  |  IV  | MAGIC | STASH | ???  |
1273        +------+------+------+------+------+-------+-------+------+
1274        0      4      8     12     16     20      24      28     32
1275
1276        so what happens if you allocate memory for this structure:
1277
1278        +------+------+------+------+------+-------+-------+------+------+...
1279        |     NV      | CUR  | LEN  |  IV  | MAGIC | STASH |  GP  | NAME |
1280        +------+------+------+------+------+-------+-------+------+------+...
1281        0      4      8     12     16     20      24      28     32     36
1282
1283        zero it, then copy sizeof(XPVMG) bytes on top of it? Not quite what you
1284        expect, because you copy the area marked ??? onto GP. Now, ??? may have
1285        started out as zero once, but it's quite possible that it isn't. So now,
1286        rather than a nicely zeroed GP, you have it pointing somewhere random.
1287        Bugs ensue.
1288
1289        (In fact, GP ends up pointing at a previous GP structure, because the
1290        principle cause of the padding in XPVMG getting garbage is a copy of
1291        sizeof(XPVMG) bytes from a XPVGV structure in sv_unglob. Right now
1292        this happens to be moot because XPVGV has been re-ordered, with GP
1293        no longer after STASH)
1294
1295        So we are careful and work out the size of used parts of all the
1296        structures.  */
1297
1298     switch (old_type) {
1299     case SVt_NULL:
1300         break;
1301     case SVt_IV:
1302         if (SvROK(sv)) {
1303             referant = SvRV(sv);
1304             old_type_details = &fake_rv;
1305             if (new_type == SVt_NV)
1306                 new_type = SVt_PVNV;
1307         } else {
1308             if (new_type < SVt_PVIV) {
1309                 new_type = (new_type == SVt_NV)
1310                     ? SVt_PVNV : SVt_PVIV;
1311             }
1312         }
1313         break;
1314     case SVt_NV:
1315         if (new_type < SVt_PVNV) {
1316             new_type = SVt_PVNV;
1317         }
1318         break;
1319     case SVt_PV:
1320         assert(new_type > SVt_PV);
1321         STATIC_ASSERT_STMT(SVt_IV < SVt_PV);
1322         STATIC_ASSERT_STMT(SVt_NV < SVt_PV);
1323         break;
1324     case SVt_PVIV:
1325         break;
1326     case SVt_PVNV:
1327         break;
1328     case SVt_PVMG:
1329         /* Because the XPVMG of PL_mess_sv isn't allocated from the arena,
1330            there's no way that it can be safely upgraded, because perl.c
1331            expects to Safefree(SvANY(PL_mess_sv))  */
1332         assert(sv != PL_mess_sv);
1333         break;
1334     default:
1335         if (UNLIKELY(old_type_details->cant_upgrade))
1336             Perl_croak(aTHX_ "Can't upgrade %s (%" UVuf ") to %" UVuf,
1337                        sv_reftype(sv, 0), (UV) old_type, (UV) new_type);
1338     }
1339
1340     if (UNLIKELY(old_type > new_type))
1341         Perl_croak(aTHX_ "sv_upgrade from type %d down to type %d",
1342                 (int)old_type, (int)new_type);
1343
1344     new_type_details = bodies_by_type + new_type;
1345
1346     SvFLAGS(sv) &= ~SVTYPEMASK;
1347     SvFLAGS(sv) |= new_type;
1348
1349     /* This can't happen, as SVt_NULL is <= all values of new_type, so one of
1350        the return statements above will have triggered.  */
1351     assert (new_type != SVt_NULL);
1352     switch (new_type) {
1353     case SVt_IV:
1354         assert(old_type == SVt_NULL);
1355         SET_SVANY_FOR_BODYLESS_IV(sv);
1356         SvIV_set(sv, 0);
1357         return;
1358     case SVt_NV:
1359         assert(old_type == SVt_NULL);
1360 #if NVSIZE <= IVSIZE
1361         SET_SVANY_FOR_BODYLESS_NV(sv);
1362 #else
1363         SvANY(sv) = new_XNV();
1364 #endif
1365         SvNV_set(sv, 0);
1366         return;
1367     case SVt_PVHV:
1368     case SVt_PVAV:
1369         assert(new_type_details->body_size);
1370
1371 #ifndef PURIFY  
1372         assert(new_type_details->arena);
1373         assert(new_type_details->arena_size);
1374         /* This points to the start of the allocated area.  */
1375         new_body_inline(new_body, new_type);
1376         Zero(new_body, new_type_details->body_size, char);
1377         new_body = ((char *)new_body) - new_type_details->offset;
1378 #else
1379         /* We always allocated the full length item with PURIFY. To do this
1380            we fake things so that arena is false for all 16 types..  */
1381         new_body = new_NOARENAZ(new_type_details);
1382 #endif
1383         SvANY(sv) = new_body;
1384         if (new_type == SVt_PVAV) {
1385             AvMAX(sv)   = -1;
1386             AvFILLp(sv) = -1;
1387             AvREAL_only(sv);
1388             if (old_type_details->body_size) {
1389                 AvALLOC(sv) = 0;
1390             } else {
1391                 /* It will have been zeroed when the new body was allocated.
1392                    Lets not write to it, in case it confuses a write-back
1393                    cache.  */
1394             }
1395         } else {
1396             assert(!SvOK(sv));
1397             SvOK_off(sv);
1398 #ifndef NODEFAULT_SHAREKEYS
1399             HvSHAREKEYS_on(sv);         /* key-sharing on by default */
1400 #endif
1401             /* start with PERL_HASH_DEFAULT_HvMAX+1 buckets: */
1402             HvMAX(sv) = PERL_HASH_DEFAULT_HvMAX;
1403         }
1404
1405         /* SVt_NULL isn't the only thing upgraded to AV or HV.
1406            The target created by newSVrv also is, and it can have magic.
1407            However, it never has SvPVX set.
1408         */
1409         if (old_type == SVt_IV) {
1410             assert(!SvROK(sv));
1411         } else if (old_type >= SVt_PV) {
1412             assert(SvPVX_const(sv) == 0);
1413         }
1414
1415         if (old_type >= SVt_PVMG) {
1416             SvMAGIC_set(sv, ((XPVMG*)old_body)->xmg_u.xmg_magic);
1417             SvSTASH_set(sv, ((XPVMG*)old_body)->xmg_stash);
1418         } else {
1419             sv->sv_u.svu_array = NULL; /* or svu_hash  */
1420         }
1421         break;
1422
1423     case SVt_PVIV:
1424         /* XXX Is this still needed?  Was it ever needed?   Surely as there is
1425            no route from NV to PVIV, NOK can never be true  */
1426         assert(!SvNOKp(sv));
1427         assert(!SvNOK(sv));
1428         /* FALLTHROUGH */
1429     case SVt_PVIO:
1430     case SVt_PVFM:
1431     case SVt_PVGV:
1432     case SVt_PVCV:
1433     case SVt_PVLV:
1434     case SVt_INVLIST:
1435     case SVt_REGEXP:
1436     case SVt_PVMG:
1437     case SVt_PVNV:
1438     case SVt_PV:
1439
1440         assert(new_type_details->body_size);
1441         /* We always allocated the full length item with PURIFY. To do this
1442            we fake things so that arena is false for all 16 types..  */
1443         if(new_type_details->arena) {
1444             /* This points to the start of the allocated area.  */
1445             new_body_inline(new_body, new_type);
1446             Zero(new_body, new_type_details->body_size, char);
1447             new_body = ((char *)new_body) - new_type_details->offset;
1448         } else {
1449             new_body = new_NOARENAZ(new_type_details);
1450         }
1451         SvANY(sv) = new_body;
1452
1453         if (old_type_details->copy) {
1454             /* There is now the potential for an upgrade from something without
1455                an offset (PVNV or PVMG) to something with one (PVCV, PVFM)  */
1456             int offset = old_type_details->offset;
1457             int length = old_type_details->copy;
1458
1459             if (new_type_details->offset > old_type_details->offset) {
1460                 const int difference
1461                     = new_type_details->offset - old_type_details->offset;
1462                 offset += difference;
1463                 length -= difference;
1464             }
1465             assert (length >= 0);
1466                 
1467             Copy((char *)old_body + offset, (char *)new_body + offset, length,
1468                  char);
1469         }
1470
1471 #ifndef NV_ZERO_IS_ALLBITS_ZERO
1472         /* If NV 0.0 is stores as all bits 0 then Zero() already creates a
1473          * correct 0.0 for us.  Otherwise, if the old body didn't have an
1474          * NV slot, but the new one does, then we need to initialise the
1475          * freshly created NV slot with whatever the correct bit pattern is
1476          * for 0.0  */
1477         if (old_type_details->zero_nv && !new_type_details->zero_nv
1478             && !isGV_with_GP(sv))
1479             SvNV_set(sv, 0);
1480 #endif
1481
1482         if (UNLIKELY(new_type == SVt_PVIO)) {
1483             IO * const io = MUTABLE_IO(sv);
1484             GV *iogv = gv_fetchpvs("IO::File::", GV_ADD, SVt_PVHV);
1485
1486             SvOBJECT_on(io);
1487             /* Clear the stashcache because a new IO could overrule a package
1488                name */
1489             DEBUG_o(Perl_deb(aTHX_ "sv_upgrade clearing PL_stashcache\n"));
1490             hv_clear(PL_stashcache);
1491
1492             SvSTASH_set(io, MUTABLE_HV(SvREFCNT_inc(GvHV(iogv))));
1493             IoPAGE_LEN(sv) = 60;
1494         }
1495         if (UNLIKELY(new_type == SVt_REGEXP))
1496             sv->sv_u.svu_rx = (regexp *)new_body;
1497         else if (old_type < SVt_PV) {
1498             /* referant will be NULL unless the old type was SVt_IV emulating
1499                SVt_RV */
1500             sv->sv_u.svu_rv = referant;
1501         }
1502         break;
1503     default:
1504         Perl_croak(aTHX_ "panic: sv_upgrade to unknown type %lu",
1505                    (unsigned long)new_type);
1506     }
1507
1508     /* if this is zero, this is a body-less SVt_NULL, SVt_IV/SVt_RV,
1509        and sometimes SVt_NV */
1510     if (old_type_details->body_size) {
1511 #ifdef PURIFY
1512         safefree(old_body);
1513 #else
1514         /* Note that there is an assumption that all bodies of types that
1515            can be upgraded came from arenas. Only the more complex non-
1516            upgradable types are allowed to be directly malloc()ed.  */
1517         assert(old_type_details->arena);
1518         del_body((void*)((char*)old_body + old_type_details->offset),
1519                  &PL_body_roots[old_type]);
1520 #endif
1521     }
1522 }
1523
1524 /*
1525 =for apidoc sv_backoff
1526
1527 Remove any string offset.  You should normally use the C<SvOOK_off> macro
1528 wrapper instead.
1529
1530 =cut
1531 */
1532
1533 int
1534 Perl_sv_backoff(SV *const sv)
1535 {
1536     STRLEN delta;
1537     const char * const s = SvPVX_const(sv);
1538
1539     PERL_ARGS_ASSERT_SV_BACKOFF;
1540
1541     assert(SvOOK(sv));
1542     assert(SvTYPE(sv) != SVt_PVHV);
1543     assert(SvTYPE(sv) != SVt_PVAV);
1544
1545     SvOOK_offset(sv, delta);
1546     
1547     SvLEN_set(sv, SvLEN(sv) + delta);
1548     SvPV_set(sv, SvPVX(sv) - delta);
1549     Move(s, SvPVX(sv), SvCUR(sv)+1, char);
1550     SvFLAGS(sv) &= ~SVf_OOK;
1551     return 0;
1552 }
1553
1554 /*
1555 =for apidoc sv_grow
1556
1557 Expands the character buffer in the SV.  If necessary, uses C<sv_unref> and
1558 upgrades the SV to C<SVt_PV>.  Returns a pointer to the character buffer.
1559 Use the C<SvGROW> wrapper instead.
1560
1561 =cut
1562 */
1563
1564 static void S_sv_uncow(pTHX_ SV * const sv, const U32 flags);
1565
1566 char *
1567 Perl_sv_grow(pTHX_ SV *const sv, STRLEN newlen)
1568 {
1569     char *s;
1570
1571     PERL_ARGS_ASSERT_SV_GROW;
1572
1573     if (SvROK(sv))
1574         sv_unref(sv);
1575     if (SvTYPE(sv) < SVt_PV) {
1576         sv_upgrade(sv, SVt_PV);
1577         s = SvPVX_mutable(sv);
1578     }
1579     else if (SvOOK(sv)) {       /* pv is offset? */
1580         sv_backoff(sv);
1581         s = SvPVX_mutable(sv);
1582         if (newlen > SvLEN(sv))
1583             newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
1584     }
1585     else
1586     {
1587         if (SvIsCOW(sv)) S_sv_uncow(aTHX_ sv, 0);
1588         s = SvPVX_mutable(sv);
1589     }
1590
1591 #ifdef PERL_NEW_COPY_ON_WRITE
1592     /* the new COW scheme uses SvPVX(sv)[SvLEN(sv)-1] (if spare)
1593      * to store the COW count. So in general, allocate one more byte than
1594      * asked for, to make it likely this byte is always spare: and thus
1595      * make more strings COW-able.
1596      * If the new size is a big power of two, don't bother: we assume the
1597      * caller wanted a nice 2^N sized block and will be annoyed at getting
1598      * 2^N+1.
1599      * Only increment if the allocation isn't MEM_SIZE_MAX,
1600      * otherwise it will wrap to 0.
1601      */
1602     if (newlen & 0xff && newlen != MEM_SIZE_MAX)
1603         newlen++;
1604 #endif
1605
1606 #if defined(PERL_USE_MALLOC_SIZE) && defined(Perl_safesysmalloc_size)
1607 #define PERL_UNWARANTED_CHUMMINESS_WITH_MALLOC
1608 #endif
1609
1610     if (newlen > SvLEN(sv)) {           /* need more room? */
1611         STRLEN minlen = SvCUR(sv);
1612         minlen += (minlen >> PERL_STRLEN_EXPAND_SHIFT) + 10;
1613         if (newlen < minlen)
1614             newlen = minlen;
1615 #ifndef PERL_UNWARANTED_CHUMMINESS_WITH_MALLOC
1616
1617         /* Don't round up on the first allocation, as odds are pretty good that
1618          * the initial request is accurate as to what is really needed */
1619         if (SvLEN(sv)) {
1620             STRLEN rounded = PERL_STRLEN_ROUNDUP(newlen);
1621             if (rounded > newlen)
1622                 newlen = rounded;
1623         }
1624 #endif
1625         if (SvLEN(sv) && s) {
1626             s = (char*)saferealloc(s, newlen);
1627         }
1628         else {
1629             s = (char*)safemalloc(newlen);
1630             if (SvPVX_const(sv) && SvCUR(sv)) {
1631                 Move(SvPVX_const(sv), s, (newlen < SvCUR(sv)) ? newlen : SvCUR(sv), char);
1632             }
1633         }
1634         SvPV_set(sv, s);
1635 #ifdef PERL_UNWARANTED_CHUMMINESS_WITH_MALLOC
1636         /* Do this here, do it once, do it right, and then we will never get
1637            called back into sv_grow() unless there really is some growing
1638            needed.  */
1639         SvLEN_set(sv, Perl_safesysmalloc_size(s));
1640 #else
1641         SvLEN_set(sv, newlen);
1642 #endif
1643     }
1644     return s;
1645 }
1646
1647 /*
1648 =for apidoc sv_setiv
1649
1650 Copies an integer into the given SV, upgrading first if necessary.
1651 Does not handle 'set' magic.  See also C<sv_setiv_mg>.
1652
1653 =cut
1654 */
1655
1656 void
1657 Perl_sv_setiv(pTHX_ SV *const sv, const IV i)
1658 {
1659     PERL_ARGS_ASSERT_SV_SETIV;
1660
1661     SV_CHECK_THINKFIRST_COW_DROP(sv);
1662     switch (SvTYPE(sv)) {
1663     case SVt_NULL:
1664     case SVt_NV:
1665         sv_upgrade(sv, SVt_IV);
1666         break;
1667     case SVt_PV:
1668         sv_upgrade(sv, SVt_PVIV);
1669         break;
1670
1671     case SVt_PVGV:
1672         if (!isGV_with_GP(sv))
1673             break;
1674     case SVt_PVAV:
1675     case SVt_PVHV:
1676     case SVt_PVCV:
1677     case SVt_PVFM:
1678     case SVt_PVIO:
1679         /* diag_listed_as: Can't coerce %s to %s in %s */
1680         Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
1681                    OP_DESC(PL_op));
1682     default: NOOP;
1683     }
1684     (void)SvIOK_only(sv);                       /* validate number */
1685     SvIV_set(sv, i);
1686     SvTAINT(sv);
1687 }
1688
1689 /*
1690 =for apidoc sv_setiv_mg
1691
1692 Like C<sv_setiv>, but also handles 'set' magic.
1693
1694 =cut
1695 */
1696
1697 void
1698 Perl_sv_setiv_mg(pTHX_ SV *const sv, const IV i)
1699 {
1700     PERL_ARGS_ASSERT_SV_SETIV_MG;
1701
1702     sv_setiv(sv,i);
1703     SvSETMAGIC(sv);
1704 }
1705
1706 /*
1707 =for apidoc sv_setuv
1708
1709 Copies an unsigned integer into the given SV, upgrading first if necessary.
1710 Does not handle 'set' magic.  See also C<sv_setuv_mg>.
1711
1712 =cut
1713 */
1714
1715 void
1716 Perl_sv_setuv(pTHX_ SV *const sv, const UV u)
1717 {
1718     PERL_ARGS_ASSERT_SV_SETUV;
1719
1720     /* With the if statement to ensure that integers are stored as IVs whenever
1721        possible:
1722        u=1.49  s=0.52  cu=72.49  cs=10.64  scripts=270  tests=20865
1723
1724        without
1725        u=1.35  s=0.47  cu=73.45  cs=11.43  scripts=270  tests=20865
1726
1727        If you wish to remove the following if statement, so that this routine
1728        (and its callers) always return UVs, please benchmark to see what the
1729        effect is. Modern CPUs may be different. Or may not :-)
1730     */
1731     if (u <= (UV)IV_MAX) {
1732        sv_setiv(sv, (IV)u);
1733        return;
1734     }
1735     sv_setiv(sv, 0);
1736     SvIsUV_on(sv);
1737     SvUV_set(sv, u);
1738 }
1739
1740 /*
1741 =for apidoc sv_setuv_mg
1742
1743 Like C<sv_setuv>, but also handles 'set' magic.
1744
1745 =cut
1746 */
1747
1748 void
1749 Perl_sv_setuv_mg(pTHX_ SV *const sv, const UV u)
1750 {
1751     PERL_ARGS_ASSERT_SV_SETUV_MG;
1752
1753     sv_setuv(sv,u);
1754     SvSETMAGIC(sv);
1755 }
1756
1757 /*
1758 =for apidoc sv_setnv
1759
1760 Copies a double into the given SV, upgrading first if necessary.
1761 Does not handle 'set' magic.  See also C<sv_setnv_mg>.
1762
1763 =cut
1764 */
1765
1766 void
1767 Perl_sv_setnv(pTHX_ SV *const sv, const NV num)
1768 {
1769     PERL_ARGS_ASSERT_SV_SETNV;
1770
1771     SV_CHECK_THINKFIRST_COW_DROP(sv);
1772     switch (SvTYPE(sv)) {
1773     case SVt_NULL:
1774     case SVt_IV:
1775         sv_upgrade(sv, SVt_NV);
1776         break;
1777     case SVt_PV:
1778     case SVt_PVIV:
1779         sv_upgrade(sv, SVt_PVNV);
1780         break;
1781
1782     case SVt_PVGV:
1783         if (!isGV_with_GP(sv))
1784             break;
1785     case SVt_PVAV:
1786     case SVt_PVHV:
1787     case SVt_PVCV:
1788     case SVt_PVFM:
1789     case SVt_PVIO:
1790         /* diag_listed_as: Can't coerce %s to %s in %s */
1791         Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
1792                    OP_DESC(PL_op));
1793     default: NOOP;
1794     }
1795     SvNV_set(sv, num);
1796     (void)SvNOK_only(sv);                       /* validate number */
1797     SvTAINT(sv);
1798 }
1799
1800 /*
1801 =for apidoc sv_setnv_mg
1802
1803 Like C<sv_setnv>, but also handles 'set' magic.
1804
1805 =cut
1806 */
1807
1808 void
1809 Perl_sv_setnv_mg(pTHX_ SV *const sv, const NV num)
1810 {
1811     PERL_ARGS_ASSERT_SV_SETNV_MG;
1812
1813     sv_setnv(sv,num);
1814     SvSETMAGIC(sv);
1815 }
1816
1817 /* Return a cleaned-up, printable version of sv, for non-numeric, or
1818  * not incrementable warning display.
1819  * Originally part of S_not_a_number().
1820  * The return value may be != tmpbuf.
1821  */
1822
1823 STATIC const char *
1824 S_sv_display(pTHX_ SV *const sv, char *tmpbuf, STRLEN tmpbuf_size) {
1825     const char *pv;
1826
1827      PERL_ARGS_ASSERT_SV_DISPLAY;
1828
1829      if (DO_UTF8(sv)) {
1830           SV *dsv = newSVpvs_flags("", SVs_TEMP);
1831           pv = sv_uni_display(dsv, sv, 10, UNI_DISPLAY_ISPRINT);
1832      } else {
1833           char *d = tmpbuf;
1834           const char * const limit = tmpbuf + tmpbuf_size - 8;
1835           /* each *s can expand to 4 chars + "...\0",
1836              i.e. need room for 8 chars */
1837         
1838           const char *s = SvPVX_const(sv);
1839           const char * const end = s + SvCUR(sv);
1840           for ( ; s < end && d < limit; s++ ) {
1841                int ch = *s & 0xFF;
1842                if (! isASCII(ch) && !isPRINT_LC(ch)) {
1843                     *d++ = 'M';
1844                     *d++ = '-';
1845
1846                     /* Map to ASCII "equivalent" of Latin1 */
1847                     ch = LATIN1_TO_NATIVE(NATIVE_TO_LATIN1(ch) & 127);
1848                }
1849                if (ch == '\n') {
1850                     *d++ = '\\';
1851                     *d++ = 'n';
1852                }
1853                else if (ch == '\r') {
1854                     *d++ = '\\';
1855                     *d++ = 'r';
1856                }
1857                else if (ch == '\f') {
1858                     *d++ = '\\';
1859                     *d++ = 'f';
1860                }
1861                else if (ch == '\\') {
1862                     *d++ = '\\';
1863                     *d++ = '\\';
1864                }
1865                else if (ch == '\0') {
1866                     *d++ = '\\';
1867                     *d++ = '0';
1868                }
1869                else if (isPRINT_LC(ch))
1870                     *d++ = ch;
1871                else {
1872                     *d++ = '^';
1873                     *d++ = toCTRL(ch);
1874                }
1875           }
1876           if (s < end) {
1877                *d++ = '.';
1878                *d++ = '.';
1879                *d++ = '.';
1880           }
1881           *d = '\0';
1882           pv = tmpbuf;
1883     }
1884
1885     return pv;
1886 }
1887
1888 /* Print an "isn't numeric" warning, using a cleaned-up,
1889  * printable version of the offending string
1890  */
1891
1892 STATIC void
1893 S_not_a_number(pTHX_ SV *const sv)
1894 {
1895      char tmpbuf[64];
1896      const char *pv;
1897
1898      PERL_ARGS_ASSERT_NOT_A_NUMBER;
1899
1900      pv = sv_display(sv, tmpbuf, sizeof(tmpbuf));
1901
1902     if (PL_op)
1903         Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
1904                     /* diag_listed_as: Argument "%s" isn't numeric%s */
1905                     "Argument \"%s\" isn't numeric in %s", pv,
1906                     OP_DESC(PL_op));
1907     else
1908         Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
1909                     /* diag_listed_as: Argument "%s" isn't numeric%s */
1910                     "Argument \"%s\" isn't numeric", pv);
1911 }
1912
1913 STATIC void
1914 S_not_incrementable(pTHX_ SV *const sv) {
1915      char tmpbuf[64];
1916      const char *pv;
1917
1918      PERL_ARGS_ASSERT_NOT_INCREMENTABLE;
1919
1920      pv = sv_display(sv, tmpbuf, sizeof(tmpbuf));
1921
1922      Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
1923                  "Argument \"%s\" treated as 0 in increment (++)", pv);
1924 }
1925
1926 /*
1927 =for apidoc looks_like_number
1928
1929 Test if the content of an SV looks like a number (or is a number).
1930 C<Inf> and C<Infinity> are treated as numbers (so will not issue a
1931 non-numeric warning), even if your atof() doesn't grok them.  Get-magic is
1932 ignored.
1933
1934 =cut
1935 */
1936
1937 I32
1938 Perl_looks_like_number(pTHX_ SV *const sv)
1939 {
1940     const char *sbegin;
1941     STRLEN len;
1942     int numtype;
1943
1944     PERL_ARGS_ASSERT_LOOKS_LIKE_NUMBER;
1945
1946     if (SvPOK(sv) || SvPOKp(sv)) {
1947         sbegin = SvPV_nomg_const(sv, len);
1948     }
1949     else
1950         return SvFLAGS(sv) & (SVf_NOK|SVp_NOK|SVf_IOK|SVp_IOK);
1951     numtype = grok_number(sbegin, len, NULL);
1952     return ((numtype & IS_NUMBER_TRAILING)) ? 0 : numtype;
1953 }
1954
1955 STATIC bool
1956 S_glob_2number(pTHX_ GV * const gv)
1957 {
1958     PERL_ARGS_ASSERT_GLOB_2NUMBER;
1959
1960     /* We know that all GVs stringify to something that is not-a-number,
1961         so no need to test that.  */
1962     if (ckWARN(WARN_NUMERIC))
1963     {
1964         SV *const buffer = sv_newmortal();
1965         gv_efullname3(buffer, gv, "*");
1966         not_a_number(buffer);
1967     }
1968     /* We just want something true to return, so that S_sv_2iuv_common
1969         can tail call us and return true.  */
1970     return TRUE;
1971 }
1972
1973 /* Actually, ISO C leaves conversion of UV to IV undefined, but
1974    until proven guilty, assume that things are not that bad... */
1975
1976 /*
1977    NV_PRESERVES_UV:
1978
1979    As 64 bit platforms often have an NV that doesn't preserve all bits of
1980    an IV (an assumption perl has been based on to date) it becomes necessary
1981    to remove the assumption that the NV always carries enough precision to
1982    recreate the IV whenever needed, and that the NV is the canonical form.
1983    Instead, IV/UV and NV need to be given equal rights. So as to not lose
1984    precision as a side effect of conversion (which would lead to insanity
1985    and the dragon(s) in t/op/numconvert.t getting very angry) the intent is
1986    1) to distinguish between IV/UV/NV slots that have a valid conversion cached
1987       where precision was lost, and IV/UV/NV slots that have a valid conversion
1988       which has lost no precision
1989    2) to ensure that if a numeric conversion to one form is requested that
1990       would lose precision, the precise conversion (or differently
1991       imprecise conversion) is also performed and cached, to prevent
1992       requests for different numeric formats on the same SV causing
1993       lossy conversion chains. (lossless conversion chains are perfectly
1994       acceptable (still))
1995
1996
1997    flags are used:
1998    SvIOKp is true if the IV slot contains a valid value
1999    SvIOK  is true only if the IV value is accurate (UV if SvIOK_UV true)
2000    SvNOKp is true if the NV slot contains a valid value
2001    SvNOK  is true only if the NV value is accurate
2002
2003    so
2004    while converting from PV to NV, check to see if converting that NV to an
2005    IV(or UV) would lose accuracy over a direct conversion from PV to
2006    IV(or UV). If it would, cache both conversions, return NV, but mark
2007    SV as IOK NOKp (ie not NOK).
2008
2009    While converting from PV to IV, check to see if converting that IV to an
2010    NV would lose accuracy over a direct conversion from PV to NV. If it
2011    would, cache both conversions, flag similarly.
2012
2013    Before, the SV value "3.2" could become NV=3.2 IV=3 NOK, IOK quite
2014    correctly because if IV & NV were set NV *always* overruled.
2015    Now, "3.2" will become NV=3.2 IV=3 NOK, IOKp, because the flag's meaning
2016    changes - now IV and NV together means that the two are interchangeable:
2017    SvIVX == (IV) SvNVX && SvNVX == (NV) SvIVX;
2018
2019    The benefit of this is that operations such as pp_add know that if
2020    SvIOK is true for both left and right operands, then integer addition
2021    can be used instead of floating point (for cases where the result won't
2022    overflow). Before, floating point was always used, which could lead to
2023    loss of precision compared with integer addition.
2024
2025    * making IV and NV equal status should make maths accurate on 64 bit
2026      platforms
2027    * may speed up maths somewhat if pp_add and friends start to use
2028      integers when possible instead of fp. (Hopefully the overhead in
2029      looking for SvIOK and checking for overflow will not outweigh the
2030      fp to integer speedup)
2031    * will slow down integer operations (callers of SvIV) on "inaccurate"
2032      values, as the change from SvIOK to SvIOKp will cause a call into
2033      sv_2iv each time rather than a macro access direct to the IV slot
2034    * should speed up number->string conversion on integers as IV is
2035      favoured when IV and NV are equally accurate
2036
2037    ####################################################################
2038    You had better be using SvIOK_notUV if you want an IV for arithmetic:
2039    SvIOK is true if (IV or UV), so you might be getting (IV)SvUV.
2040    On the other hand, SvUOK is true iff UV.
2041    ####################################################################
2042
2043    Your mileage will vary depending your CPU's relative fp to integer
2044    performance ratio.
2045 */
2046
2047 #ifndef NV_PRESERVES_UV
2048 #  define IS_NUMBER_UNDERFLOW_IV 1
2049 #  define IS_NUMBER_UNDERFLOW_UV 2
2050 #  define IS_NUMBER_IV_AND_UV    2
2051 #  define IS_NUMBER_OVERFLOW_IV  4
2052 #  define IS_NUMBER_OVERFLOW_UV  5
2053
2054 /* sv_2iuv_non_preserve(): private routine for use by sv_2iv() and sv_2uv() */
2055
2056 /* For sv_2nv these three cases are "SvNOK and don't bother casting"  */
2057 STATIC int
2058 S_sv_2iuv_non_preserve(pTHX_ SV *const sv
2059 #  ifdef DEBUGGING
2060                        , I32 numtype
2061 #  endif
2062                        )
2063 {
2064     PERL_ARGS_ASSERT_SV_2IUV_NON_PRESERVE;
2065     PERL_UNUSED_CONTEXT;
2066
2067     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));
2068     if (SvNVX(sv) < (NV)IV_MIN) {
2069         (void)SvIOKp_on(sv);
2070         (void)SvNOK_on(sv);
2071         SvIV_set(sv, IV_MIN);
2072         return IS_NUMBER_UNDERFLOW_IV;
2073     }
2074     if (SvNVX(sv) > (NV)UV_MAX) {
2075         (void)SvIOKp_on(sv);
2076         (void)SvNOK_on(sv);
2077         SvIsUV_on(sv);
2078         SvUV_set(sv, UV_MAX);
2079         return IS_NUMBER_OVERFLOW_UV;
2080     }
2081     (void)SvIOKp_on(sv);
2082     (void)SvNOK_on(sv);
2083     /* Can't use strtol etc to convert this string.  (See truth table in
2084        sv_2iv  */
2085     if (SvNVX(sv) <= (UV)IV_MAX) {
2086         SvIV_set(sv, I_V(SvNVX(sv)));
2087         if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2088             SvIOK_on(sv); /* Integer is precise. NOK, IOK */
2089         } else {
2090             /* Integer is imprecise. NOK, IOKp */
2091         }
2092         return SvNVX(sv) < 0 ? IS_NUMBER_UNDERFLOW_UV : IS_NUMBER_IV_AND_UV;
2093     }
2094     SvIsUV_on(sv);
2095     SvUV_set(sv, U_V(SvNVX(sv)));
2096     if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2097         if (SvUVX(sv) == UV_MAX) {
2098             /* As we know that NVs don't preserve UVs, UV_MAX cannot
2099                possibly be preserved by NV. Hence, it must be overflow.
2100                NOK, IOKp */
2101             return IS_NUMBER_OVERFLOW_UV;
2102         }
2103         SvIOK_on(sv); /* Integer is precise. NOK, UOK */
2104     } else {
2105         /* Integer is imprecise. NOK, IOKp */
2106     }
2107     return IS_NUMBER_OVERFLOW_IV;
2108 }
2109 #endif /* !NV_PRESERVES_UV*/
2110
2111 /* If numtype is infnan, set the NV of the sv accordingly.
2112  * If numtype is anything else, try setting the NV using Atof(PV). */
2113 #ifdef USING_MSVC6
2114 #  pragma warning(push)
2115 #  pragma warning(disable:4756;disable:4056)
2116 #endif
2117 static void
2118 S_sv_setnv(pTHX_ SV* sv, int numtype)
2119 {
2120     bool pok = cBOOL(SvPOK(sv));
2121     bool nok = FALSE;
2122     if ((numtype & IS_NUMBER_INFINITY)) {
2123         SvNV_set(sv, (numtype & IS_NUMBER_NEG) ? -NV_INF : NV_INF);
2124         nok = TRUE;
2125     }
2126     else if ((numtype & IS_NUMBER_NAN)) {
2127         SvNV_set(sv, NV_NAN);
2128         nok = TRUE;
2129     }
2130     else if (pok) {
2131         SvNV_set(sv, Atof(SvPVX_const(sv)));
2132         /* Purposefully no true nok here, since we don't want to blow
2133          * away the possible IOK/UV of an existing sv. */
2134     }
2135     if (nok) {
2136         SvNOK_only(sv); /* No IV or UV please, this is pure infnan. */
2137         if (pok)
2138             SvPOK_on(sv); /* PV is okay, though. */
2139     }
2140 }
2141 #ifdef USING_MSVC6
2142 #  pragma warning(pop)
2143 #endif
2144
2145 STATIC bool
2146 S_sv_2iuv_common(pTHX_ SV *const sv)
2147 {
2148     PERL_ARGS_ASSERT_SV_2IUV_COMMON;
2149
2150     if (SvNOKp(sv)) {
2151         /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
2152          * without also getting a cached IV/UV from it at the same time
2153          * (ie PV->NV conversion should detect loss of accuracy and cache
2154          * IV or UV at same time to avoid this. */
2155         /* IV-over-UV optimisation - choose to cache IV if possible */
2156
2157         if (SvTYPE(sv) == SVt_NV)
2158             sv_upgrade(sv, SVt_PVNV);
2159
2160         (void)SvIOKp_on(sv);    /* Must do this first, to clear any SvOOK */
2161         /* < not <= as for NV doesn't preserve UV, ((NV)IV_MAX+1) will almost
2162            certainly cast into the IV range at IV_MAX, whereas the correct
2163            answer is the UV IV_MAX +1. Hence < ensures that dodgy boundary
2164            cases go to UV */
2165 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2166         if (Perl_isnan(SvNVX(sv))) {
2167             SvUV_set(sv, 0);
2168             SvIsUV_on(sv);
2169             return FALSE;
2170         }
2171 #endif
2172         if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2173             SvIV_set(sv, I_V(SvNVX(sv)));
2174             if (SvNVX(sv) == (NV) SvIVX(sv)
2175 #ifndef NV_PRESERVES_UV
2176                 && SvIVX(sv) != IV_MIN /* avoid negating IV_MIN below */
2177                 && (((UV)1 << NV_PRESERVES_UV_BITS) >
2178                     (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
2179                 /* Don't flag it as "accurately an integer" if the number
2180                    came from a (by definition imprecise) NV operation, and
2181                    we're outside the range of NV integer precision */
2182 #endif
2183                 ) {
2184                 if (SvNOK(sv))
2185                     SvIOK_on(sv);  /* Can this go wrong with rounding? NWC */
2186                 else {
2187                     /* scalar has trailing garbage, eg "42a" */
2188                 }
2189                 DEBUG_c(PerlIO_printf(Perl_debug_log,
2190                                       "0x%"UVxf" iv(%"NVgf" => %"IVdf") (precise)\n",
2191                                       PTR2UV(sv),
2192                                       SvNVX(sv),
2193                                       SvIVX(sv)));
2194
2195             } else {
2196                 /* IV not precise.  No need to convert from PV, as NV
2197                    conversion would already have cached IV if it detected
2198                    that PV->IV would be better than PV->NV->IV
2199                    flags already correct - don't set public IOK.  */
2200                 DEBUG_c(PerlIO_printf(Perl_debug_log,
2201                                       "0x%"UVxf" iv(%"NVgf" => %"IVdf") (imprecise)\n",
2202                                       PTR2UV(sv),
2203                                       SvNVX(sv),
2204                                       SvIVX(sv)));
2205             }
2206             /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
2207                but the cast (NV)IV_MIN rounds to a the value less (more
2208                negative) than IV_MIN which happens to be equal to SvNVX ??
2209                Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
2210                NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
2211                (NV)UVX == NVX are both true, but the values differ. :-(
2212                Hopefully for 2s complement IV_MIN is something like
2213                0x8000000000000000 which will be exact. NWC */
2214         }
2215         else {
2216             SvUV_set(sv, U_V(SvNVX(sv)));
2217             if (
2218                 (SvNVX(sv) == (NV) SvUVX(sv))
2219 #ifndef  NV_PRESERVES_UV
2220                 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
2221                 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
2222                 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
2223                 /* Don't flag it as "accurately an integer" if the number
2224                    came from a (by definition imprecise) NV operation, and
2225                    we're outside the range of NV integer precision */
2226 #endif
2227                 && SvNOK(sv)
2228                 )
2229                 SvIOK_on(sv);
2230             SvIsUV_on(sv);
2231             DEBUG_c(PerlIO_printf(Perl_debug_log,
2232                                   "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
2233                                   PTR2UV(sv),
2234                                   SvUVX(sv),
2235                                   SvUVX(sv)));
2236         }
2237     }
2238     else if (SvPOKp(sv)) {
2239         UV value;
2240         const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2241         /* We want to avoid a possible problem when we cache an IV/ a UV which
2242            may be later translated to an NV, and the resulting NV is not
2243            the same as the direct translation of the initial string
2244            (eg 123.456 can shortcut to the IV 123 with atol(), but we must
2245            be careful to ensure that the value with the .456 is around if the
2246            NV value is requested in the future).
2247         
2248            This means that if we cache such an IV/a UV, we need to cache the
2249            NV as well.  Moreover, we trade speed for space, and do not
2250            cache the NV if we are sure it's not needed.
2251          */
2252
2253         /* SVt_PVNV is one higher than SVt_PVIV, hence this order  */
2254         if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2255              == IS_NUMBER_IN_UV) {
2256             /* It's definitely an integer, only upgrade to PVIV */
2257             if (SvTYPE(sv) < SVt_PVIV)
2258                 sv_upgrade(sv, SVt_PVIV);
2259             (void)SvIOK_on(sv);
2260         } else if (SvTYPE(sv) < SVt_PVNV)
2261             sv_upgrade(sv, SVt_PVNV);
2262
2263         if ((numtype & (IS_NUMBER_INFINITY | IS_NUMBER_NAN))) {
2264             if (ckWARN(WARN_NUMERIC) && ((numtype & IS_NUMBER_TRAILING)))
2265                 not_a_number(sv);
2266             S_sv_setnv(aTHX_ sv, numtype);
2267             return FALSE;
2268         }
2269
2270         /* If NVs preserve UVs then we only use the UV value if we know that
2271            we aren't going to call atof() below. If NVs don't preserve UVs
2272            then the value returned may have more precision than atof() will
2273            return, even though value isn't perfectly accurate.  */
2274         if ((numtype & (IS_NUMBER_IN_UV
2275 #ifdef NV_PRESERVES_UV
2276                         | IS_NUMBER_NOT_INT
2277 #endif
2278             )) == IS_NUMBER_IN_UV) {
2279             /* This won't turn off the public IOK flag if it was set above  */
2280             (void)SvIOKp_on(sv);
2281
2282             if (!(numtype & IS_NUMBER_NEG)) {
2283                 /* positive */;
2284                 if (value <= (UV)IV_MAX) {
2285                     SvIV_set(sv, (IV)value);
2286                 } else {
2287                     /* it didn't overflow, and it was positive. */
2288                     SvUV_set(sv, value);
2289                     SvIsUV_on(sv);
2290                 }
2291             } else {
2292                 /* 2s complement assumption  */
2293                 if (value <= (UV)IV_MIN) {
2294                     SvIV_set(sv, value == (UV)IV_MIN
2295                                     ? IV_MIN : -(IV)value);
2296                 } else {
2297                     /* Too negative for an IV.  This is a double upgrade, but
2298                        I'm assuming it will be rare.  */
2299                     if (SvTYPE(sv) < SVt_PVNV)
2300                         sv_upgrade(sv, SVt_PVNV);
2301                     SvNOK_on(sv);
2302                     SvIOK_off(sv);
2303                     SvIOKp_on(sv);
2304                     SvNV_set(sv, -(NV)value);
2305                     SvIV_set(sv, IV_MIN);
2306                 }
2307             }
2308         }
2309         /* For !NV_PRESERVES_UV and IS_NUMBER_IN_UV and IS_NUMBER_NOT_INT we
2310            will be in the previous block to set the IV slot, and the next
2311            block to set the NV slot.  So no else here.  */
2312         
2313         if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2314             != IS_NUMBER_IN_UV) {
2315             /* It wasn't an (integer that doesn't overflow the UV). */
2316             S_sv_setnv(aTHX_ sv, numtype);
2317
2318             if (! numtype && ckWARN(WARN_NUMERIC))
2319                 not_a_number(sv);
2320
2321             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%" NVgf ")\n",
2322                                   PTR2UV(sv), SvNVX(sv)));
2323
2324 #ifdef NV_PRESERVES_UV
2325             (void)SvIOKp_on(sv);
2326             (void)SvNOK_on(sv);
2327 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2328             if (Perl_isnan(SvNVX(sv))) {
2329                 SvUV_set(sv, 0);
2330                 SvIsUV_on(sv);
2331                 return FALSE;
2332             }
2333 #endif
2334             if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2335                 SvIV_set(sv, I_V(SvNVX(sv)));
2336                 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2337                     SvIOK_on(sv);
2338                 } else {
2339                     NOOP;  /* Integer is imprecise. NOK, IOKp */
2340                 }
2341                 /* UV will not work better than IV */
2342             } else {
2343                 if (SvNVX(sv) > (NV)UV_MAX) {
2344                     SvIsUV_on(sv);
2345                     /* Integer is inaccurate. NOK, IOKp, is UV */
2346                     SvUV_set(sv, UV_MAX);
2347                 } else {
2348                     SvUV_set(sv, U_V(SvNVX(sv)));
2349                     /* 0xFFFFFFFFFFFFFFFF not an issue in here, NVs
2350                        NV preservse UV so can do correct comparison.  */
2351                     if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2352                         SvIOK_on(sv);
2353                     } else {
2354                         NOOP;   /* Integer is imprecise. NOK, IOKp, is UV */
2355                     }
2356                 }
2357                 SvIsUV_on(sv);
2358             }
2359 #else /* NV_PRESERVES_UV */
2360             if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2361                 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
2362                 /* The IV/UV slot will have been set from value returned by
2363                    grok_number above.  The NV slot has just been set using
2364                    Atof.  */
2365                 SvNOK_on(sv);
2366                 assert (SvIOKp(sv));
2367             } else {
2368                 if (((UV)1 << NV_PRESERVES_UV_BITS) >
2369                     U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2370                     /* Small enough to preserve all bits. */
2371                     (void)SvIOKp_on(sv);
2372                     SvNOK_on(sv);
2373                     SvIV_set(sv, I_V(SvNVX(sv)));
2374                     if ((NV)(SvIVX(sv)) == SvNVX(sv))
2375                         SvIOK_on(sv);
2376                     /* Assumption: first non-preserved integer is < IV_MAX,
2377                        this NV is in the preserved range, therefore: */
2378                     if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
2379                           < (UV)IV_MAX)) {
2380                         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);
2381                     }
2382                 } else {
2383                     /* IN_UV NOT_INT
2384                          0      0       already failed to read UV.
2385                          0      1       already failed to read UV.
2386                          1      0       you won't get here in this case. IV/UV
2387                                         slot set, public IOK, Atof() unneeded.
2388                          1      1       already read UV.
2389                        so there's no point in sv_2iuv_non_preserve() attempting
2390                        to use atol, strtol, strtoul etc.  */
2391 #  ifdef DEBUGGING
2392                     sv_2iuv_non_preserve (sv, numtype);
2393 #  else
2394                     sv_2iuv_non_preserve (sv);
2395 #  endif
2396                 }
2397             }
2398 #endif /* NV_PRESERVES_UV */
2399         /* It might be more code efficient to go through the entire logic above
2400            and conditionally set with SvIOKp_on() rather than SvIOK(), but it
2401            gets complex and potentially buggy, so more programmer efficient
2402            to do it this way, by turning off the public flags:  */
2403         if (!numtype)
2404             SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK);
2405         }
2406     }
2407     else  {
2408         if (isGV_with_GP(sv))
2409             return glob_2number(MUTABLE_GV(sv));
2410
2411         if (!PL_localizing && ckWARN(WARN_UNINITIALIZED))
2412                 report_uninit(sv);
2413         if (SvTYPE(sv) < SVt_IV)
2414             /* Typically the caller expects that sv_any is not NULL now.  */
2415             sv_upgrade(sv, SVt_IV);
2416         /* Return 0 from the caller.  */
2417         return TRUE;
2418     }
2419     return FALSE;
2420 }
2421
2422 /*
2423 =for apidoc sv_2iv_flags
2424
2425 Return the integer value of an SV, doing any necessary string
2426 conversion.  If flags includes SV_GMAGIC, does an mg_get() first.
2427 Normally used via the C<SvIV(sv)> and C<SvIVx(sv)> macros.
2428
2429 =cut
2430 */
2431
2432 IV
2433 Perl_sv_2iv_flags(pTHX_ SV *const sv, const I32 flags)
2434 {
2435     PERL_ARGS_ASSERT_SV_2IV_FLAGS;
2436
2437     assert (SvTYPE(sv) != SVt_PVAV && SvTYPE(sv) != SVt_PVHV
2438          && SvTYPE(sv) != SVt_PVFM);
2439
2440     if (SvGMAGICAL(sv) && (flags & SV_GMAGIC))
2441         mg_get(sv);
2442
2443     if (SvROK(sv)) {
2444         if (SvAMAGIC(sv)) {
2445             SV * tmpstr;
2446             if (flags & SV_SKIP_OVERLOAD)
2447                 return 0;
2448             tmpstr = AMG_CALLunary(sv, numer_amg);
2449             if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2450                 return SvIV(tmpstr);
2451             }
2452         }
2453         return PTR2IV(SvRV(sv));
2454     }
2455
2456     if (SvVALID(sv) || isREGEXP(sv)) {
2457         /* FBMs use the space for SvIVX and SvNVX for other purposes, and use
2458            the same flag bit as SVf_IVisUV, so must not let them cache IVs.
2459            In practice they are extremely unlikely to actually get anywhere
2460            accessible by user Perl code - the only way that I'm aware of is when
2461            a constant subroutine which is used as the second argument to index.
2462
2463            Regexps have no SvIVX and SvNVX fields.
2464         */
2465         assert(isREGEXP(sv) || SvPOKp(sv));
2466         {
2467             UV value;
2468             const char * const ptr =
2469                 isREGEXP(sv) ? RX_WRAPPED((REGEXP*)sv) : SvPVX_const(sv);
2470             const int numtype
2471                 = grok_number(ptr, SvCUR(sv), &value);
2472
2473             if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2474                 == IS_NUMBER_IN_UV) {
2475                 /* It's definitely an integer */
2476                 if (numtype & IS_NUMBER_NEG) {
2477                     if (value < (UV)IV_MIN)
2478                         return -(IV)value;
2479                 } else {
2480                     if (value < (UV)IV_MAX)
2481                         return (IV)value;
2482                 }
2483             }
2484
2485             /* Quite wrong but no good choices. */
2486             if ((numtype & IS_NUMBER_INFINITY)) {
2487                 return (numtype & IS_NUMBER_NEG) ? IV_MIN : IV_MAX;
2488             } else if ((numtype & IS_NUMBER_NAN)) {
2489                 return 0; /* So wrong. */
2490             }
2491
2492             if (!numtype) {
2493                 if (ckWARN(WARN_NUMERIC))
2494                     not_a_number(sv);
2495             }
2496             return I_V(Atof(ptr));
2497         }
2498     }
2499
2500     if (SvTHINKFIRST(sv)) {
2501 #ifdef PERL_OLD_COPY_ON_WRITE
2502         if (SvIsCOW(sv)) {
2503             sv_force_normal_flags(sv, 0);
2504         }
2505 #endif
2506         if (SvREADONLY(sv) && !SvOK(sv)) {
2507             if (ckWARN(WARN_UNINITIALIZED))
2508                 report_uninit(sv);
2509             return 0;
2510         }
2511     }
2512
2513     if (!SvIOKp(sv)) {
2514         if (S_sv_2iuv_common(aTHX_ sv))
2515             return 0;
2516     }
2517
2518     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
2519         PTR2UV(sv),SvIVX(sv)));
2520     return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
2521 }
2522
2523 /*
2524 =for apidoc sv_2uv_flags
2525
2526 Return the unsigned integer value of an SV, doing any necessary string
2527 conversion.  If flags includes SV_GMAGIC, does an mg_get() first.
2528 Normally used via the C<SvUV(sv)> and C<SvUVx(sv)> macros.
2529
2530 =cut
2531 */
2532
2533 UV
2534 Perl_sv_2uv_flags(pTHX_ SV *const sv, const I32 flags)
2535 {
2536     PERL_ARGS_ASSERT_SV_2UV_FLAGS;
2537
2538     if (SvGMAGICAL(sv) && (flags & SV_GMAGIC))
2539         mg_get(sv);
2540
2541     if (SvROK(sv)) {
2542         if (SvAMAGIC(sv)) {
2543             SV *tmpstr;
2544             if (flags & SV_SKIP_OVERLOAD)
2545                 return 0;
2546             tmpstr = AMG_CALLunary(sv, numer_amg);
2547             if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2548                 return SvUV(tmpstr);
2549             }
2550         }
2551         return PTR2UV(SvRV(sv));
2552     }
2553
2554     if (SvVALID(sv) || isREGEXP(sv)) {
2555         /* FBMs use the space for SvIVX and SvNVX for other purposes, and use
2556            the same flag bit as SVf_IVisUV, so must not let them cache IVs.  
2557            Regexps have no SvIVX and SvNVX fields. */
2558         assert(isREGEXP(sv) || SvPOKp(sv));
2559         {
2560             UV value;
2561             const char * const ptr =
2562                 isREGEXP(sv) ? RX_WRAPPED((REGEXP*)sv) : SvPVX_const(sv);
2563             const int numtype
2564                 = grok_number(ptr, SvCUR(sv), &value);
2565
2566             if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2567                 == IS_NUMBER_IN_UV) {
2568                 /* It's definitely an integer */
2569                 if (!(numtype & IS_NUMBER_NEG))
2570                     return value;
2571             }
2572
2573             /* Quite wrong but no good choices. */
2574             if ((numtype & IS_NUMBER_INFINITY)) {
2575                 return UV_MAX; /* So wrong. */
2576             } else if ((numtype & IS_NUMBER_NAN)) {
2577                 return 0; /* So wrong. */
2578             }
2579
2580             if (!numtype) {
2581                 if (ckWARN(WARN_NUMERIC))
2582                     not_a_number(sv);
2583             }
2584             return U_V(Atof(ptr));
2585         }
2586     }
2587
2588     if (SvTHINKFIRST(sv)) {
2589 #ifdef PERL_OLD_COPY_ON_WRITE
2590         if (SvIsCOW(sv)) {
2591             sv_force_normal_flags(sv, 0);
2592         }
2593 #endif
2594         if (SvREADONLY(sv) && !SvOK(sv)) {
2595             if (ckWARN(WARN_UNINITIALIZED))
2596                 report_uninit(sv);
2597             return 0;
2598         }
2599     }
2600
2601     if (!SvIOKp(sv)) {
2602         if (S_sv_2iuv_common(aTHX_ sv))
2603             return 0;
2604     }
2605
2606     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
2607                           PTR2UV(sv),SvUVX(sv)));
2608     return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
2609 }
2610
2611 /*
2612 =for apidoc sv_2nv_flags
2613
2614 Return the num value of an SV, doing any necessary string or integer
2615 conversion.  If flags includes SV_GMAGIC, does an mg_get() first.
2616 Normally used via the C<SvNV(sv)> and C<SvNVx(sv)> macros.
2617
2618 =cut
2619 */
2620
2621 NV
2622 Perl_sv_2nv_flags(pTHX_ SV *const sv, const I32 flags)
2623 {
2624     PERL_ARGS_ASSERT_SV_2NV_FLAGS;
2625
2626     assert (SvTYPE(sv) != SVt_PVAV && SvTYPE(sv) != SVt_PVHV
2627          && SvTYPE(sv) != SVt_PVFM);
2628     if (SvGMAGICAL(sv) || SvVALID(sv) || isREGEXP(sv)) {
2629         /* FBMs use the space for SvIVX and SvNVX for other purposes, and use
2630            the same flag bit as SVf_IVisUV, so must not let them cache NVs.
2631            Regexps have no SvIVX and SvNVX fields.  */
2632         const char *ptr;
2633         if (flags & SV_GMAGIC)
2634             mg_get(sv);
2635         if (SvNOKp(sv))
2636             return SvNVX(sv);
2637         if (SvPOKp(sv) && !SvIOKp(sv)) {
2638             ptr = SvPVX_const(sv);
2639           grokpv:
2640             if (!SvIOKp(sv) && ckWARN(WARN_NUMERIC) &&
2641                 !grok_number(ptr, SvCUR(sv), NULL))
2642                 not_a_number(sv);
2643             return Atof(ptr);
2644         }
2645         if (SvIOKp(sv)) {
2646             if (SvIsUV(sv))
2647                 return (NV)SvUVX(sv);
2648             else
2649                 return (NV)SvIVX(sv);
2650         }
2651         if (SvROK(sv)) {
2652             goto return_rok;
2653         }
2654         if (isREGEXP(sv)) {
2655             ptr = RX_WRAPPED((REGEXP *)sv);
2656             goto grokpv;
2657         }
2658         assert(SvTYPE(sv) >= SVt_PVMG);
2659         /* This falls through to the report_uninit near the end of the
2660            function. */
2661     } else if (SvTHINKFIRST(sv)) {
2662         if (SvROK(sv)) {
2663         return_rok:
2664             if (SvAMAGIC(sv)) {
2665                 SV *tmpstr;
2666                 if (flags & SV_SKIP_OVERLOAD)
2667                     return 0;
2668                 tmpstr = AMG_CALLunary(sv, numer_amg);
2669                 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2670                     return SvNV(tmpstr);
2671                 }
2672             }
2673             return PTR2NV(SvRV(sv));
2674         }
2675 #ifdef PERL_OLD_COPY_ON_WRITE
2676         if (SvIsCOW(sv)) {
2677             sv_force_normal_flags(sv, 0);
2678         }
2679 #endif
2680         if (SvREADONLY(sv) && !SvOK(sv)) {
2681             if (ckWARN(WARN_UNINITIALIZED))
2682                 report_uninit(sv);
2683             return 0.0;
2684         }
2685     }
2686     if (SvTYPE(sv) < SVt_NV) {
2687         /* The logic to use SVt_PVNV if necessary is in sv_upgrade.  */
2688         sv_upgrade(sv, SVt_NV);
2689         DEBUG_c({
2690             STORE_NUMERIC_LOCAL_SET_STANDARD();
2691             PerlIO_printf(Perl_debug_log,
2692                           "0x%"UVxf" num(%" NVgf ")\n",
2693                           PTR2UV(sv), SvNVX(sv));
2694             RESTORE_NUMERIC_LOCAL();
2695         });
2696     }
2697     else if (SvTYPE(sv) < SVt_PVNV)
2698         sv_upgrade(sv, SVt_PVNV);
2699     if (SvNOKp(sv)) {
2700         return SvNVX(sv);
2701     }
2702     if (SvIOKp(sv)) {
2703         SvNV_set(sv, SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv));
2704 #ifdef NV_PRESERVES_UV
2705         if (SvIOK(sv))
2706             SvNOK_on(sv);
2707         else
2708             SvNOKp_on(sv);
2709 #else
2710         /* Only set the public NV OK flag if this NV preserves the IV  */
2711         /* Check it's not 0xFFFFFFFFFFFFFFFF */
2712         if (SvIOK(sv) &&
2713             SvIsUV(sv) ? ((SvUVX(sv) != UV_MAX)&&(SvUVX(sv) == U_V(SvNVX(sv))))
2714                        : (SvIVX(sv) == I_V(SvNVX(sv))))
2715             SvNOK_on(sv);
2716         else
2717             SvNOKp_on(sv);
2718 #endif
2719     }
2720     else if (SvPOKp(sv)) {
2721         UV value;
2722         const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2723         if (!SvIOKp(sv) && !numtype && ckWARN(WARN_NUMERIC))
2724             not_a_number(sv);
2725 #ifdef NV_PRESERVES_UV
2726         if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2727             == IS_NUMBER_IN_UV) {
2728             /* It's definitely an integer */
2729             SvNV_set(sv, (numtype & IS_NUMBER_NEG) ? -(NV)value : (NV)value);
2730         } else {
2731             S_sv_setnv(aTHX_ sv, numtype);
2732         }
2733         if (numtype)
2734             SvNOK_on(sv);
2735         else
2736             SvNOKp_on(sv);
2737 #else
2738         SvNV_set(sv, Atof(SvPVX_const(sv)));
2739         /* Only set the public NV OK flag if this NV preserves the value in
2740            the PV at least as well as an IV/UV would.
2741            Not sure how to do this 100% reliably. */
2742         /* if that shift count is out of range then Configure's test is
2743            wonky. We shouldn't be in here with NV_PRESERVES_UV_BITS ==
2744            UV_BITS */
2745         if (((UV)1 << NV_PRESERVES_UV_BITS) >
2746             U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2747             SvNOK_on(sv); /* Definitely small enough to preserve all bits */
2748         } else if (!(numtype & IS_NUMBER_IN_UV)) {
2749             /* Can't use strtol etc to convert this string, so don't try.
2750                sv_2iv and sv_2uv will use the NV to convert, not the PV.  */
2751             SvNOK_on(sv);
2752         } else {
2753             /* value has been set.  It may not be precise.  */
2754             if ((numtype & IS_NUMBER_NEG) && (value >= (UV)IV_MIN)) {
2755                 /* 2s complement assumption for (UV)IV_MIN  */
2756                 SvNOK_on(sv); /* Integer is too negative.  */
2757             } else {
2758                 SvNOKp_on(sv);
2759                 SvIOKp_on(sv);
2760
2761                 if (numtype & IS_NUMBER_NEG) {
2762                     /* -IV_MIN is undefined, but we should never reach
2763                      * this point with both IS_NUMBER_NEG and value ==
2764                      * (UV)IV_MIN */
2765                     assert(value != (UV)IV_MIN);
2766                     SvIV_set(sv, -(IV)value);
2767                 } else if (value <= (UV)IV_MAX) {
2768                     SvIV_set(sv, (IV)value);
2769                 } else {
2770                     SvUV_set(sv, value);
2771                     SvIsUV_on(sv);
2772                 }
2773
2774                 if (numtype & IS_NUMBER_NOT_INT) {
2775                     /* I believe that even if the original PV had decimals,
2776                        they are lost beyond the limit of the FP precision.
2777                        However, neither is canonical, so both only get p
2778                        flags.  NWC, 2000/11/25 */
2779                     /* Both already have p flags, so do nothing */
2780                 } else {
2781                     const NV nv = SvNVX(sv);
2782                     /* XXX should this spot have NAN_COMPARE_BROKEN, too? */
2783                     if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2784                         if (SvIVX(sv) == I_V(nv)) {
2785                             SvNOK_on(sv);
2786                         } else {
2787                             /* It had no "." so it must be integer.  */
2788                         }
2789                         SvIOK_on(sv);
2790                     } else {
2791                         /* between IV_MAX and NV(UV_MAX).
2792                            Could be slightly > UV_MAX */
2793
2794                         if (numtype & IS_NUMBER_NOT_INT) {
2795                             /* UV and NV both imprecise.  */
2796                         } else {
2797                             const UV nv_as_uv = U_V(nv);
2798
2799                             if (value == nv_as_uv && SvUVX(sv) != UV_MAX) {
2800                                 SvNOK_on(sv);
2801                             }
2802                             SvIOK_on(sv);
2803                         }
2804                     }
2805                 }
2806             }
2807         }
2808         /* It might be more code efficient to go through the entire logic above
2809            and conditionally set with SvNOKp_on() rather than SvNOK(), but it
2810            gets complex and potentially buggy, so more programmer efficient
2811            to do it this way, by turning off the public flags:  */
2812         if (!numtype)
2813             SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK);
2814 #endif /* NV_PRESERVES_UV */
2815     }
2816     else  {
2817         if (isGV_with_GP(sv)) {
2818             glob_2number(MUTABLE_GV(sv));
2819             return 0.0;
2820         }
2821
2822         if (!PL_localizing && ckWARN(WARN_UNINITIALIZED))
2823             report_uninit(sv);
2824         assert (SvTYPE(sv) >= SVt_NV);
2825         /* Typically the caller expects that sv_any is not NULL now.  */
2826         /* XXX Ilya implies that this is a bug in callers that assume this
2827            and ideally should be fixed.  */
2828         return 0.0;
2829     }
2830     DEBUG_c({
2831         STORE_NUMERIC_LOCAL_SET_STANDARD();
2832         PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" NVgf ")\n",
2833                       PTR2UV(sv), SvNVX(sv));
2834         RESTORE_NUMERIC_LOCAL();
2835     });
2836     return SvNVX(sv);
2837 }
2838
2839 /*
2840 =for apidoc sv_2num
2841
2842 Return an SV with the numeric value of the source SV, doing any necessary
2843 reference or overload conversion.  The caller is expected to have handled
2844 get-magic already.
2845
2846 =cut
2847 */
2848
2849 SV *
2850 Perl_sv_2num(pTHX_ SV *const sv)
2851 {
2852     PERL_ARGS_ASSERT_SV_2NUM;
2853
2854     if (!SvROK(sv))
2855         return sv;
2856     if (SvAMAGIC(sv)) {
2857         SV * const tmpsv = AMG_CALLunary(sv, numer_amg);
2858         TAINT_IF(tmpsv && SvTAINTED(tmpsv));
2859         if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
2860             return sv_2num(tmpsv);
2861     }
2862     return sv_2mortal(newSVuv(PTR2UV(SvRV(sv))));
2863 }
2864
2865 /* uiv_2buf(): private routine for use by sv_2pv_flags(): print an IV or
2866  * UV as a string towards the end of buf, and return pointers to start and
2867  * end of it.
2868  *
2869  * We assume that buf is at least TYPE_CHARS(UV) long.
2870  */
2871
2872 static char *
2873 S_uiv_2buf(char *const buf, const IV iv, UV uv, const int is_uv, char **const peob)
2874 {
2875     char *ptr = buf + TYPE_CHARS(UV);
2876     char * const ebuf = ptr;
2877     int sign;
2878
2879     PERL_ARGS_ASSERT_UIV_2BUF;
2880
2881     if (is_uv)
2882         sign = 0;
2883     else if (iv >= 0) {
2884         uv = iv;
2885         sign = 0;
2886     } else {
2887         uv = (iv == IV_MIN) ? (UV)iv : (UV)(-iv);
2888         sign = 1;
2889     }
2890     do {
2891         *--ptr = '0' + (char)(uv % 10);
2892     } while (uv /= 10);
2893     if (sign)
2894         *--ptr = '-';
2895     *peob = ebuf;
2896     return ptr;
2897 }
2898
2899 /* Helper for sv_2pv_flags and sv_vcatpvfn_flags.  If the NV is an
2900  * infinity or a not-a-number, writes the appropriate strings to the
2901  * buffer, including a zero byte.  On success returns the written length,
2902  * excluding the zero byte, on failure (not an infinity, not a nan, or the
2903  * maxlen too small) returns zero.
2904  *
2905  * XXX for "Inf", "-Inf", and "NaN", we could have three read-only
2906  * shared string constants we point to, instead of generating a new
2907  * string for each instance. */
2908 STATIC size_t
2909 S_infnan_2pv(NV nv, char* buffer, size_t maxlen, char plus) {
2910     assert(maxlen >= 4);
2911     if (maxlen < 4) /* "Inf\0", "NaN\0" */
2912         return 0;
2913     else {
2914         char* s = buffer;
2915         if (Perl_isinf(nv)) {
2916             if (nv < 0) {
2917                 if (maxlen < 5) /* "-Inf\0"  */
2918                     return 0;
2919                 *s++ = '-';
2920             } else if (plus) {
2921                 *s++ = '+';
2922             }
2923             *s++ = 'I';
2924             *s++ = 'n';
2925             *s++ = 'f';
2926         } else if (Perl_isnan(nv)) {
2927             *s++ = 'N';
2928             *s++ = 'a';
2929             *s++ = 'N';
2930             /* XXX optionally output the payload mantissa bits as
2931              * "(unsigned)" (to match the nan("...") C99 function,
2932              * or maybe as "(0xhhh...)"  would make more sense...
2933              * provide a format string so that the user can decide?
2934              * NOTE: would affect the maxlen and assert() logic.*/
2935         }
2936
2937         else
2938             return 0;
2939         assert((s == buffer + 3) || (s == buffer + 4));
2940         *s++ = 0;
2941         return s - buffer - 1; /* -1: excluding the zero byte */
2942     }
2943 }
2944
2945 /*
2946 =for apidoc sv_2pv_flags
2947
2948 Returns a pointer to the string value of an SV, and sets *lp to its length.
2949 If flags includes SV_GMAGIC, does an mg_get() first.  Coerces sv to a
2950 string if necessary.  Normally invoked via the C<SvPV_flags> macro.
2951 C<sv_2pv()> and C<sv_2pv_nomg> usually end up here too.
2952
2953 =cut
2954 */
2955
2956 char *
2957 Perl_sv_2pv_flags(pTHX_ SV *const sv, STRLEN *const lp, const I32 flags)
2958 {
2959     char *s;
2960
2961     PERL_ARGS_ASSERT_SV_2PV_FLAGS;
2962
2963     assert (SvTYPE(sv) != SVt_PVAV && SvTYPE(sv) != SVt_PVHV
2964          && SvTYPE(sv) != SVt_PVFM);
2965     if (SvGMAGICAL(sv) && (flags & SV_GMAGIC))
2966         mg_get(sv);
2967     if (SvROK(sv)) {
2968         if (SvAMAGIC(sv)) {
2969             SV *tmpstr;
2970             if (flags & SV_SKIP_OVERLOAD)
2971                 return NULL;
2972             tmpstr = AMG_CALLunary(sv, string_amg);
2973             TAINT_IF(tmpstr && SvTAINTED(tmpstr));
2974             if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2975                 /* Unwrap this:  */
2976                 /* char *pv = lp ? SvPV(tmpstr, *lp) : SvPV_nolen(tmpstr);
2977                  */
2978
2979                 char *pv;
2980                 if ((SvFLAGS(tmpstr) & (SVf_POK)) == SVf_POK) {
2981                     if (flags & SV_CONST_RETURN) {
2982                         pv = (char *) SvPVX_const(tmpstr);
2983                     } else {
2984                         pv = (flags & SV_MUTABLE_RETURN)
2985                             ? SvPVX_mutable(tmpstr) : SvPVX(tmpstr);
2986                     }
2987                     if (lp)
2988                         *lp = SvCUR(tmpstr);
2989                 } else {
2990                     pv = sv_2pv_flags(tmpstr, lp, flags);
2991                 }
2992                 if (SvUTF8(tmpstr))
2993                     SvUTF8_on(sv);
2994                 else
2995                     SvUTF8_off(sv);
2996                 return pv;
2997             }
2998         }
2999         {
3000             STRLEN len;
3001             char *retval;
3002             char *buffer;
3003             SV *const referent = SvRV(sv);
3004
3005             if (!referent) {
3006                 len = 7;
3007                 retval = buffer = savepvn("NULLREF", len);
3008             } else if (SvTYPE(referent) == SVt_REGEXP &&
3009                        (!(PL_curcop->cop_hints & HINT_NO_AMAGIC) ||
3010                         amagic_is_enabled(string_amg))) {
3011                 REGEXP * const re = (REGEXP *)MUTABLE_PTR(referent);
3012
3013                 assert(re);
3014                         
3015                 /* If the regex is UTF-8 we want the containing scalar to
3016                    have an UTF-8 flag too */
3017                 if (RX_UTF8(re))
3018                     SvUTF8_on(sv);
3019                 else
3020                     SvUTF8_off(sv);     
3021
3022                 if (lp)
3023                     *lp = RX_WRAPLEN(re);
3024  
3025                 return RX_WRAPPED(re);
3026             } else {
3027                 const char *const typestr = sv_reftype(referent, 0);
3028                 const STRLEN typelen = strlen(typestr);
3029                 UV addr = PTR2UV(referent);
3030                 const char *stashname = NULL;
3031                 STRLEN stashnamelen = 0; /* hush, gcc */
3032                 const char *buffer_end;
3033
3034                 if (SvOBJECT(referent)) {
3035                     const HEK *const name = HvNAME_HEK(SvSTASH(referent));
3036
3037                     if (name) {
3038                         stashname = HEK_KEY(name);
3039                         stashnamelen = HEK_LEN(name);
3040
3041                         if (HEK_UTF8(name)) {
3042                             SvUTF8_on(sv);
3043                         } else {
3044                             SvUTF8_off(sv);
3045                         }
3046                     } else {
3047                         stashname = "__ANON__";
3048                         stashnamelen = 8;
3049                     }
3050                     len = stashnamelen + 1 /* = */ + typelen + 3 /* (0x */
3051                         + 2 * sizeof(UV) + 2 /* )\0 */;
3052                 } else {
3053                     len = typelen + 3 /* (0x */
3054                         + 2 * sizeof(UV) + 2 /* )\0 */;
3055                 }
3056
3057                 Newx(buffer, len, char);
3058                 buffer_end = retval = buffer + len;
3059
3060                 /* Working backwards  */
3061                 *--retval = '\0';
3062                 *--retval = ')';
3063                 do {
3064                     *--retval = PL_hexdigit[addr & 15];
3065                 } while (addr >>= 4);
3066                 *--retval = 'x';
3067                 *--retval = '0';
3068                 *--retval = '(';
3069
3070                 retval -= typelen;
3071                 memcpy(retval, typestr, typelen);
3072
3073                 if (stashname) {
3074                     *--retval = '=';
3075                     retval -= stashnamelen;
3076                     memcpy(retval, stashname, stashnamelen);
3077                 }
3078                 /* retval may not necessarily have reached the start of the
3079                    buffer here.  */
3080                 assert (retval >= buffer);
3081
3082                 len = buffer_end - retval - 1; /* -1 for that \0  */
3083             }
3084             if (lp)
3085                 *lp = len;
3086             SAVEFREEPV(buffer);
3087             return retval;
3088         }
3089     }
3090
3091     if (SvPOKp(sv)) {
3092         if (lp)
3093             *lp = SvCUR(sv);
3094         if (flags & SV_MUTABLE_RETURN)
3095             return SvPVX_mutable(sv);
3096         if (flags & SV_CONST_RETURN)
3097             return (char *)SvPVX_const(sv);
3098         return SvPVX(sv);
3099     }
3100
3101     if (SvIOK(sv)) {
3102         /* I'm assuming that if both IV and NV are equally valid then
3103            converting the IV is going to be more efficient */
3104         const U32 isUIOK = SvIsUV(sv);
3105         char buf[TYPE_CHARS(UV)];
3106         char *ebuf, *ptr;
3107         STRLEN len;
3108
3109         if (SvTYPE(sv) < SVt_PVIV)
3110             sv_upgrade(sv, SVt_PVIV);
3111         ptr = uiv_2buf(buf, SvIVX(sv), SvUVX(sv), isUIOK, &ebuf);
3112         len = ebuf - ptr;
3113         /* inlined from sv_setpvn */
3114         s = SvGROW_mutable(sv, len + 1);
3115         Move(ptr, s, len, char);
3116         s += len;
3117         *s = '\0';
3118         SvPOK_on(sv);
3119     }
3120     else if (SvNOK(sv)) {
3121         if (SvTYPE(sv) < SVt_PVNV)
3122             sv_upgrade(sv, SVt_PVNV);
3123         if (SvNVX(sv) == 0.0
3124 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
3125             && !Perl_isnan(SvNVX(sv))
3126 #endif
3127         ) {
3128             s = SvGROW_mutable(sv, 2);
3129             *s++ = '0';
3130             *s = '\0';
3131         } else {
3132             STRLEN len;
3133             STRLEN size = 5; /* "-Inf\0" */
3134
3135             s = SvGROW_mutable(sv, size);
3136             len = S_infnan_2pv(SvNVX(sv), s, size, 0);
3137             if (len > 0) {
3138                 s += len;
3139                 SvPOK_on(sv);
3140             }
3141             else {
3142                 /* some Xenix systems wipe out errno here */
3143                 dSAVE_ERRNO;
3144
3145                 size =
3146                     1 + /* sign */
3147                     1 + /* "." */
3148                     NV_DIG +
3149                     1 + /* "e" */
3150                     1 + /* sign */
3151                     5 + /* exponent digits */
3152                     1 + /* \0 */
3153                     2; /* paranoia */
3154
3155                 s = SvGROW_mutable(sv, size);
3156 #ifndef USE_LOCALE_NUMERIC
3157                 SNPRINTF_G(SvNVX(sv), s, SvLEN(sv), NV_DIG);
3158
3159                 SvPOK_on(sv);
3160 #else
3161                 {
3162                     bool local_radix;
3163                     DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
3164                     STORE_LC_NUMERIC_SET_TO_NEEDED();
3165
3166                     local_radix =
3167                         PL_numeric_local &&
3168                         PL_numeric_radix_sv &&
3169                         SvUTF8(PL_numeric_radix_sv);
3170                     if (local_radix && SvLEN(PL_numeric_radix_sv) > 1) {
3171                         size += SvLEN(PL_numeric_radix_sv) - 1;
3172                         s = SvGROW_mutable(sv, size);
3173                     }
3174
3175                     SNPRINTF_G(SvNVX(sv), s, SvLEN(sv), NV_DIG);
3176
3177                     /* If the radix character is UTF-8, and actually is in the
3178                      * output, turn on the UTF-8 flag for the scalar */
3179                     if (local_radix &&
3180                         instr(s, SvPVX_const(PL_numeric_radix_sv))) {
3181                         SvUTF8_on(sv);
3182                     }
3183
3184                     RESTORE_LC_NUMERIC();
3185                 }
3186
3187                 /* We don't call SvPOK_on(), because it may come to
3188                  * pass that the locale changes so that the
3189                  * stringification we just did is no longer correct.  We
3190                  * will have to re-stringify every time it is needed */
3191 #endif
3192                 RESTORE_ERRNO;
3193             }
3194             while (*s) s++;
3195         }
3196     }
3197     else if (isGV_with_GP(sv)) {
3198         GV *const gv = MUTABLE_GV(sv);
3199         SV *const buffer = sv_newmortal();
3200
3201         gv_efullname3(buffer, gv, "*");
3202
3203         assert(SvPOK(buffer));
3204         if (SvUTF8(buffer))
3205             SvUTF8_on(sv);
3206         if (lp)
3207             *lp = SvCUR(buffer);
3208         return SvPVX(buffer);
3209     }
3210     else if (isREGEXP(sv)) {
3211         if (lp) *lp = RX_WRAPLEN((REGEXP *)sv);
3212         return RX_WRAPPED((REGEXP *)sv);
3213     }
3214     else {
3215         if (lp)
3216             *lp = 0;
3217         if (flags & SV_UNDEF_RETURNS_NULL)
3218             return NULL;
3219         if (!PL_localizing && ckWARN(WARN_UNINITIALIZED))
3220             report_uninit(sv);
3221         /* Typically the caller expects that sv_any is not NULL now.  */
3222         if (!SvREADONLY(sv) && SvTYPE(sv) < SVt_PV)
3223             sv_upgrade(sv, SVt_PV);
3224         return (char *)"";
3225     }
3226
3227     {
3228         const STRLEN len = s - SvPVX_const(sv);
3229         if (lp) 
3230             *lp = len;
3231         SvCUR_set(sv, len);
3232     }
3233     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3234                           PTR2UV(sv),SvPVX_const(sv)));
3235     if (flags & SV_CONST_RETURN)
3236         return (char *)SvPVX_const(sv);
3237     if (flags & SV_MUTABLE_RETURN)
3238         return SvPVX_mutable(sv);
3239     return SvPVX(sv);
3240 }
3241
3242 /*
3243 =for apidoc sv_copypv
3244
3245 Copies a stringified representation of the source SV into the
3246 destination SV.  Automatically performs any necessary mg_get and
3247 coercion of numeric values into strings.  Guaranteed to preserve
3248 UTF8 flag even from overloaded objects.  Similar in nature to
3249 sv_2pv[_flags] but operates directly on an SV instead of just the
3250 string.  Mostly uses sv_2pv_flags to do its work, except when that
3251 would lose the UTF-8'ness of the PV.
3252
3253 =for apidoc sv_copypv_nomg
3254
3255 Like sv_copypv, but doesn't invoke get magic first.
3256
3257 =for apidoc sv_copypv_flags
3258
3259 Implementation of sv_copypv and sv_copypv_nomg.  Calls get magic iff flags
3260 include SV_GMAGIC.
3261
3262 =cut
3263 */
3264
3265 void
3266 Perl_sv_copypv_flags(pTHX_ SV *const dsv, SV *const ssv, const I32 flags)
3267 {
3268     STRLEN len;
3269     const char *s;
3270
3271     PERL_ARGS_ASSERT_SV_COPYPV_FLAGS;
3272
3273     s = SvPV_flags_const(ssv,len,(flags & SV_GMAGIC));
3274     sv_setpvn(dsv,s,len);
3275     if (SvUTF8(ssv))
3276         SvUTF8_on(dsv);
3277     else
3278         SvUTF8_off(dsv);
3279 }
3280
3281 /*
3282 =for apidoc sv_2pvbyte
3283
3284 Return a pointer to the byte-encoded representation of the SV, and set *lp
3285 to its length.  May cause the SV to be downgraded from UTF-8 as a
3286 side-effect.
3287
3288 Usually accessed via the C<SvPVbyte> macro.
3289
3290 =cut
3291 */
3292
3293 char *
3294 Perl_sv_2pvbyte(pTHX_ SV *sv, STRLEN *const lp)
3295 {
3296     PERL_ARGS_ASSERT_SV_2PVBYTE;
3297
3298     SvGETMAGIC(sv);
3299     if (((SvREADONLY(sv) || SvFAKE(sv)) && !SvIsCOW(sv))
3300      || isGV_with_GP(sv) || SvROK(sv)) {
3301         SV *sv2 = sv_newmortal();
3302         sv_copypv_nomg(sv2,sv);
3303         sv = sv2;
3304     }
3305     sv_utf8_downgrade(sv,0);
3306     return lp ? SvPV_nomg(sv,*lp) : SvPV_nomg_nolen(sv);
3307 }
3308
3309 /*
3310 =for apidoc sv_2pvutf8
3311
3312 Return a pointer to the UTF-8-encoded representation of the SV, and set *lp
3313 to its length.  May cause the SV to be upgraded to UTF-8 as a side-effect.
3314
3315 Usually accessed via the C<SvPVutf8> macro.
3316
3317 =cut
3318 */
3319
3320 char *
3321 Perl_sv_2pvutf8(pTHX_ SV *sv, STRLEN *const lp)
3322 {
3323     PERL_ARGS_ASSERT_SV_2PVUTF8;
3324
3325     if (((SvREADONLY(sv) || SvFAKE(sv)) && !SvIsCOW(sv))
3326      || isGV_with_GP(sv) || SvROK(sv))
3327         sv = sv_mortalcopy(sv);
3328     else
3329         SvGETMAGIC(sv);
3330     sv_utf8_upgrade_nomg(sv);
3331     return lp ? SvPV_nomg(sv,*lp) : SvPV_nomg_nolen(sv);
3332 }
3333
3334
3335 /*
3336 =for apidoc sv_2bool
3337
3338 This macro is only used by sv_true() or its macro equivalent, and only if
3339 the latter's argument is neither SvPOK, SvIOK nor SvNOK.
3340 It calls sv_2bool_flags with the SV_GMAGIC flag.
3341
3342 =for apidoc sv_2bool_flags
3343
3344 This function is only used by sv_true() and friends,  and only if
3345 the latter's argument is neither SvPOK, SvIOK nor SvNOK.  If the flags
3346 contain SV_GMAGIC, then it does an mg_get() first.
3347
3348
3349 =cut
3350 */
3351
3352 bool
3353 Perl_sv_2bool_flags(pTHX_ SV *sv, I32 flags)
3354 {
3355     PERL_ARGS_ASSERT_SV_2BOOL_FLAGS;
3356
3357     restart:
3358     if(flags & SV_GMAGIC) SvGETMAGIC(sv);
3359
3360     if (!SvOK(sv))
3361         return 0;
3362     if (SvROK(sv)) {
3363         if (SvAMAGIC(sv)) {
3364             SV * const tmpsv = AMG_CALLunary(sv, bool__amg);
3365             if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv)))) {
3366                 bool svb;
3367                 sv = tmpsv;
3368                 if(SvGMAGICAL(sv)) {
3369                     flags = SV_GMAGIC;
3370                     goto restart; /* call sv_2bool */
3371                 }
3372                 /* expanded SvTRUE_common(sv, (flags = 0, goto restart)) */
3373                 else if(!SvOK(sv)) {
3374                     svb = 0;
3375                 }
3376                 else if(SvPOK(sv)) {
3377                     svb = SvPVXtrue(sv);
3378                 }
3379                 else if((SvFLAGS(sv) & (SVf_IOK|SVf_NOK))) {
3380                     svb = (SvIOK(sv) && SvIVX(sv) != 0)
3381                         || (SvNOK(sv) && SvNVX(sv) != 0.0);
3382                 }
3383                 else {
3384                     flags = 0;
3385                     goto restart; /* call sv_2bool_nomg */
3386                 }
3387                 return cBOOL(svb);
3388             }
3389         }
3390         return SvRV(sv) != 0;
3391     }
3392     if (isREGEXP(sv))
3393         return
3394           RX_WRAPLEN(sv) > 1 || (RX_WRAPLEN(sv) && *RX_WRAPPED(sv) != '0');
3395     return SvTRUE_common(sv, isGV_with_GP(sv) ? 1 : 0);
3396 }
3397
3398 /*
3399 =for apidoc sv_utf8_upgrade
3400
3401 Converts the PV of an SV to its UTF-8-encoded form.
3402 Forces the SV to string form if it is not already.
3403 Will C<mg_get> on C<sv> if appropriate.
3404 Always sets the SvUTF8 flag to avoid future validity checks even
3405 if the whole string is the same in UTF-8 as not.
3406 Returns the number of bytes in the converted string
3407
3408 This is not a general purpose byte encoding to Unicode interface:
3409 use the Encode extension for that.
3410
3411 =for apidoc sv_utf8_upgrade_nomg
3412
3413 Like sv_utf8_upgrade, but doesn't do magic on C<sv>.
3414
3415 =for apidoc sv_utf8_upgrade_flags
3416
3417 Converts the PV of an SV to its UTF-8-encoded form.
3418 Forces the SV to string form if it is not already.
3419 Always sets the SvUTF8 flag to avoid future validity checks even
3420 if all the bytes are invariant in UTF-8.
3421 If C<flags> has C<SV_GMAGIC> bit set,
3422 will C<mg_get> on C<sv> if appropriate, else not.
3423
3424 If C<flags> has SV_FORCE_UTF8_UPGRADE set, this function assumes that the PV
3425 will expand when converted to UTF-8, and skips the extra work of checking for
3426 that.  Typically this flag is used by a routine that has already parsed the
3427 string and found such characters, and passes this information on so that the
3428 work doesn't have to be repeated.
3429
3430 Returns the number of bytes in the converted string.
3431
3432 This is not a general purpose byte encoding to Unicode interface:
3433 use the Encode extension for that.
3434
3435 =for apidoc sv_utf8_upgrade_flags_grow
3436
3437 Like sv_utf8_upgrade_flags, but has an additional parameter C<extra>, which is
3438 the number of unused bytes the string of 'sv' is guaranteed to have free after
3439 it upon return.  This allows the caller to reserve extra space that it intends
3440 to fill, to avoid extra grows.
3441
3442 C<sv_utf8_upgrade>, C<sv_utf8_upgrade_nomg>, and C<sv_utf8_upgrade_flags>
3443 are implemented in terms of this function.
3444
3445 Returns the number of bytes in the converted string (not including the spares).
3446
3447 =cut
3448
3449 (One might think that the calling routine could pass in the position of the
3450 first variant character when it has set SV_FORCE_UTF8_UPGRADE, so it wouldn't
3451 have to be found again.  But that is not the case, because typically when the
3452 caller is likely to use this flag, it won't be calling this routine unless it
3453 finds something that won't fit into a byte.  Otherwise it tries to not upgrade
3454 and just use bytes.  But some things that do fit into a byte are variants in
3455 utf8, and the caller may not have been keeping track of these.)
3456
3457 If the routine itself changes the string, it adds a trailing C<NUL>.  Such a
3458 C<NUL> isn't guaranteed due to having other routines do the work in some input
3459 cases, or if the input is already flagged as being in utf8.
3460
3461 The speed of this could perhaps be improved for many cases if someone wanted to
3462 write a fast function that counts the number of variant characters in a string,
3463 especially if it could return the position of the first one.
3464
3465 */
3466
3467 STRLEN
3468 Perl_sv_utf8_upgrade_flags_grow(pTHX_ SV *const sv, const I32 flags, STRLEN extra)
3469 {
3470     PERL_ARGS_ASSERT_SV_UTF8_UPGRADE_FLAGS_GROW;
3471
3472     if (sv == &PL_sv_undef)
3473         return 0;
3474     if (!SvPOK_nog(sv)) {
3475         STRLEN len = 0;
3476         if (SvREADONLY(sv) && (SvPOKp(sv) || SvIOKp(sv) || SvNOKp(sv))) {
3477             (void) sv_2pv_flags(sv,&len, flags);
3478             if (SvUTF8(sv)) {
3479                 if (extra) SvGROW(sv, SvCUR(sv) + extra);
3480                 return len;
3481             }
3482         } else {
3483             (void) SvPV_force_flags(sv,len,flags & SV_GMAGIC);
3484         }
3485     }
3486
3487     if (SvUTF8(sv)) {
3488         if (extra) SvGROW(sv, SvCUR(sv) + extra);
3489         return SvCUR(sv);
3490     }
3491
3492     if (SvIsCOW(sv)) {
3493         S_sv_uncow(aTHX_ sv, 0);
3494     }
3495
3496     if (IN_ENCODING && !(flags & SV_UTF8_NO_ENCODING)) {
3497         sv_recode_to_utf8(sv, _get_encoding());
3498         if (extra) SvGROW(sv, SvCUR(sv) + extra);
3499         return SvCUR(sv);
3500     }
3501
3502     if (SvCUR(sv) == 0) {
3503         if (extra) SvGROW(sv, extra);
3504     } else { /* Assume Latin-1/EBCDIC */
3505         /* This function could be much more efficient if we
3506          * had a FLAG in SVs to signal if there are any variant
3507          * chars in the PV.  Given that there isn't such a flag
3508          * make the loop as fast as possible (although there are certainly ways
3509          * to speed this up, eg. through vectorization) */
3510         U8 * s = (U8 *) SvPVX_const(sv);
3511         U8 * e = (U8 *) SvEND(sv);
3512         U8 *t = s;
3513         STRLEN two_byte_count = 0;
3514         
3515         if (flags & SV_FORCE_UTF8_UPGRADE) goto must_be_utf8;
3516
3517         /* See if really will need to convert to utf8.  We mustn't rely on our
3518          * incoming SV being well formed and having a trailing '\0', as certain
3519          * code in pp_formline can send us partially built SVs. */
3520
3521         while (t < e) {
3522             const U8 ch = *t++;
3523             if (NATIVE_BYTE_IS_INVARIANT(ch)) continue;
3524
3525             t--;    /* t already incremented; re-point to first variant */
3526             two_byte_count = 1;
3527             goto must_be_utf8;
3528         }
3529
3530         /* utf8 conversion not needed because all are invariants.  Mark as
3531          * UTF-8 even if no variant - saves scanning loop */
3532         SvUTF8_on(sv);
3533         if (extra) SvGROW(sv, SvCUR(sv) + extra);
3534         return SvCUR(sv);
3535
3536       must_be_utf8:
3537
3538         /* Here, the string should be converted to utf8, either because of an
3539          * input flag (two_byte_count = 0), or because a character that
3540          * requires 2 bytes was found (two_byte_count = 1).  t points either to
3541          * the beginning of the string (if we didn't examine anything), or to
3542          * the first variant.  In either case, everything from s to t - 1 will
3543          * occupy only 1 byte each on output.
3544          *
3545          * There are two main ways to convert.  One is to create a new string
3546          * and go through the input starting from the beginning, appending each
3547          * converted value onto the new string as we go along.  It's probably
3548          * best to allocate enough space in the string for the worst possible
3549          * case rather than possibly running out of space and having to
3550          * reallocate and then copy what we've done so far.  Since everything
3551          * from s to t - 1 is invariant, the destination can be initialized
3552          * with these using a fast memory copy
3553          *
3554          * The other way is to figure out exactly how big the string should be
3555          * by parsing the entire input.  Then you don't have to make it big
3556          * enough to handle the worst possible case, and more importantly, if
3557          * the string you already have is large enough, you don't have to
3558          * allocate a new string, you can copy the last character in the input
3559          * string to the final position(s) that will be occupied by the
3560          * converted string and go backwards, stopping at t, since everything
3561          * before that is invariant.
3562          *
3563          * There are advantages and disadvantages to each method.
3564          *
3565          * In the first method, we can allocate a new string, do the memory
3566          * copy from the s to t - 1, and then proceed through the rest of the
3567          * string byte-by-byte.
3568          *
3569          * In the second method, we proceed through the rest of the input
3570          * string just calculating how big the converted string will be.  Then
3571          * there are two cases:
3572          *  1)  if the string has enough extra space to handle the converted
3573          *      value.  We go backwards through the string, converting until we
3574          *      get to the position we are at now, and then stop.  If this
3575          *      position is far enough along in the string, this method is
3576          *      faster than the other method.  If the memory copy were the same
3577          *      speed as the byte-by-byte loop, that position would be about
3578          *      half-way, as at the half-way mark, parsing to the end and back
3579          *      is one complete string's parse, the same amount as starting
3580          *      over and going all the way through.  Actually, it would be
3581          *      somewhat less than half-way, as it's faster to just count bytes
3582          *      than to also copy, and we don't have the overhead of allocating
3583          *      a new string, changing the scalar to use it, and freeing the
3584          *      existing one.  But if the memory copy is fast, the break-even
3585          *      point is somewhere after half way.  The counting loop could be
3586          *      sped up by vectorization, etc, to move the break-even point
3587          *      further towards the beginning.
3588          *  2)  if the string doesn't have enough space to handle the converted
3589          *      value.  A new string will have to be allocated, and one might
3590          *      as well, given that, start from the beginning doing the first
3591          *      method.  We've spent extra time parsing the string and in
3592          *      exchange all we've gotten is that we know precisely how big to
3593          *      make the new one.  Perl is more optimized for time than space,
3594          *      so this case is a loser.
3595          * So what I've decided to do is not use the 2nd method unless it is
3596          * guaranteed that a new string won't have to be allocated, assuming
3597          * the worst case.  I also decided not to put any more conditions on it
3598          * than this, for now.  It seems likely that, since the worst case is
3599          * twice as big as the unknown portion of the string (plus 1), we won't
3600          * be guaranteed enough space, causing us to go to the first method,
3601          * unless the string is short, or the first variant character is near
3602          * the end of it.  In either of these cases, it seems best to use the
3603          * 2nd method.  The only circumstance I can think of where this would
3604          * be really slower is if the string had once had much more data in it
3605          * than it does now, but there is still a substantial amount in it  */
3606
3607         {
3608             STRLEN invariant_head = t - s;
3609             STRLEN size = invariant_head + (e - t) * 2 + 1 + extra;
3610             if (SvLEN(sv) < size) {
3611
3612                 /* Here, have decided to allocate a new string */
3613
3614                 U8 *dst;
3615                 U8 *d;
3616
3617                 Newx(dst, size, U8);
3618
3619                 /* If no known invariants at the beginning of the input string,
3620                  * set so starts from there.  Otherwise, can use memory copy to
3621                  * get up to where we are now, and then start from here */
3622
3623                 if (invariant_head == 0) {
3624                     d = dst;
3625                 } else {
3626                     Copy(s, dst, invariant_head, char);
3627                     d = dst + invariant_head;
3628                 }
3629
3630                 while (t < e) {
3631                     append_utf8_from_native_byte(*t, &d);
3632                     t++;
3633                 }
3634                 *d = '\0';
3635                 SvPV_free(sv); /* No longer using pre-existing string */
3636                 SvPV_set(sv, (char*)dst);
3637                 SvCUR_set(sv, d - dst);
3638                 SvLEN_set(sv, size);
3639             } else {
3640
3641                 /* Here, have decided to get the exact size of the string.
3642                  * Currently this happens only when we know that there is
3643                  * guaranteed enough space to fit the converted string, so
3644                  * don't have to worry about growing.  If two_byte_count is 0,
3645                  * then t points to the first byte of the string which hasn't
3646                  * been examined yet.  Otherwise two_byte_count is 1, and t
3647                  * points to the first byte in the string that will expand to
3648                  * two.  Depending on this, start examining at t or 1 after t.
3649                  * */
3650
3651                 U8 *d = t + two_byte_count;
3652
3653
3654                 /* Count up the remaining bytes that expand to two */
3655
3656                 while (d < e) {
3657                     const U8 chr = *d++;
3658                     if (! NATIVE_BYTE_IS_INVARIANT(chr)) two_byte_count++;
3659                 }
3660
3661                 /* The string will expand by just the number of bytes that
3662                  * occupy two positions.  But we are one afterwards because of
3663                  * the increment just above.  This is the place to put the
3664                  * trailing NUL, and to set the length before we decrement */
3665
3666                 d += two_byte_count;
3667                 SvCUR_set(sv, d - s);
3668                 *d-- = '\0';
3669
3670
3671                 /* Having decremented d, it points to the position to put the
3672                  * very last byte of the expanded string.  Go backwards through
3673                  * the string, copying and expanding as we go, stopping when we
3674                  * get to the part that is invariant the rest of the way down */
3675
3676                 e--;
3677                 while (e >= t) {
3678                     if (NATIVE_BYTE_IS_INVARIANT(*e)) {
3679                         *d-- = *e;
3680                     } else {
3681                         *d-- = UTF8_EIGHT_BIT_LO(*e);
3682                         *d-- = UTF8_EIGHT_BIT_HI(*e);
3683                     }
3684                     e--;
3685                 }
3686             }
3687
3688             if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
3689                 /* Update pos. We do it at the end rather than during
3690                  * the upgrade, to avoid slowing down the common case
3691                  * (upgrade without pos).
3692                  * pos can be stored as either bytes or characters.  Since
3693                  * this was previously a byte string we can just turn off
3694                  * the bytes flag. */
3695                 MAGIC * mg = mg_find(sv, PERL_MAGIC_regex_global);
3696                 if (mg) {
3697                     mg->mg_flags &= ~MGf_BYTES;
3698                 }
3699                 if ((mg = mg_find(sv, PERL_MAGIC_utf8)))
3700                     magic_setutf8(sv,mg); /* clear UTF8 cache */
3701             }
3702         }
3703     }
3704
3705     /* Mark as UTF-8 even if no variant - saves scanning loop */
3706     SvUTF8_on(sv);
3707     return SvCUR(sv);
3708 }
3709
3710 /*
3711 =for apidoc sv_utf8_downgrade
3712
3713 Attempts to convert the PV of an SV from characters to bytes.
3714 If the PV contains a character that cannot fit
3715 in a byte, this conversion will fail;
3716 in this case, either returns false or, if C<fail_ok> is not
3717 true, croaks.
3718
3719 This is not a general purpose Unicode to byte encoding interface:
3720 use the Encode extension for that.
3721
3722 =cut
3723 */
3724
3725 bool
3726 Perl_sv_utf8_downgrade(pTHX_ SV *const sv, const bool fail_ok)
3727 {
3728     PERL_ARGS_ASSERT_SV_UTF8_DOWNGRADE;
3729
3730     if (SvPOKp(sv) && SvUTF8(sv)) {
3731         if (SvCUR(sv)) {
3732             U8 *s;
3733             STRLEN len;
3734             int mg_flags = SV_GMAGIC;
3735
3736             if (SvIsCOW(sv)) {
3737                 S_sv_uncow(aTHX_ sv, 0);
3738             }
3739             if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
3740                 /* update pos */
3741                 MAGIC * mg = mg_find(sv, PERL_MAGIC_regex_global);
3742                 if (mg && mg->mg_len > 0 && mg->mg_flags & MGf_BYTES) {
3743                         mg->mg_len = sv_pos_b2u_flags(sv, mg->mg_len,
3744                                                 SV_GMAGIC|SV_CONST_RETURN);
3745                         mg_flags = 0; /* sv_pos_b2u does get magic */
3746                 }
3747                 if ((mg = mg_find(sv, PERL_MAGIC_utf8)))
3748                     magic_setutf8(sv,mg); /* clear UTF8 cache */
3749
3750             }
3751             s = (U8 *) SvPV_flags(sv, len, mg_flags);
3752
3753             if (!utf8_to_bytes(s, &len)) {
3754                 if (fail_ok)
3755                     return FALSE;
3756                 else {
3757                     if (PL_op)
3758                         Perl_croak(aTHX_ "Wide character in %s",
3759                                    OP_DESC(PL_op));
3760                     else
3761                         Perl_croak(aTHX_ "Wide character");
3762                 }
3763             }
3764             SvCUR_set(sv, len);
3765         }
3766     }
3767     SvUTF8_off(sv);
3768     return TRUE;
3769 }
3770
3771 /*
3772 =for apidoc sv_utf8_encode
3773
3774 Converts the PV of an SV to UTF-8, but then turns the C<SvUTF8>
3775 flag off so that it looks like octets again.
3776
3777 =cut
3778 */
3779
3780 void
3781 Perl_sv_utf8_encode(pTHX_ SV *const sv)
3782 {
3783     PERL_ARGS_ASSERT_SV_UTF8_ENCODE;
3784
3785     if (SvREADONLY(sv)) {
3786         sv_force_normal_flags(sv, 0);
3787     }
3788     (void) sv_utf8_upgrade(sv);
3789     SvUTF8_off(sv);
3790 }
3791
3792 /*
3793 =for apidoc sv_utf8_decode
3794
3795 If the PV of the SV is an octet sequence in UTF-8
3796 and contains a multiple-byte character, the C<SvUTF8> flag is turned on
3797 so that it looks like a character.  If the PV contains only single-byte
3798 characters, the C<SvUTF8> flag stays off.
3799 Scans PV for validity and returns false if the PV is invalid UTF-8.
3800
3801 =cut
3802 */
3803
3804 bool
3805 Perl_sv_utf8_decode(pTHX_ SV *const sv)
3806 {
3807     PERL_ARGS_ASSERT_SV_UTF8_DECODE;
3808
3809     if (SvPOKp(sv)) {
3810         const U8 *start, *c;
3811         const U8 *e;
3812
3813         /* The octets may have got themselves encoded - get them back as
3814          * bytes
3815          */
3816         if (!sv_utf8_downgrade(sv, TRUE))
3817             return FALSE;
3818
3819         /* it is actually just a matter of turning the utf8 flag on, but
3820          * we want to make sure everything inside is valid utf8 first.
3821          */
3822         c = start = (const U8 *) SvPVX_const(sv);
3823         if (!is_utf8_string(c, SvCUR(sv)))
3824             return FALSE;
3825         e = (const U8 *) SvEND(sv);
3826         while (c < e) {
3827             const U8 ch = *c++;
3828             if (!UTF8_IS_INVARIANT(ch)) {
3829                 SvUTF8_on(sv);
3830                 break;
3831             }
3832         }
3833         if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
3834             /* XXX Is this dead code?  XS_utf8_decode calls SvSETMAGIC
3835                    after this, clearing pos.  Does anything on CPAN
3836                    need this? */
3837             /* adjust pos to the start of a UTF8 char sequence */
3838             MAGIC * mg = mg_find(sv, PERL_MAGIC_regex_global);
3839             if (mg) {
3840                 I32 pos = mg->mg_len;
3841                 if (pos > 0) {
3842                     for (c = start + pos; c > start; c--) {
3843                         if (UTF8_IS_START(*c))
3844                             break;
3845                     }
3846                     mg->mg_len  = c - start;
3847                 }
3848             }
3849             if ((mg = mg_find(sv, PERL_MAGIC_utf8)))
3850                 magic_setutf8(sv,mg); /* clear UTF8 cache */
3851         }
3852     }
3853     return TRUE;
3854 }
3855
3856 /*
3857 =for apidoc sv_setsv
3858
3859 Copies the contents of the source SV C<ssv> into the destination SV
3860 C<dsv>.  The source SV may be destroyed if it is mortal, so don't use this
3861 function if the source SV needs to be reused.  Does not handle 'set' magic on
3862 destination SV.  Calls 'get' magic on source SV.  Loosely speaking, it
3863 performs a copy-by-value, obliterating any previous content of the
3864 destination.
3865
3866 You probably want to use one of the assortment of wrappers, such as
3867 C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3868 C<SvSetMagicSV_nosteal>.
3869
3870 =for apidoc sv_setsv_flags
3871
3872 Copies the contents of the source SV C<ssv> into the destination SV
3873 C<dsv>.  The source SV may be destroyed if it is mortal, so don't use this
3874 function if the source SV needs to be reused.  Does not handle 'set' magic.
3875 Loosely speaking, it performs a copy-by-value, obliterating any previous
3876 content of the destination.
3877 If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
3878 C<ssv> if appropriate, else not.  If the C<flags>
3879 parameter has the C<SV_NOSTEAL> bit set then the
3880 buffers of temps will not be stolen.  <sv_setsv>
3881 and C<sv_setsv_nomg> are implemented in terms of this function.
3882
3883 You probably want to use one of the assortment of wrappers, such as
3884 C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3885 C<SvSetMagicSV_nosteal>.
3886
3887 This is the primary function for copying scalars, and most other
3888 copy-ish functions and macros use this underneath.
3889
3890 =cut
3891 */
3892
3893 static void
3894 S_glob_assign_glob(pTHX_ SV *const dstr, SV *const sstr, const int dtype)
3895 {
3896     I32 mro_changes = 0; /* 1 = method, 2 = isa, 3 = recursive isa */
3897     HV *old_stash = NULL;
3898
3899     PERL_ARGS_ASSERT_GLOB_ASSIGN_GLOB;
3900
3901     if (dtype != SVt_PVGV && !isGV_with_GP(dstr)) {
3902         const char * const name = GvNAME(sstr);
3903         const STRLEN len = GvNAMELEN(sstr);
3904         {
3905             if (dtype >= SVt_PV) {
3906                 SvPV_free(dstr);
3907                 SvPV_set(dstr, 0);
3908                 SvLEN_set(dstr, 0);
3909                 SvCUR_set(dstr, 0);
3910             }
3911             SvUPGRADE(dstr, SVt_PVGV);
3912             (void)SvOK_off(dstr);
3913             isGV_with_GP_on(dstr);
3914         }
3915         GvSTASH(dstr) = GvSTASH(sstr);
3916         if (GvSTASH(dstr))
3917             Perl_sv_add_backref(aTHX_ MUTABLE_SV(GvSTASH(dstr)), dstr);
3918         gv_name_set(MUTABLE_GV(dstr), name, len,
3919                         GV_ADD | (GvNAMEUTF8(sstr) ? SVf_UTF8 : 0 ));
3920         SvFAKE_on(dstr);        /* can coerce to non-glob */
3921     }
3922
3923     if(GvGP(MUTABLE_GV(sstr))) {
3924         /* If source has method cache entry, clear it */
3925         if(GvCVGEN(sstr)) {
3926             SvREFCNT_dec(GvCV(sstr));
3927             GvCV_set(sstr, NULL);
3928             GvCVGEN(sstr) = 0;
3929         }
3930         /* If source has a real method, then a method is
3931            going to change */
3932         else if(
3933          GvCV((const GV *)sstr) && GvSTASH(dstr) && HvENAME(GvSTASH(dstr))
3934         ) {
3935             mro_changes = 1;
3936         }
3937     }
3938
3939     /* If dest already had a real method, that's a change as well */
3940     if(
3941         !mro_changes && GvGP(MUTABLE_GV(dstr)) && GvCVu((const GV *)dstr)
3942      && GvSTASH(dstr) && HvENAME(GvSTASH(dstr))
3943     ) {
3944         mro_changes = 1;
3945     }
3946
3947     /* We don't need to check the name of the destination if it was not a
3948        glob to begin with. */
3949     if(dtype == SVt_PVGV) {
3950         const char * const name = GvNAME((const GV *)dstr);
3951         if(
3952             strEQ(name,"ISA")
3953          /* The stash may have been detached from the symbol table, so
3954             check its name. */
3955          && GvSTASH(dstr) && HvENAME(GvSTASH(dstr))
3956         )
3957             mro_changes = 2;
3958         else {
3959             const STRLEN len = GvNAMELEN(dstr);
3960             if ((len > 1 && name[len-2] == ':' && name[len-1] == ':')
3961              || (len == 1 && name[0] == ':')) {
3962                 mro_changes = 3;
3963
3964                 /* Set aside the old stash, so we can reset isa caches on
3965                    its subclasses. */
3966                 if((old_stash = GvHV(dstr)))
3967                     /* Make sure we do not lose it early. */
3968                     SvREFCNT_inc_simple_void_NN(
3969                      sv_2mortal((SV *)old_stash)
3970                     );
3971             }
3972         }
3973
3974         SvREFCNT_inc_simple_void_NN(sv_2mortal(dstr));
3975     }
3976
3977     gp_free(MUTABLE_GV(dstr));
3978     GvINTRO_off(dstr);          /* one-shot flag */
3979     GvGP_set(dstr, gp_ref(GvGP(sstr)));
3980     if (SvTAINTED(sstr))
3981         SvTAINT(dstr);
3982     if (GvIMPORTED(dstr) != GVf_IMPORTED
3983         && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3984         {
3985             GvIMPORTED_on(dstr);
3986         }
3987     GvMULTI_on(dstr);
3988     if(mro_changes == 2) {
3989       if (GvAV((const GV *)sstr)) {
3990         MAGIC *mg;
3991         SV * const sref = (SV *)GvAV((const GV *)dstr);
3992         if (SvSMAGICAL(sref) && (mg = mg_find(sref, PERL_MAGIC_isa))) {
3993             if (SvTYPE(mg->mg_obj) != SVt_PVAV) {
3994                 AV * const ary = newAV();
3995                 av_push(ary, mg->mg_obj); /* takes the refcount */
3996                 mg->mg_obj = (SV *)ary;
3997             }
3998             av_push((AV *)mg->mg_obj, SvREFCNT_inc_simple_NN(dstr));
3999         }
4000         else sv_magic(sref, dstr, PERL_MAGIC_isa, NULL, 0);
4001       }
4002       mro_isa_changed_in(GvSTASH(dstr));
4003     }
4004     else if(mro_changes == 3) {
4005         HV * const stash = GvHV(dstr);
4006         if(old_stash ? (HV *)HvENAME_get(old_stash) : stash)
4007             mro_package_moved(
4008                 stash, old_stash,
4009                 (GV *)dstr, 0
4010             );
4011     }
4012     else if(mro_changes) mro_method_changed_in(GvSTASH(dstr));
4013     if (GvIO(dstr) && dtype == SVt_PVGV) {
4014         DEBUG_o(Perl_deb(aTHX_
4015                         "glob_assign_glob clearing PL_stashcache\n"));
4016         /* It's a cache. It will rebuild itself quite happily.
4017            It's a lot of effort to work out exactly which key (or keys)
4018            might be invalidated by the creation of the this file handle.
4019          */
4020         hv_clear(PL_stashcache);
4021     }
4022     return;
4023 }
4024
4025 void
4026 Perl_gv_setref(pTHX_ SV *const dstr, SV *const sstr)
4027 {
4028     SV * const sref = SvRV(sstr);
4029     SV *dref;
4030     const int intro = GvINTRO(dstr);
4031     SV **location;
4032     U8 import_flag = 0;
4033     const U32 stype = SvTYPE(sref);
4034
4035     PERL_ARGS_ASSERT_GV_SETREF;
4036
4037     if (intro) {
4038         GvINTRO_off(dstr);      /* one-shot flag */
4039         GvLINE(dstr) = CopLINE(PL_curcop);
4040         GvEGV(dstr) = MUTABLE_GV(dstr);
4041     }
4042     GvMULTI_on(dstr);
4043     switch (stype) {
4044     case SVt_PVCV:
4045         location = (SV **) &(GvGP(dstr)->gp_cv); /* XXX bypassing GvCV_set */
4046         import_flag = GVf_IMPORTED_CV;
4047         goto common;
4048     case SVt_PVHV:
4049         location = (SV **) &GvHV(dstr);
4050         import_flag = GVf_IMPORTED_HV;
4051         goto common;
4052     case SVt_PVAV:
4053         location = (SV **) &GvAV(dstr);
4054         import_flag = GVf_IMPORTED_AV;
4055         goto common;
4056     case SVt_PVIO:
4057         location = (SV **) &GvIOp(dstr);
4058         goto common;
4059     case SVt_PVFM:
4060         location = (SV **) &GvFORM(dstr);
4061         goto common;
4062     default:
4063         location = &GvSV(dstr);
4064         import_flag = GVf_IMPORTED_SV;
4065     common:
4066         if (intro) {
4067             if (stype == SVt_PVCV) {
4068                 /*if (GvCVGEN(dstr) && (GvCV(dstr) != (const CV *)sref || GvCVGEN(dstr))) {*/
4069                 if (GvCVGEN(dstr)) {
4070                     SvREFCNT_dec(GvCV(dstr));
4071                     GvCV_set(dstr, NULL);
4072                     GvCVGEN(dstr) = 0; /* Switch off cacheness. */
4073                 }
4074             }
4075             /* SAVEt_GVSLOT takes more room on the savestack and has more
4076                overhead in leave_scope than SAVEt_GENERIC_SV.  But for CVs
4077                leave_scope needs access to the GV so it can reset method
4078                caches.  We must use SAVEt_GVSLOT whenever the type is
4079                SVt_PVCV, even if the stash is anonymous, as the stash may
4080                gain a name somehow before leave_scope. */
4081             if (stype == SVt_PVCV) {
4082                 /* There is no save_pushptrptrptr.  Creating it for this
4083                    one call site would be overkill.  So inline the ss add
4084                    routines here. */
4085                 dSS_ADD;
4086                 SS_ADD_PTR(dstr);
4087                 SS_ADD_PTR(location);
4088                 SS_ADD_PTR(SvREFCNT_inc(*location));
4089                 SS_ADD_UV(SAVEt_GVSLOT);
4090                 SS_ADD_END(4);
4091             }
4092             else SAVEGENERICSV(*location);
4093         }
4094         dref = *location;
4095         if (stype == SVt_PVCV && (*location != sref || GvCVGEN(dstr))) {
4096             CV* const cv = MUTABLE_CV(*location);
4097             if (cv) {
4098                 if (!GvCVGEN((const GV *)dstr) &&
4099                     (CvROOT(cv) || CvXSUB(cv)) &&
4100                     /* redundant check that avoids creating the extra SV
4101                        most of the time: */
4102                     (CvCONST(cv) || ckWARN(WARN_REDEFINE)))
4103                     {
4104                         SV * const new_const_sv =
4105                             CvCONST((const CV *)sref)
4106                                  ? cv_const_sv((const CV *)sref)
4107                                  : NULL;
4108                         report_redefined_cv(
4109                            sv_2mortal(Perl_newSVpvf(aTHX_
4110                                 "%"HEKf"::%"HEKf,
4111                                 HEKfARG(
4112                                  HvNAME_HEK(GvSTASH((const GV *)dstr))
4113                                 ),
4114                                 HEKfARG(GvENAME_HEK(MUTABLE_GV(dstr)))
4115                            )),
4116                            cv,
4117                            CvCONST((const CV *)sref) ? &new_const_sv : NULL
4118                         );
4119                     }
4120                 if (!intro)
4121                     cv_ckproto_len_flags(cv, (const GV *)dstr,
4122                                    SvPOK(sref) ? CvPROTO(sref) : NULL,
4123                                    SvPOK(sref) ? CvPROTOLEN(sref) : 0,
4124                                    SvPOK(sref) ? SvUTF8(sref) : 0);
4125             }
4126             GvCVGEN(dstr) = 0; /* Switch off cacheness. */
4127             GvASSUMECV_on(dstr);
4128             if(GvSTASH(dstr)) { /* sub foo { 1 } sub bar { 2 } *bar = \&foo */
4129                 if (intro && GvREFCNT(dstr) > 1) {
4130                     /* temporary remove extra savestack's ref */
4131                     --GvREFCNT(dstr);
4132                     gv_method_changed(dstr);
4133                     ++GvREFCNT(dstr);
4134                 }
4135                 else gv_method_changed(dstr);
4136             }
4137         }
4138         *location = SvREFCNT_inc_simple_NN(sref);
4139         if (import_flag && !(GvFLAGS(dstr) & import_flag)
4140             && CopSTASH_ne(PL_curcop, GvSTASH(dstr))) {
4141             GvFLAGS(dstr) |= import_flag;
4142         }
4143         if (import_flag == GVf_IMPORTED_SV) {
4144             if (intro) {
4145                 save_aliased_sv((GV *)dstr);
4146             }
4147             /* Turn off the flag if sref is not referenced elsewhere,
4148                even by weak refs.  (SvRMAGICAL is a pessimistic check for
4149                back refs.)  */
4150             if (SvREFCNT(sref) <= 2 && !SvRMAGICAL(sref))
4151                 GvALIASED_SV_off(dstr);
4152             else
4153                 GvALIASED_SV_on(dstr);
4154         }
4155         if (stype == SVt_PVHV) {
4156             const char * const name = GvNAME((GV*)dstr);
4157             const STRLEN len = GvNAMELEN(dstr);
4158             if (
4159                 (
4160                    (len > 1 && name[len-2] == ':' && name[len-1] == ':')
4161                 || (len == 1 && name[0] == ':')
4162                 )
4163              && (!dref || HvENAME_get(dref))
4164             ) {
4165                 mro_package_moved(
4166                     (HV *)sref, (HV *)dref,
4167                     (GV *)dstr, 0
4168                 );
4169             }
4170         }
4171         else if (
4172             stype == SVt_PVAV && sref != dref
4173          && strEQ(GvNAME((GV*)dstr), "ISA")
4174          /* The stash may have been detached from the symbol table, so
4175             check its name before doing anything. */
4176          && GvSTASH(dstr) && HvENAME(GvSTASH(dstr))
4177         ) {
4178             MAGIC *mg;
4179             MAGIC * const omg = dref && SvSMAGICAL(dref)
4180                                  ? mg_find(dref, PERL_MAGIC_isa)
4181                                  : NULL;
4182             if (SvSMAGICAL(sref) && (mg = mg_find(sref, PERL_MAGIC_isa))) {
4183                 if (SvTYPE(mg->mg_obj) != SVt_PVAV) {
4184                     AV * const ary = newAV();
4185                     av_push(ary, mg->mg_obj); /* takes the refcount */
4186                     mg->mg_obj = (SV *)ary;
4187                 }
4188                 if (omg) {
4189                     if (SvTYPE(omg->mg_obj) == SVt_PVAV) {
4190                         SV **svp = AvARRAY((AV *)omg->mg_obj);
4191                         I32 items = AvFILLp((AV *)omg->mg_obj) + 1;
4192                         while (items--)
4193                             av_push(
4194                              (AV *)mg->mg_obj,
4195                              SvREFCNT_inc_simple_NN(*svp++)
4196                             );
4197                     }
4198                     else
4199                         av_push(
4200                          (AV *)mg->mg_obj,
4201                          SvREFCNT_inc_simple_NN(omg->mg_obj)
4202                         );
4203                 }
4204                 else
4205                     av_push((AV *)mg->mg_obj,SvREFCNT_inc_simple_NN(dstr));
4206             }
4207             else
4208             {
4209                 sv_magic(
4210                  sref, omg ? omg->mg_obj : dstr, PERL_MAGIC_isa, NULL, 0
4211                 );
4212                 mg = mg_find(sref, PERL_MAGIC_isa);
4213             }
4214             /* Since the *ISA assignment could have affected more than
4215                one stash, don't call mro_isa_changed_in directly, but let
4216                magic_clearisa do it for us, as it already has the logic for
4217                dealing with globs vs arrays of globs. */
4218             assert(mg);
4219             Perl_magic_clearisa(aTHX_ NULL, mg);
4220         }
4221         else if (stype == SVt_PVIO) {
4222             DEBUG_o(Perl_deb(aTHX_ "gv_setref clearing PL_stashcache\n"));
4223             /* It's a cache. It will rebuild itself quite happily.
4224                It's a lot of effort to work out exactly which key (or keys)
4225                might be invalidated by the creation of the this file handle.
4226             */
4227             hv_clear(PL_stashcache);
4228         }
4229         break;
4230     }
4231     if (!intro) SvREFCNT_dec(dref);
4232     if (SvTAINTED(sstr))
4233         SvTAINT(dstr);
4234     return;
4235 }
4236
4237
4238
4239
4240 #ifdef PERL_DEBUG_READONLY_COW
4241 # include <sys/mman.h>
4242
4243 # ifndef PERL_MEMORY_DEBUG_HEADER_SIZE
4244 #  define PERL_MEMORY_DEBUG_HEADER_SIZE 0
4245 # endif
4246
4247 void
4248 Perl_sv_buf_to_ro(pTHX_ SV *sv)
4249 {
4250     struct perl_memory_debug_header * const header =
4251         (struct perl_memory_debug_header *)(SvPVX(sv)-PERL_MEMORY_DEBUG_HEADER_SIZE);
4252     const MEM_SIZE len = header->size;
4253     PERL_ARGS_ASSERT_SV_BUF_TO_RO;
4254 # ifdef PERL_TRACK_MEMPOOL
4255     if (!header->readonly) header->readonly = 1;
4256 # endif
4257     if (mprotect(header, len, PROT_READ))
4258         Perl_warn(aTHX_ "mprotect RW for COW string %p %lu failed with %d",
4259                          header, len, errno);
4260 }
4261
4262 static void
4263 S_sv_buf_to_rw(pTHX_ SV *sv)
4264 {
4265     struct perl_memory_debug_header * const header =
4266         (struct perl_memory_debug_header *)(SvPVX(sv)-PERL_MEMORY_DEBUG_HEADER_SIZE);
4267     const MEM_SIZE len = header->size;
4268     PERL_ARGS_ASSERT_SV_BUF_TO_RW;
4269     if (mprotect(header, len, PROT_READ|PROT_WRITE))
4270         Perl_warn(aTHX_ "mprotect for COW string %p %lu failed with %d",
4271                          header, len, errno);
4272 # ifdef PERL_TRACK_MEMPOOL
4273     header->readonly = 0;
4274 # endif
4275 }
4276
4277 #else
4278 # define sv_buf_to_ro(sv)       NOOP
4279 # define sv_buf_to_rw(sv)       NOOP
4280 #endif
4281
4282 void
4283 Perl_sv_setsv_flags(pTHX_ SV *dstr, SV* sstr, const I32 flags)
4284 {
4285     U32 sflags;
4286     int dtype;
4287     svtype stype;
4288
4289     PERL_ARGS_ASSERT_SV_SETSV_FLAGS;
4290
4291     if (UNLIKELY( sstr == dstr ))
4292         return;
4293
4294     if (SvIS_FREED(dstr)) {
4295         Perl_croak(aTHX_ "panic: attempt to copy value %" SVf
4296                    " to a freed scalar %p", SVfARG(sstr), (void *)dstr);
4297     }
4298     SV_CHECK_THINKFIRST_COW_DROP(dstr);
4299     if (UNLIKELY( !sstr ))
4300         sstr = &PL_sv_undef;
4301     if (SvIS_FREED(sstr)) {
4302         Perl_croak(aTHX_ "panic: attempt to copy freed scalar %p to %p",
4303                    (void*)sstr, (void*)dstr);
4304     }
4305     stype = SvTYPE(sstr);
4306     dtype = SvTYPE(dstr);
4307
4308     /* There's a lot of redundancy below but we're going for speed here */
4309
4310     switch (stype) {
4311     case SVt_NULL:
4312       undef_sstr:
4313         if (LIKELY( dtype != SVt_PVGV && dtype != SVt_PVLV )) {
4314             (void)SvOK_off(dstr);
4315             return;
4316         }
4317         break;
4318     case SVt_IV:
4319         if (SvIOK(sstr)) {
4320             switch (dtype) {
4321             case SVt_NULL:
4322                 /* For performance, we inline promoting to type SVt_IV. */
4323                 /* We're starting from SVt_NULL, so provided that define is
4324                  * actual 0, we don't have to unset any SV type flags
4325                  * to promote to SVt_IV. */
4326                 STATIC_ASSERT_STMT(SVt_NULL == 0);
4327                 SET_SVANY_FOR_BODYLESS_IV(dstr);
4328                 SvFLAGS(dstr) |= SVt_IV;
4329                 break;
4330             case SVt_NV:
4331             case SVt_PV:
4332                 sv_upgrade(dstr, SVt_PVIV);
4333                 break;
4334             case SVt_PVGV:
4335             case SVt_PVLV:
4336                 goto end_of_first_switch;
4337             }
4338             (void)SvIOK_only(dstr);
4339             SvIV_set(dstr,  SvIVX(sstr));
4340             if (SvIsUV(sstr))
4341                 SvIsUV_on(dstr);
4342             /* SvTAINTED can only be true if the SV has taint magic, which in
4343                turn means that the SV type is PVMG (or greater). This is the
4344                case statement for SVt_IV, so this cannot be true (whatever gcov
4345                may say).  */
4346             assert(!SvTAINTED(sstr));
4347             return;
4348         }
4349         if (!SvROK(sstr))
4350             goto undef_sstr;
4351         if (dtype < SVt_PV && dtype != SVt_IV)
4352             sv_upgrade(dstr, SVt_IV);
4353         break;
4354
4355     case SVt_NV:
4356         if (LIKELY( SvNOK(sstr) )) {
4357             switch (dtype) {
4358             case SVt_NULL:
4359             case SVt_IV:
4360                 sv_upgrade(dstr, SVt_NV);
4361                 break;
4362             case SVt_PV:
4363             case SVt_PVIV:
4364                 sv_upgrade(dstr, SVt_PVNV);
4365                 break;
4366             case SVt_PVGV:
4367             case SVt_PVLV:
4368                 goto end_of_first_switch;
4369             }
4370             SvNV_set(dstr, SvNVX(sstr));
4371             (void)SvNOK_only(dstr);
4372             /* SvTAINTED can only be true if the SV has taint magic, which in
4373                turn means that the SV type is PVMG (or greater). This is the
4374                case statement for SVt_NV, so this cannot be true (whatever gcov
4375                may say).  */
4376             assert(!SvTAINTED(sstr));
4377             return;
4378         }
4379         goto undef_sstr;
4380
4381     case SVt_PV:
4382         if (dtype < SVt_PV)
4383             sv_upgrade(dstr, SVt_PV);
4384         break;
4385     case SVt_PVIV:
4386         if (dtype < SVt_PVIV)
4387             sv_upgrade(dstr, SVt_PVIV);
4388         break;
4389     case SVt_PVNV:
4390         if (dtype < SVt_PVNV)
4391             sv_upgrade(dstr, SVt_PVNV);
4392         break;
4393     default:
4394         {
4395         const char * const type = sv_reftype(sstr,0);
4396         if (PL_op)
4397             /* diag_listed_as: Bizarre copy of %s */
4398             Perl_croak(aTHX_ "Bizarre copy of %s in %s", type, OP_DESC(PL_op));
4399         else
4400             Perl_croak(aTHX_ "Bizarre copy of %s", type);
4401         }
4402         NOT_REACHED; /* NOTREACHED */
4403
4404     case SVt_REGEXP:
4405       upgregexp:
4406         if (dtype < SVt_REGEXP)
4407         {
4408             if (dtype >= SVt_PV) {
4409                 SvPV_free(dstr);
4410                 SvPV_set(dstr, 0);
4411                 SvLEN_set(dstr, 0);
4412                 SvCUR_set(dstr, 0);
4413             }
4414             sv_upgrade(dstr, SVt_REGEXP);
4415         }
4416         break;
4417
4418         case SVt_INVLIST:
4419     case SVt_PVLV:
4420     case SVt_PVGV:
4421     case SVt_PVMG:
4422         if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
4423             mg_get(sstr);
4424             if (SvTYPE(sstr) != stype)
4425                 stype = SvTYPE(sstr);
4426         }
4427         if (isGV_with_GP(sstr) && dtype <= SVt_PVLV) {
4428                     glob_assign_glob(dstr, sstr, dtype);
4429                     return;
4430         }
4431         if (stype == SVt_PVLV)
4432         {
4433             if (isREGEXP(sstr)) goto upgregexp;
4434             SvUPGRADE(dstr, SVt_PVNV);
4435         }
4436         else
4437             SvUPGRADE(dstr, (svtype)stype);
4438     }
4439  end_of_first_switch:
4440
4441     /* dstr may have been upgraded.  */
4442     dtype = SvTYPE(dstr);
4443     sflags = SvFLAGS(sstr);
4444
4445     if (UNLIKELY( dtype == SVt_PVCV )) {
4446         /* Assigning to a subroutine sets the prototype.  */
4447         if (SvOK(sstr)) {
4448             STRLEN len;
4449             const char *const ptr = SvPV_const(sstr, len);
4450
4451             SvGROW(dstr, len + 1);
4452             Copy(ptr, SvPVX(dstr), len + 1, char);
4453             SvCUR_set(dstr, len);
4454             SvPOK_only(dstr);
4455             SvFLAGS(dstr) |= sflags & SVf_UTF8;
4456             CvAUTOLOAD_off(dstr);
4457         } else {
4458             SvOK_off(dstr);
4459         }
4460     }
4461     else if (UNLIKELY(dtype == SVt_PVAV || dtype == SVt_PVHV
4462              || dtype == SVt_PVFM))
4463     {
4464         const char * const type = sv_reftype(dstr,0);
4465         if (PL_op)
4466             /* diag_listed_as: Cannot copy to %s */
4467             Perl_croak(aTHX_ "Cannot copy to %s in %s", type, OP_DESC(PL_op));
4468         else
4469             Perl_croak(aTHX_ "Cannot copy to %s", type);
4470     } else if (sflags & SVf_ROK) {
4471         if (isGV_with_GP(dstr)
4472             && SvTYPE(SvRV(sstr)) == SVt_PVGV && isGV_with_GP(SvRV(sstr))) {
4473             sstr = SvRV(sstr);
4474             if (sstr == dstr) {
4475                 if (GvIMPORTED(dstr) != GVf_IMPORTED
4476                     && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4477                 {
4478                     GvIMPORTED_on(dstr);
4479                 }
4480                 GvMULTI_on(dstr);
4481                 return;
4482             }
4483             glob_assign_glob(dstr, sstr, dtype);
4484             return;
4485         }
4486
4487         if (dtype >= SVt_PV) {
4488             if (isGV_with_GP(dstr)) {
4489                 gv_setref(dstr, sstr);
4490                 return;
4491             }
4492             if (SvPVX_const(dstr)) {
4493                 SvPV_free(dstr);
4494                 SvLEN_set(dstr, 0);
4495                 SvCUR_set(dstr, 0);
4496             }
4497         }
4498         (void)SvOK_off(dstr);
4499         SvRV_set(dstr, SvREFCNT_inc(SvRV(sstr)));
4500         SvFLAGS(dstr) |= sflags & SVf_ROK;
4501         assert(!(sflags & SVp_NOK));
4502         assert(!(sflags & SVp_IOK));
4503         assert(!(sflags & SVf_NOK));
4504         assert(!(sflags & SVf_IOK));
4505     }
4506     else if (isGV_with_GP(dstr)) {
4507         if (!(sflags & SVf_OK)) {
4508             Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
4509                            "Undefined value assigned to typeglob");
4510         }
4511         else {
4512             GV *gv = gv_fetchsv_nomg(sstr, GV_ADD, SVt_PVGV);
4513             if (dstr != (const SV *)gv) {
4514                 const char * const name = GvNAME((const GV *)dstr);
4515                 const STRLEN len = GvNAMELEN(dstr);
4516                 HV *old_stash = NULL;
4517                 bool reset_isa = FALSE;
4518                 if ((len > 1 && name[len-2] == ':' && name[len-1] == ':')
4519                  || (len == 1 && name[0] == ':')) {
4520                     /* Set aside the old stash, so we can reset isa caches
4521                        on its subclasses. */
4522                     if((old_stash = GvHV(dstr))) {
4523                         /* Make sure we do not lose it early. */
4524                         SvREFCNT_inc_simple_void_NN(
4525                          sv_2mortal((SV *)old_stash)
4526                         );
4527                     }
4528                     reset_isa = TRUE;
4529                 }
4530
4531                 if (GvGP(dstr)) {
4532                     SvREFCNT_inc_simple_void_NN(sv_2mortal(dstr));
4533                     gp_free(MUTABLE_GV(dstr));
4534                 }
4535                 GvGP_set(dstr, gp_ref(GvGP(gv)));
4536
4537                 if (reset_isa) {
4538                     HV * const stash = GvHV(dstr);
4539                     if(
4540                         old_stash ? (HV *)HvENAME_get(old_stash) : stash
4541                     )
4542                         mro_package_moved(
4543                          stash, old_stash,
4544                          (GV *)dstr, 0
4545                         );
4546                 }
4547             }
4548         }
4549     }
4550     else if ((dtype == SVt_REGEXP || dtype == SVt_PVLV)
4551           && (stype == SVt_REGEXP || isREGEXP(sstr))) {
4552         reg_temp_copy((REGEXP*)dstr, (REGEXP*)sstr);
4553     }
4554     else if (sflags & SVp_POK) {
4555         const STRLEN cur = SvCUR(sstr);
4556         const STRLEN len = SvLEN(sstr);
4557
4558         /*
4559          * We have three basic ways to copy the string:
4560          *
4561          *  1. Swipe
4562          *  2. Copy-on-write
4563          *  3. Actual copy
4564          * 
4565          * Which we choose is based on various factors.  The following
4566          * things are listed in order of speed, fastest to slowest:
4567          *  - Swipe
4568          *  - Copying a short string
4569          *  - Copy-on-write bookkeeping
4570          *  - malloc
4571          *  - Copying a long string
4572          * 
4573          * We swipe the string (steal the string buffer) if the SV on the
4574          * rhs is about to be freed anyway (TEMP and refcnt==1).  This is a
4575          * big win on long strings.  It should be a win on short strings if
4576          * SvPVX_const(dstr) has to be allocated.  If not, it should not 
4577          * slow things down, as SvPVX_const(sstr) would have been freed
4578          * soon anyway.
4579          * 
4580          * We also steal the buffer from a PADTMP (operator target) if it
4581          * is â€˜long enough’.  For short strings, a swipe does not help
4582          * here, as it causes more malloc calls the next time the target
4583          * is used.  Benchmarks show that even if SvPVX_const(dstr) has to
4584          * be allocated it is still not worth swiping PADTMPs for short
4585          * strings, as the savings here are small.
4586          * 
4587          * If swiping is not an option, then we see whether it is
4588          * worth using copy-on-write.  If the lhs already has a buf-
4589          * fer big enough and the string is short, we skip it and fall back
4590          * to method 3, since memcpy is faster for short strings than the
4591          * later bookkeeping overhead that copy-on-write entails.
4592
4593          * If the rhs is not a copy-on-write string yet, then we also
4594          * consider whether the buffer is too large relative to the string
4595          * it holds.  Some operations such as readline allocate a large
4596          * buffer in the expectation of reusing it.  But turning such into
4597          * a COW buffer is counter-productive because it increases memory
4598          * usage by making readline allocate a new large buffer the sec-
4599          * ond time round.  So, if the buffer is too large, again, we use
4600          * method 3 (copy).
4601          * 
4602          * Finally, if there is no buffer on the left, or the buffer is too 
4603          * small, then we use copy-on-write and make both SVs share the
4604          * string buffer.
4605          *
4606          */
4607
4608         /* Whichever path we take through the next code, we want this true,
4609            and doing it now facilitates the COW check.  */
4610         (void)SvPOK_only(dstr);
4611
4612         if (
4613                  (              /* Either ... */
4614                                 /* slated for free anyway (and not COW)? */
4615                     (sflags & (SVs_TEMP|SVf_IsCOW)) == SVs_TEMP
4616                                 /* or a swipable TARG */
4617                  || ((sflags &
4618                            (SVs_PADTMP|SVf_READONLY|SVf_PROTECT|SVf_IsCOW))
4619                        == SVs_PADTMP
4620                                 /* whose buffer is worth stealing */
4621                      && CHECK_COWBUF_THRESHOLD(cur,len)
4622                     )
4623                  ) &&
4624                  !(sflags & SVf_OOK) &&   /* and not involved in OOK hack? */
4625                  (!(flags & SV_NOSTEAL)) &&
4626                                         /* and we're allowed to steal temps */
4627                  SvREFCNT(sstr) == 1 &&   /* and no other references to it? */
4628                  len)             /* and really is a string */
4629         {       /* Passes the swipe test.  */
4630             if (SvPVX_const(dstr))      /* we know that dtype >= SVt_PV */
4631                 SvPV_free(dstr);
4632             SvPV_set(dstr, SvPVX_mutable(sstr));
4633             SvLEN_set(dstr, SvLEN(sstr));
4634             SvCUR_set(dstr, SvCUR(sstr));
4635
4636             SvTEMP_off(dstr);
4637             (void)SvOK_off(sstr);       /* NOTE: nukes most SvFLAGS on sstr */
4638             SvPV_set(sstr, NULL);
4639             SvLEN_set(sstr, 0);
4640             SvCUR_set(sstr, 0);
4641             SvTEMP_off(sstr);
4642         }
4643         else if (flags & SV_COW_SHARED_HASH_KEYS
4644               &&
4645 #ifdef PERL_OLD_COPY_ON_WRITE
4646                  (  sflags & SVf_IsCOW
4647                  || (   (sflags & CAN_COW_MASK) == CAN_COW_FLAGS
4648                      && (SvFLAGS(dstr) & CAN_COW_MASK) == CAN_COW_FLAGS
4649                      && SvTYPE(sstr) >= SVt_PVIV && len
4650                     )
4651                  )
4652 #elif defined(PERL_NEW_COPY_ON_WRITE)
4653                  (sflags & SVf_IsCOW
4654                    ? (!len ||
4655                        (  (CHECK_COWBUF_THRESHOLD(cur,len) || SvLEN(dstr) < cur+1)
4656                           /* If this is a regular (non-hek) COW, only so
4657                              many COW "copies" are possible. */
4658                        && CowREFCNT(sstr) != SV_COW_REFCNT_MAX  ))
4659                    : (  (sflags & CAN_COW_MASK) == CAN_COW_FLAGS
4660                      && !(SvFLAGS(dstr) & SVf_BREAK)
4661                      && CHECK_COW_THRESHOLD(cur,len) && cur+1 < len
4662                      && (CHECK_COWBUF_THRESHOLD(cur,len) || SvLEN(dstr) < cur+1)
4663                     ))
4664 #else
4665                  sflags & SVf_IsCOW
4666               && !(SvFLAGS(dstr) & SVf_BREAK)
4667 #endif
4668             ) {
4669             /* Either it's a shared hash key, or it's suitable for
4670                copy-on-write.  */
4671             if (DEBUG_C_TEST) {
4672                 PerlIO_printf(Perl_debug_log, "Copy on write: sstr --> dstr\n");
4673                 sv_dump(sstr);
4674                 sv_dump(dstr);
4675             }
4676 #ifdef PERL_ANY_COW
4677             if (!(sflags & SVf_IsCOW)) {
4678                     SvIsCOW_on(sstr);
4679 # ifdef PERL_OLD_COPY_ON_WRITE
4680                     /* Make the source SV into a loop of 1.
4681                        (about to become 2) */
4682                     SV_COW_NEXT_SV_SET(sstr, sstr);
4683 # else
4684                     CowREFCNT(sstr) = 0;
4685 # endif
4686             }
4687 #endif
4688             if (SvPVX_const(dstr)) {    /* we know that dtype >= SVt_PV */
4689                 SvPV_free(dstr);
4690             }
4691
4692 #ifdef PERL_ANY_COW
4693             if (len) {
4694 # ifdef PERL_OLD_COPY_ON_WRITE
4695                     assert (SvTYPE(dstr) >= SVt_PVIV);
4696                     /* SvIsCOW_normal */
4697                     /* splice us in between source and next-after-source.  */
4698                     SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4699                     SV_COW_NEXT_SV_SET(sstr, dstr);
4700 # else
4701                     if (sflags & SVf_IsCOW) {
4702                         sv_buf_to_rw(sstr);
4703                     }
4704                     CowREFCNT(sstr)++;
4705 # endif
4706                     SvPV_set(dstr, SvPVX_mutable(sstr));
4707                     sv_buf_to_ro(sstr);
4708             } else
4709 #endif
4710             {
4711                     /* SvIsCOW_shared_hash */
4712                     DEBUG_C(PerlIO_printf(Perl_debug_log,
4713                                           "Copy on write: Sharing hash\n"));
4714
4715                     assert (SvTYPE(dstr) >= SVt_PV);
4716                     SvPV_set(dstr,
4717                              HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)))));
4718             }
4719             SvLEN_set(dstr, len);
4720             SvCUR_set(dstr, cur);
4721             SvIsCOW_on(dstr);
4722         } else {
4723             /* Failed the swipe test, and we cannot do copy-on-write either.
4724                Have to copy the string.  */
4725             SvGROW(dstr, cur + 1);      /* inlined from sv_setpvn */
4726             Move(SvPVX_const(sstr),SvPVX(dstr),cur,char);
4727             SvCUR_set(dstr, cur);
4728             *SvEND(dstr) = '\0';
4729         }
4730         if (sflags & SVp_NOK) {
4731             SvNV_set(dstr, SvNVX(sstr));
4732         }
4733         if (sflags & SVp_IOK) {
4734             SvIV_set(dstr, SvIVX(sstr));
4735             /* Must do this otherwise some other overloaded use of 0x80000000
4736                gets confused. I guess SVpbm_VALID */
4737             if (sflags & SVf_IVisUV)
4738                 SvIsUV_on(dstr);
4739         }
4740         SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_NOK|SVp_NOK|SVf_UTF8);
4741         {
4742             const MAGIC * const smg = SvVSTRING_mg(sstr);
4743             if (smg) {
4744                 sv_magic(dstr, NULL, PERL_MAGIC_vstring,
4745                          smg->mg_ptr, smg->mg_len);
4746                 SvRMAGICAL_on(dstr);
4747             }
4748         }
4749     }
4750     else if (sflags & (SVp_IOK|SVp_NOK)) {
4751         (void)SvOK_off(dstr);
4752         SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_IVisUV|SVf_NOK|SVp_NOK);
4753         if (sflags & SVp_IOK) {
4754             /* XXXX Do we want to set IsUV for IV(ROK)?  Be extra safe... */
4755             SvIV_set(dstr, SvIVX(sstr));
4756         }
4757         if (sflags & SVp_NOK) {
4758             SvNV_set(dstr, SvNVX(sstr));
4759         }
4760     }
4761     else {
4762         if (isGV_with_GP(sstr)) {
4763             gv_efullname3(dstr, MUTABLE_GV(sstr), "*");
4764         }
4765         else
4766             (void)SvOK_off(dstr);
4767     }
4768     if (SvTAINTED(sstr))
4769         SvTAINT(dstr);
4770 }
4771
4772 /*
4773 =for apidoc sv_setsv_mg
4774
4775 Like C<sv_setsv>, but also handles 'set' magic.
4776
4777 =cut
4778 */
4779
4780 void
4781 Perl_sv_setsv_mg(pTHX_ SV *const dstr, SV *const sstr)
4782 {
4783     PERL_ARGS_ASSERT_SV_SETSV_MG;
4784
4785     sv_setsv(dstr,sstr);
4786     SvSETMAGIC(dstr);
4787 }
4788
4789 #ifdef PERL_ANY_COW
4790 # ifdef PERL_OLD_COPY_ON_WRITE
4791 #  define SVt_COW SVt_PVIV
4792 # else
4793 #  define SVt_COW SVt_PV
4794 # endif
4795 SV *
4796 Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
4797 {
4798     STRLEN cur = SvCUR(sstr);
4799     STRLEN len = SvLEN(sstr);
4800     char *new_pv;
4801 #if defined(PERL_DEBUG_READONLY_COW) && defined(PERL_NEW_COPY_ON_WRITE)
4802     const bool already = cBOOL(SvIsCOW(sstr));
4803 #endif
4804
4805     PERL_ARGS_ASSERT_SV_SETSV_COW;
4806
4807     if (DEBUG_C_TEST) {
4808         PerlIO_printf(Perl_debug_log, "Fast copy on write: %p -> %p\n",
4809                       (void*)sstr, (void*)dstr);
4810         sv_dump(sstr);
4811         if (dstr)
4812                     sv_dump(dstr);
4813     }
4814
4815     if (dstr) {
4816         if (SvTHINKFIRST(dstr))
4817             sv_force_normal_flags(dstr, SV_COW_DROP_PV);
4818         else if (SvPVX_const(dstr))
4819             Safefree(SvPVX_mutable(dstr));
4820     }
4821     else
4822         new_SV(dstr);
4823     SvUPGRADE(dstr, SVt_COW);
4824
4825     assert (SvPOK(sstr));
4826     assert (SvPOKp(sstr));
4827 # ifdef PERL_OLD_COPY_ON_WRITE
4828     assert (!SvIOK(sstr));
4829     assert (!SvIOKp(sstr));
4830     assert (!SvNOK(sstr));
4831     assert (!SvNOKp(sstr));
4832 # endif
4833
4834     if (SvIsCOW(sstr)) {
4835
4836         if (SvLEN(sstr) == 0) {
4837             /* source is a COW shared hash key.  */
4838             DEBUG_C(PerlIO_printf(Perl_debug_log,
4839                                   "Fast copy on write: Sharing hash\n"));
4840             new_pv = HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr))));
4841             goto common_exit;
4842         }
4843 # ifdef PERL_OLD_COPY_ON_WRITE
4844         SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4845 # else
4846         assert(SvCUR(sstr)+1 < SvLEN(sstr));
4847         assert(CowREFCNT(sstr) < SV_COW_REFCNT_MAX);
4848 # endif
4849     } else {
4850         assert ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS);
4851         SvUPGRADE(sstr, SVt_COW);
4852         SvIsCOW_on(sstr);
4853         DEBUG_C(PerlIO_printf(Perl_debug_log,
4854                               "Fast copy on write: Converting sstr to COW\n"));
4855 # ifdef PERL_OLD_COPY_ON_WRITE
4856         SV_COW_NEXT_SV_SET(dstr, sstr);
4857 # else
4858         CowREFCNT(sstr) = 0;    
4859 # endif
4860     }
4861 # ifdef PERL_OLD_COPY_ON_WRITE
4862     SV_COW_NEXT_SV_SET(sstr, dstr);
4863 # else
4864 #  ifdef PERL_DEBUG_READONLY_COW
4865     if (already) sv_buf_to_rw(sstr);
4866 #  endif
4867     CowREFCNT(sstr)++;  
4868 # endif
4869     new_pv = SvPVX_mutable(sstr);
4870     sv_buf_to_ro(sstr);
4871
4872   common_exit:
4873     SvPV_set(dstr, new_pv);
4874     SvFLAGS(dstr) = (SVt_COW|SVf_POK|SVp_POK|SVf_IsCOW);
4875     if (SvUTF8(sstr))
4876         SvUTF8_on(dstr);
4877     SvLEN_set(dstr, len);
4878     SvCUR_set(dstr, cur);
4879     if (DEBUG_C_TEST) {
4880         sv_dump(dstr);
4881     }
4882     return dstr;
4883 }
4884 #endif
4885
4886 /*
4887 =for apidoc sv_setpvn
4888
4889 Copies a string (possibly containing embedded C<NUL> characters) into an SV.
4890 The C<len> parameter indicates the number of
4891 bytes to be copied.  If the C<ptr> argument is NULL the SV will become
4892 undefined.  Does not handle 'set' magic.  See C<sv_setpvn_mg>.
4893
4894 =cut
4895 */
4896
4897 void
4898 Perl_sv_setpvn(pTHX_ SV *const sv, const char *const ptr, const STRLEN len)
4899 {
4900     char *dptr;
4901
4902     PERL_ARGS_ASSERT_SV_SETPVN;
4903
4904     SV_CHECK_THINKFIRST_COW_DROP(sv);
4905     if (!ptr) {
4906         (void)SvOK_off(sv);
4907         return;
4908     }
4909     else {
4910         /* len is STRLEN which is unsigned, need to copy to signed */
4911         const IV iv = len;
4912         if (iv < 0)
4913             Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen %"
4914                        IVdf, iv);
4915     }
4916     SvUPGRADE(sv, SVt_PV);
4917
4918     dptr = SvGROW(sv, len + 1);
4919     Move(ptr,dptr,len,char);
4920     dptr[len] = '\0';
4921     SvCUR_set(sv, len);
4922     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4923     SvTAINT(sv);
4924     if (SvTYPE(sv) == SVt_PVCV) CvAUTOLOAD_off(sv);
4925 }
4926
4927 /*
4928 =for apidoc sv_setpvn_mg
4929
4930 Like C<sv_setpvn>, but also handles 'set' magic.
4931
4932 =cut
4933 */
4934
4935 void
4936 Perl_sv_setpvn_mg(pTHX_ SV *const sv, const char *const ptr, const STRLEN len)
4937 {
4938     PERL_ARGS_ASSERT_SV_SETPVN_MG;
4939
4940     sv_setpvn(sv,ptr,len);
4941     SvSETMAGIC(sv);
4942 }
4943
4944 /*
4945 =for apidoc sv_setpv
4946
4947 Copies a string into an SV.  The string must be terminated with a C<NUL>
4948 character.
4949 Does not handle 'set' magic.  See C<sv_setpv_mg>.
4950
4951 =cut
4952 */
4953
4954 void
4955 Perl_sv_setpv(pTHX_ SV *const sv, const char *const ptr)
4956 {
4957     STRLEN len;
4958
4959     PERL_ARGS_ASSERT_SV_SETPV;
4960
4961     SV_CHECK_THINKFIRST_COW_DROP(sv);
4962     if (!ptr) {
4963         (void)SvOK_off(sv);
4964         return;
4965     }
4966     len = strlen(ptr);
4967     SvUPGRADE(sv, SVt_PV);
4968
4969     SvGROW(sv, len + 1);
4970     Move(ptr,SvPVX(sv),len+1,char);
4971     SvCUR_set(sv, len);
4972     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4973     SvTAINT(sv);
4974     if (SvTYPE(sv) == SVt_PVCV) CvAUTOLOAD_off(sv);
4975 }
4976
4977 /*
4978 =for apidoc sv_setpv_mg
4979
4980 Like C<sv_setpv>, but also handles 'set' magic.
4981
4982 =cut
4983 */
4984
4985 void
4986 Perl_sv_setpv_mg(pTHX_ SV *const sv, const char *const ptr)
4987 {
4988     PERL_ARGS_ASSERT_SV_SETPV_MG;
4989
4990     sv_setpv(sv,ptr);
4991     SvSETMAGIC(sv);
4992 }
4993
4994 void
4995 Perl_sv_sethek(pTHX_ SV *const sv, const HEK *const hek)
4996 {
4997     PERL_ARGS_ASSERT_SV_SETHEK;
4998
4999     if (!hek) {
5000         return;
5001     }
5002
5003     if (HEK_LEN(hek) == HEf_SVKEY) {
5004         sv_setsv(sv, *(SV**)HEK_KEY(hek));
5005         return;
5006     } else {
5007         const int flags = HEK_FLAGS(hek);
5008         if (flags & HVhek_WASUTF8) {
5009             STRLEN utf8_len = HEK_LEN(hek);
5010             char *as_utf8 = (char *)bytes_to_utf8((U8*)HEK_KEY(hek), &utf8_len);
5011             sv_usepvn_flags(sv, as_utf8, utf8_len, SV_HAS_TRAILING_NUL);
5012             SvUTF8_on(sv);
5013             return;
5014         } else if (flags & HVhek_UNSHARED) {
5015             sv_setpvn(sv, HEK_KEY(hek), HEK_LEN(hek));
5016             if (HEK_UTF8(hek))
5017                 SvUTF8_on(sv);
5018             else SvUTF8_off(sv);
5019             return;
5020         }
5021         {
5022             SV_CHECK_THINKFIRST_COW_DROP(sv);
5023             SvUPGRADE(sv, SVt_PV);
5024             SvPV_free(sv);
5025             SvPV_set(sv,(char *)HEK_KEY(share_hek_hek(hek)));
5026             SvCUR_set(sv, HEK_LEN(hek));
5027             SvLEN_set(sv, 0);
5028             SvIsCOW_on(sv);
5029             SvPOK_on(sv);
5030             if (HEK_UTF8(hek))
5031                 SvUTF8_on(sv);
5032             else SvUTF8_off(sv);
5033             return;
5034         }
5035     }
5036 }
5037
5038
5039 /*
5040 =for apidoc sv_usepvn_flags
5041
5042 Tells an SV to use C<ptr> to find its string value.  Normally the
5043 string is stored inside the SV, but sv_usepvn allows the SV to use an
5044 outside string.  The C<ptr> should point to memory that was allocated
5045 by L<Newx|perlclib/Memory Management and String Handling>.  It must be
5046 the start of a Newx-ed block of memory, and not a pointer to the
5047 middle of it (beware of L<OOK|perlguts/Offsets> and copy-on-write),
5048 and not be from a non-Newx memory allocator like C<malloc>.  The
5049 string length, C<len>, must be supplied.  By default this function
5050 will C<Renew> (i.e. realloc, move) the memory pointed to by C<ptr>,
5051 so that pointer should not be freed or used by the programmer after
5052 giving it to sv_usepvn, and neither should any pointers from "behind"
5053 that pointer (e.g. ptr + 1) be used.
5054
5055 If C<flags> & SV_SMAGIC is true, will call SvSETMAGIC.  If C<flags> &
5056 SV_HAS_TRAILING_NUL is true, then C<ptr[len]> must be C<NUL>, and the realloc
5057 will be skipped (i.e. the buffer is actually at least 1 byte longer than
5058 C<len>, and already meets the requirements for storing in C<SvPVX>).
5059
5060 =cut
5061 */
5062
5063 void
5064 Perl_sv_usepvn_flags(pTHX_ SV *const sv, char *ptr, const STRLEN len, const U32 flags)
5065 {
5066     STRLEN allocate;
5067
5068     PERL_ARGS_ASSERT_SV_USEPVN_FLAGS;
5069
5070     SV_CHECK_THINKFIRST_COW_DROP(sv);
5071     SvUPGRADE(sv, SVt_PV);
5072     if (!ptr) {
5073         (void)SvOK_off(sv);
5074         if (flags & SV_SMAGIC)
5075             SvSETMAGIC(sv);
5076         return;
5077     }
5078     if (SvPVX_const(sv))
5079         SvPV_free(sv);
5080
5081 #ifdef DEBUGGING
5082     if (flags & SV_HAS_TRAILING_NUL)
5083         assert(ptr[len] == '\0');
5084 #endif
5085
5086     allocate = (flags & SV_HAS_TRAILING_NUL)
5087         ? len + 1 :
5088 #ifdef Perl_safesysmalloc_size
5089         len + 1;
5090 #else 
5091         PERL_STRLEN_ROUNDUP(len + 1);
5092 #endif
5093     if (flags & SV_HAS_TRAILING_NUL) {
5094         /* It's long enough - do nothing.
5095            Specifically Perl_newCONSTSUB is relying on this.  */
5096     } else {
5097 #ifdef DEBUGGING
5098         /* Force a move to shake out bugs in callers.  */
5099         char *new_ptr = (char*)safemalloc(allocate);
5100         Copy(ptr, new_ptr, len, char);
5101         PoisonFree(ptr,len,char);
5102         Safefree(ptr);
5103         ptr = new_ptr;
5104 #else
5105         ptr = (char*) saferealloc (ptr, allocate);
5106 #endif
5107     }
5108 #ifdef Perl_safesysmalloc_size
5109     SvLEN_set(sv, Perl_safesysmalloc_size(ptr));
5110 #else
5111     SvLEN_set(sv, allocate);
5112 #endif
5113     SvCUR_set(sv, len);
5114     SvPV_set(sv, ptr);
5115     if (!(flags & SV_HAS_TRAILING_NUL)) {
5116         ptr[len] = '\0';
5117     }
5118     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
5119     SvTAINT(sv);
5120     if (flags & SV_SMAGIC)
5121         SvSETMAGIC(sv);
5122 }
5123
5124 #ifdef PERL_OLD_COPY_ON_WRITE
5125 /* Need to do this *after* making the SV normal, as we need the buffer
5126    pointer to remain valid until after we've copied it.  If we let go too early,
5127    another thread could invalidate it by unsharing last of the same hash key
5128    (which it can do by means other than releasing copy-on-write Svs)
5129    or by changing the other copy-on-write SVs in the loop.  */
5130 STATIC void
5131 S_sv_release_COW(pTHX_ SV *sv, const char *pvx, SV *after)
5132 {
5133     PERL_ARGS_ASSERT_SV_RELEASE_COW;
5134
5135     { /* this SV was SvIsCOW_normal(sv) */
5136          /* we need to find the SV pointing to us.  */
5137         SV *current = SV_COW_NEXT_SV(after);
5138
5139         if (current == sv) {
5140             /* The SV we point to points back to us (there were only two of us
5141                in the loop.)
5142                Hence other SV is no longer copy on write either.  */
5143             SvIsCOW_off(after);
5144             sv_buf_to_rw(after);
5145         } else {
5146             /* We need to follow the pointers around the loop.  */
5147             SV *next;
5148             while ((next = SV_COW_NEXT_SV(current)) != sv) {
5149                 assert (next);
5150                 current = next;
5151                  /* don't loop forever if the structure is bust, and we have
5152                     a pointer into a closed loop.  */
5153                 assert (current != after);
5154                 assert (SvPVX_const(current) == pvx);
5155             }
5156             /* Make the SV before us point to the SV after us.  */
5157             SV_COW_NEXT_SV_SET(current, after);
5158         }
5159     }
5160 }
5161 #endif
5162 /*
5163 =for apidoc sv_force_normal_flags
5164
5165 Undo various types of fakery on an SV, where fakery means
5166 "more than" a string: if the PV is a shared string, make
5167 a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
5168 an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
5169 we do the copy, and is also used locally; if this is a
5170 vstring, drop the vstring magic.  If C<SV_COW_DROP_PV> is set
5171 then a copy-on-write scalar drops its PV buffer (if any) and becomes
5172 SvPOK_off rather than making a copy.  (Used where this
5173 scalar is about to be set to some other value.)  In addition,
5174 the C<flags> parameter gets passed to C<sv_unref_flags()>
5175 when unreffing.  C<sv_force_normal> calls this function
5176 with flags set to 0.
5177
5178 This function is expected to be used to signal to perl that this SV is
5179 about to be written to, and any extra book-keeping needs to be taken care
5180 of.  Hence, it croaks on read-only values.
5181
5182 =cut
5183 */
5184
5185 static void
5186 S_sv_uncow(pTHX_ SV * const sv, const U32 flags)
5187 {
5188     assert(SvIsCOW(sv));
5189     {
5190 #ifdef PERL_ANY_COW
5191         const char * const pvx = SvPVX_const(sv);
5192         const STRLEN len = SvLEN(sv);
5193         const STRLEN cur = SvCUR(sv);
5194 # ifdef PERL_OLD_COPY_ON_WRITE
5195         /* next COW sv in the loop.  If len is 0 then this is a shared-hash
5196            key scalar, so we mustn't attempt to call SV_COW_NEXT_SV(), as
5197            we'll fail an assertion.  */
5198         SV * const next = len ? SV_COW_NEXT_SV(sv) : 0;
5199 # endif
5200
5201         if (DEBUG_C_TEST) {
5202                 PerlIO_printf(Perl_debug_log,
5203                               "Copy on write: Force normal %ld\n",
5204                               (long) flags);
5205                 sv_dump(sv);
5206         }
5207         SvIsCOW_off(sv);
5208 # ifdef PERL_NEW_COPY_ON_WRITE
5209         if (len) {
5210             /* Must do this first, since the CowREFCNT uses SvPVX and
5211             we need to write to CowREFCNT, or de-RO the whole buffer if we are
5212             the only owner left of the buffer. */
5213             sv_buf_to_rw(sv); /* NOOP if RO-ing not supported */
5214             {
5215                 U8 cowrefcnt = CowREFCNT(sv);
5216                 if(cowrefcnt != 0) {
5217                     cowrefcnt--;
5218                     CowREFCNT(sv) = cowrefcnt;
5219                     sv_buf_to_ro(sv);
5220                     goto copy_over;
5221                 }
5222             }
5223             /* Else we are the only owner of the buffer. */
5224         }
5225         else
5226 # endif
5227         {
5228             /* This SV doesn't own the buffer, so need to Newx() a new one:  */
5229             copy_over:
5230             SvPV_set(sv, NULL);
5231             SvCUR_set(sv, 0);
5232             SvLEN_set(sv, 0);
5233             if (flags & SV_COW_DROP_PV) {
5234                 /* OK, so we don't need to copy our buffer.  */
5235                 SvPOK_off(sv);
5236             } else {
5237                 SvGROW(sv, cur + 1);
5238                 Move(pvx,SvPVX(sv),cur,char);
5239                 SvCUR_set(sv, cur);
5240                 *SvEND(sv) = '\0';
5241             }
5242             if (len) {
5243 # ifdef PERL_OLD_COPY_ON_WRITE
5244                 sv_release_COW(sv, pvx, next);
5245 # endif
5246             } else {
5247                 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
5248             }
5249             if (DEBUG_C_TEST) {
5250                 sv_dump(sv);
5251             }
5252         }
5253 #else
5254             const char * const pvx = SvPVX_const(sv);
5255             const STRLEN len = SvCUR(sv);
5256             SvIsCOW_off(sv);
5257             SvPV_set(sv, NULL);
5258             SvLEN_set(sv, 0);
5259             if (flags & SV_COW_DROP_PV) {
5260                 /* OK, so we don't need to copy our buffer.  */
5261                 SvPOK_off(sv);
5262             } else {
5263                 SvGROW(sv, len + 1);
5264                 Move(pvx,SvPVX(sv),len,char);
5265                 *SvEND(sv) = '\0';
5266             }
5267             unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
5268 #endif
5269     }
5270 }
5271
5272 void
5273 Perl_sv_force_normal_flags(pTHX_ SV *const sv, const U32 flags)
5274 {
5275     PERL_ARGS_ASSERT_SV_FORCE_NORMAL_FLAGS;
5276
5277     if (SvREADONLY(sv))
5278         Perl_croak_no_modify();
5279     else if (SvIsCOW(sv) && LIKELY(SvTYPE(sv) != SVt_PVHV))
5280         S_sv_uncow(aTHX_ sv, flags);
5281     if (SvROK(sv))
5282         sv_unref_flags(sv, flags);
5283     else if (SvFAKE(sv) && isGV_with_GP(sv))
5284         sv_unglob(sv, flags);
5285     else if (SvFAKE(sv) && isREGEXP(sv)) {
5286         /* Need to downgrade the REGEXP to a simple(r) scalar. This is analogous
5287            to sv_unglob. We only need it here, so inline it.  */
5288         const bool islv = SvTYPE(sv) == SVt_PVLV;
5289         const svtype new_type =
5290           islv ? SVt_NULL : SvMAGIC(sv) || SvSTASH(sv) ? SVt_PVMG : SVt_PV;
5291         SV *const temp = newSV_type(new_type);
5292         regexp *const temp_p = ReANY((REGEXP *)sv);
5293
5294         if (new_type == SVt_PVMG) {
5295             SvMAGIC_set(temp, SvMAGIC(sv));
5296             SvMAGIC_set(sv, NULL);
5297             SvSTASH_set(temp, SvSTASH(sv));
5298             SvSTASH_set(sv, NULL);
5299         }
5300         if (!islv) SvCUR_set(temp, SvCUR(sv));
5301         /* Remember that SvPVX is in the head, not the body.  But
5302            RX_WRAPPED is in the body. */
5303         assert(ReANY((REGEXP *)sv)->mother_re);
5304         /* Their buffer is already owned by someone else. */
5305         if (flags & SV_COW_DROP_PV) {
5306             /* SvLEN is already 0.  For SVt_REGEXP, we have a brand new
5307                zeroed body.  For SVt_PVLV, it should have been set to 0
5308                before turning into a regexp. */
5309             assert(!SvLEN(islv ? sv : temp));
5310             sv->sv_u.svu_pv = 0;
5311         }
5312         else {
5313             sv->sv_u.svu_pv = savepvn(RX_WRAPPED((REGEXP *)sv), SvCUR(sv));
5314             SvLEN_set(islv ? sv : temp, SvCUR(sv)+1);
5315             SvPOK_on(sv);
5316         }
5317
5318         /* Now swap the rest of the bodies. */
5319
5320         SvFAKE_off(sv);
5321         if (!islv) {
5322             SvFLAGS(sv) &= ~SVTYPEMASK;
5323             SvFLAGS(sv) |= new_type;
5324             SvANY(sv) = SvANY(temp);
5325         }
5326
5327         SvFLAGS(temp) &= ~(SVTYPEMASK);
5328         SvFLAGS(temp) |= SVt_REGEXP|SVf_FAKE;
5329         SvANY(temp) = temp_p;
5330         temp->sv_u.svu_rx = (regexp *)temp_p;
5331
5332         SvREFCNT_dec_NN(temp);
5333     }
5334     else if (SvVOK(sv)) sv_unmagic(sv, PERL_MAGIC_vstring);
5335 }
5336
5337 /*
5338 =for apidoc sv_chop
5339
5340 Efficient removal of characters from the beginning of the string buffer.
5341 SvPOK(sv), or at least SvPOKp(sv), must be true and the C<ptr> must be a
5342 pointer to somewhere inside the string buffer.  The C<ptr> becomes the first
5343 character of the adjusted string.  Uses the "OOK hack".  On return, only
5344 SvPOK(sv) and SvPOKp(sv) among the OK flags will be true.
5345
5346 Beware: after this function returns, C<ptr> and SvPVX_const(sv) may no longer
5347 refer to the same chunk of data.
5348
5349 The unfortunate similarity of this function's name to that of Perl's C<chop>
5350 operator is strictly coincidental.  This function works from the left;
5351 C<chop> works from the right.
5352
5353 =cut
5354 */
5355
5356 void
5357 Perl_sv_chop(pTHX_ SV *const sv, const char *const ptr)
5358 {
5359     STRLEN delta;
5360     STRLEN old_delta;
5361     U8 *p;
5362 #ifdef DEBUGGING
5363     const U8 *evacp;
5364     STRLEN evacn;
5365 #endif
5366     STRLEN max_delta;
5367
5368     PERL_ARGS_ASSERT_SV_CHOP;
5369
5370     if (!ptr || !SvPOKp(sv))
5371         return;
5372     delta = ptr - SvPVX_const(sv);
5373     if (!delta) {
5374         /* Nothing to do.  */
5375         return;
5376     }
5377     max_delta = SvLEN(sv) ? SvLEN(sv) : SvCUR(sv);
5378     if (delta > max_delta)
5379         Perl_croak(aTHX_ "panic: sv_chop ptr=%p, start=%p, end=%p",
5380                    ptr, SvPVX_const(sv), SvPVX_const(sv) + max_delta);
5381     /* SvPVX(sv) may move in SV_CHECK_THINKFIRST(sv), so don't use ptr any more */
5382     SV_CHECK_THINKFIRST(sv);
5383     SvPOK_only_UTF8(sv);
5384
5385     if (!SvOOK(sv)) {
5386         if (!SvLEN(sv)) { /* make copy of shared string */
5387             const char *pvx = SvPVX_const(sv);
5388             const STRLEN len = SvCUR(sv);
5389             SvGROW(sv, len + 1);
5390             Move(pvx,SvPVX(sv),len,char);
5391             *SvEND(sv) = '\0';
5392         }
5393         SvOOK_on(sv);
5394         old_delta = 0;
5395     } else {
5396         SvOOK_offset(sv, old_delta);
5397     }
5398     SvLEN_set(sv, SvLEN(sv) - delta);
5399     SvCUR_set(sv, SvCUR(sv) - delta);
5400     SvPV_set(sv, SvPVX(sv) + delta);
5401
5402     p = (U8 *)SvPVX_const(sv);
5403
5404 #ifdef DEBUGGING
5405     /* how many bytes were evacuated?  we will fill them with sentinel
5406        bytes, except for the part holding the new offset of course. */
5407     evacn = delta;
5408     if (old_delta)
5409         evacn += (old_delta < 0x100 ? 1 : 1 + sizeof(STRLEN));
5410     assert(evacn);
5411     assert(evacn <= delta + old_delta);
5412     evacp = p - evacn;
5413 #endif
5414
5415     /* This sets 'delta' to the accumulated value of all deltas so far */
5416     delta += old_delta;
5417     assert(delta);
5418
5419     /* If 'delta' fits in a byte, store it just prior to the new beginning of
5420      * the string; otherwise store a 0 byte there and store 'delta' just prior
5421      * to that, using as many bytes as a STRLEN occupies.  Thus it overwrites a
5422      * portion of the chopped part of the string */
5423     if (delta < 0x100) {
5424         *--p = (U8) delta;
5425     } else {
5426         *--p = 0;
5427         p -= sizeof(STRLEN);
5428         Copy((U8*)&delta, p, sizeof(STRLEN), U8);
5429     }
5430
5431 #ifdef DEBUGGING
5432     /* Fill the preceding buffer with sentinals to verify that no-one is
5433        using it.  */
5434     while (p > evacp) {
5435         --p;
5436         *p = (U8)PTR2UV(p);
5437     }
5438 #endif
5439 }
5440
5441 /*
5442 =for apidoc sv_catpvn
5443
5444 Concatenates the string onto the end of the string which is in the SV.  The
5445 C<len> indicates number of bytes to copy.  If the SV has the UTF-8
5446 status set, then the bytes appended should be valid UTF-8.
5447 Handles 'get' magic, but not 'set' magic.  See C<sv_catpvn_mg>.
5448
5449 =for apidoc sv_catpvn_flags
5450
5451 Concatenates the string onto the end of the string which is in the SV.  The
5452 C<len> indicates number of bytes to copy.
5453
5454 By default, the string appended is assumed to be valid UTF-8 if the SV has
5455 the UTF-8 status set, and a string of bytes otherwise.  One can force the
5456 appended string to be interpreted as UTF-8 by supplying the C<SV_CATUTF8>
5457 flag, and as bytes by supplying the C<SV_CATBYTES> flag; the SV or the
5458 string appended will be upgraded to UTF-8 if necessary.
5459
5460 If C<flags> has the C<SV_SMAGIC> bit set, will
5461 C<mg_set> on C<dsv> afterwards if appropriate.
5462 C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
5463 in terms of this function.
5464
5465 =cut
5466 */
5467
5468 void
5469 Perl_sv_catpvn_flags(pTHX_ SV *const dsv, const char *sstr, const STRLEN slen, const I32 flags)
5470 {
5471     STRLEN dlen;
5472     const char * const dstr = SvPV_force_flags(dsv, dlen, flags);
5473
5474     PERL_ARGS_ASSERT_SV_CATPVN_FLAGS;
5475     assert((flags & (SV_CATBYTES|SV_CATUTF8)) != (SV_CATBYTES|SV_CATUTF8));
5476
5477     if (!(flags & SV_CATBYTES) || !SvUTF8(dsv)) {
5478       if (flags & SV_CATUTF8 && !SvUTF8(dsv)) {
5479          sv_utf8_upgrade_flags_grow(dsv, 0, slen + 1);
5480          dlen = SvCUR(dsv);
5481       }
5482       else SvGROW(dsv, dlen + slen + 1);
5483       if (sstr == dstr)
5484         sstr = SvPVX_const(dsv);
5485       Move(sstr, SvPVX(dsv) + dlen, slen, char);
5486       SvCUR_set(dsv, SvCUR(dsv) + slen);
5487     }
5488     else {
5489         /* We inline bytes_to_utf8, to avoid an extra malloc. */
5490         const char * const send = sstr + slen;
5491         U8 *d;
5492
5493         /* Something this code does not account for, which I think is
5494            impossible; it would require the same pv to be treated as
5495            bytes *and* utf8, which would indicate a bug elsewhere. */
5496         assert(sstr != dstr);
5497
5498         SvGROW(dsv, dlen + slen * 2 + 1);
5499         d = (U8 *)SvPVX(dsv) + dlen;
5500
5501         while (sstr < send) {
5502             append_utf8_from_native_byte(*sstr, &d);
5503             sstr++;
5504         }
5505         SvCUR_set(dsv, d-(const U8 *)SvPVX(dsv));
5506     }
5507     *SvEND(dsv) = '\0';
5508     (void)SvPOK_only_UTF8(dsv);         /* validate pointer */
5509     SvTAINT(dsv);
5510     if (flags & SV_SMAGIC)
5511         SvSETMAGIC(dsv);
5512 }
5513
5514 /*
5515 =for apidoc sv_catsv
5516
5517 Concatenates the string from SV C<ssv> onto the end of the string in SV
5518 C<dsv>.  If C<ssv> is null, does nothing; otherwise modifies only C<dsv>.
5519 Handles 'get' magic on both SVs, but no 'set' magic.  See C<sv_catsv_mg> and
5520 C<sv_catsv_nomg>.
5521
5522 =for apidoc sv_catsv_flags
5523
5524 Concatenates the string from SV C<ssv> onto the end of the string in SV
5525 C<dsv>.  If C<ssv> is null, does nothing; otherwise modifies only C<dsv>.
5526 If C<flags> include C<SV_GMAGIC> bit set, will call C<mg_get> on both SVs if
5527 appropriate.  If C<flags> include C<SV_SMAGIC>, C<mg_set> will be called on
5528 the modified SV afterward, if appropriate.  C<sv_catsv>, C<sv_catsv_nomg>,
5529 and C<sv_catsv_mg> are implemented in terms of this function.
5530
5531 =cut */
5532
5533 void
5534 Perl_sv_catsv_flags(pTHX_ SV *const dsv, SV *const ssv, const I32 flags)
5535 {
5536     PERL_ARGS_ASSERT_SV_CATSV_FLAGS;
5537
5538     if (ssv) {
5539         STRLEN slen;
5540         const char *spv = SvPV_flags_const(ssv, slen, flags);
5541         if (flags & SV_GMAGIC)
5542                 SvGETMAGIC(dsv);
5543         sv_catpvn_flags(dsv, spv, slen,
5544                             DO_UTF8(ssv) ? SV_CATUTF8 : SV_CATBYTES);
5545         if (flags & SV_SMAGIC)
5546                 SvSETMAGIC(dsv);
5547     }
5548 }
5549
5550 /*
5551 =for apidoc sv_catpv
5552
5553 Concatenates the C<NUL>-terminated string onto the end of the string which is
5554 in the SV.
5555 If the SV has the UTF-8 status set, then the bytes appended should be
5556 valid UTF-8.  Handles 'get' magic, but not 'set' magic.  See C<sv_catpv_mg>.
5557
5558 =cut */
5559
5560 void
5561 Perl_sv_catpv(pTHX_ SV *const sv, const char *ptr)
5562 {
5563     STRLEN len;
5564     STRLEN tlen;
5565     char *junk;
5566
5567     PERL_ARGS_ASSERT_SV_CATPV;
5568
5569     if (!ptr)
5570         return;
5571     junk = SvPV_force(sv, tlen);
5572     len = strlen(ptr);
5573     SvGROW(sv, tlen + len + 1);
5574     if (ptr == junk)
5575         ptr = SvPVX_const(sv);
5576     Move(ptr,SvPVX(sv)+tlen,len+1,char);
5577     SvCUR_set(sv, SvCUR(sv) + len);
5578     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
5579     SvTAINT(sv);
5580 }
5581
5582 /*
5583 =for apidoc sv_catpv_flags
5584
5585 Concatenates the C<NUL>-terminated string onto the end of the string which is
5586 in the SV.
5587 If the SV has the UTF-8 status set, then the bytes appended should
5588 be valid UTF-8.  If C<flags> has the C<SV_SMAGIC> bit set, will C<mg_set>
5589 on the modified SV if appropriate.
5590
5591 =cut
5592 */
5593
5594 void
5595 Perl_sv_catpv_flags(pTHX_ SV *dstr, const char *sstr, const I32 flags)
5596 {
5597     PERL_ARGS_ASSERT_SV_CATPV_FLAGS;
5598     sv_catpvn_flags(dstr, sstr, strlen(sstr), flags);
5599 }
5600
5601 /*
5602 =for apidoc sv_catpv_mg
5603
5604 Like C<sv_catpv>, but also handles 'set' magic.
5605
5606 =cut
5607 */
5608
5609 void
5610 Perl_sv_catpv_mg(pTHX_ SV *const sv, const char *const ptr)
5611 {
5612     PERL_ARGS_ASSERT_SV_CATPV_MG;
5613
5614     sv_catpv(sv,ptr);
5615     SvSETMAGIC(sv);
5616 }
5617
5618 /*
5619 =for apidoc newSV
5620
5621 Creates a new SV.  A non-zero C<len> parameter indicates the number of
5622 bytes of preallocated string space the SV should have.  An extra byte for a
5623 trailing C<NUL> is also reserved.  (SvPOK is not set for the SV even if string
5624 space is allocated.)  The reference count for the new SV is set to 1.
5625
5626 In 5.9.3, newSV() replaces the older NEWSV() API, and drops the first
5627 parameter, I<x>, a debug aid which allowed callers to identify themselves.
5628 This aid has been superseded by a new build option, PERL_MEM_LOG (see
5629 L<perlhacktips/PERL_MEM_LOG>).  The older API is still there for use in XS
5630 modules supporting older perls.
5631
5632 =cut
5633 */
5634
5635 SV *
5636 Perl_newSV(pTHX_ const STRLEN len)
5637 {
5638     SV *sv;
5639
5640     new_SV(sv);
5641     if (len) {
5642         sv_grow(sv, len + 1);
5643     }
5644     return sv;
5645 }
5646 /*
5647 =for apidoc sv_magicext
5648
5649 Adds magic to an SV, upgrading it if necessary.  Applies the
5650 supplied vtable and returns a pointer to the magic added.
5651
5652 Note that C<sv_magicext> will allow things that C<sv_magic> will not.
5653 In particular, you can add magic to SvREADONLY SVs, and add more than
5654 one instance of the same 'how'.
5655
5656 If C<namlen> is greater than zero then a C<savepvn> I<copy> of C<name> is
5657 stored, if C<namlen> is zero then C<name> is stored as-is and - as another
5658 special case - if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
5659 to contain an C<SV*> and is stored as-is with its REFCNT incremented.
5660
5661 (This is now used as a subroutine by C<sv_magic>.)
5662
5663 =cut
5664 */
5665 MAGIC * 
5666 Perl_sv_magicext(pTHX_ SV *const sv, SV *const obj, const int how, 
5667                 const MGVTBL *const vtable, const char *const name, const I32 namlen)
5668 {
5669     MAGIC* mg;
5670
5671     PERL_ARGS_ASSERT_SV_MAGICEXT;
5672
5673     SvUPGRADE(sv, SVt_PVMG);
5674     Newxz(mg, 1, MAGIC);
5675     mg->mg_moremagic = SvMAGIC(sv);
5676     SvMAGIC_set(sv, mg);
5677
5678     /* Sometimes a magic contains a reference loop, where the sv and
5679        object refer to each other.  To prevent a reference loop that
5680        would prevent such objects being freed, we look for such loops
5681        and if we find one we avoid incrementing the object refcount.
5682
5683        Note we cannot do this to avoid self-tie loops as intervening RV must
5684        have its REFCNT incremented to keep it in existence.
5685
5686     */
5687     if (!obj || obj == sv ||
5688         how == PERL_MAGIC_arylen ||
5689         how == PERL_MAGIC_symtab ||
5690         (SvTYPE(obj) == SVt_PVGV &&
5691             (GvSV(obj) == sv || GvHV(obj) == (const HV *)sv
5692              || GvAV(obj) == (const AV *)sv || GvCV(obj) == (const CV *)sv
5693              || GvIOp(obj) == (const IO *)sv || GvFORM(obj) == (const CV *)sv)))
5694     {
5695         mg->mg_obj = obj;
5696     }
5697     else {
5698         mg->mg_obj = SvREFCNT_inc_simple(obj);
5699         mg->mg_flags |= MGf_REFCOUNTED;
5700     }
5701
5702     /* Normal self-ties simply pass a null object, and instead of
5703        using mg_obj directly, use the SvTIED_obj macro to produce a
5704        new RV as needed.  For glob "self-ties", we are tieing the PVIO
5705        with an RV obj pointing to the glob containing the PVIO.  In
5706        this case, to avoid a reference loop, we need to weaken the
5707        reference.
5708     */
5709
5710     if (how == PERL_MAGIC_tiedscalar && SvTYPE(sv) == SVt_PVIO &&
5711         obj && SvROK(obj) && GvIO(SvRV(obj)) == (const IO *)sv)
5712     {
5713       sv_rvweaken(obj);
5714     }
5715
5716     mg->mg_type = how;
5717     mg->mg_len = namlen;
5718     if (name) {
5719         if (namlen > 0)
5720             mg->mg_ptr = savepvn(name, namlen);
5721         else if (namlen == HEf_SVKEY) {
5722             /* Yes, this is casting away const. This is only for the case of
5723                HEf_SVKEY. I think we need to document this aberation of the
5724                constness of the API, rather than making name non-const, as
5725                that change propagating outwards a long way.  */
5726             mg->mg_ptr = (char*)SvREFCNT_inc_simple_NN((SV *)name);
5727         } else
5728             mg->mg_ptr = (char *) name;
5729     }
5730     mg->mg_virtual = (MGVTBL *) vtable;
5731
5732     mg_magical(sv);
5733     return mg;
5734 }
5735
5736 MAGIC *
5737 Perl_sv_magicext_mglob(pTHX_ SV *sv)
5738 {
5739     PERL_ARGS_ASSERT_SV_MAGICEXT_MGLOB;
5740     if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
5741         /* This sv is only a delegate.  //g magic must be attached to
5742            its target. */
5743         vivify_defelem(sv);
5744         sv = LvTARG(sv);
5745     }
5746 #ifdef PERL_OLD_COPY_ON_WRITE
5747     if (SvIsCOW(sv))
5748         sv_force_normal_flags(sv, 0);
5749 #endif
5750     return sv_magicext(sv, NULL, PERL_MAGIC_regex_global,
5751                        &PL_vtbl_mglob, 0, 0);
5752 }
5753
5754 /*
5755 =for apidoc sv_magic
5756
5757 Adds magic to an SV.  First upgrades C<sv> to type C<SVt_PVMG> if
5758 necessary, then adds a new magic item of type C<how> to the head of the
5759 magic list.
5760
5761 See C<sv_magicext> (which C<sv_magic> now calls) for a description of the
5762 handling of the C<name> and C<namlen> arguments.
5763
5764 You need to use C<sv_magicext> to add magic to SvREADONLY SVs and also
5765 to add more than one instance of the same 'how'.
5766
5767 =cut
5768 */
5769
5770 void
5771 Perl_sv_magic(pTHX_ SV *const sv, SV *const obj, const int how,
5772              const char *const name, const I32 namlen)
5773 {
5774     const MGVTBL *vtable;
5775     MAGIC* mg;
5776     unsigned int flags;
5777     unsigned int vtable_index;
5778
5779     PERL_ARGS_ASSERT_SV_MAGIC;
5780
5781     if (how < 0 || (unsigned)how >= C_ARRAY_LENGTH(PL_magic_data)
5782         || ((flags = PL_magic_data[how]),
5783             (vtable_index = flags & PERL_MAGIC_VTABLE_MASK)
5784             > magic_vtable_max))
5785         Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
5786
5787     /* PERL_MAGIC_ext is reserved for use by extensions not perl internals.
5788        Useful for attaching extension internal data to perl vars.
5789        Note that multiple extensions may clash if magical scalars
5790        etc holding private data from one are passed to another. */
5791
5792     vtable = (vtable_index == magic_vtable_max)
5793         ? NULL : PL_magic_vtables + vtable_index;
5794
5795 #ifdef PERL_OLD_COPY_ON_WRITE
5796     if (SvIsCOW(sv))
5797         sv_force_normal_flags(sv, 0);
5798 #endif
5799     if (SvREADONLY(sv)) {
5800         if (
5801             !PERL_MAGIC_TYPE_READONLY_ACCEPTABLE(how)
5802            )
5803         {
5804             Perl_croak_no_modify();
5805         }
5806     }
5807     if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
5808         if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
5809             /* sv_magic() refuses to add a magic of the same 'how' as an
5810                existing one
5811              */
5812             if (how == PERL_MAGIC_taint)
5813                 mg->mg_len |= 1;
5814             return;
5815         }
5816     }
5817
5818     /* Force pos to be stored as characters, not bytes. */
5819     if (SvMAGICAL(sv) && DO_UTF8(sv)
5820       && (mg = mg_find(sv, PERL_MAGIC_regex_global))
5821       && mg->mg_len != -1
5822       && mg->mg_flags & MGf_BYTES) {
5823         mg->mg_len = (SSize_t)sv_pos_b2u_flags(sv, (STRLEN)mg->mg_len,
5824                                                SV_CONST_RETURN);
5825         mg->mg_flags &= ~MGf_BYTES;
5826     }
5827
5828     /* Rest of work is done else where */
5829     mg = sv_magicext(sv,obj,how,vtable,name,namlen);
5830
5831     switch (how) {
5832     case PERL_MAGIC_taint:
5833         mg->mg_len = 1;
5834         break;
5835     case PERL_MAGIC_ext:
5836     case PERL_MAGIC_dbfile:
5837         SvRMAGICAL_on(sv);
5838         break;
5839     }
5840 }
5841
5842 static int
5843 S_sv_unmagicext_flags(pTHX_ SV *const sv, const int type, MGVTBL *vtbl, const U32 flags)
5844 {
5845     MAGIC* mg;
5846     MAGIC** mgp;
5847
5848     assert(flags <= 1);
5849
5850     if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
5851         return 0;
5852     mgp = &(((XPVMG*) SvANY(sv))->xmg_u.xmg_magic);
5853     for (mg = *mgp; mg; mg = *mgp) {
5854         const MGVTBL* const virt = mg->mg_virtual;
5855         if (mg->mg_type == type && (!flags || virt == vtbl)) {
5856             *mgp = mg->mg_moremagic;
5857             if (virt && virt->svt_free)
5858                 virt->svt_free(aTHX_ sv, mg);
5859             if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
5860                 if (mg->mg_len > 0)
5861                     Safefree(mg->mg_ptr);
5862                 else if (mg->mg_len == HEf_SVKEY)
5863                     SvREFCNT_dec(MUTABLE_SV(mg->mg_ptr));
5864                 else if (mg->mg_type == PERL_MAGIC_utf8)
5865                     Safefree(mg->mg_ptr);
5866             }
5867             if (mg->mg_flags & MGf_REFCOUNTED)
5868                 SvREFCNT_dec(mg->mg_obj);
5869             Safefree(mg);
5870         }
5871         else
5872             mgp = &mg->mg_moremagic;
5873     }
5874     if (SvMAGIC(sv)) {
5875         if (SvMAGICAL(sv))      /* if we're under save_magic, wait for restore_magic; */
5876             mg_magical(sv);     /*    else fix the flags now */
5877     }
5878     else {
5879         SvMAGICAL_off(sv);
5880         SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
5881     }
5882     return 0;
5883 }
5884
5885 /*
5886 =for apidoc sv_unmagic
5887
5888 Removes all magic of type C<type> from an SV.
5889
5890 =cut
5891 */
5892
5893 int
5894 Perl_sv_unmagic(pTHX_ SV *const sv, const int type)
5895 {
5896     PERL_ARGS_ASSERT_SV_UNMAGIC;
5897     return S_sv_unmagicext_flags(aTHX_ sv, type, NULL, 0);
5898 }
5899
5900 /*
5901 =for apidoc sv_unmagicext
5902
5903 Removes all magic of type C<type> with the specified C<vtbl> from an SV.
5904
5905 =cut
5906 */
5907
5908 int
5909 Perl_sv_unmagicext(pTHX_ SV *const sv, const int type, MGVTBL *vtbl)
5910 {
5911     PERL_ARGS_ASSERT_SV_UNMAGICEXT;
5912     return S_sv_unmagicext_flags(aTHX_ sv, type, vtbl, 1);
5913 }
5914
5915 /*
5916 =for apidoc sv_rvweaken
5917
5918 Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
5919 referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
5920 push a back-reference to this RV onto the array of backreferences
5921 associated with that magic.  If the RV is magical, set magic will be
5922 called after the RV is cleared.
5923
5924 =cut
5925 */
5926
5927 SV *
5928 Perl_sv_rvweaken(pTHX_ SV *const sv)
5929 {
5930     SV *tsv;
5931
5932     PERL_ARGS_ASSERT_SV_RVWEAKEN;
5933
5934     if (!SvOK(sv))  /* let undefs pass */
5935         return sv;
5936     if (!SvROK(sv))
5937         Perl_croak(aTHX_ "Can't weaken a nonreference");
5938     else if (SvWEAKREF(sv)) {
5939         Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
5940         return sv;
5941     }
5942     else if (SvREADONLY(sv)) croak_no_modify();
5943     tsv = SvRV(sv);
5944     Perl_sv_add_backref(aTHX_ tsv, sv);
5945     SvWEAKREF_on(sv);
5946     SvREFCNT_dec_NN(tsv);
5947     return sv;
5948 }
5949
5950 /*
5951 =for apidoc sv_get_backrefs
5952
5953 If the sv is the target of a weakrefence then return
5954 the backrefs structure associated with the sv, otherwise
5955 return NULL.
5956
5957 When returning a non-null result the type of the return
5958 is relevant. If it is an AV then the contents of the AV
5959 are the weakrefs which point at this item. If it is any
5960 other type then the item itself is the weakref.
5961
5962 See also Perl_sv_add_backref(), Perl_sv_del_backref(),
5963 Perl_sv_kill_backrefs()
5964
5965 =cut
5966 */
5967
5968 SV *
5969 Perl_sv_get_backrefs(SV *const sv)
5970 {
5971     SV *backrefs= NULL;
5972
5973     PERL_ARGS_ASSERT_SV_GET_BACKREFS;
5974
5975     /* find slot to store array or singleton backref */
5976
5977     if (SvTYPE(sv) == SVt_PVHV) {
5978         if (SvOOK(sv)) {
5979             struct xpvhv_aux * const iter = HvAUX((HV *)sv);
5980             backrefs = (SV *)iter->xhv_backreferences;
5981         }
5982     } else if (SvMAGICAL(sv)) {
5983         MAGIC *mg = mg_find(sv, PERL_MAGIC_backref);
5984         if (mg)
5985             backrefs = mg->mg_obj;
5986     }
5987     return backrefs;
5988 }
5989
5990 /* Give tsv backref magic if it hasn't already got it, then push a
5991  * back-reference to sv onto the array associated with the backref magic.
5992  *
5993  * As an optimisation, if there's only one backref and it's not an AV,
5994  * store it directly in the HvAUX or mg_obj slot, avoiding the need to
5995  * allocate an AV. (Whether the slot holds an AV tells us whether this is
5996  * active.)
5997  */
5998
5999 /* A discussion about the backreferences array and its refcount:
6000  *
6001  * The AV holding the backreferences is pointed to either as the mg_obj of
6002  * PERL_MAGIC_backref, or in the specific case of a HV, from the
6003  * xhv_backreferences field. The array is created with a refcount
6004  * of 2. This means that if during global destruction the array gets
6005  * picked on before its parent to have its refcount decremented by the
6006  * random zapper, it won't actually be freed, meaning it's still there for
6007  * when its parent gets freed.
6008  *
6009  * When the parent SV is freed, the extra ref is killed by
6010  * Perl_sv_kill_backrefs.  The other ref is killed, in the case of magic,
6011  * by mg_free() / MGf_REFCOUNTED, or for a hash, by Perl_hv_kill_backrefs.
6012  *
6013  * When a single backref SV is stored directly, it is not reference
6014  * counted.
6015  */
6016
6017 void
6018 Perl_sv_add_backref(pTHX_ SV *const tsv, SV *const sv)
6019 {
6020     SV **svp;
6021     AV *av = NULL;
6022     MAGIC *mg = NULL;
6023
6024     PERL_ARGS_ASSERT_SV_ADD_BACKREF;
6025
6026     /* find slot to store array or singleton backref */
6027
6028     if (SvTYPE(tsv) == SVt_PVHV) {
6029         svp = (SV**)Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(tsv));
6030     } else {
6031         if (SvMAGICAL(tsv))
6032             mg = mg_find(tsv, PERL_MAGIC_backref);
6033         if (!mg)
6034             mg = sv_magicext(tsv, NULL, PERL_MAGIC_backref, &PL_vtbl_backref, NULL, 0);
6035         svp = &(mg->mg_obj);
6036     }
6037
6038     /* create or retrieve the array */
6039
6040     if (   (!*svp && SvTYPE(sv) == SVt_PVAV)
6041         || (*svp && SvTYPE(*svp) != SVt_PVAV)
6042     ) {
6043         /* create array */
6044         if (mg)
6045             mg->mg_flags |= MGf_REFCOUNTED;
6046         av = newAV();
6047         AvREAL_off(av);
6048         SvREFCNT_inc_simple_void_NN(av);
6049         /* av now has a refcnt of 2; see discussion above */
6050         av_extend(av, *svp ? 2 : 1);
6051         if (*svp) {
6052             /* move single existing backref to the array */
6053             AvARRAY(av)[++AvFILLp(av)] = *svp; /* av_push() */
6054         }
6055         *svp = (SV*)av;
6056     }
6057     else {
6058         av = MUTABLE_AV(*svp);
6059         if (!av) {
6060             /* optimisation: store single backref directly in HvAUX or mg_obj */
6061             *svp = sv;
6062             return;
6063         }
6064         assert(SvTYPE(av) == SVt_PVAV);
6065         if (AvFILLp(av) >= AvMAX(av)) {
6066             av_extend(av, AvFILLp(av)+1);
6067         }
6068     }
6069     /* push new backref */
6070     AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */
6071 }
6072
6073 /* delete a back-reference to ourselves from the backref magic associated
6074  * with the SV we point to.
6075  */
6076
6077 void
6078 Perl_sv_del_backref(pTHX_ SV *const tsv, SV *const sv)
6079 {
6080     SV **svp = NULL;
6081
6082     PERL_ARGS_ASSERT_SV_DEL_BACKREF;
6083
6084     if (SvTYPE(tsv) == SVt_PVHV) {
6085         if (SvOOK(tsv))
6086             svp = (SV**)Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(tsv));
6087     }
6088     else if (SvIS_FREED(tsv) && PL_phase == PERL_PHASE_DESTRUCT) {
6089         /* It's possible for the the last (strong) reference to tsv to have
6090            become freed *before* the last thing holding a weak reference.
6091            If both survive longer than the backreferences array, then when
6092            the referent's reference count drops to 0 and it is freed, it's
6093            not able to chase the backreferences, so they aren't NULLed.
6094
6095            For example, a CV holds a weak reference to its stash. If both the
6096            CV and the stash survive longer than the backreferences array,
6097            and the CV gets picked for the SvBREAK() treatment first,
6098            *and* it turns out that the stash is only being kept alive because
6099            of an our variable in the pad of the CV, then midway during CV
6100            destruction the stash gets freed, but CvSTASH() isn't set to NULL.
6101            It ends up pointing to the freed HV. Hence it's chased in here, and
6102            if this block wasn't here, it would hit the !svp panic just below.
6103
6104            I don't believe that "better" destruction ordering is going to help
6105            here - during global destruction there's always going to be the
6106            chance that something goes out of order. We've tried to make it
6107            foolproof before, and it only resulted in evolutionary pressure on
6108            fools. Which made us look foolish for our hubris. :-(
6109         */
6110         return;
6111     }
6112     else {
6113         MAGIC *const mg
6114             = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
6115         svp =  mg ? &(mg->mg_obj) : NULL;
6116     }
6117
6118     if (!svp)
6119         Perl_croak(aTHX_ "panic: del_backref, svp=0");
6120     if (!*svp) {
6121         /* It's possible that sv is being freed recursively part way through the
6122            freeing of tsv. If this happens, the backreferences array of tsv has
6123            already been freed, and so svp will be NULL. If this is the case,
6124            we should not panic. Instead, nothing needs doing, so return.  */
6125         if (PL_phase == PERL_PHASE_DESTRUCT && SvREFCNT(tsv) == 0)
6126             return;
6127         Perl_croak(aTHX_ "panic: del_backref, *svp=%p phase=%s refcnt=%" UVuf,
6128                    (void*)*svp, PL_phase_names[PL_phase], (UV)SvREFCNT(tsv));
6129     }
6130
6131     if (SvTYPE(*svp) == SVt_PVAV) {
6132 #ifdef DEBUGGING
6133         int count = 1;
6134 #endif
6135         AV * const av = (AV*)*svp;
6136         SSize_t fill;
6137         assert(!SvIS_FREED(av));
6138         fill = AvFILLp(av);
6139         assert(fill > -1);
6140         svp = AvARRAY(av);
6141         /* for an SV with N weak references to it, if all those
6142          * weak refs are deleted, then sv_del_backref will be called
6143          * N times and O(N^2) compares will be done within the backref
6144          * array. To ameliorate this potential slowness, we:
6145          * 1) make sure this code is as tight as possible;
6146          * 2) when looking for SV, look for it at both the head and tail of the
6147          *    array first before searching the rest, since some create/destroy
6148          *    patterns will cause the backrefs to be freed in order.
6149          */
6150         if (*svp == sv) {
6151             AvARRAY(av)++;
6152             AvMAX(av)--;
6153         }
6154         else {
6155             SV **p = &svp[fill];
6156             SV *const topsv = *p;
6157             if (topsv != sv) {
6158 #ifdef DEBUGGING
6159                 count = 0;
6160 #endif
6161                 while (--p > svp) {
6162                     if (*p == sv) {
6163                         /* We weren't the last entry.
6164                            An unordered list has this property that you
6165                            can take the last element off the end to fill
6166                            the hole, and it's still an unordered list :-)
6167                         */
6168                         *p = topsv;
6169 #ifdef DEBUGGING
6170                         count++;
6171 #else
6172                         break; /* should only be one */
6173 #endif
6174                     }
6175                 }
6176             }
6177         }
6178         assert(count ==1);
6179         AvFILLp(av) = fill-1;
6180     }
6181     else if (SvIS_FREED(*svp) && PL_phase == PERL_PHASE_DESTRUCT) {
6182         /* freed AV; skip */
6183     }
6184     else {
6185         /* optimisation: only a single backref, stored directly */
6186         if (*svp != sv)
6187             Perl_croak(aTHX_ "panic: del_backref, *svp=%p, sv=%p",
6188                        (void*)*svp, (void*)sv);
6189         *svp = NULL;
6190     }
6191
6192 }
6193
6194 void
6195 Perl_sv_kill_backrefs(pTHX_ SV *const sv, AV *const av)
6196 {
6197     SV **svp;
6198     SV **last;
6199     bool is_array;
6200
6201     PERL_ARGS_ASSERT_SV_KILL_BACKREFS;
6202
6203     if (!av)
6204         return;
6205
6206     /* after multiple passes through Perl_sv_clean_all() for a thingy
6207      * that has badly leaked, the backref array may have gotten freed,
6208      * since we only protect it against 1 round of cleanup */
6209     if (SvIS_FREED(av)) {
6210         if (PL_in_clean_all) /* All is fair */
6211             return;
6212         Perl_croak(aTHX_
6213                    "panic: magic_killbackrefs (freed backref AV/SV)");
6214     }
6215
6216
6217     is_array = (SvTYPE(av) == SVt_PVAV);
6218     if (is_array) {
6219         assert(!SvIS_FREED(av));
6220         svp = AvARRAY(av);
6221         if (svp)
6222             last = svp + AvFILLp(av);
6223     }
6224     else {
6225         /* optimisation: only a single backref, stored directly */
6226         svp = (SV**)&av;
6227         last = svp;
6228     }
6229
6230     if (svp) {
6231         while (svp <= last) {
6232             if (*svp) {
6233                 SV *const referrer = *svp;
6234                 if (SvWEAKREF(referrer)) {
6235                     /* XXX Should we check that it hasn't changed? */
6236                     assert(SvROK(referrer));
6237                     SvRV_set(referrer, 0);
6238                     SvOK_off(referrer);
6239                     SvWEAKREF_off(referrer);
6240                     SvSETMAGIC(referrer);
6241                 } else if (SvTYPE(referrer) == SVt_PVGV ||
6242                            SvTYPE(referrer) == SVt_PVLV) {
6243                     assert(SvTYPE(sv) == SVt_PVHV); /* stash backref */
6244                     /* You lookin' at me?  */
6245                     assert(GvSTASH(referrer));
6246                     assert(GvSTASH(referrer) == (const HV *)sv);
6247                     GvSTASH(referrer) = 0;
6248                 } else if (SvTYPE(referrer) == SVt_PVCV ||
6249                            SvTYPE(referrer) == SVt_PVFM) {
6250                     if (SvTYPE(sv) == SVt_PVHV) { /* stash backref */
6251                         /* You lookin' at me?  */
6252                         assert(CvSTASH(referrer));
6253                         assert(CvSTASH(referrer) == (const HV *)sv);
6254                         SvANY(MUTABLE_CV(referrer))->xcv_stash = 0;
6255                     }
6256                     else {
6257                         assert(SvTYPE(sv) == SVt_PVGV);
6258                         /* You lookin' at me?  */
6259                         assert(CvGV(referrer));
6260                         assert(CvGV(referrer) == (const GV *)sv);
6261                         anonymise_cv_maybe(MUTABLE_GV(sv),
6262                                                 MUTABLE_CV(referrer));
6263                     }
6264
6265                 } else {
6266                     Perl_croak(aTHX_
6267                                "panic: magic_killbackrefs (flags=%"UVxf")",
6268                                (UV)SvFLAGS(referrer));
6269                 }
6270
6271                 if (is_array)
6272                     *svp = NULL;
6273             }
6274             svp++;
6275         }
6276     }
6277     if (is_array) {
6278         AvFILLp(av) = -1;
6279         SvREFCNT_dec_NN(av); /* remove extra count added by sv_add_backref() */
6280     }
6281     return;
6282 }
6283
6284 /*
6285 =for apidoc sv_insert
6286
6287 Inserts a string at the specified offset/length within the SV.  Similar to
6288 the Perl substr() function.  Handles get magic.
6289
6290 =for apidoc sv_insert_flags
6291
6292 Same as C<sv_insert>, but the extra C<flags> are passed to the
6293 C<SvPV_force_flags> that applies to C<bigstr>.
6294
6295 =cut
6296 */
6297
6298 void
6299 Perl_sv_insert_flags(pTHX_ SV *const bigstr, const STRLEN offset, const STRLEN len, const char *const little, const STRLEN littlelen, const U32 flags)
6300 {
6301     char *big;
6302     char *mid;
6303     char *midend;
6304     char *bigend;
6305     SSize_t i;          /* better be sizeof(STRLEN) or bad things happen */
6306     STRLEN curlen;
6307
6308     PERL_ARGS_ASSERT_SV_INSERT_FLAGS;
6309
6310     SvPV_force_flags(bigstr, curlen, flags);
6311     (void)SvPOK_only_UTF8(bigstr);
6312     if (offset + len > curlen) {
6313         SvGROW(bigstr, offset+len+1);
6314         Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
6315         SvCUR_set(bigstr, offset+len);
6316     }
6317
6318     SvTAINT(bigstr);
6319     i = littlelen - len;
6320     if (i > 0) {                        /* string might grow */
6321         big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
6322         mid = big + offset + len;
6323         midend = bigend = big + SvCUR(bigstr);
6324         bigend += i;
6325         *bigend = '\0';
6326         while (midend > mid)            /* shove everything down */
6327             *--bigend = *--midend;
6328         Move(little,big+offset,littlelen,char);
6329         SvCUR_set(bigstr, SvCUR(bigstr) + i);
6330         SvSETMAGIC(bigstr);
6331         return;
6332     }
6333     else if (i == 0) {
6334         Move(little,SvPVX(bigstr)+offset,len,char);
6335         SvSETMAGIC(bigstr);
6336         return;
6337     }
6338
6339     big = SvPVX(bigstr);
6340     mid = big + offset;
6341     midend = mid + len;
6342     bigend = big + SvCUR(bigstr);
6343
6344     if (midend > bigend)
6345         Perl_croak(aTHX_ "panic: sv_insert, midend=%p, bigend=%p",
6346                    midend, bigend);
6347
6348     if (mid - big > bigend - midend) {  /* faster to shorten from end */
6349         if (littlelen) {
6350             Move(little, mid, littlelen,char);
6351             mid += littlelen;
6352         }
6353         i = bigend - midend;
6354         if (i > 0) {
6355             Move(midend, mid, i,char);
6356             mid += i;
6357         }
6358         *mid = '\0';
6359         SvCUR_set(bigstr, mid - big);
6360     }
6361     else if ((i = mid - big)) { /* faster from front */
6362         midend -= littlelen;
6363         mid = midend;
6364         Move(big, midend - i, i, char);
6365         sv_chop(bigstr,midend-i);
6366         if (littlelen)
6367             Move(little, mid, littlelen,char);
6368     }
6369     else if (littlelen) {
6370         midend -= littlelen;
6371         sv_chop(bigstr,midend);
6372         Move(little,midend,littlelen,char);
6373     }
6374     else {
6375         sv_chop(bigstr,midend);
6376     }
6377     SvSETMAGIC(bigstr);
6378 }
6379
6380 /*
6381 =for apidoc sv_replace
6382
6383 Make the first argument a copy of the second, then delete the original.
6384 The target SV physically takes over ownership of the body of the source SV
6385 and inherits its flags; however, the target keeps any magic it owns,
6386 and any magic in the source is discarded.
6387 Note that this is a rather specialist SV copying operation; most of the
6388 time you'll want to use C<sv_setsv> or one of its many macro front-ends.
6389
6390 =cut
6391 */
6392
6393 void
6394 Perl_sv_replace(pTHX_ SV *const sv, SV *const nsv)
6395 {
6396     const U32 refcnt = SvREFCNT(sv);
6397
6398     PERL_ARGS_ASSERT_SV_REPLACE;
6399
6400     SV_CHECK_THINKFIRST_COW_DROP(sv);
6401     if (SvREFCNT(nsv) != 1) {
6402         Perl_croak(aTHX_ "panic: reference miscount on nsv in sv_replace()"
6403                    " (%" UVuf " != 1)", (UV) SvREFCNT(nsv));
6404     }
6405     if (SvMAGICAL(sv)) {
6406         if (SvMAGICAL(nsv))
6407             mg_free(nsv);
6408         else
6409             sv_upgrade(nsv, SVt_PVMG);
6410         SvMAGIC_set(nsv, SvMAGIC(sv));
6411         SvFLAGS(nsv) |= SvMAGICAL(sv);
6412         SvMAGICAL_off(sv);
6413         SvMAGIC_set(sv, NULL);
6414     }
6415     SvREFCNT(sv) = 0;
6416     sv_clear(sv);
6417     assert(!SvREFCNT(sv));
6418 #ifdef DEBUG_LEAKING_SCALARS
6419     sv->sv_flags  = nsv->sv_flags;
6420     sv->sv_any    = nsv->sv_any;
6421     sv->sv_refcnt = nsv->sv_refcnt;
6422     sv->sv_u      = nsv->sv_u;
6423 #else
6424     StructCopy(nsv,sv,SV);
6425 #endif
6426     if(SvTYPE(sv) == SVt_IV) {
6427         SET_SVANY_FOR_BODYLESS_IV(sv);
6428     }
6429         
6430
6431 #ifdef PERL_OLD_COPY_ON_WRITE
6432     if (SvIsCOW_normal(nsv)) {
6433         /* We need to follow the pointers around the loop to make the
6434            previous SV point to sv, rather than nsv.  */
6435         SV *next;
6436         SV *current = nsv;
6437         while ((next = SV_COW_NEXT_SV(current)) != nsv) {
6438             assert(next);
6439             current = next;
6440             assert(SvPVX_const(current) == SvPVX_const(nsv));
6441         }
6442         /* Make the SV before us point to the SV after us.  */
6443         if (DEBUG_C_TEST) {
6444             PerlIO_printf(Perl_debug_log, "previous is\n");
6445             sv_dump(current);
6446             PerlIO_printf(Perl_debug_log,
6447                           "move it from 0x%"UVxf" to 0x%"UVxf"\n",
6448                           (UV) SV_COW_NEXT_SV(current), (UV) sv);
6449         }
6450         SV_COW_NEXT_SV_SET(current, sv);
6451     }
6452 #endif
6453     SvREFCNT(sv) = refcnt;
6454     SvFLAGS(nsv) |= SVTYPEMASK;         /* Mark as freed */
6455     SvREFCNT(nsv) = 0;
6456     del_SV(nsv);
6457 }
6458
6459 /* We're about to free a GV which has a CV that refers back to us.
6460  * If that CV will outlive us, make it anonymous (i.e. fix up its CvGV
6461  * field) */
6462
6463 STATIC void
6464 S_anonymise_cv_maybe(pTHX_ GV *gv, CV* cv)
6465 {
6466     SV *gvname;
6467     GV *anongv;
6468
6469     PERL_ARGS_ASSERT_ANONYMISE_CV_MAYBE;
6470
6471     /* be assertive! */
6472     assert(SvREFCNT(gv) == 0);
6473     assert(isGV(gv) && isGV_with_GP(gv));
6474     assert(GvGP(gv));
6475     assert(!CvANON(cv));
6476     assert(CvGV(cv) == gv);
6477     assert(!CvNAMED(cv));
6478
6479     /* will the CV shortly be freed by gp_free() ? */
6480     if (GvCV(gv) == cv && GvGP(gv)->gp_refcnt < 2 && SvREFCNT(cv) < 2) {
6481         SvANY(cv)->xcv_gv_u.xcv_gv = NULL;
6482         return;
6483     }
6484
6485     /* if not, anonymise: */
6486     gvname = (GvSTASH(gv) && HvNAME(GvSTASH(gv)) && HvENAME(GvSTASH(gv)))
6487                     ? newSVhek(HvENAME_HEK(GvSTASH(gv)))
6488                     : newSVpvn_flags( "__ANON__", 8, 0 );
6489     sv_catpvs(gvname, "::__ANON__");
6490     anongv = gv_fetchsv(gvname, GV_ADDMULTI, SVt_PVCV);
6491     SvREFCNT_dec_NN(gvname);
6492
6493     CvANON_on(cv);
6494     CvCVGV_RC_on(cv);
6495     SvANY(cv)->xcv_gv_u.xcv_gv = MUTABLE_GV(SvREFCNT_inc(anongv));
6496 }
6497
6498
6499 /*
6500 =for apidoc sv_clear
6501
6502 Clear an SV: call any destructors, free up any memory used by the body,
6503 and free the body itself.  The SV's head is I<not> freed, although
6504 its type is set to all 1's so that it won't inadvertently be assumed
6505 to be live during global destruction etc.
6506 This function should only be called when REFCNT is zero.  Most of the time
6507 you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
6508 instead.
6509
6510 =cut
6511 */
6512
6513 void
6514 Perl_sv_clear(pTHX_ SV *const orig_sv)
6515 {
6516     dVAR;
6517     HV *stash;
6518     U32 type;
6519     const struct body_details *sv_type_details;
6520     SV* iter_sv = NULL;
6521     SV* next_sv = NULL;
6522     SV *sv = orig_sv;
6523     STRLEN hash_index = 0; /* initialise to make Coverity et al happy.
6524                               Not strictly necessary */
6525
6526     PERL_ARGS_ASSERT_SV_CLEAR;
6527
6528     /* within this loop, sv is the SV currently being freed, and
6529      * iter_sv is the most recent AV or whatever that's being iterated
6530      * over to provide more SVs */
6531
6532     while (sv) {
6533
6534         type = SvTYPE(sv);
6535
6536         assert(SvREFCNT(sv) == 0);
6537         assert(SvTYPE(sv) != (svtype)SVTYPEMASK);
6538
6539         if (type <= SVt_IV) {
6540             /* See the comment in sv.h about the collusion between this
6541              * early return and the overloading of the NULL slots in the
6542              * size table.  */
6543             if (SvROK(sv))
6544                 goto free_rv;
6545             SvFLAGS(sv) &= SVf_BREAK;
6546             SvFLAGS(sv) |= SVTYPEMASK;
6547             goto free_head;
6548         }
6549
6550         /* objs are always >= MG, but pad names use the SVs_OBJECT flag
6551            for another purpose  */
6552         assert(!SvOBJECT(sv) || type >= SVt_PVMG);
6553
6554         if (type >= SVt_PVMG) {
6555             if (SvOBJECT(sv)) {
6556                 if (!curse(sv, 1)) goto get_next_sv;
6557                 type = SvTYPE(sv); /* destructor may have changed it */
6558             }
6559             /* Free back-references before magic, in case the magic calls
6560              * Perl code that has weak references to sv. */
6561             if (type == SVt_PVHV) {
6562                 Perl_hv_kill_backrefs(aTHX_ MUTABLE_HV(sv));
6563                 if (SvMAGIC(sv))
6564                     mg_free(sv);
6565             }
6566             else if (SvMAGIC(sv)) {
6567                 /* Free back-references before other types of magic. */
6568                 sv_unmagic(sv, PERL_MAGIC_backref);
6569                 mg_free(sv);
6570             }
6571             SvMAGICAL_off(sv);
6572         }
6573         switch (type) {
6574             /* case SVt_INVLIST: */
6575         case SVt_PVIO:
6576             if (IoIFP(sv) &&
6577                 IoIFP(sv) != PerlIO_stdin() &&
6578                 IoIFP(sv) != PerlIO_stdout() &&
6579                 IoIFP(sv) != PerlIO_stderr() &&
6580                 !(IoFLAGS(sv) & IOf_FAKE_DIRP))
6581             {
6582                 io_close(MUTABLE_IO(sv), NULL, FALSE,
6583                          (IoTYPE(sv) == IoTYPE_WRONLY ||
6584                           IoTYPE(sv) == IoTYPE_RDWR   ||
6585                           IoTYPE(sv) == IoTYPE_APPEND));
6586             }
6587             if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
6588                 PerlDir_close(IoDIRP(sv));
6589             IoDIRP(sv) = (DIR*)NULL;
6590             Safefree(IoTOP_NAME(sv));
6591             Safefree(IoFMT_NAME(sv));
6592             Safefree(IoBOTTOM_NAME(sv));
6593             if ((const GV *)sv == PL_statgv)
6594                 PL_statgv = NULL;
6595             goto freescalar;
6596         case SVt_REGEXP:
6597             /* FIXME for plugins */
6598           freeregexp:
6599             pregfree2((REGEXP*) sv);
6600             goto freescalar;
6601         case SVt_PVCV:
6602         case SVt_PVFM:
6603             cv_undef(MUTABLE_CV(sv));
6604             /* If we're in a stash, we don't own a reference to it.
6605              * However it does have a back reference to us, which needs to
6606              * be cleared.  */
6607             if ((stash = CvSTASH(sv)))
6608                 sv_del_backref(MUTABLE_SV(stash), sv);
6609             goto freescalar;
6610         case SVt_PVHV:
6611             if (PL_last_swash_hv == (const HV *)sv) {
6612                 PL_last_swash_hv = NULL;
6613             }
6614             if (HvTOTALKEYS((HV*)sv) > 0) {
6615                 const HEK *hek;
6616                 /* this statement should match the one at the beginning of
6617                  * hv_undef_flags() */
6618                 if (   PL_phase != PERL_PHASE_DESTRUCT
6619                     && (hek = HvNAME_HEK((HV*)sv)))
6620                 {
6621                     if (PL_stashcache) {
6622                         DEBUG_o(Perl_deb(aTHX_
6623                             "sv_clear clearing PL_stashcache for '%"HEKf
6624                             "'\n",
6625                              HEKfARG(hek)));
6626                         (void)hv_deletehek(PL_stashcache,
6627                                            hek, G_DISCARD);
6628                     }
6629                     hv_name_set((HV*)sv, NULL, 0, 0);
6630                 }
6631
6632                 /* save old iter_sv in unused SvSTASH field */
6633                 assert(!SvOBJECT(sv));
6634                 SvSTASH(sv) = (HV*)iter_sv;
6635                 iter_sv = sv;
6636
6637                 /* save old hash_index in unused SvMAGIC field */
6638                 assert(!SvMAGICAL(sv));
6639                 assert(!SvMAGIC(sv));
6640                 ((XPVMG*) SvANY(sv))->xmg_u.xmg_hash_index = hash_index;
6641                 hash_index = 0;
6642
6643                 next_sv = Perl_hfree_next_entry(aTHX_ (HV*)sv, &hash_index);
6644                 goto get_next_sv; /* process this new sv */
6645             }
6646             /* free empty hash */
6647             Perl_hv_undef_flags(aTHX_ MUTABLE_HV(sv), HV_NAME_SETALL);
6648             assert(!HvARRAY((HV*)sv));
6649             break;
6650         case SVt_PVAV:
6651             {
6652                 AV* av = MUTABLE_AV(sv);
6653                 if (PL_comppad == av) {
6654                     PL_comppad = NULL;
6655                     PL_curpad = NULL;
6656                 }
6657                 if (AvREAL(av) && AvFILLp(av) > -1) {
6658                     next_sv = AvARRAY(av)[AvFILLp(av)--];
6659                     /* save old iter_sv in top-most slot of AV,
6660                      * and pray that it doesn't get wiped in the meantime */
6661                     AvARRAY(av)[AvMAX(av)] = iter_sv;
6662                     iter_sv = sv;
6663                     goto get_next_sv; /* process this new sv */
6664                 }
6665                 Safefree(AvALLOC(av));
6666             }
6667
6668             break;
6669         case SVt_PVLV:
6670             if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
6671                 SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv)));
6672                 HeNEXT((HE*)LvTARG(sv)) = PL_hv_fetch_ent_mh;
6673                 PL_hv_fetch_ent_mh = (HE*)LvTARG(sv);
6674             }
6675             else if (LvTYPE(sv) != 't') /* unless tie: unrefcnted fake SV**  */
6676                 SvREFCNT_dec(LvTARG(sv));
6677             if (isREGEXP(sv)) goto freeregexp;
6678             /* FALLTHROUGH */
6679         case SVt_PVGV:
6680             if (isGV_with_GP(sv)) {
6681                 if(GvCVu((const GV *)sv) && (stash = GvSTASH(MUTABLE_GV(sv)))
6682                    && HvENAME_get(stash))
6683                     mro_method_changed_in(stash);
6684                 gp_free(MUTABLE_GV(sv));
6685                 if (GvNAME_HEK(sv))
6686                     unshare_hek(GvNAME_HEK(sv));
6687                 /* If we're in a stash, we don't own a reference to it.
6688                  * However it does have a back reference to us, which
6689                  * needs to be cleared.  */
6690                 if (!SvVALID(sv) && (stash = GvSTASH(sv)))
6691                         sv_del_backref(MUTABLE_SV(stash), sv);
6692             }
6693             /* FIXME. There are probably more unreferenced pointers to SVs
6694              * in the interpreter struct that we should check and tidy in
6695              * a similar fashion to this:  */
6696             /* See also S_sv_unglob, which does the same thing. */
6697             if ((const GV *)sv == PL_last_in_gv)
6698                 PL_last_in_gv = NULL;
6699             else if ((const GV *)sv == PL_statgv)
6700                 PL_statgv = NULL;
6701             else if ((const GV *)sv == PL_stderrgv)
6702                 PL_stderrgv = NULL;
6703             /* FALLTHROUGH */
6704         case SVt_PVMG:
6705         case SVt_PVNV:
6706         case SVt_PVIV:
6707         case SVt_INVLIST:
6708         case SVt_PV:
6709           freescalar:
6710             /* Don't bother with SvOOK_off(sv); as we're only going to
6711              * free it.  */
6712             if (SvOOK(sv)) {
6713                 STRLEN offset;
6714                 SvOOK_offset(sv, offset);
6715                 SvPV_set(sv, SvPVX_mutable(sv) - offset);
6716                 /* Don't even bother with turning off the OOK flag.  */
6717             }
6718             if (SvROK(sv)) {
6719             free_rv:
6720                 {
6721                     SV * const target = SvRV(sv);
6722                     if (SvWEAKREF(sv))
6723                         sv_del_backref(target, sv);
6724                     else
6725                         next_sv = target;
6726                 }
6727             }
6728 #ifdef PERL_ANY_COW
6729             else if (SvPVX_const(sv)
6730                      && !(SvTYPE(sv) == SVt_PVIO
6731                      && !(IoFLAGS(sv) & IOf_FAKE_DIRP)))
6732             {
6733                 if (SvIsCOW(sv)) {
6734                     if (DEBUG_C_TEST) {
6735                         PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
6736                         sv_dump(sv);
6737                     }
6738                     if (SvLEN(sv)) {
6739 # ifdef PERL_OLD_COPY_ON_WRITE
6740                         sv_release_COW(sv, SvPVX_const(sv), SV_COW_NEXT_SV(sv));
6741 # else
6742                         if (CowREFCNT(sv)) {
6743                             sv_buf_to_rw(sv);
6744                             CowREFCNT(sv)--;
6745                             sv_buf_to_ro(sv);
6746                             SvLEN_set(sv, 0);
6747                         }
6748 # endif
6749                     } else {
6750                         unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
6751                     }
6752
6753                 }
6754 # ifdef PERL_OLD_COPY_ON_WRITE
6755                 else
6756 # endif
6757                 if (SvLEN(sv)) {
6758                     Safefree(SvPVX_mutable(sv));
6759                 }
6760             }
6761 #else
6762             else if (SvPVX_const(sv) && SvLEN(sv)
6763                      && !(SvTYPE(sv) == SVt_PVIO
6764                      && !(IoFLAGS(sv) & IOf_FAKE_DIRP)))
6765                 Safefree(SvPVX_mutable(sv));
6766             else if (SvPVX_const(sv) && SvIsCOW(sv)) {
6767                 unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
6768             }
6769 #endif
6770             break;
6771         case SVt_NV:
6772             break;
6773         }
6774
6775       free_body:
6776
6777         SvFLAGS(sv) &= SVf_BREAK;
6778         SvFLAGS(sv) |= SVTYPEMASK;
6779
6780         sv_type_details = bodies_by_type + type;
6781         if (sv_type_details->arena) {
6782             del_body(((char *)SvANY(sv) + sv_type_details->offset),
6783                      &PL_body_roots[type]);
6784         }
6785         else if (sv_type_details->body_size) {
6786             safefree(SvANY(sv));
6787         }
6788
6789       free_head:
6790         /* caller is responsible for freeing the head of the original sv */
6791         if (sv != orig_sv && !SvREFCNT(sv))
6792             del_SV(sv);
6793
6794         /* grab and free next sv, if any */
6795       get_next_sv:
6796         while (1) {
6797             sv = NULL;
6798             if (next_sv) {
6799                 sv = next_sv;
6800                 next_sv = NULL;
6801             }
6802             else if (!iter_sv) {
6803                 break;
6804             } else if (SvTYPE(iter_sv) == SVt_PVAV) {
6805                 AV *const av = (AV*)iter_sv;
6806                 if (AvFILLp(av) > -1) {
6807                     sv = AvARRAY(av)[AvFILLp(av)--];
6808                 }
6809                 else { /* no more elements of current AV to free */
6810                     sv = iter_sv;
6811                     type = SvTYPE(sv);
6812                     /* restore previous value, squirrelled away */
6813                     iter_sv = AvARRAY(av)[AvMAX(av)];
6814                     Safefree(AvALLOC(av));
6815                     goto free_body;
6816                 }
6817             } else if (SvTYPE(iter_sv) == SVt_PVHV) {
6818                 sv = Perl_hfree_next_entry(aTHX_ (HV*)iter_sv, &hash_index);
6819                 if (!sv && !HvTOTALKEYS((HV *)iter_sv)) {
6820                     /* no more elements of current HV to free */
6821                     sv = iter_sv;
6822                     type = SvTYPE(sv);
6823                     /* Restore previous values of iter_sv and hash_index,
6824                      * squirrelled away */
6825                     assert(!SvOBJECT(sv));
6826                     iter_sv = (SV*)SvSTASH(sv);
6827                     assert(!SvMAGICAL(sv));
6828                     hash_index = ((XPVMG*) SvANY(sv))->xmg_u.xmg_hash_index;
6829 #ifdef DEBUGGING
6830                     /* perl -DA does not like rubbish in SvMAGIC. */
6831                     SvMAGIC_set(sv, 0);
6832 #endif
6833
6834                     /* free any remaining detritus from the hash struct */
6835                     Perl_hv_undef_flags(aTHX_ MUTABLE_HV(sv), HV_NAME_SETALL);
6836                     assert(!HvARRAY((HV*)sv));
6837                     goto free_body;
6838                 }
6839             }
6840
6841             /* unrolled SvREFCNT_dec and sv_free2 follows: */
6842
6843             if (!sv)
6844                 continue;
6845             if (!SvREFCNT(sv)) {
6846                 sv_free(sv);
6847                 continue;
6848             }
6849             if (--(SvREFCNT(sv)))
6850                 continue;
6851 #ifdef DEBUGGING
6852             if (SvTEMP(sv)) {
6853                 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING),
6854                          "Attempt to free temp prematurely: SV 0x%"UVxf
6855                          pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
6856                 continue;
6857             }
6858 #endif
6859             if (SvIMMORTAL(sv)) {
6860                 /* make sure SvREFCNT(sv)==0 happens very seldom */
6861                 SvREFCNT(sv) = SvREFCNT_IMMORTAL;
6862                 continue;
6863             }
6864             break;
6865         } /* while 1 */
6866
6867     } /* while sv */
6868 }
6869
6870 /* This routine curses the sv itself, not the object referenced by sv. So
6871    sv does not have to be ROK. */
6872
6873 static bool
6874 S_curse(pTHX_ SV * const sv, const bool check_refcnt) {
6875     PERL_ARGS_ASSERT_CURSE;
6876     assert(SvOBJECT(sv));
6877
6878     if (PL_defstash &&  /* Still have a symbol table? */
6879         SvDESTROYABLE(sv))
6880     {
6881         dSP;
6882         HV* stash;
6883         do {
6884           stash = SvSTASH(sv);
6885           assert(SvTYPE(stash) == SVt_PVHV);
6886           if (HvNAME(stash)) {
6887             CV* destructor = NULL;
6888             assert (SvOOK(stash));
6889             if (!SvOBJECT(stash)) destructor = (CV *)SvSTASH(stash);
6890             if (!destructor || HvMROMETA(stash)->destroy_gen
6891                                 != PL_sub_generation)
6892             {
6893                 GV * const gv =
6894                     gv_fetchmeth_autoload(stash, "DESTROY", 7, 0);
6895                 if (gv) destructor = GvCV(gv);
6896                 if (!SvOBJECT(stash))
6897                 {
6898                     SvSTASH(stash) =
6899                         destructor ? (HV *)destructor : ((HV *)0)+1;
6900                     HvAUX(stash)->xhv_mro_meta->destroy_gen =
6901                         PL_sub_generation;
6902                 }
6903             }
6904             assert(!destructor || destructor == ((CV *)0)+1
6905                 || SvTYPE(destructor) == SVt_PVCV);
6906             if (destructor && destructor != ((CV *)0)+1
6907                 /* A constant subroutine can have no side effects, so
6908                    don't bother calling it.  */
6909                 && !CvCONST(destructor)
6910                 /* Don't bother calling an empty destructor or one that
6911                    returns immediately. */
6912                 && (CvISXSUB(destructor)
6913                 || (CvSTART(destructor)
6914                     && (CvSTART(destructor)->op_next->op_type
6915                                         != OP_LEAVESUB)
6916                     && (CvSTART(destructor)->op_next->op_type
6917                                         != OP_PUSHMARK
6918                         || CvSTART(destructor)->op_next->op_next->op_type
6919                                         != OP_RETURN
6920                        )
6921                    ))
6922                )
6923             {
6924                 SV* const tmpref = newRV(sv);
6925                 SvREADONLY_on(tmpref); /* DESTROY() could be naughty */
6926                 ENTER;
6927                 PUSHSTACKi(PERLSI_DESTROY);
6928                 EXTEND(SP, 2);
6929                 PUSHMARK(SP);
6930                 PUSHs(tmpref);
6931                 PUTBACK;
6932                 call_sv(MUTABLE_SV(destructor),
6933                             G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
6934                 POPSTACK;
6935                 SPAGAIN;
6936                 LEAVE;
6937                 if(SvREFCNT(tmpref) < 2) {
6938                     /* tmpref is not kept alive! */
6939                     SvREFCNT(sv)--;
6940                     SvRV_set(tmpref, NULL);
6941                     SvROK_off(tmpref);
6942                 }
6943                 SvREFCNT_dec_NN(tmpref);
6944             }
6945           }
6946         } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
6947
6948
6949         if (check_refcnt && SvREFCNT(sv)) {
6950             if (PL_in_clean_objs)
6951                 Perl_croak(aTHX_
6952                   "DESTROY created new reference to dead object '%"HEKf"'",
6953                    HEKfARG(HvNAME_HEK(stash)));
6954             /* DESTROY gave object new lease on life */
6955             return FALSE;
6956         }
6957     }
6958
6959     if (SvOBJECT(sv)) {
6960         HV * const stash = SvSTASH(sv);
6961         /* Curse before freeing the stash, as freeing the stash could cause
6962            a recursive call into S_curse. */
6963         SvOBJECT_off(sv);       /* Curse the object. */
6964         SvSTASH_set(sv,0);      /* SvREFCNT_dec may try to read this */
6965         SvREFCNT_dec(stash); /* possibly of changed persuasion */
6966     }
6967     return TRUE;
6968 }
6969
6970 /*
6971 =for apidoc sv_newref
6972
6973 Increment an SV's reference count.  Use the C<SvREFCNT_inc()> wrapper
6974 instead.
6975
6976 =cut
6977 */
6978
6979 SV *
6980 Perl_sv_newref(pTHX_ SV *const sv)
6981 {
6982     PERL_UNUSED_CONTEXT;
6983     if (sv)
6984         (SvREFCNT(sv))++;
6985     return sv;
6986 }
6987
6988 /*
6989 =for apidoc sv_free
6990
6991 Decrement an SV's reference count, and if it drops to zero, call
6992 C<sv_clear> to invoke destructors and free up any memory used by
6993 the body; finally, deallocate the SV's head itself.
6994 Normally called via a wrapper macro C<SvREFCNT_dec>.
6995
6996 =cut
6997 */
6998
6999 void
7000 Perl_sv_free(pTHX_ SV *const sv)
7001 {
7002     SvREFCNT_dec(sv);
7003 }
7004
7005
7006 /* Private helper function for SvREFCNT_dec().
7007  * Called with rc set to original SvREFCNT(sv), where rc == 0 or 1 */
7008
7009 void
7010 Perl_sv_free2(pTHX_ SV *const sv, const U32 rc)
7011 {
7012     dVAR;
7013
7014     PERL_ARGS_ASSERT_SV_FREE2;
7015
7016     if (LIKELY( rc == 1 )) {
7017         /* normal case */
7018         SvREFCNT(sv) = 0;
7019
7020 #ifdef DEBUGGING
7021         if (SvTEMP(sv)) {
7022             Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING),
7023                              "Attempt to free temp prematurely: SV 0x%"UVxf
7024                              pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
7025             return;
7026         }
7027 #endif
7028         if (SvIMMORTAL(sv)) {
7029             /* make sure SvREFCNT(sv)==0 happens very seldom */
7030             SvREFCNT(sv) = SvREFCNT_IMMORTAL;
7031             return;
7032         }
7033         sv_clear(sv);
7034         if (! SvREFCNT(sv)) /* may have have been resurrected */
7035             del_SV(sv);
7036         return;
7037     }
7038
7039     /* handle exceptional cases */
7040
7041     assert(rc == 0);
7042
7043     if (SvFLAGS(sv) & SVf_BREAK)
7044         /* this SV's refcnt has been artificially decremented to
7045          * trigger cleanup */
7046         return;
7047     if (PL_in_clean_all) /* All is fair */
7048         return;
7049     if (SvIMMORTAL(sv)) {
7050         /* make sure SvREFCNT(sv)==0 happens very seldom */
7051         SvREFCNT(sv) = SvREFCNT_IMMORTAL;
7052         return;
7053     }
7054     if (ckWARN_d(WARN_INTERNAL)) {
7055 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
7056         Perl_dump_sv_child(aTHX_ sv);
7057 #else
7058     #ifdef DEBUG_LEAKING_SCALARS
7059         sv_dump(sv);
7060     #endif
7061 #ifdef DEBUG_LEAKING_SCALARS_ABORT
7062         if (PL_warnhook == PERL_WARNHOOK_FATAL
7063             || ckDEAD(packWARN(WARN_INTERNAL))) {
7064             /* Don't let Perl_warner cause us to escape our fate:  */
7065             abort();
7066         }
7067 #endif
7068         /* This may not return:  */
7069         Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
7070                     "Attempt to free unreferenced scalar: SV 0x%"UVxf
7071                     pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
7072 #endif
7073     }
7074 #ifdef DEBUG_LEAKING_SCALARS_ABORT
7075     abort();
7076 #endif
7077
7078 }
7079
7080
7081 /*
7082 =for apidoc sv_len
7083
7084 Returns the length of the string in the SV.  Handles magic and type
7085 coercion and sets the UTF8 flag appropriately.  See also C<SvCUR>, which
7086 gives raw access to the xpv_cur slot.
7087
7088 =cut
7089 */
7090
7091 STRLEN
7092 Perl_sv_len(pTHX_ SV *const sv)
7093 {
7094     STRLEN len;
7095
7096     if (!sv)
7097         return 0;
7098
7099     (void)SvPV_const(sv, len);
7100     return len;
7101 }
7102
7103 /*
7104 =for apidoc sv_len_utf8
7105
7106 Returns the number of characters in the string in an SV, counting wide
7107 UTF-8 bytes as a single character.  Handles magic and type coercion.
7108
7109 =cut
7110 */
7111
7112 /*
7113  * The length is cached in PERL_MAGIC_utf8, in the mg_len field.  Also the
7114  * mg_ptr is used, by sv_pos_u2b() and sv_pos_b2u() - see the comments below.
7115  * (Note that the mg_len is not the length of the mg_ptr field.
7116  * This allows the cache to store the character length of the string without
7117  * needing to malloc() extra storage to attach to the mg_ptr.)
7118  *
7119  */
7120
7121 STRLEN
7122 Perl_sv_len_utf8(pTHX_ SV *const sv)
7123 {
7124     if (!sv)
7125         return 0;
7126
7127     SvGETMAGIC(sv);
7128     return sv_len_utf8_nomg(sv);
7129 }
7130
7131 STRLEN
7132 Perl_sv_len_utf8_nomg(pTHX_ SV * const sv)
7133 {
7134     STRLEN len;
7135     const U8 *s = (U8*)SvPV_nomg_const(sv, len);
7136
7137     PERL_ARGS_ASSERT_SV_LEN_UTF8_NOMG;
7138
7139     if (PL_utf8cache && SvUTF8(sv)) {
7140             STRLEN ulen;
7141             MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : NULL;
7142
7143             if (mg && (mg->mg_len != -1 || mg->mg_ptr)) {
7144                 if (mg->mg_len != -1)
7145                     ulen = mg->mg_len;
7146                 else {
7147                     /* We can use the offset cache for a headstart.
7148                        The longer value is stored in the first pair.  */
7149                     STRLEN *cache = (STRLEN *) mg->mg_ptr;
7150
7151                     ulen = cache[0] + Perl_utf8_length(aTHX_ s + cache[1],
7152                                                        s + len);
7153                 }
7154                 
7155                 if (PL_utf8cache < 0) {
7156                     const STRLEN real = Perl_utf8_length(aTHX_ s, s + len);
7157                     assert_uft8_cache_coherent("sv_len_utf8", ulen, real, sv);
7158                 }
7159             }
7160             else {
7161                 ulen = Perl_utf8_length(aTHX_ s, s + len);
7162                 utf8_mg_len_cache_update(sv, &mg, ulen);
7163             }
7164             return ulen;
7165     }
7166     return SvUTF8(sv) ? Perl_utf8_length(aTHX_ s, s + len) : len;
7167 }
7168
7169 /* Walk forwards to find the byte corresponding to the passed in UTF-8
7170    offset.  */
7171 static STRLEN
7172 S_sv_pos_u2b_forwards(const U8 *const start, const U8 *const send,
7173                       STRLEN *const uoffset_p, bool *const at_end)
7174 {
7175     const U8 *s = start;
7176     STRLEN uoffset = *uoffset_p;
7177
7178     PERL_ARGS_ASSERT_SV_POS_U2B_FORWARDS;
7179
7180     while (s < send && uoffset) {
7181         --uoffset;
7182         s += UTF8SKIP(s);
7183     }
7184     if (s == send) {
7185         *at_end = TRUE;
7186     }
7187     else if (s > send) {
7188         *at_end = TRUE;
7189         /* This is the existing behaviour. Possibly it should be a croak, as
7190            it's actually a bounds error  */
7191         s = send;
7192     }
7193     *uoffset_p -= uoffset;
7194     return s - start;
7195 }
7196
7197 /* Given the length of the string in both bytes and UTF-8 characters, decide
7198    whether to walk forwards or backwards to find the byte corresponding to
7199    the passed in UTF-8 offset.  */
7200 static STRLEN
7201 S_sv_pos_u2b_midway(const U8 *const start, const U8 *send,
7202                     STRLEN uoffset, const STRLEN uend)
7203 {
7204     STRLEN backw = uend - uoffset;
7205
7206     PERL_ARGS_ASSERT_SV_POS_U2B_MIDWAY;
7207
7208     if (uoffset < 2 * backw) {
7209         /* The assumption is that going forwards is twice the speed of going
7210            forward (that's where the 2 * backw comes from).
7211            (The real figure of course depends on the UTF-8 data.)  */
7212         const U8 *s = start;
7213
7214         while (s < send && uoffset--)
7215             s += UTF8SKIP(s);
7216         assert (s <= send);
7217         if (s > send)
7218             s = send;
7219         return s - start;
7220     }
7221
7222     while (backw--) {
7223         send--;
7224         while (UTF8_IS_CONTINUATION(*send))
7225             send--;
7226     }
7227     return send - start;
7228 }
7229
7230 /* For the string representation of the given scalar, find the byte
7231    corresponding to the passed in UTF-8 offset.  uoffset0 and boffset0
7232    give another position in the string, *before* the sought offset, which
7233    (which is always true, as 0, 0 is a valid pair of positions), which should
7234    help reduce the amount of linear searching.
7235    If *mgp is non-NULL, it should point to the UTF-8 cache magic, which
7236    will be used to reduce the amount of linear searching. The cache will be
7237    created if necessary, and the found value offered to it for update.  */
7238 static STRLEN
7239 S_sv_pos_u2b_cached(pTHX_ SV *const sv, MAGIC **const mgp, const U8 *const start,
7240                     const U8 *const send, STRLEN uoffset,
7241                     STRLEN uoffset0, STRLEN boffset0)
7242 {
7243     STRLEN boffset = 0; /* Actually always set, but let's keep gcc happy.  */
7244     bool found = FALSE;
7245     bool at_end = FALSE;
7246
7247     PERL_ARGS_ASSERT_SV_POS_U2B_CACHED;
7248
7249     assert (uoffset >= uoffset0);
7250
7251     if (!uoffset)
7252         return 0;
7253
7254     if (!SvREADONLY(sv) && !SvGMAGICAL(sv) && SvPOK(sv)
7255         && PL_utf8cache
7256         && (*mgp || (SvTYPE(sv) >= SVt_PVMG &&
7257                      (*mgp = mg_find(sv, PERL_MAGIC_utf8))))) {
7258         if ((*mgp)->mg_ptr) {
7259             STRLEN *cache = (STRLEN *) (*mgp)->mg_ptr;
7260             if (cache[0] == uoffset) {
7261                 /* An exact match. */
7262                 return cache[1];
7263             }
7264             if (cache[2] == uoffset) {
7265                 /* An exact match. */
7266                 return cache[3];
7267             }
7268
7269             if (cache[0] < uoffset) {
7270                 /* The cache already knows part of the way.   */
7271                 if (cache[0] > uoffset0) {
7272                     /* The cache knows more than the passed in pair  */
7273                     uoffset0 = cache[0];
7274                     boffset0 = cache[1];
7275                 }
7276                 if ((*mgp)->mg_len != -1) {
7277                     /* And we know the end too.  */
7278                     boffset = boffset0
7279                         + sv_pos_u2b_midway(start + boffset0, send,
7280                                               uoffset - uoffset0,
7281                                               (*mgp)->mg_len - uoffset0);
7282                 } else {
7283                     uoffset -= uoffset0;
7284                     boffset = boffset0
7285                         + sv_pos_u2b_forwards(start + boffset0,
7286                                               send, &uoffset, &at_end);
7287                     uoffset += uoffset0;
7288                 }
7289             }
7290             else if (cache[2] < uoffset) {
7291                 /* We're between the two cache entries.  */
7292                 if (cache[2] > uoffset0) {
7293                     /* and the cache knows more than the passed in pair  */
7294                     uoffset0 = cache[2];
7295                     boffset0 = cache[3];
7296                 }
7297
7298                 boffset = boffset0
7299                     + sv_pos_u2b_midway(start + boffset0,
7300                                           start + cache[1],
7301                                           uoffset - uoffset0,
7302                                           cache[0] - uoffset0);
7303             } else {
7304                 boffset = boffset0
7305                     + sv_pos_u2b_midway(start + boffset0,
7306                                           start + cache[3],
7307                                           uoffset - uoffset0,
7308                                           cache[2] - uoffset0);
7309             }
7310             found = TRUE;
7311         }
7312         else if ((*mgp)->mg_len != -1) {
7313             /* If we can take advantage of a passed in offset, do so.  */
7314             /* In fact, offset0 is either 0, or less than offset, so don't
7315                need to worry about the other possibility.  */
7316             boffset = boffset0
7317                 + sv_pos_u2b_midway(start + boffset0, send,
7318                                       uoffset - uoffset0,
7319                                       (*mgp)->mg_len - uoffset0);
7320             found = TRUE;
7321         }
7322     }
7323
7324     if (!found || PL_utf8cache < 0) {
7325         STRLEN real_boffset;
7326         uoffset -= uoffset0;
7327         real_boffset = boffset0 + sv_pos_u2b_forwards(start + boffset0,
7328                                                       send, &uoffset, &at_end);
7329         uoffset += uoffset0;
7330
7331         if (found && PL_utf8cache < 0)
7332             assert_uft8_cache_coherent("sv_pos_u2b_cache", boffset,
7333                                        real_boffset, sv);
7334         boffset = real_boffset;
7335     }
7336
7337     if (PL_utf8cache && !SvGMAGICAL(sv) && SvPOK(sv)) {
7338         if (at_end)
7339             utf8_mg_len_cache_update(sv, mgp, uoffset);
7340         else
7341             utf8_mg_pos_cache_update(sv, mgp, boffset, uoffset, send - start);
7342     }
7343     return boffset;
7344 }
7345
7346
7347 /*
7348 =for apidoc sv_pos_u2b_flags
7349
7350 Converts the offset from a count of UTF-8 chars from
7351 the start of the string, to a count of the equivalent number of bytes; if
7352 lenp is non-zero, it does the same to lenp, but this time starting from
7353 the offset, rather than from the start
7354 of the string.  Handles type coercion.
7355 I<flags> is passed to C<SvPV_flags>, and usually should be
7356 C<SV_GMAGIC|SV_CONST_RETURN> to handle magic.
7357
7358 =cut
7359 */
7360
7361 /*
7362  * sv_pos_u2b_flags() uses, like sv_pos_b2u(), the mg_ptr of the potential
7363  * PERL_MAGIC_utf8 of the sv to store the mapping between UTF-8 and
7364  * byte offsets.  See also the comments of S_utf8_mg_pos_cache_update().
7365  *
7366  */
7367
7368 STRLEN
7369 Perl_sv_pos_u2b_flags(pTHX_ SV *const sv, STRLEN uoffset, STRLEN *const lenp,
7370                       U32 flags)
7371 {
7372     const U8 *start;
7373     STRLEN len;
7374     STRLEN boffset;
7375
7376     PERL_ARGS_ASSERT_SV_POS_U2B_FLAGS;
7377
7378     start = (U8*)SvPV_flags(sv, len, flags);
7379     if (len) {
7380         const U8 * const send = start + len;
7381         MAGIC *mg = NULL;
7382         boffset = sv_pos_u2b_cached(sv, &mg, start, send, uoffset, 0, 0);
7383
7384         if (lenp
7385             && *lenp /* don't bother doing work for 0, as its bytes equivalent
7386                         is 0, and *lenp is already set to that.  */) {
7387             /* Convert the relative offset to absolute.  */
7388             const STRLEN uoffset2 = uoffset + *lenp;
7389             const STRLEN boffset2
7390                 = sv_pos_u2b_cached(sv, &mg, start, send, uoffset2,
7391                                       uoffset, boffset) - boffset;
7392
7393             *lenp = boffset2;
7394         }
7395     } else {
7396         if (lenp)
7397             *lenp = 0;
7398         boffset = 0;
7399     }
7400
7401     return boffset;
7402 }
7403
7404 /*
7405 =for apidoc sv_pos_u2b
7406
7407 Converts the value pointed to by offsetp from a count of UTF-8 chars from
7408 the start of the string, to a count of the equivalent number of bytes; if
7409 lenp is non-zero, it does the same to lenp, but this time starting from
7410 the offset, rather than from the start of the string.  Handles magic and
7411 type coercion.
7412
7413 Use C<sv_pos_u2b_flags> in preference, which correctly handles strings longer
7414 than 2Gb.
7415
7416 =cut
7417 */
7418
7419 /*
7420  * sv_pos_u2b() uses, like sv_pos_b2u(), the mg_ptr of the potential
7421  * PERL_MAGIC_utf8 of the sv to store the mapping between UTF-8 and
7422  * byte offsets.  See also the comments of S_utf8_mg_pos_cache_update().
7423  *
7424  */
7425
7426 /* This function is subject to size and sign problems */
7427
7428 void
7429 Perl_sv_pos_u2b(pTHX_ SV *const sv, I32 *const offsetp, I32 *const lenp)
7430 {
7431     PERL_ARGS_ASSERT_SV_POS_U2B;
7432
7433     if (lenp) {
7434         STRLEN ulen = (STRLEN)*lenp;
7435         *offsetp = (I32)sv_pos_u2b_flags(sv, (STRLEN)*offsetp, &ulen,
7436                                          SV_GMAGIC|SV_CONST_RETURN);
7437         *lenp = (I32)ulen;
7438     } else {
7439         *offsetp = (I32)sv_pos_u2b_flags(sv, (STRLEN)*offsetp, NULL,
7440                                          SV_GMAGIC|SV_CONST_RETURN);
7441     }
7442 }
7443
7444 static void
7445 S_utf8_mg_len_cache_update(pTHX_ SV *const sv, MAGIC **const mgp,
7446                            const STRLEN ulen)
7447 {
7448     PERL_ARGS_ASSERT_UTF8_MG_LEN_CACHE_UPDATE;
7449     if (SvREADONLY(sv) || SvGMAGICAL(sv) || !SvPOK(sv))
7450         return;
7451
7452     if (!*mgp && (SvTYPE(sv) < SVt_PVMG ||
7453                   !(*mgp = mg_find(sv, PERL_MAGIC_utf8)))) {
7454         *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, &PL_vtbl_utf8, 0, 0);
7455     }
7456     assert(*mgp);
7457
7458     (*mgp)->mg_len = ulen;
7459 }
7460
7461 /* Create and update the UTF8 magic offset cache, with the proffered utf8/
7462    byte length pairing. The (byte) length of the total SV is passed in too,
7463    as blen, because for some (more esoteric) SVs, the call to SvPV_const()
7464    may not have updated SvCUR, so we can't rely on reading it directly.
7465
7466    The proffered utf8/byte length pairing isn't used if the cache already has
7467    two pairs, and swapping either for the proffered pair would increase the
7468    RMS of the intervals between known byte offsets.
7469
7470    The cache itself consists of 4 STRLEN values
7471    0: larger UTF-8 offset
7472    1: corresponding byte offset
7473    2: smaller UTF-8 offset
7474    3: corresponding byte offset
7475
7476    Unused cache pairs have the value 0, 0.
7477    Keeping the cache "backwards" means that the invariant of
7478    cache[0] >= cache[2] is maintained even with empty slots, which means that
7479    the code that uses it doesn't need to worry if only 1 entry has actually
7480    been set to non-zero.  It also makes the "position beyond the end of the
7481    cache" logic much simpler, as the first slot is always the one to start
7482    from.   
7483 */
7484 static void
7485 S_utf8_mg_pos_cache_update(pTHX_ SV *const sv, MAGIC **const mgp, const STRLEN byte,
7486                            const STRLEN utf8, const STRLEN blen)
7487 {
7488     STRLEN *cache;
7489
7490     PERL_ARGS_ASSERT_UTF8_MG_POS_CACHE_UPDATE;
7491
7492     if (SvREADONLY(sv))
7493         return;
7494
7495     if (!*mgp && (SvTYPE(sv) < SVt_PVMG ||
7496                   !(*mgp = mg_find(sv, PERL_MAGIC_utf8)))) {
7497         *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, (MGVTBL*)&PL_vtbl_utf8, 0,
7498                            0);
7499         (*mgp)->mg_len = -1;
7500     }
7501     assert(*mgp);
7502
7503     if (!(cache = (STRLEN *)(*mgp)->mg_ptr)) {
7504         Newxz(cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
7505         (*mgp)->mg_ptr = (char *) cache;
7506     }
7507     assert(cache);
7508
7509     if (PL_utf8cache < 0 && SvPOKp(sv)) {
7510         /* SvPOKp() because, if sv is a reference, then SvPVX() is actually
7511            a pointer.  Note that we no longer cache utf8 offsets on refer-
7512            ences, but this check is still a good idea, for robustness.  */
7513         const U8 *start = (const U8 *) SvPVX_const(sv);
7514         const STRLEN realutf8 = utf8_length(start, start + byte);
7515
7516         assert_uft8_cache_coherent("utf8_mg_pos_cache_update", utf8, realutf8,
7517                                    sv);
7518     }
7519
7520     /* Cache is held with the later position first, to simplify the code
7521        that deals with unbounded ends.  */
7522        
7523     ASSERT_UTF8_CACHE(cache);
7524     if (cache[1] == 0) {
7525         /* Cache is totally empty  */
7526         cache[0] = utf8;
7527         cache[1] = byte;
7528     } else if (cache[3] == 0) {
7529         if (byte > cache[1]) {
7530             /* New one is larger, so goes first.  */
7531             cache[2] = cache[0];
7532             cache[3] = cache[1];
7533             cache[0] = utf8;
7534             cache[1] = byte;
7535         } else {
7536             cache[2] = utf8;
7537             cache[3] = byte;
7538         }
7539     } else {
7540 /* float casts necessary? XXX */
7541 #define THREEWAY_SQUARE(a,b,c,d) \
7542             ((float)((d) - (c))) * ((float)((d) - (c))) \
7543             + ((float)((c) - (b))) * ((float)((c) - (b))) \
7544                + ((float)((b) - (a))) * ((float)((b) - (a)))
7545
7546         /* Cache has 2 slots in use, and we know three potential pairs.
7547            Keep the two that give the lowest RMS distance. Do the
7548            calculation in bytes simply because we always know the byte
7549            length.  squareroot has the same ordering as the positive value,
7550            so don't bother with the actual square root.  */
7551         if (byte > cache[1]) {
7552             /* New position is after the existing pair of pairs.  */
7553             const float keep_earlier
7554                 = THREEWAY_SQUARE(0, cache[3], byte, blen);
7555             const float keep_later
7556                 = THREEWAY_SQUARE(0, cache[1], byte, blen);
7557
7558             if (keep_later < keep_earlier) {
7559                 cache[2] = cache[0];
7560                 cache[3] = cache[1];
7561             }
7562             cache[0] = utf8;
7563             cache[1] = byte;
7564         }
7565         else {
7566             const float keep_later = THREEWAY_SQUARE(0, byte, cache[1], blen);
7567             float b, c, keep_earlier;
7568             if (byte > cache[3]) {
7569                 /* New position is between the existing pair of pairs.  */
7570                 b = (float)cache[3];
7571                 c = (float)byte;
7572             } else {
7573                 /* New position is before the existing pair of pairs.  */
7574                 b = (float)byte;
7575                 c = (float)cache[3];
7576             }
7577             keep_earlier = THREEWAY_SQUARE(0, b, c, blen);
7578             if (byte > cache[3]) {
7579                 if (keep_later < keep_earlier) {
7580                     cache[2] = utf8;
7581                     cache[3] = byte;
7582                 }
7583                 else {
7584                     cache[0] = utf8;
7585                     cache[1] = byte;
7586                 }
7587             }
7588             else {
7589                 if (! (keep_later < keep_earlier)) {
7590                     cache[0] = cache[2];
7591                     cache[1] = cache[3];
7592                 }
7593                 cache[2] = utf8;
7594                 cache[3] = byte;
7595             }
7596         }
7597     }
7598     ASSERT_UTF8_CACHE(cache);
7599 }
7600
7601 /* We already know all of the way, now we may be able to walk back.  The same
7602    assumption is made as in S_sv_pos_u2b_midway(), namely that walking
7603    backward is half the speed of walking forward. */
7604 static STRLEN
7605 S_sv_pos_b2u_midway(pTHX_ const U8 *const s, const U8 *const target,
7606                     const U8 *end, STRLEN endu)
7607 {
7608     const STRLEN forw = target - s;
7609     STRLEN backw = end - target;
7610
7611     PERL_ARGS_ASSERT_SV_POS_B2U_MIDWAY;
7612
7613     if (forw < 2 * backw) {
7614         return utf8_length(s, target);
7615     }
7616
7617     while (end > target) {
7618         end--;
7619         while (UTF8_IS_CONTINUATION(*end)) {
7620             end--;
7621         }
7622         endu--;
7623     }
7624     return endu;
7625 }
7626
7627 /*
7628 =for apidoc sv_pos_b2u_flags
7629
7630 Converts the offset from a count of bytes from the start of the string, to
7631 a count of the equivalent number of UTF-8 chars.  Handles type coercion.
7632 I<flags> is passed to C<SvPV_flags>, and usually should be
7633 C<SV_GMAGIC|SV_CONST_RETURN> to handle magic.
7634
7635 =cut
7636 */
7637
7638 /*
7639  * sv_pos_b2u_flags() uses, like sv_pos_u2b_flags(), the mg_ptr of the
7640  * potential PERL_MAGIC_utf8 of the sv to store the mapping between UTF-8
7641  * and byte offsets.
7642  *
7643  */
7644 STRLEN
7645 Perl_sv_pos_b2u_flags(pTHX_ SV *const sv, STRLEN const offset, U32 flags)
7646 {
7647     const U8* s;
7648     STRLEN len = 0; /* Actually always set, but let's keep gcc happy.  */
7649     STRLEN blen;
7650     MAGIC* mg = NULL;
7651     const U8* send;
7652     bool found = FALSE;
7653
7654     PERL_ARGS_ASSERT_SV_POS_B2U_FLAGS;
7655
7656     s = (const U8*)SvPV_flags(sv, blen, flags);
7657
7658     if (blen < offset)
7659         Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset, blen=%"UVuf
7660                    ", byte=%"UVuf, (UV)blen, (UV)offset);
7661
7662     send = s + offset;
7663
7664     if (!SvREADONLY(sv)
7665         && PL_utf8cache
7666         && SvTYPE(sv) >= SVt_PVMG
7667         && (mg = mg_find(sv, PERL_MAGIC_utf8)))
7668     {
7669         if (mg->mg_ptr) {
7670             STRLEN * const cache = (STRLEN *) mg->mg_ptr;
7671             if (cache[1] == offset) {
7672                 /* An exact match. */
7673                 return cache[0];
7674             }
7675             if (cache[3] == offset) {
7676                 /* An exact match. */
7677                 return cache[2];
7678             }
7679
7680             if (cache[1] < offset) {
7681                 /* We already know part of the way. */
7682                 if (mg->mg_len != -1) {
7683                     /* Actually, we know the end too.  */
7684                     len = cache[0]
7685                         + S_sv_pos_b2u_midway(aTHX_ s + cache[1], send,
7686                                               s + blen, mg->mg_len - cache[0]);
7687                 } else {
7688                     len = cache[0] + utf8_length(s + cache[1], send);
7689                 }
7690             }
7691             else if (cache[3] < offset) {
7692                 /* We're between the two cached pairs, so we do the calculation
7693                    offset by the byte/utf-8 positions for the earlier pair,
7694                    then add the utf-8 characters from the string start to
7695                    there.  */
7696                 len = S_sv_pos_b2u_midway(aTHX_ s + cache[3], send,
7697                                           s + cache[1], cache[0] - cache[2])
7698                     + cache[2];
7699
7700             }
7701             else { /* cache[3] > offset */
7702                 len = S_sv_pos_b2u_midway(aTHX_ s, send, s + cache[3],
7703                                           cache[2]);
7704
7705             }
7706             ASSERT_UTF8_CACHE(cache);
7707             found = TRUE;
7708         } else if (mg->mg_len != -1) {
7709             len = S_sv_pos_b2u_midway(aTHX_ s, send, s + blen, mg->mg_len);
7710             found = TRUE;
7711         }
7712     }
7713     if (!found || PL_utf8cache < 0) {
7714         const STRLEN real_len = utf8_length(s, send);
7715
7716         if (found && PL_utf8cache < 0)
7717             assert_uft8_cache_coherent("sv_pos_b2u", len, real_len, sv);
7718         len = real_len;
7719     }
7720
7721     if (PL_utf8cache) {
7722         if (blen == offset)
7723             utf8_mg_len_cache_update(sv, &mg, len);
7724         else
7725             utf8_mg_pos_cache_update(sv, &mg, offset, len, blen);
7726     }
7727
7728     return len;
7729 }
7730
7731 /*
7732 =for apidoc sv_pos_b2u
7733
7734 Converts the value pointed to by offsetp from a count of bytes from the
7735 start of the string, to a count of the equivalent number of UTF-8 chars.
7736 Handles magic and type coercion.
7737
7738 Use C<sv_pos_b2u_flags> in preference, which correctly handles strings
7739 longer than 2Gb.
7740
7741 =cut
7742 */
7743
7744 /*
7745  * sv_pos_b2u() uses, like sv_pos_u2b(), the mg_ptr of the potential
7746  * PERL_MAGIC_utf8 of the sv to store the mapping between UTF-8 and
7747  * byte offsets.
7748  *
7749  */
7750 void
7751 Perl_sv_pos_b2u(pTHX_ SV *const sv, I32 *const offsetp)
7752 {
7753     PERL_ARGS_ASSERT_SV_POS_B2U;
7754
7755     if (!sv)
7756         return;
7757
7758     *offsetp = (I32)sv_pos_b2u_flags(sv, (STRLEN)*offsetp,
7759                                      SV_GMAGIC|SV_CONST_RETURN);
7760 }
7761
7762 static void
7763 S_assert_uft8_cache_coherent(pTHX_ const char *const func, STRLEN from_cache,
7764                              STRLEN real, SV *const sv)
7765 {
7766     PERL_ARGS_ASSERT_ASSERT_UFT8_CACHE_COHERENT;
7767
7768     /* As this is debugging only code, save space by keeping this test here,
7769        rather than inlining it in all the callers.  */
7770     if (from_cache == real)
7771         return;
7772
7773     /* Need to turn the assertions off otherwise we may recurse infinitely
7774        while printing error messages.  */
7775     SAVEI8(PL_utf8cache);
7776     PL_utf8cache = 0;
7777     Perl_croak(aTHX_ "panic: %s cache %"UVuf" real %"UVuf" for %"SVf,
7778                func, (UV) from_cache, (UV) real, SVfARG(sv));
7779 }
7780
7781 /*
7782 =for apidoc sv_eq
7783
7784 Returns a boolean indicating whether the strings in the two SVs are
7785 identical.  Is UTF-8 and 'use bytes' aware, handles get magic, and will
7786 coerce its args to strings if necessary.
7787
7788 =for apidoc sv_eq_flags
7789
7790 Returns a boolean indicating whether the strings in the two SVs are
7791 identical.  Is UTF-8 and 'use bytes' aware and coerces its args to strings
7792 if necessary.  If the flags include SV_GMAGIC, it handles get-magic, too.
7793
7794 =cut
7795 */
7796
7797 I32
7798 Perl_sv_eq_flags(pTHX_ SV *sv1, SV *sv2, const U32 flags)
7799 {
7800     const char *pv1;
7801     STRLEN cur1;
7802     const char *pv2;
7803     STRLEN cur2;
7804     I32  eq     = 0;
7805     SV* svrecode = NULL;
7806
7807     if (!sv1) {
7808         pv1 = "";
7809         cur1 = 0;
7810     }
7811     else {
7812         /* if pv1 and pv2 are the same, second SvPV_const call may
7813          * invalidate pv1 (if we are handling magic), so we may need to
7814          * make a copy */
7815         if (sv1 == sv2 && flags & SV_GMAGIC
7816          && (SvTHINKFIRST(sv1) || SvGMAGICAL(sv1))) {
7817             pv1 = SvPV_const(sv1, cur1);
7818             sv1 = newSVpvn_flags(pv1, cur1, SVs_TEMP | SvUTF8(sv2));
7819         }
7820         pv1 = SvPV_flags_const(sv1, cur1, flags);
7821     }
7822
7823     if (!sv2){
7824         pv2 = "";
7825         cur2 = 0;
7826     }
7827     else
7828         pv2 = SvPV_flags_const(sv2, cur2, flags);
7829
7830     if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
7831         /* Differing utf8ness.
7832          * Do not UTF8size the comparands as a side-effect. */
7833          if (IN_ENCODING) {
7834               if (SvUTF8(sv1)) {
7835                    svrecode = newSVpvn(pv2, cur2);
7836                    sv_recode_to_utf8(svrecode, _get_encoding());
7837                    pv2 = SvPV_const(svrecode, cur2);
7838               }
7839               else {
7840                    svrecode = newSVpvn(pv1, cur1);
7841                    sv_recode_to_utf8(svrecode, _get_encoding());
7842                    pv1 = SvPV_const(svrecode, cur1);
7843               }
7844               /* Now both are in UTF-8. */
7845               if (cur1 != cur2) {
7846                    SvREFCNT_dec_NN(svrecode);
7847                    return FALSE;
7848               }
7849          }
7850          else {
7851               if (SvUTF8(sv1)) {
7852                   /* sv1 is the UTF-8 one  */
7853                   return bytes_cmp_utf8((const U8*)pv2, cur2,
7854                                         (const U8*)pv1, cur1) == 0;
7855               }
7856               else {
7857                   /* sv2 is the UTF-8 one  */
7858                   return bytes_cmp_utf8((const U8*)pv1, cur1,
7859                                         (const U8*)pv2, cur2) == 0;
7860               }
7861          }
7862     }
7863
7864     if (cur1 == cur2)
7865         eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
7866         
7867     SvREFCNT_dec(svrecode);
7868
7869     return eq;
7870 }
7871
7872 /*
7873 =for apidoc sv_cmp
7874
7875 Compares the strings in two SVs.  Returns -1, 0, or 1 indicating whether the
7876 string in C<sv1> is less than, equal to, or greater than the string in
7877 C<sv2>.  Is UTF-8 and 'use bytes' aware, handles get magic, and will
7878 coerce its args to strings if necessary.  See also C<sv_cmp_locale>.
7879
7880 =for apidoc sv_cmp_flags
7881
7882 Compares the strings in two SVs.  Returns -1, 0, or 1 indicating whether the
7883 string in C<sv1> is less than, equal to, or greater than the string in
7884 C<sv2>.  Is UTF-8 and 'use bytes' aware and will coerce its args to strings
7885 if necessary.  If the flags include SV_GMAGIC, it handles get magic.  See
7886 also C<sv_cmp_locale_flags>.
7887
7888 =cut
7889 */
7890
7891 I32
7892 Perl_sv_cmp(pTHX_ SV *const sv1, SV *const sv2)
7893 {
7894     return sv_cmp_flags(sv1, sv2, SV_GMAGIC);
7895 }
7896
7897 I32
7898 Perl_sv_cmp_flags(pTHX_ SV *const sv1, SV *const sv2,
7899                   const U32 flags)
7900 {
7901     STRLEN cur1, cur2;
7902     const char *pv1, *pv2;
7903     I32  cmp;
7904     SV *svrecode = NULL;
7905
7906     if (!sv1) {
7907         pv1 = "";
7908         cur1 = 0;
7909     }
7910     else
7911         pv1 = SvPV_flags_const(sv1, cur1, flags);
7912
7913     if (!sv2) {
7914         pv2 = "";
7915         cur2 = 0;
7916     }
7917     else
7918         pv2 = SvPV_flags_const(sv2, cur2, flags);
7919
7920     if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
7921         /* Differing utf8ness.
7922          * Do not UTF8size the comparands as a side-effect. */
7923         if (SvUTF8(sv1)) {
7924             if (IN_ENCODING) {
7925                  svrecode = newSVpvn(pv2, cur2);
7926                  sv_recode_to_utf8(svrecode, _get_encoding());
7927                  pv2 = SvPV_const(svrecode, cur2);
7928             }
7929             else {
7930                 const int retval = -bytes_cmp_utf8((const U8*)pv2, cur2,
7931                                                    (const U8*)pv1, cur1);
7932                 return retval ? retval < 0 ? -1 : +1 : 0;
7933             }
7934         }
7935         else {
7936             if (IN_ENCODING) {
7937                  svrecode = newSVpvn(pv1, cur1);
7938                  sv_recode_to_utf8(svrecode, _get_encoding());
7939                  pv1 = SvPV_const(svrecode, cur1);
7940             }
7941             else {
7942                 const int retval = bytes_cmp_utf8((const U8*)pv1, cur1,
7943                                                   (const U8*)pv2, cur2);
7944                 return retval ? retval < 0 ? -1 : +1 : 0;
7945             }
7946         }
7947     }
7948
7949     if (!cur1) {
7950         cmp = cur2 ? -1 : 0;
7951     } else if (!cur2) {
7952         cmp = 1;
7953     } else {
7954         const I32 retval = memcmp((const void*)pv1, (const void*)pv2, cur1 < cur2 ? cur1 : cur2);
7955
7956         if (retval) {
7957             cmp = retval < 0 ? -1 : 1;
7958         } else if (cur1 == cur2) {
7959             cmp = 0;
7960         } else {
7961             cmp = cur1 < cur2 ? -1 : 1;
7962         }
7963     }
7964
7965     SvREFCNT_dec(svrecode);
7966
7967     return cmp;
7968 }
7969
7970 /*
7971 =for apidoc sv_cmp_locale
7972
7973 Compares the strings in two SVs in a locale-aware manner.  Is UTF-8 and
7974 'use bytes' aware, handles get magic, and will coerce its args to strings
7975 if necessary.  See also C<sv_cmp>.
7976
7977 =for apidoc sv_cmp_locale_flags
7978
7979 Compares the strings in two SVs in a locale-aware manner.  Is UTF-8 and
7980 'use bytes' aware and will coerce its args to strings if necessary.  If the
7981 flags contain SV_GMAGIC, it handles get magic.  See also C<sv_cmp_flags>.
7982
7983 =cut
7984 */
7985
7986 I32
7987 Perl_sv_cmp_locale(pTHX_ SV *const sv1, SV *const sv2)
7988 {
7989     return sv_cmp_locale_flags(sv1, sv2, SV_GMAGIC);
7990 }
7991
7992 I32
7993 Perl_sv_cmp_locale_flags(pTHX_ SV *const sv1, SV *const sv2,
7994                          const U32 flags)
7995 {
7996 #ifdef USE_LOCALE_COLLATE
7997
7998     char *pv1, *pv2;
7999     STRLEN len1, len2;
8000     I32 retval;
8001
8002     if (PL_collation_standard)
8003         goto raw_compare;
8004
8005     len1 = 0;
8006     pv1 = sv1 ? sv_collxfrm_flags(sv1, &len1, flags) : (char *) NULL;
8007     len2 = 0;
8008     pv2 = sv2 ? sv_collxfrm_flags(sv2, &len2, flags) : (char *) NULL;
8009
8010     if (!pv1 || !len1) {
8011         if (pv2 && len2)
8012             return -1;
8013         else
8014             goto raw_compare;
8015     }
8016     else {
8017         if (!pv2 || !len2)
8018             return 1;
8019     }
8020
8021     retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
8022
8023     if (retval)
8024         return retval < 0 ? -1 : 1;
8025
8026     /*
8027      * When the result of collation is equality, that doesn't mean
8028      * that there are no differences -- some locales exclude some
8029      * characters from consideration.  So to avoid false equalities,
8030      * we use the raw string as a tiebreaker.
8031      */
8032
8033   raw_compare:
8034     /* FALLTHROUGH */
8035
8036 #else
8037     PERL_UNUSED_ARG(flags);
8038 #endif /* USE_LOCALE_COLLATE */
8039
8040     return sv_cmp(sv1, sv2);
8041 }
8042
8043
8044 #ifdef USE_LOCALE_COLLATE
8045
8046 /*
8047 =for apidoc sv_collxfrm
8048
8049 This calls C<sv_collxfrm_flags> with the SV_GMAGIC flag.  See
8050 C<sv_collxfrm_flags>.
8051
8052 =for apidoc sv_collxfrm_flags
8053
8054 Add Collate Transform magic to an SV if it doesn't already have it.  If the
8055 flags contain SV_GMAGIC, it handles get-magic.
8056
8057 Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
8058 scalar data of the variable, but transformed to such a format that a normal
8059 memory comparison can be used to compare the data according to the locale
8060 settings.
8061
8062 =cut
8063 */
8064
8065 char *
8066 Perl_sv_collxfrm_flags(pTHX_ SV *const sv, STRLEN *const nxp, const I32 flags)
8067 {
8068     MAGIC *mg;
8069
8070     PERL_ARGS_ASSERT_SV_COLLXFRM_FLAGS;
8071
8072     mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
8073     if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
8074         const char *s;
8075         char *xf;
8076         STRLEN len, xlen;
8077
8078         if (mg)
8079             Safefree(mg->mg_ptr);
8080         s = SvPV_flags_const(sv, len, flags);
8081         if ((xf = mem_collxfrm(s, len, &xlen))) {
8082             if (! mg) {
8083 #ifdef PERL_OLD_COPY_ON_WRITE
8084                 if (SvIsCOW(sv))
8085                     sv_force_normal_flags(sv, 0);
8086 #endif
8087                 mg = sv_magicext(sv, 0, PERL_MAGIC_collxfrm, &PL_vtbl_collxfrm,
8088                                  0, 0);
8089                 assert(mg);
8090             }
8091             mg->mg_ptr = xf;
8092             mg->mg_len = xlen;
8093         }
8094         else {
8095             if (mg) {
8096                 mg->mg_ptr = NULL;
8097                 mg->mg_len = -1;
8098             }
8099         }
8100     }
8101     if (mg && mg->mg_ptr) {
8102         *nxp = mg->mg_len;
8103         return mg->mg_ptr + sizeof(PL_collation_ix);
8104     }
8105     else {
8106         *nxp = 0;
8107         return NULL;
8108     }
8109 }
8110
8111 #endif /* USE_LOCALE_COLLATE */
8112
8113 static char *
8114 S_sv_gets_append_to_utf8(pTHX_ SV *const sv, PerlIO *const fp, I32 append)
8115 {
8116     SV * const tsv = newSV(0);
8117     ENTER;
8118     SAVEFREESV(tsv);
8119     sv_gets(tsv, fp, 0);
8120     sv_utf8_upgrade_nomg(tsv);
8121     SvCUR_set(sv,append);
8122     sv_catsv(sv,tsv);
8123     LEAVE;
8124     return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
8125 }
8126
8127 static char *
8128 S_sv_gets_read_record(pTHX_ SV *const sv, PerlIO *const fp, I32 append)
8129 {
8130     SSize_t bytesread;
8131     const STRLEN recsize = SvUV(SvRV(PL_rs)); /* RsRECORD() guarantees > 0. */
8132       /* Grab the size of the record we're getting */
8133     char *buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append;
8134     
8135     /* Go yank in */
8136 #ifdef __VMS
8137     int fd;
8138     Stat_t st;
8139
8140     /* With a true, record-oriented file on VMS, we need to use read directly
8141      * to ensure that we respect RMS record boundaries.  The user is responsible
8142      * for providing a PL_rs value that corresponds to the FAB$W_MRS (maximum
8143      * record size) field.  N.B. This is likely to produce invalid results on
8144      * varying-width character data when a record ends mid-character.
8145      */
8146     fd = PerlIO_fileno(fp);
8147     if (fd != -1
8148         && PerlLIO_fstat(fd, &st) == 0
8149         && (st.st_fab_rfm == FAB$C_VAR
8150             || st.st_fab_rfm == FAB$C_VFC
8151             || st.st_fab_rfm == FAB$C_FIX)) {
8152
8153         bytesread = PerlLIO_read(fd, buffer, recsize);
8154     }
8155     else /* in-memory file from PerlIO::Scalar
8156           * or not a record-oriented file
8157           */
8158 #endif
8159     {
8160         bytesread = PerlIO_read(fp, buffer, recsize);
8161
8162         /* At this point, the logic in sv_get() means that sv will
8163            be treated as utf-8 if the handle is utf8.
8164         */
8165         if (PerlIO_isutf8(fp) && bytesread > 0) {
8166             char *bend = buffer + bytesread;
8167             char *bufp = buffer;
8168             size_t charcount = 0;
8169             bool charstart = TRUE;
8170             STRLEN skip = 0;
8171
8172             while (charcount < recsize) {
8173                 /* count accumulated characters */
8174                 while (bufp < bend) {
8175                     if (charstart) {
8176                         skip = UTF8SKIP(bufp);
8177                     }
8178                     if (bufp + skip > bend) {
8179                         /* partial at the end */
8180                         charstart = FALSE;
8181                         break;
8182                     }
8183                     else {
8184                         ++charcount;
8185                         bufp += skip;
8186                         charstart = TRUE;
8187                     }
8188                 }
8189
8190                 if (charcount < recsize) {
8191                     STRLEN readsize;
8192                     STRLEN bufp_offset = bufp - buffer;
8193                     SSize_t morebytesread;
8194
8195                     /* originally I read enough to fill any incomplete
8196                        character and the first byte of the next
8197                        character if needed, but if there's many
8198                        multi-byte encoded characters we're going to be
8199                        making a read call for every character beyond
8200                        the original read size.
8201
8202                        So instead, read the rest of the character if
8203                        any, and enough bytes to match at least the
8204                        start bytes for each character we're going to
8205                        read.
8206                     */
8207                     if (charstart)
8208                         readsize = recsize - charcount;
8209                     else 
8210                         readsize = skip - (bend - bufp) + recsize - charcount - 1;
8211                     buffer = SvGROW(sv, append + bytesread + readsize + 1) + append;
8212                     bend = buffer + bytesread;
8213                     morebytesread = PerlIO_read(fp, bend, readsize);
8214                     if (morebytesread <= 0) {
8215                         /* we're done, if we still have incomplete
8216                            characters the check code in sv_gets() will
8217                            warn about them.
8218
8219                            I'd originally considered doing
8220                            PerlIO_ungetc() on all but the lead
8221                            character of the incomplete character, but
8222                            read() doesn't do that, so I don't.
8223                         */
8224                         break;
8225                     }
8226
8227                     /* prepare to scan some more */
8228                     bytesread += morebytesread;
8229                     bend = buffer + bytesread;
8230                     bufp = buffer + bufp_offset;
8231                 }
8232             }
8233         }
8234     }
8235
8236     if (bytesread < 0)
8237         bytesread = 0;
8238     SvCUR_set(sv, bytesread + append);
8239     buffer[bytesread] = '\0';
8240     return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
8241 }
8242
8243 /*
8244 =for apidoc sv_gets
8245
8246 Get a line from the filehandle and store it into the SV, optionally
8247 appending to the currently-stored string.  If C<append> is not 0, the
8248 line is appended to the SV instead of overwriting it.  C<append> should
8249 be set to the byte offset that the appended string should start at
8250 in the SV (typically, C<SvCUR(sv)> is a suitable choice).
8251
8252 =cut
8253 */
8254
8255 char *
8256 Perl_sv_gets(pTHX_ SV *const sv, PerlIO *const fp, I32 append)
8257 {
8258     const char *rsptr;
8259     STRLEN rslen;
8260     STDCHAR rslast;
8261     STDCHAR *bp;
8262     SSize_t cnt;
8263     int i = 0;
8264     int rspara = 0;
8265
8266     PERL_ARGS_ASSERT_SV_GETS;
8267
8268     if (SvTHINKFIRST(sv))
8269         sv_force_normal_flags(sv, append ? 0 : SV_COW_DROP_PV);
8270     /* XXX. If you make this PVIV, then copy on write can copy scalars read
8271        from <>.
8272        However, perlbench says it's slower, because the existing swipe code
8273        is faster than copy on write.
8274        Swings and roundabouts.  */
8275     SvUPGRADE(sv, SVt_PV);
8276
8277     if (append) {
8278         /* line is going to be appended to the existing buffer in the sv */
8279         if (PerlIO_isutf8(fp)) {
8280             if (!SvUTF8(sv)) {
8281                 sv_utf8_upgrade_nomg(sv);
8282                 sv_pos_u2b(sv,&append,0);
8283             }
8284         } else if (SvUTF8(sv)) {
8285             return S_sv_gets_append_to_utf8(aTHX_ sv, fp, append);
8286         }
8287     }
8288
8289     SvPOK_only(sv);
8290     if (!append) {
8291         /* not appending - "clear" the string by setting SvCUR to 0,
8292          * the pv is still avaiable. */
8293         SvCUR_set(sv,0);
8294     }
8295     if (PerlIO_isutf8(fp))
8296         SvUTF8_on(sv);
8297
8298     if (IN_PERL_COMPILETIME) {
8299         /* we always read code in line mode */
8300         rsptr = "\n";
8301         rslen = 1;
8302     }
8303     else if (RsSNARF(PL_rs)) {
8304         /* If it is a regular disk file use size from stat() as estimate
8305            of amount we are going to read -- may result in mallocing
8306            more memory than we really need if the layers below reduce
8307            the size we read (e.g. CRLF or a gzip layer).
8308          */
8309         Stat_t st;
8310         if (!PerlLIO_fstat(PerlIO_fileno(fp), &st) && S_ISREG(st.st_mode))  {
8311             const Off_t offset = PerlIO_tell(fp);
8312             if (offset != (Off_t) -1 && st.st_size + append > offset) {
8313 #ifdef PERL_NEW_COPY_ON_WRITE
8314                 /* Add an extra byte for the sake of copy-on-write's
8315                  * buffer reference count. */
8316                 (void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 2));
8317 #else
8318                 (void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 1));
8319 #endif
8320             }
8321         }
8322         rsptr = NULL;
8323         rslen = 0;
8324     }
8325     else if (RsRECORD(PL_rs)) {
8326         return S_sv_gets_read_record(aTHX_ sv, fp, append);
8327     }
8328     else if (RsPARA(PL_rs)) {
8329         rsptr = "\n\n";
8330         rslen = 2;
8331         rspara = 1;
8332     }
8333     else {
8334         /* Get $/ i.e. PL_rs into same encoding as stream wants */
8335         if (PerlIO_isutf8(fp)) {
8336             rsptr = SvPVutf8(PL_rs, rslen);
8337         }
8338         else {
8339             if (SvUTF8(PL_rs)) {
8340                 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
8341                     Perl_croak(aTHX_ "Wide character in $/");
8342                 }
8343             }
8344             /* extract the raw pointer to the record separator */
8345             rsptr = SvPV_const(PL_rs, rslen);
8346         }
8347     }
8348
8349     /* rslast is the last character in the record separator
8350      * note we don't use rslast except when rslen is true, so the
8351      * null assign is a placeholder. */
8352     rslast = rslen ? rsptr[rslen - 1] : '\0';
8353
8354     if (rspara) {               /* have to do this both before and after */
8355         do {                    /* to make sure file boundaries work right */
8356             if (PerlIO_eof(fp))
8357                 return 0;
8358             i = PerlIO_getc(fp);
8359             if (i != '\n') {
8360                 if (i == -1)
8361                     return 0;
8362                 PerlIO_ungetc(fp,i);
8363                 break;
8364             }
8365         } while (i != EOF);
8366     }
8367
8368     /* See if we know enough about I/O mechanism to cheat it ! */
8369
8370     /* This used to be #ifdef test - it is made run-time test for ease
8371        of abstracting out stdio interface. One call should be cheap
8372        enough here - and may even be a macro allowing compile
8373        time optimization.
8374      */
8375
8376     if (PerlIO_fast_gets(fp)) {
8377     /*
8378      * We can do buffer based IO operations on this filehandle.
8379      *
8380      * This means we can bypass a lot of subcalls and process
8381      * the buffer directly, it also means we know the upper bound
8382      * on the amount of data we might read of the current buffer
8383      * into our sv. Knowing this allows us to preallocate the pv
8384      * to be able to hold that maximum, which allows us to simplify
8385      * a lot of logic. */
8386
8387     /*
8388      * We're going to steal some values from the stdio struct
8389      * and put EVERYTHING in the innermost loop into registers.
8390      */
8391     STDCHAR *ptr;       /* pointer into fp's read-ahead buffer */
8392     STRLEN bpx;         /* length of the data in the target sv
8393                            used to fix pointers after a SvGROW */
8394     I32 shortbuffered;  /* If the pv buffer is shorter than the amount
8395                            of data left in the read-ahead buffer.
8396                            If 0 then the pv buffer can hold the full
8397                            amount left, otherwise this is the amount it
8398                            can hold. */
8399
8400 #if defined(__VMS) && defined(PERLIO_IS_STDIO)
8401     /* An ungetc()d char is handled separately from the regular
8402      * buffer, so we getc() it back out and stuff it in the buffer.
8403      */
8404     i = PerlIO_getc(fp);
8405     if (i == EOF) return 0;
8406     *(--((*fp)->_ptr)) = (unsigned char) i;
8407     (*fp)->_cnt++;
8408 #endif
8409
8410     /* Here is some breathtakingly efficient cheating */
8411
8412     /* When you read the following logic resist the urge to think
8413      * of record separators that are 1 byte long. They are an
8414      * uninteresting special (simple) case.
8415      *
8416      * Instead think of record separators which are at least 2 bytes
8417      * long, and keep in mind that we need to deal with such
8418      * separators when they cross a read-ahead buffer boundary.
8419      *
8420      * Also consider that we need to gracefully deal with separators
8421      * that may be longer than a single read ahead buffer.
8422      *
8423      * Lastly do not forget we want to copy the delimiter as well. We
8424      * are copying all data in the file _up_to_and_including_ the separator
8425      * itself.
8426      *
8427      * Now that you have all that in mind here is what is happening below:
8428      *
8429      * 1. When we first enter the loop we do some memory book keeping to see
8430      * how much free space there is in the target SV. (This sub assumes that
8431      * it is operating on the same SV most of the time via $_ and that it is
8432      * going to be able to reuse the same pv buffer each call.) If there is
8433      * "enough" room then we set "shortbuffered" to how much space there is
8434      * and start reading forward.
8435      *
8436      * 2. When we scan forward we copy from the read-ahead buffer to the target
8437      * SV's pv buffer. While we go we watch for the end of the read-ahead buffer,
8438      * and the end of the of pv, as well as for the "rslast", which is the last
8439      * char of the separator.
8440      *
8441      * 3. When scanning forward if we see rslast then we jump backwards in *pv*
8442      * (which has a "complete" record up to the point we saw rslast) and check
8443      * it to see if it matches the separator. If it does we are done. If it doesn't
8444      * we continue on with the scan/copy.
8445      *
8446      * 4. If we run out of read-ahead buffer (cnt goes to 0) then we have to get
8447      * the IO system to read the next buffer. We do this by doing a getc(), which
8448      * returns a single char read (or EOF), and prefills the buffer, and also
8449      * allows us to find out how full the buffer is.  We use this information to
8450      * SvGROW() the sv to the size remaining in the buffer, after which we copy
8451      * the returned single char into the target sv, and then go back into scan
8452      * forward mode.
8453      *
8454      * 5. If we run out of write-buffer then we SvGROW() it by the size of the
8455      * remaining space in the read-buffer.
8456      *
8457      * Note that this code despite its twisty-turny nature is pretty darn slick.
8458      * It manages single byte separators, multi-byte cross boundary separators,
8459      * and cross-read-buffer separators cleanly and efficiently at the cost
8460      * of potentially greatly overallocating the target SV.
8461      *
8462      * Yves
8463      */
8464
8465
8466     /* get the number of bytes remaining in the read-ahead buffer
8467      * on first call on a given fp this will return 0.*/
8468     cnt = PerlIO_get_cnt(fp);
8469
8470     /* make sure we have the room */
8471     if ((I32)(SvLEN(sv) - append) <= cnt + 1) {
8472         /* Not room for all of it
8473            if we are looking for a separator and room for some
8474          */
8475         if (rslen && cnt > 80 && (I32)SvLEN(sv) > append) {
8476             /* just process what we have room for */
8477             shortbuffered = cnt - SvLEN(sv) + append + 1;
8478             cnt -= shortbuffered;
8479         }
8480         else {
8481             /* ensure that the target sv has enough room to hold
8482              * the rest of the read-ahead buffer */
8483             shortbuffered = 0;
8484             /* remember that cnt can be negative */
8485             SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
8486         }
8487     }
8488     else {
8489         /* we have enough room to hold the full buffer, lets scream */
8490         shortbuffered = 0;
8491     }
8492
8493     /* extract the pointer to sv's string buffer, offset by append as necessary */
8494     bp = (STDCHAR*)SvPVX_const(sv) + append;  /* move these two too to registers */
8495     /* extract the point to the read-ahead buffer */
8496     ptr = (STDCHAR*)PerlIO_get_ptr(fp);
8497
8498     /* some trace debug output */
8499     DEBUG_P(PerlIO_printf(Perl_debug_log,
8500         "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
8501     DEBUG_P(PerlIO_printf(Perl_debug_log,
8502         "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%"IVdf", base=%"
8503          UVuf"\n",
8504                PTR2UV(PerlIO_get_ptr(fp)), (IV)PerlIO_get_cnt(fp),
8505                PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
8506
8507     for (;;) {
8508       screamer:
8509         /* if there is stuff left in the read-ahead buffer */
8510         if (cnt > 0) {
8511             /* if there is a separator */
8512             if (rslen) {
8513                 /* loop until we hit the end of the read-ahead buffer */
8514                 while (cnt > 0) {                    /* this     |  eat */
8515                     /* scan forward copying and searching for rslast as we go */
8516                     cnt--;
8517                     if ((*bp++ = *ptr++) == rslast)  /* really   |  dust */
8518                         goto thats_all_folks;        /* screams  |  sed :-) */
8519                 }
8520             }
8521             else {
8522                 /* no separator, slurp the full buffer */
8523                 Copy(ptr, bp, cnt, char);            /* this     |  eat */
8524                 bp += cnt;                           /* screams  |  dust */
8525                 ptr += cnt;                          /* louder   |  sed :-) */
8526                 cnt = 0;
8527                 assert (!shortbuffered);
8528                 goto cannot_be_shortbuffered;
8529             }
8530         }
8531         
8532         if (shortbuffered) {            /* oh well, must extend */
8533             /* we didnt have enough room to fit the line into the target buffer
8534              * so we must extend the target buffer and keep going */
8535             cnt = shortbuffered;
8536             shortbuffered = 0;
8537             bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
8538             SvCUR_set(sv, bpx);
8539             /* extned the target sv's buffer so it can hold the full read-ahead buffer */
8540             SvGROW(sv, SvLEN(sv) + append + cnt + 2);
8541             bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
8542             continue;
8543         }
8544
8545     cannot_be_shortbuffered:
8546         /* we need to refill the read-ahead buffer if possible */
8547
8548         DEBUG_P(PerlIO_printf(Perl_debug_log,
8549                              "Screamer: going to getc, ptr=%"UVuf", cnt=%"IVdf"\n",
8550                               PTR2UV(ptr),(IV)cnt));
8551         PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
8552
8553         DEBUG_Pv(PerlIO_printf(Perl_debug_log,
8554            "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%"IVdf", base=%"UVuf"\n",
8555             PTR2UV(PerlIO_get_ptr(fp)), (IV)PerlIO_get_cnt(fp),
8556             PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
8557
8558         /*
8559             call PerlIO_getc() to let it prefill the lookahead buffer
8560
8561             This used to call 'filbuf' in stdio form, but as that behaves like
8562             getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
8563             another abstraction.
8564
8565             Note we have to deal with the char in 'i' if we are not at EOF
8566         */
8567         i   = PerlIO_getc(fp);          /* get more characters */
8568
8569         DEBUG_Pv(PerlIO_printf(Perl_debug_log,
8570            "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%"IVdf", base=%"UVuf"\n",
8571             PTR2UV(PerlIO_get_ptr(fp)), (IV)PerlIO_get_cnt(fp),
8572             PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
8573
8574         /* find out how much is left in the read-ahead buffer, and rextract its pointer */
8575         cnt = PerlIO_get_cnt(fp);
8576         ptr = (STDCHAR*)PerlIO_get_ptr(fp);     /* reregisterize cnt and ptr */
8577         DEBUG_P(PerlIO_printf(Perl_debug_log,
8578             "Screamer: after getc, ptr=%"UVuf", cnt=%"IVdf"\n",
8579             PTR2UV(ptr),(IV)cnt));
8580
8581         if (i == EOF)                   /* all done for ever? */
8582             goto thats_really_all_folks;
8583
8584         /* make sure we have enough space in the target sv */
8585         bpx = bp - (STDCHAR*)SvPVX_const(sv);   /* box up before relocation */
8586         SvCUR_set(sv, bpx);
8587         SvGROW(sv, bpx + cnt + 2);
8588         bp = (STDCHAR*)SvPVX_const(sv) + bpx;   /* unbox after relocation */
8589
8590         /* copy of the char we got from getc() */
8591         *bp++ = (STDCHAR)i;             /* store character from PerlIO_getc */
8592
8593         /* make sure we deal with the i being the last character of a separator */
8594         if (rslen && (STDCHAR)i == rslast)  /* all done for now? */
8595             goto thats_all_folks;
8596     }
8597
8598   thats_all_folks:
8599     /* check if we have actually found the separator - only really applies
8600      * when rslen > 1 */
8601     if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX_const(sv)) < rslen) ||
8602           memNE((char*)bp - rslen, rsptr, rslen))
8603         goto screamer;                          /* go back to the fray */
8604   thats_really_all_folks:
8605     if (shortbuffered)
8606         cnt += shortbuffered;
8607         DEBUG_P(PerlIO_printf(Perl_debug_log,
8608              "Screamer: quitting, ptr=%"UVuf", cnt=%"IVdf"\n",PTR2UV(ptr),(IV)cnt));
8609     PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt);  /* put these back or we're in trouble */
8610     DEBUG_P(PerlIO_printf(Perl_debug_log,
8611         "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%"IVdf", base=%"UVuf
8612         "\n",
8613         PTR2UV(PerlIO_get_ptr(fp)), (IV)PerlIO_get_cnt(fp),
8614         PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
8615     *bp = '\0';
8616     SvCUR_set(sv, bp - (STDCHAR*)SvPVX_const(sv));      /* set length */
8617     DEBUG_P(PerlIO_printf(Perl_debug_log,
8618         "Screamer: done, len=%ld, string=|%.*s|\n",
8619         (long)SvCUR(sv),(int)SvCUR(sv),SvPVX_const(sv)));
8620     }
8621    else
8622     {
8623        /*The big, slow, and stupid way. */
8624 #ifdef USE_HEAP_INSTEAD_OF_STACK        /* Even slower way. */
8625         STDCHAR *buf = NULL;
8626         Newx(buf, 8192, STDCHAR);
8627         assert(buf);
8628 #else
8629         STDCHAR buf[8192];
8630 #endif
8631
8632       screamer2:
8633         if (rslen) {
8634             const STDCHAR * const bpe = buf + sizeof(buf);
8635             bp = buf;
8636             while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
8637                 ; /* keep reading */
8638             cnt = bp - buf;
8639         }
8640         else {
8641             cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
8642             /* Accommodate broken VAXC compiler, which applies U8 cast to
8643              * both args of ?: operator, causing EOF to change into 255
8644              */
8645             if (cnt > 0)
8646                  i = (U8)buf[cnt - 1];
8647             else
8648                  i = EOF;
8649         }
8650
8651         if (cnt < 0)
8652             cnt = 0;  /* we do need to re-set the sv even when cnt <= 0 */
8653         if (append)
8654             sv_catpvn_nomg(sv, (char *) buf, cnt);
8655         else
8656             sv_setpvn(sv, (char *) buf, cnt);   /* "nomg" is implied */
8657
8658         if (i != EOF &&                 /* joy */
8659             (!rslen ||
8660              SvCUR(sv) < rslen ||
8661              memNE(SvPVX_const(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
8662         {
8663             append = -1;
8664             /*
8665              * If we're reading from a TTY and we get a short read,
8666              * indicating that the user hit his EOF character, we need
8667              * to notice it now, because if we try to read from the TTY
8668              * again, the EOF condition will disappear.
8669              *
8670              * The comparison of cnt to sizeof(buf) is an optimization
8671              * that prevents unnecessary calls to feof().
8672              *
8673              * - jik 9/25/96
8674              */
8675             if (!(cnt < (I32)sizeof(buf) && PerlIO_eof(fp)))
8676                 goto screamer2;
8677         }
8678
8679 #ifdef USE_HEAP_INSTEAD_OF_STACK
8680         Safefree(buf);
8681 #endif
8682     }
8683
8684     if (rspara) {               /* have to do this both before and after */
8685         while (i != EOF) {      /* to make sure file boundaries work right */
8686             i = PerlIO_getc(fp);
8687             if (i != '\n') {
8688                 PerlIO_ungetc(fp,i);
8689                 break;
8690             }
8691         }
8692     }
8693
8694     return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
8695 }
8696
8697 /*
8698 =for apidoc sv_inc
8699
8700 Auto-increment of the value in the SV, doing string to numeric conversion
8701 if necessary.  Handles 'get' magic and operator overloading.
8702
8703 =cut
8704 */
8705
8706 void
8707 Perl_sv_inc(pTHX_ SV *const sv)
8708 {
8709     if (!sv)
8710         return;
8711     SvGETMAGIC(sv);
8712     sv_inc_nomg(sv);
8713 }
8714
8715 /*
8716 =for apidoc sv_inc_nomg
8717
8718 Auto-increment of the value in the SV, doing string to numeric conversion
8719 if necessary.  Handles operator overloading.  Skips handling 'get' magic.
8720
8721 =cut
8722 */
8723
8724 void
8725 Perl_sv_inc_nomg(pTHX_ SV *const sv)
8726 {
8727     char *d;
8728     int flags;
8729
8730     if (!sv)
8731         return;
8732     if (SvTHINKFIRST(sv)) {
8733         if (SvREADONLY(sv)) {
8734                 Perl_croak_no_modify();
8735         }
8736         if (SvROK(sv)) {
8737             IV i;
8738             if (SvAMAGIC(sv) && AMG_CALLunary(sv, inc_amg))
8739                 return;
8740             i = PTR2IV(SvRV(sv));
8741             sv_unref(sv);
8742             sv_setiv(sv, i);
8743         }
8744         else sv_force_normal_flags(sv, 0);
8745     }
8746     flags = SvFLAGS(sv);
8747     if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
8748         /* It's (privately or publicly) a float, but not tested as an
8749            integer, so test it to see. */
8750         (void) SvIV(sv);
8751         flags = SvFLAGS(sv);
8752     }
8753     if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
8754         /* It's publicly an integer, or privately an integer-not-float */
8755 #ifdef PERL_PRESERVE_IVUV
8756       oops_its_int:
8757 #endif
8758         if (SvIsUV(sv)) {
8759             if (SvUVX(sv) == UV_MAX)
8760                 sv_setnv(sv, UV_MAX_P1);
8761             else
8762                 (void)SvIOK_only_UV(sv);
8763                 SvUV_set(sv, SvUVX(sv) + 1);
8764         } else {
8765             if (SvIVX(sv) == IV_MAX)
8766                 sv_setuv(sv, (UV)IV_MAX + 1);
8767             else {
8768                 (void)SvIOK_only(sv);
8769                 SvIV_set(sv, SvIVX(sv) + 1);
8770             }   
8771         }
8772         return;
8773     }
8774     if (flags & SVp_NOK) {
8775         const NV was = SvNVX(sv);
8776         if (LIKELY(!Perl_isinfnan(was)) &&
8777             NV_OVERFLOWS_INTEGERS_AT &&
8778             was >= NV_OVERFLOWS_INTEGERS_AT) {
8779             /* diag_listed_as: Lost precision when %s %f by 1 */
8780             Perl_ck_warner(aTHX_ packWARN(WARN_IMPRECISION),
8781                            "Lost precision when incrementing %" NVff " by 1",
8782                            was);
8783         }
8784         (void)SvNOK_only(sv);
8785         SvNV_set(sv, was + 1.0);
8786         return;
8787     }
8788
8789     if (!(flags & SVp_POK) || !*SvPVX_const(sv)) {
8790         if ((flags & SVTYPEMASK) < SVt_PVIV)
8791             sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV ? SVt_PVIV : SVt_IV));
8792         (void)SvIOK_only(sv);
8793         SvIV_set(sv, 1);
8794         return;
8795     }
8796     d = SvPVX(sv);
8797     while (isALPHA(*d)) d++;
8798     while (isDIGIT(*d)) d++;
8799     if (d < SvEND(sv)) {
8800         const int numtype = grok_number_flags(SvPVX_const(sv), SvCUR(sv), NULL, PERL_SCAN_TRAILING);
8801 #ifdef PERL_PRESERVE_IVUV
8802         /* Got to punt this as an integer if needs be, but we don't issue
8803            warnings. Probably ought to make the sv_iv_please() that does
8804            the conversion if possible, and silently.  */
8805         if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
8806             /* Need to try really hard to see if it's an integer.
8807                9.22337203685478e+18 is an integer.
8808                but "9.22337203685478e+18" + 0 is UV=9223372036854779904
8809                so $a="9.22337203685478e+18"; $a+0; $a++
8810                needs to be the same as $a="9.22337203685478e+18"; $a++
8811                or we go insane. */
8812         
8813             (void) sv_2iv(sv);
8814             if (SvIOK(sv))
8815                 goto oops_its_int;
8816
8817             /* sv_2iv *should* have made this an NV */
8818             if (flags & SVp_NOK) {
8819                 (void)SvNOK_only(sv);
8820                 SvNV_set(sv, SvNVX(sv) + 1.0);
8821                 return;
8822             }
8823             /* I don't think we can get here. Maybe I should assert this
8824                And if we do get here I suspect that sv_setnv will croak. NWC
8825                Fall through. */
8826             DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_inc punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"NVgf"\n",
8827                                   SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
8828         }
8829 #endif /* PERL_PRESERVE_IVUV */
8830         if (!numtype && ckWARN(WARN_NUMERIC))
8831             not_incrementable(sv);
8832         sv_setnv(sv,Atof(SvPVX_const(sv)) + 1.0);
8833         return;
8834     }
8835     d--;
8836     while (d >= SvPVX_const(sv)) {
8837         if (isDIGIT(*d)) {
8838             if (++*d <= '9')
8839                 return;
8840             *(d--) = '0';
8841         }
8842         else {
8843 #ifdef EBCDIC
8844             /* MKS: The original code here died if letters weren't consecutive.
8845              * at least it didn't have to worry about non-C locales.  The
8846              * new code assumes that ('z'-'a')==('Z'-'A'), letters are
8847              * arranged in order (although not consecutively) and that only
8848              * [A-Za-z] are accepted by isALPHA in the C locale.
8849              */
8850             if (isALPHA_FOLD_NE(*d, 'z')) {
8851                 do { ++*d; } while (!isALPHA(*d));
8852                 return;
8853             }
8854             *(d--) -= 'z' - 'a';
8855 #else
8856             ++*d;
8857             if (isALPHA(*d))
8858                 return;
8859             *(d--) -= 'z' - 'a' + 1;
8860 #endif
8861         }
8862     }
8863     /* oh,oh, the number grew */
8864     SvGROW(sv, SvCUR(sv) + 2);
8865     SvCUR_set(sv, SvCUR(sv) + 1);
8866     for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX_const(sv); d--)
8867         *d = d[-1];
8868     if (isDIGIT(d[1]))
8869         *d = '1';
8870     else
8871         *d = d[1];
8872 }
8873
8874 /*
8875 =for apidoc sv_dec
8876
8877 Auto-decrement of the value in the SV, doing string to numeric conversion
8878 if necessary.  Handles 'get' magic and operator overloading.
8879
8880 =cut
8881 */
8882
8883 void
8884 Perl_sv_dec(pTHX_ SV *const sv)
8885 {
8886     if (!sv)
8887         return;
8888     SvGETMAGIC(sv);
8889     sv_dec_nomg(sv);
8890 }
8891
8892 /*
8893 =for apidoc sv_dec_nomg
8894
8895 Auto-decrement of the value in the SV, doing string to numeric conversion
8896 if necessary.  Handles operator overloading.  Skips handling 'get' magic.
8897
8898 =cut
8899 */
8900
8901 void
8902 Perl_sv_dec_nomg(pTHX_ SV *const sv)
8903 {
8904     int flags;
8905
8906     if (!sv)
8907         return;
8908     if (SvTHINKFIRST(sv)) {
8909         if (SvREADONLY(sv)) {
8910                 Perl_croak_no_modify();
8911         }
8912         if (SvROK(sv)) {
8913             IV i;
8914             if (SvAMAGIC(sv) && AMG_CALLunary(sv, dec_amg))
8915                 return;
8916             i = PTR2IV(SvRV(sv));
8917             sv_unref(sv);
8918             sv_setiv(sv, i);
8919         }
8920         else sv_force_normal_flags(sv, 0);
8921     }
8922     /* Unlike sv_inc we don't have to worry about string-never-numbers
8923        and keeping them magic. But we mustn't warn on punting */
8924     flags = SvFLAGS(sv);
8925     if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
8926         /* It's publicly an integer, or privately an integer-not-float */
8927 #ifdef PERL_PRESERVE_IVUV
8928       oops_its_int:
8929 #endif
8930         if (SvIsUV(sv)) {
8931             if (SvUVX(sv) == 0) {
8932                 (void)SvIOK_only(sv);
8933                 SvIV_set(sv, -1);
8934             }
8935             else {
8936                 (void)SvIOK_only_UV(sv);
8937                 SvUV_set(sv, SvUVX(sv) - 1);
8938             }   
8939         } else {
8940             if (SvIVX(sv) == IV_MIN) {
8941                 sv_setnv(sv, (NV)IV_MIN);
8942                 goto oops_its_num;
8943             }
8944             else {
8945                 (void)SvIOK_only(sv);
8946                 SvIV_set(sv, SvIVX(sv) - 1);
8947             }   
8948         }
8949         return;
8950     }
8951     if (flags & SVp_NOK) {
8952     oops_its_num:
8953         {
8954             const NV was = SvNVX(sv);
8955             if (LIKELY(!Perl_isinfnan(was)) &&
8956                 NV_OVERFLOWS_INTEGERS_AT &&
8957                 was <= -NV_OVERFLOWS_INTEGERS_AT) {
8958                 /* diag_listed_as: Lost precision when %s %f by 1 */
8959                 Perl_ck_warner(aTHX_ packWARN(WARN_IMPRECISION),
8960                                "Lost precision when decrementing %" NVff " by 1",
8961                                was);
8962             }
8963             (void)SvNOK_only(sv);
8964             SvNV_set(sv, was - 1.0);
8965             return;
8966         }
8967     }
8968     if (!(flags & SVp_POK)) {
8969         if ((flags & SVTYPEMASK) < SVt_PVIV)
8970             sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV) ? SVt_PVIV : SVt_IV);
8971         SvIV_set(sv, -1);
8972         (void)SvIOK_only(sv);
8973         return;
8974     }
8975 #ifdef PERL_PRESERVE_IVUV
8976     {
8977         const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
8978         if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
8979             /* Need to try really hard to see if it's an integer.
8980                9.22337203685478e+18 is an integer.
8981                but "9.22337203685478e+18" + 0 is UV=9223372036854779904
8982                so $a="9.22337203685478e+18"; $a+0; $a--
8983                needs to be the same as $a="9.22337203685478e+18"; $a--
8984                or we go insane. */
8985         
8986             (void) sv_2iv(sv);
8987             if (SvIOK(sv))
8988                 goto oops_its_int;
8989
8990             /* sv_2iv *should* have made this an NV */
8991             if (flags & SVp_NOK) {
8992                 (void)SvNOK_only(sv);
8993                 SvNV_set(sv, SvNVX(sv) - 1.0);
8994                 return;
8995             }
8996             /* I don't think we can get here. Maybe I should assert this
8997                And if we do get here I suspect that sv_setnv will croak. NWC
8998                Fall through. */
8999             DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_dec punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"NVgf"\n",
9000                                   SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
9001         }
9002     }
9003 #endif /* PERL_PRESERVE_IVUV */
9004     sv_setnv(sv,Atof(SvPVX_const(sv)) - 1.0);   /* punt */
9005 }
9006
9007 /* this define is used to eliminate a chunk of duplicated but shared logic
9008  * it has the suffix __SV_C to signal that it isnt API, and isnt meant to be
9009  * used anywhere but here - yves
9010  */
9011 #define PUSH_EXTEND_MORTAL__SV_C(AnSv) \
9012     STMT_START {      \
9013         SSize_t ix = ++PL_tmps_ix;              \
9014         if (UNLIKELY(ix >= PL_tmps_max))        \
9015             ix = tmps_grow_p(ix);                       \
9016         PL_tmps_stack[ix] = (AnSv); \
9017     } STMT_END
9018
9019 /*
9020 =for apidoc sv_mortalcopy
9021
9022 Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
9023 The new SV is marked as mortal.  It will be destroyed "soon", either by an
9024 explicit call to FREETMPS, or by an implicit call at places such as
9025 statement boundaries.  See also C<sv_newmortal> and C<sv_2mortal>.
9026
9027 =cut
9028 */
9029
9030 /* Make a string that will exist for the duration of the expression
9031  * evaluation.  Actually, it may have to last longer than that, but
9032  * hopefully we won't free it until it has been assigned to a
9033  * permanent location. */
9034
9035 SV *
9036 Perl_sv_mortalcopy_flags(pTHX_ SV *const oldstr, U32 flags)
9037 {
9038     SV *sv;
9039
9040     if (flags & SV_GMAGIC)
9041         SvGETMAGIC(oldstr); /* before new_SV, in case it dies */
9042     new_SV(sv);
9043     sv_setsv_flags(sv,oldstr,flags & ~SV_GMAGIC);
9044     PUSH_EXTEND_MORTAL__SV_C(sv);
9045     SvTEMP_on(sv);
9046     return sv;
9047 }
9048
9049 /*
9050 =for apidoc sv_newmortal
9051
9052 Creates a new null SV which is mortal.  The reference count of the SV is
9053 set to 1.  It will be destroyed "soon", either by an explicit call to
9054 FREETMPS, or by an implicit call at places such as statement boundaries.
9055 See also C<sv_mortalcopy> and C<sv_2mortal>.
9056
9057 =cut
9058 */
9059
9060 SV *
9061 Perl_sv_newmortal(pTHX)
9062 {
9063     SV *sv;
9064
9065     new_SV(sv);
9066     SvFLAGS(sv) = SVs_TEMP;
9067     PUSH_EXTEND_MORTAL__SV_C(sv);
9068     return sv;
9069 }
9070
9071
9072 /*
9073 =for apidoc newSVpvn_flags
9074
9075 Creates a new SV and copies a string (which may contain C<NUL> (C<\0>)
9076 characters) into it.  The reference count for the
9077 SV is set to 1.  Note that if C<len> is zero, Perl will create a zero length
9078 string.  You are responsible for ensuring that the source string is at least
9079 C<len> bytes long.  If the C<s> argument is NULL the new SV will be undefined.
9080 Currently the only flag bits accepted are C<SVf_UTF8> and C<SVs_TEMP>.
9081 If C<SVs_TEMP> is set, then C<sv_2mortal()> is called on the result before
9082 returning.  If C<SVf_UTF8> is set, C<s>
9083 is considered to be in UTF-8 and the
9084 C<SVf_UTF8> flag will be set on the new SV.
9085 C<newSVpvn_utf8()> is a convenience wrapper for this function, defined as
9086
9087     #define newSVpvn_utf8(s, len, u)                    \
9088         newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0)
9089
9090 =cut
9091 */
9092
9093 SV *
9094 Perl_newSVpvn_flags(pTHX_ const char *const s, const STRLEN len, const U32 flags)
9095 {
9096     SV *sv;
9097
9098     /* All the flags we don't support must be zero.
9099        And we're new code so I'm going to assert this from the start.  */
9100     assert(!(flags & ~(SVf_UTF8|SVs_TEMP)));
9101     new_SV(sv);
9102     sv_setpvn(sv,s,len);
9103
9104     /* This code used to do a sv_2mortal(), however we now unroll the call to
9105      * sv_2mortal() and do what it does ourselves here.  Since we have asserted
9106      * that flags can only have the SVf_UTF8 and/or SVs_TEMP flags set above we
9107      * can use it to enable the sv flags directly (bypassing SvTEMP_on), which
9108      * in turn means we dont need to mask out the SVf_UTF8 flag below, which
9109      * means that we eliminate quite a few steps than it looks - Yves
9110      * (explaining patch by gfx) */
9111
9112     SvFLAGS(sv) |= flags;
9113
9114     if(flags & SVs_TEMP){
9115         PUSH_EXTEND_MORTAL__SV_C(sv);
9116     }
9117
9118     return sv;
9119 }
9120
9121 /*
9122 =for apidoc sv_2mortal
9123
9124 Marks an existing SV as mortal.  The SV will be destroyed "soon", either
9125 by an explicit call to FREETMPS, or by an implicit call at places such as
9126 statement boundaries.  SvTEMP() is turned on which means that the SV's
9127 string buffer can be "stolen" if this SV is copied.  See also C<sv_newmortal>
9128 and C<sv_mortalcopy>.
9129
9130 =cut
9131 */
9132
9133 SV *
9134 Perl_sv_2mortal(pTHX_ SV *const sv)
9135 {
9136     dVAR;
9137     if (!sv)
9138         return sv;
9139     if (SvIMMORTAL(sv))
9140         return sv;
9141     PUSH_EXTEND_MORTAL__SV_C(sv);
9142     SvTEMP_on(sv);
9143     return sv;
9144 }
9145
9146 /*
9147 =for apidoc newSVpv
9148
9149 Creates a new SV and copies a string (which may contain C<NUL> (C<\0>)
9150 characters) into it.  The reference count for the
9151 SV is set to 1.  If C<len> is zero, Perl will compute the length using
9152 strlen(), (which means if you use this option, that C<s> can't have embedded
9153 C<NUL> characters and has to have a terminating C<NUL> byte).
9154
9155 For efficiency, consider using C<newSVpvn> instead.
9156
9157 =cut
9158 */
9159
9160 SV *
9161 Perl_newSVpv(pTHX_ const char *const s, const STRLEN len)
9162 {
9163     SV *sv;
9164
9165     new_SV(sv);
9166     sv_setpvn(sv, s, len || s == NULL ? len : strlen(s));
9167     return sv;
9168 }
9169
9170 /*
9171 =for apidoc newSVpvn
9172
9173 Creates a new SV and copies a string into it, which may contain C<NUL> characters
9174 (C<\0>) and other binary data.  The reference count for the SV is set to 1.
9175 Note that if C<len> is zero, Perl will create a zero length (Perl) string.  You
9176 are responsible for ensuring that the source buffer is at least
9177 C<len> bytes long.  If the C<buffer> argument is NULL the new SV will be
9178 undefined.
9179
9180 =cut
9181 */
9182
9183 SV *
9184 Perl_newSVpvn(pTHX_ const char *const buffer, const STRLEN len)
9185 {
9186     SV *sv;
9187     new_SV(sv);
9188     sv_setpvn(sv,buffer,len);
9189     return sv;
9190 }
9191
9192 /*
9193 =for apidoc newSVhek
9194
9195 Creates a new SV from the hash key structure.  It will generate scalars that
9196 point to the shared string table where possible.  Returns a new (undefined)
9197 SV if the hek is NULL.
9198
9199 =cut
9200 */
9201
9202 SV *
9203 Perl_newSVhek(pTHX_ const HEK *const hek)
9204 {
9205     if (!hek) {
9206         SV *sv;
9207
9208         new_SV(sv);
9209         return sv;
9210     }
9211
9212     if (HEK_LEN(hek) == HEf_SVKEY) {
9213         return newSVsv(*(SV**)HEK_KEY(hek));
9214     } else {
9215         const int flags = HEK_FLAGS(hek);
9216         if (flags & HVhek_WASUTF8) {
9217             /* Trouble :-)
9218                Andreas would like keys he put in as utf8 to come back as utf8
9219             */
9220             STRLEN utf8_len = HEK_LEN(hek);
9221             SV * const sv = newSV_type(SVt_PV);
9222             char *as_utf8 = (char *)bytes_to_utf8 ((U8*)HEK_KEY(hek), &utf8_len);
9223             /* bytes_to_utf8() allocates a new string, which we can repurpose: */
9224             sv_usepvn_flags(sv, as_utf8, utf8_len, SV_HAS_TRAILING_NUL);
9225             SvUTF8_on (sv);
9226             return sv;
9227         } else if (flags & HVhek_UNSHARED) {
9228             /* A hash that isn't using shared hash keys has to have
9229                the flag in every key so that we know not to try to call
9230                share_hek_hek on it.  */
9231
9232             SV * const sv = newSVpvn (HEK_KEY(hek), HEK_LEN(hek));
9233             if (HEK_UTF8(hek))
9234                 SvUTF8_on (sv);
9235             return sv;
9236         }
9237         /* This will be overwhelminly the most common case.  */
9238         {
9239             /* Inline most of newSVpvn_share(), because share_hek_hek() is far
9240                more efficient than sharepvn().  */
9241             SV *sv;
9242
9243             new_SV(sv);
9244             sv_upgrade(sv, SVt_PV);
9245             SvPV_set(sv, (char *)HEK_KEY(share_hek_hek(hek)));
9246             SvCUR_set(sv, HEK_LEN(hek));
9247             SvLEN_set(sv, 0);
9248             SvIsCOW_on(sv);
9249             SvPOK_on(sv);
9250             if (HEK_UTF8(hek))
9251                 SvUTF8_on(sv);
9252             return sv;
9253         }
9254     }
9255 }
9256
9257 /*
9258 =for apidoc newSVpvn_share
9259
9260 Creates a new SV with its SvPVX_const pointing to a shared string in the string
9261 table.  If the string does not already exist in the table, it is
9262 created first.  Turns on the SvIsCOW flag (or READONLY
9263 and FAKE in 5.16 and earlier).  If the C<hash> parameter
9264 is non-zero, that value is used; otherwise the hash is computed.
9265 The string's hash can later be retrieved from the SV
9266 with the C<SvSHARED_HASH()> macro.  The idea here is
9267 that as the string table is used for shared hash keys these strings will have
9268 SvPVX_const == HeKEY and hash lookup will avoid string compare.
9269
9270 =cut
9271 */
9272
9273 SV *
9274 Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
9275 {
9276     dVAR;
9277     SV *sv;
9278     bool is_utf8 = FALSE;
9279     const char *const orig_src = src;
9280
9281     if (len < 0) {
9282         STRLEN tmplen = -len;
9283         is_utf8 = TRUE;
9284         /* See the note in hv.c:hv_fetch() --jhi */
9285         src = (char*)bytes_from_utf8((const U8*)src, &tmplen, &is_utf8);
9286         len = tmplen;
9287     }
9288     if (!hash)
9289         PERL_HASH(hash, src, len);
9290     new_SV(sv);
9291     /* The logic for this is inlined in S_mro_get_linear_isa_dfs(), so if it
9292        changes here, update it there too.  */
9293     sv_upgrade(sv, SVt_PV);
9294     SvPV_set(sv, sharepvn(src, is_utf8?-len:len, hash));
9295     SvCUR_set(sv, len);
9296     SvLEN_set(sv, 0);
9297     SvIsCOW_on(sv);
9298     SvPOK_on(sv);
9299     if (is_utf8)
9300         SvUTF8_on(sv);
9301     if (src != orig_src)
9302         Safefree(src);
9303     return sv;
9304 }
9305
9306 /*
9307 =for apidoc newSVpv_share
9308
9309 Like C<newSVpvn_share>, but takes a C<NUL>-terminated string instead of a
9310 string/length pair.
9311
9312 =cut
9313 */
9314
9315 SV *
9316 Perl_newSVpv_share(pTHX_ const char *src, U32 hash)
9317 {
9318     return newSVpvn_share(src, strlen(src), hash);
9319 }
9320
9321 #if defined(PERL_IMPLICIT_CONTEXT)
9322
9323 /* pTHX_ magic can't cope with varargs, so this is a no-context
9324  * version of the main function, (which may itself be aliased to us).
9325  * Don't access this version directly.
9326  */
9327
9328 SV *
9329 Perl_newSVpvf_nocontext(const char *const pat, ...)
9330 {
9331     dTHX;
9332     SV *sv;
9333     va_list args;
9334
9335     PERL_ARGS_ASSERT_NEWSVPVF_NOCONTEXT;
9336
9337     va_start(args, pat);
9338     sv = vnewSVpvf(pat, &args);
9339     va_end(args);
9340     return sv;
9341 }
9342 #endif
9343
9344 /*
9345 =for apidoc newSVpvf
9346
9347 Creates a new SV and initializes it with the string formatted like
9348 C<sprintf>.
9349
9350 =cut
9351 */
9352
9353 SV *
9354 Perl_newSVpvf(pTHX_ const char *const pat, ...)
9355 {
9356     SV *sv;
9357     va_list args;
9358
9359     PERL_ARGS_ASSERT_NEWSVPVF;
9360
9361     va_start(args, pat);
9362     sv = vnewSVpvf(pat, &args);
9363     va_end(args);
9364     return sv;
9365 }
9366
9367 /* backend for newSVpvf() and newSVpvf_nocontext() */
9368
9369 SV *
9370 Perl_vnewSVpvf(pTHX_ const char *const pat, va_list *const args)
9371 {
9372     SV *sv;
9373
9374     PERL_ARGS_ASSERT_VNEWSVPVF;
9375
9376     new_SV(sv);
9377     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
9378     return sv;
9379 }
9380
9381 /*
9382 =for apidoc newSVnv
9383
9384 Creates a new SV and copies a floating point value into it.
9385 The reference count for the SV is set to 1.
9386
9387 =cut
9388 */
9389
9390 SV *
9391 Perl_newSVnv(pTHX_ const NV n)
9392 {
9393     SV *sv;
9394
9395     new_SV(sv);
9396     sv_setnv(sv,n);
9397     return sv;
9398 }
9399
9400 /*
9401 =for apidoc newSViv
9402
9403 Creates a new SV and copies an integer into it.  The reference count for the
9404 SV is set to 1.
9405
9406 =cut
9407 */
9408
9409 SV *
9410 Perl_newSViv(pTHX_ const IV i)
9411 {
9412     SV *sv;
9413
9414     new_SV(sv);
9415
9416     /* Inlining ONLY the small relevant subset of sv_setiv here
9417      * for performance. Makes a significant difference. */
9418
9419     /* We're starting from SVt_FIRST, so provided that's
9420      * actual 0, we don't have to unset any SV type flags
9421      * to promote to SVt_IV. */
9422     STATIC_ASSERT_STMT(SVt_FIRST == 0);
9423
9424     SET_SVANY_FOR_BODYLESS_IV(sv);
9425     SvFLAGS(sv) |= SVt_IV;
9426     (void)SvIOK_on(sv);
9427
9428     SvIV_set(sv, i);
9429     SvTAINT(sv);
9430
9431     return sv;
9432 }
9433
9434 /*
9435 =for apidoc newSVuv
9436
9437 Creates a new SV and copies an unsigned integer into it.
9438 The reference count for the SV is set to 1.
9439
9440 =cut
9441 */
9442
9443 SV *
9444 Perl_newSVuv(pTHX_ const UV u)
9445 {
9446     SV *sv;
9447
9448     /* Inlining ONLY the small relevant subset of sv_setuv here
9449      * for performance. Makes a significant difference. */
9450
9451     /* Using ivs is more efficient than using uvs - see sv_setuv */
9452     if (u <= (UV)IV_MAX) {
9453         return newSViv((IV)u);
9454     }
9455
9456     new_SV(sv);
9457
9458     /* We're starting from SVt_FIRST, so provided that's
9459      * actual 0, we don't have to unset any SV type flags
9460      * to promote to SVt_IV. */
9461     STATIC_ASSERT_STMT(SVt_FIRST == 0);
9462
9463     SET_SVANY_FOR_BODYLESS_IV(sv);
9464     SvFLAGS(sv) |= SVt_IV;
9465     (void)SvIOK_on(sv);
9466     (void)SvIsUV_on(sv);
9467
9468     SvUV_set(sv, u);
9469     SvTAINT(sv);
9470
9471     return sv;
9472 }
9473
9474 /*
9475 =for apidoc newSV_type
9476
9477 Creates a new SV, of the type specified.  The reference count for the new SV
9478 is set to 1.
9479
9480 =cut
9481 */
9482
9483 SV *
9484 Perl_newSV_type(pTHX_ const svtype type)
9485 {
9486     SV *sv;
9487
9488     new_SV(sv);
9489     ASSUME(SvTYPE(sv) == SVt_FIRST);
9490     if(type != SVt_FIRST)
9491         sv_upgrade(sv, type);
9492     return sv;
9493 }
9494
9495 /*
9496 =for apidoc newRV_noinc
9497
9498 Creates an RV wrapper for an SV.  The reference count for the original
9499 SV is B<not> incremented.
9500
9501 =cut
9502 */
9503
9504 SV *
9505 Perl_newRV_noinc(pTHX_ SV *const tmpRef)
9506 {
9507     SV *sv;
9508
9509     PERL_ARGS_ASSERT_NEWRV_NOINC;
9510
9511     new_SV(sv);
9512
9513     /* We're starting from SVt_FIRST, so provided that's
9514      * actual 0, we don't have to unset any SV type flags
9515      * to promote to SVt_IV. */
9516     STATIC_ASSERT_STMT(SVt_FIRST == 0);
9517
9518     SET_SVANY_FOR_BODYLESS_IV(sv);
9519     SvFLAGS(sv) |= SVt_IV;
9520     SvROK_on(sv);
9521     SvIV_set(sv, 0);
9522
9523     SvTEMP_off(tmpRef);
9524     SvRV_set(sv, tmpRef);
9525
9526     return sv;
9527 }
9528
9529 /* newRV_inc is the official function name to use now.
9530  * newRV_inc is in fact #defined to newRV in sv.h
9531  */
9532
9533 SV *
9534 Perl_newRV(pTHX_ SV *const sv)
9535 {
9536     PERL_ARGS_ASSERT_NEWRV;
9537
9538     return newRV_noinc(SvREFCNT_inc_simple_NN(sv));
9539 }
9540
9541 /*
9542 =for apidoc newSVsv
9543
9544 Creates a new SV which is an exact duplicate of the original SV.
9545 (Uses C<sv_setsv>.)
9546
9547 =cut
9548 */
9549
9550 SV *
9551 Perl_newSVsv(pTHX_ SV *const old)
9552 {
9553     SV *sv;
9554
9555     if (!old)
9556         return NULL;
9557     if (SvTYPE(old) == (svtype)SVTYPEMASK) {
9558         Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
9559         return NULL;
9560     }
9561     /* Do this here, otherwise we leak the new SV if this croaks. */
9562     SvGETMAGIC(old);
9563     new_SV(sv);
9564     /* SV_NOSTEAL prevents TEMP buffers being, well, stolen, and saves games
9565        with SvTEMP_off and SvTEMP_on round a call to sv_setsv.  */
9566     sv_setsv_flags(sv, old, SV_NOSTEAL);
9567     return sv;
9568 }
9569
9570 /*
9571 =for apidoc sv_reset
9572
9573 Underlying implementation for the C<reset> Perl function.
9574 Note that the perl-level function is vaguely deprecated.
9575
9576 =cut
9577 */
9578
9579 void
9580 Perl_sv_reset(pTHX_ const char *s, HV *const stash)
9581 {
9582     PERL_ARGS_ASSERT_SV_RESET;
9583
9584     sv_resetpvn(*s ? s : NULL, strlen(s), stash);
9585 }
9586
9587 void
9588 Perl_sv_resetpvn(pTHX_ const char *s, STRLEN len, HV * const stash)
9589 {
9590     char todo[PERL_UCHAR_MAX+1];
9591     const char *send;
9592
9593     if (!stash || SvTYPE(stash) != SVt_PVHV)
9594         return;
9595
9596     if (!s) {           /* reset ?? searches */
9597         MAGIC * const mg = mg_find((const SV *)stash, PERL_MAGIC_symtab);
9598         if (mg) {
9599             const U32 count = mg->mg_len / sizeof(PMOP**);
9600             PMOP **pmp = (PMOP**) mg->mg_ptr;
9601             PMOP *const *const end = pmp + count;
9602
9603             while (pmp < end) {
9604 #ifdef USE_ITHREADS
9605                 SvREADONLY_off(PL_regex_pad[(*pmp)->op_pmoffset]);
9606 #else
9607                 (*pmp)->op_pmflags &= ~PMf_USED;
9608 #endif
9609                 ++pmp;
9610             }
9611         }
9612         return;
9613     }
9614
9615     /* reset variables */
9616
9617     if (!HvARRAY(stash))
9618         return;
9619
9620     Zero(todo, 256, char);
9621     send = s + len;
9622     while (s < send) {
9623         I32 max;
9624         I32 i = (unsigned char)*s;
9625         if (s[1] == '-') {
9626             s += 2;
9627         }
9628         max = (unsigned char)*s++;
9629         for ( ; i <= max; i++) {
9630             todo[i] = 1;
9631         }
9632         for (i = 0; i <= (I32) HvMAX(stash); i++) {
9633             HE *entry;
9634             for (entry = HvARRAY(stash)[i];
9635                  entry;
9636                  entry = HeNEXT(entry))
9637             {
9638                 GV *gv;
9639                 SV *sv;
9640
9641                 if (!todo[(U8)*HeKEY(entry)])
9642                     continue;
9643                 gv = MUTABLE_GV(HeVAL(entry));
9644                 sv = GvSV(gv);
9645                 if (sv && !SvREADONLY(sv)) {
9646                     SV_CHECK_THINKFIRST_COW_DROP(sv);
9647                     if (!isGV(sv)) SvOK_off(sv);
9648                 }
9649                 if (GvAV(gv)) {
9650                     av_clear(GvAV(gv));
9651                 }
9652                 if (GvHV(gv) && !HvNAME_get(GvHV(gv))) {
9653                     hv_clear(GvHV(gv));
9654                 }
9655             }
9656         }
9657     }
9658 }
9659
9660 /*
9661 =for apidoc sv_2io
9662
9663 Using various gambits, try to get an IO from an SV: the IO slot if its a
9664 GV; or the recursive result if we're an RV; or the IO slot of the symbol
9665 named after the PV if we're a string.
9666
9667 'Get' magic is ignored on the sv passed in, but will be called on
9668 C<SvRV(sv)> if sv is an RV.
9669
9670 =cut
9671 */
9672
9673 IO*
9674 Perl_sv_2io(pTHX_ SV *const sv)
9675 {
9676     IO* io;
9677     GV* gv;
9678
9679     PERL_ARGS_ASSERT_SV_2IO;
9680
9681     switch (SvTYPE(sv)) {
9682     case SVt_PVIO:
9683         io = MUTABLE_IO(sv);
9684         break;
9685     case SVt_PVGV:
9686     case SVt_PVLV:
9687         if (isGV_with_GP(sv)) {
9688             gv = MUTABLE_GV(sv);
9689             io = GvIO(gv);
9690             if (!io)
9691                 Perl_croak(aTHX_ "Bad filehandle: %"HEKf,
9692                                     HEKfARG(GvNAME_HEK(gv)));
9693             break;
9694         }
9695         /* FALLTHROUGH */
9696     default:
9697         if (!SvOK(sv))
9698             Perl_croak(aTHX_ PL_no_usym, "filehandle");
9699         if (SvROK(sv)) {
9700             SvGETMAGIC(SvRV(sv));
9701             return sv_2io(SvRV(sv));
9702         }
9703         gv = gv_fetchsv_nomg(sv, 0, SVt_PVIO);
9704         if (gv)
9705             io = GvIO(gv);
9706         else
9707             io = 0;
9708         if (!io) {
9709             SV *newsv = sv;
9710             if (SvGMAGICAL(sv)) {
9711                 newsv = sv_newmortal();
9712                 sv_setsv_nomg(newsv, sv);
9713             }
9714             Perl_croak(aTHX_ "Bad filehandle: %"SVf, SVfARG(newsv));
9715         }
9716         break;
9717     }
9718     return io;
9719 }
9720
9721 /*
9722 =for apidoc sv_2cv
9723
9724 Using various gambits, try to get a CV from an SV; in addition, try if
9725 possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
9726 The flags in C<lref> are passed to gv_fetchsv.
9727
9728 =cut
9729 */
9730
9731 CV *
9732 Perl_sv_2cv(pTHX_ SV *sv, HV **const st, GV **const gvp, const I32 lref)
9733 {
9734     GV *gv = NULL;
9735     CV *cv = NULL;
9736
9737     PERL_ARGS_ASSERT_SV_2CV;
9738
9739     if (!sv) {
9740         *st = NULL;
9741         *gvp = NULL;
9742         return NULL;
9743     }
9744     switch (SvTYPE(sv)) {
9745     case SVt_PVCV:
9746         *st = CvSTASH(sv);
9747         *gvp = NULL;
9748         return MUTABLE_CV(sv);
9749     case SVt_PVHV:
9750     case SVt_PVAV:
9751         *st = NULL;
9752         *gvp = NULL;
9753         return NULL;
9754     default:
9755         SvGETMAGIC(sv);
9756         if (SvROK(sv)) {
9757             if (SvAMAGIC(sv))
9758                 sv = amagic_deref_call(sv, to_cv_amg);
9759
9760             sv = SvRV(sv);
9761             if (SvTYPE(sv) == SVt_PVCV) {
9762                 cv = MUTABLE_CV(sv);
9763                 *gvp = NULL;
9764                 *st = CvSTASH(cv);
9765                 return cv;
9766             }
9767             else if(SvGETMAGIC(sv), isGV_with_GP(sv))
9768                 gv = MUTABLE_GV(sv);
9769             else
9770                 Perl_croak(aTHX_ "Not a subroutine reference");
9771         }
9772         else if (isGV_with_GP(sv)) {
9773             gv = MUTABLE_GV(sv);
9774         }
9775         else {
9776             gv = gv_fetchsv_nomg(sv, lref, SVt_PVCV);
9777         }
9778         *gvp = gv;
9779         if (!gv) {
9780             *st = NULL;
9781             return NULL;
9782         }
9783         /* Some flags to gv_fetchsv mean don't really create the GV  */
9784         if (!isGV_with_GP(gv)) {
9785             *st = NULL;
9786             return NULL;
9787         }
9788         *st = GvESTASH(gv);
9789         if (lref & ~GV_ADDMG && !GvCVu(gv)) {
9790             /* XXX this is probably not what they think they're getting.
9791              * It has the same effect as "sub name;", i.e. just a forward
9792              * declaration! */
9793             newSTUB(gv,0);
9794         }
9795         return GvCVu(gv);
9796     }
9797 }
9798
9799 /*
9800 =for apidoc sv_true
9801
9802 Returns true if the SV has a true value by Perl's rules.
9803 Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
9804 instead use an in-line version.
9805
9806 =cut
9807 */
9808
9809 I32
9810 Perl_sv_true(pTHX_ SV *const sv)
9811 {
9812     if (!sv)
9813         return 0;
9814     if (SvPOK(sv)) {
9815         const XPV* const tXpv = (XPV*)SvANY(sv);
9816         if (tXpv &&
9817                 (tXpv->xpv_cur > 1 ||
9818                 (tXpv->xpv_cur && *sv->sv_u.svu_pv != '0')))
9819             return 1;
9820         else
9821             return 0;
9822     }
9823     else {
9824         if (SvIOK(sv))
9825             return SvIVX(sv) != 0;
9826         else {
9827             if (SvNOK(sv))
9828                 return SvNVX(sv) != 0.0;
9829             else
9830                 return sv_2bool(sv);
9831         }
9832     }
9833 }
9834
9835 /*
9836 =for apidoc sv_pvn_force
9837
9838 Get a sensible string out of the SV somehow.
9839 A private implementation of the C<SvPV_force> macro for compilers which
9840 can't cope with complex macro expressions.  Always use the macro instead.
9841
9842 =for apidoc sv_pvn_force_flags
9843
9844 Get a sensible string out of the SV somehow.
9845 If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
9846 appropriate, else not.  C<sv_pvn_force> and C<sv_pvn_force_nomg> are
9847 implemented in terms of this function.
9848 You normally want to use the various wrapper macros instead: see
9849 C<SvPV_force> and C<SvPV_force_nomg>
9850
9851 =cut
9852 */
9853
9854 char *
9855 Perl_sv_pvn_force_flags(pTHX_ SV *const sv, STRLEN *const lp, const I32 flags)
9856 {
9857     PERL_ARGS_ASSERT_SV_PVN_FORCE_FLAGS;
9858
9859     if (flags & SV_GMAGIC) SvGETMAGIC(sv);
9860     if (SvTHINKFIRST(sv) && (!SvROK(sv) || SvREADONLY(sv)))
9861         sv_force_normal_flags(sv, 0);
9862
9863     if (SvPOK(sv)) {
9864         if (lp)
9865             *lp = SvCUR(sv);
9866     }
9867     else {
9868         char *s;
9869         STRLEN len;
9870  
9871         if (SvTYPE(sv) > SVt_PVLV
9872             || isGV_with_GP(sv))
9873             /* diag_listed_as: Can't coerce %s to %s in %s */
9874             Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
9875                 OP_DESC(PL_op));
9876         s = sv_2pv_flags(sv, &len, flags &~ SV_GMAGIC);
9877         if (!s) {
9878           s = (char *)"";
9879         }
9880         if (lp)
9881             *lp = len;
9882
9883         if (SvTYPE(sv) < SVt_PV ||
9884             s != SvPVX_const(sv)) {     /* Almost, but not quite, sv_setpvn() */
9885             if (SvROK(sv))
9886                 sv_unref(sv);
9887             SvUPGRADE(sv, SVt_PV);              /* Never FALSE */
9888             SvGROW(sv, len + 1);
9889             Move(s,SvPVX(sv),len,char);
9890             SvCUR_set(sv, len);
9891             SvPVX(sv)[len] = '\0';
9892         }
9893         if (!SvPOK(sv)) {
9894             SvPOK_on(sv);               /* validate pointer */
9895             SvTAINT(sv);
9896             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
9897                                   PTR2UV(sv),SvPVX_const(sv)));
9898         }
9899     }
9900     (void)SvPOK_only_UTF8(sv);
9901     return SvPVX_mutable(sv);
9902 }
9903
9904 /*
9905 =for apidoc sv_pvbyten_force
9906
9907 The backend for the C<SvPVbytex_force> macro.  Always use the macro
9908 instead.
9909
9910 =cut
9911 */
9912
9913 char *
9914 Perl_sv_pvbyten_force(pTHX_ SV *const sv, STRLEN *const lp)
9915 {
9916     PERL_ARGS_ASSERT_SV_PVBYTEN_FORCE;
9917
9918     sv_pvn_force(sv,lp);
9919     sv_utf8_downgrade(sv,0);
9920     *lp = SvCUR(sv);
9921     return SvPVX(sv);
9922 }
9923
9924 /*
9925 =for apidoc sv_pvutf8n_force
9926
9927 The backend for the C<SvPVutf8x_force> macro.  Always use the macro
9928 instead.
9929
9930 =cut
9931 */
9932
9933 char *
9934 Perl_sv_pvutf8n_force(pTHX_ SV *const sv, STRLEN *const lp)
9935 {
9936     PERL_ARGS_ASSERT_SV_PVUTF8N_FORCE;
9937
9938     sv_pvn_force(sv,0);
9939     sv_utf8_upgrade_nomg(sv);
9940     *lp = SvCUR(sv);
9941     return SvPVX(sv);
9942 }
9943
9944 /*
9945 =for apidoc sv_reftype
9946
9947 Returns a string describing what the SV is a reference to.
9948
9949 =cut
9950 */
9951
9952 const char *
9953 Perl_sv_reftype(pTHX_ const SV *const sv, const int ob)
9954 {
9955     PERL_ARGS_ASSERT_SV_REFTYPE;
9956     if (ob && SvOBJECT(sv)) {
9957         return SvPV_nolen_const(sv_ref(NULL, sv, ob));
9958     }
9959     else {
9960         /* WARNING - There is code, for instance in mg.c, that assumes that
9961          * the only reason that sv_reftype(sv,0) would return a string starting
9962          * with 'L' or 'S' is that it is a LVALUE or a SCALAR.
9963          * Yes this a dodgy way to do type checking, but it saves practically reimplementing
9964          * this routine inside other subs, and it saves time.
9965          * Do not change this assumption without searching for "dodgy type check" in
9966          * the code.
9967          * - Yves */
9968         switch (SvTYPE(sv)) {
9969         case SVt_NULL:
9970         case SVt_IV:
9971         case SVt_NV:
9972         case SVt_PV:
9973         case SVt_PVIV:
9974         case SVt_PVNV:
9975         case SVt_PVMG:
9976                                 if (SvVOK(sv))
9977                                     return "VSTRING";
9978                                 if (SvROK(sv))
9979                                     return "REF";
9980                                 else
9981                                     return "SCALAR";
9982
9983         case SVt_PVLV:          return (char *)  (SvROK(sv) ? "REF"
9984                                 /* tied lvalues should appear to be
9985                                  * scalars for backwards compatibility */
9986                                 : (isALPHA_FOLD_EQ(LvTYPE(sv), 't'))
9987                                     ? "SCALAR" : "LVALUE");
9988         case SVt_PVAV:          return "ARRAY";
9989         case SVt_PVHV:          return "HASH";
9990         case SVt_PVCV:          return "CODE";
9991         case SVt_PVGV:          return (char *) (isGV_with_GP(sv)
9992                                     ? "GLOB" : "SCALAR");
9993         case SVt_PVFM:          return "FORMAT";
9994         case SVt_PVIO:          return "IO";
9995         case SVt_INVLIST:       return "INVLIST";
9996         case SVt_REGEXP:        return "REGEXP";
9997         default:                return "UNKNOWN";
9998         }
9999     }
10000 }
10001
10002 /*
10003 =for apidoc sv_ref
10004
10005 Returns a SV describing what the SV passed in is a reference to.
10006
10007 =cut
10008 */
10009
10010 SV *
10011 Perl_sv_ref(pTHX_ SV *dst, const SV *const sv, const int ob)
10012 {
10013     PERL_ARGS_ASSERT_SV_REF;
10014
10015     if (!dst)
10016         dst = sv_newmortal();
10017
10018     if (ob && SvOBJECT(sv)) {
10019         HvNAME_get(SvSTASH(sv))
10020                     ? sv_sethek(dst, HvNAME_HEK(SvSTASH(sv)))
10021                     : sv_setpvn(dst, "__ANON__", 8);
10022     }
10023     else {
10024         const char * reftype = sv_reftype(sv, 0);
10025         sv_setpv(dst, reftype);
10026     }
10027     return dst;
10028 }
10029
10030 /*
10031 =for apidoc sv_isobject
10032
10033 Returns a boolean indicating whether the SV is an RV pointing to a blessed
10034 object.  If the SV is not an RV, or if the object is not blessed, then this
10035 will return false.
10036
10037 =cut
10038 */
10039
10040 int
10041 Perl_sv_isobject(pTHX_ SV *sv)
10042 {
10043     if (!sv)
10044         return 0;
10045     SvGETMAGIC(sv);
10046     if (!SvROK(sv))
10047         return 0;
10048     sv = SvRV(sv);
10049     if (!SvOBJECT(sv))
10050         return 0;
10051     return 1;
10052 }
10053
10054 /*
10055 =for apidoc sv_isa
10056
10057 Returns a boolean indicating whether the SV is blessed into the specified
10058 class.  This does not check for subtypes; use C<sv_derived_from> to verify
10059 an inheritance relationship.
10060
10061 =cut
10062 */
10063
10064 int
10065 Perl_sv_isa(pTHX_ SV *sv, const char *const name)
10066 {
10067     const char *hvname;
10068
10069     PERL_ARGS_ASSERT_SV_ISA;
10070
10071     if (!sv)
10072         return 0;
10073     SvGETMAGIC(sv);
10074     if (!SvROK(sv))
10075         return 0;
10076     sv = SvRV(sv);
10077     if (!SvOBJECT(sv))
10078         return 0;
10079     hvname = HvNAME_get(SvSTASH(sv));
10080     if (!hvname)
10081         return 0;
10082
10083     return strEQ(hvname, name);
10084 }
10085
10086 /*
10087 =for apidoc newSVrv
10088
10089 Creates a new SV for the existing RV, C<rv>, to point to.  If C<rv> is not an
10090 RV then it will be upgraded to one.  If C<classname> is non-null then the new
10091 SV will be blessed in the specified package.  The new SV is returned and its
10092 reference count is 1.  The reference count 1 is owned by C<rv>.
10093
10094 =cut
10095 */
10096
10097 SV*
10098 Perl_newSVrv(pTHX_ SV *const rv, const char *const classname)
10099 {
10100     SV *sv;
10101
10102     PERL_ARGS_ASSERT_NEWSVRV;
10103
10104     new_SV(sv);
10105
10106     SV_CHECK_THINKFIRST_COW_DROP(rv);
10107
10108     if (UNLIKELY( SvTYPE(rv) >= SVt_PVMG )) {
10109         const U32 refcnt = SvREFCNT(rv);
10110         SvREFCNT(rv) = 0;
10111         sv_clear(rv);
10112         SvFLAGS(rv) = 0;
10113         SvREFCNT(rv) = refcnt;
10114
10115         sv_upgrade(rv, SVt_IV);
10116     } else if (SvROK(rv)) {
10117         SvREFCNT_dec(SvRV(rv));
10118     } else {
10119         prepare_SV_for_RV(rv);
10120     }
10121
10122     SvOK_off(rv);
10123     SvRV_set(rv, sv);
10124     SvROK_on(rv);
10125
10126     if (classname) {
10127         HV* const stash = gv_stashpv(classname, GV_ADD);
10128         (void)sv_bless(rv, stash);
10129     }
10130     return sv;
10131 }
10132
10133 SV *
10134 Perl_newSVavdefelem(pTHX_ AV *av, SSize_t ix, bool extendible)
10135 {
10136     SV * const lv = newSV_type(SVt_PVLV);
10137     PERL_ARGS_ASSERT_NEWSVAVDEFELEM;
10138     LvTYPE(lv) = 'y';
10139     sv_magic(lv, NULL, PERL_MAGIC_defelem, NULL, 0);
10140     LvTARG(lv) = SvREFCNT_inc_simple_NN(av);
10141     LvSTARGOFF(lv) = ix;
10142     LvTARGLEN(lv) = extendible ? 1 : (STRLEN)UV_MAX;
10143     return lv;
10144 }
10145
10146 /*
10147 =for apidoc sv_setref_pv
10148
10149 Copies a pointer into a new SV, optionally blessing the SV.  The C<rv>
10150 argument will be upgraded to an RV.  That RV will be modified to point to
10151 the new SV.  If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
10152 into the SV.  The C<classname> argument indicates the package for the
10153 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
10154 will have a reference count of 1, and the RV will be returned.
10155
10156 Do not use with other Perl types such as HV, AV, SV, CV, because those
10157 objects will become corrupted by the pointer copy process.
10158
10159 Note that C<sv_setref_pvn> copies the string while this copies the pointer.
10160
10161 =cut
10162 */
10163
10164 SV*
10165 Perl_sv_setref_pv(pTHX_ SV *const rv, const char *const classname, void *const pv)
10166 {
10167     PERL_ARGS_ASSERT_SV_SETREF_PV;
10168
10169     if (!pv) {
10170         sv_setsv(rv, &PL_sv_undef);
10171         SvSETMAGIC(rv);
10172     }
10173     else
10174         sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
10175     return rv;
10176 }
10177
10178 /*
10179 =for apidoc sv_setref_iv
10180
10181 Copies an integer into a new SV, optionally blessing the SV.  The C<rv>
10182 argument will be upgraded to an RV.  That RV will be modified to point to
10183 the new SV.  The C<classname> argument indicates the package for the
10184 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
10185 will have a reference count of 1, and the RV will be returned.
10186
10187 =cut
10188 */
10189
10190 SV*
10191 Perl_sv_setref_iv(pTHX_ SV *const rv, const char *const classname, const IV iv)
10192 {
10193     PERL_ARGS_ASSERT_SV_SETREF_IV;
10194
10195     sv_setiv(newSVrv(rv,classname), iv);
10196     return rv;
10197 }
10198
10199 /*
10200 =for apidoc sv_setref_uv
10201
10202 Copies an unsigned integer into a new SV, optionally blessing the SV.  The C<rv>
10203 argument will be upgraded to an RV.  That RV will be modified to point to
10204 the new SV.  The C<classname> argument indicates the package for the
10205 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
10206 will have a reference count of 1, and the RV will be returned.
10207
10208 =cut
10209 */
10210
10211 SV*
10212 Perl_sv_setref_uv(pTHX_ SV *const rv, const char *const classname, const UV uv)
10213 {
10214     PERL_ARGS_ASSERT_SV_SETREF_UV;
10215
10216     sv_setuv(newSVrv(rv,classname), uv);
10217     return rv;
10218 }
10219
10220 /*
10221 =for apidoc sv_setref_nv
10222
10223 Copies a double into a new SV, optionally blessing the SV.  The C<rv>
10224 argument will be upgraded to an RV.  That RV will be modified to point to
10225 the new SV.  The C<classname> argument indicates the package for the
10226 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
10227 will have a reference count of 1, and the RV will be returned.
10228
10229 =cut
10230 */
10231
10232 SV*
10233 Perl_sv_setref_nv(pTHX_ SV *const rv, const char *const classname, const NV nv)
10234 {
10235     PERL_ARGS_ASSERT_SV_SETREF_NV;
10236
10237     sv_setnv(newSVrv(rv,classname), nv);
10238     return rv;
10239 }
10240
10241 /*
10242 =for apidoc sv_setref_pvn
10243
10244 Copies a string into a new SV, optionally blessing the SV.  The length of the
10245 string must be specified with C<n>.  The C<rv> argument will be upgraded to
10246 an RV.  That RV will be modified to point to the new SV.  The C<classname>
10247 argument indicates the package for the blessing.  Set C<classname> to
10248 C<NULL> to avoid the blessing.  The new SV will have a reference count
10249 of 1, and the RV will be returned.
10250
10251 Note that C<sv_setref_pv> copies the pointer while this copies the string.
10252
10253 =cut
10254 */
10255
10256 SV*
10257 Perl_sv_setref_pvn(pTHX_ SV *const rv, const char *const classname,
10258                    const char *const pv, const STRLEN n)
10259 {
10260     PERL_ARGS_ASSERT_SV_SETREF_PVN;
10261
10262     sv_setpvn(newSVrv(rv,classname), pv, n);
10263     return rv;
10264 }
10265
10266 /*
10267 =for apidoc sv_bless
10268
10269 Blesses an SV into a specified package.  The SV must be an RV.  The package
10270 must be designated by its stash (see C<gv_stashpv()>).  The reference count
10271 of the SV is unaffected.
10272
10273 =cut
10274 */
10275
10276 SV*
10277 Perl_sv_bless(pTHX_ SV *const sv, HV *const stash)
10278 {
10279     SV *tmpRef;
10280     HV *oldstash = NULL;
10281
10282     PERL_ARGS_ASSERT_SV_BLESS;
10283
10284     SvGETMAGIC(sv);
10285     if (!SvROK(sv))
10286         Perl_croak(aTHX_ "Can't bless non-reference value");
10287     tmpRef = SvRV(sv);
10288     if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY|SVf_PROTECT)) {
10289         if (SvREADONLY(tmpRef))
10290             Perl_croak_no_modify();
10291         if (SvOBJECT(tmpRef)) {
10292             oldstash = SvSTASH(tmpRef);
10293         }
10294     }
10295     SvOBJECT_on(tmpRef);
10296     SvUPGRADE(tmpRef, SVt_PVMG);
10297     SvSTASH_set(tmpRef, MUTABLE_HV(SvREFCNT_inc_simple(stash)));
10298     SvREFCNT_dec(oldstash);
10299
10300     if(SvSMAGICAL(tmpRef))
10301         if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
10302             mg_set(tmpRef);
10303
10304
10305
10306     return sv;
10307 }
10308
10309 /* Downgrades a PVGV to a PVMG. If it's actually a PVLV, we leave the type
10310  * as it is after unglobbing it.
10311  */
10312
10313 PERL_STATIC_INLINE void
10314 S_sv_unglob(pTHX_ SV *const sv, U32 flags)
10315 {
10316     void *xpvmg;
10317     HV *stash;
10318     SV * const temp = flags & SV_COW_DROP_PV ? NULL : sv_newmortal();
10319
10320     PERL_ARGS_ASSERT_SV_UNGLOB;
10321
10322     assert(SvTYPE(sv) == SVt_PVGV || SvTYPE(sv) == SVt_PVLV);
10323     SvFAKE_off(sv);
10324     if (!(flags & SV_COW_DROP_PV))
10325         gv_efullname3(temp, MUTABLE_GV(sv), "*");
10326
10327     SvREFCNT_inc_simple_void_NN(sv_2mortal(sv));
10328     if (GvGP(sv)) {
10329         if(GvCVu((const GV *)sv) && (stash = GvSTASH(MUTABLE_GV(sv)))
10330            && HvNAME_get(stash))
10331             mro_method_changed_in(stash);
10332         gp_free(MUTABLE_GV(sv));
10333     }
10334     if (GvSTASH(sv)) {
10335         sv_del_backref(MUTABLE_SV(GvSTASH(sv)), sv);
10336         GvSTASH(sv) = NULL;
10337     }
10338     GvMULTI_off(sv);
10339     if (GvNAME_HEK(sv)) {
10340         unshare_hek(GvNAME_HEK(sv));
10341     }
10342     isGV_with_GP_off(sv);
10343
10344     if(SvTYPE(sv) == SVt_PVGV) {
10345         /* need to keep SvANY(sv) in the right arena */
10346         xpvmg = new_XPVMG();
10347         StructCopy(SvANY(sv), xpvmg, XPVMG);
10348         del_XPVGV(SvANY(sv));
10349         SvANY(sv) = xpvmg;
10350
10351         SvFLAGS(sv) &= ~SVTYPEMASK;
10352         SvFLAGS(sv) |= SVt_PVMG;
10353     }
10354
10355     /* Intentionally not calling any local SET magic, as this isn't so much a
10356        set operation as merely an internal storage change.  */
10357     if (flags & SV_COW_DROP_PV) SvOK_off(sv);
10358     else sv_setsv_flags(sv, temp, 0);
10359
10360     if ((const GV *)sv == PL_last_in_gv)
10361         PL_last_in_gv = NULL;
10362     else if ((const GV *)sv == PL_statgv)
10363         PL_statgv = NULL;
10364 }
10365
10366 /*
10367 =for apidoc sv_unref_flags
10368
10369 Unsets the RV status of the SV, and decrements the reference count of
10370 whatever was being referenced by the RV.  This can almost be thought of
10371 as a reversal of C<newSVrv>.  The C<cflags> argument can contain
10372 C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
10373 (otherwise the decrementing is conditional on the reference count being
10374 different from one or the reference being a readonly SV).
10375 See C<SvROK_off>.
10376
10377 =cut
10378 */
10379
10380 void
10381 Perl_sv_unref_flags(pTHX_ SV *const ref, const U32 flags)
10382 {
10383     SV* const target = SvRV(ref);
10384
10385     PERL_ARGS_ASSERT_SV_UNREF_FLAGS;
10386
10387     if (SvWEAKREF(ref)) {
10388         sv_del_backref(target, ref);
10389         SvWEAKREF_off(ref);
10390         SvRV_set(ref, NULL);
10391         return;
10392     }
10393     SvRV_set(ref, NULL);
10394     SvROK_off(ref);
10395     /* You can't have a || SvREADONLY(target) here, as $a = $$a, where $a was
10396        assigned to as BEGIN {$a = \"Foo"} will fail.  */
10397     if (SvREFCNT(target) != 1 || (flags & SV_IMMEDIATE_UNREF))
10398         SvREFCNT_dec_NN(target);
10399     else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
10400         sv_2mortal(target);     /* Schedule for freeing later */
10401 }
10402
10403 /*
10404 =for apidoc sv_untaint
10405
10406 Untaint an SV.  Use C<SvTAINTED_off> instead.
10407
10408 =cut
10409 */
10410
10411 void
10412 Perl_sv_untaint(pTHX_ SV *const sv)
10413 {
10414     PERL_ARGS_ASSERT_SV_UNTAINT;
10415     PERL_UNUSED_CONTEXT;
10416
10417     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
10418         MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
10419         if (mg)
10420             mg->mg_len &= ~1;
10421     }
10422 }
10423
10424 /*
10425 =for apidoc sv_tainted
10426
10427 Test an SV for taintedness.  Use C<SvTAINTED> instead.
10428
10429 =cut
10430 */
10431
10432 bool
10433 Perl_sv_tainted(pTHX_ SV *const sv)
10434 {
10435     PERL_ARGS_ASSERT_SV_TAINTED;
10436     PERL_UNUSED_CONTEXT;
10437
10438     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
10439         const MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
10440         if (mg && (mg->mg_len & 1) )
10441             return TRUE;
10442     }
10443     return FALSE;
10444 }
10445
10446 /*
10447 =for apidoc sv_setpviv
10448
10449 Copies an integer into the given SV, also updating its string value.
10450 Does not handle 'set' magic.  See C<sv_setpviv_mg>.
10451
10452 =cut
10453 */
10454
10455 void
10456 Perl_sv_setpviv(pTHX_ SV *const sv, const IV iv)
10457 {
10458     char buf[TYPE_CHARS(UV)];
10459     char *ebuf;
10460     char * const ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
10461
10462     PERL_ARGS_ASSERT_SV_SETPVIV;
10463
10464     sv_setpvn(sv, ptr, ebuf - ptr);
10465 }
10466
10467 /*
10468 =for apidoc sv_setpviv_mg
10469
10470 Like C<sv_setpviv>, but also handles 'set' magic.
10471
10472 =cut
10473 */
10474
10475 void
10476 Perl_sv_setpviv_mg(pTHX_ SV *const sv, const IV iv)
10477 {
10478     PERL_ARGS_ASSERT_SV_SETPVIV_MG;
10479
10480     sv_setpviv(sv, iv);
10481     SvSETMAGIC(sv);
10482 }
10483
10484 #if defined(PERL_IMPLICIT_CONTEXT)
10485
10486 /* pTHX_ magic can't cope with varargs, so this is a no-context
10487  * version of the main function, (which may itself be aliased to us).
10488  * Don't access this version directly.
10489  */
10490
10491 void
10492 Perl_sv_setpvf_nocontext(SV *const sv, const char *const pat, ...)
10493 {
10494     dTHX;
10495     va_list args;
10496
10497     PERL_ARGS_ASSERT_SV_SETPVF_NOCONTEXT;
10498
10499     va_start(args, pat);
10500     sv_vsetpvf(sv, pat, &args);
10501     va_end(args);
10502 }
10503
10504 /* pTHX_ magic can't cope with varargs, so this is a no-context
10505  * version of the main function, (which may itself be aliased to us).
10506  * Don't access this version directly.
10507  */
10508
10509 void
10510 Perl_sv_setpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
10511 {
10512     dTHX;
10513     va_list args;
10514
10515     PERL_ARGS_ASSERT_SV_SETPVF_MG_NOCONTEXT;
10516
10517     va_start(args, pat);
10518     sv_vsetpvf_mg(sv, pat, &args);
10519     va_end(args);
10520 }
10521 #endif
10522
10523 /*
10524 =for apidoc sv_setpvf
10525
10526 Works like C<sv_catpvf> but copies the text into the SV instead of
10527 appending it.  Does not handle 'set' magic.  See C<sv_setpvf_mg>.
10528
10529 =cut
10530 */
10531
10532 void
10533 Perl_sv_setpvf(pTHX_ SV *const sv, const char *const pat, ...)
10534 {
10535     va_list args;
10536
10537     PERL_ARGS_ASSERT_SV_SETPVF;
10538
10539     va_start(args, pat);
10540     sv_vsetpvf(sv, pat, &args);
10541     va_end(args);
10542 }
10543
10544 /*
10545 =for apidoc sv_vsetpvf
10546
10547 Works like C<sv_vcatpvf> but copies the text into the SV instead of
10548 appending it.  Does not handle 'set' magic.  See C<sv_vsetpvf_mg>.
10549
10550 Usually used via its frontend C<sv_setpvf>.
10551
10552 =cut
10553 */
10554
10555 void
10556 Perl_sv_vsetpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args)
10557 {
10558     PERL_ARGS_ASSERT_SV_VSETPVF;
10559
10560     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
10561 }
10562
10563 /*
10564 =for apidoc sv_setpvf_mg
10565
10566 Like C<sv_setpvf>, but also handles 'set' magic.
10567
10568 =cut
10569 */
10570
10571 void
10572 Perl_sv_setpvf_mg(pTHX_ SV *const sv, const char *const pat, ...)
10573 {
10574     va_list args;
10575
10576     PERL_ARGS_ASSERT_SV_SETPVF_MG;
10577
10578     va_start(args, pat);
10579     sv_vsetpvf_mg(sv, pat, &args);
10580     va_end(args);
10581 }
10582
10583 /*
10584 =for apidoc sv_vsetpvf_mg
10585
10586 Like C<sv_vsetpvf>, but also handles 'set' magic.
10587
10588 Usually used via its frontend C<sv_setpvf_mg>.
10589
10590 =cut
10591 */
10592
10593 void
10594 Perl_sv_vsetpvf_mg(pTHX_ SV *const sv, const char *const pat, va_list *const args)
10595 {
10596     PERL_ARGS_ASSERT_SV_VSETPVF_MG;
10597
10598     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
10599     SvSETMAGIC(sv);
10600 }
10601
10602 #if defined(PERL_IMPLICIT_CONTEXT)
10603
10604 /* pTHX_ magic can't cope with varargs, so this is a no-context
10605  * version of the main function, (which may itself be aliased to us).
10606  * Don't access this version directly.
10607  */
10608
10609 void
10610 Perl_sv_catpvf_nocontext(SV *const sv, const char *const pat, ...)
10611 {
10612     dTHX;
10613     va_list args;
10614
10615     PERL_ARGS_ASSERT_SV_CATPVF_NOCONTEXT;
10616
10617     va_start(args, pat);
10618     sv_vcatpvfn_flags(sv, pat, strlen(pat), &args, NULL, 0, NULL, SV_GMAGIC|SV_SMAGIC);
10619     va_end(args);
10620 }
10621
10622 /* pTHX_ magic can't cope with varargs, so this is a no-context
10623  * version of the main function, (which may itself be aliased to us).
10624  * Don't access this version directly.
10625  */
10626
10627 void
10628 Perl_sv_catpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
10629 {
10630     dTHX;
10631     va_list args;
10632
10633     PERL_ARGS_ASSERT_SV_CATPVF_MG_NOCONTEXT;
10634
10635     va_start(args, pat);
10636     sv_vcatpvfn_flags(sv, pat, strlen(pat), &args, NULL, 0, NULL, SV_GMAGIC|SV_SMAGIC);
10637     SvSETMAGIC(sv);
10638     va_end(args);
10639 }
10640 #endif
10641
10642 /*
10643 =for apidoc sv_catpvf
10644
10645 Processes its arguments like C<sprintf> and appends the formatted
10646 output to an SV.  If the appended data contains "wide" characters
10647 (including, but not limited to, SVs with a UTF-8 PV formatted with %s,
10648 and characters >255 formatted with %c), the original SV might get
10649 upgraded to UTF-8.  Handles 'get' magic, but not 'set' magic.  See
10650 C<sv_catpvf_mg>.  If the original SV was UTF-8, the pattern should be
10651 valid UTF-8; if the original SV was bytes, the pattern should be too.
10652
10653 =cut */
10654
10655 void
10656 Perl_sv_catpvf(pTHX_ SV *const sv, const char *const pat, ...)
10657 {
10658     va_list args;
10659
10660     PERL_ARGS_ASSERT_SV_CATPVF;
10661
10662     va_start(args, pat);
10663     sv_vcatpvfn_flags(sv, pat, strlen(pat), &args, NULL, 0, NULL, SV_GMAGIC|SV_SMAGIC);
10664     va_end(args);
10665 }
10666
10667 /*
10668 =for apidoc sv_vcatpvf
10669
10670 Processes its arguments like C<vsprintf> and appends the formatted output
10671 to an SV.  Does not handle 'set' magic.  See C<sv_vcatpvf_mg>.
10672
10673 Usually used via its frontend C<sv_catpvf>.
10674
10675 =cut
10676 */
10677
10678 void
10679 Perl_sv_vcatpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args)
10680 {
10681     PERL_ARGS_ASSERT_SV_VCATPVF;
10682
10683     sv_vcatpvfn_flags(sv, pat, strlen(pat), args, NULL, 0, NULL, SV_GMAGIC|SV_SMAGIC);
10684 }
10685
10686 /*
10687 =for apidoc sv_catpvf_mg
10688
10689 Like C<sv_catpvf>, but also handles 'set' magic.
10690
10691 =cut
10692 */
10693
10694 void
10695 Perl_sv_catpvf_mg(pTHX_ SV *const sv, const char *const pat, ...)
10696 {
10697     va_list args;
10698
10699     PERL_ARGS_ASSERT_SV_CATPVF_MG;
10700
10701     va_start(args, pat);
10702     sv_vcatpvfn_flags(sv, pat, strlen(pat), &args, NULL, 0, NULL, SV_GMAGIC|SV_SMAGIC);
10703     SvSETMAGIC(sv);
10704     va_end(args);
10705 }
10706
10707 /*
10708 =for apidoc sv_vcatpvf_mg
10709
10710 Like C<sv_vcatpvf>, but also handles 'set' magic.
10711
10712 Usually used via its frontend C<sv_catpvf_mg>.
10713
10714 =cut
10715 */
10716
10717 void
10718 Perl_sv_vcatpvf_mg(pTHX_ SV *const sv, const char *const pat, va_list *const args)
10719 {
10720     PERL_ARGS_ASSERT_SV_VCATPVF_MG;
10721
10722     sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
10723     SvSETMAGIC(sv);
10724 }
10725
10726 /*
10727 =for apidoc sv_vsetpvfn
10728
10729 Works like C<sv_vcatpvfn> but copies the text into the SV instead of
10730 appending it.
10731
10732 Usually used via one of its frontends C<sv_vsetpvf> and C<sv_vsetpvf_mg>.
10733
10734 =cut
10735 */
10736
10737 void
10738 Perl_sv_vsetpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
10739                  va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted)
10740 {
10741     PERL_ARGS_ASSERT_SV_VSETPVFN;
10742
10743     sv_setpvs(sv, "");
10744     sv_vcatpvfn_flags(sv, pat, patlen, args, svargs, svmax, maybe_tainted, 0);
10745 }
10746
10747
10748 /*
10749  * Warn of missing argument to sprintf, and then return a defined value
10750  * to avoid inappropriate "use of uninit" warnings [perl #71000].
10751  */
10752 STATIC SV*
10753 S_vcatpvfn_missing_argument(pTHX) {
10754     if (ckWARN(WARN_MISSING)) {
10755         Perl_warner(aTHX_ packWARN(WARN_MISSING), "Missing argument in %s",
10756                 PL_op ? OP_DESC(PL_op) : "sv_vcatpvfn()");
10757     }
10758     return &PL_sv_no;
10759 }
10760
10761
10762 STATIC I32
10763 S_expect_number(pTHX_ char **const pattern)
10764 {
10765     I32 var = 0;
10766
10767     PERL_ARGS_ASSERT_EXPECT_NUMBER;
10768
10769     switch (**pattern) {
10770     case '1': case '2': case '3':
10771     case '4': case '5': case '6':
10772     case '7': case '8': case '9':
10773         var = *(*pattern)++ - '0';
10774         while (isDIGIT(**pattern)) {
10775             const I32 tmp = var * 10 + (*(*pattern)++ - '0');
10776             if (tmp < var)
10777                 Perl_croak(aTHX_ "Integer overflow in format string for %s", (PL_op ? OP_DESC(PL_op) : "sv_vcatpvfn"));
10778             var = tmp;
10779         }
10780     }
10781     return var;
10782 }
10783
10784 STATIC char *
10785 S_F0convert(NV nv, char *const endbuf, STRLEN *const len)
10786 {
10787     const int neg = nv < 0;
10788     UV uv;
10789
10790     PERL_ARGS_ASSERT_F0CONVERT;
10791
10792     if (UNLIKELY(Perl_isinfnan(nv))) {
10793         STRLEN n = S_infnan_2pv(nv, endbuf - *len, *len, 0);
10794         *len = n;
10795         return endbuf - n;
10796     }
10797     if (neg)
10798         nv = -nv;
10799     if (nv < UV_MAX) {
10800         char *p = endbuf;
10801         nv += 0.5;
10802         uv = (UV)nv;
10803         if (uv & 1 && uv == nv)
10804             uv--;                       /* Round to even */
10805         do {
10806             const unsigned dig = uv % 10;
10807             *--p = '0' + dig;
10808         } while (uv /= 10);
10809         if (neg)
10810             *--p = '-';
10811         *len = endbuf - p;
10812         return p;
10813     }
10814     return NULL;
10815 }
10816
10817
10818 /*
10819 =for apidoc sv_vcatpvfn
10820
10821 =for apidoc sv_vcatpvfn_flags
10822
10823 Processes its arguments like C<vsprintf> and appends the formatted output
10824 to an SV.  Uses an array of SVs if the C style variable argument list is
10825 missing (NULL).  When running with taint checks enabled, indicates via
10826 C<maybe_tainted> if results are untrustworthy (often due to the use of
10827 locales).
10828
10829 If called as C<sv_vcatpvfn> or flags include C<SV_GMAGIC>, calls get magic.
10830
10831 Usually used via one of its frontends C<sv_vcatpvf> and C<sv_vcatpvf_mg>.
10832
10833 =cut
10834 */
10835
10836 #define VECTORIZE_ARGS  vecsv = va_arg(*args, SV*);\
10837                         vecstr = (U8*)SvPV_const(vecsv,veclen);\
10838                         vec_utf8 = DO_UTF8(vecsv);
10839
10840 /* XXX maybe_tainted is never assigned to, so the doc above is lying. */
10841
10842 void
10843 Perl_sv_vcatpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
10844                  va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted)
10845 {
10846     PERL_ARGS_ASSERT_SV_VCATPVFN;
10847
10848     sv_vcatpvfn_flags(sv, pat, patlen, args, svargs, svmax, maybe_tainted, SV_GMAGIC|SV_SMAGIC);
10849 }
10850
10851 #ifdef LONGDOUBLE_DOUBLEDOUBLE
10852 /* The first double can be as large as 2**1023, or '1' x '0' x 1023.
10853  * The second double can be as small as 2**-1074, or '0' x 1073 . '1'.
10854  * The sum of them can be '1' . '0' x 2096 . '1', with implied radix point
10855  * after the first 1023 zero bits.
10856  *
10857  * XXX The 2098 is quite large (262.25 bytes) and therefore some sort
10858  * of dynamically growing buffer might be better, start at just 16 bytes
10859  * (for example) and grow only when necessary.  Or maybe just by looking
10860  * at the exponents of the two doubles? */
10861 #  define DOUBLEDOUBLE_MAXBITS 2098
10862 #endif
10863
10864 /* vhex will contain the values (0..15) of the hex digits ("nybbles"
10865  * of 4 bits); 1 for the implicit 1, and the mantissa bits, four bits
10866  * per xdigit.  For the double-double case, this can be rather many.
10867  * The non-double-double-long-double overshoots since all bits of NV
10868  * are not mantissa bits, there are also exponent bits. */
10869 #ifdef LONGDOUBLE_DOUBLEDOUBLE
10870 #  define VHEX_SIZE (1+DOUBLEDOUBLE_MAXBITS/4)
10871 #else
10872 #  define VHEX_SIZE (1+(NVSIZE * 8)/4)
10873 #endif
10874
10875 /* If we do not have a known long double format, (including not using
10876  * long doubles, or long doubles being equal to doubles) then we will
10877  * fall back to the ldexp/frexp route, with which we can retrieve at
10878  * most as many bits as our widest unsigned integer type is.  We try
10879  * to get a 64-bit unsigned integer even if we are not using a 64-bit UV.
10880  *
10881  * (If you want to test the case of UVSIZE == 4, NVSIZE == 8,
10882  *  set the MANTISSATYPE to int and the MANTISSASIZE to 4.)
10883  */
10884 #if defined(HAS_QUAD) && defined(Uquad_t)
10885 #  define MANTISSATYPE Uquad_t
10886 #  define MANTISSASIZE 8
10887 #else
10888 #  define MANTISSATYPE UV
10889 #  define MANTISSASIZE UVSIZE
10890 #endif
10891
10892 #if defined(DOUBLE_LITTLE_ENDIAN) || defined(LONGDOUBLE_LITTLE_ENDIAN)
10893 #  define HEXTRACT_LITTLE_ENDIAN
10894 #elif defined(DOUBLE_BIG_ENDIAN) || defined(LONGDOUBLE_BIG_ENDIAN)
10895 #  define HEXTRACT_BIG_ENDIAN
10896 #else
10897 #  define HEXTRACT_MIX_ENDIAN
10898 #endif
10899
10900 /* S_hextract() is a helper for Perl_sv_vcatpvfn_flags, for extracting
10901  * the hexadecimal values (for %a/%A).  The nv is the NV where the value
10902  * are being extracted from (either directly from the long double in-memory
10903  * presentation, or from the uquad computed via frexp+ldexp).  frexp also
10904  * is used to update the exponent.  vhex is the pointer to the beginning
10905  * of the output buffer (of VHEX_SIZE).
10906  *
10907  * The tricky part is that S_hextract() needs to be called twice:
10908  * the first time with vend as NULL, and the second time with vend as
10909  * the pointer returned by the first call.  What happens is that on
10910  * the first round the output size is computed, and the intended
10911  * extraction sanity checked.  On the second round the actual output
10912  * (the extraction of the hexadecimal values) takes place.
10913  * Sanity failures cause fatal failures during both rounds. */
10914 STATIC U8*
10915 S_hextract(pTHX_ const NV nv, int* exponent, U8* vhex, U8* vend)
10916 {
10917     U8* v = vhex;
10918     int ix;
10919     int ixmin = 0, ixmax = 0;
10920
10921     /* XXX Inf/NaN/denormal handling in the HEXTRACT_IMPLICIT_BIT,
10922      * and elsewhere. */
10923
10924     /* These macros are just to reduce typos, they have multiple
10925      * repetitions below, but usually only one (or sometimes two)
10926      * of them is really being used. */
10927     /* HEXTRACT_OUTPUT() extracts the high nybble first. */
10928 #define HEXTRACT_OUTPUT_HI(ix) (*v++ = nvp[ix] >> 4)
10929 #define HEXTRACT_OUTPUT_LO(ix) (*v++ = nvp[ix] & 0xF)
10930 #define HEXTRACT_OUTPUT(ix) \
10931     STMT_START { \
10932       HEXTRACT_OUTPUT_HI(ix); HEXTRACT_OUTPUT_LO(ix); \
10933    } STMT_END
10934 #define HEXTRACT_COUNT(ix, c) \
10935     STMT_START { \
10936       v += c; if (ix < ixmin) ixmin = ix; else if (ix > ixmax) ixmax = ix; \
10937    } STMT_END
10938 #define HEXTRACT_BYTE(ix) \
10939     STMT_START { \
10940       if (vend) HEXTRACT_OUTPUT(ix); else HEXTRACT_COUNT(ix, 2); \
10941    } STMT_END
10942 #define HEXTRACT_LO_NYBBLE(ix) \
10943     STMT_START { \
10944       if (vend) HEXTRACT_OUTPUT_LO(ix); else HEXTRACT_COUNT(ix, 1); \
10945    } STMT_END
10946     /* HEXTRACT_TOP_NYBBLE is just convenience disguise,
10947      * to make it look less odd when the top bits of a NV
10948      * are extracted using HEXTRACT_LO_NYBBLE: the highest
10949      * order bits can be in the "low nybble" of a byte. */
10950 #define HEXTRACT_TOP_NYBBLE(ix) HEXTRACT_LO_NYBBLE(ix)
10951 #define HEXTRACT_BYTES_LE(a, b) \
10952     for (ix = a; ix >= b; ix--) { HEXTRACT_BYTE(ix); }
10953 #define HEXTRACT_BYTES_BE(a, b) \
10954     for (ix = a; ix <= b; ix++) { HEXTRACT_BYTE(ix); }
10955 #define HEXTRACT_IMPLICIT_BIT(nv) \
10956     STMT_START { \
10957         if (vend) *v++ = ((nv) == 0.0) ? 0 : 1; else v++; \
10958    } STMT_END
10959
10960 /* Most formats do.  Those which don't should undef this. */
10961 #define HEXTRACT_HAS_IMPLICIT_BIT
10962 /* Many formats do.  Those which don't should undef this. */
10963 #define HEXTRACT_HAS_TOP_NYBBLE
10964
10965     /* HEXTRACTSIZE is the maximum number of xdigits. */
10966 #if defined(USE_LONG_DOUBLE) && defined(LONGDOUBLE_DOUBLEDOUBLE)
10967 #  define HEXTRACTSIZE (DOUBLEDOUBLE_MAXBITS/4)
10968 #else
10969 #  define HEXTRACTSIZE 2 * NVSIZE
10970 #endif
10971
10972     const U8* vmaxend = vhex + HEXTRACTSIZE;
10973     PERL_UNUSED_VAR(ix); /* might happen */
10974     (void)Perl_frexp(PERL_ABS(nv), exponent);
10975     if (vend && (vend <= vhex || vend > vmaxend))
10976         Perl_croak(aTHX_ "Hexadecimal float: internal error");
10977     {
10978         /* First check if using long doubles. */
10979 #if defined(USE_LONG_DOUBLE) && (NVSIZE > DOUBLESIZE)
10980 #  if LONG_DOUBLEKIND == LONG_DOUBLE_IS_IEEE_754_128_BIT_LITTLE_ENDIAN
10981         /* Used in e.g. VMS and HP-UX IA-64, e.g. -0.1L:
10982          * 9a 99 99 99 99 99 99 99 99 99 99 99 99 99 fb 3f */
10983         /* The bytes 13..0 are the mantissa/fraction,
10984          * the 15,14 are the sign+exponent. */
10985         const U8* nvp = (const U8*)(&nv);
10986         HEXTRACT_IMPLICIT_BIT(nv);
10987 #   undef HEXTRACT_HAS_TOP_NYBBLE
10988         HEXTRACT_BYTES_LE(13, 0);
10989 #  elif LONG_DOUBLEKIND == LONG_DOUBLE_IS_IEEE_754_128_BIT_BIG_ENDIAN
10990         /* Used in e.g. Solaris Sparc and HP-UX PA-RISC, e.g. -0.1L:
10991          * bf fb 99 99 99 99 99 99 99 99 99 99 99 99 99 9a */
10992         /* The bytes 2..15 are the mantissa/fraction,
10993          * the 0,1 are the sign+exponent. */
10994         const U8* nvp = (const U8*)(&nv);
10995         HEXTRACT_IMPLICIT_BIT(nv);
10996 #   undef HEXTRACT_HAS_TOP_NYBBLE
10997         HEXTRACT_BYTES_BE(2, 15);
10998 #  elif LONG_DOUBLEKIND == LONG_DOUBLE_IS_X86_80_BIT_LITTLE_ENDIAN
10999         /* x86 80-bit "extended precision", 64 bits of mantissa / fraction /
11000          * significand, 15 bits of exponent, 1 bit of sign.  NVSIZE can
11001          * be either 12 (ILP32, Solaris x86) or 16 (LP64, Linux and OS X),
11002          * meaning that 2 or 6 bytes are empty padding. */
11003         /* The bytes 7..0 are the mantissa/fraction */
11004         const U8* nvp = (const U8*)(&nv);
11005 #    undef HEXTRACT_HAS_IMPLICIT_BIT
11006 #    undef HEXTRACT_HAS_TOP_NYBBLE
11007         HEXTRACT_BYTES_LE(7, 0);
11008 #  elif LONG_DOUBLEKIND == LONG_DOUBLE_IS_X86_80_BIT_BIG_ENDIAN
11009         /* Does this format ever happen? (Wikipedia says the Motorola
11010          * 6888x math coprocessors used format _like_ this but padded
11011          * to 96 bits with 16 unused bits between the exponent and the
11012          * mantissa.) */
11013         const U8* nvp = (const U8*)(&nv);
11014 #    undef HEXTRACT_HAS_IMPLICIT_BIT
11015 #    undef HEXTRACT_HAS_TOP_NYBBLE
11016         HEXTRACT_BYTES_BE(0, 7);
11017 #  else
11018 #    define HEXTRACT_FALLBACK
11019         /* Double-double format: two doubles next to each other.
11020          * The first double is the high-order one, exactly like
11021          * it would be for a "lone" double.  The second double
11022          * is shifted down using the exponent so that that there
11023          * are no common bits.  The tricky part is that the value
11024          * of the double-double is the SUM of the two doubles and
11025          * the second one can be also NEGATIVE.
11026          *
11027          * Because of this tricky construction the bytewise extraction we
11028          * use for the other long double formats doesn't work, we must
11029          * extract the values bit by bit.
11030          *
11031          * The little-endian double-double is used .. somewhere?
11032          *
11033          * The big endian double-double is used in e.g. PPC/Power (AIX)
11034          * and MIPS (SGI).
11035          *
11036          * The mantissa bits are in two separate stretches, e.g. for -0.1L:
11037          * 9a 99 99 99 99 99 59 bc 9a 99 99 99 99 99 b9 3f (LE)
11038          * 3f b9 99 99 99 99 99 9a bc 59 99 99 99 99 99 9a (BE)
11039          */
11040 #  endif
11041 #else /* #if defined(USE_LONG_DOUBLE) && (NVSIZE > DOUBLESIZE) */
11042         /* Using normal doubles, not long doubles.
11043          *
11044          * We generate 4-bit xdigits (nybble/nibble) instead of 8-bit
11045          * bytes, since we might need to handle printf precision, and
11046          * also need to insert the radix. */
11047 #  if NVSIZE == 8
11048 #    ifdef HEXTRACT_LITTLE_ENDIAN
11049         /* 0 1 2 3 4 5 6 7 (MSB = 7, LSB = 0, 6+7 = exponent+sign) */
11050         const U8* nvp = (const U8*)(&nv);
11051         HEXTRACT_IMPLICIT_BIT(nv);
11052         HEXTRACT_TOP_NYBBLE(6);
11053         HEXTRACT_BYTES_LE(5, 0);
11054 #    elif defined(HEXTRACT_BIG_ENDIAN)
11055         /* 7 6 5 4 3 2 1 0 (MSB = 7, LSB = 0, 6+7 = exponent+sign) */
11056         const U8* nvp = (const U8*)(&nv);
11057         HEXTRACT_IMPLICIT_BIT(nv);
11058         HEXTRACT_TOP_NYBBLE(1);
11059         HEXTRACT_BYTES_BE(2, 7);
11060 #    elif DOUBLEKIND == DOUBLE_IS_IEEE_754_64_BIT_MIXED_ENDIAN_LE_BE
11061         /* 4 5 6 7 0 1 2 3 (MSB = 7, LSB = 0, 6:7 = nybble:exponent:sign) */
11062         const U8* nvp = (const U8*)(&nv);
11063         HEXTRACT_IMPLICIT_BIT(nv);
11064         HEXTRACT_TOP_NYBBLE(2); /* 6 */
11065         HEXTRACT_BYTE(1); /* 5 */
11066         HEXTRACT_BYTE(0); /* 4 */
11067         HEXTRACT_BYTE(7); /* 3 */
11068         HEXTRACT_BYTE(6); /* 2 */
11069         HEXTRACT_BYTE(5); /* 1 */
11070         HEXTRACT_BYTE(4); /* 0 */
11071 #    elif DOUBLEKIND == DOUBLE_IS_IEEE_754_64_BIT_MIXED_ENDIAN_BE_LE
11072         /* 3 2 1 0 7 6 5 4 (MSB = 7, LSB = 0, 7:6 = sign:exponent:nybble) */
11073         const U8* nvp = (const U8*)(&nv);
11074         HEXTRACT_IMPLICIT_BIT(nv);
11075         HEXTRACT_TOP_NYBBLE(5); /* 6 */
11076         HEXTRACT_BYTE(6); /* 5 */
11077         HEXTRACT_BYTE(7); /* 4 */
11078         HEXTRACT_BYTE(0); /* 3 */
11079         HEXTRACT_BYTE(1); /* 2 */
11080         HEXTRACT_BYTE(2); /* 1 */
11081         HEXTRACT_BYTE(3); /* 0 */
11082 #    else
11083 #      define HEXTRACT_FALLBACK
11084 #    endif
11085 #  else
11086 #    define HEXTRACT_FALLBACK
11087 #  endif
11088 #endif /* #if defined(USE_LONG_DOUBLE) && (NVSIZE > DOUBLESIZE) #else */
11089 #  ifdef HEXTRACT_FALLBACK
11090 #    undef HEXTRACT_HAS_TOP_NYBBLE /* Meaningless, but consistent. */
11091         /* The fallback is used for the double-double format, and
11092          * for unknown long double formats, and for unknown double
11093          * formats, or in general unknown NV formats. */
11094         if (nv == (NV)0.0) {
11095             if (vend)
11096                 *v++ = 0;
11097             else
11098                 v++;
11099             *exponent = 0;
11100         }
11101         else {
11102             NV d = nv < 0 ? -nv : nv;
11103             NV e = (NV)1.0;
11104             U8 ha = 0x0; /* hexvalue accumulator */
11105             U8 hd = 0x8; /* hexvalue digit */
11106
11107             /* Shift d and e (and update exponent) so that e <= d < 2*e,
11108              * this is essentially manual frexp(). Multiplying by 0.5 and
11109              * doubling should be lossless in binary floating point. */
11110
11111             *exponent = 1;
11112
11113             while (e > d) {
11114                 e *= (NV)0.5;
11115                 (*exponent)--;
11116             }
11117             /* Now d >= e */
11118
11119             while (d >= e + e) {
11120                 e += e;
11121                 (*exponent)++;
11122             }
11123             /* Now e <= d < 2*e */
11124
11125             /* First extract the leading hexdigit (the implicit bit). */
11126             if (d >= e) {
11127                 d -= e;
11128                 if (vend)
11129                     *v++ = 1;
11130                 else
11131                     v++;
11132             }
11133             else {
11134                 if (vend)
11135                     *v++ = 0;
11136                 else
11137                     v++;
11138             }
11139             e *= (NV)0.5;
11140
11141             /* Then extract the remaining hexdigits. */
11142             while (d > (NV)0.0) {
11143                 if (d >= e) {
11144                     ha |= hd;
11145                     d -= e;
11146                 }
11147                 if (hd == 1) {
11148                     /* Output or count in groups of four bits,
11149                      * that is, when the hexdigit is down to one. */
11150                     if (vend)
11151                         *v++ = ha;
11152                     else
11153                         v++;
11154                     /* Reset the hexvalue. */
11155                     ha = 0x0;
11156                     hd = 0x8;
11157                 }
11158                 else
11159                     hd >>= 1;
11160                 e *= (NV)0.5;
11161             }
11162
11163             /* Flush possible pending hexvalue. */
11164             if (ha) {
11165                 if (vend)
11166                     *v++ = ha;
11167                 else
11168                     v++;
11169             }
11170         }
11171 #  endif
11172     }
11173     /* Croak for various reasons: if the output pointer escaped the
11174      * output buffer, if the extraction index escaped the extraction
11175      * buffer, or if the ending output pointer didn't match the
11176      * previously computed value. */
11177     if (v <= vhex || v - vhex >= VHEX_SIZE ||
11178         /* For double-double the ixmin and ixmax stay at zero,
11179          * which is convenient since the HEXTRACTSIZE is tricky
11180          * for double-double. */
11181         ixmin < 0 || ixmax >= NVSIZE ||
11182         (vend && v != vend))
11183         Perl_croak(aTHX_ "Hexadecimal float: internal error");
11184     return v;
11185 }
11186
11187 void
11188 Perl_sv_vcatpvfn_flags(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
11189                        va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted,
11190                        const U32 flags)
11191 {
11192     char *p;
11193     char *q;
11194     const char *patend;
11195     STRLEN origlen;
11196     I32 svix = 0;
11197     static const char nullstr[] = "(null)";
11198     SV *argsv = NULL;
11199     bool has_utf8 = DO_UTF8(sv);    /* has the result utf8? */
11200     const bool pat_utf8 = has_utf8; /* the pattern is in utf8? */
11201     SV *nsv = NULL;
11202     /* Times 4: a decimal digit takes more than 3 binary digits.
11203      * NV_DIG: mantissa takes than many decimal digits.
11204      * Plus 32: Playing safe. */
11205     char ebuf[IV_DIG * 4 + NV_DIG + 32];
11206     bool no_redundant_warning = FALSE; /* did we use any explicit format parameter index? */
11207     bool hexfp = FALSE; /* hexadecimal floating point? */
11208
11209     DECLARATION_FOR_LC_NUMERIC_MANIPULATION;
11210
11211     PERL_ARGS_ASSERT_SV_VCATPVFN_FLAGS;
11212     PERL_UNUSED_ARG(maybe_tainted);
11213
11214     if (flags & SV_GMAGIC)
11215         SvGETMAGIC(sv);
11216
11217     /* no matter what, this is a string now */
11218     (void)SvPV_force_nomg(sv, origlen);
11219
11220     /* special-case "", "%s", and "%-p" (SVf - see below) */
11221     if (patlen == 0) {
11222         if (svmax && ckWARN(WARN_REDUNDANT))
11223             Perl_warner(aTHX_ packWARN(WARN_REDUNDANT), "Redundant argument in %s",
11224                         PL_op ? OP_DESC(PL_op) : "sv_vcatpvfn()");
11225         return;
11226     }
11227     if (patlen == 2 && pat[0] == '%' && pat[1] == 's') {
11228         if (svmax > 1 && ckWARN(WARN_REDUNDANT))
11229             Perl_warner(aTHX_ packWARN(WARN_REDUNDANT), "Redundant argument in %s",
11230                         PL_op ? OP_DESC(PL_op) : "sv_vcatpvfn()");
11231
11232         if (args) {
11233             const char * const s = va_arg(*args, char*);
11234             sv_catpv_nomg(sv, s ? s : nullstr);
11235         }
11236         else if (svix < svmax) {
11237             /* we want get magic on the source but not the target. sv_catsv can't do that, though */
11238             SvGETMAGIC(*svargs);
11239             sv_catsv_nomg(sv, *svargs);
11240         }
11241         else
11242             S_vcatpvfn_missing_argument(aTHX);
11243         return;
11244     }
11245     if (args && patlen == 3 && pat[0] == '%' &&
11246                 pat[1] == '-' && pat[2] == 'p') {
11247         if (svmax > 1 && ckWARN(WARN_REDUNDANT))
11248             Perl_warner(aTHX_ packWARN(WARN_REDUNDANT), "Redundant argument in %s",
11249                         PL_op ? OP_DESC(PL_op) : "sv_vcatpvfn()");
11250         argsv = MUTABLE_SV(va_arg(*args, void*));
11251         sv_catsv_nomg(sv, argsv);
11252         return;
11253     }
11254
11255 #if !defined(USE_LONG_DOUBLE) && !defined(USE_QUADMATH)
11256     /* special-case "%.<number>[gf]" */
11257     if ( !args && patlen <= 5 && pat[0] == '%' && pat[1] == '.'
11258          && (pat[patlen-1] == 'g' || pat[patlen-1] == 'f') ) {
11259         unsigned digits = 0;
11260         const char *pp;
11261
11262         pp = pat + 2;
11263         while (*pp >= '0' && *pp <= '9')
11264             digits = 10 * digits + (*pp++ - '0');
11265
11266         /* XXX: Why do this `svix < svmax` test? Couldn't we just
11267            format the first argument and WARN_REDUNDANT if svmax > 1?
11268            Munged by Nicholas Clark in v5.13.0-209-g95ea86d */
11269         if (pp - pat == (int)patlen - 1 && svix < svmax) {
11270             const NV nv = SvNV(*svargs);
11271             if (LIKELY(!Perl_isinfnan(nv))) {
11272                 if (*pp == 'g') {
11273                     /* Add check for digits != 0 because it seems that some
11274                        gconverts are buggy in this case, and we don't yet have
11275                        a Configure test for this.  */
11276                     if (digits && digits < sizeof(ebuf) - NV_DIG - 10) {
11277                         /* 0, point, slack */
11278                         STORE_LC_NUMERIC_SET_TO_NEEDED();
11279                         SNPRINTF_G(nv, ebuf, size, digits);
11280                         sv_catpv_nomg(sv, ebuf);
11281                         if (*ebuf)      /* May return an empty string for digits==0 */
11282                             return;
11283                     }
11284                 } else if (!digits) {
11285                     STRLEN l;
11286
11287                     if ((p = F0convert(nv, ebuf + sizeof ebuf, &l))) {
11288                         sv_catpvn_nomg(sv, p, l);
11289                         return;
11290                     }
11291                 }
11292             }
11293         }
11294     }
11295 #endif /* !USE_LONG_DOUBLE */
11296
11297     if (!args && svix < svmax && DO_UTF8(*svargs))
11298         has_utf8 = TRUE;
11299
11300     patend = (char*)pat + patlen;
11301     for (p = (char*)pat; p < patend; p = q) {
11302         bool alt = FALSE;
11303         bool left = FALSE;
11304         bool vectorize = FALSE;
11305         bool vectorarg = FALSE;
11306         bool vec_utf8 = FALSE;
11307         char fill = ' ';
11308         char plus = 0;
11309         char intsize = 0;
11310         STRLEN width = 0;
11311         STRLEN zeros = 0;
11312         bool has_precis = FALSE;
11313         STRLEN precis = 0;
11314         const I32 osvix = svix;
11315         bool is_utf8 = FALSE;  /* is this item utf8?   */
11316 #ifdef HAS_LDBL_SPRINTF_BUG
11317         /* This is to try to fix a bug with irix/nonstop-ux/powerux and
11318            with sfio - Allen <allens@cpan.org> */
11319         bool fix_ldbl_sprintf_bug = FALSE;
11320 #endif
11321
11322         char esignbuf[4];
11323         U8 utf8buf[UTF8_MAXBYTES+1];
11324         STRLEN esignlen = 0;
11325
11326         const char *eptr = NULL;
11327         const char *fmtstart;
11328         STRLEN elen = 0;
11329         SV *vecsv = NULL;
11330         const U8 *vecstr = NULL;
11331         STRLEN veclen = 0;
11332         char c = 0;
11333         int i;
11334         unsigned base = 0;
11335         IV iv = 0;
11336         UV uv = 0;
11337         /* We need a long double target in case HAS_LONG_DOUBLE,
11338          * even without USE_LONG_DOUBLE, so that we can printf with
11339          * long double formats, even without NV being long double.
11340          * But we call the target 'fv' instead of 'nv', since most of
11341          * the time it is not (most compilers these days recognize
11342          * "long double", even if only as a synonym for "double").
11343         */
11344 #if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE && \
11345         defined(PERL_PRIgldbl) && !defined(USE_QUADMATH)
11346         long double fv;
11347 #  ifdef Perl_isfinitel
11348 #    define FV_ISFINITE(x) Perl_isfinitel(x)
11349 #  endif
11350 #  define FV_GF PERL_PRIgldbl
11351 #    if defined(__VMS) && defined(__ia64) && defined(__IEEE_FLOAT)
11352        /* Work around breakage in OTS$CVT_FLOAT_T_X */
11353 #      define NV_TO_FV(nv,fv) STMT_START {                   \
11354                                            double _dv = nv;  \
11355                                            fv = Perl_isnan(_dv) ? LDBL_QNAN : _dv; \
11356                               } STMT_END
11357 #    else
11358 #      define NV_TO_FV(nv,fv) (fv)=(nv)
11359 #    endif
11360 #else
11361         NV fv;
11362 #  define FV_GF NVgf
11363 #  define NV_TO_FV(nv,fv) (fv)=(nv)
11364 #endif
11365 #ifndef FV_ISFINITE
11366 #  define FV_ISFINITE(x) Perl_isfinite((NV)(x))
11367 #endif
11368         NV nv;
11369         STRLEN have;
11370         STRLEN need;
11371         STRLEN gap;
11372         const char *dotstr = ".";
11373         STRLEN dotstrlen = 1;
11374         I32 efix = 0; /* explicit format parameter index */
11375         I32 ewix = 0; /* explicit width index */
11376         I32 epix = 0; /* explicit precision index */
11377         I32 evix = 0; /* explicit vector index */
11378         bool asterisk = FALSE;
11379         bool infnan = FALSE;
11380
11381         /* echo everything up to the next format specification */
11382         for (q = p; q < patend && *q != '%'; ++q) ;
11383         if (q > p) {
11384             if (has_utf8 && !pat_utf8)
11385                 sv_catpvn_nomg_utf8_upgrade(sv, p, q - p, nsv);
11386             else
11387                 sv_catpvn_nomg(sv, p, q - p);
11388             p = q;
11389         }
11390         if (q++ >= patend)
11391             break;
11392
11393         fmtstart = q;
11394
11395 /*
11396     We allow format specification elements in this order:
11397         \d+\$              explicit format parameter index
11398         [-+ 0#]+           flags
11399         v|\*(\d+\$)?v      vector with optional (optionally specified) arg
11400         0                  flag (as above): repeated to allow "v02"     
11401         \d+|\*(\d+\$)?     width using optional (optionally specified) arg
11402         \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
11403         [hlqLV]            size
11404     [%bcdefginopsuxDFOUX] format (mandatory)
11405 */
11406
11407         if (args) {
11408 /*  
11409         As of perl5.9.3, printf format checking is on by default.
11410         Internally, perl uses %p formats to provide an escape to
11411         some extended formatting.  This block deals with those
11412         extensions: if it does not match, (char*)q is reset and
11413         the normal format processing code is used.
11414
11415         Currently defined extensions are:
11416                 %p              include pointer address (standard)      
11417                 %-p     (SVf)   include an SV (previously %_)
11418                 %-<num>p        include an SV with precision <num>      
11419                 %2p             include a HEK
11420                 %3p             include a HEK with precision of 256
11421                 %4p             char* preceded by utf8 flag and length
11422                 %<num>p         (where num is 1 or > 4) reserved for future
11423                                 extensions
11424
11425         Robin Barker 2005-07-14 (but modified since)
11426
11427                 %1p     (VDf)   removed.  RMB 2007-10-19
11428 */
11429             char* r = q; 
11430             bool sv = FALSE;    
11431             STRLEN n = 0;
11432             if (*q == '-')
11433                 sv = *q++;
11434             else if (strnEQ(q, UTF8f, sizeof(UTF8f)-1)) { /* UTF8f */
11435                 /* The argument has already gone through cBOOL, so the cast
11436                    is safe. */
11437                 is_utf8 = (bool)va_arg(*args, int);
11438                 elen = va_arg(*args, UV);
11439                 if ((IV)elen < 0) {
11440                     /* check if utf8 length is larger than 0 when cast to IV */
11441                     assert( (IV)elen >= 0 ); /* in DEBUGGING build we want to crash */
11442                     elen= 0; /* otherwise we want to treat this as an empty string */
11443                 }
11444                 eptr = va_arg(*args, char *);
11445                 q += sizeof(UTF8f)-1;
11446                 goto string;
11447             }
11448             n = expect_number(&q);
11449             if (*q++ == 'p') {
11450                 if (sv) {                       /* SVf */
11451                     if (n) {
11452                         precis = n;
11453                         has_precis = TRUE;
11454                     }
11455                     argsv = MUTABLE_SV(va_arg(*args, void*));
11456                     eptr = SvPV_const(argsv, elen);
11457                     if (DO_UTF8(argsv))
11458                         is_utf8 = TRUE;
11459                     goto string;
11460                 }
11461                 else if (n==2 || n==3) {        /* HEKf */
11462                     HEK * const hek = va_arg(*args, HEK *);
11463                     eptr = HEK_KEY(hek);
11464                     elen = HEK_LEN(hek);
11465                     if (HEK_UTF8(hek)) is_utf8 = TRUE;
11466                     if (n==3) precis = 256, has_precis = TRUE;
11467                     goto string;
11468                 }
11469                 else if (n) {
11470                     Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),
11471                                      "internal %%<num>p might conflict with future printf extensions");
11472                 }
11473             }
11474             q = r; 
11475         }
11476
11477         if ( (width = expect_number(&q)) ) {
11478             if (*q == '$') {
11479                 ++q;
11480                 efix = width;
11481                 if (!no_redundant_warning)
11482                     /* I've forgotten if it's a better
11483                        micro-optimization to always set this or to
11484                        only set it if it's unset */
11485                     no_redundant_warning = TRUE;
11486             } else {
11487                 goto gotwidth;
11488             }
11489         }
11490
11491         /* FLAGS */
11492
11493         while (*q) {
11494             switch (*q) {
11495             case ' ':
11496             case '+':
11497                 if (plus == '+' && *q == ' ') /* '+' over ' ' */
11498                     q++;
11499                 else
11500                     plus = *q++;
11501                 continue;
11502
11503             case '-':
11504                 left = TRUE;
11505                 q++;
11506                 continue;
11507
11508             case '0':
11509                 fill = *q++;
11510                 continue;
11511
11512             case '#':
11513                 alt = TRUE;
11514                 q++;
11515                 continue;
11516
11517             default:
11518                 break;
11519             }
11520             break;
11521         }
11522
11523       tryasterisk:
11524         if (*q == '*') {
11525             q++;
11526             if ( (ewix = expect_number(&q)) )
11527                 if (*q++ != '$')
11528                     goto unknown;
11529             asterisk = TRUE;
11530         }
11531         if (*q == 'v') {
11532             q++;
11533             if (vectorize)
11534                 goto unknown;
11535             if ((vectorarg = asterisk)) {
11536                 evix = ewix;
11537                 ewix = 0;
11538                 asterisk = FALSE;
11539             }
11540             vectorize = TRUE;
11541             goto tryasterisk;
11542         }
11543
11544         if (!asterisk)
11545         {
11546             if( *q == '0' )
11547                 fill = *q++;
11548             width = expect_number(&q);
11549         }
11550
11551         if (vectorize && vectorarg) {
11552             /* vectorizing, but not with the default "." */
11553             if (args)
11554                 vecsv = va_arg(*args, SV*);
11555             else if (evix) {
11556                 vecsv = (evix > 0 && evix <= svmax)
11557                     ? svargs[evix-1] : S_vcatpvfn_missing_argument(aTHX);
11558             } else {
11559                 vecsv = svix < svmax
11560                     ? svargs[svix++] : S_vcatpvfn_missing_argument(aTHX);
11561             }
11562             dotstr = SvPV_const(vecsv, dotstrlen);
11563             /* Keep the DO_UTF8 test *after* the SvPV call, else things go
11564                bad with tied or overloaded values that return UTF8.  */
11565             if (DO_UTF8(vecsv))
11566                 is_utf8 = TRUE;
11567             else if (has_utf8) {
11568                 vecsv = sv_mortalcopy(vecsv);
11569                 sv_utf8_upgrade(vecsv);
11570                 dotstr = SvPV_const(vecsv, dotstrlen);
11571                 is_utf8 = TRUE;
11572             }               
11573         }
11574
11575         if (asterisk) {
11576             if (args)
11577                 i = va_arg(*args, int);
11578             else
11579                 i = (ewix ? ewix <= svmax : svix < svmax) ?
11580                     SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
11581             left |= (i < 0);
11582             width = (i < 0) ? -i : i;
11583         }
11584       gotwidth:
11585
11586         /* PRECISION */
11587
11588         if (*q == '.') {
11589             q++;
11590             if (*q == '*') {
11591                 q++;
11592                 if ( ((epix = expect_number(&q))) && (*q++ != '$') )
11593                     goto unknown;
11594                 /* XXX: todo, support specified precision parameter */
11595                 if (epix)
11596                     goto unknown;
11597                 if (args)
11598                     i = va_arg(*args, int);
11599                 else
11600                     i = (ewix ? ewix <= svmax : svix < svmax)
11601                         ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
11602                 precis = i;
11603                 has_precis = !(i < 0);
11604             }
11605             else {
11606                 precis = 0;
11607                 while (isDIGIT(*q))
11608                     precis = precis * 10 + (*q++ - '0');
11609                 has_precis = TRUE;
11610             }
11611         }
11612
11613         if (vectorize) {
11614             if (args) {
11615                 VECTORIZE_ARGS
11616             }
11617             else if (efix ? (efix > 0 && efix <= svmax) : svix < svmax) {
11618                 vecsv = svargs[efix ? efix-1 : svix++];
11619                 vecstr = (U8*)SvPV_const(vecsv,veclen);
11620                 vec_utf8 = DO_UTF8(vecsv);
11621
11622                 /* if this is a version object, we need to convert
11623                  * back into v-string notation and then let the
11624                  * vectorize happen normally
11625                  */
11626                 if (sv_isobject(vecsv) && sv_derived_from(vecsv, "version")) {
11627                     if ( hv_exists(MUTABLE_HV(SvRV(vecsv)), "alpha", 5 ) ) {
11628                         Perl_ck_warner_d(aTHX_ packWARN(WARN_PRINTF),
11629                         "vector argument not supported with alpha versions");
11630                         goto vdblank;
11631                     }
11632                     vecsv = sv_newmortal();
11633                     scan_vstring((char *)vecstr, (char *)vecstr + veclen,
11634                                  vecsv);
11635                     vecstr = (U8*)SvPV_const(vecsv, veclen);
11636                     vec_utf8 = DO_UTF8(vecsv);
11637                 }
11638             }
11639             else {
11640               vdblank:
11641                 vecstr = (U8*)"";
11642                 veclen = 0;
11643             }
11644         }
11645
11646         /* SIZE */
11647
11648         switch (*q) {
11649 #ifdef WIN32
11650         case 'I':                       /* Ix, I32x, and I64x */
11651 #  ifdef USE_64_BIT_INT
11652             if (q[1] == '6' && q[2] == '4') {
11653                 q += 3;
11654                 intsize = 'q';
11655                 break;
11656             }
11657 #  endif
11658             if (q[1] == '3' && q[2] == '2') {
11659                 q += 3;
11660                 break;
11661             }
11662 #  ifdef USE_64_BIT_INT
11663             intsize = 'q';
11664 #  endif
11665             q++;
11666             break;
11667 #endif
11668 #if (IVSIZE >= 8 || defined(HAS_LONG_DOUBLE)) || \
11669     (IVSIZE == 4 && !defined(HAS_LONG_DOUBLE))
11670         case 'L':                       /* Ld */
11671             /* FALLTHROUGH */
11672 #  ifdef USE_QUADMATH
11673         case 'Q':
11674             /* FALLTHROUGH */
11675 #  endif
11676 #  if IVSIZE >= 8
11677         case 'q':                       /* qd */
11678 #  endif
11679             intsize = 'q';
11680             q++;
11681             break;
11682 #endif
11683         case 'l':
11684             ++q;
11685 #if (IVSIZE >= 8 || defined(HAS_LONG_DOUBLE)) || \
11686     (IVSIZE == 4 && !defined(HAS_LONG_DOUBLE))
11687             if (*q == 'l') {    /* lld, llf */
11688                 intsize = 'q';
11689                 ++q;
11690             }
11691             else
11692 #endif
11693                 intsize = 'l';
11694             break;
11695         case 'h':
11696             if (*++q == 'h') {  /* hhd, hhu */
11697                 intsize = 'c';
11698                 ++q;
11699             }
11700             else
11701                 intsize = 'h';
11702             break;
11703         case 'V':
11704         case 'z':
11705         case 't':
11706 #ifdef I_STDINT
11707         case 'j':
11708 #endif
11709             intsize = *q++;
11710             break;
11711         }
11712
11713         /* CONVERSION */
11714
11715         if (*q == '%') {
11716             eptr = q++;
11717             elen = 1;
11718             if (vectorize) {
11719                 c = '%';
11720                 goto unknown;
11721             }
11722             goto string;
11723         }
11724
11725         if (!vectorize && !args) {
11726             if (efix) {
11727                 const I32 i = efix-1;
11728                 argsv = (i >= 0 && i < svmax)
11729                     ? svargs[i] : S_vcatpvfn_missing_argument(aTHX);
11730             } else {
11731                 argsv = (svix >= 0 && svix < svmax)
11732                     ? svargs[svix++] : S_vcatpvfn_missing_argument(aTHX);
11733             }
11734         }
11735
11736         if (argsv && strchr("BbcDdiOopuUXx",*q)) {
11737             /* XXX va_arg(*args) case? need peek, use va_copy? */
11738             SvGETMAGIC(argsv);
11739             if (UNLIKELY(SvAMAGIC(argsv)))
11740                 argsv = sv_2num(argsv);
11741             infnan = UNLIKELY(isinfnansv(argsv));
11742         }
11743
11744         switch (c = *q++) {
11745
11746             /* STRINGS */
11747
11748         case 'c':
11749             if (vectorize)
11750                 goto unknown;
11751             if (infnan)
11752                 Perl_croak(aTHX_ "Cannot printf %"NVgf" with '%c'",
11753                            /* no va_arg() case */
11754                            SvNV_nomg(argsv), (int)c);
11755             uv = (args) ? va_arg(*args, int) : SvIV_nomg(argsv);
11756             if ((uv > 255 ||
11757                  (!UVCHR_IS_INVARIANT(uv) && SvUTF8(sv)))
11758                 && !IN_BYTES) {
11759                 eptr = (char*)utf8buf;
11760                 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
11761                 is_utf8 = TRUE;
11762             }
11763             else {
11764                 c = (char)uv;
11765                 eptr = &c;
11766                 elen = 1;
11767             }
11768             goto string;
11769
11770         case 's':
11771             if (vectorize)
11772                 goto unknown;
11773             if (args) {
11774                 eptr = va_arg(*args, char*);
11775                 if (eptr)
11776                     elen = strlen(eptr);
11777                 else {
11778                     eptr = (char *)nullstr;
11779                     elen = sizeof nullstr - 1;
11780                 }
11781             }
11782             else {
11783                 eptr = SvPV_const(argsv, elen);
11784                 if (DO_UTF8(argsv)) {
11785                     STRLEN old_precis = precis;
11786                     if (has_precis && precis < elen) {
11787                         STRLEN ulen = sv_or_pv_len_utf8(argsv, eptr, elen);
11788                         STRLEN p = precis > ulen ? ulen : precis;
11789                         precis = sv_or_pv_pos_u2b(argsv, eptr, p, 0);
11790                                                         /* sticks at end */
11791                     }
11792                     if (width) { /* fudge width (can't fudge elen) */
11793                         if (has_precis && precis < elen)
11794                             width += precis - old_precis;
11795                         else
11796                             width +=
11797                                 elen - sv_or_pv_len_utf8(argsv,eptr,elen);
11798                     }
11799                     is_utf8 = TRUE;
11800                 }
11801             }
11802
11803         string:
11804             if (has_precis && precis < elen)
11805                 elen = precis;
11806             break;
11807
11808             /* INTEGERS */
11809
11810         case 'p':
11811             if (infnan) {
11812                 goto floating_point;
11813             }
11814             if (alt || vectorize)
11815                 goto unknown;
11816             uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
11817             base = 16;
11818             goto integer;
11819
11820         case 'D':
11821 #ifdef IV_IS_QUAD
11822             intsize = 'q';
11823 #else
11824             intsize = 'l';
11825 #endif
11826             /* FALLTHROUGH */
11827         case 'd':
11828         case 'i':
11829             if (infnan) {
11830                 goto floating_point;
11831             }
11832             if (vectorize) {
11833                 STRLEN ulen;
11834                 if (!veclen)
11835                     continue;
11836                 if (vec_utf8)
11837                     uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
11838                                         UTF8_ALLOW_ANYUV);
11839                 else {
11840                     uv = *vecstr;
11841                     ulen = 1;
11842                 }
11843                 vecstr += ulen;
11844                 veclen -= ulen;
11845                 if (plus)
11846                      esignbuf[esignlen++] = plus;
11847             }
11848             else if (args) {
11849                 switch (intsize) {
11850                 case 'c':       iv = (char)va_arg(*args, int); break;
11851                 case 'h':       iv = (short)va_arg(*args, int); break;
11852                 case 'l':       iv = va_arg(*args, long); break;
11853                 case 'V':       iv = va_arg(*args, IV); break;
11854                 case 'z':       iv = va_arg(*args, SSize_t); break;
11855 #ifdef HAS_PTRDIFF_T
11856                 case 't':       iv = va_arg(*args, ptrdiff_t); break;
11857 #endif
11858                 default:        iv = va_arg(*args, int); break;
11859 #ifdef I_STDINT
11860                 case 'j':       iv = va_arg(*args, intmax_t); break;
11861 #endif
11862                 case 'q':
11863 #if IVSIZE >= 8
11864                                 iv = va_arg(*args, Quad_t); break;
11865 #else
11866                                 goto unknown;
11867 #endif
11868                 }
11869             }
11870             else {
11871                 IV tiv = SvIV_nomg(argsv); /* work around GCC bug #13488 */
11872                 switch (intsize) {
11873                 case 'c':       iv = (char)tiv; break;
11874                 case 'h':       iv = (short)tiv; break;
11875                 case 'l':       iv = (long)tiv; break;
11876                 case 'V':
11877                 default:        iv = tiv; break;
11878                 case 'q':
11879 #if IVSIZE >= 8
11880                                 iv = (Quad_t)tiv; break;
11881 #else
11882                                 goto unknown;
11883 #endif
11884                 }
11885             }
11886             if ( !vectorize )   /* we already set uv above */
11887             {
11888                 if (iv >= 0) {
11889                     uv = iv;
11890                     if (plus)
11891                         esignbuf[esignlen++] = plus;
11892                 }
11893                 else {
11894                     uv = (iv == IV_MIN) ? (UV)iv : (UV)(-iv);
11895                     esignbuf[esignlen++] = '-';
11896                 }
11897             }
11898             base = 10;
11899             goto integer;
11900
11901         case 'U':
11902 #ifdef IV_IS_QUAD
11903             intsize = 'q';
11904 #else
11905             intsize = 'l';
11906 #endif
11907             /* FALLTHROUGH */
11908         case 'u':
11909             base = 10;
11910             goto uns_integer;
11911
11912         case 'B':
11913         case 'b':
11914             base = 2;
11915             goto uns_integer;
11916
11917         case 'O':
11918 #ifdef IV_IS_QUAD
11919             intsize = 'q';
11920 #else
11921             intsize = 'l';
11922 #endif
11923             /* FALLTHROUGH */
11924         case 'o':
11925             base = 8;
11926             goto uns_integer;
11927
11928         case 'X':
11929         case 'x':
11930             base = 16;
11931
11932         uns_integer:
11933             if (infnan) {
11934                 goto floating_point;
11935             }
11936             if (vectorize) {
11937                 STRLEN ulen;
11938         vector:
11939                 if (!veclen)
11940                     continue;
11941                 if (vec_utf8)
11942                     uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
11943                                         UTF8_ALLOW_ANYUV);
11944                 else {
11945                     uv = *vecstr;
11946                     ulen = 1;
11947                 }
11948                 vecstr += ulen;
11949                 veclen -= ulen;
11950             }
11951             else if (args) {
11952                 switch (intsize) {
11953                 case 'c':  uv = (unsigned char)va_arg(*args, unsigned); break;
11954                 case 'h':  uv = (unsigned short)va_arg(*args, unsigned); break;
11955                 case 'l':  uv = va_arg(*args, unsigned long); break;
11956                 case 'V':  uv = va_arg(*args, UV); break;
11957                 case 'z':  uv = va_arg(*args, Size_t); break;
11958 #ifdef HAS_PTRDIFF_T
11959                 case 't':  uv = va_arg(*args, ptrdiff_t); break; /* will sign extend, but there is no uptrdiff_t, so oh well */
11960 #endif
11961 #ifdef I_STDINT
11962                 case 'j':  uv = va_arg(*args, uintmax_t); break;
11963 #endif
11964                 default:   uv = va_arg(*args, unsigned); break;
11965                 case 'q':
11966 #if IVSIZE >= 8
11967                            uv = va_arg(*args, Uquad_t); break;
11968 #else
11969                            goto unknown;
11970 #endif
11971                 }
11972             }
11973             else {
11974                 UV tuv = SvUV_nomg(argsv); /* work around GCC bug #13488 */
11975                 switch (intsize) {
11976                 case 'c':       uv = (unsigned char)tuv; break;
11977                 case 'h':       uv = (unsigned short)tuv; break;
11978                 case 'l':       uv = (unsigned long)tuv; break;
11979                 case 'V':
11980                 default:        uv = tuv; break;
11981                 case 'q':
11982 #if IVSIZE >= 8
11983                                 uv = (Uquad_t)tuv; break;
11984 #else
11985                                 goto unknown;
11986 #endif
11987                 }
11988             }
11989
11990         integer:
11991             {
11992                 char *ptr = ebuf + sizeof ebuf;
11993                 bool tempalt = uv ? alt : FALSE; /* Vectors can't change alt */
11994                 unsigned dig;
11995                 zeros = 0;
11996
11997                 switch (base) {
11998                 case 16:
11999                     p = (char *)((c == 'X') ? PL_hexdigit + 16 : PL_hexdigit);
12000                     do {
12001                         dig = uv & 15;
12002                         *--ptr = p[dig];
12003                     } while (uv >>= 4);
12004                     if (tempalt) {
12005                         esignbuf[esignlen++] = '0';
12006                         esignbuf[esignlen++] = c;  /* 'x' or 'X' */
12007                     }
12008                     break;
12009                 case 8:
12010                     do {
12011                         dig = uv & 7;
12012                         *--ptr = '0' + dig;
12013                     } while (uv >>= 3);
12014                     if (alt && *ptr != '0')
12015                         *--ptr = '0';
12016                     break;
12017                 case 2:
12018                     do {
12019                         dig = uv & 1;
12020                         *--ptr = '0' + dig;
12021                     } while (uv >>= 1);
12022                     if (tempalt) {
12023                         esignbuf[esignlen++] = '0';
12024                         esignbuf[esignlen++] = c;
12025                     }
12026                     break;
12027                 default:                /* it had better be ten or less */
12028                     do {
12029                         dig = uv % base;
12030                         *--ptr = '0' + dig;
12031                     } while (uv /= base);
12032                     break;
12033                 }
12034                 elen = (ebuf + sizeof ebuf) - ptr;
12035                 eptr = ptr;
12036                 if (has_precis) {
12037                     if (precis > elen)
12038                         zeros = precis - elen;
12039                     else if (precis == 0 && elen == 1 && *eptr == '0'
12040                              && !(base == 8 && alt)) /* "%#.0o" prints "0" */
12041                         elen = 0;
12042
12043                 /* a precision nullifies the 0 flag. */
12044                     if (fill == '0')
12045                         fill = ' ';
12046                 }
12047             }
12048             break;
12049
12050             /* FLOATING POINT */
12051
12052         floating_point:
12053
12054         case 'F':
12055             c = 'f';            /* maybe %F isn't supported here */
12056             /* FALLTHROUGH */
12057         case 'e': case 'E':
12058         case 'f':
12059         case 'g': case 'G':
12060         case 'a': case 'A':
12061             if (vectorize)
12062                 goto unknown;
12063
12064             /* This is evil, but floating point is even more evil */
12065
12066             /* for SV-style calling, we can only get NV
12067                for C-style calling, we assume %f is double;
12068                for simplicity we allow any of %Lf, %llf, %qf for long double
12069             */
12070             switch (intsize) {
12071             case 'V':
12072 #if defined(USE_LONG_DOUBLE) || defined(USE_QUADMATH)
12073                 intsize = 'q';
12074 #endif
12075                 break;
12076 /* [perl #20339] - we should accept and ignore %lf rather than die */
12077             case 'l':
12078                 /* FALLTHROUGH */
12079             default:
12080 #if defined(USE_LONG_DOUBLE) || defined(USE_QUADMATH)
12081                 intsize = args ? 0 : 'q';
12082 #endif
12083                 break;
12084             case 'q':
12085 #if defined(HAS_LONG_DOUBLE)
12086                 break;
12087 #else
12088                 /* FALLTHROUGH */
12089 #endif
12090             case 'c':
12091             case 'h':
12092             case 'z':
12093             case 't':
12094             case 'j':
12095                 goto unknown;
12096             }
12097
12098             /* Now we need (long double) if intsize == 'q', else (double). */
12099             if (args) {
12100                 /* Note: do not pull NVs off the va_list with va_arg()
12101                  * (pull doubles instead) because if you have a build
12102                  * with long doubles, you would always be pulling long
12103                  * doubles, which would badly break anyone using only
12104                  * doubles (i.e. the majority of builds). In other
12105                  * words, you cannot mix doubles and long doubles.
12106                  * The only case where you can pull off long doubles
12107                  * is when the format specifier explicitly asks so with
12108                  * e.g. "%Lg". */
12109 #ifdef USE_QUADMATH
12110                 fv = intsize == 'q' ?
12111                     va_arg(*args, NV) : va_arg(*args, double);
12112                 nv = fv;
12113 #elif LONG_DOUBLESIZE > DOUBLESIZE
12114                 if (intsize == 'q') {
12115                     fv = va_arg(*args, long double);
12116                     nv = fv;
12117                 } else {
12118                     nv = va_arg(*args, double);
12119                     NV_TO_FV(nv, fv);
12120                 }
12121 #else
12122                 nv = va_arg(*args, double);
12123                 fv = nv;
12124 #endif
12125             }
12126             else
12127             {
12128                 if (!infnan) SvGETMAGIC(argsv);
12129                 nv = SvNV_nomg(argsv);
12130                 NV_TO_FV(nv, fv);
12131             }
12132
12133             need = 0;
12134             /* frexp() (or frexpl) has some unspecified behaviour for
12135              * nan/inf/-inf, so let's avoid calling that on non-finites. */
12136             if (isALPHA_FOLD_NE(c, 'e') && FV_ISFINITE(fv)) {
12137                 i = PERL_INT_MIN;
12138                 (void)Perl_frexp((NV)fv, &i);
12139                 if (i == PERL_INT_MIN)
12140                     Perl_die(aTHX_ "panic: frexp: %"FV_GF, fv);
12141                 /* Do not set hexfp earlier since we want to printf
12142                  * Inf/NaN for Inf/NaN, not their hexfp. */
12143                 hexfp = isALPHA_FOLD_EQ(c, 'a');
12144                 if (UNLIKELY(hexfp)) {
12145                     /* This seriously overshoots in most cases, but
12146                      * better the undershooting.  Firstly, all bytes
12147                      * of the NV are not mantissa, some of them are
12148                      * exponent.  Secondly, for the reasonably common
12149                      * long doubles case, the "80-bit extended", two
12150                      * or six bytes of the NV are unused. */
12151                     need +=
12152                         (fv < 0) ? 1 : 0 + /* possible unary minus */
12153                         2 + /* "0x" */
12154                         1 + /* the very unlikely carry */
12155                         1 + /* "1" */
12156                         1 + /* "." */
12157                         2 * NVSIZE + /* 2 hexdigits for each byte */
12158                         2 + /* "p+" */
12159                         6 + /* exponent: sign, plus up to 16383 (quad fp) */
12160                         1;   /* \0 */
12161 #ifdef LONGDOUBLE_DOUBLEDOUBLE
12162                     /* However, for the "double double", we need more.
12163                      * Since each double has their own exponent, the
12164                      * doubles may float (haha) rather far from each
12165                      * other, and the number of required bits is much
12166                      * larger, up to total of DOUBLEDOUBLE_MAXBITS bits.
12167                      * See the definition of DOUBLEDOUBLE_MAXBITS.
12168                      *
12169                      * Need 2 hexdigits for each byte. */
12170                     need += (DOUBLEDOUBLE_MAXBITS/8 + 1) * 2;
12171                     /* the size for the exponent already added */
12172 #endif
12173 #ifdef USE_LOCALE_NUMERIC
12174                         STORE_LC_NUMERIC_SET_TO_NEEDED();
12175                         if (PL_numeric_radix_sv && IN_LC(LC_NUMERIC))
12176                             need += SvLEN(PL_numeric_radix_sv);
12177                         RESTORE_LC_NUMERIC();
12178 #endif
12179                 }
12180                 else if (i > 0) {
12181                     need = BIT_DIGITS(i);
12182                 } /* if i < 0, the number of digits is hard to predict. */
12183             }
12184             need += has_precis ? precis : 6; /* known default */
12185
12186             if (need < width)
12187                 need = width;
12188
12189 #ifdef HAS_LDBL_SPRINTF_BUG
12190             /* This is to try to fix a bug with irix/nonstop-ux/powerux and
12191                with sfio - Allen <allens@cpan.org> */
12192
12193 #  ifdef DBL_MAX
12194 #    define MY_DBL_MAX DBL_MAX
12195 #  else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
12196 #    if DOUBLESIZE >= 8
12197 #      define MY_DBL_MAX 1.7976931348623157E+308L
12198 #    else
12199 #      define MY_DBL_MAX 3.40282347E+38L
12200 #    endif
12201 #  endif
12202
12203 #  ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
12204 #    define MY_DBL_MAX_BUG 1L
12205 #  else
12206 #    define MY_DBL_MAX_BUG MY_DBL_MAX
12207 #  endif
12208
12209 #  ifdef DBL_MIN
12210 #    define MY_DBL_MIN DBL_MIN
12211 #  else  /* XXX guessing! -Allen */
12212 #    if DOUBLESIZE >= 8
12213 #      define MY_DBL_MIN 2.2250738585072014E-308L
12214 #    else
12215 #      define MY_DBL_MIN 1.17549435E-38L
12216 #    endif
12217 #  endif
12218
12219             if ((intsize == 'q') && (c == 'f') &&
12220                 ((fv < MY_DBL_MAX_BUG) && (fv > -MY_DBL_MAX_BUG)) &&
12221                 (need < DBL_DIG)) {
12222                 /* it's going to be short enough that
12223                  * long double precision is not needed */
12224
12225                 if ((fv <= 0L) && (fv >= -0L))
12226                     fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
12227                 else {
12228                     /* would use Perl_fp_class as a double-check but not
12229                      * functional on IRIX - see perl.h comments */
12230
12231                     if ((fv >= MY_DBL_MIN) || (fv <= -MY_DBL_MIN)) {
12232                         /* It's within the range that a double can represent */
12233 #if defined(DBL_MAX) && !defined(DBL_MIN)
12234                         if ((fv >= ((long double)1/DBL_MAX)) ||
12235                             (fv <= (-(long double)1/DBL_MAX)))
12236 #endif
12237                         fix_ldbl_sprintf_bug = TRUE;
12238                     }
12239                 }
12240                 if (fix_ldbl_sprintf_bug == TRUE) {
12241                     double temp;
12242
12243                     intsize = 0;
12244                     temp = (double)fv;
12245                     fv = (NV)temp;
12246                 }
12247             }
12248
12249 #  undef MY_DBL_MAX
12250 #  undef MY_DBL_MAX_BUG
12251 #  undef MY_DBL_MIN
12252
12253 #endif /* HAS_LDBL_SPRINTF_BUG */
12254
12255             need += 20; /* fudge factor */
12256             if (PL_efloatsize < need) {
12257                 Safefree(PL_efloatbuf);
12258                 PL_efloatsize = need + 20; /* more fudge */
12259                 Newx(PL_efloatbuf, PL_efloatsize, char);
12260                 PL_efloatbuf[0] = '\0';
12261             }
12262
12263             if ( !(width || left || plus || alt) && fill != '0'
12264                  && has_precis && intsize != 'q'        /* Shortcuts */
12265                  && LIKELY(!Perl_isinfnan((NV)fv)) ) {
12266                 /* See earlier comment about buggy Gconvert when digits,
12267                    aka precis is 0  */
12268                 if ( c == 'g' && precis ) {
12269                     STORE_LC_NUMERIC_SET_TO_NEEDED();
12270                     SNPRINTF_G(fv, PL_efloatbuf, PL_efloatsize, precis);
12271                     /* May return an empty string for digits==0 */
12272                     if (*PL_efloatbuf) {
12273                         elen = strlen(PL_efloatbuf);
12274                         goto float_converted;
12275                     }
12276                 } else if ( c == 'f' && !precis ) {
12277                     if ((eptr = F0convert(nv, ebuf + sizeof ebuf, &elen)))
12278                         break;
12279                 }
12280             }
12281
12282             if (UNLIKELY(hexfp)) {
12283                 /* Hexadecimal floating point. */
12284                 char* p = PL_efloatbuf;
12285                 U8 vhex[VHEX_SIZE];
12286                 U8* v = vhex; /* working pointer to vhex */
12287                 U8* vend; /* pointer to one beyond last digit of vhex */
12288                 U8* vfnz = NULL; /* first non-zero */
12289                 const bool lower = (c == 'a');
12290                 /* At output the values of vhex (up to vend) will
12291                  * be mapped through the xdig to get the actual
12292                  * human-readable xdigits. */
12293                 const char* xdig = PL_hexdigit;
12294                 int zerotail = 0; /* how many extra zeros to append */
12295                 int exponent = 0; /* exponent of the floating point input */
12296
12297                 /* XXX: denormals, NaN, Inf.
12298                  *
12299                  * For example with denormals, (assuming the vanilla
12300                  * 64-bit double): the exponent is zero. 1xp-1074 is
12301                  * the smallest denormal and the smallest double, it
12302                  * should be output as 0x0.0000000000001p-1022 to
12303                  * match its internal structure. */
12304
12305                 vend = S_hextract(aTHX_ nv, &exponent, vhex, NULL);
12306                 S_hextract(aTHX_ nv, &exponent, vhex, vend);
12307
12308 #if NVSIZE > DOUBLESIZE
12309 #  ifdef HEXTRACT_HAS_IMPLICIT_BIT
12310                 /* In this case there is an implicit bit,
12311                  * and therefore the exponent is shifted shift by one. */
12312                 exponent--;
12313 #  else
12314                 /* In this case there is no implicit bit,
12315                  * and the exponent is shifted by the first xdigit. */
12316                 exponent -= 4;
12317 #  endif
12318 #endif
12319
12320                 if (fv < 0)
12321                     *p++ = '-';
12322                 else if (plus)
12323                     *p++ = plus;
12324                 *p++ = '0';
12325                 if (lower) {
12326                     *p++ = 'x';
12327                 }
12328                 else {
12329                     *p++ = 'X';
12330                     xdig += 16; /* Use uppercase hex. */
12331                 }
12332
12333                 /* Find the first non-zero xdigit. */
12334                 for (v = vhex; v < vend; v++) {
12335                     if (*v) {
12336                         vfnz = v;
12337                         break;
12338                     }
12339                 }
12340
12341                 if (vfnz) {
12342                     U8* vlnz = NULL; /* The last non-zero. */
12343
12344                     /* Find the last non-zero xdigit. */
12345                     for (v = vend - 1; v >= vhex; v--) {
12346                         if (*v) {
12347                             vlnz = v;
12348                             break;
12349                         }
12350                     }
12351
12352 #if NVSIZE == DOUBLESIZE
12353                     if (fv != 0.0)
12354                         exponent--;
12355 #endif
12356
12357                     if (precis > 0) {
12358                         if ((SSize_t)(precis + 1) < vend - vhex) {
12359                             bool round;
12360
12361                             v = vhex + precis + 1;
12362                             /* Round away from zero: if the tail
12363                              * beyond the precis xdigits is equal to
12364                              * or greater than 0x8000... */
12365                             round = *v > 0x8;
12366                             if (!round && *v == 0x8) {
12367                                 for (v++; v < vend; v++) {
12368                                     if (*v) {
12369                                         round = TRUE;
12370                                         break;
12371                                     }
12372                                 }
12373                             }
12374                             if (round) {
12375                                 for (v = vhex + precis; v >= vhex; v--) {
12376                                     if (*v < 0xF) {
12377                                         (*v)++;
12378                                         break;
12379                                     }
12380                                     *v = 0;
12381                                     if (v == vhex) {
12382                                         /* If the carry goes all the way to
12383                                          * the front, we need to output
12384                                          * a single '1'. This goes against
12385                                          * the "xdigit and then radix"
12386                                          * but since this is "cannot happen"
12387                                          * category, that is probably good. */
12388                                         *p++ = xdig[1];
12389                                     }
12390                                 }
12391                             }
12392                             /* The new effective "last non zero". */
12393                             vlnz = vhex + precis;
12394                         }
12395                         else {
12396                             zerotail = precis - (vlnz - vhex);
12397                         }
12398                     }
12399
12400                     v = vhex;
12401                     *p++ = xdig[*v++];
12402
12403                     /* The radix is always output after the first
12404                      * non-zero xdigit, or if alt.  */
12405                     if (vfnz < vlnz || alt) {
12406 #ifndef USE_LOCALE_NUMERIC
12407                         *p++ = '.';
12408 #else
12409                         STORE_LC_NUMERIC_SET_TO_NEEDED();
12410                         if (PL_numeric_radix_sv && IN_LC(LC_NUMERIC)) {
12411                             STRLEN n;
12412                             const char* r = SvPV(PL_numeric_radix_sv, n);
12413                             Copy(r, p, n, char);
12414                             p += n;
12415                         }
12416                         else {
12417                             *p++ = '.';
12418                         }
12419                         RESTORE_LC_NUMERIC();
12420 #endif
12421                     }
12422
12423                     while (v <= vlnz)
12424                         *p++ = xdig[*v++];
12425
12426                     while (zerotail--)
12427                         *p++ = '0';
12428                 }
12429                 else {
12430                     *p++ = '0';
12431                     exponent = 0;
12432                 }
12433
12434                 elen = p - PL_efloatbuf;
12435                 elen += my_snprintf(p, PL_efloatsize - elen,
12436                                     "%c%+d", lower ? 'p' : 'P',
12437                                     exponent);
12438
12439                 if (elen < width) {
12440                     if (left) {
12441                         /* Pad the back with spaces. */
12442                         memset(PL_efloatbuf + elen, ' ', width - elen);
12443                     }
12444                     else if (fill == '0') {
12445                         /* Insert the zeros between the "0x" and
12446                          * the digits, otherwise we end up with
12447                          * "0000xHHH..." */
12448                         STRLEN nzero = width - elen;
12449                         char* zerox = PL_efloatbuf + 2;
12450                         Move(zerox, zerox + nzero,  elen - 2, char);
12451                         memset(zerox, fill, nzero);
12452                     }
12453                     else {
12454                         /* Move it to the right. */
12455                         Move(PL_efloatbuf, PL_efloatbuf + width - elen,
12456                              elen, char);
12457                         /* Pad the front with spaces. */
12458                         memset(PL_efloatbuf, ' ', width - elen);
12459                     }
12460                     elen = width;
12461                 }
12462             }
12463             else {
12464                 elen = S_infnan_2pv(nv, PL_efloatbuf, PL_efloatsize, plus);
12465                 if (elen) {
12466                     /* Not affecting infnan output: precision, alt, fill. */
12467                     if (elen < width) {
12468                         if (left) {
12469                             /* Pack the back with spaces. */
12470                             memset(PL_efloatbuf + elen, ' ', width - elen);
12471                         } else {
12472                             /* Move it to the right. */
12473                             Move(PL_efloatbuf, PL_efloatbuf + width - elen,
12474                                  elen, char);
12475                             /* Pad the front with spaces. */
12476                             memset(PL_efloatbuf, ' ', width - elen);
12477                         }
12478                         elen = width;
12479                     }
12480                 }
12481             }
12482
12483             if (elen == 0) {
12484                 char *ptr = ebuf + sizeof ebuf;
12485                 *--ptr = '\0';
12486                 *--ptr = c;
12487 #if defined(USE_QUADMATH)
12488                 if (intsize == 'q') {
12489                     /* "g" -> "Qg" */
12490                     *--ptr = 'Q';
12491                 }
12492                 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
12493 #elif defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
12494                 /* Note that this is HAS_LONG_DOUBLE and PERL_PRIfldbl,
12495                  * not USE_LONG_DOUBLE and NVff.  In other words,
12496                  * this needs to work without USE_LONG_DOUBLE. */
12497                 if (intsize == 'q') {
12498                     /* Copy the one or more characters in a long double
12499                      * format before the 'base' ([efgEFG]) character to
12500                      * the format string. */
12501                     static char const ldblf[] = PERL_PRIfldbl;
12502                     char const *p = ldblf + sizeof(ldblf) - 3;
12503                     while (p >= ldblf) { *--ptr = *p--; }
12504                 }
12505 #endif
12506                 if (has_precis) {
12507                     base = precis;
12508                     do { *--ptr = '0' + (base % 10); } while (base /= 10);
12509                     *--ptr = '.';
12510                 }
12511                 if (width) {
12512                     base = width;
12513                     do { *--ptr = '0' + (base % 10); } while (base /= 10);
12514                 }
12515                 if (fill == '0')
12516                     *--ptr = fill;
12517                 if (left)
12518                     *--ptr = '-';
12519                 if (plus)
12520                     *--ptr = plus;
12521                 if (alt)
12522                     *--ptr = '#';
12523                 *--ptr = '%';
12524
12525                 /* No taint.  Otherwise we are in the strange situation
12526                  * where printf() taints but print($float) doesn't.
12527                  * --jhi */
12528
12529                 STORE_LC_NUMERIC_SET_TO_NEEDED();
12530
12531                 /* hopefully the above makes ptr a very constrained format
12532                  * that is safe to use, even though it's not literal */
12533                 GCC_DIAG_IGNORE(-Wformat-nonliteral);
12534 #ifdef USE_QUADMATH
12535                 {
12536                     const char* qfmt = quadmath_format_single(ptr);
12537                     if (!qfmt)
12538                         Perl_croak_nocontext("panic: quadmath invalid format \"%s\"", ptr);
12539                     elen = quadmath_snprintf(PL_efloatbuf, PL_efloatsize,
12540                                              qfmt, nv);
12541                     if ((IV)elen == -1)
12542                         Perl_croak_nocontext("panic: quadmath_snprintf failed, format \"%s|'", qfmt);
12543                     if (qfmt != ptr)
12544                         Safefree(qfmt);
12545                 }
12546 #elif defined(HAS_LONG_DOUBLE)
12547                 elen = ((intsize == 'q')
12548                         ? my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, fv)
12549                         : my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, (double)fv));
12550 #else
12551                 elen = my_sprintf(PL_efloatbuf, ptr, fv);
12552 #endif
12553                 GCC_DIAG_RESTORE;
12554             }
12555
12556         float_converted:
12557             eptr = PL_efloatbuf;
12558             assert((IV)elen > 0); /* here zero elen is bad */
12559
12560 #ifdef USE_LOCALE_NUMERIC
12561             /* If the decimal point character in the string is UTF-8, make the
12562              * output utf8 */
12563             if (PL_numeric_radix_sv && SvUTF8(PL_numeric_radix_sv)
12564                 && instr(eptr, SvPVX_const(PL_numeric_radix_sv)))
12565             {
12566                 is_utf8 = TRUE;
12567             }
12568 #endif
12569
12570             break;
12571
12572             /* SPECIAL */
12573
12574         case 'n':
12575             if (vectorize)
12576                 goto unknown;
12577             i = SvCUR(sv) - origlen;
12578             if (args) {
12579                 switch (intsize) {
12580                 case 'c':       *(va_arg(*args, char*)) = i; break;
12581                 case 'h':       *(va_arg(*args, short*)) = i; break;
12582                 default:        *(va_arg(*args, int*)) = i; break;
12583                 case 'l':       *(va_arg(*args, long*)) = i; break;
12584                 case 'V':       *(va_arg(*args, IV*)) = i; break;
12585                 case 'z':       *(va_arg(*args, SSize_t*)) = i; break;
12586 #ifdef HAS_PTRDIFF_T
12587                 case 't':       *(va_arg(*args, ptrdiff_t*)) = i; break;
12588 #endif
12589 #ifdef I_STDINT
12590                 case 'j':       *(va_arg(*args, intmax_t*)) = i; break;
12591 #endif
12592                 case 'q':
12593 #if IVSIZE >= 8
12594                                 *(va_arg(*args, Quad_t*)) = i; break;
12595 #else
12596                                 goto unknown;
12597 #endif
12598                 }
12599             }
12600             else
12601                 sv_setuv_mg(argsv, has_utf8 ? (UV)sv_len_utf8(sv) : (UV)i);
12602             continue;   /* not "break" */
12603
12604             /* UNKNOWN */
12605
12606         default:
12607       unknown:
12608             if (!args
12609                 && (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)
12610                 && ckWARN(WARN_PRINTF))
12611             {
12612                 SV * const msg = sv_newmortal();
12613                 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
12614                           (PL_op->op_type == OP_PRTF) ? "" : "s");
12615                 if (fmtstart < patend) {
12616                     const char * const fmtend = q < patend ? q : patend;
12617                     const char * f;
12618                     sv_catpvs(msg, "\"%");
12619                     for (f = fmtstart; f < fmtend; f++) {
12620                         if (isPRINT(*f)) {
12621                             sv_catpvn_nomg(msg, f, 1);
12622                         } else {
12623                             Perl_sv_catpvf(aTHX_ msg,
12624                                            "\\%03"UVof, (UV)*f & 0xFF);
12625                         }
12626                     }
12627                     sv_catpvs(msg, "\"");
12628                 } else {
12629                     sv_catpvs(msg, "end of string");
12630                 }
12631                 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, SVfARG(msg)); /* yes, this is reentrant */
12632             }
12633
12634             /* output mangled stuff ... */
12635             if (c == '\0')
12636                 --q;
12637             eptr = p;
12638             elen = q - p;
12639
12640             /* ... right here, because formatting flags should not apply */
12641             SvGROW(sv, SvCUR(sv) + elen + 1);
12642             p = SvEND(sv);
12643             Copy(eptr, p, elen, char);
12644             p += elen;
12645             *p = '\0';
12646             SvCUR_set(sv, p - SvPVX_const(sv));
12647             svix = osvix;
12648             continue;   /* not "break" */
12649         }
12650
12651         if (is_utf8 != has_utf8) {
12652             if (is_utf8) {
12653                 if (SvCUR(sv))
12654                     sv_utf8_upgrade(sv);
12655             }
12656             else {
12657                 const STRLEN old_elen = elen;
12658                 SV * const nsv = newSVpvn_flags(eptr, elen, SVs_TEMP);
12659                 sv_utf8_upgrade(nsv);
12660                 eptr = SvPVX_const(nsv);
12661                 elen = SvCUR(nsv);
12662
12663                 if (width) { /* fudge width (can't fudge elen) */
12664                     width += elen - old_elen;
12665                 }
12666                 is_utf8 = TRUE;
12667             }
12668         }
12669
12670         assert((IV)elen >= 0); /* here zero elen is fine */
12671         have = esignlen + zeros + elen;
12672         if (have < zeros)
12673             croak_memory_wrap();
12674
12675         need = (have > width ? have : width);
12676         gap = need - have;
12677
12678         if (need >= (((STRLEN)~0) - SvCUR(sv) - dotstrlen - 1))
12679             croak_memory_wrap();
12680         SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
12681         p = SvEND(sv);
12682         if (esignlen && fill == '0') {
12683             int i;
12684             for (i = 0; i < (int)esignlen; i++)
12685                 *p++ = esignbuf[i];
12686         }
12687         if (gap && !left) {
12688             memset(p, fill, gap);
12689             p += gap;
12690         }
12691         if (esignlen && fill != '0') {
12692             int i;
12693             for (i = 0; i < (int)esignlen; i++)
12694                 *p++ = esignbuf[i];
12695         }
12696         if (zeros) {
12697             int i;
12698             for (i = zeros; i; i--)
12699                 *p++ = '0';
12700         }
12701         if (elen) {
12702             Copy(eptr, p, elen, char);
12703             p += elen;
12704         }
12705         if (gap && left) {
12706             memset(p, ' ', gap);
12707             p += gap;
12708         }
12709         if (vectorize) {
12710             if (veclen) {
12711                 Copy(dotstr, p, dotstrlen, char);
12712                 p += dotstrlen;
12713             }
12714             else
12715                 vectorize = FALSE;              /* done iterating over vecstr */
12716         }
12717         if (is_utf8)
12718             has_utf8 = TRUE;
12719         if (has_utf8)
12720             SvUTF8_on(sv);
12721         *p = '\0';
12722         SvCUR_set(sv, p - SvPVX_const(sv));
12723         if (vectorize) {
12724             esignlen = 0;
12725             goto vector;
12726         }
12727     }
12728
12729     /* Now that we've consumed all our printf format arguments (svix)
12730      * do we have things left on the stack that we didn't use?
12731      */
12732     if (!no_redundant_warning && svmax >= svix + 1 && ckWARN(WARN_REDUNDANT)) {
12733         Perl_warner(aTHX_ packWARN(WARN_REDUNDANT), "Redundant argument in %s",
12734                 PL_op ? OP_DESC(PL_op) : "sv_vcatpvfn()");
12735     }
12736
12737     SvTAINT(sv);
12738
12739     RESTORE_LC_NUMERIC();   /* Done outside loop, so don't have to save/restore
12740                                each iteration. */
12741 }
12742
12743 /* =========================================================================
12744
12745 =head1 Cloning an interpreter
12746
12747 =cut
12748
12749 All the macros and functions in this section are for the private use of
12750 the main function, perl_clone().
12751
12752 The foo_dup() functions make an exact copy of an existing foo thingy.
12753 During the course of a cloning, a hash table is used to map old addresses
12754 to new addresses.  The table is created and manipulated with the
12755 ptr_table_* functions.
12756
12757  * =========================================================================*/
12758
12759
12760 #if defined(USE_ITHREADS)
12761
12762 /* XXX Remove this so it doesn't have to go thru the macro and return for nothing */
12763 #ifndef GpREFCNT_inc
12764 #  define GpREFCNT_inc(gp)      ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
12765 #endif
12766
12767
12768 /* Certain cases in Perl_ss_dup have been merged, by relying on the fact
12769    that currently av_dup, gv_dup and hv_dup are the same as sv_dup.
12770    If this changes, please unmerge ss_dup.
12771    Likewise, sv_dup_inc_multiple() relies on this fact.  */
12772 #define sv_dup_inc_NN(s,t)      SvREFCNT_inc_NN(sv_dup_inc(s,t))
12773 #define av_dup(s,t)     MUTABLE_AV(sv_dup((const SV *)s,t))
12774 #define av_dup_inc(s,t) MUTABLE_AV(sv_dup_inc((const SV *)s,t))
12775 #define hv_dup(s,t)     MUTABLE_HV(sv_dup((const SV *)s,t))
12776 #define hv_dup_inc(s,t) MUTABLE_HV(sv_dup_inc((const SV *)s,t))
12777 #define cv_dup(s,t)     MUTABLE_CV(sv_dup((const SV *)s,t))
12778 #define cv_dup_inc(s,t) MUTABLE_CV(sv_dup_inc((const SV *)s,t))
12779 #define io_dup(s,t)     MUTABLE_IO(sv_dup((const SV *)s,t))
12780 #define io_dup_inc(s,t) MUTABLE_IO(sv_dup_inc((const SV *)s,t))
12781 #define gv_dup(s,t)     MUTABLE_GV(sv_dup((const SV *)s,t))
12782 #define gv_dup_inc(s,t) MUTABLE_GV(sv_dup_inc((const SV *)s,t))
12783 #define SAVEPV(p)       ((p) ? savepv(p) : NULL)
12784 #define SAVEPVN(p,n)    ((p) ? savepvn(p,n) : NULL)
12785
12786 /* clone a parser */
12787
12788 yy_parser *
12789 Perl_parser_dup(pTHX_ const yy_parser *const proto, CLONE_PARAMS *const param)
12790 {
12791     yy_parser *parser;
12792
12793     PERL_ARGS_ASSERT_PARSER_DUP;
12794
12795     if (!proto)
12796         return NULL;
12797
12798     /* look for it in the table first */
12799     parser = (yy_parser *)ptr_table_fetch(PL_ptr_table, proto);
12800     if (parser)
12801         return parser;
12802
12803     /* create anew and remember what it is */
12804     Newxz(parser, 1, yy_parser);
12805     ptr_table_store(PL_ptr_table, proto, parser);
12806
12807     /* XXX these not yet duped */
12808     parser->old_parser = NULL;
12809     parser->stack = NULL;
12810     parser->ps = NULL;
12811     parser->stack_size = 0;
12812     /* XXX parser->stack->state = 0; */
12813
12814     /* XXX eventually, just Copy() most of the parser struct ? */
12815
12816     parser->lex_brackets = proto->lex_brackets;
12817     parser->lex_casemods = proto->lex_casemods;
12818     parser->lex_brackstack = savepvn(proto->lex_brackstack,
12819                     (proto->lex_brackets < 120 ? 120 : proto->lex_brackets));
12820     parser->lex_casestack = savepvn(proto->lex_casestack,
12821                     (proto->lex_casemods < 12 ? 12 : proto->lex_casemods));
12822     parser->lex_defer   = proto->lex_defer;
12823     parser->lex_dojoin  = proto->lex_dojoin;
12824     parser->lex_formbrack = proto->lex_formbrack;
12825     parser->lex_inpat   = proto->lex_inpat;
12826     parser->lex_inwhat  = proto->lex_inwhat;
12827     parser->lex_op      = proto->lex_op;
12828     parser->lex_repl    = sv_dup_inc(proto->lex_repl, param);
12829     parser->lex_starts  = proto->lex_starts;
12830     parser->lex_stuff   = sv_dup_inc(proto->lex_stuff, param);
12831     parser->multi_close = proto->multi_close;
12832     parser->multi_open  = proto->multi_open;
12833     parser->multi_start = proto->multi_start;
12834     parser->multi_end   = proto->multi_end;
12835     parser->preambled   = proto->preambled;
12836     parser->sublex_info = proto->sublex_info; /* XXX not quite right */
12837     parser->linestr     = sv_dup_inc(proto->linestr, param);
12838     parser->expect      = proto->expect;
12839     parser->copline     = proto->copline;
12840     parser->last_lop_op = proto->last_lop_op;
12841     parser->lex_state   = proto->lex_state;
12842     parser->rsfp        = fp_dup(proto->rsfp, '<', param);
12843     /* rsfp_filters entries have fake IoDIRP() */
12844     parser->rsfp_filters= av_dup_inc(proto->rsfp_filters, param);
12845     parser->in_my       = proto->in_my;
12846     parser->in_my_stash = hv_dup(proto->in_my_stash, param);
12847     parser->error_count = proto->error_count;
12848
12849
12850     parser->linestr     = sv_dup_inc(proto->linestr, param);
12851
12852     {
12853         char * const ols = SvPVX(proto->linestr);
12854         char * const ls  = SvPVX(parser->linestr);
12855
12856         parser->bufptr      = ls + (proto->bufptr >= ols ?
12857                                     proto->bufptr -  ols : 0);
12858         parser->oldbufptr   = ls + (proto->oldbufptr >= ols ?
12859                                     proto->oldbufptr -  ols : 0);
12860         parser->oldoldbufptr= ls + (proto->oldoldbufptr >= ols ?
12861                                     proto->oldoldbufptr -  ols : 0);
12862         parser->linestart   = ls + (proto->linestart >= ols ?
12863                                     proto->linestart -  ols : 0);
12864         parser->last_uni    = ls + (proto->last_uni >= ols ?
12865                                     proto->last_uni -  ols : 0);
12866         parser->last_lop    = ls + (proto->last_lop >= ols ?
12867                                     proto->last_lop -  ols : 0);
12868
12869         parser->bufend      = ls + SvCUR(parser->linestr);
12870     }
12871
12872     Copy(proto->tokenbuf, parser->tokenbuf, 256, char);
12873
12874
12875     Copy(proto->nextval, parser->nextval, 5, YYSTYPE);
12876     Copy(proto->nexttype, parser->nexttype, 5,  I32);
12877     parser->nexttoke    = proto->nexttoke;
12878
12879     /* XXX should clone saved_curcop here, but we aren't passed
12880      * proto_perl; so do it in perl_clone_using instead */
12881
12882     return parser;
12883 }
12884
12885
12886 /* duplicate a file handle */
12887
12888 PerlIO *
12889 Perl_fp_dup(pTHX_ PerlIO *const fp, const char type, CLONE_PARAMS *const param)
12890 {
12891     PerlIO *ret;
12892
12893     PERL_ARGS_ASSERT_FP_DUP;
12894     PERL_UNUSED_ARG(type);
12895
12896     if (!fp)
12897         return (PerlIO*)NULL;
12898
12899     /* look for it in the table first */
12900     ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
12901     if (ret)
12902         return ret;
12903
12904     /* create anew and remember what it is */
12905     ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
12906     ptr_table_store(PL_ptr_table, fp, ret);
12907     return ret;
12908 }
12909
12910 /* duplicate a directory handle */
12911
12912 DIR *
12913 Perl_dirp_dup(pTHX_ DIR *const dp, CLONE_PARAMS *const param)
12914 {
12915     DIR *ret;
12916
12917 #if defined(HAS_FCHDIR) && defined(HAS_TELLDIR) && defined(HAS_SEEKDIR)
12918     DIR *pwd;
12919     const Direntry_t *dirent;
12920     char smallbuf[256];
12921     char *name = NULL;
12922     STRLEN len = 0;
12923     long pos;
12924 #endif
12925
12926     PERL_UNUSED_CONTEXT;
12927     PERL_ARGS_ASSERT_DIRP_DUP;
12928
12929     if (!dp)
12930         return (DIR*)NULL;
12931
12932     /* look for it in the table first */
12933     ret = (DIR*)ptr_table_fetch(PL_ptr_table, dp);
12934     if (ret)
12935         return ret;
12936
12937 #if defined(HAS_FCHDIR) && defined(HAS_TELLDIR) && defined(HAS_SEEKDIR)
12938
12939     PERL_UNUSED_ARG(param);
12940
12941     /* create anew */
12942
12943     /* open the current directory (so we can switch back) */
12944     if (!(pwd = PerlDir_open("."))) return (DIR *)NULL;
12945
12946     /* chdir to our dir handle and open the present working directory */
12947     if (fchdir(my_dirfd(dp)) < 0 || !(ret = PerlDir_open("."))) {
12948         PerlDir_close(pwd);
12949         return (DIR *)NULL;
12950     }
12951     /* Now we should have two dir handles pointing to the same dir. */
12952
12953     /* Be nice to the calling code and chdir back to where we were. */
12954     /* XXX If this fails, then what? */
12955     PERL_UNUSED_RESULT(fchdir(my_dirfd(pwd)));
12956
12957     /* We have no need of the pwd handle any more. */
12958     PerlDir_close(pwd);
12959
12960 #ifdef DIRNAMLEN
12961 # define d_namlen(d) (d)->d_namlen
12962 #else
12963 # define d_namlen(d) strlen((d)->d_name)
12964 #endif
12965     /* Iterate once through dp, to get the file name at the current posi-
12966        tion. Then step back. */
12967     pos = PerlDir_tell(dp);
12968     if ((dirent = PerlDir_read(dp))) {
12969         len = d_namlen(dirent);
12970         if (len <= sizeof smallbuf) name = smallbuf;
12971         else Newx(name, len, char);
12972         Move(dirent->d_name, name, len, char);
12973     }
12974     PerlDir_seek(dp, pos);
12975
12976     /* Iterate through the new dir handle, till we find a file with the
12977        right name. */
12978     if (!dirent) /* just before the end */
12979         for(;;) {
12980             pos = PerlDir_tell(ret);
12981             if (PerlDir_read(ret)) continue; /* not there yet */
12982             PerlDir_seek(ret, pos); /* step back */
12983             break;
12984         }
12985     else {
12986         const long pos0 = PerlDir_tell(ret);
12987         for(;;) {
12988             pos = PerlDir_tell(ret);
12989             if ((dirent = PerlDir_read(ret))) {
12990                 if (len == (STRLEN)d_namlen(dirent)
12991                     && memEQ(name, dirent->d_name, len)) {
12992                     /* found it */
12993                     PerlDir_seek(ret, pos); /* step back */
12994                     break;
12995                 }
12996                 /* else we are not there yet; keep iterating */
12997             }
12998             else { /* This is not meant to happen. The best we can do is
12999                       reset the iterator to the beginning. */
13000                 PerlDir_seek(ret, pos0);
13001                 break;
13002             }
13003         }
13004     }
13005 #undef d_namlen
13006
13007     if (name && name != smallbuf)
13008         Safefree(name);
13009 #endif
13010
13011 #ifdef WIN32
13012     ret = win32_dirp_dup(dp, param);
13013 #endif
13014
13015     /* pop it in the pointer table */
13016     if (ret)
13017         ptr_table_store(PL_ptr_table, dp, ret);
13018
13019     return ret;
13020 }
13021
13022 /* duplicate a typeglob */
13023
13024 GP *
13025 Perl_gp_dup(pTHX_ GP *const gp, CLONE_PARAMS *const param)
13026 {
13027     GP *ret;
13028
13029     PERL_ARGS_ASSERT_GP_DUP;
13030
13031     if (!gp)
13032         return (GP*)NULL;
13033     /* look for it in the table first */
13034     ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
13035     if (ret)
13036         return ret;
13037
13038     /* create anew and remember what it is */
13039     Newxz(ret, 1, GP);
13040     ptr_table_store(PL_ptr_table, gp, ret);
13041
13042     /* clone */
13043     /* ret->gp_refcnt must be 0 before any other dups are called. We're relying
13044        on Newxz() to do this for us.  */
13045     ret->gp_sv          = sv_dup_inc(gp->gp_sv, param);
13046     ret->gp_io          = io_dup_inc(gp->gp_io, param);
13047     ret->gp_form        = cv_dup_inc(gp->gp_form, param);
13048     ret->gp_av          = av_dup_inc(gp->gp_av, param);
13049     ret->gp_hv          = hv_dup_inc(gp->gp_hv, param);
13050     ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
13051     ret->gp_cv          = cv_dup_inc(gp->gp_cv, param);
13052     ret->gp_cvgen       = gp->gp_cvgen;
13053     ret->gp_line        = gp->gp_line;
13054     ret->gp_file_hek    = hek_dup(gp->gp_file_hek, param);
13055     return ret;
13056 }
13057
13058 /* duplicate a chain of magic */
13059
13060 MAGIC *
13061 Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS *const param)
13062 {
13063     MAGIC *mgret = NULL;
13064     MAGIC **mgprev_p = &mgret;
13065
13066     PERL_ARGS_ASSERT_MG_DUP;
13067
13068     for (; mg; mg = mg->mg_moremagic) {
13069         MAGIC *nmg;
13070
13071         if ((param->flags & CLONEf_JOIN_IN)
13072                 && mg->mg_type == PERL_MAGIC_backref)
13073             /* when joining, we let the individual SVs add themselves to
13074              * backref as needed. */
13075             continue;
13076
13077         Newx(nmg, 1, MAGIC);
13078         *mgprev_p = nmg;
13079         mgprev_p = &(nmg->mg_moremagic);
13080
13081         /* There was a comment "XXX copy dynamic vtable?" but as we don't have
13082            dynamic vtables, I'm not sure why Sarathy wrote it. The comment dates
13083            from the original commit adding Perl_mg_dup() - revision 4538.
13084            Similarly there is the annotation "XXX random ptr?" next to the
13085            assignment to nmg->mg_ptr.  */
13086         *nmg = *mg;
13087
13088         /* FIXME for plugins
13089         if (nmg->mg_type == PERL_MAGIC_qr) {
13090             nmg->mg_obj = MUTABLE_SV(CALLREGDUPE((REGEXP*)nmg->mg_obj, param));
13091         }
13092         else
13093         */
13094         nmg->mg_obj = (nmg->mg_flags & MGf_REFCOUNTED)
13095                           ? nmg->mg_type == PERL_MAGIC_backref
13096                                 /* The backref AV has its reference
13097                                  * count deliberately bumped by 1 */
13098                                 ? SvREFCNT_inc(av_dup_inc((const AV *)
13099                                                     nmg->mg_obj, param))
13100                                 : sv_dup_inc(nmg->mg_obj, param)
13101                           : sv_dup(nmg->mg_obj, param);
13102
13103         if (nmg->mg_ptr && nmg->mg_type != PERL_MAGIC_regex_global) {
13104             if (nmg->mg_len > 0) {
13105                 nmg->mg_ptr     = SAVEPVN(nmg->mg_ptr, nmg->mg_len);
13106                 if (nmg->mg_type == PERL_MAGIC_overload_table &&
13107                         AMT_AMAGIC((AMT*)nmg->mg_ptr))
13108                 {
13109                     AMT * const namtp = (AMT*)nmg->mg_ptr;
13110                     sv_dup_inc_multiple((SV**)(namtp->table),
13111                                         (SV**)(namtp->table), NofAMmeth, param);
13112                 }
13113             }
13114             else if (nmg->mg_len == HEf_SVKEY)
13115                 nmg->mg_ptr = (char*)sv_dup_inc((const SV *)nmg->mg_ptr, param);
13116         }
13117         if ((nmg->mg_flags & MGf_DUP) && nmg->mg_virtual && nmg->mg_virtual->svt_dup) {
13118             nmg->mg_virtual->svt_dup(aTHX_ nmg, param);
13119         }
13120     }
13121     return mgret;
13122 }
13123
13124 #endif /* USE_ITHREADS */
13125
13126 struct ptr_tbl_arena {
13127     struct ptr_tbl_arena *next;
13128     struct ptr_tbl_ent array[1023/3]; /* as ptr_tbl_ent has 3 pointers.  */
13129 };
13130
13131 /* create a new pointer-mapping table */
13132
13133 PTR_TBL_t *
13134 Perl_ptr_table_new(pTHX)
13135 {
13136     PTR_TBL_t *tbl;
13137     PERL_UNUSED_CONTEXT;
13138
13139     Newx(tbl, 1, PTR_TBL_t);
13140     tbl->tbl_max        = 511;
13141     tbl->tbl_items      = 0;
13142     tbl->tbl_arena      = NULL;
13143     tbl->tbl_arena_next = NULL;
13144     tbl->tbl_arena_end  = NULL;
13145     Newxz(tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
13146     return tbl;
13147 }
13148
13149 #define PTR_TABLE_HASH(ptr) \
13150   ((PTR2UV(ptr) >> 3) ^ (PTR2UV(ptr) >> (3 + 7)) ^ (PTR2UV(ptr) >> (3 + 17)))
13151
13152 /* map an existing pointer using a table */
13153
13154 STATIC PTR_TBL_ENT_t *
13155 S_ptr_table_find(PTR_TBL_t *const tbl, const void *const sv)
13156 {
13157     PTR_TBL_ENT_t *tblent;
13158     const UV hash = PTR_TABLE_HASH(sv);
13159
13160     PERL_ARGS_ASSERT_PTR_TABLE_FIND;
13161
13162     tblent = tbl->tbl_ary[hash & tbl->tbl_max];
13163     for (; tblent; tblent = tblent->next) {
13164         if (tblent->oldval == sv)
13165             return tblent;
13166     }
13167     return NULL;
13168 }
13169
13170 void *
13171 Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *const tbl, const void *const sv)
13172 {
13173     PTR_TBL_ENT_t const *const tblent = ptr_table_find(tbl, sv);
13174
13175     PERL_ARGS_ASSERT_PTR_TABLE_FETCH;
13176     PERL_UNUSED_CONTEXT;
13177
13178     return tblent ? tblent->newval : NULL;
13179 }
13180
13181 /* add a new entry to a pointer-mapping table 'tbl'.  In hash terms, 'oldsv' is
13182  * the key; 'newsv' is the value.  The names "old" and "new" are specific to
13183  * the core's typical use of ptr_tables in thread cloning. */
13184
13185 void
13186 Perl_ptr_table_store(pTHX_ PTR_TBL_t *const tbl, const void *const oldsv, void *const newsv)
13187 {
13188     PTR_TBL_ENT_t *tblent = ptr_table_find(tbl, oldsv);
13189
13190     PERL_ARGS_ASSERT_PTR_TABLE_STORE;
13191     PERL_UNUSED_CONTEXT;
13192
13193     if (tblent) {
13194         tblent->newval = newsv;
13195     } else {
13196         const UV entry = PTR_TABLE_HASH(oldsv) & tbl->tbl_max;
13197
13198         if (tbl->tbl_arena_next == tbl->tbl_arena_end) {
13199             struct ptr_tbl_arena *new_arena;
13200
13201             Newx(new_arena, 1, struct ptr_tbl_arena);
13202             new_arena->next = tbl->tbl_arena;
13203             tbl->tbl_arena = new_arena;
13204             tbl->tbl_arena_next = new_arena->array;
13205             tbl->tbl_arena_end = C_ARRAY_END(new_arena->array);
13206         }
13207
13208         tblent = tbl->tbl_arena_next++;
13209
13210         tblent->oldval = oldsv;
13211         tblent->newval = newsv;
13212         tblent->next = tbl->tbl_ary[entry];
13213         tbl->tbl_ary[entry] = tblent;
13214         tbl->tbl_items++;
13215         if (tblent->next && tbl->tbl_items > tbl->tbl_max)
13216             ptr_table_split(tbl);
13217     }
13218 }
13219
13220 /* double the hash bucket size of an existing ptr table */
13221
13222 void
13223 Perl_ptr_table_split(pTHX_ PTR_TBL_t *const tbl)
13224 {
13225     PTR_TBL_ENT_t **ary = tbl->tbl_ary;
13226     const UV oldsize = tbl->tbl_max + 1;
13227     UV newsize = oldsize * 2;
13228     UV i;
13229
13230     PERL_ARGS_ASSERT_PTR_TABLE_SPLIT;
13231     PERL_UNUSED_CONTEXT;
13232
13233     Renew(ary, newsize, PTR_TBL_ENT_t*);
13234     Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
13235     tbl->tbl_max = --newsize;
13236     tbl->tbl_ary = ary;
13237     for (i=0; i < oldsize; i++, ary++) {
13238         PTR_TBL_ENT_t **entp = ary;
13239         PTR_TBL_ENT_t *ent = *ary;
13240         PTR_TBL_ENT_t **curentp;
13241         if (!ent)
13242             continue;
13243         curentp = ary + oldsize;
13244         do {
13245             if ((newsize & PTR_TABLE_HASH(ent->oldval)) != i) {
13246                 *entp = ent->next;
13247                 ent->next = *curentp;
13248                 *curentp = ent;
13249             }
13250             else
13251                 entp = &ent->next;
13252             ent = *entp;
13253         } while (ent);
13254     }
13255 }
13256
13257 /* remove all the entries from a ptr table */
13258 /* Deprecated - will be removed post 5.14 */
13259
13260 void
13261 Perl_ptr_table_clear(pTHX_ PTR_TBL_t *const tbl)
13262 {
13263     PERL_UNUSED_CONTEXT;
13264     if (tbl && tbl->tbl_items) {
13265         struct ptr_tbl_arena *arena = tbl->tbl_arena;
13266
13267         Zero(tbl->tbl_ary, tbl->tbl_max + 1, struct ptr_tbl_ent **);
13268
13269         while (arena) {
13270             struct ptr_tbl_arena *next = arena->next;
13271
13272             Safefree(arena);
13273             arena = next;
13274         };
13275
13276         tbl->tbl_items = 0;
13277         tbl->tbl_arena = NULL;
13278         tbl->tbl_arena_next = NULL;
13279         tbl->tbl_arena_end = NULL;
13280     }
13281 }
13282
13283 /* clear and free a ptr table */
13284
13285 void
13286 Perl_ptr_table_free(pTHX_ PTR_TBL_t *const tbl)
13287 {
13288     struct ptr_tbl_arena *arena;
13289
13290     PERL_UNUSED_CONTEXT;
13291
13292     if (!tbl) {
13293         return;
13294     }
13295
13296     arena = tbl->tbl_arena;
13297
13298     while (arena) {
13299         struct ptr_tbl_arena *next = arena->next;
13300
13301         Safefree(arena);
13302         arena = next;
13303     }
13304
13305     Safefree(tbl->tbl_ary);
13306     Safefree(tbl);
13307 }
13308
13309 #if defined(USE_ITHREADS)
13310
13311 void
13312 Perl_rvpv_dup(pTHX_ SV *const dstr, const SV *const sstr, CLONE_PARAMS *const param)
13313 {
13314     PERL_ARGS_ASSERT_RVPV_DUP;
13315
13316     assert(!isREGEXP(sstr));
13317     if (SvROK(sstr)) {
13318         if (SvWEAKREF(sstr)) {
13319             SvRV_set(dstr, sv_dup(SvRV_const(sstr), param));
13320             if (param->flags & CLONEf_JOIN_IN) {
13321                 /* if joining, we add any back references individually rather
13322                  * than copying the whole backref array */
13323                 Perl_sv_add_backref(aTHX_ SvRV(dstr), dstr);
13324             }
13325         }
13326         else
13327             SvRV_set(dstr, sv_dup_inc(SvRV_const(sstr), param));
13328     }
13329     else if (SvPVX_const(sstr)) {
13330         /* Has something there */
13331         if (SvLEN(sstr)) {
13332             /* Normal PV - clone whole allocated space */
13333             SvPV_set(dstr, SAVEPVN(SvPVX_const(sstr), SvLEN(sstr)-1));
13334             /* sstr may not be that normal, but actually copy on write.
13335                But we are a true, independent SV, so:  */
13336             SvIsCOW_off(dstr);
13337         }
13338         else {
13339             /* Special case - not normally malloced for some reason */
13340             if (isGV_with_GP(sstr)) {
13341                 /* Don't need to do anything here.  */
13342             }
13343             else if ((SvIsCOW(sstr))) {
13344                 /* A "shared" PV - clone it as "shared" PV */
13345                 SvPV_set(dstr,
13346                          HEK_KEY(hek_dup(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)),
13347                                          param)));
13348             }
13349             else {
13350                 /* Some other special case - random pointer */
13351                 SvPV_set(dstr, (char *) SvPVX_const(sstr));             
13352             }
13353         }
13354     }
13355     else {
13356         /* Copy the NULL */
13357         SvPV_set(dstr, NULL);
13358     }
13359 }
13360
13361 /* duplicate a list of SVs. source and dest may point to the same memory.  */
13362 static SV **
13363 S_sv_dup_inc_multiple(pTHX_ SV *const *source, SV **dest,
13364                       SSize_t items, CLONE_PARAMS *const param)
13365 {
13366     PERL_ARGS_ASSERT_SV_DUP_INC_MULTIPLE;
13367
13368     while (items-- > 0) {
13369         *dest++ = sv_dup_inc(*source++, param);
13370     }
13371
13372     return dest;
13373 }
13374
13375 /* duplicate an SV of any type (including AV, HV etc) */
13376
13377 static SV *
13378 S_sv_dup_common(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
13379 {
13380     dVAR;
13381     SV *dstr;
13382
13383     PERL_ARGS_ASSERT_SV_DUP_COMMON;
13384
13385     if (SvTYPE(sstr) == (svtype)SVTYPEMASK) {
13386 #ifdef DEBUG_LEAKING_SCALARS_ABORT
13387         abort();
13388 #endif
13389         return NULL;
13390     }
13391     /* look for it in the table first */
13392     dstr = MUTABLE_SV(ptr_table_fetch(PL_ptr_table, sstr));
13393     if (dstr)
13394         return dstr;
13395
13396     if(param->flags & CLONEf_JOIN_IN) {
13397         /** We are joining here so we don't want do clone
13398             something that is bad **/
13399         if (SvTYPE(sstr) == SVt_PVHV) {
13400             const HEK * const hvname = HvNAME_HEK(sstr);
13401             if (hvname) {
13402                 /** don't clone stashes if they already exist **/
13403                 dstr = MUTABLE_SV(gv_stashpvn(HEK_KEY(hvname), HEK_LEN(hvname),
13404                                                 HEK_UTF8(hvname) ? SVf_UTF8 : 0));
13405                 ptr_table_store(PL_ptr_table, sstr, dstr);
13406                 return dstr;
13407             }
13408         }
13409         else if (SvTYPE(sstr) == SVt_PVGV && !SvFAKE(sstr)) {
13410             HV *stash = GvSTASH(sstr);
13411             const HEK * hvname;
13412             if (stash && (hvname = HvNAME_HEK(stash))) {
13413                 /** don't clone GVs if they already exist **/
13414                 SV **svp;
13415                 stash = gv_stashpvn(HEK_KEY(hvname), HEK_LEN(hvname),
13416                                     HEK_UTF8(hvname) ? SVf_UTF8 : 0);
13417                 svp = hv_fetch(
13418                         stash, GvNAME(sstr),
13419                         GvNAMEUTF8(sstr)
13420                             ? -GvNAMELEN(sstr)
13421                             :  GvNAMELEN(sstr),
13422                         0
13423                       );
13424                 if (svp && *svp && SvTYPE(*svp) == SVt_PVGV) {
13425                     ptr_table_store(PL_ptr_table, sstr, *svp);
13426                     return *svp;
13427                 }
13428             }
13429         }
13430     }
13431
13432     /* create anew and remember what it is */
13433     new_SV(dstr);
13434
13435 #ifdef DEBUG_LEAKING_SCALARS
13436     dstr->sv_debug_optype = sstr->sv_debug_optype;
13437     dstr->sv_debug_line = sstr->sv_debug_line;
13438     dstr->sv_debug_inpad = sstr->sv_debug_inpad;
13439     dstr->sv_debug_parent = (SV*)sstr;
13440     FREE_SV_DEBUG_FILE(dstr);
13441     dstr->sv_debug_file = savesharedpv(sstr->sv_debug_file);
13442 #endif
13443
13444     ptr_table_store(PL_ptr_table, sstr, dstr);
13445
13446     /* clone */
13447     SvFLAGS(dstr)       = SvFLAGS(sstr);
13448     SvFLAGS(dstr)       &= ~SVf_OOK;            /* don't propagate OOK hack */
13449     SvREFCNT(dstr)      = 0;                    /* must be before any other dups! */
13450
13451 #ifdef DEBUGGING
13452     if (SvANY(sstr) && PL_watch_pvx && SvPVX_const(sstr) == PL_watch_pvx)
13453         PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
13454                       (void*)PL_watch_pvx, SvPVX_const(sstr));
13455 #endif
13456
13457     /* don't clone objects whose class has asked us not to */
13458     if (SvOBJECT(sstr)
13459      && ! (SvFLAGS(SvSTASH(sstr)) & SVphv_CLONEABLE))
13460     {
13461         SvFLAGS(dstr) = 0;
13462         return dstr;
13463     }
13464
13465     switch (SvTYPE(sstr)) {
13466     case SVt_NULL:
13467         SvANY(dstr)     = NULL;
13468         break;
13469     case SVt_IV:
13470         SET_SVANY_FOR_BODYLESS_IV(dstr);
13471         if(SvROK(sstr)) {
13472             Perl_rvpv_dup(aTHX_ dstr, sstr, param);
13473         } else {
13474             SvIV_set(dstr, SvIVX(sstr));
13475         }
13476         break;
13477     case SVt_NV:
13478 #if NVSIZE <= IVSIZE
13479         SET_SVANY_FOR_BODYLESS_NV(dstr);
13480 #else
13481         SvANY(dstr)     = new_XNV();
13482 #endif
13483         SvNV_set(dstr, SvNVX(sstr));
13484         break;
13485     default:
13486         {
13487             /* These are all the types that need complex bodies allocating.  */
13488             void *new_body;
13489             const svtype sv_type = SvTYPE(sstr);
13490             const struct body_details *const sv_type_details
13491                 = bodies_by_type + sv_type;
13492
13493             switch (sv_type) {
13494             default:
13495                 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
13496                 break;
13497
13498             case SVt_PVGV:
13499             case SVt_PVIO:
13500             case SVt_PVFM:
13501             case SVt_PVHV:
13502             case SVt_PVAV:
13503             case SVt_PVCV:
13504             case SVt_PVLV:
13505             case SVt_REGEXP:
13506             case SVt_PVMG:
13507             case SVt_PVNV:
13508             case SVt_PVIV:
13509             case SVt_INVLIST:
13510             case SVt_PV:
13511                 assert(sv_type_details->body_size);
13512                 if (sv_type_details->arena) {
13513                     new_body_inline(new_body, sv_type);
13514                     new_body
13515                         = (void*)((char*)new_body - sv_type_details->offset);
13516                 } else {
13517                     new_body = new_NOARENA(sv_type_details);
13518                 }
13519             }
13520             assert(new_body);
13521             SvANY(dstr) = new_body;
13522
13523 #ifndef PURIFY
13524             Copy(((char*)SvANY(sstr)) + sv_type_details->offset,
13525                  ((char*)SvANY(dstr)) + sv_type_details->offset,
13526                  sv_type_details->copy, char);
13527 #else
13528             Copy(((char*)SvANY(sstr)),
13529                  ((char*)SvANY(dstr)),
13530                  sv_type_details->body_size + sv_type_details->offset, char);
13531 #endif
13532
13533             if (sv_type != SVt_PVAV && sv_type != SVt_PVHV
13534                 && !isGV_with_GP(dstr)
13535                 && !isREGEXP(dstr)
13536                 && !(sv_type == SVt_PVIO && !(IoFLAGS(dstr) & IOf_FAKE_DIRP)))
13537                 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
13538
13539             /* The Copy above means that all the source (unduplicated) pointers
13540                are now in the destination.  We can check the flags and the
13541                pointers in either, but it's possible that there's less cache
13542                missing by always going for the destination.
13543                FIXME - instrument and check that assumption  */
13544             if (sv_type >= SVt_PVMG) {
13545                 if (SvMAGIC(dstr))
13546                     SvMAGIC_set(dstr, mg_dup(SvMAGIC(dstr), param));
13547                 if (SvOBJECT(dstr) && SvSTASH(dstr))
13548                     SvSTASH_set(dstr, hv_dup_inc(SvSTASH(dstr), param));
13549                 else SvSTASH_set(dstr, 0); /* don't copy DESTROY cache */
13550             }
13551
13552             /* The cast silences a GCC warning about unhandled types.  */
13553             switch ((int)sv_type) {
13554             case SVt_PV:
13555                 break;
13556             case SVt_PVIV:
13557                 break;
13558             case SVt_PVNV:
13559                 break;
13560             case SVt_PVMG:
13561                 break;
13562             case SVt_REGEXP:
13563               duprex:
13564                 /* FIXME for plugins */
13565                 dstr->sv_u.svu_rx = ((REGEXP *)dstr)->sv_any;
13566                 re_dup_guts((REGEXP*) sstr, (REGEXP*) dstr, param);
13567                 break;
13568             case SVt_PVLV:
13569                 /* XXX LvTARGOFF sometimes holds PMOP* when DEBUGGING */
13570                 if (LvTYPE(dstr) == 't') /* for tie: unrefcnted fake (SV**) */
13571                     LvTARG(dstr) = dstr;
13572                 else if (LvTYPE(dstr) == 'T') /* for tie: fake HE */
13573                     LvTARG(dstr) = MUTABLE_SV(he_dup((HE*)LvTARG(dstr), 0, param));
13574                 else
13575                     LvTARG(dstr) = sv_dup_inc(LvTARG(dstr), param);
13576                 if (isREGEXP(sstr)) goto duprex;
13577             case SVt_PVGV:
13578                 /* non-GP case already handled above */
13579                 if(isGV_with_GP(sstr)) {
13580                     GvNAME_HEK(dstr) = hek_dup(GvNAME_HEK(dstr), param);
13581                     /* Don't call sv_add_backref here as it's going to be
13582                        created as part of the magic cloning of the symbol
13583                        table--unless this is during a join and the stash
13584                        is not actually being cloned.  */
13585                     /* Danger Will Robinson - GvGP(dstr) isn't initialised
13586                        at the point of this comment.  */
13587                     GvSTASH(dstr) = hv_dup(GvSTASH(dstr), param);
13588                     if (param->flags & CLONEf_JOIN_IN)
13589                         Perl_sv_add_backref(aTHX_ MUTABLE_SV(GvSTASH(dstr)), dstr);
13590                     GvGP_set(dstr, gp_dup(GvGP(sstr), param));
13591                     (void)GpREFCNT_inc(GvGP(dstr));
13592                 }
13593                 break;
13594             case SVt_PVIO:
13595                 /* PL_parser->rsfp_filters entries have fake IoDIRP() */
13596                 if(IoFLAGS(dstr) & IOf_FAKE_DIRP) {
13597                     /* I have no idea why fake dirp (rsfps)
13598                        should be treated differently but otherwise
13599                        we end up with leaks -- sky*/
13600                     IoTOP_GV(dstr)      = gv_dup_inc(IoTOP_GV(dstr), param);
13601                     IoFMT_GV(dstr)      = gv_dup_inc(IoFMT_GV(dstr), param);
13602                     IoBOTTOM_GV(dstr)   = gv_dup_inc(IoBOTTOM_GV(dstr), param);
13603                 } else {
13604                     IoTOP_GV(dstr)      = gv_dup(IoTOP_GV(dstr), param);
13605                     IoFMT_GV(dstr)      = gv_dup(IoFMT_GV(dstr), param);
13606                     IoBOTTOM_GV(dstr)   = gv_dup(IoBOTTOM_GV(dstr), param);
13607                     if (IoDIRP(dstr)) {
13608                         IoDIRP(dstr)    = dirp_dup(IoDIRP(dstr), param);
13609                     } else {
13610                         NOOP;
13611                         /* IoDIRP(dstr) is already a copy of IoDIRP(sstr)  */
13612                     }
13613                     IoIFP(dstr) = fp_dup(IoIFP(sstr), IoTYPE(dstr), param);
13614                 }
13615                 if (IoOFP(dstr) == IoIFP(sstr))
13616                     IoOFP(dstr) = IoIFP(dstr);
13617                 else
13618                     IoOFP(dstr) = fp_dup(IoOFP(dstr), IoTYPE(dstr), param);
13619                 IoTOP_NAME(dstr)        = SAVEPV(IoTOP_NAME(dstr));
13620                 IoFMT_NAME(dstr)        = SAVEPV(IoFMT_NAME(dstr));
13621                 IoBOTTOM_NAME(dstr)     = SAVEPV(IoBOTTOM_NAME(dstr));
13622                 break;
13623             case SVt_PVAV:
13624                 /* avoid cloning an empty array */
13625                 if (AvARRAY((const AV *)sstr) && AvFILLp((const AV *)sstr) >= 0) {
13626                     SV **dst_ary, **src_ary;
13627                     SSize_t items = AvFILLp((const AV *)sstr) + 1;
13628
13629                     src_ary = AvARRAY((const AV *)sstr);
13630                     Newxz(dst_ary, AvMAX((const AV *)sstr)+1, SV*);
13631                     ptr_table_store(PL_ptr_table, src_ary, dst_ary);
13632                     AvARRAY(MUTABLE_AV(dstr)) = dst_ary;
13633                     AvALLOC((const AV *)dstr) = dst_ary;
13634                     if (AvREAL((const AV *)sstr)) {
13635                         dst_ary = sv_dup_inc_multiple(src_ary, dst_ary, items,
13636                                                       param);
13637                     }
13638                     else {
13639                         while (items-- > 0)
13640                             *dst_ary++ = sv_dup(*src_ary++, param);
13641                     }
13642                     items = AvMAX((const AV *)sstr) - AvFILLp((const AV *)sstr);
13643                     while (items-- > 0) {
13644                         *dst_ary++ = NULL;
13645                     }
13646                 }
13647                 else {
13648                     AvARRAY(MUTABLE_AV(dstr))   = NULL;
13649                     AvALLOC((const AV *)dstr)   = (SV**)NULL;
13650                     AvMAX(  (const AV *)dstr)   = -1;
13651                     AvFILLp((const AV *)dstr)   = -1;
13652                 }
13653                 break;
13654             case SVt_PVHV:
13655                 if (HvARRAY((const HV *)sstr)) {
13656                     STRLEN i = 0;
13657                     const bool sharekeys = !!HvSHAREKEYS(sstr);
13658                     XPVHV * const dxhv = (XPVHV*)SvANY(dstr);
13659                     XPVHV * const sxhv = (XPVHV*)SvANY(sstr);
13660                     char *darray;
13661                     Newx(darray, PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1)
13662                         + (SvOOK(sstr) ? sizeof(struct xpvhv_aux) : 0),
13663                         char);
13664                     HvARRAY(dstr) = (HE**)darray;
13665                     while (i <= sxhv->xhv_max) {
13666                         const HE * const source = HvARRAY(sstr)[i];
13667                         HvARRAY(dstr)[i] = source
13668                             ? he_dup(source, sharekeys, param) : 0;
13669                         ++i;
13670                     }
13671                     if (SvOOK(sstr)) {
13672                         const struct xpvhv_aux * const saux = HvAUX(sstr);
13673                         struct xpvhv_aux * const daux = HvAUX(dstr);
13674                         /* This flag isn't copied.  */
13675                         SvOOK_on(dstr);
13676
13677                         if (saux->xhv_name_count) {
13678                             HEK ** const sname = saux->xhv_name_u.xhvnameu_names;
13679                             const I32 count
13680                              = saux->xhv_name_count < 0
13681                                 ? -saux->xhv_name_count
13682                                 :  saux->xhv_name_count;
13683                             HEK **shekp = sname + count;
13684                             HEK **dhekp;
13685                             Newx(daux->xhv_name_u.xhvnameu_names, count, HEK *);
13686                             dhekp = daux->xhv_name_u.xhvnameu_names + count;
13687                             while (shekp-- > sname) {
13688                                 dhekp--;
13689                                 *dhekp = hek_dup(*shekp, param);
13690                             }
13691                         }
13692                         else {
13693                             daux->xhv_name_u.xhvnameu_name
13694                                 = hek_dup(saux->xhv_name_u.xhvnameu_name,
13695                                           param);
13696                         }
13697                         daux->xhv_name_count = saux->xhv_name_count;
13698
13699                         daux->xhv_fill_lazy = saux->xhv_fill_lazy;
13700                         daux->xhv_aux_flags = saux->xhv_aux_flags;
13701 #ifdef PERL_HASH_RANDOMIZE_KEYS
13702                         daux->xhv_rand = saux->xhv_rand;
13703                         daux->xhv_last_rand = saux->xhv_last_rand;
13704 #endif
13705                         daux->xhv_riter = saux->xhv_riter;
13706                         daux->xhv_eiter = saux->xhv_eiter
13707                             ? he_dup(saux->xhv_eiter,
13708                                         cBOOL(HvSHAREKEYS(sstr)), param) : 0;
13709                         /* backref array needs refcnt=2; see sv_add_backref */
13710                         daux->xhv_backreferences =
13711                             (param->flags & CLONEf_JOIN_IN)
13712                                 /* when joining, we let the individual GVs and
13713                                  * CVs add themselves to backref as
13714                                  * needed. This avoids pulling in stuff
13715                                  * that isn't required, and simplifies the
13716                                  * case where stashes aren't cloned back
13717                                  * if they already exist in the parent
13718                                  * thread */
13719                             ? NULL
13720                             : saux->xhv_backreferences
13721                                 ? (SvTYPE(saux->xhv_backreferences) == SVt_PVAV)
13722                                     ? MUTABLE_AV(SvREFCNT_inc(
13723                                           sv_dup_inc((const SV *)
13724                                             saux->xhv_backreferences, param)))
13725                                     : MUTABLE_AV(sv_dup((const SV *)
13726                                             saux->xhv_backreferences, param))
13727                                 : 0;
13728
13729                         daux->xhv_mro_meta = saux->xhv_mro_meta
13730                             ? mro_meta_dup(saux->xhv_mro_meta, param)
13731                             : 0;
13732
13733                         /* Record stashes for possible cloning in Perl_clone(). */
13734                         if (HvNAME(sstr))
13735                             av_push(param->stashes, dstr);
13736                     }
13737                 }
13738                 else
13739                     HvARRAY(MUTABLE_HV(dstr)) = NULL;
13740                 break;
13741             case SVt_PVCV:
13742                 if (!(param->flags & CLONEf_COPY_STACKS)) {
13743                     CvDEPTH(dstr) = 0;
13744                 }
13745                 /* FALLTHROUGH */
13746             case SVt_PVFM:
13747                 /* NOTE: not refcounted */
13748                 SvANY(MUTABLE_CV(dstr))->xcv_stash =
13749                     hv_dup(CvSTASH(dstr), param);
13750                 if ((param->flags & CLONEf_JOIN_IN) && CvSTASH(dstr))
13751                     Perl_sv_add_backref(aTHX_ MUTABLE_SV(CvSTASH(dstr)), dstr);
13752                 if (!CvISXSUB(dstr)) {
13753                     OP_REFCNT_LOCK;
13754                     CvROOT(dstr) = OpREFCNT_inc(CvROOT(dstr));
13755                     OP_REFCNT_UNLOCK;
13756                     CvSLABBED_off(dstr);
13757                 } else if (CvCONST(dstr)) {
13758                     CvXSUBANY(dstr).any_ptr =
13759                         sv_dup_inc((const SV *)CvXSUBANY(dstr).any_ptr, param);
13760                 }
13761                 assert(!CvSLABBED(dstr));
13762                 if (CvDYNFILE(dstr)) CvFILE(dstr) = SAVEPV(CvFILE(dstr));
13763                 if (CvNAMED(dstr))
13764                     SvANY((CV *)dstr)->xcv_gv_u.xcv_hek =
13765                         hek_dup(CvNAME_HEK((CV *)sstr), param);
13766                 /* don't dup if copying back - CvGV isn't refcounted, so the
13767                  * duped GV may never be freed. A bit of a hack! DAPM */
13768                 else
13769                   SvANY(MUTABLE_CV(dstr))->xcv_gv_u.xcv_gv =
13770                     CvCVGV_RC(dstr)
13771                     ? gv_dup_inc(CvGV(sstr), param)
13772                     : (param->flags & CLONEf_JOIN_IN)
13773                         ? NULL
13774                         : gv_dup(CvGV(sstr), param);
13775
13776                 if (!CvISXSUB(sstr)) {
13777                     PADLIST * padlist = CvPADLIST(sstr);
13778                     if(padlist)
13779                         padlist = padlist_dup(padlist, param);
13780                     CvPADLIST_set(dstr, padlist);
13781                 } else
13782 /* unthreaded perl can't sv_dup so we dont support unthreaded's CvHSCXT */
13783                     PoisonPADLIST(dstr);
13784
13785                 CvOUTSIDE(dstr) =
13786                     CvWEAKOUTSIDE(sstr)
13787                     ? cv_dup(    CvOUTSIDE(dstr), param)
13788                     : cv_dup_inc(CvOUTSIDE(dstr), param);
13789                 break;
13790             }
13791         }
13792     }
13793
13794     return dstr;
13795  }
13796
13797 SV *
13798 Perl_sv_dup_inc(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
13799 {
13800     PERL_ARGS_ASSERT_SV_DUP_INC;
13801     return sstr ? SvREFCNT_inc(sv_dup_common(sstr, param)) : NULL;
13802 }
13803
13804 SV *
13805 Perl_sv_dup(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
13806 {
13807     SV *dstr = sstr ? sv_dup_common(sstr, param) : NULL;
13808     PERL_ARGS_ASSERT_SV_DUP;
13809
13810     /* Track every SV that (at least initially) had a reference count of 0.
13811        We need to do this by holding an actual reference to it in this array.
13812        If we attempt to cheat, turn AvREAL_off(), and store only pointers
13813        (akin to the stashes hash, and the perl stack), we come unstuck if
13814        a weak reference (or other SV legitimately SvREFCNT() == 0 for this
13815        thread) is manipulated in a CLONE method, because CLONE runs before the
13816        unreferenced array is walked to find SVs still with SvREFCNT() == 0
13817        (and fix things up by giving each a reference via the temps stack).
13818        Instead, during CLONE, if the 0-referenced SV has SvREFCNT_inc() and
13819        then SvREFCNT_dec(), it will be cleaned up (and added to the free list)
13820        before the walk of unreferenced happens and a reference to that is SV
13821        added to the temps stack. At which point we have the same SV considered
13822        to be in use, and free to be re-used. Not good.
13823     */
13824     if (dstr && !(param->flags & CLONEf_COPY_STACKS) && !SvREFCNT(dstr)) {
13825         assert(param->unreferenced);
13826         av_push(param->unreferenced, SvREFCNT_inc(dstr));
13827     }
13828
13829     return dstr;
13830 }
13831
13832 /* duplicate a context */
13833
13834 PERL_CONTEXT *
13835 Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
13836 {
13837     PERL_CONTEXT *ncxs;
13838
13839     PERL_ARGS_ASSERT_CX_DUP;
13840
13841     if (!cxs)
13842         return (PERL_CONTEXT*)NULL;
13843
13844     /* look for it in the table first */
13845     ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
13846     if (ncxs)
13847         return ncxs;
13848
13849     /* create anew and remember what it is */
13850     Newx(ncxs, max + 1, PERL_CONTEXT);
13851     ptr_table_store(PL_ptr_table, cxs, ncxs);
13852     Copy(cxs, ncxs, max + 1, PERL_CONTEXT);
13853
13854     while (ix >= 0) {
13855         PERL_CONTEXT * const ncx = &ncxs[ix];
13856         if (CxTYPE(ncx) == CXt_SUBST) {
13857             Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
13858         }
13859         else {
13860             ncx->blk_oldcop = (COP*)any_dup(ncx->blk_oldcop, param->proto_perl);
13861             switch (CxTYPE(ncx)) {
13862             case CXt_SUB:
13863                 ncx->blk_sub.cv         = (ncx->blk_sub.olddepth == 0
13864                                            ? cv_dup_inc(ncx->blk_sub.cv, param)
13865                                            : cv_dup(ncx->blk_sub.cv,param));
13866                 if(CxHASARGS(ncx)){
13867                     ncx->blk_sub.argarray = av_dup_inc(ncx->blk_sub.argarray,param);
13868                     ncx->blk_sub.savearray = av_dup_inc(ncx->blk_sub.savearray,param);
13869                 } else {
13870                     ncx->blk_sub.argarray = NULL;
13871                     ncx->blk_sub.savearray = NULL;
13872                 }
13873                 ncx->blk_sub.oldcomppad = (PAD*)ptr_table_fetch(PL_ptr_table,
13874                                            ncx->blk_sub.oldcomppad);
13875                 break;
13876             case CXt_EVAL:
13877                 ncx->blk_eval.old_namesv = sv_dup_inc(ncx->blk_eval.old_namesv,
13878                                                       param);
13879                 ncx->blk_eval.cur_text  = sv_dup(ncx->blk_eval.cur_text, param);
13880                 ncx->blk_eval.cv = cv_dup(ncx->blk_eval.cv, param);
13881                 break;
13882             case CXt_LOOP_LAZYSV:
13883                 ncx->blk_loop.state_u.lazysv.end
13884                     = sv_dup_inc(ncx->blk_loop.state_u.lazysv.end, param);
13885                 /* Fallthrough: duplicate lazysv.cur by using the ary.ary
13886                    duplication code instead.
13887                    We are taking advantage of (1) av_dup_inc and sv_dup_inc
13888                    actually being the same function, and (2) order
13889                    equivalence of the two unions.
13890                    We can assert the later [but only at run time :-(]  */
13891                 assert ((void *) &ncx->blk_loop.state_u.ary.ary ==
13892                         (void *) &ncx->blk_loop.state_u.lazysv.cur);
13893                 /* FALLTHROUGH */
13894             case CXt_LOOP_FOR:
13895                 ncx->blk_loop.state_u.ary.ary
13896                     = av_dup_inc(ncx->blk_loop.state_u.ary.ary, param);
13897                 /* FALLTHROUGH */
13898             case CXt_LOOP_LAZYIV:
13899             case CXt_LOOP_PLAIN:
13900                 /* code common to all CXt_LOOP_* types */
13901                 if (CxPADLOOP(ncx)) {
13902                     ncx->blk_loop.itervar_u.oldcomppad
13903                         = (PAD*)ptr_table_fetch(PL_ptr_table,
13904                                         ncx->blk_loop.itervar_u.oldcomppad);
13905                 } else {
13906                     ncx->blk_loop.itervar_u.gv
13907                         = gv_dup((const GV *)ncx->blk_loop.itervar_u.gv,
13908                                     param);
13909                 }
13910                 break;
13911             case CXt_FORMAT:
13912                 ncx->blk_format.cv      = cv_dup(ncx->blk_format.cv, param);
13913                 ncx->blk_format.gv      = gv_dup(ncx->blk_format.gv, param);
13914                 ncx->blk_format.dfoutgv = gv_dup_inc(ncx->blk_format.dfoutgv,
13915                                                      param);
13916                 break;
13917             case CXt_BLOCK:
13918             case CXt_NULL:
13919             case CXt_WHEN:
13920             case CXt_GIVEN:
13921                 break;
13922             }
13923         }
13924         --ix;
13925     }
13926     return ncxs;
13927 }
13928
13929 /* duplicate a stack info structure */
13930
13931 PERL_SI *
13932 Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
13933 {
13934     PERL_SI *nsi;
13935
13936     PERL_ARGS_ASSERT_SI_DUP;
13937
13938     if (!si)
13939         return (PERL_SI*)NULL;
13940
13941     /* look for it in the table first */
13942     nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
13943     if (nsi)
13944         return nsi;
13945
13946     /* create anew and remember what it is */
13947     Newxz(nsi, 1, PERL_SI);
13948     ptr_table_store(PL_ptr_table, si, nsi);
13949
13950     nsi->si_stack       = av_dup_inc(si->si_stack, param);
13951     nsi->si_cxix        = si->si_cxix;
13952     nsi->si_cxmax       = si->si_cxmax;
13953     nsi->si_cxstack     = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
13954     nsi->si_type        = si->si_type;
13955     nsi->si_prev        = si_dup(si->si_prev, param);
13956     nsi->si_next        = si_dup(si->si_next, param);
13957     nsi->si_markoff     = si->si_markoff;
13958
13959     return nsi;
13960 }
13961
13962 #define POPINT(ss,ix)   ((ss)[--(ix)].any_i32)
13963 #define TOPINT(ss,ix)   ((ss)[ix].any_i32)
13964 #define POPLONG(ss,ix)  ((ss)[--(ix)].any_long)
13965 #define TOPLONG(ss,ix)  ((ss)[ix].any_long)
13966 #define POPIV(ss,ix)    ((ss)[--(ix)].any_iv)
13967 #define TOPIV(ss,ix)    ((ss)[ix].any_iv)
13968 #define POPUV(ss,ix)    ((ss)[--(ix)].any_uv)
13969 #define TOPUV(ss,ix)    ((ss)[ix].any_uv)
13970 #define POPBOOL(ss,ix)  ((ss)[--(ix)].any_bool)
13971 #define TOPBOOL(ss,ix)  ((ss)[ix].any_bool)
13972 #define POPPTR(ss,ix)   ((ss)[--(ix)].any_ptr)
13973 #define TOPPTR(ss,ix)   ((ss)[ix].any_ptr)
13974 #define POPDPTR(ss,ix)  ((ss)[--(ix)].any_dptr)
13975 #define TOPDPTR(ss,ix)  ((ss)[ix].any_dptr)
13976 #define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
13977 #define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
13978
13979 /* XXXXX todo */
13980 #define pv_dup_inc(p)   SAVEPV(p)
13981 #define pv_dup(p)       SAVEPV(p)
13982 #define svp_dup_inc(p,pp)       any_dup(p,pp)
13983
13984 /* map any object to the new equivent - either something in the
13985  * ptr table, or something in the interpreter structure
13986  */
13987
13988 void *
13989 Perl_any_dup(pTHX_ void *v, const PerlInterpreter *proto_perl)
13990 {
13991     void *ret;
13992
13993     PERL_ARGS_ASSERT_ANY_DUP;
13994
13995     if (!v)
13996         return (void*)NULL;
13997
13998     /* look for it in the table first */
13999     ret = ptr_table_fetch(PL_ptr_table, v);
14000     if (ret)
14001         return ret;
14002
14003     /* see if it is part of the interpreter structure */
14004     if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
14005         ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
14006     else {
14007         ret = v;
14008     }
14009
14010     return ret;
14011 }
14012
14013 /* duplicate the save stack */
14014
14015 ANY *
14016 Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
14017 {
14018     dVAR;
14019     ANY * const ss      = proto_perl->Isavestack;
14020     const I32 max       = proto_perl->Isavestack_max;
14021     I32 ix              = proto_perl->Isavestack_ix;
14022     ANY *nss;
14023     const SV *sv;
14024     const GV *gv;
14025     const AV *av;
14026     const HV *hv;
14027     void* ptr;
14028     int intval;
14029     long longval;
14030     GP *gp;
14031     IV iv;
14032     I32 i;
14033     char *c = NULL;
14034     void (*dptr) (void*);
14035     void (*dxptr) (pTHX_ void*);
14036
14037     PERL_ARGS_ASSERT_SS_DUP;
14038
14039     Newxz(nss, max, ANY);
14040
14041     while (ix > 0) {
14042         const UV uv = POPUV(ss,ix);
14043         const U8 type = (U8)uv & SAVE_MASK;
14044
14045         TOPUV(nss,ix) = uv;
14046         switch (type) {
14047         case SAVEt_CLEARSV:
14048         case SAVEt_CLEARPADRANGE:
14049             break;
14050         case SAVEt_HELEM:               /* hash element */
14051         case SAVEt_SV:                  /* scalar reference */
14052             sv = (const SV *)POPPTR(ss,ix);
14053             TOPPTR(nss,ix) = SvREFCNT_inc(sv_dup_inc(sv, param));
14054             /* FALLTHROUGH */
14055         case SAVEt_ITEM:                        /* normal string */
14056         case SAVEt_GVSV:                        /* scalar slot in GV */
14057             sv = (const SV *)POPPTR(ss,ix);
14058             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
14059             if (type == SAVEt_SV)
14060                 break;
14061             /* FALLTHROUGH */
14062         case SAVEt_FREESV:
14063         case SAVEt_MORTALIZESV:
14064         case SAVEt_READONLY_OFF:
14065             sv = (const SV *)POPPTR(ss,ix);
14066             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
14067             break;
14068         case SAVEt_FREEPADNAME:
14069             ptr = POPPTR(ss,ix);
14070             TOPPTR(nss,ix) = padname_dup((PADNAME *)ptr, param);
14071             PadnameREFCNT((PADNAME *)TOPPTR(nss,ix))++;
14072             break;
14073         case SAVEt_SHARED_PVREF:                /* char* in shared space */
14074             c = (char*)POPPTR(ss,ix);
14075             TOPPTR(nss,ix) = savesharedpv(c);
14076             ptr = POPPTR(ss,ix);
14077             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
14078             break;
14079         case SAVEt_GENERIC_SVREF:               /* generic sv */
14080         case SAVEt_SVREF:                       /* scalar reference */
14081             sv = (const SV *)POPPTR(ss,ix);
14082             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
14083             if (type == SAVEt_SVREF)
14084                 SvREFCNT_inc_simple_void((SV *)TOPPTR(nss,ix));
14085             ptr = POPPTR(ss,ix);
14086             TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
14087             break;
14088         case SAVEt_GVSLOT:              /* any slot in GV */
14089             sv = (const SV *)POPPTR(ss,ix);
14090             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
14091             ptr = POPPTR(ss,ix);
14092             TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
14093             sv = (const SV *)POPPTR(ss,ix);
14094             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
14095             break;
14096         case SAVEt_HV:                          /* hash reference */
14097         case SAVEt_AV:                          /* array reference */
14098             sv = (const SV *) POPPTR(ss,ix);
14099             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
14100             /* FALLTHROUGH */
14101         case SAVEt_COMPPAD:
14102         case SAVEt_NSTAB:
14103             sv = (const SV *) POPPTR(ss,ix);
14104             TOPPTR(nss,ix) = sv_dup(sv, param);
14105             break;
14106         case SAVEt_INT:                         /* int reference */
14107             ptr = POPPTR(ss,ix);
14108             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
14109             intval = (int)POPINT(ss,ix);
14110             TOPINT(nss,ix) = intval;
14111             break;
14112         case SAVEt_LONG:                        /* long reference */
14113             ptr = POPPTR(ss,ix);
14114             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
14115             longval = (long)POPLONG(ss,ix);
14116             TOPLONG(nss,ix) = longval;
14117             break;
14118         case SAVEt_I32:                         /* I32 reference */
14119             ptr = POPPTR(ss,ix);
14120             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
14121             i = POPINT(ss,ix);
14122             TOPINT(nss,ix) = i;
14123             break;
14124         case SAVEt_IV:                          /* IV reference */
14125         case SAVEt_STRLEN:                      /* STRLEN/size_t ref */
14126             ptr = POPPTR(ss,ix);
14127             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
14128             iv = POPIV(ss,ix);
14129             TOPIV(nss,ix) = iv;
14130             break;
14131         case SAVEt_HPTR:                        /* HV* reference */
14132         case SAVEt_APTR:                        /* AV* reference */
14133         case SAVEt_SPTR:                        /* SV* reference */
14134             ptr = POPPTR(ss,ix);
14135             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
14136             sv = (const SV *)POPPTR(ss,ix);
14137             TOPPTR(nss,ix) = sv_dup(sv, param);
14138             break;
14139         case SAVEt_VPTR:                        /* random* reference */
14140             ptr = POPPTR(ss,ix);
14141             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
14142             /* FALLTHROUGH */
14143         case SAVEt_INT_SMALL:
14144         case SAVEt_I32_SMALL:
14145         case SAVEt_I16:                         /* I16 reference */
14146         case SAVEt_I8:                          /* I8 reference */
14147         case SAVEt_BOOL:
14148             ptr = POPPTR(ss,ix);
14149             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
14150             break;
14151         case SAVEt_GENERIC_PVREF:               /* generic char* */
14152         case SAVEt_PPTR:                        /* char* reference */
14153             ptr = POPPTR(ss,ix);
14154             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
14155             c = (char*)POPPTR(ss,ix);
14156             TOPPTR(nss,ix) = pv_dup(c);
14157             break;
14158         case SAVEt_GP:                          /* scalar reference */
14159             gp = (GP*)POPPTR(ss,ix);
14160             TOPPTR(nss,ix) = gp = gp_dup(gp, param);
14161             (void)GpREFCNT_inc(gp);
14162             gv = (const GV *)POPPTR(ss,ix);
14163             TOPPTR(nss,ix) = gv_dup_inc(gv, param);
14164             break;
14165         case SAVEt_FREEOP:
14166             ptr = POPPTR(ss,ix);
14167             if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
14168                 /* these are assumed to be refcounted properly */
14169                 OP *o;
14170                 switch (((OP*)ptr)->op_type) {
14171                 case OP_LEAVESUB:
14172                 case OP_LEAVESUBLV:
14173                 case OP_LEAVEEVAL:
14174                 case OP_LEAVE:
14175                 case OP_SCOPE:
14176                 case OP_LEAVEWRITE:
14177                     TOPPTR(nss,ix) = ptr;
14178                     o = (OP*)ptr;
14179                     OP_REFCNT_LOCK;
14180                     (void) OpREFCNT_inc(o);
14181                     OP_REFCNT_UNLOCK;
14182                     break;
14183                 default:
14184                     TOPPTR(nss,ix) = NULL;
14185                     break;
14186                 }
14187             }
14188             else
14189                 TOPPTR(nss,ix) = NULL;
14190             break;
14191         case SAVEt_FREECOPHH:
14192             ptr = POPPTR(ss,ix);
14193             TOPPTR(nss,ix) = cophh_copy((COPHH *)ptr);
14194             break;
14195         case SAVEt_ADELETE:
14196             av = (const AV *)POPPTR(ss,ix);
14197             TOPPTR(nss,ix) = av_dup_inc(av, param);
14198             i = POPINT(ss,ix);
14199             TOPINT(nss,ix) = i;
14200             break;
14201         case SAVEt_DELETE:
14202             hv = (const HV *)POPPTR(ss,ix);
14203             TOPPTR(nss,ix) = hv_dup_inc(hv, param);
14204             i = POPINT(ss,ix);
14205             TOPINT(nss,ix) = i;
14206             /* FALLTHROUGH */
14207         case SAVEt_FREEPV:
14208             c = (char*)POPPTR(ss,ix);
14209             TOPPTR(nss,ix) = pv_dup_inc(c);
14210             break;
14211         case SAVEt_STACK_POS:           /* Position on Perl stack */
14212             i = POPINT(ss,ix);
14213             TOPINT(nss,ix) = i;
14214             break;
14215         case SAVEt_DESTRUCTOR:
14216             ptr = POPPTR(ss,ix);
14217             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);  /* XXX quite arbitrary */
14218             dptr = POPDPTR(ss,ix);
14219             TOPDPTR(nss,ix) = DPTR2FPTR(void (*)(void*),
14220                                         any_dup(FPTR2DPTR(void *, dptr),
14221                                                 proto_perl));
14222             break;
14223         case SAVEt_DESTRUCTOR_X:
14224             ptr = POPPTR(ss,ix);
14225             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);  /* XXX quite arbitrary */
14226             dxptr = POPDXPTR(ss,ix);
14227             TOPDXPTR(nss,ix) = DPTR2FPTR(void (*)(pTHX_ void*),
14228                                          any_dup(FPTR2DPTR(void *, dxptr),
14229                                                  proto_perl));
14230             break;
14231         case SAVEt_REGCONTEXT:
14232         case SAVEt_ALLOC:
14233             ix -= uv >> SAVE_TIGHT_SHIFT;
14234             break;
14235         case SAVEt_AELEM:               /* array element */
14236             sv = (const SV *)POPPTR(ss,ix);
14237             TOPPTR(nss,ix) = SvREFCNT_inc(sv_dup_inc(sv, param));
14238             i = POPINT(ss,ix);
14239             TOPINT(nss,ix) = i;
14240             av = (const AV *)POPPTR(ss,ix);
14241             TOPPTR(nss,ix) = av_dup_inc(av, param);
14242             break;
14243         case SAVEt_OP:
14244             ptr = POPPTR(ss,ix);
14245             TOPPTR(nss,ix) = ptr;
14246             break;
14247         case SAVEt_HINTS:
14248             ptr = POPPTR(ss,ix);
14249             ptr = cophh_copy((COPHH*)ptr);
14250             TOPPTR(nss,ix) = ptr;
14251             i = POPINT(ss,ix);
14252             TOPINT(nss,ix) = i;
14253             if (i & HINT_LOCALIZE_HH) {
14254                 hv = (const HV *)POPPTR(ss,ix);
14255                 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
14256             }
14257             break;
14258         case SAVEt_PADSV_AND_MORTALIZE:
14259             longval = (long)POPLONG(ss,ix);
14260             TOPLONG(nss,ix) = longval;
14261             ptr = POPPTR(ss,ix);
14262             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
14263             sv = (const SV *)POPPTR(ss,ix);
14264             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
14265             break;
14266         case SAVEt_SET_SVFLAGS:
14267             i = POPINT(ss,ix);
14268             TOPINT(nss,ix) = i;
14269             i = POPINT(ss,ix);
14270             TOPINT(nss,ix) = i;
14271             sv = (const SV *)POPPTR(ss,ix);
14272             TOPPTR(nss,ix) = sv_dup(sv, param);
14273             break;
14274         case SAVEt_COMPILE_WARNINGS:
14275             ptr = POPPTR(ss,ix);
14276             TOPPTR(nss,ix) = DUP_WARNINGS((STRLEN*)ptr);
14277             break;
14278         case SAVEt_PARSER:
14279             ptr = POPPTR(ss,ix);
14280             TOPPTR(nss,ix) = parser_dup((const yy_parser*)ptr, param);
14281             break;
14282         case SAVEt_GP_ALIASED_SV: {
14283             GP * gp_ptr = (GP *)POPPTR(ss,ix);
14284             GP * new_gp_ptr = gp_dup(gp_ptr, param);
14285             TOPPTR(nss,ix) = new_gp_ptr;
14286             new_gp_ptr->gp_refcnt++;
14287             break;
14288         }
14289         default:
14290             Perl_croak(aTHX_
14291                        "panic: ss_dup inconsistency (%"IVdf")", (IV) type);
14292         }
14293     }
14294
14295     return nss;
14296 }
14297
14298
14299 /* if sv is a stash, call $class->CLONE_SKIP(), and set the SVphv_CLONEABLE
14300  * flag to the result. This is done for each stash before cloning starts,
14301  * so we know which stashes want their objects cloned */
14302
14303 static void
14304 do_mark_cloneable_stash(pTHX_ SV *const sv)
14305 {
14306     const HEK * const hvname = HvNAME_HEK((const HV *)sv);
14307     if (hvname) {
14308         GV* const cloner = gv_fetchmethod_autoload(MUTABLE_HV(sv), "CLONE_SKIP", 0);
14309         SvFLAGS(sv) |= SVphv_CLONEABLE; /* clone objects by default */
14310         if (cloner && GvCV(cloner)) {
14311             dSP;
14312             UV status;
14313
14314             ENTER;
14315             SAVETMPS;
14316             PUSHMARK(SP);
14317             mXPUSHs(newSVhek(hvname));
14318             PUTBACK;
14319             call_sv(MUTABLE_SV(GvCV(cloner)), G_SCALAR);
14320             SPAGAIN;
14321             status = POPu;
14322             PUTBACK;
14323             FREETMPS;
14324             LEAVE;
14325             if (status)
14326                 SvFLAGS(sv) &= ~SVphv_CLONEABLE;
14327         }
14328     }
14329 }
14330
14331
14332
14333 /*
14334 =for apidoc perl_clone
14335
14336 Create and return a new interpreter by cloning the current one.
14337
14338 perl_clone takes these flags as parameters:
14339
14340 CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
14341 without it we only clone the data and zero the stacks,
14342 with it we copy the stacks and the new perl interpreter is
14343 ready to run at the exact same point as the previous one.
14344 The pseudo-fork code uses COPY_STACKS while the
14345 threads->create doesn't.
14346
14347 CLONEf_KEEP_PTR_TABLE -
14348 perl_clone keeps a ptr_table with the pointer of the old
14349 variable as a key and the new variable as a value,
14350 this allows it to check if something has been cloned and not
14351 clone it again but rather just use the value and increase the
14352 refcount.  If KEEP_PTR_TABLE is not set then perl_clone will kill
14353 the ptr_table using the function
14354 C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
14355 reason to keep it around is if you want to dup some of your own
14356 variable who are outside the graph perl scans, example of this
14357 code is in threads.xs create.
14358
14359 CLONEf_CLONE_HOST -
14360 This is a win32 thing, it is ignored on unix, it tells perls
14361 win32host code (which is c++) to clone itself, this is needed on
14362 win32 if you want to run two threads at the same time,
14363 if you just want to do some stuff in a separate perl interpreter
14364 and then throw it away and return to the original one,
14365 you don't need to do anything.
14366
14367 =cut
14368 */
14369
14370 /* XXX the above needs expanding by someone who actually understands it ! */
14371 EXTERN_C PerlInterpreter *
14372 perl_clone_host(PerlInterpreter* proto_perl, UV flags);
14373
14374 PerlInterpreter *
14375 perl_clone(PerlInterpreter *proto_perl, UV flags)
14376 {
14377    dVAR;
14378 #ifdef PERL_IMPLICIT_SYS
14379
14380     PERL_ARGS_ASSERT_PERL_CLONE;
14381
14382    /* perlhost.h so we need to call into it
14383    to clone the host, CPerlHost should have a c interface, sky */
14384
14385    if (flags & CLONEf_CLONE_HOST) {
14386        return perl_clone_host(proto_perl,flags);
14387    }
14388    return perl_clone_using(proto_perl, flags,
14389                             proto_perl->IMem,
14390                             proto_perl->IMemShared,
14391                             proto_perl->IMemParse,
14392                             proto_perl->IEnv,
14393                             proto_perl->IStdIO,
14394                             proto_perl->ILIO,
14395                             proto_perl->IDir,
14396                             proto_perl->ISock,
14397                             proto_perl->IProc);
14398 }
14399
14400 PerlInterpreter *
14401 perl_clone_using(PerlInterpreter *proto_perl, UV flags,
14402                  struct IPerlMem* ipM, struct IPerlMem* ipMS,
14403                  struct IPerlMem* ipMP, struct IPerlEnv* ipE,
14404                  struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
14405                  struct IPerlDir* ipD, struct IPerlSock* ipS,
14406                  struct IPerlProc* ipP)
14407 {
14408     /* XXX many of the string copies here can be optimized if they're
14409      * constants; they need to be allocated as common memory and just
14410      * their pointers copied. */
14411
14412     IV i;
14413     CLONE_PARAMS clone_params;
14414     CLONE_PARAMS* const param = &clone_params;
14415
14416     PerlInterpreter * const my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
14417
14418     PERL_ARGS_ASSERT_PERL_CLONE_USING;
14419 #else           /* !PERL_IMPLICIT_SYS */
14420     IV i;
14421     CLONE_PARAMS clone_params;
14422     CLONE_PARAMS* param = &clone_params;
14423     PerlInterpreter * const my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
14424
14425     PERL_ARGS_ASSERT_PERL_CLONE;
14426 #endif          /* PERL_IMPLICIT_SYS */
14427
14428     /* for each stash, determine whether its objects should be cloned */
14429     S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
14430     PERL_SET_THX(my_perl);
14431
14432 #ifdef DEBUGGING
14433     PoisonNew(my_perl, 1, PerlInterpreter);
14434     PL_op = NULL;
14435     PL_curcop = NULL;
14436     PL_defstash = NULL; /* may be used by perl malloc() */
14437     PL_markstack = 0;
14438     PL_scopestack = 0;
14439     PL_scopestack_name = 0;
14440     PL_savestack = 0;
14441     PL_savestack_ix = 0;
14442     PL_savestack_max = -1;
14443     PL_sig_pending = 0;
14444     PL_parser = NULL;
14445     Zero(&PL_debug_pad, 1, struct perl_debug_pad);
14446     Zero(&PL_padname_undef, 1, PADNAME);
14447     Zero(&PL_padname_const, 1, PADNAME);
14448 #  ifdef DEBUG_LEAKING_SCALARS
14449     PL_sv_serial = (((UV)my_perl >> 2) & 0xfff) * 1000000;
14450 #  endif
14451 #else   /* !DEBUGGING */
14452     Zero(my_perl, 1, PerlInterpreter);
14453 #endif  /* DEBUGGING */
14454
14455 #ifdef PERL_IMPLICIT_SYS
14456     /* host pointers */
14457     PL_Mem              = ipM;
14458     PL_MemShared        = ipMS;
14459     PL_MemParse         = ipMP;
14460     PL_Env              = ipE;
14461     PL_StdIO            = ipStd;
14462     PL_LIO              = ipLIO;
14463     PL_Dir              = ipD;
14464     PL_Sock             = ipS;
14465     PL_Proc             = ipP;
14466 #endif          /* PERL_IMPLICIT_SYS */
14467
14468
14469     param->flags = flags;
14470     /* Nothing in the core code uses this, but we make it available to
14471        extensions (using mg_dup).  */
14472     param->proto_perl = proto_perl;
14473     /* Likely nothing will use this, but it is initialised to be consistent
14474        with Perl_clone_params_new().  */
14475     param->new_perl = my_perl;
14476     param->unreferenced = NULL;
14477
14478
14479     INIT_TRACK_MEMPOOL(my_perl->Imemory_debug_header, my_perl);
14480
14481     PL_body_arenas = NULL;
14482     Zero(&PL_body_roots, 1, PL_body_roots);
14483     
14484     PL_sv_count         = 0;
14485     PL_sv_root          = NULL;
14486     PL_sv_arenaroot     = NULL;
14487
14488     PL_debug            = proto_perl->Idebug;
14489
14490     /* dbargs array probably holds garbage */
14491     PL_dbargs           = NULL;
14492
14493     PL_compiling = proto_perl->Icompiling;
14494
14495     /* pseudo environmental stuff */
14496     PL_origargc         = proto_perl->Iorigargc;
14497     PL_origargv         = proto_perl->Iorigargv;
14498
14499 #ifndef NO_TAINT_SUPPORT
14500     /* Set tainting stuff before PerlIO_debug can possibly get called */
14501     PL_tainting         = proto_perl->Itainting;
14502     PL_taint_warn       = proto_perl->Itaint_warn;
14503 #else
14504     PL_tainting         = FALSE;
14505     PL_taint_warn       = FALSE;
14506 #endif
14507
14508     PL_minus_c          = proto_perl->Iminus_c;
14509
14510     PL_localpatches     = proto_perl->Ilocalpatches;
14511     PL_splitstr         = proto_perl->Isplitstr;
14512     PL_minus_n          = proto_perl->Iminus_n;
14513     PL_minus_p          = proto_perl->Iminus_p;
14514     PL_minus_l          = proto_perl->Iminus_l;
14515     PL_minus_a          = proto_perl->Iminus_a;
14516     PL_minus_E          = proto_perl->Iminus_E;
14517     PL_minus_F          = proto_perl->Iminus_F;
14518     PL_doswitches       = proto_perl->Idoswitches;
14519     PL_dowarn           = proto_perl->Idowarn;
14520     PL_sawalias         = proto_perl->Isawalias;
14521 #ifdef PERL_SAWAMPERSAND
14522     PL_sawampersand     = proto_perl->Isawampersand;
14523 #endif
14524     PL_unsafe           = proto_perl->Iunsafe;
14525     PL_perldb           = proto_perl->Iperldb;
14526     PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
14527     PL_exit_flags       = proto_perl->Iexit_flags;
14528
14529     /* XXX time(&PL_basetime) when asked for? */
14530     PL_basetime         = proto_perl->Ibasetime;
14531
14532     PL_maxsysfd         = proto_perl->Imaxsysfd;
14533     PL_statusvalue      = proto_perl->Istatusvalue;
14534 #ifdef __VMS
14535     PL_statusvalue_vms  = proto_perl->Istatusvalue_vms;
14536 #else
14537     PL_statusvalue_posix = proto_perl->Istatusvalue_posix;
14538 #endif
14539
14540     /* RE engine related */
14541     PL_regmatch_slab    = NULL;
14542     PL_reg_curpm        = NULL;
14543
14544     PL_sub_generation   = proto_perl->Isub_generation;
14545
14546     /* funky return mechanisms */
14547     PL_forkprocess      = proto_perl->Iforkprocess;
14548
14549     /* internal state */
14550     PL_maxo             = proto_perl->Imaxo;
14551
14552     PL_main_start       = proto_perl->Imain_start;
14553     PL_eval_root        = proto_perl->Ieval_root;
14554     PL_eval_start       = proto_perl->Ieval_start;
14555
14556     PL_filemode         = proto_perl->Ifilemode;
14557     PL_lastfd           = proto_perl->Ilastfd;
14558     PL_oldname          = proto_perl->Ioldname;         /* XXX not quite right */
14559     PL_Argv             = NULL;
14560     PL_Cmd              = NULL;
14561     PL_gensym           = proto_perl->Igensym;
14562
14563     PL_laststatval      = proto_perl->Ilaststatval;
14564     PL_laststype        = proto_perl->Ilaststype;
14565     PL_mess_sv          = NULL;
14566
14567     PL_profiledata      = NULL;
14568
14569     PL_generation       = proto_perl->Igeneration;
14570
14571     PL_in_clean_objs    = proto_perl->Iin_clean_objs;
14572     PL_in_clean_all     = proto_perl->Iin_clean_all;
14573
14574     PL_delaymagic_uid   = proto_perl->Idelaymagic_uid;
14575     PL_delaymagic_euid  = proto_perl->Idelaymagic_euid;
14576     PL_delaymagic_gid   = proto_perl->Idelaymagic_gid;
14577     PL_delaymagic_egid  = proto_perl->Idelaymagic_egid;
14578     PL_nomemok          = proto_perl->Inomemok;
14579     PL_an               = proto_perl->Ian;
14580     PL_evalseq          = proto_perl->Ievalseq;
14581     PL_origenviron      = proto_perl->Iorigenviron;     /* XXX not quite right */
14582     PL_origalen         = proto_perl->Iorigalen;
14583
14584     PL_sighandlerp      = proto_perl->Isighandlerp;
14585
14586     PL_runops           = proto_perl->Irunops;
14587
14588     PL_subline          = proto_perl->Isubline;
14589
14590     PL_cv_has_eval      = proto_perl->Icv_has_eval;
14591
14592 #ifdef FCRYPT
14593     PL_cryptseen        = proto_perl->Icryptseen;
14594 #endif
14595
14596 #ifdef USE_LOCALE_COLLATE
14597     PL_collation_ix     = proto_perl->Icollation_ix;
14598     PL_collation_standard       = proto_perl->Icollation_standard;
14599     PL_collxfrm_base    = proto_perl->Icollxfrm_base;
14600     PL_collxfrm_mult    = proto_perl->Icollxfrm_mult;
14601 #endif /* USE_LOCALE_COLLATE */
14602
14603 #ifdef USE_LOCALE_NUMERIC
14604     PL_numeric_standard = proto_perl->Inumeric_standard;
14605     PL_numeric_local    = proto_perl->Inumeric_local;
14606 #endif /* !USE_LOCALE_NUMERIC */
14607
14608     /* Did the locale setup indicate UTF-8? */
14609     PL_utf8locale       = proto_perl->Iutf8locale;
14610     PL_in_utf8_CTYPE_locale = proto_perl->Iin_utf8_CTYPE_locale;
14611     /* Unicode features (see perlrun/-C) */
14612     PL_unicode          = proto_perl->Iunicode;
14613
14614     /* Pre-5.8 signals control */
14615     PL_signals          = proto_perl->Isignals;
14616
14617     /* times() ticks per second */
14618     PL_clocktick        = proto_perl->Iclocktick;
14619
14620     /* Recursion stopper for PerlIO_find_layer */
14621     PL_in_load_module   = proto_perl->Iin_load_module;
14622
14623     /* sort() routine */
14624     PL_sort_RealCmp     = proto_perl->Isort_RealCmp;
14625
14626     /* Not really needed/useful since the reenrant_retint is "volatile",
14627      * but do it for consistency's sake. */
14628     PL_reentrant_retint = proto_perl->Ireentrant_retint;
14629
14630     /* Hooks to shared SVs and locks. */
14631     PL_sharehook        = proto_perl->Isharehook;
14632     PL_lockhook         = proto_perl->Ilockhook;
14633     PL_unlockhook       = proto_perl->Iunlockhook;
14634     PL_threadhook       = proto_perl->Ithreadhook;
14635     PL_destroyhook      = proto_perl->Idestroyhook;
14636     PL_signalhook       = proto_perl->Isignalhook;
14637
14638     PL_globhook         = proto_perl->Iglobhook;
14639
14640     /* swatch cache */
14641     PL_last_swash_hv    = NULL; /* reinits on demand */
14642     PL_last_swash_klen  = 0;
14643     PL_last_swash_key[0]= '\0';
14644     PL_last_swash_tmps  = (U8*)NULL;
14645     PL_last_swash_slen  = 0;
14646
14647     PL_srand_called     = proto_perl->Isrand_called;
14648     Copy(&(proto_perl->Irandom_state), &PL_random_state, 1, PL_RANDOM_STATE_TYPE);
14649
14650     if (flags & CLONEf_COPY_STACKS) {
14651         /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
14652         PL_tmps_ix              = proto_perl->Itmps_ix;
14653         PL_tmps_max             = proto_perl->Itmps_max;
14654         PL_tmps_floor           = proto_perl->Itmps_floor;
14655
14656         /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
14657          * NOTE: unlike the others! */
14658         PL_scopestack_ix        = proto_perl->Iscopestack_ix;
14659         PL_scopestack_max       = proto_perl->Iscopestack_max;
14660
14661         /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
14662          * NOTE: unlike the others! */
14663         PL_savestack_ix         = proto_perl->Isavestack_ix;
14664         PL_savestack_max        = proto_perl->Isavestack_max;
14665     }
14666
14667     PL_start_env        = proto_perl->Istart_env;       /* XXXXXX */
14668     PL_top_env          = &PL_start_env;
14669
14670     PL_op               = proto_perl->Iop;
14671
14672     PL_Sv               = NULL;
14673     PL_Xpv              = (XPV*)NULL;
14674     my_perl->Ina        = proto_perl->Ina;
14675
14676     PL_statbuf          = proto_perl->Istatbuf;
14677     PL_statcache        = proto_perl->Istatcache;
14678
14679 #ifndef NO_TAINT_SUPPORT
14680     PL_tainted          = proto_perl->Itainted;
14681 #else
14682     PL_tainted          = FALSE;
14683 #endif
14684     PL_curpm            = proto_perl->Icurpm;   /* XXX No PMOP ref count */
14685
14686     PL_chopset          = proto_perl->Ichopset; /* XXX never deallocated */
14687
14688     PL_restartjmpenv    = proto_perl->Irestartjmpenv;
14689     PL_restartop        = proto_perl->Irestartop;
14690     PL_in_eval          = proto_perl->Iin_eval;
14691     PL_delaymagic       = proto_perl->Idelaymagic;
14692     PL_phase            = proto_perl->Iphase;
14693     PL_localizing       = proto_perl->Ilocalizing;
14694
14695     PL_hv_fetch_ent_mh  = NULL;
14696     PL_modcount         = proto_perl->Imodcount;
14697     PL_lastgotoprobe    = NULL;
14698     PL_dumpindent       = proto_perl->Idumpindent;
14699
14700     PL_efloatbuf        = NULL;         /* reinits on demand */
14701     PL_efloatsize       = 0;                    /* reinits on demand */
14702
14703     /* regex stuff */
14704
14705     PL_colorset         = 0;            /* reinits PL_colors[] */
14706     /*PL_colors[6]      = {0,0,0,0,0,0};*/
14707
14708     /* Pluggable optimizer */
14709     PL_peepp            = proto_perl->Ipeepp;
14710     PL_rpeepp           = proto_perl->Irpeepp;
14711     /* op_free() hook */
14712     PL_opfreehook       = proto_perl->Iopfreehook;
14713
14714 #ifdef USE_REENTRANT_API
14715     /* XXX: things like -Dm will segfault here in perlio, but doing
14716      *  PERL_SET_CONTEXT(proto_perl);
14717      * breaks too many other things
14718      */
14719     Perl_reentrant_init(aTHX);
14720 #endif
14721
14722     /* create SV map for pointer relocation */
14723     PL_ptr_table = ptr_table_new();
14724
14725     /* initialize these special pointers as early as possible */
14726     init_constants();
14727     ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
14728     ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
14729     ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
14730     ptr_table_store(PL_ptr_table, &proto_perl->Ipadname_const,
14731                     &PL_padname_const);
14732
14733     /* create (a non-shared!) shared string table */
14734     PL_strtab           = newHV();
14735     HvSHAREKEYS_off(PL_strtab);
14736     hv_ksplit(PL_strtab, HvTOTALKEYS(proto_perl->Istrtab));
14737     ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
14738
14739     Zero(PL_sv_consts, SV_CONSTS_COUNT, SV*);
14740
14741     /* This PV will be free'd special way so must set it same way op.c does */
14742     PL_compiling.cop_file    = savesharedpv(PL_compiling.cop_file);
14743     ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
14744
14745     ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
14746     PL_compiling.cop_warnings = DUP_WARNINGS(PL_compiling.cop_warnings);
14747     CopHINTHASH_set(&PL_compiling, cophh_copy(CopHINTHASH_get(&PL_compiling)));
14748     PL_curcop           = (COP*)any_dup(proto_perl->Icurcop, proto_perl);
14749
14750     param->stashes      = newAV();  /* Setup array of objects to call clone on */
14751     /* This makes no difference to the implementation, as it always pushes
14752        and shifts pointers to other SVs without changing their reference
14753        count, with the array becoming empty before it is freed. However, it
14754        makes it conceptually clear what is going on, and will avoid some
14755        work inside av.c, filling slots between AvFILL() and AvMAX() with
14756        &PL_sv_undef, and SvREFCNT_dec()ing those.  */
14757     AvREAL_off(param->stashes);
14758
14759     if (!(flags & CLONEf_COPY_STACKS)) {
14760         param->unreferenced = newAV();
14761     }
14762
14763 #ifdef PERLIO_LAYERS
14764     /* Clone PerlIO tables as soon as we can handle general xx_dup() */
14765     PerlIO_clone(aTHX_ proto_perl, param);
14766 #endif
14767
14768     PL_envgv            = gv_dup_inc(proto_perl->Ienvgv, param);
14769     PL_incgv            = gv_dup_inc(proto_perl->Iincgv, param);
14770     PL_hintgv           = gv_dup_inc(proto_perl->Ihintgv, param);
14771     PL_origfilename     = SAVEPV(proto_perl->Iorigfilename);
14772     PL_xsubfilename     = proto_perl->Ixsubfilename;
14773     PL_diehook          = sv_dup_inc(proto_perl->Idiehook, param);
14774     PL_warnhook         = sv_dup_inc(proto_perl->Iwarnhook, param);
14775
14776     /* switches */
14777     PL_patchlevel       = sv_dup_inc(proto_perl->Ipatchlevel, param);
14778     PL_inplace          = SAVEPV(proto_perl->Iinplace);
14779     PL_e_script         = sv_dup_inc(proto_perl->Ie_script, param);
14780
14781     /* magical thingies */
14782
14783     PL_encoding         = sv_dup(proto_perl->Iencoding, param);
14784     PL_lex_encoding     = sv_dup(proto_perl->Ilex_encoding, param);
14785
14786     sv_setpvs(PERL_DEBUG_PAD(0), "");   /* For regex debugging. */
14787     sv_setpvs(PERL_DEBUG_PAD(1), "");   /* ext/re needs these */
14788     sv_setpvs(PERL_DEBUG_PAD(2), "");   /* even without DEBUGGING. */
14789
14790    
14791     /* Clone the regex array */
14792     /* ORANGE FIXME for plugins, probably in the SV dup code.
14793        newSViv(PTR2IV(CALLREGDUPE(
14794        INT2PTR(REGEXP *, SvIVX(regex)), param))))
14795     */
14796     PL_regex_padav = av_dup_inc(proto_perl->Iregex_padav, param);
14797     PL_regex_pad = AvARRAY(PL_regex_padav);
14798
14799     PL_stashpadmax      = proto_perl->Istashpadmax;
14800     PL_stashpadix       = proto_perl->Istashpadix ;
14801     Newx(PL_stashpad, PL_stashpadmax, HV *);
14802     {
14803         PADOFFSET o = 0;
14804         for (; o < PL_stashpadmax; ++o)
14805             PL_stashpad[o] = hv_dup(proto_perl->Istashpad[o], param);
14806     }
14807
14808     /* shortcuts to various I/O objects */
14809     PL_ofsgv            = gv_dup_inc(proto_perl->Iofsgv, param);
14810     PL_stdingv          = gv_dup(proto_perl->Istdingv, param);
14811     PL_stderrgv         = gv_dup(proto_perl->Istderrgv, param);
14812     PL_defgv            = gv_dup(proto_perl->Idefgv, param);
14813     PL_argvgv           = gv_dup_inc(proto_perl->Iargvgv, param);
14814     PL_argvoutgv        = gv_dup(proto_perl->Iargvoutgv, param);
14815     PL_argvout_stack    = av_dup_inc(proto_perl->Iargvout_stack, param);
14816
14817     /* shortcuts to regexp stuff */
14818     PL_replgv           = gv_dup_inc(proto_perl->Ireplgv, param);
14819
14820     /* shortcuts to misc objects */
14821     PL_errgv            = gv_dup(proto_perl->Ierrgv, param);
14822
14823     /* shortcuts to debugging objects */
14824     PL_DBgv             = gv_dup_inc(proto_perl->IDBgv, param);
14825     PL_DBline           = gv_dup_inc(proto_perl->IDBline, param);
14826     PL_DBsub            = gv_dup_inc(proto_perl->IDBsub, param);
14827     PL_DBsingle         = sv_dup(proto_perl->IDBsingle, param);
14828     PL_DBtrace          = sv_dup(proto_perl->IDBtrace, param);
14829     PL_DBsignal         = sv_dup(proto_perl->IDBsignal, param);
14830     Copy(proto_perl->IDBcontrol, PL_DBcontrol, DBVARMG_COUNT, IV);
14831
14832     /* symbol tables */
14833     PL_defstash         = hv_dup_inc(proto_perl->Idefstash, param);
14834     PL_curstash         = hv_dup_inc(proto_perl->Icurstash, param);
14835     PL_debstash         = hv_dup(proto_perl->Idebstash, param);
14836     PL_globalstash      = hv_dup(proto_perl->Iglobalstash, param);
14837     PL_curstname        = sv_dup_inc(proto_perl->Icurstname, param);
14838
14839     PL_beginav          = av_dup_inc(proto_perl->Ibeginav, param);
14840     PL_beginav_save     = av_dup_inc(proto_perl->Ibeginav_save, param);
14841     PL_checkav_save     = av_dup_inc(proto_perl->Icheckav_save, param);
14842     PL_unitcheckav      = av_dup_inc(proto_perl->Iunitcheckav, param);
14843     PL_unitcheckav_save = av_dup_inc(proto_perl->Iunitcheckav_save, param);
14844     PL_endav            = av_dup_inc(proto_perl->Iendav, param);
14845     PL_checkav          = av_dup_inc(proto_perl->Icheckav, param);
14846     PL_initav           = av_dup_inc(proto_perl->Iinitav, param);
14847     PL_savebegin        = proto_perl->Isavebegin;
14848
14849     PL_isarev           = hv_dup_inc(proto_perl->Iisarev, param);
14850
14851     /* subprocess state */
14852     PL_fdpid            = av_dup_inc(proto_perl->Ifdpid, param);
14853
14854     if (proto_perl->Iop_mask)
14855         PL_op_mask      = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
14856     else
14857         PL_op_mask      = NULL;
14858     /* PL_asserting        = proto_perl->Iasserting; */
14859
14860     /* current interpreter roots */
14861     PL_main_cv          = cv_dup_inc(proto_perl->Imain_cv, param);
14862     OP_REFCNT_LOCK;
14863     PL_main_root        = OpREFCNT_inc(proto_perl->Imain_root);
14864     OP_REFCNT_UNLOCK;
14865
14866     /* runtime control stuff */
14867     PL_curcopdb         = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
14868
14869     PL_preambleav       = av_dup_inc(proto_perl->Ipreambleav, param);
14870
14871     PL_ors_sv           = sv_dup_inc(proto_perl->Iors_sv, param);
14872
14873     /* interpreter atexit processing */
14874     PL_exitlistlen      = proto_perl->Iexitlistlen;
14875     if (PL_exitlistlen) {
14876         Newx(PL_exitlist, PL_exitlistlen, PerlExitListEntry);
14877         Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
14878     }
14879     else
14880         PL_exitlist     = (PerlExitListEntry*)NULL;
14881
14882     PL_my_cxt_size = proto_perl->Imy_cxt_size;
14883     if (PL_my_cxt_size) {
14884         Newx(PL_my_cxt_list, PL_my_cxt_size, void *);
14885         Copy(proto_perl->Imy_cxt_list, PL_my_cxt_list, PL_my_cxt_size, void *);
14886 #ifdef PERL_GLOBAL_STRUCT_PRIVATE
14887         Newx(PL_my_cxt_keys, PL_my_cxt_size, const char *);
14888         Copy(proto_perl->Imy_cxt_keys, PL_my_cxt_keys, PL_my_cxt_size, char *);
14889 #endif
14890     }
14891     else {
14892         PL_my_cxt_list  = (void**)NULL;
14893 #ifdef PERL_GLOBAL_STRUCT_PRIVATE
14894         PL_my_cxt_keys  = (const char**)NULL;
14895 #endif
14896     }
14897     PL_modglobal        = hv_dup_inc(proto_perl->Imodglobal, param);
14898     PL_custom_op_names  = hv_dup_inc(proto_perl->Icustom_op_names,param);
14899     PL_custom_op_descs  = hv_dup_inc(proto_perl->Icustom_op_descs,param);
14900     PL_custom_ops       = hv_dup_inc(proto_perl->Icustom_ops, param);
14901
14902     PL_compcv                   = cv_dup(proto_perl->Icompcv, param);
14903
14904     PAD_CLONE_VARS(proto_perl, param);
14905
14906 #ifdef HAVE_INTERP_INTERN
14907     sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
14908 #endif
14909
14910     PL_DBcv             = cv_dup(proto_perl->IDBcv, param);
14911
14912 #ifdef PERL_USES_PL_PIDSTATUS
14913     PL_pidstatus        = newHV();                      /* XXX flag for cloning? */
14914 #endif
14915     PL_osname           = SAVEPV(proto_perl->Iosname);
14916     PL_parser           = parser_dup(proto_perl->Iparser, param);
14917
14918     /* XXX this only works if the saved cop has already been cloned */
14919     if (proto_perl->Iparser) {
14920         PL_parser->saved_curcop = (COP*)any_dup(
14921                                     proto_perl->Iparser->saved_curcop,
14922                                     proto_perl);
14923     }
14924
14925     PL_subname          = sv_dup_inc(proto_perl->Isubname, param);
14926
14927 #ifdef USE_LOCALE_CTYPE
14928     /* Should we warn if uses locale? */
14929     PL_warn_locale      = sv_dup_inc(proto_perl->Iwarn_locale, param);
14930 #endif
14931
14932 #ifdef USE_LOCALE_COLLATE
14933     PL_collation_name   = SAVEPV(proto_perl->Icollation_name);
14934 #endif /* USE_LOCALE_COLLATE */
14935
14936 #ifdef USE_LOCALE_NUMERIC
14937     PL_numeric_name     = SAVEPV(proto_perl->Inumeric_name);
14938     PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
14939 #endif /* !USE_LOCALE_NUMERIC */
14940
14941     /* Unicode inversion lists */
14942     PL_Latin1           = sv_dup_inc(proto_perl->ILatin1, param);
14943     PL_UpperLatin1      = sv_dup_inc(proto_perl->IUpperLatin1, param);
14944     PL_AboveLatin1      = sv_dup_inc(proto_perl->IAboveLatin1, param);
14945     PL_InBitmap         = sv_dup_inc(proto_perl->IInBitmap, param);
14946
14947     PL_NonL1NonFinalFold = sv_dup_inc(proto_perl->INonL1NonFinalFold, param);
14948     PL_HasMultiCharFold = sv_dup_inc(proto_perl->IHasMultiCharFold, param);
14949
14950     /* utf8 character class swashes */
14951     for (i = 0; i < POSIX_SWASH_COUNT; i++) {
14952         PL_utf8_swash_ptrs[i] = sv_dup_inc(proto_perl->Iutf8_swash_ptrs[i], param);
14953     }
14954     for (i = 0; i < POSIX_CC_COUNT; i++) {
14955         PL_XPosix_ptrs[i] = sv_dup_inc(proto_perl->IXPosix_ptrs[i], param);
14956     }
14957     PL_GCB_invlist = sv_dup_inc(proto_perl->IGCB_invlist, param);
14958     PL_SB_invlist = sv_dup_inc(proto_perl->ISB_invlist, param);
14959     PL_WB_invlist = sv_dup_inc(proto_perl->IWB_invlist, param);
14960     PL_utf8_mark        = sv_dup_inc(proto_perl->Iutf8_mark, param);
14961     PL_utf8_toupper     = sv_dup_inc(proto_perl->Iutf8_toupper, param);
14962     PL_utf8_totitle     = sv_dup_inc(proto_perl->Iutf8_totitle, param);
14963     PL_utf8_tolower     = sv_dup_inc(proto_perl->Iutf8_tolower, param);
14964     PL_utf8_tofold      = sv_dup_inc(proto_perl->Iutf8_tofold, param);
14965     PL_utf8_idstart     = sv_dup_inc(proto_perl->Iutf8_idstart, param);
14966     PL_utf8_xidstart    = sv_dup_inc(proto_perl->Iutf8_xidstart, param);
14967     PL_utf8_perl_idstart = sv_dup_inc(proto_perl->Iutf8_perl_idstart, param);
14968     PL_utf8_perl_idcont = sv_dup_inc(proto_perl->Iutf8_perl_idcont, param);
14969     PL_utf8_idcont      = sv_dup_inc(proto_perl->Iutf8_idcont, param);
14970     PL_utf8_xidcont     = sv_dup_inc(proto_perl->Iutf8_xidcont, param);
14971     PL_utf8_foldable    = sv_dup_inc(proto_perl->Iutf8_foldable, param);
14972     PL_utf8_charname_begin = sv_dup_inc(proto_perl->Iutf8_charname_begin, param);
14973     PL_utf8_charname_continue = sv_dup_inc(proto_perl->Iutf8_charname_continue, param);
14974
14975     if (proto_perl->Ipsig_pend) {
14976         Newxz(PL_psig_pend, SIG_SIZE, int);
14977     }
14978     else {
14979         PL_psig_pend    = (int*)NULL;
14980     }
14981
14982     if (proto_perl->Ipsig_name) {
14983         Newx(PL_psig_name, 2 * SIG_SIZE, SV*);
14984         sv_dup_inc_multiple(proto_perl->Ipsig_name, PL_psig_name, 2 * SIG_SIZE,
14985                             param);
14986         PL_psig_ptr = PL_psig_name + SIG_SIZE;
14987     }
14988     else {
14989         PL_psig_ptr     = (SV**)NULL;
14990         PL_psig_name    = (SV**)NULL;
14991     }
14992
14993     if (flags & CLONEf_COPY_STACKS) {
14994         Newx(PL_tmps_stack, PL_tmps_max, SV*);
14995         sv_dup_inc_multiple(proto_perl->Itmps_stack, PL_tmps_stack,
14996                             PL_tmps_ix+1, param);
14997
14998         /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
14999         i = proto_perl->Imarkstack_max - proto_perl->Imarkstack;
15000         Newxz(PL_markstack, i, I32);
15001         PL_markstack_max        = PL_markstack + (proto_perl->Imarkstack_max
15002                                                   - proto_perl->Imarkstack);
15003         PL_markstack_ptr        = PL_markstack + (proto_perl->Imarkstack_ptr
15004                                                   - proto_perl->Imarkstack);
15005         Copy(proto_perl->Imarkstack, PL_markstack,
15006              PL_markstack_ptr - PL_markstack + 1, I32);
15007
15008         /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
15009          * NOTE: unlike the others! */
15010         Newxz(PL_scopestack, PL_scopestack_max, I32);
15011         Copy(proto_perl->Iscopestack, PL_scopestack, PL_scopestack_ix, I32);
15012
15013 #ifdef DEBUGGING
15014         Newxz(PL_scopestack_name, PL_scopestack_max, const char *);
15015         Copy(proto_perl->Iscopestack_name, PL_scopestack_name, PL_scopestack_ix, const char *);
15016 #endif
15017         /* reset stack AV to correct length before its duped via
15018          * PL_curstackinfo */
15019         AvFILLp(proto_perl->Icurstack) =
15020                             proto_perl->Istack_sp - proto_perl->Istack_base;
15021
15022         /* NOTE: si_dup() looks at PL_markstack */
15023         PL_curstackinfo         = si_dup(proto_perl->Icurstackinfo, param);
15024
15025         /* PL_curstack          = PL_curstackinfo->si_stack; */
15026         PL_curstack             = av_dup(proto_perl->Icurstack, param);
15027         PL_mainstack            = av_dup(proto_perl->Imainstack, param);
15028
15029         /* next PUSHs() etc. set *(PL_stack_sp+1) */
15030         PL_stack_base           = AvARRAY(PL_curstack);
15031         PL_stack_sp             = PL_stack_base + (proto_perl->Istack_sp
15032                                                    - proto_perl->Istack_base);
15033         PL_stack_max            = PL_stack_base + AvMAX(PL_curstack);
15034
15035         /*Newxz(PL_savestack, PL_savestack_max, ANY);*/
15036         PL_savestack            = ss_dup(proto_perl, param);
15037     }
15038     else {
15039         init_stacks();
15040         ENTER;                  /* perl_destruct() wants to LEAVE; */
15041     }
15042
15043     PL_statgv           = gv_dup(proto_perl->Istatgv, param);
15044     PL_statname         = sv_dup_inc(proto_perl->Istatname, param);
15045
15046     PL_rs               = sv_dup_inc(proto_perl->Irs, param);
15047     PL_last_in_gv       = gv_dup(proto_perl->Ilast_in_gv, param);
15048     PL_defoutgv         = gv_dup_inc(proto_perl->Idefoutgv, param);
15049     PL_toptarget        = sv_dup_inc(proto_perl->Itoptarget, param);
15050     PL_bodytarget       = sv_dup_inc(proto_perl->Ibodytarget, param);
15051     PL_formtarget       = sv_dup(proto_perl->Iformtarget, param);
15052
15053     PL_errors           = sv_dup_inc(proto_perl->Ierrors, param);
15054
15055     PL_sortcop          = (OP*)any_dup(proto_perl->Isortcop, proto_perl);
15056     PL_firstgv          = gv_dup_inc(proto_perl->Ifirstgv, param);
15057     PL_secondgv         = gv_dup_inc(proto_perl->Isecondgv, param);
15058
15059     PL_stashcache       = newHV();
15060
15061     PL_watchaddr        = (char **) ptr_table_fetch(PL_ptr_table,
15062                                             proto_perl->Iwatchaddr);
15063     PL_watchok          = PL_watchaddr ? * PL_watchaddr : NULL;
15064     if (PL_debug && PL_watchaddr) {
15065         PerlIO_printf(Perl_debug_log,
15066           "WATCHING: %"UVxf" cloned as %"UVxf" with value %"UVxf"\n",
15067           PTR2UV(proto_perl->Iwatchaddr), PTR2UV(PL_watchaddr),
15068           PTR2UV(PL_watchok));
15069     }
15070
15071     PL_registered_mros  = hv_dup_inc(proto_perl->Iregistered_mros, param);
15072     PL_blockhooks       = av_dup_inc(proto_perl->Iblockhooks, param);
15073     PL_utf8_foldclosures = hv_dup_inc(proto_perl->Iutf8_foldclosures, param);
15074
15075     /* Call the ->CLONE method, if it exists, for each of the stashes
15076        identified by sv_dup() above.
15077     */
15078     while(av_tindex(param->stashes) != -1) {
15079         HV* const stash = MUTABLE_HV(av_shift(param->stashes));
15080         GV* const cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
15081         if (cloner && GvCV(cloner)) {
15082             dSP;
15083             ENTER;
15084             SAVETMPS;
15085             PUSHMARK(SP);
15086             mXPUSHs(newSVhek(HvNAME_HEK(stash)));
15087             PUTBACK;
15088             call_sv(MUTABLE_SV(GvCV(cloner)), G_DISCARD);
15089             FREETMPS;
15090             LEAVE;
15091         }
15092     }
15093
15094     if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
15095         ptr_table_free(PL_ptr_table);
15096         PL_ptr_table = NULL;
15097     }
15098
15099     if (!(flags & CLONEf_COPY_STACKS)) {
15100         unreferenced_to_tmp_stack(param->unreferenced);
15101     }
15102
15103     SvREFCNT_dec(param->stashes);
15104
15105     /* orphaned? eg threads->new inside BEGIN or use */
15106     if (PL_compcv && ! SvREFCNT(PL_compcv)) {
15107         SvREFCNT_inc_simple_void(PL_compcv);
15108         SAVEFREESV(PL_compcv);
15109     }
15110
15111     return my_perl;
15112 }
15113
15114 static void
15115 S_unreferenced_to_tmp_stack(pTHX_ AV *const unreferenced)
15116 {
15117     PERL_ARGS_ASSERT_UNREFERENCED_TO_TMP_STACK;
15118     
15119     if (AvFILLp(unreferenced) > -1) {
15120         SV **svp = AvARRAY(unreferenced);
15121         SV **const last = svp + AvFILLp(unreferenced);
15122         SSize_t count = 0;
15123
15124         do {
15125             if (SvREFCNT(*svp) == 1)
15126                 ++count;
15127         } while (++svp <= last);
15128
15129         EXTEND_MORTAL(count);
15130         svp = AvARRAY(unreferenced);
15131
15132         do {
15133             if (SvREFCNT(*svp) == 1) {
15134                 /* Our reference is the only one to this SV. This means that
15135                    in this thread, the scalar effectively has a 0 reference.
15136                    That doesn't work (cleanup never happens), so donate our
15137                    reference to it onto the save stack. */
15138                 PL_tmps_stack[++PL_tmps_ix] = *svp;
15139             } else {
15140                 /* As an optimisation, because we are already walking the
15141                    entire array, instead of above doing either
15142                    SvREFCNT_inc(*svp) or *svp = &PL_sv_undef, we can instead
15143                    release our reference to the scalar, so that at the end of
15144                    the array owns zero references to the scalars it happens to
15145                    point to. We are effectively converting the array from
15146                    AvREAL() on to AvREAL() off. This saves the av_clear()
15147                    (triggered by the SvREFCNT_dec(unreferenced) below) from
15148                    walking the array a second time.  */
15149                 SvREFCNT_dec(*svp);
15150             }
15151
15152         } while (++svp <= last);
15153         AvREAL_off(unreferenced);
15154     }
15155     SvREFCNT_dec_NN(unreferenced);
15156 }
15157
15158 void
15159 Perl_clone_params_del(CLONE_PARAMS *param)
15160 {
15161     /* This seemingly funky ordering keeps the build with PERL_GLOBAL_STRUCT
15162        happy: */
15163     PerlInterpreter *const to = param->new_perl;
15164     dTHXa(to);
15165     PerlInterpreter *const was = PERL_GET_THX;
15166
15167     PERL_ARGS_ASSERT_CLONE_PARAMS_DEL;
15168
15169     if (was != to) {
15170         PERL_SET_THX(to);
15171     }
15172
15173     SvREFCNT_dec(param->stashes);
15174     if (param->unreferenced)
15175         unreferenced_to_tmp_stack(param->unreferenced);
15176
15177     Safefree(param);
15178
15179     if (was != to) {
15180         PERL_SET_THX(was);
15181     }
15182 }
15183
15184 CLONE_PARAMS *
15185 Perl_clone_params_new(PerlInterpreter *const from, PerlInterpreter *const to)
15186 {
15187     dVAR;
15188     /* Need to play this game, as newAV() can call safesysmalloc(), and that
15189        does a dTHX; to get the context from thread local storage.
15190        FIXME - under PERL_CORE Newx(), Safefree() and friends should expand to
15191        a version that passes in my_perl.  */
15192     PerlInterpreter *const was = PERL_GET_THX;
15193     CLONE_PARAMS *param;
15194
15195     PERL_ARGS_ASSERT_CLONE_PARAMS_NEW;
15196
15197     if (was != to) {
15198         PERL_SET_THX(to);
15199     }
15200
15201     /* Given that we've set the context, we can do this unshared.  */
15202     Newx(param, 1, CLONE_PARAMS);
15203
15204     param->flags = 0;
15205     param->proto_perl = from;
15206     param->new_perl = to;
15207     param->stashes = (AV *)Perl_newSV_type(to, SVt_PVAV);
15208     AvREAL_off(param->stashes);
15209     param->unreferenced = (AV *)Perl_newSV_type(to, SVt_PVAV);
15210
15211     if (was != to) {
15212         PERL_SET_THX(was);
15213     }
15214     return param;
15215 }
15216
15217 #endif /* USE_ITHREADS */
15218
15219 void
15220 Perl_init_constants(pTHX)
15221 {
15222     SvREFCNT(&PL_sv_undef)      = SvREFCNT_IMMORTAL;
15223     SvFLAGS(&PL_sv_undef)       = SVf_READONLY|SVf_PROTECT|SVt_NULL;
15224     SvANY(&PL_sv_undef)         = NULL;
15225
15226     SvANY(&PL_sv_no)            = new_XPVNV();
15227     SvREFCNT(&PL_sv_no)         = SvREFCNT_IMMORTAL;
15228     SvFLAGS(&PL_sv_no)          = SVt_PVNV|SVf_READONLY|SVf_PROTECT
15229                                   |SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
15230                                   |SVp_POK|SVf_POK;
15231
15232     SvANY(&PL_sv_yes)           = new_XPVNV();
15233     SvREFCNT(&PL_sv_yes)        = SvREFCNT_IMMORTAL;
15234     SvFLAGS(&PL_sv_yes)         = SVt_PVNV|SVf_READONLY|SVf_PROTECT
15235                                   |SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
15236                                   |SVp_POK|SVf_POK;
15237
15238     SvPV_set(&PL_sv_no, (char*)PL_No);
15239     SvCUR_set(&PL_sv_no, 0);
15240     SvLEN_set(&PL_sv_no, 0);
15241     SvIV_set(&PL_sv_no, 0);
15242     SvNV_set(&PL_sv_no, 0);
15243
15244     SvPV_set(&PL_sv_yes, (char*)PL_Yes);
15245     SvCUR_set(&PL_sv_yes, 1);
15246     SvLEN_set(&PL_sv_yes, 0);
15247     SvIV_set(&PL_sv_yes, 1);
15248     SvNV_set(&PL_sv_yes, 1);
15249
15250     PadnamePV(&PL_padname_const) = (char *)PL_No;
15251 }
15252
15253 /*
15254 =head1 Unicode Support
15255
15256 =for apidoc sv_recode_to_utf8
15257
15258 The encoding is assumed to be an Encode object, on entry the PV
15259 of the sv is assumed to be octets in that encoding, and the sv
15260 will be converted into Unicode (and UTF-8).
15261
15262 If the sv already is UTF-8 (or if it is not POK), or if the encoding
15263 is not a reference, nothing is done to the sv.  If the encoding is not
15264 an C<Encode::XS> Encoding object, bad things will happen.
15265 (See F<lib/encoding.pm> and L<Encode>.)
15266
15267 The PV of the sv is returned.
15268
15269 =cut */
15270
15271 char *
15272 Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
15273 {
15274     PERL_ARGS_ASSERT_SV_RECODE_TO_UTF8;
15275
15276     if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
15277         SV *uni;
15278         STRLEN len;
15279         const char *s;
15280         dSP;
15281         SV *nsv = sv;
15282         ENTER;
15283         PUSHSTACK;
15284         SAVETMPS;
15285         if (SvPADTMP(nsv)) {
15286             nsv = sv_newmortal();
15287             SvSetSV_nosteal(nsv, sv);
15288         }
15289         save_re_context();
15290         PUSHMARK(sp);
15291         EXTEND(SP, 3);
15292         PUSHs(encoding);
15293         PUSHs(nsv);
15294 /*
15295   NI-S 2002/07/09
15296   Passing sv_yes is wrong - it needs to be or'ed set of constants
15297   for Encode::XS, while UTf-8 decode (currently) assumes a true value means
15298   remove converted chars from source.
15299
15300   Both will default the value - let them.
15301
15302         XPUSHs(&PL_sv_yes);
15303 */
15304         PUTBACK;
15305         call_method("decode", G_SCALAR);
15306         SPAGAIN;
15307         uni = POPs;
15308         PUTBACK;
15309         s = SvPV_const(uni, len);
15310         if (s != SvPVX_const(sv)) {
15311             SvGROW(sv, len + 1);
15312             Move(s, SvPVX(sv), len + 1, char);
15313             SvCUR_set(sv, len);
15314         }
15315         FREETMPS;
15316         POPSTACK;
15317         LEAVE;
15318         if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
15319             /* clear pos and any utf8 cache */
15320             MAGIC * mg = mg_find(sv, PERL_MAGIC_regex_global);
15321             if (mg)
15322                 mg->mg_len = -1;
15323             if ((mg = mg_find(sv, PERL_MAGIC_utf8)))
15324                 magic_setutf8(sv,mg); /* clear UTF8 cache */
15325         }
15326         SvUTF8_on(sv);
15327         return SvPVX(sv);
15328     }
15329     return SvPOKp(sv) ? SvPVX(sv) : NULL;
15330 }
15331
15332 /*
15333 =for apidoc sv_cat_decode
15334
15335 The encoding is assumed to be an Encode object, the PV of the ssv is
15336 assumed to be octets in that encoding and decoding the input starts
15337 from the position which (PV + *offset) pointed to.  The dsv will be
15338 concatenated the decoded UTF-8 string from ssv.  Decoding will terminate
15339 when the string tstr appears in decoding output or the input ends on
15340 the PV of the ssv.  The value which the offset points will be modified
15341 to the last input position on the ssv.
15342
15343 Returns TRUE if the terminator was found, else returns FALSE.
15344
15345 =cut */
15346
15347 bool
15348 Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
15349                    SV *ssv, int *offset, char *tstr, int tlen)
15350 {
15351     bool ret = FALSE;
15352
15353     PERL_ARGS_ASSERT_SV_CAT_DECODE;
15354
15355     if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding)) {
15356         SV *offsv;
15357         dSP;
15358         ENTER;
15359         SAVETMPS;
15360         save_re_context();
15361         PUSHMARK(sp);
15362         EXTEND(SP, 6);
15363         PUSHs(encoding);
15364         PUSHs(dsv);
15365         PUSHs(ssv);
15366         offsv = newSViv(*offset);
15367         mPUSHs(offsv);
15368         mPUSHp(tstr, tlen);
15369         PUTBACK;
15370         call_method("cat_decode", G_SCALAR);
15371         SPAGAIN;
15372         ret = SvTRUE(TOPs);
15373         *offset = SvIV(offsv);
15374         PUTBACK;
15375         FREETMPS;
15376         LEAVE;
15377     }
15378     else
15379         Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
15380     return ret;
15381
15382 }
15383
15384 /* ---------------------------------------------------------------------
15385  *
15386  * support functions for report_uninit()
15387  */
15388
15389 /* the maxiumum size of array or hash where we will scan looking
15390  * for the undefined element that triggered the warning */
15391
15392 #define FUV_MAX_SEARCH_SIZE 1000
15393
15394 /* Look for an entry in the hash whose value has the same SV as val;
15395  * If so, return a mortal copy of the key. */
15396
15397 STATIC SV*
15398 S_find_hash_subscript(pTHX_ const HV *const hv, const SV *const val)
15399 {
15400     dVAR;
15401     HE **array;
15402     I32 i;
15403
15404     PERL_ARGS_ASSERT_FIND_HASH_SUBSCRIPT;
15405
15406     if (!hv || SvMAGICAL(hv) || !HvARRAY(hv) ||
15407                         (HvTOTALKEYS(hv) > FUV_MAX_SEARCH_SIZE))
15408         return NULL;
15409
15410     array = HvARRAY(hv);
15411
15412     for (i=HvMAX(hv); i>=0; i--) {
15413         HE *entry;
15414         for (entry = array[i]; entry; entry = HeNEXT(entry)) {
15415             if (HeVAL(entry) != val)
15416                 continue;
15417             if (    HeVAL(entry) == &PL_sv_undef ||
15418                     HeVAL(entry) == &PL_sv_placeholder)
15419                 continue;
15420             if (!HeKEY(entry))
15421                 return NULL;
15422             if (HeKLEN(entry) == HEf_SVKEY)
15423                 return sv_mortalcopy(HeKEY_sv(entry));
15424             return sv_2mortal(newSVhek(HeKEY_hek(entry)));
15425         }
15426     }
15427     return NULL;
15428 }
15429
15430 /* Look for an entry in the array whose value has the same SV as val;
15431  * If so, return the index, otherwise return -1. */
15432
15433 STATIC I32
15434 S_find_array_subscript(pTHX_ const AV *const av, const SV *const val)
15435 {
15436     PERL_ARGS_ASSERT_FIND_ARRAY_SUBSCRIPT;
15437
15438     if (!av || SvMAGICAL(av) || !AvARRAY(av) ||
15439                         (AvFILLp(av) > FUV_MAX_SEARCH_SIZE))
15440         return -1;
15441
15442     if (val != &PL_sv_undef) {
15443         SV ** const svp = AvARRAY(av);
15444         I32 i;
15445
15446         for (i=AvFILLp(av); i>=0; i--)
15447             if (svp[i] == val)
15448                 return i;
15449     }
15450     return -1;
15451 }
15452
15453 /* varname(): return the name of a variable, optionally with a subscript.
15454  * If gv is non-zero, use the name of that global, along with gvtype (one
15455  * of "$", "@", "%"); otherwise use the name of the lexical at pad offset
15456  * targ.  Depending on the value of the subscript_type flag, return:
15457  */
15458
15459 #define FUV_SUBSCRIPT_NONE      1       /* "@foo"          */
15460 #define FUV_SUBSCRIPT_ARRAY     2       /* "$foo[aindex]"  */
15461 #define FUV_SUBSCRIPT_HASH      3       /* "$foo{keyname}" */
15462 #define FUV_SUBSCRIPT_WITHIN    4       /* "within @foo"   */
15463
15464 SV*
15465 Perl_varname(pTHX_ const GV *const gv, const char gvtype, PADOFFSET targ,
15466         const SV *const keyname, I32 aindex, int subscript_type)
15467 {
15468
15469     SV * const name = sv_newmortal();
15470     if (gv && isGV(gv)) {
15471         char buffer[2];
15472         buffer[0] = gvtype;
15473         buffer[1] = 0;
15474
15475         /* as gv_fullname4(), but add literal '^' for $^FOO names  */
15476
15477         gv_fullname4(name, gv, buffer, 0);
15478
15479         if ((unsigned int)SvPVX(name)[1] <= 26) {
15480             buffer[0] = '^';
15481             buffer[1] = SvPVX(name)[1] + 'A' - 1;
15482
15483             /* Swap the 1 unprintable control character for the 2 byte pretty
15484                version - ie substr($name, 1, 1) = $buffer; */
15485             sv_insert(name, 1, 1, buffer, 2);
15486         }
15487     }
15488     else {
15489         CV * const cv = gv ? ((CV *)gv) : find_runcv(NULL);
15490         PADNAME *sv;
15491
15492         assert(!cv || SvTYPE(cv) == SVt_PVCV || SvTYPE(cv) == SVt_PVFM);
15493
15494         if (!cv || !CvPADLIST(cv))
15495             return NULL;
15496         sv = padnamelist_fetch(PadlistNAMES(CvPADLIST(cv)), targ);
15497         sv_setpvn(name, PadnamePV(sv), PadnameLEN(sv));
15498         SvUTF8_on(name);
15499     }
15500
15501     if (subscript_type == FUV_SUBSCRIPT_HASH) {
15502         SV * const sv = newSV(0);
15503         *SvPVX(name) = '$';
15504         Perl_sv_catpvf(aTHX_ name, "{%s}",
15505             pv_pretty(sv, SvPVX_const(keyname), SvCUR(keyname), 32, NULL, NULL,
15506                     PERL_PV_PRETTY_DUMP | PERL_PV_ESCAPE_UNI_DETECT ));
15507         SvREFCNT_dec_NN(sv);
15508     }
15509     else if (subscript_type == FUV_SUBSCRIPT_ARRAY) {
15510         *SvPVX(name) = '$';
15511         Perl_sv_catpvf(aTHX_ name, "[%"IVdf"]", (IV)aindex);
15512     }
15513     else if (subscript_type == FUV_SUBSCRIPT_WITHIN) {
15514         /* We know that name has no magic, so can use 0 instead of SV_GMAGIC */
15515         Perl_sv_insert_flags(aTHX_ name, 0, 0,  STR_WITH_LEN("within "), 0);
15516     }
15517
15518     return name;
15519 }
15520
15521
15522 /*
15523 =for apidoc find_uninit_var
15524
15525 Find the name of the undefined variable (if any) that caused the operator
15526 to issue a "Use of uninitialized value" warning.
15527 If match is true, only return a name if its value matches uninit_sv.
15528 So roughly speaking, if a unary operator (such as OP_COS) generates a
15529 warning, then following the direct child of the op may yield an
15530 OP_PADSV or OP_GV that gives the name of the undefined variable.  On the
15531 other hand, with OP_ADD there are two branches to follow, so we only print
15532 the variable name if we get an exact match.
15533 desc_p points to a string pointer holding the description of the op.
15534 This may be updated if needed.
15535
15536 The name is returned as a mortal SV.
15537
15538 Assumes that PL_op is the op that originally triggered the error, and that
15539 PL_comppad/PL_curpad points to the currently executing pad.
15540
15541 =cut
15542 */
15543
15544 STATIC SV *
15545 S_find_uninit_var(pTHX_ const OP *const obase, const SV *const uninit_sv,
15546                   bool match, const char **desc_p)
15547 {
15548     dVAR;
15549     SV *sv;
15550     const GV *gv;
15551     const OP *o, *o2, *kid;
15552
15553     PERL_ARGS_ASSERT_FIND_UNINIT_VAR;
15554
15555     if (!obase || (match && (!uninit_sv || uninit_sv == &PL_sv_undef ||
15556                             uninit_sv == &PL_sv_placeholder)))
15557         return NULL;
15558
15559     switch (obase->op_type) {
15560
15561     case OP_RV2AV:
15562     case OP_RV2HV:
15563     case OP_PADAV:
15564     case OP_PADHV:
15565       {
15566         const bool pad  = (    obase->op_type == OP_PADAV
15567                             || obase->op_type == OP_PADHV
15568                             || obase->op_type == OP_PADRANGE
15569                           );
15570
15571         const bool hash = (    obase->op_type == OP_PADHV
15572                             || obase->op_type == OP_RV2HV
15573                             || (obase->op_type == OP_PADRANGE
15574                                 && SvTYPE(PAD_SVl(obase->op_targ)) == SVt_PVHV)
15575                           );
15576         I32 index = 0;
15577         SV *keysv = NULL;
15578         int subscript_type = FUV_SUBSCRIPT_WITHIN;
15579
15580         if (pad) { /* @lex, %lex */
15581             sv = PAD_SVl(obase->op_targ);
15582             gv = NULL;
15583         }
15584         else {
15585             if (cUNOPx(obase)->op_first->op_type == OP_GV) {
15586             /* @global, %global */
15587                 gv = cGVOPx_gv(cUNOPx(obase)->op_first);
15588                 if (!gv)
15589                     break;
15590                 sv = hash ? MUTABLE_SV(GvHV(gv)): MUTABLE_SV(GvAV(gv));
15591             }
15592             else if (obase == PL_op) /* @{expr}, %{expr} */
15593                 return find_uninit_var(cUNOPx(obase)->op_first,
15594                                                 uninit_sv, match, desc_p);
15595             else /* @{expr}, %{expr} as a sub-expression */
15596                 return NULL;
15597         }
15598
15599         /* attempt to find a match within the aggregate */
15600         if (hash) {
15601             keysv = find_hash_subscript((const HV*)sv, uninit_sv);
15602             if (keysv)
15603                 subscript_type = FUV_SUBSCRIPT_HASH;
15604         }
15605         else {
15606             index = find_array_subscript((const AV *)sv, uninit_sv);
15607             if (index >= 0)
15608                 subscript_type = FUV_SUBSCRIPT_ARRAY;
15609         }
15610
15611         if (match && subscript_type == FUV_SUBSCRIPT_WITHIN)
15612             break;
15613
15614         return varname(gv, (char)(hash ? '%' : '@'), obase->op_targ,
15615                                     keysv, index, subscript_type);
15616       }
15617
15618     case OP_RV2SV:
15619         if (cUNOPx(obase)->op_first->op_type == OP_GV) {
15620             /* $global */
15621             gv = cGVOPx_gv(cUNOPx(obase)->op_first);
15622             if (!gv || !GvSTASH(gv))
15623                 break;
15624             if (match && (GvSV(gv) != uninit_sv))
15625                 break;
15626             return varname(gv, '$', 0, NULL, 0, FUV_SUBSCRIPT_NONE);
15627         }
15628         /* ${expr} */
15629         return find_uninit_var(cUNOPx(obase)->op_first, uninit_sv, 1, desc_p);
15630
15631     case OP_PADSV:
15632         if (match && PAD_SVl(obase->op_targ) != uninit_sv)
15633             break;
15634         return varname(NULL, '$', obase->op_targ,
15635                                     NULL, 0, FUV_SUBSCRIPT_NONE);
15636
15637     case OP_GVSV:
15638         gv = cGVOPx_gv(obase);
15639         if (!gv || (match && GvSV(gv) != uninit_sv) || !GvSTASH(gv))
15640             break;
15641         return varname(gv, '$', 0, NULL, 0, FUV_SUBSCRIPT_NONE);
15642
15643     case OP_AELEMFAST_LEX:
15644         if (match) {
15645             SV **svp;
15646             AV *av = MUTABLE_AV(PAD_SV(obase->op_targ));
15647             if (!av || SvRMAGICAL(av))
15648                 break;
15649             svp = av_fetch(av, (I8)obase->op_private, FALSE);
15650             if (!svp || *svp != uninit_sv)
15651                 break;
15652         }
15653         return varname(NULL, '$', obase->op_targ,
15654                        NULL, (I8)obase->op_private, FUV_SUBSCRIPT_ARRAY);
15655     case OP_AELEMFAST:
15656         {
15657             gv = cGVOPx_gv(obase);
15658             if (!gv)
15659                 break;
15660             if (match) {
15661                 SV **svp;
15662                 AV *const av = GvAV(gv);
15663                 if (!av || SvRMAGICAL(av))
15664                     break;
15665                 svp = av_fetch(av, (I8)obase->op_private, FALSE);
15666                 if (!svp || *svp != uninit_sv)
15667                     break;
15668             }
15669             return varname(gv, '$', 0,
15670                     NULL, (I8)obase->op_private, FUV_SUBSCRIPT_ARRAY);
15671         }
15672         NOT_REACHED; /* NOTREACHED */
15673
15674     case OP_EXISTS:
15675         o = cUNOPx(obase)->op_first;
15676         if (!o || o->op_type != OP_NULL ||
15677                 ! (o->op_targ == OP_AELEM || o->op_targ == OP_HELEM))
15678             break;
15679         return find_uninit_var(cBINOPo->op_last, uninit_sv, match, desc_p);
15680
15681     case OP_AELEM:
15682     case OP_HELEM:
15683     {
15684         bool negate = FALSE;
15685
15686         if (PL_op == obase)
15687             /* $a[uninit_expr] or $h{uninit_expr} */
15688             return find_uninit_var(cBINOPx(obase)->op_last,
15689                                                 uninit_sv, match, desc_p);
15690
15691         gv = NULL;
15692         o = cBINOPx(obase)->op_first;
15693         kid = cBINOPx(obase)->op_last;
15694
15695         /* get the av or hv, and optionally the gv */
15696         sv = NULL;
15697         if  (o->op_type == OP_PADAV || o->op_type == OP_PADHV) {
15698             sv = PAD_SV(o->op_targ);
15699         }
15700         else if ((o->op_type == OP_RV2AV || o->op_type == OP_RV2HV)
15701                 && cUNOPo->op_first->op_type == OP_GV)
15702         {
15703             gv = cGVOPx_gv(cUNOPo->op_first);
15704             if (!gv)
15705                 break;
15706             sv = o->op_type
15707                 == OP_RV2HV ? MUTABLE_SV(GvHV(gv)) : MUTABLE_SV(GvAV(gv));
15708         }
15709         if (!sv)
15710             break;
15711
15712         if (kid && kid->op_type == OP_NEGATE) {
15713             negate = TRUE;
15714             kid = cUNOPx(kid)->op_first;
15715         }
15716
15717         if (kid && kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid))) {
15718             /* index is constant */
15719             SV* kidsv;
15720             if (negate) {
15721                 kidsv = newSVpvs_flags("-", SVs_TEMP);
15722                 sv_catsv(kidsv, cSVOPx_sv(kid));
15723             }
15724             else
15725                 kidsv = cSVOPx_sv(kid);
15726             if (match) {
15727                 if (SvMAGICAL(sv))
15728                     break;
15729                 if (obase->op_type == OP_HELEM) {
15730                     HE* he = hv_fetch_ent(MUTABLE_HV(sv), kidsv, 0, 0);
15731                     if (!he || HeVAL(he) != uninit_sv)
15732                         break;
15733                 }
15734                 else {
15735                     SV * const  opsv = cSVOPx_sv(kid);
15736                     const IV  opsviv = SvIV(opsv);
15737                     SV * const * const svp = av_fetch(MUTABLE_AV(sv),
15738                         negate ? - opsviv : opsviv,
15739                         FALSE);
15740                     if (!svp || *svp != uninit_sv)
15741                         break;
15742                 }
15743             }
15744             if (obase->op_type == OP_HELEM)
15745                 return varname(gv, '%', o->op_targ,
15746                             kidsv, 0, FUV_SUBSCRIPT_HASH);
15747             else
15748                 return varname(gv, '@', o->op_targ, NULL,
15749                     negate ? - SvIV(cSVOPx_sv(kid)) : SvIV(cSVOPx_sv(kid)),
15750                     FUV_SUBSCRIPT_ARRAY);
15751         }
15752         else  {
15753             /* index is an expression;
15754              * attempt to find a match within the aggregate */
15755             if (obase->op_type == OP_HELEM) {
15756                 SV * const keysv = find_hash_subscript((const HV*)sv, uninit_sv);
15757                 if (keysv)
15758                     return varname(gv, '%', o->op_targ,
15759                                                 keysv, 0, FUV_SUBSCRIPT_HASH);
15760             }
15761             else {
15762                 const I32 index
15763                     = find_array_subscript((const AV *)sv, uninit_sv);
15764                 if (index >= 0)
15765                     return varname(gv, '@', o->op_targ,
15766                                         NULL, index, FUV_SUBSCRIPT_ARRAY);
15767             }
15768             if (match)
15769                 break;
15770             return varname(gv,
15771                 (char)((o->op_type == OP_PADAV || o->op_type == OP_RV2AV)
15772                 ? '@' : '%'),
15773                 o->op_targ, NULL, 0, FUV_SUBSCRIPT_WITHIN);
15774         }
15775         NOT_REACHED; /* NOTREACHED */
15776     }
15777
15778     case OP_MULTIDEREF: {
15779         /* If we were executing OP_MULTIDEREF when the undef warning
15780          * triggered, then it must be one of the index values within
15781          * that triggered it. If not, then the only possibility is that
15782          * the value retrieved by the last aggregate lookup might be the
15783          * culprit. For the former, we set PL_multideref_pc each time before
15784          * using an index, so work though the item list until we reach
15785          * that point. For the latter, just work through the entire item
15786          * list; the last aggregate retrieved will be the candidate.
15787          */
15788
15789         /* the named aggregate, if any */
15790         PADOFFSET agg_targ = 0;
15791         GV       *agg_gv   = NULL;
15792         /* the last-seen index */
15793         UV        index_type;
15794         PADOFFSET index_targ;
15795         GV       *index_gv;
15796         IV        index_const_iv = 0; /* init for spurious compiler warn */
15797         SV       *index_const_sv;
15798         int       depth = 0;  /* how many array/hash lookups we've done */
15799
15800         UNOP_AUX_item *items = cUNOP_AUXx(obase)->op_aux;
15801         UNOP_AUX_item *last = NULL;
15802         UV actions = items->uv;
15803         bool is_hv;
15804
15805         if (PL_op == obase) {
15806             last = PL_multideref_pc;
15807             assert(last >= items && last <= items + items[-1].uv);
15808         }
15809
15810         assert(actions);
15811
15812         while (1) {
15813             is_hv = FALSE;
15814             switch (actions & MDEREF_ACTION_MASK) {
15815
15816             case MDEREF_reload:
15817                 actions = (++items)->uv;
15818                 continue;
15819
15820             case MDEREF_HV_padhv_helem:               /* $lex{...} */
15821                 is_hv = TRUE;
15822                 /* FALLTHROUGH */
15823             case MDEREF_AV_padav_aelem:               /* $lex[...] */
15824                 agg_targ = (++items)->pad_offset;
15825                 agg_gv = NULL;
15826                 break;
15827
15828             case MDEREF_HV_gvhv_helem:                /* $pkg{...} */
15829                 is_hv = TRUE;
15830                 /* FALLTHROUGH */
15831             case MDEREF_AV_gvav_aelem:                /* $pkg[...] */
15832                 agg_targ = 0;
15833                 agg_gv = (GV*)UNOP_AUX_item_sv(++items);
15834                 assert(isGV_with_GP(agg_gv));
15835                 break;
15836
15837             case MDEREF_HV_gvsv_vivify_rv2hv_helem:   /* $pkg->{...} */
15838             case MDEREF_HV_padsv_vivify_rv2hv_helem:  /* $lex->{...} */
15839                 ++items;
15840                 /* FALLTHROUGH */
15841             case MDEREF_HV_pop_rv2hv_helem:           /* expr->{...} */
15842             case MDEREF_HV_vivify_rv2hv_helem:        /* vivify, ->{...} */
15843                 agg_targ = 0;
15844                 agg_gv   = NULL;
15845                 is_hv    = TRUE;
15846                 break;
15847
15848             case MDEREF_AV_gvsv_vivify_rv2av_aelem:   /* $pkg->[...] */
15849             case MDEREF_AV_padsv_vivify_rv2av_aelem:  /* $lex->[...] */
15850                 ++items;
15851                 /* FALLTHROUGH */
15852             case MDEREF_AV_pop_rv2av_aelem:           /* expr->[...] */
15853             case MDEREF_AV_vivify_rv2av_aelem:        /* vivify, ->[...] */
15854                 agg_targ = 0;
15855                 agg_gv   = NULL;
15856             } /* switch */
15857
15858             index_targ     = 0;
15859             index_gv       = NULL;
15860             index_const_sv = NULL;
15861
15862             index_type = (actions & MDEREF_INDEX_MASK);
15863             switch (index_type) {
15864             case MDEREF_INDEX_none:
15865                 break;
15866             case MDEREF_INDEX_const:
15867                 if (is_hv)
15868                     index_const_sv = UNOP_AUX_item_sv(++items)
15869                 else
15870                     index_const_iv = (++items)->iv;
15871                 break;
15872             case MDEREF_INDEX_padsv:
15873                 index_targ = (++items)->pad_offset;
15874                 break;
15875             case MDEREF_INDEX_gvsv:
15876                 index_gv = (GV*)UNOP_AUX_item_sv(++items);
15877                 assert(isGV_with_GP(index_gv));
15878                 break;
15879             }
15880
15881             if (index_type != MDEREF_INDEX_none)
15882                 depth++;
15883
15884             if (   index_type == MDEREF_INDEX_none
15885                 || (actions & MDEREF_FLAG_last)
15886                 || (last && items == last)
15887             )
15888                 break;
15889
15890             actions >>= MDEREF_SHIFT;
15891         } /* while */
15892
15893         if (PL_op == obase) {
15894             /* index was undef */
15895
15896             *desc_p = (    (actions & MDEREF_FLAG_last)
15897                         && (obase->op_private
15898                                 & (OPpMULTIDEREF_EXISTS|OPpMULTIDEREF_DELETE)))
15899                         ?
15900                             (obase->op_private & OPpMULTIDEREF_EXISTS)
15901                                 ? "exists"
15902                                 : "delete"
15903                         : is_hv ? "hash element" : "array element";
15904             assert(index_type != MDEREF_INDEX_none);
15905             if (index_gv)
15906                 return varname(index_gv, '$', 0, NULL, 0, FUV_SUBSCRIPT_NONE);
15907             if (index_targ)
15908                 return varname(NULL, '$', index_targ,
15909                                     NULL, 0, FUV_SUBSCRIPT_NONE);
15910             assert(is_hv); /* AV index is an IV and can't be undef */
15911             /* can a const HV index ever be undef? */
15912             return NULL;
15913         }
15914
15915         /* the SV returned by pp_multideref() was undef, if anything was */
15916
15917         if (depth != 1)
15918             break;
15919
15920         if (agg_targ)
15921             sv = PAD_SV(agg_targ);
15922         else if (agg_gv)
15923             sv = is_hv ? MUTABLE_SV(GvHV(agg_gv)) : MUTABLE_SV(GvAV(agg_gv));
15924         else
15925             break;
15926
15927         if (index_type == MDEREF_INDEX_const) {
15928             if (match) {
15929                 if (SvMAGICAL(sv))
15930                     break;
15931                 if (is_hv) {
15932                     HE* he = hv_fetch_ent(MUTABLE_HV(sv), index_const_sv, 0, 0);
15933                     if (!he || HeVAL(he) != uninit_sv)
15934                         break;
15935                 }
15936                 else {
15937                     SV * const * const svp =
15938                             av_fetch(MUTABLE_AV(sv), index_const_iv, FALSE);
15939                     if (!svp || *svp != uninit_sv)
15940                         break;
15941                 }
15942             }
15943             return is_hv
15944                 ? varname(agg_gv, '%', agg_targ,
15945                                 index_const_sv, 0,    FUV_SUBSCRIPT_HASH)
15946                 : varname(agg_gv, '@', agg_targ,
15947                                 NULL, index_const_iv, FUV_SUBSCRIPT_ARRAY);
15948         }
15949         else  {
15950             /* index is an var */
15951             if (is_hv) {
15952                 SV * const keysv = find_hash_subscript((const HV*)sv, uninit_sv);
15953                 if (keysv)
15954                     return varname(agg_gv, '%', agg_targ,
15955                                                 keysv, 0, FUV_SUBSCRIPT_HASH);
15956             }
15957             else {
15958                 const I32 index
15959                     = find_array_subscript((const AV *)sv, uninit_sv);
15960                 if (index >= 0)
15961                     return varname(agg_gv, '@', agg_targ,
15962                                         NULL, index, FUV_SUBSCRIPT_ARRAY);
15963             }
15964             if (match)
15965                 break;
15966             return varname(agg_gv,
15967                 is_hv ? '%' : '@',
15968                 agg_targ, NULL, 0, FUV_SUBSCRIPT_WITHIN);
15969         }
15970         NOT_REACHED; /* NOTREACHED */
15971     }
15972
15973     case OP_AASSIGN:
15974         /* only examine RHS */
15975         return find_uninit_var(cBINOPx(obase)->op_first, uninit_sv,
15976                                                                 match, desc_p);
15977
15978     case OP_OPEN:
15979         o = cUNOPx(obase)->op_first;
15980         if (   o->op_type == OP_PUSHMARK
15981            || (o->op_type == OP_NULL && o->op_targ == OP_PUSHMARK)
15982         )
15983             o = OpSIBLING(o);
15984
15985         if (!OpHAS_SIBLING(o)) {
15986             /* one-arg version of open is highly magical */
15987
15988             if (o->op_type == OP_GV) { /* open FOO; */
15989                 gv = cGVOPx_gv(o);
15990                 if (match && GvSV(gv) != uninit_sv)
15991                     break;
15992                 return varname(gv, '$', 0,
15993                             NULL, 0, FUV_SUBSCRIPT_NONE);
15994             }
15995             /* other possibilities not handled are:
15996              * open $x; or open my $x;  should return '${*$x}'
15997              * open expr;               should return '$'.expr ideally
15998              */
15999              break;
16000         }
16001         goto do_op;
16002
16003     /* ops where $_ may be an implicit arg */
16004     case OP_TRANS:
16005     case OP_TRANSR:
16006     case OP_SUBST:
16007     case OP_MATCH:
16008         if ( !(obase->op_flags & OPf_STACKED)) {
16009             if (uninit_sv == DEFSV)
16010                 return newSVpvs_flags("$_", SVs_TEMP);
16011             else if (obase->op_targ
16012                   && uninit_sv == PAD_SVl(obase->op_targ))
16013                 return varname(NULL, '$', obase->op_targ, NULL, 0,
16014                                FUV_SUBSCRIPT_NONE);
16015         }
16016         goto do_op;
16017
16018     case OP_PRTF:
16019     case OP_PRINT:
16020     case OP_SAY:
16021         match = 1; /* print etc can return undef on defined args */
16022         /* skip filehandle as it can't produce 'undef' warning  */
16023         o = cUNOPx(obase)->op_first;
16024         if ((obase->op_flags & OPf_STACKED)
16025             &&
16026                (   o->op_type == OP_PUSHMARK
16027                || (o->op_type == OP_NULL && o->op_targ == OP_PUSHMARK)))
16028             o = OpSIBLING(OpSIBLING(o));
16029         goto do_op2;
16030
16031
16032     case OP_ENTEREVAL: /* could be eval $undef or $x='$undef'; eval $x */
16033     case OP_CUSTOM: /* XS or custom code could trigger random warnings */
16034
16035         /* the following ops are capable of returning PL_sv_undef even for
16036          * defined arg(s) */
16037
16038     case OP_BACKTICK:
16039     case OP_PIPE_OP:
16040     case OP_FILENO:
16041     case OP_BINMODE:
16042     case OP_TIED:
16043     case OP_GETC:
16044     case OP_SYSREAD:
16045     case OP_SEND:
16046     case OP_IOCTL:
16047     case OP_SOCKET:
16048     case OP_SOCKPAIR:
16049     case OP_BIND:
16050     case OP_CONNECT:
16051     case OP_LISTEN:
16052     case OP_ACCEPT:
16053     case OP_SHUTDOWN:
16054     case OP_SSOCKOPT:
16055     case OP_GETPEERNAME:
16056     case OP_FTRREAD:
16057     case OP_FTRWRITE:
16058     case OP_FTREXEC:
16059     case OP_FTROWNED:
16060     case OP_FTEREAD:
16061     case OP_FTEWRITE:
16062     case OP_FTEEXEC:
16063     case OP_FTEOWNED:
16064     case OP_FTIS:
16065     case OP_FTZERO:
16066     case OP_FTSIZE:
16067     case OP_FTFILE:
16068     case OP_FTDIR:
16069     case OP_FTLINK:
16070     case OP_FTPIPE:
16071     case OP_FTSOCK:
16072     case OP_FTBLK:
16073     case OP_FTCHR:
16074     case OP_FTTTY:
16075     case OP_FTSUID:
16076     case OP_FTSGID:
16077     case OP_FTSVTX:
16078     case OP_FTTEXT:
16079     case OP_FTBINARY:
16080     case OP_FTMTIME:
16081     case OP_FTATIME:
16082     case OP_FTCTIME:
16083     case OP_READLINK:
16084     case OP_OPEN_DIR:
16085     case OP_READDIR:
16086     case OP_TELLDIR:
16087     case OP_SEEKDIR:
16088     case OP_REWINDDIR:
16089     case OP_CLOSEDIR:
16090     case OP_GMTIME:
16091     case OP_ALARM:
16092     case OP_SEMGET:
16093     case OP_GETLOGIN:
16094     case OP_UNDEF:
16095     case OP_SUBSTR:
16096     case OP_AEACH:
16097     case OP_EACH:
16098     case OP_SORT:
16099     case OP_CALLER:
16100     case OP_DOFILE:
16101     case OP_PROTOTYPE:
16102     case OP_NCMP:
16103     case OP_SMARTMATCH:
16104     case OP_UNPACK:
16105     case OP_SYSOPEN:
16106     case OP_SYSSEEK:
16107         match = 1;
16108         goto do_op;
16109
16110     case OP_ENTERSUB:
16111     case OP_GOTO:
16112         /* XXX tmp hack: these two may call an XS sub, and currently
16113           XS subs don't have a SUB entry on the context stack, so CV and
16114           pad determination goes wrong, and BAD things happen. So, just
16115           don't try to determine the value under those circumstances.
16116           Need a better fix at dome point. DAPM 11/2007 */
16117         break;
16118
16119     case OP_FLIP:
16120     case OP_FLOP:
16121     {
16122         GV * const gv = gv_fetchpvs(".", GV_NOTQUAL, SVt_PV);
16123         if (gv && GvSV(gv) == uninit_sv)
16124             return newSVpvs_flags("$.", SVs_TEMP);
16125         goto do_op;
16126     }
16127
16128     case OP_POS:
16129         /* def-ness of rval pos() is independent of the def-ness of its arg */
16130         if ( !(obase->op_flags & OPf_MOD))
16131             break;
16132
16133     case OP_SCHOMP:
16134     case OP_CHOMP:
16135         if (SvROK(PL_rs) && uninit_sv == SvRV(PL_rs))
16136             return newSVpvs_flags("${$/}", SVs_TEMP);
16137         /* FALLTHROUGH */
16138
16139     default:
16140     do_op:
16141         if (!(obase->op_flags & OPf_KIDS))
16142             break;
16143         o = cUNOPx(obase)->op_first;
16144         
16145     do_op2:
16146         if (!o)
16147             break;
16148
16149         /* This loop checks all the kid ops, skipping any that cannot pos-
16150          * sibly be responsible for the uninitialized value; i.e., defined
16151          * constants and ops that return nothing.  If there is only one op
16152          * left that is not skipped, then we *know* it is responsible for
16153          * the uninitialized value.  If there is more than one op left, we
16154          * have to look for an exact match in the while() loop below.
16155          * Note that we skip padrange, because the individual pad ops that
16156          * it replaced are still in the tree, so we work on them instead.
16157          */
16158         o2 = NULL;
16159         for (kid=o; kid; kid = OpSIBLING(kid)) {
16160             const OPCODE type = kid->op_type;
16161             if ( (type == OP_CONST && SvOK(cSVOPx_sv(kid)))
16162               || (type == OP_NULL  && ! (kid->op_flags & OPf_KIDS))
16163               || (type == OP_PUSHMARK)
16164               || (type == OP_PADRANGE)
16165             )
16166             continue;
16167
16168             if (o2) { /* more than one found */
16169                 o2 = NULL;
16170                 break;
16171             }
16172             o2 = kid;
16173         }
16174         if (o2)
16175             return find_uninit_var(o2, uninit_sv, match, desc_p);
16176
16177         /* scan all args */
16178         while (o) {
16179             sv = find_uninit_var(o, uninit_sv, 1, desc_p);
16180             if (sv)
16181                 return sv;
16182             o = OpSIBLING(o);
16183         }
16184         break;
16185     }
16186     return NULL;
16187 }
16188
16189
16190 /*
16191 =for apidoc report_uninit
16192
16193 Print appropriate "Use of uninitialized variable" warning.
16194
16195 =cut
16196 */
16197
16198 void
16199 Perl_report_uninit(pTHX_ const SV *uninit_sv)
16200 {
16201     if (PL_op) {
16202         SV* varname = NULL;
16203         const char *desc;
16204
16205         desc = PL_op->op_type == OP_STRINGIFY && PL_op->op_folded
16206                 ? "join or string"
16207                 : OP_DESC(PL_op);
16208         if (uninit_sv && PL_curpad) {
16209             varname = find_uninit_var(PL_op, uninit_sv, 0, &desc);
16210             if (varname)
16211                 sv_insert(varname, 0, 0, " ", 1);
16212         }
16213         /* PL_warn_uninit_sv is constant */
16214         GCC_DIAG_IGNORE(-Wformat-nonliteral);
16215         /* diag_listed_as: Use of uninitialized value%s */
16216         Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit_sv,
16217                 SVfARG(varname ? varname : &PL_sv_no),
16218                 " in ", desc);
16219         GCC_DIAG_RESTORE;
16220     }
16221     else {
16222         /* PL_warn_uninit is constant */
16223         GCC_DIAG_IGNORE(-Wformat-nonliteral);
16224         Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
16225                     "", "", "");
16226         GCC_DIAG_RESTORE;
16227     }
16228 }
16229
16230 /*
16231  * ex: set ts=8 sts=4 sw=4 et:
16232  */