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