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