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