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