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