Fix SEGVs when cloning a typeglob that has been undefined. (RT #64954)
[p5sagit/p5-mst-13.2.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, 2009 by Larry Wall
5  *    and others
6  *
7  *    You may distribute under the terms of either the GNU General Public
8  *    License or the Artistic License, as specified in the README file.
9  *
10  */
11
12 /*
13  * 'I wonder what the Entish is for "yes" and "no",' he thought.
14  *                                                      --Pippin
15  *
16  *     [p.480 of _The Lord of the Rings_, III/iv: "Treebeard"]
17  */
18
19 /*
20  *
21  *
22  * This file contains the code that creates, manipulates and destroys
23  * scalar values (SVs). The other types (AV, HV, GV, etc.) reuse the
24  * structure of an SV, so their creation and destruction is handled
25  * here; higher-level functions are in av.c, hv.c, and so on. Opcode
26  * level functions (eg. substr, split, join) for each of the types are
27  * in the pp*.c files.
28  */
29
30 #include "EXTERN.h"
31 #define PERL_IN_SV_C
32 #include "perl.h"
33 #include "regcomp.h"
34
35 #define FCALL *f
36
37 #ifdef __Lynx__
38 /* Missing proto on LynxOS */
39   char *gconvert(double, int, int,  char *);
40 #endif
41
42 #ifdef PERL_UTF8_CACHE_ASSERT
43 /* if adding more checks watch out for the following tests:
44  *   t/op/index.t t/op/length.t t/op/pat.t t/op/substr.t
45  *   lib/utf8.t lib/Unicode/Collate/t/index.t
46  * --jhi
47  */
48 #   define ASSERT_UTF8_CACHE(cache) \
49     STMT_START { if (cache) { assert((cache)[0] <= (cache)[1]); \
50                               assert((cache)[2] <= (cache)[3]); \
51                               assert((cache)[3] <= (cache)[1]);} \
52                               } STMT_END
53 #else
54 #   define ASSERT_UTF8_CACHE(cache) NOOP
55 #endif
56
57 #ifdef PERL_OLD_COPY_ON_WRITE
58 #define SV_COW_NEXT_SV(sv)      INT2PTR(SV *,SvUVX(sv))
59 #define SV_COW_NEXT_SV_SET(current,next)        SvUV_set(current, PTR2UV(next))
60 /* This is a pessimistic view. Scalar must be purely a read-write PV to copy-
61    on-write.  */
62 #endif
63
64 /* ============================================================================
65
66 =head1 Allocation and deallocation of SVs.
67
68 An SV (or AV, HV, etc.) is allocated in two parts: the head (struct
69 sv, av, hv...) contains type and reference count information, and for
70 many types, a pointer to the body (struct xrv, xpv, xpviv...), which
71 contains fields specific to each type.  Some types store all they need
72 in the head, so don't have a body.
73
74 In all but the most memory-paranoid configuations (ex: PURIFY), heads
75 and bodies are allocated out of arenas, which by default are
76 approximately 4K chunks of memory parcelled up into N heads or bodies.
77 Sv-bodies are allocated by their sv-type, guaranteeing size
78 consistency needed to allocate safely from arrays.
79
80 For SV-heads, the first slot in each arena is reserved, and holds a
81 link to the next arena, some flags, and a note of the number of slots.
82 Snaked through each arena chain is a linked list of free items; when
83 this becomes empty, an extra arena is allocated and divided up into N
84 items which are threaded into the free list.
85
86 SV-bodies are similar, but they use arena-sets by default, which
87 separate the link and info from the arena itself, and reclaim the 1st
88 slot in the arena.  SV-bodies are further described later.
89
90 The following global variables are associated with arenas:
91
92     PL_sv_arenaroot     pointer to list of SV arenas
93     PL_sv_root          pointer to list of free SV structures
94
95     PL_body_arenas      head of linked-list of body arenas
96     PL_body_roots[]     array of pointers to list of free bodies of svtype
97                         arrays are indexed by the svtype needed
98
99 A few special SV heads are not allocated from an arena, but are
100 instead directly created in the interpreter structure, eg PL_sv_undef.
101 The size of arenas can be changed from the default by setting
102 PERL_ARENA_SIZE appropriately at compile time.
103
104 The SV arena serves the secondary purpose of allowing still-live SVs
105 to be located and destroyed during final cleanup.
106
107 At the lowest level, the macros new_SV() and del_SV() grab and free
108 an SV head.  (If debugging with -DD, del_SV() calls the function S_del_sv()
109 to return the SV to the free list with error checking.) new_SV() calls
110 more_sv() / sv_add_arena() to add an extra arena if the free list is empty.
111 SVs in the free list have their SvTYPE field set to all ones.
112
113 At the time of very final cleanup, sv_free_arenas() is called from
114 perl_destruct() to physically free all the arenas allocated since the
115 start of the interpreter.
116
117 The function visit() scans the SV arenas list, and calls a specified
118 function for each SV it finds which is still live - ie which has an SvTYPE
119 other than all 1's, and a non-zero SvREFCNT. visit() is used by the
120 following functions (specified as [function that calls visit()] / [function
121 called by visit() for each SV]):
122
123     sv_report_used() / do_report_used()
124                         dump all remaining SVs (debugging aid)
125
126     sv_clean_objs() / do_clean_objs(),do_clean_named_objs()
127                         Attempt to free all objects pointed to by RVs,
128                         and, unless DISABLE_DESTRUCTOR_KLUDGE is defined,
129                         try to do the same for all objects indirectly
130                         referenced by typeglobs too.  Called once from
131                         perl_destruct(), prior to calling sv_clean_all()
132                         below.
133
134     sv_clean_all() / do_clean_all()
135                         SvREFCNT_dec(sv) each remaining SV, possibly
136                         triggering an sv_free(). It also sets the
137                         SVf_BREAK flag on the SV to indicate that the
138                         refcnt has been artificially lowered, and thus
139                         stopping sv_free() from giving spurious warnings
140                         about SVs which unexpectedly have a refcnt
141                         of zero.  called repeatedly from perl_destruct()
142                         until there are no SVs left.
143
144 =head2 Arena allocator API Summary
145
146 Private API to rest of sv.c
147
148     new_SV(),  del_SV(),
149
150     new_XIV(), del_XIV(),
151     new_XNV(), del_XNV(),
152     etc
153
154 Public API:
155
156     sv_report_used(), sv_clean_objs(), sv_clean_all(), sv_free_arenas()
157
158 =cut
159
160  * ========================================================================= */
161
162 /*
163  * "A time to plant, and a time to uproot what was planted..."
164  */
165
166 void
167 Perl_offer_nice_chunk(pTHX_ void *const chunk, const U32 chunk_size)
168 {
169     dVAR;
170     void *new_chunk;
171     U32 new_chunk_size;
172
173     PERL_ARGS_ASSERT_OFFER_NICE_CHUNK;
174
175     new_chunk = (void *)(chunk);
176     new_chunk_size = (chunk_size);
177     if (new_chunk_size > PL_nice_chunk_size) {
178         Safefree(PL_nice_chunk);
179         PL_nice_chunk = (char *) new_chunk;
180         PL_nice_chunk_size = new_chunk_size;
181     } else {
182         Safefree(chunk);
183     }
184 }
185
186 #ifdef PERL_MEM_LOG
187 #  define MEM_LOG_NEW_SV(sv, file, line, func)  \
188             Perl_mem_log_new_sv(sv, file, line, func)
189 #  define MEM_LOG_DEL_SV(sv, file, line, func)  \
190             Perl_mem_log_del_sv(sv, file, line, func)
191 #else
192 #  define MEM_LOG_NEW_SV(sv, file, line, func)  NOOP
193 #  define MEM_LOG_DEL_SV(sv, file, line, func)  NOOP
194 #endif
195
196 #ifdef DEBUG_LEAKING_SCALARS
197 #  define FREE_SV_DEBUG_FILE(sv) Safefree((sv)->sv_debug_file)
198 #  define DEBUG_SV_SERIAL(sv)                                               \
199     DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) del_SV\n",    \
200             PTR2UV(sv), (long)(sv)->sv_debug_serial))
201 #else
202 #  define FREE_SV_DEBUG_FILE(sv)
203 #  define DEBUG_SV_SERIAL(sv)   NOOP
204 #endif
205
206 #ifdef PERL_POISON
207 #  define SvARENA_CHAIN(sv)     ((sv)->sv_u.svu_rv)
208 #  define SvARENA_CHAIN_SET(sv,val)     (sv)->sv_u.svu_rv = MUTABLE_SV((val))
209 /* Whilst I'd love to do this, it seems that things like to check on
210    unreferenced scalars
211 #  define POSION_SV_HEAD(sv)    PoisonNew(sv, 1, struct STRUCT_SV)
212 */
213 #  define POSION_SV_HEAD(sv)    PoisonNew(&SvANY(sv), 1, void *), \
214                                 PoisonNew(&SvREFCNT(sv), 1, U32)
215 #else
216 #  define SvARENA_CHAIN(sv)     SvANY(sv)
217 #  define SvARENA_CHAIN_SET(sv,val)     SvANY(sv) = (void *)(val)
218 #  define POSION_SV_HEAD(sv)
219 #endif
220
221 /* Mark an SV head as unused, and add to free list.
222  *
223  * If SVf_BREAK is set, skip adding it to the free list, as this SV had
224  * its refcount artificially decremented during global destruction, so
225  * there may be dangling pointers to it. The last thing we want in that
226  * case is for it to be reused. */
227
228 #define plant_SV(p) \
229     STMT_START {                                        \
230         const U32 old_flags = SvFLAGS(p);                       \
231         MEM_LOG_DEL_SV(p, __FILE__, __LINE__, FUNCTION__);  \
232         DEBUG_SV_SERIAL(p);                             \
233         FREE_SV_DEBUG_FILE(p);                          \
234         POSION_SV_HEAD(p);                              \
235         SvFLAGS(p) = SVTYPEMASK;                        \
236         if (!(old_flags & SVf_BREAK)) {         \
237             SvARENA_CHAIN_SET(p, PL_sv_root);   \
238             PL_sv_root = (p);                           \
239         }                                               \
240         --PL_sv_count;                                  \
241     } STMT_END
242
243 #define uproot_SV(p) \
244     STMT_START {                                        \
245         (p) = PL_sv_root;                               \
246         PL_sv_root = MUTABLE_SV(SvARENA_CHAIN(p));              \
247         ++PL_sv_count;                                  \
248     } STMT_END
249
250
251 /* make some more SVs by adding another arena */
252
253 STATIC SV*
254 S_more_sv(pTHX)
255 {
256     dVAR;
257     SV* sv;
258
259     if (PL_nice_chunk) {
260         sv_add_arena(PL_nice_chunk, PL_nice_chunk_size, 0);
261         PL_nice_chunk = NULL;
262         PL_nice_chunk_size = 0;
263     }
264     else {
265         char *chunk;                /* must use New here to match call to */
266         Newx(chunk,PERL_ARENA_SIZE,char);  /* Safefree() in sv_free_arenas() */
267         sv_add_arena(chunk, PERL_ARENA_SIZE, 0);
268     }
269     uproot_SV(sv);
270     return sv;
271 }
272
273 /* new_SV(): return a new, empty SV head */
274
275 #ifdef DEBUG_LEAKING_SCALARS
276 /* provide a real function for a debugger to play with */
277 STATIC SV*
278 S_new_SV(pTHX_ const char *file, int line, const char *func)
279 {
280     SV* sv;
281
282     if (PL_sv_root)
283         uproot_SV(sv);
284     else
285         sv = S_more_sv(aTHX);
286     SvANY(sv) = 0;
287     SvREFCNT(sv) = 1;
288     SvFLAGS(sv) = 0;
289     sv->sv_debug_optype = PL_op ? PL_op->op_type : 0;
290     sv->sv_debug_line = (U16) (PL_parser && PL_parser->copline != NOLINE
291                 ? PL_parser->copline
292                 :  PL_curcop
293                     ? CopLINE(PL_curcop)
294                     : 0
295             );
296     sv->sv_debug_inpad = 0;
297     sv->sv_debug_cloned = 0;
298     sv->sv_debug_file = PL_curcop ? savepv(CopFILE(PL_curcop)): NULL;
299
300     sv->sv_debug_serial = PL_sv_serial++;
301
302     MEM_LOG_NEW_SV(sv, file, line, func);
303     DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) new_SV (from %s:%d [%s])\n",
304             PTR2UV(sv), (long)sv->sv_debug_serial, file, line, func));
305
306     return sv;
307 }
308 #  define new_SV(p) (p)=S_new_SV(aTHX_ __FILE__, __LINE__, FUNCTION__)
309
310 #else
311 #  define new_SV(p) \
312     STMT_START {                                        \
313         if (PL_sv_root)                                 \
314             uproot_SV(p);                               \
315         else                                            \
316             (p) = S_more_sv(aTHX);                      \
317         SvANY(p) = 0;                                   \
318         SvREFCNT(p) = 1;                                \
319         SvFLAGS(p) = 0;                                 \
320         MEM_LOG_NEW_SV(p, __FILE__, __LINE__, FUNCTION__);  \
321     } STMT_END
322 #endif
323
324
325 /* del_SV(): return an empty SV head to the free list */
326
327 #ifdef DEBUGGING
328
329 #define del_SV(p) \
330     STMT_START {                                        \
331         if (DEBUG_D_TEST)                               \
332             del_sv(p);                                  \
333         else                                            \
334             plant_SV(p);                                \
335     } STMT_END
336
337 STATIC void
338 S_del_sv(pTHX_ SV *p)
339 {
340     dVAR;
341
342     PERL_ARGS_ASSERT_DEL_SV;
343
344     if (DEBUG_D_TEST) {
345         SV* sva;
346         bool ok = 0;
347         for (sva = PL_sv_arenaroot; sva; sva = MUTABLE_SV(SvANY(sva))) {
348             const SV * const sv = sva + 1;
349             const SV * const svend = &sva[SvREFCNT(sva)];
350             if (p >= sv && p < svend) {
351                 ok = 1;
352                 break;
353             }
354         }
355         if (!ok) {
356             if (ckWARN_d(WARN_INTERNAL))        
357                 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
358                             "Attempt to free non-arena SV: 0x%"UVxf
359                             pTHX__FORMAT, PTR2UV(p) pTHX__VALUE);
360             return;
361         }
362     }
363     plant_SV(p);
364 }
365
366 #else /* ! DEBUGGING */
367
368 #define del_SV(p)   plant_SV(p)
369
370 #endif /* DEBUGGING */
371
372
373 /*
374 =head1 SV Manipulation Functions
375
376 =for apidoc sv_add_arena
377
378 Given a chunk of memory, link it to the head of the list of arenas,
379 and split it into a list of free SVs.
380
381 =cut
382 */
383
384 static void
385 S_sv_add_arena(pTHX_ char *const ptr, const U32 size, const U32 flags)
386 {
387     dVAR;
388     SV *const sva = MUTABLE_SV(ptr);
389     register SV* sv;
390     register SV* svend;
391
392     PERL_ARGS_ASSERT_SV_ADD_ARENA;
393
394     /* The first SV in an arena isn't an SV. */
395     SvANY(sva) = (void *) PL_sv_arenaroot;              /* ptr to next arena */
396     SvREFCNT(sva) = size / sizeof(SV);          /* number of SV slots */
397     SvFLAGS(sva) = flags;                       /* FAKE if not to be freed */
398
399     PL_sv_arenaroot = sva;
400     PL_sv_root = sva + 1;
401
402     svend = &sva[SvREFCNT(sva) - 1];
403     sv = sva + 1;
404     while (sv < svend) {
405         SvARENA_CHAIN_SET(sv, (sv + 1));
406 #ifdef DEBUGGING
407         SvREFCNT(sv) = 0;
408 #endif
409         /* Must always set typemask because it's always checked in on cleanup
410            when the arenas are walked looking for objects.  */
411         SvFLAGS(sv) = SVTYPEMASK;
412         sv++;
413     }
414     SvARENA_CHAIN_SET(sv, 0);
415 #ifdef DEBUGGING
416     SvREFCNT(sv) = 0;
417 #endif
418     SvFLAGS(sv) = SVTYPEMASK;
419 }
420
421 /* visit(): call the named function for each non-free SV in the arenas
422  * whose flags field matches the flags/mask args. */
423
424 STATIC I32
425 S_visit(pTHX_ SVFUNC_t f, const U32 flags, const U32 mask)
426 {
427     dVAR;
428     SV* sva;
429     I32 visited = 0;
430
431     PERL_ARGS_ASSERT_VISIT;
432
433     for (sva = PL_sv_arenaroot; sva; sva = MUTABLE_SV(SvANY(sva))) {
434         register const SV * const svend = &sva[SvREFCNT(sva)];
435         register SV* sv;
436         for (sv = sva + 1; sv < svend; ++sv) {
437             if (SvTYPE(sv) != SVTYPEMASK
438                     && (sv->sv_flags & mask) == flags
439                     && SvREFCNT(sv))
440             {
441                 (FCALL)(aTHX_ sv);
442                 ++visited;
443             }
444         }
445     }
446     return visited;
447 }
448
449 #ifdef DEBUGGING
450
451 /* called by sv_report_used() for each live SV */
452
453 static void
454 do_report_used(pTHX_ SV *const sv)
455 {
456     if (SvTYPE(sv) != SVTYPEMASK) {
457         PerlIO_printf(Perl_debug_log, "****\n");
458         sv_dump(sv);
459     }
460 }
461 #endif
462
463 /*
464 =for apidoc sv_report_used
465
466 Dump the contents of all SVs not yet freed. (Debugging aid).
467
468 =cut
469 */
470
471 void
472 Perl_sv_report_used(pTHX)
473 {
474 #ifdef DEBUGGING
475     visit(do_report_used, 0, 0);
476 #else
477     PERL_UNUSED_CONTEXT;
478 #endif
479 }
480
481 /* called by sv_clean_objs() for each live SV */
482
483 static void
484 do_clean_objs(pTHX_ SV *const ref)
485 {
486     dVAR;
487     assert (SvROK(ref));
488     {
489         SV * const target = SvRV(ref);
490         if (SvOBJECT(target)) {
491             DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(ref)));
492             if (SvWEAKREF(ref)) {
493                 sv_del_backref(target, ref);
494                 SvWEAKREF_off(ref);
495                 SvRV_set(ref, NULL);
496             } else {
497                 SvROK_off(ref);
498                 SvRV_set(ref, NULL);
499                 SvREFCNT_dec(target);
500             }
501         }
502     }
503
504     /* XXX Might want to check arrays, etc. */
505 }
506
507 /* called by sv_clean_objs() for each live SV */
508
509 #ifndef DISABLE_DESTRUCTOR_KLUDGE
510 static void
511 do_clean_named_objs(pTHX_ SV *const sv)
512 {
513     dVAR;
514     assert(SvTYPE(sv) == SVt_PVGV);
515     assert(isGV_with_GP(sv));
516     if (GvGP(sv)) {
517         if ((
518 #ifdef PERL_DONT_CREATE_GVSV
519              GvSV(sv) &&
520 #endif
521              SvOBJECT(GvSV(sv))) ||
522              (GvAV(sv) && SvOBJECT(GvAV(sv))) ||
523              (GvHV(sv) && SvOBJECT(GvHV(sv))) ||
524              /* In certain rare cases GvIOp(sv) can be NULL, which would make SvOBJECT(GvIO(sv)) dereference NULL. */
525              (GvIO(sv) ? (SvFLAGS(GvIOp(sv)) & SVs_OBJECT) : 0) ||
526              (GvCV(sv) && SvOBJECT(GvCV(sv))) )
527         {
528             DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning named glob object:\n "), sv_dump(sv)));
529             SvFLAGS(sv) |= SVf_BREAK;
530             SvREFCNT_dec(sv);
531         }
532     }
533 }
534 #endif
535
536 /*
537 =for apidoc sv_clean_objs
538
539 Attempt to destroy all objects not yet freed
540
541 =cut
542 */
543
544 void
545 Perl_sv_clean_objs(pTHX)
546 {
547     dVAR;
548     PL_in_clean_objs = TRUE;
549     visit(do_clean_objs, SVf_ROK, SVf_ROK);
550 #ifndef DISABLE_DESTRUCTOR_KLUDGE
551     /* some barnacles may yet remain, clinging to typeglobs */
552     visit(do_clean_named_objs, SVt_PVGV|SVpgv_GP, SVTYPEMASK|SVp_POK|SVpgv_GP);
553 #endif
554     PL_in_clean_objs = FALSE;
555 }
556
557 /* called by sv_clean_all() for each live SV */
558
559 static void
560 do_clean_all(pTHX_ SV *const sv)
561 {
562     dVAR;
563     if (sv == (const SV *) PL_fdpid || sv == (const SV *)PL_strtab) {
564         /* don't clean pid table and strtab */
565         return;
566     }
567     DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%"UVxf"\n", PTR2UV(sv)) ));
568     SvFLAGS(sv) |= SVf_BREAK;
569     SvREFCNT_dec(sv);
570 }
571
572 /*
573 =for apidoc sv_clean_all
574
575 Decrement the refcnt of each remaining SV, possibly triggering a
576 cleanup. This function may have to be called multiple times to free
577 SVs which are in complex self-referential hierarchies.
578
579 =cut
580 */
581
582 I32
583 Perl_sv_clean_all(pTHX)
584 {
585     dVAR;
586     I32 cleaned;
587     PL_in_clean_all = TRUE;
588     cleaned = visit(do_clean_all, 0,0);
589     PL_in_clean_all = FALSE;
590     return cleaned;
591 }
592
593 /*
594   ARENASETS: a meta-arena implementation which separates arena-info
595   into struct arena_set, which contains an array of struct
596   arena_descs, each holding info for a single arena.  By separating
597   the meta-info from the arena, we recover the 1st slot, formerly
598   borrowed for list management.  The arena_set is about the size of an
599   arena, avoiding the needless malloc overhead of a naive linked-list.
600
601   The cost is 1 arena-set malloc per ~320 arena-mallocs, + the unused
602   memory in the last arena-set (1/2 on average).  In trade, we get
603   back the 1st slot in each arena (ie 1.7% of a CV-arena, less for
604   smaller types).  The recovery of the wasted space allows use of
605   small arenas for large, rare body types, by changing array* fields
606   in body_details_by_type[] below.
607 */
608 struct arena_desc {
609     char       *arena;          /* the raw storage, allocated aligned */
610     size_t      size;           /* its size ~4k typ */
611     U32         misc;           /* type, and in future other things. */
612 };
613
614 struct arena_set;
615
616 /* Get the maximum number of elements in set[] such that struct arena_set
617    will fit within PERL_ARENA_SIZE, which is probably just under 4K, and
618    therefore likely to be 1 aligned memory page.  */
619
620 #define ARENAS_PER_SET  ((PERL_ARENA_SIZE - sizeof(struct arena_set*) \
621                           - 2 * sizeof(int)) / sizeof (struct arena_desc))
622
623 struct arena_set {
624     struct arena_set* next;
625     unsigned int   set_size;    /* ie ARENAS_PER_SET */
626     unsigned int   curr;        /* index of next available arena-desc */
627     struct arena_desc set[ARENAS_PER_SET];
628 };
629
630 /*
631 =for apidoc sv_free_arenas
632
633 Deallocate the memory used by all arenas. Note that all the individual SV
634 heads and bodies within the arenas must already have been freed.
635
636 =cut
637 */
638 void
639 Perl_sv_free_arenas(pTHX)
640 {
641     dVAR;
642     SV* sva;
643     SV* svanext;
644     unsigned int i;
645
646     /* Free arenas here, but be careful about fake ones.  (We assume
647        contiguity of the fake ones with the corresponding real ones.) */
648
649     for (sva = PL_sv_arenaroot; sva; sva = svanext) {
650         svanext = MUTABLE_SV(SvANY(sva));
651         while (svanext && SvFAKE(svanext))
652             svanext = MUTABLE_SV(SvANY(svanext));
653
654         if (!SvFAKE(sva))
655             Safefree(sva);
656     }
657
658     {
659         struct arena_set *aroot = (struct arena_set*) PL_body_arenas;
660
661         while (aroot) {
662             struct arena_set *current = aroot;
663             i = aroot->curr;
664             while (i--) {
665                 assert(aroot->set[i].arena);
666                 Safefree(aroot->set[i].arena);
667             }
668             aroot = aroot->next;
669             Safefree(current);
670         }
671     }
672     PL_body_arenas = 0;
673
674     i = PERL_ARENA_ROOTS_SIZE;
675     while (i--)
676         PL_body_roots[i] = 0;
677
678     Safefree(PL_nice_chunk);
679     PL_nice_chunk = NULL;
680     PL_nice_chunk_size = 0;
681     PL_sv_arenaroot = 0;
682     PL_sv_root = 0;
683 }
684
685 /*
686   Here are mid-level routines that manage the allocation of bodies out
687   of the various arenas.  There are 5 kinds of arenas:
688
689   1. SV-head arenas, which are discussed and handled above
690   2. regular body arenas
691   3. arenas for reduced-size bodies
692   4. Hash-Entry arenas
693   5. pte arenas (thread related)
694
695   Arena types 2 & 3 are chained by body-type off an array of
696   arena-root pointers, which is indexed by svtype.  Some of the
697   larger/less used body types are malloced singly, since a large
698   unused block of them is wasteful.  Also, several svtypes dont have
699   bodies; the data fits into the sv-head itself.  The arena-root
700   pointer thus has a few unused root-pointers (which may be hijacked
701   later for arena types 4,5)
702
703   3 differs from 2 as an optimization; some body types have several
704   unused fields in the front of the structure (which are kept in-place
705   for consistency).  These bodies can be allocated in smaller chunks,
706   because the leading fields arent accessed.  Pointers to such bodies
707   are decremented to point at the unused 'ghost' memory, knowing that
708   the pointers are used with offsets to the real memory.
709
710   HE, HEK arenas are managed separately, with separate code, but may
711   be merge-able later..
712
713   PTE arenas are not sv-bodies, but they share these mid-level
714   mechanics, so are considered here.  The new mid-level mechanics rely
715   on the sv_type of the body being allocated, so we just reserve one
716   of the unused body-slots for PTEs, then use it in those (2) PTE
717   contexts below (line ~10k)
718 */
719
720 /* get_arena(size): this creates custom-sized arenas
721    TBD: export properly for hv.c: S_more_he().
722 */
723 void*
724 Perl_get_arena(pTHX_ const size_t arena_size, const U32 misc)
725 {
726     dVAR;
727     struct arena_desc* adesc;
728     struct arena_set *aroot = (struct arena_set*) PL_body_arenas;
729     unsigned int curr;
730
731     /* shouldnt need this
732     if (!arena_size)    arena_size = PERL_ARENA_SIZE;
733     */
734
735     /* may need new arena-set to hold new arena */
736     if (!aroot || aroot->curr >= aroot->set_size) {
737         struct arena_set *newroot;
738         Newxz(newroot, 1, struct arena_set);
739         newroot->set_size = ARENAS_PER_SET;
740         newroot->next = aroot;
741         aroot = newroot;
742         PL_body_arenas = (void *) newroot;
743         DEBUG_m(PerlIO_printf(Perl_debug_log, "new arenaset %p\n", (void*)aroot));
744     }
745
746     /* ok, now have arena-set with at least 1 empty/available arena-desc */
747     curr = aroot->curr++;
748     adesc = &(aroot->set[curr]);
749     assert(!adesc->arena);
750     
751     Newx(adesc->arena, arena_size, char);
752     adesc->size = arena_size;
753     adesc->misc = misc;
754     DEBUG_m(PerlIO_printf(Perl_debug_log, "arena %d added: %p size %"UVuf"\n", 
755                           curr, (void*)adesc->arena, (UV)arena_size));
756
757     return adesc->arena;
758 }
759
760
761 /* return a thing to the free list */
762
763 #define del_body(thing, root)                   \
764     STMT_START {                                \
765         void ** const thing_copy = (void **)thing;\
766         *thing_copy = *root;                    \
767         *root = (void*)thing_copy;              \
768     } STMT_END
769
770 /* 
771
772 =head1 SV-Body Allocation
773
774 Allocation of SV-bodies is similar to SV-heads, differing as follows;
775 the allocation mechanism is used for many body types, so is somewhat
776 more complicated, it uses arena-sets, and has no need for still-live
777 SV detection.
778
779 At the outermost level, (new|del)_X*V macros return bodies of the
780 appropriate type.  These macros call either (new|del)_body_type or
781 (new|del)_body_allocated macro pairs, depending on specifics of the
782 type.  Most body types use the former pair, the latter pair is used to
783 allocate body types with "ghost fields".
784
785 "ghost fields" are fields that are unused in certain types, and
786 consequently dont need to actually exist.  They are declared because
787 they're part of a "base type", which allows use of functions as
788 methods.  The simplest examples are AVs and HVs, 2 aggregate types
789 which don't use the fields which support SCALAR semantics.
790
791 For these types, the arenas are carved up into *_allocated size
792 chunks, we thus avoid wasted memory for those unaccessed members.
793 When bodies are allocated, we adjust the pointer back in memory by the
794 size of the bit not allocated, so it's as if we allocated the full
795 structure.  (But things will all go boom if you write to the part that
796 is "not there", because you'll be overwriting the last members of the
797 preceding structure in memory.)
798
799 We calculate the correction using the STRUCT_OFFSET macro. For
800 example, if xpv_allocated is the same structure as XPV then the two
801 OFFSETs sum to zero, and the pointer is unchanged. If the allocated
802 structure is smaller (no initial NV actually allocated) then the net
803 effect is to subtract the size of the NV from the pointer, to return a
804 new pointer as if an initial NV were actually allocated.
805
806 This is the same trick as was used for NV and IV bodies. Ironically it
807 doesn't need to be used for NV bodies any more, because NV is now at
808 the start of the structure. IV bodies don't need it either, because
809 they are no longer allocated.
810
811 In turn, the new_body_* allocators call S_new_body(), which invokes
812 new_body_inline macro, which takes a lock, and takes a body off the
813 linked list at PL_body_roots[sv_type], calling S_more_bodies() if
814 necessary to refresh an empty list.  Then the lock is released, and
815 the body is returned.
816
817 S_more_bodies calls get_arena(), and carves it up into an array of N
818 bodies, which it strings into a linked list.  It looks up arena-size
819 and body-size from the body_details table described below, thus
820 supporting the multiple body-types.
821
822 If PURIFY is defined, or PERL_ARENA_SIZE=0, arenas are not used, and
823 the (new|del)_X*V macros are mapped directly to malloc/free.
824
825 */
826
827 /* 
828
829 For each sv-type, struct body_details bodies_by_type[] carries
830 parameters which control these aspects of SV handling:
831
832 Arena_size determines whether arenas are used for this body type, and if
833 so, how big they are.  PURIFY or PERL_ARENA_SIZE=0 set this field to
834 zero, forcing individual mallocs and frees.
835
836 Body_size determines how big a body is, and therefore how many fit into
837 each arena.  Offset carries the body-pointer adjustment needed for
838 *_allocated body types, and is used in *_allocated macros.
839
840 But its main purpose is to parameterize info needed in
841 Perl_sv_upgrade().  The info here dramatically simplifies the function
842 vs the implementation in 5.8.7, making it table-driven.  All fields
843 are used for this, except for arena_size.
844
845 For the sv-types that have no bodies, arenas are not used, so those
846 PL_body_roots[sv_type] are unused, and can be overloaded.  In
847 something of a special case, SVt_NULL is borrowed for HE arenas;
848 PL_body_roots[HE_SVSLOT=SVt_NULL] is filled by S_more_he, but the
849 bodies_by_type[SVt_NULL] slot is not used, as the table is not
850 available in hv.c.
851
852 PTEs also use arenas, but are never seen in Perl_sv_upgrade. Nonetheless,
853 they get their own slot in bodies_by_type[PTE_SVSLOT =SVt_IV], so they can
854 just use the same allocation semantics.  At first, PTEs were also
855 overloaded to a non-body sv-type, but this yielded hard-to-find malloc
856 bugs, so was simplified by claiming a new slot.  This choice has no
857 consequence at this time.
858
859 */
860
861 struct body_details {
862     U8 body_size;       /* Size to allocate  */
863     U8 copy;            /* Size of structure to copy (may be shorter)  */
864     U8 offset;
865     unsigned int type : 4;          /* We have space for a sanity check.  */
866     unsigned int cant_upgrade : 1;  /* Cannot upgrade this type */
867     unsigned int zero_nv : 1;       /* zero the NV when upgrading from this */
868     unsigned int arena : 1;         /* Allocated from an arena */
869     size_t arena_size;              /* Size of arena to allocate */
870 };
871
872 #define HADNV FALSE
873 #define NONV TRUE
874
875
876 #ifdef PURIFY
877 /* With -DPURFIY we allocate everything directly, and don't use arenas.
878    This seems a rather elegant way to simplify some of the code below.  */
879 #define HASARENA FALSE
880 #else
881 #define HASARENA TRUE
882 #endif
883 #define NOARENA FALSE
884
885 /* Size the arenas to exactly fit a given number of bodies.  A count
886    of 0 fits the max number bodies into a PERL_ARENA_SIZE.block,
887    simplifying the default.  If count > 0, the arena is sized to fit
888    only that many bodies, allowing arenas to be used for large, rare
889    bodies (XPVFM, XPVIO) without undue waste.  The arena size is
890    limited by PERL_ARENA_SIZE, so we can safely oversize the
891    declarations.
892  */
893 #define FIT_ARENA0(body_size)                           \
894     ((size_t)(PERL_ARENA_SIZE / body_size) * body_size)
895 #define FIT_ARENAn(count,body_size)                     \
896     ( count * body_size <= PERL_ARENA_SIZE)             \
897     ? count * body_size                                 \
898     : FIT_ARENA0 (body_size)
899 #define FIT_ARENA(count,body_size)                      \
900     count                                               \
901     ? FIT_ARENAn (count, body_size)                     \
902     : FIT_ARENA0 (body_size)
903
904 /* A macro to work out the offset needed to subtract from a pointer to (say)
905
906 typedef struct {
907     STRLEN      xpv_cur;
908     STRLEN      xpv_len;
909 } xpv_allocated;
910
911 to make its members accessible via a pointer to (say)
912
913 struct xpv {
914     NV          xnv_nv;
915     STRLEN      xpv_cur;
916     STRLEN      xpv_len;
917 };
918
919 */
920
921 #define relative_STRUCT_OFFSET(longer, shorter, member) \
922     (STRUCT_OFFSET(shorter, member) - STRUCT_OFFSET(longer, member))
923
924 /* Calculate the length to copy. Specifically work out the length less any
925    final padding the compiler needed to add.  See the comment in sv_upgrade
926    for why copying the padding proved to be a bug.  */
927
928 #define copy_length(type, last_member) \
929         STRUCT_OFFSET(type, last_member) \
930         + sizeof (((type*)SvANY((const SV *)0))->last_member)
931
932 static const struct body_details bodies_by_type[] = {
933     { sizeof(HE), 0, 0, SVt_NULL,
934       FALSE, NONV, NOARENA, FIT_ARENA(0, sizeof(HE)) },
935
936     /* The bind placeholder pretends to be an RV for now.
937        Also it's marked as "can't upgrade" to stop anyone using it before it's
938        implemented.  */
939     { 0, 0, 0, SVt_BIND, TRUE, NONV, NOARENA, 0 },
940
941     /* IVs are in the head, so the allocation size is 0.
942        However, the slot is overloaded for PTEs.  */
943     { sizeof(struct ptr_tbl_ent), /* This is used for PTEs.  */
944       sizeof(IV), /* This is used to copy out the IV body.  */
945       STRUCT_OFFSET(XPVIV, xiv_iv), SVt_IV, FALSE, NONV,
946       NOARENA /* IVS don't need an arena  */,
947       /* But PTEs need to know the size of their arena  */
948       FIT_ARENA(0, sizeof(struct ptr_tbl_ent))
949     },
950
951     /* 8 bytes on most ILP32 with IEEE doubles */
952     { sizeof(NV), sizeof(NV), 0, SVt_NV, FALSE, HADNV, HASARENA,
953       FIT_ARENA(0, sizeof(NV)) },
954
955     /* 8 bytes on most ILP32 with IEEE doubles */
956     { sizeof(xpv_allocated),
957       copy_length(XPV, xpv_len)
958       - relative_STRUCT_OFFSET(xpv_allocated, XPV, xpv_cur),
959       + relative_STRUCT_OFFSET(xpv_allocated, XPV, xpv_cur),
960       SVt_PV, FALSE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpv_allocated)) },
961
962     /* 12 */
963     { sizeof(xpviv_allocated),
964       copy_length(XPVIV, xiv_u)
965       - relative_STRUCT_OFFSET(xpviv_allocated, XPVIV, xpv_cur),
966       + relative_STRUCT_OFFSET(xpviv_allocated, XPVIV, xpv_cur),
967       SVt_PVIV, FALSE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpviv_allocated)) },
968
969     /* 20 */
970     { sizeof(XPVNV), copy_length(XPVNV, xiv_u), 0, SVt_PVNV, FALSE, HADNV,
971       HASARENA, FIT_ARENA(0, sizeof(XPVNV)) },
972
973     /* 28 */
974     { sizeof(XPVMG), copy_length(XPVMG, xmg_stash), 0, SVt_PVMG, FALSE, HADNV,
975       HASARENA, FIT_ARENA(0, sizeof(XPVMG)) },
976
977     /* something big */
978     { sizeof(struct regexp_allocated), sizeof(struct regexp_allocated),
979       + relative_STRUCT_OFFSET(struct regexp_allocated, regexp, xpv_cur),
980       SVt_REGEXP, FALSE, NONV, HASARENA,
981       FIT_ARENA(0, sizeof(struct regexp_allocated))
982     },
983
984     /* 48 */
985     { sizeof(XPVGV), sizeof(XPVGV), 0, SVt_PVGV, TRUE, HADNV,
986       HASARENA, FIT_ARENA(0, sizeof(XPVGV)) },
987     
988     /* 64 */
989     { sizeof(XPVLV), sizeof(XPVLV), 0, SVt_PVLV, TRUE, HADNV,
990       HASARENA, FIT_ARENA(0, sizeof(XPVLV)) },
991
992     { sizeof(xpvav_allocated),
993       copy_length(XPVAV, xmg_stash)
994       - relative_STRUCT_OFFSET(xpvav_allocated, XPVAV, xav_fill),
995       + relative_STRUCT_OFFSET(xpvav_allocated, XPVAV, xav_fill),
996       SVt_PVAV, TRUE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpvav_allocated)) },
997
998     { sizeof(xpvhv_allocated),
999       copy_length(XPVHV, xmg_stash)
1000       - relative_STRUCT_OFFSET(xpvhv_allocated, XPVHV, xhv_fill),
1001       + relative_STRUCT_OFFSET(xpvhv_allocated, XPVHV, xhv_fill),
1002       SVt_PVHV, TRUE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpvhv_allocated)) },
1003
1004     /* 56 */
1005     { sizeof(xpvcv_allocated), sizeof(xpvcv_allocated),
1006       + relative_STRUCT_OFFSET(xpvcv_allocated, XPVCV, xpv_cur),
1007       SVt_PVCV, TRUE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpvcv_allocated)) },
1008
1009     { sizeof(xpvfm_allocated), sizeof(xpvfm_allocated),
1010       + relative_STRUCT_OFFSET(xpvfm_allocated, XPVFM, xpv_cur),
1011       SVt_PVFM, TRUE, NONV, NOARENA, FIT_ARENA(20, sizeof(xpvfm_allocated)) },
1012
1013     /* XPVIO is 84 bytes, fits 48x */
1014     { sizeof(xpvio_allocated), sizeof(xpvio_allocated),
1015       + relative_STRUCT_OFFSET(xpvio_allocated, XPVIO, xpv_cur),
1016       SVt_PVIO, TRUE, NONV, HASARENA, FIT_ARENA(24, sizeof(xpvio_allocated)) },
1017 };
1018
1019 #define new_body_type(sv_type)          \
1020     (void *)((char *)S_new_body(aTHX_ sv_type))
1021
1022 #define del_body_type(p, sv_type)       \
1023     del_body(p, &PL_body_roots[sv_type])
1024
1025
1026 #define new_body_allocated(sv_type)             \
1027     (void *)((char *)S_new_body(aTHX_ sv_type)  \
1028              - bodies_by_type[sv_type].offset)
1029
1030 #define del_body_allocated(p, sv_type)          \
1031     del_body(p + bodies_by_type[sv_type].offset, &PL_body_roots[sv_type])
1032
1033
1034 #define my_safemalloc(s)        (void*)safemalloc(s)
1035 #define my_safecalloc(s)        (void*)safecalloc(s, 1)
1036 #define my_safefree(p)  safefree((char*)p)
1037
1038 #ifdef PURIFY
1039
1040 #define new_XNV()       my_safemalloc(sizeof(XPVNV))
1041 #define del_XNV(p)      my_safefree(p)
1042
1043 #define new_XPVNV()     my_safemalloc(sizeof(XPVNV))
1044 #define del_XPVNV(p)    my_safefree(p)
1045
1046 #define new_XPVAV()     my_safemalloc(sizeof(XPVAV))
1047 #define del_XPVAV(p)    my_safefree(p)
1048
1049 #define new_XPVHV()     my_safemalloc(sizeof(XPVHV))
1050 #define del_XPVHV(p)    my_safefree(p)
1051
1052 #define new_XPVMG()     my_safemalloc(sizeof(XPVMG))
1053 #define del_XPVMG(p)    my_safefree(p)
1054
1055 #define new_XPVGV()     my_safemalloc(sizeof(XPVGV))
1056 #define del_XPVGV(p)    my_safefree(p)
1057
1058 #else /* !PURIFY */
1059
1060 #define new_XNV()       new_body_type(SVt_NV)
1061 #define del_XNV(p)      del_body_type(p, SVt_NV)
1062
1063 #define new_XPVNV()     new_body_type(SVt_PVNV)
1064 #define del_XPVNV(p)    del_body_type(p, SVt_PVNV)
1065
1066 #define new_XPVAV()     new_body_allocated(SVt_PVAV)
1067 #define del_XPVAV(p)    del_body_allocated(p, SVt_PVAV)
1068
1069 #define new_XPVHV()     new_body_allocated(SVt_PVHV)
1070 #define del_XPVHV(p)    del_body_allocated(p, SVt_PVHV)
1071
1072 #define new_XPVMG()     new_body_type(SVt_PVMG)
1073 #define del_XPVMG(p)    del_body_type(p, SVt_PVMG)
1074
1075 #define new_XPVGV()     new_body_type(SVt_PVGV)
1076 #define del_XPVGV(p)    del_body_type(p, SVt_PVGV)
1077
1078 #endif /* PURIFY */
1079
1080 /* no arena for you! */
1081
1082 #define new_NOARENA(details) \
1083         my_safemalloc((details)->body_size + (details)->offset)
1084 #define new_NOARENAZ(details) \
1085         my_safecalloc((details)->body_size + (details)->offset)
1086
1087 STATIC void *
1088 S_more_bodies (pTHX_ const svtype sv_type)
1089 {
1090     dVAR;
1091     void ** const root = &PL_body_roots[sv_type];
1092     const struct body_details * const bdp = &bodies_by_type[sv_type];
1093     const size_t body_size = bdp->body_size;
1094     char *start;
1095     const char *end;
1096     const size_t arena_size = Perl_malloc_good_size(bdp->arena_size);
1097 #if defined(DEBUGGING) && !defined(PERL_GLOBAL_STRUCT_PRIVATE)
1098     static bool done_sanity_check;
1099
1100     /* PERL_GLOBAL_STRUCT_PRIVATE cannot coexist with global
1101      * variables like done_sanity_check. */
1102     if (!done_sanity_check) {
1103         unsigned int i = SVt_LAST;
1104
1105         done_sanity_check = TRUE;
1106
1107         while (i--)
1108             assert (bodies_by_type[i].type == i);
1109     }
1110 #endif
1111
1112     assert(bdp->arena_size);
1113
1114     start = (char*) Perl_get_arena(aTHX_ arena_size, sv_type);
1115
1116     end = start + arena_size - 2 * body_size;
1117
1118     /* computed count doesnt reflect the 1st slot reservation */
1119 #if defined(MYMALLOC) || defined(HAS_MALLOC_GOOD_SIZE)
1120     DEBUG_m(PerlIO_printf(Perl_debug_log,
1121                           "arena %p end %p arena-size %d (from %d) type %d "
1122                           "size %d ct %d\n",
1123                           (void*)start, (void*)end, (int)arena_size,
1124                           (int)bdp->arena_size, sv_type, (int)body_size,
1125                           (int)arena_size / (int)body_size));
1126 #else
1127     DEBUG_m(PerlIO_printf(Perl_debug_log,
1128                           "arena %p end %p arena-size %d type %d size %d ct %d\n",
1129                           (void*)start, (void*)end,
1130                           (int)bdp->arena_size, sv_type, (int)body_size,
1131                           (int)bdp->arena_size / (int)body_size));
1132 #endif
1133     *root = (void *)start;
1134
1135     while (start <= end) {
1136         char * const next = start + body_size;
1137         *(void**) start = (void *)next;
1138         start = next;
1139     }
1140     *(void **)start = 0;
1141
1142     return *root;
1143 }
1144
1145 /* grab a new thing from the free list, allocating more if necessary.
1146    The inline version is used for speed in hot routines, and the
1147    function using it serves the rest (unless PURIFY).
1148 */
1149 #define new_body_inline(xpv, sv_type) \
1150     STMT_START { \
1151         void ** const r3wt = &PL_body_roots[sv_type]; \
1152         xpv = (PTR_TBL_ENT_t*) (*((void **)(r3wt))      \
1153           ? *((void **)(r3wt)) : more_bodies(sv_type)); \
1154         *(r3wt) = *(void**)(xpv); \
1155     } STMT_END
1156
1157 #ifndef PURIFY
1158
1159 STATIC void *
1160 S_new_body(pTHX_ const svtype sv_type)
1161 {
1162     dVAR;
1163     void *xpv;
1164     new_body_inline(xpv, sv_type);
1165     return xpv;
1166 }
1167
1168 #endif
1169
1170 static const struct body_details fake_rv =
1171     { 0, 0, 0, SVt_IV, FALSE, NONV, NOARENA, 0 };
1172
1173 /*
1174 =for apidoc sv_upgrade
1175
1176 Upgrade an SV to a more complex form.  Generally adds a new body type to the
1177 SV, then copies across as much information as possible from the old body.
1178 You generally want to use the C<SvUPGRADE> macro wrapper. See also C<svtype>.
1179
1180 =cut
1181 */
1182
1183 void
1184 Perl_sv_upgrade(pTHX_ register SV *const sv, svtype new_type)
1185 {
1186     dVAR;
1187     void*       old_body;
1188     void*       new_body;
1189     const svtype old_type = SvTYPE(sv);
1190     const struct body_details *new_type_details;
1191     const struct body_details *old_type_details
1192         = bodies_by_type + old_type;
1193     SV *referant = NULL;
1194
1195     PERL_ARGS_ASSERT_SV_UPGRADE;
1196
1197     if (new_type != SVt_PV && SvIsCOW(sv)) {
1198         sv_force_normal_flags(sv, 0);
1199     }
1200
1201     if (old_type == new_type)
1202         return;
1203
1204     old_body = SvANY(sv);
1205
1206     /* Copying structures onto other structures that have been neatly zeroed
1207        has a subtle gotcha. Consider XPVMG
1208
1209        +------+------+------+------+------+-------+-------+
1210        |     NV      | CUR  | LEN  |  IV  | MAGIC | STASH |
1211        +------+------+------+------+------+-------+-------+
1212        0      4      8     12     16     20      24      28
1213
1214        where NVs are aligned to 8 bytes, so that sizeof that structure is
1215        actually 32 bytes long, with 4 bytes of padding at the end:
1216
1217        +------+------+------+------+------+-------+-------+------+
1218        |     NV      | CUR  | LEN  |  IV  | MAGIC | STASH | ???  |
1219        +------+------+------+------+------+-------+-------+------+
1220        0      4      8     12     16     20      24      28     32
1221
1222        so what happens if you allocate memory for this structure:
1223
1224        +------+------+------+------+------+-------+-------+------+------+...
1225        |     NV      | CUR  | LEN  |  IV  | MAGIC | STASH |  GP  | NAME |
1226        +------+------+------+------+------+-------+-------+------+------+...
1227        0      4      8     12     16     20      24      28     32     36
1228
1229        zero it, then copy sizeof(XPVMG) bytes on top of it? Not quite what you
1230        expect, because you copy the area marked ??? onto GP. Now, ??? may have
1231        started out as zero once, but it's quite possible that it isn't. So now,
1232        rather than a nicely zeroed GP, you have it pointing somewhere random.
1233        Bugs ensue.
1234
1235        (In fact, GP ends up pointing at a previous GP structure, because the
1236        principle cause of the padding in XPVMG getting garbage is a copy of
1237        sizeof(XPVMG) bytes from a XPVGV structure in sv_unglob. Right now
1238        this happens to be moot because XPVGV has been re-ordered, with GP
1239        no longer after STASH)
1240
1241        So we are careful and work out the size of used parts of all the
1242        structures.  */
1243
1244     switch (old_type) {
1245     case SVt_NULL:
1246         break;
1247     case SVt_IV:
1248         if (SvROK(sv)) {
1249             referant = SvRV(sv);
1250             old_type_details = &fake_rv;
1251             if (new_type == SVt_NV)
1252                 new_type = SVt_PVNV;
1253         } else {
1254             if (new_type < SVt_PVIV) {
1255                 new_type = (new_type == SVt_NV)
1256                     ? SVt_PVNV : SVt_PVIV;
1257             }
1258         }
1259         break;
1260     case SVt_NV:
1261         if (new_type < SVt_PVNV) {
1262             new_type = SVt_PVNV;
1263         }
1264         break;
1265     case SVt_PV:
1266         assert(new_type > SVt_PV);
1267         assert(SVt_IV < SVt_PV);
1268         assert(SVt_NV < SVt_PV);
1269         break;
1270     case SVt_PVIV:
1271         break;
1272     case SVt_PVNV:
1273         break;
1274     case SVt_PVMG:
1275         /* Because the XPVMG of PL_mess_sv isn't allocated from the arena,
1276            there's no way that it can be safely upgraded, because perl.c
1277            expects to Safefree(SvANY(PL_mess_sv))  */
1278         assert(sv != PL_mess_sv);
1279         /* This flag bit is used to mean other things in other scalar types.
1280            Given that it only has meaning inside the pad, it shouldn't be set
1281            on anything that can get upgraded.  */
1282         assert(!SvPAD_TYPED(sv));
1283         break;
1284     default:
1285         if (old_type_details->cant_upgrade)
1286             Perl_croak(aTHX_ "Can't upgrade %s (%" UVuf ") to %" UVuf,
1287                        sv_reftype(sv, 0), (UV) old_type, (UV) new_type);
1288     }
1289
1290     if (old_type > new_type)
1291         Perl_croak(aTHX_ "sv_upgrade from type %d down to type %d",
1292                 (int)old_type, (int)new_type);
1293
1294     new_type_details = bodies_by_type + new_type;
1295
1296     SvFLAGS(sv) &= ~SVTYPEMASK;
1297     SvFLAGS(sv) |= new_type;
1298
1299     /* This can't happen, as SVt_NULL is <= all values of new_type, so one of
1300        the return statements above will have triggered.  */
1301     assert (new_type != SVt_NULL);
1302     switch (new_type) {
1303     case SVt_IV:
1304         assert(old_type == SVt_NULL);
1305         SvANY(sv) = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
1306         SvIV_set(sv, 0);
1307         return;
1308     case SVt_NV:
1309         assert(old_type == SVt_NULL);
1310         SvANY(sv) = new_XNV();
1311         SvNV_set(sv, 0);
1312         return;
1313     case SVt_PVHV:
1314     case SVt_PVAV:
1315         assert(new_type_details->body_size);
1316
1317 #ifndef PURIFY  
1318         assert(new_type_details->arena);
1319         assert(new_type_details->arena_size);
1320         /* This points to the start of the allocated area.  */
1321         new_body_inline(new_body, new_type);
1322         Zero(new_body, new_type_details->body_size, char);
1323         new_body = ((char *)new_body) - new_type_details->offset;
1324 #else
1325         /* We always allocated the full length item with PURIFY. To do this
1326            we fake things so that arena is false for all 16 types..  */
1327         new_body = new_NOARENAZ(new_type_details);
1328 #endif
1329         SvANY(sv) = new_body;
1330         if (new_type == SVt_PVAV) {
1331             AvMAX(sv)   = -1;
1332             AvFILLp(sv) = -1;
1333             AvREAL_only(sv);
1334             if (old_type_details->body_size) {
1335                 AvALLOC(sv) = 0;
1336             } else {
1337                 /* It will have been zeroed when the new body was allocated.
1338                    Lets not write to it, in case it confuses a write-back
1339                    cache.  */
1340             }
1341         } else {
1342             assert(!SvOK(sv));
1343             SvOK_off(sv);
1344 #ifndef NODEFAULT_SHAREKEYS
1345             HvSHAREKEYS_on(sv);         /* key-sharing on by default */
1346 #endif
1347             HvMAX(sv) = 7; /* (start with 8 buckets) */
1348             if (old_type_details->body_size) {
1349                 HvFILL(sv) = 0;
1350             } else {
1351                 /* It will have been zeroed when the new body was allocated.
1352                    Lets not write to it, in case it confuses a write-back
1353                    cache.  */
1354             }
1355         }
1356
1357         /* SVt_NULL isn't the only thing upgraded to AV or HV.
1358            The target created by newSVrv also is, and it can have magic.
1359            However, it never has SvPVX set.
1360         */
1361         if (old_type == SVt_IV) {
1362             assert(!SvROK(sv));
1363         } else if (old_type >= SVt_PV) {
1364             assert(SvPVX_const(sv) == 0);
1365         }
1366
1367         if (old_type >= SVt_PVMG) {
1368             SvMAGIC_set(sv, ((XPVMG*)old_body)->xmg_u.xmg_magic);
1369             SvSTASH_set(sv, ((XPVMG*)old_body)->xmg_stash);
1370         } else {
1371             sv->sv_u.svu_array = NULL; /* or svu_hash  */
1372         }
1373         break;
1374
1375
1376     case SVt_PVIV:
1377         /* XXX Is this still needed?  Was it ever needed?   Surely as there is
1378            no route from NV to PVIV, NOK can never be true  */
1379         assert(!SvNOKp(sv));
1380         assert(!SvNOK(sv));
1381     case SVt_PVIO:
1382     case SVt_PVFM:
1383     case SVt_PVGV:
1384     case SVt_PVCV:
1385     case SVt_PVLV:
1386     case SVt_REGEXP:
1387     case SVt_PVMG:
1388     case SVt_PVNV:
1389     case SVt_PV:
1390
1391         assert(new_type_details->body_size);
1392         /* We always allocated the full length item with PURIFY. To do this
1393            we fake things so that arena is false for all 16 types..  */
1394         if(new_type_details->arena) {
1395             /* This points to the start of the allocated area.  */
1396             new_body_inline(new_body, new_type);
1397             Zero(new_body, new_type_details->body_size, char);
1398             new_body = ((char *)new_body) - new_type_details->offset;
1399         } else {
1400             new_body = new_NOARENAZ(new_type_details);
1401         }
1402         SvANY(sv) = new_body;
1403
1404         if (old_type_details->copy) {
1405             /* There is now the potential for an upgrade from something without
1406                an offset (PVNV or PVMG) to something with one (PVCV, PVFM)  */
1407             int offset = old_type_details->offset;
1408             int length = old_type_details->copy;
1409
1410             if (new_type_details->offset > old_type_details->offset) {
1411                 const int difference
1412                     = new_type_details->offset - old_type_details->offset;
1413                 offset += difference;
1414                 length -= difference;
1415             }
1416             assert (length >= 0);
1417                 
1418             Copy((char *)old_body + offset, (char *)new_body + offset, length,
1419                  char);
1420         }
1421
1422 #ifndef NV_ZERO_IS_ALLBITS_ZERO
1423         /* If NV 0.0 is stores as all bits 0 then Zero() already creates a
1424          * correct 0.0 for us.  Otherwise, if the old body didn't have an
1425          * NV slot, but the new one does, then we need to initialise the
1426          * freshly created NV slot with whatever the correct bit pattern is
1427          * for 0.0  */
1428         if (old_type_details->zero_nv && !new_type_details->zero_nv
1429             && !isGV_with_GP(sv))
1430             SvNV_set(sv, 0);
1431 #endif
1432
1433         if (new_type == SVt_PVIO)
1434             IoPAGE_LEN(sv) = 60;
1435         if (old_type < SVt_PV) {
1436             /* referant will be NULL unless the old type was SVt_IV emulating
1437                SVt_RV */
1438             sv->sv_u.svu_rv = referant;
1439         }
1440         break;
1441     default:
1442         Perl_croak(aTHX_ "panic: sv_upgrade to unknown type %lu",
1443                    (unsigned long)new_type);
1444     }
1445
1446     if (old_type_details->arena) {
1447         /* If there was an old body, then we need to free it.
1448            Note that there is an assumption that all bodies of types that
1449            can be upgraded came from arenas. Only the more complex non-
1450            upgradable types are allowed to be directly malloc()ed.  */
1451 #ifdef PURIFY
1452         my_safefree(old_body);
1453 #else
1454         del_body((void*)((char*)old_body + old_type_details->offset),
1455                  &PL_body_roots[old_type]);
1456 #endif
1457     }
1458 }
1459
1460 /*
1461 =for apidoc sv_backoff
1462
1463 Remove any string offset. You should normally use the C<SvOOK_off> macro
1464 wrapper instead.
1465
1466 =cut
1467 */
1468
1469 int
1470 Perl_sv_backoff(pTHX_ register SV *const sv)
1471 {
1472     STRLEN delta;
1473     const char * const s = SvPVX_const(sv);
1474
1475     PERL_ARGS_ASSERT_SV_BACKOFF;
1476     PERL_UNUSED_CONTEXT;
1477
1478     assert(SvOOK(sv));
1479     assert(SvTYPE(sv) != SVt_PVHV);
1480     assert(SvTYPE(sv) != SVt_PVAV);
1481
1482     SvOOK_offset(sv, delta);
1483     
1484     SvLEN_set(sv, SvLEN(sv) + delta);
1485     SvPV_set(sv, SvPVX(sv) - delta);
1486     Move(s, SvPVX(sv), SvCUR(sv)+1, char);
1487     SvFLAGS(sv) &= ~SVf_OOK;
1488     return 0;
1489 }
1490
1491 /*
1492 =for apidoc sv_grow
1493
1494 Expands the character buffer in the SV.  If necessary, uses C<sv_unref> and
1495 upgrades the SV to C<SVt_PV>.  Returns a pointer to the character buffer.
1496 Use the C<SvGROW> wrapper instead.
1497
1498 =cut
1499 */
1500
1501 char *
1502 Perl_sv_grow(pTHX_ register SV *const sv, register STRLEN newlen)
1503 {
1504     register char *s;
1505
1506     PERL_ARGS_ASSERT_SV_GROW;
1507
1508     if (PL_madskills && newlen >= 0x100000) {
1509         PerlIO_printf(Perl_debug_log,
1510                       "Allocation too large: %"UVxf"\n", (UV)newlen);
1511     }
1512 #ifdef HAS_64K_LIMIT
1513     if (newlen >= 0x10000) {
1514         PerlIO_printf(Perl_debug_log,
1515                       "Allocation too large: %"UVxf"\n", (UV)newlen);
1516         my_exit(1);
1517     }
1518 #endif /* HAS_64K_LIMIT */
1519     if (SvROK(sv))
1520         sv_unref(sv);
1521     if (SvTYPE(sv) < SVt_PV) {
1522         sv_upgrade(sv, SVt_PV);
1523         s = SvPVX_mutable(sv);
1524     }
1525     else if (SvOOK(sv)) {       /* pv is offset? */
1526         sv_backoff(sv);
1527         s = SvPVX_mutable(sv);
1528         if (newlen > SvLEN(sv))
1529             newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
1530 #ifdef HAS_64K_LIMIT
1531         if (newlen >= 0x10000)
1532             newlen = 0xFFFF;
1533 #endif
1534     }
1535     else
1536         s = SvPVX_mutable(sv);
1537
1538     if (newlen > SvLEN(sv)) {           /* need more room? */
1539 #ifndef Perl_safesysmalloc_size
1540         newlen = PERL_STRLEN_ROUNDUP(newlen);
1541 #endif
1542         if (SvLEN(sv) && s) {
1543             s = (char*)saferealloc(s, newlen);
1544         }
1545         else {
1546             s = (char*)safemalloc(newlen);
1547             if (SvPVX_const(sv) && SvCUR(sv)) {
1548                 Move(SvPVX_const(sv), s, (newlen < SvCUR(sv)) ? newlen : SvCUR(sv), char);
1549             }
1550         }
1551         SvPV_set(sv, s);
1552 #ifdef Perl_safesysmalloc_size
1553         /* Do this here, do it once, do it right, and then we will never get
1554            called back into sv_grow() unless there really is some growing
1555            needed.  */
1556         SvLEN_set(sv, Perl_safesysmalloc_size(s));
1557 #else
1558         SvLEN_set(sv, newlen);
1559 #endif
1560     }
1561     return s;
1562 }
1563
1564 /*
1565 =for apidoc sv_setiv
1566
1567 Copies an integer into the given SV, upgrading first if necessary.
1568 Does not handle 'set' magic.  See also C<sv_setiv_mg>.
1569
1570 =cut
1571 */
1572
1573 void
1574 Perl_sv_setiv(pTHX_ register SV *const sv, const IV i)
1575 {
1576     dVAR;
1577
1578     PERL_ARGS_ASSERT_SV_SETIV;
1579
1580     SV_CHECK_THINKFIRST_COW_DROP(sv);
1581     switch (SvTYPE(sv)) {
1582     case SVt_NULL:
1583     case SVt_NV:
1584         sv_upgrade(sv, SVt_IV);
1585         break;
1586     case SVt_PV:
1587         sv_upgrade(sv, SVt_PVIV);
1588         break;
1589
1590     case SVt_PVGV:
1591         if (!isGV_with_GP(sv))
1592             break;
1593     case SVt_PVAV:
1594     case SVt_PVHV:
1595     case SVt_PVCV:
1596     case SVt_PVFM:
1597     case SVt_PVIO:
1598         Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
1599                    OP_DESC(PL_op));
1600     default: NOOP;
1601     }
1602     (void)SvIOK_only(sv);                       /* validate number */
1603     SvIV_set(sv, i);
1604     SvTAINT(sv);
1605 }
1606
1607 /*
1608 =for apidoc sv_setiv_mg
1609
1610 Like C<sv_setiv>, but also handles 'set' magic.
1611
1612 =cut
1613 */
1614
1615 void
1616 Perl_sv_setiv_mg(pTHX_ register SV *const sv, const IV i)
1617 {
1618     PERL_ARGS_ASSERT_SV_SETIV_MG;
1619
1620     sv_setiv(sv,i);
1621     SvSETMAGIC(sv);
1622 }
1623
1624 /*
1625 =for apidoc sv_setuv
1626
1627 Copies an unsigned integer into the given SV, upgrading first if necessary.
1628 Does not handle 'set' magic.  See also C<sv_setuv_mg>.
1629
1630 =cut
1631 */
1632
1633 void
1634 Perl_sv_setuv(pTHX_ register SV *const sv, const UV u)
1635 {
1636     PERL_ARGS_ASSERT_SV_SETUV;
1637
1638     /* With these two if statements:
1639        u=1.49  s=0.52  cu=72.49  cs=10.64  scripts=270  tests=20865
1640
1641        without
1642        u=1.35  s=0.47  cu=73.45  cs=11.43  scripts=270  tests=20865
1643
1644        If you wish to remove them, please benchmark to see what the effect is
1645     */
1646     if (u <= (UV)IV_MAX) {
1647        sv_setiv(sv, (IV)u);
1648        return;
1649     }
1650     sv_setiv(sv, 0);
1651     SvIsUV_on(sv);
1652     SvUV_set(sv, u);
1653 }
1654
1655 /*
1656 =for apidoc sv_setuv_mg
1657
1658 Like C<sv_setuv>, but also handles 'set' magic.
1659
1660 =cut
1661 */
1662
1663 void
1664 Perl_sv_setuv_mg(pTHX_ register SV *const sv, const UV u)
1665 {
1666     PERL_ARGS_ASSERT_SV_SETUV_MG;
1667
1668     sv_setuv(sv,u);
1669     SvSETMAGIC(sv);
1670 }
1671
1672 /*
1673 =for apidoc sv_setnv
1674
1675 Copies a double into the given SV, upgrading first if necessary.
1676 Does not handle 'set' magic.  See also C<sv_setnv_mg>.
1677
1678 =cut
1679 */
1680
1681 void
1682 Perl_sv_setnv(pTHX_ register SV *const sv, const NV num)
1683 {
1684     dVAR;
1685
1686     PERL_ARGS_ASSERT_SV_SETNV;
1687
1688     SV_CHECK_THINKFIRST_COW_DROP(sv);
1689     switch (SvTYPE(sv)) {
1690     case SVt_NULL:
1691     case SVt_IV:
1692         sv_upgrade(sv, SVt_NV);
1693         break;
1694     case SVt_PV:
1695     case SVt_PVIV:
1696         sv_upgrade(sv, SVt_PVNV);
1697         break;
1698
1699     case SVt_PVGV:
1700         if (!isGV_with_GP(sv))
1701             break;
1702     case SVt_PVAV:
1703     case SVt_PVHV:
1704     case SVt_PVCV:
1705     case SVt_PVFM:
1706     case SVt_PVIO:
1707         Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
1708                    OP_NAME(PL_op));
1709     default: NOOP;
1710     }
1711     SvNV_set(sv, num);
1712     (void)SvNOK_only(sv);                       /* validate number */
1713     SvTAINT(sv);
1714 }
1715
1716 /*
1717 =for apidoc sv_setnv_mg
1718
1719 Like C<sv_setnv>, but also handles 'set' magic.
1720
1721 =cut
1722 */
1723
1724 void
1725 Perl_sv_setnv_mg(pTHX_ register SV *const sv, const NV num)
1726 {
1727     PERL_ARGS_ASSERT_SV_SETNV_MG;
1728
1729     sv_setnv(sv,num);
1730     SvSETMAGIC(sv);
1731 }
1732
1733 /* Print an "isn't numeric" warning, using a cleaned-up,
1734  * printable version of the offending string
1735  */
1736
1737 STATIC void
1738 S_not_a_number(pTHX_ SV *const sv)
1739 {
1740      dVAR;
1741      SV *dsv;
1742      char tmpbuf[64];
1743      const char *pv;
1744
1745      PERL_ARGS_ASSERT_NOT_A_NUMBER;
1746
1747      if (DO_UTF8(sv)) {
1748           dsv = newSVpvs_flags("", SVs_TEMP);
1749           pv = sv_uni_display(dsv, sv, 10, 0);
1750      } else {
1751           char *d = tmpbuf;
1752           const char * const limit = tmpbuf + sizeof(tmpbuf) - 8;
1753           /* each *s can expand to 4 chars + "...\0",
1754              i.e. need room for 8 chars */
1755         
1756           const char *s = SvPVX_const(sv);
1757           const char * const end = s + SvCUR(sv);
1758           for ( ; s < end && d < limit; s++ ) {
1759                int ch = *s & 0xFF;
1760                if (ch & 128 && !isPRINT_LC(ch)) {
1761                     *d++ = 'M';
1762                     *d++ = '-';
1763                     ch &= 127;
1764                }
1765                if (ch == '\n') {
1766                     *d++ = '\\';
1767                     *d++ = 'n';
1768                }
1769                else if (ch == '\r') {
1770                     *d++ = '\\';
1771                     *d++ = 'r';
1772                }
1773                else if (ch == '\f') {
1774                     *d++ = '\\';
1775                     *d++ = 'f';
1776                }
1777                else if (ch == '\\') {
1778                     *d++ = '\\';
1779                     *d++ = '\\';
1780                }
1781                else if (ch == '\0') {
1782                     *d++ = '\\';
1783                     *d++ = '0';
1784                }
1785                else if (isPRINT_LC(ch))
1786                     *d++ = ch;
1787                else {
1788                     *d++ = '^';
1789                     *d++ = toCTRL(ch);
1790                }
1791           }
1792           if (s < end) {
1793                *d++ = '.';
1794                *d++ = '.';
1795                *d++ = '.';
1796           }
1797           *d = '\0';
1798           pv = tmpbuf;
1799     }
1800
1801     if (PL_op)
1802         Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
1803                     "Argument \"%s\" isn't numeric in %s", pv,
1804                     OP_DESC(PL_op));
1805     else
1806         Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
1807                     "Argument \"%s\" isn't numeric", pv);
1808 }
1809
1810 /*
1811 =for apidoc looks_like_number
1812
1813 Test if the content of an SV looks like a number (or is a number).
1814 C<Inf> and C<Infinity> are treated as numbers (so will not issue a
1815 non-numeric warning), even if your atof() doesn't grok them.
1816
1817 =cut
1818 */
1819
1820 I32
1821 Perl_looks_like_number(pTHX_ SV *const sv)
1822 {
1823     register const char *sbegin;
1824     STRLEN len;
1825
1826     PERL_ARGS_ASSERT_LOOKS_LIKE_NUMBER;
1827
1828     if (SvPOK(sv)) {
1829         sbegin = SvPVX_const(sv);
1830         len = SvCUR(sv);
1831     }
1832     else if (SvPOKp(sv))
1833         sbegin = SvPV_const(sv, len);
1834     else
1835         return SvFLAGS(sv) & (SVf_NOK|SVp_NOK|SVf_IOK|SVp_IOK);
1836     return grok_number(sbegin, len, NULL);
1837 }
1838
1839 STATIC bool
1840 S_glob_2number(pTHX_ GV * const gv)
1841 {
1842     const U32 wasfake = SvFLAGS(gv) & SVf_FAKE;
1843     SV *const buffer = sv_newmortal();
1844
1845     PERL_ARGS_ASSERT_GLOB_2NUMBER;
1846
1847     /* FAKE globs can get coerced, so need to turn this off temporarily if it
1848        is on.  */
1849     SvFAKE_off(gv);
1850     gv_efullname3(buffer, gv, "*");
1851     SvFLAGS(gv) |= wasfake;
1852
1853     /* We know that all GVs stringify to something that is not-a-number,
1854         so no need to test that.  */
1855     if (ckWARN(WARN_NUMERIC))
1856         not_a_number(buffer);
1857     /* We just want something true to return, so that S_sv_2iuv_common
1858         can tail call us and return true.  */
1859     return TRUE;
1860 }
1861
1862 STATIC char *
1863 S_glob_2pv(pTHX_ GV * const gv, STRLEN * const len)
1864 {
1865     const U32 wasfake = SvFLAGS(gv) & SVf_FAKE;
1866     SV *const buffer = sv_newmortal();
1867
1868     PERL_ARGS_ASSERT_GLOB_2PV;
1869
1870     /* FAKE globs can get coerced, so need to turn this off temporarily if it
1871        is on.  */
1872     SvFAKE_off(gv);
1873     gv_efullname3(buffer, gv, "*");
1874     SvFLAGS(gv) |= wasfake;
1875
1876     assert(SvPOK(buffer));
1877     if (len) {
1878         *len = SvCUR(buffer);
1879     }
1880     return SvPVX(buffer);
1881 }
1882
1883 /* Actually, ISO C leaves conversion of UV to IV undefined, but
1884    until proven guilty, assume that things are not that bad... */
1885
1886 /*
1887    NV_PRESERVES_UV:
1888
1889    As 64 bit platforms often have an NV that doesn't preserve all bits of
1890    an IV (an assumption perl has been based on to date) it becomes necessary
1891    to remove the assumption that the NV always carries enough precision to
1892    recreate the IV whenever needed, and that the NV is the canonical form.
1893    Instead, IV/UV and NV need to be given equal rights. So as to not lose
1894    precision as a side effect of conversion (which would lead to insanity
1895    and the dragon(s) in t/op/numconvert.t getting very angry) the intent is
1896    1) to distinguish between IV/UV/NV slots that have cached a valid
1897       conversion where precision was lost and IV/UV/NV slots that have a
1898       valid conversion which has lost no precision
1899    2) to ensure that if a numeric conversion to one form is requested that
1900       would lose precision, the precise conversion (or differently
1901       imprecise conversion) is also performed and cached, to prevent
1902       requests for different numeric formats on the same SV causing
1903       lossy conversion chains. (lossless conversion chains are perfectly
1904       acceptable (still))
1905
1906
1907    flags are used:
1908    SvIOKp is true if the IV slot contains a valid value
1909    SvIOK  is true only if the IV value is accurate (UV if SvIOK_UV true)
1910    SvNOKp is true if the NV slot contains a valid value
1911    SvNOK  is true only if the NV value is accurate
1912
1913    so
1914    while converting from PV to NV, check to see if converting that NV to an
1915    IV(or UV) would lose accuracy over a direct conversion from PV to
1916    IV(or UV). If it would, cache both conversions, return NV, but mark
1917    SV as IOK NOKp (ie not NOK).
1918
1919    While converting from PV to IV, check to see if converting that IV to an
1920    NV would lose accuracy over a direct conversion from PV to NV. If it
1921    would, cache both conversions, flag similarly.
1922
1923    Before, the SV value "3.2" could become NV=3.2 IV=3 NOK, IOK quite
1924    correctly because if IV & NV were set NV *always* overruled.
1925    Now, "3.2" will become NV=3.2 IV=3 NOK, IOKp, because the flag's meaning
1926    changes - now IV and NV together means that the two are interchangeable:
1927    SvIVX == (IV) SvNVX && SvNVX == (NV) SvIVX;
1928
1929    The benefit of this is that operations such as pp_add know that if
1930    SvIOK is true for both left and right operands, then integer addition
1931    can be used instead of floating point (for cases where the result won't
1932    overflow). Before, floating point was always used, which could lead to
1933    loss of precision compared with integer addition.
1934
1935    * making IV and NV equal status should make maths accurate on 64 bit
1936      platforms
1937    * may speed up maths somewhat if pp_add and friends start to use
1938      integers when possible instead of fp. (Hopefully the overhead in
1939      looking for SvIOK and checking for overflow will not outweigh the
1940      fp to integer speedup)
1941    * will slow down integer operations (callers of SvIV) on "inaccurate"
1942      values, as the change from SvIOK to SvIOKp will cause a call into
1943      sv_2iv each time rather than a macro access direct to the IV slot
1944    * should speed up number->string conversion on integers as IV is
1945      favoured when IV and NV are equally accurate
1946
1947    ####################################################################
1948    You had better be using SvIOK_notUV if you want an IV for arithmetic:
1949    SvIOK is true if (IV or UV), so you might be getting (IV)SvUV.
1950    On the other hand, SvUOK is true iff UV.
1951    ####################################################################
1952
1953    Your mileage will vary depending your CPU's relative fp to integer
1954    performance ratio.
1955 */
1956
1957 #ifndef NV_PRESERVES_UV
1958 #  define IS_NUMBER_UNDERFLOW_IV 1
1959 #  define IS_NUMBER_UNDERFLOW_UV 2
1960 #  define IS_NUMBER_IV_AND_UV    2
1961 #  define IS_NUMBER_OVERFLOW_IV  4
1962 #  define IS_NUMBER_OVERFLOW_UV  5
1963
1964 /* sv_2iuv_non_preserve(): private routine for use by sv_2iv() and sv_2uv() */
1965
1966 /* For sv_2nv these three cases are "SvNOK and don't bother casting"  */
1967 STATIC int
1968 S_sv_2iuv_non_preserve(pTHX_ register SV *const sv
1969 #  ifdef DEBUGGING
1970                        , I32 numtype
1971 #  endif
1972                        )
1973 {
1974     dVAR;
1975
1976     PERL_ARGS_ASSERT_SV_2IUV_NON_PRESERVE;
1977
1978     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));
1979     if (SvNVX(sv) < (NV)IV_MIN) {
1980         (void)SvIOKp_on(sv);
1981         (void)SvNOK_on(sv);
1982         SvIV_set(sv, IV_MIN);
1983         return IS_NUMBER_UNDERFLOW_IV;
1984     }
1985     if (SvNVX(sv) > (NV)UV_MAX) {
1986         (void)SvIOKp_on(sv);
1987         (void)SvNOK_on(sv);
1988         SvIsUV_on(sv);
1989         SvUV_set(sv, UV_MAX);
1990         return IS_NUMBER_OVERFLOW_UV;
1991     }
1992     (void)SvIOKp_on(sv);
1993     (void)SvNOK_on(sv);
1994     /* Can't use strtol etc to convert this string.  (See truth table in
1995        sv_2iv  */
1996     if (SvNVX(sv) <= (UV)IV_MAX) {
1997         SvIV_set(sv, I_V(SvNVX(sv)));
1998         if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
1999             SvIOK_on(sv); /* Integer is precise. NOK, IOK */
2000         } else {
2001             /* Integer is imprecise. NOK, IOKp */
2002         }
2003         return SvNVX(sv) < 0 ? IS_NUMBER_UNDERFLOW_UV : IS_NUMBER_IV_AND_UV;
2004     }
2005     SvIsUV_on(sv);
2006     SvUV_set(sv, U_V(SvNVX(sv)));
2007     if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2008         if (SvUVX(sv) == UV_MAX) {
2009             /* As we know that NVs don't preserve UVs, UV_MAX cannot
2010                possibly be preserved by NV. Hence, it must be overflow.
2011                NOK, IOKp */
2012             return IS_NUMBER_OVERFLOW_UV;
2013         }
2014         SvIOK_on(sv); /* Integer is precise. NOK, UOK */
2015     } else {
2016         /* Integer is imprecise. NOK, IOKp */
2017     }
2018     return IS_NUMBER_OVERFLOW_IV;
2019 }
2020 #endif /* !NV_PRESERVES_UV*/
2021
2022 STATIC bool
2023 S_sv_2iuv_common(pTHX_ SV *const sv)
2024 {
2025     dVAR;
2026
2027     PERL_ARGS_ASSERT_SV_2IUV_COMMON;
2028
2029     if (SvNOKp(sv)) {
2030         /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
2031          * without also getting a cached IV/UV from it at the same time
2032          * (ie PV->NV conversion should detect loss of accuracy and cache
2033          * IV or UV at same time to avoid this. */
2034         /* IV-over-UV optimisation - choose to cache IV if possible */
2035
2036         if (SvTYPE(sv) == SVt_NV)
2037             sv_upgrade(sv, SVt_PVNV);
2038
2039         (void)SvIOKp_on(sv);    /* Must do this first, to clear any SvOOK */
2040         /* < not <= as for NV doesn't preserve UV, ((NV)IV_MAX+1) will almost
2041            certainly cast into the IV range at IV_MAX, whereas the correct
2042            answer is the UV IV_MAX +1. Hence < ensures that dodgy boundary
2043            cases go to UV */
2044 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2045         if (Perl_isnan(SvNVX(sv))) {
2046             SvUV_set(sv, 0);
2047             SvIsUV_on(sv);
2048             return FALSE;
2049         }
2050 #endif
2051         if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2052             SvIV_set(sv, I_V(SvNVX(sv)));
2053             if (SvNVX(sv) == (NV) SvIVX(sv)
2054 #ifndef NV_PRESERVES_UV
2055                 && (((UV)1 << NV_PRESERVES_UV_BITS) >
2056                     (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
2057                 /* Don't flag it as "accurately an integer" if the number
2058                    came from a (by definition imprecise) NV operation, and
2059                    we're outside the range of NV integer precision */
2060 #endif
2061                 ) {
2062                 if (SvNOK(sv))
2063                     SvIOK_on(sv);  /* Can this go wrong with rounding? NWC */
2064                 else {
2065                     /* scalar has trailing garbage, eg "42a" */
2066                 }
2067                 DEBUG_c(PerlIO_printf(Perl_debug_log,
2068                                       "0x%"UVxf" iv(%"NVgf" => %"IVdf") (precise)\n",
2069                                       PTR2UV(sv),
2070                                       SvNVX(sv),
2071                                       SvIVX(sv)));
2072
2073             } else {
2074                 /* IV not precise.  No need to convert from PV, as NV
2075                    conversion would already have cached IV if it detected
2076                    that PV->IV would be better than PV->NV->IV
2077                    flags already correct - don't set public IOK.  */
2078                 DEBUG_c(PerlIO_printf(Perl_debug_log,
2079                                       "0x%"UVxf" iv(%"NVgf" => %"IVdf") (imprecise)\n",
2080                                       PTR2UV(sv),
2081                                       SvNVX(sv),
2082                                       SvIVX(sv)));
2083             }
2084             /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
2085                but the cast (NV)IV_MIN rounds to a the value less (more
2086                negative) than IV_MIN which happens to be equal to SvNVX ??
2087                Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
2088                NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
2089                (NV)UVX == NVX are both true, but the values differ. :-(
2090                Hopefully for 2s complement IV_MIN is something like
2091                0x8000000000000000 which will be exact. NWC */
2092         }
2093         else {
2094             SvUV_set(sv, U_V(SvNVX(sv)));
2095             if (
2096                 (SvNVX(sv) == (NV) SvUVX(sv))
2097 #ifndef  NV_PRESERVES_UV
2098                 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
2099                 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
2100                 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
2101                 /* Don't flag it as "accurately an integer" if the number
2102                    came from a (by definition imprecise) NV operation, and
2103                    we're outside the range of NV integer precision */
2104 #endif
2105                 && SvNOK(sv)
2106                 )
2107                 SvIOK_on(sv);
2108             SvIsUV_on(sv);
2109             DEBUG_c(PerlIO_printf(Perl_debug_log,
2110                                   "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
2111                                   PTR2UV(sv),
2112                                   SvUVX(sv),
2113                                   SvUVX(sv)));
2114         }
2115     }
2116     else if (SvPOKp(sv) && SvLEN(sv)) {
2117         UV value;
2118         const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2119         /* We want to avoid a possible problem when we cache an IV/ a UV which
2120            may be later translated to an NV, and the resulting NV is not
2121            the same as the direct translation of the initial string
2122            (eg 123.456 can shortcut to the IV 123 with atol(), but we must
2123            be careful to ensure that the value with the .456 is around if the
2124            NV value is requested in the future).
2125         
2126            This means that if we cache such an IV/a UV, we need to cache the
2127            NV as well.  Moreover, we trade speed for space, and do not
2128            cache the NV if we are sure it's not needed.
2129          */
2130
2131         /* SVt_PVNV is one higher than SVt_PVIV, hence this order  */
2132         if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2133              == IS_NUMBER_IN_UV) {
2134             /* It's definitely an integer, only upgrade to PVIV */
2135             if (SvTYPE(sv) < SVt_PVIV)
2136                 sv_upgrade(sv, SVt_PVIV);
2137             (void)SvIOK_on(sv);
2138         } else if (SvTYPE(sv) < SVt_PVNV)
2139             sv_upgrade(sv, SVt_PVNV);
2140
2141         /* If NVs preserve UVs then we only use the UV value if we know that
2142            we aren't going to call atof() below. If NVs don't preserve UVs
2143            then the value returned may have more precision than atof() will
2144            return, even though value isn't perfectly accurate.  */
2145         if ((numtype & (IS_NUMBER_IN_UV
2146 #ifdef NV_PRESERVES_UV
2147                         | IS_NUMBER_NOT_INT
2148 #endif
2149             )) == IS_NUMBER_IN_UV) {
2150             /* This won't turn off the public IOK flag if it was set above  */
2151             (void)SvIOKp_on(sv);
2152
2153             if (!(numtype & IS_NUMBER_NEG)) {
2154                 /* positive */;
2155                 if (value <= (UV)IV_MAX) {
2156                     SvIV_set(sv, (IV)value);
2157                 } else {
2158                     /* it didn't overflow, and it was positive. */
2159                     SvUV_set(sv, value);
2160                     SvIsUV_on(sv);
2161                 }
2162             } else {
2163                 /* 2s complement assumption  */
2164                 if (value <= (UV)IV_MIN) {
2165                     SvIV_set(sv, -(IV)value);
2166                 } else {
2167                     /* Too negative for an IV.  This is a double upgrade, but
2168                        I'm assuming it will be rare.  */
2169                     if (SvTYPE(sv) < SVt_PVNV)
2170                         sv_upgrade(sv, SVt_PVNV);
2171                     SvNOK_on(sv);
2172                     SvIOK_off(sv);
2173                     SvIOKp_on(sv);
2174                     SvNV_set(sv, -(NV)value);
2175                     SvIV_set(sv, IV_MIN);
2176                 }
2177             }
2178         }
2179         /* For !NV_PRESERVES_UV and IS_NUMBER_IN_UV and IS_NUMBER_NOT_INT we
2180            will be in the previous block to set the IV slot, and the next
2181            block to set the NV slot.  So no else here.  */
2182         
2183         if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2184             != IS_NUMBER_IN_UV) {
2185             /* It wasn't an (integer that doesn't overflow the UV). */
2186             SvNV_set(sv, Atof(SvPVX_const(sv)));
2187
2188             if (! numtype && ckWARN(WARN_NUMERIC))
2189                 not_a_number(sv);
2190
2191 #if defined(USE_LONG_DOUBLE)
2192             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%" PERL_PRIgldbl ")\n",
2193                                   PTR2UV(sv), SvNVX(sv)));
2194 #else
2195             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"NVgf")\n",
2196                                   PTR2UV(sv), SvNVX(sv)));
2197 #endif
2198
2199 #ifdef NV_PRESERVES_UV
2200             (void)SvIOKp_on(sv);
2201             (void)SvNOK_on(sv);
2202             if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2203                 SvIV_set(sv, I_V(SvNVX(sv)));
2204                 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2205                     SvIOK_on(sv);
2206                 } else {
2207                     NOOP;  /* Integer is imprecise. NOK, IOKp */
2208                 }
2209                 /* UV will not work better than IV */
2210             } else {
2211                 if (SvNVX(sv) > (NV)UV_MAX) {
2212                     SvIsUV_on(sv);
2213                     /* Integer is inaccurate. NOK, IOKp, is UV */
2214                     SvUV_set(sv, UV_MAX);
2215                 } else {
2216                     SvUV_set(sv, U_V(SvNVX(sv)));
2217                     /* 0xFFFFFFFFFFFFFFFF not an issue in here, NVs
2218                        NV preservse UV so can do correct comparison.  */
2219                     if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2220                         SvIOK_on(sv);
2221                     } else {
2222                         NOOP;   /* Integer is imprecise. NOK, IOKp, is UV */
2223                     }
2224                 }
2225                 SvIsUV_on(sv);
2226             }
2227 #else /* NV_PRESERVES_UV */
2228             if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2229                 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
2230                 /* The IV/UV slot will have been set from value returned by
2231                    grok_number above.  The NV slot has just been set using
2232                    Atof.  */
2233                 SvNOK_on(sv);
2234                 assert (SvIOKp(sv));
2235             } else {
2236                 if (((UV)1 << NV_PRESERVES_UV_BITS) >
2237                     U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2238                     /* Small enough to preserve all bits. */
2239                     (void)SvIOKp_on(sv);
2240                     SvNOK_on(sv);
2241                     SvIV_set(sv, I_V(SvNVX(sv)));
2242                     if ((NV)(SvIVX(sv)) == SvNVX(sv))
2243                         SvIOK_on(sv);
2244                     /* Assumption: first non-preserved integer is < IV_MAX,
2245                        this NV is in the preserved range, therefore: */
2246                     if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
2247                           < (UV)IV_MAX)) {
2248                         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);
2249                     }
2250                 } else {
2251                     /* IN_UV NOT_INT
2252                          0      0       already failed to read UV.
2253                          0      1       already failed to read UV.
2254                          1      0       you won't get here in this case. IV/UV
2255                                         slot set, public IOK, Atof() unneeded.
2256                          1      1       already read UV.
2257                        so there's no point in sv_2iuv_non_preserve() attempting
2258                        to use atol, strtol, strtoul etc.  */
2259 #  ifdef DEBUGGING
2260                     sv_2iuv_non_preserve (sv, numtype);
2261 #  else
2262                     sv_2iuv_non_preserve (sv);
2263 #  endif
2264                 }
2265             }
2266 #endif /* NV_PRESERVES_UV */
2267         /* It might be more code efficient to go through the entire logic above
2268            and conditionally set with SvIOKp_on() rather than SvIOK(), but it
2269            gets complex and potentially buggy, so more programmer efficient
2270            to do it this way, by turning off the public flags:  */
2271         if (!numtype)
2272             SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK);
2273         }
2274     }
2275     else  {
2276         if (isGV_with_GP(sv))
2277             return glob_2number(MUTABLE_GV(sv));
2278
2279         if (!(SvFLAGS(sv) & SVs_PADTMP)) {
2280             if (!PL_localizing && ckWARN(WARN_UNINITIALIZED))
2281                 report_uninit(sv);
2282         }
2283         if (SvTYPE(sv) < SVt_IV)
2284             /* Typically the caller expects that sv_any is not NULL now.  */
2285             sv_upgrade(sv, SVt_IV);
2286         /* Return 0 from the caller.  */
2287         return TRUE;
2288     }
2289     return FALSE;
2290 }
2291
2292 /*
2293 =for apidoc sv_2iv_flags
2294
2295 Return the integer value of an SV, doing any necessary string
2296 conversion.  If flags includes SV_GMAGIC, does an mg_get() first.
2297 Normally used via the C<SvIV(sv)> and C<SvIVx(sv)> macros.
2298
2299 =cut
2300 */
2301
2302 IV
2303 Perl_sv_2iv_flags(pTHX_ register SV *const sv, const I32 flags)
2304 {
2305     dVAR;
2306     if (!sv)
2307         return 0;
2308     if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
2309         /* FBMs use the same flag bit as SVf_IVisUV, so must let them
2310            cache IVs just in case. In practice it seems that they never
2311            actually anywhere accessible by user Perl code, let alone get used
2312            in anything other than a string context.  */
2313         if (flags & SV_GMAGIC)
2314             mg_get(sv);
2315         if (SvIOKp(sv))
2316             return SvIVX(sv);
2317         if (SvNOKp(sv)) {
2318             return I_V(SvNVX(sv));
2319         }
2320         if (SvPOKp(sv) && SvLEN(sv)) {
2321             UV value;
2322             const int numtype
2323                 = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2324
2325             if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2326                 == IS_NUMBER_IN_UV) {
2327                 /* It's definitely an integer */
2328                 if (numtype & IS_NUMBER_NEG) {
2329                     if (value < (UV)IV_MIN)
2330                         return -(IV)value;
2331                 } else {
2332                     if (value < (UV)IV_MAX)
2333                         return (IV)value;
2334                 }
2335             }
2336             if (!numtype) {
2337                 if (ckWARN(WARN_NUMERIC))
2338                     not_a_number(sv);
2339             }
2340             return I_V(Atof(SvPVX_const(sv)));
2341         }
2342         if (SvROK(sv)) {
2343             goto return_rok;
2344         }
2345         assert(SvTYPE(sv) >= SVt_PVMG);
2346         /* This falls through to the report_uninit inside S_sv_2iuv_common.  */
2347     } else if (SvTHINKFIRST(sv)) {
2348         if (SvROK(sv)) {
2349         return_rok:
2350             if (SvAMAGIC(sv)) {
2351                 SV * const tmpstr=AMG_CALLun(sv,numer);
2352                 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2353                     return SvIV(tmpstr);
2354                 }
2355             }
2356             return PTR2IV(SvRV(sv));
2357         }
2358         if (SvIsCOW(sv)) {
2359             sv_force_normal_flags(sv, 0);
2360         }
2361         if (SvREADONLY(sv) && !SvOK(sv)) {
2362             if (ckWARN(WARN_UNINITIALIZED))
2363                 report_uninit(sv);
2364             return 0;
2365         }
2366     }
2367     if (!SvIOKp(sv)) {
2368         if (S_sv_2iuv_common(aTHX_ sv))
2369             return 0;
2370     }
2371     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
2372         PTR2UV(sv),SvIVX(sv)));
2373     return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
2374 }
2375
2376 /*
2377 =for apidoc sv_2uv_flags
2378
2379 Return the unsigned integer value of an SV, doing any necessary string
2380 conversion.  If flags includes SV_GMAGIC, does an mg_get() first.
2381 Normally used via the C<SvUV(sv)> and C<SvUVx(sv)> macros.
2382
2383 =cut
2384 */
2385
2386 UV
2387 Perl_sv_2uv_flags(pTHX_ register SV *const sv, const I32 flags)
2388 {
2389     dVAR;
2390     if (!sv)
2391         return 0;
2392     if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
2393         /* FBMs use the same flag bit as SVf_IVisUV, so must let them
2394            cache IVs just in case.  */
2395         if (flags & SV_GMAGIC)
2396             mg_get(sv);
2397         if (SvIOKp(sv))
2398             return SvUVX(sv);
2399         if (SvNOKp(sv))
2400             return U_V(SvNVX(sv));
2401         if (SvPOKp(sv) && SvLEN(sv)) {
2402             UV value;
2403             const int numtype
2404                 = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2405
2406             if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2407                 == IS_NUMBER_IN_UV) {
2408                 /* It's definitely an integer */
2409                 if (!(numtype & IS_NUMBER_NEG))
2410                     return value;
2411             }
2412             if (!numtype) {
2413                 if (ckWARN(WARN_NUMERIC))
2414                     not_a_number(sv);
2415             }
2416             return U_V(Atof(SvPVX_const(sv)));
2417         }
2418         if (SvROK(sv)) {
2419             goto return_rok;
2420         }
2421         assert(SvTYPE(sv) >= SVt_PVMG);
2422         /* This falls through to the report_uninit inside S_sv_2iuv_common.  */
2423     } else if (SvTHINKFIRST(sv)) {
2424         if (SvROK(sv)) {
2425         return_rok:
2426             if (SvAMAGIC(sv)) {
2427                 SV *const tmpstr = AMG_CALLun(sv,numer);
2428                 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2429                     return SvUV(tmpstr);
2430                 }
2431             }
2432             return PTR2UV(SvRV(sv));
2433         }
2434         if (SvIsCOW(sv)) {
2435             sv_force_normal_flags(sv, 0);
2436         }
2437         if (SvREADONLY(sv) && !SvOK(sv)) {
2438             if (ckWARN(WARN_UNINITIALIZED))
2439                 report_uninit(sv);
2440             return 0;
2441         }
2442     }
2443     if (!SvIOKp(sv)) {
2444         if (S_sv_2iuv_common(aTHX_ sv))
2445             return 0;
2446     }
2447
2448     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
2449                           PTR2UV(sv),SvUVX(sv)));
2450     return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
2451 }
2452
2453 /*
2454 =for apidoc sv_2nv
2455
2456 Return the num value of an SV, doing any necessary string or integer
2457 conversion, magic etc. Normally used via the C<SvNV(sv)> and C<SvNVx(sv)>
2458 macros.
2459
2460 =cut
2461 */
2462
2463 NV
2464 Perl_sv_2nv(pTHX_ register SV *const sv)
2465 {
2466     dVAR;
2467     if (!sv)
2468         return 0.0;
2469     if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
2470         /* FBMs use the same flag bit as SVf_IVisUV, so must let them
2471            cache IVs just in case.  */
2472         mg_get(sv);
2473         if (SvNOKp(sv))
2474             return SvNVX(sv);
2475         if ((SvPOKp(sv) && SvLEN(sv)) && !SvIOKp(sv)) {
2476             if (!SvIOKp(sv) && ckWARN(WARN_NUMERIC) &&
2477                 !grok_number(SvPVX_const(sv), SvCUR(sv), NULL))
2478                 not_a_number(sv);
2479             return Atof(SvPVX_const(sv));
2480         }
2481         if (SvIOKp(sv)) {
2482             if (SvIsUV(sv))
2483                 return (NV)SvUVX(sv);
2484             else
2485                 return (NV)SvIVX(sv);
2486         }
2487         if (SvROK(sv)) {
2488             goto return_rok;
2489         }
2490         assert(SvTYPE(sv) >= SVt_PVMG);
2491         /* This falls through to the report_uninit near the end of the
2492            function. */
2493     } else if (SvTHINKFIRST(sv)) {
2494         if (SvROK(sv)) {
2495         return_rok:
2496             if (SvAMAGIC(sv)) {
2497                 SV *const tmpstr = AMG_CALLun(sv,numer);
2498                 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2499                     return SvNV(tmpstr);
2500                 }
2501             }
2502             return PTR2NV(SvRV(sv));
2503         }
2504         if (SvIsCOW(sv)) {
2505             sv_force_normal_flags(sv, 0);
2506         }
2507         if (SvREADONLY(sv) && !SvOK(sv)) {
2508             if (ckWARN(WARN_UNINITIALIZED))
2509                 report_uninit(sv);
2510             return 0.0;
2511         }
2512     }
2513     if (SvTYPE(sv) < SVt_NV) {
2514         /* The logic to use SVt_PVNV if necessary is in sv_upgrade.  */
2515         sv_upgrade(sv, SVt_NV);
2516 #ifdef USE_LONG_DOUBLE
2517         DEBUG_c({
2518             STORE_NUMERIC_LOCAL_SET_STANDARD();
2519             PerlIO_printf(Perl_debug_log,
2520                           "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
2521                           PTR2UV(sv), SvNVX(sv));
2522             RESTORE_NUMERIC_LOCAL();
2523         });
2524 #else
2525         DEBUG_c({
2526             STORE_NUMERIC_LOCAL_SET_STANDARD();
2527             PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%"NVgf")\n",
2528                           PTR2UV(sv), SvNVX(sv));
2529             RESTORE_NUMERIC_LOCAL();
2530         });
2531 #endif
2532     }
2533     else if (SvTYPE(sv) < SVt_PVNV)
2534         sv_upgrade(sv, SVt_PVNV);
2535     if (SvNOKp(sv)) {
2536         return SvNVX(sv);
2537     }
2538     if (SvIOKp(sv)) {
2539         SvNV_set(sv, SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv));
2540 #ifdef NV_PRESERVES_UV
2541         if (SvIOK(sv))
2542             SvNOK_on(sv);
2543         else
2544             SvNOKp_on(sv);
2545 #else
2546         /* Only set the public NV OK flag if this NV preserves the IV  */
2547         /* Check it's not 0xFFFFFFFFFFFFFFFF */
2548         if (SvIOK(sv) &&
2549             SvIsUV(sv) ? ((SvUVX(sv) != UV_MAX)&&(SvUVX(sv) == U_V(SvNVX(sv))))
2550                        : (SvIVX(sv) == I_V(SvNVX(sv))))
2551             SvNOK_on(sv);
2552         else
2553             SvNOKp_on(sv);
2554 #endif
2555     }
2556     else if (SvPOKp(sv) && SvLEN(sv)) {
2557         UV value;
2558         const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2559         if (!SvIOKp(sv) && !numtype && ckWARN(WARN_NUMERIC))
2560             not_a_number(sv);
2561 #ifdef NV_PRESERVES_UV
2562         if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2563             == IS_NUMBER_IN_UV) {
2564             /* It's definitely an integer */
2565             SvNV_set(sv, (numtype & IS_NUMBER_NEG) ? -(NV)value : (NV)value);
2566         } else
2567             SvNV_set(sv, Atof(SvPVX_const(sv)));
2568         if (numtype)
2569             SvNOK_on(sv);
2570         else
2571             SvNOKp_on(sv);
2572 #else
2573         SvNV_set(sv, Atof(SvPVX_const(sv)));
2574         /* Only set the public NV OK flag if this NV preserves the value in
2575            the PV at least as well as an IV/UV would.
2576            Not sure how to do this 100% reliably. */
2577         /* if that shift count is out of range then Configure's test is
2578            wonky. We shouldn't be in here with NV_PRESERVES_UV_BITS ==
2579            UV_BITS */
2580         if (((UV)1 << NV_PRESERVES_UV_BITS) >
2581             U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2582             SvNOK_on(sv); /* Definitely small enough to preserve all bits */
2583         } else if (!(numtype & IS_NUMBER_IN_UV)) {
2584             /* Can't use strtol etc to convert this string, so don't try.
2585                sv_2iv and sv_2uv will use the NV to convert, not the PV.  */
2586             SvNOK_on(sv);
2587         } else {
2588             /* value has been set.  It may not be precise.  */
2589             if ((numtype & IS_NUMBER_NEG) && (value > (UV)IV_MIN)) {
2590                 /* 2s complement assumption for (UV)IV_MIN  */
2591                 SvNOK_on(sv); /* Integer is too negative.  */
2592             } else {
2593                 SvNOKp_on(sv);
2594                 SvIOKp_on(sv);
2595
2596                 if (numtype & IS_NUMBER_NEG) {
2597                     SvIV_set(sv, -(IV)value);
2598                 } else if (value <= (UV)IV_MAX) {
2599                     SvIV_set(sv, (IV)value);
2600                 } else {
2601                     SvUV_set(sv, value);
2602                     SvIsUV_on(sv);
2603                 }
2604
2605                 if (numtype & IS_NUMBER_NOT_INT) {
2606                     /* I believe that even if the original PV had decimals,
2607                        they are lost beyond the limit of the FP precision.
2608                        However, neither is canonical, so both only get p
2609                        flags.  NWC, 2000/11/25 */
2610                     /* Both already have p flags, so do nothing */
2611                 } else {
2612                     const NV nv = SvNVX(sv);
2613                     if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2614                         if (SvIVX(sv) == I_V(nv)) {
2615                             SvNOK_on(sv);
2616                         } else {
2617                             /* It had no "." so it must be integer.  */
2618                         }
2619                         SvIOK_on(sv);
2620                     } else {
2621                         /* between IV_MAX and NV(UV_MAX).
2622                            Could be slightly > UV_MAX */
2623
2624                         if (numtype & IS_NUMBER_NOT_INT) {
2625                             /* UV and NV both imprecise.  */
2626                         } else {
2627                             const UV nv_as_uv = U_V(nv);
2628
2629                             if (value == nv_as_uv && SvUVX(sv) != UV_MAX) {
2630                                 SvNOK_on(sv);
2631                             }
2632                             SvIOK_on(sv);
2633                         }
2634                     }
2635                 }
2636             }
2637         }
2638         /* It might be more code efficient to go through the entire logic above
2639            and conditionally set with SvNOKp_on() rather than SvNOK(), but it
2640            gets complex and potentially buggy, so more programmer efficient
2641            to do it this way, by turning off the public flags:  */
2642         if (!numtype)
2643             SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK);
2644 #endif /* NV_PRESERVES_UV */
2645     }
2646     else  {
2647         if (isGV_with_GP(sv)) {
2648             glob_2number(MUTABLE_GV(sv));
2649             return 0.0;
2650         }
2651
2652         if (!PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP) && ckWARN(WARN_UNINITIALIZED))
2653             report_uninit(sv);
2654         assert (SvTYPE(sv) >= SVt_NV);
2655         /* Typically the caller expects that sv_any is not NULL now.  */
2656         /* XXX Ilya implies that this is a bug in callers that assume this
2657            and ideally should be fixed.  */
2658         return 0.0;
2659     }
2660 #if defined(USE_LONG_DOUBLE)
2661     DEBUG_c({
2662         STORE_NUMERIC_LOCAL_SET_STANDARD();
2663         PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
2664                       PTR2UV(sv), SvNVX(sv));
2665         RESTORE_NUMERIC_LOCAL();
2666     });
2667 #else
2668     DEBUG_c({
2669         STORE_NUMERIC_LOCAL_SET_STANDARD();
2670         PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%"NVgf")\n",
2671                       PTR2UV(sv), SvNVX(sv));
2672         RESTORE_NUMERIC_LOCAL();
2673     });
2674 #endif
2675     return SvNVX(sv);
2676 }
2677
2678 /*
2679 =for apidoc sv_2num
2680
2681 Return an SV with the numeric value of the source SV, doing any necessary
2682 reference or overload conversion.  You must use the C<SvNUM(sv)> macro to
2683 access this function.
2684
2685 =cut
2686 */
2687
2688 SV *
2689 Perl_sv_2num(pTHX_ register SV *const sv)
2690 {
2691     PERL_ARGS_ASSERT_SV_2NUM;
2692
2693     if (!SvROK(sv))
2694         return sv;
2695     if (SvAMAGIC(sv)) {
2696         SV * const tmpsv = AMG_CALLun(sv,numer);
2697         if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
2698             return sv_2num(tmpsv);
2699     }
2700     return sv_2mortal(newSVuv(PTR2UV(SvRV(sv))));
2701 }
2702
2703 /* uiv_2buf(): private routine for use by sv_2pv_flags(): print an IV or
2704  * UV as a string towards the end of buf, and return pointers to start and
2705  * end of it.
2706  *
2707  * We assume that buf is at least TYPE_CHARS(UV) long.
2708  */
2709
2710 static char *
2711 S_uiv_2buf(char *const buf, const IV iv, UV uv, const int is_uv, char **const peob)
2712 {
2713     char *ptr = buf + TYPE_CHARS(UV);
2714     char * const ebuf = ptr;
2715     int sign;
2716
2717     PERL_ARGS_ASSERT_UIV_2BUF;
2718
2719     if (is_uv)
2720         sign = 0;
2721     else if (iv >= 0) {
2722         uv = iv;
2723         sign = 0;
2724     } else {
2725         uv = -iv;
2726         sign = 1;
2727     }
2728     do {
2729         *--ptr = '0' + (char)(uv % 10);
2730     } while (uv /= 10);
2731     if (sign)
2732         *--ptr = '-';
2733     *peob = ebuf;
2734     return ptr;
2735 }
2736
2737 /*
2738 =for apidoc sv_2pv_flags
2739
2740 Returns a pointer to the string value of an SV, and sets *lp to its length.
2741 If flags includes SV_GMAGIC, does an mg_get() first. Coerces sv to a string
2742 if necessary.
2743 Normally invoked via the C<SvPV_flags> macro. C<sv_2pv()> and C<sv_2pv_nomg>
2744 usually end up here too.
2745
2746 =cut
2747 */
2748
2749 char *
2750 Perl_sv_2pv_flags(pTHX_ register SV *const sv, STRLEN *const lp, const I32 flags)
2751 {
2752     dVAR;
2753     register char *s;
2754
2755     if (!sv) {
2756         if (lp)
2757             *lp = 0;
2758         return (char *)"";
2759     }
2760     if (SvGMAGICAL(sv)) {
2761         if (flags & SV_GMAGIC)
2762             mg_get(sv);
2763         if (SvPOKp(sv)) {
2764             if (lp)
2765                 *lp = SvCUR(sv);
2766             if (flags & SV_MUTABLE_RETURN)
2767                 return SvPVX_mutable(sv);
2768             if (flags & SV_CONST_RETURN)
2769                 return (char *)SvPVX_const(sv);
2770             return SvPVX(sv);
2771         }
2772         if (SvIOKp(sv) || SvNOKp(sv)) {
2773             char tbuf[64];  /* Must fit sprintf/Gconvert of longest IV/NV */
2774             STRLEN len;
2775
2776             if (SvIOKp(sv)) {
2777                 len = SvIsUV(sv)
2778                     ? my_snprintf(tbuf, sizeof(tbuf), "%"UVuf, (UV)SvUVX(sv))
2779                     : my_snprintf(tbuf, sizeof(tbuf), "%"IVdf, (IV)SvIVX(sv));
2780             } else {
2781                 Gconvert(SvNVX(sv), NV_DIG, 0, tbuf);
2782                 len = strlen(tbuf);
2783             }
2784             assert(!SvROK(sv));
2785             {
2786                 dVAR;
2787
2788 #ifdef FIXNEGATIVEZERO
2789                 if (len == 2 && tbuf[0] == '-' && tbuf[1] == '0') {
2790                     tbuf[0] = '0';
2791                     tbuf[1] = 0;
2792                     len = 1;
2793                 }
2794 #endif
2795                 SvUPGRADE(sv, SVt_PV);
2796                 if (lp)
2797                     *lp = len;
2798                 s = SvGROW_mutable(sv, len + 1);
2799                 SvCUR_set(sv, len);
2800                 SvPOKp_on(sv);
2801                 return (char*)memcpy(s, tbuf, len + 1);
2802             }
2803         }
2804         if (SvROK(sv)) {
2805             goto return_rok;
2806         }
2807         assert(SvTYPE(sv) >= SVt_PVMG);
2808         /* This falls through to the report_uninit near the end of the
2809            function. */
2810     } else if (SvTHINKFIRST(sv)) {
2811         if (SvROK(sv)) {
2812         return_rok:
2813             if (SvAMAGIC(sv)) {
2814                 SV *const tmpstr = AMG_CALLun(sv,string);
2815                 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2816                     /* Unwrap this:  */
2817                     /* char *pv = lp ? SvPV(tmpstr, *lp) : SvPV_nolen(tmpstr);
2818                      */
2819
2820                     char *pv;
2821                     if ((SvFLAGS(tmpstr) & (SVf_POK)) == SVf_POK) {
2822                         if (flags & SV_CONST_RETURN) {
2823                             pv = (char *) SvPVX_const(tmpstr);
2824                         } else {
2825                             pv = (flags & SV_MUTABLE_RETURN)
2826                                 ? SvPVX_mutable(tmpstr) : SvPVX(tmpstr);
2827                         }
2828                         if (lp)
2829                             *lp = SvCUR(tmpstr);
2830                     } else {
2831                         pv = sv_2pv_flags(tmpstr, lp, flags);
2832                     }
2833                     if (SvUTF8(tmpstr))
2834                         SvUTF8_on(sv);
2835                     else
2836                         SvUTF8_off(sv);
2837                     return pv;
2838                 }
2839             }
2840             {
2841                 STRLEN len;
2842                 char *retval;
2843                 char *buffer;
2844                 SV *const referent = SvRV(sv);
2845
2846                 if (!referent) {
2847                     len = 7;
2848                     retval = buffer = savepvn("NULLREF", len);
2849                 } else if (SvTYPE(referent) == SVt_REGEXP) {
2850                     REGEXP * const re = (REGEXP *)MUTABLE_PTR(referent);
2851                     I32 seen_evals = 0;
2852
2853                     assert(re);
2854                         
2855                     /* If the regex is UTF-8 we want the containing scalar to
2856                        have an UTF-8 flag too */
2857                     if (RX_UTF8(re))
2858                         SvUTF8_on(sv);
2859                     else
2860                         SvUTF8_off(sv); 
2861
2862                     if ((seen_evals = RX_SEEN_EVALS(re)))
2863                         PL_reginterp_cnt += seen_evals;
2864
2865                     if (lp)
2866                         *lp = RX_WRAPLEN(re);
2867  
2868                     return RX_WRAPPED(re);
2869                 } else {
2870                     const char *const typestr = sv_reftype(referent, 0);
2871                     const STRLEN typelen = strlen(typestr);
2872                     UV addr = PTR2UV(referent);
2873                     const char *stashname = NULL;
2874                     STRLEN stashnamelen = 0; /* hush, gcc */
2875                     const char *buffer_end;
2876
2877                     if (SvOBJECT(referent)) {
2878                         const HEK *const name = HvNAME_HEK(SvSTASH(referent));
2879
2880                         if (name) {
2881                             stashname = HEK_KEY(name);
2882                             stashnamelen = HEK_LEN(name);
2883
2884                             if (HEK_UTF8(name)) {
2885                                 SvUTF8_on(sv);
2886                             } else {
2887                                 SvUTF8_off(sv);
2888                             }
2889                         } else {
2890                             stashname = "__ANON__";
2891                             stashnamelen = 8;
2892                         }
2893                         len = stashnamelen + 1 /* = */ + typelen + 3 /* (0x */
2894                             + 2 * sizeof(UV) + 2 /* )\0 */;
2895                     } else {
2896                         len = typelen + 3 /* (0x */
2897                             + 2 * sizeof(UV) + 2 /* )\0 */;
2898                     }
2899
2900                     Newx(buffer, len, char);
2901                     buffer_end = retval = buffer + len;
2902
2903                     /* Working backwards  */
2904                     *--retval = '\0';
2905                     *--retval = ')';
2906                     do {
2907                         *--retval = PL_hexdigit[addr & 15];
2908                     } while (addr >>= 4);
2909                     *--retval = 'x';
2910                     *--retval = '0';
2911                     *--retval = '(';
2912
2913                     retval -= typelen;
2914                     memcpy(retval, typestr, typelen);
2915
2916                     if (stashname) {
2917                         *--retval = '=';
2918                         retval -= stashnamelen;
2919                         memcpy(retval, stashname, stashnamelen);
2920                     }
2921                     /* retval may not neccesarily have reached the start of the
2922                        buffer here.  */
2923                     assert (retval >= buffer);
2924
2925                     len = buffer_end - retval - 1; /* -1 for that \0  */
2926                 }
2927                 if (lp)
2928                     *lp = len;
2929                 SAVEFREEPV(buffer);
2930                 return retval;
2931             }
2932         }
2933         if (SvREADONLY(sv) && !SvOK(sv)) {
2934             if (lp)
2935                 *lp = 0;
2936             if (flags & SV_UNDEF_RETURNS_NULL)
2937                 return NULL;
2938             if (ckWARN(WARN_UNINITIALIZED))
2939                 report_uninit(sv);
2940             return (char *)"";
2941         }
2942     }
2943     if (SvIOK(sv) || ((SvIOKp(sv) && !SvNOKp(sv)))) {
2944         /* I'm assuming that if both IV and NV are equally valid then
2945            converting the IV is going to be more efficient */
2946         const U32 isUIOK = SvIsUV(sv);
2947         char buf[TYPE_CHARS(UV)];
2948         char *ebuf, *ptr;
2949         STRLEN len;
2950
2951         if (SvTYPE(sv) < SVt_PVIV)
2952             sv_upgrade(sv, SVt_PVIV);
2953         ptr = uiv_2buf(buf, SvIVX(sv), SvUVX(sv), isUIOK, &ebuf);
2954         len = ebuf - ptr;
2955         /* inlined from sv_setpvn */
2956         s = SvGROW_mutable(sv, len + 1);
2957         Move(ptr, s, len, char);
2958         s += len;
2959         *s = '\0';
2960     }
2961     else if (SvNOKp(sv)) {
2962         dSAVE_ERRNO;
2963         if (SvTYPE(sv) < SVt_PVNV)
2964             sv_upgrade(sv, SVt_PVNV);
2965         /* The +20 is pure guesswork.  Configure test needed. --jhi */
2966         s = SvGROW_mutable(sv, NV_DIG + 20);
2967         /* some Xenix systems wipe out errno here */
2968 #ifdef apollo
2969         if (SvNVX(sv) == 0.0)
2970             my_strlcpy(s, "0", SvLEN(sv));
2971         else
2972 #endif /*apollo*/
2973         {
2974             Gconvert(SvNVX(sv), NV_DIG, 0, s);
2975         }
2976         RESTORE_ERRNO;
2977 #ifdef FIXNEGATIVEZERO
2978         if (*s == '-' && s[1] == '0' && !s[2]) {
2979             s[0] = '0';
2980             s[1] = 0;
2981         }
2982 #endif
2983         while (*s) s++;
2984 #ifdef hcx
2985         if (s[-1] == '.')
2986             *--s = '\0';
2987 #endif
2988     }
2989     else {
2990         if (isGV_with_GP(sv))
2991             return glob_2pv(MUTABLE_GV(sv), lp);
2992
2993         if (lp)
2994             *lp = 0;
2995         if (flags & SV_UNDEF_RETURNS_NULL)
2996             return NULL;
2997         if (!PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP) && ckWARN(WARN_UNINITIALIZED))
2998             report_uninit(sv);
2999         if (SvTYPE(sv) < SVt_PV)
3000             /* Typically the caller expects that sv_any is not NULL now.  */
3001             sv_upgrade(sv, SVt_PV);
3002         return (char *)"";
3003     }
3004     {
3005         const STRLEN len = s - SvPVX_const(sv);
3006         if (lp) 
3007             *lp = len;
3008         SvCUR_set(sv, len);
3009     }
3010     SvPOK_on(sv);
3011     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3012                           PTR2UV(sv),SvPVX_const(sv)));
3013     if (flags & SV_CONST_RETURN)
3014         return (char *)SvPVX_const(sv);
3015     if (flags & SV_MUTABLE_RETURN)
3016         return SvPVX_mutable(sv);
3017     return SvPVX(sv);
3018 }
3019
3020 /*
3021 =for apidoc sv_copypv
3022
3023 Copies a stringified representation of the source SV into the
3024 destination SV.  Automatically performs any necessary mg_get and
3025 coercion of numeric values into strings.  Guaranteed to preserve
3026 UTF8 flag even from overloaded objects.  Similar in nature to
3027 sv_2pv[_flags] but operates directly on an SV instead of just the
3028 string.  Mostly uses sv_2pv_flags to do its work, except when that
3029 would lose the UTF-8'ness of the PV.
3030
3031 =cut
3032 */
3033
3034 void
3035 Perl_sv_copypv(pTHX_ SV *const dsv, register SV *const ssv)
3036 {
3037     STRLEN len;
3038     const char * const s = SvPV_const(ssv,len);
3039
3040     PERL_ARGS_ASSERT_SV_COPYPV;
3041
3042     sv_setpvn(dsv,s,len);
3043     if (SvUTF8(ssv))
3044         SvUTF8_on(dsv);
3045     else
3046         SvUTF8_off(dsv);
3047 }
3048
3049 /*
3050 =for apidoc sv_2pvbyte
3051
3052 Return a pointer to the byte-encoded representation of the SV, and set *lp
3053 to its length.  May cause the SV to be downgraded from UTF-8 as a
3054 side-effect.
3055
3056 Usually accessed via the C<SvPVbyte> macro.
3057
3058 =cut
3059 */
3060
3061 char *
3062 Perl_sv_2pvbyte(pTHX_ register SV *const sv, STRLEN *const lp)
3063 {
3064     PERL_ARGS_ASSERT_SV_2PVBYTE;
3065
3066     sv_utf8_downgrade(sv,0);
3067     return lp ? SvPV(sv,*lp) : SvPV_nolen(sv);
3068 }
3069
3070 /*
3071 =for apidoc sv_2pvutf8
3072
3073 Return a pointer to the UTF-8-encoded representation of the SV, and set *lp
3074 to its length.  May cause the SV to be upgraded to UTF-8 as a side-effect.
3075
3076 Usually accessed via the C<SvPVutf8> macro.
3077
3078 =cut
3079 */
3080
3081 char *
3082 Perl_sv_2pvutf8(pTHX_ register SV *const sv, STRLEN *const lp)
3083 {
3084     PERL_ARGS_ASSERT_SV_2PVUTF8;
3085
3086     sv_utf8_upgrade(sv);
3087     return lp ? SvPV(sv,*lp) : SvPV_nolen(sv);
3088 }
3089
3090
3091 /*
3092 =for apidoc sv_2bool
3093
3094 This function is only called on magical items, and is only used by
3095 sv_true() or its macro equivalent.
3096
3097 =cut
3098 */
3099
3100 bool
3101 Perl_sv_2bool(pTHX_ register SV *const sv)
3102 {
3103     dVAR;
3104
3105     PERL_ARGS_ASSERT_SV_2BOOL;
3106
3107     SvGETMAGIC(sv);
3108
3109     if (!SvOK(sv))
3110         return 0;
3111     if (SvROK(sv)) {
3112         if (SvAMAGIC(sv)) {
3113             SV * const tmpsv = AMG_CALLun(sv,bool_);
3114             if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
3115                 return (bool)SvTRUE(tmpsv);
3116         }
3117         return SvRV(sv) != 0;
3118     }
3119     if (SvPOKp(sv)) {
3120         register XPV* const Xpvtmp = (XPV*)SvANY(sv);
3121         if (Xpvtmp &&
3122                 (*sv->sv_u.svu_pv > '0' ||
3123                 Xpvtmp->xpv_cur > 1 ||
3124                 (Xpvtmp->xpv_cur && *sv->sv_u.svu_pv != '0')))
3125             return 1;
3126         else
3127             return 0;
3128     }
3129     else {
3130         if (SvIOKp(sv))
3131             return SvIVX(sv) != 0;
3132         else {
3133             if (SvNOKp(sv))
3134                 return SvNVX(sv) != 0.0;
3135             else {
3136                 if (isGV_with_GP(sv))
3137                     return TRUE;
3138                 else
3139                     return FALSE;
3140             }
3141         }
3142     }
3143 }
3144
3145 /*
3146 =for apidoc sv_utf8_upgrade
3147
3148 Converts the PV of an SV to its UTF-8-encoded form.
3149 Forces the SV to string form if it is not already.
3150 Will C<mg_get> on C<sv> if appropriate.
3151 Always sets the SvUTF8 flag to avoid future validity checks even
3152 if the whole string is the same in UTF-8 as not.
3153 Returns the number of bytes in the converted string
3154
3155 This is not as a general purpose byte encoding to Unicode interface:
3156 use the Encode extension for that.
3157
3158 =for apidoc sv_utf8_upgrade_nomg
3159
3160 Like sv_utf8_upgrade, but doesn't do magic on C<sv>
3161
3162 =for apidoc sv_utf8_upgrade_flags
3163
3164 Converts the PV of an SV to its UTF-8-encoded form.
3165 Forces the SV to string form if it is not already.
3166 Always sets the SvUTF8 flag to avoid future validity checks even
3167 if all the bytes are invariant in UTF-8. If C<flags> has C<SV_GMAGIC> bit set,
3168 will C<mg_get> on C<sv> if appropriate, else not.
3169 Returns the number of bytes in the converted string
3170 C<sv_utf8_upgrade> and
3171 C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
3172
3173 This is not as a general purpose byte encoding to Unicode interface:
3174 use the Encode extension for that.
3175
3176 =cut
3177
3178 The grow version is currently not externally documented.  It adds a parameter,
3179 extra, which is the number of unused bytes the string of 'sv' is guaranteed to
3180 have free after it upon return.  This allows the caller to reserve extra space
3181 that it intends to fill, to avoid extra grows.
3182
3183 Also externally undocumented for the moment is the flag SV_FORCE_UTF8_UPGRADE,
3184 which can be used to tell this function to not first check to see if there are
3185 any characters that are different in UTF-8 (variant characters) which would
3186 force it to allocate a new string to sv, but to assume there are.  Typically
3187 this flag is used by a routine that has already parsed the string to find that
3188 there are such characters, and passes this information on so that the work
3189 doesn't have to be repeated.
3190
3191 (One might think that the calling routine could pass in the position of the
3192 first such variant, so it wouldn't have to be found again.  But that is not the
3193 case, because typically when the caller is likely to use this flag, it won't be
3194 calling this routine unless it finds something that won't fit into a byte.
3195 Otherwise it tries to not upgrade and just use bytes.  But some things that
3196 do fit into a byte are variants in utf8, and the caller may not have been
3197 keeping track of these.)
3198
3199 If the routine itself changes the string, it adds a trailing NUL.  Such a NUL
3200 isn't guaranteed due to having other routines do the work in some input cases,
3201 or if the input is already flagged as being in utf8.
3202
3203 The speed of this could perhaps be improved for many cases if someone wanted to
3204 write a fast function that counts the number of variant characters in a string,
3205 especially if it could return the position of the first one.
3206
3207 */
3208
3209 STRLEN
3210 Perl_sv_utf8_upgrade_flags_grow(pTHX_ register SV *const sv, const I32 flags, STRLEN extra)
3211 {
3212     dVAR;
3213
3214     PERL_ARGS_ASSERT_SV_UTF8_UPGRADE_FLAGS_GROW;
3215
3216     if (sv == &PL_sv_undef)
3217         return 0;
3218     if (!SvPOK(sv)) {
3219         STRLEN len = 0;
3220         if (SvREADONLY(sv) && (SvPOKp(sv) || SvIOKp(sv) || SvNOKp(sv))) {
3221             (void) sv_2pv_flags(sv,&len, flags);
3222             if (SvUTF8(sv)) {
3223                 if (extra) SvGROW(sv, SvCUR(sv) + extra);
3224                 return len;
3225             }
3226         } else {
3227             (void) SvPV_force(sv,len);
3228         }
3229     }
3230
3231     if (SvUTF8(sv)) {
3232         if (extra) SvGROW(sv, SvCUR(sv) + extra);
3233         return SvCUR(sv);
3234     }
3235
3236     if (SvIsCOW(sv)) {
3237         sv_force_normal_flags(sv, 0);
3238     }
3239
3240     if (PL_encoding && !(flags & SV_UTF8_NO_ENCODING)) {
3241         sv_recode_to_utf8(sv, PL_encoding);
3242         if (extra) SvGROW(sv, SvCUR(sv) + extra);
3243         return SvCUR(sv);
3244     }
3245
3246     if (SvCUR(sv) > 0) { /* Assume Latin-1/EBCDIC */
3247         /* This function could be much more efficient if we
3248          * had a FLAG in SVs to signal if there are any variant
3249          * chars in the PV.  Given that there isn't such a flag
3250          * make the loop as fast as possible (although there are certainly ways
3251          * to speed this up, eg. through vectorization) */
3252         U8 * s = (U8 *) SvPVX_const(sv);
3253         U8 * e = (U8 *) SvEND(sv);
3254         U8 *t = s;
3255         STRLEN two_byte_count = 0;
3256         
3257         if (flags & SV_FORCE_UTF8_UPGRADE) goto must_be_utf8;
3258
3259         /* See if really will need to convert to utf8.  We mustn't rely on our
3260          * incoming SV being well formed and having a trailing '\0', as certain
3261          * code in pp_formline can send us partially built SVs. */
3262
3263         while (t < e) {
3264             const U8 ch = *t++;
3265             if (NATIVE_IS_INVARIANT(ch)) continue;
3266
3267             t--;    /* t already incremented; re-point to first variant */
3268             two_byte_count = 1;
3269             goto must_be_utf8;
3270         }
3271
3272         /* utf8 conversion not needed because all are invariants.  Mark as
3273          * UTF-8 even if no variant - saves scanning loop */
3274         SvUTF8_on(sv);
3275         return SvCUR(sv);
3276
3277 must_be_utf8:
3278
3279         /* Here, the string should be converted to utf8, either because of an
3280          * input flag (two_byte_count = 0), or because a character that
3281          * requires 2 bytes was found (two_byte_count = 1).  t points either to
3282          * the beginning of the string (if we didn't examine anything), or to
3283          * the first variant.  In either case, everything from s to t - 1 will
3284          * occupy only 1 byte each on output.
3285          *
3286          * There are two main ways to convert.  One is to create a new string
3287          * and go through the input starting from the beginning, appending each
3288          * converted value onto the new string as we go along.  It's probably
3289          * best to allocate enough space in the string for the worst possible
3290          * case rather than possibly running out of space and having to
3291          * reallocate and then copy what we've done so far.  Since everything
3292          * from s to t - 1 is invariant, the destination can be initialized
3293          * with these using a fast memory copy
3294          *
3295          * The other way is to figure out exactly how big the string should be
3296          * by parsing the entire input.  Then you don't have to make it big
3297          * enough to handle the worst possible case, and more importantly, if
3298          * the string you already have is large enough, you don't have to
3299          * allocate a new string, you can copy the last character in the input
3300          * string to the final position(s) that will be occupied by the
3301          * converted string and go backwards, stopping at t, since everything
3302          * before that is invariant.
3303          *
3304          * There are advantages and disadvantages to each method.
3305          *
3306          * In the first method, we can allocate a new string, do the memory
3307          * copy from the s to t - 1, and then proceed through the rest of the
3308          * string byte-by-byte.
3309          *
3310          * In the second method, we proceed through the rest of the input
3311          * string just calculating how big the converted string will be.  Then
3312          * there are two cases:
3313          *  1)  if the string has enough extra space to handle the converted
3314          *      value.  We go backwards through the string, converting until we
3315          *      get to the position we are at now, and then stop.  If this
3316          *      position is far enough along in the string, this method is
3317          *      faster than the other method.  If the memory copy were the same
3318          *      speed as the byte-by-byte loop, that position would be about
3319          *      half-way, as at the half-way mark, parsing to the end and back
3320          *      is one complete string's parse, the same amount as starting
3321          *      over and going all the way through.  Actually, it would be
3322          *      somewhat less than half-way, as it's faster to just count bytes
3323          *      than to also copy, and we don't have the overhead of allocating
3324          *      a new string, changing the scalar to use it, and freeing the
3325          *      existing one.  But if the memory copy is fast, the break-even
3326          *      point is somewhere after half way.  The counting loop could be
3327          *      sped up by vectorization, etc, to move the break-even point
3328          *      further towards the beginning.
3329          *  2)  if the string doesn't have enough space to handle the converted
3330          *      value.  A new string will have to be allocated, and one might
3331          *      as well, given that, start from the beginning doing the first
3332          *      method.  We've spent extra time parsing the string and in
3333          *      exchange all we've gotten is that we know precisely how big to
3334          *      make the new one.  Perl is more optimized for time than space,
3335          *      so this case is a loser.
3336          * So what I've decided to do is not use the 2nd method unless it is
3337          * guaranteed that a new string won't have to be allocated, assuming
3338          * the worst case.  I also decided not to put any more conditions on it
3339          * than this, for now.  It seems likely that, since the worst case is
3340          * twice as big as the unknown portion of the string (plus 1), we won't
3341          * be guaranteed enough space, causing us to go to the first method,
3342          * unless the string is short, or the first variant character is near
3343          * the end of it.  In either of these cases, it seems best to use the
3344          * 2nd method.  The only circumstance I can think of where this would
3345          * be really slower is if the string had once had much more data in it
3346          * than it does now, but there is still a substantial amount in it  */
3347
3348         {
3349             STRLEN invariant_head = t - s;
3350             STRLEN size = invariant_head + (e - t) * 2 + 1 + extra;
3351             if (SvLEN(sv) < size) {
3352
3353                 /* Here, have decided to allocate a new string */
3354
3355                 U8 *dst;
3356                 U8 *d;
3357
3358                 Newx(dst, size, U8);
3359
3360                 /* If no known invariants at the beginning of the input string,
3361                  * set so starts from there.  Otherwise, can use memory copy to
3362                  * get up to where we are now, and then start from here */
3363
3364                 if (invariant_head <= 0) {
3365                     d = dst;
3366                 } else {
3367                     Copy(s, dst, invariant_head, char);
3368                     d = dst + invariant_head;
3369                 }
3370
3371                 while (t < e) {
3372                     const UV uv = NATIVE8_TO_UNI(*t++);
3373                     if (UNI_IS_INVARIANT(uv))
3374                         *d++ = (U8)UNI_TO_NATIVE(uv);
3375                     else {
3376                         *d++ = (U8)UTF8_EIGHT_BIT_HI(uv);
3377                         *d++ = (U8)UTF8_EIGHT_BIT_LO(uv);
3378                     }
3379                 }
3380                 *d = '\0';
3381                 SvPV_free(sv); /* No longer using pre-existing string */
3382                 SvPV_set(sv, (char*)dst);
3383                 SvCUR_set(sv, d - dst);
3384                 SvLEN_set(sv, size);
3385             } else {
3386
3387                 /* Here, have decided to get the exact size of the string.
3388                  * Currently this happens only when we know that there is
3389                  * guaranteed enough space to fit the converted string, so
3390                  * don't have to worry about growing.  If two_byte_count is 0,
3391                  * then t points to the first byte of the string which hasn't
3392                  * been examined yet.  Otherwise two_byte_count is 1, and t
3393                  * points to the first byte in the string that will expand to
3394                  * two.  Depending on this, start examining at t or 1 after t.
3395                  * */
3396
3397                 U8 *d = t + two_byte_count;
3398
3399
3400                 /* Count up the remaining bytes that expand to two */
3401
3402                 while (d < e) {
3403                     const U8 chr = *d++;
3404                     if (! NATIVE_IS_INVARIANT(chr)) two_byte_count++;
3405                 }
3406
3407                 /* The string will expand by just the number of bytes that
3408                  * occupy two positions.  But we are one afterwards because of
3409                  * the increment just above.  This is the place to put the
3410                  * trailing NUL, and to set the length before we decrement */
3411
3412                 d += two_byte_count;
3413                 SvCUR_set(sv, d - s);
3414                 *d-- = '\0';
3415
3416
3417                 /* Having decremented d, it points to the position to put the
3418                  * very last byte of the expanded string.  Go backwards through
3419                  * the string, copying and expanding as we go, stopping when we
3420                  * get to the part that is invariant the rest of the way down */
3421
3422                 e--;
3423                 while (e >= t) {
3424                     const U8 ch = NATIVE8_TO_UNI(*e--);
3425                     if (UNI_IS_INVARIANT(ch)) {
3426                         *d-- = UNI_TO_NATIVE(ch);
3427                     } else {
3428                         *d-- = (U8)UTF8_EIGHT_BIT_LO(ch);
3429                         *d-- = (U8)UTF8_EIGHT_BIT_HI(ch);
3430                     }
3431                 }
3432             }
3433         }
3434     }
3435
3436     /* Mark as UTF-8 even if no variant - saves scanning loop */
3437     SvUTF8_on(sv);
3438     return SvCUR(sv);
3439 }
3440
3441 /*
3442 =for apidoc sv_utf8_downgrade
3443
3444 Attempts to convert the PV of an SV from characters to bytes.
3445 If the PV contains a character that cannot fit
3446 in a byte, this conversion will fail;
3447 in this case, either returns false or, if C<fail_ok> is not
3448 true, croaks.
3449
3450 This is not as a general purpose Unicode to byte encoding interface:
3451 use the Encode extension for that.
3452
3453 =cut
3454 */
3455
3456 bool
3457 Perl_sv_utf8_downgrade(pTHX_ register SV *const sv, const bool fail_ok)
3458 {
3459     dVAR;
3460
3461     PERL_ARGS_ASSERT_SV_UTF8_DOWNGRADE;
3462
3463     if (SvPOKp(sv) && SvUTF8(sv)) {
3464         if (SvCUR(sv)) {
3465             U8 *s;
3466             STRLEN len;
3467
3468             if (SvIsCOW(sv)) {
3469                 sv_force_normal_flags(sv, 0);
3470             }
3471             s = (U8 *) SvPV(sv, len);
3472             if (!utf8_to_bytes(s, &len)) {
3473                 if (fail_ok)
3474                     return FALSE;
3475                 else {
3476                     if (PL_op)
3477                         Perl_croak(aTHX_ "Wide character in %s",
3478                                    OP_DESC(PL_op));
3479                     else
3480                         Perl_croak(aTHX_ "Wide character");
3481                 }
3482             }
3483             SvCUR_set(sv, len);
3484         }
3485     }
3486     SvUTF8_off(sv);
3487     return TRUE;
3488 }
3489
3490 /*
3491 =for apidoc sv_utf8_encode
3492
3493 Converts the PV of an SV to UTF-8, but then turns the C<SvUTF8>
3494 flag off so that it looks like octets again.
3495
3496 =cut
3497 */
3498
3499 void
3500 Perl_sv_utf8_encode(pTHX_ register SV *const sv)
3501 {
3502     PERL_ARGS_ASSERT_SV_UTF8_ENCODE;
3503
3504     if (SvIsCOW(sv)) {
3505         sv_force_normal_flags(sv, 0);
3506     }
3507     if (SvREADONLY(sv)) {
3508         Perl_croak(aTHX_ "%s", PL_no_modify);
3509     }
3510     (void) sv_utf8_upgrade(sv);
3511     SvUTF8_off(sv);
3512 }
3513
3514 /*
3515 =for apidoc sv_utf8_decode
3516
3517 If the PV of the SV is an octet sequence in UTF-8
3518 and contains a multiple-byte character, the C<SvUTF8> flag is turned on
3519 so that it looks like a character. If the PV contains only single-byte
3520 characters, the C<SvUTF8> flag stays being off.
3521 Scans PV for validity and returns false if the PV is invalid UTF-8.
3522
3523 =cut
3524 */
3525
3526 bool
3527 Perl_sv_utf8_decode(pTHX_ register SV *const sv)
3528 {
3529     PERL_ARGS_ASSERT_SV_UTF8_DECODE;
3530
3531     if (SvPOKp(sv)) {
3532         const U8 *c;
3533         const U8 *e;
3534
3535         /* The octets may have got themselves encoded - get them back as
3536          * bytes
3537          */
3538         if (!sv_utf8_downgrade(sv, TRUE))
3539             return FALSE;
3540
3541         /* it is actually just a matter of turning the utf8 flag on, but
3542          * we want to make sure everything inside is valid utf8 first.
3543          */
3544         c = (const U8 *) SvPVX_const(sv);
3545         if (!is_utf8_string(c, SvCUR(sv)+1))
3546             return FALSE;
3547         e = (const U8 *) SvEND(sv);
3548         while (c < e) {
3549             const U8 ch = *c++;
3550             if (!UTF8_IS_INVARIANT(ch)) {
3551                 SvUTF8_on(sv);
3552                 break;
3553             }
3554         }
3555     }
3556     return TRUE;
3557 }
3558
3559 /*
3560 =for apidoc sv_setsv
3561
3562 Copies the contents of the source SV C<ssv> into the destination SV
3563 C<dsv>.  The source SV may be destroyed if it is mortal, so don't use this
3564 function if the source SV needs to be reused. Does not handle 'set' magic.
3565 Loosely speaking, it performs a copy-by-value, obliterating any previous
3566 content of the destination.
3567
3568 You probably want to use one of the assortment of wrappers, such as
3569 C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3570 C<SvSetMagicSV_nosteal>.
3571
3572 =for apidoc sv_setsv_flags
3573
3574 Copies the contents of the source SV C<ssv> into the destination SV
3575 C<dsv>.  The source SV may be destroyed if it is mortal, so don't use this
3576 function if the source SV needs to be reused. Does not handle 'set' magic.
3577 Loosely speaking, it performs a copy-by-value, obliterating any previous
3578 content of the destination.
3579 If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
3580 C<ssv> if appropriate, else not. If the C<flags> parameter has the
3581 C<NOSTEAL> bit set then the buffers of temps will not be stolen. <sv_setsv>
3582 and C<sv_setsv_nomg> are implemented in terms of this function.
3583
3584 You probably want to use one of the assortment of wrappers, such as
3585 C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3586 C<SvSetMagicSV_nosteal>.
3587
3588 This is the primary function for copying scalars, and most other
3589 copy-ish functions and macros use this underneath.
3590
3591 =cut
3592 */
3593
3594 static void
3595 S_glob_assign_glob(pTHX_ SV *const dstr, SV *const sstr, const int dtype)
3596 {
3597     I32 mro_changes = 0; /* 1 = method, 2 = isa */
3598
3599     PERL_ARGS_ASSERT_GLOB_ASSIGN_GLOB;
3600
3601     if (dtype != SVt_PVGV) {
3602         const char * const name = GvNAME(sstr);
3603         const STRLEN len = GvNAMELEN(sstr);
3604         {
3605             if (dtype >= SVt_PV) {
3606                 SvPV_free(dstr);
3607                 SvPV_set(dstr, 0);
3608                 SvLEN_set(dstr, 0);
3609                 SvCUR_set(dstr, 0);
3610             }
3611             SvUPGRADE(dstr, SVt_PVGV);
3612             (void)SvOK_off(dstr);
3613             /* FIXME - why are we doing this, then turning it off and on again
3614                below?  */
3615             isGV_with_GP_on(dstr);
3616         }
3617         GvSTASH(dstr) = GvSTASH(sstr);
3618         if (GvSTASH(dstr))
3619             Perl_sv_add_backref(aTHX_ MUTABLE_SV(GvSTASH(dstr)), dstr);
3620         gv_name_set(MUTABLE_GV(dstr), name, len, GV_ADD);
3621         SvFAKE_on(dstr);        /* can coerce to non-glob */
3622     }
3623
3624     if(GvGP(MUTABLE_GV(sstr))) {
3625         /* If source has method cache entry, clear it */
3626         if(GvCVGEN(sstr)) {
3627             SvREFCNT_dec(GvCV(sstr));
3628             GvCV(sstr) = NULL;
3629             GvCVGEN(sstr) = 0;
3630         }
3631         /* If source has a real method, then a method is
3632            going to change */
3633         else if(GvCV((const GV *)sstr)) {
3634             mro_changes = 1;
3635         }
3636     }
3637
3638     /* If dest already had a real method, that's a change as well */
3639     if(!mro_changes && GvGP(MUTABLE_GV(dstr)) && GvCVu((const GV *)dstr)) {
3640         mro_changes = 1;
3641     }
3642
3643     if(strEQ(GvNAME((const GV *)dstr),"ISA"))
3644         mro_changes = 2;
3645
3646     gp_free(MUTABLE_GV(dstr));
3647     isGV_with_GP_off(dstr);
3648     (void)SvOK_off(dstr);
3649     isGV_with_GP_on(dstr);
3650     GvINTRO_off(dstr);          /* one-shot flag */
3651     GvGP(dstr) = gp_ref(GvGP(sstr));
3652     if (SvTAINTED(sstr))
3653         SvTAINT(dstr);
3654     if (GvIMPORTED(dstr) != GVf_IMPORTED
3655         && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3656         {
3657             GvIMPORTED_on(dstr);
3658         }
3659     GvMULTI_on(dstr);
3660     if(mro_changes == 2) mro_isa_changed_in(GvSTASH(dstr));
3661     else if(mro_changes) mro_method_changed_in(GvSTASH(dstr));
3662     return;
3663 }
3664
3665 static void
3666 S_glob_assign_ref(pTHX_ SV *const dstr, SV *const sstr)
3667 {
3668     SV * const sref = SvREFCNT_inc(SvRV(sstr));
3669     SV *dref = NULL;
3670     const int intro = GvINTRO(dstr);
3671     SV **location;
3672     U8 import_flag = 0;
3673     const U32 stype = SvTYPE(sref);
3674
3675     PERL_ARGS_ASSERT_GLOB_ASSIGN_REF;
3676
3677     if (intro) {
3678         GvINTRO_off(dstr);      /* one-shot flag */
3679         GvLINE(dstr) = CopLINE(PL_curcop);
3680         GvEGV(dstr) = MUTABLE_GV(dstr);
3681     }
3682     GvMULTI_on(dstr);
3683     switch (stype) {
3684     case SVt_PVCV:
3685         location = (SV **) &GvCV(dstr);
3686         import_flag = GVf_IMPORTED_CV;
3687         goto common;
3688     case SVt_PVHV:
3689         location = (SV **) &GvHV(dstr);
3690         import_flag = GVf_IMPORTED_HV;
3691         goto common;
3692     case SVt_PVAV:
3693         location = (SV **) &GvAV(dstr);
3694         import_flag = GVf_IMPORTED_AV;
3695         goto common;
3696     case SVt_PVIO:
3697         location = (SV **) &GvIOp(dstr);
3698         goto common;
3699     case SVt_PVFM:
3700         location = (SV **) &GvFORM(dstr);
3701     default:
3702         location = &GvSV(dstr);
3703         import_flag = GVf_IMPORTED_SV;
3704     common:
3705         if (intro) {
3706             if (stype == SVt_PVCV) {
3707                 /*if (GvCVGEN(dstr) && (GvCV(dstr) != (const CV *)sref || GvCVGEN(dstr))) {*/
3708                 if (GvCVGEN(dstr)) {
3709                     SvREFCNT_dec(GvCV(dstr));
3710                     GvCV(dstr) = NULL;
3711                     GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3712                 }
3713             }
3714             SAVEGENERICSV(*location);
3715         }
3716         else
3717             dref = *location;
3718         if (stype == SVt_PVCV && (*location != sref || GvCVGEN(dstr))) {
3719             CV* const cv = MUTABLE_CV(*location);
3720             if (cv) {
3721                 if (!GvCVGEN((const GV *)dstr) &&
3722                     (CvROOT(cv) || CvXSUB(cv)))
3723                     {
3724                         /* Redefining a sub - warning is mandatory if
3725                            it was a const and its value changed. */
3726                         if (CvCONST(cv) && CvCONST((const CV *)sref)
3727                             && cv_const_sv(cv)
3728                             == cv_const_sv((const CV *)sref)) {
3729                             NOOP;
3730                             /* They are 2 constant subroutines generated from
3731                                the same constant. This probably means that
3732                                they are really the "same" proxy subroutine
3733                                instantiated in 2 places. Most likely this is
3734                                when a constant is exported twice.  Don't warn.
3735                             */
3736                         }
3737                         else if (ckWARN(WARN_REDEFINE)
3738                                  || (CvCONST(cv)
3739                                      && (!CvCONST((const CV *)sref)
3740                                          || sv_cmp(cv_const_sv(cv),
3741                                                    cv_const_sv((const CV *)
3742                                                                sref))))) {
3743                             Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
3744                                         (const char *)
3745                                         (CvCONST(cv)
3746                                          ? "Constant subroutine %s::%s redefined"
3747                                          : "Subroutine %s::%s redefined"),
3748                                         HvNAME_get(GvSTASH((const GV *)dstr)),
3749                                         GvENAME(MUTABLE_GV(dstr)));
3750                         }
3751                     }
3752                 if (!intro)
3753                     cv_ckproto_len(cv, (const GV *)dstr,
3754                                    SvPOK(sref) ? SvPVX_const(sref) : NULL,
3755                                    SvPOK(sref) ? SvCUR(sref) : 0);
3756             }
3757             GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3758             GvASSUMECV_on(dstr);
3759             if(GvSTASH(dstr)) mro_method_changed_in(GvSTASH(dstr)); /* sub foo { 1 } sub bar { 2 } *bar = \&foo */
3760         }
3761         *location = sref;
3762         if (import_flag && !(GvFLAGS(dstr) & import_flag)
3763             && CopSTASH_ne(PL_curcop, GvSTASH(dstr))) {
3764             GvFLAGS(dstr) |= import_flag;
3765         }
3766         break;
3767     }
3768     SvREFCNT_dec(dref);
3769     if (SvTAINTED(sstr))
3770         SvTAINT(dstr);
3771     return;
3772 }
3773
3774 void
3775 Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV* sstr, const I32 flags)
3776 {
3777     dVAR;
3778     register U32 sflags;
3779     register int dtype;
3780     register svtype stype;
3781
3782     PERL_ARGS_ASSERT_SV_SETSV_FLAGS;
3783
3784     if (sstr == dstr)
3785         return;
3786
3787     if (SvIS_FREED(dstr)) {
3788         Perl_croak(aTHX_ "panic: attempt to copy value %" SVf
3789                    " to a freed scalar %p", SVfARG(sstr), (void *)dstr);
3790     }
3791     SV_CHECK_THINKFIRST_COW_DROP(dstr);
3792     if (!sstr)
3793         sstr = &PL_sv_undef;
3794     if (SvIS_FREED(sstr)) {
3795         Perl_croak(aTHX_ "panic: attempt to copy freed scalar %p to %p",
3796                    (void*)sstr, (void*)dstr);
3797     }
3798     stype = SvTYPE(sstr);
3799     dtype = SvTYPE(dstr);
3800
3801     (void)SvAMAGIC_off(dstr);
3802     if ( SvVOK(dstr) )
3803     {
3804         /* need to nuke the magic */
3805         mg_free(dstr);
3806     }
3807
3808     /* There's a lot of redundancy below but we're going for speed here */
3809
3810     switch (stype) {
3811     case SVt_NULL:
3812       undef_sstr:
3813         if (dtype != SVt_PVGV) {
3814             (void)SvOK_off(dstr);
3815             return;
3816         }
3817         break;
3818     case SVt_IV:
3819         if (SvIOK(sstr)) {
3820             switch (dtype) {
3821             case SVt_NULL:
3822                 sv_upgrade(dstr, SVt_IV);
3823                 break;
3824             case SVt_NV:
3825             case SVt_PV:
3826                 sv_upgrade(dstr, SVt_PVIV);
3827                 break;
3828             case SVt_PVGV:
3829                 goto end_of_first_switch;
3830             }
3831             (void)SvIOK_only(dstr);
3832             SvIV_set(dstr,  SvIVX(sstr));
3833             if (SvIsUV(sstr))
3834                 SvIsUV_on(dstr);
3835             /* SvTAINTED can only be true if the SV has taint magic, which in
3836                turn means that the SV type is PVMG (or greater). This is the
3837                case statement for SVt_IV, so this cannot be true (whatever gcov
3838                may say).  */
3839             assert(!SvTAINTED(sstr));
3840             return;
3841         }
3842         if (!SvROK(sstr))
3843             goto undef_sstr;
3844         if (dtype < SVt_PV && dtype != SVt_IV)
3845             sv_upgrade(dstr, SVt_IV);
3846         break;
3847
3848     case SVt_NV:
3849         if (SvNOK(sstr)) {
3850             switch (dtype) {
3851             case SVt_NULL:
3852             case SVt_IV:
3853                 sv_upgrade(dstr, SVt_NV);
3854                 break;
3855             case SVt_PV:
3856             case SVt_PVIV:
3857                 sv_upgrade(dstr, SVt_PVNV);
3858                 break;
3859             case SVt_PVGV:
3860                 goto end_of_first_switch;
3861             }
3862             SvNV_set(dstr, SvNVX(sstr));
3863             (void)SvNOK_only(dstr);
3864             /* SvTAINTED can only be true if the SV has taint magic, which in
3865                turn means that the SV type is PVMG (or greater). This is the
3866                case statement for SVt_NV, so this cannot be true (whatever gcov
3867                may say).  */
3868             assert(!SvTAINTED(sstr));
3869             return;
3870         }
3871         goto undef_sstr;
3872
3873     case SVt_PVFM:
3874 #ifdef PERL_OLD_COPY_ON_WRITE
3875         if ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS) {
3876             if (dtype < SVt_PVIV)
3877                 sv_upgrade(dstr, SVt_PVIV);
3878             break;
3879         }
3880         /* Fall through */
3881 #endif
3882     case SVt_REGEXP:
3883     case SVt_PV:
3884         if (dtype < SVt_PV)
3885             sv_upgrade(dstr, SVt_PV);
3886         break;
3887     case SVt_PVIV:
3888         if (dtype < SVt_PVIV)
3889             sv_upgrade(dstr, SVt_PVIV);
3890         break;
3891     case SVt_PVNV:
3892         if (dtype < SVt_PVNV)
3893             sv_upgrade(dstr, SVt_PVNV);
3894         break;
3895     default:
3896         {
3897         const char * const type = sv_reftype(sstr,0);
3898         if (PL_op)
3899             Perl_croak(aTHX_ "Bizarre copy of %s in %s", type, OP_NAME(PL_op));
3900         else
3901             Perl_croak(aTHX_ "Bizarre copy of %s", type);
3902         }
3903         break;
3904
3905         /* case SVt_BIND: */
3906     case SVt_PVLV:
3907     case SVt_PVGV:
3908         if (isGV_with_GP(sstr) && dtype <= SVt_PVGV) {
3909             glob_assign_glob(dstr, sstr, dtype);
3910             return;
3911         }
3912         /* SvVALID means that this PVGV is playing at being an FBM.  */
3913         /*FALLTHROUGH*/
3914
3915     case SVt_PVMG:
3916         if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
3917             mg_get(sstr);
3918             if (SvTYPE(sstr) != stype) {
3919                 stype = SvTYPE(sstr);
3920                 if (isGV_with_GP(sstr) && stype == SVt_PVGV && dtype <= SVt_PVGV) {
3921                     glob_assign_glob(dstr, sstr, dtype);
3922                     return;
3923                 }
3924             }
3925         }
3926         if (stype == SVt_PVLV)
3927             SvUPGRADE(dstr, SVt_PVNV);
3928         else
3929             SvUPGRADE(dstr, (svtype)stype);
3930     }
3931  end_of_first_switch:
3932
3933     /* dstr may have been upgraded.  */
3934     dtype = SvTYPE(dstr);
3935     sflags = SvFLAGS(sstr);
3936
3937     if (dtype == SVt_PVCV || dtype == SVt_PVFM) {
3938         /* Assigning to a subroutine sets the prototype.  */
3939         if (SvOK(sstr)) {
3940             STRLEN len;
3941             const char *const ptr = SvPV_const(sstr, len);
3942
3943             SvGROW(dstr, len + 1);
3944             Copy(ptr, SvPVX(dstr), len + 1, char);
3945             SvCUR_set(dstr, len);
3946             SvPOK_only(dstr);
3947             SvFLAGS(dstr) |= sflags & SVf_UTF8;
3948         } else {
3949             SvOK_off(dstr);
3950         }
3951     } else if (dtype == SVt_PVAV || dtype == SVt_PVHV) {
3952         const char * const type = sv_reftype(dstr,0);
3953         if (PL_op)
3954             Perl_croak(aTHX_ "Cannot copy to %s in %s", type, OP_NAME(PL_op));
3955         else
3956             Perl_croak(aTHX_ "Cannot copy to %s", type);
3957     } else if (sflags & SVf_ROK) {
3958         if (isGV_with_GP(dstr) && dtype == SVt_PVGV
3959             && SvTYPE(SvRV(sstr)) == SVt_PVGV && isGV_with_GP(SvRV(sstr))) {
3960             sstr = SvRV(sstr);
3961             if (sstr == dstr) {
3962                 if (GvIMPORTED(dstr) != GVf_IMPORTED
3963                     && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3964                 {
3965                     GvIMPORTED_on(dstr);
3966                 }
3967                 GvMULTI_on(dstr);
3968                 return;
3969             }
3970             glob_assign_glob(dstr, sstr, dtype);
3971             return;
3972         }
3973
3974         if (dtype >= SVt_PV) {
3975             if (dtype == SVt_PVGV && isGV_with_GP(dstr)) {
3976                 glob_assign_ref(dstr, sstr);
3977                 return;
3978             }
3979             if (SvPVX_const(dstr)) {
3980                 SvPV_free(dstr);
3981                 SvLEN_set(dstr, 0);
3982                 SvCUR_set(dstr, 0);
3983             }
3984         }
3985         (void)SvOK_off(dstr);
3986         SvRV_set(dstr, SvREFCNT_inc(SvRV(sstr)));
3987         SvFLAGS(dstr) |= sflags & SVf_ROK;
3988         assert(!(sflags & SVp_NOK));
3989         assert(!(sflags & SVp_IOK));
3990         assert(!(sflags & SVf_NOK));
3991         assert(!(sflags & SVf_IOK));
3992     }
3993     else if (dtype == SVt_PVGV && isGV_with_GP(dstr)) {
3994         if (!(sflags & SVf_OK)) {
3995             if (ckWARN(WARN_MISC))
3996                 Perl_warner(aTHX_ packWARN(WARN_MISC),
3997                             "Undefined value assigned to typeglob");
3998         }
3999         else {
4000             GV *gv = gv_fetchsv(sstr, GV_ADD, SVt_PVGV);
4001             if (dstr != (const SV *)gv) {
4002                 if (GvGP(dstr))
4003                     gp_free(MUTABLE_GV(dstr));
4004                 GvGP(dstr) = gp_ref(GvGP(gv));
4005             }
4006         }
4007     }
4008     else if (sflags & SVp_POK) {
4009         bool isSwipe = 0;
4010
4011         /*
4012          * Check to see if we can just swipe the string.  If so, it's a
4013          * possible small lose on short strings, but a big win on long ones.
4014          * It might even be a win on short strings if SvPVX_const(dstr)
4015          * has to be allocated and SvPVX_const(sstr) has to be freed.
4016          * Likewise if we can set up COW rather than doing an actual copy, we
4017          * drop to the else clause, as the swipe code and the COW setup code
4018          * have much in common.
4019          */
4020
4021         /* Whichever path we take through the next code, we want this true,
4022            and doing it now facilitates the COW check.  */
4023         (void)SvPOK_only(dstr);
4024
4025         if (
4026             /* If we're already COW then this clause is not true, and if COW
4027                is allowed then we drop down to the else and make dest COW 
4028                with us.  If caller hasn't said that we're allowed to COW
4029                shared hash keys then we don't do the COW setup, even if the
4030                source scalar is a shared hash key scalar.  */
4031             (((flags & SV_COW_SHARED_HASH_KEYS)
4032                ? (sflags & (SVf_FAKE|SVf_READONLY)) != (SVf_FAKE|SVf_READONLY)
4033                : 1 /* If making a COW copy is forbidden then the behaviour we
4034                        desire is as if the source SV isn't actually already
4035                        COW, even if it is.  So we act as if the source flags
4036                        are not COW, rather than actually testing them.  */
4037               )
4038 #ifndef PERL_OLD_COPY_ON_WRITE
4039              /* The change that added SV_COW_SHARED_HASH_KEYS makes the logic
4040                 when PERL_OLD_COPY_ON_WRITE is defined a little wrong.
4041                 Conceptually PERL_OLD_COPY_ON_WRITE being defined should
4042                 override SV_COW_SHARED_HASH_KEYS, because it means "always COW"
4043                 but in turn, it's somewhat dead code, never expected to go
4044                 live, but more kept as a placeholder on how to do it better
4045                 in a newer implementation.  */
4046              /* If we are COW and dstr is a suitable target then we drop down
4047                 into the else and make dest a COW of us.  */
4048              || (SvFLAGS(dstr) & CAN_COW_MASK) != CAN_COW_FLAGS
4049 #endif
4050              )
4051             &&
4052             !(isSwipe =
4053                  (sflags & SVs_TEMP) &&   /* slated for free anyway? */
4054                  !(sflags & SVf_OOK) &&   /* and not involved in OOK hack? */
4055                  (!(flags & SV_NOSTEAL)) &&
4056                                         /* and we're allowed to steal temps */
4057                  SvREFCNT(sstr) == 1 &&   /* and no other references to it? */
4058                  SvLEN(sstr)    &&        /* and really is a string */
4059                                 /* and won't be needed again, potentially */
4060               !(PL_op && PL_op->op_type == OP_AASSIGN))
4061 #ifdef PERL_OLD_COPY_ON_WRITE
4062             && ((flags & SV_COW_SHARED_HASH_KEYS)
4063                 ? (!((sflags & CAN_COW_MASK) == CAN_COW_FLAGS
4064                      && (SvFLAGS(dstr) & CAN_COW_MASK) == CAN_COW_FLAGS
4065                      && SvTYPE(sstr) >= SVt_PVIV && SvTYPE(sstr) != SVt_PVFM))
4066                 : 1)
4067 #endif
4068             ) {
4069             /* Failed the swipe test, and it's not a shared hash key either.
4070                Have to copy the string.  */
4071             STRLEN len = SvCUR(sstr);
4072             SvGROW(dstr, len + 1);      /* inlined from sv_setpvn */
4073             Move(SvPVX_const(sstr),SvPVX(dstr),len,char);
4074             SvCUR_set(dstr, len);
4075             *SvEND(dstr) = '\0';
4076         } else {
4077             /* If PERL_OLD_COPY_ON_WRITE is not defined, then isSwipe will always
4078                be true in here.  */
4079             /* Either it's a shared hash key, or it's suitable for
4080                copy-on-write or we can swipe the string.  */
4081             if (DEBUG_C_TEST) {
4082                 PerlIO_printf(Perl_debug_log, "Copy on write: sstr --> dstr\n");
4083                 sv_dump(sstr);
4084                 sv_dump(dstr);
4085             }
4086 #ifdef PERL_OLD_COPY_ON_WRITE
4087             if (!isSwipe) {
4088                 if ((sflags & (SVf_FAKE | SVf_READONLY))
4089                     != (SVf_FAKE | SVf_READONLY)) {
4090                     SvREADONLY_on(sstr);
4091                     SvFAKE_on(sstr);
4092                     /* Make the source SV into a loop of 1.
4093                        (about to become 2) */
4094                     SV_COW_NEXT_SV_SET(sstr, sstr);
4095                 }
4096             }
4097 #endif
4098             /* Initial code is common.  */
4099             if (SvPVX_const(dstr)) {    /* we know that dtype >= SVt_PV */
4100                 SvPV_free(dstr);
4101             }
4102
4103             if (!isSwipe) {
4104                 /* making another shared SV.  */
4105                 STRLEN cur = SvCUR(sstr);
4106                 STRLEN len = SvLEN(sstr);
4107 #ifdef PERL_OLD_COPY_ON_WRITE
4108                 if (len) {
4109                     assert (SvTYPE(dstr) >= SVt_PVIV);
4110                     /* SvIsCOW_normal */
4111                     /* splice us in between source and next-after-source.  */
4112                     SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4113                     SV_COW_NEXT_SV_SET(sstr, dstr);
4114                     SvPV_set(dstr, SvPVX_mutable(sstr));
4115                 } else
4116 #endif
4117                 {
4118                     /* SvIsCOW_shared_hash */
4119                     DEBUG_C(PerlIO_printf(Perl_debug_log,
4120                                           "Copy on write: Sharing hash\n"));
4121
4122                     assert (SvTYPE(dstr) >= SVt_PV);
4123                     SvPV_set(dstr,
4124                              HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)))));
4125                 }
4126                 SvLEN_set(dstr, len);
4127                 SvCUR_set(dstr, cur);
4128                 SvREADONLY_on(dstr);
4129                 SvFAKE_on(dstr);
4130             }
4131             else
4132                 {       /* Passes the swipe test.  */
4133                 SvPV_set(dstr, SvPVX_mutable(sstr));
4134                 SvLEN_set(dstr, SvLEN(sstr));
4135                 SvCUR_set(dstr, SvCUR(sstr));
4136
4137                 SvTEMP_off(dstr);
4138                 (void)SvOK_off(sstr);   /* NOTE: nukes most SvFLAGS on sstr */
4139                 SvPV_set(sstr, NULL);
4140                 SvLEN_set(sstr, 0);
4141                 SvCUR_set(sstr, 0);
4142                 SvTEMP_off(sstr);
4143             }
4144         }
4145         if (sflags & SVp_NOK) {
4146             SvNV_set(dstr, SvNVX(sstr));
4147         }
4148         if (sflags & SVp_IOK) {
4149             SvIV_set(dstr, SvIVX(sstr));
4150             /* Must do this otherwise some other overloaded use of 0x80000000
4151                gets confused. I guess SVpbm_VALID */
4152             if (sflags & SVf_IVisUV)
4153                 SvIsUV_on(dstr);
4154         }
4155         SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_NOK|SVp_NOK|SVf_UTF8);
4156         {
4157             const MAGIC * const smg = SvVSTRING_mg(sstr);
4158             if (smg) {
4159                 sv_magic(dstr, NULL, PERL_MAGIC_vstring,
4160                          smg->mg_ptr, smg->mg_len);
4161                 SvRMAGICAL_on(dstr);
4162             }
4163         }
4164     }
4165     else if (sflags & (SVp_IOK|SVp_NOK)) {
4166         (void)SvOK_off(dstr);
4167         SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_IVisUV|SVf_NOK|SVp_NOK);
4168         if (sflags & SVp_IOK) {
4169             /* XXXX Do we want to set IsUV for IV(ROK)?  Be extra safe... */
4170             SvIV_set(dstr, SvIVX(sstr));
4171         }
4172         if (sflags & SVp_NOK) {
4173             SvNV_set(dstr, SvNVX(sstr));
4174         }
4175     }
4176     else {
4177         if (isGV_with_GP(sstr)) {
4178             /* This stringification rule for globs is spread in 3 places.
4179                This feels bad. FIXME.  */
4180             const U32 wasfake = sflags & SVf_FAKE;
4181
4182             /* FAKE globs can get coerced, so need to turn this off
4183                temporarily if it is on.  */
4184             SvFAKE_off(sstr);
4185             gv_efullname3(dstr, MUTABLE_GV(sstr), "*");
4186             SvFLAGS(sstr) |= wasfake;
4187         }
4188         else
4189             (void)SvOK_off(dstr);
4190     }
4191     if (SvTAINTED(sstr))
4192         SvTAINT(dstr);
4193 }
4194
4195 /*
4196 =for apidoc sv_setsv_mg
4197
4198 Like C<sv_setsv>, but also handles 'set' magic.
4199
4200 =cut
4201 */
4202
4203 void
4204 Perl_sv_setsv_mg(pTHX_ SV *const dstr, register SV *const sstr)
4205 {
4206     PERL_ARGS_ASSERT_SV_SETSV_MG;
4207
4208     sv_setsv(dstr,sstr);
4209     SvSETMAGIC(dstr);
4210 }
4211
4212 #ifdef PERL_OLD_COPY_ON_WRITE
4213 SV *
4214 Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
4215 {
4216     STRLEN cur = SvCUR(sstr);
4217     STRLEN len = SvLEN(sstr);
4218     register char *new_pv;
4219
4220     PERL_ARGS_ASSERT_SV_SETSV_COW;
4221
4222     if (DEBUG_C_TEST) {
4223         PerlIO_printf(Perl_debug_log, "Fast copy on write: %p -> %p\n",
4224                       (void*)sstr, (void*)dstr);
4225         sv_dump(sstr);
4226         if (dstr)
4227                     sv_dump(dstr);
4228     }
4229
4230     if (dstr) {
4231         if (SvTHINKFIRST(dstr))
4232             sv_force_normal_flags(dstr, SV_COW_DROP_PV);
4233         else if (SvPVX_const(dstr))
4234             Safefree(SvPVX_const(dstr));
4235     }
4236     else
4237         new_SV(dstr);
4238     SvUPGRADE(dstr, SVt_PVIV);
4239
4240     assert (SvPOK(sstr));
4241     assert (SvPOKp(sstr));
4242     assert (!SvIOK(sstr));
4243     assert (!SvIOKp(sstr));
4244     assert (!SvNOK(sstr));
4245     assert (!SvNOKp(sstr));
4246
4247     if (SvIsCOW(sstr)) {
4248
4249         if (SvLEN(sstr) == 0) {
4250             /* source is a COW shared hash key.  */
4251             DEBUG_C(PerlIO_printf(Perl_debug_log,
4252                                   "Fast copy on write: Sharing hash\n"));
4253             new_pv = HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr))));
4254             goto common_exit;
4255         }
4256         SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4257     } else {
4258         assert ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS);
4259         SvUPGRADE(sstr, SVt_PVIV);
4260         SvREADONLY_on(sstr);
4261         SvFAKE_on(sstr);
4262         DEBUG_C(PerlIO_printf(Perl_debug_log,
4263                               "Fast copy on write: Converting sstr to COW\n"));
4264         SV_COW_NEXT_SV_SET(dstr, sstr);
4265     }
4266     SV_COW_NEXT_SV_SET(sstr, dstr);
4267     new_pv = SvPVX_mutable(sstr);
4268
4269   common_exit:
4270     SvPV_set(dstr, new_pv);
4271     SvFLAGS(dstr) = (SVt_PVIV|SVf_POK|SVp_POK|SVf_FAKE|SVf_READONLY);
4272     if (SvUTF8(sstr))
4273         SvUTF8_on(dstr);
4274     SvLEN_set(dstr, len);
4275     SvCUR_set(dstr, cur);
4276     if (DEBUG_C_TEST) {
4277         sv_dump(dstr);
4278     }
4279     return dstr;
4280 }
4281 #endif
4282
4283 /*
4284 =for apidoc sv_setpvn
4285
4286 Copies a string into an SV.  The C<len> parameter indicates the number of
4287 bytes to be copied.  If the C<ptr> argument is NULL the SV will become
4288 undefined.  Does not handle 'set' magic.  See C<sv_setpvn_mg>.
4289
4290 =cut
4291 */
4292
4293 void
4294 Perl_sv_setpvn(pTHX_ register SV *const sv, register const char *const ptr, register const STRLEN len)
4295 {
4296     dVAR;
4297     register char *dptr;
4298
4299     PERL_ARGS_ASSERT_SV_SETPVN;
4300
4301     SV_CHECK_THINKFIRST_COW_DROP(sv);
4302     if (!ptr) {
4303         (void)SvOK_off(sv);
4304         return;
4305     }
4306     else {
4307         /* len is STRLEN which is unsigned, need to copy to signed */
4308         const IV iv = len;
4309         if (iv < 0)
4310             Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen");
4311     }
4312     SvUPGRADE(sv, SVt_PV);
4313
4314     dptr = SvGROW(sv, len + 1);
4315     Move(ptr,dptr,len,char);
4316     dptr[len] = '\0';
4317     SvCUR_set(sv, len);
4318     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4319     SvTAINT(sv);
4320 }
4321
4322 /*
4323 =for apidoc sv_setpvn_mg
4324
4325 Like C<sv_setpvn>, but also handles 'set' magic.
4326
4327 =cut
4328 */
4329
4330 void
4331 Perl_sv_setpvn_mg(pTHX_ register SV *const sv, register const char *const ptr, register const STRLEN len)
4332 {
4333     PERL_ARGS_ASSERT_SV_SETPVN_MG;
4334
4335     sv_setpvn(sv,ptr,len);
4336     SvSETMAGIC(sv);
4337 }
4338
4339 /*
4340 =for apidoc sv_setpv
4341
4342 Copies a string into an SV.  The string must be null-terminated.  Does not
4343 handle 'set' magic.  See C<sv_setpv_mg>.
4344
4345 =cut
4346 */
4347
4348 void
4349 Perl_sv_setpv(pTHX_ register SV *const sv, register const char *const ptr)
4350 {
4351     dVAR;
4352     register STRLEN len;
4353
4354     PERL_ARGS_ASSERT_SV_SETPV;
4355
4356     SV_CHECK_THINKFIRST_COW_DROP(sv);
4357     if (!ptr) {
4358         (void)SvOK_off(sv);
4359         return;
4360     }
4361     len = strlen(ptr);
4362     SvUPGRADE(sv, SVt_PV);
4363
4364     SvGROW(sv, len + 1);
4365     Move(ptr,SvPVX(sv),len+1,char);
4366     SvCUR_set(sv, len);
4367     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4368     SvTAINT(sv);
4369 }
4370
4371 /*
4372 =for apidoc sv_setpv_mg
4373
4374 Like C<sv_setpv>, but also handles 'set' magic.
4375
4376 =cut
4377 */
4378
4379 void
4380 Perl_sv_setpv_mg(pTHX_ register SV *const sv, register const char *const ptr)
4381 {
4382     PERL_ARGS_ASSERT_SV_SETPV_MG;
4383
4384     sv_setpv(sv,ptr);
4385     SvSETMAGIC(sv);
4386 }
4387
4388 /*
4389 =for apidoc sv_usepvn_flags
4390
4391 Tells an SV to use C<ptr> to find its string value.  Normally the
4392 string is stored inside the SV but sv_usepvn allows the SV to use an
4393 outside string.  The C<ptr> should point to memory that was allocated
4394 by C<malloc>.  The string length, C<len>, must be supplied.  By default
4395 this function will realloc (i.e. move) the memory pointed to by C<ptr>,
4396 so that pointer should not be freed or used by the programmer after
4397 giving it to sv_usepvn, and neither should any pointers from "behind"
4398 that pointer (e.g. ptr + 1) be used.
4399
4400 If C<flags> & SV_SMAGIC is true, will call SvSETMAGIC. If C<flags> &
4401 SV_HAS_TRAILING_NUL is true, then C<ptr[len]> must be NUL, and the realloc
4402 will be skipped. (i.e. the buffer is actually at least 1 byte longer than
4403 C<len>, and already meets the requirements for storing in C<SvPVX>)
4404
4405 =cut
4406 */
4407
4408 void
4409 Perl_sv_usepvn_flags(pTHX_ SV *const sv, char *ptr, const STRLEN len, const U32 flags)
4410 {
4411     dVAR;
4412     STRLEN allocate;
4413
4414     PERL_ARGS_ASSERT_SV_USEPVN_FLAGS;
4415
4416     SV_CHECK_THINKFIRST_COW_DROP(sv);
4417     SvUPGRADE(sv, SVt_PV);
4418     if (!ptr) {
4419         (void)SvOK_off(sv);
4420         if (flags & SV_SMAGIC)
4421             SvSETMAGIC(sv);
4422         return;
4423     }
4424     if (SvPVX_const(sv))
4425         SvPV_free(sv);
4426
4427 #ifdef DEBUGGING
4428     if (flags & SV_HAS_TRAILING_NUL)
4429         assert(ptr[len] == '\0');
4430 #endif
4431
4432     allocate = (flags & SV_HAS_TRAILING_NUL)
4433         ? len + 1 :
4434 #ifdef Perl_safesysmalloc_size
4435         len + 1;
4436 #else 
4437         PERL_STRLEN_ROUNDUP(len + 1);
4438 #endif
4439     if (flags & SV_HAS_TRAILING_NUL) {
4440         /* It's long enough - do nothing.
4441            Specfically Perl_newCONSTSUB is relying on this.  */
4442     } else {
4443 #ifdef DEBUGGING
4444         /* Force a move to shake out bugs in callers.  */
4445         char *new_ptr = (char*)safemalloc(allocate);
4446         Copy(ptr, new_ptr, len, char);
4447         PoisonFree(ptr,len,char);
4448         Safefree(ptr);
4449         ptr = new_ptr;
4450 #else
4451         ptr = (char*) saferealloc (ptr, allocate);
4452 #endif
4453     }
4454 #ifdef Perl_safesysmalloc_size
4455     SvLEN_set(sv, Perl_safesysmalloc_size(ptr));
4456 #else
4457     SvLEN_set(sv, allocate);
4458 #endif
4459     SvCUR_set(sv, len);
4460     SvPV_set(sv, ptr);
4461     if (!(flags & SV_HAS_TRAILING_NUL)) {
4462         ptr[len] = '\0';
4463     }
4464     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4465     SvTAINT(sv);
4466     if (flags & SV_SMAGIC)
4467         SvSETMAGIC(sv);
4468 }
4469
4470 #ifdef PERL_OLD_COPY_ON_WRITE
4471 /* Need to do this *after* making the SV normal, as we need the buffer
4472    pointer to remain valid until after we've copied it.  If we let go too early,
4473    another thread could invalidate it by unsharing last of the same hash key
4474    (which it can do by means other than releasing copy-on-write Svs)
4475    or by changing the other copy-on-write SVs in the loop.  */
4476 STATIC void
4477 S_sv_release_COW(pTHX_ register SV *sv, const char *pvx, SV *after)
4478 {
4479     PERL_ARGS_ASSERT_SV_RELEASE_COW;
4480
4481     { /* this SV was SvIsCOW_normal(sv) */
4482          /* we need to find the SV pointing to us.  */
4483         SV *current = SV_COW_NEXT_SV(after);
4484
4485         if (current == sv) {
4486             /* The SV we point to points back to us (there were only two of us
4487                in the loop.)
4488                Hence other SV is no longer copy on write either.  */
4489             SvFAKE_off(after);
4490             SvREADONLY_off(after);
4491         } else {
4492             /* We need to follow the pointers around the loop.  */
4493             SV *next;
4494             while ((next = SV_COW_NEXT_SV(current)) != sv) {
4495                 assert (next);
4496                 current = next;
4497                  /* don't loop forever if the structure is bust, and we have
4498                     a pointer into a closed loop.  */
4499                 assert (current != after);
4500                 assert (SvPVX_const(current) == pvx);
4501             }
4502             /* Make the SV before us point to the SV after us.  */
4503             SV_COW_NEXT_SV_SET(current, after);
4504         }
4505     }
4506 }
4507 #endif
4508 /*
4509 =for apidoc sv_force_normal_flags
4510
4511 Undo various types of fakery on an SV: if the PV is a shared string, make
4512 a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
4513 an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
4514 we do the copy, and is also used locally. If C<SV_COW_DROP_PV> is set
4515 then a copy-on-write scalar drops its PV buffer (if any) and becomes
4516 SvPOK_off rather than making a copy. (Used where this scalar is about to be
4517 set to some other value.) In addition, the C<flags> parameter gets passed to
4518 C<sv_unref_flags()> when unrefing. C<sv_force_normal> calls this function
4519 with flags set to 0.
4520
4521 =cut
4522 */
4523
4524 void
4525 Perl_sv_force_normal_flags(pTHX_ register SV *const sv, const U32 flags)
4526 {
4527     dVAR;
4528
4529     PERL_ARGS_ASSERT_SV_FORCE_NORMAL_FLAGS;
4530
4531 #ifdef PERL_OLD_COPY_ON_WRITE
4532     if (SvREADONLY(sv)) {
4533         if (SvFAKE(sv)) {
4534             const char * const pvx = SvPVX_const(sv);
4535             const STRLEN len = SvLEN(sv);
4536             const STRLEN cur = SvCUR(sv);
4537             /* next COW sv in the loop.  If len is 0 then this is a shared-hash
4538                key scalar, so we mustn't attempt to call SV_COW_NEXT_SV(), as
4539                we'll fail an assertion.  */
4540             SV * const next = len ? SV_COW_NEXT_SV(sv) : 0;
4541
4542             if (DEBUG_C_TEST) {
4543                 PerlIO_printf(Perl_debug_log,
4544                               "Copy on write: Force normal %ld\n",
4545                               (long) flags);
4546                 sv_dump(sv);
4547             }
4548             SvFAKE_off(sv);
4549             SvREADONLY_off(sv);
4550             /* This SV doesn't own the buffer, so need to Newx() a new one:  */
4551             SvPV_set(sv, NULL);
4552             SvLEN_set(sv, 0);
4553             if (flags & SV_COW_DROP_PV) {
4554                 /* OK, so we don't need to copy our buffer.  */
4555                 SvPOK_off(sv);
4556             } else {
4557                 SvGROW(sv, cur + 1);
4558                 Move(pvx,SvPVX(sv),cur,char);
4559                 SvCUR_set(sv, cur);
4560                 *SvEND(sv) = '\0';
4561             }
4562             if (len) {
4563                 sv_release_COW(sv, pvx, next);
4564             } else {
4565                 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
4566             }
4567             if (DEBUG_C_TEST) {
4568                 sv_dump(sv);
4569             }
4570         }
4571         else if (IN_PERL_RUNTIME)
4572             Perl_croak(aTHX_ "%s", PL_no_modify);
4573     }
4574 #else
4575     if (SvREADONLY(sv)) {
4576         if (SvFAKE(sv)) {
4577             const char * const pvx = SvPVX_const(sv);
4578             const STRLEN len = SvCUR(sv);
4579             SvFAKE_off(sv);
4580             SvREADONLY_off(sv);
4581             SvPV_set(sv, NULL);
4582             SvLEN_set(sv, 0);
4583             SvGROW(sv, len + 1);
4584             Move(pvx,SvPVX(sv),len,char);
4585             *SvEND(sv) = '\0';
4586             unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
4587         }
4588         else if (IN_PERL_RUNTIME)
4589             Perl_croak(aTHX_ "%s", PL_no_modify);
4590     }
4591 #endif
4592     if (SvROK(sv))
4593         sv_unref_flags(sv, flags);
4594     else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
4595         sv_unglob(sv);
4596 }
4597
4598 /*
4599 =for apidoc sv_chop
4600
4601 Efficient removal of characters from the beginning of the string buffer.
4602 SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
4603 the string buffer.  The C<ptr> becomes the first character of the adjusted
4604 string. Uses the "OOK hack".
4605 Beware: after this function returns, C<ptr> and SvPVX_const(sv) may no longer
4606 refer to the same chunk of data.
4607
4608 =cut
4609 */
4610
4611 void
4612 Perl_sv_chop(pTHX_ register SV *const sv, register const char *const ptr)
4613 {
4614     STRLEN delta;
4615     STRLEN old_delta;
4616     U8 *p;
4617 #ifdef DEBUGGING
4618     const U8 *real_start;
4619 #endif
4620     STRLEN max_delta;
4621
4622     PERL_ARGS_ASSERT_SV_CHOP;
4623
4624     if (!ptr || !SvPOKp(sv))
4625         return;
4626     delta = ptr - SvPVX_const(sv);
4627     if (!delta) {
4628         /* Nothing to do.  */
4629         return;
4630     }
4631     /* SvPVX(sv) may move in SV_CHECK_THINKFIRST(sv), but after this line,
4632        nothing uses the value of ptr any more.  */
4633     max_delta = SvLEN(sv) ? SvLEN(sv) : SvCUR(sv);
4634     if (ptr <= SvPVX_const(sv))
4635         Perl_croak(aTHX_ "panic: sv_chop ptr=%p, start=%p, end=%p",
4636                    ptr, SvPVX_const(sv), SvPVX_const(sv) + max_delta);
4637     SV_CHECK_THINKFIRST(sv);
4638     if (delta > max_delta)
4639         Perl_croak(aTHX_ "panic: sv_chop ptr=%p (was %p), start=%p, end=%p",
4640                    SvPVX_const(sv) + delta, ptr, SvPVX_const(sv),
4641                    SvPVX_const(sv) + max_delta);
4642
4643     if (!SvOOK(sv)) {
4644         if (!SvLEN(sv)) { /* make copy of shared string */
4645             const char *pvx = SvPVX_const(sv);
4646             const STRLEN len = SvCUR(sv);
4647             SvGROW(sv, len + 1);
4648             Move(pvx,SvPVX(sv),len,char);
4649             *SvEND(sv) = '\0';
4650         }
4651         SvFLAGS(sv) |= SVf_OOK;
4652         old_delta = 0;
4653     } else {
4654         SvOOK_offset(sv, old_delta);
4655     }
4656     SvLEN_set(sv, SvLEN(sv) - delta);
4657     SvCUR_set(sv, SvCUR(sv) - delta);
4658     SvPV_set(sv, SvPVX(sv) + delta);
4659
4660     p = (U8 *)SvPVX_const(sv);
4661
4662     delta += old_delta;
4663
4664 #ifdef DEBUGGING
4665     real_start = p - delta;
4666 #endif
4667
4668     assert(delta);
4669     if (delta < 0x100) {
4670         *--p = (U8) delta;
4671     } else {
4672         *--p = 0;
4673         p -= sizeof(STRLEN);
4674         Copy((U8*)&delta, p, sizeof(STRLEN), U8);
4675     }
4676
4677 #ifdef DEBUGGING
4678     /* Fill the preceding buffer with sentinals to verify that no-one is
4679        using it.  */
4680     while (p > real_start) {
4681         --p;
4682         *p = (U8)PTR2UV(p);
4683     }
4684 #endif
4685 }
4686
4687 /*
4688 =for apidoc sv_catpvn
4689
4690 Concatenates the string onto the end of the string which is in the SV.  The
4691 C<len> indicates number of bytes to copy.  If the SV has the UTF-8
4692 status set, then the bytes appended should be valid UTF-8.
4693 Handles 'get' magic, but not 'set' magic.  See C<sv_catpvn_mg>.
4694
4695 =for apidoc sv_catpvn_flags
4696
4697 Concatenates the string onto the end of the string which is in the SV.  The
4698 C<len> indicates number of bytes to copy.  If the SV has the UTF-8
4699 status set, then the bytes appended should be valid UTF-8.
4700 If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
4701 appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
4702 in terms of this function.
4703
4704 =cut
4705 */
4706
4707 void
4708 Perl_sv_catpvn_flags(pTHX_ register SV *const dsv, register const char *sstr, register const STRLEN slen, const I32 flags)
4709 {
4710     dVAR;
4711     STRLEN dlen;
4712     const char * const dstr = SvPV_force_flags(dsv, dlen, flags);
4713
4714     PERL_ARGS_ASSERT_SV_CATPVN_FLAGS;
4715
4716     SvGROW(dsv, dlen + slen + 1);
4717     if (sstr == dstr)
4718         sstr = SvPVX_const(dsv);
4719     Move(sstr, SvPVX(dsv) + dlen, slen, char);
4720     SvCUR_set(dsv, SvCUR(dsv) + slen);
4721     *SvEND(dsv) = '\0';
4722     (void)SvPOK_only_UTF8(dsv);         /* validate pointer */
4723     SvTAINT(dsv);
4724     if (flags & SV_SMAGIC)
4725         SvSETMAGIC(dsv);
4726 }
4727
4728 /*
4729 =for apidoc sv_catsv
4730
4731 Concatenates the string from SV C<ssv> onto the end of the string in
4732 SV C<dsv>.  Modifies C<dsv> but not C<ssv>.  Handles 'get' magic, but
4733 not 'set' magic.  See C<sv_catsv_mg>.
4734
4735 =for apidoc sv_catsv_flags
4736
4737 Concatenates the string from SV C<ssv> onto the end of the string in
4738 SV C<dsv>.  Modifies C<dsv> but not C<ssv>.  If C<flags> has C<SV_GMAGIC>
4739 bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
4740 and C<sv_catsv_nomg> are implemented in terms of this function.
4741
4742 =cut */
4743
4744 void
4745 Perl_sv_catsv_flags(pTHX_ SV *const dsv, register SV *const ssv, const I32 flags)
4746 {
4747     dVAR;
4748  
4749     PERL_ARGS_ASSERT_SV_CATSV_FLAGS;
4750
4751    if (ssv) {
4752         STRLEN slen;
4753         const char *spv = SvPV_const(ssv, slen);
4754         if (spv) {
4755             /*  sutf8 and dutf8 were type bool, but under USE_ITHREADS,
4756                 gcc version 2.95.2 20000220 (Debian GNU/Linux) for
4757                 Linux xxx 2.2.17 on sparc64 with gcc -O2, we erroneously
4758                 get dutf8 = 0x20000000, (i.e.  SVf_UTF8) even though
4759                 dsv->sv_flags doesn't have that bit set.
4760                 Andy Dougherty  12 Oct 2001
4761             */
4762             const I32 sutf8 = DO_UTF8(ssv);
4763             I32 dutf8;
4764
4765             if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
4766                 mg_get(dsv);
4767             dutf8 = DO_UTF8(dsv);
4768
4769             if (dutf8 != sutf8) {
4770                 if (dutf8) {
4771                     /* Not modifying source SV, so taking a temporary copy. */
4772                     SV* const csv = newSVpvn_flags(spv, slen, SVs_TEMP);
4773
4774                     sv_utf8_upgrade(csv);
4775                     spv = SvPV_const(csv, slen);
4776                 }
4777                 else
4778                     /* Leave enough space for the cat that's about to happen */
4779                     sv_utf8_upgrade_flags_grow(dsv, 0, slen);
4780             }
4781             sv_catpvn_nomg(dsv, spv, slen);
4782         }
4783     }
4784     if (flags & SV_SMAGIC)
4785         SvSETMAGIC(dsv);
4786 }
4787
4788 /*
4789 =for apidoc sv_catpv
4790
4791 Concatenates the string onto the end of the string which is in the SV.
4792 If the SV has the UTF-8 status set, then the bytes appended should be
4793 valid UTF-8.  Handles 'get' magic, but not 'set' magic.  See C<sv_catpv_mg>.
4794
4795 =cut */
4796
4797 void
4798 Perl_sv_catpv(pTHX_ register SV *const sv, register const char *ptr)
4799 {
4800     dVAR;
4801     register STRLEN len;
4802     STRLEN tlen;
4803     char *junk;
4804
4805     PERL_ARGS_ASSERT_SV_CATPV;
4806
4807     if (!ptr)
4808         return;
4809     junk = SvPV_force(sv, tlen);
4810     len = strlen(ptr);
4811     SvGROW(sv, tlen + len + 1);
4812     if (ptr == junk)
4813         ptr = SvPVX_const(sv);
4814     Move(ptr,SvPVX(sv)+tlen,len+1,char);
4815     SvCUR_set(sv, SvCUR(sv) + len);
4816     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4817     SvTAINT(sv);
4818 }
4819
4820 /*
4821 =for apidoc sv_catpv_mg
4822
4823 Like C<sv_catpv>, but also handles 'set' magic.
4824
4825 =cut
4826 */
4827
4828 void
4829 Perl_sv_catpv_mg(pTHX_ register SV *const sv, register const char *const ptr)
4830 {
4831     PERL_ARGS_ASSERT_SV_CATPV_MG;
4832
4833     sv_catpv(sv,ptr);
4834     SvSETMAGIC(sv);
4835 }
4836
4837 /*
4838 =for apidoc newSV
4839
4840 Creates a new SV.  A non-zero C<len> parameter indicates the number of
4841 bytes of preallocated string space the SV should have.  An extra byte for a
4842 trailing NUL is also reserved.  (SvPOK is not set for the SV even if string
4843 space is allocated.)  The reference count for the new SV is set to 1.
4844
4845 In 5.9.3, newSV() replaces the older NEWSV() API, and drops the first
4846 parameter, I<x>, a debug aid which allowed callers to identify themselves.
4847 This aid has been superseded by a new build option, PERL_MEM_LOG (see
4848 L<perlhack/PERL_MEM_LOG>).  The older API is still there for use in XS
4849 modules supporting older perls.
4850
4851 =cut
4852 */
4853
4854 SV *
4855 Perl_newSV(pTHX_ const STRLEN len)
4856 {
4857     dVAR;
4858     register SV *sv;
4859
4860     new_SV(sv);
4861     if (len) {
4862         sv_upgrade(sv, SVt_PV);
4863         SvGROW(sv, len + 1);
4864     }
4865     return sv;
4866 }
4867 /*
4868 =for apidoc sv_magicext
4869
4870 Adds magic to an SV, upgrading it if necessary. Applies the
4871 supplied vtable and returns a pointer to the magic added.
4872
4873 Note that C<sv_magicext> will allow things that C<sv_magic> will not.
4874 In particular, you can add magic to SvREADONLY SVs, and add more than
4875 one instance of the same 'how'.
4876
4877 If C<namlen> is greater than zero then a C<savepvn> I<copy> of C<name> is
4878 stored, if C<namlen> is zero then C<name> is stored as-is and - as another
4879 special case - if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
4880 to contain an C<SV*> and is stored as-is with its REFCNT incremented.
4881
4882 (This is now used as a subroutine by C<sv_magic>.)
4883
4884 =cut
4885 */
4886 MAGIC * 
4887 Perl_sv_magicext(pTHX_ SV *const sv, SV *const obj, const int how, 
4888                 const MGVTBL *const vtable, const char *const name, const I32 namlen)
4889 {
4890     dVAR;
4891     MAGIC* mg;
4892
4893     PERL_ARGS_ASSERT_SV_MAGICEXT;
4894
4895     SvUPGRADE(sv, SVt_PVMG);
4896     Newxz(mg, 1, MAGIC);
4897     mg->mg_moremagic = SvMAGIC(sv);
4898     SvMAGIC_set(sv, mg);
4899
4900     /* Sometimes a magic contains a reference loop, where the sv and
4901        object refer to each other.  To prevent a reference loop that
4902        would prevent such objects being freed, we look for such loops
4903        and if we find one we avoid incrementing the object refcount.
4904
4905        Note we cannot do this to avoid self-tie loops as intervening RV must
4906        have its REFCNT incremented to keep it in existence.
4907
4908     */
4909     if (!obj || obj == sv ||
4910         how == PERL_MAGIC_arylen ||
4911         how == PERL_MAGIC_symtab ||
4912         (SvTYPE(obj) == SVt_PVGV &&
4913             (GvSV(obj) == sv || GvHV(obj) == (const HV *)sv
4914              || GvAV(obj) == (const AV *)sv || GvCV(obj) == (const CV *)sv
4915              || GvIOp(obj) == (const IO *)sv || GvFORM(obj) == (const CV *)sv)))
4916     {
4917         mg->mg_obj = obj;
4918     }
4919     else {
4920         mg->mg_obj = SvREFCNT_inc_simple(obj);
4921         mg->mg_flags |= MGf_REFCOUNTED;
4922     }
4923
4924     /* Normal self-ties simply pass a null object, and instead of
4925        using mg_obj directly, use the SvTIED_obj macro to produce a
4926        new RV as needed.  For glob "self-ties", we are tieing the PVIO
4927        with an RV obj pointing to the glob containing the PVIO.  In
4928        this case, to avoid a reference loop, we need to weaken the
4929        reference.
4930     */
4931
4932     if (how == PERL_MAGIC_tiedscalar && SvTYPE(sv) == SVt_PVIO &&
4933         obj && SvROK(obj) && GvIO(SvRV(obj)) == (const IO *)sv)
4934     {
4935       sv_rvweaken(obj);
4936     }
4937
4938     mg->mg_type = how;
4939     mg->mg_len = namlen;
4940     if (name) {
4941         if (namlen > 0)
4942             mg->mg_ptr = savepvn(name, namlen);
4943         else if (namlen == HEf_SVKEY) {
4944             /* Yes, this is casting away const. This is only for the case of
4945                HEf_SVKEY. I think we need to document this abberation of the
4946                constness of the API, rather than making name non-const, as
4947                that change propagating outwards a long way.  */
4948             mg->mg_ptr = (char*)SvREFCNT_inc_simple_NN((SV *)name);
4949         } else
4950             mg->mg_ptr = (char *) name;
4951     }
4952     mg->mg_virtual = (MGVTBL *) vtable;
4953
4954     mg_magical(sv);
4955     if (SvGMAGICAL(sv))
4956         SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
4957     return mg;
4958 }
4959
4960 /*
4961 =for apidoc sv_magic
4962
4963 Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
4964 then adds a new magic item of type C<how> to the head of the magic list.
4965
4966 See C<sv_magicext> (which C<sv_magic> now calls) for a description of the
4967 handling of the C<name> and C<namlen> arguments.
4968
4969 You need to use C<sv_magicext> to add magic to SvREADONLY SVs and also
4970 to add more than one instance of the same 'how'.
4971
4972 =cut
4973 */
4974
4975 void
4976 Perl_sv_magic(pTHX_ register SV *const sv, SV *const obj, const int how, 
4977              const char *const name, const I32 namlen)
4978 {
4979     dVAR;
4980     const MGVTBL *vtable;
4981     MAGIC* mg;
4982
4983     PERL_ARGS_ASSERT_SV_MAGIC;
4984
4985 #ifdef PERL_OLD_COPY_ON_WRITE
4986     if (SvIsCOW(sv))
4987         sv_force_normal_flags(sv, 0);
4988 #endif
4989     if (SvREADONLY(sv)) {
4990         if (
4991             /* its okay to attach magic to shared strings; the subsequent
4992              * upgrade to PVMG will unshare the string */
4993             !(SvFAKE(sv) && SvTYPE(sv) < SVt_PVMG)
4994
4995             && IN_PERL_RUNTIME
4996             && how != PERL_MAGIC_regex_global
4997             && how != PERL_MAGIC_bm
4998             && how != PERL_MAGIC_fm
4999             && how != PERL_MAGIC_sv
5000             && how != PERL_MAGIC_backref
5001            )
5002         {
5003             Perl_croak(aTHX_ "%s", PL_no_modify);
5004         }
5005     }
5006     if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
5007         if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
5008             /* sv_magic() refuses to add a magic of the same 'how' as an
5009                existing one
5010              */
5011             if (how == PERL_MAGIC_taint) {
5012                 mg->mg_len |= 1;
5013                 /* Any scalar which already had taint magic on which someone
5014                    (erroneously?) did SvIOK_on() or similar will now be
5015                    incorrectly sporting public "OK" flags.  */
5016                 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
5017             }
5018             return;
5019         }
5020     }
5021
5022     switch (how) {
5023     case PERL_MAGIC_sv:
5024         vtable = &PL_vtbl_sv;
5025         break;
5026     case PERL_MAGIC_overload:
5027         vtable = &PL_vtbl_amagic;
5028         break;
5029     case PERL_MAGIC_overload_elem:
5030         vtable = &PL_vtbl_amagicelem;
5031         break;
5032     case PERL_MAGIC_overload_table:
5033         vtable = &PL_vtbl_ovrld;
5034         break;
5035     case PERL_MAGIC_bm:
5036         vtable = &PL_vtbl_bm;
5037         break;
5038     case PERL_MAGIC_regdata:
5039         vtable = &PL_vtbl_regdata;
5040         break;
5041     case PERL_MAGIC_regdatum:
5042         vtable = &PL_vtbl_regdatum;
5043         break;
5044     case PERL_MAGIC_env:
5045         vtable = &PL_vtbl_env;
5046         break;
5047     case PERL_MAGIC_fm:
5048         vtable = &PL_vtbl_fm;
5049         break;
5050     case PERL_MAGIC_envelem:
5051         vtable = &PL_vtbl_envelem;
5052         break;
5053     case PERL_MAGIC_regex_global:
5054         vtable = &PL_vtbl_mglob;
5055         break;
5056     case PERL_MAGIC_isa:
5057         vtable = &PL_vtbl_isa;
5058         break;
5059     case PERL_MAGIC_isaelem:
5060         vtable = &PL_vtbl_isaelem;
5061         break;
5062     case PERL_MAGIC_nkeys:
5063         vtable = &PL_vtbl_nkeys;
5064         break;
5065     case PERL_MAGIC_dbfile:
5066         vtable = NULL;
5067         break;
5068     case PERL_MAGIC_dbline:
5069         vtable = &PL_vtbl_dbline;
5070         break;
5071 #ifdef USE_LOCALE_COLLATE
5072     case PERL_MAGIC_collxfrm:
5073         vtable = &PL_vtbl_collxfrm;
5074         break;
5075 #endif /* USE_LOCALE_COLLATE */
5076     case PERL_MAGIC_tied:
5077         vtable = &PL_vtbl_pack;
5078         break;
5079     case PERL_MAGIC_tiedelem:
5080     case PERL_MAGIC_tiedscalar:
5081         vtable = &PL_vtbl_packelem;
5082         break;
5083     case PERL_MAGIC_qr:
5084         vtable = &PL_vtbl_regexp;
5085         break;
5086     case PERL_MAGIC_hints:
5087         /* As this vtable is all NULL, we can reuse it.  */
5088     case PERL_MAGIC_sig:
5089         vtable = &PL_vtbl_sig;
5090         break;
5091     case PERL_MAGIC_sigelem:
5092         vtable = &PL_vtbl_sigelem;
5093         break;
5094     case PERL_MAGIC_taint:
5095         vtable = &PL_vtbl_taint;
5096         break;
5097     case PERL_MAGIC_uvar:
5098         vtable = &PL_vtbl_uvar;
5099         break;
5100     case PERL_MAGIC_vec:
5101         vtable = &PL_vtbl_vec;
5102         break;
5103     case PERL_MAGIC_arylen_p:
5104     case PERL_MAGIC_rhash:
5105     case PERL_MAGIC_symtab:
5106     case PERL_MAGIC_vstring:
5107         vtable = NULL;
5108         break;
5109     case PERL_MAGIC_utf8:
5110         vtable = &PL_vtbl_utf8;
5111         break;
5112     case PERL_MAGIC_substr:
5113         vtable = &PL_vtbl_substr;
5114         break;
5115     case PERL_MAGIC_defelem:
5116         vtable = &PL_vtbl_defelem;
5117         break;
5118     case PERL_MAGIC_arylen:
5119         vtable = &PL_vtbl_arylen;
5120         break;
5121     case PERL_MAGIC_pos:
5122         vtable = &PL_vtbl_pos;
5123         break;
5124     case PERL_MAGIC_backref:
5125         vtable = &PL_vtbl_backref;
5126         break;
5127     case PERL_MAGIC_hintselem:
5128         vtable = &PL_vtbl_hintselem;
5129         break;
5130     case PERL_MAGIC_ext:
5131         /* Reserved for use by extensions not perl internals.           */
5132         /* Useful for attaching extension internal data to perl vars.   */
5133         /* Note that multiple extensions may clash if magical scalars   */
5134         /* etc holding private data from one are passed to another.     */
5135         vtable = NULL;
5136         break;
5137     default:
5138         Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
5139     }
5140
5141     /* Rest of work is done else where */
5142     mg = sv_magicext(sv,obj,how,vtable,name,namlen);
5143
5144     switch (how) {
5145     case PERL_MAGIC_taint:
5146         mg->mg_len = 1;
5147         break;
5148     case PERL_MAGIC_ext:
5149     case PERL_MAGIC_dbfile:
5150         SvRMAGICAL_on(sv);
5151         break;
5152     }
5153 }
5154
5155 /*
5156 =for apidoc sv_unmagic
5157
5158 Removes all magic of type C<type> from an SV.
5159
5160 =cut
5161 */
5162
5163 int
5164 Perl_sv_unmagic(pTHX_ SV *const sv, const int type)
5165 {
5166     MAGIC* mg;
5167     MAGIC** mgp;
5168
5169     PERL_ARGS_ASSERT_SV_UNMAGIC;
5170
5171     if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
5172         return 0;
5173     mgp = &(((XPVMG*) SvANY(sv))->xmg_u.xmg_magic);
5174     for (mg = *mgp; mg; mg = *mgp) {
5175         if (mg->mg_type == type) {
5176             const MGVTBL* const vtbl = mg->mg_virtual;
5177             *mgp = mg->mg_moremagic;
5178             if (vtbl && vtbl->svt_free)
5179                 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
5180             if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
5181                 if (mg->mg_len > 0)
5182                     Safefree(mg->mg_ptr);
5183                 else if (mg->mg_len == HEf_SVKEY)
5184                     SvREFCNT_dec(MUTABLE_SV(mg->mg_ptr));
5185                 else if (mg->mg_type == PERL_MAGIC_utf8)
5186                     Safefree(mg->mg_ptr);
5187             }
5188             if (mg->mg_flags & MGf_REFCOUNTED)
5189                 SvREFCNT_dec(mg->mg_obj);
5190             Safefree(mg);
5191         }
5192         else
5193             mgp = &mg->mg_moremagic;
5194     }
5195     if (!SvMAGIC(sv)) {
5196         SvMAGICAL_off(sv);
5197         SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
5198         SvMAGIC_set(sv, NULL);
5199     }
5200
5201     return 0;
5202 }
5203
5204 /*
5205 =for apidoc sv_rvweaken
5206
5207 Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
5208 referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
5209 push a back-reference to this RV onto the array of backreferences
5210 associated with that magic. If the RV is magical, set magic will be
5211 called after the RV is cleared.
5212
5213 =cut
5214 */
5215
5216 SV *
5217 Perl_sv_rvweaken(pTHX_ SV *const sv)
5218 {
5219     SV *tsv;
5220
5221     PERL_ARGS_ASSERT_SV_RVWEAKEN;
5222
5223     if (!SvOK(sv))  /* let undefs pass */
5224         return sv;
5225     if (!SvROK(sv))
5226         Perl_croak(aTHX_ "Can't weaken a nonreference");
5227     else if (SvWEAKREF(sv)) {
5228         if (ckWARN(WARN_MISC))
5229             Perl_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
5230         return sv;
5231     }
5232     tsv = SvRV(sv);
5233     Perl_sv_add_backref(aTHX_ tsv, sv);
5234     SvWEAKREF_on(sv);
5235     SvREFCNT_dec(tsv);
5236     return sv;
5237 }
5238
5239 /* Give tsv backref magic if it hasn't already got it, then push a
5240  * back-reference to sv onto the array associated with the backref magic.
5241  */
5242
5243 /* A discussion about the backreferences array and its refcount:
5244  *
5245  * The AV holding the backreferences is pointed to either as the mg_obj of
5246  * PERL_MAGIC_backref, or in the specific case of a HV that has the hv_aux
5247  * structure, from the xhv_backreferences field. (A HV without hv_aux will
5248  * have the standard magic instead.) The array is created with a refcount
5249  * of 2. This means that if during global destruction the array gets
5250  * picked on first to have its refcount decremented by the random zapper,
5251  * it won't actually be freed, meaning it's still theere for when its
5252  * parent gets freed.
5253  * When the parent SV is freed, in the case of magic, the magic is freed,
5254  * Perl_magic_killbackrefs is called which decrements one refcount, then
5255  * mg_obj is freed which kills the second count.
5256  * In the vase of a HV being freed, one ref is removed by
5257  * Perl_hv_kill_backrefs, the other by Perl_sv_kill_backrefs, which it
5258  * calls.
5259  */
5260
5261 void
5262 Perl_sv_add_backref(pTHX_ SV *const tsv, SV *const sv)
5263 {
5264     dVAR;
5265     AV *av;
5266
5267     PERL_ARGS_ASSERT_SV_ADD_BACKREF;
5268
5269     if (SvTYPE(tsv) == SVt_PVHV) {
5270         AV **const avp = Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(tsv));
5271
5272         av = *avp;
5273         if (!av) {
5274             /* There is no AV in the offical place - try a fixup.  */
5275             MAGIC *const mg = mg_find(tsv, PERL_MAGIC_backref);
5276
5277             if (mg) {
5278                 /* Aha. They've got it stowed in magic.  Bring it back.  */
5279                 av = MUTABLE_AV(mg->mg_obj);
5280                 /* Stop mg_free decreasing the refernce count.  */
5281                 mg->mg_obj = NULL;
5282                 /* Stop mg_free even calling the destructor, given that
5283                    there's no AV to free up.  */
5284                 mg->mg_virtual = 0;
5285                 sv_unmagic(tsv, PERL_MAGIC_backref);
5286             } else {
5287                 av = newAV();
5288                 AvREAL_off(av);
5289                 SvREFCNT_inc_simple_void(av); /* see discussion above */
5290             }
5291             *avp = av;
5292         }
5293     } else {
5294         const MAGIC *const mg
5295             = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
5296         if (mg)
5297             av = MUTABLE_AV(mg->mg_obj);
5298         else {
5299             av = newAV();
5300             AvREAL_off(av);
5301             sv_magic(tsv, MUTABLE_SV(av), PERL_MAGIC_backref, NULL, 0);
5302             /* av now has a refcnt of 2; see discussion above */
5303         }
5304     }
5305     if (AvFILLp(av) >= AvMAX(av)) {
5306         av_extend(av, AvFILLp(av)+1);
5307     }
5308     AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */
5309 }
5310
5311 /* delete a back-reference to ourselves from the backref magic associated
5312  * with the SV we point to.
5313  */
5314
5315 STATIC void
5316 S_sv_del_backref(pTHX_ SV *const tsv, SV *const sv)
5317 {
5318     dVAR;
5319     AV *av = NULL;
5320     SV **svp;
5321     I32 i;
5322
5323     PERL_ARGS_ASSERT_SV_DEL_BACKREF;
5324
5325     if (SvTYPE(tsv) == SVt_PVHV && SvOOK(tsv)) {
5326         av = *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(tsv));
5327         /* We mustn't attempt to "fix up" the hash here by moving the
5328            backreference array back to the hv_aux structure, as that is stored
5329            in the main HvARRAY(), and hfreentries assumes that no-one
5330            reallocates HvARRAY() while it is running.  */
5331     }
5332     if (!av) {
5333         const MAGIC *const mg
5334             = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
5335         if (mg)
5336             av = MUTABLE_AV(mg->mg_obj);
5337     }
5338
5339     if (!av)
5340         Perl_croak(aTHX_ "panic: del_backref");
5341
5342     assert(!SvIS_FREED(av));
5343
5344     svp = AvARRAY(av);
5345     /* We shouldn't be in here more than once, but for paranoia reasons lets
5346        not assume this.  */
5347     for (i = AvFILLp(av); i >= 0; i--) {
5348         if (svp[i] == sv) {
5349             const SSize_t fill = AvFILLp(av);
5350             if (i != fill) {
5351                 /* We weren't the last entry.
5352                    An unordered list has this property that you can take the
5353                    last element off the end to fill the hole, and it's still
5354                    an unordered list :-)
5355                 */
5356                 svp[i] = svp[fill];
5357             }
5358             svp[fill] = NULL;
5359             AvFILLp(av) = fill - 1;
5360         }
5361     }
5362 }
5363
5364 int
5365 Perl_sv_kill_backrefs(pTHX_ SV *const sv, AV *const av)
5366 {
5367     SV **svp = AvARRAY(av);
5368
5369     PERL_ARGS_ASSERT_SV_KILL_BACKREFS;
5370     PERL_UNUSED_ARG(sv);
5371
5372     assert(!svp || !SvIS_FREED(av));
5373     if (svp) {
5374         SV *const *const last = svp + AvFILLp(av);
5375
5376         while (svp <= last) {
5377             if (*svp) {
5378                 SV *const referrer = *svp;
5379                 if (SvWEAKREF(referrer)) {
5380                     /* XXX Should we check that it hasn't changed? */
5381                     SvRV_set(referrer, 0);
5382                     SvOK_off(referrer);
5383                     SvWEAKREF_off(referrer);
5384                     SvSETMAGIC(referrer);
5385                 } else if (SvTYPE(referrer) == SVt_PVGV ||
5386                            SvTYPE(referrer) == SVt_PVLV) {
5387                     /* You lookin' at me?  */
5388                     assert(GvSTASH(referrer));
5389                     assert(GvSTASH(referrer) == (const HV *)sv);
5390                     GvSTASH(referrer) = 0;
5391                 } else {
5392                     Perl_croak(aTHX_
5393                                "panic: magic_killbackrefs (flags=%"UVxf")",
5394                                (UV)SvFLAGS(referrer));
5395                 }
5396
5397                 *svp = NULL;
5398             }
5399             svp++;
5400         }
5401     }
5402     SvREFCNT_dec(av); /* remove extra count added by sv_add_backref() */
5403     return 0;
5404 }
5405
5406 /*
5407 =for apidoc sv_insert
5408
5409 Inserts a string at the specified offset/length within the SV. Similar to
5410 the Perl substr() function. Handles get magic.
5411
5412 =for apidoc sv_insert_flags
5413
5414 Same as C<sv_insert>, but the extra C<flags> are passed the C<SvPV_force_flags> that applies to C<bigstr>.
5415
5416 =cut
5417 */
5418
5419 void
5420 Perl_sv_insert_flags(pTHX_ SV *const bigstr, const STRLEN offset, const STRLEN len, const char *const little, const STRLEN littlelen, const U32 flags)
5421 {
5422     dVAR;
5423     register char *big;
5424     register char *mid;
5425     register char *midend;
5426     register char *bigend;
5427     register I32 i;
5428     STRLEN curlen;
5429
5430     PERL_ARGS_ASSERT_SV_INSERT_FLAGS;
5431
5432     if (!bigstr)
5433         Perl_croak(aTHX_ "Can't modify non-existent substring");
5434     SvPV_force_flags(bigstr, curlen, flags);
5435     (void)SvPOK_only_UTF8(bigstr);
5436     if (offset + len > curlen) {
5437         SvGROW(bigstr, offset+len+1);
5438         Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
5439         SvCUR_set(bigstr, offset+len);
5440     }
5441
5442     SvTAINT(bigstr);
5443     i = littlelen - len;
5444     if (i > 0) {                        /* string might grow */
5445         big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
5446         mid = big + offset + len;
5447         midend = bigend = big + SvCUR(bigstr);
5448         bigend += i;
5449         *bigend = '\0';
5450         while (midend > mid)            /* shove everything down */
5451             *--bigend = *--midend;
5452         Move(little,big+offset,littlelen,char);
5453         SvCUR_set(bigstr, SvCUR(bigstr) + i);
5454         SvSETMAGIC(bigstr);
5455         return;
5456     }
5457     else if (i == 0) {
5458         Move(little,SvPVX(bigstr)+offset,len,char);
5459         SvSETMAGIC(bigstr);
5460         return;
5461     }
5462
5463     big = SvPVX(bigstr);
5464     mid = big + offset;
5465     midend = mid + len;
5466     bigend = big + SvCUR(bigstr);
5467
5468     if (midend > bigend)
5469         Perl_croak(aTHX_ "panic: sv_insert");
5470
5471     if (mid - big > bigend - midend) {  /* faster to shorten from end */
5472         if (littlelen) {
5473             Move(little, mid, littlelen,char);
5474             mid += littlelen;
5475         }
5476         i = bigend - midend;
5477         if (i > 0) {
5478             Move(midend, mid, i,char);
5479             mid += i;
5480         }
5481         *mid = '\0';
5482         SvCUR_set(bigstr, mid - big);
5483     }
5484     else if ((i = mid - big)) { /* faster from front */
5485         midend -= littlelen;
5486         mid = midend;
5487         Move(big, midend - i, i, char);
5488         sv_chop(bigstr,midend-i);
5489         if (littlelen)
5490             Move(little, mid, littlelen,char);
5491     }
5492     else if (littlelen) {
5493         midend -= littlelen;
5494         sv_chop(bigstr,midend);
5495         Move(little,midend,littlelen,char);
5496     }
5497     else {
5498         sv_chop(bigstr,midend);
5499     }
5500     SvSETMAGIC(bigstr);
5501 }
5502
5503 /*
5504 =for apidoc sv_replace
5505
5506 Make the first argument a copy of the second, then delete the original.
5507 The target SV physically takes over ownership of the body of the source SV
5508 and inherits its flags; however, the target keeps any magic it owns,
5509 and any magic in the source is discarded.
5510 Note that this is a rather specialist SV copying operation; most of the
5511 time you'll want to use C<sv_setsv> or one of its many macro front-ends.
5512
5513 =cut
5514 */
5515
5516 void
5517 Perl_sv_replace(pTHX_ register SV *const sv, register SV *const nsv)
5518 {
5519     dVAR;
5520     const U32 refcnt = SvREFCNT(sv);
5521
5522     PERL_ARGS_ASSERT_SV_REPLACE;
5523
5524     SV_CHECK_THINKFIRST_COW_DROP(sv);
5525     if (SvREFCNT(nsv) != 1) {
5526         Perl_croak(aTHX_ "panic: reference miscount on nsv in sv_replace() (%"
5527                    UVuf " != 1)", (UV) SvREFCNT(nsv));
5528     }
5529     if (SvMAGICAL(sv)) {
5530         if (SvMAGICAL(nsv))
5531             mg_free(nsv);
5532         else
5533             sv_upgrade(nsv, SVt_PVMG);
5534         SvMAGIC_set(nsv, SvMAGIC(sv));
5535         SvFLAGS(nsv) |= SvMAGICAL(sv);
5536         SvMAGICAL_off(sv);
5537         SvMAGIC_set(sv, NULL);
5538     }
5539     SvREFCNT(sv) = 0;
5540     sv_clear(sv);
5541     assert(!SvREFCNT(sv));
5542 #ifdef DEBUG_LEAKING_SCALARS
5543     sv->sv_flags  = nsv->sv_flags;
5544     sv->sv_any    = nsv->sv_any;
5545     sv->sv_refcnt = nsv->sv_refcnt;
5546     sv->sv_u      = nsv->sv_u;
5547 #else
5548     StructCopy(nsv,sv,SV);
5549 #endif
5550     if(SvTYPE(sv) == SVt_IV) {
5551         SvANY(sv)
5552             = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
5553     }
5554         
5555
5556 #ifdef PERL_OLD_COPY_ON_WRITE
5557     if (SvIsCOW_normal(nsv)) {
5558         /* We need to follow the pointers around the loop to make the
5559            previous SV point to sv, rather than nsv.  */
5560         SV *next;
5561         SV *current = nsv;
5562         while ((next = SV_COW_NEXT_SV(current)) != nsv) {
5563             assert(next);
5564             current = next;
5565             assert(SvPVX_const(current) == SvPVX_const(nsv));
5566         }
5567         /* Make the SV before us point to the SV after us.  */
5568         if (DEBUG_C_TEST) {
5569             PerlIO_printf(Perl_debug_log, "previous is\n");
5570             sv_dump(current);
5571             PerlIO_printf(Perl_debug_log,
5572                           "move it from 0x%"UVxf" to 0x%"UVxf"\n",
5573                           (UV) SV_COW_NEXT_SV(current), (UV) sv);
5574         }
5575         SV_COW_NEXT_SV_SET(current, sv);
5576     }
5577 #endif
5578     SvREFCNT(sv) = refcnt;
5579     SvFLAGS(nsv) |= SVTYPEMASK;         /* Mark as freed */
5580     SvREFCNT(nsv) = 0;
5581     del_SV(nsv);
5582 }
5583
5584 /*
5585 =for apidoc sv_clear
5586
5587 Clear an SV: call any destructors, free up any memory used by the body,
5588 and free the body itself. The SV's head is I<not> freed, although
5589 its type is set to all 1's so that it won't inadvertently be assumed
5590 to be live during global destruction etc.
5591 This function should only be called when REFCNT is zero. Most of the time
5592 you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
5593 instead.
5594
5595 =cut
5596 */
5597
5598 void
5599 Perl_sv_clear(pTHX_ register SV *const sv)
5600 {
5601     dVAR;
5602     const U32 type = SvTYPE(sv);
5603     const struct body_details *const sv_type_details
5604         = bodies_by_type + type;
5605     HV *stash;
5606
5607     PERL_ARGS_ASSERT_SV_CLEAR;
5608     assert(SvREFCNT(sv) == 0);
5609     assert(SvTYPE(sv) != SVTYPEMASK);
5610
5611     if (type <= SVt_IV) {
5612         /* See the comment in sv.h about the collusion between this early
5613            return and the overloading of the NULL and IV slots in the size
5614            table.  */
5615         if (SvROK(sv)) {
5616             SV * const target = SvRV(sv);
5617             if (SvWEAKREF(sv))
5618                 sv_del_backref(target, sv);
5619             else
5620                 SvREFCNT_dec(target);
5621         }
5622         SvFLAGS(sv) &= SVf_BREAK;
5623         SvFLAGS(sv) |= SVTYPEMASK;
5624         return;
5625     }
5626
5627     if (SvOBJECT(sv)) {
5628         if (PL_defstash &&      /* Still have a symbol table? */
5629             SvDESTROYABLE(sv))
5630         {
5631             dSP;
5632             HV* stash;
5633             do {        
5634                 CV* destructor;
5635                 stash = SvSTASH(sv);
5636                 destructor = StashHANDLER(stash,DESTROY);
5637                 if (destructor
5638                         /* A constant subroutine can have no side effects, so
5639                            don't bother calling it.  */
5640                         && !CvCONST(destructor)
5641                         /* Don't bother calling an empty destructor */
5642                         && (CvISXSUB(destructor)
5643                         || CvSTART(destructor)->op_next->op_type != OP_LEAVESUB))
5644                 {
5645                     SV* const tmpref = newRV(sv);
5646                     SvREADONLY_on(tmpref);   /* DESTROY() could be naughty */
5647                     ENTER;
5648                     PUSHSTACKi(PERLSI_DESTROY);
5649                     EXTEND(SP, 2);
5650                     PUSHMARK(SP);
5651                     PUSHs(tmpref);
5652                     PUTBACK;
5653                     call_sv(MUTABLE_SV(destructor), G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
5654                 
5655                 
5656                     POPSTACK;
5657                     SPAGAIN;
5658                     LEAVE;
5659                     if(SvREFCNT(tmpref) < 2) {
5660                         /* tmpref is not kept alive! */
5661                         SvREFCNT(sv)--;
5662                         SvRV_set(tmpref, NULL);
5663                         SvROK_off(tmpref);
5664                     }
5665                     SvREFCNT_dec(tmpref);
5666                 }
5667             } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
5668
5669
5670             if (SvREFCNT(sv)) {
5671                 if (PL_in_clean_objs)
5672                     Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
5673                           HvNAME_get(stash));
5674                 /* DESTROY gave object new lease on life */
5675                 return;
5676             }
5677         }
5678
5679         if (SvOBJECT(sv)) {
5680             SvREFCNT_dec(SvSTASH(sv));  /* possibly of changed persuasion */
5681             SvOBJECT_off(sv);   /* Curse the object. */
5682             if (type != SVt_PVIO)
5683                 --PL_sv_objcount;       /* XXX Might want something more general */
5684         }
5685     }
5686     if (type >= SVt_PVMG) {
5687         if (type == SVt_PVMG && SvPAD_OUR(sv)) {
5688             SvREFCNT_dec(SvOURSTASH(sv));
5689         } else if (SvMAGIC(sv))
5690             mg_free(sv);
5691         if (type == SVt_PVMG && SvPAD_TYPED(sv))
5692             SvREFCNT_dec(SvSTASH(sv));
5693     }
5694     switch (type) {
5695         /* case SVt_BIND: */
5696     case SVt_PVIO:
5697         if (IoIFP(sv) &&
5698             IoIFP(sv) != PerlIO_stdin() &&
5699             IoIFP(sv) != PerlIO_stdout() &&
5700             IoIFP(sv) != PerlIO_stderr())
5701         {
5702             io_close(MUTABLE_IO(sv), FALSE);
5703         }
5704         if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
5705             PerlDir_close(IoDIRP(sv));
5706         IoDIRP(sv) = (DIR*)NULL;
5707         Safefree(IoTOP_NAME(sv));
5708         Safefree(IoFMT_NAME(sv));
5709         Safefree(IoBOTTOM_NAME(sv));
5710         goto freescalar;
5711     case SVt_REGEXP:
5712         /* FIXME for plugins */
5713         pregfree2((REGEXP*) sv);
5714         goto freescalar;
5715     case SVt_PVCV:
5716     case SVt_PVFM:
5717         cv_undef(MUTABLE_CV(sv));
5718         goto freescalar;
5719     case SVt_PVHV:
5720         if (PL_last_swash_hv == (const HV *)sv) {
5721             PL_last_swash_hv = NULL;
5722         }
5723         Perl_hv_kill_backrefs(aTHX_ MUTABLE_HV(sv));
5724         hv_undef(MUTABLE_HV(sv));
5725         break;
5726     case SVt_PVAV:
5727         if (PL_comppad == MUTABLE_AV(sv)) {
5728             PL_comppad = NULL;
5729             PL_curpad = NULL;
5730         }
5731         av_undef(MUTABLE_AV(sv));
5732         break;
5733     case SVt_PVLV:
5734         if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
5735             SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv)));
5736             HeNEXT((HE*)LvTARG(sv)) = PL_hv_fetch_ent_mh;
5737             PL_hv_fetch_ent_mh = (HE*)LvTARG(sv);
5738         }
5739         else if (LvTYPE(sv) != 't') /* unless tie: unrefcnted fake SV**  */
5740             SvREFCNT_dec(LvTARG(sv));
5741     case SVt_PVGV:
5742         if (isGV_with_GP(sv)) {
5743             if(GvCVu((const GV *)sv) && (stash = GvSTASH(MUTABLE_GV(sv)))
5744                && HvNAME_get(stash))
5745                 mro_method_changed_in(stash);
5746             gp_free(MUTABLE_GV(sv));
5747             if (GvNAME_HEK(sv))
5748                 unshare_hek(GvNAME_HEK(sv));
5749             /* If we're in a stash, we don't own a reference to it. However it does
5750                have a back reference to us, which needs to be cleared.  */
5751             if (!SvVALID(sv) && (stash = GvSTASH(sv)))
5752                     sv_del_backref(MUTABLE_SV(stash), sv);
5753         }
5754         /* FIXME. There are probably more unreferenced pointers to SVs in the
5755            interpreter struct that we should check and tidy in a similar
5756            fashion to this:  */
5757         if ((const GV *)sv == PL_last_in_gv)
5758             PL_last_in_gv = NULL;
5759     case SVt_PVMG:
5760     case SVt_PVNV:
5761     case SVt_PVIV:
5762     case SVt_PV:
5763       freescalar:
5764         /* Don't bother with SvOOK_off(sv); as we're only going to free it.  */
5765         if (SvOOK(sv)) {
5766             STRLEN offset;
5767             SvOOK_offset(sv, offset);
5768             SvPV_set(sv, SvPVX_mutable(sv) - offset);
5769             /* Don't even bother with turning off the OOK flag.  */
5770         }
5771         if (SvROK(sv)) {
5772             SV * const target = SvRV(sv);
5773             if (SvWEAKREF(sv))
5774                 sv_del_backref(target, sv);
5775             else
5776                 SvREFCNT_dec(target);
5777         }
5778 #ifdef PERL_OLD_COPY_ON_WRITE
5779         else if (SvPVX_const(sv)) {
5780             if (SvIsCOW(sv)) {
5781                 if (DEBUG_C_TEST) {
5782                     PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
5783                     sv_dump(sv);
5784                 }
5785                 if (SvLEN(sv)) {
5786                     sv_release_COW(sv, SvPVX_const(sv), SV_COW_NEXT_SV(sv));
5787                 } else {
5788                     unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
5789                 }
5790
5791                 SvFAKE_off(sv);
5792             } else if (SvLEN(sv)) {
5793                 Safefree(SvPVX_const(sv));
5794             }
5795         }
5796 #else
5797         else if (SvPVX_const(sv) && SvLEN(sv))
5798             Safefree(SvPVX_mutable(sv));
5799         else if (SvPVX_const(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
5800             unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
5801             SvFAKE_off(sv);
5802         }
5803 #endif
5804         break;
5805     case SVt_NV:
5806         break;
5807     }
5808
5809     SvFLAGS(sv) &= SVf_BREAK;
5810     SvFLAGS(sv) |= SVTYPEMASK;
5811
5812     if (sv_type_details->arena) {
5813         del_body(((char *)SvANY(sv) + sv_type_details->offset),
5814                  &PL_body_roots[type]);
5815     }
5816     else if (sv_type_details->body_size) {
5817         my_safefree(SvANY(sv));
5818     }
5819 }
5820
5821 /*
5822 =for apidoc sv_newref
5823
5824 Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
5825 instead.
5826
5827 =cut
5828 */
5829
5830 SV *
5831 Perl_sv_newref(pTHX_ SV *const sv)
5832 {
5833     PERL_UNUSED_CONTEXT;
5834     if (sv)
5835         (SvREFCNT(sv))++;
5836     return sv;
5837 }
5838
5839 /*
5840 =for apidoc sv_free
5841
5842 Decrement an SV's reference count, and if it drops to zero, call
5843 C<sv_clear> to invoke destructors and free up any memory used by
5844 the body; finally, deallocate the SV's head itself.
5845 Normally called via a wrapper macro C<SvREFCNT_dec>.
5846
5847 =cut
5848 */
5849
5850 void
5851 Perl_sv_free(pTHX_ SV *const sv)
5852 {
5853     dVAR;
5854     if (!sv)
5855         return;
5856     if (SvREFCNT(sv) == 0) {
5857         if (SvFLAGS(sv) & SVf_BREAK)
5858             /* this SV's refcnt has been artificially decremented to
5859              * trigger cleanup */
5860             return;
5861         if (PL_in_clean_all) /* All is fair */
5862             return;
5863         if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5864             /* make sure SvREFCNT(sv)==0 happens very seldom */
5865             SvREFCNT(sv) = (~(U32)0)/2;
5866             return;
5867         }
5868         if (ckWARN_d(WARN_INTERNAL)) {
5869 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
5870             Perl_dump_sv_child(aTHX_ sv);
5871 #else
5872   #ifdef DEBUG_LEAKING_SCALARS
5873             sv_dump(sv);
5874   #endif
5875 #ifdef DEBUG_LEAKING_SCALARS_ABORT
5876             if (PL_warnhook == PERL_WARNHOOK_FATAL
5877                 || ckDEAD(packWARN(WARN_INTERNAL))) {
5878                 /* Don't let Perl_warner cause us to escape our fate:  */
5879                 abort();
5880             }
5881 #endif
5882             /* This may not return:  */
5883             Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
5884                         "Attempt to free unreferenced scalar: SV 0x%"UVxf
5885                         pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
5886 #endif
5887         }
5888 #ifdef DEBUG_LEAKING_SCALARS_ABORT
5889         abort();
5890 #endif
5891         return;
5892     }
5893     if (--(SvREFCNT(sv)) > 0)
5894         return;
5895     Perl_sv_free2(aTHX_ sv);
5896 }
5897
5898 void
5899 Perl_sv_free2(pTHX_ SV *const sv)
5900 {
5901     dVAR;
5902
5903     PERL_ARGS_ASSERT_SV_FREE2;
5904
5905 #ifdef DEBUGGING
5906     if (SvTEMP(sv)) {
5907         if (ckWARN_d(WARN_DEBUGGING))
5908             Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
5909                         "Attempt to free temp prematurely: SV 0x%"UVxf
5910                         pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
5911         return;
5912     }
5913 #endif
5914     if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5915         /* make sure SvREFCNT(sv)==0 happens very seldom */
5916         SvREFCNT(sv) = (~(U32)0)/2;
5917         return;
5918     }
5919     sv_clear(sv);
5920     if (! SvREFCNT(sv))
5921         del_SV(sv);
5922 }
5923
5924 /*
5925 =for apidoc sv_len
5926
5927 Returns the length of the string in the SV. Handles magic and type
5928 coercion.  See also C<SvCUR>, which gives raw access to the xpv_cur slot.
5929
5930 =cut
5931 */
5932
5933 STRLEN
5934 Perl_sv_len(pTHX_ register SV *const sv)
5935 {
5936     STRLEN len;
5937
5938     if (!sv)
5939         return 0;
5940
5941     if (SvGMAGICAL(sv))
5942         len = mg_length(sv);
5943     else
5944         (void)SvPV_const(sv, len);
5945     return len;
5946 }
5947
5948 /*
5949 =for apidoc sv_len_utf8
5950
5951 Returns the number of characters in the string in an SV, counting wide
5952 UTF-8 bytes as a single character. Handles magic and type coercion.
5953
5954 =cut
5955 */
5956
5957 /*
5958  * The length is cached in PERL_MAGIC_utf8, in the mg_len field.  Also the
5959  * mg_ptr is used, by sv_pos_u2b() and sv_pos_b2u() - see the comments below.
5960  * (Note that the mg_len is not the length of the mg_ptr field.
5961  * This allows the cache to store the character length of the string without
5962  * needing to malloc() extra storage to attach to the mg_ptr.)
5963  *
5964  */
5965
5966 STRLEN
5967 Perl_sv_len_utf8(pTHX_ register SV *const sv)
5968 {
5969     if (!sv)
5970         return 0;
5971
5972     if (SvGMAGICAL(sv))
5973         return mg_length(sv);
5974     else
5975     {
5976         STRLEN len;
5977         const U8 *s = (U8*)SvPV_const(sv, len);
5978
5979         if (PL_utf8cache) {
5980             STRLEN ulen;
5981             MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : NULL;
5982
5983             if (mg && mg->mg_len != -1) {
5984                 ulen = mg->mg_len;
5985                 if (PL_utf8cache < 0) {
5986                     const STRLEN real = Perl_utf8_length(aTHX_ s, s + len);
5987                     if (real != ulen) {
5988                         /* Need to turn the assertions off otherwise we may
5989                            recurse infinitely while printing error messages.
5990                         */
5991                         SAVEI8(PL_utf8cache);
5992                         PL_utf8cache = 0;
5993                         Perl_croak(aTHX_ "panic: sv_len_utf8 cache %"UVuf
5994                                    " real %"UVuf" for %"SVf,
5995                                    (UV) ulen, (UV) real, SVfARG(sv));
5996                     }
5997                 }
5998             }
5999             else {
6000                 ulen = Perl_utf8_length(aTHX_ s, s + len);
6001                 if (!SvREADONLY(sv)) {
6002                     if (!mg) {
6003                         mg = sv_magicext(sv, 0, PERL_MAGIC_utf8,
6004                                          &PL_vtbl_utf8, 0, 0);
6005                     }
6006                     assert(mg);
6007                     mg->mg_len = ulen;
6008                 }
6009             }
6010             return ulen;
6011         }
6012         return Perl_utf8_length(aTHX_ s, s + len);
6013     }
6014 }
6015
6016 /* Walk forwards to find the byte corresponding to the passed in UTF-8
6017    offset.  */
6018 static STRLEN
6019 S_sv_pos_u2b_forwards(const U8 *const start, const U8 *const send,
6020                       STRLEN uoffset)
6021 {
6022     const U8 *s = start;
6023
6024     PERL_ARGS_ASSERT_SV_POS_U2B_FORWARDS;
6025
6026     while (s < send && uoffset--)
6027         s += UTF8SKIP(s);
6028     if (s > send) {
6029         /* This is the existing behaviour. Possibly it should be a croak, as
6030            it's actually a bounds error  */
6031         s = send;
6032     }
6033     return s - start;
6034 }
6035
6036 /* Given the length of the string in both bytes and UTF-8 characters, decide
6037    whether to walk forwards or backwards to find the byte corresponding to
6038    the passed in UTF-8 offset.  */
6039 static STRLEN
6040 S_sv_pos_u2b_midway(const U8 *const start, const U8 *send,
6041                       const STRLEN uoffset, const STRLEN uend)
6042 {
6043     STRLEN backw = uend - uoffset;
6044
6045     PERL_ARGS_ASSERT_SV_POS_U2B_MIDWAY;
6046
6047     if (uoffset < 2 * backw) {
6048         /* The assumption is that going forwards is twice the speed of going
6049            forward (that's where the 2 * backw comes from).
6050            (The real figure of course depends on the UTF-8 data.)  */
6051         return sv_pos_u2b_forwards(start, send, uoffset);
6052     }
6053
6054     while (backw--) {
6055         send--;
6056         while (UTF8_IS_CONTINUATION(*send))
6057             send--;
6058     }
6059     return send - start;
6060 }
6061
6062 /* For the string representation of the given scalar, find the byte
6063    corresponding to the passed in UTF-8 offset.  uoffset0 and boffset0
6064    give another position in the string, *before* the sought offset, which
6065    (which is always true, as 0, 0 is a valid pair of positions), which should
6066    help reduce the amount of linear searching.
6067    If *mgp is non-NULL, it should point to the UTF-8 cache magic, which
6068    will be used to reduce the amount of linear searching. The cache will be
6069    created if necessary, and the found value offered to it for update.  */
6070 static STRLEN
6071 S_sv_pos_u2b_cached(pTHX_ SV *const sv, MAGIC **const mgp, const U8 *const start,
6072                     const U8 *const send, const STRLEN uoffset,
6073                     STRLEN uoffset0, STRLEN boffset0)
6074 {
6075     STRLEN boffset = 0; /* Actually always set, but let's keep gcc happy.  */
6076     bool found = FALSE;
6077
6078     PERL_ARGS_ASSERT_SV_POS_U2B_CACHED;
6079
6080     assert (uoffset >= uoffset0);
6081
6082     if (SvMAGICAL(sv) && !SvREADONLY(sv) && PL_utf8cache
6083         && (*mgp || (*mgp = mg_find(sv, PERL_MAGIC_utf8)))) {
6084         if ((*mgp)->mg_ptr) {
6085             STRLEN *cache = (STRLEN *) (*mgp)->mg_ptr;
6086             if (cache[0] == uoffset) {
6087                 /* An exact match. */
6088                 return cache[1];
6089             }
6090             if (cache[2] == uoffset) {
6091                 /* An exact match. */
6092                 return cache[3];
6093             }
6094
6095             if (cache[0] < uoffset) {
6096                 /* The cache already knows part of the way.   */
6097                 if (cache[0] > uoffset0) {
6098                     /* The cache knows more than the passed in pair  */
6099                     uoffset0 = cache[0];
6100                     boffset0 = cache[1];
6101                 }
6102                 if ((*mgp)->mg_len != -1) {
6103                     /* And we know the end too.  */
6104                     boffset = boffset0
6105                         + sv_pos_u2b_midway(start + boffset0, send,
6106                                               uoffset - uoffset0,
6107                                               (*mgp)->mg_len - uoffset0);
6108                 } else {
6109                     boffset = boffset0
6110                         + sv_pos_u2b_forwards(start + boffset0,
6111                                                 send, uoffset - uoffset0);
6112                 }
6113             }
6114             else if (cache[2] < uoffset) {
6115                 /* We're between the two cache entries.  */
6116                 if (cache[2] > uoffset0) {
6117                     /* and the cache knows more than the passed in pair  */
6118                     uoffset0 = cache[2];
6119                     boffset0 = cache[3];
6120                 }
6121
6122                 boffset = boffset0
6123                     + sv_pos_u2b_midway(start + boffset0,
6124                                           start + cache[1],
6125                                           uoffset - uoffset0,
6126                                           cache[0] - uoffset0);
6127             } else {
6128                 boffset = boffset0
6129                     + sv_pos_u2b_midway(start + boffset0,
6130                                           start + cache[3],
6131                                           uoffset - uoffset0,
6132                                           cache[2] - uoffset0);
6133             }
6134             found = TRUE;
6135         }
6136         else if ((*mgp)->mg_len != -1) {
6137             /* If we can take advantage of a passed in offset, do so.  */
6138             /* In fact, offset0 is either 0, or less than offset, so don't
6139                need to worry about the other possibility.  */
6140             boffset = boffset0
6141                 + sv_pos_u2b_midway(start + boffset0, send,
6142                                       uoffset - uoffset0,
6143                                       (*mgp)->mg_len - uoffset0);
6144             found = TRUE;
6145         }
6146     }
6147
6148     if (!found || PL_utf8cache < 0) {
6149         const STRLEN real_boffset
6150             = boffset0 + sv_pos_u2b_forwards(start + boffset0,
6151                                                send, uoffset - uoffset0);
6152
6153         if (found && PL_utf8cache < 0) {
6154             if (real_boffset != boffset) {
6155                 /* Need to turn the assertions off otherwise we may recurse
6156                    infinitely while printing error messages.  */
6157                 SAVEI8(PL_utf8cache);
6158                 PL_utf8cache = 0;
6159                 Perl_croak(aTHX_ "panic: sv_pos_u2b_cache cache %"UVuf
6160                            " real %"UVuf" for %"SVf,
6161                            (UV) boffset, (UV) real_boffset, SVfARG(sv));
6162             }
6163         }
6164         boffset = real_boffset;
6165     }
6166
6167     if (PL_utf8cache)
6168         utf8_mg_pos_cache_update(sv, mgp, boffset, uoffset, send - start);
6169     return boffset;
6170 }
6171
6172
6173 /*
6174 =for apidoc sv_pos_u2b
6175
6176 Converts the value pointed to by offsetp from a count of UTF-8 chars from
6177 the start of the string, to a count of the equivalent number of bytes; if
6178 lenp is non-zero, it does the same to lenp, but this time starting from
6179 the offset, rather than from the start of the string. Handles magic and
6180 type coercion.
6181
6182 =cut
6183 */
6184
6185 /*
6186  * sv_pos_u2b() uses, like sv_pos_b2u(), the mg_ptr of the potential
6187  * PERL_MAGIC_utf8 of the sv to store the mapping between UTF-8 and
6188  * byte offsets.  See also the comments of S_utf8_mg_pos_cache_update().
6189  *
6190  */
6191
6192 void
6193 Perl_sv_pos_u2b(pTHX_ register SV *const sv, I32 *const offsetp, I32 *const lenp)
6194 {
6195     const U8 *start;
6196     STRLEN len;
6197
6198     PERL_ARGS_ASSERT_SV_POS_U2B;
6199
6200     if (!sv)
6201         return;
6202
6203     start = (U8*)SvPV_const(sv, len);
6204     if (len) {
6205         STRLEN uoffset = (STRLEN) *offsetp;
6206         const U8 * const send = start + len;
6207         MAGIC *mg = NULL;
6208         const STRLEN boffset = sv_pos_u2b_cached(sv, &mg, start, send,
6209                                              uoffset, 0, 0);
6210
6211         *offsetp = (I32) boffset;
6212
6213         if (lenp) {
6214             /* Convert the relative offset to absolute.  */
6215             const STRLEN uoffset2 = uoffset + (STRLEN) *lenp;
6216             const STRLEN boffset2
6217                 = sv_pos_u2b_cached(sv, &mg, start, send, uoffset2,
6218                                       uoffset, boffset) - boffset;
6219
6220             *lenp = boffset2;
6221         }
6222     }
6223     else {
6224          *offsetp = 0;
6225          if (lenp)
6226               *lenp = 0;
6227     }
6228
6229     return;
6230 }
6231
6232 /* Create and update the UTF8 magic offset cache, with the proffered utf8/
6233    byte length pairing. The (byte) length of the total SV is passed in too,
6234    as blen, because for some (more esoteric) SVs, the call to SvPV_const()
6235    may not have updated SvCUR, so we can't rely on reading it directly.
6236
6237    The proffered utf8/byte length pairing isn't used if the cache already has
6238    two pairs, and swapping either for the proffered pair would increase the
6239    RMS of the intervals between known byte offsets.
6240
6241    The cache itself consists of 4 STRLEN values
6242    0: larger UTF-8 offset
6243    1: corresponding byte offset
6244    2: smaller UTF-8 offset
6245    3: corresponding byte offset
6246
6247    Unused cache pairs have the value 0, 0.
6248    Keeping the cache "backwards" means that the invariant of
6249    cache[0] >= cache[2] is maintained even with empty slots, which means that
6250    the code that uses it doesn't need to worry if only 1 entry has actually
6251    been set to non-zero.  It also makes the "position beyond the end of the
6252    cache" logic much simpler, as the first slot is always the one to start
6253    from.   
6254 */
6255 static void
6256 S_utf8_mg_pos_cache_update(pTHX_ SV *const sv, MAGIC **const mgp, const STRLEN byte,
6257                            const STRLEN utf8, const STRLEN blen)
6258 {
6259     STRLEN *cache;
6260
6261     PERL_ARGS_ASSERT_UTF8_MG_POS_CACHE_UPDATE;
6262
6263     if (SvREADONLY(sv))
6264         return;
6265
6266     if (!*mgp) {
6267         *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, (MGVTBL*)&PL_vtbl_utf8, 0,
6268                            0);
6269         (*mgp)->mg_len = -1;
6270     }
6271     assert(*mgp);
6272
6273     if (!(cache = (STRLEN *)(*mgp)->mg_ptr)) {
6274         Newxz(cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
6275         (*mgp)->mg_ptr = (char *) cache;
6276     }
6277     assert(cache);
6278
6279     if (PL_utf8cache < 0) {
6280         const U8 *start = (const U8 *) SvPVX_const(sv);
6281         const STRLEN realutf8 = utf8_length(start, start + byte);
6282
6283         if (realutf8 != utf8) {
6284             /* Need to turn the assertions off otherwise we may recurse
6285                infinitely while printing error messages.  */
6286             SAVEI8(PL_utf8cache);
6287             PL_utf8cache = 0;
6288             Perl_croak(aTHX_ "panic: utf8_mg_pos_cache_update cache %"UVuf
6289                        " real %"UVuf" for %"SVf, (UV) utf8, (UV) realutf8, SVfARG(sv));
6290         }
6291     }
6292
6293     /* Cache is held with the later position first, to simplify the code
6294        that deals with unbounded ends.  */
6295        
6296     ASSERT_UTF8_CACHE(cache);
6297     if (cache[1] == 0) {
6298         /* Cache is totally empty  */
6299         cache[0] = utf8;
6300         cache[1] = byte;
6301     } else if (cache[3] == 0) {
6302         if (byte > cache[1]) {
6303             /* New one is larger, so goes first.  */
6304             cache[2] = cache[0];
6305             cache[3] = cache[1];
6306             cache[0] = utf8;
6307             cache[1] = byte;
6308         } else {
6309             cache[2] = utf8;
6310             cache[3] = byte;
6311         }
6312     } else {
6313 #define THREEWAY_SQUARE(a,b,c,d) \
6314             ((float)((d) - (c))) * ((float)((d) - (c))) \
6315             + ((float)((c) - (b))) * ((float)((c) - (b))) \
6316                + ((float)((b) - (a))) * ((float)((b) - (a)))
6317
6318         /* Cache has 2 slots in use, and we know three potential pairs.
6319            Keep the two that give the lowest RMS distance. Do the
6320            calcualation in bytes simply because we always know the byte
6321            length.  squareroot has the same ordering as the positive value,
6322            so don't bother with the actual square root.  */
6323         const float existing = THREEWAY_SQUARE(0, cache[3], cache[1], blen);
6324         if (byte > cache[1]) {
6325             /* New position is after the existing pair of pairs.  */
6326             const float keep_earlier
6327                 = THREEWAY_SQUARE(0, cache[3], byte, blen);
6328             const float keep_later
6329                 = THREEWAY_SQUARE(0, cache[1], byte, blen);
6330
6331             if (keep_later < keep_earlier) {
6332                 if (keep_later < existing) {
6333                     cache[2] = cache[0];
6334                     cache[3] = cache[1];
6335                     cache[0] = utf8;
6336                     cache[1] = byte;
6337                 }
6338             }
6339             else {
6340                 if (keep_earlier < existing) {
6341                     cache[0] = utf8;
6342                     cache[1] = byte;
6343                 }
6344             }
6345         }
6346         else if (byte > cache[3]) {
6347             /* New position is between the existing pair of pairs.  */
6348             const float keep_earlier
6349                 = THREEWAY_SQUARE(0, cache[3], byte, blen);
6350             const float keep_later
6351                 = THREEWAY_SQUARE(0, byte, cache[1], blen);
6352
6353             if (keep_later < keep_earlier) {
6354                 if (keep_later < existing) {
6355                     cache[2] = utf8;
6356                     cache[3] = byte;
6357                 }
6358             }
6359             else {
6360                 if (keep_earlier < existing) {
6361                     cache[0] = utf8;
6362                     cache[1] = byte;
6363                 }
6364             }
6365         }
6366         else {
6367             /* New position is before the existing pair of pairs.  */
6368             const float keep_earlier
6369                 = THREEWAY_SQUARE(0, byte, cache[3], blen);
6370             const float keep_later
6371                 = THREEWAY_SQUARE(0, byte, cache[1], blen);
6372
6373             if (keep_later < keep_earlier) {
6374                 if (keep_later < existing) {
6375                     cache[2] = utf8;
6376                     cache[3] = byte;
6377                 }
6378             }
6379             else {
6380                 if (keep_earlier < existing) {
6381                     cache[0] = cache[2];
6382                     cache[1] = cache[3];
6383                     cache[2] = utf8;
6384                     cache[3] = byte;
6385                 }
6386             }
6387         }
6388     }
6389     ASSERT_UTF8_CACHE(cache);
6390 }
6391
6392 /* We already know all of the way, now we may be able to walk back.  The same
6393    assumption is made as in S_sv_pos_u2b_midway(), namely that walking
6394    backward is half the speed of walking forward. */
6395 static STRLEN
6396 S_sv_pos_b2u_midway(pTHX_ const U8 *const s, const U8 *const target,
6397                     const U8 *end, STRLEN endu)
6398 {
6399     const STRLEN forw = target - s;
6400     STRLEN backw = end - target;
6401
6402     PERL_ARGS_ASSERT_SV_POS_B2U_MIDWAY;
6403
6404     if (forw < 2 * backw) {
6405         return utf8_length(s, target);
6406     }
6407
6408     while (end > target) {
6409         end--;
6410         while (UTF8_IS_CONTINUATION(*end)) {
6411             end--;
6412         }
6413         endu--;
6414     }
6415     return endu;
6416 }
6417
6418 /*
6419 =for apidoc sv_pos_b2u
6420
6421 Converts the value pointed to by offsetp from a count of bytes from the
6422 start of the string, to a count of the equivalent number of UTF-8 chars.
6423 Handles magic and type coercion.
6424
6425 =cut
6426 */
6427
6428 /*
6429  * sv_pos_b2u() uses, like sv_pos_u2b(), the mg_ptr of the potential
6430  * PERL_MAGIC_utf8 of the sv to store the mapping between UTF-8 and
6431  * byte offsets.
6432  *
6433  */
6434 void
6435 Perl_sv_pos_b2u(pTHX_ register SV *const sv, I32 *const offsetp)
6436 {
6437     const U8* s;
6438     const STRLEN byte = *offsetp;
6439     STRLEN len = 0; /* Actually always set, but let's keep gcc happy.  */
6440     STRLEN blen;
6441     MAGIC* mg = NULL;
6442     const U8* send;
6443     bool found = FALSE;
6444
6445     PERL_ARGS_ASSERT_SV_POS_B2U;
6446
6447     if (!sv)
6448         return;
6449
6450     s = (const U8*)SvPV_const(sv, blen);
6451
6452     if (blen < byte)
6453         Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
6454
6455     send = s + byte;
6456
6457     if (SvMAGICAL(sv) && !SvREADONLY(sv) && PL_utf8cache
6458         && (mg = mg_find(sv, PERL_MAGIC_utf8))) {
6459         if (mg->mg_ptr) {
6460             STRLEN * const cache = (STRLEN *) mg->mg_ptr;
6461             if (cache[1] == byte) {
6462                 /* An exact match. */
6463                 *offsetp = cache[0];
6464                 return;
6465             }
6466             if (cache[3] == byte) {
6467                 /* An exact match. */
6468                 *offsetp = cache[2];
6469                 return;
6470             }
6471
6472             if (cache[1] < byte) {
6473                 /* We already know part of the way. */
6474                 if (mg->mg_len != -1) {
6475                     /* Actually, we know the end too.  */
6476                     len = cache[0]
6477                         + S_sv_pos_b2u_midway(aTHX_ s + cache[1], send,
6478                                               s + blen, mg->mg_len - cache[0]);
6479                 } else {
6480                     len = cache[0] + utf8_length(s + cache[1], send);
6481                 }
6482             }
6483             else if (cache[3] < byte) {
6484                 /* We're between the two cached pairs, so we do the calculation
6485                    offset by the byte/utf-8 positions for the earlier pair,
6486                    then add the utf-8 characters from the string start to
6487                    there.  */
6488                 len = S_sv_pos_b2u_midway(aTHX_ s + cache[3], send,
6489                                           s + cache[1], cache[0] - cache[2])
6490                     + cache[2];
6491
6492             }
6493             else { /* cache[3] > byte */
6494                 len = S_sv_pos_b2u_midway(aTHX_ s, send, s + cache[3],
6495                                           cache[2]);
6496
6497             }
6498             ASSERT_UTF8_CACHE(cache);
6499             found = TRUE;
6500         } else if (mg->mg_len != -1) {
6501             len = S_sv_pos_b2u_midway(aTHX_ s, send, s + blen, mg->mg_len);
6502             found = TRUE;
6503         }
6504     }
6505     if (!found || PL_utf8cache < 0) {
6506         const STRLEN real_len = utf8_length(s, send);
6507
6508         if (found && PL_utf8cache < 0) {
6509             if (len != real_len) {
6510                 /* Need to turn the assertions off otherwise we may recurse
6511                    infinitely while printing error messages.  */
6512                 SAVEI8(PL_utf8cache);
6513                 PL_utf8cache = 0;
6514                 Perl_croak(aTHX_ "panic: sv_pos_b2u cache %"UVuf
6515                            " real %"UVuf" for %"SVf,
6516                            (UV) len, (UV) real_len, SVfARG(sv));
6517             }
6518         }
6519         len = real_len;
6520     }
6521     *offsetp = len;
6522
6523     if (PL_utf8cache)
6524         utf8_mg_pos_cache_update(sv, &mg, byte, len, blen);
6525 }
6526
6527 /*
6528 =for apidoc sv_eq
6529
6530 Returns a boolean indicating whether the strings in the two SVs are
6531 identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6532 coerce its args to strings if necessary.
6533
6534 =cut
6535 */
6536
6537 I32
6538 Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
6539 {
6540     dVAR;
6541     const char *pv1;
6542     STRLEN cur1;
6543     const char *pv2;
6544     STRLEN cur2;
6545     I32  eq     = 0;
6546     char *tpv   = NULL;
6547     SV* svrecode = NULL;
6548
6549     if (!sv1) {
6550         pv1 = "";
6551         cur1 = 0;
6552     }
6553     else {
6554         /* if pv1 and pv2 are the same, second SvPV_const call may
6555          * invalidate pv1, so we may need to make a copy */
6556         if (sv1 == sv2 && (SvTHINKFIRST(sv1) || SvGMAGICAL(sv1))) {
6557             pv1 = SvPV_const(sv1, cur1);
6558             sv1 = newSVpvn_flags(pv1, cur1, SVs_TEMP | SvUTF8(sv2));
6559         }
6560         pv1 = SvPV_const(sv1, cur1);
6561     }
6562
6563     if (!sv2){
6564         pv2 = "";
6565         cur2 = 0;
6566     }
6567     else
6568         pv2 = SvPV_const(sv2, cur2);
6569
6570     if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
6571         /* Differing utf8ness.
6572          * Do not UTF8size the comparands as a side-effect. */
6573          if (PL_encoding) {
6574               if (SvUTF8(sv1)) {
6575                    svrecode = newSVpvn(pv2, cur2);
6576                    sv_recode_to_utf8(svrecode, PL_encoding);
6577                    pv2 = SvPV_const(svrecode, cur2);
6578               }
6579               else {
6580                    svrecode = newSVpvn(pv1, cur1);
6581                    sv_recode_to_utf8(svrecode, PL_encoding);
6582                    pv1 = SvPV_const(svrecode, cur1);
6583               }
6584               /* Now both are in UTF-8. */
6585               if (cur1 != cur2) {
6586                    SvREFCNT_dec(svrecode);
6587                    return FALSE;
6588               }
6589          }
6590          else {
6591               bool is_utf8 = TRUE;
6592
6593               if (SvUTF8(sv1)) {
6594                    /* sv1 is the UTF-8 one,
6595                     * if is equal it must be downgrade-able */
6596                    char * const pv = (char*)bytes_from_utf8((const U8*)pv1,
6597                                                      &cur1, &is_utf8);
6598                    if (pv != pv1)
6599                         pv1 = tpv = pv;
6600               }
6601               else {
6602                    /* sv2 is the UTF-8 one,
6603                     * if is equal it must be downgrade-able */
6604                    char * const pv = (char *)bytes_from_utf8((const U8*)pv2,
6605                                                       &cur2, &is_utf8);
6606                    if (pv != pv2)
6607                         pv2 = tpv = pv;
6608               }
6609               if (is_utf8) {
6610                    /* Downgrade not possible - cannot be eq */
6611                    assert (tpv == 0);
6612                    return FALSE;
6613               }
6614          }
6615     }
6616
6617     if (cur1 == cur2)
6618         eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
6619         
6620     SvREFCNT_dec(svrecode);
6621     if (tpv)
6622         Safefree(tpv);
6623
6624     return eq;
6625 }
6626
6627 /*
6628 =for apidoc sv_cmp
6629
6630 Compares the strings in two SVs.  Returns -1, 0, or 1 indicating whether the
6631 string in C<sv1> is less than, equal to, or greater than the string in
6632 C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6633 coerce its args to strings if necessary.  See also C<sv_cmp_locale>.
6634
6635 =cut
6636 */
6637
6638 I32
6639 Perl_sv_cmp(pTHX_ register SV *const sv1, register SV *const sv2)
6640 {
6641     dVAR;
6642     STRLEN cur1, cur2;
6643     const char *pv1, *pv2;
6644     char *tpv = NULL;
6645     I32  cmp;
6646     SV *svrecode = NULL;
6647
6648     if (!sv1) {
6649         pv1 = "";
6650         cur1 = 0;
6651     }
6652     else
6653         pv1 = SvPV_const(sv1, cur1);
6654
6655     if (!sv2) {
6656         pv2 = "";
6657         cur2 = 0;
6658     }
6659     else
6660         pv2 = SvPV_const(sv2, cur2);
6661
6662     if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
6663         /* Differing utf8ness.
6664          * Do not UTF8size the comparands as a side-effect. */
6665         if (SvUTF8(sv1)) {
6666             if (PL_encoding) {
6667                  svrecode = newSVpvn(pv2, cur2);
6668                  sv_recode_to_utf8(svrecode, PL_encoding);
6669                  pv2 = SvPV_const(svrecode, cur2);
6670             }
6671             else {
6672                  pv2 = tpv = (char*)bytes_to_utf8((const U8*)pv2, &cur2);
6673             }
6674         }
6675         else {
6676             if (PL_encoding) {
6677                  svrecode = newSVpvn(pv1, cur1);
6678                  sv_recode_to_utf8(svrecode, PL_encoding);
6679                  pv1 = SvPV_const(svrecode, cur1);
6680             }
6681             else {
6682                  pv1 = tpv = (char*)bytes_to_utf8((const U8*)pv1, &cur1);
6683             }
6684         }
6685     }
6686
6687     if (!cur1) {
6688         cmp = cur2 ? -1 : 0;
6689     } else if (!cur2) {
6690         cmp = 1;
6691     } else {
6692         const I32 retval = memcmp((const void*)pv1, (const void*)pv2, cur1 < cur2 ? cur1 : cur2);
6693
6694         if (retval) {
6695             cmp = retval < 0 ? -1 : 1;
6696         } else if (cur1 == cur2) {
6697             cmp = 0;
6698         } else {
6699             cmp = cur1 < cur2 ? -1 : 1;
6700         }
6701     }
6702
6703     SvREFCNT_dec(svrecode);
6704     if (tpv)
6705         Safefree(tpv);
6706
6707     return cmp;
6708 }
6709
6710 /*
6711 =for apidoc sv_cmp_locale
6712
6713 Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
6714 'use bytes' aware, handles get magic, and will coerce its args to strings
6715 if necessary.  See also C<sv_cmp>.
6716
6717 =cut
6718 */
6719
6720 I32
6721 Perl_sv_cmp_locale(pTHX_ register SV *const sv1, register SV *const sv2)
6722 {
6723     dVAR;
6724 #ifdef USE_LOCALE_COLLATE
6725
6726     char *pv1, *pv2;
6727     STRLEN len1, len2;
6728     I32 retval;
6729
6730     if (PL_collation_standard)
6731         goto raw_compare;
6732
6733     len1 = 0;
6734     pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
6735     len2 = 0;
6736     pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
6737
6738     if (!pv1 || !len1) {
6739         if (pv2 && len2)
6740             return -1;
6741         else
6742             goto raw_compare;
6743     }
6744     else {
6745         if (!pv2 || !len2)
6746             return 1;
6747     }
6748
6749     retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
6750
6751     if (retval)
6752         return retval < 0 ? -1 : 1;
6753
6754     /*
6755      * When the result of collation is equality, that doesn't mean
6756      * that there are no differences -- some locales exclude some
6757      * characters from consideration.  So to avoid false equalities,
6758      * we use the raw string as a tiebreaker.
6759      */
6760
6761   raw_compare:
6762     /*FALLTHROUGH*/
6763
6764 #endif /* USE_LOCALE_COLLATE */
6765
6766     return sv_cmp(sv1, sv2);
6767 }
6768
6769
6770 #ifdef USE_LOCALE_COLLATE
6771
6772 /*
6773 =for apidoc sv_collxfrm
6774
6775 Add Collate Transform magic to an SV if it doesn't already have it.
6776
6777 Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
6778 scalar data of the variable, but transformed to such a format that a normal
6779 memory comparison can be used to compare the data according to the locale
6780 settings.
6781
6782 =cut
6783 */
6784
6785 char *
6786 Perl_sv_collxfrm(pTHX_ SV *const sv, STRLEN *const nxp)
6787 {
6788     dVAR;
6789     MAGIC *mg;
6790
6791     PERL_ARGS_ASSERT_SV_COLLXFRM;
6792
6793     mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
6794     if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
6795         const char *s;
6796         char *xf;
6797         STRLEN len, xlen;
6798
6799         if (mg)
6800             Safefree(mg->mg_ptr);
6801         s = SvPV_const(sv, len);
6802         if ((xf = mem_collxfrm(s, len, &xlen))) {
6803             if (! mg) {
6804 #ifdef PERL_OLD_COPY_ON_WRITE
6805                 if (SvIsCOW(sv))
6806                     sv_force_normal_flags(sv, 0);
6807 #endif
6808                 mg = sv_magicext(sv, 0, PERL_MAGIC_collxfrm, &PL_vtbl_collxfrm,
6809                                  0, 0);
6810                 assert(mg);
6811             }
6812             mg->mg_ptr = xf;
6813             mg->mg_len = xlen;
6814         }
6815         else {
6816             if (mg) {
6817                 mg->mg_ptr = NULL;
6818                 mg->mg_len = -1;
6819             }
6820         }
6821     }
6822     if (mg && mg->mg_ptr) {
6823         *nxp = mg->mg_len;
6824         return mg->mg_ptr + sizeof(PL_collation_ix);
6825     }
6826     else {
6827         *nxp = 0;
6828         return NULL;
6829     }
6830 }
6831
6832 #endif /* USE_LOCALE_COLLATE */
6833
6834 /*
6835 =for apidoc sv_gets
6836
6837 Get a line from the filehandle and store it into the SV, optionally
6838 appending to the currently-stored string.
6839
6840 =cut
6841 */
6842
6843 char *
6844 Perl_sv_gets(pTHX_ register SV *const sv, register PerlIO *const fp, I32 append)
6845 {
6846     dVAR;
6847     const char *rsptr;
6848     STRLEN rslen;
6849     register STDCHAR rslast;
6850     register STDCHAR *bp;
6851     register I32 cnt;
6852     I32 i = 0;
6853     I32 rspara = 0;
6854
6855     PERL_ARGS_ASSERT_SV_GETS;
6856
6857     if (SvTHINKFIRST(sv))
6858         sv_force_normal_flags(sv, append ? 0 : SV_COW_DROP_PV);
6859     /* XXX. If you make this PVIV, then copy on write can copy scalars read
6860        from <>.
6861        However, perlbench says it's slower, because the existing swipe code
6862        is faster than copy on write.
6863        Swings and roundabouts.  */
6864     SvUPGRADE(sv, SVt_PV);
6865
6866     SvSCREAM_off(sv);
6867
6868     if (append) {
6869         if (PerlIO_isutf8(fp)) {
6870             if (!SvUTF8(sv)) {
6871                 sv_utf8_upgrade_nomg(sv);
6872                 sv_pos_u2b(sv,&append,0);
6873             }
6874         } else if (SvUTF8(sv)) {
6875             SV * const tsv = newSV(0);
6876             sv_gets(tsv, fp, 0);
6877             sv_utf8_upgrade_nomg(tsv);
6878             SvCUR_set(sv,append);
6879             sv_catsv(sv,tsv);
6880             sv_free(tsv);
6881             goto return_string_or_null;
6882         }
6883     }
6884
6885     SvPOK_only(sv);
6886     if (PerlIO_isutf8(fp))
6887         SvUTF8_on(sv);
6888
6889     if (IN_PERL_COMPILETIME) {
6890         /* we always read code in line mode */
6891         rsptr = "\n";
6892         rslen = 1;
6893     }
6894     else if (RsSNARF(PL_rs)) {
6895         /* If it is a regular disk file use size from stat() as estimate
6896            of amount we are going to read -- may result in mallocing
6897            more memory than we really need if the layers below reduce
6898            the size we read (e.g. CRLF or a gzip layer).
6899          */
6900         Stat_t st;
6901         if (!PerlLIO_fstat(PerlIO_fileno(fp), &st) && S_ISREG(st.st_mode))  {
6902             const Off_t offset = PerlIO_tell(fp);
6903             if (offset != (Off_t) -1 && st.st_size + append > offset) {
6904                 (void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 1));
6905             }
6906         }
6907         rsptr = NULL;
6908         rslen = 0;
6909     }
6910     else if (RsRECORD(PL_rs)) {
6911       I32 bytesread;
6912       char *buffer;
6913       U32 recsize;
6914 #ifdef VMS
6915       int fd;
6916 #endif
6917
6918       /* Grab the size of the record we're getting */
6919       recsize = SvUV(SvRV(PL_rs)); /* RsRECORD() guarantees > 0. */
6920       buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append;
6921       /* Go yank in */
6922 #ifdef VMS
6923       /* VMS wants read instead of fread, because fread doesn't respect */
6924       /* RMS record boundaries. This is not necessarily a good thing to be */
6925       /* doing, but we've got no other real choice - except avoid stdio
6926          as implementation - perhaps write a :vms layer ?
6927        */
6928       fd = PerlIO_fileno(fp);
6929       if (fd == -1) { /* in-memory file from PerlIO::Scalar */
6930           bytesread = PerlIO_read(fp, buffer, recsize);
6931       }
6932       else {
6933           bytesread = PerlLIO_read(fd, buffer, recsize);
6934       }
6935 #else
6936       bytesread = PerlIO_read(fp, buffer, recsize);
6937 #endif
6938       if (bytesread < 0)
6939           bytesread = 0;
6940       SvCUR_set(sv, bytesread + append);
6941       buffer[bytesread] = '\0';
6942       goto return_string_or_null;
6943     }
6944     else if (RsPARA(PL_rs)) {
6945         rsptr = "\n\n";
6946         rslen = 2;
6947         rspara = 1;
6948     }
6949     else {
6950         /* Get $/ i.e. PL_rs into same encoding as stream wants */
6951         if (PerlIO_isutf8(fp)) {
6952             rsptr = SvPVutf8(PL_rs, rslen);
6953         }
6954         else {
6955             if (SvUTF8(PL_rs)) {
6956                 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
6957                     Perl_croak(aTHX_ "Wide character in $/");
6958                 }
6959             }
6960             rsptr = SvPV_const(PL_rs, rslen);
6961         }
6962     }
6963
6964     rslast = rslen ? rsptr[rslen - 1] : '\0';
6965
6966     if (rspara) {               /* have to do this both before and after */
6967         do {                    /* to make sure file boundaries work right */
6968             if (PerlIO_eof(fp))
6969                 return 0;
6970             i = PerlIO_getc(fp);
6971             if (i != '\n') {
6972                 if (i == -1)
6973                     return 0;
6974                 PerlIO_ungetc(fp,i);
6975                 break;
6976             }
6977         } while (i != EOF);
6978     }
6979
6980     /* See if we know enough about I/O mechanism to cheat it ! */
6981
6982     /* This used to be #ifdef test - it is made run-time test for ease
6983        of abstracting out stdio interface. One call should be cheap
6984        enough here - and may even be a macro allowing compile
6985        time optimization.
6986      */
6987
6988     if (PerlIO_fast_gets(fp)) {
6989
6990     /*
6991      * We're going to steal some values from the stdio struct
6992      * and put EVERYTHING in the innermost loop into registers.
6993      */
6994     register STDCHAR *ptr;
6995     STRLEN bpx;
6996     I32 shortbuffered;
6997
6998 #if defined(VMS) && defined(PERLIO_IS_STDIO)
6999     /* An ungetc()d char is handled separately from the regular
7000      * buffer, so we getc() it back out and stuff it in the buffer.
7001      */
7002     i = PerlIO_getc(fp);
7003     if (i == EOF) return 0;
7004     *(--((*fp)->_ptr)) = (unsigned char) i;
7005     (*fp)->_cnt++;
7006 #endif
7007
7008     /* Here is some breathtakingly efficient cheating */
7009
7010     cnt = PerlIO_get_cnt(fp);                   /* get count into register */
7011     /* make sure we have the room */
7012     if ((I32)(SvLEN(sv) - append) <= cnt + 1) {
7013         /* Not room for all of it
7014            if we are looking for a separator and room for some
7015          */
7016         if (rslen && cnt > 80 && (I32)SvLEN(sv) > append) {
7017             /* just process what we have room for */
7018             shortbuffered = cnt - SvLEN(sv) + append + 1;
7019             cnt -= shortbuffered;
7020         }
7021         else {
7022             shortbuffered = 0;
7023             /* remember that cnt can be negative */
7024             SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
7025         }
7026     }
7027     else
7028         shortbuffered = 0;
7029     bp = (STDCHAR*)SvPVX_const(sv) + append;  /* move these two too to registers */
7030     ptr = (STDCHAR*)PerlIO_get_ptr(fp);
7031     DEBUG_P(PerlIO_printf(Perl_debug_log,
7032         "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
7033     DEBUG_P(PerlIO_printf(Perl_debug_log,
7034         "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
7035                PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
7036                PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
7037     for (;;) {
7038       screamer:
7039         if (cnt > 0) {
7040             if (rslen) {
7041                 while (cnt > 0) {                    /* this     |  eat */
7042                     cnt--;
7043                     if ((*bp++ = *ptr++) == rslast)  /* really   |  dust */
7044                         goto thats_all_folks;        /* screams  |  sed :-) */
7045                 }
7046             }
7047             else {
7048                 Copy(ptr, bp, cnt, char);            /* this     |  eat */
7049                 bp += cnt;                           /* screams  |  dust */
7050                 ptr += cnt;                          /* louder   |  sed :-) */
7051                 cnt = 0;
7052             }
7053         }
7054         
7055         if (shortbuffered) {            /* oh well, must extend */
7056             cnt = shortbuffered;
7057             shortbuffered = 0;
7058             bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
7059             SvCUR_set(sv, bpx);
7060             SvGROW(sv, SvLEN(sv) + append + cnt + 2);
7061             bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
7062             continue;
7063         }
7064
7065         DEBUG_P(PerlIO_printf(Perl_debug_log,
7066                               "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
7067                               PTR2UV(ptr),(long)cnt));
7068         PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
7069 #if 0
7070         DEBUG_P(PerlIO_printf(Perl_debug_log,
7071             "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
7072             PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
7073             PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
7074 #endif
7075         /* This used to call 'filbuf' in stdio form, but as that behaves like
7076            getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
7077            another abstraction.  */
7078         i   = PerlIO_getc(fp);          /* get more characters */
7079 #if 0
7080         DEBUG_P(PerlIO_printf(Perl_debug_log,
7081             "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
7082             PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
7083             PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
7084 #endif
7085         cnt = PerlIO_get_cnt(fp);
7086         ptr = (STDCHAR*)PerlIO_get_ptr(fp);     /* reregisterize cnt and ptr */
7087         DEBUG_P(PerlIO_printf(Perl_debug_log,
7088             "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
7089
7090         if (i == EOF)                   /* all done for ever? */
7091             goto thats_really_all_folks;
7092
7093         bpx = bp - (STDCHAR*)SvPVX_const(sv);   /* box up before relocation */
7094         SvCUR_set(sv, bpx);
7095         SvGROW(sv, bpx + cnt + 2);
7096         bp = (STDCHAR*)SvPVX_const(sv) + bpx;   /* unbox after relocation */
7097
7098         *bp++ = (STDCHAR)i;             /* store character from PerlIO_getc */
7099
7100         if (rslen && (STDCHAR)i == rslast)  /* all done for now? */
7101             goto thats_all_folks;
7102     }
7103
7104 thats_all_folks:
7105     if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX_const(sv)) < rslen) ||
7106           memNE((char*)bp - rslen, rsptr, rslen))
7107         goto screamer;                          /* go back to the fray */
7108 thats_really_all_folks:
7109     if (shortbuffered)
7110         cnt += shortbuffered;
7111         DEBUG_P(PerlIO_printf(Perl_debug_log,
7112             "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
7113     PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt);  /* put these back or we're in trouble */
7114     DEBUG_P(PerlIO_printf(Perl_debug_log,
7115         "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
7116         PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
7117         PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
7118     *bp = '\0';
7119     SvCUR_set(sv, bp - (STDCHAR*)SvPVX_const(sv));      /* set length */
7120     DEBUG_P(PerlIO_printf(Perl_debug_log,
7121         "Screamer: done, len=%ld, string=|%.*s|\n",
7122         (long)SvCUR(sv),(int)SvCUR(sv),SvPVX_const(sv)));
7123     }
7124    else
7125     {
7126        /*The big, slow, and stupid way. */
7127 #ifdef USE_HEAP_INSTEAD_OF_STACK        /* Even slower way. */
7128         STDCHAR *buf = NULL;
7129         Newx(buf, 8192, STDCHAR);
7130         assert(buf);
7131 #else
7132         STDCHAR buf[8192];
7133 #endif
7134
7135 screamer2:
7136         if (rslen) {
7137             register const STDCHAR * const bpe = buf + sizeof(buf);
7138             bp = buf;
7139             while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
7140                 ; /* keep reading */
7141             cnt = bp - buf;
7142         }
7143         else {
7144             cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
7145             /* Accomodate broken VAXC compiler, which applies U8 cast to
7146              * both args of ?: operator, causing EOF to change into 255
7147              */
7148             if (cnt > 0)
7149                  i = (U8)buf[cnt - 1];
7150             else
7151                  i = EOF;
7152         }
7153
7154         if (cnt < 0)
7155             cnt = 0;  /* we do need to re-set the sv even when cnt <= 0 */
7156         if (append)
7157              sv_catpvn(sv, (char *) buf, cnt);
7158         else
7159              sv_setpvn(sv, (char *) buf, cnt);
7160
7161         if (i != EOF &&                 /* joy */
7162             (!rslen ||
7163              SvCUR(sv) < rslen ||
7164              memNE(SvPVX_const(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
7165         {
7166             append = -1;
7167             /*
7168              * If we're reading from a TTY and we get a short read,
7169              * indicating that the user hit his EOF character, we need
7170              * to notice it now, because if we try to read from the TTY
7171              * again, the EOF condition will disappear.
7172              *
7173              * The comparison of cnt to sizeof(buf) is an optimization
7174              * that prevents unnecessary calls to feof().
7175              *
7176              * - jik 9/25/96
7177              */
7178             if (!(cnt < (I32)sizeof(buf) && PerlIO_eof(fp)))
7179                 goto screamer2;
7180         }
7181
7182 #ifdef USE_HEAP_INSTEAD_OF_STACK
7183         Safefree(buf);
7184 #endif
7185     }
7186
7187     if (rspara) {               /* have to do this both before and after */
7188         while (i != EOF) {      /* to make sure file boundaries work right */
7189             i = PerlIO_getc(fp);
7190             if (i != '\n') {
7191                 PerlIO_ungetc(fp,i);
7192                 break;
7193             }
7194         }
7195     }
7196
7197 return_string_or_null:
7198     return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
7199 }
7200
7201 /*
7202 =for apidoc sv_inc
7203
7204 Auto-increment of the value in the SV, doing string to numeric conversion
7205 if necessary. Handles 'get' magic.
7206
7207 =cut
7208 */
7209
7210 void
7211 Perl_sv_inc(pTHX_ register SV *const sv)
7212 {
7213     dVAR;
7214     register char *d;
7215     int flags;
7216
7217     if (!sv)
7218         return;
7219     SvGETMAGIC(sv);
7220     if (SvTHINKFIRST(sv)) {
7221         if (SvIsCOW(sv))
7222             sv_force_normal_flags(sv, 0);
7223         if (SvREADONLY(sv)) {
7224             if (IN_PERL_RUNTIME)
7225                 Perl_croak(aTHX_ "%s", PL_no_modify);
7226         }
7227         if (SvROK(sv)) {
7228             IV i;
7229             if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
7230                 return;
7231             i = PTR2IV(SvRV(sv));
7232             sv_unref(sv);
7233             sv_setiv(sv, i);
7234         }
7235     }
7236     flags = SvFLAGS(sv);
7237     if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
7238         /* It's (privately or publicly) a float, but not tested as an
7239            integer, so test it to see. */
7240         (void) SvIV(sv);
7241         flags = SvFLAGS(sv);
7242     }
7243     if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
7244         /* It's publicly an integer, or privately an integer-not-float */
7245 #ifdef PERL_PRESERVE_IVUV
7246       oops_its_int:
7247 #endif
7248         if (SvIsUV(sv)) {
7249             if (SvUVX(sv) == UV_MAX)
7250                 sv_setnv(sv, UV_MAX_P1);
7251             else
7252                 (void)SvIOK_only_UV(sv);
7253                 SvUV_set(sv, SvUVX(sv) + 1);
7254         } else {
7255             if (SvIVX(sv) == IV_MAX)
7256                 sv_setuv(sv, (UV)IV_MAX + 1);
7257             else {
7258                 (void)SvIOK_only(sv);
7259                 SvIV_set(sv, SvIVX(sv) + 1);
7260             }   
7261         }
7262         return;
7263     }
7264     if (flags & SVp_NOK) {
7265         const NV was = SvNVX(sv);
7266         if (NV_OVERFLOWS_INTEGERS_AT &&
7267             was >= NV_OVERFLOWS_INTEGERS_AT && ckWARN(WARN_IMPRECISION)) {
7268             Perl_warner(aTHX_ packWARN(WARN_IMPRECISION),
7269                         "Lost precision when incrementing %" NVff " by 1",
7270                         was);
7271         }
7272         (void)SvNOK_only(sv);
7273         SvNV_set(sv, was + 1.0);
7274         return;
7275     }
7276
7277     if (!(flags & SVp_POK) || !*SvPVX_const(sv)) {
7278         if ((flags & SVTYPEMASK) < SVt_PVIV)
7279             sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV ? SVt_PVIV : SVt_IV));
7280         (void)SvIOK_only(sv);
7281         SvIV_set(sv, 1);
7282         return;
7283     }
7284     d = SvPVX(sv);
7285     while (isALPHA(*d)) d++;
7286     while (isDIGIT(*d)) d++;
7287     if (*d) {
7288 #ifdef PERL_PRESERVE_IVUV
7289         /* Got to punt this as an integer if needs be, but we don't issue
7290            warnings. Probably ought to make the sv_iv_please() that does
7291            the conversion if possible, and silently.  */
7292         const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
7293         if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
7294             /* Need to try really hard to see if it's an integer.
7295                9.22337203685478e+18 is an integer.
7296                but "9.22337203685478e+18" + 0 is UV=9223372036854779904
7297                so $a="9.22337203685478e+18"; $a+0; $a++
7298                needs to be the same as $a="9.22337203685478e+18"; $a++
7299                or we go insane. */
7300         
7301             (void) sv_2iv(sv);
7302             if (SvIOK(sv))
7303                 goto oops_its_int;
7304
7305             /* sv_2iv *should* have made this an NV */
7306             if (flags & SVp_NOK) {
7307                 (void)SvNOK_only(sv);
7308                 SvNV_set(sv, SvNVX(sv) + 1.0);
7309                 return;
7310             }
7311             /* I don't think we can get here. Maybe I should assert this
7312                And if we do get here I suspect that sv_setnv will croak. NWC
7313                Fall through. */
7314 #if defined(USE_LONG_DOUBLE)
7315             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",
7316                                   SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
7317 #else
7318             DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_inc punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"NVgf"\n",
7319                                   SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
7320 #endif
7321         }
7322 #endif /* PERL_PRESERVE_IVUV */
7323         sv_setnv(sv,Atof(SvPVX_const(sv)) + 1.0);
7324         return;
7325     }
7326     d--;
7327     while (d >= SvPVX_const(sv)) {
7328         if (isDIGIT(*d)) {
7329             if (++*d <= '9')
7330                 return;
7331             *(d--) = '0';
7332         }
7333         else {
7334 #ifdef EBCDIC
7335             /* MKS: The original code here died if letters weren't consecutive.
7336              * at least it didn't have to worry about non-C locales.  The
7337              * new code assumes that ('z'-'a')==('Z'-'A'), letters are
7338              * arranged in order (although not consecutively) and that only
7339              * [A-Za-z] are accepted by isALPHA in the C locale.
7340              */
7341             if (*d != 'z' && *d != 'Z') {
7342                 do { ++*d; } while (!isALPHA(*d));
7343                 return;
7344             }
7345             *(d--) -= 'z' - 'a';
7346 #else
7347             ++*d;
7348             if (isALPHA(*d))
7349                 return;
7350             *(d--) -= 'z' - 'a' + 1;
7351 #endif
7352         }
7353     }
7354     /* oh,oh, the number grew */
7355     SvGROW(sv, SvCUR(sv) + 2);
7356     SvCUR_set(sv, SvCUR(sv) + 1);
7357     for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX_const(sv); d--)
7358         *d = d[-1];
7359     if (isDIGIT(d[1]))
7360         *d = '1';
7361     else
7362         *d = d[1];
7363 }
7364
7365 /*
7366 =for apidoc sv_dec
7367
7368 Auto-decrement of the value in the SV, doing string to numeric conversion
7369 if necessary. Handles 'get' magic.
7370
7371 =cut
7372 */
7373
7374 void
7375 Perl_sv_dec(pTHX_ register SV *const sv)
7376 {
7377     dVAR;
7378     int flags;
7379
7380     if (!sv)
7381         return;
7382     SvGETMAGIC(sv);
7383     if (SvTHINKFIRST(sv)) {
7384         if (SvIsCOW(sv))
7385             sv_force_normal_flags(sv, 0);
7386         if (SvREADONLY(sv)) {
7387             if (IN_PERL_RUNTIME)
7388                 Perl_croak(aTHX_ "%s", PL_no_modify);
7389         }
7390         if (SvROK(sv)) {
7391             IV i;
7392             if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
7393                 return;
7394             i = PTR2IV(SvRV(sv));
7395             sv_unref(sv);
7396             sv_setiv(sv, i);
7397         }
7398     }
7399     /* Unlike sv_inc we don't have to worry about string-never-numbers
7400        and keeping them magic. But we mustn't warn on punting */
7401     flags = SvFLAGS(sv);
7402     if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
7403         /* It's publicly an integer, or privately an integer-not-float */
7404 #ifdef PERL_PRESERVE_IVUV
7405       oops_its_int:
7406 #endif
7407         if (SvIsUV(sv)) {
7408             if (SvUVX(sv) == 0) {
7409                 (void)SvIOK_only(sv);
7410                 SvIV_set(sv, -1);
7411             }
7412             else {
7413                 (void)SvIOK_only_UV(sv);
7414                 SvUV_set(sv, SvUVX(sv) - 1);
7415             }   
7416         } else {
7417             if (SvIVX(sv) == IV_MIN) {
7418                 sv_setnv(sv, (NV)IV_MIN);
7419                 goto oops_its_num;
7420             }
7421             else {
7422                 (void)SvIOK_only(sv);
7423                 SvIV_set(sv, SvIVX(sv) - 1);
7424             }   
7425         }
7426         return;
7427     }
7428     if (flags & SVp_NOK) {
7429     oops_its_num:
7430         {
7431             const NV was = SvNVX(sv);
7432             if (NV_OVERFLOWS_INTEGERS_AT &&
7433                 was <= -NV_OVERFLOWS_INTEGERS_AT && ckWARN(WARN_IMPRECISION)) {
7434                 Perl_warner(aTHX_ packWARN(WARN_IMPRECISION),
7435                             "Lost precision when decrementing %" NVff " by 1",
7436                             was);
7437             }
7438             (void)SvNOK_only(sv);
7439             SvNV_set(sv, was - 1.0);
7440             return;
7441         }
7442     }
7443     if (!(flags & SVp_POK)) {
7444         if ((flags & SVTYPEMASK) < SVt_PVIV)
7445             sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV) ? SVt_PVIV : SVt_IV);
7446         SvIV_set(sv, -1);
7447         (void)SvIOK_only(sv);
7448         return;
7449     }
7450 #ifdef PERL_PRESERVE_IVUV
7451     {
7452         const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
7453         if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
7454             /* Need to try really hard to see if it's an integer.
7455                9.22337203685478e+18 is an integer.
7456                but "9.22337203685478e+18" + 0 is UV=9223372036854779904
7457                so $a="9.22337203685478e+18"; $a+0; $a--
7458                needs to be the same as $a="9.22337203685478e+18"; $a--
7459                or we go insane. */
7460         
7461             (void) sv_2iv(sv);
7462             if (SvIOK(sv))
7463                 goto oops_its_int;
7464
7465             /* sv_2iv *should* have made this an NV */
7466             if (flags & SVp_NOK) {
7467                 (void)SvNOK_only(sv);
7468                 SvNV_set(sv, SvNVX(sv) - 1.0);
7469                 return;
7470             }
7471             /* I don't think we can get here. Maybe I should assert this
7472                And if we do get here I suspect that sv_setnv will croak. NWC
7473                Fall through. */
7474 #if defined(USE_LONG_DOUBLE)
7475             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",
7476                                   SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
7477 #else
7478             DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_dec punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"NVgf"\n",
7479                                   SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
7480 #endif
7481         }
7482     }
7483 #endif /* PERL_PRESERVE_IVUV */
7484     sv_setnv(sv,Atof(SvPVX_const(sv)) - 1.0);   /* punt */
7485 }
7486
7487 /*
7488 =for apidoc sv_mortalcopy
7489
7490 Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
7491 The new SV is marked as mortal. It will be destroyed "soon", either by an
7492 explicit call to FREETMPS, or by an implicit call at places such as
7493 statement boundaries.  See also C<sv_newmortal> and C<sv_2mortal>.
7494
7495 =cut
7496 */
7497
7498 /* Make a string that will exist for the duration of the expression
7499  * evaluation.  Actually, it may have to last longer than that, but
7500  * hopefully we won't free it until it has been assigned to a
7501  * permanent location. */
7502
7503 SV *
7504 Perl_sv_mortalcopy(pTHX_ SV *const oldstr)
7505 {
7506     dVAR;
7507     register SV *sv;
7508
7509     new_SV(sv);
7510     sv_setsv(sv,oldstr);
7511     EXTEND_MORTAL(1);
7512     PL_tmps_stack[++PL_tmps_ix] = sv;
7513     SvTEMP_on(sv);
7514     return sv;
7515 }
7516
7517 /*
7518 =for apidoc sv_newmortal
7519
7520 Creates a new null SV which is mortal.  The reference count of the SV is
7521 set to 1. It will be destroyed "soon", either by an explicit call to
7522 FREETMPS, or by an implicit call at places such as statement boundaries.
7523 See also C<sv_mortalcopy> and C<sv_2mortal>.
7524
7525 =cut
7526 */
7527
7528 SV *
7529 Perl_sv_newmortal(pTHX)
7530 {
7531     dVAR;
7532     register SV *sv;
7533
7534     new_SV(sv);
7535     SvFLAGS(sv) = SVs_TEMP;
7536     EXTEND_MORTAL(1);
7537     PL_tmps_stack[++PL_tmps_ix] = sv;
7538     return sv;
7539 }
7540
7541
7542 /*
7543 =for apidoc newSVpvn_flags
7544
7545 Creates a new SV and copies a string into it.  The reference count for the
7546 SV is set to 1.  Note that if C<len> is zero, Perl will create a zero length
7547 string.  You are responsible for ensuring that the source string is at least
7548 C<len> bytes long.  If the C<s> argument is NULL the new SV will be undefined.
7549 Currently the only flag bits accepted are C<SVf_UTF8> and C<SVs_TEMP>.
7550 If C<SVs_TEMP> is set, then C<sv2mortal()> is called on the result before
7551 returning. If C<SVf_UTF8> is set, then it will be set on the new SV.
7552 C<newSVpvn_utf8()> is a convenience wrapper for this function, defined as
7553
7554     #define newSVpvn_utf8(s, len, u)                    \
7555         newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0)
7556
7557 =cut
7558 */
7559
7560 SV *
7561 Perl_newSVpvn_flags(pTHX_ const char *const s, const STRLEN len, const U32 flags)
7562 {
7563     dVAR;
7564     register SV *sv;
7565
7566     /* All the flags we don't support must be zero.
7567        And we're new code so I'm going to assert this from the start.  */
7568     assert(!(flags & ~(SVf_UTF8|SVs_TEMP)));
7569     new_SV(sv);
7570     sv_setpvn(sv,s,len);
7571     SvFLAGS(sv) |= (flags & SVf_UTF8);
7572     return (flags & SVs_TEMP) ? sv_2mortal(sv) : sv;
7573 }
7574
7575 /*
7576 =for apidoc sv_2mortal
7577
7578 Marks an existing SV as mortal.  The SV will be destroyed "soon", either
7579 by an explicit call to FREETMPS, or by an implicit call at places such as
7580 statement boundaries.  SvTEMP() is turned on which means that the SV's
7581 string buffer can be "stolen" if this SV is copied. See also C<sv_newmortal>
7582 and C<sv_mortalcopy>.
7583
7584 =cut
7585 */
7586
7587 SV *
7588 Perl_sv_2mortal(pTHX_ register SV *const sv)
7589 {
7590     dVAR;
7591     if (!sv)
7592         return NULL;
7593     if (SvREADONLY(sv) && SvIMMORTAL(sv))
7594         return sv;
7595     EXTEND_MORTAL(1);
7596     PL_tmps_stack[++PL_tmps_ix] = sv;
7597     SvTEMP_on(sv);
7598     return sv;
7599 }
7600
7601 /*
7602 =for apidoc newSVpv
7603
7604 Creates a new SV and copies a string into it.  The reference count for the
7605 SV is set to 1.  If C<len> is zero, Perl will compute the length using
7606 strlen().  For efficiency, consider using C<newSVpvn> instead.
7607
7608 =cut
7609 */
7610
7611 SV *
7612 Perl_newSVpv(pTHX_ const char *const s, const STRLEN len)
7613 {
7614     dVAR;
7615     register SV *sv;
7616
7617     new_SV(sv);
7618     sv_setpvn(sv, s, len || s == NULL ? len : strlen(s));
7619     return sv;
7620 }
7621
7622 /*
7623 =for apidoc newSVpvn
7624
7625 Creates a new SV and copies a string into it.  The reference count for the
7626 SV is set to 1.  Note that if C<len> is zero, Perl will create a zero length
7627 string.  You are responsible for ensuring that the source string is at least
7628 C<len> bytes long.  If the C<s> argument is NULL the new SV will be undefined.
7629
7630 =cut
7631 */
7632
7633 SV *
7634 Perl_newSVpvn(pTHX_ const char *const s, const STRLEN len)
7635 {
7636     dVAR;
7637     register SV *sv;
7638
7639     new_SV(sv);
7640     sv_setpvn(sv,s,len);
7641     return sv;
7642 }
7643
7644 /*
7645 =for apidoc newSVhek
7646
7647 Creates a new SV from the hash key structure.  It will generate scalars that
7648 point to the shared string table where possible. Returns a new (undefined)
7649 SV if the hek is NULL.
7650
7651 =cut
7652 */
7653
7654 SV *
7655 Perl_newSVhek(pTHX_ const HEK *const hek)
7656 {
7657     dVAR;
7658     if (!hek) {
7659         SV *sv;
7660
7661         new_SV(sv);
7662         return sv;
7663     }
7664
7665     if (HEK_LEN(hek) == HEf_SVKEY) {
7666         return newSVsv(*(SV**)HEK_KEY(hek));
7667     } else {
7668         const int flags = HEK_FLAGS(hek);
7669         if (flags & HVhek_WASUTF8) {
7670             /* Trouble :-)
7671                Andreas would like keys he put in as utf8 to come back as utf8
7672             */
7673             STRLEN utf8_len = HEK_LEN(hek);
7674             const U8 *as_utf8 = bytes_to_utf8 ((U8*)HEK_KEY(hek), &utf8_len);
7675             SV * const sv = newSVpvn ((const char*)as_utf8, utf8_len);
7676
7677             SvUTF8_on (sv);
7678             Safefree (as_utf8); /* bytes_to_utf8() allocates a new string */
7679             return sv;
7680         } else if (flags & (HVhek_REHASH|HVhek_UNSHARED)) {
7681             /* We don't have a pointer to the hv, so we have to replicate the
7682                flag into every HEK. This hv is using custom a hasing
7683                algorithm. Hence we can't return a shared string scalar, as
7684                that would contain the (wrong) hash value, and might get passed
7685                into an hv routine with a regular hash.
7686                Similarly, a hash that isn't using shared hash keys has to have
7687                the flag in every key so that we know not to try to call
7688                share_hek_kek on it.  */
7689
7690             SV * const sv = newSVpvn (HEK_KEY(hek), HEK_LEN(hek));
7691             if (HEK_UTF8(hek))
7692                 SvUTF8_on (sv);
7693             return sv;
7694         }
7695         /* This will be overwhelminly the most common case.  */
7696         {
7697             /* Inline most of newSVpvn_share(), because share_hek_hek() is far
7698                more efficient than sharepvn().  */
7699             SV *sv;
7700
7701             new_SV(sv);
7702             sv_upgrade(sv, SVt_PV);
7703             SvPV_set(sv, (char *)HEK_KEY(share_hek_hek(hek)));
7704             SvCUR_set(sv, HEK_LEN(hek));
7705             SvLEN_set(sv, 0);
7706             SvREADONLY_on(sv);
7707             SvFAKE_on(sv);
7708             SvPOK_on(sv);
7709             if (HEK_UTF8(hek))
7710                 SvUTF8_on(sv);
7711             return sv;
7712         }
7713     }
7714 }
7715
7716 /*
7717 =for apidoc newSVpvn_share
7718
7719 Creates a new SV with its SvPVX_const pointing to a shared string in the string
7720 table. If the string does not already exist in the table, it is created
7721 first.  Turns on READONLY and FAKE. If the C<hash> parameter is non-zero, that
7722 value is used; otherwise the hash is computed. The string's hash can be later
7723 be retrieved from the SV with the C<SvSHARED_HASH()> macro. The idea here is
7724 that as the string table is used for shared hash keys these strings will have
7725 SvPVX_const == HeKEY and hash lookup will avoid string compare.
7726
7727 =cut
7728 */
7729
7730 SV *
7731 Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
7732 {
7733     dVAR;
7734     register SV *sv;
7735     bool is_utf8 = FALSE;
7736     const char *const orig_src = src;
7737
7738     if (len < 0) {
7739         STRLEN tmplen = -len;
7740         is_utf8 = TRUE;
7741         /* See the note in hv.c:hv_fetch() --jhi */
7742         src = (char*)bytes_from_utf8((const U8*)src, &tmplen, &is_utf8);
7743         len = tmplen;
7744     }
7745     if (!hash)
7746         PERL_HASH(hash, src, len);
7747     new_SV(sv);
7748     /* The logic for this is inlined in S_mro_get_linear_isa_dfs(), so if it
7749        changes here, update it there too.  */
7750     sv_upgrade(sv, SVt_PV);
7751     SvPV_set(sv, sharepvn(src, is_utf8?-len:len, hash));
7752     SvCUR_set(sv, len);
7753     SvLEN_set(sv, 0);
7754     SvREADONLY_on(sv);
7755     SvFAKE_on(sv);
7756     SvPOK_on(sv);
7757     if (is_utf8)
7758         SvUTF8_on(sv);
7759     if (src != orig_src)
7760         Safefree(src);
7761     return sv;
7762 }
7763
7764
7765 #if defined(PERL_IMPLICIT_CONTEXT)
7766
7767 /* pTHX_ magic can't cope with varargs, so this is a no-context
7768  * version of the main function, (which may itself be aliased to us).
7769  * Don't access this version directly.
7770  */
7771
7772 SV *
7773 Perl_newSVpvf_nocontext(const char *const pat, ...)
7774 {
7775     dTHX;
7776     register SV *sv;
7777     va_list args;
7778
7779     PERL_ARGS_ASSERT_NEWSVPVF_NOCONTEXT;
7780
7781     va_start(args, pat);
7782     sv = vnewSVpvf(pat, &args);
7783     va_end(args);
7784     return sv;
7785 }
7786 #endif
7787
7788 /*
7789 =for apidoc newSVpvf
7790
7791 Creates a new SV and initializes it with the string formatted like
7792 C<sprintf>.
7793
7794 =cut
7795 */
7796
7797 SV *
7798 Perl_newSVpvf(pTHX_ const char *const pat, ...)
7799 {
7800     register SV *sv;
7801     va_list args;
7802
7803     PERL_ARGS_ASSERT_NEWSVPVF;
7804
7805     va_start(args, pat);
7806     sv = vnewSVpvf(pat, &args);
7807     va_end(args);
7808     return sv;
7809 }
7810
7811 /* backend for newSVpvf() and newSVpvf_nocontext() */
7812
7813 SV *
7814 Perl_vnewSVpvf(pTHX_ const char *const pat, va_list *const args)
7815 {
7816     dVAR;
7817     register SV *sv;
7818
7819     PERL_ARGS_ASSERT_VNEWSVPVF;
7820
7821     new_SV(sv);
7822     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
7823     return sv;
7824 }
7825
7826 /*
7827 =for apidoc newSVnv
7828
7829 Creates a new SV and copies a floating point value into it.
7830 The reference count for the SV is set to 1.
7831
7832 =cut
7833 */
7834
7835 SV *
7836 Perl_newSVnv(pTHX_ const NV n)
7837 {
7838     dVAR;
7839     register SV *sv;
7840
7841     new_SV(sv);
7842     sv_setnv(sv,n);
7843     return sv;
7844 }
7845
7846 /*
7847 =for apidoc newSViv
7848
7849 Creates a new SV and copies an integer into it.  The reference count for the
7850 SV is set to 1.
7851
7852 =cut
7853 */
7854
7855 SV *
7856 Perl_newSViv(pTHX_ const IV i)
7857 {
7858     dVAR;
7859     register SV *sv;
7860
7861     new_SV(sv);
7862     sv_setiv(sv,i);
7863     return sv;
7864 }
7865
7866 /*
7867 =for apidoc newSVuv
7868
7869 Creates a new SV and copies an unsigned integer into it.
7870 The reference count for the SV is set to 1.
7871
7872 =cut
7873 */
7874
7875 SV *
7876 Perl_newSVuv(pTHX_ const UV u)
7877 {
7878     dVAR;
7879     register SV *sv;
7880
7881     new_SV(sv);
7882     sv_setuv(sv,u);
7883     return sv;
7884 }
7885
7886 /*
7887 =for apidoc newSV_type
7888
7889 Creates a new SV, of the type specified.  The reference count for the new SV
7890 is set to 1.
7891
7892 =cut
7893 */
7894
7895 SV *
7896 Perl_newSV_type(pTHX_ const svtype type)
7897 {
7898     register SV *sv;
7899
7900     new_SV(sv);
7901     sv_upgrade(sv, type);
7902     return sv;
7903 }
7904
7905 /*
7906 =for apidoc newRV_noinc
7907
7908 Creates an RV wrapper for an SV.  The reference count for the original
7909 SV is B<not> incremented.
7910
7911 =cut
7912 */
7913
7914 SV *
7915 Perl_newRV_noinc(pTHX_ SV *const tmpRef)
7916 {
7917     dVAR;
7918     register SV *sv = newSV_type(SVt_IV);
7919
7920     PERL_ARGS_ASSERT_NEWRV_NOINC;
7921
7922     SvTEMP_off(tmpRef);
7923     SvRV_set(sv, tmpRef);
7924     SvROK_on(sv);
7925     return sv;
7926 }
7927
7928 /* newRV_inc is the official function name to use now.
7929  * newRV_inc is in fact #defined to newRV in sv.h
7930  */
7931
7932 SV *
7933 Perl_newRV(pTHX_ SV *const sv)
7934 {
7935     dVAR;
7936
7937     PERL_ARGS_ASSERT_NEWRV;
7938
7939     return newRV_noinc(SvREFCNT_inc_simple_NN(sv));
7940 }
7941
7942 /*
7943 =for apidoc newSVsv
7944
7945 Creates a new SV which is an exact duplicate of the original SV.
7946 (Uses C<sv_setsv>).
7947
7948 =cut
7949 */
7950
7951 SV *
7952 Perl_newSVsv(pTHX_ register SV *const old)
7953 {
7954     dVAR;
7955     register SV *sv;
7956
7957     if (!old)
7958         return NULL;
7959     if (SvTYPE(old) == SVTYPEMASK) {
7960         if (ckWARN_d(WARN_INTERNAL))
7961             Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
7962         return NULL;
7963     }
7964     new_SV(sv);
7965     /* SV_GMAGIC is the default for sv_setv()
7966        SV_NOSTEAL prevents TEMP buffers being, well, stolen, and saves games
7967        with SvTEMP_off and SvTEMP_on round a call to sv_setsv.  */
7968     sv_setsv_flags(sv, old, SV_GMAGIC | SV_NOSTEAL);
7969     return sv;
7970 }
7971
7972 /*
7973 =for apidoc sv_reset
7974
7975 Underlying implementation for the C<reset> Perl function.
7976 Note that the perl-level function is vaguely deprecated.
7977
7978 =cut
7979 */
7980
7981 void
7982 Perl_sv_reset(pTHX_ register const char *s, HV *const stash)
7983 {
7984     dVAR;
7985     char todo[PERL_UCHAR_MAX+1];
7986
7987     PERL_ARGS_ASSERT_SV_RESET;
7988
7989     if (!stash)
7990         return;
7991
7992     if (!*s) {          /* reset ?? searches */
7993         MAGIC * const mg = mg_find((const SV *)stash, PERL_MAGIC_symtab);
7994         if (mg) {
7995             const U32 count = mg->mg_len / sizeof(PMOP**);
7996             PMOP **pmp = (PMOP**) mg->mg_ptr;
7997             PMOP *const *const end = pmp + count;
7998
7999             while (pmp < end) {
8000 #ifdef USE_ITHREADS
8001                 SvREADONLY_off(PL_regex_pad[(*pmp)->op_pmoffset]);
8002 #else
8003                 (*pmp)->op_pmflags &= ~PMf_USED;
8004 #endif
8005                 ++pmp;
8006             }
8007         }
8008         return;
8009     }
8010
8011     /* reset variables */
8012
8013     if (!HvARRAY(stash))
8014         return;
8015
8016     Zero(todo, 256, char);
8017     while (*s) {
8018         I32 max;
8019         I32 i = (unsigned char)*s;
8020         if (s[1] == '-') {
8021             s += 2;
8022         }
8023         max = (unsigned char)*s++;
8024         for ( ; i <= max; i++) {
8025             todo[i] = 1;
8026         }
8027         for (i = 0; i <= (I32) HvMAX(stash); i++) {
8028             HE *entry;
8029             for (entry = HvARRAY(stash)[i];
8030                  entry;
8031                  entry = HeNEXT(entry))
8032             {
8033                 register GV *gv;
8034                 register SV *sv;
8035
8036                 if (!todo[(U8)*HeKEY(entry)])
8037                     continue;
8038                 gv = MUTABLE_GV(HeVAL(entry));
8039                 sv = GvSV(gv);
8040                 if (sv) {
8041                     if (SvTHINKFIRST(sv)) {
8042                         if (!SvREADONLY(sv) && SvROK(sv))
8043                             sv_unref(sv);
8044                         /* XXX Is this continue a bug? Why should THINKFIRST
8045                            exempt us from resetting arrays and hashes?  */
8046                         continue;
8047                     }
8048                     SvOK_off(sv);
8049                     if (SvTYPE(sv) >= SVt_PV) {
8050                         SvCUR_set(sv, 0);
8051                         if (SvPVX_const(sv) != NULL)
8052                             *SvPVX(sv) = '\0';
8053                         SvTAINT(sv);
8054                     }
8055                 }
8056                 if (GvAV(gv)) {
8057                     av_clear(GvAV(gv));
8058                 }
8059                 if (GvHV(gv) && !HvNAME_get(GvHV(gv))) {
8060 #if defined(VMS)
8061                     Perl_die(aTHX_ "Can't reset %%ENV on this system");
8062 #else /* ! VMS */
8063                     hv_clear(GvHV(gv));
8064 #  if defined(USE_ENVIRON_ARRAY)
8065                     if (gv == PL_envgv)
8066                         my_clearenv();
8067 #  endif /* USE_ENVIRON_ARRAY */
8068 #endif /* VMS */
8069                 }
8070             }
8071         }
8072     }
8073 }
8074
8075 /*
8076 =for apidoc sv_2io
8077
8078 Using various gambits, try to get an IO from an SV: the IO slot if its a
8079 GV; or the recursive result if we're an RV; or the IO slot of the symbol
8080 named after the PV if we're a string.
8081
8082 =cut
8083 */
8084
8085 IO*
8086 Perl_sv_2io(pTHX_ SV *const sv)
8087 {
8088     IO* io;
8089     GV* gv;
8090
8091     PERL_ARGS_ASSERT_SV_2IO;
8092
8093     switch (SvTYPE(sv)) {
8094     case SVt_PVIO:
8095         io = MUTABLE_IO(sv);
8096         break;
8097     case SVt_PVGV:
8098         if (isGV_with_GP(sv)) {
8099             gv = MUTABLE_GV(sv);
8100             io = GvIO(gv);
8101             if (!io)
8102                 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
8103             break;
8104         }
8105         /* FALL THROUGH */
8106     default:
8107         if (!SvOK(sv))
8108             Perl_croak(aTHX_ PL_no_usym, "filehandle");
8109         if (SvROK(sv))
8110             return sv_2io(SvRV(sv));
8111         gv = gv_fetchsv(sv, 0, SVt_PVIO);
8112         if (gv)
8113             io = GvIO(gv);
8114         else
8115             io = 0;
8116         if (!io)
8117             Perl_croak(aTHX_ "Bad filehandle: %"SVf, SVfARG(sv));
8118         break;
8119     }
8120     return io;
8121 }
8122
8123 /*
8124 =for apidoc sv_2cv
8125
8126 Using various gambits, try to get a CV from an SV; in addition, try if
8127 possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
8128 The flags in C<lref> are passed to sv_fetchsv.
8129
8130 =cut
8131 */
8132
8133 CV *
8134 Perl_sv_2cv(pTHX_ SV *sv, HV **const st, GV **const gvp, const I32 lref)
8135 {
8136     dVAR;
8137     GV *gv = NULL;
8138     CV *cv = NULL;
8139
8140     PERL_ARGS_ASSERT_SV_2CV;
8141
8142     if (!sv) {
8143         *st = NULL;
8144         *gvp = NULL;
8145         return NULL;
8146     }
8147     switch (SvTYPE(sv)) {
8148     case SVt_PVCV:
8149         *st = CvSTASH(sv);
8150         *gvp = NULL;
8151         return MUTABLE_CV(sv);
8152     case SVt_PVHV:
8153     case SVt_PVAV:
8154         *st = NULL;
8155         *gvp = NULL;
8156         return NULL;
8157     case SVt_PVGV:
8158         if (isGV_with_GP(sv)) {
8159             gv = MUTABLE_GV(sv);
8160             *gvp = gv;
8161             *st = GvESTASH(gv);
8162             goto fix_gv;
8163         }
8164         /* FALL THROUGH */
8165
8166     default:
8167         if (SvROK(sv)) {
8168             SV * const *sp = &sv;       /* Used in tryAMAGICunDEREF macro. */
8169             SvGETMAGIC(sv);
8170             tryAMAGICunDEREF(to_cv);
8171
8172             sv = SvRV(sv);
8173             if (SvTYPE(sv) == SVt_PVCV) {
8174                 cv = MUTABLE_CV(sv);
8175                 *gvp = NULL;
8176                 *st = CvSTASH(cv);
8177                 return cv;
8178             }
8179             else if(isGV_with_GP(sv))
8180                 gv = MUTABLE_GV(sv);
8181             else
8182                 Perl_croak(aTHX_ "Not a subroutine reference");
8183         }
8184         else if (isGV_with_GP(sv)) {
8185             SvGETMAGIC(sv);
8186             gv = MUTABLE_GV(sv);
8187         }
8188         else
8189             gv = gv_fetchsv(sv, lref, SVt_PVCV); /* Calls get magic */
8190         *gvp = gv;
8191         if (!gv) {
8192             *st = NULL;
8193             return NULL;
8194         }
8195         /* Some flags to gv_fetchsv mean don't really create the GV  */
8196         if (!isGV_with_GP(gv)) {
8197             *st = NULL;
8198             return NULL;
8199         }
8200         *st = GvESTASH(gv);
8201     fix_gv:
8202         if (lref && !GvCVu(gv)) {
8203             SV *tmpsv;
8204             ENTER;
8205             tmpsv = newSV(0);
8206             gv_efullname3(tmpsv, gv, NULL);
8207             /* XXX this is probably not what they think they're getting.
8208              * It has the same effect as "sub name;", i.e. just a forward
8209              * declaration! */
8210             newSUB(start_subparse(FALSE, 0),
8211                    newSVOP(OP_CONST, 0, tmpsv),
8212                    NULL, NULL);
8213             LEAVE;
8214             if (!GvCVu(gv))
8215                 Perl_croak(aTHX_ "Unable to create sub named \"%"SVf"\"",
8216                            SVfARG(SvOK(sv) ? sv : &PL_sv_no));
8217         }
8218         return GvCVu(gv);
8219     }
8220 }
8221
8222 /*
8223 =for apidoc sv_true
8224
8225 Returns true if the SV has a true value by Perl's rules.
8226 Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
8227 instead use an in-line version.
8228
8229 =cut
8230 */
8231
8232 I32
8233 Perl_sv_true(pTHX_ register SV *const sv)
8234 {
8235     if (!sv)
8236         return 0;
8237     if (SvPOK(sv)) {
8238         register const XPV* const tXpv = (XPV*)SvANY(sv);
8239         if (tXpv &&
8240                 (tXpv->xpv_cur > 1 ||
8241                 (tXpv->xpv_cur && *sv->sv_u.svu_pv != '0')))
8242             return 1;
8243         else
8244             return 0;
8245     }
8246     else {
8247         if (SvIOK(sv))
8248             return SvIVX(sv) != 0;
8249         else {
8250             if (SvNOK(sv))
8251                 return SvNVX(sv) != 0.0;
8252             else
8253                 return sv_2bool(sv);
8254         }
8255     }
8256 }
8257
8258 /*
8259 =for apidoc sv_pvn_force
8260
8261 Get a sensible string out of the SV somehow.
8262 A private implementation of the C<SvPV_force> macro for compilers which
8263 can't cope with complex macro expressions. Always use the macro instead.
8264
8265 =for apidoc sv_pvn_force_flags
8266
8267 Get a sensible string out of the SV somehow.
8268 If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
8269 appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
8270 implemented in terms of this function.
8271 You normally want to use the various wrapper macros instead: see
8272 C<SvPV_force> and C<SvPV_force_nomg>
8273
8274 =cut
8275 */
8276
8277 char *
8278 Perl_sv_pvn_force_flags(pTHX_ SV *const sv, STRLEN *const lp, const I32 flags)
8279 {
8280     dVAR;
8281
8282     PERL_ARGS_ASSERT_SV_PVN_FORCE_FLAGS;
8283
8284     if (SvTHINKFIRST(sv) && !SvROK(sv))
8285         sv_force_normal_flags(sv, 0);
8286
8287     if (SvPOK(sv)) {
8288         if (lp)
8289             *lp = SvCUR(sv);
8290     }
8291     else {
8292         char *s;
8293         STRLEN len;
8294  
8295         if (SvREADONLY(sv) && !(flags & SV_MUTABLE_RETURN)) {
8296             const char * const ref = sv_reftype(sv,0);
8297             if (PL_op)
8298                 Perl_croak(aTHX_ "Can't coerce readonly %s to string in %s",
8299                            ref, OP_NAME(PL_op));
8300             else
8301                 Perl_croak(aTHX_ "Can't coerce readonly %s to string", ref);
8302         }
8303         if ((SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM)
8304             || isGV_with_GP(sv))
8305             Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
8306                 OP_NAME(PL_op));
8307         s = sv_2pv_flags(sv, &len, flags);
8308         if (lp)
8309             *lp = len;
8310
8311         if (s != SvPVX_const(sv)) {     /* Almost, but not quite, sv_setpvn() */
8312             if (SvROK(sv))
8313                 sv_unref(sv);
8314             SvUPGRADE(sv, SVt_PV);              /* Never FALSE */
8315             SvGROW(sv, len + 1);
8316             Move(s,SvPVX(sv),len,char);
8317             SvCUR_set(sv, len);
8318             SvPVX(sv)[len] = '\0';
8319         }
8320         if (!SvPOK(sv)) {
8321             SvPOK_on(sv);               /* validate pointer */
8322             SvTAINT(sv);
8323             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
8324                                   PTR2UV(sv),SvPVX_const(sv)));
8325         }
8326     }
8327     return SvPVX_mutable(sv);
8328 }
8329
8330 /*
8331 =for apidoc sv_pvbyten_force
8332
8333 The backend for the C<SvPVbytex_force> macro. Always use the macro instead.
8334
8335 =cut
8336 */
8337
8338 char *
8339 Perl_sv_pvbyten_force(pTHX_ SV *const sv, STRLEN *const lp)
8340 {
8341     PERL_ARGS_ASSERT_SV_PVBYTEN_FORCE;
8342
8343     sv_pvn_force(sv,lp);
8344     sv_utf8_downgrade(sv,0);
8345     *lp = SvCUR(sv);
8346     return SvPVX(sv);
8347 }
8348
8349 /*
8350 =for apidoc sv_pvutf8n_force
8351
8352 The backend for the C<SvPVutf8x_force> macro. Always use the macro instead.
8353
8354 =cut
8355 */
8356
8357 char *
8358 Perl_sv_pvutf8n_force(pTHX_ SV *const sv, STRLEN *const lp)
8359 {
8360     PERL_ARGS_ASSERT_SV_PVUTF8N_FORCE;
8361
8362     sv_pvn_force(sv,lp);
8363     sv_utf8_upgrade(sv);
8364     *lp = SvCUR(sv);
8365     return SvPVX(sv);
8366 }
8367
8368 /*
8369 =for apidoc sv_reftype
8370
8371 Returns a string describing what the SV is a reference to.
8372
8373 =cut
8374 */
8375
8376 const char *
8377 Perl_sv_reftype(pTHX_ const SV *const sv, const int ob)
8378 {
8379     PERL_ARGS_ASSERT_SV_REFTYPE;
8380
8381     /* The fact that I don't need to downcast to char * everywhere, only in ?:
8382        inside return suggests a const propagation bug in g++.  */
8383     if (ob && SvOBJECT(sv)) {
8384         char * const name = HvNAME_get(SvSTASH(sv));
8385         return name ? name : (char *) "__ANON__";
8386     }
8387     else {
8388         switch (SvTYPE(sv)) {
8389         case SVt_NULL:
8390         case SVt_IV:
8391         case SVt_NV:
8392         case SVt_PV:
8393         case SVt_PVIV:
8394         case SVt_PVNV:
8395         case SVt_PVMG:
8396                                 if (SvVOK(sv))
8397                                     return "VSTRING";
8398                                 if (SvROK(sv))
8399                                     return "REF";
8400                                 else
8401                                     return "SCALAR";
8402
8403         case SVt_PVLV:          return (char *)  (SvROK(sv) ? "REF"
8404                                 /* tied lvalues should appear to be
8405                                  * scalars for backwards compatitbility */
8406                                 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
8407                                     ? "SCALAR" : "LVALUE");
8408         case SVt_PVAV:          return "ARRAY";
8409         case SVt_PVHV:          return "HASH";
8410         case SVt_PVCV:          return "CODE";
8411         case SVt_PVGV:          return (char *) (isGV_with_GP(sv)
8412                                     ? "GLOB" : "SCALAR");
8413         case SVt_PVFM:          return "FORMAT";
8414         case SVt_PVIO:          return "IO";
8415         case SVt_BIND:          return "BIND";
8416         case SVt_REGEXP:        return "REGEXP"; 
8417         default:                return "UNKNOWN";
8418         }
8419     }
8420 }
8421
8422 /*
8423 =for apidoc sv_isobject
8424
8425 Returns a boolean indicating whether the SV is an RV pointing to a blessed
8426 object.  If the SV is not an RV, or if the object is not blessed, then this
8427 will return false.
8428
8429 =cut
8430 */
8431
8432 int
8433 Perl_sv_isobject(pTHX_ SV *sv)
8434 {
8435     if (!sv)
8436         return 0;
8437     SvGETMAGIC(sv);
8438     if (!SvROK(sv))
8439         return 0;
8440     sv = SvRV(sv);
8441     if (!SvOBJECT(sv))
8442         return 0;
8443     return 1;
8444 }
8445
8446 /*
8447 =for apidoc sv_isa
8448
8449 Returns a boolean indicating whether the SV is blessed into the specified
8450 class.  This does not check for subtypes; use C<sv_derived_from> to verify
8451 an inheritance relationship.
8452
8453 =cut
8454 */
8455
8456 int
8457 Perl_sv_isa(pTHX_ SV *sv, const char *const name)
8458 {
8459     const char *hvname;
8460
8461     PERL_ARGS_ASSERT_SV_ISA;
8462
8463     if (!sv)
8464         return 0;
8465     SvGETMAGIC(sv);
8466     if (!SvROK(sv))
8467         return 0;
8468     sv = SvRV(sv);
8469     if (!SvOBJECT(sv))
8470         return 0;
8471     hvname = HvNAME_get(SvSTASH(sv));
8472     if (!hvname)
8473         return 0;
8474
8475     return strEQ(hvname, name);
8476 }
8477
8478 /*
8479 =for apidoc newSVrv
8480
8481 Creates a new SV for the RV, C<rv>, to point to.  If C<rv> is not an RV then
8482 it will be upgraded to one.  If C<classname> is non-null then the new SV will
8483 be blessed in the specified package.  The new SV is returned and its
8484 reference count is 1.
8485
8486 =cut
8487 */
8488
8489 SV*
8490 Perl_newSVrv(pTHX_ SV *const rv, const char *const classname)
8491 {
8492     dVAR;
8493     SV *sv;
8494
8495     PERL_ARGS_ASSERT_NEWSVRV;
8496
8497     new_SV(sv);
8498
8499     SV_CHECK_THINKFIRST_COW_DROP(rv);
8500     (void)SvAMAGIC_off(rv);
8501
8502     if (SvTYPE(rv) >= SVt_PVMG) {
8503         const U32 refcnt = SvREFCNT(rv);
8504         SvREFCNT(rv) = 0;
8505         sv_clear(rv);
8506         SvFLAGS(rv) = 0;
8507         SvREFCNT(rv) = refcnt;
8508
8509         sv_upgrade(rv, SVt_IV);
8510     } else if (SvROK(rv)) {
8511         SvREFCNT_dec(SvRV(rv));
8512     } else {
8513         prepare_SV_for_RV(rv);
8514     }
8515
8516     SvOK_off(rv);
8517     SvRV_set(rv, sv);
8518     SvROK_on(rv);
8519
8520     if (classname) {
8521         HV* const stash = gv_stashpv(classname, GV_ADD);
8522         (void)sv_bless(rv, stash);
8523     }
8524     return sv;
8525 }
8526
8527 /*
8528 =for apidoc sv_setref_pv
8529
8530 Copies a pointer into a new SV, optionally blessing the SV.  The C<rv>
8531 argument will be upgraded to an RV.  That RV will be modified to point to
8532 the new SV.  If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
8533 into the SV.  The C<classname> argument indicates the package for the
8534 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
8535 will have a reference count of 1, and the RV will be returned.
8536
8537 Do not use with other Perl types such as HV, AV, SV, CV, because those
8538 objects will become corrupted by the pointer copy process.
8539
8540 Note that C<sv_setref_pvn> copies the string while this copies the pointer.
8541
8542 =cut
8543 */
8544
8545 SV*
8546 Perl_sv_setref_pv(pTHX_ SV *const rv, const char *const classname, void *const pv)
8547 {
8548     dVAR;
8549
8550     PERL_ARGS_ASSERT_SV_SETREF_PV;
8551
8552     if (!pv) {
8553         sv_setsv(rv, &PL_sv_undef);
8554         SvSETMAGIC(rv);
8555     }
8556     else
8557         sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
8558     return rv;
8559 }
8560
8561 /*
8562 =for apidoc sv_setref_iv
8563
8564 Copies an integer into a new SV, optionally blessing the SV.  The C<rv>
8565 argument will be upgraded to an RV.  That RV will be modified to point to
8566 the new SV.  The C<classname> argument indicates the package for the
8567 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
8568 will have a reference count of 1, and the RV will be returned.
8569
8570 =cut
8571 */
8572
8573 SV*
8574 Perl_sv_setref_iv(pTHX_ SV *const rv, const char *const classname, const IV iv)
8575 {
8576     PERL_ARGS_ASSERT_SV_SETREF_IV;
8577
8578     sv_setiv(newSVrv(rv,classname), iv);
8579     return rv;
8580 }
8581
8582 /*
8583 =for apidoc sv_setref_uv
8584
8585 Copies an unsigned integer into a new SV, optionally blessing the SV.  The C<rv>
8586 argument will be upgraded to an RV.  That RV will be modified to point to
8587 the new SV.  The C<classname> argument indicates the package for the
8588 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
8589 will have a reference count of 1, and the RV will be returned.
8590
8591 =cut
8592 */
8593
8594 SV*
8595 Perl_sv_setref_uv(pTHX_ SV *const rv, const char *const classname, const UV uv)
8596 {
8597     PERL_ARGS_ASSERT_SV_SETREF_UV;
8598
8599     sv_setuv(newSVrv(rv,classname), uv);
8600     return rv;
8601 }
8602
8603 /*
8604 =for apidoc sv_setref_nv
8605
8606 Copies a double into a new SV, optionally blessing the SV.  The C<rv>
8607 argument will be upgraded to an RV.  That RV will be modified to point to
8608 the new SV.  The C<classname> argument indicates the package for the
8609 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
8610 will have a reference count of 1, and the RV will be returned.
8611
8612 =cut
8613 */
8614
8615 SV*
8616 Perl_sv_setref_nv(pTHX_ SV *const rv, const char *const classname, const NV nv)
8617 {
8618     PERL_ARGS_ASSERT_SV_SETREF_NV;
8619
8620     sv_setnv(newSVrv(rv,classname), nv);
8621     return rv;
8622 }
8623
8624 /*
8625 =for apidoc sv_setref_pvn
8626
8627 Copies a string into a new SV, optionally blessing the SV.  The length of the
8628 string must be specified with C<n>.  The C<rv> argument will be upgraded to
8629 an RV.  That RV will be modified to point to the new SV.  The C<classname>
8630 argument indicates the package for the blessing.  Set C<classname> to
8631 C<NULL> to avoid the blessing.  The new SV will have a reference count
8632 of 1, and the RV will be returned.
8633
8634 Note that C<sv_setref_pv> copies the pointer while this copies the string.
8635
8636 =cut
8637 */
8638
8639 SV*
8640 Perl_sv_setref_pvn(pTHX_ SV *const rv, const char *const classname,
8641                    const char *const pv, const STRLEN n)
8642 {
8643     PERL_ARGS_ASSERT_SV_SETREF_PVN;
8644
8645     sv_setpvn(newSVrv(rv,classname), pv, n);
8646     return rv;
8647 }
8648
8649 /*
8650 =for apidoc sv_bless
8651
8652 Blesses an SV into a specified package.  The SV must be an RV.  The package
8653 must be designated by its stash (see C<gv_stashpv()>).  The reference count
8654 of the SV is unaffected.
8655
8656 =cut
8657 */
8658
8659 SV*
8660 Perl_sv_bless(pTHX_ SV *const sv, HV *const stash)
8661 {
8662     dVAR;
8663     SV *tmpRef;
8664
8665     PERL_ARGS_ASSERT_SV_BLESS;
8666
8667     if (!SvROK(sv))
8668         Perl_croak(aTHX_ "Can't bless non-reference value");
8669     tmpRef = SvRV(sv);
8670     if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
8671         if (SvIsCOW(tmpRef))
8672             sv_force_normal_flags(tmpRef, 0);
8673         if (SvREADONLY(tmpRef))
8674             Perl_croak(aTHX_ "%s", PL_no_modify);
8675         if (SvOBJECT(tmpRef)) {
8676             if (SvTYPE(tmpRef) != SVt_PVIO)
8677                 --PL_sv_objcount;
8678             SvREFCNT_dec(SvSTASH(tmpRef));
8679         }
8680     }
8681     SvOBJECT_on(tmpRef);
8682     if (SvTYPE(tmpRef) != SVt_PVIO)
8683         ++PL_sv_objcount;
8684     SvUPGRADE(tmpRef, SVt_PVMG);
8685     SvSTASH_set(tmpRef, MUTABLE_HV(SvREFCNT_inc_simple(stash)));
8686
8687     if (Gv_AMG(stash))
8688         SvAMAGIC_on(sv);
8689     else
8690         (void)SvAMAGIC_off(sv);
8691
8692     if(SvSMAGICAL(tmpRef))
8693         if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
8694             mg_set(tmpRef);
8695
8696
8697
8698     return sv;
8699 }
8700
8701 /* Downgrades a PVGV to a PVMG.
8702  */
8703
8704 STATIC void
8705 S_sv_unglob(pTHX_ SV *const sv)
8706 {
8707     dVAR;
8708     void *xpvmg;
8709     HV *stash;
8710     SV * const temp = sv_newmortal();
8711
8712     PERL_ARGS_ASSERT_SV_UNGLOB;
8713
8714     assert(SvTYPE(sv) == SVt_PVGV);
8715     SvFAKE_off(sv);
8716     gv_efullname3(temp, MUTABLE_GV(sv), "*");
8717
8718     if (GvGP(sv)) {
8719         if(GvCVu((const GV *)sv) && (stash = GvSTASH(MUTABLE_GV(sv)))
8720            && HvNAME_get(stash))
8721             mro_method_changed_in(stash);
8722         gp_free(MUTABLE_GV(sv));
8723     }
8724     if (GvSTASH(sv)) {
8725         sv_del_backref(MUTABLE_SV(GvSTASH(sv)), sv);
8726         GvSTASH(sv) = NULL;
8727     }
8728     GvMULTI_off(sv);
8729     if (GvNAME_HEK(sv)) {
8730         unshare_hek(GvNAME_HEK(sv));
8731     }
8732     isGV_with_GP_off(sv);
8733
8734     /* need to keep SvANY(sv) in the right arena */
8735     xpvmg = new_XPVMG();
8736     StructCopy(SvANY(sv), xpvmg, XPVMG);
8737     del_XPVGV(SvANY(sv));
8738     SvANY(sv) = xpvmg;
8739
8740     SvFLAGS(sv) &= ~SVTYPEMASK;
8741     SvFLAGS(sv) |= SVt_PVMG;
8742
8743     /* Intentionally not calling any local SET magic, as this isn't so much a
8744        set operation as merely an internal storage change.  */
8745     sv_setsv_flags(sv, temp, 0);
8746 }
8747
8748 /*
8749 =for apidoc sv_unref_flags
8750
8751 Unsets the RV status of the SV, and decrements the reference count of
8752 whatever was being referenced by the RV.  This can almost be thought of
8753 as a reversal of C<newSVrv>.  The C<cflags> argument can contain
8754 C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
8755 (otherwise the decrementing is conditional on the reference count being
8756 different from one or the reference being a readonly SV).
8757 See C<SvROK_off>.
8758
8759 =cut
8760 */
8761
8762 void
8763 Perl_sv_unref_flags(pTHX_ SV *const ref, const U32 flags)
8764 {
8765     SV* const target = SvRV(ref);
8766
8767     PERL_ARGS_ASSERT_SV_UNREF_FLAGS;
8768
8769     if (SvWEAKREF(ref)) {
8770         sv_del_backref(target, ref);
8771         SvWEAKREF_off(ref);
8772         SvRV_set(ref, NULL);
8773         return;
8774     }
8775     SvRV_set(ref, NULL);
8776     SvROK_off(ref);
8777     /* You can't have a || SvREADONLY(target) here, as $a = $$a, where $a was
8778        assigned to as BEGIN {$a = \"Foo"} will fail.  */
8779     if (SvREFCNT(target) != 1 || (flags & SV_IMMEDIATE_UNREF))
8780         SvREFCNT_dec(target);
8781     else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
8782         sv_2mortal(target);     /* Schedule for freeing later */
8783 }
8784
8785 /*
8786 =for apidoc sv_untaint
8787
8788 Untaint an SV. Use C<SvTAINTED_off> instead.
8789 =cut
8790 */
8791
8792 void
8793 Perl_sv_untaint(pTHX_ SV *const sv)
8794 {
8795     PERL_ARGS_ASSERT_SV_UNTAINT;
8796
8797     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
8798         MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
8799         if (mg)
8800             mg->mg_len &= ~1;
8801     }
8802 }
8803
8804 /*
8805 =for apidoc sv_tainted
8806
8807 Test an SV for taintedness. Use C<SvTAINTED> instead.
8808 =cut
8809 */
8810
8811 bool
8812 Perl_sv_tainted(pTHX_ SV *const sv)
8813 {
8814     PERL_ARGS_ASSERT_SV_TAINTED;
8815
8816     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
8817         const MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
8818         if (mg && (mg->mg_len & 1) )
8819             return TRUE;
8820     }
8821     return FALSE;
8822 }
8823
8824 /*
8825 =for apidoc sv_setpviv
8826
8827 Copies an integer into the given SV, also updating its string value.
8828 Does not handle 'set' magic.  See C<sv_setpviv_mg>.
8829
8830 =cut
8831 */
8832
8833 void
8834 Perl_sv_setpviv(pTHX_ SV *const sv, const IV iv)
8835 {
8836     char buf[TYPE_CHARS(UV)];
8837     char *ebuf;
8838     char * const ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
8839
8840     PERL_ARGS_ASSERT_SV_SETPVIV;
8841
8842     sv_setpvn(sv, ptr, ebuf - ptr);
8843 }
8844
8845 /*
8846 =for apidoc sv_setpviv_mg
8847
8848 Like C<sv_setpviv>, but also handles 'set' magic.
8849
8850 =cut
8851 */
8852
8853 void
8854 Perl_sv_setpviv_mg(pTHX_ SV *const sv, const IV iv)
8855 {
8856     PERL_ARGS_ASSERT_SV_SETPVIV_MG;
8857
8858     sv_setpviv(sv, iv);
8859     SvSETMAGIC(sv);
8860 }
8861
8862 #if defined(PERL_IMPLICIT_CONTEXT)
8863
8864 /* pTHX_ magic can't cope with varargs, so this is a no-context
8865  * version of the main function, (which may itself be aliased to us).
8866  * Don't access this version directly.
8867  */
8868
8869 void
8870 Perl_sv_setpvf_nocontext(SV *const sv, const char *const pat, ...)
8871 {
8872     dTHX;
8873     va_list args;
8874
8875     PERL_ARGS_ASSERT_SV_SETPVF_NOCONTEXT;
8876
8877     va_start(args, pat);
8878     sv_vsetpvf(sv, pat, &args);
8879     va_end(args);
8880 }
8881
8882 /* pTHX_ magic can't cope with varargs, so this is a no-context
8883  * version of the main function, (which may itself be aliased to us).
8884  * Don't access this version directly.
8885  */
8886
8887 void
8888 Perl_sv_setpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
8889 {
8890     dTHX;
8891     va_list args;
8892
8893     PERL_ARGS_ASSERT_SV_SETPVF_MG_NOCONTEXT;
8894
8895     va_start(args, pat);
8896     sv_vsetpvf_mg(sv, pat, &args);
8897     va_end(args);
8898 }
8899 #endif
8900
8901 /*
8902 =for apidoc sv_setpvf
8903
8904 Works like C<sv_catpvf> but copies the text into the SV instead of
8905 appending it.  Does not handle 'set' magic.  See C<sv_setpvf_mg>.
8906
8907 =cut
8908 */
8909
8910 void
8911 Perl_sv_setpvf(pTHX_ SV *const sv, const char *const pat, ...)
8912 {
8913     va_list args;
8914
8915     PERL_ARGS_ASSERT_SV_SETPVF;
8916
8917     va_start(args, pat);
8918     sv_vsetpvf(sv, pat, &args);
8919     va_end(args);
8920 }
8921
8922 /*
8923 =for apidoc sv_vsetpvf
8924
8925 Works like C<sv_vcatpvf> but copies the text into the SV instead of
8926 appending it.  Does not handle 'set' magic.  See C<sv_vsetpvf_mg>.
8927
8928 Usually used via its frontend C<sv_setpvf>.
8929
8930 =cut
8931 */
8932
8933 void
8934 Perl_sv_vsetpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args)
8935 {
8936     PERL_ARGS_ASSERT_SV_VSETPVF;
8937
8938     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
8939 }
8940
8941 /*
8942 =for apidoc sv_setpvf_mg
8943
8944 Like C<sv_setpvf>, but also handles 'set' magic.
8945
8946 =cut
8947 */
8948
8949 void
8950 Perl_sv_setpvf_mg(pTHX_ SV *const sv, const char *const pat, ...)
8951 {
8952     va_list args;
8953
8954     PERL_ARGS_ASSERT_SV_SETPVF_MG;
8955
8956     va_start(args, pat);
8957     sv_vsetpvf_mg(sv, pat, &args);
8958     va_end(args);
8959 }
8960
8961 /*
8962 =for apidoc sv_vsetpvf_mg
8963
8964 Like C<sv_vsetpvf>, but also handles 'set' magic.
8965
8966 Usually used via its frontend C<sv_setpvf_mg>.
8967
8968 =cut
8969 */
8970
8971 void
8972 Perl_sv_vsetpvf_mg(pTHX_ SV *const sv, const char *const pat, va_list *const args)
8973 {
8974     PERL_ARGS_ASSERT_SV_VSETPVF_MG;
8975
8976     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
8977     SvSETMAGIC(sv);
8978 }
8979
8980 #if defined(PERL_IMPLICIT_CONTEXT)
8981
8982 /* pTHX_ magic can't cope with varargs, so this is a no-context
8983  * version of the main function, (which may itself be aliased to us).
8984  * Don't access this version directly.
8985  */
8986
8987 void
8988 Perl_sv_catpvf_nocontext(SV *const sv, const char *const pat, ...)
8989 {
8990     dTHX;
8991     va_list args;
8992
8993     PERL_ARGS_ASSERT_SV_CATPVF_NOCONTEXT;
8994
8995     va_start(args, pat);
8996     sv_vcatpvf(sv, pat, &args);
8997     va_end(args);
8998 }
8999
9000 /* pTHX_ magic can't cope with varargs, so this is a no-context
9001  * version of the main function, (which may itself be aliased to us).
9002  * Don't access this version directly.
9003  */
9004
9005 void
9006 Perl_sv_catpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
9007 {
9008     dTHX;
9009     va_list args;
9010
9011     PERL_ARGS_ASSERT_SV_CATPVF_MG_NOCONTEXT;
9012
9013     va_start(args, pat);
9014     sv_vcatpvf_mg(sv, pat, &args);
9015     va_end(args);
9016 }
9017 #endif
9018
9019 /*
9020 =for apidoc sv_catpvf
9021
9022 Processes its arguments like C<sprintf> and appends the formatted
9023 output to an SV.  If the appended data contains "wide" characters
9024 (including, but not limited to, SVs with a UTF-8 PV formatted with %s,
9025 and characters >255 formatted with %c), the original SV might get
9026 upgraded to UTF-8.  Handles 'get' magic, but not 'set' magic.  See
9027 C<sv_catpvf_mg>. If the original SV was UTF-8, the pattern should be
9028 valid UTF-8; if the original SV was bytes, the pattern should be too.
9029
9030 =cut */
9031
9032 void
9033 Perl_sv_catpvf(pTHX_ SV *const sv, const char *const pat, ...)
9034 {
9035     va_list args;
9036
9037     PERL_ARGS_ASSERT_SV_CATPVF;
9038
9039     va_start(args, pat);
9040     sv_vcatpvf(sv, pat, &args);
9041     va_end(args);
9042 }
9043
9044 /*
9045 =for apidoc sv_vcatpvf
9046
9047 Processes its arguments like C<vsprintf> and appends the formatted output
9048 to an SV.  Does not handle 'set' magic.  See C<sv_vcatpvf_mg>.
9049
9050 Usually used via its frontend C<sv_catpvf>.
9051
9052 =cut
9053 */
9054
9055 void
9056 Perl_sv_vcatpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args)
9057 {
9058     PERL_ARGS_ASSERT_SV_VCATPVF;
9059
9060     sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
9061 }
9062
9063 /*
9064 =for apidoc sv_catpvf_mg
9065
9066 Like C<sv_catpvf>, but also handles 'set' magic.
9067
9068 =cut
9069 */
9070
9071 void
9072 Perl_sv_catpvf_mg(pTHX_ SV *const sv, const char *const pat, ...)
9073 {
9074     va_list args;
9075
9076     PERL_ARGS_ASSERT_SV_CATPVF_MG;
9077
9078     va_start(args, pat);
9079     sv_vcatpvf_mg(sv, pat, &args);
9080     va_end(args);
9081 }
9082
9083 /*
9084 =for apidoc sv_vcatpvf_mg
9085
9086 Like C<sv_vcatpvf>, but also handles 'set' magic.
9087
9088 Usually used via its frontend C<sv_catpvf_mg>.
9089
9090 =cut
9091 */
9092
9093 void
9094 Perl_sv_vcatpvf_mg(pTHX_ SV *const sv, const char *const pat, va_list *const args)
9095 {
9096     PERL_ARGS_ASSERT_SV_VCATPVF_MG;
9097
9098     sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
9099     SvSETMAGIC(sv);
9100 }
9101
9102 /*
9103 =for apidoc sv_vsetpvfn
9104
9105 Works like C<sv_vcatpvfn> but copies the text into the SV instead of
9106 appending it.
9107
9108 Usually used via one of its frontends C<sv_vsetpvf> and C<sv_vsetpvf_mg>.
9109
9110 =cut
9111 */
9112
9113 void
9114 Perl_sv_vsetpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
9115                  va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted)
9116 {
9117     PERL_ARGS_ASSERT_SV_VSETPVFN;
9118
9119     sv_setpvs(sv, "");
9120     sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
9121 }
9122
9123 STATIC I32
9124 S_expect_number(pTHX_ char **const pattern)
9125 {
9126     dVAR;
9127     I32 var = 0;
9128
9129     PERL_ARGS_ASSERT_EXPECT_NUMBER;
9130
9131     switch (**pattern) {
9132     case '1': case '2': case '3':
9133     case '4': case '5': case '6':
9134     case '7': case '8': case '9':
9135         var = *(*pattern)++ - '0';
9136         while (isDIGIT(**pattern)) {
9137             const I32 tmp = var * 10 + (*(*pattern)++ - '0');
9138             if (tmp < var)
9139                 Perl_croak(aTHX_ "Integer overflow in format string for %s", (PL_op ? OP_NAME(PL_op) : "sv_vcatpvfn"));
9140             var = tmp;
9141         }
9142     }
9143     return var;
9144 }
9145
9146 STATIC char *
9147 S_F0convert(NV nv, char *const endbuf, STRLEN *const len)
9148 {
9149     const int neg = nv < 0;
9150     UV uv;
9151
9152     PERL_ARGS_ASSERT_F0CONVERT;
9153
9154     if (neg)
9155         nv = -nv;
9156     if (nv < UV_MAX) {
9157         char *p = endbuf;
9158         nv += 0.5;
9159         uv = (UV)nv;
9160         if (uv & 1 && uv == nv)
9161             uv--;                       /* Round to even */
9162         do {
9163             const unsigned dig = uv % 10;
9164             *--p = '0' + dig;
9165         } while (uv /= 10);
9166         if (neg)
9167             *--p = '-';
9168         *len = endbuf - p;
9169         return p;
9170     }
9171     return NULL;
9172 }
9173
9174
9175 /*
9176 =for apidoc sv_vcatpvfn
9177
9178 Processes its arguments like C<vsprintf> and appends the formatted output
9179 to an SV.  Uses an array of SVs if the C style variable argument list is
9180 missing (NULL).  When running with taint checks enabled, indicates via
9181 C<maybe_tainted> if results are untrustworthy (often due to the use of
9182 locales).
9183
9184 Usually used via one of its frontends C<sv_vcatpvf> and C<sv_vcatpvf_mg>.
9185
9186 =cut
9187 */
9188
9189
9190 #define VECTORIZE_ARGS  vecsv = va_arg(*args, SV*);\
9191                         vecstr = (U8*)SvPV_const(vecsv,veclen);\
9192                         vec_utf8 = DO_UTF8(vecsv);
9193
9194 /* XXX maybe_tainted is never assigned to, so the doc above is lying. */
9195
9196 void
9197 Perl_sv_vcatpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
9198                  va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted)
9199 {
9200     dVAR;
9201     char *p;
9202     char *q;
9203     const char *patend;
9204     STRLEN origlen;
9205     I32 svix = 0;
9206     static const char nullstr[] = "(null)";
9207     SV *argsv = NULL;
9208     bool has_utf8 = DO_UTF8(sv);    /* has the result utf8? */
9209     const bool pat_utf8 = has_utf8; /* the pattern is in utf8? */
9210     SV *nsv = NULL;
9211     /* Times 4: a decimal digit takes more than 3 binary digits.
9212      * NV_DIG: mantissa takes than many decimal digits.
9213      * Plus 32: Playing safe. */
9214     char ebuf[IV_DIG * 4 + NV_DIG + 32];
9215     /* large enough for "%#.#f" --chip */
9216     /* what about long double NVs? --jhi */
9217
9218     PERL_ARGS_ASSERT_SV_VCATPVFN;
9219     PERL_UNUSED_ARG(maybe_tainted);
9220
9221     /* no matter what, this is a string now */
9222     (void)SvPV_force(sv, origlen);
9223
9224     /* special-case "", "%s", and "%-p" (SVf - see below) */
9225     if (patlen == 0)
9226         return;
9227     if (patlen == 2 && pat[0] == '%' && pat[1] == 's') {
9228         if (args) {
9229             const char * const s = va_arg(*args, char*);
9230             sv_catpv(sv, s ? s : nullstr);
9231         }
9232         else if (svix < svmax) {
9233             sv_catsv(sv, *svargs);
9234         }
9235         return;
9236     }
9237     if (args && patlen == 3 && pat[0] == '%' &&
9238                 pat[1] == '-' && pat[2] == 'p') {
9239         argsv = MUTABLE_SV(va_arg(*args, void*));
9240         sv_catsv(sv, argsv);
9241         return;
9242     }
9243
9244 #ifndef USE_LONG_DOUBLE
9245     /* special-case "%.<number>[gf]" */
9246     if ( !args && patlen <= 5 && pat[0] == '%' && pat[1] == '.'
9247          && (pat[patlen-1] == 'g' || pat[patlen-1] == 'f') ) {
9248         unsigned digits = 0;
9249         const char *pp;
9250
9251         pp = pat + 2;
9252         while (*pp >= '0' && *pp <= '9')
9253             digits = 10 * digits + (*pp++ - '0');
9254         if (pp - pat == (int)patlen - 1) {
9255             NV nv;
9256
9257             if (svix < svmax)
9258                 nv = SvNV(*svargs);
9259             else
9260                 return;
9261             if (*pp == 'g') {
9262                 /* Add check for digits != 0 because it seems that some
9263                    gconverts are buggy in this case, and we don't yet have
9264                    a Configure test for this.  */
9265                 if (digits && digits < sizeof(ebuf) - NV_DIG - 10) {
9266                      /* 0, point, slack */
9267                     Gconvert(nv, (int)digits, 0, ebuf);
9268                     sv_catpv(sv, ebuf);
9269                     if (*ebuf)  /* May return an empty string for digits==0 */
9270                         return;
9271                 }
9272             } else if (!digits) {
9273                 STRLEN l;
9274
9275                 if ((p = F0convert(nv, ebuf + sizeof ebuf, &l))) {
9276                     sv_catpvn(sv, p, l);
9277                     return;
9278                 }
9279             }
9280         }
9281     }
9282 #endif /* !USE_LONG_DOUBLE */
9283
9284     if (!args && svix < svmax && DO_UTF8(*svargs))
9285         has_utf8 = TRUE;
9286
9287     patend = (char*)pat + patlen;
9288     for (p = (char*)pat; p < patend; p = q) {
9289         bool alt = FALSE;
9290         bool left = FALSE;
9291         bool vectorize = FALSE;
9292         bool vectorarg = FALSE;
9293         bool vec_utf8 = FALSE;
9294         char fill = ' ';
9295         char plus = 0;
9296         char intsize = 0;
9297         STRLEN width = 0;
9298         STRLEN zeros = 0;
9299         bool has_precis = FALSE;
9300         STRLEN precis = 0;
9301         const I32 osvix = svix;
9302         bool is_utf8 = FALSE;  /* is this item utf8?   */
9303 #ifdef HAS_LDBL_SPRINTF_BUG
9304         /* This is to try to fix a bug with irix/nonstop-ux/powerux and
9305            with sfio - Allen <allens@cpan.org> */
9306         bool fix_ldbl_sprintf_bug = FALSE;
9307 #endif
9308
9309         char esignbuf[4];
9310         U8 utf8buf[UTF8_MAXBYTES+1];
9311         STRLEN esignlen = 0;
9312
9313         const char *eptr = NULL;
9314         const char *fmtstart;
9315         STRLEN elen = 0;
9316         SV *vecsv = NULL;
9317         const U8 *vecstr = NULL;
9318         STRLEN veclen = 0;
9319         char c = 0;
9320         int i;
9321         unsigned base = 0;
9322         IV iv = 0;
9323         UV uv = 0;
9324         /* we need a long double target in case HAS_LONG_DOUBLE but
9325            not USE_LONG_DOUBLE
9326         */
9327 #if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
9328         long double nv;
9329 #else
9330         NV nv;
9331 #endif
9332         STRLEN have;
9333         STRLEN need;
9334         STRLEN gap;
9335         const char *dotstr = ".";
9336         STRLEN dotstrlen = 1;
9337         I32 efix = 0; /* explicit format parameter index */
9338         I32 ewix = 0; /* explicit width index */
9339         I32 epix = 0; /* explicit precision index */
9340         I32 evix = 0; /* explicit vector index */
9341         bool asterisk = FALSE;
9342
9343         /* echo everything up to the next format specification */
9344         for (q = p; q < patend && *q != '%'; ++q) ;
9345         if (q > p) {
9346             if (has_utf8 && !pat_utf8)
9347                 sv_catpvn_utf8_upgrade(sv, p, q - p, nsv);
9348             else
9349                 sv_catpvn(sv, p, q - p);
9350             p = q;
9351         }
9352         if (q++ >= patend)
9353             break;
9354
9355         fmtstart = q;
9356
9357 /*
9358     We allow format specification elements in this order:
9359         \d+\$              explicit format parameter index
9360         [-+ 0#]+           flags
9361         v|\*(\d+\$)?v      vector with optional (optionally specified) arg
9362         0                  flag (as above): repeated to allow "v02"     
9363         \d+|\*(\d+\$)?     width using optional (optionally specified) arg
9364         \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
9365         [hlqLV]            size
9366     [%bcdefginopsuxDFOUX] format (mandatory)
9367 */
9368
9369         if (args) {
9370 /*  
9371         As of perl5.9.3, printf format checking is on by default.
9372         Internally, perl uses %p formats to provide an escape to
9373         some extended formatting.  This block deals with those
9374         extensions: if it does not match, (char*)q is reset and
9375         the normal format processing code is used.
9376
9377         Currently defined extensions are:
9378                 %p              include pointer address (standard)      
9379                 %-p     (SVf)   include an SV (previously %_)
9380                 %-<num>p        include an SV with precision <num>      
9381                 %<num>p         reserved for future extensions
9382
9383         Robin Barker 2005-07-14
9384
9385                 %1p     (VDf)   removed.  RMB 2007-10-19
9386 */
9387             char* r = q; 
9388             bool sv = FALSE;    
9389             STRLEN n = 0;
9390             if (*q == '-')
9391                 sv = *q++;
9392             n = expect_number(&q);
9393             if (*q++ == 'p') {
9394                 if (sv) {                       /* SVf */
9395                     if (n) {
9396                         precis = n;
9397                         has_precis = TRUE;
9398                     }
9399                     argsv = MUTABLE_SV(va_arg(*args, void*));
9400                     eptr = SvPV_const(argsv, elen);
9401                     if (DO_UTF8(argsv))
9402                         is_utf8 = TRUE;
9403                     goto string;
9404                 }
9405                 else if (n) {
9406                     if (ckWARN_d(WARN_INTERNAL))
9407                         Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
9408                         "internal %%<num>p might conflict with future printf extensions");
9409                 }
9410             }
9411             q = r; 
9412         }
9413
9414         if ( (width = expect_number(&q)) ) {
9415             if (*q == '$') {
9416                 ++q;
9417                 efix = width;
9418             } else {
9419                 goto gotwidth;
9420             }
9421         }
9422
9423         /* FLAGS */
9424
9425         while (*q) {
9426             switch (*q) {
9427             case ' ':
9428             case '+':
9429                 if (plus == '+' && *q == ' ') /* '+' over ' ' */
9430                     q++;
9431                 else
9432                     plus = *q++;
9433                 continue;
9434
9435             case '-':
9436                 left = TRUE;
9437                 q++;
9438                 continue;
9439
9440             case '0':
9441                 fill = *q++;
9442                 continue;
9443
9444             case '#':
9445                 alt = TRUE;
9446                 q++;
9447                 continue;
9448
9449             default:
9450                 break;
9451             }
9452             break;
9453         }
9454
9455       tryasterisk:
9456         if (*q == '*') {
9457             q++;
9458             if ( (ewix = expect_number(&q)) )
9459                 if (*q++ != '$')
9460                     goto unknown;
9461             asterisk = TRUE;
9462         }
9463         if (*q == 'v') {
9464             q++;
9465             if (vectorize)
9466                 goto unknown;
9467             if ((vectorarg = asterisk)) {
9468                 evix = ewix;
9469                 ewix = 0;
9470                 asterisk = FALSE;
9471             }
9472             vectorize = TRUE;
9473             goto tryasterisk;
9474         }
9475
9476         if (!asterisk)
9477         {
9478             if( *q == '0' )
9479                 fill = *q++;
9480             width = expect_number(&q);
9481         }
9482
9483         if (vectorize) {
9484             if (vectorarg) {
9485                 if (args)
9486                     vecsv = va_arg(*args, SV*);
9487                 else if (evix) {
9488                     vecsv = (evix > 0 && evix <= svmax)
9489                         ? svargs[evix-1] : &PL_sv_undef;
9490                 } else {
9491                     vecsv = svix < svmax ? svargs[svix++] : &PL_sv_undef;
9492                 }
9493                 dotstr = SvPV_const(vecsv, dotstrlen);
9494                 /* Keep the DO_UTF8 test *after* the SvPV call, else things go
9495                    bad with tied or overloaded values that return UTF8.  */
9496                 if (DO_UTF8(vecsv))
9497                     is_utf8 = TRUE;
9498                 else if (has_utf8) {
9499                     vecsv = sv_mortalcopy(vecsv);
9500                     sv_utf8_upgrade(vecsv);
9501                     dotstr = SvPV_const(vecsv, dotstrlen);
9502                     is_utf8 = TRUE;
9503                 }                   
9504             }
9505             if (args) {
9506                 VECTORIZE_ARGS
9507             }
9508             else if (efix ? (efix > 0 && efix <= svmax) : svix < svmax) {
9509                 vecsv = svargs[efix ? efix-1 : svix++];
9510                 vecstr = (U8*)SvPV_const(vecsv,veclen);
9511                 vec_utf8 = DO_UTF8(vecsv);
9512
9513                 /* if this is a version object, we need to convert
9514                  * back into v-string notation and then let the
9515                  * vectorize happen normally
9516                  */
9517                 if (sv_derived_from(vecsv, "version")) {
9518                     char *version = savesvpv(vecsv);
9519                     if ( hv_exists(MUTABLE_HV(SvRV(vecsv)), "alpha", 5 ) ) {
9520                         Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
9521                         "vector argument not supported with alpha versions");
9522                         goto unknown;
9523                     }
9524                     vecsv = sv_newmortal();
9525                     scan_vstring(version, version + veclen, vecsv);
9526                     vecstr = (U8*)SvPV_const(vecsv, veclen);
9527                     vec_utf8 = DO_UTF8(vecsv);
9528                     Safefree(version);
9529                 }
9530             }
9531             else {
9532                 vecstr = (U8*)"";
9533                 veclen = 0;
9534             }
9535         }
9536
9537         if (asterisk) {
9538             if (args)
9539                 i = va_arg(*args, int);
9540             else
9541                 i = (ewix ? ewix <= svmax : svix < svmax) ?
9542                     SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
9543             left |= (i < 0);
9544             width = (i < 0) ? -i : i;
9545         }
9546       gotwidth:
9547
9548         /* PRECISION */
9549
9550         if (*q == '.') {
9551             q++;
9552             if (*q == '*') {
9553                 q++;
9554                 if ( ((epix = expect_number(&q))) && (*q++ != '$') )
9555                     goto unknown;
9556                 /* XXX: todo, support specified precision parameter */
9557                 if (epix)
9558                     goto unknown;
9559                 if (args)
9560                     i = va_arg(*args, int);
9561                 else
9562                     i = (ewix ? ewix <= svmax : svix < svmax)
9563                         ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
9564                 precis = i;
9565                 has_precis = !(i < 0);
9566             }
9567             else {
9568                 precis = 0;
9569                 while (isDIGIT(*q))
9570                     precis = precis * 10 + (*q++ - '0');
9571                 has_precis = TRUE;
9572             }
9573         }
9574
9575         /* SIZE */
9576
9577         switch (*q) {
9578 #ifdef WIN32
9579         case 'I':                       /* Ix, I32x, and I64x */
9580 #  ifdef WIN64
9581             if (q[1] == '6' && q[2] == '4') {
9582                 q += 3;
9583                 intsize = 'q';
9584                 break;
9585             }
9586 #  endif
9587             if (q[1] == '3' && q[2] == '2') {
9588                 q += 3;
9589                 break;
9590             }
9591 #  ifdef WIN64
9592             intsize = 'q';
9593 #  endif
9594             q++;
9595             break;
9596 #endif
9597 #if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
9598         case 'L':                       /* Ld */
9599             /*FALLTHROUGH*/
9600 #ifdef HAS_QUAD
9601         case 'q':                       /* qd */
9602 #endif
9603             intsize = 'q';
9604             q++;
9605             break;
9606 #endif
9607         case 'l':
9608 #if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
9609             if (*(q + 1) == 'l') {      /* lld, llf */
9610                 intsize = 'q';
9611                 q += 2;
9612                 break;
9613              }
9614 #endif
9615             /*FALLTHROUGH*/
9616         case 'h':
9617             /*FALLTHROUGH*/
9618         case 'V':
9619             intsize = *q++;
9620             break;
9621         }
9622
9623         /* CONVERSION */
9624
9625         if (*q == '%') {
9626             eptr = q++;
9627             elen = 1;
9628             if (vectorize) {
9629                 c = '%';
9630                 goto unknown;
9631             }
9632             goto string;
9633         }
9634
9635         if (!vectorize && !args) {
9636             if (efix) {
9637                 const I32 i = efix-1;
9638                 argsv = (i >= 0 && i < svmax) ? svargs[i] : &PL_sv_undef;
9639             } else {
9640                 argsv = (svix >= 0 && svix < svmax)
9641                     ? svargs[svix++] : &PL_sv_undef;
9642             }
9643         }
9644
9645         switch (c = *q++) {
9646
9647             /* STRINGS */
9648
9649         case 'c':
9650             if (vectorize)
9651                 goto unknown;
9652             uv = (args) ? va_arg(*args, int) : SvIV(argsv);
9653             if ((uv > 255 ||
9654                  (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
9655                 && !IN_BYTES) {
9656                 eptr = (char*)utf8buf;
9657                 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
9658                 is_utf8 = TRUE;
9659             }
9660             else {
9661                 c = (char)uv;
9662                 eptr = &c;
9663                 elen = 1;
9664             }
9665             goto string;
9666
9667         case 's':
9668             if (vectorize)
9669                 goto unknown;
9670             if (args) {
9671                 eptr = va_arg(*args, char*);
9672                 if (eptr)
9673                     elen = strlen(eptr);
9674                 else {
9675                     eptr = (char *)nullstr;
9676                     elen = sizeof nullstr - 1;
9677                 }
9678             }
9679             else {
9680                 eptr = SvPV_const(argsv, elen);
9681                 if (DO_UTF8(argsv)) {
9682                     I32 old_precis = precis;
9683                     if (has_precis && precis < elen) {
9684                         I32 p = precis;
9685                         sv_pos_u2b(argsv, &p, 0); /* sticks at end */
9686                         precis = p;
9687                     }
9688                     if (width) { /* fudge width (can't fudge elen) */
9689                         if (has_precis && precis < elen)
9690                             width += precis - old_precis;
9691                         else
9692                             width += elen - sv_len_utf8(argsv);
9693                     }
9694                     is_utf8 = TRUE;
9695                 }
9696             }
9697
9698         string:
9699             if (has_precis && elen > precis)
9700                 elen = precis;
9701             break;
9702
9703             /* INTEGERS */
9704
9705         case 'p':
9706             if (alt || vectorize)
9707                 goto unknown;
9708             uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
9709             base = 16;
9710             goto integer;
9711
9712         case 'D':
9713 #ifdef IV_IS_QUAD
9714             intsize = 'q';
9715 #else
9716             intsize = 'l';
9717 #endif
9718             /*FALLTHROUGH*/
9719         case 'd':
9720         case 'i':
9721 #if vdNUMBER
9722         format_vd:
9723 #endif
9724             if (vectorize) {
9725                 STRLEN ulen;
9726                 if (!veclen)
9727                     continue;
9728                 if (vec_utf8)
9729                     uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9730                                         UTF8_ALLOW_ANYUV);
9731                 else {
9732                     uv = *vecstr;
9733                     ulen = 1;
9734                 }
9735                 vecstr += ulen;
9736                 veclen -= ulen;
9737                 if (plus)
9738                      esignbuf[esignlen++] = plus;
9739             }
9740             else if (args) {
9741                 switch (intsize) {
9742                 case 'h':       iv = (short)va_arg(*args, int); break;
9743                 case 'l':       iv = va_arg(*args, long); break;
9744                 case 'V':       iv = va_arg(*args, IV); break;
9745                 default:        iv = va_arg(*args, int); break;
9746                 case 'q':
9747 #ifdef HAS_QUAD
9748                                 iv = va_arg(*args, Quad_t); break;
9749 #else
9750                                 goto unknown;
9751 #endif
9752                 }
9753             }
9754             else {
9755                 IV tiv = SvIV(argsv); /* work around GCC bug #13488 */
9756                 switch (intsize) {
9757                 case 'h':       iv = (short)tiv; break;
9758                 case 'l':       iv = (long)tiv; break;
9759                 case 'V':
9760                 default:        iv = tiv; break;
9761                 case 'q':
9762 #ifdef HAS_QUAD
9763                                 iv = (Quad_t)tiv; break;
9764 #else
9765                                 goto unknown;
9766 #endif
9767                 }
9768             }
9769             if ( !vectorize )   /* we already set uv above */
9770             {
9771                 if (iv >= 0) {
9772                     uv = iv;
9773                     if (plus)
9774                         esignbuf[esignlen++] = plus;
9775                 }
9776                 else {
9777                     uv = -iv;
9778                     esignbuf[esignlen++] = '-';
9779                 }
9780             }
9781             base = 10;
9782             goto integer;
9783
9784         case 'U':
9785 #ifdef IV_IS_QUAD
9786             intsize = 'q';
9787 #else
9788             intsize = 'l';
9789 #endif
9790             /*FALLTHROUGH*/
9791         case 'u':
9792             base = 10;
9793             goto uns_integer;
9794
9795         case 'B':
9796         case 'b':
9797             base = 2;
9798             goto uns_integer;
9799
9800         case 'O':
9801 #ifdef IV_IS_QUAD
9802             intsize = 'q';
9803 #else
9804             intsize = 'l';
9805 #endif
9806             /*FALLTHROUGH*/
9807         case 'o':
9808             base = 8;
9809             goto uns_integer;
9810
9811         case 'X':
9812         case 'x':
9813             base = 16;
9814
9815         uns_integer:
9816             if (vectorize) {
9817                 STRLEN ulen;
9818         vector:
9819                 if (!veclen)
9820                     continue;
9821                 if (vec_utf8)
9822                     uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9823                                         UTF8_ALLOW_ANYUV);
9824                 else {
9825                     uv = *vecstr;
9826                     ulen = 1;
9827                 }
9828                 vecstr += ulen;
9829                 veclen -= ulen;
9830             }
9831             else if (args) {
9832                 switch (intsize) {
9833                 case 'h':  uv = (unsigned short)va_arg(*args, unsigned); break;
9834                 case 'l':  uv = va_arg(*args, unsigned long); break;
9835                 case 'V':  uv = va_arg(*args, UV); break;
9836                 default:   uv = va_arg(*args, unsigned); break;
9837                 case 'q':
9838 #ifdef HAS_QUAD
9839                            uv = va_arg(*args, Uquad_t); break;
9840 #else
9841                            goto unknown;
9842 #endif
9843                 }
9844             }
9845             else {
9846                 UV tuv = SvUV(argsv); /* work around GCC bug #13488 */
9847                 switch (intsize) {
9848                 case 'h':       uv = (unsigned short)tuv; break;
9849                 case 'l':       uv = (unsigned long)tuv; break;
9850                 case 'V':
9851                 default:        uv = tuv; break;
9852                 case 'q':
9853 #ifdef HAS_QUAD
9854                                 uv = (Uquad_t)tuv; break;
9855 #else
9856                                 goto unknown;
9857 #endif
9858                 }
9859             }
9860
9861         integer:
9862             {
9863                 char *ptr = ebuf + sizeof ebuf;
9864                 bool tempalt = uv ? alt : FALSE; /* Vectors can't change alt */
9865                 zeros = 0;
9866
9867                 switch (base) {
9868                     unsigned dig;
9869                 case 16:
9870                     p = (char *)((c == 'X') ? PL_hexdigit + 16 : PL_hexdigit);
9871                     do {
9872                         dig = uv & 15;
9873                         *--ptr = p[dig];
9874                     } while (uv >>= 4);
9875                     if (tempalt) {
9876                         esignbuf[esignlen++] = '0';
9877                         esignbuf[esignlen++] = c;  /* 'x' or 'X' */
9878                     }
9879                     break;
9880                 case 8:
9881                     do {
9882                         dig = uv & 7;
9883                         *--ptr = '0' + dig;
9884                     } while (uv >>= 3);
9885                     if (alt && *ptr != '0')
9886                         *--ptr = '0';
9887                     break;
9888                 case 2:
9889                     do {
9890                         dig = uv & 1;
9891                         *--ptr = '0' + dig;
9892                     } while (uv >>= 1);
9893                     if (tempalt) {
9894                         esignbuf[esignlen++] = '0';
9895                         esignbuf[esignlen++] = c;
9896                     }
9897                     break;
9898                 default:                /* it had better be ten or less */
9899                     do {
9900                         dig = uv % base;
9901                         *--ptr = '0' + dig;
9902                     } while (uv /= base);
9903                     break;
9904                 }
9905                 elen = (ebuf + sizeof ebuf) - ptr;
9906                 eptr = ptr;
9907                 if (has_precis) {
9908                     if (precis > elen)
9909                         zeros = precis - elen;
9910                     else if (precis == 0 && elen == 1 && *eptr == '0'
9911                              && !(base == 8 && alt)) /* "%#.0o" prints "0" */
9912                         elen = 0;
9913
9914                 /* a precision nullifies the 0 flag. */
9915                     if (fill == '0')
9916                         fill = ' ';
9917                 }
9918             }
9919             break;
9920
9921             /* FLOATING POINT */
9922
9923         case 'F':
9924             c = 'f';            /* maybe %F isn't supported here */
9925             /*FALLTHROUGH*/
9926         case 'e': case 'E':
9927         case 'f':
9928         case 'g': case 'G':
9929             if (vectorize)
9930                 goto unknown;
9931
9932             /* This is evil, but floating point is even more evil */
9933
9934             /* for SV-style calling, we can only get NV
9935                for C-style calling, we assume %f is double;
9936                for simplicity we allow any of %Lf, %llf, %qf for long double
9937             */
9938             switch (intsize) {
9939             case 'V':
9940 #if defined(USE_LONG_DOUBLE)
9941                 intsize = 'q';
9942 #endif
9943                 break;
9944 /* [perl #20339] - we should accept and ignore %lf rather than die */
9945             case 'l':
9946                 /*FALLTHROUGH*/
9947             default:
9948 #if defined(USE_LONG_DOUBLE)
9949                 intsize = args ? 0 : 'q';
9950 #endif
9951                 break;
9952             case 'q':
9953 #if defined(HAS_LONG_DOUBLE)
9954                 break;
9955 #else
9956                 /*FALLTHROUGH*/
9957 #endif
9958             case 'h':
9959                 goto unknown;
9960             }
9961
9962             /* now we need (long double) if intsize == 'q', else (double) */
9963             nv = (args) ?
9964 #if LONG_DOUBLESIZE > DOUBLESIZE
9965                 intsize == 'q' ?
9966                     va_arg(*args, long double) :
9967                     va_arg(*args, double)
9968 #else
9969                     va_arg(*args, double)
9970 #endif
9971                 : SvNV(argsv);
9972
9973             need = 0;
9974             /* nv * 0 will be NaN for NaN, +Inf and -Inf, and 0 for anything
9975                else. frexp() has some unspecified behaviour for those three */
9976             if (c != 'e' && c != 'E' && (nv * 0) == 0) {
9977                 i = PERL_INT_MIN;
9978                 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
9979                    will cast our (long double) to (double) */
9980                 (void)Perl_frexp(nv, &i);
9981                 if (i == PERL_INT_MIN)
9982                     Perl_die(aTHX_ "panic: frexp");
9983                 if (i > 0)
9984                     need = BIT_DIGITS(i);
9985             }
9986             need += has_precis ? precis : 6; /* known default */
9987
9988             if (need < width)
9989                 need = width;
9990
9991 #ifdef HAS_LDBL_SPRINTF_BUG
9992             /* This is to try to fix a bug with irix/nonstop-ux/powerux and
9993                with sfio - Allen <allens@cpan.org> */
9994
9995 #  ifdef DBL_MAX
9996 #    define MY_DBL_MAX DBL_MAX
9997 #  else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
9998 #    if DOUBLESIZE >= 8
9999 #      define MY_DBL_MAX 1.7976931348623157E+308L
10000 #    else
10001 #      define MY_DBL_MAX 3.40282347E+38L
10002 #    endif
10003 #  endif
10004
10005 #  ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
10006 #    define MY_DBL_MAX_BUG 1L
10007 #  else
10008 #    define MY_DBL_MAX_BUG MY_DBL_MAX
10009 #  endif
10010
10011 #  ifdef DBL_MIN
10012 #    define MY_DBL_MIN DBL_MIN
10013 #  else  /* XXX guessing! -Allen */
10014 #    if DOUBLESIZE >= 8
10015 #      define MY_DBL_MIN 2.2250738585072014E-308L
10016 #    else
10017 #      define MY_DBL_MIN 1.17549435E-38L
10018 #    endif
10019 #  endif
10020
10021             if ((intsize == 'q') && (c == 'f') &&
10022                 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
10023                 (need < DBL_DIG)) {
10024                 /* it's going to be short enough that
10025                  * long double precision is not needed */
10026
10027                 if ((nv <= 0L) && (nv >= -0L))
10028                     fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
10029                 else {
10030                     /* would use Perl_fp_class as a double-check but not
10031                      * functional on IRIX - see perl.h comments */
10032
10033                     if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
10034                         /* It's within the range that a double can represent */
10035 #if defined(DBL_MAX) && !defined(DBL_MIN)
10036                         if ((nv >= ((long double)1/DBL_MAX)) ||
10037                             (nv <= (-(long double)1/DBL_MAX)))
10038 #endif
10039                         fix_ldbl_sprintf_bug = TRUE;
10040                     }
10041                 }
10042                 if (fix_ldbl_sprintf_bug == TRUE) {
10043                     double temp;
10044
10045                     intsize = 0;
10046                     temp = (double)nv;
10047                     nv = (NV)temp;
10048                 }
10049             }
10050
10051 #  undef MY_DBL_MAX
10052 #  undef MY_DBL_MAX_BUG
10053 #  undef MY_DBL_MIN
10054
10055 #endif /* HAS_LDBL_SPRINTF_BUG */
10056
10057             need += 20; /* fudge factor */
10058             if (PL_efloatsize < need) {
10059                 Safefree(PL_efloatbuf);
10060                 PL_efloatsize = need + 20; /* more fudge */
10061                 Newx(PL_efloatbuf, PL_efloatsize, char);
10062                 PL_efloatbuf[0] = '\0';
10063             }
10064
10065             if ( !(width || left || plus || alt) && fill != '0'
10066                  && has_precis && intsize != 'q' ) {    /* Shortcuts */
10067                 /* See earlier comment about buggy Gconvert when digits,
10068                    aka precis is 0  */
10069                 if ( c == 'g' && precis) {
10070                     Gconvert((NV)nv, (int)precis, 0, PL_efloatbuf);
10071                     /* May return an empty string for digits==0 */
10072                     if (*PL_efloatbuf) {
10073                         elen = strlen(PL_efloatbuf);
10074                         goto float_converted;
10075                     }
10076                 } else if ( c == 'f' && !precis) {
10077                     if ((eptr = F0convert(nv, ebuf + sizeof ebuf, &elen)))
10078                         break;
10079                 }
10080             }
10081             {
10082                 char *ptr = ebuf + sizeof ebuf;
10083                 *--ptr = '\0';
10084                 *--ptr = c;
10085                 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
10086 #if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
10087                 if (intsize == 'q') {
10088                     /* Copy the one or more characters in a long double
10089                      * format before the 'base' ([efgEFG]) character to
10090                      * the format string. */
10091                     static char const prifldbl[] = PERL_PRIfldbl;
10092                     char const *p = prifldbl + sizeof(prifldbl) - 3;
10093                     while (p >= prifldbl) { *--ptr = *p--; }
10094                 }
10095 #endif
10096                 if (has_precis) {
10097                     base = precis;
10098                     do { *--ptr = '0' + (base % 10); } while (base /= 10);
10099                     *--ptr = '.';
10100                 }
10101                 if (width) {
10102                     base = width;
10103                     do { *--ptr = '0' + (base % 10); } while (base /= 10);
10104                 }
10105                 if (fill == '0')
10106                     *--ptr = fill;
10107                 if (left)
10108                     *--ptr = '-';
10109                 if (plus)
10110                     *--ptr = plus;
10111                 if (alt)
10112                     *--ptr = '#';
10113                 *--ptr = '%';
10114
10115                 /* No taint.  Otherwise we are in the strange situation
10116                  * where printf() taints but print($float) doesn't.
10117                  * --jhi */
10118 #if defined(HAS_LONG_DOUBLE)
10119                 elen = ((intsize == 'q')
10120                         ? my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, nv)
10121                         : my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, (double)nv));
10122 #else
10123                 elen = my_sprintf(PL_efloatbuf, ptr, nv);
10124 #endif
10125             }
10126         float_converted:
10127             eptr = PL_efloatbuf;
10128             break;
10129
10130             /* SPECIAL */
10131
10132         case 'n':
10133             if (vectorize)
10134                 goto unknown;
10135             i = SvCUR(sv) - origlen;
10136             if (args) {
10137                 switch (intsize) {
10138                 case 'h':       *(va_arg(*args, short*)) = i; break;
10139                 default:        *(va_arg(*args, int*)) = i; break;
10140                 case 'l':       *(va_arg(*args, long*)) = i; break;
10141                 case 'V':       *(va_arg(*args, IV*)) = i; break;
10142                 case 'q':
10143 #ifdef HAS_QUAD
10144                                 *(va_arg(*args, Quad_t*)) = i; break;
10145 #else
10146                                 goto unknown;
10147 #endif
10148                 }
10149             }
10150             else
10151                 sv_setuv_mg(argsv, (UV)i);
10152             continue;   /* not "break" */
10153
10154             /* UNKNOWN */
10155
10156         default:
10157       unknown:
10158             if (!args
10159                 && (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)
10160                 && ckWARN(WARN_PRINTF))
10161             {
10162                 SV * const msg = sv_newmortal();
10163                 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
10164                           (PL_op->op_type == OP_PRTF) ? "" : "s");
10165                 if (fmtstart < patend) {
10166                     const char * const fmtend = q < patend ? q : patend;
10167                     const char * f;
10168                     sv_catpvs(msg, "\"%");
10169                     for (f = fmtstart; f < fmtend; f++) {
10170                         if (isPRINT(*f)) {
10171                             sv_catpvn(msg, f, 1);
10172                         } else {
10173                             Perl_sv_catpvf(aTHX_ msg,
10174                                            "\\%03"UVof, (UV)*f & 0xFF);
10175                         }
10176                     }
10177                     sv_catpvs(msg, "\"");
10178                 } else {
10179                     sv_catpvs(msg, "end of string");
10180                 }
10181                 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, SVfARG(msg)); /* yes, this is reentrant */
10182             }
10183
10184             /* output mangled stuff ... */
10185             if (c == '\0')
10186                 --q;
10187             eptr = p;
10188             elen = q - p;
10189
10190             /* ... right here, because formatting flags should not apply */
10191             SvGROW(sv, SvCUR(sv) + elen + 1);
10192             p = SvEND(sv);
10193             Copy(eptr, p, elen, char);
10194             p += elen;
10195             *p = '\0';
10196             SvCUR_set(sv, p - SvPVX_const(sv));
10197             svix = osvix;
10198             continue;   /* not "break" */
10199         }
10200
10201         if (is_utf8 != has_utf8) {
10202             if (is_utf8) {
10203                 if (SvCUR(sv))
10204                     sv_utf8_upgrade(sv);
10205             }
10206             else {
10207                 const STRLEN old_elen = elen;
10208                 SV * const nsv = newSVpvn_flags(eptr, elen, SVs_TEMP);
10209                 sv_utf8_upgrade(nsv);
10210                 eptr = SvPVX_const(nsv);
10211                 elen = SvCUR(nsv);
10212
10213                 if (width) { /* fudge width (can't fudge elen) */
10214                     width += elen - old_elen;
10215                 }
10216                 is_utf8 = TRUE;
10217             }
10218         }
10219
10220         have = esignlen + zeros + elen;
10221         if (have < zeros)
10222             Perl_croak_nocontext("%s", PL_memory_wrap);
10223
10224         need = (have > width ? have : width);
10225         gap = need - have;
10226
10227         if (need >= (((STRLEN)~0) - SvCUR(sv) - dotstrlen - 1))
10228             Perl_croak_nocontext("%s", PL_memory_wrap);
10229         SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
10230         p = SvEND(sv);
10231         if (esignlen && fill == '0') {
10232             int i;
10233             for (i = 0; i < (int)esignlen; i++)
10234                 *p++ = esignbuf[i];
10235         }
10236         if (gap && !left) {
10237             memset(p, fill, gap);
10238             p += gap;
10239         }
10240         if (esignlen && fill != '0') {
10241             int i;
10242             for (i = 0; i < (int)esignlen; i++)
10243                 *p++ = esignbuf[i];
10244         }
10245         if (zeros) {
10246             int i;
10247             for (i = zeros; i; i--)
10248                 *p++ = '0';
10249         }
10250         if (elen) {
10251             Copy(eptr, p, elen, char);
10252             p += elen;
10253         }
10254         if (gap && left) {
10255             memset(p, ' ', gap);
10256             p += gap;
10257         }
10258         if (vectorize) {
10259             if (veclen) {
10260                 Copy(dotstr, p, dotstrlen, char);
10261                 p += dotstrlen;
10262             }
10263             else
10264                 vectorize = FALSE;              /* done iterating over vecstr */
10265         }
10266         if (is_utf8)
10267             has_utf8 = TRUE;
10268         if (has_utf8)
10269             SvUTF8_on(sv);
10270         *p = '\0';
10271         SvCUR_set(sv, p - SvPVX_const(sv));
10272         if (vectorize) {
10273             esignlen = 0;
10274             goto vector;
10275         }
10276     }
10277 }
10278
10279 /* =========================================================================
10280
10281 =head1 Cloning an interpreter
10282
10283 All the macros and functions in this section are for the private use of
10284 the main function, perl_clone().
10285
10286 The foo_dup() functions make an exact copy of an existing foo thingy.
10287 During the course of a cloning, a hash table is used to map old addresses
10288 to new addresses. The table is created and manipulated with the
10289 ptr_table_* functions.
10290
10291 =cut
10292
10293  * =========================================================================*/
10294
10295
10296 #if defined(USE_ITHREADS)
10297
10298 /* XXX Remove this so it doesn't have to go thru the macro and return for nothing */
10299 #ifndef GpREFCNT_inc
10300 #  define GpREFCNT_inc(gp)      ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
10301 #endif
10302
10303
10304 /* Certain cases in Perl_ss_dup have been merged, by relying on the fact
10305    that currently av_dup, gv_dup and hv_dup are the same as sv_dup.
10306    If this changes, please unmerge ss_dup.  */
10307 #define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
10308 #define sv_dup_inc_NN(s,t)      SvREFCNT_inc_NN(sv_dup(s,t))
10309 #define av_dup(s,t)     MUTABLE_AV(sv_dup((const SV *)s,t))
10310 #define av_dup_inc(s,t) MUTABLE_AV(SvREFCNT_inc(sv_dup((const SV *)s,t)))
10311 #define hv_dup(s,t)     MUTABLE_HV(sv_dup((const SV *)s,t))
10312 #define hv_dup_inc(s,t) MUTABLE_HV(SvREFCNT_inc(sv_dup((const SV *)s,t)))
10313 #define cv_dup(s,t)     MUTABLE_CV(sv_dup((const SV *)s,t))
10314 #define cv_dup_inc(s,t) MUTABLE_CV(SvREFCNT_inc(sv_dup((const SV *)s,t)))
10315 #define io_dup(s,t)     MUTABLE_IO(sv_dup((const SV *)s,t))
10316 #define io_dup_inc(s,t) MUTABLE_IO(SvREFCNT_inc(sv_dup((const SV *)s,t)))
10317 #define gv_dup(s,t)     MUTABLE_GV(sv_dup((const SV *)s,t))
10318 #define gv_dup_inc(s,t) MUTABLE_GV(SvREFCNT_inc(sv_dup((const SV *)s,t)))
10319 #define SAVEPV(p)       ((p) ? savepv(p) : NULL)
10320 #define SAVEPVN(p,n)    ((p) ? savepvn(p,n) : NULL)
10321
10322 /* clone a parser */
10323
10324 yy_parser *
10325 Perl_parser_dup(pTHX_ const yy_parser *const proto, CLONE_PARAMS *const param)
10326 {
10327     yy_parser *parser;
10328
10329     PERL_ARGS_ASSERT_PARSER_DUP;
10330
10331     if (!proto)
10332         return NULL;
10333
10334     /* look for it in the table first */
10335     parser = (yy_parser *)ptr_table_fetch(PL_ptr_table, proto);
10336     if (parser)
10337         return parser;
10338
10339     /* create anew and remember what it is */
10340     Newxz(parser, 1, yy_parser);
10341     ptr_table_store(PL_ptr_table, proto, parser);
10342
10343     parser->yyerrstatus = 0;
10344     parser->yychar = YYEMPTY;           /* Cause a token to be read.  */
10345
10346     /* XXX these not yet duped */
10347     parser->old_parser = NULL;
10348     parser->stack = NULL;
10349     parser->ps = NULL;
10350     parser->stack_size = 0;
10351     /* XXX parser->stack->state = 0; */
10352
10353     /* XXX eventually, just Copy() most of the parser struct ? */
10354
10355     parser->lex_brackets = proto->lex_brackets;
10356     parser->lex_casemods = proto->lex_casemods;
10357     parser->lex_brackstack = savepvn(proto->lex_brackstack,
10358                     (proto->lex_brackets < 120 ? 120 : proto->lex_brackets));
10359     parser->lex_casestack = savepvn(proto->lex_casestack,
10360                     (proto->lex_casemods < 12 ? 12 : proto->lex_casemods));
10361     parser->lex_defer   = proto->lex_defer;
10362     parser->lex_dojoin  = proto->lex_dojoin;
10363     parser->lex_expect  = proto->lex_expect;
10364     parser->lex_formbrack = proto->lex_formbrack;
10365     parser->lex_inpat   = proto->lex_inpat;
10366     parser->lex_inwhat  = proto->lex_inwhat;
10367     parser->lex_op      = proto->lex_op;
10368     parser->lex_repl    = sv_dup_inc(proto->lex_repl, param);
10369     parser->lex_starts  = proto->lex_starts;
10370     parser->lex_stuff   = sv_dup_inc(proto->lex_stuff, param);
10371     parser->multi_close = proto->multi_close;
10372     parser->multi_open  = proto->multi_open;
10373     parser->multi_start = proto->multi_start;
10374     parser->multi_end   = proto->multi_end;
10375     parser->pending_ident = proto->pending_ident;
10376     parser->preambled   = proto->preambled;
10377     parser->sublex_info = proto->sublex_info; /* XXX not quite right */
10378     parser->linestr     = sv_dup_inc(proto->linestr, param);
10379     parser->expect      = proto->expect;
10380     parser->copline     = proto->copline;
10381     parser->last_lop_op = proto->last_lop_op;
10382     parser->lex_state   = proto->lex_state;
10383     parser->rsfp        = fp_dup(proto->rsfp, '<', param);
10384     /* rsfp_filters entries have fake IoDIRP() */
10385     parser->rsfp_filters= av_dup_inc(proto->rsfp_filters, param);
10386     parser->in_my       = proto->in_my;
10387     parser->in_my_stash = hv_dup(proto->in_my_stash, param);
10388     parser->error_count = proto->error_count;
10389
10390
10391     parser->linestr     = sv_dup_inc(proto->linestr, param);
10392
10393     {
10394         char * const ols = SvPVX(proto->linestr);
10395         char * const ls  = SvPVX(parser->linestr);
10396
10397         parser->bufptr      = ls + (proto->bufptr >= ols ?
10398                                     proto->bufptr -  ols : 0);
10399         parser->oldbufptr   = ls + (proto->oldbufptr >= ols ?
10400                                     proto->oldbufptr -  ols : 0);
10401         parser->oldoldbufptr= ls + (proto->oldoldbufptr >= ols ?
10402                                     proto->oldoldbufptr -  ols : 0);
10403         parser->linestart   = ls + (proto->linestart >= ols ?
10404                                     proto->linestart -  ols : 0);
10405         parser->last_uni    = ls + (proto->last_uni >= ols ?
10406                                     proto->last_uni -  ols : 0);
10407         parser->last_lop    = ls + (proto->last_lop >= ols ?
10408                                     proto->last_lop -  ols : 0);
10409
10410         parser->bufend      = ls + SvCUR(parser->linestr);
10411     }
10412
10413     Copy(proto->tokenbuf, parser->tokenbuf, 256, char);
10414
10415
10416 #ifdef PERL_MAD
10417     parser->endwhite    = proto->endwhite;
10418     parser->faketokens  = proto->faketokens;
10419     parser->lasttoke    = proto->lasttoke;
10420     parser->nextwhite   = proto->nextwhite;
10421     parser->realtokenstart = proto->realtokenstart;
10422     parser->skipwhite   = proto->skipwhite;
10423     parser->thisclose   = proto->thisclose;
10424     parser->thismad     = proto->thismad;
10425     parser->thisopen    = proto->thisopen;
10426     parser->thisstuff   = proto->thisstuff;
10427     parser->thistoken   = proto->thistoken;
10428     parser->thiswhite   = proto->thiswhite;
10429
10430     Copy(proto->nexttoke, parser->nexttoke, 5, NEXTTOKE);
10431     parser->curforce    = proto->curforce;
10432 #else
10433     Copy(proto->nextval, parser->nextval, 5, YYSTYPE);
10434     Copy(proto->nexttype, parser->nexttype, 5,  I32);
10435     parser->nexttoke    = proto->nexttoke;
10436 #endif
10437     return parser;
10438 }
10439
10440
10441 /* duplicate a file handle */
10442
10443 PerlIO *
10444 Perl_fp_dup(pTHX_ PerlIO *const fp, const char type, CLONE_PARAMS *const param)
10445 {
10446     PerlIO *ret;
10447
10448     PERL_ARGS_ASSERT_FP_DUP;
10449     PERL_UNUSED_ARG(type);
10450
10451     if (!fp)
10452         return (PerlIO*)NULL;
10453
10454     /* look for it in the table first */
10455     ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
10456     if (ret)
10457         return ret;
10458
10459     /* create anew and remember what it is */
10460     ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
10461     ptr_table_store(PL_ptr_table, fp, ret);
10462     return ret;
10463 }
10464
10465 /* duplicate a directory handle */
10466
10467 DIR *
10468 Perl_dirp_dup(pTHX_ DIR *const dp)
10469 {
10470     PERL_UNUSED_CONTEXT;
10471     if (!dp)
10472         return (DIR*)NULL;
10473     /* XXX TODO */
10474     return dp;
10475 }
10476
10477 /* duplicate a typeglob */
10478
10479 GP *
10480 Perl_gp_dup(pTHX_ GP *const gp, CLONE_PARAMS *const param)
10481 {
10482     GP *ret;
10483
10484     PERL_ARGS_ASSERT_GP_DUP;
10485
10486     if (!gp)
10487         return (GP*)NULL;
10488     /* look for it in the table first */
10489     ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
10490     if (ret)
10491         return ret;
10492
10493     /* create anew and remember what it is */
10494     Newxz(ret, 1, GP);
10495     ptr_table_store(PL_ptr_table, gp, ret);
10496
10497     /* clone */
10498     ret->gp_refcnt      = 0;                    /* must be before any other dups! */
10499     ret->gp_sv          = sv_dup_inc(gp->gp_sv, param);
10500     ret->gp_io          = io_dup_inc(gp->gp_io, param);
10501     ret->gp_form        = cv_dup_inc(gp->gp_form, param);
10502     ret->gp_av          = av_dup_inc(gp->gp_av, param);
10503     ret->gp_hv          = hv_dup_inc(gp->gp_hv, param);
10504     ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
10505     ret->gp_cv          = cv_dup_inc(gp->gp_cv, param);
10506     ret->gp_cvgen       = gp->gp_cvgen;
10507     ret->gp_line        = gp->gp_line;
10508     ret->gp_file_hek    = gp->gp_file_hek ? hek_dup(gp->gp_file_hek, param) : NULL;
10509     return ret;
10510 }
10511
10512 /* duplicate a chain of magic */
10513
10514 MAGIC *
10515 Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS *const param)
10516 {
10517     MAGIC *mgprev = (MAGIC*)NULL;
10518     MAGIC *mgret;
10519
10520     PERL_ARGS_ASSERT_MG_DUP;
10521
10522     if (!mg)
10523         return (MAGIC*)NULL;
10524     /* look for it in the table first */
10525     mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
10526     if (mgret)
10527         return mgret;
10528
10529     for (; mg; mg = mg->mg_moremagic) {
10530         MAGIC *nmg;
10531         Newxz(nmg, 1, MAGIC);
10532         if (mgprev)
10533             mgprev->mg_moremagic = nmg;
10534         else
10535             mgret = nmg;
10536         nmg->mg_virtual = mg->mg_virtual;       /* XXX copy dynamic vtable? */
10537         nmg->mg_private = mg->mg_private;
10538         nmg->mg_type    = mg->mg_type;
10539         nmg->mg_flags   = mg->mg_flags;
10540         /* FIXME for plugins
10541         if (mg->mg_type == PERL_MAGIC_qr) {
10542             nmg->mg_obj = MUTABLE_SV(CALLREGDUPE((REGEXP*)mg->mg_obj, param));
10543         }
10544         else
10545         */
10546         if(mg->mg_type == PERL_MAGIC_backref) {
10547             /* The backref AV has its reference count deliberately bumped by
10548                1.  */
10549             nmg->mg_obj
10550                 = SvREFCNT_inc(av_dup_inc((const AV *) mg->mg_obj, param));
10551         }
10552         else {
10553             nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
10554                               ? sv_dup_inc(mg->mg_obj, param)
10555                               : sv_dup(mg->mg_obj, param);
10556         }
10557         nmg->mg_len     = mg->mg_len;
10558         nmg->mg_ptr     = mg->mg_ptr;   /* XXX random ptr? */
10559         if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
10560             if (mg->mg_len > 0) {
10561                 nmg->mg_ptr     = SAVEPVN(mg->mg_ptr, mg->mg_len);
10562                 if (mg->mg_type == PERL_MAGIC_overload_table &&
10563                         AMT_AMAGIC((AMT*)mg->mg_ptr))
10564                 {
10565                     const AMT * const amtp = (AMT*)mg->mg_ptr;
10566                     AMT * const namtp = (AMT*)nmg->mg_ptr;
10567                     I32 i;
10568                     for (i = 1; i < NofAMmeth; i++) {
10569                         namtp->table[i] = cv_dup_inc(amtp->table[i], param);
10570                     }
10571                 }
10572             }
10573             else if (mg->mg_len == HEf_SVKEY)
10574                 nmg->mg_ptr = (char*)sv_dup_inc((const SV *)mg->mg_ptr, param);
10575         }
10576         if ((mg->mg_flags & MGf_DUP) && mg->mg_virtual && mg->mg_virtual->svt_dup) {
10577             CALL_FPTR(nmg->mg_virtual->svt_dup)(aTHX_ nmg, param);
10578         }
10579         mgprev = nmg;
10580     }
10581     return mgret;
10582 }
10583
10584 #endif /* USE_ITHREADS */
10585
10586 /* create a new pointer-mapping table */
10587
10588 PTR_TBL_t *
10589 Perl_ptr_table_new(pTHX)
10590 {
10591     PTR_TBL_t *tbl;
10592     PERL_UNUSED_CONTEXT;
10593
10594     Newxz(tbl, 1, PTR_TBL_t);
10595     tbl->tbl_max        = 511;
10596     tbl->tbl_items      = 0;
10597     Newxz(tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
10598     return tbl;
10599 }
10600
10601 #define PTR_TABLE_HASH(ptr) \
10602   ((PTR2UV(ptr) >> 3) ^ (PTR2UV(ptr) >> (3 + 7)) ^ (PTR2UV(ptr) >> (3 + 17)))
10603
10604 /* 
10605    we use the PTE_SVSLOT 'reservation' made above, both here (in the
10606    following define) and at call to new_body_inline made below in 
10607    Perl_ptr_table_store()
10608  */
10609
10610 #define del_pte(p)     del_body_type(p, PTE_SVSLOT)
10611
10612 /* map an existing pointer using a table */
10613
10614 STATIC PTR_TBL_ENT_t *
10615 S_ptr_table_find(PTR_TBL_t *const tbl, const void *const sv)
10616 {
10617     PTR_TBL_ENT_t *tblent;
10618     const UV hash = PTR_TABLE_HASH(sv);
10619
10620     PERL_ARGS_ASSERT_PTR_TABLE_FIND;
10621
10622     tblent = tbl->tbl_ary[hash & tbl->tbl_max];
10623     for (; tblent; tblent = tblent->next) {
10624         if (tblent->oldval == sv)
10625             return tblent;
10626     }
10627     return NULL;
10628 }
10629
10630 void *
10631 Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *const tbl, const void *const sv)
10632 {
10633     PTR_TBL_ENT_t const *const tblent = ptr_table_find(tbl, sv);
10634
10635     PERL_ARGS_ASSERT_PTR_TABLE_FETCH;
10636     PERL_UNUSED_CONTEXT;
10637
10638     return tblent ? tblent->newval : NULL;
10639 }
10640
10641 /* add a new entry to a pointer-mapping table */
10642
10643 void
10644 Perl_ptr_table_store(pTHX_ PTR_TBL_t *const tbl, const void *const oldsv, void *const newsv)
10645 {
10646     PTR_TBL_ENT_t *tblent = ptr_table_find(tbl, oldsv);
10647
10648     PERL_ARGS_ASSERT_PTR_TABLE_STORE;
10649     PERL_UNUSED_CONTEXT;
10650
10651     if (tblent) {
10652         tblent->newval = newsv;
10653     } else {
10654         const UV entry = PTR_TABLE_HASH(oldsv) & tbl->tbl_max;
10655
10656         new_body_inline(tblent, PTE_SVSLOT);
10657
10658         tblent->oldval = oldsv;
10659         tblent->newval = newsv;
10660         tblent->next = tbl->tbl_ary[entry];
10661         tbl->tbl_ary[entry] = tblent;
10662         tbl->tbl_items++;
10663         if (tblent->next && tbl->tbl_items > tbl->tbl_max)
10664             ptr_table_split(tbl);
10665     }
10666 }
10667
10668 /* double the hash bucket size of an existing ptr table */
10669
10670 void
10671 Perl_ptr_table_split(pTHX_ PTR_TBL_t *const tbl)
10672 {
10673     PTR_TBL_ENT_t **ary = tbl->tbl_ary;
10674     const UV oldsize = tbl->tbl_max + 1;
10675     UV newsize = oldsize * 2;
10676     UV i;
10677
10678     PERL_ARGS_ASSERT_PTR_TABLE_SPLIT;
10679     PERL_UNUSED_CONTEXT;
10680
10681     Renew(ary, newsize, PTR_TBL_ENT_t*);
10682     Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
10683     tbl->tbl_max = --newsize;
10684     tbl->tbl_ary = ary;
10685     for (i=0; i < oldsize; i++, ary++) {
10686         PTR_TBL_ENT_t **curentp, **entp, *ent;
10687         if (!*ary)
10688             continue;
10689         curentp = ary + oldsize;
10690         for (entp = ary, ent = *ary; ent; ent = *entp) {
10691             if ((newsize & PTR_TABLE_HASH(ent->oldval)) != i) {
10692                 *entp = ent->next;
10693                 ent->next = *curentp;
10694                 *curentp = ent;
10695                 continue;
10696             }
10697             else
10698                 entp = &ent->next;
10699         }
10700     }
10701 }
10702
10703 /* remove all the entries from a ptr table */
10704
10705 void
10706 Perl_ptr_table_clear(pTHX_ PTR_TBL_t *const tbl)
10707 {
10708     if (tbl && tbl->tbl_items) {
10709         register PTR_TBL_ENT_t * const * const array = tbl->tbl_ary;
10710         UV riter = tbl->tbl_max;
10711
10712         do {
10713             PTR_TBL_ENT_t *entry = array[riter];
10714
10715             while (entry) {
10716                 PTR_TBL_ENT_t * const oentry = entry;
10717                 entry = entry->next;
10718                 del_pte(oentry);
10719             }
10720         } while (riter--);
10721
10722         tbl->tbl_items = 0;
10723     }
10724 }
10725
10726 /* clear and free a ptr table */
10727
10728 void
10729 Perl_ptr_table_free(pTHX_ PTR_TBL_t *const tbl)
10730 {
10731     if (!tbl) {
10732         return;
10733     }
10734     ptr_table_clear(tbl);
10735     Safefree(tbl->tbl_ary);
10736     Safefree(tbl);
10737 }
10738
10739 #if defined(USE_ITHREADS)
10740
10741 void
10742 Perl_rvpv_dup(pTHX_ SV *const dstr, const SV *const sstr, CLONE_PARAMS *const param)
10743 {
10744     PERL_ARGS_ASSERT_RVPV_DUP;
10745
10746     if (SvROK(sstr)) {
10747         SvRV_set(dstr, SvWEAKREF(sstr)
10748                        ? sv_dup(SvRV_const(sstr), param)
10749                        : sv_dup_inc(SvRV_const(sstr), param));
10750
10751     }
10752     else if (SvPVX_const(sstr)) {
10753         /* Has something there */
10754         if (SvLEN(sstr)) {
10755             /* Normal PV - clone whole allocated space */
10756             SvPV_set(dstr, SAVEPVN(SvPVX_const(sstr), SvLEN(sstr)-1));
10757             if (SvREADONLY(sstr) && SvFAKE(sstr)) {
10758                 /* Not that normal - actually sstr is copy on write.
10759                    But we are a true, independant SV, so:  */
10760                 SvREADONLY_off(dstr);
10761                 SvFAKE_off(dstr);
10762             }
10763         }
10764         else {
10765             /* Special case - not normally malloced for some reason */
10766             if (isGV_with_GP(sstr)) {
10767                 /* Don't need to do anything here.  */
10768             }
10769             else if ((SvREADONLY(sstr) && SvFAKE(sstr))) {
10770                 /* A "shared" PV - clone it as "shared" PV */
10771                 SvPV_set(dstr,
10772                          HEK_KEY(hek_dup(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)),
10773                                          param)));
10774             }
10775             else {
10776                 /* Some other special case - random pointer */
10777                 SvPV_set(dstr, (char *) SvPVX_const(sstr));             
10778             }
10779         }
10780     }
10781     else {
10782         /* Copy the NULL */
10783         SvPV_set(dstr, NULL);
10784     }
10785 }
10786
10787 /* duplicate an SV of any type (including AV, HV etc) */
10788
10789 SV *
10790 Perl_sv_dup(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
10791 {
10792     dVAR;
10793     SV *dstr;
10794
10795     PERL_ARGS_ASSERT_SV_DUP;
10796
10797     if (!sstr)
10798         return NULL;
10799     if (SvTYPE(sstr) == SVTYPEMASK) {
10800 #ifdef DEBUG_LEAKING_SCALARS_ABORT
10801         abort();
10802 #endif
10803         return NULL;
10804     }
10805     /* look for it in the table first */
10806     dstr = MUTABLE_SV(ptr_table_fetch(PL_ptr_table, sstr));
10807     if (dstr)
10808         return dstr;
10809
10810     if(param->flags & CLONEf_JOIN_IN) {
10811         /** We are joining here so we don't want do clone
10812             something that is bad **/
10813         if (SvTYPE(sstr) == SVt_PVHV) {
10814             const HEK * const hvname = HvNAME_HEK(sstr);
10815             if (hvname)
10816                 /** don't clone stashes if they already exist **/
10817                 return MUTABLE_SV(gv_stashpvn(HEK_KEY(hvname), HEK_LEN(hvname), 0));
10818         }
10819     }
10820
10821     /* create anew and remember what it is */
10822     new_SV(dstr);
10823
10824 #ifdef DEBUG_LEAKING_SCALARS
10825     dstr->sv_debug_optype = sstr->sv_debug_optype;
10826     dstr->sv_debug_line = sstr->sv_debug_line;
10827     dstr->sv_debug_inpad = sstr->sv_debug_inpad;
10828     dstr->sv_debug_cloned = 1;
10829     dstr->sv_debug_file = savepv(sstr->sv_debug_file);
10830 #endif
10831
10832     ptr_table_store(PL_ptr_table, sstr, dstr);
10833
10834     /* clone */
10835     SvFLAGS(dstr)       = SvFLAGS(sstr);
10836     SvFLAGS(dstr)       &= ~SVf_OOK;            /* don't propagate OOK hack */
10837     SvREFCNT(dstr)      = 0;                    /* must be before any other dups! */
10838
10839 #ifdef DEBUGGING
10840     if (SvANY(sstr) && PL_watch_pvx && SvPVX_const(sstr) == PL_watch_pvx)
10841         PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
10842                       (void*)PL_watch_pvx, SvPVX_const(sstr));
10843 #endif
10844
10845     /* don't clone objects whose class has asked us not to */
10846     if (SvOBJECT(sstr) && ! (SvFLAGS(SvSTASH(sstr)) & SVphv_CLONEABLE)) {
10847         SvFLAGS(dstr) = 0;
10848         return dstr;
10849     }
10850
10851     switch (SvTYPE(sstr)) {
10852     case SVt_NULL:
10853         SvANY(dstr)     = NULL;
10854         break;
10855     case SVt_IV:
10856         SvANY(dstr)     = (XPVIV*)((char*)&(dstr->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
10857         if(SvROK(sstr)) {
10858             Perl_rvpv_dup(aTHX_ dstr, sstr, param);
10859         } else {
10860             SvIV_set(dstr, SvIVX(sstr));
10861         }
10862         break;
10863     case SVt_NV:
10864         SvANY(dstr)     = new_XNV();
10865         SvNV_set(dstr, SvNVX(sstr));
10866         break;
10867         /* case SVt_BIND: */
10868     default:
10869         {
10870             /* These are all the types that need complex bodies allocating.  */
10871             void *new_body;
10872             const svtype sv_type = SvTYPE(sstr);
10873             const struct body_details *const sv_type_details
10874                 = bodies_by_type + sv_type;
10875
10876             switch (sv_type) {
10877             default:
10878                 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
10879                 break;
10880
10881             case SVt_PVGV:
10882             case SVt_PVIO:
10883             case SVt_PVFM:
10884             case SVt_PVHV:
10885             case SVt_PVAV:
10886             case SVt_PVCV:
10887             case SVt_PVLV:
10888             case SVt_REGEXP:
10889             case SVt_PVMG:
10890             case SVt_PVNV:
10891             case SVt_PVIV:
10892             case SVt_PV:
10893                 assert(sv_type_details->body_size);
10894                 if (sv_type_details->arena) {
10895                     new_body_inline(new_body, sv_type);
10896                     new_body
10897                         = (void*)((char*)new_body - sv_type_details->offset);
10898                 } else {
10899                     new_body = new_NOARENA(sv_type_details);
10900                 }
10901             }
10902             assert(new_body);
10903             SvANY(dstr) = new_body;
10904
10905 #ifndef PURIFY
10906             Copy(((char*)SvANY(sstr)) + sv_type_details->offset,
10907                  ((char*)SvANY(dstr)) + sv_type_details->offset,
10908                  sv_type_details->copy, char);
10909 #else
10910             Copy(((char*)SvANY(sstr)),
10911                  ((char*)SvANY(dstr)),
10912                  sv_type_details->body_size + sv_type_details->offset, char);
10913 #endif
10914
10915             if (sv_type != SVt_PVAV && sv_type != SVt_PVHV
10916                 && !isGV_with_GP(dstr))
10917                 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
10918
10919             /* The Copy above means that all the source (unduplicated) pointers
10920                are now in the destination.  We can check the flags and the
10921                pointers in either, but it's possible that there's less cache
10922                missing by always going for the destination.
10923                FIXME - instrument and check that assumption  */
10924             if (sv_type >= SVt_PVMG) {
10925                 if ((sv_type == SVt_PVMG) && SvPAD_OUR(dstr)) {
10926                     SvOURSTASH_set(dstr, hv_dup_inc(SvOURSTASH(dstr), param));
10927                 } else if (SvMAGIC(dstr))
10928                     SvMAGIC_set(dstr, mg_dup(SvMAGIC(dstr), param));
10929                 if (SvSTASH(dstr))
10930                     SvSTASH_set(dstr, hv_dup_inc(SvSTASH(dstr), param));
10931             }
10932
10933             /* The cast silences a GCC warning about unhandled types.  */
10934             switch ((int)sv_type) {
10935             case SVt_PV:
10936                 break;
10937             case SVt_PVIV:
10938                 break;
10939             case SVt_PVNV:
10940                 break;
10941             case SVt_PVMG:
10942                 break;
10943             case SVt_REGEXP:
10944                 /* FIXME for plugins */
10945                 re_dup_guts((REGEXP*) sstr, (REGEXP*) dstr, param);
10946                 break;
10947             case SVt_PVLV:
10948                 /* XXX LvTARGOFF sometimes holds PMOP* when DEBUGGING */
10949                 if (LvTYPE(dstr) == 't') /* for tie: unrefcnted fake (SV**) */
10950                     LvTARG(dstr) = dstr;
10951                 else if (LvTYPE(dstr) == 'T') /* for tie: fake HE */
10952                     LvTARG(dstr) = MUTABLE_SV(he_dup((HE*)LvTARG(dstr), 0, param));
10953                 else
10954                     LvTARG(dstr) = sv_dup_inc(LvTARG(dstr), param);
10955             case SVt_PVGV:
10956                 if(isGV_with_GP(sstr)) {
10957                     if (GvNAME_HEK(dstr))
10958                         GvNAME_HEK(dstr) = hek_dup(GvNAME_HEK(dstr), param);
10959                     /* Don't call sv_add_backref here as it's going to be
10960                        created as part of the magic cloning of the symbol
10961                        table.  */
10962                     /* Danger Will Robinson - GvGP(dstr) isn't initialised
10963                        at the point of this comment.  */
10964                     GvSTASH(dstr) = hv_dup(GvSTASH(dstr), param);
10965                     GvGP(dstr)  = gp_dup(GvGP(sstr), param);
10966                     (void)GpREFCNT_inc(GvGP(dstr));
10967                 } else
10968                     Perl_rvpv_dup(aTHX_ dstr, sstr, param);
10969                 break;
10970             case SVt_PVIO:
10971                 IoIFP(dstr)     = fp_dup(IoIFP(dstr), IoTYPE(dstr), param);
10972                 if (IoOFP(dstr) == IoIFP(sstr))
10973                     IoOFP(dstr) = IoIFP(dstr);
10974                 else
10975                     IoOFP(dstr) = fp_dup(IoOFP(dstr), IoTYPE(dstr), param);
10976                 /* PL_parser->rsfp_filters entries have fake IoDIRP() */
10977                 if(IoFLAGS(dstr) & IOf_FAKE_DIRP) {
10978                     /* I have no idea why fake dirp (rsfps)
10979                        should be treated differently but otherwise
10980                        we end up with leaks -- sky*/
10981                     IoTOP_GV(dstr)      = gv_dup_inc(IoTOP_GV(dstr), param);
10982                     IoFMT_GV(dstr)      = gv_dup_inc(IoFMT_GV(dstr), param);
10983                     IoBOTTOM_GV(dstr)   = gv_dup_inc(IoBOTTOM_GV(dstr), param);
10984                 } else {
10985                     IoTOP_GV(dstr)      = gv_dup(IoTOP_GV(dstr), param);
10986                     IoFMT_GV(dstr)      = gv_dup(IoFMT_GV(dstr), param);
10987                     IoBOTTOM_GV(dstr)   = gv_dup(IoBOTTOM_GV(dstr), param);
10988                     if (IoDIRP(dstr)) {
10989                         IoDIRP(dstr)    = dirp_dup(IoDIRP(dstr));
10990                     } else {
10991                         NOOP;
10992                         /* IoDIRP(dstr) is already a copy of IoDIRP(sstr)  */
10993                     }
10994                 }
10995                 IoTOP_NAME(dstr)        = SAVEPV(IoTOP_NAME(dstr));
10996                 IoFMT_NAME(dstr)        = SAVEPV(IoFMT_NAME(dstr));
10997                 IoBOTTOM_NAME(dstr)     = SAVEPV(IoBOTTOM_NAME(dstr));
10998                 break;
10999             case SVt_PVAV:
11000                 /* avoid cloning an empty array */
11001                 if (AvARRAY((const AV *)sstr) && AvFILLp((const AV *)sstr) >= 0) {
11002                     SV **dst_ary, **src_ary;
11003                     SSize_t items = AvFILLp((const AV *)sstr) + 1;
11004
11005                     src_ary = AvARRAY((const AV *)sstr);
11006                     Newxz(dst_ary, AvMAX((const AV *)sstr)+1, SV*);
11007                     ptr_table_store(PL_ptr_table, src_ary, dst_ary);
11008                     AvARRAY(MUTABLE_AV(dstr)) = dst_ary;
11009                     AvALLOC((const AV *)dstr) = dst_ary;
11010                     if (AvREAL((const AV *)sstr)) {
11011                         while (items-- > 0)
11012                             *dst_ary++ = sv_dup_inc(*src_ary++, param);
11013                     }
11014                     else {
11015                         while (items-- > 0)
11016                             *dst_ary++ = sv_dup(*src_ary++, param);
11017                     }
11018                     items = AvMAX((const AV *)sstr) - AvFILLp((const AV *)sstr);
11019                     while (items-- > 0) {
11020                         *dst_ary++ = &PL_sv_undef;
11021                     }
11022                 }
11023                 else {
11024                     AvARRAY(MUTABLE_AV(dstr))   = NULL;
11025                     AvALLOC((const AV *)dstr)   = (SV**)NULL;
11026                     AvMAX(  (const AV *)dstr)   = -1;
11027                     AvFILLp((const AV *)dstr)   = -1;
11028                 }
11029                 break;
11030             case SVt_PVHV:
11031                 if (HvARRAY((const HV *)sstr)) {
11032                     STRLEN i = 0;
11033                     const bool sharekeys = !!HvSHAREKEYS(sstr);
11034                     XPVHV * const dxhv = (XPVHV*)SvANY(dstr);
11035                     XPVHV * const sxhv = (XPVHV*)SvANY(sstr);
11036                     char *darray;
11037                     Newx(darray, PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1)
11038                         + (SvOOK(sstr) ? sizeof(struct xpvhv_aux) : 0),
11039                         char);
11040                     HvARRAY(dstr) = (HE**)darray;
11041                     while (i <= sxhv->xhv_max) {
11042                         const HE * const source = HvARRAY(sstr)[i];
11043                         HvARRAY(dstr)[i] = source
11044                             ? he_dup(source, sharekeys, param) : 0;
11045                         ++i;
11046                     }
11047                     if (SvOOK(sstr)) {
11048                         HEK *hvname;
11049                         const struct xpvhv_aux * const saux = HvAUX(sstr);
11050                         struct xpvhv_aux * const daux = HvAUX(dstr);
11051                         /* This flag isn't copied.  */
11052                         /* SvOOK_on(hv) attacks the IV flags.  */
11053                         SvFLAGS(dstr) |= SVf_OOK;
11054
11055                         hvname = saux->xhv_name;
11056                         daux->xhv_name = hvname ? hek_dup(hvname, param) : hvname;
11057
11058                         daux->xhv_riter = saux->xhv_riter;
11059                         daux->xhv_eiter = saux->xhv_eiter
11060                             ? he_dup(saux->xhv_eiter,
11061                                         (bool)!!HvSHAREKEYS(sstr), param) : 0;
11062                         /* backref array needs refcnt=2; see sv_add_backref */
11063                         daux->xhv_backreferences =
11064                             saux->xhv_backreferences
11065                             ? MUTABLE_AV(SvREFCNT_inc(
11066                                                       sv_dup_inc((const SV *)saux->xhv_backreferences, param)))
11067                                 : 0;
11068
11069                         daux->xhv_mro_meta = saux->xhv_mro_meta
11070                             ? mro_meta_dup(saux->xhv_mro_meta, param)
11071                             : 0;
11072
11073                         /* Record stashes for possible cloning in Perl_clone(). */
11074                         if (hvname)
11075                             av_push(param->stashes, dstr);
11076                     }
11077                 }
11078                 else
11079                     HvARRAY(MUTABLE_HV(dstr)) = NULL;
11080                 break;
11081             case SVt_PVCV:
11082                 if (!(param->flags & CLONEf_COPY_STACKS)) {
11083                     CvDEPTH(dstr) = 0;
11084                 }
11085             case SVt_PVFM:
11086                 /* NOTE: not refcounted */
11087                 CvSTASH(dstr)   = hv_dup(CvSTASH(dstr), param);
11088                 OP_REFCNT_LOCK;
11089                 if (!CvISXSUB(dstr))
11090                     CvROOT(dstr) = OpREFCNT_inc(CvROOT(dstr));
11091                 OP_REFCNT_UNLOCK;
11092                 if (CvCONST(dstr) && CvISXSUB(dstr)) {
11093                     CvXSUBANY(dstr).any_ptr =
11094                         sv_dup_inc((const SV *)CvXSUBANY(dstr).any_ptr, param);
11095                 }
11096                 /* don't dup if copying back - CvGV isn't refcounted, so the
11097                  * duped GV may never be freed. A bit of a hack! DAPM */
11098                 CvGV(dstr)      = (param->flags & CLONEf_JOIN_IN) ?
11099                     NULL : gv_dup(CvGV(dstr), param) ;
11100                 PAD_DUP(CvPADLIST(dstr), CvPADLIST(sstr), param);
11101                 CvOUTSIDE(dstr) =
11102                     CvWEAKOUTSIDE(sstr)
11103                     ? cv_dup(    CvOUTSIDE(dstr), param)
11104                     : cv_dup_inc(CvOUTSIDE(dstr), param);
11105                 if (!CvISXSUB(dstr))
11106                     CvFILE(dstr) = SAVEPV(CvFILE(dstr));
11107                 break;
11108             }
11109         }
11110     }
11111
11112     if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
11113         ++PL_sv_objcount;
11114
11115     return dstr;
11116  }
11117
11118 /* duplicate a context */
11119
11120 PERL_CONTEXT *
11121 Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
11122 {
11123     PERL_CONTEXT *ncxs;
11124
11125     PERL_ARGS_ASSERT_CX_DUP;
11126
11127     if (!cxs)
11128         return (PERL_CONTEXT*)NULL;
11129
11130     /* look for it in the table first */
11131     ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
11132     if (ncxs)
11133         return ncxs;
11134
11135     /* create anew and remember what it is */
11136     Newx(ncxs, max + 1, PERL_CONTEXT);
11137     ptr_table_store(PL_ptr_table, cxs, ncxs);
11138     Copy(cxs, ncxs, max + 1, PERL_CONTEXT);
11139
11140     while (ix >= 0) {
11141         PERL_CONTEXT * const ncx = &ncxs[ix];
11142         if (CxTYPE(ncx) == CXt_SUBST) {
11143             Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
11144         }
11145         else {
11146             switch (CxTYPE(ncx)) {
11147             case CXt_SUB:
11148                 ncx->blk_sub.cv         = (ncx->blk_sub.olddepth == 0
11149                                            ? cv_dup_inc(ncx->blk_sub.cv, param)
11150                                            : cv_dup(ncx->blk_sub.cv,param));
11151                 ncx->blk_sub.argarray   = (CxHASARGS(ncx)
11152                                            ? av_dup_inc(ncx->blk_sub.argarray,
11153                                                         param)
11154                                            : NULL);
11155                 ncx->blk_sub.savearray  = av_dup_inc(ncx->blk_sub.savearray,
11156                                                      param);
11157                 ncx->blk_sub.oldcomppad = (PAD*)ptr_table_fetch(PL_ptr_table,
11158                                            ncx->blk_sub.oldcomppad);
11159                 break;
11160             case CXt_EVAL:
11161                 ncx->blk_eval.old_namesv = sv_dup_inc(ncx->blk_eval.old_namesv,
11162                                                       param);
11163                 ncx->blk_eval.cur_text  = sv_dup(ncx->blk_eval.cur_text, param);
11164                 break;
11165             case CXt_LOOP_LAZYSV:
11166                 ncx->blk_loop.state_u.lazysv.end
11167                     = sv_dup_inc(ncx->blk_loop.state_u.lazysv.end, param);
11168                 /* We are taking advantage of av_dup_inc and sv_dup_inc
11169                    actually being the same function, and order equivalance of
11170                    the two unions.
11171                    We can assert the later [but only at run time :-(]  */
11172                 assert ((void *) &ncx->blk_loop.state_u.ary.ary ==
11173                         (void *) &ncx->blk_loop.state_u.lazysv.cur);
11174             case CXt_LOOP_FOR:
11175                 ncx->blk_loop.state_u.ary.ary
11176                     = av_dup_inc(ncx->blk_loop.state_u.ary.ary, param);
11177             case CXt_LOOP_LAZYIV:
11178             case CXt_LOOP_PLAIN:
11179                 if (CxPADLOOP(ncx)) {
11180                     ncx->blk_loop.oldcomppad
11181                         = (PAD*)ptr_table_fetch(PL_ptr_table,
11182                                                 ncx->blk_loop.oldcomppad);
11183                 } else {
11184                     ncx->blk_loop.oldcomppad
11185                         = (PAD*)gv_dup((const GV *)ncx->blk_loop.oldcomppad,
11186                                        param);
11187                 }
11188                 break;
11189             case CXt_FORMAT:
11190                 ncx->blk_format.cv      = cv_dup(ncx->blk_format.cv, param);
11191                 ncx->blk_format.gv      = gv_dup(ncx->blk_format.gv, param);
11192                 ncx->blk_format.dfoutgv = gv_dup_inc(ncx->blk_format.dfoutgv,
11193                                                      param);
11194                 break;
11195             case CXt_BLOCK:
11196             case CXt_NULL:
11197                 break;
11198             }
11199         }
11200         --ix;
11201     }
11202     return ncxs;
11203 }
11204
11205 /* duplicate a stack info structure */
11206
11207 PERL_SI *
11208 Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
11209 {
11210     PERL_SI *nsi;
11211
11212     PERL_ARGS_ASSERT_SI_DUP;
11213
11214     if (!si)
11215         return (PERL_SI*)NULL;
11216
11217     /* look for it in the table first */
11218     nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
11219     if (nsi)
11220         return nsi;
11221
11222     /* create anew and remember what it is */
11223     Newxz(nsi, 1, PERL_SI);
11224     ptr_table_store(PL_ptr_table, si, nsi);
11225
11226     nsi->si_stack       = av_dup_inc(si->si_stack, param);
11227     nsi->si_cxix        = si->si_cxix;
11228     nsi->si_cxmax       = si->si_cxmax;
11229     nsi->si_cxstack     = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
11230     nsi->si_type        = si->si_type;
11231     nsi->si_prev        = si_dup(si->si_prev, param);
11232     nsi->si_next        = si_dup(si->si_next, param);
11233     nsi->si_markoff     = si->si_markoff;
11234
11235     return nsi;
11236 }
11237
11238 #define POPINT(ss,ix)   ((ss)[--(ix)].any_i32)
11239 #define TOPINT(ss,ix)   ((ss)[ix].any_i32)
11240 #define POPLONG(ss,ix)  ((ss)[--(ix)].any_long)
11241 #define TOPLONG(ss,ix)  ((ss)[ix].any_long)
11242 #define POPIV(ss,ix)    ((ss)[--(ix)].any_iv)
11243 #define TOPIV(ss,ix)    ((ss)[ix].any_iv)
11244 #define POPBOOL(ss,ix)  ((ss)[--(ix)].any_bool)
11245 #define TOPBOOL(ss,ix)  ((ss)[ix].any_bool)
11246 #define POPPTR(ss,ix)   ((ss)[--(ix)].any_ptr)
11247 #define TOPPTR(ss,ix)   ((ss)[ix].any_ptr)
11248 #define POPDPTR(ss,ix)  ((ss)[--(ix)].any_dptr)
11249 #define TOPDPTR(ss,ix)  ((ss)[ix].any_dptr)
11250 #define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
11251 #define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
11252
11253 /* XXXXX todo */
11254 #define pv_dup_inc(p)   SAVEPV(p)
11255 #define pv_dup(p)       SAVEPV(p)
11256 #define svp_dup_inc(p,pp)       any_dup(p,pp)
11257
11258 /* map any object to the new equivent - either something in the
11259  * ptr table, or something in the interpreter structure
11260  */
11261
11262 void *
11263 Perl_any_dup(pTHX_ void *v, const PerlInterpreter *proto_perl)
11264 {
11265     void *ret;
11266
11267     PERL_ARGS_ASSERT_ANY_DUP;
11268
11269     if (!v)
11270         return (void*)NULL;
11271
11272     /* look for it in the table first */
11273     ret = ptr_table_fetch(PL_ptr_table, v);
11274     if (ret)
11275         return ret;
11276
11277     /* see if it is part of the interpreter structure */
11278     if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
11279         ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
11280     else {
11281         ret = v;
11282     }
11283
11284     return ret;
11285 }
11286
11287 /* duplicate the save stack */
11288
11289 ANY *
11290 Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
11291 {
11292     dVAR;
11293     ANY * const ss      = proto_perl->Isavestack;
11294     const I32 max       = proto_perl->Isavestack_max;
11295     I32 ix              = proto_perl->Isavestack_ix;
11296     ANY *nss;
11297     const SV *sv;
11298     const GV *gv;
11299     const AV *av;
11300     const HV *hv;
11301     void* ptr;
11302     int intval;
11303     long longval;
11304     GP *gp;
11305     IV iv;
11306     I32 i;
11307     char *c = NULL;
11308     void (*dptr) (void*);
11309     void (*dxptr) (pTHX_ void*);
11310
11311     PERL_ARGS_ASSERT_SS_DUP;
11312
11313     Newxz(nss, max, ANY);
11314
11315     while (ix > 0) {
11316         const I32 type = POPINT(ss,ix);
11317         TOPINT(nss,ix) = type;
11318         switch (type) {
11319         case SAVEt_HELEM:               /* hash element */
11320             sv = (const SV *)POPPTR(ss,ix);
11321             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11322             /* fall through */
11323         case SAVEt_ITEM:                        /* normal string */
11324         case SAVEt_SV:                          /* scalar reference */
11325             sv = (const SV *)POPPTR(ss,ix);
11326             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11327             /* fall through */
11328         case SAVEt_FREESV:
11329         case SAVEt_MORTALIZESV:
11330             sv = (const SV *)POPPTR(ss,ix);
11331             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11332             break;
11333         case SAVEt_SHARED_PVREF:                /* char* in shared space */
11334             c = (char*)POPPTR(ss,ix);
11335             TOPPTR(nss,ix) = savesharedpv(c);
11336             ptr = POPPTR(ss,ix);
11337             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11338             break;
11339         case SAVEt_GENERIC_SVREF:               /* generic sv */
11340         case SAVEt_SVREF:                       /* scalar reference */
11341             sv = (const SV *)POPPTR(ss,ix);
11342             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11343             ptr = POPPTR(ss,ix);
11344             TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
11345             break;
11346         case SAVEt_HV:                          /* hash reference */
11347         case SAVEt_AV:                          /* array reference */
11348             sv = (const SV *) POPPTR(ss,ix);
11349             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11350             /* fall through */
11351         case SAVEt_COMPPAD:
11352         case SAVEt_NSTAB:
11353             sv = (const SV *) POPPTR(ss,ix);
11354             TOPPTR(nss,ix) = sv_dup(sv, param);
11355             break;
11356         case SAVEt_INT:                         /* int reference */
11357             ptr = POPPTR(ss,ix);
11358             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11359             intval = (int)POPINT(ss,ix);
11360             TOPINT(nss,ix) = intval;
11361             break;
11362         case SAVEt_LONG:                        /* long reference */
11363             ptr = POPPTR(ss,ix);
11364             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11365             /* fall through */
11366         case SAVEt_CLEARSV:
11367             longval = (long)POPLONG(ss,ix);
11368             TOPLONG(nss,ix) = longval;
11369             break;
11370         case SAVEt_I32:                         /* I32 reference */
11371         case SAVEt_I16:                         /* I16 reference */
11372         case SAVEt_I8:                          /* I8 reference */
11373         case SAVEt_COP_ARYBASE:                 /* call CopARYBASE_set */
11374             ptr = POPPTR(ss,ix);
11375             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11376             i = POPINT(ss,ix);
11377             TOPINT(nss,ix) = i;
11378             break;
11379         case SAVEt_IV:                          /* IV reference */
11380             ptr = POPPTR(ss,ix);
11381             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11382             iv = POPIV(ss,ix);
11383             TOPIV(nss,ix) = iv;
11384             break;
11385         case SAVEt_HPTR:                        /* HV* reference */
11386         case SAVEt_APTR:                        /* AV* reference */
11387         case SAVEt_SPTR:                        /* SV* reference */
11388             ptr = POPPTR(ss,ix);
11389             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11390             sv = (const SV *)POPPTR(ss,ix);
11391             TOPPTR(nss,ix) = sv_dup(sv, param);
11392             break;
11393         case SAVEt_VPTR:                        /* random* reference */
11394             ptr = POPPTR(ss,ix);
11395             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11396             ptr = POPPTR(ss,ix);
11397             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11398             break;
11399         case SAVEt_GENERIC_PVREF:               /* generic char* */
11400         case SAVEt_PPTR:                        /* char* reference */
11401             ptr = POPPTR(ss,ix);
11402             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11403             c = (char*)POPPTR(ss,ix);
11404             TOPPTR(nss,ix) = pv_dup(c);
11405             break;
11406         case SAVEt_GP:                          /* scalar reference */
11407             gp = (GP*)POPPTR(ss,ix);
11408             TOPPTR(nss,ix) = gp = gp_dup(gp, param);
11409             (void)GpREFCNT_inc(gp);
11410             gv = (const GV *)POPPTR(ss,ix);
11411             TOPPTR(nss,ix) = gv_dup_inc(gv, param);
11412             break;
11413         case SAVEt_FREEOP:
11414             ptr = POPPTR(ss,ix);
11415             if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
11416                 /* these are assumed to be refcounted properly */
11417                 OP *o;
11418                 switch (((OP*)ptr)->op_type) {
11419                 case OP_LEAVESUB:
11420                 case OP_LEAVESUBLV:
11421                 case OP_LEAVEEVAL:
11422                 case OP_LEAVE:
11423                 case OP_SCOPE:
11424                 case OP_LEAVEWRITE:
11425                     TOPPTR(nss,ix) = ptr;
11426                     o = (OP*)ptr;
11427                     OP_REFCNT_LOCK;
11428                     (void) OpREFCNT_inc(o);
11429                     OP_REFCNT_UNLOCK;
11430                     break;
11431                 default:
11432                     TOPPTR(nss,ix) = NULL;
11433                     break;
11434                 }
11435             }
11436             else
11437                 TOPPTR(nss,ix) = NULL;
11438             break;
11439         case SAVEt_DELETE:
11440             hv = (const HV *)POPPTR(ss,ix);
11441             TOPPTR(nss,ix) = hv_dup_inc(hv, param);
11442             i = POPINT(ss,ix);
11443             TOPINT(nss,ix) = i;
11444             /* Fall through */
11445         case SAVEt_FREEPV:
11446             c = (char*)POPPTR(ss,ix);
11447             TOPPTR(nss,ix) = pv_dup_inc(c);
11448             break;
11449         case SAVEt_STACK_POS:           /* Position on Perl stack */
11450             i = POPINT(ss,ix);
11451             TOPINT(nss,ix) = i;
11452             break;
11453         case SAVEt_DESTRUCTOR:
11454             ptr = POPPTR(ss,ix);
11455             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);  /* XXX quite arbitrary */
11456             dptr = POPDPTR(ss,ix);
11457             TOPDPTR(nss,ix) = DPTR2FPTR(void (*)(void*),
11458                                         any_dup(FPTR2DPTR(void *, dptr),
11459                                                 proto_perl));
11460             break;
11461         case SAVEt_DESTRUCTOR_X:
11462             ptr = POPPTR(ss,ix);
11463             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);  /* XXX quite arbitrary */
11464             dxptr = POPDXPTR(ss,ix);
11465             TOPDXPTR(nss,ix) = DPTR2FPTR(void (*)(pTHX_ void*),
11466                                          any_dup(FPTR2DPTR(void *, dxptr),
11467                                                  proto_perl));
11468             break;
11469         case SAVEt_REGCONTEXT:
11470         case SAVEt_ALLOC:
11471             i = POPINT(ss,ix);
11472             TOPINT(nss,ix) = i;
11473             ix -= i;
11474             break;
11475         case SAVEt_AELEM:               /* array element */
11476             sv = (const SV *)POPPTR(ss,ix);
11477             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11478             i = POPINT(ss,ix);
11479             TOPINT(nss,ix) = i;
11480             av = (const AV *)POPPTR(ss,ix);
11481             TOPPTR(nss,ix) = av_dup_inc(av, param);
11482             break;
11483         case SAVEt_OP:
11484             ptr = POPPTR(ss,ix);
11485             TOPPTR(nss,ix) = ptr;
11486             break;
11487         case SAVEt_HINTS:
11488             ptr = POPPTR(ss,ix);
11489             if (ptr) {
11490                 HINTS_REFCNT_LOCK;
11491                 ((struct refcounted_he *)ptr)->refcounted_he_refcnt++;
11492                 HINTS_REFCNT_UNLOCK;
11493             }
11494             TOPPTR(nss,ix) = ptr;
11495             i = POPINT(ss,ix);
11496             TOPINT(nss,ix) = i;
11497             if (i & HINT_LOCALIZE_HH) {
11498                 hv = (const HV *)POPPTR(ss,ix);
11499                 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
11500             }
11501             break;
11502         case SAVEt_PADSV_AND_MORTALIZE:
11503             longval = (long)POPLONG(ss,ix);
11504             TOPLONG(nss,ix) = longval;
11505             ptr = POPPTR(ss,ix);
11506             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11507             sv = (const SV *)POPPTR(ss,ix);
11508             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11509             break;
11510         case SAVEt_BOOL:
11511             ptr = POPPTR(ss,ix);
11512             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11513             longval = (long)POPBOOL(ss,ix);
11514             TOPBOOL(nss,ix) = (bool)longval;
11515             break;
11516         case SAVEt_SET_SVFLAGS:
11517             i = POPINT(ss,ix);
11518             TOPINT(nss,ix) = i;
11519             i = POPINT(ss,ix);
11520             TOPINT(nss,ix) = i;
11521             sv = (const SV *)POPPTR(ss,ix);
11522             TOPPTR(nss,ix) = sv_dup(sv, param);
11523             break;
11524         case SAVEt_RE_STATE:
11525             {
11526                 const struct re_save_state *const old_state
11527                     = (struct re_save_state *)
11528                     (ss + ix - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
11529                 struct re_save_state *const new_state
11530                     = (struct re_save_state *)
11531                     (nss + ix - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
11532
11533                 Copy(old_state, new_state, 1, struct re_save_state);
11534                 ix -= SAVESTACK_ALLOC_FOR_RE_SAVE_STATE;
11535
11536                 new_state->re_state_bostr
11537                     = pv_dup(old_state->re_state_bostr);
11538                 new_state->re_state_reginput
11539                     = pv_dup(old_state->re_state_reginput);
11540                 new_state->re_state_regeol
11541                     = pv_dup(old_state->re_state_regeol);
11542                 new_state->re_state_regoffs
11543                     = (regexp_paren_pair*)
11544                         any_dup(old_state->re_state_regoffs, proto_perl);
11545                 new_state->re_state_reglastparen
11546                     = (U32*) any_dup(old_state->re_state_reglastparen, 
11547                               proto_perl);
11548                 new_state->re_state_reglastcloseparen
11549                     = (U32*)any_dup(old_state->re_state_reglastcloseparen,
11550                               proto_perl);
11551                 /* XXX This just has to be broken. The old save_re_context
11552                    code did SAVEGENERICPV(PL_reg_start_tmp);
11553                    PL_reg_start_tmp is char **.
11554                    Look above to what the dup code does for
11555                    SAVEt_GENERIC_PVREF
11556                    It can never have worked.
11557                    So this is merely a faithful copy of the exiting bug:  */
11558                 new_state->re_state_reg_start_tmp
11559                     = (char **) pv_dup((char *)
11560                                       old_state->re_state_reg_start_tmp);
11561                 /* I assume that it only ever "worked" because no-one called
11562                    (pseudo)fork while the regexp engine had re-entered itself.
11563                 */
11564 #ifdef PERL_OLD_COPY_ON_WRITE
11565                 new_state->re_state_nrs
11566                     = sv_dup(old_state->re_state_nrs, param);
11567 #endif
11568                 new_state->re_state_reg_magic
11569                     = (MAGIC*) any_dup(old_state->re_state_reg_magic, 
11570                                proto_perl);
11571                 new_state->re_state_reg_oldcurpm
11572                     = (PMOP*) any_dup(old_state->re_state_reg_oldcurpm, 
11573                               proto_perl);
11574                 new_state->re_state_reg_curpm
11575                     = (PMOP*)  any_dup(old_state->re_state_reg_curpm, 
11576                                proto_perl);
11577                 new_state->re_state_reg_oldsaved
11578                     = pv_dup(old_state->re_state_reg_oldsaved);
11579                 new_state->re_state_reg_poscache
11580                     = pv_dup(old_state->re_state_reg_poscache);
11581                 new_state->re_state_reg_starttry
11582                     = pv_dup(old_state->re_state_reg_starttry);
11583                 break;
11584             }
11585         case SAVEt_COMPILE_WARNINGS:
11586             ptr = POPPTR(ss,ix);
11587             TOPPTR(nss,ix) = DUP_WARNINGS((STRLEN*)ptr);
11588             break;
11589         case SAVEt_PARSER:
11590             ptr = POPPTR(ss,ix);
11591             TOPPTR(nss,ix) = parser_dup((const yy_parser*)ptr, param);
11592             break;
11593         default:
11594             Perl_croak(aTHX_
11595                        "panic: ss_dup inconsistency (%"IVdf")", (IV) type);
11596         }
11597     }
11598
11599     return nss;
11600 }
11601
11602
11603 /* if sv is a stash, call $class->CLONE_SKIP(), and set the SVphv_CLONEABLE
11604  * flag to the result. This is done for each stash before cloning starts,
11605  * so we know which stashes want their objects cloned */
11606
11607 static void
11608 do_mark_cloneable_stash(pTHX_ SV *const sv)
11609 {
11610     const HEK * const hvname = HvNAME_HEK((const HV *)sv);
11611     if (hvname) {
11612         GV* const cloner = gv_fetchmethod_autoload(MUTABLE_HV(sv), "CLONE_SKIP", 0);
11613         SvFLAGS(sv) |= SVphv_CLONEABLE; /* clone objects by default */
11614         if (cloner && GvCV(cloner)) {
11615             dSP;
11616             UV status;
11617
11618             ENTER;
11619             SAVETMPS;
11620             PUSHMARK(SP);
11621             mXPUSHs(newSVhek(hvname));
11622             PUTBACK;
11623             call_sv(MUTABLE_SV(GvCV(cloner)), G_SCALAR);
11624             SPAGAIN;
11625             status = POPu;
11626             PUTBACK;
11627             FREETMPS;
11628             LEAVE;
11629             if (status)
11630                 SvFLAGS(sv) &= ~SVphv_CLONEABLE;
11631         }
11632     }
11633 }
11634
11635
11636
11637 /*
11638 =for apidoc perl_clone
11639
11640 Create and return a new interpreter by cloning the current one.
11641
11642 perl_clone takes these flags as parameters:
11643
11644 CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
11645 without it we only clone the data and zero the stacks,
11646 with it we copy the stacks and the new perl interpreter is
11647 ready to run at the exact same point as the previous one.
11648 The pseudo-fork code uses COPY_STACKS while the
11649 threads->create doesn't.
11650
11651 CLONEf_KEEP_PTR_TABLE
11652 perl_clone keeps a ptr_table with the pointer of the old
11653 variable as a key and the new variable as a value,
11654 this allows it to check if something has been cloned and not
11655 clone it again but rather just use the value and increase the
11656 refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
11657 the ptr_table using the function
11658 C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
11659 reason to keep it around is if you want to dup some of your own
11660 variable who are outside the graph perl scans, example of this
11661 code is in threads.xs create
11662
11663 CLONEf_CLONE_HOST
11664 This is a win32 thing, it is ignored on unix, it tells perls
11665 win32host code (which is c++) to clone itself, this is needed on
11666 win32 if you want to run two threads at the same time,
11667 if you just want to do some stuff in a separate perl interpreter
11668 and then throw it away and return to the original one,
11669 you don't need to do anything.
11670
11671 =cut
11672 */
11673
11674 /* XXX the above needs expanding by someone who actually understands it ! */
11675 EXTERN_C PerlInterpreter *
11676 perl_clone_host(PerlInterpreter* proto_perl, UV flags);
11677
11678 PerlInterpreter *
11679 perl_clone(PerlInterpreter *proto_perl, UV flags)
11680 {
11681    dVAR;
11682 #ifdef PERL_IMPLICIT_SYS
11683
11684     PERL_ARGS_ASSERT_PERL_CLONE;
11685
11686    /* perlhost.h so we need to call into it
11687    to clone the host, CPerlHost should have a c interface, sky */
11688
11689    if (flags & CLONEf_CLONE_HOST) {
11690        return perl_clone_host(proto_perl,flags);
11691    }
11692    return perl_clone_using(proto_perl, flags,
11693                             proto_perl->IMem,
11694                             proto_perl->IMemShared,
11695                             proto_perl->IMemParse,
11696                             proto_perl->IEnv,
11697                             proto_perl->IStdIO,
11698                             proto_perl->ILIO,
11699                             proto_perl->IDir,
11700                             proto_perl->ISock,
11701                             proto_perl->IProc);
11702 }
11703
11704 PerlInterpreter *
11705 perl_clone_using(PerlInterpreter *proto_perl, UV flags,
11706                  struct IPerlMem* ipM, struct IPerlMem* ipMS,
11707                  struct IPerlMem* ipMP, struct IPerlEnv* ipE,
11708                  struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
11709                  struct IPerlDir* ipD, struct IPerlSock* ipS,
11710                  struct IPerlProc* ipP)
11711 {
11712     /* XXX many of the string copies here can be optimized if they're
11713      * constants; they need to be allocated as common memory and just
11714      * their pointers copied. */
11715
11716     IV i;
11717     CLONE_PARAMS clone_params;
11718     CLONE_PARAMS* const param = &clone_params;
11719
11720     PerlInterpreter * const my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
11721
11722     PERL_ARGS_ASSERT_PERL_CLONE_USING;
11723
11724     /* for each stash, determine whether its objects should be cloned */
11725     S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
11726     PERL_SET_THX(my_perl);
11727
11728 #  ifdef DEBUGGING
11729     PoisonNew(my_perl, 1, PerlInterpreter);
11730     PL_op = NULL;
11731     PL_curcop = NULL;
11732     PL_markstack = 0;
11733     PL_scopestack = 0;
11734     PL_savestack = 0;
11735     PL_savestack_ix = 0;
11736     PL_savestack_max = -1;
11737     PL_sig_pending = 0;
11738     PL_parser = NULL;
11739     Zero(&PL_debug_pad, 1, struct perl_debug_pad);
11740 #  else /* !DEBUGGING */
11741     Zero(my_perl, 1, PerlInterpreter);
11742 #  endif        /* DEBUGGING */
11743
11744     /* host pointers */
11745     PL_Mem              = ipM;
11746     PL_MemShared        = ipMS;
11747     PL_MemParse         = ipMP;
11748     PL_Env              = ipE;
11749     PL_StdIO            = ipStd;
11750     PL_LIO              = ipLIO;
11751     PL_Dir              = ipD;
11752     PL_Sock             = ipS;
11753     PL_Proc             = ipP;
11754 #else           /* !PERL_IMPLICIT_SYS */
11755     IV i;
11756     CLONE_PARAMS clone_params;
11757     CLONE_PARAMS* param = &clone_params;
11758     PerlInterpreter * const my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
11759
11760     PERL_ARGS_ASSERT_PERL_CLONE;
11761
11762     /* for each stash, determine whether its objects should be cloned */
11763     S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
11764     PERL_SET_THX(my_perl);
11765
11766 #    ifdef DEBUGGING
11767     PoisonNew(my_perl, 1, PerlInterpreter);
11768     PL_op = NULL;
11769     PL_curcop = NULL;
11770     PL_markstack = 0;
11771     PL_scopestack = 0;
11772     PL_savestack = 0;
11773     PL_savestack_ix = 0;
11774     PL_savestack_max = -1;
11775     PL_sig_pending = 0;
11776     PL_parser = NULL;
11777     Zero(&PL_debug_pad, 1, struct perl_debug_pad);
11778 #    else       /* !DEBUGGING */
11779     Zero(my_perl, 1, PerlInterpreter);
11780 #    endif      /* DEBUGGING */
11781 #endif          /* PERL_IMPLICIT_SYS */
11782     param->flags = flags;
11783     param->proto_perl = proto_perl;
11784
11785     INIT_TRACK_MEMPOOL(my_perl->Imemory_debug_header, my_perl);
11786
11787     PL_body_arenas = NULL;
11788     Zero(&PL_body_roots, 1, PL_body_roots);
11789     
11790     PL_nice_chunk       = NULL;
11791     PL_nice_chunk_size  = 0;
11792     PL_sv_count         = 0;
11793     PL_sv_objcount      = 0;
11794     PL_sv_root          = NULL;
11795     PL_sv_arenaroot     = NULL;
11796
11797     PL_debug            = proto_perl->Idebug;
11798
11799     PL_hash_seed        = proto_perl->Ihash_seed;
11800     PL_rehash_seed      = proto_perl->Irehash_seed;
11801
11802 #ifdef USE_REENTRANT_API
11803     /* XXX: things like -Dm will segfault here in perlio, but doing
11804      *  PERL_SET_CONTEXT(proto_perl);
11805      * breaks too many other things
11806      */
11807     Perl_reentrant_init(aTHX);
11808 #endif
11809
11810     /* create SV map for pointer relocation */
11811     PL_ptr_table = ptr_table_new();
11812
11813     /* initialize these special pointers as early as possible */
11814     SvANY(&PL_sv_undef)         = NULL;
11815     SvREFCNT(&PL_sv_undef)      = (~(U32)0)/2;
11816     SvFLAGS(&PL_sv_undef)       = SVf_READONLY|SVt_NULL;
11817     ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
11818
11819     SvANY(&PL_sv_no)            = new_XPVNV();
11820     SvREFCNT(&PL_sv_no)         = (~(U32)0)/2;
11821     SvFLAGS(&PL_sv_no)          = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
11822                                   |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
11823     SvPV_set(&PL_sv_no, savepvn(PL_No, 0));
11824     SvCUR_set(&PL_sv_no, 0);
11825     SvLEN_set(&PL_sv_no, 1);
11826     SvIV_set(&PL_sv_no, 0);
11827     SvNV_set(&PL_sv_no, 0);
11828     ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
11829
11830     SvANY(&PL_sv_yes)           = new_XPVNV();
11831     SvREFCNT(&PL_sv_yes)        = (~(U32)0)/2;
11832     SvFLAGS(&PL_sv_yes)         = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
11833                                   |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
11834     SvPV_set(&PL_sv_yes, savepvn(PL_Yes, 1));
11835     SvCUR_set(&PL_sv_yes, 1);
11836     SvLEN_set(&PL_sv_yes, 2);
11837     SvIV_set(&PL_sv_yes, 1);
11838     SvNV_set(&PL_sv_yes, 1);
11839     ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
11840
11841     /* create (a non-shared!) shared string table */
11842     PL_strtab           = newHV();
11843     HvSHAREKEYS_off(PL_strtab);
11844     hv_ksplit(PL_strtab, HvTOTALKEYS(proto_perl->Istrtab));
11845     ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
11846
11847     PL_compiling = proto_perl->Icompiling;
11848
11849     /* These two PVs will be free'd special way so must set them same way op.c does */
11850     PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
11851     ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
11852
11853     PL_compiling.cop_file    = savesharedpv(PL_compiling.cop_file);
11854     ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
11855
11856     ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
11857     PL_compiling.cop_warnings = DUP_WARNINGS(PL_compiling.cop_warnings);
11858     if (PL_compiling.cop_hints_hash) {
11859         HINTS_REFCNT_LOCK;
11860         PL_compiling.cop_hints_hash->refcounted_he_refcnt++;
11861         HINTS_REFCNT_UNLOCK;
11862     }
11863     PL_curcop           = (COP*)any_dup(proto_perl->Icurcop, proto_perl);
11864 #ifdef PERL_DEBUG_READONLY_OPS
11865     PL_slabs = NULL;
11866     PL_slab_count = 0;
11867 #endif
11868
11869     /* pseudo environmental stuff */
11870     PL_origargc         = proto_perl->Iorigargc;
11871     PL_origargv         = proto_perl->Iorigargv;
11872
11873     param->stashes      = newAV();  /* Setup array of objects to call clone on */
11874
11875     /* Set tainting stuff before PerlIO_debug can possibly get called */
11876     PL_tainting         = proto_perl->Itainting;
11877     PL_taint_warn       = proto_perl->Itaint_warn;
11878
11879 #ifdef PERLIO_LAYERS
11880     /* Clone PerlIO tables as soon as we can handle general xx_dup() */
11881     PerlIO_clone(aTHX_ proto_perl, param);
11882 #endif
11883
11884     PL_envgv            = gv_dup(proto_perl->Ienvgv, param);
11885     PL_incgv            = gv_dup(proto_perl->Iincgv, param);
11886     PL_hintgv           = gv_dup(proto_perl->Ihintgv, param);
11887     PL_origfilename     = SAVEPV(proto_perl->Iorigfilename);
11888     PL_diehook          = sv_dup_inc(proto_perl->Idiehook, param);
11889     PL_warnhook         = sv_dup_inc(proto_perl->Iwarnhook, param);
11890
11891     /* switches */
11892     PL_minus_c          = proto_perl->Iminus_c;
11893     PL_patchlevel       = sv_dup_inc(proto_perl->Ipatchlevel, param);
11894     PL_localpatches     = proto_perl->Ilocalpatches;
11895     PL_splitstr         = proto_perl->Isplitstr;
11896     PL_minus_n          = proto_perl->Iminus_n;
11897     PL_minus_p          = proto_perl->Iminus_p;
11898     PL_minus_l          = proto_perl->Iminus_l;
11899     PL_minus_a          = proto_perl->Iminus_a;
11900     PL_minus_E          = proto_perl->Iminus_E;
11901     PL_minus_F          = proto_perl->Iminus_F;
11902     PL_doswitches       = proto_perl->Idoswitches;
11903     PL_dowarn           = proto_perl->Idowarn;
11904     PL_doextract        = proto_perl->Idoextract;
11905     PL_sawampersand     = proto_perl->Isawampersand;
11906     PL_unsafe           = proto_perl->Iunsafe;
11907     PL_inplace          = SAVEPV(proto_perl->Iinplace);
11908     PL_e_script         = sv_dup_inc(proto_perl->Ie_script, param);
11909     PL_perldb           = proto_perl->Iperldb;
11910     PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
11911     PL_exit_flags       = proto_perl->Iexit_flags;
11912
11913     /* magical thingies */
11914     /* XXX time(&PL_basetime) when asked for? */
11915     PL_basetime         = proto_perl->Ibasetime;
11916     PL_formfeed         = sv_dup(proto_perl->Iformfeed, param);
11917
11918     PL_maxsysfd         = proto_perl->Imaxsysfd;
11919     PL_statusvalue      = proto_perl->Istatusvalue;
11920 #ifdef VMS
11921     PL_statusvalue_vms  = proto_perl->Istatusvalue_vms;
11922 #else
11923     PL_statusvalue_posix = proto_perl->Istatusvalue_posix;
11924 #endif
11925     PL_encoding         = sv_dup(proto_perl->Iencoding, param);
11926
11927     sv_setpvs(PERL_DEBUG_PAD(0), "");   /* For regex debugging. */
11928     sv_setpvs(PERL_DEBUG_PAD(1), "");   /* ext/re needs these */
11929     sv_setpvs(PERL_DEBUG_PAD(2), "");   /* even without DEBUGGING. */
11930
11931    
11932     /* RE engine related */
11933     Zero(&PL_reg_state, 1, struct re_save_state);
11934     PL_reginterp_cnt    = 0;
11935     PL_regmatch_slab    = NULL;
11936     
11937     /* Clone the regex array */
11938     /* ORANGE FIXME for plugins, probably in the SV dup code.
11939        newSViv(PTR2IV(CALLREGDUPE(
11940        INT2PTR(REGEXP *, SvIVX(regex)), param))))
11941     */
11942     PL_regex_padav = av_dup_inc(proto_perl->Iregex_padav, param);
11943     PL_regex_pad = AvARRAY(PL_regex_padav);
11944
11945     /* shortcuts to various I/O objects */
11946     PL_ofsgv            = gv_dup(proto_perl->Iofsgv, param);
11947     PL_stdingv          = gv_dup(proto_perl->Istdingv, param);
11948     PL_stderrgv         = gv_dup(proto_perl->Istderrgv, param);
11949     PL_defgv            = gv_dup(proto_perl->Idefgv, param);
11950     PL_argvgv           = gv_dup(proto_perl->Iargvgv, param);
11951     PL_argvoutgv        = gv_dup(proto_perl->Iargvoutgv, param);
11952     PL_argvout_stack    = av_dup_inc(proto_perl->Iargvout_stack, param);
11953
11954     /* shortcuts to regexp stuff */
11955     PL_replgv           = gv_dup(proto_perl->Ireplgv, param);
11956
11957     /* shortcuts to misc objects */
11958     PL_errgv            = gv_dup(proto_perl->Ierrgv, param);
11959
11960     /* shortcuts to debugging objects */
11961     PL_DBgv             = gv_dup(proto_perl->IDBgv, param);
11962     PL_DBline           = gv_dup(proto_perl->IDBline, param);
11963     PL_DBsub            = gv_dup(proto_perl->IDBsub, param);
11964     PL_DBsingle         = sv_dup(proto_perl->IDBsingle, param);
11965     PL_DBtrace          = sv_dup(proto_perl->IDBtrace, param);
11966     PL_DBsignal         = sv_dup(proto_perl->IDBsignal, param);
11967     PL_dbargs           = av_dup(proto_perl->Idbargs, param);
11968
11969     /* symbol tables */
11970     PL_defstash         = hv_dup_inc(proto_perl->Idefstash, param);
11971     PL_curstash         = hv_dup(proto_perl->Icurstash, param);
11972     PL_debstash         = hv_dup(proto_perl->Idebstash, param);
11973     PL_globalstash      = hv_dup(proto_perl->Iglobalstash, param);
11974     PL_curstname        = sv_dup_inc(proto_perl->Icurstname, param);
11975
11976     PL_beginav          = av_dup_inc(proto_perl->Ibeginav, param);
11977     PL_beginav_save     = av_dup_inc(proto_perl->Ibeginav_save, param);
11978     PL_checkav_save     = av_dup_inc(proto_perl->Icheckav_save, param);
11979     PL_unitcheckav      = av_dup_inc(proto_perl->Iunitcheckav, param);
11980     PL_unitcheckav_save = av_dup_inc(proto_perl->Iunitcheckav_save, param);
11981     PL_endav            = av_dup_inc(proto_perl->Iendav, param);
11982     PL_checkav          = av_dup_inc(proto_perl->Icheckav, param);
11983     PL_initav           = av_dup_inc(proto_perl->Iinitav, param);
11984
11985     PL_sub_generation   = proto_perl->Isub_generation;
11986     PL_isarev           = hv_dup_inc(proto_perl->Iisarev, param);
11987
11988     /* funky return mechanisms */
11989     PL_forkprocess      = proto_perl->Iforkprocess;
11990
11991     /* subprocess state */
11992     PL_fdpid            = av_dup_inc(proto_perl->Ifdpid, param);
11993
11994     /* internal state */
11995     PL_maxo             = proto_perl->Imaxo;
11996     if (proto_perl->Iop_mask)
11997         PL_op_mask      = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
11998     else
11999         PL_op_mask      = NULL;
12000     /* PL_asserting        = proto_perl->Iasserting; */
12001
12002     /* current interpreter roots */
12003     PL_main_cv          = cv_dup_inc(proto_perl->Imain_cv, param);
12004     OP_REFCNT_LOCK;
12005     PL_main_root        = OpREFCNT_inc(proto_perl->Imain_root);
12006     OP_REFCNT_UNLOCK;
12007     PL_main_start       = proto_perl->Imain_start;
12008     PL_eval_root        = proto_perl->Ieval_root;
12009     PL_eval_start       = proto_perl->Ieval_start;
12010
12011     /* runtime control stuff */
12012     PL_curcopdb         = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
12013
12014     PL_filemode         = proto_perl->Ifilemode;
12015     PL_lastfd           = proto_perl->Ilastfd;
12016     PL_oldname          = proto_perl->Ioldname;         /* XXX not quite right */
12017     PL_Argv             = NULL;
12018     PL_Cmd              = NULL;
12019     PL_gensym           = proto_perl->Igensym;
12020     PL_preambleav       = av_dup_inc(proto_perl->Ipreambleav, param);
12021     PL_laststatval      = proto_perl->Ilaststatval;
12022     PL_laststype        = proto_perl->Ilaststype;
12023     PL_mess_sv          = NULL;
12024
12025     PL_ors_sv           = sv_dup_inc(proto_perl->Iors_sv, param);
12026
12027     /* interpreter atexit processing */
12028     PL_exitlistlen      = proto_perl->Iexitlistlen;
12029     if (PL_exitlistlen) {
12030         Newx(PL_exitlist, PL_exitlistlen, PerlExitListEntry);
12031         Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
12032     }
12033     else
12034         PL_exitlist     = (PerlExitListEntry*)NULL;
12035
12036     PL_my_cxt_size = proto_perl->Imy_cxt_size;
12037     if (PL_my_cxt_size) {
12038         Newx(PL_my_cxt_list, PL_my_cxt_size, void *);
12039         Copy(proto_perl->Imy_cxt_list, PL_my_cxt_list, PL_my_cxt_size, void *);
12040 #ifdef PERL_GLOBAL_STRUCT_PRIVATE
12041         Newx(PL_my_cxt_keys, PL_my_cxt_size, const char *);
12042         Copy(proto_perl->Imy_cxt_keys, PL_my_cxt_keys, PL_my_cxt_size, char *);
12043 #endif
12044     }
12045     else {
12046         PL_my_cxt_list  = (void**)NULL;
12047 #ifdef PERL_GLOBAL_STRUCT_PRIVATE
12048         PL_my_cxt_keys  = (const char**)NULL;
12049 #endif
12050     }
12051     PL_modglobal        = hv_dup_inc(proto_perl->Imodglobal, param);
12052     PL_custom_op_names  = hv_dup_inc(proto_perl->Icustom_op_names,param);
12053     PL_custom_op_descs  = hv_dup_inc(proto_perl->Icustom_op_descs,param);
12054
12055     PL_profiledata      = NULL;
12056
12057     PL_compcv                   = cv_dup(proto_perl->Icompcv, param);
12058
12059     PAD_CLONE_VARS(proto_perl, param);
12060
12061 #ifdef HAVE_INTERP_INTERN
12062     sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
12063 #endif
12064
12065     /* more statics moved here */
12066     PL_generation       = proto_perl->Igeneration;
12067     PL_DBcv             = cv_dup(proto_perl->IDBcv, param);
12068
12069     PL_in_clean_objs    = proto_perl->Iin_clean_objs;
12070     PL_in_clean_all     = proto_perl->Iin_clean_all;
12071
12072     PL_uid              = proto_perl->Iuid;
12073     PL_euid             = proto_perl->Ieuid;
12074     PL_gid              = proto_perl->Igid;
12075     PL_egid             = proto_perl->Iegid;
12076     PL_nomemok          = proto_perl->Inomemok;
12077     PL_an               = proto_perl->Ian;
12078     PL_evalseq          = proto_perl->Ievalseq;
12079     PL_origenviron      = proto_perl->Iorigenviron;     /* XXX not quite right */
12080     PL_origalen         = proto_perl->Iorigalen;
12081 #ifdef PERL_USES_PL_PIDSTATUS
12082     PL_pidstatus        = newHV();                      /* XXX flag for cloning? */
12083 #endif
12084     PL_osname           = SAVEPV(proto_perl->Iosname);
12085     PL_sighandlerp      = proto_perl->Isighandlerp;
12086
12087     PL_runops           = proto_perl->Irunops;
12088
12089     PL_parser           = parser_dup(proto_perl->Iparser, param);
12090
12091     PL_subline          = proto_perl->Isubline;
12092     PL_subname          = sv_dup_inc(proto_perl->Isubname, param);
12093
12094 #ifdef FCRYPT
12095     PL_cryptseen        = proto_perl->Icryptseen;
12096 #endif
12097
12098     PL_hints            = proto_perl->Ihints;
12099
12100     PL_amagic_generation        = proto_perl->Iamagic_generation;
12101
12102 #ifdef USE_LOCALE_COLLATE
12103     PL_collation_ix     = proto_perl->Icollation_ix;
12104     PL_collation_name   = SAVEPV(proto_perl->Icollation_name);
12105     PL_collation_standard       = proto_perl->Icollation_standard;
12106     PL_collxfrm_base    = proto_perl->Icollxfrm_base;
12107     PL_collxfrm_mult    = proto_perl->Icollxfrm_mult;
12108 #endif /* USE_LOCALE_COLLATE */
12109
12110 #ifdef USE_LOCALE_NUMERIC
12111     PL_numeric_name     = SAVEPV(proto_perl->Inumeric_name);
12112     PL_numeric_standard = proto_perl->Inumeric_standard;
12113     PL_numeric_local    = proto_perl->Inumeric_local;
12114     PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
12115 #endif /* !USE_LOCALE_NUMERIC */
12116
12117     /* utf8 character classes */
12118     PL_utf8_alnum       = sv_dup_inc(proto_perl->Iutf8_alnum, param);
12119     PL_utf8_alnumc      = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
12120     PL_utf8_ascii       = sv_dup_inc(proto_perl->Iutf8_ascii, param);
12121     PL_utf8_alpha       = sv_dup_inc(proto_perl->Iutf8_alpha, param);
12122     PL_utf8_space       = sv_dup_inc(proto_perl->Iutf8_space, param);
12123     PL_utf8_cntrl       = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
12124     PL_utf8_graph       = sv_dup_inc(proto_perl->Iutf8_graph, param);
12125     PL_utf8_digit       = sv_dup_inc(proto_perl->Iutf8_digit, param);
12126     PL_utf8_upper       = sv_dup_inc(proto_perl->Iutf8_upper, param);
12127     PL_utf8_lower       = sv_dup_inc(proto_perl->Iutf8_lower, param);
12128     PL_utf8_print       = sv_dup_inc(proto_perl->Iutf8_print, param);
12129     PL_utf8_punct       = sv_dup_inc(proto_perl->Iutf8_punct, param);
12130     PL_utf8_xdigit      = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
12131     PL_utf8_mark        = sv_dup_inc(proto_perl->Iutf8_mark, param);
12132     PL_utf8_toupper     = sv_dup_inc(proto_perl->Iutf8_toupper, param);
12133     PL_utf8_totitle     = sv_dup_inc(proto_perl->Iutf8_totitle, param);
12134     PL_utf8_tolower     = sv_dup_inc(proto_perl->Iutf8_tolower, param);
12135     PL_utf8_tofold      = sv_dup_inc(proto_perl->Iutf8_tofold, param);
12136     PL_utf8_idstart     = sv_dup_inc(proto_perl->Iutf8_idstart, param);
12137     PL_utf8_idcont      = sv_dup_inc(proto_perl->Iutf8_idcont, param);
12138
12139     /* Did the locale setup indicate UTF-8? */
12140     PL_utf8locale       = proto_perl->Iutf8locale;
12141     /* Unicode features (see perlrun/-C) */
12142     PL_unicode          = proto_perl->Iunicode;
12143
12144     /* Pre-5.8 signals control */
12145     PL_signals          = proto_perl->Isignals;
12146
12147     /* times() ticks per second */
12148     PL_clocktick        = proto_perl->Iclocktick;
12149
12150     /* Recursion stopper for PerlIO_find_layer */
12151     PL_in_load_module   = proto_perl->Iin_load_module;
12152
12153     /* sort() routine */
12154     PL_sort_RealCmp     = proto_perl->Isort_RealCmp;
12155
12156     /* Not really needed/useful since the reenrant_retint is "volatile",
12157      * but do it for consistency's sake. */
12158     PL_reentrant_retint = proto_perl->Ireentrant_retint;
12159
12160     /* Hooks to shared SVs and locks. */
12161     PL_sharehook        = proto_perl->Isharehook;
12162     PL_lockhook         = proto_perl->Ilockhook;
12163     PL_unlockhook       = proto_perl->Iunlockhook;
12164     PL_threadhook       = proto_perl->Ithreadhook;
12165     PL_destroyhook      = proto_perl->Idestroyhook;
12166
12167 #ifdef THREADS_HAVE_PIDS
12168     PL_ppid             = proto_perl->Ippid;
12169 #endif
12170
12171     /* swatch cache */
12172     PL_last_swash_hv    = NULL; /* reinits on demand */
12173     PL_last_swash_klen  = 0;
12174     PL_last_swash_key[0]= '\0';
12175     PL_last_swash_tmps  = (U8*)NULL;
12176     PL_last_swash_slen  = 0;
12177
12178     PL_glob_index       = proto_perl->Iglob_index;
12179     PL_srand_called     = proto_perl->Isrand_called;
12180     PL_bitcount         = NULL; /* reinits on demand */
12181
12182     if (proto_perl->Ipsig_pend) {
12183         Newxz(PL_psig_pend, SIG_SIZE, int);
12184     }
12185     else {
12186         PL_psig_pend    = (int*)NULL;
12187     }
12188
12189     if (proto_perl->Ipsig_ptr) {
12190         Newxz(PL_psig_ptr,  SIG_SIZE, SV*);
12191         Newxz(PL_psig_name, SIG_SIZE, SV*);
12192         for (i = 1; i < SIG_SIZE; i++) {
12193             PL_psig_ptr[i]  = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
12194             PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
12195         }
12196     }
12197     else {
12198         PL_psig_ptr     = (SV**)NULL;
12199         PL_psig_name    = (SV**)NULL;
12200     }
12201
12202     /* intrpvar.h stuff */
12203
12204     if (flags & CLONEf_COPY_STACKS) {
12205         /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
12206         PL_tmps_ix              = proto_perl->Itmps_ix;
12207         PL_tmps_max             = proto_perl->Itmps_max;
12208         PL_tmps_floor           = proto_perl->Itmps_floor;
12209         Newxz(PL_tmps_stack, PL_tmps_max, SV*);
12210         i = 0;
12211         while (i <= PL_tmps_ix) {
12212             PL_tmps_stack[i]    = sv_dup_inc(proto_perl->Itmps_stack[i], param);
12213             ++i;
12214         }
12215
12216         /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
12217         i = proto_perl->Imarkstack_max - proto_perl->Imarkstack;
12218         Newxz(PL_markstack, i, I32);
12219         PL_markstack_max        = PL_markstack + (proto_perl->Imarkstack_max
12220                                                   - proto_perl->Imarkstack);
12221         PL_markstack_ptr        = PL_markstack + (proto_perl->Imarkstack_ptr
12222                                                   - proto_perl->Imarkstack);
12223         Copy(proto_perl->Imarkstack, PL_markstack,
12224              PL_markstack_ptr - PL_markstack + 1, I32);
12225
12226         /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
12227          * NOTE: unlike the others! */
12228         PL_scopestack_ix        = proto_perl->Iscopestack_ix;
12229         PL_scopestack_max       = proto_perl->Iscopestack_max;
12230         Newxz(PL_scopestack, PL_scopestack_max, I32);
12231         Copy(proto_perl->Iscopestack, PL_scopestack, PL_scopestack_ix, I32);
12232
12233         /* NOTE: si_dup() looks at PL_markstack */
12234         PL_curstackinfo         = si_dup(proto_perl->Icurstackinfo, param);
12235
12236         /* PL_curstack          = PL_curstackinfo->si_stack; */
12237         PL_curstack             = av_dup(proto_perl->Icurstack, param);
12238         PL_mainstack            = av_dup(proto_perl->Imainstack, param);
12239
12240         /* next PUSHs() etc. set *(PL_stack_sp+1) */
12241         PL_stack_base           = AvARRAY(PL_curstack);
12242         PL_stack_sp             = PL_stack_base + (proto_perl->Istack_sp
12243                                                    - proto_perl->Istack_base);
12244         PL_stack_max            = PL_stack_base + AvMAX(PL_curstack);
12245
12246         /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
12247          * NOTE: unlike the others! */
12248         PL_savestack_ix         = proto_perl->Isavestack_ix;
12249         PL_savestack_max        = proto_perl->Isavestack_max;
12250         /*Newxz(PL_savestack, PL_savestack_max, ANY);*/
12251         PL_savestack            = ss_dup(proto_perl, param);
12252     }
12253     else {
12254         init_stacks();
12255         ENTER;                  /* perl_destruct() wants to LEAVE; */
12256
12257         /* although we're not duplicating the tmps stack, we should still
12258          * add entries for any SVs on the tmps stack that got cloned by a
12259          * non-refcount means (eg a temp in @_); otherwise they will be
12260          * orphaned
12261          */
12262         for (i = 0; i<= proto_perl->Itmps_ix; i++) {
12263             SV * const nsv = MUTABLE_SV(ptr_table_fetch(PL_ptr_table,
12264                     proto_perl->Itmps_stack[i]));
12265             if (nsv && !SvREFCNT(nsv)) {
12266                 EXTEND_MORTAL(1);
12267                 PL_tmps_stack[++PL_tmps_ix] = SvREFCNT_inc_simple(nsv);
12268             }
12269         }
12270     }
12271
12272     PL_start_env        = proto_perl->Istart_env;       /* XXXXXX */
12273     PL_top_env          = &PL_start_env;
12274
12275     PL_op               = proto_perl->Iop;
12276
12277     PL_Sv               = NULL;
12278     PL_Xpv              = (XPV*)NULL;
12279     my_perl->Ina        = proto_perl->Ina;
12280
12281     PL_statbuf          = proto_perl->Istatbuf;
12282     PL_statcache        = proto_perl->Istatcache;
12283     PL_statgv           = gv_dup(proto_perl->Istatgv, param);
12284     PL_statname         = sv_dup_inc(proto_perl->Istatname, param);
12285 #ifdef HAS_TIMES
12286     PL_timesbuf         = proto_perl->Itimesbuf;
12287 #endif
12288
12289     PL_tainted          = proto_perl->Itainted;
12290     PL_curpm            = proto_perl->Icurpm;   /* XXX No PMOP ref count */
12291     PL_rs               = sv_dup_inc(proto_perl->Irs, param);
12292     PL_last_in_gv       = gv_dup(proto_perl->Ilast_in_gv, param);
12293     PL_defoutgv         = gv_dup_inc(proto_perl->Idefoutgv, param);
12294     PL_chopset          = proto_perl->Ichopset; /* XXX never deallocated */
12295     PL_toptarget        = sv_dup_inc(proto_perl->Itoptarget, param);
12296     PL_bodytarget       = sv_dup_inc(proto_perl->Ibodytarget, param);
12297     PL_formtarget       = sv_dup(proto_perl->Iformtarget, param);
12298
12299     PL_restartop        = proto_perl->Irestartop;
12300     PL_in_eval          = proto_perl->Iin_eval;
12301     PL_delaymagic       = proto_perl->Idelaymagic;
12302     PL_dirty            = proto_perl->Idirty;
12303     PL_localizing       = proto_perl->Ilocalizing;
12304
12305     PL_errors           = sv_dup_inc(proto_perl->Ierrors, param);
12306     PL_hv_fetch_ent_mh  = NULL;
12307     PL_modcount         = proto_perl->Imodcount;
12308     PL_lastgotoprobe    = NULL;
12309     PL_dumpindent       = proto_perl->Idumpindent;
12310
12311     PL_sortcop          = (OP*)any_dup(proto_perl->Isortcop, proto_perl);
12312     PL_sortstash        = hv_dup(proto_perl->Isortstash, param);
12313     PL_firstgv          = gv_dup(proto_perl->Ifirstgv, param);
12314     PL_secondgv         = gv_dup(proto_perl->Isecondgv, param);
12315     PL_efloatbuf        = NULL;         /* reinits on demand */
12316     PL_efloatsize       = 0;                    /* reinits on demand */
12317
12318     /* regex stuff */
12319
12320     PL_screamfirst      = NULL;
12321     PL_screamnext       = NULL;
12322     PL_maxscream        = -1;                   /* reinits on demand */
12323     PL_lastscream       = NULL;
12324
12325
12326     PL_regdummy         = proto_perl->Iregdummy;
12327     PL_colorset         = 0;            /* reinits PL_colors[] */
12328     /*PL_colors[6]      = {0,0,0,0,0,0};*/
12329
12330
12331
12332     /* Pluggable optimizer */
12333     PL_peepp            = proto_perl->Ipeepp;
12334
12335     PL_stashcache       = newHV();
12336
12337     PL_watchaddr        = (char **) ptr_table_fetch(PL_ptr_table,
12338                                             proto_perl->Iwatchaddr);
12339     PL_watchok          = PL_watchaddr ? * PL_watchaddr : NULL;
12340     if (PL_debug && PL_watchaddr) {
12341         PerlIO_printf(Perl_debug_log,
12342           "WATCHING: %"UVxf" cloned as %"UVxf" with value %"UVxf"\n",
12343           PTR2UV(proto_perl->Iwatchaddr), PTR2UV(PL_watchaddr),
12344           PTR2UV(PL_watchok));
12345     }
12346
12347     PL_registered_mros  = hv_dup_inc(proto_perl->Iregistered_mros, param);
12348
12349     if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
12350         ptr_table_free(PL_ptr_table);
12351         PL_ptr_table = NULL;
12352     }
12353
12354     /* Call the ->CLONE method, if it exists, for each of the stashes
12355        identified by sv_dup() above.
12356     */
12357     while(av_len(param->stashes) != -1) {
12358         HV* const stash = MUTABLE_HV(av_shift(param->stashes));
12359         GV* const cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
12360         if (cloner && GvCV(cloner)) {
12361             dSP;
12362             ENTER;
12363             SAVETMPS;
12364             PUSHMARK(SP);
12365             mXPUSHs(newSVhek(HvNAME_HEK(stash)));
12366             PUTBACK;
12367             call_sv(MUTABLE_SV(GvCV(cloner)), G_DISCARD);
12368             FREETMPS;
12369             LEAVE;
12370         }
12371     }
12372
12373     SvREFCNT_dec(param->stashes);
12374
12375     /* orphaned? eg threads->new inside BEGIN or use */
12376     if (PL_compcv && ! SvREFCNT(PL_compcv)) {
12377         SvREFCNT_inc_simple_void(PL_compcv);
12378         SAVEFREESV(PL_compcv);
12379     }
12380
12381     return my_perl;
12382 }
12383
12384 #endif /* USE_ITHREADS */
12385
12386 /*
12387 =head1 Unicode Support
12388
12389 =for apidoc sv_recode_to_utf8
12390
12391 The encoding is assumed to be an Encode object, on entry the PV
12392 of the sv is assumed to be octets in that encoding, and the sv
12393 will be converted into Unicode (and UTF-8).
12394
12395 If the sv already is UTF-8 (or if it is not POK), or if the encoding
12396 is not a reference, nothing is done to the sv.  If the encoding is not
12397 an C<Encode::XS> Encoding object, bad things will happen.
12398 (See F<lib/encoding.pm> and L<Encode>).
12399
12400 The PV of the sv is returned.
12401
12402 =cut */
12403
12404 char *
12405 Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
12406 {
12407     dVAR;
12408
12409     PERL_ARGS_ASSERT_SV_RECODE_TO_UTF8;
12410
12411     if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
12412         SV *uni;
12413         STRLEN len;
12414         const char *s;
12415         dSP;
12416         ENTER;
12417         SAVETMPS;
12418         save_re_context();
12419         PUSHMARK(sp);
12420         EXTEND(SP, 3);
12421         XPUSHs(encoding);
12422         XPUSHs(sv);
12423 /*
12424   NI-S 2002/07/09
12425   Passing sv_yes is wrong - it needs to be or'ed set of constants
12426   for Encode::XS, while UTf-8 decode (currently) assumes a true value means
12427   remove converted chars from source.
12428
12429   Both will default the value - let them.
12430
12431         XPUSHs(&PL_sv_yes);
12432 */
12433         PUTBACK;
12434         call_method("decode", G_SCALAR);
12435         SPAGAIN;
12436         uni = POPs;
12437         PUTBACK;
12438         s = SvPV_const(uni, len);
12439         if (s != SvPVX_const(sv)) {
12440             SvGROW(sv, len + 1);
12441             Move(s, SvPVX(sv), len + 1, char);
12442             SvCUR_set(sv, len);
12443         }
12444         FREETMPS;
12445         LEAVE;
12446         SvUTF8_on(sv);
12447         return SvPVX(sv);
12448     }
12449     return SvPOKp(sv) ? SvPVX(sv) : NULL;
12450 }
12451
12452 /*
12453 =for apidoc sv_cat_decode
12454
12455 The encoding is assumed to be an Encode object, the PV of the ssv is
12456 assumed to be octets in that encoding and decoding the input starts
12457 from the position which (PV + *offset) pointed to.  The dsv will be
12458 concatenated the decoded UTF-8 string from ssv.  Decoding will terminate
12459 when the string tstr appears in decoding output or the input ends on
12460 the PV of the ssv. The value which the offset points will be modified
12461 to the last input position on the ssv.
12462
12463 Returns TRUE if the terminator was found, else returns FALSE.
12464
12465 =cut */
12466
12467 bool
12468 Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
12469                    SV *ssv, int *offset, char *tstr, int tlen)
12470 {
12471     dVAR;
12472     bool ret = FALSE;
12473
12474     PERL_ARGS_ASSERT_SV_CAT_DECODE;
12475
12476     if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) {
12477         SV *offsv;
12478         dSP;
12479         ENTER;
12480         SAVETMPS;
12481         save_re_context();
12482         PUSHMARK(sp);
12483         EXTEND(SP, 6);
12484         XPUSHs(encoding);
12485         XPUSHs(dsv);
12486         XPUSHs(ssv);
12487         offsv = newSViv(*offset);
12488         mXPUSHs(offsv);
12489         mXPUSHp(tstr, tlen);
12490         PUTBACK;
12491         call_method("cat_decode", G_SCALAR);
12492         SPAGAIN;
12493         ret = SvTRUE(TOPs);
12494         *offset = SvIV(offsv);
12495         PUTBACK;
12496         FREETMPS;
12497         LEAVE;
12498     }
12499     else
12500         Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
12501     return ret;
12502
12503 }
12504
12505 /* ---------------------------------------------------------------------
12506  *
12507  * support functions for report_uninit()
12508  */
12509
12510 /* the maxiumum size of array or hash where we will scan looking
12511  * for the undefined element that triggered the warning */
12512
12513 #define FUV_MAX_SEARCH_SIZE 1000
12514
12515 /* Look for an entry in the hash whose value has the same SV as val;
12516  * If so, return a mortal copy of the key. */
12517
12518 STATIC SV*
12519 S_find_hash_subscript(pTHX_ const HV *const hv, const SV *const val)
12520 {
12521     dVAR;
12522     register HE **array;
12523     I32 i;
12524
12525     PERL_ARGS_ASSERT_FIND_HASH_SUBSCRIPT;
12526
12527     if (!hv || SvMAGICAL(hv) || !HvARRAY(hv) ||
12528                         (HvTOTALKEYS(hv) > FUV_MAX_SEARCH_SIZE))
12529         return NULL;
12530
12531     array = HvARRAY(hv);
12532
12533     for (i=HvMAX(hv); i>0; i--) {
12534         register HE *entry;
12535         for (entry = array[i]; entry; entry = HeNEXT(entry)) {
12536             if (HeVAL(entry) != val)
12537                 continue;
12538             if (    HeVAL(entry) == &PL_sv_undef ||
12539                     HeVAL(entry) == &PL_sv_placeholder)
12540                 continue;
12541             if (!HeKEY(entry))
12542                 return NULL;
12543             if (HeKLEN(entry) == HEf_SVKEY)
12544                 return sv_mortalcopy(HeKEY_sv(entry));
12545             return sv_2mortal(newSVhek(HeKEY_hek(entry)));
12546         }
12547     }
12548     return NULL;
12549 }
12550
12551 /* Look for an entry in the array whose value has the same SV as val;
12552  * If so, return the index, otherwise return -1. */
12553
12554 STATIC I32
12555 S_find_array_subscript(pTHX_ const AV *const av, const SV *const val)
12556 {
12557     dVAR;
12558
12559     PERL_ARGS_ASSERT_FIND_ARRAY_SUBSCRIPT;
12560
12561     if (!av || SvMAGICAL(av) || !AvARRAY(av) ||
12562                         (AvFILLp(av) > FUV_MAX_SEARCH_SIZE))
12563         return -1;
12564
12565     if (val != &PL_sv_undef) {
12566         SV ** const svp = AvARRAY(av);
12567         I32 i;
12568
12569         for (i=AvFILLp(av); i>=0; i--)
12570             if (svp[i] == val)
12571                 return i;
12572     }
12573     return -1;
12574 }
12575
12576 /* S_varname(): return the name of a variable, optionally with a subscript.
12577  * If gv is non-zero, use the name of that global, along with gvtype (one
12578  * of "$", "@", "%"); otherwise use the name of the lexical at pad offset
12579  * targ.  Depending on the value of the subscript_type flag, return:
12580  */
12581
12582 #define FUV_SUBSCRIPT_NONE      1       /* "@foo"          */
12583 #define FUV_SUBSCRIPT_ARRAY     2       /* "$foo[aindex]"  */
12584 #define FUV_SUBSCRIPT_HASH      3       /* "$foo{keyname}" */
12585 #define FUV_SUBSCRIPT_WITHIN    4       /* "within @foo"   */
12586
12587 STATIC SV*
12588 S_varname(pTHX_ const GV *const gv, const char gvtype, PADOFFSET targ,
12589         const SV *const keyname, I32 aindex, int subscript_type)
12590 {
12591
12592     SV * const name = sv_newmortal();
12593     if (gv) {
12594         char buffer[2];
12595         buffer[0] = gvtype;
12596         buffer[1] = 0;
12597
12598         /* as gv_fullname4(), but add literal '^' for $^FOO names  */
12599
12600         gv_fullname4(name, gv, buffer, 0);
12601
12602         if ((unsigned int)SvPVX(name)[1] <= 26) {
12603             buffer[0] = '^';
12604             buffer[1] = SvPVX(name)[1] + 'A' - 1;
12605
12606             /* Swap the 1 unprintable control character for the 2 byte pretty
12607                version - ie substr($name, 1, 1) = $buffer; */
12608             sv_insert(name, 1, 1, buffer, 2);
12609         }
12610     }
12611     else {
12612         CV * const cv = find_runcv(NULL);
12613         SV *sv;
12614         AV *av;
12615
12616         if (!cv || !CvPADLIST(cv))
12617             return NULL;
12618         av = MUTABLE_AV((*av_fetch(CvPADLIST(cv), 0, FALSE)));
12619         sv = *av_fetch(av, targ, FALSE);
12620         sv_setpvn(name, SvPV_nolen_const(sv), SvCUR(sv));
12621     }
12622
12623     if (subscript_type == FUV_SUBSCRIPT_HASH) {
12624         SV * const sv = newSV(0);
12625         *SvPVX(name) = '$';
12626         Perl_sv_catpvf(aTHX_ name, "{%s}",
12627             pv_display(sv,SvPVX_const(keyname), SvCUR(keyname), 0, 32));
12628         SvREFCNT_dec(sv);
12629     }
12630     else if (subscript_type == FUV_SUBSCRIPT_ARRAY) {
12631         *SvPVX(name) = '$';
12632         Perl_sv_catpvf(aTHX_ name, "[%"IVdf"]", (IV)aindex);
12633     }
12634     else if (subscript_type == FUV_SUBSCRIPT_WITHIN) {
12635         /* We know that name has no magic, so can use 0 instead of SV_GMAGIC */
12636         Perl_sv_insert_flags(aTHX_ name, 0, 0,  STR_WITH_LEN("within "), 0);
12637     }
12638
12639     return name;
12640 }
12641
12642
12643 /*
12644 =for apidoc find_uninit_var
12645
12646 Find the name of the undefined variable (if any) that caused the operator o
12647 to issue a "Use of uninitialized value" warning.
12648 If match is true, only return a name if it's value matches uninit_sv.
12649 So roughly speaking, if a unary operator (such as OP_COS) generates a
12650 warning, then following the direct child of the op may yield an
12651 OP_PADSV or OP_GV that gives the name of the undefined variable. On the
12652 other hand, with OP_ADD there are two branches to follow, so we only print
12653 the variable name if we get an exact match.
12654
12655 The name is returned as a mortal SV.
12656
12657 Assumes that PL_op is the op that originally triggered the error, and that
12658 PL_comppad/PL_curpad points to the currently executing pad.
12659
12660 =cut
12661 */
12662
12663 STATIC SV *
12664 S_find_uninit_var(pTHX_ const OP *const obase, const SV *const uninit_sv,
12665                   bool match)
12666 {
12667     dVAR;
12668     SV *sv;
12669     const GV *gv;
12670     const OP *o, *o2, *kid;
12671
12672     if (!obase || (match && (!uninit_sv || uninit_sv == &PL_sv_undef ||
12673                             uninit_sv == &PL_sv_placeholder)))
12674         return NULL;
12675
12676     switch (obase->op_type) {
12677
12678     case OP_RV2AV:
12679     case OP_RV2HV:
12680     case OP_PADAV:
12681     case OP_PADHV:
12682       {
12683         const bool pad  = (obase->op_type == OP_PADAV || obase->op_type == OP_PADHV);
12684         const bool hash = (obase->op_type == OP_PADHV || obase->op_type == OP_RV2HV);
12685         I32 index = 0;
12686         SV *keysv = NULL;
12687         int subscript_type = FUV_SUBSCRIPT_WITHIN;
12688
12689         if (pad) { /* @lex, %lex */
12690             sv = PAD_SVl(obase->op_targ);
12691             gv = NULL;
12692         }
12693         else {
12694             if (cUNOPx(obase)->op_first->op_type == OP_GV) {
12695             /* @global, %global */
12696                 gv = cGVOPx_gv(cUNOPx(obase)->op_first);
12697                 if (!gv)
12698                     break;
12699                 sv = hash ? MUTABLE_SV(GvHV(gv)): MUTABLE_SV(GvAV(gv));
12700             }
12701             else /* @{expr}, %{expr} */
12702                 return find_uninit_var(cUNOPx(obase)->op_first,
12703                                                     uninit_sv, match);
12704         }
12705
12706         /* attempt to find a match within the aggregate */
12707         if (hash) {
12708             keysv = find_hash_subscript((const HV*)sv, uninit_sv);
12709             if (keysv)
12710                 subscript_type = FUV_SUBSCRIPT_HASH;
12711         }
12712         else {
12713             index = find_array_subscript((const AV *)sv, uninit_sv);
12714             if (index >= 0)
12715                 subscript_type = FUV_SUBSCRIPT_ARRAY;
12716         }
12717
12718         if (match && subscript_type == FUV_SUBSCRIPT_WITHIN)
12719             break;
12720
12721         return varname(gv, hash ? '%' : '@', obase->op_targ,
12722                                     keysv, index, subscript_type);
12723       }
12724
12725     case OP_PADSV:
12726         if (match && PAD_SVl(obase->op_targ) != uninit_sv)
12727             break;
12728         return varname(NULL, '$', obase->op_targ,
12729                                     NULL, 0, FUV_SUBSCRIPT_NONE);
12730
12731     case OP_GVSV:
12732         gv = cGVOPx_gv(obase);
12733         if (!gv || (match && GvSV(gv) != uninit_sv))
12734             break;
12735         return varname(gv, '$', 0, NULL, 0, FUV_SUBSCRIPT_NONE);
12736
12737     case OP_AELEMFAST:
12738         if (obase->op_flags & OPf_SPECIAL) { /* lexical array */
12739             if (match) {
12740                 SV **svp;
12741                 AV *av = MUTABLE_AV(PAD_SV(obase->op_targ));
12742                 if (!av || SvRMAGICAL(av))
12743                     break;
12744                 svp = av_fetch(av, (I32)obase->op_private, FALSE);
12745                 if (!svp || *svp != uninit_sv)
12746                     break;
12747             }
12748             return varname(NULL, '$', obase->op_targ,
12749                     NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
12750         }
12751         else {
12752             gv = cGVOPx_gv(obase);
12753             if (!gv)
12754                 break;
12755             if (match) {
12756                 SV **svp;
12757                 AV *const av = GvAV(gv);
12758                 if (!av || SvRMAGICAL(av))
12759                     break;
12760                 svp = av_fetch(av, (I32)obase->op_private, FALSE);
12761                 if (!svp || *svp != uninit_sv)
12762                     break;
12763             }
12764             return varname(gv, '$', 0,
12765                     NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
12766         }
12767         break;
12768
12769     case OP_EXISTS:
12770         o = cUNOPx(obase)->op_first;
12771         if (!o || o->op_type != OP_NULL ||
12772                 ! (o->op_targ == OP_AELEM || o->op_targ == OP_HELEM))
12773             break;
12774         return find_uninit_var(cBINOPo->op_last, uninit_sv, match);
12775
12776     case OP_AELEM:
12777     case OP_HELEM:
12778         if (PL_op == obase)
12779             /* $a[uninit_expr] or $h{uninit_expr} */
12780             return find_uninit_var(cBINOPx(obase)->op_last, uninit_sv, match);
12781
12782         gv = NULL;
12783         o = cBINOPx(obase)->op_first;
12784         kid = cBINOPx(obase)->op_last;
12785
12786         /* get the av or hv, and optionally the gv */
12787         sv = NULL;
12788         if  (o->op_type == OP_PADAV || o->op_type == OP_PADHV) {
12789             sv = PAD_SV(o->op_targ);
12790         }
12791         else if ((o->op_type == OP_RV2AV || o->op_type == OP_RV2HV)
12792                 && cUNOPo->op_first->op_type == OP_GV)
12793         {
12794             gv = cGVOPx_gv(cUNOPo->op_first);
12795             if (!gv)
12796                 break;
12797             sv = o->op_type
12798                 == OP_RV2HV ? MUTABLE_SV(GvHV(gv)) : MUTABLE_SV(GvAV(gv));
12799         }
12800         if (!sv)
12801             break;
12802
12803         if (kid && kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid))) {
12804             /* index is constant */
12805             if (match) {
12806                 if (SvMAGICAL(sv))
12807                     break;
12808                 if (obase->op_type == OP_HELEM) {
12809                     HE* he = hv_fetch_ent(MUTABLE_HV(sv), cSVOPx_sv(kid), 0, 0);
12810                     if (!he || HeVAL(he) != uninit_sv)
12811                         break;
12812                 }
12813                 else {
12814                     SV * const * const svp = av_fetch(MUTABLE_AV(sv), SvIV(cSVOPx_sv(kid)), FALSE);
12815                     if (!svp || *svp != uninit_sv)
12816                         break;
12817                 }
12818             }
12819             if (obase->op_type == OP_HELEM)
12820                 return varname(gv, '%', o->op_targ,
12821                             cSVOPx_sv(kid), 0, FUV_SUBSCRIPT_HASH);
12822             else
12823                 return varname(gv, '@', o->op_targ, NULL,
12824                             SvIV(cSVOPx_sv(kid)), FUV_SUBSCRIPT_ARRAY);
12825         }
12826         else  {
12827             /* index is an expression;
12828              * attempt to find a match within the aggregate */
12829             if (obase->op_type == OP_HELEM) {
12830                 SV * const keysv = find_hash_subscript((const HV*)sv, uninit_sv);
12831                 if (keysv)
12832                     return varname(gv, '%', o->op_targ,
12833                                                 keysv, 0, FUV_SUBSCRIPT_HASH);
12834             }
12835             else {
12836                 const I32 index
12837                     = find_array_subscript((const AV *)sv, uninit_sv);
12838                 if (index >= 0)
12839                     return varname(gv, '@', o->op_targ,
12840                                         NULL, index, FUV_SUBSCRIPT_ARRAY);
12841             }
12842             if (match)
12843                 break;
12844             return varname(gv,
12845                 (o->op_type == OP_PADAV || o->op_type == OP_RV2AV)
12846                 ? '@' : '%',
12847                 o->op_targ, NULL, 0, FUV_SUBSCRIPT_WITHIN);
12848         }
12849         break;
12850
12851     case OP_AASSIGN:
12852         /* only examine RHS */
12853         return find_uninit_var(cBINOPx(obase)->op_first, uninit_sv, match);
12854
12855     case OP_OPEN:
12856         o = cUNOPx(obase)->op_first;
12857         if (o->op_type == OP_PUSHMARK)
12858             o = o->op_sibling;
12859
12860         if (!o->op_sibling) {
12861             /* one-arg version of open is highly magical */
12862
12863             if (o->op_type == OP_GV) { /* open FOO; */
12864                 gv = cGVOPx_gv(o);
12865                 if (match && GvSV(gv) != uninit_sv)
12866                     break;
12867                 return varname(gv, '$', 0,
12868                             NULL, 0, FUV_SUBSCRIPT_NONE);
12869             }
12870             /* other possibilities not handled are:
12871              * open $x; or open my $x;  should return '${*$x}'
12872              * open expr;               should return '$'.expr ideally
12873              */
12874              break;
12875         }
12876         goto do_op;
12877
12878     /* ops where $_ may be an implicit arg */
12879     case OP_TRANS:
12880     case OP_SUBST:
12881     case OP_MATCH:
12882         if ( !(obase->op_flags & OPf_STACKED)) {
12883             if (uninit_sv == ((obase->op_private & OPpTARGET_MY)
12884                                  ? PAD_SVl(obase->op_targ)
12885                                  : DEFSV))
12886             {
12887                 sv = sv_newmortal();
12888                 sv_setpvs(sv, "$_");
12889                 return sv;
12890             }
12891         }
12892         goto do_op;
12893
12894     case OP_PRTF:
12895     case OP_PRINT:
12896     case OP_SAY:
12897         match = 1; /* print etc can return undef on defined args */
12898         /* skip filehandle as it can't produce 'undef' warning  */
12899         o = cUNOPx(obase)->op_first;
12900         if ((obase->op_flags & OPf_STACKED) && o->op_type == OP_PUSHMARK)
12901             o = o->op_sibling->op_sibling;
12902         goto do_op2;
12903
12904
12905     case OP_ENTEREVAL: /* could be eval $undef or $x='$undef'; eval $x */
12906     case OP_RV2SV:
12907     case OP_CUSTOM: /* XS or custom code could trigger random warnings */
12908
12909         /* the following ops are capable of returning PL_sv_undef even for
12910          * defined arg(s) */
12911
12912     case OP_BACKTICK:
12913     case OP_PIPE_OP:
12914     case OP_FILENO:
12915     case OP_BINMODE:
12916     case OP_TIED:
12917     case OP_GETC:
12918     case OP_SYSREAD:
12919     case OP_SEND:
12920     case OP_IOCTL:
12921     case OP_SOCKET:
12922     case OP_SOCKPAIR:
12923     case OP_BIND:
12924     case OP_CONNECT:
12925     case OP_LISTEN:
12926     case OP_ACCEPT:
12927     case OP_SHUTDOWN:
12928     case OP_SSOCKOPT:
12929     case OP_GETPEERNAME:
12930     case OP_FTRREAD:
12931     case OP_FTRWRITE:
12932     case OP_FTREXEC:
12933     case OP_FTROWNED:
12934     case OP_FTEREAD:
12935     case OP_FTEWRITE:
12936     case OP_FTEEXEC:
12937     case OP_FTEOWNED:
12938     case OP_FTIS:
12939     case OP_FTZERO:
12940     case OP_FTSIZE:
12941     case OP_FTFILE:
12942     case OP_FTDIR:
12943     case OP_FTLINK:
12944     case OP_FTPIPE:
12945     case OP_FTSOCK:
12946     case OP_FTBLK:
12947     case OP_FTCHR:
12948     case OP_FTTTY:
12949     case OP_FTSUID:
12950     case OP_FTSGID:
12951     case OP_FTSVTX:
12952     case OP_FTTEXT:
12953     case OP_FTBINARY:
12954     case OP_FTMTIME:
12955     case OP_FTATIME:
12956     case OP_FTCTIME:
12957     case OP_READLINK:
12958     case OP_OPEN_DIR:
12959     case OP_READDIR:
12960     case OP_TELLDIR:
12961     case OP_SEEKDIR:
12962     case OP_REWINDDIR:
12963     case OP_CLOSEDIR:
12964     case OP_GMTIME:
12965     case OP_ALARM:
12966     case OP_SEMGET:
12967     case OP_GETLOGIN:
12968     case OP_UNDEF:
12969     case OP_SUBSTR:
12970     case OP_AEACH:
12971     case OP_EACH:
12972     case OP_SORT:
12973     case OP_CALLER:
12974     case OP_DOFILE:
12975     case OP_PROTOTYPE:
12976     case OP_NCMP:
12977     case OP_SMARTMATCH:
12978     case OP_UNPACK:
12979     case OP_SYSOPEN:
12980     case OP_SYSSEEK:
12981         match = 1;
12982         goto do_op;
12983
12984     case OP_ENTERSUB:
12985     case OP_GOTO:
12986         /* XXX tmp hack: these two may call an XS sub, and currently
12987           XS subs don't have a SUB entry on the context stack, so CV and
12988           pad determination goes wrong, and BAD things happen. So, just
12989           don't try to determine the value under those circumstances.
12990           Need a better fix at dome point. DAPM 11/2007 */
12991         break;
12992
12993
12994     case OP_POS:
12995         /* def-ness of rval pos() is independent of the def-ness of its arg */
12996         if ( !(obase->op_flags & OPf_MOD))
12997             break;
12998
12999     case OP_SCHOMP:
13000     case OP_CHOMP:
13001         if (SvROK(PL_rs) && uninit_sv == SvRV(PL_rs))
13002             return newSVpvs_flags("${$/}", SVs_TEMP);
13003         /*FALLTHROUGH*/
13004
13005     default:
13006     do_op:
13007         if (!(obase->op_flags & OPf_KIDS))
13008             break;
13009         o = cUNOPx(obase)->op_first;
13010         
13011     do_op2:
13012         if (!o)
13013             break;
13014
13015         /* if all except one arg are constant, or have no side-effects,
13016          * or are optimized away, then it's unambiguous */
13017         o2 = NULL;
13018         for (kid=o; kid; kid = kid->op_sibling) {
13019             if (kid) {
13020                 const OPCODE type = kid->op_type;
13021                 if ( (type == OP_CONST && SvOK(cSVOPx_sv(kid)))
13022                   || (type == OP_NULL  && ! (kid->op_flags & OPf_KIDS))
13023                   || (type == OP_PUSHMARK)
13024                 )
13025                 continue;
13026             }
13027             if (o2) { /* more than one found */
13028                 o2 = NULL;
13029                 break;
13030             }
13031             o2 = kid;
13032         }
13033         if (o2)
13034             return find_uninit_var(o2, uninit_sv, match);
13035
13036         /* scan all args */
13037         while (o) {
13038             sv = find_uninit_var(o, uninit_sv, 1);
13039             if (sv)
13040                 return sv;
13041             o = o->op_sibling;
13042         }
13043         break;
13044     }
13045     return NULL;
13046 }
13047
13048
13049 /*
13050 =for apidoc report_uninit
13051
13052 Print appropriate "Use of uninitialized variable" warning
13053
13054 =cut
13055 */
13056
13057 void
13058 Perl_report_uninit(pTHX_ const SV *uninit_sv)
13059 {
13060     dVAR;
13061     if (PL_op) {
13062         SV* varname = NULL;
13063         if (uninit_sv) {
13064             varname = find_uninit_var(PL_op, uninit_sv,0);
13065             if (varname)
13066                 sv_insert(varname, 0, 0, " ", 1);
13067         }
13068         Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
13069                 varname ? SvPV_nolen_const(varname) : "",
13070                 " in ", OP_DESC(PL_op));
13071     }
13072     else
13073         Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
13074                     "", "", "");
13075 }
13076
13077 /*
13078  * Local variables:
13079  * c-indentation-style: bsd
13080  * c-basic-offset: 4
13081  * indent-tabs-mode: t
13082  * End:
13083  *
13084  * ex: set ts=8 sts=4 sw=4 noet:
13085  */