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