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