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