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