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