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