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