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