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