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