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