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