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