This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Add Porting/checkpodencoding.pl to MANIFEST
[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_XIV(), del_XIV(),
151     new_XNV(), del_XNV(),
152     etc
153
154 Public API:
155
156     sv_report_used(), sv_clean_objs(), sv_clean_all(), sv_free_arenas()
157
158 =cut
159
160  * ========================================================================= */
161
162 /*
163  * "A time to plant, and a time to uproot what was planted..."
164  */
165
166 void
167 Perl_offer_nice_chunk(pTHX_ void *const chunk, const U32 chunk_size)
168 {
169     dVAR;
170     void *new_chunk;
171     U32 new_chunk_size;
172
173     PERL_ARGS_ASSERT_OFFER_NICE_CHUNK;
174
175     new_chunk = (void *)(chunk);
176     new_chunk_size = (chunk_size);
177     if (new_chunk_size > PL_nice_chunk_size) {
178         Safefree(PL_nice_chunk);
179         PL_nice_chunk = (char *) new_chunk;
180         PL_nice_chunk_size = new_chunk_size;
181     } else {
182         Safefree(chunk);
183     }
184 }
185
186 #ifdef PERL_MEM_LOG
187 #  define MEM_LOG_NEW_SV(sv, file, line, func)  \
188             Perl_mem_log_new_sv(sv, file, line, func)
189 #  define MEM_LOG_DEL_SV(sv, file, line, func)  \
190             Perl_mem_log_del_sv(sv, file, line, func)
191 #else
192 #  define MEM_LOG_NEW_SV(sv, file, line, func)  NOOP
193 #  define MEM_LOG_DEL_SV(sv, file, line, func)  NOOP
194 #endif
195
196 #ifdef DEBUG_LEAKING_SCALARS
197 #  define FREE_SV_DEBUG_FILE(sv) Safefree((sv)->sv_debug_file)
198 #  define DEBUG_SV_SERIAL(sv)                                               \
199     DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) del_SV\n",    \
200             PTR2UV(sv), (long)(sv)->sv_debug_serial))
201 #else
202 #  define FREE_SV_DEBUG_FILE(sv)
203 #  define DEBUG_SV_SERIAL(sv)   NOOP
204 #endif
205
206 #ifdef PERL_POISON
207 #  define SvARENA_CHAIN(sv)     ((sv)->sv_u.svu_rv)
208 #  define SvARENA_CHAIN_SET(sv,val)     (sv)->sv_u.svu_rv = MUTABLE_SV((val))
209 /* Whilst I'd love to do this, it seems that things like to check on
210    unreferenced scalars
211 #  define POSION_SV_HEAD(sv)    PoisonNew(sv, 1, struct STRUCT_SV)
212 */
213 #  define POSION_SV_HEAD(sv)    PoisonNew(&SvANY(sv), 1, void *), \
214                                 PoisonNew(&SvREFCNT(sv), 1, U32)
215 #else
216 #  define SvARENA_CHAIN(sv)     SvANY(sv)
217 #  define SvARENA_CHAIN_SET(sv,val)     SvANY(sv) = (void *)(val)
218 #  define POSION_SV_HEAD(sv)
219 #endif
220
221 /* Mark an SV head as unused, and add to free list.
222  *
223  * If SVf_BREAK is set, skip adding it to the free list, as this SV had
224  * its refcount artificially decremented during global destruction, so
225  * there may be dangling pointers to it. The last thing we want in that
226  * case is for it to be reused. */
227
228 #define plant_SV(p) \
229     STMT_START {                                        \
230         const U32 old_flags = SvFLAGS(p);                       \
231         MEM_LOG_DEL_SV(p, __FILE__, __LINE__, FUNCTION__);  \
232         DEBUG_SV_SERIAL(p);                             \
233         FREE_SV_DEBUG_FILE(p);                          \
234         POSION_SV_HEAD(p);                              \
235         SvFLAGS(p) = SVTYPEMASK;                        \
236         if (!(old_flags & SVf_BREAK)) {         \
237             SvARENA_CHAIN_SET(p, PL_sv_root);   \
238             PL_sv_root = (p);                           \
239         }                                               \
240         --PL_sv_count;                                  \
241     } STMT_END
242
243 #define uproot_SV(p) \
244     STMT_START {                                        \
245         (p) = PL_sv_root;                               \
246         PL_sv_root = MUTABLE_SV(SvARENA_CHAIN(p));              \
247         ++PL_sv_count;                                  \
248     } STMT_END
249
250
251 /* make some more SVs by adding another arena */
252
253 STATIC SV*
254 S_more_sv(pTHX)
255 {
256     dVAR;
257     SV* sv;
258
259     if (PL_nice_chunk) {
260         sv_add_arena(PL_nice_chunk, PL_nice_chunk_size, 0);
261         PL_nice_chunk = NULL;
262         PL_nice_chunk_size = 0;
263     }
264     else {
265         char *chunk;                /* must use New here to match call to */
266         Newx(chunk,PERL_ARENA_SIZE,char);  /* Safefree() in sv_free_arenas() */
267         sv_add_arena(chunk, PERL_ARENA_SIZE, 0);
268     }
269     uproot_SV(sv);
270     return sv;
271 }
272
273 /* new_SV(): return a new, empty SV head */
274
275 #ifdef DEBUG_LEAKING_SCALARS
276 /* provide a real function for a debugger to play with */
277 STATIC SV*
278 S_new_SV(pTHX_ const char *file, int line, const char *func)
279 {
280     SV* sv;
281
282     if (PL_sv_root)
283         uproot_SV(sv);
284     else
285         sv = S_more_sv(aTHX);
286     SvANY(sv) = 0;
287     SvREFCNT(sv) = 1;
288     SvFLAGS(sv) = 0;
289     sv->sv_debug_optype = PL_op ? PL_op->op_type : 0;
290     sv->sv_debug_line = (U16) (PL_parser && PL_parser->copline != NOLINE
291                 ? PL_parser->copline
292                 :  PL_curcop
293                     ? CopLINE(PL_curcop)
294                     : 0
295             );
296     sv->sv_debug_inpad = 0;
297     sv->sv_debug_cloned = 0;
298     sv->sv_debug_file = PL_curcop ? savepv(CopFILE(PL_curcop)): NULL;
299
300     sv->sv_debug_serial = PL_sv_serial++;
301
302     MEM_LOG_NEW_SV(sv, file, line, func);
303     DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) new_SV (from %s:%d [%s])\n",
304             PTR2UV(sv), (long)sv->sv_debug_serial, file, line, func));
305
306     return sv;
307 }
308 #  define new_SV(p) (p)=S_new_SV(aTHX_ __FILE__, __LINE__, FUNCTION__)
309
310 #else
311 #  define new_SV(p) \
312     STMT_START {                                        \
313         if (PL_sv_root)                                 \
314             uproot_SV(p);                               \
315         else                                            \
316             (p) = S_more_sv(aTHX);                      \
317         SvANY(p) = 0;                                   \
318         SvREFCNT(p) = 1;                                \
319         SvFLAGS(p) = 0;                                 \
320         MEM_LOG_NEW_SV(p, __FILE__, __LINE__, FUNCTION__);  \
321     } STMT_END
322 #endif
323
324
325 /* del_SV(): return an empty SV head to the free list */
326
327 #ifdef DEBUGGING
328
329 #define del_SV(p) \
330     STMT_START {                                        \
331         if (DEBUG_D_TEST)                               \
332             del_sv(p);                                  \
333         else                                            \
334             plant_SV(p);                                \
335     } STMT_END
336
337 STATIC void
338 S_del_sv(pTHX_ SV *p)
339 {
340     dVAR;
341
342     PERL_ARGS_ASSERT_DEL_SV;
343
344     if (DEBUG_D_TEST) {
345         SV* sva;
346         bool ok = 0;
347         for (sva = PL_sv_arenaroot; sva; sva = MUTABLE_SV(SvANY(sva))) {
348             const SV * const sv = sva + 1;
349             const SV * const svend = &sva[SvREFCNT(sva)];
350             if (p >= sv && p < svend) {
351                 ok = 1;
352                 break;
353             }
354         }
355         if (!ok) {
356             Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),
357                              "Attempt to free non-arena SV: 0x%"UVxf
358                              pTHX__FORMAT, PTR2UV(p) pTHX__VALUE);
359             return;
360         }
361     }
362     plant_SV(p);
363 }
364
365 #else /* ! DEBUGGING */
366
367 #define del_SV(p)   plant_SV(p)
368
369 #endif /* DEBUGGING */
370
371
372 /*
373 =head1 SV Manipulation Functions
374
375 =for apidoc sv_add_arena
376
377 Given a chunk of memory, link it to the head of the list of arenas,
378 and split it into a list of free SVs.
379
380 =cut
381 */
382
383 static void
384 S_sv_add_arena(pTHX_ char *const ptr, const U32 size, const U32 flags)
385 {
386     dVAR;
387     SV *const sva = MUTABLE_SV(ptr);
388     register SV* sv;
389     register SV* svend;
390
391     PERL_ARGS_ASSERT_SV_ADD_ARENA;
392
393     /* The first SV in an arena isn't an SV. */
394     SvANY(sva) = (void *) PL_sv_arenaroot;              /* ptr to next arena */
395     SvREFCNT(sva) = size / sizeof(SV);          /* number of SV slots */
396     SvFLAGS(sva) = flags;                       /* FAKE if not to be freed */
397
398     PL_sv_arenaroot = sva;
399     PL_sv_root = sva + 1;
400
401     svend = &sva[SvREFCNT(sva) - 1];
402     sv = sva + 1;
403     while (sv < svend) {
404         SvARENA_CHAIN_SET(sv, (sv + 1));
405 #ifdef DEBUGGING
406         SvREFCNT(sv) = 0;
407 #endif
408         /* Must always set typemask because it's always checked in on cleanup
409            when the arenas are walked looking for objects.  */
410         SvFLAGS(sv) = SVTYPEMASK;
411         sv++;
412     }
413     SvARENA_CHAIN_SET(sv, 0);
414 #ifdef DEBUGGING
415     SvREFCNT(sv) = 0;
416 #endif
417     SvFLAGS(sv) = SVTYPEMASK;
418 }
419
420 /* visit(): call the named function for each non-free SV in the arenas
421  * whose flags field matches the flags/mask args. */
422
423 STATIC I32
424 S_visit(pTHX_ SVFUNC_t f, const U32 flags, const U32 mask)
425 {
426     dVAR;
427     SV* sva;
428     I32 visited = 0;
429
430     PERL_ARGS_ASSERT_VISIT;
431
432     for (sva = PL_sv_arenaroot; sva; sva = MUTABLE_SV(SvANY(sva))) {
433         register const SV * const svend = &sva[SvREFCNT(sva)];
434         register SV* sv;
435         for (sv = sva + 1; sv < svend; ++sv) {
436             if (SvTYPE(sv) != SVTYPEMASK
437                     && (sv->sv_flags & mask) == flags
438                     && SvREFCNT(sv))
439             {
440                 (FCALL)(aTHX_ sv);
441                 ++visited;
442             }
443         }
444     }
445     return visited;
446 }
447
448 #ifdef DEBUGGING
449
450 /* called by sv_report_used() for each live SV */
451
452 static void
453 do_report_used(pTHX_ SV *const sv)
454 {
455     if (SvTYPE(sv) != SVTYPEMASK) {
456         PerlIO_printf(Perl_debug_log, "****\n");
457         sv_dump(sv);
458     }
459 }
460 #endif
461
462 /*
463 =for apidoc sv_report_used
464
465 Dump the contents of all SVs not yet freed. (Debugging aid).
466
467 =cut
468 */
469
470 void
471 Perl_sv_report_used(pTHX)
472 {
473 #ifdef DEBUGGING
474     visit(do_report_used, 0, 0);
475 #else
476     PERL_UNUSED_CONTEXT;
477 #endif
478 }
479
480 /* called by sv_clean_objs() for each live SV */
481
482 static void
483 do_clean_objs(pTHX_ SV *const ref)
484 {
485     dVAR;
486     assert (SvROK(ref));
487     {
488         SV * const target = SvRV(ref);
489         if (SvOBJECT(target)) {
490             DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(ref)));
491             if (SvWEAKREF(ref)) {
492                 sv_del_backref(target, ref);
493                 SvWEAKREF_off(ref);
494                 SvRV_set(ref, NULL);
495             } else {
496                 SvROK_off(ref);
497                 SvRV_set(ref, NULL);
498                 SvREFCNT_dec(target);
499             }
500         }
501     }
502
503     /* XXX Might want to check arrays, etc. */
504 }
505
506 /* called by sv_clean_objs() for each live SV */
507
508 #ifndef DISABLE_DESTRUCTOR_KLUDGE
509 static void
510 do_clean_named_objs(pTHX_ SV *const sv)
511 {
512     dVAR;
513     assert(SvTYPE(sv) == SVt_PVGV);
514     assert(isGV_with_GP(sv));
515     if (GvGP(sv)) {
516         if ((
517 #ifdef PERL_DONT_CREATE_GVSV
518              GvSV(sv) &&
519 #endif
520              SvOBJECT(GvSV(sv))) ||
521              (GvAV(sv) && SvOBJECT(GvAV(sv))) ||
522              (GvHV(sv) && SvOBJECT(GvHV(sv))) ||
523              /* In certain rare cases GvIOp(sv) can be NULL, which would make SvOBJECT(GvIO(sv)) dereference NULL. */
524              (GvIO(sv) ? (SvFLAGS(GvIOp(sv)) & SVs_OBJECT) : 0) ||
525              (GvCV(sv) && SvOBJECT(GvCV(sv))) )
526         {
527             DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning named glob object:\n "), sv_dump(sv)));
528             SvFLAGS(sv) |= SVf_BREAK;
529             SvREFCNT_dec(sv);
530         }
531     }
532 }
533 #endif
534
535 /*
536 =for apidoc sv_clean_objs
537
538 Attempt to destroy all objects not yet freed
539
540 =cut
541 */
542
543 void
544 Perl_sv_clean_objs(pTHX)
545 {
546     dVAR;
547     PL_in_clean_objs = TRUE;
548     visit(do_clean_objs, SVf_ROK, SVf_ROK);
549 #ifndef DISABLE_DESTRUCTOR_KLUDGE
550     /* some barnacles may yet remain, clinging to typeglobs */
551     visit(do_clean_named_objs, SVt_PVGV|SVpgv_GP, SVTYPEMASK|SVp_POK|SVpgv_GP);
552 #endif
553     PL_in_clean_objs = FALSE;
554 }
555
556 /* called by sv_clean_all() for each live SV */
557
558 static void
559 do_clean_all(pTHX_ SV *const sv)
560 {
561     dVAR;
562     if (sv == (const SV *) PL_fdpid || sv == (const SV *)PL_strtab) {
563         /* don't clean pid table and strtab */
564         return;
565     }
566     DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%"UVxf"\n", PTR2UV(sv)) ));
567     SvFLAGS(sv) |= SVf_BREAK;
568     SvREFCNT_dec(sv);
569 }
570
571 /*
572 =for apidoc sv_clean_all
573
574 Decrement the refcnt of each remaining SV, possibly triggering a
575 cleanup. This function may have to be called multiple times to free
576 SVs which are in complex self-referential hierarchies.
577
578 =cut
579 */
580
581 I32
582 Perl_sv_clean_all(pTHX)
583 {
584     dVAR;
585     I32 cleaned;
586     PL_in_clean_all = TRUE;
587     cleaned = visit(do_clean_all, 0,0);
588     PL_in_clean_all = FALSE;
589     return cleaned;
590 }
591
592 /*
593   ARENASETS: a meta-arena implementation which separates arena-info
594   into struct arena_set, which contains an array of struct
595   arena_descs, each holding info for a single arena.  By separating
596   the meta-info from the arena, we recover the 1st slot, formerly
597   borrowed for list management.  The arena_set is about the size of an
598   arena, avoiding the needless malloc overhead of a naive linked-list.
599
600   The cost is 1 arena-set malloc per ~320 arena-mallocs, + the unused
601   memory in the last arena-set (1/2 on average).  In trade, we get
602   back the 1st slot in each arena (ie 1.7% of a CV-arena, less for
603   smaller types).  The recovery of the wasted space allows use of
604   small arenas for large, rare body types, by changing array* fields
605   in body_details_by_type[] below.
606 */
607 struct arena_desc {
608     char       *arena;          /* the raw storage, allocated aligned */
609     size_t      size;           /* its size ~4k typ */
610     svtype      utype;          /* bodytype stored in arena */
611 };
612
613 struct arena_set;
614
615 /* Get the maximum number of elements in set[] such that struct arena_set
616    will fit within PERL_ARENA_SIZE, which is probably just under 4K, and
617    therefore likely to be 1 aligned memory page.  */
618
619 #define ARENAS_PER_SET  ((PERL_ARENA_SIZE - sizeof(struct arena_set*) \
620                           - 2 * sizeof(int)) / sizeof (struct arena_desc))
621
622 struct arena_set {
623     struct arena_set* next;
624     unsigned int   set_size;    /* ie ARENAS_PER_SET */
625     unsigned int   curr;        /* index of next available arena-desc */
626     struct arena_desc set[ARENAS_PER_SET];
627 };
628
629 /*
630 =for apidoc sv_free_arenas
631
632 Deallocate the memory used by all arenas. Note that all the individual SV
633 heads and bodies within the arenas must already have been freed.
634
635 =cut
636 */
637 void
638 Perl_sv_free_arenas(pTHX)
639 {
640     dVAR;
641     SV* sva;
642     SV* svanext;
643     unsigned int i;
644
645     /* Free arenas here, but be careful about fake ones.  (We assume
646        contiguity of the fake ones with the corresponding real ones.) */
647
648     for (sva = PL_sv_arenaroot; sva; sva = svanext) {
649         svanext = MUTABLE_SV(SvANY(sva));
650         while (svanext && SvFAKE(svanext))
651             svanext = MUTABLE_SV(SvANY(svanext));
652
653         if (!SvFAKE(sva))
654             Safefree(sva);
655     }
656
657     {
658         struct arena_set *aroot = (struct arena_set*) PL_body_arenas;
659
660         while (aroot) {
661             struct arena_set *current = aroot;
662             i = aroot->curr;
663             while (i--) {
664                 assert(aroot->set[i].arena);
665                 Safefree(aroot->set[i].arena);
666             }
667             aroot = aroot->next;
668             Safefree(current);
669         }
670     }
671     PL_body_arenas = 0;
672
673     i = PERL_ARENA_ROOTS_SIZE;
674     while (i--)
675         PL_body_roots[i] = 0;
676
677     Safefree(PL_nice_chunk);
678     PL_nice_chunk = NULL;
679     PL_nice_chunk_size = 0;
680     PL_sv_arenaroot = 0;
681     PL_sv_root = 0;
682 }
683
684 /*
685   Here are mid-level routines that manage the allocation of bodies out
686   of the various arenas.  There are 5 kinds of arenas:
687
688   1. SV-head arenas, which are discussed and handled above
689   2. regular body arenas
690   3. arenas for reduced-size bodies
691   4. Hash-Entry arenas
692
693   Arena types 2 & 3 are chained by body-type off an array of
694   arena-root pointers, which is indexed by svtype.  Some of the
695   larger/less used body types are malloced singly, since a large
696   unused block of them is wasteful.  Also, several svtypes dont have
697   bodies; the data fits into the sv-head itself.  The arena-root
698   pointer thus has a few unused root-pointers (which may be hijacked
699   later for arena types 4,5)
700
701   3 differs from 2 as an optimization; some body types have several
702   unused fields in the front of the structure (which are kept in-place
703   for consistency).  These bodies can be allocated in smaller chunks,
704   because the leading fields arent accessed.  Pointers to such bodies
705   are decremented to point at the unused 'ghost' memory, knowing that
706   the pointers are used with offsets to the real memory.
707
708   HE, HEK arenas are managed separately, with separate code, but may
709   be merge-able later..
710 */
711
712 /* get_arena(size): this creates custom-sized arenas
713    TBD: export properly for hv.c: S_more_he().
714 */
715 void*
716 Perl_get_arena(pTHX_ const size_t arena_size, const svtype bodytype)
717 {
718     dVAR;
719     struct arena_desc* adesc;
720     struct arena_set *aroot = (struct arena_set*) PL_body_arenas;
721     unsigned int curr;
722
723     /* shouldnt need this
724     if (!arena_size)    arena_size = PERL_ARENA_SIZE;
725     */
726
727     /* may need new arena-set to hold new arena */
728     if (!aroot || aroot->curr >= aroot->set_size) {
729         struct arena_set *newroot;
730         Newxz(newroot, 1, struct arena_set);
731         newroot->set_size = ARENAS_PER_SET;
732         newroot->next = aroot;
733         aroot = newroot;
734         PL_body_arenas = (void *) newroot;
735         DEBUG_m(PerlIO_printf(Perl_debug_log, "new arenaset %p\n", (void*)aroot));
736     }
737
738     /* ok, now have arena-set with at least 1 empty/available arena-desc */
739     curr = aroot->curr++;
740     adesc = &(aroot->set[curr]);
741     assert(!adesc->arena);
742     
743     Newx(adesc->arena, arena_size, char);
744     adesc->size = arena_size;
745     adesc->utype = bodytype;
746     DEBUG_m(PerlIO_printf(Perl_debug_log, "arena %d added: %p size %"UVuf"\n", 
747                           curr, (void*)adesc->arena, (UV)arena_size));
748
749     return adesc->arena;
750 }
751
752
753 /* return a thing to the free list */
754
755 #define del_body(thing, root)                   \
756     STMT_START {                                \
757         void ** const thing_copy = (void **)thing;\
758         *thing_copy = *root;                    \
759         *root = (void*)thing_copy;              \
760     } STMT_END
761
762 /* 
763
764 =head1 SV-Body Allocation
765
766 Allocation of SV-bodies is similar to SV-heads, differing as follows;
767 the allocation mechanism is used for many body types, so is somewhat
768 more complicated, it uses arena-sets, and has no need for still-live
769 SV detection.
770
771 At the outermost level, (new|del)_X*V macros return bodies of the
772 appropriate type.  These macros call either (new|del)_body_type or
773 (new|del)_body_allocated macro pairs, depending on specifics of the
774 type.  Most body types use the former pair, the latter pair is used to
775 allocate body types with "ghost fields".
776
777 "ghost fields" are fields that are unused in certain types, and
778 consequently don't need to actually exist.  They are declared because
779 they're part of a "base type", which allows use of functions as
780 methods.  The simplest examples are AVs and HVs, 2 aggregate types
781 which don't use the fields which support SCALAR semantics.
782
783 For these types, the arenas are carved up into appropriately sized
784 chunks, we thus avoid wasted memory for those unaccessed members.
785 When bodies are allocated, we adjust the pointer back in memory by the
786 size of the part not allocated, so it's as if we allocated the full
787 structure.  (But things will all go boom if you write to the part that
788 is "not there", because you'll be overwriting the last members of the
789 preceding structure in memory.)
790
791 We calculate the correction using the STRUCT_OFFSET macro on the first
792 member present. If the allocated structure is smaller (no initial NV
793 actually allocated) then the net effect is to subtract the size of the NV
794 from the pointer, to return a new pointer as if an initial NV were actually
795 allocated. (We were using structures named *_allocated for this, but
796 this turned out to be a subtle bug, because a structure without an NV
797 could have a lower alignment constraint, but the compiler is allowed to
798 optimised accesses based on the alignment constraint of the actual pointer
799 to the full structure, for example, using a single 64 bit load instruction
800 because it "knows" that two adjacent 32 bit members will be 8-byte aligned.)
801
802 This is the same trick as was used for NV and IV bodies. Ironically it
803 doesn't need to be used for NV bodies any more, because NV is now at
804 the start of the structure. IV bodies don't need it either, because
805 they are no longer allocated.
806
807 In turn, the new_body_* allocators call S_new_body(), which invokes
808 new_body_inline macro, which takes a lock, and takes a body off the
809 linked list at PL_body_roots[sv_type], calling S_more_bodies() if
810 necessary to refresh an empty list.  Then the lock is released, and
811 the body is returned.
812
813 S_more_bodies calls get_arena(), and carves it up into an array of N
814 bodies, which it strings into a linked list.  It looks up arena-size
815 and body-size from the body_details table described below, thus
816 supporting the multiple body-types.
817
818 If PURIFY is defined, or PERL_ARENA_SIZE=0, arenas are not used, and
819 the (new|del)_X*V macros are mapped directly to malloc/free.
820
821 */
822
823 /* 
824
825 For each sv-type, struct body_details bodies_by_type[] carries
826 parameters which control these aspects of SV handling:
827
828 Arena_size determines whether arenas are used for this body type, and if
829 so, how big they are.  PURIFY or PERL_ARENA_SIZE=0 set this field to
830 zero, forcing individual mallocs and frees.
831
832 Body_size determines how big a body is, and therefore how many fit into
833 each arena.  Offset carries the body-pointer adjustment needed for
834 "ghost fields", and is used in *_allocated macros.
835
836 But its main purpose is to parameterize info needed in
837 Perl_sv_upgrade().  The info here dramatically simplifies the function
838 vs the implementation in 5.8.8, making it table-driven.  All fields
839 are used for this, except for arena_size.
840
841 For the sv-types that have no bodies, arenas are not used, so those
842 PL_body_roots[sv_type] are unused, and can be overloaded.  In
843 something of a special case, SVt_NULL is borrowed for HE arenas;
844 PL_body_roots[HE_SVSLOT=SVt_NULL] is filled by S_more_he, but the
845 bodies_by_type[SVt_NULL] slot is not used, as the table is not
846 available in hv.c.
847
848 */
849
850 struct body_details {
851     U8 body_size;       /* Size to allocate  */
852     U8 copy;            /* Size of structure to copy (may be shorter)  */
853     U8 offset;
854     unsigned int type : 4;          /* We have space for a sanity check.  */
855     unsigned int cant_upgrade : 1;  /* Cannot upgrade this type */
856     unsigned int zero_nv : 1;       /* zero the NV when upgrading from this */
857     unsigned int arena : 1;         /* Allocated from an arena */
858     size_t arena_size;              /* Size of arena to allocate */
859 };
860
861 #define HADNV FALSE
862 #define NONV TRUE
863
864
865 #ifdef PURIFY
866 /* With -DPURFIY we allocate everything directly, and don't use arenas.
867    This seems a rather elegant way to simplify some of the code below.  */
868 #define HASARENA FALSE
869 #else
870 #define HASARENA TRUE
871 #endif
872 #define NOARENA FALSE
873
874 /* Size the arenas to exactly fit a given number of bodies.  A count
875    of 0 fits the max number bodies into a PERL_ARENA_SIZE.block,
876    simplifying the default.  If count > 0, the arena is sized to fit
877    only that many bodies, allowing arenas to be used for large, rare
878    bodies (XPVFM, XPVIO) without undue waste.  The arena size is
879    limited by PERL_ARENA_SIZE, so we can safely oversize the
880    declarations.
881  */
882 #define FIT_ARENA0(body_size)                           \
883     ((size_t)(PERL_ARENA_SIZE / body_size) * body_size)
884 #define FIT_ARENAn(count,body_size)                     \
885     ( count * body_size <= PERL_ARENA_SIZE)             \
886     ? count * body_size                                 \
887     : FIT_ARENA0 (body_size)
888 #define FIT_ARENA(count,body_size)                      \
889     count                                               \
890     ? FIT_ARENAn (count, body_size)                     \
891     : FIT_ARENA0 (body_size)
892
893 /* Calculate the length to copy. Specifically work out the length less any
894    final padding the compiler needed to add.  See the comment in sv_upgrade
895    for why copying the padding proved to be a bug.  */
896
897 #define copy_length(type, last_member) \
898         STRUCT_OFFSET(type, last_member) \
899         + sizeof (((type*)SvANY((const SV *)0))->last_member)
900
901 static const struct body_details bodies_by_type[] = {
902     { sizeof(HE), 0, 0, SVt_NULL,
903       FALSE, NONV, NOARENA, FIT_ARENA(0, sizeof(HE)) },
904
905     /* The bind placeholder pretends to be an RV for now.
906        Also it's marked as "can't upgrade" to stop anyone using it before it's
907        implemented.  */
908     { 0, 0, 0, SVt_BIND, TRUE, NONV, NOARENA, 0 },
909
910     /* IVs are in the head, so the allocation size is 0.  */
911     { 0,
912       sizeof(IV), /* This is used to copy out the IV body.  */
913       STRUCT_OFFSET(XPVIV, xiv_iv), SVt_IV, FALSE, NONV,
914       NOARENA /* IVS don't need an arena  */, 0
915     },
916
917     /* 8 bytes on most ILP32 with IEEE doubles */
918     { sizeof(NV), sizeof(NV), 0, SVt_NV, FALSE, HADNV, HASARENA,
919       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(XPVIV, xpv_cur),
932       SVt_PVIV, FALSE, NONV, HASARENA,
933       FIT_ARENA(0, sizeof(XPV) - STRUCT_OFFSET(XPV, xpv_cur)) },
934
935     /* 20 */
936     { sizeof(XPVNV), copy_length(XPVNV, xiv_u), 0, SVt_PVNV, FALSE, HADNV,
937       HASARENA, FIT_ARENA(0, sizeof(XPVNV)) },
938
939     /* 28 */
940     { sizeof(XPVMG), copy_length(XPVMG, xmg_stash), 0, SVt_PVMG, FALSE, HADNV,
941       HASARENA, FIT_ARENA(0, sizeof(XPVMG)) },
942
943     /* something big */
944     { sizeof(regexp) - STRUCT_OFFSET(regexp, xpv_cur),
945       sizeof(regexp) - STRUCT_OFFSET(regexp, xpv_cur),
946       + STRUCT_OFFSET(regexp, xpv_cur),
947       SVt_REGEXP, FALSE, NONV, HASARENA,
948       FIT_ARENA(0, sizeof(regexp) - STRUCT_OFFSET(regexp, xpv_cur))
949     },
950
951     /* 48 */
952     { sizeof(XPVGV), sizeof(XPVGV), 0, SVt_PVGV, TRUE, HADNV,
953       HASARENA, FIT_ARENA(0, sizeof(XPVGV)) },
954     
955     /* 64 */
956     { sizeof(XPVLV), sizeof(XPVLV), 0, SVt_PVLV, TRUE, HADNV,
957       HASARENA, FIT_ARENA(0, sizeof(XPVLV)) },
958
959     { sizeof(XPVAV) - STRUCT_OFFSET(XPVAV, xav_fill),
960       copy_length(XPVAV, xmg_stash) - STRUCT_OFFSET(XPVAV, xav_fill),
961       + STRUCT_OFFSET(XPVAV, xav_fill),
962       SVt_PVAV, TRUE, NONV, HASARENA,
963       FIT_ARENA(0, sizeof(XPVAV) - STRUCT_OFFSET(XPVAV, xav_fill)) },
964
965     { sizeof(XPVHV) - STRUCT_OFFSET(XPVHV, xhv_fill),
966       copy_length(XPVHV, xmg_stash) - STRUCT_OFFSET(XPVHV, xhv_fill),
967       + STRUCT_OFFSET(XPVHV, xhv_fill),
968       SVt_PVHV, TRUE, NONV, HASARENA,
969       FIT_ARENA(0, sizeof(XPVHV) - STRUCT_OFFSET(XPVHV, xhv_fill)) },
970
971     /* 56 */
972     { sizeof(XPVCV) - STRUCT_OFFSET(XPVCV, xpv_cur),
973       sizeof(XPVCV) - STRUCT_OFFSET(XPVCV, xpv_cur),
974       + STRUCT_OFFSET(XPVCV, xpv_cur),
975       SVt_PVCV, TRUE, NONV, HASARENA,
976       FIT_ARENA(0, sizeof(XPVCV) - STRUCT_OFFSET(XPVCV, xpv_cur)) },
977
978     { sizeof(XPVFM) - STRUCT_OFFSET(XPVFM, xpv_cur),
979       sizeof(XPVFM) - STRUCT_OFFSET(XPVFM, xpv_cur),
980       + STRUCT_OFFSET(XPVFM, xpv_cur),
981       SVt_PVFM, TRUE, NONV, NOARENA,
982       FIT_ARENA(20, sizeof(XPVFM) - STRUCT_OFFSET(XPVFM, xpv_cur)) },
983
984     /* XPVIO is 84 bytes, fits 48x */
985     { sizeof(XPVIO) - STRUCT_OFFSET(XPVIO, xpv_cur),
986       sizeof(XPVIO) - STRUCT_OFFSET(XPVIO, xpv_cur),
987       + STRUCT_OFFSET(XPVIO, xpv_cur),
988       SVt_PVIO, TRUE, NONV, HASARENA,
989       FIT_ARENA(24, sizeof(XPVIO) - STRUCT_OFFSET(XPVIO, xpv_cur)) },
990 };
991
992 #define new_body_type(sv_type)          \
993     (void *)((char *)S_new_body(aTHX_ sv_type))
994
995 #define del_body_type(p, sv_type)       \
996     del_body(p, &PL_body_roots[sv_type])
997
998
999 #define new_body_allocated(sv_type)             \
1000     (void *)((char *)S_new_body(aTHX_ sv_type)  \
1001              - bodies_by_type[sv_type].offset)
1002
1003 #define del_body_allocated(p, sv_type)          \
1004     del_body(p + bodies_by_type[sv_type].offset, &PL_body_roots[sv_type])
1005
1006
1007 #define my_safemalloc(s)        (void*)safemalloc(s)
1008 #define my_safecalloc(s)        (void*)safecalloc(s, 1)
1009 #define my_safefree(p)  safefree((char*)p)
1010
1011 #ifdef PURIFY
1012
1013 #define new_XNV()       my_safemalloc(sizeof(XPVNV))
1014 #define del_XNV(p)      my_safefree(p)
1015
1016 #define new_XPVNV()     my_safemalloc(sizeof(XPVNV))
1017 #define del_XPVNV(p)    my_safefree(p)
1018
1019 #define new_XPVAV()     my_safemalloc(sizeof(XPVAV))
1020 #define del_XPVAV(p)    my_safefree(p)
1021
1022 #define new_XPVHV()     my_safemalloc(sizeof(XPVHV))
1023 #define del_XPVHV(p)    my_safefree(p)
1024
1025 #define new_XPVMG()     my_safemalloc(sizeof(XPVMG))
1026 #define del_XPVMG(p)    my_safefree(p)
1027
1028 #define new_XPVGV()     my_safemalloc(sizeof(XPVGV))
1029 #define del_XPVGV(p)    my_safefree(p)
1030
1031 #else /* !PURIFY */
1032
1033 #define new_XNV()       new_body_type(SVt_NV)
1034 #define del_XNV(p)      del_body_type(p, SVt_NV)
1035
1036 #define new_XPVNV()     new_body_type(SVt_PVNV)
1037 #define del_XPVNV(p)    del_body_type(p, SVt_PVNV)
1038
1039 #define new_XPVAV()     new_body_allocated(SVt_PVAV)
1040 #define del_XPVAV(p)    del_body_allocated(p, SVt_PVAV)
1041
1042 #define new_XPVHV()     new_body_allocated(SVt_PVHV)
1043 #define del_XPVHV(p)    del_body_allocated(p, SVt_PVHV)
1044
1045 #define new_XPVMG()     new_body_type(SVt_PVMG)
1046 #define del_XPVMG(p)    del_body_type(p, SVt_PVMG)
1047
1048 #define new_XPVGV()     new_body_type(SVt_PVGV)
1049 #define del_XPVGV(p)    del_body_type(p, SVt_PVGV)
1050
1051 #endif /* PURIFY */
1052
1053 /* no arena for you! */
1054
1055 #define new_NOARENA(details) \
1056         my_safemalloc((details)->body_size + (details)->offset)
1057 #define new_NOARENAZ(details) \
1058         my_safecalloc((details)->body_size + (details)->offset)
1059
1060 STATIC void *
1061 S_more_bodies (pTHX_ const svtype sv_type)
1062 {
1063     dVAR;
1064     void ** const root = &PL_body_roots[sv_type];
1065     const struct body_details * const bdp = &bodies_by_type[sv_type];
1066     const size_t body_size = bdp->body_size;
1067     char *start;
1068     const char *end;
1069     const size_t arena_size = Perl_malloc_good_size(bdp->arena_size);
1070 #if defined(DEBUGGING) && !defined(PERL_GLOBAL_STRUCT_PRIVATE)
1071     static bool done_sanity_check;
1072
1073     /* PERL_GLOBAL_STRUCT_PRIVATE cannot coexist with global
1074      * variables like done_sanity_check. */
1075     if (!done_sanity_check) {
1076         unsigned int i = SVt_LAST;
1077
1078         done_sanity_check = TRUE;
1079
1080         while (i--)
1081             assert (bodies_by_type[i].type == i);
1082     }
1083 #endif
1084
1085     assert(bdp->arena_size);
1086
1087     start = (char*) Perl_get_arena(aTHX_ arena_size, sv_type);
1088
1089     end = start + arena_size - 2 * body_size;
1090
1091     /* computed count doesnt reflect the 1st slot reservation */
1092 #if defined(MYMALLOC) || defined(HAS_MALLOC_GOOD_SIZE)
1093     DEBUG_m(PerlIO_printf(Perl_debug_log,
1094                           "arena %p end %p arena-size %d (from %d) type %d "
1095                           "size %d ct %d\n",
1096                           (void*)start, (void*)end, (int)arena_size,
1097                           (int)bdp->arena_size, sv_type, (int)body_size,
1098                           (int)arena_size / (int)body_size));
1099 #else
1100     DEBUG_m(PerlIO_printf(Perl_debug_log,
1101                           "arena %p end %p arena-size %d type %d size %d ct %d\n",
1102                           (void*)start, (void*)end,
1103                           (int)bdp->arena_size, sv_type, (int)body_size,
1104                           (int)bdp->arena_size / (int)body_size));
1105 #endif
1106     *root = (void *)start;
1107
1108     while (start <= end) {
1109         char * const next = start + body_size;
1110         *(void**) start = (void *)next;
1111         start = next;
1112     }
1113     *(void **)start = 0;
1114
1115     return *root;
1116 }
1117
1118 /* grab a new thing from the free list, allocating more if necessary.
1119    The inline version is used for speed in hot routines, and the
1120    function using it serves the rest (unless PURIFY).
1121 */
1122 #define new_body_inline(xpv, sv_type) \
1123     STMT_START { \
1124         void ** const r3wt = &PL_body_roots[sv_type]; \
1125         xpv = (PTR_TBL_ENT_t*) (*((void **)(r3wt))      \
1126           ? *((void **)(r3wt)) : more_bodies(sv_type)); \
1127         *(r3wt) = *(void**)(xpv); \
1128     } STMT_END
1129
1130 #ifndef PURIFY
1131
1132 STATIC void *
1133 S_new_body(pTHX_ const svtype sv_type)
1134 {
1135     dVAR;
1136     void *xpv;
1137     new_body_inline(xpv, sv_type);
1138     return xpv;
1139 }
1140
1141 #endif
1142
1143 static const struct body_details fake_rv =
1144     { 0, 0, 0, SVt_IV, FALSE, NONV, NOARENA, 0 };
1145
1146 /*
1147 =for apidoc sv_upgrade
1148
1149 Upgrade an SV to a more complex form.  Generally adds a new body type to the
1150 SV, then copies across as much information as possible from the old body.
1151 You generally want to use the C<SvUPGRADE> macro wrapper. See also C<svtype>.
1152
1153 =cut
1154 */
1155
1156 void
1157 Perl_sv_upgrade(pTHX_ register SV *const sv, svtype new_type)
1158 {
1159     dVAR;
1160     void*       old_body;
1161     void*       new_body;
1162     const svtype old_type = SvTYPE(sv);
1163     const struct body_details *new_type_details;
1164     const struct body_details *old_type_details
1165         = bodies_by_type + old_type;
1166     SV *referant = NULL;
1167
1168     PERL_ARGS_ASSERT_SV_UPGRADE;
1169
1170     if (old_type == new_type)
1171         return;
1172
1173     /* This clause was purposefully added ahead of the early return above to
1174        the shared string hackery for (sort {$a <=> $b} keys %hash), with the
1175        inference by Nick I-S that it would fix other troublesome cases. See
1176        changes 7162, 7163 (f130fd4589cf5fbb24149cd4db4137c8326f49c1 and parent)
1177
1178        Given that shared hash key scalars are no longer PVIV, but PV, there is
1179        no longer need to unshare so as to free up the IVX slot for its proper
1180        purpose. So it's safe to move the early return earlier.  */
1181
1182     if (new_type != SVt_PV && SvIsCOW(sv)) {
1183         sv_force_normal_flags(sv, 0);
1184     }
1185
1186     old_body = SvANY(sv);
1187
1188     /* Copying structures onto other structures that have been neatly zeroed
1189        has a subtle gotcha. Consider XPVMG
1190
1191        +------+------+------+------+------+-------+-------+
1192        |     NV      | CUR  | LEN  |  IV  | MAGIC | STASH |
1193        +------+------+------+------+------+-------+-------+
1194        0      4      8     12     16     20      24      28
1195
1196        where NVs are aligned to 8 bytes, so that sizeof that structure is
1197        actually 32 bytes long, with 4 bytes of padding at the end:
1198
1199        +------+------+------+------+------+-------+-------+------+
1200        |     NV      | CUR  | LEN  |  IV  | MAGIC | STASH | ???  |
1201        +------+------+------+------+------+-------+-------+------+
1202        0      4      8     12     16     20      24      28     32
1203
1204        so what happens if you allocate memory for this structure:
1205
1206        +------+------+------+------+------+-------+-------+------+------+...
1207        |     NV      | CUR  | LEN  |  IV  | MAGIC | STASH |  GP  | NAME |
1208        +------+------+------+------+------+-------+-------+------+------+...
1209        0      4      8     12     16     20      24      28     32     36
1210
1211        zero it, then copy sizeof(XPVMG) bytes on top of it? Not quite what you
1212        expect, because you copy the area marked ??? onto GP. Now, ??? may have
1213        started out as zero once, but it's quite possible that it isn't. So now,
1214        rather than a nicely zeroed GP, you have it pointing somewhere random.
1215        Bugs ensue.
1216
1217        (In fact, GP ends up pointing at a previous GP structure, because the
1218        principle cause of the padding in XPVMG getting garbage is a copy of
1219        sizeof(XPVMG) bytes from a XPVGV structure in sv_unglob. Right now
1220        this happens to be moot because XPVGV has been re-ordered, with GP
1221        no longer after STASH)
1222
1223        So we are careful and work out the size of used parts of all the
1224        structures.  */
1225
1226     switch (old_type) {
1227     case SVt_NULL:
1228         break;
1229     case SVt_IV:
1230         if (SvROK(sv)) {
1231             referant = SvRV(sv);
1232             old_type_details = &fake_rv;
1233             if (new_type == SVt_NV)
1234                 new_type = SVt_PVNV;
1235         } else {
1236             if (new_type < SVt_PVIV) {
1237                 new_type = (new_type == SVt_NV)
1238                     ? SVt_PVNV : SVt_PVIV;
1239             }
1240         }
1241         break;
1242     case SVt_NV:
1243         if (new_type < SVt_PVNV) {
1244             new_type = SVt_PVNV;
1245         }
1246         break;
1247     case SVt_PV:
1248         assert(new_type > SVt_PV);
1249         assert(SVt_IV < SVt_PV);
1250         assert(SVt_NV < SVt_PV);
1251         break;
1252     case SVt_PVIV:
1253         break;
1254     case SVt_PVNV:
1255         break;
1256     case SVt_PVMG:
1257         /* Because the XPVMG of PL_mess_sv isn't allocated from the arena,
1258            there's no way that it can be safely upgraded, because perl.c
1259            expects to Safefree(SvANY(PL_mess_sv))  */
1260         assert(sv != PL_mess_sv);
1261         /* This flag bit is used to mean other things in other scalar types.
1262            Given that it only has meaning inside the pad, it shouldn't be set
1263            on anything that can get upgraded.  */
1264         assert(!SvPAD_TYPED(sv));
1265         break;
1266     default:
1267         if (old_type_details->cant_upgrade)
1268             Perl_croak(aTHX_ "Can't upgrade %s (%" UVuf ") to %" UVuf,
1269                        sv_reftype(sv, 0), (UV) old_type, (UV) new_type);
1270     }
1271
1272     if (old_type > new_type)
1273         Perl_croak(aTHX_ "sv_upgrade from type %d down to type %d",
1274                 (int)old_type, (int)new_type);
1275
1276     new_type_details = bodies_by_type + new_type;
1277
1278     SvFLAGS(sv) &= ~SVTYPEMASK;
1279     SvFLAGS(sv) |= new_type;
1280
1281     /* This can't happen, as SVt_NULL is <= all values of new_type, so one of
1282        the return statements above will have triggered.  */
1283     assert (new_type != SVt_NULL);
1284     switch (new_type) {
1285     case SVt_IV:
1286         assert(old_type == SVt_NULL);
1287         SvANY(sv) = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
1288         SvIV_set(sv, 0);
1289         return;
1290     case SVt_NV:
1291         assert(old_type == SVt_NULL);
1292         SvANY(sv) = new_XNV();
1293         SvNV_set(sv, 0);
1294         return;
1295     case SVt_PVHV:
1296     case SVt_PVAV:
1297         assert(new_type_details->body_size);
1298
1299 #ifndef PURIFY  
1300         assert(new_type_details->arena);
1301         assert(new_type_details->arena_size);
1302         /* This points to the start of the allocated area.  */
1303         new_body_inline(new_body, new_type);
1304         Zero(new_body, new_type_details->body_size, char);
1305         new_body = ((char *)new_body) - new_type_details->offset;
1306 #else
1307         /* We always allocated the full length item with PURIFY. To do this
1308            we fake things so that arena is false for all 16 types..  */
1309         new_body = new_NOARENAZ(new_type_details);
1310 #endif
1311         SvANY(sv) = new_body;
1312         if (new_type == SVt_PVAV) {
1313             AvMAX(sv)   = -1;
1314             AvFILLp(sv) = -1;
1315             AvREAL_only(sv);
1316             if (old_type_details->body_size) {
1317                 AvALLOC(sv) = 0;
1318             } else {
1319                 /* It will have been zeroed when the new body was allocated.
1320                    Lets not write to it, in case it confuses a write-back
1321                    cache.  */
1322             }
1323         } else {
1324             assert(!SvOK(sv));
1325             SvOK_off(sv);
1326 #ifndef NODEFAULT_SHAREKEYS
1327             HvSHAREKEYS_on(sv);         /* key-sharing on by default */
1328 #endif
1329             HvMAX(sv) = 7; /* (start with 8 buckets) */
1330             if (old_type_details->body_size) {
1331                 HvFILL(sv) = 0;
1332             } else {
1333                 /* It will have been zeroed when the new body was allocated.
1334                    Lets not write to it, in case it confuses a write-back
1335                    cache.  */
1336             }
1337         }
1338
1339         /* SVt_NULL isn't the only thing upgraded to AV or HV.
1340            The target created by newSVrv also is, and it can have magic.
1341            However, it never has SvPVX set.
1342         */
1343         if (old_type == SVt_IV) {
1344             assert(!SvROK(sv));
1345         } else if (old_type >= SVt_PV) {
1346             assert(SvPVX_const(sv) == 0);
1347         }
1348
1349         if (old_type >= SVt_PVMG) {
1350             SvMAGIC_set(sv, ((XPVMG*)old_body)->xmg_u.xmg_magic);
1351             SvSTASH_set(sv, ((XPVMG*)old_body)->xmg_stash);
1352         } else {
1353             sv->sv_u.svu_array = NULL; /* or svu_hash  */
1354         }
1355         break;
1356
1357
1358     case SVt_REGEXP:
1359         /* This ensures that SvTHINKFIRST(sv) is true, and hence that
1360            sv_force_normal_flags(sv) is called.  */
1361         SvFAKE_on(sv);
1362     case SVt_PVIV:
1363         /* XXX Is this still needed?  Was it ever needed?   Surely as there is
1364            no route from NV to PVIV, NOK can never be true  */
1365         assert(!SvNOKp(sv));
1366         assert(!SvNOK(sv));
1367     case SVt_PVIO:
1368     case SVt_PVFM:
1369     case SVt_PVGV:
1370     case SVt_PVCV:
1371     case SVt_PVLV:
1372     case SVt_PVMG:
1373     case SVt_PVNV:
1374     case SVt_PV:
1375
1376         assert(new_type_details->body_size);
1377         /* We always allocated the full length item with PURIFY. To do this
1378            we fake things so that arena is false for all 16 types..  */
1379         if(new_type_details->arena) {
1380             /* This points to the start of the allocated area.  */
1381             new_body_inline(new_body, new_type);
1382             Zero(new_body, new_type_details->body_size, char);
1383             new_body = ((char *)new_body) - new_type_details->offset;
1384         } else {
1385             new_body = new_NOARENAZ(new_type_details);
1386         }
1387         SvANY(sv) = new_body;
1388
1389         if (old_type_details->copy) {
1390             /* There is now the potential for an upgrade from something without
1391                an offset (PVNV or PVMG) to something with one (PVCV, PVFM)  */
1392             int offset = old_type_details->offset;
1393             int length = old_type_details->copy;
1394
1395             if (new_type_details->offset > old_type_details->offset) {
1396                 const int difference
1397                     = new_type_details->offset - old_type_details->offset;
1398                 offset += difference;
1399                 length -= difference;
1400             }
1401             assert (length >= 0);
1402                 
1403             Copy((char *)old_body + offset, (char *)new_body + offset, length,
1404                  char);
1405         }
1406
1407 #ifndef NV_ZERO_IS_ALLBITS_ZERO
1408         /* If NV 0.0 is stores as all bits 0 then Zero() already creates a
1409          * correct 0.0 for us.  Otherwise, if the old body didn't have an
1410          * NV slot, but the new one does, then we need to initialise the
1411          * freshly created NV slot with whatever the correct bit pattern is
1412          * for 0.0  */
1413         if (old_type_details->zero_nv && !new_type_details->zero_nv
1414             && !isGV_with_GP(sv))
1415             SvNV_set(sv, 0);
1416 #endif
1417
1418         if (new_type == SVt_PVIO) {
1419             IO * const io = MUTABLE_IO(sv);
1420             GV *iogv = gv_fetchpvs("IO::File::", GV_ADD, SVt_PVHV);
1421
1422             SvOBJECT_on(io);
1423             /* Clear the stashcache because a new IO could overrule a package
1424                name */
1425             hv_clear(PL_stashcache);
1426
1427             SvSTASH_set(io, MUTABLE_HV(SvREFCNT_inc(GvHV(iogv))));
1428             IoPAGE_LEN(sv) = 60;
1429         }
1430         if (old_type < SVt_PV) {
1431             /* referant will be NULL unless the old type was SVt_IV emulating
1432                SVt_RV */
1433             sv->sv_u.svu_rv = referant;
1434         }
1435         break;
1436     default:
1437         Perl_croak(aTHX_ "panic: sv_upgrade to unknown type %lu",
1438                    (unsigned long)new_type);
1439     }
1440
1441     if (old_type > SVt_IV) {
1442 #ifdef PURIFY
1443         my_safefree(old_body);
1444 #else
1445         /* Note that there is an assumption that all bodies of types that
1446            can be upgraded came from arenas. Only the more complex non-
1447            upgradable types are allowed to be directly malloc()ed.  */
1448         assert(old_type_details->arena);
1449         del_body((void*)((char*)old_body + old_type_details->offset),
1450                  &PL_body_roots[old_type]);
1451 #endif
1452     }
1453 }
1454
1455 /*
1456 =for apidoc sv_backoff
1457
1458 Remove any string offset. You should normally use the C<SvOOK_off> macro
1459 wrapper instead.
1460
1461 =cut
1462 */
1463
1464 int
1465 Perl_sv_backoff(pTHX_ register SV *const sv)
1466 {
1467     STRLEN delta;
1468     const char * const s = SvPVX_const(sv);
1469
1470     PERL_ARGS_ASSERT_SV_BACKOFF;
1471     PERL_UNUSED_CONTEXT;
1472
1473     assert(SvOOK(sv));
1474     assert(SvTYPE(sv) != SVt_PVHV);
1475     assert(SvTYPE(sv) != SVt_PVAV);
1476
1477     SvOOK_offset(sv, delta);
1478     
1479     SvLEN_set(sv, SvLEN(sv) + delta);
1480     SvPV_set(sv, SvPVX(sv) - delta);
1481     Move(s, SvPVX(sv), SvCUR(sv)+1, char);
1482     SvFLAGS(sv) &= ~SVf_OOK;
1483     return 0;
1484 }
1485
1486 /*
1487 =for apidoc sv_grow
1488
1489 Expands the character buffer in the SV.  If necessary, uses C<sv_unref> and
1490 upgrades the SV to C<SVt_PV>.  Returns a pointer to the character buffer.
1491 Use the C<SvGROW> wrapper instead.
1492
1493 =cut
1494 */
1495
1496 char *
1497 Perl_sv_grow(pTHX_ register SV *const sv, register STRLEN newlen)
1498 {
1499     register char *s;
1500
1501     PERL_ARGS_ASSERT_SV_GROW;
1502
1503     if (PL_madskills && newlen >= 0x100000) {
1504         PerlIO_printf(Perl_debug_log,
1505                       "Allocation too large: %"UVxf"\n", (UV)newlen);
1506     }
1507 #ifdef HAS_64K_LIMIT
1508     if (newlen >= 0x10000) {
1509         PerlIO_printf(Perl_debug_log,
1510                       "Allocation too large: %"UVxf"\n", (UV)newlen);
1511         my_exit(1);
1512     }
1513 #endif /* HAS_64K_LIMIT */
1514     if (SvROK(sv))
1515         sv_unref(sv);
1516     if (SvTYPE(sv) < SVt_PV) {
1517         sv_upgrade(sv, SVt_PV);
1518         s = SvPVX_mutable(sv);
1519     }
1520     else if (SvOOK(sv)) {       /* pv is offset? */
1521         sv_backoff(sv);
1522         s = SvPVX_mutable(sv);
1523         if (newlen > SvLEN(sv))
1524             newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
1525 #ifdef HAS_64K_LIMIT
1526         if (newlen >= 0x10000)
1527             newlen = 0xFFFF;
1528 #endif
1529     }
1530     else
1531         s = SvPVX_mutable(sv);
1532
1533     if (newlen > SvLEN(sv)) {           /* need more room? */
1534 #ifndef Perl_safesysmalloc_size
1535         newlen = PERL_STRLEN_ROUNDUP(newlen);
1536 #endif
1537         if (SvLEN(sv) && s) {
1538             s = (char*)saferealloc(s, newlen);
1539         }
1540         else {
1541             s = (char*)safemalloc(newlen);
1542             if (SvPVX_const(sv) && SvCUR(sv)) {
1543                 Move(SvPVX_const(sv), s, (newlen < SvCUR(sv)) ? newlen : SvCUR(sv), char);
1544             }
1545         }
1546         SvPV_set(sv, s);
1547 #ifdef Perl_safesysmalloc_size
1548         /* Do this here, do it once, do it right, and then we will never get
1549            called back into sv_grow() unless there really is some growing
1550            needed.  */
1551         SvLEN_set(sv, Perl_safesysmalloc_size(s));
1552 #else
1553         SvLEN_set(sv, newlen);
1554 #endif
1555     }
1556     return s;
1557 }
1558
1559 /*
1560 =for apidoc sv_setiv
1561
1562 Copies an integer into the given SV, upgrading first if necessary.
1563 Does not handle 'set' magic.  See also C<sv_setiv_mg>.
1564
1565 =cut
1566 */
1567
1568 void
1569 Perl_sv_setiv(pTHX_ register SV *const sv, const IV i)
1570 {
1571     dVAR;
1572
1573     PERL_ARGS_ASSERT_SV_SETIV;
1574
1575     SV_CHECK_THINKFIRST_COW_DROP(sv);
1576     switch (SvTYPE(sv)) {
1577     case SVt_NULL:
1578     case SVt_NV:
1579         sv_upgrade(sv, SVt_IV);
1580         break;
1581     case SVt_PV:
1582         sv_upgrade(sv, SVt_PVIV);
1583         break;
1584
1585     case SVt_PVGV:
1586         if (!isGV_with_GP(sv))
1587             break;
1588     case SVt_PVAV:
1589     case SVt_PVHV:
1590     case SVt_PVCV:
1591     case SVt_PVFM:
1592     case SVt_PVIO:
1593         Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
1594                    OP_DESC(PL_op));
1595     default: NOOP;
1596     }
1597     (void)SvIOK_only(sv);                       /* validate number */
1598     SvIV_set(sv, i);
1599     SvTAINT(sv);
1600 }
1601
1602 /*
1603 =for apidoc sv_setiv_mg
1604
1605 Like C<sv_setiv>, but also handles 'set' magic.
1606
1607 =cut
1608 */
1609
1610 void
1611 Perl_sv_setiv_mg(pTHX_ register SV *const sv, const IV i)
1612 {
1613     PERL_ARGS_ASSERT_SV_SETIV_MG;
1614
1615     sv_setiv(sv,i);
1616     SvSETMAGIC(sv);
1617 }
1618
1619 /*
1620 =for apidoc sv_setuv
1621
1622 Copies an unsigned integer into the given SV, upgrading first if necessary.
1623 Does not handle 'set' magic.  See also C<sv_setuv_mg>.
1624
1625 =cut
1626 */
1627
1628 void
1629 Perl_sv_setuv(pTHX_ register SV *const sv, const UV u)
1630 {
1631     PERL_ARGS_ASSERT_SV_SETUV;
1632
1633     /* With these two if statements:
1634        u=1.49  s=0.52  cu=72.49  cs=10.64  scripts=270  tests=20865
1635
1636        without
1637        u=1.35  s=0.47  cu=73.45  cs=11.43  scripts=270  tests=20865
1638
1639        If you wish to remove them, please benchmark to see what the effect is
1640     */
1641     if (u <= (UV)IV_MAX) {
1642        sv_setiv(sv, (IV)u);
1643        return;
1644     }
1645     sv_setiv(sv, 0);
1646     SvIsUV_on(sv);
1647     SvUV_set(sv, u);
1648 }
1649
1650 /*
1651 =for apidoc sv_setuv_mg
1652
1653 Like C<sv_setuv>, but also handles 'set' magic.
1654
1655 =cut
1656 */
1657
1658 void
1659 Perl_sv_setuv_mg(pTHX_ register SV *const sv, const UV u)
1660 {
1661     PERL_ARGS_ASSERT_SV_SETUV_MG;
1662
1663     sv_setuv(sv,u);
1664     SvSETMAGIC(sv);
1665 }
1666
1667 /*
1668 =for apidoc sv_setnv
1669
1670 Copies a double into the given SV, upgrading first if necessary.
1671 Does not handle 'set' magic.  See also C<sv_setnv_mg>.
1672
1673 =cut
1674 */
1675
1676 void
1677 Perl_sv_setnv(pTHX_ register SV *const sv, const NV num)
1678 {
1679     dVAR;
1680
1681     PERL_ARGS_ASSERT_SV_SETNV;
1682
1683     SV_CHECK_THINKFIRST_COW_DROP(sv);
1684     switch (SvTYPE(sv)) {
1685     case SVt_NULL:
1686     case SVt_IV:
1687         sv_upgrade(sv, SVt_NV);
1688         break;
1689     case SVt_PV:
1690     case SVt_PVIV:
1691         sv_upgrade(sv, SVt_PVNV);
1692         break;
1693
1694     case SVt_PVGV:
1695         if (!isGV_with_GP(sv))
1696             break;
1697     case SVt_PVAV:
1698     case SVt_PVHV:
1699     case SVt_PVCV:
1700     case SVt_PVFM:
1701     case SVt_PVIO:
1702         Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
1703                    OP_DESC(PL_op));
1704     default: NOOP;
1705     }
1706     SvNV_set(sv, num);
1707     (void)SvNOK_only(sv);                       /* validate number */
1708     SvTAINT(sv);
1709 }
1710
1711 /*
1712 =for apidoc sv_setnv_mg
1713
1714 Like C<sv_setnv>, but also handles 'set' magic.
1715
1716 =cut
1717 */
1718
1719 void
1720 Perl_sv_setnv_mg(pTHX_ register SV *const sv, const NV num)
1721 {
1722     PERL_ARGS_ASSERT_SV_SETNV_MG;
1723
1724     sv_setnv(sv,num);
1725     SvSETMAGIC(sv);
1726 }
1727
1728 /* Print an "isn't numeric" warning, using a cleaned-up,
1729  * printable version of the offending string
1730  */
1731
1732 STATIC void
1733 S_not_a_number(pTHX_ SV *const sv)
1734 {
1735      dVAR;
1736      SV *dsv;
1737      char tmpbuf[64];
1738      const char *pv;
1739
1740      PERL_ARGS_ASSERT_NOT_A_NUMBER;
1741
1742      if (DO_UTF8(sv)) {
1743           dsv = newSVpvs_flags("", SVs_TEMP);
1744           pv = sv_uni_display(dsv, sv, 10, 0);
1745      } else {
1746           char *d = tmpbuf;
1747           const char * const limit = tmpbuf + sizeof(tmpbuf) - 8;
1748           /* each *s can expand to 4 chars + "...\0",
1749              i.e. need room for 8 chars */
1750         
1751           const char *s = SvPVX_const(sv);
1752           const char * const end = s + SvCUR(sv);
1753           for ( ; s < end && d < limit; s++ ) {
1754                int ch = *s & 0xFF;
1755                if (ch & 128 && !isPRINT_LC(ch)) {
1756                     *d++ = 'M';
1757                     *d++ = '-';
1758                     ch &= 127;
1759                }
1760                if (ch == '\n') {
1761                     *d++ = '\\';
1762                     *d++ = 'n';
1763                }
1764                else if (ch == '\r') {
1765                     *d++ = '\\';
1766                     *d++ = 'r';
1767                }
1768                else if (ch == '\f') {
1769                     *d++ = '\\';
1770                     *d++ = 'f';
1771                }
1772                else if (ch == '\\') {
1773                     *d++ = '\\';
1774                     *d++ = '\\';
1775                }
1776                else if (ch == '\0') {
1777                     *d++ = '\\';
1778                     *d++ = '0';
1779                }
1780                else if (isPRINT_LC(ch))
1781                     *d++ = ch;
1782                else {
1783                     *d++ = '^';
1784                     *d++ = toCTRL(ch);
1785                }
1786           }
1787           if (s < end) {
1788                *d++ = '.';
1789                *d++ = '.';
1790                *d++ = '.';
1791           }
1792           *d = '\0';
1793           pv = tmpbuf;
1794     }
1795
1796     if (PL_op)
1797         Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
1798                     "Argument \"%s\" isn't numeric in %s", pv,
1799                     OP_DESC(PL_op));
1800     else
1801         Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
1802                     "Argument \"%s\" isn't numeric", pv);
1803 }
1804
1805 /*
1806 =for apidoc looks_like_number
1807
1808 Test if the content of an SV looks like a number (or is a number).
1809 C<Inf> and C<Infinity> are treated as numbers (so will not issue a
1810 non-numeric warning), even if your atof() doesn't grok them.
1811
1812 =cut
1813 */
1814
1815 I32
1816 Perl_looks_like_number(pTHX_ SV *const sv)
1817 {
1818     register const char *sbegin;
1819     STRLEN len;
1820
1821     PERL_ARGS_ASSERT_LOOKS_LIKE_NUMBER;
1822
1823     if (SvPOK(sv)) {
1824         sbegin = SvPVX_const(sv);
1825         len = SvCUR(sv);
1826     }
1827     else if (SvPOKp(sv))
1828         sbegin = SvPV_const(sv, len);
1829     else
1830         return SvFLAGS(sv) & (SVf_NOK|SVp_NOK|SVf_IOK|SVp_IOK);
1831     return grok_number(sbegin, len, NULL);
1832 }
1833
1834 STATIC bool
1835 S_glob_2number(pTHX_ GV * const gv)
1836 {
1837     const U32 wasfake = SvFLAGS(gv) & SVf_FAKE;
1838     SV *const buffer = sv_newmortal();
1839
1840     PERL_ARGS_ASSERT_GLOB_2NUMBER;
1841
1842     /* FAKE globs can get coerced, so need to turn this off temporarily if it
1843        is on.  */
1844     SvFAKE_off(gv);
1845     gv_efullname3(buffer, gv, "*");
1846     SvFLAGS(gv) |= wasfake;
1847
1848     /* We know that all GVs stringify to something that is not-a-number,
1849         so no need to test that.  */
1850     if (ckWARN(WARN_NUMERIC))
1851         not_a_number(buffer);
1852     /* We just want something true to return, so that S_sv_2iuv_common
1853         can tail call us and return true.  */
1854     return TRUE;
1855 }
1856
1857 /* Actually, ISO C leaves conversion of UV to IV undefined, but
1858    until proven guilty, assume that things are not that bad... */
1859
1860 /*
1861    NV_PRESERVES_UV:
1862
1863    As 64 bit platforms often have an NV that doesn't preserve all bits of
1864    an IV (an assumption perl has been based on to date) it becomes necessary
1865    to remove the assumption that the NV always carries enough precision to
1866    recreate the IV whenever needed, and that the NV is the canonical form.
1867    Instead, IV/UV and NV need to be given equal rights. So as to not lose
1868    precision as a side effect of conversion (which would lead to insanity
1869    and the dragon(s) in t/op/numconvert.t getting very angry) the intent is
1870    1) to distinguish between IV/UV/NV slots that have cached a valid
1871       conversion where precision was lost and IV/UV/NV slots that have a
1872       valid conversion which has lost no precision
1873    2) to ensure that if a numeric conversion to one form is requested that
1874       would lose precision, the precise conversion (or differently
1875       imprecise conversion) is also performed and cached, to prevent
1876       requests for different numeric formats on the same SV causing
1877       lossy conversion chains. (lossless conversion chains are perfectly
1878       acceptable (still))
1879
1880
1881    flags are used:
1882    SvIOKp is true if the IV slot contains a valid value
1883    SvIOK  is true only if the IV value is accurate (UV if SvIOK_UV true)
1884    SvNOKp is true if the NV slot contains a valid value
1885    SvNOK  is true only if the NV value is accurate
1886
1887    so
1888    while converting from PV to NV, check to see if converting that NV to an
1889    IV(or UV) would lose accuracy over a direct conversion from PV to
1890    IV(or UV). If it would, cache both conversions, return NV, but mark
1891    SV as IOK NOKp (ie not NOK).
1892
1893    While converting from PV to IV, check to see if converting that IV to an
1894    NV would lose accuracy over a direct conversion from PV to NV. If it
1895    would, cache both conversions, flag similarly.
1896
1897    Before, the SV value "3.2" could become NV=3.2 IV=3 NOK, IOK quite
1898    correctly because if IV & NV were set NV *always* overruled.
1899    Now, "3.2" will become NV=3.2 IV=3 NOK, IOKp, because the flag's meaning
1900    changes - now IV and NV together means that the two are interchangeable:
1901    SvIVX == (IV) SvNVX && SvNVX == (NV) SvIVX;
1902
1903    The benefit of this is that operations such as pp_add know that if
1904    SvIOK is true for both left and right operands, then integer addition
1905    can be used instead of floating point (for cases where the result won't
1906    overflow). Before, floating point was always used, which could lead to
1907    loss of precision compared with integer addition.
1908
1909    * making IV and NV equal status should make maths accurate on 64 bit
1910      platforms
1911    * may speed up maths somewhat if pp_add and friends start to use
1912      integers when possible instead of fp. (Hopefully the overhead in
1913      looking for SvIOK and checking for overflow will not outweigh the
1914      fp to integer speedup)
1915    * will slow down integer operations (callers of SvIV) on "inaccurate"
1916      values, as the change from SvIOK to SvIOKp will cause a call into
1917      sv_2iv each time rather than a macro access direct to the IV slot
1918    * should speed up number->string conversion on integers as IV is
1919      favoured when IV and NV are equally accurate
1920
1921    ####################################################################
1922    You had better be using SvIOK_notUV if you want an IV for arithmetic:
1923    SvIOK is true if (IV or UV), so you might be getting (IV)SvUV.
1924    On the other hand, SvUOK is true iff UV.
1925    ####################################################################
1926
1927    Your mileage will vary depending your CPU's relative fp to integer
1928    performance ratio.
1929 */
1930
1931 #ifndef NV_PRESERVES_UV
1932 #  define IS_NUMBER_UNDERFLOW_IV 1
1933 #  define IS_NUMBER_UNDERFLOW_UV 2
1934 #  define IS_NUMBER_IV_AND_UV    2
1935 #  define IS_NUMBER_OVERFLOW_IV  4
1936 #  define IS_NUMBER_OVERFLOW_UV  5
1937
1938 /* sv_2iuv_non_preserve(): private routine for use by sv_2iv() and sv_2uv() */
1939
1940 /* For sv_2nv these three cases are "SvNOK and don't bother casting"  */
1941 STATIC int
1942 S_sv_2iuv_non_preserve(pTHX_ register SV *const sv
1943 #  ifdef DEBUGGING
1944                        , I32 numtype
1945 #  endif
1946                        )
1947 {
1948     dVAR;
1949
1950     PERL_ARGS_ASSERT_SV_2IUV_NON_PRESERVE;
1951
1952     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));
1953     if (SvNVX(sv) < (NV)IV_MIN) {
1954         (void)SvIOKp_on(sv);
1955         (void)SvNOK_on(sv);
1956         SvIV_set(sv, IV_MIN);
1957         return IS_NUMBER_UNDERFLOW_IV;
1958     }
1959     if (SvNVX(sv) > (NV)UV_MAX) {
1960         (void)SvIOKp_on(sv);
1961         (void)SvNOK_on(sv);
1962         SvIsUV_on(sv);
1963         SvUV_set(sv, UV_MAX);
1964         return IS_NUMBER_OVERFLOW_UV;
1965     }
1966     (void)SvIOKp_on(sv);
1967     (void)SvNOK_on(sv);
1968     /* Can't use strtol etc to convert this string.  (See truth table in
1969        sv_2iv  */
1970     if (SvNVX(sv) <= (UV)IV_MAX) {
1971         SvIV_set(sv, I_V(SvNVX(sv)));
1972         if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
1973             SvIOK_on(sv); /* Integer is precise. NOK, IOK */
1974         } else {
1975             /* Integer is imprecise. NOK, IOKp */
1976         }
1977         return SvNVX(sv) < 0 ? IS_NUMBER_UNDERFLOW_UV : IS_NUMBER_IV_AND_UV;
1978     }
1979     SvIsUV_on(sv);
1980     SvUV_set(sv, U_V(SvNVX(sv)));
1981     if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
1982         if (SvUVX(sv) == UV_MAX) {
1983             /* As we know that NVs don't preserve UVs, UV_MAX cannot
1984                possibly be preserved by NV. Hence, it must be overflow.
1985                NOK, IOKp */
1986             return IS_NUMBER_OVERFLOW_UV;
1987         }
1988         SvIOK_on(sv); /* Integer is precise. NOK, UOK */
1989     } else {
1990         /* Integer is imprecise. NOK, IOKp */
1991     }
1992     return IS_NUMBER_OVERFLOW_IV;
1993 }
1994 #endif /* !NV_PRESERVES_UV*/
1995
1996 STATIC bool
1997 S_sv_2iuv_common(pTHX_ SV *const sv)
1998 {
1999     dVAR;
2000
2001     PERL_ARGS_ASSERT_SV_2IUV_COMMON;
2002
2003     if (SvNOKp(sv)) {
2004         /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
2005          * without also getting a cached IV/UV from it at the same time
2006          * (ie PV->NV conversion should detect loss of accuracy and cache
2007          * IV or UV at same time to avoid this. */
2008         /* IV-over-UV optimisation - choose to cache IV if possible */
2009
2010         if (SvTYPE(sv) == SVt_NV)
2011             sv_upgrade(sv, SVt_PVNV);
2012
2013         (void)SvIOKp_on(sv);    /* Must do this first, to clear any SvOOK */
2014         /* < not <= as for NV doesn't preserve UV, ((NV)IV_MAX+1) will almost
2015            certainly cast into the IV range at IV_MAX, whereas the correct
2016            answer is the UV IV_MAX +1. Hence < ensures that dodgy boundary
2017            cases go to UV */
2018 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2019         if (Perl_isnan(SvNVX(sv))) {
2020             SvUV_set(sv, 0);
2021             SvIsUV_on(sv);
2022             return FALSE;
2023         }
2024 #endif
2025         if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2026             SvIV_set(sv, I_V(SvNVX(sv)));
2027             if (SvNVX(sv) == (NV) SvIVX(sv)
2028 #ifndef NV_PRESERVES_UV
2029                 && (((UV)1 << NV_PRESERVES_UV_BITS) >
2030                     (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
2031                 /* Don't flag it as "accurately an integer" if the number
2032                    came from a (by definition imprecise) NV operation, and
2033                    we're outside the range of NV integer precision */
2034 #endif
2035                 ) {
2036                 if (SvNOK(sv))
2037                     SvIOK_on(sv);  /* Can this go wrong with rounding? NWC */
2038                 else {
2039                     /* scalar has trailing garbage, eg "42a" */
2040                 }
2041                 DEBUG_c(PerlIO_printf(Perl_debug_log,
2042                                       "0x%"UVxf" iv(%"NVgf" => %"IVdf") (precise)\n",
2043                                       PTR2UV(sv),
2044                                       SvNVX(sv),
2045                                       SvIVX(sv)));
2046
2047             } else {
2048                 /* IV not precise.  No need to convert from PV, as NV
2049                    conversion would already have cached IV if it detected
2050                    that PV->IV would be better than PV->NV->IV
2051                    flags already correct - don't set public IOK.  */
2052                 DEBUG_c(PerlIO_printf(Perl_debug_log,
2053                                       "0x%"UVxf" iv(%"NVgf" => %"IVdf") (imprecise)\n",
2054                                       PTR2UV(sv),
2055                                       SvNVX(sv),
2056                                       SvIVX(sv)));
2057             }
2058             /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
2059                but the cast (NV)IV_MIN rounds to a the value less (more
2060                negative) than IV_MIN which happens to be equal to SvNVX ??
2061                Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
2062                NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
2063                (NV)UVX == NVX are both true, but the values differ. :-(
2064                Hopefully for 2s complement IV_MIN is something like
2065                0x8000000000000000 which will be exact. NWC */
2066         }
2067         else {
2068             SvUV_set(sv, U_V(SvNVX(sv)));
2069             if (
2070                 (SvNVX(sv) == (NV) SvUVX(sv))
2071 #ifndef  NV_PRESERVES_UV
2072                 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
2073                 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
2074                 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
2075                 /* Don't flag it as "accurately an integer" if the number
2076                    came from a (by definition imprecise) NV operation, and
2077                    we're outside the range of NV integer precision */
2078 #endif
2079                 && SvNOK(sv)
2080                 )
2081                 SvIOK_on(sv);
2082             SvIsUV_on(sv);
2083             DEBUG_c(PerlIO_printf(Perl_debug_log,
2084                                   "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
2085                                   PTR2UV(sv),
2086                                   SvUVX(sv),
2087                                   SvUVX(sv)));
2088         }
2089     }
2090     else if (SvPOKp(sv) && SvLEN(sv)) {
2091         UV value;
2092         const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2093         /* We want to avoid a possible problem when we cache an IV/ a UV which
2094            may be later translated to an NV, and the resulting NV is not
2095            the same as the direct translation of the initial string
2096            (eg 123.456 can shortcut to the IV 123 with atol(), but we must
2097            be careful to ensure that the value with the .456 is around if the
2098            NV value is requested in the future).
2099         
2100            This means that if we cache such an IV/a UV, we need to cache the
2101            NV as well.  Moreover, we trade speed for space, and do not
2102            cache the NV if we are sure it's not needed.
2103          */
2104
2105         /* SVt_PVNV is one higher than SVt_PVIV, hence this order  */
2106         if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2107              == IS_NUMBER_IN_UV) {
2108             /* It's definitely an integer, only upgrade to PVIV */
2109             if (SvTYPE(sv) < SVt_PVIV)
2110                 sv_upgrade(sv, SVt_PVIV);
2111             (void)SvIOK_on(sv);
2112         } else if (SvTYPE(sv) < SVt_PVNV)
2113             sv_upgrade(sv, SVt_PVNV);
2114
2115         /* If NVs preserve UVs then we only use the UV value if we know that
2116            we aren't going to call atof() below. If NVs don't preserve UVs
2117            then the value returned may have more precision than atof() will
2118            return, even though value isn't perfectly accurate.  */
2119         if ((numtype & (IS_NUMBER_IN_UV
2120 #ifdef NV_PRESERVES_UV
2121                         | IS_NUMBER_NOT_INT
2122 #endif
2123             )) == IS_NUMBER_IN_UV) {
2124             /* This won't turn off the public IOK flag if it was set above  */
2125             (void)SvIOKp_on(sv);
2126
2127             if (!(numtype & IS_NUMBER_NEG)) {
2128                 /* positive */;
2129                 if (value <= (UV)IV_MAX) {
2130                     SvIV_set(sv, (IV)value);
2131                 } else {
2132                     /* it didn't overflow, and it was positive. */
2133                     SvUV_set(sv, value);
2134                     SvIsUV_on(sv);
2135                 }
2136             } else {
2137                 /* 2s complement assumption  */
2138                 if (value <= (UV)IV_MIN) {
2139                     SvIV_set(sv, -(IV)value);
2140                 } else {
2141                     /* Too negative for an IV.  This is a double upgrade, but
2142                        I'm assuming it will be rare.  */
2143                     if (SvTYPE(sv) < SVt_PVNV)
2144                         sv_upgrade(sv, SVt_PVNV);
2145                     SvNOK_on(sv);
2146                     SvIOK_off(sv);
2147                     SvIOKp_on(sv);
2148                     SvNV_set(sv, -(NV)value);
2149                     SvIV_set(sv, IV_MIN);
2150                 }
2151             }
2152         }
2153         /* For !NV_PRESERVES_UV and IS_NUMBER_IN_UV and IS_NUMBER_NOT_INT we
2154            will be in the previous block to set the IV slot, and the next
2155            block to set the NV slot.  So no else here.  */
2156         
2157         if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2158             != IS_NUMBER_IN_UV) {
2159             /* It wasn't an (integer that doesn't overflow the UV). */
2160             SvNV_set(sv, Atof(SvPVX_const(sv)));
2161
2162             if (! numtype && ckWARN(WARN_NUMERIC))
2163                 not_a_number(sv);
2164
2165 #if defined(USE_LONG_DOUBLE)
2166             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%" PERL_PRIgldbl ")\n",
2167                                   PTR2UV(sv), SvNVX(sv)));
2168 #else
2169             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"NVgf")\n",
2170                                   PTR2UV(sv), SvNVX(sv)));
2171 #endif
2172
2173 #ifdef NV_PRESERVES_UV
2174             (void)SvIOKp_on(sv);
2175             (void)SvNOK_on(sv);
2176             if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2177                 SvIV_set(sv, I_V(SvNVX(sv)));
2178                 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2179                     SvIOK_on(sv);
2180                 } else {
2181                     NOOP;  /* Integer is imprecise. NOK, IOKp */
2182                 }
2183                 /* UV will not work better than IV */
2184             } else {
2185                 if (SvNVX(sv) > (NV)UV_MAX) {
2186                     SvIsUV_on(sv);
2187                     /* Integer is inaccurate. NOK, IOKp, is UV */
2188                     SvUV_set(sv, UV_MAX);
2189                 } else {
2190                     SvUV_set(sv, U_V(SvNVX(sv)));
2191                     /* 0xFFFFFFFFFFFFFFFF not an issue in here, NVs
2192                        NV preservse UV so can do correct comparison.  */
2193                     if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2194                         SvIOK_on(sv);
2195                     } else {
2196                         NOOP;   /* Integer is imprecise. NOK, IOKp, is UV */
2197                     }
2198                 }
2199                 SvIsUV_on(sv);
2200             }
2201 #else /* NV_PRESERVES_UV */
2202             if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2203                 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
2204                 /* The IV/UV slot will have been set from value returned by
2205                    grok_number above.  The NV slot has just been set using
2206                    Atof.  */
2207                 SvNOK_on(sv);
2208                 assert (SvIOKp(sv));
2209             } else {
2210                 if (((UV)1 << NV_PRESERVES_UV_BITS) >
2211                     U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2212                     /* Small enough to preserve all bits. */
2213                     (void)SvIOKp_on(sv);
2214                     SvNOK_on(sv);
2215                     SvIV_set(sv, I_V(SvNVX(sv)));
2216                     if ((NV)(SvIVX(sv)) == SvNVX(sv))
2217                         SvIOK_on(sv);
2218                     /* Assumption: first non-preserved integer is < IV_MAX,
2219                        this NV is in the preserved range, therefore: */
2220                     if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
2221                           < (UV)IV_MAX)) {
2222                         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);
2223                     }
2224                 } else {
2225                     /* IN_UV NOT_INT
2226                          0      0       already failed to read UV.
2227                          0      1       already failed to read UV.
2228                          1      0       you won't get here in this case. IV/UV
2229                                         slot set, public IOK, Atof() unneeded.
2230                          1      1       already read UV.
2231                        so there's no point in sv_2iuv_non_preserve() attempting
2232                        to use atol, strtol, strtoul etc.  */
2233 #  ifdef DEBUGGING
2234                     sv_2iuv_non_preserve (sv, numtype);
2235 #  else
2236                     sv_2iuv_non_preserve (sv);
2237 #  endif
2238                 }
2239             }
2240 #endif /* NV_PRESERVES_UV */
2241         /* It might be more code efficient to go through the entire logic above
2242            and conditionally set with SvIOKp_on() rather than SvIOK(), but it
2243            gets complex and potentially buggy, so more programmer efficient
2244            to do it this way, by turning off the public flags:  */
2245         if (!numtype)
2246             SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK);
2247         }
2248     }
2249     else  {
2250         if (isGV_with_GP(sv))
2251             return glob_2number(MUTABLE_GV(sv));
2252
2253         if (!(SvFLAGS(sv) & SVs_PADTMP)) {
2254             if (!PL_localizing && ckWARN(WARN_UNINITIALIZED))
2255                 report_uninit(sv);
2256         }
2257         if (SvTYPE(sv) < SVt_IV)
2258             /* Typically the caller expects that sv_any is not NULL now.  */
2259             sv_upgrade(sv, SVt_IV);
2260         /* Return 0 from the caller.  */
2261         return TRUE;
2262     }
2263     return FALSE;
2264 }
2265
2266 /*
2267 =for apidoc sv_2iv_flags
2268
2269 Return the integer value of an SV, doing any necessary string
2270 conversion.  If flags includes SV_GMAGIC, does an mg_get() first.
2271 Normally used via the C<SvIV(sv)> and C<SvIVx(sv)> macros.
2272
2273 =cut
2274 */
2275
2276 IV
2277 Perl_sv_2iv_flags(pTHX_ register SV *const sv, const I32 flags)
2278 {
2279     dVAR;
2280     if (!sv)
2281         return 0;
2282     if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
2283         /* FBMs use the same flag bit as SVf_IVisUV, so must let them
2284            cache IVs just in case. In practice it seems that they never
2285            actually anywhere accessible by user Perl code, let alone get used
2286            in anything other than a string context.  */
2287         if (flags & SV_GMAGIC)
2288             mg_get(sv);
2289         if (SvIOKp(sv))
2290             return SvIVX(sv);
2291         if (SvNOKp(sv)) {
2292             return I_V(SvNVX(sv));
2293         }
2294         if (SvPOKp(sv) && SvLEN(sv)) {
2295             UV value;
2296             const int numtype
2297                 = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2298
2299             if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2300                 == IS_NUMBER_IN_UV) {
2301                 /* It's definitely an integer */
2302                 if (numtype & IS_NUMBER_NEG) {
2303                     if (value < (UV)IV_MIN)
2304                         return -(IV)value;
2305                 } else {
2306                     if (value < (UV)IV_MAX)
2307                         return (IV)value;
2308                 }
2309             }
2310             if (!numtype) {
2311                 if (ckWARN(WARN_NUMERIC))
2312                     not_a_number(sv);
2313             }
2314             return I_V(Atof(SvPVX_const(sv)));
2315         }
2316         if (SvROK(sv)) {
2317             goto return_rok;
2318         }
2319         assert(SvTYPE(sv) >= SVt_PVMG);
2320         /* This falls through to the report_uninit inside S_sv_2iuv_common.  */
2321     } else if (SvTHINKFIRST(sv)) {
2322         if (SvROK(sv)) {
2323         return_rok:
2324             if (SvAMAGIC(sv)) {
2325                 SV * tmpstr;
2326                 if (flags & SV_SKIP_OVERLOAD)
2327                     return 0;
2328                 tmpstr=AMG_CALLun(sv,numer);
2329                 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2330                     return SvIV(tmpstr);
2331                 }
2332             }
2333             return PTR2IV(SvRV(sv));
2334         }
2335         if (SvIsCOW(sv)) {
2336             sv_force_normal_flags(sv, 0);
2337         }
2338         if (SvREADONLY(sv) && !SvOK(sv)) {
2339             if (ckWARN(WARN_UNINITIALIZED))
2340                 report_uninit(sv);
2341             return 0;
2342         }
2343     }
2344     if (!SvIOKp(sv)) {
2345         if (S_sv_2iuv_common(aTHX_ sv))
2346             return 0;
2347     }
2348     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
2349         PTR2UV(sv),SvIVX(sv)));
2350     return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
2351 }
2352
2353 /*
2354 =for apidoc sv_2uv_flags
2355
2356 Return the unsigned integer value of an SV, doing any necessary string
2357 conversion.  If flags includes SV_GMAGIC, does an mg_get() first.
2358 Normally used via the C<SvUV(sv)> and C<SvUVx(sv)> macros.
2359
2360 =cut
2361 */
2362
2363 UV
2364 Perl_sv_2uv_flags(pTHX_ register SV *const sv, const I32 flags)
2365 {
2366     dVAR;
2367     if (!sv)
2368         return 0;
2369     if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
2370         /* FBMs use the same flag bit as SVf_IVisUV, so must let them
2371            cache IVs just in case.  */
2372         if (flags & SV_GMAGIC)
2373             mg_get(sv);
2374         if (SvIOKp(sv))
2375             return SvUVX(sv);
2376         if (SvNOKp(sv))
2377             return U_V(SvNVX(sv));
2378         if (SvPOKp(sv) && SvLEN(sv)) {
2379             UV value;
2380             const int numtype
2381                 = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2382
2383             if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2384                 == IS_NUMBER_IN_UV) {
2385                 /* It's definitely an integer */
2386                 if (!(numtype & IS_NUMBER_NEG))
2387                     return value;
2388             }
2389             if (!numtype) {
2390                 if (ckWARN(WARN_NUMERIC))
2391                     not_a_number(sv);
2392             }
2393             return U_V(Atof(SvPVX_const(sv)));
2394         }
2395         if (SvROK(sv)) {
2396             goto return_rok;
2397         }
2398         assert(SvTYPE(sv) >= SVt_PVMG);
2399         /* This falls through to the report_uninit inside S_sv_2iuv_common.  */
2400     } else if (SvTHINKFIRST(sv)) {
2401         if (SvROK(sv)) {
2402         return_rok:
2403             if (SvAMAGIC(sv)) {
2404                 SV *tmpstr;
2405                 if (flags & SV_SKIP_OVERLOAD)
2406                     return 0;
2407                 tmpstr = AMG_CALLun(sv,numer);
2408                 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2409                     return SvUV(tmpstr);
2410                 }
2411             }
2412             return PTR2UV(SvRV(sv));
2413         }
2414         if (SvIsCOW(sv)) {
2415             sv_force_normal_flags(sv, 0);
2416         }
2417         if (SvREADONLY(sv) && !SvOK(sv)) {
2418             if (ckWARN(WARN_UNINITIALIZED))
2419                 report_uninit(sv);
2420             return 0;
2421         }
2422     }
2423     if (!SvIOKp(sv)) {
2424         if (S_sv_2iuv_common(aTHX_ sv))
2425             return 0;
2426     }
2427
2428     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
2429                           PTR2UV(sv),SvUVX(sv)));
2430     return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
2431 }
2432
2433 /*
2434 =for apidoc sv_2nv
2435
2436 Return the num value of an SV, doing any necessary string or integer
2437 conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2438 Normally used via the C<SvNV(sv)> and C<SvNVx(sv)> macros.
2439
2440 =cut
2441 */
2442
2443 NV
2444 Perl_sv_2nv_flags(pTHX_ register SV *const sv, const I32 flags)
2445 {
2446     dVAR;
2447     if (!sv)
2448         return 0.0;
2449     if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
2450         /* FBMs use the same flag bit as SVf_IVisUV, so must let them
2451            cache IVs just in case.  */
2452         if (flags & SV_GMAGIC)
2453             mg_get(sv);
2454         if (SvNOKp(sv))
2455             return SvNVX(sv);
2456         if ((SvPOKp(sv) && SvLEN(sv)) && !SvIOKp(sv)) {
2457             if (!SvIOKp(sv) && ckWARN(WARN_NUMERIC) &&
2458                 !grok_number(SvPVX_const(sv), SvCUR(sv), NULL))
2459                 not_a_number(sv);
2460             return Atof(SvPVX_const(sv));
2461         }
2462         if (SvIOKp(sv)) {
2463             if (SvIsUV(sv))
2464                 return (NV)SvUVX(sv);
2465             else
2466                 return (NV)SvIVX(sv);
2467         }
2468         if (SvROK(sv)) {
2469             goto return_rok;
2470         }
2471         assert(SvTYPE(sv) >= SVt_PVMG);
2472         /* This falls through to the report_uninit near the end of the
2473            function. */
2474     } else if (SvTHINKFIRST(sv)) {
2475         if (SvROK(sv)) {
2476         return_rok:
2477             if (SvAMAGIC(sv)) {
2478                 SV *tmpstr;
2479                 if (flags & SV_SKIP_OVERLOAD)
2480                     return 0;
2481                 tmpstr = AMG_CALLun(sv,numer);
2482                 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2483                     return SvNV(tmpstr);
2484                 }
2485             }
2486             return PTR2NV(SvRV(sv));
2487         }
2488         if (SvIsCOW(sv)) {
2489             sv_force_normal_flags(sv, 0);
2490         }
2491         if (SvREADONLY(sv) && !SvOK(sv)) {
2492             if (ckWARN(WARN_UNINITIALIZED))
2493                 report_uninit(sv);
2494             return 0.0;
2495         }
2496     }
2497     if (SvTYPE(sv) < SVt_NV) {
2498         /* The logic to use SVt_PVNV if necessary is in sv_upgrade.  */
2499         sv_upgrade(sv, SVt_NV);
2500 #ifdef USE_LONG_DOUBLE
2501         DEBUG_c({
2502             STORE_NUMERIC_LOCAL_SET_STANDARD();
2503             PerlIO_printf(Perl_debug_log,
2504                           "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
2505                           PTR2UV(sv), SvNVX(sv));
2506             RESTORE_NUMERIC_LOCAL();
2507         });
2508 #else
2509         DEBUG_c({
2510             STORE_NUMERIC_LOCAL_SET_STANDARD();
2511             PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%"NVgf")\n",
2512                           PTR2UV(sv), SvNVX(sv));
2513             RESTORE_NUMERIC_LOCAL();
2514         });
2515 #endif
2516     }
2517     else if (SvTYPE(sv) < SVt_PVNV)
2518         sv_upgrade(sv, SVt_PVNV);
2519     if (SvNOKp(sv)) {
2520         return SvNVX(sv);
2521     }
2522     if (SvIOKp(sv)) {
2523         SvNV_set(sv, SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv));
2524 #ifdef NV_PRESERVES_UV
2525         if (SvIOK(sv))
2526             SvNOK_on(sv);
2527         else
2528             SvNOKp_on(sv);
2529 #else
2530         /* Only set the public NV OK flag if this NV preserves the IV  */
2531         /* Check it's not 0xFFFFFFFFFFFFFFFF */
2532         if (SvIOK(sv) &&
2533             SvIsUV(sv) ? ((SvUVX(sv) != UV_MAX)&&(SvUVX(sv) == U_V(SvNVX(sv))))
2534                        : (SvIVX(sv) == I_V(SvNVX(sv))))
2535             SvNOK_on(sv);
2536         else
2537             SvNOKp_on(sv);
2538 #endif
2539     }
2540     else if (SvPOKp(sv) && SvLEN(sv)) {
2541         UV value;
2542         const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2543         if (!SvIOKp(sv) && !numtype && ckWARN(WARN_NUMERIC))
2544             not_a_number(sv);
2545 #ifdef NV_PRESERVES_UV
2546         if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2547             == IS_NUMBER_IN_UV) {
2548             /* It's definitely an integer */
2549             SvNV_set(sv, (numtype & IS_NUMBER_NEG) ? -(NV)value : (NV)value);
2550         } else
2551             SvNV_set(sv, Atof(SvPVX_const(sv)));
2552         if (numtype)
2553             SvNOK_on(sv);
2554         else
2555             SvNOKp_on(sv);
2556 #else
2557         SvNV_set(sv, Atof(SvPVX_const(sv)));
2558         /* Only set the public NV OK flag if this NV preserves the value in
2559            the PV at least as well as an IV/UV would.
2560            Not sure how to do this 100% reliably. */
2561         /* if that shift count is out of range then Configure's test is
2562            wonky. We shouldn't be in here with NV_PRESERVES_UV_BITS ==
2563            UV_BITS */
2564         if (((UV)1 << NV_PRESERVES_UV_BITS) >
2565             U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2566             SvNOK_on(sv); /* Definitely small enough to preserve all bits */
2567         } else if (!(numtype & IS_NUMBER_IN_UV)) {
2568             /* Can't use strtol etc to convert this string, so don't try.
2569                sv_2iv and sv_2uv will use the NV to convert, not the PV.  */
2570             SvNOK_on(sv);
2571         } else {
2572             /* value has been set.  It may not be precise.  */
2573             if ((numtype & IS_NUMBER_NEG) && (value > (UV)IV_MIN)) {
2574                 /* 2s complement assumption for (UV)IV_MIN  */
2575                 SvNOK_on(sv); /* Integer is too negative.  */
2576             } else {
2577                 SvNOKp_on(sv);
2578                 SvIOKp_on(sv);
2579
2580                 if (numtype & IS_NUMBER_NEG) {
2581                     SvIV_set(sv, -(IV)value);
2582                 } else if (value <= (UV)IV_MAX) {
2583                     SvIV_set(sv, (IV)value);
2584                 } else {
2585                     SvUV_set(sv, value);
2586                     SvIsUV_on(sv);
2587                 }
2588
2589                 if (numtype & IS_NUMBER_NOT_INT) {
2590                     /* I believe that even if the original PV had decimals,
2591                        they are lost beyond the limit of the FP precision.
2592                        However, neither is canonical, so both only get p
2593                        flags.  NWC, 2000/11/25 */
2594                     /* Both already have p flags, so do nothing */
2595                 } else {
2596                     const NV nv = SvNVX(sv);
2597                     if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2598                         if (SvIVX(sv) == I_V(nv)) {
2599                             SvNOK_on(sv);
2600                         } else {
2601                             /* It had no "." so it must be integer.  */
2602                         }
2603                         SvIOK_on(sv);
2604                     } else {
2605                         /* between IV_MAX and NV(UV_MAX).
2606                            Could be slightly > UV_MAX */
2607
2608                         if (numtype & IS_NUMBER_NOT_INT) {
2609                             /* UV and NV both imprecise.  */
2610                         } else {
2611                             const UV nv_as_uv = U_V(nv);
2612
2613                             if (value == nv_as_uv && SvUVX(sv) != UV_MAX) {
2614                                 SvNOK_on(sv);
2615                             }
2616                             SvIOK_on(sv);
2617                         }
2618                     }
2619                 }
2620             }
2621         }
2622         /* It might be more code efficient to go through the entire logic above
2623            and conditionally set with SvNOKp_on() rather than SvNOK(), but it
2624            gets complex and potentially buggy, so more programmer efficient
2625            to do it this way, by turning off the public flags:  */
2626         if (!numtype)
2627             SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK);
2628 #endif /* NV_PRESERVES_UV */
2629     }
2630     else  {
2631         if (isGV_with_GP(sv)) {
2632             glob_2number(MUTABLE_GV(sv));
2633             return 0.0;
2634         }
2635
2636         if (!PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP) && ckWARN(WARN_UNINITIALIZED))
2637             report_uninit(sv);
2638         assert (SvTYPE(sv) >= SVt_NV);
2639         /* Typically the caller expects that sv_any is not NULL now.  */
2640         /* XXX Ilya implies that this is a bug in callers that assume this
2641            and ideally should be fixed.  */
2642         return 0.0;
2643     }
2644 #if defined(USE_LONG_DOUBLE)
2645     DEBUG_c({
2646         STORE_NUMERIC_LOCAL_SET_STANDARD();
2647         PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
2648                       PTR2UV(sv), SvNVX(sv));
2649         RESTORE_NUMERIC_LOCAL();
2650     });
2651 #else
2652     DEBUG_c({
2653         STORE_NUMERIC_LOCAL_SET_STANDARD();
2654         PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%"NVgf")\n",
2655                       PTR2UV(sv), SvNVX(sv));
2656         RESTORE_NUMERIC_LOCAL();
2657     });
2658 #endif
2659     return SvNVX(sv);
2660 }
2661
2662 /*
2663 =for apidoc sv_2num
2664
2665 Return an SV with the numeric value of the source SV, doing any necessary
2666 reference or overload conversion.  You must use the C<SvNUM(sv)> macro to
2667 access this function.
2668
2669 =cut
2670 */
2671
2672 SV *
2673 Perl_sv_2num(pTHX_ register SV *const sv)
2674 {
2675     PERL_ARGS_ASSERT_SV_2NUM;
2676
2677     if (!SvROK(sv))
2678         return sv;
2679     if (SvAMAGIC(sv)) {
2680         SV * const tmpsv = AMG_CALLun(sv,numer);
2681         if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
2682             return sv_2num(tmpsv);
2683     }
2684     return sv_2mortal(newSVuv(PTR2UV(SvRV(sv))));
2685 }
2686
2687 /* uiv_2buf(): private routine for use by sv_2pv_flags(): print an IV or
2688  * UV as a string towards the end of buf, and return pointers to start and
2689  * end of it.
2690  *
2691  * We assume that buf is at least TYPE_CHARS(UV) long.
2692  */
2693
2694 static char *
2695 S_uiv_2buf(char *const buf, const IV iv, UV uv, const int is_uv, char **const peob)
2696 {
2697     char *ptr = buf + TYPE_CHARS(UV);
2698     char * const ebuf = ptr;
2699     int sign;
2700
2701     PERL_ARGS_ASSERT_UIV_2BUF;
2702
2703     if (is_uv)
2704         sign = 0;
2705     else if (iv >= 0) {
2706         uv = iv;
2707         sign = 0;
2708     } else {
2709         uv = -iv;
2710         sign = 1;
2711     }
2712     do {
2713         *--ptr = '0' + (char)(uv % 10);
2714     } while (uv /= 10);
2715     if (sign)
2716         *--ptr = '-';
2717     *peob = ebuf;
2718     return ptr;
2719 }
2720
2721 /*
2722 =for apidoc sv_2pv_flags
2723
2724 Returns a pointer to the string value of an SV, and sets *lp to its length.
2725 If flags includes SV_GMAGIC, does an mg_get() first. Coerces sv to a string
2726 if necessary.
2727 Normally invoked via the C<SvPV_flags> macro. C<sv_2pv()> and C<sv_2pv_nomg>
2728 usually end up here too.
2729
2730 =cut
2731 */
2732
2733 char *
2734 Perl_sv_2pv_flags(pTHX_ register SV *const sv, STRLEN *const lp, const I32 flags)
2735 {
2736     dVAR;
2737     register char *s;
2738
2739     if (!sv) {
2740         if (lp)
2741             *lp = 0;
2742         return (char *)"";
2743     }
2744     if (SvGMAGICAL(sv)) {
2745         if (flags & SV_GMAGIC)
2746             mg_get(sv);
2747         if (SvPOKp(sv)) {
2748             if (lp)
2749                 *lp = SvCUR(sv);
2750             if (flags & SV_MUTABLE_RETURN)
2751                 return SvPVX_mutable(sv);
2752             if (flags & SV_CONST_RETURN)
2753                 return (char *)SvPVX_const(sv);
2754             return SvPVX(sv);
2755         }
2756         if (SvIOKp(sv) || SvNOKp(sv)) {
2757             char tbuf[64];  /* Must fit sprintf/Gconvert of longest IV/NV */
2758             STRLEN len;
2759
2760             if (SvIOKp(sv)) {
2761                 len = SvIsUV(sv)
2762                     ? my_snprintf(tbuf, sizeof(tbuf), "%"UVuf, (UV)SvUVX(sv))
2763                     : my_snprintf(tbuf, sizeof(tbuf), "%"IVdf, (IV)SvIVX(sv));
2764             } else {
2765                 Gconvert(SvNVX(sv), NV_DIG, 0, tbuf);
2766                 len = strlen(tbuf);
2767             }
2768             assert(!SvROK(sv));
2769             {
2770                 dVAR;
2771
2772 #ifdef FIXNEGATIVEZERO
2773                 if (len == 2 && tbuf[0] == '-' && tbuf[1] == '0') {
2774                     tbuf[0] = '0';
2775                     tbuf[1] = 0;
2776                     len = 1;
2777                 }
2778 #endif
2779                 SvUPGRADE(sv, SVt_PV);
2780                 if (lp)
2781                     *lp = len;
2782                 s = SvGROW_mutable(sv, len + 1);
2783                 SvCUR_set(sv, len);
2784                 SvPOKp_on(sv);
2785                 return (char*)memcpy(s, tbuf, len + 1);
2786             }
2787         }
2788         if (SvROK(sv)) {
2789             goto return_rok;
2790         }
2791         assert(SvTYPE(sv) >= SVt_PVMG);
2792         /* This falls through to the report_uninit near the end of the
2793            function. */
2794     } else if (SvTHINKFIRST(sv)) {
2795         if (SvROK(sv)) {
2796         return_rok:
2797             if (SvAMAGIC(sv)) {
2798                 SV *tmpstr;
2799                 if (flags & SV_SKIP_OVERLOAD)
2800                     return NULL;
2801                 tmpstr = AMG_CALLun(sv,string);
2802                 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2803                     /* Unwrap this:  */
2804                     /* char *pv = lp ? SvPV(tmpstr, *lp) : SvPV_nolen(tmpstr);
2805                      */
2806
2807                     char *pv;
2808                     if ((SvFLAGS(tmpstr) & (SVf_POK)) == SVf_POK) {
2809                         if (flags & SV_CONST_RETURN) {
2810                             pv = (char *) SvPVX_const(tmpstr);
2811                         } else {
2812                             pv = (flags & SV_MUTABLE_RETURN)
2813                                 ? SvPVX_mutable(tmpstr) : SvPVX(tmpstr);
2814                         }
2815                         if (lp)
2816                             *lp = SvCUR(tmpstr);
2817                     } else {
2818                         pv = sv_2pv_flags(tmpstr, lp, flags);
2819                     }
2820                     if (SvUTF8(tmpstr))
2821                         SvUTF8_on(sv);
2822                     else
2823                         SvUTF8_off(sv);
2824                     return pv;
2825                 }
2826             }
2827             {
2828                 STRLEN len;
2829                 char *retval;
2830                 char *buffer;
2831                 SV *const referent = SvRV(sv);
2832
2833                 if (!referent) {
2834                     len = 7;
2835                     retval = buffer = savepvn("NULLREF", len);
2836                 } else if (SvTYPE(referent) == SVt_REGEXP) {
2837                     REGEXP * const re = (REGEXP *)MUTABLE_PTR(referent);
2838                     I32 seen_evals = 0;
2839
2840                     assert(re);
2841                         
2842                     /* If the regex is UTF-8 we want the containing scalar to
2843                        have an UTF-8 flag too */
2844                     if (RX_UTF8(re))
2845                         SvUTF8_on(sv);
2846                     else
2847                         SvUTF8_off(sv); 
2848
2849                     if ((seen_evals = RX_SEEN_EVALS(re)))
2850                         PL_reginterp_cnt += seen_evals;
2851
2852                     if (lp)
2853                         *lp = RX_WRAPLEN(re);
2854  
2855                     return RX_WRAPPED(re);
2856                 } else {
2857                     const char *const typestr = sv_reftype(referent, 0);
2858                     const STRLEN typelen = strlen(typestr);
2859                     UV addr = PTR2UV(referent);
2860                     const char *stashname = NULL;
2861                     STRLEN stashnamelen = 0; /* hush, gcc */
2862                     const char *buffer_end;
2863
2864                     if (SvOBJECT(referent)) {
2865                         const HEK *const name = HvNAME_HEK(SvSTASH(referent));
2866
2867                         if (name) {
2868                             stashname = HEK_KEY(name);
2869                             stashnamelen = HEK_LEN(name);
2870
2871                             if (HEK_UTF8(name)) {
2872                                 SvUTF8_on(sv);
2873                             } else {
2874                                 SvUTF8_off(sv);
2875                             }
2876                         } else {
2877                             stashname = "__ANON__";
2878                             stashnamelen = 8;
2879                         }
2880                         len = stashnamelen + 1 /* = */ + typelen + 3 /* (0x */
2881                             + 2 * sizeof(UV) + 2 /* )\0 */;
2882                     } else {
2883                         len = typelen + 3 /* (0x */
2884                             + 2 * sizeof(UV) + 2 /* )\0 */;
2885                     }
2886
2887                     Newx(buffer, len, char);
2888                     buffer_end = retval = buffer + len;
2889
2890                     /* Working backwards  */
2891                     *--retval = '\0';
2892                     *--retval = ')';
2893                     do {
2894                         *--retval = PL_hexdigit[addr & 15];
2895                     } while (addr >>= 4);
2896                     *--retval = 'x';
2897                     *--retval = '0';
2898                     *--retval = '(';
2899
2900                     retval -= typelen;
2901                     memcpy(retval, typestr, typelen);
2902
2903                     if (stashname) {
2904                         *--retval = '=';
2905                         retval -= stashnamelen;
2906                         memcpy(retval, stashname, stashnamelen);
2907                     }
2908                     /* retval may not neccesarily have reached the start of the
2909                        buffer here.  */
2910                     assert (retval >= buffer);
2911
2912                     len = buffer_end - retval - 1; /* -1 for that \0  */
2913                 }
2914                 if (lp)
2915                     *lp = len;
2916                 SAVEFREEPV(buffer);
2917                 return retval;
2918             }
2919         }
2920         if (SvREADONLY(sv) && !SvOK(sv)) {
2921             if (lp)
2922                 *lp = 0;
2923             if (flags & SV_UNDEF_RETURNS_NULL)
2924                 return NULL;
2925             if (ckWARN(WARN_UNINITIALIZED))
2926                 report_uninit(sv);
2927             return (char *)"";
2928         }
2929     }
2930     if (SvIOK(sv) || ((SvIOKp(sv) && !SvNOKp(sv)))) {
2931         /* I'm assuming that if both IV and NV are equally valid then
2932            converting the IV is going to be more efficient */
2933         const U32 isUIOK = SvIsUV(sv);
2934         char buf[TYPE_CHARS(UV)];
2935         char *ebuf, *ptr;
2936         STRLEN len;
2937
2938         if (SvTYPE(sv) < SVt_PVIV)
2939             sv_upgrade(sv, SVt_PVIV);
2940         ptr = uiv_2buf(buf, SvIVX(sv), SvUVX(sv), isUIOK, &ebuf);
2941         len = ebuf - ptr;
2942         /* inlined from sv_setpvn */
2943         s = SvGROW_mutable(sv, len + 1);
2944         Move(ptr, s, len, char);
2945         s += len;
2946         *s = '\0';
2947     }
2948     else if (SvNOKp(sv)) {
2949         dSAVE_ERRNO;
2950         if (SvTYPE(sv) < SVt_PVNV)
2951             sv_upgrade(sv, SVt_PVNV);
2952         /* The +20 is pure guesswork.  Configure test needed. --jhi */
2953         s = SvGROW_mutable(sv, NV_DIG + 20);
2954         /* some Xenix systems wipe out errno here */
2955 #ifdef apollo
2956         if (SvNVX(sv) == 0.0)
2957             my_strlcpy(s, "0", SvLEN(sv));
2958         else
2959 #endif /*apollo*/
2960         {
2961             Gconvert(SvNVX(sv), NV_DIG, 0, s);
2962         }
2963         RESTORE_ERRNO;
2964 #ifdef FIXNEGATIVEZERO
2965         if (*s == '-' && s[1] == '0' && !s[2]) {
2966             s[0] = '0';
2967             s[1] = 0;
2968         }
2969 #endif
2970         while (*s) s++;
2971 #ifdef hcx
2972         if (s[-1] == '.')
2973             *--s = '\0';
2974 #endif
2975     }
2976     else {
2977         if (isGV_with_GP(sv)) {
2978             GV *const gv = MUTABLE_GV(sv);
2979             const U32 wasfake = SvFLAGS(gv) & SVf_FAKE;
2980             SV *const buffer = sv_newmortal();
2981
2982             /* FAKE globs can get coerced, so need to turn this off temporarily
2983                if it is on.  */
2984             SvFAKE_off(gv);
2985             gv_efullname3(buffer, gv, "*");
2986             SvFLAGS(gv) |= wasfake;
2987
2988             if (SvPOK(buffer)) {
2989                 if (lp) {
2990                     *lp = SvCUR(buffer);
2991                 }
2992                 return SvPVX(buffer);
2993             }
2994             else {
2995                 if (lp)
2996                     *lp = 0;
2997                 return (char *)"";
2998             }
2999         }
3000
3001         if (lp)
3002             *lp = 0;
3003         if (flags & SV_UNDEF_RETURNS_NULL)
3004             return NULL;
3005         if (!PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP) && ckWARN(WARN_UNINITIALIZED))
3006             report_uninit(sv);
3007         if (SvTYPE(sv) < SVt_PV)
3008             /* Typically the caller expects that sv_any is not NULL now.  */
3009             sv_upgrade(sv, SVt_PV);
3010         return (char *)"";
3011     }
3012     {
3013         const STRLEN len = s - SvPVX_const(sv);
3014         if (lp) 
3015             *lp = len;
3016         SvCUR_set(sv, len);
3017     }
3018     SvPOK_on(sv);
3019     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3020                           PTR2UV(sv),SvPVX_const(sv)));
3021     if (flags & SV_CONST_RETURN)
3022         return (char *)SvPVX_const(sv);
3023     if (flags & SV_MUTABLE_RETURN)
3024         return SvPVX_mutable(sv);
3025     return SvPVX(sv);
3026 }
3027
3028 /*
3029 =for apidoc sv_copypv
3030
3031 Copies a stringified representation of the source SV into the
3032 destination SV.  Automatically performs any necessary mg_get and
3033 coercion of numeric values into strings.  Guaranteed to preserve
3034 UTF8 flag even from overloaded objects.  Similar in nature to
3035 sv_2pv[_flags] but operates directly on an SV instead of just the
3036 string.  Mostly uses sv_2pv_flags to do its work, except when that
3037 would lose the UTF-8'ness of the PV.
3038
3039 =cut
3040 */
3041
3042 void
3043 Perl_sv_copypv(pTHX_ SV *const dsv, register SV *const ssv)
3044 {
3045     STRLEN len;
3046     const char * const s = SvPV_const(ssv,len);
3047
3048     PERL_ARGS_ASSERT_SV_COPYPV;
3049
3050     sv_setpvn(dsv,s,len);
3051     if (SvUTF8(ssv))
3052         SvUTF8_on(dsv);
3053     else
3054         SvUTF8_off(dsv);
3055 }
3056
3057 /*
3058 =for apidoc sv_2pvbyte
3059
3060 Return a pointer to the byte-encoded representation of the SV, and set *lp
3061 to its length.  May cause the SV to be downgraded from UTF-8 as a
3062 side-effect.
3063
3064 Usually accessed via the C<SvPVbyte> macro.
3065
3066 =cut
3067 */
3068
3069 char *
3070 Perl_sv_2pvbyte(pTHX_ register SV *const sv, STRLEN *const lp)
3071 {
3072     PERL_ARGS_ASSERT_SV_2PVBYTE;
3073
3074     sv_utf8_downgrade(sv,0);
3075     return lp ? SvPV(sv,*lp) : SvPV_nolen(sv);
3076 }
3077
3078 /*
3079 =for apidoc sv_2pvutf8
3080
3081 Return a pointer to the UTF-8-encoded representation of the SV, and set *lp
3082 to its length.  May cause the SV to be upgraded to UTF-8 as a side-effect.
3083
3084 Usually accessed via the C<SvPVutf8> macro.
3085
3086 =cut
3087 */
3088
3089 char *
3090 Perl_sv_2pvutf8(pTHX_ register SV *const sv, STRLEN *const lp)
3091 {
3092     PERL_ARGS_ASSERT_SV_2PVUTF8;
3093
3094     sv_utf8_upgrade(sv);
3095     return lp ? SvPV(sv,*lp) : SvPV_nolen(sv);
3096 }
3097
3098
3099 /*
3100 =for apidoc sv_2bool
3101
3102 This function is only called on magical items, and is only used by
3103 sv_true() or its macro equivalent.
3104
3105 =cut
3106 */
3107
3108 bool
3109 Perl_sv_2bool(pTHX_ register SV *const sv)
3110 {
3111     dVAR;
3112
3113     PERL_ARGS_ASSERT_SV_2BOOL;
3114
3115     SvGETMAGIC(sv);
3116
3117     if (!SvOK(sv))
3118         return 0;
3119     if (SvROK(sv)) {
3120         if (SvAMAGIC(sv)) {
3121             SV * const tmpsv = AMG_CALLun(sv,bool_);
3122             if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
3123                 return cBOOL(SvTRUE(tmpsv));
3124         }
3125         return SvRV(sv) != 0;
3126     }
3127     if (SvPOKp(sv)) {
3128         register XPV* const Xpvtmp = (XPV*)SvANY(sv);
3129         if (Xpvtmp &&
3130                 (*sv->sv_u.svu_pv > '0' ||
3131                 Xpvtmp->xpv_cur > 1 ||
3132                 (Xpvtmp->xpv_cur && *sv->sv_u.svu_pv != '0')))
3133             return 1;
3134         else
3135             return 0;
3136     }
3137     else {
3138         if (SvIOKp(sv))
3139             return SvIVX(sv) != 0;
3140         else {
3141             if (SvNOKp(sv))
3142                 return SvNVX(sv) != 0.0;
3143             else {
3144                 if (isGV_with_GP(sv))
3145                     return TRUE;
3146                 else
3147                     return FALSE;
3148             }
3149         }
3150     }
3151 }
3152
3153 /*
3154 =for apidoc sv_utf8_upgrade
3155
3156 Converts the PV of an SV to its UTF-8-encoded form.
3157 Forces the SV to string form if it is not already.
3158 Will C<mg_get> on C<sv> if appropriate.
3159 Always sets the SvUTF8 flag to avoid future validity checks even
3160 if the whole string is the same in UTF-8 as not.
3161 Returns the number of bytes in the converted string
3162
3163 This is not as a general purpose byte encoding to Unicode interface:
3164 use the Encode extension for that.
3165
3166 =for apidoc sv_utf8_upgrade_nomg
3167
3168 Like sv_utf8_upgrade, but doesn't do magic on C<sv>
3169
3170 =for apidoc sv_utf8_upgrade_flags
3171
3172 Converts the PV of an SV to its UTF-8-encoded form.
3173 Forces the SV to string form if it is not already.
3174 Always sets the SvUTF8 flag to avoid future validity checks even
3175 if all the bytes are invariant in UTF-8. If C<flags> has C<SV_GMAGIC> bit set,
3176 will C<mg_get> on C<sv> if appropriate, else not.
3177 Returns the number of bytes in the converted string
3178 C<sv_utf8_upgrade> and
3179 C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
3180
3181 This is not as a general purpose byte encoding to Unicode interface:
3182 use the Encode extension for that.
3183
3184 =cut
3185
3186 The grow version is currently not externally documented.  It adds a parameter,
3187 extra, which is the number of unused bytes the string of 'sv' is guaranteed to
3188 have free after it upon return.  This allows the caller to reserve extra space
3189 that it intends to fill, to avoid extra grows.
3190
3191 Also externally undocumented for the moment is the flag SV_FORCE_UTF8_UPGRADE,
3192 which can be used to tell this function to not first check to see if there are
3193 any characters that are different in UTF-8 (variant characters) which would
3194 force it to allocate a new string to sv, but to assume there are.  Typically
3195 this flag is used by a routine that has already parsed the string to find that
3196 there are such characters, and passes this information on so that the work
3197 doesn't have to be repeated.
3198
3199 (One might think that the calling routine could pass in the position of the
3200 first such variant, so it wouldn't have to be found again.  But that is not the
3201 case, because typically when the caller is likely to use this flag, it won't be
3202 calling this routine unless it finds something that won't fit into a byte.
3203 Otherwise it tries to not upgrade and just use bytes.  But some things that
3204 do fit into a byte are variants in utf8, and the caller may not have been
3205 keeping track of these.)
3206
3207 If the routine itself changes the string, it adds a trailing NUL.  Such a NUL
3208 isn't guaranteed due to having other routines do the work in some input cases,
3209 or if the input is already flagged as being in utf8.
3210
3211 The speed of this could perhaps be improved for many cases if someone wanted to
3212 write a fast function that counts the number of variant characters in a string,
3213 especially if it could return the position of the first one.
3214
3215 */
3216
3217 STRLEN
3218 Perl_sv_utf8_upgrade_flags_grow(pTHX_ register SV *const sv, const I32 flags, STRLEN extra)
3219 {
3220     dVAR;
3221
3222     PERL_ARGS_ASSERT_SV_UTF8_UPGRADE_FLAGS_GROW;
3223
3224     if (sv == &PL_sv_undef)
3225         return 0;
3226     if (!SvPOK(sv)) {
3227         STRLEN len = 0;
3228         if (SvREADONLY(sv) && (SvPOKp(sv) || SvIOKp(sv) || SvNOKp(sv))) {
3229             (void) sv_2pv_flags(sv,&len, flags);
3230             if (SvUTF8(sv)) {
3231                 if (extra) SvGROW(sv, SvCUR(sv) + extra);
3232                 return len;
3233             }
3234         } else {
3235             (void) SvPV_force(sv,len);
3236         }
3237     }
3238
3239     if (SvUTF8(sv)) {
3240         if (extra) SvGROW(sv, SvCUR(sv) + extra);
3241         return SvCUR(sv);
3242     }
3243
3244     if (SvIsCOW(sv)) {
3245         sv_force_normal_flags(sv, 0);
3246     }
3247
3248     if (PL_encoding && !(flags & SV_UTF8_NO_ENCODING)) {
3249         sv_recode_to_utf8(sv, PL_encoding);
3250         if (extra) SvGROW(sv, SvCUR(sv) + extra);
3251         return SvCUR(sv);
3252     }
3253
3254     if (SvCUR(sv) == 0) {
3255         if (extra) SvGROW(sv, extra);
3256     } else { /* Assume Latin-1/EBCDIC */
3257         /* This function could be much more efficient if we
3258          * had a FLAG in SVs to signal if there are any variant
3259          * chars in the PV.  Given that there isn't such a flag
3260          * make the loop as fast as possible (although there are certainly ways
3261          * to speed this up, eg. through vectorization) */
3262         U8 * s = (U8 *) SvPVX_const(sv);
3263         U8 * e = (U8 *) SvEND(sv);
3264         U8 *t = s;
3265         STRLEN two_byte_count = 0;
3266         
3267         if (flags & SV_FORCE_UTF8_UPGRADE) goto must_be_utf8;
3268
3269         /* See if really will need to convert to utf8.  We mustn't rely on our
3270          * incoming SV being well formed and having a trailing '\0', as certain
3271          * code in pp_formline can send us partially built SVs. */
3272
3273         while (t < e) {
3274             const U8 ch = *t++;
3275             if (NATIVE_IS_INVARIANT(ch)) continue;
3276
3277             t--;    /* t already incremented; re-point to first variant */
3278             two_byte_count = 1;
3279             goto must_be_utf8;
3280         }
3281
3282         /* utf8 conversion not needed because all are invariants.  Mark as
3283          * UTF-8 even if no variant - saves scanning loop */
3284         SvUTF8_on(sv);
3285         return SvCUR(sv);
3286
3287 must_be_utf8:
3288
3289         /* Here, the string should be converted to utf8, either because of an
3290          * input flag (two_byte_count = 0), or because a character that
3291          * requires 2 bytes was found (two_byte_count = 1).  t points either to
3292          * the beginning of the string (if we didn't examine anything), or to
3293          * the first variant.  In either case, everything from s to t - 1 will
3294          * occupy only 1 byte each on output.
3295          *
3296          * There are two main ways to convert.  One is to create a new string
3297          * and go through the input starting from the beginning, appending each
3298          * converted value onto the new string as we go along.  It's probably
3299          * best to allocate enough space in the string for the worst possible
3300          * case rather than possibly running out of space and having to
3301          * reallocate and then copy what we've done so far.  Since everything
3302          * from s to t - 1 is invariant, the destination can be initialized
3303          * with these using a fast memory copy
3304          *
3305          * The other way is to figure out exactly how big the string should be
3306          * by parsing the entire input.  Then you don't have to make it big
3307          * enough to handle the worst possible case, and more importantly, if
3308          * the string you already have is large enough, you don't have to
3309          * allocate a new string, you can copy the last character in the input
3310          * string to the final position(s) that will be occupied by the
3311          * converted string and go backwards, stopping at t, since everything
3312          * before that is invariant.
3313          *
3314          * There are advantages and disadvantages to each method.
3315          *
3316          * In the first method, we can allocate a new string, do the memory
3317          * copy from the s to t - 1, and then proceed through the rest of the
3318          * string byte-by-byte.
3319          *
3320          * In the second method, we proceed through the rest of the input
3321          * string just calculating how big the converted string will be.  Then
3322          * there are two cases:
3323          *  1)  if the string has enough extra space to handle the converted
3324          *      value.  We go backwards through the string, converting until we
3325          *      get to the position we are at now, and then stop.  If this
3326          *      position is far enough along in the string, this method is
3327          *      faster than the other method.  If the memory copy were the same
3328          *      speed as the byte-by-byte loop, that position would be about
3329          *      half-way, as at the half-way mark, parsing to the end and back
3330          *      is one complete string's parse, the same amount as starting
3331          *      over and going all the way through.  Actually, it would be
3332          *      somewhat less than half-way, as it's faster to just count bytes
3333          *      than to also copy, and we don't have the overhead of allocating
3334          *      a new string, changing the scalar to use it, and freeing the
3335          *      existing one.  But if the memory copy is fast, the break-even
3336          *      point is somewhere after half way.  The counting loop could be
3337          *      sped up by vectorization, etc, to move the break-even point
3338          *      further towards the beginning.
3339          *  2)  if the string doesn't have enough space to handle the converted
3340          *      value.  A new string will have to be allocated, and one might
3341          *      as well, given that, start from the beginning doing the first
3342          *      method.  We've spent extra time parsing the string and in
3343          *      exchange all we've gotten is that we know precisely how big to
3344          *      make the new one.  Perl is more optimized for time than space,
3345          *      so this case is a loser.
3346          * So what I've decided to do is not use the 2nd method unless it is
3347          * guaranteed that a new string won't have to be allocated, assuming
3348          * the worst case.  I also decided not to put any more conditions on it
3349          * than this, for now.  It seems likely that, since the worst case is
3350          * twice as big as the unknown portion of the string (plus 1), we won't
3351          * be guaranteed enough space, causing us to go to the first method,
3352          * unless the string is short, or the first variant character is near
3353          * the end of it.  In either of these cases, it seems best to use the
3354          * 2nd method.  The only circumstance I can think of where this would
3355          * be really slower is if the string had once had much more data in it
3356          * than it does now, but there is still a substantial amount in it  */
3357
3358         {
3359             STRLEN invariant_head = t - s;
3360             STRLEN size = invariant_head + (e - t) * 2 + 1 + extra;
3361             if (SvLEN(sv) < size) {
3362
3363                 /* Here, have decided to allocate a new string */
3364
3365                 U8 *dst;
3366                 U8 *d;
3367
3368                 Newx(dst, size, U8);
3369
3370                 /* If no known invariants at the beginning of the input string,
3371                  * set so starts from there.  Otherwise, can use memory copy to
3372                  * get up to where we are now, and then start from here */
3373
3374                 if (invariant_head <= 0) {
3375                     d = dst;
3376                 } else {
3377                     Copy(s, dst, invariant_head, char);
3378                     d = dst + invariant_head;
3379                 }
3380
3381                 while (t < e) {
3382                     const UV uv = NATIVE8_TO_UNI(*t++);
3383                     if (UNI_IS_INVARIANT(uv))
3384                         *d++ = (U8)UNI_TO_NATIVE(uv);
3385                     else {
3386                         *d++ = (U8)UTF8_EIGHT_BIT_HI(uv);
3387                         *d++ = (U8)UTF8_EIGHT_BIT_LO(uv);
3388                     }
3389                 }
3390                 *d = '\0';
3391                 SvPV_free(sv); /* No longer using pre-existing string */
3392                 SvPV_set(sv, (char*)dst);
3393                 SvCUR_set(sv, d - dst);
3394                 SvLEN_set(sv, size);
3395             } else {
3396
3397                 /* Here, have decided to get the exact size of the string.
3398                  * Currently this happens only when we know that there is
3399                  * guaranteed enough space to fit the converted string, so
3400                  * don't have to worry about growing.  If two_byte_count is 0,
3401                  * then t points to the first byte of the string which hasn't
3402                  * been examined yet.  Otherwise two_byte_count is 1, and t
3403                  * points to the first byte in the string that will expand to
3404                  * two.  Depending on this, start examining at t or 1 after t.
3405                  * */
3406
3407                 U8 *d = t + two_byte_count;
3408
3409
3410                 /* Count up the remaining bytes that expand to two */
3411
3412                 while (d < e) {
3413                     const U8 chr = *d++;
3414                     if (! NATIVE_IS_INVARIANT(chr)) two_byte_count++;
3415                 }
3416
3417                 /* The string will expand by just the number of bytes that
3418                  * occupy two positions.  But we are one afterwards because of
3419                  * the increment just above.  This is the place to put the
3420                  * trailing NUL, and to set the length before we decrement */
3421
3422                 d += two_byte_count;
3423                 SvCUR_set(sv, d - s);
3424                 *d-- = '\0';
3425
3426
3427                 /* Having decremented d, it points to the position to put the
3428                  * very last byte of the expanded string.  Go backwards through
3429                  * the string, copying and expanding as we go, stopping when we
3430                  * get to the part that is invariant the rest of the way down */
3431
3432                 e--;
3433                 while (e >= t) {
3434                     const U8 ch = NATIVE8_TO_UNI(*e--);
3435                     if (UNI_IS_INVARIANT(ch)) {
3436                         *d-- = UNI_TO_NATIVE(ch);
3437                     } else {
3438                         *d-- = (U8)UTF8_EIGHT_BIT_LO(ch);
3439                         *d-- = (U8)UTF8_EIGHT_BIT_HI(ch);
3440                     }
3441                 }
3442             }
3443         }
3444     }
3445
3446     /* Mark as UTF-8 even if no variant - saves scanning loop */
3447     SvUTF8_on(sv);
3448     return SvCUR(sv);
3449 }
3450
3451 /*
3452 =for apidoc sv_utf8_downgrade
3453
3454 Attempts to convert the PV of an SV from characters to bytes.
3455 If the PV contains a character that cannot fit
3456 in a byte, this conversion will fail;
3457 in this case, either returns false or, if C<fail_ok> is not
3458 true, croaks.
3459
3460 This is not as a general purpose Unicode to byte encoding interface:
3461 use the Encode extension for that.
3462
3463 =cut
3464 */
3465
3466 bool
3467 Perl_sv_utf8_downgrade(pTHX_ register SV *const sv, const bool fail_ok)
3468 {
3469     dVAR;
3470
3471     PERL_ARGS_ASSERT_SV_UTF8_DOWNGRADE;
3472
3473     if (SvPOKp(sv) && SvUTF8(sv)) {
3474         if (SvCUR(sv)) {
3475             U8 *s;
3476             STRLEN len;
3477
3478             if (SvIsCOW(sv)) {
3479                 sv_force_normal_flags(sv, 0);
3480             }
3481             s = (U8 *) SvPV(sv, len);
3482             if (!utf8_to_bytes(s, &len)) {
3483                 if (fail_ok)
3484                     return FALSE;
3485                 else {
3486                     if (PL_op)
3487                         Perl_croak(aTHX_ "Wide character in %s",
3488                                    OP_DESC(PL_op));
3489                     else
3490                         Perl_croak(aTHX_ "Wide character");
3491                 }
3492             }
3493             SvCUR_set(sv, len);
3494         }
3495     }
3496     SvUTF8_off(sv);
3497     return TRUE;
3498 }
3499
3500 /*
3501 =for apidoc sv_utf8_encode
3502
3503 Converts the PV of an SV to UTF-8, but then turns the C<SvUTF8>
3504 flag off so that it looks like octets again.
3505
3506 =cut
3507 */
3508
3509 void
3510 Perl_sv_utf8_encode(pTHX_ register SV *const sv)
3511 {
3512     PERL_ARGS_ASSERT_SV_UTF8_ENCODE;
3513
3514     if (SvIsCOW(sv)) {
3515         sv_force_normal_flags(sv, 0);
3516     }
3517     if (SvREADONLY(sv)) {
3518         Perl_croak(aTHX_ "%s", PL_no_modify);
3519     }
3520     (void) sv_utf8_upgrade(sv);
3521     SvUTF8_off(sv);
3522 }
3523
3524 /*
3525 =for apidoc sv_utf8_decode
3526
3527 If the PV of the SV is an octet sequence in UTF-8
3528 and contains a multiple-byte character, the C<SvUTF8> flag is turned on
3529 so that it looks like a character. If the PV contains only single-byte
3530 characters, the C<SvUTF8> flag stays being off.
3531 Scans PV for validity and returns false if the PV is invalid UTF-8.
3532
3533 =cut
3534 */
3535
3536 bool
3537 Perl_sv_utf8_decode(pTHX_ register SV *const sv)
3538 {
3539     PERL_ARGS_ASSERT_SV_UTF8_DECODE;
3540
3541     if (SvPOKp(sv)) {
3542         const U8 *c;
3543         const U8 *e;
3544
3545         /* The octets may have got themselves encoded - get them back as
3546          * bytes
3547          */
3548         if (!sv_utf8_downgrade(sv, TRUE))
3549             return FALSE;
3550
3551         /* it is actually just a matter of turning the utf8 flag on, but
3552          * we want to make sure everything inside is valid utf8 first.
3553          */
3554         c = (const U8 *) SvPVX_const(sv);
3555         if (!is_utf8_string(c, SvCUR(sv)+1))
3556             return FALSE;
3557         e = (const U8 *) SvEND(sv);
3558         while (c < e) {
3559             const U8 ch = *c++;
3560             if (!UTF8_IS_INVARIANT(ch)) {
3561                 SvUTF8_on(sv);
3562                 break;
3563             }
3564         }
3565     }
3566     return TRUE;
3567 }
3568
3569 /*
3570 =for apidoc sv_setsv
3571
3572 Copies the contents of the source SV C<ssv> into the destination SV
3573 C<dsv>.  The source SV may be destroyed if it is mortal, so don't use this
3574 function if the source SV needs to be reused. Does not handle 'set' magic.
3575 Loosely speaking, it performs a copy-by-value, obliterating any previous
3576 content of the destination.
3577
3578 You probably want to use one of the assortment of wrappers, such as
3579 C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3580 C<SvSetMagicSV_nosteal>.
3581
3582 =for apidoc sv_setsv_flags
3583
3584 Copies the contents of the source SV C<ssv> into the destination SV
3585 C<dsv>.  The source SV may be destroyed if it is mortal, so don't use this
3586 function if the source SV needs to be reused. Does not handle 'set' magic.
3587 Loosely speaking, it performs a copy-by-value, obliterating any previous
3588 content of the destination.
3589 If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
3590 C<ssv> if appropriate, else not. If the C<flags> parameter has the
3591 C<NOSTEAL> bit set then the buffers of temps will not be stolen. <sv_setsv>
3592 and C<sv_setsv_nomg> are implemented in terms of this function.
3593
3594 You probably want to use one of the assortment of wrappers, such as
3595 C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3596 C<SvSetMagicSV_nosteal>.
3597
3598 This is the primary function for copying scalars, and most other
3599 copy-ish functions and macros use this underneath.
3600
3601 =cut
3602 */
3603
3604 static void
3605 S_glob_assign_glob(pTHX_ SV *const dstr, SV *const sstr, const int dtype)
3606 {
3607     I32 mro_changes = 0; /* 1 = method, 2 = isa */
3608
3609     PERL_ARGS_ASSERT_GLOB_ASSIGN_GLOB;
3610
3611     if (dtype != SVt_PVGV) {
3612         const char * const name = GvNAME(sstr);
3613         const STRLEN len = GvNAMELEN(sstr);
3614         {
3615             if (dtype >= SVt_PV) {
3616                 SvPV_free(dstr);
3617                 SvPV_set(dstr, 0);
3618                 SvLEN_set(dstr, 0);
3619                 SvCUR_set(dstr, 0);
3620             }
3621             SvUPGRADE(dstr, SVt_PVGV);
3622             (void)SvOK_off(dstr);
3623             /* FIXME - why are we doing this, then turning it off and on again
3624                below?  */
3625             isGV_with_GP_on(dstr);
3626         }
3627         GvSTASH(dstr) = GvSTASH(sstr);
3628         if (GvSTASH(dstr))
3629             Perl_sv_add_backref(aTHX_ MUTABLE_SV(GvSTASH(dstr)), dstr);
3630         gv_name_set(MUTABLE_GV(dstr), name, len, GV_ADD);
3631         SvFAKE_on(dstr);        /* can coerce to non-glob */
3632     }
3633
3634     if(GvGP(MUTABLE_GV(sstr))) {
3635         /* If source has method cache entry, clear it */
3636         if(GvCVGEN(sstr)) {
3637             SvREFCNT_dec(GvCV(sstr));
3638             GvCV(sstr) = NULL;
3639             GvCVGEN(sstr) = 0;
3640         }
3641         /* If source has a real method, then a method is
3642            going to change */
3643         else if(GvCV((const GV *)sstr)) {
3644             mro_changes = 1;
3645         }
3646     }
3647
3648     /* If dest already had a real method, that's a change as well */
3649     if(!mro_changes && GvGP(MUTABLE_GV(dstr)) && GvCVu((const GV *)dstr)) {
3650         mro_changes = 1;
3651     }
3652
3653     if(strEQ(GvNAME((const GV *)dstr),"ISA"))
3654         mro_changes = 2;
3655
3656     gp_free(MUTABLE_GV(dstr));
3657     isGV_with_GP_off(dstr);
3658     (void)SvOK_off(dstr);
3659     isGV_with_GP_on(dstr);
3660     GvINTRO_off(dstr);          /* one-shot flag */
3661     GvGP(dstr) = gp_ref(GvGP(sstr));
3662     if (SvTAINTED(sstr))
3663         SvTAINT(dstr);
3664     if (GvIMPORTED(dstr) != GVf_IMPORTED
3665         && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3666         {
3667             GvIMPORTED_on(dstr);
3668         }
3669     GvMULTI_on(dstr);
3670     if(mro_changes == 2) mro_isa_changed_in(GvSTASH(dstr));
3671     else if(mro_changes) mro_method_changed_in(GvSTASH(dstr));
3672     return;
3673 }
3674
3675 static void
3676 S_glob_assign_ref(pTHX_ SV *const dstr, SV *const sstr)
3677 {
3678     SV * const sref = SvREFCNT_inc(SvRV(sstr));
3679     SV *dref = NULL;
3680     const int intro = GvINTRO(dstr);
3681     SV **location;
3682     U8 import_flag = 0;
3683     const U32 stype = SvTYPE(sref);
3684
3685     PERL_ARGS_ASSERT_GLOB_ASSIGN_REF;
3686
3687     if (intro) {
3688         GvINTRO_off(dstr);      /* one-shot flag */
3689         GvLINE(dstr) = CopLINE(PL_curcop);
3690         GvEGV(dstr) = MUTABLE_GV(dstr);
3691     }
3692     GvMULTI_on(dstr);
3693     switch (stype) {
3694     case SVt_PVCV:
3695         location = (SV **) &GvCV(dstr);
3696         import_flag = GVf_IMPORTED_CV;
3697         goto common;
3698     case SVt_PVHV:
3699         location = (SV **) &GvHV(dstr);
3700         import_flag = GVf_IMPORTED_HV;
3701         goto common;
3702     case SVt_PVAV:
3703         location = (SV **) &GvAV(dstr);
3704         import_flag = GVf_IMPORTED_AV;
3705         goto common;
3706     case SVt_PVIO:
3707         location = (SV **) &GvIOp(dstr);
3708         goto common;
3709     case SVt_PVFM:
3710         location = (SV **) &GvFORM(dstr);
3711         goto common;
3712     default:
3713         location = &GvSV(dstr);
3714         import_flag = GVf_IMPORTED_SV;
3715     common:
3716         if (intro) {
3717             if (stype == SVt_PVCV) {
3718                 /*if (GvCVGEN(dstr) && (GvCV(dstr) != (const CV *)sref || GvCVGEN(dstr))) {*/
3719                 if (GvCVGEN(dstr)) {
3720                     SvREFCNT_dec(GvCV(dstr));
3721                     GvCV(dstr) = NULL;
3722                     GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3723                 }
3724             }
3725             SAVEGENERICSV(*location);
3726         }
3727         else
3728             dref = *location;
3729         if (stype == SVt_PVCV && (*location != sref || GvCVGEN(dstr))) {
3730             CV* const cv = MUTABLE_CV(*location);
3731             if (cv) {
3732                 if (!GvCVGEN((const GV *)dstr) &&
3733                     (CvROOT(cv) || CvXSUB(cv)))
3734                     {
3735                         /* Redefining a sub - warning is mandatory if
3736                            it was a const and its value changed. */
3737                         if (CvCONST(cv) && CvCONST((const CV *)sref)
3738                             && cv_const_sv(cv)
3739                             == cv_const_sv((const CV *)sref)) {
3740                             NOOP;
3741                             /* They are 2 constant subroutines generated from
3742                                the same constant. This probably means that
3743                                they are really the "same" proxy subroutine
3744                                instantiated in 2 places. Most likely this is
3745                                when a constant is exported twice.  Don't warn.
3746                             */
3747                         }
3748                         else if (ckWARN(WARN_REDEFINE)
3749                                  || (CvCONST(cv)
3750                                      && (!CvCONST((const CV *)sref)
3751                                          || sv_cmp(cv_const_sv(cv),
3752                                                    cv_const_sv((const CV *)
3753                                                                sref))))) {
3754                             Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
3755                                         (const char *)
3756                                         (CvCONST(cv)
3757                                          ? "Constant subroutine %s::%s redefined"
3758                                          : "Subroutine %s::%s redefined"),
3759                                         HvNAME_get(GvSTASH((const GV *)dstr)),
3760                                         GvENAME(MUTABLE_GV(dstr)));
3761                         }
3762                     }
3763                 if (!intro)
3764                     cv_ckproto_len(cv, (const GV *)dstr,
3765                                    SvPOK(sref) ? SvPVX_const(sref) : NULL,
3766                                    SvPOK(sref) ? SvCUR(sref) : 0);
3767             }
3768             GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3769             GvASSUMECV_on(dstr);
3770             if(GvSTASH(dstr)) mro_method_changed_in(GvSTASH(dstr)); /* sub foo { 1 } sub bar { 2 } *bar = \&foo */
3771         }
3772         *location = sref;
3773         if (import_flag && !(GvFLAGS(dstr) & import_flag)
3774             && CopSTASH_ne(PL_curcop, GvSTASH(dstr))) {
3775             GvFLAGS(dstr) |= import_flag;
3776         }
3777         if (stype == SVt_PVAV && strEQ(GvNAME((GV*)dstr), "ISA")) {
3778             sv_magic(sref, dstr, PERL_MAGIC_isa, NULL, 0);
3779             mro_isa_changed_in(GvSTASH(dstr));
3780         }
3781         break;
3782     }
3783     SvREFCNT_dec(dref);
3784     if (SvTAINTED(sstr))
3785         SvTAINT(dstr);
3786     return;
3787 }
3788
3789 void
3790 Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV* sstr, const I32 flags)
3791 {
3792     dVAR;
3793     register U32 sflags;
3794     register int dtype;
3795     register svtype stype;
3796
3797     PERL_ARGS_ASSERT_SV_SETSV_FLAGS;
3798
3799     if (sstr == dstr)
3800         return;
3801
3802     if (SvIS_FREED(dstr)) {
3803         Perl_croak(aTHX_ "panic: attempt to copy value %" SVf
3804                    " to a freed scalar %p", SVfARG(sstr), (void *)dstr);
3805     }
3806     SV_CHECK_THINKFIRST_COW_DROP(dstr);
3807     if (!sstr)
3808         sstr = &PL_sv_undef;
3809     if (SvIS_FREED(sstr)) {
3810         Perl_croak(aTHX_ "panic: attempt to copy freed scalar %p to %p",
3811                    (void*)sstr, (void*)dstr);
3812     }
3813     stype = SvTYPE(sstr);
3814     dtype = SvTYPE(dstr);
3815
3816     (void)SvAMAGIC_off(dstr);
3817     if ( SvVOK(dstr) )
3818     {
3819         /* need to nuke the magic */
3820         mg_free(dstr);
3821     }
3822
3823     /* There's a lot of redundancy below but we're going for speed here */
3824
3825     switch (stype) {
3826     case SVt_NULL:
3827       undef_sstr:
3828         if (dtype != SVt_PVGV) {
3829             (void)SvOK_off(dstr);
3830             return;
3831         }
3832         break;
3833     case SVt_IV:
3834         if (SvIOK(sstr)) {
3835             switch (dtype) {
3836             case SVt_NULL:
3837                 sv_upgrade(dstr, SVt_IV);
3838                 break;
3839             case SVt_NV:
3840             case SVt_PV:
3841                 sv_upgrade(dstr, SVt_PVIV);
3842                 break;
3843             case SVt_PVGV:
3844                 goto end_of_first_switch;
3845             }
3846             (void)SvIOK_only(dstr);
3847             SvIV_set(dstr,  SvIVX(sstr));
3848             if (SvIsUV(sstr))
3849                 SvIsUV_on(dstr);
3850             /* SvTAINTED can only be true if the SV has taint magic, which in
3851                turn means that the SV type is PVMG (or greater). This is the
3852                case statement for SVt_IV, so this cannot be true (whatever gcov
3853                may say).  */
3854             assert(!SvTAINTED(sstr));
3855             return;
3856         }
3857         if (!SvROK(sstr))
3858             goto undef_sstr;
3859         if (dtype < SVt_PV && dtype != SVt_IV)
3860             sv_upgrade(dstr, SVt_IV);
3861         break;
3862
3863     case SVt_NV:
3864         if (SvNOK(sstr)) {
3865             switch (dtype) {
3866             case SVt_NULL:
3867             case SVt_IV:
3868                 sv_upgrade(dstr, SVt_NV);
3869                 break;
3870             case SVt_PV:
3871             case SVt_PVIV:
3872                 sv_upgrade(dstr, SVt_PVNV);
3873                 break;
3874             case SVt_PVGV:
3875                 goto end_of_first_switch;
3876             }
3877             SvNV_set(dstr, SvNVX(sstr));
3878             (void)SvNOK_only(dstr);
3879             /* SvTAINTED can only be true if the SV has taint magic, which in
3880                turn means that the SV type is PVMG (or greater). This is the
3881                case statement for SVt_NV, so this cannot be true (whatever gcov
3882                may say).  */
3883             assert(!SvTAINTED(sstr));
3884             return;
3885         }
3886         goto undef_sstr;
3887
3888     case SVt_PVFM:
3889 #ifdef PERL_OLD_COPY_ON_WRITE
3890         if ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS) {
3891             if (dtype < SVt_PVIV)
3892                 sv_upgrade(dstr, SVt_PVIV);
3893             break;
3894         }
3895         /* Fall through */
3896 #endif
3897     case SVt_PV:
3898         if (dtype < SVt_PV)
3899             sv_upgrade(dstr, SVt_PV);
3900         break;
3901     case SVt_PVIV:
3902         if (dtype < SVt_PVIV)
3903             sv_upgrade(dstr, SVt_PVIV);
3904         break;
3905     case SVt_PVNV:
3906         if (dtype < SVt_PVNV)
3907             sv_upgrade(dstr, SVt_PVNV);
3908         break;
3909     default:
3910         {
3911         const char * const type = sv_reftype(sstr,0);
3912         if (PL_op)
3913             Perl_croak(aTHX_ "Bizarre copy of %s in %s", type, OP_DESC(PL_op));
3914         else
3915             Perl_croak(aTHX_ "Bizarre copy of %s", type);
3916         }
3917         break;
3918
3919     case SVt_REGEXP:
3920         if (dtype < SVt_REGEXP)
3921             sv_upgrade(dstr, SVt_REGEXP);
3922         break;
3923
3924         /* case SVt_BIND: */
3925     case SVt_PVLV:
3926     case SVt_PVGV:
3927         if (isGV_with_GP(sstr) && dtype <= SVt_PVGV) {
3928             glob_assign_glob(dstr, sstr, dtype);
3929             return;
3930         }
3931         /* SvVALID means that this PVGV is playing at being an FBM.  */
3932         /*FALLTHROUGH*/
3933
3934     case SVt_PVMG:
3935         if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
3936             mg_get(sstr);
3937             if (SvTYPE(sstr) != stype) {
3938                 stype = SvTYPE(sstr);
3939                 if (isGV_with_GP(sstr) && stype == SVt_PVGV && dtype <= SVt_PVGV) {
3940                     glob_assign_glob(dstr, sstr, dtype);
3941                     return;
3942                 }
3943             }
3944         }
3945         if (stype == SVt_PVLV)
3946             SvUPGRADE(dstr, SVt_PVNV);
3947         else
3948             SvUPGRADE(dstr, (svtype)stype);
3949     }
3950  end_of_first_switch:
3951
3952     /* dstr may have been upgraded.  */
3953     dtype = SvTYPE(dstr);
3954     sflags = SvFLAGS(sstr);
3955
3956     if (dtype == SVt_PVCV || dtype == SVt_PVFM) {
3957         /* Assigning to a subroutine sets the prototype.  */
3958         if (SvOK(sstr)) {
3959             STRLEN len;
3960             const char *const ptr = SvPV_const(sstr, len);
3961
3962             SvGROW(dstr, len + 1);
3963             Copy(ptr, SvPVX(dstr), len + 1, char);
3964             SvCUR_set(dstr, len);
3965             SvPOK_only(dstr);
3966             SvFLAGS(dstr) |= sflags & SVf_UTF8;
3967         } else {
3968             SvOK_off(dstr);
3969         }
3970     } else if (dtype == SVt_PVAV || dtype == SVt_PVHV) {
3971         const char * const type = sv_reftype(dstr,0);
3972         if (PL_op)
3973             Perl_croak(aTHX_ "Cannot copy to %s in %s", type, OP_DESC(PL_op));
3974         else
3975             Perl_croak(aTHX_ "Cannot copy to %s", type);
3976     } else if (sflags & SVf_ROK) {
3977         if (isGV_with_GP(dstr) && dtype == SVt_PVGV
3978             && SvTYPE(SvRV(sstr)) == SVt_PVGV && isGV_with_GP(SvRV(sstr))) {
3979             sstr = SvRV(sstr);
3980             if (sstr == dstr) {
3981                 if (GvIMPORTED(dstr) != GVf_IMPORTED
3982                     && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3983                 {
3984                     GvIMPORTED_on(dstr);
3985                 }
3986                 GvMULTI_on(dstr);
3987                 return;
3988             }
3989             glob_assign_glob(dstr, sstr, dtype);
3990             return;
3991         }
3992
3993         if (dtype >= SVt_PV) {
3994             if (dtype == SVt_PVGV && isGV_with_GP(dstr)) {
3995                 glob_assign_ref(dstr, sstr);
3996                 return;
3997             }
3998             if (SvPVX_const(dstr)) {
3999                 SvPV_free(dstr);
4000                 SvLEN_set(dstr, 0);
4001                 SvCUR_set(dstr, 0);
4002             }
4003         }
4004         (void)SvOK_off(dstr);
4005         SvRV_set(dstr, SvREFCNT_inc(SvRV(sstr)));
4006         SvFLAGS(dstr) |= sflags & SVf_ROK;
4007         assert(!(sflags & SVp_NOK));
4008         assert(!(sflags & SVp_IOK));
4009         assert(!(sflags & SVf_NOK));
4010         assert(!(sflags & SVf_IOK));
4011     }
4012     else if (dtype == SVt_PVGV && isGV_with_GP(dstr)) {
4013         if (!(sflags & SVf_OK)) {
4014             Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
4015                            "Undefined value assigned to typeglob");
4016         }
4017         else {
4018             GV *gv = gv_fetchsv(sstr, GV_ADD, SVt_PVGV);
4019             if (dstr != (const SV *)gv) {
4020                 if (GvGP(dstr))
4021                     gp_free(MUTABLE_GV(dstr));
4022                 GvGP(dstr) = gp_ref(GvGP(gv));
4023             }
4024         }
4025     }
4026     else if (dtype == SVt_REGEXP && stype == SVt_REGEXP) {
4027         reg_temp_copy((REGEXP*)dstr, (REGEXP*)sstr);
4028     }
4029     else if (sflags & SVp_POK) {
4030         bool isSwipe = 0;
4031
4032         /*
4033          * Check to see if we can just swipe the string.  If so, it's a
4034          * possible small lose on short strings, but a big win on long ones.
4035          * It might even be a win on short strings if SvPVX_const(dstr)
4036          * has to be allocated and SvPVX_const(sstr) has to be freed.
4037          * Likewise if we can set up COW rather than doing an actual copy, we
4038          * drop to the else clause, as the swipe code and the COW setup code
4039          * have much in common.
4040          */
4041
4042         /* Whichever path we take through the next code, we want this true,
4043            and doing it now facilitates the COW check.  */
4044         (void)SvPOK_only(dstr);
4045
4046         if (
4047             /* If we're already COW then this clause is not true, and if COW
4048                is allowed then we drop down to the else and make dest COW 
4049                with us.  If caller hasn't said that we're allowed to COW
4050                shared hash keys then we don't do the COW setup, even if the
4051                source scalar is a shared hash key scalar.  */
4052             (((flags & SV_COW_SHARED_HASH_KEYS)
4053                ? (sflags & (SVf_FAKE|SVf_READONLY)) != (SVf_FAKE|SVf_READONLY)
4054                : 1 /* If making a COW copy is forbidden then the behaviour we
4055                        desire is as if the source SV isn't actually already
4056                        COW, even if it is.  So we act as if the source flags
4057                        are not COW, rather than actually testing them.  */
4058               )
4059 #ifndef PERL_OLD_COPY_ON_WRITE
4060              /* The change that added SV_COW_SHARED_HASH_KEYS makes the logic
4061                 when PERL_OLD_COPY_ON_WRITE is defined a little wrong.
4062                 Conceptually PERL_OLD_COPY_ON_WRITE being defined should
4063                 override SV_COW_SHARED_HASH_KEYS, because it means "always COW"
4064                 but in turn, it's somewhat dead code, never expected to go
4065                 live, but more kept as a placeholder on how to do it better
4066                 in a newer implementation.  */
4067              /* If we are COW and dstr is a suitable target then we drop down
4068                 into the else and make dest a COW of us.  */
4069              || (SvFLAGS(dstr) & CAN_COW_MASK) != CAN_COW_FLAGS
4070 #endif
4071              )
4072             &&
4073             !(isSwipe =
4074                  (sflags & SVs_TEMP) &&   /* slated for free anyway? */
4075                  !(sflags & SVf_OOK) &&   /* and not involved in OOK hack? */
4076                  (!(flags & SV_NOSTEAL)) &&
4077                                         /* and we're allowed to steal temps */
4078                  SvREFCNT(sstr) == 1 &&   /* and no other references to it? */
4079                  SvLEN(sstr))             /* and really is a string */
4080 #ifdef PERL_OLD_COPY_ON_WRITE
4081             && ((flags & SV_COW_SHARED_HASH_KEYS)
4082                 ? (!((sflags & CAN_COW_MASK) == CAN_COW_FLAGS
4083                      && (SvFLAGS(dstr) & CAN_COW_MASK) == CAN_COW_FLAGS
4084                      && SvTYPE(sstr) >= SVt_PVIV && SvTYPE(sstr) != SVt_PVFM))
4085                 : 1)
4086 #endif
4087             ) {
4088             /* Failed the swipe test, and it's not a shared hash key either.
4089                Have to copy the string.  */
4090             STRLEN len = SvCUR(sstr);
4091             SvGROW(dstr, len + 1);      /* inlined from sv_setpvn */
4092             Move(SvPVX_const(sstr),SvPVX(dstr),len,char);
4093             SvCUR_set(dstr, len);
4094             *SvEND(dstr) = '\0';
4095         } else {
4096             /* If PERL_OLD_COPY_ON_WRITE is not defined, then isSwipe will always
4097                be true in here.  */
4098             /* Either it's a shared hash key, or it's suitable for
4099                copy-on-write or we can swipe the string.  */
4100             if (DEBUG_C_TEST) {
4101                 PerlIO_printf(Perl_debug_log, "Copy on write: sstr --> dstr\n");
4102                 sv_dump(sstr);
4103                 sv_dump(dstr);
4104             }
4105 #ifdef PERL_OLD_COPY_ON_WRITE
4106             if (!isSwipe) {
4107                 if ((sflags & (SVf_FAKE | SVf_READONLY))
4108                     != (SVf_FAKE | SVf_READONLY)) {
4109                     SvREADONLY_on(sstr);
4110                     SvFAKE_on(sstr);
4111                     /* Make the source SV into a loop of 1.
4112                        (about to become 2) */
4113                     SV_COW_NEXT_SV_SET(sstr, sstr);
4114                 }
4115             }
4116 #endif
4117             /* Initial code is common.  */
4118             if (SvPVX_const(dstr)) {    /* we know that dtype >= SVt_PV */
4119                 SvPV_free(dstr);
4120             }
4121
4122             if (!isSwipe) {
4123                 /* making another shared SV.  */
4124                 STRLEN cur = SvCUR(sstr);
4125                 STRLEN len = SvLEN(sstr);
4126 #ifdef PERL_OLD_COPY_ON_WRITE
4127                 if (len) {
4128                     assert (SvTYPE(dstr) >= SVt_PVIV);
4129                     /* SvIsCOW_normal */
4130                     /* splice us in between source and next-after-source.  */
4131                     SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4132                     SV_COW_NEXT_SV_SET(sstr, dstr);
4133                     SvPV_set(dstr, SvPVX_mutable(sstr));
4134                 } else
4135 #endif
4136                 {
4137                     /* SvIsCOW_shared_hash */
4138                     DEBUG_C(PerlIO_printf(Perl_debug_log,
4139                                           "Copy on write: Sharing hash\n"));
4140
4141                     assert (SvTYPE(dstr) >= SVt_PV);
4142                     SvPV_set(dstr,
4143                              HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)))));
4144                 }
4145                 SvLEN_set(dstr, len);
4146                 SvCUR_set(dstr, cur);
4147                 SvREADONLY_on(dstr);
4148                 SvFAKE_on(dstr);
4149             }
4150             else
4151                 {       /* Passes the swipe test.  */
4152                 SvPV_set(dstr, SvPVX_mutable(sstr));
4153                 SvLEN_set(dstr, SvLEN(sstr));
4154                 SvCUR_set(dstr, SvCUR(sstr));
4155
4156                 SvTEMP_off(dstr);
4157                 (void)SvOK_off(sstr);   /* NOTE: nukes most SvFLAGS on sstr */
4158                 SvPV_set(sstr, NULL);
4159                 SvLEN_set(sstr, 0);
4160                 SvCUR_set(sstr, 0);
4161                 SvTEMP_off(sstr);
4162             }
4163         }
4164         if (sflags & SVp_NOK) {
4165             SvNV_set(dstr, SvNVX(sstr));
4166         }
4167         if (sflags & SVp_IOK) {
4168             SvIV_set(dstr, SvIVX(sstr));
4169             /* Must do this otherwise some other overloaded use of 0x80000000
4170                gets confused. I guess SVpbm_VALID */
4171             if (sflags & SVf_IVisUV)
4172                 SvIsUV_on(dstr);
4173         }
4174         SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_NOK|SVp_NOK|SVf_UTF8);
4175         {
4176             const MAGIC * const smg = SvVSTRING_mg(sstr);
4177             if (smg) {
4178                 sv_magic(dstr, NULL, PERL_MAGIC_vstring,
4179                          smg->mg_ptr, smg->mg_len);
4180                 SvRMAGICAL_on(dstr);
4181             }
4182         }
4183     }
4184     else if (sflags & (SVp_IOK|SVp_NOK)) {
4185         (void)SvOK_off(dstr);
4186         SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_IVisUV|SVf_NOK|SVp_NOK);
4187         if (sflags & SVp_IOK) {
4188             /* XXXX Do we want to set IsUV for IV(ROK)?  Be extra safe... */
4189             SvIV_set(dstr, SvIVX(sstr));
4190         }
4191         if (sflags & SVp_NOK) {
4192             SvNV_set(dstr, SvNVX(sstr));
4193         }
4194     }
4195     else {
4196         if (isGV_with_GP(sstr)) {
4197             /* This stringification rule for globs is spread in 3 places.
4198                This feels bad. FIXME.  */
4199             const U32 wasfake = sflags & SVf_FAKE;
4200
4201             /* FAKE globs can get coerced, so need to turn this off
4202                temporarily if it is on.  */
4203             SvFAKE_off(sstr);
4204             gv_efullname3(dstr, MUTABLE_GV(sstr), "*");
4205             SvFLAGS(sstr) |= wasfake;
4206         }
4207         else
4208             (void)SvOK_off(dstr);
4209     }
4210     if (SvTAINTED(sstr))
4211         SvTAINT(dstr);
4212 }
4213
4214 /*
4215 =for apidoc sv_setsv_mg
4216
4217 Like C<sv_setsv>, but also handles 'set' magic.
4218
4219 =cut
4220 */
4221
4222 void
4223 Perl_sv_setsv_mg(pTHX_ SV *const dstr, register SV *const sstr)
4224 {
4225     PERL_ARGS_ASSERT_SV_SETSV_MG;
4226
4227     sv_setsv(dstr,sstr);
4228     SvSETMAGIC(dstr);
4229 }
4230
4231 #ifdef PERL_OLD_COPY_ON_WRITE
4232 SV *
4233 Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
4234 {
4235     STRLEN cur = SvCUR(sstr);
4236     STRLEN len = SvLEN(sstr);
4237     register char *new_pv;
4238
4239     PERL_ARGS_ASSERT_SV_SETSV_COW;
4240
4241     if (DEBUG_C_TEST) {
4242         PerlIO_printf(Perl_debug_log, "Fast copy on write: %p -> %p\n",
4243                       (void*)sstr, (void*)dstr);
4244         sv_dump(sstr);
4245         if (dstr)
4246                     sv_dump(dstr);
4247     }
4248
4249     if (dstr) {
4250         if (SvTHINKFIRST(dstr))
4251             sv_force_normal_flags(dstr, SV_COW_DROP_PV);
4252         else if (SvPVX_const(dstr))
4253             Safefree(SvPVX_const(dstr));
4254     }
4255     else
4256         new_SV(dstr);
4257     SvUPGRADE(dstr, SVt_PVIV);
4258
4259     assert (SvPOK(sstr));
4260     assert (SvPOKp(sstr));
4261     assert (!SvIOK(sstr));
4262     assert (!SvIOKp(sstr));
4263     assert (!SvNOK(sstr));
4264     assert (!SvNOKp(sstr));
4265
4266     if (SvIsCOW(sstr)) {
4267
4268         if (SvLEN(sstr) == 0) {
4269             /* source is a COW shared hash key.  */
4270             DEBUG_C(PerlIO_printf(Perl_debug_log,
4271                                   "Fast copy on write: Sharing hash\n"));
4272             new_pv = HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr))));
4273             goto common_exit;
4274         }
4275         SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4276     } else {
4277         assert ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS);
4278         SvUPGRADE(sstr, SVt_PVIV);
4279         SvREADONLY_on(sstr);
4280         SvFAKE_on(sstr);
4281         DEBUG_C(PerlIO_printf(Perl_debug_log,
4282                               "Fast copy on write: Converting sstr to COW\n"));
4283         SV_COW_NEXT_SV_SET(dstr, sstr);
4284     }
4285     SV_COW_NEXT_SV_SET(sstr, dstr);
4286     new_pv = SvPVX_mutable(sstr);
4287
4288   common_exit:
4289     SvPV_set(dstr, new_pv);
4290     SvFLAGS(dstr) = (SVt_PVIV|SVf_POK|SVp_POK|SVf_FAKE|SVf_READONLY);
4291     if (SvUTF8(sstr))
4292         SvUTF8_on(dstr);
4293     SvLEN_set(dstr, len);
4294     SvCUR_set(dstr, cur);
4295     if (DEBUG_C_TEST) {
4296         sv_dump(dstr);
4297     }
4298     return dstr;
4299 }
4300 #endif
4301
4302 /*
4303 =for apidoc sv_setpvn
4304
4305 Copies a string into an SV.  The C<len> parameter indicates the number of
4306 bytes to be copied.  If the C<ptr> argument is NULL the SV will become
4307 undefined.  Does not handle 'set' magic.  See C<sv_setpvn_mg>.
4308
4309 =cut
4310 */
4311
4312 void
4313 Perl_sv_setpvn(pTHX_ register SV *const sv, register const char *const ptr, register const STRLEN len)
4314 {
4315     dVAR;
4316     register char *dptr;
4317
4318     PERL_ARGS_ASSERT_SV_SETPVN;
4319
4320     SV_CHECK_THINKFIRST_COW_DROP(sv);
4321     if (!ptr) {
4322         (void)SvOK_off(sv);
4323         return;
4324     }
4325     else {
4326         /* len is STRLEN which is unsigned, need to copy to signed */
4327         const IV iv = len;
4328         if (iv < 0)
4329             Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen");
4330     }
4331     SvUPGRADE(sv, SVt_PV);
4332
4333     dptr = SvGROW(sv, len + 1);
4334     Move(ptr,dptr,len,char);
4335     dptr[len] = '\0';
4336     SvCUR_set(sv, len);
4337     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4338     SvTAINT(sv);
4339 }
4340
4341 /*
4342 =for apidoc sv_setpvn_mg
4343
4344 Like C<sv_setpvn>, but also handles 'set' magic.
4345
4346 =cut
4347 */
4348
4349 void
4350 Perl_sv_setpvn_mg(pTHX_ register SV *const sv, register const char *const ptr, register const STRLEN len)
4351 {
4352     PERL_ARGS_ASSERT_SV_SETPVN_MG;
4353
4354     sv_setpvn(sv,ptr,len);
4355     SvSETMAGIC(sv);
4356 }
4357
4358 /*
4359 =for apidoc sv_setpv
4360
4361 Copies a string into an SV.  The string must be null-terminated.  Does not
4362 handle 'set' magic.  See C<sv_setpv_mg>.
4363
4364 =cut
4365 */
4366
4367 void
4368 Perl_sv_setpv(pTHX_ register SV *const sv, register const char *const ptr)
4369 {
4370     dVAR;
4371     register STRLEN len;
4372
4373     PERL_ARGS_ASSERT_SV_SETPV;
4374
4375     SV_CHECK_THINKFIRST_COW_DROP(sv);
4376     if (!ptr) {
4377         (void)SvOK_off(sv);
4378         return;
4379     }
4380     len = strlen(ptr);
4381     SvUPGRADE(sv, SVt_PV);
4382
4383     SvGROW(sv, len + 1);
4384     Move(ptr,SvPVX(sv),len+1,char);
4385     SvCUR_set(sv, len);
4386     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4387     SvTAINT(sv);
4388 }
4389
4390 /*
4391 =for apidoc sv_setpv_mg
4392
4393 Like C<sv_setpv>, but also handles 'set' magic.
4394
4395 =cut
4396 */
4397
4398 void
4399 Perl_sv_setpv_mg(pTHX_ register SV *const sv, register const char *const ptr)
4400 {
4401     PERL_ARGS_ASSERT_SV_SETPV_MG;
4402
4403     sv_setpv(sv,ptr);
4404     SvSETMAGIC(sv);
4405 }
4406
4407 /*
4408 =for apidoc sv_usepvn_flags
4409
4410 Tells an SV to use C<ptr> to find its string value.  Normally the
4411 string is stored inside the SV but sv_usepvn allows the SV to use an
4412 outside string.  The C<ptr> should point to memory that was allocated
4413 by C<malloc>.  The string length, C<len>, must be supplied.  By default
4414 this function will realloc (i.e. move) the memory pointed to by C<ptr>,
4415 so that pointer should not be freed or used by the programmer after
4416 giving it to sv_usepvn, and neither should any pointers from "behind"
4417 that pointer (e.g. ptr + 1) be used.
4418
4419 If C<flags> & SV_SMAGIC is true, will call SvSETMAGIC. If C<flags> &
4420 SV_HAS_TRAILING_NUL is true, then C<ptr[len]> must be NUL, and the realloc
4421 will be skipped. (i.e. the buffer is actually at least 1 byte longer than
4422 C<len>, and already meets the requirements for storing in C<SvPVX>)
4423
4424 =cut
4425 */
4426
4427 void
4428 Perl_sv_usepvn_flags(pTHX_ SV *const sv, char *ptr, const STRLEN len, const U32 flags)
4429 {
4430     dVAR;
4431     STRLEN allocate;
4432
4433     PERL_ARGS_ASSERT_SV_USEPVN_FLAGS;
4434
4435     SV_CHECK_THINKFIRST_COW_DROP(sv);
4436     SvUPGRADE(sv, SVt_PV);
4437     if (!ptr) {
4438         (void)SvOK_off(sv);
4439         if (flags & SV_SMAGIC)
4440             SvSETMAGIC(sv);
4441         return;
4442     }
4443     if (SvPVX_const(sv))
4444         SvPV_free(sv);
4445
4446 #ifdef DEBUGGING
4447     if (flags & SV_HAS_TRAILING_NUL)
4448         assert(ptr[len] == '\0');
4449 #endif
4450
4451     allocate = (flags & SV_HAS_TRAILING_NUL)
4452         ? len + 1 :
4453 #ifdef Perl_safesysmalloc_size
4454         len + 1;
4455 #else 
4456         PERL_STRLEN_ROUNDUP(len + 1);
4457 #endif
4458     if (flags & SV_HAS_TRAILING_NUL) {
4459         /* It's long enough - do nothing.
4460            Specfically Perl_newCONSTSUB is relying on this.  */
4461     } else {
4462 #ifdef DEBUGGING
4463         /* Force a move to shake out bugs in callers.  */
4464         char *new_ptr = (char*)safemalloc(allocate);
4465         Copy(ptr, new_ptr, len, char);
4466         PoisonFree(ptr,len,char);
4467         Safefree(ptr);
4468         ptr = new_ptr;
4469 #else
4470         ptr = (char*) saferealloc (ptr, allocate);
4471 #endif
4472     }
4473 #ifdef Perl_safesysmalloc_size
4474     SvLEN_set(sv, Perl_safesysmalloc_size(ptr));
4475 #else
4476     SvLEN_set(sv, allocate);
4477 #endif
4478     SvCUR_set(sv, len);
4479     SvPV_set(sv, ptr);
4480     if (!(flags & SV_HAS_TRAILING_NUL)) {
4481         ptr[len] = '\0';
4482     }
4483     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4484     SvTAINT(sv);
4485     if (flags & SV_SMAGIC)
4486         SvSETMAGIC(sv);
4487 }
4488
4489 #ifdef PERL_OLD_COPY_ON_WRITE
4490 /* Need to do this *after* making the SV normal, as we need the buffer
4491    pointer to remain valid until after we've copied it.  If we let go too early,
4492    another thread could invalidate it by unsharing last of the same hash key
4493    (which it can do by means other than releasing copy-on-write Svs)
4494    or by changing the other copy-on-write SVs in the loop.  */
4495 STATIC void
4496 S_sv_release_COW(pTHX_ register SV *sv, const char *pvx, SV *after)
4497 {
4498     PERL_ARGS_ASSERT_SV_RELEASE_COW;
4499
4500     { /* this SV was SvIsCOW_normal(sv) */
4501          /* we need to find the SV pointing to us.  */
4502         SV *current = SV_COW_NEXT_SV(after);
4503
4504         if (current == sv) {
4505             /* The SV we point to points back to us (there were only two of us
4506                in the loop.)
4507                Hence other SV is no longer copy on write either.  */
4508             SvFAKE_off(after);
4509             SvREADONLY_off(after);
4510         } else {
4511             /* We need to follow the pointers around the loop.  */
4512             SV *next;
4513             while ((next = SV_COW_NEXT_SV(current)) != sv) {
4514                 assert (next);
4515                 current = next;
4516                  /* don't loop forever if the structure is bust, and we have
4517                     a pointer into a closed loop.  */
4518                 assert (current != after);
4519                 assert (SvPVX_const(current) == pvx);
4520             }
4521             /* Make the SV before us point to the SV after us.  */
4522             SV_COW_NEXT_SV_SET(current, after);
4523         }
4524     }
4525 }
4526 #endif
4527 /*
4528 =for apidoc sv_force_normal_flags
4529
4530 Undo various types of fakery on an SV: if the PV is a shared string, make
4531 a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
4532 an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
4533 we do the copy, and is also used locally. If C<SV_COW_DROP_PV> is set
4534 then a copy-on-write scalar drops its PV buffer (if any) and becomes
4535 SvPOK_off rather than making a copy. (Used where this scalar is about to be
4536 set to some other value.) In addition, the C<flags> parameter gets passed to
4537 C<sv_unref_flags()> when unrefing. C<sv_force_normal> calls this function
4538 with flags set to 0.
4539
4540 =cut
4541 */
4542
4543 void
4544 Perl_sv_force_normal_flags(pTHX_ register SV *const sv, const U32 flags)
4545 {
4546     dVAR;
4547
4548     PERL_ARGS_ASSERT_SV_FORCE_NORMAL_FLAGS;
4549
4550 #ifdef PERL_OLD_COPY_ON_WRITE
4551     if (SvREADONLY(sv)) {
4552         if (SvFAKE(sv)) {
4553             const char * const pvx = SvPVX_const(sv);
4554             const STRLEN len = SvLEN(sv);
4555             const STRLEN cur = SvCUR(sv);
4556             /* next COW sv in the loop.  If len is 0 then this is a shared-hash
4557                key scalar, so we mustn't attempt to call SV_COW_NEXT_SV(), as
4558                we'll fail an assertion.  */
4559             SV * const next = len ? SV_COW_NEXT_SV(sv) : 0;
4560
4561             if (DEBUG_C_TEST) {
4562                 PerlIO_printf(Perl_debug_log,
4563                               "Copy on write: Force normal %ld\n",
4564                               (long) flags);
4565                 sv_dump(sv);
4566             }
4567             SvFAKE_off(sv);
4568             SvREADONLY_off(sv);
4569             /* This SV doesn't own the buffer, so need to Newx() a new one:  */
4570             SvPV_set(sv, NULL);
4571             SvLEN_set(sv, 0);
4572             if (flags & SV_COW_DROP_PV) {
4573                 /* OK, so we don't need to copy our buffer.  */
4574                 SvPOK_off(sv);
4575             } else {
4576                 SvGROW(sv, cur + 1);
4577                 Move(pvx,SvPVX(sv),cur,char);
4578                 SvCUR_set(sv, cur);
4579                 *SvEND(sv) = '\0';
4580             }
4581             if (len) {
4582                 sv_release_COW(sv, pvx, next);
4583             } else {
4584                 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
4585             }
4586             if (DEBUG_C_TEST) {
4587                 sv_dump(sv);
4588             }
4589         }
4590         else if (IN_PERL_RUNTIME)
4591             Perl_croak(aTHX_ "%s", PL_no_modify);
4592     }
4593 #else
4594     if (SvREADONLY(sv)) {
4595         if (SvFAKE(sv)) {
4596             const char * const pvx = SvPVX_const(sv);
4597             const STRLEN len = SvCUR(sv);
4598             SvFAKE_off(sv);
4599             SvREADONLY_off(sv);
4600             SvPV_set(sv, NULL);
4601             SvLEN_set(sv, 0);
4602             SvGROW(sv, len + 1);
4603             Move(pvx,SvPVX(sv),len,char);
4604             *SvEND(sv) = '\0';
4605             unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
4606         }
4607         else if (IN_PERL_RUNTIME)
4608             Perl_croak(aTHX_ "%s", PL_no_modify);
4609     }
4610 #endif
4611     if (SvROK(sv))
4612         sv_unref_flags(sv, flags);
4613     else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
4614         sv_unglob(sv);
4615     else if (SvFAKE(sv) && SvTYPE(sv) == SVt_REGEXP) {
4616         /* Need to downgrade the REGEXP to a simple(r) scalar. This is analagous
4617            to sv_unglob. We only need it here, so inline it.  */
4618         const svtype new_type = SvMAGIC(sv) || SvSTASH(sv) ? SVt_PVMG : SVt_PV;
4619         SV *const temp = newSV_type(new_type);
4620         void *const temp_p = SvANY(sv);
4621
4622         if (new_type == SVt_PVMG) {
4623             SvMAGIC_set(temp, SvMAGIC(sv));
4624             SvMAGIC_set(sv, NULL);
4625             SvSTASH_set(temp, SvSTASH(sv));
4626             SvSTASH_set(sv, NULL);
4627         }
4628         SvCUR_set(temp, SvCUR(sv));
4629         /* Remember that SvPVX is in the head, not the body. */
4630         if (SvLEN(temp)) {
4631             SvLEN_set(temp, SvLEN(sv));
4632             /* This signals "buffer is owned by someone else" in sv_clear,
4633                which is the least effort way to stop it freeing the buffer.
4634             */
4635             SvLEN_set(sv, SvLEN(sv)+1);
4636         } else {
4637             /* Their buffer is already owned by someone else. */
4638             SvPVX(sv) = savepvn(SvPVX(sv), SvCUR(sv));
4639             SvLEN_set(temp, SvCUR(sv)+1);
4640         }
4641
4642         /* Now swap the rest of the bodies. */
4643
4644         SvFLAGS(sv) &= ~(SVf_FAKE|SVTYPEMASK);
4645         SvFLAGS(sv) |= new_type;
4646         SvANY(sv) = SvANY(temp);
4647
4648         SvFLAGS(temp) &= ~(SVTYPEMASK);
4649         SvFLAGS(temp) |= SVt_REGEXP|SVf_FAKE;
4650         SvANY(temp) = temp_p;
4651
4652         SvREFCNT_dec(temp);
4653     }
4654 }
4655
4656 /*
4657 =for apidoc sv_chop
4658
4659 Efficient removal of characters from the beginning of the string buffer.
4660 SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
4661 the string buffer.  The C<ptr> becomes the first character of the adjusted
4662 string. Uses the "OOK hack".
4663 Beware: after this function returns, C<ptr> and SvPVX_const(sv) may no longer
4664 refer to the same chunk of data.
4665
4666 =cut
4667 */
4668
4669 void
4670 Perl_sv_chop(pTHX_ register SV *const sv, register const char *const ptr)
4671 {
4672     STRLEN delta;
4673     STRLEN old_delta;
4674     U8 *p;
4675 #ifdef DEBUGGING
4676     const U8 *real_start;
4677 #endif
4678     STRLEN max_delta;
4679
4680     PERL_ARGS_ASSERT_SV_CHOP;
4681
4682     if (!ptr || !SvPOKp(sv))
4683         return;
4684     delta = ptr - SvPVX_const(sv);
4685     if (!delta) {
4686         /* Nothing to do.  */
4687         return;
4688     }
4689     /* SvPVX(sv) may move in SV_CHECK_THINKFIRST(sv), but after this line,
4690        nothing uses the value of ptr any more.  */
4691     max_delta = SvLEN(sv) ? SvLEN(sv) : SvCUR(sv);
4692     if (ptr <= SvPVX_const(sv))
4693         Perl_croak(aTHX_ "panic: sv_chop ptr=%p, start=%p, end=%p",
4694                    ptr, SvPVX_const(sv), SvPVX_const(sv) + max_delta);
4695     SV_CHECK_THINKFIRST(sv);
4696     if (delta > max_delta)
4697         Perl_croak(aTHX_ "panic: sv_chop ptr=%p (was %p), start=%p, end=%p",
4698                    SvPVX_const(sv) + delta, ptr, SvPVX_const(sv),
4699                    SvPVX_const(sv) + max_delta);
4700
4701     if (!SvOOK(sv)) {
4702         if (!SvLEN(sv)) { /* make copy of shared string */
4703             const char *pvx = SvPVX_const(sv);
4704             const STRLEN len = SvCUR(sv);
4705             SvGROW(sv, len + 1);
4706             Move(pvx,SvPVX(sv),len,char);
4707             *SvEND(sv) = '\0';
4708         }
4709         SvFLAGS(sv) |= SVf_OOK;
4710         old_delta = 0;
4711     } else {
4712         SvOOK_offset(sv, old_delta);
4713     }
4714     SvLEN_set(sv, SvLEN(sv) - delta);
4715     SvCUR_set(sv, SvCUR(sv) - delta);
4716     SvPV_set(sv, SvPVX(sv) + delta);
4717
4718     p = (U8 *)SvPVX_const(sv);
4719
4720     delta += old_delta;
4721
4722 #ifdef DEBUGGING
4723     real_start = p - delta;
4724 #endif
4725
4726     assert(delta);
4727     if (delta < 0x100) {
4728         *--p = (U8) delta;
4729     } else {
4730         *--p = 0;
4731         p -= sizeof(STRLEN);
4732         Copy((U8*)&delta, p, sizeof(STRLEN), U8);
4733     }
4734
4735 #ifdef DEBUGGING
4736     /* Fill the preceding buffer with sentinals to verify that no-one is
4737        using it.  */
4738     while (p > real_start) {
4739         --p;
4740         *p = (U8)PTR2UV(p);
4741     }
4742 #endif
4743 }
4744
4745 /*
4746 =for apidoc sv_catpvn
4747
4748 Concatenates the string onto the end of the string which is in the SV.  The
4749 C<len> indicates number of bytes to copy.  If the SV has the UTF-8
4750 status set, then the bytes appended should be valid UTF-8.
4751 Handles 'get' magic, but not 'set' magic.  See C<sv_catpvn_mg>.
4752
4753 =for apidoc sv_catpvn_flags
4754
4755 Concatenates the string onto the end of the string which is in the SV.  The
4756 C<len> indicates number of bytes to copy.  If the SV has the UTF-8
4757 status set, then the bytes appended should be valid UTF-8.
4758 If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
4759 appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
4760 in terms of this function.
4761
4762 =cut
4763 */
4764
4765 void
4766 Perl_sv_catpvn_flags(pTHX_ register SV *const dsv, register const char *sstr, register const STRLEN slen, const I32 flags)
4767 {
4768     dVAR;
4769     STRLEN dlen;
4770     const char * const dstr = SvPV_force_flags(dsv, dlen, flags);
4771
4772     PERL_ARGS_ASSERT_SV_CATPVN_FLAGS;
4773
4774     SvGROW(dsv, dlen + slen + 1);
4775     if (sstr == dstr)
4776         sstr = SvPVX_const(dsv);
4777     Move(sstr, SvPVX(dsv) + dlen, slen, char);
4778     SvCUR_set(dsv, SvCUR(dsv) + slen);
4779     *SvEND(dsv) = '\0';
4780     (void)SvPOK_only_UTF8(dsv);         /* validate pointer */
4781     SvTAINT(dsv);
4782     if (flags & SV_SMAGIC)
4783         SvSETMAGIC(dsv);
4784 }
4785
4786 /*
4787 =for apidoc sv_catsv
4788
4789 Concatenates the string from SV C<ssv> onto the end of the string in
4790 SV C<dsv>.  Modifies C<dsv> but not C<ssv>.  Handles 'get' magic, but
4791 not 'set' magic.  See C<sv_catsv_mg>.
4792
4793 =for apidoc sv_catsv_flags
4794
4795 Concatenates the string from SV C<ssv> onto the end of the string in
4796 SV C<dsv>.  Modifies C<dsv> but not C<ssv>.  If C<flags> has C<SV_GMAGIC>
4797 bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
4798 and C<sv_catsv_nomg> are implemented in terms of this function.
4799
4800 =cut */
4801
4802 void
4803 Perl_sv_catsv_flags(pTHX_ SV *const dsv, register SV *const ssv, const I32 flags)
4804 {
4805     dVAR;
4806  
4807     PERL_ARGS_ASSERT_SV_CATSV_FLAGS;
4808
4809    if (ssv) {
4810         STRLEN slen;
4811         const char *spv = SvPV_const(ssv, slen);
4812         if (spv) {
4813             /*  sutf8 and dutf8 were type bool, but under USE_ITHREADS,
4814                 gcc version 2.95.2 20000220 (Debian GNU/Linux) for
4815                 Linux xxx 2.2.17 on sparc64 with gcc -O2, we erroneously
4816                 get dutf8 = 0x20000000, (i.e.  SVf_UTF8) even though
4817                 dsv->sv_flags doesn't have that bit set.
4818                 Andy Dougherty  12 Oct 2001
4819             */
4820             const I32 sutf8 = DO_UTF8(ssv);
4821             I32 dutf8;
4822
4823             if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
4824                 mg_get(dsv);
4825             dutf8 = DO_UTF8(dsv);
4826
4827             if (dutf8 != sutf8) {
4828                 if (dutf8) {
4829                     /* Not modifying source SV, so taking a temporary copy. */
4830                     SV* const csv = newSVpvn_flags(spv, slen, SVs_TEMP);
4831
4832                     sv_utf8_upgrade(csv);
4833                     spv = SvPV_const(csv, slen);
4834                 }
4835                 else
4836                     /* Leave enough space for the cat that's about to happen */
4837                     sv_utf8_upgrade_flags_grow(dsv, 0, slen);
4838             }
4839             sv_catpvn_nomg(dsv, spv, slen);
4840         }
4841     }
4842     if (flags & SV_SMAGIC)
4843         SvSETMAGIC(dsv);
4844 }
4845
4846 /*
4847 =for apidoc sv_catpv
4848
4849 Concatenates the string onto the end of the string which is in the SV.
4850 If the SV has the UTF-8 status set, then the bytes appended should be
4851 valid UTF-8.  Handles 'get' magic, but not 'set' magic.  See C<sv_catpv_mg>.
4852
4853 =cut */
4854
4855 void
4856 Perl_sv_catpv(pTHX_ register SV *const sv, register const char *ptr)
4857 {
4858     dVAR;
4859     register STRLEN len;
4860     STRLEN tlen;
4861     char *junk;
4862
4863     PERL_ARGS_ASSERT_SV_CATPV;
4864
4865     if (!ptr)
4866         return;
4867     junk = SvPV_force(sv, tlen);
4868     len = strlen(ptr);
4869     SvGROW(sv, tlen + len + 1);
4870     if (ptr == junk)
4871         ptr = SvPVX_const(sv);
4872     Move(ptr,SvPVX(sv)+tlen,len+1,char);
4873     SvCUR_set(sv, SvCUR(sv) + len);
4874     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4875     SvTAINT(sv);
4876 }
4877
4878 /*
4879 =for apidoc sv_catpv_mg
4880
4881 Like C<sv_catpv>, but also handles 'set' magic.
4882
4883 =cut
4884 */
4885
4886 void
4887 Perl_sv_catpv_mg(pTHX_ register SV *const sv, register const char *const ptr)
4888 {
4889     PERL_ARGS_ASSERT_SV_CATPV_MG;
4890
4891     sv_catpv(sv,ptr);
4892     SvSETMAGIC(sv);
4893 }
4894
4895 /*
4896 =for apidoc newSV
4897
4898 Creates a new SV.  A non-zero C<len> parameter indicates the number of
4899 bytes of preallocated string space the SV should have.  An extra byte for a
4900 trailing NUL is also reserved.  (SvPOK is not set for the SV even if string
4901 space is allocated.)  The reference count for the new SV is set to 1.
4902
4903 In 5.9.3, newSV() replaces the older NEWSV() API, and drops the first
4904 parameter, I<x>, a debug aid which allowed callers to identify themselves.
4905 This aid has been superseded by a new build option, PERL_MEM_LOG (see
4906 L<perlhack/PERL_MEM_LOG>).  The older API is still there for use in XS
4907 modules supporting older perls.
4908
4909 =cut
4910 */
4911
4912 SV *
4913 Perl_newSV(pTHX_ const STRLEN len)
4914 {
4915     dVAR;
4916     register SV *sv;
4917
4918     new_SV(sv);
4919     if (len) {
4920         sv_upgrade(sv, SVt_PV);
4921         SvGROW(sv, len + 1);
4922     }
4923     return sv;
4924 }
4925 /*
4926 =for apidoc sv_magicext
4927
4928 Adds magic to an SV, upgrading it if necessary. Applies the
4929 supplied vtable and returns a pointer to the magic added.
4930
4931 Note that C<sv_magicext> will allow things that C<sv_magic> will not.
4932 In particular, you can add magic to SvREADONLY SVs, and add more than
4933 one instance of the same 'how'.
4934
4935 If C<namlen> is greater than zero then a C<savepvn> I<copy> of C<name> is
4936 stored, if C<namlen> is zero then C<name> is stored as-is and - as another
4937 special case - if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
4938 to contain an C<SV*> and is stored as-is with its REFCNT incremented.
4939
4940 (This is now used as a subroutine by C<sv_magic>.)
4941
4942 =cut
4943 */
4944 MAGIC * 
4945 Perl_sv_magicext(pTHX_ SV *const sv, SV *const obj, const int how, 
4946                 const MGVTBL *const vtable, const char *const name, const I32 namlen)
4947 {
4948     dVAR;
4949     MAGIC* mg;
4950
4951     PERL_ARGS_ASSERT_SV_MAGICEXT;
4952
4953     SvUPGRADE(sv, SVt_PVMG);
4954     Newxz(mg, 1, MAGIC);
4955     mg->mg_moremagic = SvMAGIC(sv);
4956     SvMAGIC_set(sv, mg);
4957
4958     /* Sometimes a magic contains a reference loop, where the sv and
4959        object refer to each other.  To prevent a reference loop that
4960        would prevent such objects being freed, we look for such loops
4961        and if we find one we avoid incrementing the object refcount.
4962
4963        Note we cannot do this to avoid self-tie loops as intervening RV must
4964        have its REFCNT incremented to keep it in existence.
4965
4966     */
4967     if (!obj || obj == sv ||
4968         how == PERL_MAGIC_arylen ||
4969         how == PERL_MAGIC_symtab ||
4970         (SvTYPE(obj) == SVt_PVGV &&
4971             (GvSV(obj) == sv || GvHV(obj) == (const HV *)sv
4972              || GvAV(obj) == (const AV *)sv || GvCV(obj) == (const CV *)sv
4973              || GvIOp(obj) == (const IO *)sv || GvFORM(obj) == (const CV *)sv)))
4974     {
4975         mg->mg_obj = obj;
4976     }
4977     else {
4978         mg->mg_obj = SvREFCNT_inc_simple(obj);
4979         mg->mg_flags |= MGf_REFCOUNTED;
4980     }
4981
4982     /* Normal self-ties simply pass a null object, and instead of
4983        using mg_obj directly, use the SvTIED_obj macro to produce a
4984        new RV as needed.  For glob "self-ties", we are tieing the PVIO
4985        with an RV obj pointing to the glob containing the PVIO.  In
4986        this case, to avoid a reference loop, we need to weaken the
4987        reference.
4988     */
4989
4990     if (how == PERL_MAGIC_tiedscalar && SvTYPE(sv) == SVt_PVIO &&
4991         obj && SvROK(obj) && GvIO(SvRV(obj)) == (const IO *)sv)
4992     {
4993       sv_rvweaken(obj);
4994     }
4995
4996     mg->mg_type = how;
4997     mg->mg_len = namlen;
4998     if (name) {
4999         if (namlen > 0)
5000             mg->mg_ptr = savepvn(name, namlen);
5001         else if (namlen == HEf_SVKEY) {
5002             /* Yes, this is casting away const. This is only for the case of
5003                HEf_SVKEY. I think we need to document this abberation of the
5004                constness of the API, rather than making name non-const, as
5005                that change propagating outwards a long way.  */
5006             mg->mg_ptr = (char*)SvREFCNT_inc_simple_NN((SV *)name);
5007         } else
5008             mg->mg_ptr = (char *) name;
5009     }
5010     mg->mg_virtual = (MGVTBL *) vtable;
5011
5012     mg_magical(sv);
5013     if (SvGMAGICAL(sv))
5014         SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
5015     return mg;
5016 }
5017
5018 /*
5019 =for apidoc sv_magic
5020
5021 Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
5022 then adds a new magic item of type C<how> to the head of the magic list.
5023
5024 See C<sv_magicext> (which C<sv_magic> now calls) for a description of the
5025 handling of the C<name> and C<namlen> arguments.
5026
5027 You need to use C<sv_magicext> to add magic to SvREADONLY SVs and also
5028 to add more than one instance of the same 'how'.
5029
5030 =cut
5031 */
5032
5033 void
5034 Perl_sv_magic(pTHX_ register SV *const sv, SV *const obj, const int how, 
5035              const char *const name, const I32 namlen)
5036 {
5037     dVAR;
5038     const MGVTBL *vtable;
5039     MAGIC* mg;
5040
5041     PERL_ARGS_ASSERT_SV_MAGIC;
5042
5043 #ifdef PERL_OLD_COPY_ON_WRITE
5044     if (SvIsCOW(sv))
5045         sv_force_normal_flags(sv, 0);
5046 #endif
5047     if (SvREADONLY(sv)) {
5048         if (
5049             /* its okay to attach magic to shared strings; the subsequent
5050              * upgrade to PVMG will unshare the string */
5051             !(SvFAKE(sv) && SvTYPE(sv) < SVt_PVMG)
5052
5053             && IN_PERL_RUNTIME
5054             && how != PERL_MAGIC_regex_global
5055             && how != PERL_MAGIC_bm
5056             && how != PERL_MAGIC_fm
5057             && how != PERL_MAGIC_sv
5058             && how != PERL_MAGIC_backref
5059            )
5060         {
5061             Perl_croak(aTHX_ "%s", PL_no_modify);
5062         }
5063     }
5064     if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
5065         if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
5066             /* sv_magic() refuses to add a magic of the same 'how' as an
5067                existing one
5068              */
5069             if (how == PERL_MAGIC_taint) {
5070                 mg->mg_len |= 1;
5071                 /* Any scalar which already had taint magic on which someone
5072                    (erroneously?) did SvIOK_on() or similar will now be
5073                    incorrectly sporting public "OK" flags.  */
5074                 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
5075             }
5076             return;
5077         }
5078     }
5079
5080     switch (how) {
5081     case PERL_MAGIC_sv:
5082         vtable = &PL_vtbl_sv;
5083         break;
5084     case PERL_MAGIC_overload:
5085         vtable = &PL_vtbl_amagic;
5086         break;
5087     case PERL_MAGIC_overload_elem:
5088         vtable = &PL_vtbl_amagicelem;
5089         break;
5090     case PERL_MAGIC_overload_table:
5091         vtable = &PL_vtbl_ovrld;
5092         break;
5093     case PERL_MAGIC_bm:
5094         vtable = &PL_vtbl_bm;
5095         break;
5096     case PERL_MAGIC_regdata:
5097         vtable = &PL_vtbl_regdata;
5098         break;
5099     case PERL_MAGIC_regdatum:
5100         vtable = &PL_vtbl_regdatum;
5101         break;
5102     case PERL_MAGIC_env:
5103         vtable = &PL_vtbl_env;
5104         break;
5105     case PERL_MAGIC_fm:
5106         vtable = &PL_vtbl_fm;
5107         break;
5108     case PERL_MAGIC_envelem:
5109         vtable = &PL_vtbl_envelem;
5110         break;
5111     case PERL_MAGIC_regex_global:
5112         vtable = &PL_vtbl_mglob;
5113         break;
5114     case PERL_MAGIC_isa:
5115         vtable = &PL_vtbl_isa;
5116         break;
5117     case PERL_MAGIC_isaelem:
5118         vtable = &PL_vtbl_isaelem;
5119         break;
5120     case PERL_MAGIC_nkeys:
5121         vtable = &PL_vtbl_nkeys;
5122         break;
5123     case PERL_MAGIC_dbfile:
5124         vtable = NULL;
5125         break;
5126     case PERL_MAGIC_dbline:
5127         vtable = &PL_vtbl_dbline;
5128         break;
5129 #ifdef USE_LOCALE_COLLATE
5130     case PERL_MAGIC_collxfrm:
5131         vtable = &PL_vtbl_collxfrm;
5132         break;
5133 #endif /* USE_LOCALE_COLLATE */
5134     case PERL_MAGIC_tied:
5135         vtable = &PL_vtbl_pack;
5136         break;
5137     case PERL_MAGIC_tiedelem:
5138     case PERL_MAGIC_tiedscalar:
5139         vtable = &PL_vtbl_packelem;
5140         break;
5141     case PERL_MAGIC_qr:
5142         vtable = &PL_vtbl_regexp;
5143         break;
5144     case PERL_MAGIC_sig:
5145         vtable = &PL_vtbl_sig;
5146         break;
5147     case PERL_MAGIC_sigelem:
5148         vtable = &PL_vtbl_sigelem;
5149         break;
5150     case PERL_MAGIC_taint:
5151         vtable = &PL_vtbl_taint;
5152         break;
5153     case PERL_MAGIC_uvar:
5154         vtable = &PL_vtbl_uvar;
5155         break;
5156     case PERL_MAGIC_vec:
5157         vtable = &PL_vtbl_vec;
5158         break;
5159     case PERL_MAGIC_arylen_p:
5160     case PERL_MAGIC_rhash:
5161     case PERL_MAGIC_symtab:
5162     case PERL_MAGIC_vstring:
5163         vtable = NULL;
5164         break;
5165     case PERL_MAGIC_utf8:
5166         vtable = &PL_vtbl_utf8;
5167         break;
5168     case PERL_MAGIC_substr:
5169         vtable = &PL_vtbl_substr;
5170         break;
5171     case PERL_MAGIC_defelem:
5172         vtable = &PL_vtbl_defelem;
5173         break;
5174     case PERL_MAGIC_arylen:
5175         vtable = &PL_vtbl_arylen;
5176         break;
5177     case PERL_MAGIC_pos:
5178         vtable = &PL_vtbl_pos;
5179         break;
5180     case PERL_MAGIC_backref:
5181         vtable = &PL_vtbl_backref;
5182         break;
5183     case PERL_MAGIC_hintselem:
5184         vtable = &PL_vtbl_hintselem;
5185         break;
5186     case PERL_MAGIC_hints:
5187         vtable = &PL_vtbl_hints;
5188         break;
5189     case PERL_MAGIC_ext:
5190         /* Reserved for use by extensions not perl internals.           */
5191         /* Useful for attaching extension internal data to perl vars.   */
5192         /* Note that multiple extensions may clash if magical scalars   */
5193         /* etc holding private data from one are passed to another.     */
5194         vtable = NULL;
5195         break;
5196     default:
5197         Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
5198     }
5199
5200     /* Rest of work is done else where */
5201     mg = sv_magicext(sv,obj,how,vtable,name,namlen);
5202
5203     switch (how) {
5204     case PERL_MAGIC_taint:
5205         mg->mg_len = 1;
5206         break;
5207     case PERL_MAGIC_ext:
5208     case PERL_MAGIC_dbfile:
5209         SvRMAGICAL_on(sv);
5210         break;
5211     }
5212 }
5213
5214 /*
5215 =for apidoc sv_unmagic
5216
5217 Removes all magic of type C<type> from an SV.
5218
5219 =cut
5220 */
5221
5222 int
5223 Perl_sv_unmagic(pTHX_ SV *const sv, const int type)
5224 {
5225     MAGIC* mg;
5226     MAGIC** mgp;
5227
5228     PERL_ARGS_ASSERT_SV_UNMAGIC;
5229
5230     if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
5231         return 0;
5232     mgp = &(((XPVMG*) SvANY(sv))->xmg_u.xmg_magic);
5233     for (mg = *mgp; mg; mg = *mgp) {
5234         if (mg->mg_type == type) {
5235             const MGVTBL* const vtbl = mg->mg_virtual;
5236             *mgp = mg->mg_moremagic;
5237             if (vtbl && vtbl->svt_free)
5238                 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
5239             if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
5240                 if (mg->mg_len > 0)
5241                     Safefree(mg->mg_ptr);
5242                 else if (mg->mg_len == HEf_SVKEY)
5243                     SvREFCNT_dec(MUTABLE_SV(mg->mg_ptr));
5244                 else if (mg->mg_type == PERL_MAGIC_utf8)
5245                     Safefree(mg->mg_ptr);
5246             }
5247             if (mg->mg_flags & MGf_REFCOUNTED)
5248                 SvREFCNT_dec(mg->mg_obj);
5249             Safefree(mg);
5250         }
5251         else
5252             mgp = &mg->mg_moremagic;
5253     }
5254     if (SvMAGIC(sv)) {
5255         if (SvMAGICAL(sv))      /* if we're under save_magic, wait for restore_magic; */
5256             mg_magical(sv);     /*    else fix the flags now */
5257     }
5258     else {
5259         SvMAGICAL_off(sv);
5260         SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
5261     }
5262     return 0;
5263 }
5264
5265 /*
5266 =for apidoc sv_rvweaken
5267
5268 Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
5269 referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
5270 push a back-reference to this RV onto the array of backreferences
5271 associated with that magic. If the RV is magical, set magic will be
5272 called after the RV is cleared.
5273
5274 =cut
5275 */
5276
5277 SV *
5278 Perl_sv_rvweaken(pTHX_ SV *const sv)
5279 {
5280     SV *tsv;
5281
5282     PERL_ARGS_ASSERT_SV_RVWEAKEN;
5283
5284     if (!SvOK(sv))  /* let undefs pass */
5285         return sv;
5286     if (!SvROK(sv))
5287         Perl_croak(aTHX_ "Can't weaken a nonreference");
5288     else if (SvWEAKREF(sv)) {
5289         Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
5290         return sv;
5291     }
5292     tsv = SvRV(sv);
5293     Perl_sv_add_backref(aTHX_ tsv, sv);
5294     SvWEAKREF_on(sv);
5295     SvREFCNT_dec(tsv);
5296     return sv;
5297 }
5298
5299 /* Give tsv backref magic if it hasn't already got it, then push a
5300  * back-reference to sv onto the array associated with the backref magic.
5301  */
5302
5303 /* A discussion about the backreferences array and its refcount:
5304  *
5305  * The AV holding the backreferences is pointed to either as the mg_obj of
5306  * PERL_MAGIC_backref, or in the specific case of a HV that has the hv_aux
5307  * structure, from the xhv_backreferences field. (A HV without hv_aux will
5308  * have the standard magic instead.) The array is created with a refcount
5309  * of 2. This means that if during global destruction the array gets
5310  * picked on first to have its refcount decremented by the random zapper,
5311  * it won't actually be freed, meaning it's still theere for when its
5312  * parent gets freed.
5313  * When the parent SV is freed, in the case of magic, the magic is freed,
5314  * Perl_magic_killbackrefs is called which decrements one refcount, then
5315  * mg_obj is freed which kills the second count.
5316  * In the vase of a HV being freed, one ref is removed by
5317  * Perl_hv_kill_backrefs, the other by Perl_sv_kill_backrefs, which it
5318  * calls.
5319  */
5320
5321 void
5322 Perl_sv_add_backref(pTHX_ SV *const tsv, SV *const sv)
5323 {
5324     dVAR;
5325     AV *av;
5326
5327     PERL_ARGS_ASSERT_SV_ADD_BACKREF;
5328
5329     if (SvTYPE(tsv) == SVt_PVHV) {
5330         AV **const avp = Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(tsv));
5331
5332         av = *avp;
5333         if (!av) {
5334             /* There is no AV in the offical place - try a fixup.  */
5335             MAGIC *const mg = mg_find(tsv, PERL_MAGIC_backref);
5336
5337             if (mg) {
5338                 /* Aha. They've got it stowed in magic.  Bring it back.  */
5339                 av = MUTABLE_AV(mg->mg_obj);
5340                 /* Stop mg_free decreasing the refernce count.  */
5341                 mg->mg_obj = NULL;
5342                 /* Stop mg_free even calling the destructor, given that
5343                    there's no AV to free up.  */
5344                 mg->mg_virtual = 0;
5345                 sv_unmagic(tsv, PERL_MAGIC_backref);
5346             } else {
5347                 av = newAV();
5348                 AvREAL_off(av);
5349                 SvREFCNT_inc_simple_void(av); /* see discussion above */
5350             }
5351             *avp = av;
5352         }
5353     } else {
5354         const MAGIC *const mg
5355             = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
5356         if (mg)
5357             av = MUTABLE_AV(mg->mg_obj);
5358         else {
5359             av = newAV();
5360             AvREAL_off(av);
5361             sv_magic(tsv, MUTABLE_SV(av), PERL_MAGIC_backref, NULL, 0);
5362             /* av now has a refcnt of 2; see discussion above */
5363         }
5364     }
5365     if (AvFILLp(av) >= AvMAX(av)) {
5366         av_extend(av, AvFILLp(av)+1);
5367     }
5368     AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */
5369 }
5370
5371 /* delete a back-reference to ourselves from the backref magic associated
5372  * with the SV we point to.
5373  */
5374
5375 STATIC void
5376 S_sv_del_backref(pTHX_ SV *const tsv, SV *const sv)
5377 {
5378     dVAR;
5379     AV *av = NULL;
5380     SV **svp;
5381     I32 i;
5382
5383     PERL_ARGS_ASSERT_SV_DEL_BACKREF;
5384
5385     if (SvTYPE(tsv) == SVt_PVHV && SvOOK(tsv)) {
5386         av = *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(tsv));
5387         /* We mustn't attempt to "fix up" the hash here by moving the
5388            backreference array back to the hv_aux structure, as that is stored
5389            in the main HvARRAY(), and hfreentries assumes that no-one
5390            reallocates HvARRAY() while it is running.  */
5391     }
5392     if (!av) {
5393         const MAGIC *const mg
5394             = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
5395         if (mg)
5396             av = MUTABLE_AV(mg->mg_obj);
5397     }
5398
5399     if (!av)
5400         Perl_croak(aTHX_ "panic: del_backref");
5401
5402     assert(!SvIS_FREED(av));
5403
5404     svp = AvARRAY(av);
5405     /* We shouldn't be in here more than once, but for paranoia reasons lets
5406        not assume this.  */
5407     for (i = AvFILLp(av); i >= 0; i--) {
5408         if (svp[i] == sv) {
5409             const SSize_t fill = AvFILLp(av);
5410             if (i != fill) {
5411                 /* We weren't the last entry.
5412                    An unordered list has this property that you can take the
5413                    last element off the end to fill the hole, and it's still
5414                    an unordered list :-)
5415                 */
5416                 svp[i] = svp[fill];
5417             }
5418             svp[fill] = NULL;
5419             AvFILLp(av) = fill - 1;
5420         }
5421     }
5422 }
5423
5424 int
5425 Perl_sv_kill_backrefs(pTHX_ SV *const sv, AV *const av)
5426 {
5427     SV **svp = AvARRAY(av);
5428
5429     PERL_ARGS_ASSERT_SV_KILL_BACKREFS;
5430     PERL_UNUSED_ARG(sv);
5431
5432     assert(!svp || !SvIS_FREED(av));
5433     if (svp) {
5434         SV *const *const last = svp + AvFILLp(av);
5435
5436         while (svp <= last) {
5437             if (*svp) {
5438                 SV *const referrer = *svp;
5439                 if (SvWEAKREF(referrer)) {
5440                     /* XXX Should we check that it hasn't changed? */
5441                     SvRV_set(referrer, 0);
5442                     SvOK_off(referrer);
5443                     SvWEAKREF_off(referrer);
5444                     SvSETMAGIC(referrer);
5445                 } else if (SvTYPE(referrer) == SVt_PVGV ||
5446                            SvTYPE(referrer) == SVt_PVLV) {
5447                     /* You lookin' at me?  */
5448                     assert(GvSTASH(referrer));
5449                     assert(GvSTASH(referrer) == (const HV *)sv);
5450                     GvSTASH(referrer) = 0;
5451                 } else {
5452                     Perl_croak(aTHX_
5453                                "panic: magic_killbackrefs (flags=%"UVxf")",
5454                                (UV)SvFLAGS(referrer));
5455                 }
5456
5457                 *svp = NULL;
5458             }
5459             svp++;
5460         }
5461     }
5462     SvREFCNT_dec(av); /* remove extra count added by sv_add_backref() */
5463     return 0;
5464 }
5465
5466 /*
5467 =for apidoc sv_insert
5468
5469 Inserts a string at the specified offset/length within the SV. Similar to
5470 the Perl substr() function. Handles get magic.
5471
5472 =for apidoc sv_insert_flags
5473
5474 Same as C<sv_insert>, but the extra C<flags> are passed the C<SvPV_force_flags> that applies to C<bigstr>.
5475
5476 =cut
5477 */
5478
5479 void
5480 Perl_sv_insert_flags(pTHX_ SV *const bigstr, const STRLEN offset, const STRLEN len, const char *const little, const STRLEN littlelen, const U32 flags)
5481 {
5482     dVAR;
5483     register char *big;
5484     register char *mid;
5485     register char *midend;
5486     register char *bigend;
5487     register I32 i;
5488     STRLEN curlen;
5489
5490     PERL_ARGS_ASSERT_SV_INSERT_FLAGS;
5491
5492     if (!bigstr)
5493         Perl_croak(aTHX_ "Can't modify non-existent substring");
5494     SvPV_force_flags(bigstr, curlen, flags);
5495     (void)SvPOK_only_UTF8(bigstr);
5496     if (offset + len > curlen) {
5497         SvGROW(bigstr, offset+len+1);
5498         Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
5499         SvCUR_set(bigstr, offset+len);
5500     }
5501
5502     SvTAINT(bigstr);
5503     i = littlelen - len;
5504     if (i > 0) {                        /* string might grow */
5505         big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
5506         mid = big + offset + len;
5507         midend = bigend = big + SvCUR(bigstr);
5508         bigend += i;
5509         *bigend = '\0';
5510         while (midend > mid)            /* shove everything down */
5511             *--bigend = *--midend;
5512         Move(little,big+offset,littlelen,char);
5513         SvCUR_set(bigstr, SvCUR(bigstr) + i);
5514         SvSETMAGIC(bigstr);
5515         return;
5516     }
5517     else if (i == 0) {
5518         Move(little,SvPVX(bigstr)+offset,len,char);
5519         SvSETMAGIC(bigstr);
5520         return;
5521     }
5522
5523     big = SvPVX(bigstr);
5524     mid = big + offset;
5525     midend = mid + len;
5526     bigend = big + SvCUR(bigstr);
5527
5528     if (midend > bigend)
5529         Perl_croak(aTHX_ "panic: sv_insert");
5530
5531     if (mid - big > bigend - midend) {  /* faster to shorten from end */
5532         if (littlelen) {
5533             Move(little, mid, littlelen,char);
5534             mid += littlelen;
5535         }
5536         i = bigend - midend;
5537         if (i > 0) {
5538             Move(midend, mid, i,char);
5539             mid += i;
5540         }
5541         *mid = '\0';
5542         SvCUR_set(bigstr, mid - big);
5543     }
5544     else if ((i = mid - big)) { /* faster from front */
5545         midend -= littlelen;
5546         mid = midend;
5547         Move(big, midend - i, i, char);
5548         sv_chop(bigstr,midend-i);
5549         if (littlelen)
5550             Move(little, mid, littlelen,char);
5551     }
5552     else if (littlelen) {
5553         midend -= littlelen;
5554         sv_chop(bigstr,midend);
5555         Move(little,midend,littlelen,char);
5556     }
5557     else {
5558         sv_chop(bigstr,midend);
5559     }
5560     SvSETMAGIC(bigstr);
5561 }
5562
5563 /*
5564 =for apidoc sv_replace
5565
5566 Make the first argument a copy of the second, then delete the original.
5567 The target SV physically takes over ownership of the body of the source SV
5568 and inherits its flags; however, the target keeps any magic it owns,
5569 and any magic in the source is discarded.
5570 Note that this is a rather specialist SV copying operation; most of the
5571 time you'll want to use C<sv_setsv> or one of its many macro front-ends.
5572
5573 =cut
5574 */
5575
5576 void
5577 Perl_sv_replace(pTHX_ register SV *const sv, register SV *const nsv)
5578 {
5579     dVAR;
5580     const U32 refcnt = SvREFCNT(sv);
5581
5582     PERL_ARGS_ASSERT_SV_REPLACE;
5583
5584     SV_CHECK_THINKFIRST_COW_DROP(sv);
5585     if (SvREFCNT(nsv) != 1) {
5586         Perl_croak(aTHX_ "panic: reference miscount on nsv in sv_replace()"
5587                    " (%" UVuf " != 1)", (UV) SvREFCNT(nsv));
5588     }
5589     if (SvMAGICAL(sv)) {
5590         if (SvMAGICAL(nsv))
5591             mg_free(nsv);
5592         else
5593             sv_upgrade(nsv, SVt_PVMG);
5594         SvMAGIC_set(nsv, SvMAGIC(sv));
5595         SvFLAGS(nsv) |= SvMAGICAL(sv);
5596         SvMAGICAL_off(sv);
5597         SvMAGIC_set(sv, NULL);
5598     }
5599     SvREFCNT(sv) = 0;
5600     sv_clear(sv);
5601     assert(!SvREFCNT(sv));
5602 #ifdef DEBUG_LEAKING_SCALARS
5603     sv->sv_flags  = nsv->sv_flags;
5604     sv->sv_any    = nsv->sv_any;
5605     sv->sv_refcnt = nsv->sv_refcnt;
5606     sv->sv_u      = nsv->sv_u;
5607 #else
5608     StructCopy(nsv,sv,SV);
5609 #endif
5610     if(SvTYPE(sv) == SVt_IV) {
5611         SvANY(sv)
5612             = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
5613     }
5614         
5615
5616 #ifdef PERL_OLD_COPY_ON_WRITE
5617     if (SvIsCOW_normal(nsv)) {
5618         /* We need to follow the pointers around the loop to make the
5619            previous SV point to sv, rather than nsv.  */
5620         SV *next;
5621         SV *current = nsv;
5622         while ((next = SV_COW_NEXT_SV(current)) != nsv) {
5623             assert(next);
5624             current = next;
5625             assert(SvPVX_const(current) == SvPVX_const(nsv));
5626         }
5627         /* Make the SV before us point to the SV after us.  */
5628         if (DEBUG_C_TEST) {
5629             PerlIO_printf(Perl_debug_log, "previous is\n");
5630             sv_dump(current);
5631             PerlIO_printf(Perl_debug_log,
5632                           "move it from 0x%"UVxf" to 0x%"UVxf"\n",
5633                           (UV) SV_COW_NEXT_SV(current), (UV) sv);
5634         }
5635         SV_COW_NEXT_SV_SET(current, sv);
5636     }
5637 #endif
5638     SvREFCNT(sv) = refcnt;
5639     SvFLAGS(nsv) |= SVTYPEMASK;         /* Mark as freed */
5640     SvREFCNT(nsv) = 0;
5641     del_SV(nsv);
5642 }
5643
5644 /*
5645 =for apidoc sv_clear
5646
5647 Clear an SV: call any destructors, free up any memory used by the body,
5648 and free the body itself. The SV's head is I<not> freed, although
5649 its type is set to all 1's so that it won't inadvertently be assumed
5650 to be live during global destruction etc.
5651 This function should only be called when REFCNT is zero. Most of the time
5652 you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
5653 instead.
5654
5655 =cut
5656 */
5657
5658 void
5659 Perl_sv_clear(pTHX_ register SV *const sv)
5660 {
5661     dVAR;
5662     const U32 type = SvTYPE(sv);
5663     const struct body_details *const sv_type_details
5664         = bodies_by_type + type;
5665     HV *stash;
5666
5667     PERL_ARGS_ASSERT_SV_CLEAR;
5668     assert(SvREFCNT(sv) == 0);
5669     assert(SvTYPE(sv) != SVTYPEMASK);
5670
5671     if (type <= SVt_IV) {
5672         /* See the comment in sv.h about the collusion between this early
5673            return and the overloading of the NULL slots in the size table.  */
5674         if (SvROK(sv))
5675             goto free_rv;
5676         SvFLAGS(sv) &= SVf_BREAK;
5677         SvFLAGS(sv) |= SVTYPEMASK;
5678         return;
5679     }
5680
5681     if (SvOBJECT(sv)) {
5682         if (PL_defstash &&      /* Still have a symbol table? */
5683             SvDESTROYABLE(sv))
5684         {
5685             dSP;
5686             HV* stash;
5687             do {        
5688                 CV* destructor;
5689                 stash = SvSTASH(sv);
5690                 destructor = StashHANDLER(stash,DESTROY);
5691                 if (destructor
5692                         /* A constant subroutine can have no side effects, so
5693                            don't bother calling it.  */
5694                         && !CvCONST(destructor)
5695                         /* Don't bother calling an empty destructor */
5696                         && (CvISXSUB(destructor)
5697                         || (CvSTART(destructor)
5698                             && (CvSTART(destructor)->op_next->op_type != OP_LEAVESUB))))
5699                 {
5700                     SV* const tmpref = newRV(sv);
5701                     SvREADONLY_on(tmpref);   /* DESTROY() could be naughty */
5702                     ENTER;
5703                     PUSHSTACKi(PERLSI_DESTROY);
5704                     EXTEND(SP, 2);
5705                     PUSHMARK(SP);
5706                     PUSHs(tmpref);
5707                     PUTBACK;
5708                     call_sv(MUTABLE_SV(destructor), G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
5709                 
5710                 
5711                     POPSTACK;
5712                     SPAGAIN;
5713                     LEAVE;
5714                     if(SvREFCNT(tmpref) < 2) {
5715                         /* tmpref is not kept alive! */
5716                         SvREFCNT(sv)--;
5717                         SvRV_set(tmpref, NULL);
5718                         SvROK_off(tmpref);
5719                     }
5720                     SvREFCNT_dec(tmpref);
5721                 }
5722             } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
5723
5724
5725             if (SvREFCNT(sv)) {
5726                 if (PL_in_clean_objs)
5727                     Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
5728                           HvNAME_get(stash));
5729                 /* DESTROY gave object new lease on life */
5730                 return;
5731             }
5732         }
5733
5734         if (SvOBJECT(sv)) {
5735             SvREFCNT_dec(SvSTASH(sv));  /* possibly of changed persuasion */
5736             SvOBJECT_off(sv);   /* Curse the object. */
5737             if (type != SVt_PVIO)
5738                 --PL_sv_objcount;       /* XXX Might want something more general */
5739         }
5740     }
5741     if (type >= SVt_PVMG) {
5742         if (type == SVt_PVMG && SvPAD_OUR(sv)) {
5743             SvREFCNT_dec(SvOURSTASH(sv));
5744         } else if (SvMAGIC(sv))
5745             mg_free(sv);
5746         if (type == SVt_PVMG && SvPAD_TYPED(sv))
5747             SvREFCNT_dec(SvSTASH(sv));
5748     }
5749     switch (type) {
5750         /* case SVt_BIND: */
5751     case SVt_PVIO:
5752         if (IoIFP(sv) &&
5753             IoIFP(sv) != PerlIO_stdin() &&
5754             IoIFP(sv) != PerlIO_stdout() &&
5755             IoIFP(sv) != PerlIO_stderr())
5756         {
5757             io_close(MUTABLE_IO(sv), FALSE);
5758         }
5759         if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
5760             PerlDir_close(IoDIRP(sv));
5761         IoDIRP(sv) = (DIR*)NULL;
5762         Safefree(IoTOP_NAME(sv));
5763         Safefree(IoFMT_NAME(sv));
5764         Safefree(IoBOTTOM_NAME(sv));
5765         goto freescalar;
5766     case SVt_REGEXP:
5767         /* FIXME for plugins */
5768         pregfree2((REGEXP*) sv);
5769         goto freescalar;
5770     case SVt_PVCV:
5771     case SVt_PVFM:
5772         cv_undef(MUTABLE_CV(sv));
5773         goto freescalar;
5774     case SVt_PVHV:
5775         if (PL_last_swash_hv == (const HV *)sv) {
5776             PL_last_swash_hv = NULL;
5777         }
5778         Perl_hv_kill_backrefs(aTHX_ MUTABLE_HV(sv));
5779         hv_undef(MUTABLE_HV(sv));
5780         break;
5781     case SVt_PVAV:
5782         if (PL_comppad == MUTABLE_AV(sv)) {
5783             PL_comppad = NULL;
5784             PL_curpad = NULL;
5785         }
5786         av_undef(MUTABLE_AV(sv));
5787         break;
5788     case SVt_PVLV:
5789         if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
5790             SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv)));
5791             HeNEXT((HE*)LvTARG(sv)) = PL_hv_fetch_ent_mh;
5792             PL_hv_fetch_ent_mh = (HE*)LvTARG(sv);
5793         }
5794         else if (LvTYPE(sv) != 't') /* unless tie: unrefcnted fake SV**  */
5795             SvREFCNT_dec(LvTARG(sv));
5796     case SVt_PVGV:
5797         if (isGV_with_GP(sv)) {
5798             if(GvCVu((const GV *)sv) && (stash = GvSTASH(MUTABLE_GV(sv)))
5799                && HvNAME_get(stash))
5800                 mro_method_changed_in(stash);
5801             gp_free(MUTABLE_GV(sv));
5802             if (GvNAME_HEK(sv))
5803                 unshare_hek(GvNAME_HEK(sv));
5804             /* If we're in a stash, we don't own a reference to it. However it does
5805                have a back reference to us, which needs to be cleared.  */
5806             if (!SvVALID(sv) && (stash = GvSTASH(sv)))
5807                     sv_del_backref(MUTABLE_SV(stash), sv);
5808         }
5809         /* FIXME. There are probably more unreferenced pointers to SVs in the
5810            interpreter struct that we should check and tidy in a similar
5811            fashion to this:  */
5812         if ((const GV *)sv == PL_last_in_gv)
5813             PL_last_in_gv = NULL;
5814     case SVt_PVMG:
5815     case SVt_PVNV:
5816     case SVt_PVIV:
5817     case SVt_PV:
5818       freescalar:
5819         /* Don't bother with SvOOK_off(sv); as we're only going to free it.  */
5820         if (SvOOK(sv)) {
5821             STRLEN offset;
5822             SvOOK_offset(sv, offset);
5823             SvPV_set(sv, SvPVX_mutable(sv) - offset);
5824             /* Don't even bother with turning off the OOK flag.  */
5825         }
5826         if (SvROK(sv)) {
5827         free_rv:
5828             {
5829                 SV * const target = SvRV(sv);
5830                 if (SvWEAKREF(sv))
5831                     sv_del_backref(target, sv);
5832                 else
5833                     SvREFCNT_dec(target);
5834             }
5835         }
5836 #ifdef PERL_OLD_COPY_ON_WRITE
5837         else if (SvPVX_const(sv)) {
5838             if (SvIsCOW(sv)) {
5839                 if (DEBUG_C_TEST) {
5840                     PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
5841                     sv_dump(sv);
5842                 }
5843                 if (SvLEN(sv)) {
5844                     sv_release_COW(sv, SvPVX_const(sv), SV_COW_NEXT_SV(sv));
5845                 } else {
5846                     unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
5847                 }
5848
5849                 SvFAKE_off(sv);
5850             } else if (SvLEN(sv)) {
5851                 Safefree(SvPVX_const(sv));
5852             }
5853         }
5854 #else
5855         else if (SvPVX_const(sv) && SvLEN(sv))
5856             Safefree(SvPVX_mutable(sv));
5857         else if (SvPVX_const(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
5858             unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
5859             SvFAKE_off(sv);
5860         }
5861 #endif
5862         break;
5863     case SVt_NV:
5864         break;
5865     }
5866
5867     SvFLAGS(sv) &= SVf_BREAK;
5868     SvFLAGS(sv) |= SVTYPEMASK;
5869
5870     if (sv_type_details->arena) {
5871         del_body(((char *)SvANY(sv) + sv_type_details->offset),
5872                  &PL_body_roots[type]);
5873     }
5874     else if (sv_type_details->body_size) {
5875         my_safefree(SvANY(sv));
5876     }
5877 }
5878
5879 /*
5880 =for apidoc sv_newref
5881
5882 Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
5883 instead.
5884
5885 =cut
5886 */
5887
5888 SV *
5889 Perl_sv_newref(pTHX_ SV *const sv)
5890 {
5891     PERL_UNUSED_CONTEXT;
5892     if (sv)
5893         (SvREFCNT(sv))++;
5894     return sv;
5895 }
5896
5897 /*
5898 =for apidoc sv_free
5899
5900 Decrement an SV's reference count, and if it drops to zero, call
5901 C<sv_clear> to invoke destructors and free up any memory used by
5902 the body; finally, deallocate the SV's head itself.
5903 Normally called via a wrapper macro C<SvREFCNT_dec>.
5904
5905 =cut
5906 */
5907
5908 void
5909 Perl_sv_free(pTHX_ SV *const sv)
5910 {
5911     dVAR;
5912     if (!sv)
5913         return;
5914     if (SvREFCNT(sv) == 0) {
5915         if (SvFLAGS(sv) & SVf_BREAK)
5916             /* this SV's refcnt has been artificially decremented to
5917              * trigger cleanup */
5918             return;
5919         if (PL_in_clean_all) /* All is fair */
5920             return;
5921         if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5922             /* make sure SvREFCNT(sv)==0 happens very seldom */
5923             SvREFCNT(sv) = (~(U32)0)/2;
5924             return;
5925         }
5926         if (ckWARN_d(WARN_INTERNAL)) {
5927 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
5928             Perl_dump_sv_child(aTHX_ sv);
5929 #else
5930   #ifdef DEBUG_LEAKING_SCALARS
5931             sv_dump(sv);
5932   #endif
5933 #ifdef DEBUG_LEAKING_SCALARS_ABORT
5934             if (PL_warnhook == PERL_WARNHOOK_FATAL
5935                 || ckDEAD(packWARN(WARN_INTERNAL))) {
5936                 /* Don't let Perl_warner cause us to escape our fate:  */
5937                 abort();
5938             }
5939 #endif
5940             /* This may not return:  */
5941             Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
5942                         "Attempt to free unreferenced scalar: SV 0x%"UVxf
5943                         pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
5944 #endif
5945         }
5946 #ifdef DEBUG_LEAKING_SCALARS_ABORT
5947         abort();
5948 #endif
5949         return;
5950     }
5951     if (--(SvREFCNT(sv)) > 0)
5952         return;
5953     Perl_sv_free2(aTHX_ sv);
5954 }
5955
5956 void
5957 Perl_sv_free2(pTHX_ SV *const sv)
5958 {
5959     dVAR;
5960
5961     PERL_ARGS_ASSERT_SV_FREE2;
5962
5963 #ifdef DEBUGGING
5964     if (SvTEMP(sv)) {
5965         Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING),
5966                          "Attempt to free temp prematurely: SV 0x%"UVxf
5967                          pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
5968         return;
5969     }
5970 #endif
5971     if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5972         /* make sure SvREFCNT(sv)==0 happens very seldom */
5973         SvREFCNT(sv) = (~(U32)0)/2;
5974         return;
5975     }
5976     sv_clear(sv);
5977     if (! SvREFCNT(sv))
5978         del_SV(sv);
5979 }
5980
5981 /*
5982 =for apidoc sv_len
5983
5984 Returns the length of the string in the SV. Handles magic and type
5985 coercion.  See also C<SvCUR>, which gives raw access to the xpv_cur slot.
5986
5987 =cut
5988 */
5989
5990 STRLEN
5991 Perl_sv_len(pTHX_ register SV *const sv)
5992 {
5993     STRLEN len;
5994
5995     if (!sv)
5996         return 0;
5997
5998     if (SvGMAGICAL(sv))
5999         len = mg_length(sv);
6000     else
6001         (void)SvPV_const(sv, len);
6002     return len;
6003 }
6004
6005 /*
6006 =for apidoc sv_len_utf8
6007
6008 Returns the number of characters in the string in an SV, counting wide
6009 UTF-8 bytes as a single character. Handles magic and type coercion.
6010
6011 =cut
6012 */
6013
6014 /*
6015  * The length is cached in PERL_MAGIC_utf8, in the mg_len field.  Also the
6016  * mg_ptr is used, by sv_pos_u2b() and sv_pos_b2u() - see the comments below.
6017  * (Note that the mg_len is not the length of the mg_ptr field.
6018  * This allows the cache to store the character length of the string without
6019  * needing to malloc() extra storage to attach to the mg_ptr.)
6020  *
6021  */
6022
6023 STRLEN
6024 Perl_sv_len_utf8(pTHX_ register SV *const sv)
6025 {
6026     if (!sv)
6027         return 0;
6028
6029     if (SvGMAGICAL(sv))
6030         return mg_length(sv);
6031     else
6032     {
6033         STRLEN len;
6034         const U8 *s = (U8*)SvPV_const(sv, len);
6035
6036         if (PL_utf8cache) {
6037             STRLEN ulen;
6038             MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : NULL;
6039
6040             if (mg && mg->mg_len != -1) {
6041                 ulen = mg->mg_len;
6042                 if (PL_utf8cache < 0) {
6043                     const STRLEN real = Perl_utf8_length(aTHX_ s, s + len);
6044                     if (real != ulen) {
6045                         /* Need to turn the assertions off otherwise we may
6046                            recurse infinitely while printing error messages.
6047                         */
6048                         SAVEI8(PL_utf8cache);
6049                         PL_utf8cache = 0;
6050                         Perl_croak(aTHX_ "panic: sv_len_utf8 cache %"UVuf
6051                                    " real %"UVuf" for %"SVf,
6052                                    (UV) ulen, (UV) real, SVfARG(sv));
6053                     }
6054                 }
6055             }
6056             else {
6057                 ulen = Perl_utf8_length(aTHX_ s, s + len);
6058                 if (!SvREADONLY(sv)) {
6059                     if (!mg && (SvTYPE(sv) < SVt_PVMG ||
6060                                 !(mg = mg_find(sv, PERL_MAGIC_utf8)))) {
6061                         mg = sv_magicext(sv, 0, PERL_MAGIC_utf8,
6062                                          &PL_vtbl_utf8, 0, 0);
6063                     }
6064                     assert(mg);
6065                     mg->mg_len = ulen;
6066                     /* For now, treat "overflowed" as "still unknown".
6067                        See RT #72924.  */
6068                     if (ulen != (STRLEN) mg->mg_len)
6069                         mg->mg_len = -1;
6070                 }
6071             }
6072             return ulen;
6073         }
6074         return Perl_utf8_length(aTHX_ s, s + len);
6075     }
6076 }
6077
6078 /* Walk forwards to find the byte corresponding to the passed in UTF-8
6079    offset.  */
6080 static STRLEN
6081 S_sv_pos_u2b_forwards(const U8 *const start, const U8 *const send,
6082                       STRLEN uoffset)
6083 {
6084     const U8 *s = start;
6085
6086     PERL_ARGS_ASSERT_SV_POS_U2B_FORWARDS;
6087
6088     while (s < send && uoffset--)
6089         s += UTF8SKIP(s);
6090     if (s > send) {
6091         /* This is the existing behaviour. Possibly it should be a croak, as
6092            it's actually a bounds error  */
6093         s = send;
6094     }
6095     return s - start;
6096 }
6097
6098 /* Given the length of the string in both bytes and UTF-8 characters, decide
6099    whether to walk forwards or backwards to find the byte corresponding to
6100    the passed in UTF-8 offset.  */
6101 static STRLEN
6102 S_sv_pos_u2b_midway(const U8 *const start, const U8 *send,
6103                       const STRLEN uoffset, const STRLEN uend)
6104 {
6105     STRLEN backw = uend - uoffset;
6106
6107     PERL_ARGS_ASSERT_SV_POS_U2B_MIDWAY;
6108
6109     if (uoffset < 2 * backw) {
6110         /* The assumption is that going forwards is twice the speed of going
6111            forward (that's where the 2 * backw comes from).
6112            (The real figure of course depends on the UTF-8 data.)  */
6113         return sv_pos_u2b_forwards(start, send, uoffset);
6114     }
6115
6116     while (backw--) {
6117         send--;
6118         while (UTF8_IS_CONTINUATION(*send))
6119             send--;
6120     }
6121     return send - start;
6122 }
6123
6124 /* For the string representation of the given scalar, find the byte
6125    corresponding to the passed in UTF-8 offset.  uoffset0 and boffset0
6126    give another position in the string, *before* the sought offset, which
6127    (which is always true, as 0, 0 is a valid pair of positions), which should
6128    help reduce the amount of linear searching.
6129    If *mgp is non-NULL, it should point to the UTF-8 cache magic, which
6130    will be used to reduce the amount of linear searching. The cache will be
6131    created if necessary, and the found value offered to it for update.  */
6132 static STRLEN
6133 S_sv_pos_u2b_cached(pTHX_ SV *const sv, MAGIC **const mgp, const U8 *const start,
6134                     const U8 *const send, const STRLEN uoffset,
6135                     STRLEN uoffset0, STRLEN boffset0)
6136 {
6137     STRLEN boffset = 0; /* Actually always set, but let's keep gcc happy.  */
6138     bool found = FALSE;
6139
6140     PERL_ARGS_ASSERT_SV_POS_U2B_CACHED;
6141
6142     assert (uoffset >= uoffset0);
6143
6144     if (!SvREADONLY(sv)
6145         && PL_utf8cache
6146         && (*mgp || (SvTYPE(sv) >= SVt_PVMG &&
6147                      (*mgp = mg_find(sv, PERL_MAGIC_utf8))))) {
6148         if ((*mgp)->mg_ptr) {
6149             STRLEN *cache = (STRLEN *) (*mgp)->mg_ptr;
6150             if (cache[0] == uoffset) {
6151                 /* An exact match. */
6152                 return cache[1];
6153             }
6154             if (cache[2] == uoffset) {
6155                 /* An exact match. */
6156                 return cache[3];
6157             }
6158
6159             if (cache[0] < uoffset) {
6160                 /* The cache already knows part of the way.   */
6161                 if (cache[0] > uoffset0) {
6162                     /* The cache knows more than the passed in pair  */
6163                     uoffset0 = cache[0];
6164                     boffset0 = cache[1];
6165                 }
6166                 if ((*mgp)->mg_len != -1) {
6167                     /* And we know the end too.  */
6168                     boffset = boffset0
6169                         + sv_pos_u2b_midway(start + boffset0, send,
6170                                               uoffset - uoffset0,
6171                                               (*mgp)->mg_len - uoffset0);
6172                 } else {
6173                     boffset = boffset0
6174                         + sv_pos_u2b_forwards(start + boffset0,
6175                                                 send, uoffset - uoffset0);
6176                 }
6177             }
6178             else if (cache[2] < uoffset) {
6179                 /* We're between the two cache entries.  */
6180                 if (cache[2] > uoffset0) {
6181                     /* and the cache knows more than the passed in pair  */
6182                     uoffset0 = cache[2];
6183                     boffset0 = cache[3];
6184                 }
6185
6186                 boffset = boffset0
6187                     + sv_pos_u2b_midway(start + boffset0,
6188                                           start + cache[1],
6189                                           uoffset - uoffset0,
6190                                           cache[0] - uoffset0);
6191             } else {
6192                 boffset = boffset0
6193                     + sv_pos_u2b_midway(start + boffset0,
6194                                           start + cache[3],
6195                                           uoffset - uoffset0,
6196                                           cache[2] - uoffset0);
6197             }
6198             found = TRUE;
6199         }
6200         else if ((*mgp)->mg_len != -1) {
6201             /* If we can take advantage of a passed in offset, do so.  */
6202             /* In fact, offset0 is either 0, or less than offset, so don't
6203                need to worry about the other possibility.  */
6204             boffset = boffset0
6205                 + sv_pos_u2b_midway(start + boffset0, send,
6206                                       uoffset - uoffset0,
6207                                       (*mgp)->mg_len - uoffset0);
6208             found = TRUE;
6209         }
6210     }
6211
6212     if (!found || PL_utf8cache < 0) {
6213         const STRLEN real_boffset
6214             = boffset0 + sv_pos_u2b_forwards(start + boffset0,
6215                                                send, uoffset - uoffset0);
6216
6217         if (found && PL_utf8cache < 0) {
6218             if (real_boffset != boffset) {
6219                 /* Need to turn the assertions off otherwise we may recurse
6220                    infinitely while printing error messages.  */
6221                 SAVEI8(PL_utf8cache);
6222                 PL_utf8cache = 0;
6223                 Perl_croak(aTHX_ "panic: sv_pos_u2b_cache cache %"UVuf
6224                            " real %"UVuf" for %"SVf,
6225                            (UV) boffset, (UV) real_boffset, SVfARG(sv));
6226             }
6227         }
6228         boffset = real_boffset;
6229     }
6230
6231     if (PL_utf8cache)
6232         utf8_mg_pos_cache_update(sv, mgp, boffset, uoffset, send - start);
6233     return boffset;
6234 }
6235
6236
6237 /*
6238 =for apidoc sv_pos_u2b_flags
6239
6240 Converts the value pointed to by offsetp from a count of UTF-8 chars from
6241 the start of the string, to a count of the equivalent number of bytes; if
6242 lenp is non-zero, it does the same to lenp, but this time starting from
6243 the offset, rather than from the start of the string. Handles type coercion.
6244 I<flags> is passed to C<SvPV_flags>, and usually should be
6245 C<SV_GMAGIC|SV_CONST_RETURN> to handle magic.
6246
6247 =cut
6248 */
6249
6250 /*
6251  * sv_pos_u2b_flags() uses, like sv_pos_b2u(), the mg_ptr of the potential
6252  * PERL_MAGIC_utf8 of the sv to store the mapping between UTF-8 and
6253  * byte offsets.  See also the comments of S_utf8_mg_pos_cache_update().
6254  *
6255  */
6256
6257 STRLEN
6258 Perl_sv_pos_u2b_flags(pTHX_ SV *const sv, STRLEN uoffset, STRLEN *const lenp,
6259                       U32 flags)
6260 {
6261     const U8 *start;
6262     STRLEN len;
6263     STRLEN boffset;
6264
6265     PERL_ARGS_ASSERT_SV_POS_U2B_FLAGS;
6266
6267     start = (U8*)SvPV_flags(sv, len, flags);
6268     if (len) {
6269         const U8 * const send = start + len;
6270         MAGIC *mg = NULL;
6271         boffset = sv_pos_u2b_cached(sv, &mg, start, send, uoffset, 0, 0);
6272
6273         if (lenp) {
6274             /* Convert the relative offset to absolute.  */
6275             const STRLEN uoffset2 = uoffset + *lenp;
6276             const STRLEN boffset2
6277                 = sv_pos_u2b_cached(sv, &mg, start, send, uoffset2,
6278                                       uoffset, boffset) - boffset;
6279
6280             *lenp = boffset2;
6281         }
6282     } else {
6283         if (lenp)
6284             *lenp = 0;
6285         boffset = 0;
6286     }
6287
6288     return boffset;
6289 }
6290
6291 /*
6292 =for apidoc sv_pos_u2b
6293
6294 Converts the value pointed to by offsetp from a count of UTF-8 chars from
6295 the start of the string, to a count of the equivalent number of bytes; if
6296 lenp is non-zero, it does the same to lenp, but this time starting from
6297 the offset, rather than from the start of the string. Handles magic and
6298 type coercion.
6299
6300 Use C<sv_pos_u2b_flags> in preference, which correctly handles strings longer
6301 than 2Gb.
6302
6303 =cut
6304 */
6305
6306 /*
6307  * sv_pos_u2b() uses, like sv_pos_b2u(), the mg_ptr of the potential
6308  * PERL_MAGIC_utf8 of the sv to store the mapping between UTF-8 and
6309  * byte offsets.  See also the comments of S_utf8_mg_pos_cache_update().
6310  *
6311  */
6312
6313 /* This function is subject to size and sign problems */
6314
6315 void
6316 Perl_sv_pos_u2b(pTHX_ register SV *const sv, I32 *const offsetp, I32 *const lenp)
6317 {
6318     PERL_ARGS_ASSERT_SV_POS_U2B;
6319
6320     if (lenp) {
6321         STRLEN ulen = (STRLEN)*lenp;
6322         *offsetp = (I32)sv_pos_u2b_flags(sv, (STRLEN)*offsetp, &ulen,
6323                                          SV_GMAGIC|SV_CONST_RETURN);
6324         *lenp = (I32)ulen;
6325     } else {
6326         *offsetp = (I32)sv_pos_u2b_flags(sv, (STRLEN)*offsetp, NULL,
6327                                          SV_GMAGIC|SV_CONST_RETURN);
6328     }
6329 }
6330
6331 /* Create and update the UTF8 magic offset cache, with the proffered utf8/
6332    byte length pairing. The (byte) length of the total SV is passed in too,
6333    as blen, because for some (more esoteric) SVs, the call to SvPV_const()
6334    may not have updated SvCUR, so we can't rely on reading it directly.
6335
6336    The proffered utf8/byte length pairing isn't used if the cache already has
6337    two pairs, and swapping either for the proffered pair would increase the
6338    RMS of the intervals between known byte offsets.
6339
6340    The cache itself consists of 4 STRLEN values
6341    0: larger UTF-8 offset
6342    1: corresponding byte offset
6343    2: smaller UTF-8 offset
6344    3: corresponding byte offset
6345
6346    Unused cache pairs have the value 0, 0.
6347    Keeping the cache "backwards" means that the invariant of
6348    cache[0] >= cache[2] is maintained even with empty slots, which means that
6349    the code that uses it doesn't need to worry if only 1 entry has actually
6350    been set to non-zero.  It also makes the "position beyond the end of the
6351    cache" logic much simpler, as the first slot is always the one to start
6352    from.   
6353 */
6354 static void
6355 S_utf8_mg_pos_cache_update(pTHX_ SV *const sv, MAGIC **const mgp, const STRLEN byte,
6356                            const STRLEN utf8, const STRLEN blen)
6357 {
6358     STRLEN *cache;
6359
6360     PERL_ARGS_ASSERT_UTF8_MG_POS_CACHE_UPDATE;
6361
6362     if (SvREADONLY(sv))
6363         return;
6364
6365     if (!*mgp && (SvTYPE(sv) < SVt_PVMG ||
6366                   !(*mgp = mg_find(sv, PERL_MAGIC_utf8)))) {
6367         *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, (MGVTBL*)&PL_vtbl_utf8, 0,
6368                            0);
6369         (*mgp)->mg_len = -1;
6370     }
6371     assert(*mgp);
6372
6373     if (!(cache = (STRLEN *)(*mgp)->mg_ptr)) {
6374         Newxz(cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
6375         (*mgp)->mg_ptr = (char *) cache;
6376     }
6377     assert(cache);
6378
6379     if (PL_utf8cache < 0 && SvPOKp(sv)) {
6380         /* SvPOKp() because it's possible that sv has string overloading, and
6381            therefore is a reference, hence SvPVX() is actually a pointer.
6382            This cures the (very real) symptoms of RT 69422, but I'm not actually
6383            sure whether we should even be caching the results of UTF-8
6384            operations on overloading, given that nothing stops overloading
6385            returning a different value every time it's called.  */
6386         const U8 *start = (const U8 *) SvPVX_const(sv);
6387         const STRLEN realutf8 = utf8_length(start, start + byte);
6388
6389         if (realutf8 != utf8) {
6390             /* Need to turn the assertions off otherwise we may recurse
6391                infinitely while printing error messages.  */
6392             SAVEI8(PL_utf8cache);
6393             PL_utf8cache = 0;
6394             Perl_croak(aTHX_ "panic: utf8_mg_pos_cache_update cache %"UVuf
6395                        " real %"UVuf" for %"SVf, (UV) utf8, (UV) realutf8, SVfARG(sv));
6396         }
6397     }
6398
6399     /* Cache is held with the later position first, to simplify the code
6400        that deals with unbounded ends.  */
6401        
6402     ASSERT_UTF8_CACHE(cache);
6403     if (cache[1] == 0) {
6404         /* Cache is totally empty  */
6405         cache[0] = utf8;
6406         cache[1] = byte;
6407     } else if (cache[3] == 0) {
6408         if (byte > cache[1]) {
6409             /* New one is larger, so goes first.  */
6410             cache[2] = cache[0];
6411             cache[3] = cache[1];
6412             cache[0] = utf8;
6413             cache[1] = byte;
6414         } else {
6415             cache[2] = utf8;
6416             cache[3] = byte;
6417         }
6418     } else {
6419 #define THREEWAY_SQUARE(a,b,c,d) \
6420             ((float)((d) - (c))) * ((float)((d) - (c))) \
6421             + ((float)((c) - (b))) * ((float)((c) - (b))) \
6422                + ((float)((b) - (a))) * ((float)((b) - (a)))
6423
6424         /* Cache has 2 slots in use, and we know three potential pairs.
6425            Keep the two that give the lowest RMS distance. Do the
6426            calcualation in bytes simply because we always know the byte
6427            length.  squareroot has the same ordering as the positive value,
6428            so don't bother with the actual square root.  */
6429         const float existing = THREEWAY_SQUARE(0, cache[3], cache[1], blen);
6430         if (byte > cache[1]) {
6431             /* New position is after the existing pair of pairs.  */
6432             const float keep_earlier
6433                 = THREEWAY_SQUARE(0, cache[3], byte, blen);
6434             const float keep_later
6435                 = THREEWAY_SQUARE(0, cache[1], byte, blen);
6436
6437             if (keep_later < keep_earlier) {
6438                 if (keep_later < existing) {
6439                     cache[2] = cache[0];
6440                     cache[3] = cache[1];
6441                     cache[0] = utf8;
6442                     cache[1] = byte;
6443                 }
6444             }
6445             else {
6446                 if (keep_earlier < existing) {
6447                     cache[0] = utf8;
6448                     cache[1] = byte;
6449                 }
6450             }
6451         }
6452         else if (byte > cache[3]) {
6453             /* New position is between the existing pair of pairs.  */
6454             const float keep_earlier
6455                 = THREEWAY_SQUARE(0, cache[3], byte, blen);
6456             const float keep_later
6457                 = THREEWAY_SQUARE(0, byte, cache[1], blen);
6458
6459             if (keep_later < keep_earlier) {
6460                 if (keep_later < existing) {
6461                     cache[2] = utf8;
6462                     cache[3] = byte;
6463                 }
6464             }
6465             else {
6466                 if (keep_earlier < existing) {
6467                     cache[0] = utf8;
6468                     cache[1] = byte;
6469                 }
6470             }
6471         }
6472         else {
6473             /* New position is before the existing pair of pairs.  */
6474             const float keep_earlier
6475                 = THREEWAY_SQUARE(0, byte, cache[3], blen);
6476             const float keep_later
6477                 = THREEWAY_SQUARE(0, byte, cache[1], blen);
6478
6479             if (keep_later < keep_earlier) {
6480                 if (keep_later < existing) {
6481                     cache[2] = utf8;
6482                     cache[3] = byte;
6483                 }
6484             }
6485             else {
6486                 if (keep_earlier < existing) {
6487                     cache[0] = cache[2];
6488                     cache[1] = cache[3];
6489                     cache[2] = utf8;
6490                     cache[3] = byte;
6491                 }
6492             }
6493         }
6494     }
6495     ASSERT_UTF8_CACHE(cache);
6496 }
6497
6498 /* We already know all of the way, now we may be able to walk back.  The same
6499    assumption is made as in S_sv_pos_u2b_midway(), namely that walking
6500    backward is half the speed of walking forward. */
6501 static STRLEN
6502 S_sv_pos_b2u_midway(pTHX_ const U8 *const s, const U8 *const target,
6503                     const U8 *end, STRLEN endu)
6504 {
6505     const STRLEN forw = target - s;
6506     STRLEN backw = end - target;
6507
6508     PERL_ARGS_ASSERT_SV_POS_B2U_MIDWAY;
6509
6510     if (forw < 2 * backw) {
6511         return utf8_length(s, target);
6512     }
6513
6514     while (end > target) {
6515         end--;
6516         while (UTF8_IS_CONTINUATION(*end)) {
6517             end--;
6518         }
6519         endu--;
6520     }
6521     return endu;
6522 }
6523
6524 /*
6525 =for apidoc sv_pos_b2u
6526
6527 Converts the value pointed to by offsetp from a count of bytes from the
6528 start of the string, to a count of the equivalent number of UTF-8 chars.
6529 Handles magic and type coercion.
6530
6531 =cut
6532 */
6533
6534 /*
6535  * sv_pos_b2u() uses, like sv_pos_u2b(), the mg_ptr of the potential
6536  * PERL_MAGIC_utf8 of the sv to store the mapping between UTF-8 and
6537  * byte offsets.
6538  *
6539  */
6540 void
6541 Perl_sv_pos_b2u(pTHX_ register SV *const sv, I32 *const offsetp)
6542 {
6543     const U8* s;
6544     const STRLEN byte = *offsetp;
6545     STRLEN len = 0; /* Actually always set, but let's keep gcc happy.  */
6546     STRLEN blen;
6547     MAGIC* mg = NULL;
6548     const U8* send;
6549     bool found = FALSE;
6550
6551     PERL_ARGS_ASSERT_SV_POS_B2U;
6552
6553     if (!sv)
6554         return;
6555
6556     s = (const U8*)SvPV_const(sv, blen);
6557
6558     if (blen < byte)
6559         Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
6560
6561     send = s + byte;
6562
6563     if (!SvREADONLY(sv)
6564         && PL_utf8cache
6565         && SvTYPE(sv) >= SVt_PVMG
6566         && (mg = mg_find(sv, PERL_MAGIC_utf8)))
6567     {
6568         if (mg->mg_ptr) {
6569             STRLEN * const cache = (STRLEN *) mg->mg_ptr;
6570             if (cache[1] == byte) {
6571                 /* An exact match. */
6572                 *offsetp = cache[0];
6573                 return;
6574             }
6575             if (cache[3] == byte) {
6576                 /* An exact match. */
6577                 *offsetp = cache[2];
6578                 return;
6579             }
6580
6581             if (cache[1] < byte) {
6582                 /* We already know part of the way. */
6583                 if (mg->mg_len != -1) {
6584                     /* Actually, we know the end too.  */
6585                     len = cache[0]
6586                         + S_sv_pos_b2u_midway(aTHX_ s + cache[1], send,
6587                                               s + blen, mg->mg_len - cache[0]);
6588                 } else {
6589                     len = cache[0] + utf8_length(s + cache[1], send);
6590                 }
6591             }
6592             else if (cache[3] < byte) {
6593                 /* We're between the two cached pairs, so we do the calculation
6594                    offset by the byte/utf-8 positions for the earlier pair,
6595                    then add the utf-8 characters from the string start to
6596                    there.  */
6597                 len = S_sv_pos_b2u_midway(aTHX_ s + cache[3], send,
6598                                           s + cache[1], cache[0] - cache[2])
6599                     + cache[2];
6600
6601             }
6602             else { /* cache[3] > byte */
6603                 len = S_sv_pos_b2u_midway(aTHX_ s, send, s + cache[3],
6604                                           cache[2]);
6605
6606             }
6607             ASSERT_UTF8_CACHE(cache);
6608             found = TRUE;
6609         } else if (mg->mg_len != -1) {
6610             len = S_sv_pos_b2u_midway(aTHX_ s, send, s + blen, mg->mg_len);
6611             found = TRUE;
6612         }
6613     }
6614     if (!found || PL_utf8cache < 0) {
6615         const STRLEN real_len = utf8_length(s, send);
6616
6617         if (found && PL_utf8cache < 0) {
6618             if (len != real_len) {
6619                 /* Need to turn the assertions off otherwise we may recurse
6620                    infinitely while printing error messages.  */
6621                 SAVEI8(PL_utf8cache);
6622                 PL_utf8cache = 0;
6623                 Perl_croak(aTHX_ "panic: sv_pos_b2u cache %"UVuf
6624                            " real %"UVuf" for %"SVf,
6625                            (UV) len, (UV) real_len, SVfARG(sv));
6626             }
6627         }
6628         len = real_len;
6629     }
6630     *offsetp = len;
6631
6632     if (PL_utf8cache)
6633         utf8_mg_pos_cache_update(sv, &mg, byte, len, blen);
6634 }
6635
6636 /*
6637 =for apidoc sv_eq
6638
6639 Returns a boolean indicating whether the strings in the two SVs are
6640 identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6641 coerce its args to strings if necessary.
6642
6643 =cut
6644 */
6645
6646 I32
6647 Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
6648 {
6649     dVAR;
6650     const char *pv1;
6651     STRLEN cur1;
6652     const char *pv2;
6653     STRLEN cur2;
6654     I32  eq     = 0;
6655     char *tpv   = NULL;
6656     SV* svrecode = NULL;
6657
6658     if (!sv1) {
6659         pv1 = "";
6660         cur1 = 0;
6661     }
6662     else {
6663         /* if pv1 and pv2 are the same, second SvPV_const call may
6664          * invalidate pv1, so we may need to make a copy */
6665         if (sv1 == sv2 && (SvTHINKFIRST(sv1) || SvGMAGICAL(sv1))) {
6666             pv1 = SvPV_const(sv1, cur1);
6667             sv1 = newSVpvn_flags(pv1, cur1, SVs_TEMP | SvUTF8(sv2));
6668         }
6669         pv1 = SvPV_const(sv1, cur1);
6670     }
6671
6672     if (!sv2){
6673         pv2 = "";
6674         cur2 = 0;
6675     }
6676     else
6677         pv2 = SvPV_const(sv2, cur2);
6678
6679     if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
6680         /* Differing utf8ness.
6681          * Do not UTF8size the comparands as a side-effect. */
6682          if (PL_encoding) {
6683               if (SvUTF8(sv1)) {
6684                    svrecode = newSVpvn(pv2, cur2);
6685                    sv_recode_to_utf8(svrecode, PL_encoding);
6686                    pv2 = SvPV_const(svrecode, cur2);
6687               }
6688               else {
6689                    svrecode = newSVpvn(pv1, cur1);
6690                    sv_recode_to_utf8(svrecode, PL_encoding);
6691                    pv1 = SvPV_const(svrecode, cur1);
6692               }
6693               /* Now both are in UTF-8. */
6694               if (cur1 != cur2) {
6695                    SvREFCNT_dec(svrecode);
6696                    return FALSE;
6697               }
6698          }
6699          else {
6700               bool is_utf8 = TRUE;
6701
6702               if (SvUTF8(sv1)) {
6703                    /* sv1 is the UTF-8 one,
6704                     * if is equal it must be downgrade-able */
6705                    char * const pv = (char*)bytes_from_utf8((const U8*)pv1,
6706                                                      &cur1, &is_utf8);
6707                    if (pv != pv1)
6708                         pv1 = tpv = pv;
6709               }
6710               else {
6711                    /* sv2 is the UTF-8 one,
6712                     * if is equal it must be downgrade-able */
6713                    char * const pv = (char *)bytes_from_utf8((const U8*)pv2,
6714                                                       &cur2, &is_utf8);
6715                    if (pv != pv2)
6716                         pv2 = tpv = pv;
6717               }
6718               if (is_utf8) {
6719                    /* Downgrade not possible - cannot be eq */
6720                    assert (tpv == 0);
6721                    return FALSE;
6722               }
6723          }
6724     }
6725
6726     if (cur1 == cur2)
6727         eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
6728         
6729     SvREFCNT_dec(svrecode);
6730     if (tpv)
6731         Safefree(tpv);
6732
6733     return eq;
6734 }
6735
6736 /*
6737 =for apidoc sv_cmp
6738
6739 Compares the strings in two SVs.  Returns -1, 0, or 1 indicating whether the
6740 string in C<sv1> is less than, equal to, or greater than the string in
6741 C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6742 coerce its args to strings if necessary.  See also C<sv_cmp_locale>.
6743
6744 =cut
6745 */
6746
6747 I32
6748 Perl_sv_cmp(pTHX_ register SV *const sv1, register SV *const sv2)
6749 {
6750     dVAR;
6751     STRLEN cur1, cur2;
6752     const char *pv1, *pv2;
6753     char *tpv = NULL;
6754     I32  cmp;
6755     SV *svrecode = NULL;
6756
6757     if (!sv1) {
6758         pv1 = "";
6759         cur1 = 0;
6760     }
6761     else
6762         pv1 = SvPV_const(sv1, cur1);
6763
6764     if (!sv2) {
6765         pv2 = "";
6766         cur2 = 0;
6767     }
6768     else
6769         pv2 = SvPV_const(sv2, cur2);
6770
6771     if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
6772         /* Differing utf8ness.
6773          * Do not UTF8size the comparands as a side-effect. */
6774         if (SvUTF8(sv1)) {
6775             if (PL_encoding) {
6776                  svrecode = newSVpvn(pv2, cur2);
6777                  sv_recode_to_utf8(svrecode, PL_encoding);
6778                  pv2 = SvPV_const(svrecode, cur2);
6779             }
6780             else {
6781                  pv2 = tpv = (char*)bytes_to_utf8((const U8*)pv2, &cur2);
6782             }
6783         }
6784         else {
6785             if (PL_encoding) {
6786                  svrecode = newSVpvn(pv1, cur1);
6787                  sv_recode_to_utf8(svrecode, PL_encoding);
6788                  pv1 = SvPV_const(svrecode, cur1);
6789             }
6790             else {
6791                  pv1 = tpv = (char*)bytes_to_utf8((const U8*)pv1, &cur1);
6792             }
6793         }
6794     }
6795
6796     if (!cur1) {
6797         cmp = cur2 ? -1 : 0;
6798     } else if (!cur2) {
6799         cmp = 1;
6800     } else {
6801         const I32 retval = memcmp((const void*)pv1, (const void*)pv2, cur1 < cur2 ? cur1 : cur2);
6802
6803         if (retval) {
6804             cmp = retval < 0 ? -1 : 1;
6805         } else if (cur1 == cur2) {
6806             cmp = 0;
6807         } else {
6808             cmp = cur1 < cur2 ? -1 : 1;
6809         }
6810     }
6811
6812     SvREFCNT_dec(svrecode);
6813     if (tpv)
6814         Safefree(tpv);
6815
6816     return cmp;
6817 }
6818
6819 /*
6820 =for apidoc sv_cmp_locale
6821
6822 Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
6823 'use bytes' aware, handles get magic, and will coerce its args to strings
6824 if necessary.  See also C<sv_cmp>.
6825
6826 =cut
6827 */
6828
6829 I32
6830 Perl_sv_cmp_locale(pTHX_ register SV *const sv1, register SV *const sv2)
6831 {
6832     dVAR;
6833 #ifdef USE_LOCALE_COLLATE
6834
6835     char *pv1, *pv2;
6836     STRLEN len1, len2;
6837     I32 retval;
6838
6839     if (PL_collation_standard)
6840         goto raw_compare;
6841
6842     len1 = 0;
6843     pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
6844     len2 = 0;
6845     pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
6846
6847     if (!pv1 || !len1) {
6848         if (pv2 && len2)
6849             return -1;
6850         else
6851             goto raw_compare;
6852     }
6853     else {
6854         if (!pv2 || !len2)
6855             return 1;
6856     }
6857
6858     retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
6859
6860     if (retval)
6861         return retval < 0 ? -1 : 1;
6862
6863     /*
6864      * When the result of collation is equality, that doesn't mean
6865      * that there are no differences -- some locales exclude some
6866      * characters from consideration.  So to avoid false equalities,
6867      * we use the raw string as a tiebreaker.
6868      */
6869
6870   raw_compare:
6871     /*FALLTHROUGH*/
6872
6873 #endif /* USE_LOCALE_COLLATE */
6874
6875     return sv_cmp(sv1, sv2);
6876 }
6877
6878
6879 #ifdef USE_LOCALE_COLLATE
6880
6881 /*
6882 =for apidoc sv_collxfrm
6883
6884 Add Collate Transform magic to an SV if it doesn't already have it.
6885
6886 Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
6887 scalar data of the variable, but transformed to such a format that a normal
6888 memory comparison can be used to compare the data according to the locale
6889 settings.
6890
6891 =cut
6892 */
6893
6894 char *
6895 Perl_sv_collxfrm(pTHX_ SV *const sv, STRLEN *const nxp)
6896 {
6897     dVAR;
6898     MAGIC *mg;
6899
6900     PERL_ARGS_ASSERT_SV_COLLXFRM;
6901
6902     mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
6903     if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
6904         const char *s;
6905         char *xf;
6906         STRLEN len, xlen;
6907
6908         if (mg)
6909             Safefree(mg->mg_ptr);
6910         s = SvPV_const(sv, len);
6911         if ((xf = mem_collxfrm(s, len, &xlen))) {
6912             if (! mg) {
6913 #ifdef PERL_OLD_COPY_ON_WRITE
6914                 if (SvIsCOW(sv))
6915                     sv_force_normal_flags(sv, 0);
6916 #endif
6917                 mg = sv_magicext(sv, 0, PERL_MAGIC_collxfrm, &PL_vtbl_collxfrm,
6918                                  0, 0);
6919                 assert(mg);
6920             }
6921             mg->mg_ptr = xf;
6922             mg->mg_len = xlen;
6923         }
6924         else {
6925             if (mg) {
6926                 mg->mg_ptr = NULL;
6927                 mg->mg_len = -1;
6928             }
6929         }
6930     }
6931     if (mg && mg->mg_ptr) {
6932         *nxp = mg->mg_len;
6933         return mg->mg_ptr + sizeof(PL_collation_ix);
6934     }
6935     else {
6936         *nxp = 0;
6937         return NULL;
6938     }
6939 }
6940
6941 #endif /* USE_LOCALE_COLLATE */
6942
6943 /*
6944 =for apidoc sv_gets
6945
6946 Get a line from the filehandle and store it into the SV, optionally
6947 appending to the currently-stored string.
6948
6949 =cut
6950 */
6951
6952 char *
6953 Perl_sv_gets(pTHX_ register SV *const sv, register PerlIO *const fp, I32 append)
6954 {
6955     dVAR;
6956     const char *rsptr;
6957     STRLEN rslen;
6958     register STDCHAR rslast;
6959     register STDCHAR *bp;
6960     register I32 cnt;
6961     I32 i = 0;
6962     I32 rspara = 0;
6963
6964     PERL_ARGS_ASSERT_SV_GETS;
6965
6966     if (SvTHINKFIRST(sv))
6967         sv_force_normal_flags(sv, append ? 0 : SV_COW_DROP_PV);
6968     /* XXX. If you make this PVIV, then copy on write can copy scalars read
6969        from <>.
6970        However, perlbench says it's slower, because the existing swipe code
6971        is faster than copy on write.
6972        Swings and roundabouts.  */
6973     SvUPGRADE(sv, SVt_PV);
6974
6975     SvSCREAM_off(sv);
6976
6977     if (append) {
6978         if (PerlIO_isutf8(fp)) {
6979             if (!SvUTF8(sv)) {
6980                 sv_utf8_upgrade_nomg(sv);
6981                 sv_pos_u2b(sv,&append,0);
6982             }
6983         } else if (SvUTF8(sv)) {
6984             SV * const tsv = newSV(0);
6985             sv_gets(tsv, fp, 0);
6986             sv_utf8_upgrade_nomg(tsv);
6987             SvCUR_set(sv,append);
6988             sv_catsv(sv,tsv);
6989             sv_free(tsv);
6990             goto return_string_or_null;
6991         }
6992     }
6993
6994     SvPOK_only(sv);
6995     if (PerlIO_isutf8(fp))
6996         SvUTF8_on(sv);
6997
6998     if (IN_PERL_COMPILETIME) {
6999         /* we always read code in line mode */
7000         rsptr = "\n";
7001         rslen = 1;
7002     }
7003     else if (RsSNARF(PL_rs)) {
7004         /* If it is a regular disk file use size from stat() as estimate
7005            of amount we are going to read -- may result in mallocing
7006            more memory than we really need if the layers below reduce
7007            the size we read (e.g. CRLF or a gzip layer).
7008          */
7009         Stat_t st;
7010         if (!PerlLIO_fstat(PerlIO_fileno(fp), &st) && S_ISREG(st.st_mode))  {
7011             const Off_t offset = PerlIO_tell(fp);
7012             if (offset != (Off_t) -1 && st.st_size + append > offset) {
7013                 (void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 1));
7014             }
7015         }
7016         rsptr = NULL;
7017         rslen = 0;
7018     }
7019     else if (RsRECORD(PL_rs)) {
7020       I32 bytesread;
7021       char *buffer;
7022       U32 recsize;
7023 #ifdef VMS
7024       int fd;
7025 #endif
7026
7027       /* Grab the size of the record we're getting */
7028       recsize = SvUV(SvRV(PL_rs)); /* RsRECORD() guarantees > 0. */
7029       buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append;
7030       /* Go yank in */
7031 #ifdef VMS
7032       /* VMS wants read instead of fread, because fread doesn't respect */
7033       /* RMS record boundaries. This is not necessarily a good thing to be */
7034       /* doing, but we've got no other real choice - except avoid stdio
7035          as implementation - perhaps write a :vms layer ?
7036        */
7037       fd = PerlIO_fileno(fp);
7038       if (fd == -1) { /* in-memory file from PerlIO::Scalar */
7039           bytesread = PerlIO_read(fp, buffer, recsize);
7040       }
7041       else {
7042           bytesread = PerlLIO_read(fd, buffer, recsize);
7043       }
7044 #else
7045       bytesread = PerlIO_read(fp, buffer, recsize);
7046 #endif
7047       if (bytesread < 0)
7048           bytesread = 0;
7049       SvCUR_set(sv, bytesread + append);
7050       buffer[bytesread] = '\0';
7051       goto return_string_or_null;
7052     }
7053     else if (RsPARA(PL_rs)) {
7054         rsptr = "\n\n";
7055         rslen = 2;
7056         rspara = 1;
7057     }
7058     else {
7059         /* Get $/ i.e. PL_rs into same encoding as stream wants */
7060         if (PerlIO_isutf8(fp)) {
7061             rsptr = SvPVutf8(PL_rs, rslen);
7062         }
7063         else {
7064             if (SvUTF8(PL_rs)) {
7065                 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
7066                     Perl_croak(aTHX_ "Wide character in $/");
7067                 }
7068             }
7069             rsptr = SvPV_const(PL_rs, rslen);
7070         }
7071     }
7072
7073     rslast = rslen ? rsptr[rslen - 1] : '\0';
7074
7075     if (rspara) {               /* have to do this both before and after */
7076         do {                    /* to make sure file boundaries work right */
7077             if (PerlIO_eof(fp))
7078                 return 0;
7079             i = PerlIO_getc(fp);
7080             if (i != '\n') {
7081                 if (i == -1)
7082                     return 0;
7083                 PerlIO_ungetc(fp,i);
7084                 break;
7085             }
7086         } while (i != EOF);
7087     }
7088
7089     /* See if we know enough about I/O mechanism to cheat it ! */
7090
7091     /* This used to be #ifdef test - it is made run-time test for ease
7092        of abstracting out stdio interface. One call should be cheap
7093        enough here - and may even be a macro allowing compile
7094        time optimization.
7095      */
7096
7097     if (PerlIO_fast_gets(fp)) {
7098
7099     /*
7100      * We're going to steal some values from the stdio struct
7101      * and put EVERYTHING in the innermost loop into registers.
7102      */
7103     register STDCHAR *ptr;
7104     STRLEN bpx;
7105     I32 shortbuffered;
7106
7107 #if defined(VMS) && defined(PERLIO_IS_STDIO)
7108     /* An ungetc()d char is handled separately from the regular
7109      * buffer, so we getc() it back out and stuff it in the buffer.
7110      */
7111     i = PerlIO_getc(fp);
7112     if (i == EOF) return 0;
7113     *(--((*fp)->_ptr)) = (unsigned char) i;
7114     (*fp)->_cnt++;
7115 #endif
7116
7117     /* Here is some breathtakingly efficient cheating */
7118
7119     cnt = PerlIO_get_cnt(fp);                   /* get count into register */
7120     /* make sure we have the room */
7121     if ((I32)(SvLEN(sv) - append) <= cnt + 1) {
7122         /* Not room for all of it
7123            if we are looking for a separator and room for some
7124          */
7125         if (rslen && cnt > 80 && (I32)SvLEN(sv) > append) {
7126             /* just process what we have room for */
7127             shortbuffered = cnt - SvLEN(sv) + append + 1;
7128             cnt -= shortbuffered;
7129         }
7130         else {
7131             shortbuffered = 0;
7132             /* remember that cnt can be negative */
7133             SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
7134         }
7135     }
7136     else
7137         shortbuffered = 0;
7138     bp = (STDCHAR*)SvPVX_const(sv) + append;  /* move these two too to registers */
7139     ptr = (STDCHAR*)PerlIO_get_ptr(fp);
7140     DEBUG_P(PerlIO_printf(Perl_debug_log,
7141         "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
7142     DEBUG_P(PerlIO_printf(Perl_debug_log,
7143         "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
7144                PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
7145                PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
7146     for (;;) {
7147       screamer:
7148         if (cnt > 0) {
7149             if (rslen) {
7150                 while (cnt > 0) {                    /* this     |  eat */
7151                     cnt--;
7152                     if ((*bp++ = *ptr++) == rslast)  /* really   |  dust */
7153                         goto thats_all_folks;        /* screams  |  sed :-) */
7154                 }
7155             }
7156             else {
7157                 Copy(ptr, bp, cnt, char);            /* this     |  eat */
7158                 bp += cnt;                           /* screams  |  dust */
7159                 ptr += cnt;                          /* louder   |  sed :-) */
7160                 cnt = 0;
7161             }
7162         }
7163         
7164         if (shortbuffered) {            /* oh well, must extend */
7165             cnt = shortbuffered;
7166             shortbuffered = 0;
7167             bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
7168             SvCUR_set(sv, bpx);
7169             SvGROW(sv, SvLEN(sv) + append + cnt + 2);
7170             bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
7171             continue;
7172         }
7173
7174         DEBUG_P(PerlIO_printf(Perl_debug_log,
7175                               "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
7176                               PTR2UV(ptr),(long)cnt));
7177         PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
7178 #if 0
7179         DEBUG_P(PerlIO_printf(Perl_debug_log,
7180             "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
7181             PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
7182             PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
7183 #endif
7184         /* This used to call 'filbuf' in stdio form, but as that behaves like
7185            getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
7186            another abstraction.  */
7187         i   = PerlIO_getc(fp);          /* get more characters */
7188 #if 0
7189         DEBUG_P(PerlIO_printf(Perl_debug_log,
7190             "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
7191             PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
7192             PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
7193 #endif
7194         cnt = PerlIO_get_cnt(fp);
7195         ptr = (STDCHAR*)PerlIO_get_ptr(fp);     /* reregisterize cnt and ptr */
7196         DEBUG_P(PerlIO_printf(Perl_debug_log,
7197             "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
7198
7199         if (i == EOF)                   /* all done for ever? */
7200             goto thats_really_all_folks;
7201
7202         bpx = bp - (STDCHAR*)SvPVX_const(sv);   /* box up before relocation */
7203         SvCUR_set(sv, bpx);
7204         SvGROW(sv, bpx + cnt + 2);
7205         bp = (STDCHAR*)SvPVX_const(sv) + bpx;   /* unbox after relocation */
7206
7207         *bp++ = (STDCHAR)i;             /* store character from PerlIO_getc */
7208
7209         if (rslen && (STDCHAR)i == rslast)  /* all done for now? */
7210             goto thats_all_folks;
7211     }
7212
7213 thats_all_folks:
7214     if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX_const(sv)) < rslen) ||
7215           memNE((char*)bp - rslen, rsptr, rslen))
7216         goto screamer;                          /* go back to the fray */
7217 thats_really_all_folks:
7218     if (shortbuffered)
7219         cnt += shortbuffered;
7220         DEBUG_P(PerlIO_printf(Perl_debug_log,
7221             "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
7222     PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt);  /* put these back or we're in trouble */
7223     DEBUG_P(PerlIO_printf(Perl_debug_log,
7224         "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
7225         PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
7226         PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
7227     *bp = '\0';
7228     SvCUR_set(sv, bp - (STDCHAR*)SvPVX_const(sv));      /* set length */
7229     DEBUG_P(PerlIO_printf(Perl_debug_log,
7230         "Screamer: done, len=%ld, string=|%.*s|\n",
7231         (long)SvCUR(sv),(int)SvCUR(sv),SvPVX_const(sv)));
7232     }
7233    else
7234     {
7235        /*The big, slow, and stupid way. */
7236 #ifdef USE_HEAP_INSTEAD_OF_STACK        /* Even slower way. */
7237         STDCHAR *buf = NULL;
7238         Newx(buf, 8192, STDCHAR);
7239         assert(buf);
7240 #else
7241         STDCHAR buf[8192];
7242 #endif
7243
7244 screamer2:
7245         if (rslen) {
7246             register const STDCHAR * const bpe = buf + sizeof(buf);
7247             bp = buf;
7248             while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
7249                 ; /* keep reading */
7250             cnt = bp - buf;
7251         }
7252         else {
7253             cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
7254             /* Accomodate broken VAXC compiler, which applies U8 cast to
7255              * both args of ?: operator, causing EOF to change into 255
7256              */
7257             if (cnt > 0)
7258                  i = (U8)buf[cnt - 1];
7259             else
7260                  i = EOF;
7261         }
7262
7263         if (cnt < 0)
7264             cnt = 0;  /* we do need to re-set the sv even when cnt <= 0 */
7265         if (append)
7266              sv_catpvn(sv, (char *) buf, cnt);
7267         else
7268              sv_setpvn(sv, (char *) buf, cnt);
7269
7270         if (i != EOF &&                 /* joy */
7271             (!rslen ||
7272              SvCUR(sv) < rslen ||
7273              memNE(SvPVX_const(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
7274         {
7275             append = -1;
7276             /*
7277              * If we're reading from a TTY and we get a short read,
7278              * indicating that the user hit his EOF character, we need
7279              * to notice it now, because if we try to read from the TTY
7280              * again, the EOF condition will disappear.
7281              *
7282              * The comparison of cnt to sizeof(buf) is an optimization
7283              * that prevents unnecessary calls to feof().
7284              *
7285              * - jik 9/25/96
7286              */
7287             if (!(cnt < (I32)sizeof(buf) && PerlIO_eof(fp)))
7288                 goto screamer2;
7289         }
7290
7291 #ifdef USE_HEAP_INSTEAD_OF_STACK
7292         Safefree(buf);
7293 #endif
7294     }
7295
7296     if (rspara) {               /* have to do this both before and after */
7297         while (i != EOF) {      /* to make sure file boundaries work right */
7298             i = PerlIO_getc(fp);
7299             if (i != '\n') {
7300                 PerlIO_ungetc(fp,i);
7301                 break;
7302             }
7303         }
7304     }
7305
7306 return_string_or_null:
7307     return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
7308 }
7309
7310 /*
7311 =for apidoc sv_inc
7312
7313 Auto-increment of the value in the SV, doing string to numeric conversion
7314 if necessary. Handles 'get' magic.
7315
7316 =cut
7317 */
7318
7319 void
7320 Perl_sv_inc(pTHX_ register SV *const sv)
7321 {
7322     dVAR;
7323     register char *d;
7324     int flags;
7325
7326     if (!sv)
7327         return;
7328     SvGETMAGIC(sv);
7329     if (SvTHINKFIRST(sv)) {
7330         if (SvIsCOW(sv))
7331             sv_force_normal_flags(sv, 0);
7332         if (SvREADONLY(sv)) {
7333             if (IN_PERL_RUNTIME)
7334                 Perl_croak(aTHX_ "%s", PL_no_modify);
7335         }
7336         if (SvROK(sv)) {
7337             IV i;
7338             if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
7339                 return;
7340             i = PTR2IV(SvRV(sv));
7341             sv_unref(sv);
7342             sv_setiv(sv, i);
7343         }
7344     }
7345     flags = SvFLAGS(sv);
7346     if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
7347         /* It's (privately or publicly) a float, but not tested as an
7348            integer, so test it to see. */
7349         (void) SvIV(sv);
7350         flags = SvFLAGS(sv);
7351     }
7352     if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
7353         /* It's publicly an integer, or privately an integer-not-float */
7354 #ifdef PERL_PRESERVE_IVUV
7355       oops_its_int:
7356 #endif
7357         if (SvIsUV(sv)) {
7358             if (SvUVX(sv) == UV_MAX)
7359                 sv_setnv(sv, UV_MAX_P1);
7360             else
7361                 (void)SvIOK_only_UV(sv);
7362                 SvUV_set(sv, SvUVX(sv) + 1);
7363         } else {
7364             if (SvIVX(sv) == IV_MAX)
7365                 sv_setuv(sv, (UV)IV_MAX + 1);
7366             else {
7367                 (void)SvIOK_only(sv);
7368                 SvIV_set(sv, SvIVX(sv) + 1);
7369             }   
7370         }
7371         return;
7372     }
7373     if (flags & SVp_NOK) {
7374         const NV was = SvNVX(sv);
7375         if (NV_OVERFLOWS_INTEGERS_AT &&
7376             was >= NV_OVERFLOWS_INTEGERS_AT) {
7377             Perl_ck_warner(aTHX_ packWARN(WARN_IMPRECISION),
7378                            "Lost precision when incrementing %" NVff " by 1",
7379                            was);
7380         }
7381         (void)SvNOK_only(sv);
7382         SvNV_set(sv, was + 1.0);
7383         return;
7384     }
7385
7386     if (!(flags & SVp_POK) || !*SvPVX_const(sv)) {
7387         if ((flags & SVTYPEMASK) < SVt_PVIV)
7388             sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV ? SVt_PVIV : SVt_IV));
7389         (void)SvIOK_only(sv);
7390         SvIV_set(sv, 1);
7391         return;
7392     }
7393     d = SvPVX(sv);
7394     while (isALPHA(*d)) d++;
7395     while (isDIGIT(*d)) d++;
7396     if (d < SvEND(sv)) {
7397 #ifdef PERL_PRESERVE_IVUV
7398         /* Got to punt this as an integer if needs be, but we don't issue
7399            warnings. Probably ought to make the sv_iv_please() that does
7400            the conversion if possible, and silently.  */
7401         const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
7402         if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
7403             /* Need to try really hard to see if it's an integer.
7404                9.22337203685478e+18 is an integer.
7405                but "9.22337203685478e+18" + 0 is UV=9223372036854779904
7406                so $a="9.22337203685478e+18"; $a+0; $a++
7407                needs to be the same as $a="9.22337203685478e+18"; $a++
7408                or we go insane. */
7409         
7410             (void) sv_2iv(sv);
7411             if (SvIOK(sv))
7412                 goto oops_its_int;
7413
7414             /* sv_2iv *should* have made this an NV */
7415             if (flags & SVp_NOK) {
7416                 (void)SvNOK_only(sv);
7417                 SvNV_set(sv, SvNVX(sv) + 1.0);
7418                 return;
7419             }
7420             /* I don't think we can get here. Maybe I should assert this
7421                And if we do get here I suspect that sv_setnv will croak. NWC
7422                Fall through. */
7423 #if defined(USE_LONG_DOUBLE)
7424             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",
7425                                   SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
7426 #else
7427             DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_inc punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"NVgf"\n",
7428                                   SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
7429 #endif
7430         }
7431 #endif /* PERL_PRESERVE_IVUV */
7432         sv_setnv(sv,Atof(SvPVX_const(sv)) + 1.0);
7433         return;
7434     }
7435     d--;
7436     while (d >= SvPVX_const(sv)) {
7437         if (isDIGIT(*d)) {
7438             if (++*d <= '9')
7439                 return;
7440             *(d--) = '0';
7441         }
7442         else {
7443 #ifdef EBCDIC
7444             /* MKS: The original code here died if letters weren't consecutive.
7445              * at least it didn't have to worry about non-C locales.  The
7446              * new code assumes that ('z'-'a')==('Z'-'A'), letters are
7447              * arranged in order (although not consecutively) and that only
7448              * [A-Za-z] are accepted by isALPHA in the C locale.
7449              */
7450             if (*d != 'z' && *d != 'Z') {
7451                 do { ++*d; } while (!isALPHA(*d));
7452                 return;
7453             }
7454             *(d--) -= 'z' - 'a';
7455 #else
7456             ++*d;
7457             if (isALPHA(*d))
7458                 return;
7459             *(d--) -= 'z' - 'a' + 1;
7460 #endif
7461         }
7462     }
7463     /* oh,oh, the number grew */
7464     SvGROW(sv, SvCUR(sv) + 2);
7465     SvCUR_set(sv, SvCUR(sv) + 1);
7466     for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX_const(sv); d--)
7467         *d = d[-1];
7468     if (isDIGIT(d[1]))
7469         *d = '1';
7470     else
7471         *d = d[1];
7472 }
7473
7474 /*
7475 =for apidoc sv_dec
7476
7477 Auto-decrement of the value in the SV, doing string to numeric conversion
7478 if necessary. Handles 'get' magic.
7479
7480 =cut
7481 */
7482
7483 void
7484 Perl_sv_dec(pTHX_ register SV *const sv)
7485 {
7486     dVAR;
7487     int flags;
7488
7489     if (!sv)
7490         return;
7491     SvGETMAGIC(sv);
7492     if (SvTHINKFIRST(sv)) {
7493         if (SvIsCOW(sv))
7494             sv_force_normal_flags(sv, 0);
7495         if (SvREADONLY(sv)) {
7496             if (IN_PERL_RUNTIME)
7497                 Perl_croak(aTHX_ "%s", PL_no_modify);
7498         }
7499         if (SvROK(sv)) {
7500             IV i;
7501             if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
7502                 return;
7503             i = PTR2IV(SvRV(sv));
7504             sv_unref(sv);
7505             sv_setiv(sv, i);
7506         }
7507     }
7508     /* Unlike sv_inc we don't have to worry about string-never-numbers
7509        and keeping them magic. But we mustn't warn on punting */
7510     flags = SvFLAGS(sv);
7511     if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
7512         /* It's publicly an integer, or privately an integer-not-float */
7513 #ifdef PERL_PRESERVE_IVUV
7514       oops_its_int:
7515 #endif
7516         if (SvIsUV(sv)) {
7517             if (SvUVX(sv) == 0) {
7518                 (void)SvIOK_only(sv);
7519                 SvIV_set(sv, -1);
7520             }
7521             else {
7522                 (void)SvIOK_only_UV(sv);
7523                 SvUV_set(sv, SvUVX(sv) - 1);
7524             }   
7525         } else {
7526             if (SvIVX(sv) == IV_MIN) {
7527                 sv_setnv(sv, (NV)IV_MIN);
7528                 goto oops_its_num;
7529             }
7530             else {
7531                 (void)SvIOK_only(sv);
7532                 SvIV_set(sv, SvIVX(sv) - 1);
7533             }   
7534         }
7535         return;
7536     }
7537     if (flags & SVp_NOK) {
7538     oops_its_num:
7539         {
7540             const NV was = SvNVX(sv);
7541             if (NV_OVERFLOWS_INTEGERS_AT &&
7542                 was <= -NV_OVERFLOWS_INTEGERS_AT) {
7543                 Perl_ck_warner(aTHX_ packWARN(WARN_IMPRECISION),
7544                                "Lost precision when decrementing %" NVff " by 1",
7545                                was);
7546             }
7547             (void)SvNOK_only(sv);
7548             SvNV_set(sv, was - 1.0);
7549             return;
7550         }
7551     }
7552     if (!(flags & SVp_POK)) {
7553         if ((flags & SVTYPEMASK) < SVt_PVIV)
7554             sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV) ? SVt_PVIV : SVt_IV);
7555         SvIV_set(sv, -1);
7556         (void)SvIOK_only(sv);
7557         return;
7558     }
7559 #ifdef PERL_PRESERVE_IVUV
7560     {
7561         const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
7562         if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
7563             /* Need to try really hard to see if it's an integer.
7564                9.22337203685478e+18 is an integer.
7565                but "9.22337203685478e+18" + 0 is UV=9223372036854779904
7566                so $a="9.22337203685478e+18"; $a+0; $a--
7567                needs to be the same as $a="9.22337203685478e+18"; $a--
7568                or we go insane. */
7569         
7570             (void) sv_2iv(sv);
7571             if (SvIOK(sv))
7572                 goto oops_its_int;
7573
7574             /* sv_2iv *should* have made this an NV */
7575             if (flags & SVp_NOK) {
7576                 (void)SvNOK_only(sv);
7577                 SvNV_set(sv, SvNVX(sv) - 1.0);
7578                 return;
7579             }
7580             /* I don't think we can get here. Maybe I should assert this
7581                And if we do get here I suspect that sv_setnv will croak. NWC
7582                Fall through. */
7583 #if defined(USE_LONG_DOUBLE)
7584             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",
7585                                   SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
7586 #else
7587             DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_dec punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"NVgf"\n",
7588                                   SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
7589 #endif
7590         }
7591     }
7592 #endif /* PERL_PRESERVE_IVUV */
7593     sv_setnv(sv,Atof(SvPVX_const(sv)) - 1.0);   /* punt */
7594 }
7595
7596 /* this define is used to eliminate a chunk of duplicated but shared logic
7597  * it has the suffix __SV_C to signal that it isnt API, and isnt meant to be
7598  * used anywhere but here - yves
7599  */
7600 #define PUSH_EXTEND_MORTAL__SV_C(AnSv) \
7601     STMT_START {      \
7602         EXTEND_MORTAL(1); \
7603         PL_tmps_stack[++PL_tmps_ix] = (AnSv); \
7604     } STMT_END
7605
7606 /*
7607 =for apidoc sv_mortalcopy
7608
7609 Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
7610 The new SV is marked as mortal. It will be destroyed "soon", either by an
7611 explicit call to FREETMPS, or by an implicit call at places such as
7612 statement boundaries.  See also C<sv_newmortal> and C<sv_2mortal>.
7613
7614 =cut
7615 */
7616
7617 /* Make a string that will exist for the duration of the expression
7618  * evaluation.  Actually, it may have to last longer than that, but
7619  * hopefully we won't free it until it has been assigned to a
7620  * permanent location. */
7621
7622 SV *
7623 Perl_sv_mortalcopy(pTHX_ SV *const oldstr)
7624 {
7625     dVAR;
7626     register SV *sv;
7627
7628     new_SV(sv);
7629     sv_setsv(sv,oldstr);
7630     PUSH_EXTEND_MORTAL__SV_C(sv);
7631     SvTEMP_on(sv);
7632     return sv;
7633 }
7634
7635 /*
7636 =for apidoc sv_newmortal
7637
7638 Creates a new null SV which is mortal.  The reference count of the SV is
7639 set to 1. It will be destroyed "soon", either by an explicit call to
7640 FREETMPS, or by an implicit call at places such as statement boundaries.
7641 See also C<sv_mortalcopy> and C<sv_2mortal>.
7642
7643 =cut
7644 */
7645
7646 SV *
7647 Perl_sv_newmortal(pTHX)
7648 {
7649     dVAR;
7650     register SV *sv;
7651
7652     new_SV(sv);
7653     SvFLAGS(sv) = SVs_TEMP;
7654     PUSH_EXTEND_MORTAL__SV_C(sv);
7655     return sv;
7656 }
7657
7658
7659 /*
7660 =for apidoc newSVpvn_flags
7661
7662 Creates a new SV and copies a string into it.  The reference count for the
7663 SV is set to 1.  Note that if C<len> is zero, Perl will create a zero length
7664 string.  You are responsible for ensuring that the source string is at least
7665 C<len> bytes long.  If the C<s> argument is NULL the new SV will be undefined.
7666 Currently the only flag bits accepted are C<SVf_UTF8> and C<SVs_TEMP>.
7667 If C<SVs_TEMP> is set, then C<sv2mortal()> is called on the result before
7668 returning. If C<SVf_UTF8> is set, C<s> is considered to be in UTF-8 and the
7669 C<SVf_UTF8> flag will be set on the new SV.
7670 C<newSVpvn_utf8()> is a convenience wrapper for this function, defined as
7671
7672     #define newSVpvn_utf8(s, len, u)                    \
7673         newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0)
7674
7675 =cut
7676 */
7677
7678 SV *
7679 Perl_newSVpvn_flags(pTHX_ const char *const s, const STRLEN len, const U32 flags)
7680 {
7681     dVAR;
7682     register SV *sv;
7683
7684     /* All the flags we don't support must be zero.
7685        And we're new code so I'm going to assert this from the start.  */
7686     assert(!(flags & ~(SVf_UTF8|SVs_TEMP)));
7687     new_SV(sv);
7688     sv_setpvn(sv,s,len);
7689
7690     /* This code used to a sv_2mortal(), however we now unroll the call to sv_2mortal()
7691      * and do what it does outselves here.
7692      * Since we have asserted that flags can only have the SVf_UTF8 and/or SVs_TEMP flags
7693      * set above we can use it to enable the sv flags directly (bypassing SvTEMP_on), which
7694      * in turn means we dont need to mask out the SVf_UTF8 flag below, which means that we
7695      * eleminate quite a few steps than it looks - Yves (explaining patch by gfx)
7696      */
7697
7698     SvFLAGS(sv) |= flags;
7699
7700     if(flags & SVs_TEMP){
7701         PUSH_EXTEND_MORTAL__SV_C(sv);
7702     }
7703
7704     return sv;
7705 }
7706
7707 /*
7708 =for apidoc sv_2mortal
7709
7710 Marks an existing SV as mortal.  The SV will be destroyed "soon", either
7711 by an explicit call to FREETMPS, or by an implicit call at places such as
7712 statement boundaries.  SvTEMP() is turned on which means that the SV's
7713 string buffer can be "stolen" if this SV is copied. See also C<sv_newmortal>
7714 and C<sv_mortalcopy>.
7715
7716 =cut
7717 */
7718
7719 SV *
7720 Perl_sv_2mortal(pTHX_ register SV *const sv)
7721 {
7722     dVAR;
7723     if (!sv)
7724         return NULL;
7725     if (SvREADONLY(sv) && SvIMMORTAL(sv))
7726         return sv;
7727     PUSH_EXTEND_MORTAL__SV_C(sv);
7728     SvTEMP_on(sv);
7729     return sv;
7730 }
7731
7732 /*
7733 =for apidoc newSVpv
7734
7735 Creates a new SV and copies a string into it.  The reference count for the
7736 SV is set to 1.  If C<len> is zero, Perl will compute the length using
7737 strlen().  For efficiency, consider using C<newSVpvn> instead.
7738
7739 =cut
7740 */
7741
7742 SV *
7743 Perl_newSVpv(pTHX_ const char *const s, const STRLEN len)
7744 {
7745     dVAR;
7746     register SV *sv;
7747
7748     new_SV(sv);
7749     sv_setpvn(sv, s, len || s == NULL ? len : strlen(s));
7750     return sv;
7751 }
7752
7753 /*
7754 =for apidoc newSVpvn
7755
7756 Creates a new SV and copies a string into it.  The reference count for the
7757 SV is set to 1.  Note that if C<len> is zero, Perl will create a zero length
7758 string.  You are responsible for ensuring that the source string is at least
7759 C<len> bytes long.  If the C<s> argument is NULL the new SV will be undefined.
7760
7761 =cut
7762 */
7763
7764 SV *
7765 Perl_newSVpvn(pTHX_ const char *const s, const STRLEN len)
7766 {
7767     dVAR;
7768     register SV *sv;
7769
7770     new_SV(sv);
7771     sv_setpvn(sv,s,len);
7772     return sv;
7773 }
7774
7775 /*
7776 =for apidoc newSVhek
7777
7778 Creates a new SV from the hash key structure.  It will generate scalars that
7779 point to the shared string table where possible. Returns a new (undefined)
7780 SV if the hek is NULL.
7781
7782 =cut
7783 */
7784
7785 SV *
7786 Perl_newSVhek(pTHX_ const HEK *const hek)
7787 {
7788     dVAR;
7789     if (!hek) {
7790         SV *sv;
7791
7792         new_SV(sv);
7793         return sv;
7794     }
7795
7796     if (HEK_LEN(hek) == HEf_SVKEY) {
7797         return newSVsv(*(SV**)HEK_KEY(hek));
7798     } else {
7799         const int flags = HEK_FLAGS(hek);
7800         if (flags & HVhek_WASUTF8) {
7801             /* Trouble :-)
7802                Andreas would like keys he put in as utf8 to come back as utf8
7803             */
7804             STRLEN utf8_len = HEK_LEN(hek);
7805             const U8 *as_utf8 = bytes_to_utf8 ((U8*)HEK_KEY(hek), &utf8_len);
7806             SV * const sv = newSVpvn ((const char*)as_utf8, utf8_len);
7807
7808             SvUTF8_on (sv);
7809             Safefree (as_utf8); /* bytes_to_utf8() allocates a new string */
7810             return sv;
7811         } else if (flags & (HVhek_REHASH|HVhek_UNSHARED)) {
7812             /* We don't have a pointer to the hv, so we have to replicate the
7813                flag into every HEK. This hv is using custom a hasing
7814                algorithm. Hence we can't return a shared string scalar, as
7815                that would contain the (wrong) hash value, and might get passed
7816                into an hv routine with a regular hash.
7817                Similarly, a hash that isn't using shared hash keys has to have
7818                the flag in every key so that we know not to try to call
7819                share_hek_kek on it.  */
7820
7821             SV * const sv = newSVpvn (HEK_KEY(hek), HEK_LEN(hek));
7822             if (HEK_UTF8(hek))
7823                 SvUTF8_on (sv);
7824             return sv;
7825         }
7826         /* This will be overwhelminly the most common case.  */
7827         {
7828             /* Inline most of newSVpvn_share(), because share_hek_hek() is far
7829                more efficient than sharepvn().  */
7830             SV *sv;
7831
7832             new_SV(sv);
7833             sv_upgrade(sv, SVt_PV);
7834             SvPV_set(sv, (char *)HEK_KEY(share_hek_hek(hek)));
7835             SvCUR_set(sv, HEK_LEN(hek));
7836             SvLEN_set(sv, 0);
7837             SvREADONLY_on(sv);
7838             SvFAKE_on(sv);
7839             SvPOK_on(sv);
7840             if (HEK_UTF8(hek))
7841                 SvUTF8_on(sv);
7842             return sv;
7843         }
7844     }
7845 }
7846
7847 /*
7848 =for apidoc newSVpvn_share
7849
7850 Creates a new SV with its SvPVX_const pointing to a shared string in the string
7851 table. If the string does not already exist in the table, it is created
7852 first.  Turns on READONLY and FAKE. If the C<hash> parameter is non-zero, that
7853 value is used; otherwise the hash is computed. The string's hash can be later
7854 be retrieved from the SV with the C<SvSHARED_HASH()> macro. The idea here is
7855 that as the string table is used for shared hash keys these strings will have
7856 SvPVX_const == HeKEY and hash lookup will avoid string compare.
7857
7858 =cut
7859 */
7860
7861 SV *
7862 Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
7863 {
7864     dVAR;
7865     register SV *sv;
7866     bool is_utf8 = FALSE;
7867     const char *const orig_src = src;
7868
7869     if (len < 0) {
7870         STRLEN tmplen = -len;
7871         is_utf8 = TRUE;
7872         /* See the note in hv.c:hv_fetch() --jhi */
7873         src = (char*)bytes_from_utf8((const U8*)src, &tmplen, &is_utf8);
7874         len = tmplen;
7875     }
7876     if (!hash)
7877         PERL_HASH(hash, src, len);
7878     new_SV(sv);
7879     /* The logic for this is inlined in S_mro_get_linear_isa_dfs(), so if it
7880        changes here, update it there too.  */
7881     sv_upgrade(sv, SVt_PV);
7882     SvPV_set(sv, sharepvn(src, is_utf8?-len:len, hash));
7883     SvCUR_set(sv, len);
7884     SvLEN_set(sv, 0);
7885     SvREADONLY_on(sv);
7886     SvFAKE_on(sv);
7887     SvPOK_on(sv);
7888     if (is_utf8)
7889         SvUTF8_on(sv);
7890     if (src != orig_src)
7891         Safefree(src);
7892     return sv;
7893 }
7894
7895
7896 #if defined(PERL_IMPLICIT_CONTEXT)
7897
7898 /* pTHX_ magic can't cope with varargs, so this is a no-context
7899  * version of the main function, (which may itself be aliased to us).
7900  * Don't access this version directly.
7901  */
7902
7903 SV *
7904 Perl_newSVpvf_nocontext(const char *const pat, ...)
7905 {
7906     dTHX;
7907     register SV *sv;
7908     va_list args;
7909
7910     PERL_ARGS_ASSERT_NEWSVPVF_NOCONTEXT;
7911
7912     va_start(args, pat);
7913     sv = vnewSVpvf(pat, &args);
7914     va_end(args);
7915     return sv;
7916 }
7917 #endif
7918
7919 /*
7920 =for apidoc newSVpvf
7921
7922 Creates a new SV and initializes it with the string formatted like
7923 C<sprintf>.
7924
7925 =cut
7926 */
7927
7928 SV *
7929 Perl_newSVpvf(pTHX_ const char *const pat, ...)
7930 {
7931     register SV *sv;
7932     va_list args;
7933
7934     PERL_ARGS_ASSERT_NEWSVPVF;
7935
7936     va_start(args, pat);
7937     sv = vnewSVpvf(pat, &args);
7938     va_end(args);
7939     return sv;
7940 }
7941
7942 /* backend for newSVpvf() and newSVpvf_nocontext() */
7943
7944 SV *
7945 Perl_vnewSVpvf(pTHX_ const char *const pat, va_list *const args)
7946 {
7947     dVAR;
7948     register SV *sv;
7949
7950     PERL_ARGS_ASSERT_VNEWSVPVF;
7951
7952     new_SV(sv);
7953     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
7954     return sv;
7955 }
7956
7957 /*
7958 =for apidoc newSVnv
7959
7960 Creates a new SV and copies a floating point value into it.
7961 The reference count for the SV is set to 1.
7962
7963 =cut
7964 */
7965
7966 SV *
7967 Perl_newSVnv(pTHX_ const NV n)
7968 {
7969     dVAR;
7970     register SV *sv;
7971
7972     new_SV(sv);
7973     sv_setnv(sv,n);
7974     return sv;
7975 }
7976
7977 /*
7978 =for apidoc newSViv
7979
7980 Creates a new SV and copies an integer into it.  The reference count for the
7981 SV is set to 1.
7982
7983 =cut
7984 */
7985
7986 SV *
7987 Perl_newSViv(pTHX_ const IV i)
7988 {
7989     dVAR;
7990     register SV *sv;
7991
7992     new_SV(sv);
7993     sv_setiv(sv,i);
7994     return sv;
7995 }
7996
7997 /*
7998 =for apidoc newSVuv
7999
8000 Creates a new SV and copies an unsigned integer into it.
8001 The reference count for the SV is set to 1.
8002
8003 =cut
8004 */
8005
8006 SV *
8007 Perl_newSVuv(pTHX_ const UV u)
8008 {
8009     dVAR;
8010     register SV *sv;
8011
8012     new_SV(sv);
8013     sv_setuv(sv,u);
8014     return sv;
8015 }
8016
8017 /*
8018 =for apidoc newSV_type
8019
8020 Creates a new SV, of the type specified.  The reference count for the new SV
8021 is set to 1.
8022
8023 =cut
8024 */
8025
8026 SV *
8027 Perl_newSV_type(pTHX_ const svtype type)
8028 {
8029     register SV *sv;
8030
8031     new_SV(sv);
8032     sv_upgrade(sv, type);
8033     return sv;
8034 }
8035
8036 /*
8037 =for apidoc newRV_noinc
8038
8039 Creates an RV wrapper for an SV.  The reference count for the original
8040 SV is B<not> incremented.
8041
8042 =cut
8043 */
8044
8045 SV *
8046 Perl_newRV_noinc(pTHX_ SV *const tmpRef)
8047 {
8048     dVAR;
8049     register SV *sv = newSV_type(SVt_IV);
8050
8051     PERL_ARGS_ASSERT_NEWRV_NOINC;
8052
8053     SvTEMP_off(tmpRef);
8054     SvRV_set(sv, tmpRef);
8055     SvROK_on(sv);
8056     return sv;
8057 }
8058
8059 /* newRV_inc is the official function name to use now.
8060  * newRV_inc is in fact #defined to newRV in sv.h
8061  */
8062
8063 SV *
8064 Perl_newRV(pTHX_ SV *const sv)
8065 {
8066     dVAR;
8067
8068     PERL_ARGS_ASSERT_NEWRV;
8069
8070     return newRV_noinc(SvREFCNT_inc_simple_NN(sv));
8071 }
8072
8073 /*
8074 =for apidoc newSVsv
8075
8076 Creates a new SV which is an exact duplicate of the original SV.
8077 (Uses C<sv_setsv>).
8078
8079 =cut
8080 */
8081
8082 SV *
8083 Perl_newSVsv(pTHX_ register SV *const old)
8084 {
8085     dVAR;
8086     register SV *sv;
8087
8088     if (!old)
8089         return NULL;
8090     if (SvTYPE(old) == SVTYPEMASK) {
8091         Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
8092         return NULL;
8093     }
8094     new_SV(sv);
8095     /* SV_GMAGIC is the default for sv_setv()
8096        SV_NOSTEAL prevents TEMP buffers being, well, stolen, and saves games
8097        with SvTEMP_off and SvTEMP_on round a call to sv_setsv.  */
8098     sv_setsv_flags(sv, old, SV_GMAGIC | SV_NOSTEAL);
8099     return sv;
8100 }
8101
8102 /*
8103 =for apidoc sv_reset
8104
8105 Underlying implementation for the C<reset> Perl function.
8106 Note that the perl-level function is vaguely deprecated.
8107
8108 =cut
8109 */
8110
8111 void
8112 Perl_sv_reset(pTHX_ register const char *s, HV *const stash)
8113 {
8114     dVAR;
8115     char todo[PERL_UCHAR_MAX+1];
8116
8117     PERL_ARGS_ASSERT_SV_RESET;
8118
8119     if (!stash)
8120         return;
8121
8122     if (!*s) {          /* reset ?? searches */
8123         MAGIC * const mg = mg_find((const SV *)stash, PERL_MAGIC_symtab);
8124         if (mg) {
8125             const U32 count = mg->mg_len / sizeof(PMOP**);
8126             PMOP **pmp = (PMOP**) mg->mg_ptr;
8127             PMOP *const *const end = pmp + count;
8128
8129             while (pmp < end) {
8130 #ifdef USE_ITHREADS
8131                 SvREADONLY_off(PL_regex_pad[(*pmp)->op_pmoffset]);
8132 #else
8133                 (*pmp)->op_pmflags &= ~PMf_USED;
8134 #endif
8135                 ++pmp;
8136             }
8137         }
8138         return;
8139     }
8140
8141     /* reset variables */
8142
8143     if (!HvARRAY(stash))
8144         return;
8145
8146     Zero(todo, 256, char);
8147     while (*s) {
8148         I32 max;
8149         I32 i = (unsigned char)*s;
8150         if (s[1] == '-') {
8151             s += 2;
8152         }
8153         max = (unsigned char)*s++;
8154         for ( ; i <= max; i++) {
8155             todo[i] = 1;
8156         }
8157         for (i = 0; i <= (I32) HvMAX(stash); i++) {
8158             HE *entry;
8159             for (entry = HvARRAY(stash)[i];
8160                  entry;
8161                  entry = HeNEXT(entry))
8162             {
8163                 register GV *gv;
8164                 register SV *sv;
8165
8166                 if (!todo[(U8)*HeKEY(entry)])
8167                     continue;
8168                 gv = MUTABLE_GV(HeVAL(entry));
8169                 sv = GvSV(gv);
8170                 if (sv) {
8171                     if (SvTHINKFIRST(sv)) {
8172                         if (!SvREADONLY(sv) && SvROK(sv))
8173                             sv_unref(sv);
8174                         /* XXX Is this continue a bug? Why should THINKFIRST
8175                            exempt us from resetting arrays and hashes?  */
8176                         continue;
8177                     }
8178                     SvOK_off(sv);
8179                     if (SvTYPE(sv) >= SVt_PV) {
8180                         SvCUR_set(sv, 0);
8181                         if (SvPVX_const(sv) != NULL)
8182                             *SvPVX(sv) = '\0';
8183                         SvTAINT(sv);
8184                     }
8185                 }
8186                 if (GvAV(gv)) {
8187                     av_clear(GvAV(gv));
8188                 }
8189                 if (GvHV(gv) && !HvNAME_get(GvHV(gv))) {
8190 #if defined(VMS)
8191                     Perl_die(aTHX_ "Can't reset %%ENV on this system");
8192 #else /* ! VMS */
8193                     hv_clear(GvHV(gv));
8194 #  if defined(USE_ENVIRON_ARRAY)
8195                     if (gv == PL_envgv)
8196                         my_clearenv();
8197 #  endif /* USE_ENVIRON_ARRAY */
8198 #endif /* VMS */
8199                 }
8200             }
8201         }
8202     }
8203 }
8204
8205 /*
8206 =for apidoc sv_2io
8207
8208 Using various gambits, try to get an IO from an SV: the IO slot if its a
8209 GV; or the recursive result if we're an RV; or the IO slot of the symbol
8210 named after the PV if we're a string.
8211
8212 =cut
8213 */
8214
8215 IO*
8216 Perl_sv_2io(pTHX_ SV *const sv)
8217 {
8218     IO* io;
8219     GV* gv;
8220
8221     PERL_ARGS_ASSERT_SV_2IO;
8222
8223     switch (SvTYPE(sv)) {
8224     case SVt_PVIO:
8225         io = MUTABLE_IO(sv);
8226         break;
8227     case SVt_PVGV:
8228         if (isGV_with_GP(sv)) {
8229             gv = MUTABLE_GV(sv);
8230             io = GvIO(gv);
8231             if (!io)
8232                 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
8233             break;
8234         }
8235         /* FALL THROUGH */
8236     default:
8237         if (!SvOK(sv))
8238             Perl_croak(aTHX_ PL_no_usym, "filehandle");
8239         if (SvROK(sv))
8240             return sv_2io(SvRV(sv));
8241         gv = gv_fetchsv(sv, 0, SVt_PVIO);
8242         if (gv)
8243             io = GvIO(gv);
8244         else
8245             io = 0;
8246         if (!io)
8247             Perl_croak(aTHX_ "Bad filehandle: %"SVf, SVfARG(sv));
8248         break;
8249     }
8250     return io;
8251 }
8252
8253 /*
8254 =for apidoc sv_2cv
8255
8256 Using various gambits, try to get a CV from an SV; in addition, try if
8257 possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
8258 The flags in C<lref> are passed to gv_fetchsv.
8259
8260 =cut
8261 */
8262
8263 CV *
8264 Perl_sv_2cv(pTHX_ SV *sv, HV **const st, GV **const gvp, const I32 lref)
8265 {
8266     dVAR;
8267     GV *gv = NULL;
8268     CV *cv = NULL;
8269
8270     PERL_ARGS_ASSERT_SV_2CV;
8271
8272     if (!sv) {
8273         *st = NULL;
8274         *gvp = NULL;
8275         return NULL;
8276     }
8277     switch (SvTYPE(sv)) {
8278     case SVt_PVCV:
8279         *st = CvSTASH(sv);
8280         *gvp = NULL;
8281         return MUTABLE_CV(sv);
8282     case SVt_PVHV:
8283     case SVt_PVAV:
8284         *st = NULL;
8285         *gvp = NULL;
8286         return NULL;
8287     case SVt_PVGV:
8288         if (isGV_with_GP(sv)) {
8289             gv = MUTABLE_GV(sv);
8290             *gvp = gv;
8291             *st = GvESTASH(gv);
8292             goto fix_gv;
8293         }
8294         /* FALL THROUGH */
8295
8296     default:
8297         if (SvROK(sv)) {
8298             SV * const *sp = &sv;       /* Used in tryAMAGICunDEREF macro. */
8299             SvGETMAGIC(sv);
8300             tryAMAGICunDEREF(to_cv);
8301
8302             sv = SvRV(sv);
8303             if (SvTYPE(sv) == SVt_PVCV) {
8304                 cv = MUTABLE_CV(sv);
8305                 *gvp = NULL;
8306                 *st = CvSTASH(cv);
8307                 return cv;
8308             }
8309             else if(isGV_with_GP(sv))
8310                 gv = MUTABLE_GV(sv);
8311             else
8312                 Perl_croak(aTHX_ "Not a subroutine reference");
8313         }
8314         else if (isGV_with_GP(sv)) {
8315             SvGETMAGIC(sv);
8316             gv = MUTABLE_GV(sv);
8317         }
8318         else
8319             gv = gv_fetchsv(sv, lref, SVt_PVCV); /* Calls get magic */
8320         *gvp = gv;
8321         if (!gv) {
8322             *st = NULL;
8323             return NULL;
8324         }
8325         /* Some flags to gv_fetchsv mean don't really create the GV  */
8326         if (!isGV_with_GP(gv)) {
8327             *st = NULL;
8328             return NULL;
8329         }
8330         *st = GvESTASH(gv);
8331     fix_gv:
8332         if (lref && !GvCVu(gv)) {
8333             SV *tmpsv;
8334             ENTER;
8335             tmpsv = newSV(0);
8336             gv_efullname3(tmpsv, gv, NULL);
8337             /* XXX this is probably not what they think they're getting.
8338              * It has the same effect as "sub name;", i.e. just a forward
8339              * declaration! */
8340             newSUB(start_subparse(FALSE, 0),
8341                    newSVOP(OP_CONST, 0, tmpsv),
8342                    NULL, NULL);
8343             LEAVE;
8344             if (!GvCVu(gv))
8345                 Perl_croak(aTHX_ "Unable to create sub named \"%"SVf"\"",
8346                            SVfARG(SvOK(sv) ? sv : &PL_sv_no));
8347         }
8348         return GvCVu(gv);
8349     }
8350 }
8351
8352 /*
8353 =for apidoc sv_true
8354
8355 Returns true if the SV has a true value by Perl's rules.
8356 Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
8357 instead use an in-line version.
8358
8359 =cut
8360 */
8361
8362 I32
8363 Perl_sv_true(pTHX_ register SV *const sv)
8364 {
8365     if (!sv)
8366         return 0;
8367     if (SvPOK(sv)) {
8368         register const XPV* const tXpv = (XPV*)SvANY(sv);
8369         if (tXpv &&
8370                 (tXpv->xpv_cur > 1 ||
8371                 (tXpv->xpv_cur && *sv->sv_u.svu_pv != '0')))
8372             return 1;
8373         else
8374             return 0;
8375     }
8376     else {
8377         if (SvIOK(sv))
8378             return SvIVX(sv) != 0;
8379         else {
8380             if (SvNOK(sv))
8381                 return SvNVX(sv) != 0.0;
8382             else
8383                 return sv_2bool(sv);
8384         }
8385     }
8386 }
8387
8388 /*
8389 =for apidoc sv_pvn_force
8390
8391 Get a sensible string out of the SV somehow.
8392 A private implementation of the C<SvPV_force> macro for compilers which
8393 can't cope with complex macro expressions. Always use the macro instead.
8394
8395 =for apidoc sv_pvn_force_flags
8396
8397 Get a sensible string out of the SV somehow.
8398 If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
8399 appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
8400 implemented in terms of this function.
8401 You normally want to use the various wrapper macros instead: see
8402 C<SvPV_force> and C<SvPV_force_nomg>
8403
8404 =cut
8405 */
8406
8407 char *
8408 Perl_sv_pvn_force_flags(pTHX_ SV *const sv, STRLEN *const lp, const I32 flags)
8409 {
8410     dVAR;
8411
8412     PERL_ARGS_ASSERT_SV_PVN_FORCE_FLAGS;
8413
8414     if (SvTHINKFIRST(sv) && !SvROK(sv))
8415         sv_force_normal_flags(sv, 0);
8416
8417     if (SvPOK(sv)) {
8418         if (lp)
8419             *lp = SvCUR(sv);
8420     }
8421     else {
8422         char *s;
8423         STRLEN len;
8424  
8425         if (SvREADONLY(sv) && !(flags & SV_MUTABLE_RETURN)) {
8426             const char * const ref = sv_reftype(sv,0);
8427             if (PL_op)
8428                 Perl_croak(aTHX_ "Can't coerce readonly %s to string in %s",
8429                            ref, OP_DESC(PL_op));
8430             else
8431                 Perl_croak(aTHX_ "Can't coerce readonly %s to string", ref);
8432         }
8433         if ((SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM)
8434             || isGV_with_GP(sv))
8435             Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
8436                 OP_DESC(PL_op));
8437         s = sv_2pv_flags(sv, &len, flags);
8438         if (lp)
8439             *lp = len;
8440
8441         if (s != SvPVX_const(sv)) {     /* Almost, but not quite, sv_setpvn() */
8442             if (SvROK(sv))
8443                 sv_unref(sv);
8444             SvUPGRADE(sv, SVt_PV);              /* Never FALSE */
8445             SvGROW(sv, len + 1);
8446             Move(s,SvPVX(sv),len,char);
8447             SvCUR_set(sv, len);
8448             SvPVX(sv)[len] = '\0';
8449         }
8450         if (!SvPOK(sv)) {
8451             SvPOK_on(sv);               /* validate pointer */
8452             SvTAINT(sv);
8453             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
8454                                   PTR2UV(sv),SvPVX_const(sv)));
8455         }
8456     }
8457     return SvPVX_mutable(sv);
8458 }
8459
8460 /*
8461 =for apidoc sv_pvbyten_force
8462
8463 The backend for the C<SvPVbytex_force> macro. Always use the macro instead.
8464
8465 =cut
8466 */
8467
8468 char *
8469 Perl_sv_pvbyten_force(pTHX_ SV *const sv, STRLEN *const lp)
8470 {
8471     PERL_ARGS_ASSERT_SV_PVBYTEN_FORCE;
8472
8473     sv_pvn_force(sv,lp);
8474     sv_utf8_downgrade(sv,0);
8475     *lp = SvCUR(sv);
8476     return SvPVX(sv);
8477 }
8478
8479 /*
8480 =for apidoc sv_pvutf8n_force
8481
8482 The backend for the C<SvPVutf8x_force> macro. Always use the macro instead.
8483
8484 =cut
8485 */
8486
8487 char *
8488 Perl_sv_pvutf8n_force(pTHX_ SV *const sv, STRLEN *const lp)
8489 {
8490     PERL_ARGS_ASSERT_SV_PVUTF8N_FORCE;
8491
8492     sv_pvn_force(sv,lp);
8493     sv_utf8_upgrade(sv);
8494     *lp = SvCUR(sv);
8495     return SvPVX(sv);
8496 }
8497
8498 /*
8499 =for apidoc sv_reftype
8500
8501 Returns a string describing what the SV is a reference to.
8502
8503 =cut
8504 */
8505
8506 const char *
8507 Perl_sv_reftype(pTHX_ const SV *const sv, const int ob)
8508 {
8509     PERL_ARGS_ASSERT_SV_REFTYPE;
8510
8511     /* The fact that I don't need to downcast to char * everywhere, only in ?:
8512        inside return suggests a const propagation bug in g++.  */
8513     if (ob && SvOBJECT(sv)) {
8514         char * const name = HvNAME_get(SvSTASH(sv));
8515         return name ? name : (char *) "__ANON__";
8516     }
8517     else {
8518         switch (SvTYPE(sv)) {
8519         case SVt_NULL:
8520         case SVt_IV:
8521         case SVt_NV:
8522         case SVt_PV:
8523         case SVt_PVIV:
8524         case SVt_PVNV:
8525         case SVt_PVMG:
8526                                 if (SvVOK(sv))
8527                                     return "VSTRING";
8528                                 if (SvROK(sv))
8529                                     return "REF";
8530                                 else
8531                                     return "SCALAR";
8532
8533         case SVt_PVLV:          return (char *)  (SvROK(sv) ? "REF"
8534                                 /* tied lvalues should appear to be
8535                                  * scalars for backwards compatitbility */
8536                                 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
8537                                     ? "SCALAR" : "LVALUE");
8538         case SVt_PVAV:          return "ARRAY";
8539         case SVt_PVHV:          return "HASH";
8540         case SVt_PVCV:          return "CODE";
8541         case SVt_PVGV:          return (char *) (isGV_with_GP(sv)
8542                                     ? "GLOB" : "SCALAR");
8543         case SVt_PVFM:          return "FORMAT";
8544         case SVt_PVIO:          return "IO";
8545         case SVt_BIND:          return "BIND";
8546         case SVt_REGEXP:        return "REGEXP"; 
8547         default:                return "UNKNOWN";
8548         }
8549     }
8550 }
8551
8552 /*
8553 =for apidoc sv_isobject
8554
8555 Returns a boolean indicating whether the SV is an RV pointing to a blessed
8556 object.  If the SV is not an RV, or if the object is not blessed, then this
8557 will return false.
8558
8559 =cut
8560 */
8561
8562 int
8563 Perl_sv_isobject(pTHX_ SV *sv)
8564 {
8565     if (!sv)
8566         return 0;
8567     SvGETMAGIC(sv);
8568     if (!SvROK(sv))
8569         return 0;
8570     sv = SvRV(sv);
8571     if (!SvOBJECT(sv))
8572         return 0;
8573     return 1;
8574 }
8575
8576 /*
8577 =for apidoc sv_isa
8578
8579 Returns a boolean indicating whether the SV is blessed into the specified
8580 class.  This does not check for subtypes; use C<sv_derived_from> to verify
8581 an inheritance relationship.
8582
8583 =cut
8584 */
8585
8586 int
8587 Perl_sv_isa(pTHX_ SV *sv, const char *const name)
8588 {
8589     const char *hvname;
8590
8591     PERL_ARGS_ASSERT_SV_ISA;
8592
8593     if (!sv)
8594         return 0;
8595     SvGETMAGIC(sv);
8596     if (!SvROK(sv))
8597         return 0;
8598     sv = SvRV(sv);
8599     if (!SvOBJECT(sv))
8600         return 0;
8601     hvname = HvNAME_get(SvSTASH(sv));
8602     if (!hvname)
8603         return 0;
8604
8605     return strEQ(hvname, name);
8606 }
8607
8608 /*
8609 =for apidoc newSVrv
8610
8611 Creates a new SV for the RV, C<rv>, to point to.  If C<rv> is not an RV then
8612 it will be upgraded to one.  If C<classname> is non-null then the new SV will
8613 be blessed in the specified package.  The new SV is returned and its
8614 reference count is 1.
8615
8616 =cut
8617 */
8618
8619 SV*
8620 Perl_newSVrv(pTHX_ SV *const rv, const char *const classname)
8621 {
8622     dVAR;
8623     SV *sv;
8624
8625     PERL_ARGS_ASSERT_NEWSVRV;
8626
8627     new_SV(sv);
8628
8629     SV_CHECK_THINKFIRST_COW_DROP(rv);
8630     (void)SvAMAGIC_off(rv);
8631
8632     if (SvTYPE(rv) >= SVt_PVMG) {
8633         const U32 refcnt = SvREFCNT(rv);
8634         SvREFCNT(rv) = 0;
8635         sv_clear(rv);
8636         SvFLAGS(rv) = 0;
8637         SvREFCNT(rv) = refcnt;
8638
8639         sv_upgrade(rv, SVt_IV);
8640     } else if (SvROK(rv)) {
8641         SvREFCNT_dec(SvRV(rv));
8642     } else {
8643         prepare_SV_for_RV(rv);
8644     }
8645
8646     SvOK_off(rv);
8647     SvRV_set(rv, sv);
8648     SvROK_on(rv);
8649
8650     if (classname) {
8651         HV* const stash = gv_stashpv(classname, GV_ADD);
8652         (void)sv_bless(rv, stash);
8653     }
8654     return sv;
8655 }
8656
8657 /*
8658 =for apidoc sv_setref_pv
8659
8660 Copies a pointer into a new SV, optionally blessing the SV.  The C<rv>
8661 argument will be upgraded to an RV.  That RV will be modified to point to
8662 the new SV.  If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
8663 into the SV.  The C<classname> argument indicates the package for the
8664 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
8665 will have a reference count of 1, and the RV will be returned.
8666
8667 Do not use with other Perl types such as HV, AV, SV, CV, because those
8668 objects will become corrupted by the pointer copy process.
8669
8670 Note that C<sv_setref_pvn> copies the string while this copies the pointer.
8671
8672 =cut
8673 */
8674
8675 SV*
8676 Perl_sv_setref_pv(pTHX_ SV *const rv, const char *const classname, void *const pv)
8677 {
8678     dVAR;
8679
8680     PERL_ARGS_ASSERT_SV_SETREF_PV;
8681
8682     if (!pv) {
8683         sv_setsv(rv, &PL_sv_undef);
8684         SvSETMAGIC(rv);
8685     }
8686     else
8687         sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
8688     return rv;
8689 }
8690
8691 /*
8692 =for apidoc sv_setref_iv
8693
8694 Copies an integer into a new SV, optionally blessing the SV.  The C<rv>
8695 argument will be upgraded to an RV.  That RV will be modified to point to
8696 the new SV.  The C<classname> argument indicates the package for the
8697 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
8698 will have a reference count of 1, and the RV will be returned.
8699
8700 =cut
8701 */
8702
8703 SV*
8704 Perl_sv_setref_iv(pTHX_ SV *const rv, const char *const classname, const IV iv)
8705 {
8706     PERL_ARGS_ASSERT_SV_SETREF_IV;
8707
8708     sv_setiv(newSVrv(rv,classname), iv);
8709     return rv;
8710 }
8711
8712 /*
8713 =for apidoc sv_setref_uv
8714
8715 Copies an unsigned integer into a new SV, optionally blessing the SV.  The C<rv>
8716 argument will be upgraded to an RV.  That RV will be modified to point to
8717 the new SV.  The C<classname> argument indicates the package for the
8718 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
8719 will have a reference count of 1, and the RV will be returned.
8720
8721 =cut
8722 */
8723
8724 SV*
8725 Perl_sv_setref_uv(pTHX_ SV *const rv, const char *const classname, const UV uv)
8726 {
8727     PERL_ARGS_ASSERT_SV_SETREF_UV;
8728
8729     sv_setuv(newSVrv(rv,classname), uv);
8730     return rv;
8731 }
8732
8733 /*
8734 =for apidoc sv_setref_nv
8735
8736 Copies a double into a new SV, optionally blessing the SV.  The C<rv>
8737 argument will be upgraded to an RV.  That RV will be modified to point to
8738 the new SV.  The C<classname> argument indicates the package for the
8739 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
8740 will have a reference count of 1, and the RV will be returned.
8741
8742 =cut
8743 */
8744
8745 SV*
8746 Perl_sv_setref_nv(pTHX_ SV *const rv, const char *const classname, const NV nv)
8747 {
8748     PERL_ARGS_ASSERT_SV_SETREF_NV;
8749
8750     sv_setnv(newSVrv(rv,classname), nv);
8751     return rv;
8752 }
8753
8754 /*
8755 =for apidoc sv_setref_pvn
8756
8757 Copies a string into a new SV, optionally blessing the SV.  The length of the
8758 string must be specified with C<n>.  The C<rv> argument will be upgraded to
8759 an RV.  That RV will be modified to point to the new SV.  The C<classname>
8760 argument indicates the package for the blessing.  Set C<classname> to
8761 C<NULL> to avoid the blessing.  The new SV will have a reference count
8762 of 1, and the RV will be returned.
8763
8764 Note that C<sv_setref_pv> copies the pointer while this copies the string.
8765
8766 =cut
8767 */
8768
8769 SV*
8770 Perl_sv_setref_pvn(pTHX_ SV *const rv, const char *const classname,
8771                    const char *const pv, const STRLEN n)
8772 {
8773     PERL_ARGS_ASSERT_SV_SETREF_PVN;
8774
8775     sv_setpvn(newSVrv(rv,classname), pv, n);
8776     return rv;
8777 }
8778
8779 /*
8780 =for apidoc sv_bless
8781
8782 Blesses an SV into a specified package.  The SV must be an RV.  The package
8783 must be designated by its stash (see C<gv_stashpv()>).  The reference count
8784 of the SV is unaffected.
8785
8786 =cut
8787 */
8788
8789 SV*
8790 Perl_sv_bless(pTHX_ SV *const sv, HV *const stash)
8791 {
8792     dVAR;
8793     SV *tmpRef;
8794
8795     PERL_ARGS_ASSERT_SV_BLESS;
8796
8797     if (!SvROK(sv))
8798         Perl_croak(aTHX_ "Can't bless non-reference value");
8799     tmpRef = SvRV(sv);
8800     if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
8801         if (SvIsCOW(tmpRef))
8802             sv_force_normal_flags(tmpRef, 0);
8803         if (SvREADONLY(tmpRef))
8804             Perl_croak(aTHX_ "%s", PL_no_modify);
8805         if (SvOBJECT(tmpRef)) {
8806             if (SvTYPE(tmpRef) != SVt_PVIO)
8807                 --PL_sv_objcount;
8808             SvREFCNT_dec(SvSTASH(tmpRef));
8809         }
8810     }
8811     SvOBJECT_on(tmpRef);
8812     if (SvTYPE(tmpRef) != SVt_PVIO)
8813         ++PL_sv_objcount;
8814     SvUPGRADE(tmpRef, SVt_PVMG);
8815     SvSTASH_set(tmpRef, MUTABLE_HV(SvREFCNT_inc_simple(stash)));
8816
8817     if (Gv_AMG(stash))
8818         SvAMAGIC_on(sv);
8819     else
8820         (void)SvAMAGIC_off(sv);
8821
8822     if(SvSMAGICAL(tmpRef))
8823         if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
8824             mg_set(tmpRef);
8825
8826
8827
8828     return sv;
8829 }
8830
8831 /* Downgrades a PVGV to a PVMG.
8832  */
8833
8834 STATIC void
8835 S_sv_unglob(pTHX_ SV *const sv)
8836 {
8837     dVAR;
8838     void *xpvmg;
8839     HV *stash;
8840     SV * const temp = sv_newmortal();
8841
8842     PERL_ARGS_ASSERT_SV_UNGLOB;
8843
8844     assert(SvTYPE(sv) == SVt_PVGV);
8845     SvFAKE_off(sv);
8846     gv_efullname3(temp, MUTABLE_GV(sv), "*");
8847
8848     if (GvGP(sv)) {
8849         if(GvCVu((const GV *)sv) && (stash = GvSTASH(MUTABLE_GV(sv)))
8850            && HvNAME_get(stash))
8851             mro_method_changed_in(stash);
8852         gp_free(MUTABLE_GV(sv));
8853     }
8854     if (GvSTASH(sv)) {
8855         sv_del_backref(MUTABLE_SV(GvSTASH(sv)), sv);
8856         GvSTASH(sv) = NULL;
8857     }
8858     GvMULTI_off(sv);
8859     if (GvNAME_HEK(sv)) {
8860         unshare_hek(GvNAME_HEK(sv));
8861     }
8862     isGV_with_GP_off(sv);
8863
8864     /* need to keep SvANY(sv) in the right arena */
8865     xpvmg = new_XPVMG();
8866     StructCopy(SvANY(sv), xpvmg, XPVMG);
8867     del_XPVGV(SvANY(sv));
8868     SvANY(sv) = xpvmg;
8869
8870     SvFLAGS(sv) &= ~SVTYPEMASK;
8871     SvFLAGS(sv) |= SVt_PVMG;
8872
8873     /* Intentionally not calling any local SET magic, as this isn't so much a
8874        set operation as merely an internal storage change.  */
8875     sv_setsv_flags(sv, temp, 0);
8876 }
8877
8878 /*
8879 =for apidoc sv_unref_flags
8880
8881 Unsets the RV status of the SV, and decrements the reference count of
8882 whatever was being referenced by the RV.  This can almost be thought of
8883 as a reversal of C<newSVrv>.  The C<cflags> argument can contain
8884 C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
8885 (otherwise the decrementing is conditional on the reference count being
8886 different from one or the reference being a readonly SV).
8887 See C<SvROK_off>.
8888
8889 =cut
8890 */
8891
8892 void
8893 Perl_sv_unref_flags(pTHX_ SV *const ref, const U32 flags)
8894 {
8895     SV* const target = SvRV(ref);
8896
8897     PERL_ARGS_ASSERT_SV_UNREF_FLAGS;
8898
8899     if (SvWEAKREF(ref)) {
8900         sv_del_backref(target, ref);
8901         SvWEAKREF_off(ref);
8902         SvRV_set(ref, NULL);
8903         return;
8904     }
8905     SvRV_set(ref, NULL);
8906     SvROK_off(ref);
8907     /* You can't have a || SvREADONLY(target) here, as $a = $$a, where $a was
8908        assigned to as BEGIN {$a = \"Foo"} will fail.  */
8909     if (SvREFCNT(target) != 1 || (flags & SV_IMMEDIATE_UNREF))
8910         SvREFCNT_dec(target);
8911     else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
8912         sv_2mortal(target);     /* Schedule for freeing later */
8913 }
8914
8915 /*
8916 =for apidoc sv_untaint
8917
8918 Untaint an SV. Use C<SvTAINTED_off> instead.
8919 =cut
8920 */
8921
8922 void
8923 Perl_sv_untaint(pTHX_ SV *const sv)
8924 {
8925     PERL_ARGS_ASSERT_SV_UNTAINT;
8926
8927     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
8928         MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
8929         if (mg)
8930             mg->mg_len &= ~1;
8931     }
8932 }
8933
8934 /*
8935 =for apidoc sv_tainted
8936
8937 Test an SV for taintedness. Use C<SvTAINTED> instead.
8938 =cut
8939 */
8940
8941 bool
8942 Perl_sv_tainted(pTHX_ SV *const sv)
8943 {
8944     PERL_ARGS_ASSERT_SV_TAINTED;
8945
8946     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
8947         const MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
8948         if (mg && (mg->mg_len & 1) )
8949             return TRUE;
8950     }
8951     return FALSE;
8952 }
8953
8954 /*
8955 =for apidoc sv_setpviv
8956
8957 Copies an integer into the given SV, also updating its string value.
8958 Does not handle 'set' magic.  See C<sv_setpviv_mg>.
8959
8960 =cut
8961 */
8962
8963 void
8964 Perl_sv_setpviv(pTHX_ SV *const sv, const IV iv)
8965 {
8966     char buf[TYPE_CHARS(UV)];
8967     char *ebuf;
8968     char * const ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
8969
8970     PERL_ARGS_ASSERT_SV_SETPVIV;
8971
8972     sv_setpvn(sv, ptr, ebuf - ptr);
8973 }
8974
8975 /*
8976 =for apidoc sv_setpviv_mg
8977
8978 Like C<sv_setpviv>, but also handles 'set' magic.
8979
8980 =cut
8981 */
8982
8983 void
8984 Perl_sv_setpviv_mg(pTHX_ SV *const sv, const IV iv)
8985 {
8986     PERL_ARGS_ASSERT_SV_SETPVIV_MG;
8987
8988     sv_setpviv(sv, iv);
8989     SvSETMAGIC(sv);
8990 }
8991
8992 #if defined(PERL_IMPLICIT_CONTEXT)
8993
8994 /* pTHX_ magic can't cope with varargs, so this is a no-context
8995  * version of the main function, (which may itself be aliased to us).
8996  * Don't access this version directly.
8997  */
8998
8999 void
9000 Perl_sv_setpvf_nocontext(SV *const sv, const char *const pat, ...)
9001 {
9002     dTHX;
9003     va_list args;
9004
9005     PERL_ARGS_ASSERT_SV_SETPVF_NOCONTEXT;
9006
9007     va_start(args, pat);
9008     sv_vsetpvf(sv, pat, &args);
9009     va_end(args);
9010 }
9011
9012 /* pTHX_ magic can't cope with varargs, so this is a no-context
9013  * version of the main function, (which may itself be aliased to us).
9014  * Don't access this version directly.
9015  */
9016
9017 void
9018 Perl_sv_setpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
9019 {
9020     dTHX;
9021     va_list args;
9022
9023     PERL_ARGS_ASSERT_SV_SETPVF_MG_NOCONTEXT;
9024
9025     va_start(args, pat);
9026     sv_vsetpvf_mg(sv, pat, &args);
9027     va_end(args);
9028 }
9029 #endif
9030
9031 /*
9032 =for apidoc sv_setpvf
9033
9034 Works like C<sv_catpvf> but copies the text into the SV instead of
9035 appending it.  Does not handle 'set' magic.  See C<sv_setpvf_mg>.
9036
9037 =cut
9038 */
9039
9040 void
9041 Perl_sv_setpvf(pTHX_ SV *const sv, const char *const pat, ...)
9042 {
9043     va_list args;
9044
9045     PERL_ARGS_ASSERT_SV_SETPVF;
9046
9047     va_start(args, pat);
9048     sv_vsetpvf(sv, pat, &args);
9049     va_end(args);
9050 }
9051
9052 /*
9053 =for apidoc sv_vsetpvf
9054
9055 Works like C<sv_vcatpvf> but copies the text into the SV instead of
9056 appending it.  Does not handle 'set' magic.  See C<sv_vsetpvf_mg>.
9057
9058 Usually used via its frontend C<sv_setpvf>.
9059
9060 =cut
9061 */
9062
9063 void
9064 Perl_sv_vsetpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args)
9065 {
9066     PERL_ARGS_ASSERT_SV_VSETPVF;
9067
9068     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
9069 }
9070
9071 /*
9072 =for apidoc sv_setpvf_mg
9073
9074 Like C<sv_setpvf>, but also handles 'set' magic.
9075
9076 =cut
9077 */
9078
9079 void
9080 Perl_sv_setpvf_mg(pTHX_ SV *const sv, const char *const pat, ...)
9081 {
9082     va_list args;
9083
9084     PERL_ARGS_ASSERT_SV_SETPVF_MG;
9085
9086     va_start(args, pat);
9087     sv_vsetpvf_mg(sv, pat, &args);
9088     va_end(args);
9089 }
9090
9091 /*
9092 =for apidoc sv_vsetpvf_mg
9093
9094 Like C<sv_vsetpvf>, but also handles 'set' magic.
9095
9096 Usually used via its frontend C<sv_setpvf_mg>.
9097
9098 =cut
9099 */
9100
9101 void
9102 Perl_sv_vsetpvf_mg(pTHX_ SV *const sv, const char *const pat, va_list *const args)
9103 {
9104     PERL_ARGS_ASSERT_SV_VSETPVF_MG;
9105
9106     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
9107     SvSETMAGIC(sv);
9108 }
9109
9110 #if defined(PERL_IMPLICIT_CONTEXT)
9111
9112 /* pTHX_ magic can't cope with varargs, so this is a no-context
9113  * version of the main function, (which may itself be aliased to us).
9114  * Don't access this version directly.
9115  */
9116
9117 void
9118 Perl_sv_catpvf_nocontext(SV *const sv, const char *const pat, ...)
9119 {
9120     dTHX;
9121     va_list args;
9122
9123     PERL_ARGS_ASSERT_SV_CATPVF_NOCONTEXT;
9124
9125     va_start(args, pat);
9126     sv_vcatpvf(sv, pat, &args);
9127     va_end(args);
9128 }
9129
9130 /* pTHX_ magic can't cope with varargs, so this is a no-context
9131  * version of the main function, (which may itself be aliased to us).
9132  * Don't access this version directly.
9133  */
9134
9135 void
9136 Perl_sv_catpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
9137 {
9138     dTHX;
9139     va_list args;
9140
9141     PERL_ARGS_ASSERT_SV_CATPVF_MG_NOCONTEXT;
9142
9143     va_start(args, pat);
9144     sv_vcatpvf_mg(sv, pat, &args);
9145     va_end(args);
9146 }
9147 #endif
9148
9149 /*
9150 =for apidoc sv_catpvf
9151
9152 Processes its arguments like C<sprintf> and appends the formatted
9153 output to an SV.  If the appended data contains "wide" characters
9154 (including, but not limited to, SVs with a UTF-8 PV formatted with %s,
9155 and characters >255 formatted with %c), the original SV might get
9156 upgraded to UTF-8.  Handles 'get' magic, but not 'set' magic.  See
9157 C<sv_catpvf_mg>. If the original SV was UTF-8, the pattern should be
9158 valid UTF-8; if the original SV was bytes, the pattern should be too.
9159
9160 =cut */
9161
9162 void
9163 Perl_sv_catpvf(pTHX_ SV *const sv, const char *const pat, ...)
9164 {
9165     va_list args;
9166
9167     PERL_ARGS_ASSERT_SV_CATPVF;
9168
9169     va_start(args, pat);
9170     sv_vcatpvf(sv, pat, &args);
9171     va_end(args);
9172 }
9173
9174 /*
9175 =for apidoc sv_vcatpvf
9176
9177 Processes its arguments like C<vsprintf> and appends the formatted output
9178 to an SV.  Does not handle 'set' magic.  See C<sv_vcatpvf_mg>.
9179
9180 Usually used via its frontend C<sv_catpvf>.
9181
9182 =cut
9183 */
9184
9185 void
9186 Perl_sv_vcatpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args)
9187 {
9188     PERL_ARGS_ASSERT_SV_VCATPVF;
9189
9190     sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
9191 }
9192
9193 /*
9194 =for apidoc sv_catpvf_mg
9195
9196 Like C<sv_catpvf>, but also handles 'set' magic.
9197
9198 =cut
9199 */
9200
9201 void
9202 Perl_sv_catpvf_mg(pTHX_ SV *const sv, const char *const pat, ...)
9203 {
9204     va_list args;
9205
9206     PERL_ARGS_ASSERT_SV_CATPVF_MG;
9207
9208     va_start(args, pat);
9209     sv_vcatpvf_mg(sv, pat, &args);
9210     va_end(args);
9211 }
9212
9213 /*
9214 =for apidoc sv_vcatpvf_mg
9215
9216 Like C<sv_vcatpvf>, but also handles 'set' magic.
9217
9218 Usually used via its frontend C<sv_catpvf_mg>.
9219
9220 =cut
9221 */
9222
9223 void
9224 Perl_sv_vcatpvf_mg(pTHX_ SV *const sv, const char *const pat, va_list *const args)
9225 {
9226     PERL_ARGS_ASSERT_SV_VCATPVF_MG;
9227
9228     sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
9229     SvSETMAGIC(sv);
9230 }
9231
9232 /*
9233 =for apidoc sv_vsetpvfn
9234
9235 Works like C<sv_vcatpvfn> but copies the text into the SV instead of
9236 appending it.
9237
9238 Usually used via one of its frontends C<sv_vsetpvf> and C<sv_vsetpvf_mg>.
9239
9240 =cut
9241 */
9242
9243 void
9244 Perl_sv_vsetpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
9245                  va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted)
9246 {
9247     PERL_ARGS_ASSERT_SV_VSETPVFN;
9248
9249     sv_setpvs(sv, "");
9250     sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
9251 }
9252
9253
9254 /*
9255  * Warn of missing argument to sprintf, and then return a defined value
9256  * to avoid inappropriate "use of uninit" warnings [perl #71000].
9257  */
9258 #define WARN_MISSING WARN_UNINITIALIZED /* Not sure we want a new category */
9259 STATIC SV*
9260 S_vcatpvfn_missing_argument(pTHX) {
9261     if (ckWARN(WARN_MISSING)) {
9262         Perl_warner(aTHX_ packWARN(WARN_MISSING), "Missing argument in %s",
9263                 PL_op ? OP_DESC(PL_op) : "sv_vcatpvfn()");
9264     }
9265     return &PL_sv_no;
9266 }
9267
9268
9269 STATIC I32
9270 S_expect_number(pTHX_ char **const pattern)
9271 {
9272     dVAR;
9273     I32 var = 0;
9274
9275     PERL_ARGS_ASSERT_EXPECT_NUMBER;
9276
9277     switch (**pattern) {
9278     case '1': case '2': case '3':
9279     case '4': case '5': case '6':
9280     case '7': case '8': case '9':
9281         var = *(*pattern)++ - '0';
9282         while (isDIGIT(**pattern)) {
9283             const I32 tmp = var * 10 + (*(*pattern)++ - '0');
9284             if (tmp < var)
9285                 Perl_croak(aTHX_ "Integer overflow in format string for %s", (PL_op ? OP_DESC(PL_op) : "sv_vcatpvfn"));
9286             var = tmp;
9287         }
9288     }
9289     return var;
9290 }
9291
9292 STATIC char *
9293 S_F0convert(NV nv, char *const endbuf, STRLEN *const len)
9294 {
9295     const int neg = nv < 0;
9296     UV uv;
9297
9298     PERL_ARGS_ASSERT_F0CONVERT;
9299
9300     if (neg)
9301         nv = -nv;
9302     if (nv < UV_MAX) {
9303         char *p = endbuf;
9304         nv += 0.5;
9305         uv = (UV)nv;
9306         if (uv & 1 && uv == nv)
9307             uv--;                       /* Round to even */
9308         do {
9309             const unsigned dig = uv % 10;
9310             *--p = '0' + dig;
9311         } while (uv /= 10);
9312         if (neg)
9313             *--p = '-';
9314         *len = endbuf - p;
9315         return p;
9316     }
9317     return NULL;
9318 }
9319
9320
9321 /*
9322 =for apidoc sv_vcatpvfn
9323
9324 Processes its arguments like C<vsprintf> and appends the formatted output
9325 to an SV.  Uses an array of SVs if the C style variable argument list is
9326 missing (NULL).  When running with taint checks enabled, indicates via
9327 C<maybe_tainted> if results are untrustworthy (often due to the use of
9328 locales).
9329
9330 Usually used via one of its frontends C<sv_vcatpvf> and C<sv_vcatpvf_mg>.
9331
9332 =cut
9333 */
9334
9335
9336 #define VECTORIZE_ARGS  vecsv = va_arg(*args, SV*);\
9337                         vecstr = (U8*)SvPV_const(vecsv,veclen);\
9338                         vec_utf8 = DO_UTF8(vecsv);
9339
9340 /* XXX maybe_tainted is never assigned to, so the doc above is lying. */
9341
9342 void
9343 Perl_sv_vcatpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
9344                  va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted)
9345 {
9346     dVAR;
9347     char *p;
9348     char *q;
9349     const char *patend;
9350     STRLEN origlen;
9351     I32 svix = 0;
9352     static const char nullstr[] = "(null)";
9353     SV *argsv = NULL;
9354     bool has_utf8 = DO_UTF8(sv);    /* has the result utf8? */
9355     const bool pat_utf8 = has_utf8; /* the pattern is in utf8? */
9356     SV *nsv = NULL;
9357     /* Times 4: a decimal digit takes more than 3 binary digits.
9358      * NV_DIG: mantissa takes than many decimal digits.
9359      * Plus 32: Playing safe. */
9360     char ebuf[IV_DIG * 4 + NV_DIG + 32];
9361     /* large enough for "%#.#f" --chip */
9362     /* what about long double NVs? --jhi */
9363
9364     PERL_ARGS_ASSERT_SV_VCATPVFN;
9365     PERL_UNUSED_ARG(maybe_tainted);
9366
9367     /* no matter what, this is a string now */
9368     (void)SvPV_force(sv, origlen);
9369
9370     /* special-case "", "%s", and "%-p" (SVf - see below) */
9371     if (patlen == 0)
9372         return;
9373     if (patlen == 2 && pat[0] == '%' && pat[1] == 's') {
9374         if (args) {
9375             const char * const s = va_arg(*args, char*);
9376             sv_catpv(sv, s ? s : nullstr);
9377         }
9378         else if (svix < svmax) {
9379             sv_catsv(sv, *svargs);
9380         }
9381         else
9382             S_vcatpvfn_missing_argument(aTHX);
9383         return;
9384     }
9385     if (args && patlen == 3 && pat[0] == '%' &&
9386                 pat[1] == '-' && pat[2] == 'p') {
9387         argsv = MUTABLE_SV(va_arg(*args, void*));
9388         sv_catsv(sv, argsv);
9389         return;
9390     }
9391
9392 #ifndef USE_LONG_DOUBLE
9393     /* special-case "%.<number>[gf]" */
9394     if ( !args && patlen <= 5 && pat[0] == '%' && pat[1] == '.'
9395          && (pat[patlen-1] == 'g' || pat[patlen-1] == 'f') ) {
9396         unsigned digits = 0;
9397         const char *pp;
9398
9399         pp = pat + 2;
9400         while (*pp >= '0' && *pp <= '9')
9401             digits = 10 * digits + (*pp++ - '0');
9402         if (pp - pat == (int)patlen - 1) {
9403             NV nv;
9404
9405             if (svix < svmax)
9406                 nv = SvNV(*svargs);
9407             else {
9408                 S_vcatpvfn_missing_argument(aTHX);
9409                 return;
9410             }
9411             if (*pp == 'g') {
9412                 /* Add check for digits != 0 because it seems that some
9413                    gconverts are buggy in this case, and we don't yet have
9414                    a Configure test for this.  */
9415                 if (digits && digits < sizeof(ebuf) - NV_DIG - 10) {
9416                      /* 0, point, slack */
9417                     Gconvert(nv, (int)digits, 0, ebuf);
9418                     sv_catpv(sv, ebuf);
9419                     if (*ebuf)  /* May return an empty string for digits==0 */
9420                         return;
9421                 }
9422             } else if (!digits) {
9423                 STRLEN l;
9424
9425                 if ((p = F0convert(nv, ebuf + sizeof ebuf, &l))) {
9426                     sv_catpvn(sv, p, l);
9427                     return;
9428                 }
9429             }
9430         }
9431     }
9432 #endif /* !USE_LONG_DOUBLE */
9433
9434     if (!args && svix < svmax && DO_UTF8(*svargs))
9435         has_utf8 = TRUE;
9436
9437     patend = (char*)pat + patlen;
9438     for (p = (char*)pat; p < patend; p = q) {
9439         bool alt = FALSE;
9440         bool left = FALSE;
9441         bool vectorize = FALSE;
9442         bool vectorarg = FALSE;
9443         bool vec_utf8 = FALSE;
9444         char fill = ' ';
9445         char plus = 0;
9446         char intsize = 0;
9447         STRLEN width = 0;
9448         STRLEN zeros = 0;
9449         bool has_precis = FALSE;
9450         STRLEN precis = 0;
9451         const I32 osvix = svix;
9452         bool is_utf8 = FALSE;  /* is this item utf8?   */
9453 #ifdef HAS_LDBL_SPRINTF_BUG
9454         /* This is to try to fix a bug with irix/nonstop-ux/powerux and
9455            with sfio - Allen <allens@cpan.org> */
9456         bool fix_ldbl_sprintf_bug = FALSE;
9457 #endif
9458
9459         char esignbuf[4];
9460         U8 utf8buf[UTF8_MAXBYTES+1];
9461         STRLEN esignlen = 0;
9462
9463         const char *eptr = NULL;
9464         const char *fmtstart;
9465         STRLEN elen = 0;
9466         SV *vecsv = NULL;
9467         const U8 *vecstr = NULL;
9468         STRLEN veclen = 0;
9469         char c = 0;
9470         int i;
9471         unsigned base = 0;
9472         IV iv = 0;
9473         UV uv = 0;
9474         /* we need a long double target in case HAS_LONG_DOUBLE but
9475            not USE_LONG_DOUBLE
9476         */
9477 #if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
9478         long double nv;
9479 #else
9480         NV nv;
9481 #endif
9482         STRLEN have;
9483         STRLEN need;
9484         STRLEN gap;
9485         const char *dotstr = ".";
9486         STRLEN dotstrlen = 1;
9487         I32 efix = 0; /* explicit format parameter index */
9488         I32 ewix = 0; /* explicit width index */
9489         I32 epix = 0; /* explicit precision index */
9490         I32 evix = 0; /* explicit vector index */
9491         bool asterisk = FALSE;
9492
9493         /* echo everything up to the next format specification */
9494         for (q = p; q < patend && *q != '%'; ++q) ;
9495         if (q > p) {
9496             if (has_utf8 && !pat_utf8)
9497                 sv_catpvn_utf8_upgrade(sv, p, q - p, nsv);
9498             else
9499                 sv_catpvn(sv, p, q - p);
9500             p = q;
9501         }
9502         if (q++ >= patend)
9503             break;
9504
9505         fmtstart = q;
9506
9507 /*
9508     We allow format specification elements in this order:
9509         \d+\$              explicit format parameter index
9510         [-+ 0#]+           flags
9511         v|\*(\d+\$)?v      vector with optional (optionally specified) arg
9512         0                  flag (as above): repeated to allow "v02"     
9513         \d+|\*(\d+\$)?     width using optional (optionally specified) arg
9514         \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
9515         [hlqLV]            size
9516     [%bcdefginopsuxDFOUX] format (mandatory)
9517 */
9518
9519         if (args) {
9520 /*  
9521         As of perl5.9.3, printf format checking is on by default.
9522         Internally, perl uses %p formats to provide an escape to
9523         some extended formatting.  This block deals with those
9524         extensions: if it does not match, (char*)q is reset and
9525         the normal format processing code is used.
9526
9527         Currently defined extensions are:
9528                 %p              include pointer address (standard)      
9529                 %-p     (SVf)   include an SV (previously %_)
9530                 %-<num>p        include an SV with precision <num>      
9531                 %<num>p         reserved for future extensions
9532
9533         Robin Barker 2005-07-14
9534
9535                 %1p     (VDf)   removed.  RMB 2007-10-19
9536 */
9537             char* r = q; 
9538             bool sv = FALSE;    
9539             STRLEN n = 0;
9540             if (*q == '-')
9541                 sv = *q++;
9542             n = expect_number(&q);
9543             if (*q++ == 'p') {
9544                 if (sv) {                       /* SVf */
9545                     if (n) {
9546                         precis = n;
9547                         has_precis = TRUE;
9548                     }
9549                     argsv = MUTABLE_SV(va_arg(*args, void*));
9550                     eptr = SvPV_const(argsv, elen);
9551                     if (DO_UTF8(argsv))
9552                         is_utf8 = TRUE;
9553                     goto string;
9554                 }
9555                 else if (n) {
9556                     Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),
9557                                      "internal %%<num>p might conflict with future printf extensions");
9558                 }
9559             }
9560             q = r; 
9561         }
9562
9563         if ( (width = expect_number(&q)) ) {
9564             if (*q == '$') {
9565                 ++q;
9566                 efix = width;
9567             } else {
9568                 goto gotwidth;
9569             }
9570         }
9571
9572         /* FLAGS */
9573
9574         while (*q) {
9575             switch (*q) {
9576             case ' ':
9577             case '+':
9578                 if (plus == '+' && *q == ' ') /* '+' over ' ' */
9579                     q++;
9580                 else
9581                     plus = *q++;
9582                 continue;
9583
9584             case '-':
9585                 left = TRUE;
9586                 q++;
9587                 continue;
9588
9589             case '0':
9590                 fill = *q++;
9591                 continue;
9592
9593             case '#':
9594                 alt = TRUE;
9595                 q++;
9596                 continue;
9597
9598             default:
9599                 break;
9600             }
9601             break;
9602         }
9603
9604       tryasterisk:
9605         if (*q == '*') {
9606             q++;
9607             if ( (ewix = expect_number(&q)) )
9608                 if (*q++ != '$')
9609                     goto unknown;
9610             asterisk = TRUE;
9611         }
9612         if (*q == 'v') {
9613             q++;
9614             if (vectorize)
9615                 goto unknown;
9616             if ((vectorarg = asterisk)) {
9617                 evix = ewix;
9618                 ewix = 0;
9619                 asterisk = FALSE;
9620             }
9621             vectorize = TRUE;
9622             goto tryasterisk;
9623         }
9624
9625         if (!asterisk)
9626         {
9627             if( *q == '0' )
9628                 fill = *q++;
9629             width = expect_number(&q);
9630         }
9631
9632         if (vectorize) {
9633             if (vectorarg) {
9634                 if (args)
9635                     vecsv = va_arg(*args, SV*);
9636                 else if (evix) {
9637                     vecsv = (evix > 0 && evix <= svmax)
9638                         ? svargs[evix-1] : S_vcatpvfn_missing_argument(aTHX);
9639                 } else {
9640                     vecsv = svix < svmax
9641                         ? svargs[svix++] : S_vcatpvfn_missing_argument(aTHX);
9642                 }
9643                 dotstr = SvPV_const(vecsv, dotstrlen);
9644                 /* Keep the DO_UTF8 test *after* the SvPV call, else things go
9645                    bad with tied or overloaded values that return UTF8.  */
9646                 if (DO_UTF8(vecsv))
9647                     is_utf8 = TRUE;
9648                 else if (has_utf8) {
9649                     vecsv = sv_mortalcopy(vecsv);
9650                     sv_utf8_upgrade(vecsv);
9651                     dotstr = SvPV_const(vecsv, dotstrlen);
9652                     is_utf8 = TRUE;
9653                 }                   
9654             }
9655             if (args) {
9656                 VECTORIZE_ARGS
9657             }
9658             else if (efix ? (efix > 0 && efix <= svmax) : svix < svmax) {
9659                 vecsv = svargs[efix ? efix-1 : svix++];
9660                 vecstr = (U8*)SvPV_const(vecsv,veclen);
9661                 vec_utf8 = DO_UTF8(vecsv);
9662
9663                 /* if this is a version object, we need to convert
9664                  * back into v-string notation and then let the
9665                  * vectorize happen normally
9666                  */
9667                 if (sv_derived_from(vecsv, "version")) {
9668                     char *version = savesvpv(vecsv);
9669                     if ( hv_exists(MUTABLE_HV(SvRV(vecsv)), "alpha", 5 ) ) {
9670                         Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
9671                         "vector argument not supported with alpha versions");
9672                         goto unknown;
9673                     }
9674                     vecsv = sv_newmortal();
9675                     scan_vstring(version, version + veclen, vecsv);
9676                     vecstr = (U8*)SvPV_const(vecsv, veclen);
9677                     vec_utf8 = DO_UTF8(vecsv);
9678                     Safefree(version);
9679                 }
9680             }
9681             else {
9682                 vecstr = (U8*)"";
9683                 veclen = 0;
9684             }
9685         }
9686
9687         if (asterisk) {
9688             if (args)
9689                 i = va_arg(*args, int);
9690             else
9691                 i = (ewix ? ewix <= svmax : svix < svmax) ?
9692                     SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
9693             left |= (i < 0);
9694             width = (i < 0) ? -i : i;
9695         }
9696       gotwidth:
9697
9698         /* PRECISION */
9699
9700         if (*q == '.') {
9701             q++;
9702             if (*q == '*') {
9703                 q++;
9704                 if ( ((epix = expect_number(&q))) && (*q++ != '$') )
9705                     goto unknown;
9706                 /* XXX: todo, support specified precision parameter */
9707                 if (epix)
9708                     goto unknown;
9709                 if (args)
9710                     i = va_arg(*args, int);
9711                 else
9712                     i = (ewix ? ewix <= svmax : svix < svmax)
9713                         ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
9714                 precis = i;
9715                 has_precis = !(i < 0);
9716             }
9717             else {
9718                 precis = 0;
9719                 while (isDIGIT(*q))
9720                     precis = precis * 10 + (*q++ - '0');
9721                 has_precis = TRUE;
9722             }
9723         }
9724
9725         /* SIZE */
9726
9727         switch (*q) {
9728 #ifdef WIN32
9729         case 'I':                       /* Ix, I32x, and I64x */
9730 #  ifdef WIN64
9731             if (q[1] == '6' && q[2] == '4') {
9732                 q += 3;
9733                 intsize = 'q';
9734                 break;
9735             }
9736 #  endif
9737             if (q[1] == '3' && q[2] == '2') {
9738                 q += 3;
9739                 break;
9740             }
9741 #  ifdef WIN64
9742             intsize = 'q';
9743 #  endif
9744             q++;
9745             break;
9746 #endif
9747 #if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
9748         case 'L':                       /* Ld */
9749             /*FALLTHROUGH*/
9750 #ifdef HAS_QUAD
9751         case 'q':                       /* qd */
9752 #endif
9753             intsize = 'q';
9754             q++;
9755             break;
9756 #endif
9757         case 'l':
9758 #if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
9759             if (*(q + 1) == 'l') {      /* lld, llf */
9760                 intsize = 'q';
9761                 q += 2;
9762                 break;
9763              }
9764 #endif
9765             /*FALLTHROUGH*/
9766         case 'h':
9767             /*FALLTHROUGH*/
9768         case 'V':
9769             intsize = *q++;
9770             break;
9771         }
9772
9773         /* CONVERSION */
9774
9775         if (*q == '%') {
9776             eptr = q++;
9777             elen = 1;
9778             if (vectorize) {
9779                 c = '%';
9780                 goto unknown;
9781             }
9782             goto string;
9783         }
9784
9785         if (!vectorize && !args) {
9786             if (efix) {
9787                 const I32 i = efix-1;
9788                 argsv = (i >= 0 && i < svmax)
9789                     ? svargs[i] : S_vcatpvfn_missing_argument(aTHX);
9790             } else {
9791                 argsv = (svix >= 0 && svix < svmax)
9792                     ? svargs[svix++] : S_vcatpvfn_missing_argument(aTHX);
9793             }
9794         }
9795
9796         switch (c = *q++) {
9797
9798             /* STRINGS */
9799
9800         case 'c':
9801             if (vectorize)
9802                 goto unknown;
9803             uv = (args) ? va_arg(*args, int) : SvIV(argsv);
9804             if ((uv > 255 ||
9805                  (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
9806                 && !IN_BYTES) {
9807                 eptr = (char*)utf8buf;
9808                 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
9809                 is_utf8 = TRUE;
9810             }
9811             else {
9812                 c = (char)uv;
9813                 eptr = &c;
9814                 elen = 1;
9815             }
9816             goto string;
9817
9818         case 's':
9819             if (vectorize)
9820                 goto unknown;
9821             if (args) {
9822                 eptr = va_arg(*args, char*);
9823                 if (eptr)
9824                     elen = strlen(eptr);
9825                 else {
9826                     eptr = (char *)nullstr;
9827                     elen = sizeof nullstr - 1;
9828                 }
9829             }
9830             else {
9831                 eptr = SvPV_const(argsv, elen);
9832                 if (DO_UTF8(argsv)) {
9833                     STRLEN old_precis = precis;
9834                     if (has_precis && precis < elen) {
9835                         STRLEN ulen = sv_len_utf8(argsv);
9836                         I32 p = precis > ulen ? ulen : precis;
9837                         sv_pos_u2b(argsv, &p, 0); /* sticks at end */
9838                         precis = p;
9839                     }
9840                     if (width) { /* fudge width (can't fudge elen) */
9841                         if (has_precis && precis < elen)
9842                             width += precis - old_precis;
9843                         else
9844                             width += elen - sv_len_utf8(argsv);
9845                     }
9846                     is_utf8 = TRUE;
9847                 }
9848             }
9849
9850         string:
9851             if (has_precis && precis < elen)
9852                 elen = precis;
9853             break;
9854
9855             /* INTEGERS */
9856
9857         case 'p':
9858             if (alt || vectorize)
9859                 goto unknown;
9860             uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
9861             base = 16;
9862             goto integer;
9863
9864         case 'D':
9865 #ifdef IV_IS_QUAD
9866             intsize = 'q';
9867 #else
9868             intsize = 'l';
9869 #endif
9870             /*FALLTHROUGH*/
9871         case 'd':
9872         case 'i':
9873 #if vdNUMBER
9874         format_vd:
9875 #endif
9876             if (vectorize) {
9877                 STRLEN ulen;
9878                 if (!veclen)
9879                     continue;
9880                 if (vec_utf8)
9881                     uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9882                                         UTF8_ALLOW_ANYUV);
9883                 else {
9884                     uv = *vecstr;
9885                     ulen = 1;
9886                 }
9887                 vecstr += ulen;
9888                 veclen -= ulen;
9889                 if (plus)
9890                      esignbuf[esignlen++] = plus;
9891             }
9892             else if (args) {
9893                 switch (intsize) {
9894                 case 'h':       iv = (short)va_arg(*args, int); break;
9895                 case 'l':       iv = va_arg(*args, long); break;
9896                 case 'V':       iv = va_arg(*args, IV); break;
9897                 default:        iv = va_arg(*args, int); break;
9898                 case 'q':
9899 #ifdef HAS_QUAD
9900                                 iv = va_arg(*args, Quad_t); break;
9901 #else
9902                                 goto unknown;
9903 #endif
9904                 }
9905             }
9906             else {
9907                 IV tiv = SvIV(argsv); /* work around GCC bug #13488 */
9908                 switch (intsize) {
9909                 case 'h':       iv = (short)tiv; break;
9910                 case 'l':       iv = (long)tiv; break;
9911                 case 'V':
9912                 default:        iv = tiv; break;
9913                 case 'q':
9914 #ifdef HAS_QUAD
9915                                 iv = (Quad_t)tiv; break;
9916 #else
9917                                 goto unknown;
9918 #endif
9919                 }
9920             }
9921             if ( !vectorize )   /* we already set uv above */
9922             {
9923                 if (iv >= 0) {
9924                     uv = iv;
9925                     if (plus)
9926                         esignbuf[esignlen++] = plus;
9927                 }
9928                 else {
9929                     uv = -iv;
9930                     esignbuf[esignlen++] = '-';
9931                 }
9932             }
9933             base = 10;
9934             goto integer;
9935
9936         case 'U':
9937 #ifdef IV_IS_QUAD
9938             intsize = 'q';
9939 #else
9940             intsize = 'l';
9941 #endif
9942             /*FALLTHROUGH*/
9943         case 'u':
9944             base = 10;
9945             goto uns_integer;
9946
9947         case 'B':
9948         case 'b':
9949             base = 2;
9950             goto uns_integer;
9951
9952         case 'O':
9953 #ifdef IV_IS_QUAD
9954             intsize = 'q';
9955 #else
9956             intsize = 'l';
9957 #endif
9958             /*FALLTHROUGH*/
9959         case 'o':
9960             base = 8;
9961             goto uns_integer;
9962
9963         case 'X':
9964         case 'x':
9965             base = 16;
9966
9967         uns_integer:
9968             if (vectorize) {
9969                 STRLEN ulen;
9970         vector:
9971                 if (!veclen)
9972                     continue;
9973                 if (vec_utf8)
9974                     uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9975                                         UTF8_ALLOW_ANYUV);
9976                 else {
9977                     uv = *vecstr;
9978                     ulen = 1;
9979                 }
9980                 vecstr += ulen;
9981                 veclen -= ulen;
9982             }
9983             else if (args) {
9984                 switch (intsize) {
9985                 case 'h':  uv = (unsigned short)va_arg(*args, unsigned); break;
9986                 case 'l':  uv = va_arg(*args, unsigned long); break;
9987                 case 'V':  uv = va_arg(*args, UV); break;
9988                 default:   uv = va_arg(*args, unsigned); break;
9989                 case 'q':
9990 #ifdef HAS_QUAD
9991                            uv = va_arg(*args, Uquad_t); break;
9992 #else
9993                            goto unknown;
9994 #endif
9995                 }
9996             }
9997             else {
9998                 UV tuv = SvUV(argsv); /* work around GCC bug #13488 */
9999                 switch (intsize) {
10000                 case 'h':       uv = (unsigned short)tuv; break;
10001                 case 'l':       uv = (unsigned long)tuv; break;
10002                 case 'V':
10003                 default:        uv = tuv; break;
10004                 case 'q':
10005 #ifdef HAS_QUAD
10006                                 uv = (Uquad_t)tuv; break;
10007 #else
10008                                 goto unknown;
10009 #endif
10010                 }
10011             }
10012
10013         integer:
10014             {
10015                 char *ptr = ebuf + sizeof ebuf;
10016                 bool tempalt = uv ? alt : FALSE; /* Vectors can't change alt */
10017                 zeros = 0;
10018
10019                 switch (base) {
10020                     unsigned dig;
10021                 case 16:
10022                     p = (char *)((c == 'X') ? PL_hexdigit + 16 : PL_hexdigit);
10023                     do {
10024                         dig = uv & 15;
10025                         *--ptr = p[dig];
10026                     } while (uv >>= 4);
10027                     if (tempalt) {
10028                         esignbuf[esignlen++] = '0';
10029                         esignbuf[esignlen++] = c;  /* 'x' or 'X' */
10030                     }
10031                     break;
10032                 case 8:
10033                     do {
10034                         dig = uv & 7;
10035                         *--ptr = '0' + dig;
10036                     } while (uv >>= 3);
10037                     if (alt && *ptr != '0')
10038                         *--ptr = '0';
10039                     break;
10040                 case 2:
10041                     do {
10042                         dig = uv & 1;
10043                         *--ptr = '0' + dig;
10044                     } while (uv >>= 1);
10045                     if (tempalt) {
10046                         esignbuf[esignlen++] = '0';
10047                         esignbuf[esignlen++] = c;
10048                     }
10049                     break;
10050                 default:                /* it had better be ten or less */
10051                     do {
10052                         dig = uv % base;
10053                         *--ptr = '0' + dig;
10054                     } while (uv /= base);
10055                     break;
10056                 }
10057                 elen = (ebuf + sizeof ebuf) - ptr;
10058                 eptr = ptr;
10059                 if (has_precis) {
10060                     if (precis > elen)
10061                         zeros = precis - elen;
10062                     else if (precis == 0 && elen == 1 && *eptr == '0'
10063                              && !(base == 8 && alt)) /* "%#.0o" prints "0" */
10064                         elen = 0;
10065
10066                 /* a precision nullifies the 0 flag. */
10067                     if (fill == '0')
10068                         fill = ' ';
10069                 }
10070             }
10071             break;
10072
10073             /* FLOATING POINT */
10074
10075         case 'F':
10076             c = 'f';            /* maybe %F isn't supported here */
10077             /*FALLTHROUGH*/
10078         case 'e': case 'E':
10079         case 'f':
10080         case 'g': case 'G':
10081             if (vectorize)
10082                 goto unknown;
10083
10084             /* This is evil, but floating point is even more evil */
10085
10086             /* for SV-style calling, we can only get NV
10087                for C-style calling, we assume %f is double;
10088                for simplicity we allow any of %Lf, %llf, %qf for long double
10089             */
10090             switch (intsize) {
10091             case 'V':
10092 #if defined(USE_LONG_DOUBLE)
10093                 intsize = 'q';
10094 #endif
10095                 break;
10096 /* [perl #20339] - we should accept and ignore %lf rather than die */
10097             case 'l':
10098                 /*FALLTHROUGH*/
10099             default:
10100 #if defined(USE_LONG_DOUBLE)
10101                 intsize = args ? 0 : 'q';
10102 #endif
10103                 break;
10104             case 'q':
10105 #if defined(HAS_LONG_DOUBLE)
10106                 break;
10107 #else
10108                 /*FALLTHROUGH*/
10109 #endif
10110             case 'h':
10111                 goto unknown;
10112             }
10113
10114             /* now we need (long double) if intsize == 'q', else (double) */
10115             nv = (args) ?
10116 #if LONG_DOUBLESIZE > DOUBLESIZE
10117                 intsize == 'q' ?
10118                     va_arg(*args, long double) :
10119                     va_arg(*args, double)
10120 #else
10121                     va_arg(*args, double)
10122 #endif
10123                 : SvNV(argsv);
10124
10125             need = 0;
10126             /* nv * 0 will be NaN for NaN, +Inf and -Inf, and 0 for anything
10127                else. frexp() has some unspecified behaviour for those three */
10128             if (c != 'e' && c != 'E' && (nv * 0) == 0) {
10129                 i = PERL_INT_MIN;
10130                 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
10131                    will cast our (long double) to (double) */
10132                 (void)Perl_frexp(nv, &i);
10133                 if (i == PERL_INT_MIN)
10134                     Perl_die(aTHX_ "panic: frexp");
10135                 if (i > 0)
10136                     need = BIT_DIGITS(i);
10137             }
10138             need += has_precis ? precis : 6; /* known default */
10139
10140             if (need < width)
10141                 need = width;
10142
10143 #ifdef HAS_LDBL_SPRINTF_BUG
10144             /* This is to try to fix a bug with irix/nonstop-ux/powerux and
10145                with sfio - Allen <allens@cpan.org> */
10146
10147 #  ifdef DBL_MAX
10148 #    define MY_DBL_MAX DBL_MAX
10149 #  else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
10150 #    if DOUBLESIZE >= 8
10151 #      define MY_DBL_MAX 1.7976931348623157E+308L
10152 #    else
10153 #      define MY_DBL_MAX 3.40282347E+38L
10154 #    endif
10155 #  endif
10156
10157 #  ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
10158 #    define MY_DBL_MAX_BUG 1L
10159 #  else
10160 #    define MY_DBL_MAX_BUG MY_DBL_MAX
10161 #  endif
10162
10163 #  ifdef DBL_MIN
10164 #    define MY_DBL_MIN DBL_MIN
10165 #  else  /* XXX guessing! -Allen */
10166 #    if DOUBLESIZE >= 8
10167 #      define MY_DBL_MIN 2.2250738585072014E-308L
10168 #    else
10169 #      define MY_DBL_MIN 1.17549435E-38L
10170 #    endif
10171 #  endif
10172
10173             if ((intsize == 'q') && (c == 'f') &&
10174                 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
10175                 (need < DBL_DIG)) {
10176                 /* it's going to be short enough that
10177                  * long double precision is not needed */
10178
10179                 if ((nv <= 0L) && (nv >= -0L))
10180                     fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
10181                 else {
10182                     /* would use Perl_fp_class as a double-check but not
10183                      * functional on IRIX - see perl.h comments */
10184
10185                     if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
10186                         /* It's within the range that a double can represent */
10187 #if defined(DBL_MAX) && !defined(DBL_MIN)
10188                         if ((nv >= ((long double)1/DBL_MAX)) ||
10189                             (nv <= (-(long double)1/DBL_MAX)))
10190 #endif
10191                         fix_ldbl_sprintf_bug = TRUE;
10192                     }
10193                 }
10194                 if (fix_ldbl_sprintf_bug == TRUE) {
10195                     double temp;
10196
10197                     intsize = 0;
10198                     temp = (double)nv;
10199                     nv = (NV)temp;
10200                 }
10201             }
10202
10203 #  undef MY_DBL_MAX
10204 #  undef MY_DBL_MAX_BUG
10205 #  undef MY_DBL_MIN
10206
10207 #endif /* HAS_LDBL_SPRINTF_BUG */
10208
10209             need += 20; /* fudge factor */
10210             if (PL_efloatsize < need) {
10211                 Safefree(PL_efloatbuf);
10212                 PL_efloatsize = need + 20; /* more fudge */
10213                 Newx(PL_efloatbuf, PL_efloatsize, char);
10214                 PL_efloatbuf[0] = '\0';
10215             }
10216
10217             if ( !(width || left || plus || alt) && fill != '0'
10218                  && has_precis && intsize != 'q' ) {    /* Shortcuts */
10219                 /* See earlier comment about buggy Gconvert when digits,
10220                    aka precis is 0  */
10221                 if ( c == 'g' && precis) {
10222                     Gconvert((NV)nv, (int)precis, 0, PL_efloatbuf);
10223                     /* May return an empty string for digits==0 */
10224                     if (*PL_efloatbuf) {
10225                         elen = strlen(PL_efloatbuf);
10226                         goto float_converted;
10227                     }
10228                 } else if ( c == 'f' && !precis) {
10229                     if ((eptr = F0convert(nv, ebuf + sizeof ebuf, &elen)))
10230                         break;
10231                 }
10232             }
10233             {
10234                 char *ptr = ebuf + sizeof ebuf;
10235                 *--ptr = '\0';
10236                 *--ptr = c;
10237                 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
10238 #if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
10239                 if (intsize == 'q') {
10240                     /* Copy the one or more characters in a long double
10241                      * format before the 'base' ([efgEFG]) character to
10242                      * the format string. */
10243                     static char const prifldbl[] = PERL_PRIfldbl;
10244                     char const *p = prifldbl + sizeof(prifldbl) - 3;
10245                     while (p >= prifldbl) { *--ptr = *p--; }
10246                 }
10247 #endif
10248                 if (has_precis) {
10249                     base = precis;
10250                     do { *--ptr = '0' + (base % 10); } while (base /= 10);
10251                     *--ptr = '.';
10252                 }
10253                 if (width) {
10254                     base = width;
10255                     do { *--ptr = '0' + (base % 10); } while (base /= 10);
10256                 }
10257                 if (fill == '0')
10258                     *--ptr = fill;
10259                 if (left)
10260                     *--ptr = '-';
10261                 if (plus)
10262                     *--ptr = plus;
10263                 if (alt)
10264                     *--ptr = '#';
10265                 *--ptr = '%';
10266
10267                 /* No taint.  Otherwise we are in the strange situation
10268                  * where printf() taints but print($float) doesn't.
10269                  * --jhi */
10270 #if defined(HAS_LONG_DOUBLE)
10271                 elen = ((intsize == 'q')
10272                         ? my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, nv)
10273                         : my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, (double)nv));
10274 #else
10275                 elen = my_sprintf(PL_efloatbuf, ptr, nv);
10276 #endif
10277             }
10278         float_converted:
10279             eptr = PL_efloatbuf;
10280             break;
10281
10282             /* SPECIAL */
10283
10284         case 'n':
10285             if (vectorize)
10286                 goto unknown;
10287             i = SvCUR(sv) - origlen;
10288             if (args) {
10289                 switch (intsize) {
10290                 case 'h':       *(va_arg(*args, short*)) = i; break;
10291                 default:        *(va_arg(*args, int*)) = i; break;
10292                 case 'l':       *(va_arg(*args, long*)) = i; break;
10293                 case 'V':       *(va_arg(*args, IV*)) = i; break;
10294                 case 'q':
10295 #ifdef HAS_QUAD
10296                                 *(va_arg(*args, Quad_t*)) = i; break;
10297 #else
10298                                 goto unknown;
10299 #endif
10300                 }
10301             }
10302             else
10303                 sv_setuv_mg(argsv, (UV)i);
10304             continue;   /* not "break" */
10305
10306             /* UNKNOWN */
10307
10308         default:
10309       unknown:
10310             if (!args
10311                 && (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)
10312                 && ckWARN(WARN_PRINTF))
10313             {
10314                 SV * const msg = sv_newmortal();
10315                 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
10316                           (PL_op->op_type == OP_PRTF) ? "" : "s");
10317                 if (fmtstart < patend) {
10318                     const char * const fmtend = q < patend ? q : patend;
10319                     const char * f;
10320                     sv_catpvs(msg, "\"%");
10321                     for (f = fmtstart; f < fmtend; f++) {
10322                         if (isPRINT(*f)) {
10323                             sv_catpvn(msg, f, 1);
10324                         } else {
10325                             Perl_sv_catpvf(aTHX_ msg,
10326                                            "\\%03"UVof, (UV)*f & 0xFF);
10327                         }
10328                     }
10329                     sv_catpvs(msg, "\"");
10330                 } else {
10331                     sv_catpvs(msg, "end of string");
10332                 }
10333                 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, SVfARG(msg)); /* yes, this is reentrant */
10334             }
10335
10336             /* output mangled stuff ... */
10337             if (c == '\0')
10338                 --q;
10339             eptr = p;
10340             elen = q - p;
10341
10342             /* ... right here, because formatting flags should not apply */
10343             SvGROW(sv, SvCUR(sv) + elen + 1);
10344             p = SvEND(sv);
10345             Copy(eptr, p, elen, char);
10346             p += elen;
10347             *p = '\0';
10348             SvCUR_set(sv, p - SvPVX_const(sv));
10349             svix = osvix;
10350             continue;   /* not "break" */
10351         }
10352
10353         if (is_utf8 != has_utf8) {
10354             if (is_utf8) {
10355                 if (SvCUR(sv))
10356                     sv_utf8_upgrade(sv);
10357             }
10358             else {
10359                 const STRLEN old_elen = elen;
10360                 SV * const nsv = newSVpvn_flags(eptr, elen, SVs_TEMP);
10361                 sv_utf8_upgrade(nsv);
10362                 eptr = SvPVX_const(nsv);
10363                 elen = SvCUR(nsv);
10364
10365                 if (width) { /* fudge width (can't fudge elen) */
10366                     width += elen - old_elen;
10367                 }
10368                 is_utf8 = TRUE;
10369             }
10370         }
10371
10372         have = esignlen + zeros + elen;
10373         if (have < zeros)
10374             Perl_croak_nocontext("%s", PL_memory_wrap);
10375
10376         need = (have > width ? have : width);
10377         gap = need - have;
10378
10379         if (need >= (((STRLEN)~0) - SvCUR(sv) - dotstrlen - 1))
10380             Perl_croak_nocontext("%s", PL_memory_wrap);
10381         SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
10382         p = SvEND(sv);
10383         if (esignlen && fill == '0') {
10384             int i;
10385             for (i = 0; i < (int)esignlen; i++)
10386                 *p++ = esignbuf[i];
10387         }
10388         if (gap && !left) {
10389             memset(p, fill, gap);
10390             p += gap;
10391         }
10392         if (esignlen && fill != '0') {
10393             int i;
10394             for (i = 0; i < (int)esignlen; i++)
10395                 *p++ = esignbuf[i];
10396         }
10397         if (zeros) {
10398             int i;
10399             for (i = zeros; i; i--)
10400                 *p++ = '0';
10401         }
10402         if (elen) {
10403             Copy(eptr, p, elen, char);
10404             p += elen;
10405         }
10406         if (gap && left) {
10407             memset(p, ' ', gap);
10408             p += gap;
10409         }
10410         if (vectorize) {
10411             if (veclen) {
10412                 Copy(dotstr, p, dotstrlen, char);
10413                 p += dotstrlen;
10414             }
10415             else
10416                 vectorize = FALSE;              /* done iterating over vecstr */
10417         }
10418         if (is_utf8)
10419             has_utf8 = TRUE;
10420         if (has_utf8)
10421             SvUTF8_on(sv);
10422         *p = '\0';
10423         SvCUR_set(sv, p - SvPVX_const(sv));
10424         if (vectorize) {
10425             esignlen = 0;
10426             goto vector;
10427         }
10428     }
10429     SvTAINT(sv);
10430 }
10431
10432 /* =========================================================================
10433
10434 =head1 Cloning an interpreter
10435
10436 All the macros and functions in this section are for the private use of
10437 the main function, perl_clone().
10438
10439 The foo_dup() functions make an exact copy of an existing foo thingy.
10440 During the course of a cloning, a hash table is used to map old addresses
10441 to new addresses. The table is created and manipulated with the
10442 ptr_table_* functions.
10443
10444 =cut
10445
10446  * =========================================================================*/
10447
10448
10449 #if defined(USE_ITHREADS)
10450
10451 /* XXX Remove this so it doesn't have to go thru the macro and return for nothing */
10452 #ifndef GpREFCNT_inc
10453 #  define GpREFCNT_inc(gp)      ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
10454 #endif
10455
10456
10457 /* Certain cases in Perl_ss_dup have been merged, by relying on the fact
10458    that currently av_dup, gv_dup and hv_dup are the same as sv_dup.
10459    If this changes, please unmerge ss_dup.
10460    Likewise, sv_dup_inc_multiple() relies on this fact.  */
10461 #define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
10462 #define sv_dup_inc_NN(s,t)      SvREFCNT_inc_NN(sv_dup(s,t))
10463 #define av_dup(s,t)     MUTABLE_AV(sv_dup((const SV *)s,t))
10464 #define av_dup_inc(s,t) MUTABLE_AV(SvREFCNT_inc(sv_dup((const SV *)s,t)))
10465 #define hv_dup(s,t)     MUTABLE_HV(sv_dup((const SV *)s,t))
10466 #define hv_dup_inc(s,t) MUTABLE_HV(SvREFCNT_inc(sv_dup((const SV *)s,t)))
10467 #define cv_dup(s,t)     MUTABLE_CV(sv_dup((const SV *)s,t))
10468 #define cv_dup_inc(s,t) MUTABLE_CV(SvREFCNT_inc(sv_dup((const SV *)s,t)))
10469 #define io_dup(s,t)     MUTABLE_IO(sv_dup((const SV *)s,t))
10470 #define io_dup_inc(s,t) MUTABLE_IO(SvREFCNT_inc(sv_dup((const SV *)s,t)))
10471 #define gv_dup(s,t)     MUTABLE_GV(sv_dup((const SV *)s,t))
10472 #define gv_dup_inc(s,t) MUTABLE_GV(SvREFCNT_inc(sv_dup((const SV *)s,t)))
10473 #define SAVEPV(p)       ((p) ? savepv(p) : NULL)
10474 #define SAVEPVN(p,n)    ((p) ? savepvn(p,n) : NULL)
10475
10476 /* clone a parser */
10477
10478 yy_parser *
10479 Perl_parser_dup(pTHX_ const yy_parser *const proto, CLONE_PARAMS *const param)
10480 {
10481     yy_parser *parser;
10482
10483     PERL_ARGS_ASSERT_PARSER_DUP;
10484
10485     if (!proto)
10486         return NULL;
10487
10488     /* look for it in the table first */
10489     parser = (yy_parser *)ptr_table_fetch(PL_ptr_table, proto);
10490     if (parser)
10491         return parser;
10492
10493     /* create anew and remember what it is */
10494     Newxz(parser, 1, yy_parser);
10495     ptr_table_store(PL_ptr_table, proto, parser);
10496
10497     parser->yyerrstatus = 0;
10498     parser->yychar = YYEMPTY;           /* Cause a token to be read.  */
10499
10500     /* XXX these not yet duped */
10501     parser->old_parser = NULL;
10502     parser->stack = NULL;
10503     parser->ps = NULL;
10504     parser->stack_size = 0;
10505     /* XXX parser->stack->state = 0; */
10506
10507     /* XXX eventually, just Copy() most of the parser struct ? */
10508
10509     parser->lex_brackets = proto->lex_brackets;
10510     parser->lex_casemods = proto->lex_casemods;
10511     parser->lex_brackstack = savepvn(proto->lex_brackstack,
10512                     (proto->lex_brackets < 120 ? 120 : proto->lex_brackets));
10513     parser->lex_casestack = savepvn(proto->lex_casestack,
10514                     (proto->lex_casemods < 12 ? 12 : proto->lex_casemods));
10515     parser->lex_defer   = proto->lex_defer;
10516     parser->lex_dojoin  = proto->lex_dojoin;
10517     parser->lex_expect  = proto->lex_expect;
10518     parser->lex_formbrack = proto->lex_formbrack;
10519     parser->lex_inpat   = proto->lex_inpat;
10520     parser->lex_inwhat  = proto->lex_inwhat;
10521     parser->lex_op      = proto->lex_op;
10522     parser->lex_repl    = sv_dup_inc(proto->lex_repl, param);
10523     parser->lex_starts  = proto->lex_starts;
10524     parser->lex_stuff   = sv_dup_inc(proto->lex_stuff, param);
10525     parser->multi_close = proto->multi_close;
10526     parser->multi_open  = proto->multi_open;
10527     parser->multi_start = proto->multi_start;
10528     parser->multi_end   = proto->multi_end;
10529     parser->pending_ident = proto->pending_ident;
10530     parser->preambled   = proto->preambled;
10531     parser->sublex_info = proto->sublex_info; /* XXX not quite right */
10532     parser->linestr     = sv_dup_inc(proto->linestr, param);
10533     parser->expect      = proto->expect;
10534     parser->copline     = proto->copline;
10535     parser->last_lop_op = proto->last_lop_op;
10536     parser->lex_state   = proto->lex_state;
10537     parser->rsfp        = fp_dup(proto->rsfp, '<', param);
10538     /* rsfp_filters entries have fake IoDIRP() */
10539     parser->rsfp_filters= av_dup_inc(proto->rsfp_filters, param);
10540     parser->in_my       = proto->in_my;
10541     parser->in_my_stash = hv_dup(proto->in_my_stash, param);
10542     parser->error_count = proto->error_count;
10543
10544
10545     parser->linestr     = sv_dup_inc(proto->linestr, param);
10546
10547     {
10548         char * const ols = SvPVX(proto->linestr);
10549         char * const ls  = SvPVX(parser->linestr);
10550
10551         parser->bufptr      = ls + (proto->bufptr >= ols ?
10552                                     proto->bufptr -  ols : 0);
10553         parser->oldbufptr   = ls + (proto->oldbufptr >= ols ?
10554                                     proto->oldbufptr -  ols : 0);
10555         parser->oldoldbufptr= ls + (proto->oldoldbufptr >= ols ?
10556                                     proto->oldoldbufptr -  ols : 0);
10557         parser->linestart   = ls + (proto->linestart >= ols ?
10558                                     proto->linestart -  ols : 0);
10559         parser->last_uni    = ls + (proto->last_uni >= ols ?
10560                                     proto->last_uni -  ols : 0);
10561         parser->last_lop    = ls + (proto->last_lop >= ols ?
10562                                     proto->last_lop -  ols : 0);
10563
10564         parser->bufend      = ls + SvCUR(parser->linestr);
10565     }
10566
10567     Copy(proto->tokenbuf, parser->tokenbuf, 256, char);
10568
10569
10570 #ifdef PERL_MAD
10571     parser->endwhite    = proto->endwhite;
10572     parser->faketokens  = proto->faketokens;
10573     parser->lasttoke    = proto->lasttoke;
10574     parser->nextwhite   = proto->nextwhite;
10575     parser->realtokenstart = proto->realtokenstart;
10576     parser->skipwhite   = proto->skipwhite;
10577     parser->thisclose   = proto->thisclose;
10578     parser->thismad     = proto->thismad;
10579     parser->thisopen    = proto->thisopen;
10580     parser->thisstuff   = proto->thisstuff;
10581     parser->thistoken   = proto->thistoken;
10582     parser->thiswhite   = proto->thiswhite;
10583
10584     Copy(proto->nexttoke, parser->nexttoke, 5, NEXTTOKE);
10585     parser->curforce    = proto->curforce;
10586 #else
10587     Copy(proto->nextval, parser->nextval, 5, YYSTYPE);
10588     Copy(proto->nexttype, parser->nexttype, 5,  I32);
10589     parser->nexttoke    = proto->nexttoke;
10590 #endif
10591
10592     /* XXX should clone saved_curcop here, but we aren't passed
10593      * proto_perl; so do it in perl_clone_using instead */
10594
10595     return parser;
10596 }
10597
10598
10599 /* duplicate a file handle */
10600
10601 PerlIO *
10602 Perl_fp_dup(pTHX_ PerlIO *const fp, const char type, CLONE_PARAMS *const param)
10603 {
10604     PerlIO *ret;
10605
10606     PERL_ARGS_ASSERT_FP_DUP;
10607     PERL_UNUSED_ARG(type);
10608
10609     if (!fp)
10610         return (PerlIO*)NULL;
10611
10612     /* look for it in the table first */
10613     ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
10614     if (ret)
10615         return ret;
10616
10617     /* create anew and remember what it is */
10618     ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
10619     ptr_table_store(PL_ptr_table, fp, ret);
10620     return ret;
10621 }
10622
10623 /* duplicate a directory handle */
10624
10625 DIR *
10626 Perl_dirp_dup(pTHX_ DIR *const dp)
10627 {
10628     PERL_UNUSED_CONTEXT;
10629     if (!dp)
10630         return (DIR*)NULL;
10631     /* XXX TODO */
10632     return dp;
10633 }
10634
10635 /* duplicate a typeglob */
10636
10637 GP *
10638 Perl_gp_dup(pTHX_ GP *const gp, CLONE_PARAMS *const param)
10639 {
10640     GP *ret;
10641
10642     PERL_ARGS_ASSERT_GP_DUP;
10643
10644     if (!gp)
10645         return (GP*)NULL;
10646     /* look for it in the table first */
10647     ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
10648     if (ret)
10649         return ret;
10650
10651     /* create anew and remember what it is */
10652     Newxz(ret, 1, GP);
10653     ptr_table_store(PL_ptr_table, gp, ret);
10654
10655     /* clone */
10656     /* ret->gp_refcnt must be 0 before any other dups are called. We're relying
10657        on Newxz() to do this for us.  */
10658     ret->gp_sv          = sv_dup_inc(gp->gp_sv, param);
10659     ret->gp_io          = io_dup_inc(gp->gp_io, param);
10660     ret->gp_form        = cv_dup_inc(gp->gp_form, param);
10661     ret->gp_av          = av_dup_inc(gp->gp_av, param);
10662     ret->gp_hv          = hv_dup_inc(gp->gp_hv, param);
10663     ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
10664     ret->gp_cv          = cv_dup_inc(gp->gp_cv, param);
10665     ret->gp_cvgen       = gp->gp_cvgen;
10666     ret->gp_line        = gp->gp_line;
10667     ret->gp_file_hek    = hek_dup(gp->gp_file_hek, param);
10668     return ret;
10669 }
10670
10671 /* duplicate a chain of magic */
10672
10673 MAGIC *
10674 Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS *const param)
10675 {
10676     MAGIC *mgret = NULL;
10677     MAGIC **mgprev_p = &mgret;
10678
10679     PERL_ARGS_ASSERT_MG_DUP;
10680
10681     for (; mg; mg = mg->mg_moremagic) {
10682         MAGIC *nmg;
10683         Newx(nmg, 1, MAGIC);
10684         *mgprev_p = nmg;
10685         mgprev_p = &(nmg->mg_moremagic);
10686
10687         /* There was a comment "XXX copy dynamic vtable?" but as we don't have
10688            dynamic vtables, I'm not sure why Sarathy wrote it. The comment dates
10689            from the original commit adding Perl_mg_dup() - revision 4538.
10690            Similarly there is the annotation "XXX random ptr?" next to the
10691            assignment to nmg->mg_ptr.  */
10692         *nmg = *mg;
10693
10694         /* FIXME for plugins
10695         if (nmg->mg_type == PERL_MAGIC_qr) {
10696             nmg->mg_obj = MUTABLE_SV(CALLREGDUPE((REGEXP*)nmg->mg_obj, param));
10697         }
10698         else
10699         */
10700         if(nmg->mg_type == PERL_MAGIC_backref) {
10701             /* The backref AV has its reference count deliberately bumped by
10702                1.  */
10703             nmg->mg_obj
10704                 = SvREFCNT_inc(av_dup_inc((const AV *) nmg->mg_obj, param));
10705         }
10706         else {
10707             nmg->mg_obj = (nmg->mg_flags & MGf_REFCOUNTED)
10708                               ? sv_dup_inc(nmg->mg_obj, param)
10709                               : sv_dup(nmg->mg_obj, param);
10710         }
10711
10712         if (nmg->mg_ptr && nmg->mg_type != PERL_MAGIC_regex_global) {
10713             if (nmg->mg_len > 0) {
10714                 nmg->mg_ptr     = SAVEPVN(nmg->mg_ptr, nmg->mg_len);
10715                 if (nmg->mg_type == PERL_MAGIC_overload_table &&
10716                         AMT_AMAGIC((AMT*)nmg->mg_ptr))
10717                 {
10718                     AMT * const namtp = (AMT*)nmg->mg_ptr;
10719                     sv_dup_inc_multiple((SV**)(namtp->table),
10720                                         (SV**)(namtp->table), NofAMmeth, param);
10721                 }
10722             }
10723             else if (nmg->mg_len == HEf_SVKEY)
10724                 nmg->mg_ptr = (char*)sv_dup_inc((const SV *)nmg->mg_ptr, param);
10725         }
10726         if ((nmg->mg_flags & MGf_DUP) && nmg->mg_virtual && nmg->mg_virtual->svt_dup) {
10727             CALL_FPTR(nmg->mg_virtual->svt_dup)(aTHX_ nmg, param);
10728         }
10729     }
10730     return mgret;
10731 }
10732
10733 #endif /* USE_ITHREADS */
10734
10735 struct ptr_tbl_arena {
10736     struct ptr_tbl_arena *next;
10737     struct ptr_tbl_ent array[1023/3]; /* as ptr_tbl_ent has 3 pointers.  */
10738 };
10739
10740 /* create a new pointer-mapping table */
10741
10742 PTR_TBL_t *
10743 Perl_ptr_table_new(pTHX)
10744 {
10745     PTR_TBL_t *tbl;
10746     PERL_UNUSED_CONTEXT;
10747
10748     Newx(tbl, 1, PTR_TBL_t);
10749     tbl->tbl_max        = 511;
10750     tbl->tbl_items      = 0;
10751     tbl->tbl_arena      = NULL;
10752     tbl->tbl_arena_next = NULL;
10753     tbl->tbl_arena_end  = NULL;
10754     Newxz(tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
10755     return tbl;
10756 }
10757
10758 #define PTR_TABLE_HASH(ptr) \
10759   ((PTR2UV(ptr) >> 3) ^ (PTR2UV(ptr) >> (3 + 7)) ^ (PTR2UV(ptr) >> (3 + 17)))
10760
10761 /* map an existing pointer using a table */
10762
10763 STATIC PTR_TBL_ENT_t *
10764 S_ptr_table_find(PTR_TBL_t *const tbl, const void *const sv)
10765 {
10766     PTR_TBL_ENT_t *tblent;
10767     const UV hash = PTR_TABLE_HASH(sv);
10768
10769     PERL_ARGS_ASSERT_PTR_TABLE_FIND;
10770
10771     tblent = tbl->tbl_ary[hash & tbl->tbl_max];
10772     for (; tblent; tblent = tblent->next) {
10773         if (tblent->oldval == sv)
10774             return tblent;
10775     }
10776     return NULL;
10777 }
10778
10779 void *
10780 Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *const tbl, const void *const sv)
10781 {
10782     PTR_TBL_ENT_t const *const tblent = ptr_table_find(tbl, sv);
10783
10784     PERL_ARGS_ASSERT_PTR_TABLE_FETCH;
10785     PERL_UNUSED_CONTEXT;
10786
10787     return tblent ? tblent->newval : NULL;
10788 }
10789
10790 /* add a new entry to a pointer-mapping table */
10791
10792 void
10793 Perl_ptr_table_store(pTHX_ PTR_TBL_t *const tbl, const void *const oldsv, void *const newsv)
10794 {
10795     PTR_TBL_ENT_t *tblent = ptr_table_find(tbl, oldsv);
10796
10797     PERL_ARGS_ASSERT_PTR_TABLE_STORE;
10798     PERL_UNUSED_CONTEXT;
10799
10800     if (tblent) {
10801         tblent->newval = newsv;
10802     } else {
10803         const UV entry = PTR_TABLE_HASH(oldsv) & tbl->tbl_max;
10804
10805         if (tbl->tbl_arena_next == tbl->tbl_arena_end) {
10806             struct ptr_tbl_arena *new_arena;
10807
10808             Newx(new_arena, 1, struct ptr_tbl_arena);
10809             new_arena->next = tbl->tbl_arena;
10810             tbl->tbl_arena = new_arena;
10811             tbl->tbl_arena_next = new_arena->array;
10812             tbl->tbl_arena_end = new_arena->array
10813                 + sizeof(new_arena->array) / sizeof(new_arena->array[0]);
10814         }
10815
10816         tblent = tbl->tbl_arena_next++;
10817
10818         tblent->oldval = oldsv;
10819         tblent->newval = newsv;
10820         tblent->next = tbl->tbl_ary[entry];
10821         tbl->tbl_ary[entry] = tblent;
10822         tbl->tbl_items++;
10823         if (tblent->next && tbl->tbl_items > tbl->tbl_max)
10824             ptr_table_split(tbl);
10825     }
10826 }
10827
10828 /* double the hash bucket size of an existing ptr table */
10829
10830 void
10831 Perl_ptr_table_split(pTHX_ PTR_TBL_t *const tbl)
10832 {
10833     PTR_TBL_ENT_t **ary = tbl->tbl_ary;
10834     const UV oldsize = tbl->tbl_max + 1;
10835     UV newsize = oldsize * 2;
10836     UV i;
10837
10838     PERL_ARGS_ASSERT_PTR_TABLE_SPLIT;
10839     PERL_UNUSED_CONTEXT;
10840
10841     Renew(ary, newsize, PTR_TBL_ENT_t*);
10842     Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
10843     tbl->tbl_max = --newsize;
10844     tbl->tbl_ary = ary;
10845     for (i=0; i < oldsize; i++, ary++) {
10846         PTR_TBL_ENT_t **curentp, **entp, *ent;
10847         if (!*ary)
10848             continue;
10849         curentp = ary + oldsize;
10850         for (entp = ary, ent = *ary; ent; ent = *entp) {
10851             if ((newsize & PTR_TABLE_HASH(ent->oldval)) != i) {
10852                 *entp = ent->next;
10853                 ent->next = *curentp;
10854                 *curentp = ent;
10855                 continue;
10856             }
10857             else
10858                 entp = &ent->next;
10859         }
10860     }
10861 }
10862
10863 /* remove all the entries from a ptr table */
10864 /* Deprecated - will be removed post 5.14 */
10865
10866 void
10867 Perl_ptr_table_clear(pTHX_ PTR_TBL_t *const tbl)
10868 {
10869     if (tbl && tbl->tbl_items) {
10870         struct ptr_tbl_arena *arena = tbl->tbl_arena;
10871
10872         Zero(tbl->tbl_ary, tbl->tbl_max + 1, struct ptr_tbl_ent **);
10873
10874         while (arena) {
10875             struct ptr_tbl_arena *next = arena->next;
10876
10877             Safefree(arena);
10878             arena = next;
10879         };
10880
10881         tbl->tbl_items = 0;
10882         tbl->tbl_arena = NULL;
10883         tbl->tbl_arena_next = NULL;
10884         tbl->tbl_arena_end = NULL;
10885     }
10886 }
10887
10888 /* clear and free a ptr table */
10889
10890 void
10891 Perl_ptr_table_free(pTHX_ PTR_TBL_t *const tbl)
10892 {
10893     struct ptr_tbl_arena *arena;
10894
10895     if (!tbl) {
10896         return;
10897     }
10898
10899     arena = tbl->tbl_arena;
10900
10901     while (arena) {
10902         struct ptr_tbl_arena *next = arena->next;
10903
10904         Safefree(arena);
10905         arena = next;
10906     }
10907
10908     Safefree(tbl->tbl_ary);
10909     Safefree(tbl);
10910 }
10911
10912 #if defined(USE_ITHREADS)
10913
10914 void
10915 Perl_rvpv_dup(pTHX_ SV *const dstr, const SV *const sstr, CLONE_PARAMS *const param)
10916 {
10917     PERL_ARGS_ASSERT_RVPV_DUP;
10918
10919     if (SvROK(sstr)) {
10920         SvRV_set(dstr, SvWEAKREF(sstr)
10921                        ? sv_dup(SvRV_const(sstr), param)
10922                        : sv_dup_inc(SvRV_const(sstr), param));
10923
10924     }
10925     else if (SvPVX_const(sstr)) {
10926         /* Has something there */
10927         if (SvLEN(sstr)) {
10928             /* Normal PV - clone whole allocated space */
10929             SvPV_set(dstr, SAVEPVN(SvPVX_const(sstr), SvLEN(sstr)-1));
10930             if (SvREADONLY(sstr) && SvFAKE(sstr)) {
10931                 /* Not that normal - actually sstr is copy on write.
10932                    But we are a true, independant SV, so:  */
10933                 SvREADONLY_off(dstr);
10934                 SvFAKE_off(dstr);
10935             }
10936         }
10937         else {
10938             /* Special case - not normally malloced for some reason */
10939             if (isGV_with_GP(sstr)) {
10940                 /* Don't need to do anything here.  */
10941             }
10942             else if ((SvREADONLY(sstr) && SvFAKE(sstr))) {
10943                 /* A "shared" PV - clone it as "shared" PV */
10944                 SvPV_set(dstr,
10945                          HEK_KEY(hek_dup(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)),
10946                                          param)));
10947             }
10948             else {
10949                 /* Some other special case - random pointer */
10950                 SvPV_set(dstr, (char *) SvPVX_const(sstr));             
10951             }
10952         }
10953     }
10954     else {
10955         /* Copy the NULL */
10956         SvPV_set(dstr, NULL);
10957     }
10958 }
10959
10960 /* duplicate a list of SVs. source and dest may point to the same memory.  */
10961 static SV **
10962 S_sv_dup_inc_multiple(pTHX_ SV *const *source, SV **dest,
10963                       SSize_t items, CLONE_PARAMS *const param)
10964 {
10965     PERL_ARGS_ASSERT_SV_DUP_INC_MULTIPLE;
10966
10967     while (items-- > 0) {
10968         *dest++ = sv_dup_inc(*source++, param);
10969     }
10970
10971     return dest;
10972 }
10973
10974 /* duplicate an SV of any type (including AV, HV etc) */
10975
10976 SV *
10977 Perl_sv_dup(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
10978 {
10979     dVAR;
10980     SV *dstr;
10981
10982     PERL_ARGS_ASSERT_SV_DUP;
10983
10984     if (!sstr)
10985         return NULL;
10986     if (SvTYPE(sstr) == SVTYPEMASK) {
10987 #ifdef DEBUG_LEAKING_SCALARS_ABORT
10988         abort();
10989 #endif
10990         return NULL;
10991     }
10992     /* look for it in the table first */
10993     dstr = MUTABLE_SV(ptr_table_fetch(PL_ptr_table, sstr));
10994     if (dstr)
10995         return dstr;
10996
10997     if(param->flags & CLONEf_JOIN_IN) {
10998         /** We are joining here so we don't want do clone
10999             something that is bad **/
11000         if (SvTYPE(sstr) == SVt_PVHV) {
11001             const HEK * const hvname = HvNAME_HEK(sstr);
11002             if (hvname)
11003                 /** don't clone stashes if they already exist **/
11004                 return MUTABLE_SV(gv_stashpvn(HEK_KEY(hvname), HEK_LEN(hvname), 0));
11005         }
11006     }
11007
11008     /* create anew and remember what it is */
11009     new_SV(dstr);
11010
11011 #ifdef DEBUG_LEAKING_SCALARS
11012     dstr->sv_debug_optype = sstr->sv_debug_optype;
11013     dstr->sv_debug_line = sstr->sv_debug_line;
11014     dstr->sv_debug_inpad = sstr->sv_debug_inpad;
11015     dstr->sv_debug_cloned = 1;
11016     dstr->sv_debug_file = savepv(sstr->sv_debug_file);
11017 #endif
11018
11019     ptr_table_store(PL_ptr_table, sstr, dstr);
11020
11021     /* clone */
11022     SvFLAGS(dstr)       = SvFLAGS(sstr);
11023     SvFLAGS(dstr)       &= ~SVf_OOK;            /* don't propagate OOK hack */
11024     SvREFCNT(dstr)      = 0;                    /* must be before any other dups! */
11025
11026 #ifdef DEBUGGING
11027     if (SvANY(sstr) && PL_watch_pvx && SvPVX_const(sstr) == PL_watch_pvx)
11028         PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
11029                       (void*)PL_watch_pvx, SvPVX_const(sstr));
11030 #endif
11031
11032     /* don't clone objects whose class has asked us not to */
11033     if (SvOBJECT(sstr) && ! (SvFLAGS(SvSTASH(sstr)) & SVphv_CLONEABLE)) {
11034         SvFLAGS(dstr) = 0;
11035         return dstr;
11036     }
11037
11038     switch (SvTYPE(sstr)) {
11039     case SVt_NULL:
11040         SvANY(dstr)     = NULL;
11041         break;
11042     case SVt_IV:
11043         SvANY(dstr)     = (XPVIV*)((char*)&(dstr->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
11044         if(SvROK(sstr)) {
11045             Perl_rvpv_dup(aTHX_ dstr, sstr, param);
11046         } else {
11047             SvIV_set(dstr, SvIVX(sstr));
11048         }
11049         break;
11050     case SVt_NV:
11051         SvANY(dstr)     = new_XNV();
11052         SvNV_set(dstr, SvNVX(sstr));
11053         break;
11054         /* case SVt_BIND: */
11055     default:
11056         {
11057             /* These are all the types that need complex bodies allocating.  */
11058             void *new_body;
11059             const svtype sv_type = SvTYPE(sstr);
11060             const struct body_details *const sv_type_details
11061                 = bodies_by_type + sv_type;
11062
11063             switch (sv_type) {
11064             default:
11065                 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
11066                 break;
11067
11068             case SVt_PVGV:
11069             case SVt_PVIO:
11070             case SVt_PVFM:
11071             case SVt_PVHV:
11072             case SVt_PVAV:
11073             case SVt_PVCV:
11074             case SVt_PVLV:
11075             case SVt_REGEXP:
11076             case SVt_PVMG:
11077             case SVt_PVNV:
11078             case SVt_PVIV:
11079             case SVt_PV:
11080                 assert(sv_type_details->body_size);
11081                 if (sv_type_details->arena) {
11082                     new_body_inline(new_body, sv_type);
11083                     new_body
11084                         = (void*)((char*)new_body - sv_type_details->offset);
11085                 } else {
11086                     new_body = new_NOARENA(sv_type_details);
11087                 }
11088             }
11089             assert(new_body);
11090             SvANY(dstr) = new_body;
11091
11092 #ifndef PURIFY
11093             Copy(((char*)SvANY(sstr)) + sv_type_details->offset,
11094                  ((char*)SvANY(dstr)) + sv_type_details->offset,
11095                  sv_type_details->copy, char);
11096 #else
11097             Copy(((char*)SvANY(sstr)),
11098                  ((char*)SvANY(dstr)),
11099                  sv_type_details->body_size + sv_type_details->offset, char);
11100 #endif
11101
11102             if (sv_type != SVt_PVAV && sv_type != SVt_PVHV
11103                 && !isGV_with_GP(dstr))
11104                 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
11105
11106             /* The Copy above means that all the source (unduplicated) pointers
11107                are now in the destination.  We can check the flags and the
11108                pointers in either, but it's possible that there's less cache
11109                missing by always going for the destination.
11110                FIXME - instrument and check that assumption  */
11111             if (sv_type >= SVt_PVMG) {
11112                 if ((sv_type == SVt_PVMG) && SvPAD_OUR(dstr)) {
11113                     SvOURSTASH_set(dstr, hv_dup_inc(SvOURSTASH(dstr), param));
11114                 } else if (SvMAGIC(dstr))
11115                     SvMAGIC_set(dstr, mg_dup(SvMAGIC(dstr), param));
11116                 if (SvSTASH(dstr))
11117                     SvSTASH_set(dstr, hv_dup_inc(SvSTASH(dstr), param));
11118             }
11119
11120             /* The cast silences a GCC warning about unhandled types.  */
11121             switch ((int)sv_type) {
11122             case SVt_PV:
11123                 break;
11124             case SVt_PVIV:
11125                 break;
11126             case SVt_PVNV:
11127                 break;
11128             case SVt_PVMG:
11129                 break;
11130             case SVt_REGEXP:
11131                 /* FIXME for plugins */
11132                 re_dup_guts((REGEXP*) sstr, (REGEXP*) dstr, param);
11133                 break;
11134             case SVt_PVLV:
11135                 /* XXX LvTARGOFF sometimes holds PMOP* when DEBUGGING */
11136                 if (LvTYPE(dstr) == 't') /* for tie: unrefcnted fake (SV**) */
11137                     LvTARG(dstr) = dstr;
11138                 else if (LvTYPE(dstr) == 'T') /* for tie: fake HE */
11139                     LvTARG(dstr) = MUTABLE_SV(he_dup((HE*)LvTARG(dstr), 0, param));
11140                 else
11141                     LvTARG(dstr) = sv_dup_inc(LvTARG(dstr), param);
11142             case SVt_PVGV:
11143                 if(isGV_with_GP(sstr)) {
11144                     GvNAME_HEK(dstr) = hek_dup(GvNAME_HEK(dstr), param);
11145                     /* Don't call sv_add_backref here as it's going to be
11146                        created as part of the magic cloning of the symbol
11147                        table--unless this is during a join and the stash
11148                        is not actually being cloned.  */
11149                     /* Danger Will Robinson - GvGP(dstr) isn't initialised
11150                        at the point of this comment.  */
11151                     GvSTASH(dstr) = hv_dup(GvSTASH(dstr), param);
11152                     if(param->flags & CLONEf_JOIN_IN) {
11153                         const HEK * const hvname
11154                          = HvNAME_HEK(GvSTASH(dstr));
11155                         if( hvname
11156                          && GvSTASH(dstr) == gv_stashpvn(
11157                              HEK_KEY(hvname), HEK_LEN(hvname), 0
11158                             )
11159                           )
11160                             Perl_sv_add_backref(
11161                              aTHX_ MUTABLE_SV(GvSTASH(dstr)), dstr
11162                             );
11163                     }
11164                     GvGP(dstr)  = gp_dup(GvGP(sstr), param);
11165                     (void)GpREFCNT_inc(GvGP(dstr));
11166                 } else
11167                     Perl_rvpv_dup(aTHX_ dstr, sstr, param);
11168                 break;
11169             case SVt_PVIO:
11170                 IoIFP(dstr)     = fp_dup(IoIFP(dstr), IoTYPE(dstr), param);
11171                 if (IoOFP(dstr) == IoIFP(sstr))
11172                     IoOFP(dstr) = IoIFP(dstr);
11173                 else
11174                     IoOFP(dstr) = fp_dup(IoOFP(dstr), IoTYPE(dstr), param);
11175                 /* PL_parser->rsfp_filters entries have fake IoDIRP() */
11176                 if(IoFLAGS(dstr) & IOf_FAKE_DIRP) {
11177                     /* I have no idea why fake dirp (rsfps)
11178                        should be treated differently but otherwise
11179                        we end up with leaks -- sky*/
11180                     IoTOP_GV(dstr)      = gv_dup_inc(IoTOP_GV(dstr), param);
11181                     IoFMT_GV(dstr)      = gv_dup_inc(IoFMT_GV(dstr), param);
11182                     IoBOTTOM_GV(dstr)   = gv_dup_inc(IoBOTTOM_GV(dstr), param);
11183                 } else {
11184                     IoTOP_GV(dstr)      = gv_dup(IoTOP_GV(dstr), param);
11185                     IoFMT_GV(dstr)      = gv_dup(IoFMT_GV(dstr), param);
11186                     IoBOTTOM_GV(dstr)   = gv_dup(IoBOTTOM_GV(dstr), param);
11187                     if (IoDIRP(dstr)) {
11188                         IoDIRP(dstr)    = dirp_dup(IoDIRP(dstr));
11189                     } else {
11190                         NOOP;
11191                         /* IoDIRP(dstr) is already a copy of IoDIRP(sstr)  */
11192                     }
11193                 }
11194                 IoTOP_NAME(dstr)        = SAVEPV(IoTOP_NAME(dstr));
11195                 IoFMT_NAME(dstr)        = SAVEPV(IoFMT_NAME(dstr));
11196                 IoBOTTOM_NAME(dstr)     = SAVEPV(IoBOTTOM_NAME(dstr));
11197                 break;
11198             case SVt_PVAV:
11199                 /* avoid cloning an empty array */
11200                 if (AvARRAY((const AV *)sstr) && AvFILLp((const AV *)sstr) >= 0) {
11201                     SV **dst_ary, **src_ary;
11202                     SSize_t items = AvFILLp((const AV *)sstr) + 1;
11203
11204                     src_ary = AvARRAY((const AV *)sstr);
11205                     Newxz(dst_ary, AvMAX((const AV *)sstr)+1, SV*);
11206                     ptr_table_store(PL_ptr_table, src_ary, dst_ary);
11207                     AvARRAY(MUTABLE_AV(dstr)) = dst_ary;
11208                     AvALLOC((const AV *)dstr) = dst_ary;
11209                     if (AvREAL((const AV *)sstr)) {
11210                         dst_ary = sv_dup_inc_multiple(src_ary, dst_ary, items,
11211                                                       param);
11212                     }
11213                     else {
11214                         while (items-- > 0)
11215                             *dst_ary++ = sv_dup(*src_ary++, param);
11216                         if (!(param->flags & CLONEf_COPY_STACKS)
11217                              && AvREIFY(sstr))
11218                         {
11219                             av_reify(MUTABLE_AV(dstr)); /* #41138 */
11220                         }
11221                     }
11222                     items = AvMAX((const AV *)sstr) - AvFILLp((const AV *)sstr);
11223                     while (items-- > 0) {
11224                         *dst_ary++ = &PL_sv_undef;
11225                     }
11226                 }
11227                 else {
11228                     AvARRAY(MUTABLE_AV(dstr))   = NULL;
11229                     AvALLOC((const AV *)dstr)   = (SV**)NULL;
11230                     AvMAX(  (const AV *)dstr)   = -1;
11231                     AvFILLp((const AV *)dstr)   = -1;
11232                 }
11233                 break;
11234             case SVt_PVHV:
11235                 if (HvARRAY((const HV *)sstr)) {
11236                     STRLEN i = 0;
11237                     const bool sharekeys = !!HvSHAREKEYS(sstr);
11238                     XPVHV * const dxhv = (XPVHV*)SvANY(dstr);
11239                     XPVHV * const sxhv = (XPVHV*)SvANY(sstr);
11240                     char *darray;
11241                     Newx(darray, PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1)
11242                         + (SvOOK(sstr) ? sizeof(struct xpvhv_aux) : 0),
11243                         char);
11244                     HvARRAY(dstr) = (HE**)darray;
11245                     while (i <= sxhv->xhv_max) {
11246                         const HE * const source = HvARRAY(sstr)[i];
11247                         HvARRAY(dstr)[i] = source
11248                             ? he_dup(source, sharekeys, param) : 0;
11249                         ++i;
11250                     }
11251                     if (SvOOK(sstr)) {
11252                         HEK *hvname;
11253                         const struct xpvhv_aux * const saux = HvAUX(sstr);
11254                         struct xpvhv_aux * const daux = HvAUX(dstr);
11255                         /* This flag isn't copied.  */
11256                         /* SvOOK_on(hv) attacks the IV flags.  */
11257                         SvFLAGS(dstr) |= SVf_OOK;
11258
11259                         hvname = saux->xhv_name;
11260                         daux->xhv_name = hek_dup(hvname, param);
11261
11262                         daux->xhv_riter = saux->xhv_riter;
11263                         daux->xhv_eiter = saux->xhv_eiter
11264                             ? he_dup(saux->xhv_eiter,
11265                                         cBOOL(HvSHAREKEYS(sstr)), param) : 0;
11266                         /* backref array needs refcnt=2; see sv_add_backref */
11267                         daux->xhv_backreferences =
11268                             saux->xhv_backreferences
11269                             ? MUTABLE_AV(SvREFCNT_inc(
11270                                                       sv_dup_inc((const SV *)saux->xhv_backreferences, param)))
11271                                 : 0;
11272
11273                         daux->xhv_mro_meta = saux->xhv_mro_meta
11274                             ? mro_meta_dup(saux->xhv_mro_meta, param)
11275                             : 0;
11276
11277                         /* Record stashes for possible cloning in Perl_clone(). */
11278                         if (hvname)
11279                             av_push(param->stashes, dstr);
11280                     }
11281                 }
11282                 else
11283                     HvARRAY(MUTABLE_HV(dstr)) = NULL;
11284                 break;
11285             case SVt_PVCV:
11286                 if (!(param->flags & CLONEf_COPY_STACKS)) {
11287                     CvDEPTH(dstr) = 0;
11288                 }
11289             case SVt_PVFM:
11290                 /* NOTE: not refcounted */
11291                 CvSTASH(dstr)   = hv_dup(CvSTASH(dstr), param);
11292                 OP_REFCNT_LOCK;
11293                 if (!CvISXSUB(dstr))
11294                     CvROOT(dstr) = OpREFCNT_inc(CvROOT(dstr));
11295                 OP_REFCNT_UNLOCK;
11296                 if (CvCONST(dstr) && CvISXSUB(dstr)) {
11297                     CvXSUBANY(dstr).any_ptr =
11298                         sv_dup_inc((const SV *)CvXSUBANY(dstr).any_ptr, param);
11299                 }
11300                 /* don't dup if copying back - CvGV isn't refcounted, so the
11301                  * duped GV may never be freed. A bit of a hack! DAPM */
11302                 CvGV(dstr)      = (param->flags & CLONEf_JOIN_IN) ?
11303                     NULL : gv_dup(CvGV(dstr), param) ;
11304                 PAD_DUP(CvPADLIST(dstr), CvPADLIST(sstr), param);
11305                 CvOUTSIDE(dstr) =
11306                     CvWEAKOUTSIDE(sstr)
11307                     ? cv_dup(    CvOUTSIDE(dstr), param)
11308                     : cv_dup_inc(CvOUTSIDE(dstr), param);
11309                 if (!CvISXSUB(dstr))
11310                     CvFILE(dstr) = SAVEPV(CvFILE(dstr));
11311                 break;
11312             }
11313         }
11314     }
11315
11316     if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
11317         ++PL_sv_objcount;
11318
11319     return dstr;
11320  }
11321
11322 /* duplicate a context */
11323
11324 PERL_CONTEXT *
11325 Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
11326 {
11327     PERL_CONTEXT *ncxs;
11328
11329     PERL_ARGS_ASSERT_CX_DUP;
11330
11331     if (!cxs)
11332         return (PERL_CONTEXT*)NULL;
11333
11334     /* look for it in the table first */
11335     ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
11336     if (ncxs)
11337         return ncxs;
11338
11339     /* create anew and remember what it is */
11340     Newx(ncxs, max + 1, PERL_CONTEXT);
11341     ptr_table_store(PL_ptr_table, cxs, ncxs);
11342     Copy(cxs, ncxs, max + 1, PERL_CONTEXT);
11343
11344     while (ix >= 0) {
11345         PERL_CONTEXT * const ncx = &ncxs[ix];
11346         if (CxTYPE(ncx) == CXt_SUBST) {
11347             Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
11348         }
11349         else {
11350             switch (CxTYPE(ncx)) {
11351             case CXt_SUB:
11352                 ncx->blk_sub.cv         = (ncx->blk_sub.olddepth == 0
11353                                            ? cv_dup_inc(ncx->blk_sub.cv, param)
11354                                            : cv_dup(ncx->blk_sub.cv,param));
11355                 ncx->blk_sub.argarray   = (CxHASARGS(ncx)
11356                                            ? av_dup_inc(ncx->blk_sub.argarray,
11357                                                         param)
11358                                            : NULL);
11359                 ncx->blk_sub.savearray  = av_dup_inc(ncx->blk_sub.savearray,
11360                                                      param);
11361                 ncx->blk_sub.oldcomppad = (PAD*)ptr_table_fetch(PL_ptr_table,
11362                                            ncx->blk_sub.oldcomppad);
11363                 break;
11364             case CXt_EVAL:
11365                 ncx->blk_eval.old_namesv = sv_dup_inc(ncx->blk_eval.old_namesv,
11366                                                       param);
11367                 ncx->blk_eval.cur_text  = sv_dup(ncx->blk_eval.cur_text, param);
11368                 break;
11369             case CXt_LOOP_LAZYSV:
11370                 ncx->blk_loop.state_u.lazysv.end
11371                     = sv_dup_inc(ncx->blk_loop.state_u.lazysv.end, param);
11372                 /* We are taking advantage of av_dup_inc and sv_dup_inc
11373                    actually being the same function, and order equivalance of
11374                    the two unions.
11375                    We can assert the later [but only at run time :-(]  */
11376                 assert ((void *) &ncx->blk_loop.state_u.ary.ary ==
11377                         (void *) &ncx->blk_loop.state_u.lazysv.cur);
11378             case CXt_LOOP_FOR:
11379                 ncx->blk_loop.state_u.ary.ary
11380                     = av_dup_inc(ncx->blk_loop.state_u.ary.ary, param);
11381             case CXt_LOOP_LAZYIV:
11382             case CXt_LOOP_PLAIN:
11383                 if (CxPADLOOP(ncx)) {
11384                     ncx->blk_loop.oldcomppad
11385                         = (PAD*)ptr_table_fetch(PL_ptr_table,
11386                                                 ncx->blk_loop.oldcomppad);
11387                 } else {
11388                     ncx->blk_loop.oldcomppad
11389                         = (PAD*)gv_dup((const GV *)ncx->blk_loop.oldcomppad,
11390                                        param);
11391                 }
11392                 break;
11393             case CXt_FORMAT:
11394                 ncx->blk_format.cv      = cv_dup(ncx->blk_format.cv, param);
11395                 ncx->blk_format.gv      = gv_dup(ncx->blk_format.gv, param);
11396                 ncx->blk_format.dfoutgv = gv_dup_inc(ncx->blk_format.dfoutgv,
11397                                                      param);
11398                 break;
11399             case CXt_BLOCK:
11400             case CXt_NULL:
11401                 break;
11402             }
11403         }
11404         --ix;
11405     }
11406     return ncxs;
11407 }
11408
11409 /* duplicate a stack info structure */
11410
11411 PERL_SI *
11412 Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
11413 {
11414     PERL_SI *nsi;
11415
11416     PERL_ARGS_ASSERT_SI_DUP;
11417
11418     if (!si)
11419         return (PERL_SI*)NULL;
11420
11421     /* look for it in the table first */
11422     nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
11423     if (nsi)
11424         return nsi;
11425
11426     /* create anew and remember what it is */
11427     Newxz(nsi, 1, PERL_SI);
11428     ptr_table_store(PL_ptr_table, si, nsi);
11429
11430     nsi->si_stack       = av_dup_inc(si->si_stack, param);
11431     nsi->si_cxix        = si->si_cxix;
11432     nsi->si_cxmax       = si->si_cxmax;
11433     nsi->si_cxstack     = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
11434     nsi->si_type        = si->si_type;
11435     nsi->si_prev        = si_dup(si->si_prev, param);
11436     nsi->si_next        = si_dup(si->si_next, param);
11437     nsi->si_markoff     = si->si_markoff;
11438
11439     return nsi;
11440 }
11441
11442 #define POPINT(ss,ix)   ((ss)[--(ix)].any_i32)
11443 #define TOPINT(ss,ix)   ((ss)[ix].any_i32)
11444 #define POPLONG(ss,ix)  ((ss)[--(ix)].any_long)
11445 #define TOPLONG(ss,ix)  ((ss)[ix].any_long)
11446 #define POPIV(ss,ix)    ((ss)[--(ix)].any_iv)
11447 #define TOPIV(ss,ix)    ((ss)[ix].any_iv)
11448 #define POPUV(ss,ix)    ((ss)[--(ix)].any_uv)
11449 #define TOPUV(ss,ix)    ((ss)[ix].any_uv)
11450 #define POPBOOL(ss,ix)  ((ss)[--(ix)].any_bool)
11451 #define TOPBOOL(ss,ix)  ((ss)[ix].any_bool)
11452 #define POPPTR(ss,ix)   ((ss)[--(ix)].any_ptr)
11453 #define TOPPTR(ss,ix)   ((ss)[ix].any_ptr)
11454 #define POPDPTR(ss,ix)  ((ss)[--(ix)].any_dptr)
11455 #define TOPDPTR(ss,ix)  ((ss)[ix].any_dptr)
11456 #define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
11457 #define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
11458
11459 /* XXXXX todo */
11460 #define pv_dup_inc(p)   SAVEPV(p)
11461 #define pv_dup(p)       SAVEPV(p)
11462 #define svp_dup_inc(p,pp)       any_dup(p,pp)
11463
11464 /* map any object to the new equivent - either something in the
11465  * ptr table, or something in the interpreter structure
11466  */
11467
11468 void *
11469 Perl_any_dup(pTHX_ void *v, const PerlInterpreter *proto_perl)
11470 {
11471     void *ret;
11472
11473     PERL_ARGS_ASSERT_ANY_DUP;
11474
11475     if (!v)
11476         return (void*)NULL;
11477
11478     /* look for it in the table first */
11479     ret = ptr_table_fetch(PL_ptr_table, v);
11480     if (ret)
11481         return ret;
11482
11483     /* see if it is part of the interpreter structure */
11484     if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
11485         ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
11486     else {
11487         ret = v;
11488     }
11489
11490     return ret;
11491 }
11492
11493 /* duplicate the save stack */
11494
11495 ANY *
11496 Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
11497 {
11498     dVAR;
11499     ANY * const ss      = proto_perl->Isavestack;
11500     const I32 max       = proto_perl->Isavestack_max;
11501     I32 ix              = proto_perl->Isavestack_ix;
11502     ANY *nss;
11503     const SV *sv;
11504     const GV *gv;
11505     const AV *av;
11506     const HV *hv;
11507     void* ptr;
11508     int intval;
11509     long longval;
11510     GP *gp;
11511     IV iv;
11512     I32 i;
11513     char *c = NULL;
11514     void (*dptr) (void*);
11515     void (*dxptr) (pTHX_ void*);
11516
11517     PERL_ARGS_ASSERT_SS_DUP;
11518
11519     Newxz(nss, max, ANY);
11520
11521     while (ix > 0) {
11522         const UV uv = POPUV(ss,ix);
11523         const U8 type = (U8)uv & SAVE_MASK;
11524
11525         TOPUV(nss,ix) = uv;
11526         switch (type) {
11527         case SAVEt_CLEARSV:
11528             break;
11529         case SAVEt_HELEM:               /* hash element */
11530             sv = (const SV *)POPPTR(ss,ix);
11531             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11532             /* fall through */
11533         case SAVEt_ITEM:                        /* normal string */
11534         case SAVEt_SV:                          /* scalar reference */
11535             sv = (const SV *)POPPTR(ss,ix);
11536             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11537             /* fall through */
11538         case SAVEt_FREESV:
11539         case SAVEt_MORTALIZESV:
11540             sv = (const SV *)POPPTR(ss,ix);
11541             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11542             break;
11543         case SAVEt_SHARED_PVREF:                /* char* in shared space */
11544             c = (char*)POPPTR(ss,ix);
11545             TOPPTR(nss,ix) = savesharedpv(c);
11546             ptr = POPPTR(ss,ix);
11547             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11548             break;
11549         case SAVEt_GENERIC_SVREF:               /* generic sv */
11550         case SAVEt_SVREF:                       /* scalar reference */
11551             sv = (const SV *)POPPTR(ss,ix);
11552             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11553             ptr = POPPTR(ss,ix);
11554             TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
11555             break;
11556         case SAVEt_HV:                          /* hash reference */
11557         case SAVEt_AV:                          /* array reference */
11558             sv = (const SV *) POPPTR(ss,ix);
11559             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11560             /* fall through */
11561         case SAVEt_COMPPAD:
11562         case SAVEt_NSTAB:
11563             sv = (const SV *) POPPTR(ss,ix);
11564             TOPPTR(nss,ix) = sv_dup(sv, param);
11565             break;
11566         case SAVEt_INT:                         /* int reference */
11567             ptr = POPPTR(ss,ix);
11568             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11569             intval = (int)POPINT(ss,ix);
11570             TOPINT(nss,ix) = intval;
11571             break;
11572         case SAVEt_LONG:                        /* long reference */
11573             ptr = POPPTR(ss,ix);
11574             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11575             longval = (long)POPLONG(ss,ix);
11576             TOPLONG(nss,ix) = longval;
11577             break;
11578         case SAVEt_I32:                         /* I32 reference */
11579         case SAVEt_COP_ARYBASE:                 /* call CopARYBASE_set */
11580             ptr = POPPTR(ss,ix);
11581             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11582             i = POPINT(ss,ix);
11583             TOPINT(nss,ix) = i;
11584             break;
11585         case SAVEt_IV:                          /* IV reference */
11586             ptr = POPPTR(ss,ix);
11587             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11588             iv = POPIV(ss,ix);
11589             TOPIV(nss,ix) = iv;
11590             break;
11591         case SAVEt_HPTR:                        /* HV* reference */
11592         case SAVEt_APTR:                        /* AV* reference */
11593         case SAVEt_SPTR:                        /* SV* reference */
11594             ptr = POPPTR(ss,ix);
11595             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11596             sv = (const SV *)POPPTR(ss,ix);
11597             TOPPTR(nss,ix) = sv_dup(sv, param);
11598             break;
11599         case SAVEt_VPTR:                        /* random* reference */
11600             ptr = POPPTR(ss,ix);
11601             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11602             /* Fall through */
11603         case SAVEt_INT_SMALL:
11604         case SAVEt_I32_SMALL:
11605         case SAVEt_I16:                         /* I16 reference */
11606         case SAVEt_I8:                          /* I8 reference */
11607         case SAVEt_BOOL:
11608             ptr = POPPTR(ss,ix);
11609             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11610             break;
11611         case SAVEt_GENERIC_PVREF:               /* generic char* */
11612         case SAVEt_PPTR:                        /* char* reference */
11613             ptr = POPPTR(ss,ix);
11614             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11615             c = (char*)POPPTR(ss,ix);
11616             TOPPTR(nss,ix) = pv_dup(c);
11617             break;
11618         case SAVEt_GP:                          /* scalar reference */
11619             gv = (const GV *)POPPTR(ss,ix);
11620             TOPPTR(nss,ix) = gv_dup_inc(gv, param);
11621             gp = (GP*)POPPTR(ss,ix);
11622             TOPPTR(nss,ix) = gp = gp_dup(gp, param);
11623             (void)GpREFCNT_inc(gp);
11624             i = POPINT(ss,ix);
11625             TOPINT(nss,ix) = i;
11626             break;
11627         case SAVEt_FREEOP:
11628             ptr = POPPTR(ss,ix);
11629             if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
11630                 /* these are assumed to be refcounted properly */
11631                 OP *o;
11632                 switch (((OP*)ptr)->op_type) {
11633                 case OP_LEAVESUB:
11634                 case OP_LEAVESUBLV:
11635                 case OP_LEAVEEVAL:
11636                 case OP_LEAVE:
11637                 case OP_SCOPE:
11638                 case OP_LEAVEWRITE:
11639                     TOPPTR(nss,ix) = ptr;
11640                     o = (OP*)ptr;
11641                     OP_REFCNT_LOCK;
11642                     (void) OpREFCNT_inc(o);
11643                     OP_REFCNT_UNLOCK;
11644                     break;
11645                 default:
11646                     TOPPTR(nss,ix) = NULL;
11647                     break;
11648                 }
11649             }
11650             else
11651                 TOPPTR(nss,ix) = NULL;
11652             break;
11653         case SAVEt_DELETE:
11654             hv = (const HV *)POPPTR(ss,ix);
11655             TOPPTR(nss,ix) = hv_dup_inc(hv, param);
11656             i = POPINT(ss,ix);
11657             TOPINT(nss,ix) = i;
11658             /* Fall through */
11659         case SAVEt_FREEPV:
11660             c = (char*)POPPTR(ss,ix);
11661             TOPPTR(nss,ix) = pv_dup_inc(c);
11662             break;
11663         case SAVEt_STACK_POS:           /* Position on Perl stack */
11664             i = POPINT(ss,ix);
11665             TOPINT(nss,ix) = i;
11666             break;
11667         case SAVEt_DESTRUCTOR:
11668             ptr = POPPTR(ss,ix);
11669             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);  /* XXX quite arbitrary */
11670             dptr = POPDPTR(ss,ix);
11671             TOPDPTR(nss,ix) = DPTR2FPTR(void (*)(void*),
11672                                         any_dup(FPTR2DPTR(void *, dptr),
11673                                                 proto_perl));
11674             break;
11675         case SAVEt_DESTRUCTOR_X:
11676             ptr = POPPTR(ss,ix);
11677             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);  /* XXX quite arbitrary */
11678             dxptr = POPDXPTR(ss,ix);
11679             TOPDXPTR(nss,ix) = DPTR2FPTR(void (*)(pTHX_ void*),
11680                                          any_dup(FPTR2DPTR(void *, dxptr),
11681                                                  proto_perl));
11682             break;
11683         case SAVEt_REGCONTEXT:
11684         case SAVEt_ALLOC:
11685             ix -= uv >> SAVE_TIGHT_SHIFT;
11686             break;
11687         case SAVEt_AELEM:               /* array element */
11688             sv = (const SV *)POPPTR(ss,ix);
11689             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11690             i = POPINT(ss,ix);
11691             TOPINT(nss,ix) = i;
11692             av = (const AV *)POPPTR(ss,ix);
11693             TOPPTR(nss,ix) = av_dup_inc(av, param);
11694             break;
11695         case SAVEt_OP:
11696             ptr = POPPTR(ss,ix);
11697             TOPPTR(nss,ix) = ptr;
11698             break;
11699         case SAVEt_HINTS:
11700             ptr = POPPTR(ss,ix);
11701             if (ptr) {
11702                 HINTS_REFCNT_LOCK;
11703                 ((struct refcounted_he *)ptr)->refcounted_he_refcnt++;
11704                 HINTS_REFCNT_UNLOCK;
11705             }
11706             TOPPTR(nss,ix) = ptr;
11707             i = POPINT(ss,ix);
11708             TOPINT(nss,ix) = i;
11709             if (i & HINT_LOCALIZE_HH) {
11710                 hv = (const HV *)POPPTR(ss,ix);
11711                 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
11712             }
11713             break;
11714         case SAVEt_PADSV_AND_MORTALIZE:
11715             longval = (long)POPLONG(ss,ix);
11716             TOPLONG(nss,ix) = longval;
11717             ptr = POPPTR(ss,ix);
11718             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11719             sv = (const SV *)POPPTR(ss,ix);
11720             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11721             break;
11722         case SAVEt_SET_SVFLAGS:
11723             i = POPINT(ss,ix);
11724             TOPINT(nss,ix) = i;
11725             i = POPINT(ss,ix);
11726             TOPINT(nss,ix) = i;
11727             sv = (const SV *)POPPTR(ss,ix);
11728             TOPPTR(nss,ix) = sv_dup(sv, param);
11729             break;
11730         case SAVEt_RE_STATE:
11731             {
11732                 const struct re_save_state *const old_state
11733                     = (struct re_save_state *)
11734                     (ss + ix - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
11735                 struct re_save_state *const new_state
11736                     = (struct re_save_state *)
11737                     (nss + ix - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
11738
11739                 Copy(old_state, new_state, 1, struct re_save_state);
11740                 ix -= SAVESTACK_ALLOC_FOR_RE_SAVE_STATE;
11741
11742                 new_state->re_state_bostr
11743                     = pv_dup(old_state->re_state_bostr);
11744                 new_state->re_state_reginput
11745                     = pv_dup(old_state->re_state_reginput);
11746                 new_state->re_state_regeol
11747                     = pv_dup(old_state->re_state_regeol);
11748                 new_state->re_state_regoffs
11749                     = (regexp_paren_pair*)
11750                         any_dup(old_state->re_state_regoffs, proto_perl);
11751                 new_state->re_state_reglastparen
11752                     = (U32*) any_dup(old_state->re_state_reglastparen, 
11753                               proto_perl);
11754                 new_state->re_state_reglastcloseparen
11755                     = (U32*)any_dup(old_state->re_state_reglastcloseparen,
11756                               proto_perl);
11757                 /* XXX This just has to be broken. The old save_re_context
11758                    code did SAVEGENERICPV(PL_reg_start_tmp);
11759                    PL_reg_start_tmp is char **.
11760                    Look above to what the dup code does for
11761                    SAVEt_GENERIC_PVREF
11762                    It can never have worked.
11763                    So this is merely a faithful copy of the exiting bug:  */
11764                 new_state->re_state_reg_start_tmp
11765                     = (char **) pv_dup((char *)
11766                                       old_state->re_state_reg_start_tmp);
11767                 /* I assume that it only ever "worked" because no-one called
11768                    (pseudo)fork while the regexp engine had re-entered itself.
11769                 */
11770 #ifdef PERL_OLD_COPY_ON_WRITE
11771                 new_state->re_state_nrs
11772                     = sv_dup(old_state->re_state_nrs, param);
11773 #endif
11774                 new_state->re_state_reg_magic
11775                     = (MAGIC*) any_dup(old_state->re_state_reg_magic, 
11776                                proto_perl);
11777                 new_state->re_state_reg_oldcurpm
11778                     = (PMOP*) any_dup(old_state->re_state_reg_oldcurpm, 
11779                               proto_perl);
11780                 new_state->re_state_reg_curpm
11781                     = (PMOP*)  any_dup(old_state->re_state_reg_curpm, 
11782                                proto_perl);
11783                 new_state->re_state_reg_oldsaved
11784                     = pv_dup(old_state->re_state_reg_oldsaved);
11785                 new_state->re_state_reg_poscache
11786                     = pv_dup(old_state->re_state_reg_poscache);
11787                 new_state->re_state_reg_starttry
11788                     = pv_dup(old_state->re_state_reg_starttry);
11789                 break;
11790             }
11791         case SAVEt_COMPILE_WARNINGS:
11792             ptr = POPPTR(ss,ix);
11793             TOPPTR(nss,ix) = DUP_WARNINGS((STRLEN*)ptr);
11794             break;
11795         case SAVEt_PARSER:
11796             ptr = POPPTR(ss,ix);
11797             TOPPTR(nss,ix) = parser_dup((const yy_parser*)ptr, param);
11798             break;
11799         default:
11800             Perl_croak(aTHX_
11801                        "panic: ss_dup inconsistency (%"IVdf")", (IV) type);
11802         }
11803     }
11804
11805     return nss;
11806 }
11807
11808
11809 /* if sv is a stash, call $class->CLONE_SKIP(), and set the SVphv_CLONEABLE
11810  * flag to the result. This is done for each stash before cloning starts,
11811  * so we know which stashes want their objects cloned */
11812
11813 static void
11814 do_mark_cloneable_stash(pTHX_ SV *const sv)
11815 {
11816     const HEK * const hvname = HvNAME_HEK((const HV *)sv);
11817     if (hvname) {
11818         GV* const cloner = gv_fetchmethod_autoload(MUTABLE_HV(sv), "CLONE_SKIP", 0);
11819         SvFLAGS(sv) |= SVphv_CLONEABLE; /* clone objects by default */
11820         if (cloner && GvCV(cloner)) {
11821             dSP;
11822             UV status;
11823
11824             ENTER;
11825             SAVETMPS;
11826             PUSHMARK(SP);
11827             mXPUSHs(newSVhek(hvname));
11828             PUTBACK;
11829             call_sv(MUTABLE_SV(GvCV(cloner)), G_SCALAR);
11830             SPAGAIN;
11831             status = POPu;
11832             PUTBACK;
11833             FREETMPS;
11834             LEAVE;
11835             if (status)
11836                 SvFLAGS(sv) &= ~SVphv_CLONEABLE;
11837         }
11838     }
11839 }
11840
11841
11842
11843 /*
11844 =for apidoc perl_clone
11845
11846 Create and return a new interpreter by cloning the current one.
11847
11848 perl_clone takes these flags as parameters:
11849
11850 CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
11851 without it we only clone the data and zero the stacks,
11852 with it we copy the stacks and the new perl interpreter is
11853 ready to run at the exact same point as the previous one.
11854 The pseudo-fork code uses COPY_STACKS while the
11855 threads->create doesn't.
11856
11857 CLONEf_KEEP_PTR_TABLE
11858 perl_clone keeps a ptr_table with the pointer of the old
11859 variable as a key and the new variable as a value,
11860 this allows it to check if something has been cloned and not
11861 clone it again but rather just use the value and increase the
11862 refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
11863 the ptr_table using the function
11864 C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
11865 reason to keep it around is if you want to dup some of your own
11866 variable who are outside the graph perl scans, example of this
11867 code is in threads.xs create
11868
11869 CLONEf_CLONE_HOST
11870 This is a win32 thing, it is ignored on unix, it tells perls
11871 win32host code (which is c++) to clone itself, this is needed on
11872 win32 if you want to run two threads at the same time,
11873 if you just want to do some stuff in a separate perl interpreter
11874 and then throw it away and return to the original one,
11875 you don't need to do anything.
11876
11877 =cut
11878 */
11879
11880 /* XXX the above needs expanding by someone who actually understands it ! */
11881 EXTERN_C PerlInterpreter *
11882 perl_clone_host(PerlInterpreter* proto_perl, UV flags);
11883
11884 PerlInterpreter *
11885 perl_clone(PerlInterpreter *proto_perl, UV flags)
11886 {
11887    dVAR;
11888 #ifdef PERL_IMPLICIT_SYS
11889
11890     PERL_ARGS_ASSERT_PERL_CLONE;
11891
11892    /* perlhost.h so we need to call into it
11893    to clone the host, CPerlHost should have a c interface, sky */
11894
11895    if (flags & CLONEf_CLONE_HOST) {
11896        return perl_clone_host(proto_perl,flags);
11897    }
11898    return perl_clone_using(proto_perl, flags,
11899                             proto_perl->IMem,
11900                             proto_perl->IMemShared,
11901                             proto_perl->IMemParse,
11902                             proto_perl->IEnv,
11903                             proto_perl->IStdIO,
11904                             proto_perl->ILIO,
11905                             proto_perl->IDir,
11906                             proto_perl->ISock,
11907                             proto_perl->IProc);
11908 }
11909
11910 PerlInterpreter *
11911 perl_clone_using(PerlInterpreter *proto_perl, UV flags,
11912                  struct IPerlMem* ipM, struct IPerlMem* ipMS,
11913                  struct IPerlMem* ipMP, struct IPerlEnv* ipE,
11914                  struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
11915                  struct IPerlDir* ipD, struct IPerlSock* ipS,
11916                  struct IPerlProc* ipP)
11917 {
11918     /* XXX many of the string copies here can be optimized if they're
11919      * constants; they need to be allocated as common memory and just
11920      * their pointers copied. */
11921
11922     IV i;
11923     CLONE_PARAMS clone_params;
11924     CLONE_PARAMS* const param = &clone_params;
11925
11926     PerlInterpreter * const my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
11927
11928     PERL_ARGS_ASSERT_PERL_CLONE_USING;
11929 #else           /* !PERL_IMPLICIT_SYS */
11930     IV i;
11931     CLONE_PARAMS clone_params;
11932     CLONE_PARAMS* param = &clone_params;
11933     PerlInterpreter * const my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
11934
11935     PERL_ARGS_ASSERT_PERL_CLONE;
11936 #endif          /* PERL_IMPLICIT_SYS */
11937
11938     /* for each stash, determine whether its objects should be cloned */
11939     S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
11940     PERL_SET_THX(my_perl);
11941
11942 #ifdef DEBUGGING
11943     PoisonNew(my_perl, 1, PerlInterpreter);
11944     PL_op = NULL;
11945     PL_curcop = NULL;
11946     PL_markstack = 0;
11947     PL_scopestack = 0;
11948     PL_scopestack_name = 0;
11949     PL_savestack = 0;
11950     PL_savestack_ix = 0;
11951     PL_savestack_max = -1;
11952     PL_sig_pending = 0;
11953     PL_parser = NULL;
11954     Zero(&PL_debug_pad, 1, struct perl_debug_pad);
11955 #  ifdef DEBUG_LEAKING_SCALARS
11956     PL_sv_serial = (((U32)my_perl >> 2) & 0xfff) * 1000000;
11957 #  endif
11958 #else   /* !DEBUGGING */
11959     Zero(my_perl, 1, PerlInterpreter);
11960 #endif  /* DEBUGGING */
11961
11962 #ifdef PERL_IMPLICIT_SYS
11963     /* host pointers */
11964     PL_Mem              = ipM;
11965     PL_MemShared        = ipMS;
11966     PL_MemParse         = ipMP;
11967     PL_Env              = ipE;
11968     PL_StdIO            = ipStd;
11969     PL_LIO              = ipLIO;
11970     PL_Dir              = ipD;
11971     PL_Sock             = ipS;
11972     PL_Proc             = ipP;
11973 #endif          /* PERL_IMPLICIT_SYS */
11974
11975     param->flags = flags;
11976     param->proto_perl = proto_perl;
11977
11978     INIT_TRACK_MEMPOOL(my_perl->Imemory_debug_header, my_perl);
11979
11980     PL_body_arenas = NULL;
11981     Zero(&PL_body_roots, 1, PL_body_roots);
11982     
11983     PL_nice_chunk       = NULL;
11984     PL_nice_chunk_size  = 0;
11985     PL_sv_count         = 0;
11986     PL_sv_objcount      = 0;
11987     PL_sv_root          = NULL;
11988     PL_sv_arenaroot     = NULL;
11989
11990     PL_debug            = proto_perl->Idebug;
11991
11992     PL_hash_seed        = proto_perl->Ihash_seed;
11993     PL_rehash_seed      = proto_perl->Irehash_seed;
11994
11995 #ifdef USE_REENTRANT_API
11996     /* XXX: things like -Dm will segfault here in perlio, but doing
11997      *  PERL_SET_CONTEXT(proto_perl);
11998      * breaks too many other things
11999      */
12000     Perl_reentrant_init(aTHX);
12001 #endif
12002
12003     /* create SV map for pointer relocation */
12004     PL_ptr_table = ptr_table_new();
12005
12006     /* initialize these special pointers as early as possible */
12007     SvANY(&PL_sv_undef)         = NULL;
12008     SvREFCNT(&PL_sv_undef)      = (~(U32)0)/2;
12009     SvFLAGS(&PL_sv_undef)       = SVf_READONLY|SVt_NULL;
12010     ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
12011
12012     SvANY(&PL_sv_no)            = new_XPVNV();
12013     SvREFCNT(&PL_sv_no)         = (~(U32)0)/2;
12014     SvFLAGS(&PL_sv_no)          = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
12015                                   |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
12016     SvPV_set(&PL_sv_no, savepvn(PL_No, 0));
12017     SvCUR_set(&PL_sv_no, 0);
12018     SvLEN_set(&PL_sv_no, 1);
12019     SvIV_set(&PL_sv_no, 0);
12020     SvNV_set(&PL_sv_no, 0);
12021     ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
12022
12023     SvANY(&PL_sv_yes)           = new_XPVNV();
12024     SvREFCNT(&PL_sv_yes)        = (~(U32)0)/2;
12025     SvFLAGS(&PL_sv_yes)         = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
12026                                   |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
12027     SvPV_set(&PL_sv_yes, savepvn(PL_Yes, 1));
12028     SvCUR_set(&PL_sv_yes, 1);
12029     SvLEN_set(&PL_sv_yes, 2);
12030     SvIV_set(&PL_sv_yes, 1);
12031     SvNV_set(&PL_sv_yes, 1);
12032     ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
12033
12034     /* dbargs array probably holds garbage */
12035     PL_dbargs           = NULL;
12036
12037     /* create (a non-shared!) shared string table */
12038     PL_strtab           = newHV();
12039     HvSHAREKEYS_off(PL_strtab);
12040     hv_ksplit(PL_strtab, HvTOTALKEYS(proto_perl->Istrtab));
12041     ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
12042
12043     PL_compiling = proto_perl->Icompiling;
12044
12045     /* These two PVs will be free'd special way so must set them same way op.c does */
12046     PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
12047     ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
12048
12049     PL_compiling.cop_file    = savesharedpv(PL_compiling.cop_file);
12050     ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
12051
12052     ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
12053     PL_compiling.cop_warnings = DUP_WARNINGS(PL_compiling.cop_warnings);
12054     if (PL_compiling.cop_hints_hash) {
12055         HINTS_REFCNT_LOCK;
12056         PL_compiling.cop_hints_hash->refcounted_he_refcnt++;
12057         HINTS_REFCNT_UNLOCK;
12058     }
12059     PL_curcop           = (COP*)any_dup(proto_perl->Icurcop, proto_perl);
12060 #ifdef PERL_DEBUG_READONLY_OPS
12061     PL_slabs = NULL;
12062     PL_slab_count = 0;
12063 #endif
12064
12065     /* pseudo environmental stuff */
12066     PL_origargc         = proto_perl->Iorigargc;
12067     PL_origargv         = proto_perl->Iorigargv;
12068
12069     param->stashes      = newAV();  /* Setup array of objects to call clone on */
12070
12071     /* Set tainting stuff before PerlIO_debug can possibly get called */
12072     PL_tainting         = proto_perl->Itainting;
12073     PL_taint_warn       = proto_perl->Itaint_warn;
12074
12075 #ifdef PERLIO_LAYERS
12076     /* Clone PerlIO tables as soon as we can handle general xx_dup() */
12077     PerlIO_clone(aTHX_ proto_perl, param);
12078 #endif
12079
12080     PL_envgv            = gv_dup(proto_perl->Ienvgv, param);
12081     PL_incgv            = gv_dup(proto_perl->Iincgv, param);
12082     PL_hintgv           = gv_dup(proto_perl->Ihintgv, param);
12083     PL_origfilename     = SAVEPV(proto_perl->Iorigfilename);
12084     PL_diehook          = sv_dup_inc(proto_perl->Idiehook, param);
12085     PL_warnhook         = sv_dup_inc(proto_perl->Iwarnhook, param);
12086
12087     /* switches */
12088     PL_minus_c          = proto_perl->Iminus_c;
12089     PL_patchlevel       = sv_dup_inc(proto_perl->Ipatchlevel, param);
12090     PL_localpatches     = proto_perl->Ilocalpatches;
12091     PL_splitstr         = proto_perl->Isplitstr;
12092     PL_minus_n          = proto_perl->Iminus_n;
12093     PL_minus_p          = proto_perl->Iminus_p;
12094     PL_minus_l          = proto_perl->Iminus_l;
12095     PL_minus_a          = proto_perl->Iminus_a;
12096     PL_minus_E          = proto_perl->Iminus_E;
12097     PL_minus_F          = proto_perl->Iminus_F;
12098     PL_doswitches       = proto_perl->Idoswitches;
12099     PL_dowarn           = proto_perl->Idowarn;
12100     PL_doextract        = proto_perl->Idoextract;
12101     PL_sawampersand     = proto_perl->Isawampersand;
12102     PL_unsafe           = proto_perl->Iunsafe;
12103     PL_inplace          = SAVEPV(proto_perl->Iinplace);
12104     PL_e_script         = sv_dup_inc(proto_perl->Ie_script, param);
12105     PL_perldb           = proto_perl->Iperldb;
12106     PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
12107     PL_exit_flags       = proto_perl->Iexit_flags;
12108
12109     /* magical thingies */
12110     /* XXX time(&PL_basetime) when asked for? */
12111     PL_basetime         = proto_perl->Ibasetime;
12112     PL_formfeed         = sv_dup(proto_perl->Iformfeed, param);
12113
12114     PL_maxsysfd         = proto_perl->Imaxsysfd;
12115     PL_statusvalue      = proto_perl->Istatusvalue;
12116 #ifdef VMS
12117     PL_statusvalue_vms  = proto_perl->Istatusvalue_vms;
12118 #else
12119     PL_statusvalue_posix = proto_perl->Istatusvalue_posix;
12120 #endif
12121     PL_encoding         = sv_dup(proto_perl->Iencoding, param);
12122
12123     sv_setpvs(PERL_DEBUG_PAD(0), "");   /* For regex debugging. */
12124     sv_setpvs(PERL_DEBUG_PAD(1), "");   /* ext/re needs these */
12125     sv_setpvs(PERL_DEBUG_PAD(2), "");   /* even without DEBUGGING. */
12126
12127    
12128     /* RE engine related */
12129     Zero(&PL_reg_state, 1, struct re_save_state);
12130     PL_reginterp_cnt    = 0;
12131     PL_regmatch_slab    = NULL;
12132     
12133     /* Clone the regex array */
12134     /* ORANGE FIXME for plugins, probably in the SV dup code.
12135        newSViv(PTR2IV(CALLREGDUPE(
12136        INT2PTR(REGEXP *, SvIVX(regex)), param))))
12137     */
12138     PL_regex_padav = av_dup_inc(proto_perl->Iregex_padav, param);
12139     PL_regex_pad = AvARRAY(PL_regex_padav);
12140
12141     /* shortcuts to various I/O objects */
12142     PL_ofsgv            = gv_dup(proto_perl->Iofsgv, param);
12143     PL_stdingv          = gv_dup(proto_perl->Istdingv, param);
12144     PL_stderrgv         = gv_dup(proto_perl->Istderrgv, param);
12145     PL_defgv            = gv_dup(proto_perl->Idefgv, param);
12146     PL_argvgv           = gv_dup(proto_perl->Iargvgv, param);
12147     PL_argvoutgv        = gv_dup(proto_perl->Iargvoutgv, param);
12148     PL_argvout_stack    = av_dup_inc(proto_perl->Iargvout_stack, param);
12149
12150     /* shortcuts to regexp stuff */
12151     PL_replgv           = gv_dup(proto_perl->Ireplgv, param);
12152
12153     /* shortcuts to misc objects */
12154     PL_errgv            = gv_dup(proto_perl->Ierrgv, param);
12155
12156     /* shortcuts to debugging objects */
12157     PL_DBgv             = gv_dup(proto_perl->IDBgv, param);
12158     PL_DBline           = gv_dup(proto_perl->IDBline, param);
12159     PL_DBsub            = gv_dup(proto_perl->IDBsub, param);
12160     PL_DBsingle         = sv_dup(proto_perl->IDBsingle, param);
12161     PL_DBtrace          = sv_dup(proto_perl->IDBtrace, param);
12162     PL_DBsignal         = sv_dup(proto_perl->IDBsignal, param);
12163
12164     /* symbol tables */
12165     PL_defstash         = hv_dup_inc(proto_perl->Idefstash, param);
12166     PL_curstash         = hv_dup(proto_perl->Icurstash, param);
12167     PL_debstash         = hv_dup(proto_perl->Idebstash, param);
12168     PL_globalstash      = hv_dup(proto_perl->Iglobalstash, param);
12169     PL_curstname        = sv_dup_inc(proto_perl->Icurstname, param);
12170
12171     PL_beginav          = av_dup_inc(proto_perl->Ibeginav, param);
12172     PL_beginav_save     = av_dup_inc(proto_perl->Ibeginav_save, param);
12173     PL_checkav_save     = av_dup_inc(proto_perl->Icheckav_save, param);
12174     PL_unitcheckav      = av_dup_inc(proto_perl->Iunitcheckav, param);
12175     PL_unitcheckav_save = av_dup_inc(proto_perl->Iunitcheckav_save, param);
12176     PL_endav            = av_dup_inc(proto_perl->Iendav, param);
12177     PL_checkav          = av_dup_inc(proto_perl->Icheckav, param);
12178     PL_initav           = av_dup_inc(proto_perl->Iinitav, param);
12179
12180     PL_sub_generation   = proto_perl->Isub_generation;
12181     PL_isarev           = hv_dup_inc(proto_perl->Iisarev, param);
12182
12183     /* funky return mechanisms */
12184     PL_forkprocess      = proto_perl->Iforkprocess;
12185
12186     /* subprocess state */
12187     PL_fdpid            = av_dup_inc(proto_perl->Ifdpid, param);
12188
12189     /* internal state */
12190     PL_maxo             = proto_perl->Imaxo;
12191     if (proto_perl->Iop_mask)
12192         PL_op_mask      = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
12193     else
12194         PL_op_mask      = NULL;
12195     /* PL_asserting        = proto_perl->Iasserting; */
12196
12197     /* current interpreter roots */
12198     PL_main_cv          = cv_dup_inc(proto_perl->Imain_cv, param);
12199     OP_REFCNT_LOCK;
12200     PL_main_root        = OpREFCNT_inc(proto_perl->Imain_root);
12201     OP_REFCNT_UNLOCK;
12202     PL_main_start       = proto_perl->Imain_start;
12203     PL_eval_root        = proto_perl->Ieval_root;
12204     PL_eval_start       = proto_perl->Ieval_start;
12205
12206     /* runtime control stuff */
12207     PL_curcopdb         = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
12208
12209     PL_filemode         = proto_perl->Ifilemode;
12210     PL_lastfd           = proto_perl->Ilastfd;
12211     PL_oldname          = proto_perl->Ioldname;         /* XXX not quite right */
12212     PL_Argv             = NULL;
12213     PL_Cmd              = NULL;
12214     PL_gensym           = proto_perl->Igensym;
12215     PL_preambleav       = av_dup_inc(proto_perl->Ipreambleav, param);
12216     PL_laststatval      = proto_perl->Ilaststatval;
12217     PL_laststype        = proto_perl->Ilaststype;
12218     PL_mess_sv          = NULL;
12219
12220     PL_ors_sv           = sv_dup_inc(proto_perl->Iors_sv, param);
12221
12222     /* interpreter atexit processing */
12223     PL_exitlistlen      = proto_perl->Iexitlistlen;
12224     if (PL_exitlistlen) {
12225         Newx(PL_exitlist, PL_exitlistlen, PerlExitListEntry);
12226         Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
12227     }
12228     else
12229         PL_exitlist     = (PerlExitListEntry*)NULL;
12230
12231     PL_my_cxt_size = proto_perl->Imy_cxt_size;
12232     if (PL_my_cxt_size) {
12233         Newx(PL_my_cxt_list, PL_my_cxt_size, void *);
12234         Copy(proto_perl->Imy_cxt_list, PL_my_cxt_list, PL_my_cxt_size, void *);
12235 #ifdef PERL_GLOBAL_STRUCT_PRIVATE
12236         Newx(PL_my_cxt_keys, PL_my_cxt_size, const char *);
12237         Copy(proto_perl->Imy_cxt_keys, PL_my_cxt_keys, PL_my_cxt_size, char *);
12238 #endif
12239     }
12240     else {
12241         PL_my_cxt_list  = (void**)NULL;
12242 #ifdef PERL_GLOBAL_STRUCT_PRIVATE
12243         PL_my_cxt_keys  = (const char**)NULL;
12244 #endif
12245     }
12246     PL_modglobal        = hv_dup_inc(proto_perl->Imodglobal, param);
12247     PL_custom_op_names  = hv_dup_inc(proto_perl->Icustom_op_names,param);
12248     PL_custom_op_descs  = hv_dup_inc(proto_perl->Icustom_op_descs,param);
12249
12250     PL_profiledata      = NULL;
12251
12252     PL_compcv                   = cv_dup(proto_perl->Icompcv, param);
12253
12254     PAD_CLONE_VARS(proto_perl, param);
12255
12256 #ifdef HAVE_INTERP_INTERN
12257     sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
12258 #endif
12259
12260     /* more statics moved here */
12261     PL_generation       = proto_perl->Igeneration;
12262     PL_DBcv             = cv_dup(proto_perl->IDBcv, param);
12263
12264     PL_in_clean_objs    = proto_perl->Iin_clean_objs;
12265     PL_in_clean_all     = proto_perl->Iin_clean_all;
12266
12267     PL_uid              = proto_perl->Iuid;
12268     PL_euid             = proto_perl->Ieuid;
12269     PL_gid              = proto_perl->Igid;
12270     PL_egid             = proto_perl->Iegid;
12271     PL_nomemok          = proto_perl->Inomemok;
12272     PL_an               = proto_perl->Ian;
12273     PL_evalseq          = proto_perl->Ievalseq;
12274     PL_origenviron      = proto_perl->Iorigenviron;     /* XXX not quite right */
12275     PL_origalen         = proto_perl->Iorigalen;
12276 #ifdef PERL_USES_PL_PIDSTATUS
12277     PL_pidstatus        = newHV();                      /* XXX flag for cloning? */
12278 #endif
12279     PL_osname           = SAVEPV(proto_perl->Iosname);
12280     PL_sighandlerp      = proto_perl->Isighandlerp;
12281
12282     PL_runops           = proto_perl->Irunops;
12283
12284     PL_parser           = parser_dup(proto_perl->Iparser, param);
12285
12286     /* XXX this only works if the saved cop has already been cloned */
12287     if (proto_perl->Iparser) {
12288         PL_parser->saved_curcop = (COP*)any_dup(
12289                                     proto_perl->Iparser->saved_curcop,
12290                                     proto_perl);
12291     }
12292
12293     PL_subline          = proto_perl->Isubline;
12294     PL_subname          = sv_dup_inc(proto_perl->Isubname, param);
12295
12296 #ifdef FCRYPT
12297     PL_cryptseen        = proto_perl->Icryptseen;
12298 #endif
12299
12300     PL_hints            = proto_perl->Ihints;
12301
12302     PL_amagic_generation        = proto_perl->Iamagic_generation;
12303
12304 #ifdef USE_LOCALE_COLLATE
12305     PL_collation_ix     = proto_perl->Icollation_ix;
12306     PL_collation_name   = SAVEPV(proto_perl->Icollation_name);
12307     PL_collation_standard       = proto_perl->Icollation_standard;
12308     PL_collxfrm_base    = proto_perl->Icollxfrm_base;
12309     PL_collxfrm_mult    = proto_perl->Icollxfrm_mult;
12310 #endif /* USE_LOCALE_COLLATE */
12311
12312 #ifdef USE_LOCALE_NUMERIC
12313     PL_numeric_name     = SAVEPV(proto_perl->Inumeric_name);
12314     PL_numeric_standard = proto_perl->Inumeric_standard;
12315     PL_numeric_local    = proto_perl->Inumeric_local;
12316     PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
12317 #endif /* !USE_LOCALE_NUMERIC */
12318
12319     /* utf8 character classes */
12320     PL_utf8_alnum       = sv_dup_inc(proto_perl->Iutf8_alnum, param);
12321     PL_utf8_ascii       = sv_dup_inc(proto_perl->Iutf8_ascii, param);
12322     PL_utf8_alpha       = sv_dup_inc(proto_perl->Iutf8_alpha, param);
12323     PL_utf8_space       = sv_dup_inc(proto_perl->Iutf8_space, param);
12324     PL_utf8_cntrl       = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
12325     PL_utf8_graph       = sv_dup_inc(proto_perl->Iutf8_graph, param);
12326     PL_utf8_digit       = sv_dup_inc(proto_perl->Iutf8_digit, param);
12327     PL_utf8_upper       = sv_dup_inc(proto_perl->Iutf8_upper, param);
12328     PL_utf8_lower       = sv_dup_inc(proto_perl->Iutf8_lower, param);
12329     PL_utf8_print       = sv_dup_inc(proto_perl->Iutf8_print, param);
12330     PL_utf8_punct       = sv_dup_inc(proto_perl->Iutf8_punct, param);
12331     PL_utf8_xdigit      = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
12332     PL_utf8_mark        = sv_dup_inc(proto_perl->Iutf8_mark, param);
12333     PL_utf8_X_begin     = sv_dup_inc(proto_perl->Iutf8_X_begin, param);
12334     PL_utf8_X_extend    = sv_dup_inc(proto_perl->Iutf8_X_extend, param);
12335     PL_utf8_X_prepend   = sv_dup_inc(proto_perl->Iutf8_X_prepend, param);
12336     PL_utf8_X_non_hangul        = sv_dup_inc(proto_perl->Iutf8_X_non_hangul, param);
12337     PL_utf8_X_L = sv_dup_inc(proto_perl->Iutf8_X_L, param);
12338     PL_utf8_X_LV        = sv_dup_inc(proto_perl->Iutf8_X_LV, param);
12339     PL_utf8_X_LVT       = sv_dup_inc(proto_perl->Iutf8_X_LVT, param);
12340     PL_utf8_X_T = sv_dup_inc(proto_perl->Iutf8_X_T, param);
12341     PL_utf8_X_V = sv_dup_inc(proto_perl->Iutf8_X_V, param);
12342     PL_utf8_X_LV_LVT_V  = sv_dup_inc(proto_perl->Iutf8_X_LV_LVT_V, param);
12343     PL_utf8_toupper     = sv_dup_inc(proto_perl->Iutf8_toupper, param);
12344     PL_utf8_totitle     = sv_dup_inc(proto_perl->Iutf8_totitle, param);
12345     PL_utf8_tolower     = sv_dup_inc(proto_perl->Iutf8_tolower, param);
12346     PL_utf8_tofold      = sv_dup_inc(proto_perl->Iutf8_tofold, param);
12347     PL_utf8_idstart     = sv_dup_inc(proto_perl->Iutf8_idstart, param);
12348     PL_utf8_idcont      = sv_dup_inc(proto_perl->Iutf8_idcont, param);
12349
12350     /* Did the locale setup indicate UTF-8? */
12351     PL_utf8locale       = proto_perl->Iutf8locale;
12352     /* Unicode features (see perlrun/-C) */
12353     PL_unicode          = proto_perl->Iunicode;
12354
12355     /* Pre-5.8 signals control */
12356     PL_signals          = proto_perl->Isignals;
12357
12358     /* times() ticks per second */
12359     PL_clocktick        = proto_perl->Iclocktick;
12360
12361     /* Recursion stopper for PerlIO_find_layer */
12362     PL_in_load_module   = proto_perl->Iin_load_module;
12363
12364     /* sort() routine */
12365     PL_sort_RealCmp     = proto_perl->Isort_RealCmp;
12366
12367     /* Not really needed/useful since the reenrant_retint is "volatile",
12368      * but do it for consistency's sake. */
12369     PL_reentrant_retint = proto_perl->Ireentrant_retint;
12370
12371     /* Hooks to shared SVs and locks. */
12372     PL_sharehook        = proto_perl->Isharehook;
12373     PL_lockhook         = proto_perl->Ilockhook;
12374     PL_unlockhook       = proto_perl->Iunlockhook;
12375     PL_threadhook       = proto_perl->Ithreadhook;
12376     PL_destroyhook      = proto_perl->Idestroyhook;
12377
12378 #ifdef THREADS_HAVE_PIDS
12379     PL_ppid             = proto_perl->Ippid;
12380 #endif
12381
12382     /* swatch cache */
12383     PL_last_swash_hv    = NULL; /* reinits on demand */
12384     PL_last_swash_klen  = 0;
12385     PL_last_swash_key[0]= '\0';
12386     PL_last_swash_tmps  = (U8*)NULL;
12387     PL_last_swash_slen  = 0;
12388
12389     PL_glob_index       = proto_perl->Iglob_index;
12390     PL_srand_called     = proto_perl->Isrand_called;
12391
12392     if (proto_perl->Ipsig_pend) {
12393         Newxz(PL_psig_pend, SIG_SIZE, int);
12394     }
12395     else {
12396         PL_psig_pend    = (int*)NULL;
12397     }
12398
12399     if (proto_perl->Ipsig_name) {
12400         Newx(PL_psig_name, 2 * SIG_SIZE, SV*);
12401         sv_dup_inc_multiple(proto_perl->Ipsig_name, PL_psig_name, 2 * SIG_SIZE,
12402                             param);
12403         PL_psig_ptr = PL_psig_name + SIG_SIZE;
12404     }
12405     else {
12406         PL_psig_ptr     = (SV**)NULL;
12407         PL_psig_name    = (SV**)NULL;
12408     }
12409
12410     /* intrpvar.h stuff */
12411
12412     if (flags & CLONEf_COPY_STACKS) {
12413         /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
12414         PL_tmps_ix              = proto_perl->Itmps_ix;
12415         PL_tmps_max             = proto_perl->Itmps_max;
12416         PL_tmps_floor           = proto_perl->Itmps_floor;
12417         Newx(PL_tmps_stack, PL_tmps_max, SV*);
12418         sv_dup_inc_multiple(proto_perl->Itmps_stack, PL_tmps_stack,
12419                             PL_tmps_ix+1, param);
12420
12421         /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
12422         i = proto_perl->Imarkstack_max - proto_perl->Imarkstack;
12423         Newxz(PL_markstack, i, I32);
12424         PL_markstack_max        = PL_markstack + (proto_perl->Imarkstack_max
12425                                                   - proto_perl->Imarkstack);
12426         PL_markstack_ptr        = PL_markstack + (proto_perl->Imarkstack_ptr
12427                                                   - proto_perl->Imarkstack);
12428         Copy(proto_perl->Imarkstack, PL_markstack,
12429              PL_markstack_ptr - PL_markstack + 1, I32);
12430
12431         /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
12432          * NOTE: unlike the others! */
12433         PL_scopestack_ix        = proto_perl->Iscopestack_ix;
12434         PL_scopestack_max       = proto_perl->Iscopestack_max;
12435         Newxz(PL_scopestack, PL_scopestack_max, I32);
12436         Copy(proto_perl->Iscopestack, PL_scopestack, PL_scopestack_ix, I32);
12437
12438 #ifdef DEBUGGING
12439         Newxz(PL_scopestack_name, PL_scopestack_max, const char *);
12440         Copy(proto_perl->Iscopestack_name, PL_scopestack_name, PL_scopestack_ix, const char *);
12441 #endif
12442         /* NOTE: si_dup() looks at PL_markstack */
12443         PL_curstackinfo         = si_dup(proto_perl->Icurstackinfo, param);
12444
12445         /* PL_curstack          = PL_curstackinfo->si_stack; */
12446         PL_curstack             = av_dup(proto_perl->Icurstack, param);
12447         PL_mainstack            = av_dup(proto_perl->Imainstack, param);
12448
12449         /* next PUSHs() etc. set *(PL_stack_sp+1) */
12450         PL_stack_base           = AvARRAY(PL_curstack);
12451         PL_stack_sp             = PL_stack_base + (proto_perl->Istack_sp
12452                                                    - proto_perl->Istack_base);
12453         PL_stack_max            = PL_stack_base + AvMAX(PL_curstack);
12454
12455         /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
12456          * NOTE: unlike the others! */
12457         PL_savestack_ix         = proto_perl->Isavestack_ix;
12458         PL_savestack_max        = proto_perl->Isavestack_max;
12459         /*Newxz(PL_savestack, PL_savestack_max, ANY);*/
12460         PL_savestack            = ss_dup(proto_perl, param);
12461     }
12462     else {
12463         init_stacks();
12464         ENTER;                  /* perl_destruct() wants to LEAVE; */
12465
12466         /* although we're not duplicating the tmps stack, we should still
12467          * add entries for any SVs on the tmps stack that got cloned by a
12468          * non-refcount means (eg a temp in @_); otherwise they will be
12469          * orphaned
12470          */
12471         for (i = 0; i<= proto_perl->Itmps_ix; i++) {
12472             SV * const nsv = MUTABLE_SV(ptr_table_fetch(PL_ptr_table,
12473                     proto_perl->Itmps_stack[i]));
12474             if (nsv && !SvREFCNT(nsv)) {
12475                 PUSH_EXTEND_MORTAL__SV_C(SvREFCNT_inc_simple(nsv));
12476             }
12477         }
12478     }
12479
12480     PL_start_env        = proto_perl->Istart_env;       /* XXXXXX */
12481     PL_top_env          = &PL_start_env;
12482
12483     PL_op               = proto_perl->Iop;
12484
12485     PL_Sv               = NULL;
12486     PL_Xpv              = (XPV*)NULL;
12487     my_perl->Ina        = proto_perl->Ina;
12488
12489     PL_statbuf          = proto_perl->Istatbuf;
12490     PL_statcache        = proto_perl->Istatcache;
12491     PL_statgv           = gv_dup(proto_perl->Istatgv, param);
12492     PL_statname         = sv_dup_inc(proto_perl->Istatname, param);
12493 #ifdef HAS_TIMES
12494     PL_timesbuf         = proto_perl->Itimesbuf;
12495 #endif
12496
12497     PL_tainted          = proto_perl->Itainted;
12498     PL_curpm            = proto_perl->Icurpm;   /* XXX No PMOP ref count */
12499     PL_rs               = sv_dup_inc(proto_perl->Irs, param);
12500     PL_last_in_gv       = gv_dup(proto_perl->Ilast_in_gv, param);
12501     PL_defoutgv         = gv_dup_inc(proto_perl->Idefoutgv, param);
12502     PL_chopset          = proto_perl->Ichopset; /* XXX never deallocated */
12503     PL_toptarget        = sv_dup_inc(proto_perl->Itoptarget, param);
12504     PL_bodytarget       = sv_dup_inc(proto_perl->Ibodytarget, param);
12505     PL_formtarget       = sv_dup(proto_perl->Iformtarget, param);
12506
12507     PL_restartjmpenv    = proto_perl->Irestartjmpenv;
12508     PL_restartop        = proto_perl->Irestartop;
12509     PL_in_eval          = proto_perl->Iin_eval;
12510     PL_delaymagic       = proto_perl->Idelaymagic;
12511     PL_dirty            = proto_perl->Idirty;
12512     PL_localizing       = proto_perl->Ilocalizing;
12513
12514     PL_errors           = sv_dup_inc(proto_perl->Ierrors, param);
12515     PL_hv_fetch_ent_mh  = NULL;
12516     PL_modcount         = proto_perl->Imodcount;
12517     PL_lastgotoprobe    = NULL;
12518     PL_dumpindent       = proto_perl->Idumpindent;
12519
12520     PL_sortcop          = (OP*)any_dup(proto_perl->Isortcop, proto_perl);
12521     PL_sortstash        = hv_dup(proto_perl->Isortstash, param);
12522     PL_firstgv          = gv_dup(proto_perl->Ifirstgv, param);
12523     PL_secondgv         = gv_dup(proto_perl->Isecondgv, param);
12524     PL_efloatbuf        = NULL;         /* reinits on demand */
12525     PL_efloatsize       = 0;                    /* reinits on demand */
12526
12527     /* regex stuff */
12528
12529     PL_screamfirst      = NULL;
12530     PL_screamnext       = NULL;
12531     PL_maxscream        = -1;                   /* reinits on demand */
12532     PL_lastscream       = NULL;
12533
12534
12535     PL_regdummy         = proto_perl->Iregdummy;
12536     PL_colorset         = 0;            /* reinits PL_colors[] */
12537     /*PL_colors[6]      = {0,0,0,0,0,0};*/
12538
12539
12540
12541     /* Pluggable optimizer */
12542     PL_peepp            = proto_perl->Ipeepp;
12543     /* op_free() hook */
12544     PL_opfreehook       = proto_perl->Iopfreehook;
12545
12546     PL_stashcache       = newHV();
12547
12548     PL_watchaddr        = (char **) ptr_table_fetch(PL_ptr_table,
12549                                             proto_perl->Iwatchaddr);
12550     PL_watchok          = PL_watchaddr ? * PL_watchaddr : NULL;
12551     if (PL_debug && PL_watchaddr) {
12552         PerlIO_printf(Perl_debug_log,
12553           "WATCHING: %"UVxf" cloned as %"UVxf" with value %"UVxf"\n",
12554           PTR2UV(proto_perl->Iwatchaddr), PTR2UV(PL_watchaddr),
12555           PTR2UV(PL_watchok));
12556     }
12557
12558     PL_registered_mros  = hv_dup_inc(proto_perl->Iregistered_mros, param);
12559
12560     /* Call the ->CLONE method, if it exists, for each of the stashes
12561        identified by sv_dup() above.
12562     */
12563     while(av_len(param->stashes) != -1) {
12564         HV* const stash = MUTABLE_HV(av_shift(param->stashes));
12565         GV* const cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
12566         if (cloner && GvCV(cloner)) {
12567             dSP;
12568             ENTER;
12569             SAVETMPS;
12570             PUSHMARK(SP);
12571             mXPUSHs(newSVhek(HvNAME_HEK(stash)));
12572             PUTBACK;
12573             call_sv(MUTABLE_SV(GvCV(cloner)), G_DISCARD);
12574             FREETMPS;
12575             LEAVE;
12576         }
12577     }
12578
12579     if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
12580         ptr_table_free(PL_ptr_table);
12581         PL_ptr_table = NULL;
12582     }
12583
12584
12585     SvREFCNT_dec(param->stashes);
12586
12587     /* orphaned? eg threads->new inside BEGIN or use */
12588     if (PL_compcv && ! SvREFCNT(PL_compcv)) {
12589         SvREFCNT_inc_simple_void(PL_compcv);
12590         SAVEFREESV(PL_compcv);
12591     }
12592
12593     return my_perl;
12594 }
12595
12596 #endif /* USE_ITHREADS */
12597
12598 /*
12599 =head1 Unicode Support
12600
12601 =for apidoc sv_recode_to_utf8
12602
12603 The encoding is assumed to be an Encode object, on entry the PV
12604 of the sv is assumed to be octets in that encoding, and the sv
12605 will be converted into Unicode (and UTF-8).
12606
12607 If the sv already is UTF-8 (or if it is not POK), or if the encoding
12608 is not a reference, nothing is done to the sv.  If the encoding is not
12609 an C<Encode::XS> Encoding object, bad things will happen.
12610 (See F<lib/encoding.pm> and L<Encode>).
12611
12612 The PV of the sv is returned.
12613
12614 =cut */
12615
12616 char *
12617 Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
12618 {
12619     dVAR;
12620
12621     PERL_ARGS_ASSERT_SV_RECODE_TO_UTF8;
12622
12623     if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
12624         SV *uni;
12625         STRLEN len;
12626         const char *s;
12627         dSP;
12628         ENTER;
12629         SAVETMPS;
12630         save_re_context();
12631         PUSHMARK(sp);
12632         EXTEND(SP, 3);
12633         XPUSHs(encoding);
12634         XPUSHs(sv);
12635 /*
12636   NI-S 2002/07/09
12637   Passing sv_yes is wrong - it needs to be or'ed set of constants
12638   for Encode::XS, while UTf-8 decode (currently) assumes a true value means
12639   remove converted chars from source.
12640
12641   Both will default the value - let them.
12642
12643         XPUSHs(&PL_sv_yes);
12644 */
12645         PUTBACK;
12646         call_method("decode", G_SCALAR);
12647         SPAGAIN;
12648         uni = POPs;
12649         PUTBACK;
12650         s = SvPV_const(uni, len);
12651         if (s != SvPVX_const(sv)) {
12652             SvGROW(sv, len + 1);
12653             Move(s, SvPVX(sv), len + 1, char);
12654             SvCUR_set(sv, len);
12655         }
12656         FREETMPS;
12657         LEAVE;
12658         SvUTF8_on(sv);
12659         return SvPVX(sv);
12660     }
12661     return SvPOKp(sv) ? SvPVX(sv) : NULL;
12662 }
12663
12664 /*
12665 =for apidoc sv_cat_decode
12666
12667 The encoding is assumed to be an Encode object, the PV of the ssv is
12668 assumed to be octets in that encoding and decoding the input starts
12669 from the position which (PV + *offset) pointed to.  The dsv will be
12670 concatenated the decoded UTF-8 string from ssv.  Decoding will terminate
12671 when the string tstr appears in decoding output or the input ends on
12672 the PV of the ssv. The value which the offset points will be modified
12673 to the last input position on the ssv.
12674
12675 Returns TRUE if the terminator was found, else returns FALSE.
12676
12677 =cut */
12678
12679 bool
12680 Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
12681                    SV *ssv, int *offset, char *tstr, int tlen)
12682 {
12683     dVAR;
12684     bool ret = FALSE;
12685
12686     PERL_ARGS_ASSERT_SV_CAT_DECODE;
12687
12688     if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) {
12689         SV *offsv;
12690         dSP;
12691         ENTER;
12692         SAVETMPS;
12693         save_re_context();
12694         PUSHMARK(sp);
12695         EXTEND(SP, 6);
12696         XPUSHs(encoding);
12697         XPUSHs(dsv);
12698         XPUSHs(ssv);
12699         offsv = newSViv(*offset);
12700         mXPUSHs(offsv);
12701         mXPUSHp(tstr, tlen);
12702         PUTBACK;
12703         call_method("cat_decode", G_SCALAR);
12704         SPAGAIN;
12705         ret = SvTRUE(TOPs);
12706         *offset = SvIV(offsv);
12707         PUTBACK;
12708         FREETMPS;
12709         LEAVE;
12710     }
12711     else
12712         Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
12713     return ret;
12714
12715 }
12716
12717 /* ---------------------------------------------------------------------
12718  *
12719  * support functions for report_uninit()
12720  */
12721
12722 /* the maxiumum size of array or hash where we will scan looking
12723  * for the undefined element that triggered the warning */
12724
12725 #define FUV_MAX_SEARCH_SIZE 1000
12726
12727 /* Look for an entry in the hash whose value has the same SV as val;
12728  * If so, return a mortal copy of the key. */
12729
12730 STATIC SV*
12731 S_find_hash_subscript(pTHX_ const HV *const hv, const SV *const val)
12732 {
12733     dVAR;
12734     register HE **array;
12735     I32 i;
12736
12737     PERL_ARGS_ASSERT_FIND_HASH_SUBSCRIPT;
12738
12739     if (!hv || SvMAGICAL(hv) || !HvARRAY(hv) ||
12740                         (HvTOTALKEYS(hv) > FUV_MAX_SEARCH_SIZE))
12741         return NULL;
12742
12743     array = HvARRAY(hv);
12744
12745     for (i=HvMAX(hv); i>0; i--) {
12746         register HE *entry;
12747         for (entry = array[i]; entry; entry = HeNEXT(entry)) {
12748             if (HeVAL(entry) != val)
12749                 continue;
12750             if (    HeVAL(entry) == &PL_sv_undef ||
12751                     HeVAL(entry) == &PL_sv_placeholder)
12752                 continue;
12753             if (!HeKEY(entry))
12754                 return NULL;
12755             if (HeKLEN(entry) == HEf_SVKEY)
12756                 return sv_mortalcopy(HeKEY_sv(entry));
12757             return sv_2mortal(newSVhek(HeKEY_hek(entry)));
12758         }
12759     }
12760     return NULL;
12761 }
12762
12763 /* Look for an entry in the array whose value has the same SV as val;
12764  * If so, return the index, otherwise return -1. */
12765
12766 STATIC I32
12767 S_find_array_subscript(pTHX_ const AV *const av, const SV *const val)
12768 {
12769     dVAR;
12770
12771     PERL_ARGS_ASSERT_FIND_ARRAY_SUBSCRIPT;
12772
12773     if (!av || SvMAGICAL(av) || !AvARRAY(av) ||
12774                         (AvFILLp(av) > FUV_MAX_SEARCH_SIZE))
12775         return -1;
12776
12777     if (val != &PL_sv_undef) {
12778         SV ** const svp = AvARRAY(av);
12779         I32 i;
12780
12781         for (i=AvFILLp(av); i>=0; i--)
12782             if (svp[i] == val)
12783                 return i;
12784     }
12785     return -1;
12786 }
12787
12788 /* S_varname(): return the name of a variable, optionally with a subscript.
12789  * If gv is non-zero, use the name of that global, along with gvtype (one
12790  * of "$", "@", "%"); otherwise use the name of the lexical at pad offset
12791  * targ.  Depending on the value of the subscript_type flag, return:
12792  */
12793
12794 #define FUV_SUBSCRIPT_NONE      1       /* "@foo"          */
12795 #define FUV_SUBSCRIPT_ARRAY     2       /* "$foo[aindex]"  */
12796 #define FUV_SUBSCRIPT_HASH      3       /* "$foo{keyname}" */
12797 #define FUV_SUBSCRIPT_WITHIN    4       /* "within @foo"   */
12798
12799 STATIC SV*
12800 S_varname(pTHX_ const GV *const gv, const char gvtype, PADOFFSET targ,
12801         const SV *const keyname, I32 aindex, int subscript_type)
12802 {
12803
12804     SV * const name = sv_newmortal();
12805     if (gv) {
12806         char buffer[2];
12807         buffer[0] = gvtype;
12808         buffer[1] = 0;
12809
12810         /* as gv_fullname4(), but add literal '^' for $^FOO names  */
12811
12812         gv_fullname4(name, gv, buffer, 0);
12813
12814         if ((unsigned int)SvPVX(name)[1] <= 26) {
12815             buffer[0] = '^';
12816             buffer[1] = SvPVX(name)[1] + 'A' - 1;
12817
12818             /* Swap the 1 unprintable control character for the 2 byte pretty
12819                version - ie substr($name, 1, 1) = $buffer; */
12820             sv_insert(name, 1, 1, buffer, 2);
12821         }
12822     }
12823     else {
12824         CV * const cv = find_runcv(NULL);
12825         SV *sv;
12826         AV *av;
12827
12828         if (!cv || !CvPADLIST(cv))
12829             return NULL;
12830         av = MUTABLE_AV((*av_fetch(CvPADLIST(cv), 0, FALSE)));
12831         sv = *av_fetch(av, targ, FALSE);
12832         sv_setpvn(name, SvPV_nolen_const(sv), SvCUR(sv));
12833     }
12834
12835     if (subscript_type == FUV_SUBSCRIPT_HASH) {
12836         SV * const sv = newSV(0);
12837         *SvPVX(name) = '$';
12838         Perl_sv_catpvf(aTHX_ name, "{%s}",
12839             pv_display(sv,SvPVX_const(keyname), SvCUR(keyname), 0, 32));
12840         SvREFCNT_dec(sv);
12841     }
12842     else if (subscript_type == FUV_SUBSCRIPT_ARRAY) {
12843         *SvPVX(name) = '$';
12844         Perl_sv_catpvf(aTHX_ name, "[%"IVdf"]", (IV)aindex);
12845     }
12846     else if (subscript_type == FUV_SUBSCRIPT_WITHIN) {
12847         /* We know that name has no magic, so can use 0 instead of SV_GMAGIC */
12848         Perl_sv_insert_flags(aTHX_ name, 0, 0,  STR_WITH_LEN("within "), 0);
12849     }
12850
12851     return name;
12852 }
12853
12854
12855 /*
12856 =for apidoc find_uninit_var
12857
12858 Find the name of the undefined variable (if any) that caused the operator o
12859 to issue a "Use of uninitialized value" warning.
12860 If match is true, only return a name if it's value matches uninit_sv.
12861 So roughly speaking, if a unary operator (such as OP_COS) generates a
12862 warning, then following the direct child of the op may yield an
12863 OP_PADSV or OP_GV that gives the name of the undefined variable. On the
12864 other hand, with OP_ADD there are two branches to follow, so we only print
12865 the variable name if we get an exact match.
12866
12867 The name is returned as a mortal SV.
12868
12869 Assumes that PL_op is the op that originally triggered the error, and that
12870 PL_comppad/PL_curpad points to the currently executing pad.
12871
12872 =cut
12873 */
12874
12875 STATIC SV *
12876 S_find_uninit_var(pTHX_ const OP *const obase, const SV *const uninit_sv,
12877                   bool match)
12878 {
12879     dVAR;
12880     SV *sv;
12881     const GV *gv;
12882     const OP *o, *o2, *kid;
12883
12884     if (!obase || (match && (!uninit_sv || uninit_sv == &PL_sv_undef ||
12885                             uninit_sv == &PL_sv_placeholder)))
12886         return NULL;
12887
12888     switch (obase->op_type) {
12889
12890     case OP_RV2AV:
12891     case OP_RV2HV:
12892     case OP_PADAV:
12893     case OP_PADHV:
12894       {
12895         const bool pad  = (obase->op_type == OP_PADAV || obase->op_type == OP_PADHV);
12896         const bool hash = (obase->op_type == OP_PADHV || obase->op_type == OP_RV2HV);
12897         I32 index = 0;
12898         SV *keysv = NULL;
12899         int subscript_type = FUV_SUBSCRIPT_WITHIN;
12900
12901         if (pad) { /* @lex, %lex */
12902             sv = PAD_SVl(obase->op_targ);
12903             gv = NULL;
12904         }
12905         else {
12906             if (cUNOPx(obase)->op_first->op_type == OP_GV) {
12907             /* @global, %global */
12908                 gv = cGVOPx_gv(cUNOPx(obase)->op_first);
12909                 if (!gv)
12910                     break;
12911                 sv = hash ? MUTABLE_SV(GvHV(gv)): MUTABLE_SV(GvAV(gv));
12912             }
12913             else /* @{expr}, %{expr} */
12914                 return find_uninit_var(cUNOPx(obase)->op_first,
12915                                                     uninit_sv, match);
12916         }
12917
12918         /* attempt to find a match within the aggregate */
12919         if (hash) {
12920             keysv = find_hash_subscript((const HV*)sv, uninit_sv);
12921             if (keysv)
12922                 subscript_type = FUV_SUBSCRIPT_HASH;
12923         }
12924         else {
12925             index = find_array_subscript((const AV *)sv, uninit_sv);
12926             if (index >= 0)
12927                 subscript_type = FUV_SUBSCRIPT_ARRAY;
12928         }
12929
12930         if (match && subscript_type == FUV_SUBSCRIPT_WITHIN)
12931             break;
12932
12933         return varname(gv, hash ? '%' : '@', obase->op_targ,
12934                                     keysv, index, subscript_type);
12935       }
12936
12937     case OP_PADSV:
12938         if (match && PAD_SVl(obase->op_targ) != uninit_sv)
12939             break;
12940         return varname(NULL, '$', obase->op_targ,
12941                                     NULL, 0, FUV_SUBSCRIPT_NONE);
12942
12943     case OP_GVSV:
12944         gv = cGVOPx_gv(obase);
12945         if (!gv || (match && GvSV(gv) != uninit_sv))
12946             break;
12947         return varname(gv, '$', 0, NULL, 0, FUV_SUBSCRIPT_NONE);
12948
12949     case OP_AELEMFAST:
12950         if (obase->op_flags & OPf_SPECIAL) { /* lexical array */
12951             if (match) {
12952                 SV **svp;
12953                 AV *av = MUTABLE_AV(PAD_SV(obase->op_targ));
12954                 if (!av || SvRMAGICAL(av))
12955                     break;
12956                 svp = av_fetch(av, (I32)obase->op_private, FALSE);
12957                 if (!svp || *svp != uninit_sv)
12958                     break;
12959             }
12960             return varname(NULL, '$', obase->op_targ,
12961                     NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
12962         }
12963         else {
12964             gv = cGVOPx_gv(obase);
12965             if (!gv)
12966                 break;
12967             if (match) {
12968                 SV **svp;
12969                 AV *const av = GvAV(gv);
12970                 if (!av || SvRMAGICAL(av))
12971                     break;
12972                 svp = av_fetch(av, (I32)obase->op_private, FALSE);
12973                 if (!svp || *svp != uninit_sv)
12974                     break;
12975             }
12976             return varname(gv, '$', 0,
12977                     NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
12978         }
12979         break;
12980
12981     case OP_EXISTS:
12982         o = cUNOPx(obase)->op_first;
12983         if (!o || o->op_type != OP_NULL ||
12984                 ! (o->op_targ == OP_AELEM || o->op_targ == OP_HELEM))
12985             break;
12986         return find_uninit_var(cBINOPo->op_last, uninit_sv, match);
12987
12988     case OP_AELEM:
12989     case OP_HELEM:
12990         if (PL_op == obase)
12991             /* $a[uninit_expr] or $h{uninit_expr} */
12992             return find_uninit_var(cBINOPx(obase)->op_last, uninit_sv, match);
12993
12994         gv = NULL;
12995         o = cBINOPx(obase)->op_first;
12996         kid = cBINOPx(obase)->op_last;
12997
12998         /* get the av or hv, and optionally the gv */
12999         sv = NULL;
13000         if  (o->op_type == OP_PADAV || o->op_type == OP_PADHV) {
13001             sv = PAD_SV(o->op_targ);
13002         }
13003         else if ((o->op_type == OP_RV2AV || o->op_type == OP_RV2HV)
13004                 && cUNOPo->op_first->op_type == OP_GV)
13005         {
13006             gv = cGVOPx_gv(cUNOPo->op_first);
13007             if (!gv)
13008                 break;
13009             sv = o->op_type
13010                 == OP_RV2HV ? MUTABLE_SV(GvHV(gv)) : MUTABLE_SV(GvAV(gv));
13011         }
13012         if (!sv)
13013             break;
13014
13015         if (kid && kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid))) {
13016             /* index is constant */
13017             if (match) {
13018                 if (SvMAGICAL(sv))
13019                     break;
13020                 if (obase->op_type == OP_HELEM) {
13021                     HE* he = hv_fetch_ent(MUTABLE_HV(sv), cSVOPx_sv(kid), 0, 0);
13022                     if (!he || HeVAL(he) != uninit_sv)
13023                         break;
13024                 }
13025                 else {
13026                     SV * const * const svp = av_fetch(MUTABLE_AV(sv), SvIV(cSVOPx_sv(kid)), FALSE);
13027                     if (!svp || *svp != uninit_sv)
13028                         break;
13029                 }
13030             }
13031             if (obase->op_type == OP_HELEM)
13032                 return varname(gv, '%', o->op_targ,
13033                             cSVOPx_sv(kid), 0, FUV_SUBSCRIPT_HASH);
13034             else
13035                 return varname(gv, '@', o->op_targ, NULL,
13036                             SvIV(cSVOPx_sv(kid)), FUV_SUBSCRIPT_ARRAY);
13037         }
13038         else  {
13039             /* index is an expression;
13040              * attempt to find a match within the aggregate */
13041             if (obase->op_type == OP_HELEM) {
13042                 SV * const keysv = find_hash_subscript((const HV*)sv, uninit_sv);
13043                 if (keysv)
13044                     return varname(gv, '%', o->op_targ,
13045                                                 keysv, 0, FUV_SUBSCRIPT_HASH);
13046             }
13047             else {
13048                 const I32 index
13049                     = find_array_subscript((const AV *)sv, uninit_sv);
13050                 if (index >= 0)
13051                     return varname(gv, '@', o->op_targ,
13052                                         NULL, index, FUV_SUBSCRIPT_ARRAY);
13053             }
13054             if (match)
13055                 break;
13056             return varname(gv,
13057                 (o->op_type == OP_PADAV || o->op_type == OP_RV2AV)
13058                 ? '@' : '%',
13059                 o->op_targ, NULL, 0, FUV_SUBSCRIPT_WITHIN);
13060         }
13061         break;
13062
13063     case OP_AASSIGN:
13064         /* only examine RHS */
13065         return find_uninit_var(cBINOPx(obase)->op_first, uninit_sv, match);
13066
13067     case OP_OPEN:
13068         o = cUNOPx(obase)->op_first;
13069         if (o->op_type == OP_PUSHMARK)
13070             o = o->op_sibling;
13071
13072         if (!o->op_sibling) {
13073             /* one-arg version of open is highly magical */
13074
13075             if (o->op_type == OP_GV) { /* open FOO; */
13076                 gv = cGVOPx_gv(o);
13077                 if (match && GvSV(gv) != uninit_sv)
13078                     break;
13079                 return varname(gv, '$', 0,
13080                             NULL, 0, FUV_SUBSCRIPT_NONE);
13081             }
13082             /* other possibilities not handled are:
13083              * open $x; or open my $x;  should return '${*$x}'
13084              * open expr;               should return '$'.expr ideally
13085              */
13086              break;
13087         }
13088         goto do_op;
13089
13090     /* ops where $_ may be an implicit arg */
13091     case OP_TRANS:
13092     case OP_SUBST:
13093     case OP_MATCH:
13094         if ( !(obase->op_flags & OPf_STACKED)) {
13095             if (uninit_sv == ((obase->op_private & OPpTARGET_MY)
13096                                  ? PAD_SVl(obase->op_targ)
13097                                  : DEFSV))
13098             {
13099                 sv = sv_newmortal();
13100                 sv_setpvs(sv, "$_");
13101                 return sv;
13102             }
13103         }
13104         goto do_op;
13105
13106     case OP_PRTF:
13107     case OP_PRINT:
13108     case OP_SAY:
13109         match = 1; /* print etc can return undef on defined args */
13110         /* skip filehandle as it can't produce 'undef' warning  */
13111         o = cUNOPx(obase)->op_first;
13112         if ((obase->op_flags & OPf_STACKED) && o->op_type == OP_PUSHMARK)
13113             o = o->op_sibling->op_sibling;
13114         goto do_op2;
13115
13116
13117     case OP_ENTEREVAL: /* could be eval $undef or $x='$undef'; eval $x */
13118     case OP_RV2SV:
13119     case OP_CUSTOM: /* XS or custom code could trigger random warnings */
13120
13121         /* the following ops are capable of returning PL_sv_undef even for
13122          * defined arg(s) */
13123
13124     case OP_BACKTICK:
13125     case OP_PIPE_OP:
13126     case OP_FILENO:
13127     case OP_BINMODE:
13128     case OP_TIED:
13129     case OP_GETC:
13130     case OP_SYSREAD:
13131     case OP_SEND:
13132     case OP_IOCTL:
13133     case OP_SOCKET:
13134     case OP_SOCKPAIR:
13135     case OP_BIND:
13136     case OP_CONNECT:
13137     case OP_LISTEN:
13138     case OP_ACCEPT:
13139     case OP_SHUTDOWN:
13140     case OP_SSOCKOPT:
13141     case OP_GETPEERNAME:
13142     case OP_FTRREAD:
13143     case OP_FTRWRITE:
13144     case OP_FTREXEC:
13145     case OP_FTROWNED:
13146     case OP_FTEREAD:
13147     case OP_FTEWRITE:
13148     case OP_FTEEXEC:
13149     case OP_FTEOWNED:
13150     case OP_FTIS:
13151     case OP_FTZERO:
13152     case OP_FTSIZE:
13153     case OP_FTFILE:
13154     case OP_FTDIR:
13155     case OP_FTLINK:
13156     case OP_FTPIPE:
13157     case OP_FTSOCK:
13158     case OP_FTBLK:
13159     case OP_FTCHR:
13160     case OP_FTTTY:
13161     case OP_FTSUID:
13162     case OP_FTSGID:
13163     case OP_FTSVTX:
13164     case OP_FTTEXT:
13165     case OP_FTBINARY:
13166     case OP_FTMTIME:
13167     case OP_FTATIME:
13168     case OP_FTCTIME:
13169     case OP_READLINK:
13170     case OP_OPEN_DIR:
13171     case OP_READDIR:
13172     case OP_TELLDIR:
13173     case OP_SEEKDIR:
13174     case OP_REWINDDIR:
13175     case OP_CLOSEDIR:
13176     case OP_GMTIME:
13177     case OP_ALARM:
13178     case OP_SEMGET:
13179     case OP_GETLOGIN:
13180     case OP_UNDEF:
13181     case OP_SUBSTR:
13182     case OP_AEACH:
13183     case OP_EACH:
13184     case OP_SORT:
13185     case OP_CALLER:
13186     case OP_DOFILE:
13187     case OP_PROTOTYPE:
13188     case OP_NCMP:
13189     case OP_SMARTMATCH:
13190     case OP_UNPACK:
13191     case OP_SYSOPEN:
13192     case OP_SYSSEEK:
13193         match = 1;
13194         goto do_op;
13195
13196     case OP_ENTERSUB:
13197     case OP_GOTO:
13198         /* XXX tmp hack: these two may call an XS sub, and currently
13199           XS subs don't have a SUB entry on the context stack, so CV and
13200           pad determination goes wrong, and BAD things happen. So, just
13201           don't try to determine the value under those circumstances.
13202           Need a better fix at dome point. DAPM 11/2007 */
13203         break;
13204
13205     case OP_FLIP:
13206     case OP_FLOP:
13207     {
13208         GV * const gv = gv_fetchpvs(".", GV_NOTQUAL, SVt_PV);
13209         if (gv && GvSV(gv) == uninit_sv)
13210             return newSVpvs_flags("$.", SVs_TEMP);
13211         goto do_op;
13212     }
13213
13214     case OP_POS:
13215         /* def-ness of rval pos() is independent of the def-ness of its arg */
13216         if ( !(obase->op_flags & OPf_MOD))
13217             break;
13218
13219     case OP_SCHOMP:
13220     case OP_CHOMP:
13221         if (SvROK(PL_rs) && uninit_sv == SvRV(PL_rs))
13222             return newSVpvs_flags("${$/}", SVs_TEMP);
13223         /*FALLTHROUGH*/
13224
13225     default:
13226     do_op:
13227         if (!(obase->op_flags & OPf_KIDS))
13228             break;
13229         o = cUNOPx(obase)->op_first;
13230         
13231     do_op2:
13232         if (!o)
13233             break;
13234
13235         /* if all except one arg are constant, or have no side-effects,
13236          * or are optimized away, then it's unambiguous */
13237         o2 = NULL;
13238         for (kid=o; kid; kid = kid->op_sibling) {
13239             if (kid) {
13240                 const OPCODE type = kid->op_type;
13241                 if ( (type == OP_CONST && SvOK(cSVOPx_sv(kid)))
13242                   || (type == OP_NULL  && ! (kid->op_flags & OPf_KIDS))
13243                   || (type == OP_PUSHMARK)
13244                 )
13245                 continue;
13246             }
13247             if (o2) { /* more than one found */
13248                 o2 = NULL;
13249                 break;
13250             }
13251             o2 = kid;
13252         }
13253         if (o2)
13254             return find_uninit_var(o2, uninit_sv, match);
13255
13256         /* scan all args */
13257         while (o) {
13258             sv = find_uninit_var(o, uninit_sv, 1);
13259             if (sv)
13260                 return sv;
13261             o = o->op_sibling;
13262         }
13263         break;
13264     }
13265     return NULL;
13266 }
13267
13268
13269 /*
13270 =for apidoc report_uninit
13271
13272 Print appropriate "Use of uninitialized variable" warning
13273
13274 =cut
13275 */
13276
13277 void
13278 Perl_report_uninit(pTHX_ const SV *uninit_sv)
13279 {
13280     dVAR;
13281     if (PL_op) {
13282         SV* varname = NULL;
13283         if (uninit_sv) {
13284             varname = find_uninit_var(PL_op, uninit_sv,0);
13285             if (varname)
13286                 sv_insert(varname, 0, 0, " ", 1);
13287         }
13288         Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
13289                 varname ? SvPV_nolen_const(varname) : "",
13290                 " in ", OP_DESC(PL_op));
13291     }
13292     else
13293         Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
13294                     "", "", "");
13295 }
13296
13297 /*
13298  * Local variables:
13299  * c-indentation-style: bsd
13300  * c-basic-offset: 4
13301  * indent-tabs-mode: t
13302  * End:
13303  *
13304  * ex: set ts=8 sts=4 sw=4 noet:
13305  */