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