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