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