This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Add an -X option to expand-macro.pl to show how XSUBs see the macro.
[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
35 #define FCALL *f
36
37 #ifdef __Lynx__
38 /* Missing proto on LynxOS */
39   char *gconvert(double, int, int,  char *);
40 #endif
41
42 #ifdef PERL_UTF8_CACHE_ASSERT
43 /* if adding more checks watch out for the following tests:
44  *   t/op/index.t t/op/length.t t/op/pat.t t/op/substr.t
45  *   lib/utf8.t lib/Unicode/Collate/t/index.t
46  * --jhi
47  */
48 #   define ASSERT_UTF8_CACHE(cache) \
49     STMT_START { if (cache) { assert((cache)[0] <= (cache)[1]); \
50                               assert((cache)[2] <= (cache)[3]); \
51                               assert((cache)[3] <= (cache)[1]);} \
52                               } STMT_END
53 #else
54 #   define ASSERT_UTF8_CACHE(cache) NOOP
55 #endif
56
57 #ifdef PERL_OLD_COPY_ON_WRITE
58 #define SV_COW_NEXT_SV(sv)      INT2PTR(SV *,SvUVX(sv))
59 #define SV_COW_NEXT_SV_SET(current,next)        SvUV_set(current, PTR2UV(next))
60 /* This is a pessimistic view. Scalar must be purely a read-write PV to copy-
61    on-write.  */
62 #endif
63
64 /* ============================================================================
65
66 =head1 Allocation and deallocation of SVs.
67
68 An SV (or AV, HV, etc.) is allocated in two parts: the head (struct
69 sv, av, hv...) contains type and reference count information, and for
70 many types, a pointer to the body (struct xrv, xpv, xpviv...), which
71 contains fields specific to each type.  Some types store all they need
72 in the head, so don't have a body.
73
74 In all but the most memory-paranoid configuations (ex: PURIFY), heads
75 and bodies are allocated out of arenas, which by default are
76 approximately 4K chunks of memory parcelled up into N heads or bodies.
77 Sv-bodies are allocated by their sv-type, guaranteeing size
78 consistency needed to allocate safely from arrays.
79
80 For SV-heads, the first slot in each arena is reserved, and holds a
81 link to the next arena, some flags, and a note of the number of slots.
82 Snaked through each arena chain is a linked list of free items; when
83 this becomes empty, an extra arena is allocated and divided up into N
84 items which are threaded into the free list.
85
86 SV-bodies are similar, but they use arena-sets by default, which
87 separate the link and info from the arena itself, and reclaim the 1st
88 slot in the arena.  SV-bodies are further described later.
89
90 The following global variables are associated with arenas:
91
92     PL_sv_arenaroot     pointer to list of SV arenas
93     PL_sv_root          pointer to list of free SV structures
94
95     PL_body_arenas      head of linked-list of body arenas
96     PL_body_roots[]     array of pointers to list of free bodies of svtype
97                         arrays are indexed by the svtype needed
98
99 A few special SV heads are not allocated from an arena, but are
100 instead directly created in the interpreter structure, eg PL_sv_undef.
101 The size of arenas can be changed from the default by setting
102 PERL_ARENA_SIZE appropriately at compile time.
103
104 The SV arena serves the secondary purpose of allowing still-live SVs
105 to be located and destroyed during final cleanup.
106
107 At the lowest level, the macros new_SV() and del_SV() grab and free
108 an SV head.  (If debugging with -DD, del_SV() calls the function S_del_sv()
109 to return the SV to the free list with error checking.) new_SV() calls
110 more_sv() / sv_add_arena() to add an extra arena if the free list is empty.
111 SVs in the free list have their SvTYPE field set to all ones.
112
113 At the time of very final cleanup, sv_free_arenas() is called from
114 perl_destruct() to physically free all the arenas allocated since the
115 start of the interpreter.
116
117 The function visit() scans the SV arenas list, and calls a specified
118 function for each SV it finds which is still live - ie which has an SvTYPE
119 other than all 1's, and a non-zero SvREFCNT. visit() is used by the
120 following functions (specified as [function that calls visit()] / [function
121 called by visit() for each SV]):
122
123     sv_report_used() / do_report_used()
124                         dump all remaining SVs (debugging aid)
125
126     sv_clean_objs() / do_clean_objs(),do_clean_named_objs()
127                         Attempt to free all objects pointed to by RVs,
128                         and, unless DISABLE_DESTRUCTOR_KLUDGE is defined,
129                         try to do the same for all objects indirectly
130                         referenced by typeglobs too.  Called once from
131                         perl_destruct(), prior to calling sv_clean_all()
132                         below.
133
134     sv_clean_all() / do_clean_all()
135                         SvREFCNT_dec(sv) each remaining SV, possibly
136                         triggering an sv_free(). It also sets the
137                         SVf_BREAK flag on the SV to indicate that the
138                         refcnt has been artificially lowered, and thus
139                         stopping sv_free() from giving spurious warnings
140                         about SVs which unexpectedly have a refcnt
141                         of zero.  called repeatedly from perl_destruct()
142                         until there are no SVs left.
143
144 =head2 Arena allocator API Summary
145
146 Private API to rest of sv.c
147
148     new_SV(),  del_SV(),
149
150     new_XPVNV(), del_XPVGV(),
151     etc
152
153 Public API:
154
155     sv_report_used(), sv_clean_objs(), sv_clean_all(), sv_free_arenas()
156
157 =cut
158
159  * ========================================================================= */
160
161 /*
162  * "A time to plant, and a time to uproot what was planted..."
163  */
164
165 void
166 Perl_offer_nice_chunk(pTHX_ void *const chunk, const U32 chunk_size)
167 {
168     dVAR;
169     void *new_chunk;
170     U32 new_chunk_size;
171
172     PERL_ARGS_ASSERT_OFFER_NICE_CHUNK;
173
174     new_chunk = (void *)(chunk);
175     new_chunk_size = (chunk_size);
176     if (new_chunk_size > PL_nice_chunk_size) {
177         Safefree(PL_nice_chunk);
178         PL_nice_chunk = (char *) new_chunk;
179         PL_nice_chunk_size = new_chunk_size;
180     } else {
181         Safefree(chunk);
182     }
183 }
184
185 #ifdef PERL_MEM_LOG
186 #  define MEM_LOG_NEW_SV(sv, file, line, func)  \
187             Perl_mem_log_new_sv(sv, file, line, func)
188 #  define MEM_LOG_DEL_SV(sv, file, line, func)  \
189             Perl_mem_log_del_sv(sv, file, line, func)
190 #else
191 #  define MEM_LOG_NEW_SV(sv, file, line, func)  NOOP
192 #  define MEM_LOG_DEL_SV(sv, file, line, func)  NOOP
193 #endif
194
195 #ifdef DEBUG_LEAKING_SCALARS
196 #  define FREE_SV_DEBUG_FILE(sv) Safefree((sv)->sv_debug_file)
197 #  define DEBUG_SV_SERIAL(sv)                                               \
198     DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) del_SV\n",    \
199             PTR2UV(sv), (long)(sv)->sv_debug_serial))
200 #else
201 #  define FREE_SV_DEBUG_FILE(sv)
202 #  define DEBUG_SV_SERIAL(sv)   NOOP
203 #endif
204
205 #ifdef PERL_POISON
206 #  define SvARENA_CHAIN(sv)     ((sv)->sv_u.svu_rv)
207 #  define SvARENA_CHAIN_SET(sv,val)     (sv)->sv_u.svu_rv = MUTABLE_SV((val))
208 /* Whilst I'd love to do this, it seems that things like to check on
209    unreferenced scalars
210 #  define POSION_SV_HEAD(sv)    PoisonNew(sv, 1, struct STRUCT_SV)
211 */
212 #  define POSION_SV_HEAD(sv)    PoisonNew(&SvANY(sv), 1, void *), \
213                                 PoisonNew(&SvREFCNT(sv), 1, U32)
214 #else
215 #  define SvARENA_CHAIN(sv)     SvANY(sv)
216 #  define SvARENA_CHAIN_SET(sv,val)     SvANY(sv) = (void *)(val)
217 #  define POSION_SV_HEAD(sv)
218 #endif
219
220 /* Mark an SV head as unused, and add to free list.
221  *
222  * If SVf_BREAK is set, skip adding it to the free list, as this SV had
223  * its refcount artificially decremented during global destruction, so
224  * there may be dangling pointers to it. The last thing we want in that
225  * case is for it to be reused. */
226
227 #define plant_SV(p) \
228     STMT_START {                                        \
229         const U32 old_flags = SvFLAGS(p);                       \
230         MEM_LOG_DEL_SV(p, __FILE__, __LINE__, FUNCTION__);  \
231         DEBUG_SV_SERIAL(p);                             \
232         FREE_SV_DEBUG_FILE(p);                          \
233         POSION_SV_HEAD(p);                              \
234         SvFLAGS(p) = SVTYPEMASK;                        \
235         if (!(old_flags & SVf_BREAK)) {         \
236             SvARENA_CHAIN_SET(p, PL_sv_root);   \
237             PL_sv_root = (p);                           \
238         }                                               \
239         --PL_sv_count;                                  \
240     } STMT_END
241
242 #define uproot_SV(p) \
243     STMT_START {                                        \
244         (p) = PL_sv_root;                               \
245         PL_sv_root = MUTABLE_SV(SvARENA_CHAIN(p));              \
246         ++PL_sv_count;                                  \
247     } STMT_END
248
249
250 /* make some more SVs by adding another arena */
251
252 STATIC SV*
253 S_more_sv(pTHX)
254 {
255     dVAR;
256     SV* sv;
257
258     if (PL_nice_chunk) {
259         sv_add_arena(PL_nice_chunk, PL_nice_chunk_size, 0);
260         PL_nice_chunk = NULL;
261         PL_nice_chunk_size = 0;
262     }
263     else {
264         char *chunk;                /* must use New here to match call to */
265         Newx(chunk,PERL_ARENA_SIZE,char);  /* Safefree() in sv_free_arenas() */
266         sv_add_arena(chunk, PERL_ARENA_SIZE, 0);
267     }
268     uproot_SV(sv);
269     return sv;
270 }
271
272 /* new_SV(): return a new, empty SV head */
273
274 #ifdef DEBUG_LEAKING_SCALARS
275 /* provide a real function for a debugger to play with */
276 STATIC SV*
277 S_new_SV(pTHX_ const char *file, int line, const char *func)
278 {
279     SV* sv;
280
281     if (PL_sv_root)
282         uproot_SV(sv);
283     else
284         sv = S_more_sv(aTHX);
285     SvANY(sv) = 0;
286     SvREFCNT(sv) = 1;
287     SvFLAGS(sv) = 0;
288     sv->sv_debug_optype = PL_op ? PL_op->op_type : 0;
289     sv->sv_debug_line = (U16) (PL_parser && PL_parser->copline != NOLINE
290                 ? PL_parser->copline
291                 :  PL_curcop
292                     ? CopLINE(PL_curcop)
293                     : 0
294             );
295     sv->sv_debug_inpad = 0;
296     sv->sv_debug_parent = NULL;
297     sv->sv_debug_file = PL_curcop ? savepv(CopFILE(PL_curcop)): NULL;
298
299     sv->sv_debug_serial = PL_sv_serial++;
300
301     MEM_LOG_NEW_SV(sv, file, line, func);
302     DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) new_SV (from %s:%d [%s])\n",
303             PTR2UV(sv), (long)sv->sv_debug_serial, file, line, func));
304
305     return sv;
306 }
307 #  define new_SV(p) (p)=S_new_SV(aTHX_ __FILE__, __LINE__, FUNCTION__)
308
309 #else
310 #  define new_SV(p) \
311     STMT_START {                                        \
312         if (PL_sv_root)                                 \
313             uproot_SV(p);                               \
314         else                                            \
315             (p) = S_more_sv(aTHX);                      \
316         SvANY(p) = 0;                                   \
317         SvREFCNT(p) = 1;                                \
318         SvFLAGS(p) = 0;                                 \
319         MEM_LOG_NEW_SV(p, __FILE__, __LINE__, FUNCTION__);  \
320     } STMT_END
321 #endif
322
323
324 /* del_SV(): return an empty SV head to the free list */
325
326 #ifdef DEBUGGING
327
328 #define del_SV(p) \
329     STMT_START {                                        \
330         if (DEBUG_D_TEST)                               \
331             del_sv(p);                                  \
332         else                                            \
333             plant_SV(p);                                \
334     } STMT_END
335
336 STATIC void
337 S_del_sv(pTHX_ SV *p)
338 {
339     dVAR;
340
341     PERL_ARGS_ASSERT_DEL_SV;
342
343     if (DEBUG_D_TEST) {
344         SV* sva;
345         bool ok = 0;
346         for (sva = PL_sv_arenaroot; sva; sva = MUTABLE_SV(SvANY(sva))) {
347             const SV * const sv = sva + 1;
348             const SV * const svend = &sva[SvREFCNT(sva)];
349             if (p >= sv && p < svend) {
350                 ok = 1;
351                 break;
352             }
353         }
354         if (!ok) {
355             Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),
356                              "Attempt to free non-arena SV: 0x%"UVxf
357                              pTHX__FORMAT, PTR2UV(p) pTHX__VALUE);
358             return;
359         }
360     }
361     plant_SV(p);
362 }
363
364 #else /* ! DEBUGGING */
365
366 #define del_SV(p)   plant_SV(p)
367
368 #endif /* DEBUGGING */
369
370
371 /*
372 =head1 SV Manipulation Functions
373
374 =for apidoc sv_add_arena
375
376 Given a chunk of memory, link it to the head of the list of arenas,
377 and split it into a list of free SVs.
378
379 =cut
380 */
381
382 static void
383 S_sv_add_arena(pTHX_ char *const ptr, const U32 size, const U32 flags)
384 {
385     dVAR;
386     SV *const sva = MUTABLE_SV(ptr);
387     register SV* sv;
388     register SV* svend;
389
390     PERL_ARGS_ASSERT_SV_ADD_ARENA;
391
392     /* The first SV in an arena isn't an SV. */
393     SvANY(sva) = (void *) PL_sv_arenaroot;              /* ptr to next arena */
394     SvREFCNT(sva) = size / sizeof(SV);          /* number of SV slots */
395     SvFLAGS(sva) = flags;                       /* FAKE if not to be freed */
396
397     PL_sv_arenaroot = sva;
398     PL_sv_root = sva + 1;
399
400     svend = &sva[SvREFCNT(sva) - 1];
401     sv = sva + 1;
402     while (sv < svend) {
403         SvARENA_CHAIN_SET(sv, (sv + 1));
404 #ifdef DEBUGGING
405         SvREFCNT(sv) = 0;
406 #endif
407         /* Must always set typemask because it's always checked in on cleanup
408            when the arenas are walked looking for objects.  */
409         SvFLAGS(sv) = SVTYPEMASK;
410         sv++;
411     }
412     SvARENA_CHAIN_SET(sv, 0);
413 #ifdef DEBUGGING
414     SvREFCNT(sv) = 0;
415 #endif
416     SvFLAGS(sv) = SVTYPEMASK;
417 }
418
419 /* visit(): call the named function for each non-free SV in the arenas
420  * whose flags field matches the flags/mask args. */
421
422 STATIC I32
423 S_visit(pTHX_ SVFUNC_t f, const U32 flags, const U32 mask)
424 {
425     dVAR;
426     SV* sva;
427     I32 visited = 0;
428
429     PERL_ARGS_ASSERT_VISIT;
430
431     for (sva = PL_sv_arenaroot; sva; sva = MUTABLE_SV(SvANY(sva))) {
432         register const SV * const svend = &sva[SvREFCNT(sva)];
433         register SV* sv;
434         for (sv = sva + 1; sv < svend; ++sv) {
435             if (SvTYPE(sv) != SVTYPEMASK
436                     && (sv->sv_flags & mask) == flags
437                     && SvREFCNT(sv))
438             {
439                 (FCALL)(aTHX_ sv);
440                 ++visited;
441             }
442         }
443     }
444     return visited;
445 }
446
447 #ifdef DEBUGGING
448
449 /* called by sv_report_used() for each live SV */
450
451 static void
452 do_report_used(pTHX_ SV *const sv)
453 {
454     if (SvTYPE(sv) != SVTYPEMASK) {
455         PerlIO_printf(Perl_debug_log, "****\n");
456         sv_dump(sv);
457     }
458 }
459 #endif
460
461 /*
462 =for apidoc sv_report_used
463
464 Dump the contents of all SVs not yet freed. (Debugging aid).
465
466 =cut
467 */
468
469 void
470 Perl_sv_report_used(pTHX)
471 {
472 #ifdef DEBUGGING
473     visit(do_report_used, 0, 0);
474 #else
475     PERL_UNUSED_CONTEXT;
476 #endif
477 }
478
479 /* called by sv_clean_objs() for each live SV */
480
481 static void
482 do_clean_objs(pTHX_ SV *const ref)
483 {
484     dVAR;
485     assert (SvROK(ref));
486     {
487         SV * const target = SvRV(ref);
488         if (SvOBJECT(target)) {
489             DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(ref)));
490             if (SvWEAKREF(ref)) {
491                 sv_del_backref(target, ref);
492                 SvWEAKREF_off(ref);
493                 SvRV_set(ref, NULL);
494             } else {
495                 SvROK_off(ref);
496                 SvRV_set(ref, NULL);
497                 SvREFCNT_dec(target);
498             }
499         }
500     }
501
502     /* XXX Might want to check arrays, etc. */
503 }
504
505 /* called by sv_clean_objs() for each live SV */
506
507 #ifndef DISABLE_DESTRUCTOR_KLUDGE
508 static void
509 do_clean_named_objs(pTHX_ SV *const sv)
510 {
511     dVAR;
512     assert(SvTYPE(sv) == SVt_PVGV);
513     assert(isGV_with_GP(sv));
514     if (GvGP(sv)) {
515         if ((
516 #ifdef PERL_DONT_CREATE_GVSV
517              GvSV(sv) &&
518 #endif
519              SvOBJECT(GvSV(sv))) ||
520              (GvAV(sv) && SvOBJECT(GvAV(sv))) ||
521              (GvHV(sv) && SvOBJECT(GvHV(sv))) ||
522              /* In certain rare cases GvIOp(sv) can be NULL, which would make SvOBJECT(GvIO(sv)) dereference NULL. */
523              (GvIO(sv) ? (SvFLAGS(GvIOp(sv)) & SVs_OBJECT) : 0) ||
524              (GvCV(sv) && SvOBJECT(GvCV(sv))) )
525         {
526             DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning named glob object:\n "), sv_dump(sv)));
527             SvFLAGS(sv) |= SVf_BREAK;
528             SvREFCNT_dec(sv);
529         }
530     }
531 }
532 #endif
533
534 /*
535 =for apidoc sv_clean_objs
536
537 Attempt to destroy all objects not yet freed
538
539 =cut
540 */
541
542 void
543 Perl_sv_clean_objs(pTHX)
544 {
545     dVAR;
546     PL_in_clean_objs = TRUE;
547     visit(do_clean_objs, SVf_ROK, SVf_ROK);
548 #ifndef DISABLE_DESTRUCTOR_KLUDGE
549     /* some barnacles may yet remain, clinging to typeglobs */
550     visit(do_clean_named_objs, SVt_PVGV|SVpgv_GP, SVTYPEMASK|SVp_POK|SVpgv_GP);
551 #endif
552     PL_in_clean_objs = FALSE;
553 }
554
555 /* called by sv_clean_all() for each live SV */
556
557 static void
558 do_clean_all(pTHX_ SV *const sv)
559 {
560     dVAR;
561     if (sv == (const SV *) PL_fdpid || sv == (const SV *)PL_strtab) {
562         /* don't clean pid table and strtab */
563         return;
564     }
565     DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%"UVxf"\n", PTR2UV(sv)) ));
566     SvFLAGS(sv) |= SVf_BREAK;
567     SvREFCNT_dec(sv);
568 }
569
570 /*
571 =for apidoc sv_clean_all
572
573 Decrement the refcnt of each remaining SV, possibly triggering a
574 cleanup. This function may have to be called multiple times to free
575 SVs which are in complex self-referential hierarchies.
576
577 =cut
578 */
579
580 I32
581 Perl_sv_clean_all(pTHX)
582 {
583     dVAR;
584     I32 cleaned;
585     PL_in_clean_all = TRUE;
586     cleaned = visit(do_clean_all, 0,0);
587     PL_in_clean_all = FALSE;
588     return cleaned;
589 }
590
591 /*
592   ARENASETS: a meta-arena implementation which separates arena-info
593   into struct arena_set, which contains an array of struct
594   arena_descs, each holding info for a single arena.  By separating
595   the meta-info from the arena, we recover the 1st slot, formerly
596   borrowed for list management.  The arena_set is about the size of an
597   arena, avoiding the needless malloc overhead of a naive linked-list.
598
599   The cost is 1 arena-set malloc per ~320 arena-mallocs, + the unused
600   memory in the last arena-set (1/2 on average).  In trade, we get
601   back the 1st slot in each arena (ie 1.7% of a CV-arena, less for
602   smaller types).  The recovery of the wasted space allows use of
603   small arenas for large, rare body types, by changing array* fields
604   in body_details_by_type[] below.
605 */
606 struct arena_desc {
607     char       *arena;          /* the raw storage, allocated aligned */
608     size_t      size;           /* its size ~4k typ */
609     svtype      utype;          /* bodytype stored in arena */
610 };
611
612 struct arena_set;
613
614 /* Get the maximum number of elements in set[] such that struct arena_set
615    will fit within PERL_ARENA_SIZE, which is probably just under 4K, and
616    therefore likely to be 1 aligned memory page.  */
617
618 #define ARENAS_PER_SET  ((PERL_ARENA_SIZE - sizeof(struct arena_set*) \
619                           - 2 * sizeof(int)) / sizeof (struct arena_desc))
620
621 struct arena_set {
622     struct arena_set* next;
623     unsigned int   set_size;    /* ie ARENAS_PER_SET */
624     unsigned int   curr;        /* index of next available arena-desc */
625     struct arena_desc set[ARENAS_PER_SET];
626 };
627
628 /*
629 =for apidoc sv_free_arenas
630
631 Deallocate the memory used by all arenas. Note that all the individual SV
632 heads and bodies within the arenas must already have been freed.
633
634 =cut
635 */
636 void
637 Perl_sv_free_arenas(pTHX)
638 {
639     dVAR;
640     SV* sva;
641     SV* svanext;
642     unsigned int i;
643
644     /* Free arenas here, but be careful about fake ones.  (We assume
645        contiguity of the fake ones with the corresponding real ones.) */
646
647     for (sva = PL_sv_arenaroot; sva; sva = svanext) {
648         svanext = MUTABLE_SV(SvANY(sva));
649         while (svanext && SvFAKE(svanext))
650             svanext = MUTABLE_SV(SvANY(svanext));
651
652         if (!SvFAKE(sva))
653             Safefree(sva);
654     }
655
656     {
657         struct arena_set *aroot = (struct arena_set*) PL_body_arenas;
658
659         while (aroot) {
660             struct arena_set *current = aroot;
661             i = aroot->curr;
662             while (i--) {
663                 assert(aroot->set[i].arena);
664                 Safefree(aroot->set[i].arena);
665             }
666             aroot = aroot->next;
667             Safefree(current);
668         }
669     }
670     PL_body_arenas = 0;
671
672     i = PERL_ARENA_ROOTS_SIZE;
673     while (i--)
674         PL_body_roots[i] = 0;
675
676     Safefree(PL_nice_chunk);
677     PL_nice_chunk = NULL;
678     PL_nice_chunk_size = 0;
679     PL_sv_arenaroot = 0;
680     PL_sv_root = 0;
681 }
682
683 /*
684   Here are mid-level routines that manage the allocation of bodies out
685   of the various arenas.  There are 5 kinds of arenas:
686
687   1. SV-head arenas, which are discussed and handled above
688   2. regular body arenas
689   3. arenas for reduced-size bodies
690   4. Hash-Entry arenas
691
692   Arena types 2 & 3 are chained by body-type off an array of
693   arena-root pointers, which is indexed by svtype.  Some of the
694   larger/less used body types are malloced singly, since a large
695   unused block of them is wasteful.  Also, several svtypes dont have
696   bodies; the data fits into the sv-head itself.  The arena-root
697   pointer thus has a few unused root-pointers (which may be hijacked
698   later for arena types 4,5)
699
700   3 differs from 2 as an optimization; some body types have several
701   unused fields in the front of the structure (which are kept in-place
702   for consistency).  These bodies can be allocated in smaller chunks,
703   because the leading fields arent accessed.  Pointers to such bodies
704   are decremented to point at the unused 'ghost' memory, knowing that
705   the pointers are used with offsets to the real memory.
706
707   HE, HEK arenas are managed separately, with separate code, but may
708   be merge-able later..
709 */
710
711 /* get_arena(size): this creates custom-sized arenas
712    TBD: export properly for hv.c: S_more_he().
713 */
714 void*
715 Perl_get_arena(pTHX_ const size_t arena_size, const svtype bodytype)
716 {
717     dVAR;
718     struct arena_desc* adesc;
719     struct arena_set *aroot = (struct arena_set*) PL_body_arenas;
720     unsigned int curr;
721
722     /* shouldnt need this
723     if (!arena_size)    arena_size = PERL_ARENA_SIZE;
724     */
725
726     /* may need new arena-set to hold new arena */
727     if (!aroot || aroot->curr >= aroot->set_size) {
728         struct arena_set *newroot;
729         Newxz(newroot, 1, struct arena_set);
730         newroot->set_size = ARENAS_PER_SET;
731         newroot->next = aroot;
732         aroot = newroot;
733         PL_body_arenas = (void *) newroot;
734         DEBUG_m(PerlIO_printf(Perl_debug_log, "new arenaset %p\n", (void*)aroot));
735     }
736
737     /* ok, now have arena-set with at least 1 empty/available arena-desc */
738     curr = aroot->curr++;
739     adesc = &(aroot->set[curr]);
740     assert(!adesc->arena);
741     
742     Newx(adesc->arena, arena_size, char);
743     adesc->size = arena_size;
744     adesc->utype = bodytype;
745     DEBUG_m(PerlIO_printf(Perl_debug_log, "arena %d added: %p size %"UVuf"\n", 
746                           curr, (void*)adesc->arena, (UV)arena_size));
747
748     return adesc->arena;
749 }
750
751
752 /* return a thing to the free list */
753
754 #define del_body(thing, root)                   \
755     STMT_START {                                \
756         void ** const thing_copy = (void **)thing;\
757         *thing_copy = *root;                    \
758         *root = (void*)thing_copy;              \
759     } STMT_END
760
761 /* 
762
763 =head1 SV-Body Allocation
764
765 Allocation of SV-bodies is similar to SV-heads, differing as follows;
766 the allocation mechanism is used for many body types, so is somewhat
767 more complicated, it uses arena-sets, and has no need for still-live
768 SV detection.
769
770 At the outermost level, (new|del)_X*V macros return bodies of the
771 appropriate type.  These macros call either (new|del)_body_type or
772 (new|del)_body_allocated macro pairs, depending on specifics of the
773 type.  Most body types use the former pair, the latter pair is used to
774 allocate body types with "ghost fields".
775
776 "ghost fields" are fields that are unused in certain types, and
777 consequently don't need to actually exist.  They are declared because
778 they're part of a "base type", which allows use of functions as
779 methods.  The simplest examples are AVs and HVs, 2 aggregate types
780 which don't use the fields which support SCALAR semantics.
781
782 For these types, the arenas are carved up into appropriately sized
783 chunks, we thus avoid wasted memory for those unaccessed members.
784 When bodies are allocated, we adjust the pointer back in memory by the
785 size of the part not allocated, so it's as if we allocated the full
786 structure.  (But things will all go boom if you write to the part that
787 is "not there", because you'll be overwriting the last members of the
788 preceding structure in memory.)
789
790 We calculate the correction using the STRUCT_OFFSET macro on the first
791 member present. If the allocated structure is smaller (no initial NV
792 actually allocated) then the net effect is to subtract the size of the NV
793 from the pointer, to return a new pointer as if an initial NV were actually
794 allocated. (We were using structures named *_allocated for this, but
795 this turned out to be a subtle bug, because a structure without an NV
796 could have a lower alignment constraint, but the compiler is allowed to
797 optimised accesses based on the alignment constraint of the actual pointer
798 to the full structure, for example, using a single 64 bit load instruction
799 because it "knows" that two adjacent 32 bit members will be 8-byte aligned.)
800
801 This is the same trick as was used for NV and IV bodies. Ironically it
802 doesn't need to be used for NV bodies any more, because NV is now at
803 the start of the structure. IV bodies don't need it either, because
804 they are no longer allocated.
805
806 In turn, the new_body_* allocators call S_new_body(), which invokes
807 new_body_inline macro, which takes a lock, and takes a body off the
808 linked list at PL_body_roots[sv_type], calling S_more_bodies() if
809 necessary to refresh an empty list.  Then the lock is released, and
810 the body is returned.
811
812 S_more_bodies calls get_arena(), and carves it up into an array of N
813 bodies, which it strings into a linked list.  It looks up arena-size
814 and body-size from the body_details table described below, thus
815 supporting the multiple body-types.
816
817 If PURIFY is defined, or PERL_ARENA_SIZE=0, arenas are not used, and
818 the (new|del)_X*V macros are mapped directly to malloc/free.
819
820 */
821
822 /* 
823
824 For each sv-type, struct body_details bodies_by_type[] carries
825 parameters which control these aspects of SV handling:
826
827 Arena_size determines whether arenas are used for this body type, and if
828 so, how big they are.  PURIFY or PERL_ARENA_SIZE=0 set this field to
829 zero, forcing individual mallocs and frees.
830
831 Body_size determines how big a body is, and therefore how many fit into
832 each arena.  Offset carries the body-pointer adjustment needed for
833 "ghost fields", and is used in *_allocated macros.
834
835 But its main purpose is to parameterize info needed in
836 Perl_sv_upgrade().  The info here dramatically simplifies the function
837 vs the implementation in 5.8.8, making it table-driven.  All fields
838 are used for this, except for arena_size.
839
840 For the sv-types that have no bodies, arenas are not used, so those
841 PL_body_roots[sv_type] are unused, and can be overloaded.  In
842 something of a special case, SVt_NULL is borrowed for HE arenas;
843 PL_body_roots[HE_SVSLOT=SVt_NULL] is filled by S_more_he, but the
844 bodies_by_type[SVt_NULL] slot is not used, as the table is not
845 available in hv.c.
846
847 */
848
849 struct body_details {
850     U8 body_size;       /* Size to allocate  */
851     U8 copy;            /* Size of structure to copy (may be shorter)  */
852     U8 offset;
853     unsigned int type : 4;          /* We have space for a sanity check.  */
854     unsigned int cant_upgrade : 1;  /* Cannot upgrade this type */
855     unsigned int zero_nv : 1;       /* zero the NV when upgrading from this */
856     unsigned int arena : 1;         /* Allocated from an arena */
857     size_t arena_size;              /* Size of arena to allocate */
858 };
859
860 #define HADNV FALSE
861 #define NONV TRUE
862
863
864 #ifdef PURIFY
865 /* With -DPURFIY we allocate everything directly, and don't use arenas.
866    This seems a rather elegant way to simplify some of the code below.  */
867 #define HASARENA FALSE
868 #else
869 #define HASARENA TRUE
870 #endif
871 #define NOARENA FALSE
872
873 /* Size the arenas to exactly fit a given number of bodies.  A count
874    of 0 fits the max number bodies into a PERL_ARENA_SIZE.block,
875    simplifying the default.  If count > 0, the arena is sized to fit
876    only that many bodies, allowing arenas to be used for large, rare
877    bodies (XPVFM, XPVIO) without undue waste.  The arena size is
878    limited by PERL_ARENA_SIZE, so we can safely oversize the
879    declarations.
880  */
881 #define FIT_ARENA0(body_size)                           \
882     ((size_t)(PERL_ARENA_SIZE / body_size) * body_size)
883 #define FIT_ARENAn(count,body_size)                     \
884     ( count * body_size <= PERL_ARENA_SIZE)             \
885     ? count * body_size                                 \
886     : FIT_ARENA0 (body_size)
887 #define FIT_ARENA(count,body_size)                      \
888     count                                               \
889     ? FIT_ARENAn (count, body_size)                     \
890     : FIT_ARENA0 (body_size)
891
892 /* Calculate the length to copy. Specifically work out the length less any
893    final padding the compiler needed to add.  See the comment in sv_upgrade
894    for why copying the padding proved to be a bug.  */
895
896 #define copy_length(type, last_member) \
897         STRUCT_OFFSET(type, last_member) \
898         + sizeof (((type*)SvANY((const SV *)0))->last_member)
899
900 static const struct body_details bodies_by_type[] = {
901     { sizeof(HE), 0, 0, SVt_NULL,
902       FALSE, NONV, NOARENA, FIT_ARENA(0, sizeof(HE)) },
903
904     /* The bind placeholder pretends to be an RV for now.
905        Also it's marked as "can't upgrade" to stop anyone using it before it's
906        implemented.  */
907     { 0, 0, 0, SVt_BIND, TRUE, NONV, NOARENA, 0 },
908
909     /* IVs are in the head, so the allocation size is 0.  */
910     { 0,
911       sizeof(IV), /* This is used to copy out the IV body.  */
912       STRUCT_OFFSET(XPVIV, xiv_iv), SVt_IV, FALSE, NONV,
913       NOARENA /* IVS don't need an arena  */, 0
914     },
915
916     /* 8 bytes on most ILP32 with IEEE doubles */
917     { sizeof(NV), sizeof(NV),
918       STRUCT_OFFSET(XPVNV, xnv_u),
919       SVt_NV, FALSE, HADNV, HASARENA, FIT_ARENA(0, sizeof(NV)) },
920
921     /* 8 bytes on most ILP32 with IEEE doubles */
922     { sizeof(XPV) - STRUCT_OFFSET(XPV, xpv_cur),
923       copy_length(XPV, xpv_len) - STRUCT_OFFSET(XPV, xpv_cur),
924       + STRUCT_OFFSET(XPV, xpv_cur),
925       SVt_PV, FALSE, NONV, HASARENA,
926       FIT_ARENA(0, sizeof(XPV) - STRUCT_OFFSET(XPV, xpv_cur)) },
927
928     /* 12 */
929     { sizeof(XPVIV) - STRUCT_OFFSET(XPV, xpv_cur),
930       copy_length(XPVIV, xiv_u) - STRUCT_OFFSET(XPV, xpv_cur),
931       + STRUCT_OFFSET(XPV, xpv_cur),
932       SVt_PVIV, FALSE, NONV, HASARENA,
933       FIT_ARENA(0, sizeof(XPVIV) - STRUCT_OFFSET(XPV, xpv_cur)) },
934
935     /* 20 */
936     { sizeof(XPVNV) - STRUCT_OFFSET(XPV, xpv_cur),
937       copy_length(XPVNV, xnv_u) - STRUCT_OFFSET(XPV, xpv_cur),
938       + STRUCT_OFFSET(XPV, xpv_cur),
939       SVt_PVNV, FALSE, HADNV, HASARENA,
940       FIT_ARENA(0, sizeof(XPVNV) - STRUCT_OFFSET(XPV, xpv_cur)) },
941
942     /* 28 */
943     { sizeof(XPVMG), copy_length(XPVMG, xnv_u), 0, SVt_PVMG, FALSE, HADNV,
944       HASARENA, FIT_ARENA(0, sizeof(XPVMG)) },
945
946     /* something big */
947     { sizeof(regexp),
948       sizeof(regexp),
949       0,
950       SVt_REGEXP, FALSE, NONV, HASARENA,
951       FIT_ARENA(0, sizeof(regexp) - STRUCT_OFFSET(regexp, xpv_cur))
952     },
953
954     /* 48 */
955     { sizeof(XPVGV), sizeof(XPVGV), 0, SVt_PVGV, TRUE, HADNV,
956       HASARENA, FIT_ARENA(0, sizeof(XPVGV)) },
957     
958     /* 64 */
959     { sizeof(XPVLV), sizeof(XPVLV), 0, SVt_PVLV, TRUE, HADNV,
960       HASARENA, FIT_ARENA(0, sizeof(XPVLV)) },
961
962     { sizeof(XPVAV),
963       copy_length(XPVAV, xav_alloc),
964       0,
965       SVt_PVAV, TRUE, NONV, HASARENA,
966       FIT_ARENA(0, sizeof(XPVAV)) },
967
968     { sizeof(XPVHV),
969       copy_length(XPVHV, xhv_max),
970       0,
971       SVt_PVHV, TRUE, NONV, HASARENA,
972       FIT_ARENA(0, sizeof(XPVHV)) },
973
974     /* 56 */
975     { sizeof(XPVCV),
976       sizeof(XPVCV),
977       0,
978       SVt_PVCV, TRUE, NONV, HASARENA,
979       FIT_ARENA(0, sizeof(XPVCV)) },
980
981     { sizeof(XPVFM),
982       sizeof(XPVFM),
983       0,
984       SVt_PVFM, TRUE, NONV, NOARENA,
985       FIT_ARENA(20, sizeof(XPVFM)) },
986
987     /* XPVIO is 84 bytes, fits 48x */
988     { sizeof(XPVIO),
989       sizeof(XPVIO),
990       0,
991       SVt_PVIO, TRUE, NONV, HASARENA,
992       FIT_ARENA(24, sizeof(XPVIO)) },
993 };
994
995 #define new_body_allocated(sv_type)             \
996     (void *)((char *)S_new_body(aTHX_ sv_type)  \
997              - bodies_by_type[sv_type].offset)
998
999 #define del_body_allocated(p, sv_type)          \
1000     del_body(p + bodies_by_type[sv_type].offset, &PL_body_roots[sv_type])
1001
1002 #ifdef PURIFY
1003
1004 #define new_XNV()       safemalloc(sizeof(XPVNV))
1005 #define new_XPVNV()     safemalloc(sizeof(XPVNV))
1006 #define new_XPVMG()     safemalloc(sizeof(XPVMG))
1007
1008 #define del_XPVGV(p)    safefree(p)
1009
1010 #else /* !PURIFY */
1011
1012 #define new_XNV()       new_body_allocated(SVt_NV)
1013 #define new_XPVNV()     new_body_allocated(SVt_PVNV)
1014 #define new_XPVMG()     new_body_allocated(SVt_PVMG)
1015
1016 #define del_XPVGV(p)    del_body_allocated(p, SVt_PVGV)
1017
1018 #endif /* PURIFY */
1019
1020 /* no arena for you! */
1021
1022 #define new_NOARENA(details) \
1023         safemalloc((details)->body_size + (details)->offset)
1024 #define new_NOARENAZ(details) \
1025         safecalloc((details)->body_size + (details)->offset, 1)
1026
1027 STATIC void *
1028 S_more_bodies (pTHX_ const svtype sv_type)
1029 {
1030     dVAR;
1031     void ** const root = &PL_body_roots[sv_type];
1032     const struct body_details * const bdp = &bodies_by_type[sv_type];
1033     const size_t body_size = bdp->body_size;
1034     char *start;
1035     const char *end;
1036     const size_t arena_size = Perl_malloc_good_size(bdp->arena_size);
1037 #if defined(DEBUGGING) && !defined(PERL_GLOBAL_STRUCT_PRIVATE)
1038     static bool done_sanity_check;
1039
1040     /* PERL_GLOBAL_STRUCT_PRIVATE cannot coexist with global
1041      * variables like done_sanity_check. */
1042     if (!done_sanity_check) {
1043         unsigned int i = SVt_LAST;
1044
1045         done_sanity_check = TRUE;
1046
1047         while (i--)
1048             assert (bodies_by_type[i].type == i);
1049     }
1050 #endif
1051
1052     assert(bdp->arena_size);
1053
1054     start = (char*) Perl_get_arena(aTHX_ arena_size, sv_type);
1055
1056     end = start + arena_size - 2 * body_size;
1057
1058     /* computed count doesnt reflect the 1st slot reservation */
1059 #if defined(MYMALLOC) || defined(HAS_MALLOC_GOOD_SIZE)
1060     DEBUG_m(PerlIO_printf(Perl_debug_log,
1061                           "arena %p end %p arena-size %d (from %d) type %d "
1062                           "size %d ct %d\n",
1063                           (void*)start, (void*)end, (int)arena_size,
1064                           (int)bdp->arena_size, sv_type, (int)body_size,
1065                           (int)arena_size / (int)body_size));
1066 #else
1067     DEBUG_m(PerlIO_printf(Perl_debug_log,
1068                           "arena %p end %p arena-size %d type %d size %d ct %d\n",
1069                           (void*)start, (void*)end,
1070                           (int)bdp->arena_size, sv_type, (int)body_size,
1071                           (int)bdp->arena_size / (int)body_size));
1072 #endif
1073     *root = (void *)start;
1074
1075     while (start <= end) {
1076         char * const next = start + body_size;
1077         *(void**) start = (void *)next;
1078         start = next;
1079     }
1080     *(void **)start = 0;
1081
1082     return *root;
1083 }
1084
1085 /* grab a new thing from the free list, allocating more if necessary.
1086    The inline version is used for speed in hot routines, and the
1087    function using it serves the rest (unless PURIFY).
1088 */
1089 #define new_body_inline(xpv, sv_type) \
1090     STMT_START { \
1091         void ** const r3wt = &PL_body_roots[sv_type]; \
1092         xpv = (PTR_TBL_ENT_t*) (*((void **)(r3wt))      \
1093           ? *((void **)(r3wt)) : more_bodies(sv_type)); \
1094         *(r3wt) = *(void**)(xpv); \
1095     } STMT_END
1096
1097 #ifndef PURIFY
1098
1099 STATIC void *
1100 S_new_body(pTHX_ const svtype sv_type)
1101 {
1102     dVAR;
1103     void *xpv;
1104     new_body_inline(xpv, sv_type);
1105     return xpv;
1106 }
1107
1108 #endif
1109
1110 static const struct body_details fake_rv =
1111     { 0, 0, 0, SVt_IV, FALSE, NONV, NOARENA, 0 };
1112
1113 /*
1114 =for apidoc sv_upgrade
1115
1116 Upgrade an SV to a more complex form.  Generally adds a new body type to the
1117 SV, then copies across as much information as possible from the old body.
1118 You generally want to use the C<SvUPGRADE> macro wrapper. See also C<svtype>.
1119
1120 =cut
1121 */
1122
1123 void
1124 Perl_sv_upgrade(pTHX_ register SV *const sv, svtype new_type)
1125 {
1126     dVAR;
1127     void*       old_body;
1128     void*       new_body;
1129     const svtype old_type = SvTYPE(sv);
1130     const struct body_details *new_type_details;
1131     const struct body_details *old_type_details
1132         = bodies_by_type + old_type;
1133     SV *referant = NULL;
1134
1135     PERL_ARGS_ASSERT_SV_UPGRADE;
1136
1137     if (old_type == new_type)
1138         return;
1139
1140     /* This clause was purposefully added ahead of the early return above to
1141        the shared string hackery for (sort {$a <=> $b} keys %hash), with the
1142        inference by Nick I-S that it would fix other troublesome cases. See
1143        changes 7162, 7163 (f130fd4589cf5fbb24149cd4db4137c8326f49c1 and parent)
1144
1145        Given that shared hash key scalars are no longer PVIV, but PV, there is
1146        no longer need to unshare so as to free up the IVX slot for its proper
1147        purpose. So it's safe to move the early return earlier.  */
1148
1149     if (new_type != SVt_PV && SvIsCOW(sv)) {
1150         sv_force_normal_flags(sv, 0);
1151     }
1152
1153     old_body = SvANY(sv);
1154
1155     /* Copying structures onto other structures that have been neatly zeroed
1156        has a subtle gotcha. Consider XPVMG
1157
1158        +------+------+------+------+------+-------+-------+
1159        |     NV      | CUR  | LEN  |  IV  | MAGIC | STASH |
1160        +------+------+------+------+------+-------+-------+
1161        0      4      8     12     16     20      24      28
1162
1163        where NVs are aligned to 8 bytes, so that sizeof that structure is
1164        actually 32 bytes long, with 4 bytes of padding at the end:
1165
1166        +------+------+------+------+------+-------+-------+------+
1167        |     NV      | CUR  | LEN  |  IV  | MAGIC | STASH | ???  |
1168        +------+------+------+------+------+-------+-------+------+
1169        0      4      8     12     16     20      24      28     32
1170
1171        so what happens if you allocate memory for this structure:
1172
1173        +------+------+------+------+------+-------+-------+------+------+...
1174        |     NV      | CUR  | LEN  |  IV  | MAGIC | STASH |  GP  | NAME |
1175        +------+------+------+------+------+-------+-------+------+------+...
1176        0      4      8     12     16     20      24      28     32     36
1177
1178        zero it, then copy sizeof(XPVMG) bytes on top of it? Not quite what you
1179        expect, because you copy the area marked ??? onto GP. Now, ??? may have
1180        started out as zero once, but it's quite possible that it isn't. So now,
1181        rather than a nicely zeroed GP, you have it pointing somewhere random.
1182        Bugs ensue.
1183
1184        (In fact, GP ends up pointing at a previous GP structure, because the
1185        principle cause of the padding in XPVMG getting garbage is a copy of
1186        sizeof(XPVMG) bytes from a XPVGV structure in sv_unglob. Right now
1187        this happens to be moot because XPVGV has been re-ordered, with GP
1188        no longer after STASH)
1189
1190        So we are careful and work out the size of used parts of all the
1191        structures.  */
1192
1193     switch (old_type) {
1194     case SVt_NULL:
1195         break;
1196     case SVt_IV:
1197         if (SvROK(sv)) {
1198             referant = SvRV(sv);
1199             old_type_details = &fake_rv;
1200             if (new_type == SVt_NV)
1201                 new_type = SVt_PVNV;
1202         } else {
1203             if (new_type < SVt_PVIV) {
1204                 new_type = (new_type == SVt_NV)
1205                     ? SVt_PVNV : SVt_PVIV;
1206             }
1207         }
1208         break;
1209     case SVt_NV:
1210         if (new_type < SVt_PVNV) {
1211             new_type = SVt_PVNV;
1212         }
1213         break;
1214     case SVt_PV:
1215         assert(new_type > SVt_PV);
1216         assert(SVt_IV < SVt_PV);
1217         assert(SVt_NV < SVt_PV);
1218         break;
1219     case SVt_PVIV:
1220         break;
1221     case SVt_PVNV:
1222         break;
1223     case SVt_PVMG:
1224         /* Because the XPVMG of PL_mess_sv isn't allocated from the arena,
1225            there's no way that it can be safely upgraded, because perl.c
1226            expects to Safefree(SvANY(PL_mess_sv))  */
1227         assert(sv != PL_mess_sv);
1228         /* This flag bit is used to mean other things in other scalar types.
1229            Given that it only has meaning inside the pad, it shouldn't be set
1230            on anything that can get upgraded.  */
1231         assert(!SvPAD_TYPED(sv));
1232         break;
1233     default:
1234         if (old_type_details->cant_upgrade)
1235             Perl_croak(aTHX_ "Can't upgrade %s (%" UVuf ") to %" UVuf,
1236                        sv_reftype(sv, 0), (UV) old_type, (UV) new_type);
1237     }
1238
1239     if (old_type > new_type)
1240         Perl_croak(aTHX_ "sv_upgrade from type %d down to type %d",
1241                 (int)old_type, (int)new_type);
1242
1243     new_type_details = bodies_by_type + new_type;
1244
1245     SvFLAGS(sv) &= ~SVTYPEMASK;
1246     SvFLAGS(sv) |= new_type;
1247
1248     /* This can't happen, as SVt_NULL is <= all values of new_type, so one of
1249        the return statements above will have triggered.  */
1250     assert (new_type != SVt_NULL);
1251     switch (new_type) {
1252     case SVt_IV:
1253         assert(old_type == SVt_NULL);
1254         SvANY(sv) = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
1255         SvIV_set(sv, 0);
1256         return;
1257     case SVt_NV:
1258         assert(old_type == SVt_NULL);
1259         SvANY(sv) = new_XNV();
1260         SvNV_set(sv, 0);
1261         return;
1262     case SVt_PVHV:
1263     case SVt_PVAV:
1264         assert(new_type_details->body_size);
1265
1266 #ifndef PURIFY  
1267         assert(new_type_details->arena);
1268         assert(new_type_details->arena_size);
1269         /* This points to the start of the allocated area.  */
1270         new_body_inline(new_body, new_type);
1271         Zero(new_body, new_type_details->body_size, char);
1272         new_body = ((char *)new_body) - new_type_details->offset;
1273 #else
1274         /* We always allocated the full length item with PURIFY. To do this
1275            we fake things so that arena is false for all 16 types..  */
1276         new_body = new_NOARENAZ(new_type_details);
1277 #endif
1278         SvANY(sv) = new_body;
1279         if (new_type == SVt_PVAV) {
1280             AvMAX(sv)   = -1;
1281             AvFILLp(sv) = -1;
1282             AvREAL_only(sv);
1283             if (old_type_details->body_size) {
1284                 AvALLOC(sv) = 0;
1285             } else {
1286                 /* It will have been zeroed when the new body was allocated.
1287                    Lets not write to it, in case it confuses a write-back
1288                    cache.  */
1289             }
1290         } else {
1291             assert(!SvOK(sv));
1292             SvOK_off(sv);
1293 #ifndef NODEFAULT_SHAREKEYS
1294             HvSHAREKEYS_on(sv);         /* key-sharing on by default */
1295 #endif
1296             HvMAX(sv) = 7; /* (start with 8 buckets) */
1297         }
1298
1299         /* SVt_NULL isn't the only thing upgraded to AV or HV.
1300            The target created by newSVrv also is, and it can have magic.
1301            However, it never has SvPVX set.
1302         */
1303         if (old_type == SVt_IV) {
1304             assert(!SvROK(sv));
1305         } else if (old_type >= SVt_PV) {
1306             assert(SvPVX_const(sv) == 0);
1307         }
1308
1309         if (old_type >= SVt_PVMG) {
1310             SvMAGIC_set(sv, ((XPVMG*)old_body)->xmg_u.xmg_magic);
1311             SvSTASH_set(sv, ((XPVMG*)old_body)->xmg_stash);
1312         } else {
1313             sv->sv_u.svu_array = NULL; /* or svu_hash  */
1314         }
1315         break;
1316
1317
1318     case SVt_REGEXP:
1319         /* This ensures that SvTHINKFIRST(sv) is true, and hence that
1320            sv_force_normal_flags(sv) is called.  */
1321         SvFAKE_on(sv);
1322     case SVt_PVIV:
1323         /* XXX Is this still needed?  Was it ever needed?   Surely as there is
1324            no route from NV to PVIV, NOK can never be true  */
1325         assert(!SvNOKp(sv));
1326         assert(!SvNOK(sv));
1327     case SVt_PVIO:
1328     case SVt_PVFM:
1329     case SVt_PVGV:
1330     case SVt_PVCV:
1331     case SVt_PVLV:
1332     case SVt_PVMG:
1333     case SVt_PVNV:
1334     case SVt_PV:
1335
1336         assert(new_type_details->body_size);
1337         /* We always allocated the full length item with PURIFY. To do this
1338            we fake things so that arena is false for all 16 types..  */
1339         if(new_type_details->arena) {
1340             /* This points to the start of the allocated area.  */
1341             new_body_inline(new_body, new_type);
1342             Zero(new_body, new_type_details->body_size, char);
1343             new_body = ((char *)new_body) - new_type_details->offset;
1344         } else {
1345             new_body = new_NOARENAZ(new_type_details);
1346         }
1347         SvANY(sv) = new_body;
1348
1349         if (old_type_details->copy) {
1350             /* There is now the potential for an upgrade from something without
1351                an offset (PVNV or PVMG) to something with one (PVCV, PVFM)  */
1352             int offset = old_type_details->offset;
1353             int length = old_type_details->copy;
1354
1355             if (new_type_details->offset > old_type_details->offset) {
1356                 const int difference
1357                     = new_type_details->offset - old_type_details->offset;
1358                 offset += difference;
1359                 length -= difference;
1360             }
1361             assert (length >= 0);
1362                 
1363             Copy((char *)old_body + offset, (char *)new_body + offset, length,
1364                  char);
1365         }
1366
1367 #ifndef NV_ZERO_IS_ALLBITS_ZERO
1368         /* If NV 0.0 is stores as all bits 0 then Zero() already creates a
1369          * correct 0.0 for us.  Otherwise, if the old body didn't have an
1370          * NV slot, but the new one does, then we need to initialise the
1371          * freshly created NV slot with whatever the correct bit pattern is
1372          * for 0.0  */
1373         if (old_type_details->zero_nv && !new_type_details->zero_nv
1374             && !isGV_with_GP(sv))
1375             SvNV_set(sv, 0);
1376 #endif
1377
1378         if (new_type == SVt_PVIO) {
1379             IO * const io = MUTABLE_IO(sv);
1380             GV *iogv = gv_fetchpvs("IO::File::", GV_ADD, SVt_PVHV);
1381
1382             SvOBJECT_on(io);
1383             /* Clear the stashcache because a new IO could overrule a package
1384                name */
1385             hv_clear(PL_stashcache);
1386
1387             SvSTASH_set(io, MUTABLE_HV(SvREFCNT_inc(GvHV(iogv))));
1388             IoPAGE_LEN(sv) = 60;
1389         }
1390         if (old_type < SVt_PV) {
1391             /* referant will be NULL unless the old type was SVt_IV emulating
1392                SVt_RV */
1393             sv->sv_u.svu_rv = referant;
1394         }
1395         break;
1396     default:
1397         Perl_croak(aTHX_ "panic: sv_upgrade to unknown type %lu",
1398                    (unsigned long)new_type);
1399     }
1400
1401     if (old_type > SVt_IV) {
1402 #ifdef PURIFY
1403         safefree(old_body);
1404 #else
1405         /* Note that there is an assumption that all bodies of types that
1406            can be upgraded came from arenas. Only the more complex non-
1407            upgradable types are allowed to be directly malloc()ed.  */
1408         assert(old_type_details->arena);
1409         del_body((void*)((char*)old_body + old_type_details->offset),
1410                  &PL_body_roots[old_type]);
1411 #endif
1412     }
1413 }
1414
1415 /*
1416 =for apidoc sv_backoff
1417
1418 Remove any string offset. You should normally use the C<SvOOK_off> macro
1419 wrapper instead.
1420
1421 =cut
1422 */
1423
1424 int
1425 Perl_sv_backoff(pTHX_ register SV *const sv)
1426 {
1427     STRLEN delta;
1428     const char * const s = SvPVX_const(sv);
1429
1430     PERL_ARGS_ASSERT_SV_BACKOFF;
1431     PERL_UNUSED_CONTEXT;
1432
1433     assert(SvOOK(sv));
1434     assert(SvTYPE(sv) != SVt_PVHV);
1435     assert(SvTYPE(sv) != SVt_PVAV);
1436
1437     SvOOK_offset(sv, delta);
1438     
1439     SvLEN_set(sv, SvLEN(sv) + delta);
1440     SvPV_set(sv, SvPVX(sv) - delta);
1441     Move(s, SvPVX(sv), SvCUR(sv)+1, char);
1442     SvFLAGS(sv) &= ~SVf_OOK;
1443     return 0;
1444 }
1445
1446 /*
1447 =for apidoc sv_grow
1448
1449 Expands the character buffer in the SV.  If necessary, uses C<sv_unref> and
1450 upgrades the SV to C<SVt_PV>.  Returns a pointer to the character buffer.
1451 Use the C<SvGROW> wrapper instead.
1452
1453 =cut
1454 */
1455
1456 char *
1457 Perl_sv_grow(pTHX_ register SV *const sv, register STRLEN newlen)
1458 {
1459     register char *s;
1460
1461     PERL_ARGS_ASSERT_SV_GROW;
1462
1463     if (PL_madskills && newlen >= 0x100000) {
1464         PerlIO_printf(Perl_debug_log,
1465                       "Allocation too large: %"UVxf"\n", (UV)newlen);
1466     }
1467 #ifdef HAS_64K_LIMIT
1468     if (newlen >= 0x10000) {
1469         PerlIO_printf(Perl_debug_log,
1470                       "Allocation too large: %"UVxf"\n", (UV)newlen);
1471         my_exit(1);
1472     }
1473 #endif /* HAS_64K_LIMIT */
1474     if (SvROK(sv))
1475         sv_unref(sv);
1476     if (SvTYPE(sv) < SVt_PV) {
1477         sv_upgrade(sv, SVt_PV);
1478         s = SvPVX_mutable(sv);
1479     }
1480     else if (SvOOK(sv)) {       /* pv is offset? */
1481         sv_backoff(sv);
1482         s = SvPVX_mutable(sv);
1483         if (newlen > SvLEN(sv))
1484             newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
1485 #ifdef HAS_64K_LIMIT
1486         if (newlen >= 0x10000)
1487             newlen = 0xFFFF;
1488 #endif
1489     }
1490     else
1491         s = SvPVX_mutable(sv);
1492
1493     if (newlen > SvLEN(sv)) {           /* need more room? */
1494         STRLEN minlen = SvCUR(sv);
1495         minlen += (minlen >> PERL_STRLEN_EXPAND_SHIFT) + 10;
1496         if (newlen < minlen)
1497             newlen = minlen;
1498 #ifndef Perl_safesysmalloc_size
1499         newlen = PERL_STRLEN_ROUNDUP(newlen);
1500 #endif
1501         if (SvLEN(sv) && s) {
1502             s = (char*)saferealloc(s, newlen);
1503         }
1504         else {
1505             s = (char*)safemalloc(newlen);
1506             if (SvPVX_const(sv) && SvCUR(sv)) {
1507                 Move(SvPVX_const(sv), s, (newlen < SvCUR(sv)) ? newlen : SvCUR(sv), char);
1508             }
1509         }
1510         SvPV_set(sv, s);
1511 #ifdef Perl_safesysmalloc_size
1512         /* Do this here, do it once, do it right, and then we will never get
1513            called back into sv_grow() unless there really is some growing
1514            needed.  */
1515         SvLEN_set(sv, Perl_safesysmalloc_size(s));
1516 #else
1517         SvLEN_set(sv, newlen);
1518 #endif
1519     }
1520     return s;
1521 }
1522
1523 /*
1524 =for apidoc sv_setiv
1525
1526 Copies an integer into the given SV, upgrading first if necessary.
1527 Does not handle 'set' magic.  See also C<sv_setiv_mg>.
1528
1529 =cut
1530 */
1531
1532 void
1533 Perl_sv_setiv(pTHX_ register SV *const sv, const IV i)
1534 {
1535     dVAR;
1536
1537     PERL_ARGS_ASSERT_SV_SETIV;
1538
1539     SV_CHECK_THINKFIRST_COW_DROP(sv);
1540     switch (SvTYPE(sv)) {
1541     case SVt_NULL:
1542     case SVt_NV:
1543         sv_upgrade(sv, SVt_IV);
1544         break;
1545     case SVt_PV:
1546         sv_upgrade(sv, SVt_PVIV);
1547         break;
1548
1549     case SVt_PVGV:
1550         if (!isGV_with_GP(sv))
1551             break;
1552     case SVt_PVAV:
1553     case SVt_PVHV:
1554     case SVt_PVCV:
1555     case SVt_PVFM:
1556     case SVt_PVIO:
1557         Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
1558                    OP_DESC(PL_op));
1559     default: NOOP;
1560     }
1561     (void)SvIOK_only(sv);                       /* validate number */
1562     SvIV_set(sv, i);
1563     SvTAINT(sv);
1564 }
1565
1566 /*
1567 =for apidoc sv_setiv_mg
1568
1569 Like C<sv_setiv>, but also handles 'set' magic.
1570
1571 =cut
1572 */
1573
1574 void
1575 Perl_sv_setiv_mg(pTHX_ register SV *const sv, const IV i)
1576 {
1577     PERL_ARGS_ASSERT_SV_SETIV_MG;
1578
1579     sv_setiv(sv,i);
1580     SvSETMAGIC(sv);
1581 }
1582
1583 /*
1584 =for apidoc sv_setuv
1585
1586 Copies an unsigned integer into the given SV, upgrading first if necessary.
1587 Does not handle 'set' magic.  See also C<sv_setuv_mg>.
1588
1589 =cut
1590 */
1591
1592 void
1593 Perl_sv_setuv(pTHX_ register SV *const sv, const UV u)
1594 {
1595     PERL_ARGS_ASSERT_SV_SETUV;
1596
1597     /* With these two if statements:
1598        u=1.49  s=0.52  cu=72.49  cs=10.64  scripts=270  tests=20865
1599
1600        without
1601        u=1.35  s=0.47  cu=73.45  cs=11.43  scripts=270  tests=20865
1602
1603        If you wish to remove them, please benchmark to see what the effect is
1604     */
1605     if (u <= (UV)IV_MAX) {
1606        sv_setiv(sv, (IV)u);
1607        return;
1608     }
1609     sv_setiv(sv, 0);
1610     SvIsUV_on(sv);
1611     SvUV_set(sv, u);
1612 }
1613
1614 /*
1615 =for apidoc sv_setuv_mg
1616
1617 Like C<sv_setuv>, but also handles 'set' magic.
1618
1619 =cut
1620 */
1621
1622 void
1623 Perl_sv_setuv_mg(pTHX_ register SV *const sv, const UV u)
1624 {
1625     PERL_ARGS_ASSERT_SV_SETUV_MG;
1626
1627     sv_setuv(sv,u);
1628     SvSETMAGIC(sv);
1629 }
1630
1631 /*
1632 =for apidoc sv_setnv
1633
1634 Copies a double into the given SV, upgrading first if necessary.
1635 Does not handle 'set' magic.  See also C<sv_setnv_mg>.
1636
1637 =cut
1638 */
1639
1640 void
1641 Perl_sv_setnv(pTHX_ register SV *const sv, const NV num)
1642 {
1643     dVAR;
1644
1645     PERL_ARGS_ASSERT_SV_SETNV;
1646
1647     SV_CHECK_THINKFIRST_COW_DROP(sv);
1648     switch (SvTYPE(sv)) {
1649     case SVt_NULL:
1650     case SVt_IV:
1651         sv_upgrade(sv, SVt_NV);
1652         break;
1653     case SVt_PV:
1654     case SVt_PVIV:
1655         sv_upgrade(sv, SVt_PVNV);
1656         break;
1657
1658     case SVt_PVGV:
1659         if (!isGV_with_GP(sv))
1660             break;
1661     case SVt_PVAV:
1662     case SVt_PVHV:
1663     case SVt_PVCV:
1664     case SVt_PVFM:
1665     case SVt_PVIO:
1666         Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
1667                    OP_DESC(PL_op));
1668     default: NOOP;
1669     }
1670     SvNV_set(sv, num);
1671     (void)SvNOK_only(sv);                       /* validate number */
1672     SvTAINT(sv);
1673 }
1674
1675 /*
1676 =for apidoc sv_setnv_mg
1677
1678 Like C<sv_setnv>, but also handles 'set' magic.
1679
1680 =cut
1681 */
1682
1683 void
1684 Perl_sv_setnv_mg(pTHX_ register SV *const sv, const NV num)
1685 {
1686     PERL_ARGS_ASSERT_SV_SETNV_MG;
1687
1688     sv_setnv(sv,num);
1689     SvSETMAGIC(sv);
1690 }
1691
1692 /* Print an "isn't numeric" warning, using a cleaned-up,
1693  * printable version of the offending string
1694  */
1695
1696 STATIC void
1697 S_not_a_number(pTHX_ SV *const sv)
1698 {
1699      dVAR;
1700      SV *dsv;
1701      char tmpbuf[64];
1702      const char *pv;
1703
1704      PERL_ARGS_ASSERT_NOT_A_NUMBER;
1705
1706      if (DO_UTF8(sv)) {
1707           dsv = newSVpvs_flags("", SVs_TEMP);
1708           pv = sv_uni_display(dsv, sv, 10, 0);
1709      } else {
1710           char *d = tmpbuf;
1711           const char * const limit = tmpbuf + sizeof(tmpbuf) - 8;
1712           /* each *s can expand to 4 chars + "...\0",
1713              i.e. need room for 8 chars */
1714         
1715           const char *s = SvPVX_const(sv);
1716           const char * const end = s + SvCUR(sv);
1717           for ( ; s < end && d < limit; s++ ) {
1718                int ch = *s & 0xFF;
1719                if (ch & 128 && !isPRINT_LC(ch)) {
1720                     *d++ = 'M';
1721                     *d++ = '-';
1722                     ch &= 127;
1723                }
1724                if (ch == '\n') {
1725                     *d++ = '\\';
1726                     *d++ = 'n';
1727                }
1728                else if (ch == '\r') {
1729                     *d++ = '\\';
1730                     *d++ = 'r';
1731                }
1732                else if (ch == '\f') {
1733                     *d++ = '\\';
1734                     *d++ = 'f';
1735                }
1736                else if (ch == '\\') {
1737                     *d++ = '\\';
1738                     *d++ = '\\';
1739                }
1740                else if (ch == '\0') {
1741                     *d++ = '\\';
1742                     *d++ = '0';
1743                }
1744                else if (isPRINT_LC(ch))
1745                     *d++ = ch;
1746                else {
1747                     *d++ = '^';
1748                     *d++ = toCTRL(ch);
1749                }
1750           }
1751           if (s < end) {
1752                *d++ = '.';
1753                *d++ = '.';
1754                *d++ = '.';
1755           }
1756           *d = '\0';
1757           pv = tmpbuf;
1758     }
1759
1760     if (PL_op)
1761         Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
1762                     "Argument \"%s\" isn't numeric in %s", pv,
1763                     OP_DESC(PL_op));
1764     else
1765         Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
1766                     "Argument \"%s\" isn't numeric", pv);
1767 }
1768
1769 /*
1770 =for apidoc looks_like_number
1771
1772 Test if the content of an SV looks like a number (or is a number).
1773 C<Inf> and C<Infinity> are treated as numbers (so will not issue a
1774 non-numeric warning), even if your atof() doesn't grok them.
1775
1776 =cut
1777 */
1778
1779 I32
1780 Perl_looks_like_number(pTHX_ SV *const sv)
1781 {
1782     register const char *sbegin;
1783     STRLEN len;
1784
1785     PERL_ARGS_ASSERT_LOOKS_LIKE_NUMBER;
1786
1787     if (SvPOK(sv)) {
1788         sbegin = SvPVX_const(sv);
1789         len = SvCUR(sv);
1790     }
1791     else if (SvPOKp(sv))
1792         sbegin = SvPV_const(sv, len);
1793     else
1794         return SvFLAGS(sv) & (SVf_NOK|SVp_NOK|SVf_IOK|SVp_IOK);
1795     return grok_number(sbegin, len, NULL);
1796 }
1797
1798 STATIC bool
1799 S_glob_2number(pTHX_ GV * const gv)
1800 {
1801     const U32 wasfake = SvFLAGS(gv) & SVf_FAKE;
1802     SV *const buffer = sv_newmortal();
1803
1804     PERL_ARGS_ASSERT_GLOB_2NUMBER;
1805
1806     /* FAKE globs can get coerced, so need to turn this off temporarily if it
1807        is on.  */
1808     SvFAKE_off(gv);
1809     gv_efullname3(buffer, gv, "*");
1810     SvFLAGS(gv) |= wasfake;
1811
1812     /* We know that all GVs stringify to something that is not-a-number,
1813         so no need to test that.  */
1814     if (ckWARN(WARN_NUMERIC))
1815         not_a_number(buffer);
1816     /* We just want something true to return, so that S_sv_2iuv_common
1817         can tail call us and return true.  */
1818     return TRUE;
1819 }
1820
1821 /* Actually, ISO C leaves conversion of UV to IV undefined, but
1822    until proven guilty, assume that things are not that bad... */
1823
1824 /*
1825    NV_PRESERVES_UV:
1826
1827    As 64 bit platforms often have an NV that doesn't preserve all bits of
1828    an IV (an assumption perl has been based on to date) it becomes necessary
1829    to remove the assumption that the NV always carries enough precision to
1830    recreate the IV whenever needed, and that the NV is the canonical form.
1831    Instead, IV/UV and NV need to be given equal rights. So as to not lose
1832    precision as a side effect of conversion (which would lead to insanity
1833    and the dragon(s) in t/op/numconvert.t getting very angry) the intent is
1834    1) to distinguish between IV/UV/NV slots that have cached a valid
1835       conversion where precision was lost and IV/UV/NV slots that have a
1836       valid conversion which has lost no precision
1837    2) to ensure that if a numeric conversion to one form is requested that
1838       would lose precision, the precise conversion (or differently
1839       imprecise conversion) is also performed and cached, to prevent
1840       requests for different numeric formats on the same SV causing
1841       lossy conversion chains. (lossless conversion chains are perfectly
1842       acceptable (still))
1843
1844
1845    flags are used:
1846    SvIOKp is true if the IV slot contains a valid value
1847    SvIOK  is true only if the IV value is accurate (UV if SvIOK_UV true)
1848    SvNOKp is true if the NV slot contains a valid value
1849    SvNOK  is true only if the NV value is accurate
1850
1851    so
1852    while converting from PV to NV, check to see if converting that NV to an
1853    IV(or UV) would lose accuracy over a direct conversion from PV to
1854    IV(or UV). If it would, cache both conversions, return NV, but mark
1855    SV as IOK NOKp (ie not NOK).
1856
1857    While converting from PV to IV, check to see if converting that IV to an
1858    NV would lose accuracy over a direct conversion from PV to NV. If it
1859    would, cache both conversions, flag similarly.
1860
1861    Before, the SV value "3.2" could become NV=3.2 IV=3 NOK, IOK quite
1862    correctly because if IV & NV were set NV *always* overruled.
1863    Now, "3.2" will become NV=3.2 IV=3 NOK, IOKp, because the flag's meaning
1864    changes - now IV and NV together means that the two are interchangeable:
1865    SvIVX == (IV) SvNVX && SvNVX == (NV) SvIVX;
1866
1867    The benefit of this is that operations such as pp_add know that if
1868    SvIOK is true for both left and right operands, then integer addition
1869    can be used instead of floating point (for cases where the result won't
1870    overflow). Before, floating point was always used, which could lead to
1871    loss of precision compared with integer addition.
1872
1873    * making IV and NV equal status should make maths accurate on 64 bit
1874      platforms
1875    * may speed up maths somewhat if pp_add and friends start to use
1876      integers when possible instead of fp. (Hopefully the overhead in
1877      looking for SvIOK and checking for overflow will not outweigh the
1878      fp to integer speedup)
1879    * will slow down integer operations (callers of SvIV) on "inaccurate"
1880      values, as the change from SvIOK to SvIOKp will cause a call into
1881      sv_2iv each time rather than a macro access direct to the IV slot
1882    * should speed up number->string conversion on integers as IV is
1883      favoured when IV and NV are equally accurate
1884
1885    ####################################################################
1886    You had better be using SvIOK_notUV if you want an IV for arithmetic:
1887    SvIOK is true if (IV or UV), so you might be getting (IV)SvUV.
1888    On the other hand, SvUOK is true iff UV.
1889    ####################################################################
1890
1891    Your mileage will vary depending your CPU's relative fp to integer
1892    performance ratio.
1893 */
1894
1895 #ifndef NV_PRESERVES_UV
1896 #  define IS_NUMBER_UNDERFLOW_IV 1
1897 #  define IS_NUMBER_UNDERFLOW_UV 2
1898 #  define IS_NUMBER_IV_AND_UV    2
1899 #  define IS_NUMBER_OVERFLOW_IV  4
1900 #  define IS_NUMBER_OVERFLOW_UV  5
1901
1902 /* sv_2iuv_non_preserve(): private routine for use by sv_2iv() and sv_2uv() */
1903
1904 /* For sv_2nv these three cases are "SvNOK and don't bother casting"  */
1905 STATIC int
1906 S_sv_2iuv_non_preserve(pTHX_ register SV *const sv
1907 #  ifdef DEBUGGING
1908                        , I32 numtype
1909 #  endif
1910                        )
1911 {
1912     dVAR;
1913
1914     PERL_ARGS_ASSERT_SV_2IUV_NON_PRESERVE;
1915
1916     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));
1917     if (SvNVX(sv) < (NV)IV_MIN) {
1918         (void)SvIOKp_on(sv);
1919         (void)SvNOK_on(sv);
1920         SvIV_set(sv, IV_MIN);
1921         return IS_NUMBER_UNDERFLOW_IV;
1922     }
1923     if (SvNVX(sv) > (NV)UV_MAX) {
1924         (void)SvIOKp_on(sv);
1925         (void)SvNOK_on(sv);
1926         SvIsUV_on(sv);
1927         SvUV_set(sv, UV_MAX);
1928         return IS_NUMBER_OVERFLOW_UV;
1929     }
1930     (void)SvIOKp_on(sv);
1931     (void)SvNOK_on(sv);
1932     /* Can't use strtol etc to convert this string.  (See truth table in
1933        sv_2iv  */
1934     if (SvNVX(sv) <= (UV)IV_MAX) {
1935         SvIV_set(sv, I_V(SvNVX(sv)));
1936         if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
1937             SvIOK_on(sv); /* Integer is precise. NOK, IOK */
1938         } else {
1939             /* Integer is imprecise. NOK, IOKp */
1940         }
1941         return SvNVX(sv) < 0 ? IS_NUMBER_UNDERFLOW_UV : IS_NUMBER_IV_AND_UV;
1942     }
1943     SvIsUV_on(sv);
1944     SvUV_set(sv, U_V(SvNVX(sv)));
1945     if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
1946         if (SvUVX(sv) == UV_MAX) {
1947             /* As we know that NVs don't preserve UVs, UV_MAX cannot
1948                possibly be preserved by NV. Hence, it must be overflow.
1949                NOK, IOKp */
1950             return IS_NUMBER_OVERFLOW_UV;
1951         }
1952         SvIOK_on(sv); /* Integer is precise. NOK, UOK */
1953     } else {
1954         /* Integer is imprecise. NOK, IOKp */
1955     }
1956     return IS_NUMBER_OVERFLOW_IV;
1957 }
1958 #endif /* !NV_PRESERVES_UV*/
1959
1960 STATIC bool
1961 S_sv_2iuv_common(pTHX_ SV *const sv)
1962 {
1963     dVAR;
1964
1965     PERL_ARGS_ASSERT_SV_2IUV_COMMON;
1966
1967     if (SvNOKp(sv)) {
1968         /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
1969          * without also getting a cached IV/UV from it at the same time
1970          * (ie PV->NV conversion should detect loss of accuracy and cache
1971          * IV or UV at same time to avoid this. */
1972         /* IV-over-UV optimisation - choose to cache IV if possible */
1973
1974         if (SvTYPE(sv) == SVt_NV)
1975             sv_upgrade(sv, SVt_PVNV);
1976
1977         (void)SvIOKp_on(sv);    /* Must do this first, to clear any SvOOK */
1978         /* < not <= as for NV doesn't preserve UV, ((NV)IV_MAX+1) will almost
1979            certainly cast into the IV range at IV_MAX, whereas the correct
1980            answer is the UV IV_MAX +1. Hence < ensures that dodgy boundary
1981            cases go to UV */
1982 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1983         if (Perl_isnan(SvNVX(sv))) {
1984             SvUV_set(sv, 0);
1985             SvIsUV_on(sv);
1986             return FALSE;
1987         }
1988 #endif
1989         if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
1990             SvIV_set(sv, I_V(SvNVX(sv)));
1991             if (SvNVX(sv) == (NV) SvIVX(sv)
1992 #ifndef NV_PRESERVES_UV
1993                 && (((UV)1 << NV_PRESERVES_UV_BITS) >
1994                     (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
1995                 /* Don't flag it as "accurately an integer" if the number
1996                    came from a (by definition imprecise) NV operation, and
1997                    we're outside the range of NV integer precision */
1998 #endif
1999                 ) {
2000                 if (SvNOK(sv))
2001                     SvIOK_on(sv);  /* Can this go wrong with rounding? NWC */
2002                 else {
2003                     /* scalar has trailing garbage, eg "42a" */
2004                 }
2005                 DEBUG_c(PerlIO_printf(Perl_debug_log,
2006                                       "0x%"UVxf" iv(%"NVgf" => %"IVdf") (precise)\n",
2007                                       PTR2UV(sv),
2008                                       SvNVX(sv),
2009                                       SvIVX(sv)));
2010
2011             } else {
2012                 /* IV not precise.  No need to convert from PV, as NV
2013                    conversion would already have cached IV if it detected
2014                    that PV->IV would be better than PV->NV->IV
2015                    flags already correct - don't set public IOK.  */
2016                 DEBUG_c(PerlIO_printf(Perl_debug_log,
2017                                       "0x%"UVxf" iv(%"NVgf" => %"IVdf") (imprecise)\n",
2018                                       PTR2UV(sv),
2019                                       SvNVX(sv),
2020                                       SvIVX(sv)));
2021             }
2022             /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
2023                but the cast (NV)IV_MIN rounds to a the value less (more
2024                negative) than IV_MIN which happens to be equal to SvNVX ??
2025                Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
2026                NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
2027                (NV)UVX == NVX are both true, but the values differ. :-(
2028                Hopefully for 2s complement IV_MIN is something like
2029                0x8000000000000000 which will be exact. NWC */
2030         }
2031         else {
2032             SvUV_set(sv, U_V(SvNVX(sv)));
2033             if (
2034                 (SvNVX(sv) == (NV) SvUVX(sv))
2035 #ifndef  NV_PRESERVES_UV
2036                 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
2037                 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
2038                 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
2039                 /* Don't flag it as "accurately an integer" if the number
2040                    came from a (by definition imprecise) NV operation, and
2041                    we're outside the range of NV integer precision */
2042 #endif
2043                 && SvNOK(sv)
2044                 )
2045                 SvIOK_on(sv);
2046             SvIsUV_on(sv);
2047             DEBUG_c(PerlIO_printf(Perl_debug_log,
2048                                   "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
2049                                   PTR2UV(sv),
2050                                   SvUVX(sv),
2051                                   SvUVX(sv)));
2052         }
2053     }
2054     else if (SvPOKp(sv) && SvLEN(sv)) {
2055         UV value;
2056         const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2057         /* We want to avoid a possible problem when we cache an IV/ a UV which
2058            may be later translated to an NV, and the resulting NV is not
2059            the same as the direct translation of the initial string
2060            (eg 123.456 can shortcut to the IV 123 with atol(), but we must
2061            be careful to ensure that the value with the .456 is around if the
2062            NV value is requested in the future).
2063         
2064            This means that if we cache such an IV/a UV, we need to cache the
2065            NV as well.  Moreover, we trade speed for space, and do not
2066            cache the NV if we are sure it's not needed.
2067          */
2068
2069         /* SVt_PVNV is one higher than SVt_PVIV, hence this order  */
2070         if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2071              == IS_NUMBER_IN_UV) {
2072             /* It's definitely an integer, only upgrade to PVIV */
2073             if (SvTYPE(sv) < SVt_PVIV)
2074                 sv_upgrade(sv, SVt_PVIV);
2075             (void)SvIOK_on(sv);
2076         } else if (SvTYPE(sv) < SVt_PVNV)
2077             sv_upgrade(sv, SVt_PVNV);
2078
2079         /* If NVs preserve UVs then we only use the UV value if we know that
2080            we aren't going to call atof() below. If NVs don't preserve UVs
2081            then the value returned may have more precision than atof() will
2082            return, even though value isn't perfectly accurate.  */
2083         if ((numtype & (IS_NUMBER_IN_UV
2084 #ifdef NV_PRESERVES_UV
2085                         | IS_NUMBER_NOT_INT
2086 #endif
2087             )) == IS_NUMBER_IN_UV) {
2088             /* This won't turn off the public IOK flag if it was set above  */
2089             (void)SvIOKp_on(sv);
2090
2091             if (!(numtype & IS_NUMBER_NEG)) {
2092                 /* positive */;
2093                 if (value <= (UV)IV_MAX) {
2094                     SvIV_set(sv, (IV)value);
2095                 } else {
2096                     /* it didn't overflow, and it was positive. */
2097                     SvUV_set(sv, value);
2098                     SvIsUV_on(sv);
2099                 }
2100             } else {
2101                 /* 2s complement assumption  */
2102                 if (value <= (UV)IV_MIN) {
2103                     SvIV_set(sv, -(IV)value);
2104                 } else {
2105                     /* Too negative for an IV.  This is a double upgrade, but
2106                        I'm assuming it will be rare.  */
2107                     if (SvTYPE(sv) < SVt_PVNV)
2108                         sv_upgrade(sv, SVt_PVNV);
2109                     SvNOK_on(sv);
2110                     SvIOK_off(sv);
2111                     SvIOKp_on(sv);
2112                     SvNV_set(sv, -(NV)value);
2113                     SvIV_set(sv, IV_MIN);
2114                 }
2115             }
2116         }
2117         /* For !NV_PRESERVES_UV and IS_NUMBER_IN_UV and IS_NUMBER_NOT_INT we
2118            will be in the previous block to set the IV slot, and the next
2119            block to set the NV slot.  So no else here.  */
2120         
2121         if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2122             != IS_NUMBER_IN_UV) {
2123             /* It wasn't an (integer that doesn't overflow the UV). */
2124             SvNV_set(sv, Atof(SvPVX_const(sv)));
2125
2126             if (! numtype && ckWARN(WARN_NUMERIC))
2127                 not_a_number(sv);
2128
2129 #if defined(USE_LONG_DOUBLE)
2130             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%" PERL_PRIgldbl ")\n",
2131                                   PTR2UV(sv), SvNVX(sv)));
2132 #else
2133             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"NVgf")\n",
2134                                   PTR2UV(sv), SvNVX(sv)));
2135 #endif
2136
2137 #ifdef NV_PRESERVES_UV
2138             (void)SvIOKp_on(sv);
2139             (void)SvNOK_on(sv);
2140             if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2141                 SvIV_set(sv, I_V(SvNVX(sv)));
2142                 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2143                     SvIOK_on(sv);
2144                 } else {
2145                     NOOP;  /* Integer is imprecise. NOK, IOKp */
2146                 }
2147                 /* UV will not work better than IV */
2148             } else {
2149                 if (SvNVX(sv) > (NV)UV_MAX) {
2150                     SvIsUV_on(sv);
2151                     /* Integer is inaccurate. NOK, IOKp, is UV */
2152                     SvUV_set(sv, UV_MAX);
2153                 } else {
2154                     SvUV_set(sv, U_V(SvNVX(sv)));
2155                     /* 0xFFFFFFFFFFFFFFFF not an issue in here, NVs
2156                        NV preservse UV so can do correct comparison.  */
2157                     if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2158                         SvIOK_on(sv);
2159                     } else {
2160                         NOOP;   /* Integer is imprecise. NOK, IOKp, is UV */
2161                     }
2162                 }
2163                 SvIsUV_on(sv);
2164             }
2165 #else /* NV_PRESERVES_UV */
2166             if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2167                 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
2168                 /* The IV/UV slot will have been set from value returned by
2169                    grok_number above.  The NV slot has just been set using
2170                    Atof.  */
2171                 SvNOK_on(sv);
2172                 assert (SvIOKp(sv));
2173             } else {
2174                 if (((UV)1 << NV_PRESERVES_UV_BITS) >
2175                     U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2176                     /* Small enough to preserve all bits. */
2177                     (void)SvIOKp_on(sv);
2178                     SvNOK_on(sv);
2179                     SvIV_set(sv, I_V(SvNVX(sv)));
2180                     if ((NV)(SvIVX(sv)) == SvNVX(sv))
2181                         SvIOK_on(sv);
2182                     /* Assumption: first non-preserved integer is < IV_MAX,
2183                        this NV is in the preserved range, therefore: */
2184                     if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
2185                           < (UV)IV_MAX)) {
2186                         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);
2187                     }
2188                 } else {
2189                     /* IN_UV NOT_INT
2190                          0      0       already failed to read UV.
2191                          0      1       already failed to read UV.
2192                          1      0       you won't get here in this case. IV/UV
2193                                         slot set, public IOK, Atof() unneeded.
2194                          1      1       already read UV.
2195                        so there's no point in sv_2iuv_non_preserve() attempting
2196                        to use atol, strtol, strtoul etc.  */
2197 #  ifdef DEBUGGING
2198                     sv_2iuv_non_preserve (sv, numtype);
2199 #  else
2200                     sv_2iuv_non_preserve (sv);
2201 #  endif
2202                 }
2203             }
2204 #endif /* NV_PRESERVES_UV */
2205         /* It might be more code efficient to go through the entire logic above
2206            and conditionally set with SvIOKp_on() rather than SvIOK(), but it
2207            gets complex and potentially buggy, so more programmer efficient
2208            to do it this way, by turning off the public flags:  */
2209         if (!numtype)
2210             SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK);
2211         }
2212     }
2213     else  {
2214         if (isGV_with_GP(sv))
2215             return glob_2number(MUTABLE_GV(sv));
2216
2217         if (!(SvFLAGS(sv) & SVs_PADTMP)) {
2218             if (!PL_localizing && ckWARN(WARN_UNINITIALIZED))
2219                 report_uninit(sv);
2220         }
2221         if (SvTYPE(sv) < SVt_IV)
2222             /* Typically the caller expects that sv_any is not NULL now.  */
2223             sv_upgrade(sv, SVt_IV);
2224         /* Return 0 from the caller.  */
2225         return TRUE;
2226     }
2227     return FALSE;
2228 }
2229
2230 /*
2231 =for apidoc sv_2iv_flags
2232
2233 Return the integer value of an SV, doing any necessary string
2234 conversion.  If flags includes SV_GMAGIC, does an mg_get() first.
2235 Normally used via the C<SvIV(sv)> and C<SvIVx(sv)> macros.
2236
2237 =cut
2238 */
2239
2240 IV
2241 Perl_sv_2iv_flags(pTHX_ register SV *const sv, const I32 flags)
2242 {
2243     dVAR;
2244     if (!sv)
2245         return 0;
2246     if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
2247         /* FBMs use the same flag bit as SVf_IVisUV, so must let them
2248            cache IVs just in case. In practice it seems that they never
2249            actually anywhere accessible by user Perl code, let alone get used
2250            in anything other than a string context.  */
2251         if (flags & SV_GMAGIC)
2252             mg_get(sv);
2253         if (SvIOKp(sv))
2254             return SvIVX(sv);
2255         if (SvNOKp(sv)) {
2256             return I_V(SvNVX(sv));
2257         }
2258         if (SvPOKp(sv) && SvLEN(sv)) {
2259             UV value;
2260             const int numtype
2261                 = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2262
2263             if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2264                 == IS_NUMBER_IN_UV) {
2265                 /* It's definitely an integer */
2266                 if (numtype & IS_NUMBER_NEG) {
2267                     if (value < (UV)IV_MIN)
2268                         return -(IV)value;
2269                 } else {
2270                     if (value < (UV)IV_MAX)
2271                         return (IV)value;
2272                 }
2273             }
2274             if (!numtype) {
2275                 if (ckWARN(WARN_NUMERIC))
2276                     not_a_number(sv);
2277             }
2278             return I_V(Atof(SvPVX_const(sv)));
2279         }
2280         if (SvROK(sv)) {
2281             goto return_rok;
2282         }
2283         assert(SvTYPE(sv) >= SVt_PVMG);
2284         /* This falls through to the report_uninit inside S_sv_2iuv_common.  */
2285     } else if (SvTHINKFIRST(sv)) {
2286         if (SvROK(sv)) {
2287         return_rok:
2288             if (SvAMAGIC(sv)) {
2289                 SV * tmpstr;
2290                 if (flags & SV_SKIP_OVERLOAD)
2291                     return 0;
2292                 tmpstr=AMG_CALLun(sv,numer);
2293                 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2294                     return SvIV(tmpstr);
2295                 }
2296             }
2297             return PTR2IV(SvRV(sv));
2298         }
2299         if (SvIsCOW(sv)) {
2300             sv_force_normal_flags(sv, 0);
2301         }
2302         if (SvREADONLY(sv) && !SvOK(sv)) {
2303             if (ckWARN(WARN_UNINITIALIZED))
2304                 report_uninit(sv);
2305             return 0;
2306         }
2307     }
2308     if (!SvIOKp(sv)) {
2309         if (S_sv_2iuv_common(aTHX_ sv))
2310             return 0;
2311     }
2312     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
2313         PTR2UV(sv),SvIVX(sv)));
2314     return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
2315 }
2316
2317 /*
2318 =for apidoc sv_2uv_flags
2319
2320 Return the unsigned integer value of an SV, doing any necessary string
2321 conversion.  If flags includes SV_GMAGIC, does an mg_get() first.
2322 Normally used via the C<SvUV(sv)> and C<SvUVx(sv)> macros.
2323
2324 =cut
2325 */
2326
2327 UV
2328 Perl_sv_2uv_flags(pTHX_ register SV *const sv, const I32 flags)
2329 {
2330     dVAR;
2331     if (!sv)
2332         return 0;
2333     if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
2334         /* FBMs use the same flag bit as SVf_IVisUV, so must let them
2335            cache IVs just in case.  */
2336         if (flags & SV_GMAGIC)
2337             mg_get(sv);
2338         if (SvIOKp(sv))
2339             return SvUVX(sv);
2340         if (SvNOKp(sv))
2341             return U_V(SvNVX(sv));
2342         if (SvPOKp(sv) && SvLEN(sv)) {
2343             UV value;
2344             const int numtype
2345                 = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2346
2347             if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2348                 == IS_NUMBER_IN_UV) {
2349                 /* It's definitely an integer */
2350                 if (!(numtype & IS_NUMBER_NEG))
2351                     return value;
2352             }
2353             if (!numtype) {
2354                 if (ckWARN(WARN_NUMERIC))
2355                     not_a_number(sv);
2356             }
2357             return U_V(Atof(SvPVX_const(sv)));
2358         }
2359         if (SvROK(sv)) {
2360             goto return_rok;
2361         }
2362         assert(SvTYPE(sv) >= SVt_PVMG);
2363         /* This falls through to the report_uninit inside S_sv_2iuv_common.  */
2364     } else if (SvTHINKFIRST(sv)) {
2365         if (SvROK(sv)) {
2366         return_rok:
2367             if (SvAMAGIC(sv)) {
2368                 SV *tmpstr;
2369                 if (flags & SV_SKIP_OVERLOAD)
2370                     return 0;
2371                 tmpstr = AMG_CALLun(sv,numer);
2372                 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2373                     return SvUV(tmpstr);
2374                 }
2375             }
2376             return PTR2UV(SvRV(sv));
2377         }
2378         if (SvIsCOW(sv)) {
2379             sv_force_normal_flags(sv, 0);
2380         }
2381         if (SvREADONLY(sv) && !SvOK(sv)) {
2382             if (ckWARN(WARN_UNINITIALIZED))
2383                 report_uninit(sv);
2384             return 0;
2385         }
2386     }
2387     if (!SvIOKp(sv)) {
2388         if (S_sv_2iuv_common(aTHX_ sv))
2389             return 0;
2390     }
2391
2392     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
2393                           PTR2UV(sv),SvUVX(sv)));
2394     return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
2395 }
2396
2397 /*
2398 =for apidoc sv_2nv_flags
2399
2400 Return the num value of an SV, doing any necessary string or integer
2401 conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2402 Normally used via the C<SvNV(sv)> and C<SvNVx(sv)> macros.
2403
2404 =cut
2405 */
2406
2407 NV
2408 Perl_sv_2nv_flags(pTHX_ register SV *const sv, const I32 flags)
2409 {
2410     dVAR;
2411     if (!sv)
2412         return 0.0;
2413     if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
2414         /* FBMs use the same flag bit as SVf_IVisUV, so must let them
2415            cache IVs just in case.  */
2416         if (flags & SV_GMAGIC)
2417             mg_get(sv);
2418         if (SvNOKp(sv))
2419             return SvNVX(sv);
2420         if ((SvPOKp(sv) && SvLEN(sv)) && !SvIOKp(sv)) {
2421             if (!SvIOKp(sv) && ckWARN(WARN_NUMERIC) &&
2422                 !grok_number(SvPVX_const(sv), SvCUR(sv), NULL))
2423                 not_a_number(sv);
2424             return Atof(SvPVX_const(sv));
2425         }
2426         if (SvIOKp(sv)) {
2427             if (SvIsUV(sv))
2428                 return (NV)SvUVX(sv);
2429             else
2430                 return (NV)SvIVX(sv);
2431         }
2432         if (SvROK(sv)) {
2433             goto return_rok;
2434         }
2435         assert(SvTYPE(sv) >= SVt_PVMG);
2436         /* This falls through to the report_uninit near the end of the
2437            function. */
2438     } else if (SvTHINKFIRST(sv)) {
2439         if (SvROK(sv)) {
2440         return_rok:
2441             if (SvAMAGIC(sv)) {
2442                 SV *tmpstr;
2443                 if (flags & SV_SKIP_OVERLOAD)
2444                     return 0;
2445                 tmpstr = AMG_CALLun(sv,numer);
2446                 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2447                     return SvNV(tmpstr);
2448                 }
2449             }
2450             return PTR2NV(SvRV(sv));
2451         }
2452         if (SvIsCOW(sv)) {
2453             sv_force_normal_flags(sv, 0);
2454         }
2455         if (SvREADONLY(sv) && !SvOK(sv)) {
2456             if (ckWARN(WARN_UNINITIALIZED))
2457                 report_uninit(sv);
2458             return 0.0;
2459         }
2460     }
2461     if (SvTYPE(sv) < SVt_NV) {
2462         /* The logic to use SVt_PVNV if necessary is in sv_upgrade.  */
2463         sv_upgrade(sv, SVt_NV);
2464 #ifdef USE_LONG_DOUBLE
2465         DEBUG_c({
2466             STORE_NUMERIC_LOCAL_SET_STANDARD();
2467             PerlIO_printf(Perl_debug_log,
2468                           "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
2469                           PTR2UV(sv), SvNVX(sv));
2470             RESTORE_NUMERIC_LOCAL();
2471         });
2472 #else
2473         DEBUG_c({
2474             STORE_NUMERIC_LOCAL_SET_STANDARD();
2475             PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%"NVgf")\n",
2476                           PTR2UV(sv), SvNVX(sv));
2477             RESTORE_NUMERIC_LOCAL();
2478         });
2479 #endif
2480     }
2481     else if (SvTYPE(sv) < SVt_PVNV)
2482         sv_upgrade(sv, SVt_PVNV);
2483     if (SvNOKp(sv)) {
2484         return SvNVX(sv);
2485     }
2486     if (SvIOKp(sv)) {
2487         SvNV_set(sv, SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv));
2488 #ifdef NV_PRESERVES_UV
2489         if (SvIOK(sv))
2490             SvNOK_on(sv);
2491         else
2492             SvNOKp_on(sv);
2493 #else
2494         /* Only set the public NV OK flag if this NV preserves the IV  */
2495         /* Check it's not 0xFFFFFFFFFFFFFFFF */
2496         if (SvIOK(sv) &&
2497             SvIsUV(sv) ? ((SvUVX(sv) != UV_MAX)&&(SvUVX(sv) == U_V(SvNVX(sv))))
2498                        : (SvIVX(sv) == I_V(SvNVX(sv))))
2499             SvNOK_on(sv);
2500         else
2501             SvNOKp_on(sv);
2502 #endif
2503     }
2504     else if (SvPOKp(sv) && SvLEN(sv)) {
2505         UV value;
2506         const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2507         if (!SvIOKp(sv) && !numtype && ckWARN(WARN_NUMERIC))
2508             not_a_number(sv);
2509 #ifdef NV_PRESERVES_UV
2510         if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2511             == IS_NUMBER_IN_UV) {
2512             /* It's definitely an integer */
2513             SvNV_set(sv, (numtype & IS_NUMBER_NEG) ? -(NV)value : (NV)value);
2514         } else
2515             SvNV_set(sv, Atof(SvPVX_const(sv)));
2516         if (numtype)
2517             SvNOK_on(sv);
2518         else
2519             SvNOKp_on(sv);
2520 #else
2521         SvNV_set(sv, Atof(SvPVX_const(sv)));
2522         /* Only set the public NV OK flag if this NV preserves the value in
2523            the PV at least as well as an IV/UV would.
2524            Not sure how to do this 100% reliably. */
2525         /* if that shift count is out of range then Configure's test is
2526            wonky. We shouldn't be in here with NV_PRESERVES_UV_BITS ==
2527            UV_BITS */
2528         if (((UV)1 << NV_PRESERVES_UV_BITS) >
2529             U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2530             SvNOK_on(sv); /* Definitely small enough to preserve all bits */
2531         } else if (!(numtype & IS_NUMBER_IN_UV)) {
2532             /* Can't use strtol etc to convert this string, so don't try.
2533                sv_2iv and sv_2uv will use the NV to convert, not the PV.  */
2534             SvNOK_on(sv);
2535         } else {
2536             /* value has been set.  It may not be precise.  */
2537             if ((numtype & IS_NUMBER_NEG) && (value > (UV)IV_MIN)) {
2538                 /* 2s complement assumption for (UV)IV_MIN  */
2539                 SvNOK_on(sv); /* Integer is too negative.  */
2540             } else {
2541                 SvNOKp_on(sv);
2542                 SvIOKp_on(sv);
2543
2544                 if (numtype & IS_NUMBER_NEG) {
2545                     SvIV_set(sv, -(IV)value);
2546                 } else if (value <= (UV)IV_MAX) {
2547                     SvIV_set(sv, (IV)value);
2548                 } else {
2549                     SvUV_set(sv, value);
2550                     SvIsUV_on(sv);
2551                 }
2552
2553                 if (numtype & IS_NUMBER_NOT_INT) {
2554                     /* I believe that even if the original PV had decimals,
2555                        they are lost beyond the limit of the FP precision.
2556                        However, neither is canonical, so both only get p
2557                        flags.  NWC, 2000/11/25 */
2558                     /* Both already have p flags, so do nothing */
2559                 } else {
2560                     const NV nv = SvNVX(sv);
2561                     if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2562                         if (SvIVX(sv) == I_V(nv)) {
2563                             SvNOK_on(sv);
2564                         } else {
2565                             /* It had no "." so it must be integer.  */
2566                         }
2567                         SvIOK_on(sv);
2568                     } else {
2569                         /* between IV_MAX and NV(UV_MAX).
2570                            Could be slightly > UV_MAX */
2571
2572                         if (numtype & IS_NUMBER_NOT_INT) {
2573                             /* UV and NV both imprecise.  */
2574                         } else {
2575                             const UV nv_as_uv = U_V(nv);
2576
2577                             if (value == nv_as_uv && SvUVX(sv) != UV_MAX) {
2578                                 SvNOK_on(sv);
2579                             }
2580                             SvIOK_on(sv);
2581                         }
2582                     }
2583                 }
2584             }
2585         }
2586         /* It might be more code efficient to go through the entire logic above
2587            and conditionally set with SvNOKp_on() rather than SvNOK(), but it
2588            gets complex and potentially buggy, so more programmer efficient
2589            to do it this way, by turning off the public flags:  */
2590         if (!numtype)
2591             SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK);
2592 #endif /* NV_PRESERVES_UV */
2593     }
2594     else  {
2595         if (isGV_with_GP(sv)) {
2596             glob_2number(MUTABLE_GV(sv));
2597             return 0.0;
2598         }
2599
2600         if (!PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP) && ckWARN(WARN_UNINITIALIZED))
2601             report_uninit(sv);
2602         assert (SvTYPE(sv) >= SVt_NV);
2603         /* Typically the caller expects that sv_any is not NULL now.  */
2604         /* XXX Ilya implies that this is a bug in callers that assume this
2605            and ideally should be fixed.  */
2606         return 0.0;
2607     }
2608 #if defined(USE_LONG_DOUBLE)
2609     DEBUG_c({
2610         STORE_NUMERIC_LOCAL_SET_STANDARD();
2611         PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
2612                       PTR2UV(sv), SvNVX(sv));
2613         RESTORE_NUMERIC_LOCAL();
2614     });
2615 #else
2616     DEBUG_c({
2617         STORE_NUMERIC_LOCAL_SET_STANDARD();
2618         PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%"NVgf")\n",
2619                       PTR2UV(sv), SvNVX(sv));
2620         RESTORE_NUMERIC_LOCAL();
2621     });
2622 #endif
2623     return SvNVX(sv);
2624 }
2625
2626 /*
2627 =for apidoc sv_2num
2628
2629 Return an SV with the numeric value of the source SV, doing any necessary
2630 reference or overload conversion.  You must use the C<SvNUM(sv)> macro to
2631 access this function.
2632
2633 =cut
2634 */
2635
2636 SV *
2637 Perl_sv_2num(pTHX_ register SV *const sv)
2638 {
2639     PERL_ARGS_ASSERT_SV_2NUM;
2640
2641     if (!SvROK(sv))
2642         return sv;
2643     if (SvAMAGIC(sv)) {
2644         SV * const tmpsv = AMG_CALLun(sv,numer);
2645         TAINT_IF(tmpsv && SvTAINTED(tmpsv));
2646         if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
2647             return sv_2num(tmpsv);
2648     }
2649     return sv_2mortal(newSVuv(PTR2UV(SvRV(sv))));
2650 }
2651
2652 /* uiv_2buf(): private routine for use by sv_2pv_flags(): print an IV or
2653  * UV as a string towards the end of buf, and return pointers to start and
2654  * end of it.
2655  *
2656  * We assume that buf is at least TYPE_CHARS(UV) long.
2657  */
2658
2659 static char *
2660 S_uiv_2buf(char *const buf, const IV iv, UV uv, const int is_uv, char **const peob)
2661 {
2662     char *ptr = buf + TYPE_CHARS(UV);
2663     char * const ebuf = ptr;
2664     int sign;
2665
2666     PERL_ARGS_ASSERT_UIV_2BUF;
2667
2668     if (is_uv)
2669         sign = 0;
2670     else if (iv >= 0) {
2671         uv = iv;
2672         sign = 0;
2673     } else {
2674         uv = -iv;
2675         sign = 1;
2676     }
2677     do {
2678         *--ptr = '0' + (char)(uv % 10);
2679     } while (uv /= 10);
2680     if (sign)
2681         *--ptr = '-';
2682     *peob = ebuf;
2683     return ptr;
2684 }
2685
2686 /*
2687 =for apidoc sv_2pv_flags
2688
2689 Returns a pointer to the string value of an SV, and sets *lp to its length.
2690 If flags includes SV_GMAGIC, does an mg_get() first. Coerces sv to a string
2691 if necessary.
2692 Normally invoked via the C<SvPV_flags> macro. C<sv_2pv()> and C<sv_2pv_nomg>
2693 usually end up here too.
2694
2695 =cut
2696 */
2697
2698 char *
2699 Perl_sv_2pv_flags(pTHX_ register SV *const sv, STRLEN *const lp, const I32 flags)
2700 {
2701     dVAR;
2702     register char *s;
2703
2704     if (!sv) {
2705         if (lp)
2706             *lp = 0;
2707         return (char *)"";
2708     }
2709     if (SvGMAGICAL(sv)) {
2710         if (flags & SV_GMAGIC)
2711             mg_get(sv);
2712         if (SvPOKp(sv)) {
2713             if (lp)
2714                 *lp = SvCUR(sv);
2715             if (flags & SV_MUTABLE_RETURN)
2716                 return SvPVX_mutable(sv);
2717             if (flags & SV_CONST_RETURN)
2718                 return (char *)SvPVX_const(sv);
2719             return SvPVX(sv);
2720         }
2721         if (SvIOKp(sv) || SvNOKp(sv)) {
2722             char tbuf[64];  /* Must fit sprintf/Gconvert of longest IV/NV */
2723             STRLEN len;
2724
2725             if (SvIOKp(sv)) {
2726                 len = SvIsUV(sv)
2727                     ? my_snprintf(tbuf, sizeof(tbuf), "%"UVuf, (UV)SvUVX(sv))
2728                     : my_snprintf(tbuf, sizeof(tbuf), "%"IVdf, (IV)SvIVX(sv));
2729             } else {
2730                 Gconvert(SvNVX(sv), NV_DIG, 0, tbuf);
2731                 len = strlen(tbuf);
2732             }
2733             assert(!SvROK(sv));
2734             {
2735                 dVAR;
2736
2737 #ifdef FIXNEGATIVEZERO
2738                 if (len == 2 && tbuf[0] == '-' && tbuf[1] == '0') {
2739                     tbuf[0] = '0';
2740                     tbuf[1] = 0;
2741                     len = 1;
2742                 }
2743 #endif
2744                 SvUPGRADE(sv, SVt_PV);
2745                 if (lp)
2746                     *lp = len;
2747                 s = SvGROW_mutable(sv, len + 1);
2748                 SvCUR_set(sv, len);
2749                 SvPOKp_on(sv);
2750                 return (char*)memcpy(s, tbuf, len + 1);
2751             }
2752         }
2753         if (SvROK(sv)) {
2754             goto return_rok;
2755         }
2756         assert(SvTYPE(sv) >= SVt_PVMG);
2757         /* This falls through to the report_uninit near the end of the
2758            function. */
2759     } else if (SvTHINKFIRST(sv)) {
2760         if (SvROK(sv)) {
2761         return_rok:
2762             if (SvAMAGIC(sv)) {
2763                 SV *tmpstr;
2764                 if (flags & SV_SKIP_OVERLOAD)
2765                     return NULL;
2766                 tmpstr = AMG_CALLun(sv,string);
2767                 TAINT_IF(tmpstr && SvTAINTED(tmpstr));
2768                 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2769                     /* Unwrap this:  */
2770                     /* char *pv = lp ? SvPV(tmpstr, *lp) : SvPV_nolen(tmpstr);
2771                      */
2772
2773                     char *pv;
2774                     if ((SvFLAGS(tmpstr) & (SVf_POK)) == SVf_POK) {
2775                         if (flags & SV_CONST_RETURN) {
2776                             pv = (char *) SvPVX_const(tmpstr);
2777                         } else {
2778                             pv = (flags & SV_MUTABLE_RETURN)
2779                                 ? SvPVX_mutable(tmpstr) : SvPVX(tmpstr);
2780                         }
2781                         if (lp)
2782                             *lp = SvCUR(tmpstr);
2783                     } else {
2784                         pv = sv_2pv_flags(tmpstr, lp, flags);
2785                     }
2786                     if (SvUTF8(tmpstr))
2787                         SvUTF8_on(sv);
2788                     else
2789                         SvUTF8_off(sv);
2790                     return pv;
2791                 }
2792             }
2793             {
2794                 STRLEN len;
2795                 char *retval;
2796                 char *buffer;
2797                 SV *const referent = SvRV(sv);
2798
2799                 if (!referent) {
2800                     len = 7;
2801                     retval = buffer = savepvn("NULLREF", len);
2802                 } else if (SvTYPE(referent) == SVt_REGEXP) {
2803                     REGEXP * const re = (REGEXP *)MUTABLE_PTR(referent);
2804                     I32 seen_evals = 0;
2805
2806                     assert(re);
2807                         
2808                     /* If the regex is UTF-8 we want the containing scalar to
2809                        have an UTF-8 flag too */
2810                     if (RX_UTF8(re))
2811                         SvUTF8_on(sv);
2812                     else
2813                         SvUTF8_off(sv); 
2814
2815                     if ((seen_evals = RX_SEEN_EVALS(re)))
2816                         PL_reginterp_cnt += seen_evals;
2817
2818                     if (lp)
2819                         *lp = RX_WRAPLEN(re);
2820  
2821                     return RX_WRAPPED(re);
2822                 } else {
2823                     const char *const typestr = sv_reftype(referent, 0);
2824                     const STRLEN typelen = strlen(typestr);
2825                     UV addr = PTR2UV(referent);
2826                     const char *stashname = NULL;
2827                     STRLEN stashnamelen = 0; /* hush, gcc */
2828                     const char *buffer_end;
2829
2830                     if (SvOBJECT(referent)) {
2831                         const HEK *const name = HvNAME_HEK(SvSTASH(referent));
2832
2833                         if (name) {
2834                             stashname = HEK_KEY(name);
2835                             stashnamelen = HEK_LEN(name);
2836
2837                             if (HEK_UTF8(name)) {
2838                                 SvUTF8_on(sv);
2839                             } else {
2840                                 SvUTF8_off(sv);
2841                             }
2842                         } else {
2843                             stashname = "__ANON__";
2844                             stashnamelen = 8;
2845                         }
2846                         len = stashnamelen + 1 /* = */ + typelen + 3 /* (0x */
2847                             + 2 * sizeof(UV) + 2 /* )\0 */;
2848                     } else {
2849                         len = typelen + 3 /* (0x */
2850                             + 2 * sizeof(UV) + 2 /* )\0 */;
2851                     }
2852
2853                     Newx(buffer, len, char);
2854                     buffer_end = retval = buffer + len;
2855
2856                     /* Working backwards  */
2857                     *--retval = '\0';
2858                     *--retval = ')';
2859                     do {
2860                         *--retval = PL_hexdigit[addr & 15];
2861                     } while (addr >>= 4);
2862                     *--retval = 'x';
2863                     *--retval = '0';
2864                     *--retval = '(';
2865
2866                     retval -= typelen;
2867                     memcpy(retval, typestr, typelen);
2868
2869                     if (stashname) {
2870                         *--retval = '=';
2871                         retval -= stashnamelen;
2872                         memcpy(retval, stashname, stashnamelen);
2873                     }
2874                     /* retval may not neccesarily have reached the start of the
2875                        buffer here.  */
2876                     assert (retval >= buffer);
2877
2878                     len = buffer_end - retval - 1; /* -1 for that \0  */
2879                 }
2880                 if (lp)
2881                     *lp = len;
2882                 SAVEFREEPV(buffer);
2883                 return retval;
2884             }
2885         }
2886         if (SvREADONLY(sv) && !SvOK(sv)) {
2887             if (lp)
2888                 *lp = 0;
2889             if (flags & SV_UNDEF_RETURNS_NULL)
2890                 return NULL;
2891             if (ckWARN(WARN_UNINITIALIZED))
2892                 report_uninit(sv);
2893             return (char *)"";
2894         }
2895     }
2896     if (SvIOK(sv) || ((SvIOKp(sv) && !SvNOKp(sv)))) {
2897         /* I'm assuming that if both IV and NV are equally valid then
2898            converting the IV is going to be more efficient */
2899         const U32 isUIOK = SvIsUV(sv);
2900         char buf[TYPE_CHARS(UV)];
2901         char *ebuf, *ptr;
2902         STRLEN len;
2903
2904         if (SvTYPE(sv) < SVt_PVIV)
2905             sv_upgrade(sv, SVt_PVIV);
2906         ptr = uiv_2buf(buf, SvIVX(sv), SvUVX(sv), isUIOK, &ebuf);
2907         len = ebuf - ptr;
2908         /* inlined from sv_setpvn */
2909         s = SvGROW_mutable(sv, len + 1);
2910         Move(ptr, s, len, char);
2911         s += len;
2912         *s = '\0';
2913     }
2914     else if (SvNOKp(sv)) {
2915         dSAVE_ERRNO;
2916         if (SvTYPE(sv) < SVt_PVNV)
2917             sv_upgrade(sv, SVt_PVNV);
2918         /* The +20 is pure guesswork.  Configure test needed. --jhi */
2919         s = SvGROW_mutable(sv, NV_DIG + 20);
2920         /* some Xenix systems wipe out errno here */
2921 #ifdef apollo
2922         if (SvNVX(sv) == 0.0)
2923             my_strlcpy(s, "0", SvLEN(sv));
2924         else
2925 #endif /*apollo*/
2926         {
2927             Gconvert(SvNVX(sv), NV_DIG, 0, s);
2928         }
2929         RESTORE_ERRNO;
2930 #ifdef FIXNEGATIVEZERO
2931         if (*s == '-' && s[1] == '0' && !s[2]) {
2932             s[0] = '0';
2933             s[1] = 0;
2934         }
2935 #endif
2936         while (*s) s++;
2937 #ifdef hcx
2938         if (s[-1] == '.')
2939             *--s = '\0';
2940 #endif
2941     }
2942     else {
2943         if (isGV_with_GP(sv)) {
2944             GV *const gv = MUTABLE_GV(sv);
2945             const U32 wasfake = SvFLAGS(gv) & SVf_FAKE;
2946             SV *const buffer = sv_newmortal();
2947
2948             /* FAKE globs can get coerced, so need to turn this off temporarily
2949                if it is on.  */
2950             SvFAKE_off(gv);
2951             gv_efullname3(buffer, gv, "*");
2952             SvFLAGS(gv) |= wasfake;
2953
2954             if (SvPOK(buffer)) {
2955                 if (lp) {
2956                     *lp = SvCUR(buffer);
2957                 }
2958                 return SvPVX(buffer);
2959             }
2960             else {
2961                 if (lp)
2962                     *lp = 0;
2963                 return (char *)"";
2964             }
2965         }
2966
2967         if (lp)
2968             *lp = 0;
2969         if (flags & SV_UNDEF_RETURNS_NULL)
2970             return NULL;
2971         if (!PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP) && ckWARN(WARN_UNINITIALIZED))
2972             report_uninit(sv);
2973         if (SvTYPE(sv) < SVt_PV)
2974             /* Typically the caller expects that sv_any is not NULL now.  */
2975             sv_upgrade(sv, SVt_PV);
2976         return (char *)"";
2977     }
2978     {
2979         const STRLEN len = s - SvPVX_const(sv);
2980         if (lp) 
2981             *lp = len;
2982         SvCUR_set(sv, len);
2983     }
2984     SvPOK_on(sv);
2985     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
2986                           PTR2UV(sv),SvPVX_const(sv)));
2987     if (flags & SV_CONST_RETURN)
2988         return (char *)SvPVX_const(sv);
2989     if (flags & SV_MUTABLE_RETURN)
2990         return SvPVX_mutable(sv);
2991     return SvPVX(sv);
2992 }
2993
2994 /*
2995 =for apidoc sv_copypv
2996
2997 Copies a stringified representation of the source SV into the
2998 destination SV.  Automatically performs any necessary mg_get and
2999 coercion of numeric values into strings.  Guaranteed to preserve
3000 UTF8 flag even from overloaded objects.  Similar in nature to
3001 sv_2pv[_flags] but operates directly on an SV instead of just the
3002 string.  Mostly uses sv_2pv_flags to do its work, except when that
3003 would lose the UTF-8'ness of the PV.
3004
3005 =cut
3006 */
3007
3008 void
3009 Perl_sv_copypv(pTHX_ SV *const dsv, register SV *const ssv)
3010 {
3011     STRLEN len;
3012     const char * const s = SvPV_const(ssv,len);
3013
3014     PERL_ARGS_ASSERT_SV_COPYPV;
3015
3016     sv_setpvn(dsv,s,len);
3017     if (SvUTF8(ssv))
3018         SvUTF8_on(dsv);
3019     else
3020         SvUTF8_off(dsv);
3021 }
3022
3023 /*
3024 =for apidoc sv_2pvbyte
3025
3026 Return a pointer to the byte-encoded representation of the SV, and set *lp
3027 to its length.  May cause the SV to be downgraded from UTF-8 as a
3028 side-effect.
3029
3030 Usually accessed via the C<SvPVbyte> macro.
3031
3032 =cut
3033 */
3034
3035 char *
3036 Perl_sv_2pvbyte(pTHX_ register SV *const sv, STRLEN *const lp)
3037 {
3038     PERL_ARGS_ASSERT_SV_2PVBYTE;
3039
3040     sv_utf8_downgrade(sv,0);
3041     return lp ? SvPV(sv,*lp) : SvPV_nolen(sv);
3042 }
3043
3044 /*
3045 =for apidoc sv_2pvutf8
3046
3047 Return a pointer to the UTF-8-encoded representation of the SV, and set *lp
3048 to its length.  May cause the SV to be upgraded to UTF-8 as a side-effect.
3049
3050 Usually accessed via the C<SvPVutf8> macro.
3051
3052 =cut
3053 */
3054
3055 char *
3056 Perl_sv_2pvutf8(pTHX_ register SV *const sv, STRLEN *const lp)
3057 {
3058     PERL_ARGS_ASSERT_SV_2PVUTF8;
3059
3060     sv_utf8_upgrade(sv);
3061     return lp ? SvPV(sv,*lp) : SvPV_nolen(sv);
3062 }
3063
3064
3065 /*
3066 =for apidoc sv_2bool
3067
3068 This function is only called on magical items, and is only used by
3069 sv_true() or its macro equivalent.
3070
3071 =cut
3072 */
3073
3074 bool
3075 Perl_sv_2bool(pTHX_ register SV *const sv)
3076 {
3077     dVAR;
3078
3079     PERL_ARGS_ASSERT_SV_2BOOL;
3080
3081     SvGETMAGIC(sv);
3082
3083     if (!SvOK(sv))
3084         return 0;
3085     if (SvROK(sv)) {
3086         if (SvAMAGIC(sv)) {
3087             SV * const tmpsv = AMG_CALLun(sv,bool_);
3088             if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
3089                 return cBOOL(SvTRUE(tmpsv));
3090         }
3091         return SvRV(sv) != 0;
3092     }
3093     if (SvPOKp(sv)) {
3094         register XPV* const Xpvtmp = (XPV*)SvANY(sv);
3095         if (Xpvtmp &&
3096                 (*sv->sv_u.svu_pv > '0' ||
3097                 Xpvtmp->xpv_cur > 1 ||
3098                 (Xpvtmp->xpv_cur && *sv->sv_u.svu_pv != '0')))
3099             return 1;
3100         else
3101             return 0;
3102     }
3103     else {
3104         if (SvIOKp(sv))
3105             return SvIVX(sv) != 0;
3106         else {
3107             if (SvNOKp(sv))
3108                 return SvNVX(sv) != 0.0;
3109             else {
3110                 if (isGV_with_GP(sv))
3111                     return TRUE;
3112                 else
3113                     return FALSE;
3114             }
3115         }
3116     }
3117 }
3118
3119 /*
3120 =for apidoc sv_utf8_upgrade
3121
3122 Converts the PV of an SV to its UTF-8-encoded form.
3123 Forces the SV to string form if it is not already.
3124 Will C<mg_get> on C<sv> if appropriate.
3125 Always sets the SvUTF8 flag to avoid future validity checks even
3126 if the whole string is the same in UTF-8 as not.
3127 Returns the number of bytes in the converted string
3128
3129 This is not as a general purpose byte encoding to Unicode interface:
3130 use the Encode extension for that.
3131
3132 =for apidoc sv_utf8_upgrade_nomg
3133
3134 Like sv_utf8_upgrade, but doesn't do magic on C<sv>
3135
3136 =for apidoc sv_utf8_upgrade_flags
3137
3138 Converts the PV of an SV to its UTF-8-encoded form.
3139 Forces the SV to string form if it is not already.
3140 Always sets the SvUTF8 flag to avoid future validity checks even
3141 if all the bytes are invariant in UTF-8. If C<flags> has C<SV_GMAGIC> bit set,
3142 will C<mg_get> on C<sv> if appropriate, else not.
3143 Returns the number of bytes in the converted string
3144 C<sv_utf8_upgrade> and
3145 C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
3146
3147 This is not as a general purpose byte encoding to Unicode interface:
3148 use the Encode extension for that.
3149
3150 =cut
3151
3152 The grow version is currently not externally documented.  It adds a parameter,
3153 extra, which is the number of unused bytes the string of 'sv' is guaranteed to
3154 have free after it upon return.  This allows the caller to reserve extra space
3155 that it intends to fill, to avoid extra grows.
3156
3157 Also externally undocumented for the moment is the flag SV_FORCE_UTF8_UPGRADE,
3158 which can be used to tell this function to not first check to see if there are
3159 any characters that are different in UTF-8 (variant characters) which would
3160 force it to allocate a new string to sv, but to assume there are.  Typically
3161 this flag is used by a routine that has already parsed the string to find that
3162 there are such characters, and passes this information on so that the work
3163 doesn't have to be repeated.
3164
3165 (One might think that the calling routine could pass in the position of the
3166 first such variant, so it wouldn't have to be found again.  But that is not the
3167 case, because typically when the caller is likely to use this flag, it won't be
3168 calling this routine unless it finds something that won't fit into a byte.
3169 Otherwise it tries to not upgrade and just use bytes.  But some things that
3170 do fit into a byte are variants in utf8, and the caller may not have been
3171 keeping track of these.)
3172
3173 If the routine itself changes the string, it adds a trailing NUL.  Such a NUL
3174 isn't guaranteed due to having other routines do the work in some input cases,
3175 or if the input is already flagged as being in utf8.
3176
3177 The speed of this could perhaps be improved for many cases if someone wanted to
3178 write a fast function that counts the number of variant characters in a string,
3179 especially if it could return the position of the first one.
3180
3181 */
3182
3183 STRLEN
3184 Perl_sv_utf8_upgrade_flags_grow(pTHX_ register SV *const sv, const I32 flags, STRLEN extra)
3185 {
3186     dVAR;
3187
3188     PERL_ARGS_ASSERT_SV_UTF8_UPGRADE_FLAGS_GROW;
3189
3190     if (sv == &PL_sv_undef)
3191         return 0;
3192     if (!SvPOK(sv)) {
3193         STRLEN len = 0;
3194         if (SvREADONLY(sv) && (SvPOKp(sv) || SvIOKp(sv) || SvNOKp(sv))) {
3195             (void) sv_2pv_flags(sv,&len, flags);
3196             if (SvUTF8(sv)) {
3197                 if (extra) SvGROW(sv, SvCUR(sv) + extra);
3198                 return len;
3199             }
3200         } else {
3201             (void) SvPV_force(sv,len);
3202         }
3203     }
3204
3205     if (SvUTF8(sv)) {
3206         if (extra) SvGROW(sv, SvCUR(sv) + extra);
3207         return SvCUR(sv);
3208     }
3209
3210     if (SvIsCOW(sv)) {
3211         sv_force_normal_flags(sv, 0);
3212     }
3213
3214     if (PL_encoding && !(flags & SV_UTF8_NO_ENCODING)) {
3215         sv_recode_to_utf8(sv, PL_encoding);
3216         if (extra) SvGROW(sv, SvCUR(sv) + extra);
3217         return SvCUR(sv);
3218     }
3219
3220     if (SvCUR(sv) == 0) {
3221         if (extra) SvGROW(sv, extra);
3222     } else { /* Assume Latin-1/EBCDIC */
3223         /* This function could be much more efficient if we
3224          * had a FLAG in SVs to signal if there are any variant
3225          * chars in the PV.  Given that there isn't such a flag
3226          * make the loop as fast as possible (although there are certainly ways
3227          * to speed this up, eg. through vectorization) */
3228         U8 * s = (U8 *) SvPVX_const(sv);
3229         U8 * e = (U8 *) SvEND(sv);
3230         U8 *t = s;
3231         STRLEN two_byte_count = 0;
3232         
3233         if (flags & SV_FORCE_UTF8_UPGRADE) goto must_be_utf8;
3234
3235         /* See if really will need to convert to utf8.  We mustn't rely on our
3236          * incoming SV being well formed and having a trailing '\0', as certain
3237          * code in pp_formline can send us partially built SVs. */
3238
3239         while (t < e) {
3240             const U8 ch = *t++;
3241             if (NATIVE_IS_INVARIANT(ch)) continue;
3242
3243             t--;    /* t already incremented; re-point to first variant */
3244             two_byte_count = 1;
3245             goto must_be_utf8;
3246         }
3247
3248         /* utf8 conversion not needed because all are invariants.  Mark as
3249          * UTF-8 even if no variant - saves scanning loop */
3250         SvUTF8_on(sv);
3251         return SvCUR(sv);
3252
3253 must_be_utf8:
3254
3255         /* Here, the string should be converted to utf8, either because of an
3256          * input flag (two_byte_count = 0), or because a character that
3257          * requires 2 bytes was found (two_byte_count = 1).  t points either to
3258          * the beginning of the string (if we didn't examine anything), or to
3259          * the first variant.  In either case, everything from s to t - 1 will
3260          * occupy only 1 byte each on output.
3261          *
3262          * There are two main ways to convert.  One is to create a new string
3263          * and go through the input starting from the beginning, appending each
3264          * converted value onto the new string as we go along.  It's probably
3265          * best to allocate enough space in the string for the worst possible
3266          * case rather than possibly running out of space and having to
3267          * reallocate and then copy what we've done so far.  Since everything
3268          * from s to t - 1 is invariant, the destination can be initialized
3269          * with these using a fast memory copy
3270          *
3271          * The other way is to figure out exactly how big the string should be
3272          * by parsing the entire input.  Then you don't have to make it big
3273          * enough to handle the worst possible case, and more importantly, if
3274          * the string you already have is large enough, you don't have to
3275          * allocate a new string, you can copy the last character in the input
3276          * string to the final position(s) that will be occupied by the
3277          * converted string and go backwards, stopping at t, since everything
3278          * before that is invariant.
3279          *
3280          * There are advantages and disadvantages to each method.
3281          *
3282          * In the first method, we can allocate a new string, do the memory
3283          * copy from the s to t - 1, and then proceed through the rest of the
3284          * string byte-by-byte.
3285          *
3286          * In the second method, we proceed through the rest of the input
3287          * string just calculating how big the converted string will be.  Then
3288          * there are two cases:
3289          *  1)  if the string has enough extra space to handle the converted
3290          *      value.  We go backwards through the string, converting until we
3291          *      get to the position we are at now, and then stop.  If this
3292          *      position is far enough along in the string, this method is
3293          *      faster than the other method.  If the memory copy were the same
3294          *      speed as the byte-by-byte loop, that position would be about
3295          *      half-way, as at the half-way mark, parsing to the end and back
3296          *      is one complete string's parse, the same amount as starting
3297          *      over and going all the way through.  Actually, it would be
3298          *      somewhat less than half-way, as it's faster to just count bytes
3299          *      than to also copy, and we don't have the overhead of allocating
3300          *      a new string, changing the scalar to use it, and freeing the
3301          *      existing one.  But if the memory copy is fast, the break-even
3302          *      point is somewhere after half way.  The counting loop could be
3303          *      sped up by vectorization, etc, to move the break-even point
3304          *      further towards the beginning.
3305          *  2)  if the string doesn't have enough space to handle the converted
3306          *      value.  A new string will have to be allocated, and one might
3307          *      as well, given that, start from the beginning doing the first
3308          *      method.  We've spent extra time parsing the string and in
3309          *      exchange all we've gotten is that we know precisely how big to
3310          *      make the new one.  Perl is more optimized for time than space,
3311          *      so this case is a loser.
3312          * So what I've decided to do is not use the 2nd method unless it is
3313          * guaranteed that a new string won't have to be allocated, assuming
3314          * the worst case.  I also decided not to put any more conditions on it
3315          * than this, for now.  It seems likely that, since the worst case is
3316          * twice as big as the unknown portion of the string (plus 1), we won't
3317          * be guaranteed enough space, causing us to go to the first method,
3318          * unless the string is short, or the first variant character is near
3319          * the end of it.  In either of these cases, it seems best to use the
3320          * 2nd method.  The only circumstance I can think of where this would
3321          * be really slower is if the string had once had much more data in it
3322          * than it does now, but there is still a substantial amount in it  */
3323
3324         {
3325             STRLEN invariant_head = t - s;
3326             STRLEN size = invariant_head + (e - t) * 2 + 1 + extra;
3327             if (SvLEN(sv) < size) {
3328
3329                 /* Here, have decided to allocate a new string */
3330
3331                 U8 *dst;
3332                 U8 *d;
3333
3334                 Newx(dst, size, U8);
3335
3336                 /* If no known invariants at the beginning of the input string,
3337                  * set so starts from there.  Otherwise, can use memory copy to
3338                  * get up to where we are now, and then start from here */
3339
3340                 if (invariant_head <= 0) {
3341                     d = dst;
3342                 } else {
3343                     Copy(s, dst, invariant_head, char);
3344                     d = dst + invariant_head;
3345                 }
3346
3347                 while (t < e) {
3348                     const UV uv = NATIVE8_TO_UNI(*t++);
3349                     if (UNI_IS_INVARIANT(uv))
3350                         *d++ = (U8)UNI_TO_NATIVE(uv);
3351                     else {
3352                         *d++ = (U8)UTF8_EIGHT_BIT_HI(uv);
3353                         *d++ = (U8)UTF8_EIGHT_BIT_LO(uv);
3354                     }
3355                 }
3356                 *d = '\0';
3357                 SvPV_free(sv); /* No longer using pre-existing string */
3358                 SvPV_set(sv, (char*)dst);
3359                 SvCUR_set(sv, d - dst);
3360                 SvLEN_set(sv, size);
3361             } else {
3362
3363                 /* Here, have decided to get the exact size of the string.
3364                  * Currently this happens only when we know that there is
3365                  * guaranteed enough space to fit the converted string, so
3366                  * don't have to worry about growing.  If two_byte_count is 0,
3367                  * then t points to the first byte of the string which hasn't
3368                  * been examined yet.  Otherwise two_byte_count is 1, and t
3369                  * points to the first byte in the string that will expand to
3370                  * two.  Depending on this, start examining at t or 1 after t.
3371                  * */
3372
3373                 U8 *d = t + two_byte_count;
3374
3375
3376                 /* Count up the remaining bytes that expand to two */
3377
3378                 while (d < e) {
3379                     const U8 chr = *d++;
3380                     if (! NATIVE_IS_INVARIANT(chr)) two_byte_count++;
3381                 }
3382
3383                 /* The string will expand by just the number of bytes that
3384                  * occupy two positions.  But we are one afterwards because of
3385                  * the increment just above.  This is the place to put the
3386                  * trailing NUL, and to set the length before we decrement */
3387
3388                 d += two_byte_count;
3389                 SvCUR_set(sv, d - s);
3390                 *d-- = '\0';
3391
3392
3393                 /* Having decremented d, it points to the position to put the
3394                  * very last byte of the expanded string.  Go backwards through
3395                  * the string, copying and expanding as we go, stopping when we
3396                  * get to the part that is invariant the rest of the way down */
3397
3398                 e--;
3399                 while (e >= t) {
3400                     const U8 ch = NATIVE8_TO_UNI(*e--);
3401                     if (UNI_IS_INVARIANT(ch)) {
3402                         *d-- = UNI_TO_NATIVE(ch);
3403                     } else {
3404                         *d-- = (U8)UTF8_EIGHT_BIT_LO(ch);
3405                         *d-- = (U8)UTF8_EIGHT_BIT_HI(ch);
3406                     }
3407                 }
3408             }
3409         }
3410     }
3411
3412     /* Mark as UTF-8 even if no variant - saves scanning loop */
3413     SvUTF8_on(sv);
3414     return SvCUR(sv);
3415 }
3416
3417 /*
3418 =for apidoc sv_utf8_downgrade
3419
3420 Attempts to convert the PV of an SV from characters to bytes.
3421 If the PV contains a character that cannot fit
3422 in a byte, this conversion will fail;
3423 in this case, either returns false or, if C<fail_ok> is not
3424 true, croaks.
3425
3426 This is not as a general purpose Unicode to byte encoding interface:
3427 use the Encode extension for that.
3428
3429 =cut
3430 */
3431
3432 bool
3433 Perl_sv_utf8_downgrade(pTHX_ register SV *const sv, const bool fail_ok)
3434 {
3435     dVAR;
3436
3437     PERL_ARGS_ASSERT_SV_UTF8_DOWNGRADE;
3438
3439     if (SvPOKp(sv) && SvUTF8(sv)) {
3440         if (SvCUR(sv)) {
3441             U8 *s;
3442             STRLEN len;
3443
3444             if (SvIsCOW(sv)) {
3445                 sv_force_normal_flags(sv, 0);
3446             }
3447             s = (U8 *) SvPV(sv, len);
3448             if (!utf8_to_bytes(s, &len)) {
3449                 if (fail_ok)
3450                     return FALSE;
3451                 else {
3452                     if (PL_op)
3453                         Perl_croak(aTHX_ "Wide character in %s",
3454                                    OP_DESC(PL_op));
3455                     else
3456                         Perl_croak(aTHX_ "Wide character");
3457                 }
3458             }
3459             SvCUR_set(sv, len);
3460         }
3461     }
3462     SvUTF8_off(sv);
3463     return TRUE;
3464 }
3465
3466 /*
3467 =for apidoc sv_utf8_encode
3468
3469 Converts the PV of an SV to UTF-8, but then turns the C<SvUTF8>
3470 flag off so that it looks like octets again.
3471
3472 =cut
3473 */
3474
3475 void
3476 Perl_sv_utf8_encode(pTHX_ register SV *const sv)
3477 {
3478     PERL_ARGS_ASSERT_SV_UTF8_ENCODE;
3479
3480     if (SvIsCOW(sv)) {
3481         sv_force_normal_flags(sv, 0);
3482     }
3483     if (SvREADONLY(sv)) {
3484         Perl_croak_no_modify(aTHX);
3485     }
3486     (void) sv_utf8_upgrade(sv);
3487     SvUTF8_off(sv);
3488 }
3489
3490 /*
3491 =for apidoc sv_utf8_decode
3492
3493 If the PV of the SV is an octet sequence in UTF-8
3494 and contains a multiple-byte character, the C<SvUTF8> flag is turned on
3495 so that it looks like a character. If the PV contains only single-byte
3496 characters, the C<SvUTF8> flag stays being off.
3497 Scans PV for validity and returns false if the PV is invalid UTF-8.
3498
3499 =cut
3500 */
3501
3502 bool
3503 Perl_sv_utf8_decode(pTHX_ register SV *const sv)
3504 {
3505     PERL_ARGS_ASSERT_SV_UTF8_DECODE;
3506
3507     if (SvPOKp(sv)) {
3508         const U8 *c;
3509         const U8 *e;
3510
3511         /* The octets may have got themselves encoded - get them back as
3512          * bytes
3513          */
3514         if (!sv_utf8_downgrade(sv, TRUE))
3515             return FALSE;
3516
3517         /* it is actually just a matter of turning the utf8 flag on, but
3518          * we want to make sure everything inside is valid utf8 first.
3519          */
3520         c = (const U8 *) SvPVX_const(sv);
3521         if (!is_utf8_string(c, SvCUR(sv)+1))
3522             return FALSE;
3523         e = (const U8 *) SvEND(sv);
3524         while (c < e) {
3525             const U8 ch = *c++;
3526             if (!UTF8_IS_INVARIANT(ch)) {
3527                 SvUTF8_on(sv);
3528                 break;
3529             }
3530         }
3531     }
3532     return TRUE;
3533 }
3534
3535 /*
3536 =for apidoc sv_setsv
3537
3538 Copies the contents of the source SV C<ssv> into the destination SV
3539 C<dsv>.  The source SV may be destroyed if it is mortal, so don't use this
3540 function if the source SV needs to be reused. Does not handle 'set' magic.
3541 Loosely speaking, it performs a copy-by-value, obliterating any previous
3542 content of the destination.
3543
3544 You probably want to use one of the assortment of wrappers, such as
3545 C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3546 C<SvSetMagicSV_nosteal>.
3547
3548 =for apidoc sv_setsv_flags
3549
3550 Copies the contents of the source SV C<ssv> into the destination SV
3551 C<dsv>.  The source SV may be destroyed if it is mortal, so don't use this
3552 function if the source SV needs to be reused. Does not handle 'set' magic.
3553 Loosely speaking, it performs a copy-by-value, obliterating any previous
3554 content of the destination.
3555 If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
3556 C<ssv> if appropriate, else not. If the C<flags> parameter has the
3557 C<NOSTEAL> bit set then the buffers of temps will not be stolen. <sv_setsv>
3558 and C<sv_setsv_nomg> are implemented in terms of this function.
3559
3560 You probably want to use one of the assortment of wrappers, such as
3561 C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3562 C<SvSetMagicSV_nosteal>.
3563
3564 This is the primary function for copying scalars, and most other
3565 copy-ish functions and macros use this underneath.
3566
3567 =cut
3568 */
3569
3570 static void
3571 S_glob_assign_glob(pTHX_ SV *const dstr, SV *const sstr, const int dtype)
3572 {
3573     I32 mro_changes = 0; /* 1 = method, 2 = isa */
3574
3575     PERL_ARGS_ASSERT_GLOB_ASSIGN_GLOB;
3576
3577     if (dtype != SVt_PVGV) {
3578         const char * const name = GvNAME(sstr);
3579         const STRLEN len = GvNAMELEN(sstr);
3580         {
3581             if (dtype >= SVt_PV) {
3582                 SvPV_free(dstr);
3583                 SvPV_set(dstr, 0);
3584                 SvLEN_set(dstr, 0);
3585                 SvCUR_set(dstr, 0);
3586             }
3587             SvUPGRADE(dstr, SVt_PVGV);
3588             (void)SvOK_off(dstr);
3589             /* FIXME - why are we doing this, then turning it off and on again
3590                below?  */
3591             isGV_with_GP_on(dstr);
3592         }
3593         GvSTASH(dstr) = GvSTASH(sstr);
3594         if (GvSTASH(dstr))
3595             Perl_sv_add_backref(aTHX_ MUTABLE_SV(GvSTASH(dstr)), dstr);
3596         gv_name_set(MUTABLE_GV(dstr), name, len, GV_ADD);
3597         SvFAKE_on(dstr);        /* can coerce to non-glob */
3598     }
3599
3600     if(GvGP(MUTABLE_GV(sstr))) {
3601         /* If source has method cache entry, clear it */
3602         if(GvCVGEN(sstr)) {
3603             SvREFCNT_dec(GvCV(sstr));
3604             GvCV(sstr) = NULL;
3605             GvCVGEN(sstr) = 0;
3606         }
3607         /* If source has a real method, then a method is
3608            going to change */
3609         else if(GvCV((const GV *)sstr)) {
3610             mro_changes = 1;
3611         }
3612     }
3613
3614     /* If dest already had a real method, that's a change as well */
3615     if(!mro_changes && GvGP(MUTABLE_GV(dstr)) && GvCVu((const GV *)dstr)) {
3616         mro_changes = 1;
3617     }
3618
3619     if(strEQ(GvNAME((const GV *)dstr),"ISA"))
3620         mro_changes = 2;
3621
3622     gp_free(MUTABLE_GV(dstr));
3623     isGV_with_GP_off(dstr);
3624     (void)SvOK_off(dstr);
3625     isGV_with_GP_on(dstr);
3626     GvINTRO_off(dstr);          /* one-shot flag */
3627     GvGP(dstr) = gp_ref(GvGP(sstr));
3628     if (SvTAINTED(sstr))
3629         SvTAINT(dstr);
3630     if (GvIMPORTED(dstr) != GVf_IMPORTED
3631         && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3632         {
3633             GvIMPORTED_on(dstr);
3634         }
3635     GvMULTI_on(dstr);
3636     if(mro_changes == 2) mro_isa_changed_in(GvSTASH(dstr));
3637     else if(mro_changes) mro_method_changed_in(GvSTASH(dstr));
3638     return;
3639 }
3640
3641 static void
3642 S_glob_assign_ref(pTHX_ SV *const dstr, SV *const sstr)
3643 {
3644     SV * const sref = SvREFCNT_inc(SvRV(sstr));
3645     SV *dref = NULL;
3646     const int intro = GvINTRO(dstr);
3647     SV **location;
3648     U8 import_flag = 0;
3649     const U32 stype = SvTYPE(sref);
3650
3651     PERL_ARGS_ASSERT_GLOB_ASSIGN_REF;
3652
3653     if (intro) {
3654         GvINTRO_off(dstr);      /* one-shot flag */
3655         GvLINE(dstr) = CopLINE(PL_curcop);
3656         GvEGV(dstr) = MUTABLE_GV(dstr);
3657     }
3658     GvMULTI_on(dstr);
3659     switch (stype) {
3660     case SVt_PVCV:
3661         location = (SV **) &GvCV(dstr);
3662         import_flag = GVf_IMPORTED_CV;
3663         goto common;
3664     case SVt_PVHV:
3665         location = (SV **) &GvHV(dstr);
3666         import_flag = GVf_IMPORTED_HV;
3667         goto common;
3668     case SVt_PVAV:
3669         location = (SV **) &GvAV(dstr);
3670         import_flag = GVf_IMPORTED_AV;
3671         goto common;
3672     case SVt_PVIO:
3673         location = (SV **) &GvIOp(dstr);
3674         goto common;
3675     case SVt_PVFM:
3676         location = (SV **) &GvFORM(dstr);
3677         goto common;
3678     default:
3679         location = &GvSV(dstr);
3680         import_flag = GVf_IMPORTED_SV;
3681     common:
3682         if (intro) {
3683             if (stype == SVt_PVCV) {
3684                 /*if (GvCVGEN(dstr) && (GvCV(dstr) != (const CV *)sref || GvCVGEN(dstr))) {*/
3685                 if (GvCVGEN(dstr)) {
3686                     SvREFCNT_dec(GvCV(dstr));
3687                     GvCV(dstr) = NULL;
3688                     GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3689                 }
3690             }
3691             SAVEGENERICSV(*location);
3692         }
3693         else
3694             dref = *location;
3695         if (stype == SVt_PVCV && (*location != sref || GvCVGEN(dstr))) {
3696             CV* const cv = MUTABLE_CV(*location);
3697             if (cv) {
3698                 if (!GvCVGEN((const GV *)dstr) &&
3699                     (CvROOT(cv) || CvXSUB(cv)))
3700                     {
3701                         /* Redefining a sub - warning is mandatory if
3702                            it was a const and its value changed. */
3703                         if (CvCONST(cv) && CvCONST((const CV *)sref)
3704                             && cv_const_sv(cv)
3705                             == cv_const_sv((const CV *)sref)) {
3706                             NOOP;
3707                             /* They are 2 constant subroutines generated from
3708                                the same constant. This probably means that
3709                                they are really the "same" proxy subroutine
3710                                instantiated in 2 places. Most likely this is
3711                                when a constant is exported twice.  Don't warn.
3712                             */
3713                         }
3714                         else if (ckWARN(WARN_REDEFINE)
3715                                  || (CvCONST(cv)
3716                                      && (!CvCONST((const CV *)sref)
3717                                          || sv_cmp(cv_const_sv(cv),
3718                                                    cv_const_sv((const CV *)
3719                                                                sref))))) {
3720                             Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
3721                                         (const char *)
3722                                         (CvCONST(cv)
3723                                          ? "Constant subroutine %s::%s redefined"
3724                                          : "Subroutine %s::%s redefined"),
3725                                         HvNAME_get(GvSTASH((const GV *)dstr)),
3726                                         GvENAME(MUTABLE_GV(dstr)));
3727                         }
3728                     }
3729                 if (!intro)
3730                     cv_ckproto_len(cv, (const GV *)dstr,
3731                                    SvPOK(sref) ? SvPVX_const(sref) : NULL,
3732                                    SvPOK(sref) ? SvCUR(sref) : 0);
3733             }
3734             GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3735             GvASSUMECV_on(dstr);
3736             if(GvSTASH(dstr)) mro_method_changed_in(GvSTASH(dstr)); /* sub foo { 1 } sub bar { 2 } *bar = \&foo */
3737         }
3738         *location = sref;
3739         if (import_flag && !(GvFLAGS(dstr) & import_flag)
3740             && CopSTASH_ne(PL_curcop, GvSTASH(dstr))) {
3741             GvFLAGS(dstr) |= import_flag;
3742         }
3743         if (stype == SVt_PVAV && strEQ(GvNAME((GV*)dstr), "ISA")) {
3744             sv_magic(sref, dstr, PERL_MAGIC_isa, NULL, 0);
3745             mro_isa_changed_in(GvSTASH(dstr));
3746         }
3747         break;
3748     }
3749     SvREFCNT_dec(dref);
3750     if (SvTAINTED(sstr))
3751         SvTAINT(dstr);
3752     return;
3753 }
3754
3755 void
3756 Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV* sstr, const I32 flags)
3757 {
3758     dVAR;
3759     register U32 sflags;
3760     register int dtype;
3761     register svtype stype;
3762
3763     PERL_ARGS_ASSERT_SV_SETSV_FLAGS;
3764
3765     if (sstr == dstr)
3766         return;
3767
3768     if (SvIS_FREED(dstr)) {
3769         Perl_croak(aTHX_ "panic: attempt to copy value %" SVf
3770                    " to a freed scalar %p", SVfARG(sstr), (void *)dstr);
3771     }
3772     SV_CHECK_THINKFIRST_COW_DROP(dstr);
3773     if (!sstr)
3774         sstr = &PL_sv_undef;
3775     if (SvIS_FREED(sstr)) {
3776         Perl_croak(aTHX_ "panic: attempt to copy freed scalar %p to %p",
3777                    (void*)sstr, (void*)dstr);
3778     }
3779     stype = SvTYPE(sstr);
3780     dtype = SvTYPE(dstr);
3781
3782     (void)SvAMAGIC_off(dstr);
3783     if ( SvVOK(dstr) )
3784     {
3785         /* need to nuke the magic */
3786         mg_free(dstr);
3787     }
3788
3789     /* There's a lot of redundancy below but we're going for speed here */
3790
3791     switch (stype) {
3792     case SVt_NULL:
3793       undef_sstr:
3794         if (dtype != SVt_PVGV) {
3795             (void)SvOK_off(dstr);
3796             return;
3797         }
3798         break;
3799     case SVt_IV:
3800         if (SvIOK(sstr)) {
3801             switch (dtype) {
3802             case SVt_NULL:
3803                 sv_upgrade(dstr, SVt_IV);
3804                 break;
3805             case SVt_NV:
3806             case SVt_PV:
3807                 sv_upgrade(dstr, SVt_PVIV);
3808                 break;
3809             case SVt_PVGV:
3810                 goto end_of_first_switch;
3811             }
3812             (void)SvIOK_only(dstr);
3813             SvIV_set(dstr,  SvIVX(sstr));
3814             if (SvIsUV(sstr))
3815                 SvIsUV_on(dstr);
3816             /* SvTAINTED can only be true if the SV has taint magic, which in
3817                turn means that the SV type is PVMG (or greater). This is the
3818                case statement for SVt_IV, so this cannot be true (whatever gcov
3819                may say).  */
3820             assert(!SvTAINTED(sstr));
3821             return;
3822         }
3823         if (!SvROK(sstr))
3824             goto undef_sstr;
3825         if (dtype < SVt_PV && dtype != SVt_IV)
3826             sv_upgrade(dstr, SVt_IV);
3827         break;
3828
3829     case SVt_NV:
3830         if (SvNOK(sstr)) {
3831             switch (dtype) {
3832             case SVt_NULL:
3833             case SVt_IV:
3834                 sv_upgrade(dstr, SVt_NV);
3835                 break;
3836             case SVt_PV:
3837             case SVt_PVIV:
3838                 sv_upgrade(dstr, SVt_PVNV);
3839                 break;
3840             case SVt_PVGV:
3841                 goto end_of_first_switch;
3842             }
3843             SvNV_set(dstr, SvNVX(sstr));
3844             (void)SvNOK_only(dstr);
3845             /* SvTAINTED can only be true if the SV has taint magic, which in
3846                turn means that the SV type is PVMG (or greater). This is the
3847                case statement for SVt_NV, so this cannot be true (whatever gcov
3848                may say).  */
3849             assert(!SvTAINTED(sstr));
3850             return;
3851         }
3852         goto undef_sstr;
3853
3854     case SVt_PVFM:
3855 #ifdef PERL_OLD_COPY_ON_WRITE
3856         if ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS) {
3857             if (dtype < SVt_PVIV)
3858                 sv_upgrade(dstr, SVt_PVIV);
3859             break;
3860         }
3861         /* Fall through */
3862 #endif
3863     case SVt_PV:
3864         if (dtype < SVt_PV)
3865             sv_upgrade(dstr, SVt_PV);
3866         break;
3867     case SVt_PVIV:
3868         if (dtype < SVt_PVIV)
3869             sv_upgrade(dstr, SVt_PVIV);
3870         break;
3871     case SVt_PVNV:
3872         if (dtype < SVt_PVNV)
3873             sv_upgrade(dstr, SVt_PVNV);
3874         break;
3875     default:
3876         {
3877         const char * const type = sv_reftype(sstr,0);
3878         if (PL_op)
3879             Perl_croak(aTHX_ "Bizarre copy of %s in %s", type, OP_DESC(PL_op));
3880         else
3881             Perl_croak(aTHX_ "Bizarre copy of %s", type);
3882         }
3883         break;
3884
3885     case SVt_REGEXP:
3886         if (dtype < SVt_REGEXP)
3887             sv_upgrade(dstr, SVt_REGEXP);
3888         break;
3889
3890         /* case SVt_BIND: */
3891     case SVt_PVLV:
3892     case SVt_PVGV:
3893         if (isGV_with_GP(sstr) && dtype <= SVt_PVGV) {
3894             glob_assign_glob(dstr, sstr, dtype);
3895             return;
3896         }
3897         /* SvVALID means that this PVGV is playing at being an FBM.  */
3898         /*FALLTHROUGH*/
3899
3900     case SVt_PVMG:
3901         if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
3902             mg_get(sstr);
3903             if (SvTYPE(sstr) != stype) {
3904                 stype = SvTYPE(sstr);
3905                 if (isGV_with_GP(sstr) && stype == SVt_PVGV && dtype <= SVt_PVGV) {
3906                     glob_assign_glob(dstr, sstr, dtype);
3907                     return;
3908                 }
3909             }
3910         }
3911         if (stype == SVt_PVLV)
3912             SvUPGRADE(dstr, SVt_PVNV);
3913         else
3914             SvUPGRADE(dstr, (svtype)stype);
3915     }
3916  end_of_first_switch:
3917
3918     /* dstr may have been upgraded.  */
3919     dtype = SvTYPE(dstr);
3920     sflags = SvFLAGS(sstr);
3921
3922     if (dtype == SVt_PVCV || dtype == SVt_PVFM) {
3923         /* Assigning to a subroutine sets the prototype.  */
3924         if (SvOK(sstr)) {
3925             STRLEN len;
3926             const char *const ptr = SvPV_const(sstr, len);
3927
3928             SvGROW(dstr, len + 1);
3929             Copy(ptr, SvPVX(dstr), len + 1, char);
3930             SvCUR_set(dstr, len);
3931             SvPOK_only(dstr);
3932             SvFLAGS(dstr) |= sflags & SVf_UTF8;
3933         } else {
3934             SvOK_off(dstr);
3935         }
3936     } else if (dtype == SVt_PVAV || dtype == SVt_PVHV) {
3937         const char * const type = sv_reftype(dstr,0);
3938         if (PL_op)
3939             Perl_croak(aTHX_ "Cannot copy to %s in %s", type, OP_DESC(PL_op));
3940         else
3941             Perl_croak(aTHX_ "Cannot copy to %s", type);
3942     } else if (sflags & SVf_ROK) {
3943         if (isGV_with_GP(dstr) && dtype == SVt_PVGV
3944             && SvTYPE(SvRV(sstr)) == SVt_PVGV && isGV_with_GP(SvRV(sstr))) {
3945             sstr = SvRV(sstr);
3946             if (sstr == dstr) {
3947                 if (GvIMPORTED(dstr) != GVf_IMPORTED
3948                     && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3949                 {
3950                     GvIMPORTED_on(dstr);
3951                 }
3952                 GvMULTI_on(dstr);
3953                 return;
3954             }
3955             glob_assign_glob(dstr, sstr, dtype);
3956             return;
3957         }
3958
3959         if (dtype >= SVt_PV) {
3960             if (dtype == SVt_PVGV && isGV_with_GP(dstr)) {
3961                 glob_assign_ref(dstr, sstr);
3962                 return;
3963             }
3964             if (SvPVX_const(dstr)) {
3965                 SvPV_free(dstr);
3966                 SvLEN_set(dstr, 0);
3967                 SvCUR_set(dstr, 0);
3968             }
3969         }
3970         (void)SvOK_off(dstr);
3971         SvRV_set(dstr, SvREFCNT_inc(SvRV(sstr)));
3972         SvFLAGS(dstr) |= sflags & SVf_ROK;
3973         assert(!(sflags & SVp_NOK));
3974         assert(!(sflags & SVp_IOK));
3975         assert(!(sflags & SVf_NOK));
3976         assert(!(sflags & SVf_IOK));
3977     }
3978     else if (dtype == SVt_PVGV && isGV_with_GP(dstr)) {
3979         if (!(sflags & SVf_OK)) {
3980             Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
3981                            "Undefined value assigned to typeglob");
3982         }
3983         else {
3984             GV *gv = gv_fetchsv(sstr, GV_ADD, SVt_PVGV);
3985             if (dstr != (const SV *)gv) {
3986                 if (GvGP(dstr))
3987                     gp_free(MUTABLE_GV(dstr));
3988                 GvGP(dstr) = gp_ref(GvGP(gv));
3989             }
3990         }
3991     }
3992     else if (dtype == SVt_REGEXP && stype == SVt_REGEXP) {
3993         reg_temp_copy((REGEXP*)dstr, (REGEXP*)sstr);
3994     }
3995     else if (sflags & SVp_POK) {
3996         bool isSwipe = 0;
3997
3998         /*
3999          * Check to see if we can just swipe the string.  If so, it's a
4000          * possible small lose on short strings, but a big win on long ones.
4001          * It might even be a win on short strings if SvPVX_const(dstr)
4002          * has to be allocated and SvPVX_const(sstr) has to be freed.
4003          * Likewise if we can set up COW rather than doing an actual copy, we
4004          * drop to the else clause, as the swipe code and the COW setup code
4005          * have much in common.
4006          */
4007
4008         /* Whichever path we take through the next code, we want this true,
4009            and doing it now facilitates the COW check.  */
4010         (void)SvPOK_only(dstr);
4011
4012         if (
4013             /* If we're already COW then this clause is not true, and if COW
4014                is allowed then we drop down to the else and make dest COW 
4015                with us.  If caller hasn't said that we're allowed to COW
4016                shared hash keys then we don't do the COW setup, even if the
4017                source scalar is a shared hash key scalar.  */
4018             (((flags & SV_COW_SHARED_HASH_KEYS)
4019                ? (sflags & (SVf_FAKE|SVf_READONLY)) != (SVf_FAKE|SVf_READONLY)
4020                : 1 /* If making a COW copy is forbidden then the behaviour we
4021                        desire is as if the source SV isn't actually already
4022                        COW, even if it is.  So we act as if the source flags
4023                        are not COW, rather than actually testing them.  */
4024               )
4025 #ifndef PERL_OLD_COPY_ON_WRITE
4026              /* The change that added SV_COW_SHARED_HASH_KEYS makes the logic
4027                 when PERL_OLD_COPY_ON_WRITE is defined a little wrong.
4028                 Conceptually PERL_OLD_COPY_ON_WRITE being defined should
4029                 override SV_COW_SHARED_HASH_KEYS, because it means "always COW"
4030                 but in turn, it's somewhat dead code, never expected to go
4031                 live, but more kept as a placeholder on how to do it better
4032                 in a newer implementation.  */
4033              /* If we are COW and dstr is a suitable target then we drop down
4034                 into the else and make dest a COW of us.  */
4035              || (SvFLAGS(dstr) & CAN_COW_MASK) != CAN_COW_FLAGS
4036 #endif
4037              )
4038             &&
4039             !(isSwipe =
4040                  (sflags & SVs_TEMP) &&   /* slated for free anyway? */
4041                  !(sflags & SVf_OOK) &&   /* and not involved in OOK hack? */
4042                  (!(flags & SV_NOSTEAL)) &&
4043                                         /* and we're allowed to steal temps */
4044                  SvREFCNT(sstr) == 1 &&   /* and no other references to it? */
4045                  SvLEN(sstr))             /* and really is a string */
4046 #ifdef PERL_OLD_COPY_ON_WRITE
4047             && ((flags & SV_COW_SHARED_HASH_KEYS)
4048                 ? (!((sflags & CAN_COW_MASK) == CAN_COW_FLAGS
4049                      && (SvFLAGS(dstr) & CAN_COW_MASK) == CAN_COW_FLAGS
4050                      && SvTYPE(sstr) >= SVt_PVIV && SvTYPE(sstr) != SVt_PVFM))
4051                 : 1)
4052 #endif
4053             ) {
4054             /* Failed the swipe test, and it's not a shared hash key either.
4055                Have to copy the string.  */
4056             STRLEN len = SvCUR(sstr);
4057             SvGROW(dstr, len + 1);      /* inlined from sv_setpvn */
4058             Move(SvPVX_const(sstr),SvPVX(dstr),len,char);
4059             SvCUR_set(dstr, len);
4060             *SvEND(dstr) = '\0';
4061         } else {
4062             /* If PERL_OLD_COPY_ON_WRITE is not defined, then isSwipe will always
4063                be true in here.  */
4064             /* Either it's a shared hash key, or it's suitable for
4065                copy-on-write or we can swipe the string.  */
4066             if (DEBUG_C_TEST) {
4067                 PerlIO_printf(Perl_debug_log, "Copy on write: sstr --> dstr\n");
4068                 sv_dump(sstr);
4069                 sv_dump(dstr);
4070             }
4071 #ifdef PERL_OLD_COPY_ON_WRITE
4072             if (!isSwipe) {
4073                 if ((sflags & (SVf_FAKE | SVf_READONLY))
4074                     != (SVf_FAKE | SVf_READONLY)) {
4075                     SvREADONLY_on(sstr);
4076                     SvFAKE_on(sstr);
4077                     /* Make the source SV into a loop of 1.
4078                        (about to become 2) */
4079                     SV_COW_NEXT_SV_SET(sstr, sstr);
4080                 }
4081             }
4082 #endif
4083             /* Initial code is common.  */
4084             if (SvPVX_const(dstr)) {    /* we know that dtype >= SVt_PV */
4085                 SvPV_free(dstr);
4086             }
4087
4088             if (!isSwipe) {
4089                 /* making another shared SV.  */
4090                 STRLEN cur = SvCUR(sstr);
4091                 STRLEN len = SvLEN(sstr);
4092 #ifdef PERL_OLD_COPY_ON_WRITE
4093                 if (len) {
4094                     assert (SvTYPE(dstr) >= SVt_PVIV);
4095                     /* SvIsCOW_normal */
4096                     /* splice us in between source and next-after-source.  */
4097                     SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4098                     SV_COW_NEXT_SV_SET(sstr, dstr);
4099                     SvPV_set(dstr, SvPVX_mutable(sstr));
4100                 } else
4101 #endif
4102                 {
4103                     /* SvIsCOW_shared_hash */
4104                     DEBUG_C(PerlIO_printf(Perl_debug_log,
4105                                           "Copy on write: Sharing hash\n"));
4106
4107                     assert (SvTYPE(dstr) >= SVt_PV);
4108                     SvPV_set(dstr,
4109                              HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)))));
4110                 }
4111                 SvLEN_set(dstr, len);
4112                 SvCUR_set(dstr, cur);
4113                 SvREADONLY_on(dstr);
4114                 SvFAKE_on(dstr);
4115             }
4116             else
4117                 {       /* Passes the swipe test.  */
4118                 SvPV_set(dstr, SvPVX_mutable(sstr));
4119                 SvLEN_set(dstr, SvLEN(sstr));
4120                 SvCUR_set(dstr, SvCUR(sstr));
4121
4122                 SvTEMP_off(dstr);
4123                 (void)SvOK_off(sstr);   /* NOTE: nukes most SvFLAGS on sstr */
4124                 SvPV_set(sstr, NULL);
4125                 SvLEN_set(sstr, 0);
4126                 SvCUR_set(sstr, 0);
4127                 SvTEMP_off(sstr);
4128             }
4129         }
4130         if (sflags & SVp_NOK) {
4131             SvNV_set(dstr, SvNVX(sstr));
4132         }
4133         if (sflags & SVp_IOK) {
4134             SvIV_set(dstr, SvIVX(sstr));
4135             /* Must do this otherwise some other overloaded use of 0x80000000
4136                gets confused. I guess SVpbm_VALID */
4137             if (sflags & SVf_IVisUV)
4138                 SvIsUV_on(dstr);
4139         }
4140         SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_NOK|SVp_NOK|SVf_UTF8);
4141         {
4142             const MAGIC * const smg = SvVSTRING_mg(sstr);
4143             if (smg) {
4144                 sv_magic(dstr, NULL, PERL_MAGIC_vstring,
4145                          smg->mg_ptr, smg->mg_len);
4146                 SvRMAGICAL_on(dstr);
4147             }
4148         }
4149     }
4150     else if (sflags & (SVp_IOK|SVp_NOK)) {
4151         (void)SvOK_off(dstr);
4152         SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_IVisUV|SVf_NOK|SVp_NOK);
4153         if (sflags & SVp_IOK) {
4154             /* XXXX Do we want to set IsUV for IV(ROK)?  Be extra safe... */
4155             SvIV_set(dstr, SvIVX(sstr));
4156         }
4157         if (sflags & SVp_NOK) {
4158             SvNV_set(dstr, SvNVX(sstr));
4159         }
4160     }
4161     else {
4162         if (isGV_with_GP(sstr)) {
4163             /* This stringification rule for globs is spread in 3 places.
4164                This feels bad. FIXME.  */
4165             const U32 wasfake = sflags & SVf_FAKE;
4166
4167             /* FAKE globs can get coerced, so need to turn this off
4168                temporarily if it is on.  */
4169             SvFAKE_off(sstr);
4170             gv_efullname3(dstr, MUTABLE_GV(sstr), "*");
4171             SvFLAGS(sstr) |= wasfake;
4172         }
4173         else
4174             (void)SvOK_off(dstr);
4175     }
4176     if (SvTAINTED(sstr))
4177         SvTAINT(dstr);
4178 }
4179
4180 /*
4181 =for apidoc sv_setsv_mg
4182
4183 Like C<sv_setsv>, but also handles 'set' magic.
4184
4185 =cut
4186 */
4187
4188 void
4189 Perl_sv_setsv_mg(pTHX_ SV *const dstr, register SV *const sstr)
4190 {
4191     PERL_ARGS_ASSERT_SV_SETSV_MG;
4192
4193     sv_setsv(dstr,sstr);
4194     SvSETMAGIC(dstr);
4195 }
4196
4197 #ifdef PERL_OLD_COPY_ON_WRITE
4198 SV *
4199 Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
4200 {
4201     STRLEN cur = SvCUR(sstr);
4202     STRLEN len = SvLEN(sstr);
4203     register char *new_pv;
4204
4205     PERL_ARGS_ASSERT_SV_SETSV_COW;
4206
4207     if (DEBUG_C_TEST) {
4208         PerlIO_printf(Perl_debug_log, "Fast copy on write: %p -> %p\n",
4209                       (void*)sstr, (void*)dstr);
4210         sv_dump(sstr);
4211         if (dstr)
4212                     sv_dump(dstr);
4213     }
4214
4215     if (dstr) {
4216         if (SvTHINKFIRST(dstr))
4217             sv_force_normal_flags(dstr, SV_COW_DROP_PV);
4218         else if (SvPVX_const(dstr))
4219             Safefree(SvPVX_const(dstr));
4220     }
4221     else
4222         new_SV(dstr);
4223     SvUPGRADE(dstr, SVt_PVIV);
4224
4225     assert (SvPOK(sstr));
4226     assert (SvPOKp(sstr));
4227     assert (!SvIOK(sstr));
4228     assert (!SvIOKp(sstr));
4229     assert (!SvNOK(sstr));
4230     assert (!SvNOKp(sstr));
4231
4232     if (SvIsCOW(sstr)) {
4233
4234         if (SvLEN(sstr) == 0) {
4235             /* source is a COW shared hash key.  */
4236             DEBUG_C(PerlIO_printf(Perl_debug_log,
4237                                   "Fast copy on write: Sharing hash\n"));
4238             new_pv = HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr))));
4239             goto common_exit;
4240         }
4241         SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4242     } else {
4243         assert ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS);
4244         SvUPGRADE(sstr, SVt_PVIV);
4245         SvREADONLY_on(sstr);
4246         SvFAKE_on(sstr);
4247         DEBUG_C(PerlIO_printf(Perl_debug_log,
4248                               "Fast copy on write: Converting sstr to COW\n"));
4249         SV_COW_NEXT_SV_SET(dstr, sstr);
4250     }
4251     SV_COW_NEXT_SV_SET(sstr, dstr);
4252     new_pv = SvPVX_mutable(sstr);
4253
4254   common_exit:
4255     SvPV_set(dstr, new_pv);
4256     SvFLAGS(dstr) = (SVt_PVIV|SVf_POK|SVp_POK|SVf_FAKE|SVf_READONLY);
4257     if (SvUTF8(sstr))
4258         SvUTF8_on(dstr);
4259     SvLEN_set(dstr, len);
4260     SvCUR_set(dstr, cur);
4261     if (DEBUG_C_TEST) {
4262         sv_dump(dstr);
4263     }
4264     return dstr;
4265 }
4266 #endif
4267
4268 /*
4269 =for apidoc sv_setpvn
4270
4271 Copies a string into an SV.  The C<len> parameter indicates the number of
4272 bytes to be copied.  If the C<ptr> argument is NULL the SV will become
4273 undefined.  Does not handle 'set' magic.  See C<sv_setpvn_mg>.
4274
4275 =cut
4276 */
4277
4278 void
4279 Perl_sv_setpvn(pTHX_ register SV *const sv, register const char *const ptr, register const STRLEN len)
4280 {
4281     dVAR;
4282     register char *dptr;
4283
4284     PERL_ARGS_ASSERT_SV_SETPVN;
4285
4286     SV_CHECK_THINKFIRST_COW_DROP(sv);
4287     if (!ptr) {
4288         (void)SvOK_off(sv);
4289         return;
4290     }
4291     else {
4292         /* len is STRLEN which is unsigned, need to copy to signed */
4293         const IV iv = len;
4294         if (iv < 0)
4295             Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen");
4296     }
4297     SvUPGRADE(sv, SVt_PV);
4298
4299     dptr = SvGROW(sv, len + 1);
4300     Move(ptr,dptr,len,char);
4301     dptr[len] = '\0';
4302     SvCUR_set(sv, len);
4303     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4304     SvTAINT(sv);
4305 }
4306
4307 /*
4308 =for apidoc sv_setpvn_mg
4309
4310 Like C<sv_setpvn>, but also handles 'set' magic.
4311
4312 =cut
4313 */
4314
4315 void
4316 Perl_sv_setpvn_mg(pTHX_ register SV *const sv, register const char *const ptr, register const STRLEN len)
4317 {
4318     PERL_ARGS_ASSERT_SV_SETPVN_MG;
4319
4320     sv_setpvn(sv,ptr,len);
4321     SvSETMAGIC(sv);
4322 }
4323
4324 /*
4325 =for apidoc sv_setpv
4326
4327 Copies a string into an SV.  The string must be null-terminated.  Does not
4328 handle 'set' magic.  See C<sv_setpv_mg>.
4329
4330 =cut
4331 */
4332
4333 void
4334 Perl_sv_setpv(pTHX_ register SV *const sv, register const char *const ptr)
4335 {
4336     dVAR;
4337     register STRLEN len;
4338
4339     PERL_ARGS_ASSERT_SV_SETPV;
4340
4341     SV_CHECK_THINKFIRST_COW_DROP(sv);
4342     if (!ptr) {
4343         (void)SvOK_off(sv);
4344         return;
4345     }
4346     len = strlen(ptr);
4347     SvUPGRADE(sv, SVt_PV);
4348
4349     SvGROW(sv, len + 1);
4350     Move(ptr,SvPVX(sv),len+1,char);
4351     SvCUR_set(sv, len);
4352     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4353     SvTAINT(sv);
4354 }
4355
4356 /*
4357 =for apidoc sv_setpv_mg
4358
4359 Like C<sv_setpv>, but also handles 'set' magic.
4360
4361 =cut
4362 */
4363
4364 void
4365 Perl_sv_setpv_mg(pTHX_ register SV *const sv, register const char *const ptr)
4366 {
4367     PERL_ARGS_ASSERT_SV_SETPV_MG;
4368
4369     sv_setpv(sv,ptr);
4370     SvSETMAGIC(sv);
4371 }
4372
4373 /*
4374 =for apidoc sv_usepvn_flags
4375
4376 Tells an SV to use C<ptr> to find its string value.  Normally the
4377 string is stored inside the SV but sv_usepvn allows the SV to use an
4378 outside string.  The C<ptr> should point to memory that was allocated
4379 by C<malloc>.  The string length, C<len>, must be supplied.  By default
4380 this function will realloc (i.e. move) the memory pointed to by C<ptr>,
4381 so that pointer should not be freed or used by the programmer after
4382 giving it to sv_usepvn, and neither should any pointers from "behind"
4383 that pointer (e.g. ptr + 1) be used.
4384
4385 If C<flags> & SV_SMAGIC is true, will call SvSETMAGIC. If C<flags> &
4386 SV_HAS_TRAILING_NUL is true, then C<ptr[len]> must be NUL, and the realloc
4387 will be skipped. (i.e. the buffer is actually at least 1 byte longer than
4388 C<len>, and already meets the requirements for storing in C<SvPVX>)
4389
4390 =cut
4391 */
4392
4393 void
4394 Perl_sv_usepvn_flags(pTHX_ SV *const sv, char *ptr, const STRLEN len, const U32 flags)
4395 {
4396     dVAR;
4397     STRLEN allocate;
4398
4399     PERL_ARGS_ASSERT_SV_USEPVN_FLAGS;
4400
4401     SV_CHECK_THINKFIRST_COW_DROP(sv);
4402     SvUPGRADE(sv, SVt_PV);
4403     if (!ptr) {
4404         (void)SvOK_off(sv);
4405         if (flags & SV_SMAGIC)
4406             SvSETMAGIC(sv);
4407         return;
4408     }
4409     if (SvPVX_const(sv))
4410         SvPV_free(sv);
4411
4412 #ifdef DEBUGGING
4413     if (flags & SV_HAS_TRAILING_NUL)
4414         assert(ptr[len] == '\0');
4415 #endif
4416
4417     allocate = (flags & SV_HAS_TRAILING_NUL)
4418         ? len + 1 :
4419 #ifdef Perl_safesysmalloc_size
4420         len + 1;
4421 #else 
4422         PERL_STRLEN_ROUNDUP(len + 1);
4423 #endif
4424     if (flags & SV_HAS_TRAILING_NUL) {
4425         /* It's long enough - do nothing.
4426            Specfically Perl_newCONSTSUB is relying on this.  */
4427     } else {
4428 #ifdef DEBUGGING
4429         /* Force a move to shake out bugs in callers.  */
4430         char *new_ptr = (char*)safemalloc(allocate);
4431         Copy(ptr, new_ptr, len, char);
4432         PoisonFree(ptr,len,char);
4433         Safefree(ptr);
4434         ptr = new_ptr;
4435 #else
4436         ptr = (char*) saferealloc (ptr, allocate);
4437 #endif
4438     }
4439 #ifdef Perl_safesysmalloc_size
4440     SvLEN_set(sv, Perl_safesysmalloc_size(ptr));
4441 #else
4442     SvLEN_set(sv, allocate);
4443 #endif
4444     SvCUR_set(sv, len);
4445     SvPV_set(sv, ptr);
4446     if (!(flags & SV_HAS_TRAILING_NUL)) {
4447         ptr[len] = '\0';
4448     }
4449     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4450     SvTAINT(sv);
4451     if (flags & SV_SMAGIC)
4452         SvSETMAGIC(sv);
4453 }
4454
4455 #ifdef PERL_OLD_COPY_ON_WRITE
4456 /* Need to do this *after* making the SV normal, as we need the buffer
4457    pointer to remain valid until after we've copied it.  If we let go too early,
4458    another thread could invalidate it by unsharing last of the same hash key
4459    (which it can do by means other than releasing copy-on-write Svs)
4460    or by changing the other copy-on-write SVs in the loop.  */
4461 STATIC void
4462 S_sv_release_COW(pTHX_ register SV *sv, const char *pvx, SV *after)
4463 {
4464     PERL_ARGS_ASSERT_SV_RELEASE_COW;
4465
4466     { /* this SV was SvIsCOW_normal(sv) */
4467          /* we need to find the SV pointing to us.  */
4468         SV *current = SV_COW_NEXT_SV(after);
4469
4470         if (current == sv) {
4471             /* The SV we point to points back to us (there were only two of us
4472                in the loop.)
4473                Hence other SV is no longer copy on write either.  */
4474             SvFAKE_off(after);
4475             SvREADONLY_off(after);
4476         } else {
4477             /* We need to follow the pointers around the loop.  */
4478             SV *next;
4479             while ((next = SV_COW_NEXT_SV(current)) != sv) {
4480                 assert (next);
4481                 current = next;
4482                  /* don't loop forever if the structure is bust, and we have
4483                     a pointer into a closed loop.  */
4484                 assert (current != after);
4485                 assert (SvPVX_const(current) == pvx);
4486             }
4487             /* Make the SV before us point to the SV after us.  */
4488             SV_COW_NEXT_SV_SET(current, after);
4489         }
4490     }
4491 }
4492 #endif
4493 /*
4494 =for apidoc sv_force_normal_flags
4495
4496 Undo various types of fakery on an SV: if the PV is a shared string, make
4497 a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
4498 an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
4499 we do the copy, and is also used locally. If C<SV_COW_DROP_PV> is set
4500 then a copy-on-write scalar drops its PV buffer (if any) and becomes
4501 SvPOK_off rather than making a copy. (Used where this scalar is about to be
4502 set to some other value.) In addition, the C<flags> parameter gets passed to
4503 C<sv_unref_flags()> when unrefing. C<sv_force_normal> calls this function
4504 with flags set to 0.
4505
4506 =cut
4507 */
4508
4509 void
4510 Perl_sv_force_normal_flags(pTHX_ register SV *const sv, const U32 flags)
4511 {
4512     dVAR;
4513
4514     PERL_ARGS_ASSERT_SV_FORCE_NORMAL_FLAGS;
4515
4516 #ifdef PERL_OLD_COPY_ON_WRITE
4517     if (SvREADONLY(sv)) {
4518         if (SvFAKE(sv)) {
4519             const char * const pvx = SvPVX_const(sv);
4520             const STRLEN len = SvLEN(sv);
4521             const STRLEN cur = SvCUR(sv);
4522             /* next COW sv in the loop.  If len is 0 then this is a shared-hash
4523                key scalar, so we mustn't attempt to call SV_COW_NEXT_SV(), as
4524                we'll fail an assertion.  */
4525             SV * const next = len ? SV_COW_NEXT_SV(sv) : 0;
4526
4527             if (DEBUG_C_TEST) {
4528                 PerlIO_printf(Perl_debug_log,
4529                               "Copy on write: Force normal %ld\n",
4530                               (long) flags);
4531                 sv_dump(sv);
4532             }
4533             SvFAKE_off(sv);
4534             SvREADONLY_off(sv);
4535             /* This SV doesn't own the buffer, so need to Newx() a new one:  */
4536             SvPV_set(sv, NULL);
4537             SvLEN_set(sv, 0);
4538             if (flags & SV_COW_DROP_PV) {
4539                 /* OK, so we don't need to copy our buffer.  */
4540                 SvPOK_off(sv);
4541             } else {
4542                 SvGROW(sv, cur + 1);
4543                 Move(pvx,SvPVX(sv),cur,char);
4544                 SvCUR_set(sv, cur);
4545                 *SvEND(sv) = '\0';
4546             }
4547             if (len) {
4548                 sv_release_COW(sv, pvx, next);
4549             } else {
4550                 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
4551             }
4552             if (DEBUG_C_TEST) {
4553                 sv_dump(sv);
4554             }
4555         }
4556         else if (IN_PERL_RUNTIME)
4557             Perl_croak_no_modify(aTHX);
4558     }
4559 #else
4560     if (SvREADONLY(sv)) {
4561         if (SvFAKE(sv)) {
4562             const char * const pvx = SvPVX_const(sv);
4563             const STRLEN len = SvCUR(sv);
4564             SvFAKE_off(sv);
4565             SvREADONLY_off(sv);
4566             SvPV_set(sv, NULL);
4567             SvLEN_set(sv, 0);
4568             SvGROW(sv, len + 1);
4569             Move(pvx,SvPVX(sv),len,char);
4570             *SvEND(sv) = '\0';
4571             unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
4572         }
4573         else if (IN_PERL_RUNTIME)
4574             Perl_croak_no_modify(aTHX);
4575     }
4576 #endif
4577     if (SvROK(sv))
4578         sv_unref_flags(sv, flags);
4579     else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
4580         sv_unglob(sv);
4581     else if (SvFAKE(sv) && SvTYPE(sv) == SVt_REGEXP) {
4582         /* Need to downgrade the REGEXP to a simple(r) scalar. This is analagous
4583            to sv_unglob. We only need it here, so inline it.  */
4584         const svtype new_type = SvMAGIC(sv) || SvSTASH(sv) ? SVt_PVMG : SVt_PV;
4585         SV *const temp = newSV_type(new_type);
4586         void *const temp_p = SvANY(sv);
4587
4588         if (new_type == SVt_PVMG) {
4589             SvMAGIC_set(temp, SvMAGIC(sv));
4590             SvMAGIC_set(sv, NULL);
4591             SvSTASH_set(temp, SvSTASH(sv));
4592             SvSTASH_set(sv, NULL);
4593         }
4594         SvCUR_set(temp, SvCUR(sv));
4595         /* Remember that SvPVX is in the head, not the body. */
4596         if (SvLEN(temp)) {
4597             SvLEN_set(temp, SvLEN(sv));
4598             /* This signals "buffer is owned by someone else" in sv_clear,
4599                which is the least effort way to stop it freeing the buffer.
4600             */
4601             SvLEN_set(sv, SvLEN(sv)+1);
4602         } else {
4603             /* Their buffer is already owned by someone else. */
4604             SvPVX(sv) = savepvn(SvPVX(sv), SvCUR(sv));
4605             SvLEN_set(temp, SvCUR(sv)+1);
4606         }
4607
4608         /* Now swap the rest of the bodies. */
4609
4610         SvFLAGS(sv) &= ~(SVf_FAKE|SVTYPEMASK);
4611         SvFLAGS(sv) |= new_type;
4612         SvANY(sv) = SvANY(temp);
4613
4614         SvFLAGS(temp) &= ~(SVTYPEMASK);
4615         SvFLAGS(temp) |= SVt_REGEXP|SVf_FAKE;
4616         SvANY(temp) = temp_p;
4617
4618         SvREFCNT_dec(temp);
4619     }
4620 }
4621
4622 /*
4623 =for apidoc sv_chop
4624
4625 Efficient removal of characters from the beginning of the string buffer.
4626 SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
4627 the string buffer.  The C<ptr> becomes the first character of the adjusted
4628 string. Uses the "OOK hack".
4629 Beware: after this function returns, C<ptr> and SvPVX_const(sv) may no longer
4630 refer to the same chunk of data.
4631
4632 =cut
4633 */
4634
4635 void
4636 Perl_sv_chop(pTHX_ register SV *const sv, register const char *const ptr)
4637 {
4638     STRLEN delta;
4639     STRLEN old_delta;
4640     U8 *p;
4641 #ifdef DEBUGGING
4642     const U8 *real_start;
4643 #endif
4644     STRLEN max_delta;
4645
4646     PERL_ARGS_ASSERT_SV_CHOP;
4647
4648     if (!ptr || !SvPOKp(sv))
4649         return;
4650     delta = ptr - SvPVX_const(sv);
4651     if (!delta) {
4652         /* Nothing to do.  */
4653         return;
4654     }
4655     /* SvPVX(sv) may move in SV_CHECK_THINKFIRST(sv), but after this line,
4656        nothing uses the value of ptr any more.  */
4657     max_delta = SvLEN(sv) ? SvLEN(sv) : SvCUR(sv);
4658     if (ptr <= SvPVX_const(sv))
4659         Perl_croak(aTHX_ "panic: sv_chop ptr=%p, start=%p, end=%p",
4660                    ptr, SvPVX_const(sv), SvPVX_const(sv) + max_delta);
4661     SV_CHECK_THINKFIRST(sv);
4662     if (delta > max_delta)
4663         Perl_croak(aTHX_ "panic: sv_chop ptr=%p (was %p), start=%p, end=%p",
4664                    SvPVX_const(sv) + delta, ptr, SvPVX_const(sv),
4665                    SvPVX_const(sv) + max_delta);
4666
4667     if (!SvOOK(sv)) {
4668         if (!SvLEN(sv)) { /* make copy of shared string */
4669             const char *pvx = SvPVX_const(sv);
4670             const STRLEN len = SvCUR(sv);
4671             SvGROW(sv, len + 1);
4672             Move(pvx,SvPVX(sv),len,char);
4673             *SvEND(sv) = '\0';
4674         }
4675         SvFLAGS(sv) |= SVf_OOK;
4676         old_delta = 0;
4677     } else {
4678         SvOOK_offset(sv, old_delta);
4679     }
4680     SvLEN_set(sv, SvLEN(sv) - delta);
4681     SvCUR_set(sv, SvCUR(sv) - delta);
4682     SvPV_set(sv, SvPVX(sv) + delta);
4683
4684     p = (U8 *)SvPVX_const(sv);
4685
4686     delta += old_delta;
4687
4688 #ifdef DEBUGGING
4689     real_start = p - delta;
4690 #endif
4691
4692     assert(delta);
4693     if (delta < 0x100) {
4694         *--p = (U8) delta;
4695     } else {
4696         *--p = 0;
4697         p -= sizeof(STRLEN);
4698         Copy((U8*)&delta, p, sizeof(STRLEN), U8);
4699     }
4700
4701 #ifdef DEBUGGING
4702     /* Fill the preceding buffer with sentinals to verify that no-one is
4703        using it.  */
4704     while (p > real_start) {
4705         --p;
4706         *p = (U8)PTR2UV(p);
4707     }
4708 #endif
4709 }
4710
4711 /*
4712 =for apidoc sv_catpvn
4713
4714 Concatenates the string onto the end of the string which is in the SV.  The
4715 C<len> indicates number of bytes to copy.  If the SV has the UTF-8
4716 status set, then the bytes appended should be valid UTF-8.
4717 Handles 'get' magic, but not 'set' magic.  See C<sv_catpvn_mg>.
4718
4719 =for apidoc sv_catpvn_flags
4720
4721 Concatenates the string onto the end of the string which is in the SV.  The
4722 C<len> indicates number of bytes to copy.  If the SV has the UTF-8
4723 status set, then the bytes appended should be valid UTF-8.
4724 If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
4725 appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
4726 in terms of this function.
4727
4728 =cut
4729 */
4730
4731 void
4732 Perl_sv_catpvn_flags(pTHX_ register SV *const dsv, register const char *sstr, register const STRLEN slen, const I32 flags)
4733 {
4734     dVAR;
4735     STRLEN dlen;
4736     const char * const dstr = SvPV_force_flags(dsv, dlen, flags);
4737
4738     PERL_ARGS_ASSERT_SV_CATPVN_FLAGS;
4739
4740     SvGROW(dsv, dlen + slen + 1);
4741     if (sstr == dstr)
4742         sstr = SvPVX_const(dsv);
4743     Move(sstr, SvPVX(dsv) + dlen, slen, char);
4744     SvCUR_set(dsv, SvCUR(dsv) + slen);
4745     *SvEND(dsv) = '\0';
4746     (void)SvPOK_only_UTF8(dsv);         /* validate pointer */
4747     SvTAINT(dsv);
4748     if (flags & SV_SMAGIC)
4749         SvSETMAGIC(dsv);
4750 }
4751
4752 /*
4753 =for apidoc sv_catsv
4754
4755 Concatenates the string from SV C<ssv> onto the end of the string in
4756 SV C<dsv>.  Modifies C<dsv> but not C<ssv>.  Handles 'get' magic, but
4757 not 'set' magic.  See C<sv_catsv_mg>.
4758
4759 =for apidoc sv_catsv_flags
4760
4761 Concatenates the string from SV C<ssv> onto the end of the string in
4762 SV C<dsv>.  Modifies C<dsv> but not C<ssv>.  If C<flags> has C<SV_GMAGIC>
4763 bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
4764 and C<sv_catsv_nomg> are implemented in terms of this function.
4765
4766 =cut */
4767
4768 void
4769 Perl_sv_catsv_flags(pTHX_ SV *const dsv, register SV *const ssv, const I32 flags)
4770 {
4771     dVAR;
4772  
4773     PERL_ARGS_ASSERT_SV_CATSV_FLAGS;
4774
4775    if (ssv) {
4776         STRLEN slen;
4777         const char *spv = SvPV_const(ssv, slen);
4778         if (spv) {
4779             /*  sutf8 and dutf8 were type bool, but under USE_ITHREADS,
4780                 gcc version 2.95.2 20000220 (Debian GNU/Linux) for
4781                 Linux xxx 2.2.17 on sparc64 with gcc -O2, we erroneously
4782                 get dutf8 = 0x20000000, (i.e.  SVf_UTF8) even though
4783                 dsv->sv_flags doesn't have that bit set.
4784                 Andy Dougherty  12 Oct 2001
4785             */
4786             const I32 sutf8 = DO_UTF8(ssv);
4787             I32 dutf8;
4788
4789             if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
4790                 mg_get(dsv);
4791             dutf8 = DO_UTF8(dsv);
4792
4793             if (dutf8 != sutf8) {
4794                 if (dutf8) {
4795                     /* Not modifying source SV, so taking a temporary copy. */
4796                     SV* const csv = newSVpvn_flags(spv, slen, SVs_TEMP);
4797
4798                     sv_utf8_upgrade(csv);
4799                     spv = SvPV_const(csv, slen);
4800                 }
4801                 else
4802                     /* Leave enough space for the cat that's about to happen */
4803                     sv_utf8_upgrade_flags_grow(dsv, 0, slen);
4804             }
4805             sv_catpvn_nomg(dsv, spv, slen);
4806         }
4807     }
4808     if (flags & SV_SMAGIC)
4809         SvSETMAGIC(dsv);
4810 }
4811
4812 /*
4813 =for apidoc sv_catpv
4814
4815 Concatenates the string onto the end of the string which is in the SV.
4816 If the SV has the UTF-8 status set, then the bytes appended should be
4817 valid UTF-8.  Handles 'get' magic, but not 'set' magic.  See C<sv_catpv_mg>.
4818
4819 =cut */
4820
4821 void
4822 Perl_sv_catpv(pTHX_ register SV *const sv, register const char *ptr)
4823 {
4824     dVAR;
4825     register STRLEN len;
4826     STRLEN tlen;
4827     char *junk;
4828
4829     PERL_ARGS_ASSERT_SV_CATPV;
4830
4831     if (!ptr)
4832         return;
4833     junk = SvPV_force(sv, tlen);
4834     len = strlen(ptr);
4835     SvGROW(sv, tlen + len + 1);
4836     if (ptr == junk)
4837         ptr = SvPVX_const(sv);
4838     Move(ptr,SvPVX(sv)+tlen,len+1,char);
4839     SvCUR_set(sv, SvCUR(sv) + len);
4840     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4841     SvTAINT(sv);
4842 }
4843
4844 /*
4845 =for apidoc sv_catpv_mg
4846
4847 Like C<sv_catpv>, but also handles 'set' magic.
4848
4849 =cut
4850 */
4851
4852 void
4853 Perl_sv_catpv_mg(pTHX_ register SV *const sv, register const char *const ptr)
4854 {
4855     PERL_ARGS_ASSERT_SV_CATPV_MG;
4856
4857     sv_catpv(sv,ptr);
4858     SvSETMAGIC(sv);
4859 }
4860
4861 /*
4862 =for apidoc newSV
4863
4864 Creates a new SV.  A non-zero C<len> parameter indicates the number of
4865 bytes of preallocated string space the SV should have.  An extra byte for a
4866 trailing NUL is also reserved.  (SvPOK is not set for the SV even if string
4867 space is allocated.)  The reference count for the new SV is set to 1.
4868
4869 In 5.9.3, newSV() replaces the older NEWSV() API, and drops the first
4870 parameter, I<x>, a debug aid which allowed callers to identify themselves.
4871 This aid has been superseded by a new build option, PERL_MEM_LOG (see
4872 L<perlhack/PERL_MEM_LOG>).  The older API is still there for use in XS
4873 modules supporting older perls.
4874
4875 =cut
4876 */
4877
4878 SV *
4879 Perl_newSV(pTHX_ const STRLEN len)
4880 {
4881     dVAR;
4882     register SV *sv;
4883
4884     new_SV(sv);
4885     if (len) {
4886         sv_upgrade(sv, SVt_PV);
4887         SvGROW(sv, len + 1);
4888     }
4889     return sv;
4890 }
4891 /*
4892 =for apidoc sv_magicext
4893
4894 Adds magic to an SV, upgrading it if necessary. Applies the
4895 supplied vtable and returns a pointer to the magic added.
4896
4897 Note that C<sv_magicext> will allow things that C<sv_magic> will not.
4898 In particular, you can add magic to SvREADONLY SVs, and add more than
4899 one instance of the same 'how'.
4900
4901 If C<namlen> is greater than zero then a C<savepvn> I<copy> of C<name> is
4902 stored, if C<namlen> is zero then C<name> is stored as-is and - as another
4903 special case - if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
4904 to contain an C<SV*> and is stored as-is with its REFCNT incremented.
4905
4906 (This is now used as a subroutine by C<sv_magic>.)
4907
4908 =cut
4909 */
4910 MAGIC * 
4911 Perl_sv_magicext(pTHX_ SV *const sv, SV *const obj, const int how, 
4912                 const MGVTBL *const vtable, const char *const name, const I32 namlen)
4913 {
4914     dVAR;
4915     MAGIC* mg;
4916
4917     PERL_ARGS_ASSERT_SV_MAGICEXT;
4918
4919     SvUPGRADE(sv, SVt_PVMG);
4920     Newxz(mg, 1, MAGIC);
4921     mg->mg_moremagic = SvMAGIC(sv);
4922     SvMAGIC_set(sv, mg);
4923
4924     /* Sometimes a magic contains a reference loop, where the sv and
4925        object refer to each other.  To prevent a reference loop that
4926        would prevent such objects being freed, we look for such loops
4927        and if we find one we avoid incrementing the object refcount.
4928
4929        Note we cannot do this to avoid self-tie loops as intervening RV must
4930        have its REFCNT incremented to keep it in existence.
4931
4932     */
4933     if (!obj || obj == sv ||
4934         how == PERL_MAGIC_arylen ||
4935         how == PERL_MAGIC_symtab ||
4936         (SvTYPE(obj) == SVt_PVGV &&
4937             (GvSV(obj) == sv || GvHV(obj) == (const HV *)sv
4938              || GvAV(obj) == (const AV *)sv || GvCV(obj) == (const CV *)sv
4939              || GvIOp(obj) == (const IO *)sv || GvFORM(obj) == (const CV *)sv)))
4940     {
4941         mg->mg_obj = obj;
4942     }
4943     else {
4944         mg->mg_obj = SvREFCNT_inc_simple(obj);
4945         mg->mg_flags |= MGf_REFCOUNTED;
4946     }
4947
4948     /* Normal self-ties simply pass a null object, and instead of
4949        using mg_obj directly, use the SvTIED_obj macro to produce a
4950        new RV as needed.  For glob "self-ties", we are tieing the PVIO
4951        with an RV obj pointing to the glob containing the PVIO.  In
4952        this case, to avoid a reference loop, we need to weaken the
4953        reference.
4954     */
4955
4956     if (how == PERL_MAGIC_tiedscalar && SvTYPE(sv) == SVt_PVIO &&
4957         obj && SvROK(obj) && GvIO(SvRV(obj)) == (const IO *)sv)
4958     {
4959       sv_rvweaken(obj);
4960     }
4961
4962     mg->mg_type = how;
4963     mg->mg_len = namlen;
4964     if (name) {
4965         if (namlen > 0)
4966             mg->mg_ptr = savepvn(name, namlen);
4967         else if (namlen == HEf_SVKEY) {
4968             /* Yes, this is casting away const. This is only for the case of
4969                HEf_SVKEY. I think we need to document this abberation of the
4970                constness of the API, rather than making name non-const, as
4971                that change propagating outwards a long way.  */
4972             mg->mg_ptr = (char*)SvREFCNT_inc_simple_NN((SV *)name);
4973         } else
4974             mg->mg_ptr = (char *) name;
4975     }
4976     mg->mg_virtual = (MGVTBL *) vtable;
4977
4978     mg_magical(sv);
4979     if (SvGMAGICAL(sv))
4980         SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
4981     return mg;
4982 }
4983
4984 /*
4985 =for apidoc sv_magic
4986
4987 Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
4988 then adds a new magic item of type C<how> to the head of the magic list.
4989
4990 See C<sv_magicext> (which C<sv_magic> now calls) for a description of the
4991 handling of the C<name> and C<namlen> arguments.
4992
4993 You need to use C<sv_magicext> to add magic to SvREADONLY SVs and also
4994 to add more than one instance of the same 'how'.
4995
4996 =cut
4997 */
4998
4999 void
5000 Perl_sv_magic(pTHX_ register SV *const sv, SV *const obj, const int how, 
5001              const char *const name, const I32 namlen)
5002 {
5003     dVAR;
5004     const MGVTBL *vtable;
5005     MAGIC* mg;
5006
5007     PERL_ARGS_ASSERT_SV_MAGIC;
5008
5009 #ifdef PERL_OLD_COPY_ON_WRITE
5010     if (SvIsCOW(sv))
5011         sv_force_normal_flags(sv, 0);
5012 #endif
5013     if (SvREADONLY(sv)) {
5014         if (
5015             /* its okay to attach magic to shared strings; the subsequent
5016              * upgrade to PVMG will unshare the string */
5017             !(SvFAKE(sv) && SvTYPE(sv) < SVt_PVMG)
5018
5019             && IN_PERL_RUNTIME
5020             && how != PERL_MAGIC_regex_global
5021             && how != PERL_MAGIC_bm
5022             && how != PERL_MAGIC_fm
5023             && how != PERL_MAGIC_sv
5024             && how != PERL_MAGIC_backref
5025            )
5026         {
5027             Perl_croak_no_modify(aTHX);
5028         }
5029     }
5030     if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
5031         if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
5032             /* sv_magic() refuses to add a magic of the same 'how' as an
5033                existing one
5034              */
5035             if (how == PERL_MAGIC_taint) {
5036                 mg->mg_len |= 1;
5037                 /* Any scalar which already had taint magic on which someone
5038                    (erroneously?) did SvIOK_on() or similar will now be
5039                    incorrectly sporting public "OK" flags.  */
5040                 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
5041             }
5042             return;
5043         }
5044     }
5045
5046     switch (how) {
5047     case PERL_MAGIC_sv:
5048         vtable = &PL_vtbl_sv;
5049         break;
5050     case PERL_MAGIC_overload:
5051         vtable = &PL_vtbl_amagic;
5052         break;
5053     case PERL_MAGIC_overload_elem:
5054         vtable = &PL_vtbl_amagicelem;
5055         break;
5056     case PERL_MAGIC_overload_table:
5057         vtable = &PL_vtbl_ovrld;
5058         break;
5059     case PERL_MAGIC_bm:
5060         vtable = &PL_vtbl_bm;
5061         break;
5062     case PERL_MAGIC_regdata:
5063         vtable = &PL_vtbl_regdata;
5064         break;
5065     case PERL_MAGIC_regdatum:
5066         vtable = &PL_vtbl_regdatum;
5067         break;
5068     case PERL_MAGIC_env:
5069         vtable = &PL_vtbl_env;
5070         break;
5071     case PERL_MAGIC_fm:
5072         vtable = &PL_vtbl_fm;
5073         break;
5074     case PERL_MAGIC_envelem:
5075         vtable = &PL_vtbl_envelem;
5076         break;
5077     case PERL_MAGIC_regex_global:
5078         vtable = &PL_vtbl_mglob;
5079         break;
5080     case PERL_MAGIC_isa:
5081         vtable = &PL_vtbl_isa;
5082         break;
5083     case PERL_MAGIC_isaelem:
5084         vtable = &PL_vtbl_isaelem;
5085         break;
5086     case PERL_MAGIC_nkeys:
5087         vtable = &PL_vtbl_nkeys;
5088         break;
5089     case PERL_MAGIC_dbfile:
5090         vtable = NULL;
5091         break;
5092     case PERL_MAGIC_dbline:
5093         vtable = &PL_vtbl_dbline;
5094         break;
5095 #ifdef USE_LOCALE_COLLATE
5096     case PERL_MAGIC_collxfrm:
5097         vtable = &PL_vtbl_collxfrm;
5098         break;
5099 #endif /* USE_LOCALE_COLLATE */
5100     case PERL_MAGIC_tied:
5101         vtable = &PL_vtbl_pack;
5102         break;
5103     case PERL_MAGIC_tiedelem:
5104     case PERL_MAGIC_tiedscalar:
5105         vtable = &PL_vtbl_packelem;
5106         break;
5107     case PERL_MAGIC_qr:
5108         vtable = &PL_vtbl_regexp;
5109         break;
5110     case PERL_MAGIC_sig:
5111         vtable = &PL_vtbl_sig;
5112         break;
5113     case PERL_MAGIC_sigelem:
5114         vtable = &PL_vtbl_sigelem;
5115         break;
5116     case PERL_MAGIC_taint:
5117         vtable = &PL_vtbl_taint;
5118         break;
5119     case PERL_MAGIC_uvar:
5120         vtable = &PL_vtbl_uvar;
5121         break;
5122     case PERL_MAGIC_vec:
5123         vtable = &PL_vtbl_vec;
5124         break;
5125     case PERL_MAGIC_arylen_p:
5126     case PERL_MAGIC_rhash:
5127     case PERL_MAGIC_symtab:
5128     case PERL_MAGIC_vstring:
5129         vtable = NULL;
5130         break;
5131     case PERL_MAGIC_utf8:
5132         vtable = &PL_vtbl_utf8;
5133         break;
5134     case PERL_MAGIC_substr:
5135         vtable = &PL_vtbl_substr;
5136         break;
5137     case PERL_MAGIC_defelem:
5138         vtable = &PL_vtbl_defelem;
5139         break;
5140     case PERL_MAGIC_arylen:
5141         vtable = &PL_vtbl_arylen;
5142         break;
5143     case PERL_MAGIC_pos:
5144         vtable = &PL_vtbl_pos;
5145         break;
5146     case PERL_MAGIC_backref:
5147         vtable = &PL_vtbl_backref;
5148         break;
5149     case PERL_MAGIC_hintselem:
5150         vtable = &PL_vtbl_hintselem;
5151         break;
5152     case PERL_MAGIC_hints:
5153         vtable = &PL_vtbl_hints;
5154         break;
5155     case PERL_MAGIC_ext:
5156         /* Reserved for use by extensions not perl internals.           */
5157         /* Useful for attaching extension internal data to perl vars.   */
5158         /* Note that multiple extensions may clash if magical scalars   */
5159         /* etc holding private data from one are passed to another.     */
5160         vtable = NULL;
5161         break;
5162     default:
5163         Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
5164     }
5165
5166     /* Rest of work is done else where */
5167     mg = sv_magicext(sv,obj,how,vtable,name,namlen);
5168
5169     switch (how) {
5170     case PERL_MAGIC_taint:
5171         mg->mg_len = 1;
5172         break;
5173     case PERL_MAGIC_ext:
5174     case PERL_MAGIC_dbfile:
5175         SvRMAGICAL_on(sv);
5176         break;
5177     }
5178 }
5179
5180 /*
5181 =for apidoc sv_unmagic
5182
5183 Removes all magic of type C<type> from an SV.
5184
5185 =cut
5186 */
5187
5188 int
5189 Perl_sv_unmagic(pTHX_ SV *const sv, const int type)
5190 {
5191     MAGIC* mg;
5192     MAGIC** mgp;
5193
5194     PERL_ARGS_ASSERT_SV_UNMAGIC;
5195
5196     if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
5197         return 0;
5198     mgp = &(((XPVMG*) SvANY(sv))->xmg_u.xmg_magic);
5199     for (mg = *mgp; mg; mg = *mgp) {
5200         if (mg->mg_type == type) {
5201             const MGVTBL* const vtbl = mg->mg_virtual;
5202             *mgp = mg->mg_moremagic;
5203             if (vtbl && vtbl->svt_free)
5204                 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
5205             if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
5206                 if (mg->mg_len > 0)
5207                     Safefree(mg->mg_ptr);
5208                 else if (mg->mg_len == HEf_SVKEY)
5209                     SvREFCNT_dec(MUTABLE_SV(mg->mg_ptr));
5210                 else if (mg->mg_type == PERL_MAGIC_utf8)
5211                     Safefree(mg->mg_ptr);
5212             }
5213             if (mg->mg_flags & MGf_REFCOUNTED)
5214                 SvREFCNT_dec(mg->mg_obj);
5215             Safefree(mg);
5216         }
5217         else
5218             mgp = &mg->mg_moremagic;
5219     }
5220     if (SvMAGIC(sv)) {
5221         if (SvMAGICAL(sv))      /* if we're under save_magic, wait for restore_magic; */
5222             mg_magical(sv);     /*    else fix the flags now */
5223     }
5224     else {
5225         SvMAGICAL_off(sv);
5226         SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
5227     }
5228     return 0;
5229 }
5230
5231 /*
5232 =for apidoc sv_rvweaken
5233
5234 Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
5235 referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
5236 push a back-reference to this RV onto the array of backreferences
5237 associated with that magic. If the RV is magical, set magic will be
5238 called after the RV is cleared.
5239
5240 =cut
5241 */
5242
5243 SV *
5244 Perl_sv_rvweaken(pTHX_ SV *const sv)
5245 {
5246     SV *tsv;
5247
5248     PERL_ARGS_ASSERT_SV_RVWEAKEN;
5249
5250     if (!SvOK(sv))  /* let undefs pass */
5251         return sv;
5252     if (!SvROK(sv))
5253         Perl_croak(aTHX_ "Can't weaken a nonreference");
5254     else if (SvWEAKREF(sv)) {
5255         Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
5256         return sv;
5257     }
5258     tsv = SvRV(sv);
5259     Perl_sv_add_backref(aTHX_ tsv, sv);
5260     SvWEAKREF_on(sv);
5261     SvREFCNT_dec(tsv);
5262     return sv;
5263 }
5264
5265 /* Give tsv backref magic if it hasn't already got it, then push a
5266  * back-reference to sv onto the array associated with the backref magic.
5267  *
5268  * As an optimisation, if there's only one backref and it's not an AV,
5269  * store it directly in the HvAUX or mg_obj slot, avoiding the need to
5270  * allocate an AV. (Whether the slot holds an AV tells us whether this is
5271  * active.)
5272  *
5273  * If an HV's backref is stored in magic, it is moved back to HvAUX.
5274  */
5275
5276 /* A discussion about the backreferences array and its refcount:
5277  *
5278  * The AV holding the backreferences is pointed to either as the mg_obj of
5279  * PERL_MAGIC_backref, or in the specific case of a HV that has the hv_aux
5280  * structure, from the xhv_backreferences field. (A HV without hv_aux will
5281  * have the standard magic instead.) The array is created with a refcount
5282  * of 2. This means that if during global destruction the array gets
5283  * picked on before its parent to have its refcount decremented by the
5284  * random zapper, it won't actually be freed, meaning it's still there for
5285  * when its parent gets freed.
5286  *
5287  * When the parent SV is freed, the extra ref is killed by
5288  * Perl_sv_kill_backrefs.  The other ref is killed, in the case of magic,
5289  * by mg_free() / MGf_REFCOUNTED, or for a hash, by Perl_hv_kill_backrefs.
5290  *
5291  * When a single backref SV is stored directly, it is not reference
5292  * counted.
5293  */
5294
5295 void
5296 Perl_sv_add_backref(pTHX_ SV *const tsv, SV *const sv)
5297 {
5298     dVAR;
5299     SV **svp;
5300     AV *av = NULL;
5301     MAGIC *mg = NULL;
5302
5303     PERL_ARGS_ASSERT_SV_ADD_BACKREF;
5304
5305     /* find slot to store array or singleton backref */
5306
5307     if (SvTYPE(tsv) == SVt_PVHV) {
5308         svp = (SV**)Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(tsv));
5309
5310         if (!*svp) {
5311             if ((mg = mg_find(tsv, PERL_MAGIC_backref))) {
5312                 /* Aha. They've got it stowed in magic instead.
5313                  * Move it back to xhv_backreferences */
5314                 *svp = mg->mg_obj;
5315                 /* Stop mg_free decreasing the reference count.  */
5316                 mg->mg_obj = NULL;
5317                 /* Stop mg_free even calling the destructor, given that
5318                    there's no AV to free up.  */
5319                 mg->mg_virtual = 0;
5320                 sv_unmagic(tsv, PERL_MAGIC_backref);
5321                 mg = NULL;
5322             }
5323         }
5324     } else {
5325         if (! ((mg =
5326             (SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL))))
5327         {
5328             sv_magic(tsv, NULL, PERL_MAGIC_backref, NULL, 0);
5329             mg = mg_find(tsv, PERL_MAGIC_backref);
5330         }
5331         svp = &(mg->mg_obj);
5332     }
5333
5334     /* create or retrieve the array */
5335
5336     if (   (!*svp && SvTYPE(sv) == SVt_PVAV)
5337         || (*svp && SvTYPE(*svp) != SVt_PVAV)
5338     ) {
5339         /* create array */
5340         av = newAV();
5341         AvREAL_off(av);
5342         SvREFCNT_inc_simple_void(av);
5343         /* av now has a refcnt of 2; see discussion above */
5344         if (*svp) {
5345             /* move single existing backref to the array */
5346             av_extend(av, 1);
5347             AvARRAY(av)[++AvFILLp(av)] = *svp; /* av_push() */
5348         }
5349         *svp = (SV*)av;
5350         if (mg)
5351             mg->mg_flags |= MGf_REFCOUNTED;
5352     }
5353     else
5354         av = MUTABLE_AV(*svp);
5355
5356     if (!av) {
5357         /* optimisation: store single backref directly in HvAUX or mg_obj */
5358         *svp = sv;
5359         return;
5360     }
5361     /* push new backref */
5362     assert(SvTYPE(av) == SVt_PVAV);
5363     if (AvFILLp(av) >= AvMAX(av)) {
5364         av_extend(av, AvFILLp(av)+1);
5365     }
5366     AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */
5367 }
5368
5369 /* delete a back-reference to ourselves from the backref magic associated
5370  * with the SV we point to.
5371  */
5372
5373 void
5374 Perl_sv_del_backref(pTHX_ SV *const tsv, SV *const sv)
5375 {
5376     dVAR;
5377     SV **svp = NULL;
5378     I32 i;
5379
5380     PERL_ARGS_ASSERT_SV_DEL_BACKREF;
5381
5382     if (SvTYPE(tsv) == SVt_PVHV && SvOOK(tsv)) {
5383         svp = (SV**)Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(tsv));
5384     }
5385     if (!svp || !*svp) {
5386         MAGIC *const mg
5387             = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
5388         svp =  mg ? &(mg->mg_obj) : NULL;
5389     }
5390
5391     if (!svp || !*svp)
5392         Perl_croak(aTHX_ "panic: del_backref");
5393
5394     if (SvTYPE(*svp) == SVt_PVAV) {
5395         int count = 0;
5396         AV * const av = (AV*)*svp;
5397         assert(!SvIS_FREED(av));
5398         svp = AvARRAY(av);
5399         for (i = AvFILLp(av); i >= 0; i--) {
5400             if (svp[i] == sv) {
5401                 const SSize_t fill = AvFILLp(av);
5402                 if (i != fill) {
5403                     /* We weren't the last entry.
5404                        An unordered list has this property that you can take the
5405                        last element off the end to fill the hole, and it's still
5406                        an unordered list :-)
5407                     */
5408                     svp[i] = svp[fill];
5409                 }
5410                 svp[fill] = NULL;
5411                 AvFILLp(av) = fill - 1;
5412                 count++;
5413 #ifndef DEBUGGING
5414                 break; /* should only be one */
5415 #endif
5416             }
5417         }
5418         assert(count == 1);
5419     }
5420     else {
5421         /* optimisation: only a single backref, stored directly */
5422         if (*svp != sv)
5423             Perl_croak(aTHX_ "panic: del_backref");
5424         *svp = NULL;
5425     }
5426
5427 }
5428
5429 void
5430 Perl_sv_kill_backrefs(pTHX_ SV *const sv, AV *const av)
5431 {
5432     SV **svp;
5433     SV **last;
5434     bool is_array;
5435
5436     PERL_ARGS_ASSERT_SV_KILL_BACKREFS;
5437
5438     if (!av)
5439         return;
5440
5441     is_array = (SvTYPE(av) == SVt_PVAV);
5442     if (is_array) {
5443         assert(!SvIS_FREED(av));
5444         svp = AvARRAY(av);
5445         if (svp)
5446             last = svp + AvFILLp(av);
5447     }
5448     else {
5449         /* optimisation: only a single backref, stored directly */
5450         svp = (SV**)&av;
5451         last = svp;
5452     }
5453
5454     if (svp) {
5455         while (svp <= last) {
5456             if (*svp) {
5457                 SV *const referrer = *svp;
5458                 if (SvWEAKREF(referrer)) {
5459                     /* XXX Should we check that it hasn't changed? */
5460                     assert(SvROK(referrer));
5461                     SvRV_set(referrer, 0);
5462                     SvOK_off(referrer);
5463                     SvWEAKREF_off(referrer);
5464                     SvSETMAGIC(referrer);
5465                 } else if (SvTYPE(referrer) == SVt_PVGV ||
5466                            SvTYPE(referrer) == SVt_PVLV) {
5467                     assert(SvTYPE(sv) == SVt_PVHV); /* stash backref */
5468                     /* You lookin' at me?  */
5469                     assert(GvSTASH(referrer));
5470                     assert(GvSTASH(referrer) == (const HV *)sv);
5471                     GvSTASH(referrer) = 0;
5472                 } else if (SvTYPE(referrer) == SVt_PVCV ||
5473                            SvTYPE(referrer) == SVt_PVFM) {
5474                     if (SvTYPE(sv) == SVt_PVHV) { /* stash backref */
5475                         /* You lookin' at me?  */
5476                         assert(CvSTASH(referrer));
5477                         assert(CvSTASH(referrer) == (const HV *)sv);
5478                         CvSTASH(referrer) = 0;
5479                     }
5480                     else {
5481                         assert(SvTYPE(sv) == SVt_PVGV);
5482                         /* You lookin' at me?  */
5483                         assert(CvGV(referrer));
5484                         assert(CvGV(referrer) == (const GV *)sv);
5485                         anonymise_cv_maybe(MUTABLE_GV(sv),
5486                                                 MUTABLE_CV(referrer));
5487                     }
5488
5489                 } else {
5490                     Perl_croak(aTHX_
5491                                "panic: magic_killbackrefs (flags=%"UVxf")",
5492                                (UV)SvFLAGS(referrer));
5493                 }
5494
5495                 if (is_array)
5496                     *svp = NULL;
5497             }
5498             svp++;
5499         }
5500     }
5501     if (is_array) {
5502         AvFILLp(av) = -1;
5503         SvREFCNT_dec(av); /* remove extra count added by sv_add_backref() */
5504     }
5505     return;
5506 }
5507
5508 /*
5509 =for apidoc sv_insert
5510
5511 Inserts a string at the specified offset/length within the SV. Similar to
5512 the Perl substr() function. Handles get magic.
5513
5514 =for apidoc sv_insert_flags
5515
5516 Same as C<sv_insert>, but the extra C<flags> are passed the C<SvPV_force_flags> that applies to C<bigstr>.
5517
5518 =cut
5519 */
5520
5521 void
5522 Perl_sv_insert_flags(pTHX_ SV *const bigstr, const STRLEN offset, const STRLEN len, const char *const little, const STRLEN littlelen, const U32 flags)
5523 {
5524     dVAR;
5525     register char *big;
5526     register char *mid;
5527     register char *midend;
5528     register char *bigend;
5529     register I32 i;
5530     STRLEN curlen;
5531
5532     PERL_ARGS_ASSERT_SV_INSERT_FLAGS;
5533
5534     if (!bigstr)
5535         Perl_croak(aTHX_ "Can't modify non-existent substring");
5536     SvPV_force_flags(bigstr, curlen, flags);
5537     (void)SvPOK_only_UTF8(bigstr);
5538     if (offset + len > curlen) {
5539         SvGROW(bigstr, offset+len+1);
5540         Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
5541         SvCUR_set(bigstr, offset+len);
5542     }
5543
5544     SvTAINT(bigstr);
5545     i = littlelen - len;
5546     if (i > 0) {                        /* string might grow */
5547         big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
5548         mid = big + offset + len;
5549         midend = bigend = big + SvCUR(bigstr);
5550         bigend += i;
5551         *bigend = '\0';
5552         while (midend > mid)            /* shove everything down */
5553             *--bigend = *--midend;
5554         Move(little,big+offset,littlelen,char);
5555         SvCUR_set(bigstr, SvCUR(bigstr) + i);
5556         SvSETMAGIC(bigstr);
5557         return;
5558     }
5559     else if (i == 0) {
5560         Move(little,SvPVX(bigstr)+offset,len,char);
5561         SvSETMAGIC(bigstr);
5562         return;
5563     }
5564
5565     big = SvPVX(bigstr);
5566     mid = big + offset;
5567     midend = mid + len;
5568     bigend = big + SvCUR(bigstr);
5569
5570     if (midend > bigend)
5571         Perl_croak(aTHX_ "panic: sv_insert");
5572
5573     if (mid - big > bigend - midend) {  /* faster to shorten from end */
5574         if (littlelen) {
5575             Move(little, mid, littlelen,char);
5576             mid += littlelen;
5577         }
5578         i = bigend - midend;
5579         if (i > 0) {
5580             Move(midend, mid, i,char);
5581             mid += i;
5582         }
5583         *mid = '\0';
5584         SvCUR_set(bigstr, mid - big);
5585     }
5586     else if ((i = mid - big)) { /* faster from front */
5587         midend -= littlelen;
5588         mid = midend;
5589         Move(big, midend - i, i, char);
5590         sv_chop(bigstr,midend-i);
5591         if (littlelen)
5592             Move(little, mid, littlelen,char);
5593     }
5594     else if (littlelen) {
5595         midend -= littlelen;
5596         sv_chop(bigstr,midend);
5597         Move(little,midend,littlelen,char);
5598     }
5599     else {
5600         sv_chop(bigstr,midend);
5601     }
5602     SvSETMAGIC(bigstr);
5603 }
5604
5605 /*
5606 =for apidoc sv_replace
5607
5608 Make the first argument a copy of the second, then delete the original.
5609 The target SV physically takes over ownership of the body of the source SV
5610 and inherits its flags; however, the target keeps any magic it owns,
5611 and any magic in the source is discarded.
5612 Note that this is a rather specialist SV copying operation; most of the
5613 time you'll want to use C<sv_setsv> or one of its many macro front-ends.
5614
5615 =cut
5616 */
5617
5618 void
5619 Perl_sv_replace(pTHX_ register SV *const sv, register SV *const nsv)
5620 {
5621     dVAR;
5622     const U32 refcnt = SvREFCNT(sv);
5623
5624     PERL_ARGS_ASSERT_SV_REPLACE;
5625
5626     SV_CHECK_THINKFIRST_COW_DROP(sv);
5627     if (SvREFCNT(nsv) != 1) {
5628         Perl_croak(aTHX_ "panic: reference miscount on nsv in sv_replace()"
5629                    " (%" UVuf " != 1)", (UV) SvREFCNT(nsv));
5630     }
5631     if (SvMAGICAL(sv)) {
5632         if (SvMAGICAL(nsv))
5633             mg_free(nsv);
5634         else
5635             sv_upgrade(nsv, SVt_PVMG);
5636         SvMAGIC_set(nsv, SvMAGIC(sv));
5637         SvFLAGS(nsv) |= SvMAGICAL(sv);
5638         SvMAGICAL_off(sv);
5639         SvMAGIC_set(sv, NULL);
5640     }
5641     SvREFCNT(sv) = 0;
5642     sv_clear(sv);
5643     assert(!SvREFCNT(sv));
5644 #ifdef DEBUG_LEAKING_SCALARS
5645     sv->sv_flags  = nsv->sv_flags;
5646     sv->sv_any    = nsv->sv_any;
5647     sv->sv_refcnt = nsv->sv_refcnt;
5648     sv->sv_u      = nsv->sv_u;
5649 #else
5650     StructCopy(nsv,sv,SV);
5651 #endif
5652     if(SvTYPE(sv) == SVt_IV) {
5653         SvANY(sv)
5654             = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
5655     }
5656         
5657
5658 #ifdef PERL_OLD_COPY_ON_WRITE
5659     if (SvIsCOW_normal(nsv)) {
5660         /* We need to follow the pointers around the loop to make the
5661            previous SV point to sv, rather than nsv.  */
5662         SV *next;
5663         SV *current = nsv;
5664         while ((next = SV_COW_NEXT_SV(current)) != nsv) {
5665             assert(next);
5666             current = next;
5667             assert(SvPVX_const(current) == SvPVX_const(nsv));
5668         }
5669         /* Make the SV before us point to the SV after us.  */
5670         if (DEBUG_C_TEST) {
5671             PerlIO_printf(Perl_debug_log, "previous is\n");
5672             sv_dump(current);
5673             PerlIO_printf(Perl_debug_log,
5674                           "move it from 0x%"UVxf" to 0x%"UVxf"\n",
5675                           (UV) SV_COW_NEXT_SV(current), (UV) sv);
5676         }
5677         SV_COW_NEXT_SV_SET(current, sv);
5678     }
5679 #endif
5680     SvREFCNT(sv) = refcnt;
5681     SvFLAGS(nsv) |= SVTYPEMASK;         /* Mark as freed */
5682     SvREFCNT(nsv) = 0;
5683     del_SV(nsv);
5684 }
5685
5686 /* We're about to free a GV which has a CV that refers back to us.
5687  * If that CV will outlive us, make it anonymous (i.e. fix up its CvGV
5688  * field) */
5689
5690 STATIC void
5691 S_anonymise_cv_maybe(pTHX_ GV *gv, CV* cv)
5692 {
5693     char *stash;
5694     SV *gvname;
5695     GV *anongv;
5696
5697     PERL_ARGS_ASSERT_ANONYMISE_CV_MAYBE;
5698
5699     /* be assertive! */
5700     assert(SvREFCNT(gv) == 0);
5701     assert(isGV(gv) && isGV_with_GP(gv));
5702     assert(GvGP(gv));
5703     assert(!CvANON(cv));
5704     assert(CvGV(cv) == gv);
5705
5706     /* will the CV shortly be freed by gp_free() ? */
5707     if (GvCV(gv) == cv && GvGP(gv)->gp_refcnt < 2 && SvREFCNT(cv) < 2) {
5708         SvANY(cv)->xcv_gv = NULL;
5709         return;
5710     }
5711
5712     /* if not, anonymise: */
5713     stash  = GvSTASH(gv) ? HvNAME(GvSTASH(gv)) : NULL;
5714     gvname = Perl_newSVpvf(aTHX_ "%s::__ANON__",
5715                                         stash ? stash : "__ANON__");
5716     anongv = gv_fetchsv(gvname, GV_ADDMULTI, SVt_PVCV);
5717     SvREFCNT_dec(gvname);
5718
5719     CvANON_on(cv);
5720     CvCVGV_RC_on(cv);
5721     SvANY(cv)->xcv_gv = MUTABLE_GV(SvREFCNT_inc(anongv));
5722 }
5723
5724
5725 /*
5726 =for apidoc sv_clear
5727
5728 Clear an SV: call any destructors, free up any memory used by the body,
5729 and free the body itself. The SV's head is I<not> freed, although
5730 its type is set to all 1's so that it won't inadvertently be assumed
5731 to be live during global destruction etc.
5732 This function should only be called when REFCNT is zero. Most of the time
5733 you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
5734 instead.
5735
5736 =cut
5737 */
5738
5739 void
5740 Perl_sv_clear(pTHX_ register SV *const sv)
5741 {
5742     dVAR;
5743     const U32 type = SvTYPE(sv);
5744     const struct body_details *const sv_type_details
5745         = bodies_by_type + type;
5746     HV *stash;
5747
5748     PERL_ARGS_ASSERT_SV_CLEAR;
5749     assert(SvREFCNT(sv) == 0);
5750     assert(SvTYPE(sv) != SVTYPEMASK);
5751
5752     if (type <= SVt_IV) {
5753         /* See the comment in sv.h about the collusion between this early
5754            return and the overloading of the NULL slots in the size table.  */
5755         if (SvROK(sv))
5756             goto free_rv;
5757         SvFLAGS(sv) &= SVf_BREAK;
5758         SvFLAGS(sv) |= SVTYPEMASK;
5759         return;
5760     }
5761
5762     if (SvOBJECT(sv)) {
5763         if (PL_defstash &&      /* Still have a symbol table? */
5764             SvDESTROYABLE(sv))
5765         {
5766             dSP;
5767             HV* stash;
5768             do {        
5769                 CV* destructor;
5770                 stash = SvSTASH(sv);
5771                 destructor = StashHANDLER(stash,DESTROY);
5772                 if (destructor
5773                         /* A constant subroutine can have no side effects, so
5774                            don't bother calling it.  */
5775                         && !CvCONST(destructor)
5776                         /* Don't bother calling an empty destructor */
5777                         && (CvISXSUB(destructor)
5778                         || (CvSTART(destructor)
5779                             && (CvSTART(destructor)->op_next->op_type != OP_LEAVESUB))))
5780                 {
5781                     SV* const tmpref = newRV(sv);
5782                     SvREADONLY_on(tmpref);   /* DESTROY() could be naughty */
5783                     ENTER;
5784                     PUSHSTACKi(PERLSI_DESTROY);
5785                     EXTEND(SP, 2);
5786                     PUSHMARK(SP);
5787                     PUSHs(tmpref);
5788                     PUTBACK;
5789                     call_sv(MUTABLE_SV(destructor), G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
5790                 
5791                 
5792                     POPSTACK;
5793                     SPAGAIN;
5794                     LEAVE;
5795                     if(SvREFCNT(tmpref) < 2) {
5796                         /* tmpref is not kept alive! */
5797                         SvREFCNT(sv)--;
5798                         SvRV_set(tmpref, NULL);
5799                         SvROK_off(tmpref);
5800                     }
5801                     SvREFCNT_dec(tmpref);
5802                 }
5803             } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
5804
5805
5806             if (SvREFCNT(sv)) {
5807                 if (PL_in_clean_objs)
5808                     Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
5809                           HvNAME_get(stash));
5810                 /* DESTROY gave object new lease on life */
5811                 return;
5812             }
5813         }
5814
5815         if (SvOBJECT(sv)) {
5816             SvREFCNT_dec(SvSTASH(sv));  /* possibly of changed persuasion */
5817             SvOBJECT_off(sv);   /* Curse the object. */
5818             if (type != SVt_PVIO)
5819                 --PL_sv_objcount;       /* XXX Might want something more general */
5820         }
5821     }
5822     if (type >= SVt_PVMG) {
5823         if (type == SVt_PVMG && SvPAD_OUR(sv)) {
5824             SvREFCNT_dec(SvOURSTASH(sv));
5825         } else if (SvMAGIC(sv))
5826             mg_free(sv);
5827         if (type == SVt_PVMG && SvPAD_TYPED(sv))
5828             SvREFCNT_dec(SvSTASH(sv));
5829     }
5830     switch (type) {
5831         /* case SVt_BIND: */
5832     case SVt_PVIO:
5833         if (IoIFP(sv) &&
5834             IoIFP(sv) != PerlIO_stdin() &&
5835             IoIFP(sv) != PerlIO_stdout() &&
5836             IoIFP(sv) != PerlIO_stderr() &&
5837             !(IoFLAGS(sv) & IOf_FAKE_DIRP))
5838         {
5839             io_close(MUTABLE_IO(sv), FALSE);
5840         }
5841         if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
5842             PerlDir_close(IoDIRP(sv));
5843         IoDIRP(sv) = (DIR*)NULL;
5844         Safefree(IoTOP_NAME(sv));
5845         Safefree(IoFMT_NAME(sv));
5846         Safefree(IoBOTTOM_NAME(sv));
5847         goto freescalar;
5848     case SVt_REGEXP:
5849         /* FIXME for plugins */
5850         pregfree2((REGEXP*) sv);
5851         goto freescalar;
5852     case SVt_PVCV:
5853     case SVt_PVFM:
5854         cv_undef(MUTABLE_CV(sv));
5855         /* If we're in a stash, we don't own a reference to it. However it does
5856            have a back reference to us, which needs to be cleared.  */
5857         if ((stash = CvSTASH(sv)))
5858             sv_del_backref(MUTABLE_SV(stash), sv);
5859         goto freescalar;
5860     case SVt_PVHV:
5861         if (PL_last_swash_hv == (const HV *)sv) {
5862             PL_last_swash_hv = NULL;
5863         }
5864         Perl_hv_kill_backrefs(aTHX_ MUTABLE_HV(sv));
5865         hv_undef(MUTABLE_HV(sv));
5866         break;
5867     case SVt_PVAV:
5868         if (PL_comppad == MUTABLE_AV(sv)) {
5869             PL_comppad = NULL;
5870             PL_curpad = NULL;
5871         }
5872         av_undef(MUTABLE_AV(sv));
5873         break;
5874     case SVt_PVLV:
5875         if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
5876             SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv)));
5877             HeNEXT((HE*)LvTARG(sv)) = PL_hv_fetch_ent_mh;
5878             PL_hv_fetch_ent_mh = (HE*)LvTARG(sv);
5879         }
5880         else if (LvTYPE(sv) != 't') /* unless tie: unrefcnted fake SV**  */
5881             SvREFCNT_dec(LvTARG(sv));
5882     case SVt_PVGV:
5883         if (isGV_with_GP(sv)) {
5884             if(GvCVu((const GV *)sv) && (stash = GvSTASH(MUTABLE_GV(sv)))
5885                && HvNAME_get(stash))
5886                 mro_method_changed_in(stash);
5887             gp_free(MUTABLE_GV(sv));
5888             if (GvNAME_HEK(sv))
5889                 unshare_hek(GvNAME_HEK(sv));
5890             /* If we're in a stash, we don't own a reference to it. However it does
5891                have a back reference to us, which needs to be cleared.  */
5892             if (!SvVALID(sv) && (stash = GvSTASH(sv)))
5893                     sv_del_backref(MUTABLE_SV(stash), sv);
5894         }
5895         /* FIXME. There are probably more unreferenced pointers to SVs in the
5896            interpreter struct that we should check and tidy in a similar
5897            fashion to this:  */
5898         if ((const GV *)sv == PL_last_in_gv)
5899             PL_last_in_gv = NULL;
5900     case SVt_PVMG:
5901     case SVt_PVNV:
5902     case SVt_PVIV:
5903     case SVt_PV:
5904       freescalar:
5905         /* Don't bother with SvOOK_off(sv); as we're only going to free it.  */
5906         if (SvOOK(sv)) {
5907             STRLEN offset;
5908             SvOOK_offset(sv, offset);
5909             SvPV_set(sv, SvPVX_mutable(sv) - offset);
5910             /* Don't even bother with turning off the OOK flag.  */
5911         }
5912         if (SvROK(sv)) {
5913         free_rv:
5914             {
5915                 SV * const target = SvRV(sv);
5916                 if (SvWEAKREF(sv))
5917                     sv_del_backref(target, sv);
5918                 else
5919                     SvREFCNT_dec(target);
5920             }
5921         }
5922 #ifdef PERL_OLD_COPY_ON_WRITE
5923         else if (SvPVX_const(sv)
5924                  && !(SvTYPE(sv) == SVt_PVIO && !(IoFLAGS(sv) & IOf_FAKE_DIRP))) {
5925             if (SvIsCOW(sv)) {
5926                 if (DEBUG_C_TEST) {
5927                     PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
5928                     sv_dump(sv);
5929                 }
5930                 if (SvLEN(sv)) {
5931                     sv_release_COW(sv, SvPVX_const(sv), SV_COW_NEXT_SV(sv));
5932                 } else {
5933                     unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
5934                 }
5935
5936                 SvFAKE_off(sv);
5937             } else if (SvLEN(sv)) {
5938                 Safefree(SvPVX_const(sv));
5939             }
5940         }
5941 #else
5942         else if (SvPVX_const(sv) && SvLEN(sv)
5943                  && !(SvTYPE(sv) == SVt_PVIO && !(IoFLAGS(sv) & IOf_FAKE_DIRP)))
5944             Safefree(SvPVX_mutable(sv));
5945         else if (SvPVX_const(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
5946             unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
5947             SvFAKE_off(sv);
5948         }
5949 #endif
5950         break;
5951     case SVt_NV:
5952         break;
5953     }
5954
5955     SvFLAGS(sv) &= SVf_BREAK;
5956     SvFLAGS(sv) |= SVTYPEMASK;
5957
5958     if (sv_type_details->arena) {
5959         del_body(((char *)SvANY(sv) + sv_type_details->offset),
5960                  &PL_body_roots[type]);
5961     }
5962     else if (sv_type_details->body_size) {
5963         safefree(SvANY(sv));
5964     }
5965 }
5966
5967 /*
5968 =for apidoc sv_newref
5969
5970 Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
5971 instead.
5972
5973 =cut
5974 */
5975
5976 SV *
5977 Perl_sv_newref(pTHX_ SV *const sv)
5978 {
5979     PERL_UNUSED_CONTEXT;
5980     if (sv)
5981         (SvREFCNT(sv))++;
5982     return sv;
5983 }
5984
5985 /*
5986 =for apidoc sv_free
5987
5988 Decrement an SV's reference count, and if it drops to zero, call
5989 C<sv_clear> to invoke destructors and free up any memory used by
5990 the body; finally, deallocate the SV's head itself.
5991 Normally called via a wrapper macro C<SvREFCNT_dec>.
5992
5993 =cut
5994 */
5995
5996 void
5997 Perl_sv_free(pTHX_ SV *const sv)
5998 {
5999     dVAR;
6000     if (!sv)
6001         return;
6002     if (SvREFCNT(sv) == 0) {
6003         if (SvFLAGS(sv) & SVf_BREAK)
6004             /* this SV's refcnt has been artificially decremented to
6005              * trigger cleanup */
6006             return;
6007         if (PL_in_clean_all) /* All is fair */
6008             return;
6009         if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
6010             /* make sure SvREFCNT(sv)==0 happens very seldom */
6011             SvREFCNT(sv) = (~(U32)0)/2;
6012             return;
6013         }
6014         if (ckWARN_d(WARN_INTERNAL)) {
6015 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
6016             Perl_dump_sv_child(aTHX_ sv);
6017 #else
6018   #ifdef DEBUG_LEAKING_SCALARS
6019             sv_dump(sv);
6020   #endif
6021 #ifdef DEBUG_LEAKING_SCALARS_ABORT
6022             if (PL_warnhook == PERL_WARNHOOK_FATAL
6023                 || ckDEAD(packWARN(WARN_INTERNAL))) {
6024                 /* Don't let Perl_warner cause us to escape our fate:  */
6025                 abort();
6026             }
6027 #endif
6028             /* This may not return:  */
6029             Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
6030                         "Attempt to free unreferenced scalar: SV 0x%"UVxf
6031                         pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
6032 #endif
6033         }
6034 #ifdef DEBUG_LEAKING_SCALARS_ABORT
6035         abort();
6036 #endif
6037         return;
6038     }
6039     if (--(SvREFCNT(sv)) > 0)
6040         return;
6041     Perl_sv_free2(aTHX_ sv);
6042 }
6043
6044 void
6045 Perl_sv_free2(pTHX_ SV *const sv)
6046 {
6047     dVAR;
6048
6049     PERL_ARGS_ASSERT_SV_FREE2;
6050
6051 #ifdef DEBUGGING
6052     if (SvTEMP(sv)) {
6053         Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING),
6054                          "Attempt to free temp prematurely: SV 0x%"UVxf
6055                          pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
6056         return;
6057     }
6058 #endif
6059     if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
6060         /* make sure SvREFCNT(sv)==0 happens very seldom */
6061         SvREFCNT(sv) = (~(U32)0)/2;
6062         return;
6063     }
6064     sv_clear(sv);
6065     if (! SvREFCNT(sv))
6066         del_SV(sv);
6067 }
6068
6069 /*
6070 =for apidoc sv_len
6071
6072 Returns the length of the string in the SV. Handles magic and type
6073 coercion.  See also C<SvCUR>, which gives raw access to the xpv_cur slot.
6074
6075 =cut
6076 */
6077
6078 STRLEN
6079 Perl_sv_len(pTHX_ register SV *const sv)
6080 {
6081     STRLEN len;
6082
6083     if (!sv)
6084         return 0;
6085
6086     if (SvGMAGICAL(sv))
6087         len = mg_length(sv);
6088     else
6089         (void)SvPV_const(sv, len);
6090     return len;
6091 }
6092
6093 /*
6094 =for apidoc sv_len_utf8
6095
6096 Returns the number of characters in the string in an SV, counting wide
6097 UTF-8 bytes as a single character. Handles magic and type coercion.
6098
6099 =cut
6100 */
6101
6102 /*
6103  * The length is cached in PERL_MAGIC_utf8, in the mg_len field.  Also the
6104  * mg_ptr is used, by sv_pos_u2b() and sv_pos_b2u() - see the comments below.
6105  * (Note that the mg_len is not the length of the mg_ptr field.
6106  * This allows the cache to store the character length of the string without
6107  * needing to malloc() extra storage to attach to the mg_ptr.)
6108  *
6109  */
6110
6111 STRLEN
6112 Perl_sv_len_utf8(pTHX_ register SV *const sv)
6113 {
6114     if (!sv)
6115         return 0;
6116
6117     if (SvGMAGICAL(sv))
6118         return mg_length(sv);
6119     else
6120     {
6121         STRLEN len;
6122         const U8 *s = (U8*)SvPV_const(sv, len);
6123
6124         if (PL_utf8cache) {
6125             STRLEN ulen;
6126             MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : NULL;
6127
6128             if (mg && (mg->mg_len != -1 || mg->mg_ptr)) {
6129                 if (mg->mg_len != -1)
6130                     ulen = mg->mg_len;
6131                 else {
6132                     /* We can use the offset cache for a headstart.
6133                        The longer value is stored in the first pair.  */
6134                     STRLEN *cache = (STRLEN *) mg->mg_ptr;
6135
6136                     ulen = cache[0] + Perl_utf8_length(aTHX_ s + cache[1],
6137                                                        s + len);
6138                 }
6139                 
6140                 if (PL_utf8cache < 0) {
6141                     const STRLEN real = Perl_utf8_length(aTHX_ s, s + len);
6142                     assert_uft8_cache_coherent("sv_len_utf8", ulen, real, sv);
6143                 }
6144             }
6145             else {
6146                 ulen = Perl_utf8_length(aTHX_ s, s + len);
6147                 utf8_mg_len_cache_update(sv, &mg, ulen);
6148             }
6149             return ulen;
6150         }
6151         return Perl_utf8_length(aTHX_ s, s + len);
6152     }
6153 }
6154
6155 /* Walk forwards to find the byte corresponding to the passed in UTF-8
6156    offset.  */
6157 static STRLEN
6158 S_sv_pos_u2b_forwards(const U8 *const start, const U8 *const send,
6159                       STRLEN *const uoffset_p, bool *const at_end)
6160 {
6161     const U8 *s = start;
6162     STRLEN uoffset = *uoffset_p;
6163
6164     PERL_ARGS_ASSERT_SV_POS_U2B_FORWARDS;
6165
6166     while (s < send && uoffset) {
6167         --uoffset;
6168         s += UTF8SKIP(s);
6169     }
6170     if (s == send) {
6171         *at_end = TRUE;
6172     }
6173     else if (s > send) {
6174         *at_end = TRUE;
6175         /* This is the existing behaviour. Possibly it should be a croak, as
6176            it's actually a bounds error  */
6177         s = send;
6178     }
6179     *uoffset_p -= uoffset;
6180     return s - start;
6181 }
6182
6183 /* Given the length of the string in both bytes and UTF-8 characters, decide
6184    whether to walk forwards or backwards to find the byte corresponding to
6185    the passed in UTF-8 offset.  */
6186 static STRLEN
6187 S_sv_pos_u2b_midway(const U8 *const start, const U8 *send,
6188                     STRLEN uoffset, const STRLEN uend)
6189 {
6190     STRLEN backw = uend - uoffset;
6191
6192     PERL_ARGS_ASSERT_SV_POS_U2B_MIDWAY;
6193
6194     if (uoffset < 2 * backw) {
6195         /* The assumption is that going forwards is twice the speed of going
6196            forward (that's where the 2 * backw comes from).
6197            (The real figure of course depends on the UTF-8 data.)  */
6198         const U8 *s = start;
6199
6200         while (s < send && uoffset--)
6201             s += UTF8SKIP(s);
6202         assert (s <= send);
6203         if (s > send)
6204             s = send;
6205         return s - start;
6206     }
6207
6208     while (backw--) {
6209         send--;
6210         while (UTF8_IS_CONTINUATION(*send))
6211             send--;
6212     }
6213     return send - start;
6214 }
6215
6216 /* For the string representation of the given scalar, find the byte
6217    corresponding to the passed in UTF-8 offset.  uoffset0 and boffset0
6218    give another position in the string, *before* the sought offset, which
6219    (which is always true, as 0, 0 is a valid pair of positions), which should
6220    help reduce the amount of linear searching.
6221    If *mgp is non-NULL, it should point to the UTF-8 cache magic, which
6222    will be used to reduce the amount of linear searching. The cache will be
6223    created if necessary, and the found value offered to it for update.  */
6224 static STRLEN
6225 S_sv_pos_u2b_cached(pTHX_ SV *const sv, MAGIC **const mgp, const U8 *const start,
6226                     const U8 *const send, STRLEN uoffset,
6227                     STRLEN uoffset0, STRLEN boffset0)
6228 {
6229     STRLEN boffset = 0; /* Actually always set, but let's keep gcc happy.  */
6230     bool found = FALSE;
6231     bool at_end = FALSE;
6232
6233     PERL_ARGS_ASSERT_SV_POS_U2B_CACHED;
6234
6235     assert (uoffset >= uoffset0);
6236
6237     if (!uoffset)
6238         return 0;
6239
6240     if (!SvREADONLY(sv)
6241         && PL_utf8cache
6242         && (*mgp || (SvTYPE(sv) >= SVt_PVMG &&
6243                      (*mgp = mg_find(sv, PERL_MAGIC_utf8))))) {
6244         if ((*mgp)->mg_ptr) {
6245             STRLEN *cache = (STRLEN *) (*mgp)->mg_ptr;
6246             if (cache[0] == uoffset) {
6247                 /* An exact match. */
6248                 return cache[1];
6249             }
6250             if (cache[2] == uoffset) {
6251                 /* An exact match. */
6252                 return cache[3];
6253             }
6254
6255             if (cache[0] < uoffset) {
6256                 /* The cache already knows part of the way.   */
6257                 if (cache[0] > uoffset0) {
6258                     /* The cache knows more than the passed in pair  */
6259                     uoffset0 = cache[0];
6260                     boffset0 = cache[1];
6261                 }
6262                 if ((*mgp)->mg_len != -1) {
6263                     /* And we know the end too.  */
6264                     boffset = boffset0
6265                         + sv_pos_u2b_midway(start + boffset0, send,
6266                                               uoffset - uoffset0,
6267                                               (*mgp)->mg_len - uoffset0);
6268                 } else {
6269                     uoffset -= uoffset0;
6270                     boffset = boffset0
6271                         + sv_pos_u2b_forwards(start + boffset0,
6272                                               send, &uoffset, &at_end);
6273                     uoffset += uoffset0;
6274                 }
6275             }
6276             else if (cache[2] < uoffset) {
6277                 /* We're between the two cache entries.  */
6278                 if (cache[2] > uoffset0) {
6279                     /* and the cache knows more than the passed in pair  */
6280                     uoffset0 = cache[2];
6281                     boffset0 = cache[3];
6282                 }
6283
6284                 boffset = boffset0
6285                     + sv_pos_u2b_midway(start + boffset0,
6286                                           start + cache[1],
6287                                           uoffset - uoffset0,
6288                                           cache[0] - uoffset0);
6289             } else {
6290                 boffset = boffset0
6291                     + sv_pos_u2b_midway(start + boffset0,
6292                                           start + cache[3],
6293                                           uoffset - uoffset0,
6294                                           cache[2] - uoffset0);
6295             }
6296             found = TRUE;
6297         }
6298         else if ((*mgp)->mg_len != -1) {
6299             /* If we can take advantage of a passed in offset, do so.  */
6300             /* In fact, offset0 is either 0, or less than offset, so don't
6301                need to worry about the other possibility.  */
6302             boffset = boffset0
6303                 + sv_pos_u2b_midway(start + boffset0, send,
6304                                       uoffset - uoffset0,
6305                                       (*mgp)->mg_len - uoffset0);
6306             found = TRUE;
6307         }
6308     }
6309
6310     if (!found || PL_utf8cache < 0) {
6311         STRLEN real_boffset;
6312         uoffset -= uoffset0;
6313         real_boffset = boffset0 + sv_pos_u2b_forwards(start + boffset0,
6314                                                       send, &uoffset, &at_end);
6315         uoffset += uoffset0;
6316
6317         if (found && PL_utf8cache < 0)
6318             assert_uft8_cache_coherent("sv_pos_u2b_cache", boffset,
6319                                        real_boffset, sv);
6320         boffset = real_boffset;
6321     }
6322
6323     if (PL_utf8cache) {
6324         if (at_end)
6325             utf8_mg_len_cache_update(sv, mgp, uoffset);
6326         else
6327             utf8_mg_pos_cache_update(sv, mgp, boffset, uoffset, send - start);
6328     }
6329     return boffset;
6330 }
6331
6332
6333 /*
6334 =for apidoc sv_pos_u2b_flags
6335
6336 Converts the value pointed to by offsetp from a count of UTF-8 chars from
6337 the start of the string, to a count of the equivalent number of bytes; if
6338 lenp is non-zero, it does the same to lenp, but this time starting from
6339 the offset, rather than from the start of the string. Handles type coercion.
6340 I<flags> is passed to C<SvPV_flags>, and usually should be
6341 C<SV_GMAGIC|SV_CONST_RETURN> to handle magic.
6342
6343 =cut
6344 */
6345
6346 /*
6347  * sv_pos_u2b_flags() uses, like sv_pos_b2u(), the mg_ptr of the potential
6348  * PERL_MAGIC_utf8 of the sv to store the mapping between UTF-8 and
6349  * byte offsets.  See also the comments of S_utf8_mg_pos_cache_update().
6350  *
6351  */
6352
6353 STRLEN
6354 Perl_sv_pos_u2b_flags(pTHX_ SV *const sv, STRLEN uoffset, STRLEN *const lenp,
6355                       U32 flags)
6356 {
6357     const U8 *start;
6358     STRLEN len;
6359     STRLEN boffset;
6360
6361     PERL_ARGS_ASSERT_SV_POS_U2B_FLAGS;
6362
6363     start = (U8*)SvPV_flags(sv, len, flags);
6364     if (len) {
6365         const U8 * const send = start + len;
6366         MAGIC *mg = NULL;
6367         boffset = sv_pos_u2b_cached(sv, &mg, start, send, uoffset, 0, 0);
6368
6369         if (lenp
6370             && *lenp /* don't bother doing work for 0, as its bytes equivalent
6371                         is 0, and *lenp is already set to that.  */) {
6372             /* Convert the relative offset to absolute.  */
6373             const STRLEN uoffset2 = uoffset + *lenp;
6374             const STRLEN boffset2
6375                 = sv_pos_u2b_cached(sv, &mg, start, send, uoffset2,
6376                                       uoffset, boffset) - boffset;
6377
6378             *lenp = boffset2;
6379         }
6380     } else {
6381         if (lenp)
6382             *lenp = 0;
6383         boffset = 0;
6384     }
6385
6386     return boffset;
6387 }
6388
6389 /*
6390 =for apidoc sv_pos_u2b
6391
6392 Converts the value pointed to by offsetp from a count of UTF-8 chars from
6393 the start of the string, to a count of the equivalent number of bytes; if
6394 lenp is non-zero, it does the same to lenp, but this time starting from
6395 the offset, rather than from the start of the string. Handles magic and
6396 type coercion.
6397
6398 Use C<sv_pos_u2b_flags> in preference, which correctly handles strings longer
6399 than 2Gb.
6400
6401 =cut
6402 */
6403
6404 /*
6405  * sv_pos_u2b() uses, like sv_pos_b2u(), the mg_ptr of the potential
6406  * PERL_MAGIC_utf8 of the sv to store the mapping between UTF-8 and
6407  * byte offsets.  See also the comments of S_utf8_mg_pos_cache_update().
6408  *
6409  */
6410
6411 /* This function is subject to size and sign problems */
6412
6413 void
6414 Perl_sv_pos_u2b(pTHX_ register SV *const sv, I32 *const offsetp, I32 *const lenp)
6415 {
6416     PERL_ARGS_ASSERT_SV_POS_U2B;
6417
6418     if (lenp) {
6419         STRLEN ulen = (STRLEN)*lenp;
6420         *offsetp = (I32)sv_pos_u2b_flags(sv, (STRLEN)*offsetp, &ulen,
6421                                          SV_GMAGIC|SV_CONST_RETURN);
6422         *lenp = (I32)ulen;
6423     } else {
6424         *offsetp = (I32)sv_pos_u2b_flags(sv, (STRLEN)*offsetp, NULL,
6425                                          SV_GMAGIC|SV_CONST_RETURN);
6426     }
6427 }
6428
6429 static void
6430 S_utf8_mg_len_cache_update(pTHX_ SV *const sv, MAGIC **const mgp,
6431                            const STRLEN ulen)
6432 {
6433     PERL_ARGS_ASSERT_UTF8_MG_LEN_CACHE_UPDATE;
6434     if (SvREADONLY(sv))
6435         return;
6436
6437     if (!*mgp && (SvTYPE(sv) < SVt_PVMG ||
6438                   !(*mgp = mg_find(sv, PERL_MAGIC_utf8)))) {
6439         *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, &PL_vtbl_utf8, 0, 0);
6440     }
6441     assert(*mgp);
6442
6443     (*mgp)->mg_len = ulen;
6444     /* For now, treat "overflowed" as "still unknown". See RT #72924.  */
6445     if (ulen != (STRLEN) (*mgp)->mg_len)
6446         (*mgp)->mg_len = -1;
6447 }
6448
6449 /* Create and update the UTF8 magic offset cache, with the proffered utf8/
6450    byte length pairing. The (byte) length of the total SV is passed in too,
6451    as blen, because for some (more esoteric) SVs, the call to SvPV_const()
6452    may not have updated SvCUR, so we can't rely on reading it directly.
6453
6454    The proffered utf8/byte length pairing isn't used if the cache already has
6455    two pairs, and swapping either for the proffered pair would increase the
6456    RMS of the intervals between known byte offsets.
6457
6458    The cache itself consists of 4 STRLEN values
6459    0: larger UTF-8 offset
6460    1: corresponding byte offset
6461    2: smaller UTF-8 offset
6462    3: corresponding byte offset
6463
6464    Unused cache pairs have the value 0, 0.
6465    Keeping the cache "backwards" means that the invariant of
6466    cache[0] >= cache[2] is maintained even with empty slots, which means that
6467    the code that uses it doesn't need to worry if only 1 entry has actually
6468    been set to non-zero.  It also makes the "position beyond the end of the
6469    cache" logic much simpler, as the first slot is always the one to start
6470    from.   
6471 */
6472 static void
6473 S_utf8_mg_pos_cache_update(pTHX_ SV *const sv, MAGIC **const mgp, const STRLEN byte,
6474                            const STRLEN utf8, const STRLEN blen)
6475 {
6476     STRLEN *cache;
6477
6478     PERL_ARGS_ASSERT_UTF8_MG_POS_CACHE_UPDATE;
6479
6480     if (SvREADONLY(sv))
6481         return;
6482
6483     if (!*mgp && (SvTYPE(sv) < SVt_PVMG ||
6484                   !(*mgp = mg_find(sv, PERL_MAGIC_utf8)))) {
6485         *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, (MGVTBL*)&PL_vtbl_utf8, 0,
6486                            0);
6487         (*mgp)->mg_len = -1;
6488     }
6489     assert(*mgp);
6490
6491     if (!(cache = (STRLEN *)(*mgp)->mg_ptr)) {
6492         Newxz(cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
6493         (*mgp)->mg_ptr = (char *) cache;
6494     }
6495     assert(cache);
6496
6497     if (PL_utf8cache < 0 && SvPOKp(sv)) {
6498         /* SvPOKp() because it's possible that sv has string overloading, and
6499            therefore is a reference, hence SvPVX() is actually a pointer.
6500            This cures the (very real) symptoms of RT 69422, but I'm not actually
6501            sure whether we should even be caching the results of UTF-8
6502            operations on overloading, given that nothing stops overloading
6503            returning a different value every time it's called.  */
6504         const U8 *start = (const U8 *) SvPVX_const(sv);
6505         const STRLEN realutf8 = utf8_length(start, start + byte);
6506
6507         assert_uft8_cache_coherent("utf8_mg_pos_cache_update", utf8, realutf8,
6508                                    sv);
6509     }
6510
6511     /* Cache is held with the later position first, to simplify the code
6512        that deals with unbounded ends.  */
6513        
6514     ASSERT_UTF8_CACHE(cache);
6515     if (cache[1] == 0) {
6516         /* Cache is totally empty  */
6517         cache[0] = utf8;
6518         cache[1] = byte;
6519     } else if (cache[3] == 0) {
6520         if (byte > cache[1]) {
6521             /* New one is larger, so goes first.  */
6522             cache[2] = cache[0];
6523             cache[3] = cache[1];
6524             cache[0] = utf8;
6525             cache[1] = byte;
6526         } else {
6527             cache[2] = utf8;
6528             cache[3] = byte;
6529         }
6530     } else {
6531 #define THREEWAY_SQUARE(a,b,c,d) \
6532             ((float)((d) - (c))) * ((float)((d) - (c))) \
6533             + ((float)((c) - (b))) * ((float)((c) - (b))) \
6534                + ((float)((b) - (a))) * ((float)((b) - (a)))
6535
6536         /* Cache has 2 slots in use, and we know three potential pairs.
6537            Keep the two that give the lowest RMS distance. Do the
6538            calcualation in bytes simply because we always know the byte
6539            length.  squareroot has the same ordering as the positive value,
6540            so don't bother with the actual square root.  */
6541         const float existing = THREEWAY_SQUARE(0, cache[3], cache[1], blen);
6542         if (byte > cache[1]) {
6543             /* New position is after the existing pair of pairs.  */
6544             const float keep_earlier
6545                 = THREEWAY_SQUARE(0, cache[3], byte, blen);
6546             const float keep_later
6547                 = THREEWAY_SQUARE(0, cache[1], byte, blen);
6548
6549             if (keep_later < keep_earlier) {
6550                 if (keep_later < existing) {
6551                     cache[2] = cache[0];
6552                     cache[3] = cache[1];
6553                     cache[0] = utf8;
6554                     cache[1] = byte;
6555                 }
6556             }
6557             else {
6558                 if (keep_earlier < existing) {
6559                     cache[0] = utf8;
6560                     cache[1] = byte;
6561                 }
6562             }
6563         }
6564         else if (byte > cache[3]) {
6565             /* New position is between the existing pair of pairs.  */
6566             const float keep_earlier
6567                 = THREEWAY_SQUARE(0, cache[3], byte, blen);
6568             const float keep_later
6569                 = THREEWAY_SQUARE(0, byte, cache[1], blen);
6570
6571             if (keep_later < keep_earlier) {
6572                 if (keep_later < existing) {
6573                     cache[2] = utf8;
6574                     cache[3] = byte;
6575                 }
6576             }
6577             else {
6578                 if (keep_earlier < existing) {
6579                     cache[0] = utf8;
6580                     cache[1] = byte;
6581                 }
6582             }
6583         }
6584         else {
6585             /* New position is before the existing pair of pairs.  */
6586             const float keep_earlier
6587                 = THREEWAY_SQUARE(0, byte, cache[3], blen);
6588             const float keep_later
6589                 = THREEWAY_SQUARE(0, byte, cache[1], blen);
6590
6591             if (keep_later < keep_earlier) {
6592                 if (keep_later < existing) {
6593                     cache[2] = utf8;
6594                     cache[3] = byte;
6595                 }
6596             }
6597             else {
6598                 if (keep_earlier < existing) {
6599                     cache[0] = cache[2];
6600                     cache[1] = cache[3];
6601                     cache[2] = utf8;
6602                     cache[3] = byte;
6603                 }
6604             }
6605         }
6606     }
6607     ASSERT_UTF8_CACHE(cache);
6608 }
6609
6610 /* We already know all of the way, now we may be able to walk back.  The same
6611    assumption is made as in S_sv_pos_u2b_midway(), namely that walking
6612    backward is half the speed of walking forward. */
6613 static STRLEN
6614 S_sv_pos_b2u_midway(pTHX_ const U8 *const s, const U8 *const target,
6615                     const U8 *end, STRLEN endu)
6616 {
6617     const STRLEN forw = target - s;
6618     STRLEN backw = end - target;
6619
6620     PERL_ARGS_ASSERT_SV_POS_B2U_MIDWAY;
6621
6622     if (forw < 2 * backw) {
6623         return utf8_length(s, target);
6624     }
6625
6626     while (end > target) {
6627         end--;
6628         while (UTF8_IS_CONTINUATION(*end)) {
6629             end--;
6630         }
6631         endu--;
6632     }
6633     return endu;
6634 }
6635
6636 /*
6637 =for apidoc sv_pos_b2u
6638
6639 Converts the value pointed to by offsetp from a count of bytes from the
6640 start of the string, to a count of the equivalent number of UTF-8 chars.
6641 Handles magic and type coercion.
6642
6643 =cut
6644 */
6645
6646 /*
6647  * sv_pos_b2u() uses, like sv_pos_u2b(), the mg_ptr of the potential
6648  * PERL_MAGIC_utf8 of the sv to store the mapping between UTF-8 and
6649  * byte offsets.
6650  *
6651  */
6652 void
6653 Perl_sv_pos_b2u(pTHX_ register SV *const sv, I32 *const offsetp)
6654 {
6655     const U8* s;
6656     const STRLEN byte = *offsetp;
6657     STRLEN len = 0; /* Actually always set, but let's keep gcc happy.  */
6658     STRLEN blen;
6659     MAGIC* mg = NULL;
6660     const U8* send;
6661     bool found = FALSE;
6662
6663     PERL_ARGS_ASSERT_SV_POS_B2U;
6664
6665     if (!sv)
6666         return;
6667
6668     s = (const U8*)SvPV_const(sv, blen);
6669
6670     if (blen < byte)
6671         Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
6672
6673     send = s + byte;
6674
6675     if (!SvREADONLY(sv)
6676         && PL_utf8cache
6677         && SvTYPE(sv) >= SVt_PVMG
6678         && (mg = mg_find(sv, PERL_MAGIC_utf8)))
6679     {
6680         if (mg->mg_ptr) {
6681             STRLEN * const cache = (STRLEN *) mg->mg_ptr;
6682             if (cache[1] == byte) {
6683                 /* An exact match. */
6684                 *offsetp = cache[0];
6685                 return;
6686             }
6687             if (cache[3] == byte) {
6688                 /* An exact match. */
6689                 *offsetp = cache[2];
6690                 return;
6691             }
6692
6693             if (cache[1] < byte) {
6694                 /* We already know part of the way. */
6695                 if (mg->mg_len != -1) {
6696                     /* Actually, we know the end too.  */
6697                     len = cache[0]
6698                         + S_sv_pos_b2u_midway(aTHX_ s + cache[1], send,
6699                                               s + blen, mg->mg_len - cache[0]);
6700                 } else {
6701                     len = cache[0] + utf8_length(s + cache[1], send);
6702                 }
6703             }
6704             else if (cache[3] < byte) {
6705                 /* We're between the two cached pairs, so we do the calculation
6706                    offset by the byte/utf-8 positions for the earlier pair,
6707                    then add the utf-8 characters from the string start to
6708                    there.  */
6709                 len = S_sv_pos_b2u_midway(aTHX_ s + cache[3], send,
6710                                           s + cache[1], cache[0] - cache[2])
6711                     + cache[2];
6712
6713             }
6714             else { /* cache[3] > byte */
6715                 len = S_sv_pos_b2u_midway(aTHX_ s, send, s + cache[3],
6716                                           cache[2]);
6717
6718             }
6719             ASSERT_UTF8_CACHE(cache);
6720             found = TRUE;
6721         } else if (mg->mg_len != -1) {
6722             len = S_sv_pos_b2u_midway(aTHX_ s, send, s + blen, mg->mg_len);
6723             found = TRUE;
6724         }
6725     }
6726     if (!found || PL_utf8cache < 0) {
6727         const STRLEN real_len = utf8_length(s, send);
6728
6729         if (found && PL_utf8cache < 0)
6730             assert_uft8_cache_coherent("sv_pos_b2u", len, real_len, sv);
6731         len = real_len;
6732     }
6733     *offsetp = len;
6734
6735     if (PL_utf8cache) {
6736         if (blen == byte)
6737             utf8_mg_len_cache_update(sv, &mg, len);
6738         else
6739             utf8_mg_pos_cache_update(sv, &mg, byte, len, blen);
6740     }
6741 }
6742
6743 static void
6744 S_assert_uft8_cache_coherent(pTHX_ const char *const func, STRLEN from_cache,
6745                              STRLEN real, SV *const sv)
6746 {
6747     PERL_ARGS_ASSERT_ASSERT_UFT8_CACHE_COHERENT;
6748
6749     /* As this is debugging only code, save space by keeping this test here,
6750        rather than inlining it in all the callers.  */
6751     if (from_cache == real)
6752         return;
6753
6754     /* Need to turn the assertions off otherwise we may recurse infinitely
6755        while printing error messages.  */
6756     SAVEI8(PL_utf8cache);
6757     PL_utf8cache = 0;
6758     Perl_croak(aTHX_ "panic: %s cache %"UVuf" real %"UVuf" for %"SVf,
6759                func, (UV) from_cache, (UV) real, SVfARG(sv));
6760 }
6761
6762 /*
6763 =for apidoc sv_eq
6764
6765 Returns a boolean indicating whether the strings in the two SVs are
6766 identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6767 coerce its args to strings if necessary.
6768
6769 =cut
6770 */
6771
6772 I32
6773 Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
6774 {
6775     dVAR;
6776     const char *pv1;
6777     STRLEN cur1;
6778     const char *pv2;
6779     STRLEN cur2;
6780     I32  eq     = 0;
6781     char *tpv   = NULL;
6782     SV* svrecode = NULL;
6783
6784     if (!sv1) {
6785         pv1 = "";
6786         cur1 = 0;
6787     }
6788     else {
6789         /* if pv1 and pv2 are the same, second SvPV_const call may
6790          * invalidate pv1, so we may need to make a copy */
6791         if (sv1 == sv2 && (SvTHINKFIRST(sv1) || SvGMAGICAL(sv1))) {
6792             pv1 = SvPV_const(sv1, cur1);
6793             sv1 = newSVpvn_flags(pv1, cur1, SVs_TEMP | SvUTF8(sv2));
6794         }
6795         pv1 = SvPV_const(sv1, cur1);
6796     }
6797
6798     if (!sv2){
6799         pv2 = "";
6800         cur2 = 0;
6801     }
6802     else
6803         pv2 = SvPV_const(sv2, cur2);
6804
6805     if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
6806         /* Differing utf8ness.
6807          * Do not UTF8size the comparands as a side-effect. */
6808          if (PL_encoding) {
6809               if (SvUTF8(sv1)) {
6810                    svrecode = newSVpvn(pv2, cur2);
6811                    sv_recode_to_utf8(svrecode, PL_encoding);
6812                    pv2 = SvPV_const(svrecode, cur2);
6813               }
6814               else {
6815                    svrecode = newSVpvn(pv1, cur1);
6816                    sv_recode_to_utf8(svrecode, PL_encoding);
6817                    pv1 = SvPV_const(svrecode, cur1);
6818               }
6819               /* Now both are in UTF-8. */
6820               if (cur1 != cur2) {
6821                    SvREFCNT_dec(svrecode);
6822                    return FALSE;
6823               }
6824          }
6825          else {
6826               bool is_utf8 = TRUE;
6827
6828               if (SvUTF8(sv1)) {
6829                    /* sv1 is the UTF-8 one,
6830                     * if is equal it must be downgrade-able */
6831                    char * const pv = (char*)bytes_from_utf8((const U8*)pv1,
6832                                                      &cur1, &is_utf8);
6833                    if (pv != pv1)
6834                         pv1 = tpv = pv;
6835               }
6836               else {
6837                    /* sv2 is the UTF-8 one,
6838                     * if is equal it must be downgrade-able */
6839                    char * const pv = (char *)bytes_from_utf8((const U8*)pv2,
6840                                                       &cur2, &is_utf8);
6841                    if (pv != pv2)
6842                         pv2 = tpv = pv;
6843               }
6844               if (is_utf8) {
6845                    /* Downgrade not possible - cannot be eq */
6846                    assert (tpv == 0);
6847                    return FALSE;
6848               }
6849          }
6850     }
6851
6852     if (cur1 == cur2)
6853         eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
6854         
6855     SvREFCNT_dec(svrecode);
6856     if (tpv)
6857         Safefree(tpv);
6858
6859     return eq;
6860 }
6861
6862 /*
6863 =for apidoc sv_cmp
6864
6865 Compares the strings in two SVs.  Returns -1, 0, or 1 indicating whether the
6866 string in C<sv1> is less than, equal to, or greater than the string in
6867 C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6868 coerce its args to strings if necessary.  See also C<sv_cmp_locale>.
6869
6870 =cut
6871 */
6872
6873 I32
6874 Perl_sv_cmp(pTHX_ register SV *const sv1, register SV *const sv2)
6875 {
6876     dVAR;
6877     STRLEN cur1, cur2;
6878     const char *pv1, *pv2;
6879     char *tpv = NULL;
6880     I32  cmp;
6881     SV *svrecode = NULL;
6882
6883     if (!sv1) {
6884         pv1 = "";
6885         cur1 = 0;
6886     }
6887     else
6888         pv1 = SvPV_const(sv1, cur1);
6889
6890     if (!sv2) {
6891         pv2 = "";
6892         cur2 = 0;
6893     }
6894     else
6895         pv2 = SvPV_const(sv2, cur2);
6896
6897     if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
6898         /* Differing utf8ness.
6899          * Do not UTF8size the comparands as a side-effect. */
6900         if (SvUTF8(sv1)) {
6901             if (PL_encoding) {
6902                  svrecode = newSVpvn(pv2, cur2);
6903                  sv_recode_to_utf8(svrecode, PL_encoding);
6904                  pv2 = SvPV_const(svrecode, cur2);
6905             }
6906             else {
6907                  pv2 = tpv = (char*)bytes_to_utf8((const U8*)pv2, &cur2);
6908             }
6909         }
6910         else {
6911             if (PL_encoding) {
6912                  svrecode = newSVpvn(pv1, cur1);
6913                  sv_recode_to_utf8(svrecode, PL_encoding);
6914                  pv1 = SvPV_const(svrecode, cur1);
6915             }
6916             else {
6917                  pv1 = tpv = (char*)bytes_to_utf8((const U8*)pv1, &cur1);
6918             }
6919         }
6920     }
6921
6922     if (!cur1) {
6923         cmp = cur2 ? -1 : 0;
6924     } else if (!cur2) {
6925         cmp = 1;
6926     } else {
6927         const I32 retval = memcmp((const void*)pv1, (const void*)pv2, cur1 < cur2 ? cur1 : cur2);
6928
6929         if (retval) {
6930             cmp = retval < 0 ? -1 : 1;
6931         } else if (cur1 == cur2) {
6932             cmp = 0;
6933         } else {
6934             cmp = cur1 < cur2 ? -1 : 1;
6935         }
6936     }
6937
6938     SvREFCNT_dec(svrecode);
6939     if (tpv)
6940         Safefree(tpv);
6941
6942     return cmp;
6943 }
6944
6945 /*
6946 =for apidoc sv_cmp_locale
6947
6948 Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
6949 'use bytes' aware, handles get magic, and will coerce its args to strings
6950 if necessary.  See also C<sv_cmp>.
6951
6952 =cut
6953 */
6954
6955 I32
6956 Perl_sv_cmp_locale(pTHX_ register SV *const sv1, register SV *const sv2)
6957 {
6958     dVAR;
6959 #ifdef USE_LOCALE_COLLATE
6960
6961     char *pv1, *pv2;
6962     STRLEN len1, len2;
6963     I32 retval;
6964
6965     if (PL_collation_standard)
6966         goto raw_compare;
6967
6968     len1 = 0;
6969     pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
6970     len2 = 0;
6971     pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
6972
6973     if (!pv1 || !len1) {
6974         if (pv2 && len2)
6975             return -1;
6976         else
6977             goto raw_compare;
6978     }
6979     else {
6980         if (!pv2 || !len2)
6981             return 1;
6982     }
6983
6984     retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
6985
6986     if (retval)
6987         return retval < 0 ? -1 : 1;
6988
6989     /*
6990      * When the result of collation is equality, that doesn't mean
6991      * that there are no differences -- some locales exclude some
6992      * characters from consideration.  So to avoid false equalities,
6993      * we use the raw string as a tiebreaker.
6994      */
6995
6996   raw_compare:
6997     /*FALLTHROUGH*/
6998
6999 #endif /* USE_LOCALE_COLLATE */
7000
7001     return sv_cmp(sv1, sv2);
7002 }
7003
7004
7005 #ifdef USE_LOCALE_COLLATE
7006
7007 /*
7008 =for apidoc sv_collxfrm
7009
7010 Add Collate Transform magic to an SV if it doesn't already have it.
7011
7012 Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
7013 scalar data of the variable, but transformed to such a format that a normal
7014 memory comparison can be used to compare the data according to the locale
7015 settings.
7016
7017 =cut
7018 */
7019
7020 char *
7021 Perl_sv_collxfrm(pTHX_ SV *const sv, STRLEN *const nxp)
7022 {
7023     dVAR;
7024     MAGIC *mg;
7025
7026     PERL_ARGS_ASSERT_SV_COLLXFRM;
7027
7028     mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
7029     if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
7030         const char *s;
7031         char *xf;
7032         STRLEN len, xlen;
7033
7034         if (mg)
7035             Safefree(mg->mg_ptr);
7036         s = SvPV_const(sv, len);
7037         if ((xf = mem_collxfrm(s, len, &xlen))) {
7038             if (! mg) {
7039 #ifdef PERL_OLD_COPY_ON_WRITE
7040                 if (SvIsCOW(sv))
7041                     sv_force_normal_flags(sv, 0);
7042 #endif
7043                 mg = sv_magicext(sv, 0, PERL_MAGIC_collxfrm, &PL_vtbl_collxfrm,
7044                                  0, 0);
7045                 assert(mg);
7046             }
7047             mg->mg_ptr = xf;
7048             mg->mg_len = xlen;
7049         }
7050         else {
7051             if (mg) {
7052                 mg->mg_ptr = NULL;
7053                 mg->mg_len = -1;
7054             }
7055         }
7056     }
7057     if (mg && mg->mg_ptr) {
7058         *nxp = mg->mg_len;
7059         return mg->mg_ptr + sizeof(PL_collation_ix);
7060     }
7061     else {
7062         *nxp = 0;
7063         return NULL;
7064     }
7065 }
7066
7067 #endif /* USE_LOCALE_COLLATE */
7068
7069 /*
7070 =for apidoc sv_gets
7071
7072 Get a line from the filehandle and store it into the SV, optionally
7073 appending to the currently-stored string.
7074
7075 =cut
7076 */
7077
7078 char *
7079 Perl_sv_gets(pTHX_ register SV *const sv, register PerlIO *const fp, I32 append)
7080 {
7081     dVAR;
7082     const char *rsptr;
7083     STRLEN rslen;
7084     register STDCHAR rslast;
7085     register STDCHAR *bp;
7086     register I32 cnt;
7087     I32 i = 0;
7088     I32 rspara = 0;
7089
7090     PERL_ARGS_ASSERT_SV_GETS;
7091
7092     if (SvTHINKFIRST(sv))
7093         sv_force_normal_flags(sv, append ? 0 : SV_COW_DROP_PV);
7094     /* XXX. If you make this PVIV, then copy on write can copy scalars read
7095        from <>.
7096        However, perlbench says it's slower, because the existing swipe code
7097        is faster than copy on write.
7098        Swings and roundabouts.  */
7099     SvUPGRADE(sv, SVt_PV);
7100
7101     SvSCREAM_off(sv);
7102
7103     if (append) {
7104         if (PerlIO_isutf8(fp)) {
7105             if (!SvUTF8(sv)) {
7106                 sv_utf8_upgrade_nomg(sv);
7107                 sv_pos_u2b(sv,&append,0);
7108             }
7109         } else if (SvUTF8(sv)) {
7110             SV * const tsv = newSV(0);
7111             sv_gets(tsv, fp, 0);
7112             sv_utf8_upgrade_nomg(tsv);
7113             SvCUR_set(sv,append);
7114             sv_catsv(sv,tsv);
7115             sv_free(tsv);
7116             goto return_string_or_null;
7117         }
7118     }
7119
7120     SvPOK_only(sv);
7121     if (!append) {
7122         SvCUR_set(sv,0);
7123     }
7124     if (PerlIO_isutf8(fp))
7125         SvUTF8_on(sv);
7126
7127     if (IN_PERL_COMPILETIME) {
7128         /* we always read code in line mode */
7129         rsptr = "\n";
7130         rslen = 1;
7131     }
7132     else if (RsSNARF(PL_rs)) {
7133         /* If it is a regular disk file use size from stat() as estimate
7134            of amount we are going to read -- may result in mallocing
7135            more memory than we really need if the layers below reduce
7136            the size we read (e.g. CRLF or a gzip layer).
7137          */
7138         Stat_t st;
7139         if (!PerlLIO_fstat(PerlIO_fileno(fp), &st) && S_ISREG(st.st_mode))  {
7140             const Off_t offset = PerlIO_tell(fp);
7141             if (offset != (Off_t) -1 && st.st_size + append > offset) {
7142                 (void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 1));
7143             }
7144         }
7145         rsptr = NULL;
7146         rslen = 0;
7147     }
7148     else if (RsRECORD(PL_rs)) {
7149       I32 bytesread;
7150       char *buffer;
7151       U32 recsize;
7152 #ifdef VMS
7153       int fd;
7154 #endif
7155
7156       /* Grab the size of the record we're getting */
7157       recsize = SvUV(SvRV(PL_rs)); /* RsRECORD() guarantees > 0. */
7158       buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append;
7159       /* Go yank in */
7160 #ifdef VMS
7161       /* VMS wants read instead of fread, because fread doesn't respect */
7162       /* RMS record boundaries. This is not necessarily a good thing to be */
7163       /* doing, but we've got no other real choice - except avoid stdio
7164          as implementation - perhaps write a :vms layer ?
7165        */
7166       fd = PerlIO_fileno(fp);
7167       if (fd == -1) { /* in-memory file from PerlIO::Scalar */
7168           bytesread = PerlIO_read(fp, buffer, recsize);
7169       }
7170       else {
7171           bytesread = PerlLIO_read(fd, buffer, recsize);
7172       }
7173 #else
7174       bytesread = PerlIO_read(fp, buffer, recsize);
7175 #endif
7176       if (bytesread < 0)
7177           bytesread = 0;
7178       SvCUR_set(sv, bytesread + append);
7179       buffer[bytesread] = '\0';
7180       goto return_string_or_null;
7181     }
7182     else if (RsPARA(PL_rs)) {
7183         rsptr = "\n\n";
7184         rslen = 2;
7185         rspara = 1;
7186     }
7187     else {
7188         /* Get $/ i.e. PL_rs into same encoding as stream wants */
7189         if (PerlIO_isutf8(fp)) {
7190             rsptr = SvPVutf8(PL_rs, rslen);
7191         }
7192         else {
7193             if (SvUTF8(PL_rs)) {
7194                 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
7195                     Perl_croak(aTHX_ "Wide character in $/");
7196                 }
7197             }
7198             rsptr = SvPV_const(PL_rs, rslen);
7199         }
7200     }
7201
7202     rslast = rslen ? rsptr[rslen - 1] : '\0';
7203
7204     if (rspara) {               /* have to do this both before and after */
7205         do {                    /* to make sure file boundaries work right */
7206             if (PerlIO_eof(fp))
7207                 return 0;
7208             i = PerlIO_getc(fp);
7209             if (i != '\n') {
7210                 if (i == -1)
7211                     return 0;
7212                 PerlIO_ungetc(fp,i);
7213                 break;
7214             }
7215         } while (i != EOF);
7216     }
7217
7218     /* See if we know enough about I/O mechanism to cheat it ! */
7219
7220     /* This used to be #ifdef test - it is made run-time test for ease
7221        of abstracting out stdio interface. One call should be cheap
7222        enough here - and may even be a macro allowing compile
7223        time optimization.
7224      */
7225
7226     if (PerlIO_fast_gets(fp)) {
7227
7228     /*
7229      * We're going to steal some values from the stdio struct
7230      * and put EVERYTHING in the innermost loop into registers.
7231      */
7232     register STDCHAR *ptr;
7233     STRLEN bpx;
7234     I32 shortbuffered;
7235
7236 #if defined(VMS) && defined(PERLIO_IS_STDIO)
7237     /* An ungetc()d char is handled separately from the regular
7238      * buffer, so we getc() it back out and stuff it in the buffer.
7239      */
7240     i = PerlIO_getc(fp);
7241     if (i == EOF) return 0;
7242     *(--((*fp)->_ptr)) = (unsigned char) i;
7243     (*fp)->_cnt++;
7244 #endif
7245
7246     /* Here is some breathtakingly efficient cheating */
7247
7248     cnt = PerlIO_get_cnt(fp);                   /* get count into register */
7249     /* make sure we have the room */
7250     if ((I32)(SvLEN(sv) - append) <= cnt + 1) {
7251         /* Not room for all of it
7252            if we are looking for a separator and room for some
7253          */
7254         if (rslen && cnt > 80 && (I32)SvLEN(sv) > append) {
7255             /* just process what we have room for */
7256             shortbuffered = cnt - SvLEN(sv) + append + 1;
7257             cnt -= shortbuffered;
7258         }
7259         else {
7260             shortbuffered = 0;
7261             /* remember that cnt can be negative */
7262             SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
7263         }
7264     }
7265     else
7266         shortbuffered = 0;
7267     bp = (STDCHAR*)SvPVX_const(sv) + append;  /* move these two too to registers */
7268     ptr = (STDCHAR*)PerlIO_get_ptr(fp);
7269     DEBUG_P(PerlIO_printf(Perl_debug_log,
7270         "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
7271     DEBUG_P(PerlIO_printf(Perl_debug_log,
7272         "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
7273                PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
7274                PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
7275     for (;;) {
7276       screamer:
7277         if (cnt > 0) {
7278             if (rslen) {
7279                 while (cnt > 0) {                    /* this     |  eat */
7280                     cnt--;
7281                     if ((*bp++ = *ptr++) == rslast)  /* really   |  dust */
7282                         goto thats_all_folks;        /* screams  |  sed :-) */
7283                 }
7284             }
7285             else {
7286                 Copy(ptr, bp, cnt, char);            /* this     |  eat */
7287                 bp += cnt;                           /* screams  |  dust */
7288                 ptr += cnt;                          /* louder   |  sed :-) */
7289                 cnt = 0;
7290             }
7291         }
7292         
7293         if (shortbuffered) {            /* oh well, must extend */
7294             cnt = shortbuffered;
7295             shortbuffered = 0;
7296             bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
7297             SvCUR_set(sv, bpx);
7298             SvGROW(sv, SvLEN(sv) + append + cnt + 2);
7299             bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
7300             continue;
7301         }
7302
7303         DEBUG_P(PerlIO_printf(Perl_debug_log,
7304                               "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
7305                               PTR2UV(ptr),(long)cnt));
7306         PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
7307 #if 0
7308         DEBUG_P(PerlIO_printf(Perl_debug_log,
7309             "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
7310             PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
7311             PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
7312 #endif
7313         /* This used to call 'filbuf' in stdio form, but as that behaves like
7314            getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
7315            another abstraction.  */
7316         i   = PerlIO_getc(fp);          /* get more characters */
7317 #if 0
7318         DEBUG_P(PerlIO_printf(Perl_debug_log,
7319             "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
7320             PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
7321             PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
7322 #endif
7323         cnt = PerlIO_get_cnt(fp);
7324         ptr = (STDCHAR*)PerlIO_get_ptr(fp);     /* reregisterize cnt and ptr */
7325         DEBUG_P(PerlIO_printf(Perl_debug_log,
7326             "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
7327
7328         if (i == EOF)                   /* all done for ever? */
7329             goto thats_really_all_folks;
7330
7331         bpx = bp - (STDCHAR*)SvPVX_const(sv);   /* box up before relocation */
7332         SvCUR_set(sv, bpx);
7333         SvGROW(sv, bpx + cnt + 2);
7334         bp = (STDCHAR*)SvPVX_const(sv) + bpx;   /* unbox after relocation */
7335
7336         *bp++ = (STDCHAR)i;             /* store character from PerlIO_getc */
7337
7338         if (rslen && (STDCHAR)i == rslast)  /* all done for now? */
7339             goto thats_all_folks;
7340     }
7341
7342 thats_all_folks:
7343     if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX_const(sv)) < rslen) ||
7344           memNE((char*)bp - rslen, rsptr, rslen))
7345         goto screamer;                          /* go back to the fray */
7346 thats_really_all_folks:
7347     if (shortbuffered)
7348         cnt += shortbuffered;
7349         DEBUG_P(PerlIO_printf(Perl_debug_log,
7350             "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
7351     PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt);  /* put these back or we're in trouble */
7352     DEBUG_P(PerlIO_printf(Perl_debug_log,
7353         "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
7354         PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
7355         PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
7356     *bp = '\0';
7357     SvCUR_set(sv, bp - (STDCHAR*)SvPVX_const(sv));      /* set length */
7358     DEBUG_P(PerlIO_printf(Perl_debug_log,
7359         "Screamer: done, len=%ld, string=|%.*s|\n",
7360         (long)SvCUR(sv),(int)SvCUR(sv),SvPVX_const(sv)));
7361     }
7362    else
7363     {
7364        /*The big, slow, and stupid way. */
7365 #ifdef USE_HEAP_INSTEAD_OF_STACK        /* Even slower way. */
7366         STDCHAR *buf = NULL;
7367         Newx(buf, 8192, STDCHAR);
7368         assert(buf);
7369 #else
7370         STDCHAR buf[8192];
7371 #endif
7372
7373 screamer2:
7374         if (rslen) {
7375             register const STDCHAR * const bpe = buf + sizeof(buf);
7376             bp = buf;
7377             while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
7378                 ; /* keep reading */
7379             cnt = bp - buf;
7380         }
7381         else {
7382             cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
7383             /* Accomodate broken VAXC compiler, which applies U8 cast to
7384              * both args of ?: operator, causing EOF to change into 255
7385              */
7386             if (cnt > 0)
7387                  i = (U8)buf[cnt - 1];
7388             else
7389                  i = EOF;
7390         }
7391
7392         if (cnt < 0)
7393             cnt = 0;  /* we do need to re-set the sv even when cnt <= 0 */
7394         if (append)
7395              sv_catpvn(sv, (char *) buf, cnt);
7396         else
7397              sv_setpvn(sv, (char *) buf, cnt);
7398
7399         if (i != EOF &&                 /* joy */
7400             (!rslen ||
7401              SvCUR(sv) < rslen ||
7402              memNE(SvPVX_const(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
7403         {
7404             append = -1;
7405             /*
7406              * If we're reading from a TTY and we get a short read,
7407              * indicating that the user hit his EOF character, we need
7408              * to notice it now, because if we try to read from the TTY
7409              * again, the EOF condition will disappear.
7410              *
7411              * The comparison of cnt to sizeof(buf) is an optimization
7412              * that prevents unnecessary calls to feof().
7413              *
7414              * - jik 9/25/96
7415              */
7416             if (!(cnt < (I32)sizeof(buf) && PerlIO_eof(fp)))
7417                 goto screamer2;
7418         }
7419
7420 #ifdef USE_HEAP_INSTEAD_OF_STACK
7421         Safefree(buf);
7422 #endif
7423     }
7424
7425     if (rspara) {               /* have to do this both before and after */
7426         while (i != EOF) {      /* to make sure file boundaries work right */
7427             i = PerlIO_getc(fp);
7428             if (i != '\n') {
7429                 PerlIO_ungetc(fp,i);
7430                 break;
7431             }
7432         }
7433     }
7434
7435 return_string_or_null:
7436     return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
7437 }
7438
7439 /*
7440 =for apidoc sv_inc
7441
7442 Auto-increment of the value in the SV, doing string to numeric conversion
7443 if necessary. Handles 'get' magic and operator overloading.
7444
7445 =cut
7446 */
7447
7448 void
7449 Perl_sv_inc(pTHX_ register SV *const sv)
7450 {
7451     if (!sv)
7452         return;
7453     SvGETMAGIC(sv);
7454     sv_inc_nomg(sv);
7455 }
7456
7457 /*
7458 =for apidoc sv_inc_nomg
7459
7460 Auto-increment of the value in the SV, doing string to numeric conversion
7461 if necessary. Handles operator overloading. Skips handling 'get' magic.
7462
7463 =cut
7464 */
7465
7466 void
7467 Perl_sv_inc_nomg(pTHX_ register SV *const sv)
7468 {
7469     dVAR;
7470     register char *d;
7471     int flags;
7472
7473     if (!sv)
7474         return;
7475     if (SvTHINKFIRST(sv)) {
7476         if (SvIsCOW(sv))
7477             sv_force_normal_flags(sv, 0);
7478         if (SvREADONLY(sv)) {
7479             if (IN_PERL_RUNTIME)
7480                 Perl_croak_no_modify(aTHX);
7481         }
7482         if (SvROK(sv)) {
7483             IV i;
7484             if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
7485                 return;
7486             i = PTR2IV(SvRV(sv));
7487             sv_unref(sv);
7488             sv_setiv(sv, i);
7489         }
7490     }
7491     flags = SvFLAGS(sv);
7492     if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
7493         /* It's (privately or publicly) a float, but not tested as an
7494            integer, so test it to see. */
7495         (void) SvIV(sv);
7496         flags = SvFLAGS(sv);
7497     }
7498     if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
7499         /* It's publicly an integer, or privately an integer-not-float */
7500 #ifdef PERL_PRESERVE_IVUV
7501       oops_its_int:
7502 #endif
7503         if (SvIsUV(sv)) {
7504             if (SvUVX(sv) == UV_MAX)
7505                 sv_setnv(sv, UV_MAX_P1);
7506             else
7507                 (void)SvIOK_only_UV(sv);
7508                 SvUV_set(sv, SvUVX(sv) + 1);
7509         } else {
7510             if (SvIVX(sv) == IV_MAX)
7511                 sv_setuv(sv, (UV)IV_MAX + 1);
7512             else {
7513                 (void)SvIOK_only(sv);
7514                 SvIV_set(sv, SvIVX(sv) + 1);
7515             }   
7516         }
7517         return;
7518     }
7519     if (flags & SVp_NOK) {
7520         const NV was = SvNVX(sv);
7521         if (NV_OVERFLOWS_INTEGERS_AT &&
7522             was >= NV_OVERFLOWS_INTEGERS_AT) {
7523             Perl_ck_warner(aTHX_ packWARN(WARN_IMPRECISION),
7524                            "Lost precision when incrementing %" NVff " by 1",
7525                            was);
7526         }
7527         (void)SvNOK_only(sv);
7528         SvNV_set(sv, was + 1.0);
7529         return;
7530     }
7531
7532     if (!(flags & SVp_POK) || !*SvPVX_const(sv)) {
7533         if ((flags & SVTYPEMASK) < SVt_PVIV)
7534             sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV ? SVt_PVIV : SVt_IV));
7535         (void)SvIOK_only(sv);
7536         SvIV_set(sv, 1);
7537         return;
7538     }
7539     d = SvPVX(sv);
7540     while (isALPHA(*d)) d++;
7541     while (isDIGIT(*d)) d++;
7542     if (d < SvEND(sv)) {
7543 #ifdef PERL_PRESERVE_IVUV
7544         /* Got to punt this as an integer if needs be, but we don't issue
7545            warnings. Probably ought to make the sv_iv_please() that does
7546            the conversion if possible, and silently.  */
7547         const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
7548         if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
7549             /* Need to try really hard to see if it's an integer.
7550                9.22337203685478e+18 is an integer.
7551                but "9.22337203685478e+18" + 0 is UV=9223372036854779904
7552                so $a="9.22337203685478e+18"; $a+0; $a++
7553                needs to be the same as $a="9.22337203685478e+18"; $a++
7554                or we go insane. */
7555         
7556             (void) sv_2iv(sv);
7557             if (SvIOK(sv))
7558                 goto oops_its_int;
7559
7560             /* sv_2iv *should* have made this an NV */
7561             if (flags & SVp_NOK) {
7562                 (void)SvNOK_only(sv);
7563                 SvNV_set(sv, SvNVX(sv) + 1.0);
7564                 return;
7565             }
7566             /* I don't think we can get here. Maybe I should assert this
7567                And if we do get here I suspect that sv_setnv will croak. NWC
7568                Fall through. */
7569 #if defined(USE_LONG_DOUBLE)
7570             DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_inc punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"PERL_PRIgldbl"\n",
7571                                   SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
7572 #else
7573             DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_inc punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"NVgf"\n",
7574                                   SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
7575 #endif
7576         }
7577 #endif /* PERL_PRESERVE_IVUV */
7578         sv_setnv(sv,Atof(SvPVX_const(sv)) + 1.0);
7579         return;
7580     }
7581     d--;
7582     while (d >= SvPVX_const(sv)) {
7583         if (isDIGIT(*d)) {
7584             if (++*d <= '9')
7585                 return;
7586             *(d--) = '0';
7587         }
7588         else {
7589 #ifdef EBCDIC
7590             /* MKS: The original code here died if letters weren't consecutive.
7591              * at least it didn't have to worry about non-C locales.  The
7592              * new code assumes that ('z'-'a')==('Z'-'A'), letters are
7593              * arranged in order (although not consecutively) and that only
7594              * [A-Za-z] are accepted by isALPHA in the C locale.
7595              */
7596             if (*d != 'z' && *d != 'Z') {
7597                 do { ++*d; } while (!isALPHA(*d));
7598                 return;
7599             }
7600             *(d--) -= 'z' - 'a';
7601 #else
7602             ++*d;
7603             if (isALPHA(*d))
7604                 return;
7605             *(d--) -= 'z' - 'a' + 1;
7606 #endif
7607         }
7608     }
7609     /* oh,oh, the number grew */
7610     SvGROW(sv, SvCUR(sv) + 2);
7611     SvCUR_set(sv, SvCUR(sv) + 1);
7612     for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX_const(sv); d--)
7613         *d = d[-1];
7614     if (isDIGIT(d[1]))
7615         *d = '1';
7616     else
7617         *d = d[1];
7618 }
7619
7620 /*
7621 =for apidoc sv_dec
7622
7623 Auto-decrement of the value in the SV, doing string to numeric conversion
7624 if necessary. Handles 'get' magic and operator overloading.
7625
7626 =cut
7627 */
7628
7629 void
7630 Perl_sv_dec(pTHX_ register SV *const sv)
7631 {
7632     dVAR;
7633     if (!sv)
7634         return;
7635     SvGETMAGIC(sv);
7636     sv_dec_nomg(sv);
7637 }
7638
7639 /*
7640 =for apidoc sv_dec_nomg
7641
7642 Auto-decrement of the value in the SV, doing string to numeric conversion
7643 if necessary. Handles operator overloading. Skips handling 'get' magic.
7644
7645 =cut
7646 */
7647
7648 void
7649 Perl_sv_dec_nomg(pTHX_ register SV *const sv)
7650 {
7651     dVAR;
7652     int flags;
7653
7654     if (!sv)
7655         return;
7656     if (SvTHINKFIRST(sv)) {
7657         if (SvIsCOW(sv))
7658             sv_force_normal_flags(sv, 0);
7659         if (SvREADONLY(sv)) {
7660             if (IN_PERL_RUNTIME)
7661                 Perl_croak_no_modify(aTHX);
7662         }
7663         if (SvROK(sv)) {
7664             IV i;
7665             if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
7666                 return;
7667             i = PTR2IV(SvRV(sv));
7668             sv_unref(sv);
7669             sv_setiv(sv, i);
7670         }
7671     }
7672     /* Unlike sv_inc we don't have to worry about string-never-numbers
7673        and keeping them magic. But we mustn't warn on punting */
7674     flags = SvFLAGS(sv);
7675     if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
7676         /* It's publicly an integer, or privately an integer-not-float */
7677 #ifdef PERL_PRESERVE_IVUV
7678       oops_its_int:
7679 #endif
7680         if (SvIsUV(sv)) {
7681             if (SvUVX(sv) == 0) {
7682                 (void)SvIOK_only(sv);
7683                 SvIV_set(sv, -1);
7684             }
7685             else {
7686                 (void)SvIOK_only_UV(sv);
7687                 SvUV_set(sv, SvUVX(sv) - 1);
7688             }   
7689         } else {
7690             if (SvIVX(sv) == IV_MIN) {
7691                 sv_setnv(sv, (NV)IV_MIN);
7692                 goto oops_its_num;
7693             }
7694             else {
7695                 (void)SvIOK_only(sv);
7696                 SvIV_set(sv, SvIVX(sv) - 1);
7697             }   
7698         }
7699         return;
7700     }
7701     if (flags & SVp_NOK) {
7702     oops_its_num:
7703         {
7704             const NV was = SvNVX(sv);
7705             if (NV_OVERFLOWS_INTEGERS_AT &&
7706                 was <= -NV_OVERFLOWS_INTEGERS_AT) {
7707                 Perl_ck_warner(aTHX_ packWARN(WARN_IMPRECISION),
7708                                "Lost precision when decrementing %" NVff " by 1",
7709                                was);
7710             }
7711             (void)SvNOK_only(sv);
7712             SvNV_set(sv, was - 1.0);
7713             return;
7714         }
7715     }
7716     if (!(flags & SVp_POK)) {
7717         if ((flags & SVTYPEMASK) < SVt_PVIV)
7718             sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV) ? SVt_PVIV : SVt_IV);
7719         SvIV_set(sv, -1);
7720         (void)SvIOK_only(sv);
7721         return;
7722     }
7723 #ifdef PERL_PRESERVE_IVUV
7724     {
7725         const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
7726         if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
7727             /* Need to try really hard to see if it's an integer.
7728                9.22337203685478e+18 is an integer.
7729                but "9.22337203685478e+18" + 0 is UV=9223372036854779904
7730                so $a="9.22337203685478e+18"; $a+0; $a--
7731                needs to be the same as $a="9.22337203685478e+18"; $a--
7732                or we go insane. */
7733         
7734             (void) sv_2iv(sv);
7735             if (SvIOK(sv))
7736                 goto oops_its_int;
7737
7738             /* sv_2iv *should* have made this an NV */
7739             if (flags & SVp_NOK) {
7740                 (void)SvNOK_only(sv);
7741                 SvNV_set(sv, SvNVX(sv) - 1.0);
7742                 return;
7743             }
7744             /* I don't think we can get here. Maybe I should assert this
7745                And if we do get here I suspect that sv_setnv will croak. NWC
7746                Fall through. */
7747 #if defined(USE_LONG_DOUBLE)
7748             DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_dec punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"PERL_PRIgldbl"\n",
7749                                   SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
7750 #else
7751             DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_dec punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"NVgf"\n",
7752                                   SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
7753 #endif
7754         }
7755     }
7756 #endif /* PERL_PRESERVE_IVUV */
7757     sv_setnv(sv,Atof(SvPVX_const(sv)) - 1.0);   /* punt */
7758 }
7759
7760 /* this define is used to eliminate a chunk of duplicated but shared logic
7761  * it has the suffix __SV_C to signal that it isnt API, and isnt meant to be
7762  * used anywhere but here - yves
7763  */
7764 #define PUSH_EXTEND_MORTAL__SV_C(AnSv) \
7765     STMT_START {      \
7766         EXTEND_MORTAL(1); \
7767         PL_tmps_stack[++PL_tmps_ix] = (AnSv); \
7768     } STMT_END
7769
7770 /*
7771 =for apidoc sv_mortalcopy
7772
7773 Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
7774 The new SV is marked as mortal. It will be destroyed "soon", either by an
7775 explicit call to FREETMPS, or by an implicit call at places such as
7776 statement boundaries.  See also C<sv_newmortal> and C<sv_2mortal>.
7777
7778 =cut
7779 */
7780
7781 /* Make a string that will exist for the duration of the expression
7782  * evaluation.  Actually, it may have to last longer than that, but
7783  * hopefully we won't free it until it has been assigned to a
7784  * permanent location. */
7785
7786 SV *
7787 Perl_sv_mortalcopy(pTHX_ SV *const oldstr)
7788 {
7789     dVAR;
7790     register SV *sv;
7791
7792     new_SV(sv);
7793     sv_setsv(sv,oldstr);
7794     PUSH_EXTEND_MORTAL__SV_C(sv);
7795     SvTEMP_on(sv);
7796     return sv;
7797 }
7798
7799 /*
7800 =for apidoc sv_newmortal
7801
7802 Creates a new null SV which is mortal.  The reference count of the SV is
7803 set to 1. It will be destroyed "soon", either by an explicit call to
7804 FREETMPS, or by an implicit call at places such as statement boundaries.
7805 See also C<sv_mortalcopy> and C<sv_2mortal>.
7806
7807 =cut
7808 */
7809
7810 SV *
7811 Perl_sv_newmortal(pTHX)
7812 {
7813     dVAR;
7814     register SV *sv;
7815
7816     new_SV(sv);
7817     SvFLAGS(sv) = SVs_TEMP;
7818     PUSH_EXTEND_MORTAL__SV_C(sv);
7819     return sv;
7820 }
7821
7822
7823 /*
7824 =for apidoc newSVpvn_flags
7825
7826 Creates a new SV and copies a string into it.  The reference count for the
7827 SV is set to 1.  Note that if C<len> is zero, Perl will create a zero length
7828 string.  You are responsible for ensuring that the source string is at least
7829 C<len> bytes long.  If the C<s> argument is NULL the new SV will be undefined.
7830 Currently the only flag bits accepted are C<SVf_UTF8> and C<SVs_TEMP>.
7831 If C<SVs_TEMP> is set, then C<sv2mortal()> is called on the result before
7832 returning. If C<SVf_UTF8> is set, C<s> is considered to be in UTF-8 and the
7833 C<SVf_UTF8> flag will be set on the new SV.
7834 C<newSVpvn_utf8()> is a convenience wrapper for this function, defined as
7835
7836     #define newSVpvn_utf8(s, len, u)                    \
7837         newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0)
7838
7839 =cut
7840 */
7841
7842 SV *
7843 Perl_newSVpvn_flags(pTHX_ const char *const s, const STRLEN len, const U32 flags)
7844 {
7845     dVAR;
7846     register SV *sv;
7847
7848     /* All the flags we don't support must be zero.
7849        And we're new code so I'm going to assert this from the start.  */
7850     assert(!(flags & ~(SVf_UTF8|SVs_TEMP)));
7851     new_SV(sv);
7852     sv_setpvn(sv,s,len);
7853
7854     /* This code used to a sv_2mortal(), however we now unroll the call to sv_2mortal()
7855      * and do what it does outselves here.
7856      * Since we have asserted that flags can only have the SVf_UTF8 and/or SVs_TEMP flags
7857      * set above we can use it to enable the sv flags directly (bypassing SvTEMP_on), which
7858      * in turn means we dont need to mask out the SVf_UTF8 flag below, which means that we
7859      * eleminate quite a few steps than it looks - Yves (explaining patch by gfx)
7860      */
7861
7862     SvFLAGS(sv) |= flags;
7863
7864     if(flags & SVs_TEMP){
7865         PUSH_EXTEND_MORTAL__SV_C(sv);
7866     }
7867
7868     return sv;
7869 }
7870
7871 /*
7872 =for apidoc sv_2mortal
7873
7874 Marks an existing SV as mortal.  The SV will be destroyed "soon", either
7875 by an explicit call to FREETMPS, or by an implicit call at places such as
7876 statement boundaries.  SvTEMP() is turned on which means that the SV's
7877 string buffer can be "stolen" if this SV is copied. See also C<sv_newmortal>
7878 and C<sv_mortalcopy>.
7879
7880 =cut
7881 */
7882
7883 SV *
7884 Perl_sv_2mortal(pTHX_ register SV *const sv)
7885 {
7886     dVAR;
7887     if (!sv)
7888         return NULL;
7889     if (SvREADONLY(sv) && SvIMMORTAL(sv))
7890         return sv;
7891     PUSH_EXTEND_MORTAL__SV_C(sv);
7892     SvTEMP_on(sv);
7893     return sv;
7894 }
7895
7896 /*
7897 =for apidoc newSVpv
7898
7899 Creates a new SV and copies a string into it.  The reference count for the
7900 SV is set to 1.  If C<len> is zero, Perl will compute the length using
7901 strlen().  For efficiency, consider using C<newSVpvn> instead.
7902
7903 =cut
7904 */
7905
7906 SV *
7907 Perl_newSVpv(pTHX_ const char *const s, const STRLEN len)
7908 {
7909     dVAR;
7910     register SV *sv;
7911
7912     new_SV(sv);
7913     sv_setpvn(sv, s, len || s == NULL ? len : strlen(s));
7914     return sv;
7915 }
7916
7917 /*
7918 =for apidoc newSVpvn
7919
7920 Creates a new SV and copies a string into it.  The reference count for the
7921 SV is set to 1.  Note that if C<len> is zero, Perl will create a zero length
7922 string.  You are responsible for ensuring that the source string is at least
7923 C<len> bytes long.  If the C<s> argument is NULL the new SV will be undefined.
7924
7925 =cut
7926 */
7927
7928 SV *
7929 Perl_newSVpvn(pTHX_ const char *const s, const STRLEN len)
7930 {
7931     dVAR;
7932     register SV *sv;
7933
7934     new_SV(sv);
7935     sv_setpvn(sv,s,len);
7936     return sv;
7937 }
7938
7939 /*
7940 =for apidoc newSVhek
7941
7942 Creates a new SV from the hash key structure.  It will generate scalars that
7943 point to the shared string table where possible. Returns a new (undefined)
7944 SV if the hek is NULL.
7945
7946 =cut
7947 */
7948
7949 SV *
7950 Perl_newSVhek(pTHX_ const HEK *const hek)
7951 {
7952     dVAR;
7953     if (!hek) {
7954         SV *sv;
7955
7956         new_SV(sv);
7957         return sv;
7958     }
7959
7960     if (HEK_LEN(hek) == HEf_SVKEY) {
7961         return newSVsv(*(SV**)HEK_KEY(hek));
7962     } else {
7963         const int flags = HEK_FLAGS(hek);
7964         if (flags & HVhek_WASUTF8) {
7965             /* Trouble :-)
7966                Andreas would like keys he put in as utf8 to come back as utf8
7967             */
7968             STRLEN utf8_len = HEK_LEN(hek);
7969             const U8 *as_utf8 = bytes_to_utf8 ((U8*)HEK_KEY(hek), &utf8_len);
7970             SV * const sv = newSVpvn ((const char*)as_utf8, utf8_len);
7971
7972             SvUTF8_on (sv);
7973             Safefree (as_utf8); /* bytes_to_utf8() allocates a new string */
7974             return sv;
7975         } else if (flags & (HVhek_REHASH|HVhek_UNSHARED)) {
7976             /* We don't have a pointer to the hv, so we have to replicate the
7977                flag into every HEK. This hv is using custom a hasing
7978                algorithm. Hence we can't return a shared string scalar, as
7979                that would contain the (wrong) hash value, and might get passed
7980                into an hv routine with a regular hash.
7981                Similarly, a hash that isn't using shared hash keys has to have
7982                the flag in every key so that we know not to try to call
7983                share_hek_kek on it.  */
7984
7985             SV * const sv = newSVpvn (HEK_KEY(hek), HEK_LEN(hek));
7986             if (HEK_UTF8(hek))
7987                 SvUTF8_on (sv);
7988             return sv;
7989         }
7990         /* This will be overwhelminly the most common case.  */
7991         {
7992             /* Inline most of newSVpvn_share(), because share_hek_hek() is far
7993                more efficient than sharepvn().  */
7994             SV *sv;
7995
7996             new_SV(sv);
7997             sv_upgrade(sv, SVt_PV);
7998             SvPV_set(sv, (char *)HEK_KEY(share_hek_hek(hek)));
7999             SvCUR_set(sv, HEK_LEN(hek));
8000             SvLEN_set(sv, 0);
8001             SvREADONLY_on(sv);
8002             SvFAKE_on(sv);
8003             SvPOK_on(sv);
8004             if (HEK_UTF8(hek))
8005                 SvUTF8_on(sv);
8006             return sv;
8007         }
8008     }
8009 }
8010
8011 /*
8012 =for apidoc newSVpvn_share
8013
8014 Creates a new SV with its SvPVX_const pointing to a shared string in the string
8015 table. If the string does not already exist in the table, it is created
8016 first.  Turns on READONLY and FAKE. If the C<hash> parameter is non-zero, that
8017 value is used; otherwise the hash is computed. The string's hash can be later
8018 be retrieved from the SV with the C<SvSHARED_HASH()> macro. The idea here is
8019 that as the string table is used for shared hash keys these strings will have
8020 SvPVX_const == HeKEY and hash lookup will avoid string compare.
8021
8022 =cut
8023 */
8024
8025 SV *
8026 Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
8027 {
8028     dVAR;
8029     register SV *sv;
8030     bool is_utf8 = FALSE;
8031     const char *const orig_src = src;
8032
8033     if (len < 0) {
8034         STRLEN tmplen = -len;
8035         is_utf8 = TRUE;
8036         /* See the note in hv.c:hv_fetch() --jhi */
8037         src = (char*)bytes_from_utf8((const U8*)src, &tmplen, &is_utf8);
8038         len = tmplen;
8039     }
8040     if (!hash)
8041         PERL_HASH(hash, src, len);
8042     new_SV(sv);
8043     /* The logic for this is inlined in S_mro_get_linear_isa_dfs(), so if it
8044        changes here, update it there too.  */
8045     sv_upgrade(sv, SVt_PV);
8046     SvPV_set(sv, sharepvn(src, is_utf8?-len:len, hash));
8047     SvCUR_set(sv, len);
8048     SvLEN_set(sv, 0);
8049     SvREADONLY_on(sv);
8050     SvFAKE_on(sv);
8051     SvPOK_on(sv);
8052     if (is_utf8)
8053         SvUTF8_on(sv);
8054     if (src != orig_src)
8055         Safefree(src);
8056     return sv;
8057 }
8058
8059
8060 #if defined(PERL_IMPLICIT_CONTEXT)
8061
8062 /* pTHX_ magic can't cope with varargs, so this is a no-context
8063  * version of the main function, (which may itself be aliased to us).
8064  * Don't access this version directly.
8065  */
8066
8067 SV *
8068 Perl_newSVpvf_nocontext(const char *const pat, ...)
8069 {
8070     dTHX;
8071     register SV *sv;
8072     va_list args;
8073
8074     PERL_ARGS_ASSERT_NEWSVPVF_NOCONTEXT;
8075
8076     va_start(args, pat);
8077     sv = vnewSVpvf(pat, &args);
8078     va_end(args);
8079     return sv;
8080 }
8081 #endif
8082
8083 /*
8084 =for apidoc newSVpvf
8085
8086 Creates a new SV and initializes it with the string formatted like
8087 C<sprintf>.
8088
8089 =cut
8090 */
8091
8092 SV *
8093 Perl_newSVpvf(pTHX_ const char *const pat, ...)
8094 {
8095     register SV *sv;
8096     va_list args;
8097
8098     PERL_ARGS_ASSERT_NEWSVPVF;
8099
8100     va_start(args, pat);
8101     sv = vnewSVpvf(pat, &args);
8102     va_end(args);
8103     return sv;
8104 }
8105
8106 /* backend for newSVpvf() and newSVpvf_nocontext() */
8107
8108 SV *
8109 Perl_vnewSVpvf(pTHX_ const char *const pat, va_list *const args)
8110 {
8111     dVAR;
8112     register SV *sv;
8113
8114     PERL_ARGS_ASSERT_VNEWSVPVF;
8115
8116     new_SV(sv);
8117     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
8118     return sv;
8119 }
8120
8121 /*
8122 =for apidoc newSVnv
8123
8124 Creates a new SV and copies a floating point value into it.
8125 The reference count for the SV is set to 1.
8126
8127 =cut
8128 */
8129
8130 SV *
8131 Perl_newSVnv(pTHX_ const NV n)
8132 {
8133     dVAR;
8134     register SV *sv;
8135
8136     new_SV(sv);
8137     sv_setnv(sv,n);
8138     return sv;
8139 }
8140
8141 /*
8142 =for apidoc newSViv
8143
8144 Creates a new SV and copies an integer into it.  The reference count for the
8145 SV is set to 1.
8146
8147 =cut
8148 */
8149
8150 SV *
8151 Perl_newSViv(pTHX_ const IV i)
8152 {
8153     dVAR;
8154     register SV *sv;
8155
8156     new_SV(sv);
8157     sv_setiv(sv,i);
8158     return sv;
8159 }
8160
8161 /*
8162 =for apidoc newSVuv
8163
8164 Creates a new SV and copies an unsigned integer into it.
8165 The reference count for the SV is set to 1.
8166
8167 =cut
8168 */
8169
8170 SV *
8171 Perl_newSVuv(pTHX_ const UV u)
8172 {
8173     dVAR;
8174     register SV *sv;
8175
8176     new_SV(sv);
8177     sv_setuv(sv,u);
8178     return sv;
8179 }
8180
8181 /*
8182 =for apidoc newSV_type
8183
8184 Creates a new SV, of the type specified.  The reference count for the new SV
8185 is set to 1.
8186
8187 =cut
8188 */
8189
8190 SV *
8191 Perl_newSV_type(pTHX_ const svtype type)
8192 {
8193     register SV *sv;
8194
8195     new_SV(sv);
8196     sv_upgrade(sv, type);
8197     return sv;
8198 }
8199
8200 /*
8201 =for apidoc newRV_noinc
8202
8203 Creates an RV wrapper for an SV.  The reference count for the original
8204 SV is B<not> incremented.
8205
8206 =cut
8207 */
8208
8209 SV *
8210 Perl_newRV_noinc(pTHX_ SV *const tmpRef)
8211 {
8212     dVAR;
8213     register SV *sv = newSV_type(SVt_IV);
8214
8215     PERL_ARGS_ASSERT_NEWRV_NOINC;
8216
8217     SvTEMP_off(tmpRef);
8218     SvRV_set(sv, tmpRef);
8219     SvROK_on(sv);
8220     return sv;
8221 }
8222
8223 /* newRV_inc is the official function name to use now.
8224  * newRV_inc is in fact #defined to newRV in sv.h
8225  */
8226
8227 SV *
8228 Perl_newRV(pTHX_ SV *const sv)
8229 {
8230     dVAR;
8231
8232     PERL_ARGS_ASSERT_NEWRV;
8233
8234     return newRV_noinc(SvREFCNT_inc_simple_NN(sv));
8235 }
8236
8237 /*
8238 =for apidoc newSVsv
8239
8240 Creates a new SV which is an exact duplicate of the original SV.
8241 (Uses C<sv_setsv>).
8242
8243 =cut
8244 */
8245
8246 SV *
8247 Perl_newSVsv(pTHX_ register SV *const old)
8248 {
8249     dVAR;
8250     register SV *sv;
8251
8252     if (!old)
8253         return NULL;
8254     if (SvTYPE(old) == SVTYPEMASK) {
8255         Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
8256         return NULL;
8257     }
8258     new_SV(sv);
8259     /* SV_GMAGIC is the default for sv_setv()
8260        SV_NOSTEAL prevents TEMP buffers being, well, stolen, and saves games
8261        with SvTEMP_off and SvTEMP_on round a call to sv_setsv.  */
8262     sv_setsv_flags(sv, old, SV_GMAGIC | SV_NOSTEAL);
8263     return sv;
8264 }
8265
8266 /*
8267 =for apidoc sv_reset
8268
8269 Underlying implementation for the C<reset> Perl function.
8270 Note that the perl-level function is vaguely deprecated.
8271
8272 =cut
8273 */
8274
8275 void
8276 Perl_sv_reset(pTHX_ register const char *s, HV *const stash)
8277 {
8278     dVAR;
8279     char todo[PERL_UCHAR_MAX+1];
8280
8281     PERL_ARGS_ASSERT_SV_RESET;
8282
8283     if (!stash)
8284         return;
8285
8286     if (!*s) {          /* reset ?? searches */
8287         MAGIC * const mg = mg_find((const SV *)stash, PERL_MAGIC_symtab);
8288         if (mg) {
8289             const U32 count = mg->mg_len / sizeof(PMOP**);
8290             PMOP **pmp = (PMOP**) mg->mg_ptr;
8291             PMOP *const *const end = pmp + count;
8292
8293             while (pmp < end) {
8294 #ifdef USE_ITHREADS
8295                 SvREADONLY_off(PL_regex_pad[(*pmp)->op_pmoffset]);
8296 #else
8297                 (*pmp)->op_pmflags &= ~PMf_USED;
8298 #endif
8299                 ++pmp;
8300             }
8301         }
8302         return;
8303     }
8304
8305     /* reset variables */
8306
8307     if (!HvARRAY(stash))
8308         return;
8309
8310     Zero(todo, 256, char);
8311     while (*s) {
8312         I32 max;
8313         I32 i = (unsigned char)*s;
8314         if (s[1] == '-') {
8315             s += 2;
8316         }
8317         max = (unsigned char)*s++;
8318         for ( ; i <= max; i++) {
8319             todo[i] = 1;
8320         }
8321         for (i = 0; i <= (I32) HvMAX(stash); i++) {
8322             HE *entry;
8323             for (entry = HvARRAY(stash)[i];
8324                  entry;
8325                  entry = HeNEXT(entry))
8326             {
8327                 register GV *gv;
8328                 register SV *sv;
8329
8330                 if (!todo[(U8)*HeKEY(entry)])
8331                     continue;
8332                 gv = MUTABLE_GV(HeVAL(entry));
8333                 sv = GvSV(gv);
8334                 if (sv) {
8335                     if (SvTHINKFIRST(sv)) {
8336                         if (!SvREADONLY(sv) && SvROK(sv))
8337                             sv_unref(sv);
8338                         /* XXX Is this continue a bug? Why should THINKFIRST
8339                            exempt us from resetting arrays and hashes?  */
8340                         continue;
8341                     }
8342                     SvOK_off(sv);
8343                     if (SvTYPE(sv) >= SVt_PV) {
8344                         SvCUR_set(sv, 0);
8345                         if (SvPVX_const(sv) != NULL)
8346                             *SvPVX(sv) = '\0';
8347                         SvTAINT(sv);
8348                     }
8349                 }
8350                 if (GvAV(gv)) {
8351                     av_clear(GvAV(gv));
8352                 }
8353                 if (GvHV(gv) && !HvNAME_get(GvHV(gv))) {
8354 #if defined(VMS)
8355                     Perl_die(aTHX_ "Can't reset %%ENV on this system");
8356 #else /* ! VMS */
8357                     hv_clear(GvHV(gv));
8358 #  if defined(USE_ENVIRON_ARRAY)
8359                     if (gv == PL_envgv)
8360                         my_clearenv();
8361 #  endif /* USE_ENVIRON_ARRAY */
8362 #endif /* VMS */
8363                 }
8364             }
8365         }
8366     }
8367 }
8368
8369 /*
8370 =for apidoc sv_2io
8371
8372 Using various gambits, try to get an IO from an SV: the IO slot if its a
8373 GV; or the recursive result if we're an RV; or the IO slot of the symbol
8374 named after the PV if we're a string.
8375
8376 =cut
8377 */
8378
8379 IO*
8380 Perl_sv_2io(pTHX_ SV *const sv)
8381 {
8382     IO* io;
8383     GV* gv;
8384
8385     PERL_ARGS_ASSERT_SV_2IO;
8386
8387     switch (SvTYPE(sv)) {
8388     case SVt_PVIO:
8389         io = MUTABLE_IO(sv);
8390         break;
8391     case SVt_PVGV:
8392         if (isGV_with_GP(sv)) {
8393             gv = MUTABLE_GV(sv);
8394             io = GvIO(gv);
8395             if (!io)
8396                 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
8397             break;
8398         }
8399         /* FALL THROUGH */
8400     default:
8401         if (!SvOK(sv))
8402             Perl_croak(aTHX_ PL_no_usym, "filehandle");
8403         if (SvROK(sv))
8404             return sv_2io(SvRV(sv));
8405         gv = gv_fetchsv(sv, 0, SVt_PVIO);
8406         if (gv)
8407             io = GvIO(gv);
8408         else
8409             io = 0;
8410         if (!io)
8411             Perl_croak(aTHX_ "Bad filehandle: %"SVf, SVfARG(sv));
8412         break;
8413     }
8414     return io;
8415 }
8416
8417 /*
8418 =for apidoc sv_2cv
8419
8420 Using various gambits, try to get a CV from an SV; in addition, try if
8421 possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
8422 The flags in C<lref> are passed to gv_fetchsv.
8423
8424 =cut
8425 */
8426
8427 CV *
8428 Perl_sv_2cv(pTHX_ SV *sv, HV **const st, GV **const gvp, const I32 lref)
8429 {
8430     dVAR;
8431     GV *gv = NULL;
8432     CV *cv = NULL;
8433
8434     PERL_ARGS_ASSERT_SV_2CV;
8435
8436     if (!sv) {
8437         *st = NULL;
8438         *gvp = NULL;
8439         return NULL;
8440     }
8441     switch (SvTYPE(sv)) {
8442     case SVt_PVCV:
8443         *st = CvSTASH(sv);
8444         *gvp = NULL;
8445         return MUTABLE_CV(sv);
8446     case SVt_PVHV:
8447     case SVt_PVAV:
8448         *st = NULL;
8449         *gvp = NULL;
8450         return NULL;
8451     case SVt_PVGV:
8452         if (isGV_with_GP(sv)) {
8453             gv = MUTABLE_GV(sv);
8454             *gvp = gv;
8455             *st = GvESTASH(gv);
8456             goto fix_gv;
8457         }
8458         /* FALL THROUGH */
8459
8460     default:
8461         if (SvROK(sv)) {
8462             SV * const *sp = &sv;       /* Used in tryAMAGICunDEREF macro. */
8463             SvGETMAGIC(sv);
8464             tryAMAGICunDEREF(to_cv);
8465
8466             sv = SvRV(sv);
8467             if (SvTYPE(sv) == SVt_PVCV) {
8468                 cv = MUTABLE_CV(sv);
8469                 *gvp = NULL;
8470                 *st = CvSTASH(cv);
8471                 return cv;
8472             }
8473             else if(isGV_with_GP(sv))
8474                 gv = MUTABLE_GV(sv);
8475             else
8476                 Perl_croak(aTHX_ "Not a subroutine reference");
8477         }
8478         else if (isGV_with_GP(sv)) {
8479             SvGETMAGIC(sv);
8480             gv = MUTABLE_GV(sv);
8481         }
8482         else
8483             gv = gv_fetchsv(sv, lref, SVt_PVCV); /* Calls get magic */
8484         *gvp = gv;
8485         if (!gv) {
8486             *st = NULL;
8487             return NULL;
8488         }
8489         /* Some flags to gv_fetchsv mean don't really create the GV  */
8490         if (!isGV_with_GP(gv)) {
8491             *st = NULL;
8492             return NULL;
8493         }
8494         *st = GvESTASH(gv);
8495     fix_gv:
8496         if (lref && !GvCVu(gv)) {
8497             SV *tmpsv;
8498             ENTER;
8499             tmpsv = newSV(0);
8500             gv_efullname3(tmpsv, gv, NULL);
8501             /* XXX this is probably not what they think they're getting.
8502              * It has the same effect as "sub name;", i.e. just a forward
8503              * declaration! */
8504             newSUB(start_subparse(FALSE, 0),
8505                    newSVOP(OP_CONST, 0, tmpsv),
8506                    NULL, NULL);
8507             LEAVE;
8508             if (!GvCVu(gv))
8509                 Perl_croak(aTHX_ "Unable to create sub named \"%"SVf"\"",
8510                            SVfARG(SvOK(sv) ? sv : &PL_sv_no));
8511         }
8512         return GvCVu(gv);
8513     }
8514 }
8515
8516 /*
8517 =for apidoc sv_true
8518
8519 Returns true if the SV has a true value by Perl's rules.
8520 Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
8521 instead use an in-line version.
8522
8523 =cut
8524 */
8525
8526 I32
8527 Perl_sv_true(pTHX_ register SV *const sv)
8528 {
8529     if (!sv)
8530         return 0;
8531     if (SvPOK(sv)) {
8532         register const XPV* const tXpv = (XPV*)SvANY(sv);
8533         if (tXpv &&
8534                 (tXpv->xpv_cur > 1 ||
8535                 (tXpv->xpv_cur && *sv->sv_u.svu_pv != '0')))
8536             return 1;
8537         else
8538             return 0;
8539     }
8540     else {
8541         if (SvIOK(sv))
8542             return SvIVX(sv) != 0;
8543         else {
8544             if (SvNOK(sv))
8545                 return SvNVX(sv) != 0.0;
8546             else
8547                 return sv_2bool(sv);
8548         }
8549     }
8550 }
8551
8552 /*
8553 =for apidoc sv_pvn_force
8554
8555 Get a sensible string out of the SV somehow.
8556 A private implementation of the C<SvPV_force> macro for compilers which
8557 can't cope with complex macro expressions. Always use the macro instead.
8558
8559 =for apidoc sv_pvn_force_flags
8560
8561 Get a sensible string out of the SV somehow.
8562 If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
8563 appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
8564 implemented in terms of this function.
8565 You normally want to use the various wrapper macros instead: see
8566 C<SvPV_force> and C<SvPV_force_nomg>
8567
8568 =cut
8569 */
8570
8571 char *
8572 Perl_sv_pvn_force_flags(pTHX_ SV *const sv, STRLEN *const lp, const I32 flags)
8573 {
8574     dVAR;
8575
8576     PERL_ARGS_ASSERT_SV_PVN_FORCE_FLAGS;
8577
8578     if (SvTHINKFIRST(sv) && !SvROK(sv))
8579         sv_force_normal_flags(sv, 0);
8580
8581     if (SvPOK(sv)) {
8582         if (lp)
8583             *lp = SvCUR(sv);
8584     }
8585     else {
8586         char *s;
8587         STRLEN len;
8588  
8589         if (SvREADONLY(sv) && !(flags & SV_MUTABLE_RETURN)) {
8590             const char * const ref = sv_reftype(sv,0);
8591             if (PL_op)
8592                 Perl_croak(aTHX_ "Can't coerce readonly %s to string in %s",
8593                            ref, OP_DESC(PL_op));
8594             else
8595                 Perl_croak(aTHX_ "Can't coerce readonly %s to string", ref);
8596         }
8597         if ((SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM)
8598             || isGV_with_GP(sv))
8599             Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
8600                 OP_DESC(PL_op));
8601         s = sv_2pv_flags(sv, &len, flags);
8602         if (lp)
8603             *lp = len;
8604
8605         if (s != SvPVX_const(sv)) {     /* Almost, but not quite, sv_setpvn() */
8606             if (SvROK(sv))
8607                 sv_unref(sv);
8608             SvUPGRADE(sv, SVt_PV);              /* Never FALSE */
8609             SvGROW(sv, len + 1);
8610             Move(s,SvPVX(sv),len,char);
8611             SvCUR_set(sv, len);
8612             SvPVX(sv)[len] = '\0';
8613         }
8614         if (!SvPOK(sv)) {
8615             SvPOK_on(sv);               /* validate pointer */
8616             SvTAINT(sv);
8617             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
8618                                   PTR2UV(sv),SvPVX_const(sv)));
8619         }
8620     }
8621     return SvPVX_mutable(sv);
8622 }
8623
8624 /*
8625 =for apidoc sv_pvbyten_force
8626
8627 The backend for the C<SvPVbytex_force> macro. Always use the macro instead.
8628
8629 =cut
8630 */
8631
8632 char *
8633 Perl_sv_pvbyten_force(pTHX_ SV *const sv, STRLEN *const lp)
8634 {
8635     PERL_ARGS_ASSERT_SV_PVBYTEN_FORCE;
8636
8637     sv_pvn_force(sv,lp);
8638     sv_utf8_downgrade(sv,0);
8639     *lp = SvCUR(sv);
8640     return SvPVX(sv);
8641 }
8642
8643 /*
8644 =for apidoc sv_pvutf8n_force
8645
8646 The backend for the C<SvPVutf8x_force> macro. Always use the macro instead.
8647
8648 =cut
8649 */
8650
8651 char *
8652 Perl_sv_pvutf8n_force(pTHX_ SV *const sv, STRLEN *const lp)
8653 {
8654     PERL_ARGS_ASSERT_SV_PVUTF8N_FORCE;
8655
8656     sv_pvn_force(sv,lp);
8657     sv_utf8_upgrade(sv);
8658     *lp = SvCUR(sv);
8659     return SvPVX(sv);
8660 }
8661
8662 /*
8663 =for apidoc sv_reftype
8664
8665 Returns a string describing what the SV is a reference to.
8666
8667 =cut
8668 */
8669
8670 const char *
8671 Perl_sv_reftype(pTHX_ const SV *const sv, const int ob)
8672 {
8673     PERL_ARGS_ASSERT_SV_REFTYPE;
8674
8675     /* The fact that I don't need to downcast to char * everywhere, only in ?:
8676        inside return suggests a const propagation bug in g++.  */
8677     if (ob && SvOBJECT(sv)) {
8678         char * const name = HvNAME_get(SvSTASH(sv));
8679         return name ? name : (char *) "__ANON__";
8680     }
8681     else {
8682         switch (SvTYPE(sv)) {
8683         case SVt_NULL:
8684         case SVt_IV:
8685         case SVt_NV:
8686         case SVt_PV:
8687         case SVt_PVIV:
8688         case SVt_PVNV:
8689         case SVt_PVMG:
8690                                 if (SvVOK(sv))
8691                                     return "VSTRING";
8692                                 if (SvROK(sv))
8693                                     return "REF";
8694                                 else
8695                                     return "SCALAR";
8696
8697         case SVt_PVLV:          return (char *)  (SvROK(sv) ? "REF"
8698                                 /* tied lvalues should appear to be
8699                                  * scalars for backwards compatitbility */
8700                                 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
8701                                     ? "SCALAR" : "LVALUE");
8702         case SVt_PVAV:          return "ARRAY";
8703         case SVt_PVHV:          return "HASH";
8704         case SVt_PVCV:          return "CODE";
8705         case SVt_PVGV:          return (char *) (isGV_with_GP(sv)
8706                                     ? "GLOB" : "SCALAR");
8707         case SVt_PVFM:          return "FORMAT";
8708         case SVt_PVIO:          return "IO";
8709         case SVt_BIND:          return "BIND";
8710         case SVt_REGEXP:        return "REGEXP"; 
8711         default:                return "UNKNOWN";
8712         }
8713     }
8714 }
8715
8716 /*
8717 =for apidoc sv_isobject
8718
8719 Returns a boolean indicating whether the SV is an RV pointing to a blessed
8720 object.  If the SV is not an RV, or if the object is not blessed, then this
8721 will return false.
8722
8723 =cut
8724 */
8725
8726 int
8727 Perl_sv_isobject(pTHX_ SV *sv)
8728 {
8729     if (!sv)
8730         return 0;
8731     SvGETMAGIC(sv);
8732     if (!SvROK(sv))
8733         return 0;
8734     sv = SvRV(sv);
8735     if (!SvOBJECT(sv))
8736         return 0;
8737     return 1;
8738 }
8739
8740 /*
8741 =for apidoc sv_isa
8742
8743 Returns a boolean indicating whether the SV is blessed into the specified
8744 class.  This does not check for subtypes; use C<sv_derived_from> to verify
8745 an inheritance relationship.
8746
8747 =cut
8748 */
8749
8750 int
8751 Perl_sv_isa(pTHX_ SV *sv, const char *const name)
8752 {
8753     const char *hvname;
8754
8755     PERL_ARGS_ASSERT_SV_ISA;
8756
8757     if (!sv)
8758         return 0;
8759     SvGETMAGIC(sv);
8760     if (!SvROK(sv))
8761         return 0;
8762     sv = SvRV(sv);
8763     if (!SvOBJECT(sv))
8764         return 0;
8765     hvname = HvNAME_get(SvSTASH(sv));
8766     if (!hvname)
8767         return 0;
8768
8769     return strEQ(hvname, name);
8770 }
8771
8772 /*
8773 =for apidoc newSVrv
8774
8775 Creates a new SV for the RV, C<rv>, to point to.  If C<rv> is not an RV then
8776 it will be upgraded to one.  If C<classname> is non-null then the new SV will
8777 be blessed in the specified package.  The new SV is returned and its
8778 reference count is 1.
8779
8780 =cut
8781 */
8782
8783 SV*
8784 Perl_newSVrv(pTHX_ SV *const rv, const char *const classname)
8785 {
8786     dVAR;
8787     SV *sv;
8788
8789     PERL_ARGS_ASSERT_NEWSVRV;
8790
8791     new_SV(sv);
8792
8793     SV_CHECK_THINKFIRST_COW_DROP(rv);
8794     (void)SvAMAGIC_off(rv);
8795
8796     if (SvTYPE(rv) >= SVt_PVMG) {
8797         const U32 refcnt = SvREFCNT(rv);
8798         SvREFCNT(rv) = 0;
8799         sv_clear(rv);
8800         SvFLAGS(rv) = 0;
8801         SvREFCNT(rv) = refcnt;
8802
8803         sv_upgrade(rv, SVt_IV);
8804     } else if (SvROK(rv)) {
8805         SvREFCNT_dec(SvRV(rv));
8806     } else {
8807         prepare_SV_for_RV(rv);
8808     }
8809
8810     SvOK_off(rv);
8811     SvRV_set(rv, sv);
8812     SvROK_on(rv);
8813
8814     if (classname) {
8815         HV* const stash = gv_stashpv(classname, GV_ADD);
8816         (void)sv_bless(rv, stash);
8817     }
8818     return sv;
8819 }
8820
8821 /*
8822 =for apidoc sv_setref_pv
8823
8824 Copies a pointer into a new SV, optionally blessing the SV.  The C<rv>
8825 argument will be upgraded to an RV.  That RV will be modified to point to
8826 the new SV.  If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
8827 into the SV.  The C<classname> argument indicates the package for the
8828 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
8829 will have a reference count of 1, and the RV will be returned.
8830
8831 Do not use with other Perl types such as HV, AV, SV, CV, because those
8832 objects will become corrupted by the pointer copy process.
8833
8834 Note that C<sv_setref_pvn> copies the string while this copies the pointer.
8835
8836 =cut
8837 */
8838
8839 SV*
8840 Perl_sv_setref_pv(pTHX_ SV *const rv, const char *const classname, void *const pv)
8841 {
8842     dVAR;
8843
8844     PERL_ARGS_ASSERT_SV_SETREF_PV;
8845
8846     if (!pv) {
8847         sv_setsv(rv, &PL_sv_undef);
8848         SvSETMAGIC(rv);
8849     }
8850     else
8851         sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
8852     return rv;
8853 }
8854
8855 /*
8856 =for apidoc sv_setref_iv
8857
8858 Copies an integer into a new SV, optionally blessing the SV.  The C<rv>
8859 argument will be upgraded to an RV.  That RV will be modified to point to
8860 the new SV.  The C<classname> argument indicates the package for the
8861 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
8862 will have a reference count of 1, and the RV will be returned.
8863
8864 =cut
8865 */
8866
8867 SV*
8868 Perl_sv_setref_iv(pTHX_ SV *const rv, const char *const classname, const IV iv)
8869 {
8870     PERL_ARGS_ASSERT_SV_SETREF_IV;
8871
8872     sv_setiv(newSVrv(rv,classname), iv);
8873     return rv;
8874 }
8875
8876 /*
8877 =for apidoc sv_setref_uv
8878
8879 Copies an unsigned integer into a new SV, optionally blessing the SV.  The C<rv>
8880 argument will be upgraded to an RV.  That RV will be modified to point to
8881 the new SV.  The C<classname> argument indicates the package for the
8882 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
8883 will have a reference count of 1, and the RV will be returned.
8884
8885 =cut
8886 */
8887
8888 SV*
8889 Perl_sv_setref_uv(pTHX_ SV *const rv, const char *const classname, const UV uv)
8890 {
8891     PERL_ARGS_ASSERT_SV_SETREF_UV;
8892
8893     sv_setuv(newSVrv(rv,classname), uv);
8894     return rv;
8895 }
8896
8897 /*
8898 =for apidoc sv_setref_nv
8899
8900 Copies a double into a new SV, optionally blessing the SV.  The C<rv>
8901 argument will be upgraded to an RV.  That RV will be modified to point to
8902 the new SV.  The C<classname> argument indicates the package for the
8903 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
8904 will have a reference count of 1, and the RV will be returned.
8905
8906 =cut
8907 */
8908
8909 SV*
8910 Perl_sv_setref_nv(pTHX_ SV *const rv, const char *const classname, const NV nv)
8911 {
8912     PERL_ARGS_ASSERT_SV_SETREF_NV;
8913
8914     sv_setnv(newSVrv(rv,classname), nv);
8915     return rv;
8916 }
8917
8918 /*
8919 =for apidoc sv_setref_pvn
8920
8921 Copies a string into a new SV, optionally blessing the SV.  The length of the
8922 string must be specified with C<n>.  The C<rv> argument will be upgraded to
8923 an RV.  That RV will be modified to point to the new SV.  The C<classname>
8924 argument indicates the package for the blessing.  Set C<classname> to
8925 C<NULL> to avoid the blessing.  The new SV will have a reference count
8926 of 1, and the RV will be returned.
8927
8928 Note that C<sv_setref_pv> copies the pointer while this copies the string.
8929
8930 =cut
8931 */
8932
8933 SV*
8934 Perl_sv_setref_pvn(pTHX_ SV *const rv, const char *const classname,
8935                    const char *const pv, const STRLEN n)
8936 {
8937     PERL_ARGS_ASSERT_SV_SETREF_PVN;
8938
8939     sv_setpvn(newSVrv(rv,classname), pv, n);
8940     return rv;
8941 }
8942
8943 /*
8944 =for apidoc sv_bless
8945
8946 Blesses an SV into a specified package.  The SV must be an RV.  The package
8947 must be designated by its stash (see C<gv_stashpv()>).  The reference count
8948 of the SV is unaffected.
8949
8950 =cut
8951 */
8952
8953 SV*
8954 Perl_sv_bless(pTHX_ SV *const sv, HV *const stash)
8955 {
8956     dVAR;
8957     SV *tmpRef;
8958
8959     PERL_ARGS_ASSERT_SV_BLESS;
8960
8961     if (!SvROK(sv))
8962         Perl_croak(aTHX_ "Can't bless non-reference value");
8963     tmpRef = SvRV(sv);
8964     if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
8965         if (SvIsCOW(tmpRef))
8966             sv_force_normal_flags(tmpRef, 0);
8967         if (SvREADONLY(tmpRef))
8968             Perl_croak_no_modify(aTHX);
8969         if (SvOBJECT(tmpRef)) {
8970             if (SvTYPE(tmpRef) != SVt_PVIO)
8971                 --PL_sv_objcount;
8972             SvREFCNT_dec(SvSTASH(tmpRef));
8973         }
8974     }
8975     SvOBJECT_on(tmpRef);
8976     if (SvTYPE(tmpRef) != SVt_PVIO)
8977         ++PL_sv_objcount;
8978     SvUPGRADE(tmpRef, SVt_PVMG);
8979     SvSTASH_set(tmpRef, MUTABLE_HV(SvREFCNT_inc_simple(stash)));
8980
8981     if (Gv_AMG(stash))
8982         SvAMAGIC_on(sv);
8983     else
8984         (void)SvAMAGIC_off(sv);
8985
8986     if(SvSMAGICAL(tmpRef))
8987         if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
8988             mg_set(tmpRef);
8989
8990
8991
8992     return sv;
8993 }
8994
8995 /* Downgrades a PVGV to a PVMG.
8996  */
8997
8998 STATIC void
8999 S_sv_unglob(pTHX_ SV *const sv)
9000 {
9001     dVAR;
9002     void *xpvmg;
9003     HV *stash;
9004     SV * const temp = sv_newmortal();
9005
9006     PERL_ARGS_ASSERT_SV_UNGLOB;
9007
9008     assert(SvTYPE(sv) == SVt_PVGV);
9009     SvFAKE_off(sv);
9010     gv_efullname3(temp, MUTABLE_GV(sv), "*");
9011
9012     if (GvGP(sv)) {
9013         if(GvCVu((const GV *)sv) && (stash = GvSTASH(MUTABLE_GV(sv)))
9014            && HvNAME_get(stash))
9015             mro_method_changed_in(stash);
9016         gp_free(MUTABLE_GV(sv));
9017     }
9018     if (GvSTASH(sv)) {
9019         sv_del_backref(MUTABLE_SV(GvSTASH(sv)), sv);
9020         GvSTASH(sv) = NULL;
9021     }
9022     GvMULTI_off(sv);
9023     if (GvNAME_HEK(sv)) {
9024         unshare_hek(GvNAME_HEK(sv));
9025     }
9026     isGV_with_GP_off(sv);
9027
9028     /* need to keep SvANY(sv) in the right arena */
9029     xpvmg = new_XPVMG();
9030     StructCopy(SvANY(sv), xpvmg, XPVMG);
9031     del_XPVGV(SvANY(sv));
9032     SvANY(sv) = xpvmg;
9033
9034     SvFLAGS(sv) &= ~SVTYPEMASK;
9035     SvFLAGS(sv) |= SVt_PVMG;
9036
9037     /* Intentionally not calling any local SET magic, as this isn't so much a
9038        set operation as merely an internal storage change.  */
9039     sv_setsv_flags(sv, temp, 0);
9040 }
9041
9042 /*
9043 =for apidoc sv_unref_flags
9044
9045 Unsets the RV status of the SV, and decrements the reference count of
9046 whatever was being referenced by the RV.  This can almost be thought of
9047 as a reversal of C<newSVrv>.  The C<cflags> argument can contain
9048 C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
9049 (otherwise the decrementing is conditional on the reference count being
9050 different from one or the reference being a readonly SV).
9051 See C<SvROK_off>.
9052
9053 =cut
9054 */
9055
9056 void
9057 Perl_sv_unref_flags(pTHX_ SV *const ref, const U32 flags)
9058 {
9059     SV* const target = SvRV(ref);
9060
9061     PERL_ARGS_ASSERT_SV_UNREF_FLAGS;
9062
9063     if (SvWEAKREF(ref)) {
9064         sv_del_backref(target, ref);
9065         SvWEAKREF_off(ref);
9066         SvRV_set(ref, NULL);
9067         return;
9068     }
9069     SvRV_set(ref, NULL);
9070     SvROK_off(ref);
9071     /* You can't have a || SvREADONLY(target) here, as $a = $$a, where $a was
9072        assigned to as BEGIN {$a = \"Foo"} will fail.  */
9073     if (SvREFCNT(target) != 1 || (flags & SV_IMMEDIATE_UNREF))
9074         SvREFCNT_dec(target);
9075     else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
9076         sv_2mortal(target);     /* Schedule for freeing later */
9077 }
9078
9079 /*
9080 =for apidoc sv_untaint
9081
9082 Untaint an SV. Use C<SvTAINTED_off> instead.
9083 =cut
9084 */
9085
9086 void
9087 Perl_sv_untaint(pTHX_ SV *const sv)
9088 {
9089     PERL_ARGS_ASSERT_SV_UNTAINT;
9090
9091     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
9092         MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
9093         if (mg)
9094             mg->mg_len &= ~1;
9095     }
9096 }
9097
9098 /*
9099 =for apidoc sv_tainted
9100
9101 Test an SV for taintedness. Use C<SvTAINTED> instead.
9102 =cut
9103 */
9104
9105 bool
9106 Perl_sv_tainted(pTHX_ SV *const sv)
9107 {
9108     PERL_ARGS_ASSERT_SV_TAINTED;
9109
9110     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
9111         const MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
9112         if (mg && (mg->mg_len & 1) )
9113             return TRUE;
9114     }
9115     return FALSE;
9116 }
9117
9118 /*
9119 =for apidoc sv_setpviv
9120
9121 Copies an integer into the given SV, also updating its string value.
9122 Does not handle 'set' magic.  See C<sv_setpviv_mg>.
9123
9124 =cut
9125 */
9126
9127 void
9128 Perl_sv_setpviv(pTHX_ SV *const sv, const IV iv)
9129 {
9130     char buf[TYPE_CHARS(UV)];
9131     char *ebuf;
9132     char * const ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
9133
9134     PERL_ARGS_ASSERT_SV_SETPVIV;
9135
9136     sv_setpvn(sv, ptr, ebuf - ptr);
9137 }
9138
9139 /*
9140 =for apidoc sv_setpviv_mg
9141
9142 Like C<sv_setpviv>, but also handles 'set' magic.
9143
9144 =cut
9145 */
9146
9147 void
9148 Perl_sv_setpviv_mg(pTHX_ SV *const sv, const IV iv)
9149 {
9150     PERL_ARGS_ASSERT_SV_SETPVIV_MG;
9151
9152     sv_setpviv(sv, iv);
9153     SvSETMAGIC(sv);
9154 }
9155
9156 #if defined(PERL_IMPLICIT_CONTEXT)
9157
9158 /* pTHX_ magic can't cope with varargs, so this is a no-context
9159  * version of the main function, (which may itself be aliased to us).
9160  * Don't access this version directly.
9161  */
9162
9163 void
9164 Perl_sv_setpvf_nocontext(SV *const sv, const char *const pat, ...)
9165 {
9166     dTHX;
9167     va_list args;
9168
9169     PERL_ARGS_ASSERT_SV_SETPVF_NOCONTEXT;
9170
9171     va_start(args, pat);
9172     sv_vsetpvf(sv, pat, &args);
9173     va_end(args);
9174 }
9175
9176 /* pTHX_ magic can't cope with varargs, so this is a no-context
9177  * version of the main function, (which may itself be aliased to us).
9178  * Don't access this version directly.
9179  */
9180
9181 void
9182 Perl_sv_setpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
9183 {
9184     dTHX;
9185     va_list args;
9186
9187     PERL_ARGS_ASSERT_SV_SETPVF_MG_NOCONTEXT;
9188
9189     va_start(args, pat);
9190     sv_vsetpvf_mg(sv, pat, &args);
9191     va_end(args);
9192 }
9193 #endif
9194
9195 /*
9196 =for apidoc sv_setpvf
9197
9198 Works like C<sv_catpvf> but copies the text into the SV instead of
9199 appending it.  Does not handle 'set' magic.  See C<sv_setpvf_mg>.
9200
9201 =cut
9202 */
9203
9204 void
9205 Perl_sv_setpvf(pTHX_ SV *const sv, const char *const pat, ...)
9206 {
9207     va_list args;
9208
9209     PERL_ARGS_ASSERT_SV_SETPVF;
9210
9211     va_start(args, pat);
9212     sv_vsetpvf(sv, pat, &args);
9213     va_end(args);
9214 }
9215
9216 /*
9217 =for apidoc sv_vsetpvf
9218
9219 Works like C<sv_vcatpvf> but copies the text into the SV instead of
9220 appending it.  Does not handle 'set' magic.  See C<sv_vsetpvf_mg>.
9221
9222 Usually used via its frontend C<sv_setpvf>.
9223
9224 =cut
9225 */
9226
9227 void
9228 Perl_sv_vsetpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args)
9229 {
9230     PERL_ARGS_ASSERT_SV_VSETPVF;
9231
9232     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
9233 }
9234
9235 /*
9236 =for apidoc sv_setpvf_mg
9237
9238 Like C<sv_setpvf>, but also handles 'set' magic.
9239
9240 =cut
9241 */
9242
9243 void
9244 Perl_sv_setpvf_mg(pTHX_ SV *const sv, const char *const pat, ...)
9245 {
9246     va_list args;
9247
9248     PERL_ARGS_ASSERT_SV_SETPVF_MG;
9249
9250     va_start(args, pat);
9251     sv_vsetpvf_mg(sv, pat, &args);
9252     va_end(args);
9253 }
9254
9255 /*
9256 =for apidoc sv_vsetpvf_mg
9257
9258 Like C<sv_vsetpvf>, but also handles 'set' magic.
9259
9260 Usually used via its frontend C<sv_setpvf_mg>.
9261
9262 =cut
9263 */
9264
9265 void
9266 Perl_sv_vsetpvf_mg(pTHX_ SV *const sv, const char *const pat, va_list *const args)
9267 {
9268     PERL_ARGS_ASSERT_SV_VSETPVF_MG;
9269
9270     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
9271     SvSETMAGIC(sv);
9272 }
9273
9274 #if defined(PERL_IMPLICIT_CONTEXT)
9275
9276 /* pTHX_ magic can't cope with varargs, so this is a no-context
9277  * version of the main function, (which may itself be aliased to us).
9278  * Don't access this version directly.
9279  */
9280
9281 void
9282 Perl_sv_catpvf_nocontext(SV *const sv, const char *const pat, ...)
9283 {
9284     dTHX;
9285     va_list args;
9286
9287     PERL_ARGS_ASSERT_SV_CATPVF_NOCONTEXT;
9288
9289     va_start(args, pat);
9290     sv_vcatpvf(sv, pat, &args);
9291     va_end(args);
9292 }
9293
9294 /* pTHX_ magic can't cope with varargs, so this is a no-context
9295  * version of the main function, (which may itself be aliased to us).
9296  * Don't access this version directly.
9297  */
9298
9299 void
9300 Perl_sv_catpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
9301 {
9302     dTHX;
9303     va_list args;
9304
9305     PERL_ARGS_ASSERT_SV_CATPVF_MG_NOCONTEXT;
9306
9307     va_start(args, pat);
9308     sv_vcatpvf_mg(sv, pat, &args);
9309     va_end(args);
9310 }
9311 #endif
9312
9313 /*
9314 =for apidoc sv_catpvf
9315
9316 Processes its arguments like C<sprintf> and appends the formatted
9317 output to an SV.  If the appended data contains "wide" characters
9318 (including, but not limited to, SVs with a UTF-8 PV formatted with %s,
9319 and characters >255 formatted with %c), the original SV might get
9320 upgraded to UTF-8.  Handles 'get' magic, but not 'set' magic.  See
9321 C<sv_catpvf_mg>. If the original SV was UTF-8, the pattern should be
9322 valid UTF-8; if the original SV was bytes, the pattern should be too.
9323
9324 =cut */
9325
9326 void
9327 Perl_sv_catpvf(pTHX_ SV *const sv, const char *const pat, ...)
9328 {
9329     va_list args;
9330
9331     PERL_ARGS_ASSERT_SV_CATPVF;
9332
9333     va_start(args, pat);
9334     sv_vcatpvf(sv, pat, &args);
9335     va_end(args);
9336 }
9337
9338 /*
9339 =for apidoc sv_vcatpvf
9340
9341 Processes its arguments like C<vsprintf> and appends the formatted output
9342 to an SV.  Does not handle 'set' magic.  See C<sv_vcatpvf_mg>.
9343
9344 Usually used via its frontend C<sv_catpvf>.
9345
9346 =cut
9347 */
9348
9349 void
9350 Perl_sv_vcatpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args)
9351 {
9352     PERL_ARGS_ASSERT_SV_VCATPVF;
9353
9354     sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
9355 }
9356
9357 /*
9358 =for apidoc sv_catpvf_mg
9359
9360 Like C<sv_catpvf>, but also handles 'set' magic.
9361
9362 =cut
9363 */
9364
9365 void
9366 Perl_sv_catpvf_mg(pTHX_ SV *const sv, const char *const pat, ...)
9367 {
9368     va_list args;
9369
9370     PERL_ARGS_ASSERT_SV_CATPVF_MG;
9371
9372     va_start(args, pat);
9373     sv_vcatpvf_mg(sv, pat, &args);
9374     va_end(args);
9375 }
9376
9377 /*
9378 =for apidoc sv_vcatpvf_mg
9379
9380 Like C<sv_vcatpvf>, but also handles 'set' magic.
9381
9382 Usually used via its frontend C<sv_catpvf_mg>.
9383
9384 =cut
9385 */
9386
9387 void
9388 Perl_sv_vcatpvf_mg(pTHX_ SV *const sv, const char *const pat, va_list *const args)
9389 {
9390     PERL_ARGS_ASSERT_SV_VCATPVF_MG;
9391
9392     sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
9393     SvSETMAGIC(sv);
9394 }
9395
9396 /*
9397 =for apidoc sv_vsetpvfn
9398
9399 Works like C<sv_vcatpvfn> but copies the text into the SV instead of
9400 appending it.
9401
9402 Usually used via one of its frontends C<sv_vsetpvf> and C<sv_vsetpvf_mg>.
9403
9404 =cut
9405 */
9406
9407 void
9408 Perl_sv_vsetpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
9409                  va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted)
9410 {
9411     PERL_ARGS_ASSERT_SV_VSETPVFN;
9412
9413     sv_setpvs(sv, "");
9414     sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
9415 }
9416
9417
9418 /*
9419  * Warn of missing argument to sprintf, and then return a defined value
9420  * to avoid inappropriate "use of uninit" warnings [perl #71000].
9421  */
9422 #define WARN_MISSING WARN_UNINITIALIZED /* Not sure we want a new category */
9423 STATIC SV*
9424 S_vcatpvfn_missing_argument(pTHX) {
9425     if (ckWARN(WARN_MISSING)) {
9426         Perl_warner(aTHX_ packWARN(WARN_MISSING), "Missing argument in %s",
9427                 PL_op ? OP_DESC(PL_op) : "sv_vcatpvfn()");
9428     }
9429     return &PL_sv_no;
9430 }
9431
9432
9433 STATIC I32
9434 S_expect_number(pTHX_ char **const pattern)
9435 {
9436     dVAR;
9437     I32 var = 0;
9438
9439     PERL_ARGS_ASSERT_EXPECT_NUMBER;
9440
9441     switch (**pattern) {
9442     case '1': case '2': case '3':
9443     case '4': case '5': case '6':
9444     case '7': case '8': case '9':
9445         var = *(*pattern)++ - '0';
9446         while (isDIGIT(**pattern)) {
9447             const I32 tmp = var * 10 + (*(*pattern)++ - '0');
9448             if (tmp < var)
9449                 Perl_croak(aTHX_ "Integer overflow in format string for %s", (PL_op ? OP_DESC(PL_op) : "sv_vcatpvfn"));
9450             var = tmp;
9451         }
9452     }
9453     return var;
9454 }
9455
9456 STATIC char *
9457 S_F0convert(NV nv, char *const endbuf, STRLEN *const len)
9458 {
9459     const int neg = nv < 0;
9460     UV uv;
9461
9462     PERL_ARGS_ASSERT_F0CONVERT;
9463
9464     if (neg)
9465         nv = -nv;
9466     if (nv < UV_MAX) {
9467         char *p = endbuf;
9468         nv += 0.5;
9469         uv = (UV)nv;
9470         if (uv & 1 && uv == nv)
9471             uv--;                       /* Round to even */
9472         do {
9473             const unsigned dig = uv % 10;
9474             *--p = '0' + dig;
9475         } while (uv /= 10);
9476         if (neg)
9477             *--p = '-';
9478         *len = endbuf - p;
9479         return p;
9480     }
9481     return NULL;
9482 }
9483
9484
9485 /*
9486 =for apidoc sv_vcatpvfn
9487
9488 Processes its arguments like C<vsprintf> and appends the formatted output
9489 to an SV.  Uses an array of SVs if the C style variable argument list is
9490 missing (NULL).  When running with taint checks enabled, indicates via
9491 C<maybe_tainted> if results are untrustworthy (often due to the use of
9492 locales).
9493
9494 Usually used via one of its frontends C<sv_vcatpvf> and C<sv_vcatpvf_mg>.
9495
9496 =cut
9497 */
9498
9499
9500 #define VECTORIZE_ARGS  vecsv = va_arg(*args, SV*);\
9501                         vecstr = (U8*)SvPV_const(vecsv,veclen);\
9502                         vec_utf8 = DO_UTF8(vecsv);
9503
9504 /* XXX maybe_tainted is never assigned to, so the doc above is lying. */
9505
9506 void
9507 Perl_sv_vcatpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
9508                  va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted)
9509 {
9510     dVAR;
9511     char *p;
9512     char *q;
9513     const char *patend;
9514     STRLEN origlen;
9515     I32 svix = 0;
9516     static const char nullstr[] = "(null)";
9517     SV *argsv = NULL;
9518     bool has_utf8 = DO_UTF8(sv);    /* has the result utf8? */
9519     const bool pat_utf8 = has_utf8; /* the pattern is in utf8? */
9520     SV *nsv = NULL;
9521     /* Times 4: a decimal digit takes more than 3 binary digits.
9522      * NV_DIG: mantissa takes than many decimal digits.
9523      * Plus 32: Playing safe. */
9524     char ebuf[IV_DIG * 4 + NV_DIG + 32];
9525     /* large enough for "%#.#f" --chip */
9526     /* what about long double NVs? --jhi */
9527
9528     PERL_ARGS_ASSERT_SV_VCATPVFN;
9529     PERL_UNUSED_ARG(maybe_tainted);
9530
9531     /* no matter what, this is a string now */
9532     (void)SvPV_force(sv, origlen);
9533
9534     /* special-case "", "%s", and "%-p" (SVf - see below) */
9535     if (patlen == 0)
9536         return;
9537     if (patlen == 2 && pat[0] == '%' && pat[1] == 's') {
9538         if (args) {
9539             const char * const s = va_arg(*args, char*);
9540             sv_catpv(sv, s ? s : nullstr);
9541         }
9542         else if (svix < svmax) {
9543             sv_catsv(sv, *svargs);
9544         }
9545         else
9546             S_vcatpvfn_missing_argument(aTHX);
9547         return;
9548     }
9549     if (args && patlen == 3 && pat[0] == '%' &&
9550                 pat[1] == '-' && pat[2] == 'p') {
9551         argsv = MUTABLE_SV(va_arg(*args, void*));
9552         sv_catsv(sv, argsv);
9553         return;
9554     }
9555
9556 #ifndef USE_LONG_DOUBLE
9557     /* special-case "%.<number>[gf]" */
9558     if ( !args && patlen <= 5 && pat[0] == '%' && pat[1] == '.'
9559          && (pat[patlen-1] == 'g' || pat[patlen-1] == 'f') ) {
9560         unsigned digits = 0;
9561         const char *pp;
9562
9563         pp = pat + 2;
9564         while (*pp >= '0' && *pp <= '9')
9565             digits = 10 * digits + (*pp++ - '0');
9566         if (pp - pat == (int)patlen - 1 && svix < svmax) {
9567             const NV nv = SvNV(*svargs);
9568             if (*pp == 'g') {
9569                 /* Add check for digits != 0 because it seems that some
9570                    gconverts are buggy in this case, and we don't yet have
9571                    a Configure test for this.  */
9572                 if (digits && digits < sizeof(ebuf) - NV_DIG - 10) {
9573                      /* 0, point, slack */
9574                     Gconvert(nv, (int)digits, 0, ebuf);
9575                     sv_catpv(sv, ebuf);
9576                     if (*ebuf)  /* May return an empty string for digits==0 */
9577                         return;
9578                 }
9579             } else if (!digits) {
9580                 STRLEN l;
9581
9582                 if ((p = F0convert(nv, ebuf + sizeof ebuf, &l))) {
9583                     sv_catpvn(sv, p, l);
9584                     return;
9585                 }
9586             }
9587         }
9588     }
9589 #endif /* !USE_LONG_DOUBLE */
9590
9591     if (!args && svix < svmax && DO_UTF8(*svargs))
9592         has_utf8 = TRUE;
9593
9594     patend = (char*)pat + patlen;
9595     for (p = (char*)pat; p < patend; p = q) {
9596         bool alt = FALSE;
9597         bool left = FALSE;
9598         bool vectorize = FALSE;
9599         bool vectorarg = FALSE;
9600         bool vec_utf8 = FALSE;
9601         char fill = ' ';
9602         char plus = 0;
9603         char intsize = 0;
9604         STRLEN width = 0;
9605         STRLEN zeros = 0;
9606         bool has_precis = FALSE;
9607         STRLEN precis = 0;
9608         const I32 osvix = svix;
9609         bool is_utf8 = FALSE;  /* is this item utf8?   */
9610 #ifdef HAS_LDBL_SPRINTF_BUG
9611         /* This is to try to fix a bug with irix/nonstop-ux/powerux and
9612            with sfio - Allen <allens@cpan.org> */
9613         bool fix_ldbl_sprintf_bug = FALSE;
9614 #endif
9615
9616         char esignbuf[4];
9617         U8 utf8buf[UTF8_MAXBYTES+1];
9618         STRLEN esignlen = 0;
9619
9620         const char *eptr = NULL;
9621         const char *fmtstart;
9622         STRLEN elen = 0;
9623         SV *vecsv = NULL;
9624         const U8 *vecstr = NULL;
9625         STRLEN veclen = 0;
9626         char c = 0;
9627         int i;
9628         unsigned base = 0;
9629         IV iv = 0;
9630         UV uv = 0;
9631         /* we need a long double target in case HAS_LONG_DOUBLE but
9632            not USE_LONG_DOUBLE
9633         */
9634 #if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
9635         long double nv;
9636 #else
9637         NV nv;
9638 #endif
9639         STRLEN have;
9640         STRLEN need;
9641         STRLEN gap;
9642         const char *dotstr = ".";
9643         STRLEN dotstrlen = 1;
9644         I32 efix = 0; /* explicit format parameter index */
9645         I32 ewix = 0; /* explicit width index */
9646         I32 epix = 0; /* explicit precision index */
9647         I32 evix = 0; /* explicit vector index */
9648         bool asterisk = FALSE;
9649
9650         /* echo everything up to the next format specification */
9651         for (q = p; q < patend && *q != '%'; ++q) ;
9652         if (q > p) {
9653             if (has_utf8 && !pat_utf8)
9654                 sv_catpvn_utf8_upgrade(sv, p, q - p, nsv);
9655             else
9656                 sv_catpvn(sv, p, q - p);
9657             p = q;
9658         }
9659         if (q++ >= patend)
9660             break;
9661
9662         fmtstart = q;
9663
9664 /*
9665     We allow format specification elements in this order:
9666         \d+\$              explicit format parameter index
9667         [-+ 0#]+           flags
9668         v|\*(\d+\$)?v      vector with optional (optionally specified) arg
9669         0                  flag (as above): repeated to allow "v02"     
9670         \d+|\*(\d+\$)?     width using optional (optionally specified) arg
9671         \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
9672         [hlqLV]            size
9673     [%bcdefginopsuxDFOUX] format (mandatory)
9674 */
9675
9676         if (args) {
9677 /*  
9678         As of perl5.9.3, printf format checking is on by default.
9679         Internally, perl uses %p formats to provide an escape to
9680         some extended formatting.  This block deals with those
9681         extensions: if it does not match, (char*)q is reset and
9682         the normal format processing code is used.
9683
9684         Currently defined extensions are:
9685                 %p              include pointer address (standard)      
9686                 %-p     (SVf)   include an SV (previously %_)
9687                 %-<num>p        include an SV with precision <num>      
9688                 %<num>p         reserved for future extensions
9689
9690         Robin Barker 2005-07-14
9691
9692                 %1p     (VDf)   removed.  RMB 2007-10-19
9693 */
9694             char* r = q; 
9695             bool sv = FALSE;    
9696             STRLEN n = 0;
9697             if (*q == '-')
9698                 sv = *q++;
9699             n = expect_number(&q);
9700             if (*q++ == 'p') {
9701                 if (sv) {                       /* SVf */
9702                     if (n) {
9703                         precis = n;
9704                         has_precis = TRUE;
9705                     }
9706                     argsv = MUTABLE_SV(va_arg(*args, void*));
9707                     eptr = SvPV_const(argsv, elen);
9708                     if (DO_UTF8(argsv))
9709                         is_utf8 = TRUE;
9710                     goto string;
9711                 }
9712                 else if (n) {
9713                     Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),
9714                                      "internal %%<num>p might conflict with future printf extensions");
9715                 }
9716             }
9717             q = r; 
9718         }
9719
9720         if ( (width = expect_number(&q)) ) {
9721             if (*q == '$') {
9722                 ++q;
9723                 efix = width;
9724             } else {
9725                 goto gotwidth;
9726             }
9727         }
9728
9729         /* FLAGS */
9730
9731         while (*q) {
9732             switch (*q) {
9733             case ' ':
9734             case '+':
9735                 if (plus == '+' && *q == ' ') /* '+' over ' ' */
9736                     q++;
9737                 else
9738                     plus = *q++;
9739                 continue;
9740
9741             case '-':
9742                 left = TRUE;
9743                 q++;
9744                 continue;
9745
9746             case '0':
9747                 fill = *q++;
9748                 continue;
9749
9750             case '#':
9751                 alt = TRUE;
9752                 q++;
9753                 continue;
9754
9755             default:
9756                 break;
9757             }
9758             break;
9759         }
9760
9761       tryasterisk:
9762         if (*q == '*') {
9763             q++;
9764             if ( (ewix = expect_number(&q)) )
9765                 if (*q++ != '$')
9766                     goto unknown;
9767             asterisk = TRUE;
9768         }
9769         if (*q == 'v') {
9770             q++;
9771             if (vectorize)
9772                 goto unknown;
9773             if ((vectorarg = asterisk)) {
9774                 evix = ewix;
9775                 ewix = 0;
9776                 asterisk = FALSE;
9777             }
9778             vectorize = TRUE;
9779             goto tryasterisk;
9780         }
9781
9782         if (!asterisk)
9783         {
9784             if( *q == '0' )
9785                 fill = *q++;
9786             width = expect_number(&q);
9787         }
9788
9789         if (vectorize) {
9790             if (vectorarg) {
9791                 if (args)
9792                     vecsv = va_arg(*args, SV*);
9793                 else if (evix) {
9794                     vecsv = (evix > 0 && evix <= svmax)
9795                         ? svargs[evix-1] : S_vcatpvfn_missing_argument(aTHX);
9796                 } else {
9797                     vecsv = svix < svmax
9798                         ? svargs[svix++] : S_vcatpvfn_missing_argument(aTHX);
9799                 }
9800                 dotstr = SvPV_const(vecsv, dotstrlen);
9801                 /* Keep the DO_UTF8 test *after* the SvPV call, else things go
9802                    bad with tied or overloaded values that return UTF8.  */
9803                 if (DO_UTF8(vecsv))
9804                     is_utf8 = TRUE;
9805                 else if (has_utf8) {
9806                     vecsv = sv_mortalcopy(vecsv);
9807                     sv_utf8_upgrade(vecsv);
9808                     dotstr = SvPV_const(vecsv, dotstrlen);
9809                     is_utf8 = TRUE;
9810                 }                   
9811             }
9812             if (args) {
9813                 VECTORIZE_ARGS
9814             }
9815             else if (efix ? (efix > 0 && efix <= svmax) : svix < svmax) {
9816                 vecsv = svargs[efix ? efix-1 : svix++];
9817                 vecstr = (U8*)SvPV_const(vecsv,veclen);
9818                 vec_utf8 = DO_UTF8(vecsv);
9819
9820                 /* if this is a version object, we need to convert
9821                  * back into v-string notation and then let the
9822                  * vectorize happen normally
9823                  */
9824                 if (sv_derived_from(vecsv, "version")) {
9825                     char *version = savesvpv(vecsv);
9826                     if ( hv_exists(MUTABLE_HV(SvRV(vecsv)), "alpha", 5 ) ) {
9827                         Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
9828                         "vector argument not supported with alpha versions");
9829                         goto unknown;
9830                     }
9831                     vecsv = sv_newmortal();
9832                     scan_vstring(version, version + veclen, vecsv);
9833                     vecstr = (U8*)SvPV_const(vecsv, veclen);
9834                     vec_utf8 = DO_UTF8(vecsv);
9835                     Safefree(version);
9836                 }
9837             }
9838             else {
9839                 vecstr = (U8*)"";
9840                 veclen = 0;
9841             }
9842         }
9843
9844         if (asterisk) {
9845             if (args)
9846                 i = va_arg(*args, int);
9847             else
9848                 i = (ewix ? ewix <= svmax : svix < svmax) ?
9849                     SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
9850             left |= (i < 0);
9851             width = (i < 0) ? -i : i;
9852         }
9853       gotwidth:
9854
9855         /* PRECISION */
9856
9857         if (*q == '.') {
9858             q++;
9859             if (*q == '*') {
9860                 q++;
9861                 if ( ((epix = expect_number(&q))) && (*q++ != '$') )
9862                     goto unknown;
9863                 /* XXX: todo, support specified precision parameter */
9864                 if (epix)
9865                     goto unknown;
9866                 if (args)
9867                     i = va_arg(*args, int);
9868                 else
9869                     i = (ewix ? ewix <= svmax : svix < svmax)
9870                         ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
9871                 precis = i;
9872                 has_precis = !(i < 0);
9873             }
9874             else {
9875                 precis = 0;
9876                 while (isDIGIT(*q))
9877                     precis = precis * 10 + (*q++ - '0');
9878                 has_precis = TRUE;
9879             }
9880         }
9881
9882         /* SIZE */
9883
9884         switch (*q) {
9885 #ifdef WIN32
9886         case 'I':                       /* Ix, I32x, and I64x */
9887 #  ifdef WIN64
9888             if (q[1] == '6' && q[2] == '4') {
9889                 q += 3;
9890                 intsize = 'q';
9891                 break;
9892             }
9893 #  endif
9894             if (q[1] == '3' && q[2] == '2') {
9895                 q += 3;
9896                 break;
9897             }
9898 #  ifdef WIN64
9899             intsize = 'q';
9900 #  endif
9901             q++;
9902             break;
9903 #endif
9904 #if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
9905         case 'L':                       /* Ld */
9906             /*FALLTHROUGH*/
9907 #ifdef HAS_QUAD
9908         case 'q':                       /* qd */
9909 #endif
9910             intsize = 'q';
9911             q++;
9912             break;
9913 #endif
9914         case 'l':
9915 #if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
9916             if (*(q + 1) == 'l') {      /* lld, llf */
9917                 intsize = 'q';
9918                 q += 2;
9919                 break;
9920              }
9921 #endif
9922             /*FALLTHROUGH*/
9923         case 'h':
9924             /*FALLTHROUGH*/
9925         case 'V':
9926             intsize = *q++;
9927             break;
9928         }
9929
9930         /* CONVERSION */
9931
9932         if (*q == '%') {
9933             eptr = q++;
9934             elen = 1;
9935             if (vectorize) {
9936                 c = '%';
9937                 goto unknown;
9938             }
9939             goto string;
9940         }
9941
9942         if (!vectorize && !args) {
9943             if (efix) {
9944                 const I32 i = efix-1;
9945                 argsv = (i >= 0 && i < svmax)
9946                     ? svargs[i] : S_vcatpvfn_missing_argument(aTHX);
9947             } else {
9948                 argsv = (svix >= 0 && svix < svmax)
9949                     ? svargs[svix++] : S_vcatpvfn_missing_argument(aTHX);
9950             }
9951         }
9952
9953         switch (c = *q++) {
9954
9955             /* STRINGS */
9956
9957         case 'c':
9958             if (vectorize)
9959                 goto unknown;
9960             uv = (args) ? va_arg(*args, int) : SvIV(argsv);
9961             if ((uv > 255 ||
9962                  (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
9963                 && !IN_BYTES) {
9964                 eptr = (char*)utf8buf;
9965                 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
9966                 is_utf8 = TRUE;
9967             }
9968             else {
9969                 c = (char)uv;
9970                 eptr = &c;
9971                 elen = 1;
9972             }
9973             goto string;
9974
9975         case 's':
9976             if (vectorize)
9977                 goto unknown;
9978             if (args) {
9979                 eptr = va_arg(*args, char*);
9980                 if (eptr)
9981                     elen = strlen(eptr);
9982                 else {
9983                     eptr = (char *)nullstr;
9984                     elen = sizeof nullstr - 1;
9985                 }
9986             }
9987             else {
9988                 eptr = SvPV_const(argsv, elen);
9989                 if (DO_UTF8(argsv)) {
9990                     STRLEN old_precis = precis;
9991                     if (has_precis && precis < elen) {
9992                         STRLEN ulen = sv_len_utf8(argsv);
9993                         I32 p = precis > ulen ? ulen : precis;
9994                         sv_pos_u2b(argsv, &p, 0); /* sticks at end */
9995                         precis = p;
9996                     }
9997                     if (width) { /* fudge width (can't fudge elen) */
9998                         if (has_precis && precis < elen)
9999                             width += precis - old_precis;
10000                         else
10001                             width += elen - sv_len_utf8(argsv);
10002                     }
10003                     is_utf8 = TRUE;
10004                 }
10005             }
10006
10007         string:
10008             if (has_precis && precis < elen)
10009                 elen = precis;
10010             break;
10011
10012             /* INTEGERS */
10013
10014         case 'p':
10015             if (alt || vectorize)
10016                 goto unknown;
10017             uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
10018             base = 16;
10019             goto integer;
10020
10021         case 'D':
10022 #ifdef IV_IS_QUAD
10023             intsize = 'q';
10024 #else
10025             intsize = 'l';
10026 #endif
10027             /*FALLTHROUGH*/
10028         case 'd':
10029         case 'i':
10030 #if vdNUMBER
10031         format_vd:
10032 #endif
10033             if (vectorize) {
10034                 STRLEN ulen;
10035                 if (!veclen)
10036                     continue;
10037                 if (vec_utf8)
10038                     uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
10039                                         UTF8_ALLOW_ANYUV);
10040                 else {
10041                     uv = *vecstr;
10042                     ulen = 1;
10043                 }
10044                 vecstr += ulen;
10045                 veclen -= ulen;
10046                 if (plus)
10047                      esignbuf[esignlen++] = plus;
10048             }
10049             else if (args) {
10050                 switch (intsize) {
10051                 case 'h':       iv = (short)va_arg(*args, int); break;
10052                 case 'l':       iv = va_arg(*args, long); break;
10053                 case 'V':       iv = va_arg(*args, IV); break;
10054                 default:        iv = va_arg(*args, int); break;
10055                 case 'q':
10056 #ifdef HAS_QUAD
10057                                 iv = va_arg(*args, Quad_t); break;
10058 #else
10059                                 goto unknown;
10060 #endif
10061                 }
10062             }
10063             else {
10064                 IV tiv = SvIV(argsv); /* work around GCC bug #13488 */
10065                 switch (intsize) {
10066                 case 'h':       iv = (short)tiv; break;
10067                 case 'l':       iv = (long)tiv; break;
10068                 case 'V':
10069                 default:        iv = tiv; break;
10070                 case 'q':
10071 #ifdef HAS_QUAD
10072                                 iv = (Quad_t)tiv; break;
10073 #else
10074                                 goto unknown;
10075 #endif
10076                 }
10077             }
10078             if ( !vectorize )   /* we already set uv above */
10079             {
10080                 if (iv >= 0) {
10081                     uv = iv;
10082                     if (plus)
10083                         esignbuf[esignlen++] = plus;
10084                 }
10085                 else {
10086                     uv = -iv;
10087                     esignbuf[esignlen++] = '-';
10088                 }
10089             }
10090             base = 10;
10091             goto integer;
10092
10093         case 'U':
10094 #ifdef IV_IS_QUAD
10095             intsize = 'q';
10096 #else
10097             intsize = 'l';
10098 #endif
10099             /*FALLTHROUGH*/
10100         case 'u':
10101             base = 10;
10102             goto uns_integer;
10103
10104         case 'B':
10105         case 'b':
10106             base = 2;
10107             goto uns_integer;
10108
10109         case 'O':
10110 #ifdef IV_IS_QUAD
10111             intsize = 'q';
10112 #else
10113             intsize = 'l';
10114 #endif
10115             /*FALLTHROUGH*/
10116         case 'o':
10117             base = 8;
10118             goto uns_integer;
10119
10120         case 'X':
10121         case 'x':
10122             base = 16;
10123
10124         uns_integer:
10125             if (vectorize) {
10126                 STRLEN ulen;
10127         vector:
10128                 if (!veclen)
10129                     continue;
10130                 if (vec_utf8)
10131                     uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
10132                                         UTF8_ALLOW_ANYUV);
10133                 else {
10134                     uv = *vecstr;
10135                     ulen = 1;
10136                 }
10137                 vecstr += ulen;
10138                 veclen -= ulen;
10139             }
10140             else if (args) {
10141                 switch (intsize) {
10142                 case 'h':  uv = (unsigned short)va_arg(*args, unsigned); break;
10143                 case 'l':  uv = va_arg(*args, unsigned long); break;
10144                 case 'V':  uv = va_arg(*args, UV); break;
10145                 default:   uv = va_arg(*args, unsigned); break;
10146                 case 'q':
10147 #ifdef HAS_QUAD
10148                            uv = va_arg(*args, Uquad_t); break;
10149 #else
10150                            goto unknown;
10151 #endif
10152                 }
10153             }
10154             else {
10155                 UV tuv = SvUV(argsv); /* work around GCC bug #13488 */
10156                 switch (intsize) {
10157                 case 'h':       uv = (unsigned short)tuv; break;
10158                 case 'l':       uv = (unsigned long)tuv; break;
10159                 case 'V':
10160                 default:        uv = tuv; break;
10161                 case 'q':
10162 #ifdef HAS_QUAD
10163                                 uv = (Uquad_t)tuv; break;
10164 #else
10165                                 goto unknown;
10166 #endif
10167                 }
10168             }
10169
10170         integer:
10171             {
10172                 char *ptr = ebuf + sizeof ebuf;
10173                 bool tempalt = uv ? alt : FALSE; /* Vectors can't change alt */
10174                 zeros = 0;
10175
10176                 switch (base) {
10177                     unsigned dig;
10178                 case 16:
10179                     p = (char *)((c == 'X') ? PL_hexdigit + 16 : PL_hexdigit);
10180                     do {
10181                         dig = uv & 15;
10182                         *--ptr = p[dig];
10183                     } while (uv >>= 4);
10184                     if (tempalt) {
10185                         esignbuf[esignlen++] = '0';
10186                         esignbuf[esignlen++] = c;  /* 'x' or 'X' */
10187                     }
10188                     break;
10189                 case 8:
10190                     do {
10191                         dig = uv & 7;
10192                         *--ptr = '0' + dig;
10193                     } while (uv >>= 3);
10194                     if (alt && *ptr != '0')
10195                         *--ptr = '0';
10196                     break;
10197                 case 2:
10198                     do {
10199                         dig = uv & 1;
10200                         *--ptr = '0' + dig;
10201                     } while (uv >>= 1);
10202                     if (tempalt) {
10203                         esignbuf[esignlen++] = '0';
10204                         esignbuf[esignlen++] = c;
10205                     }
10206                     break;
10207                 default:                /* it had better be ten or less */
10208                     do {
10209                         dig = uv % base;
10210                         *--ptr = '0' + dig;
10211                     } while (uv /= base);
10212                     break;
10213                 }
10214                 elen = (ebuf + sizeof ebuf) - ptr;
10215                 eptr = ptr;
10216                 if (has_precis) {
10217                     if (precis > elen)
10218                         zeros = precis - elen;
10219                     else if (precis == 0 && elen == 1 && *eptr == '0'
10220                              && !(base == 8 && alt)) /* "%#.0o" prints "0" */
10221                         elen = 0;
10222
10223                 /* a precision nullifies the 0 flag. */
10224                     if (fill == '0')
10225                         fill = ' ';
10226                 }
10227             }
10228             break;
10229
10230             /* FLOATING POINT */
10231
10232         case 'F':
10233             c = 'f';            /* maybe %F isn't supported here */
10234             /*FALLTHROUGH*/
10235         case 'e': case 'E':
10236         case 'f':
10237         case 'g': case 'G':
10238             if (vectorize)
10239                 goto unknown;
10240
10241             /* This is evil, but floating point is even more evil */
10242
10243             /* for SV-style calling, we can only get NV
10244                for C-style calling, we assume %f is double;
10245                for simplicity we allow any of %Lf, %llf, %qf for long double
10246             */
10247             switch (intsize) {
10248             case 'V':
10249 #if defined(USE_LONG_DOUBLE)
10250                 intsize = 'q';
10251 #endif
10252                 break;
10253 /* [perl #20339] - we should accept and ignore %lf rather than die */
10254             case 'l':
10255                 /*FALLTHROUGH*/
10256             default:
10257 #if defined(USE_LONG_DOUBLE)
10258                 intsize = args ? 0 : 'q';
10259 #endif
10260                 break;
10261             case 'q':
10262 #if defined(HAS_LONG_DOUBLE)
10263                 break;
10264 #else
10265                 /*FALLTHROUGH*/
10266 #endif
10267             case 'h':
10268                 goto unknown;
10269             }
10270
10271             /* now we need (long double) if intsize == 'q', else (double) */
10272             nv = (args) ?
10273 #if LONG_DOUBLESIZE > DOUBLESIZE
10274                 intsize == 'q' ?
10275                     va_arg(*args, long double) :
10276                     va_arg(*args, double)
10277 #else
10278                     va_arg(*args, double)
10279 #endif
10280                 : SvNV(argsv);
10281
10282             need = 0;
10283             /* nv * 0 will be NaN for NaN, +Inf and -Inf, and 0 for anything
10284                else. frexp() has some unspecified behaviour for those three */
10285             if (c != 'e' && c != 'E' && (nv * 0) == 0) {
10286                 i = PERL_INT_MIN;
10287                 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
10288                    will cast our (long double) to (double) */
10289                 (void)Perl_frexp(nv, &i);
10290                 if (i == PERL_INT_MIN)
10291                     Perl_die(aTHX_ "panic: frexp");
10292                 if (i > 0)
10293                     need = BIT_DIGITS(i);
10294             }
10295             need += has_precis ? precis : 6; /* known default */
10296
10297             if (need < width)
10298                 need = width;
10299
10300 #ifdef HAS_LDBL_SPRINTF_BUG
10301             /* This is to try to fix a bug with irix/nonstop-ux/powerux and
10302                with sfio - Allen <allens@cpan.org> */
10303
10304 #  ifdef DBL_MAX
10305 #    define MY_DBL_MAX DBL_MAX
10306 #  else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
10307 #    if DOUBLESIZE >= 8
10308 #      define MY_DBL_MAX 1.7976931348623157E+308L
10309 #    else
10310 #      define MY_DBL_MAX 3.40282347E+38L
10311 #    endif
10312 #  endif
10313
10314 #  ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
10315 #    define MY_DBL_MAX_BUG 1L
10316 #  else
10317 #    define MY_DBL_MAX_BUG MY_DBL_MAX
10318 #  endif
10319
10320 #  ifdef DBL_MIN
10321 #    define MY_DBL_MIN DBL_MIN
10322 #  else  /* XXX guessing! -Allen */
10323 #    if DOUBLESIZE >= 8
10324 #      define MY_DBL_MIN 2.2250738585072014E-308L
10325 #    else
10326 #      define MY_DBL_MIN 1.17549435E-38L
10327 #    endif
10328 #  endif
10329
10330             if ((intsize == 'q') && (c == 'f') &&
10331                 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
10332                 (need < DBL_DIG)) {
10333                 /* it's going to be short enough that
10334                  * long double precision is not needed */
10335
10336                 if ((nv <= 0L) && (nv >= -0L))
10337                     fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
10338                 else {
10339                     /* would use Perl_fp_class as a double-check but not
10340                      * functional on IRIX - see perl.h comments */
10341
10342                     if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
10343                         /* It's within the range that a double can represent */
10344 #if defined(DBL_MAX) && !defined(DBL_MIN)
10345                         if ((nv >= ((long double)1/DBL_MAX)) ||
10346                             (nv <= (-(long double)1/DBL_MAX)))
10347 #endif
10348                         fix_ldbl_sprintf_bug = TRUE;
10349                     }
10350                 }
10351                 if (fix_ldbl_sprintf_bug == TRUE) {
10352                     double temp;
10353
10354                     intsize = 0;
10355                     temp = (double)nv;
10356                     nv = (NV)temp;
10357                 }
10358             }
10359
10360 #  undef MY_DBL_MAX
10361 #  undef MY_DBL_MAX_BUG
10362 #  undef MY_DBL_MIN
10363
10364 #endif /* HAS_LDBL_SPRINTF_BUG */
10365
10366             need += 20; /* fudge factor */
10367             if (PL_efloatsize < need) {
10368                 Safefree(PL_efloatbuf);
10369                 PL_efloatsize = need + 20; /* more fudge */
10370                 Newx(PL_efloatbuf, PL_efloatsize, char);
10371                 PL_efloatbuf[0] = '\0';
10372             }
10373
10374             if ( !(width || left || plus || alt) && fill != '0'
10375                  && has_precis && intsize != 'q' ) {    /* Shortcuts */
10376                 /* See earlier comment about buggy Gconvert when digits,
10377                    aka precis is 0  */
10378                 if ( c == 'g' && precis) {
10379                     Gconvert((NV)nv, (int)precis, 0, PL_efloatbuf);
10380                     /* May return an empty string for digits==0 */
10381                     if (*PL_efloatbuf) {
10382                         elen = strlen(PL_efloatbuf);
10383                         goto float_converted;
10384                     }
10385                 } else if ( c == 'f' && !precis) {
10386                     if ((eptr = F0convert(nv, ebuf + sizeof ebuf, &elen)))
10387                         break;
10388                 }
10389             }
10390             {
10391                 char *ptr = ebuf + sizeof ebuf;
10392                 *--ptr = '\0';
10393                 *--ptr = c;
10394                 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
10395 #if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
10396                 if (intsize == 'q') {
10397                     /* Copy the one or more characters in a long double
10398                      * format before the 'base' ([efgEFG]) character to
10399                      * the format string. */
10400                     static char const prifldbl[] = PERL_PRIfldbl;
10401                     char const *p = prifldbl + sizeof(prifldbl) - 3;
10402                     while (p >= prifldbl) { *--ptr = *p--; }
10403                 }
10404 #endif
10405                 if (has_precis) {
10406                     base = precis;
10407                     do { *--ptr = '0' + (base % 10); } while (base /= 10);
10408                     *--ptr = '.';
10409                 }
10410                 if (width) {
10411                     base = width;
10412                     do { *--ptr = '0' + (base % 10); } while (base /= 10);
10413                 }
10414                 if (fill == '0')
10415                     *--ptr = fill;
10416                 if (left)
10417                     *--ptr = '-';
10418                 if (plus)
10419                     *--ptr = plus;
10420                 if (alt)
10421                     *--ptr = '#';
10422                 *--ptr = '%';
10423
10424                 /* No taint.  Otherwise we are in the strange situation
10425                  * where printf() taints but print($float) doesn't.
10426                  * --jhi */
10427 #if defined(HAS_LONG_DOUBLE)
10428                 elen = ((intsize == 'q')
10429                         ? my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, nv)
10430                         : my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, (double)nv));
10431 #else
10432                 elen = my_sprintf(PL_efloatbuf, ptr, nv);
10433 #endif
10434             }
10435         float_converted:
10436             eptr = PL_efloatbuf;
10437             break;
10438
10439             /* SPECIAL */
10440
10441         case 'n':
10442             if (vectorize)
10443                 goto unknown;
10444             i = SvCUR(sv) - origlen;
10445             if (args) {
10446                 switch (intsize) {
10447                 case 'h':       *(va_arg(*args, short*)) = i; break;
10448                 default:        *(va_arg(*args, int*)) = i; break;
10449                 case 'l':       *(va_arg(*args, long*)) = i; break;
10450                 case 'V':       *(va_arg(*args, IV*)) = i; break;
10451                 case 'q':
10452 #ifdef HAS_QUAD
10453                                 *(va_arg(*args, Quad_t*)) = i; break;
10454 #else
10455                                 goto unknown;
10456 #endif
10457                 }
10458             }
10459             else
10460                 sv_setuv_mg(argsv, (UV)i);
10461             continue;   /* not "break" */
10462
10463             /* UNKNOWN */
10464
10465         default:
10466       unknown:
10467             if (!args
10468                 && (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)
10469                 && ckWARN(WARN_PRINTF))
10470             {
10471                 SV * const msg = sv_newmortal();
10472                 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
10473                           (PL_op->op_type == OP_PRTF) ? "" : "s");
10474                 if (fmtstart < patend) {
10475                     const char * const fmtend = q < patend ? q : patend;
10476                     const char * f;
10477                     sv_catpvs(msg, "\"%");
10478                     for (f = fmtstart; f < fmtend; f++) {
10479                         if (isPRINT(*f)) {
10480                             sv_catpvn(msg, f, 1);
10481                         } else {
10482                             Perl_sv_catpvf(aTHX_ msg,
10483                                            "\\%03"UVof, (UV)*f & 0xFF);
10484                         }
10485                     }
10486                     sv_catpvs(msg, "\"");
10487                 } else {
10488                     sv_catpvs(msg, "end of string");
10489                 }
10490                 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, SVfARG(msg)); /* yes, this is reentrant */
10491             }
10492
10493             /* output mangled stuff ... */
10494             if (c == '\0')
10495                 --q;
10496             eptr = p;
10497             elen = q - p;
10498
10499             /* ... right here, because formatting flags should not apply */
10500             SvGROW(sv, SvCUR(sv) + elen + 1);
10501             p = SvEND(sv);
10502             Copy(eptr, p, elen, char);
10503             p += elen;
10504             *p = '\0';
10505             SvCUR_set(sv, p - SvPVX_const(sv));
10506             svix = osvix;
10507             continue;   /* not "break" */
10508         }
10509
10510         if (is_utf8 != has_utf8) {
10511             if (is_utf8) {
10512                 if (SvCUR(sv))
10513                     sv_utf8_upgrade(sv);
10514             }
10515             else {
10516                 const STRLEN old_elen = elen;
10517                 SV * const nsv = newSVpvn_flags(eptr, elen, SVs_TEMP);
10518                 sv_utf8_upgrade(nsv);
10519                 eptr = SvPVX_const(nsv);
10520                 elen = SvCUR(nsv);
10521
10522                 if (width) { /* fudge width (can't fudge elen) */
10523                     width += elen - old_elen;
10524                 }
10525                 is_utf8 = TRUE;
10526             }
10527         }
10528
10529         have = esignlen + zeros + elen;
10530         if (have < zeros)
10531             Perl_croak_nocontext("%s", PL_memory_wrap);
10532
10533         need = (have > width ? have : width);
10534         gap = need - have;
10535
10536         if (need >= (((STRLEN)~0) - SvCUR(sv) - dotstrlen - 1))
10537             Perl_croak_nocontext("%s", PL_memory_wrap);
10538         SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
10539         p = SvEND(sv);
10540         if (esignlen && fill == '0') {
10541             int i;
10542             for (i = 0; i < (int)esignlen; i++)
10543                 *p++ = esignbuf[i];
10544         }
10545         if (gap && !left) {
10546             memset(p, fill, gap);
10547             p += gap;
10548         }
10549         if (esignlen && fill != '0') {
10550             int i;
10551             for (i = 0; i < (int)esignlen; i++)
10552                 *p++ = esignbuf[i];
10553         }
10554         if (zeros) {
10555             int i;
10556             for (i = zeros; i; i--)
10557                 *p++ = '0';
10558         }
10559         if (elen) {
10560             Copy(eptr, p, elen, char);
10561             p += elen;
10562         }
10563         if (gap && left) {
10564             memset(p, ' ', gap);
10565             p += gap;
10566         }
10567         if (vectorize) {
10568             if (veclen) {
10569                 Copy(dotstr, p, dotstrlen, char);
10570                 p += dotstrlen;
10571             }
10572             else
10573                 vectorize = FALSE;              /* done iterating over vecstr */
10574         }
10575         if (is_utf8)
10576             has_utf8 = TRUE;
10577         if (has_utf8)
10578             SvUTF8_on(sv);
10579         *p = '\0';
10580         SvCUR_set(sv, p - SvPVX_const(sv));
10581         if (vectorize) {
10582             esignlen = 0;
10583             goto vector;
10584         }
10585     }
10586     SvTAINT(sv);
10587 }
10588
10589 /* =========================================================================
10590
10591 =head1 Cloning an interpreter
10592
10593 All the macros and functions in this section are for the private use of
10594 the main function, perl_clone().
10595
10596 The foo_dup() functions make an exact copy of an existing foo thingy.
10597 During the course of a cloning, a hash table is used to map old addresses
10598 to new addresses. The table is created and manipulated with the
10599 ptr_table_* functions.
10600
10601 =cut
10602
10603  * =========================================================================*/
10604
10605
10606 #if defined(USE_ITHREADS)
10607
10608 /* XXX Remove this so it doesn't have to go thru the macro and return for nothing */
10609 #ifndef GpREFCNT_inc
10610 #  define GpREFCNT_inc(gp)      ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
10611 #endif
10612
10613
10614 /* Certain cases in Perl_ss_dup have been merged, by relying on the fact
10615    that currently av_dup, gv_dup and hv_dup are the same as sv_dup.
10616    If this changes, please unmerge ss_dup.
10617    Likewise, sv_dup_inc_multiple() relies on this fact.  */
10618 #define sv_dup_inc_NN(s,t)      SvREFCNT_inc_NN(sv_dup_inc(s,t))
10619 #define av_dup(s,t)     MUTABLE_AV(sv_dup((const SV *)s,t))
10620 #define av_dup_inc(s,t) MUTABLE_AV(sv_dup_inc((const SV *)s,t))
10621 #define hv_dup(s,t)     MUTABLE_HV(sv_dup((const SV *)s,t))
10622 #define hv_dup_inc(s,t) MUTABLE_HV(sv_dup_inc((const SV *)s,t))
10623 #define cv_dup(s,t)     MUTABLE_CV(sv_dup((const SV *)s,t))
10624 #define cv_dup_inc(s,t) MUTABLE_CV(sv_dup_inc((const SV *)s,t))
10625 #define io_dup(s,t)     MUTABLE_IO(sv_dup((const SV *)s,t))
10626 #define io_dup_inc(s,t) MUTABLE_IO(sv_dup_inc((const SV *)s,t))
10627 #define gv_dup(s,t)     MUTABLE_GV(sv_dup((const SV *)s,t))
10628 #define gv_dup_inc(s,t) MUTABLE_GV(sv_dup_inc((const SV *)s,t))
10629 #define SAVEPV(p)       ((p) ? savepv(p) : NULL)
10630 #define SAVEPVN(p,n)    ((p) ? savepvn(p,n) : NULL)
10631
10632 /* clone a parser */
10633
10634 yy_parser *
10635 Perl_parser_dup(pTHX_ const yy_parser *const proto, CLONE_PARAMS *const param)
10636 {
10637     yy_parser *parser;
10638
10639     PERL_ARGS_ASSERT_PARSER_DUP;
10640
10641     if (!proto)
10642         return NULL;
10643
10644     /* look for it in the table first */
10645     parser = (yy_parser *)ptr_table_fetch(PL_ptr_table, proto);
10646     if (parser)
10647         return parser;
10648
10649     /* create anew and remember what it is */
10650     Newxz(parser, 1, yy_parser);
10651     ptr_table_store(PL_ptr_table, proto, parser);
10652
10653     parser->yyerrstatus = 0;
10654     parser->yychar = YYEMPTY;           /* Cause a token to be read.  */
10655
10656     /* XXX these not yet duped */
10657     parser->old_parser = NULL;
10658     parser->stack = NULL;
10659     parser->ps = NULL;
10660     parser->stack_size = 0;
10661     /* XXX parser->stack->state = 0; */
10662
10663     /* XXX eventually, just Copy() most of the parser struct ? */
10664
10665     parser->lex_brackets = proto->lex_brackets;
10666     parser->lex_casemods = proto->lex_casemods;
10667     parser->lex_brackstack = savepvn(proto->lex_brackstack,
10668                     (proto->lex_brackets < 120 ? 120 : proto->lex_brackets));
10669     parser->lex_casestack = savepvn(proto->lex_casestack,
10670                     (proto->lex_casemods < 12 ? 12 : proto->lex_casemods));
10671     parser->lex_defer   = proto->lex_defer;
10672     parser->lex_dojoin  = proto->lex_dojoin;
10673     parser->lex_expect  = proto->lex_expect;
10674     parser->lex_formbrack = proto->lex_formbrack;
10675     parser->lex_inpat   = proto->lex_inpat;
10676     parser->lex_inwhat  = proto->lex_inwhat;
10677     parser->lex_op      = proto->lex_op;
10678     parser->lex_repl    = sv_dup_inc(proto->lex_repl, param);
10679     parser->lex_starts  = proto->lex_starts;
10680     parser->lex_stuff   = sv_dup_inc(proto->lex_stuff, param);
10681     parser->multi_close = proto->multi_close;
10682     parser->multi_open  = proto->multi_open;
10683     parser->multi_start = proto->multi_start;
10684     parser->multi_end   = proto->multi_end;
10685     parser->pending_ident = proto->pending_ident;
10686     parser->preambled   = proto->preambled;
10687     parser->sublex_info = proto->sublex_info; /* XXX not quite right */
10688     parser->linestr     = sv_dup_inc(proto->linestr, param);
10689     parser->expect      = proto->expect;
10690     parser->copline     = proto->copline;
10691     parser->last_lop_op = proto->last_lop_op;
10692     parser->lex_state   = proto->lex_state;
10693     parser->rsfp        = fp_dup(proto->rsfp, '<', param);
10694     /* rsfp_filters entries have fake IoDIRP() */
10695     parser->rsfp_filters= av_dup_inc(proto->rsfp_filters, param);
10696     parser->in_my       = proto->in_my;
10697     parser->in_my_stash = hv_dup(proto->in_my_stash, param);
10698     parser->error_count = proto->error_count;
10699
10700
10701     parser->linestr     = sv_dup_inc(proto->linestr, param);
10702
10703     {
10704         char * const ols = SvPVX(proto->linestr);
10705         char * const ls  = SvPVX(parser->linestr);
10706
10707         parser->bufptr      = ls + (proto->bufptr >= ols ?
10708                                     proto->bufptr -  ols : 0);
10709         parser->oldbufptr   = ls + (proto->oldbufptr >= ols ?
10710                                     proto->oldbufptr -  ols : 0);
10711         parser->oldoldbufptr= ls + (proto->oldoldbufptr >= ols ?
10712                                     proto->oldoldbufptr -  ols : 0);
10713         parser->linestart   = ls + (proto->linestart >= ols ?
10714                                     proto->linestart -  ols : 0);
10715         parser->last_uni    = ls + (proto->last_uni >= ols ?
10716                                     proto->last_uni -  ols : 0);
10717         parser->last_lop    = ls + (proto->last_lop >= ols ?
10718                                     proto->last_lop -  ols : 0);
10719
10720         parser->bufend      = ls + SvCUR(parser->linestr);
10721     }
10722
10723     Copy(proto->tokenbuf, parser->tokenbuf, 256, char);
10724
10725
10726 #ifdef PERL_MAD
10727     parser->endwhite    = proto->endwhite;
10728     parser->faketokens  = proto->faketokens;
10729     parser->lasttoke    = proto->lasttoke;
10730     parser->nextwhite   = proto->nextwhite;
10731     parser->realtokenstart = proto->realtokenstart;
10732     parser->skipwhite   = proto->skipwhite;
10733     parser->thisclose   = proto->thisclose;
10734     parser->thismad     = proto->thismad;
10735     parser->thisopen    = proto->thisopen;
10736     parser->thisstuff   = proto->thisstuff;
10737     parser->thistoken   = proto->thistoken;
10738     parser->thiswhite   = proto->thiswhite;
10739
10740     Copy(proto->nexttoke, parser->nexttoke, 5, NEXTTOKE);
10741     parser->curforce    = proto->curforce;
10742 #else
10743     Copy(proto->nextval, parser->nextval, 5, YYSTYPE);
10744     Copy(proto->nexttype, parser->nexttype, 5,  I32);
10745     parser->nexttoke    = proto->nexttoke;
10746 #endif
10747
10748     /* XXX should clone saved_curcop here, but we aren't passed
10749      * proto_perl; so do it in perl_clone_using instead */
10750
10751     return parser;
10752 }
10753
10754
10755 /* duplicate a file handle */
10756
10757 PerlIO *
10758 Perl_fp_dup(pTHX_ PerlIO *const fp, const char type, CLONE_PARAMS *const param)
10759 {
10760     PerlIO *ret;
10761
10762     PERL_ARGS_ASSERT_FP_DUP;
10763     PERL_UNUSED_ARG(type);
10764
10765     if (!fp)
10766         return (PerlIO*)NULL;
10767
10768     /* look for it in the table first */
10769     ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
10770     if (ret)
10771         return ret;
10772
10773     /* create anew and remember what it is */
10774     ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
10775     ptr_table_store(PL_ptr_table, fp, ret);
10776     return ret;
10777 }
10778
10779 /* duplicate a directory handle */
10780
10781 DIR *
10782 Perl_dirp_dup(pTHX_ DIR *const dp)
10783 {
10784     PERL_UNUSED_CONTEXT;
10785     if (!dp)
10786         return (DIR*)NULL;
10787     /* XXX TODO */
10788     return dp;
10789 }
10790
10791 /* duplicate a typeglob */
10792
10793 GP *
10794 Perl_gp_dup(pTHX_ GP *const gp, CLONE_PARAMS *const param)
10795 {
10796     GP *ret;
10797
10798     PERL_ARGS_ASSERT_GP_DUP;
10799
10800     if (!gp)
10801         return (GP*)NULL;
10802     /* look for it in the table first */
10803     ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
10804     if (ret)
10805         return ret;
10806
10807     /* create anew and remember what it is */
10808     Newxz(ret, 1, GP);
10809     ptr_table_store(PL_ptr_table, gp, ret);
10810
10811     /* clone */
10812     /* ret->gp_refcnt must be 0 before any other dups are called. We're relying
10813        on Newxz() to do this for us.  */
10814     ret->gp_sv          = sv_dup_inc(gp->gp_sv, param);
10815     ret->gp_io          = io_dup_inc(gp->gp_io, param);
10816     ret->gp_form        = cv_dup_inc(gp->gp_form, param);
10817     ret->gp_av          = av_dup_inc(gp->gp_av, param);
10818     ret->gp_hv          = hv_dup_inc(gp->gp_hv, param);
10819     ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
10820     ret->gp_cv          = cv_dup_inc(gp->gp_cv, param);
10821     ret->gp_cvgen       = gp->gp_cvgen;
10822     ret->gp_line        = gp->gp_line;
10823     ret->gp_file_hek    = hek_dup(gp->gp_file_hek, param);
10824     return ret;
10825 }
10826
10827 /* duplicate a chain of magic */
10828
10829 MAGIC *
10830 Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS *const param)
10831 {
10832     MAGIC *mgret = NULL;
10833     MAGIC **mgprev_p = &mgret;
10834
10835     PERL_ARGS_ASSERT_MG_DUP;
10836
10837     for (; mg; mg = mg->mg_moremagic) {
10838         MAGIC *nmg;
10839
10840         if ((param->flags & CLONEf_JOIN_IN)
10841                 && mg->mg_type == PERL_MAGIC_backref)
10842             /* when joining, we let the individual SVs add themselves to
10843              * backref as needed. */
10844             continue;
10845
10846         Newx(nmg, 1, MAGIC);
10847         *mgprev_p = nmg;
10848         mgprev_p = &(nmg->mg_moremagic);
10849
10850         /* There was a comment "XXX copy dynamic vtable?" but as we don't have
10851            dynamic vtables, I'm not sure why Sarathy wrote it. The comment dates
10852            from the original commit adding Perl_mg_dup() - revision 4538.
10853            Similarly there is the annotation "XXX random ptr?" next to the
10854            assignment to nmg->mg_ptr.  */
10855         *nmg = *mg;
10856
10857         /* FIXME for plugins
10858         if (nmg->mg_type == PERL_MAGIC_qr) {
10859             nmg->mg_obj = MUTABLE_SV(CALLREGDUPE((REGEXP*)nmg->mg_obj, param));
10860         }
10861         else
10862         */
10863         nmg->mg_obj = (nmg->mg_flags & MGf_REFCOUNTED)
10864                           ? nmg->mg_type == PERL_MAGIC_backref
10865                                 /* The backref AV has its reference
10866                                  * count deliberately bumped by 1 */
10867                                 ? SvREFCNT_inc(av_dup_inc((const AV *)
10868                                                     nmg->mg_obj, param))
10869                                 : sv_dup_inc(nmg->mg_obj, param)
10870                           : sv_dup(nmg->mg_obj, param);
10871
10872         if (nmg->mg_ptr && nmg->mg_type != PERL_MAGIC_regex_global) {
10873             if (nmg->mg_len > 0) {
10874                 nmg->mg_ptr     = SAVEPVN(nmg->mg_ptr, nmg->mg_len);
10875                 if (nmg->mg_type == PERL_MAGIC_overload_table &&
10876                         AMT_AMAGIC((AMT*)nmg->mg_ptr))
10877                 {
10878                     AMT * const namtp = (AMT*)nmg->mg_ptr;
10879                     sv_dup_inc_multiple((SV**)(namtp->table),
10880                                         (SV**)(namtp->table), NofAMmeth, param);
10881                 }
10882             }
10883             else if (nmg->mg_len == HEf_SVKEY)
10884                 nmg->mg_ptr = (char*)sv_dup_inc((const SV *)nmg->mg_ptr, param);
10885         }
10886         if ((nmg->mg_flags & MGf_DUP) && nmg->mg_virtual && nmg->mg_virtual->svt_dup) {
10887             CALL_FPTR(nmg->mg_virtual->svt_dup)(aTHX_ nmg, param);
10888         }
10889     }
10890     return mgret;
10891 }
10892
10893 #endif /* USE_ITHREADS */
10894
10895 struct ptr_tbl_arena {
10896     struct ptr_tbl_arena *next;
10897     struct ptr_tbl_ent array[1023/3]; /* as ptr_tbl_ent has 3 pointers.  */
10898 };
10899
10900 /* create a new pointer-mapping table */
10901
10902 PTR_TBL_t *
10903 Perl_ptr_table_new(pTHX)
10904 {
10905     PTR_TBL_t *tbl;
10906     PERL_UNUSED_CONTEXT;
10907
10908     Newx(tbl, 1, PTR_TBL_t);
10909     tbl->tbl_max        = 511;
10910     tbl->tbl_items      = 0;
10911     tbl->tbl_arena      = NULL;
10912     tbl->tbl_arena_next = NULL;
10913     tbl->tbl_arena_end  = NULL;
10914     Newxz(tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
10915     return tbl;
10916 }
10917
10918 #define PTR_TABLE_HASH(ptr) \
10919   ((PTR2UV(ptr) >> 3) ^ (PTR2UV(ptr) >> (3 + 7)) ^ (PTR2UV(ptr) >> (3 + 17)))
10920
10921 /* map an existing pointer using a table */
10922
10923 STATIC PTR_TBL_ENT_t *
10924 S_ptr_table_find(PTR_TBL_t *const tbl, const void *const sv)
10925 {
10926     PTR_TBL_ENT_t *tblent;
10927     const UV hash = PTR_TABLE_HASH(sv);
10928
10929     PERL_ARGS_ASSERT_PTR_TABLE_FIND;
10930
10931     tblent = tbl->tbl_ary[hash & tbl->tbl_max];
10932     for (; tblent; tblent = tblent->next) {
10933         if (tblent->oldval == sv)
10934             return tblent;
10935     }
10936     return NULL;
10937 }
10938
10939 void *
10940 Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *const tbl, const void *const sv)
10941 {
10942     PTR_TBL_ENT_t const *const tblent = ptr_table_find(tbl, sv);
10943
10944     PERL_ARGS_ASSERT_PTR_TABLE_FETCH;
10945     PERL_UNUSED_CONTEXT;
10946
10947     return tblent ? tblent->newval : NULL;
10948 }
10949
10950 /* add a new entry to a pointer-mapping table */
10951
10952 void
10953 Perl_ptr_table_store(pTHX_ PTR_TBL_t *const tbl, const void *const oldsv, void *const newsv)
10954 {
10955     PTR_TBL_ENT_t *tblent = ptr_table_find(tbl, oldsv);
10956
10957     PERL_ARGS_ASSERT_PTR_TABLE_STORE;
10958     PERL_UNUSED_CONTEXT;
10959
10960     if (tblent) {
10961         tblent->newval = newsv;
10962     } else {
10963         const UV entry = PTR_TABLE_HASH(oldsv) & tbl->tbl_max;
10964
10965         if (tbl->tbl_arena_next == tbl->tbl_arena_end) {
10966             struct ptr_tbl_arena *new_arena;
10967
10968             Newx(new_arena, 1, struct ptr_tbl_arena);
10969             new_arena->next = tbl->tbl_arena;
10970             tbl->tbl_arena = new_arena;
10971             tbl->tbl_arena_next = new_arena->array;
10972             tbl->tbl_arena_end = new_arena->array
10973                 + sizeof(new_arena->array) / sizeof(new_arena->array[0]);
10974         }
10975
10976         tblent = tbl->tbl_arena_next++;
10977
10978         tblent->oldval = oldsv;
10979         tblent->newval = newsv;
10980         tblent->next = tbl->tbl_ary[entry];
10981         tbl->tbl_ary[entry] = tblent;
10982         tbl->tbl_items++;
10983         if (tblent->next && tbl->tbl_items > tbl->tbl_max)
10984             ptr_table_split(tbl);
10985     }
10986 }
10987
10988 /* double the hash bucket size of an existing ptr table */
10989
10990 void
10991 Perl_ptr_table_split(pTHX_ PTR_TBL_t *const tbl)
10992 {
10993     PTR_TBL_ENT_t **ary = tbl->tbl_ary;
10994     const UV oldsize = tbl->tbl_max + 1;
10995     UV newsize = oldsize * 2;
10996     UV i;
10997
10998     PERL_ARGS_ASSERT_PTR_TABLE_SPLIT;
10999     PERL_UNUSED_CONTEXT;
11000
11001     Renew(ary, newsize, PTR_TBL_ENT_t*);
11002     Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
11003     tbl->tbl_max = --newsize;
11004     tbl->tbl_ary = ary;
11005     for (i=0; i < oldsize; i++, ary++) {
11006         PTR_TBL_ENT_t **entp = ary;
11007         PTR_TBL_ENT_t *ent = *ary;
11008         PTR_TBL_ENT_t **curentp;
11009         if (!ent)
11010             continue;
11011         curentp = ary + oldsize;
11012         do {
11013             if ((newsize & PTR_TABLE_HASH(ent->oldval)) != i) {
11014                 *entp = ent->next;
11015                 ent->next = *curentp;
11016                 *curentp = ent;
11017             }
11018             else
11019                 entp = &ent->next;
11020             ent = *entp;
11021         } while (ent);
11022     }
11023 }
11024
11025 /* remove all the entries from a ptr table */
11026 /* Deprecated - will be removed post 5.14 */
11027
11028 void
11029 Perl_ptr_table_clear(pTHX_ PTR_TBL_t *const tbl)
11030 {
11031     if (tbl && tbl->tbl_items) {
11032         struct ptr_tbl_arena *arena = tbl->tbl_arena;
11033
11034         Zero(tbl->tbl_ary, tbl->tbl_max + 1, struct ptr_tbl_ent **);
11035
11036         while (arena) {
11037             struct ptr_tbl_arena *next = arena->next;
11038
11039             Safefree(arena);
11040             arena = next;
11041         };
11042
11043         tbl->tbl_items = 0;
11044         tbl->tbl_arena = NULL;
11045         tbl->tbl_arena_next = NULL;
11046         tbl->tbl_arena_end = NULL;
11047     }
11048 }
11049
11050 /* clear and free a ptr table */
11051
11052 void
11053 Perl_ptr_table_free(pTHX_ PTR_TBL_t *const tbl)
11054 {
11055     struct ptr_tbl_arena *arena;
11056
11057     if (!tbl) {
11058         return;
11059     }
11060
11061     arena = tbl->tbl_arena;
11062
11063     while (arena) {
11064         struct ptr_tbl_arena *next = arena->next;
11065
11066         Safefree(arena);
11067         arena = next;
11068     }
11069
11070     Safefree(tbl->tbl_ary);
11071     Safefree(tbl);
11072 }
11073
11074 #if defined(USE_ITHREADS)
11075
11076 void
11077 Perl_rvpv_dup(pTHX_ SV *const dstr, const SV *const sstr, CLONE_PARAMS *const param)
11078 {
11079     PERL_ARGS_ASSERT_RVPV_DUP;
11080
11081     if (SvROK(sstr)) {
11082         if (SvWEAKREF(sstr)) {
11083             SvRV_set(dstr, sv_dup(SvRV_const(sstr), param));
11084             if (param->flags & CLONEf_JOIN_IN) {
11085                 /* if joining, we add any back references individually rather
11086                  * than copying the whole backref array */
11087                 Perl_sv_add_backref(aTHX_ SvRV(dstr), dstr);
11088             }
11089         }
11090         else
11091             SvRV_set(dstr, sv_dup_inc(SvRV_const(sstr), param));
11092     }
11093     else if (SvPVX_const(sstr)) {
11094         /* Has something there */
11095         if (SvLEN(sstr)) {
11096             /* Normal PV - clone whole allocated space */
11097             SvPV_set(dstr, SAVEPVN(SvPVX_const(sstr), SvLEN(sstr)-1));
11098             if (SvREADONLY(sstr) && SvFAKE(sstr)) {
11099                 /* Not that normal - actually sstr is copy on write.
11100                    But we are a true, independant SV, so:  */
11101                 SvREADONLY_off(dstr);
11102                 SvFAKE_off(dstr);
11103             }
11104         }
11105         else {
11106             /* Special case - not normally malloced for some reason */
11107             if (isGV_with_GP(sstr)) {
11108                 /* Don't need to do anything here.  */
11109             }
11110             else if ((SvREADONLY(sstr) && SvFAKE(sstr))) {
11111                 /* A "shared" PV - clone it as "shared" PV */
11112                 SvPV_set(dstr,
11113                          HEK_KEY(hek_dup(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)),
11114                                          param)));
11115             }
11116             else {
11117                 /* Some other special case - random pointer */
11118                 SvPV_set(dstr, (char *) SvPVX_const(sstr));             
11119             }
11120         }
11121     }
11122     else {
11123         /* Copy the NULL */
11124         SvPV_set(dstr, NULL);
11125     }
11126 }
11127
11128 /* duplicate a list of SVs. source and dest may point to the same memory.  */
11129 static SV **
11130 S_sv_dup_inc_multiple(pTHX_ SV *const *source, SV **dest,
11131                       SSize_t items, CLONE_PARAMS *const param)
11132 {
11133     PERL_ARGS_ASSERT_SV_DUP_INC_MULTIPLE;
11134
11135     while (items-- > 0) {
11136         *dest++ = sv_dup_inc(*source++, param);
11137     }
11138
11139     return dest;
11140 }
11141
11142 /* duplicate an SV of any type (including AV, HV etc) */
11143
11144 static SV *
11145 S_sv_dup_common(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
11146 {
11147     dVAR;
11148     SV *dstr;
11149
11150     PERL_ARGS_ASSERT_SV_DUP_COMMON;
11151
11152     if (SvTYPE(sstr) == SVTYPEMASK) {
11153 #ifdef DEBUG_LEAKING_SCALARS_ABORT
11154         abort();
11155 #endif
11156         return NULL;
11157     }
11158     /* look for it in the table first */
11159     dstr = MUTABLE_SV(ptr_table_fetch(PL_ptr_table, sstr));
11160     if (dstr)
11161         return dstr;
11162
11163     if(param->flags & CLONEf_JOIN_IN) {
11164         /** We are joining here so we don't want do clone
11165             something that is bad **/
11166         if (SvTYPE(sstr) == SVt_PVHV) {
11167             const HEK * const hvname = HvNAME_HEK(sstr);
11168             if (hvname) {
11169                 /** don't clone stashes if they already exist **/
11170                 dstr = MUTABLE_SV(gv_stashpvn(HEK_KEY(hvname), HEK_LEN(hvname), 0));
11171                 ptr_table_store(PL_ptr_table, sstr, dstr);
11172                 return dstr;
11173             }
11174         }
11175     }
11176
11177     /* create anew and remember what it is */
11178     new_SV(dstr);
11179
11180 #ifdef DEBUG_LEAKING_SCALARS
11181     dstr->sv_debug_optype = sstr->sv_debug_optype;
11182     dstr->sv_debug_line = sstr->sv_debug_line;
11183     dstr->sv_debug_inpad = sstr->sv_debug_inpad;
11184     dstr->sv_debug_parent = (SV*)sstr;
11185     dstr->sv_debug_file = savepv(sstr->sv_debug_file);
11186 #endif
11187
11188     ptr_table_store(PL_ptr_table, sstr, dstr);
11189
11190     /* clone */
11191     SvFLAGS(dstr)       = SvFLAGS(sstr);
11192     SvFLAGS(dstr)       &= ~SVf_OOK;            /* don't propagate OOK hack */
11193     SvREFCNT(dstr)      = 0;                    /* must be before any other dups! */
11194
11195 #ifdef DEBUGGING
11196     if (SvANY(sstr) && PL_watch_pvx && SvPVX_const(sstr) == PL_watch_pvx)
11197         PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
11198                       (void*)PL_watch_pvx, SvPVX_const(sstr));
11199 #endif
11200
11201     /* don't clone objects whose class has asked us not to */
11202     if (SvOBJECT(sstr) && ! (SvFLAGS(SvSTASH(sstr)) & SVphv_CLONEABLE)) {
11203         SvFLAGS(dstr) = 0;
11204         return dstr;
11205     }
11206
11207     switch (SvTYPE(sstr)) {
11208     case SVt_NULL:
11209         SvANY(dstr)     = NULL;
11210         break;
11211     case SVt_IV:
11212         SvANY(dstr)     = (XPVIV*)((char*)&(dstr->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
11213         if(SvROK(sstr)) {
11214             Perl_rvpv_dup(aTHX_ dstr, sstr, param);
11215         } else {
11216             SvIV_set(dstr, SvIVX(sstr));
11217         }
11218         break;
11219     case SVt_NV:
11220         SvANY(dstr)     = new_XNV();
11221         SvNV_set(dstr, SvNVX(sstr));
11222         break;
11223         /* case SVt_BIND: */
11224     default:
11225         {
11226             /* These are all the types that need complex bodies allocating.  */
11227             void *new_body;
11228             const svtype sv_type = SvTYPE(sstr);
11229             const struct body_details *const sv_type_details
11230                 = bodies_by_type + sv_type;
11231
11232             switch (sv_type) {
11233             default:
11234                 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
11235                 break;
11236
11237             case SVt_PVGV:
11238             case SVt_PVIO:
11239             case SVt_PVFM:
11240             case SVt_PVHV:
11241             case SVt_PVAV:
11242             case SVt_PVCV:
11243             case SVt_PVLV:
11244             case SVt_REGEXP:
11245             case SVt_PVMG:
11246             case SVt_PVNV:
11247             case SVt_PVIV:
11248             case SVt_PV:
11249                 assert(sv_type_details->body_size);
11250                 if (sv_type_details->arena) {
11251                     new_body_inline(new_body, sv_type);
11252                     new_body
11253                         = (void*)((char*)new_body - sv_type_details->offset);
11254                 } else {
11255                     new_body = new_NOARENA(sv_type_details);
11256                 }
11257             }
11258             assert(new_body);
11259             SvANY(dstr) = new_body;
11260
11261 #ifndef PURIFY
11262             Copy(((char*)SvANY(sstr)) + sv_type_details->offset,
11263                  ((char*)SvANY(dstr)) + sv_type_details->offset,
11264                  sv_type_details->copy, char);
11265 #else
11266             Copy(((char*)SvANY(sstr)),
11267                  ((char*)SvANY(dstr)),
11268                  sv_type_details->body_size + sv_type_details->offset, char);
11269 #endif
11270
11271             if (sv_type != SVt_PVAV && sv_type != SVt_PVHV
11272                 && !isGV_with_GP(dstr)
11273                 && !(sv_type == SVt_PVIO && !(IoFLAGS(dstr) & IOf_FAKE_DIRP)))
11274                 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
11275
11276             /* The Copy above means that all the source (unduplicated) pointers
11277                are now in the destination.  We can check the flags and the
11278                pointers in either, but it's possible that there's less cache
11279                missing by always going for the destination.
11280                FIXME - instrument and check that assumption  */
11281             if (sv_type >= SVt_PVMG) {
11282                 if ((sv_type == SVt_PVMG) && SvPAD_OUR(dstr)) {
11283                     SvOURSTASH_set(dstr, hv_dup_inc(SvOURSTASH(dstr), param));
11284                 } else if (SvMAGIC(dstr))
11285                     SvMAGIC_set(dstr, mg_dup(SvMAGIC(dstr), param));
11286                 if (SvSTASH(dstr))
11287                     SvSTASH_set(dstr, hv_dup_inc(SvSTASH(dstr), param));
11288             }
11289
11290             /* The cast silences a GCC warning about unhandled types.  */
11291             switch ((int)sv_type) {
11292             case SVt_PV:
11293                 break;
11294             case SVt_PVIV:
11295                 break;
11296             case SVt_PVNV:
11297                 break;
11298             case SVt_PVMG:
11299                 break;
11300             case SVt_REGEXP:
11301                 /* FIXME for plugins */
11302                 re_dup_guts((REGEXP*) sstr, (REGEXP*) dstr, param);
11303                 break;
11304             case SVt_PVLV:
11305                 /* XXX LvTARGOFF sometimes holds PMOP* when DEBUGGING */
11306                 if (LvTYPE(dstr) == 't') /* for tie: unrefcnted fake (SV**) */
11307                     LvTARG(dstr) = dstr;
11308                 else if (LvTYPE(dstr) == 'T') /* for tie: fake HE */
11309                     LvTARG(dstr) = MUTABLE_SV(he_dup((HE*)LvTARG(dstr), 0, param));
11310                 else
11311                     LvTARG(dstr) = sv_dup_inc(LvTARG(dstr), param);
11312             case SVt_PVGV:
11313                 if(isGV_with_GP(sstr)) {
11314                     GvNAME_HEK(dstr) = hek_dup(GvNAME_HEK(dstr), param);
11315                     /* Don't call sv_add_backref here as it's going to be
11316                        created as part of the magic cloning of the symbol
11317                        table--unless this is during a join and the stash
11318                        is not actually being cloned.  */
11319                     /* Danger Will Robinson - GvGP(dstr) isn't initialised
11320                        at the point of this comment.  */
11321                     GvSTASH(dstr) = hv_dup(GvSTASH(dstr), param);
11322                     if (param->flags & CLONEf_JOIN_IN)
11323                         Perl_sv_add_backref(aTHX_ MUTABLE_SV(GvSTASH(dstr)), dstr);
11324                     GvGP(dstr)  = gp_dup(GvGP(sstr), param);
11325                     (void)GpREFCNT_inc(GvGP(dstr));
11326                 } else
11327                     Perl_rvpv_dup(aTHX_ dstr, sstr, param);
11328                 break;
11329             case SVt_PVIO:
11330                 /* PL_parser->rsfp_filters entries have fake IoDIRP() */
11331                 if(IoFLAGS(dstr) & IOf_FAKE_DIRP) {
11332                     /* I have no idea why fake dirp (rsfps)
11333                        should be treated differently but otherwise
11334                        we end up with leaks -- sky*/
11335                     IoTOP_GV(dstr)      = gv_dup_inc(IoTOP_GV(dstr), param);
11336                     IoFMT_GV(dstr)      = gv_dup_inc(IoFMT_GV(dstr), param);
11337                     IoBOTTOM_GV(dstr)   = gv_dup_inc(IoBOTTOM_GV(dstr), param);
11338                 } else {
11339                     IoTOP_GV(dstr)      = gv_dup(IoTOP_GV(dstr), param);
11340                     IoFMT_GV(dstr)      = gv_dup(IoFMT_GV(dstr), param);
11341                     IoBOTTOM_GV(dstr)   = gv_dup(IoBOTTOM_GV(dstr), param);
11342                     if (IoDIRP(dstr)) {
11343                         IoDIRP(dstr)    = dirp_dup(IoDIRP(dstr));
11344                     } else {
11345                         NOOP;
11346                         /* IoDIRP(dstr) is already a copy of IoDIRP(sstr)  */
11347                     }
11348                     IoIFP(dstr) = fp_dup(IoIFP(sstr), IoTYPE(dstr), param);
11349                 }
11350                 if (IoOFP(dstr) == IoIFP(sstr))
11351                     IoOFP(dstr) = IoIFP(dstr);
11352                 else
11353                     IoOFP(dstr) = fp_dup(IoOFP(dstr), IoTYPE(dstr), param);
11354                 IoTOP_NAME(dstr)        = SAVEPV(IoTOP_NAME(dstr));
11355                 IoFMT_NAME(dstr)        = SAVEPV(IoFMT_NAME(dstr));
11356                 IoBOTTOM_NAME(dstr)     = SAVEPV(IoBOTTOM_NAME(dstr));
11357                 break;
11358             case SVt_PVAV:
11359                 /* avoid cloning an empty array */
11360                 if (AvARRAY((const AV *)sstr) && AvFILLp((const AV *)sstr) >= 0) {
11361                     SV **dst_ary, **src_ary;
11362                     SSize_t items = AvFILLp((const AV *)sstr) + 1;
11363
11364                     src_ary = AvARRAY((const AV *)sstr);
11365                     Newxz(dst_ary, AvMAX((const AV *)sstr)+1, SV*);
11366                     ptr_table_store(PL_ptr_table, src_ary, dst_ary);
11367                     AvARRAY(MUTABLE_AV(dstr)) = dst_ary;
11368                     AvALLOC((const AV *)dstr) = dst_ary;
11369                     if (AvREAL((const AV *)sstr)) {
11370                         dst_ary = sv_dup_inc_multiple(src_ary, dst_ary, items,
11371                                                       param);
11372                     }
11373                     else {
11374                         while (items-- > 0)
11375                             *dst_ary++ = sv_dup(*src_ary++, param);
11376                     }
11377                     items = AvMAX((const AV *)sstr) - AvFILLp((const AV *)sstr);
11378                     while (items-- > 0) {
11379                         *dst_ary++ = &PL_sv_undef;
11380                     }
11381                 }
11382                 else {
11383                     AvARRAY(MUTABLE_AV(dstr))   = NULL;
11384                     AvALLOC((const AV *)dstr)   = (SV**)NULL;
11385                     AvMAX(  (const AV *)dstr)   = -1;
11386                     AvFILLp((const AV *)dstr)   = -1;
11387                 }
11388                 break;
11389             case SVt_PVHV:
11390                 if (HvARRAY((const HV *)sstr)) {
11391                     STRLEN i = 0;
11392                     const bool sharekeys = !!HvSHAREKEYS(sstr);
11393                     XPVHV * const dxhv = (XPVHV*)SvANY(dstr);
11394                     XPVHV * const sxhv = (XPVHV*)SvANY(sstr);
11395                     char *darray;
11396                     Newx(darray, PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1)
11397                         + (SvOOK(sstr) ? sizeof(struct xpvhv_aux) : 0),
11398                         char);
11399                     HvARRAY(dstr) = (HE**)darray;
11400                     while (i <= sxhv->xhv_max) {
11401                         const HE * const source = HvARRAY(sstr)[i];
11402                         HvARRAY(dstr)[i] = source
11403                             ? he_dup(source, sharekeys, param) : 0;
11404                         ++i;
11405                     }
11406                     if (SvOOK(sstr)) {
11407                         HEK *hvname;
11408                         const struct xpvhv_aux * const saux = HvAUX(sstr);
11409                         struct xpvhv_aux * const daux = HvAUX(dstr);
11410                         /* This flag isn't copied.  */
11411                         /* SvOOK_on(hv) attacks the IV flags.  */
11412                         SvFLAGS(dstr) |= SVf_OOK;
11413
11414                         hvname = saux->xhv_name;
11415                         daux->xhv_name = hek_dup(hvname, param);
11416
11417                         daux->xhv_riter = saux->xhv_riter;
11418                         daux->xhv_eiter = saux->xhv_eiter
11419                             ? he_dup(saux->xhv_eiter,
11420                                         cBOOL(HvSHAREKEYS(sstr)), param) : 0;
11421                         /* backref array needs refcnt=2; see sv_add_backref */
11422                         daux->xhv_backreferences =
11423                             (param->flags & CLONEf_JOIN_IN)
11424                                 /* when joining, we let the individual GVs and
11425                                  * CVs add themselves to backref as
11426                                  * needed. This avoids pulling in stuff
11427                                  * that isn't required, and simplifies the
11428                                  * case where stashes aren't cloned back
11429                                  * if they already exist in the parent
11430                                  * thread */
11431                             ? NULL
11432                             : saux->xhv_backreferences
11433                                 ? (SvTYPE(saux->xhv_backreferences) == SVt_PVAV)
11434                                     ? MUTABLE_AV(SvREFCNT_inc(
11435                                           sv_dup_inc((const SV *)
11436                                             saux->xhv_backreferences, param)))
11437                                     : MUTABLE_AV(sv_dup((const SV *)
11438                                             saux->xhv_backreferences, param))
11439                                 : 0;
11440
11441                         daux->xhv_mro_meta = saux->xhv_mro_meta
11442                             ? mro_meta_dup(saux->xhv_mro_meta, param)
11443                             : 0;
11444
11445                         /* Record stashes for possible cloning in Perl_clone(). */
11446                         if (hvname)
11447                             av_push(param->stashes, dstr);
11448                     }
11449                 }
11450                 else
11451                     HvARRAY(MUTABLE_HV(dstr)) = NULL;
11452                 break;
11453             case SVt_PVCV:
11454                 if (!(param->flags & CLONEf_COPY_STACKS)) {
11455                     CvDEPTH(dstr) = 0;
11456                 }
11457                 /*FALLTHROUGH*/
11458             case SVt_PVFM:
11459                 /* NOTE: not refcounted */
11460                 CvSTASH(dstr)   = hv_dup(CvSTASH(dstr), param);
11461                 if ((param->flags & CLONEf_JOIN_IN) && CvSTASH(dstr))
11462                     Perl_sv_add_backref(aTHX_ MUTABLE_SV(CvSTASH(dstr)), dstr);
11463                 OP_REFCNT_LOCK;
11464                 if (!CvISXSUB(dstr))
11465                     CvROOT(dstr) = OpREFCNT_inc(CvROOT(dstr));
11466                 OP_REFCNT_UNLOCK;
11467                 if (CvCONST(dstr) && CvISXSUB(dstr)) {
11468                     CvXSUBANY(dstr).any_ptr =
11469                         sv_dup_inc((const SV *)CvXSUBANY(dstr).any_ptr, param);
11470                 }
11471                 /* don't dup if copying back - CvGV isn't refcounted, so the
11472                  * duped GV may never be freed. A bit of a hack! DAPM */
11473                 SvANY(MUTABLE_CV(dstr))->xcv_gv =
11474                     CvCVGV_RC(dstr)
11475                     ? gv_dup_inc(CvGV(sstr), param)
11476                     : (param->flags & CLONEf_JOIN_IN)
11477                         ? NULL
11478                         : gv_dup(CvGV(sstr), param);
11479
11480                 CvPADLIST(dstr) = padlist_dup(CvPADLIST(sstr), param);
11481                 CvOUTSIDE(dstr) =
11482                     CvWEAKOUTSIDE(sstr)
11483                     ? cv_dup(    CvOUTSIDE(dstr), param)
11484                     : cv_dup_inc(CvOUTSIDE(dstr), param);
11485                 if (!CvISXSUB(dstr))
11486                     CvFILE(dstr) = SAVEPV(CvFILE(dstr));
11487                 break;
11488             }
11489         }
11490     }
11491
11492     if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
11493         ++PL_sv_objcount;
11494
11495     return dstr;
11496  }
11497
11498 SV *
11499 Perl_sv_dup_inc(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
11500 {
11501     PERL_ARGS_ASSERT_SV_DUP_INC;
11502     return sstr ? SvREFCNT_inc(sv_dup_common(sstr, param)) : NULL;
11503 }
11504
11505 SV *
11506 Perl_sv_dup(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
11507 {
11508     SV *dstr = sstr ? sv_dup_common(sstr, param) : NULL;
11509     PERL_ARGS_ASSERT_SV_DUP;
11510
11511     /* Track every SV that (at least initially) had a reference count of 0.
11512        We need to do this by holding an actual reference to it in this array.
11513        If we attempt to cheat, turn AvREAL_off(), and store only pointers
11514        (akin to the stashes hash, and the perl stack), we come unstuck if
11515        a weak reference (or other SV legitimately SvREFCNT() == 0 for this
11516        thread) is manipulated in a CLONE method, because CLONE runs before the
11517        unreferenced array is walked to find SVs still with SvREFCNT() == 0
11518        (and fix things up by giving each a reference via the temps stack).
11519        Instead, during CLONE, if the 0-referenced SV has SvREFCNT_inc() and
11520        then SvREFCNT_dec(), it will be cleaned up (and added to the free list)
11521        before the walk of unreferenced happens and a reference to that is SV
11522        added to the temps stack. At which point we have the same SV considered
11523        to be in use, and free to be re-used. Not good.
11524     */
11525     if (dstr && !(param->flags & CLONEf_COPY_STACKS) && !SvREFCNT(dstr)) {
11526         assert(param->unreferenced);
11527         av_push(param->unreferenced, SvREFCNT_inc(dstr));
11528     }
11529
11530     return dstr;
11531 }
11532
11533 /* duplicate a context */
11534
11535 PERL_CONTEXT *
11536 Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
11537 {
11538     PERL_CONTEXT *ncxs;
11539
11540     PERL_ARGS_ASSERT_CX_DUP;
11541
11542     if (!cxs)
11543         return (PERL_CONTEXT*)NULL;
11544
11545     /* look for it in the table first */
11546     ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
11547     if (ncxs)
11548         return ncxs;
11549
11550     /* create anew and remember what it is */
11551     Newx(ncxs, max + 1, PERL_CONTEXT);
11552     ptr_table_store(PL_ptr_table, cxs, ncxs);
11553     Copy(cxs, ncxs, max + 1, PERL_CONTEXT);
11554
11555     while (ix >= 0) {
11556         PERL_CONTEXT * const ncx = &ncxs[ix];
11557         if (CxTYPE(ncx) == CXt_SUBST) {
11558             Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
11559         }
11560         else {
11561             switch (CxTYPE(ncx)) {
11562             case CXt_SUB:
11563                 ncx->blk_sub.cv         = (ncx->blk_sub.olddepth == 0
11564                                            ? cv_dup_inc(ncx->blk_sub.cv, param)
11565                                            : cv_dup(ncx->blk_sub.cv,param));
11566                 ncx->blk_sub.argarray   = (CxHASARGS(ncx)
11567                                            ? av_dup_inc(ncx->blk_sub.argarray,
11568                                                         param)
11569                                            : NULL);
11570                 ncx->blk_sub.savearray  = av_dup_inc(ncx->blk_sub.savearray,
11571                                                      param);
11572                 ncx->blk_sub.oldcomppad = (PAD*)ptr_table_fetch(PL_ptr_table,
11573                                            ncx->blk_sub.oldcomppad);
11574                 break;
11575             case CXt_EVAL:
11576                 ncx->blk_eval.old_namesv = sv_dup_inc(ncx->blk_eval.old_namesv,
11577                                                       param);
11578                 ncx->blk_eval.cur_text  = sv_dup(ncx->blk_eval.cur_text, param);
11579                 break;
11580             case CXt_LOOP_LAZYSV:
11581                 ncx->blk_loop.state_u.lazysv.end
11582                     = sv_dup_inc(ncx->blk_loop.state_u.lazysv.end, param);
11583                 /* We are taking advantage of av_dup_inc and sv_dup_inc
11584                    actually being the same function, and order equivalance of
11585                    the two unions.
11586                    We can assert the later [but only at run time :-(]  */
11587                 assert ((void *) &ncx->blk_loop.state_u.ary.ary ==
11588                         (void *) &ncx->blk_loop.state_u.lazysv.cur);
11589             case CXt_LOOP_FOR:
11590                 ncx->blk_loop.state_u.ary.ary
11591                     = av_dup_inc(ncx->blk_loop.state_u.ary.ary, param);
11592             case CXt_LOOP_LAZYIV:
11593             case CXt_LOOP_PLAIN:
11594                 if (CxPADLOOP(ncx)) {
11595                     ncx->blk_loop.oldcomppad
11596                         = (PAD*)ptr_table_fetch(PL_ptr_table,
11597                                                 ncx->blk_loop.oldcomppad);
11598                 } else {
11599                     ncx->blk_loop.oldcomppad
11600                         = (PAD*)gv_dup((const GV *)ncx->blk_loop.oldcomppad,
11601                                        param);
11602                 }
11603                 break;
11604             case CXt_FORMAT:
11605                 ncx->blk_format.cv      = cv_dup(ncx->blk_format.cv, param);
11606                 ncx->blk_format.gv      = gv_dup(ncx->blk_format.gv, param);
11607                 ncx->blk_format.dfoutgv = gv_dup_inc(ncx->blk_format.dfoutgv,
11608                                                      param);
11609                 break;
11610             case CXt_BLOCK:
11611             case CXt_NULL:
11612                 break;
11613             }
11614         }
11615         --ix;
11616     }
11617     return ncxs;
11618 }
11619
11620 /* duplicate a stack info structure */
11621
11622 PERL_SI *
11623 Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
11624 {
11625     PERL_SI *nsi;
11626
11627     PERL_ARGS_ASSERT_SI_DUP;
11628
11629     if (!si)
11630         return (PERL_SI*)NULL;
11631
11632     /* look for it in the table first */
11633     nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
11634     if (nsi)
11635         return nsi;
11636
11637     /* create anew and remember what it is */
11638     Newxz(nsi, 1, PERL_SI);
11639     ptr_table_store(PL_ptr_table, si, nsi);
11640
11641     nsi->si_stack       = av_dup_inc(si->si_stack, param);
11642     nsi->si_cxix        = si->si_cxix;
11643     nsi->si_cxmax       = si->si_cxmax;
11644     nsi->si_cxstack     = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
11645     nsi->si_type        = si->si_type;
11646     nsi->si_prev        = si_dup(si->si_prev, param);
11647     nsi->si_next        = si_dup(si->si_next, param);
11648     nsi->si_markoff     = si->si_markoff;
11649
11650     return nsi;
11651 }
11652
11653 #define POPINT(ss,ix)   ((ss)[--(ix)].any_i32)
11654 #define TOPINT(ss,ix)   ((ss)[ix].any_i32)
11655 #define POPLONG(ss,ix)  ((ss)[--(ix)].any_long)
11656 #define TOPLONG(ss,ix)  ((ss)[ix].any_long)
11657 #define POPIV(ss,ix)    ((ss)[--(ix)].any_iv)
11658 #define TOPIV(ss,ix)    ((ss)[ix].any_iv)
11659 #define POPUV(ss,ix)    ((ss)[--(ix)].any_uv)
11660 #define TOPUV(ss,ix)    ((ss)[ix].any_uv)
11661 #define POPBOOL(ss,ix)  ((ss)[--(ix)].any_bool)
11662 #define TOPBOOL(ss,ix)  ((ss)[ix].any_bool)
11663 #define POPPTR(ss,ix)   ((ss)[--(ix)].any_ptr)
11664 #define TOPPTR(ss,ix)   ((ss)[ix].any_ptr)
11665 #define POPDPTR(ss,ix)  ((ss)[--(ix)].any_dptr)
11666 #define TOPDPTR(ss,ix)  ((ss)[ix].any_dptr)
11667 #define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
11668 #define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
11669
11670 /* XXXXX todo */
11671 #define pv_dup_inc(p)   SAVEPV(p)
11672 #define pv_dup(p)       SAVEPV(p)
11673 #define svp_dup_inc(p,pp)       any_dup(p,pp)
11674
11675 /* map any object to the new equivent - either something in the
11676  * ptr table, or something in the interpreter structure
11677  */
11678
11679 void *
11680 Perl_any_dup(pTHX_ void *v, const PerlInterpreter *proto_perl)
11681 {
11682     void *ret;
11683
11684     PERL_ARGS_ASSERT_ANY_DUP;
11685
11686     if (!v)
11687         return (void*)NULL;
11688
11689     /* look for it in the table first */
11690     ret = ptr_table_fetch(PL_ptr_table, v);
11691     if (ret)
11692         return ret;
11693
11694     /* see if it is part of the interpreter structure */
11695     if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
11696         ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
11697     else {
11698         ret = v;
11699     }
11700
11701     return ret;
11702 }
11703
11704 /* duplicate the save stack */
11705
11706 ANY *
11707 Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
11708 {
11709     dVAR;
11710     ANY * const ss      = proto_perl->Isavestack;
11711     const I32 max       = proto_perl->Isavestack_max;
11712     I32 ix              = proto_perl->Isavestack_ix;
11713     ANY *nss;
11714     const SV *sv;
11715     const GV *gv;
11716     const AV *av;
11717     const HV *hv;
11718     void* ptr;
11719     int intval;
11720     long longval;
11721     GP *gp;
11722     IV iv;
11723     I32 i;
11724     char *c = NULL;
11725     void (*dptr) (void*);
11726     void (*dxptr) (pTHX_ void*);
11727
11728     PERL_ARGS_ASSERT_SS_DUP;
11729
11730     Newxz(nss, max, ANY);
11731
11732     while (ix > 0) {
11733         const UV uv = POPUV(ss,ix);
11734         const U8 type = (U8)uv & SAVE_MASK;
11735
11736         TOPUV(nss,ix) = uv;
11737         switch (type) {
11738         case SAVEt_CLEARSV:
11739             break;
11740         case SAVEt_HELEM:               /* hash element */
11741             sv = (const SV *)POPPTR(ss,ix);
11742             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11743             /* fall through */
11744         case SAVEt_ITEM:                        /* normal string */
11745         case SAVEt_SV:                          /* scalar reference */
11746             sv = (const SV *)POPPTR(ss,ix);
11747             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11748             /* fall through */
11749         case SAVEt_FREESV:
11750         case SAVEt_MORTALIZESV:
11751             sv = (const SV *)POPPTR(ss,ix);
11752             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11753             break;
11754         case SAVEt_SHARED_PVREF:                /* char* in shared space */
11755             c = (char*)POPPTR(ss,ix);
11756             TOPPTR(nss,ix) = savesharedpv(c);
11757             ptr = POPPTR(ss,ix);
11758             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11759             break;
11760         case SAVEt_GENERIC_SVREF:               /* generic sv */
11761         case SAVEt_SVREF:                       /* scalar reference */
11762             sv = (const SV *)POPPTR(ss,ix);
11763             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11764             ptr = POPPTR(ss,ix);
11765             TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
11766             break;
11767         case SAVEt_HV:                          /* hash reference */
11768         case SAVEt_AV:                          /* array reference */
11769             sv = (const SV *) POPPTR(ss,ix);
11770             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11771             /* fall through */
11772         case SAVEt_COMPPAD:
11773         case SAVEt_NSTAB:
11774             sv = (const SV *) POPPTR(ss,ix);
11775             TOPPTR(nss,ix) = sv_dup(sv, param);
11776             break;
11777         case SAVEt_INT:                         /* int reference */
11778             ptr = POPPTR(ss,ix);
11779             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11780             intval = (int)POPINT(ss,ix);
11781             TOPINT(nss,ix) = intval;
11782             break;
11783         case SAVEt_LONG:                        /* long reference */
11784             ptr = POPPTR(ss,ix);
11785             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11786             longval = (long)POPLONG(ss,ix);
11787             TOPLONG(nss,ix) = longval;
11788             break;
11789         case SAVEt_I32:                         /* I32 reference */
11790         case SAVEt_COP_ARYBASE:                 /* call CopARYBASE_set */
11791             ptr = POPPTR(ss,ix);
11792             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11793             i = POPINT(ss,ix);
11794             TOPINT(nss,ix) = i;
11795             break;
11796         case SAVEt_IV:                          /* IV reference */
11797             ptr = POPPTR(ss,ix);
11798             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11799             iv = POPIV(ss,ix);
11800             TOPIV(nss,ix) = iv;
11801             break;
11802         case SAVEt_HPTR:                        /* HV* reference */
11803         case SAVEt_APTR:                        /* AV* reference */
11804         case SAVEt_SPTR:                        /* SV* reference */
11805             ptr = POPPTR(ss,ix);
11806             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11807             sv = (const SV *)POPPTR(ss,ix);
11808             TOPPTR(nss,ix) = sv_dup(sv, param);
11809             break;
11810         case SAVEt_VPTR:                        /* random* reference */
11811             ptr = POPPTR(ss,ix);
11812             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11813             /* Fall through */
11814         case SAVEt_INT_SMALL:
11815         case SAVEt_I32_SMALL:
11816         case SAVEt_I16:                         /* I16 reference */
11817         case SAVEt_I8:                          /* I8 reference */
11818         case SAVEt_BOOL:
11819             ptr = POPPTR(ss,ix);
11820             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11821             break;
11822         case SAVEt_GENERIC_PVREF:               /* generic char* */
11823         case SAVEt_PPTR:                        /* char* reference */
11824             ptr = POPPTR(ss,ix);
11825             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11826             c = (char*)POPPTR(ss,ix);
11827             TOPPTR(nss,ix) = pv_dup(c);
11828             break;
11829         case SAVEt_GP:                          /* scalar reference */
11830             gv = (const GV *)POPPTR(ss,ix);
11831             TOPPTR(nss,ix) = gv_dup_inc(gv, param);
11832             gp = (GP*)POPPTR(ss,ix);
11833             TOPPTR(nss,ix) = gp = gp_dup(gp, param);
11834             (void)GpREFCNT_inc(gp);
11835             i = POPINT(ss,ix);
11836             TOPINT(nss,ix) = i;
11837             break;
11838         case SAVEt_FREEOP:
11839             ptr = POPPTR(ss,ix);
11840             if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
11841                 /* these are assumed to be refcounted properly */
11842                 OP *o;
11843                 switch (((OP*)ptr)->op_type) {
11844                 case OP_LEAVESUB:
11845                 case OP_LEAVESUBLV:
11846                 case OP_LEAVEEVAL:
11847                 case OP_LEAVE:
11848                 case OP_SCOPE:
11849                 case OP_LEAVEWRITE:
11850                     TOPPTR(nss,ix) = ptr;
11851                     o = (OP*)ptr;
11852                     OP_REFCNT_LOCK;
11853                     (void) OpREFCNT_inc(o);
11854                     OP_REFCNT_UNLOCK;
11855                     break;
11856                 default:
11857                     TOPPTR(nss,ix) = NULL;
11858                     break;
11859                 }
11860             }
11861             else
11862                 TOPPTR(nss,ix) = NULL;
11863             break;
11864         case SAVEt_DELETE:
11865             hv = (const HV *)POPPTR(ss,ix);
11866             TOPPTR(nss,ix) = hv_dup_inc(hv, param);
11867             i = POPINT(ss,ix);
11868             TOPINT(nss,ix) = i;
11869             /* Fall through */
11870         case SAVEt_FREEPV:
11871             c = (char*)POPPTR(ss,ix);
11872             TOPPTR(nss,ix) = pv_dup_inc(c);
11873             break;
11874         case SAVEt_STACK_POS:           /* Position on Perl stack */
11875             i = POPINT(ss,ix);
11876             TOPINT(nss,ix) = i;
11877             break;
11878         case SAVEt_DESTRUCTOR:
11879             ptr = POPPTR(ss,ix);
11880             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);  /* XXX quite arbitrary */
11881             dptr = POPDPTR(ss,ix);
11882             TOPDPTR(nss,ix) = DPTR2FPTR(void (*)(void*),
11883                                         any_dup(FPTR2DPTR(void *, dptr),
11884                                                 proto_perl));
11885             break;
11886         case SAVEt_DESTRUCTOR_X:
11887             ptr = POPPTR(ss,ix);
11888             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);  /* XXX quite arbitrary */
11889             dxptr = POPDXPTR(ss,ix);
11890             TOPDXPTR(nss,ix) = DPTR2FPTR(void (*)(pTHX_ void*),
11891                                          any_dup(FPTR2DPTR(void *, dxptr),
11892                                                  proto_perl));
11893             break;
11894         case SAVEt_REGCONTEXT:
11895         case SAVEt_ALLOC:
11896             ix -= uv >> SAVE_TIGHT_SHIFT;
11897             break;
11898         case SAVEt_AELEM:               /* array element */
11899             sv = (const SV *)POPPTR(ss,ix);
11900             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11901             i = POPINT(ss,ix);
11902             TOPINT(nss,ix) = i;
11903             av = (const AV *)POPPTR(ss,ix);
11904             TOPPTR(nss,ix) = av_dup_inc(av, param);
11905             break;
11906         case SAVEt_OP:
11907             ptr = POPPTR(ss,ix);
11908             TOPPTR(nss,ix) = ptr;
11909             break;
11910         case SAVEt_HINTS:
11911             ptr = POPPTR(ss,ix);
11912             if (ptr) {
11913                 HINTS_REFCNT_LOCK;
11914                 ((struct refcounted_he *)ptr)->refcounted_he_refcnt++;
11915                 HINTS_REFCNT_UNLOCK;
11916             }
11917             TOPPTR(nss,ix) = ptr;
11918             i = POPINT(ss,ix);
11919             TOPINT(nss,ix) = i;
11920             if (i & HINT_LOCALIZE_HH) {
11921                 hv = (const HV *)POPPTR(ss,ix);
11922                 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
11923             }
11924             break;
11925         case SAVEt_PADSV_AND_MORTALIZE:
11926             longval = (long)POPLONG(ss,ix);
11927             TOPLONG(nss,ix) = longval;
11928             ptr = POPPTR(ss,ix);
11929             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11930             sv = (const SV *)POPPTR(ss,ix);
11931             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11932             break;
11933         case SAVEt_SET_SVFLAGS:
11934             i = POPINT(ss,ix);
11935             TOPINT(nss,ix) = i;
11936             i = POPINT(ss,ix);
11937             TOPINT(nss,ix) = i;
11938             sv = (const SV *)POPPTR(ss,ix);
11939             TOPPTR(nss,ix) = sv_dup(sv, param);
11940             break;
11941         case SAVEt_RE_STATE:
11942             {
11943                 const struct re_save_state *const old_state
11944                     = (struct re_save_state *)
11945                     (ss + ix - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
11946                 struct re_save_state *const new_state
11947                     = (struct re_save_state *)
11948                     (nss + ix - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
11949
11950                 Copy(old_state, new_state, 1, struct re_save_state);
11951                 ix -= SAVESTACK_ALLOC_FOR_RE_SAVE_STATE;
11952
11953                 new_state->re_state_bostr
11954                     = pv_dup(old_state->re_state_bostr);
11955                 new_state->re_state_reginput
11956                     = pv_dup(old_state->re_state_reginput);
11957                 new_state->re_state_regeol
11958                     = pv_dup(old_state->re_state_regeol);
11959                 new_state->re_state_regoffs
11960                     = (regexp_paren_pair*)
11961                         any_dup(old_state->re_state_regoffs, proto_perl);
11962                 new_state->re_state_reglastparen
11963                     = (U32*) any_dup(old_state->re_state_reglastparen, 
11964                               proto_perl);
11965                 new_state->re_state_reglastcloseparen
11966                     = (U32*)any_dup(old_state->re_state_reglastcloseparen,
11967                               proto_perl);
11968                 /* XXX This just has to be broken. The old save_re_context
11969                    code did SAVEGENERICPV(PL_reg_start_tmp);
11970                    PL_reg_start_tmp is char **.
11971                    Look above to what the dup code does for
11972                    SAVEt_GENERIC_PVREF
11973                    It can never have worked.
11974                    So this is merely a faithful copy of the exiting bug:  */
11975                 new_state->re_state_reg_start_tmp
11976                     = (char **) pv_dup((char *)
11977                                       old_state->re_state_reg_start_tmp);
11978                 /* I assume that it only ever "worked" because no-one called
11979                    (pseudo)fork while the regexp engine had re-entered itself.
11980                 */
11981 #ifdef PERL_OLD_COPY_ON_WRITE
11982                 new_state->re_state_nrs
11983                     = sv_dup(old_state->re_state_nrs, param);
11984 #endif
11985                 new_state->re_state_reg_magic
11986                     = (MAGIC*) any_dup(old_state->re_state_reg_magic, 
11987                                proto_perl);
11988                 new_state->re_state_reg_oldcurpm
11989                     = (PMOP*) any_dup(old_state->re_state_reg_oldcurpm, 
11990                               proto_perl);
11991                 new_state->re_state_reg_curpm
11992                     = (PMOP*)  any_dup(old_state->re_state_reg_curpm, 
11993                                proto_perl);
11994                 new_state->re_state_reg_oldsaved
11995                     = pv_dup(old_state->re_state_reg_oldsaved);
11996                 new_state->re_state_reg_poscache
11997                     = pv_dup(old_state->re_state_reg_poscache);
11998                 new_state->re_state_reg_starttry
11999                     = pv_dup(old_state->re_state_reg_starttry);
12000                 break;
12001             }
12002         case SAVEt_COMPILE_WARNINGS:
12003             ptr = POPPTR(ss,ix);
12004             TOPPTR(nss,ix) = DUP_WARNINGS((STRLEN*)ptr);
12005             break;
12006         case SAVEt_PARSER:
12007             ptr = POPPTR(ss,ix);
12008             TOPPTR(nss,ix) = parser_dup((const yy_parser*)ptr, param);
12009             break;
12010         default:
12011             Perl_croak(aTHX_
12012                        "panic: ss_dup inconsistency (%"IVdf")", (IV) type);
12013         }
12014     }
12015
12016     return nss;
12017 }
12018
12019
12020 /* if sv is a stash, call $class->CLONE_SKIP(), and set the SVphv_CLONEABLE
12021  * flag to the result. This is done for each stash before cloning starts,
12022  * so we know which stashes want their objects cloned */
12023
12024 static void
12025 do_mark_cloneable_stash(pTHX_ SV *const sv)
12026 {
12027     const HEK * const hvname = HvNAME_HEK((const HV *)sv);
12028     if (hvname) {
12029         GV* const cloner = gv_fetchmethod_autoload(MUTABLE_HV(sv), "CLONE_SKIP", 0);
12030         SvFLAGS(sv) |= SVphv_CLONEABLE; /* clone objects by default */
12031         if (cloner && GvCV(cloner)) {
12032             dSP;
12033             UV status;
12034
12035             ENTER;
12036             SAVETMPS;
12037             PUSHMARK(SP);
12038             mXPUSHs(newSVhek(hvname));
12039             PUTBACK;
12040             call_sv(MUTABLE_SV(GvCV(cloner)), G_SCALAR);
12041             SPAGAIN;
12042             status = POPu;
12043             PUTBACK;
12044             FREETMPS;
12045             LEAVE;
12046             if (status)
12047                 SvFLAGS(sv) &= ~SVphv_CLONEABLE;
12048         }
12049     }
12050 }
12051
12052
12053
12054 /*
12055 =for apidoc perl_clone
12056
12057 Create and return a new interpreter by cloning the current one.
12058
12059 perl_clone takes these flags as parameters:
12060
12061 CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
12062 without it we only clone the data and zero the stacks,
12063 with it we copy the stacks and the new perl interpreter is
12064 ready to run at the exact same point as the previous one.
12065 The pseudo-fork code uses COPY_STACKS while the
12066 threads->create doesn't.
12067
12068 CLONEf_KEEP_PTR_TABLE
12069 perl_clone keeps a ptr_table with the pointer of the old
12070 variable as a key and the new variable as a value,
12071 this allows it to check if something has been cloned and not
12072 clone it again but rather just use the value and increase the
12073 refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
12074 the ptr_table using the function
12075 C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
12076 reason to keep it around is if you want to dup some of your own
12077 variable who are outside the graph perl scans, example of this
12078 code is in threads.xs create
12079
12080 CLONEf_CLONE_HOST
12081 This is a win32 thing, it is ignored on unix, it tells perls
12082 win32host code (which is c++) to clone itself, this is needed on
12083 win32 if you want to run two threads at the same time,
12084 if you just want to do some stuff in a separate perl interpreter
12085 and then throw it away and return to the original one,
12086 you don't need to do anything.
12087
12088 =cut
12089 */
12090
12091 /* XXX the above needs expanding by someone who actually understands it ! */
12092 EXTERN_C PerlInterpreter *
12093 perl_clone_host(PerlInterpreter* proto_perl, UV flags);
12094
12095 PerlInterpreter *
12096 perl_clone(PerlInterpreter *proto_perl, UV flags)
12097 {
12098    dVAR;
12099 #ifdef PERL_IMPLICIT_SYS
12100
12101     PERL_ARGS_ASSERT_PERL_CLONE;
12102
12103    /* perlhost.h so we need to call into it
12104    to clone the host, CPerlHost should have a c interface, sky */
12105
12106    if (flags & CLONEf_CLONE_HOST) {
12107        return perl_clone_host(proto_perl,flags);
12108    }
12109    return perl_clone_using(proto_perl, flags,
12110                             proto_perl->IMem,
12111                             proto_perl->IMemShared,
12112                             proto_perl->IMemParse,
12113                             proto_perl->IEnv,
12114                             proto_perl->IStdIO,
12115                             proto_perl->ILIO,
12116                             proto_perl->IDir,
12117                             proto_perl->ISock,
12118                             proto_perl->IProc);
12119 }
12120
12121 PerlInterpreter *
12122 perl_clone_using(PerlInterpreter *proto_perl, UV flags,
12123                  struct IPerlMem* ipM, struct IPerlMem* ipMS,
12124                  struct IPerlMem* ipMP, struct IPerlEnv* ipE,
12125                  struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
12126                  struct IPerlDir* ipD, struct IPerlSock* ipS,
12127                  struct IPerlProc* ipP)
12128 {
12129     /* XXX many of the string copies here can be optimized if they're
12130      * constants; they need to be allocated as common memory and just
12131      * their pointers copied. */
12132
12133     IV i;
12134     CLONE_PARAMS clone_params;
12135     CLONE_PARAMS* const param = &clone_params;
12136
12137     PerlInterpreter * const my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
12138
12139     PERL_ARGS_ASSERT_PERL_CLONE_USING;
12140 #else           /* !PERL_IMPLICIT_SYS */
12141     IV i;
12142     CLONE_PARAMS clone_params;
12143     CLONE_PARAMS* param = &clone_params;
12144     PerlInterpreter * const my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
12145
12146     PERL_ARGS_ASSERT_PERL_CLONE;
12147 #endif          /* PERL_IMPLICIT_SYS */
12148
12149     /* for each stash, determine whether its objects should be cloned */
12150     S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
12151     PERL_SET_THX(my_perl);
12152
12153 #ifdef DEBUGGING
12154     PoisonNew(my_perl, 1, PerlInterpreter);
12155     PL_op = NULL;
12156     PL_curcop = NULL;
12157     PL_markstack = 0;
12158     PL_scopestack = 0;
12159     PL_scopestack_name = 0;
12160     PL_savestack = 0;
12161     PL_savestack_ix = 0;
12162     PL_savestack_max = -1;
12163     PL_sig_pending = 0;
12164     PL_parser = NULL;
12165     Zero(&PL_debug_pad, 1, struct perl_debug_pad);
12166 #  ifdef DEBUG_LEAKING_SCALARS
12167     PL_sv_serial = (((U32)my_perl >> 2) & 0xfff) * 1000000;
12168 #  endif
12169 #else   /* !DEBUGGING */
12170     Zero(my_perl, 1, PerlInterpreter);
12171 #endif  /* DEBUGGING */
12172
12173 #ifdef PERL_IMPLICIT_SYS
12174     /* host pointers */
12175     PL_Mem              = ipM;
12176     PL_MemShared        = ipMS;
12177     PL_MemParse         = ipMP;
12178     PL_Env              = ipE;
12179     PL_StdIO            = ipStd;
12180     PL_LIO              = ipLIO;
12181     PL_Dir              = ipD;
12182     PL_Sock             = ipS;
12183     PL_Proc             = ipP;
12184 #endif          /* PERL_IMPLICIT_SYS */
12185
12186     param->flags = flags;
12187     /* Nothing in the core code uses this, but we make it available to
12188        extensions (using mg_dup).  */
12189     param->proto_perl = proto_perl;
12190     /* Likely nothing will use this, but it is initialised to be consistent
12191        with Perl_clone_params_new().  */
12192     param->proto_perl = my_perl;
12193     param->unreferenced = NULL;
12194
12195     INIT_TRACK_MEMPOOL(my_perl->Imemory_debug_header, my_perl);
12196
12197     PL_body_arenas = NULL;
12198     Zero(&PL_body_roots, 1, PL_body_roots);
12199     
12200     PL_nice_chunk       = NULL;
12201     PL_nice_chunk_size  = 0;
12202     PL_sv_count         = 0;
12203     PL_sv_objcount      = 0;
12204     PL_sv_root          = NULL;
12205     PL_sv_arenaroot     = NULL;
12206
12207     PL_debug            = proto_perl->Idebug;
12208
12209     PL_hash_seed        = proto_perl->Ihash_seed;
12210     PL_rehash_seed      = proto_perl->Irehash_seed;
12211
12212 #ifdef USE_REENTRANT_API
12213     /* XXX: things like -Dm will segfault here in perlio, but doing
12214      *  PERL_SET_CONTEXT(proto_perl);
12215      * breaks too many other things
12216      */
12217     Perl_reentrant_init(aTHX);
12218 #endif
12219
12220     /* create SV map for pointer relocation */
12221     PL_ptr_table = ptr_table_new();
12222
12223     /* initialize these special pointers as early as possible */
12224     SvANY(&PL_sv_undef)         = NULL;
12225     SvREFCNT(&PL_sv_undef)      = (~(U32)0)/2;
12226     SvFLAGS(&PL_sv_undef)       = SVf_READONLY|SVt_NULL;
12227     ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
12228
12229     SvANY(&PL_sv_no)            = new_XPVNV();
12230     SvREFCNT(&PL_sv_no)         = (~(U32)0)/2;
12231     SvFLAGS(&PL_sv_no)          = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
12232                                   |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
12233     SvPV_set(&PL_sv_no, savepvn(PL_No, 0));
12234     SvCUR_set(&PL_sv_no, 0);
12235     SvLEN_set(&PL_sv_no, 1);
12236     SvIV_set(&PL_sv_no, 0);
12237     SvNV_set(&PL_sv_no, 0);
12238     ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
12239
12240     SvANY(&PL_sv_yes)           = new_XPVNV();
12241     SvREFCNT(&PL_sv_yes)        = (~(U32)0)/2;
12242     SvFLAGS(&PL_sv_yes)         = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
12243                                   |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
12244     SvPV_set(&PL_sv_yes, savepvn(PL_Yes, 1));
12245     SvCUR_set(&PL_sv_yes, 1);
12246     SvLEN_set(&PL_sv_yes, 2);
12247     SvIV_set(&PL_sv_yes, 1);
12248     SvNV_set(&PL_sv_yes, 1);
12249     ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
12250
12251     /* dbargs array probably holds garbage */
12252     PL_dbargs           = NULL;
12253
12254     /* create (a non-shared!) shared string table */
12255     PL_strtab           = newHV();
12256     HvSHAREKEYS_off(PL_strtab);
12257     hv_ksplit(PL_strtab, HvTOTALKEYS(proto_perl->Istrtab));
12258     ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
12259
12260     PL_compiling = proto_perl->Icompiling;
12261
12262     /* These two PVs will be free'd special way so must set them same way op.c does */
12263     PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
12264     ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
12265
12266     PL_compiling.cop_file    = savesharedpv(PL_compiling.cop_file);
12267     ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
12268
12269     ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
12270     PL_compiling.cop_warnings = DUP_WARNINGS(PL_compiling.cop_warnings);
12271     if (PL_compiling.cop_hints_hash) {
12272         HINTS_REFCNT_LOCK;
12273         PL_compiling.cop_hints_hash->refcounted_he_refcnt++;
12274         HINTS_REFCNT_UNLOCK;
12275     }
12276     PL_curcop           = (COP*)any_dup(proto_perl->Icurcop, proto_perl);
12277 #ifdef PERL_DEBUG_READONLY_OPS
12278     PL_slabs = NULL;
12279     PL_slab_count = 0;
12280 #endif
12281
12282     /* pseudo environmental stuff */
12283     PL_origargc         = proto_perl->Iorigargc;
12284     PL_origargv         = proto_perl->Iorigargv;
12285
12286     param->stashes      = newAV();  /* Setup array of objects to call clone on */
12287     /* This makes no difference to the implementation, as it always pushes
12288        and shifts pointers to other SVs without changing their reference
12289        count, with the array becoming empty before it is freed. However, it
12290        makes it conceptually clear what is going on, and will avoid some
12291        work inside av.c, filling slots between AvFILL() and AvMAX() with
12292        &PL_sv_undef, and SvREFCNT_dec()ing those.  */
12293     AvREAL_off(param->stashes);
12294
12295     if (!(flags & CLONEf_COPY_STACKS)) {
12296         param->unreferenced = newAV();
12297     }
12298
12299     /* Set tainting stuff before PerlIO_debug can possibly get called */
12300     PL_tainting         = proto_perl->Itainting;
12301     PL_taint_warn       = proto_perl->Itaint_warn;
12302
12303 #ifdef PERLIO_LAYERS
12304     /* Clone PerlIO tables as soon as we can handle general xx_dup() */
12305     PerlIO_clone(aTHX_ proto_perl, param);
12306 #endif
12307
12308     PL_envgv            = gv_dup(proto_perl->Ienvgv, param);
12309     PL_incgv            = gv_dup(proto_perl->Iincgv, param);
12310     PL_hintgv           = gv_dup(proto_perl->Ihintgv, param);
12311     PL_origfilename     = SAVEPV(proto_perl->Iorigfilename);
12312     PL_diehook          = sv_dup_inc(proto_perl->Idiehook, param);
12313     PL_warnhook         = sv_dup_inc(proto_perl->Iwarnhook, param);
12314
12315     /* switches */
12316     PL_minus_c          = proto_perl->Iminus_c;
12317     PL_patchlevel       = sv_dup_inc(proto_perl->Ipatchlevel, param);
12318     PL_apiversion       = sv_dup_inc(proto_perl->Iapiversion, param);
12319     PL_localpatches     = proto_perl->Ilocalpatches;
12320     PL_splitstr         = proto_perl->Isplitstr;
12321     PL_minus_n          = proto_perl->Iminus_n;
12322     PL_minus_p          = proto_perl->Iminus_p;
12323     PL_minus_l          = proto_perl->Iminus_l;
12324     PL_minus_a          = proto_perl->Iminus_a;
12325     PL_minus_E          = proto_perl->Iminus_E;
12326     PL_minus_F          = proto_perl->Iminus_F;
12327     PL_doswitches       = proto_perl->Idoswitches;
12328     PL_dowarn           = proto_perl->Idowarn;
12329     PL_doextract        = proto_perl->Idoextract;
12330     PL_sawampersand     = proto_perl->Isawampersand;
12331     PL_unsafe           = proto_perl->Iunsafe;
12332     PL_inplace          = SAVEPV(proto_perl->Iinplace);
12333     PL_e_script         = sv_dup_inc(proto_perl->Ie_script, param);
12334     PL_perldb           = proto_perl->Iperldb;
12335     PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
12336     PL_exit_flags       = proto_perl->Iexit_flags;
12337
12338     /* magical thingies */
12339     /* XXX time(&PL_basetime) when asked for? */
12340     PL_basetime         = proto_perl->Ibasetime;
12341     PL_formfeed         = sv_dup(proto_perl->Iformfeed, param);
12342
12343     PL_maxsysfd         = proto_perl->Imaxsysfd;
12344     PL_statusvalue      = proto_perl->Istatusvalue;
12345 #ifdef VMS
12346     PL_statusvalue_vms  = proto_perl->Istatusvalue_vms;
12347 #else
12348     PL_statusvalue_posix = proto_perl->Istatusvalue_posix;
12349 #endif
12350     PL_encoding         = sv_dup(proto_perl->Iencoding, param);
12351
12352     sv_setpvs(PERL_DEBUG_PAD(0), "");   /* For regex debugging. */
12353     sv_setpvs(PERL_DEBUG_PAD(1), "");   /* ext/re needs these */
12354     sv_setpvs(PERL_DEBUG_PAD(2), "");   /* even without DEBUGGING. */
12355
12356    
12357     /* RE engine related */
12358     Zero(&PL_reg_state, 1, struct re_save_state);
12359     PL_reginterp_cnt    = 0;
12360     PL_regmatch_slab    = NULL;
12361     
12362     /* Clone the regex array */
12363     /* ORANGE FIXME for plugins, probably in the SV dup code.
12364        newSViv(PTR2IV(CALLREGDUPE(
12365        INT2PTR(REGEXP *, SvIVX(regex)), param))))
12366     */
12367     PL_regex_padav = av_dup_inc(proto_perl->Iregex_padav, param);
12368     PL_regex_pad = AvARRAY(PL_regex_padav);
12369
12370     /* shortcuts to various I/O objects */
12371     PL_ofsgv            = gv_dup(proto_perl->Iofsgv, param);
12372     PL_stdingv          = gv_dup(proto_perl->Istdingv, param);
12373     PL_stderrgv         = gv_dup(proto_perl->Istderrgv, param);
12374     PL_defgv            = gv_dup(proto_perl->Idefgv, param);
12375     PL_argvgv           = gv_dup(proto_perl->Iargvgv, param);
12376     PL_argvoutgv        = gv_dup(proto_perl->Iargvoutgv, param);
12377     PL_argvout_stack    = av_dup_inc(proto_perl->Iargvout_stack, param);
12378
12379     /* shortcuts to regexp stuff */
12380     PL_replgv           = gv_dup(proto_perl->Ireplgv, param);
12381
12382     /* shortcuts to misc objects */
12383     PL_errgv            = gv_dup(proto_perl->Ierrgv, param);
12384
12385     /* shortcuts to debugging objects */
12386     PL_DBgv             = gv_dup(proto_perl->IDBgv, param);
12387     PL_DBline           = gv_dup(proto_perl->IDBline, param);
12388     PL_DBsub            = gv_dup(proto_perl->IDBsub, param);
12389     PL_DBsingle         = sv_dup(proto_perl->IDBsingle, param);
12390     PL_DBtrace          = sv_dup(proto_perl->IDBtrace, param);
12391     PL_DBsignal         = sv_dup(proto_perl->IDBsignal, param);
12392
12393     /* symbol tables */
12394     PL_defstash         = hv_dup_inc(proto_perl->Idefstash, param);
12395     PL_curstash         = hv_dup(proto_perl->Icurstash, param);
12396     PL_debstash         = hv_dup(proto_perl->Idebstash, param);
12397     PL_globalstash      = hv_dup(proto_perl->Iglobalstash, param);
12398     PL_curstname        = sv_dup_inc(proto_perl->Icurstname, param);
12399
12400     PL_beginav          = av_dup_inc(proto_perl->Ibeginav, param);
12401     PL_beginav_save     = av_dup_inc(proto_perl->Ibeginav_save, param);
12402     PL_checkav_save     = av_dup_inc(proto_perl->Icheckav_save, param);
12403     PL_unitcheckav      = av_dup_inc(proto_perl->Iunitcheckav, param);
12404     PL_unitcheckav_save = av_dup_inc(proto_perl->Iunitcheckav_save, param);
12405     PL_endav            = av_dup_inc(proto_perl->Iendav, param);
12406     PL_checkav          = av_dup_inc(proto_perl->Icheckav, param);
12407     PL_initav           = av_dup_inc(proto_perl->Iinitav, param);
12408
12409     PL_sub_generation   = proto_perl->Isub_generation;
12410     PL_isarev           = hv_dup_inc(proto_perl->Iisarev, param);
12411
12412     /* funky return mechanisms */
12413     PL_forkprocess      = proto_perl->Iforkprocess;
12414
12415     /* subprocess state */
12416     PL_fdpid            = av_dup_inc(proto_perl->Ifdpid, param);
12417
12418     /* internal state */
12419     PL_maxo             = proto_perl->Imaxo;
12420     if (proto_perl->Iop_mask)
12421         PL_op_mask      = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
12422     else
12423         PL_op_mask      = NULL;
12424     /* PL_asserting        = proto_perl->Iasserting; */
12425
12426     /* current interpreter roots */
12427     PL_main_cv          = cv_dup_inc(proto_perl->Imain_cv, param);
12428     OP_REFCNT_LOCK;
12429     PL_main_root        = OpREFCNT_inc(proto_perl->Imain_root);
12430     OP_REFCNT_UNLOCK;
12431     PL_main_start       = proto_perl->Imain_start;
12432     PL_eval_root        = proto_perl->Ieval_root;
12433     PL_eval_start       = proto_perl->Ieval_start;
12434
12435     /* runtime control stuff */
12436     PL_curcopdb         = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
12437
12438     PL_filemode         = proto_perl->Ifilemode;
12439     PL_lastfd           = proto_perl->Ilastfd;
12440     PL_oldname          = proto_perl->Ioldname;         /* XXX not quite right */
12441     PL_Argv             = NULL;
12442     PL_Cmd              = NULL;
12443     PL_gensym           = proto_perl->Igensym;
12444     PL_preambleav       = av_dup_inc(proto_perl->Ipreambleav, param);
12445     PL_laststatval      = proto_perl->Ilaststatval;
12446     PL_laststype        = proto_perl->Ilaststype;
12447     PL_mess_sv          = NULL;
12448
12449     PL_ors_sv           = sv_dup_inc(proto_perl->Iors_sv, param);
12450
12451     /* interpreter atexit processing */
12452     PL_exitlistlen      = proto_perl->Iexitlistlen;
12453     if (PL_exitlistlen) {
12454         Newx(PL_exitlist, PL_exitlistlen, PerlExitListEntry);
12455         Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
12456     }
12457     else
12458         PL_exitlist     = (PerlExitListEntry*)NULL;
12459
12460     PL_my_cxt_size = proto_perl->Imy_cxt_size;
12461     if (PL_my_cxt_size) {
12462         Newx(PL_my_cxt_list, PL_my_cxt_size, void *);
12463         Copy(proto_perl->Imy_cxt_list, PL_my_cxt_list, PL_my_cxt_size, void *);
12464 #ifdef PERL_GLOBAL_STRUCT_PRIVATE
12465         Newx(PL_my_cxt_keys, PL_my_cxt_size, const char *);
12466         Copy(proto_perl->Imy_cxt_keys, PL_my_cxt_keys, PL_my_cxt_size, char *);
12467 #endif
12468     }
12469     else {
12470         PL_my_cxt_list  = (void**)NULL;
12471 #ifdef PERL_GLOBAL_STRUCT_PRIVATE
12472         PL_my_cxt_keys  = (const char**)NULL;
12473 #endif
12474     }
12475     PL_modglobal        = hv_dup_inc(proto_perl->Imodglobal, param);
12476     PL_custom_op_names  = hv_dup_inc(proto_perl->Icustom_op_names,param);
12477     PL_custom_op_descs  = hv_dup_inc(proto_perl->Icustom_op_descs,param);
12478
12479     PL_profiledata      = NULL;
12480
12481     PL_compcv                   = cv_dup(proto_perl->Icompcv, param);
12482
12483     PAD_CLONE_VARS(proto_perl, param);
12484
12485 #ifdef HAVE_INTERP_INTERN
12486     sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
12487 #endif
12488
12489     /* more statics moved here */
12490     PL_generation       = proto_perl->Igeneration;
12491     PL_DBcv             = cv_dup(proto_perl->IDBcv, param);
12492
12493     PL_in_clean_objs    = proto_perl->Iin_clean_objs;
12494     PL_in_clean_all     = proto_perl->Iin_clean_all;
12495
12496     PL_uid              = proto_perl->Iuid;
12497     PL_euid             = proto_perl->Ieuid;
12498     PL_gid              = proto_perl->Igid;
12499     PL_egid             = proto_perl->Iegid;
12500     PL_nomemok          = proto_perl->Inomemok;
12501     PL_an               = proto_perl->Ian;
12502     PL_evalseq          = proto_perl->Ievalseq;
12503     PL_origenviron      = proto_perl->Iorigenviron;     /* XXX not quite right */
12504     PL_origalen         = proto_perl->Iorigalen;
12505 #ifdef PERL_USES_PL_PIDSTATUS
12506     PL_pidstatus        = newHV();                      /* XXX flag for cloning? */
12507 #endif
12508     PL_osname           = SAVEPV(proto_perl->Iosname);
12509     PL_sighandlerp      = proto_perl->Isighandlerp;
12510
12511     PL_runops           = proto_perl->Irunops;
12512
12513     PL_parser           = parser_dup(proto_perl->Iparser, param);
12514
12515     /* XXX this only works if the saved cop has already been cloned */
12516     if (proto_perl->Iparser) {
12517         PL_parser->saved_curcop = (COP*)any_dup(
12518                                     proto_perl->Iparser->saved_curcop,
12519                                     proto_perl);
12520     }
12521
12522     PL_subline          = proto_perl->Isubline;
12523     PL_subname          = sv_dup_inc(proto_perl->Isubname, param);
12524
12525 #ifdef FCRYPT
12526     PL_cryptseen        = proto_perl->Icryptseen;
12527 #endif
12528
12529     PL_hints            = proto_perl->Ihints;
12530
12531     PL_amagic_generation        = proto_perl->Iamagic_generation;
12532
12533 #ifdef USE_LOCALE_COLLATE
12534     PL_collation_ix     = proto_perl->Icollation_ix;
12535     PL_collation_name   = SAVEPV(proto_perl->Icollation_name);
12536     PL_collation_standard       = proto_perl->Icollation_standard;
12537     PL_collxfrm_base    = proto_perl->Icollxfrm_base;
12538     PL_collxfrm_mult    = proto_perl->Icollxfrm_mult;
12539 #endif /* USE_LOCALE_COLLATE */
12540
12541 #ifdef USE_LOCALE_NUMERIC
12542     PL_numeric_name     = SAVEPV(proto_perl->Inumeric_name);
12543     PL_numeric_standard = proto_perl->Inumeric_standard;
12544     PL_numeric_local    = proto_perl->Inumeric_local;
12545     PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
12546 #endif /* !USE_LOCALE_NUMERIC */
12547
12548     /* utf8 character classes */
12549     PL_utf8_alnum       = sv_dup_inc(proto_perl->Iutf8_alnum, param);
12550     PL_utf8_ascii       = sv_dup_inc(proto_perl->Iutf8_ascii, param);
12551     PL_utf8_alpha       = sv_dup_inc(proto_perl->Iutf8_alpha, param);
12552     PL_utf8_space       = sv_dup_inc(proto_perl->Iutf8_space, param);
12553     PL_utf8_cntrl       = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
12554     PL_utf8_graph       = sv_dup_inc(proto_perl->Iutf8_graph, param);
12555     PL_utf8_digit       = sv_dup_inc(proto_perl->Iutf8_digit, param);
12556     PL_utf8_upper       = sv_dup_inc(proto_perl->Iutf8_upper, param);
12557     PL_utf8_lower       = sv_dup_inc(proto_perl->Iutf8_lower, param);
12558     PL_utf8_print       = sv_dup_inc(proto_perl->Iutf8_print, param);
12559     PL_utf8_punct       = sv_dup_inc(proto_perl->Iutf8_punct, param);
12560     PL_utf8_xdigit      = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
12561     PL_utf8_mark        = sv_dup_inc(proto_perl->Iutf8_mark, param);
12562     PL_utf8_X_begin     = sv_dup_inc(proto_perl->Iutf8_X_begin, param);
12563     PL_utf8_X_extend    = sv_dup_inc(proto_perl->Iutf8_X_extend, param);
12564     PL_utf8_X_prepend   = sv_dup_inc(proto_perl->Iutf8_X_prepend, param);
12565     PL_utf8_X_non_hangul        = sv_dup_inc(proto_perl->Iutf8_X_non_hangul, param);
12566     PL_utf8_X_L = sv_dup_inc(proto_perl->Iutf8_X_L, param);
12567     PL_utf8_X_LV        = sv_dup_inc(proto_perl->Iutf8_X_LV, param);
12568     PL_utf8_X_LVT       = sv_dup_inc(proto_perl->Iutf8_X_LVT, param);
12569     PL_utf8_X_T = sv_dup_inc(proto_perl->Iutf8_X_T, param);
12570     PL_utf8_X_V = sv_dup_inc(proto_perl->Iutf8_X_V, param);
12571     PL_utf8_X_LV_LVT_V  = sv_dup_inc(proto_perl->Iutf8_X_LV_LVT_V, param);
12572     PL_utf8_toupper     = sv_dup_inc(proto_perl->Iutf8_toupper, param);
12573     PL_utf8_totitle     = sv_dup_inc(proto_perl->Iutf8_totitle, param);
12574     PL_utf8_tolower     = sv_dup_inc(proto_perl->Iutf8_tolower, param);
12575     PL_utf8_tofold      = sv_dup_inc(proto_perl->Iutf8_tofold, param);
12576     PL_utf8_idstart     = sv_dup_inc(proto_perl->Iutf8_idstart, param);
12577     PL_utf8_idcont      = sv_dup_inc(proto_perl->Iutf8_idcont, param);
12578
12579     /* Did the locale setup indicate UTF-8? */
12580     PL_utf8locale       = proto_perl->Iutf8locale;
12581     /* Unicode features (see perlrun/-C) */
12582     PL_unicode          = proto_perl->Iunicode;
12583
12584     /* Pre-5.8 signals control */
12585     PL_signals          = proto_perl->Isignals;
12586
12587     /* times() ticks per second */
12588     PL_clocktick        = proto_perl->Iclocktick;
12589
12590     /* Recursion stopper for PerlIO_find_layer */
12591     PL_in_load_module   = proto_perl->Iin_load_module;
12592
12593     /* sort() routine */
12594     PL_sort_RealCmp     = proto_perl->Isort_RealCmp;
12595
12596     /* Not really needed/useful since the reenrant_retint is "volatile",
12597      * but do it for consistency's sake. */
12598     PL_reentrant_retint = proto_perl->Ireentrant_retint;
12599
12600     /* Hooks to shared SVs and locks. */
12601     PL_sharehook        = proto_perl->Isharehook;
12602     PL_lockhook         = proto_perl->Ilockhook;
12603     PL_unlockhook       = proto_perl->Iunlockhook;
12604     PL_threadhook       = proto_perl->Ithreadhook;
12605     PL_destroyhook      = proto_perl->Idestroyhook;
12606     PL_signalhook       = proto_perl->Isignalhook;
12607
12608 #ifdef THREADS_HAVE_PIDS
12609     PL_ppid             = proto_perl->Ippid;
12610 #endif
12611
12612     /* swatch cache */
12613     PL_last_swash_hv    = NULL; /* reinits on demand */
12614     PL_last_swash_klen  = 0;
12615     PL_last_swash_key[0]= '\0';
12616     PL_last_swash_tmps  = (U8*)NULL;
12617     PL_last_swash_slen  = 0;
12618
12619     PL_glob_index       = proto_perl->Iglob_index;
12620     PL_srand_called     = proto_perl->Isrand_called;
12621
12622     if (proto_perl->Ipsig_pend) {
12623         Newxz(PL_psig_pend, SIG_SIZE, int);
12624     }
12625     else {
12626         PL_psig_pend    = (int*)NULL;
12627     }
12628
12629     if (proto_perl->Ipsig_name) {
12630         Newx(PL_psig_name, 2 * SIG_SIZE, SV*);
12631         sv_dup_inc_multiple(proto_perl->Ipsig_name, PL_psig_name, 2 * SIG_SIZE,
12632                             param);
12633         PL_psig_ptr = PL_psig_name + SIG_SIZE;
12634     }
12635     else {
12636         PL_psig_ptr     = (SV**)NULL;
12637         PL_psig_name    = (SV**)NULL;
12638     }
12639
12640     /* intrpvar.h stuff */
12641
12642     if (flags & CLONEf_COPY_STACKS) {
12643         /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
12644         PL_tmps_ix              = proto_perl->Itmps_ix;
12645         PL_tmps_max             = proto_perl->Itmps_max;
12646         PL_tmps_floor           = proto_perl->Itmps_floor;
12647         Newx(PL_tmps_stack, PL_tmps_max, SV*);
12648         sv_dup_inc_multiple(proto_perl->Itmps_stack, PL_tmps_stack,
12649                             PL_tmps_ix+1, param);
12650
12651         /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
12652         i = proto_perl->Imarkstack_max - proto_perl->Imarkstack;
12653         Newxz(PL_markstack, i, I32);
12654         PL_markstack_max        = PL_markstack + (proto_perl->Imarkstack_max
12655                                                   - proto_perl->Imarkstack);
12656         PL_markstack_ptr        = PL_markstack + (proto_perl->Imarkstack_ptr
12657                                                   - proto_perl->Imarkstack);
12658         Copy(proto_perl->Imarkstack, PL_markstack,
12659              PL_markstack_ptr - PL_markstack + 1, I32);
12660
12661         /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
12662          * NOTE: unlike the others! */
12663         PL_scopestack_ix        = proto_perl->Iscopestack_ix;
12664         PL_scopestack_max       = proto_perl->Iscopestack_max;
12665         Newxz(PL_scopestack, PL_scopestack_max, I32);
12666         Copy(proto_perl->Iscopestack, PL_scopestack, PL_scopestack_ix, I32);
12667
12668 #ifdef DEBUGGING
12669         Newxz(PL_scopestack_name, PL_scopestack_max, const char *);
12670         Copy(proto_perl->Iscopestack_name, PL_scopestack_name, PL_scopestack_ix, const char *);
12671 #endif
12672         /* NOTE: si_dup() looks at PL_markstack */
12673         PL_curstackinfo         = si_dup(proto_perl->Icurstackinfo, param);
12674
12675         /* PL_curstack          = PL_curstackinfo->si_stack; */
12676         PL_curstack             = av_dup(proto_perl->Icurstack, param);
12677         PL_mainstack            = av_dup(proto_perl->Imainstack, param);
12678
12679         /* next PUSHs() etc. set *(PL_stack_sp+1) */
12680         PL_stack_base           = AvARRAY(PL_curstack);
12681         PL_stack_sp             = PL_stack_base + (proto_perl->Istack_sp
12682                                                    - proto_perl->Istack_base);
12683         PL_stack_max            = PL_stack_base + AvMAX(PL_curstack);
12684
12685         /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
12686          * NOTE: unlike the others! */
12687         PL_savestack_ix         = proto_perl->Isavestack_ix;
12688         PL_savestack_max        = proto_perl->Isavestack_max;
12689         /*Newxz(PL_savestack, PL_savestack_max, ANY);*/
12690         PL_savestack            = ss_dup(proto_perl, param);
12691     }
12692     else {
12693         init_stacks();
12694         ENTER;                  /* perl_destruct() wants to LEAVE; */
12695     }
12696
12697     PL_start_env        = proto_perl->Istart_env;       /* XXXXXX */
12698     PL_top_env          = &PL_start_env;
12699
12700     PL_op               = proto_perl->Iop;
12701
12702     PL_Sv               = NULL;
12703     PL_Xpv              = (XPV*)NULL;
12704     my_perl->Ina        = proto_perl->Ina;
12705
12706     PL_statbuf          = proto_perl->Istatbuf;
12707     PL_statcache        = proto_perl->Istatcache;
12708     PL_statgv           = gv_dup(proto_perl->Istatgv, param);
12709     PL_statname         = sv_dup_inc(proto_perl->Istatname, param);
12710 #ifdef HAS_TIMES
12711     PL_timesbuf         = proto_perl->Itimesbuf;
12712 #endif
12713
12714     PL_tainted          = proto_perl->Itainted;
12715     PL_curpm            = proto_perl->Icurpm;   /* XXX No PMOP ref count */
12716     PL_rs               = sv_dup_inc(proto_perl->Irs, param);
12717     PL_last_in_gv       = gv_dup(proto_perl->Ilast_in_gv, param);
12718     PL_defoutgv         = gv_dup_inc(proto_perl->Idefoutgv, param);
12719     PL_chopset          = proto_perl->Ichopset; /* XXX never deallocated */
12720     PL_toptarget        = sv_dup_inc(proto_perl->Itoptarget, param);
12721     PL_bodytarget       = sv_dup_inc(proto_perl->Ibodytarget, param);
12722     PL_formtarget       = sv_dup(proto_perl->Iformtarget, param);
12723
12724     PL_restartjmpenv    = proto_perl->Irestartjmpenv;
12725     PL_restartop        = proto_perl->Irestartop;
12726     PL_in_eval          = proto_perl->Iin_eval;
12727     PL_delaymagic       = proto_perl->Idelaymagic;
12728     PL_dirty            = proto_perl->Idirty;
12729     PL_localizing       = proto_perl->Ilocalizing;
12730
12731     PL_errors           = sv_dup_inc(proto_perl->Ierrors, param);
12732     PL_hv_fetch_ent_mh  = NULL;
12733     PL_modcount         = proto_perl->Imodcount;
12734     PL_lastgotoprobe    = NULL;
12735     PL_dumpindent       = proto_perl->Idumpindent;
12736
12737     PL_sortcop          = (OP*)any_dup(proto_perl->Isortcop, proto_perl);
12738     PL_sortstash        = hv_dup(proto_perl->Isortstash, param);
12739     PL_firstgv          = gv_dup(proto_perl->Ifirstgv, param);
12740     PL_secondgv         = gv_dup(proto_perl->Isecondgv, param);
12741     PL_efloatbuf        = NULL;         /* reinits on demand */
12742     PL_efloatsize       = 0;                    /* reinits on demand */
12743
12744     /* regex stuff */
12745
12746     PL_screamfirst      = NULL;
12747     PL_screamnext       = NULL;
12748     PL_maxscream        = -1;                   /* reinits on demand */
12749     PL_lastscream       = NULL;
12750
12751
12752     PL_regdummy         = proto_perl->Iregdummy;
12753     PL_colorset         = 0;            /* reinits PL_colors[] */
12754     /*PL_colors[6]      = {0,0,0,0,0,0};*/
12755
12756
12757
12758     /* Pluggable optimizer */
12759     PL_peepp            = proto_perl->Ipeepp;
12760     /* op_free() hook */
12761     PL_opfreehook       = proto_perl->Iopfreehook;
12762
12763     PL_stashcache       = newHV();
12764
12765     PL_watchaddr        = (char **) ptr_table_fetch(PL_ptr_table,
12766                                             proto_perl->Iwatchaddr);
12767     PL_watchok          = PL_watchaddr ? * PL_watchaddr : NULL;
12768     if (PL_debug && PL_watchaddr) {
12769         PerlIO_printf(Perl_debug_log,
12770           "WATCHING: %"UVxf" cloned as %"UVxf" with value %"UVxf"\n",
12771           PTR2UV(proto_perl->Iwatchaddr), PTR2UV(PL_watchaddr),
12772           PTR2UV(PL_watchok));
12773     }
12774
12775     PL_registered_mros  = hv_dup_inc(proto_perl->Iregistered_mros, param);
12776     PL_blockhooks       = av_dup_inc(proto_perl->Iblockhooks, param);
12777
12778     /* Call the ->CLONE method, if it exists, for each of the stashes
12779        identified by sv_dup() above.
12780     */
12781     while(av_len(param->stashes) != -1) {
12782         HV* const stash = MUTABLE_HV(av_shift(param->stashes));
12783         GV* const cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
12784         if (cloner && GvCV(cloner)) {
12785             dSP;
12786             ENTER;
12787             SAVETMPS;
12788             PUSHMARK(SP);
12789             mXPUSHs(newSVhek(HvNAME_HEK(stash)));
12790             PUTBACK;
12791             call_sv(MUTABLE_SV(GvCV(cloner)), G_DISCARD);
12792             FREETMPS;
12793             LEAVE;
12794         }
12795     }
12796
12797     if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
12798         ptr_table_free(PL_ptr_table);
12799         PL_ptr_table = NULL;
12800     }
12801
12802     if (!(flags & CLONEf_COPY_STACKS)) {
12803         unreferenced_to_tmp_stack(param->unreferenced);
12804     }
12805
12806     SvREFCNT_dec(param->stashes);
12807
12808     /* orphaned? eg threads->new inside BEGIN or use */
12809     if (PL_compcv && ! SvREFCNT(PL_compcv)) {
12810         SvREFCNT_inc_simple_void(PL_compcv);
12811         SAVEFREESV(PL_compcv);
12812     }
12813
12814     return my_perl;
12815 }
12816
12817 static void
12818 S_unreferenced_to_tmp_stack(pTHX_ AV *const unreferenced)
12819 {
12820     PERL_ARGS_ASSERT_UNREFERENCED_TO_TMP_STACK;
12821     
12822     if (AvFILLp(unreferenced) > -1) {
12823         SV **svp = AvARRAY(unreferenced);
12824         SV **const last = svp + AvFILLp(unreferenced);
12825         SSize_t count = 0;
12826
12827         do {
12828             if (SvREFCNT(*svp) == 1)
12829                 ++count;
12830         } while (++svp <= last);
12831
12832         EXTEND_MORTAL(count);
12833         svp = AvARRAY(unreferenced);
12834
12835         do {
12836             if (SvREFCNT(*svp) == 1) {
12837                 /* Our reference is the only one to this SV. This means that
12838                    in this thread, the scalar effectively has a 0 reference.
12839                    That doesn't work (cleanup never happens), so donate our
12840                    reference to it onto the save stack. */
12841                 PL_tmps_stack[++PL_tmps_ix] = *svp;
12842             } else {
12843                 /* As an optimisation, because we are already walking the
12844                    entire array, instead of above doing either
12845                    SvREFCNT_inc(*svp) or *svp = &PL_sv_undef, we can instead
12846                    release our reference to the scalar, so that at the end of
12847                    the array owns zero references to the scalars it happens to
12848                    point to. We are effectively converting the array from
12849                    AvREAL() on to AvREAL() off. This saves the av_clear()
12850                    (triggered by the SvREFCNT_dec(unreferenced) below) from
12851                    walking the array a second time.  */
12852                 SvREFCNT_dec(*svp);
12853             }
12854
12855         } while (++svp <= last);
12856         AvREAL_off(unreferenced);
12857     }
12858     SvREFCNT_dec(unreferenced);
12859 }
12860
12861 void
12862 Perl_clone_params_del(CLONE_PARAMS *param)
12863 {
12864     PerlInterpreter *const was = PERL_GET_THX;
12865     PerlInterpreter *const to = param->new_perl;
12866     dTHXa(to);
12867
12868     PERL_ARGS_ASSERT_CLONE_PARAMS_DEL;
12869
12870     if (was != to) {
12871         PERL_SET_THX(to);
12872     }
12873
12874     SvREFCNT_dec(param->stashes);
12875     if (param->unreferenced)
12876         unreferenced_to_tmp_stack(param->unreferenced);
12877
12878     Safefree(param);
12879
12880     if (was != to) {
12881         PERL_SET_THX(was);
12882     }
12883 }
12884
12885 CLONE_PARAMS *
12886 Perl_clone_params_new(PerlInterpreter *const from, PerlInterpreter *const to)
12887 {
12888     /* Need to play this game, as newAV() can call safesysmalloc(), and that
12889        does a dTHX; to get the context from thread local storage.
12890        FIXME - under PERL_CORE Newx(), Safefree() and friends should expand to
12891        a version that passes in my_perl.  */
12892     PerlInterpreter *const was = PERL_GET_THX;
12893     CLONE_PARAMS *param;
12894
12895     PERL_ARGS_ASSERT_CLONE_PARAMS_NEW;
12896
12897     if (was != to) {
12898         PERL_SET_THX(to);
12899     }
12900
12901     /* Given that we've set the context, we can do this unshared.  */
12902     Newx(param, 1, CLONE_PARAMS);
12903
12904     param->flags = 0;
12905     param->proto_perl = from;
12906     param->new_perl = to;
12907     param->stashes = (AV *)Perl_newSV_type(to, SVt_PVAV);
12908     AvREAL_off(param->stashes);
12909     param->unreferenced = (AV *)Perl_newSV_type(to, SVt_PVAV);
12910
12911     if (was != to) {
12912         PERL_SET_THX(was);
12913     }
12914     return param;
12915 }
12916
12917 #endif /* USE_ITHREADS */
12918
12919 /*
12920 =head1 Unicode Support
12921
12922 =for apidoc sv_recode_to_utf8
12923
12924 The encoding is assumed to be an Encode object, on entry the PV
12925 of the sv is assumed to be octets in that encoding, and the sv
12926 will be converted into Unicode (and UTF-8).
12927
12928 If the sv already is UTF-8 (or if it is not POK), or if the encoding
12929 is not a reference, nothing is done to the sv.  If the encoding is not
12930 an C<Encode::XS> Encoding object, bad things will happen.
12931 (See F<lib/encoding.pm> and L<Encode>).
12932
12933 The PV of the sv is returned.
12934
12935 =cut */
12936
12937 char *
12938 Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
12939 {
12940     dVAR;
12941
12942     PERL_ARGS_ASSERT_SV_RECODE_TO_UTF8;
12943
12944     if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
12945         SV *uni;
12946         STRLEN len;
12947         const char *s;
12948         dSP;
12949         ENTER;
12950         SAVETMPS;
12951         save_re_context();
12952         PUSHMARK(sp);
12953         EXTEND(SP, 3);
12954         XPUSHs(encoding);
12955         XPUSHs(sv);
12956 /*
12957   NI-S 2002/07/09
12958   Passing sv_yes is wrong - it needs to be or'ed set of constants
12959   for Encode::XS, while UTf-8 decode (currently) assumes a true value means
12960   remove converted chars from source.
12961
12962   Both will default the value - let them.
12963
12964         XPUSHs(&PL_sv_yes);
12965 */
12966         PUTBACK;
12967         call_method("decode", G_SCALAR);
12968         SPAGAIN;
12969         uni = POPs;
12970         PUTBACK;
12971         s = SvPV_const(uni, len);
12972         if (s != SvPVX_const(sv)) {
12973             SvGROW(sv, len + 1);
12974             Move(s, SvPVX(sv), len + 1, char);
12975             SvCUR_set(sv, len);
12976         }
12977         FREETMPS;
12978         LEAVE;
12979         SvUTF8_on(sv);
12980         return SvPVX(sv);
12981     }
12982     return SvPOKp(sv) ? SvPVX(sv) : NULL;
12983 }
12984
12985 /*
12986 =for apidoc sv_cat_decode
12987
12988 The encoding is assumed to be an Encode object, the PV of the ssv is
12989 assumed to be octets in that encoding and decoding the input starts
12990 from the position which (PV + *offset) pointed to.  The dsv will be
12991 concatenated the decoded UTF-8 string from ssv.  Decoding will terminate
12992 when the string tstr appears in decoding output or the input ends on
12993 the PV of the ssv. The value which the offset points will be modified
12994 to the last input position on the ssv.
12995
12996 Returns TRUE if the terminator was found, else returns FALSE.
12997
12998 =cut */
12999
13000 bool
13001 Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
13002                    SV *ssv, int *offset, char *tstr, int tlen)
13003 {
13004     dVAR;
13005     bool ret = FALSE;
13006
13007     PERL_ARGS_ASSERT_SV_CAT_DECODE;
13008
13009     if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) {
13010         SV *offsv;
13011         dSP;
13012         ENTER;
13013         SAVETMPS;
13014         save_re_context();
13015         PUSHMARK(sp);
13016         EXTEND(SP, 6);
13017         XPUSHs(encoding);
13018         XPUSHs(dsv);
13019         XPUSHs(ssv);
13020         offsv = newSViv(*offset);
13021         mXPUSHs(offsv);
13022         mXPUSHp(tstr, tlen);
13023         PUTBACK;
13024         call_method("cat_decode", G_SCALAR);
13025         SPAGAIN;
13026         ret = SvTRUE(TOPs);
13027         *offset = SvIV(offsv);
13028         PUTBACK;
13029         FREETMPS;
13030         LEAVE;
13031     }
13032     else
13033         Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
13034     return ret;
13035
13036 }
13037
13038 /* ---------------------------------------------------------------------
13039  *
13040  * support functions for report_uninit()
13041  */
13042
13043 /* the maxiumum size of array or hash where we will scan looking
13044  * for the undefined element that triggered the warning */
13045
13046 #define FUV_MAX_SEARCH_SIZE 1000
13047
13048 /* Look for an entry in the hash whose value has the same SV as val;
13049  * If so, return a mortal copy of the key. */
13050
13051 STATIC SV*
13052 S_find_hash_subscript(pTHX_ const HV *const hv, const SV *const val)
13053 {
13054     dVAR;
13055     register HE **array;
13056     I32 i;
13057
13058     PERL_ARGS_ASSERT_FIND_HASH_SUBSCRIPT;
13059
13060     if (!hv || SvMAGICAL(hv) || !HvARRAY(hv) ||
13061                         (HvTOTALKEYS(hv) > FUV_MAX_SEARCH_SIZE))
13062         return NULL;
13063
13064     array = HvARRAY(hv);
13065
13066     for (i=HvMAX(hv); i>0; i--) {
13067         register HE *entry;
13068         for (entry = array[i]; entry; entry = HeNEXT(entry)) {
13069             if (HeVAL(entry) != val)
13070                 continue;
13071             if (    HeVAL(entry) == &PL_sv_undef ||
13072                     HeVAL(entry) == &PL_sv_placeholder)
13073                 continue;
13074             if (!HeKEY(entry))
13075                 return NULL;
13076             if (HeKLEN(entry) == HEf_SVKEY)
13077                 return sv_mortalcopy(HeKEY_sv(entry));
13078             return sv_2mortal(newSVhek(HeKEY_hek(entry)));
13079         }
13080     }
13081     return NULL;
13082 }
13083
13084 /* Look for an entry in the array whose value has the same SV as val;
13085  * If so, return the index, otherwise return -1. */
13086
13087 STATIC I32
13088 S_find_array_subscript(pTHX_ const AV *const av, const SV *const val)
13089 {
13090     dVAR;
13091
13092     PERL_ARGS_ASSERT_FIND_ARRAY_SUBSCRIPT;
13093
13094     if (!av || SvMAGICAL(av) || !AvARRAY(av) ||
13095                         (AvFILLp(av) > FUV_MAX_SEARCH_SIZE))
13096         return -1;
13097
13098     if (val != &PL_sv_undef) {
13099         SV ** const svp = AvARRAY(av);
13100         I32 i;
13101
13102         for (i=AvFILLp(av); i>=0; i--)
13103             if (svp[i] == val)
13104                 return i;
13105     }
13106     return -1;
13107 }
13108
13109 /* S_varname(): return the name of a variable, optionally with a subscript.
13110  * If gv is non-zero, use the name of that global, along with gvtype (one
13111  * of "$", "@", "%"); otherwise use the name of the lexical at pad offset
13112  * targ.  Depending on the value of the subscript_type flag, return:
13113  */
13114
13115 #define FUV_SUBSCRIPT_NONE      1       /* "@foo"          */
13116 #define FUV_SUBSCRIPT_ARRAY     2       /* "$foo[aindex]"  */
13117 #define FUV_SUBSCRIPT_HASH      3       /* "$foo{keyname}" */
13118 #define FUV_SUBSCRIPT_WITHIN    4       /* "within @foo"   */
13119
13120 STATIC SV*
13121 S_varname(pTHX_ const GV *const gv, const char gvtype, PADOFFSET targ,
13122         const SV *const keyname, I32 aindex, int subscript_type)
13123 {
13124
13125     SV * const name = sv_newmortal();
13126     if (gv) {
13127         char buffer[2];
13128         buffer[0] = gvtype;
13129         buffer[1] = 0;
13130
13131         /* as gv_fullname4(), but add literal '^' for $^FOO names  */
13132
13133         gv_fullname4(name, gv, buffer, 0);
13134
13135         if ((unsigned int)SvPVX(name)[1] <= 26) {
13136             buffer[0] = '^';
13137             buffer[1] = SvPVX(name)[1] + 'A' - 1;
13138
13139             /* Swap the 1 unprintable control character for the 2 byte pretty
13140                version - ie substr($name, 1, 1) = $buffer; */
13141             sv_insert(name, 1, 1, buffer, 2);
13142         }
13143     }
13144     else {
13145         CV * const cv = find_runcv(NULL);
13146         SV *sv;
13147         AV *av;
13148
13149         if (!cv || !CvPADLIST(cv))
13150             return NULL;
13151         av = MUTABLE_AV((*av_fetch(CvPADLIST(cv), 0, FALSE)));
13152         sv = *av_fetch(av, targ, FALSE);
13153         sv_setpvn(name, SvPV_nolen_const(sv), SvCUR(sv));
13154     }
13155
13156     if (subscript_type == FUV_SUBSCRIPT_HASH) {
13157         SV * const sv = newSV(0);
13158         *SvPVX(name) = '$';
13159         Perl_sv_catpvf(aTHX_ name, "{%s}",
13160             pv_display(sv,SvPVX_const(keyname), SvCUR(keyname), 0, 32));
13161         SvREFCNT_dec(sv);
13162     }
13163     else if (subscript_type == FUV_SUBSCRIPT_ARRAY) {
13164         *SvPVX(name) = '$';
13165         Perl_sv_catpvf(aTHX_ name, "[%"IVdf"]", (IV)aindex);
13166     }
13167     else if (subscript_type == FUV_SUBSCRIPT_WITHIN) {
13168         /* We know that name has no magic, so can use 0 instead of SV_GMAGIC */
13169         Perl_sv_insert_flags(aTHX_ name, 0, 0,  STR_WITH_LEN("within "), 0);
13170     }
13171
13172     return name;
13173 }
13174
13175
13176 /*
13177 =for apidoc find_uninit_var
13178
13179 Find the name of the undefined variable (if any) that caused the operator o
13180 to issue a "Use of uninitialized value" warning.
13181 If match is true, only return a name if it's value matches uninit_sv.
13182 So roughly speaking, if a unary operator (such as OP_COS) generates a
13183 warning, then following the direct child of the op may yield an
13184 OP_PADSV or OP_GV that gives the name of the undefined variable. On the
13185 other hand, with OP_ADD there are two branches to follow, so we only print
13186 the variable name if we get an exact match.
13187
13188 The name is returned as a mortal SV.
13189
13190 Assumes that PL_op is the op that originally triggered the error, and that
13191 PL_comppad/PL_curpad points to the currently executing pad.
13192
13193 =cut
13194 */
13195
13196 STATIC SV *
13197 S_find_uninit_var(pTHX_ const OP *const obase, const SV *const uninit_sv,
13198                   bool match)
13199 {
13200     dVAR;
13201     SV *sv;
13202     const GV *gv;
13203     const OP *o, *o2, *kid;
13204
13205     if (!obase || (match && (!uninit_sv || uninit_sv == &PL_sv_undef ||
13206                             uninit_sv == &PL_sv_placeholder)))
13207         return NULL;
13208
13209     switch (obase->op_type) {
13210
13211     case OP_RV2AV:
13212     case OP_RV2HV:
13213     case OP_PADAV:
13214     case OP_PADHV:
13215       {
13216         const bool pad  = (obase->op_type == OP_PADAV || obase->op_type == OP_PADHV);
13217         const bool hash = (obase->op_type == OP_PADHV || obase->op_type == OP_RV2HV);
13218         I32 index = 0;
13219         SV *keysv = NULL;
13220         int subscript_type = FUV_SUBSCRIPT_WITHIN;
13221
13222         if (pad) { /* @lex, %lex */
13223             sv = PAD_SVl(obase->op_targ);
13224             gv = NULL;
13225         }
13226         else {
13227             if (cUNOPx(obase)->op_first->op_type == OP_GV) {
13228             /* @global, %global */
13229                 gv = cGVOPx_gv(cUNOPx(obase)->op_first);
13230                 if (!gv)
13231                     break;
13232                 sv = hash ? MUTABLE_SV(GvHV(gv)): MUTABLE_SV(GvAV(gv));
13233             }
13234             else /* @{expr}, %{expr} */
13235                 return find_uninit_var(cUNOPx(obase)->op_first,
13236                                                     uninit_sv, match);
13237         }
13238
13239         /* attempt to find a match within the aggregate */
13240         if (hash) {
13241             keysv = find_hash_subscript((const HV*)sv, uninit_sv);
13242             if (keysv)
13243                 subscript_type = FUV_SUBSCRIPT_HASH;
13244         }
13245         else {
13246             index = find_array_subscript((const AV *)sv, uninit_sv);
13247             if (index >= 0)
13248                 subscript_type = FUV_SUBSCRIPT_ARRAY;
13249         }
13250
13251         if (match && subscript_type == FUV_SUBSCRIPT_WITHIN)
13252             break;
13253
13254         return varname(gv, hash ? '%' : '@', obase->op_targ,
13255                                     keysv, index, subscript_type);
13256       }
13257
13258     case OP_PADSV:
13259         if (match && PAD_SVl(obase->op_targ) != uninit_sv)
13260             break;
13261         return varname(NULL, '$', obase->op_targ,
13262                                     NULL, 0, FUV_SUBSCRIPT_NONE);
13263
13264     case OP_GVSV:
13265         gv = cGVOPx_gv(obase);
13266         if (!gv || (match && GvSV(gv) != uninit_sv))
13267             break;
13268         return varname(gv, '$', 0, NULL, 0, FUV_SUBSCRIPT_NONE);
13269
13270     case OP_AELEMFAST:
13271         if (obase->op_flags & OPf_SPECIAL) { /* lexical array */
13272             if (match) {
13273                 SV **svp;
13274                 AV *av = MUTABLE_AV(PAD_SV(obase->op_targ));
13275                 if (!av || SvRMAGICAL(av))
13276                     break;
13277                 svp = av_fetch(av, (I32)obase->op_private, FALSE);
13278                 if (!svp || *svp != uninit_sv)
13279                     break;
13280             }
13281             return varname(NULL, '$', obase->op_targ,
13282                     NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
13283         }
13284         else {
13285             gv = cGVOPx_gv(obase);
13286             if (!gv)
13287                 break;
13288             if (match) {
13289                 SV **svp;
13290                 AV *const av = GvAV(gv);
13291                 if (!av || SvRMAGICAL(av))
13292                     break;
13293                 svp = av_fetch(av, (I32)obase->op_private, FALSE);
13294                 if (!svp || *svp != uninit_sv)
13295                     break;
13296             }
13297             return varname(gv, '$', 0,
13298                     NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
13299         }
13300         break;
13301
13302     case OP_EXISTS:
13303         o = cUNOPx(obase)->op_first;
13304         if (!o || o->op_type != OP_NULL ||
13305                 ! (o->op_targ == OP_AELEM || o->op_targ == OP_HELEM))
13306             break;
13307         return find_uninit_var(cBINOPo->op_last, uninit_sv, match);
13308
13309     case OP_AELEM:
13310     case OP_HELEM:
13311         if (PL_op == obase)
13312             /* $a[uninit_expr] or $h{uninit_expr} */
13313             return find_uninit_var(cBINOPx(obase)->op_last, uninit_sv, match);
13314
13315         gv = NULL;
13316         o = cBINOPx(obase)->op_first;
13317         kid = cBINOPx(obase)->op_last;
13318
13319         /* get the av or hv, and optionally the gv */
13320         sv = NULL;
13321         if  (o->op_type == OP_PADAV || o->op_type == OP_PADHV) {
13322             sv = PAD_SV(o->op_targ);
13323         }
13324         else if ((o->op_type == OP_RV2AV || o->op_type == OP_RV2HV)
13325                 && cUNOPo->op_first->op_type == OP_GV)
13326         {
13327             gv = cGVOPx_gv(cUNOPo->op_first);
13328             if (!gv)
13329                 break;
13330             sv = o->op_type
13331                 == OP_RV2HV ? MUTABLE_SV(GvHV(gv)) : MUTABLE_SV(GvAV(gv));
13332         }
13333         if (!sv)
13334             break;
13335
13336         if (kid && kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid))) {
13337             /* index is constant */
13338             if (match) {
13339                 if (SvMAGICAL(sv))
13340                     break;
13341                 if (obase->op_type == OP_HELEM) {
13342                     HE* he = hv_fetch_ent(MUTABLE_HV(sv), cSVOPx_sv(kid), 0, 0);
13343                     if (!he || HeVAL(he) != uninit_sv)
13344                         break;
13345                 }
13346                 else {
13347                     SV * const * const svp = av_fetch(MUTABLE_AV(sv), SvIV(cSVOPx_sv(kid)), FALSE);
13348                     if (!svp || *svp != uninit_sv)
13349                         break;
13350                 }
13351             }
13352             if (obase->op_type == OP_HELEM)
13353                 return varname(gv, '%', o->op_targ,
13354                             cSVOPx_sv(kid), 0, FUV_SUBSCRIPT_HASH);
13355             else
13356                 return varname(gv, '@', o->op_targ, NULL,
13357                             SvIV(cSVOPx_sv(kid)), FUV_SUBSCRIPT_ARRAY);
13358         }
13359         else  {
13360             /* index is an expression;
13361              * attempt to find a match within the aggregate */
13362             if (obase->op_type == OP_HELEM) {
13363                 SV * const keysv = find_hash_subscript((const HV*)sv, uninit_sv);
13364                 if (keysv)
13365                     return varname(gv, '%', o->op_targ,
13366                                                 keysv, 0, FUV_SUBSCRIPT_HASH);
13367             }
13368             else {
13369                 const I32 index
13370                     = find_array_subscript((const AV *)sv, uninit_sv);
13371                 if (index >= 0)
13372                     return varname(gv, '@', o->op_targ,
13373                                         NULL, index, FUV_SUBSCRIPT_ARRAY);
13374             }
13375             if (match)
13376                 break;
13377             return varname(gv,
13378                 (o->op_type == OP_PADAV || o->op_type == OP_RV2AV)
13379                 ? '@' : '%',
13380                 o->op_targ, NULL, 0, FUV_SUBSCRIPT_WITHIN);
13381         }
13382         break;
13383
13384     case OP_AASSIGN:
13385         /* only examine RHS */
13386         return find_uninit_var(cBINOPx(obase)->op_first, uninit_sv, match);
13387
13388     case OP_OPEN:
13389         o = cUNOPx(obase)->op_first;
13390         if (o->op_type == OP_PUSHMARK)
13391             o = o->op_sibling;
13392
13393         if (!o->op_sibling) {
13394             /* one-arg version of open is highly magical */
13395
13396             if (o->op_type == OP_GV) { /* open FOO; */
13397                 gv = cGVOPx_gv(o);
13398                 if (match && GvSV(gv) != uninit_sv)
13399                     break;
13400                 return varname(gv, '$', 0,
13401                             NULL, 0, FUV_SUBSCRIPT_NONE);
13402             }
13403             /* other possibilities not handled are:
13404              * open $x; or open my $x;  should return '${*$x}'
13405              * open expr;               should return '$'.expr ideally
13406              */
13407              break;
13408         }
13409         goto do_op;
13410
13411     /* ops where $_ may be an implicit arg */
13412     case OP_TRANS:
13413     case OP_SUBST:
13414     case OP_MATCH:
13415         if ( !(obase->op_flags & OPf_STACKED)) {
13416             if (uninit_sv == ((obase->op_private & OPpTARGET_MY)
13417                                  ? PAD_SVl(obase->op_targ)
13418                                  : DEFSV))
13419             {
13420                 sv = sv_newmortal();
13421                 sv_setpvs(sv, "$_");
13422                 return sv;
13423             }
13424         }
13425         goto do_op;
13426
13427     case OP_PRTF:
13428     case OP_PRINT:
13429     case OP_SAY:
13430         match = 1; /* print etc can return undef on defined args */
13431         /* skip filehandle as it can't produce 'undef' warning  */
13432         o = cUNOPx(obase)->op_first;
13433         if ((obase->op_flags & OPf_STACKED) && o->op_type == OP_PUSHMARK)
13434             o = o->op_sibling->op_sibling;
13435         goto do_op2;
13436
13437
13438     case OP_ENTEREVAL: /* could be eval $undef or $x='$undef'; eval $x */
13439     case OP_RV2SV:
13440     case OP_CUSTOM: /* XS or custom code could trigger random warnings */
13441
13442         /* the following ops are capable of returning PL_sv_undef even for
13443          * defined arg(s) */
13444
13445     case OP_BACKTICK:
13446     case OP_PIPE_OP:
13447     case OP_FILENO:
13448     case OP_BINMODE:
13449     case OP_TIED:
13450     case OP_GETC:
13451     case OP_SYSREAD:
13452     case OP_SEND:
13453     case OP_IOCTL:
13454     case OP_SOCKET:
13455     case OP_SOCKPAIR:
13456     case OP_BIND:
13457     case OP_CONNECT:
13458     case OP_LISTEN:
13459     case OP_ACCEPT:
13460     case OP_SHUTDOWN:
13461     case OP_SSOCKOPT:
13462     case OP_GETPEERNAME:
13463     case OP_FTRREAD:
13464     case OP_FTRWRITE:
13465     case OP_FTREXEC:
13466     case OP_FTROWNED:
13467     case OP_FTEREAD:
13468     case OP_FTEWRITE:
13469     case OP_FTEEXEC:
13470     case OP_FTEOWNED:
13471     case OP_FTIS:
13472     case OP_FTZERO:
13473     case OP_FTSIZE:
13474     case OP_FTFILE:
13475     case OP_FTDIR:
13476     case OP_FTLINK:
13477     case OP_FTPIPE:
13478     case OP_FTSOCK:
13479     case OP_FTBLK:
13480     case OP_FTCHR:
13481     case OP_FTTTY:
13482     case OP_FTSUID:
13483     case OP_FTSGID:
13484     case OP_FTSVTX:
13485     case OP_FTTEXT:
13486     case OP_FTBINARY:
13487     case OP_FTMTIME:
13488     case OP_FTATIME:
13489     case OP_FTCTIME:
13490     case OP_READLINK:
13491     case OP_OPEN_DIR:
13492     case OP_READDIR:
13493     case OP_TELLDIR:
13494     case OP_SEEKDIR:
13495     case OP_REWINDDIR:
13496     case OP_CLOSEDIR:
13497     case OP_GMTIME:
13498     case OP_ALARM:
13499     case OP_SEMGET:
13500     case OP_GETLOGIN:
13501     case OP_UNDEF:
13502     case OP_SUBSTR:
13503     case OP_AEACH:
13504     case OP_EACH:
13505     case OP_SORT:
13506     case OP_CALLER:
13507     case OP_DOFILE:
13508     case OP_PROTOTYPE:
13509     case OP_NCMP:
13510     case OP_SMARTMATCH:
13511     case OP_UNPACK:
13512     case OP_SYSOPEN:
13513     case OP_SYSSEEK:
13514         match = 1;
13515         goto do_op;
13516
13517     case OP_ENTERSUB:
13518     case OP_GOTO:
13519         /* XXX tmp hack: these two may call an XS sub, and currently
13520           XS subs don't have a SUB entry on the context stack, so CV and
13521           pad determination goes wrong, and BAD things happen. So, just
13522           don't try to determine the value under those circumstances.
13523           Need a better fix at dome point. DAPM 11/2007 */
13524         break;
13525
13526     case OP_FLIP:
13527     case OP_FLOP:
13528     {
13529         GV * const gv = gv_fetchpvs(".", GV_NOTQUAL, SVt_PV);
13530         if (gv && GvSV(gv) == uninit_sv)
13531             return newSVpvs_flags("$.", SVs_TEMP);
13532         goto do_op;
13533     }
13534
13535     case OP_POS:
13536         /* def-ness of rval pos() is independent of the def-ness of its arg */
13537         if ( !(obase->op_flags & OPf_MOD))
13538             break;
13539
13540     case OP_SCHOMP:
13541     case OP_CHOMP:
13542         if (SvROK(PL_rs) && uninit_sv == SvRV(PL_rs))
13543             return newSVpvs_flags("${$/}", SVs_TEMP);
13544         /*FALLTHROUGH*/
13545
13546     default:
13547     do_op:
13548         if (!(obase->op_flags & OPf_KIDS))
13549             break;
13550         o = cUNOPx(obase)->op_first;
13551         
13552     do_op2:
13553         if (!o)
13554             break;
13555
13556         /* if all except one arg are constant, or have no side-effects,
13557          * or are optimized away, then it's unambiguous */
13558         o2 = NULL;
13559         for (kid=o; kid; kid = kid->op_sibling) {
13560             if (kid) {
13561                 const OPCODE type = kid->op_type;
13562                 if ( (type == OP_CONST && SvOK(cSVOPx_sv(kid)))
13563                   || (type == OP_NULL  && ! (kid->op_flags & OPf_KIDS))
13564                   || (type == OP_PUSHMARK)
13565                 )
13566                 continue;
13567             }
13568             if (o2) { /* more than one found */
13569                 o2 = NULL;
13570                 break;
13571             }
13572             o2 = kid;
13573         }
13574         if (o2)
13575             return find_uninit_var(o2, uninit_sv, match);
13576
13577         /* scan all args */
13578         while (o) {
13579             sv = find_uninit_var(o, uninit_sv, 1);
13580             if (sv)
13581                 return sv;
13582             o = o->op_sibling;
13583         }
13584         break;
13585     }
13586     return NULL;
13587 }
13588
13589
13590 /*
13591 =for apidoc report_uninit
13592
13593 Print appropriate "Use of uninitialized variable" warning
13594
13595 =cut
13596 */
13597
13598 void
13599 Perl_report_uninit(pTHX_ const SV *uninit_sv)
13600 {
13601     dVAR;
13602     if (PL_op) {
13603         SV* varname = NULL;
13604         if (uninit_sv) {
13605             varname = find_uninit_var(PL_op, uninit_sv,0);
13606             if (varname)
13607                 sv_insert(varname, 0, 0, " ", 1);
13608         }
13609         Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
13610                 varname ? SvPV_nolen_const(varname) : "",
13611                 " in ", OP_DESC(PL_op));
13612     }
13613     else
13614         Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
13615                     "", "", "");
13616 }
13617
13618 /*
13619  * Local variables:
13620  * c-indentation-style: bsd
13621  * c-basic-offset: 4
13622  * indent-tabs-mode: t
13623  * End:
13624  *
13625  * ex: set ts=8 sts=4 sw=4 noet:
13626  */