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