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