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