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