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