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