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