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