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