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