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