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