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