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