This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
d161b1134859429a9a10aaf75776ca2b7199bf1d
[perl5.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, 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 sv,
62 av, hv...) contains type and reference count information, as well as a
63 pointer to the body (struct xrv, xpv, xpviv...), which contains fields
64 specific to each type.
65
66 Normally, this allocation is done using arenas, which by default are
67 approximately 4K chunks of memory parcelled up into N heads or bodies.  The
68 first slot in each arena is reserved, and is used to hold a link to the next
69 arena.  In the case of heads, the unused first slot also contains some flags
70 and a note of the number of slots.  Snaked through each arena chain is a
71 linked list of free items; when this becomes empty, an extra arena is
72 allocated and divided up into N items which are threaded into the free list.
73
74 The following global variables are associated with arenas:
75
76     PL_sv_arenaroot     pointer to list of SV arenas
77     PL_sv_root          pointer to list of free SV structures
78
79     PL_foo_arenaroot    pointer to list of foo arenas,
80     PL_foo_root         pointer to list of free foo bodies
81                             ... for foo in xiv, xnv, xrv, xpv etc.
82
83 Note that some of the larger and more rarely used body types (eg xpvio)
84 are not allocated using arenas, but are instead just malloc()/free()ed as
85 required. Also, if PURIFY is defined, arenas are abandoned altogether,
86 with all items individually malloc()ed. In addition, a few SV heads are
87 not allocated from an arena, but are instead directly created as static
88 or auto variables, eg PL_sv_undef.  The size of arenas can be changed from
89 the default by setting PERL_ARENA_SIZE appropriately at compile time.
90
91 The SV arena serves the secondary purpose of allowing still-live SVs
92 to be located and destroyed during final cleanup.
93
94 At the lowest level, the macros new_SV() and del_SV() grab and free
95 an SV head.  (If debugging with -DD, del_SV() calls the function S_del_sv()
96 to return the SV to the free list with error checking.) new_SV() calls
97 more_sv() / sv_add_arena() to add an extra arena if the free list is empty.
98 SVs in the free list have their SvTYPE field set to all ones.
99
100 Similarly, there are macros new_XIV()/del_XIV(), new_XNV()/del_XNV() etc
101 that allocate and return individual body types. Normally these are mapped
102 to the arena-manipulating functions new_xiv()/del_xiv() etc, but may be
103 instead mapped directly to malloc()/free() if PURIFY is defined. The
104 new/del functions remove from, or add to, the appropriate PL_foo_root
105 list, and call more_xiv() etc to add a new arena if the list is empty.
106
107 At the time of very final cleanup, sv_free_arenas() is called from
108 perl_destruct() to physically free all the arenas allocated since the
109 start of the interpreter.  Note that this also clears PL_he_arenaroot,
110 which is otherwise dealt with in hv.c.
111
112 Manipulation of any of the PL_*root pointers is protected by enclosing
113 LOCK_SV_MUTEX; ... UNLOCK_SV_MUTEX calls which should Do the Right Thing
114 if threads are enabled.
115
116 The function visit() scans the SV arenas list, and calls a specified
117 function for each SV it finds which is still live - ie which has an SvTYPE
118 other than all 1's, and a non-zero SvREFCNT. visit() is used by the
119 following functions (specified as [function that calls visit()] / [function
120 called by visit() for each SV]):
121
122     sv_report_used() / do_report_used()
123                         dump all remaining SVs (debugging aid)
124
125     sv_clean_objs() / do_clean_objs(),do_clean_named_objs()
126                         Attempt to free all objects pointed to by RVs,
127                         and, unless DISABLE_DESTRUCTOR_KLUDGE is defined,
128                         try to do the same for all objects indirectly
129                         referenced by typeglobs too.  Called once from
130                         perl_destruct(), prior to calling sv_clean_all()
131                         below.
132
133     sv_clean_all() / do_clean_all()
134                         SvREFCNT_dec(sv) each remaining SV, possibly
135                         triggering an sv_free(). It also sets the
136                         SVf_BREAK flag on the SV to indicate that the
137                         refcnt has been artificially lowered, and thus
138                         stopping sv_free() from giving spurious warnings
139                         about SVs which unexpectedly have a refcnt
140                         of zero.  called repeatedly from perl_destruct()
141                         until there are no SVs left.
142
143 =head2 Summary
144
145 Private API to rest of sv.c
146
147     new_SV(),  del_SV(),
148
149     new_XIV(), del_XIV(),
150     new_XNV(), del_XNV(),
151     etc
152
153 Public API:
154
155     sv_report_used(), sv_clean_objs(), sv_clean_all(), sv_free_arenas()
156
157
158 =cut
159
160 ============================================================================ */
161
162
163
164 /*
165  * "A time to plant, and a time to uproot what was planted..."
166  */
167
168
169 #ifdef DEBUG_LEAKING_SCALARS
170 #  ifdef NETWARE
171 #    define FREE_SV_DEBUG_FILE(sv) PerlMemfree((sv)->sv_debug_file)
172 #  else
173 #    define FREE_SV_DEBUG_FILE(sv) PerlMemShared_free((sv)->sv_debug_file)
174 #  endif
175 #else
176 #  define FREE_SV_DEBUG_FILE(sv)
177 #endif
178
179 #define plant_SV(p) \
180     STMT_START {                                        \
181         FREE_SV_DEBUG_FILE(p);                          \
182         SvANY(p) = (void *)PL_sv_root;                  \
183         SvFLAGS(p) = SVTYPEMASK;                        \
184         PL_sv_root = (p);                               \
185         --PL_sv_count;                                  \
186     } STMT_END
187
188 /* sv_mutex must be held while calling uproot_SV() */
189 #define uproot_SV(p) \
190     STMT_START {                                        \
191         (p) = PL_sv_root;                               \
192         PL_sv_root = (SV*)SvANY(p);                     \
193         ++PL_sv_count;                                  \
194     } STMT_END
195
196
197 /* make some more SVs by adding another arena */
198
199 /* sv_mutex must be held while calling more_sv() */
200 STATIC SV*
201 S_more_sv(pTHX)
202 {
203     SV* sv;
204
205     if (PL_nice_chunk) {
206         sv_add_arena(PL_nice_chunk, PL_nice_chunk_size, 0);
207         PL_nice_chunk = Nullch;
208         PL_nice_chunk_size = 0;
209     }
210     else {
211         char *chunk;                /* must use New here to match call to */
212         New(704,chunk,PERL_ARENA_SIZE,char);   /* Safefree() in sv_free_arenas()     */
213         sv_add_arena(chunk, PERL_ARENA_SIZE, 0);
214     }
215     uproot_SV(sv);
216     return sv;
217 }
218
219 /* new_SV(): return a new, empty SV head */
220
221 #ifdef DEBUG_LEAKING_SCALARS
222 /* provide a real function for a debugger to play with */
223 STATIC SV*
224 S_new_SV(pTHX)
225 {
226     SV* sv;
227
228     LOCK_SV_MUTEX;
229     if (PL_sv_root)
230         uproot_SV(sv);
231     else
232         sv = S_more_sv(aTHX);
233     UNLOCK_SV_MUTEX;
234     SvANY(sv) = 0;
235     SvREFCNT(sv) = 1;
236     SvFLAGS(sv) = 0;
237     sv->sv_debug_optype = PL_op ? PL_op->op_type : 0;
238     sv->sv_debug_line = (U16) ((PL_copline == NOLINE) ?
239         (PL_curcop ? CopLINE(PL_curcop) : 0) : PL_copline);
240     sv->sv_debug_inpad = 0;
241     sv->sv_debug_cloned = 0;
242 #  ifdef NETWARE
243     sv->sv_debug_file = PL_curcop ? savepv(CopFILE(PL_curcop)): NULL;
244 #  else
245     sv->sv_debug_file = PL_curcop ? savesharedpv(CopFILE(PL_curcop)): NULL;
246 #  endif
247     
248     return sv;
249 }
250 #  define new_SV(p) (p)=S_new_SV(aTHX)
251
252 #else
253 #  define new_SV(p) \
254     STMT_START {                                        \
255         LOCK_SV_MUTEX;                                  \
256         if (PL_sv_root)                                 \
257             uproot_SV(p);                               \
258         else                                            \
259             (p) = S_more_sv(aTHX);                      \
260         UNLOCK_SV_MUTEX;                                \
261         SvANY(p) = 0;                                   \
262         SvREFCNT(p) = 1;                                \
263         SvFLAGS(p) = 0;                                 \
264     } STMT_END
265 #endif
266
267
268 /* del_SV(): return an empty SV head to the free list */
269
270 #ifdef DEBUGGING
271
272 #define del_SV(p) \
273     STMT_START {                                        \
274         LOCK_SV_MUTEX;                                  \
275         if (DEBUG_D_TEST)                               \
276             del_sv(p);                                  \
277         else                                            \
278             plant_SV(p);                                \
279         UNLOCK_SV_MUTEX;                                \
280     } STMT_END
281
282 STATIC void
283 S_del_sv(pTHX_ SV *p)
284 {
285     if (DEBUG_D_TEST) {
286         SV* sva;
287         bool ok = 0;
288         for (sva = PL_sv_arenaroot; sva; sva = (SV *) SvANY(sva)) {
289             SV *sv = sva + 1;
290             SV *svend = &sva[SvREFCNT(sva)];
291             if (p >= sv && p < svend) {
292                 ok = 1;
293                 break;
294             }
295         }
296         if (!ok) {
297             if (ckWARN_d(WARN_INTERNAL))        
298                 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
299                             "Attempt to free non-arena SV: 0x%"UVxf
300                             pTHX__FORMAT, PTR2UV(p) pTHX__VALUE);
301             return;
302         }
303     }
304     plant_SV(p);
305 }
306
307 #else /* ! DEBUGGING */
308
309 #define del_SV(p)   plant_SV(p)
310
311 #endif /* DEBUGGING */
312
313
314 /*
315 =head1 SV Manipulation Functions
316
317 =for apidoc sv_add_arena
318
319 Given a chunk of memory, link it to the head of the list of arenas,
320 and split it into a list of free SVs.
321
322 =cut
323 */
324
325 void
326 Perl_sv_add_arena(pTHX_ char *ptr, U32 size, U32 flags)
327 {
328     SV* sva = (SV*)ptr;
329     register SV* sv;
330     register SV* svend;
331
332     /* The first SV in an arena isn't an SV. */
333     SvANY(sva) = (void *) PL_sv_arenaroot;              /* ptr to next arena */
334     SvREFCNT(sva) = size / sizeof(SV);          /* number of SV slots */
335     SvFLAGS(sva) = flags;                       /* FAKE if not to be freed */
336
337     PL_sv_arenaroot = sva;
338     PL_sv_root = sva + 1;
339
340     svend = &sva[SvREFCNT(sva) - 1];
341     sv = sva + 1;
342     while (sv < svend) {
343         SvANY(sv) = (void *)(SV*)(sv + 1);
344 #ifdef DEBUGGING
345         SvREFCNT(sv) = 0;
346 #endif
347         /* Must always set typemask because it's awlays checked in on cleanup
348            when the arenas are walked looking for objects.  */
349         SvFLAGS(sv) = SVTYPEMASK;
350         sv++;
351     }
352     SvANY(sv) = 0;
353 #ifdef DEBUGGING
354     SvREFCNT(sv) = 0;
355 #endif
356     SvFLAGS(sv) = SVTYPEMASK;
357 }
358
359 /* visit(): call the named function for each non-free SV in the arenas
360  * whose flags field matches the flags/mask args. */
361
362 STATIC I32
363 S_visit(pTHX_ SVFUNC_t f, U32 flags, U32 mask)
364 {
365     SV* sva;
366     I32 visited = 0;
367
368     for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
369         register SV * const svend = &sva[SvREFCNT(sva)];
370         register SV* sv;
371         for (sv = sva + 1; sv < svend; ++sv) {
372             if (SvTYPE(sv) != SVTYPEMASK
373                     && (sv->sv_flags & mask) == flags
374                     && SvREFCNT(sv))
375             {
376                 (FCALL)(aTHX_ sv);
377                 ++visited;
378             }
379         }
380     }
381     return visited;
382 }
383
384 #ifdef DEBUGGING
385
386 /* called by sv_report_used() for each live SV */
387
388 static void
389 do_report_used(pTHX_ SV *sv)
390 {
391     if (SvTYPE(sv) != SVTYPEMASK) {
392         PerlIO_printf(Perl_debug_log, "****\n");
393         sv_dump(sv);
394     }
395 }
396 #endif
397
398 /*
399 =for apidoc sv_report_used
400
401 Dump the contents of all SVs not yet freed. (Debugging aid).
402
403 =cut
404 */
405
406 void
407 Perl_sv_report_used(pTHX)
408 {
409 #ifdef DEBUGGING
410     visit(do_report_used, 0, 0);
411 #endif
412 }
413
414 /* called by sv_clean_objs() for each live SV */
415
416 static void
417 do_clean_objs(pTHX_ SV *sv)
418 {
419     SV* rv;
420
421     if (SvROK(sv) && SvOBJECT(rv = SvRV(sv))) {
422         DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(sv)));
423         if (SvWEAKREF(sv)) {
424             sv_del_backref(sv);
425             SvWEAKREF_off(sv);
426             SvRV_set(sv, NULL);
427         } else {
428             SvROK_off(sv);
429             SvRV_set(sv, NULL);
430             SvREFCNT_dec(rv);
431         }
432     }
433
434     /* XXX Might want to check arrays, etc. */
435 }
436
437 /* called by sv_clean_objs() for each live SV */
438
439 #ifndef DISABLE_DESTRUCTOR_KLUDGE
440 static void
441 do_clean_named_objs(pTHX_ SV *sv)
442 {
443     if (SvTYPE(sv) == SVt_PVGV && GvGP(sv)) {
444         if ( SvOBJECT(GvSV(sv)) ||
445              (GvAV(sv) && SvOBJECT(GvAV(sv))) ||
446              (GvHV(sv) && SvOBJECT(GvHV(sv))) ||
447              (GvIO(sv) && SvOBJECT(GvIO(sv))) ||
448              (GvCV(sv) && SvOBJECT(GvCV(sv))) )
449         {
450             DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning named glob object:\n "), sv_dump(sv)));
451             SvFLAGS(sv) |= SVf_BREAK;
452             SvREFCNT_dec(sv);
453         }
454     }
455 }
456 #endif
457
458 /*
459 =for apidoc sv_clean_objs
460
461 Attempt to destroy all objects not yet freed
462
463 =cut
464 */
465
466 void
467 Perl_sv_clean_objs(pTHX)
468 {
469     PL_in_clean_objs = TRUE;
470     visit(do_clean_objs, SVf_ROK, SVf_ROK);
471 #ifndef DISABLE_DESTRUCTOR_KLUDGE
472     /* some barnacles may yet remain, clinging to typeglobs */
473     visit(do_clean_named_objs, SVt_PVGV, SVTYPEMASK);
474 #endif
475     PL_in_clean_objs = FALSE;
476 }
477
478 /* called by sv_clean_all() for each live SV */
479
480 static void
481 do_clean_all(pTHX_ SV *sv)
482 {
483     DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%"UVxf"\n", PTR2UV(sv)) ));
484     SvFLAGS(sv) |= SVf_BREAK;
485     if (PL_comppad == (AV*)sv) {
486         PL_comppad = Nullav;
487         PL_curpad = Null(SV**);
488     }
489     SvREFCNT_dec(sv);
490 }
491
492 /*
493 =for apidoc sv_clean_all
494
495 Decrement the refcnt of each remaining SV, possibly triggering a
496 cleanup. This function may have to be called multiple times to free
497 SVs which are in complex self-referential hierarchies.
498
499 =cut
500 */
501
502 I32
503 Perl_sv_clean_all(pTHX)
504 {
505     I32 cleaned;
506     PL_in_clean_all = TRUE;
507     cleaned = visit(do_clean_all, 0,0);
508     PL_in_clean_all = FALSE;
509     return cleaned;
510 }
511
512 /*
513 =for apidoc sv_free_arenas
514
515 Deallocate the memory used by all arenas. Note that all the individual SV
516 heads and bodies within the arenas must already have been freed.
517
518 =cut
519 */
520
521 void
522 Perl_sv_free_arenas(pTHX)
523 {
524     SV* sva;
525     SV* svanext;
526     void *arena, *arenanext;
527
528     /* Free arenas here, but be careful about fake ones.  (We assume
529        contiguity of the fake ones with the corresponding real ones.) */
530
531     for (sva = PL_sv_arenaroot; sva; sva = svanext) {
532         svanext = (SV*) SvANY(sva);
533         while (svanext && SvFAKE(svanext))
534             svanext = (SV*) SvANY(svanext);
535
536         if (!SvFAKE(sva))
537             Safefree(sva);
538     }
539
540     for (arena = PL_xnv_arenaroot; arena; arena = arenanext) {
541         arenanext = *(void **)arena;
542         Safefree(arena);
543     }
544     PL_xnv_arenaroot = 0;
545     PL_xnv_root = 0;
546
547     for (arena = PL_xpv_arenaroot; arena; arena = arenanext) {
548         arenanext = *(void **)arena;
549         Safefree(arena);
550     }
551     PL_xpv_arenaroot = 0;
552     PL_xpv_root = 0;
553
554     for (arena = PL_xpviv_arenaroot; arena; arena = arenanext) {
555         arenanext = *(void **)arena;
556         Safefree(arena);
557     }
558     PL_xpviv_arenaroot = 0;
559     PL_xpviv_root = 0;
560
561     for (arena = PL_xpvnv_arenaroot; arena; arena = arenanext) {
562         arenanext = *(void **)arena;
563         Safefree(arena);
564     }
565     PL_xpvnv_arenaroot = 0;
566     PL_xpvnv_root = 0;
567
568     for (arena = PL_xpvcv_arenaroot; arena; arena = arenanext) {
569         arenanext = *(void **)arena;
570         Safefree(arena);
571     }
572     PL_xpvcv_arenaroot = 0;
573     PL_xpvcv_root = 0;
574
575     for (arena = PL_xpvav_arenaroot; arena; arena = arenanext) {
576         arenanext = *(void **)arena;
577         Safefree(arena);
578     }
579     PL_xpvav_arenaroot = 0;
580     PL_xpvav_root = 0;
581
582     for (arena = PL_xpvhv_arenaroot; arena; arena = arenanext) {
583         arenanext = *(void **)arena;
584         Safefree(arena);
585     }
586     PL_xpvhv_arenaroot = 0;
587     PL_xpvhv_root = 0;
588
589     for (arena = PL_xpvmg_arenaroot; arena; arena = arenanext) {
590         arenanext = *(void **)arena;
591         Safefree(arena);
592     }
593     PL_xpvmg_arenaroot = 0;
594     PL_xpvmg_root = 0;
595
596     for (arena = PL_xpvgv_arenaroot; arena; arena = arenanext) {
597         arenanext = *(void **)arena;
598         Safefree(arena);
599     }
600     PL_xpvgv_arenaroot = 0;
601     PL_xpvgv_root = 0;
602
603     for (arena = PL_xpvlv_arenaroot; arena; arena = arenanext) {
604         arenanext = *(void **)arena;
605         Safefree(arena);
606     }
607     PL_xpvlv_arenaroot = 0;
608     PL_xpvlv_root = 0;
609
610     for (arena = PL_xpvbm_arenaroot; arena; arena = arenanext) {
611         arenanext = *(void **)arena;
612         Safefree(arena);
613     }
614     PL_xpvbm_arenaroot = 0;
615     PL_xpvbm_root = 0;
616
617     {
618         HE *he;
619         HE *he_next;
620         for (he = PL_he_arenaroot; he; he = he_next) {
621             he_next = HeNEXT(he);
622             Safefree(he);
623         }
624     }
625     PL_he_arenaroot = 0;
626     PL_he_root = 0;
627
628 #if defined(USE_ITHREADS)
629     {
630         struct ptr_tbl_ent *pte;
631         struct ptr_tbl_ent *pte_next;
632         for (pte = PL_pte_arenaroot; pte; pte = pte_next) {
633             pte_next = pte->next;
634             Safefree(pte);
635         }
636     }
637     PL_pte_arenaroot = 0;
638     PL_pte_root = 0;
639 #endif
640
641     if (PL_nice_chunk)
642         Safefree(PL_nice_chunk);
643     PL_nice_chunk = Nullch;
644     PL_nice_chunk_size = 0;
645     PL_sv_arenaroot = 0;
646     PL_sv_root = 0;
647 }
648
649 /* ---------------------------------------------------------------------
650  *
651  * support functions for report_uninit()
652  */
653
654 /* the maxiumum size of array or hash where we will scan looking
655  * for the undefined element that triggered the warning */
656
657 #define FUV_MAX_SEARCH_SIZE 1000
658
659 /* Look for an entry in the hash whose value has the same SV as val;
660  * If so, return a mortal copy of the key. */
661
662 STATIC SV*
663 S_find_hash_subscript(pTHX_ HV *hv, SV* val)
664 {
665     dVAR;
666     register HE **array;
667     I32 i;
668
669     if (!hv || SvMAGICAL(hv) || !HvARRAY(hv) ||
670                         (HvTOTALKEYS(hv) > FUV_MAX_SEARCH_SIZE))
671         return Nullsv;
672
673     array = HvARRAY(hv);
674
675     for (i=HvMAX(hv); i>0; i--) {
676         register HE *entry;
677         for (entry = array[i]; entry; entry = HeNEXT(entry)) {
678             if (HeVAL(entry) != val)
679                 continue;
680             if (    HeVAL(entry) == &PL_sv_undef ||
681                     HeVAL(entry) == &PL_sv_placeholder)
682                 continue;
683             if (!HeKEY(entry))
684                 return Nullsv;
685             if (HeKLEN(entry) == HEf_SVKEY)
686                 return sv_mortalcopy(HeKEY_sv(entry));
687             return sv_2mortal(newSVpvn(HeKEY(entry), HeKLEN(entry)));
688         }
689     }
690     return Nullsv;
691 }
692
693 /* Look for an entry in the array whose value has the same SV as val;
694  * If so, return the index, otherwise return -1. */
695
696 STATIC I32
697 S_find_array_subscript(pTHX_ AV *av, SV* val)
698 {
699     SV** svp;
700     I32 i;
701     if (!av || SvMAGICAL(av) || !AvARRAY(av) ||
702                         (AvFILLp(av) > FUV_MAX_SEARCH_SIZE))
703         return -1;
704
705     svp = AvARRAY(av);
706     for (i=AvFILLp(av); i>=0; i--) {
707         if (svp[i] == val && svp[i] != &PL_sv_undef)
708             return i;
709     }
710     return -1;
711 }
712
713 /* S_varname(): return the name of a variable, optionally with a subscript.
714  * If gv is non-zero, use the name of that global, along with gvtype (one
715  * of "$", "@", "%"); otherwise use the name of the lexical at pad offset
716  * targ.  Depending on the value of the subscript_type flag, return:
717  */
718
719 #define FUV_SUBSCRIPT_NONE      1       /* "@foo"          */
720 #define FUV_SUBSCRIPT_ARRAY     2       /* "$foo[aindex]"  */
721 #define FUV_SUBSCRIPT_HASH      3       /* "$foo{keyname}" */
722 #define FUV_SUBSCRIPT_WITHIN    4       /* "within @foo"   */
723
724 STATIC SV*
725 S_varname(pTHX_ GV *gv, const char *gvtype, PADOFFSET targ,
726         SV* keyname, I32 aindex, int subscript_type)
727 {
728     AV *av;
729     SV *sv;
730
731     SV * const name = sv_newmortal();
732     if (gv) {
733
734         /* simulate gv_fullname4(), but add literal '^' for $^FOO names
735          * XXX get rid of all this if gv_fullnameX() ever supports this
736          * directly */
737
738         const char *p;
739         HV *hv = GvSTASH(gv);
740         sv_setpv(name, gvtype);
741         if (!hv)
742             p = "???";
743         else if (!(p=HvNAME_get(hv)))
744             p = "__ANON__";
745         if (strNE(p, "main")) {
746             sv_catpv(name,p);
747             sv_catpvn(name,"::", 2);
748         }
749         if (GvNAMELEN(gv)>= 1 &&
750             ((unsigned int)*GvNAME(gv)) <= 26)
751         { /* handle $^FOO */
752             Perl_sv_catpvf(aTHX_ name,"^%c", *GvNAME(gv) + 'A' - 1);
753             sv_catpvn(name,GvNAME(gv)+1,GvNAMELEN(gv)-1);
754         }
755         else
756             sv_catpvn(name,GvNAME(gv),GvNAMELEN(gv));
757     }
758     else {
759         U32 u;
760         CV *cv = find_runcv(&u);
761         STRLEN len;
762         const char *str;
763         if (!cv || !CvPADLIST(cv))
764             return Nullsv;;
765         av = (AV*)(*av_fetch(CvPADLIST(cv), 0, FALSE));
766         sv = *av_fetch(av, targ, FALSE);
767         /* SvLEN in a pad name is not to be trusted */
768         str = SvPV_const(sv,len);
769         sv_setpvn(name, str, len);
770     }
771
772     if (subscript_type == FUV_SUBSCRIPT_HASH) {
773         *SvPVX(name) = '$';
774         sv = NEWSV(0,0);
775         Perl_sv_catpvf(aTHX_ name, "{%s}",
776             pv_display(sv,SvPVX_const(keyname), SvCUR(keyname), 0, 32));
777         SvREFCNT_dec(sv);
778     }
779     else if (subscript_type == FUV_SUBSCRIPT_ARRAY) {
780         *SvPVX(name) = '$';
781         Perl_sv_catpvf(aTHX_ name, "[%"IVdf"]", (IV)aindex);
782     }
783     else if (subscript_type == FUV_SUBSCRIPT_WITHIN)
784         sv_insert(name, 0, 0,  "within ", 7);
785
786     return name;
787 }
788
789
790 /*
791 =for apidoc find_uninit_var
792
793 Find the name of the undefined variable (if any) that caused the operator o
794 to issue a "Use of uninitialized value" warning.
795 If match is true, only return a name if it's value matches uninit_sv.
796 So roughly speaking, if a unary operator (such as OP_COS) generates a
797 warning, then following the direct child of the op may yield an
798 OP_PADSV or OP_GV that gives the name of the undefined variable. On the
799 other hand, with OP_ADD there are two branches to follow, so we only print
800 the variable name if we get an exact match.
801
802 The name is returned as a mortal SV.
803
804 Assumes that PL_op is the op that originally triggered the error, and that
805 PL_comppad/PL_curpad points to the currently executing pad.
806
807 =cut
808 */
809
810 STATIC SV *
811 S_find_uninit_var(pTHX_ OP* obase, SV* uninit_sv, bool match)
812 {
813     dVAR;
814     SV *sv;
815     AV *av;
816     SV **svp;
817     GV *gv;
818     OP *o, *o2, *kid;
819
820     if (!obase || (match && (!uninit_sv || uninit_sv == &PL_sv_undef ||
821                             uninit_sv == &PL_sv_placeholder)))
822         return Nullsv;
823
824     switch (obase->op_type) {
825
826     case OP_RV2AV:
827     case OP_RV2HV:
828     case OP_PADAV:
829     case OP_PADHV:
830       {
831         const bool pad  = (obase->op_type == OP_PADAV || obase->op_type == OP_PADHV);
832         const bool hash = (obase->op_type == OP_PADHV || obase->op_type == OP_RV2HV);
833         I32 index = 0;
834         SV *keysv = Nullsv;
835         int subscript_type = FUV_SUBSCRIPT_WITHIN;
836
837         if (pad) { /* @lex, %lex */
838             sv = PAD_SVl(obase->op_targ);
839             gv = Nullgv;
840         }
841         else {
842             if (cUNOPx(obase)->op_first->op_type == OP_GV) {
843             /* @global, %global */
844                 gv = cGVOPx_gv(cUNOPx(obase)->op_first);
845                 if (!gv)
846                     break;
847                 sv = hash ? (SV*)GvHV(gv): (SV*)GvAV(gv);
848             }
849             else /* @{expr}, %{expr} */
850                 return find_uninit_var(cUNOPx(obase)->op_first,
851                                                     uninit_sv, match);
852         }
853
854         /* attempt to find a match within the aggregate */
855         if (hash) {
856             keysv = S_find_hash_subscript(aTHX_ (HV*)sv, uninit_sv);
857             if (keysv)
858                 subscript_type = FUV_SUBSCRIPT_HASH;
859         }
860         else {
861             index = S_find_array_subscript(aTHX_ (AV*)sv, uninit_sv);
862             if (index >= 0)
863                 subscript_type = FUV_SUBSCRIPT_ARRAY;
864         }
865
866         if (match && subscript_type == FUV_SUBSCRIPT_WITHIN)
867             break;
868
869         return S_varname(aTHX_ gv, hash ? "%" : "@", obase->op_targ,
870                                     keysv, index, subscript_type);
871       }
872
873     case OP_PADSV:
874         if (match && PAD_SVl(obase->op_targ) != uninit_sv)
875             break;
876         return S_varname(aTHX_ Nullgv, "$", obase->op_targ,
877                                     Nullsv, 0, FUV_SUBSCRIPT_NONE);
878
879     case OP_GVSV:
880         gv = cGVOPx_gv(obase);
881         if (!gv || (match && GvSV(gv) != uninit_sv))
882             break;
883         return S_varname(aTHX_ gv, "$", 0, Nullsv, 0, FUV_SUBSCRIPT_NONE);
884
885     case OP_AELEMFAST:
886         if (obase->op_flags & OPf_SPECIAL) { /* lexical array */
887             if (match) {
888                 av = (AV*)PAD_SV(obase->op_targ);
889                 if (!av || SvRMAGICAL(av))
890                     break;
891                 svp = av_fetch(av, (I32)obase->op_private, FALSE);
892                 if (!svp || *svp != uninit_sv)
893                     break;
894             }
895             return S_varname(aTHX_ Nullgv, "$", obase->op_targ,
896                     Nullsv, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
897         }
898         else {
899             gv = cGVOPx_gv(obase);
900             if (!gv)
901                 break;
902             if (match) {
903                 av = GvAV(gv);
904                 if (!av || SvRMAGICAL(av))
905                     break;
906                 svp = av_fetch(av, (I32)obase->op_private, FALSE);
907                 if (!svp || *svp != uninit_sv)
908                     break;
909             }
910             return S_varname(aTHX_ gv, "$", 0,
911                     Nullsv, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
912         }
913         break;
914
915     case OP_EXISTS:
916         o = cUNOPx(obase)->op_first;
917         if (!o || o->op_type != OP_NULL ||
918                 ! (o->op_targ == OP_AELEM || o->op_targ == OP_HELEM))
919             break;
920         return find_uninit_var(cBINOPo->op_last, uninit_sv, match);
921
922     case OP_AELEM:
923     case OP_HELEM:
924         if (PL_op == obase)
925             /* $a[uninit_expr] or $h{uninit_expr} */
926             return find_uninit_var(cBINOPx(obase)->op_last, uninit_sv, match);
927
928         gv = Nullgv;
929         o = cBINOPx(obase)->op_first;
930         kid = cBINOPx(obase)->op_last;
931
932         /* get the av or hv, and optionally the gv */
933         sv = Nullsv;
934         if  (o->op_type == OP_PADAV || o->op_type == OP_PADHV) {
935             sv = PAD_SV(o->op_targ);
936         }
937         else if ((o->op_type == OP_RV2AV || o->op_type == OP_RV2HV)
938                 && cUNOPo->op_first->op_type == OP_GV)
939         {
940             gv = cGVOPx_gv(cUNOPo->op_first);
941             if (!gv)
942                 break;
943             sv = o->op_type == OP_RV2HV ? (SV*)GvHV(gv) : (SV*)GvAV(gv);
944         }
945         if (!sv)
946             break;
947
948         if (kid && kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid))) {
949             /* index is constant */
950             if (match) {
951                 if (SvMAGICAL(sv))
952                     break;
953                 if (obase->op_type == OP_HELEM) {
954                     HE* he = hv_fetch_ent((HV*)sv, cSVOPx_sv(kid), 0, 0);
955                     if (!he || HeVAL(he) != uninit_sv)
956                         break;
957                 }
958                 else {
959                     svp = av_fetch((AV*)sv, SvIV(cSVOPx_sv(kid)), FALSE);
960                     if (!svp || *svp != uninit_sv)
961                         break;
962                 }
963             }
964             if (obase->op_type == OP_HELEM)
965                 return S_varname(aTHX_ gv, "%", o->op_targ,
966                             cSVOPx_sv(kid), 0, FUV_SUBSCRIPT_HASH);
967             else
968                 return S_varname(aTHX_ gv, "@", o->op_targ, Nullsv,
969                             SvIV(cSVOPx_sv(kid)), FUV_SUBSCRIPT_ARRAY);
970             ;
971         }
972         else  {
973             /* index is an expression;
974              * attempt to find a match within the aggregate */
975             if (obase->op_type == OP_HELEM) {
976                 SV *keysv = S_find_hash_subscript(aTHX_ (HV*)sv, uninit_sv);
977                 if (keysv)
978                     return S_varname(aTHX_ gv, "%", o->op_targ,
979                                                 keysv, 0, FUV_SUBSCRIPT_HASH);
980             }
981             else {
982                 const I32 index = S_find_array_subscript(aTHX_ (AV*)sv, uninit_sv);
983                 if (index >= 0)
984                     return S_varname(aTHX_ gv, "@", o->op_targ,
985                                         Nullsv, index, FUV_SUBSCRIPT_ARRAY);
986             }
987             if (match)
988                 break;
989             return S_varname(aTHX_ gv,
990                 (o->op_type == OP_PADAV || o->op_type == OP_RV2AV)
991                 ? "@" : "%",
992                 o->op_targ, Nullsv, 0, FUV_SUBSCRIPT_WITHIN);
993         }
994
995         break;
996
997     case OP_AASSIGN:
998         /* only examine RHS */
999         return find_uninit_var(cBINOPx(obase)->op_first, uninit_sv, match);
1000
1001     case OP_OPEN:
1002         o = cUNOPx(obase)->op_first;
1003         if (o->op_type == OP_PUSHMARK)
1004             o = o->op_sibling;
1005
1006         if (!o->op_sibling) {
1007             /* one-arg version of open is highly magical */
1008
1009             if (o->op_type == OP_GV) { /* open FOO; */
1010                 gv = cGVOPx_gv(o);
1011                 if (match && GvSV(gv) != uninit_sv)
1012                     break;
1013                 return S_varname(aTHX_ gv, "$", 0,
1014                             Nullsv, 0, FUV_SUBSCRIPT_NONE);
1015             }
1016             /* other possibilities not handled are:
1017              * open $x; or open my $x;  should return '${*$x}'
1018              * open expr;               should return '$'.expr ideally
1019              */
1020              break;
1021         }
1022         goto do_op;
1023
1024     /* ops where $_ may be an implicit arg */
1025     case OP_TRANS:
1026     case OP_SUBST:
1027     case OP_MATCH:
1028         if ( !(obase->op_flags & OPf_STACKED)) {
1029             if (uninit_sv == ((obase->op_private & OPpTARGET_MY)
1030                                  ? PAD_SVl(obase->op_targ)
1031                                  : DEFSV))
1032             {
1033                 sv = sv_newmortal();
1034                 sv_setpvn(sv, "$_", 2);
1035                 return sv;
1036             }
1037         }
1038         goto do_op;
1039
1040     case OP_PRTF:
1041     case OP_PRINT:
1042         /* skip filehandle as it can't produce 'undef' warning  */
1043         o = cUNOPx(obase)->op_first;
1044         if ((obase->op_flags & OPf_STACKED) && o->op_type == OP_PUSHMARK)
1045             o = o->op_sibling->op_sibling;
1046         goto do_op2;
1047
1048
1049     case OP_RV2SV:
1050     case OP_CUSTOM:
1051     case OP_ENTERSUB:
1052         match = 1; /* XS or custom code could trigger random warnings */
1053         goto do_op;
1054
1055     case OP_SCHOMP:
1056     case OP_CHOMP:
1057         if (SvROK(PL_rs) && uninit_sv == SvRV(PL_rs))
1058             return sv_2mortal(newSVpv("${$/}", 0));
1059         /* FALL THROUGH */
1060
1061     default:
1062     do_op:
1063         if (!(obase->op_flags & OPf_KIDS))
1064             break;
1065         o = cUNOPx(obase)->op_first;
1066         
1067     do_op2:
1068         if (!o)
1069             break;
1070
1071         /* if all except one arg are constant, or have no side-effects,
1072          * or are optimized away, then it's unambiguous */
1073         o2 = Nullop;
1074         for (kid=o; kid; kid = kid->op_sibling) {
1075             if (kid &&
1076                 (    (kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid)))
1077                   || (kid->op_type == OP_NULL  && ! (kid->op_flags & OPf_KIDS))
1078                   || (kid->op_type == OP_PUSHMARK)
1079                 )
1080             )
1081                 continue;
1082             if (o2) { /* more than one found */
1083                 o2 = Nullop;
1084                 break;
1085             }
1086             o2 = kid;
1087         }
1088         if (o2)
1089             return find_uninit_var(o2, uninit_sv, match);
1090
1091         /* scan all args */
1092         while (o) {
1093             sv = find_uninit_var(o, uninit_sv, 1);
1094             if (sv)
1095                 return sv;
1096             o = o->op_sibling;
1097         }
1098         break;
1099     }
1100     return Nullsv;
1101 }
1102
1103
1104 /*
1105 =for apidoc report_uninit
1106
1107 Print appropriate "Use of uninitialized variable" warning
1108
1109 =cut
1110 */
1111
1112 void
1113 Perl_report_uninit(pTHX_ SV* uninit_sv)
1114 {
1115     if (PL_op) {
1116         SV* varname = Nullsv;
1117         if (uninit_sv) {
1118             varname = find_uninit_var(PL_op, uninit_sv,0);
1119             if (varname)
1120                 sv_insert(varname, 0, 0, " ", 1);
1121         }
1122         Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
1123                 varname ? SvPV_nolen_const(varname) : "",
1124                 " in ", OP_DESC(PL_op));
1125     }
1126     else
1127         Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
1128                     "", "", "");
1129 }
1130
1131 /* allocate another arena's worth of NV bodies */
1132
1133 STATIC void
1134 S_more_xnv(pTHX)
1135 {
1136     NV* xnv;
1137     NV* xnvend;
1138     void *ptr;
1139     New(711, ptr, PERL_ARENA_SIZE/sizeof(NV), NV);
1140     *((void **) ptr) = (void *)PL_xnv_arenaroot;
1141     PL_xnv_arenaroot = ptr;
1142
1143     xnv = (NV*) ptr;
1144     xnvend = &xnv[PERL_ARENA_SIZE / sizeof(NV) - 1];
1145     xnv += (sizeof(XPVIV) - 1) / sizeof(NV) + 1; /* fudge by sizeof XPVIV */
1146     PL_xnv_root = xnv;
1147     while (xnv < xnvend) {
1148         *(NV**)xnv = (NV*)(xnv + 1);
1149         xnv++;
1150     }
1151     *(NV**)xnv = 0;
1152 }
1153
1154 /* allocate another arena's worth of struct xpv */
1155
1156 STATIC void
1157 S_more_xpv(pTHX)
1158 {
1159     xpv_allocated* xpv;
1160     xpv_allocated* xpvend;
1161     New(713, xpv, PERL_ARENA_SIZE/sizeof(xpv_allocated), xpv_allocated);
1162     *((xpv_allocated**)xpv) = PL_xpv_arenaroot;
1163     PL_xpv_arenaroot = xpv;
1164
1165     xpvend = &xpv[PERL_ARENA_SIZE / sizeof(xpv_allocated) - 1];
1166     PL_xpv_root = ++xpv;
1167     while (xpv < xpvend) {
1168         *((xpv_allocated**)xpv) = xpv + 1;
1169         xpv++;
1170     }
1171     *((xpv_allocated**)xpv) = 0;
1172 }
1173
1174 /* allocate another arena's worth of struct xpviv */
1175
1176 STATIC void
1177 S_more_xpviv(pTHX)
1178 {
1179     xpviv_allocated* xpviv;
1180     xpviv_allocated* xpvivend;
1181     New(713, xpviv, PERL_ARENA_SIZE/sizeof(xpviv_allocated), xpviv_allocated);
1182     *((xpviv_allocated**)xpviv) = PL_xpviv_arenaroot;
1183     PL_xpviv_arenaroot = xpviv;
1184
1185     xpvivend = &xpviv[PERL_ARENA_SIZE / sizeof(xpviv_allocated) - 1];
1186     PL_xpviv_root = ++xpviv;
1187     while (xpviv < xpvivend) {
1188         *((xpviv_allocated**)xpviv) = xpviv + 1;
1189         xpviv++;
1190     }
1191     *((xpviv_allocated**)xpviv) = 0;
1192 }
1193
1194 /* allocate another arena's worth of struct xpvnv */
1195
1196 STATIC void
1197 S_more_xpvnv(pTHX)
1198 {
1199     XPVNV* xpvnv;
1200     XPVNV* xpvnvend;
1201     New(715, xpvnv, PERL_ARENA_SIZE/sizeof(XPVNV), XPVNV);
1202     *((XPVNV**)xpvnv) = PL_xpvnv_arenaroot;
1203     PL_xpvnv_arenaroot = xpvnv;
1204
1205     xpvnvend = &xpvnv[PERL_ARENA_SIZE / sizeof(XPVNV) - 1];
1206     PL_xpvnv_root = ++xpvnv;
1207     while (xpvnv < xpvnvend) {
1208         *((XPVNV**)xpvnv) = xpvnv + 1;
1209         xpvnv++;
1210     }
1211     *((XPVNV**)xpvnv) = 0;
1212 }
1213
1214 /* allocate another arena's worth of struct xpvcv */
1215
1216 STATIC void
1217 S_more_xpvcv(pTHX)
1218 {
1219     XPVCV* xpvcv;
1220     XPVCV* xpvcvend;
1221     New(716, xpvcv, PERL_ARENA_SIZE/sizeof(XPVCV), XPVCV);
1222     *((XPVCV**)xpvcv) = PL_xpvcv_arenaroot;
1223     PL_xpvcv_arenaroot = xpvcv;
1224
1225     xpvcvend = &xpvcv[PERL_ARENA_SIZE / sizeof(XPVCV) - 1];
1226     PL_xpvcv_root = ++xpvcv;
1227     while (xpvcv < xpvcvend) {
1228         *((XPVCV**)xpvcv) = xpvcv + 1;
1229         xpvcv++;
1230     }
1231     *((XPVCV**)xpvcv) = 0;
1232 }
1233
1234 /* allocate another arena's worth of struct xpvav */
1235
1236 STATIC void
1237 S_more_xpvav(pTHX)
1238 {
1239     xpvav_allocated* xpvav;
1240      xpvav_allocated* xpvavend;
1241     New(717, xpvav, PERL_ARENA_SIZE/sizeof(xpvav_allocated),
1242         xpvav_allocated);
1243     *((xpvav_allocated**)xpvav) = PL_xpvav_arenaroot;
1244     PL_xpvav_arenaroot = xpvav;
1245
1246     xpvavend = &xpvav[PERL_ARENA_SIZE / sizeof(xpvav_allocated) - 1];
1247     PL_xpvav_root = ++xpvav;
1248     while (xpvav < xpvavend) {
1249         *((xpvav_allocated**)xpvav) = xpvav + 1;
1250         xpvav++;
1251     }
1252     *((xpvav_allocated**)xpvav) = 0;
1253 }
1254
1255 /* allocate another arena's worth of struct xpvhv */
1256
1257 STATIC void
1258 S_more_xpvhv(pTHX)
1259 {
1260     xpvhv_allocated* xpvhv;
1261     xpvhv_allocated* xpvhvend;
1262     New(718, xpvhv, PERL_ARENA_SIZE/sizeof(xpvhv_allocated),
1263         xpvhv_allocated);
1264     *((xpvhv_allocated**)xpvhv) = PL_xpvhv_arenaroot;
1265     PL_xpvhv_arenaroot = xpvhv;
1266
1267     xpvhvend = &xpvhv[PERL_ARENA_SIZE / sizeof(xpvhv_allocated) - 1];
1268     PL_xpvhv_root = ++xpvhv;
1269     while (xpvhv < xpvhvend) {
1270         *((xpvhv_allocated**)xpvhv) = xpvhv + 1;
1271         xpvhv++;
1272     }
1273     *((xpvhv_allocated**)xpvhv) = 0;
1274 }
1275
1276 /* allocate another arena's worth of struct xpvmg */
1277
1278 STATIC void
1279 S_more_xpvmg(pTHX)
1280 {
1281     XPVMG* xpvmg;
1282     XPVMG* xpvmgend;
1283     New(719, xpvmg, PERL_ARENA_SIZE/sizeof(XPVMG), XPVMG);
1284     *((XPVMG**)xpvmg) = PL_xpvmg_arenaroot;
1285     PL_xpvmg_arenaroot = xpvmg;
1286
1287     xpvmgend = &xpvmg[PERL_ARENA_SIZE / sizeof(XPVMG) - 1];
1288     PL_xpvmg_root = ++xpvmg;
1289     while (xpvmg < xpvmgend) {
1290         *((XPVMG**)xpvmg) = xpvmg + 1;
1291         xpvmg++;
1292     }
1293     *((XPVMG**)xpvmg) = 0;
1294 }
1295
1296 /* allocate another arena's worth of struct xpvgv */
1297
1298 STATIC void
1299 S_more_xpvgv(pTHX)
1300 {
1301     XPVGV* xpvgv;
1302     XPVGV* xpvgvend;
1303     New(720, xpvgv, PERL_ARENA_SIZE/sizeof(XPVGV), XPVGV);
1304     *((XPVGV**)xpvgv) = PL_xpvgv_arenaroot;
1305     PL_xpvgv_arenaroot = xpvgv;
1306
1307     xpvgvend = &xpvgv[PERL_ARENA_SIZE / sizeof(XPVGV) - 1];
1308     PL_xpvgv_root = ++xpvgv;
1309     while (xpvgv < xpvgvend) {
1310         *((XPVGV**)xpvgv) = xpvgv + 1;
1311         xpvgv++;
1312     }
1313     *((XPVGV**)xpvgv) = 0;
1314 }
1315
1316 /* allocate another arena's worth of struct xpvlv */
1317
1318 STATIC void
1319 S_more_xpvlv(pTHX)
1320 {
1321     XPVLV* xpvlv;
1322     XPVLV* xpvlvend;
1323     New(720, xpvlv, PERL_ARENA_SIZE/sizeof(XPVLV), XPVLV);
1324     *((XPVLV**)xpvlv) = PL_xpvlv_arenaroot;
1325     PL_xpvlv_arenaroot = xpvlv;
1326
1327     xpvlvend = &xpvlv[PERL_ARENA_SIZE / sizeof(XPVLV) - 1];
1328     PL_xpvlv_root = ++xpvlv;
1329     while (xpvlv < xpvlvend) {
1330         *((XPVLV**)xpvlv) = xpvlv + 1;
1331         xpvlv++;
1332     }
1333     *((XPVLV**)xpvlv) = 0;
1334 }
1335
1336 /* allocate another arena's worth of struct xpvbm */
1337
1338 STATIC void
1339 S_more_xpvbm(pTHX)
1340 {
1341     XPVBM* xpvbm;
1342     XPVBM* xpvbmend;
1343     New(721, xpvbm, PERL_ARENA_SIZE/sizeof(XPVBM), XPVBM);
1344     *((XPVBM**)xpvbm) = PL_xpvbm_arenaroot;
1345     PL_xpvbm_arenaroot = xpvbm;
1346
1347     xpvbmend = &xpvbm[PERL_ARENA_SIZE / sizeof(XPVBM) - 1];
1348     PL_xpvbm_root = ++xpvbm;
1349     while (xpvbm < xpvbmend) {
1350         *((XPVBM**)xpvbm) = xpvbm + 1;
1351         xpvbm++;
1352     }
1353     *((XPVBM**)xpvbm) = 0;
1354 }
1355
1356 /* grab a new NV body from the free list, allocating more if necessary */
1357
1358 STATIC XPVNV*
1359 S_new_xnv(pTHX)
1360 {
1361     NV* xnv;
1362     LOCK_SV_MUTEX;
1363     if (!PL_xnv_root)
1364         S_more_xnv(aTHX);
1365     xnv = PL_xnv_root;
1366     PL_xnv_root = *(NV**)xnv;
1367     UNLOCK_SV_MUTEX;
1368     return (XPVNV*)((char*)xnv - STRUCT_OFFSET(XPVNV, xnv_nv));
1369 }
1370
1371 /* return an NV body to the free list */
1372
1373 STATIC void
1374 S_del_xnv(pTHX_ XPVNV *p)
1375 {
1376     NV* xnv = (NV*)((char*)(p) + STRUCT_OFFSET(XPVNV, xnv_nv));
1377     LOCK_SV_MUTEX;
1378     *(NV**)xnv = PL_xnv_root;
1379     PL_xnv_root = xnv;
1380     UNLOCK_SV_MUTEX;
1381 }
1382
1383 /* grab a new struct xpv from the free list, allocating more if necessary */
1384
1385 STATIC XPV*
1386 S_new_xpv(pTHX)
1387 {
1388     xpv_allocated* xpv;
1389     LOCK_SV_MUTEX;
1390     if (!PL_xpv_root)
1391         S_more_xpv(aTHX);
1392     xpv = PL_xpv_root;
1393     PL_xpv_root = *(xpv_allocated**)xpv;
1394     UNLOCK_SV_MUTEX;
1395     /* If xpv_allocated is the same structure as XPV then the two OFFSETs
1396        sum to zero, and the pointer is unchanged. If the allocated structure
1397        is smaller (no initial IV actually allocated) then the net effect is
1398        to subtract the size of the IV from the pointer, to return a new pointer
1399        as if an initial IV were actually allocated.  */
1400     return (XPV*)((char*)xpv - STRUCT_OFFSET(XPV, xpv_cur)
1401                   + STRUCT_OFFSET(xpv_allocated, xpv_cur));
1402 }
1403
1404 /* return a struct xpv to the free list */
1405
1406 STATIC void
1407 S_del_xpv(pTHX_ XPV *p)
1408 {
1409     xpv_allocated* xpv
1410         = (xpv_allocated*)((char*)(p) + STRUCT_OFFSET(XPV, xpv_cur)
1411                            - STRUCT_OFFSET(xpv_allocated, xpv_cur));
1412     LOCK_SV_MUTEX;
1413     *(xpv_allocated**)xpv = PL_xpv_root;
1414     PL_xpv_root = xpv;
1415     UNLOCK_SV_MUTEX;
1416 }
1417
1418 /* grab a new struct xpviv from the free list, allocating more if necessary */
1419
1420 STATIC XPVIV*
1421 S_new_xpviv(pTHX)
1422 {
1423     xpviv_allocated* xpviv;
1424     LOCK_SV_MUTEX;
1425     if (!PL_xpviv_root)
1426         S_more_xpviv(aTHX);
1427     xpviv = PL_xpviv_root;
1428     PL_xpviv_root = *(xpviv_allocated**)xpviv;
1429     UNLOCK_SV_MUTEX;
1430     /* If xpviv_allocated is the same structure as XPVIV then the two OFFSETs
1431        sum to zero, and the pointer is unchanged. If the allocated structure
1432        is smaller (no initial IV actually allocated) then the net effect is
1433        to subtract the size of the IV from the pointer, to return a new pointer
1434        as if an initial IV were actually allocated.  */
1435     return (XPVIV*)((char*)xpviv - STRUCT_OFFSET(XPVIV, xpv_cur)
1436                   + STRUCT_OFFSET(xpviv_allocated, xpv_cur));
1437 }
1438
1439 /* return a struct xpviv to the free list */
1440
1441 STATIC void
1442 S_del_xpviv(pTHX_ XPVIV *p)
1443 {
1444     xpviv_allocated* xpviv
1445         = (xpviv_allocated*)((char*)(p) + STRUCT_OFFSET(XPVIV, xpv_cur)
1446                            - STRUCT_OFFSET(xpviv_allocated, xpv_cur));
1447     LOCK_SV_MUTEX;
1448     *(xpviv_allocated**)xpviv = PL_xpviv_root;
1449     PL_xpviv_root = xpviv;
1450     UNLOCK_SV_MUTEX;
1451 }
1452
1453 /* grab a new struct xpvnv from the free list, allocating more if necessary */
1454
1455 STATIC XPVNV*
1456 S_new_xpvnv(pTHX)
1457 {
1458     XPVNV* xpvnv;
1459     LOCK_SV_MUTEX;
1460     if (!PL_xpvnv_root)
1461         S_more_xpvnv(aTHX);
1462     xpvnv = PL_xpvnv_root;
1463     PL_xpvnv_root = *(XPVNV**)xpvnv;
1464     UNLOCK_SV_MUTEX;
1465     return xpvnv;
1466 }
1467
1468 /* return a struct xpvnv to the free list */
1469
1470 STATIC void
1471 S_del_xpvnv(pTHX_ XPVNV *p)
1472 {
1473     LOCK_SV_MUTEX;
1474     *(XPVNV**)p = PL_xpvnv_root;
1475     PL_xpvnv_root = p;
1476     UNLOCK_SV_MUTEX;
1477 }
1478
1479 /* grab a new struct xpvcv from the free list, allocating more if necessary */
1480
1481 STATIC XPVCV*
1482 S_new_xpvcv(pTHX)
1483 {
1484     XPVCV* xpvcv;
1485     LOCK_SV_MUTEX;
1486     if (!PL_xpvcv_root)
1487         S_more_xpvcv(aTHX);
1488     xpvcv = PL_xpvcv_root;
1489     PL_xpvcv_root = *(XPVCV**)xpvcv;
1490     UNLOCK_SV_MUTEX;
1491     return xpvcv;
1492 }
1493
1494 /* return a struct xpvcv to the free list */
1495
1496 STATIC void
1497 S_del_xpvcv(pTHX_ XPVCV *p)
1498 {
1499     LOCK_SV_MUTEX;
1500     *(XPVCV**)p = PL_xpvcv_root;
1501     PL_xpvcv_root = p;
1502     UNLOCK_SV_MUTEX;
1503 }
1504
1505 /* grab a new struct xpvav from the free list, allocating more if necessary */
1506
1507 STATIC XPVAV*
1508 S_new_xpvav(pTHX)
1509 {
1510     xpvav_allocated* xpvav;
1511     LOCK_SV_MUTEX;
1512     if (!PL_xpvav_root)
1513         S_more_xpvav(aTHX);
1514     xpvav = PL_xpvav_root;
1515     PL_xpvav_root = *(xpvav_allocated**)xpvav;
1516     UNLOCK_SV_MUTEX;
1517     return (XPVAV*)((char*)xpvav - STRUCT_OFFSET(XPVAV, xav_fill)
1518                     + STRUCT_OFFSET(xpvav_allocated, xav_fill));
1519 }
1520
1521 /* return a struct xpvav to the free list */
1522
1523 STATIC void
1524 S_del_xpvav(pTHX_ XPVAV *p)
1525 {
1526     xpvav_allocated* xpvav
1527         = (xpvav_allocated*)((char*)(p) + STRUCT_OFFSET(XPVAV, xav_fill)
1528                              - STRUCT_OFFSET(xpvav_allocated, xav_fill));
1529     LOCK_SV_MUTEX;
1530     *(xpvav_allocated**)xpvav = PL_xpvav_root;
1531     PL_xpvav_root = xpvav;
1532     UNLOCK_SV_MUTEX;
1533 }
1534
1535 /* grab a new struct xpvhv from the free list, allocating more if necessary */
1536
1537 STATIC XPVHV*
1538 S_new_xpvhv(pTHX)
1539 {
1540     xpvhv_allocated* xpvhv;
1541     LOCK_SV_MUTEX;
1542     if (!PL_xpvhv_root)
1543         S_more_xpvhv(aTHX);
1544     xpvhv = PL_xpvhv_root;
1545     PL_xpvhv_root = *(xpvhv_allocated**)xpvhv;
1546     UNLOCK_SV_MUTEX;
1547     return (XPVHV*)((char*)xpvhv - STRUCT_OFFSET(XPVHV, xhv_fill)
1548                     + STRUCT_OFFSET(xpvhv_allocated, xhv_fill));
1549 }
1550
1551 /* return a struct xpvhv to the free list */
1552
1553 STATIC void
1554 S_del_xpvhv(pTHX_ XPVHV *p)
1555 {
1556     xpvhv_allocated* xpvhv
1557         = (xpvhv_allocated*)((char*)(p) + STRUCT_OFFSET(XPVHV, xhv_fill)
1558                              - STRUCT_OFFSET(xpvhv_allocated, xhv_fill));
1559     LOCK_SV_MUTEX;
1560     *(xpvhv_allocated**)xpvhv = PL_xpvhv_root;
1561     PL_xpvhv_root = xpvhv;
1562     UNLOCK_SV_MUTEX;
1563 }
1564
1565 /* grab a new struct xpvmg from the free list, allocating more if necessary */
1566
1567 STATIC XPVMG*
1568 S_new_xpvmg(pTHX)
1569 {
1570     XPVMG* xpvmg;
1571     LOCK_SV_MUTEX;
1572     if (!PL_xpvmg_root)
1573         S_more_xpvmg(aTHX);
1574     xpvmg = PL_xpvmg_root;
1575     PL_xpvmg_root = *(XPVMG**)xpvmg;
1576     UNLOCK_SV_MUTEX;
1577     return xpvmg;
1578 }
1579
1580 /* return a struct xpvmg to the free list */
1581
1582 STATIC void
1583 S_del_xpvmg(pTHX_ XPVMG *p)
1584 {
1585     LOCK_SV_MUTEX;
1586     *(XPVMG**)p = PL_xpvmg_root;
1587     PL_xpvmg_root = p;
1588     UNLOCK_SV_MUTEX;
1589 }
1590
1591 /* grab a new struct xpvgv from the free list, allocating more if necessary */
1592
1593 STATIC XPVGV*
1594 S_new_xpvgv(pTHX)
1595 {
1596     XPVGV* xpvgv;
1597     LOCK_SV_MUTEX;
1598     if (!PL_xpvgv_root)
1599         S_more_xpvgv(aTHX);
1600     xpvgv = PL_xpvgv_root;
1601     PL_xpvgv_root = *(XPVGV**)xpvgv;
1602     UNLOCK_SV_MUTEX;
1603     return xpvgv;
1604 }
1605
1606 /* return a struct xpvgv to the free list */
1607
1608 STATIC void
1609 S_del_xpvgv(pTHX_ XPVGV *p)
1610 {
1611     LOCK_SV_MUTEX;
1612     *(XPVGV**)p = PL_xpvgv_root;
1613     PL_xpvgv_root = p;
1614     UNLOCK_SV_MUTEX;
1615 }
1616
1617 /* grab a new struct xpvlv from the free list, allocating more if necessary */
1618
1619 STATIC XPVLV*
1620 S_new_xpvlv(pTHX)
1621 {
1622     XPVLV* xpvlv;
1623     LOCK_SV_MUTEX;
1624     if (!PL_xpvlv_root)
1625         S_more_xpvlv(aTHX);
1626     xpvlv = PL_xpvlv_root;
1627     PL_xpvlv_root = *(XPVLV**)xpvlv;
1628     UNLOCK_SV_MUTEX;
1629     return xpvlv;
1630 }
1631
1632 /* return a struct xpvlv to the free list */
1633
1634 STATIC void
1635 S_del_xpvlv(pTHX_ XPVLV *p)
1636 {
1637     LOCK_SV_MUTEX;
1638     *(XPVLV**)p = PL_xpvlv_root;
1639     PL_xpvlv_root = p;
1640     UNLOCK_SV_MUTEX;
1641 }
1642
1643 /* grab a new struct xpvbm from the free list, allocating more if necessary */
1644
1645 STATIC XPVBM*
1646 S_new_xpvbm(pTHX)
1647 {
1648     XPVBM* xpvbm;
1649     LOCK_SV_MUTEX;
1650     if (!PL_xpvbm_root)
1651         S_more_xpvbm(aTHX);
1652     xpvbm = PL_xpvbm_root;
1653     PL_xpvbm_root = *(XPVBM**)xpvbm;
1654     UNLOCK_SV_MUTEX;
1655     return xpvbm;
1656 }
1657
1658 /* return a struct xpvbm to the free list */
1659
1660 STATIC void
1661 S_del_xpvbm(pTHX_ XPVBM *p)
1662 {
1663     LOCK_SV_MUTEX;
1664     *(XPVBM**)p = PL_xpvbm_root;
1665     PL_xpvbm_root = p;
1666     UNLOCK_SV_MUTEX;
1667 }
1668
1669 #define my_safemalloc(s)        (void*)safemalloc(s)
1670 #define my_safefree(p)  safefree((char*)p)
1671
1672 #ifdef PURIFY
1673
1674 #define new_XNV()       my_safemalloc(sizeof(XPVNV))
1675 #define del_XNV(p)      my_safefree(p)
1676
1677 #define new_XPV()       my_safemalloc(sizeof(XPV))
1678 #define del_XPV(p)      my_safefree(p)
1679
1680 #define new_XPVIV()     my_safemalloc(sizeof(XPVIV))
1681 #define del_XPVIV(p)    my_safefree(p)
1682
1683 #define new_XPVNV()     my_safemalloc(sizeof(XPVNV))
1684 #define del_XPVNV(p)    my_safefree(p)
1685
1686 #define new_XPVCV()     my_safemalloc(sizeof(XPVCV))
1687 #define del_XPVCV(p)    my_safefree(p)
1688
1689 #define new_XPVAV()     my_safemalloc(sizeof(XPVAV))
1690 #define del_XPVAV(p)    my_safefree(p)
1691
1692 #define new_XPVHV()     my_safemalloc(sizeof(XPVHV))
1693 #define del_XPVHV(p)    my_safefree(p)
1694
1695 #define new_XPVMG()     my_safemalloc(sizeof(XPVMG))
1696 #define del_XPVMG(p)    my_safefree(p)
1697
1698 #define new_XPVGV()     my_safemalloc(sizeof(XPVGV))
1699 #define del_XPVGV(p)    my_safefree(p)
1700
1701 #define new_XPVLV()     my_safemalloc(sizeof(XPVLV))
1702 #define del_XPVLV(p)    my_safefree(p)
1703
1704 #define new_XPVBM()     my_safemalloc(sizeof(XPVBM))
1705 #define del_XPVBM(p)    my_safefree(p)
1706
1707 #else /* !PURIFY */
1708
1709 #define new_XNV()       (void*)new_xnv()
1710 #define del_XNV(p)      del_xnv((XPVNV*) p)
1711
1712 #define new_XPV()       (void*)new_xpv()
1713 #define del_XPV(p)      del_xpv((XPV *)p)
1714
1715 #define new_XPVIV()     (void*)new_xpviv()
1716 #define del_XPVIV(p)    del_xpviv((XPVIV *)p)
1717
1718 #define new_XPVNV()     (void*)new_xpvnv()
1719 #define del_XPVNV(p)    del_xpvnv((XPVNV *)p)
1720
1721 #define new_XPVCV()     (void*)new_xpvcv()
1722 #define del_XPVCV(p)    del_xpvcv((XPVCV *)p)
1723
1724 #define new_XPVAV()     (void*)new_xpvav()
1725 #define del_XPVAV(p)    del_xpvav((XPVAV *)p)
1726
1727 #define new_XPVHV()     (void*)new_xpvhv()
1728 #define del_XPVHV(p)    del_xpvhv((XPVHV *)p)
1729
1730 #define new_XPVMG()     (void*)new_xpvmg()
1731 #define del_XPVMG(p)    del_xpvmg((XPVMG *)p)
1732
1733 #define new_XPVGV()     (void*)new_xpvgv()
1734 #define del_XPVGV(p)    del_xpvgv((XPVGV *)p)
1735
1736 #define new_XPVLV()     (void*)new_xpvlv()
1737 #define del_XPVLV(p)    del_xpvlv((XPVLV *)p)
1738
1739 #define new_XPVBM()     (void*)new_xpvbm()
1740 #define del_XPVBM(p)    del_xpvbm((XPVBM *)p)
1741
1742 #endif /* PURIFY */
1743
1744 #define new_XPVFM()     my_safemalloc(sizeof(XPVFM))
1745 #define del_XPVFM(p)    my_safefree(p)
1746
1747 #define new_XPVIO()     my_safemalloc(sizeof(XPVIO))
1748 #define del_XPVIO(p)    my_safefree(p)
1749
1750 /*
1751 =for apidoc sv_upgrade
1752
1753 Upgrade an SV to a more complex form.  Generally adds a new body type to the
1754 SV, then copies across as much information as possible from the old body.
1755 You generally want to use the C<SvUPGRADE> macro wrapper. See also C<svtype>.
1756
1757 =cut
1758 */
1759
1760 void
1761 Perl_sv_upgrade(pTHX_ register SV *sv, U32 mt)
1762 {
1763
1764     char*       pv;
1765     U32         cur;
1766     U32         len;
1767     IV          iv;
1768     NV          nv;
1769     MAGIC*      magic;
1770     HV*         stash;
1771
1772     if (mt != SVt_PV && SvIsCOW(sv)) {
1773         sv_force_normal_flags(sv, 0);
1774     }
1775
1776     if (SvTYPE(sv) == mt)
1777         return;
1778
1779     pv = NULL;
1780     cur = 0;
1781     len = 0;
1782     iv = 0;
1783     nv = 0.0;
1784     magic = NULL;
1785     stash = Nullhv;
1786
1787     switch (SvTYPE(sv)) {
1788     case SVt_NULL:
1789         break;
1790     case SVt_IV:
1791         iv      = SvIVX(sv);
1792         if (mt == SVt_NV)
1793             mt = SVt_PVNV;
1794         else if (mt < SVt_PVIV)
1795             mt = SVt_PVIV;
1796         break;
1797     case SVt_NV:
1798         nv      = SvNVX(sv);
1799         del_XNV(SvANY(sv));
1800         if (mt < SVt_PVNV)
1801             mt = SVt_PVNV;
1802         break;
1803     case SVt_RV:
1804         pv      = (char*)SvRV(sv);
1805         break;
1806     case SVt_PV:
1807         pv      = SvPVX_mutable(sv);
1808         cur     = SvCUR(sv);
1809         len     = SvLEN(sv);
1810         del_XPV(SvANY(sv));
1811         if (mt <= SVt_IV)
1812             mt = SVt_PVIV;
1813         else if (mt == SVt_NV)
1814             mt = SVt_PVNV;
1815         break;
1816     case SVt_PVIV:
1817         pv      = SvPVX_mutable(sv);
1818         cur     = SvCUR(sv);
1819         len     = SvLEN(sv);
1820         iv      = SvIVX(sv);
1821         del_XPVIV(SvANY(sv));
1822         break;
1823     case SVt_PVNV:
1824         pv      = SvPVX_mutable(sv);
1825         cur     = SvCUR(sv);
1826         len     = SvLEN(sv);
1827         iv      = SvIVX(sv);
1828         nv      = SvNVX(sv);
1829         del_XPVNV(SvANY(sv));
1830         break;
1831     case SVt_PVMG:
1832         /* Because the XPVMG of PL_mess_sv isn't allocated from the arena,
1833            there's no way that it can be safely upgraded, because perl.c
1834            expects to Safefree(SvANY(PL_mess_sv))  */
1835         assert(sv != PL_mess_sv);
1836         /* This flag bit is used to mean other things in other scalar types.
1837            Given that it only has meaning inside the pad, it shouldn't be set
1838            on anything that can get upgraded.  */
1839         assert((SvFLAGS(sv) & SVpad_TYPED) == 0);
1840         pv      = SvPVX_mutable(sv);
1841         cur     = SvCUR(sv);
1842         len     = SvLEN(sv);
1843         iv      = SvIVX(sv);
1844         nv      = SvNVX(sv);
1845         magic   = SvMAGIC(sv);
1846         stash   = SvSTASH(sv);
1847         del_XPVMG(SvANY(sv));
1848         break;
1849     default:
1850         Perl_croak(aTHX_ "Can't upgrade that kind of scalar");
1851     }
1852
1853     SvFLAGS(sv) &= ~SVTYPEMASK;
1854     SvFLAGS(sv) |= mt;
1855
1856     switch (mt) {
1857     case SVt_NULL:
1858         Perl_croak(aTHX_ "Can't upgrade to undef");
1859     case SVt_IV:
1860         SvANY(sv) = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
1861         SvIV_set(sv, iv);
1862         break;
1863     case SVt_NV:
1864         SvANY(sv) = new_XNV();
1865         SvNV_set(sv, nv);
1866         break;
1867     case SVt_RV:
1868         SvANY(sv) = &sv->sv_u.svu_rv;
1869         SvRV_set(sv, (SV*)pv);
1870         break;
1871     case SVt_PVHV:
1872         SvANY(sv) = new_XPVHV();
1873         HvFILL(sv)      = 0;
1874         HvMAX(sv)       = 0;
1875         HvTOTALKEYS(sv) = 0;
1876
1877         /* Fall through...  */
1878         if (0) {
1879         case SVt_PVAV:
1880             SvANY(sv) = new_XPVAV();
1881             AvMAX(sv)   = -1;
1882             AvFILLp(sv) = -1;
1883             AvALLOC(sv) = 0;
1884             AvREAL_only(sv);
1885         }
1886         /* to here.  */
1887         /* XXX? Only SVt_NULL is ever upgraded to AV or HV?  */
1888         assert(!pv);
1889         /* FIXME. Should be able to remove all this if()... if the above
1890            assertion is genuinely always true.  */
1891         if(SvOOK(sv)) {
1892             pv -= iv;
1893             SvFLAGS(sv) &= ~SVf_OOK;
1894         }
1895         Safefree(pv);
1896         SvPV_set(sv, (char*)0);
1897         SvMAGIC_set(sv, magic);
1898         SvSTASH_set(sv, stash);
1899         break;
1900
1901     case SVt_PVIO:
1902         SvANY(sv) = new_XPVIO();
1903         Zero(SvANY(sv), 1, XPVIO);
1904         IoPAGE_LEN(sv)  = 60;
1905         goto set_magic_common;
1906     case SVt_PVFM:
1907         SvANY(sv) = new_XPVFM();
1908         Zero(SvANY(sv), 1, XPVFM);
1909         goto set_magic_common;
1910     case SVt_PVBM:
1911         SvANY(sv) = new_XPVBM();
1912         BmRARE(sv)      = 0;
1913         BmUSEFUL(sv)    = 0;
1914         BmPREVIOUS(sv)  = 0;
1915         goto set_magic_common;
1916     case SVt_PVGV:
1917         SvANY(sv) = new_XPVGV();
1918         GvGP(sv)        = 0;
1919         GvNAME(sv)      = 0;
1920         GvNAMELEN(sv)   = 0;
1921         GvSTASH(sv)     = 0;
1922         GvFLAGS(sv)     = 0;
1923         goto set_magic_common;
1924     case SVt_PVCV:
1925         SvANY(sv) = new_XPVCV();
1926         Zero(SvANY(sv), 1, XPVCV);
1927         goto set_magic_common;
1928     case SVt_PVLV:
1929         SvANY(sv) = new_XPVLV();
1930         LvTARGOFF(sv)   = 0;
1931         LvTARGLEN(sv)   = 0;
1932         LvTARG(sv)      = 0;
1933         LvTYPE(sv)      = 0;
1934         GvGP(sv)        = 0;
1935         GvNAME(sv)      = 0;
1936         GvNAMELEN(sv)   = 0;
1937         GvSTASH(sv)     = 0;
1938         GvFLAGS(sv)     = 0;
1939         /* Fall through.  */
1940         if (0) {
1941         case SVt_PVMG:
1942             SvANY(sv) = new_XPVMG();
1943         }
1944     set_magic_common:
1945         SvMAGIC_set(sv, magic);
1946         SvSTASH_set(sv, stash);
1947         /* Fall through.  */
1948         if (0) {
1949         case SVt_PVNV:
1950             SvANY(sv) = new_XPVNV();
1951         }
1952         SvNV_set(sv, nv);
1953         /* Fall through.  */
1954         if (0) {
1955         case SVt_PVIV:
1956             SvANY(sv) = new_XPVIV();
1957             if (SvNIOK(sv))
1958                 (void)SvIOK_on(sv);
1959             SvNOK_off(sv);
1960         }
1961         SvIV_set(sv, iv);
1962         /* Fall through.  */
1963         if (0) {
1964         case SVt_PV:
1965             SvANY(sv) = new_XPV();
1966         }
1967         SvPV_set(sv, pv);
1968         SvCUR_set(sv, cur);
1969         SvLEN_set(sv, len);
1970         break;
1971     }
1972 }
1973
1974 /*
1975 =for apidoc sv_backoff
1976
1977 Remove any string offset. You should normally use the C<SvOOK_off> macro
1978 wrapper instead.
1979
1980 =cut
1981 */
1982
1983 int
1984 Perl_sv_backoff(pTHX_ register SV *sv)
1985 {
1986     assert(SvOOK(sv));
1987     assert(SvTYPE(sv) != SVt_PVHV);
1988     assert(SvTYPE(sv) != SVt_PVAV);
1989     if (SvIVX(sv)) {
1990         const char *s = SvPVX_const(sv);
1991         SvLEN_set(sv, SvLEN(sv) + SvIVX(sv));
1992         SvPV_set(sv, SvPVX(sv) - SvIVX(sv));
1993         SvIV_set(sv, 0);
1994         Move(s, SvPVX(sv), SvCUR(sv)+1, char);
1995     }
1996     SvFLAGS(sv) &= ~SVf_OOK;
1997     return 0;
1998 }
1999
2000 /*
2001 =for apidoc sv_grow
2002
2003 Expands the character buffer in the SV.  If necessary, uses C<sv_unref> and
2004 upgrades the SV to C<SVt_PV>.  Returns a pointer to the character buffer.
2005 Use the C<SvGROW> wrapper instead.
2006
2007 =cut
2008 */
2009
2010 char *
2011 Perl_sv_grow(pTHX_ register SV *sv, register STRLEN newlen)
2012 {
2013     register char *s;
2014
2015 #ifdef HAS_64K_LIMIT
2016     if (newlen >= 0x10000) {
2017         PerlIO_printf(Perl_debug_log,
2018                       "Allocation too large: %"UVxf"\n", (UV)newlen);
2019         my_exit(1);
2020     }
2021 #endif /* HAS_64K_LIMIT */
2022     if (SvROK(sv))
2023         sv_unref(sv);
2024     if (SvTYPE(sv) < SVt_PV) {
2025         sv_upgrade(sv, SVt_PV);
2026         s = SvPVX_mutable(sv);
2027     }
2028     else if (SvOOK(sv)) {       /* pv is offset? */
2029         sv_backoff(sv);
2030         s = SvPVX_mutable(sv);
2031         if (newlen > SvLEN(sv))
2032             newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
2033 #ifdef HAS_64K_LIMIT
2034         if (newlen >= 0x10000)
2035             newlen = 0xFFFF;
2036 #endif
2037     }
2038     else
2039         s = SvPVX_mutable(sv);
2040
2041     if (newlen > SvLEN(sv)) {           /* need more room? */
2042         newlen = PERL_STRLEN_ROUNDUP(newlen);
2043         if (SvLEN(sv) && s) {
2044 #ifdef MYMALLOC
2045             const STRLEN l = malloced_size((void*)SvPVX_const(sv));
2046             if (newlen <= l) {
2047                 SvLEN_set(sv, l);
2048                 return s;
2049             } else
2050 #endif
2051             s = saferealloc(s, newlen);
2052         }
2053         else {
2054             s = safemalloc(newlen);
2055             if (SvPVX_const(sv) && SvCUR(sv)) {
2056                 Move(SvPVX_const(sv), s, (newlen < SvCUR(sv)) ? newlen : SvCUR(sv), char);
2057             }
2058         }
2059         SvPV_set(sv, s);
2060         SvLEN_set(sv, newlen);
2061     }
2062     return s;
2063 }
2064
2065 /*
2066 =for apidoc sv_setiv
2067
2068 Copies an integer into the given SV, upgrading first if necessary.
2069 Does not handle 'set' magic.  See also C<sv_setiv_mg>.
2070
2071 =cut
2072 */
2073
2074 void
2075 Perl_sv_setiv(pTHX_ register SV *sv, IV i)
2076 {
2077     SV_CHECK_THINKFIRST_COW_DROP(sv);
2078     switch (SvTYPE(sv)) {
2079     case SVt_NULL:
2080         sv_upgrade(sv, SVt_IV);
2081         break;
2082     case SVt_NV:
2083         sv_upgrade(sv, SVt_PVNV);
2084         break;
2085     case SVt_RV:
2086     case SVt_PV:
2087         sv_upgrade(sv, SVt_PVIV);
2088         break;
2089
2090     case SVt_PVGV:
2091     case SVt_PVAV:
2092     case SVt_PVHV:
2093     case SVt_PVCV:
2094     case SVt_PVFM:
2095     case SVt_PVIO:
2096         Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
2097                    OP_DESC(PL_op));
2098     }
2099     (void)SvIOK_only(sv);                       /* validate number */
2100     SvIV_set(sv, i);
2101     SvTAINT(sv);
2102 }
2103
2104 /*
2105 =for apidoc sv_setiv_mg
2106
2107 Like C<sv_setiv>, but also handles 'set' magic.
2108
2109 =cut
2110 */
2111
2112 void
2113 Perl_sv_setiv_mg(pTHX_ register SV *sv, IV i)
2114 {
2115     sv_setiv(sv,i);
2116     SvSETMAGIC(sv);
2117 }
2118
2119 /*
2120 =for apidoc sv_setuv
2121
2122 Copies an unsigned integer into the given SV, upgrading first if necessary.
2123 Does not handle 'set' magic.  See also C<sv_setuv_mg>.
2124
2125 =cut
2126 */
2127
2128 void
2129 Perl_sv_setuv(pTHX_ register SV *sv, UV u)
2130 {
2131     /* With these two if statements:
2132        u=1.49  s=0.52  cu=72.49  cs=10.64  scripts=270  tests=20865
2133
2134        without
2135        u=1.35  s=0.47  cu=73.45  cs=11.43  scripts=270  tests=20865
2136
2137        If you wish to remove them, please benchmark to see what the effect is
2138     */
2139     if (u <= (UV)IV_MAX) {
2140        sv_setiv(sv, (IV)u);
2141        return;
2142     }
2143     sv_setiv(sv, 0);
2144     SvIsUV_on(sv);
2145     SvUV_set(sv, u);
2146 }
2147
2148 /*
2149 =for apidoc sv_setuv_mg
2150
2151 Like C<sv_setuv>, but also handles 'set' magic.
2152
2153 =cut
2154 */
2155
2156 void
2157 Perl_sv_setuv_mg(pTHX_ register SV *sv, UV u)
2158 {
2159     /* With these two if statements:
2160        u=1.49  s=0.52  cu=72.49  cs=10.64  scripts=270  tests=20865
2161
2162        without
2163        u=1.35  s=0.47  cu=73.45  cs=11.43  scripts=270  tests=20865
2164
2165        If you wish to remove them, please benchmark to see what the effect is
2166     */
2167     if (u <= (UV)IV_MAX) {
2168        sv_setiv(sv, (IV)u);
2169     } else {
2170        sv_setiv(sv, 0);
2171        SvIsUV_on(sv);
2172        sv_setuv(sv,u);
2173     }
2174     SvSETMAGIC(sv);
2175 }
2176
2177 /*
2178 =for apidoc sv_setnv
2179
2180 Copies a double into the given SV, upgrading first if necessary.
2181 Does not handle 'set' magic.  See also C<sv_setnv_mg>.
2182
2183 =cut
2184 */
2185
2186 void
2187 Perl_sv_setnv(pTHX_ register SV *sv, NV num)
2188 {
2189     SV_CHECK_THINKFIRST_COW_DROP(sv);
2190     switch (SvTYPE(sv)) {
2191     case SVt_NULL:
2192     case SVt_IV:
2193         sv_upgrade(sv, SVt_NV);
2194         break;
2195     case SVt_RV:
2196     case SVt_PV:
2197     case SVt_PVIV:
2198         sv_upgrade(sv, SVt_PVNV);
2199         break;
2200
2201     case SVt_PVGV:
2202     case SVt_PVAV:
2203     case SVt_PVHV:
2204     case SVt_PVCV:
2205     case SVt_PVFM:
2206     case SVt_PVIO:
2207         Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
2208                    OP_NAME(PL_op));
2209     }
2210     SvNV_set(sv, num);
2211     (void)SvNOK_only(sv);                       /* validate number */
2212     SvTAINT(sv);
2213 }
2214
2215 /*
2216 =for apidoc sv_setnv_mg
2217
2218 Like C<sv_setnv>, but also handles 'set' magic.
2219
2220 =cut
2221 */
2222
2223 void
2224 Perl_sv_setnv_mg(pTHX_ register SV *sv, NV num)
2225 {
2226     sv_setnv(sv,num);
2227     SvSETMAGIC(sv);
2228 }
2229
2230 /* Print an "isn't numeric" warning, using a cleaned-up,
2231  * printable version of the offending string
2232  */
2233
2234 STATIC void
2235 S_not_a_number(pTHX_ SV *sv)
2236 {
2237      SV *dsv;
2238      char tmpbuf[64];
2239      char *pv;
2240
2241      if (DO_UTF8(sv)) {
2242           dsv = sv_2mortal(newSVpv("", 0));
2243           pv = sv_uni_display(dsv, sv, 10, 0);
2244      } else {
2245           char *d = tmpbuf;
2246           char *limit = tmpbuf + sizeof(tmpbuf) - 8;
2247           /* each *s can expand to 4 chars + "...\0",
2248              i.e. need room for 8 chars */
2249         
2250           const char *s, *end;
2251           for (s = SvPVX_const(sv), end = s + SvCUR(sv); s < end && d < limit;
2252                s++) {
2253                int ch = *s & 0xFF;
2254                if (ch & 128 && !isPRINT_LC(ch)) {
2255                     *d++ = 'M';
2256                     *d++ = '-';
2257                     ch &= 127;
2258                }
2259                if (ch == '\n') {
2260                     *d++ = '\\';
2261                     *d++ = 'n';
2262                }
2263                else if (ch == '\r') {
2264                     *d++ = '\\';
2265                     *d++ = 'r';
2266                }
2267                else if (ch == '\f') {
2268                     *d++ = '\\';
2269                     *d++ = 'f';
2270                }
2271                else if (ch == '\\') {
2272                     *d++ = '\\';
2273                     *d++ = '\\';
2274                }
2275                else if (ch == '\0') {
2276                     *d++ = '\\';
2277                     *d++ = '0';
2278                }
2279                else if (isPRINT_LC(ch))
2280                     *d++ = ch;
2281                else {
2282                     *d++ = '^';
2283                     *d++ = toCTRL(ch);
2284                }
2285           }
2286           if (s < end) {
2287                *d++ = '.';
2288                *d++ = '.';
2289                *d++ = '.';
2290           }
2291           *d = '\0';
2292           pv = tmpbuf;
2293     }
2294
2295     if (PL_op)
2296         Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
2297                     "Argument \"%s\" isn't numeric in %s", pv,
2298                     OP_DESC(PL_op));
2299     else
2300         Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
2301                     "Argument \"%s\" isn't numeric", pv);
2302 }
2303
2304 /*
2305 =for apidoc looks_like_number
2306
2307 Test if the content of an SV looks like a number (or is a number).
2308 C<Inf> and C<Infinity> are treated as numbers (so will not issue a
2309 non-numeric warning), even if your atof() doesn't grok them.
2310
2311 =cut
2312 */
2313
2314 I32
2315 Perl_looks_like_number(pTHX_ SV *sv)
2316 {
2317     register const char *sbegin;
2318     STRLEN len;
2319
2320     if (SvPOK(sv)) {
2321         sbegin = SvPVX_const(sv);
2322         len = SvCUR(sv);
2323     }
2324     else if (SvPOKp(sv))
2325         sbegin = SvPV_const(sv, len);
2326     else
2327         return SvFLAGS(sv) & (SVf_NOK|SVp_NOK|SVf_IOK|SVp_IOK);
2328     return grok_number(sbegin, len, NULL);
2329 }
2330
2331 /* Actually, ISO C leaves conversion of UV to IV undefined, but
2332    until proven guilty, assume that things are not that bad... */
2333
2334 /*
2335    NV_PRESERVES_UV:
2336
2337    As 64 bit platforms often have an NV that doesn't preserve all bits of
2338    an IV (an assumption perl has been based on to date) it becomes necessary
2339    to remove the assumption that the NV always carries enough precision to
2340    recreate the IV whenever needed, and that the NV is the canonical form.
2341    Instead, IV/UV and NV need to be given equal rights. So as to not lose
2342    precision as a side effect of conversion (which would lead to insanity
2343    and the dragon(s) in t/op/numconvert.t getting very angry) the intent is
2344    1) to distinguish between IV/UV/NV slots that have cached a valid
2345       conversion where precision was lost and IV/UV/NV slots that have a
2346       valid conversion which has lost no precision
2347    2) to ensure that if a numeric conversion to one form is requested that
2348       would lose precision, the precise conversion (or differently
2349       imprecise conversion) is also performed and cached, to prevent
2350       requests for different numeric formats on the same SV causing
2351       lossy conversion chains. (lossless conversion chains are perfectly
2352       acceptable (still))
2353
2354
2355    flags are used:
2356    SvIOKp is true if the IV slot contains a valid value
2357    SvIOK  is true only if the IV value is accurate (UV if SvIOK_UV true)
2358    SvNOKp is true if the NV slot contains a valid value
2359    SvNOK  is true only if the NV value is accurate
2360
2361    so
2362    while converting from PV to NV, check to see if converting that NV to an
2363    IV(or UV) would lose accuracy over a direct conversion from PV to
2364    IV(or UV). If it would, cache both conversions, return NV, but mark
2365    SV as IOK NOKp (ie not NOK).
2366
2367    While converting from PV to IV, check to see if converting that IV to an
2368    NV would lose accuracy over a direct conversion from PV to NV. If it
2369    would, cache both conversions, flag similarly.
2370
2371    Before, the SV value "3.2" could become NV=3.2 IV=3 NOK, IOK quite
2372    correctly because if IV & NV were set NV *always* overruled.
2373    Now, "3.2" will become NV=3.2 IV=3 NOK, IOKp, because the flag's meaning
2374    changes - now IV and NV together means that the two are interchangeable:
2375    SvIVX == (IV) SvNVX && SvNVX == (NV) SvIVX;
2376
2377    The benefit of this is that operations such as pp_add know that if
2378    SvIOK is true for both left and right operands, then integer addition
2379    can be used instead of floating point (for cases where the result won't
2380    overflow). Before, floating point was always used, which could lead to
2381    loss of precision compared with integer addition.
2382
2383    * making IV and NV equal status should make maths accurate on 64 bit
2384      platforms
2385    * may speed up maths somewhat if pp_add and friends start to use
2386      integers when possible instead of fp. (Hopefully the overhead in
2387      looking for SvIOK and checking for overflow will not outweigh the
2388      fp to integer speedup)
2389    * will slow down integer operations (callers of SvIV) on "inaccurate"
2390      values, as the change from SvIOK to SvIOKp will cause a call into
2391      sv_2iv each time rather than a macro access direct to the IV slot
2392    * should speed up number->string conversion on integers as IV is
2393      favoured when IV and NV are equally accurate
2394
2395    ####################################################################
2396    You had better be using SvIOK_notUV if you want an IV for arithmetic:
2397    SvIOK is true if (IV or UV), so you might be getting (IV)SvUV.
2398    On the other hand, SvUOK is true iff UV.
2399    ####################################################################
2400
2401    Your mileage will vary depending your CPU's relative fp to integer
2402    performance ratio.
2403 */
2404
2405 #ifndef NV_PRESERVES_UV
2406 #  define IS_NUMBER_UNDERFLOW_IV 1
2407 #  define IS_NUMBER_UNDERFLOW_UV 2
2408 #  define IS_NUMBER_IV_AND_UV    2
2409 #  define IS_NUMBER_OVERFLOW_IV  4
2410 #  define IS_NUMBER_OVERFLOW_UV  5
2411
2412 /* sv_2iuv_non_preserve(): private routine for use by sv_2iv() and sv_2uv() */
2413
2414 /* For sv_2nv these three cases are "SvNOK and don't bother casting"  */
2415 STATIC int
2416 S_sv_2iuv_non_preserve(pTHX_ register SV *sv, I32 numtype)
2417 {
2418     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));
2419     if (SvNVX(sv) < (NV)IV_MIN) {
2420         (void)SvIOKp_on(sv);
2421         (void)SvNOK_on(sv);
2422         SvIV_set(sv, IV_MIN);
2423         return IS_NUMBER_UNDERFLOW_IV;
2424     }
2425     if (SvNVX(sv) > (NV)UV_MAX) {
2426         (void)SvIOKp_on(sv);
2427         (void)SvNOK_on(sv);
2428         SvIsUV_on(sv);
2429         SvUV_set(sv, UV_MAX);
2430         return IS_NUMBER_OVERFLOW_UV;
2431     }
2432     (void)SvIOKp_on(sv);
2433     (void)SvNOK_on(sv);
2434     /* Can't use strtol etc to convert this string.  (See truth table in
2435        sv_2iv  */
2436     if (SvNVX(sv) <= (UV)IV_MAX) {
2437         SvIV_set(sv, I_V(SvNVX(sv)));
2438         if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2439             SvIOK_on(sv); /* Integer is precise. NOK, IOK */
2440         } else {
2441             /* Integer is imprecise. NOK, IOKp */
2442         }
2443         return SvNVX(sv) < 0 ? IS_NUMBER_UNDERFLOW_UV : IS_NUMBER_IV_AND_UV;
2444     }
2445     SvIsUV_on(sv);
2446     SvUV_set(sv, U_V(SvNVX(sv)));
2447     if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2448         if (SvUVX(sv) == UV_MAX) {
2449             /* As we know that NVs don't preserve UVs, UV_MAX cannot
2450                possibly be preserved by NV. Hence, it must be overflow.
2451                NOK, IOKp */
2452             return IS_NUMBER_OVERFLOW_UV;
2453         }
2454         SvIOK_on(sv); /* Integer is precise. NOK, UOK */
2455     } else {
2456         /* Integer is imprecise. NOK, IOKp */
2457     }
2458     return IS_NUMBER_OVERFLOW_IV;
2459 }
2460 #endif /* !NV_PRESERVES_UV*/
2461
2462 /* sv_2iv() is now a macro using Perl_sv_2iv_flags();
2463  * this function provided for binary compatibility only
2464  */
2465
2466 IV
2467 Perl_sv_2iv(pTHX_ register SV *sv)
2468 {
2469     return sv_2iv_flags(sv, SV_GMAGIC);
2470 }
2471
2472 /*
2473 =for apidoc sv_2iv_flags
2474
2475 Return the integer value of an SV, doing any necessary string
2476 conversion.  If flags includes SV_GMAGIC, does an mg_get() first.
2477 Normally used via the C<SvIV(sv)> and C<SvIVx(sv)> macros.
2478
2479 =cut
2480 */
2481
2482 IV
2483 Perl_sv_2iv_flags(pTHX_ register SV *sv, I32 flags)
2484 {
2485     if (!sv)
2486         return 0;
2487     if (SvGMAGICAL(sv)) {
2488         if (flags & SV_GMAGIC)
2489             mg_get(sv);
2490         if (SvIOKp(sv))
2491             return SvIVX(sv);
2492         if (SvNOKp(sv)) {
2493             return I_V(SvNVX(sv));
2494         }
2495         if (SvPOKp(sv) && SvLEN(sv))
2496             return asIV(sv);
2497         if (!SvROK(sv)) {
2498             if (!(SvFLAGS(sv) & SVs_PADTMP)) {
2499                 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
2500                     report_uninit(sv);
2501             }
2502             return 0;
2503         }
2504     }
2505     if (SvTHINKFIRST(sv)) {
2506         if (SvROK(sv)) {
2507           SV* tmpstr;
2508           if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
2509                 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv))))
2510               return SvIV(tmpstr);
2511           return PTR2IV(SvRV(sv));
2512         }
2513         if (SvIsCOW(sv)) {
2514             sv_force_normal_flags(sv, 0);
2515         }
2516         if (SvREADONLY(sv) && !SvOK(sv)) {
2517             if (ckWARN(WARN_UNINITIALIZED))
2518                 report_uninit(sv);
2519             return 0;
2520         }
2521     }
2522     if (SvIOKp(sv)) {
2523         if (SvIsUV(sv)) {
2524             return (IV)(SvUVX(sv));
2525         }
2526         else {
2527             return SvIVX(sv);
2528         }
2529     }
2530     if (SvNOKp(sv)) {
2531         /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
2532          * without also getting a cached IV/UV from it at the same time
2533          * (ie PV->NV conversion should detect loss of accuracy and cache
2534          * IV or UV at same time to avoid this.  NWC */
2535
2536         if (SvTYPE(sv) == SVt_NV)
2537             sv_upgrade(sv, SVt_PVNV);
2538
2539         (void)SvIOKp_on(sv);    /* Must do this first, to clear any SvOOK */
2540         /* < not <= as for NV doesn't preserve UV, ((NV)IV_MAX+1) will almost
2541            certainly cast into the IV range at IV_MAX, whereas the correct
2542            answer is the UV IV_MAX +1. Hence < ensures that dodgy boundary
2543            cases go to UV */
2544         if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2545             SvIV_set(sv, I_V(SvNVX(sv)));
2546             if (SvNVX(sv) == (NV) SvIVX(sv)
2547 #ifndef NV_PRESERVES_UV
2548                 && (((UV)1 << NV_PRESERVES_UV_BITS) >
2549                     (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
2550                 /* Don't flag it as "accurately an integer" if the number
2551                    came from a (by definition imprecise) NV operation, and
2552                    we're outside the range of NV integer precision */
2553 #endif
2554                 ) {
2555                 SvIOK_on(sv);  /* Can this go wrong with rounding? NWC */
2556                 DEBUG_c(PerlIO_printf(Perl_debug_log,
2557                                       "0x%"UVxf" iv(%"NVgf" => %"IVdf") (precise)\n",
2558                                       PTR2UV(sv),
2559                                       SvNVX(sv),
2560                                       SvIVX(sv)));
2561
2562             } else {
2563                 /* IV not precise.  No need to convert from PV, as NV
2564                    conversion would already have cached IV if it detected
2565                    that PV->IV would be better than PV->NV->IV
2566                    flags already correct - don't set public IOK.  */
2567                 DEBUG_c(PerlIO_printf(Perl_debug_log,
2568                                       "0x%"UVxf" iv(%"NVgf" => %"IVdf") (imprecise)\n",
2569                                       PTR2UV(sv),
2570                                       SvNVX(sv),
2571                                       SvIVX(sv)));
2572             }
2573             /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
2574                but the cast (NV)IV_MIN rounds to a the value less (more
2575                negative) than IV_MIN which happens to be equal to SvNVX ??
2576                Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
2577                NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
2578                (NV)UVX == NVX are both true, but the values differ. :-(
2579                Hopefully for 2s complement IV_MIN is something like
2580                0x8000000000000000 which will be exact. NWC */
2581         }
2582         else {
2583             SvUV_set(sv, U_V(SvNVX(sv)));
2584             if (
2585                 (SvNVX(sv) == (NV) SvUVX(sv))
2586 #ifndef  NV_PRESERVES_UV
2587                 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
2588                 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
2589                 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
2590                 /* Don't flag it as "accurately an integer" if the number
2591                    came from a (by definition imprecise) NV operation, and
2592                    we're outside the range of NV integer precision */
2593 #endif
2594                 )
2595                 SvIOK_on(sv);
2596             SvIsUV_on(sv);
2597           ret_iv_max:
2598             DEBUG_c(PerlIO_printf(Perl_debug_log,
2599                                   "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
2600                                   PTR2UV(sv),
2601                                   SvUVX(sv),
2602                                   SvUVX(sv)));
2603             return (IV)SvUVX(sv);
2604         }
2605     }
2606     else if (SvPOKp(sv) && SvLEN(sv)) {
2607         UV value;
2608         const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2609         /* We want to avoid a possible problem when we cache an IV which
2610            may be later translated to an NV, and the resulting NV is not
2611            the same as the direct translation of the initial string
2612            (eg 123.456 can shortcut to the IV 123 with atol(), but we must
2613            be careful to ensure that the value with the .456 is around if the
2614            NV value is requested in the future).
2615         
2616            This means that if we cache such an IV, we need to cache the
2617            NV as well.  Moreover, we trade speed for space, and do not
2618            cache the NV if we are sure it's not needed.
2619          */
2620
2621         /* SVt_PVNV is one higher than SVt_PVIV, hence this order  */
2622         if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2623              == IS_NUMBER_IN_UV) {
2624             /* It's definitely an integer, only upgrade to PVIV */
2625             if (SvTYPE(sv) < SVt_PVIV)
2626                 sv_upgrade(sv, SVt_PVIV);
2627             (void)SvIOK_on(sv);
2628         } else if (SvTYPE(sv) < SVt_PVNV)
2629             sv_upgrade(sv, SVt_PVNV);
2630
2631         /* If NV preserves UV then we only use the UV value if we know that
2632            we aren't going to call atof() below. If NVs don't preserve UVs
2633            then the value returned may have more precision than atof() will
2634            return, even though value isn't perfectly accurate.  */
2635         if ((numtype & (IS_NUMBER_IN_UV
2636 #ifdef NV_PRESERVES_UV
2637                         | IS_NUMBER_NOT_INT
2638 #endif
2639             )) == IS_NUMBER_IN_UV) {
2640             /* This won't turn off the public IOK flag if it was set above  */
2641             (void)SvIOKp_on(sv);
2642
2643             if (!(numtype & IS_NUMBER_NEG)) {
2644                 /* positive */;
2645                 if (value <= (UV)IV_MAX) {
2646                     SvIV_set(sv, (IV)value);
2647                 } else {
2648                     SvUV_set(sv, value);
2649                     SvIsUV_on(sv);
2650                 }
2651             } else {
2652                 /* 2s complement assumption  */
2653                 if (value <= (UV)IV_MIN) {
2654                     SvIV_set(sv, -(IV)value);
2655                 } else {
2656                     /* Too negative for an IV.  This is a double upgrade, but
2657                        I'm assuming it will be rare.  */
2658                     if (SvTYPE(sv) < SVt_PVNV)
2659                         sv_upgrade(sv, SVt_PVNV);
2660                     SvNOK_on(sv);
2661                     SvIOK_off(sv);
2662                     SvIOKp_on(sv);
2663                     SvNV_set(sv, -(NV)value);
2664                     SvIV_set(sv, IV_MIN);
2665                 }
2666             }
2667         }
2668         /* For !NV_PRESERVES_UV and IS_NUMBER_IN_UV and IS_NUMBER_NOT_INT we
2669            will be in the previous block to set the IV slot, and the next
2670            block to set the NV slot.  So no else here.  */
2671         
2672         if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2673             != IS_NUMBER_IN_UV) {
2674             /* It wasn't an (integer that doesn't overflow the UV). */
2675             SvNV_set(sv, Atof(SvPVX_const(sv)));
2676
2677             if (! numtype && ckWARN(WARN_NUMERIC))
2678                 not_a_number(sv);
2679
2680 #if defined(USE_LONG_DOUBLE)
2681             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%" PERL_PRIgldbl ")\n",
2682                                   PTR2UV(sv), SvNVX(sv)));
2683 #else
2684             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"NVgf")\n",
2685                                   PTR2UV(sv), SvNVX(sv)));
2686 #endif
2687
2688
2689 #ifdef NV_PRESERVES_UV
2690             (void)SvIOKp_on(sv);
2691             (void)SvNOK_on(sv);
2692             if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2693                 SvIV_set(sv, I_V(SvNVX(sv)));
2694                 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2695                     SvIOK_on(sv);
2696                 } else {
2697                     /* Integer is imprecise. NOK, IOKp */
2698                 }
2699                 /* UV will not work better than IV */
2700             } else {
2701                 if (SvNVX(sv) > (NV)UV_MAX) {
2702                     SvIsUV_on(sv);
2703                     /* Integer is inaccurate. NOK, IOKp, is UV */
2704                     SvUV_set(sv, UV_MAX);
2705                     SvIsUV_on(sv);
2706                 } else {
2707                     SvUV_set(sv, U_V(SvNVX(sv)));
2708                     /* 0xFFFFFFFFFFFFFFFF not an issue in here */
2709                     if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2710                         SvIOK_on(sv);
2711                         SvIsUV_on(sv);
2712                     } else {
2713                         /* Integer is imprecise. NOK, IOKp, is UV */
2714                         SvIsUV_on(sv);
2715                     }
2716                 }
2717                 goto ret_iv_max;
2718             }
2719 #else /* NV_PRESERVES_UV */
2720             if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2721                 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
2722                 /* The IV slot will have been set from value returned by
2723                    grok_number above.  The NV slot has just been set using
2724                    Atof.  */
2725                 SvNOK_on(sv);
2726                 assert (SvIOKp(sv));
2727             } else {
2728                 if (((UV)1 << NV_PRESERVES_UV_BITS) >
2729                     U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2730                     /* Small enough to preserve all bits. */
2731                     (void)SvIOKp_on(sv);
2732                     SvNOK_on(sv);
2733                     SvIV_set(sv, I_V(SvNVX(sv)));
2734                     if ((NV)(SvIVX(sv)) == SvNVX(sv))
2735                         SvIOK_on(sv);
2736                     /* Assumption: first non-preserved integer is < IV_MAX,
2737                        this NV is in the preserved range, therefore: */
2738                     if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
2739                           < (UV)IV_MAX)) {
2740                         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);
2741                     }
2742                 } else {
2743                     /* IN_UV NOT_INT
2744                          0      0       already failed to read UV.
2745                          0      1       already failed to read UV.
2746                          1      0       you won't get here in this case. IV/UV
2747                                         slot set, public IOK, Atof() unneeded.
2748                          1      1       already read UV.
2749                        so there's no point in sv_2iuv_non_preserve() attempting
2750                        to use atol, strtol, strtoul etc.  */
2751                     if (sv_2iuv_non_preserve (sv, numtype)
2752                         >= IS_NUMBER_OVERFLOW_IV)
2753                     goto ret_iv_max;
2754                 }
2755             }
2756 #endif /* NV_PRESERVES_UV */
2757         }
2758     } else  {
2759         if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
2760             report_uninit(sv);
2761         if (SvTYPE(sv) < SVt_IV)
2762             /* Typically the caller expects that sv_any is not NULL now.  */
2763             sv_upgrade(sv, SVt_IV);
2764         return 0;
2765     }
2766     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
2767         PTR2UV(sv),SvIVX(sv)));
2768     return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
2769 }
2770
2771 /* sv_2uv() is now a macro using Perl_sv_2uv_flags();
2772  * this function provided for binary compatibility only
2773  */
2774
2775 UV
2776 Perl_sv_2uv(pTHX_ register SV *sv)
2777 {
2778     return sv_2uv_flags(sv, SV_GMAGIC);
2779 }
2780
2781 /*
2782 =for apidoc sv_2uv_flags
2783
2784 Return the unsigned integer value of an SV, doing any necessary string
2785 conversion.  If flags includes SV_GMAGIC, does an mg_get() first.
2786 Normally used via the C<SvUV(sv)> and C<SvUVx(sv)> macros.
2787
2788 =cut
2789 */
2790
2791 UV
2792 Perl_sv_2uv_flags(pTHX_ register SV *sv, I32 flags)
2793 {
2794     if (!sv)
2795         return 0;
2796     if (SvGMAGICAL(sv)) {
2797         if (flags & SV_GMAGIC)
2798             mg_get(sv);
2799         if (SvIOKp(sv))
2800             return SvUVX(sv);
2801         if (SvNOKp(sv))
2802             return U_V(SvNVX(sv));
2803         if (SvPOKp(sv) && SvLEN(sv))
2804             return asUV(sv);
2805         if (!SvROK(sv)) {
2806             if (!(SvFLAGS(sv) & SVs_PADTMP)) {
2807                 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
2808                     report_uninit(sv);
2809             }
2810             return 0;
2811         }
2812     }
2813     if (SvTHINKFIRST(sv)) {
2814         if (SvROK(sv)) {
2815           SV* tmpstr;
2816           if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
2817                 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv))))
2818               return SvUV(tmpstr);
2819           return PTR2UV(SvRV(sv));
2820         }
2821         if (SvIsCOW(sv)) {
2822             sv_force_normal_flags(sv, 0);
2823         }
2824         if (SvREADONLY(sv) && !SvOK(sv)) {
2825             if (ckWARN(WARN_UNINITIALIZED))
2826                 report_uninit(sv);
2827             return 0;
2828         }
2829     }
2830     if (SvIOKp(sv)) {
2831         if (SvIsUV(sv)) {
2832             return SvUVX(sv);
2833         }
2834         else {
2835             return (UV)SvIVX(sv);
2836         }
2837     }
2838     if (SvNOKp(sv)) {
2839         /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
2840          * without also getting a cached IV/UV from it at the same time
2841          * (ie PV->NV conversion should detect loss of accuracy and cache
2842          * IV or UV at same time to avoid this. */
2843         /* IV-over-UV optimisation - choose to cache IV if possible */
2844
2845         if (SvTYPE(sv) == SVt_NV)
2846             sv_upgrade(sv, SVt_PVNV);
2847
2848         (void)SvIOKp_on(sv);    /* Must do this first, to clear any SvOOK */
2849         if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2850             SvIV_set(sv, I_V(SvNVX(sv)));
2851             if (SvNVX(sv) == (NV) SvIVX(sv)
2852 #ifndef NV_PRESERVES_UV
2853                 && (((UV)1 << NV_PRESERVES_UV_BITS) >
2854                     (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
2855                 /* Don't flag it as "accurately an integer" if the number
2856                    came from a (by definition imprecise) NV operation, and
2857                    we're outside the range of NV integer precision */
2858 #endif
2859                 ) {
2860                 SvIOK_on(sv);  /* Can this go wrong with rounding? NWC */
2861                 DEBUG_c(PerlIO_printf(Perl_debug_log,
2862                                       "0x%"UVxf" uv(%"NVgf" => %"IVdf") (precise)\n",
2863                                       PTR2UV(sv),
2864                                       SvNVX(sv),
2865                                       SvIVX(sv)));
2866
2867             } else {
2868                 /* IV not precise.  No need to convert from PV, as NV
2869                    conversion would already have cached IV if it detected
2870                    that PV->IV would be better than PV->NV->IV
2871                    flags already correct - don't set public IOK.  */
2872                 DEBUG_c(PerlIO_printf(Perl_debug_log,
2873                                       "0x%"UVxf" uv(%"NVgf" => %"IVdf") (imprecise)\n",
2874                                       PTR2UV(sv),
2875                                       SvNVX(sv),
2876                                       SvIVX(sv)));
2877             }
2878             /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
2879                but the cast (NV)IV_MIN rounds to a the value less (more
2880                negative) than IV_MIN which happens to be equal to SvNVX ??
2881                Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
2882                NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
2883                (NV)UVX == NVX are both true, but the values differ. :-(
2884                Hopefully for 2s complement IV_MIN is something like
2885                0x8000000000000000 which will be exact. NWC */
2886         }
2887         else {
2888             SvUV_set(sv, U_V(SvNVX(sv)));
2889             if (
2890                 (SvNVX(sv) == (NV) SvUVX(sv))
2891 #ifndef  NV_PRESERVES_UV
2892                 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
2893                 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
2894                 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
2895                 /* Don't flag it as "accurately an integer" if the number
2896                    came from a (by definition imprecise) NV operation, and
2897                    we're outside the range of NV integer precision */
2898 #endif
2899                 )
2900                 SvIOK_on(sv);
2901             SvIsUV_on(sv);
2902             DEBUG_c(PerlIO_printf(Perl_debug_log,
2903                                   "0x%"UVxf" 2uv(%"UVuf" => %"IVdf") (as unsigned)\n",
2904                                   PTR2UV(sv),
2905                                   SvUVX(sv),
2906                                   SvUVX(sv)));
2907         }
2908     }
2909     else if (SvPOKp(sv) && SvLEN(sv)) {
2910         UV value;
2911         const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2912
2913         /* We want to avoid a possible problem when we cache a UV which
2914            may be later translated to an NV, and the resulting NV is not
2915            the translation of the initial data.
2916         
2917            This means that if we cache such a UV, we need to cache the
2918            NV as well.  Moreover, we trade speed for space, and do not
2919            cache the NV if not needed.
2920          */
2921
2922         /* SVt_PVNV is one higher than SVt_PVIV, hence this order  */
2923         if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2924              == IS_NUMBER_IN_UV) {
2925             /* It's definitely an integer, only upgrade to PVIV */
2926             if (SvTYPE(sv) < SVt_PVIV)
2927                 sv_upgrade(sv, SVt_PVIV);
2928             (void)SvIOK_on(sv);
2929         } else if (SvTYPE(sv) < SVt_PVNV)
2930             sv_upgrade(sv, SVt_PVNV);
2931
2932         /* If NV preserves UV then we only use the UV value if we know that
2933            we aren't going to call atof() below. If NVs don't preserve UVs
2934            then the value returned may have more precision than atof() will
2935            return, even though it isn't accurate.  */
2936         if ((numtype & (IS_NUMBER_IN_UV
2937 #ifdef NV_PRESERVES_UV
2938                         | IS_NUMBER_NOT_INT
2939 #endif
2940             )) == IS_NUMBER_IN_UV) {
2941             /* This won't turn off the public IOK flag if it was set above  */
2942             (void)SvIOKp_on(sv);
2943
2944             if (!(numtype & IS_NUMBER_NEG)) {
2945                 /* positive */;
2946                 if (value <= (UV)IV_MAX) {
2947                     SvIV_set(sv, (IV)value);
2948                 } else {
2949                     /* it didn't overflow, and it was positive. */
2950                     SvUV_set(sv, value);
2951                     SvIsUV_on(sv);
2952                 }
2953             } else {
2954                 /* 2s complement assumption  */
2955                 if (value <= (UV)IV_MIN) {
2956                     SvIV_set(sv, -(IV)value);
2957                 } else {
2958                     /* Too negative for an IV.  This is a double upgrade, but
2959                        I'm assuming it will be rare.  */
2960                     if (SvTYPE(sv) < SVt_PVNV)
2961                         sv_upgrade(sv, SVt_PVNV);
2962                     SvNOK_on(sv);
2963                     SvIOK_off(sv);
2964                     SvIOKp_on(sv);
2965                     SvNV_set(sv, -(NV)value);
2966                     SvIV_set(sv, IV_MIN);
2967                 }
2968             }
2969         }
2970         
2971         if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2972             != IS_NUMBER_IN_UV) {
2973             /* It wasn't an integer, or it overflowed the UV. */
2974             SvNV_set(sv, Atof(SvPVX_const(sv)));
2975
2976             if (! numtype && ckWARN(WARN_NUMERIC))
2977                     not_a_number(sv);
2978
2979 #if defined(USE_LONG_DOUBLE)
2980             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%" PERL_PRIgldbl ")\n",
2981                                   PTR2UV(sv), SvNVX(sv)));
2982 #else
2983             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"NVgf")\n",
2984                                   PTR2UV(sv), SvNVX(sv)));
2985 #endif
2986
2987 #ifdef NV_PRESERVES_UV
2988             (void)SvIOKp_on(sv);
2989             (void)SvNOK_on(sv);
2990             if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2991                 SvIV_set(sv, I_V(SvNVX(sv)));
2992                 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2993                     SvIOK_on(sv);
2994                 } else {
2995                     /* Integer is imprecise. NOK, IOKp */
2996                 }
2997                 /* UV will not work better than IV */
2998             } else {
2999                 if (SvNVX(sv) > (NV)UV_MAX) {
3000                     SvIsUV_on(sv);
3001                     /* Integer is inaccurate. NOK, IOKp, is UV */
3002                     SvUV_set(sv, UV_MAX);
3003                     SvIsUV_on(sv);
3004                 } else {
3005                     SvUV_set(sv, U_V(SvNVX(sv)));
3006                     /* 0xFFFFFFFFFFFFFFFF not an issue in here, NVs
3007                        NV preservse UV so can do correct comparison.  */
3008                     if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
3009                         SvIOK_on(sv);
3010                         SvIsUV_on(sv);
3011                     } else {
3012                         /* Integer is imprecise. NOK, IOKp, is UV */
3013                         SvIsUV_on(sv);
3014                     }
3015                 }
3016             }
3017 #else /* NV_PRESERVES_UV */
3018             if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3019                 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
3020                 /* The UV slot will have been set from value returned by
3021                    grok_number above.  The NV slot has just been set using
3022                    Atof.  */
3023                 SvNOK_on(sv);
3024                 assert (SvIOKp(sv));
3025             } else {
3026                 if (((UV)1 << NV_PRESERVES_UV_BITS) >
3027                     U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
3028                     /* Small enough to preserve all bits. */
3029                     (void)SvIOKp_on(sv);
3030                     SvNOK_on(sv);
3031                     SvIV_set(sv, I_V(SvNVX(sv)));
3032                     if ((NV)(SvIVX(sv)) == SvNVX(sv))
3033                         SvIOK_on(sv);
3034                     /* Assumption: first non-preserved integer is < IV_MAX,
3035                        this NV is in the preserved range, therefore: */
3036                     if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
3037                           < (UV)IV_MAX)) {
3038                         Perl_croak(aTHX_ "sv_2uv 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);
3039                     }
3040                 } else
3041                     sv_2iuv_non_preserve (sv, numtype);
3042             }
3043 #endif /* NV_PRESERVES_UV */
3044         }
3045     }
3046     else  {
3047         if (!(SvFLAGS(sv) & SVs_PADTMP)) {
3048             if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
3049                 report_uninit(sv);
3050         }
3051         if (SvTYPE(sv) < SVt_IV)
3052             /* Typically the caller expects that sv_any is not NULL now.  */
3053             sv_upgrade(sv, SVt_IV);
3054         return 0;
3055     }
3056
3057     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
3058                           PTR2UV(sv),SvUVX(sv)));
3059     return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
3060 }
3061
3062 /*
3063 =for apidoc sv_2nv
3064
3065 Return the num value of an SV, doing any necessary string or integer
3066 conversion, magic etc. Normally used via the C<SvNV(sv)> and C<SvNVx(sv)>
3067 macros.
3068
3069 =cut
3070 */
3071
3072 NV
3073 Perl_sv_2nv(pTHX_ register SV *sv)
3074 {
3075     if (!sv)
3076         return 0.0;
3077     if (SvGMAGICAL(sv)) {
3078         mg_get(sv);
3079         if (SvNOKp(sv))
3080             return SvNVX(sv);
3081         if (SvPOKp(sv) && SvLEN(sv)) {
3082             if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) &&
3083                 !grok_number(SvPVX_const(sv), SvCUR(sv), NULL))
3084                 not_a_number(sv);
3085             return Atof(SvPVX_const(sv));
3086         }
3087         if (SvIOKp(sv)) {
3088             if (SvIsUV(sv))
3089                 return (NV)SvUVX(sv);
3090             else
3091                 return (NV)SvIVX(sv);
3092         }       
3093         if (!SvROK(sv)) {
3094             if (!(SvFLAGS(sv) & SVs_PADTMP)) {
3095                 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
3096                     report_uninit(sv);
3097             }
3098             return (NV)0;
3099         }
3100     }
3101     if (SvTHINKFIRST(sv)) {
3102         if (SvROK(sv)) {
3103           SV* tmpstr;
3104           if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
3105                 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv))))
3106               return SvNV(tmpstr);
3107           return PTR2NV(SvRV(sv));
3108         }
3109         if (SvIsCOW(sv)) {
3110             sv_force_normal_flags(sv, 0);
3111         }
3112         if (SvREADONLY(sv) && !SvOK(sv)) {
3113             if (ckWARN(WARN_UNINITIALIZED))
3114                 report_uninit(sv);
3115             return 0.0;
3116         }
3117     }
3118     if (SvTYPE(sv) < SVt_NV) {
3119         if (SvTYPE(sv) == SVt_IV)
3120             sv_upgrade(sv, SVt_PVNV);
3121         else
3122             sv_upgrade(sv, SVt_NV);
3123 #ifdef USE_LONG_DOUBLE
3124         DEBUG_c({
3125             STORE_NUMERIC_LOCAL_SET_STANDARD();
3126             PerlIO_printf(Perl_debug_log,
3127                           "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
3128                           PTR2UV(sv), SvNVX(sv));
3129             RESTORE_NUMERIC_LOCAL();
3130         });
3131 #else
3132         DEBUG_c({
3133             STORE_NUMERIC_LOCAL_SET_STANDARD();
3134             PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%"NVgf")\n",
3135                           PTR2UV(sv), SvNVX(sv));
3136             RESTORE_NUMERIC_LOCAL();
3137         });
3138 #endif
3139     }
3140     else if (SvTYPE(sv) < SVt_PVNV)
3141         sv_upgrade(sv, SVt_PVNV);
3142     if (SvNOKp(sv)) {
3143         return SvNVX(sv);
3144     }
3145     if (SvIOKp(sv)) {
3146         SvNV_set(sv, SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv));
3147 #ifdef NV_PRESERVES_UV
3148         SvNOK_on(sv);
3149 #else
3150         /* Only set the public NV OK flag if this NV preserves the IV  */
3151         /* Check it's not 0xFFFFFFFFFFFFFFFF */
3152         if (SvIsUV(sv) ? ((SvUVX(sv) != UV_MAX)&&(SvUVX(sv) == U_V(SvNVX(sv))))
3153                        : (SvIVX(sv) == I_V(SvNVX(sv))))
3154             SvNOK_on(sv);
3155         else
3156             SvNOKp_on(sv);
3157 #endif
3158     }
3159     else if (SvPOKp(sv) && SvLEN(sv)) {
3160         UV value;
3161         const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
3162         if (ckWARN(WARN_NUMERIC) && !SvIOKp(sv) && !numtype)
3163             not_a_number(sv);
3164 #ifdef NV_PRESERVES_UV
3165         if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3166             == IS_NUMBER_IN_UV) {
3167             /* It's definitely an integer */
3168             SvNV_set(sv, (numtype & IS_NUMBER_NEG) ? -(NV)value : (NV)value);
3169         } else
3170             SvNV_set(sv, Atof(SvPVX_const(sv)));
3171         SvNOK_on(sv);
3172 #else
3173         SvNV_set(sv, Atof(SvPVX_const(sv)));
3174         /* Only set the public NV OK flag if this NV preserves the value in
3175            the PV at least as well as an IV/UV would.
3176            Not sure how to do this 100% reliably. */
3177         /* if that shift count is out of range then Configure's test is
3178            wonky. We shouldn't be in here with NV_PRESERVES_UV_BITS ==
3179            UV_BITS */
3180         if (((UV)1 << NV_PRESERVES_UV_BITS) >
3181             U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
3182             SvNOK_on(sv); /* Definitely small enough to preserve all bits */
3183         } else if (!(numtype & IS_NUMBER_IN_UV)) {
3184             /* Can't use strtol etc to convert this string, so don't try.
3185                sv_2iv and sv_2uv will use the NV to convert, not the PV.  */
3186             SvNOK_on(sv);
3187         } else {
3188             /* value has been set.  It may not be precise.  */
3189             if ((numtype & IS_NUMBER_NEG) && (value > (UV)IV_MIN)) {
3190                 /* 2s complement assumption for (UV)IV_MIN  */
3191                 SvNOK_on(sv); /* Integer is too negative.  */
3192             } else {
3193                 SvNOKp_on(sv);
3194                 SvIOKp_on(sv);
3195
3196                 if (numtype & IS_NUMBER_NEG) {
3197                     SvIV_set(sv, -(IV)value);
3198                 } else if (value <= (UV)IV_MAX) {
3199                     SvIV_set(sv, (IV)value);
3200                 } else {
3201                     SvUV_set(sv, value);
3202                     SvIsUV_on(sv);
3203                 }
3204
3205                 if (numtype & IS_NUMBER_NOT_INT) {
3206                     /* I believe that even if the original PV had decimals,
3207                        they are lost beyond the limit of the FP precision.
3208                        However, neither is canonical, so both only get p
3209                        flags.  NWC, 2000/11/25 */
3210                     /* Both already have p flags, so do nothing */
3211                 } else {
3212                     const NV nv = SvNVX(sv);
3213                     if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
3214                         if (SvIVX(sv) == I_V(nv)) {
3215                             SvNOK_on(sv);
3216                             SvIOK_on(sv);
3217                         } else {
3218                             SvIOK_on(sv);
3219                             /* It had no "." so it must be integer.  */
3220                         }
3221                     } else {
3222                         /* between IV_MAX and NV(UV_MAX).
3223                            Could be slightly > UV_MAX */
3224
3225                         if (numtype & IS_NUMBER_NOT_INT) {
3226                             /* UV and NV both imprecise.  */
3227                         } else {
3228                             const UV nv_as_uv = U_V(nv);
3229
3230                             if (value == nv_as_uv && SvUVX(sv) != UV_MAX) {
3231                                 SvNOK_on(sv);
3232                                 SvIOK_on(sv);
3233                             } else {
3234                                 SvIOK_on(sv);
3235                             }
3236                         }
3237                     }
3238                 }
3239             }
3240         }
3241 #endif /* NV_PRESERVES_UV */
3242     }
3243     else  {
3244         if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
3245             report_uninit(sv);
3246         if (SvTYPE(sv) < SVt_NV)
3247             /* Typically the caller expects that sv_any is not NULL now.  */
3248             /* XXX Ilya implies that this is a bug in callers that assume this
3249                and ideally should be fixed.  */
3250             sv_upgrade(sv, SVt_NV);
3251         return 0.0;
3252     }
3253 #if defined(USE_LONG_DOUBLE)
3254     DEBUG_c({
3255         STORE_NUMERIC_LOCAL_SET_STANDARD();
3256         PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
3257                       PTR2UV(sv), SvNVX(sv));
3258         RESTORE_NUMERIC_LOCAL();
3259     });
3260 #else
3261     DEBUG_c({
3262         STORE_NUMERIC_LOCAL_SET_STANDARD();
3263         PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%"NVgf")\n",
3264                       PTR2UV(sv), SvNVX(sv));
3265         RESTORE_NUMERIC_LOCAL();
3266     });
3267 #endif
3268     return SvNVX(sv);
3269 }
3270
3271 /* asIV(): extract an integer from the string value of an SV.
3272  * Caller must validate PVX  */
3273
3274 STATIC IV
3275 S_asIV(pTHX_ SV *sv)
3276 {
3277     UV value;
3278     const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
3279
3280     if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3281         == IS_NUMBER_IN_UV) {
3282         /* It's definitely an integer */
3283         if (numtype & IS_NUMBER_NEG) {
3284             if (value < (UV)IV_MIN)
3285                 return -(IV)value;
3286         } else {
3287             if (value < (UV)IV_MAX)
3288                 return (IV)value;
3289         }
3290     }
3291     if (!numtype) {
3292         if (ckWARN(WARN_NUMERIC))
3293             not_a_number(sv);
3294     }
3295     return I_V(Atof(SvPVX_const(sv)));
3296 }
3297
3298 /* asUV(): extract an unsigned integer from the string value of an SV
3299  * Caller must validate PVX  */
3300
3301 STATIC UV
3302 S_asUV(pTHX_ SV *sv)
3303 {
3304     UV value;
3305     const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
3306
3307     if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
3308         == IS_NUMBER_IN_UV) {
3309         /* It's definitely an integer */
3310         if (!(numtype & IS_NUMBER_NEG))
3311             return value;
3312     }
3313     if (!numtype) {
3314         if (ckWARN(WARN_NUMERIC))
3315             not_a_number(sv);
3316     }
3317     return U_V(Atof(SvPVX_const(sv)));
3318 }
3319
3320 /*
3321 =for apidoc sv_2pv_nolen
3322
3323 Like C<sv_2pv()>, but doesn't return the length too. You should usually
3324 use the macro wrapper C<SvPV_nolen(sv)> instead.
3325 =cut
3326 */
3327
3328 char *
3329 Perl_sv_2pv_nolen(pTHX_ register SV *sv)
3330 {
3331     return sv_2pv(sv, 0);
3332 }
3333
3334 /* uiv_2buf(): private routine for use by sv_2pv_flags(): print an IV or
3335  * UV as a string towards the end of buf, and return pointers to start and
3336  * end of it.
3337  *
3338  * We assume that buf is at least TYPE_CHARS(UV) long.
3339  */
3340
3341 static char *
3342 uiv_2buf(char *buf, IV iv, UV uv, int is_uv, char **peob)
3343 {
3344     char *ptr = buf + TYPE_CHARS(UV);
3345     char *ebuf = ptr;
3346     int sign;
3347
3348     if (is_uv)
3349         sign = 0;
3350     else if (iv >= 0) {
3351         uv = iv;
3352         sign = 0;
3353     } else {
3354         uv = -iv;
3355         sign = 1;
3356     }
3357     do {
3358         *--ptr = '0' + (char)(uv % 10);
3359     } while (uv /= 10);
3360     if (sign)
3361         *--ptr = '-';
3362     *peob = ebuf;
3363     return ptr;
3364 }
3365
3366 /* sv_2pv() is now a macro using Perl_sv_2pv_flags();
3367  * this function provided for binary compatibility only
3368  */
3369
3370 char *
3371 Perl_sv_2pv(pTHX_ register SV *sv, STRLEN *lp)
3372 {
3373     return sv_2pv_flags(sv, lp, SV_GMAGIC);
3374 }
3375
3376 /*
3377 =for apidoc sv_2pv_flags
3378
3379 Returns a pointer to the string value of an SV, and sets *lp to its length.
3380 If flags includes SV_GMAGIC, does an mg_get() first. Coerces sv to a string
3381 if necessary.
3382 Normally invoked via the C<SvPV_flags> macro. C<sv_2pv()> and C<sv_2pv_nomg>
3383 usually end up here too.
3384
3385 =cut
3386 */
3387
3388 char *
3389 Perl_sv_2pv_flags(pTHX_ register SV *sv, STRLEN *lp, I32 flags)
3390 {
3391     register char *s;
3392     int olderrno;
3393     SV *tsv, *origsv;
3394     char tbuf[64];      /* Must fit sprintf/Gconvert of longest IV/NV */
3395     char *tmpbuf = tbuf;
3396
3397     if (!sv) {
3398         if (lp)
3399             *lp = 0;
3400         return (char *)"";
3401     }
3402     if (SvGMAGICAL(sv)) {
3403         if (flags & SV_GMAGIC)
3404             mg_get(sv);
3405         if (SvPOKp(sv)) {
3406             if (lp)
3407                 *lp = SvCUR(sv);
3408             if (flags & SV_MUTABLE_RETURN)
3409                 return SvPVX_mutable(sv);
3410             if (flags & SV_CONST_RETURN)
3411                 return (char *)SvPVX_const(sv);
3412             return SvPVX(sv);
3413         }
3414         if (SvIOKp(sv)) {
3415             if (SvIsUV(sv))
3416                 (void)sprintf(tmpbuf,"%"UVuf, (UV)SvUVX(sv));
3417             else
3418                 (void)sprintf(tmpbuf,"%"IVdf, (IV)SvIVX(sv));
3419             tsv = Nullsv;
3420             goto tokensave;
3421         }
3422         if (SvNOKp(sv)) {
3423             Gconvert(SvNVX(sv), NV_DIG, 0, tmpbuf);
3424             tsv = Nullsv;
3425             goto tokensave;
3426         }
3427         if (!SvROK(sv)) {
3428             if (!(SvFLAGS(sv) & SVs_PADTMP)) {
3429                 if (ckWARN(WARN_UNINITIALIZED) && !PL_localizing)
3430                     report_uninit(sv);
3431             }
3432             if (lp)
3433                 *lp = 0;
3434             return (char *)"";
3435         }
3436     }
3437     if (SvTHINKFIRST(sv)) {
3438         if (SvROK(sv)) {
3439             SV* tmpstr;
3440             register const char *typestr;
3441             if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)) &&
3442                 (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
3443                 /* Unwrap this:  */
3444                 /* char *pv = lp ? SvPV(tmpstr, *lp) : SvPV_nolen(tmpstr); */
3445
3446                 char *pv;
3447                 if ((SvFLAGS(tmpstr) & (SVf_POK)) == SVf_POK) {
3448                     if (flags & SV_CONST_RETURN) {
3449                         pv = (char *) SvPVX_const(tmpstr);
3450                     } else {
3451                         pv = (flags & SV_MUTABLE_RETURN)
3452                             ? SvPVX_mutable(tmpstr) : SvPVX(tmpstr);
3453                     }
3454                     if (lp)
3455                         *lp = SvCUR(tmpstr);
3456                 } else {
3457                     pv = sv_2pv_flags(tmpstr, lp, flags);
3458                 }
3459                 if (SvUTF8(tmpstr))
3460                     SvUTF8_on(sv);
3461                 else
3462                     SvUTF8_off(sv);
3463                 return pv;
3464             }
3465             origsv = sv;
3466             sv = (SV*)SvRV(sv);
3467             if (!sv)
3468                 typestr = "NULLREF";
3469             else {
3470                 MAGIC *mg;
3471                 
3472                 switch (SvTYPE(sv)) {
3473                 case SVt_PVMG:
3474                     if ( ((SvFLAGS(sv) &
3475                            (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG))
3476                           == (SVs_OBJECT|SVs_SMG))
3477                          && (mg = mg_find(sv, PERL_MAGIC_qr))) {
3478                         const regexp *re = (regexp *)mg->mg_obj;
3479
3480                         if (!mg->mg_ptr) {
3481                             const char *fptr = "msix";
3482                             char reflags[6];
3483                             char ch;
3484                             int left = 0;
3485                             int right = 4;
3486                             char need_newline = 0;
3487                             U16 reganch = (U16)((re->reganch & PMf_COMPILETIME) >> 12);
3488
3489                             while((ch = *fptr++)) {
3490                                 if(reganch & 1) {
3491                                     reflags[left++] = ch;
3492                                 }
3493                                 else {
3494                                     reflags[right--] = ch;
3495                                 }
3496                                 reganch >>= 1;
3497                             }
3498                             if(left != 4) {
3499                                 reflags[left] = '-';
3500                                 left = 5;
3501                             }
3502
3503                             mg->mg_len = re->prelen + 4 + left;
3504                             /*
3505                              * If /x was used, we have to worry about a regex
3506                              * ending with a comment later being embedded
3507                              * within another regex. If so, we don't want this
3508                              * regex's "commentization" to leak out to the
3509                              * right part of the enclosing regex, we must cap
3510                              * it with a newline.
3511                              *
3512                              * So, if /x was used, we scan backwards from the
3513                              * end of the regex. If we find a '#' before we
3514                              * find a newline, we need to add a newline
3515                              * ourself. If we find a '\n' first (or if we
3516                              * don't find '#' or '\n'), we don't need to add
3517                              * anything.  -jfriedl
3518                              */
3519                             if (PMf_EXTENDED & re->reganch)
3520                             {
3521                                 const char *endptr = re->precomp + re->prelen;
3522                                 while (endptr >= re->precomp)
3523                                 {
3524                                     const char c = *(endptr--);
3525                                     if (c == '\n')
3526                                         break; /* don't need another */
3527                                     if (c == '#') {
3528                                         /* we end while in a comment, so we
3529                                            need a newline */
3530                                         mg->mg_len++; /* save space for it */
3531                                         need_newline = 1; /* note to add it */
3532                                         break;
3533                                     }
3534                                 }
3535                             }
3536
3537                             New(616, mg->mg_ptr, mg->mg_len + 1 + left, char);
3538                             Copy("(?", mg->mg_ptr, 2, char);
3539                             Copy(reflags, mg->mg_ptr+2, left, char);
3540                             Copy(":", mg->mg_ptr+left+2, 1, char);
3541                             Copy(re->precomp, mg->mg_ptr+3+left, re->prelen, char);
3542                             if (need_newline)
3543                                 mg->mg_ptr[mg->mg_len - 2] = '\n';
3544                             mg->mg_ptr[mg->mg_len - 1] = ')';
3545                             mg->mg_ptr[mg->mg_len] = 0;
3546                         }
3547                         PL_reginterp_cnt += re->program[0].next_off;
3548
3549                         if (re->reganch & ROPT_UTF8)
3550                             SvUTF8_on(origsv);
3551                         else
3552                             SvUTF8_off(origsv);
3553                         if (lp)
3554                             *lp = mg->mg_len;
3555                         return mg->mg_ptr;
3556                     }
3557                                         /* Fall through */
3558                 case SVt_NULL:
3559                 case SVt_IV:
3560                 case SVt_NV:
3561                 case SVt_RV:
3562                 case SVt_PV:
3563                 case SVt_PVIV:
3564                 case SVt_PVNV:
3565                 case SVt_PVBM:  typestr = SvROK(sv) ? "REF" : "SCALAR"; break;
3566                 case SVt_PVLV:  typestr = SvROK(sv) ? "REF"
3567                                 /* tied lvalues should appear to be
3568                                  * scalars for backwards compatitbility */
3569                                 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
3570                                     ? "SCALAR" : "LVALUE";      break;
3571                 case SVt_PVAV:  typestr = "ARRAY";      break;
3572                 case SVt_PVHV:  typestr = "HASH";       break;
3573                 case SVt_PVCV:  typestr = "CODE";       break;
3574                 case SVt_PVGV:  typestr = "GLOB";       break;
3575                 case SVt_PVFM:  typestr = "FORMAT";     break;
3576                 case SVt_PVIO:  typestr = "IO";         break;
3577                 default:        typestr = "UNKNOWN";    break;
3578                 }
3579                 tsv = NEWSV(0,0);
3580                 if (SvOBJECT(sv)) {
3581                     const char *name = HvNAME_get(SvSTASH(sv));
3582                     Perl_sv_setpvf(aTHX_ tsv, "%s=%s(0x%"UVxf")",
3583                                    name ? name : "__ANON__" , typestr, PTR2UV(sv));
3584                 }
3585                 else
3586                     Perl_sv_setpvf(aTHX_ tsv, "%s(0x%"UVxf")", typestr, PTR2UV(sv));
3587                 goto tokensaveref;
3588             }
3589             if (lp)
3590                 *lp = strlen(typestr);
3591             return (char *)typestr;
3592         }
3593         if (SvREADONLY(sv) && !SvOK(sv)) {
3594             if (ckWARN(WARN_UNINITIALIZED))
3595                 report_uninit(sv);
3596             if (lp)
3597                 *lp = 0;
3598             return (char *)"";
3599         }
3600     }
3601     if (SvIOK(sv) || ((SvIOKp(sv) && !SvNOKp(sv)))) {
3602         /* I'm assuming that if both IV and NV are equally valid then
3603            converting the IV is going to be more efficient */
3604         const U32 isIOK = SvIOK(sv);
3605         const U32 isUIOK = SvIsUV(sv);
3606         char buf[TYPE_CHARS(UV)];
3607         char *ebuf, *ptr;
3608
3609         if (SvTYPE(sv) < SVt_PVIV)
3610             sv_upgrade(sv, SVt_PVIV);
3611         if (isUIOK)
3612             ptr = uiv_2buf(buf, 0, SvUVX(sv), 1, &ebuf);
3613         else
3614             ptr = uiv_2buf(buf, SvIVX(sv), 0, 0, &ebuf);
3615         /* inlined from sv_setpvn */
3616         SvGROW_mutable(sv, (STRLEN)(ebuf - ptr + 1));
3617         Move(ptr,SvPVX_mutable(sv),ebuf - ptr,char);
3618         SvCUR_set(sv, ebuf - ptr);
3619         s = SvEND(sv);
3620         *s = '\0';
3621         if (isIOK)
3622             SvIOK_on(sv);
3623         else
3624             SvIOKp_on(sv);
3625         if (isUIOK)
3626             SvIsUV_on(sv);
3627     }
3628     else if (SvNOKp(sv)) {
3629         if (SvTYPE(sv) < SVt_PVNV)
3630             sv_upgrade(sv, SVt_PVNV);
3631         /* The +20 is pure guesswork.  Configure test needed. --jhi */
3632         s = SvGROW_mutable(sv, NV_DIG + 20);
3633         olderrno = errno;       /* some Xenix systems wipe out errno here */
3634 #ifdef apollo
3635         if (SvNVX(sv) == 0.0)
3636             (void)strcpy(s,"0");
3637         else
3638 #endif /*apollo*/
3639         {
3640             Gconvert(SvNVX(sv), NV_DIG, 0, s);
3641         }
3642         errno = olderrno;
3643 #ifdef FIXNEGATIVEZERO
3644         if (*s == '-' && s[1] == '0' && !s[2])
3645             strcpy(s,"0");
3646 #endif
3647         while (*s) s++;
3648 #ifdef hcx
3649         if (s[-1] == '.')
3650             *--s = '\0';
3651 #endif
3652     }
3653     else {
3654         if (ckWARN(WARN_UNINITIALIZED)
3655             && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
3656             report_uninit(sv);
3657         if (lp)
3658         *lp = 0;
3659         if (SvTYPE(sv) < SVt_PV)
3660             /* Typically the caller expects that sv_any is not NULL now.  */
3661             sv_upgrade(sv, SVt_PV);
3662         return (char *)"";
3663     }
3664     {
3665         STRLEN len = s - SvPVX_const(sv);
3666         if (lp) 
3667             *lp = len;
3668         SvCUR_set(sv, len);
3669     }
3670     SvPOK_on(sv);
3671     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3672                           PTR2UV(sv),SvPVX_const(sv)));
3673     if (flags & SV_CONST_RETURN)
3674         return (char *)SvPVX_const(sv);
3675     if (flags & SV_MUTABLE_RETURN)
3676         return SvPVX_mutable(sv);
3677     return SvPVX(sv);
3678
3679   tokensave:
3680     if (SvROK(sv)) {    /* XXX Skip this when sv_pvn_force calls */
3681         /* Sneaky stuff here */
3682
3683       tokensaveref:
3684         if (!tsv)
3685             tsv = newSVpv(tmpbuf, 0);
3686         sv_2mortal(tsv);
3687         if (lp)
3688             *lp = SvCUR(tsv);
3689         return SvPVX(tsv);
3690     }
3691     else {
3692         dVAR;
3693         STRLEN len;
3694         const char *t;
3695
3696         if (tsv) {
3697             sv_2mortal(tsv);
3698             t = SvPVX_const(tsv);
3699             len = SvCUR(tsv);
3700         }
3701         else {
3702             t = tmpbuf;
3703             len = strlen(tmpbuf);
3704         }
3705 #ifdef FIXNEGATIVEZERO
3706         if (len == 2 && t[0] == '-' && t[1] == '0') {
3707             t = "0";
3708             len = 1;
3709         }
3710 #endif
3711         SvUPGRADE(sv, SVt_PV);
3712         if (lp)
3713             *lp = len;
3714         s = SvGROW_mutable(sv, len + 1);
3715         SvCUR_set(sv, len);
3716         SvPOKp_on(sv);
3717         return strcpy(s, t);
3718     }
3719 }
3720
3721 /*
3722 =for apidoc sv_copypv
3723
3724 Copies a stringified representation of the source SV into the
3725 destination SV.  Automatically performs any necessary mg_get and
3726 coercion of numeric values into strings.  Guaranteed to preserve
3727 UTF-8 flag even from overloaded objects.  Similar in nature to
3728 sv_2pv[_flags] but operates directly on an SV instead of just the
3729 string.  Mostly uses sv_2pv_flags to do its work, except when that
3730 would lose the UTF-8'ness of the PV.
3731
3732 =cut
3733 */
3734
3735 void
3736 Perl_sv_copypv(pTHX_ SV *dsv, register SV *ssv)
3737 {
3738     STRLEN len;
3739     const char *s;
3740     s = SvPV_const(ssv,len);
3741     sv_setpvn(dsv,s,len);
3742     if (SvUTF8(ssv))
3743         SvUTF8_on(dsv);
3744     else
3745         SvUTF8_off(dsv);
3746 }
3747
3748 /*
3749 =for apidoc sv_2pvbyte_nolen
3750
3751 Return a pointer to the byte-encoded representation of the SV.
3752 May cause the SV to be downgraded from UTF-8 as a side-effect.
3753
3754 Usually accessed via the C<SvPVbyte_nolen> macro.
3755
3756 =cut
3757 */
3758
3759 char *
3760 Perl_sv_2pvbyte_nolen(pTHX_ register SV *sv)
3761 {
3762     return sv_2pvbyte(sv, 0);
3763 }
3764
3765 /*
3766 =for apidoc sv_2pvbyte
3767
3768 Return a pointer to the byte-encoded representation of the SV, and set *lp
3769 to its length.  May cause the SV to be downgraded from UTF-8 as a
3770 side-effect.
3771
3772 Usually accessed via the C<SvPVbyte> macro.
3773
3774 =cut
3775 */
3776
3777 char *
3778 Perl_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
3779 {
3780     sv_utf8_downgrade(sv,0);
3781     return SvPV(sv,*lp);
3782 }
3783
3784 /*
3785 =for apidoc sv_2pvutf8_nolen
3786
3787 Return a pointer to the UTF-8-encoded representation of the SV.
3788 May cause the SV to be upgraded to UTF-8 as a side-effect.
3789
3790 Usually accessed via the C<SvPVutf8_nolen> macro.
3791
3792 =cut
3793 */
3794
3795 char *
3796 Perl_sv_2pvutf8_nolen(pTHX_ register SV *sv)
3797 {
3798     return sv_2pvutf8(sv, 0);
3799 }
3800
3801 /*
3802 =for apidoc sv_2pvutf8
3803
3804 Return a pointer to the UTF-8-encoded representation of the SV, and set *lp
3805 to its length.  May cause the SV to be upgraded to UTF-8 as a side-effect.
3806
3807 Usually accessed via the C<SvPVutf8> macro.
3808
3809 =cut
3810 */
3811
3812 char *
3813 Perl_sv_2pvutf8(pTHX_ register SV *sv, STRLEN *lp)
3814 {
3815     sv_utf8_upgrade(sv);
3816     return SvPV(sv,*lp);
3817 }
3818
3819 /*
3820 =for apidoc sv_2bool
3821
3822 This function is only called on magical items, and is only used by
3823 sv_true() or its macro equivalent.
3824
3825 =cut
3826 */
3827
3828 bool
3829 Perl_sv_2bool(pTHX_ register SV *sv)
3830 {
3831     if (SvGMAGICAL(sv))
3832         mg_get(sv);
3833
3834     if (!SvOK(sv))
3835         return 0;
3836     if (SvROK(sv)) {
3837         SV* tmpsv;
3838         if (SvAMAGIC(sv) && (tmpsv=AMG_CALLun(sv,bool_)) &&
3839                 (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
3840             return (bool)SvTRUE(tmpsv);
3841       return SvRV(sv) != 0;
3842     }
3843     if (SvPOKp(sv)) {
3844         register XPV* Xpvtmp;
3845         if ((Xpvtmp = (XPV*)SvANY(sv)) &&
3846                 (*sv->sv_u.svu_pv > '0' ||
3847                 Xpvtmp->xpv_cur > 1 ||
3848                 (Xpvtmp->xpv_cur && *sv->sv_u.svu_pv != '0')))
3849             return 1;
3850         else
3851             return 0;
3852     }
3853     else {
3854         if (SvIOKp(sv))
3855             return SvIVX(sv) != 0;
3856         else {
3857             if (SvNOKp(sv))
3858                 return SvNVX(sv) != 0.0;
3859             else
3860                 return FALSE;
3861         }
3862     }
3863 }
3864
3865 /* sv_utf8_upgrade() is now a macro using sv_utf8_upgrade_flags();
3866  * this function provided for binary compatibility only
3867  */
3868
3869
3870 STRLEN
3871 Perl_sv_utf8_upgrade(pTHX_ register SV *sv)
3872 {
3873     return sv_utf8_upgrade_flags(sv, SV_GMAGIC);
3874 }
3875
3876 /*
3877 =for apidoc sv_utf8_upgrade
3878
3879 Converts the PV of an SV to its UTF-8-encoded form.
3880 Forces the SV to string form if it is not already.
3881 Always sets the SvUTF8 flag to avoid future validity checks even
3882 if all the bytes have hibit clear.
3883
3884 This is not as a general purpose byte encoding to Unicode interface:
3885 use the Encode extension for that.
3886
3887 =for apidoc sv_utf8_upgrade_flags
3888
3889 Converts the PV of an SV to its UTF-8-encoded form.
3890 Forces the SV to string form if it is not already.
3891 Always sets the SvUTF8 flag to avoid future validity checks even
3892 if all the bytes have hibit clear. If C<flags> has C<SV_GMAGIC> bit set,
3893 will C<mg_get> on C<sv> if appropriate, else not. C<sv_utf8_upgrade> and
3894 C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
3895
3896 This is not as a general purpose byte encoding to Unicode interface:
3897 use the Encode extension for that.
3898
3899 =cut
3900 */
3901
3902 STRLEN
3903 Perl_sv_utf8_upgrade_flags(pTHX_ register SV *sv, I32 flags)
3904 {
3905     if (sv == &PL_sv_undef)
3906         return 0;
3907     if (!SvPOK(sv)) {
3908         STRLEN len = 0;
3909         if (SvREADONLY(sv) && (SvPOKp(sv) || SvIOKp(sv) || SvNOKp(sv))) {
3910             (void) sv_2pv_flags(sv,&len, flags);
3911             if (SvUTF8(sv))
3912                 return len;
3913         } else {
3914             (void) SvPV_force(sv,len);
3915         }
3916     }
3917
3918     if (SvUTF8(sv)) {
3919         return SvCUR(sv);
3920     }
3921
3922     if (SvIsCOW(sv)) {
3923         sv_force_normal_flags(sv, 0);
3924     }
3925
3926     if (PL_encoding && !(flags & SV_UTF8_NO_ENCODING))
3927         sv_recode_to_utf8(sv, PL_encoding);
3928     else { /* Assume Latin-1/EBCDIC */
3929         /* This function could be much more efficient if we
3930          * had a FLAG in SVs to signal if there are any hibit
3931          * chars in the PV.  Given that there isn't such a flag
3932          * make the loop as fast as possible. */
3933         const U8 *s = (U8 *) SvPVX_const(sv);
3934         const U8 *e = (U8 *) SvEND(sv);
3935         const U8 *t = s;
3936         int hibit = 0;
3937         
3938         while (t < e) {
3939             U8 ch = *t++;
3940             if ((hibit = !NATIVE_IS_INVARIANT(ch)))
3941                 break;
3942         }
3943         if (hibit) {
3944             STRLEN len = SvCUR(sv) + 1; /* Plus the \0 */
3945             char *recoded = bytes_to_utf8((U8*)s, &len);
3946
3947             SvPV_free(sv); /* No longer using what was there before. */
3948
3949             SvPV_set(sv, recoded);
3950             SvCUR_set(sv, len - 1);
3951             SvLEN_set(sv, len); /* No longer know the real size. */
3952         }
3953         /* Mark as UTF-8 even if no hibit - saves scanning loop */
3954         SvUTF8_on(sv);
3955     }
3956     return SvCUR(sv);
3957 }
3958
3959 /*
3960 =for apidoc sv_utf8_downgrade
3961
3962 Attempts to convert the PV of an SV from characters to bytes.
3963 If the PV contains a character beyond byte, this conversion will fail;
3964 in this case, either returns false or, if C<fail_ok> is not
3965 true, croaks.
3966
3967 This is not as a general purpose Unicode to byte encoding interface:
3968 use the Encode extension for that.
3969
3970 =cut
3971 */
3972
3973 bool
3974 Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
3975 {
3976     if (SvPOKp(sv) && SvUTF8(sv)) {
3977         if (SvCUR(sv)) {
3978             U8 *s;
3979             STRLEN len;
3980
3981             if (SvIsCOW(sv)) {
3982                 sv_force_normal_flags(sv, 0);
3983             }
3984             s = (U8 *) SvPV(sv, len);
3985             if (!utf8_to_bytes(s, &len)) {
3986                 if (fail_ok)
3987                     return FALSE;
3988                 else {
3989                     if (PL_op)
3990                         Perl_croak(aTHX_ "Wide character in %s",
3991                                    OP_DESC(PL_op));
3992                     else
3993                         Perl_croak(aTHX_ "Wide character");
3994                 }
3995             }
3996             SvCUR_set(sv, len);
3997         }
3998     }
3999     SvUTF8_off(sv);
4000     return TRUE;
4001 }
4002
4003 /*
4004 =for apidoc sv_utf8_encode
4005
4006 Converts the PV of an SV to UTF-8, but then turns the C<SvUTF8>
4007 flag off so that it looks like octets again.
4008
4009 =cut
4010 */
4011
4012 void
4013 Perl_sv_utf8_encode(pTHX_ register SV *sv)
4014 {
4015     (void) sv_utf8_upgrade(sv);
4016     if (SvIsCOW(sv)) {
4017         sv_force_normal_flags(sv, 0);
4018     }
4019     if (SvREADONLY(sv)) {
4020         Perl_croak(aTHX_ PL_no_modify);
4021     }
4022     SvUTF8_off(sv);
4023 }
4024
4025 /*
4026 =for apidoc sv_utf8_decode
4027
4028 If the PV of the SV is an octet sequence in UTF-8
4029 and contains a multiple-byte character, the C<SvUTF8> flag is turned on
4030 so that it looks like a character. If the PV contains only single-byte
4031 characters, the C<SvUTF8> flag stays being off.
4032 Scans PV for validity and returns false if the PV is invalid UTF-8.
4033
4034 =cut
4035 */
4036
4037 bool
4038 Perl_sv_utf8_decode(pTHX_ register SV *sv)
4039 {
4040     if (SvPOKp(sv)) {
4041         const U8 *c;
4042         const U8 *e;
4043
4044         /* The octets may have got themselves encoded - get them back as
4045          * bytes
4046          */
4047         if (!sv_utf8_downgrade(sv, TRUE))
4048             return FALSE;
4049
4050         /* it is actually just a matter of turning the utf8 flag on, but
4051          * we want to make sure everything inside is valid utf8 first.
4052          */
4053         c = (const U8 *) SvPVX_const(sv);
4054         if (!is_utf8_string(c, SvCUR(sv)+1))
4055             return FALSE;
4056         e = (const U8 *) SvEND(sv);
4057         while (c < e) {
4058             U8 ch = *c++;
4059             if (!UTF8_IS_INVARIANT(ch)) {
4060                 SvUTF8_on(sv);
4061                 break;
4062             }
4063         }
4064     }
4065     return TRUE;
4066 }
4067
4068 /* sv_setsv() is now a macro using Perl_sv_setsv_flags();
4069  * this function provided for binary compatibility only
4070  */
4071
4072 void
4073 Perl_sv_setsv(pTHX_ SV *dstr, register SV *sstr)
4074 {
4075     sv_setsv_flags(dstr, sstr, SV_GMAGIC);
4076 }
4077
4078 /*
4079 =for apidoc sv_setsv
4080
4081 Copies the contents of the source SV C<ssv> into the destination SV
4082 C<dsv>.  The source SV may be destroyed if it is mortal, so don't use this
4083 function if the source SV needs to be reused. Does not handle 'set' magic.
4084 Loosely speaking, it performs a copy-by-value, obliterating any previous
4085 content of the destination.
4086
4087 You probably want to use one of the assortment of wrappers, such as
4088 C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
4089 C<SvSetMagicSV_nosteal>.
4090
4091 =for apidoc sv_setsv_flags
4092
4093 Copies the contents of the source SV C<ssv> into the destination SV
4094 C<dsv>.  The source SV may be destroyed if it is mortal, so don't use this
4095 function if the source SV needs to be reused. Does not handle 'set' magic.
4096 Loosely speaking, it performs a copy-by-value, obliterating any previous
4097 content of the destination.
4098 If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
4099 C<ssv> if appropriate, else not. If the C<flags> parameter has the
4100 C<NOSTEAL> bit set then the buffers of temps will not be stolen. <sv_setsv>
4101 and C<sv_setsv_nomg> are implemented in terms of this function.
4102
4103 You probably want to use one of the assortment of wrappers, such as
4104 C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
4105 C<SvSetMagicSV_nosteal>.
4106
4107 This is the primary function for copying scalars, and most other
4108 copy-ish functions and macros use this underneath.
4109
4110 =cut
4111 */
4112
4113 void
4114 Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags)
4115 {
4116     register U32 sflags;
4117     register int dtype;
4118     register int stype;
4119
4120     if (sstr == dstr)
4121         return;
4122     SV_CHECK_THINKFIRST_COW_DROP(dstr);
4123     if (!sstr)
4124         sstr = &PL_sv_undef;
4125     stype = SvTYPE(sstr);
4126     dtype = SvTYPE(dstr);
4127
4128     SvAMAGIC_off(dstr);
4129     if ( SvVOK(dstr) )
4130     {
4131         /* need to nuke the magic */
4132         mg_free(dstr);
4133         SvRMAGICAL_off(dstr);
4134     }
4135
4136     /* There's a lot of redundancy below but we're going for speed here */
4137
4138     switch (stype) {
4139     case SVt_NULL:
4140       undef_sstr:
4141         if (dtype != SVt_PVGV) {
4142             (void)SvOK_off(dstr);
4143             return;
4144         }
4145         break;
4146     case SVt_IV:
4147         if (SvIOK(sstr)) {
4148             switch (dtype) {
4149             case SVt_NULL:
4150                 sv_upgrade(dstr, SVt_IV);
4151                 break;
4152             case SVt_NV:
4153                 sv_upgrade(dstr, SVt_PVNV);
4154                 break;
4155             case SVt_RV:
4156             case SVt_PV:
4157                 sv_upgrade(dstr, SVt_PVIV);
4158                 break;
4159             }
4160             (void)SvIOK_only(dstr);
4161             SvIV_set(dstr,  SvIVX(sstr));
4162             if (SvIsUV(sstr))
4163                 SvIsUV_on(dstr);
4164             if (SvTAINTED(sstr))
4165                 SvTAINT(dstr);
4166             return;
4167         }
4168         goto undef_sstr;
4169
4170     case SVt_NV:
4171         if (SvNOK(sstr)) {
4172             switch (dtype) {
4173             case SVt_NULL:
4174             case SVt_IV:
4175                 sv_upgrade(dstr, SVt_NV);
4176                 break;
4177             case SVt_RV:
4178             case SVt_PV:
4179             case SVt_PVIV:
4180                 sv_upgrade(dstr, SVt_PVNV);
4181                 break;
4182             }
4183             SvNV_set(dstr, SvNVX(sstr));
4184             (void)SvNOK_only(dstr);
4185             if (SvTAINTED(sstr))
4186                 SvTAINT(dstr);
4187             return;
4188         }
4189         goto undef_sstr;
4190
4191     case SVt_RV:
4192         if (dtype < SVt_RV)
4193             sv_upgrade(dstr, SVt_RV);
4194         else if (dtype == SVt_PVGV &&
4195                  SvROK(sstr) && SvTYPE(SvRV(sstr)) == SVt_PVGV) {
4196             sstr = SvRV(sstr);
4197             if (sstr == dstr) {
4198                 if (GvIMPORTED(dstr) != GVf_IMPORTED
4199                     && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4200                 {
4201                     GvIMPORTED_on(dstr);
4202                 }
4203                 GvMULTI_on(dstr);
4204                 return;
4205             }
4206             goto glob_assign;
4207         }
4208         break;
4209     case SVt_PVFM:
4210 #ifdef PERL_OLD_COPY_ON_WRITE
4211         if ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS) {
4212             if (dtype < SVt_PVIV)
4213                 sv_upgrade(dstr, SVt_PVIV);
4214             break;
4215         }
4216         /* Fall through */
4217 #endif
4218     case SVt_PV:
4219         if (dtype < SVt_PV)
4220             sv_upgrade(dstr, SVt_PV);
4221         break;
4222     case SVt_PVIV:
4223         if (dtype < SVt_PVIV)
4224             sv_upgrade(dstr, SVt_PVIV);
4225         break;
4226     case SVt_PVNV:
4227         if (dtype < SVt_PVNV)
4228             sv_upgrade(dstr, SVt_PVNV);
4229         break;
4230     case SVt_PVAV:
4231     case SVt_PVHV:
4232     case SVt_PVCV:
4233     case SVt_PVIO:
4234         {
4235         const char * const type = sv_reftype(sstr,0);
4236         if (PL_op)
4237             Perl_croak(aTHX_ "Bizarre copy of %s in %s", type, OP_NAME(PL_op));
4238         else
4239             Perl_croak(aTHX_ "Bizarre copy of %s", type);
4240         }
4241         break;
4242
4243     case SVt_PVGV:
4244         if (dtype <= SVt_PVGV) {
4245   glob_assign:
4246             if (dtype != SVt_PVGV) {
4247                 const char * const name = GvNAME(sstr);
4248                 const STRLEN len = GvNAMELEN(sstr);
4249                 /* don't upgrade SVt_PVLV: it can hold a glob */
4250                 if (dtype != SVt_PVLV)
4251                     sv_upgrade(dstr, SVt_PVGV);
4252                 sv_magic(dstr, dstr, PERL_MAGIC_glob, Nullch, 0);
4253                 GvSTASH(dstr) = (HV*)SvREFCNT_inc(GvSTASH(sstr));
4254                 GvNAME(dstr) = savepvn(name, len);
4255                 GvNAMELEN(dstr) = len;
4256                 SvFAKE_on(dstr);        /* can coerce to non-glob */
4257             }
4258             /* ahem, death to those who redefine active sort subs */
4259             else if (PL_curstackinfo->si_type == PERLSI_SORT
4260                      && GvCV(dstr) && PL_sortcop == CvSTART(GvCV(dstr)))
4261                 Perl_croak(aTHX_ "Can't redefine active sort subroutine %s",
4262                       GvNAME(dstr));
4263
4264 #ifdef GV_UNIQUE_CHECK
4265                 if (GvUNIQUE((GV*)dstr)) {
4266                     Perl_croak(aTHX_ PL_no_modify);
4267                 }
4268 #endif
4269
4270             (void)SvOK_off(dstr);
4271             GvINTRO_off(dstr);          /* one-shot flag */
4272             gp_free((GV*)dstr);
4273             GvGP(dstr) = gp_ref(GvGP(sstr));
4274             if (SvTAINTED(sstr))
4275                 SvTAINT(dstr);
4276             if (GvIMPORTED(dstr) != GVf_IMPORTED
4277                 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4278             {
4279                 GvIMPORTED_on(dstr);
4280             }
4281             GvMULTI_on(dstr);
4282             return;
4283         }
4284         /* FALL THROUGH */
4285
4286     default:
4287         if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
4288             mg_get(sstr);
4289             if ((int)SvTYPE(sstr) != stype) {
4290                 stype = SvTYPE(sstr);
4291                 if (stype == SVt_PVGV && dtype <= SVt_PVGV)
4292                     goto glob_assign;
4293             }
4294         }
4295         if (stype == SVt_PVLV)
4296             SvUPGRADE(dstr, SVt_PVNV);
4297         else
4298             SvUPGRADE(dstr, (U32)stype);
4299     }
4300
4301     sflags = SvFLAGS(sstr);
4302
4303     if (sflags & SVf_ROK) {
4304         if (dtype >= SVt_PV) {
4305             if (dtype == SVt_PVGV) {
4306                 SV *sref = SvREFCNT_inc(SvRV(sstr));
4307                 SV *dref = 0;
4308                 const int intro = GvINTRO(dstr);
4309
4310 #ifdef GV_UNIQUE_CHECK
4311                 if (GvUNIQUE((GV*)dstr)) {
4312                     Perl_croak(aTHX_ PL_no_modify);
4313                 }
4314 #endif
4315
4316                 if (intro) {
4317                     GvINTRO_off(dstr);  /* one-shot flag */
4318                     GvLINE(dstr) = CopLINE(PL_curcop);
4319                     GvEGV(dstr) = (GV*)dstr;
4320                 }
4321                 GvMULTI_on(dstr);
4322                 switch (SvTYPE(sref)) {
4323                 case SVt_PVAV:
4324                     if (intro)
4325                         SAVEGENERICSV(GvAV(dstr));
4326                     else
4327                         dref = (SV*)GvAV(dstr);
4328                     GvAV(dstr) = (AV*)sref;
4329                     if (!GvIMPORTED_AV(dstr)
4330                         && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4331                     {
4332                         GvIMPORTED_AV_on(dstr);
4333                     }
4334                     break;
4335                 case SVt_PVHV:
4336                     if (intro)
4337                         SAVEGENERICSV(GvHV(dstr));
4338                     else
4339                         dref = (SV*)GvHV(dstr);
4340                     GvHV(dstr) = (HV*)sref;
4341                     if (!GvIMPORTED_HV(dstr)
4342                         && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4343                     {
4344                         GvIMPORTED_HV_on(dstr);
4345                     }
4346                     break;
4347                 case SVt_PVCV:
4348                     if (intro) {
4349                         if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
4350                             SvREFCNT_dec(GvCV(dstr));
4351                             GvCV(dstr) = Nullcv;
4352                             GvCVGEN(dstr) = 0; /* Switch off cacheness. */
4353                             PL_sub_generation++;
4354                         }
4355                         SAVEGENERICSV(GvCV(dstr));
4356                     }
4357                     else
4358                         dref = (SV*)GvCV(dstr);
4359                     if (GvCV(dstr) != (CV*)sref) {
4360                         CV* cv = GvCV(dstr);
4361                         if (cv) {
4362                             if (!GvCVGEN((GV*)dstr) &&
4363                                 (CvROOT(cv) || CvXSUB(cv)))
4364                             {
4365                                 /* ahem, death to those who redefine
4366                                  * active sort subs */
4367                                 if (PL_curstackinfo->si_type == PERLSI_SORT &&
4368                                       PL_sortcop == CvSTART(cv))
4369                                     Perl_croak(aTHX_
4370                                     "Can't redefine active sort subroutine %s",
4371                                           GvENAME((GV*)dstr));
4372                                 /* Redefining a sub - warning is mandatory if
4373                                    it was a const and its value changed. */
4374                                 if (ckWARN(WARN_REDEFINE)
4375                                     || (CvCONST(cv)
4376                                         && (!CvCONST((CV*)sref)
4377                                             || sv_cmp(cv_const_sv(cv),
4378                                                       cv_const_sv((CV*)sref)))))
4379                                 {
4380                                     Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
4381                                         CvCONST(cv)
4382                                         ? "Constant subroutine %s::%s redefined"
4383                                         : "Subroutine %s::%s redefined",
4384                                         HvNAME_get(GvSTASH((GV*)dstr)),
4385                                         GvENAME((GV*)dstr));
4386                                 }
4387                             }
4388                             if (!intro)
4389                                 cv_ckproto(cv, (GV*)dstr,
4390                                            SvPOK(sref)
4391                                            ? SvPVX_const(sref) : Nullch);
4392                         }
4393                         GvCV(dstr) = (CV*)sref;
4394                         GvCVGEN(dstr) = 0; /* Switch off cacheness. */
4395                         GvASSUMECV_on(dstr);
4396                         PL_sub_generation++;
4397                     }
4398                     if (!GvIMPORTED_CV(dstr)
4399                         && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4400                     {
4401                         GvIMPORTED_CV_on(dstr);
4402                     }
4403                     break;
4404                 case SVt_PVIO:
4405                     if (intro)
4406                         SAVEGENERICSV(GvIOp(dstr));
4407                     else
4408                         dref = (SV*)GvIOp(dstr);
4409                     GvIOp(dstr) = (IO*)sref;
4410                     break;
4411                 case SVt_PVFM:
4412                     if (intro)
4413                         SAVEGENERICSV(GvFORM(dstr));
4414                     else
4415                         dref = (SV*)GvFORM(dstr);
4416                     GvFORM(dstr) = (CV*)sref;
4417                     break;
4418                 default:
4419                     if (intro)
4420                         SAVEGENERICSV(GvSV(dstr));
4421                     else
4422                         dref = (SV*)GvSV(dstr);
4423                     GvSV(dstr) = sref;
4424                     if (!GvIMPORTED_SV(dstr)
4425                         && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4426                     {
4427                         GvIMPORTED_SV_on(dstr);
4428                     }
4429                     break;
4430                 }
4431                 if (dref)
4432                     SvREFCNT_dec(dref);
4433                 if (SvTAINTED(sstr))
4434                     SvTAINT(dstr);
4435                 return;
4436             }
4437             if (SvPVX_const(dstr)) {
4438                 SvPV_free(dstr);
4439                 SvLEN_set(dstr, 0);
4440                 SvCUR_set(dstr, 0);
4441             }
4442         }
4443         (void)SvOK_off(dstr);
4444         SvRV_set(dstr, SvREFCNT_inc(SvRV(sstr)));
4445         SvROK_on(dstr);
4446         if (sflags & SVp_NOK) {
4447             SvNOKp_on(dstr);
4448             /* Only set the public OK flag if the source has public OK.  */
4449             if (sflags & SVf_NOK)
4450                 SvFLAGS(dstr) |= SVf_NOK;
4451             SvNV_set(dstr, SvNVX(sstr));
4452         }
4453         if (sflags & SVp_IOK) {
4454             (void)SvIOKp_on(dstr);
4455             if (sflags & SVf_IOK)
4456                 SvFLAGS(dstr) |= SVf_IOK;
4457             if (sflags & SVf_IVisUV)
4458                 SvIsUV_on(dstr);
4459             SvIV_set(dstr, SvIVX(sstr));
4460         }
4461         if (SvAMAGIC(sstr)) {
4462             SvAMAGIC_on(dstr);
4463         }
4464     }
4465     else if (sflags & SVp_POK) {
4466         bool isSwipe = 0;
4467
4468         /*
4469          * Check to see if we can just swipe the string.  If so, it's a
4470          * possible small lose on short strings, but a big win on long ones.
4471          * It might even be a win on short strings if SvPVX_const(dstr)
4472          * has to be allocated and SvPVX_const(sstr) has to be freed.
4473          */
4474
4475         /* Whichever path we take through the next code, we want this true,
4476            and doing it now facilitates the COW check.  */
4477         (void)SvPOK_only(dstr);
4478
4479         if (
4480             /* We're not already COW  */
4481             ((sflags & (SVf_FAKE | SVf_READONLY)) != (SVf_FAKE | SVf_READONLY)
4482 #ifndef PERL_OLD_COPY_ON_WRITE
4483              /* or we are, but dstr isn't a suitable target.  */
4484              || (SvFLAGS(dstr) & CAN_COW_MASK) != CAN_COW_FLAGS
4485 #endif
4486              )
4487             &&
4488             !(isSwipe =
4489                  (sflags & SVs_TEMP) &&   /* slated for free anyway? */
4490                  !(sflags & SVf_OOK) &&   /* and not involved in OOK hack? */
4491                  (!(flags & SV_NOSTEAL)) &&
4492                                         /* and we're allowed to steal temps */
4493                  SvREFCNT(sstr) == 1 &&   /* and no other references to it? */
4494                  SvLEN(sstr)    &&        /* and really is a string */
4495                                 /* and won't be needed again, potentially */
4496               !(PL_op && PL_op->op_type == OP_AASSIGN))
4497 #ifdef PERL_OLD_COPY_ON_WRITE
4498             && !((sflags & CAN_COW_MASK) == CAN_COW_FLAGS
4499                  && (SvFLAGS(dstr) & CAN_COW_MASK) == CAN_COW_FLAGS
4500                  && SvTYPE(sstr) >= SVt_PVIV)
4501 #endif
4502             ) {
4503             /* Failed the swipe test, and it's not a shared hash key either.
4504                Have to copy the string.  */
4505             STRLEN len = SvCUR(sstr);
4506             SvGROW(dstr, len + 1);      /* inlined from sv_setpvn */
4507             Move(SvPVX_const(sstr),SvPVX(dstr),len,char);
4508             SvCUR_set(dstr, len);
4509             *SvEND(dstr) = '\0';
4510         } else {
4511             /* If PERL_OLD_COPY_ON_WRITE is not defined, then isSwipe will always
4512                be true in here.  */
4513             /* Either it's a shared hash key, or it's suitable for
4514                copy-on-write or we can swipe the string.  */
4515             if (DEBUG_C_TEST) {
4516                 PerlIO_printf(Perl_debug_log, "Copy on write: sstr --> dstr\n");
4517                 sv_dump(sstr);
4518                 sv_dump(dstr);
4519             }
4520 #ifdef PERL_OLD_COPY_ON_WRITE
4521             if (!isSwipe) {
4522                 /* I believe I should acquire a global SV mutex if
4523                    it's a COW sv (not a shared hash key) to stop
4524                    it going un copy-on-write.
4525                    If the source SV has gone un copy on write between up there
4526                    and down here, then (assert() that) it is of the correct
4527                    form to make it copy on write again */
4528                 if ((sflags & (SVf_FAKE | SVf_READONLY))
4529                     != (SVf_FAKE | SVf_READONLY)) {
4530                     SvREADONLY_on(sstr);
4531                     SvFAKE_on(sstr);
4532                     /* Make the source SV into a loop of 1.
4533                        (about to become 2) */
4534                     SV_COW_NEXT_SV_SET(sstr, sstr);
4535                 }
4536             }
4537 #endif
4538             /* Initial code is common.  */
4539             if (SvPVX_const(dstr)) {            /* we know that dtype >= SVt_PV */
4540                 if (SvOOK(dstr)) {
4541                     SvFLAGS(dstr) &= ~SVf_OOK;
4542                     Safefree(SvPVX_const(dstr) - SvIVX(dstr));
4543                 }
4544                 else if (SvLEN(dstr))
4545                     Safefree(SvPVX_const(dstr));
4546             }
4547
4548             if (!isSwipe) {
4549                 /* making another shared SV.  */
4550                 STRLEN cur = SvCUR(sstr);
4551                 STRLEN len = SvLEN(sstr);
4552 #ifdef PERL_OLD_COPY_ON_WRITE
4553                 if (len) {
4554                     assert (SvTYPE(dstr) >= SVt_PVIV);
4555                     /* SvIsCOW_normal */
4556                     /* splice us in between source and next-after-source.  */
4557                     SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4558                     SV_COW_NEXT_SV_SET(sstr, dstr);
4559                     SvPV_set(dstr, SvPVX_mutable(sstr));
4560                 } else
4561 #endif
4562                 {
4563                     /* SvIsCOW_shared_hash */
4564                     DEBUG_C(PerlIO_printf(Perl_debug_log,
4565                                           "Copy on write: Sharing hash\n"));
4566
4567                     assert (SvTYPE(dstr) >= SVt_PV);
4568                     SvPV_set(dstr,
4569                              HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)))));
4570                 }
4571                 SvLEN_set(dstr, len);
4572                 SvCUR_set(dstr, cur);
4573                 SvREADONLY_on(dstr);
4574                 SvFAKE_on(dstr);
4575                 /* Relesase a global SV mutex.  */
4576             }
4577             else
4578                 {       /* Passes the swipe test.  */
4579                 SvPV_set(dstr, SvPVX_mutable(sstr));
4580                 SvLEN_set(dstr, SvLEN(sstr));
4581                 SvCUR_set(dstr, SvCUR(sstr));
4582
4583                 SvTEMP_off(dstr);
4584                 (void)SvOK_off(sstr);   /* NOTE: nukes most SvFLAGS on sstr */
4585                 SvPV_set(sstr, Nullch);
4586                 SvLEN_set(sstr, 0);
4587                 SvCUR_set(sstr, 0);
4588                 SvTEMP_off(sstr);
4589             }
4590         }
4591         if (sflags & SVf_UTF8)
4592             SvUTF8_on(dstr);
4593         /*SUPPRESS 560*/
4594         if (sflags & SVp_NOK) {
4595             SvNOKp_on(dstr);
4596             if (sflags & SVf_NOK)
4597                 SvFLAGS(dstr) |= SVf_NOK;
4598             SvNV_set(dstr, SvNVX(sstr));
4599         }
4600         if (sflags & SVp_IOK) {
4601             (void)SvIOKp_on(dstr);
4602             if (sflags & SVf_IOK)
4603                 SvFLAGS(dstr) |= SVf_IOK;
4604             if (sflags & SVf_IVisUV)
4605                 SvIsUV_on(dstr);
4606             SvIV_set(dstr, SvIVX(sstr));
4607         }
4608         if (SvVOK(sstr)) {
4609             MAGIC *smg = mg_find(sstr,PERL_MAGIC_vstring);
4610             sv_magic(dstr, NULL, PERL_MAGIC_vstring,
4611                         smg->mg_ptr, smg->mg_len);
4612             SvRMAGICAL_on(dstr);
4613         }
4614     }
4615     else if (sflags & SVp_IOK) {
4616         if (sflags & SVf_IOK)
4617             (void)SvIOK_only(dstr);
4618         else {
4619             (void)SvOK_off(dstr);
4620             (void)SvIOKp_on(dstr);
4621         }
4622         /* XXXX Do we want to set IsUV for IV(ROK)?  Be extra safe... */
4623         if (sflags & SVf_IVisUV)
4624             SvIsUV_on(dstr);
4625         SvIV_set(dstr, SvIVX(sstr));
4626         if (sflags & SVp_NOK) {
4627             if (sflags & SVf_NOK)
4628                 (void)SvNOK_on(dstr);
4629             else
4630                 (void)SvNOKp_on(dstr);
4631             SvNV_set(dstr, SvNVX(sstr));
4632         }
4633     }
4634     else if (sflags & SVp_NOK) {
4635         if (sflags & SVf_NOK)
4636             (void)SvNOK_only(dstr);
4637         else {
4638             (void)SvOK_off(dstr);
4639             SvNOKp_on(dstr);
4640         }
4641         SvNV_set(dstr, SvNVX(sstr));
4642     }
4643     else {
4644         if (dtype == SVt_PVGV) {
4645             if (ckWARN(WARN_MISC))
4646                 Perl_warner(aTHX_ packWARN(WARN_MISC), "Undefined value assigned to typeglob");
4647         }
4648         else
4649             (void)SvOK_off(dstr);
4650     }
4651     if (SvTAINTED(sstr))
4652         SvTAINT(dstr);
4653 }
4654
4655 /*
4656 =for apidoc sv_setsv_mg
4657
4658 Like C<sv_setsv>, but also handles 'set' magic.
4659
4660 =cut
4661 */
4662
4663 void
4664 Perl_sv_setsv_mg(pTHX_ SV *dstr, register SV *sstr)
4665 {
4666     sv_setsv(dstr,sstr);
4667     SvSETMAGIC(dstr);
4668 }
4669
4670 #ifdef PERL_OLD_COPY_ON_WRITE
4671 SV *
4672 Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
4673 {
4674     STRLEN cur = SvCUR(sstr);
4675     STRLEN len = SvLEN(sstr);
4676     register char *new_pv;
4677
4678     if (DEBUG_C_TEST) {
4679         PerlIO_printf(Perl_debug_log, "Fast copy on write: %p -> %p\n",
4680                       sstr, dstr);
4681         sv_dump(sstr);
4682         if (dstr)
4683                     sv_dump(dstr);
4684     }
4685
4686     if (dstr) {
4687         if (SvTHINKFIRST(dstr))
4688             sv_force_normal_flags(dstr, SV_COW_DROP_PV);
4689         else if (SvPVX_const(dstr))
4690             Safefree(SvPVX_const(dstr));
4691     }
4692     else
4693         new_SV(dstr);
4694     SvUPGRADE(dstr, SVt_PVIV);
4695
4696     assert (SvPOK(sstr));
4697     assert (SvPOKp(sstr));
4698     assert (!SvIOK(sstr));
4699     assert (!SvIOKp(sstr));
4700     assert (!SvNOK(sstr));
4701     assert (!SvNOKp(sstr));
4702
4703     if (SvIsCOW(sstr)) {
4704
4705         if (SvLEN(sstr) == 0) {
4706             /* source is a COW shared hash key.  */
4707             DEBUG_C(PerlIO_printf(Perl_debug_log,