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