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