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