This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
dist/Data-Dumper/t/dumper.t: Generalize for EBCDIC platforms
[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                     DECLARE_STORE_LC_NUMERIC_SET_TO_NEEDED();
3164
3165                     local_radix =
3166                         PL_numeric_local &&
3167                         PL_numeric_radix_sv &&
3168                         SvUTF8(PL_numeric_radix_sv);
3169                     if (local_radix && SvLEN(PL_numeric_radix_sv) > 1) {
3170                         size += SvLEN(PL_numeric_radix_sv) - 1;
3171                         s = SvGROW_mutable(sv, size);
3172                     }
3173
3174                     SNPRINTF_G(SvNVX(sv), s, SvLEN(sv), NV_DIG);
3175
3176                     /* If the radix character is UTF-8, and actually is in the
3177                      * output, turn on the UTF-8 flag for the scalar */
3178                     if (local_radix &&
3179                         instr(s, SvPVX_const(PL_numeric_radix_sv))) {
3180                         SvUTF8_on(sv);
3181                     }
3182
3183                     RESTORE_LC_NUMERIC();
3184                 }
3185
3186                 /* We don't call SvPOK_on(), because it may come to
3187                  * pass that the locale changes so that the
3188                  * stringification we just did is no longer correct.  We
3189                  * will have to re-stringify every time it is needed */
3190 #endif
3191                 RESTORE_ERRNO;
3192             }
3193             while (*s) s++;
3194         }
3195     }
3196     else if (isGV_with_GP(sv)) {
3197         GV *const gv = MUTABLE_GV(sv);
3198         SV *const buffer = sv_newmortal();
3199
3200         gv_efullname3(buffer, gv, "*");
3201
3202         assert(SvPOK(buffer));
3203         if (SvUTF8(buffer))
3204             SvUTF8_on(sv);
3205         if (lp)
3206             *lp = SvCUR(buffer);
3207         return SvPVX(buffer);
3208     }
3209     else if (isREGEXP(sv)) {
3210         if (lp) *lp = RX_WRAPLEN((REGEXP *)sv);
3211         return RX_WRAPPED((REGEXP *)sv);
3212     }
3213     else {
3214         if (lp)
3215             *lp = 0;
3216         if (flags & SV_UNDEF_RETURNS_NULL)
3217             return NULL;
3218         if (!PL_localizing && ckWARN(WARN_UNINITIALIZED))
3219             report_uninit(sv);
3220         /* Typically the caller expects that sv_any is not NULL now.  */
3221         if (!SvREADONLY(sv) && SvTYPE(sv) < SVt_PV)
3222             sv_upgrade(sv, SVt_PV);
3223         return (char *)"";
3224     }
3225
3226     {
3227         const STRLEN len = s - SvPVX_const(sv);
3228         if (lp) 
3229             *lp = len;
3230         SvCUR_set(sv, len);
3231     }
3232     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3233                           PTR2UV(sv),SvPVX_const(sv)));
3234     if (flags & SV_CONST_RETURN)
3235         return (char *)SvPVX_const(sv);
3236     if (flags & SV_MUTABLE_RETURN)
3237         return SvPVX_mutable(sv);
3238     return SvPVX(sv);
3239 }
3240
3241 /*
3242 =for apidoc sv_copypv
3243
3244 Copies a stringified representation of the source SV into the
3245 destination SV.  Automatically performs any necessary mg_get and
3246 coercion of numeric values into strings.  Guaranteed to preserve
3247 UTF8 flag even from overloaded objects.  Similar in nature to
3248 sv_2pv[_flags] but operates directly on an SV instead of just the
3249 string.  Mostly uses sv_2pv_flags to do its work, except when that
3250 would lose the UTF-8'ness of the PV.
3251
3252 =for apidoc sv_copypv_nomg
3253
3254 Like sv_copypv, but doesn't invoke get magic first.
3255
3256 =for apidoc sv_copypv_flags
3257
3258 Implementation of sv_copypv and sv_copypv_nomg.  Calls get magic iff flags
3259 include SV_GMAGIC.
3260
3261 =cut
3262 */
3263
3264 void
3265 Perl_sv_copypv_flags(pTHX_ SV *const dsv, SV *const ssv, const I32 flags)
3266 {
3267     STRLEN len;
3268     const char *s;
3269
3270     PERL_ARGS_ASSERT_SV_COPYPV_FLAGS;
3271
3272     s = SvPV_flags_const(ssv,len,(flags & SV_GMAGIC));
3273     sv_setpvn(dsv,s,len);
3274     if (SvUTF8(ssv))
3275         SvUTF8_on(dsv);
3276     else
3277         SvUTF8_off(dsv);
3278 }
3279
3280 /*
3281 =for apidoc sv_2pvbyte
3282
3283 Return a pointer to the byte-encoded representation of the SV, and set *lp
3284 to its length.  May cause the SV to be downgraded from UTF-8 as a
3285 side-effect.
3286
3287 Usually accessed via the C<SvPVbyte> macro.
3288
3289 =cut
3290 */
3291
3292 char *
3293 Perl_sv_2pvbyte(pTHX_ SV *sv, STRLEN *const lp)
3294 {
3295     PERL_ARGS_ASSERT_SV_2PVBYTE;
3296
3297     SvGETMAGIC(sv);
3298     if (((SvREADONLY(sv) || SvFAKE(sv)) && !SvIsCOW(sv))
3299      || isGV_with_GP(sv) || SvROK(sv)) {
3300         SV *sv2 = sv_newmortal();
3301         sv_copypv_nomg(sv2,sv);
3302         sv = sv2;
3303     }
3304     sv_utf8_downgrade(sv,0);
3305     return lp ? SvPV_nomg(sv,*lp) : SvPV_nomg_nolen(sv);
3306 }
3307
3308 /*
3309 =for apidoc sv_2pvutf8
3310
3311 Return a pointer to the UTF-8-encoded representation of the SV, and set *lp
3312 to its length.  May cause the SV to be upgraded to UTF-8 as a side-effect.
3313
3314 Usually accessed via the C<SvPVutf8> macro.
3315
3316 =cut
3317 */
3318
3319 char *
3320 Perl_sv_2pvutf8(pTHX_ SV *sv, STRLEN *const lp)
3321 {
3322     PERL_ARGS_ASSERT_SV_2PVUTF8;
3323
3324     if (((SvREADONLY(sv) || SvFAKE(sv)) && !SvIsCOW(sv))
3325      || isGV_with_GP(sv) || SvROK(sv))
3326         sv = sv_mortalcopy(sv);
3327     else
3328         SvGETMAGIC(sv);
3329     sv_utf8_upgrade_nomg(sv);
3330     return lp ? SvPV_nomg(sv,*lp) : SvPV_nomg_nolen(sv);
3331 }
3332
3333
3334 /*
3335 =for apidoc sv_2bool
3336
3337 This macro is only used by sv_true() or its macro equivalent, and only if
3338 the latter's argument is neither SvPOK, SvIOK nor SvNOK.
3339 It calls sv_2bool_flags with the SV_GMAGIC flag.
3340
3341 =for apidoc sv_2bool_flags
3342
3343 This function is only used by sv_true() and friends,  and only if
3344 the latter's argument is neither SvPOK, SvIOK nor SvNOK.  If the flags
3345 contain SV_GMAGIC, then it does an mg_get() first.
3346
3347
3348 =cut
3349 */
3350
3351 bool
3352 Perl_sv_2bool_flags(pTHX_ SV *sv, I32 flags)
3353 {
3354     PERL_ARGS_ASSERT_SV_2BOOL_FLAGS;
3355
3356     restart:
3357     if(flags & SV_GMAGIC) SvGETMAGIC(sv);
3358
3359     if (!SvOK(sv))
3360         return 0;
3361     if (SvROK(sv)) {
3362         if (SvAMAGIC(sv)) {
3363             SV * const tmpsv = AMG_CALLunary(sv, bool__amg);
3364             if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv)))) {
3365                 bool svb;
3366                 sv = tmpsv;
3367                 if(SvGMAGICAL(sv)) {
3368                     flags = SV_GMAGIC;
3369                     goto restart; /* call sv_2bool */
3370                 }
3371                 /* expanded SvTRUE_common(sv, (flags = 0, goto restart)) */
3372                 else if(!SvOK(sv)) {
3373                     svb = 0;
3374                 }
3375                 else if(SvPOK(sv)) {
3376                     svb = SvPVXtrue(sv);
3377                 }
3378                 else if((SvFLAGS(sv) & (SVf_IOK|SVf_NOK))) {
3379                     svb = (SvIOK(sv) && SvIVX(sv) != 0)
3380                         || (SvNOK(sv) && SvNVX(sv) != 0.0);
3381                 }
3382                 else {
3383                     flags = 0;
3384                     goto restart; /* call sv_2bool_nomg */
3385                 }
3386                 return cBOOL(svb);
3387             }
3388         }
3389         return SvRV(sv) != 0;
3390     }
3391     if (isREGEXP(sv))
3392         return
3393           RX_WRAPLEN(sv) > 1 || (RX_WRAPLEN(sv) && *RX_WRAPPED(sv) != '0');
3394     return SvTRUE_common(sv, isGV_with_GP(sv) ? 1 : 0);
3395 }
3396
3397 /*
3398 =for apidoc sv_utf8_upgrade
3399
3400 Converts the PV of an SV to its UTF-8-encoded form.
3401 Forces the SV to string form if it is not already.
3402 Will C<mg_get> on C<sv> if appropriate.
3403 Always sets the SvUTF8 flag to avoid future validity checks even
3404 if the whole string is the same in UTF-8 as not.
3405 Returns the number of bytes in the converted string
3406
3407 This is not a general purpose byte encoding to Unicode interface:
3408 use the Encode extension for that.
3409
3410 =for apidoc sv_utf8_upgrade_nomg
3411
3412 Like sv_utf8_upgrade, but doesn't do magic on C<sv>.
3413
3414 =for apidoc sv_utf8_upgrade_flags
3415
3416 Converts the PV of an SV to its UTF-8-encoded form.
3417 Forces the SV to string form if it is not already.
3418 Always sets the SvUTF8 flag to avoid future validity checks even
3419 if all the bytes are invariant in UTF-8.
3420 If C<flags> has C<SV_GMAGIC> bit set,
3421 will C<mg_get> on C<sv> if appropriate, else not.
3422
3423 If C<flags> has SV_FORCE_UTF8_UPGRADE set, this function assumes that the PV
3424 will expand when converted to UTF-8, and skips the extra work of checking for
3425 that.  Typically this flag is used by a routine that has already parsed the
3426 string and found such characters, and passes this information on so that the
3427 work doesn't have to be repeated.
3428
3429 Returns the number of bytes in the converted string.
3430
3431 This is not a general purpose byte encoding to Unicode interface:
3432 use the Encode extension for that.
3433
3434 =for apidoc sv_utf8_upgrade_flags_grow
3435
3436 Like sv_utf8_upgrade_flags, but has an additional parameter C<extra>, which is
3437 the number of unused bytes the string of 'sv' is guaranteed to have free after
3438 it upon return.  This allows the caller to reserve extra space that it intends
3439 to fill, to avoid extra grows.
3440
3441 C<sv_utf8_upgrade>, C<sv_utf8_upgrade_nomg>, and C<sv_utf8_upgrade_flags>
3442 are implemented in terms of this function.
3443
3444 Returns the number of bytes in the converted string (not including the spares).
3445
3446 =cut
3447
3448 (One might think that the calling routine could pass in the position of the
3449 first variant character when it has set SV_FORCE_UTF8_UPGRADE, so it wouldn't
3450 have to be found again.  But that is not the case, because typically when the
3451 caller is likely to use this flag, it won't be calling this routine unless it
3452 finds something that won't fit into a byte.  Otherwise it tries to not upgrade
3453 and just use bytes.  But some things that do fit into a byte are variants in
3454 utf8, and the caller may not have been keeping track of these.)
3455
3456 If the routine itself changes the string, it adds a trailing C<NUL>.  Such a
3457 C<NUL> isn't guaranteed due to having other routines do the work in some input
3458 cases, or if the input is already flagged as being in utf8.
3459
3460 The speed of this could perhaps be improved for many cases if someone wanted to
3461 write a fast function that counts the number of variant characters in a string,
3462 especially if it could return the position of the first one.
3463
3464 */
3465
3466 STRLEN
3467 Perl_sv_utf8_upgrade_flags_grow(pTHX_ SV *const sv, const I32 flags, STRLEN extra)
3468 {
3469     PERL_ARGS_ASSERT_SV_UTF8_UPGRADE_FLAGS_GROW;
3470
3471     if (sv == &PL_sv_undef)
3472         return 0;
3473     if (!SvPOK_nog(sv)) {
3474         STRLEN len = 0;
3475         if (SvREADONLY(sv) && (SvPOKp(sv) || SvIOKp(sv) || SvNOKp(sv))) {
3476             (void) sv_2pv_flags(sv,&len, flags);
3477             if (SvUTF8(sv)) {
3478                 if (extra) SvGROW(sv, SvCUR(sv) + extra);
3479                 return len;
3480             }
3481         } else {
3482             (void) SvPV_force_flags(sv,len,flags & SV_GMAGIC);
3483         }
3484     }
3485
3486     if (SvUTF8(sv)) {
3487         if (extra) SvGROW(sv, SvCUR(sv) + extra);
3488         return SvCUR(sv);
3489     }
3490
3491     if (SvIsCOW(sv)) {
3492         S_sv_uncow(aTHX_ sv, 0);
3493     }
3494
3495     if (IN_ENCODING && !(flags & SV_UTF8_NO_ENCODING)) {
3496         sv_recode_to_utf8(sv, _get_encoding());
3497         if (extra) SvGROW(sv, SvCUR(sv) + extra);
3498         return SvCUR(sv);
3499     }
3500
3501     if (SvCUR(sv) == 0) {
3502         if (extra) SvGROW(sv, extra);
3503     } else { /* Assume Latin-1/EBCDIC */
3504         /* This function could be much more efficient if we
3505          * had a FLAG in SVs to signal if there are any variant
3506          * chars in the PV.  Given that there isn't such a flag
3507          * make the loop as fast as possible (although there are certainly ways
3508          * to speed this up, eg. through vectorization) */
3509         U8 * s = (U8 *) SvPVX_const(sv);
3510         U8 * e = (U8 *) SvEND(sv);
3511         U8 *t = s;
3512         STRLEN two_byte_count = 0;
3513         
3514         if (flags & SV_FORCE_UTF8_UPGRADE) goto must_be_utf8;
3515
3516         /* See if really will need to convert to utf8.  We mustn't rely on our
3517          * incoming SV being well formed and having a trailing '\0', as certain
3518          * code in pp_formline can send us partially built SVs. */
3519
3520         while (t < e) {
3521             const U8 ch = *t++;
3522             if (NATIVE_BYTE_IS_INVARIANT(ch)) continue;
3523
3524             t--;    /* t already incremented; re-point to first variant */
3525             two_byte_count = 1;
3526             goto must_be_utf8;
3527         }
3528
3529         /* utf8 conversion not needed because all are invariants.  Mark as
3530          * UTF-8 even if no variant - saves scanning loop */
3531         SvUTF8_on(sv);
3532         if (extra) SvGROW(sv, SvCUR(sv) + extra);
3533         return SvCUR(sv);
3534
3535       must_be_utf8:
3536
3537         /* Here, the string should be converted to utf8, either because of an
3538          * input flag (two_byte_count = 0), or because a character that
3539          * requires 2 bytes was found (two_byte_count = 1).  t points either to
3540          * the beginning of the string (if we didn't examine anything), or to
3541          * the first variant.  In either case, everything from s to t - 1 will
3542          * occupy only 1 byte each on output.
3543          *
3544          * There are two main ways to convert.  One is to create a new string
3545          * and go through the input starting from the beginning, appending each
3546          * converted value onto the new string as we go along.  It's probably
3547          * best to allocate enough space in the string for the worst possible
3548          * case rather than possibly running out of space and having to
3549          * reallocate and then copy what we've done so far.  Since everything
3550          * from s to t - 1 is invariant, the destination can be initialized
3551          * with these using a fast memory copy
3552          *
3553          * The other way is to figure out exactly how big the string should be
3554          * by parsing the entire input.  Then you don't have to make it big
3555          * enough to handle the worst possible case, and more importantly, if
3556          * the string you already have is large enough, you don't have to
3557          * allocate a new string, you can copy the last character in the input
3558          * string to the final position(s) that will be occupied by the
3559          * converted string and go backwards, stopping at t, since everything
3560          * before that is invariant.
3561          *
3562          * There are advantages and disadvantages to each method.
3563          *
3564          * In the first method, we can allocate a new string, do the memory
3565          * copy from the s to t - 1, and then proceed through the rest of the
3566          * string byte-by-byte.
3567          *
3568          * In the second method, we proceed through the rest of the input
3569          * string just calculating how big the converted string will be.  Then
3570          * there are two cases:
3571          *  1)  if the string has enough extra space to handle the converted
3572          *      value.  We go backwards through the string, converting until we
3573          *      get to the position we are at now, and then stop.  If this
3574          *      position is far enough along in the string, this method is
3575          *      faster than the other method.  If the memory copy were the same
3576          *      speed as the byte-by-byte loop, that position would be about
3577          *      half-way, as at the half-way mark, parsing to the end and back
3578          *      is one complete string's parse, the same amount as starting
3579          *      over and going all the way through.  Actually, it would be
3580          *      somewhat less than half-way, as it's faster to just count bytes
3581          *      than to also copy, and we don't have the overhead of allocating
3582          *      a new string, changing the scalar to use it, and freeing the
3583          *      existing one.  But if the memory copy is fast, the break-even
3584          *      point is somewhere after half way.  The counting loop could be
3585          *      sped up by vectorization, etc, to move the break-even point
3586          *      further towards the beginning.
3587          *  2)  if the string doesn't have enough space to handle the converted
3588          *      value.  A new string will have to be allocated, and one might
3589          *      as well, given that, start from the beginning doing the first
3590          *      method.  We've spent extra time parsing the string and in
3591          *      exchange all we've gotten is that we know precisely how big to
3592          *      make the new one.  Perl is more optimized for time than space,
3593          *      so this case is a loser.
3594          * So what I've decided to do is not use the 2nd method unless it is
3595          * guaranteed that a new string won't have to be allocated, assuming
3596          * the worst case.  I also decided not to put any more conditions on it
3597          * than this, for now.  It seems likely that, since the worst case is
3598          * twice as big as the unknown portion of the string (plus 1), we won't
3599          * be guaranteed enough space, causing us to go to the first method,
3600          * unless the string is short, or the first variant character is near
3601          * the end of it.  In either of these cases, it seems best to use the
3602          * 2nd method.  The only circumstance I can think of where this would
3603          * be really slower is if the string had once had much more data in it
3604          * than it does now, but there is still a substantial amount in it  */
3605
3606         {
3607             STRLEN invariant_head = t - s;
3608             STRLEN size = invariant_head + (e - t) * 2 + 1 + extra;
3609             if (SvLEN(sv) < size) {
3610
3611                 /* Here, have decided to allocate a new string */
3612
3613                 U8 *dst;
3614                 U8 *d;
3615
3616                 Newx(dst, size, U8);
3617
3618                 /* If no known invariants at the beginning of the input string,
3619                  * set so starts from there.  Otherwise, can use memory copy to
3620                  * get up to where we are now, and then start from here */
3621
3622                 if (invariant_head == 0) {
3623                     d = dst;
3624                 } else {
3625                     Copy(s, dst, invariant_head, char);
3626                     d = dst + invariant_head;
3627                 }
3628
3629                 while (t < e) {
3630                     append_utf8_from_native_byte(*t, &d);
3631                     t++;
3632                 }
3633                 *d = '\0';
3634                 SvPV_free(sv); /* No longer using pre-existing string */
3635                 SvPV_set(sv, (char*)dst);
3636                 SvCUR_set(sv, d - dst);
3637                 SvLEN_set(sv, size);
3638             } else {
3639
3640                 /* Here, have decided to get the exact size of the string.
3641                  * Currently this happens only when we know that there is
3642                  * guaranteed enough space to fit the converted string, so
3643                  * don't have to worry about growing.  If two_byte_count is 0,
3644                  * then t points to the first byte of the string which hasn't
3645                  * been examined yet.  Otherwise two_byte_count is 1, and t
3646                  * points to the first byte in the string that will expand to
3647                  * two.  Depending on this, start examining at t or 1 after t.
3648                  * */
3649
3650                 U8 *d = t + two_byte_count;
3651
3652
3653                 /* Count up the remaining bytes that expand to two */
3654
3655                 while (d < e) {
3656                     const U8 chr = *d++;
3657                     if (! NATIVE_BYTE_IS_INVARIANT(chr)) two_byte_count++;
3658                 }
3659
3660                 /* The string will expand by just the number of bytes that
3661                  * occupy two positions.  But we are one afterwards because of
3662                  * the increment just above.  This is the place to put the
3663                  * trailing NUL, and to set the length before we decrement */
3664
3665                 d += two_byte_count;
3666                 SvCUR_set(sv, d - s);
3667                 *d-- = '\0';
3668
3669
3670                 /* Having decremented d, it points to the position to put the
3671                  * very last byte of the expanded string.  Go backwards through
3672                  * the string, copying and expanding as we go, stopping when we
3673                  * get to the part that is invariant the rest of the way down */
3674
3675                 e--;
3676                 while (e >= t) {
3677                     if (NATIVE_BYTE_IS_INVARIANT(*e)) {
3678                         *d-- = *e;
3679                     } else {
3680                         *d-- = UTF8_EIGHT_BIT_LO(*e);
3681                         *d-- = UTF8_EIGHT_BIT_HI(*e);
3682                     }
3683                     e--;
3684                 }
3685             }
3686
3687             if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
3688                 /* Update pos. We do it at the end rather than during
3689                  * the upgrade, to avoid slowing down the common case
3690                  * (upgrade without pos).
3691                  * pos can be stored as either bytes or characters.  Since
3692                  * this was previously a byte string we can just turn off
3693                  * the bytes flag. */
3694                 MAGIC * mg = mg_find(sv, PERL_MAGIC_regex_global);
3695                 if (mg) {
3696                     mg->mg_flags &= ~MGf_BYTES;
3697                 }
3698                 if ((mg = mg_find(sv, PERL_MAGIC_utf8)))
3699                     magic_setutf8(sv,mg); /* clear UTF8 cache */
3700             }
3701         }
3702     }
3703
3704     /* Mark as UTF-8 even if no variant - saves scanning loop */
3705     SvUTF8_on(sv);
3706     return SvCUR(sv);
3707 }
3708
3709 /*
3710 =for apidoc sv_utf8_downgrade
3711
3712 Attempts to convert the PV of an SV from characters to bytes.
3713 If the PV contains a character that cannot fit
3714 in a byte, this conversion will fail;
3715 in this case, either returns false or, if C<fail_ok> is not
3716 true, croaks.
3717
3718 This is not a general purpose Unicode to byte encoding interface:
3719 use the Encode extension for that.
3720
3721 =cut
3722 */
3723
3724 bool
3725 Perl_sv_utf8_downgrade(pTHX_ SV *const sv, const bool fail_ok)
3726 {
3727     PERL_ARGS_ASSERT_SV_UTF8_DOWNGRADE;
3728
3729     if (SvPOKp(sv) && SvUTF8(sv)) {
3730         if (SvCUR(sv)) {
3731             U8 *s;
3732             STRLEN len;
3733             int mg_flags = SV_GMAGIC;
3734
3735             if (SvIsCOW(sv)) {
3736                 S_sv_uncow(aTHX_ sv, 0);
3737             }
3738             if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
3739                 /* update pos */
3740                 MAGIC * mg = mg_find(sv, PERL_MAGIC_regex_global);
3741                 if (mg && mg->mg_len > 0 && mg->mg_flags & MGf_BYTES) {
3742                         mg->mg_len = sv_pos_b2u_flags(sv, mg->mg_len,
3743                                                 SV_GMAGIC|SV_CONST_RETURN);
3744                         mg_flags = 0; /* sv_pos_b2u does get magic */
3745                 }
3746                 if ((mg = mg_find(sv, PERL_MAGIC_utf8)))
3747                     magic_setutf8(sv,mg); /* clear UTF8 cache */
3748
3749             }
3750             s = (U8 *) SvPV_flags(sv, len, mg_flags);
3751
3752             if (!utf8_to_bytes(s, &len)) {
3753                 if (fail_ok)
3754                     return FALSE;
3755                 else {
3756                     if (PL_op)
3757                         Perl_croak(aTHX_ "Wide character in %s",
3758                                    OP_DESC(PL_op));
3759                     else
3760                         Perl_croak(aTHX_ "Wide character");
3761                 }
3762             }
3763             SvCUR_set(sv, len);
3764         }
3765     }
3766     SvUTF8_off(sv);
3767     return TRUE;
3768 }
3769
3770 /*
3771 =for apidoc sv_utf8_encode
3772
3773 Converts the PV of an SV to UTF-8, but then turns the C<SvUTF8>
3774 flag off so that it looks like octets again.
3775
3776 =cut
3777 */
3778
3779 void
3780 Perl_sv_utf8_encode(pTHX_ SV *const sv)
3781 {
3782     PERL_ARGS_ASSERT_SV_UTF8_ENCODE;
3783
3784     if (SvREADONLY(sv)) {
3785         sv_force_normal_flags(sv, 0);
3786     }
3787     (void) sv_utf8_upgrade(sv);
3788     SvUTF8_off(sv);
3789 }
3790
3791 /*
3792 =for apidoc sv_utf8_decode
3793
3794 If the PV of the SV is an octet sequence in UTF-8
3795 and contains a multiple-byte character, the C<SvUTF8> flag is turned on
3796 so that it looks like a character.  If the PV contains only single-byte
3797 characters, the C<SvUTF8> flag stays off.
3798 Scans PV for validity and returns false if the PV is invalid UTF-8.
3799
3800 =cut
3801 */
3802
3803 bool
3804 Perl_sv_utf8_decode(pTHX_ SV *const sv)
3805 {
3806     PERL_ARGS_ASSERT_SV_UTF8_DECODE;
3807
3808     if (SvPOKp(sv)) {
3809         const U8 *start, *c;
3810         const U8 *e;
3811
3812         /* The octets may have got themselves encoded - get them back as
3813          * bytes
3814          */
3815         if (!sv_utf8_downgrade(sv, TRUE))
3816             return FALSE;
3817
3818         /* it is actually just a matter of turning the utf8 flag on, but
3819          * we want to make sure everything inside is valid utf8 first.
3820          */
3821         c = start = (const U8 *) SvPVX_const(sv);
3822         if (!is_utf8_string(c, SvCUR(sv)))
3823             return FALSE;
3824         e = (const U8 *) SvEND(sv);
3825         while (c < e) {
3826             const U8 ch = *c++;
3827             if (!UTF8_IS_INVARIANT(ch)) {
3828                 SvUTF8_on(sv);
3829                 break;
3830             }
3831         }
3832         if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
3833             /* XXX Is this dead code?  XS_utf8_decode calls SvSETMAGIC
3834                    after this, clearing pos.  Does anything on CPAN
3835                    need this? */
3836             /* adjust pos to the start of a UTF8 char sequence */
3837             MAGIC * mg = mg_find(sv, PERL_MAGIC_regex_global);
3838             if (mg) {
3839                 I32 pos = mg->mg_len;
3840                 if (pos > 0) {
3841                     for (c = start + pos; c > start; c--) {
3842                         if (UTF8_IS_START(*c))
3843                             break;
3844                     }
3845                     mg->mg_len  = c - start;
3846                 }
3847             }
3848             if ((mg = mg_find(sv, PERL_MAGIC_utf8)))
3849                 magic_setutf8(sv,mg); /* clear UTF8 cache */
3850         }
3851     }
3852     return TRUE;
3853 }
3854
3855 /*
3856 =for apidoc sv_setsv
3857
3858 Copies the contents of the source SV C<ssv> into the destination SV
3859 C<dsv>.  The source SV may be destroyed if it is mortal, so don't use this
3860 function if the source SV needs to be reused.  Does not handle 'set' magic on
3861 destination SV.  Calls 'get' magic on source SV.  Loosely speaking, it
3862 performs a copy-by-value, obliterating any previous content of the
3863 destination.
3864
3865 You probably want to use one of the assortment of wrappers, such as
3866 C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3867 C<SvSetMagicSV_nosteal>.
3868
3869 =for apidoc sv_setsv_flags
3870
3871 Copies the contents of the source SV C<ssv> into the destination SV
3872 C<dsv>.  The source SV may be destroyed if it is mortal, so don't use this
3873 function if the source SV needs to be reused.  Does not handle 'set' magic.
3874 Loosely speaking, it performs a copy-by-value, obliterating any previous
3875 content of the destination.
3876 If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
3877 C<ssv> if appropriate, else not.  If the C<flags>
3878 parameter has the C<SV_NOSTEAL> bit set then the
3879 buffers of temps will not be stolen.  <sv_setsv>
3880 and C<sv_setsv_nomg> are implemented in terms of this function.
3881
3882 You probably want to use one of the assortment of wrappers, such as
3883 C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3884 C<SvSetMagicSV_nosteal>.
3885
3886 This is the primary function for copying scalars, and most other
3887 copy-ish functions and macros use this underneath.
3888
3889 =cut
3890 */
3891
3892 static void
3893 S_glob_assign_glob(pTHX_ SV *const dstr, SV *const sstr, const int dtype)
3894 {
3895     I32 mro_changes = 0; /* 1 = method, 2 = isa, 3 = recursive isa */
3896     HV *old_stash = NULL;
3897
3898     PERL_ARGS_ASSERT_GLOB_ASSIGN_GLOB;
3899
3900     if (dtype != SVt_PVGV && !isGV_with_GP(dstr)) {
3901         const char * const name = GvNAME(sstr);
3902         const STRLEN len = GvNAMELEN(sstr);
3903         {
3904             if (dtype >= SVt_PV) {
3905                 SvPV_free(dstr);
3906                 SvPV_set(dstr, 0);
3907                 SvLEN_set(dstr, 0);
3908                 SvCUR_set(dstr, 0);
3909             }
3910             SvUPGRADE(dstr, SVt_PVGV);
3911             (void)SvOK_off(dstr);
3912             isGV_with_GP_on(dstr);
3913         }
3914         GvSTASH(dstr) = GvSTASH(sstr);
3915         if (GvSTASH(dstr))
3916             Perl_sv_add_backref(aTHX_ MUTABLE_SV(GvSTASH(dstr)), dstr);
3917         gv_name_set(MUTABLE_GV(dstr), name, len,
3918                         GV_ADD | (GvNAMEUTF8(sstr) ? SVf_UTF8 : 0 ));
3919         SvFAKE_on(dstr);        /* can coerce to non-glob */
3920     }
3921
3922     if(GvGP(MUTABLE_GV(sstr))) {
3923         /* If source has method cache entry, clear it */
3924         if(GvCVGEN(sstr)) {
3925             SvREFCNT_dec(GvCV(sstr));
3926             GvCV_set(sstr, NULL);
3927             GvCVGEN(sstr) = 0;
3928         }
3929         /* If source has a real method, then a method is
3930            going to change */
3931         else if(
3932          GvCV((const GV *)sstr) && GvSTASH(dstr) && HvENAME(GvSTASH(dstr))
3933         ) {
3934             mro_changes = 1;
3935         }
3936     }
3937
3938     /* If dest already had a real method, that's a change as well */
3939     if(
3940         !mro_changes && GvGP(MUTABLE_GV(dstr)) && GvCVu((const GV *)dstr)
3941      && GvSTASH(dstr) && HvENAME(GvSTASH(dstr))
3942     ) {
3943         mro_changes = 1;
3944     }
3945
3946     /* We don't need to check the name of the destination if it was not a
3947        glob to begin with. */
3948     if(dtype == SVt_PVGV) {
3949         const char * const name = GvNAME((const GV *)dstr);
3950         if(
3951             strEQ(name,"ISA")
3952          /* The stash may have been detached from the symbol table, so
3953             check its name. */
3954          && GvSTASH(dstr) && HvENAME(GvSTASH(dstr))
3955         )
3956             mro_changes = 2;
3957         else {
3958             const STRLEN len = GvNAMELEN(dstr);
3959             if ((len > 1 && name[len-2] == ':' && name[len-1] == ':')
3960              || (len == 1 && name[0] == ':')) {
3961                 mro_changes = 3;
3962
3963                 /* Set aside the old stash, so we can reset isa caches on
3964                    its subclasses. */
3965                 if((old_stash = GvHV(dstr)))
3966                     /* Make sure we do not lose it early. */
3967                     SvREFCNT_inc_simple_void_NN(
3968                      sv_2mortal((SV *)old_stash)
3969                     );
3970             }
3971         }
3972
3973         SvREFCNT_inc_simple_void_NN(sv_2mortal(dstr));
3974     }
3975
3976     gp_free(MUTABLE_GV(dstr));
3977     GvINTRO_off(dstr);          /* one-shot flag */
3978     GvGP_set(dstr, gp_ref(GvGP(sstr)));
3979     if (SvTAINTED(sstr))
3980         SvTAINT(dstr);
3981     if (GvIMPORTED(dstr) != GVf_IMPORTED
3982         && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3983         {
3984             GvIMPORTED_on(dstr);
3985         }
3986     GvMULTI_on(dstr);
3987     if(mro_changes == 2) {
3988       if (GvAV((const GV *)sstr)) {
3989         MAGIC *mg;
3990         SV * const sref = (SV *)GvAV((const GV *)dstr);
3991         if (SvSMAGICAL(sref) && (mg = mg_find(sref, PERL_MAGIC_isa))) {
3992             if (SvTYPE(mg->mg_obj) != SVt_PVAV) {
3993                 AV * const ary = newAV();
3994                 av_push(ary, mg->mg_obj); /* takes the refcount */
3995                 mg->mg_obj = (SV *)ary;
3996             }
3997             av_push((AV *)mg->mg_obj, SvREFCNT_inc_simple_NN(dstr));
3998         }
3999         else sv_magic(sref, dstr, PERL_MAGIC_isa, NULL, 0);
4000       }
4001       mro_isa_changed_in(GvSTASH(dstr));
4002     }
4003     else if(mro_changes == 3) {
4004         HV * const stash = GvHV(dstr);
4005         if(old_stash ? (HV *)HvENAME_get(old_stash) : stash)
4006             mro_package_moved(
4007                 stash, old_stash,
4008                 (GV *)dstr, 0
4009             );
4010     }
4011     else if(mro_changes) mro_method_changed_in(GvSTASH(dstr));
4012     if (GvIO(dstr) && dtype == SVt_PVGV) {
4013         DEBUG_o(Perl_deb(aTHX_
4014                         "glob_assign_glob clearing PL_stashcache\n"));
4015         /* It's a cache. It will rebuild itself quite happily.
4016            It's a lot of effort to work out exactly which key (or keys)
4017            might be invalidated by the creation of the this file handle.
4018          */
4019         hv_clear(PL_stashcache);
4020     }
4021     return;
4022 }
4023
4024 void
4025 Perl_gv_setref(pTHX_ SV *const dstr, SV *const sstr)
4026 {
4027     SV * const sref = SvRV(sstr);
4028     SV *dref;
4029     const int intro = GvINTRO(dstr);
4030     SV **location;
4031     U8 import_flag = 0;
4032     const U32 stype = SvTYPE(sref);
4033
4034     PERL_ARGS_ASSERT_GV_SETREF;
4035
4036     if (intro) {
4037         GvINTRO_off(dstr);      /* one-shot flag */
4038         GvLINE(dstr) = CopLINE(PL_curcop);
4039         GvEGV(dstr) = MUTABLE_GV(dstr);
4040     }
4041     GvMULTI_on(dstr);
4042     switch (stype) {
4043     case SVt_PVCV:
4044         location = (SV **) &(GvGP(dstr)->gp_cv); /* XXX bypassing GvCV_set */
4045         import_flag = GVf_IMPORTED_CV;
4046         goto common;
4047     case SVt_PVHV:
4048         location = (SV **) &GvHV(dstr);
4049         import_flag = GVf_IMPORTED_HV;
4050         goto common;
4051     case SVt_PVAV:
4052         location = (SV **) &GvAV(dstr);
4053         import_flag = GVf_IMPORTED_AV;
4054         goto common;
4055     case SVt_PVIO:
4056         location = (SV **) &GvIOp(dstr);
4057         goto common;
4058     case SVt_PVFM:
4059         location = (SV **) &GvFORM(dstr);
4060         goto common;
4061     default:
4062         location = &GvSV(dstr);
4063         import_flag = GVf_IMPORTED_SV;
4064     common:
4065         if (intro) {
4066             if (stype == SVt_PVCV) {
4067                 /*if (GvCVGEN(dstr) && (GvCV(dstr) != (const CV *)sref || GvCVGEN(dstr))) {*/
4068                 if (GvCVGEN(dstr)) {
4069                     SvREFCNT_dec(GvCV(dstr));
4070                     GvCV_set(dstr, NULL);
4071                     GvCVGEN(dstr) = 0; /* Switch off cacheness. */
4072                 }
4073             }
4074             /* SAVEt_GVSLOT takes more room on the savestack and has more
4075                overhead in leave_scope than SAVEt_GENERIC_SV.  But for CVs
4076                leave_scope needs access to the GV so it can reset method
4077                caches.  We must use SAVEt_GVSLOT whenever the type is
4078                SVt_PVCV, even if the stash is anonymous, as the stash may
4079                gain a name somehow before leave_scope. */
4080             if (stype == SVt_PVCV) {
4081                 /* There is no save_pushptrptrptr.  Creating it for this
4082                    one call site would be overkill.  So inline the ss add
4083                    routines here. */
4084                 dSS_ADD;
4085                 SS_ADD_PTR(dstr);
4086                 SS_ADD_PTR(location);
4087                 SS_ADD_PTR(SvREFCNT_inc(*location));
4088                 SS_ADD_UV(SAVEt_GVSLOT);
4089                 SS_ADD_END(4);
4090             }
4091             else SAVEGENERICSV(*location);
4092         }
4093         dref = *location;
4094         if (stype == SVt_PVCV && (*location != sref || GvCVGEN(dstr))) {
4095             CV* const cv = MUTABLE_CV(*location);
4096             if (cv) {
4097                 if (!GvCVGEN((const GV *)dstr) &&
4098                     (CvROOT(cv) || CvXSUB(cv)) &&
4099                     /* redundant check that avoids creating the extra SV
4100                        most of the time: */
4101                     (CvCONST(cv) || ckWARN(WARN_REDEFINE)))
4102                     {
4103                         SV * const new_const_sv =
4104                             CvCONST((const CV *)sref)
4105                                  ? cv_const_sv((const CV *)sref)
4106                                  : NULL;
4107                         report_redefined_cv(
4108                            sv_2mortal(Perl_newSVpvf(aTHX_
4109                                 "%"HEKf"::%"HEKf,
4110                                 HEKfARG(
4111                                  HvNAME_HEK(GvSTASH((const GV *)dstr))
4112                                 ),
4113                                 HEKfARG(GvENAME_HEK(MUTABLE_GV(dstr)))
4114                            )),
4115                            cv,
4116                            CvCONST((const CV *)sref) ? &new_const_sv : NULL
4117                         );
4118                     }
4119                 if (!intro)
4120                     cv_ckproto_len_flags(cv, (const GV *)dstr,
4121                                    SvPOK(sref) ? CvPROTO(sref) : NULL,
4122                                    SvPOK(sref) ? CvPROTOLEN(sref) : 0,
4123                                    SvPOK(sref) ? SvUTF8(sref) : 0);
4124             }
4125             GvCVGEN(dstr) = 0; /* Switch off cacheness. */
4126             GvASSUMECV_on(dstr);
4127             if(GvSTASH(dstr)) { /* sub foo { 1 } sub bar { 2 } *bar = \&foo */
4128                 if (intro && GvREFCNT(dstr) > 1) {
4129                     /* temporary remove extra savestack's ref */
4130                     --GvREFCNT(dstr);
4131                     gv_method_changed(dstr);
4132                     ++GvREFCNT(dstr);
4133                 }
4134                 else gv_method_changed(dstr);
4135             }
4136         }
4137         *location = SvREFCNT_inc_simple_NN(sref);
4138         if (import_flag && !(GvFLAGS(dstr) & import_flag)
4139             && CopSTASH_ne(PL_curcop, GvSTASH(dstr))) {
4140             GvFLAGS(dstr) |= import_flag;
4141         }
4142         if (import_flag == GVf_IMPORTED_SV) {
4143             if (intro) {
4144                 save_aliased_sv((GV *)dstr);
4145             }
4146             /* Turn off the flag if sref is not referenced elsewhere,
4147                even by weak refs.  (SvRMAGICAL is a pessimistic check for
4148                back refs.)  */
4149             if (SvREFCNT(sref) <= 2 && !SvRMAGICAL(sref))
4150                 GvALIASED_SV_off(dstr);
4151             else
4152                 GvALIASED_SV_on(dstr);
4153         }
4154         if (stype == SVt_PVHV) {
4155             const char * const name = GvNAME((GV*)dstr);
4156             const STRLEN len = GvNAMELEN(dstr);
4157             if (
4158                 (
4159                    (len > 1 && name[len-2] == ':' && name[len-1] == ':')
4160                 || (len == 1 && name[0] == ':')
4161                 )
4162              && (!dref || HvENAME_get(dref))
4163             ) {
4164                 mro_package_moved(
4165                     (HV *)sref, (HV *)dref,
4166                     (GV *)dstr, 0
4167                 );
4168             }
4169         }
4170         else if (
4171             stype == SVt_PVAV && sref != dref
4172          && strEQ(GvNAME((GV*)dstr), "ISA")
4173          /* The stash may have been detached from the symbol table, so
4174             check its name before doing anything. */
4175          && GvSTASH(dstr) && HvENAME(GvSTASH(dstr))
4176         ) {
4177             MAGIC *mg;
4178             MAGIC * const omg = dref && SvSMAGICAL(dref)
4179                                  ? mg_find(dref, PERL_MAGIC_isa)
4180                                  : NULL;
4181             if (SvSMAGICAL(sref) && (mg = mg_find(sref, PERL_MAGIC_isa))) {
4182                 if (SvTYPE(mg->mg_obj) != SVt_PVAV) {
4183                     AV * const ary = newAV();
4184                     av_push(ary, mg->mg_obj); /* takes the refcount */
4185                     mg->mg_obj = (SV *)ary;
4186                 }
4187                 if (omg) {
4188                     if (SvTYPE(omg->mg_obj) == SVt_PVAV) {
4189                         SV **svp = AvARRAY((AV *)omg->mg_obj);
4190                         I32 items = AvFILLp((AV *)omg->mg_obj) + 1;
4191                         while (items--)
4192                             av_push(
4193                              (AV *)mg->mg_obj,
4194                              SvREFCNT_inc_simple_NN(*svp++)
4195                             );
4196                     }
4197                     else
4198                         av_push(
4199                          (AV *)mg->mg_obj,
4200                          SvREFCNT_inc_simple_NN(omg->mg_obj)
4201                         );
4202                 }
4203                 else
4204                     av_push((AV *)mg->mg_obj,SvREFCNT_inc_simple_NN(dstr));
4205             }
4206             else
4207             {
4208                 sv_magic(
4209                  sref, omg ? omg->mg_obj : dstr, PERL_MAGIC_isa, NULL, 0
4210                 );
4211                 mg = mg_find(sref, PERL_MAGIC_isa);
4212             }
4213             /* Since the *ISA assignment could have affected more than
4214                one stash, don't call mro_isa_changed_in directly, but let
4215                magic_clearisa do it for us, as it already has the logic for
4216                dealing with globs vs arrays of globs. */
4217             assert(mg);
4218             Perl_magic_clearisa(aTHX_ NULL, mg);
4219         }
4220         else if (stype == SVt_PVIO) {
4221             DEBUG_o(Perl_deb(aTHX_ "gv_setref clearing PL_stashcache\n"));
4222             /* It's a cache. It will rebuild itself quite happily.
4223                It's a lot of effort to work out exactly which key (or keys)
4224                might be invalidated by the creation of the this file handle.
4225             */
4226             hv_clear(PL_stashcache);
4227         }
4228         break;
4229     }
4230     if (!intro) SvREFCNT_dec(dref);
4231     if (SvTAINTED(sstr))
4232         SvTAINT(dstr);
4233     return;
4234 }
4235
4236
4237
4238
4239 #ifdef PERL_DEBUG_READONLY_COW
4240 # include <sys/mman.h>
4241
4242 # ifndef PERL_MEMORY_DEBUG_HEADER_SIZE
4243 #  define PERL_MEMORY_DEBUG_HEADER_SIZE 0
4244 # endif
4245
4246 void
4247 Perl_sv_buf_to_ro(pTHX_ SV *sv)
4248 {
4249     struct perl_memory_debug_header * const header =
4250         (struct perl_memory_debug_header *)(SvPVX(sv)-PERL_MEMORY_DEBUG_HEADER_SIZE);
4251     const MEM_SIZE len = header->size;
4252     PERL_ARGS_ASSERT_SV_BUF_TO_RO;
4253 # ifdef PERL_TRACK_MEMPOOL
4254     if (!header->readonly) header->readonly = 1;
4255 # endif
4256     if (mprotect(header, len, PROT_READ))
4257         Perl_warn(aTHX_ "mprotect RW for COW string %p %lu failed with %d",
4258                          header, len, errno);
4259 }
4260
4261 static void
4262 S_sv_buf_to_rw(pTHX_ SV *sv)
4263 {
4264     struct perl_memory_debug_header * const header =
4265         (struct perl_memory_debug_header *)(SvPVX(sv)-PERL_MEMORY_DEBUG_HEADER_SIZE);
4266     const MEM_SIZE len = header->size;
4267     PERL_ARGS_ASSERT_SV_BUF_TO_RW;
4268     if (mprotect(header, len, PROT_READ|PROT_WRITE))
4269         Perl_warn(aTHX_ "mprotect for COW string %p %lu failed with %d",
4270                          header, len, errno);
4271 # ifdef PERL_TRACK_MEMPOOL
4272     header->readonly = 0;
4273 # endif
4274 }
4275
4276 #else
4277 # define sv_buf_to_ro(sv)       NOOP
4278 # define sv_buf_to_rw(sv)       NOOP
4279 #endif
4280
4281 void
4282 Perl_sv_setsv_flags(pTHX_ SV *dstr, SV* sstr, const I32 flags)
4283 {
4284     U32 sflags;
4285     int dtype;
4286     svtype stype;
4287
4288     PERL_ARGS_ASSERT_SV_SETSV_FLAGS;
4289
4290     if (UNLIKELY( sstr == dstr ))
4291         return;
4292
4293     if (SvIS_FREED(dstr)) {
4294         Perl_croak(aTHX_ "panic: attempt to copy value %" SVf
4295                    " to a freed scalar %p", SVfARG(sstr), (void *)dstr);
4296     }
4297     SV_CHECK_THINKFIRST_COW_DROP(dstr);
4298     if (UNLIKELY( !sstr ))
4299         sstr = &PL_sv_undef;
4300     if (SvIS_FREED(sstr)) {
4301         Perl_croak(aTHX_ "panic: attempt to copy freed scalar %p to %p",
4302                    (void*)sstr, (void*)dstr);
4303     }
4304     stype = SvTYPE(sstr);
4305     dtype = SvTYPE(dstr);
4306
4307     /* There's a lot of redundancy below but we're going for speed here */
4308
4309     switch (stype) {
4310     case SVt_NULL:
4311       undef_sstr:
4312         if (LIKELY( dtype != SVt_PVGV && dtype != SVt_PVLV )) {
4313             (void)SvOK_off(dstr);
4314             return;
4315         }
4316         break;
4317     case SVt_IV:
4318         if (SvIOK(sstr)) {
4319             switch (dtype) {
4320             case SVt_NULL:
4321                 /* For performance, we inline promoting to type SVt_IV. */
4322                 /* We're starting from SVt_NULL, so provided that define is
4323                  * actual 0, we don't have to unset any SV type flags
4324                  * to promote to SVt_IV. */
4325                 STATIC_ASSERT_STMT(SVt_NULL == 0);
4326                 SET_SVANY_FOR_BODYLESS_IV(dstr);
4327                 SvFLAGS(dstr) |= SVt_IV;
4328                 break;
4329             case SVt_NV:
4330             case SVt_PV:
4331                 sv_upgrade(dstr, SVt_PVIV);
4332                 break;
4333             case SVt_PVGV:
4334             case SVt_PVLV:
4335                 goto end_of_first_switch;
4336             }
4337             (void)SvIOK_only(dstr);
4338             SvIV_set(dstr,  SvIVX(sstr));
4339             if (SvIsUV(sstr))
4340                 SvIsUV_on(dstr);
4341             /* SvTAINTED can only be true if the SV has taint magic, which in
4342                turn means that the SV type is PVMG (or greater). This is the
4343                case statement for SVt_IV, so this cannot be true (whatever gcov
4344                may say).  */
4345             assert(!SvTAINTED(sstr));
4346             return;
4347         }
4348         if (!SvROK(sstr))
4349             goto undef_sstr;
4350         if (dtype < SVt_PV && dtype != SVt_IV)
4351             sv_upgrade(dstr, SVt_IV);
4352         break;
4353
4354     case SVt_NV:
4355         if (LIKELY( SvNOK(sstr) )) {
4356             switch (dtype) {
4357             case SVt_NULL:
4358             case SVt_IV:
4359                 sv_upgrade(dstr, SVt_NV);
4360                 break;
4361             case SVt_PV:
4362             case SVt_PVIV:
4363                 sv_upgrade(dstr, SVt_PVNV);
4364                 break;
4365             case SVt_PVGV:
4366             case SVt_PVLV:
4367                 goto end_of_first_switch;
4368             }
4369             SvNV_set(dstr, SvNVX(sstr));
4370             (void)SvNOK_only(dstr);
4371             /* SvTAINTED can only be true if the SV has taint magic, which in
4372                turn means that the SV type is PVMG (or greater). This is the
4373                case statement for SVt_NV, so this cannot be true (whatever gcov
4374                may say).  */
4375             assert(!SvTAINTED(sstr));
4376             return;
4377         }
4378         goto undef_sstr;
4379
4380     case SVt_PV:
4381         if (dtype < SVt_PV)
4382             sv_upgrade(dstr, SVt_PV);
4383         break;
4384     case SVt_PVIV:
4385         if (dtype < SVt_PVIV)
4386             sv_upgrade(dstr, SVt_PVIV);
4387         break;
4388     case SVt_PVNV:
4389         if (dtype < SVt_PVNV)
4390             sv_upgrade(dstr, SVt_PVNV);
4391         break;
4392     default:
4393         {
4394         const char * const type = sv_reftype(sstr,0);
4395         if (PL_op)
4396             /* diag_listed_as: Bizarre copy of %s */
4397             Perl_croak(aTHX_ "Bizarre copy of %s in %s", type, OP_DESC(PL_op));
4398         else
4399             Perl_croak(aTHX_ "Bizarre copy of %s", type);
4400         }
4401         NOT_REACHED; /* NOTREACHED */
4402
4403     case SVt_REGEXP:
4404       upgregexp:
4405         if (dtype < SVt_REGEXP)
4406         {
4407             if (dtype >= SVt_PV) {
4408                 SvPV_free(dstr);
4409                 SvPV_set(dstr, 0);
4410                 SvLEN_set(dstr, 0);
4411                 SvCUR_set(dstr, 0);
4412             }
4413             sv_upgrade(dstr, SVt_REGEXP);
4414         }
4415         break;
4416
4417         case SVt_INVLIST:
4418     case SVt_PVLV:
4419     case SVt_PVGV:
4420     case SVt_PVMG:
4421         if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
4422             mg_get(sstr);
4423             if (SvTYPE(sstr) != stype)
4424                 stype = SvTYPE(sstr);
4425         }
4426         if (isGV_with_GP(sstr) && dtype <= SVt_PVLV) {
4427                     glob_assign_glob(dstr, sstr, dtype);
4428                     return;
4429         }
4430         if (stype == SVt_PVLV)
4431         {
4432             if (isREGEXP(sstr)) goto upgregexp;
4433             SvUPGRADE(dstr, SVt_PVNV);
4434         }
4435         else
4436             SvUPGRADE(dstr, (svtype)stype);
4437     }
4438  end_of_first_switch:
4439
4440     /* dstr may have been upgraded.  */
4441     dtype = SvTYPE(dstr);
4442     sflags = SvFLAGS(sstr);
4443
4444     if (UNLIKELY( dtype == SVt_PVCV )) {
4445         /* Assigning to a subroutine sets the prototype.  */
4446         if (SvOK(sstr)) {
4447             STRLEN len;
4448             const char *const ptr = SvPV_const(sstr, len);
4449
4450             SvGROW(dstr, len + 1);
4451             Copy(ptr, SvPVX(dstr), len + 1, char);
4452             SvCUR_set(dstr, len);
4453             SvPOK_only(dstr);
4454             SvFLAGS(dstr) |= sflags & SVf_UTF8;
4455             CvAUTOLOAD_off(dstr);
4456         } else {
4457             SvOK_off(dstr);
4458         }
4459     }
4460     else if (UNLIKELY(dtype == SVt_PVAV || dtype == SVt_PVHV
4461              || dtype == SVt_PVFM))
4462     {
4463         const char * const type = sv_reftype(dstr,0);
4464         if (PL_op)
4465             /* diag_listed_as: Cannot copy to %s */
4466             Perl_croak(aTHX_ "Cannot copy to %s in %s", type, OP_DESC(PL_op));
4467         else
4468             Perl_croak(aTHX_ "Cannot copy to %s", type);
4469     } else if (sflags & SVf_ROK) {
4470         if (isGV_with_GP(dstr)
4471             && SvTYPE(SvRV(sstr)) == SVt_PVGV && isGV_with_GP(SvRV(sstr))) {
4472             sstr = SvRV(sstr);
4473             if (sstr == dstr) {
4474                 if (GvIMPORTED(dstr) != GVf_IMPORTED
4475                     && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4476                 {
4477                     GvIMPORTED_on(dstr);
4478                 }
4479                 GvMULTI_on(dstr);
4480                 return;
4481             }
4482             glob_assign_glob(dstr, sstr, dtype);
4483             return;
4484         }
4485
4486         if (dtype >= SVt_PV) {
4487             if (isGV_with_GP(dstr)) {
4488                 gv_setref(dstr, sstr);
4489                 return;
4490             }
4491             if (SvPVX_const(dstr)) {
4492                 SvPV_free(dstr);
4493                 SvLEN_set(dstr, 0);
4494                 SvCUR_set(dstr, 0);
4495             }
4496         }
4497         (void)SvOK_off(dstr);
4498         SvRV_set(dstr, SvREFCNT_inc(SvRV(sstr)));
4499         SvFLAGS(dstr) |= sflags & SVf_ROK;
4500         assert(!(sflags & SVp_NOK));
4501         assert(!(sflags & SVp_IOK));
4502         assert(!(sflags & SVf_NOK));
4503         assert(!(sflags & SVf_IOK));
4504     }
4505     else if (isGV_with_GP(dstr)) {
4506         if (!(sflags & SVf_OK)) {
4507             Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
4508                            "Undefined value assigned to typeglob");
4509         }
4510         else {
4511             GV *gv = gv_fetchsv_nomg(sstr, GV_ADD, SVt_PVGV);
4512             if (dstr != (const SV *)gv) {
4513                 const char * const name = GvNAME((const GV *)dstr);
4514                 const STRLEN len = GvNAMELEN(dstr);
4515                 HV *old_stash = NULL;
4516                 bool reset_isa = FALSE;
4517                 if ((len > 1 && name[len-2] == ':' && name[len-1] == ':')
4518                  || (len == 1 && name[0] == ':')) {
4519                     /* Set aside the old stash, so we can reset isa caches
4520                        on its subclasses. */
4521                     if((old_stash = GvHV(dstr))) {
4522                         /* Make sure we do not lose it early. */
4523                         SvREFCNT_inc_simple_void_NN(
4524                          sv_2mortal((SV *)old_stash)
4525                         );
4526                     }
4527                     reset_isa = TRUE;
4528                 }
4529
4530                 if (GvGP(dstr)) {
4531                     SvREFCNT_inc_simple_void_NN(sv_2mortal(dstr));
4532                     gp_free(MUTABLE_GV(dstr));
4533                 }
4534                 GvGP_set(dstr, gp_ref(GvGP(gv)));
4535
4536                 if (reset_isa) {
4537                     HV * const stash = GvHV(dstr);
4538                     if(
4539                         old_stash ? (HV *)HvENAME_get(old_stash) : stash
4540                     )
4541                         mro_package_moved(
4542                          stash, old_stash,
4543                          (GV *)dstr, 0
4544                         );
4545                 }
4546             }
4547         }
4548     }
4549     else if ((dtype == SVt_REGEXP || dtype == SVt_PVLV)
4550           && (stype == SVt_REGEXP || isREGEXP(sstr))) {
4551         reg_temp_copy((REGEXP*)dstr, (REGEXP*)sstr);
4552     }
4553     else if (sflags & SVp_POK) {
4554         const STRLEN cur = SvCUR(sstr);
4555         const STRLEN len = SvLEN(sstr);
4556
4557         /*
4558          * We have three basic ways to copy the string:
4559          *
4560          *  1. Swipe
4561          *  2. Copy-on-write
4562          *  3. Actual copy
4563          * 
4564          * Which we choose is based on various factors.  The following
4565          * things are listed in order of speed, fastest to slowest:
4566          *  - Swipe
4567          *  - Copying a short string
4568          *  - Copy-on-write bookkeeping
4569          *  - malloc
4570          *  - Copying a long string
4571          * 
4572          * We swipe the string (steal the string buffer) if the SV on the
4573          * rhs is about to be freed anyway (TEMP and refcnt==1).  This is a
4574          * big win on long strings.  It should be a win on short strings if
4575          * SvPVX_const(dstr) has to be allocated.  If not, it should not 
4576          * slow things down, as SvPVX_const(sstr) would have been freed
4577          * soon anyway.
4578          * 
4579          * We also steal the buffer from a PADTMP (operator target) if it
4580          * is â€˜long enough’.  For short strings, a swipe does not help
4581          * here, as it causes more malloc calls the next time the target
4582          * is used.  Benchmarks show that even if SvPVX_const(dstr) has to
4583          * be allocated it is still not worth swiping PADTMPs for short
4584          * strings, as the savings here are small.
4585          * 
4586          * If swiping is not an option, then we see whether it is
4587          * worth using copy-on-write.  If the lhs already has a buf-
4588          * fer big enough and the string is short, we skip it and fall back
4589          * to method 3, since memcpy is faster for short strings than the
4590          * later bookkeeping overhead that copy-on-write entails.
4591
4592          * If the rhs is not a copy-on-write string yet, then we also
4593          * consider whether the buffer is too large relative to the string
4594          * it holds.  Some operations such as readline allocate a large
4595          * buffer in the expectation of reusing it.  But turning such into
4596          * a COW buffer is counter-productive because it increases memory
4597          * usage by making readline allocate a new large buffer the sec-
4598          * ond time round.  So, if the buffer is too large, again, we use
4599          * method 3 (copy).
4600          * 
4601          * Finally, if there is no buffer on the left, or the buffer is too 
4602          * small, then we use copy-on-write and make both SVs share the
4603          * string buffer.
4604          *
4605          */
4606
4607         /* Whichever path we take through the next code, we want this true,
4608            and doing it now facilitates the COW check.  */
4609         (void)SvPOK_only(dstr);
4610
4611         if (
4612                  (              /* Either ... */
4613                                 /* slated for free anyway (and not COW)? */
4614                     (sflags & (SVs_TEMP|SVf_IsCOW)) == SVs_TEMP
4615                                 /* or a swipable TARG */
4616                  || ((sflags &
4617                            (SVs_PADTMP|SVf_READONLY|SVf_PROTECT|SVf_IsCOW))
4618                        == SVs_PADTMP
4619                                 /* whose buffer is worth stealing */
4620                      && CHECK_COWBUF_THRESHOLD(cur,len)
4621                     )
4622                  ) &&
4623                  !(sflags & SVf_OOK) &&   /* and not involved in OOK hack? */
4624                  (!(flags & SV_NOSTEAL)) &&
4625                                         /* and we're allowed to steal temps */
4626                  SvREFCNT(sstr) == 1 &&   /* and no other references to it? */
4627                  len)             /* and really is a string */
4628         {       /* Passes the swipe test.  */
4629             if (SvPVX_const(dstr))      /* we know that dtype >= SVt_PV */
4630                 SvPV_free(dstr);
4631             SvPV_set(dstr, SvPVX_mutable(sstr));
4632             SvLEN_set(dstr, SvLEN(sstr));
4633             SvCUR_set(dstr, SvCUR(sstr));
4634
4635             SvTEMP_off(dstr);
4636             (void)SvOK_off(sstr);       /* NOTE: nukes most SvFLAGS on sstr */
4637             SvPV_set(sstr, NULL);
4638             SvLEN_set(sstr, 0);
4639             SvCUR_set(sstr, 0);
4640             SvTEMP_off(sstr);
4641         }
4642         else if (flags & SV_COW_SHARED_HASH_KEYS
4643               &&
4644 #ifdef PERL_OLD_COPY_ON_WRITE
4645                  (  sflags & SVf_IsCOW
4646                  || (   (sflags & CAN_COW_MASK) == CAN_COW_FLAGS
4647                      && (SvFLAGS(dstr) & CAN_COW_MASK) == CAN_COW_FLAGS
4648                      && SvTYPE(sstr) >= SVt_PVIV && len
4649                     )
4650                  )
4651 #elif defined(PERL_NEW_COPY_ON_WRITE)
4652                  (sflags & SVf_IsCOW
4653                    ? (!len ||
4654                        (  (CHECK_COWBUF_THRESHOLD(cur,len) || SvLEN(dstr) < cur+1)
4655                           /* If this is a regular (non-hek) COW, only so
4656                              many COW "copies" are possible. */
4657                        && CowREFCNT(sstr) != SV_COW_REFCNT_MAX  ))
4658                    : (  (sflags & CAN_COW_MASK) == CAN_COW_FLAGS
4659                      && !(SvFLAGS(dstr) & SVf_BREAK)
4660                      && CHECK_COW_THRESHOLD(cur,len) && cur+1 < len
4661                      && (CHECK_COWBUF_THRESHOLD(cur,len) || SvLEN(dstr) < cur+1)
4662                     ))
4663 #else
4664                  sflags & SVf_IsCOW
4665               && !(SvFLAGS(dstr) & SVf_BREAK)
4666 #endif
4667             ) {
4668             /* Either it's a shared hash key, or it's suitable for
4669                copy-on-write.  */
4670             if (DEBUG_C_TEST) {
4671                 PerlIO_printf(Perl_debug_log, "Copy on write: sstr --> dstr\n");
4672                 sv_dump(sstr);
4673                 sv_dump(dstr);
4674             }
4675 #ifdef PERL_ANY_COW
4676             if (!(sflags & SVf_IsCOW)) {
4677                     SvIsCOW_on(sstr);
4678 # ifdef PERL_OLD_COPY_ON_WRITE
4679                     /* Make the source SV into a loop of 1.
4680                        (about to become 2) */
4681                     SV_COW_NEXT_SV_SET(sstr, sstr);
4682 # else
4683                     CowREFCNT(sstr) = 0;
4684 # endif
4685             }
4686 #endif
4687             if (SvPVX_const(dstr)) {    /* we know that dtype >= SVt_PV */
4688                 SvPV_free(dstr);
4689             }
4690
4691 #ifdef PERL_ANY_COW
4692             if (len) {
4693 # ifdef PERL_OLD_COPY_ON_WRITE
4694                     assert (SvTYPE(dstr) >= SVt_PVIV);
4695                     /* SvIsCOW_normal */
4696                     /* splice us in between source and next-after-source.  */
4697                     SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4698                     SV_COW_NEXT_SV_SET(sstr, dstr);
4699 # else
4700                     if (sflags & SVf_IsCOW) {
4701                         sv_buf_to_rw(sstr);
4702                     }
4703                     CowREFCNT(sstr)++;
4704 # endif
4705                     SvPV_set(dstr, SvPVX_mutable(sstr));
4706                     sv_buf_to_ro(sstr);
4707             } else
4708 #endif
4709             {
4710                     /* SvIsCOW_shared_hash */
4711                     DEBUG_C(PerlIO_printf(Perl_debug_log,
4712                                           "Copy on write: Sharing hash\n"));
4713
4714                     assert (SvTYPE(dstr) >= SVt_PV);
4715                     SvPV_set(dstr,
4716                              HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)))));
4717             }
4718             SvLEN_set(dstr, len);
4719             SvCUR_set(dstr, cur);
4720             SvIsCOW_on(dstr);
4721         } else {
4722             /* Failed the swipe test, and we cannot do copy-on-write either.
4723                Have to copy the string.  */
4724             SvGROW(dstr, cur + 1);      /* inlined from sv_setpvn */
4725             Move(SvPVX_const(sstr),SvPVX(dstr),cur,char);
4726             SvCUR_set(dstr, cur);
4727             *SvEND(dstr) = '\0';
4728         }
4729         if (sflags & SVp_NOK) {
4730             SvNV_set(dstr, SvNVX(sstr));
4731         }
4732         if (sflags & SVp_IOK) {
4733             SvIV_set(dstr, SvIVX(sstr));
4734             /* Must do this otherwise some other overloaded use of 0x80000000
4735                gets confused. I guess SVpbm_VALID */
4736             if (sflags & SVf_IVisUV)
4737                 SvIsUV_on(dstr);
4738         }
4739         SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_NOK|SVp_NOK|SVf_UTF8);
4740         {
4741             const MAGIC * const smg = SvVSTRING_mg(sstr);
4742             if (smg) {
4743                 sv_magic(dstr, NULL, PERL_MAGIC_vstring,
4744                          smg->mg_ptr, smg->mg_len);
4745                 SvRMAGICAL_on(dstr);
4746             }
4747         }
4748     }
4749     else if (sflags & (SVp_IOK|SVp_NOK)) {
4750         (void)SvOK_off(dstr);
4751         SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_IVisUV|SVf_NOK|SVp_NOK);
4752         if (sflags & SVp_IOK) {
4753             /* XXXX Do we want to set IsUV for IV(ROK)?  Be extra safe... */
4754             SvIV_set(dstr, SvIVX(sstr));
4755         }
4756         if (sflags & SVp_NOK) {
4757             SvNV_set(dstr, SvNVX(sstr));
4758         }
4759     }
4760     else {
4761         if (isGV_with_GP(sstr)) {
4762             gv_efullname3(dstr, MUTABLE_GV(sstr), "*");
4763         }
4764         else
4765             (void)SvOK_off(dstr);
4766     }
4767     if (SvTAINTED(sstr))
4768         SvTAINT(dstr);
4769 }
4770
4771 /*
4772 =for apidoc sv_setsv_mg
4773
4774 Like C<sv_setsv>, but also handles 'set' magic.
4775
4776 =cut
4777 */
4778
4779 void
4780 Perl_sv_setsv_mg(pTHX_ SV *const dstr, SV *const sstr)
4781 {
4782     PERL_ARGS_ASSERT_SV_SETSV_MG;
4783
4784     sv_setsv(dstr,sstr);
4785     SvSETMAGIC(dstr);
4786 }
4787
4788 #ifdef PERL_ANY_COW
4789 # ifdef PERL_OLD_COPY_ON_WRITE
4790 #  define SVt_COW SVt_PVIV
4791 # else
4792 #  define SVt_COW SVt_PV
4793 # endif
4794 SV *
4795 Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
4796 {
4797     STRLEN cur = SvCUR(sstr);
4798     STRLEN len = SvLEN(sstr);
4799     char *new_pv;
4800 #if defined(PERL_DEBUG_READONLY_COW) && defined(PERL_NEW_COPY_ON_WRITE)
4801     const bool already = cBOOL(SvIsCOW(sstr));
4802 #endif
4803
4804     PERL_ARGS_ASSERT_SV_SETSV_COW;
4805
4806     if (DEBUG_C_TEST) {
4807         PerlIO_printf(Perl_debug_log, "Fast copy on write: %p -> %p\n",
4808                       (void*)sstr, (void*)dstr);
4809         sv_dump(sstr);
4810         if (dstr)
4811                     sv_dump(dstr);
4812     }
4813
4814     if (dstr) {
4815         if (SvTHINKFIRST(dstr))
4816             sv_force_normal_flags(dstr, SV_COW_DROP_PV);
4817         else if (SvPVX_const(dstr))
4818             Safefree(SvPVX_mutable(dstr));
4819     }
4820     else
4821         new_SV(dstr);
4822     SvUPGRADE(dstr, SVt_COW);
4823
4824     assert (SvPOK(sstr));
4825     assert (SvPOKp(sstr));
4826 # ifdef PERL_OLD_COPY_ON_WRITE
4827     assert (!SvIOK(sstr));
4828     assert (!SvIOKp(sstr));
4829     assert (!SvNOK(sstr));
4830     assert (!SvNOKp(sstr));
4831 # endif
4832
4833     if (SvIsCOW(sstr)) {
4834
4835         if (SvLEN(sstr) == 0) {
4836             /* source is a COW shared hash key.  */
4837             DEBUG_C(PerlIO_printf(Perl_debug_log,
4838                                   "Fast copy on write: Sharing hash\n"));
4839             new_pv = HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr))));
4840             goto common_exit;
4841         }
4842 # ifdef PERL_OLD_COPY_ON_WRITE
4843         SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4844 # else
4845         assert(SvCUR(sstr)+1 < SvLEN(sstr));
4846         assert(CowREFCNT(sstr) < SV_COW_REFCNT_MAX);
4847 # endif
4848     } else {
4849         assert ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS);
4850         SvUPGRADE(sstr, SVt_COW);
4851         SvIsCOW_on(sstr);
4852         DEBUG_C(PerlIO_printf(Perl_debug_log,
4853                               "Fast copy on write: Converting sstr to COW\n"));
4854 # ifdef PERL_OLD_COPY_ON_WRITE
4855         SV_COW_NEXT_SV_SET(dstr, sstr);
4856 # else
4857         CowREFCNT(sstr) = 0;    
4858 # endif
4859     }
4860 # ifdef PERL_OLD_COPY_ON_WRITE
4861     SV_COW_NEXT_SV_SET(sstr, dstr);
4862 # else
4863 #  ifdef PERL_DEBUG_READONLY_COW
4864     if (already) sv_buf_to_rw(sstr);
4865 #  endif
4866     CowREFCNT(sstr)++;  
4867 # endif
4868     new_pv = SvPVX_mutable(sstr);
4869     sv_buf_to_ro(sstr);
4870
4871   common_exit:
4872     SvPV_set(dstr, new_pv);
4873     SvFLAGS(dstr) = (SVt_COW|SVf_POK|SVp_POK|SVf_IsCOW);
4874     if (SvUTF8(sstr))
4875         SvUTF8_on(dstr);
4876     SvLEN_set(dstr, len);
4877     SvCUR_set(dstr, cur);
4878     if (DEBUG_C_TEST) {
4879         sv_dump(dstr);
4880     }
4881     return dstr;
4882 }
4883 #endif
4884
4885 /*
4886 =for apidoc sv_setpvn
4887
4888 Copies a string (possibly containing embedded C<NUL> characters) into an SV.
4889 The C<len> parameter indicates the number of
4890 bytes to be copied.  If the C<ptr> argument is NULL the SV will become
4891 undefined.  Does not handle 'set' magic.  See C<sv_setpvn_mg>.
4892
4893 =cut
4894 */
4895
4896 void
4897 Perl_sv_setpvn(pTHX_ SV *const sv, const char *const ptr, const STRLEN len)
4898 {
4899     char *dptr;
4900
4901     PERL_ARGS_ASSERT_SV_SETPVN;
4902
4903     SV_CHECK_THINKFIRST_COW_DROP(sv);
4904     if (!ptr) {
4905         (void)SvOK_off(sv);
4906         return;
4907     }
4908     else {
4909         /* len is STRLEN which is unsigned, need to copy to signed */
4910         const IV iv = len;
4911         if (iv < 0)
4912             Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen %"
4913                        IVdf, iv);
4914     }
4915     SvUPGRADE(sv, SVt_PV);
4916
4917     dptr = SvGROW(sv, len + 1);
4918     Move(ptr,dptr,len,char);
4919     dptr[len] = '\0';
4920     SvCUR_set(sv, len);
4921     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4922     SvTAINT(sv);
4923     if (SvTYPE(sv) == SVt_PVCV) CvAUTOLOAD_off(sv);
4924 }
4925
4926 /*
4927 =for apidoc sv_setpvn_mg
4928
4929 Like C<sv_setpvn>, but also handles 'set' magic.
4930
4931 =cut
4932 */
4933
4934 void
4935 Perl_sv_setpvn_mg(pTHX_ SV *const sv, const char *const ptr, const STRLEN len)
4936 {
4937     PERL_ARGS_ASSERT_SV_SETPVN_MG;
4938
4939     sv_setpvn(sv,ptr,len);
4940     SvSETMAGIC(sv);
4941 }
4942
4943 /*
4944 =for apidoc sv_setpv
4945
4946 Copies a string into an SV.  The string must be terminated with a C<NUL>
4947 character.
4948 Does not handle 'set' magic.  See C<sv_setpv_mg>.
4949
4950 =cut
4951 */
4952
4953 void
4954 Perl_sv_setpv(pTHX_ SV *const sv, const char *const ptr)
4955 {
4956     STRLEN len;
4957
4958     PERL_ARGS_ASSERT_SV_SETPV;
4959
4960     SV_CHECK_THINKFIRST_COW_DROP(sv);
4961     if (!ptr) {
4962         (void)SvOK_off(sv);
4963         return;
4964     }
4965     len = strlen(ptr);
4966     SvUPGRADE(sv, SVt_PV);
4967
4968     SvGROW(sv, len + 1);
4969     Move(ptr,SvPVX(sv),len+1,char);
4970     SvCUR_set(sv, len);
4971     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4972     SvTAINT(sv);
4973     if (SvTYPE(sv) == SVt_PVCV) CvAUTOLOAD_off(sv);
4974 }
4975
4976 /*
4977 =for apidoc sv_setpv_mg
4978
4979 Like C<sv_setpv>, but also handles 'set' magic.
4980
4981 =cut
4982 */
4983
4984 void
4985 Perl_sv_setpv_mg(pTHX_ SV *const sv, const char *const ptr)
4986 {
4987     PERL_ARGS_ASSERT_SV_SETPV_MG;
4988
4989     sv_setpv(sv,ptr);
4990     SvSETMAGIC(sv);
4991 }
4992
4993 void
4994 Perl_sv_sethek(pTHX_ SV *const sv, const HEK *const hek)
4995 {
4996     PERL_ARGS_ASSERT_SV_SETHEK;
4997
4998     if (!hek) {
4999         return;
5000     }
5001
5002     if (HEK_LEN(hek) == HEf_SVKEY) {
5003         sv_setsv(sv, *(SV**)HEK_KEY(hek));
5004         return;
5005     } else {
5006         const int flags = HEK_FLAGS(hek);
5007         if (flags & HVhek_WASUTF8) {
5008             STRLEN utf8_len = HEK_LEN(hek);
5009             char *as_utf8 = (char *)bytes_to_utf8((U8*)HEK_KEY(hek), &utf8_len);
5010             sv_usepvn_flags(sv, as_utf8, utf8_len, SV_HAS_TRAILING_NUL);
5011             SvUTF8_on(sv);
5012             return;
5013         } else if (flags & HVhek_UNSHARED) {
5014             sv_setpvn(sv, HEK_KEY(hek), HEK_LEN(hek));
5015             if (HEK_UTF8(hek))
5016                 SvUTF8_on(sv);
5017             else SvUTF8_off(sv);
5018             return;
5019         }
5020         {
5021             SV_CHECK_THINKFIRST_COW_DROP(sv);
5022             SvUPGRADE(sv, SVt_PV);
5023             SvPV_free(sv);
5024             SvPV_set(sv,(char *)HEK_KEY(share_hek_hek(hek)));
5025             SvCUR_set(sv, HEK_LEN(hek));
5026             SvLEN_set(sv, 0);
5027             SvIsCOW_on(sv);
5028             SvPOK_on(sv);
5029             if (HEK_UTF8(hek))
5030                 SvUTF8_on(sv);
5031             else SvUTF8_off(sv);
5032             return;
5033         }
5034     }
5035 }
5036
5037
5038 /*
5039 =for apidoc sv_usepvn_flags
5040
5041 Tells an SV to use C<ptr> to find its string value.  Normally the
5042 string is stored inside the SV, but sv_usepvn allows the SV to use an
5043 outside string.  The C<ptr> should point to memory that was allocated
5044 by L<Newx|perlclib/Memory Management and String Handling>.  It must be
5045 the start of a Newx-ed block of memory, and not a pointer to the
5046 middle of it (beware of L<OOK|perlguts/Offsets> and copy-on-write),
5047 and not be from a non-Newx memory allocator like C<malloc>.  The
5048 string length, C<len>, must be supplied.  By default this function
5049 will C<Renew> (i.e. realloc, move) the memory pointed to by C<ptr>,
5050 so that pointer should not be freed or used by the programmer after
5051 giving it to sv_usepvn, and neither should any pointers from "behind"
5052 that pointer (e.g. ptr + 1) be used.
5053
5054 If C<flags> & SV_SMAGIC is true, will call SvSETMAGIC.  If C<flags> &
5055 SV_HAS_TRAILING_NUL is true, then C<ptr[len]> must be C<NUL>, and the realloc
5056 will be skipped (i.e. the buffer is actually at least 1 byte longer than
5057 C<len>, and already meets the requirements for storing in C<SvPVX>).
5058
5059 =cut
5060 */
5061
5062 void
5063 Perl_sv_usepvn_flags(pTHX_ SV *const sv, char *ptr, const STRLEN len, const U32 flags)
5064 {
5065     STRLEN allocate;
5066
5067     PERL_ARGS_ASSERT_SV_USEPVN_FLAGS;
5068
5069     SV_CHECK_THINKFIRST_COW_DROP(sv);
5070     SvUPGRADE(sv, SVt_PV);
5071     if (!ptr) {
5072         (void)SvOK_off(sv);
5073         if (flags & SV_SMAGIC)
5074             SvSETMAGIC(sv);
5075         return;
5076     }
5077     if (SvPVX_const(sv))
5078         SvPV_free(sv);
5079
5080 #ifdef DEBUGGING
5081     if (flags & SV_HAS_TRAILING_NUL)
5082         assert(ptr[len] == '\0');
5083 #endif
5084
5085     allocate = (flags & SV_HAS_TRAILING_NUL)
5086         ? len + 1 :
5087 #ifdef Perl_safesysmalloc_size
5088         len + 1;
5089 #else 
5090         PERL_STRLEN_ROUNDUP(len + 1);
5091 #endif
5092     if (flags & SV_HAS_TRAILING_NUL) {
5093         /* It's long enough - do nothing.
5094            Specifically Perl_newCONSTSUB is relying on this.  */
5095     } else {
5096 #ifdef DEBUGGING
5097         /* Force a move to shake out bugs in callers.  */
5098         char *new_ptr = (char*)safemalloc(allocate);
5099         Copy(ptr, new_ptr, len, char);
5100         PoisonFree(ptr,len,char);
5101         Safefree(ptr);
5102         ptr = new_ptr;
5103 #else
5104         ptr = (char*) saferealloc (ptr, allocate);
5105 #endif
5106     }
5107 #ifdef Perl_safesysmalloc_size
5108     SvLEN_set(sv, Perl_safesysmalloc_size(ptr));
5109 #else
5110     SvLEN_set(sv, allocate);
5111 #endif
5112     SvCUR_set(sv, len);
5113     SvPV_set(sv, ptr);
5114     if (!(flags & SV_HAS_TRAILING_NUL)) {
5115         ptr[len] = '\0';
5116     }
5117     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
5118     SvTAINT(sv);
5119     if (flags & SV_SMAGIC)
5120         SvSETMAGIC(sv);
5121 }
5122
5123 #ifdef PERL_OLD_COPY_ON_WRITE
5124 /* Need to do this *after* making the SV normal, as we need the buffer
5125    pointer to remain valid until after we've copied it.  If we let go too early,
5126    another thread could invalidate it by unsharing last of the same hash key
5127    (which it can do by means other than releasing copy-on-write Svs)
5128    or by changing the other copy-on-write SVs in the loop.  */
5129 STATIC void
5130 S_sv_release_COW(pTHX_ SV *sv, const char *pvx, SV *after)
5131 {
5132     PERL_ARGS_ASSERT_SV_RELEASE_COW;
5133
5134     { /* this SV was SvIsCOW_normal(sv) */
5135          /* we need to find the SV pointing to us.  */
5136         SV *current = SV_COW_NEXT_SV(after);
5137
5138         if (current == sv) {
5139             /* The SV we point to points back to us (there were only two of us
5140                in the loop.)
5141                Hence other SV is no longer copy on write either.  */
5142             SvIsCOW_off(after);
5143             sv_buf_to_rw(after);
5144         } else {
5145             /* We need to follow the pointers around the loop.  */
5146             SV *next;
5147             while ((next = SV_COW_NEXT_SV(current)) != sv) {
5148                 assert (next);
5149                 current = next;
5150                  /* don't loop forever if the structure is bust, and we have
5151                     a pointer into a closed loop.  */
5152                 assert (current != after);
5153                 assert (SvPVX_const(current) == pvx);
5154             }
5155             /* Make the SV before us point to the SV after us.  */
5156             SV_COW_NEXT_SV_SET(current, after);
5157         }
5158     }
5159 }
5160 #endif
5161 /*
5162 =for apidoc sv_force_normal_flags
5163
5164 Undo various types of fakery on an SV, where fakery means
5165 "more than" a string: if the PV is a shared string, make
5166 a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
5167 an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
5168 we do the copy, and is also used locally; if this is a
5169 vstring, drop the vstring magic.  If C<SV_COW_DROP_PV> is set
5170 then a copy-on-write scalar drops its PV buffer (if any) and becomes
5171 SvPOK_off rather than making a copy.  (Used where this
5172 scalar is about to be set to some other value.)  In addition,
5173 the C<flags> parameter gets passed to C<sv_unref_flags()>
5174 when unreffing.  C<sv_force_normal> calls this function
5175 with flags set to 0.
5176
5177 This function is expected to be used to signal to perl that this SV is
5178 about to be written to, and any extra book-keeping needs to be taken care
5179 of.  Hence, it croaks on read-only values.
5180
5181 =cut
5182 */
5183
5184 static void
5185 S_sv_uncow(pTHX_ SV * const sv, const U32 flags)
5186 {
5187     assert(SvIsCOW(sv));
5188     {
5189 #ifdef PERL_ANY_COW
5190         const char * const pvx = SvPVX_const(sv);
5191         const STRLEN len = SvLEN(sv);
5192         const STRLEN cur = SvCUR(sv);
5193 # ifdef PERL_OLD_COPY_ON_WRITE
5194         /* next COW sv in the loop.  If len is 0 then this is a shared-hash
5195            key scalar, so we mustn't attempt to call SV_COW_NEXT_SV(), as
5196            we'll fail an assertion.  */
5197         SV * const next = len ? SV_COW_NEXT_SV(sv) : 0;
5198 # endif
5199
5200         if (DEBUG_C_TEST) {
5201                 PerlIO_printf(Perl_debug_log,
5202                               "Copy on write: Force normal %ld\n",
5203                               (long) flags);
5204                 sv_dump(sv);
5205         }
5206         SvIsCOW_off(sv);
5207 # ifdef PERL_NEW_COPY_ON_WRITE
5208         if (len) {
5209             /* Must do this first, since the CowREFCNT uses SvPVX and
5210             we need to write to CowREFCNT, or de-RO the whole buffer if we are
5211             the only owner left of the buffer. */
5212             sv_buf_to_rw(sv); /* NOOP if RO-ing not supported */
5213             {
5214                 U8 cowrefcnt = CowREFCNT(sv);
5215                 if(cowrefcnt != 0) {
5216                     cowrefcnt--;
5217                     CowREFCNT(sv) = cowrefcnt;
5218                     sv_buf_to_ro(sv);
5219                     goto copy_over;
5220                 }
5221             }
5222             /* Else we are the only owner of the buffer. */
5223         }
5224         else
5225 # endif
5226         {
5227             /* This SV doesn't own the buffer, so need to Newx() a new one:  */
5228             copy_over:
5229             SvPV_set(sv, NULL);
5230             SvCUR_set(sv, 0);
5231             SvLEN_set(sv, 0);
5232             if (flags & SV_COW_DROP_PV) {
5233                 /* OK, so we don't need to copy our buffer.  */
5234                 SvPOK_off(sv);
5235             } else {
5236                 SvGROW(sv, cur + 1);
5237                 Move(pvx,SvPVX(sv),cur,char);
5238                 SvCUR_set(sv, cur);
5239                 *SvEND(sv) = '\0';
5240             }
5241             if (len) {
5242 # ifdef PERL_OLD_COPY_ON_WRITE
5243                 sv_release_COW(sv, pvx, next);
5244 # endif
5245             } else {
5246                 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
5247             }
5248             if (DEBUG_C_TEST) {
5249                 sv_dump(sv);
5250             }
5251         }
5252 #else
5253             const char * const pvx = SvPVX_const(sv);
5254             const STRLEN len = SvCUR(sv);
5255             SvIsCOW_off(sv);
5256             SvPV_set(sv, NULL);
5257             SvLEN_set(sv, 0);
5258             if (flags & SV_COW_DROP_PV) {
5259                 /* OK, so we don't need to copy our buffer.  */
5260                 SvPOK_off(sv);
5261             } else {
5262                 SvGROW(sv, len + 1);
5263                 Move(pvx,SvPVX(sv),len,char);
5264                 *SvEND(sv) = '\0';
5265             }
5266             unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
5267 #endif
5268     }
5269 }
5270
5271 void
5272 Perl_sv_force_normal_flags(pTHX_ SV *const sv, const U32 flags)
5273 {
5274     PERL_ARGS_ASSERT_SV_FORCE_NORMAL_FLAGS;
5275
5276     if (SvREADONLY(sv))
5277         Perl_croak_no_modify();
5278     else if (SvIsCOW(sv) && LIKELY(SvTYPE(sv) != SVt_PVHV))
5279         S_sv_uncow(aTHX_ sv, flags);
5280     if (SvROK(sv))
5281         sv_unref_flags(sv, flags);
5282     else if (SvFAKE(sv) && isGV_with_GP(sv))
5283         sv_unglob(sv, flags);
5284     else if (SvFAKE(sv) && isREGEXP(sv)) {
5285         /* Need to downgrade the REGEXP to a simple(r) scalar. This is analogous
5286            to sv_unglob. We only need it here, so inline it.  */
5287         const bool islv = SvTYPE(sv) == SVt_PVLV;
5288         const svtype new_type =
5289           islv ? SVt_NULL : SvMAGIC(sv) || SvSTASH(sv) ? SVt_PVMG : SVt_PV;
5290         SV *const temp = newSV_type(new_type);
5291         regexp *const temp_p = ReANY((REGEXP *)sv);
5292
5293         if (new_type == SVt_PVMG) {
5294             SvMAGIC_set(temp, SvMAGIC(sv));
5295             SvMAGIC_set(sv, NULL);
5296             SvSTASH_set(temp, SvSTASH(sv));
5297             SvSTASH_set(sv, NULL);
5298         }
5299         if (!islv) SvCUR_set(temp, SvCUR(sv));
5300         /* Remember that SvPVX is in the head, not the body.  But
5301            RX_WRAPPED is in the body. */
5302         assert(ReANY((REGEXP *)sv)->mother_re);
5303         /* Their buffer is already owned by someone else. */
5304         if (flags & SV_COW_DROP_PV) {
5305             /* SvLEN is already 0.  For SVt_REGEXP, we have a brand new
5306                zeroed body.  For SVt_PVLV, it should have been set to 0
5307                before turning into a regexp. */
5308             assert(!SvLEN(islv ? sv : temp));
5309             sv->sv_u.svu_pv = 0;
5310         }
5311         else {
5312             sv->sv_u.svu_pv = savepvn(RX_WRAPPED((REGEXP *)sv), SvCUR(sv));
5313             SvLEN_set(islv ? sv : temp, SvCUR(sv)+1);
5314             SvPOK_on(sv);
5315         }
5316
5317         /* Now swap the rest of the bodies. */
5318
5319         SvFAKE_off(sv);
5320         if (!islv) {
5321             SvFLAGS(sv) &= ~SVTYPEMASK;
5322             SvFLAGS(sv) |= new_type;
5323             SvANY(sv) = SvANY(temp);
5324         }
5325
5326         SvFLAGS(temp) &= ~(SVTYPEMASK);
5327         SvFLAGS(temp) |= SVt_REGEXP|SVf_FAKE;
5328         SvANY(temp) = temp_p;
5329         temp->sv_u.svu_rx = (regexp *)temp_p;
5330
5331         SvREFCNT_dec_NN(temp);
5332     }
5333     else if (SvVOK(sv)) sv_unmagic(sv, PERL_MAGIC_vstring);
5334 }
5335
5336 /*
5337 =for apidoc sv_chop
5338
5339 Efficient removal of characters from the beginning of the string buffer.
5340 SvPOK(sv), or at least SvPOKp(sv), must be true and the C<ptr> must be a
5341 pointer to somewhere inside the string buffer.  The C<ptr> becomes the first
5342 character of the adjusted string.  Uses the "OOK hack".  On return, only
5343 SvPOK(sv) and SvPOKp(sv) among the OK flags will be true.
5344
5345 Beware: after this function returns, C<ptr> and SvPVX_const(sv) may no longer
5346 refer to the same chunk of data.
5347
5348 The unfortunate similarity of this function's name to that of Perl's C<chop>
5349 operator is strictly coincidental.  This function works from the left;
5350 C<chop> works from the right.
5351
5352 =cut
5353 */
5354
5355 void
5356 Perl_sv_chop(pTHX_ SV *const sv, const char *const ptr)
5357 {
5358     STRLEN delta;
5359     STRLEN old_delta;
5360     U8 *p;
5361 #ifdef DEBUGGING
5362     const U8 *evacp;
5363     STRLEN evacn;
5364 #endif
5365     STRLEN max_delta;
5366
5367     PERL_ARGS_ASSERT_SV_CHOP;
5368
5369     if (!ptr || !SvPOKp(sv))
5370         return;
5371     delta = ptr - SvPVX_const(sv);
5372     if (!delta) {
5373         /* Nothing to do.  */
5374         return;
5375     }
5376     max_delta = SvLEN(sv) ? SvLEN(sv) : SvCUR(sv);
5377     if (delta > max_delta)
5378         Perl_croak(aTHX_ "panic: sv_chop ptr=%p, start=%p, end=%p",
5379                    ptr, SvPVX_const(sv), SvPVX_const(sv) + max_delta);
5380     /* SvPVX(sv) may move in SV_CHECK_THINKFIRST(sv), so don't use ptr any more */
5381     SV_CHECK_THINKFIRST(sv);
5382     SvPOK_only_UTF8(sv);
5383
5384     if (!SvOOK(sv)) {
5385         if (!SvLEN(sv)) { /* make copy of shared string */
5386             const char *pvx = SvPVX_const(sv);
5387             const STRLEN len = SvCUR(sv);
5388             SvGROW(sv, len + 1);
5389             Move(pvx,SvPVX(sv),len,char);
5390             *SvEND(sv) = '\0';
5391         }
5392         SvOOK_on(sv);
5393         old_delta = 0;
5394     } else {
5395         SvOOK_offset(sv, old_delta);
5396     }
5397     SvLEN_set(sv, SvLEN(sv) - delta);
5398     SvCUR_set(sv, SvCUR(sv) - delta);
5399     SvPV_set(sv, SvPVX(sv) + delta);
5400
5401     p = (U8 *)SvPVX_const(sv);
5402
5403 #ifdef DEBUGGING
5404     /* how many bytes were evacuated?  we will fill them with sentinel
5405        bytes, except for the part holding the new offset of course. */
5406     evacn = delta;
5407     if (old_delta)
5408         evacn += (old_delta < 0x100 ? 1 : 1 + sizeof(STRLEN));
5409     assert(evacn);
5410     assert(evacn <= delta + old_delta);
5411     evacp = p - evacn;
5412 #endif
5413
5414     /* This sets 'delta' to the accumulated value of all deltas so far */
5415     delta += old_delta;
5416     assert(delta);
5417
5418     /* If 'delta' fits in a byte, store it just prior to the new beginning of
5419      * the string; otherwise store a 0 byte there and store 'delta' just prior
5420      * to that, using as many bytes as a STRLEN occupies.  Thus it overwrites a
5421      * portion of the chopped part of the string */
5422     if (delta < 0x100) {
5423         *--p = (U8) delta;
5424     } else {
5425         *--p = 0;
5426         p -= sizeof(STRLEN);
5427         Copy((U8*)&delta, p, sizeof(STRLEN), U8);
5428     }
5429
5430 #ifdef DEBUGGING
5431     /* Fill the preceding buffer with sentinals to verify that no-one is
5432        using it.  */
5433     while (p > evacp) {
5434         --p;
5435         *p = (U8)PTR2UV(p);
5436     }
5437 #endif
5438 }
5439
5440 /*
5441 =for apidoc sv_catpvn
5442
5443 Concatenates the string onto the end of the string which is in the SV.  The
5444 C<len> indicates number of bytes to copy.  If the SV has the UTF-8
5445 status set, then the bytes appended should be valid UTF-8.
5446 Handles 'get' magic, but not 'set' magic.  See C<sv_catpvn_mg>.
5447
5448 =for apidoc sv_catpvn_flags
5449
5450 Concatenates the string onto the end of the string which is in the SV.  The
5451 C<len> indicates number of bytes to copy.
5452
5453 By default, the string appended is assumed to be valid UTF-8 if the SV has
5454 the UTF-8 status set, and a string of bytes otherwise.  One can force the
5455 appended string to be interpreted as UTF-8 by supplying the C<SV_CATUTF8>
5456 flag, and as bytes by supplying the C<SV_CATBYTES> flag; the SV or the
5457 string appended will be upgraded to UTF-8 if necessary.
5458
5459 If C<flags> has the C<SV_SMAGIC> bit set, will
5460 C<mg_set> on C<dsv> afterwards if appropriate.
5461 C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
5462 in terms of this function.
5463
5464 =cut
5465 */
5466
5467 void
5468 Perl_sv_catpvn_flags(pTHX_ SV *const dsv, const char *sstr, const STRLEN slen, const I32 flags)
5469 {
5470     STRLEN dlen;
5471     const char * const dstr = SvPV_force_flags(dsv, dlen, flags);
5472
5473     PERL_ARGS_ASSERT_SV_CATPVN_FLAGS;
5474     assert((flags & (SV_CATBYTES|SV_CATUTF8)) != (SV_CATBYTES|SV_CATUTF8));
5475
5476     if (!(flags & SV_CATBYTES) || !SvUTF8(dsv)) {
5477       if (flags & SV_CATUTF8 && !SvUTF8(dsv)) {
5478          sv_utf8_upgrade_flags_grow(dsv, 0, slen + 1);
5479          dlen = SvCUR(dsv);
5480       }
5481       else SvGROW(dsv, dlen + slen + 1);
5482       if (sstr == dstr)
5483         sstr = SvPVX_const(dsv);
5484       Move(sstr, SvPVX(dsv) + dlen, slen, char);
5485       SvCUR_set(dsv, SvCUR(dsv) + slen);
5486     }
5487     else {
5488         /* We inline bytes_to_utf8, to avoid an extra malloc. */
5489         const char * const send = sstr + slen;
5490         U8 *d;
5491
5492         /* Something this code does not account for, which I think is
5493            impossible; it would require the same pv to be treated as
5494            bytes *and* utf8, which would indicate a bug elsewhere. */
5495         assert(sstr != dstr);
5496
5497         SvGROW(dsv, dlen + slen * 2 + 1);
5498         d = (U8 *)SvPVX(dsv) + dlen;
5499
5500         while (sstr < send) {
5501             append_utf8_from_native_byte(*sstr, &d);
5502             sstr++;
5503         }
5504         SvCUR_set(dsv, d-(const U8 *)SvPVX(dsv));
5505     }
5506     *SvEND(dsv) = '\0';
5507     (void)SvPOK_only_UTF8(dsv);         /* validate pointer */
5508     SvTAINT(dsv);
5509     if (flags & SV_SMAGIC)
5510         SvSETMAGIC(dsv);
5511 }
5512
5513 /*
5514 =for apidoc sv_catsv
5515
5516 Concatenates the string from SV C<ssv> onto the end of the string in SV
5517 C<dsv>.  If C<ssv> is null, does nothing; otherwise modifies only C<dsv>.
5518 Handles 'get' magic on both SVs, but no 'set' magic.  See C<sv_catsv_mg> and
5519 C<sv_catsv_nomg>.
5520
5521 =for apidoc sv_catsv_flags
5522
5523 Concatenates the string from SV C<ssv> onto the end of the string in SV
5524 C<dsv>.  If C<ssv> is null, does nothing; otherwise modifies only C<dsv>.
5525 If C<flags> include C<SV_GMAGIC> bit set, will call C<mg_get> on both SVs if
5526 appropriate.  If C<flags> include C<SV_SMAGIC>, C<mg_set> will be called on
5527 the modified SV afterward, if appropriate.  C<sv_catsv>, C<sv_catsv_nomg>,
5528 and C<sv_catsv_mg> are implemented in terms of this function.
5529
5530 =cut */
5531
5532 void
5533 Perl_sv_catsv_flags(pTHX_ SV *const dsv, SV *const ssv, const I32 flags)
5534 {
5535     PERL_ARGS_ASSERT_SV_CATSV_FLAGS;
5536
5537     if (ssv) {
5538         STRLEN slen;
5539         const char *spv = SvPV_flags_const(ssv, slen, flags);
5540         if (flags & SV_GMAGIC)
5541                 SvGETMAGIC(dsv);
5542         sv_catpvn_flags(dsv, spv, slen,
5543                             DO_UTF8(ssv) ? SV_CATUTF8 : SV_CATBYTES);
5544         if (flags & SV_SMAGIC)
5545                 SvSETMAGIC(dsv);
5546     }
5547 }
5548
5549 /*
5550 =for apidoc sv_catpv
5551
5552 Concatenates the C<NUL>-terminated string onto the end of the string which is
5553 in the SV.
5554 If the SV has the UTF-8 status set, then the bytes appended should be
5555 valid UTF-8.  Handles 'get' magic, but not 'set' magic.  See C<sv_catpv_mg>.
5556
5557 =cut */
5558
5559 void
5560 Perl_sv_catpv(pTHX_ SV *const sv, const char *ptr)
5561 {
5562     STRLEN len;
5563     STRLEN tlen;
5564     char *junk;
5565
5566     PERL_ARGS_ASSERT_SV_CATPV;
5567
5568     if (!ptr)
5569         return;
5570     junk = SvPV_force(sv, tlen);
5571     len = strlen(ptr);
5572     SvGROW(sv, tlen + len + 1);
5573     if (ptr == junk)
5574         ptr = SvPVX_const(sv);
5575     Move(ptr,SvPVX(sv)+tlen,len+1,char);
5576     SvCUR_set(sv, SvCUR(sv) + len);
5577     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
5578     SvTAINT(sv);
5579 }
5580
5581 /*
5582 =for apidoc sv_catpv_flags
5583
5584 Concatenates the C<NUL>-terminated string onto the end of the string which is
5585 in the SV.
5586 If the SV has the UTF-8 status set, then the bytes appended should
5587 be valid UTF-8.  If C<flags> has the C<SV_SMAGIC> bit set, will C<mg_set>
5588 on the modified SV if appropriate.
5589
5590 =cut
5591 */
5592
5593 void
5594 Perl_sv_catpv_flags(pTHX_ SV *dstr, const char *sstr, const I32 flags)
5595 {
5596     PERL_ARGS_ASSERT_SV_CATPV_FLAGS;
5597     sv_catpvn_flags(dstr, sstr, strlen(sstr), flags);
5598 }
5599
5600 /*
5601 =for apidoc sv_catpv_mg
5602
5603 Like C<sv_catpv>, but also handles 'set' magic.
5604
5605 =cut
5606 */
5607
5608 void
5609 Perl_sv_catpv_mg(pTHX_ SV *const sv, const char *const ptr)
5610 {
5611     PERL_ARGS_ASSERT_SV_CATPV_MG;
5612
5613     sv_catpv(sv,ptr);
5614     SvSETMAGIC(sv);
5615 }
5616
5617 /*
5618 =for apidoc newSV
5619
5620 Creates a new SV.  A non-zero C<len> parameter indicates the number of
5621 bytes of preallocated string space the SV should have.  An extra byte for a
5622 trailing C<NUL> is also reserved.  (SvPOK is not set for the SV even if string
5623 space is allocated.)  The reference count for the new SV is set to 1.
5624
5625 In 5.9.3, newSV() replaces the older NEWSV() API, and drops the first
5626 parameter, I<x>, a debug aid which allowed callers to identify themselves.
5627 This aid has been superseded by a new build option, PERL_MEM_LOG (see
5628 L<perlhacktips/PERL_MEM_LOG>).  The older API is still there for use in XS
5629 modules supporting older perls.
5630
5631 =cut
5632 */
5633
5634 SV *
5635 Perl_newSV(pTHX_ const STRLEN len)
5636 {
5637     SV *sv;
5638
5639     new_SV(sv);
5640     if (len) {
5641         sv_grow(sv, len + 1);
5642     }
5643     return sv;
5644 }
5645 /*
5646 =for apidoc sv_magicext
5647
5648 Adds magic to an SV, upgrading it if necessary.  Applies the
5649 supplied vtable and returns a pointer to the magic added.
5650
5651 Note that C<sv_magicext> will allow things that C<sv_magic> will not.
5652 In particular, you can add magic to SvREADONLY SVs, and add more than
5653 one instance of the same 'how'.
5654
5655 If C<namlen> is greater than zero then a C<savepvn> I<copy> of C<name> is
5656 stored, if C<namlen> is zero then C<name> is stored as-is and - as another
5657 special case - if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
5658 to contain an C<SV*> and is stored as-is with its REFCNT incremented.
5659
5660 (This is now used as a subroutine by C<sv_magic>.)
5661
5662 =cut
5663 */
5664 MAGIC * 
5665 Perl_sv_magicext(pTHX_ SV *const sv, SV *const obj, const int how, 
5666                 const MGVTBL *const vtable, const char *const name, const I32 namlen)
5667 {
5668     MAGIC* mg;
5669
5670     PERL_ARGS_ASSERT_SV_MAGICEXT;
5671
5672     SvUPGRADE(sv, SVt_PVMG);
5673     Newxz(mg, 1, MAGIC);
5674     mg->mg_moremagic = SvMAGIC(sv);
5675     SvMAGIC_set(sv, mg);
5676
5677     /* Sometimes a magic contains a reference loop, where the sv and
5678        object refer to each other.  To prevent a reference loop that
5679        would prevent such objects being freed, we look for such loops
5680        and if we find one we avoid incrementing the object refcount.
5681
5682        Note we cannot do this to avoid self-tie loops as intervening RV must
5683        have its REFCNT incremented to keep it in existence.
5684
5685     */
5686     if (!obj || obj == sv ||
5687         how == PERL_MAGIC_arylen ||
5688         how == PERL_MAGIC_symtab ||
5689         (SvTYPE(obj) == SVt_PVGV &&
5690             (GvSV(obj) == sv || GvHV(obj) == (const HV *)sv
5691              || GvAV(obj) == (const AV *)sv || GvCV(obj) == (const CV *)sv
5692              || GvIOp(obj) == (const IO *)sv || GvFORM(obj) == (const CV *)sv)))
5693     {
5694         mg->mg_obj = obj;
5695     }
5696     else {
5697         mg->mg_obj = SvREFCNT_inc_simple(obj);
5698         mg->mg_flags |= MGf_REFCOUNTED;
5699     }
5700
5701     /* Normal self-ties simply pass a null object, and instead of
5702        using mg_obj directly, use the SvTIED_obj macro to produce a
5703        new RV as needed.  For glob "self-ties", we are tieing the PVIO
5704        with an RV obj pointing to the glob containing the PVIO.  In
5705        this case, to avoid a reference loop, we need to weaken the
5706        reference.
5707     */
5708
5709     if (how == PERL_MAGIC_tiedscalar && SvTYPE(sv) == SVt_PVIO &&
5710         obj && SvROK(obj) && GvIO(SvRV(obj)) == (const IO *)sv)
5711     {
5712       sv_rvweaken(obj);
5713     }
5714
5715     mg->mg_type = how;
5716     mg->mg_len = namlen;
5717     if (name) {
5718         if (namlen > 0)
5719             mg->mg_ptr = savepvn(name, namlen);
5720         else if (namlen == HEf_SVKEY) {
5721             /* Yes, this is casting away const. This is only for the case of
5722                HEf_SVKEY. I think we need to document this aberation of the
5723                constness of the API, rather than making name non-const, as
5724                that change propagating outwards a long way.  */
5725             mg->mg_ptr = (char*)SvREFCNT_inc_simple_NN((SV *)name);
5726         } else
5727             mg->mg_ptr = (char *) name;
5728     }
5729     mg->mg_virtual = (MGVTBL *) vtable;
5730
5731     mg_magical(sv);
5732     return mg;
5733 }
5734
5735 MAGIC *
5736 Perl_sv_magicext_mglob(pTHX_ SV *sv)
5737 {
5738     PERL_ARGS_ASSERT_SV_MAGICEXT_MGLOB;
5739     if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y') {
5740         /* This sv is only a delegate.  //g magic must be attached to
5741            its target. */
5742         vivify_defelem(sv);
5743         sv = LvTARG(sv);
5744     }
5745 #ifdef PERL_OLD_COPY_ON_WRITE
5746     if (SvIsCOW(sv))
5747         sv_force_normal_flags(sv, 0);
5748 #endif
5749     return sv_magicext(sv, NULL, PERL_MAGIC_regex_global,
5750                        &PL_vtbl_mglob, 0, 0);
5751 }
5752
5753 /*
5754 =for apidoc sv_magic
5755
5756 Adds magic to an SV.  First upgrades C<sv> to type C<SVt_PVMG> if
5757 necessary, then adds a new magic item of type C<how> to the head of the
5758 magic list.
5759
5760 See C<sv_magicext> (which C<sv_magic> now calls) for a description of the
5761 handling of the C<name> and C<namlen> arguments.
5762
5763 You need to use C<sv_magicext> to add magic to SvREADONLY SVs and also
5764 to add more than one instance of the same 'how'.
5765
5766 =cut
5767 */
5768
5769 void
5770 Perl_sv_magic(pTHX_ SV *const sv, SV *const obj, const int how,
5771              const char *const name, const I32 namlen)
5772 {
5773     const MGVTBL *vtable;
5774     MAGIC* mg;
5775     unsigned int flags;
5776     unsigned int vtable_index;
5777
5778     PERL_ARGS_ASSERT_SV_MAGIC;
5779
5780     if (how < 0 || (unsigned)how >= C_ARRAY_LENGTH(PL_magic_data)
5781         || ((flags = PL_magic_data[how]),
5782             (vtable_index = flags & PERL_MAGIC_VTABLE_MASK)
5783             > magic_vtable_max))
5784         Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
5785
5786     /* PERL_MAGIC_ext is reserved for use by extensions not perl internals.
5787        Useful for attaching extension internal data to perl vars.
5788        Note that multiple extensions may clash if magical scalars
5789        etc holding private data from one are passed to another. */
5790
5791     vtable = (vtable_index == magic_vtable_max)
5792         ? NULL : PL_magic_vtables + vtable_index;
5793
5794 #ifdef PERL_OLD_COPY_ON_WRITE
5795     if (SvIsCOW(sv))
5796         sv_force_normal_flags(sv, 0);
5797 #endif
5798     if (SvREADONLY(sv)) {
5799         if (
5800             !PERL_MAGIC_TYPE_READONLY_ACCEPTABLE(how)
5801            )
5802         {
5803             Perl_croak_no_modify();
5804         }
5805     }
5806     if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
5807         if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
5808             /* sv_magic() refuses to add a magic of the same 'how' as an
5809                existing one
5810              */
5811             if (how == PERL_MAGIC_taint)
5812                 mg->mg_len |= 1;
5813             return;
5814         }
5815     }
5816
5817     /* Force pos to be stored as characters, not bytes. */
5818     if (SvMAGICAL(sv) && DO_UTF8(sv)
5819       && (mg = mg_find(sv, PERL_MAGIC_regex_global))
5820       && mg->mg_len != -1
5821       && mg->mg_flags & MGf_BYTES) {
5822         mg->mg_len = (SSize_t)sv_pos_b2u_flags(sv, (STRLEN)mg->mg_len,
5823                                                SV_CONST_RETURN);
5824         mg->mg_flags &= ~MGf_BYTES;
5825     }
5826
5827     /* Rest of work is done else where */
5828     mg = sv_magicext(sv,obj,how,vtable,name,namlen);
5829
5830     switch (how) {
5831     case PERL_MAGIC_taint:
5832         mg->mg_len = 1;
5833         break;
5834     case PERL_MAGIC_ext:
5835     case PERL_MAGIC_dbfile:
5836         SvRMAGICAL_on(sv);
5837         break;
5838     }
5839 }
5840
5841 static int
5842 S_sv_unmagicext_flags(pTHX_ SV *const sv, const int type, MGVTBL *vtbl, const U32 flags)
5843 {
5844     MAGIC* mg;
5845     MAGIC** mgp;
5846
5847     assert(flags <= 1);
5848
5849     if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
5850         return 0;
5851     mgp = &(((XPVMG*) SvANY(sv))->xmg_u.xmg_magic);
5852     for (mg = *mgp; mg; mg = *mgp) {
5853         const MGVTBL* const virt = mg->mg_virtual;
5854         if (mg->mg_type == type && (!flags || virt == vtbl)) {
5855             *mgp = mg->mg_moremagic;
5856             if (virt && virt->svt_free)
5857                 virt->svt_free(aTHX_ sv, mg);
5858             if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
5859                 if (mg->mg_len > 0)
5860                     Safefree(mg->mg_ptr);
5861                 else if (mg->mg_len == HEf_SVKEY)
5862                     SvREFCNT_dec(MUTABLE_SV(mg->mg_ptr));
5863                 else if (mg->mg_type == PERL_MAGIC_utf8)
5864                     Safefree(mg->mg_ptr);
5865             }
5866             if (mg->mg_flags & MGf_REFCOUNTED)
5867                 SvREFCNT_dec(mg->mg_obj);
5868             Safefree(mg);
5869         }
5870         else
5871             mgp = &mg->mg_moremagic;
5872     }
5873     if (SvMAGIC(sv)) {
5874         if (SvMAGICAL(sv))      /* if we're under save_magic, wait for restore_magic; */
5875             mg_magical(sv);     /*    else fix the flags now */
5876     }
5877     else {
5878         SvMAGICAL_off(sv);
5879         SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
5880     }
5881     return 0;
5882 }
5883
5884 /*
5885 =for apidoc sv_unmagic
5886
5887 Removes all magic of type C<type> from an SV.
5888
5889 =cut
5890 */
5891
5892 int
5893 Perl_sv_unmagic(pTHX_ SV *const sv, const int type)
5894 {
5895     PERL_ARGS_ASSERT_SV_UNMAGIC;
5896     return S_sv_unmagicext_flags(aTHX_ sv, type, NULL, 0);
5897 }
5898
5899 /*
5900 =for apidoc sv_unmagicext
5901
5902 Removes all magic of type C<type> with the specified C<vtbl> from an SV.
5903
5904 =cut
5905 */
5906
5907 int
5908 Perl_sv_unmagicext(pTHX_ SV *const sv, const int type, MGVTBL *vtbl)
5909 {
5910     PERL_ARGS_ASSERT_SV_UNMAGICEXT;
5911     return S_sv_unmagicext_flags(aTHX_ sv, type, vtbl, 1);
5912 }
5913
5914 /*
5915 =for apidoc sv_rvweaken
5916
5917 Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
5918 referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
5919 push a back-reference to this RV onto the array of backreferences
5920 associated with that magic.  If the RV is magical, set magic will be
5921 called after the RV is cleared.
5922
5923 =cut
5924 */
5925
5926 SV *
5927 Perl_sv_rvweaken(pTHX_ SV *const sv)
5928 {
5929     SV *tsv;
5930
5931     PERL_ARGS_ASSERT_SV_RVWEAKEN;
5932
5933     if (!SvOK(sv))  /* let undefs pass */
5934         return sv;
5935     if (!SvROK(sv))
5936         Perl_croak(aTHX_ "Can't weaken a nonreference");
5937     else if (SvWEAKREF(sv)) {
5938         Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
5939         return sv;
5940     }
5941     else if (SvREADONLY(sv)) croak_no_modify();
5942     tsv = SvRV(sv);
5943     Perl_sv_add_backref(aTHX_ tsv, sv);
5944     SvWEAKREF_on(sv);
5945     SvREFCNT_dec_NN(tsv);
5946     return sv;
5947 }
5948
5949 /*
5950 =for apidoc sv_get_backrefs
5951
5952 If the sv is the target of a weakrefence then return
5953 the backrefs structure associated with the sv, otherwise
5954 return NULL.
5955
5956 When returning a non-null result the type of the return
5957 is relevant. If it is an AV then the contents of the AV
5958 are the weakrefs which point at this item. If it is any
5959 other type then the item itself is the weakref.
5960
5961 See also Perl_sv_add_backref(), Perl_sv_del_backref(),
5962 Perl_sv_kill_backrefs()
5963
5964 =cut
5965 */
5966
5967 SV *
5968 Perl_sv_get_backrefs(SV *const sv)
5969 {
5970     SV *backrefs= NULL;
5971
5972     PERL_ARGS_ASSERT_SV_GET_BACKREFS;
5973
5974     /* find slot to store array or singleton backref */
5975
5976     if (SvTYPE(sv) == SVt_PVHV) {
5977         if (SvOOK(sv)) {
5978             struct xpvhv_aux * const iter = HvAUX((HV *)sv);
5979             backrefs = (SV *)iter->xhv_backreferences;
5980         }
5981     } else if (SvMAGICAL(sv)) {
5982         MAGIC *mg = mg_find(sv, PERL_MAGIC_backref);
5983         if (mg)
5984             backrefs = mg->mg_obj;
5985     }
5986     return backrefs;
5987 }
5988
5989 /* Give tsv backref magic if it hasn't already got it, then push a
5990  * back-reference to sv onto the array associated with the backref magic.
5991  *
5992  * As an optimisation, if there's only one backref and it's not an AV,
5993  * store it directly in the HvAUX or mg_obj slot, avoiding the need to
5994  * allocate an AV. (Whether the slot holds an AV tells us whether this is
5995  * active.)
5996  */
5997
5998 /* A discussion about the backreferences array and its refcount:
5999  *
6000  * The AV holding the backreferences is pointed to either as the mg_obj of
6001  * PERL_MAGIC_backref, or in the specific case of a HV, from the
6002  * xhv_backreferences field. The array is created with a refcount
6003  * of 2. This means that if during global destruction the array gets
6004  * picked on before its parent to have its refcount decremented by the
6005  * random zapper, it won't actually be freed, meaning it's still there for
6006  * when its parent gets freed.
6007  *
6008  * When the parent SV is freed, the extra ref is killed by
6009  * Perl_sv_kill_backrefs.  The other ref is killed, in the case of magic,
6010  * by mg_free() / MGf_REFCOUNTED, or for a hash, by Perl_hv_kill_backrefs.
6011  *
6012  * When a single backref SV is stored directly, it is not reference
6013  * counted.
6014  */
6015
6016 void
6017 Perl_sv_add_backref(pTHX_ SV *const tsv, SV *const sv)
6018 {
6019     SV **svp;
6020     AV *av = NULL;
6021     MAGIC *mg = NULL;
6022
6023     PERL_ARGS_ASSERT_SV_ADD_BACKREF;
6024
6025     /* find slot to store array or singleton backref */
6026
6027     if (SvTYPE(tsv) == SVt_PVHV) {
6028         svp = (SV**)Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(tsv));
6029     } else {
6030         if (SvMAGICAL(tsv))
6031             mg = mg_find(tsv, PERL_MAGIC_backref);
6032         if (!mg)
6033             mg = sv_magicext(tsv, NULL, PERL_MAGIC_backref, &PL_vtbl_backref, NULL, 0);
6034         svp = &(mg->mg_obj);
6035     }
6036
6037     /* create or retrieve the array */
6038
6039     if (   (!*svp && SvTYPE(sv) == SVt_PVAV)
6040         || (*svp && SvTYPE(*svp) != SVt_PVAV)
6041     ) {
6042         /* create array */
6043         if (mg)
6044             mg->mg_flags |= MGf_REFCOUNTED;
6045         av = newAV();
6046         AvREAL_off(av);
6047         SvREFCNT_inc_simple_void_NN(av);
6048         /* av now has a refcnt of 2; see discussion above */
6049         av_extend(av, *svp ? 2 : 1);
6050         if (*svp) {
6051             /* move single existing backref to the array */
6052             AvARRAY(av)[++AvFILLp(av)] = *svp; /* av_push() */
6053         }
6054         *svp = (SV*)av;
6055     }
6056     else {
6057         av = MUTABLE_AV(*svp);
6058         if (!av) {
6059             /* optimisation: store single backref directly in HvAUX or mg_obj */
6060             *svp = sv;
6061             return;
6062         }
6063         assert(SvTYPE(av) == SVt_PVAV);
6064         if (AvFILLp(av) >= AvMAX(av)) {
6065             av_extend(av, AvFILLp(av)+1);
6066         }
6067     }
6068     /* push new backref */
6069     AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */
6070 }
6071
6072 /* delete a back-reference to ourselves from the backref magic associated
6073  * with the SV we point to.
6074  */
6075
6076 void
6077 Perl_sv_del_backref(pTHX_ SV *const tsv, SV *const sv)
6078 {
6079     SV **svp = NULL;
6080
6081     PERL_ARGS_ASSERT_SV_DEL_BACKREF;
6082
6083     if (SvTYPE(tsv) == SVt_PVHV) {
6084         if (SvOOK(tsv))
6085             svp = (SV**)Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(tsv));
6086     }
6087     else if (SvIS_FREED(tsv) && PL_phase == PERL_PHASE_DESTRUCT) {
6088         /* It's possible for the the last (strong) reference to tsv to have
6089            become freed *before* the last thing holding a weak reference.
6090            If both survive longer than the backreferences array, then when
6091            the referent's reference count drops to 0 and it is freed, it's
6092            not able to chase the backreferences, so they aren't NULLed.
6093
6094            For example, a CV holds a weak reference to its stash. If both the
6095            CV and the stash survive longer than the backreferences array,
6096            and the CV gets picked for the SvBREAK() treatment first,
6097            *and* it turns out that the stash is only being kept alive because
6098            of an our variable in the pad of the CV, then midway during CV
6099            destruction the stash gets freed, but CvSTASH() isn't set to NULL.
6100            It ends up pointing to the freed HV. Hence it's chased in here, and
6101            if this block wasn't here, it would hit the !svp panic just below.
6102
6103            I don't believe that "better" destruction ordering is going to help
6104            here - during global destruction there's always going to be the
6105            chance that something goes out of order. We've tried to make it
6106            foolproof before, and it only resulted in evolutionary pressure on
6107            fools. Which made us look foolish for our hubris. :-(
6108         */
6109         return;
6110     }
6111     else {
6112         MAGIC *const mg
6113             = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
6114         svp =  mg ? &(mg->mg_obj) : NULL;
6115     }
6116
6117     if (!svp)
6118         Perl_croak(aTHX_ "panic: del_backref, svp=0");
6119     if (!*svp) {
6120         /* It's possible that sv is being freed recursively part way through the
6121            freeing of tsv. If this happens, the backreferences array of tsv has
6122            already been freed, and so svp will be NULL. If this is the case,
6123            we should not panic. Instead, nothing needs doing, so return.  */
6124         if (PL_phase == PERL_PHASE_DESTRUCT && SvREFCNT(tsv) == 0)
6125             return;
6126         Perl_croak(aTHX_ "panic: del_backref, *svp=%p phase=%s refcnt=%" UVuf,
6127                    (void*)*svp, PL_phase_names[PL_phase], (UV)SvREFCNT(tsv));
6128     }
6129
6130     if (SvTYPE(*svp) == SVt_PVAV) {
6131 #ifdef DEBUGGING
6132         int count = 1;
6133 #endif
6134         AV * const av = (AV*)*svp;
6135         SSize_t fill;
6136         assert(!SvIS_FREED(av));
6137         fill = AvFILLp(av);
6138         assert(fill > -1);
6139         svp = AvARRAY(av);
6140         /* for an SV with N weak references to it, if all those
6141          * weak refs are deleted, then sv_del_backref will be called
6142          * N times and O(N^2) compares will be done within the backref
6143          * array. To ameliorate this potential slowness, we:
6144          * 1) make sure this code is as tight as possible;
6145          * 2) when looking for SV, look for it at both the head and tail of the
6146          *    array first before searching the rest, since some create/destroy
6147          *    patterns will cause the backrefs to be freed in order.
6148          */
6149         if (*svp == sv) {
6150             AvARRAY(av)++;
6151             AvMAX(av)--;
6152         }
6153         else {
6154             SV **p = &svp[fill];
6155             SV *const topsv = *p;
6156             if (topsv != sv) {
6157 #ifdef DEBUGGING
6158                 count = 0;
6159 #endif
6160                 while (--p > svp) {
6161                     if (*p == sv) {
6162                         /* We weren't the last entry.
6163                            An unordered list has this property that you
6164                            can take the last element off the end to fill
6165                            the hole, and it's still an unordered list :-)
6166                         */
6167                         *p = topsv;
6168 #ifdef DEBUGGING
6169                         count++;
6170 #else
6171                         break; /* should only be one */
6172 #endif
6173                     }
6174                 }
6175             }
6176         }
6177         assert(count ==1);
6178         AvFILLp(av) = fill-1;
6179     }
6180     else if (SvIS_FREED(*svp) && PL_phase == PERL_PHASE_DESTRUCT) {
6181         /* freed AV; skip */
6182     }
6183     else {
6184         /* optimisation: only a single backref, stored directly */
6185         if (*svp != sv)
6186             Perl_croak(aTHX_ "panic: del_backref, *svp=%p, sv=%p",
6187                        (void*)*svp, (void*)sv);
6188         *svp = NULL;
6189     }
6190
6191 }
6192
6193 void
6194 Perl_sv_kill_backrefs(pTHX_ SV *const sv, AV *const av)
6195 {
6196     SV **svp;
6197     SV **last;
6198     bool is_array;
6199
6200     PERL_ARGS_ASSERT_SV_KILL_BACKREFS;
6201
6202     if (!av)
6203         return;
6204
6205     /* after multiple passes through Perl_sv_clean_all() for a thingy
6206      * that has badly leaked, the backref array may have gotten freed,
6207      * since we only protect it against 1 round of cleanup */
6208     if (SvIS_FREED(av)) {
6209         if (PL_in_clean_all) /* All is fair */
6210             return;
6211         Perl_croak(aTHX_
6212                    "panic: magic_killbackrefs (freed backref AV/SV)");
6213     }
6214
6215
6216     is_array = (SvTYPE(av) == SVt_PVAV);
6217     if (is_array) {
6218         assert(!SvIS_FREED(av));
6219         svp = AvARRAY(av);
6220         if (svp)
6221             last = svp + AvFILLp(av);
6222     }
6223     else {
6224         /* optimisation: only a single backref, stored directly */
6225         svp = (SV**)&av;
6226         last = svp;
6227     }
6228
6229     if (svp) {
6230         while (svp <= last) {
6231             if (*svp) {
6232                 SV *const referrer = *svp;
6233                 if (SvWEAKREF(referrer)) {
6234                     /* XXX Should we check that it hasn't changed? */
6235                     assert(SvROK(referrer));
6236                     SvRV_set(referrer, 0);
6237                     SvOK_off(referrer);
6238                     SvWEAKREF_off(referrer);
6239                     SvSETMAGIC(referrer);
6240                 } else if (SvTYPE(referrer) == SVt_PVGV ||
6241                            SvTYPE(referrer) == SVt_PVLV) {
6242                     assert(SvTYPE(sv) == SVt_PVHV); /* stash backref */
6243                     /* You lookin' at me?  */
6244                     assert(GvSTASH(referrer));
6245                     assert(GvSTASH(referrer) == (const HV *)sv);
6246                     GvSTASH(referrer) = 0;
6247                 } else if (SvTYPE(referrer) == SVt_PVCV ||
6248                            SvTYPE(referrer) == SVt_PVFM) {
6249                     if (SvTYPE(sv) == SVt_PVHV) { /* stash backref */
6250                         /* You lookin' at me?  */
6251                         assert(CvSTASH(referrer));
6252                         assert(CvSTASH(referrer) == (const HV *)sv);
6253                         SvANY(MUTABLE_CV(referrer))->xcv_stash = 0;
6254                     }
6255                     else {
6256                         assert(SvTYPE(sv) == SVt_PVGV);
6257                         /* You lookin' at me?  */
6258                         assert(CvGV(referrer));
6259                         assert(CvGV(referrer) == (const GV *)sv);
6260                         anonymise_cv_maybe(MUTABLE_GV(sv),
6261                                                 MUTABLE_CV(referrer));
6262                     }
6263
6264                 } else {
6265                     Perl_croak(aTHX_
6266                                "panic: magic_killbackrefs (flags=%"UVxf")",
6267                                (UV)SvFLAGS(referrer));
6268                 }
6269
6270                 if (is_array)
6271                     *svp = NULL;
6272             }
6273             svp++;
6274         }
6275     }
6276     if (is_array) {
6277         AvFILLp(av) = -1;
6278         SvREFCNT_dec_NN(av); /* remove extra count added by sv_add_backref() */
6279     }
6280     return;
6281 }
6282
6283 /*
6284 =for apidoc sv_insert
6285
6286 Inserts a string at the specified offset/length within the SV.  Similar to
6287 the Perl substr() function.  Handles get magic.
6288
6289 =for apidoc sv_insert_flags
6290
6291 Same as C<sv_insert>, but the extra C<flags> are passed to the
6292 C<SvPV_force_flags> that applies to C<bigstr>.
6293
6294 =cut
6295 */
6296
6297 void
6298 Perl_sv_insert_flags(pTHX_ SV *const bigstr, const STRLEN offset, const STRLEN len, const char *const little, const STRLEN littlelen, const U32 flags)
6299 {
6300     char *big;
6301     char *mid;
6302     char *midend;
6303     char *bigend;
6304     SSize_t i;          /* better be sizeof(STRLEN) or bad things happen */
6305     STRLEN curlen;
6306
6307     PERL_ARGS_ASSERT_SV_INSERT_FLAGS;
6308
6309     SvPV_force_flags(bigstr, curlen, flags);
6310     (void)SvPOK_only_UTF8(bigstr);
6311     if (offset + len > curlen) {
6312         SvGROW(bigstr, offset+len+1);
6313         Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
6314         SvCUR_set(bigstr, offset+len);
6315     }
6316
6317     SvTAINT(bigstr);
6318     i = littlelen - len;
6319     if (i > 0) {                        /* string might grow */
6320         big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
6321         mid = big + offset + len;
6322         midend = bigend = big + SvCUR(bigstr);
6323         bigend += i;
6324         *bigend = '\0';
6325         while (midend > mid)            /* shove everything down */
6326             *--bigend = *--midend;
6327         Move(little,big+offset,littlelen,char);
6328         SvCUR_set(bigstr, SvCUR(bigstr) + i);
6329         SvSETMAGIC(bigstr);
6330         return;
6331     }
6332     else if (i == 0) {
6333         Move(little,SvPVX(bigstr)+offset,len,char);
6334         SvSETMAGIC(bigstr);
6335         return;
6336     }
6337
6338     big = SvPVX(bigstr);
6339     mid = big + offset;
6340     midend = mid + len;
6341     bigend = big + SvCUR(bigstr);
6342
6343     if (midend > bigend)
6344         Perl_croak(aTHX_ "panic: sv_insert, midend=%p, bigend=%p",
6345                    midend, bigend);
6346
6347     if (mid - big > bigend - midend) {  /* faster to shorten from end */
6348         if (littlelen) {
6349             Move(little, mid, littlelen,char);
6350             mid += littlelen;
6351         }
6352         i = bigend - midend;
6353         if (i > 0) {
6354             Move(midend, mid, i,char);
6355             mid += i;
6356         }
6357         *mid = '\0';
6358         SvCUR_set(bigstr, mid - big);
6359     }
6360     else if ((i = mid - big)) { /* faster from front */
6361         midend -= littlelen;
6362         mid = midend;
6363         Move(big, midend - i, i, char);
6364         sv_chop(bigstr,midend-i);
6365         if (littlelen)
6366             Move(little, mid, littlelen,char);
6367     }
6368     else if (littlelen) {
6369         midend -= littlelen;
6370         sv_chop(bigstr,midend);
6371         Move(little,midend,littlelen,char);
6372     }
6373     else {
6374         sv_chop(bigstr,midend);
6375     }
6376     SvSETMAGIC(bigstr);
6377 }
6378
6379 /*
6380 =for apidoc sv_replace
6381
6382 Make the first argument a copy of the second, then delete the original.
6383 The target SV physically takes over ownership of the body of the source SV
6384 and inherits its flags; however, the target keeps any magic it owns,
6385 and any magic in the source is discarded.
6386 Note that this is a rather specialist SV copying operation; most of the
6387 time you'll want to use C<sv_setsv> or one of its many macro front-ends.
6388
6389 =cut
6390 */
6391
6392 void
6393 Perl_sv_replace(pTHX_ SV *const sv, SV *const nsv)
6394 {
6395     const U32 refcnt = SvREFCNT(sv);
6396
6397     PERL_ARGS_ASSERT_SV_REPLACE;
6398
6399     SV_CHECK_THINKFIRST_COW_DROP(sv);
6400     if (SvREFCNT(nsv) != 1) {
6401         Perl_croak(aTHX_ "panic: reference miscount on nsv in sv_replace()"
6402                    " (%" UVuf " != 1)", (UV) SvREFCNT(nsv));
6403     }
6404     if (SvMAGICAL(sv)) {
6405         if (SvMAGICAL(nsv))
6406             mg_free(nsv);
6407         else
6408             sv_upgrade(nsv, SVt_PVMG);
6409         SvMAGIC_set(nsv, SvMAGIC(sv));
6410         SvFLAGS(nsv) |= SvMAGICAL(sv);
6411         SvMAGICAL_off(sv);
6412         SvMAGIC_set(sv, NULL);
6413     }
6414     SvREFCNT(sv) = 0;
6415     sv_clear(sv);
6416     assert(!SvREFCNT(sv));
6417 #ifdef DEBUG_LEAKING_SCALARS
6418     sv->sv_flags  = nsv->sv_flags;
6419     sv->sv_any    = nsv->sv_any;
6420     sv->sv_refcnt = nsv->sv_refcnt;
6421     sv->sv_u      = nsv->sv_u;
6422 #else
6423     StructCopy(nsv,sv,SV);
6424 #endif
6425     if(SvTYPE(sv) == SVt_IV) {
6426         SET_SVANY_FOR_BODYLESS_IV(sv);
6427     }
6428         
6429
6430 #ifdef PERL_OLD_COPY_ON_WRITE
6431     if (SvIsCOW_normal(nsv)) {
6432         /* We need to follow the pointers around the loop to make the
6433            previous SV point to sv, rather than nsv.  */
6434         SV *next;
6435         SV *current = nsv;
6436         while ((next = SV_COW_NEXT_SV(current)) != nsv) {
6437             assert(next);
6438             current = next;
6439             assert(SvPVX_const(current) == SvPVX_const(nsv));
6440         }
6441         /* Make the SV before us point to the SV after us.  */
6442         if (DEBUG_C_TEST) {
6443             PerlIO_printf(Perl_debug_log, "previous is\n");
6444             sv_dump(current);
6445             PerlIO_printf(Perl_debug_log,
6446                           "move it from 0x%"UVxf" to 0x%"UVxf"\n",
6447                           (UV) SV_COW_NEXT_SV(current), (UV) sv);
6448         }
6449         SV_COW_NEXT_SV_SET(current, sv);
6450     }
6451 #endif
6452     SvREFCNT(sv) = refcnt;
6453     SvFLAGS(nsv) |= SVTYPEMASK;         /* Mark as freed */
6454     SvREFCNT(nsv) = 0;
6455     del_SV(nsv);
6456 }
6457
6458 /* We're about to free a GV which has a CV that refers back to us.
6459  * If that CV will outlive us, make it anonymous (i.e. fix up its CvGV
6460  * field) */
6461
6462 STATIC void
6463 S_anonymise_cv_maybe(pTHX_ GV *gv, CV* cv)
6464 {
6465     SV *gvname;
6466     GV *anongv;
6467
6468     PERL_ARGS_ASSERT_ANONYMISE_CV_MAYBE;
6469
6470     /* be assertive! */
6471     assert(SvREFCNT(gv) == 0);
6472     assert(isGV(gv) && isGV_with_GP(gv));
6473     assert(GvGP(gv));
6474     assert(!CvANON(cv));
6475     assert(CvGV(cv) == gv);
6476     assert(!CvNAMED(cv));
6477
6478     /* will the CV shortly be freed by gp_free() ? */
6479     if (GvCV(gv) == cv && GvGP(gv)->gp_refcnt < 2 && SvREFCNT(cv) < 2) {
6480         SvANY(cv)->xcv_gv_u.xcv_gv = NULL;
6481         return;
6482     }
6483
6484     /* if not, anonymise: */
6485     gvname = (GvSTASH(gv) && HvNAME(GvSTASH(gv)) && HvENAME(GvSTASH(gv)))
6486                     ? newSVhek(HvENAME_HEK(GvSTASH(gv)))
6487                     : newSVpvn_flags( "__ANON__", 8, 0 );
6488     sv_catpvs(gvname, "::__ANON__");
6489     anongv = gv_fetchsv(gvname, GV_ADDMULTI, SVt_PVCV);
6490     SvREFCNT_dec_NN(gvname);
6491
6492     CvANON_on(cv);
6493     CvCVGV_RC_on(cv);
6494     SvANY(cv)->xcv_gv_u.xcv_gv = MUTABLE_GV(SvREFCNT_inc(anongv));
6495 }
6496
6497
6498 /*
6499 =for apidoc sv_clear
6500
6501 Clear an SV: call any destructors, free up any memory used by the body,
6502 and free the body itself.  The SV's head is I<not> freed, although
6503 its type is set to all 1's so that it won't inadvertently be assumed
6504 to be live during global destruction etc.
6505 This function should only be called when REFCNT is zero.  Most of the time
6506 you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
6507 instead.
6508
6509 =cut
6510 */
6511
6512 void
6513 Perl_sv_clear(pTHX_ SV *const orig_sv)
6514 {
6515     dVAR;
6516     HV *stash;
6517     U32 type;
6518     const struct body_details *sv_type_details;
6519     SV* iter_sv = NULL;
6520     SV* next_sv = NULL;
6521     SV *sv = orig_sv;
6522     STRLEN hash_index = 0; /* initialise to make Coverity et al happy.
6523                               Not strictly necessary */
6524
6525     PERL_ARGS_ASSERT_SV_CLEAR;
6526
6527     /* within this loop, sv is the SV currently being freed, and
6528      * iter_sv is the most recent AV or whatever that's being iterated
6529      * over to provide more SVs */
6530
6531     while (sv) {
6532
6533         type = SvTYPE(sv);
6534
6535         assert(SvREFCNT(sv) == 0);
6536         assert(SvTYPE(sv) != (svtype)SVTYPEMASK);
6537
6538         if (type <= SVt_IV) {
6539             /* See the comment in sv.h about the collusion between this
6540              * early return and the overloading of the NULL slots in the
6541              * size table.  */
6542             if (SvROK(sv))
6543                 goto free_rv;
6544             SvFLAGS(sv) &= SVf_BREAK;
6545             SvFLAGS(sv) |= SVTYPEMASK;
6546             goto free_head;
6547         }
6548
6549         /* objs are always >= MG, but pad names use the SVs_OBJECT flag
6550            for another purpose  */
6551         assert(!SvOBJECT(sv) || type >= SVt_PVMG);
6552
6553         if (type >= SVt_PVMG) {
6554             if (SvOBJECT(sv)) {
6555                 if (!curse(sv, 1)) goto get_next_sv;
6556                 type = SvTYPE(sv); /* destructor may have changed it */
6557             }
6558             /* Free back-references before magic, in case the magic calls
6559              * Perl code that has weak references to sv. */
6560             if (type == SVt_PVHV) {
6561                 Perl_hv_kill_backrefs(aTHX_ MUTABLE_HV(sv));
6562                 if (SvMAGIC(sv))
6563                     mg_free(sv);
6564             }
6565             else if (SvMAGIC(sv)) {
6566                 /* Free back-references before other types of magic. */
6567                 sv_unmagic(sv, PERL_MAGIC_backref);
6568                 mg_free(sv);
6569             }
6570             SvMAGICAL_off(sv);
6571         }
6572         switch (type) {
6573             /* case SVt_INVLIST: */
6574         case SVt_PVIO:
6575             if (IoIFP(sv) &&
6576                 IoIFP(sv) != PerlIO_stdin() &&
6577                 IoIFP(sv) != PerlIO_stdout() &&
6578                 IoIFP(sv) != PerlIO_stderr() &&
6579                 !(IoFLAGS(sv) & IOf_FAKE_DIRP))
6580             {
6581                 io_close(MUTABLE_IO(sv), NULL, FALSE,
6582                          (IoTYPE(sv) == IoTYPE_WRONLY ||
6583                           IoTYPE(sv) == IoTYPE_RDWR   ||
6584                           IoTYPE(sv) == IoTYPE_APPEND));
6585             }
6586             if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
6587                 PerlDir_close(IoDIRP(sv));
6588             IoDIRP(sv) = (DIR*)NULL;
6589             Safefree(IoTOP_NAME(sv));
6590             Safefree(IoFMT_NAME(sv));
6591             Safefree(IoBOTTOM_NAME(sv));
6592             if ((const GV *)sv == PL_statgv)
6593                 PL_statgv = NULL;
6594             goto freescalar;
6595         case SVt_REGEXP:
6596             /* FIXME for plugins */
6597           freeregexp:
6598             pregfree2((REGEXP*) sv);
6599             goto freescalar;
6600         case SVt_PVCV:
6601         case SVt_PVFM:
6602             cv_undef(MUTABLE_CV(sv));
6603             /* If we're in a stash, we don't own a reference to it.
6604              * However it does have a back reference to us, which needs to
6605              * be cleared.  */
6606             if ((stash = CvSTASH(sv)))
6607                 sv_del_backref(MUTABLE_SV(stash), sv);
6608             goto freescalar;
6609         case SVt_PVHV:
6610             if (PL_last_swash_hv == (const HV *)sv) {
6611                 PL_last_swash_hv = NULL;
6612             }
6613             if (HvTOTALKEYS((HV*)sv) > 0) {
6614                 const HEK *hek;
6615                 /* this statement should match the one at the beginning of
6616                  * hv_undef_flags() */
6617                 if (   PL_phase != PERL_PHASE_DESTRUCT
6618                     && (hek = HvNAME_HEK((HV*)sv)))
6619                 {
6620                     if (PL_stashcache) {
6621                         DEBUG_o(Perl_deb(aTHX_
6622                             "sv_clear clearing PL_stashcache for '%"HEKf
6623                             "'\n",
6624                              HEKfARG(hek)));
6625                         (void)hv_deletehek(PL_stashcache,
6626                                            hek, G_DISCARD);
6627                     }
6628                     hv_name_set((HV*)sv, NULL, 0, 0);
6629                 }
6630
6631                 /* save old iter_sv in unused SvSTASH field */
6632                 assert(!SvOBJECT(sv));
6633                 SvSTASH(sv) = (HV*)iter_sv;
6634                 iter_sv = sv;
6635
6636                 /* save old hash_index in unused SvMAGIC field */
6637                 assert(!SvMAGICAL(sv));
6638                 assert(!SvMAGIC(sv));
6639                 ((XPVMG*) SvANY(sv))->xmg_u.xmg_hash_index = hash_index;
6640                 hash_index = 0;
6641
6642                 next_sv = Perl_hfree_next_entry(aTHX_ (HV*)sv, &hash_index);
6643                 goto get_next_sv; /* process this new sv */
6644             }
6645             /* free empty hash */
6646             Perl_hv_undef_flags(aTHX_ MUTABLE_HV(sv), HV_NAME_SETALL);
6647             assert(!HvARRAY((HV*)sv));
6648             break;
6649         case SVt_PVAV:
6650             {
6651                 AV* av = MUTABLE_AV(sv);
6652                 if (PL_comppad == av) {
6653                     PL_comppad = NULL;
6654                     PL_curpad = NULL;
6655                 }
6656                 if (AvREAL(av) && AvFILLp(av) > -1) {
6657                     next_sv = AvARRAY(av)[AvFILLp(av)--];
6658                     /* save old iter_sv in top-most slot of AV,
6659                      * and pray that it doesn't get wiped in the meantime */
6660                     AvARRAY(av)[AvMAX(av)] = iter_sv;
6661                     iter_sv = sv;
6662                     goto get_next_sv; /* process this new sv */
6663                 }
6664                 Safefree(AvALLOC(av));
6665             }
6666
6667             break;
6668         case SVt_PVLV:
6669             if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
6670                 SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv)));
6671                 HeNEXT((HE*)LvTARG(sv)) = PL_hv_fetch_ent_mh;
6672                 PL_hv_fetch_ent_mh = (HE*)LvTARG(sv);
6673             }
6674             else if (LvTYPE(sv) != 't') /* unless tie: unrefcnted fake SV**  */
6675                 SvREFCNT_dec(LvTARG(sv));
6676             if (isREGEXP(sv)) goto freeregexp;
6677             /* FALLTHROUGH */
6678         case SVt_PVGV:
6679             if (isGV_with_GP(sv)) {
6680                 if(GvCVu((const GV *)sv) && (stash = GvSTASH(MUTABLE_GV(sv)))
6681                    && HvENAME_get(stash))
6682                     mro_method_changed_in(stash);
6683                 gp_free(MUTABLE_GV(sv));
6684                 if (GvNAME_HEK(sv))
6685                     unshare_hek(GvNAME_HEK(sv));
6686                 /* If we're in a stash, we don't own a reference to it.
6687                  * However it does have a back reference to us, which
6688                  * needs to be cleared.  */
6689                 if (!SvVALID(sv) && (stash = GvSTASH(sv)))
6690                         sv_del_backref(MUTABLE_SV(stash), sv);
6691             }
6692             /* FIXME. There are probably more unreferenced pointers to SVs
6693              * in the interpreter struct that we should check and tidy in
6694              * a similar fashion to this:  */
6695             /* See also S_sv_unglob, which does the same thing. */
6696             if ((const GV *)sv == PL_last_in_gv)
6697                 PL_last_in_gv = NULL;
6698             else if ((const GV *)sv == PL_statgv)
6699                 PL_statgv = NULL;
6700             else if ((const GV *)sv == PL_stderrgv)
6701                 PL_stderrgv = NULL;
6702             /* FALLTHROUGH */
6703         case SVt_PVMG:
6704         case SVt_PVNV:
6705         case SVt_PVIV:
6706         case SVt_INVLIST:
6707         case SVt_PV:
6708           freescalar:
6709             /* Don't bother with SvOOK_off(sv); as we're only going to
6710              * free it.  */
6711             if (SvOOK(sv)) {
6712                 STRLEN offset;
6713                 SvOOK_offset(sv, offset);
6714                 SvPV_set(sv, SvPVX_mutable(sv) - offset);
6715                 /* Don't even bother with turning off the OOK flag.  */
6716             }
6717             if (SvROK(sv)) {
6718             free_rv:
6719                 {
6720                     SV * const target = SvRV(sv);
6721                     if (SvWEAKREF(sv))
6722                         sv_del_backref(target, sv);
6723                     else
6724                         next_sv = target;
6725                 }
6726             }
6727 #ifdef PERL_ANY_COW
6728             else if (SvPVX_const(sv)
6729                      && !(SvTYPE(sv) == SVt_PVIO
6730                      && !(IoFLAGS(sv) & IOf_FAKE_DIRP)))
6731             {
6732                 if (SvIsCOW(sv)) {
6733                     if (DEBUG_C_TEST) {
6734                         PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
6735                         sv_dump(sv);
6736                     }
6737                     if (SvLEN(sv)) {
6738 # ifdef PERL_OLD_COPY_ON_WRITE
6739                         sv_release_COW(sv, SvPVX_const(sv), SV_COW_NEXT_SV(sv));
6740 # else
6741                         if (CowREFCNT(sv)) {
6742                             sv_buf_to_rw(sv);
6743                             CowREFCNT(sv)--;
6744                             sv_buf_to_ro(sv);
6745                             SvLEN_set(sv, 0);
6746                         }
6747 # endif
6748                     } else {
6749                         unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
6750                     }
6751
6752                 }
6753 # ifdef PERL_OLD_COPY_ON_WRITE
6754                 else
6755 # endif
6756                 if (SvLEN(sv)) {
6757                     Safefree(SvPVX_mutable(sv));
6758                 }
6759             }
6760 #else
6761             else if (SvPVX_const(sv) && SvLEN(sv)
6762                      && !(SvTYPE(sv) == SVt_PVIO
6763                      && !(IoFLAGS(sv) & IOf_FAKE_DIRP)))
6764                 Safefree(SvPVX_mutable(sv));
6765             else if (SvPVX_const(sv) && SvIsCOW(sv)) {
6766                 unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
6767             }
6768 #endif
6769             break;
6770         case SVt_NV:
6771             break;
6772         }
6773
6774       free_body:
6775
6776         SvFLAGS(sv) &= SVf_BREAK;
6777         SvFLAGS(sv) |= SVTYPEMASK;
6778
6779         sv_type_details = bodies_by_type + type;
6780         if (sv_type_details->arena) {
6781             del_body(((char *)SvANY(sv) + sv_type_details->offset),
6782                      &PL_body_roots[type]);
6783         }
6784         else if (sv_type_details->body_size) {
6785             safefree(SvANY(sv));
6786         }
6787
6788       free_head:
6789         /* caller is responsible for freeing the head of the original sv */
6790         if (sv != orig_sv && !SvREFCNT(sv))
6791             del_SV(sv);
6792
6793         /* grab and free next sv, if any */
6794       get_next_sv:
6795         while (1) {
6796             sv = NULL;
6797             if (next_sv) {
6798                 sv = next_sv;
6799                 next_sv = NULL;
6800             }
6801             else if (!iter_sv) {
6802                 break;
6803             } else if (SvTYPE(iter_sv) == SVt_PVAV) {
6804                 AV *const av = (AV*)iter_sv;
6805                 if (AvFILLp(av) > -1) {
6806                     sv = AvARRAY(av)[AvFILLp(av)--];
6807                 }
6808                 else { /* no more elements of current AV to free */
6809                     sv = iter_sv;
6810                     type = SvTYPE(sv);
6811                     /* restore previous value, squirrelled away */
6812                     iter_sv = AvARRAY(av)[AvMAX(av)];
6813                     Safefree(AvALLOC(av));
6814                     goto free_body;
6815                 }
6816             } else if (SvTYPE(iter_sv) == SVt_PVHV) {
6817                 sv = Perl_hfree_next_entry(aTHX_ (HV*)iter_sv, &hash_index);
6818                 if (!sv && !HvTOTALKEYS((HV *)iter_sv)) {
6819                     /* no more elements of current HV to free */
6820                     sv = iter_sv;
6821                     type = SvTYPE(sv);
6822                     /* Restore previous values of iter_sv and hash_index,
6823                      * squirrelled away */
6824                     assert(!SvOBJECT(sv));
6825                     iter_sv = (SV*)SvSTASH(sv);
6826                     assert(!SvMAGICAL(sv));
6827                     hash_index = ((XPVMG*) SvANY(sv))->xmg_u.xmg_hash_index;
6828 #ifdef DEBUGGING
6829                     /* perl -DA does not like rubbish in SvMAGIC. */
6830                     SvMAGIC_set(sv, 0);
6831 #endif
6832
6833                     /* free any remaining detritus from the hash struct */
6834                     Perl_hv_undef_flags(aTHX_ MUTABLE_HV(sv), HV_NAME_SETALL);
6835                     assert(!HvARRAY((HV*)sv));
6836                     goto free_body;
6837                 }
6838             }
6839
6840             /* unrolled SvREFCNT_dec and sv_free2 follows: */
6841
6842             if (!sv)
6843                 continue;
6844             if (!SvREFCNT(sv)) {
6845                 sv_free(sv);
6846                 continue;
6847             }
6848             if (--(SvREFCNT(sv)))
6849                 continue;
6850 #ifdef DEBUGGING
6851             if (SvTEMP(sv)) {
6852                 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING),
6853                          "Attempt to free temp prematurely: SV 0x%"UVxf
6854                          pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
6855                 continue;
6856             }
6857 #endif
6858             if (SvIMMORTAL(sv)) {
6859                 /* make sure SvREFCNT(sv)==0 happens very seldom */
6860                 SvREFCNT(sv) = SvREFCNT_IMMORTAL;
6861                 continue;
6862             }
6863             break;
6864         } /* while 1 */
6865
6866     } /* while sv */
6867 }
6868
6869 /* This routine curses the sv itself, not the object referenced by sv. So
6870    sv does not have to be ROK. */
6871
6872 static bool
6873 S_curse(pTHX_ SV * const sv, const bool check_refcnt) {
6874     PERL_ARGS_ASSERT_CURSE;
6875     assert(SvOBJECT(sv));
6876
6877     if (PL_defstash &&  /* Still have a symbol table? */
6878         SvDESTROYABLE(sv))
6879     {
6880         dSP;
6881         HV* stash;
6882         do {
6883           stash = SvSTASH(sv);
6884           assert(SvTYPE(stash) == SVt_PVHV);
6885           if (HvNAME(stash)) {
6886             CV* destructor = NULL;
6887             assert (SvOOK(stash));
6888             if (!SvOBJECT(stash)) destructor = (CV *)SvSTASH(stash);
6889             if (!destructor || HvMROMETA(stash)->destroy_gen
6890                                 != PL_sub_generation)
6891             {
6892                 GV * const gv =
6893                     gv_fetchmeth_autoload(stash, "DESTROY", 7, 0);
6894                 if (gv) destructor = GvCV(gv);
6895                 if (!SvOBJECT(stash))
6896                 {
6897                     SvSTASH(stash) =
6898                         destructor ? (HV *)destructor : ((HV *)0)+1;
6899                     HvAUX(stash)->xhv_mro_meta->destroy_gen =
6900                         PL_sub_generation;
6901                 }
6902             }
6903             assert(!destructor || destructor == ((CV *)0)+1
6904                 || SvTYPE(destructor) == SVt_PVCV);
6905             if (destructor && destructor != ((CV *)0)+1
6906                 /* A constant subroutine can have no side effects, so
6907                    don't bother calling it.  */
6908                 && !CvCONST(destructor)
6909                 /* Don't bother calling an empty destructor or one that
6910                    returns immediately. */
6911                 && (CvISXSUB(destructor)
6912                 || (CvSTART(destructor)
6913                     && (CvSTART(destructor)->op_next->op_type
6914                                         != OP_LEAVESUB)
6915                     && (CvSTART(destructor)->op_next->op_type
6916                                         != OP_PUSHMARK
6917                         || CvSTART(destructor)->op_next->op_next->op_type
6918                                         != OP_RETURN
6919                        )
6920                    ))
6921                )
6922             {
6923                 SV* const tmpref = newRV(sv);
6924                 SvREADONLY_on(tmpref); /* DESTROY() could be naughty */
6925                 ENTER;
6926                 PUSHSTACKi(PERLSI_DESTROY);
6927                 EXTEND(SP, 2);
6928                 PUSHMARK(SP);
6929                 PUSHs(tmpref);
6930                 PUTBACK;
6931                 call_sv(MUTABLE_SV(destructor),
6932                             G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
6933                 POPSTACK;
6934                 SPAGAIN;
6935                 LEAVE;
6936                 if(SvREFCNT(tmpref) < 2) {
6937                     /* tmpref is not kept alive! */
6938                     SvREFCNT(sv)--;
6939                     SvRV_set(tmpref, NULL);
6940                     SvROK_off(tmpref);
6941                 }
6942                 SvREFCNT_dec_NN(tmpref);
6943             }
6944           }
6945         } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
6946
6947
6948         if (check_refcnt && SvREFCNT(sv)) {
6949             if (PL_in_clean_objs)
6950                 Perl_croak(aTHX_
6951                   "DESTROY created new reference to dead object '%"HEKf"'",
6952                    HEKfARG(HvNAME_HEK(stash)));
6953             /* DESTROY gave object new lease on life */
6954             return FALSE;
6955         }
6956     }
6957
6958     if (SvOBJECT(sv)) {
6959         HV * const stash = SvSTASH(sv);
6960         /* Curse before freeing the stash, as freeing the stash could cause
6961            a recursive call into S_curse. */
6962         SvOBJECT_off(sv);       /* Curse the object. */
6963         SvSTASH_set(sv,0);      /* SvREFCNT_dec may try to read this */
6964         SvREFCNT_dec(stash); /* possibly of changed persuasion */
6965     }
6966     return TRUE;
6967 }
6968
6969 /*
6970 =for apidoc sv_newref
6971
6972 Increment an SV's reference count.  Use the C<SvREFCNT_inc()> wrapper
6973 instead.
6974
6975 =cut
6976 */
6977
6978 SV *
6979 Perl_sv_newref(pTHX_ SV *const sv)
6980 {
6981     PERL_UNUSED_CONTEXT;
6982     if (sv)
6983         (SvREFCNT(sv))++;
6984     return sv;
6985 }
6986
6987 /*
6988 =for apidoc sv_free
6989
6990 Decrement an SV's reference count, and if it drops to zero, call
6991 C<sv_clear> to invoke destructors and free up any memory used by
6992 the body; finally, deallocate the SV's head itself.
6993 Normally called via a wrapper macro C<SvREFCNT_dec>.
6994
6995 =cut
6996 */
6997
6998 void
6999 Perl_sv_free(pTHX_ SV *const sv)
7000 {
7001     SvREFCNT_dec(sv);
7002 }
7003
7004
7005 /* Private helper function for SvREFCNT_dec().
7006  * Called with rc set to original SvREFCNT(sv), where rc == 0 or 1 */
7007
7008 void
7009 Perl_sv_free2(pTHX_ SV *const sv, const U32 rc)
7010 {
7011     dVAR;
7012
7013     PERL_ARGS_ASSERT_SV_FREE2;
7014
7015     if (LIKELY( rc == 1 )) {
7016         /* normal case */
7017         SvREFCNT(sv) = 0;
7018
7019 #ifdef DEBUGGING
7020         if (SvTEMP(sv)) {
7021             Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING),
7022                              "Attempt to free temp prematurely: SV 0x%"UVxf
7023                              pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
7024             return;
7025         }
7026 #endif
7027         if (SvIMMORTAL(sv)) {
7028             /* make sure SvREFCNT(sv)==0 happens very seldom */
7029             SvREFCNT(sv) = SvREFCNT_IMMORTAL;
7030             return;
7031         }
7032         sv_clear(sv);
7033         if (! SvREFCNT(sv)) /* may have have been resurrected */
7034             del_SV(sv);
7035         return;
7036     }
7037
7038     /* handle exceptional cases */
7039
7040     assert(rc == 0);
7041
7042     if (SvFLAGS(sv) & SVf_BREAK)
7043         /* this SV's refcnt has been artificially decremented to
7044          * trigger cleanup */
7045         return;
7046     if (PL_in_clean_all) /* All is fair */
7047         return;
7048     if (SvIMMORTAL(sv)) {
7049         /* make sure SvREFCNT(sv)==0 happens very seldom */
7050         SvREFCNT(sv) = SvREFCNT_IMMORTAL;
7051         return;
7052     }
7053     if (ckWARN_d(WARN_INTERNAL)) {
7054 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
7055         Perl_dump_sv_child(aTHX_ sv);
7056 #else
7057     #ifdef DEBUG_LEAKING_SCALARS
7058         sv_dump(sv);
7059     #endif
7060 #ifdef DEBUG_LEAKING_SCALARS_ABORT
7061         if (PL_warnhook == PERL_WARNHOOK_FATAL
7062             || ckDEAD(packWARN(WARN_INTERNAL))) {
7063             /* Don't let Perl_warner cause us to escape our fate:  */
7064             abort();
7065         }
7066 #endif
7067         /* This may not return:  */
7068         Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
7069                     "Attempt to free unreferenced scalar: SV 0x%"UVxf
7070                     pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
7071 #endif
7072     }
7073 #ifdef DEBUG_LEAKING_SCALARS_ABORT
7074     abort();
7075 #endif
7076
7077 }
7078
7079
7080 /*
7081 =for apidoc sv_len
7082
7083 Returns the length of the string in the SV.  Handles magic and type
7084 coercion and sets the UTF8 flag appropriately.  See also C<SvCUR>, which
7085 gives raw access to the xpv_cur slot.
7086
7087 =cut
7088 */
7089
7090 STRLEN
7091 Perl_sv_len(pTHX_ SV *const sv)
7092 {
7093     STRLEN len;
7094
7095     if (!sv)
7096         return 0;
7097
7098     (void)SvPV_const(sv, len);
7099     return len;
7100 }
7101
7102 /*
7103 =for apidoc sv_len_utf8
7104
7105 Returns the number of characters in the string in an SV, counting wide
7106 UTF-8 bytes as a single character.  Handles magic and type coercion.
7107
7108 =cut
7109 */
7110
7111 /*
7112  * The length is cached in PERL_MAGIC_utf8, in the mg_len field.  Also the
7113  * mg_ptr is used, by sv_pos_u2b() and sv_pos_b2u() - see the comments below.
7114  * (Note that the mg_len is not the length of the mg_ptr field.
7115  * This allows the cache to store the character length of the string without
7116  * needing to malloc() extra storage to attach to the mg_ptr.)
7117  *
7118  */
7119
7120 STRLEN
7121 Perl_sv_len_utf8(pTHX_ SV *const sv)
7122 {
7123     if (!sv)
7124         return 0;
7125
7126     SvGETMAGIC(sv);
7127     return sv_len_utf8_nomg(sv);
7128 }
7129
7130 STRLEN
7131 Perl_sv_len_utf8_nomg(pTHX_ SV * const sv)
7132 {
7133     STRLEN len;
7134     const U8 *s = (U8*)SvPV_nomg_const(sv, len);
7135
7136     PERL_ARGS_ASSERT_SV_LEN_UTF8_NOMG;
7137
7138     if (PL_utf8cache && SvUTF8(sv)) {
7139             STRLEN ulen;
7140             MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : NULL;
7141
7142             if (mg && (mg->mg_len != -1 || mg->mg_ptr)) {
7143                 if (mg->mg_len != -1)
7144                     ulen = mg->mg_len;
7145                 else {
7146                     /* We can use the offset cache for a headstart.
7147                        The longer value is stored in the first pair.  */
7148                     STRLEN *cache = (STRLEN *) mg->mg_ptr;
7149
7150                     ulen = cache[0] + Perl_utf8_length(aTHX_ s + cache[1],
7151                                                        s + len);
7152                 }
7153                 
7154                 if (PL_utf8cache < 0) {
7155                     const STRLEN real = Perl_utf8_length(aTHX_ s, s + len);
7156                     assert_uft8_cache_coherent("sv_len_utf8", ulen, real, sv);
7157                 }
7158             }
7159             else {
7160                 ulen = Perl_utf8_length(aTHX_ s, s + len);
7161                 utf8_mg_len_cache_update(sv, &mg, ulen);
7162             }
7163             return ulen;
7164     }
7165     return SvUTF8(sv) ? Perl_utf8_length(aTHX_ s, s + len) : len;
7166 }
7167
7168 /* Walk forwards to find the byte corresponding to the passed in UTF-8
7169    offset.  */
7170 static STRLEN
7171 S_sv_pos_u2b_forwards(const U8 *const start, const U8 *const send,
7172                       STRLEN *const uoffset_p, bool *const at_end)
7173 {
7174     const U8 *s = start;
7175     STRLEN uoffset = *uoffset_p;
7176
7177     PERL_ARGS_ASSERT_SV_POS_U2B_FORWARDS;
7178
7179     while (s < send && uoffset) {
7180         --uoffset;
7181         s += UTF8SKIP(s);
7182     }
7183     if (s == send) {
7184         *at_end = TRUE;
7185     }
7186     else if (s > send) {
7187         *at_end = TRUE;
7188         /* This is the existing behaviour. Possibly it should be a croak, as
7189            it's actually a bounds error  */
7190         s = send;
7191     }
7192     *uoffset_p -= uoffset;
7193     return s - start;
7194 }
7195
7196 /* Given the length of the string in both bytes and UTF-8 characters, decide
7197    whether to walk forwards or backwards to find the byte corresponding to
7198    the passed in UTF-8 offset.  */
7199 static STRLEN
7200 S_sv_pos_u2b_midway(const U8 *const start, const U8 *send,
7201                     STRLEN uoffset, const STRLEN uend)
7202 {
7203     STRLEN backw = uend - uoffset;
7204
7205     PERL_ARGS_ASSERT_SV_POS_U2B_MIDWAY;
7206
7207     if (uoffset < 2 * backw) {
7208         /* The assumption is that going forwards is twice the speed of going
7209            forward (that's where the 2 * backw comes from).
7210            (The real figure of course depends on the UTF-8 data.)  */
7211         const U8 *s = start;
7212
7213         while (s < send && uoffset--)
7214             s += UTF8SKIP(s);
7215         assert (s <= send);
7216         if (s > send)
7217             s = send;
7218         return s - start;
7219     }
7220
7221     while (backw--) {
7222         send--;
7223         while (UTF8_IS_CONTINUATION(*send))
7224             send--;
7225     }
7226     return send - start;
7227 }
7228
7229 /* For the string representation of the given scalar, find the byte
7230    corresponding to the passed in UTF-8 offset.  uoffset0 and boffset0
7231    give another position in the string, *before* the sought offset, which
7232    (which is always true, as 0, 0 is a valid pair of positions), which should
7233    help reduce the amount of linear searching.
7234    If *mgp is non-NULL, it should point to the UTF-8 cache magic, which
7235    will be used to reduce the amount of linear searching. The cache will be
7236    created if necessary, and the found value offered to it for update.  */
7237 static STRLEN
7238 S_sv_pos_u2b_cached(pTHX_ SV *const sv, MAGIC **const mgp, const U8 *const start,
7239                     const U8 *const send, STRLEN uoffset,
7240                     STRLEN uoffset0, STRLEN boffset0)
7241 {
7242     STRLEN boffset = 0; /* Actually always set, but let's keep gcc happy.  */
7243     bool found = FALSE;
7244     bool at_end = FALSE;
7245
7246     PERL_ARGS_ASSERT_SV_POS_U2B_CACHED;
7247
7248     assert (uoffset >= uoffset0);
7249
7250     if (!uoffset)
7251         return 0;
7252
7253     if (!SvREADONLY(sv) && !SvGMAGICAL(sv) && SvPOK(sv)
7254         && PL_utf8cache
7255         && (*mgp || (SvTYPE(sv) >= SVt_PVMG &&
7256                      (*mgp = mg_find(sv, PERL_MAGIC_utf8))))) {
7257         if ((*mgp)->mg_ptr) {
7258             STRLEN *cache = (STRLEN *) (*mgp)->mg_ptr;
7259             if (cache[0] == uoffset) {
7260                 /* An exact match. */
7261                 return cache[1];
7262             }
7263             if (cache[2] == uoffset) {
7264                 /* An exact match. */
7265                 return cache[3];
7266             }
7267
7268             if (cache[0] < uoffset) {
7269                 /* The cache already knows part of the way.   */
7270                 if (cache[0] > uoffset0) {
7271                     /* The cache knows more than the passed in pair  */
7272                     uoffset0 = cache[0];
7273                     boffset0 = cache[1];
7274                 }
7275                 if ((*mgp)->mg_len != -1) {
7276                     /* And we know the end too.  */
7277                     boffset = boffset0
7278                         + sv_pos_u2b_midway(start + boffset0, send,
7279                                               uoffset - uoffset0,
7280                                               (*mgp)->mg_len - uoffset0);
7281                 } else {
7282                     uoffset -= uoffset0;
7283                     boffset = boffset0
7284                         + sv_pos_u2b_forwards(start + boffset0,
7285                                               send, &uoffset, &at_end);
7286                     uoffset += uoffset0;
7287                 }
7288             }
7289             else if (cache[2] < uoffset) {
7290                 /* We're between the two cache entries.  */
7291                 if (cache[2] > uoffset0) {
7292                     /* and the cache knows more than the passed in pair  */
7293                     uoffset0 = cache[2];
7294                     boffset0 = cache[3];
7295                 }
7296
7297                 boffset = boffset0
7298                     + sv_pos_u2b_midway(start + boffset0,
7299                                           start + cache[1],
7300                                           uoffset - uoffset0,
7301                                           cache[0] - uoffset0);
7302             } else {
7303                 boffset = boffset0
7304                     + sv_pos_u2b_midway(start + boffset0,
7305                                           start + cache[3],
7306                                           uoffset - uoffset0,
7307                                           cache[2] - uoffset0);
7308             }
7309             found = TRUE;
7310         }
7311         else if ((*mgp)->mg_len != -1) {
7312             /* If we can take advantage of a passed in offset, do so.  */
7313             /* In fact, offset0 is either 0, or less than offset, so don't
7314                need to worry about the other possibility.  */
7315             boffset = boffset0
7316                 + sv_pos_u2b_midway(start + boffset0, send,
7317                                       uoffset - uoffset0,
7318                                       (*mgp)->mg_len - uoffset0);
7319             found = TRUE;
7320         }
7321     }
7322
7323     if (!found || PL_utf8cache < 0) {
7324         STRLEN real_boffset;
7325         uoffset -= uoffset0;
7326         real_boffset = boffset0 + sv_pos_u2b_forwards(start + boffset0,
7327                                                       send, &uoffset, &at_end);
7328         uoffset += uoffset0;
7329
7330         if (found && PL_utf8cache < 0)
7331             assert_uft8_cache_coherent("sv_pos_u2b_cache", boffset,
7332                                        real_boffset, sv);
7333         boffset = real_boffset;
7334     }
7335
7336     if (PL_utf8cache && !SvGMAGICAL(sv) && SvPOK(sv)) {
7337         if (at_end)
7338             utf8_mg_len_cache_update(sv, mgp, uoffset);
7339         else
7340             utf8_mg_pos_cache_update(sv, mgp, boffset, uoffset, send - start);
7341     }
7342     return boffset;
7343 }
7344
7345
7346 /*
7347 =for apidoc sv_pos_u2b_flags
7348
7349 Converts the offset from a count of UTF-8 chars from
7350 the start of the string, to a count of the equivalent number of bytes; if
7351 lenp is non-zero, it does the same to lenp, but this time starting from
7352 the offset, rather than from the start
7353 of the string.  Handles type coercion.
7354 I<flags> is passed to C<SvPV_flags>, and usually should be
7355 C<SV_GMAGIC|SV_CONST_RETURN> to handle magic.
7356
7357 =cut
7358 */
7359
7360 /*
7361  * sv_pos_u2b_flags() uses, like sv_pos_b2u(), the mg_ptr of the potential
7362  * PERL_MAGIC_utf8 of the sv to store the mapping between UTF-8 and
7363  * byte offsets.  See also the comments of S_utf8_mg_pos_cache_update().
7364  *
7365  */
7366
7367 STRLEN
7368 Perl_sv_pos_u2b_flags(pTHX_ SV *const sv, STRLEN uoffset, STRLEN *const lenp,
7369                       U32 flags)
7370 {
7371     const U8 *start;
7372     STRLEN len;
7373     STRLEN boffset;
7374
7375     PERL_ARGS_ASSERT_SV_POS_U2B_FLAGS;
7376
7377     start = (U8*)SvPV_flags(sv, len, flags);
7378     if (len) {
7379         const U8 * const send = start + len;
7380         MAGIC *mg = NULL;
7381         boffset = sv_pos_u2b_cached(sv, &mg, start, send, uoffset, 0, 0);
7382
7383         if (lenp
7384             && *lenp /* don't bother doing work for 0, as its bytes equivalent
7385                         is 0, and *lenp is already set to that.  */) {
7386             /* Convert the relative offset to absolute.  */
7387             const STRLEN uoffset2 = uoffset + *lenp;
7388             const STRLEN boffset2
7389                 = sv_pos_u2b_cached(sv, &mg, start, send, uoffset2,
7390                                       uoffset, boffset) - boffset;
7391
7392             *lenp = boffset2;
7393         }
7394     } else {
7395         if (lenp)
7396             *lenp = 0;
7397         boffset = 0;
7398     }
7399
7400     return boffset;
7401 }
7402
7403 /*
7404 =for apidoc sv_pos_u2b
7405
7406 Converts the value pointed to by offsetp from a count of UTF-8 chars from
7407 the start of the string, to a count of the equivalent number of bytes; if
7408 lenp is non-zero, it does the same to lenp, but this time starting from
7409 the offset, rather than from the start of the string.  Handles magic and
7410 type coercion.
7411
7412 Use C<sv_pos_u2b_flags> in preference, which correctly handles strings longer
7413 than 2Gb.
7414
7415 =cut
7416 */
7417
7418 /*
7419  * sv_pos_u2b() uses, like sv_pos_b2u(), the mg_ptr of the potential
7420  * PERL_MAGIC_utf8 of the sv to store the mapping between UTF-8 and
7421  * byte offsets.  See also the comments of S_utf8_mg_pos_cache_update().
7422  *
7423  */
7424
7425 /* This function is subject to size and sign problems */
7426
7427 void
7428 Perl_sv_pos_u2b(pTHX_ SV *const sv, I32 *const offsetp, I32 *const lenp)
7429 {
7430     PERL_ARGS_ASSERT_SV_POS_U2B;
7431
7432     if (lenp) {
7433         STRLEN ulen = (STRLEN)*lenp;
7434         *offsetp = (I32)sv_pos_u2b_flags(sv, (STRLEN)*offsetp, &ulen,
7435                                          SV_GMAGIC|SV_CONST_RETURN);
7436         *lenp = (I32)ulen;
7437     } else {
7438         *offsetp = (I32)sv_pos_u2b_flags(sv, (STRLEN)*offsetp, NULL,
7439                                          SV_GMAGIC|SV_CONST_RETURN);
7440     }
7441 }
7442
7443 static void
7444 S_utf8_mg_len_cache_update(pTHX_ SV *const sv, MAGIC **const mgp,
7445                            const STRLEN ulen)
7446 {
7447     PERL_ARGS_ASSERT_UTF8_MG_LEN_CACHE_UPDATE;
7448     if (SvREADONLY(sv) || SvGMAGICAL(sv) || !SvPOK(sv))
7449         return;
7450
7451     if (!*mgp && (SvTYPE(sv) < SVt_PVMG ||
7452                   !(*mgp = mg_find(sv, PERL_MAGIC_utf8)))) {
7453         *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, &PL_vtbl_utf8, 0, 0);
7454     }
7455     assert(*mgp);
7456
7457     (*mgp)->mg_len = ulen;
7458 }
7459
7460 /* Create and update the UTF8 magic offset cache, with the proffered utf8/
7461    byte length pairing. The (byte) length of the total SV is passed in too,
7462    as blen, because for some (more esoteric) SVs, the call to SvPV_const()
7463    may not have updated SvCUR, so we can't rely on reading it directly.
7464
7465    The proffered utf8/byte length pairing isn't used if the cache already has
7466    two pairs, and swapping either for the proffered pair would increase the
7467    RMS of the intervals between known byte offsets.
7468
7469    The cache itself consists of 4 STRLEN values
7470    0: larger UTF-8 offset
7471    1: corresponding byte offset
7472    2: smaller UTF-8 offset
7473    3: corresponding byte offset
7474
7475    Unused cache pairs have the value 0, 0.
7476    Keeping the cache "backwards" means that the invariant of
7477    cache[0] >= cache[2] is maintained even with empty slots, which means that
7478    the code that uses it doesn't need to worry if only 1 entry has actually
7479    been set to non-zero.  It also makes the "position beyond the end of the
7480    cache" logic much simpler, as the first slot is always the one to start
7481    from.   
7482 */
7483 static void
7484 S_utf8_mg_pos_cache_update(pTHX_ SV *const sv, MAGIC **const mgp, const STRLEN byte,
7485                            const STRLEN utf8, const STRLEN blen)
7486 {
7487     STRLEN *cache;
7488
7489     PERL_ARGS_ASSERT_UTF8_MG_POS_CACHE_UPDATE;
7490
7491     if (SvREADONLY(sv))
7492         return;
7493
7494     if (!*mgp && (SvTYPE(sv) < SVt_PVMG ||
7495                   !(*mgp = mg_find(sv, PERL_MAGIC_utf8)))) {
7496         *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, (MGVTBL*)&PL_vtbl_utf8, 0,
7497                            0);
7498         (*mgp)->mg_len = -1;
7499     }
7500     assert(*mgp);
7501
7502     if (!(cache = (STRLEN *)(*mgp)->mg_ptr)) {
7503         Newxz(cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
7504         (*mgp)->mg_ptr = (char *) cache;
7505     }
7506     assert(cache);
7507
7508     if (PL_utf8cache < 0 && SvPOKp(sv)) {
7509         /* SvPOKp() because, if sv is a reference, then SvPVX() is actually
7510            a pointer.  Note that we no longer cache utf8 offsets on refer-
7511            ences, but this check is still a good idea, for robustness.  */
7512         const U8 *start = (const U8 *) SvPVX_const(sv);
7513         const STRLEN realutf8 = utf8_length(start, start + byte);
7514
7515         assert_uft8_cache_coherent("utf8_mg_pos_cache_update", utf8, realutf8,
7516                                    sv);
7517     }
7518
7519     /* Cache is held with the later position first, to simplify the code
7520        that deals with unbounded ends.  */
7521        
7522     ASSERT_UTF8_CACHE(cache);
7523     if (cache[1] == 0) {
7524         /* Cache is totally empty  */
7525         cache[0] = utf8;
7526         cache[1] = byte;
7527     } else if (cache[3] == 0) {
7528         if (byte > cache[1]) {
7529             /* New one is larger, so goes first.  */
7530             cache[2] = cache[0];
7531             cache[3] = cache[1];
7532             cache[0] = utf8;
7533             cache[1] = byte;
7534         } else {
7535             cache[2] = utf8;
7536             cache[3] = byte;
7537         }
7538     } else {
7539 /* float casts necessary? XXX */
7540 #define THREEWAY_SQUARE(a,b,c,d) \
7541             ((float)((d) - (c))) * ((float)((d) - (c))) \
7542             + ((float)((c) - (b))) * ((float)((c) - (b))) \
7543                + ((float)((b) - (a))) * ((float)((b) - (a)))
7544
7545         /* Cache has 2 slots in use, and we know three potential pairs.
7546            Keep the two that give the lowest RMS distance. Do the
7547            calculation in bytes simply because we always know the byte
7548            length.  squareroot has the same ordering as the positive value,
7549            so don't bother with the actual square root.  */
7550         if (byte > cache[1]) {
7551             /* New position is after the existing pair of pairs.  */
7552             const float keep_earlier
7553                 = THREEWAY_SQUARE(0, cache[3], byte, blen);
7554             const float keep_later
7555                 = THREEWAY_SQUARE(0, cache[1], byte, blen);
7556
7557             if (keep_later < keep_earlier) {
7558                 cache[2] = cache[0];
7559                 cache[3] = cache[1];
7560             }
7561             cache[0] = utf8;
7562             cache[1] = byte;
7563         }
7564         else {
7565             const float keep_later = THREEWAY_SQUARE(0, byte, cache[1], blen);
7566             float b, c, keep_earlier;
7567             if (byte > cache[3]) {
7568                 /* New position is between the existing pair of pairs.  */
7569                 b = (float)cache[3];
7570                 c = (float)byte;
7571             } else {
7572                 /* New position is before the existing pair of pairs.  */
7573                 b = (float)byte;
7574                 c = (float)cache[3];
7575             }
7576             keep_earlier = THREEWAY_SQUARE(0, b, c, blen);
7577             if (byte > cache[3]) {
7578                 if (keep_later < keep_earlier) {
7579                     cache[2] = utf8;
7580                     cache[3] = byte;
7581                 }
7582                 else {
7583                     cache[0] = utf8;
7584                     cache[1] = byte;
7585                 }
7586             }
7587             else {
7588                 if (! (keep_later < keep_earlier)) {
7589                     cache[0] = cache[2];
7590                     cache[1] = cache[3];
7591                 }
7592                 cache[2] = utf8;
7593                 cache[3] = byte;
7594             }
7595         }
7596     }
7597     ASSERT_UTF8_CACHE(cache);
7598 }
7599
7600 /* We already know all of the way, now we may be able to walk back.  The same
7601    assumption is made as in S_sv_pos_u2b_midway(), namely that walking
7602    backward is half the speed of walking forward. */
7603 static STRLEN
7604 S_sv_pos_b2u_midway(pTHX_ const U8 *const s, const U8 *const target,
7605                     const U8 *end, STRLEN endu)
7606 {
7607     const STRLEN forw = target - s;
7608     STRLEN backw = end - target;
7609
7610     PERL_ARGS_ASSERT_SV_POS_B2U_MIDWAY;
7611
7612     if (forw < 2 * backw) {
7613         return utf8_length(s, target);
7614     }
7615
7616     while (end > target) {
7617         end--;
7618         while (UTF8_IS_CONTINUATION(*end)) {
7619             end--;
7620         }
7621         endu--;
7622     }
7623     return endu;
7624 }
7625
7626 /*
7627 =for apidoc sv_pos_b2u_flags
7628
7629 Converts the offset from a count of bytes from the start of the string, to
7630 a count of the equivalent number of UTF-8 chars.  Handles type coercion.
7631 I<flags> is passed to C<SvPV_flags>, and usually should be
7632 C<SV_GMAGIC|SV_CONST_RETURN> to handle magic.
7633
7634 =cut
7635 */
7636
7637 /*
7638  * sv_pos_b2u_flags() uses, like sv_pos_u2b_flags(), the mg_ptr of the
7639  * potential PERL_MAGIC_utf8 of the sv to store the mapping between UTF-8
7640  * and byte offsets.
7641  *
7642  */
7643 STRLEN
7644 Perl_sv_pos_b2u_flags(pTHX_ SV *const sv, STRLEN const offset, U32 flags)
7645 {
7646     const U8* s;
7647     STRLEN len = 0; /* Actually always set, but let's keep gcc happy.  */
7648     STRLEN blen;
7649     MAGIC* mg = NULL;
7650     const U8* send;
7651     bool found = FALSE;
7652
7653     PERL_ARGS_ASSERT_SV_POS_B2U_FLAGS;
7654
7655     s = (const U8*)SvPV_flags(sv, blen, flags);
7656
7657     if (blen < offset)
7658         Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset, blen=%"UVuf
7659                    ", byte=%"UVuf, (UV)blen, (UV)offset);
7660
7661     send = s + offset;
7662
7663     if (!SvREADONLY(sv)
7664         && PL_utf8cache
7665         && SvTYPE(sv) >= SVt_PVMG
7666         && (mg = mg_find(sv, PERL_MAGIC_utf8)))
7667     {
7668         if (mg->mg_ptr) {
7669             STRLEN * const cache = (STRLEN *) mg->mg_ptr;
7670             if (cache[1] == offset) {
7671                 /* An exact match. */
7672                 return cache[0];
7673             }
7674             if (cache[3] == offset) {
7675                 /* An exact match. */
7676                 return cache[2];
7677             }
7678
7679             if (cache[1] < offset) {
7680                 /* We already know part of the way. */
7681                 if (mg->mg_len != -1) {
7682                     /* Actually, we know the end too.  */
7683                     len = cache[0]
7684                         + S_sv_pos_b2u_midway(aTHX_ s + cache[1], send,
7685                                               s + blen, mg->mg_len - cache[0]);
7686                 } else {
7687                     len = cache[0] + utf8_length(s + cache[1], send);
7688                 }
7689             }
7690             else if (cache[3] < offset) {
7691                 /* We're between the two cached pairs, so we do the calculation
7692                    offset by the byte/utf-8 positions for the earlier pair,
7693                    then add the utf-8 characters from the string start to
7694                    there.  */
7695                 len = S_sv_pos_b2u_midway(aTHX_ s + cache[3], send,
7696                                           s + cache[1], cache[0] - cache[2])
7697                     + cache[2];
7698
7699             }
7700             else { /* cache[3] > offset */
7701                 len = S_sv_pos_b2u_midway(aTHX_ s, send, s + cache[3],
7702                                           cache[2]);
7703
7704             }
7705             ASSERT_UTF8_CACHE(cache);
7706             found = TRUE;
7707         } else if (mg->mg_len != -1) {
7708             len = S_sv_pos_b2u_midway(aTHX_ s, send, s + blen, mg->mg_len);
7709             found = TRUE;
7710         }
7711     }
7712     if (!found || PL_utf8cache < 0) {
7713         const STRLEN real_len = utf8_length(s, send);
7714
7715         if (found && PL_utf8cache < 0)
7716             assert_uft8_cache_coherent("sv_pos_b2u", len, real_len, sv);
7717         len = real_len;
7718     }
7719
7720     if (PL_utf8cache) {
7721         if (blen == offset)
7722             utf8_mg_len_cache_update(sv, &mg, len);
7723         else
7724             utf8_mg_pos_cache_update(sv, &mg, offset, len, blen);
7725     }
7726
7727     return len;
7728 }
7729
7730 /*
7731 =for apidoc sv_pos_b2u
7732
7733 Converts the value pointed to by offsetp from a count of bytes from the
7734 start of the string, to a count of the equivalent number of UTF-8 chars.
7735 Handles magic and type coercion.
7736
7737 Use C<sv_pos_b2u_flags> in preference, which correctly handles strings
7738 longer than 2Gb.
7739
7740 =cut
7741 */
7742
7743 /*
7744  * sv_pos_b2u() uses, like sv_pos_u2b(), the mg_ptr of the potential
7745  * PERL_MAGIC_utf8 of the sv to store the mapping between UTF-8 and
7746  * byte offsets.
7747  *
7748  */
7749 void
7750 Perl_sv_pos_b2u(pTHX_ SV *const sv, I32 *const offsetp)
7751 {
7752     PERL_ARGS_ASSERT_SV_POS_B2U;
7753
7754     if (!sv)
7755         return;
7756
7757     *offsetp = (I32)sv_pos_b2u_flags(sv, (STRLEN)*offsetp,
7758                                      SV_GMAGIC|SV_CONST_RETURN);
7759 }
7760
7761 static void
7762 S_assert_uft8_cache_coherent(pTHX_ const char *const func, STRLEN from_cache,
7763                              STRLEN real, SV *const sv)
7764 {
7765     PERL_ARGS_ASSERT_ASSERT_UFT8_CACHE_COHERENT;
7766
7767     /* As this is debugging only code, save space by keeping this test here,
7768        rather than inlining it in all the callers.  */
7769     if (from_cache == real)
7770         return;
7771
7772     /* Need to turn the assertions off otherwise we may recurse infinitely
7773        while printing error messages.  */
7774     SAVEI8(PL_utf8cache);
7775     PL_utf8cache = 0;
7776     Perl_croak(aTHX_ "panic: %s cache %"UVuf" real %"UVuf" for %"SVf,
7777                func, (UV) from_cache, (UV) real, SVfARG(sv));
7778 }
7779
7780 /*
7781 =for apidoc sv_eq
7782
7783 Returns a boolean indicating whether the strings in the two SVs are
7784 identical.  Is UTF-8 and 'use bytes' aware, handles get magic, and will
7785 coerce its args to strings if necessary.
7786
7787 =for apidoc sv_eq_flags
7788
7789 Returns a boolean indicating whether the strings in the two SVs are
7790 identical.  Is UTF-8 and 'use bytes' aware and coerces its args to strings
7791 if necessary.  If the flags include SV_GMAGIC, it handles get-magic, too.
7792
7793 =cut
7794 */
7795
7796 I32
7797 Perl_sv_eq_flags(pTHX_ SV *sv1, SV *sv2, const U32 flags)
7798 {
7799     const char *pv1;
7800     STRLEN cur1;
7801     const char *pv2;
7802     STRLEN cur2;
7803     I32  eq     = 0;
7804     SV* svrecode = NULL;
7805
7806     if (!sv1) {
7807         pv1 = "";
7808         cur1 = 0;
7809     }
7810     else {
7811         /* if pv1 and pv2 are the same, second SvPV_const call may
7812          * invalidate pv1 (if we are handling magic), so we may need to
7813          * make a copy */
7814         if (sv1 == sv2 && flags & SV_GMAGIC
7815          && (SvTHINKFIRST(sv1) || SvGMAGICAL(sv1))) {
7816             pv1 = SvPV_const(sv1, cur1);
7817             sv1 = newSVpvn_flags(pv1, cur1, SVs_TEMP | SvUTF8(sv2));
7818         }
7819         pv1 = SvPV_flags_const(sv1, cur1, flags);
7820     }
7821
7822     if (!sv2){
7823         pv2 = "";
7824         cur2 = 0;
7825     }
7826     else
7827         pv2 = SvPV_flags_const(sv2, cur2, flags);
7828
7829     if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
7830         /* Differing utf8ness.
7831          * Do not UTF8size the comparands as a side-effect. */
7832          if (IN_ENCODING) {
7833               if (SvUTF8(sv1)) {
7834                    svrecode = newSVpvn(pv2, cur2);
7835                    sv_recode_to_utf8(svrecode, _get_encoding());
7836                    pv2 = SvPV_const(svrecode, cur2);
7837               }
7838               else {
7839                    svrecode = newSVpvn(pv1, cur1);
7840                    sv_recode_to_utf8(svrecode, _get_encoding());
7841                    pv1 = SvPV_const(svrecode, cur1);
7842               }
7843               /* Now both are in UTF-8. */
7844               if (cur1 != cur2) {
7845                    SvREFCNT_dec_NN(svrecode);
7846                    return FALSE;
7847               }
7848          }
7849          else {
7850               if (SvUTF8(sv1)) {
7851                   /* sv1 is the UTF-8 one  */
7852                   return bytes_cmp_utf8((const U8*)pv2, cur2,
7853                                         (const U8*)pv1, cur1) == 0;
7854               }
7855               else {
7856                   /* sv2 is the UTF-8 one  */
7857                   return bytes_cmp_utf8((const U8*)pv1, cur1,
7858                                         (const U8*)pv2, cur2) == 0;
7859               }
7860          }
7861     }
7862
7863     if (cur1 == cur2)
7864         eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
7865         
7866     SvREFCNT_dec(svrecode);
7867
7868     return eq;
7869 }
7870
7871 /*
7872 =for apidoc sv_cmp
7873
7874 Compares the strings in two SVs.  Returns -1, 0, or 1 indicating whether the
7875 string in C<sv1> is less than, equal to, or greater than the string in
7876 C<sv2>.  Is UTF-8 and 'use bytes' aware, handles get magic, and will
7877 coerce its args to strings if necessary.  See also C<sv_cmp_locale>.
7878
7879 =for apidoc sv_cmp_flags
7880
7881 Compares the strings in two SVs.  Returns -1, 0, or 1 indicating whether the
7882 string in C<sv1> is less than, equal to, or greater than the string in
7883 C<sv2>.  Is UTF-8 and 'use bytes' aware and will coerce its args to strings
7884 if necessary.  If the flags include SV_GMAGIC, it handles get magic.  See
7885 also C<sv_cmp_locale_flags>.
7886
7887 =cut
7888 */
7889
7890 I32
7891 Perl_sv_cmp(pTHX_ SV *const sv1, SV *const sv2)
7892 {
7893     return sv_cmp_flags(sv1, sv2, SV_GMAGIC);
7894 }
7895
7896 I32
7897 Perl_sv_cmp_flags(pTHX_ SV *const sv1, SV *const sv2,
7898                   const U32 flags)
7899 {
7900     STRLEN cur1, cur2;
7901     const char *pv1, *pv2;
7902     I32  cmp;
7903     SV *svrecode = NULL;
7904
7905     if (!sv1) {
7906         pv1 = "";
7907         cur1 = 0;
7908     }
7909     else
7910         pv1 = SvPV_flags_const(sv1, cur1, flags);
7911
7912     if (!sv2) {
7913         pv2 = "";
7914         cur2 = 0;
7915     }
7916     else
7917         pv2 = SvPV_flags_const(sv2, cur2, flags);
7918
7919     if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
7920         /* Differing utf8ness.
7921          * Do not UTF8size the comparands as a side-effect. */
7922         if (SvUTF8(sv1)) {
7923             if (IN_ENCODING) {
7924                  svrecode = newSVpvn(pv2, cur2);
7925                  sv_recode_to_utf8(svrecode, _get_encoding());
7926                  pv2 = SvPV_const(svrecode, cur2);
7927             }
7928             else {
7929                 const int retval = -bytes_cmp_utf8((const U8*)pv2, cur2,
7930                                                    (const U8*)pv1, cur1);
7931                 return retval ? retval < 0 ? -1 : +1 : 0;
7932             }
7933         }
7934         else {
7935             if (IN_ENCODING) {
7936                  svrecode = newSVpvn(pv1, cur1);
7937                  sv_recode_to_utf8(svrecode, _get_encoding());
7938                  pv1 = SvPV_const(svrecode, cur1);
7939             }
7940             else {
7941                 const int retval = bytes_cmp_utf8((const U8*)pv1, cur1,
7942                                                   (const U8*)pv2, cur2);
7943                 return retval ? retval < 0 ? -1 : +1 : 0;
7944             }
7945         }
7946     }
7947
7948     if (!cur1) {
7949         cmp = cur2 ? -1 : 0;
7950     } else if (!cur2) {
7951         cmp = 1;
7952     } else {
7953         const I32 retval = memcmp((const void*)pv1, (const void*)pv2, cur1 < cur2 ? cur1 : cur2);
7954
7955         if (retval) {
7956             cmp = retval < 0 ? -1 : 1;
7957         } else if (cur1 == cur2) {
7958             cmp = 0;
7959         } else {
7960             cmp = cur1 < cur2 ? -1 : 1;
7961         }
7962     }
7963
7964     SvREFCNT_dec(svrecode);
7965
7966     return cmp;
7967 }
7968
7969 /*
7970 =for apidoc sv_cmp_locale
7971
7972 Compares the strings in two SVs in a locale-aware manner.  Is UTF-8 and
7973 'use bytes' aware, handles get magic, and will coerce its args to strings
7974 if necessary.  See also C<sv_cmp>.
7975
7976 =for apidoc sv_cmp_locale_flags
7977
7978 Compares the strings in two SVs in a locale-aware manner.  Is UTF-8 and
7979 'use bytes' aware and will coerce its args to strings if necessary.  If the
7980 flags contain SV_GMAGIC, it handles get magic.  See also C<sv_cmp_flags>.
7981
7982 =cut
7983 */
7984
7985 I32
7986 Perl_sv_cmp_locale(pTHX_ SV *const sv1, SV *const sv2)
7987 {
7988     return sv_cmp_locale_flags(sv1, sv2, SV_GMAGIC);
7989 }
7990
7991 I32
7992 Perl_sv_cmp_locale_flags(pTHX_ SV *const sv1, SV *const sv2,
7993                          const U32 flags)
7994 {
7995 #ifdef USE_LOCALE_COLLATE
7996
7997     char *pv1, *pv2;
7998     STRLEN len1, len2;
7999     I32 retval;
8000
8001     if (PL_collation_standard)
8002         goto raw_compare;
8003
8004     len1 = 0;
8005     pv1 = sv1 ? sv_collxfrm_flags(sv1, &len1, flags) : (char *) NULL;
8006     len2 = 0;
8007     pv2 = sv2 ? sv_collxfrm_flags(sv2, &len2, flags) : (char *) NULL;
8008
8009     if (!pv1 || !len1) {
8010         if (pv2 && len2)
8011             return -1;
8012         else
8013             goto raw_compare;
8014     }
8015     else {
8016         if (!pv2 || !len2)
8017             return 1;
8018     }
8019
8020     retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
8021
8022     if (retval)
8023         return retval < 0 ? -1 : 1;
8024
8025     /*
8026      * When the result of collation is equality, that doesn't mean
8027      * that there are no differences -- some locales exclude some
8028      * characters from consideration.  So to avoid false equalities,
8029      * we use the raw string as a tiebreaker.
8030      */
8031
8032   raw_compare:
8033     /* FALLTHROUGH */
8034
8035 #else
8036     PERL_UNUSED_ARG(flags);
8037 #endif /* USE_LOCALE_COLLATE */
8038
8039     return sv_cmp(sv1, sv2);
8040 }
8041
8042
8043 #ifdef USE_LOCALE_COLLATE
8044
8045 /*
8046 =for apidoc sv_collxfrm
8047
8048 This calls C<sv_collxfrm_flags> with the SV_GMAGIC flag.  See
8049 C<sv_collxfrm_flags>.
8050
8051 =for apidoc sv_collxfrm_flags
8052
8053 Add Collate Transform magic to an SV if it doesn't already have it.  If the
8054 flags contain SV_GMAGIC, it handles get-magic.
8055
8056 Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
8057 scalar data of the variable, but transformed to such a format that a normal
8058 memory comparison can be used to compare the data according to the locale
8059 settings.
8060
8061 =cut
8062 */
8063
8064 char *
8065 Perl_sv_collxfrm_flags(pTHX_ SV *const sv, STRLEN *const nxp, const I32 flags)
8066 {
8067     MAGIC *mg;
8068
8069     PERL_ARGS_ASSERT_SV_COLLXFRM_FLAGS;
8070
8071     mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
8072     if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
8073         const char *s;
8074         char *xf;
8075         STRLEN len, xlen;
8076
8077         if (mg)
8078             Safefree(mg->mg_ptr);
8079         s = SvPV_flags_const(sv, len, flags);
8080         if ((xf = mem_collxfrm(s, len, &xlen))) {
8081             if (! mg) {
8082 #ifdef PERL_OLD_COPY_ON_WRITE
8083                 if (SvIsCOW(sv))
8084                     sv_force_normal_flags(sv, 0);
8085 #endif
8086                 mg = sv_magicext(sv, 0, PERL_MAGIC_collxfrm, &PL_vtbl_collxfrm,
8087                                  0, 0);
8088                 assert(mg);
8089             }
8090             mg->mg_ptr = xf;
8091             mg->mg_len = xlen;
8092         }
8093         else {
8094             if (mg) {
8095                 mg->mg_ptr = NULL;
8096                 mg->mg_len = -1;
8097             }
8098         }
8099     }
8100     if (mg && mg->mg_ptr) {
8101         *nxp = mg->mg_len;
8102         return mg->mg_ptr + sizeof(PL_collation_ix);
8103     }
8104     else {
8105         *nxp = 0;
8106         return NULL;
8107     }
8108 }
8109
8110 #endif /* USE_LOCALE_COLLATE */
8111
8112 static char *
8113 S_sv_gets_append_to_utf8(pTHX_ SV *const sv, PerlIO *const fp, I32 append)
8114 {
8115     SV * const tsv = newSV(0);
8116     ENTER;
8117     SAVEFREESV(tsv);
8118     sv_gets(tsv, fp, 0);
8119     sv_utf8_upgrade_nomg(tsv);
8120     SvCUR_set(sv,append);
8121     sv_catsv(sv,tsv);
8122     LEAVE;
8123     return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
8124 }
8125
8126 static char *
8127 S_sv_gets_read_record(pTHX_ SV *const sv, PerlIO *const fp, I32 append)
8128 {
8129     SSize_t bytesread;
8130     const STRLEN recsize = SvUV(SvRV(PL_rs)); /* RsRECORD() guarantees > 0. */
8131       /* Grab the size of the record we're getting */
8132     char *buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append;
8133     
8134     /* Go yank in */
8135 #ifdef __VMS
8136     int fd;
8137     Stat_t st;
8138
8139     /* With a true, record-oriented file on VMS, we need to use read directly
8140      * to ensure that we respect RMS record boundaries.  The user is responsible
8141      * for providing a PL_rs value that corresponds to the FAB$W_MRS (maximum
8142      * record size) field.  N.B. This is likely to produce invalid results on
8143      * varying-width character data when a record ends mid-character.
8144      */
8145     fd = PerlIO_fileno(fp);
8146     if (fd != -1
8147         && PerlLIO_fstat(fd, &st) == 0
8148         && (st.st_fab_rfm == FAB$C_VAR
8149             || st.st_fab_rfm == FAB$C_VFC
8150             || st.st_fab_rfm == FAB$C_FIX)) {
8151
8152         bytesread = PerlLIO_read(fd, buffer, recsize);
8153     }
8154     else /* in-memory file from PerlIO::Scalar
8155           * or not a record-oriented file
8156           */
8157 #endif
8158     {
8159         bytesread = PerlIO_read(fp, buffer, recsize);
8160
8161         /* At this point, the logic in sv_get() means that sv will
8162            be treated as utf-8 if the handle is utf8.
8163         */
8164         if (PerlIO_isutf8(fp) && bytesread > 0) {
8165             char *bend = buffer + bytesread;
8166             char *bufp = buffer;
8167             size_t charcount = 0;
8168             bool charstart = TRUE;
8169             STRLEN skip = 0;
8170
8171             while (charcount < recsize) {
8172                 /* count accumulated characters */
8173                 while (bufp < bend) {
8174                     if (charstart) {
8175                         skip = UTF8SKIP(bufp);
8176                     }
8177                     if (bufp + skip > bend) {
8178                         /* partial at the end */
8179                         charstart = FALSE;
8180                         break;
8181                     }
8182                     else {
8183                         ++charcount;
8184                         bufp += skip;
8185                         charstart = TRUE;
8186                     }
8187                 }
8188
8189                 if (charcount < recsize) {
8190                     STRLEN readsize;
8191                     STRLEN bufp_offset = bufp - buffer;
8192                     SSize_t morebytesread;
8193
8194                     /* originally I read enough to fill any incomplete
8195                        character and the first byte of the next
8196                        character if needed, but if there's many
8197                        multi-byte encoded characters we're going to be
8198                        making a read call for every character beyond
8199                        the original read size.
8200
8201                        So instead, read the rest of the character if
8202                        any, and enough bytes to match at least the
8203                        start bytes for each character we're going to
8204                        read.
8205                     */
8206                     if (charstart)
8207                         readsize = recsize - charcount;
8208                     else 
8209                         readsize = skip - (bend - bufp) + recsize - charcount - 1;
8210                     buffer = SvGROW(sv, append + bytesread + readsize + 1) + append;
8211                     bend = buffer + bytesread;
8212                     morebytesread = PerlIO_read(fp, bend, readsize);
8213                     if (morebytesread <= 0) {
8214                         /* we're done, if we still have incomplete
8215                            characters the check code in sv_gets() will
8216                            warn about them.
8217
8218                            I'd originally considered doing
8219                            PerlIO_ungetc() on all but the lead
8220                            character of the incomplete character, but
8221                            read() doesn't do that, so I don't.
8222                         */
8223                         break;
8224                     }
8225
8226                     /* prepare to scan some more */
8227                     bytesread += morebytesread;
8228                     bend = buffer + bytesread;
8229                     bufp = buffer + bufp_offset;
8230                 }
8231             }
8232         }
8233     }
8234
8235     if (bytesread < 0)
8236         bytesread = 0;
8237     SvCUR_set(sv, bytesread + append);
8238     buffer[bytesread] = '\0';
8239     return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
8240 }
8241
8242 /*
8243 =for apidoc sv_gets
8244
8245 Get a line from the filehandle and store it into the SV, optionally
8246 appending to the currently-stored string.  If C<append> is not 0, the
8247 line is appended to the SV instead of overwriting it.  C<append> should
8248 be set to the byte offset that the appended string should start at
8249 in the SV (typically, C<SvCUR(sv)> is a suitable choice).
8250
8251 =cut
8252 */
8253
8254 char *
8255 Perl_sv_gets(pTHX_ SV *const sv, PerlIO *const fp, I32 append)
8256 {
8257     const char *rsptr;
8258     STRLEN rslen;
8259     STDCHAR rslast;
8260     STDCHAR *bp;
8261     SSize_t cnt;
8262     int i = 0;
8263     int rspara = 0;
8264
8265     PERL_ARGS_ASSERT_SV_GETS;
8266
8267     if (SvTHINKFIRST(sv))
8268         sv_force_normal_flags(sv, append ? 0 : SV_COW_DROP_PV);
8269     /* XXX. If you make this PVIV, then copy on write can copy scalars read
8270        from <>.
8271        However, perlbench says it's slower, because the existing swipe code
8272        is faster than copy on write.
8273        Swings and roundabouts.  */
8274     SvUPGRADE(sv, SVt_PV);
8275
8276     if (append) {
8277         /* line is going to be appended to the existing buffer in the sv */
8278         if (PerlIO_isutf8(fp)) {
8279             if (!SvUTF8(sv)) {
8280                 sv_utf8_upgrade_nomg(sv);
8281                 sv_pos_u2b(sv,&append,0);
8282             }
8283         } else if (SvUTF8(sv)) {
8284             return S_sv_gets_append_to_utf8(aTHX_ sv, fp, append);
8285         }
8286     }
8287
8288     SvPOK_only(sv);
8289     if (!append) {
8290         /* not appending - "clear" the string by setting SvCUR to 0,
8291          * the pv is still avaiable. */
8292         SvCUR_set(sv,0);
8293     }
8294     if (PerlIO_isutf8(fp))
8295         SvUTF8_on(sv);
8296
8297     if (IN_PERL_COMPILETIME) {
8298         /* we always read code in line mode */
8299         rsptr = "\n";
8300         rslen = 1;
8301     }
8302     else if (RsSNARF(PL_rs)) {
8303         /* If it is a regular disk file use size from stat() as estimate
8304            of amount we are going to read -- may result in mallocing
8305            more memory than we really need if the layers below reduce
8306            the size we read (e.g. CRLF or a gzip layer).
8307          */
8308         Stat_t st;
8309         if (!PerlLIO_fstat(PerlIO_fileno(fp), &st) && S_ISREG(st.st_mode))  {
8310             const Off_t offset = PerlIO_tell(fp);
8311             if (offset != (Off_t) -1 && st.st_size + append > offset) {
8312 #ifdef PERL_NEW_COPY_ON_WRITE
8313                 /* Add an extra byte for the sake of copy-on-write's
8314                  * buffer reference count. */
8315                 (void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 2));
8316 #else
8317                 (void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 1));
8318 #endif
8319             }
8320         }
8321         rsptr = NULL;
8322         rslen = 0;
8323     }
8324     else if (RsRECORD(PL_rs)) {
8325         return S_sv_gets_read_record(aTHX_ sv, fp, append);
8326     }
8327     else if (RsPARA(PL_rs)) {
8328         rsptr = "\n\n";
8329         rslen = 2;
8330         rspara = 1;
8331     }
8332     else {
8333         /* Get $/ i.e. PL_rs into same encoding as stream wants */
8334         if (PerlIO_isutf8(fp)) {
8335             rsptr = SvPVutf8(PL_rs, rslen);
8336         }
8337         else {
8338             if (SvUTF8(PL_rs)) {
8339                 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
8340                     Perl_croak(aTHX_ "Wide character in $/");
8341                 }
8342             }
8343             /* extract the raw pointer to the record separator */
8344             rsptr = SvPV_const(PL_rs, rslen);
8345         }
8346     }
8347
8348     /* rslast is the last character in the record separator
8349      * note we don't use rslast except when rslen is true, so the
8350      * null assign is a placeholder. */
8351     rslast = rslen ? rsptr[rslen - 1] : '\0';
8352
8353     if (rspara) {               /* have to do this both before and after */
8354         do {                    /* to make sure file boundaries work right */
8355             if (PerlIO_eof(fp))
8356                 return 0;
8357             i = PerlIO_getc(fp);
8358             if (i != '\n') {
8359                 if (i == -1)
8360                     return 0;
8361                 PerlIO_ungetc(fp,i);
8362                 break;
8363             }
8364         } while (i != EOF);
8365     }
8366
8367     /* See if we know enough about I/O mechanism to cheat it ! */
8368
8369     /* This used to be #ifdef test - it is made run-time test for ease
8370        of abstracting out stdio interface. One call should be cheap
8371        enough here - and may even be a macro allowing compile
8372        time optimization.
8373      */
8374
8375     if (PerlIO_fast_gets(fp)) {
8376     /*
8377      * We can do buffer based IO operations on this filehandle.
8378      *
8379      * This means we can bypass a lot of subcalls and process
8380      * the buffer directly, it also means we know the upper bound
8381      * on the amount of data we might read of the current buffer
8382      * into our sv. Knowing this allows us to preallocate the pv
8383      * to be able to hold that maximum, which allows us to simplify
8384      * a lot of logic. */
8385
8386     /*
8387      * We're going to steal some values from the stdio struct
8388      * and put EVERYTHING in the innermost loop into registers.
8389      */
8390     STDCHAR *ptr;       /* pointer into fp's read-ahead buffer */
8391     STRLEN bpx;         /* length of the data in the target sv
8392                            used to fix pointers after a SvGROW */
8393     I32 shortbuffered;  /* If the pv buffer is shorter than the amount
8394                            of data left in the read-ahead buffer.
8395                            If 0 then the pv buffer can hold the full
8396                            amount left, otherwise this is the amount it
8397                            can hold. */
8398
8399 #if defined(__VMS) && defined(PERLIO_IS_STDIO)
8400     /* An ungetc()d char is handled separately from the regular
8401      * buffer, so we getc() it back out and stuff it in the buffer.
8402      */
8403     i = PerlIO_getc(fp);
8404     if (i == EOF) return 0;
8405     *(--((*fp)->_ptr)) = (unsigned char) i;
8406     (*fp)->_cnt++;
8407 #endif
8408
8409     /* Here is some breathtakingly efficient cheating */
8410
8411     /* When you read the following logic resist the urge to think
8412      * of record separators that are 1 byte long. They are an
8413      * uninteresting special (simple) case.
8414      *
8415      * Instead think of record separators which are at least 2 bytes
8416      * long, and keep in mind that we need to deal with such
8417      * separators when they cross a read-ahead buffer boundary.
8418      *
8419      * Also consider that we need to gracefully deal with separators
8420      * that may be longer than a single read ahead buffer.
8421      *
8422      * Lastly do not forget we want to copy the delimiter as well. We
8423      * are copying all data in the file _up_to_and_including_ the separator
8424      * itself.
8425      *
8426      * Now that you have all that in mind here is what is happening below:
8427      *
8428      * 1. When we first enter the loop we do some memory book keeping to see
8429      * how much free space there is in the target SV. (This sub assumes that
8430      * it is operating on the same SV most of the time via $_ and that it is
8431      * going to be able to reuse the same pv buffer each call.) If there is
8432      * "enough" room then we set "shortbuffered" to how much space there is
8433      * and start reading forward.
8434      *
8435      * 2. When we scan forward we copy from the read-ahead buffer to the target
8436      * SV's pv buffer. While we go we watch for the end of the read-ahead buffer,
8437      * and the end of the of pv, as well as for the "rslast", which is the last
8438      * char of the separator.
8439      *
8440      * 3. When scanning forward if we see rslast then we jump backwards in *pv*
8441      * (which has a "complete" record up to the point we saw rslast) and check
8442      * it to see if it matches the separator. If it does we are done. If it doesn't
8443      * we continue on with the scan/copy.
8444      *
8445      * 4. If we run out of read-ahead buffer (cnt goes to 0) then we have to get
8446      * the IO system to read the next buffer. We do this by doing a getc(), which
8447      * returns a single char read (or EOF), and prefills the buffer, and also
8448      * allows us to find out how full the buffer is.  We use this information to
8449      * SvGROW() the sv to the size remaining in the buffer, after which we copy
8450      * the returned single char into the target sv, and then go back into scan
8451      * forward mode.
8452      *
8453      * 5. If we run out of write-buffer then we SvGROW() it by the size of the
8454      * remaining space in the read-buffer.
8455      *
8456      * Note that this code despite its twisty-turny nature is pretty darn slick.
8457      * It manages single byte separators, multi-byte cross boundary separators,
8458      * and cross-read-buffer separators cleanly and efficiently at the cost
8459      * of potentially greatly overallocating the target SV.
8460      *
8461      * Yves
8462      */
8463
8464
8465     /* get the number of bytes remaining in the read-ahead buffer
8466      * on first call on a given fp this will return 0.*/
8467     cnt = PerlIO_get_cnt(fp);
8468
8469     /* make sure we have the room */
8470     if ((I32)(SvLEN(sv) - append) <= cnt + 1) {
8471         /* Not room for all of it
8472            if we are looking for a separator and room for some
8473          */
8474         if (rslen && cnt > 80 && (I32)SvLEN(sv) > append) {
8475             /* just process what we have room for */
8476             shortbuffered = cnt - SvLEN(sv) + append + 1;
8477             cnt -= shortbuffered;
8478         }
8479         else {
8480             /* ensure that the target sv has enough room to hold
8481              * the rest of the read-ahead buffer */
8482             shortbuffered = 0;
8483             /* remember that cnt can be negative */
8484             SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
8485         }
8486     }
8487     else {
8488         /* we have enough room to hold the full buffer, lets scream */
8489         shortbuffered = 0;
8490     }
8491
8492     /* extract the pointer to sv's string buffer, offset by append as necessary */
8493     bp = (STDCHAR*)SvPVX_const(sv) + append;  /* move these two too to registers */
8494     /* extract the point to the read-ahead buffer */
8495     ptr = (STDCHAR*)PerlIO_get_ptr(fp);
8496
8497     /* some trace debug output */
8498     DEBUG_P(PerlIO_printf(Perl_debug_log,
8499         "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
8500     DEBUG_P(PerlIO_printf(Perl_debug_log,
8501         "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%"IVdf", base=%"
8502          UVuf"\n",
8503                PTR2UV(PerlIO_get_ptr(fp)), (IV)PerlIO_get_cnt(fp),
8504                PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
8505
8506     for (;;) {
8507       screamer:
8508         /* if there is stuff left in the read-ahead buffer */
8509         if (cnt > 0) {
8510             /* if there is a separator */
8511             if (rslen) {
8512                 /* loop until we hit the end of the read-ahead buffer */
8513                 while (cnt > 0) {                    /* this     |  eat */
8514                     /* scan forward copying and searching for rslast as we go */
8515                     cnt--;
8516                     if ((*bp++ = *ptr++) == rslast)  /* really   |  dust */
8517                         goto thats_all_folks;        /* screams  |  sed :-) */
8518                 }
8519             }
8520             else {
8521                 /* no separator, slurp the full buffer */
8522                 Copy(ptr, bp, cnt, char);            /* this     |  eat */
8523                 bp += cnt;                           /* screams  |  dust */
8524                 ptr += cnt;                          /* louder   |  sed :-) */
8525                 cnt = 0;
8526                 assert (!shortbuffered);
8527                 goto cannot_be_shortbuffered;
8528             }
8529         }
8530         
8531         if (shortbuffered) {            /* oh well, must extend */
8532             /* we didnt have enough room to fit the line into the target buffer
8533              * so we must extend the target buffer and keep going */
8534             cnt = shortbuffered;
8535             shortbuffered = 0;
8536             bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
8537             SvCUR_set(sv, bpx);
8538             /* extned the target sv's buffer so it can hold the full read-ahead buffer */
8539             SvGROW(sv, SvLEN(sv) + append + cnt + 2);
8540             bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
8541             continue;
8542         }
8543
8544     cannot_be_shortbuffered:
8545         /* we need to refill the read-ahead buffer if possible */
8546
8547         DEBUG_P(PerlIO_printf(Perl_debug_log,
8548                              "Screamer: going to getc, ptr=%"UVuf", cnt=%"IVdf"\n",
8549                               PTR2UV(ptr),(IV)cnt));
8550         PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
8551
8552         DEBUG_Pv(PerlIO_printf(Perl_debug_log,
8553            "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%"IVdf", base=%"UVuf"\n",
8554             PTR2UV(PerlIO_get_ptr(fp)), (IV)PerlIO_get_cnt(fp),
8555             PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
8556
8557         /*
8558             call PerlIO_getc() to let it prefill the lookahead buffer
8559
8560             This used to call 'filbuf' in stdio form, but as that behaves like
8561             getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
8562             another abstraction.
8563
8564             Note we have to deal with the char in 'i' if we are not at EOF
8565         */
8566         i   = PerlIO_getc(fp);          /* get more characters */
8567
8568         DEBUG_Pv(PerlIO_printf(Perl_debug_log,
8569            "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%"IVdf", base=%"UVuf"\n",
8570             PTR2UV(PerlIO_get_ptr(fp)), (IV)PerlIO_get_cnt(fp),
8571             PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
8572
8573         /* find out how much is left in the read-ahead buffer, and rextract its pointer */
8574         cnt = PerlIO_get_cnt(fp);
8575         ptr = (STDCHAR*)PerlIO_get_ptr(fp);     /* reregisterize cnt and ptr */
8576         DEBUG_P(PerlIO_printf(Perl_debug_log,
8577             "Screamer: after getc, ptr=%"UVuf", cnt=%"IVdf"\n",
8578             PTR2UV(ptr),(IV)cnt));
8579
8580         if (i == EOF)                   /* all done for ever? */
8581             goto thats_really_all_folks;
8582
8583         /* make sure we have enough space in the target sv */
8584         bpx = bp - (STDCHAR*)SvPVX_const(sv);   /* box up before relocation */
8585         SvCUR_set(sv, bpx);
8586         SvGROW(sv, bpx + cnt + 2);
8587         bp = (STDCHAR*)SvPVX_const(sv) + bpx;   /* unbox after relocation */
8588
8589         /* copy of the char we got from getc() */
8590         *bp++ = (STDCHAR)i;             /* store character from PerlIO_getc */
8591
8592         /* make sure we deal with the i being the last character of a separator */
8593         if (rslen && (STDCHAR)i == rslast)  /* all done for now? */
8594             goto thats_all_folks;
8595     }
8596
8597   thats_all_folks:
8598     /* check if we have actually found the separator - only really applies
8599      * when rslen > 1 */
8600     if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX_const(sv)) < rslen) ||
8601           memNE((char*)bp - rslen, rsptr, rslen))
8602         goto screamer;                          /* go back to the fray */
8603   thats_really_all_folks:
8604     if (shortbuffered)
8605         cnt += shortbuffered;
8606         DEBUG_P(PerlIO_printf(Perl_debug_log,
8607              "Screamer: quitting, ptr=%"UVuf", cnt=%"IVdf"\n",PTR2UV(ptr),(IV)cnt));
8608     PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt);  /* put these back or we're in trouble */
8609     DEBUG_P(PerlIO_printf(Perl_debug_log,
8610         "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%"IVdf", base=%"UVuf
8611         "\n",
8612         PTR2UV(PerlIO_get_ptr(fp)), (IV)PerlIO_get_cnt(fp),
8613         PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
8614     *bp = '\0';
8615     SvCUR_set(sv, bp - (STDCHAR*)SvPVX_const(sv));      /* set length */
8616     DEBUG_P(PerlIO_printf(Perl_debug_log,
8617         "Screamer: done, len=%ld, string=|%.*s|\n",
8618         (long)SvCUR(sv),(int)SvCUR(sv),SvPVX_const(sv)));
8619     }
8620    else
8621     {
8622        /*The big, slow, and stupid way. */
8623 #ifdef USE_HEAP_INSTEAD_OF_STACK        /* Even slower way. */
8624         STDCHAR *buf = NULL;
8625         Newx(buf, 8192, STDCHAR);
8626         assert(buf);
8627 #else
8628         STDCHAR buf[8192];
8629 #endif
8630
8631       screamer2:
8632         if (rslen) {
8633             const STDCHAR * const bpe = buf + sizeof(buf);
8634             bp = buf;
8635             while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
8636                 ; /* keep reading */
8637             cnt = bp - buf;
8638         }
8639         else {
8640             cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
8641             /* Accommodate broken VAXC compiler, which applies U8 cast to
8642              * both args of ?: operator, causing EOF to change into 255
8643              */
8644             if (cnt > 0)
8645                  i = (U8)buf[cnt - 1];
8646             else
8647                  i = EOF;
8648         }
8649
8650         if (cnt < 0)
8651             cnt = 0;  /* we do need to re-set the sv even when cnt <= 0 */
8652         if (append)
8653             sv_catpvn_nomg(sv, (char *) buf, cnt);
8654         else
8655             sv_setpvn(sv, (char *) buf, cnt);   /* "nomg" is implied */
8656
8657         if (i != EOF &&                 /* joy */
8658             (!rslen ||
8659              SvCUR(sv) < rslen ||
8660              memNE(SvPVX_const(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
8661         {
8662             append = -1;
8663             /*
8664              * If we're reading from a TTY and we get a short read,
8665              * indicating that the user hit his EOF character, we need
8666              * to notice it now, because if we try to read from the TTY
8667              * again, the EOF condition will disappear.
8668              *
8669              * The comparison of cnt to sizeof(buf) is an optimization
8670              * that prevents unnecessary calls to feof().
8671              *
8672              * - jik 9/25/96
8673              */
8674             if (!(cnt < (I32)sizeof(buf) && PerlIO_eof(fp)))
8675                 goto screamer2;
8676         }
8677
8678 #ifdef USE_HEAP_INSTEAD_OF_STACK
8679         Safefree(buf);
8680 #endif
8681     }
8682
8683     if (rspara) {               /* have to do this both before and after */
8684         while (i != EOF) {      /* to make sure file boundaries work right */
8685             i = PerlIO_getc(fp);
8686             if (i != '\n') {
8687                 PerlIO_ungetc(fp,i);
8688                 break;
8689             }
8690         }
8691     }
8692
8693     return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
8694 }
8695
8696 /*
8697 =for apidoc sv_inc
8698
8699 Auto-increment of the value in the SV, doing string to numeric conversion
8700 if necessary.  Handles 'get' magic and operator overloading.
8701
8702 =cut
8703 */
8704
8705 void
8706 Perl_sv_inc(pTHX_ SV *const sv)
8707 {
8708     if (!sv)
8709         return;
8710     SvGETMAGIC(sv);
8711     sv_inc_nomg(sv);
8712 }
8713
8714 /*
8715 =for apidoc sv_inc_nomg
8716
8717 Auto-increment of the value in the SV, doing string to numeric conversion
8718 if necessary.  Handles operator overloading.  Skips handling 'get' magic.
8719
8720 =cut
8721 */
8722
8723 void
8724 Perl_sv_inc_nomg(pTHX_ SV *const sv)
8725 {
8726     char *d;
8727     int flags;
8728
8729     if (!sv)
8730         return;
8731     if (SvTHINKFIRST(sv)) {
8732         if (SvREADONLY(sv)) {
8733                 Perl_croak_no_modify();
8734         }
8735         if (SvROK(sv)) {
8736             IV i;
8737             if (SvAMAGIC(sv) && AMG_CALLunary(sv, inc_amg))
8738                 return;
8739             i = PTR2IV(SvRV(sv));
8740             sv_unref(sv);
8741             sv_setiv(sv, i);
8742         }
8743         else sv_force_normal_flags(sv, 0);
8744     }
8745     flags = SvFLAGS(sv);
8746     if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
8747         /* It's (privately or publicly) a float, but not tested as an
8748            integer, so test it to see. */
8749         (void) SvIV(sv);
8750         flags = SvFLAGS(sv);
8751     }
8752     if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
8753         /* It's publicly an integer, or privately an integer-not-float */
8754 #ifdef PERL_PRESERVE_IVUV
8755       oops_its_int:
8756 #endif
8757         if (SvIsUV(sv)) {
8758             if (SvUVX(sv) == UV_MAX)
8759                 sv_setnv(sv, UV_MAX_P1);
8760             else
8761                 (void)SvIOK_only_UV(sv);
8762                 SvUV_set(sv, SvUVX(sv) + 1);
8763         } else {
8764             if (SvIVX(sv) == IV_MAX)
8765                 sv_setuv(sv, (UV)IV_MAX + 1);
8766             else {
8767                 (void)SvIOK_only(sv);
8768                 SvIV_set(sv, SvIVX(sv) + 1);
8769             }   
8770         }
8771         return;
8772     }
8773     if (flags & SVp_NOK) {
8774         const NV was = SvNVX(sv);
8775         if (LIKELY(!Perl_isinfnan(was)) &&
8776             NV_OVERFLOWS_INTEGERS_AT &&
8777             was >= NV_OVERFLOWS_INTEGERS_AT) {
8778             /* diag_listed_as: Lost precision when %s %f by 1 */
8779             Perl_ck_warner(aTHX_ packWARN(WARN_IMPRECISION),
8780                            "Lost precision when incrementing %" NVff " by 1",
8781                            was);
8782         }
8783         (void)SvNOK_only(sv);
8784         SvNV_set(sv, was + 1.0);
8785         return;
8786     }
8787
8788     if (!(flags & SVp_POK) || !*SvPVX_const(sv)) {
8789         if ((flags & SVTYPEMASK) < SVt_PVIV)
8790             sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV ? SVt_PVIV : SVt_IV));
8791         (void)SvIOK_only(sv);
8792         SvIV_set(sv, 1);
8793         return;
8794     }
8795     d = SvPVX(sv);
8796     while (isALPHA(*d)) d++;
8797     while (isDIGIT(*d)) d++;
8798     if (d < SvEND(sv)) {
8799         const int numtype = grok_number_flags(SvPVX_const(sv), SvCUR(sv), NULL, PERL_SCAN_TRAILING);
8800 #ifdef PERL_PRESERVE_IVUV
8801         /* Got to punt this as an integer if needs be, but we don't issue
8802            warnings. Probably ought to make the sv_iv_please() that does
8803            the conversion if possible, and silently.  */
8804         if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
8805             /* Need to try really hard to see if it's an integer.
8806                9.22337203685478e+18 is an integer.
8807                but "9.22337203685478e+18" + 0 is UV=9223372036854779904
8808                so $a="9.22337203685478e+18"; $a+0; $a++
8809                needs to be the same as $a="9.22337203685478e+18"; $a++
8810                or we go insane. */
8811         
8812             (void) sv_2iv(sv);
8813             if (SvIOK(sv))
8814                 goto oops_its_int;
8815
8816             /* sv_2iv *should* have made this an NV */
8817             if (flags & SVp_NOK) {
8818                 (void)SvNOK_only(sv);
8819                 SvNV_set(sv, SvNVX(sv) + 1.0);
8820                 return;
8821             }
8822             /* I don't think we can get here. Maybe I should assert this
8823                And if we do get here I suspect that sv_setnv will croak. NWC
8824                Fall through. */
8825             DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_inc punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"NVgf"\n",
8826                                   SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
8827         }
8828 #endif /* PERL_PRESERVE_IVUV */
8829         if (!numtype && ckWARN(WARN_NUMERIC))
8830             not_incrementable(sv);
8831         sv_setnv(sv,Atof(SvPVX_const(sv)) + 1.0);
8832         return;
8833     }
8834     d--;
8835     while (d >= SvPVX_const(sv)) {
8836         if (isDIGIT(*d)) {
8837             if (++*d <= '9')
8838                 return;
8839             *(d--) = '0';
8840         }
8841         else {
8842 #ifdef EBCDIC
8843             /* MKS: The original code here died if letters weren't consecutive.
8844              * at least it didn't have to worry about non-C locales.  The
8845              * new code assumes that ('z'-'a')==('Z'-'A'), letters are
8846              * arranged in order (although not consecutively) and that only
8847              * [A-Za-z] are accepted by isALPHA in the C locale.
8848              */
8849             if (isALPHA_FOLD_NE(*d, 'z')) {
8850                 do { ++*d; } while (!isALPHA(*d));
8851                 return;
8852             }
8853             *(d--) -= 'z' - 'a';
8854 #else
8855             ++*d;
8856             if (isALPHA(*d))
8857                 return;
8858             *(d--) -= 'z' - 'a' + 1;
8859 #endif
8860         }
8861     }
8862     /* oh,oh, the number grew */
8863     SvGROW(sv, SvCUR(sv) + 2);
8864     SvCUR_set(sv, SvCUR(sv) + 1);
8865     for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX_const(sv); d--)
8866         *d = d[-1];
8867     if (isDIGIT(d[1]))
8868         *d = '1';
8869     else
8870         *d = d[1];
8871 }
8872
8873 /*
8874 =for apidoc sv_dec
8875
8876 Auto-decrement of the value in the SV, doing string to numeric conversion
8877 if necessary.  Handles 'get' magic and operator overloading.
8878
8879 =cut
8880 */
8881
8882 void
8883 Perl_sv_dec(pTHX_ SV *const sv)
8884 {
8885     if (!sv)
8886         return;
8887     SvGETMAGIC(sv);
8888     sv_dec_nomg(sv);
8889 }
8890
8891 /*
8892 =for apidoc sv_dec_nomg
8893
8894 Auto-decrement of the value in the SV, doing string to numeric conversion
8895 if necessary.  Handles operator overloading.  Skips handling 'get' magic.
8896
8897 =cut
8898 */
8899
8900 void
8901 Perl_sv_dec_nomg(pTHX_ SV *const sv)
8902 {
8903     int flags;
8904
8905     if (!sv)
8906         return;
8907     if (SvTHINKFIRST(sv)) {
8908         if (SvREADONLY(sv)) {
8909                 Perl_croak_no_modify();
8910         }
8911         if (SvROK(sv)) {
8912             IV i;
8913             if (SvAMAGIC(sv) && AMG_CALLunary(sv, dec_amg))
8914                 return;
8915             i = PTR2IV(SvRV(sv));
8916             sv_unref(sv);
8917             sv_setiv(sv, i);
8918         }
8919         else sv_force_normal_flags(sv, 0);
8920     }
8921     /* Unlike sv_inc we don't have to worry about string-never-numbers
8922        and keeping them magic. But we mustn't warn on punting */
8923     flags = SvFLAGS(sv);
8924     if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
8925         /* It's publicly an integer, or privately an integer-not-float */
8926 #ifdef PERL_PRESERVE_IVUV
8927       oops_its_int:
8928 #endif
8929         if (SvIsUV(sv)) {
8930             if (SvUVX(sv) == 0) {
8931                 (void)SvIOK_only(sv);
8932                 SvIV_set(sv, -1);
8933             }
8934             else {
8935                 (void)SvIOK_only_UV(sv);
8936                 SvUV_set(sv, SvUVX(sv) - 1);
8937             }   
8938         } else {
8939             if (SvIVX(sv) == IV_MIN) {
8940                 sv_setnv(sv, (NV)IV_MIN);
8941                 goto oops_its_num;
8942             }
8943             else {
8944                 (void)SvIOK_only(sv);
8945                 SvIV_set(sv, SvIVX(sv) - 1);
8946             }   
8947         }
8948         return;
8949     }
8950     if (flags & SVp_NOK) {
8951     oops_its_num:
8952         {
8953             const NV was = SvNVX(sv);
8954             if (LIKELY(!Perl_isinfnan(was)) &&
8955                 NV_OVERFLOWS_INTEGERS_AT &&
8956                 was <= -NV_OVERFLOWS_INTEGERS_AT) {
8957                 /* diag_listed_as: Lost precision when %s %f by 1 */
8958                 Perl_ck_warner(aTHX_ packWARN(WARN_IMPRECISION),
8959                                "Lost precision when decrementing %" NVff " by 1",
8960                                was);
8961             }
8962             (void)SvNOK_only(sv);
8963             SvNV_set(sv, was - 1.0);
8964             return;
8965         }
8966     }
8967     if (!(flags & SVp_POK)) {
8968         if ((flags & SVTYPEMASK) < SVt_PVIV)
8969             sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV) ? SVt_PVIV : SVt_IV);
8970         SvIV_set(sv, -1);
8971         (void)SvIOK_only(sv);
8972         return;
8973     }
8974 #ifdef PERL_PRESERVE_IVUV
8975     {
8976         const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
8977         if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
8978             /* Need to try really hard to see if it's an integer.
8979                9.22337203685478e+18 is an integer.
8980                but "9.22337203685478e+18" + 0 is UV=9223372036854779904
8981                so $a="9.22337203685478e+18"; $a+0; $a--
8982                needs to be the same as $a="9.22337203685478e+18"; $a--
8983                or we go insane. */
8984         
8985             (void) sv_2iv(sv);
8986             if (SvIOK(sv))
8987                 goto oops_its_int;
8988
8989             /* sv_2iv *should* have made this an NV */
8990             if (flags & SVp_NOK) {
8991                 (void)SvNOK_only(sv);
8992                 SvNV_set(sv, SvNVX(sv) - 1.0);
8993                 return;
8994             }
8995             /* I don't think we can get here. Maybe I should assert this
8996                And if we do get here I suspect that sv_setnv will croak. NWC
8997                Fall through. */
8998             DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_dec punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"NVgf"\n",
8999                                   SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
9000         }
9001     }
9002 #endif /* PERL_PRESERVE_IVUV */
9003     sv_setnv(sv,Atof(SvPVX_const(sv)) - 1.0);   /* punt */
9004 }
9005
9006 /* this define is used to eliminate a chunk of duplicated but shared logic
9007  * it has the suffix __SV_C to signal that it isnt API, and isnt meant to be
9008  * used anywhere but here - yves
9009  */
9010 #define PUSH_EXTEND_MORTAL__SV_C(AnSv) \
9011     STMT_START {      \
9012         SSize_t ix = ++PL_tmps_ix;              \
9013         if (UNLIKELY(ix >= PL_tmps_max))        \
9014             ix = tmps_grow_p(ix);                       \
9015         PL_tmps_stack[ix] = (AnSv); \
9016     } STMT_END
9017
9018 /*
9019 =for apidoc sv_mortalcopy
9020
9021 Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
9022 The new SV is marked as mortal.  It will be destroyed "soon", either by an
9023 explicit call to FREETMPS, or by an implicit call at places such as
9024 statement boundaries.  See also C<sv_newmortal> and C<sv_2mortal>.
9025
9026 =cut
9027 */
9028
9029 /* Make a string that will exist for the duration of the expression
9030  * evaluation.  Actually, it may have to last longer than that, but
9031  * hopefully we won't free it until it has been assigned to a
9032  * permanent location. */
9033
9034 SV *
9035 Perl_sv_mortalcopy_flags(pTHX_ SV *const oldstr, U32 flags)
9036 {
9037     SV *sv;
9038
9039     if (flags & SV_GMAGIC)
9040         SvGETMAGIC(oldstr); /* before new_SV, in case it dies */
9041     new_SV(sv);
9042     sv_setsv_flags(sv,oldstr,flags & ~SV_GMAGIC);
9043     PUSH_EXTEND_MORTAL__SV_C(sv);
9044     SvTEMP_on(sv);
9045     return sv;
9046 }
9047
9048 /*
9049 =for apidoc sv_newmortal
9050
9051 Creates a new null SV which is mortal.  The reference count of the SV is
9052 set to 1.  It will be destroyed "soon", either by an explicit call to
9053 FREETMPS, or by an implicit call at places such as statement boundaries.
9054 See also C<sv_mortalcopy> and C<sv_2mortal>.
9055
9056 =cut
9057 */
9058
9059 SV *
9060 Perl_sv_newmortal(pTHX)
9061 {
9062     SV *sv;
9063
9064     new_SV(sv);
9065     SvFLAGS(sv) = SVs_TEMP;
9066     PUSH_EXTEND_MORTAL__SV_C(sv);
9067     return sv;
9068 }
9069
9070
9071 /*
9072 =for apidoc newSVpvn_flags
9073
9074 Creates a new SV and copies a string (which may contain C<NUL> (C<\0>)
9075 characters) into it.  The reference count for the
9076 SV is set to 1.  Note that if C<len> is zero, Perl will create a zero length
9077 string.  You are responsible for ensuring that the source string is at least
9078 C<len> bytes long.  If the C<s> argument is NULL the new SV will be undefined.
9079 Currently the only flag bits accepted are C<SVf_UTF8> and C<SVs_TEMP>.
9080 If C<SVs_TEMP> is set, then C<sv_2mortal()> is called on the result before
9081 returning.  If C<SVf_UTF8> is set, C<s>
9082 is considered to be in UTF-8 and the
9083 C<SVf_UTF8> flag will be set on the new SV.
9084 C<newSVpvn_utf8()> is a convenience wrapper for this function, defined as
9085
9086     #define newSVpvn_utf8(s, len, u)                    \
9087         newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0)
9088
9089 =cut
9090 */
9091
9092 SV *
9093 Perl_newSVpvn_flags(pTHX_ const char *const s, const STRLEN len, const U32 flags)
9094 {
9095     SV *sv;
9096
9097     /* All the flags we don't support must be zero.
9098        And we're new code so I'm going to assert this from the start.  */
9099     assert(!(flags & ~(SVf_UTF8|SVs_TEMP)));
9100     new_SV(sv);
9101     sv_setpvn(sv,s,len);
9102
9103     /* This code used to do a sv_2mortal(), however we now unroll the call to
9104      * sv_2mortal() and do what it does ourselves here.  Since we have asserted
9105      * that flags can only have the SVf_UTF8 and/or SVs_TEMP flags set above we
9106      * can use it to enable the sv flags directly (bypassing SvTEMP_on), which
9107      * in turn means we dont need to mask out the SVf_UTF8 flag below, which
9108      * means that we eliminate quite a few steps than it looks - Yves
9109      * (explaining patch by gfx) */
9110
9111     SvFLAGS(sv) |= flags;
9112
9113     if(flags & SVs_TEMP){
9114         PUSH_EXTEND_MORTAL__SV_C(sv);
9115     }
9116
9117     return sv;
9118 }
9119
9120 /*
9121 =for apidoc sv_2mortal
9122
9123 Marks an existing SV as mortal.  The SV will be destroyed "soon", either
9124 by an explicit call to FREETMPS, or by an implicit call at places such as
9125 statement boundaries.  SvTEMP() is turned on which means that the SV's
9126 string buffer can be "stolen" if this SV is copied.  See also C<sv_newmortal>
9127 and C<sv_mortalcopy>.
9128
9129 =cut
9130 */
9131
9132 SV *
9133 Perl_sv_2mortal(pTHX_ SV *const sv)
9134 {
9135     dVAR;
9136     if (!sv)
9137         return sv;
9138     if (SvIMMORTAL(sv))
9139         return sv;
9140     PUSH_EXTEND_MORTAL__SV_C(sv);
9141     SvTEMP_on(sv);
9142     return sv;
9143 }
9144
9145 /*
9146 =for apidoc newSVpv
9147
9148 Creates a new SV and copies a string (which may contain C<NUL> (C<\0>)
9149 characters) into it.  The reference count for the
9150 SV is set to 1.  If C<len> is zero, Perl will compute the length using
9151 strlen(), (which means if you use this option, that C<s> can't have embedded
9152 C<NUL> characters and has to have a terminating C<NUL> byte).
9153
9154 For efficiency, consider using C<newSVpvn> instead.
9155
9156 =cut
9157 */
9158
9159 SV *
9160 Perl_newSVpv(pTHX_ const char *const s, const STRLEN len)
9161 {
9162     SV *sv;
9163
9164     new_SV(sv);
9165     sv_setpvn(sv, s, len || s == NULL ? len : strlen(s));
9166     return sv;
9167 }
9168
9169 /*
9170 =for apidoc newSVpvn
9171
9172 Creates a new SV and copies a string into it, which may contain C<NUL> characters
9173 (C<\0>) and other binary data.  The reference count for the SV is set to 1.
9174 Note that if C<len> is zero, Perl will create a zero length (Perl) string.  You
9175 are responsible for ensuring that the source buffer is at least
9176 C<len> bytes long.  If the C<buffer> argument is NULL the new SV will be
9177 undefined.
9178
9179 =cut
9180 */
9181
9182 SV *
9183 Perl_newSVpvn(pTHX_ const char *const buffer, const STRLEN len)
9184 {
9185     SV *sv;
9186     new_SV(sv);
9187     sv_setpvn(sv,buffer,len);
9188     return sv;
9189 }
9190
9191 /*
9192 =for apidoc newSVhek
9193
9194 Creates a new SV from the hash key structure.  It will generate scalars that
9195 point to the shared string table where possible.  Returns a new (undefined)
9196 SV if the hek is NULL.
9197
9198 =cut
9199 */
9200
9201 SV *
9202 Perl_newSVhek(pTHX_ const HEK *const hek)
9203 {
9204     if (!hek) {
9205         SV *sv;
9206
9207         new_SV(sv);
9208         return sv;
9209     }
9210
9211     if (HEK_LEN(hek) == HEf_SVKEY) {
9212         return newSVsv(*(SV**)HEK_KEY(hek));
9213     } else {
9214         const int flags = HEK_FLAGS(hek);
9215         if (flags & HVhek_WASUTF8) {
9216             /* Trouble :-)
9217                Andreas would like keys he put in as utf8 to come back as utf8
9218             */
9219             STRLEN utf8_len = HEK_LEN(hek);
9220             SV * const sv = newSV_type(SVt_PV);
9221             char *as_utf8 = (char *)bytes_to_utf8 ((U8*)HEK_KEY(hek), &utf8_len);
9222             /* bytes_to_utf8() allocates a new string, which we can repurpose: */
9223             sv_usepvn_flags(sv, as_utf8, utf8_len, SV_HAS_TRAILING_NUL);
9224             SvUTF8_on (sv);
9225             return sv;
9226         } else if (flags & HVhek_UNSHARED) {
9227             /* A hash that isn't using shared hash keys has to have
9228                the flag in every key so that we know not to try to call
9229                share_hek_hek on it.  */
9230
9231             SV * const sv = newSVpvn (HEK_KEY(hek), HEK_LEN(hek));
9232             if (HEK_UTF8(hek))
9233                 SvUTF8_on (sv);
9234             return sv;
9235         }
9236         /* This will be overwhelminly the most common case.  */
9237         {
9238             /* Inline most of newSVpvn_share(), because share_hek_hek() is far
9239                more efficient than sharepvn().  */
9240             SV *sv;
9241
9242             new_SV(sv);
9243             sv_upgrade(sv, SVt_PV);
9244             SvPV_set(sv, (char *)HEK_KEY(share_hek_hek(hek)));
9245             SvCUR_set(sv, HEK_LEN(hek));
9246             SvLEN_set(sv, 0);
9247             SvIsCOW_on(sv);
9248             SvPOK_on(sv);
9249             if (HEK_UTF8(hek))
9250                 SvUTF8_on(sv);
9251             return sv;
9252         }
9253     }
9254 }
9255
9256 /*
9257 =for apidoc newSVpvn_share
9258
9259 Creates a new SV with its SvPVX_const pointing to a shared string in the string
9260 table.  If the string does not already exist in the table, it is
9261 created first.  Turns on the SvIsCOW flag (or READONLY
9262 and FAKE in 5.16 and earlier).  If the C<hash> parameter
9263 is non-zero, that value is used; otherwise the hash is computed.
9264 The string's hash can later be retrieved from the SV
9265 with the C<SvSHARED_HASH()> macro.  The idea here is
9266 that as the string table is used for shared hash keys these strings will have
9267 SvPVX_const == HeKEY and hash lookup will avoid string compare.
9268
9269 =cut
9270 */
9271
9272 SV *
9273 Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
9274 {
9275     dVAR;
9276     SV *sv;
9277     bool is_utf8 = FALSE;
9278     const char *const orig_src = src;
9279
9280     if (len < 0) {
9281         STRLEN tmplen = -len;
9282         is_utf8 = TRUE;
9283         /* See the note in hv.c:hv_fetch() --jhi */
9284         src = (char*)bytes_from_utf8((const U8*)src, &tmplen, &is_utf8);
9285         len = tmplen;
9286     }
9287     if (!hash)
9288         PERL_HASH(hash, src, len);
9289     new_SV(sv);
9290     /* The logic for this is inlined in S_mro_get_linear_isa_dfs(), so if it
9291        changes here, update it there too.  */
9292     sv_upgrade(sv, SVt_PV);
9293     SvPV_set(sv, sharepvn(src, is_utf8?-len:len, hash));
9294     SvCUR_set(sv, len);
9295     SvLEN_set(sv, 0);
9296     SvIsCOW_on(sv);
9297     SvPOK_on(sv);
9298     if (is_utf8)
9299         SvUTF8_on(sv);
9300     if (src != orig_src)
9301         Safefree(src);
9302     return sv;
9303 }
9304
9305 /*
9306 =for apidoc newSVpv_share
9307
9308 Like C<newSVpvn_share>, but takes a C<NUL>-terminated string instead of a
9309 string/length pair.
9310
9311 =cut
9312 */
9313
9314 SV *
9315 Perl_newSVpv_share(pTHX_ const char *src, U32 hash)
9316 {
9317     return newSVpvn_share(src, strlen(src), hash);
9318 }
9319
9320 #if defined(PERL_IMPLICIT_CONTEXT)
9321
9322 /* pTHX_ magic can't cope with varargs, so this is a no-context
9323  * version of the main function, (which may itself be aliased to us).
9324  * Don't access this version directly.
9325  */
9326
9327 SV *
9328 Perl_newSVpvf_nocontext(const char *const pat, ...)
9329 {
9330     dTHX;
9331     SV *sv;
9332     va_list args;
9333
9334     PERL_ARGS_ASSERT_NEWSVPVF_NOCONTEXT;
9335
9336     va_start(args, pat);
9337     sv = vnewSVpvf(pat, &args);
9338     va_end(args);
9339     return sv;
9340 }
9341 #endif
9342
9343 /*
9344 =for apidoc newSVpvf
9345
9346 Creates a new SV and initializes it with the string formatted like
9347 C<sprintf>.
9348
9349 =cut
9350 */
9351
9352 SV *
9353 Perl_newSVpvf(pTHX_ const char *const pat, ...)
9354 {
9355     SV *sv;
9356     va_list args;
9357
9358     PERL_ARGS_ASSERT_NEWSVPVF;
9359
9360     va_start(args, pat);
9361     sv = vnewSVpvf(pat, &args);
9362     va_end(args);
9363     return sv;
9364 }
9365
9366 /* backend for newSVpvf() and newSVpvf_nocontext() */
9367
9368 SV *
9369 Perl_vnewSVpvf(pTHX_ const char *const pat, va_list *const args)
9370 {
9371     SV *sv;
9372
9373     PERL_ARGS_ASSERT_VNEWSVPVF;
9374
9375     new_SV(sv);
9376     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
9377     return sv;
9378 }
9379
9380 /*
9381 =for apidoc newSVnv
9382
9383 Creates a new SV and copies a floating point value into it.
9384 The reference count for the SV is set to 1.
9385
9386 =cut
9387 */
9388
9389 SV *
9390 Perl_newSVnv(pTHX_ const NV n)
9391 {
9392     SV *sv;
9393
9394     new_SV(sv);
9395     sv_setnv(sv,n);
9396     return sv;
9397 }
9398
9399 /*
9400 =for apidoc newSViv
9401
9402 Creates a new SV and copies an integer into it.  The reference count for the
9403 SV is set to 1.
9404
9405 =cut
9406 */
9407
9408 SV *
9409 Perl_newSViv(pTHX_ const IV i)
9410 {
9411     SV *sv;
9412
9413     new_SV(sv);
9414
9415     /* Inlining ONLY the small relevant subset of sv_setiv here
9416      * for performance. Makes a significant difference. */
9417
9418     /* We're starting from SVt_FIRST, so provided that's
9419      * actual 0, we don't have to unset any SV type flags
9420      * to promote to SVt_IV. */
9421     STATIC_ASSERT_STMT(SVt_FIRST == 0);
9422
9423     SET_SVANY_FOR_BODYLESS_IV(sv);
9424     SvFLAGS(sv) |= SVt_IV;
9425     (void)SvIOK_on(sv);
9426
9427     SvIV_set(sv, i);
9428     SvTAINT(sv);
9429
9430     return sv;
9431 }
9432
9433 /*
9434 =for apidoc newSVuv
9435
9436 Creates a new SV and copies an unsigned integer into it.
9437 The reference count for the SV is set to 1.
9438
9439 =cut
9440 */
9441
9442 SV *
9443 Perl_newSVuv(pTHX_ const UV u)
9444 {
9445     SV *sv;
9446
9447     /* Inlining ONLY the small relevant subset of sv_setuv here
9448      * for performance. Makes a significant difference. */
9449
9450     /* Using ivs is more efficient than using uvs - see sv_setuv */
9451     if (u <= (UV)IV_MAX) {
9452         return newSViv((IV)u);
9453     }
9454
9455     new_SV(sv);
9456
9457     /* We're starting from SVt_FIRST, so provided that's
9458      * actual 0, we don't have to unset any SV type flags
9459      * to promote to SVt_IV. */
9460     STATIC_ASSERT_STMT(SVt_FIRST == 0);
9461
9462     SET_SVANY_FOR_BODYLESS_IV(sv);
9463     SvFLAGS(sv) |= SVt_IV;
9464     (void)SvIOK_on(sv);
9465     (void)SvIsUV_on(sv);
9466
9467     SvUV_set(sv, u);
9468     SvTAINT(sv);
9469
9470     return sv;
9471 }
9472
9473 /*
9474 =for apidoc newSV_type
9475
9476 Creates a new SV, of the type specified.  The reference count for the new SV
9477 is set to 1.
9478
9479 =cut
9480 */
9481
9482 SV *
9483 Perl_newSV_type(pTHX_ const svtype type)
9484 {
9485     SV *sv;
9486
9487     new_SV(sv);
9488     ASSUME(SvTYPE(sv) == SVt_FIRST);
9489     if(type != SVt_FIRST)
9490         sv_upgrade(sv, type);
9491     return sv;
9492 }
9493
9494 /*
9495 =for apidoc newRV_noinc
9496
9497 Creates an RV wrapper for an SV.  The reference count for the original
9498 SV is B<not> incremented.
9499
9500 =cut
9501 */
9502
9503 SV *
9504 Perl_newRV_noinc(pTHX_ SV *const tmpRef)
9505 {
9506     SV *sv;
9507
9508     PERL_ARGS_ASSERT_NEWRV_NOINC;
9509
9510     new_SV(sv);
9511
9512     /* We're starting from SVt_FIRST, so provided that's
9513      * actual 0, we don't have to unset any SV type flags
9514      * to promote to SVt_IV. */
9515     STATIC_ASSERT_STMT(SVt_FIRST == 0);
9516
9517     SET_SVANY_FOR_BODYLESS_IV(sv);
9518     SvFLAGS(sv) |= SVt_IV;
9519     SvROK_on(sv);
9520     SvIV_set(sv, 0);
9521
9522     SvTEMP_off(tmpRef);
9523     SvRV_set(sv, tmpRef);
9524
9525     return sv;
9526 }
9527
9528 /* newRV_inc is the official function name to use now.
9529  * newRV_inc is in fact #defined to newRV in sv.h
9530  */
9531
9532 SV *
9533 Perl_newRV(pTHX_ SV *const sv)
9534 {
9535     PERL_ARGS_ASSERT_NEWRV;
9536
9537     return newRV_noinc(SvREFCNT_inc_simple_NN(sv));
9538 }
9539
9540 /*
9541 =for apidoc newSVsv
9542
9543 Creates a new SV which is an exact duplicate of the original SV.
9544 (Uses C<sv_setsv>.)
9545
9546 =cut
9547 */
9548
9549 SV *
9550 Perl_newSVsv(pTHX_ SV *const old)
9551 {
9552     SV *sv;
9553
9554     if (!old)
9555         return NULL;
9556     if (SvTYPE(old) == (svtype)SVTYPEMASK) {
9557         Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
9558         return NULL;
9559     }
9560     /* Do this here, otherwise we leak the new SV if this croaks. */
9561     SvGETMAGIC(old);
9562     new_SV(sv);
9563     /* SV_NOSTEAL prevents TEMP buffers being, well, stolen, and saves games
9564        with SvTEMP_off and SvTEMP_on round a call to sv_setsv.  */
9565     sv_setsv_flags(sv, old, SV_NOSTEAL);
9566     return sv;
9567 }
9568
9569 /*
9570 =for apidoc sv_reset
9571
9572 Underlying implementation for the C<reset> Perl function.
9573 Note that the perl-level function is vaguely deprecated.
9574
9575 =cut
9576 */
9577
9578 void
9579 Perl_sv_reset(pTHX_ const char *s, HV *const stash)
9580 {
9581     PERL_ARGS_ASSERT_SV_RESET;
9582
9583     sv_resetpvn(*s ? s : NULL, strlen(s), stash);
9584 }
9585
9586 void
9587 Perl_sv_resetpvn(pTHX_ const char *s, STRLEN len, HV * const stash)
9588 {
9589     char todo[PERL_UCHAR_MAX+1];
9590     const char *send;
9591
9592     if (!stash || SvTYPE(stash) != SVt_PVHV)
9593         return;
9594
9595     if (!s) {           /* reset ?? searches */
9596         MAGIC * const mg = mg_find((const SV *)stash, PERL_MAGIC_symtab);
9597         if (mg) {
9598             const U32 count = mg->mg_len / sizeof(PMOP**);
9599             PMOP **pmp = (PMOP**) mg->mg_ptr;
9600             PMOP *const *const end = pmp + count;
9601
9602             while (pmp < end) {
9603 #ifdef USE_ITHREADS
9604                 SvREADONLY_off(PL_regex_pad[(*pmp)->op_pmoffset]);
9605 #else
9606                 (*pmp)->op_pmflags &= ~PMf_USED;
9607 #endif
9608                 ++pmp;
9609             }
9610         }
9611         return;
9612     }
9613
9614     /* reset variables */
9615
9616     if (!HvARRAY(stash))
9617         return;
9618
9619     Zero(todo, 256, char);
9620     send = s + len;
9621     while (s < send) {
9622         I32 max;
9623         I32 i = (unsigned char)*s;
9624         if (s[1] == '-') {
9625             s += 2;
9626         }
9627         max = (unsigned char)*s++;
9628         for ( ; i <= max; i++) {
9629             todo[i] = 1;
9630         }
9631         for (i = 0; i <= (I32) HvMAX(stash); i++) {
9632             HE *entry;
9633             for (entry = HvARRAY(stash)[i];
9634                  entry;
9635                  entry = HeNEXT(entry))
9636             {
9637                 GV *gv;
9638                 SV *sv;
9639
9640                 if (!todo[(U8)*HeKEY(entry)])
9641                     continue;
9642                 gv = MUTABLE_GV(HeVAL(entry));
9643                 sv = GvSV(gv);
9644                 if (sv && !SvREADONLY(sv)) {
9645                     SV_CHECK_THINKFIRST_COW_DROP(sv);
9646                     if (!isGV(sv)) SvOK_off(sv);
9647                 }
9648                 if (GvAV(gv)) {
9649                     av_clear(GvAV(gv));
9650                 }
9651                 if (GvHV(gv) && !HvNAME_get(GvHV(gv))) {
9652                     hv_clear(GvHV(gv));
9653                 }
9654             }
9655         }
9656     }
9657 }
9658
9659 /*
9660 =for apidoc sv_2io
9661
9662 Using various gambits, try to get an IO from an SV: the IO slot if its a
9663 GV; or the recursive result if we're an RV; or the IO slot of the symbol
9664 named after the PV if we're a string.
9665
9666 'Get' magic is ignored on the sv passed in, but will be called on
9667 C<SvRV(sv)> if sv is an RV.
9668
9669 =cut
9670 */
9671
9672 IO*
9673 Perl_sv_2io(pTHX_ SV *const sv)
9674 {
9675     IO* io;
9676     GV* gv;
9677
9678     PERL_ARGS_ASSERT_SV_2IO;
9679
9680     switch (SvTYPE(sv)) {
9681     case SVt_PVIO:
9682         io = MUTABLE_IO(sv);
9683         break;
9684     case SVt_PVGV:
9685     case SVt_PVLV:
9686         if (isGV_with_GP(sv)) {
9687             gv = MUTABLE_GV(sv);
9688             io = GvIO(gv);
9689             if (!io)
9690                 Perl_croak(aTHX_ "Bad filehandle: %"HEKf,
9691                                     HEKfARG(GvNAME_HEK(gv)));
9692             break;
9693         }
9694         /* FALLTHROUGH */
9695     default:
9696         if (!SvOK(sv))
9697             Perl_croak(aTHX_ PL_no_usym, "filehandle");
9698         if (SvROK(sv)) {
9699             SvGETMAGIC(SvRV(sv));
9700             return sv_2io(SvRV(sv));
9701         }
9702         gv = gv_fetchsv_nomg(sv, 0, SVt_PVIO);
9703         if (gv)
9704             io = GvIO(gv);
9705         else
9706             io = 0;
9707         if (!io) {
9708             SV *newsv = sv;
9709             if (SvGMAGICAL(sv)) {
9710                 newsv = sv_newmortal();
9711                 sv_setsv_nomg(newsv, sv);
9712             }
9713             Perl_croak(aTHX_ "Bad filehandle: %"SVf, SVfARG(newsv));
9714         }
9715         break;
9716     }
9717     return io;
9718 }
9719
9720 /*
9721 =for apidoc sv_2cv
9722
9723 Using various gambits, try to get a CV from an SV; in addition, try if
9724 possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
9725 The flags in C<lref> are passed to gv_fetchsv.
9726
9727 =cut
9728 */
9729
9730 CV *
9731 Perl_sv_2cv(pTHX_ SV *sv, HV **const st, GV **const gvp, const I32 lref)
9732 {
9733     GV *gv = NULL;
9734     CV *cv = NULL;
9735
9736     PERL_ARGS_ASSERT_SV_2CV;
9737
9738     if (!sv) {
9739         *st = NULL;
9740         *gvp = NULL;
9741         return NULL;
9742     }
9743     switch (SvTYPE(sv)) {
9744     case SVt_PVCV:
9745         *st = CvSTASH(sv);
9746         *gvp = NULL;
9747         return MUTABLE_CV(sv);
9748     case SVt_PVHV:
9749     case SVt_PVAV:
9750         *st = NULL;
9751         *gvp = NULL;
9752         return NULL;
9753     default:
9754         SvGETMAGIC(sv);
9755         if (SvROK(sv)) {
9756             if (SvAMAGIC(sv))
9757                 sv = amagic_deref_call(sv, to_cv_amg);
9758
9759             sv = SvRV(sv);
9760             if (SvTYPE(sv) == SVt_PVCV) {
9761                 cv = MUTABLE_CV(sv);
9762                 *gvp = NULL;
9763                 *st = CvSTASH(cv);
9764                 return cv;
9765             }
9766             else if(SvGETMAGIC(sv), isGV_with_GP(sv))
9767                 gv = MUTABLE_GV(sv);
9768             else
9769                 Perl_croak(aTHX_ "Not a subroutine reference");
9770         }
9771         else if (isGV_with_GP(sv)) {
9772             gv = MUTABLE_GV(sv);
9773         }
9774         else {
9775             gv = gv_fetchsv_nomg(sv, lref, SVt_PVCV);
9776         }
9777         *gvp = gv;
9778         if (!gv) {
9779             *st = NULL;
9780             return NULL;
9781         }
9782         /* Some flags to gv_fetchsv mean don't really create the GV  */
9783         if (!isGV_with_GP(gv)) {
9784             *st = NULL;
9785             return NULL;
9786         }
9787         *st = GvESTASH(gv);
9788         if (lref & ~GV_ADDMG && !GvCVu(gv)) {
9789             /* XXX this is probably not what they think they're getting.
9790              * It has the same effect as "sub name;", i.e. just a forward
9791              * declaration! */
9792             newSTUB(gv,0);
9793         }
9794         return GvCVu(gv);
9795     }
9796 }
9797
9798 /*
9799 =for apidoc sv_true
9800
9801 Returns true if the SV has a true value by Perl's rules.
9802 Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
9803 instead use an in-line version.
9804
9805 =cut
9806 */
9807
9808 I32
9809 Perl_sv_true(pTHX_ SV *const sv)
9810 {
9811     if (!sv)
9812         return 0;
9813     if (SvPOK(sv)) {
9814         const XPV* const tXpv = (XPV*)SvANY(sv);
9815         if (tXpv &&
9816                 (tXpv->xpv_cur > 1 ||
9817                 (tXpv->xpv_cur && *sv->sv_u.svu_pv != '0')))
9818             return 1;
9819         else
9820             return 0;
9821     }
9822     else {
9823         if (SvIOK(sv))
9824             return SvIVX(sv) != 0;
9825         else {
9826             if (SvNOK(sv))
9827                 return SvNVX(sv) != 0.0;
9828             else
9829                 return sv_2bool(sv);
9830         }
9831     }
9832 }
9833
9834 /*
9835 =for apidoc sv_pvn_force
9836
9837 Get a sensible string out of the SV somehow.
9838 A private implementation of the C<SvPV_force> macro for compilers which
9839 can't cope with complex macro expressions.  Always use the macro instead.
9840
9841 =for apidoc sv_pvn_force_flags
9842
9843 Get a sensible string out of the SV somehow.
9844 If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
9845 appropriate, else not.  C<sv_pvn_force> and C<sv_pvn_force_nomg> are
9846 implemented in terms of this function.
9847 You normally want to use the various wrapper macros instead: see
9848 C<SvPV_force> and C<SvPV_force_nomg>
9849
9850 =cut
9851 */
9852
9853 char *
9854 Perl_sv_pvn_force_flags(pTHX_ SV *const sv, STRLEN *const lp, const I32 flags)
9855 {
9856     PERL_ARGS_ASSERT_SV_PVN_FORCE_FLAGS;
9857
9858     if (flags & SV_GMAGIC) SvGETMAGIC(sv);
9859     if (SvTHINKFIRST(sv) && (!SvROK(sv) || SvREADONLY(sv)))
9860         sv_force_normal_flags(sv, 0);
9861
9862     if (SvPOK(sv)) {
9863         if (lp)
9864             *lp = SvCUR(sv);
9865     }
9866     else {
9867         char *s;
9868         STRLEN len;
9869  
9870         if (SvTYPE(sv) > SVt_PVLV
9871             || isGV_with_GP(sv))
9872             /* diag_listed_as: Can't coerce %s to %s in %s */
9873             Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
9874                 OP_DESC(PL_op));
9875         s = sv_2pv_flags(sv, &len, flags &~ SV_GMAGIC);
9876         if (!s) {
9877           s = (char *)"";
9878         }
9879         if (lp)
9880             *lp = len;
9881
9882         if (SvTYPE(sv) < SVt_PV ||
9883             s != SvPVX_const(sv)) {     /* Almost, but not quite, sv_setpvn() */
9884             if (SvROK(sv))
9885                 sv_unref(sv);
9886             SvUPGRADE(sv, SVt_PV);              /* Never FALSE */
9887             SvGROW(sv, len + 1);
9888             Move(s,SvPVX(sv),len,char);
9889             SvCUR_set(sv, len);
9890             SvPVX(sv)[len] = '\0';
9891         }
9892         if (!SvPOK(sv)) {
9893             SvPOK_on(sv);               /* validate pointer */
9894             SvTAINT(sv);
9895             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
9896                                   PTR2UV(sv),SvPVX_const(sv)));
9897         }
9898     }
9899     (void)SvPOK_only_UTF8(sv);
9900     return SvPVX_mutable(sv);
9901 }
9902
9903 /*
9904 =for apidoc sv_pvbyten_force
9905
9906 The backend for the C<SvPVbytex_force> macro.  Always use the macro
9907 instead.
9908
9909 =cut
9910 */
9911
9912 char *
9913 Perl_sv_pvbyten_force(pTHX_ SV *const sv, STRLEN *const lp)
9914 {
9915     PERL_ARGS_ASSERT_SV_PVBYTEN_FORCE;
9916
9917     sv_pvn_force(sv,lp);
9918     sv_utf8_downgrade(sv,0);
9919     *lp = SvCUR(sv);
9920     return SvPVX(sv);
9921 }
9922
9923 /*
9924 =for apidoc sv_pvutf8n_force
9925
9926 The backend for the C<SvPVutf8x_force> macro.  Always use the macro
9927 instead.
9928
9929 =cut
9930 */
9931
9932 char *
9933 Perl_sv_pvutf8n_force(pTHX_ SV *const sv, STRLEN *const lp)
9934 {
9935     PERL_ARGS_ASSERT_SV_PVUTF8N_FORCE;
9936
9937     sv_pvn_force(sv,0);
9938     sv_utf8_upgrade_nomg(sv);
9939     *lp = SvCUR(sv);
9940     return SvPVX(sv);
9941 }
9942
9943 /*
9944 =for apidoc sv_reftype
9945
9946 Returns a string describing what the SV is a reference to.
9947
9948 =cut
9949 */
9950
9951 const char *
9952 Perl_sv_reftype(pTHX_ const SV *const sv, const int ob)
9953 {
9954     PERL_ARGS_ASSERT_SV_REFTYPE;
9955     if (ob && SvOBJECT(sv)) {
9956         return SvPV_nolen_const(sv_ref(NULL, sv, ob));
9957     }
9958     else {
9959         /* WARNING - There is code, for instance in mg.c, that assumes that
9960          * the only reason that sv_reftype(sv,0) would return a string starting
9961          * with 'L' or 'S' is that it is a LVALUE or a SCALAR.
9962          * Yes this a dodgy way to do type checking, but it saves practically reimplementing
9963          * this routine inside other subs, and it saves time.
9964          * Do not change this assumption without searching for "dodgy type check" in
9965          * the code.
9966          * - Yves */
9967         switch (SvTYPE(sv)) {
9968         case SVt_NULL:
9969         case SVt_IV:
9970         case SVt_NV:
9971         case SVt_PV:
9972         case SVt_PVIV:
9973         case SVt_PVNV:
9974         case SVt_PVMG:
9975                                 if (SvVOK(sv))
9976                                     return "VSTRING";
9977                                 if (SvROK(sv))
9978                                     return "REF";
9979                                 else
9980                                     return "SCALAR";
9981
9982         case SVt_PVLV:          return (char *)  (SvROK(sv) ? "REF"
9983                                 /* tied lvalues should appear to be
9984                                  * scalars for backwards compatibility */
9985                                 : (isALPHA_FOLD_EQ(LvTYPE(sv), 't'))
9986                                     ? "SCALAR" : "LVALUE");
9987         case SVt_PVAV:          return "ARRAY";
9988         case SVt_PVHV:          return "HASH";
9989         case SVt_PVCV:          return "CODE";
9990         case SVt_PVGV:          return (char *) (isGV_with_GP(sv)
9991                                     ? "GLOB" : "SCALAR");
9992         case SVt_PVFM:          return "FORMAT";
9993         case SVt_PVIO:          return "IO";
9994         case SVt_INVLIST:       return "INVLIST";
9995         case SVt_REGEXP:        return "REGEXP";
9996         default:                return "UNKNOWN";
9997         }
9998     }
9999 }
10000
10001 /*
10002 =for apidoc sv_ref
10003
10004 Returns a SV describing what the SV passed in is a reference to.
10005
10006 =cut
10007 */
10008
10009 SV *
10010 Perl_sv_ref(pTHX_ SV *dst, const SV *const sv, const int ob)
10011 {
10012     PERL_ARGS_ASSERT_SV_REF;
10013
10014     if (!dst)
10015         dst = sv_newmortal();
10016
10017     if (ob && SvOBJECT(sv)) {
10018         HvNAME_get(SvSTASH(sv))
10019                     ? sv_sethek(dst, HvNAME_HEK(SvSTASH(sv)))
10020                     : sv_setpvn(dst, "__ANON__", 8);
10021     }
10022     else {
10023         const char * reftype = sv_reftype(sv, 0);
10024         sv_setpv(dst, reftype);
10025     }
10026     return dst;
10027 }
10028
10029 /*
10030 =for apidoc sv_isobject
10031
10032 Returns a boolean indicating whether the SV is an RV pointing to a blessed
10033 object.  If the SV is not an RV, or if the object is not blessed, then this
10034 will return false.
10035
10036 =cut
10037 */
10038
10039 int
10040 Perl_sv_isobject(pTHX_ SV *sv)
10041 {
10042     if (!sv)
10043         return 0;
10044     SvGETMAGIC(sv);
10045     if (!SvROK(sv))
10046         return 0;
10047     sv = SvRV(sv);
10048     if (!SvOBJECT(sv))
10049         return 0;
10050     return 1;
10051 }
10052
10053 /*
10054 =for apidoc sv_isa
10055
10056 Returns a boolean indicating whether the SV is blessed into the specified
10057 class.  This does not check for subtypes; use C<sv_derived_from> to verify
10058 an inheritance relationship.
10059
10060 =cut
10061 */
10062
10063 int
10064 Perl_sv_isa(pTHX_ SV *sv, const char *const name)
10065 {
10066     const char *hvname;
10067
10068     PERL_ARGS_ASSERT_SV_ISA;
10069
10070     if (!sv)
10071         return 0;
10072     SvGETMAGIC(sv);
10073     if (!SvROK(sv))
10074         return 0;
10075     sv = SvRV(sv);
10076     if (!SvOBJECT(sv))
10077         return 0;
10078     hvname = HvNAME_get(SvSTASH(sv));
10079     if (!hvname)
10080         return 0;
10081
10082     return strEQ(hvname, name);
10083 }
10084
10085 /*
10086 =for apidoc newSVrv
10087
10088 Creates a new SV for the existing RV, C<rv>, to point to.  If C<rv> is not an
10089 RV then it will be upgraded to one.  If C<classname> is non-null then the new
10090 SV will be blessed in the specified package.  The new SV is returned and its
10091 reference count is 1.  The reference count 1 is owned by C<rv>.
10092
10093 =cut
10094 */
10095
10096 SV*
10097 Perl_newSVrv(pTHX_ SV *const rv, const char *const classname)
10098 {
10099     SV *sv;
10100
10101     PERL_ARGS_ASSERT_NEWSVRV;
10102
10103     new_SV(sv);
10104
10105     SV_CHECK_THINKFIRST_COW_DROP(rv);
10106
10107     if (UNLIKELY( SvTYPE(rv) >= SVt_PVMG )) {
10108         const U32 refcnt = SvREFCNT(rv);
10109         SvREFCNT(rv) = 0;
10110         sv_clear(rv);
10111         SvFLAGS(rv) = 0;
10112         SvREFCNT(rv) = refcnt;
10113
10114         sv_upgrade(rv, SVt_IV);
10115     } else if (SvROK(rv)) {
10116         SvREFCNT_dec(SvRV(rv));
10117     } else {
10118         prepare_SV_for_RV(rv);
10119     }
10120
10121     SvOK_off(rv);
10122     SvRV_set(rv, sv);
10123     SvROK_on(rv);
10124
10125     if (classname) {
10126         HV* const stash = gv_stashpv(classname, GV_ADD);
10127         (void)sv_bless(rv, stash);
10128     }
10129     return sv;
10130 }
10131
10132 SV *
10133 Perl_newSVavdefelem(pTHX_ AV *av, SSize_t ix, bool extendible)
10134 {
10135     SV * const lv = newSV_type(SVt_PVLV);
10136     PERL_ARGS_ASSERT_NEWSVAVDEFELEM;
10137     LvTYPE(lv) = 'y';
10138     sv_magic(lv, NULL, PERL_MAGIC_defelem, NULL, 0);
10139     LvTARG(lv) = SvREFCNT_inc_simple_NN(av);
10140     LvSTARGOFF(lv) = ix;
10141     LvTARGLEN(lv) = extendible ? 1 : (STRLEN)UV_MAX;
10142     return lv;
10143 }
10144
10145 /*
10146 =for apidoc sv_setref_pv
10147
10148 Copies a pointer into a new SV, optionally blessing the SV.  The C<rv>
10149 argument will be upgraded to an RV.  That RV will be modified to point to
10150 the new SV.  If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
10151 into the SV.  The C<classname> argument indicates the package for the
10152 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
10153 will have a reference count of 1, and the RV will be returned.
10154
10155 Do not use with other Perl types such as HV, AV, SV, CV, because those
10156 objects will become corrupted by the pointer copy process.
10157
10158 Note that C<sv_setref_pvn> copies the string while this copies the pointer.
10159
10160 =cut
10161 */
10162
10163 SV*
10164 Perl_sv_setref_pv(pTHX_ SV *const rv, const char *const classname, void *const pv)
10165 {
10166     PERL_ARGS_ASSERT_SV_SETREF_PV;
10167
10168     if (!pv) {
10169         sv_setsv(rv, &PL_sv_undef);
10170         SvSETMAGIC(rv);
10171     }
10172     else
10173         sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
10174     return rv;
10175 }
10176
10177 /*
10178 =for apidoc sv_setref_iv
10179
10180 Copies an integer into a new SV, optionally blessing the SV.  The C<rv>
10181 argument will be upgraded to an RV.  That RV will be modified to point to
10182 the new SV.  The C<classname> argument indicates the package for the
10183 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
10184 will have a reference count of 1, and the RV will be returned.
10185
10186 =cut
10187 */
10188
10189 SV*
10190 Perl_sv_setref_iv(pTHX_ SV *const rv, const char *const classname, const IV iv)
10191 {
10192     PERL_ARGS_ASSERT_SV_SETREF_IV;
10193
10194     sv_setiv(newSVrv(rv,classname), iv);
10195     return rv;
10196 }
10197
10198 /*
10199 =for apidoc sv_setref_uv
10200
10201 Copies an unsigned integer into a new SV, optionally blessing the SV.  The C<rv>
10202 argument will be upgraded to an RV.  That RV will be modified to point to
10203 the new SV.  The C<classname> argument indicates the package for the
10204 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
10205 will have a reference count of 1, and the RV will be returned.
10206
10207 =cut
10208 */
10209
10210 SV*
10211 Perl_sv_setref_uv(pTHX_ SV *const rv, const char *const classname, const UV uv)
10212 {
10213     PERL_ARGS_ASSERT_SV_SETREF_UV;
10214
10215     sv_setuv(newSVrv(rv,classname), uv);
10216     return rv;
10217 }
10218
10219 /*
10220 =for apidoc sv_setref_nv
10221
10222 Copies a double into a new SV, optionally blessing the SV.  The C<rv>
10223 argument will be upgraded to an RV.  That RV will be modified to point to
10224 the new SV.  The C<classname> argument indicates the package for the
10225 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
10226 will have a reference count of 1, and the RV will be returned.
10227
10228 =cut
10229 */
10230
10231 SV*
10232 Perl_sv_setref_nv(pTHX_ SV *const rv, const char *const classname, const NV nv)
10233 {
10234     PERL_ARGS_ASSERT_SV_SETREF_NV;
10235
10236     sv_setnv(newSVrv(rv,classname), nv);
10237     return rv;
10238 }
10239
10240 /*
10241 =for apidoc sv_setref_pvn
10242
10243 Copies a string into a new SV, optionally blessing the SV.  The length of the
10244 string must be specified with C<n>.  The C<rv> argument will be upgraded to
10245 an RV.  That RV will be modified to point to the new SV.  The C<classname>
10246 argument indicates the package for the blessing.  Set C<classname> to
10247 C<NULL> to avoid the blessing.  The new SV will have a reference count
10248 of 1, and the RV will be returned.
10249
10250 Note that C<sv_setref_pv> copies the pointer while this copies the string.
10251
10252 =cut
10253 */
10254
10255 SV*
10256 Perl_sv_setref_pvn(pTHX_ SV *const rv, const char *const classname,
10257                    const char *const pv, const STRLEN n)
10258 {
10259     PERL_ARGS_ASSERT_SV_SETREF_PVN;
10260
10261     sv_setpvn(newSVrv(rv,classname), pv, n);
10262     return rv;
10263 }
10264
10265 /*
10266 =for apidoc sv_bless
10267
10268 Blesses an SV into a specified package.  The SV must be an RV.  The package
10269 must be designated by its stash (see C<gv_stashpv()>).  The reference count
10270 of the SV is unaffected.
10271
10272 =cut
10273 */
10274
10275 SV*
10276 Perl_sv_bless(pTHX_ SV *const sv, HV *const stash)
10277 {
10278     SV *tmpRef;
10279     HV *oldstash = NULL;
10280
10281     PERL_ARGS_ASSERT_SV_BLESS;
10282
10283     SvGETMAGIC(sv);
10284     if (!SvROK(sv))
10285         Perl_croak(aTHX_ "Can't bless non-reference value");
10286     tmpRef = SvRV(sv);
10287     if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY|SVf_PROTECT)) {
10288         if (SvREADONLY(tmpRef))
10289             Perl_croak_no_modify();
10290         if (SvOBJECT(tmpRef)) {
10291             oldstash = SvSTASH(tmpRef);
10292         }
10293     }
10294     SvOBJECT_on(tmpRef);
10295     SvUPGRADE(tmpRef, SVt_PVMG);
10296     SvSTASH_set(tmpRef, MUTABLE_HV(SvREFCNT_inc_simple(stash)));
10297     SvREFCNT_dec(oldstash);
10298
10299     if(SvSMAGICAL(tmpRef))
10300         if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
10301             mg_set(tmpRef);
10302
10303
10304
10305     return sv;
10306 }
10307
10308 /* Downgrades a PVGV to a PVMG. If it's actually a PVLV, we leave the type
10309  * as it is after unglobbing it.
10310  */
10311
10312 PERL_STATIC_INLINE void
10313 S_sv_unglob(pTHX_ SV *const sv, U32 flags)
10314 {
10315     void *xpvmg;
10316     HV *stash;
10317     SV * const temp = flags & SV_COW_DROP_PV ? NULL : sv_newmortal();
10318
10319     PERL_ARGS_ASSERT_SV_UNGLOB;
10320
10321     assert(SvTYPE(sv) == SVt_PVGV || SvTYPE(sv) == SVt_PVLV);
10322     SvFAKE_off(sv);
10323     if (!(flags & SV_COW_DROP_PV))
10324         gv_efullname3(temp, MUTABLE_GV(sv), "*");
10325
10326     SvREFCNT_inc_simple_void_NN(sv_2mortal(sv));
10327     if (GvGP(sv)) {
10328         if(GvCVu((const GV *)sv) && (stash = GvSTASH(MUTABLE_GV(sv)))
10329            && HvNAME_get(stash))
10330             mro_method_changed_in(stash);
10331         gp_free(MUTABLE_GV(sv));
10332     }
10333     if (GvSTASH(sv)) {
10334         sv_del_backref(MUTABLE_SV(GvSTASH(sv)), sv);
10335         GvSTASH(sv) = NULL;
10336     }
10337     GvMULTI_off(sv);
10338     if (GvNAME_HEK(sv)) {
10339         unshare_hek(GvNAME_HEK(sv));
10340     }
10341     isGV_with_GP_off(sv);
10342
10343     if(SvTYPE(sv) == SVt_PVGV) {
10344         /* need to keep SvANY(sv) in the right arena */
10345         xpvmg = new_XPVMG();
10346         StructCopy(SvANY(sv), xpvmg, XPVMG);
10347         del_XPVGV(SvANY(sv));
10348         SvANY(sv) = xpvmg;
10349
10350         SvFLAGS(sv) &= ~SVTYPEMASK;
10351         SvFLAGS(sv) |= SVt_PVMG;
10352     }
10353
10354     /* Intentionally not calling any local SET magic, as this isn't so much a
10355        set operation as merely an internal storage change.  */
10356     if (flags & SV_COW_DROP_PV) SvOK_off(sv);
10357     else sv_setsv_flags(sv, temp, 0);
10358
10359     if ((const GV *)sv == PL_last_in_gv)
10360         PL_last_in_gv = NULL;
10361     else if ((const GV *)sv == PL_statgv)
10362         PL_statgv = NULL;
10363 }
10364
10365 /*
10366 =for apidoc sv_unref_flags
10367
10368 Unsets the RV status of the SV, and decrements the reference count of
10369 whatever was being referenced by the RV.  This can almost be thought of
10370 as a reversal of C<newSVrv>.  The C<cflags> argument can contain
10371 C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
10372 (otherwise the decrementing is conditional on the reference count being
10373 different from one or the reference being a readonly SV).
10374 See C<SvROK_off>.
10375
10376 =cut
10377 */
10378
10379 void
10380 Perl_sv_unref_flags(pTHX_ SV *const ref, const U32 flags)
10381 {
10382     SV* const target = SvRV(ref);
10383
10384     PERL_ARGS_ASSERT_SV_UNREF_FLAGS;
10385
10386     if (SvWEAKREF(ref)) {
10387         sv_del_backref(target, ref);
10388         SvWEAKREF_off(ref);
10389         SvRV_set(ref, NULL);
10390         return;
10391     }
10392     SvRV_set(ref, NULL);
10393     SvROK_off(ref);
10394     /* You can't have a || SvREADONLY(target) here, as $a = $$a, where $a was
10395        assigned to as BEGIN {$a = \"Foo"} will fail.  */
10396     if (SvREFCNT(target) != 1 || (flags & SV_IMMEDIATE_UNREF))
10397         SvREFCNT_dec_NN(target);
10398     else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
10399         sv_2mortal(target);     /* Schedule for freeing later */
10400 }
10401
10402 /*
10403 =for apidoc sv_untaint
10404
10405 Untaint an SV.  Use C<SvTAINTED_off> instead.
10406
10407 =cut
10408 */
10409
10410 void
10411 Perl_sv_untaint(pTHX_ SV *const sv)
10412 {
10413     PERL_ARGS_ASSERT_SV_UNTAINT;
10414     PERL_UNUSED_CONTEXT;
10415
10416     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
10417         MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
10418         if (mg)
10419             mg->mg_len &= ~1;
10420     }
10421 }
10422
10423 /*
10424 =for apidoc sv_tainted
10425
10426 Test an SV for taintedness.  Use C<SvTAINTED> instead.
10427
10428 =cut
10429 */
10430
10431 bool
10432 Perl_sv_tainted(pTHX_ SV *const sv)
10433 {
10434     PERL_ARGS_ASSERT_SV_TAINTED;
10435     PERL_UNUSED_CONTEXT;
10436
10437     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
10438         const MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
10439         if (mg && (mg->mg_len & 1) )
10440             return TRUE;
10441     }
10442     return FALSE;
10443 }
10444
10445 /*
10446 =for apidoc sv_setpviv
10447
10448 Copies an integer into the given SV, also updating its string value.
10449 Does not handle 'set' magic.  See C<sv_setpviv_mg>.
10450
10451 =cut
10452 */
10453
10454 void
10455 Perl_sv_setpviv(pTHX_ SV *const sv, const IV iv)
10456 {
10457     char buf[TYPE_CHARS(UV)];
10458     char *ebuf;
10459     char * const ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
10460
10461     PERL_ARGS_ASSERT_SV_SETPVIV;
10462
10463     sv_setpvn(sv, ptr, ebuf - ptr);
10464 }
10465
10466 /*
10467 =for apidoc sv_setpviv_mg
10468
10469 Like C<sv_setpviv>, but also handles 'set' magic.
10470
10471 =cut
10472 */
10473
10474 void
10475 Perl_sv_setpviv_mg(pTHX_ SV *const sv, const IV iv)
10476 {
10477     PERL_ARGS_ASSERT_SV_SETPVIV_MG;
10478
10479     sv_setpviv(sv, iv);
10480     SvSETMAGIC(sv);
10481 }
10482
10483 #if defined(PERL_IMPLICIT_CONTEXT)
10484
10485 /* pTHX_ magic can't cope with varargs, so this is a no-context
10486  * version of the main function, (which may itself be aliased to us).
10487  * Don't access this version directly.
10488  */
10489
10490 void
10491 Perl_sv_setpvf_nocontext(SV *const sv, const char *const pat, ...)
10492 {
10493     dTHX;
10494     va_list args;
10495
10496     PERL_ARGS_ASSERT_SV_SETPVF_NOCONTEXT;
10497
10498     va_start(args, pat);
10499     sv_vsetpvf(sv, pat, &args);
10500     va_end(args);
10501 }
10502
10503 /* pTHX_ magic can't cope with varargs, so this is a no-context
10504  * version of the main function, (which may itself be aliased to us).
10505  * Don't access this version directly.
10506  */
10507
10508 void
10509 Perl_sv_setpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
10510 {
10511     dTHX;
10512     va_list args;
10513
10514     PERL_ARGS_ASSERT_SV_SETPVF_MG_NOCONTEXT;
10515
10516     va_start(args, pat);
10517     sv_vsetpvf_mg(sv, pat, &args);
10518     va_end(args);
10519 }
10520 #endif
10521
10522 /*
10523 =for apidoc sv_setpvf
10524
10525 Works like C<sv_catpvf> but copies the text into the SV instead of
10526 appending it.  Does not handle 'set' magic.  See C<sv_setpvf_mg>.
10527
10528 =cut
10529 */
10530
10531 void
10532 Perl_sv_setpvf(pTHX_ SV *const sv, const char *const pat, ...)
10533 {
10534     va_list args;
10535
10536     PERL_ARGS_ASSERT_SV_SETPVF;
10537
10538     va_start(args, pat);
10539     sv_vsetpvf(sv, pat, &args);
10540     va_end(args);
10541 }
10542
10543 /*
10544 =for apidoc sv_vsetpvf
10545
10546 Works like C<sv_vcatpvf> but copies the text into the SV instead of
10547 appending it.  Does not handle 'set' magic.  See C<sv_vsetpvf_mg>.
10548
10549 Usually used via its frontend C<sv_setpvf>.
10550
10551 =cut
10552 */
10553
10554 void
10555 Perl_sv_vsetpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args)
10556 {
10557     PERL_ARGS_ASSERT_SV_VSETPVF;
10558
10559     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
10560 }
10561
10562 /*
10563 =for apidoc sv_setpvf_mg
10564
10565 Like C<sv_setpvf>, but also handles 'set' magic.
10566
10567 =cut
10568 */
10569
10570 void
10571 Perl_sv_setpvf_mg(pTHX_ SV *const sv, const char *const pat, ...)
10572 {
10573     va_list args;
10574
10575     PERL_ARGS_ASSERT_SV_SETPVF_MG;
10576
10577     va_start(args, pat);
10578     sv_vsetpvf_mg(sv, pat, &args);
10579     va_end(args);
10580 }
10581
10582 /*
10583 =for apidoc sv_vsetpvf_mg
10584
10585 Like C<sv_vsetpvf>, but also handles 'set' magic.
10586
10587 Usually used via its frontend C<sv_setpvf_mg>.
10588
10589 =cut
10590 */
10591
10592 void
10593 Perl_sv_vsetpvf_mg(pTHX_ SV *const sv, const char *const pat, va_list *const args)
10594 {
10595     PERL_ARGS_ASSERT_SV_VSETPVF_MG;
10596
10597     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
10598     SvSETMAGIC(sv);
10599 }
10600
10601 #if defined(PERL_IMPLICIT_CONTEXT)
10602
10603 /* pTHX_ magic can't cope with varargs, so this is a no-context
10604  * version of the main function, (which may itself be aliased to us).
10605  * Don't access this version directly.
10606  */
10607
10608 void
10609 Perl_sv_catpvf_nocontext(SV *const sv, const char *const pat, ...)
10610 {
10611     dTHX;
10612     va_list args;
10613
10614     PERL_ARGS_ASSERT_SV_CATPVF_NOCONTEXT;
10615
10616     va_start(args, pat);
10617     sv_vcatpvfn_flags(sv, pat, strlen(pat), &args, NULL, 0, NULL, SV_GMAGIC|SV_SMAGIC);
10618     va_end(args);
10619 }
10620
10621 /* pTHX_ magic can't cope with varargs, so this is a no-context
10622  * version of the main function, (which may itself be aliased to us).
10623  * Don't access this version directly.
10624  */
10625
10626 void
10627 Perl_sv_catpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
10628 {
10629     dTHX;
10630     va_list args;
10631
10632     PERL_ARGS_ASSERT_SV_CATPVF_MG_NOCONTEXT;
10633
10634     va_start(args, pat);
10635     sv_vcatpvfn_flags(sv, pat, strlen(pat), &args, NULL, 0, NULL, SV_GMAGIC|SV_SMAGIC);
10636     SvSETMAGIC(sv);
10637     va_end(args);
10638 }
10639 #endif
10640
10641 /*
10642 =for apidoc sv_catpvf
10643
10644 Processes its arguments like C<sprintf> and appends the formatted
10645 output to an SV.  If the appended data contains "wide" characters
10646 (including, but not limited to, SVs with a UTF-8 PV formatted with %s,
10647 and characters >255 formatted with %c), the original SV might get
10648 upgraded to UTF-8.  Handles 'get' magic, but not 'set' magic.  See
10649 C<sv_catpvf_mg>.  If the original SV was UTF-8, the pattern should be
10650 valid UTF-8; if the original SV was bytes, the pattern should be too.
10651
10652 =cut */
10653
10654 void
10655 Perl_sv_catpvf(pTHX_ SV *const sv, const char *const pat, ...)
10656 {
10657     va_list args;
10658
10659     PERL_ARGS_ASSERT_SV_CATPVF;
10660
10661     va_start(args, pat);
10662     sv_vcatpvfn_flags(sv, pat, strlen(pat), &args, NULL, 0, NULL, SV_GMAGIC|SV_SMAGIC);
10663     va_end(args);
10664 }
10665
10666 /*
10667 =for apidoc sv_vcatpvf
10668
10669 Processes its arguments like C<vsprintf> and appends the formatted output
10670 to an SV.  Does not handle 'set' magic.  See C<sv_vcatpvf_mg>.
10671
10672 Usually used via its frontend C<sv_catpvf>.
10673
10674 =cut
10675 */
10676
10677 void
10678 Perl_sv_vcatpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args)
10679 {
10680     PERL_ARGS_ASSERT_SV_VCATPVF;
10681
10682     sv_vcatpvfn_flags(sv, pat, strlen(pat), args, NULL, 0, NULL, SV_GMAGIC|SV_SMAGIC);
10683 }
10684
10685 /*
10686 =for apidoc sv_catpvf_mg
10687
10688 Like C<sv_catpvf>, but also handles 'set' magic.
10689
10690 =cut
10691 */
10692
10693 void
10694 Perl_sv_catpvf_mg(pTHX_ SV *const sv, const char *const pat, ...)
10695 {
10696     va_list args;
10697
10698     PERL_ARGS_ASSERT_SV_CATPVF_MG;
10699
10700     va_start(args, pat);
10701     sv_vcatpvfn_flags(sv, pat, strlen(pat), &args, NULL, 0, NULL, SV_GMAGIC|SV_SMAGIC);
10702     SvSETMAGIC(sv);
10703     va_end(args);
10704 }
10705
10706 /*
10707 =for apidoc sv_vcatpvf_mg
10708
10709 Like C<sv_vcatpvf>, but also handles 'set' magic.
10710
10711 Usually used via its frontend C<sv_catpvf_mg>.
10712
10713 =cut
10714 */
10715
10716 void
10717 Perl_sv_vcatpvf_mg(pTHX_ SV *const sv, const char *const pat, va_list *const args)
10718 {
10719     PERL_ARGS_ASSERT_SV_VCATPVF_MG;
10720
10721     sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
10722     SvSETMAGIC(sv);
10723 }
10724
10725 /*
10726 =for apidoc sv_vsetpvfn
10727
10728 Works like C<sv_vcatpvfn> but copies the text into the SV instead of
10729 appending it.
10730
10731 Usually used via one of its frontends C<sv_vsetpvf> and C<sv_vsetpvf_mg>.
10732
10733 =cut
10734 */
10735
10736 void
10737 Perl_sv_vsetpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
10738                  va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted)
10739 {
10740     PERL_ARGS_ASSERT_SV_VSETPVFN;
10741
10742     sv_setpvs(sv, "");
10743     sv_vcatpvfn_flags(sv, pat, patlen, args, svargs, svmax, maybe_tainted, 0);
10744 }
10745
10746
10747 /*
10748  * Warn of missing argument to sprintf, and then return a defined value
10749  * to avoid inappropriate "use of uninit" warnings [perl #71000].
10750  */
10751 STATIC SV*
10752 S_vcatpvfn_missing_argument(pTHX) {
10753     if (ckWARN(WARN_MISSING)) {
10754         Perl_warner(aTHX_ packWARN(WARN_MISSING), "Missing argument in %s",
10755                 PL_op ? OP_DESC(PL_op) : "sv_vcatpvfn()");
10756     }
10757     return &PL_sv_no;
10758 }
10759
10760
10761 STATIC I32
10762 S_expect_number(pTHX_ char **const pattern)
10763 {
10764     I32 var = 0;
10765
10766     PERL_ARGS_ASSERT_EXPECT_NUMBER;
10767
10768     switch (**pattern) {
10769     case '1': case '2': case '3':
10770     case '4': case '5': case '6':
10771     case '7': case '8': case '9':
10772         var = *(*pattern)++ - '0';
10773         while (isDIGIT(**pattern)) {
10774             const I32 tmp = var * 10 + (*(*pattern)++ - '0');
10775             if (tmp < var)
10776                 Perl_croak(aTHX_ "Integer overflow in format string for %s", (PL_op ? OP_DESC(PL_op) : "sv_vcatpvfn"));
10777             var = tmp;
10778         }
10779     }
10780     return var;
10781 }
10782
10783 STATIC char *
10784 S_F0convert(NV nv, char *const endbuf, STRLEN *const len)
10785 {
10786     const int neg = nv < 0;
10787     UV uv;
10788
10789     PERL_ARGS_ASSERT_F0CONVERT;
10790
10791     if (UNLIKELY(Perl_isinfnan(nv))) {
10792         STRLEN n = S_infnan_2pv(nv, endbuf - *len, *len, 0);
10793         *len = n;
10794         return endbuf - n;
10795     }
10796     if (neg)
10797         nv = -nv;
10798     if (nv < UV_MAX) {
10799         char *p = endbuf;
10800         nv += 0.5;
10801         uv = (UV)nv;
10802         if (uv & 1 && uv == nv)
10803             uv--;                       /* Round to even */
10804         do {
10805             const unsigned dig = uv % 10;
10806             *--p = '0' + dig;
10807         } while (uv /= 10);
10808         if (neg)
10809             *--p = '-';
10810         *len = endbuf - p;
10811         return p;
10812     }
10813     return NULL;
10814 }
10815
10816
10817 /*
10818 =for apidoc sv_vcatpvfn
10819
10820 =for apidoc sv_vcatpvfn_flags
10821
10822 Processes its arguments like C<vsprintf> and appends the formatted output
10823 to an SV.  Uses an array of SVs if the C style variable argument list is
10824 missing (NULL).  When running with taint checks enabled, indicates via
10825 C<maybe_tainted> if results are untrustworthy (often due to the use of
10826 locales).
10827
10828 If called as C<sv_vcatpvfn> or flags include C<SV_GMAGIC>, calls get magic.
10829
10830 Usually used via one of its frontends C<sv_vcatpvf> and C<sv_vcatpvf_mg>.
10831
10832 =cut
10833 */
10834
10835 #define VECTORIZE_ARGS  vecsv = va_arg(*args, SV*);\
10836                         vecstr = (U8*)SvPV_const(vecsv,veclen);\
10837                         vec_utf8 = DO_UTF8(vecsv);
10838
10839 /* XXX maybe_tainted is never assigned to, so the doc above is lying. */
10840
10841 void
10842 Perl_sv_vcatpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
10843                  va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted)
10844 {
10845     PERL_ARGS_ASSERT_SV_VCATPVFN;
10846
10847     sv_vcatpvfn_flags(sv, pat, patlen, args, svargs, svmax, maybe_tainted, SV_GMAGIC|SV_SMAGIC);
10848 }
10849
10850 #ifdef LONGDOUBLE_DOUBLEDOUBLE
10851 /* The first double can be as large as 2**1023, or '1' x '0' x 1023.
10852  * The second double can be as small as 2**-1074, or '0' x 1073 . '1'.
10853  * The sum of them can be '1' . '0' x 2096 . '1', with implied radix point
10854  * after the first 1023 zero bits.
10855  *
10856  * XXX The 2098 is quite large (262.25 bytes) and therefore some sort
10857  * of dynamically growing buffer might be better, start at just 16 bytes
10858  * (for example) and grow only when necessary.  Or maybe just by looking
10859  * at the exponents of the two doubles? */
10860 #  define DOUBLEDOUBLE_MAXBITS 2098
10861 #endif
10862
10863 /* vhex will contain the values (0..15) of the hex digits ("nybbles"
10864  * of 4 bits); 1 for the implicit 1, and the mantissa bits, four bits
10865  * per xdigit.  For the double-double case, this can be rather many.
10866  * The non-double-double-long-double overshoots since all bits of NV
10867  * are not mantissa bits, there are also exponent bits. */
10868 #ifdef LONGDOUBLE_DOUBLEDOUBLE
10869 #  define VHEX_SIZE (1+DOUBLEDOUBLE_MAXBITS/4)
10870 #else
10871 #  define VHEX_SIZE (1+(NVSIZE * 8)/4)
10872 #endif
10873
10874 /* If we do not have a known long double format, (including not using
10875  * long doubles, or long doubles being equal to doubles) then we will
10876  * fall back to the ldexp/frexp route, with which we can retrieve at
10877  * most as many bits as our widest unsigned integer type is.  We try
10878  * to get a 64-bit unsigned integer even if we are not using a 64-bit UV.
10879  *
10880  * (If you want to test the case of UVSIZE == 4, NVSIZE == 8,
10881  *  set the MANTISSATYPE to int and the MANTISSASIZE to 4.)
10882  */
10883 #if defined(HAS_QUAD) && defined(Uquad_t)
10884 #  define MANTISSATYPE Uquad_t
10885 #  define MANTISSASIZE 8
10886 #else
10887 #  define MANTISSATYPE UV
10888 #  define MANTISSASIZE UVSIZE
10889 #endif
10890
10891 #if defined(DOUBLE_LITTLE_ENDIAN) || defined(LONGDOUBLE_LITTLE_ENDIAN)
10892 #  define HEXTRACT_LITTLE_ENDIAN
10893 #elif defined(DOUBLE_BIG_ENDIAN) || defined(LONGDOUBLE_BIG_ENDIAN)
10894 #  define HEXTRACT_BIG_ENDIAN
10895 #else
10896 #  define HEXTRACT_MIX_ENDIAN
10897 #endif
10898
10899 /* S_hextract() is a helper for Perl_sv_vcatpvfn_flags, for extracting
10900  * the hexadecimal values (for %a/%A).  The nv is the NV where the value
10901  * are being extracted from (either directly from the long double in-memory
10902  * presentation, or from the uquad computed via frexp+ldexp).  frexp also
10903  * is used to update the exponent.  vhex is the pointer to the beginning
10904  * of the output buffer (of VHEX_SIZE).
10905  *
10906  * The tricky part is that S_hextract() needs to be called twice:
10907  * the first time with vend as NULL, and the second time with vend as
10908  * the pointer returned by the first call.  What happens is that on
10909  * the first round the output size is computed, and the intended
10910  * extraction sanity checked.  On the second round the actual output
10911  * (the extraction of the hexadecimal values) takes place.
10912  * Sanity failures cause fatal failures during both rounds. */
10913 STATIC U8*
10914 S_hextract(pTHX_ const NV nv, int* exponent, U8* vhex, U8* vend)
10915 {
10916     U8* v = vhex;
10917     int ix;
10918     int ixmin = 0, ixmax = 0;
10919
10920     /* XXX Inf/NaN/denormal handling in the HEXTRACT_IMPLICIT_BIT,
10921      * and elsewhere. */
10922
10923     /* These macros are just to reduce typos, they have multiple
10924      * repetitions below, but usually only one (or sometimes two)
10925      * of them is really being used. */
10926     /* HEXTRACT_OUTPUT() extracts the high nybble first. */
10927 #define HEXTRACT_OUTPUT_HI(ix) (*v++ = nvp[ix] >> 4)
10928 #define HEXTRACT_OUTPUT_LO(ix) (*v++ = nvp[ix] & 0xF)
10929 #define HEXTRACT_OUTPUT(ix) \
10930     STMT_START { \
10931       HEXTRACT_OUTPUT_HI(ix); HEXTRACT_OUTPUT_LO(ix); \
10932    } STMT_END
10933 #define HEXTRACT_COUNT(ix, c) \
10934     STMT_START { \
10935       v += c; if (ix < ixmin) ixmin = ix; else if (ix > ixmax) ixmax = ix; \
10936    } STMT_END
10937 #define HEXTRACT_BYTE(ix) \
10938     STMT_START { \
10939       if (vend) HEXTRACT_OUTPUT(ix); else HEXTRACT_COUNT(ix, 2); \
10940    } STMT_END
10941 #define HEXTRACT_LO_NYBBLE(ix) \
10942     STMT_START { \
10943       if (vend) HEXTRACT_OUTPUT_LO(ix); else HEXTRACT_COUNT(ix, 1); \
10944    } STMT_END
10945     /* HEXTRACT_TOP_NYBBLE is just convenience disguise,
10946      * to make it look less odd when the top bits of a NV
10947      * are extracted using HEXTRACT_LO_NYBBLE: the highest
10948      * order bits can be in the "low nybble" of a byte. */
10949 #define HEXTRACT_TOP_NYBBLE(ix) HEXTRACT_LO_NYBBLE(ix)
10950 #define HEXTRACT_BYTES_LE(a, b) \
10951     for (ix = a; ix >= b; ix--) { HEXTRACT_BYTE(ix); }
10952 #define HEXTRACT_BYTES_BE(a, b) \
10953     for (ix = a; ix <= b; ix++) { HEXTRACT_BYTE(ix); }
10954 #define HEXTRACT_IMPLICIT_BIT(nv) \
10955     STMT_START { \
10956         if (vend) *v++ = ((nv) == 0.0) ? 0 : 1; else v++; \
10957    } STMT_END
10958
10959 /* Most formats do.  Those which don't should undef this. */
10960 #define HEXTRACT_HAS_IMPLICIT_BIT
10961 /* Many formats do.  Those which don't should undef this. */
10962 #define HEXTRACT_HAS_TOP_NYBBLE
10963
10964     /* HEXTRACTSIZE is the maximum number of xdigits. */
10965 #if defined(USE_LONG_DOUBLE) && defined(LONGDOUBLE_DOUBLEDOUBLE)
10966 #  define HEXTRACTSIZE (DOUBLEDOUBLE_MAXBITS/4)
10967 #else
10968 #  define HEXTRACTSIZE 2 * NVSIZE
10969 #endif
10970
10971     const U8* vmaxend = vhex + HEXTRACTSIZE;
10972     PERL_UNUSED_VAR(ix); /* might happen */
10973     (void)Perl_frexp(PERL_ABS(nv), exponent);
10974     if (vend && (vend <= vhex || vend > vmaxend))
10975         Perl_croak(aTHX_ "Hexadecimal float: internal error");
10976     {
10977         /* First check if using long doubles. */
10978 #if defined(USE_LONG_DOUBLE) && (NVSIZE > DOUBLESIZE)
10979 #  if LONG_DOUBLEKIND == LONG_DOUBLE_IS_IEEE_754_128_BIT_LITTLE_ENDIAN
10980         /* Used in e.g. VMS and HP-UX IA-64, e.g. -0.1L:
10981          * 9a 99 99 99 99 99 99 99 99 99 99 99 99 99 fb 3f */
10982         /* The bytes 13..0 are the mantissa/fraction,
10983          * the 15,14 are the sign+exponent. */
10984         const U8* nvp = (const U8*)(&nv);
10985         HEXTRACT_IMPLICIT_BIT(nv);
10986 #   undef HEXTRACT_HAS_TOP_NYBBLE
10987         HEXTRACT_BYTES_LE(13, 0);
10988 #  elif LONG_DOUBLEKIND == LONG_DOUBLE_IS_IEEE_754_128_BIT_BIG_ENDIAN
10989         /* Used in e.g. Solaris Sparc and HP-UX PA-RISC, e.g. -0.1L:
10990          * bf fb 99 99 99 99 99 99 99 99 99 99 99 99 99 9a */
10991         /* The bytes 2..15 are the mantissa/fraction,
10992          * the 0,1 are the sign+exponent. */
10993         const U8* nvp = (const U8*)(&nv);
10994         HEXTRACT_IMPLICIT_BIT(nv);
10995 #   undef HEXTRACT_HAS_TOP_NYBBLE
10996         HEXTRACT_BYTES_BE(2, 15);
10997 #  elif LONG_DOUBLEKIND == LONG_DOUBLE_IS_X86_80_BIT_LITTLE_ENDIAN
10998         /* x86 80-bit "extended precision", 64 bits of mantissa / fraction /
10999          * significand, 15 bits of exponent, 1 bit of sign.  NVSIZE can
11000          * be either 12 (ILP32, Solaris x86) or 16 (LP64, Linux and OS X),
11001          * meaning that 2 or 6 bytes are empty padding. */
11002         /* The bytes 7..0 are the mantissa/fraction */
11003         const U8* nvp = (const U8*)(&nv);
11004 #    undef HEXTRACT_HAS_IMPLICIT_BIT
11005 #    undef HEXTRACT_HAS_TOP_NYBBLE
11006         HEXTRACT_BYTES_LE(7, 0);
11007 #  elif LONG_DOUBLEKIND == LONG_DOUBLE_IS_X86_80_BIT_BIG_ENDIAN
11008         /* Does this format ever happen? (Wikipedia says the Motorola
11009          * 6888x math coprocessors used format _like_ this but padded
11010          * to 96 bits with 16 unused bits between the exponent and the
11011          * mantissa.) */
11012         const U8* nvp = (const U8*)(&nv);
11013 #    undef HEXTRACT_HAS_IMPLICIT_BIT
11014 #    undef HEXTRACT_HAS_TOP_NYBBLE
11015         HEXTRACT_BYTES_BE(0, 7);
11016 #  else
11017 #    define HEXTRACT_FALLBACK
11018         /* Double-double format: two doubles next to each other.
11019          * The first double is the high-order one, exactly like
11020          * it would be for a "lone" double.  The second double
11021          * is shifted down using the exponent so that that there
11022          * are no common bits.  The tricky part is that the value
11023          * of the double-double is the SUM of the two doubles and
11024          * the second one can be also NEGATIVE.
11025          *
11026          * Because of this tricky construction the bytewise extraction we
11027          * use for the other long double formats doesn't work, we must
11028          * extract the values bit by bit.
11029          *
11030          * The little-endian double-double is used .. somewhere?
11031          *
11032          * The big endian double-double is used in e.g. PPC/Power (AIX)
11033          * and MIPS (SGI).
11034          *
11035          * The mantissa bits are in two separate stretches, e.g. for -0.1L:
11036          * 9a 99 99 99 99 99 59 bc 9a 99 99 99 99 99 b9 3f (LE)
11037          * 3f b9 99 99 99 99 99 9a bc 59 99 99 99 99 99 9a (BE)
11038          */
11039 #  endif
11040 #else /* #if defined(USE_LONG_DOUBLE) && (NVSIZE > DOUBLESIZE) */
11041         /* Using normal doubles, not long doubles.
11042          *
11043          * We generate 4-bit xdigits (nybble/nibble) instead of 8-bit
11044          * bytes, since we might need to handle printf precision, and
11045          * also need to insert the radix. */
11046 #  if NVSIZE == 8
11047 #    ifdef HEXTRACT_LITTLE_ENDIAN
11048         /* 0 1 2 3 4 5 6 7 (MSB = 7, LSB = 0, 6+7 = exponent+sign) */
11049         const U8* nvp = (const U8*)(&nv);
11050         HEXTRACT_IMPLICIT_BIT(nv);
11051         HEXTRACT_TOP_NYBBLE(6);
11052         HEXTRACT_BYTES_LE(5, 0);
11053 #    elif defined(HEXTRACT_BIG_ENDIAN)
11054         /* 7 6 5 4 3 2 1 0 (MSB = 7, LSB = 0, 6+7 = exponent+sign) */
11055         const U8* nvp = (const U8*)(&nv);
11056         HEXTRACT_IMPLICIT_BIT(nv);
11057         HEXTRACT_TOP_NYBBLE(1);
11058         HEXTRACT_BYTES_BE(2, 7);
11059 #    elif DOUBLEKIND == DOUBLE_IS_IEEE_754_64_BIT_MIXED_ENDIAN_LE_BE
11060         /* 4 5 6 7 0 1 2 3 (MSB = 7, LSB = 0, 6:7 = nybble:exponent:sign) */
11061         const U8* nvp = (const U8*)(&nv);
11062         HEXTRACT_IMPLICIT_BIT(nv);
11063         HEXTRACT_TOP_NYBBLE(2); /* 6 */
11064         HEXTRACT_BYTE(1); /* 5 */
11065         HEXTRACT_BYTE(0); /* 4 */
11066         HEXTRACT_BYTE(7); /* 3 */
11067         HEXTRACT_BYTE(6); /* 2 */
11068         HEXTRACT_BYTE(5); /* 1 */
11069         HEXTRACT_BYTE(4); /* 0 */
11070 #    elif DOUBLEKIND == DOUBLE_IS_IEEE_754_64_BIT_MIXED_ENDIAN_BE_LE
11071         /* 3 2 1 0 7 6 5 4 (MSB = 7, LSB = 0, 7:6 = sign:exponent:nybble) */
11072         const U8* nvp = (const U8*)(&nv);
11073         HEXTRACT_IMPLICIT_BIT(nv);
11074         HEXTRACT_TOP_NYBBLE(5); /* 6 */
11075         HEXTRACT_BYTE(6); /* 5 */
11076         HEXTRACT_BYTE(7); /* 4 */
11077         HEXTRACT_BYTE(0); /* 3 */
11078         HEXTRACT_BYTE(1); /* 2 */
11079         HEXTRACT_BYTE(2); /* 1 */
11080         HEXTRACT_BYTE(3); /* 0 */
11081 #    else
11082 #      define HEXTRACT_FALLBACK
11083 #    endif
11084 #  else
11085 #    define HEXTRACT_FALLBACK
11086 #  endif
11087 #endif /* #if defined(USE_LONG_DOUBLE) && (NVSIZE > DOUBLESIZE) #else */
11088 #  ifdef HEXTRACT_FALLBACK
11089 #    undef HEXTRACT_HAS_TOP_NYBBLE /* Meaningless, but consistent. */
11090         /* The fallback is used for the double-double format, and
11091          * for unknown long double formats, and for unknown double
11092          * formats, or in general unknown NV formats. */
11093         if (nv == (NV)0.0) {
11094             if (vend)
11095                 *v++ = 0;
11096             else
11097                 v++;
11098             *exponent = 0;
11099         }
11100         else {
11101             NV d = nv < 0 ? -nv : nv;
11102             NV e = (NV)1.0;
11103             U8 ha = 0x0; /* hexvalue accumulator */
11104             U8 hd = 0x8; /* hexvalue digit */
11105
11106             /* Shift d and e (and update exponent) so that e <= d < 2*e,
11107              * this is essentially manual frexp(). Multiplying by 0.5 and
11108              * doubling should be lossless in binary floating point. */
11109
11110             *exponent = 1;
11111
11112             while (e > d) {
11113                 e *= (NV)0.5;
11114                 (*exponent)--;
11115             }
11116             /* Now d >= e */
11117
11118             while (d >= e + e) {
11119                 e += e;
11120                 (*exponent)++;
11121             }
11122             /* Now e <= d < 2*e */
11123
11124             /* First extract the leading hexdigit (the implicit bit). */
11125             if (d >= e) {
11126                 d -= e;
11127                 if (vend)
11128                     *v++ = 1;
11129                 else
11130                     v++;
11131             }
11132             else {
11133                 if (vend)
11134                     *v++ = 0;
11135                 else
11136                     v++;
11137             }
11138             e *= (NV)0.5;
11139
11140             /* Then extract the remaining hexdigits. */
11141             while (d > (NV)0.0) {
11142                 if (d >= e) {
11143                     ha |= hd;
11144                     d -= e;
11145                 }
11146                 if (hd == 1) {
11147                     /* Output or count in groups of four bits,
11148                      * that is, when the hexdigit is down to one. */
11149                     if (vend)
11150                         *v++ = ha;
11151                     else
11152                         v++;
11153                     /* Reset the hexvalue. */
11154                     ha = 0x0;
11155                     hd = 0x8;
11156                 }
11157                 else
11158                     hd >>= 1;
11159                 e *= (NV)0.5;
11160             }
11161
11162             /* Flush possible pending hexvalue. */
11163             if (ha) {
11164                 if (vend)
11165                     *v++ = ha;
11166                 else
11167                     v++;
11168             }
11169         }
11170 #  endif
11171     }
11172     /* Croak for various reasons: if the output pointer escaped the
11173      * output buffer, if the extraction index escaped the extraction
11174      * buffer, or if the ending output pointer didn't match the
11175      * previously computed value. */
11176     if (v <= vhex || v - vhex >= VHEX_SIZE ||
11177         /* For double-double the ixmin and ixmax stay at zero,
11178          * which is convenient since the HEXTRACTSIZE is tricky
11179          * for double-double. */
11180         ixmin < 0 || ixmax >= NVSIZE ||
11181         (vend && v != vend))
11182         Perl_croak(aTHX_ "Hexadecimal float: internal error");
11183     return v;
11184 }
11185
11186 void
11187 Perl_sv_vcatpvfn_flags(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
11188                        va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted,
11189                        const U32 flags)
11190 {
11191     char *p;
11192     char *q;
11193     const char *patend;
11194     STRLEN origlen;
11195     I32 svix = 0;
11196     static const char nullstr[] = "(null)";
11197     SV *argsv = NULL;
11198     bool has_utf8 = DO_UTF8(sv);    /* has the result utf8? */
11199     const bool pat_utf8 = has_utf8; /* the pattern is in utf8? */
11200     SV *nsv = NULL;
11201     /* Times 4: a decimal digit takes more than 3 binary digits.
11202      * NV_DIG: mantissa takes than many decimal digits.
11203      * Plus 32: Playing safe. */
11204     char ebuf[IV_DIG * 4 + NV_DIG + 32];
11205     bool no_redundant_warning = FALSE; /* did we use any explicit format parameter index? */
11206     bool hexfp = FALSE; /* hexadecimal floating point? */
11207
11208     DECLARATION_FOR_STORE_LC_NUMERIC_SET_TO_NEEDED;
11209
11210     PERL_ARGS_ASSERT_SV_VCATPVFN_FLAGS;
11211     PERL_UNUSED_ARG(maybe_tainted);
11212
11213     if (flags & SV_GMAGIC)
11214         SvGETMAGIC(sv);
11215
11216     /* no matter what, this is a string now */
11217     (void)SvPV_force_nomg(sv, origlen);
11218
11219     /* special-case "", "%s", and "%-p" (SVf - see below) */
11220     if (patlen == 0) {
11221         if (svmax && ckWARN(WARN_REDUNDANT))
11222             Perl_warner(aTHX_ packWARN(WARN_REDUNDANT), "Redundant argument in %s",
11223                         PL_op ? OP_DESC(PL_op) : "sv_vcatpvfn()");
11224         return;
11225     }
11226     if (patlen == 2 && pat[0] == '%' && pat[1] == 's') {
11227         if (svmax > 1 && ckWARN(WARN_REDUNDANT))
11228             Perl_warner(aTHX_ packWARN(WARN_REDUNDANT), "Redundant argument in %s",
11229                         PL_op ? OP_DESC(PL_op) : "sv_vcatpvfn()");
11230
11231         if (args) {
11232             const char * const s = va_arg(*args, char*);
11233             sv_catpv_nomg(sv, s ? s : nullstr);
11234         }
11235         else if (svix < svmax) {
11236             /* we want get magic on the source but not the target. sv_catsv can't do that, though */
11237             SvGETMAGIC(*svargs);
11238             sv_catsv_nomg(sv, *svargs);
11239         }
11240         else
11241             S_vcatpvfn_missing_argument(aTHX);
11242         return;
11243     }
11244     if (args && patlen == 3 && pat[0] == '%' &&
11245                 pat[1] == '-' && pat[2] == 'p') {
11246         if (svmax > 1 && ckWARN(WARN_REDUNDANT))
11247             Perl_warner(aTHX_ packWARN(WARN_REDUNDANT), "Redundant argument in %s",
11248                         PL_op ? OP_DESC(PL_op) : "sv_vcatpvfn()");
11249         argsv = MUTABLE_SV(va_arg(*args, void*));
11250         sv_catsv_nomg(sv, argsv);
11251         return;
11252     }
11253
11254 #if !defined(USE_LONG_DOUBLE) && !defined(USE_QUADMATH)
11255     /* special-case "%.<number>[gf]" */
11256     if ( !args && patlen <= 5 && pat[0] == '%' && pat[1] == '.'
11257          && (pat[patlen-1] == 'g' || pat[patlen-1] == 'f') ) {
11258         unsigned digits = 0;
11259         const char *pp;
11260
11261         pp = pat + 2;
11262         while (*pp >= '0' && *pp <= '9')
11263             digits = 10 * digits + (*pp++ - '0');
11264
11265         /* XXX: Why do this `svix < svmax` test? Couldn't we just
11266            format the first argument and WARN_REDUNDANT if svmax > 1?
11267            Munged by Nicholas Clark in v5.13.0-209-g95ea86d */
11268         if (pp - pat == (int)patlen - 1 && svix < svmax) {
11269             const NV nv = SvNV(*svargs);
11270             if (LIKELY(!Perl_isinfnan(nv))) {
11271                 if (*pp == 'g') {
11272                     /* Add check for digits != 0 because it seems that some
11273                        gconverts are buggy in this case, and we don't yet have
11274                        a Configure test for this.  */
11275                     if (digits && digits < sizeof(ebuf) - NV_DIG - 10) {
11276                         /* 0, point, slack */
11277                         STORE_LC_NUMERIC_SET_TO_NEEDED();
11278                         SNPRINTF_G(nv, ebuf, size, digits);
11279                         sv_catpv_nomg(sv, ebuf);
11280                         if (*ebuf)      /* May return an empty string for digits==0 */
11281                             return;
11282                     }
11283                 } else if (!digits) {
11284                     STRLEN l;
11285
11286                     if ((p = F0convert(nv, ebuf + sizeof ebuf, &l))) {
11287                         sv_catpvn_nomg(sv, p, l);
11288                         return;
11289                     }
11290                 }
11291             }
11292         }
11293     }
11294 #endif /* !USE_LONG_DOUBLE */
11295
11296     if (!args && svix < svmax && DO_UTF8(*svargs))
11297         has_utf8 = TRUE;
11298
11299     patend = (char*)pat + patlen;
11300     for (p = (char*)pat; p < patend; p = q) {
11301         bool alt = FALSE;
11302         bool left = FALSE;
11303         bool vectorize = FALSE;
11304         bool vectorarg = FALSE;
11305         bool vec_utf8 = FALSE;
11306         char fill = ' ';
11307         char plus = 0;
11308         char intsize = 0;
11309         STRLEN width = 0;
11310         STRLEN zeros = 0;
11311         bool has_precis = FALSE;
11312         STRLEN precis = 0;
11313         const I32 osvix = svix;
11314         bool is_utf8 = FALSE;  /* is this item utf8?   */
11315 #ifdef HAS_LDBL_SPRINTF_BUG
11316         /* This is to try to fix a bug with irix/nonstop-ux/powerux and
11317            with sfio - Allen <allens@cpan.org> */
11318         bool fix_ldbl_sprintf_bug = FALSE;
11319 #endif
11320
11321         char esignbuf[4];
11322         U8 utf8buf[UTF8_MAXBYTES+1];
11323         STRLEN esignlen = 0;
11324
11325         const char *eptr = NULL;
11326         const char *fmtstart;
11327         STRLEN elen = 0;
11328         SV *vecsv = NULL;
11329         const U8 *vecstr = NULL;
11330         STRLEN veclen = 0;
11331         char c = 0;
11332         int i;
11333         unsigned base = 0;
11334         IV iv = 0;
11335         UV uv = 0;
11336         /* We need a long double target in case HAS_LONG_DOUBLE,
11337          * even without USE_LONG_DOUBLE, so that we can printf with
11338          * long double formats, even without NV being long double.
11339          * But we call the target 'fv' instead of 'nv', since most of
11340          * the time it is not (most compilers these days recognize
11341          * "long double", even if only as a synonym for "double").
11342         */
11343 #if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE && \
11344         defined(PERL_PRIgldbl) && !defined(USE_QUADMATH)
11345         long double fv;
11346 #  ifdef Perl_isfinitel
11347 #    define FV_ISFINITE(x) Perl_isfinitel(x)
11348 #  endif
11349 #  define FV_GF PERL_PRIgldbl
11350 #    if defined(__VMS) && defined(__ia64) && defined(__IEEE_FLOAT)
11351        /* Work around breakage in OTS$CVT_FLOAT_T_X */
11352 #      define NV_TO_FV(nv,fv) STMT_START {                   \
11353                                            double _dv = nv;  \
11354                                            fv = Perl_isnan(_dv) ? LDBL_QNAN : _dv; \
11355                               } STMT_END
11356 #    else
11357 #      define NV_TO_FV(nv,fv) (fv)=(nv)
11358 #    endif
11359 #else
11360         NV fv;
11361 #  define FV_GF NVgf
11362 #  define NV_TO_FV(nv,fv) (fv)=(nv)
11363 #endif
11364 #ifndef FV_ISFINITE
11365 #  define FV_ISFINITE(x) Perl_isfinite((NV)(x))
11366 #endif
11367         NV nv;
11368         STRLEN have;
11369         STRLEN need;
11370         STRLEN gap;
11371         const char *dotstr = ".";
11372         STRLEN dotstrlen = 1;
11373         I32 efix = 0; /* explicit format parameter index */
11374         I32 ewix = 0; /* explicit width index */
11375         I32 epix = 0; /* explicit precision index */
11376         I32 evix = 0; /* explicit vector index */
11377         bool asterisk = FALSE;
11378         bool infnan = FALSE;
11379
11380         /* echo everything up to the next format specification */
11381         for (q = p; q < patend && *q != '%'; ++q) ;
11382         if (q > p) {
11383             if (has_utf8 && !pat_utf8)
11384                 sv_catpvn_nomg_utf8_upgrade(sv, p, q - p, nsv);
11385             else
11386                 sv_catpvn_nomg(sv, p, q - p);
11387             p = q;
11388         }
11389         if (q++ >= patend)
11390             break;
11391
11392         fmtstart = q;
11393
11394 /*
11395     We allow format specification elements in this order:
11396         \d+\$              explicit format parameter index
11397         [-+ 0#]+           flags
11398         v|\*(\d+\$)?v      vector with optional (optionally specified) arg
11399         0                  flag (as above): repeated to allow "v02"     
11400         \d+|\*(\d+\$)?     width using optional (optionally specified) arg
11401         \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
11402         [hlqLV]            size
11403     [%bcdefginopsuxDFOUX] format (mandatory)
11404 */
11405
11406         if (args) {
11407 /*  
11408         As of perl5.9.3, printf format checking is on by default.
11409         Internally, perl uses %p formats to provide an escape to
11410         some extended formatting.  This block deals with those
11411         extensions: if it does not match, (char*)q is reset and
11412         the normal format processing code is used.
11413
11414         Currently defined extensions are:
11415                 %p              include pointer address (standard)      
11416                 %-p     (SVf)   include an SV (previously %_)
11417                 %-<num>p        include an SV with precision <num>      
11418                 %2p             include a HEK
11419                 %3p             include a HEK with precision of 256
11420                 %4p             char* preceded by utf8 flag and length
11421                 %<num>p         (where num is 1 or > 4) reserved for future
11422                                 extensions
11423
11424         Robin Barker 2005-07-14 (but modified since)
11425
11426                 %1p     (VDf)   removed.  RMB 2007-10-19
11427 */
11428             char* r = q; 
11429             bool sv = FALSE;    
11430             STRLEN n = 0;
11431             if (*q == '-')
11432                 sv = *q++;
11433             else if (strnEQ(q, UTF8f, sizeof(UTF8f)-1)) { /* UTF8f */
11434                 /* The argument has already gone through cBOOL, so the cast
11435                    is safe. */
11436                 is_utf8 = (bool)va_arg(*args, int);
11437                 elen = va_arg(*args, UV);
11438                 if ((IV)elen < 0) {
11439                     /* check if utf8 length is larger than 0 when cast to IV */
11440                     assert( (IV)elen >= 0 ); /* in DEBUGGING build we want to crash */
11441                     elen= 0; /* otherwise we want to treat this as an empty string */
11442                 }
11443                 eptr = va_arg(*args, char *);
11444                 q += sizeof(UTF8f)-1;
11445                 goto string;
11446             }
11447             n = expect_number(&q);
11448             if (*q++ == 'p') {
11449                 if (sv) {                       /* SVf */
11450                     if (n) {
11451                         precis = n;
11452                         has_precis = TRUE;
11453                     }
11454                     argsv = MUTABLE_SV(va_arg(*args, void*));
11455                     eptr = SvPV_const(argsv, elen);
11456                     if (DO_UTF8(argsv))
11457                         is_utf8 = TRUE;
11458                     goto string;
11459                 }
11460                 else if (n==2 || n==3) {        /* HEKf */
11461                     HEK * const hek = va_arg(*args, HEK *);
11462                     eptr = HEK_KEY(hek);
11463                     elen = HEK_LEN(hek);
11464                     if (HEK_UTF8(hek)) is_utf8 = TRUE;
11465                     if (n==3) precis = 256, has_precis = TRUE;
11466                     goto string;
11467                 }
11468                 else if (n) {
11469                     Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),
11470                                      "internal %%<num>p might conflict with future printf extensions");
11471                 }
11472             }
11473             q = r; 
11474         }
11475
11476         if ( (width = expect_number(&q)) ) {
11477             if (*q == '$') {
11478                 ++q;
11479                 efix = width;
11480                 if (!no_redundant_warning)
11481                     /* I've forgotten if it's a better
11482                        micro-optimization to always set this or to
11483                        only set it if it's unset */
11484                     no_redundant_warning = TRUE;
11485             } else {
11486                 goto gotwidth;
11487             }
11488         }
11489
11490         /* FLAGS */
11491
11492         while (*q) {
11493             switch (*q) {
11494             case ' ':
11495             case '+':
11496                 if (plus == '+' && *q == ' ') /* '+' over ' ' */
11497                     q++;
11498                 else
11499                     plus = *q++;
11500                 continue;
11501
11502             case '-':
11503                 left = TRUE;
11504                 q++;
11505                 continue;
11506
11507             case '0':
11508                 fill = *q++;
11509                 continue;
11510
11511             case '#':
11512                 alt = TRUE;
11513                 q++;
11514                 continue;
11515
11516             default:
11517                 break;
11518             }
11519             break;
11520         }
11521
11522       tryasterisk:
11523         if (*q == '*') {
11524             q++;
11525             if ( (ewix = expect_number(&q)) )
11526                 if (*q++ != '$')
11527                     goto unknown;
11528             asterisk = TRUE;
11529         }
11530         if (*q == 'v') {
11531             q++;
11532             if (vectorize)
11533                 goto unknown;
11534             if ((vectorarg = asterisk)) {
11535                 evix = ewix;
11536                 ewix = 0;
11537                 asterisk = FALSE;
11538             }
11539             vectorize = TRUE;
11540             goto tryasterisk;
11541         }
11542
11543         if (!asterisk)
11544         {
11545             if( *q == '0' )
11546                 fill = *q++;
11547             width = expect_number(&q);
11548         }
11549
11550         if (vectorize && vectorarg) {
11551             /* vectorizing, but not with the default "." */
11552             if (args)
11553                 vecsv = va_arg(*args, SV*);
11554             else if (evix) {
11555                 vecsv = (evix > 0 && evix <= svmax)
11556                     ? svargs[evix-1] : S_vcatpvfn_missing_argument(aTHX);
11557             } else {
11558                 vecsv = svix < svmax
11559                     ? svargs[svix++] : S_vcatpvfn_missing_argument(aTHX);
11560             }
11561             dotstr = SvPV_const(vecsv, dotstrlen);
11562             /* Keep the DO_UTF8 test *after* the SvPV call, else things go
11563                bad with tied or overloaded values that return UTF8.  */
11564             if (DO_UTF8(vecsv))
11565                 is_utf8 = TRUE;
11566             else if (has_utf8) {
11567                 vecsv = sv_mortalcopy(vecsv);
11568                 sv_utf8_upgrade(vecsv);
11569                 dotstr = SvPV_const(vecsv, dotstrlen);
11570                 is_utf8 = TRUE;
11571             }               
11572         }
11573
11574         if (asterisk) {
11575             if (args)
11576                 i = va_arg(*args, int);
11577             else
11578                 i = (ewix ? ewix <= svmax : svix < svmax) ?
11579                     SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
11580             left |= (i < 0);
11581             width = (i < 0) ? -i : i;
11582         }
11583       gotwidth:
11584
11585         /* PRECISION */
11586
11587         if (*q == '.') {
11588             q++;
11589             if (*q == '*') {
11590                 q++;
11591                 if ( ((epix = expect_number(&q))) && (*q++ != '$') )
11592                     goto unknown;
11593                 /* XXX: todo, support specified precision parameter */
11594                 if (epix)
11595                     goto unknown;
11596                 if (args)
11597                     i = va_arg(*args, int);
11598                 else
11599                     i = (ewix ? ewix <= svmax : svix < svmax)
11600                         ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
11601                 precis = i;
11602                 has_precis = !(i < 0);
11603             }
11604             else {
11605                 precis = 0;
11606                 while (isDIGIT(*q))
11607                     precis = precis * 10 + (*q++ - '0');
11608                 has_precis = TRUE;
11609             }
11610         }
11611
11612         if (vectorize) {
11613             if (args) {
11614                 VECTORIZE_ARGS
11615             }
11616             else if (efix ? (efix > 0 && efix <= svmax) : svix < svmax) {
11617                 vecsv = svargs[efix ? efix-1 : svix++];
11618                 vecstr = (U8*)SvPV_const(vecsv,veclen);
11619                 vec_utf8 = DO_UTF8(vecsv);
11620
11621                 /* if this is a version object, we need to convert
11622                  * back into v-string notation and then let the
11623                  * vectorize happen normally
11624                  */
11625                 if (sv_isobject(vecsv) && sv_derived_from(vecsv, "version")) {
11626                     if ( hv_exists(MUTABLE_HV(SvRV(vecsv)), "alpha", 5 ) ) {
11627                         Perl_ck_warner_d(aTHX_ packWARN(WARN_PRINTF),
11628                         "vector argument not supported with alpha versions");
11629                         goto vdblank;
11630                     }
11631                     vecsv = sv_newmortal();
11632                     scan_vstring((char *)vecstr, (char *)vecstr + veclen,
11633                                  vecsv);
11634                     vecstr = (U8*)SvPV_const(vecsv, veclen);
11635                     vec_utf8 = DO_UTF8(vecsv);
11636                 }
11637             }
11638             else {
11639               vdblank:
11640                 vecstr = (U8*)"";
11641                 veclen = 0;
11642             }
11643         }
11644
11645         /* SIZE */
11646
11647         switch (*q) {
11648 #ifdef WIN32
11649         case 'I':                       /* Ix, I32x, and I64x */
11650 #  ifdef USE_64_BIT_INT
11651             if (q[1] == '6' && q[2] == '4') {
11652                 q += 3;
11653                 intsize = 'q';
11654                 break;
11655             }
11656 #  endif
11657             if (q[1] == '3' && q[2] == '2') {
11658                 q += 3;
11659                 break;
11660             }
11661 #  ifdef USE_64_BIT_INT
11662             intsize = 'q';
11663 #  endif
11664             q++;
11665             break;
11666 #endif
11667 #if (IVSIZE >= 8 || defined(HAS_LONG_DOUBLE)) || \
11668     (IVSIZE == 4 && !defined(HAS_LONG_DOUBLE))
11669         case 'L':                       /* Ld */
11670             /* FALLTHROUGH */
11671 #  ifdef USE_QUADMATH
11672         case 'Q':
11673             /* FALLTHROUGH */
11674 #  endif
11675 #  if IVSIZE >= 8
11676         case 'q':                       /* qd */
11677 #  endif
11678             intsize = 'q';
11679             q++;
11680             break;
11681 #endif
11682         case 'l':
11683             ++q;
11684 #if (IVSIZE >= 8 || defined(HAS_LONG_DOUBLE)) || \
11685     (IVSIZE == 4 && !defined(HAS_LONG_DOUBLE))
11686             if (*q == 'l') {    /* lld, llf */
11687                 intsize = 'q';
11688                 ++q;
11689             }
11690             else
11691 #endif
11692                 intsize = 'l';
11693             break;
11694         case 'h':
11695             if (*++q == 'h') {  /* hhd, hhu */
11696                 intsize = 'c';
11697                 ++q;
11698             }
11699             else
11700                 intsize = 'h';
11701             break;
11702         case 'V':
11703         case 'z':
11704         case 't':
11705 #ifdef I_STDINT
11706         case 'j':
11707 #endif
11708             intsize = *q++;
11709             break;
11710         }
11711
11712         /* CONVERSION */
11713
11714         if (*q == '%') {
11715             eptr = q++;
11716             elen = 1;
11717             if (vectorize) {
11718                 c = '%';
11719                 goto unknown;
11720             }
11721             goto string;
11722         }
11723
11724         if (!vectorize && !args) {
11725             if (efix) {
11726                 const I32 i = efix-1;
11727                 argsv = (i >= 0 && i < svmax)
11728                     ? svargs[i] : S_vcatpvfn_missing_argument(aTHX);
11729             } else {
11730                 argsv = (svix >= 0 && svix < svmax)
11731                     ? svargs[svix++] : S_vcatpvfn_missing_argument(aTHX);
11732             }
11733         }
11734
11735         if (argsv && strchr("BbcDdiOopuUXx",*q)) {
11736             /* XXX va_arg(*args) case? need peek, use va_copy? */
11737             SvGETMAGIC(argsv);
11738             if (UNLIKELY(SvAMAGIC(argsv)))
11739                 argsv = sv_2num(argsv);
11740             infnan = UNLIKELY(isinfnansv(argsv));
11741         }
11742
11743         switch (c = *q++) {
11744
11745             /* STRINGS */
11746
11747         case 'c':
11748             if (vectorize)
11749                 goto unknown;
11750             if (infnan)
11751                 Perl_croak(aTHX_ "Cannot printf %"NVgf" with '%c'",
11752                            /* no va_arg() case */
11753                            SvNV_nomg(argsv), (int)c);
11754             uv = (args) ? va_arg(*args, int) : SvIV_nomg(argsv);
11755             if ((uv > 255 ||
11756                  (!UVCHR_IS_INVARIANT(uv) && SvUTF8(sv)))
11757                 && !IN_BYTES) {
11758                 eptr = (char*)utf8buf;
11759                 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
11760                 is_utf8 = TRUE;
11761             }
11762             else {
11763                 c = (char)uv;
11764                 eptr = &c;
11765                 elen = 1;
11766             }
11767             goto string;
11768
11769         case 's':
11770             if (vectorize)
11771                 goto unknown;
11772             if (args) {
11773                 eptr = va_arg(*args, char*);
11774                 if (eptr)
11775                     elen = strlen(eptr);
11776                 else {
11777                     eptr = (char *)nullstr;
11778                     elen = sizeof nullstr - 1;
11779                 }
11780             }
11781             else {
11782                 eptr = SvPV_const(argsv, elen);
11783                 if (DO_UTF8(argsv)) {
11784                     STRLEN old_precis = precis;
11785                     if (has_precis && precis < elen) {
11786                         STRLEN ulen = sv_or_pv_len_utf8(argsv, eptr, elen);
11787                         STRLEN p = precis > ulen ? ulen : precis;
11788                         precis = sv_or_pv_pos_u2b(argsv, eptr, p, 0);
11789                                                         /* sticks at end */
11790                     }
11791                     if (width) { /* fudge width (can't fudge elen) */
11792                         if (has_precis && precis < elen)
11793                             width += precis - old_precis;
11794                         else
11795                             width +=
11796                                 elen - sv_or_pv_len_utf8(argsv,eptr,elen);
11797                     }
11798                     is_utf8 = TRUE;
11799                 }
11800             }
11801
11802         string:
11803             if (has_precis && precis < elen)
11804                 elen = precis;
11805             break;
11806
11807             /* INTEGERS */
11808
11809         case 'p':
11810             if (infnan) {
11811                 goto floating_point;
11812             }
11813             if (alt || vectorize)
11814                 goto unknown;
11815             uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
11816             base = 16;
11817             goto integer;
11818
11819         case 'D':
11820 #ifdef IV_IS_QUAD
11821             intsize = 'q';
11822 #else
11823             intsize = 'l';
11824 #endif
11825             /* FALLTHROUGH */
11826         case 'd':
11827         case 'i':
11828             if (infnan) {
11829                 goto floating_point;
11830             }
11831             if (vectorize) {
11832                 STRLEN ulen;
11833                 if (!veclen)
11834                     continue;
11835                 if (vec_utf8)
11836                     uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
11837                                         UTF8_ALLOW_ANYUV);
11838                 else {
11839                     uv = *vecstr;
11840                     ulen = 1;
11841                 }
11842                 vecstr += ulen;
11843                 veclen -= ulen;
11844                 if (plus)
11845                      esignbuf[esignlen++] = plus;
11846             }
11847             else if (args) {
11848                 switch (intsize) {
11849                 case 'c':       iv = (char)va_arg(*args, int); break;
11850                 case 'h':       iv = (short)va_arg(*args, int); break;
11851                 case 'l':       iv = va_arg(*args, long); break;
11852                 case 'V':       iv = va_arg(*args, IV); break;
11853                 case 'z':       iv = va_arg(*args, SSize_t); break;
11854 #ifdef HAS_PTRDIFF_T
11855                 case 't':       iv = va_arg(*args, ptrdiff_t); break;
11856 #endif
11857                 default:        iv = va_arg(*args, int); break;
11858 #ifdef I_STDINT
11859                 case 'j':       iv = va_arg(*args, intmax_t); break;
11860 #endif
11861                 case 'q':
11862 #if IVSIZE >= 8
11863                                 iv = va_arg(*args, Quad_t); break;
11864 #else
11865                                 goto unknown;
11866 #endif
11867                 }
11868             }
11869             else {
11870                 IV tiv = SvIV_nomg(argsv); /* work around GCC bug #13488 */
11871                 switch (intsize) {
11872                 case 'c':       iv = (char)tiv; break;
11873                 case 'h':       iv = (short)tiv; break;
11874                 case 'l':       iv = (long)tiv; break;
11875                 case 'V':
11876                 default:        iv = tiv; break;
11877                 case 'q':
11878 #if IVSIZE >= 8
11879                                 iv = (Quad_t)tiv; break;
11880 #else
11881                                 goto unknown;
11882 #endif
11883                 }
11884             }
11885             if ( !vectorize )   /* we already set uv above */
11886             {
11887                 if (iv >= 0) {
11888                     uv = iv;
11889                     if (plus)
11890                         esignbuf[esignlen++] = plus;
11891                 }
11892                 else {
11893                     uv = (iv == IV_MIN) ? (UV)iv : (UV)(-iv);
11894                     esignbuf[esignlen++] = '-';
11895                 }
11896             }
11897             base = 10;
11898             goto integer;
11899
11900         case 'U':
11901 #ifdef IV_IS_QUAD
11902             intsize = 'q';
11903 #else
11904             intsize = 'l';
11905 #endif
11906             /* FALLTHROUGH */
11907         case 'u':
11908             base = 10;
11909             goto uns_integer;
11910
11911         case 'B':
11912         case 'b':
11913             base = 2;
11914             goto uns_integer;
11915
11916         case 'O':
11917 #ifdef IV_IS_QUAD
11918             intsize = 'q';
11919 #else
11920             intsize = 'l';
11921 #endif
11922             /* FALLTHROUGH */
11923         case 'o':
11924             base = 8;
11925             goto uns_integer;
11926
11927         case 'X':
11928         case 'x':
11929             base = 16;
11930
11931         uns_integer:
11932             if (infnan) {
11933                 goto floating_point;
11934             }
11935             if (vectorize) {
11936                 STRLEN ulen;
11937         vector:
11938                 if (!veclen)
11939                     continue;
11940                 if (vec_utf8)
11941                     uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
11942                                         UTF8_ALLOW_ANYUV);
11943                 else {
11944                     uv = *vecstr;
11945                     ulen = 1;
11946                 }
11947                 vecstr += ulen;
11948                 veclen -= ulen;
11949             }
11950             else if (args) {
11951                 switch (intsize) {
11952                 case 'c':  uv = (unsigned char)va_arg(*args, unsigned); break;
11953                 case 'h':  uv = (unsigned short)va_arg(*args, unsigned); break;
11954                 case 'l':  uv = va_arg(*args, unsigned long); break;
11955                 case 'V':  uv = va_arg(*args, UV); break;
11956                 case 'z':  uv = va_arg(*args, Size_t); break;
11957 #ifdef HAS_PTRDIFF_T
11958                 case 't':  uv = va_arg(*args, ptrdiff_t); break; /* will sign extend, but there is no uptrdiff_t, so oh well */
11959 #endif
11960 #ifdef I_STDINT
11961                 case 'j':  uv = va_arg(*args, uintmax_t); break;
11962 #endif
11963                 default:   uv = va_arg(*args, unsigned); break;
11964                 case 'q':
11965 #if IVSIZE >= 8
11966                            uv = va_arg(*args, Uquad_t); break;
11967 #else
11968                            goto unknown;
11969 #endif
11970                 }
11971             }
11972             else {
11973                 UV tuv = SvUV_nomg(argsv); /* work around GCC bug #13488 */
11974                 switch (intsize) {
11975                 case 'c':       uv = (unsigned char)tuv; break;
11976                 case 'h':       uv = (unsigned short)tuv; break;
11977                 case 'l':       uv = (unsigned long)tuv; break;
11978                 case 'V':
11979                 default:        uv = tuv; break;
11980                 case 'q':
11981 #if IVSIZE >= 8
11982                                 uv = (Uquad_t)tuv; break;
11983 #else
11984                                 goto unknown;
11985 #endif
11986                 }
11987             }
11988
11989         integer:
11990             {
11991                 char *ptr = ebuf + sizeof ebuf;
11992                 bool tempalt = uv ? alt : FALSE; /* Vectors can't change alt */
11993                 unsigned dig;
11994                 zeros = 0;
11995
11996                 switch (base) {
11997                 case 16:
11998                     p = (char *)((c == 'X') ? PL_hexdigit + 16 : PL_hexdigit);
11999                     do {
12000                         dig = uv & 15;
12001                         *--ptr = p[dig];
12002                     } while (uv >>= 4);
12003                     if (tempalt) {
12004                         esignbuf[esignlen++] = '0';
12005                         esignbuf[esignlen++] = c;  /* 'x' or 'X' */
12006                     }
12007                     break;
12008                 case 8:
12009                     do {
12010                         dig = uv & 7;
12011                         *--ptr = '0' + dig;
12012                     } while (uv >>= 3);
12013                     if (alt && *ptr != '0')
12014                         *--ptr = '0';
12015                     break;
12016                 case 2:
12017                     do {
12018                         dig = uv & 1;
12019                         *--ptr = '0' + dig;
12020                     } while (uv >>= 1);
12021                     if (tempalt) {
12022                         esignbuf[esignlen++] = '0';
12023                         esignbuf[esignlen++] = c;
12024                     }
12025                     break;
12026                 default:                /* it had better be ten or less */
12027                     do {
12028                         dig = uv % base;
12029                         *--ptr = '0' + dig;
12030                     } while (uv /= base);
12031                     break;
12032                 }
12033                 elen = (ebuf + sizeof ebuf) - ptr;
12034                 eptr = ptr;
12035                 if (has_precis) {
12036                     if (precis > elen)
12037                         zeros = precis - elen;
12038                     else if (precis == 0 && elen == 1 && *eptr == '0'
12039                              && !(base == 8 && alt)) /* "%#.0o" prints "0" */
12040                         elen = 0;
12041
12042                 /* a precision nullifies the 0 flag. */
12043                     if (fill == '0')
12044                         fill = ' ';
12045                 }
12046             }
12047             break;
12048
12049             /* FLOATING POINT */
12050
12051         floating_point:
12052
12053         case 'F':
12054             c = 'f';            /* maybe %F isn't supported here */
12055             /* FALLTHROUGH */
12056         case 'e': case 'E':
12057         case 'f':
12058         case 'g': case 'G':
12059         case 'a': case 'A':
12060             if (vectorize)
12061                 goto unknown;
12062
12063             /* This is evil, but floating point is even more evil */
12064
12065             /* for SV-style calling, we can only get NV
12066                for C-style calling, we assume %f is double;
12067                for simplicity we allow any of %Lf, %llf, %qf for long double
12068             */
12069             switch (intsize) {
12070             case 'V':
12071 #if defined(USE_LONG_DOUBLE) || defined(USE_QUADMATH)
12072                 intsize = 'q';
12073 #endif
12074                 break;
12075 /* [perl #20339] - we should accept and ignore %lf rather than die */
12076             case 'l':
12077                 /* FALLTHROUGH */
12078             default:
12079 #if defined(USE_LONG_DOUBLE) || defined(USE_QUADMATH)
12080                 intsize = args ? 0 : 'q';
12081 #endif
12082                 break;
12083             case 'q':
12084 #if defined(HAS_LONG_DOUBLE)
12085                 break;
12086 #else
12087                 /* FALLTHROUGH */
12088 #endif
12089             case 'c':
12090             case 'h':
12091             case 'z':
12092             case 't':
12093             case 'j':
12094                 goto unknown;
12095             }
12096
12097             /* Now we need (long double) if intsize == 'q', else (double). */
12098             if (args) {
12099                 /* Note: do not pull NVs off the va_list with va_arg()
12100                  * (pull doubles instead) because if you have a build
12101                  * with long doubles, you would always be pulling long
12102                  * doubles, which would badly break anyone using only
12103                  * doubles (i.e. the majority of builds). In other
12104                  * words, you cannot mix doubles and long doubles.
12105                  * The only case where you can pull off long doubles
12106                  * is when the format specifier explicitly asks so with
12107                  * e.g. "%Lg". */
12108 #ifdef USE_QUADMATH
12109                 fv = intsize == 'q' ?
12110                     va_arg(*args, NV) : va_arg(*args, double);
12111                 nv = fv;
12112 #elif LONG_DOUBLESIZE > DOUBLESIZE
12113                 if (intsize == 'q') {
12114                     fv = va_arg(*args, long double);
12115                     nv = fv;
12116                 } else {
12117                     nv = va_arg(*args, double);
12118                     NV_TO_FV(nv, fv);
12119                 }
12120 #else
12121                 nv = va_arg(*args, double);
12122                 fv = nv;
12123 #endif
12124             }
12125             else
12126             {
12127                 if (!infnan) SvGETMAGIC(argsv);
12128                 nv = SvNV_nomg(argsv);
12129                 NV_TO_FV(nv, fv);
12130             }
12131
12132             need = 0;
12133             /* frexp() (or frexpl) has some unspecified behaviour for
12134              * nan/inf/-inf, so let's avoid calling that on non-finites. */
12135             if (isALPHA_FOLD_NE(c, 'e') && FV_ISFINITE(fv)) {
12136                 i = PERL_INT_MIN;
12137                 (void)Perl_frexp((NV)fv, &i);
12138                 if (i == PERL_INT_MIN)
12139                     Perl_die(aTHX_ "panic: frexp: %"FV_GF, fv);
12140                 /* Do not set hexfp earlier since we want to printf
12141                  * Inf/NaN for Inf/NaN, not their hexfp. */
12142                 hexfp = isALPHA_FOLD_EQ(c, 'a');
12143                 if (UNLIKELY(hexfp)) {
12144                     /* This seriously overshoots in most cases, but
12145                      * better the undershooting.  Firstly, all bytes
12146                      * of the NV are not mantissa, some of them are
12147                      * exponent.  Secondly, for the reasonably common
12148                      * long doubles case, the "80-bit extended", two
12149                      * or six bytes of the NV are unused. */
12150                     need +=
12151                         (fv < 0) ? 1 : 0 + /* possible unary minus */
12152                         2 + /* "0x" */
12153                         1 + /* the very unlikely carry */
12154                         1 + /* "1" */
12155                         1 + /* "." */
12156                         2 * NVSIZE + /* 2 hexdigits for each byte */
12157                         2 + /* "p+" */
12158                         6 + /* exponent: sign, plus up to 16383 (quad fp) */
12159                         1;   /* \0 */
12160 #ifdef LONGDOUBLE_DOUBLEDOUBLE
12161                     /* However, for the "double double", we need more.
12162                      * Since each double has their own exponent, the
12163                      * doubles may float (haha) rather far from each
12164                      * other, and the number of required bits is much
12165                      * larger, up to total of DOUBLEDOUBLE_MAXBITS bits.
12166                      * See the definition of DOUBLEDOUBLE_MAXBITS.
12167                      *
12168                      * Need 2 hexdigits for each byte. */
12169                     need += (DOUBLEDOUBLE_MAXBITS/8 + 1) * 2;
12170                     /* the size for the exponent already added */
12171 #endif
12172 #ifdef USE_LOCALE_NUMERIC
12173                         STORE_LC_NUMERIC_SET_TO_NEEDED();
12174                         if (PL_numeric_radix_sv && IN_LC(LC_NUMERIC))
12175                             need += SvLEN(PL_numeric_radix_sv);
12176                         RESTORE_LC_NUMERIC();
12177 #endif
12178                 }
12179                 else if (i > 0) {
12180                     need = BIT_DIGITS(i);
12181                 } /* if i < 0, the number of digits is hard to predict. */
12182             }
12183             need += has_precis ? precis : 6; /* known default */
12184
12185             if (need < width)
12186                 need = width;
12187
12188 #ifdef HAS_LDBL_SPRINTF_BUG
12189             /* This is to try to fix a bug with irix/nonstop-ux/powerux and
12190                with sfio - Allen <allens@cpan.org> */
12191
12192 #  ifdef DBL_MAX
12193 #    define MY_DBL_MAX DBL_MAX
12194 #  else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
12195 #    if DOUBLESIZE >= 8
12196 #      define MY_DBL_MAX 1.7976931348623157E+308L
12197 #    else
12198 #      define MY_DBL_MAX 3.40282347E+38L
12199 #    endif
12200 #  endif
12201
12202 #  ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
12203 #    define MY_DBL_MAX_BUG 1L
12204 #  else
12205 #    define MY_DBL_MAX_BUG MY_DBL_MAX
12206 #  endif
12207
12208 #  ifdef DBL_MIN
12209 #    define MY_DBL_MIN DBL_MIN
12210 #  else  /* XXX guessing! -Allen */
12211 #    if DOUBLESIZE >= 8
12212 #      define MY_DBL_MIN 2.2250738585072014E-308L
12213 #    else
12214 #      define MY_DBL_MIN 1.17549435E-38L
12215 #    endif
12216 #  endif
12217
12218             if ((intsize == 'q') && (c == 'f') &&
12219                 ((fv < MY_DBL_MAX_BUG) && (fv > -MY_DBL_MAX_BUG)) &&
12220                 (need < DBL_DIG)) {
12221                 /* it's going to be short enough that
12222                  * long double precision is not needed */
12223
12224                 if ((fv <= 0L) && (fv >= -0L))
12225                     fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
12226                 else {
12227                     /* would use Perl_fp_class as a double-check but not
12228                      * functional on IRIX - see perl.h comments */
12229
12230                     if ((fv >= MY_DBL_MIN) || (fv <= -MY_DBL_MIN)) {
12231                         /* It's within the range that a double can represent */
12232 #if defined(DBL_MAX) && !defined(DBL_MIN)
12233                         if ((fv >= ((long double)1/DBL_MAX)) ||
12234                             (fv <= (-(long double)1/DBL_MAX)))
12235 #endif
12236                         fix_ldbl_sprintf_bug = TRUE;
12237                     }
12238                 }
12239                 if (fix_ldbl_sprintf_bug == TRUE) {
12240                     double temp;
12241
12242                     intsize = 0;
12243                     temp = (double)fv;
12244                     fv = (NV)temp;
12245                 }
12246             }
12247
12248 #  undef MY_DBL_MAX
12249 #  undef MY_DBL_MAX_BUG
12250 #  undef MY_DBL_MIN
12251
12252 #endif /* HAS_LDBL_SPRINTF_BUG */
12253
12254             need += 20; /* fudge factor */
12255             if (PL_efloatsize < need) {
12256                 Safefree(PL_efloatbuf);
12257                 PL_efloatsize = need + 20; /* more fudge */
12258                 Newx(PL_efloatbuf, PL_efloatsize, char);
12259                 PL_efloatbuf[0] = '\0';
12260             }
12261
12262             if ( !(width || left || plus || alt) && fill != '0'
12263                  && has_precis && intsize != 'q'        /* Shortcuts */
12264                  && LIKELY(!Perl_isinfnan((NV)fv)) ) {
12265                 /* See earlier comment about buggy Gconvert when digits,
12266                    aka precis is 0  */
12267                 if ( c == 'g' && precis ) {
12268                     STORE_LC_NUMERIC_SET_TO_NEEDED();
12269                     SNPRINTF_G(fv, PL_efloatbuf, PL_efloatsize, precis);
12270                     /* May return an empty string for digits==0 */
12271                     if (*PL_efloatbuf) {
12272                         elen = strlen(PL_efloatbuf);
12273                         goto float_converted;
12274                     }
12275                 } else if ( c == 'f' && !precis ) {
12276                     if ((eptr = F0convert(nv, ebuf + sizeof ebuf, &elen)))
12277                         break;
12278                 }
12279             }
12280
12281             if (UNLIKELY(hexfp)) {
12282                 /* Hexadecimal floating point. */
12283                 char* p = PL_efloatbuf;
12284                 U8 vhex[VHEX_SIZE];
12285                 U8* v = vhex; /* working pointer to vhex */
12286                 U8* vend; /* pointer to one beyond last digit of vhex */
12287                 U8* vfnz = NULL; /* first non-zero */
12288                 const bool lower = (c == 'a');
12289                 /* At output the values of vhex (up to vend) will
12290                  * be mapped through the xdig to get the actual
12291                  * human-readable xdigits. */
12292                 const char* xdig = PL_hexdigit;
12293                 int zerotail = 0; /* how many extra zeros to append */
12294                 int exponent = 0; /* exponent of the floating point input */
12295
12296                 /* XXX: denormals, NaN, Inf.
12297                  *
12298                  * For example with denormals, (assuming the vanilla
12299                  * 64-bit double): the exponent is zero. 1xp-1074 is
12300                  * the smallest denormal and the smallest double, it
12301                  * should be output as 0x0.0000000000001p-1022 to
12302                  * match its internal structure. */
12303
12304                 vend = S_hextract(aTHX_ nv, &exponent, vhex, NULL);
12305                 S_hextract(aTHX_ nv, &exponent, vhex, vend);
12306
12307 #if NVSIZE > DOUBLESIZE
12308 #  ifdef HEXTRACT_HAS_IMPLICIT_BIT
12309                 /* In this case there is an implicit bit,
12310                  * and therefore the exponent is shifted shift by one. */
12311                 exponent--;
12312 #  else
12313                 /* In this case there is no implicit bit,
12314                  * and the exponent is shifted by the first xdigit. */
12315                 exponent -= 4;
12316 #  endif
12317 #endif
12318
12319                 if (fv < 0)
12320                     *p++ = '-';
12321                 else if (plus)
12322                     *p++ = plus;
12323                 *p++ = '0';
12324                 if (lower) {
12325                     *p++ = 'x';
12326                 }
12327                 else {
12328                     *p++ = 'X';
12329                     xdig += 16; /* Use uppercase hex. */
12330                 }
12331
12332                 /* Find the first non-zero xdigit. */
12333                 for (v = vhex; v < vend; v++) {
12334                     if (*v) {
12335                         vfnz = v;
12336                         break;
12337                     }
12338                 }
12339
12340                 if (vfnz) {
12341                     U8* vlnz = NULL; /* The last non-zero. */
12342
12343                     /* Find the last non-zero xdigit. */
12344                     for (v = vend - 1; v >= vhex; v--) {
12345                         if (*v) {
12346                             vlnz = v;
12347                             break;
12348                         }
12349                     }
12350
12351 #if NVSIZE == DOUBLESIZE
12352                     if (fv != 0.0)
12353                         exponent--;
12354 #endif
12355
12356                     if (precis > 0) {
12357                         if ((SSize_t)(precis + 1) < vend - vhex) {
12358                             bool round;
12359
12360                             v = vhex + precis + 1;
12361                             /* Round away from zero: if the tail
12362                              * beyond the precis xdigits is equal to
12363                              * or greater than 0x8000... */
12364                             round = *v > 0x8;
12365                             if (!round && *v == 0x8) {
12366                                 for (v++; v < vend; v++) {
12367                                     if (*v) {
12368                                         round = TRUE;
12369                                         break;
12370                                     }
12371                                 }
12372                             }
12373                             if (round) {
12374                                 for (v = vhex + precis; v >= vhex; v--) {
12375                                     if (*v < 0xF) {
12376                                         (*v)++;
12377                                         break;
12378                                     }
12379                                     *v = 0;
12380                                     if (v == vhex) {
12381                                         /* If the carry goes all the way to
12382                                          * the front, we need to output
12383                                          * a single '1'. This goes against
12384                                          * the "xdigit and then radix"
12385                                          * but since this is "cannot happen"
12386                                          * category, that is probably good. */
12387                                         *p++ = xdig[1];
12388                                     }
12389                                 }
12390                             }
12391                             /* The new effective "last non zero". */
12392                             vlnz = vhex + precis;
12393                         }
12394                         else {
12395                             zerotail = precis - (vlnz - vhex);
12396                         }
12397                     }
12398
12399                     v = vhex;
12400                     *p++ = xdig[*v++];
12401
12402                     /* The radix is always output after the first
12403                      * non-zero xdigit, or if alt.  */
12404                     if (vfnz < vlnz || alt) {
12405 #ifndef USE_LOCALE_NUMERIC
12406                         *p++ = '.';
12407 #else
12408                         STORE_LC_NUMERIC_SET_TO_NEEDED();
12409                         if (PL_numeric_radix_sv && IN_LC(LC_NUMERIC)) {
12410                             STRLEN n;
12411                             const char* r = SvPV(PL_numeric_radix_sv, n);
12412                             Copy(r, p, n, char);
12413                             p += n;
12414                         }
12415                         else {
12416                             *p++ = '.';
12417                         }
12418                         RESTORE_LC_NUMERIC();
12419 #endif
12420                     }
12421
12422                     while (v <= vlnz)
12423                         *p++ = xdig[*v++];
12424
12425                     while (zerotail--)
12426                         *p++ = '0';
12427                 }
12428                 else {
12429                     *p++ = '0';
12430                     exponent = 0;
12431                 }
12432
12433                 elen = p - PL_efloatbuf;
12434                 elen += my_snprintf(p, PL_efloatsize - elen,
12435                                     "%c%+d", lower ? 'p' : 'P',
12436                                     exponent);
12437
12438                 if (elen < width) {
12439                     if (left) {
12440                         /* Pad the back with spaces. */
12441                         memset(PL_efloatbuf + elen, ' ', width - elen);
12442                     }
12443                     else if (fill == '0') {
12444                         /* Insert the zeros between the "0x" and
12445                          * the digits, otherwise we end up with
12446                          * "0000xHHH..." */
12447                         STRLEN nzero = width - elen;
12448                         char* zerox = PL_efloatbuf + 2;
12449                         Move(zerox, zerox + nzero,  elen - 2, char);
12450                         memset(zerox, fill, nzero);
12451                     }
12452                     else {
12453                         /* Move it to the right. */
12454                         Move(PL_efloatbuf, PL_efloatbuf + width - elen,
12455                              elen, char);
12456                         /* Pad the front with spaces. */
12457                         memset(PL_efloatbuf, ' ', width - elen);
12458                     }
12459                     elen = width;
12460                 }
12461             }
12462             else {
12463                 elen = S_infnan_2pv(nv, PL_efloatbuf, PL_efloatsize, plus);
12464                 if (elen) {
12465                     /* Not affecting infnan output: precision, alt, fill. */
12466                     if (elen < width) {
12467                         if (left) {
12468                             /* Pack the back with spaces. */
12469                             memset(PL_efloatbuf + elen, ' ', width - elen);
12470                         } else {
12471                             /* Move it to the right. */
12472                             Move(PL_efloatbuf, PL_efloatbuf + width - elen,
12473                                  elen, char);
12474                             /* Pad the front with spaces. */
12475                             memset(PL_efloatbuf, ' ', width - elen);
12476                         }
12477                         elen = width;
12478                     }
12479                 }
12480             }
12481
12482             if (elen == 0) {
12483                 char *ptr = ebuf + sizeof ebuf;
12484                 *--ptr = '\0';
12485                 *--ptr = c;
12486 #if defined(USE_QUADMATH)
12487                 if (intsize == 'q') {
12488                     /* "g" -> "Qg" */
12489                     *--ptr = 'Q';
12490                 }
12491                 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
12492 #elif defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
12493                 /* Note that this is HAS_LONG_DOUBLE and PERL_PRIfldbl,
12494                  * not USE_LONG_DOUBLE and NVff.  In other words,
12495                  * this needs to work without USE_LONG_DOUBLE. */
12496                 if (intsize == 'q') {
12497                     /* Copy the one or more characters in a long double
12498                      * format before the 'base' ([efgEFG]) character to
12499                      * the format string. */
12500                     static char const ldblf[] = PERL_PRIfldbl;
12501                     char const *p = ldblf + sizeof(ldblf) - 3;
12502                     while (p >= ldblf) { *--ptr = *p--; }
12503                 }
12504 #endif
12505                 if (has_precis) {
12506                     base = precis;
12507                     do { *--ptr = '0' + (base % 10); } while (base /= 10);
12508                     *--ptr = '.';
12509                 }
12510                 if (width) {
12511                     base = width;
12512                     do { *--ptr = '0' + (base % 10); } while (base /= 10);
12513                 }
12514                 if (fill == '0')
12515                     *--ptr = fill;
12516                 if (left)
12517                     *--ptr = '-';
12518                 if (plus)
12519                     *--ptr = plus;
12520                 if (alt)
12521                     *--ptr = '#';
12522                 *--ptr = '%';
12523
12524                 /* No taint.  Otherwise we are in the strange situation
12525                  * where printf() taints but print($float) doesn't.
12526                  * --jhi */
12527
12528                 STORE_LC_NUMERIC_SET_TO_NEEDED();
12529
12530                 /* hopefully the above makes ptr a very constrained format
12531                  * that is safe to use, even though it's not literal */
12532                 GCC_DIAG_IGNORE(-Wformat-nonliteral);
12533 #ifdef USE_QUADMATH
12534                 {
12535                     const char* qfmt = quadmath_format_single(ptr);
12536                     if (!qfmt)
12537                         Perl_croak_nocontext("panic: quadmath invalid format \"%s\"", ptr);
12538                     elen = quadmath_snprintf(PL_efloatbuf, PL_efloatsize,
12539                                              qfmt, nv);
12540                     if ((IV)elen == -1)
12541                         Perl_croak_nocontext("panic: quadmath_snprintf failed, format \"%s|'", qfmt);
12542                     if (qfmt != ptr)
12543                         Safefree(qfmt);
12544                 }
12545 #elif defined(HAS_LONG_DOUBLE)
12546                 elen = ((intsize == 'q')
12547                         ? my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, fv)
12548                         : my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, (double)fv));
12549 #else
12550                 elen = my_sprintf(PL_efloatbuf, ptr, fv);
12551 #endif
12552                 GCC_DIAG_RESTORE;
12553             }
12554
12555         float_converted:
12556             eptr = PL_efloatbuf;
12557             assert((IV)elen > 0); /* here zero elen is bad */
12558
12559 #ifdef USE_LOCALE_NUMERIC
12560             /* If the decimal point character in the string is UTF-8, make the
12561              * output utf8 */
12562             if (PL_numeric_radix_sv && SvUTF8(PL_numeric_radix_sv)
12563                 && instr(eptr, SvPVX_const(PL_numeric_radix_sv)))
12564             {
12565                 is_utf8 = TRUE;
12566             }
12567 #endif
12568
12569             break;
12570
12571             /* SPECIAL */
12572
12573         case 'n':
12574             if (vectorize)
12575                 goto unknown;
12576             i = SvCUR(sv) - origlen;
12577             if (args) {
12578                 switch (intsize) {
12579                 case 'c':       *(va_arg(*args, char*)) = i; break;
12580                 case 'h':       *(va_arg(*args, short*)) = i; break;
12581                 default:        *(va_arg(*args, int*)) = i; break;
12582                 case 'l':       *(va_arg(*args, long*)) = i; break;
12583                 case 'V':       *(va_arg(*args, IV*)) = i; break;
12584                 case 'z':       *(va_arg(*args, SSize_t*)) = i; break;
12585 #ifdef HAS_PTRDIFF_T
12586                 case 't':       *(va_arg(*args, ptrdiff_t*)) = i; break;
12587 #endif
12588 #ifdef I_STDINT
12589                 case 'j':       *(va_arg(*args, intmax_t*)) = i; break;
12590 #endif
12591                 case 'q':
12592 #if IVSIZE >= 8
12593                                 *(va_arg(*args, Quad_t*)) = i; break;
12594 #else
12595                                 goto unknown;
12596 #endif
12597                 }
12598             }
12599             else
12600                 sv_setuv_mg(argsv, has_utf8 ? (UV)sv_len_utf8(sv) : (UV)i);
12601             continue;   /* not "break" */
12602
12603             /* UNKNOWN */
12604
12605         default:
12606       unknown:
12607             if (!args
12608                 && (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)
12609                 && ckWARN(WARN_PRINTF))
12610             {
12611                 SV * const msg = sv_newmortal();
12612                 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
12613                           (PL_op->op_type == OP_PRTF) ? "" : "s");
12614                 if (fmtstart < patend) {
12615                     const char * const fmtend = q < patend ? q : patend;
12616                     const char * f;
12617                     sv_catpvs(msg, "\"%");
12618                     for (f = fmtstart; f < fmtend; f++) {
12619                         if (isPRINT(*f)) {
12620                             sv_catpvn_nomg(msg, f, 1);
12621                         } else {
12622                             Perl_sv_catpvf(aTHX_ msg,
12623                                            "\\%03"UVof, (UV)*f & 0xFF);
12624                         }
12625                     }
12626                     sv_catpvs(msg, "\"");
12627                 } else {
12628                     sv_catpvs(msg, "end of string");
12629                 }
12630                 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, SVfARG(msg)); /* yes, this is reentrant */
12631             }
12632
12633             /* output mangled stuff ... */
12634             if (c == '\0')
12635                 --q;
12636             eptr = p;
12637             elen = q - p;
12638
12639             /* ... right here, because formatting flags should not apply */
12640             SvGROW(sv, SvCUR(sv) + elen + 1);
12641             p = SvEND(sv);
12642             Copy(eptr, p, elen, char);
12643             p += elen;
12644             *p = '\0';
12645             SvCUR_set(sv, p - SvPVX_const(sv));
12646             svix = osvix;
12647             continue;   /* not "break" */
12648         }
12649
12650         if (is_utf8 != has_utf8) {
12651             if (is_utf8) {
12652                 if (SvCUR(sv))
12653                     sv_utf8_upgrade(sv);
12654             }
12655             else {
12656                 const STRLEN old_elen = elen;
12657                 SV * const nsv = newSVpvn_flags(eptr, elen, SVs_TEMP);
12658                 sv_utf8_upgrade(nsv);
12659                 eptr = SvPVX_const(nsv);
12660                 elen = SvCUR(nsv);
12661
12662                 if (width) { /* fudge width (can't fudge elen) */
12663                     width += elen - old_elen;
12664                 }
12665                 is_utf8 = TRUE;
12666             }
12667         }
12668
12669         assert((IV)elen >= 0); /* here zero elen is fine */
12670         have = esignlen + zeros + elen;
12671         if (have < zeros)
12672             croak_memory_wrap();
12673
12674         need = (have > width ? have : width);
12675         gap = need - have;
12676
12677         if (need >= (((STRLEN)~0) - SvCUR(sv) - dotstrlen - 1))
12678             croak_memory_wrap();
12679         SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
12680         p = SvEND(sv);
12681         if (esignlen && fill == '0') {
12682             int i;
12683             for (i = 0; i < (int)esignlen; i++)
12684                 *p++ = esignbuf[i];
12685         }
12686         if (gap && !left) {
12687             memset(p, fill, gap);
12688             p += gap;
12689         }
12690         if (esignlen && fill != '0') {
12691             int i;
12692             for (i = 0; i < (int)esignlen; i++)
12693                 *p++ = esignbuf[i];
12694         }
12695         if (zeros) {
12696             int i;
12697             for (i = zeros; i; i--)
12698                 *p++ = '0';
12699         }
12700         if (elen) {
12701             Copy(eptr, p, elen, char);
12702             p += elen;
12703         }
12704         if (gap && left) {
12705             memset(p, ' ', gap);
12706             p += gap;
12707         }
12708         if (vectorize) {
12709             if (veclen) {
12710                 Copy(dotstr, p, dotstrlen, char);
12711                 p += dotstrlen;
12712             }
12713             else
12714                 vectorize = FALSE;              /* done iterating over vecstr */
12715         }
12716         if (is_utf8)
12717             has_utf8 = TRUE;
12718         if (has_utf8)
12719             SvUTF8_on(sv);
12720         *p = '\0';
12721         SvCUR_set(sv, p - SvPVX_const(sv));
12722         if (vectorize) {
12723             esignlen = 0;
12724             goto vector;
12725         }
12726     }
12727
12728     /* Now that we've consumed all our printf format arguments (svix)
12729      * do we have things left on the stack that we didn't use?
12730      */
12731     if (!no_redundant_warning && svmax >= svix + 1 && ckWARN(WARN_REDUNDANT)) {
12732         Perl_warner(aTHX_ packWARN(WARN_REDUNDANT), "Redundant argument in %s",
12733                 PL_op ? OP_DESC(PL_op) : "sv_vcatpvfn()");
12734     }
12735
12736     SvTAINT(sv);
12737
12738     RESTORE_LC_NUMERIC();   /* Done outside loop, so don't have to save/restore
12739                                each iteration. */
12740 }
12741
12742 /* =========================================================================
12743
12744 =head1 Cloning an interpreter
12745
12746 =cut
12747
12748 All the macros and functions in this section are for the private use of
12749 the main function, perl_clone().
12750
12751 The foo_dup() functions make an exact copy of an existing foo thingy.
12752 During the course of a cloning, a hash table is used to map old addresses
12753 to new addresses.  The table is created and manipulated with the
12754 ptr_table_* functions.
12755
12756  * =========================================================================*/
12757
12758
12759 #if defined(USE_ITHREADS)
12760
12761 /* XXX Remove this so it doesn't have to go thru the macro and return for nothing */
12762 #ifndef GpREFCNT_inc
12763 #  define GpREFCNT_inc(gp)      ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
12764 #endif
12765
12766
12767 /* Certain cases in Perl_ss_dup have been merged, by relying on the fact
12768    that currently av_dup, gv_dup and hv_dup are the same as sv_dup.
12769    If this changes, please unmerge ss_dup.
12770    Likewise, sv_dup_inc_multiple() relies on this fact.  */
12771 #define sv_dup_inc_NN(s,t)      SvREFCNT_inc_NN(sv_dup_inc(s,t))
12772 #define av_dup(s,t)     MUTABLE_AV(sv_dup((const SV *)s,t))
12773 #define av_dup_inc(s,t) MUTABLE_AV(sv_dup_inc((const SV *)s,t))
12774 #define hv_dup(s,t)     MUTABLE_HV(sv_dup((const SV *)s,t))
12775 #define hv_dup_inc(s,t) MUTABLE_HV(sv_dup_inc((const SV *)s,t))
12776 #define cv_dup(s,t)     MUTABLE_CV(sv_dup((const SV *)s,t))
12777 #define cv_dup_inc(s,t) MUTABLE_CV(sv_dup_inc((const SV *)s,t))
12778 #define io_dup(s,t)     MUTABLE_IO(sv_dup((const SV *)s,t))
12779 #define io_dup_inc(s,t) MUTABLE_IO(sv_dup_inc((const SV *)s,t))
12780 #define gv_dup(s,t)     MUTABLE_GV(sv_dup((const SV *)s,t))
12781 #define gv_dup_inc(s,t) MUTABLE_GV(sv_dup_inc((const SV *)s,t))
12782 #define SAVEPV(p)       ((p) ? savepv(p) : NULL)
12783 #define SAVEPVN(p,n)    ((p) ? savepvn(p,n) : NULL)
12784
12785 /* clone a parser */
12786
12787 yy_parser *
12788 Perl_parser_dup(pTHX_ const yy_parser *const proto, CLONE_PARAMS *const param)
12789 {
12790     yy_parser *parser;
12791
12792     PERL_ARGS_ASSERT_PARSER_DUP;
12793
12794     if (!proto)
12795         return NULL;
12796
12797     /* look for it in the table first */
12798     parser = (yy_parser *)ptr_table_fetch(PL_ptr_table, proto);
12799     if (parser)
12800         return parser;
12801
12802     /* create anew and remember what it is */
12803     Newxz(parser, 1, yy_parser);
12804     ptr_table_store(PL_ptr_table, proto, parser);
12805
12806     /* XXX these not yet duped */
12807     parser->old_parser = NULL;
12808     parser->stack = NULL;
12809     parser->ps = NULL;
12810     parser->stack_size = 0;
12811     /* XXX parser->stack->state = 0; */
12812
12813     /* XXX eventually, just Copy() most of the parser struct ? */
12814
12815     parser->lex_brackets = proto->lex_brackets;
12816     parser->lex_casemods = proto->lex_casemods;
12817     parser->lex_brackstack = savepvn(proto->lex_brackstack,
12818                     (proto->lex_brackets < 120 ? 120 : proto->lex_brackets));
12819     parser->lex_casestack = savepvn(proto->lex_casestack,
12820                     (proto->lex_casemods < 12 ? 12 : proto->lex_casemods));
12821     parser->lex_defer   = proto->lex_defer;
12822     parser->lex_dojoin  = proto->lex_dojoin;
12823     parser->lex_formbrack = proto->lex_formbrack;
12824     parser->lex_inpat   = proto->lex_inpat;
12825     parser->lex_inwhat  = proto->lex_inwhat;
12826     parser->lex_op      = proto->lex_op;
12827     parser->lex_repl    = sv_dup_inc(proto->lex_repl, param);
12828     parser->lex_starts  = proto->lex_starts;
12829     parser->lex_stuff   = sv_dup_inc(proto->lex_stuff, param);
12830     parser->multi_close = proto->multi_close;
12831     parser->multi_open  = proto->multi_open;
12832     parser->multi_start = proto->multi_start;
12833     parser->multi_end   = proto->multi_end;
12834     parser->preambled   = proto->preambled;
12835     parser->sublex_info = proto->sublex_info; /* XXX not quite right */
12836     parser->linestr     = sv_dup_inc(proto->linestr, param);
12837     parser->expect      = proto->expect;
12838     parser->copline     = proto->copline;
12839     parser->last_lop_op = proto->last_lop_op;
12840     parser->lex_state   = proto->lex_state;
12841     parser->rsfp        = fp_dup(proto->rsfp, '<', param);
12842     /* rsfp_filters entries have fake IoDIRP() */
12843     parser->rsfp_filters= av_dup_inc(proto->rsfp_filters, param);
12844     parser->in_my       = proto->in_my;
12845     parser->in_my_stash = hv_dup(proto->in_my_stash, param);
12846     parser->error_count = proto->error_count;
12847
12848
12849     parser->linestr     = sv_dup_inc(proto->linestr, param);
12850
12851     {
12852         char * const ols = SvPVX(proto->linestr);
12853         char * const ls  = SvPVX(parser->linestr);
12854
12855         parser->bufptr      = ls + (proto->bufptr >= ols ?
12856                                     proto->bufptr -  ols : 0);
12857         parser->oldbufptr   = ls + (proto->oldbufptr >= ols ?
12858                                     proto->oldbufptr -  ols : 0);
12859         parser->oldoldbufptr= ls + (proto->oldoldbufptr >= ols ?
12860                                     proto->oldoldbufptr -  ols : 0);
12861         parser->linestart   = ls + (proto->linestart >= ols ?
12862                                     proto->linestart -  ols : 0);
12863         parser->last_uni    = ls + (proto->last_uni >= ols ?
12864                                     proto->last_uni -  ols : 0);
12865         parser->last_lop    = ls + (proto->last_lop >= ols ?
12866                                     proto->last_lop -  ols : 0);
12867
12868         parser->bufend      = ls + SvCUR(parser->linestr);
12869     }
12870
12871     Copy(proto->tokenbuf, parser->tokenbuf, 256, char);
12872
12873
12874     Copy(proto->nextval, parser->nextval, 5, YYSTYPE);
12875     Copy(proto->nexttype, parser->nexttype, 5,  I32);
12876     parser->nexttoke    = proto->nexttoke;
12877
12878     /* XXX should clone saved_curcop here, but we aren't passed
12879      * proto_perl; so do it in perl_clone_using instead */
12880
12881     return parser;
12882 }
12883
12884
12885 /* duplicate a file handle */
12886
12887 PerlIO *
12888 Perl_fp_dup(pTHX_ PerlIO *const fp, const char type, CLONE_PARAMS *const param)
12889 {
12890     PerlIO *ret;
12891
12892     PERL_ARGS_ASSERT_FP_DUP;
12893     PERL_UNUSED_ARG(type);
12894
12895     if (!fp)
12896         return (PerlIO*)NULL;
12897
12898     /* look for it in the table first */
12899     ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
12900     if (ret)
12901         return ret;
12902
12903     /* create anew and remember what it is */
12904     ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
12905     ptr_table_store(PL_ptr_table, fp, ret);
12906     return ret;
12907 }
12908
12909 /* duplicate a directory handle */
12910
12911 DIR *
12912 Perl_dirp_dup(pTHX_ DIR *const dp, CLONE_PARAMS *const param)
12913 {
12914     DIR *ret;
12915
12916 #if defined(HAS_FCHDIR) && defined(HAS_TELLDIR) && defined(HAS_SEEKDIR)
12917     DIR *pwd;
12918     const Direntry_t *dirent;
12919     char smallbuf[256];
12920     char *name = NULL;
12921     STRLEN len = 0;
12922     long pos;
12923 #endif
12924
12925     PERL_UNUSED_CONTEXT;
12926     PERL_ARGS_ASSERT_DIRP_DUP;
12927
12928     if (!dp)
12929         return (DIR*)NULL;
12930
12931     /* look for it in the table first */
12932     ret = (DIR*)ptr_table_fetch(PL_ptr_table, dp);
12933     if (ret)
12934         return ret;
12935
12936 #if defined(HAS_FCHDIR) && defined(HAS_TELLDIR) && defined(HAS_SEEKDIR)
12937
12938     PERL_UNUSED_ARG(param);
12939
12940     /* create anew */
12941
12942     /* open the current directory (so we can switch back) */
12943     if (!(pwd = PerlDir_open("."))) return (DIR *)NULL;
12944
12945     /* chdir to our dir handle and open the present working directory */
12946     if (fchdir(my_dirfd(dp)) < 0 || !(ret = PerlDir_open("."))) {
12947         PerlDir_close(pwd);
12948         return (DIR *)NULL;
12949     }
12950     /* Now we should have two dir handles pointing to the same dir. */
12951
12952     /* Be nice to the calling code and chdir back to where we were. */
12953     /* XXX If this fails, then what? */
12954     PERL_UNUSED_RESULT(fchdir(my_dirfd(pwd)));
12955
12956     /* We have no need of the pwd handle any more. */
12957     PerlDir_close(pwd);
12958
12959 #ifdef DIRNAMLEN
12960 # define d_namlen(d) (d)->d_namlen
12961 #else
12962 # define d_namlen(d) strlen((d)->d_name)
12963 #endif
12964     /* Iterate once through dp, to get the file name at the current posi-
12965        tion. Then step back. */
12966     pos = PerlDir_tell(dp);
12967     if ((dirent = PerlDir_read(dp))) {
12968         len = d_namlen(dirent);
12969         if (len <= sizeof smallbuf) name = smallbuf;
12970         else Newx(name, len, char);
12971         Move(dirent->d_name, name, len, char);
12972     }
12973     PerlDir_seek(dp, pos);
12974
12975     /* Iterate through the new dir handle, till we find a file with the
12976        right name. */
12977     if (!dirent) /* just before the end */
12978         for(;;) {
12979             pos = PerlDir_tell(ret);
12980             if (PerlDir_read(ret)) continue; /* not there yet */
12981             PerlDir_seek(ret, pos); /* step back */
12982             break;
12983         }
12984     else {
12985         const long pos0 = PerlDir_tell(ret);
12986         for(;;) {
12987             pos = PerlDir_tell(ret);
12988             if ((dirent = PerlDir_read(ret))) {
12989                 if (len == (STRLEN)d_namlen(dirent)
12990                     && memEQ(name, dirent->d_name, len)) {
12991                     /* found it */
12992                     PerlDir_seek(ret, pos); /* step back */
12993                     break;
12994                 }
12995                 /* else we are not there yet; keep iterating */
12996             }
12997             else { /* This is not meant to happen. The best we can do is
12998                       reset the iterator to the beginning. */
12999                 PerlDir_seek(ret, pos0);
13000                 break;
13001             }
13002         }
13003     }
13004 #undef d_namlen
13005
13006     if (name && name != smallbuf)
13007         Safefree(name);
13008 #endif
13009
13010 #ifdef WIN32
13011     ret = win32_dirp_dup(dp, param);
13012 #endif
13013
13014     /* pop it in the pointer table */
13015     if (ret)
13016         ptr_table_store(PL_ptr_table, dp, ret);
13017
13018     return ret;
13019 }
13020
13021 /* duplicate a typeglob */
13022
13023 GP *
13024 Perl_gp_dup(pTHX_ GP *const gp, CLONE_PARAMS *const param)
13025 {
13026     GP *ret;
13027
13028     PERL_ARGS_ASSERT_GP_DUP;
13029
13030     if (!gp)
13031         return (GP*)NULL;
13032     /* look for it in the table first */
13033     ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
13034     if (ret)
13035         return ret;
13036
13037     /* create anew and remember what it is */
13038     Newxz(ret, 1, GP);
13039     ptr_table_store(PL_ptr_table, gp, ret);
13040
13041     /* clone */
13042     /* ret->gp_refcnt must be 0 before any other dups are called. We're relying
13043        on Newxz() to do this for us.  */
13044     ret->gp_sv          = sv_dup_inc(gp->gp_sv, param);
13045     ret->gp_io          = io_dup_inc(gp->gp_io, param);
13046     ret->gp_form        = cv_dup_inc(gp->gp_form, param);
13047     ret->gp_av          = av_dup_inc(gp->gp_av, param);
13048     ret->gp_hv          = hv_dup_inc(gp->gp_hv, param);
13049     ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
13050     ret->gp_cv          = cv_dup_inc(gp->gp_cv, param);
13051     ret->gp_cvgen       = gp->gp_cvgen;
13052     ret->gp_line        = gp->gp_line;
13053     ret->gp_file_hek    = hek_dup(gp->gp_file_hek, param);
13054     return ret;
13055 }
13056
13057 /* duplicate a chain of magic */
13058
13059 MAGIC *
13060 Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS *const param)
13061 {
13062     MAGIC *mgret = NULL;
13063     MAGIC **mgprev_p = &mgret;
13064
13065     PERL_ARGS_ASSERT_MG_DUP;
13066
13067     for (; mg; mg = mg->mg_moremagic) {
13068         MAGIC *nmg;
13069
13070         if ((param->flags & CLONEf_JOIN_IN)
13071                 && mg->mg_type == PERL_MAGIC_backref)
13072             /* when joining, we let the individual SVs add themselves to
13073              * backref as needed. */
13074             continue;
13075
13076         Newx(nmg, 1, MAGIC);
13077         *mgprev_p = nmg;
13078         mgprev_p = &(nmg->mg_moremagic);
13079
13080         /* There was a comment "XXX copy dynamic vtable?" but as we don't have
13081            dynamic vtables, I'm not sure why Sarathy wrote it. The comment dates
13082            from the original commit adding Perl_mg_dup() - revision 4538.
13083            Similarly there is the annotation "XXX random ptr?" next to the
13084            assignment to nmg->mg_ptr.  */
13085         *nmg = *mg;
13086
13087         /* FIXME for plugins
13088         if (nmg->mg_type == PERL_MAGIC_qr) {
13089             nmg->mg_obj = MUTABLE_SV(CALLREGDUPE((REGEXP*)nmg->mg_obj, param));
13090         }
13091         else
13092         */
13093         nmg->mg_obj = (nmg->mg_flags & MGf_REFCOUNTED)
13094                           ? nmg->mg_type == PERL_MAGIC_backref
13095                                 /* The backref AV has its reference
13096                                  * count deliberately bumped by 1 */
13097                                 ? SvREFCNT_inc(av_dup_inc((const AV *)
13098                                                     nmg->mg_obj, param))
13099                                 : sv_dup_inc(nmg->mg_obj, param)
13100                           : sv_dup(nmg->mg_obj, param);
13101
13102         if (nmg->mg_ptr && nmg->mg_type != PERL_MAGIC_regex_global) {
13103             if (nmg->mg_len > 0) {
13104                 nmg->mg_ptr     = SAVEPVN(nmg->mg_ptr, nmg->mg_len);
13105                 if (nmg->mg_type == PERL_MAGIC_overload_table &&
13106                         AMT_AMAGIC((AMT*)nmg->mg_ptr))
13107                 {
13108                     AMT * const namtp = (AMT*)nmg->mg_ptr;
13109                     sv_dup_inc_multiple((SV**)(namtp->table),
13110                                         (SV**)(namtp->table), NofAMmeth, param);
13111                 }
13112             }
13113             else if (nmg->mg_len == HEf_SVKEY)
13114                 nmg->mg_ptr = (char*)sv_dup_inc((const SV *)nmg->mg_ptr, param);
13115         }
13116         if ((nmg->mg_flags & MGf_DUP) && nmg->mg_virtual && nmg->mg_virtual->svt_dup) {
13117             nmg->mg_virtual->svt_dup(aTHX_ nmg, param);
13118         }
13119     }
13120     return mgret;
13121 }
13122
13123 #endif /* USE_ITHREADS */
13124
13125 struct ptr_tbl_arena {
13126     struct ptr_tbl_arena *next;
13127     struct ptr_tbl_ent array[1023/3]; /* as ptr_tbl_ent has 3 pointers.  */
13128 };
13129
13130 /* create a new pointer-mapping table */
13131
13132 PTR_TBL_t *
13133 Perl_ptr_table_new(pTHX)
13134 {
13135     PTR_TBL_t *tbl;
13136     PERL_UNUSED_CONTEXT;
13137
13138     Newx(tbl, 1, PTR_TBL_t);
13139     tbl->tbl_max        = 511;
13140     tbl->tbl_items      = 0;
13141     tbl->tbl_arena      = NULL;
13142     tbl->tbl_arena_next = NULL;
13143     tbl->tbl_arena_end  = NULL;
13144     Newxz(tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
13145     return tbl;
13146 }
13147
13148 #define PTR_TABLE_HASH(ptr) \
13149   ((PTR2UV(ptr) >> 3) ^ (PTR2UV(ptr) >> (3 + 7)) ^ (PTR2UV(ptr) >> (3 + 17)))
13150
13151 /* map an existing pointer using a table */
13152
13153 STATIC PTR_TBL_ENT_t *
13154 S_ptr_table_find(PTR_TBL_t *const tbl, const void *const sv)
13155 {
13156     PTR_TBL_ENT_t *tblent;
13157     const UV hash = PTR_TABLE_HASH(sv);
13158
13159     PERL_ARGS_ASSERT_PTR_TABLE_FIND;
13160
13161     tblent = tbl->tbl_ary[hash & tbl->tbl_max];
13162     for (; tblent; tblent = tblent->next) {
13163         if (tblent->oldval == sv)
13164             return tblent;
13165     }
13166     return NULL;
13167 }
13168
13169 void *
13170 Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *const tbl, const void *const sv)
13171 {
13172     PTR_TBL_ENT_t const *const tblent = ptr_table_find(tbl, sv);
13173
13174     PERL_ARGS_ASSERT_PTR_TABLE_FETCH;
13175     PERL_UNUSED_CONTEXT;
13176
13177     return tblent ? tblent->newval : NULL;
13178 }
13179
13180 /* add a new entry to a pointer-mapping table 'tbl'.  In hash terms, 'oldsv' is
13181  * the key; 'newsv' is the value.  The names "old" and "new" are specific to
13182  * the core's typical use of ptr_tables in thread cloning. */
13183
13184 void
13185 Perl_ptr_table_store(pTHX_ PTR_TBL_t *const tbl, const void *const oldsv, void *const newsv)
13186 {
13187     PTR_TBL_ENT_t *tblent = ptr_table_find(tbl, oldsv);
13188
13189     PERL_ARGS_ASSERT_PTR_TABLE_STORE;
13190     PERL_UNUSED_CONTEXT;
13191
13192     if (tblent) {
13193         tblent->newval = newsv;
13194     } else {
13195         const UV entry = PTR_TABLE_HASH(oldsv) & tbl->tbl_max;
13196
13197         if (tbl->tbl_arena_next == tbl->tbl_arena_end) {
13198             struct ptr_tbl_arena *new_arena;
13199
13200             Newx(new_arena, 1, struct ptr_tbl_arena);
13201             new_arena->next = tbl->tbl_arena;
13202             tbl->tbl_arena = new_arena;
13203             tbl->tbl_arena_next = new_arena->array;
13204             tbl->tbl_arena_end = C_ARRAY_END(new_arena->array);
13205         }
13206
13207         tblent = tbl->tbl_arena_next++;
13208
13209         tblent->oldval = oldsv;
13210         tblent->newval = newsv;
13211         tblent->next = tbl->tbl_ary[entry];
13212         tbl->tbl_ary[entry] = tblent;
13213         tbl->tbl_items++;
13214         if (tblent->next && tbl->tbl_items > tbl->tbl_max)
13215             ptr_table_split(tbl);
13216     }
13217 }
13218
13219 /* double the hash bucket size of an existing ptr table */
13220
13221 void
13222 Perl_ptr_table_split(pTHX_ PTR_TBL_t *const tbl)
13223 {
13224     PTR_TBL_ENT_t **ary = tbl->tbl_ary;
13225     const UV oldsize = tbl->tbl_max + 1;
13226     UV newsize = oldsize * 2;
13227     UV i;
13228
13229     PERL_ARGS_ASSERT_PTR_TABLE_SPLIT;
13230     PERL_UNUSED_CONTEXT;
13231
13232     Renew(ary, newsize, PTR_TBL_ENT_t*);
13233     Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
13234     tbl->tbl_max = --newsize;
13235     tbl->tbl_ary = ary;
13236     for (i=0; i < oldsize; i++, ary++) {
13237         PTR_TBL_ENT_t **entp = ary;
13238         PTR_TBL_ENT_t *ent = *ary;
13239         PTR_TBL_ENT_t **curentp;
13240         if (!ent)
13241             continue;
13242         curentp = ary + oldsize;
13243         do {
13244             if ((newsize & PTR_TABLE_HASH(ent->oldval)) != i) {
13245                 *entp = ent->next;
13246                 ent->next = *curentp;
13247                 *curentp = ent;
13248             }
13249             else
13250                 entp = &ent->next;
13251             ent = *entp;
13252         } while (ent);
13253     }
13254 }
13255
13256 /* remove all the entries from a ptr table */
13257 /* Deprecated - will be removed post 5.14 */
13258
13259 void
13260 Perl_ptr_table_clear(pTHX_ PTR_TBL_t *const tbl)
13261 {
13262     PERL_UNUSED_CONTEXT;
13263     if (tbl && tbl->tbl_items) {
13264         struct ptr_tbl_arena *arena = tbl->tbl_arena;
13265
13266         Zero(tbl->tbl_ary, tbl->tbl_max + 1, struct ptr_tbl_ent **);
13267
13268         while (arena) {
13269             struct ptr_tbl_arena *next = arena->next;
13270
13271             Safefree(arena);
13272             arena = next;
13273         };
13274
13275         tbl->tbl_items = 0;
13276         tbl->tbl_arena = NULL;
13277         tbl->tbl_arena_next = NULL;
13278         tbl->tbl_arena_end = NULL;
13279     }
13280 }
13281
13282 /* clear and free a ptr table */
13283
13284 void
13285 Perl_ptr_table_free(pTHX_ PTR_TBL_t *const tbl)
13286 {
13287     struct ptr_tbl_arena *arena;
13288
13289     PERL_UNUSED_CONTEXT;
13290
13291     if (!tbl) {
13292         return;
13293     }
13294
13295     arena = tbl->tbl_arena;
13296
13297     while (arena) {
13298         struct ptr_tbl_arena *next = arena->next;
13299
13300         Safefree(arena);
13301         arena = next;
13302     }
13303
13304     Safefree(tbl->tbl_ary);
13305     Safefree(tbl);
13306 }
13307
13308 #if defined(USE_ITHREADS)
13309
13310 void
13311 Perl_rvpv_dup(pTHX_ SV *const dstr, const SV *const sstr, CLONE_PARAMS *const param)
13312 {
13313     PERL_ARGS_ASSERT_RVPV_DUP;
13314
13315     assert(!isREGEXP(sstr));
13316     if (SvROK(sstr)) {
13317         if (SvWEAKREF(sstr)) {
13318             SvRV_set(dstr, sv_dup(SvRV_const(sstr), param));
13319             if (param->flags & CLONEf_JOIN_IN) {
13320                 /* if joining, we add any back references individually rather
13321                  * than copying the whole backref array */
13322                 Perl_sv_add_backref(aTHX_ SvRV(dstr), dstr);
13323             }
13324         }
13325         else
13326             SvRV_set(dstr, sv_dup_inc(SvRV_const(sstr), param));
13327     }
13328     else if (SvPVX_const(sstr)) {
13329         /* Has something there */
13330         if (SvLEN(sstr)) {
13331             /* Normal PV - clone whole allocated space */
13332             SvPV_set(dstr, SAVEPVN(SvPVX_const(sstr), SvLEN(sstr)-1));
13333             /* sstr may not be that normal, but actually copy on write.
13334                But we are a true, independent SV, so:  */
13335             SvIsCOW_off(dstr);
13336         }
13337         else {
13338             /* Special case - not normally malloced for some reason */
13339             if (isGV_with_GP(sstr)) {
13340                 /* Don't need to do anything here.  */
13341             }
13342             else if ((SvIsCOW(sstr))) {
13343                 /* A "shared" PV - clone it as "shared" PV */
13344                 SvPV_set(dstr,
13345                          HEK_KEY(hek_dup(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)),
13346                                          param)));
13347             }
13348             else {
13349                 /* Some other special case - random pointer */
13350                 SvPV_set(dstr, (char *) SvPVX_const(sstr));             
13351             }
13352         }
13353     }
13354     else {
13355         /* Copy the NULL */
13356         SvPV_set(dstr, NULL);
13357     }
13358 }
13359
13360 /* duplicate a list of SVs. source and dest may point to the same memory.  */
13361 static SV **
13362 S_sv_dup_inc_multiple(pTHX_ SV *const *source, SV **dest,
13363                       SSize_t items, CLONE_PARAMS *const param)
13364 {
13365     PERL_ARGS_ASSERT_SV_DUP_INC_MULTIPLE;
13366
13367     while (items-- > 0) {
13368         *dest++ = sv_dup_inc(*source++, param);
13369     }
13370
13371     return dest;
13372 }
13373
13374 /* duplicate an SV of any type (including AV, HV etc) */
13375
13376 static SV *
13377 S_sv_dup_common(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
13378 {
13379     dVAR;
13380     SV *dstr;
13381
13382     PERL_ARGS_ASSERT_SV_DUP_COMMON;
13383
13384     if (SvTYPE(sstr) == (svtype)SVTYPEMASK) {
13385 #ifdef DEBUG_LEAKING_SCALARS_ABORT
13386         abort();
13387 #endif
13388         return NULL;
13389     }
13390     /* look for it in the table first */
13391     dstr = MUTABLE_SV(ptr_table_fetch(PL_ptr_table, sstr));
13392     if (dstr)
13393         return dstr;
13394
13395     if(param->flags & CLONEf_JOIN_IN) {
13396         /** We are joining here so we don't want do clone
13397             something that is bad **/
13398         if (SvTYPE(sstr) == SVt_PVHV) {
13399             const HEK * const hvname = HvNAME_HEK(sstr);
13400             if (hvname) {
13401                 /** don't clone stashes if they already exist **/
13402                 dstr = MUTABLE_SV(gv_stashpvn(HEK_KEY(hvname), HEK_LEN(hvname),
13403                                                 HEK_UTF8(hvname) ? SVf_UTF8 : 0));
13404                 ptr_table_store(PL_ptr_table, sstr, dstr);
13405                 return dstr;
13406             }
13407         }
13408         else if (SvTYPE(sstr) == SVt_PVGV && !SvFAKE(sstr)) {
13409             HV *stash = GvSTASH(sstr);
13410             const HEK * hvname;
13411             if (stash && (hvname = HvNAME_HEK(stash))) {
13412                 /** don't clone GVs if they already exist **/
13413                 SV **svp;
13414                 stash = gv_stashpvn(HEK_KEY(hvname), HEK_LEN(hvname),
13415                                     HEK_UTF8(hvname) ? SVf_UTF8 : 0);
13416                 svp = hv_fetch(
13417                         stash, GvNAME(sstr),
13418                         GvNAMEUTF8(sstr)
13419                             ? -GvNAMELEN(sstr)
13420                             :  GvNAMELEN(sstr),
13421                         0
13422                       );
13423                 if (svp && *svp && SvTYPE(*svp) == SVt_PVGV) {
13424                     ptr_table_store(PL_ptr_table, sstr, *svp);
13425                     return *svp;
13426                 }
13427             }
13428         }
13429     }
13430
13431     /* create anew and remember what it is */
13432     new_SV(dstr);
13433
13434 #ifdef DEBUG_LEAKING_SCALARS
13435     dstr->sv_debug_optype = sstr->sv_debug_optype;
13436     dstr->sv_debug_line = sstr->sv_debug_line;
13437     dstr->sv_debug_inpad = sstr->sv_debug_inpad;
13438     dstr->sv_debug_parent = (SV*)sstr;
13439     FREE_SV_DEBUG_FILE(dstr);
13440     dstr->sv_debug_file = savesharedpv(sstr->sv_debug_file);
13441 #endif
13442
13443     ptr_table_store(PL_ptr_table, sstr, dstr);
13444
13445     /* clone */
13446     SvFLAGS(dstr)       = SvFLAGS(sstr);
13447     SvFLAGS(dstr)       &= ~SVf_OOK;            /* don't propagate OOK hack */
13448     SvREFCNT(dstr)      = 0;                    /* must be before any other dups! */
13449
13450 #ifdef DEBUGGING
13451     if (SvANY(sstr) && PL_watch_pvx && SvPVX_const(sstr) == PL_watch_pvx)
13452         PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
13453                       (void*)PL_watch_pvx, SvPVX_const(sstr));
13454 #endif
13455
13456     /* don't clone objects whose class has asked us not to */
13457     if (SvOBJECT(sstr)
13458      && ! (SvFLAGS(SvSTASH(sstr)) & SVphv_CLONEABLE))
13459     {
13460         SvFLAGS(dstr) = 0;
13461         return dstr;
13462     }
13463
13464     switch (SvTYPE(sstr)) {
13465     case SVt_NULL:
13466         SvANY(dstr)     = NULL;
13467         break;
13468     case SVt_IV:
13469         SET_SVANY_FOR_BODYLESS_IV(dstr);
13470         if(SvROK(sstr)) {
13471             Perl_rvpv_dup(aTHX_ dstr, sstr, param);
13472         } else {
13473             SvIV_set(dstr, SvIVX(sstr));
13474         }
13475         break;
13476     case SVt_NV:
13477 #if NVSIZE <= IVSIZE
13478         SET_SVANY_FOR_BODYLESS_NV(dstr);
13479 #else
13480         SvANY(dstr)     = new_XNV();
13481 #endif
13482         SvNV_set(dstr, SvNVX(sstr));
13483         break;
13484     default:
13485         {
13486             /* These are all the types that need complex bodies allocating.  */
13487             void *new_body;
13488             const svtype sv_type = SvTYPE(sstr);
13489             const struct body_details *const sv_type_details
13490                 = bodies_by_type + sv_type;
13491
13492             switch (sv_type) {
13493             default:
13494                 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
13495                 break;
13496
13497             case SVt_PVGV:
13498             case SVt_PVIO:
13499             case SVt_PVFM:
13500             case SVt_PVHV:
13501             case SVt_PVAV:
13502             case SVt_PVCV:
13503             case SVt_PVLV:
13504             case SVt_REGEXP:
13505             case SVt_PVMG:
13506             case SVt_PVNV:
13507             case SVt_PVIV:
13508             case SVt_INVLIST:
13509             case SVt_PV:
13510                 assert(sv_type_details->body_size);
13511                 if (sv_type_details->arena) {
13512                     new_body_inline(new_body, sv_type);
13513                     new_body
13514                         = (void*)((char*)new_body - sv_type_details->offset);
13515                 } else {
13516                     new_body = new_NOARENA(sv_type_details);
13517                 }
13518             }
13519             assert(new_body);
13520             SvANY(dstr) = new_body;
13521
13522 #ifndef PURIFY
13523             Copy(((char*)SvANY(sstr)) + sv_type_details->offset,
13524                  ((char*)SvANY(dstr)) + sv_type_details->offset,
13525                  sv_type_details->copy, char);
13526 #else
13527             Copy(((char*)SvANY(sstr)),
13528                  ((char*)SvANY(dstr)),
13529                  sv_type_details->body_size + sv_type_details->offset, char);
13530 #endif
13531
13532             if (sv_type != SVt_PVAV && sv_type != SVt_PVHV
13533                 && !isGV_with_GP(dstr)
13534                 && !isREGEXP(dstr)
13535                 && !(sv_type == SVt_PVIO && !(IoFLAGS(dstr) & IOf_FAKE_DIRP)))
13536                 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
13537
13538             /* The Copy above means that all the source (unduplicated) pointers
13539                are now in the destination.  We can check the flags and the
13540                pointers in either, but it's possible that there's less cache
13541                missing by always going for the destination.
13542                FIXME - instrument and check that assumption  */
13543             if (sv_type >= SVt_PVMG) {
13544                 if (SvMAGIC(dstr))
13545                     SvMAGIC_set(dstr, mg_dup(SvMAGIC(dstr), param));
13546                 if (SvOBJECT(dstr) && SvSTASH(dstr))
13547                     SvSTASH_set(dstr, hv_dup_inc(SvSTASH(dstr), param));
13548                 else SvSTASH_set(dstr, 0); /* don't copy DESTROY cache */
13549             }
13550
13551             /* The cast silences a GCC warning about unhandled types.  */
13552             switch ((int)sv_type) {
13553             case SVt_PV:
13554                 break;
13555             case SVt_PVIV:
13556                 break;
13557             case SVt_PVNV:
13558                 break;
13559             case SVt_PVMG:
13560                 break;
13561             case SVt_REGEXP:
13562               duprex:
13563                 /* FIXME for plugins */
13564                 dstr->sv_u.svu_rx = ((REGEXP *)dstr)->sv_any;
13565                 re_dup_guts((REGEXP*) sstr, (REGEXP*) dstr, param);
13566                 break;
13567             case SVt_PVLV:
13568                 /* XXX LvTARGOFF sometimes holds PMOP* when DEBUGGING */
13569                 if (LvTYPE(dstr) == 't') /* for tie: unrefcnted fake (SV**) */
13570                     LvTARG(dstr) = dstr;
13571                 else if (LvTYPE(dstr) == 'T') /* for tie: fake HE */
13572                     LvTARG(dstr) = MUTABLE_SV(he_dup((HE*)LvTARG(dstr), 0, param));
13573                 else
13574                     LvTARG(dstr) = sv_dup_inc(LvTARG(dstr), param);
13575                 if (isREGEXP(sstr)) goto duprex;
13576             case SVt_PVGV:
13577                 /* non-GP case already handled above */
13578                 if(isGV_with_GP(sstr)) {
13579                     GvNAME_HEK(dstr) = hek_dup(GvNAME_HEK(dstr), param);
13580                     /* Don't call sv_add_backref here as it's going to be
13581                        created as part of the magic cloning of the symbol
13582                        table--unless this is during a join and the stash
13583                        is not actually being cloned.  */
13584                     /* Danger Will Robinson - GvGP(dstr) isn't initialised
13585                        at the point of this comment.  */
13586                     GvSTASH(dstr) = hv_dup(GvSTASH(dstr), param);
13587                     if (param->flags & CLONEf_JOIN_IN)
13588                         Perl_sv_add_backref(aTHX_ MUTABLE_SV(GvSTASH(dstr)), dstr);
13589                     GvGP_set(dstr, gp_dup(GvGP(sstr), param));
13590                     (void)GpREFCNT_inc(GvGP(dstr));
13591                 }
13592                 break;
13593             case SVt_PVIO:
13594                 /* PL_parser->rsfp_filters entries have fake IoDIRP() */
13595                 if(IoFLAGS(dstr) & IOf_FAKE_DIRP) {
13596                     /* I have no idea why fake dirp (rsfps)
13597                        should be treated differently but otherwise
13598                        we end up with leaks -- sky*/
13599                     IoTOP_GV(dstr)      = gv_dup_inc(IoTOP_GV(dstr), param);
13600                     IoFMT_GV(dstr)      = gv_dup_inc(IoFMT_GV(dstr), param);
13601                     IoBOTTOM_GV(dstr)   = gv_dup_inc(IoBOTTOM_GV(dstr), param);
13602                 } else {
13603                     IoTOP_GV(dstr)      = gv_dup(IoTOP_GV(dstr), param);
13604                     IoFMT_GV(dstr)      = gv_dup(IoFMT_GV(dstr), param);
13605                     IoBOTTOM_GV(dstr)   = gv_dup(IoBOTTOM_GV(dstr), param);
13606                     if (IoDIRP(dstr)) {
13607                         IoDIRP(dstr)    = dirp_dup(IoDIRP(dstr), param);
13608                     } else {
13609                         NOOP;
13610                         /* IoDIRP(dstr) is already a copy of IoDIRP(sstr)  */
13611                     }
13612                     IoIFP(dstr) = fp_dup(IoIFP(sstr), IoTYPE(dstr), param);
13613                 }
13614                 if (IoOFP(dstr) == IoIFP(sstr))
13615                     IoOFP(dstr) = IoIFP(dstr);
13616                 else
13617                     IoOFP(dstr) = fp_dup(IoOFP(dstr), IoTYPE(dstr), param);
13618                 IoTOP_NAME(dstr)        = SAVEPV(IoTOP_NAME(dstr));
13619                 IoFMT_NAME(dstr)        = SAVEPV(IoFMT_NAME(dstr));
13620                 IoBOTTOM_NAME(dstr)     = SAVEPV(IoBOTTOM_NAME(dstr));
13621                 break;
13622             case SVt_PVAV:
13623                 /* avoid cloning an empty array */
13624                 if (AvARRAY((const AV *)sstr) && AvFILLp((const AV *)sstr) >= 0) {
13625                     SV **dst_ary, **src_ary;
13626                     SSize_t items = AvFILLp((const AV *)sstr) + 1;
13627
13628                     src_ary = AvARRAY((const AV *)sstr);
13629                     Newxz(dst_ary, AvMAX((const AV *)sstr)+1, SV*);
13630                     ptr_table_store(PL_ptr_table, src_ary, dst_ary);
13631                     AvARRAY(MUTABLE_AV(dstr)) = dst_ary;
13632                     AvALLOC((const AV *)dstr) = dst_ary;
13633                     if (AvREAL((const AV *)sstr)) {
13634                         dst_ary = sv_dup_inc_multiple(src_ary, dst_ary, items,
13635                                                       param);
13636                     }
13637                     else {
13638                         while (items-- > 0)
13639                             *dst_ary++ = sv_dup(*src_ary++, param);
13640                     }
13641                     items = AvMAX((const AV *)sstr) - AvFILLp((const AV *)sstr);
13642                     while (items-- > 0) {
13643                         *dst_ary++ = &PL_sv_undef;
13644                     }
13645                 }
13646                 else {
13647                     AvARRAY(MUTABLE_AV(dstr))   = NULL;
13648                     AvALLOC((const AV *)dstr)   = (SV**)NULL;
13649                     AvMAX(  (const AV *)dstr)   = -1;
13650                     AvFILLp((const AV *)dstr)   = -1;
13651                 }
13652                 break;
13653             case SVt_PVHV:
13654                 if (HvARRAY((const HV *)sstr)) {
13655                     STRLEN i = 0;
13656                     const bool sharekeys = !!HvSHAREKEYS(sstr);
13657                     XPVHV * const dxhv = (XPVHV*)SvANY(dstr);
13658                     XPVHV * const sxhv = (XPVHV*)SvANY(sstr);
13659                     char *darray;
13660                     Newx(darray, PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1)
13661                         + (SvOOK(sstr) ? sizeof(struct xpvhv_aux) : 0),
13662                         char);
13663                     HvARRAY(dstr) = (HE**)darray;
13664                     while (i <= sxhv->xhv_max) {
13665                         const HE * const source = HvARRAY(sstr)[i];
13666                         HvARRAY(dstr)[i] = source
13667                             ? he_dup(source, sharekeys, param) : 0;
13668                         ++i;
13669                     }
13670                     if (SvOOK(sstr)) {
13671                         const struct xpvhv_aux * const saux = HvAUX(sstr);
13672                         struct xpvhv_aux * const daux = HvAUX(dstr);
13673                         /* This flag isn't copied.  */
13674                         SvOOK_on(dstr);
13675
13676                         if (saux->xhv_name_count) {
13677                             HEK ** const sname = saux->xhv_name_u.xhvnameu_names;
13678                             const I32 count
13679                              = saux->xhv_name_count < 0
13680                                 ? -saux->xhv_name_count
13681                                 :  saux->xhv_name_count;
13682                             HEK **shekp = sname + count;
13683                             HEK **dhekp;
13684                             Newx(daux->xhv_name_u.xhvnameu_names, count, HEK *);
13685                             dhekp = daux->xhv_name_u.xhvnameu_names + count;
13686                             while (shekp-- > sname) {
13687                                 dhekp--;
13688                                 *dhekp = hek_dup(*shekp, param);
13689                             }
13690                         }
13691                         else {
13692                             daux->xhv_name_u.xhvnameu_name
13693                                 = hek_dup(saux->xhv_name_u.xhvnameu_name,
13694                                           param);
13695                         }
13696                         daux->xhv_name_count = saux->xhv_name_count;
13697
13698                         daux->xhv_fill_lazy = saux->xhv_fill_lazy;
13699                         daux->xhv_aux_flags = saux->xhv_aux_flags;
13700 #ifdef PERL_HASH_RANDOMIZE_KEYS
13701                         daux->xhv_rand = saux->xhv_rand;
13702                         daux->xhv_last_rand = saux->xhv_last_rand;
13703 #endif
13704                         daux->xhv_riter = saux->xhv_riter;
13705                         daux->xhv_eiter = saux->xhv_eiter
13706                             ? he_dup(saux->xhv_eiter,
13707                                         cBOOL(HvSHAREKEYS(sstr)), param) : 0;
13708                         /* backref array needs refcnt=2; see sv_add_backref */
13709                         daux->xhv_backreferences =
13710                             (param->flags & CLONEf_JOIN_IN)
13711                                 /* when joining, we let the individual GVs and
13712                                  * CVs add themselves to backref as
13713                                  * needed. This avoids pulling in stuff
13714                                  * that isn't required, and simplifies the
13715                                  * case where stashes aren't cloned back
13716                                  * if they already exist in the parent
13717                                  * thread */
13718                             ? NULL
13719                             : saux->xhv_backreferences
13720                                 ? (SvTYPE(saux->xhv_backreferences) == SVt_PVAV)
13721                                     ? MUTABLE_AV(SvREFCNT_inc(
13722                                           sv_dup_inc((const SV *)
13723                                             saux->xhv_backreferences, param)))
13724                                     : MUTABLE_AV(sv_dup((const SV *)
13725                                             saux->xhv_backreferences, param))
13726                                 : 0;
13727
13728                         daux->xhv_mro_meta = saux->xhv_mro_meta
13729                             ? mro_meta_dup(saux->xhv_mro_meta, param)
13730                             : 0;
13731
13732                         /* Record stashes for possible cloning in Perl_clone(). */
13733                         if (HvNAME(sstr))
13734                             av_push(param->stashes, dstr);
13735                     }
13736                 }
13737                 else
13738                     HvARRAY(MUTABLE_HV(dstr)) = NULL;
13739                 break;
13740             case SVt_PVCV:
13741                 if (!(param->flags & CLONEf_COPY_STACKS)) {
13742                     CvDEPTH(dstr) = 0;
13743                 }
13744                 /* FALLTHROUGH */
13745             case SVt_PVFM:
13746                 /* NOTE: not refcounted */
13747                 SvANY(MUTABLE_CV(dstr))->xcv_stash =
13748                     hv_dup(CvSTASH(dstr), param);
13749                 if ((param->flags & CLONEf_JOIN_IN) && CvSTASH(dstr))
13750                     Perl_sv_add_backref(aTHX_ MUTABLE_SV(CvSTASH(dstr)), dstr);
13751                 if (!CvISXSUB(dstr)) {
13752                     OP_REFCNT_LOCK;
13753                     CvROOT(dstr) = OpREFCNT_inc(CvROOT(dstr));
13754                     OP_REFCNT_UNLOCK;
13755                     CvSLABBED_off(dstr);
13756                 } else if (CvCONST(dstr)) {
13757                     CvXSUBANY(dstr).any_ptr =
13758                         sv_dup_inc((const SV *)CvXSUBANY(dstr).any_ptr, param);
13759                 }
13760                 assert(!CvSLABBED(dstr));
13761                 if (CvDYNFILE(dstr)) CvFILE(dstr) = SAVEPV(CvFILE(dstr));
13762                 if (CvNAMED(dstr))
13763                     SvANY((CV *)dstr)->xcv_gv_u.xcv_hek =
13764                         hek_dup(CvNAME_HEK((CV *)sstr), param);
13765                 /* don't dup if copying back - CvGV isn't refcounted, so the
13766                  * duped GV may never be freed. A bit of a hack! DAPM */
13767                 else
13768                   SvANY(MUTABLE_CV(dstr))->xcv_gv_u.xcv_gv =
13769                     CvCVGV_RC(dstr)
13770                     ? gv_dup_inc(CvGV(sstr), param)
13771                     : (param->flags & CLONEf_JOIN_IN)
13772                         ? NULL
13773                         : gv_dup(CvGV(sstr), param);
13774
13775                 if (!CvISXSUB(sstr)) {
13776                     PADLIST * padlist = CvPADLIST(sstr);
13777                     if(padlist)
13778                         padlist = padlist_dup(padlist, param);
13779                     CvPADLIST_set(dstr, padlist);
13780                 } else
13781 /* unthreaded perl can't sv_dup so we dont support unthreaded's CvHSCXT */
13782                     PoisonPADLIST(dstr);
13783
13784                 CvOUTSIDE(dstr) =
13785                     CvWEAKOUTSIDE(sstr)
13786                     ? cv_dup(    CvOUTSIDE(dstr), param)
13787                     : cv_dup_inc(CvOUTSIDE(dstr), param);
13788                 break;
13789             }
13790         }
13791     }
13792
13793     return dstr;
13794  }
13795
13796 SV *
13797 Perl_sv_dup_inc(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
13798 {
13799     PERL_ARGS_ASSERT_SV_DUP_INC;
13800     return sstr ? SvREFCNT_inc(sv_dup_common(sstr, param)) : NULL;
13801 }
13802
13803 SV *
13804 Perl_sv_dup(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
13805 {
13806     SV *dstr = sstr ? sv_dup_common(sstr, param) : NULL;
13807     PERL_ARGS_ASSERT_SV_DUP;
13808
13809     /* Track every SV that (at least initially) had a reference count of 0.
13810        We need to do this by holding an actual reference to it in this array.
13811        If we attempt to cheat, turn AvREAL_off(), and store only pointers
13812        (akin to the stashes hash, and the perl stack), we come unstuck if
13813        a weak reference (or other SV legitimately SvREFCNT() == 0 for this
13814        thread) is manipulated in a CLONE method, because CLONE runs before the
13815        unreferenced array is walked to find SVs still with SvREFCNT() == 0
13816        (and fix things up by giving each a reference via the temps stack).
13817        Instead, during CLONE, if the 0-referenced SV has SvREFCNT_inc() and
13818        then SvREFCNT_dec(), it will be cleaned up (and added to the free list)
13819        before the walk of unreferenced happens and a reference to that is SV
13820        added to the temps stack. At which point we have the same SV considered
13821        to be in use, and free to be re-used. Not good.
13822     */
13823     if (dstr && !(param->flags & CLONEf_COPY_STACKS) && !SvREFCNT(dstr)) {
13824         assert(param->unreferenced);
13825         av_push(param->unreferenced, SvREFCNT_inc(dstr));
13826     }
13827
13828     return dstr;
13829 }
13830
13831 /* duplicate a context */
13832
13833 PERL_CONTEXT *
13834 Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
13835 {
13836     PERL_CONTEXT *ncxs;
13837
13838     PERL_ARGS_ASSERT_CX_DUP;
13839
13840     if (!cxs)
13841         return (PERL_CONTEXT*)NULL;
13842
13843     /* look for it in the table first */
13844     ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
13845     if (ncxs)
13846         return ncxs;
13847
13848     /* create anew and remember what it is */
13849     Newx(ncxs, max + 1, PERL_CONTEXT);
13850     ptr_table_store(PL_ptr_table, cxs, ncxs);
13851     Copy(cxs, ncxs, max + 1, PERL_CONTEXT);
13852
13853     while (ix >= 0) {
13854         PERL_CONTEXT * const ncx = &ncxs[ix];
13855         if (CxTYPE(ncx) == CXt_SUBST) {
13856             Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
13857         }
13858         else {
13859             ncx->blk_oldcop = (COP*)any_dup(ncx->blk_oldcop, param->proto_perl);
13860             switch (CxTYPE(ncx)) {
13861             case CXt_SUB:
13862                 ncx->blk_sub.cv         = (ncx->blk_sub.olddepth == 0
13863                                            ? cv_dup_inc(ncx->blk_sub.cv, param)
13864                                            : cv_dup(ncx->blk_sub.cv,param));
13865                 if(CxHASARGS(ncx)){
13866                     ncx->blk_sub.argarray = av_dup_inc(ncx->blk_sub.argarray,param);
13867                     ncx->blk_sub.savearray = av_dup_inc(ncx->blk_sub.savearray,param);
13868                 } else {
13869                     ncx->blk_sub.argarray = NULL;
13870                     ncx->blk_sub.savearray = NULL;
13871                 }
13872                 ncx->blk_sub.oldcomppad = (PAD*)ptr_table_fetch(PL_ptr_table,
13873                                            ncx->blk_sub.oldcomppad);
13874                 break;
13875             case CXt_EVAL:
13876                 ncx->blk_eval.old_namesv = sv_dup_inc(ncx->blk_eval.old_namesv,
13877                                                       param);
13878                 ncx->blk_eval.cur_text  = sv_dup(ncx->blk_eval.cur_text, param);
13879                 ncx->blk_eval.cv = cv_dup(ncx->blk_eval.cv, param);
13880                 break;
13881             case CXt_LOOP_LAZYSV:
13882                 ncx->blk_loop.state_u.lazysv.end
13883                     = sv_dup_inc(ncx->blk_loop.state_u.lazysv.end, param);
13884                 /* Fallthrough: duplicate lazysv.cur by using the ary.ary
13885                    duplication code instead.
13886                    We are taking advantage of (1) av_dup_inc and sv_dup_inc
13887                    actually being the same function, and (2) order
13888                    equivalence of the two unions.
13889                    We can assert the later [but only at run time :-(]  */
13890                 assert ((void *) &ncx->blk_loop.state_u.ary.ary ==
13891                         (void *) &ncx->blk_loop.state_u.lazysv.cur);
13892                 /* FALLTHROUGH */
13893             case CXt_LOOP_FOR:
13894                 ncx->blk_loop.state_u.ary.ary
13895                     = av_dup_inc(ncx->blk_loop.state_u.ary.ary, param);
13896                 /* FALLTHROUGH */
13897             case CXt_LOOP_LAZYIV:
13898             case CXt_LOOP_PLAIN:
13899                 /* code common to all CXt_LOOP_* types */
13900                 if (CxPADLOOP(ncx)) {
13901                     ncx->blk_loop.itervar_u.oldcomppad
13902                         = (PAD*)ptr_table_fetch(PL_ptr_table,
13903                                         ncx->blk_loop.itervar_u.oldcomppad);
13904                 } else {
13905                     ncx->blk_loop.itervar_u.gv
13906                         = gv_dup((const GV *)ncx->blk_loop.itervar_u.gv,
13907                                     param);
13908                 }
13909                 break;
13910             case CXt_FORMAT:
13911                 ncx->blk_format.cv      = cv_dup(ncx->blk_format.cv, param);
13912                 ncx->blk_format.gv      = gv_dup(ncx->blk_format.gv, param);
13913                 ncx->blk_format.dfoutgv = gv_dup_inc(ncx->blk_format.dfoutgv,
13914                                                      param);
13915                 break;
13916             case CXt_BLOCK:
13917             case CXt_NULL:
13918             case CXt_WHEN:
13919             case CXt_GIVEN:
13920                 break;
13921             }
13922         }
13923         --ix;
13924     }
13925     return ncxs;
13926 }
13927
13928 /* duplicate a stack info structure */
13929
13930 PERL_SI *
13931 Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
13932 {
13933     PERL_SI *nsi;
13934
13935     PERL_ARGS_ASSERT_SI_DUP;
13936
13937     if (!si)
13938         return (PERL_SI*)NULL;
13939
13940     /* look for it in the table first */
13941     nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
13942     if (nsi)
13943         return nsi;
13944
13945     /* create anew and remember what it is */
13946     Newxz(nsi, 1, PERL_SI);
13947     ptr_table_store(PL_ptr_table, si, nsi);
13948
13949     nsi->si_stack       = av_dup_inc(si->si_stack, param);
13950     nsi->si_cxix        = si->si_cxix;
13951     nsi->si_cxmax       = si->si_cxmax;
13952     nsi->si_cxstack     = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
13953     nsi->si_type        = si->si_type;
13954     nsi->si_prev        = si_dup(si->si_prev, param);
13955     nsi->si_next        = si_dup(si->si_next, param);
13956     nsi->si_markoff     = si->si_markoff;
13957
13958     return nsi;
13959 }
13960
13961 #define POPINT(ss,ix)   ((ss)[--(ix)].any_i32)
13962 #define TOPINT(ss,ix)   ((ss)[ix].any_i32)
13963 #define POPLONG(ss,ix)  ((ss)[--(ix)].any_long)
13964 #define TOPLONG(ss,ix)  ((ss)[ix].any_long)
13965 #define POPIV(ss,ix)    ((ss)[--(ix)].any_iv)
13966 #define TOPIV(ss,ix)    ((ss)[ix].any_iv)
13967 #define POPUV(ss,ix)    ((ss)[--(ix)].any_uv)
13968 #define TOPUV(ss,ix)    ((ss)[ix].any_uv)
13969 #define POPBOOL(ss,ix)  ((ss)[--(ix)].any_bool)
13970 #define TOPBOOL(ss,ix)  ((ss)[ix].any_bool)
13971 #define POPPTR(ss,ix)   ((ss)[--(ix)].any_ptr)
13972 #define TOPPTR(ss,ix)   ((ss)[ix].any_ptr)
13973 #define POPDPTR(ss,ix)  ((ss)[--(ix)].any_dptr)
13974 #define TOPDPTR(ss,ix)  ((ss)[ix].any_dptr)
13975 #define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
13976 #define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
13977
13978 /* XXXXX todo */
13979 #define pv_dup_inc(p)   SAVEPV(p)
13980 #define pv_dup(p)       SAVEPV(p)
13981 #define svp_dup_inc(p,pp)       any_dup(p,pp)
13982
13983 /* map any object to the new equivent - either something in the
13984  * ptr table, or something in the interpreter structure
13985  */
13986
13987 void *
13988 Perl_any_dup(pTHX_ void *v, const PerlInterpreter *proto_perl)
13989 {
13990     void *ret;
13991
13992     PERL_ARGS_ASSERT_ANY_DUP;
13993
13994     if (!v)
13995         return (void*)NULL;
13996
13997     /* look for it in the table first */
13998     ret = ptr_table_fetch(PL_ptr_table, v);
13999     if (ret)
14000         return ret;
14001
14002     /* see if it is part of the interpreter structure */
14003     if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
14004         ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
14005     else {
14006         ret = v;
14007     }
14008
14009     return ret;
14010 }
14011
14012 /* duplicate the save stack */
14013
14014 ANY *
14015 Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
14016 {
14017     dVAR;
14018     ANY * const ss      = proto_perl->Isavestack;
14019     const I32 max       = proto_perl->Isavestack_max;
14020     I32 ix              = proto_perl->Isavestack_ix;
14021     ANY *nss;
14022     const SV *sv;
14023     const GV *gv;
14024     const AV *av;
14025     const HV *hv;
14026     void* ptr;
14027     int intval;
14028     long longval;
14029     GP *gp;
14030     IV iv;
14031     I32 i;
14032     char *c = NULL;
14033     void (*dptr) (void*);
14034     void (*dxptr) (pTHX_ void*);
14035
14036     PERL_ARGS_ASSERT_SS_DUP;
14037
14038     Newxz(nss, max, ANY);
14039
14040     while (ix > 0) {
14041         const UV uv = POPUV(ss,ix);
14042         const U8 type = (U8)uv & SAVE_MASK;
14043
14044         TOPUV(nss,ix) = uv;
14045         switch (type) {
14046         case SAVEt_CLEARSV:
14047         case SAVEt_CLEARPADRANGE:
14048             break;
14049         case SAVEt_HELEM:               /* hash element */
14050         case SAVEt_SV:                  /* scalar reference */
14051             sv = (const SV *)POPPTR(ss,ix);
14052             TOPPTR(nss,ix) = SvREFCNT_inc(sv_dup_inc(sv, param));
14053             /* FALLTHROUGH */
14054         case SAVEt_ITEM:                        /* normal string */
14055         case SAVEt_GVSV:                        /* scalar slot in GV */
14056             sv = (const SV *)POPPTR(ss,ix);
14057             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
14058             if (type == SAVEt_SV)
14059                 break;
14060             /* FALLTHROUGH */
14061         case SAVEt_FREESV:
14062         case SAVEt_MORTALIZESV:
14063         case SAVEt_READONLY_OFF:
14064             sv = (const SV *)POPPTR(ss,ix);
14065             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
14066             break;
14067         case SAVEt_FREEPADNAME:
14068             ptr = POPPTR(ss,ix);
14069             TOPPTR(nss,ix) = padname_dup((PADNAME *)ptr, param);
14070             PadnameREFCNT((PADNAME *)TOPPTR(nss,ix))++;
14071             break;
14072         case SAVEt_SHARED_PVREF:                /* char* in shared space */
14073             c = (char*)POPPTR(ss,ix);
14074             TOPPTR(nss,ix) = savesharedpv(c);
14075             ptr = POPPTR(ss,ix);
14076             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
14077             break;
14078         case SAVEt_GENERIC_SVREF:               /* generic sv */
14079         case SAVEt_SVREF:                       /* scalar reference */
14080             sv = (const SV *)POPPTR(ss,ix);
14081             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
14082             if (type == SAVEt_SVREF)
14083                 SvREFCNT_inc_simple_void((SV *)TOPPTR(nss,ix));
14084             ptr = POPPTR(ss,ix);
14085             TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
14086             break;
14087         case SAVEt_GVSLOT:              /* any slot in GV */
14088             sv = (const SV *)POPPTR(ss,ix);
14089             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
14090             ptr = POPPTR(ss,ix);
14091             TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
14092             sv = (const SV *)POPPTR(ss,ix);
14093             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
14094             break;
14095         case SAVEt_HV:                          /* hash reference */
14096         case SAVEt_AV:                          /* array reference */
14097             sv = (const SV *) POPPTR(ss,ix);
14098             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
14099             /* FALLTHROUGH */
14100         case SAVEt_COMPPAD:
14101         case SAVEt_NSTAB:
14102             sv = (const SV *) POPPTR(ss,ix);
14103             TOPPTR(nss,ix) = sv_dup(sv, param);
14104             break;
14105         case SAVEt_INT:                         /* int reference */
14106             ptr = POPPTR(ss,ix);
14107             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
14108             intval = (int)POPINT(ss,ix);
14109             TOPINT(nss,ix) = intval;
14110             break;
14111         case SAVEt_LONG:                        /* long reference */
14112             ptr = POPPTR(ss,ix);
14113             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
14114             longval = (long)POPLONG(ss,ix);
14115             TOPLONG(nss,ix) = longval;
14116             break;
14117         case SAVEt_I32:                         /* I32 reference */
14118             ptr = POPPTR(ss,ix);
14119             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
14120             i = POPINT(ss,ix);
14121             TOPINT(nss,ix) = i;
14122             break;
14123         case SAVEt_IV:                          /* IV reference */
14124         case SAVEt_STRLEN:                      /* STRLEN/size_t ref */
14125             ptr = POPPTR(ss,ix);
14126             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
14127             iv = POPIV(ss,ix);
14128             TOPIV(nss,ix) = iv;
14129             break;
14130         case SAVEt_HPTR:                        /* HV* reference */
14131         case SAVEt_APTR:                        /* AV* reference */
14132         case SAVEt_SPTR:                        /* SV* reference */
14133             ptr = POPPTR(ss,ix);
14134             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
14135             sv = (const SV *)POPPTR(ss,ix);
14136             TOPPTR(nss,ix) = sv_dup(sv, param);
14137             break;
14138         case SAVEt_VPTR:                        /* random* reference */
14139             ptr = POPPTR(ss,ix);
14140             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
14141             /* FALLTHROUGH */
14142         case SAVEt_INT_SMALL:
14143         case SAVEt_I32_SMALL:
14144         case SAVEt_I16:                         /* I16 reference */
14145         case SAVEt_I8:                          /* I8 reference */
14146         case SAVEt_BOOL:
14147             ptr = POPPTR(ss,ix);
14148             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
14149             break;
14150         case SAVEt_GENERIC_PVREF:               /* generic char* */
14151         case SAVEt_PPTR:                        /* char* reference */
14152             ptr = POPPTR(ss,ix);
14153             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
14154             c = (char*)POPPTR(ss,ix);
14155             TOPPTR(nss,ix) = pv_dup(c);
14156             break;
14157         case SAVEt_GP:                          /* scalar reference */
14158             gp = (GP*)POPPTR(ss,ix);
14159             TOPPTR(nss,ix) = gp = gp_dup(gp, param);
14160             (void)GpREFCNT_inc(gp);
14161             gv = (const GV *)POPPTR(ss,ix);
14162             TOPPTR(nss,ix) = gv_dup_inc(gv, param);
14163             break;
14164         case SAVEt_FREEOP:
14165             ptr = POPPTR(ss,ix);
14166             if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
14167                 /* these are assumed to be refcounted properly */
14168                 OP *o;
14169                 switch (((OP*)ptr)->op_type) {
14170                 case OP_LEAVESUB:
14171                 case OP_LEAVESUBLV:
14172                 case OP_LEAVEEVAL:
14173                 case OP_LEAVE:
14174                 case OP_SCOPE:
14175                 case OP_LEAVEWRITE:
14176                     TOPPTR(nss,ix) = ptr;
14177                     o = (OP*)ptr;
14178                     OP_REFCNT_LOCK;
14179                     (void) OpREFCNT_inc(o);
14180                     OP_REFCNT_UNLOCK;
14181                     break;
14182                 default:
14183                     TOPPTR(nss,ix) = NULL;
14184                     break;
14185                 }
14186             }
14187             else
14188                 TOPPTR(nss,ix) = NULL;
14189             break;
14190         case SAVEt_FREECOPHH:
14191             ptr = POPPTR(ss,ix);
14192             TOPPTR(nss,ix) = cophh_copy((COPHH *)ptr);
14193             break;
14194         case SAVEt_ADELETE:
14195             av = (const AV *)POPPTR(ss,ix);
14196             TOPPTR(nss,ix) = av_dup_inc(av, param);
14197             i = POPINT(ss,ix);
14198             TOPINT(nss,ix) = i;
14199             break;
14200         case SAVEt_DELETE:
14201             hv = (const HV *)POPPTR(ss,ix);
14202             TOPPTR(nss,ix) = hv_dup_inc(hv, param);
14203             i = POPINT(ss,ix);
14204             TOPINT(nss,ix) = i;
14205             /* FALLTHROUGH */
14206         case SAVEt_FREEPV:
14207             c = (char*)POPPTR(ss,ix);
14208             TOPPTR(nss,ix) = pv_dup_inc(c);
14209             break;
14210         case SAVEt_STACK_POS:           /* Position on Perl stack */
14211             i = POPINT(ss,ix);
14212             TOPINT(nss,ix) = i;
14213             break;
14214         case SAVEt_DESTRUCTOR:
14215             ptr = POPPTR(ss,ix);
14216             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);  /* XXX quite arbitrary */
14217             dptr = POPDPTR(ss,ix);
14218             TOPDPTR(nss,ix) = DPTR2FPTR(void (*)(void*),
14219                                         any_dup(FPTR2DPTR(void *, dptr),
14220                                                 proto_perl));
14221             break;
14222         case SAVEt_DESTRUCTOR_X:
14223             ptr = POPPTR(ss,ix);
14224             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);  /* XXX quite arbitrary */
14225             dxptr = POPDXPTR(ss,ix);
14226             TOPDXPTR(nss,ix) = DPTR2FPTR(void (*)(pTHX_ void*),
14227                                          any_dup(FPTR2DPTR(void *, dxptr),
14228                                                  proto_perl));
14229             break;
14230         case SAVEt_REGCONTEXT:
14231         case SAVEt_ALLOC:
14232             ix -= uv >> SAVE_TIGHT_SHIFT;
14233             break;
14234         case SAVEt_AELEM:               /* array element */
14235             sv = (const SV *)POPPTR(ss,ix);
14236             TOPPTR(nss,ix) = SvREFCNT_inc(sv_dup_inc(sv, param));
14237             i = POPINT(ss,ix);
14238             TOPINT(nss,ix) = i;
14239             av = (const AV *)POPPTR(ss,ix);
14240             TOPPTR(nss,ix) = av_dup_inc(av, param);
14241             break;
14242         case SAVEt_OP:
14243             ptr = POPPTR(ss,ix);
14244             TOPPTR(nss,ix) = ptr;
14245             break;
14246         case SAVEt_HINTS:
14247             ptr = POPPTR(ss,ix);
14248             ptr = cophh_copy((COPHH*)ptr);
14249             TOPPTR(nss,ix) = ptr;
14250             i = POPINT(ss,ix);
14251             TOPINT(nss,ix) = i;
14252             if (i & HINT_LOCALIZE_HH) {
14253                 hv = (const HV *)POPPTR(ss,ix);
14254                 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
14255             }
14256             break;
14257         case SAVEt_PADSV_AND_MORTALIZE:
14258             longval = (long)POPLONG(ss,ix);
14259             TOPLONG(nss,ix) = longval;
14260             ptr = POPPTR(ss,ix);
14261             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
14262             sv = (const SV *)POPPTR(ss,ix);
14263             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
14264             break;
14265         case SAVEt_SET_SVFLAGS:
14266             i = POPINT(ss,ix);
14267             TOPINT(nss,ix) = i;
14268             i = POPINT(ss,ix);
14269             TOPINT(nss,ix) = i;
14270             sv = (const SV *)POPPTR(ss,ix);
14271             TOPPTR(nss,ix) = sv_dup(sv, param);
14272             break;
14273         case SAVEt_COMPILE_WARNINGS:
14274             ptr = POPPTR(ss,ix);
14275             TOPPTR(nss,ix) = DUP_WARNINGS((STRLEN*)ptr);
14276             break;
14277         case SAVEt_PARSER:
14278             ptr = POPPTR(ss,ix);
14279             TOPPTR(nss,ix) = parser_dup((const yy_parser*)ptr, param);
14280             break;
14281         case SAVEt_GP_ALIASED_SV: {
14282             GP * gp_ptr = (GP *)POPPTR(ss,ix);
14283             GP * new_gp_ptr = gp_dup(gp_ptr, param);
14284             TOPPTR(nss,ix) = new_gp_ptr;
14285             new_gp_ptr->gp_refcnt++;
14286             break;
14287         }
14288         default:
14289             Perl_croak(aTHX_
14290                        "panic: ss_dup inconsistency (%"IVdf")", (IV) type);
14291         }
14292     }
14293
14294     return nss;
14295 }
14296
14297
14298 /* if sv is a stash, call $class->CLONE_SKIP(), and set the SVphv_CLONEABLE
14299  * flag to the result. This is done for each stash before cloning starts,
14300  * so we know which stashes want their objects cloned */
14301
14302 static void
14303 do_mark_cloneable_stash(pTHX_ SV *const sv)
14304 {
14305     const HEK * const hvname = HvNAME_HEK((const HV *)sv);
14306     if (hvname) {
14307         GV* const cloner = gv_fetchmethod_autoload(MUTABLE_HV(sv), "CLONE_SKIP", 0);
14308         SvFLAGS(sv) |= SVphv_CLONEABLE; /* clone objects by default */
14309         if (cloner && GvCV(cloner)) {
14310             dSP;
14311             UV status;
14312
14313             ENTER;
14314             SAVETMPS;
14315             PUSHMARK(SP);
14316             mXPUSHs(newSVhek(hvname));
14317             PUTBACK;
14318             call_sv(MUTABLE_SV(GvCV(cloner)), G_SCALAR);
14319             SPAGAIN;
14320             status = POPu;
14321             PUTBACK;
14322             FREETMPS;
14323             LEAVE;
14324             if (status)
14325                 SvFLAGS(sv) &= ~SVphv_CLONEABLE;
14326         }
14327     }
14328 }
14329
14330
14331
14332 /*
14333 =for apidoc perl_clone
14334
14335 Create and return a new interpreter by cloning the current one.
14336
14337 perl_clone takes these flags as parameters:
14338
14339 CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
14340 without it we only clone the data and zero the stacks,
14341 with it we copy the stacks and the new perl interpreter is
14342 ready to run at the exact same point as the previous one.
14343 The pseudo-fork code uses COPY_STACKS while the
14344 threads->create doesn't.
14345
14346 CLONEf_KEEP_PTR_TABLE -
14347 perl_clone keeps a ptr_table with the pointer of the old
14348 variable as a key and the new variable as a value,
14349 this allows it to check if something has been cloned and not
14350 clone it again but rather just use the value and increase the
14351 refcount.  If KEEP_PTR_TABLE is not set then perl_clone will kill
14352 the ptr_table using the function
14353 C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
14354 reason to keep it around is if you want to dup some of your own
14355 variable who are outside the graph perl scans, example of this
14356 code is in threads.xs create.
14357
14358 CLONEf_CLONE_HOST -
14359 This is a win32 thing, it is ignored on unix, it tells perls
14360 win32host code (which is c++) to clone itself, this is needed on
14361 win32 if you want to run two threads at the same time,
14362 if you just want to do some stuff in a separate perl interpreter
14363 and then throw it away and return to the original one,
14364 you don't need to do anything.
14365
14366 =cut
14367 */
14368
14369 /* XXX the above needs expanding by someone who actually understands it ! */
14370 EXTERN_C PerlInterpreter *
14371 perl_clone_host(PerlInterpreter* proto_perl, UV flags);
14372
14373 PerlInterpreter *
14374 perl_clone(PerlInterpreter *proto_perl, UV flags)
14375 {
14376    dVAR;
14377 #ifdef PERL_IMPLICIT_SYS
14378
14379     PERL_ARGS_ASSERT_PERL_CLONE;
14380
14381    /* perlhost.h so we need to call into it
14382    to clone the host, CPerlHost should have a c interface, sky */
14383
14384    if (flags & CLONEf_CLONE_HOST) {
14385        return perl_clone_host(proto_perl,flags);
14386    }
14387    return perl_clone_using(proto_perl, flags,
14388                             proto_perl->IMem,
14389                             proto_perl->IMemShared,
14390                             proto_perl->IMemParse,
14391                             proto_perl->IEnv,
14392                             proto_perl->IStdIO,
14393                             proto_perl->ILIO,
14394                             proto_perl->IDir,
14395                             proto_perl->ISock,
14396                             proto_perl->IProc);
14397 }
14398
14399 PerlInterpreter *
14400 perl_clone_using(PerlInterpreter *proto_perl, UV flags,
14401                  struct IPerlMem* ipM, struct IPerlMem* ipMS,
14402                  struct IPerlMem* ipMP, struct IPerlEnv* ipE,
14403                  struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
14404                  struct IPerlDir* ipD, struct IPerlSock* ipS,
14405                  struct IPerlProc* ipP)
14406 {
14407     /* XXX many of the string copies here can be optimized if they're
14408      * constants; they need to be allocated as common memory and just
14409      * their pointers copied. */
14410
14411     IV i;
14412     CLONE_PARAMS clone_params;
14413     CLONE_PARAMS* const param = &clone_params;
14414
14415     PerlInterpreter * const my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
14416
14417     PERL_ARGS_ASSERT_PERL_CLONE_USING;
14418 #else           /* !PERL_IMPLICIT_SYS */
14419     IV i;
14420     CLONE_PARAMS clone_params;
14421     CLONE_PARAMS* param = &clone_params;
14422     PerlInterpreter * const my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
14423
14424     PERL_ARGS_ASSERT_PERL_CLONE;
14425 #endif          /* PERL_IMPLICIT_SYS */
14426
14427     /* for each stash, determine whether its objects should be cloned */
14428     S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
14429     PERL_SET_THX(my_perl);
14430
14431 #ifdef DEBUGGING
14432     PoisonNew(my_perl, 1, PerlInterpreter);
14433     PL_op = NULL;
14434     PL_curcop = NULL;
14435     PL_defstash = NULL; /* may be used by perl malloc() */
14436     PL_markstack = 0;
14437     PL_scopestack = 0;
14438     PL_scopestack_name = 0;
14439     PL_savestack = 0;
14440     PL_savestack_ix = 0;
14441     PL_savestack_max = -1;
14442     PL_sig_pending = 0;
14443     PL_parser = NULL;
14444     Zero(&PL_debug_pad, 1, struct perl_debug_pad);
14445     Zero(&PL_padname_undef, 1, PADNAME);
14446     Zero(&PL_padname_const, 1, PADNAME);
14447 #  ifdef DEBUG_LEAKING_SCALARS
14448     PL_sv_serial = (((UV)my_perl >> 2) & 0xfff) * 1000000;
14449 #  endif
14450 #else   /* !DEBUGGING */
14451     Zero(my_perl, 1, PerlInterpreter);
14452 #endif  /* DEBUGGING */
14453
14454 #ifdef PERL_IMPLICIT_SYS
14455     /* host pointers */
14456     PL_Mem              = ipM;
14457     PL_MemShared        = ipMS;
14458     PL_MemParse         = ipMP;
14459     PL_Env              = ipE;
14460     PL_StdIO            = ipStd;
14461     PL_LIO              = ipLIO;
14462     PL_Dir              = ipD;
14463     PL_Sock             = ipS;
14464     PL_Proc             = ipP;
14465 #endif          /* PERL_IMPLICIT_SYS */
14466
14467
14468     param->flags = flags;
14469     /* Nothing in the core code uses this, but we make it available to
14470        extensions (using mg_dup).  */
14471     param->proto_perl = proto_perl;
14472     /* Likely nothing will use this, but it is initialised to be consistent
14473        with Perl_clone_params_new().  */
14474     param->new_perl = my_perl;
14475     param->unreferenced = NULL;
14476
14477
14478     INIT_TRACK_MEMPOOL(my_perl->Imemory_debug_header, my_perl);
14479
14480     PL_body_arenas = NULL;
14481     Zero(&PL_body_roots, 1, PL_body_roots);
14482     
14483     PL_sv_count         = 0;
14484     PL_sv_root          = NULL;
14485     PL_sv_arenaroot     = NULL;
14486
14487     PL_debug            = proto_perl->Idebug;
14488
14489     /* dbargs array probably holds garbage */
14490     PL_dbargs           = NULL;
14491
14492     PL_compiling = proto_perl->Icompiling;
14493
14494     /* pseudo environmental stuff */
14495     PL_origargc         = proto_perl->Iorigargc;
14496     PL_origargv         = proto_perl->Iorigargv;
14497
14498 #ifndef NO_TAINT_SUPPORT
14499     /* Set tainting stuff before PerlIO_debug can possibly get called */
14500     PL_tainting         = proto_perl->Itainting;
14501     PL_taint_warn       = proto_perl->Itaint_warn;
14502 #else
14503     PL_tainting         = FALSE;
14504     PL_taint_warn       = FALSE;
14505 #endif
14506
14507     PL_minus_c          = proto_perl->Iminus_c;
14508
14509     PL_localpatches     = proto_perl->Ilocalpatches;
14510     PL_splitstr         = proto_perl->Isplitstr;
14511     PL_minus_n          = proto_perl->Iminus_n;
14512     PL_minus_p          = proto_perl->Iminus_p;
14513     PL_minus_l          = proto_perl->Iminus_l;
14514     PL_minus_a          = proto_perl->Iminus_a;
14515     PL_minus_E          = proto_perl->Iminus_E;
14516     PL_minus_F          = proto_perl->Iminus_F;
14517     PL_doswitches       = proto_perl->Idoswitches;
14518     PL_dowarn           = proto_perl->Idowarn;
14519     PL_sawalias         = proto_perl->Isawalias;
14520 #ifdef PERL_SAWAMPERSAND
14521     PL_sawampersand     = proto_perl->Isawampersand;
14522 #endif
14523     PL_unsafe           = proto_perl->Iunsafe;
14524     PL_perldb           = proto_perl->Iperldb;
14525     PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
14526     PL_exit_flags       = proto_perl->Iexit_flags;
14527
14528     /* XXX time(&PL_basetime) when asked for? */
14529     PL_basetime         = proto_perl->Ibasetime;
14530
14531     PL_maxsysfd         = proto_perl->Imaxsysfd;
14532     PL_statusvalue      = proto_perl->Istatusvalue;
14533 #ifdef __VMS
14534     PL_statusvalue_vms  = proto_perl->Istatusvalue_vms;
14535 #else
14536     PL_statusvalue_posix = proto_perl->Istatusvalue_posix;
14537 #endif
14538
14539     /* RE engine related */
14540     PL_regmatch_slab    = NULL;
14541     PL_reg_curpm        = NULL;
14542
14543     PL_sub_generation   = proto_perl->Isub_generation;
14544
14545     /* funky return mechanisms */
14546     PL_forkprocess      = proto_perl->Iforkprocess;
14547
14548     /* internal state */
14549     PL_maxo             = proto_perl->Imaxo;
14550
14551     PL_main_start       = proto_perl->Imain_start;
14552     PL_eval_root        = proto_perl->Ieval_root;
14553     PL_eval_start       = proto_perl->Ieval_start;
14554
14555     PL_filemode         = proto_perl->Ifilemode;
14556     PL_lastfd           = proto_perl->Ilastfd;
14557     PL_oldname          = proto_perl->Ioldname;         /* XXX not quite right */
14558     PL_Argv             = NULL;
14559     PL_Cmd              = NULL;
14560     PL_gensym           = proto_perl->Igensym;
14561
14562     PL_laststatval      = proto_perl->Ilaststatval;
14563     PL_laststype        = proto_perl->Ilaststype;
14564     PL_mess_sv          = NULL;
14565
14566     PL_profiledata      = NULL;
14567
14568     PL_generation       = proto_perl->Igeneration;
14569
14570     PL_in_clean_objs    = proto_perl->Iin_clean_objs;
14571     PL_in_clean_all     = proto_perl->Iin_clean_all;
14572
14573     PL_delaymagic_uid   = proto_perl->Idelaymagic_uid;
14574     PL_delaymagic_euid  = proto_perl->Idelaymagic_euid;
14575     PL_delaymagic_gid   = proto_perl->Idelaymagic_gid;
14576     PL_delaymagic_egid  = proto_perl->Idelaymagic_egid;
14577     PL_nomemok          = proto_perl->Inomemok;
14578     PL_an               = proto_perl->Ian;
14579     PL_evalseq          = proto_perl->Ievalseq;
14580     PL_origenviron      = proto_perl->Iorigenviron;     /* XXX not quite right */
14581     PL_origalen         = proto_perl->Iorigalen;
14582
14583     PL_sighandlerp      = proto_perl->Isighandlerp;
14584
14585     PL_runops           = proto_perl->Irunops;
14586
14587     PL_subline          = proto_perl->Isubline;
14588
14589     PL_cv_has_eval      = proto_perl->Icv_has_eval;
14590
14591 #ifdef FCRYPT
14592     PL_cryptseen        = proto_perl->Icryptseen;
14593 #endif
14594
14595 #ifdef USE_LOCALE_COLLATE
14596     PL_collation_ix     = proto_perl->Icollation_ix;
14597     PL_collation_standard       = proto_perl->Icollation_standard;
14598     PL_collxfrm_base    = proto_perl->Icollxfrm_base;
14599     PL_collxfrm_mult    = proto_perl->Icollxfrm_mult;
14600 #endif /* USE_LOCALE_COLLATE */
14601
14602 #ifdef USE_LOCALE_NUMERIC
14603     PL_numeric_standard = proto_perl->Inumeric_standard;
14604     PL_numeric_local    = proto_perl->Inumeric_local;
14605 #endif /* !USE_LOCALE_NUMERIC */
14606
14607     /* Did the locale setup indicate UTF-8? */
14608     PL_utf8locale       = proto_perl->Iutf8locale;
14609     PL_in_utf8_CTYPE_locale = proto_perl->Iin_utf8_CTYPE_locale;
14610     /* Unicode features (see perlrun/-C) */
14611     PL_unicode          = proto_perl->Iunicode;
14612
14613     /* Pre-5.8 signals control */
14614     PL_signals          = proto_perl->Isignals;
14615
14616     /* times() ticks per second */
14617     PL_clocktick        = proto_perl->Iclocktick;
14618
14619     /* Recursion stopper for PerlIO_find_layer */
14620     PL_in_load_module   = proto_perl->Iin_load_module;
14621
14622     /* sort() routine */
14623     PL_sort_RealCmp     = proto_perl->Isort_RealCmp;
14624
14625     /* Not really needed/useful since the reenrant_retint is "volatile",
14626      * but do it for consistency's sake. */
14627     PL_reentrant_retint = proto_perl->Ireentrant_retint;
14628
14629     /* Hooks to shared SVs and locks. */
14630     PL_sharehook        = proto_perl->Isharehook;
14631     PL_lockhook         = proto_perl->Ilockhook;
14632     PL_unlockhook       = proto_perl->Iunlockhook;
14633     PL_threadhook       = proto_perl->Ithreadhook;
14634     PL_destroyhook      = proto_perl->Idestroyhook;
14635     PL_signalhook       = proto_perl->Isignalhook;
14636
14637     PL_globhook         = proto_perl->Iglobhook;
14638
14639     /* swatch cache */
14640     PL_last_swash_hv    = NULL; /* reinits on demand */
14641     PL_last_swash_klen  = 0;
14642     PL_last_swash_key[0]= '\0';
14643     PL_last_swash_tmps  = (U8*)NULL;
14644     PL_last_swash_slen  = 0;
14645
14646     PL_srand_called     = proto_perl->Isrand_called;
14647     Copy(&(proto_perl->Irandom_state), &PL_random_state, 1, PL_RANDOM_STATE_TYPE);
14648
14649     if (flags & CLONEf_COPY_STACKS) {
14650         /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
14651         PL_tmps_ix              = proto_perl->Itmps_ix;
14652         PL_tmps_max             = proto_perl->Itmps_max;
14653         PL_tmps_floor           = proto_perl->Itmps_floor;
14654
14655         /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
14656          * NOTE: unlike the others! */
14657         PL_scopestack_ix        = proto_perl->Iscopestack_ix;
14658         PL_scopestack_max       = proto_perl->Iscopestack_max;
14659
14660         /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
14661          * NOTE: unlike the others! */
14662         PL_savestack_ix         = proto_perl->Isavestack_ix;
14663         PL_savestack_max        = proto_perl->Isavestack_max;
14664     }
14665
14666     PL_start_env        = proto_perl->Istart_env;       /* XXXXXX */
14667     PL_top_env          = &PL_start_env;
14668
14669     PL_op               = proto_perl->Iop;
14670
14671     PL_Sv               = NULL;
14672     PL_Xpv              = (XPV*)NULL;
14673     my_perl->Ina        = proto_perl->Ina;
14674
14675     PL_statbuf          = proto_perl->Istatbuf;
14676     PL_statcache        = proto_perl->Istatcache;
14677
14678 #ifndef NO_TAINT_SUPPORT
14679     PL_tainted          = proto_perl->Itainted;
14680 #else
14681     PL_tainted          = FALSE;
14682 #endif
14683     PL_curpm            = proto_perl->Icurpm;   /* XXX No PMOP ref count */
14684
14685     PL_chopset          = proto_perl->Ichopset; /* XXX never deallocated */
14686
14687     PL_restartjmpenv    = proto_perl->Irestartjmpenv;
14688     PL_restartop        = proto_perl->Irestartop;
14689     PL_in_eval          = proto_perl->Iin_eval;
14690     PL_delaymagic       = proto_perl->Idelaymagic;
14691     PL_phase            = proto_perl->Iphase;
14692     PL_localizing       = proto_perl->Ilocalizing;
14693
14694     PL_hv_fetch_ent_mh  = NULL;
14695     PL_modcount         = proto_perl->Imodcount;
14696     PL_lastgotoprobe    = NULL;
14697     PL_dumpindent       = proto_perl->Idumpindent;
14698
14699     PL_efloatbuf        = NULL;         /* reinits on demand */
14700     PL_efloatsize       = 0;                    /* reinits on demand */
14701
14702     /* regex stuff */
14703
14704     PL_colorset         = 0;            /* reinits PL_colors[] */
14705     /*PL_colors[6]      = {0,0,0,0,0,0};*/
14706
14707     /* Pluggable optimizer */
14708     PL_peepp            = proto_perl->Ipeepp;
14709     PL_rpeepp           = proto_perl->Irpeepp;
14710     /* op_free() hook */
14711     PL_opfreehook       = proto_perl->Iopfreehook;
14712
14713 #ifdef USE_REENTRANT_API
14714     /* XXX: things like -Dm will segfault here in perlio, but doing
14715      *  PERL_SET_CONTEXT(proto_perl);
14716      * breaks too many other things
14717      */
14718     Perl_reentrant_init(aTHX);
14719 #endif
14720
14721     /* create SV map for pointer relocation */
14722     PL_ptr_table = ptr_table_new();
14723
14724     /* initialize these special pointers as early as possible */
14725     init_constants();
14726     ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
14727     ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
14728     ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
14729     ptr_table_store(PL_ptr_table, &proto_perl->Ipadname_const,
14730                     &PL_padname_const);
14731
14732     /* create (a non-shared!) shared string table */
14733     PL_strtab           = newHV();
14734     HvSHAREKEYS_off(PL_strtab);
14735     hv_ksplit(PL_strtab, HvTOTALKEYS(proto_perl->Istrtab));
14736     ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
14737
14738     Zero(PL_sv_consts, SV_CONSTS_COUNT, SV*);
14739
14740     /* This PV will be free'd special way so must set it same way op.c does */
14741     PL_compiling.cop_file    = savesharedpv(PL_compiling.cop_file);
14742     ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
14743
14744     ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
14745     PL_compiling.cop_warnings = DUP_WARNINGS(PL_compiling.cop_warnings);
14746     CopHINTHASH_set(&PL_compiling, cophh_copy(CopHINTHASH_get(&PL_compiling)));
14747     PL_curcop           = (COP*)any_dup(proto_perl->Icurcop, proto_perl);
14748
14749     param->stashes      = newAV();  /* Setup array of objects to call clone on */
14750     /* This makes no difference to the implementation, as it always pushes
14751        and shifts pointers to other SVs without changing their reference
14752        count, with the array becoming empty before it is freed. However, it
14753        makes it conceptually clear what is going on, and will avoid some
14754        work inside av.c, filling slots between AvFILL() and AvMAX() with
14755        &PL_sv_undef, and SvREFCNT_dec()ing those.  */
14756     AvREAL_off(param->stashes);
14757
14758     if (!(flags & CLONEf_COPY_STACKS)) {
14759         param->unreferenced = newAV();
14760     }
14761
14762 #ifdef PERLIO_LAYERS
14763     /* Clone PerlIO tables as soon as we can handle general xx_dup() */
14764     PerlIO_clone(aTHX_ proto_perl, param);
14765 #endif
14766
14767     PL_envgv            = gv_dup_inc(proto_perl->Ienvgv, param);
14768     PL_incgv            = gv_dup_inc(proto_perl->Iincgv, param);
14769     PL_hintgv           = gv_dup_inc(proto_perl->Ihintgv, param);
14770     PL_origfilename     = SAVEPV(proto_perl->Iorigfilename);
14771     PL_xsubfilename     = proto_perl->Ixsubfilename;
14772     PL_diehook          = sv_dup_inc(proto_perl->Idiehook, param);
14773     PL_warnhook         = sv_dup_inc(proto_perl->Iwarnhook, param);
14774
14775     /* switches */
14776     PL_patchlevel       = sv_dup_inc(proto_perl->Ipatchlevel, param);
14777     PL_inplace          = SAVEPV(proto_perl->Iinplace);
14778     PL_e_script         = sv_dup_inc(proto_perl->Ie_script, param);
14779
14780     /* magical thingies */
14781
14782     PL_encoding         = sv_dup(proto_perl->Iencoding, param);
14783     PL_lex_encoding     = sv_dup(proto_perl->Ilex_encoding, param);
14784
14785     sv_setpvs(PERL_DEBUG_PAD(0), "");   /* For regex debugging. */
14786     sv_setpvs(PERL_DEBUG_PAD(1), "");   /* ext/re needs these */
14787     sv_setpvs(PERL_DEBUG_PAD(2), "");   /* even without DEBUGGING. */
14788
14789    
14790     /* Clone the regex array */
14791     /* ORANGE FIXME for plugins, probably in the SV dup code.
14792        newSViv(PTR2IV(CALLREGDUPE(
14793        INT2PTR(REGEXP *, SvIVX(regex)), param))))
14794     */
14795     PL_regex_padav = av_dup_inc(proto_perl->Iregex_padav, param);
14796     PL_regex_pad = AvARRAY(PL_regex_padav);
14797
14798     PL_stashpadmax      = proto_perl->Istashpadmax;
14799     PL_stashpadix       = proto_perl->Istashpadix ;
14800     Newx(PL_stashpad, PL_stashpadmax, HV *);
14801     {
14802         PADOFFSET o = 0;
14803         for (; o < PL_stashpadmax; ++o)
14804             PL_stashpad[o] = hv_dup(proto_perl->Istashpad[o], param);
14805     }
14806
14807     /* shortcuts to various I/O objects */
14808     PL_ofsgv            = gv_dup_inc(proto_perl->Iofsgv, param);
14809     PL_stdingv          = gv_dup(proto_perl->Istdingv, param);
14810     PL_stderrgv         = gv_dup(proto_perl->Istderrgv, param);
14811     PL_defgv            = gv_dup(proto_perl->Idefgv, param);
14812     PL_argvgv           = gv_dup_inc(proto_perl->Iargvgv, param);
14813     PL_argvoutgv        = gv_dup(proto_perl->Iargvoutgv, param);
14814     PL_argvout_stack    = av_dup_inc(proto_perl->Iargvout_stack, param);
14815
14816     /* shortcuts to regexp stuff */
14817     PL_replgv           = gv_dup_inc(proto_perl->Ireplgv, param);
14818
14819     /* shortcuts to misc objects */
14820     PL_errgv            = gv_dup(proto_perl->Ierrgv, param);
14821
14822     /* shortcuts to debugging objects */
14823     PL_DBgv             = gv_dup_inc(proto_perl->IDBgv, param);
14824     PL_DBline           = gv_dup_inc(proto_perl->IDBline, param);
14825     PL_DBsub            = gv_dup_inc(proto_perl->IDBsub, param);
14826     PL_DBsingle         = sv_dup(proto_perl->IDBsingle, param);
14827     PL_DBtrace          = sv_dup(proto_perl->IDBtrace, param);
14828     PL_DBsignal         = sv_dup(proto_perl->IDBsignal, param);
14829     Copy(proto_perl->IDBcontrol, PL_DBcontrol, DBVARMG_COUNT, IV);
14830
14831     /* symbol tables */
14832     PL_defstash         = hv_dup_inc(proto_perl->Idefstash, param);
14833     PL_curstash         = hv_dup_inc(proto_perl->Icurstash, param);
14834     PL_debstash         = hv_dup(proto_perl->Idebstash, param);
14835     PL_globalstash      = hv_dup(proto_perl->Iglobalstash, param);
14836     PL_curstname        = sv_dup_inc(proto_perl->Icurstname, param);
14837
14838     PL_beginav          = av_dup_inc(proto_perl->Ibeginav, param);
14839     PL_beginav_save     = av_dup_inc(proto_perl->Ibeginav_save, param);
14840     PL_checkav_save     = av_dup_inc(proto_perl->Icheckav_save, param);
14841     PL_unitcheckav      = av_dup_inc(proto_perl->Iunitcheckav, param);
14842     PL_unitcheckav_save = av_dup_inc(proto_perl->Iunitcheckav_save, param);
14843     PL_endav            = av_dup_inc(proto_perl->Iendav, param);
14844     PL_checkav          = av_dup_inc(proto_perl->Icheckav, param);
14845     PL_initav           = av_dup_inc(proto_perl->Iinitav, param);
14846     PL_savebegin        = proto_perl->Isavebegin;
14847
14848     PL_isarev           = hv_dup_inc(proto_perl->Iisarev, param);
14849
14850     /* subprocess state */
14851     PL_fdpid            = av_dup_inc(proto_perl->Ifdpid, param);
14852
14853     if (proto_perl->Iop_mask)
14854         PL_op_mask      = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
14855     else
14856         PL_op_mask      = NULL;
14857     /* PL_asserting        = proto_perl->Iasserting; */
14858
14859     /* current interpreter roots */
14860     PL_main_cv          = cv_dup_inc(proto_perl->Imain_cv, param);
14861     OP_REFCNT_LOCK;
14862     PL_main_root        = OpREFCNT_inc(proto_perl->Imain_root);
14863     OP_REFCNT_UNLOCK;
14864
14865     /* runtime control stuff */
14866     PL_curcopdb         = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
14867
14868     PL_preambleav       = av_dup_inc(proto_perl->Ipreambleav, param);
14869
14870     PL_ors_sv           = sv_dup_inc(proto_perl->Iors_sv, param);
14871
14872     /* interpreter atexit processing */
14873     PL_exitlistlen      = proto_perl->Iexitlistlen;
14874     if (PL_exitlistlen) {
14875         Newx(PL_exitlist, PL_exitlistlen, PerlExitListEntry);
14876         Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
14877     }
14878     else
14879         PL_exitlist     = (PerlExitListEntry*)NULL;
14880
14881     PL_my_cxt_size = proto_perl->Imy_cxt_size;
14882     if (PL_my_cxt_size) {
14883         Newx(PL_my_cxt_list, PL_my_cxt_size, void *);
14884         Copy(proto_perl->Imy_cxt_list, PL_my_cxt_list, PL_my_cxt_size, void *);
14885 #ifdef PERL_GLOBAL_STRUCT_PRIVATE
14886         Newx(PL_my_cxt_keys, PL_my_cxt_size, const char *);
14887         Copy(proto_perl->Imy_cxt_keys, PL_my_cxt_keys, PL_my_cxt_size, char *);
14888 #endif
14889     }
14890     else {
14891         PL_my_cxt_list  = (void**)NULL;
14892 #ifdef PERL_GLOBAL_STRUCT_PRIVATE
14893         PL_my_cxt_keys  = (const char**)NULL;
14894 #endif
14895     }
14896     PL_modglobal        = hv_dup_inc(proto_perl->Imodglobal, param);
14897     PL_custom_op_names  = hv_dup_inc(proto_perl->Icustom_op_names,param);
14898     PL_custom_op_descs  = hv_dup_inc(proto_perl->Icustom_op_descs,param);
14899     PL_custom_ops       = hv_dup_inc(proto_perl->Icustom_ops, param);
14900
14901     PL_compcv                   = cv_dup(proto_perl->Icompcv, param);
14902
14903     PAD_CLONE_VARS(proto_perl, param);
14904
14905 #ifdef HAVE_INTERP_INTERN
14906     sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
14907 #endif
14908
14909     PL_DBcv             = cv_dup(proto_perl->IDBcv, param);
14910
14911 #ifdef PERL_USES_PL_PIDSTATUS
14912     PL_pidstatus        = newHV();                      /* XXX flag for cloning? */
14913 #endif
14914     PL_osname           = SAVEPV(proto_perl->Iosname);
14915     PL_parser           = parser_dup(proto_perl->Iparser, param);
14916
14917     /* XXX this only works if the saved cop has already been cloned */
14918     if (proto_perl->Iparser) {
14919         PL_parser->saved_curcop = (COP*)any_dup(
14920                                     proto_perl->Iparser->saved_curcop,
14921                                     proto_perl);
14922     }
14923
14924     PL_subname          = sv_dup_inc(proto_perl->Isubname, param);
14925
14926 #ifdef USE_LOCALE_CTYPE
14927     /* Should we warn if uses locale? */
14928     PL_warn_locale      = sv_dup_inc(proto_perl->Iwarn_locale, param);
14929 #endif
14930
14931 #ifdef USE_LOCALE_COLLATE
14932     PL_collation_name   = SAVEPV(proto_perl->Icollation_name);
14933 #endif /* USE_LOCALE_COLLATE */
14934
14935 #ifdef USE_LOCALE_NUMERIC
14936     PL_numeric_name     = SAVEPV(proto_perl->Inumeric_name);
14937     PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
14938 #endif /* !USE_LOCALE_NUMERIC */
14939
14940     /* Unicode inversion lists */
14941     PL_Latin1           = sv_dup_inc(proto_perl->ILatin1, param);
14942     PL_UpperLatin1      = sv_dup_inc(proto_perl->IUpperLatin1, param);
14943     PL_AboveLatin1      = sv_dup_inc(proto_perl->IAboveLatin1, param);
14944     PL_InBitmap         = sv_dup_inc(proto_perl->IInBitmap, param);
14945
14946     PL_NonL1NonFinalFold = sv_dup_inc(proto_perl->INonL1NonFinalFold, param);
14947     PL_HasMultiCharFold = sv_dup_inc(proto_perl->IHasMultiCharFold, param);
14948
14949     /* utf8 character class swashes */
14950     for (i = 0; i < POSIX_SWASH_COUNT; i++) {
14951         PL_utf8_swash_ptrs[i] = sv_dup_inc(proto_perl->Iutf8_swash_ptrs[i], param);
14952     }
14953     for (i = 0; i < POSIX_CC_COUNT; i++) {
14954         PL_XPosix_ptrs[i] = sv_dup_inc(proto_perl->IXPosix_ptrs[i], param);
14955     }
14956     PL_GCB_invlist = sv_dup_inc(proto_perl->IGCB_invlist, param);
14957     PL_SB_invlist = sv_dup_inc(proto_perl->ISB_invlist, param);
14958     PL_WB_invlist = sv_dup_inc(proto_perl->IWB_invlist, param);
14959     PL_utf8_mark        = sv_dup_inc(proto_perl->Iutf8_mark, param);
14960     PL_utf8_toupper     = sv_dup_inc(proto_perl->Iutf8_toupper, param);
14961     PL_utf8_totitle     = sv_dup_inc(proto_perl->Iutf8_totitle, param);
14962     PL_utf8_tolower     = sv_dup_inc(proto_perl->Iutf8_tolower, param);
14963     PL_utf8_tofold      = sv_dup_inc(proto_perl->Iutf8_tofold, param);
14964     PL_utf8_idstart     = sv_dup_inc(proto_perl->Iutf8_idstart, param);
14965     PL_utf8_xidstart    = sv_dup_inc(proto_perl->Iutf8_xidstart, param);
14966     PL_utf8_perl_idstart = sv_dup_inc(proto_perl->Iutf8_perl_idstart, param);
14967     PL_utf8_perl_idcont = sv_dup_inc(proto_perl->Iutf8_perl_idcont, param);
14968     PL_utf8_idcont      = sv_dup_inc(proto_perl->Iutf8_idcont, param);
14969     PL_utf8_xidcont     = sv_dup_inc(proto_perl->Iutf8_xidcont, param);
14970     PL_utf8_foldable    = sv_dup_inc(proto_perl->Iutf8_foldable, param);
14971     PL_utf8_charname_begin = sv_dup_inc(proto_perl->Iutf8_charname_begin, param);
14972     PL_utf8_charname_continue = sv_dup_inc(proto_perl->Iutf8_charname_continue, param);
14973
14974     if (proto_perl->Ipsig_pend) {
14975         Newxz(PL_psig_pend, SIG_SIZE, int);
14976     }
14977     else {
14978         PL_psig_pend    = (int*)NULL;
14979     }
14980
14981     if (proto_perl->Ipsig_name) {
14982         Newx(PL_psig_name, 2 * SIG_SIZE, SV*);
14983         sv_dup_inc_multiple(proto_perl->Ipsig_name, PL_psig_name, 2 * SIG_SIZE,
14984                             param);
14985         PL_psig_ptr = PL_psig_name + SIG_SIZE;
14986     }
14987     else {
14988         PL_psig_ptr     = (SV**)NULL;
14989         PL_psig_name    = (SV**)NULL;
14990     }
14991
14992     if (flags & CLONEf_COPY_STACKS) {
14993         Newx(PL_tmps_stack, PL_tmps_max, SV*);
14994         sv_dup_inc_multiple(proto_perl->Itmps_stack, PL_tmps_stack,
14995                             PL_tmps_ix+1, param);
14996
14997         /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
14998         i = proto_perl->Imarkstack_max - proto_perl->Imarkstack;
14999         Newxz(PL_markstack, i, I32);
15000         PL_markstack_max        = PL_markstack + (proto_perl->Imarkstack_max
15001                                                   - proto_perl->Imarkstack);
15002         PL_markstack_ptr        = PL_markstack + (proto_perl->Imarkstack_ptr
15003                                                   - proto_perl->Imarkstack);
15004         Copy(proto_perl->Imarkstack, PL_markstack,
15005              PL_markstack_ptr - PL_markstack + 1, I32);
15006
15007         /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
15008          * NOTE: unlike the others! */
15009         Newxz(PL_scopestack, PL_scopestack_max, I32);
15010         Copy(proto_perl->Iscopestack, PL_scopestack, PL_scopestack_ix, I32);
15011
15012 #ifdef DEBUGGING
15013         Newxz(PL_scopestack_name, PL_scopestack_max, const char *);
15014         Copy(proto_perl->Iscopestack_name, PL_scopestack_name, PL_scopestack_ix, const char *);
15015 #endif
15016         /* reset stack AV to correct length before its duped via
15017          * PL_curstackinfo */
15018         AvFILLp(proto_perl->Icurstack) =
15019                             proto_perl->Istack_sp - proto_perl->Istack_base;
15020
15021         /* NOTE: si_dup() looks at PL_markstack */
15022         PL_curstackinfo         = si_dup(proto_perl->Icurstackinfo, param);
15023
15024         /* PL_curstack          = PL_curstackinfo->si_stack; */
15025         PL_curstack             = av_dup(proto_perl->Icurstack, param);
15026         PL_mainstack            = av_dup(proto_perl->Imainstack, param);
15027
15028         /* next PUSHs() etc. set *(PL_stack_sp+1) */
15029         PL_stack_base           = AvARRAY(PL_curstack);
15030         PL_stack_sp             = PL_stack_base + (proto_perl->Istack_sp
15031                                                    - proto_perl->Istack_base);
15032         PL_stack_max            = PL_stack_base + AvMAX(PL_curstack);
15033
15034         /*Newxz(PL_savestack, PL_savestack_max, ANY);*/
15035         PL_savestack            = ss_dup(proto_perl, param);
15036     }
15037     else {
15038         init_stacks();
15039         ENTER;                  /* perl_destruct() wants to LEAVE; */
15040     }
15041
15042     PL_statgv           = gv_dup(proto_perl->Istatgv, param);
15043     PL_statname         = sv_dup_inc(proto_perl->Istatname, param);
15044
15045     PL_rs               = sv_dup_inc(proto_perl->Irs, param);
15046     PL_last_in_gv       = gv_dup(proto_perl->Ilast_in_gv, param);
15047     PL_defoutgv         = gv_dup_inc(proto_perl->Idefoutgv, param);
15048     PL_toptarget        = sv_dup_inc(proto_perl->Itoptarget, param);
15049     PL_bodytarget       = sv_dup_inc(proto_perl->Ibodytarget, param);
15050     PL_formtarget       = sv_dup(proto_perl->Iformtarget, param);
15051
15052     PL_errors           = sv_dup_inc(proto_perl->Ierrors, param);
15053
15054     PL_sortcop          = (OP*)any_dup(proto_perl->Isortcop, proto_perl);
15055     PL_firstgv          = gv_dup_inc(proto_perl->Ifirstgv, param);
15056     PL_secondgv         = gv_dup_inc(proto_perl->Isecondgv, param);
15057
15058     PL_stashcache       = newHV();
15059
15060     PL_watchaddr        = (char **) ptr_table_fetch(PL_ptr_table,
15061                                             proto_perl->Iwatchaddr);
15062     PL_watchok          = PL_watchaddr ? * PL_watchaddr : NULL;
15063     if (PL_debug && PL_watchaddr) {
15064         PerlIO_printf(Perl_debug_log,
15065           "WATCHING: %"UVxf" cloned as %"UVxf" with value %"UVxf"\n",
15066           PTR2UV(proto_perl->Iwatchaddr), PTR2UV(PL_watchaddr),
15067           PTR2UV(PL_watchok));
15068     }
15069
15070     PL_registered_mros  = hv_dup_inc(proto_perl->Iregistered_mros, param);
15071     PL_blockhooks       = av_dup_inc(proto_perl->Iblockhooks, param);
15072     PL_utf8_foldclosures = hv_dup_inc(proto_perl->Iutf8_foldclosures, param);
15073
15074     /* Call the ->CLONE method, if it exists, for each of the stashes
15075        identified by sv_dup() above.
15076     */
15077     while(av_tindex(param->stashes) != -1) {
15078         HV* const stash = MUTABLE_HV(av_shift(param->stashes));
15079         GV* const cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
15080         if (cloner && GvCV(cloner)) {
15081             dSP;
15082             ENTER;
15083             SAVETMPS;
15084             PUSHMARK(SP);
15085             mXPUSHs(newSVhek(HvNAME_HEK(stash)));
15086             PUTBACK;
15087             call_sv(MUTABLE_SV(GvCV(cloner)), G_DISCARD);
15088             FREETMPS;
15089             LEAVE;
15090         }
15091     }
15092
15093     if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
15094         ptr_table_free(PL_ptr_table);
15095         PL_ptr_table = NULL;
15096     }
15097
15098     if (!(flags & CLONEf_COPY_STACKS)) {
15099         unreferenced_to_tmp_stack(param->unreferenced);
15100     }
15101
15102     SvREFCNT_dec(param->stashes);
15103
15104     /* orphaned? eg threads->new inside BEGIN or use */
15105     if (PL_compcv && ! SvREFCNT(PL_compcv)) {
15106         SvREFCNT_inc_simple_void(PL_compcv);
15107         SAVEFREESV(PL_compcv);
15108     }
15109
15110     return my_perl;
15111 }
15112
15113 static void
15114 S_unreferenced_to_tmp_stack(pTHX_ AV *const unreferenced)
15115 {
15116     PERL_ARGS_ASSERT_UNREFERENCED_TO_TMP_STACK;
15117     
15118     if (AvFILLp(unreferenced) > -1) {
15119         SV **svp = AvARRAY(unreferenced);
15120         SV **const last = svp + AvFILLp(unreferenced);
15121         SSize_t count = 0;
15122
15123         do {
15124             if (SvREFCNT(*svp) == 1)
15125                 ++count;
15126         } while (++svp <= last);
15127
15128         EXTEND_MORTAL(count);
15129         svp = AvARRAY(unreferenced);
15130
15131         do {
15132             if (SvREFCNT(*svp) == 1) {
15133                 /* Our reference is the only one to this SV. This means that
15134                    in this thread, the scalar effectively has a 0 reference.
15135                    That doesn't work (cleanup never happens), so donate our
15136                    reference to it onto the save stack. */
15137                 PL_tmps_stack[++PL_tmps_ix] = *svp;
15138             } else {
15139                 /* As an optimisation, because we are already walking the
15140                    entire array, instead of above doing either
15141                    SvREFCNT_inc(*svp) or *svp = &PL_sv_undef, we can instead
15142                    release our reference to the scalar, so that at the end of
15143                    the array owns zero references to the scalars it happens to
15144                    point to. We are effectively converting the array from
15145                    AvREAL() on to AvREAL() off. This saves the av_clear()
15146                    (triggered by the SvREFCNT_dec(unreferenced) below) from
15147                    walking the array a second time.  */
15148                 SvREFCNT_dec(*svp);
15149             }
15150
15151         } while (++svp <= last);
15152         AvREAL_off(unreferenced);
15153     }
15154     SvREFCNT_dec_NN(unreferenced);
15155 }
15156
15157 void
15158 Perl_clone_params_del(CLONE_PARAMS *param)
15159 {
15160     /* This seemingly funky ordering keeps the build with PERL_GLOBAL_STRUCT
15161        happy: */
15162     PerlInterpreter *const to = param->new_perl;
15163     dTHXa(to);
15164     PerlInterpreter *const was = PERL_GET_THX;
15165
15166     PERL_ARGS_ASSERT_CLONE_PARAMS_DEL;
15167
15168     if (was != to) {
15169         PERL_SET_THX(to);
15170     }
15171
15172     SvREFCNT_dec(param->stashes);
15173     if (param->unreferenced)
15174         unreferenced_to_tmp_stack(param->unreferenced);
15175
15176     Safefree(param);
15177
15178     if (was != to) {
15179         PERL_SET_THX(was);
15180     }
15181 }
15182
15183 CLONE_PARAMS *
15184 Perl_clone_params_new(PerlInterpreter *const from, PerlInterpreter *const to)
15185 {
15186     dVAR;
15187     /* Need to play this game, as newAV() can call safesysmalloc(), and that
15188        does a dTHX; to get the context from thread local storage.
15189        FIXME - under PERL_CORE Newx(), Safefree() and friends should expand to
15190        a version that passes in my_perl.  */
15191     PerlInterpreter *const was = PERL_GET_THX;
15192     CLONE_PARAMS *param;
15193
15194     PERL_ARGS_ASSERT_CLONE_PARAMS_NEW;
15195
15196     if (was != to) {
15197         PERL_SET_THX(to);
15198     }
15199
15200     /* Given that we've set the context, we can do this unshared.  */
15201     Newx(param, 1, CLONE_PARAMS);
15202
15203     param->flags = 0;
15204     param->proto_perl = from;
15205     param->new_perl = to;
15206     param->stashes = (AV *)Perl_newSV_type(to, SVt_PVAV);
15207     AvREAL_off(param->stashes);
15208     param->unreferenced = (AV *)Perl_newSV_type(to, SVt_PVAV);
15209
15210     if (was != to) {
15211         PERL_SET_THX(was);
15212     }
15213     return param;
15214 }
15215
15216 #endif /* USE_ITHREADS */
15217
15218 void
15219 Perl_init_constants(pTHX)
15220 {
15221     SvREFCNT(&PL_sv_undef)      = SvREFCNT_IMMORTAL;
15222     SvFLAGS(&PL_sv_undef)       = SVf_READONLY|SVf_PROTECT|SVt_NULL;
15223     SvANY(&PL_sv_undef)         = NULL;
15224
15225     SvANY(&PL_sv_no)            = new_XPVNV();
15226     SvREFCNT(&PL_sv_no)         = SvREFCNT_IMMORTAL;
15227     SvFLAGS(&PL_sv_no)          = SVt_PVNV|SVf_READONLY|SVf_PROTECT
15228                                   |SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
15229                                   |SVp_POK|SVf_POK;
15230
15231     SvANY(&PL_sv_yes)           = new_XPVNV();
15232     SvREFCNT(&PL_sv_yes)        = SvREFCNT_IMMORTAL;
15233     SvFLAGS(&PL_sv_yes)         = SVt_PVNV|SVf_READONLY|SVf_PROTECT
15234                                   |SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
15235                                   |SVp_POK|SVf_POK;
15236
15237     SvPV_set(&PL_sv_no, (char*)PL_No);
15238     SvCUR_set(&PL_sv_no, 0);
15239     SvLEN_set(&PL_sv_no, 0);
15240     SvIV_set(&PL_sv_no, 0);
15241     SvNV_set(&PL_sv_no, 0);
15242
15243     SvPV_set(&PL_sv_yes, (char*)PL_Yes);
15244     SvCUR_set(&PL_sv_yes, 1);
15245     SvLEN_set(&PL_sv_yes, 0);
15246     SvIV_set(&PL_sv_yes, 1);
15247     SvNV_set(&PL_sv_yes, 1);
15248
15249     PadnamePV(&PL_padname_const) = (char *)PL_No;
15250 }
15251
15252 /*
15253 =head1 Unicode Support
15254
15255 =for apidoc sv_recode_to_utf8
15256
15257 The encoding is assumed to be an Encode object, on entry the PV
15258 of the sv is assumed to be octets in that encoding, and the sv
15259 will be converted into Unicode (and UTF-8).
15260
15261 If the sv already is UTF-8 (or if it is not POK), or if the encoding
15262 is not a reference, nothing is done to the sv.  If the encoding is not
15263 an C<Encode::XS> Encoding object, bad things will happen.
15264 (See F<lib/encoding.pm> and L<Encode>.)
15265
15266 The PV of the sv is returned.
15267
15268 =cut */
15269
15270 char *
15271 Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
15272 {
15273     PERL_ARGS_ASSERT_SV_RECODE_TO_UTF8;
15274
15275     if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
15276         SV *uni;
15277         STRLEN len;
15278         const char *s;
15279         dSP;
15280         SV *nsv = sv;
15281         ENTER;
15282         PUSHSTACK;
15283         SAVETMPS;
15284         if (SvPADTMP(nsv)) {
15285             nsv = sv_newmortal();
15286             SvSetSV_nosteal(nsv, sv);
15287         }
15288         PUSHMARK(sp);
15289         EXTEND(SP, 3);
15290         PUSHs(encoding);
15291         PUSHs(nsv);
15292 /*
15293   NI-S 2002/07/09
15294   Passing sv_yes is wrong - it needs to be or'ed set of constants
15295   for Encode::XS, while UTf-8 decode (currently) assumes a true value means
15296   remove converted chars from source.
15297
15298   Both will default the value - let them.
15299
15300         XPUSHs(&PL_sv_yes);
15301 */
15302         PUTBACK;
15303         call_method("decode", G_SCALAR);
15304         SPAGAIN;
15305         uni = POPs;
15306         PUTBACK;
15307         s = SvPV_const(uni, len);
15308         if (s != SvPVX_const(sv)) {
15309             SvGROW(sv, len + 1);
15310             Move(s, SvPVX(sv), len + 1, char);
15311             SvCUR_set(sv, len);
15312         }
15313         FREETMPS;
15314         POPSTACK;
15315         LEAVE;
15316         if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
15317             /* clear pos and any utf8 cache */
15318             MAGIC * mg = mg_find(sv, PERL_MAGIC_regex_global);
15319             if (mg)
15320                 mg->mg_len = -1;
15321             if ((mg = mg_find(sv, PERL_MAGIC_utf8)))
15322                 magic_setutf8(sv,mg); /* clear UTF8 cache */
15323         }
15324         SvUTF8_on(sv);
15325         return SvPVX(sv);
15326     }
15327     return SvPOKp(sv) ? SvPVX(sv) : NULL;
15328 }
15329
15330 /*
15331 =for apidoc sv_cat_decode
15332
15333 The encoding is assumed to be an Encode object, the PV of the ssv is
15334 assumed to be octets in that encoding and decoding the input starts
15335 from the position which (PV + *offset) pointed to.  The dsv will be
15336 concatenated the decoded UTF-8 string from ssv.  Decoding will terminate
15337 when the string tstr appears in decoding output or the input ends on
15338 the PV of the ssv.  The value which the offset points will be modified
15339 to the last input position on the ssv.
15340
15341 Returns TRUE if the terminator was found, else returns FALSE.
15342
15343 =cut */
15344
15345 bool
15346 Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
15347                    SV *ssv, int *offset, char *tstr, int tlen)
15348 {
15349     bool ret = FALSE;
15350
15351     PERL_ARGS_ASSERT_SV_CAT_DECODE;
15352
15353     if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding)) {
15354         SV *offsv;
15355         dSP;
15356         ENTER;
15357         SAVETMPS;
15358         PUSHMARK(sp);
15359         EXTEND(SP, 6);
15360         PUSHs(encoding);
15361         PUSHs(dsv);
15362         PUSHs(ssv);
15363         offsv = newSViv(*offset);
15364         mPUSHs(offsv);
15365         mPUSHp(tstr, tlen);
15366         PUTBACK;
15367         call_method("cat_decode", G_SCALAR);
15368         SPAGAIN;
15369         ret = SvTRUE(TOPs);
15370         *offset = SvIV(offsv);
15371         PUTBACK;
15372         FREETMPS;
15373         LEAVE;
15374     }
15375     else
15376         Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
15377     return ret;
15378
15379 }
15380
15381 /* ---------------------------------------------------------------------
15382  *
15383  * support functions for report_uninit()
15384  */
15385
15386 /* the maxiumum size of array or hash where we will scan looking
15387  * for the undefined element that triggered the warning */
15388
15389 #define FUV_MAX_SEARCH_SIZE 1000
15390
15391 /* Look for an entry in the hash whose value has the same SV as val;
15392  * If so, return a mortal copy of the key. */
15393
15394 STATIC SV*
15395 S_find_hash_subscript(pTHX_ const HV *const hv, const SV *const val)
15396 {
15397     dVAR;
15398     HE **array;
15399     I32 i;
15400
15401     PERL_ARGS_ASSERT_FIND_HASH_SUBSCRIPT;
15402
15403     if (!hv || SvMAGICAL(hv) || !HvARRAY(hv) ||
15404                         (HvTOTALKEYS(hv) > FUV_MAX_SEARCH_SIZE))
15405         return NULL;
15406
15407     array = HvARRAY(hv);
15408
15409     for (i=HvMAX(hv); i>=0; i--) {
15410         HE *entry;
15411         for (entry = array[i]; entry; entry = HeNEXT(entry)) {
15412             if (HeVAL(entry) != val)
15413                 continue;
15414             if (    HeVAL(entry) == &PL_sv_undef ||
15415                     HeVAL(entry) == &PL_sv_placeholder)
15416                 continue;
15417             if (!HeKEY(entry))
15418                 return NULL;
15419             if (HeKLEN(entry) == HEf_SVKEY)
15420                 return sv_mortalcopy(HeKEY_sv(entry));
15421             return sv_2mortal(newSVhek(HeKEY_hek(entry)));
15422         }
15423     }
15424     return NULL;
15425 }
15426
15427 /* Look for an entry in the array whose value has the same SV as val;
15428  * If so, return the index, otherwise return -1. */
15429
15430 STATIC I32
15431 S_find_array_subscript(pTHX_ const AV *const av, const SV *const val)
15432 {
15433     PERL_ARGS_ASSERT_FIND_ARRAY_SUBSCRIPT;
15434
15435     if (!av || SvMAGICAL(av) || !AvARRAY(av) ||
15436                         (AvFILLp(av) > FUV_MAX_SEARCH_SIZE))
15437         return -1;
15438
15439     if (val != &PL_sv_undef) {
15440         SV ** const svp = AvARRAY(av);
15441         I32 i;
15442
15443         for (i=AvFILLp(av); i>=0; i--)
15444             if (svp[i] == val)
15445                 return i;
15446     }
15447     return -1;
15448 }
15449
15450 /* varname(): return the name of a variable, optionally with a subscript.
15451  * If gv is non-zero, use the name of that global, along with gvtype (one
15452  * of "$", "@", "%"); otherwise use the name of the lexical at pad offset
15453  * targ.  Depending on the value of the subscript_type flag, return:
15454  */
15455
15456 #define FUV_SUBSCRIPT_NONE      1       /* "@foo"          */
15457 #define FUV_SUBSCRIPT_ARRAY     2       /* "$foo[aindex]"  */
15458 #define FUV_SUBSCRIPT_HASH      3       /* "$foo{keyname}" */
15459 #define FUV_SUBSCRIPT_WITHIN    4       /* "within @foo"   */
15460
15461 SV*
15462 Perl_varname(pTHX_ const GV *const gv, const char gvtype, PADOFFSET targ,
15463         const SV *const keyname, I32 aindex, int subscript_type)
15464 {
15465
15466     SV * const name = sv_newmortal();
15467     if (gv && isGV(gv)) {
15468         char buffer[2];
15469         buffer[0] = gvtype;
15470         buffer[1] = 0;
15471
15472         /* as gv_fullname4(), but add literal '^' for $^FOO names  */
15473
15474         gv_fullname4(name, gv, buffer, 0);
15475
15476         if ((unsigned int)SvPVX(name)[1] <= 26) {
15477             buffer[0] = '^';
15478             buffer[1] = SvPVX(name)[1] + 'A' - 1;
15479
15480             /* Swap the 1 unprintable control character for the 2 byte pretty
15481                version - ie substr($name, 1, 1) = $buffer; */
15482             sv_insert(name, 1, 1, buffer, 2);
15483         }
15484     }
15485     else {
15486         CV * const cv = gv ? ((CV *)gv) : find_runcv(NULL);
15487         PADNAME *sv;
15488
15489         assert(!cv || SvTYPE(cv) == SVt_PVCV || SvTYPE(cv) == SVt_PVFM);
15490
15491         if (!cv || !CvPADLIST(cv))
15492             return NULL;
15493         sv = padnamelist_fetch(PadlistNAMES(CvPADLIST(cv)), targ);
15494         sv_setpvn(name, PadnamePV(sv), PadnameLEN(sv));
15495         SvUTF8_on(name);
15496     }
15497
15498     if (subscript_type == FUV_SUBSCRIPT_HASH) {
15499         SV * const sv = newSV(0);
15500         *SvPVX(name) = '$';
15501         Perl_sv_catpvf(aTHX_ name, "{%s}",
15502             pv_pretty(sv, SvPVX_const(keyname), SvCUR(keyname), 32, NULL, NULL,
15503                     PERL_PV_PRETTY_DUMP | PERL_PV_ESCAPE_UNI_DETECT ));
15504         SvREFCNT_dec_NN(sv);
15505     }
15506     else if (subscript_type == FUV_SUBSCRIPT_ARRAY) {
15507         *SvPVX(name) = '$';
15508         Perl_sv_catpvf(aTHX_ name, "[%"IVdf"]", (IV)aindex);
15509     }
15510     else if (subscript_type == FUV_SUBSCRIPT_WITHIN) {
15511         /* We know that name has no magic, so can use 0 instead of SV_GMAGIC */
15512         Perl_sv_insert_flags(aTHX_ name, 0, 0,  STR_WITH_LEN("within "), 0);
15513     }
15514
15515     return name;
15516 }
15517
15518
15519 /*
15520 =for apidoc find_uninit_var
15521
15522 Find the name of the undefined variable (if any) that caused the operator
15523 to issue a "Use of uninitialized value" warning.
15524 If match is true, only return a name if its value matches uninit_sv.
15525 So roughly speaking, if a unary operator (such as OP_COS) generates a
15526 warning, then following the direct child of the op may yield an
15527 OP_PADSV or OP_GV that gives the name of the undefined variable.  On the
15528 other hand, with OP_ADD there are two branches to follow, so we only print
15529 the variable name if we get an exact match.
15530 desc_p points to a string pointer holding the description of the op.
15531 This may be updated if needed.
15532
15533 The name is returned as a mortal SV.
15534
15535 Assumes that PL_op is the op that originally triggered the error, and that
15536 PL_comppad/PL_curpad points to the currently executing pad.
15537
15538 =cut
15539 */
15540
15541 STATIC SV *
15542 S_find_uninit_var(pTHX_ const OP *const obase, const SV *const uninit_sv,
15543                   bool match, const char **desc_p)
15544 {
15545     dVAR;
15546     SV *sv;
15547     const GV *gv;
15548     const OP *o, *o2, *kid;
15549
15550     PERL_ARGS_ASSERT_FIND_UNINIT_VAR;
15551
15552     if (!obase || (match && (!uninit_sv || uninit_sv == &PL_sv_undef ||
15553                             uninit_sv == &PL_sv_placeholder)))
15554         return NULL;
15555
15556     switch (obase->op_type) {
15557
15558     case OP_RV2AV:
15559     case OP_RV2HV:
15560     case OP_PADAV:
15561     case OP_PADHV:
15562       {
15563         const bool pad  = (    obase->op_type == OP_PADAV
15564                             || obase->op_type == OP_PADHV
15565                             || obase->op_type == OP_PADRANGE
15566                           );
15567
15568         const bool hash = (    obase->op_type == OP_PADHV
15569                             || obase->op_type == OP_RV2HV
15570                             || (obase->op_type == OP_PADRANGE
15571                                 && SvTYPE(PAD_SVl(obase->op_targ)) == SVt_PVHV)
15572                           );
15573         I32 index = 0;
15574         SV *keysv = NULL;
15575         int subscript_type = FUV_SUBSCRIPT_WITHIN;
15576
15577         if (pad) { /* @lex, %lex */
15578             sv = PAD_SVl(obase->op_targ);
15579             gv = NULL;
15580         }
15581         else {
15582             if (cUNOPx(obase)->op_first->op_type == OP_GV) {
15583             /* @global, %global */
15584                 gv = cGVOPx_gv(cUNOPx(obase)->op_first);
15585                 if (!gv)
15586                     break;
15587                 sv = hash ? MUTABLE_SV(GvHV(gv)): MUTABLE_SV(GvAV(gv));
15588             }
15589             else if (obase == PL_op) /* @{expr}, %{expr} */
15590                 return find_uninit_var(cUNOPx(obase)->op_first,
15591                                                 uninit_sv, match, desc_p);
15592             else /* @{expr}, %{expr} as a sub-expression */
15593                 return NULL;
15594         }
15595
15596         /* attempt to find a match within the aggregate */
15597         if (hash) {
15598             keysv = find_hash_subscript((const HV*)sv, uninit_sv);
15599             if (keysv)
15600                 subscript_type = FUV_SUBSCRIPT_HASH;
15601         }
15602         else {
15603             index = find_array_subscript((const AV *)sv, uninit_sv);
15604             if (index >= 0)
15605                 subscript_type = FUV_SUBSCRIPT_ARRAY;
15606         }
15607
15608         if (match && subscript_type == FUV_SUBSCRIPT_WITHIN)
15609             break;
15610
15611         return varname(gv, (char)(hash ? '%' : '@'), obase->op_targ,
15612                                     keysv, index, subscript_type);
15613       }
15614
15615     case OP_RV2SV:
15616         if (cUNOPx(obase)->op_first->op_type == OP_GV) {
15617             /* $global */
15618             gv = cGVOPx_gv(cUNOPx(obase)->op_first);
15619             if (!gv || !GvSTASH(gv))
15620                 break;
15621             if (match && (GvSV(gv) != uninit_sv))
15622                 break;
15623             return varname(gv, '$', 0, NULL, 0, FUV_SUBSCRIPT_NONE);
15624         }
15625         /* ${expr} */
15626         return find_uninit_var(cUNOPx(obase)->op_first, uninit_sv, 1, desc_p);
15627
15628     case OP_PADSV:
15629         if (match && PAD_SVl(obase->op_targ) != uninit_sv)
15630             break;
15631         return varname(NULL, '$', obase->op_targ,
15632                                     NULL, 0, FUV_SUBSCRIPT_NONE);
15633
15634     case OP_GVSV:
15635         gv = cGVOPx_gv(obase);
15636         if (!gv || (match && GvSV(gv) != uninit_sv) || !GvSTASH(gv))
15637             break;
15638         return varname(gv, '$', 0, NULL, 0, FUV_SUBSCRIPT_NONE);
15639
15640     case OP_AELEMFAST_LEX:
15641         if (match) {
15642             SV **svp;
15643             AV *av = MUTABLE_AV(PAD_SV(obase->op_targ));
15644             if (!av || SvRMAGICAL(av))
15645                 break;
15646             svp = av_fetch(av, (I8)obase->op_private, FALSE);
15647             if (!svp || *svp != uninit_sv)
15648                 break;
15649         }
15650         return varname(NULL, '$', obase->op_targ,
15651                        NULL, (I8)obase->op_private, FUV_SUBSCRIPT_ARRAY);
15652     case OP_AELEMFAST:
15653         {
15654             gv = cGVOPx_gv(obase);
15655             if (!gv)
15656                 break;
15657             if (match) {
15658                 SV **svp;
15659                 AV *const av = GvAV(gv);
15660                 if (!av || SvRMAGICAL(av))
15661                     break;
15662                 svp = av_fetch(av, (I8)obase->op_private, FALSE);
15663                 if (!svp || *svp != uninit_sv)
15664                     break;
15665             }
15666             return varname(gv, '$', 0,
15667                     NULL, (I8)obase->op_private, FUV_SUBSCRIPT_ARRAY);
15668         }
15669         NOT_REACHED; /* NOTREACHED */
15670
15671     case OP_EXISTS:
15672         o = cUNOPx(obase)->op_first;
15673         if (!o || o->op_type != OP_NULL ||
15674                 ! (o->op_targ == OP_AELEM || o->op_targ == OP_HELEM))
15675             break;
15676         return find_uninit_var(cBINOPo->op_last, uninit_sv, match, desc_p);
15677
15678     case OP_AELEM:
15679     case OP_HELEM:
15680     {
15681         bool negate = FALSE;
15682
15683         if (PL_op == obase)
15684             /* $a[uninit_expr] or $h{uninit_expr} */
15685             return find_uninit_var(cBINOPx(obase)->op_last,
15686                                                 uninit_sv, match, desc_p);
15687
15688         gv = NULL;
15689         o = cBINOPx(obase)->op_first;
15690         kid = cBINOPx(obase)->op_last;
15691
15692         /* get the av or hv, and optionally the gv */
15693         sv = NULL;
15694         if  (o->op_type == OP_PADAV || o->op_type == OP_PADHV) {
15695             sv = PAD_SV(o->op_targ);
15696         }
15697         else if ((o->op_type == OP_RV2AV || o->op_type == OP_RV2HV)
15698                 && cUNOPo->op_first->op_type == OP_GV)
15699         {
15700             gv = cGVOPx_gv(cUNOPo->op_first);
15701             if (!gv)
15702                 break;
15703             sv = o->op_type
15704                 == OP_RV2HV ? MUTABLE_SV(GvHV(gv)) : MUTABLE_SV(GvAV(gv));
15705         }
15706         if (!sv)
15707             break;
15708
15709         if (kid && kid->op_type == OP_NEGATE) {
15710             negate = TRUE;
15711             kid = cUNOPx(kid)->op_first;
15712         }
15713
15714         if (kid && kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid))) {
15715             /* index is constant */
15716             SV* kidsv;
15717             if (negate) {
15718                 kidsv = newSVpvs_flags("-", SVs_TEMP);
15719                 sv_catsv(kidsv, cSVOPx_sv(kid));
15720             }
15721             else
15722                 kidsv = cSVOPx_sv(kid);
15723             if (match) {
15724                 if (SvMAGICAL(sv))
15725                     break;
15726                 if (obase->op_type == OP_HELEM) {
15727                     HE* he = hv_fetch_ent(MUTABLE_HV(sv), kidsv, 0, 0);
15728                     if (!he || HeVAL(he) != uninit_sv)
15729                         break;
15730                 }
15731                 else {
15732                     SV * const  opsv = cSVOPx_sv(kid);
15733                     const IV  opsviv = SvIV(opsv);
15734                     SV * const * const svp = av_fetch(MUTABLE_AV(sv),
15735                         negate ? - opsviv : opsviv,
15736                         FALSE);
15737                     if (!svp || *svp != uninit_sv)
15738                         break;
15739                 }
15740             }
15741             if (obase->op_type == OP_HELEM)
15742                 return varname(gv, '%', o->op_targ,
15743                             kidsv, 0, FUV_SUBSCRIPT_HASH);
15744             else
15745                 return varname(gv, '@', o->op_targ, NULL,
15746                     negate ? - SvIV(cSVOPx_sv(kid)) : SvIV(cSVOPx_sv(kid)),
15747                     FUV_SUBSCRIPT_ARRAY);
15748         }
15749         else  {
15750             /* index is an expression;
15751              * attempt to find a match within the aggregate */
15752             if (obase->op_type == OP_HELEM) {
15753                 SV * const keysv = find_hash_subscript((const HV*)sv, uninit_sv);
15754                 if (keysv)
15755                     return varname(gv, '%', o->op_targ,
15756                                                 keysv, 0, FUV_SUBSCRIPT_HASH);
15757             }
15758             else {
15759                 const I32 index
15760                     = find_array_subscript((const AV *)sv, uninit_sv);
15761                 if (index >= 0)
15762                     return varname(gv, '@', o->op_targ,
15763                                         NULL, index, FUV_SUBSCRIPT_ARRAY);
15764             }
15765             if (match)
15766                 break;
15767             return varname(gv,
15768                 (char)((o->op_type == OP_PADAV || o->op_type == OP_RV2AV)
15769                 ? '@' : '%'),
15770                 o->op_targ, NULL, 0, FUV_SUBSCRIPT_WITHIN);
15771         }
15772         NOT_REACHED; /* NOTREACHED */
15773     }
15774
15775     case OP_MULTIDEREF: {
15776         /* If we were executing OP_MULTIDEREF when the undef warning
15777          * triggered, then it must be one of the index values within
15778          * that triggered it. If not, then the only possibility is that
15779          * the value retrieved by the last aggregate lookup might be the
15780          * culprit. For the former, we set PL_multideref_pc each time before
15781          * using an index, so work though the item list until we reach
15782          * that point. For the latter, just work through the entire item
15783          * list; the last aggregate retrieved will be the candidate.
15784          */
15785
15786         /* the named aggregate, if any */
15787         PADOFFSET agg_targ = 0;
15788         GV       *agg_gv   = NULL;
15789         /* the last-seen index */
15790         UV        index_type;
15791         PADOFFSET index_targ;
15792         GV       *index_gv;
15793         IV        index_const_iv = 0; /* init for spurious compiler warn */
15794         SV       *index_const_sv;
15795         int       depth = 0;  /* how many array/hash lookups we've done */
15796
15797         UNOP_AUX_item *items = cUNOP_AUXx(obase)->op_aux;
15798         UNOP_AUX_item *last = NULL;
15799         UV actions = items->uv;
15800         bool is_hv;
15801
15802         if (PL_op == obase) {
15803             last = PL_multideref_pc;
15804             assert(last >= items && last <= items + items[-1].uv);
15805         }
15806
15807         assert(actions);
15808
15809         while (1) {
15810             is_hv = FALSE;
15811             switch (actions & MDEREF_ACTION_MASK) {
15812
15813             case MDEREF_reload:
15814                 actions = (++items)->uv;
15815                 continue;
15816
15817             case MDEREF_HV_padhv_helem:               /* $lex{...} */
15818                 is_hv = TRUE;
15819                 /* FALLTHROUGH */
15820             case MDEREF_AV_padav_aelem:               /* $lex[...] */
15821                 agg_targ = (++items)->pad_offset;
15822                 agg_gv = NULL;
15823                 break;
15824
15825             case MDEREF_HV_gvhv_helem:                /* $pkg{...} */
15826                 is_hv = TRUE;
15827                 /* FALLTHROUGH */
15828             case MDEREF_AV_gvav_aelem:                /* $pkg[...] */
15829                 agg_targ = 0;
15830                 agg_gv = (GV*)UNOP_AUX_item_sv(++items);
15831                 assert(isGV_with_GP(agg_gv));
15832                 break;
15833
15834             case MDEREF_HV_gvsv_vivify_rv2hv_helem:   /* $pkg->{...} */
15835             case MDEREF_HV_padsv_vivify_rv2hv_helem:  /* $lex->{...} */
15836                 ++items;
15837                 /* FALLTHROUGH */
15838             case MDEREF_HV_pop_rv2hv_helem:           /* expr->{...} */
15839             case MDEREF_HV_vivify_rv2hv_helem:        /* vivify, ->{...} */
15840                 agg_targ = 0;
15841                 agg_gv   = NULL;
15842                 is_hv    = TRUE;
15843                 break;
15844
15845             case MDEREF_AV_gvsv_vivify_rv2av_aelem:   /* $pkg->[...] */
15846             case MDEREF_AV_padsv_vivify_rv2av_aelem:  /* $lex->[...] */
15847                 ++items;
15848                 /* FALLTHROUGH */
15849             case MDEREF_AV_pop_rv2av_aelem:           /* expr->[...] */
15850             case MDEREF_AV_vivify_rv2av_aelem:        /* vivify, ->[...] */
15851                 agg_targ = 0;
15852                 agg_gv   = NULL;
15853             } /* switch */
15854
15855             index_targ     = 0;
15856             index_gv       = NULL;
15857             index_const_sv = NULL;
15858
15859             index_type = (actions & MDEREF_INDEX_MASK);
15860             switch (index_type) {
15861             case MDEREF_INDEX_none:
15862                 break;
15863             case MDEREF_INDEX_const:
15864                 if (is_hv)
15865                     index_const_sv = UNOP_AUX_item_sv(++items)
15866                 else
15867                     index_const_iv = (++items)->iv;
15868                 break;
15869             case MDEREF_INDEX_padsv:
15870                 index_targ = (++items)->pad_offset;
15871                 break;
15872             case MDEREF_INDEX_gvsv:
15873                 index_gv = (GV*)UNOP_AUX_item_sv(++items);
15874                 assert(isGV_with_GP(index_gv));
15875                 break;
15876             }
15877
15878             if (index_type != MDEREF_INDEX_none)
15879                 depth++;
15880
15881             if (   index_type == MDEREF_INDEX_none
15882                 || (actions & MDEREF_FLAG_last)
15883                 || (last && items == last)
15884             )
15885                 break;
15886
15887             actions >>= MDEREF_SHIFT;
15888         } /* while */
15889
15890         if (PL_op == obase) {
15891             /* index was undef */
15892
15893             *desc_p = (    (actions & MDEREF_FLAG_last)
15894                         && (obase->op_private
15895                                 & (OPpMULTIDEREF_EXISTS|OPpMULTIDEREF_DELETE)))
15896                         ?
15897                             (obase->op_private & OPpMULTIDEREF_EXISTS)
15898                                 ? "exists"
15899                                 : "delete"
15900                         : is_hv ? "hash element" : "array element";
15901             assert(index_type != MDEREF_INDEX_none);
15902             if (index_gv)
15903                 return varname(index_gv, '$', 0, NULL, 0, FUV_SUBSCRIPT_NONE);
15904             if (index_targ)
15905                 return varname(NULL, '$', index_targ,
15906                                     NULL, 0, FUV_SUBSCRIPT_NONE);
15907             assert(is_hv); /* AV index is an IV and can't be undef */
15908             /* can a const HV index ever be undef? */
15909             return NULL;
15910         }
15911
15912         /* the SV returned by pp_multideref() was undef, if anything was */
15913
15914         if (depth != 1)
15915             break;
15916
15917         if (agg_targ)
15918             sv = PAD_SV(agg_targ);
15919         else if (agg_gv)
15920             sv = is_hv ? MUTABLE_SV(GvHV(agg_gv)) : MUTABLE_SV(GvAV(agg_gv));
15921         else
15922             break;
15923
15924         if (index_type == MDEREF_INDEX_const) {
15925             if (match) {
15926                 if (SvMAGICAL(sv))
15927                     break;
15928                 if (is_hv) {
15929                     HE* he = hv_fetch_ent(MUTABLE_HV(sv), index_const_sv, 0, 0);
15930                     if (!he || HeVAL(he) != uninit_sv)
15931                         break;
15932                 }
15933                 else {
15934                     SV * const * const svp =
15935                             av_fetch(MUTABLE_AV(sv), index_const_iv, FALSE);
15936                     if (!svp || *svp != uninit_sv)
15937                         break;
15938                 }
15939             }
15940             return is_hv
15941                 ? varname(agg_gv, '%', agg_targ,
15942                                 index_const_sv, 0,    FUV_SUBSCRIPT_HASH)
15943                 : varname(agg_gv, '@', agg_targ,
15944                                 NULL, index_const_iv, FUV_SUBSCRIPT_ARRAY);
15945         }
15946         else  {
15947             /* index is an var */
15948             if (is_hv) {
15949                 SV * const keysv = find_hash_subscript((const HV*)sv, uninit_sv);
15950                 if (keysv)
15951                     return varname(agg_gv, '%', agg_targ,
15952                                                 keysv, 0, FUV_SUBSCRIPT_HASH);
15953             }
15954             else {
15955                 const I32 index
15956                     = find_array_subscript((const AV *)sv, uninit_sv);
15957                 if (index >= 0)
15958                     return varname(agg_gv, '@', agg_targ,
15959                                         NULL, index, FUV_SUBSCRIPT_ARRAY);
15960             }
15961             if (match)
15962                 break;
15963             return varname(agg_gv,
15964                 is_hv ? '%' : '@',
15965                 agg_targ, NULL, 0, FUV_SUBSCRIPT_WITHIN);
15966         }
15967         NOT_REACHED; /* NOTREACHED */
15968     }
15969
15970     case OP_AASSIGN:
15971         /* only examine RHS */
15972         return find_uninit_var(cBINOPx(obase)->op_first, uninit_sv,
15973                                                                 match, desc_p);
15974
15975     case OP_OPEN:
15976         o = cUNOPx(obase)->op_first;
15977         if (   o->op_type == OP_PUSHMARK
15978            || (o->op_type == OP_NULL && o->op_targ == OP_PUSHMARK)
15979         )
15980             o = OpSIBLING(o);
15981
15982         if (!OpHAS_SIBLING(o)) {
15983             /* one-arg version of open is highly magical */
15984
15985             if (o->op_type == OP_GV) { /* open FOO; */
15986                 gv = cGVOPx_gv(o);
15987                 if (match && GvSV(gv) != uninit_sv)
15988                     break;
15989                 return varname(gv, '$', 0,
15990                             NULL, 0, FUV_SUBSCRIPT_NONE);
15991             }
15992             /* other possibilities not handled are:
15993              * open $x; or open my $x;  should return '${*$x}'
15994              * open expr;               should return '$'.expr ideally
15995              */
15996              break;
15997         }
15998         goto do_op;
15999
16000     /* ops where $_ may be an implicit arg */
16001     case OP_TRANS:
16002     case OP_TRANSR:
16003     case OP_SUBST:
16004     case OP_MATCH:
16005         if ( !(obase->op_flags & OPf_STACKED)) {
16006             if (uninit_sv == DEFSV)
16007                 return newSVpvs_flags("$_", SVs_TEMP);
16008             else if (obase->op_targ
16009                   && uninit_sv == PAD_SVl(obase->op_targ))
16010                 return varname(NULL, '$', obase->op_targ, NULL, 0,
16011                                FUV_SUBSCRIPT_NONE);
16012         }
16013         goto do_op;
16014
16015     case OP_PRTF:
16016     case OP_PRINT:
16017     case OP_SAY:
16018         match = 1; /* print etc can return undef on defined args */
16019         /* skip filehandle as it can't produce 'undef' warning  */
16020         o = cUNOPx(obase)->op_first;
16021         if ((obase->op_flags & OPf_STACKED)
16022             &&
16023                (   o->op_type == OP_PUSHMARK
16024                || (o->op_type == OP_NULL && o->op_targ == OP_PUSHMARK)))
16025             o = OpSIBLING(OpSIBLING(o));
16026         goto do_op2;
16027
16028
16029     case OP_ENTEREVAL: /* could be eval $undef or $x='$undef'; eval $x */
16030     case OP_CUSTOM: /* XS or custom code could trigger random warnings */
16031
16032         /* the following ops are capable of returning PL_sv_undef even for
16033          * defined arg(s) */
16034
16035     case OP_BACKTICK:
16036     case OP_PIPE_OP:
16037     case OP_FILENO:
16038     case OP_BINMODE:
16039     case OP_TIED:
16040     case OP_GETC:
16041     case OP_SYSREAD:
16042     case OP_SEND:
16043     case OP_IOCTL:
16044     case OP_SOCKET:
16045     case OP_SOCKPAIR:
16046     case OP_BIND:
16047     case OP_CONNECT:
16048     case OP_LISTEN:
16049     case OP_ACCEPT:
16050     case OP_SHUTDOWN:
16051     case OP_SSOCKOPT:
16052     case OP_GETPEERNAME:
16053     case OP_FTRREAD:
16054     case OP_FTRWRITE:
16055     case OP_FTREXEC:
16056     case OP_FTROWNED:
16057     case OP_FTEREAD:
16058     case OP_FTEWRITE:
16059     case OP_FTEEXEC:
16060     case OP_FTEOWNED:
16061     case OP_FTIS:
16062     case OP_FTZERO:
16063     case OP_FTSIZE:
16064     case OP_FTFILE:
16065     case OP_FTDIR:
16066     case OP_FTLINK:
16067     case OP_FTPIPE:
16068     case OP_FTSOCK:
16069     case OP_FTBLK:
16070     case OP_FTCHR:
16071     case OP_FTTTY:
16072     case OP_FTSUID:
16073     case OP_FTSGID:
16074     case OP_FTSVTX:
16075     case OP_FTTEXT:
16076     case OP_FTBINARY:
16077     case OP_FTMTIME:
16078     case OP_FTATIME:
16079     case OP_FTCTIME:
16080     case OP_READLINK:
16081     case OP_OPEN_DIR:
16082     case OP_READDIR:
16083     case OP_TELLDIR:
16084     case OP_SEEKDIR:
16085     case OP_REWINDDIR:
16086     case OP_CLOSEDIR:
16087     case OP_GMTIME:
16088     case OP_ALARM:
16089     case OP_SEMGET:
16090     case OP_GETLOGIN:
16091     case OP_UNDEF:
16092     case OP_SUBSTR:
16093     case OP_AEACH:
16094     case OP_EACH:
16095     case OP_SORT:
16096     case OP_CALLER:
16097     case OP_DOFILE:
16098     case OP_PROTOTYPE:
16099     case OP_NCMP:
16100     case OP_SMARTMATCH:
16101     case OP_UNPACK:
16102     case OP_SYSOPEN:
16103     case OP_SYSSEEK:
16104         match = 1;
16105         goto do_op;
16106
16107     case OP_ENTERSUB:
16108     case OP_GOTO:
16109         /* XXX tmp hack: these two may call an XS sub, and currently
16110           XS subs don't have a SUB entry on the context stack, so CV and
16111           pad determination goes wrong, and BAD things happen. So, just
16112           don't try to determine the value under those circumstances.
16113           Need a better fix at dome point. DAPM 11/2007 */
16114         break;
16115
16116     case OP_FLIP:
16117     case OP_FLOP:
16118     {
16119         GV * const gv = gv_fetchpvs(".", GV_NOTQUAL, SVt_PV);
16120         if (gv && GvSV(gv) == uninit_sv)
16121             return newSVpvs_flags("$.", SVs_TEMP);
16122         goto do_op;
16123     }
16124
16125     case OP_POS:
16126         /* def-ness of rval pos() is independent of the def-ness of its arg */
16127         if ( !(obase->op_flags & OPf_MOD))
16128             break;
16129
16130     case OP_SCHOMP:
16131     case OP_CHOMP:
16132         if (SvROK(PL_rs) && uninit_sv == SvRV(PL_rs))
16133             return newSVpvs_flags("${$/}", SVs_TEMP);
16134         /* FALLTHROUGH */
16135
16136     default:
16137     do_op:
16138         if (!(obase->op_flags & OPf_KIDS))
16139             break;
16140         o = cUNOPx(obase)->op_first;
16141         
16142     do_op2:
16143         if (!o)
16144             break;
16145
16146         /* This loop checks all the kid ops, skipping any that cannot pos-
16147          * sibly be responsible for the uninitialized value; i.e., defined
16148          * constants and ops that return nothing.  If there is only one op
16149          * left that is not skipped, then we *know* it is responsible for
16150          * the uninitialized value.  If there is more than one op left, we
16151          * have to look for an exact match in the while() loop below.
16152          * Note that we skip padrange, because the individual pad ops that
16153          * it replaced are still in the tree, so we work on them instead.
16154          */
16155         o2 = NULL;
16156         for (kid=o; kid; kid = OpSIBLING(kid)) {
16157             const OPCODE type = kid->op_type;
16158             if ( (type == OP_CONST && SvOK(cSVOPx_sv(kid)))
16159               || (type == OP_NULL  && ! (kid->op_flags & OPf_KIDS))
16160               || (type == OP_PUSHMARK)
16161               || (type == OP_PADRANGE)
16162             )
16163             continue;
16164
16165             if (o2) { /* more than one found */
16166                 o2 = NULL;
16167                 break;
16168             }
16169             o2 = kid;
16170         }
16171         if (o2)
16172             return find_uninit_var(o2, uninit_sv, match, desc_p);
16173
16174         /* scan all args */
16175         while (o) {
16176             sv = find_uninit_var(o, uninit_sv, 1, desc_p);
16177             if (sv)
16178                 return sv;
16179             o = OpSIBLING(o);
16180         }
16181         break;
16182     }
16183     return NULL;
16184 }
16185
16186
16187 /*
16188 =for apidoc report_uninit
16189
16190 Print appropriate "Use of uninitialized variable" warning.
16191
16192 =cut
16193 */
16194
16195 void
16196 Perl_report_uninit(pTHX_ const SV *uninit_sv)
16197 {
16198     if (PL_op) {
16199         SV* varname = NULL;
16200         const char *desc;
16201
16202         desc = PL_op->op_type == OP_STRINGIFY && PL_op->op_folded
16203                 ? "join or string"
16204                 : OP_DESC(PL_op);
16205         if (uninit_sv && PL_curpad) {
16206             varname = find_uninit_var(PL_op, uninit_sv, 0, &desc);
16207             if (varname)
16208                 sv_insert(varname, 0, 0, " ", 1);
16209         }
16210         /* PL_warn_uninit_sv is constant */
16211         GCC_DIAG_IGNORE(-Wformat-nonliteral);
16212         /* diag_listed_as: Use of uninitialized value%s */
16213         Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit_sv,
16214                 SVfARG(varname ? varname : &PL_sv_no),
16215                 " in ", desc);
16216         GCC_DIAG_RESTORE;
16217     }
16218     else {
16219         /* PL_warn_uninit is constant */
16220         GCC_DIAG_IGNORE(-Wformat-nonliteral);
16221         Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
16222                     "", "", "");
16223         GCC_DIAG_RESTORE;
16224     }
16225 }
16226
16227 /*
16228  * Local variables:
16229  * c-indentation-style: bsd
16230  * c-basic-offset: 4
16231  * indent-tabs-mode: nil
16232  * End:
16233  *
16234  * ex: set ts=8 sts=4 sw=4 et:
16235  */