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