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