522668eb235ecbdd61eedb74acb36840d9749d47
[p5sagit/p5-mst-13.2.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 = MUTABLE_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 = MUTABLE_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 = MUTABLE_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 = MUTABLE_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 = MUTABLE_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 == (const SV *) PL_fdpid || sv == (const 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 = MUTABLE_SV(SvANY(sva));
641         while (svanext && SvFAKE(svanext))
642             svanext = MUTABLE_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((const 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(MUTABLE_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(MUTABLE_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 = 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(MUTABLE_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_ MUTABLE_SV(GvSTASH(dstr)), dstr);
3406         gv_name_set(MUTABLE_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((const GV *)dstr)) {
3412         Perl_croak(aTHX_ PL_no_modify);
3413     }
3414 #endif
3415
3416     if(GvGP(MUTABLE_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((const 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(MUTABLE_GV(dstr)) && GvCVu((const GV *)dstr)) {
3432         mro_changes = 1;
3433     }
3434
3435     if(strEQ(GvNAME((const GV *)dstr),"ISA"))
3436         mro_changes = 2;
3437
3438     gp_free(MUTABLE_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((const 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) = MUTABLE_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) != (const 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 = MUTABLE_CV(*location);
3518             if (cv) {
3519                 if (!GvCVGEN((const 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((const CV *)sref)
3525                             && cv_const_sv(cv)
3526                             == cv_const_sv((const CV *)sref)) {
3527                             NOOP;
3528                             /* They are 2 constant subroutines generated from
3529                                the same constant. This probably means that
3530                                they are really the "same" proxy subroutine
3531                                instantiated in 2 places. Most likely this is
3532                                when a constant is exported twice.  Don't warn.
3533                             */
3534                         }
3535                         else if (ckWARN(WARN_REDEFINE)
3536                                  || (CvCONST(cv)
3537                                      && (!CvCONST((const CV *)sref)
3538                                          || sv_cmp(cv_const_sv(cv),
3539                                                    cv_const_sv((const CV *)
3540                                                                sref))))) {
3541                             Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
3542                                         (const char *)
3543                                         (CvCONST(cv)
3544                                          ? "Constant subroutine %s::%s redefined"
3545                                          : "Subroutine %s::%s redefined"),
3546                                         HvNAME_get(GvSTASH((const GV *)dstr)),
3547                                         GvENAME(MUTABLE_GV(dstr)));
3548                         }
3549                     }
3550                 if (!intro)
3551                     cv_ckproto_len(cv, (const GV *)dstr,
3552                                    SvPOK(sref) ? SvPVX_const(sref) : NULL,
3553                                    SvPOK(sref) ? SvCUR(sref) : 0);
3554             }
3555             GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3556             GvASSUMECV_on(dstr);
3557             if(GvSTASH(dstr)) mro_method_changed_in(GvSTASH(dstr)); /* sub foo { 1 } sub bar { 2 } *bar = \&foo */
3558         }
3559         *location = sref;
3560         if (import_flag && !(GvFLAGS(dstr) & import_flag)
3561             && CopSTASH_ne(PL_curcop, GvSTASH(dstr))) {
3562             GvFLAGS(dstr) |= import_flag;
3563         }
3564         break;
3565     }
3566     SvREFCNT_dec(dref);
3567     if (SvTAINTED(sstr))
3568         SvTAINT(dstr);
3569     return;
3570 }
3571
3572 void
3573 Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV* sstr, const I32 flags)
3574 {
3575     dVAR;
3576     register U32 sflags;
3577     register int dtype;
3578     register svtype stype;
3579
3580     PERL_ARGS_ASSERT_SV_SETSV_FLAGS;
3581
3582     if (sstr == dstr)
3583         return;
3584
3585     if (SvIS_FREED(dstr)) {
3586         Perl_croak(aTHX_ "panic: attempt to copy value %" SVf
3587                    " to a freed scalar %p", SVfARG(sstr), (void *)dstr);
3588     }
3589     SV_CHECK_THINKFIRST_COW_DROP(dstr);
3590     if (!sstr)
3591         sstr = &PL_sv_undef;
3592     if (SvIS_FREED(sstr)) {
3593         Perl_croak(aTHX_ "panic: attempt to copy freed scalar %p to %p",
3594                    (void*)sstr, (void*)dstr);
3595     }
3596     stype = SvTYPE(sstr);
3597     dtype = SvTYPE(dstr);
3598
3599     (void)SvAMAGIC_off(dstr);
3600     if ( SvVOK(dstr) )
3601     {
3602         /* need to nuke the magic */
3603         mg_free(dstr);
3604     }
3605
3606     /* There's a lot of redundancy below but we're going for speed here */
3607
3608     switch (stype) {
3609     case SVt_NULL:
3610       undef_sstr:
3611         if (dtype != SVt_PVGV) {
3612             (void)SvOK_off(dstr);
3613             return;
3614         }
3615         break;
3616     case SVt_IV:
3617         if (SvIOK(sstr)) {
3618             switch (dtype) {
3619             case SVt_NULL:
3620                 sv_upgrade(dstr, SVt_IV);
3621                 break;
3622             case SVt_NV:
3623             case SVt_PV:
3624                 sv_upgrade(dstr, SVt_PVIV);
3625                 break;
3626             case SVt_PVGV:
3627                 goto end_of_first_switch;
3628             }
3629             (void)SvIOK_only(dstr);
3630             SvIV_set(dstr,  SvIVX(sstr));
3631             if (SvIsUV(sstr))
3632                 SvIsUV_on(dstr);
3633             /* SvTAINTED can only be true if the SV has taint magic, which in
3634                turn means that the SV type is PVMG (or greater). This is the
3635                case statement for SVt_IV, so this cannot be true (whatever gcov
3636                may say).  */
3637             assert(!SvTAINTED(sstr));
3638             return;
3639         }
3640         if (!SvROK(sstr))
3641             goto undef_sstr;
3642         if (dtype < SVt_PV && dtype != SVt_IV)
3643             sv_upgrade(dstr, SVt_IV);
3644         break;
3645
3646     case SVt_NV:
3647         if (SvNOK(sstr)) {
3648             switch (dtype) {
3649             case SVt_NULL:
3650             case SVt_IV:
3651                 sv_upgrade(dstr, SVt_NV);
3652                 break;
3653             case SVt_PV:
3654             case SVt_PVIV:
3655                 sv_upgrade(dstr, SVt_PVNV);
3656                 break;
3657             case SVt_PVGV:
3658                 goto end_of_first_switch;
3659             }
3660             SvNV_set(dstr, SvNVX(sstr));
3661             (void)SvNOK_only(dstr);
3662             /* SvTAINTED can only be true if the SV has taint magic, which in
3663                turn means that the SV type is PVMG (or greater). This is the
3664                case statement for SVt_NV, so this cannot be true (whatever gcov
3665                may say).  */
3666             assert(!SvTAINTED(sstr));
3667             return;
3668         }
3669         goto undef_sstr;
3670
3671     case SVt_PVFM:
3672 #ifdef PERL_OLD_COPY_ON_WRITE
3673         if ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS) {
3674             if (dtype < SVt_PVIV)
3675                 sv_upgrade(dstr, SVt_PVIV);
3676             break;
3677         }
3678         /* Fall through */
3679 #endif
3680     case SVt_REGEXP:
3681     case SVt_PV:
3682         if (dtype < SVt_PV)
3683             sv_upgrade(dstr, SVt_PV);
3684         break;
3685     case SVt_PVIV:
3686         if (dtype < SVt_PVIV)
3687             sv_upgrade(dstr, SVt_PVIV);
3688         break;
3689     case SVt_PVNV:
3690         if (dtype < SVt_PVNV)
3691             sv_upgrade(dstr, SVt_PVNV);
3692         break;
3693     default:
3694         {
3695         const char * const type = sv_reftype(sstr,0);
3696         if (PL_op)
3697             Perl_croak(aTHX_ "Bizarre copy of %s in %s", type, OP_NAME(PL_op));
3698         else
3699             Perl_croak(aTHX_ "Bizarre copy of %s", type);
3700         }
3701         break;
3702
3703         /* case SVt_BIND: */
3704     case SVt_PVLV:
3705     case SVt_PVGV:
3706         if (isGV_with_GP(sstr) && dtype <= SVt_PVGV) {
3707             glob_assign_glob(dstr, sstr, dtype);
3708             return;
3709         }
3710         /* SvVALID means that this PVGV is playing at being an FBM.  */
3711         /*FALLTHROUGH*/
3712
3713     case SVt_PVMG:
3714         if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
3715             mg_get(sstr);
3716             if (SvTYPE(sstr) != stype) {
3717                 stype = SvTYPE(sstr);
3718                 if (isGV_with_GP(sstr) && stype == SVt_PVGV && dtype <= SVt_PVGV) {
3719                     glob_assign_glob(dstr, sstr, dtype);
3720                     return;
3721                 }
3722             }
3723         }
3724         if (stype == SVt_PVLV)
3725             SvUPGRADE(dstr, SVt_PVNV);
3726         else
3727             SvUPGRADE(dstr, (svtype)stype);
3728     }
3729  end_of_first_switch:
3730
3731     /* dstr may have been upgraded.  */
3732     dtype = SvTYPE(dstr);
3733     sflags = SvFLAGS(sstr);
3734
3735     if (dtype == SVt_PVCV || dtype == SVt_PVFM) {
3736         /* Assigning to a subroutine sets the prototype.  */
3737         if (SvOK(sstr)) {
3738             STRLEN len;
3739             const char *const ptr = SvPV_const(sstr, len);
3740
3741             SvGROW(dstr, len + 1);
3742             Copy(ptr, SvPVX(dstr), len + 1, char);
3743             SvCUR_set(dstr, len);
3744             SvPOK_only(dstr);
3745             SvFLAGS(dstr) |= sflags & SVf_UTF8;
3746         } else {
3747             SvOK_off(dstr);
3748         }
3749     } else if (dtype == SVt_PVAV || dtype == SVt_PVHV) {
3750         const char * const type = sv_reftype(dstr,0);
3751         if (PL_op)
3752             Perl_croak(aTHX_ "Cannot copy to %s in %s", type, OP_NAME(PL_op));
3753         else
3754             Perl_croak(aTHX_ "Cannot copy to %s", type);
3755     } else if (sflags & SVf_ROK) {
3756         if (isGV_with_GP(dstr) && dtype == SVt_PVGV
3757             && SvTYPE(SvRV(sstr)) == SVt_PVGV && isGV_with_GP(SvRV(sstr))) {
3758             sstr = SvRV(sstr);
3759             if (sstr == dstr) {
3760                 if (GvIMPORTED(dstr) != GVf_IMPORTED
3761                     && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3762                 {
3763                     GvIMPORTED_on(dstr);
3764                 }
3765                 GvMULTI_on(dstr);
3766                 return;
3767             }
3768             glob_assign_glob(dstr, sstr, dtype);
3769             return;
3770         }
3771
3772         if (dtype >= SVt_PV) {
3773             if (dtype == SVt_PVGV && isGV_with_GP(dstr)) {
3774                 glob_assign_ref(dstr, sstr);
3775                 return;
3776             }
3777             if (SvPVX_const(dstr)) {
3778                 SvPV_free(dstr);
3779                 SvLEN_set(dstr, 0);
3780                 SvCUR_set(dstr, 0);
3781             }
3782         }
3783         (void)SvOK_off(dstr);
3784         SvRV_set(dstr, SvREFCNT_inc(SvRV(sstr)));
3785         SvFLAGS(dstr) |= sflags & SVf_ROK;
3786         assert(!(sflags & SVp_NOK));
3787         assert(!(sflags & SVp_IOK));
3788         assert(!(sflags & SVf_NOK));
3789         assert(!(sflags & SVf_IOK));
3790     }
3791     else if (dtype == SVt_PVGV && isGV_with_GP(dstr)) {
3792         if (!(sflags & SVf_OK)) {
3793             if (ckWARN(WARN_MISC))
3794                 Perl_warner(aTHX_ packWARN(WARN_MISC),
3795                             "Undefined value assigned to typeglob");
3796         }
3797         else {
3798             GV *gv = gv_fetchsv(sstr, GV_ADD, SVt_PVGV);
3799             if (dstr != (const SV *)gv) {
3800                 if (GvGP(dstr))
3801                     gp_free(MUTABLE_GV(dstr));
3802                 GvGP(dstr) = gp_ref(GvGP(gv));
3803             }
3804         }
3805     }
3806     else if (sflags & SVp_POK) {
3807         bool isSwipe = 0;
3808
3809         /*
3810          * Check to see if we can just swipe the string.  If so, it's a
3811          * possible small lose on short strings, but a big win on long ones.
3812          * It might even be a win on short strings if SvPVX_const(dstr)
3813          * has to be allocated and SvPVX_const(sstr) has to be freed.
3814          * Likewise if we can set up COW rather than doing an actual copy, we
3815          * drop to the else clause, as the swipe code and the COW setup code
3816          * have much in common.
3817          */
3818
3819         /* Whichever path we take through the next code, we want this true,
3820            and doing it now facilitates the COW check.  */
3821         (void)SvPOK_only(dstr);
3822
3823         if (
3824             /* If we're already COW then this clause is not true, and if COW
3825                is allowed then we drop down to the else and make dest COW 
3826                with us.  If caller hasn't said that we're allowed to COW
3827                shared hash keys then we don't do the COW setup, even if the
3828                source scalar is a shared hash key scalar.  */
3829             (((flags & SV_COW_SHARED_HASH_KEYS)
3830                ? (sflags & (SVf_FAKE|SVf_READONLY)) != (SVf_FAKE|SVf_READONLY)
3831                : 1 /* If making a COW copy is forbidden then the behaviour we
3832                        desire is as if the source SV isn't actually already
3833                        COW, even if it is.  So we act as if the source flags
3834                        are not COW, rather than actually testing them.  */
3835               )
3836 #ifndef PERL_OLD_COPY_ON_WRITE
3837              /* The change that added SV_COW_SHARED_HASH_KEYS makes the logic
3838                 when PERL_OLD_COPY_ON_WRITE is defined a little wrong.
3839                 Conceptually PERL_OLD_COPY_ON_WRITE being defined should
3840                 override SV_COW_SHARED_HASH_KEYS, because it means "always COW"
3841                 but in turn, it's somewhat dead code, never expected to go
3842                 live, but more kept as a placeholder on how to do it better
3843                 in a newer implementation.  */
3844              /* If we are COW and dstr is a suitable target then we drop down
3845                 into the else and make dest a COW of us.  */
3846              || (SvFLAGS(dstr) & CAN_COW_MASK) != CAN_COW_FLAGS
3847 #endif
3848              )
3849             &&
3850             !(isSwipe =
3851                  (sflags & SVs_TEMP) &&   /* slated for free anyway? */
3852                  !(sflags & SVf_OOK) &&   /* and not involved in OOK hack? */
3853                  (!(flags & SV_NOSTEAL)) &&
3854                                         /* and we're allowed to steal temps */
3855                  SvREFCNT(sstr) == 1 &&   /* and no other references to it? */
3856                  SvLEN(sstr)    &&        /* and really is a string */
3857                                 /* and won't be needed again, potentially */
3858               !(PL_op && PL_op->op_type == OP_AASSIGN))
3859 #ifdef PERL_OLD_COPY_ON_WRITE
3860             && ((flags & SV_COW_SHARED_HASH_KEYS)
3861                 ? (!((sflags & CAN_COW_MASK) == CAN_COW_FLAGS
3862                      && (SvFLAGS(dstr) & CAN_COW_MASK) == CAN_COW_FLAGS
3863                      && SvTYPE(sstr) >= SVt_PVIV))
3864                 : 1)
3865 #endif
3866             ) {
3867             /* Failed the swipe test, and it's not a shared hash key either.
3868                Have to copy the string.  */
3869             STRLEN len = SvCUR(sstr);
3870             SvGROW(dstr, len + 1);      /* inlined from sv_setpvn */
3871             Move(SvPVX_const(sstr),SvPVX(dstr),len,char);
3872             SvCUR_set(dstr, len);
3873             *SvEND(dstr) = '\0';
3874         } else {
3875             /* If PERL_OLD_COPY_ON_WRITE is not defined, then isSwipe will always
3876                be true in here.  */
3877             /* Either it's a shared hash key, or it's suitable for
3878                copy-on-write or we can swipe the string.  */
3879             if (DEBUG_C_TEST) {
3880                 PerlIO_printf(Perl_debug_log, "Copy on write: sstr --> dstr\n");
3881                 sv_dump(sstr);
3882                 sv_dump(dstr);
3883             }
3884 #ifdef PERL_OLD_COPY_ON_WRITE
3885             if (!isSwipe) {
3886                 /* I believe I should acquire a global SV mutex if
3887                    it's a COW sv (not a shared hash key) to stop
3888                    it going un copy-on-write.
3889                    If the source SV has gone un copy on write between up there
3890                    and down here, then (assert() that) it is of the correct
3891                    form to make it copy on write again */
3892                 if ((sflags & (SVf_FAKE | SVf_READONLY))
3893                     != (SVf_FAKE | SVf_READONLY)) {
3894                     SvREADONLY_on(sstr);
3895                     SvFAKE_on(sstr);
3896                     /* Make the source SV into a loop of 1.
3897                        (about to become 2) */
3898                     SV_COW_NEXT_SV_SET(sstr, sstr);
3899                 }
3900             }
3901 #endif
3902             /* Initial code is common.  */
3903             if (SvPVX_const(dstr)) {    /* we know that dtype >= SVt_PV */
3904                 SvPV_free(dstr);
3905             }
3906
3907             if (!isSwipe) {
3908                 /* making another shared SV.  */
3909                 STRLEN cur = SvCUR(sstr);
3910                 STRLEN len = SvLEN(sstr);
3911 #ifdef PERL_OLD_COPY_ON_WRITE
3912                 if (len) {
3913                     assert (SvTYPE(dstr) >= SVt_PVIV);
3914                     /* SvIsCOW_normal */
3915                     /* splice us in between source and next-after-source.  */
3916                     SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
3917                     SV_COW_NEXT_SV_SET(sstr, dstr);
3918                     SvPV_set(dstr, SvPVX_mutable(sstr));
3919                 } else
3920 #endif
3921                 {
3922                     /* SvIsCOW_shared_hash */
3923                     DEBUG_C(PerlIO_printf(Perl_debug_log,
3924                                           "Copy on write: Sharing hash\n"));
3925
3926                     assert (SvTYPE(dstr) >= SVt_PV);
3927                     SvPV_set(dstr,
3928                              HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)))));
3929                 }
3930                 SvLEN_set(dstr, len);
3931                 SvCUR_set(dstr, cur);
3932                 SvREADONLY_on(dstr);
3933                 SvFAKE_on(dstr);
3934                 /* Relesase a global SV mutex.  */
3935             }
3936             else
3937                 {       /* Passes the swipe test.  */
3938                 SvPV_set(dstr, SvPVX_mutable(sstr));
3939                 SvLEN_set(dstr, SvLEN(sstr));
3940                 SvCUR_set(dstr, SvCUR(sstr));
3941
3942                 SvTEMP_off(dstr);
3943                 (void)SvOK_off(sstr);   /* NOTE: nukes most SvFLAGS on sstr */
3944                 SvPV_set(sstr, NULL);
3945                 SvLEN_set(sstr, 0);
3946                 SvCUR_set(sstr, 0);
3947                 SvTEMP_off(sstr);
3948             }
3949         }
3950         if (sflags & SVp_NOK) {
3951             SvNV_set(dstr, SvNVX(sstr));
3952         }
3953         if (sflags & SVp_IOK) {
3954             SvIV_set(dstr, SvIVX(sstr));
3955             /* Must do this otherwise some other overloaded use of 0x80000000
3956                gets confused. I guess SVpbm_VALID */
3957             if (sflags & SVf_IVisUV)
3958                 SvIsUV_on(dstr);
3959         }
3960         SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_NOK|SVp_NOK|SVf_UTF8);
3961         {
3962             const MAGIC * const smg = SvVSTRING_mg(sstr);
3963             if (smg) {
3964                 sv_magic(dstr, NULL, PERL_MAGIC_vstring,
3965                          smg->mg_ptr, smg->mg_len);
3966                 SvRMAGICAL_on(dstr);
3967             }
3968         }
3969     }
3970     else if (sflags & (SVp_IOK|SVp_NOK)) {
3971         (void)SvOK_off(dstr);
3972         SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_IVisUV|SVf_NOK|SVp_NOK);
3973         if (sflags & SVp_IOK) {
3974             /* XXXX Do we want to set IsUV for IV(ROK)?  Be extra safe... */
3975             SvIV_set(dstr, SvIVX(sstr));
3976         }
3977         if (sflags & SVp_NOK) {
3978             SvNV_set(dstr, SvNVX(sstr));
3979         }
3980     }
3981     else {
3982         if (isGV_with_GP(sstr)) {
3983             /* This stringification rule for globs is spread in 3 places.
3984                This feels bad. FIXME.  */
3985             const U32 wasfake = sflags & SVf_FAKE;
3986
3987             /* FAKE globs can get coerced, so need to turn this off
3988                temporarily if it is on.  */
3989             SvFAKE_off(sstr);
3990             gv_efullname3(dstr, MUTABLE_GV(sstr), "*");
3991             SvFLAGS(sstr) |= wasfake;
3992         }
3993         else
3994             (void)SvOK_off(dstr);
3995     }
3996     if (SvTAINTED(sstr))
3997         SvTAINT(dstr);
3998 }
3999
4000 /*
4001 =for apidoc sv_setsv_mg
4002
4003 Like C<sv_setsv>, but also handles 'set' magic.
4004
4005 =cut
4006 */
4007
4008 void
4009 Perl_sv_setsv_mg(pTHX_ SV *const dstr, register SV *const sstr)
4010 {
4011     PERL_ARGS_ASSERT_SV_SETSV_MG;
4012
4013     sv_setsv(dstr,sstr);
4014     SvSETMAGIC(dstr);
4015 }
4016
4017 #ifdef PERL_OLD_COPY_ON_WRITE
4018 SV *
4019 Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
4020 {
4021     STRLEN cur = SvCUR(sstr);
4022     STRLEN len = SvLEN(sstr);
4023     register char *new_pv;
4024
4025     PERL_ARGS_ASSERT_SV_SETSV_COW;
4026
4027     if (DEBUG_C_TEST) {
4028         PerlIO_printf(Perl_debug_log, "Fast copy on write: %p -> %p\n",
4029                       (void*)sstr, (void*)dstr);
4030         sv_dump(sstr);
4031         if (dstr)
4032                     sv_dump(dstr);
4033     }
4034
4035     if (dstr) {
4036         if (SvTHINKFIRST(dstr))
4037             sv_force_normal_flags(dstr, SV_COW_DROP_PV);
4038         else if (SvPVX_const(dstr))
4039             Safefree(SvPVX_const(dstr));
4040     }
4041     else
4042         new_SV(dstr);
4043     SvUPGRADE(dstr, SVt_PVIV);
4044
4045     assert (SvPOK(sstr));
4046     assert (SvPOKp(sstr));
4047     assert (!SvIOK(sstr));
4048     assert (!SvIOKp(sstr));
4049     assert (!SvNOK(sstr));
4050     assert (!SvNOKp(sstr));
4051
4052     if (SvIsCOW(sstr)) {
4053
4054         if (SvLEN(sstr) == 0) {
4055             /* source is a COW shared hash key.  */
4056             DEBUG_C(PerlIO_printf(Perl_debug_log,
4057                                   "Fast copy on write: Sharing hash\n"));
4058             new_pv = HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr))));
4059             goto common_exit;
4060         }
4061         SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4062     } else {
4063         assert ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS);
4064         SvUPGRADE(sstr, SVt_PVIV);
4065         SvREADONLY_on(sstr);
4066         SvFAKE_on(sstr);
4067         DEBUG_C(PerlIO_printf(Perl_debug_log,
4068                               "Fast copy on write: Converting sstr to COW\n"));
4069         SV_COW_NEXT_SV_SET(dstr, sstr);
4070     }
4071     SV_COW_NEXT_SV_SET(sstr, dstr);
4072     new_pv = SvPVX_mutable(sstr);
4073
4074   common_exit:
4075     SvPV_set(dstr, new_pv);
4076     SvFLAGS(dstr) = (SVt_PVIV|SVf_POK|SVp_POK|SVf_FAKE|SVf_READONLY);
4077     if (SvUTF8(sstr))
4078         SvUTF8_on(dstr);
4079     SvLEN_set(dstr, len);
4080     SvCUR_set(dstr, cur);
4081     if (DEBUG_C_TEST) {
4082         sv_dump(dstr);
4083     }
4084     return dstr;
4085 }
4086 #endif
4087
4088 /*
4089 =for apidoc sv_setpvn
4090
4091 Copies a string into an SV.  The C<len> parameter indicates the number of
4092 bytes to be copied.  If the C<ptr> argument is NULL the SV will become
4093 undefined.  Does not handle 'set' magic.  See C<sv_setpvn_mg>.
4094
4095 =cut
4096 */
4097
4098 void
4099 Perl_sv_setpvn(pTHX_ register SV *const sv, register const char *const ptr, register const STRLEN len)
4100 {
4101     dVAR;
4102     register char *dptr;
4103
4104     PERL_ARGS_ASSERT_SV_SETPVN;
4105
4106     SV_CHECK_THINKFIRST_COW_DROP(sv);
4107     if (!ptr) {
4108         (void)SvOK_off(sv);
4109         return;
4110     }
4111     else {
4112         /* len is STRLEN which is unsigned, need to copy to signed */
4113         const IV iv = len;
4114         if (iv < 0)
4115             Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen");
4116     }
4117     SvUPGRADE(sv, SVt_PV);
4118
4119     dptr = SvGROW(sv, len + 1);
4120     Move(ptr,dptr,len,char);
4121     dptr[len] = '\0';
4122     SvCUR_set(sv, len);
4123     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4124     SvTAINT(sv);
4125 }
4126
4127 /*
4128 =for apidoc sv_setpvn_mg
4129
4130 Like C<sv_setpvn>, but also handles 'set' magic.
4131
4132 =cut
4133 */
4134
4135 void
4136 Perl_sv_setpvn_mg(pTHX_ register SV *const sv, register const char *const ptr, register const STRLEN len)
4137 {
4138     PERL_ARGS_ASSERT_SV_SETPVN_MG;
4139
4140     sv_setpvn(sv,ptr,len);
4141     SvSETMAGIC(sv);
4142 }
4143
4144 /*
4145 =for apidoc sv_setpv
4146
4147 Copies a string into an SV.  The string must be null-terminated.  Does not
4148 handle 'set' magic.  See C<sv_setpv_mg>.
4149
4150 =cut
4151 */
4152
4153 void
4154 Perl_sv_setpv(pTHX_ register SV *const sv, register const char *const ptr)
4155 {
4156     dVAR;
4157     register STRLEN len;
4158
4159     PERL_ARGS_ASSERT_SV_SETPV;
4160
4161     SV_CHECK_THINKFIRST_COW_DROP(sv);
4162     if (!ptr) {
4163         (void)SvOK_off(sv);
4164         return;
4165     }
4166     len = strlen(ptr);
4167     SvUPGRADE(sv, SVt_PV);
4168
4169     SvGROW(sv, len + 1);
4170     Move(ptr,SvPVX(sv),len+1,char);
4171     SvCUR_set(sv, len);
4172     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4173     SvTAINT(sv);
4174 }
4175
4176 /*
4177 =for apidoc sv_setpv_mg
4178
4179 Like C<sv_setpv>, but also handles 'set' magic.
4180
4181 =cut
4182 */
4183
4184 void
4185 Perl_sv_setpv_mg(pTHX_ register SV *const sv, register const char *const ptr)
4186 {
4187     PERL_ARGS_ASSERT_SV_SETPV_MG;
4188
4189     sv_setpv(sv,ptr);
4190     SvSETMAGIC(sv);
4191 }
4192
4193 /*
4194 =for apidoc sv_usepvn_flags
4195
4196 Tells an SV to use C<ptr> to find its string value.  Normally the
4197 string is stored inside the SV but sv_usepvn allows the SV to use an
4198 outside string.  The C<ptr> should point to memory that was allocated
4199 by C<malloc>.  The string length, C<len>, must be supplied.  By default
4200 this function will realloc (i.e. move) the memory pointed to by C<ptr>,
4201 so that pointer should not be freed or used by the programmer after
4202 giving it to sv_usepvn, and neither should any pointers from "behind"
4203 that pointer (e.g. ptr + 1) be used.
4204
4205 If C<flags> & SV_SMAGIC is true, will call SvSETMAGIC. If C<flags> &
4206 SV_HAS_TRAILING_NUL is true, then C<ptr[len]> must be NUL, and the realloc
4207 will be skipped. (i.e. the buffer is actually at least 1 byte longer than
4208 C<len>, and already meets the requirements for storing in C<SvPVX>)
4209
4210 =cut
4211 */
4212
4213 void
4214 Perl_sv_usepvn_flags(pTHX_ SV *const sv, char *ptr, const STRLEN len, const U32 flags)
4215 {
4216     dVAR;
4217     STRLEN allocate;
4218
4219     PERL_ARGS_ASSERT_SV_USEPVN_FLAGS;
4220
4221     SV_CHECK_THINKFIRST_COW_DROP(sv);
4222     SvUPGRADE(sv, SVt_PV);
4223     if (!ptr) {
4224         (void)SvOK_off(sv);
4225         if (flags & SV_SMAGIC)
4226             SvSETMAGIC(sv);
4227         return;
4228     }
4229     if (SvPVX_const(sv))
4230         SvPV_free(sv);
4231
4232 #ifdef DEBUGGING
4233     if (flags & SV_HAS_TRAILING_NUL)
4234         assert(ptr[len] == '\0');
4235 #endif
4236
4237     allocate = (flags & SV_HAS_TRAILING_NUL)
4238         ? len + 1 :
4239 #ifdef Perl_safesysmalloc_size
4240         len + 1;
4241 #else 
4242         PERL_STRLEN_ROUNDUP(len + 1);
4243 #endif
4244     if (flags & SV_HAS_TRAILING_NUL) {
4245         /* It's long enough - do nothing.
4246            Specfically Perl_newCONSTSUB is relying on this.  */
4247     } else {
4248 #ifdef DEBUGGING
4249         /* Force a move to shake out bugs in callers.  */
4250         char *new_ptr = (char*)safemalloc(allocate);
4251         Copy(ptr, new_ptr, len, char);
4252         PoisonFree(ptr,len,char);
4253         Safefree(ptr);
4254         ptr = new_ptr;
4255 #else
4256         ptr = (char*) saferealloc (ptr, allocate);
4257 #endif
4258     }
4259 #ifdef Perl_safesysmalloc_size
4260     SvLEN_set(sv, Perl_safesysmalloc_size(ptr));
4261 #else
4262     SvLEN_set(sv, allocate);
4263 #endif
4264     SvCUR_set(sv, len);
4265     SvPV_set(sv, ptr);
4266     if (!(flags & SV_HAS_TRAILING_NUL)) {
4267         ptr[len] = '\0';
4268     }
4269     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4270     SvTAINT(sv);
4271     if (flags & SV_SMAGIC)
4272         SvSETMAGIC(sv);
4273 }
4274
4275 #ifdef PERL_OLD_COPY_ON_WRITE
4276 /* Need to do this *after* making the SV normal, as we need the buffer
4277    pointer to remain valid until after we've copied it.  If we let go too early,
4278    another thread could invalidate it by unsharing last of the same hash key
4279    (which it can do by means other than releasing copy-on-write Svs)
4280    or by changing the other copy-on-write SVs in the loop.  */
4281 STATIC void
4282 S_sv_release_COW(pTHX_ register SV *sv, const char *pvx, SV *after)
4283 {
4284     PERL_ARGS_ASSERT_SV_RELEASE_COW;
4285
4286     { /* this SV was SvIsCOW_normal(sv) */
4287          /* we need to find the SV pointing to us.  */
4288         SV *current = SV_COW_NEXT_SV(after);
4289
4290         if (current == sv) {
4291             /* The SV we point to points back to us (there were only two of us
4292                in the loop.)
4293                Hence other SV is no longer copy on write either.  */
4294             SvFAKE_off(after);
4295             SvREADONLY_off(after);
4296         } else {
4297             /* We need to follow the pointers around the loop.  */
4298             SV *next;
4299             while ((next = SV_COW_NEXT_SV(current)) != sv) {
4300                 assert (next);
4301                 current = next;
4302                  /* don't loop forever if the structure is bust, and we have
4303                     a pointer into a closed loop.  */
4304                 assert (current != after);
4305                 assert (SvPVX_const(current) == pvx);
4306             }
4307             /* Make the SV before us point to the SV after us.  */
4308             SV_COW_NEXT_SV_SET(current, after);
4309         }
4310     }
4311 }
4312 #endif
4313 /*
4314 =for apidoc sv_force_normal_flags
4315
4316 Undo various types of fakery on an SV: if the PV is a shared string, make
4317 a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
4318 an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
4319 we do the copy, and is also used locally. If C<SV_COW_DROP_PV> is set
4320 then a copy-on-write scalar drops its PV buffer (if any) and becomes
4321 SvPOK_off rather than making a copy. (Used where this scalar is about to be
4322 set to some other value.) In addition, the C<flags> parameter gets passed to
4323 C<sv_unref_flags()> when unrefing. C<sv_force_normal> calls this function
4324 with flags set to 0.
4325
4326 =cut
4327 */
4328
4329 void
4330 Perl_sv_force_normal_flags(pTHX_ register SV *const sv, const U32 flags)
4331 {
4332     dVAR;
4333
4334     PERL_ARGS_ASSERT_SV_FORCE_NORMAL_FLAGS;
4335
4336 #ifdef PERL_OLD_COPY_ON_WRITE
4337     if (SvREADONLY(sv)) {
4338         /* At this point I believe I should acquire a global SV mutex.  */
4339         if (SvFAKE(sv)) {
4340             const char * const pvx = SvPVX_const(sv);
4341             const STRLEN len = SvLEN(sv);
4342             const STRLEN cur = SvCUR(sv);
4343             /* next COW sv in the loop.  If len is 0 then this is a shared-hash
4344                key scalar, so we mustn't attempt to call SV_COW_NEXT_SV(), as
4345                we'll fail an assertion.  */
4346             SV * const next = len ? SV_COW_NEXT_SV(sv) : 0;
4347
4348             if (DEBUG_C_TEST) {
4349                 PerlIO_printf(Perl_debug_log,
4350                               "Copy on write: Force normal %ld\n",
4351                               (long) flags);
4352                 sv_dump(sv);
4353             }
4354             SvFAKE_off(sv);
4355             SvREADONLY_off(sv);
4356             /* This SV doesn't own the buffer, so need to Newx() a new one:  */
4357             SvPV_set(sv, NULL);
4358             SvLEN_set(sv, 0);
4359             if (flags & SV_COW_DROP_PV) {
4360                 /* OK, so we don't need to copy our buffer.  */
4361                 SvPOK_off(sv);
4362             } else {
4363                 SvGROW(sv, cur + 1);
4364                 Move(pvx,SvPVX(sv),cur,char);
4365                 SvCUR_set(sv, cur);
4366                 *SvEND(sv) = '\0';
4367             }
4368             if (len) {
4369                 sv_release_COW(sv, pvx, next);
4370             } else {
4371                 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
4372             }
4373             if (DEBUG_C_TEST) {
4374                 sv_dump(sv);
4375             }
4376         }
4377         else if (IN_PERL_RUNTIME)
4378             Perl_croak(aTHX_ PL_no_modify);
4379         /* At this point I believe that I can drop the global SV mutex.  */
4380     }
4381 #else
4382     if (SvREADONLY(sv)) {
4383         if (SvFAKE(sv)) {
4384             const char * const pvx = SvPVX_const(sv);
4385             const STRLEN len = SvCUR(sv);
4386             SvFAKE_off(sv);
4387             SvREADONLY_off(sv);
4388             SvPV_set(sv, NULL);
4389             SvLEN_set(sv, 0);
4390             SvGROW(sv, len + 1);
4391             Move(pvx,SvPVX(sv),len,char);
4392             *SvEND(sv) = '\0';
4393             unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
4394         }
4395         else if (IN_PERL_RUNTIME)
4396             Perl_croak(aTHX_ PL_no_modify);
4397     }
4398 #endif
4399     if (SvROK(sv))
4400         sv_unref_flags(sv, flags);
4401     else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
4402         sv_unglob(sv);
4403 }
4404
4405 /*
4406 =for apidoc sv_chop
4407
4408 Efficient removal of characters from the beginning of the string buffer.
4409 SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
4410 the string buffer.  The C<ptr> becomes the first character of the adjusted
4411 string. Uses the "OOK hack".
4412 Beware: after this function returns, C<ptr> and SvPVX_const(sv) may no longer
4413 refer to the same chunk of data.
4414
4415 =cut
4416 */
4417
4418 void
4419 Perl_sv_chop(pTHX_ register SV *const sv, register const char *const ptr)
4420 {
4421     STRLEN delta;
4422     STRLEN old_delta;
4423     U8 *p;
4424 #ifdef DEBUGGING
4425     const U8 *real_start;
4426 #endif
4427     STRLEN max_delta;
4428
4429     PERL_ARGS_ASSERT_SV_CHOP;
4430
4431     if (!ptr || !SvPOKp(sv))
4432         return;
4433     delta = ptr - SvPVX_const(sv);
4434     if (!delta) {
4435         /* Nothing to do.  */
4436         return;
4437     }
4438     /* SvPVX(sv) may move in SV_CHECK_THINKFIRST(sv), but after this line,
4439        nothing uses the value of ptr any more.  */
4440     max_delta = SvLEN(sv) ? SvLEN(sv) : SvCUR(sv);
4441     if (ptr <= SvPVX_const(sv))
4442         Perl_croak(aTHX_ "panic: sv_chop ptr=%p, start=%p, end=%p",
4443                    ptr, SvPVX_const(sv), SvPVX_const(sv) + max_delta);
4444     SV_CHECK_THINKFIRST(sv);
4445     if (delta > max_delta)
4446         Perl_croak(aTHX_ "panic: sv_chop ptr=%p (was %p), start=%p, end=%p",
4447                    SvPVX_const(sv) + delta, ptr, SvPVX_const(sv),
4448                    SvPVX_const(sv) + max_delta);
4449
4450     if (!SvOOK(sv)) {
4451         if (!SvLEN(sv)) { /* make copy of shared string */
4452             const char *pvx = SvPVX_const(sv);
4453             const STRLEN len = SvCUR(sv);
4454             SvGROW(sv, len + 1);
4455             Move(pvx,SvPVX(sv),len,char);
4456             *SvEND(sv) = '\0';
4457         }
4458         SvFLAGS(sv) |= SVf_OOK;
4459         old_delta = 0;
4460     } else {
4461         SvOOK_offset(sv, old_delta);
4462     }
4463     SvLEN_set(sv, SvLEN(sv) - delta);
4464     SvCUR_set(sv, SvCUR(sv) - delta);
4465     SvPV_set(sv, SvPVX(sv) + delta);
4466
4467     p = (U8 *)SvPVX_const(sv);
4468
4469     delta += old_delta;
4470
4471 #ifdef DEBUGGING
4472     real_start = p - delta;
4473 #endif
4474
4475     assert(delta);
4476     if (delta < 0x100) {
4477         *--p = (U8) delta;
4478     } else {
4479         *--p = 0;
4480         p -= sizeof(STRLEN);
4481         Copy((U8*)&delta, p, sizeof(STRLEN), U8);
4482     }
4483
4484 #ifdef DEBUGGING
4485     /* Fill the preceding buffer with sentinals to verify that no-one is
4486        using it.  */
4487     while (p > real_start) {
4488         --p;
4489         *p = (U8)PTR2UV(p);
4490     }
4491 #endif
4492 }
4493
4494 /*
4495 =for apidoc sv_catpvn
4496
4497 Concatenates the string onto the end of the string which is in the SV.  The
4498 C<len> indicates number of bytes to copy.  If the SV has the UTF-8
4499 status set, then the bytes appended should be valid UTF-8.
4500 Handles 'get' magic, but not 'set' magic.  See C<sv_catpvn_mg>.
4501
4502 =for apidoc sv_catpvn_flags
4503
4504 Concatenates the string onto the end of the string which is in the SV.  The
4505 C<len> indicates number of bytes to copy.  If the SV has the UTF-8
4506 status set, then the bytes appended should be valid UTF-8.
4507 If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
4508 appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
4509 in terms of this function.
4510
4511 =cut
4512 */
4513
4514 void
4515 Perl_sv_catpvn_flags(pTHX_ register SV *const dsv, register const char *sstr, register const STRLEN slen, const I32 flags)
4516 {
4517     dVAR;
4518     STRLEN dlen;
4519     const char * const dstr = SvPV_force_flags(dsv, dlen, flags);
4520
4521     PERL_ARGS_ASSERT_SV_CATPVN_FLAGS;
4522
4523     SvGROW(dsv, dlen + slen + 1);
4524     if (sstr == dstr)
4525         sstr = SvPVX_const(dsv);
4526     Move(sstr, SvPVX(dsv) + dlen, slen, char);
4527     SvCUR_set(dsv, SvCUR(dsv) + slen);
4528     *SvEND(dsv) = '\0';
4529     (void)SvPOK_only_UTF8(dsv);         /* validate pointer */
4530     SvTAINT(dsv);
4531     if (flags & SV_SMAGIC)
4532         SvSETMAGIC(dsv);
4533 }
4534
4535 /*
4536 =for apidoc sv_catsv
4537
4538 Concatenates the string from SV C<ssv> onto the end of the string in
4539 SV C<dsv>.  Modifies C<dsv> but not C<ssv>.  Handles 'get' magic, but
4540 not 'set' magic.  See C<sv_catsv_mg>.
4541
4542 =for apidoc sv_catsv_flags
4543
4544 Concatenates the string from SV C<ssv> onto the end of the string in
4545 SV C<dsv>.  Modifies C<dsv> but not C<ssv>.  If C<flags> has C<SV_GMAGIC>
4546 bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
4547 and C<sv_catsv_nomg> are implemented in terms of this function.
4548
4549 =cut */
4550
4551 void
4552 Perl_sv_catsv_flags(pTHX_ SV *const dsv, register SV *const ssv, const I32 flags)
4553 {
4554     dVAR;
4555  
4556     PERL_ARGS_ASSERT_SV_CATSV_FLAGS;
4557
4558    if (ssv) {
4559         STRLEN slen;
4560         const char *spv = SvPV_const(ssv, slen);
4561         if (spv) {
4562             /*  sutf8 and dutf8 were type bool, but under USE_ITHREADS,
4563                 gcc version 2.95.2 20000220 (Debian GNU/Linux) for
4564                 Linux xxx 2.2.17 on sparc64 with gcc -O2, we erroneously
4565                 get dutf8 = 0x20000000, (i.e.  SVf_UTF8) even though
4566                 dsv->sv_flags doesn't have that bit set.
4567                 Andy Dougherty  12 Oct 2001
4568             */
4569             const I32 sutf8 = DO_UTF8(ssv);
4570             I32 dutf8;
4571
4572             if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
4573                 mg_get(dsv);
4574             dutf8 = DO_UTF8(dsv);
4575
4576             if (dutf8 != sutf8) {
4577                 if (dutf8) {
4578                     /* Not modifying source SV, so taking a temporary copy. */
4579                     SV* const csv = newSVpvn_flags(spv, slen, SVs_TEMP);
4580
4581                     sv_utf8_upgrade(csv);
4582                     spv = SvPV_const(csv, slen);
4583                 }
4584                 else
4585                     sv_utf8_upgrade_nomg(dsv);
4586             }
4587             sv_catpvn_nomg(dsv, spv, slen);
4588         }
4589     }
4590     if (flags & SV_SMAGIC)
4591         SvSETMAGIC(dsv);
4592 }
4593
4594 /*
4595 =for apidoc sv_catpv
4596
4597 Concatenates the string onto the end of the string which is in the SV.
4598 If the SV has the UTF-8 status set, then the bytes appended should be
4599 valid UTF-8.  Handles 'get' magic, but not 'set' magic.  See C<sv_catpv_mg>.
4600
4601 =cut */
4602
4603 void
4604 Perl_sv_catpv(pTHX_ register SV *const sv, register const char *ptr)
4605 {
4606     dVAR;
4607     register STRLEN len;
4608     STRLEN tlen;
4609     char *junk;
4610
4611     PERL_ARGS_ASSERT_SV_CATPV;
4612
4613     if (!ptr)
4614         return;
4615     junk = SvPV_force(sv, tlen);
4616     len = strlen(ptr);
4617     SvGROW(sv, tlen + len + 1);
4618     if (ptr == junk)
4619         ptr = SvPVX_const(sv);
4620     Move(ptr,SvPVX(sv)+tlen,len+1,char);
4621     SvCUR_set(sv, SvCUR(sv) + len);
4622     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4623     SvTAINT(sv);
4624 }
4625
4626 /*
4627 =for apidoc sv_catpv_mg
4628
4629 Like C<sv_catpv>, but also handles 'set' magic.
4630
4631 =cut
4632 */
4633
4634 void
4635 Perl_sv_catpv_mg(pTHX_ register SV *const sv, register const char *const ptr)
4636 {
4637     PERL_ARGS_ASSERT_SV_CATPV_MG;
4638
4639     sv_catpv(sv,ptr);
4640     SvSETMAGIC(sv);
4641 }
4642
4643 /*
4644 =for apidoc newSV
4645
4646 Creates a new SV.  A non-zero C<len> parameter indicates the number of
4647 bytes of preallocated string space the SV should have.  An extra byte for a
4648 trailing NUL is also reserved.  (SvPOK is not set for the SV even if string
4649 space is allocated.)  The reference count for the new SV is set to 1.
4650
4651 In 5.9.3, newSV() replaces the older NEWSV() API, and drops the first
4652 parameter, I<x>, a debug aid which allowed callers to identify themselves.
4653 This aid has been superseded by a new build option, PERL_MEM_LOG (see
4654 L<perlhack/PERL_MEM_LOG>).  The older API is still there for use in XS
4655 modules supporting older perls.
4656
4657 =cut
4658 */
4659
4660 SV *
4661 Perl_newSV(pTHX_ const STRLEN len)
4662 {
4663     dVAR;
4664     register SV *sv;
4665
4666     new_SV(sv);
4667     if (len) {
4668         sv_upgrade(sv, SVt_PV);
4669         SvGROW(sv, len + 1);
4670     }
4671     return sv;
4672 }
4673 /*
4674 =for apidoc sv_magicext
4675
4676 Adds magic to an SV, upgrading it if necessary. Applies the
4677 supplied vtable and returns a pointer to the magic added.
4678
4679 Note that C<sv_magicext> will allow things that C<sv_magic> will not.
4680 In particular, you can add magic to SvREADONLY SVs, and add more than
4681 one instance of the same 'how'.
4682
4683 If C<namlen> is greater than zero then a C<savepvn> I<copy> of C<name> is
4684 stored, if C<namlen> is zero then C<name> is stored as-is and - as another
4685 special case - if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
4686 to contain an C<SV*> and is stored as-is with its REFCNT incremented.
4687
4688 (This is now used as a subroutine by C<sv_magic>.)
4689
4690 =cut
4691 */
4692 MAGIC * 
4693 Perl_sv_magicext(pTHX_ SV *const sv, SV *const obj, const int how, 
4694                 const MGVTBL *const vtable, const char *const name, const I32 namlen)
4695 {
4696     dVAR;
4697     MAGIC* mg;
4698
4699     PERL_ARGS_ASSERT_SV_MAGICEXT;
4700
4701     SvUPGRADE(sv, SVt_PVMG);
4702     Newxz(mg, 1, MAGIC);
4703     mg->mg_moremagic = SvMAGIC(sv);
4704     SvMAGIC_set(sv, mg);
4705
4706     /* Sometimes a magic contains a reference loop, where the sv and
4707        object refer to each other.  To prevent a reference loop that
4708        would prevent such objects being freed, we look for such loops
4709        and if we find one we avoid incrementing the object refcount.
4710
4711        Note we cannot do this to avoid self-tie loops as intervening RV must
4712        have its REFCNT incremented to keep it in existence.
4713
4714     */
4715     if (!obj || obj == sv ||
4716         how == PERL_MAGIC_arylen ||
4717         how == PERL_MAGIC_symtab ||
4718         (SvTYPE(obj) == SVt_PVGV &&
4719             (GvSV(obj) == sv || GvHV(obj) == (const HV *)sv
4720              || GvAV(obj) == (const AV *)sv || GvCV(obj) == (const CV *)sv
4721              || GvIOp(obj) == (const IO *)sv || GvFORM(obj) == (const CV *)sv)))
4722     {
4723         mg->mg_obj = obj;
4724     }
4725     else {
4726         mg->mg_obj = SvREFCNT_inc_simple(obj);
4727         mg->mg_flags |= MGf_REFCOUNTED;
4728     }
4729
4730     /* Normal self-ties simply pass a null object, and instead of
4731        using mg_obj directly, use the SvTIED_obj macro to produce a
4732        new RV as needed.  For glob "self-ties", we are tieing the PVIO
4733        with an RV obj pointing to the glob containing the PVIO.  In
4734        this case, to avoid a reference loop, we need to weaken the
4735        reference.
4736     */
4737
4738     if (how == PERL_MAGIC_tiedscalar && SvTYPE(sv) == SVt_PVIO &&
4739         obj && SvROK(obj) && GvIO(SvRV(obj)) == (const IO *)sv)
4740     {
4741       sv_rvweaken(obj);
4742     }
4743
4744     mg->mg_type = how;
4745     mg->mg_len = namlen;
4746     if (name) {
4747         if (namlen > 0)
4748             mg->mg_ptr = savepvn(name, namlen);
4749         else if (namlen == HEf_SVKEY) {
4750             /* Yes, this is casting away const. This is only for the case of
4751                HEf_SVKEY. I think we need to document this abberation of the
4752                constness of the API, rather than making name non-const, as
4753                that change propagating outwards a long way.  */
4754             mg->mg_ptr = (char*)SvREFCNT_inc_simple_NN((SV *)name);
4755         } else
4756             mg->mg_ptr = (char *) name;
4757     }
4758     mg->mg_virtual = (MGVTBL *) vtable;
4759
4760     mg_magical(sv);
4761     if (SvGMAGICAL(sv))
4762         SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
4763     return mg;
4764 }
4765
4766 /*
4767 =for apidoc sv_magic
4768
4769 Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
4770 then adds a new magic item of type C<how> to the head of the magic list.
4771
4772 See C<sv_magicext> (which C<sv_magic> now calls) for a description of the
4773 handling of the C<name> and C<namlen> arguments.
4774
4775 You need to use C<sv_magicext> to add magic to SvREADONLY SVs and also
4776 to add more than one instance of the same 'how'.
4777
4778 =cut
4779 */
4780
4781 void
4782 Perl_sv_magic(pTHX_ register SV *const sv, SV *const obj, const int how, 
4783              const char *const name, const I32 namlen)
4784 {
4785     dVAR;
4786     const MGVTBL *vtable;
4787     MAGIC* mg;
4788
4789     PERL_ARGS_ASSERT_SV_MAGIC;
4790
4791 #ifdef PERL_OLD_COPY_ON_WRITE
4792     if (SvIsCOW(sv))
4793         sv_force_normal_flags(sv, 0);
4794 #endif
4795     if (SvREADONLY(sv)) {
4796         if (
4797             /* its okay to attach magic to shared strings; the subsequent
4798              * upgrade to PVMG will unshare the string */
4799             !(SvFAKE(sv) && SvTYPE(sv) < SVt_PVMG)
4800
4801             && IN_PERL_RUNTIME
4802             && how != PERL_MAGIC_regex_global
4803             && how != PERL_MAGIC_bm
4804             && how != PERL_MAGIC_fm
4805             && how != PERL_MAGIC_sv
4806             && how != PERL_MAGIC_backref
4807            )
4808         {
4809             Perl_croak(aTHX_ PL_no_modify);
4810         }
4811     }
4812     if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
4813         if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
4814             /* sv_magic() refuses to add a magic of the same 'how' as an
4815                existing one
4816              */
4817             if (how == PERL_MAGIC_taint) {
4818                 mg->mg_len |= 1;
4819                 /* Any scalar which already had taint magic on which someone
4820                    (erroneously?) did SvIOK_on() or similar will now be
4821                    incorrectly sporting public "OK" flags.  */
4822                 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
4823             }
4824             return;
4825         }
4826     }
4827
4828     switch (how) {
4829     case PERL_MAGIC_sv:
4830         vtable = &PL_vtbl_sv;
4831         break;
4832     case PERL_MAGIC_overload:
4833         vtable = &PL_vtbl_amagic;
4834         break;
4835     case PERL_MAGIC_overload_elem:
4836         vtable = &PL_vtbl_amagicelem;
4837         break;
4838     case PERL_MAGIC_overload_table:
4839         vtable = &PL_vtbl_ovrld;
4840         break;
4841     case PERL_MAGIC_bm:
4842         vtable = &PL_vtbl_bm;
4843         break;
4844     case PERL_MAGIC_regdata:
4845         vtable = &PL_vtbl_regdata;
4846         break;
4847     case PERL_MAGIC_regdatum:
4848         vtable = &PL_vtbl_regdatum;
4849         break;
4850     case PERL_MAGIC_env:
4851         vtable = &PL_vtbl_env;
4852         break;
4853     case PERL_MAGIC_fm:
4854         vtable = &PL_vtbl_fm;
4855         break;
4856     case PERL_MAGIC_envelem:
4857         vtable = &PL_vtbl_envelem;
4858         break;
4859     case PERL_MAGIC_regex_global:
4860         vtable = &PL_vtbl_mglob;
4861         break;
4862     case PERL_MAGIC_isa:
4863         vtable = &PL_vtbl_isa;
4864         break;
4865     case PERL_MAGIC_isaelem:
4866         vtable = &PL_vtbl_isaelem;
4867         break;
4868     case PERL_MAGIC_nkeys:
4869         vtable = &PL_vtbl_nkeys;
4870         break;
4871     case PERL_MAGIC_dbfile:
4872         vtable = NULL;
4873         break;
4874     case PERL_MAGIC_dbline:
4875         vtable = &PL_vtbl_dbline;
4876         break;
4877 #ifdef USE_LOCALE_COLLATE
4878     case PERL_MAGIC_collxfrm:
4879         vtable = &PL_vtbl_collxfrm;
4880         break;
4881 #endif /* USE_LOCALE_COLLATE */
4882     case PERL_MAGIC_tied:
4883         vtable = &PL_vtbl_pack;
4884         break;
4885     case PERL_MAGIC_tiedelem:
4886     case PERL_MAGIC_tiedscalar:
4887         vtable = &PL_vtbl_packelem;
4888         break;
4889     case PERL_MAGIC_qr:
4890         vtable = &PL_vtbl_regexp;
4891         break;
4892     case PERL_MAGIC_hints:
4893         /* As this vtable is all NULL, we can reuse it.  */
4894     case PERL_MAGIC_sig:
4895         vtable = &PL_vtbl_sig;
4896         break;
4897     case PERL_MAGIC_sigelem:
4898         vtable = &PL_vtbl_sigelem;
4899         break;
4900     case PERL_MAGIC_taint:
4901         vtable = &PL_vtbl_taint;
4902         break;
4903     case PERL_MAGIC_uvar:
4904         vtable = &PL_vtbl_uvar;
4905         break;
4906     case PERL_MAGIC_vec:
4907         vtable = &PL_vtbl_vec;
4908         break;
4909     case PERL_MAGIC_arylen_p:
4910     case PERL_MAGIC_rhash:
4911     case PERL_MAGIC_symtab:
4912     case PERL_MAGIC_vstring:
4913         vtable = NULL;
4914         break;
4915     case PERL_MAGIC_utf8:
4916         vtable = &PL_vtbl_utf8;
4917         break;
4918     case PERL_MAGIC_substr:
4919         vtable = &PL_vtbl_substr;
4920         break;
4921     case PERL_MAGIC_defelem:
4922         vtable = &PL_vtbl_defelem;
4923         break;
4924     case PERL_MAGIC_arylen:
4925         vtable = &PL_vtbl_arylen;
4926         break;
4927     case PERL_MAGIC_pos:
4928         vtable = &PL_vtbl_pos;
4929         break;
4930     case PERL_MAGIC_backref:
4931         vtable = &PL_vtbl_backref;
4932         break;
4933     case PERL_MAGIC_hintselem:
4934         vtable = &PL_vtbl_hintselem;
4935         break;
4936     case PERL_MAGIC_ext:
4937         /* Reserved for use by extensions not perl internals.           */
4938         /* Useful for attaching extension internal data to perl vars.   */
4939         /* Note that multiple extensions may clash if magical scalars   */
4940         /* etc holding private data from one are passed to another.     */
4941         vtable = NULL;
4942         break;
4943     default:
4944         Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
4945     }
4946
4947     /* Rest of work is done else where */
4948     mg = sv_magicext(sv,obj,how,vtable,name,namlen);
4949
4950     switch (how) {
4951     case PERL_MAGIC_taint:
4952         mg->mg_len = 1;
4953         break;
4954     case PERL_MAGIC_ext:
4955     case PERL_MAGIC_dbfile:
4956         SvRMAGICAL_on(sv);
4957         break;
4958     }
4959 }
4960
4961 /*
4962 =for apidoc sv_unmagic
4963
4964 Removes all magic of type C<type> from an SV.
4965
4966 =cut
4967 */
4968
4969 int
4970 Perl_sv_unmagic(pTHX_ SV *const sv, const int type)
4971 {
4972     MAGIC* mg;
4973     MAGIC** mgp;
4974
4975     PERL_ARGS_ASSERT_SV_UNMAGIC;
4976
4977     if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
4978         return 0;
4979     mgp = &(((XPVMG*) SvANY(sv))->xmg_u.xmg_magic);
4980     for (mg = *mgp; mg; mg = *mgp) {
4981         if (mg->mg_type == type) {
4982             const MGVTBL* const vtbl = mg->mg_virtual;
4983             *mgp = mg->mg_moremagic;
4984             if (vtbl && vtbl->svt_free)
4985                 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
4986             if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
4987                 if (mg->mg_len > 0)
4988                     Safefree(mg->mg_ptr);
4989                 else if (mg->mg_len == HEf_SVKEY)
4990                     SvREFCNT_dec(MUTABLE_SV(mg->mg_ptr));
4991                 else if (mg->mg_type == PERL_MAGIC_utf8)
4992                     Safefree(mg->mg_ptr);
4993             }
4994             if (mg->mg_flags & MGf_REFCOUNTED)
4995                 SvREFCNT_dec(mg->mg_obj);
4996             Safefree(mg);
4997         }
4998         else
4999             mgp = &mg->mg_moremagic;
5000     }
5001     if (!SvMAGIC(sv)) {
5002         SvMAGICAL_off(sv);
5003         SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
5004         SvMAGIC_set(sv, NULL);
5005     }
5006
5007     return 0;
5008 }
5009
5010 /*
5011 =for apidoc sv_rvweaken
5012
5013 Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
5014 referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
5015 push a back-reference to this RV onto the array of backreferences
5016 associated with that magic. If the RV is magical, set magic will be
5017 called after the RV is cleared.
5018
5019 =cut
5020 */
5021
5022 SV *
5023 Perl_sv_rvweaken(pTHX_ SV *const sv)
5024 {
5025     SV *tsv;
5026
5027     PERL_ARGS_ASSERT_SV_RVWEAKEN;
5028
5029     if (!SvOK(sv))  /* let undefs pass */
5030         return sv;
5031     if (!SvROK(sv))
5032         Perl_croak(aTHX_ "Can't weaken a nonreference");
5033     else if (SvWEAKREF(sv)) {
5034         if (ckWARN(WARN_MISC))
5035             Perl_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
5036         return sv;
5037     }
5038     tsv = SvRV(sv);
5039     Perl_sv_add_backref(aTHX_ tsv, sv);
5040     SvWEAKREF_on(sv);
5041     SvREFCNT_dec(tsv);
5042     return sv;
5043 }
5044
5045 /* Give tsv backref magic if it hasn't already got it, then push a
5046  * back-reference to sv onto the array associated with the backref magic.
5047  */
5048
5049 /* A discussion about the backreferences array and its refcount:
5050  *
5051  * The AV holding the backreferences is pointed to either as the mg_obj of
5052  * PERL_MAGIC_backref, or in the specific case of a HV that has the hv_aux
5053  * structure, from the xhv_backreferences field. (A HV without hv_aux will
5054  * have the standard magic instead.) The array is created with a refcount
5055  * of 2. This means that if during global destruction the array gets
5056  * picked on first to have its refcount decremented by the random zapper,
5057  * it won't actually be freed, meaning it's still theere for when its
5058  * parent gets freed.
5059  * When the parent SV is freed, in the case of magic, the magic is freed,
5060  * Perl_magic_killbackrefs is called which decrements one refcount, then
5061  * mg_obj is freed which kills the second count.
5062  * In the vase of a HV being freed, one ref is removed by
5063  * Perl_hv_kill_backrefs, the other by Perl_sv_kill_backrefs, which it
5064  * calls.
5065  */
5066
5067 void
5068 Perl_sv_add_backref(pTHX_ SV *const tsv, SV *const sv)
5069 {
5070     dVAR;
5071     AV *av;
5072
5073     PERL_ARGS_ASSERT_SV_ADD_BACKREF;
5074
5075     if (SvTYPE(tsv) == SVt_PVHV) {
5076         AV **const avp = Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(tsv));
5077
5078         av = *avp;
5079         if (!av) {
5080             /* There is no AV in the offical place - try a fixup.  */
5081             MAGIC *const mg = mg_find(tsv, PERL_MAGIC_backref);
5082
5083             if (mg) {
5084                 /* Aha. They've got it stowed in magic.  Bring it back.  */
5085                 av = MUTABLE_AV(mg->mg_obj);
5086                 /* Stop mg_free decreasing the refernce count.  */
5087                 mg->mg_obj = NULL;
5088                 /* Stop mg_free even calling the destructor, given that
5089                    there's no AV to free up.  */
5090                 mg->mg_virtual = 0;
5091                 sv_unmagic(tsv, PERL_MAGIC_backref);
5092             } else {
5093                 av = newAV();
5094                 AvREAL_off(av);
5095                 SvREFCNT_inc_simple_void(av); /* see discussion above */
5096             }
5097             *avp = av;
5098         }
5099     } else {
5100         const MAGIC *const mg
5101             = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
5102         if (mg)
5103             av = MUTABLE_AV(mg->mg_obj);
5104         else {
5105             av = newAV();
5106             AvREAL_off(av);
5107             sv_magic(tsv, MUTABLE_SV(av), PERL_MAGIC_backref, NULL, 0);
5108             /* av now has a refcnt of 2; see discussion above */
5109         }
5110     }
5111     if (AvFILLp(av) >= AvMAX(av)) {
5112         av_extend(av, AvFILLp(av)+1);
5113     }
5114     AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */
5115 }
5116
5117 /* delete a back-reference to ourselves from the backref magic associated
5118  * with the SV we point to.
5119  */
5120
5121 STATIC void
5122 S_sv_del_backref(pTHX_ SV *const tsv, SV *const sv)
5123 {
5124     dVAR;
5125     AV *av = NULL;
5126     SV **svp;
5127     I32 i;
5128
5129     PERL_ARGS_ASSERT_SV_DEL_BACKREF;
5130
5131     if (SvTYPE(tsv) == SVt_PVHV && SvOOK(tsv)) {
5132         av = *Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(tsv));
5133         /* We mustn't attempt to "fix up" the hash here by moving the
5134            backreference array back to the hv_aux structure, as that is stored
5135            in the main HvARRAY(), and hfreentries assumes that no-one
5136            reallocates HvARRAY() while it is running.  */
5137     }
5138     if (!av) {
5139         const MAGIC *const mg
5140             = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
5141         if (mg)
5142             av = MUTABLE_AV(mg->mg_obj);
5143     }
5144
5145     if (!av)
5146         Perl_croak(aTHX_ "panic: del_backref");
5147
5148     assert(!SvIS_FREED(av));
5149
5150     svp = AvARRAY(av);
5151     /* We shouldn't be in here more than once, but for paranoia reasons lets
5152        not assume this.  */
5153     for (i = AvFILLp(av); i >= 0; i--) {
5154         if (svp[i] == sv) {
5155             const SSize_t fill = AvFILLp(av);
5156             if (i != fill) {
5157                 /* We weren't the last entry.
5158                    An unordered list has this property that you can take the
5159                    last element off the end to fill the hole, and it's still
5160                    an unordered list :-)
5161                 */
5162                 svp[i] = svp[fill];
5163             }
5164             svp[fill] = NULL;
5165             AvFILLp(av) = fill - 1;
5166         }
5167     }
5168 }
5169
5170 int
5171 Perl_sv_kill_backrefs(pTHX_ SV *const sv, AV *const av)
5172 {
5173     SV **svp = AvARRAY(av);
5174
5175     PERL_ARGS_ASSERT_SV_KILL_BACKREFS;
5176     PERL_UNUSED_ARG(sv);
5177
5178     assert(!svp || !SvIS_FREED(av));
5179     if (svp) {
5180         SV *const *const last = svp + AvFILLp(av);
5181
5182         while (svp <= last) {
5183             if (*svp) {
5184                 SV *const referrer = *svp;
5185                 if (SvWEAKREF(referrer)) {
5186                     /* XXX Should we check that it hasn't changed? */
5187                     SvRV_set(referrer, 0);
5188                     SvOK_off(referrer);
5189                     SvWEAKREF_off(referrer);
5190                     SvSETMAGIC(referrer);
5191                 } else if (SvTYPE(referrer) == SVt_PVGV ||
5192                            SvTYPE(referrer) == SVt_PVLV) {
5193                     /* You lookin' at me?  */
5194                     assert(GvSTASH(referrer));
5195                     assert(GvSTASH(referrer) == (const HV *)sv);
5196                     GvSTASH(referrer) = 0;
5197                 } else {
5198                     Perl_croak(aTHX_
5199                                "panic: magic_killbackrefs (flags=%"UVxf")",
5200                                (UV)SvFLAGS(referrer));
5201                 }
5202
5203                 *svp = NULL;
5204             }
5205             svp++;
5206         }
5207     }
5208     SvREFCNT_dec(av); /* remove extra count added by sv_add_backref() */
5209     return 0;
5210 }
5211
5212 /*
5213 =for apidoc sv_insert
5214
5215 Inserts a string at the specified offset/length within the SV. Similar to
5216 the Perl substr() function. Handles get magic.
5217
5218 =for apidoc sv_insert_flags
5219
5220 Same as C<sv_insert>, but the extra C<flags> are passed the C<SvPV_force_flags> that applies to C<bigstr>.
5221
5222 =cut
5223 */
5224
5225 void
5226 Perl_sv_insert_flags(pTHX_ SV *const bigstr, const STRLEN offset, const STRLEN len, const char *const little, const STRLEN littlelen, const U32 flags)
5227 {
5228     dVAR;
5229     register char *big;
5230     register char *mid;
5231     register char *midend;
5232     register char *bigend;
5233     register I32 i;
5234     STRLEN curlen;
5235
5236     PERL_ARGS_ASSERT_SV_INSERT_FLAGS;
5237
5238     if (!bigstr)
5239         Perl_croak(aTHX_ "Can't modify non-existent substring");
5240     SvPV_force_flags(bigstr, curlen, flags);
5241     (void)SvPOK_only_UTF8(bigstr);
5242     if (offset + len > curlen) {
5243         SvGROW(bigstr, offset+len+1);
5244         Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
5245         SvCUR_set(bigstr, offset+len);
5246     }
5247
5248     SvTAINT(bigstr);
5249     i = littlelen - len;
5250     if (i > 0) {                        /* string might grow */
5251         big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
5252         mid = big + offset + len;
5253         midend = bigend = big + SvCUR(bigstr);
5254         bigend += i;
5255         *bigend = '\0';
5256         while (midend > mid)            /* shove everything down */
5257             *--bigend = *--midend;
5258         Move(little,big+offset,littlelen,char);
5259         SvCUR_set(bigstr, SvCUR(bigstr) + i);
5260         SvSETMAGIC(bigstr);
5261         return;
5262     }
5263     else if (i == 0) {
5264         Move(little,SvPVX(bigstr)+offset,len,char);
5265         SvSETMAGIC(bigstr);
5266         return;
5267     }
5268
5269     big = SvPVX(bigstr);
5270     mid = big + offset;
5271     midend = mid + len;
5272     bigend = big + SvCUR(bigstr);
5273
5274     if (midend > bigend)
5275         Perl_croak(aTHX_ "panic: sv_insert");
5276
5277     if (mid - big > bigend - midend) {  /* faster to shorten from end */
5278         if (littlelen) {
5279             Move(little, mid, littlelen,char);
5280             mid += littlelen;
5281         }
5282         i = bigend - midend;
5283         if (i > 0) {
5284             Move(midend, mid, i,char);
5285             mid += i;
5286         }
5287         *mid = '\0';
5288         SvCUR_set(bigstr, mid - big);
5289     }
5290     else if ((i = mid - big)) { /* faster from front */
5291         midend -= littlelen;
5292         mid = midend;
5293         Move(big, midend - i, i, char);
5294         sv_chop(bigstr,midend-i);
5295         if (littlelen)
5296             Move(little, mid, littlelen,char);
5297     }
5298     else if (littlelen) {
5299         midend -= littlelen;
5300         sv_chop(bigstr,midend);
5301         Move(little,midend,littlelen,char);
5302     }
5303     else {
5304         sv_chop(bigstr,midend);
5305     }
5306     SvSETMAGIC(bigstr);
5307 }
5308
5309 /*
5310 =for apidoc sv_replace
5311
5312 Make the first argument a copy of the second, then delete the original.
5313 The target SV physically takes over ownership of the body of the source SV
5314 and inherits its flags; however, the target keeps any magic it owns,
5315 and any magic in the source is discarded.
5316 Note that this is a rather specialist SV copying operation; most of the
5317 time you'll want to use C<sv_setsv> or one of its many macro front-ends.
5318
5319 =cut
5320 */
5321
5322 void
5323 Perl_sv_replace(pTHX_ register SV *const sv, register SV *const nsv)
5324 {
5325     dVAR;
5326     const U32 refcnt = SvREFCNT(sv);
5327
5328     PERL_ARGS_ASSERT_SV_REPLACE;
5329
5330     SV_CHECK_THINKFIRST_COW_DROP(sv);
5331     if (SvREFCNT(nsv) != 1) {
5332         Perl_croak(aTHX_ "panic: reference miscount on nsv in sv_replace() (%"
5333                    UVuf " != 1)", (UV) SvREFCNT(nsv));
5334     }
5335     if (SvMAGICAL(sv)) {
5336         if (SvMAGICAL(nsv))
5337             mg_free(nsv);
5338         else
5339             sv_upgrade(nsv, SVt_PVMG);
5340         SvMAGIC_set(nsv, SvMAGIC(sv));
5341         SvFLAGS(nsv) |= SvMAGICAL(sv);
5342         SvMAGICAL_off(sv);
5343         SvMAGIC_set(sv, NULL);
5344     }
5345     SvREFCNT(sv) = 0;
5346     sv_clear(sv);
5347     assert(!SvREFCNT(sv));
5348 #ifdef DEBUG_LEAKING_SCALARS
5349     sv->sv_flags  = nsv->sv_flags;
5350     sv->sv_any    = nsv->sv_any;
5351     sv->sv_refcnt = nsv->sv_refcnt;
5352     sv->sv_u      = nsv->sv_u;
5353 #else
5354     StructCopy(nsv,sv,SV);
5355 #endif
5356     if(SvTYPE(sv) == SVt_IV) {
5357         SvANY(sv)
5358             = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
5359     }
5360         
5361
5362 #ifdef PERL_OLD_COPY_ON_WRITE
5363     if (SvIsCOW_normal(nsv)) {
5364         /* We need to follow the pointers around the loop to make the
5365            previous SV point to sv, rather than nsv.  */
5366         SV *next;
5367         SV *current = nsv;
5368         while ((next = SV_COW_NEXT_SV(current)) != nsv) {
5369             assert(next);
5370             current = next;
5371             assert(SvPVX_const(current) == SvPVX_const(nsv));
5372         }
5373         /* Make the SV before us point to the SV after us.  */
5374         if (DEBUG_C_TEST) {
5375             PerlIO_printf(Perl_debug_log, "previous is\n");
5376             sv_dump(current);
5377             PerlIO_printf(Perl_debug_log,
5378                           "move it from 0x%"UVxf" to 0x%"UVxf"\n",
5379                           (UV) SV_COW_NEXT_SV(current), (UV) sv);
5380         }
5381         SV_COW_NEXT_SV_SET(current, sv);
5382     }
5383 #endif
5384     SvREFCNT(sv) = refcnt;
5385     SvFLAGS(nsv) |= SVTYPEMASK;         /* Mark as freed */
5386     SvREFCNT(nsv) = 0;
5387     del_SV(nsv);
5388 }
5389
5390 /*
5391 =for apidoc sv_clear
5392
5393 Clear an SV: call any destructors, free up any memory used by the body,
5394 and free the body itself. The SV's head is I<not> freed, although
5395 its type is set to all 1's so that it won't inadvertently be assumed
5396 to be live during global destruction etc.
5397 This function should only be called when REFCNT is zero. Most of the time
5398 you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
5399 instead.
5400
5401 =cut
5402 */
5403
5404 void
5405 Perl_sv_clear(pTHX_ register SV *const sv)
5406 {
5407     dVAR;
5408     const U32 type = SvTYPE(sv);
5409     const struct body_details *const sv_type_details
5410         = bodies_by_type + type;
5411     HV *stash;
5412
5413     PERL_ARGS_ASSERT_SV_CLEAR;
5414     assert(SvREFCNT(sv) == 0);
5415     assert(SvTYPE(sv) != SVTYPEMASK);
5416
5417     if (type <= SVt_IV) {
5418         /* See the comment in sv.h about the collusion between this early
5419            return and the overloading of the NULL and IV slots in the size
5420            table.  */
5421         if (SvROK(sv)) {
5422             SV * const target = SvRV(sv);
5423             if (SvWEAKREF(sv))
5424                 sv_del_backref(target, sv);
5425             else
5426                 SvREFCNT_dec(target);
5427         }
5428         SvFLAGS(sv) &= SVf_BREAK;
5429         SvFLAGS(sv) |= SVTYPEMASK;
5430         return;
5431     }
5432
5433     if (SvOBJECT(sv)) {
5434         if (PL_defstash &&      /* Still have a symbol table? */
5435             SvDESTROYABLE(sv))
5436         {
5437             dSP;
5438             HV* stash;
5439             do {        
5440                 CV* destructor;
5441                 stash = SvSTASH(sv);
5442                 destructor = StashHANDLER(stash,DESTROY);
5443                 if (destructor) {
5444                     SV* const tmpref = newRV(sv);
5445                     SvREADONLY_on(tmpref);   /* DESTROY() could be naughty */
5446                     ENTER;
5447                     PUSHSTACKi(PERLSI_DESTROY);
5448                     EXTEND(SP, 2);
5449                     PUSHMARK(SP);
5450                     PUSHs(tmpref);
5451                     PUTBACK;
5452                     call_sv(MUTABLE_SV(destructor), G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
5453                 
5454                 
5455                     POPSTACK;
5456                     SPAGAIN;
5457                     LEAVE;
5458                     if(SvREFCNT(tmpref) < 2) {
5459                         /* tmpref is not kept alive! */
5460                         SvREFCNT(sv)--;
5461                         SvRV_set(tmpref, NULL);
5462                         SvROK_off(tmpref);
5463                     }
5464                     SvREFCNT_dec(tmpref);
5465                 }
5466             } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
5467
5468
5469             if (SvREFCNT(sv)) {
5470                 if (PL_in_clean_objs)
5471                     Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
5472                           HvNAME_get(stash));
5473                 /* DESTROY gave object new lease on life */
5474                 return;
5475             }
5476         }
5477
5478         if (SvOBJECT(sv)) {
5479             SvREFCNT_dec(SvSTASH(sv));  /* possibly of changed persuasion */
5480             SvOBJECT_off(sv);   /* Curse the object. */
5481             if (type != SVt_PVIO)
5482                 --PL_sv_objcount;       /* XXX Might want something more general */
5483         }
5484     }
5485     if (type >= SVt_PVMG) {
5486         if (type == SVt_PVMG && SvPAD_OUR(sv)) {
5487             SvREFCNT_dec(SvOURSTASH(sv));
5488         } else if (SvMAGIC(sv))
5489             mg_free(sv);
5490         if (type == SVt_PVMG && SvPAD_TYPED(sv))
5491             SvREFCNT_dec(SvSTASH(sv));
5492     }
5493     switch (type) {
5494         /* case SVt_BIND: */
5495     case SVt_PVIO:
5496         if (IoIFP(sv) &&
5497             IoIFP(sv) != PerlIO_stdin() &&
5498             IoIFP(sv) != PerlIO_stdout() &&
5499             IoIFP(sv) != PerlIO_stderr())
5500         {
5501             io_close(MUTABLE_IO(sv), FALSE);
5502         }
5503         if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
5504             PerlDir_close(IoDIRP(sv));
5505         IoDIRP(sv) = (DIR*)NULL;
5506         Safefree(IoTOP_NAME(sv));
5507         Safefree(IoFMT_NAME(sv));
5508         Safefree(IoBOTTOM_NAME(sv));
5509         goto freescalar;
5510     case SVt_REGEXP:
5511         /* FIXME for plugins */
5512         pregfree2((REGEXP*) sv);
5513         goto freescalar;
5514     case SVt_PVCV:
5515     case SVt_PVFM:
5516         cv_undef(MUTABLE_CV(sv));
5517         goto freescalar;
5518     case SVt_PVHV:
5519         if (PL_last_swash_hv == (const HV *)sv) {
5520             PL_last_swash_hv = NULL;
5521         }
5522         Perl_hv_kill_backrefs(aTHX_ MUTABLE_HV(sv));
5523         hv_undef(MUTABLE_HV(sv));
5524         break;
5525     case SVt_PVAV:
5526         if (PL_comppad == MUTABLE_AV(sv)) {
5527             PL_comppad = NULL;
5528             PL_curpad = NULL;
5529         }
5530         av_undef(MUTABLE_AV(sv));
5531         break;
5532     case SVt_PVLV:
5533         if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
5534             SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv)));
5535             HeNEXT((HE*)LvTARG(sv)) = PL_hv_fetch_ent_mh;
5536             PL_hv_fetch_ent_mh = (HE*)LvTARG(sv);
5537         }
5538         else if (LvTYPE(sv) != 't') /* unless tie: unrefcnted fake SV**  */
5539             SvREFCNT_dec(LvTARG(sv));
5540     case SVt_PVGV:
5541         if (isGV_with_GP(sv)) {
5542             if(GvCVu((const GV *)sv) && (stash = GvSTASH(MUTABLE_GV(sv)))
5543                && HvNAME_get(stash))
5544                 mro_method_changed_in(stash);
5545             gp_free(MUTABLE_GV(sv));
5546             if (GvNAME_HEK(sv))
5547                 unshare_hek(GvNAME_HEK(sv));
5548             /* If we're in a stash, we don't own a reference to it. However it does
5549                have a back reference to us, which needs to be cleared.  */
5550             if (!SvVALID(sv) && (stash = GvSTASH(sv)))
5551                     sv_del_backref(MUTABLE_SV(stash), sv);
5552         }
5553         /* FIXME. There are probably more unreferenced pointers to SVs in the
5554            interpreter struct that we should check and tidy in a similar
5555            fashion to this:  */
5556         if ((const GV *)sv == PL_last_in_gv)
5557             PL_last_in_gv = NULL;
5558     case SVt_PVMG:
5559     case SVt_PVNV:
5560     case SVt_PVIV:
5561     case SVt_PV:
5562       freescalar:
5563         /* Don't bother with SvOOK_off(sv); as we're only going to free it.  */
5564         if (SvOOK(sv)) {
5565             STRLEN offset;
5566             SvOOK_offset(sv, offset);
5567             SvPV_set(sv, SvPVX_mutable(sv) - offset);
5568             /* Don't even bother with turning off the OOK flag.  */
5569         }
5570         if (SvROK(sv)) {
5571             SV * const target = SvRV(sv);
5572             if (SvWEAKREF(sv))
5573                 sv_del_backref(target, sv);
5574             else
5575                 SvREFCNT_dec(target);
5576         }
5577 #ifdef PERL_OLD_COPY_ON_WRITE
5578         else if (SvPVX_const(sv)) {
5579             if (SvIsCOW(sv)) {
5580                 /* I believe I need to grab the global SV mutex here and
5581                    then recheck the COW status.  */
5582                 if (DEBUG_C_TEST) {
5583                     PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
5584                     sv_dump(sv);
5585                 }
5586                 if (SvLEN(sv)) {
5587                     sv_release_COW(sv, SvPVX_const(sv), SV_COW_NEXT_SV(sv));
5588                 } else {
5589                     unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
5590                 }
5591
5592                 /* And drop it here.  */
5593                 SvFAKE_off(sv);
5594             } else if (SvLEN(sv)) {
5595                 Safefree(SvPVX_const(sv));
5596             }
5597         }
5598 #else
5599         else if (SvPVX_const(sv) && SvLEN(sv))
5600             Safefree(SvPVX_mutable(sv));
5601         else if (SvPVX_const(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
5602             unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
5603             SvFAKE_off(sv);
5604         }
5605 #endif
5606         break;
5607     case SVt_NV:
5608         break;
5609     }
5610
5611     SvFLAGS(sv) &= SVf_BREAK;
5612     SvFLAGS(sv) |= SVTYPEMASK;
5613
5614     if (sv_type_details->arena) {
5615         del_body(((char *)SvANY(sv) + sv_type_details->offset),
5616                  &PL_body_roots[type]);
5617     }
5618     else if (sv_type_details->body_size) {
5619         my_safefree(SvANY(sv));
5620     }
5621 }
5622
5623 /*
5624 =for apidoc sv_newref
5625
5626 Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
5627 instead.
5628
5629 =cut
5630 */
5631
5632 SV *
5633 Perl_sv_newref(pTHX_ SV *const sv)
5634 {
5635     PERL_UNUSED_CONTEXT;
5636     if (sv)
5637         (SvREFCNT(sv))++;
5638     return sv;
5639 }
5640
5641 /*
5642 =for apidoc sv_free
5643
5644 Decrement an SV's reference count, and if it drops to zero, call
5645 C<sv_clear> to invoke destructors and free up any memory used by
5646 the body; finally, deallocate the SV's head itself.
5647 Normally called via a wrapper macro C<SvREFCNT_dec>.
5648
5649 =cut
5650 */
5651
5652 void
5653 Perl_sv_free(pTHX_ SV *const sv)
5654 {
5655     dVAR;
5656     if (!sv)
5657         return;
5658     if (SvREFCNT(sv) == 0) {
5659         if (SvFLAGS(sv) & SVf_BREAK)
5660             /* this SV's refcnt has been artificially decremented to
5661              * trigger cleanup */
5662             return;
5663         if (PL_in_clean_all) /* All is fair */
5664             return;
5665         if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5666             /* make sure SvREFCNT(sv)==0 happens very seldom */
5667             SvREFCNT(sv) = (~(U32)0)/2;
5668             return;
5669         }
5670         if (ckWARN_d(WARN_INTERNAL)) {
5671 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
5672             Perl_dump_sv_child(aTHX_ sv);
5673 #else
5674   #ifdef DEBUG_LEAKING_SCALARS
5675             sv_dump(sv);
5676   #endif
5677 #ifdef DEBUG_LEAKING_SCALARS_ABORT
5678             if (PL_warnhook == PERL_WARNHOOK_FATAL
5679                 || ckDEAD(packWARN(WARN_INTERNAL))) {
5680                 /* Don't let Perl_warner cause us to escape our fate:  */
5681                 abort();
5682             }
5683 #endif
5684             /* This may not return:  */
5685             Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
5686                         "Attempt to free unreferenced scalar: SV 0x%"UVxf
5687                         pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
5688 #endif
5689         }
5690 #ifdef DEBUG_LEAKING_SCALARS_ABORT
5691         abort();
5692 #endif
5693         return;
5694     }
5695     if (--(SvREFCNT(sv)) > 0)
5696         return;
5697     Perl_sv_free2(aTHX_ sv);
5698 }
5699
5700 void
5701 Perl_sv_free2(pTHX_ SV *const sv)
5702 {
5703     dVAR;
5704
5705     PERL_ARGS_ASSERT_SV_FREE2;
5706
5707 #ifdef DEBUGGING
5708     if (SvTEMP(sv)) {
5709         if (ckWARN_d(WARN_DEBUGGING))
5710             Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
5711                         "Attempt to free temp prematurely: SV 0x%"UVxf
5712                         pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
5713         return;
5714     }
5715 #endif
5716     if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5717         /* make sure SvREFCNT(sv)==0 happens very seldom */
5718         SvREFCNT(sv) = (~(U32)0)/2;
5719         return;
5720     }
5721     sv_clear(sv);
5722     if (! SvREFCNT(sv))
5723         del_SV(sv);
5724 }
5725
5726 /*
5727 =for apidoc sv_len
5728
5729 Returns the length of the string in the SV. Handles magic and type
5730 coercion.  See also C<SvCUR>, which gives raw access to the xpv_cur slot.
5731
5732 =cut
5733 */
5734
5735 STRLEN
5736 Perl_sv_len(pTHX_ register SV *const sv)
5737 {
5738     STRLEN len;
5739
5740     if (!sv)
5741         return 0;
5742
5743     if (SvGMAGICAL(sv))
5744         len = mg_length(sv);
5745     else
5746         (void)SvPV_const(sv, len);
5747     return len;
5748 }
5749
5750 /*
5751 =for apidoc sv_len_utf8
5752
5753 Returns the number of characters in the string in an SV, counting wide
5754 UTF-8 bytes as a single character. Handles magic and type coercion.
5755
5756 =cut
5757 */
5758
5759 /*
5760  * The length is cached in PERL_UTF8_magic, in the mg_len field.  Also the
5761  * mg_ptr is used, by sv_pos_u2b() and sv_pos_b2u() - see the comments below.
5762  * (Note that the mg_len is not the length of the mg_ptr field.
5763  * This allows the cache to store the character length of the string without
5764  * needing to malloc() extra storage to attach to the mg_ptr.)
5765  *
5766  */
5767
5768 STRLEN
5769 Perl_sv_len_utf8(pTHX_ register SV *const sv)
5770 {
5771     if (!sv)
5772         return 0;
5773
5774     if (SvGMAGICAL(sv))
5775         return mg_length(sv);
5776     else
5777     {
5778         STRLEN len;
5779         const U8 *s = (U8*)SvPV_const(sv, len);
5780
5781         if (PL_utf8cache) {
5782             STRLEN ulen;
5783             MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : NULL;
5784
5785             if (mg && mg->mg_len != -1) {
5786                 ulen = mg->mg_len;
5787                 if (PL_utf8cache < 0) {
5788                     const STRLEN real = Perl_utf8_length(aTHX_ s, s + len);
5789                     if (real != ulen) {
5790                         /* Need to turn the assertions off otherwise we may
5791                            recurse infinitely while printing error messages.
5792                         */
5793                         SAVEI8(PL_utf8cache);
5794                         PL_utf8cache = 0;
5795                         Perl_croak(aTHX_ "panic: sv_len_utf8 cache %"UVuf
5796                                    " real %"UVuf" for %"SVf,
5797                                    (UV) ulen, (UV) real, SVfARG(sv));
5798                     }
5799                 }
5800             }
5801             else {
5802                 ulen = Perl_utf8_length(aTHX_ s, s + len);
5803                 if (!SvREADONLY(sv)) {
5804                     if (!mg) {
5805                         mg = sv_magicext(sv, 0, PERL_MAGIC_utf8,
5806                                          &PL_vtbl_utf8, 0, 0);
5807                     }
5808                     assert(mg);
5809                     mg->mg_len = ulen;
5810                 }
5811             }
5812             return ulen;
5813         }
5814         return Perl_utf8_length(aTHX_ s, s + len);
5815     }
5816 }
5817
5818 /* Walk forwards to find the byte corresponding to the passed in UTF-8
5819    offset.  */
5820 static STRLEN
5821 S_sv_pos_u2b_forwards(const U8 *const start, const U8 *const send,
5822                       STRLEN uoffset)
5823 {
5824     const U8 *s = start;
5825
5826     PERL_ARGS_ASSERT_SV_POS_U2B_FORWARDS;
5827
5828     while (s < send && uoffset--)
5829         s += UTF8SKIP(s);
5830     if (s > send) {
5831         /* This is the existing behaviour. Possibly it should be a croak, as
5832            it's actually a bounds error  */
5833         s = send;
5834     }
5835     return s - start;
5836 }
5837
5838 /* Given the length of the string in both bytes and UTF-8 characters, decide
5839    whether to walk forwards or backwards to find the byte corresponding to
5840    the passed in UTF-8 offset.  */
5841 static STRLEN
5842 S_sv_pos_u2b_midway(const U8 *const start, const U8 *send,
5843                       const STRLEN uoffset, const STRLEN uend)
5844 {
5845     STRLEN backw = uend - uoffset;
5846
5847     PERL_ARGS_ASSERT_SV_POS_U2B_MIDWAY;
5848
5849     if (uoffset < 2 * backw) {
5850         /* The assumption is that going forwards is twice the speed of going
5851            forward (that's where the 2 * backw comes from).
5852            (The real figure of course depends on the UTF-8 data.)  */
5853         return sv_pos_u2b_forwards(start, send, uoffset);
5854     }
5855
5856     while (backw--) {
5857         send--;
5858         while (UTF8_IS_CONTINUATION(*send))
5859             send--;
5860     }
5861     return send - start;
5862 }
5863
5864 /* For the string representation of the given scalar, find the byte
5865    corresponding to the passed in UTF-8 offset.  uoffset0 and boffset0
5866    give another position in the string, *before* the sought offset, which
5867    (which is always true, as 0, 0 is a valid pair of positions), which should
5868    help reduce the amount of linear searching.
5869    If *mgp is non-NULL, it should point to the UTF-8 cache magic, which
5870    will be used to reduce the amount of linear searching. The cache will be
5871    created if necessary, and the found value offered to it for update.  */
5872 static STRLEN
5873 S_sv_pos_u2b_cached(pTHX_ SV *const sv, MAGIC **const mgp, const U8 *const start,
5874                     const U8 *const send, const STRLEN uoffset,
5875                     STRLEN uoffset0, STRLEN boffset0)
5876 {
5877     STRLEN boffset = 0; /* Actually always set, but let's keep gcc happy.  */
5878     bool found = FALSE;
5879
5880     PERL_ARGS_ASSERT_SV_POS_U2B_CACHED;
5881
5882     assert (uoffset >= uoffset0);
5883
5884     if (SvMAGICAL(sv) && !SvREADONLY(sv) && PL_utf8cache
5885         && (*mgp || (*mgp = mg_find(sv, PERL_MAGIC_utf8)))) {
5886         if ((*mgp)->mg_ptr) {
5887             STRLEN *cache = (STRLEN *) (*mgp)->mg_ptr;
5888             if (cache[0] == uoffset) {
5889                 /* An exact match. */
5890                 return cache[1];
5891             }
5892             if (cache[2] == uoffset) {
5893                 /* An exact match. */
5894                 return cache[3];
5895             }
5896
5897             if (cache[0] < uoffset) {
5898                 /* The cache already knows part of the way.   */
5899                 if (cache[0] > uoffset0) {
5900                     /* The cache knows more than the passed in pair  */
5901                     uoffset0 = cache[0];
5902                     boffset0 = cache[1];
5903                 }
5904                 if ((*mgp)->mg_len != -1) {
5905                     /* And we know the end too.  */
5906                     boffset = boffset0
5907                         + sv_pos_u2b_midway(start + boffset0, send,
5908                                               uoffset - uoffset0,
5909                                               (*mgp)->mg_len - uoffset0);
5910                 } else {
5911                     boffset = boffset0
5912                         + sv_pos_u2b_forwards(start + boffset0,
5913                                                 send, uoffset - uoffset0);
5914                 }
5915             }
5916             else if (cache[2] < uoffset) {
5917                 /* We're between the two cache entries.  */
5918                 if (cache[2] > uoffset0) {
5919                     /* and the cache knows more than the passed in pair  */
5920                     uoffset0 = cache[2];
5921                     boffset0 = cache[3];
5922                 }
5923
5924                 boffset = boffset0
5925                     + sv_pos_u2b_midway(start + boffset0,
5926                                           start + cache[1],
5927                                           uoffset - uoffset0,
5928                                           cache[0] - uoffset0);
5929             } else {
5930                 boffset = boffset0
5931                     + sv_pos_u2b_midway(start + boffset0,
5932                                           start + cache[3],
5933                                           uoffset - uoffset0,
5934                                           cache[2] - uoffset0);
5935             }
5936             found = TRUE;
5937         }
5938         else if ((*mgp)->mg_len != -1) {
5939             /* If we can take advantage of a passed in offset, do so.  */
5940             /* In fact, offset0 is either 0, or less than offset, so don't
5941                need to worry about the other possibility.  */
5942             boffset = boffset0
5943                 + sv_pos_u2b_midway(start + boffset0, send,
5944                                       uoffset - uoffset0,
5945                                       (*mgp)->mg_len - uoffset0);
5946             found = TRUE;
5947         }
5948     }
5949
5950     if (!found || PL_utf8cache < 0) {
5951         const STRLEN real_boffset
5952             = boffset0 + sv_pos_u2b_forwards(start + boffset0,
5953                                                send, uoffset - uoffset0);
5954
5955         if (found && PL_utf8cache < 0) {
5956             if (real_boffset != boffset) {
5957                 /* Need to turn the assertions off otherwise we may recurse
5958                    infinitely while printing error messages.  */
5959                 SAVEI8(PL_utf8cache);
5960                 PL_utf8cache = 0;
5961                 Perl_croak(aTHX_ "panic: sv_pos_u2b_cache cache %"UVuf
5962                            " real %"UVuf" for %"SVf,
5963                            (UV) boffset, (UV) real_boffset, SVfARG(sv));
5964             }
5965         }
5966         boffset = real_boffset;
5967     }
5968
5969     if (PL_utf8cache)
5970         utf8_mg_pos_cache_update(sv, mgp, boffset, uoffset, send - start);
5971     return boffset;
5972 }
5973
5974
5975 /*
5976 =for apidoc sv_pos_u2b
5977
5978 Converts the value pointed to by offsetp from a count of UTF-8 chars from
5979 the start of the string, to a count of the equivalent number of bytes; if
5980 lenp is non-zero, it does the same to lenp, but this time starting from
5981 the offset, rather than from the start of the string. Handles magic and
5982 type coercion.
5983
5984 =cut
5985 */
5986
5987 /*
5988  * sv_pos_u2b() uses, like sv_pos_b2u(), the mg_ptr of the potential
5989  * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
5990  * byte offsets.  See also the comments of S_utf8_mg_pos_cache_update().
5991  *
5992  */
5993
5994 void
5995 Perl_sv_pos_u2b(pTHX_ register SV *const sv, I32 *const offsetp, I32 *const lenp)
5996 {
5997     const U8 *start;
5998     STRLEN len;
5999
6000     PERL_ARGS_ASSERT_SV_POS_U2B;
6001
6002     if (!sv)
6003         return;
6004
6005     start = (U8*)SvPV_const(sv, len);
6006     if (len) {
6007         STRLEN uoffset = (STRLEN) *offsetp;
6008         const U8 * const send = start + len;
6009         MAGIC *mg = NULL;
6010         const STRLEN boffset = sv_pos_u2b_cached(sv, &mg, start, send,
6011                                              uoffset, 0, 0);
6012
6013         *offsetp = (I32) boffset;
6014
6015         if (lenp) {
6016             /* Convert the relative offset to absolute.  */
6017             const STRLEN uoffset2 = uoffset + (STRLEN) *lenp;
6018             const STRLEN boffset2
6019                 = sv_pos_u2b_cached(sv, &mg, start, send, uoffset2,
6020                                       uoffset, boffset) - boffset;
6021
6022             *lenp = boffset2;
6023         }
6024     }
6025     else {
6026          *offsetp = 0;
6027          if (lenp)
6028               *lenp = 0;
6029     }
6030
6031     return;
6032 }
6033
6034 /* Create and update the UTF8 magic offset cache, with the proffered utf8/
6035    byte length pairing. The (byte) length of the total SV is passed in too,
6036    as blen, because for some (more esoteric) SVs, the call to SvPV_const()
6037    may not have updated SvCUR, so we can't rely on reading it directly.
6038
6039    The proffered utf8/byte length pairing isn't used if the cache already has
6040    two pairs, and swapping either for the proffered pair would increase the
6041    RMS of the intervals between known byte offsets.
6042
6043    The cache itself consists of 4 STRLEN values
6044    0: larger UTF-8 offset
6045    1: corresponding byte offset
6046    2: smaller UTF-8 offset
6047    3: corresponding byte offset
6048
6049    Unused cache pairs have the value 0, 0.
6050    Keeping the cache "backwards" means that the invariant of
6051    cache[0] >= cache[2] is maintained even with empty slots, which means that
6052    the code that uses it doesn't need to worry if only 1 entry has actually
6053    been set to non-zero.  It also makes the "position beyond the end of the
6054    cache" logic much simpler, as the first slot is always the one to start
6055    from.   
6056 */
6057 static void
6058 S_utf8_mg_pos_cache_update(pTHX_ SV *const sv, MAGIC **const mgp, const STRLEN byte,
6059                            const STRLEN utf8, const STRLEN blen)
6060 {
6061     STRLEN *cache;
6062
6063     PERL_ARGS_ASSERT_UTF8_MG_POS_CACHE_UPDATE;
6064
6065     if (SvREADONLY(sv))
6066         return;
6067
6068     if (!*mgp) {
6069         *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, (MGVTBL*)&PL_vtbl_utf8, 0,
6070                            0);
6071         (*mgp)->mg_len = -1;
6072     }
6073     assert(*mgp);
6074
6075     if (!(cache = (STRLEN *)(*mgp)->mg_ptr)) {
6076         Newxz(cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
6077         (*mgp)->mg_ptr = (char *) cache;
6078     }
6079     assert(cache);
6080
6081     if (PL_utf8cache < 0) {
6082         const U8 *start = (const U8 *) SvPVX_const(sv);
6083         const STRLEN realutf8 = utf8_length(start, start + byte);
6084
6085         if (realutf8 != utf8) {
6086             /* Need to turn the assertions off otherwise we may recurse
6087                infinitely while printing error messages.  */
6088             SAVEI8(PL_utf8cache);
6089             PL_utf8cache = 0;
6090             Perl_croak(aTHX_ "panic: utf8_mg_pos_cache_update cache %"UVuf
6091                        " real %"UVuf" for %"SVf, (UV) utf8, (UV) realutf8, SVfARG(sv));
6092         }
6093     }
6094
6095     /* Cache is held with the later position first, to simplify the code
6096        that deals with unbounded ends.  */
6097        
6098     ASSERT_UTF8_CACHE(cache);
6099     if (cache[1] == 0) {
6100         /* Cache is totally empty  */
6101         cache[0] = utf8;
6102         cache[1] = byte;
6103     } else if (cache[3] == 0) {
6104         if (byte > cache[1]) {
6105             /* New one is larger, so goes first.  */
6106             cache[2] = cache[0];
6107             cache[3] = cache[1];
6108             cache[0] = utf8;
6109             cache[1] = byte;
6110         } else {
6111             cache[2] = utf8;
6112             cache[3] = byte;
6113         }
6114     } else {
6115 #define THREEWAY_SQUARE(a,b,c,d) \
6116             ((float)((d) - (c))) * ((float)((d) - (c))) \
6117             + ((float)((c) - (b))) * ((float)((c) - (b))) \
6118                + ((float)((b) - (a))) * ((float)((b) - (a)))
6119
6120         /* Cache has 2 slots in use, and we know three potential pairs.
6121            Keep the two that give the lowest RMS distance. Do the
6122            calcualation in bytes simply because we always know the byte
6123            length.  squareroot has the same ordering as the positive value,
6124            so don't bother with the actual square root.  */
6125         const float existing = THREEWAY_SQUARE(0, cache[3], cache[1], blen);
6126         if (byte > cache[1]) {
6127             /* New position is after the existing pair of pairs.  */
6128             const float keep_earlier
6129                 = THREEWAY_SQUARE(0, cache[3], byte, blen);
6130             const float keep_later
6131                 = THREEWAY_SQUARE(0, cache[1], byte, blen);
6132
6133             if (keep_later < keep_earlier) {
6134                 if (keep_later < existing) {
6135                     cache[2] = cache[0];
6136                     cache[3] = cache[1];
6137                     cache[0] = utf8;
6138                     cache[1] = byte;
6139                 }
6140             }
6141             else {
6142                 if (keep_earlier < existing) {
6143                     cache[0] = utf8;
6144                     cache[1] = byte;
6145                 }
6146             }
6147         }
6148         else if (byte > cache[3]) {
6149             /* New position is between the existing pair of pairs.  */
6150             const float keep_earlier
6151                 = THREEWAY_SQUARE(0, cache[3], byte, blen);
6152             const float keep_later
6153                 = THREEWAY_SQUARE(0, byte, cache[1], blen);
6154
6155             if (keep_later < keep_earlier) {
6156                 if (keep_later < existing) {
6157                     cache[2] = utf8;
6158                     cache[3] = byte;
6159                 }
6160             }
6161             else {
6162                 if (keep_earlier < existing) {
6163                     cache[0] = utf8;
6164                     cache[1] = byte;
6165                 }
6166             }
6167         }
6168         else {
6169             /* New position is before the existing pair of pairs.  */
6170             const float keep_earlier
6171                 = THREEWAY_SQUARE(0, byte, cache[3], blen);
6172             const float keep_later
6173                 = THREEWAY_SQUARE(0, byte, cache[1], blen);
6174
6175             if (keep_later < keep_earlier) {
6176                 if (keep_later < existing) {
6177                     cache[2] = utf8;
6178                     cache[3] = byte;
6179                 }
6180             }
6181             else {
6182                 if (keep_earlier < existing) {
6183                     cache[0] = cache[2];
6184                     cache[1] = cache[3];
6185                     cache[2] = utf8;
6186                     cache[3] = byte;
6187                 }
6188             }
6189         }
6190     }
6191     ASSERT_UTF8_CACHE(cache);
6192 }
6193
6194 /* We already know all of the way, now we may be able to walk back.  The same
6195    assumption is made as in S_sv_pos_u2b_midway(), namely that walking
6196    backward is half the speed of walking forward. */
6197 static STRLEN
6198 S_sv_pos_b2u_midway(pTHX_ const U8 *const s, const U8 *const target,
6199                     const U8 *end, STRLEN endu)
6200 {
6201     const STRLEN forw = target - s;
6202     STRLEN backw = end - target;
6203
6204     PERL_ARGS_ASSERT_SV_POS_B2U_MIDWAY;
6205
6206     if (forw < 2 * backw) {
6207         return utf8_length(s, target);
6208     }
6209
6210     while (end > target) {
6211         end--;
6212         while (UTF8_IS_CONTINUATION(*end)) {
6213             end--;
6214         }
6215         endu--;
6216     }
6217     return endu;
6218 }
6219
6220 /*
6221 =for apidoc sv_pos_b2u
6222
6223 Converts the value pointed to by offsetp from a count of bytes from the
6224 start of the string, to a count of the equivalent number of UTF-8 chars.
6225 Handles magic and type coercion.
6226
6227 =cut
6228 */
6229
6230 /*
6231  * sv_pos_b2u() uses, like sv_pos_u2b(), the mg_ptr of the potential
6232  * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
6233  * byte offsets.
6234  *
6235  */
6236 void
6237 Perl_sv_pos_b2u(pTHX_ register SV *const sv, I32 *const offsetp)
6238 {
6239     const U8* s;
6240     const STRLEN byte = *offsetp;
6241     STRLEN len = 0; /* Actually always set, but let's keep gcc happy.  */
6242     STRLEN blen;
6243     MAGIC* mg = NULL;
6244     const U8* send;
6245     bool found = FALSE;
6246
6247     PERL_ARGS_ASSERT_SV_POS_B2U;
6248
6249     if (!sv)
6250         return;
6251
6252     s = (const U8*)SvPV_const(sv, blen);
6253
6254     if (blen < byte)
6255         Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
6256
6257     send = s + byte;
6258
6259     if (SvMAGICAL(sv) && !SvREADONLY(sv) && PL_utf8cache
6260         && (mg = mg_find(sv, PERL_MAGIC_utf8))) {
6261         if (mg->mg_ptr) {
6262             STRLEN * const cache = (STRLEN *) mg->mg_ptr;
6263             if (cache[1] == byte) {
6264                 /* An exact match. */
6265                 *offsetp = cache[0];
6266                 return;
6267             }
6268             if (cache[3] == byte) {
6269                 /* An exact match. */
6270                 *offsetp = cache[2];
6271                 return;
6272             }
6273
6274             if (cache[1] < byte) {
6275                 /* We already know part of the way. */
6276                 if (mg->mg_len != -1) {
6277                     /* Actually, we know the end too.  */
6278                     len = cache[0]
6279                         + S_sv_pos_b2u_midway(aTHX_ s + cache[1], send,
6280                                               s + blen, mg->mg_len - cache[0]);
6281                 } else {
6282                     len = cache[0] + utf8_length(s + cache[1], send);
6283                 }
6284             }
6285             else if (cache[3] < byte) {
6286                 /* We're between the two cached pairs, so we do the calculation
6287                    offset by the byte/utf-8 positions for the earlier pair,
6288                    then add the utf-8 characters from the string start to
6289                    there.  */
6290                 len = S_sv_pos_b2u_midway(aTHX_ s + cache[3], send,
6291                                           s + cache[1], cache[0] - cache[2])
6292                     + cache[2];
6293
6294             }
6295             else { /* cache[3] > byte */
6296                 len = S_sv_pos_b2u_midway(aTHX_ s, send, s + cache[3],
6297                                           cache[2]);
6298
6299             }
6300             ASSERT_UTF8_CACHE(cache);
6301             found = TRUE;
6302         } else if (mg->mg_len != -1) {
6303             len = S_sv_pos_b2u_midway(aTHX_ s, send, s + blen, mg->mg_len);
6304             found = TRUE;
6305         }
6306     }
6307     if (!found || PL_utf8cache < 0) {
6308         const STRLEN real_len = utf8_length(s, send);
6309
6310         if (found && PL_utf8cache < 0) {
6311             if (len != real_len) {
6312                 /* Need to turn the assertions off otherwise we may recurse
6313                    infinitely while printing error messages.  */
6314                 SAVEI8(PL_utf8cache);
6315                 PL_utf8cache = 0;
6316                 Perl_croak(aTHX_ "panic: sv_pos_b2u cache %"UVuf
6317                            " real %"UVuf" for %"SVf,
6318                            (UV) len, (UV) real_len, SVfARG(sv));
6319             }
6320         }
6321         len = real_len;
6322     }
6323     *offsetp = len;
6324
6325     if (PL_utf8cache)
6326         utf8_mg_pos_cache_update(sv, &mg, byte, len, blen);
6327 }
6328
6329 /*
6330 =for apidoc sv_eq
6331
6332 Returns a boolean indicating whether the strings in the two SVs are
6333 identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6334 coerce its args to strings if necessary.
6335
6336 =cut
6337 */
6338
6339 I32
6340 Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
6341 {
6342     dVAR;
6343     const char *pv1;
6344     STRLEN cur1;
6345     const char *pv2;
6346     STRLEN cur2;
6347     I32  eq     = 0;
6348     char *tpv   = NULL;
6349     SV* svrecode = NULL;
6350
6351     if (!sv1) {
6352         pv1 = "";
6353         cur1 = 0;
6354     }
6355     else {
6356         /* if pv1 and pv2 are the same, second SvPV_const call may
6357          * invalidate pv1, so we may need to make a copy */
6358         if (sv1 == sv2 && (SvTHINKFIRST(sv1) || SvGMAGICAL(sv1))) {
6359             pv1 = SvPV_const(sv1, cur1);
6360             sv1 = newSVpvn_flags(pv1, cur1, SVs_TEMP | SvUTF8(sv2));
6361         }
6362         pv1 = SvPV_const(sv1, cur1);
6363     }
6364
6365     if (!sv2){
6366         pv2 = "";
6367         cur2 = 0;
6368     }
6369     else
6370         pv2 = SvPV_const(sv2, cur2);
6371
6372     if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
6373         /* Differing utf8ness.
6374          * Do not UTF8size the comparands as a side-effect. */
6375          if (PL_encoding) {
6376               if (SvUTF8(sv1)) {
6377                    svrecode = newSVpvn(pv2, cur2);
6378                    sv_recode_to_utf8(svrecode, PL_encoding);
6379                    pv2 = SvPV_const(svrecode, cur2);
6380               }
6381               else {
6382                    svrecode = newSVpvn(pv1, cur1);
6383                    sv_recode_to_utf8(svrecode, PL_encoding);
6384                    pv1 = SvPV_const(svrecode, cur1);
6385               }
6386               /* Now both are in UTF-8. */
6387               if (cur1 != cur2) {
6388                    SvREFCNT_dec(svrecode);
6389                    return FALSE;
6390               }
6391          }
6392          else {
6393               bool is_utf8 = TRUE;
6394
6395               if (SvUTF8(sv1)) {
6396                    /* sv1 is the UTF-8 one,
6397                     * if is equal it must be downgrade-able */
6398                    char * const pv = (char*)bytes_from_utf8((const U8*)pv1,
6399                                                      &cur1, &is_utf8);
6400                    if (pv != pv1)
6401                         pv1 = tpv = pv;
6402               }
6403               else {
6404                    /* sv2 is the UTF-8 one,
6405                     * if is equal it must be downgrade-able */
6406                    char * const pv = (char *)bytes_from_utf8((const U8*)pv2,
6407                                                       &cur2, &is_utf8);
6408                    if (pv != pv2)
6409                         pv2 = tpv = pv;
6410               }
6411               if (is_utf8) {
6412                    /* Downgrade not possible - cannot be eq */
6413                    assert (tpv == 0);
6414                    return FALSE;
6415               }
6416          }
6417     }
6418
6419     if (cur1 == cur2)
6420         eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
6421         
6422     SvREFCNT_dec(svrecode);
6423     if (tpv)
6424         Safefree(tpv);
6425
6426     return eq;
6427 }
6428
6429 /*
6430 =for apidoc sv_cmp
6431
6432 Compares the strings in two SVs.  Returns -1, 0, or 1 indicating whether the
6433 string in C<sv1> is less than, equal to, or greater than the string in
6434 C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6435 coerce its args to strings if necessary.  See also C<sv_cmp_locale>.
6436
6437 =cut
6438 */
6439
6440 I32
6441 Perl_sv_cmp(pTHX_ register SV *const sv1, register SV *const sv2)
6442 {
6443     dVAR;
6444     STRLEN cur1, cur2;
6445     const char *pv1, *pv2;
6446     char *tpv = NULL;
6447     I32  cmp;
6448     SV *svrecode = NULL;
6449
6450     if (!sv1) {
6451         pv1 = "";
6452         cur1 = 0;
6453     }
6454     else
6455         pv1 = SvPV_const(sv1, cur1);
6456
6457     if (!sv2) {
6458         pv2 = "";
6459         cur2 = 0;
6460     }
6461     else
6462         pv2 = SvPV_const(sv2, cur2);
6463
6464     if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
6465         /* Differing utf8ness.
6466          * Do not UTF8size the comparands as a side-effect. */
6467         if (SvUTF8(sv1)) {
6468             if (PL_encoding) {
6469                  svrecode = newSVpvn(pv2, cur2);
6470                  sv_recode_to_utf8(svrecode, PL_encoding);
6471                  pv2 = SvPV_const(svrecode, cur2);
6472             }
6473             else {
6474                  pv2 = tpv = (char*)bytes_to_utf8((const U8*)pv2, &cur2);
6475             }
6476         }
6477         else {
6478             if (PL_encoding) {
6479                  svrecode = newSVpvn(pv1, cur1);
6480                  sv_recode_to_utf8(svrecode, PL_encoding);
6481                  pv1 = SvPV_const(svrecode, cur1);
6482             }
6483             else {
6484                  pv1 = tpv = (char*)bytes_to_utf8((const U8*)pv1, &cur1);
6485             }
6486         }
6487     }
6488
6489     if (!cur1) {
6490         cmp = cur2 ? -1 : 0;
6491     } else if (!cur2) {
6492         cmp = 1;
6493     } else {
6494         const I32 retval = memcmp((const void*)pv1, (const void*)pv2, cur1 < cur2 ? cur1 : cur2);
6495
6496         if (retval) {
6497             cmp = retval < 0 ? -1 : 1;
6498         } else if (cur1 == cur2) {
6499             cmp = 0;
6500         } else {
6501             cmp = cur1 < cur2 ? -1 : 1;
6502         }
6503     }
6504
6505     SvREFCNT_dec(svrecode);
6506     if (tpv)
6507         Safefree(tpv);
6508
6509     return cmp;
6510 }
6511
6512 /*
6513 =for apidoc sv_cmp_locale
6514
6515 Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
6516 'use bytes' aware, handles get magic, and will coerce its args to strings
6517 if necessary.  See also C<sv_cmp>.
6518
6519 =cut
6520 */
6521
6522 I32
6523 Perl_sv_cmp_locale(pTHX_ register SV *const sv1, register SV *const sv2)
6524 {
6525     dVAR;
6526 #ifdef USE_LOCALE_COLLATE
6527
6528     char *pv1, *pv2;
6529     STRLEN len1, len2;
6530     I32 retval;
6531
6532     if (PL_collation_standard)
6533         goto raw_compare;
6534
6535     len1 = 0;
6536     pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
6537     len2 = 0;
6538     pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
6539
6540     if (!pv1 || !len1) {
6541         if (pv2 && len2)
6542             return -1;
6543         else
6544             goto raw_compare;
6545     }
6546     else {
6547         if (!pv2 || !len2)
6548             return 1;
6549     }
6550
6551     retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
6552
6553     if (retval)
6554         return retval < 0 ? -1 : 1;
6555
6556     /*
6557      * When the result of collation is equality, that doesn't mean
6558      * that there are no differences -- some locales exclude some
6559      * characters from consideration.  So to avoid false equalities,
6560      * we use the raw string as a tiebreaker.
6561      */
6562
6563   raw_compare:
6564     /*FALLTHROUGH*/
6565
6566 #endif /* USE_LOCALE_COLLATE */
6567
6568     return sv_cmp(sv1, sv2);
6569 }
6570
6571
6572 #ifdef USE_LOCALE_COLLATE
6573
6574 /*
6575 =for apidoc sv_collxfrm
6576
6577 Add Collate Transform magic to an SV if it doesn't already have it.
6578
6579 Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
6580 scalar data of the variable, but transformed to such a format that a normal
6581 memory comparison can be used to compare the data according to the locale
6582 settings.
6583
6584 =cut
6585 */
6586
6587 char *
6588 Perl_sv_collxfrm(pTHX_ SV *const sv, STRLEN *const nxp)
6589 {
6590     dVAR;
6591     MAGIC *mg;
6592
6593     PERL_ARGS_ASSERT_SV_COLLXFRM;
6594
6595     mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
6596     if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
6597         const char *s;
6598         char *xf;
6599         STRLEN len, xlen;
6600
6601         if (mg)
6602             Safefree(mg->mg_ptr);
6603         s = SvPV_const(sv, len);
6604         if ((xf = mem_collxfrm(s, len, &xlen))) {
6605             if (! mg) {
6606 #ifdef PERL_OLD_COPY_ON_WRITE
6607                 if (SvIsCOW(sv))
6608                     sv_force_normal_flags(sv, 0);
6609 #endif
6610                 mg = sv_magicext(sv, 0, PERL_MAGIC_collxfrm, &PL_vtbl_collxfrm,
6611                                  0, 0);
6612                 assert(mg);
6613             }
6614             mg->mg_ptr = xf;
6615             mg->mg_len = xlen;
6616         }
6617         else {
6618             if (mg) {
6619                 mg->mg_ptr = NULL;
6620                 mg->mg_len = -1;
6621             }
6622         }
6623     }
6624     if (mg && mg->mg_ptr) {
6625         *nxp = mg->mg_len;
6626         return mg->mg_ptr + sizeof(PL_collation_ix);
6627     }
6628     else {
6629         *nxp = 0;
6630         return NULL;
6631     }
6632 }
6633
6634 #endif /* USE_LOCALE_COLLATE */
6635
6636 /*
6637 =for apidoc sv_gets
6638
6639 Get a line from the filehandle and store it into the SV, optionally
6640 appending to the currently-stored string.
6641
6642 =cut
6643 */
6644
6645 char *
6646 Perl_sv_gets(pTHX_ register SV *const sv, register PerlIO *const fp, I32 append)
6647 {
6648     dVAR;
6649     const char *rsptr;
6650     STRLEN rslen;
6651     register STDCHAR rslast;
6652     register STDCHAR *bp;
6653     register I32 cnt;
6654     I32 i = 0;
6655     I32 rspara = 0;
6656
6657     PERL_ARGS_ASSERT_SV_GETS;
6658
6659     if (SvTHINKFIRST(sv))
6660         sv_force_normal_flags(sv, append ? 0 : SV_COW_DROP_PV);
6661     /* XXX. If you make this PVIV, then copy on write can copy scalars read
6662        from <>.
6663        However, perlbench says it's slower, because the existing swipe code
6664        is faster than copy on write.
6665        Swings and roundabouts.  */
6666     SvUPGRADE(sv, SVt_PV);
6667
6668     SvSCREAM_off(sv);
6669
6670     if (append) {
6671         if (PerlIO_isutf8(fp)) {
6672             if (!SvUTF8(sv)) {
6673                 sv_utf8_upgrade_nomg(sv);
6674                 sv_pos_u2b(sv,&append,0);
6675             }
6676         } else if (SvUTF8(sv)) {
6677             SV * const tsv = newSV(0);
6678             sv_gets(tsv, fp, 0);
6679             sv_utf8_upgrade_nomg(tsv);
6680             SvCUR_set(sv,append);
6681             sv_catsv(sv,tsv);
6682             sv_free(tsv);
6683             goto return_string_or_null;
6684         }
6685     }
6686
6687     SvPOK_only(sv);
6688     if (PerlIO_isutf8(fp))
6689         SvUTF8_on(sv);
6690
6691     if (IN_PERL_COMPILETIME) {
6692         /* we always read code in line mode */
6693         rsptr = "\n";
6694         rslen = 1;
6695     }
6696     else if (RsSNARF(PL_rs)) {
6697         /* If it is a regular disk file use size from stat() as estimate
6698            of amount we are going to read -- may result in mallocing
6699            more memory than we really need if the layers below reduce
6700            the size we read (e.g. CRLF or a gzip layer).
6701          */
6702         Stat_t st;
6703         if (!PerlLIO_fstat(PerlIO_fileno(fp), &st) && S_ISREG(st.st_mode))  {
6704             const Off_t offset = PerlIO_tell(fp);
6705             if (offset != (Off_t) -1 && st.st_size + append > offset) {
6706                 (void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 1));
6707             }
6708         }
6709         rsptr = NULL;
6710         rslen = 0;
6711     }
6712     else if (RsRECORD(PL_rs)) {
6713       I32 bytesread;
6714       char *buffer;
6715       U32 recsize;
6716 #ifdef VMS
6717       int fd;
6718 #endif
6719
6720       /* Grab the size of the record we're getting */
6721       recsize = SvUV(SvRV(PL_rs)); /* RsRECORD() guarantees > 0. */
6722       buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append;
6723       /* Go yank in */
6724 #ifdef VMS
6725       /* VMS wants read instead of fread, because fread doesn't respect */
6726       /* RMS record boundaries. This is not necessarily a good thing to be */
6727       /* doing, but we've got no other real choice - except avoid stdio
6728          as implementation - perhaps write a :vms layer ?
6729        */
6730       fd = PerlIO_fileno(fp);
6731       if (fd == -1) { /* in-memory file from PerlIO::Scalar */
6732           bytesread = PerlIO_read(fp, buffer, recsize);
6733       }
6734       else {
6735           bytesread = PerlLIO_read(fd, buffer, recsize);
6736       }
6737 #else
6738       bytesread = PerlIO_read(fp, buffer, recsize);
6739 #endif
6740       if (bytesread < 0)
6741           bytesread = 0;
6742       SvCUR_set(sv, bytesread + append);
6743       buffer[bytesread] = '\0';
6744       goto return_string_or_null;
6745     }
6746     else if (RsPARA(PL_rs)) {
6747         rsptr = "\n\n";
6748         rslen = 2;
6749         rspara = 1;
6750     }
6751     else {
6752         /* Get $/ i.e. PL_rs into same encoding as stream wants */
6753         if (PerlIO_isutf8(fp)) {
6754             rsptr = SvPVutf8(PL_rs, rslen);
6755         }
6756         else {
6757             if (SvUTF8(PL_rs)) {
6758                 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
6759                     Perl_croak(aTHX_ "Wide character in $/");
6760                 }
6761             }
6762             rsptr = SvPV_const(PL_rs, rslen);
6763         }
6764     }
6765
6766     rslast = rslen ? rsptr[rslen - 1] : '\0';
6767
6768     if (rspara) {               /* have to do this both before and after */
6769         do {                    /* to make sure file boundaries work right */
6770             if (PerlIO_eof(fp))
6771                 return 0;
6772             i = PerlIO_getc(fp);
6773             if (i != '\n') {
6774                 if (i == -1)
6775                     return 0;
6776                 PerlIO_ungetc(fp,i);
6777                 break;
6778             }
6779         } while (i != EOF);
6780     }
6781
6782     /* See if we know enough about I/O mechanism to cheat it ! */
6783
6784     /* This used to be #ifdef test - it is made run-time test for ease
6785        of abstracting out stdio interface. One call should be cheap
6786        enough here - and may even be a macro allowing compile
6787        time optimization.
6788      */
6789
6790     if (PerlIO_fast_gets(fp)) {
6791
6792     /*
6793      * We're going to steal some values from the stdio struct
6794      * and put EVERYTHING in the innermost loop into registers.
6795      */
6796     register STDCHAR *ptr;
6797     STRLEN bpx;
6798     I32 shortbuffered;
6799
6800 #if defined(VMS) && defined(PERLIO_IS_STDIO)
6801     /* An ungetc()d char is handled separately from the regular
6802      * buffer, so we getc() it back out and stuff it in the buffer.
6803      */
6804     i = PerlIO_getc(fp);
6805     if (i == EOF) return 0;
6806     *(--((*fp)->_ptr)) = (unsigned char) i;
6807     (*fp)->_cnt++;
6808 #endif
6809
6810     /* Here is some breathtakingly efficient cheating */
6811
6812     cnt = PerlIO_get_cnt(fp);                   /* get count into register */
6813     /* make sure we have the room */
6814     if ((I32)(SvLEN(sv) - append) <= cnt + 1) {
6815         /* Not room for all of it
6816            if we are looking for a separator and room for some
6817          */
6818         if (rslen && cnt > 80 && (I32)SvLEN(sv) > append) {
6819             /* just process what we have room for */
6820             shortbuffered = cnt - SvLEN(sv) + append + 1;
6821             cnt -= shortbuffered;
6822         }
6823         else {
6824             shortbuffered = 0;
6825             /* remember that cnt can be negative */
6826             SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
6827         }
6828     }
6829     else
6830         shortbuffered = 0;
6831     bp = (STDCHAR*)SvPVX_const(sv) + append;  /* move these two too to registers */
6832     ptr = (STDCHAR*)PerlIO_get_ptr(fp);
6833     DEBUG_P(PerlIO_printf(Perl_debug_log,
6834         "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
6835     DEBUG_P(PerlIO_printf(Perl_debug_log,
6836         "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
6837                PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
6838                PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
6839     for (;;) {
6840       screamer:
6841         if (cnt > 0) {
6842             if (rslen) {
6843                 while (cnt > 0) {                    /* this     |  eat */
6844                     cnt--;
6845                     if ((*bp++ = *ptr++) == rslast)  /* really   |  dust */
6846                         goto thats_all_folks;        /* screams  |  sed :-) */
6847                 }
6848             }
6849             else {
6850                 Copy(ptr, bp, cnt, char);            /* this     |  eat */
6851                 bp += cnt;                           /* screams  |  dust */
6852                 ptr += cnt;                          /* louder   |  sed :-) */
6853                 cnt = 0;
6854             }
6855         }
6856         
6857         if (shortbuffered) {            /* oh well, must extend */
6858             cnt = shortbuffered;
6859             shortbuffered = 0;
6860             bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
6861             SvCUR_set(sv, bpx);
6862             SvGROW(sv, SvLEN(sv) + append + cnt + 2);
6863             bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
6864             continue;
6865         }
6866
6867         DEBUG_P(PerlIO_printf(Perl_debug_log,
6868                               "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
6869                               PTR2UV(ptr),(long)cnt));
6870         PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
6871 #if 0
6872         DEBUG_P(PerlIO_printf(Perl_debug_log,
6873             "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
6874             PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
6875             PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
6876 #endif
6877         /* This used to call 'filbuf' in stdio form, but as that behaves like
6878            getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
6879            another abstraction.  */
6880         i   = PerlIO_getc(fp);          /* get more characters */
6881 #if 0
6882         DEBUG_P(PerlIO_printf(Perl_debug_log,
6883             "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
6884             PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
6885             PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
6886 #endif
6887         cnt = PerlIO_get_cnt(fp);
6888         ptr = (STDCHAR*)PerlIO_get_ptr(fp);     /* reregisterize cnt and ptr */
6889         DEBUG_P(PerlIO_printf(Perl_debug_log,
6890             "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
6891
6892         if (i == EOF)                   /* all done for ever? */
6893             goto thats_really_all_folks;
6894
6895         bpx = bp - (STDCHAR*)SvPVX_const(sv);   /* box up before relocation */
6896         SvCUR_set(sv, bpx);
6897         SvGROW(sv, bpx + cnt + 2);
6898         bp = (STDCHAR*)SvPVX_const(sv) + bpx;   /* unbox after relocation */
6899
6900         *bp++ = (STDCHAR)i;             /* store character from PerlIO_getc */
6901
6902         if (rslen && (STDCHAR)i == rslast)  /* all done for now? */
6903             goto thats_all_folks;
6904     }
6905
6906 thats_all_folks:
6907     if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX_const(sv)) < rslen) ||
6908           memNE((char*)bp - rslen, rsptr, rslen))
6909         goto screamer;                          /* go back to the fray */
6910 thats_really_all_folks:
6911     if (shortbuffered)
6912         cnt += shortbuffered;
6913         DEBUG_P(PerlIO_printf(Perl_debug_log,
6914             "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
6915     PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt);  /* put these back or we're in trouble */
6916     DEBUG_P(PerlIO_printf(Perl_debug_log,
6917         "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
6918         PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
6919         PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
6920     *bp = '\0';
6921     SvCUR_set(sv, bp - (STDCHAR*)SvPVX_const(sv));      /* set length */
6922     DEBUG_P(PerlIO_printf(Perl_debug_log,
6923         "Screamer: done, len=%ld, string=|%.*s|\n",
6924         (long)SvCUR(sv),(int)SvCUR(sv),SvPVX_const(sv)));
6925     }
6926    else
6927     {
6928        /*The big, slow, and stupid way. */
6929 #ifdef USE_HEAP_INSTEAD_OF_STACK        /* Even slower way. */
6930         STDCHAR *buf = NULL;
6931         Newx(buf, 8192, STDCHAR);
6932         assert(buf);
6933 #else
6934         STDCHAR buf[8192];
6935 #endif
6936
6937 screamer2:
6938         if (rslen) {
6939             register const STDCHAR * const bpe = buf + sizeof(buf);
6940             bp = buf;
6941             while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
6942                 ; /* keep reading */
6943             cnt = bp - buf;
6944         }
6945         else {
6946             cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
6947             /* Accomodate broken VAXC compiler, which applies U8 cast to
6948              * both args of ?: operator, causing EOF to change into 255
6949              */
6950             if (cnt > 0)
6951                  i = (U8)buf[cnt - 1];
6952             else
6953                  i = EOF;
6954         }
6955
6956         if (cnt < 0)
6957             cnt = 0;  /* we do need to re-set the sv even when cnt <= 0 */
6958         if (append)
6959              sv_catpvn(sv, (char *) buf, cnt);
6960         else
6961              sv_setpvn(sv, (char *) buf, cnt);
6962
6963         if (i != EOF &&                 /* joy */
6964             (!rslen ||
6965              SvCUR(sv) < rslen ||
6966              memNE(SvPVX_const(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
6967         {
6968             append = -1;
6969             /*
6970              * If we're reading from a TTY and we get a short read,
6971              * indicating that the user hit his EOF character, we need
6972              * to notice it now, because if we try to read from the TTY
6973              * again, the EOF condition will disappear.
6974              *
6975              * The comparison of cnt to sizeof(buf) is an optimization
6976              * that prevents unnecessary calls to feof().
6977              *
6978              * - jik 9/25/96
6979              */
6980             if (!(cnt < (I32)sizeof(buf) && PerlIO_eof(fp)))
6981                 goto screamer2;
6982         }
6983
6984 #ifdef USE_HEAP_INSTEAD_OF_STACK
6985         Safefree(buf);
6986 #endif
6987     }
6988
6989     if (rspara) {               /* have to do this both before and after */
6990         while (i != EOF) {      /* to make sure file boundaries work right */
6991             i = PerlIO_getc(fp);
6992             if (i != '\n') {
6993                 PerlIO_ungetc(fp,i);
6994                 break;
6995             }
6996         }
6997     }
6998
6999 return_string_or_null:
7000     return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
7001 }
7002
7003 /*
7004 =for apidoc sv_inc
7005
7006 Auto-increment of the value in the SV, doing string to numeric conversion
7007 if necessary. Handles 'get' magic.
7008
7009 =cut
7010 */
7011
7012 void
7013 Perl_sv_inc(pTHX_ register SV *const sv)
7014 {
7015     dVAR;
7016     register char *d;
7017     int flags;
7018
7019     if (!sv)
7020         return;
7021     SvGETMAGIC(sv);
7022     if (SvTHINKFIRST(sv)) {
7023         if (SvIsCOW(sv))
7024             sv_force_normal_flags(sv, 0);
7025         if (SvREADONLY(sv)) {
7026             if (IN_PERL_RUNTIME)
7027                 Perl_croak(aTHX_ PL_no_modify);
7028         }
7029         if (SvROK(sv)) {
7030             IV i;
7031             if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
7032                 return;
7033             i = PTR2IV(SvRV(sv));
7034             sv_unref(sv);
7035             sv_setiv(sv, i);
7036         }
7037     }
7038     flags = SvFLAGS(sv);
7039     if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
7040         /* It's (privately or publicly) a float, but not tested as an
7041            integer, so test it to see. */
7042         (void) SvIV(sv);
7043         flags = SvFLAGS(sv);
7044     }
7045     if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
7046         /* It's publicly an integer, or privately an integer-not-float */
7047 #ifdef PERL_PRESERVE_IVUV
7048       oops_its_int:
7049 #endif
7050         if (SvIsUV(sv)) {
7051             if (SvUVX(sv) == UV_MAX)
7052                 sv_setnv(sv, UV_MAX_P1);
7053             else
7054                 (void)SvIOK_only_UV(sv);
7055                 SvUV_set(sv, SvUVX(sv) + 1);
7056         } else {
7057             if (SvIVX(sv) == IV_MAX)
7058                 sv_setuv(sv, (UV)IV_MAX + 1);
7059             else {
7060                 (void)SvIOK_only(sv);
7061                 SvIV_set(sv, SvIVX(sv) + 1);
7062             }   
7063         }
7064         return;
7065     }
7066     if (flags & SVp_NOK) {
7067         const NV was = SvNVX(sv);
7068         if (NV_OVERFLOWS_INTEGERS_AT &&
7069             was >= NV_OVERFLOWS_INTEGERS_AT && ckWARN(WARN_IMPRECISION)) {
7070             Perl_warner(aTHX_ packWARN(WARN_IMPRECISION),
7071                         "Lost precision when incrementing %" NVff " by 1",
7072                         was);
7073         }
7074         (void)SvNOK_only(sv);
7075         SvNV_set(sv, was + 1.0);
7076         return;
7077     }
7078
7079     if (!(flags & SVp_POK) || !*SvPVX_const(sv)) {
7080         if ((flags & SVTYPEMASK) < SVt_PVIV)
7081             sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV ? SVt_PVIV : SVt_IV));
7082         (void)SvIOK_only(sv);
7083         SvIV_set(sv, 1);
7084         return;
7085     }
7086     d = SvPVX(sv);
7087     while (isALPHA(*d)) d++;
7088     while (isDIGIT(*d)) d++;
7089     if (*d) {
7090 #ifdef PERL_PRESERVE_IVUV
7091         /* Got to punt this as an integer if needs be, but we don't issue
7092            warnings. Probably ought to make the sv_iv_please() that does
7093            the conversion if possible, and silently.  */
7094         const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
7095         if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
7096             /* Need to try really hard to see if it's an integer.
7097                9.22337203685478e+18 is an integer.
7098                but "9.22337203685478e+18" + 0 is UV=9223372036854779904
7099                so $a="9.22337203685478e+18"; $a+0; $a++
7100                needs to be the same as $a="9.22337203685478e+18"; $a++
7101                or we go insane. */
7102         
7103             (void) sv_2iv(sv);
7104             if (SvIOK(sv))
7105                 goto oops_its_int;
7106
7107             /* sv_2iv *should* have made this an NV */
7108             if (flags & SVp_NOK) {
7109                 (void)SvNOK_only(sv);
7110                 SvNV_set(sv, SvNVX(sv) + 1.0);
7111                 return;
7112             }
7113             /* I don't think we can get here. Maybe I should assert this
7114                And if we do get here I suspect that sv_setnv will croak. NWC
7115                Fall through. */
7116 #if defined(USE_LONG_DOUBLE)
7117             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",
7118                                   SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
7119 #else
7120             DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_inc punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"NVgf"\n",
7121                                   SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
7122 #endif
7123         }
7124 #endif /* PERL_PRESERVE_IVUV */
7125         sv_setnv(sv,Atof(SvPVX_const(sv)) + 1.0);
7126         return;
7127     }
7128     d--;
7129     while (d >= SvPVX_const(sv)) {
7130         if (isDIGIT(*d)) {
7131             if (++*d <= '9')
7132                 return;
7133             *(d--) = '0';
7134         }
7135         else {
7136 #ifdef EBCDIC
7137             /* MKS: The original code here died if letters weren't consecutive.
7138              * at least it didn't have to worry about non-C locales.  The
7139              * new code assumes that ('z'-'a')==('Z'-'A'), letters are
7140              * arranged in order (although not consecutively) and that only
7141              * [A-Za-z] are accepted by isALPHA in the C locale.
7142              */
7143             if (*d != 'z' && *d != 'Z') {
7144                 do { ++*d; } while (!isALPHA(*d));
7145                 return;
7146             }
7147             *(d--) -= 'z' - 'a';
7148 #else
7149             ++*d;
7150             if (isALPHA(*d))
7151                 return;
7152             *(d--) -= 'z' - 'a' + 1;
7153 #endif
7154         }
7155     }
7156     /* oh,oh, the number grew */
7157     SvGROW(sv, SvCUR(sv) + 2);
7158     SvCUR_set(sv, SvCUR(sv) + 1);
7159     for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX_const(sv); d--)
7160         *d = d[-1];
7161     if (isDIGIT(d[1]))
7162         *d = '1';
7163     else
7164         *d = d[1];
7165 }
7166
7167 /*
7168 =for apidoc sv_dec
7169
7170 Auto-decrement of the value in the SV, doing string to numeric conversion
7171 if necessary. Handles 'get' magic.
7172
7173 =cut
7174 */
7175
7176 void
7177 Perl_sv_dec(pTHX_ register SV *const sv)
7178 {
7179     dVAR;
7180     int flags;
7181
7182     if (!sv)
7183         return;
7184     SvGETMAGIC(sv);
7185     if (SvTHINKFIRST(sv)) {
7186         if (SvIsCOW(sv))
7187             sv_force_normal_flags(sv, 0);
7188         if (SvREADONLY(sv)) {
7189             if (IN_PERL_RUNTIME)
7190                 Perl_croak(aTHX_ PL_no_modify);
7191         }
7192         if (SvROK(sv)) {
7193             IV i;
7194             if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
7195                 return;
7196             i = PTR2IV(SvRV(sv));
7197             sv_unref(sv);
7198             sv_setiv(sv, i);
7199         }
7200     }
7201     /* Unlike sv_inc we don't have to worry about string-never-numbers
7202        and keeping them magic. But we mustn't warn on punting */
7203     flags = SvFLAGS(sv);
7204     if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
7205         /* It's publicly an integer, or privately an integer-not-float */
7206 #ifdef PERL_PRESERVE_IVUV
7207       oops_its_int:
7208 #endif
7209         if (SvIsUV(sv)) {
7210             if (SvUVX(sv) == 0) {
7211                 (void)SvIOK_only(sv);
7212                 SvIV_set(sv, -1);
7213             }
7214             else {
7215                 (void)SvIOK_only_UV(sv);
7216                 SvUV_set(sv, SvUVX(sv) - 1);
7217             }   
7218         } else {
7219             if (SvIVX(sv) == IV_MIN) {
7220                 sv_setnv(sv, (NV)IV_MIN);
7221                 goto oops_its_num;
7222             }
7223             else {
7224                 (void)SvIOK_only(sv);
7225                 SvIV_set(sv, SvIVX(sv) - 1);
7226             }   
7227         }
7228         return;
7229     }
7230     if (flags & SVp_NOK) {
7231     oops_its_num:
7232         {
7233             const NV was = SvNVX(sv);
7234             if (NV_OVERFLOWS_INTEGERS_AT &&
7235                 was <= -NV_OVERFLOWS_INTEGERS_AT && ckWARN(WARN_IMPRECISION)) {
7236                 Perl_warner(aTHX_ packWARN(WARN_IMPRECISION),
7237                             "Lost precision when decrementing %" NVff " by 1",
7238                             was);
7239             }
7240             (void)SvNOK_only(sv);
7241             SvNV_set(sv, was - 1.0);
7242             return;
7243         }
7244     }
7245     if (!(flags & SVp_POK)) {
7246         if ((flags & SVTYPEMASK) < SVt_PVIV)
7247             sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV) ? SVt_PVIV : SVt_IV);
7248         SvIV_set(sv, -1);
7249         (void)SvIOK_only(sv);
7250         return;
7251     }
7252 #ifdef PERL_PRESERVE_IVUV
7253     {
7254         const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
7255         if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
7256             /* Need to try really hard to see if it's an integer.
7257                9.22337203685478e+18 is an integer.
7258                but "9.22337203685478e+18" + 0 is UV=9223372036854779904
7259                so $a="9.22337203685478e+18"; $a+0; $a--
7260                needs to be the same as $a="9.22337203685478e+18"; $a--
7261                or we go insane. */
7262         
7263             (void) sv_2iv(sv);
7264             if (SvIOK(sv))
7265                 goto oops_its_int;
7266
7267             /* sv_2iv *should* have made this an NV */
7268             if (flags & SVp_NOK) {
7269                 (void)SvNOK_only(sv);
7270                 SvNV_set(sv, SvNVX(sv) - 1.0);
7271                 return;
7272             }
7273             /* I don't think we can get here. Maybe I should assert this
7274                And if we do get here I suspect that sv_setnv will croak. NWC
7275                Fall through. */
7276 #if defined(USE_LONG_DOUBLE)
7277             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",
7278                                   SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
7279 #else
7280             DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_dec punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"NVgf"\n",
7281                                   SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
7282 #endif
7283         }
7284     }
7285 #endif /* PERL_PRESERVE_IVUV */
7286     sv_setnv(sv,Atof(SvPVX_const(sv)) - 1.0);   /* punt */
7287 }
7288
7289 /*
7290 =for apidoc sv_mortalcopy
7291
7292 Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
7293 The new SV is marked as mortal. It will be destroyed "soon", either by an
7294 explicit call to FREETMPS, or by an implicit call at places such as
7295 statement boundaries.  See also C<sv_newmortal> and C<sv_2mortal>.
7296
7297 =cut
7298 */
7299
7300 /* Make a string that will exist for the duration of the expression
7301  * evaluation.  Actually, it may have to last longer than that, but
7302  * hopefully we won't free it until it has been assigned to a
7303  * permanent location. */
7304
7305 SV *
7306 Perl_sv_mortalcopy(pTHX_ SV *const oldstr)
7307 {
7308     dVAR;
7309     register SV *sv;
7310
7311     new_SV(sv);
7312     sv_setsv(sv,oldstr);
7313     EXTEND_MORTAL(1);
7314     PL_tmps_stack[++PL_tmps_ix] = sv;
7315     SvTEMP_on(sv);
7316     return sv;
7317 }
7318
7319 /*
7320 =for apidoc sv_newmortal
7321
7322 Creates a new null SV which is mortal.  The reference count of the SV is
7323 set to 1. It will be destroyed "soon", either by an explicit call to
7324 FREETMPS, or by an implicit call at places such as statement boundaries.
7325 See also C<sv_mortalcopy> and C<sv_2mortal>.
7326
7327 =cut
7328 */
7329
7330 SV *
7331 Perl_sv_newmortal(pTHX)
7332 {
7333     dVAR;
7334     register SV *sv;
7335
7336     new_SV(sv);
7337     SvFLAGS(sv) = SVs_TEMP;
7338     EXTEND_MORTAL(1);
7339     PL_tmps_stack[++PL_tmps_ix] = sv;
7340     return sv;
7341 }
7342
7343
7344 /*
7345 =for apidoc newSVpvn_flags
7346
7347 Creates a new SV and copies a string into it.  The reference count for the
7348 SV is set to 1.  Note that if C<len> is zero, Perl will create a zero length
7349 string.  You are responsible for ensuring that the source string is at least
7350 C<len> bytes long.  If the C<s> argument is NULL the new SV will be undefined.
7351 Currently the only flag bits accepted are C<SVf_UTF8> and C<SVs_TEMP>.
7352 If C<SVs_TEMP> is set, then C<sv2mortal()> is called on the result before
7353 returning. If C<SVf_UTF8> is set, then it will be set on the new SV.
7354 C<newSVpvn_utf8()> is a convenience wrapper for this function, defined as
7355
7356     #define newSVpvn_utf8(s, len, u)                    \
7357         newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0)
7358
7359 =cut
7360 */
7361
7362 SV *
7363 Perl_newSVpvn_flags(pTHX_ const char *const s, const STRLEN len, const U32 flags)
7364 {
7365     dVAR;
7366     register SV *sv;
7367
7368     /* All the flags we don't support must be zero.
7369        And we're new code so I'm going to assert this from the start.  */
7370     assert(!(flags & ~(SVf_UTF8|SVs_TEMP)));
7371     new_SV(sv);
7372     sv_setpvn(sv,s,len);
7373     SvFLAGS(sv) |= (flags & SVf_UTF8);
7374     return (flags & SVs_TEMP) ? sv_2mortal(sv) : sv;
7375 }
7376
7377 /*
7378 =for apidoc sv_2mortal
7379
7380 Marks an existing SV as mortal.  The SV will be destroyed "soon", either
7381 by an explicit call to FREETMPS, or by an implicit call at places such as
7382 statement boundaries.  SvTEMP() is turned on which means that the SV's
7383 string buffer can be "stolen" if this SV is copied. See also C<sv_newmortal>
7384 and C<sv_mortalcopy>.
7385
7386 =cut
7387 */
7388
7389 SV *
7390 Perl_sv_2mortal(pTHX_ register SV *const sv)
7391 {
7392     dVAR;
7393     if (!sv)
7394         return NULL;
7395     if (SvREADONLY(sv) && SvIMMORTAL(sv))
7396         return sv;
7397     EXTEND_MORTAL(1);
7398     PL_tmps_stack[++PL_tmps_ix] = sv;
7399     SvTEMP_on(sv);
7400     return sv;
7401 }
7402
7403 /*
7404 =for apidoc newSVpv
7405
7406 Creates a new SV and copies a string into it.  The reference count for the
7407 SV is set to 1.  If C<len> is zero, Perl will compute the length using
7408 strlen().  For efficiency, consider using C<newSVpvn> instead.
7409
7410 =cut
7411 */
7412
7413 SV *
7414 Perl_newSVpv(pTHX_ const char *const s, const STRLEN len)
7415 {
7416     dVAR;
7417     register SV *sv;
7418
7419     new_SV(sv);
7420     sv_setpvn(sv, s, len || s == NULL ? len : strlen(s));
7421     return sv;
7422 }
7423
7424 /*
7425 =for apidoc newSVpvn
7426
7427 Creates a new SV and copies a string into it.  The reference count for the
7428 SV is set to 1.  Note that if C<len> is zero, Perl will create a zero length
7429 string.  You are responsible for ensuring that the source string is at least
7430 C<len> bytes long.  If the C<s> argument is NULL the new SV will be undefined.
7431
7432 =cut
7433 */
7434
7435 SV *
7436 Perl_newSVpvn(pTHX_ const char *const s, const STRLEN len)
7437 {
7438     dVAR;
7439     register SV *sv;
7440
7441     new_SV(sv);
7442     sv_setpvn(sv,s,len);
7443     return sv;
7444 }
7445
7446 /*
7447 =for apidoc newSVhek
7448
7449 Creates a new SV from the hash key structure.  It will generate scalars that
7450 point to the shared string table where possible. Returns a new (undefined)
7451 SV if the hek is NULL.
7452
7453 =cut
7454 */
7455
7456 SV *
7457 Perl_newSVhek(pTHX_ const HEK *const hek)
7458 {
7459     dVAR;
7460     if (!hek) {
7461         SV *sv;
7462
7463         new_SV(sv);
7464         return sv;
7465     }
7466
7467     if (HEK_LEN(hek) == HEf_SVKEY) {
7468         return newSVsv(*(SV**)HEK_KEY(hek));
7469     } else {
7470         const int flags = HEK_FLAGS(hek);
7471         if (flags & HVhek_WASUTF8) {
7472             /* Trouble :-)
7473                Andreas would like keys he put in as utf8 to come back as utf8
7474             */
7475             STRLEN utf8_len = HEK_LEN(hek);
7476             const U8 *as_utf8 = bytes_to_utf8 ((U8*)HEK_KEY(hek), &utf8_len);
7477             SV * const sv = newSVpvn ((const char*)as_utf8, utf8_len);
7478
7479             SvUTF8_on (sv);
7480             Safefree (as_utf8); /* bytes_to_utf8() allocates a new string */
7481             return sv;
7482         } else if (flags & (HVhek_REHASH|HVhek_UNSHARED)) {
7483             /* We don't have a pointer to the hv, so we have to replicate the
7484                flag into every HEK. This hv is using custom a hasing
7485                algorithm. Hence we can't return a shared string scalar, as
7486                that would contain the (wrong) hash value, and might get passed
7487                into an hv routine with a regular hash.
7488                Similarly, a hash that isn't using shared hash keys has to have
7489                the flag in every key so that we know not to try to call
7490                share_hek_kek on it.  */
7491
7492             SV * const sv = newSVpvn (HEK_KEY(hek), HEK_LEN(hek));
7493             if (HEK_UTF8(hek))
7494                 SvUTF8_on (sv);
7495             return sv;
7496         }
7497         /* This will be overwhelminly the most common case.  */
7498         {
7499             /* Inline most of newSVpvn_share(), because share_hek_hek() is far
7500                more efficient than sharepvn().  */
7501             SV *sv;
7502
7503             new_SV(sv);
7504             sv_upgrade(sv, SVt_PV);
7505             SvPV_set(sv, (char *)HEK_KEY(share_hek_hek(hek)));
7506             SvCUR_set(sv, HEK_LEN(hek));
7507             SvLEN_set(sv, 0);
7508             SvREADONLY_on(sv);
7509             SvFAKE_on(sv);
7510             SvPOK_on(sv);
7511             if (HEK_UTF8(hek))
7512                 SvUTF8_on(sv);
7513             return sv;
7514         }
7515     }
7516 }
7517
7518 /*
7519 =for apidoc newSVpvn_share
7520
7521 Creates a new SV with its SvPVX_const pointing to a shared string in the string
7522 table. If the string does not already exist in the table, it is created
7523 first.  Turns on READONLY and FAKE. If the C<hash> parameter is non-zero, that
7524 value is used; otherwise the hash is computed. The string's hash can be later
7525 be retrieved from the SV with the C<SvSHARED_HASH()> macro. The idea here is
7526 that as the string table is used for shared hash keys these strings will have
7527 SvPVX_const == HeKEY and hash lookup will avoid string compare.
7528
7529 =cut
7530 */
7531
7532 SV *
7533 Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
7534 {
7535     dVAR;
7536     register SV *sv;
7537     bool is_utf8 = FALSE;
7538     const char *const orig_src = src;
7539
7540     if (len < 0) {
7541         STRLEN tmplen = -len;
7542         is_utf8 = TRUE;
7543         /* See the note in hv.c:hv_fetch() --jhi */
7544         src = (char*)bytes_from_utf8((const U8*)src, &tmplen, &is_utf8);
7545         len = tmplen;
7546     }
7547     if (!hash)
7548         PERL_HASH(hash, src, len);
7549     new_SV(sv);
7550     /* The logic for this is inlined in S_mro_get_linear_isa_dfs(), so if it
7551        changes here, update it there too.  */
7552     sv_upgrade(sv, SVt_PV);
7553     SvPV_set(sv, sharepvn(src, is_utf8?-len:len, hash));
7554     SvCUR_set(sv, len);
7555     SvLEN_set(sv, 0);
7556     SvREADONLY_on(sv);
7557     SvFAKE_on(sv);
7558     SvPOK_on(sv);
7559     if (is_utf8)
7560         SvUTF8_on(sv);
7561     if (src != orig_src)
7562         Safefree(src);
7563     return sv;
7564 }
7565
7566
7567 #if defined(PERL_IMPLICIT_CONTEXT)
7568
7569 /* pTHX_ magic can't cope with varargs, so this is a no-context
7570  * version of the main function, (which may itself be aliased to us).
7571  * Don't access this version directly.
7572  */
7573
7574 SV *
7575 Perl_newSVpvf_nocontext(const char *const pat, ...)
7576 {
7577     dTHX;
7578     register SV *sv;
7579     va_list args;
7580
7581     PERL_ARGS_ASSERT_NEWSVPVF_NOCONTEXT;
7582
7583     va_start(args, pat);
7584     sv = vnewSVpvf(pat, &args);
7585     va_end(args);
7586     return sv;
7587 }
7588 #endif
7589
7590 /*
7591 =for apidoc newSVpvf
7592
7593 Creates a new SV and initializes it with the string formatted like
7594 C<sprintf>.
7595
7596 =cut
7597 */
7598
7599 SV *
7600 Perl_newSVpvf(pTHX_ const char *const pat, ...)
7601 {
7602     register SV *sv;
7603     va_list args;
7604
7605     PERL_ARGS_ASSERT_NEWSVPVF;
7606
7607     va_start(args, pat);
7608     sv = vnewSVpvf(pat, &args);
7609     va_end(args);
7610     return sv;
7611 }
7612
7613 /* backend for newSVpvf() and newSVpvf_nocontext() */
7614
7615 SV *
7616 Perl_vnewSVpvf(pTHX_ const char *const pat, va_list *const args)
7617 {
7618     dVAR;
7619     register SV *sv;
7620
7621     PERL_ARGS_ASSERT_VNEWSVPVF;
7622
7623     new_SV(sv);
7624     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
7625     return sv;
7626 }
7627
7628 /*
7629 =for apidoc newSVnv
7630
7631 Creates a new SV and copies a floating point value into it.
7632 The reference count for the SV is set to 1.
7633
7634 =cut
7635 */
7636
7637 SV *
7638 Perl_newSVnv(pTHX_ const NV n)
7639 {
7640     dVAR;
7641     register SV *sv;
7642
7643     new_SV(sv);
7644     sv_setnv(sv,n);
7645     return sv;
7646 }
7647
7648 /*
7649 =for apidoc newSViv
7650
7651 Creates a new SV and copies an integer into it.  The reference count for the
7652 SV is set to 1.
7653
7654 =cut
7655 */
7656
7657 SV *
7658 Perl_newSViv(pTHX_ const IV i)
7659 {
7660     dVAR;
7661     register SV *sv;
7662
7663     new_SV(sv);
7664     sv_setiv(sv,i);
7665     return sv;
7666 }
7667
7668 /*
7669 =for apidoc newSVuv
7670
7671 Creates a new SV and copies an unsigned integer into it.
7672 The reference count for the SV is set to 1.
7673
7674 =cut
7675 */
7676
7677 SV *
7678 Perl_newSVuv(pTHX_ const UV u)
7679 {
7680     dVAR;
7681     register SV *sv;
7682
7683     new_SV(sv);
7684     sv_setuv(sv,u);
7685     return sv;
7686 }
7687
7688 /*
7689 =for apidoc newSV_type
7690
7691 Creates a new SV, of the type specified.  The reference count for the new SV
7692 is set to 1.
7693
7694 =cut
7695 */
7696
7697 SV *
7698 Perl_newSV_type(pTHX_ const svtype type)
7699 {
7700     register SV *sv;
7701
7702     new_SV(sv);
7703     sv_upgrade(sv, type);
7704     return sv;
7705 }
7706
7707 /*
7708 =for apidoc newRV_noinc
7709
7710 Creates an RV wrapper for an SV.  The reference count for the original
7711 SV is B<not> incremented.
7712
7713 =cut
7714 */
7715
7716 SV *
7717 Perl_newRV_noinc(pTHX_ SV *const tmpRef)
7718 {
7719     dVAR;
7720     register SV *sv = newSV_type(SVt_IV);
7721
7722     PERL_ARGS_ASSERT_NEWRV_NOINC;
7723
7724     SvTEMP_off(tmpRef);
7725     SvRV_set(sv, tmpRef);
7726     SvROK_on(sv);
7727     return sv;
7728 }
7729
7730 /* newRV_inc is the official function name to use now.
7731  * newRV_inc is in fact #defined to newRV in sv.h
7732  */
7733
7734 SV *
7735 Perl_newRV(pTHX_ SV *const sv)
7736 {
7737     dVAR;
7738
7739     PERL_ARGS_ASSERT_NEWRV;
7740
7741     return newRV_noinc(SvREFCNT_inc_simple_NN(sv));
7742 }
7743
7744 /*
7745 =for apidoc newSVsv
7746
7747 Creates a new SV which is an exact duplicate of the original SV.
7748 (Uses C<sv_setsv>).
7749
7750 =cut
7751 */
7752
7753 SV *
7754 Perl_newSVsv(pTHX_ register SV *const old)
7755 {
7756     dVAR;
7757     register SV *sv;
7758
7759     if (!old)
7760         return NULL;
7761     if (SvTYPE(old) == SVTYPEMASK) {
7762         if (ckWARN_d(WARN_INTERNAL))
7763             Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
7764         return NULL;
7765     }
7766     new_SV(sv);
7767     /* SV_GMAGIC is the default for sv_setv()
7768        SV_NOSTEAL prevents TEMP buffers being, well, stolen, and saves games
7769        with SvTEMP_off and SvTEMP_on round a call to sv_setsv.  */
7770     sv_setsv_flags(sv, old, SV_GMAGIC | SV_NOSTEAL);
7771     return sv;
7772 }
7773
7774 /*
7775 =for apidoc sv_reset
7776
7777 Underlying implementation for the C<reset> Perl function.
7778 Note that the perl-level function is vaguely deprecated.
7779
7780 =cut
7781 */
7782
7783 void
7784 Perl_sv_reset(pTHX_ register const char *s, HV *const stash)
7785 {
7786     dVAR;
7787     char todo[PERL_UCHAR_MAX+1];
7788
7789     PERL_ARGS_ASSERT_SV_RESET;
7790
7791     if (!stash)
7792         return;
7793
7794     if (!*s) {          /* reset ?? searches */
7795         MAGIC * const mg = mg_find((const SV *)stash, PERL_MAGIC_symtab);
7796         if (mg) {
7797             const U32 count = mg->mg_len / sizeof(PMOP**);
7798             PMOP **pmp = (PMOP**) mg->mg_ptr;
7799             PMOP *const *const end = pmp + count;
7800
7801             while (pmp < end) {
7802 #ifdef USE_ITHREADS
7803                 SvREADONLY_off(PL_regex_pad[(*pmp)->op_pmoffset]);
7804 #else
7805                 (*pmp)->op_pmflags &= ~PMf_USED;
7806 #endif
7807                 ++pmp;
7808             }
7809         }
7810         return;
7811     }
7812
7813     /* reset variables */
7814
7815     if (!HvARRAY(stash))
7816         return;
7817
7818     Zero(todo, 256, char);
7819     while (*s) {
7820         I32 max;
7821         I32 i = (unsigned char)*s;
7822         if (s[1] == '-') {
7823             s += 2;
7824         }
7825         max = (unsigned char)*s++;
7826         for ( ; i <= max; i++) {
7827             todo[i] = 1;
7828         }
7829         for (i = 0; i <= (I32) HvMAX(stash); i++) {
7830             HE *entry;
7831             for (entry = HvARRAY(stash)[i];
7832                  entry;
7833                  entry = HeNEXT(entry))
7834             {
7835                 register GV *gv;
7836                 register SV *sv;
7837
7838                 if (!todo[(U8)*HeKEY(entry)])
7839                     continue;
7840                 gv = MUTABLE_GV(HeVAL(entry));
7841                 sv = GvSV(gv);
7842                 if (sv) {
7843                     if (SvTHINKFIRST(sv)) {
7844                         if (!SvREADONLY(sv) && SvROK(sv))
7845                             sv_unref(sv);
7846                         /* XXX Is this continue a bug? Why should THINKFIRST
7847                            exempt us from resetting arrays and hashes?  */
7848                         continue;
7849                     }
7850                     SvOK_off(sv);
7851                     if (SvTYPE(sv) >= SVt_PV) {
7852                         SvCUR_set(sv, 0);
7853                         if (SvPVX_const(sv) != NULL)
7854                             *SvPVX(sv) = '\0';
7855                         SvTAINT(sv);
7856                     }
7857                 }
7858                 if (GvAV(gv)) {
7859                     av_clear(GvAV(gv));
7860                 }
7861                 if (GvHV(gv) && !HvNAME_get(GvHV(gv))) {
7862 #if defined(VMS)
7863                     Perl_die(aTHX_ "Can't reset %%ENV on this system");
7864 #else /* ! VMS */
7865                     hv_clear(GvHV(gv));
7866 #  if defined(USE_ENVIRON_ARRAY)
7867                     if (gv == PL_envgv)
7868                         my_clearenv();
7869 #  endif /* USE_ENVIRON_ARRAY */
7870 #endif /* VMS */
7871                 }
7872             }
7873         }
7874     }
7875 }
7876
7877 /*
7878 =for apidoc sv_2io
7879
7880 Using various gambits, try to get an IO from an SV: the IO slot if its a
7881 GV; or the recursive result if we're an RV; or the IO slot of the symbol
7882 named after the PV if we're a string.
7883
7884 =cut
7885 */
7886
7887 IO*
7888 Perl_sv_2io(pTHX_ SV *const sv)
7889 {
7890     IO* io;
7891     GV* gv;
7892
7893     PERL_ARGS_ASSERT_SV_2IO;
7894
7895     switch (SvTYPE(sv)) {
7896     case SVt_PVIO:
7897         io = MUTABLE_IO(sv);
7898         break;
7899     case SVt_PVGV:
7900         if (isGV_with_GP(sv)) {
7901             gv = MUTABLE_GV(sv);
7902             io = GvIO(gv);
7903             if (!io)
7904                 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
7905             break;
7906         }
7907         /* FALL THROUGH */
7908     default:
7909         if (!SvOK(sv))
7910             Perl_croak(aTHX_ PL_no_usym, "filehandle");
7911         if (SvROK(sv))
7912             return sv_2io(SvRV(sv));
7913         gv = gv_fetchsv(sv, 0, SVt_PVIO);
7914         if (gv)
7915             io = GvIO(gv);
7916         else
7917             io = 0;
7918         if (!io)
7919             Perl_croak(aTHX_ "Bad filehandle: %"SVf, SVfARG(sv));
7920         break;
7921     }
7922     return io;
7923 }
7924
7925 /*
7926 =for apidoc sv_2cv
7927
7928 Using various gambits, try to get a CV from an SV; in addition, try if
7929 possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
7930 The flags in C<lref> are passed to sv_fetchsv.
7931
7932 =cut
7933 */
7934
7935 CV *
7936 Perl_sv_2cv(pTHX_ SV *sv, HV **const st, GV **const gvp, const I32 lref)
7937 {
7938     dVAR;
7939     GV *gv = NULL;
7940     CV *cv = NULL;
7941
7942     PERL_ARGS_ASSERT_SV_2CV;
7943
7944     if (!sv) {
7945         *st = NULL;
7946         *gvp = NULL;
7947         return NULL;
7948     }
7949     switch (SvTYPE(sv)) {
7950     case SVt_PVCV:
7951         *st = CvSTASH(sv);
7952         *gvp = NULL;
7953         return MUTABLE_CV(sv);
7954     case SVt_PVHV:
7955     case SVt_PVAV:
7956         *st = NULL;
7957         *gvp = NULL;
7958         return NULL;
7959     case SVt_PVGV:
7960         if (isGV_with_GP(sv)) {
7961             gv = MUTABLE_GV(sv);
7962             *gvp = gv;
7963             *st = GvESTASH(gv);
7964             goto fix_gv;
7965         }
7966         /* FALL THROUGH */
7967
7968     default:
7969         if (SvROK(sv)) {
7970             SV * const *sp = &sv;       /* Used in tryAMAGICunDEREF macro. */
7971             SvGETMAGIC(sv);
7972             tryAMAGICunDEREF(to_cv);
7973
7974             sv = SvRV(sv);
7975             if (SvTYPE(sv) == SVt_PVCV) {
7976                 cv = MUTABLE_CV(sv);
7977                 *gvp = NULL;
7978                 *st = CvSTASH(cv);
7979                 return cv;
7980             }
7981             else if(isGV_with_GP(sv))
7982                 gv = MUTABLE_GV(sv);
7983             else
7984                 Perl_croak(aTHX_ "Not a subroutine reference");
7985         }
7986         else if (isGV_with_GP(sv)) {
7987             SvGETMAGIC(sv);
7988             gv = MUTABLE_GV(sv);
7989         }
7990         else
7991             gv = gv_fetchsv(sv, lref, SVt_PVCV); /* Calls get magic */
7992         *gvp = gv;
7993         if (!gv) {
7994             *st = NULL;
7995             return NULL;
7996         }
7997         /* Some flags to gv_fetchsv mean don't really create the GV  */
7998         if (!isGV_with_GP(gv)) {
7999             *st = NULL;
8000             return NULL;
8001         }
8002         *st = GvESTASH(gv);
8003     fix_gv:
8004         if (lref && !GvCVu(gv)) {
8005             SV *tmpsv;
8006             ENTER;
8007             tmpsv = newSV(0);
8008             gv_efullname3(tmpsv, gv, NULL);
8009             /* XXX this is probably not what they think they're getting.
8010              * It has the same effect as "sub name;", i.e. just a forward
8011              * declaration! */
8012             newSUB(start_subparse(FALSE, 0),
8013                    newSVOP(OP_CONST, 0, tmpsv),
8014                    NULL, NULL);
8015             LEAVE;
8016             if (!GvCVu(gv))
8017                 Perl_croak(aTHX_ "Unable to create sub named \"%"SVf"\"",
8018                            SVfARG(SvOK(sv) ? sv : &PL_sv_no));
8019         }
8020         return GvCVu(gv);
8021     }
8022 }
8023
8024 /*
8025 =for apidoc sv_true
8026
8027 Returns true if the SV has a true value by Perl's rules.
8028 Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
8029 instead use an in-line version.
8030
8031 =cut
8032 */
8033
8034 I32
8035 Perl_sv_true(pTHX_ register SV *const sv)
8036 {
8037     if (!sv)
8038         return 0;
8039     if (SvPOK(sv)) {
8040         register const XPV* const tXpv = (XPV*)SvANY(sv);
8041         if (tXpv &&
8042                 (tXpv->xpv_cur > 1 ||
8043                 (tXpv->xpv_cur && *sv->sv_u.svu_pv != '0')))
8044             return 1;
8045         else
8046             return 0;
8047     }
8048     else {
8049         if (SvIOK(sv))
8050             return SvIVX(sv) != 0;
8051         else {
8052             if (SvNOK(sv))
8053                 return SvNVX(sv) != 0.0;
8054             else
8055                 return sv_2bool(sv);
8056         }
8057     }
8058 }
8059
8060 /*
8061 =for apidoc sv_pvn_force
8062
8063 Get a sensible string out of the SV somehow.
8064 A private implementation of the C<SvPV_force> macro for compilers which
8065 can't cope with complex macro expressions. Always use the macro instead.
8066
8067 =for apidoc sv_pvn_force_flags
8068
8069 Get a sensible string out of the SV somehow.
8070 If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
8071 appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
8072 implemented in terms of this function.
8073 You normally want to use the various wrapper macros instead: see
8074 C<SvPV_force> and C<SvPV_force_nomg>
8075
8076 =cut
8077 */
8078
8079 char *
8080 Perl_sv_pvn_force_flags(pTHX_ SV *const sv, STRLEN *const lp, const I32 flags)
8081 {
8082     dVAR;
8083
8084     PERL_ARGS_ASSERT_SV_PVN_FORCE_FLAGS;
8085
8086     if (SvTHINKFIRST(sv) && !SvROK(sv))
8087         sv_force_normal_flags(sv, 0);
8088
8089     if (SvPOK(sv)) {
8090         if (lp)
8091             *lp = SvCUR(sv);
8092     }
8093     else {
8094         char *s;
8095         STRLEN len;
8096  
8097         if (SvREADONLY(sv) && !(flags & SV_MUTABLE_RETURN)) {
8098             const char * const ref = sv_reftype(sv,0);
8099             if (PL_op)
8100                 Perl_croak(aTHX_ "Can't coerce readonly %s to string in %s",
8101                            ref, OP_NAME(PL_op));
8102             else
8103                 Perl_croak(aTHX_ "Can't coerce readonly %s to string", ref);
8104         }
8105         if ((SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM)
8106             || isGV_with_GP(sv))
8107             Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
8108                 OP_NAME(PL_op));
8109         s = sv_2pv_flags(sv, &len, flags);
8110         if (lp)
8111             *lp = len;
8112
8113         if (s != SvPVX_const(sv)) {     /* Almost, but not quite, sv_setpvn() */
8114             if (SvROK(sv))
8115                 sv_unref(sv);
8116             SvUPGRADE(sv, SVt_PV);              /* Never FALSE */
8117             SvGROW(sv, len + 1);
8118             Move(s,SvPVX(sv),len,char);
8119             SvCUR_set(sv, len);
8120             SvPVX(sv)[len] = '\0';
8121         }
8122         if (!SvPOK(sv)) {
8123             SvPOK_on(sv);               /* validate pointer */
8124             SvTAINT(sv);
8125             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
8126                                   PTR2UV(sv),SvPVX_const(sv)));
8127         }
8128     }
8129     return SvPVX_mutable(sv);
8130 }
8131
8132 /*
8133 =for apidoc sv_pvbyten_force
8134
8135 The backend for the C<SvPVbytex_force> macro. Always use the macro instead.
8136
8137 =cut
8138 */
8139
8140 char *
8141 Perl_sv_pvbyten_force(pTHX_ SV *const sv, STRLEN *const lp)
8142 {
8143     PERL_ARGS_ASSERT_SV_PVBYTEN_FORCE;
8144
8145     sv_pvn_force(sv,lp);
8146     sv_utf8_downgrade(sv,0);
8147     *lp = SvCUR(sv);
8148     return SvPVX(sv);
8149 }
8150
8151 /*
8152 =for apidoc sv_pvutf8n_force
8153
8154 The backend for the C<SvPVutf8x_force> macro. Always use the macro instead.
8155
8156 =cut
8157 */
8158
8159 char *
8160 Perl_sv_pvutf8n_force(pTHX_ SV *const sv, STRLEN *const lp)
8161 {
8162     PERL_ARGS_ASSERT_SV_PVUTF8N_FORCE;
8163
8164     sv_pvn_force(sv,lp);
8165     sv_utf8_upgrade(sv);
8166     *lp = SvCUR(sv);
8167     return SvPVX(sv);
8168 }
8169
8170 /*
8171 =for apidoc sv_reftype
8172
8173 Returns a string describing what the SV is a reference to.
8174
8175 =cut
8176 */
8177
8178 const char *
8179 Perl_sv_reftype(pTHX_ const SV *const sv, const int ob)
8180 {
8181     PERL_ARGS_ASSERT_SV_REFTYPE;
8182
8183     /* The fact that I don't need to downcast to char * everywhere, only in ?:
8184        inside return suggests a const propagation bug in g++.  */
8185     if (ob && SvOBJECT(sv)) {
8186         char * const name = HvNAME_get(SvSTASH(sv));
8187         return name ? name : (char *) "__ANON__";
8188     }
8189     else {
8190         switch (SvTYPE(sv)) {
8191         case SVt_NULL:
8192         case SVt_IV:
8193         case SVt_NV:
8194         case SVt_PV:
8195         case SVt_PVIV:
8196         case SVt_PVNV:
8197         case SVt_PVMG:
8198                                 if (SvVOK(sv))
8199                                     return "VSTRING";
8200                                 if (SvROK(sv))
8201                                     return "REF";
8202                                 else
8203                                     return "SCALAR";
8204
8205         case SVt_PVLV:          return (char *)  (SvROK(sv) ? "REF"
8206                                 /* tied lvalues should appear to be
8207                                  * scalars for backwards compatitbility */
8208                                 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
8209                                     ? "SCALAR" : "LVALUE");
8210         case SVt_PVAV:          return "ARRAY";
8211         case SVt_PVHV:          return "HASH";
8212         case SVt_PVCV:          return "CODE";
8213         case SVt_PVGV:          return (char *) (isGV_with_GP(sv)
8214                                     ? "GLOB" : "SCALAR");
8215         case SVt_PVFM:          return "FORMAT";
8216         case SVt_PVIO:          return "IO";
8217         case SVt_BIND:          return "BIND";
8218         case SVt_REGEXP:        return "REGEXP"; 
8219         default:                return "UNKNOWN";
8220         }
8221     }
8222 }
8223
8224 /*
8225 =for apidoc sv_isobject
8226
8227 Returns a boolean indicating whether the SV is an RV pointing to a blessed
8228 object.  If the SV is not an RV, or if the object is not blessed, then this
8229 will return false.
8230
8231 =cut
8232 */
8233
8234 int
8235 Perl_sv_isobject(pTHX_ SV *sv)
8236 {
8237     if (!sv)
8238         return 0;
8239     SvGETMAGIC(sv);
8240     if (!SvROK(sv))
8241         return 0;
8242     sv = SvRV(sv);
8243     if (!SvOBJECT(sv))
8244         return 0;
8245     return 1;
8246 }
8247
8248 /*
8249 =for apidoc sv_isa
8250
8251 Returns a boolean indicating whether the SV is blessed into the specified
8252 class.  This does not check for subtypes; use C<sv_derived_from> to verify
8253 an inheritance relationship.
8254
8255 =cut
8256 */
8257
8258 int
8259 Perl_sv_isa(pTHX_ SV *sv, const char *const name)
8260 {
8261     const char *hvname;
8262
8263     PERL_ARGS_ASSERT_SV_ISA;
8264
8265     if (!sv)
8266         return 0;
8267     SvGETMAGIC(sv);
8268     if (!SvROK(sv))
8269         return 0;
8270     sv = SvRV(sv);
8271     if (!SvOBJECT(sv))
8272         return 0;
8273     hvname = HvNAME_get(SvSTASH(sv));
8274     if (!hvname)
8275         return 0;
8276
8277     return strEQ(hvname, name);
8278 }
8279
8280 /*
8281 =for apidoc newSVrv
8282
8283 Creates a new SV for the RV, C<rv>, to point to.  If C<rv> is not an RV then
8284 it will be upgraded to one.  If C<classname> is non-null then the new SV will
8285 be blessed in the specified package.  The new SV is returned and its
8286 reference count is 1.
8287
8288 =cut
8289 */
8290
8291 SV*
8292 Perl_newSVrv(pTHX_ SV *const rv, const char *const classname)
8293 {
8294     dVAR;
8295     SV *sv;
8296
8297     PERL_ARGS_ASSERT_NEWSVRV;
8298
8299     new_SV(sv);
8300
8301     SV_CHECK_THINKFIRST_COW_DROP(rv);
8302     (void)SvAMAGIC_off(rv);
8303
8304     if (SvTYPE(rv) >= SVt_PVMG) {
8305         const U32 refcnt = SvREFCNT(rv);
8306         SvREFCNT(rv) = 0;
8307         sv_clear(rv);
8308         SvFLAGS(rv) = 0;
8309         SvREFCNT(rv) = refcnt;
8310
8311         sv_upgrade(rv, SVt_IV);
8312     } else if (SvROK(rv)) {
8313         SvREFCNT_dec(SvRV(rv));
8314     } else {
8315         prepare_SV_for_RV(rv);
8316     }
8317
8318     SvOK_off(rv);
8319     SvRV_set(rv, sv);
8320     SvROK_on(rv);
8321
8322     if (classname) {
8323         HV* const stash = gv_stashpv(classname, GV_ADD);
8324         (void)sv_bless(rv, stash);
8325     }
8326     return sv;
8327 }
8328
8329 /*
8330 =for apidoc sv_setref_pv
8331
8332 Copies a pointer into a new SV, optionally blessing the SV.  The C<rv>
8333 argument will be upgraded to an RV.  That RV will be modified to point to
8334 the new SV.  If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
8335 into the SV.  The C<classname> argument indicates the package for the
8336 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
8337 will have a reference count of 1, and the RV will be returned.
8338
8339 Do not use with other Perl types such as HV, AV, SV, CV, because those
8340 objects will become corrupted by the pointer copy process.
8341
8342 Note that C<sv_setref_pvn> copies the string while this copies the pointer.
8343
8344 =cut
8345 */
8346
8347 SV*
8348 Perl_sv_setref_pv(pTHX_ SV *const rv, const char *const classname, void *const pv)
8349 {
8350     dVAR;
8351
8352     PERL_ARGS_ASSERT_SV_SETREF_PV;
8353
8354     if (!pv) {
8355         sv_setsv(rv, &PL_sv_undef);
8356         SvSETMAGIC(rv);
8357     }
8358     else
8359         sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
8360     return rv;
8361 }
8362
8363 /*
8364 =for apidoc sv_setref_iv
8365
8366 Copies an integer into a new SV, optionally blessing the SV.  The C<rv>
8367 argument will be upgraded to an RV.  That RV will be modified to point to
8368 the new SV.  The C<classname> argument indicates the package for the
8369 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
8370 will have a reference count of 1, and the RV will be returned.
8371
8372 =cut
8373 */
8374
8375 SV*
8376 Perl_sv_setref_iv(pTHX_ SV *const rv, const char *const classname, const IV iv)
8377 {
8378     PERL_ARGS_ASSERT_SV_SETREF_IV;
8379
8380     sv_setiv(newSVrv(rv,classname), iv);
8381     return rv;
8382 }
8383
8384 /*
8385 =for apidoc sv_setref_uv
8386
8387 Copies an unsigned integer into a new SV, optionally blessing the SV.  The C<rv>
8388 argument will be upgraded to an RV.  That RV will be modified to point to
8389 the new SV.  The C<classname> argument indicates the package for the
8390 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
8391 will have a reference count of 1, and the RV will be returned.
8392
8393 =cut
8394 */
8395
8396 SV*
8397 Perl_sv_setref_uv(pTHX_ SV *const rv, const char *const classname, const UV uv)
8398 {
8399     PERL_ARGS_ASSERT_SV_SETREF_UV;
8400
8401     sv_setuv(newSVrv(rv,classname), uv);
8402     return rv;
8403 }
8404
8405 /*
8406 =for apidoc sv_setref_nv
8407
8408 Copies a double into a new SV, optionally blessing the SV.  The C<rv>
8409 argument will be upgraded to an RV.  That RV will be modified to point to
8410 the new SV.  The C<classname> argument indicates the package for the
8411 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
8412 will have a reference count of 1, and the RV will be returned.
8413
8414 =cut
8415 */
8416
8417 SV*
8418 Perl_sv_setref_nv(pTHX_ SV *const rv, const char *const classname, const NV nv)
8419 {
8420     PERL_ARGS_ASSERT_SV_SETREF_NV;
8421
8422     sv_setnv(newSVrv(rv,classname), nv);
8423     return rv;
8424 }
8425
8426 /*
8427 =for apidoc sv_setref_pvn
8428
8429 Copies a string into a new SV, optionally blessing the SV.  The length of the
8430 string must be specified with C<n>.  The C<rv> argument will be upgraded to
8431 an RV.  That RV will be modified to point to the new SV.  The C<classname>
8432 argument indicates the package for the blessing.  Set C<classname> to
8433 C<NULL> to avoid the blessing.  The new SV will have a reference count
8434 of 1, and the RV will be returned.
8435
8436 Note that C<sv_setref_pv> copies the pointer while this copies the string.
8437
8438 =cut
8439 */
8440
8441 SV*
8442 Perl_sv_setref_pvn(pTHX_ SV *const rv, const char *const classname,
8443                    const char *const pv, const STRLEN n)
8444 {
8445     PERL_ARGS_ASSERT_SV_SETREF_PVN;
8446
8447     sv_setpvn(newSVrv(rv,classname), pv, n);
8448     return rv;
8449 }
8450
8451 /*
8452 =for apidoc sv_bless
8453
8454 Blesses an SV into a specified package.  The SV must be an RV.  The package
8455 must be designated by its stash (see C<gv_stashpv()>).  The reference count
8456 of the SV is unaffected.
8457
8458 =cut
8459 */
8460
8461 SV*
8462 Perl_sv_bless(pTHX_ SV *const sv, HV *const stash)
8463 {
8464     dVAR;
8465     SV *tmpRef;
8466
8467     PERL_ARGS_ASSERT_SV_BLESS;
8468
8469     if (!SvROK(sv))
8470         Perl_croak(aTHX_ "Can't bless non-reference value");
8471     tmpRef = SvRV(sv);
8472     if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
8473         if (SvIsCOW(tmpRef))
8474             sv_force_normal_flags(tmpRef, 0);
8475         if (SvREADONLY(tmpRef))
8476             Perl_croak(aTHX_ PL_no_modify);
8477         if (SvOBJECT(tmpRef)) {
8478             if (SvTYPE(tmpRef) != SVt_PVIO)
8479                 --PL_sv_objcount;
8480             SvREFCNT_dec(SvSTASH(tmpRef));
8481         }
8482     }
8483     SvOBJECT_on(tmpRef);
8484     if (SvTYPE(tmpRef) != SVt_PVIO)
8485         ++PL_sv_objcount;
8486     SvUPGRADE(tmpRef, SVt_PVMG);
8487     SvSTASH_set(tmpRef, MUTABLE_HV(SvREFCNT_inc_simple(stash)));
8488
8489     if (Gv_AMG(stash))
8490         SvAMAGIC_on(sv);
8491     else
8492         (void)SvAMAGIC_off(sv);
8493
8494     if(SvSMAGICAL(tmpRef))
8495         if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
8496             mg_set(tmpRef);
8497
8498
8499
8500     return sv;
8501 }
8502
8503 /* Downgrades a PVGV to a PVMG.
8504  */
8505
8506 STATIC void
8507 S_sv_unglob(pTHX_ SV *const sv)
8508 {
8509     dVAR;
8510     void *xpvmg;
8511     HV *stash;
8512     SV * const temp = sv_newmortal();
8513
8514     PERL_ARGS_ASSERT_SV_UNGLOB;
8515
8516     assert(SvTYPE(sv) == SVt_PVGV);
8517     SvFAKE_off(sv);
8518     gv_efullname3(temp, MUTABLE_GV(sv), "*");
8519
8520     if (GvGP(sv)) {
8521         if(GvCVu((const GV *)sv) && (stash = GvSTASH(MUTABLE_GV(sv)))
8522            && HvNAME_get(stash))
8523             mro_method_changed_in(stash);
8524         gp_free(MUTABLE_GV(sv));
8525     }
8526     if (GvSTASH(sv)) {
8527         sv_del_backref(MUTABLE_SV(GvSTASH(sv)), sv);
8528         GvSTASH(sv) = NULL;
8529     }
8530     GvMULTI_off(sv);
8531     if (GvNAME_HEK(sv)) {
8532         unshare_hek(GvNAME_HEK(sv));
8533     }
8534     isGV_with_GP_off(sv);
8535
8536     /* need to keep SvANY(sv) in the right arena */
8537     xpvmg = new_XPVMG();
8538     StructCopy(SvANY(sv), xpvmg, XPVMG);
8539     del_XPVGV(SvANY(sv));
8540     SvANY(sv) = xpvmg;
8541
8542     SvFLAGS(sv) &= ~SVTYPEMASK;
8543     SvFLAGS(sv) |= SVt_PVMG;
8544
8545     /* Intentionally not calling any local SET magic, as this isn't so much a
8546        set operation as merely an internal storage change.  */
8547     sv_setsv_flags(sv, temp, 0);
8548 }
8549
8550 /*
8551 =for apidoc sv_unref_flags
8552
8553 Unsets the RV status of the SV, and decrements the reference count of
8554 whatever was being referenced by the RV.  This can almost be thought of
8555 as a reversal of C<newSVrv>.  The C<cflags> argument can contain
8556 C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
8557 (otherwise the decrementing is conditional on the reference count being
8558 different from one or the reference being a readonly SV).
8559 See C<SvROK_off>.
8560
8561 =cut
8562 */
8563
8564 void
8565 Perl_sv_unref_flags(pTHX_ SV *const ref, const U32 flags)
8566 {
8567     SV* const target = SvRV(ref);
8568
8569     PERL_ARGS_ASSERT_SV_UNREF_FLAGS;
8570
8571     if (SvWEAKREF(ref)) {
8572         sv_del_backref(target, ref);
8573         SvWEAKREF_off(ref);
8574         SvRV_set(ref, NULL);
8575         return;
8576     }
8577     SvRV_set(ref, NULL);
8578     SvROK_off(ref);
8579     /* You can't have a || SvREADONLY(target) here, as $a = $$a, where $a was
8580        assigned to as BEGIN {$a = \"Foo"} will fail.  */
8581     if (SvREFCNT(target) != 1 || (flags & SV_IMMEDIATE_UNREF))
8582         SvREFCNT_dec(target);
8583     else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
8584         sv_2mortal(target);     /* Schedule for freeing later */
8585 }
8586
8587 /*
8588 =for apidoc sv_untaint
8589
8590 Untaint an SV. Use C<SvTAINTED_off> instead.
8591 =cut
8592 */
8593
8594 void
8595 Perl_sv_untaint(pTHX_ SV *const sv)
8596 {
8597     PERL_ARGS_ASSERT_SV_UNTAINT;
8598
8599     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
8600         MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
8601         if (mg)
8602             mg->mg_len &= ~1;
8603     }
8604 }
8605
8606 /*
8607 =for apidoc sv_tainted
8608
8609 Test an SV for taintedness. Use C<SvTAINTED> instead.
8610 =cut
8611 */
8612
8613 bool
8614 Perl_sv_tainted(pTHX_ SV *const sv)
8615 {
8616     PERL_ARGS_ASSERT_SV_TAINTED;
8617
8618     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
8619         const MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
8620         if (mg && (mg->mg_len & 1) )
8621             return TRUE;
8622     }
8623     return FALSE;
8624 }
8625
8626 /*
8627 =for apidoc sv_setpviv
8628
8629 Copies an integer into the given SV, also updating its string value.
8630 Does not handle 'set' magic.  See C<sv_setpviv_mg>.
8631
8632 =cut
8633 */
8634
8635 void
8636 Perl_sv_setpviv(pTHX_ SV *const sv, const IV iv)
8637 {
8638     char buf[TYPE_CHARS(UV)];
8639     char *ebuf;
8640     char * const ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
8641
8642     PERL_ARGS_ASSERT_SV_SETPVIV;
8643
8644     sv_setpvn(sv, ptr, ebuf - ptr);
8645 }
8646
8647 /*
8648 =for apidoc sv_setpviv_mg
8649
8650 Like C<sv_setpviv>, but also handles 'set' magic.
8651
8652 =cut
8653 */
8654
8655 void
8656 Perl_sv_setpviv_mg(pTHX_ SV *const sv, const IV iv)
8657 {
8658     PERL_ARGS_ASSERT_SV_SETPVIV_MG;
8659
8660     sv_setpviv(sv, iv);
8661     SvSETMAGIC(sv);
8662 }
8663
8664 #if defined(PERL_IMPLICIT_CONTEXT)
8665
8666 /* pTHX_ magic can't cope with varargs, so this is a no-context
8667  * version of the main function, (which may itself be aliased to us).
8668  * Don't access this version directly.
8669  */
8670
8671 void
8672 Perl_sv_setpvf_nocontext(SV *const sv, const char *const pat, ...)
8673 {
8674     dTHX;
8675     va_list args;
8676
8677     PERL_ARGS_ASSERT_SV_SETPVF_NOCONTEXT;
8678
8679     va_start(args, pat);
8680     sv_vsetpvf(sv, pat, &args);
8681     va_end(args);
8682 }
8683
8684 /* pTHX_ magic can't cope with varargs, so this is a no-context
8685  * version of the main function, (which may itself be aliased to us).
8686  * Don't access this version directly.
8687  */
8688
8689 void
8690 Perl_sv_setpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
8691 {
8692     dTHX;
8693     va_list args;
8694
8695     PERL_ARGS_ASSERT_SV_SETPVF_MG_NOCONTEXT;
8696
8697     va_start(args, pat);
8698     sv_vsetpvf_mg(sv, pat, &args);
8699     va_end(args);
8700 }
8701 #endif
8702
8703 /*
8704 =for apidoc sv_setpvf
8705
8706 Works like C<sv_catpvf> but copies the text into the SV instead of
8707 appending it.  Does not handle 'set' magic.  See C<sv_setpvf_mg>.
8708
8709 =cut
8710 */
8711
8712 void
8713 Perl_sv_setpvf(pTHX_ SV *const sv, const char *const pat, ...)
8714 {
8715     va_list args;
8716
8717     PERL_ARGS_ASSERT_SV_SETPVF;
8718
8719     va_start(args, pat);
8720     sv_vsetpvf(sv, pat, &args);
8721     va_end(args);
8722 }
8723
8724 /*
8725 =for apidoc sv_vsetpvf
8726
8727 Works like C<sv_vcatpvf> but copies the text into the SV instead of
8728 appending it.  Does not handle 'set' magic.  See C<sv_vsetpvf_mg>.
8729
8730 Usually used via its frontend C<sv_setpvf>.
8731
8732 =cut
8733 */
8734
8735 void
8736 Perl_sv_vsetpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args)
8737 {
8738     PERL_ARGS_ASSERT_SV_VSETPVF;
8739
8740     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
8741 }
8742
8743 /*
8744 =for apidoc sv_setpvf_mg
8745
8746 Like C<sv_setpvf>, but also handles 'set' magic.
8747
8748 =cut
8749 */
8750
8751 void
8752 Perl_sv_setpvf_mg(pTHX_ SV *const sv, const char *const pat, ...)
8753 {
8754     va_list args;
8755
8756     PERL_ARGS_ASSERT_SV_SETPVF_MG;
8757
8758     va_start(args, pat);
8759     sv_vsetpvf_mg(sv, pat, &args);
8760     va_end(args);
8761 }
8762
8763 /*
8764 =for apidoc sv_vsetpvf_mg
8765
8766 Like C<sv_vsetpvf>, but also handles 'set' magic.
8767
8768 Usually used via its frontend C<sv_setpvf_mg>.
8769
8770 =cut
8771 */
8772
8773 void
8774 Perl_sv_vsetpvf_mg(pTHX_ SV *const sv, const char *const pat, va_list *const args)
8775 {
8776     PERL_ARGS_ASSERT_SV_VSETPVF_MG;
8777
8778     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
8779     SvSETMAGIC(sv);
8780 }
8781
8782 #if defined(PERL_IMPLICIT_CONTEXT)
8783
8784 /* pTHX_ magic can't cope with varargs, so this is a no-context
8785  * version of the main function, (which may itself be aliased to us).
8786  * Don't access this version directly.
8787  */
8788
8789 void
8790 Perl_sv_catpvf_nocontext(SV *const sv, const char *const pat, ...)
8791 {
8792     dTHX;
8793     va_list args;
8794
8795     PERL_ARGS_ASSERT_SV_CATPVF_NOCONTEXT;
8796
8797     va_start(args, pat);
8798     sv_vcatpvf(sv, pat, &args);
8799     va_end(args);
8800 }
8801
8802 /* pTHX_ magic can't cope with varargs, so this is a no-context
8803  * version of the main function, (which may itself be aliased to us).
8804  * Don't access this version directly.
8805  */
8806
8807 void
8808 Perl_sv_catpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
8809 {
8810     dTHX;
8811     va_list args;
8812
8813     PERL_ARGS_ASSERT_SV_CATPVF_MG_NOCONTEXT;
8814
8815     va_start(args, pat);
8816     sv_vcatpvf_mg(sv, pat, &args);
8817     va_end(args);
8818 }
8819 #endif
8820
8821 /*
8822 =for apidoc sv_catpvf
8823
8824 Processes its arguments like C<sprintf> and appends the formatted
8825 output to an SV.  If the appended data contains "wide" characters
8826 (including, but not limited to, SVs with a UTF-8 PV formatted with %s,
8827 and characters >255 formatted with %c), the original SV might get
8828 upgraded to UTF-8.  Handles 'get' magic, but not 'set' magic.  See
8829 C<sv_catpvf_mg>. If the original SV was UTF-8, the pattern should be
8830 valid UTF-8; if the original SV was bytes, the pattern should be too.
8831
8832 =cut */
8833
8834 void
8835 Perl_sv_catpvf(pTHX_ SV *const sv, const char *const pat, ...)
8836 {
8837     va_list args;
8838
8839     PERL_ARGS_ASSERT_SV_CATPVF;
8840
8841     va_start(args, pat);
8842     sv_vcatpvf(sv, pat, &args);
8843     va_end(args);
8844 }
8845
8846 /*
8847 =for apidoc sv_vcatpvf
8848
8849 Processes its arguments like C<vsprintf> and appends the formatted output
8850 to an SV.  Does not handle 'set' magic.  See C<sv_vcatpvf_mg>.
8851
8852 Usually used via its frontend C<sv_catpvf>.
8853
8854 =cut
8855 */
8856
8857 void
8858 Perl_sv_vcatpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args)
8859 {
8860     PERL_ARGS_ASSERT_SV_VCATPVF;
8861
8862     sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
8863 }
8864
8865 /*
8866 =for apidoc sv_catpvf_mg
8867
8868 Like C<sv_catpvf>, but also handles 'set' magic.
8869
8870 =cut
8871 */
8872
8873 void
8874 Perl_sv_catpvf_mg(pTHX_ SV *const sv, const char *const pat, ...)
8875 {
8876     va_list args;
8877
8878     PERL_ARGS_ASSERT_SV_CATPVF_MG;
8879
8880     va_start(args, pat);
8881     sv_vcatpvf_mg(sv, pat, &args);
8882     va_end(args);
8883 }
8884
8885 /*
8886 =for apidoc sv_vcatpvf_mg
8887
8888 Like C<sv_vcatpvf>, but also handles 'set' magic.
8889
8890 Usually used via its frontend C<sv_catpvf_mg>.
8891
8892 =cut
8893 */
8894
8895 void
8896 Perl_sv_vcatpvf_mg(pTHX_ SV *const sv, const char *const pat, va_list *const args)
8897 {
8898     PERL_ARGS_ASSERT_SV_VCATPVF_MG;
8899
8900     sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
8901     SvSETMAGIC(sv);
8902 }
8903
8904 /*
8905 =for apidoc sv_vsetpvfn
8906
8907 Works like C<sv_vcatpvfn> but copies the text into the SV instead of
8908 appending it.
8909
8910 Usually used via one of its frontends C<sv_vsetpvf> and C<sv_vsetpvf_mg>.
8911
8912 =cut
8913 */
8914
8915 void
8916 Perl_sv_vsetpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
8917                  va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted)
8918 {
8919     PERL_ARGS_ASSERT_SV_VSETPVFN;
8920
8921     sv_setpvs(sv, "");
8922     sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
8923 }
8924
8925 STATIC I32
8926 S_expect_number(pTHX_ char **const pattern)
8927 {
8928     dVAR;
8929     I32 var = 0;
8930
8931     PERL_ARGS_ASSERT_EXPECT_NUMBER;
8932
8933     switch (**pattern) {
8934     case '1': case '2': case '3':
8935     case '4': case '5': case '6':
8936     case '7': case '8': case '9':
8937         var = *(*pattern)++ - '0';
8938         while (isDIGIT(**pattern)) {
8939             const I32 tmp = var * 10 + (*(*pattern)++ - '0');
8940             if (tmp < var)
8941                 Perl_croak(aTHX_ "Integer overflow in format string for %s", (PL_op ? OP_NAME(PL_op) : "sv_vcatpvfn"));
8942             var = tmp;
8943         }
8944     }
8945     return var;
8946 }
8947
8948 STATIC char *
8949 S_F0convert(NV nv, char *const endbuf, STRLEN *const len)
8950 {
8951     const int neg = nv < 0;
8952     UV uv;
8953
8954     PERL_ARGS_ASSERT_F0CONVERT;
8955
8956     if (neg)
8957         nv = -nv;
8958     if (nv < UV_MAX) {
8959         char *p = endbuf;
8960         nv += 0.5;
8961         uv = (UV)nv;
8962         if (uv & 1 && uv == nv)
8963             uv--;                       /* Round to even */
8964         do {
8965             const unsigned dig = uv % 10;
8966             *--p = '0' + dig;
8967         } while (uv /= 10);
8968         if (neg)
8969             *--p = '-';
8970         *len = endbuf - p;
8971         return p;
8972     }
8973     return NULL;
8974 }
8975
8976
8977 /*
8978 =for apidoc sv_vcatpvfn
8979
8980 Processes its arguments like C<vsprintf> and appends the formatted output
8981 to an SV.  Uses an array of SVs if the C style variable argument list is
8982 missing (NULL).  When running with taint checks enabled, indicates via
8983 C<maybe_tainted> if results are untrustworthy (often due to the use of
8984 locales).
8985
8986 Usually used via one of its frontends C<sv_vcatpvf> and C<sv_vcatpvf_mg>.
8987
8988 =cut
8989 */
8990
8991
8992 #define VECTORIZE_ARGS  vecsv = va_arg(*args, SV*);\
8993                         vecstr = (U8*)SvPV_const(vecsv,veclen);\
8994                         vec_utf8 = DO_UTF8(vecsv);
8995
8996 /* XXX maybe_tainted is never assigned to, so the doc above is lying. */
8997
8998 void
8999 Perl_sv_vcatpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
9000                  va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted)
9001 {
9002     dVAR;
9003     char *p;
9004     char *q;
9005     const char *patend;
9006     STRLEN origlen;
9007     I32 svix = 0;
9008     static const char nullstr[] = "(null)";
9009     SV *argsv = NULL;
9010     bool has_utf8 = DO_UTF8(sv);    /* has the result utf8? */
9011     const bool pat_utf8 = has_utf8; /* the pattern is in utf8? */
9012     SV *nsv = NULL;
9013     /* Times 4: a decimal digit takes more than 3 binary digits.
9014      * NV_DIG: mantissa takes than many decimal digits.
9015      * Plus 32: Playing safe. */
9016     char ebuf[IV_DIG * 4 + NV_DIG + 32];
9017     /* large enough for "%#.#f" --chip */
9018     /* what about long double NVs? --jhi */
9019
9020     PERL_ARGS_ASSERT_SV_VCATPVFN;
9021     PERL_UNUSED_ARG(maybe_tainted);
9022
9023     /* no matter what, this is a string now */
9024     (void)SvPV_force(sv, origlen);
9025
9026     /* special-case "", "%s", and "%-p" (SVf - see below) */
9027     if (patlen == 0)
9028         return;
9029     if (patlen == 2 && pat[0] == '%' && pat[1] == 's') {
9030         if (args) {
9031             const char * const s = va_arg(*args, char*);
9032             sv_catpv(sv, s ? s : nullstr);
9033         }
9034         else if (svix < svmax) {
9035             sv_catsv(sv, *svargs);
9036         }
9037         return;
9038     }
9039     if (args && patlen == 3 && pat[0] == '%' &&
9040                 pat[1] == '-' && pat[2] == 'p') {
9041         argsv = MUTABLE_SV(va_arg(*args, void*));
9042         sv_catsv(sv, argsv);
9043         return;
9044     }
9045
9046 #ifndef USE_LONG_DOUBLE
9047     /* special-case "%.<number>[gf]" */
9048     if ( !args && patlen <= 5 && pat[0] == '%' && pat[1] == '.'
9049          && (pat[patlen-1] == 'g' || pat[patlen-1] == 'f') ) {
9050         unsigned digits = 0;
9051         const char *pp;
9052
9053         pp = pat + 2;
9054         while (*pp >= '0' && *pp <= '9')
9055             digits = 10 * digits + (*pp++ - '0');
9056         if (pp - pat == (int)patlen - 1) {
9057             NV nv;
9058
9059             if (svix < svmax)
9060                 nv = SvNV(*svargs);
9061             else
9062                 return;
9063             if (*pp == 'g') {
9064                 /* Add check for digits != 0 because it seems that some
9065                    gconverts are buggy in this case, and we don't yet have
9066                    a Configure test for this.  */
9067                 if (digits && digits < sizeof(ebuf) - NV_DIG - 10) {
9068                      /* 0, point, slack */
9069                     Gconvert(nv, (int)digits, 0, ebuf);
9070                     sv_catpv(sv, ebuf);
9071                     if (*ebuf)  /* May return an empty string for digits==0 */
9072                         return;
9073                 }
9074             } else if (!digits) {
9075                 STRLEN l;
9076
9077                 if ((p = F0convert(nv, ebuf + sizeof ebuf, &l))) {
9078                     sv_catpvn(sv, p, l);
9079                     return;
9080                 }
9081             }
9082         }
9083     }
9084 #endif /* !USE_LONG_DOUBLE */
9085
9086     if (!args && svix < svmax && DO_UTF8(*svargs))
9087         has_utf8 = TRUE;
9088
9089     patend = (char*)pat + patlen;
9090     for (p = (char*)pat; p < patend; p = q) {
9091         bool alt = FALSE;
9092         bool left = FALSE;
9093         bool vectorize = FALSE;
9094         bool vectorarg = FALSE;
9095         bool vec_utf8 = FALSE;
9096         char fill = ' ';
9097         char plus = 0;
9098         char intsize = 0;
9099         STRLEN width = 0;
9100         STRLEN zeros = 0;
9101         bool has_precis = FALSE;
9102         STRLEN precis = 0;
9103         const I32 osvix = svix;
9104         bool is_utf8 = FALSE;  /* is this item utf8?   */
9105 #ifdef HAS_LDBL_SPRINTF_BUG
9106         /* This is to try to fix a bug with irix/nonstop-ux/powerux and
9107            with sfio - Allen <allens@cpan.org> */
9108         bool fix_ldbl_sprintf_bug = FALSE;
9109 #endif
9110
9111         char esignbuf[4];
9112         U8 utf8buf[UTF8_MAXBYTES+1];
9113         STRLEN esignlen = 0;
9114
9115         const char *eptr = NULL;
9116         STRLEN elen = 0;
9117         SV *vecsv = NULL;
9118         const U8 *vecstr = NULL;
9119         STRLEN veclen = 0;
9120         char c = 0;
9121         int i;
9122         unsigned base = 0;
9123         IV iv = 0;
9124         UV uv = 0;
9125         /* we need a long double target in case HAS_LONG_DOUBLE but
9126            not USE_LONG_DOUBLE
9127         */
9128 #if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
9129         long double nv;
9130 #else
9131         NV nv;
9132 #endif
9133         STRLEN have;
9134         STRLEN need;
9135         STRLEN gap;
9136         const char *dotstr = ".";
9137         STRLEN dotstrlen = 1;
9138         I32 efix = 0; /* explicit format parameter index */
9139         I32 ewix = 0; /* explicit width index */
9140         I32 epix = 0; /* explicit precision index */
9141         I32 evix = 0; /* explicit vector index */
9142         bool asterisk = FALSE;
9143
9144         /* echo everything up to the next format specification */
9145         for (q = p; q < patend && *q != '%'; ++q) ;
9146         if (q > p) {
9147             if (has_utf8 && !pat_utf8)
9148                 sv_catpvn_utf8_upgrade(sv, p, q - p, nsv);
9149             else
9150                 sv_catpvn(sv, p, q - p);
9151             p = q;
9152         }
9153         if (q++ >= patend)
9154             break;
9155
9156 /*
9157     We allow format specification elements in this order:
9158         \d+\$              explicit format parameter index
9159         [-+ 0#]+           flags
9160         v|\*(\d+\$)?v      vector with optional (optionally specified) arg
9161         0                  flag (as above): repeated to allow "v02"     
9162         \d+|\*(\d+\$)?     width using optional (optionally specified) arg
9163         \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
9164         [hlqLV]            size
9165     [%bcdefginopsuxDFOUX] format (mandatory)
9166 */
9167
9168         if (args) {
9169 /*  
9170         As of perl5.9.3, printf format checking is on by default.
9171         Internally, perl uses %p formats to provide an escape to
9172         some extended formatting.  This block deals with those
9173         extensions: if it does not match, (char*)q is reset and
9174         the normal format processing code is used.
9175
9176         Currently defined extensions are:
9177                 %p              include pointer address (standard)      
9178                 %-p     (SVf)   include an SV (previously %_)
9179                 %-<num>p        include an SV with precision <num>      
9180                 %<num>p         reserved for future extensions
9181
9182         Robin Barker 2005-07-14
9183
9184                 %1p     (VDf)   removed.  RMB 2007-10-19
9185 */
9186             char* r = q; 
9187             bool sv = FALSE;    
9188             STRLEN n = 0;
9189             if (*q == '-')
9190                 sv = *q++;
9191             n = expect_number(&q);
9192             if (*q++ == 'p') {
9193                 if (sv) {                       /* SVf */
9194                     if (n) {
9195                         precis = n;
9196                         has_precis = TRUE;
9197                     }
9198                     argsv = MUTABLE_SV(va_arg(*args, void*));
9199                     eptr = SvPV_const(argsv, elen);
9200                     if (DO_UTF8(argsv))
9201                         is_utf8 = TRUE;
9202                     goto string;
9203                 }
9204                 else if (n) {
9205                     if (ckWARN_d(WARN_INTERNAL))
9206                         Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
9207                         "internal %%<num>p might conflict with future printf extensions");
9208                 }
9209             }
9210             q = r; 
9211         }
9212
9213         if ( (width = expect_number(&q)) ) {
9214             if (*q == '$') {
9215                 ++q;
9216                 efix = width;
9217             } else {
9218                 goto gotwidth;
9219             }
9220         }
9221
9222         /* FLAGS */
9223
9224         while (*q) {
9225             switch (*q) {
9226             case ' ':
9227             case '+':
9228                 if (plus == '+' && *q == ' ') /* '+' over ' ' */
9229                     q++;
9230                 else
9231                     plus = *q++;
9232                 continue;
9233
9234             case '-':
9235                 left = TRUE;
9236                 q++;
9237                 continue;
9238
9239             case '0':
9240                 fill = *q++;
9241                 continue;
9242
9243             case '#':
9244                 alt = TRUE;
9245                 q++;
9246                 continue;
9247
9248             default:
9249                 break;
9250             }
9251             break;
9252         }
9253
9254       tryasterisk:
9255         if (*q == '*') {
9256             q++;
9257             if ( (ewix = expect_number(&q)) )
9258                 if (*q++ != '$')
9259                     goto unknown;
9260             asterisk = TRUE;
9261         }
9262         if (*q == 'v') {
9263             q++;
9264             if (vectorize)
9265                 goto unknown;
9266             if ((vectorarg = asterisk)) {
9267                 evix = ewix;
9268                 ewix = 0;
9269                 asterisk = FALSE;
9270             }
9271             vectorize = TRUE;
9272             goto tryasterisk;
9273         }
9274
9275         if (!asterisk)
9276         {
9277             if( *q == '0' )
9278                 fill = *q++;
9279             width = expect_number(&q);
9280         }
9281
9282         if (vectorize) {
9283             if (vectorarg) {
9284                 if (args)
9285                     vecsv = va_arg(*args, SV*);
9286                 else if (evix) {
9287                     vecsv = (evix > 0 && evix <= svmax)
9288                         ? svargs[evix-1] : &PL_sv_undef;
9289                 } else {
9290                     vecsv = svix < svmax ? svargs[svix++] : &PL_sv_undef;
9291                 }
9292                 dotstr = SvPV_const(vecsv, dotstrlen);
9293                 /* Keep the DO_UTF8 test *after* the SvPV call, else things go
9294                    bad with tied or overloaded values that return UTF8.  */
9295                 if (DO_UTF8(vecsv))
9296                     is_utf8 = TRUE;
9297                 else if (has_utf8) {
9298                     vecsv = sv_mortalcopy(vecsv);
9299                     sv_utf8_upgrade(vecsv);
9300                     dotstr = SvPV_const(vecsv, dotstrlen);
9301                     is_utf8 = TRUE;
9302                 }                   
9303             }
9304             if (args) {
9305                 VECTORIZE_ARGS
9306             }
9307             else if (efix ? (efix > 0 && efix <= svmax) : svix < svmax) {
9308                 vecsv = svargs[efix ? efix-1 : svix++];
9309                 vecstr = (U8*)SvPV_const(vecsv,veclen);
9310                 vec_utf8 = DO_UTF8(vecsv);
9311
9312                 /* if this is a version object, we need to convert
9313                  * back into v-string notation and then let the
9314                  * vectorize happen normally
9315                  */
9316                 if (sv_derived_from(vecsv, "version")) {
9317                     char *version = savesvpv(vecsv);
9318                     if ( hv_exists(MUTABLE_HV(SvRV(vecsv)), "alpha", 5 ) ) {
9319                         Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
9320                         "vector argument not supported with alpha versions");
9321                         goto unknown;
9322                     }
9323                     vecsv = sv_newmortal();
9324                     scan_vstring(version, version + veclen, vecsv);
9325                     vecstr = (U8*)SvPV_const(vecsv, veclen);
9326                     vec_utf8 = DO_UTF8(vecsv);
9327                     Safefree(version);
9328                 }
9329             }
9330             else {
9331                 vecstr = (U8*)"";
9332                 veclen = 0;
9333             }
9334         }
9335
9336         if (asterisk) {
9337             if (args)
9338                 i = va_arg(*args, int);
9339             else
9340                 i = (ewix ? ewix <= svmax : svix < svmax) ?
9341                     SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
9342             left |= (i < 0);
9343             width = (i < 0) ? -i : i;
9344         }
9345       gotwidth:
9346
9347         /* PRECISION */
9348
9349         if (*q == '.') {
9350             q++;
9351             if (*q == '*') {
9352                 q++;
9353                 if ( ((epix = expect_number(&q))) && (*q++ != '$') )
9354                     goto unknown;
9355                 /* XXX: todo, support specified precision parameter */
9356                 if (epix)
9357                     goto unknown;
9358                 if (args)
9359                     i = va_arg(*args, int);
9360                 else
9361                     i = (ewix ? ewix <= svmax : svix < svmax)
9362                         ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
9363                 precis = i;
9364                 has_precis = !(i < 0);
9365             }
9366             else {
9367                 precis = 0;
9368                 while (isDIGIT(*q))
9369                     precis = precis * 10 + (*q++ - '0');
9370                 has_precis = TRUE;
9371             }
9372         }
9373
9374         /* SIZE */
9375
9376         switch (*q) {
9377 #ifdef WIN32
9378         case 'I':                       /* Ix, I32x, and I64x */
9379 #  ifdef WIN64
9380             if (q[1] == '6' && q[2] == '4') {
9381                 q += 3;
9382                 intsize = 'q';
9383                 break;
9384             }
9385 #  endif
9386             if (q[1] == '3' && q[2] == '2') {
9387                 q += 3;
9388                 break;
9389             }
9390 #  ifdef WIN64
9391             intsize = 'q';
9392 #  endif
9393             q++;
9394             break;
9395 #endif
9396 #if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
9397         case 'L':                       /* Ld */
9398             /*FALLTHROUGH*/
9399 #ifdef HAS_QUAD
9400         case 'q':                       /* qd */
9401 #endif
9402             intsize = 'q';
9403             q++;
9404             break;
9405 #endif
9406         case 'l':
9407 #if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
9408             if (*(q + 1) == 'l') {      /* lld, llf */
9409                 intsize = 'q';
9410                 q += 2;
9411                 break;
9412              }
9413 #endif
9414             /*FALLTHROUGH*/
9415         case 'h':
9416             /*FALLTHROUGH*/
9417         case 'V':
9418             intsize = *q++;
9419             break;
9420         }
9421
9422         /* CONVERSION */
9423
9424         if (*q == '%') {
9425             eptr = q++;
9426             elen = 1;
9427             if (vectorize) {
9428                 c = '%';
9429                 goto unknown;
9430             }
9431             goto string;
9432         }
9433
9434         if (!vectorize && !args) {
9435             if (efix) {
9436                 const I32 i = efix-1;
9437                 argsv = (i >= 0 && i < svmax) ? svargs[i] : &PL_sv_undef;
9438             } else {
9439                 argsv = (svix >= 0 && svix < svmax)
9440                     ? svargs[svix++] : &PL_sv_undef;
9441             }
9442         }
9443
9444         switch (c = *q++) {
9445
9446             /* STRINGS */
9447
9448         case 'c':
9449             if (vectorize)
9450                 goto unknown;
9451             uv = (args) ? va_arg(*args, int) : SvIV(argsv);
9452             if ((uv > 255 ||
9453                  (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
9454                 && !IN_BYTES) {
9455                 eptr = (char*)utf8buf;
9456                 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
9457                 is_utf8 = TRUE;
9458             }
9459             else {
9460                 c = (char)uv;
9461                 eptr = &c;
9462                 elen = 1;
9463             }
9464             goto string;
9465
9466         case 's':
9467             if (vectorize)
9468                 goto unknown;
9469             if (args) {
9470                 eptr = va_arg(*args, char*);
9471                 if (eptr)
9472 #ifdef MACOS_TRADITIONAL
9473                   /* On MacOS, %#s format is used for Pascal strings */
9474                   if (alt)
9475                     elen = *eptr++;
9476                   else
9477 #endif
9478                     elen = strlen(eptr);
9479                 else {
9480                     eptr = (char *)nullstr;
9481                     elen = sizeof nullstr - 1;
9482                 }
9483             }
9484             else {
9485                 eptr = SvPV_const(argsv, elen);
9486                 if (DO_UTF8(argsv)) {
9487                     I32 old_precis = precis;
9488                     if (has_precis && precis < elen) {
9489                         I32 p = precis;
9490                         sv_pos_u2b(argsv, &p, 0); /* sticks at end */
9491                         precis = p;
9492                     }
9493                     if (width) { /* fudge width (can't fudge elen) */
9494                         if (has_precis && precis < elen)
9495                             width += precis - old_precis;
9496                         else
9497                             width += elen - sv_len_utf8(argsv);
9498                     }
9499                     is_utf8 = TRUE;
9500                 }
9501             }
9502
9503         string:
9504             if (has_precis && elen > precis)
9505                 elen = precis;
9506             break;
9507
9508             /* INTEGERS */
9509
9510         case 'p':
9511             if (alt || vectorize)
9512                 goto unknown;
9513             uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
9514             base = 16;
9515             goto integer;
9516
9517         case 'D':
9518 #ifdef IV_IS_QUAD
9519             intsize = 'q';
9520 #else
9521             intsize = 'l';
9522 #endif
9523             /*FALLTHROUGH*/
9524         case 'd':
9525         case 'i':
9526 #if vdNUMBER
9527         format_vd:
9528 #endif
9529             if (vectorize) {
9530                 STRLEN ulen;
9531                 if (!veclen)
9532                     continue;
9533                 if (vec_utf8)
9534                     uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9535                                         UTF8_ALLOW_ANYUV);
9536                 else {
9537                     uv = *vecstr;
9538                     ulen = 1;
9539                 }
9540                 vecstr += ulen;
9541                 veclen -= ulen;
9542                 if (plus)
9543                      esignbuf[esignlen++] = plus;
9544             }
9545             else if (args) {
9546                 switch (intsize) {
9547                 case 'h':       iv = (short)va_arg(*args, int); break;
9548                 case 'l':       iv = va_arg(*args, long); break;
9549                 case 'V':       iv = va_arg(*args, IV); break;
9550                 default:        iv = va_arg(*args, int); break;
9551 #ifdef HAS_QUAD
9552                 case 'q':       iv = va_arg(*args, Quad_t); break;
9553 #endif
9554                 }
9555             }
9556             else {
9557                 IV tiv = SvIV(argsv); /* work around GCC bug #13488 */
9558                 switch (intsize) {
9559                 case 'h':       iv = (short)tiv; break;
9560                 case 'l':       iv = (long)tiv; break;
9561                 case 'V':
9562                 default:        iv = tiv; break;
9563 #ifdef HAS_QUAD
9564                 case 'q':       iv = (Quad_t)tiv; break;
9565 #endif
9566                 }
9567             }
9568             if ( !vectorize )   /* we already set uv above */
9569             {
9570                 if (iv >= 0) {
9571                     uv = iv;
9572                     if (plus)
9573                         esignbuf[esignlen++] = plus;
9574                 }
9575                 else {
9576                     uv = -iv;
9577                     esignbuf[esignlen++] = '-';
9578                 }
9579             }
9580             base = 10;
9581             goto integer;
9582
9583         case 'U':
9584 #ifdef IV_IS_QUAD
9585             intsize = 'q';
9586 #else
9587             intsize = 'l';
9588 #endif
9589             /*FALLTHROUGH*/
9590         case 'u':
9591             base = 10;
9592             goto uns_integer;
9593
9594         case 'B':
9595         case 'b':
9596             base = 2;
9597             goto uns_integer;
9598
9599         case 'O':
9600 #ifdef IV_IS_QUAD
9601             intsize = 'q';
9602 #else
9603             intsize = 'l';
9604 #endif
9605             /*FALLTHROUGH*/
9606         case 'o':
9607             base = 8;
9608             goto uns_integer;
9609
9610         case 'X':
9611         case 'x':
9612             base = 16;
9613
9614         uns_integer:
9615             if (vectorize) {
9616                 STRLEN ulen;
9617         vector:
9618                 if (!veclen)
9619                     continue;
9620                 if (vec_utf8)
9621                     uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9622                                         UTF8_ALLOW_ANYUV);
9623                 else {
9624                     uv = *vecstr;
9625                     ulen = 1;
9626                 }
9627                 vecstr += ulen;
9628                 veclen -= ulen;
9629             }
9630             else if (args) {
9631                 switch (intsize) {
9632                 case 'h':  uv = (unsigned short)va_arg(*args, unsigned); break;
9633                 case 'l':  uv = va_arg(*args, unsigned long); break;
9634                 case 'V':  uv = va_arg(*args, UV); break;
9635                 default:   uv = va_arg(*args, unsigned); break;
9636 #ifdef HAS_QUAD
9637                 case 'q':  uv = va_arg(*args, Uquad_t); break;
9638 #endif
9639                 }
9640             }
9641             else {
9642                 UV tuv = SvUV(argsv); /* work around GCC bug #13488 */
9643                 switch (intsize) {
9644                 case 'h':       uv = (unsigned short)tuv; break;
9645                 case 'l':       uv = (unsigned long)tuv; break;
9646                 case 'V':
9647                 default:        uv = tuv; break;
9648 #ifdef HAS_QUAD
9649                 case 'q':       uv = (Uquad_t)tuv; break;
9650 #endif
9651                 }
9652             }
9653
9654         integer:
9655             {
9656                 char *ptr = ebuf + sizeof ebuf;
9657                 bool tempalt = uv ? alt : FALSE; /* Vectors can't change alt */
9658                 zeros = 0;
9659
9660                 switch (base) {
9661                     unsigned dig;
9662                 case 16:
9663                     p = (char *)((c == 'X') ? PL_hexdigit + 16 : PL_hexdigit);
9664                     do {
9665                         dig = uv & 15;
9666                         *--ptr = p[dig];
9667                     } while (uv >>= 4);
9668                     if (tempalt) {
9669                         esignbuf[esignlen++] = '0';
9670                         esignbuf[esignlen++] = c;  /* 'x' or 'X' */
9671                     }
9672                     break;
9673                 case 8:
9674                     do {
9675                         dig = uv & 7;
9676                         *--ptr = '0' + dig;
9677                     } while (uv >>= 3);
9678                     if (alt && *ptr != '0')
9679                         *--ptr = '0';
9680                     break;
9681                 case 2:
9682                     do {
9683                         dig = uv & 1;
9684                         *--ptr = '0' + dig;
9685                     } while (uv >>= 1);
9686                     if (tempalt) {
9687                         esignbuf[esignlen++] = '0';
9688                         esignbuf[esignlen++] = c;
9689                     }
9690                     break;
9691                 default:                /* it had better be ten or less */
9692                     do {
9693                         dig = uv % base;
9694                         *--ptr = '0' + dig;
9695                     } while (uv /= base);
9696                     break;
9697                 }
9698                 elen = (ebuf + sizeof ebuf) - ptr;
9699                 eptr = ptr;
9700                 if (has_precis) {
9701                     if (precis > elen)
9702                         zeros = precis - elen;
9703                     else if (precis == 0 && elen == 1 && *eptr == '0'
9704                              && !(base == 8 && alt)) /* "%#.0o" prints "0" */
9705                         elen = 0;
9706
9707                 /* a precision nullifies the 0 flag. */
9708                     if (fill == '0')
9709                         fill = ' ';
9710                 }
9711             }
9712             break;
9713
9714             /* FLOATING POINT */
9715
9716         case 'F':
9717             c = 'f';            /* maybe %F isn't supported here */
9718             /*FALLTHROUGH*/
9719         case 'e': case 'E':
9720         case 'f':
9721         case 'g': case 'G':
9722             if (vectorize)
9723                 goto unknown;
9724
9725             /* This is evil, but floating point is even more evil */
9726
9727             /* for SV-style calling, we can only get NV
9728                for C-style calling, we assume %f is double;
9729                for simplicity we allow any of %Lf, %llf, %qf for long double
9730             */
9731             switch (intsize) {
9732             case 'V':
9733 #if defined(USE_LONG_DOUBLE)
9734                 intsize = 'q';
9735 #endif
9736                 break;
9737 /* [perl #20339] - we should accept and ignore %lf rather than die */
9738             case 'l':
9739                 /*FALLTHROUGH*/
9740             default:
9741 #if defined(USE_LONG_DOUBLE)
9742                 intsize = args ? 0 : 'q';
9743 #endif
9744                 break;
9745             case 'q':
9746 #if defined(HAS_LONG_DOUBLE)
9747                 break;
9748 #else
9749                 /*FALLTHROUGH*/
9750 #endif
9751             case 'h':
9752                 goto unknown;
9753             }
9754
9755             /* now we need (long double) if intsize == 'q', else (double) */
9756             nv = (args) ?
9757 #if LONG_DOUBLESIZE > DOUBLESIZE
9758                 intsize == 'q' ?
9759                     va_arg(*args, long double) :
9760                     va_arg(*args, double)
9761 #else
9762                     va_arg(*args, double)
9763 #endif
9764                 : SvNV(argsv);
9765
9766             need = 0;
9767             /* nv * 0 will be NaN for NaN, +Inf and -Inf, and 0 for anything
9768                else. frexp() has some unspecified behaviour for those three */
9769             if (c != 'e' && c != 'E' && (nv * 0) == 0) {
9770                 i = PERL_INT_MIN;
9771                 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
9772                    will cast our (long double) to (double) */
9773                 (void)Perl_frexp(nv, &i);
9774                 if (i == PERL_INT_MIN)
9775                     Perl_die(aTHX_ "panic: frexp");
9776                 if (i > 0)
9777                     need = BIT_DIGITS(i);
9778             }
9779             need += has_precis ? precis : 6; /* known default */
9780
9781             if (need < width)
9782                 need = width;
9783
9784 #ifdef HAS_LDBL_SPRINTF_BUG
9785             /* This is to try to fix a bug with irix/nonstop-ux/powerux and
9786                with sfio - Allen <allens@cpan.org> */
9787
9788 #  ifdef DBL_MAX
9789 #    define MY_DBL_MAX DBL_MAX
9790 #  else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
9791 #    if DOUBLESIZE >= 8
9792 #      define MY_DBL_MAX 1.7976931348623157E+308L
9793 #    else
9794 #      define MY_DBL_MAX 3.40282347E+38L
9795 #    endif
9796 #  endif
9797
9798 #  ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
9799 #    define MY_DBL_MAX_BUG 1L
9800 #  else
9801 #    define MY_DBL_MAX_BUG MY_DBL_MAX
9802 #  endif
9803
9804 #  ifdef DBL_MIN
9805 #    define MY_DBL_MIN DBL_MIN
9806 #  else  /* XXX guessing! -Allen */
9807 #    if DOUBLESIZE >= 8
9808 #      define MY_DBL_MIN 2.2250738585072014E-308L
9809 #    else
9810 #      define MY_DBL_MIN 1.17549435E-38L
9811 #    endif
9812 #  endif
9813
9814             if ((intsize == 'q') && (c == 'f') &&
9815                 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
9816                 (need < DBL_DIG)) {
9817                 /* it's going to be short enough that
9818                  * long double precision is not needed */
9819
9820                 if ((nv <= 0L) && (nv >= -0L))
9821                     fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
9822                 else {
9823                     /* would use Perl_fp_class as a double-check but not
9824                      * functional on IRIX - see perl.h comments */
9825
9826                     if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
9827                         /* It's within the range that a double can represent */
9828 #if defined(DBL_MAX) && !defined(DBL_MIN)
9829                         if ((nv >= ((long double)1/DBL_MAX)) ||
9830                             (nv <= (-(long double)1/DBL_MAX)))
9831 #endif
9832                         fix_ldbl_sprintf_bug = TRUE;
9833                     }
9834                 }
9835                 if (fix_ldbl_sprintf_bug == TRUE) {
9836                     double temp;
9837
9838                     intsize = 0;
9839                     temp = (double)nv;
9840                     nv = (NV)temp;
9841                 }
9842             }
9843
9844 #  undef MY_DBL_MAX
9845 #  undef MY_DBL_MAX_BUG
9846 #  undef MY_DBL_MIN
9847
9848 #endif /* HAS_LDBL_SPRINTF_BUG */
9849
9850             need += 20; /* fudge factor */
9851             if (PL_efloatsize < need) {
9852                 Safefree(PL_efloatbuf);
9853                 PL_efloatsize = need + 20; /* more fudge */
9854                 Newx(PL_efloatbuf, PL_efloatsize, char);
9855                 PL_efloatbuf[0] = '\0';
9856             }
9857
9858             if ( !(width || left || plus || alt) && fill != '0'
9859                  && has_precis && intsize != 'q' ) {    /* Shortcuts */
9860                 /* See earlier comment about buggy Gconvert when digits,
9861                    aka precis is 0  */
9862                 if ( c == 'g' && precis) {
9863                     Gconvert((NV)nv, (int)precis, 0, PL_efloatbuf);
9864                     /* May return an empty string for digits==0 */
9865                     if (*PL_efloatbuf) {
9866                         elen = strlen(PL_efloatbuf);
9867                         goto float_converted;
9868                     }
9869                 } else if ( c == 'f' && !precis) {
9870                     if ((eptr = F0convert(nv, ebuf + sizeof ebuf, &elen)))
9871                         break;
9872                 }
9873             }
9874             {
9875                 char *ptr = ebuf + sizeof ebuf;
9876                 *--ptr = '\0';
9877                 *--ptr = c;
9878                 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
9879 #if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
9880                 if (intsize == 'q') {
9881                     /* Copy the one or more characters in a long double
9882                      * format before the 'base' ([efgEFG]) character to
9883                      * the format string. */
9884                     static char const prifldbl[] = PERL_PRIfldbl;
9885                     char const *p = prifldbl + sizeof(prifldbl) - 3;
9886                     while (p >= prifldbl) { *--ptr = *p--; }
9887                 }
9888 #endif
9889                 if (has_precis) {
9890                     base = precis;
9891                     do { *--ptr = '0' + (base % 10); } while (base /= 10);
9892                     *--ptr = '.';
9893                 }
9894                 if (width) {
9895                     base = width;
9896                     do { *--ptr = '0' + (base % 10); } while (base /= 10);
9897                 }
9898                 if (fill == '0')
9899                     *--ptr = fill;
9900                 if (left)
9901                     *--ptr = '-';
9902                 if (plus)
9903                     *--ptr = plus;
9904                 if (alt)
9905                     *--ptr = '#';
9906                 *--ptr = '%';
9907
9908                 /* No taint.  Otherwise we are in the strange situation
9909                  * where printf() taints but print($float) doesn't.
9910                  * --jhi */
9911 #if defined(HAS_LONG_DOUBLE)
9912                 elen = ((intsize == 'q')
9913                         ? my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, nv)
9914                         : my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, (double)nv));
9915 #else
9916                 elen = my_sprintf(PL_efloatbuf, ptr, nv);
9917 #endif
9918             }
9919         float_converted:
9920             eptr = PL_efloatbuf;
9921             break;
9922
9923             /* SPECIAL */
9924
9925         case 'n':
9926             if (vectorize)
9927                 goto unknown;
9928             i = SvCUR(sv) - origlen;
9929             if (args) {
9930                 switch (intsize) {
9931                 case 'h':       *(va_arg(*args, short*)) = i; break;
9932                 default:        *(va_arg(*args, int*)) = i; break;
9933                 case 'l':       *(va_arg(*args, long*)) = i; break;
9934                 case 'V':       *(va_arg(*args, IV*)) = i; break;
9935 #ifdef HAS_QUAD
9936                 case 'q':       *(va_arg(*args, Quad_t*)) = i; break;
9937 #endif
9938                 }
9939             }
9940             else
9941                 sv_setuv_mg(argsv, (UV)i);
9942             continue;   /* not "break" */
9943
9944             /* UNKNOWN */
9945
9946         default:
9947       unknown:
9948             if (!args
9949                 && (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)
9950                 && ckWARN(WARN_PRINTF))
9951             {
9952                 SV * const msg = sv_newmortal();
9953                 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
9954                           (PL_op->op_type == OP_PRTF) ? "" : "s");
9955                 if (c) {
9956                     if (isPRINT(c))
9957                         Perl_sv_catpvf(aTHX_ msg,
9958                                        "\"%%%c\"", c & 0xFF);
9959                     else
9960                         Perl_sv_catpvf(aTHX_ msg,
9961                                        "\"%%\\%03"UVof"\"",
9962                                        (UV)c & 0xFF);
9963                 } else
9964                     sv_catpvs(msg, "end of string");
9965                 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, SVfARG(msg)); /* yes, this is reentrant */
9966             }
9967
9968             /* output mangled stuff ... */
9969             if (c == '\0')
9970                 --q;
9971             eptr = p;
9972             elen = q - p;
9973
9974             /* ... right here, because formatting flags should not apply */
9975             SvGROW(sv, SvCUR(sv) + elen + 1);
9976             p = SvEND(sv);
9977             Copy(eptr, p, elen, char);
9978             p += elen;
9979             *p = '\0';
9980             SvCUR_set(sv, p - SvPVX_const(sv));
9981             svix = osvix;
9982             continue;   /* not "break" */
9983         }
9984
9985         if (is_utf8 != has_utf8) {
9986             if (is_utf8) {
9987                 if (SvCUR(sv))
9988                     sv_utf8_upgrade(sv);
9989             }
9990             else {
9991                 const STRLEN old_elen = elen;
9992                 SV * const nsv = newSVpvn_flags(eptr, elen, SVs_TEMP);
9993                 sv_utf8_upgrade(nsv);
9994                 eptr = SvPVX_const(nsv);
9995                 elen = SvCUR(nsv);
9996
9997                 if (width) { /* fudge width (can't fudge elen) */
9998                     width += elen - old_elen;
9999                 }
10000                 is_utf8 = TRUE;
10001             }
10002         }
10003
10004         have = esignlen + zeros + elen;
10005         if (have < zeros)
10006             Perl_croak_nocontext(PL_memory_wrap);
10007
10008         need = (have > width ? have : width);
10009         gap = need - have;
10010
10011         if (need >= (((STRLEN)~0) - SvCUR(sv) - dotstrlen - 1))
10012             Perl_croak_nocontext(PL_memory_wrap);
10013         SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
10014         p = SvEND(sv);
10015         if (esignlen && fill == '0') {
10016             int i;
10017             for (i = 0; i < (int)esignlen; i++)
10018                 *p++ = esignbuf[i];
10019         }
10020         if (gap && !left) {
10021             memset(p, fill, gap);
10022             p += gap;
10023         }
10024         if (esignlen && fill != '0') {
10025             int i;
10026             for (i = 0; i < (int)esignlen; i++)
10027                 *p++ = esignbuf[i];
10028         }
10029         if (zeros) {
10030             int i;
10031             for (i = zeros; i; i--)
10032                 *p++ = '0';
10033         }
10034         if (elen) {
10035             Copy(eptr, p, elen, char);
10036             p += elen;
10037         }
10038         if (gap && left) {
10039             memset(p, ' ', gap);
10040             p += gap;
10041         }
10042         if (vectorize) {
10043             if (veclen) {
10044                 Copy(dotstr, p, dotstrlen, char);
10045                 p += dotstrlen;
10046             }
10047             else
10048                 vectorize = FALSE;              /* done iterating over vecstr */
10049         }
10050         if (is_utf8)
10051             has_utf8 = TRUE;
10052         if (has_utf8)
10053             SvUTF8_on(sv);
10054         *p = '\0';
10055         SvCUR_set(sv, p - SvPVX_const(sv));
10056         if (vectorize) {
10057             esignlen = 0;
10058             goto vector;
10059         }
10060     }
10061 }
10062
10063 /* =========================================================================
10064
10065 =head1 Cloning an interpreter
10066
10067 All the macros and functions in this section are for the private use of
10068 the main function, perl_clone().
10069
10070 The foo_dup() functions make an exact copy of an existing foo thingy.
10071 During the course of a cloning, a hash table is used to map old addresses
10072 to new addresses. The table is created and manipulated with the
10073 ptr_table_* functions.
10074
10075 =cut
10076
10077 ============================================================================*/
10078
10079
10080 #if defined(USE_ITHREADS)
10081
10082 /* XXX Remove this so it doesn't have to go thru the macro and return for nothing */
10083 #ifndef GpREFCNT_inc
10084 #  define GpREFCNT_inc(gp)      ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
10085 #endif
10086
10087
10088 /* Certain cases in Perl_ss_dup have been merged, by relying on the fact
10089    that currently av_dup, gv_dup and hv_dup are the same as sv_dup.
10090    If this changes, please unmerge ss_dup.  */
10091 #define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
10092 #define sv_dup_inc_NN(s,t)      SvREFCNT_inc_NN(sv_dup(s,t))
10093 #define av_dup(s,t)     MUTABLE_AV(sv_dup((const SV *)s,t))
10094 #define av_dup_inc(s,t) MUTABLE_AV(SvREFCNT_inc(sv_dup((const SV *)s,t)))
10095 #define hv_dup(s,t)     MUTABLE_HV(sv_dup((const SV *)s,t))
10096 #define hv_dup_inc(s,t) MUTABLE_HV(SvREFCNT_inc(sv_dup((const SV *)s,t)))
10097 #define cv_dup(s,t)     MUTABLE_CV(sv_dup((const SV *)s,t))
10098 #define cv_dup_inc(s,t) MUTABLE_CV(SvREFCNT_inc(sv_dup((const SV *)s,t)))
10099 #define io_dup(s,t)     MUTABLE_IO(sv_dup((const SV *)s,t))
10100 #define io_dup_inc(s,t) MUTABLE_IO(SvREFCNT_inc(sv_dup((const SV *)s,t)))
10101 #define gv_dup(s,t)     MUTABLE_GV(sv_dup((const SV *)s,t))
10102 #define gv_dup_inc(s,t) MUTABLE_GV(SvREFCNT_inc(sv_dup((const SV *)s,t)))
10103 #define SAVEPV(p)       ((p) ? savepv(p) : NULL)
10104 #define SAVEPVN(p,n)    ((p) ? savepvn(p,n) : NULL)
10105
10106 /* clone a parser */
10107
10108 yy_parser *
10109 Perl_parser_dup(pTHX_ const yy_parser *const proto, CLONE_PARAMS *const param)
10110 {
10111     yy_parser *parser;
10112
10113     PERL_ARGS_ASSERT_PARSER_DUP;
10114
10115     if (!proto)
10116         return NULL;
10117
10118     /* look for it in the table first */
10119     parser = (yy_parser *)ptr_table_fetch(PL_ptr_table, proto);
10120     if (parser)
10121         return parser;
10122
10123     /* create anew and remember what it is */
10124     Newxz(parser, 1, yy_parser);
10125     ptr_table_store(PL_ptr_table, proto, parser);
10126
10127     parser->yyerrstatus = 0;
10128     parser->yychar = YYEMPTY;           /* Cause a token to be read.  */
10129
10130     /* XXX these not yet duped */
10131     parser->old_parser = NULL;
10132     parser->stack = NULL;
10133     parser->ps = NULL;
10134     parser->stack_size = 0;
10135     /* XXX parser->stack->state = 0; */
10136
10137     /* XXX eventually, just Copy() most of the parser struct ? */
10138
10139     parser->lex_brackets = proto->lex_brackets;
10140     parser->lex_casemods = proto->lex_casemods;
10141     parser->lex_brackstack = savepvn(proto->lex_brackstack,
10142                     (proto->lex_brackets < 120 ? 120 : proto->lex_brackets));
10143     parser->lex_casestack = savepvn(proto->lex_casestack,
10144                     (proto->lex_casemods < 12 ? 12 : proto->lex_casemods));
10145     parser->lex_defer   = proto->lex_defer;
10146     parser->lex_dojoin  = proto->lex_dojoin;
10147     parser->lex_expect  = proto->lex_expect;
10148     parser->lex_formbrack = proto->lex_formbrack;
10149     parser->lex_inpat   = proto->lex_inpat;
10150     parser->lex_inwhat  = proto->lex_inwhat;
10151     parser->lex_op      = proto->lex_op;
10152     parser->lex_repl    = sv_dup_inc(proto->lex_repl, param);
10153     parser->lex_starts  = proto->lex_starts;
10154     parser->lex_stuff   = sv_dup_inc(proto->lex_stuff, param);
10155     parser->multi_close = proto->multi_close;
10156     parser->multi_open  = proto->multi_open;
10157     parser->multi_start = proto->multi_start;
10158     parser->multi_end   = proto->multi_end;
10159     parser->pending_ident = proto->pending_ident;
10160     parser->preambled   = proto->preambled;
10161     parser->sublex_info = proto->sublex_info; /* XXX not quite right */
10162     parser->linestr     = sv_dup_inc(proto->linestr, param);
10163     parser->expect      = proto->expect;
10164     parser->copline     = proto->copline;
10165     parser->last_lop_op = proto->last_lop_op;
10166     parser->lex_state   = proto->lex_state;
10167     parser->rsfp        = fp_dup(proto->rsfp, '<', param);
10168     /* rsfp_filters entries have fake IoDIRP() */
10169     parser->rsfp_filters= av_dup_inc(proto->rsfp_filters, param);
10170     parser->in_my       = proto->in_my;
10171     parser->in_my_stash = hv_dup(proto->in_my_stash, param);
10172     parser->error_count = proto->error_count;
10173
10174
10175     parser->linestr     = sv_dup_inc(proto->linestr, param);
10176
10177     {
10178         char * const ols = SvPVX(proto->linestr);
10179         char * const ls  = SvPVX(parser->linestr);
10180
10181         parser->bufptr      = ls + (proto->bufptr >= ols ?
10182                                     proto->bufptr -  ols : 0);
10183         parser->oldbufptr   = ls + (proto->oldbufptr >= ols ?
10184                                     proto->oldbufptr -  ols : 0);
10185         parser->oldoldbufptr= ls + (proto->oldoldbufptr >= ols ?
10186                                     proto->oldoldbufptr -  ols : 0);
10187         parser->linestart   = ls + (proto->linestart >= ols ?
10188                                     proto->linestart -  ols : 0);
10189         parser->last_uni    = ls + (proto->last_uni >= ols ?
10190                                     proto->last_uni -  ols : 0);
10191         parser->last_lop    = ls + (proto->last_lop >= ols ?
10192                                     proto->last_lop -  ols : 0);
10193
10194         parser->bufend      = ls + SvCUR(parser->linestr);
10195     }
10196
10197     Copy(proto->tokenbuf, parser->tokenbuf, 256, char);
10198
10199
10200 #ifdef PERL_MAD
10201     parser->endwhite    = proto->endwhite;
10202     parser->faketokens  = proto->faketokens;
10203     parser->lasttoke    = proto->lasttoke;
10204     parser->nextwhite   = proto->nextwhite;
10205     parser->realtokenstart = proto->realtokenstart;
10206     parser->skipwhite   = proto->skipwhite;
10207     parser->thisclose   = proto->thisclose;
10208     parser->thismad     = proto->thismad;
10209     parser->thisopen    = proto->thisopen;
10210     parser->thisstuff   = proto->thisstuff;
10211     parser->thistoken   = proto->thistoken;
10212     parser->thiswhite   = proto->thiswhite;
10213
10214     Copy(proto->nexttoke, parser->nexttoke, 5, NEXTTOKE);
10215     parser->curforce    = proto->curforce;
10216 #else
10217     Copy(proto->nextval, parser->nextval, 5, YYSTYPE);
10218     Copy(proto->nexttype, parser->nexttype, 5,  I32);
10219     parser->nexttoke    = proto->nexttoke;
10220 #endif
10221     return parser;
10222 }
10223
10224
10225 /* duplicate a file handle */
10226
10227 PerlIO *
10228 Perl_fp_dup(pTHX_ PerlIO *const fp, const char type, CLONE_PARAMS *const param)
10229 {
10230     PerlIO *ret;
10231
10232     PERL_ARGS_ASSERT_FP_DUP;
10233     PERL_UNUSED_ARG(type);
10234
10235     if (!fp)
10236         return (PerlIO*)NULL;
10237
10238     /* look for it in the table first */
10239     ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
10240     if (ret)
10241         return ret;
10242
10243     /* create anew and remember what it is */
10244     ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
10245     ptr_table_store(PL_ptr_table, fp, ret);
10246     return ret;
10247 }
10248
10249 /* duplicate a directory handle */
10250
10251 DIR *
10252 Perl_dirp_dup(pTHX_ DIR *const dp)
10253 {
10254     PERL_UNUSED_CONTEXT;
10255     if (!dp)
10256         return (DIR*)NULL;
10257     /* XXX TODO */
10258     return dp;
10259 }
10260
10261 /* duplicate a typeglob */
10262
10263 GP *
10264 Perl_gp_dup(pTHX_ GP *const gp, CLONE_PARAMS *const param)
10265 {
10266     GP *ret;
10267
10268     PERL_ARGS_ASSERT_GP_DUP;
10269
10270     if (!gp)
10271         return (GP*)NULL;
10272     /* look for it in the table first */
10273     ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
10274     if (ret)
10275         return ret;
10276
10277     /* create anew and remember what it is */
10278     Newxz(ret, 1, GP);
10279     ptr_table_store(PL_ptr_table, gp, ret);
10280
10281     /* clone */
10282     ret->gp_refcnt      = 0;                    /* must be before any other dups! */
10283     ret->gp_sv          = sv_dup_inc(gp->gp_sv, param);
10284     ret->gp_io          = io_dup_inc(gp->gp_io, param);
10285     ret->gp_form        = cv_dup_inc(gp->gp_form, param);
10286     ret->gp_av          = av_dup_inc(gp->gp_av, param);
10287     ret->gp_hv          = hv_dup_inc(gp->gp_hv, param);
10288     ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
10289     ret->gp_cv          = cv_dup_inc(gp->gp_cv, param);
10290     ret->gp_cvgen       = gp->gp_cvgen;
10291     ret->gp_line        = gp->gp_line;
10292     ret->gp_file_hek    = hek_dup(gp->gp_file_hek, param);
10293     return ret;
10294 }
10295
10296 /* duplicate a chain of magic */
10297
10298 MAGIC *
10299 Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS *const param)
10300 {
10301     MAGIC *mgprev = (MAGIC*)NULL;
10302     MAGIC *mgret;
10303
10304     PERL_ARGS_ASSERT_MG_DUP;
10305
10306     if (!mg)
10307         return (MAGIC*)NULL;
10308     /* look for it in the table first */
10309     mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
10310     if (mgret)
10311         return mgret;
10312
10313     for (; mg; mg = mg->mg_moremagic) {
10314         MAGIC *nmg;
10315         Newxz(nmg, 1, MAGIC);
10316         if (mgprev)
10317             mgprev->mg_moremagic = nmg;
10318         else
10319             mgret = nmg;
10320         nmg->mg_virtual = mg->mg_virtual;       /* XXX copy dynamic vtable? */
10321         nmg->mg_private = mg->mg_private;
10322         nmg->mg_type    = mg->mg_type;
10323         nmg->mg_flags   = mg->mg_flags;
10324         /* FIXME for plugins
10325         if (mg->mg_type == PERL_MAGIC_qr) {
10326             nmg->mg_obj = MUTABLE_SV(CALLREGDUPE((REGEXP*)mg->mg_obj, param));
10327         }
10328         else
10329         */
10330         if(mg->mg_type == PERL_MAGIC_backref) {
10331             /* The backref AV has its reference count deliberately bumped by
10332                1.  */
10333             nmg->mg_obj
10334                 = SvREFCNT_inc(av_dup_inc((const AV *) mg->mg_obj, param));
10335         }
10336         else {
10337             nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
10338                               ? sv_dup_inc(mg->mg_obj, param)
10339                               : sv_dup(mg->mg_obj, param);
10340         }
10341         nmg->mg_len     = mg->mg_len;
10342         nmg->mg_ptr     = mg->mg_ptr;   /* XXX random ptr? */
10343         if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
10344             if (mg->mg_len > 0) {
10345                 nmg->mg_ptr     = SAVEPVN(mg->mg_ptr, mg->mg_len);
10346                 if (mg->mg_type == PERL_MAGIC_overload_table &&
10347                         AMT_AMAGIC((AMT*)mg->mg_ptr))
10348                 {
10349                     const AMT * const amtp = (AMT*)mg->mg_ptr;
10350                     AMT * const namtp = (AMT*)nmg->mg_ptr;
10351                     I32 i;
10352                     for (i = 1; i < NofAMmeth; i++) {
10353                         namtp->table[i] = cv_dup_inc(amtp->table[i], param);
10354                     }
10355                 }
10356             }
10357             else if (mg->mg_len == HEf_SVKEY)
10358                 nmg->mg_ptr = (char*)sv_dup_inc((const SV *)mg->mg_ptr, param);
10359         }
10360         if ((mg->mg_flags & MGf_DUP) && mg->mg_virtual && mg->mg_virtual->svt_dup) {
10361             CALL_FPTR(nmg->mg_virtual->svt_dup)(aTHX_ nmg, param);
10362         }
10363         mgprev = nmg;
10364     }
10365     return mgret;
10366 }
10367
10368 #endif /* USE_ITHREADS */
10369
10370 /* create a new pointer-mapping table */
10371
10372 PTR_TBL_t *
10373 Perl_ptr_table_new(pTHX)
10374 {
10375     PTR_TBL_t *tbl;
10376     PERL_UNUSED_CONTEXT;
10377
10378     Newxz(tbl, 1, PTR_TBL_t);
10379     tbl->tbl_max        = 511;
10380     tbl->tbl_items      = 0;
10381     Newxz(tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
10382     return tbl;
10383 }
10384
10385 #define PTR_TABLE_HASH(ptr) \
10386   ((PTR2UV(ptr) >> 3) ^ (PTR2UV(ptr) >> (3 + 7)) ^ (PTR2UV(ptr) >> (3 + 17)))
10387
10388 /* 
10389    we use the PTE_SVSLOT 'reservation' made above, both here (in the
10390    following define) and at call to new_body_inline made below in 
10391    Perl_ptr_table_store()
10392  */
10393
10394 #define del_pte(p)     del_body_type(p, PTE_SVSLOT)
10395
10396 /* map an existing pointer using a table */
10397
10398 STATIC PTR_TBL_ENT_t *
10399 S_ptr_table_find(PTR_TBL_t *const tbl, const void *const sv)
10400 {
10401     PTR_TBL_ENT_t *tblent;
10402     const UV hash = PTR_TABLE_HASH(sv);
10403
10404     PERL_ARGS_ASSERT_PTR_TABLE_FIND;
10405
10406     tblent = tbl->tbl_ary[hash & tbl->tbl_max];
10407     for (; tblent; tblent = tblent->next) {
10408         if (tblent->oldval == sv)
10409             return tblent;
10410     }
10411     return NULL;
10412 }
10413
10414 void *
10415 Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *const tbl, const void *const sv)
10416 {
10417     PTR_TBL_ENT_t const *const tblent = ptr_table_find(tbl, sv);
10418
10419     PERL_ARGS_ASSERT_PTR_TABLE_FETCH;
10420     PERL_UNUSED_CONTEXT;
10421
10422     return tblent ? tblent->newval : NULL;
10423 }
10424
10425 /* add a new entry to a pointer-mapping table */
10426
10427 void
10428 Perl_ptr_table_store(pTHX_ PTR_TBL_t *const tbl, const void *const oldsv, void *const newsv)
10429 {
10430     PTR_TBL_ENT_t *tblent = ptr_table_find(tbl, oldsv);
10431
10432     PERL_ARGS_ASSERT_PTR_TABLE_STORE;
10433     PERL_UNUSED_CONTEXT;
10434
10435     if (tblent) {
10436         tblent->newval = newsv;
10437     } else {
10438         const UV entry = PTR_TABLE_HASH(oldsv) & tbl->tbl_max;
10439
10440         new_body_inline(tblent, PTE_SVSLOT);
10441
10442         tblent->oldval = oldsv;
10443         tblent->newval = newsv;
10444         tblent->next = tbl->tbl_ary[entry];
10445         tbl->tbl_ary[entry] = tblent;
10446         tbl->tbl_items++;
10447         if (tblent->next && tbl->tbl_items > tbl->tbl_max)
10448             ptr_table_split(tbl);
10449     }
10450 }
10451
10452 /* double the hash bucket size of an existing ptr table */
10453
10454 void
10455 Perl_ptr_table_split(pTHX_ PTR_TBL_t *const tbl)
10456 {
10457     PTR_TBL_ENT_t **ary = tbl->tbl_ary;
10458     const UV oldsize = tbl->tbl_max + 1;
10459     UV newsize = oldsize * 2;
10460     UV i;
10461
10462     PERL_ARGS_ASSERT_PTR_TABLE_SPLIT;
10463     PERL_UNUSED_CONTEXT;
10464
10465     Renew(ary, newsize, PTR_TBL_ENT_t*);
10466     Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
10467     tbl->tbl_max = --newsize;
10468     tbl->tbl_ary = ary;
10469     for (i=0; i < oldsize; i++, ary++) {
10470         PTR_TBL_ENT_t **curentp, **entp, *ent;
10471         if (!*ary)
10472             continue;
10473         curentp = ary + oldsize;
10474         for (entp = ary, ent = *ary; ent; ent = *entp) {
10475             if ((newsize & PTR_TABLE_HASH(ent->oldval)) != i) {
10476                 *entp = ent->next;
10477                 ent->next = *curentp;
10478                 *curentp = ent;
10479                 continue;
10480             }
10481             else
10482                 entp = &ent->next;
10483         }
10484     }
10485 }
10486
10487 /* remove all the entries from a ptr table */
10488
10489 void
10490 Perl_ptr_table_clear(pTHX_ PTR_TBL_t *const tbl)
10491 {
10492     if (tbl && tbl->tbl_items) {
10493         register PTR_TBL_ENT_t * const * const array = tbl->tbl_ary;
10494         UV riter = tbl->tbl_max;
10495
10496         do {
10497             PTR_TBL_ENT_t *entry = array[riter];
10498
10499             while (entry) {
10500                 PTR_TBL_ENT_t * const oentry = entry;
10501                 entry = entry->next;
10502                 del_pte(oentry);
10503             }
10504         } while (riter--);
10505
10506         tbl->tbl_items = 0;
10507     }
10508 }
10509
10510 /* clear and free a ptr table */
10511
10512 void
10513 Perl_ptr_table_free(pTHX_ PTR_TBL_t *const tbl)
10514 {
10515     if (!tbl) {
10516         return;
10517     }
10518     ptr_table_clear(tbl);
10519     Safefree(tbl->tbl_ary);
10520     Safefree(tbl);
10521 }
10522
10523 #if defined(USE_ITHREADS)
10524
10525 void
10526 Perl_rvpv_dup(pTHX_ SV *const dstr, const SV *const sstr, CLONE_PARAMS *const param)
10527 {
10528     PERL_ARGS_ASSERT_RVPV_DUP;
10529
10530     if (SvROK(sstr)) {
10531         SvRV_set(dstr, SvWEAKREF(sstr)
10532                        ? sv_dup(SvRV(sstr), param)
10533                        : sv_dup_inc(SvRV(sstr), param));
10534
10535     }
10536     else if (SvPVX_const(sstr)) {
10537         /* Has something there */
10538         if (SvLEN(sstr)) {
10539             /* Normal PV - clone whole allocated space */
10540             SvPV_set(dstr, SAVEPVN(SvPVX_const(sstr), SvLEN(sstr)-1));
10541             if (SvREADONLY(sstr) && SvFAKE(sstr)) {
10542                 /* Not that normal - actually sstr is copy on write.
10543                    But we are a true, independant SV, so:  */
10544                 SvREADONLY_off(dstr);
10545                 SvFAKE_off(dstr);
10546             }
10547         }
10548         else {
10549             /* Special case - not normally malloced for some reason */
10550             if (isGV_with_GP(sstr)) {
10551                 /* Don't need to do anything here.  */
10552             }
10553             else if ((SvREADONLY(sstr) && SvFAKE(sstr))) {
10554                 /* A "shared" PV - clone it as "shared" PV */
10555                 SvPV_set(dstr,
10556                          HEK_KEY(hek_dup(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)),
10557                                          param)));
10558             }
10559             else {
10560                 /* Some other special case - random pointer */
10561                 SvPV_set(dstr, SvPVX(sstr));            
10562             }
10563         }
10564     }
10565     else {
10566         /* Copy the NULL */
10567         SvPV_set(dstr, NULL);
10568     }
10569 }
10570
10571 /* duplicate an SV of any type (including AV, HV etc) */
10572
10573 SV *
10574 Perl_sv_dup(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
10575 {
10576     dVAR;
10577     SV *dstr;
10578
10579     PERL_ARGS_ASSERT_SV_DUP;
10580
10581     if (!sstr)
10582         return NULL;
10583     if (SvTYPE(sstr) == SVTYPEMASK) {
10584 #ifdef DEBUG_LEAKING_SCALARS_ABORT
10585         abort();
10586 #endif
10587         return NULL;
10588     }
10589     /* look for it in the table first */
10590     dstr = MUTABLE_SV(ptr_table_fetch(PL_ptr_table, sstr));
10591     if (dstr)
10592         return dstr;
10593
10594     if(param->flags & CLONEf_JOIN_IN) {
10595         /** We are joining here so we don't want do clone
10596             something that is bad **/
10597         if (SvTYPE(sstr) == SVt_PVHV) {
10598             const HEK * const hvname = HvNAME_HEK(sstr);
10599             if (hvname)
10600                 /** don't clone stashes if they already exist **/
10601                 return MUTABLE_SV(gv_stashpvn(HEK_KEY(hvname), HEK_LEN(hvname), 0));
10602         }
10603     }
10604
10605     /* create anew and remember what it is */
10606     new_SV(dstr);
10607
10608 #ifdef DEBUG_LEAKING_SCALARS
10609     dstr->sv_debug_optype = sstr->sv_debug_optype;
10610     dstr->sv_debug_line = sstr->sv_debug_line;
10611     dstr->sv_debug_inpad = sstr->sv_debug_inpad;
10612     dstr->sv_debug_cloned = 1;
10613     dstr->sv_debug_file = savepv(sstr->sv_debug_file);
10614 #endif
10615
10616     ptr_table_store(PL_ptr_table, sstr, dstr);
10617
10618     /* clone */
10619     SvFLAGS(dstr)       = SvFLAGS(sstr);
10620     SvFLAGS(dstr)       &= ~SVf_OOK;            /* don't propagate OOK hack */
10621     SvREFCNT(dstr)      = 0;                    /* must be before any other dups! */
10622
10623 #ifdef DEBUGGING
10624     if (SvANY(sstr) && PL_watch_pvx && SvPVX_const(sstr) == PL_watch_pvx)
10625         PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
10626                       (void*)PL_watch_pvx, SvPVX_const(sstr));
10627 #endif
10628
10629     /* don't clone objects whose class has asked us not to */
10630     if (SvOBJECT(sstr) && ! (SvFLAGS(SvSTASH(sstr)) & SVphv_CLONEABLE)) {
10631         SvFLAGS(dstr) = 0;
10632         return dstr;
10633     }
10634
10635     switch (SvTYPE(sstr)) {
10636     case SVt_NULL:
10637         SvANY(dstr)     = NULL;
10638         break;
10639     case SVt_IV:
10640         SvANY(dstr)     = (XPVIV*)((char*)&(dstr->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
10641         if(SvROK(sstr)) {
10642             Perl_rvpv_dup(aTHX_ dstr, sstr, param);
10643         } else {
10644             SvIV_set(dstr, SvIVX(sstr));
10645         }
10646         break;
10647     case SVt_NV:
10648         SvANY(dstr)     = new_XNV();
10649         SvNV_set(dstr, SvNVX(sstr));
10650         break;
10651         /* case SVt_BIND: */
10652     default:
10653         {
10654             /* These are all the types that need complex bodies allocating.  */
10655             void *new_body;
10656             const svtype sv_type = SvTYPE(sstr);
10657             const struct body_details *const sv_type_details
10658                 = bodies_by_type + sv_type;
10659
10660             switch (sv_type) {
10661             default:
10662                 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
10663                 break;
10664
10665             case SVt_PVGV:
10666                 if (GvUNIQUE((const GV *)sstr)) {
10667                     NOOP;   /* Do sharing here, and fall through */
10668                 }
10669             case SVt_PVIO:
10670             case SVt_PVFM:
10671             case SVt_PVHV:
10672             case SVt_PVAV:
10673             case SVt_PVCV:
10674             case SVt_PVLV:
10675             case SVt_REGEXP:
10676             case SVt_PVMG:
10677             case SVt_PVNV:
10678             case SVt_PVIV:
10679             case SVt_PV:
10680                 assert(sv_type_details->body_size);
10681                 if (sv_type_details->arena) {
10682                     new_body_inline(new_body, sv_type);
10683                     new_body
10684                         = (void*)((char*)new_body - sv_type_details->offset);
10685                 } else {
10686                     new_body = new_NOARENA(sv_type_details);
10687                 }
10688             }
10689             assert(new_body);
10690             SvANY(dstr) = new_body;
10691
10692 #ifndef PURIFY
10693             Copy(((char*)SvANY(sstr)) + sv_type_details->offset,
10694                  ((char*)SvANY(dstr)) + sv_type_details->offset,
10695                  sv_type_details->copy, char);
10696 #else
10697             Copy(((char*)SvANY(sstr)),
10698                  ((char*)SvANY(dstr)),
10699                  sv_type_details->body_size + sv_type_details->offset, char);
10700 #endif
10701
10702             if (sv_type != SVt_PVAV && sv_type != SVt_PVHV
10703                 && !isGV_with_GP(dstr))
10704                 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
10705
10706             /* The Copy above means that all the source (unduplicated) pointers
10707                are now in the destination.  We can check the flags and the
10708                pointers in either, but it's possible that there's less cache
10709                missing by always going for the destination.
10710                FIXME - instrument and check that assumption  */
10711             if (sv_type >= SVt_PVMG) {
10712                 if ((sv_type == SVt_PVMG) && SvPAD_OUR(dstr)) {
10713                     SvOURSTASH_set(dstr, hv_dup_inc(SvOURSTASH(dstr), param));
10714                 } else if (SvMAGIC(dstr))
10715                     SvMAGIC_set(dstr, mg_dup(SvMAGIC(dstr), param));
10716                 if (SvSTASH(dstr))
10717                     SvSTASH_set(dstr, hv_dup_inc(SvSTASH(dstr), param));
10718             }
10719
10720             /* The cast silences a GCC warning about unhandled types.  */
10721             switch ((int)sv_type) {
10722             case SVt_PV:
10723                 break;
10724             case SVt_PVIV:
10725                 break;
10726             case SVt_PVNV:
10727                 break;
10728             case SVt_PVMG:
10729                 break;
10730             case SVt_REGEXP:
10731                 /* FIXME for plugins */
10732                 re_dup_guts((REGEXP*) sstr, (REGEXP*) dstr, param);
10733                 break;
10734             case SVt_PVLV:
10735                 /* XXX LvTARGOFF sometimes holds PMOP* when DEBUGGING */
10736                 if (LvTYPE(dstr) == 't') /* for tie: unrefcnted fake (SV**) */
10737                     LvTARG(dstr) = dstr;
10738                 else if (LvTYPE(dstr) == 'T') /* for tie: fake HE */
10739                     LvTARG(dstr) = MUTABLE_SV(he_dup((HE*)LvTARG(dstr), 0, param));
10740                 else
10741                     LvTARG(dstr) = sv_dup_inc(LvTARG(dstr), param);
10742             case SVt_PVGV:
10743                 if(isGV_with_GP(sstr)) {
10744                     if (GvNAME_HEK(dstr))
10745                         GvNAME_HEK(dstr) = hek_dup(GvNAME_HEK(dstr), param);
10746                     /* Don't call sv_add_backref here as it's going to be
10747                        created as part of the magic cloning of the symbol
10748                        table.  */
10749                     /* Danger Will Robinson - GvGP(dstr) isn't initialised
10750                        at the point of this comment.  */
10751                     GvSTASH(dstr) = hv_dup(GvSTASH(dstr), param);
10752                     GvGP(dstr)  = gp_dup(GvGP(sstr), param);
10753                     (void)GpREFCNT_inc(GvGP(dstr));
10754                 } else
10755                     Perl_rvpv_dup(aTHX_ dstr, sstr, param);
10756                 break;
10757             case SVt_PVIO:
10758                 IoIFP(dstr)     = fp_dup(IoIFP(dstr), IoTYPE(dstr), param);
10759                 if (IoOFP(dstr) == IoIFP(sstr))
10760                     IoOFP(dstr) = IoIFP(dstr);
10761                 else
10762                     IoOFP(dstr) = fp_dup(IoOFP(dstr), IoTYPE(dstr), param);
10763                 /* PL_parser->rsfp_filters entries have fake IoDIRP() */
10764                 if(IoFLAGS(dstr) & IOf_FAKE_DIRP) {
10765                     /* I have no idea why fake dirp (rsfps)
10766                        should be treated differently but otherwise
10767                        we end up with leaks -- sky*/
10768                     IoTOP_GV(dstr)      = gv_dup_inc(IoTOP_GV(dstr), param);
10769                     IoFMT_GV(dstr)      = gv_dup_inc(IoFMT_GV(dstr), param);
10770                     IoBOTTOM_GV(dstr)   = gv_dup_inc(IoBOTTOM_GV(dstr), param);
10771                 } else {
10772                     IoTOP_GV(dstr)      = gv_dup(IoTOP_GV(dstr), param);
10773                     IoFMT_GV(dstr)      = gv_dup(IoFMT_GV(dstr), param);
10774                     IoBOTTOM_GV(dstr)   = gv_dup(IoBOTTOM_GV(dstr), param);
10775                     if (IoDIRP(dstr)) {
10776                         IoDIRP(dstr)    = dirp_dup(IoDIRP(dstr));
10777                     } else {
10778                         NOOP;
10779                         /* IoDIRP(dstr) is already a copy of IoDIRP(sstr)  */
10780                     }
10781                 }
10782                 IoTOP_NAME(dstr)        = SAVEPV(IoTOP_NAME(dstr));
10783                 IoFMT_NAME(dstr)        = SAVEPV(IoFMT_NAME(dstr));
10784                 IoBOTTOM_NAME(dstr)     = SAVEPV(IoBOTTOM_NAME(dstr));
10785                 break;
10786             case SVt_PVAV:
10787                 if (AvARRAY((const AV *)sstr)) {
10788                     SV **dst_ary, **src_ary;
10789                     SSize_t items = AvFILLp((const AV *)sstr) + 1;
10790
10791                     src_ary = AvARRAY((const AV *)sstr);
10792                     Newxz(dst_ary, AvMAX((const AV *)sstr)+1, SV*);
10793                     ptr_table_store(PL_ptr_table, src_ary, dst_ary);
10794                     AvARRAY(MUTABLE_AV(dstr)) = dst_ary;
10795                     AvALLOC((const AV *)dstr) = dst_ary;
10796                     if (AvREAL((const AV *)sstr)) {
10797                         while (items-- > 0)
10798                             *dst_ary++ = sv_dup_inc(*src_ary++, param);
10799                     }
10800                     else {
10801                         while (items-- > 0)
10802                             *dst_ary++ = sv_dup(*src_ary++, param);
10803                     }
10804                     items = AvMAX((const AV *)sstr) - AvFILLp((const AV *)sstr);
10805                     while (items-- > 0) {
10806                         *dst_ary++ = &PL_sv_undef;
10807                     }
10808                 }
10809                 else {
10810                     AvARRAY(MUTABLE_AV(dstr))   = NULL;
10811                     AvALLOC((const AV *)dstr)   = (SV**)NULL;
10812                 }
10813                 break;
10814             case SVt_PVHV:
10815                 if (HvARRAY((const HV *)sstr)) {
10816                     STRLEN i = 0;
10817                     const bool sharekeys = !!HvSHAREKEYS(sstr);
10818                     XPVHV * const dxhv = (XPVHV*)SvANY(dstr);
10819                     XPVHV * const sxhv = (XPVHV*)SvANY(sstr);
10820                     char *darray;
10821                     Newx(darray, PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1)
10822                         + (SvOOK(sstr) ? sizeof(struct xpvhv_aux) : 0),
10823                         char);
10824                     HvARRAY(dstr) = (HE**)darray;
10825                     while (i <= sxhv->xhv_max) {
10826                         const HE * const source = HvARRAY(sstr)[i];
10827                         HvARRAY(dstr)[i] = source
10828                             ? he_dup(source, sharekeys, param) : 0;
10829                         ++i;
10830                     }
10831                     if (SvOOK(sstr)) {
10832                         HEK *hvname;
10833                         const struct xpvhv_aux * const saux = HvAUX(sstr);
10834                         struct xpvhv_aux * const daux = HvAUX(dstr);
10835                         /* This flag isn't copied.  */
10836                         /* SvOOK_on(hv) attacks the IV flags.  */
10837                         SvFLAGS(dstr) |= SVf_OOK;
10838
10839                         hvname = saux->xhv_name;
10840                         daux->xhv_name = hvname ? hek_dup(hvname, param) : hvname;
10841
10842                         daux->xhv_riter = saux->xhv_riter;
10843                         daux->xhv_eiter = saux->xhv_eiter
10844                             ? he_dup(saux->xhv_eiter,
10845                                         (bool)!!HvSHAREKEYS(sstr), param) : 0;
10846                         /* backref array needs refcnt=2; see sv_add_backref */
10847                         daux->xhv_backreferences =
10848                             saux->xhv_backreferences
10849                             ? MUTABLE_AV(SvREFCNT_inc(
10850                                                       sv_dup_inc((const SV *)saux->xhv_backreferences, param)))
10851                                 : 0;
10852
10853                         daux->xhv_mro_meta = saux->xhv_mro_meta
10854                             ? mro_meta_dup(saux->xhv_mro_meta, param)
10855                             : 0;
10856
10857                         /* Record stashes for possible cloning in Perl_clone(). */
10858                         if (hvname)
10859                             av_push(param->stashes, dstr);
10860                     }
10861                 }
10862                 else
10863                     HvARRAY(MUTABLE_HV(dstr)) = NULL;
10864                 break;
10865             case SVt_PVCV:
10866                 if (!(param->flags & CLONEf_COPY_STACKS)) {
10867                     CvDEPTH(dstr) = 0;
10868                 }
10869             case SVt_PVFM:
10870                 /* NOTE: not refcounted */
10871                 CvSTASH(dstr)   = hv_dup(CvSTASH(dstr), param);
10872                 OP_REFCNT_LOCK;
10873                 if (!CvISXSUB(dstr))
10874                     CvROOT(dstr) = OpREFCNT_inc(CvROOT(dstr));
10875                 OP_REFCNT_UNLOCK;
10876                 if (CvCONST(dstr) && CvISXSUB(dstr)) {
10877                     CvXSUBANY(dstr).any_ptr = GvUNIQUE(CvGV(dstr)) ?
10878                         SvREFCNT_inc(CvXSUBANY(dstr).any_ptr) :
10879                         sv_dup_inc((const SV *)CvXSUBANY(dstr).any_ptr, param);
10880                 }
10881                 /* don't dup if copying back - CvGV isn't refcounted, so the
10882                  * duped GV may never be freed. A bit of a hack! DAPM */
10883                 CvGV(dstr)      = (param->flags & CLONEf_JOIN_IN) ?
10884                     NULL : gv_dup(CvGV(dstr), param) ;
10885                 PAD_DUP(CvPADLIST(dstr), CvPADLIST(sstr), param);
10886                 CvOUTSIDE(dstr) =
10887                     CvWEAKOUTSIDE(sstr)
10888                     ? cv_dup(    CvOUTSIDE(dstr), param)
10889                     : cv_dup_inc(CvOUTSIDE(dstr), param);
10890                 if (!CvISXSUB(dstr))
10891                     CvFILE(dstr) = SAVEPV(CvFILE(dstr));
10892                 break;
10893             }
10894         }
10895     }
10896
10897     if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
10898         ++PL_sv_objcount;
10899
10900     return dstr;
10901  }
10902
10903 /* duplicate a context */
10904
10905 PERL_CONTEXT *
10906 Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
10907 {
10908     PERL_CONTEXT *ncxs;
10909
10910     PERL_ARGS_ASSERT_CX_DUP;
10911
10912     if (!cxs)
10913         return (PERL_CONTEXT*)NULL;
10914
10915     /* look for it in the table first */
10916     ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
10917     if (ncxs)
10918         return ncxs;
10919
10920     /* create anew and remember what it is */
10921     Newx(ncxs, max + 1, PERL_CONTEXT);
10922     ptr_table_store(PL_ptr_table, cxs, ncxs);
10923     Copy(cxs, ncxs, max + 1, PERL_CONTEXT);
10924
10925     while (ix >= 0) {
10926         PERL_CONTEXT * const ncx = &ncxs[ix];
10927         if (CxTYPE(ncx) == CXt_SUBST) {
10928             Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
10929         }
10930         else {
10931             switch (CxTYPE(ncx)) {
10932             case CXt_SUB:
10933                 ncx->blk_sub.cv         = (ncx->blk_sub.olddepth == 0
10934                                            ? cv_dup_inc(ncx->blk_sub.cv, param)
10935                                            : cv_dup(ncx->blk_sub.cv,param));
10936                 ncx->blk_sub.argarray   = (CxHASARGS(ncx)
10937                                            ? av_dup_inc(ncx->blk_sub.argarray,
10938                                                         param)
10939                                            : NULL);
10940                 ncx->blk_sub.savearray  = av_dup_inc(ncx->blk_sub.savearray,
10941                                                      param);
10942                 ncx->blk_sub.oldcomppad = (PAD*)ptr_table_fetch(PL_ptr_table,
10943                                            ncx->blk_sub.oldcomppad);
10944                 break;
10945             case CXt_EVAL:
10946                 ncx->blk_eval.old_namesv = sv_dup_inc(ncx->blk_eval.old_namesv,
10947                                                       param);
10948                 ncx->blk_eval.cur_text  = sv_dup(ncx->blk_eval.cur_text, param);
10949                 break;
10950             case CXt_LOOP_LAZYSV:
10951                 ncx->blk_loop.state_u.lazysv.end
10952                     = sv_dup_inc(ncx->blk_loop.state_u.lazysv.end, param);
10953                 /* We are taking advantage of av_dup_inc and sv_dup_inc
10954                    actually being the same function, and order equivalance of
10955                    the two unions.
10956                    We can assert the later [but only at run time :-(]  */
10957                 assert ((void *) &ncx->blk_loop.state_u.ary.ary ==
10958                         (void *) &ncx->blk_loop.state_u.lazysv.cur);
10959             case CXt_LOOP_FOR:
10960                 ncx->blk_loop.state_u.ary.ary
10961                     = av_dup_inc(ncx->blk_loop.state_u.ary.ary, param);
10962             case CXt_LOOP_LAZYIV:
10963             case CXt_LOOP_PLAIN:
10964                 if (CxPADLOOP(ncx)) {
10965                     ncx->blk_loop.oldcomppad
10966                         = (PAD*)ptr_table_fetch(PL_ptr_table,
10967                                                 ncx->blk_loop.oldcomppad);
10968                 } else {
10969                     ncx->blk_loop.oldcomppad
10970                         = (PAD*)gv_dup((const GV *)ncx->blk_loop.oldcomppad,
10971                                        param);
10972                 }
10973                 break;
10974             case CXt_FORMAT:
10975                 ncx->blk_format.cv      = cv_dup(ncx->blk_format.cv, param);
10976                 ncx->blk_format.gv      = gv_dup(ncx->blk_format.gv, param);
10977                 ncx->blk_format.dfoutgv = gv_dup_inc(ncx->blk_format.dfoutgv,
10978                                                      param);
10979                 break;
10980             case CXt_BLOCK:
10981             case CXt_NULL:
10982                 break;
10983             }
10984         }
10985         --ix;
10986     }
10987     return ncxs;
10988 }
10989
10990 /* duplicate a stack info structure */
10991
10992 PERL_SI *
10993 Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
10994 {
10995     PERL_SI *nsi;
10996
10997     PERL_ARGS_ASSERT_SI_DUP;
10998
10999     if (!si)
11000         return (PERL_SI*)NULL;
11001
11002     /* look for it in the table first */
11003     nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
11004     if (nsi)
11005         return nsi;
11006
11007     /* create anew and remember what it is */
11008     Newxz(nsi, 1, PERL_SI);
11009     ptr_table_store(PL_ptr_table, si, nsi);
11010
11011     nsi->si_stack       = av_dup_inc(si->si_stack, param);
11012     nsi->si_cxix        = si->si_cxix;
11013     nsi->si_cxmax       = si->si_cxmax;
11014     nsi->si_cxstack     = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
11015     nsi->si_type        = si->si_type;
11016     nsi->si_prev        = si_dup(si->si_prev, param);
11017     nsi->si_next        = si_dup(si->si_next, param);
11018     nsi->si_markoff     = si->si_markoff;
11019
11020     return nsi;
11021 }
11022
11023 #define POPINT(ss,ix)   ((ss)[--(ix)].any_i32)
11024 #define TOPINT(ss,ix)   ((ss)[ix].any_i32)
11025 #define POPLONG(ss,ix)  ((ss)[--(ix)].any_long)
11026 #define TOPLONG(ss,ix)  ((ss)[ix].any_long)
11027 #define POPIV(ss,ix)    ((ss)[--(ix)].any_iv)
11028 #define TOPIV(ss,ix)    ((ss)[ix].any_iv)
11029 #define POPBOOL(ss,ix)  ((ss)[--(ix)].any_bool)
11030 #define TOPBOOL(ss,ix)  ((ss)[ix].any_bool)
11031 #define POPPTR(ss,ix)   ((ss)[--(ix)].any_ptr)
11032 #define TOPPTR(ss,ix)   ((ss)[ix].any_ptr)
11033 #define POPDPTR(ss,ix)  ((ss)[--(ix)].any_dptr)
11034 #define TOPDPTR(ss,ix)  ((ss)[ix].any_dptr)
11035 #define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
11036 #define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
11037
11038 /* XXXXX todo */
11039 #define pv_dup_inc(p)   SAVEPV(p)
11040 #define pv_dup(p)       SAVEPV(p)
11041 #define svp_dup_inc(p,pp)       any_dup(p,pp)
11042
11043 /* map any object to the new equivent - either something in the
11044  * ptr table, or something in the interpreter structure
11045  */
11046
11047 void *
11048 Perl_any_dup(pTHX_ void *v, const PerlInterpreter *proto_perl)
11049 {
11050     void *ret;
11051
11052     PERL_ARGS_ASSERT_ANY_DUP;
11053
11054     if (!v)
11055         return (void*)NULL;
11056
11057     /* look for it in the table first */
11058     ret = ptr_table_fetch(PL_ptr_table, v);
11059     if (ret)
11060         return ret;
11061
11062     /* see if it is part of the interpreter structure */
11063     if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
11064         ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
11065     else {
11066         ret = v;
11067     }
11068
11069     return ret;
11070 }
11071
11072 /* duplicate the save stack */
11073
11074 ANY *
11075 Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
11076 {
11077     dVAR;
11078     ANY * const ss      = proto_perl->Isavestack;
11079     const I32 max       = proto_perl->Isavestack_max;
11080     I32 ix              = proto_perl->Isavestack_ix;
11081     ANY *nss;
11082     const SV *sv;
11083     const GV *gv;
11084     const AV *av;
11085     const HV *hv;
11086     void* ptr;
11087     int intval;
11088     long longval;
11089     GP *gp;
11090     IV iv;
11091     I32 i;
11092     char *c = NULL;
11093     void (*dptr) (void*);
11094     void (*dxptr) (pTHX_ void*);
11095
11096     PERL_ARGS_ASSERT_SS_DUP;
11097
11098     Newxz(nss, max, ANY);
11099
11100     while (ix > 0) {
11101         const I32 type = POPINT(ss,ix);
11102         TOPINT(nss,ix) = type;
11103         switch (type) {
11104         case SAVEt_HELEM:               /* hash element */
11105             sv = (const SV *)POPPTR(ss,ix);
11106             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11107             /* fall through */
11108         case SAVEt_ITEM:                        /* normal string */
11109         case SAVEt_SV:                          /* scalar reference */
11110             sv = (const SV *)POPPTR(ss,ix);
11111             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11112             /* fall through */
11113         case SAVEt_FREESV:
11114         case SAVEt_MORTALIZESV:
11115             sv = (const SV *)POPPTR(ss,ix);
11116             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11117             break;
11118         case SAVEt_SHARED_PVREF:                /* char* in shared space */
11119             c = (char*)POPPTR(ss,ix);
11120             TOPPTR(nss,ix) = savesharedpv(c);
11121             ptr = POPPTR(ss,ix);
11122             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11123             break;
11124         case SAVEt_GENERIC_SVREF:               /* generic sv */
11125         case SAVEt_SVREF:                       /* scalar reference */
11126             sv = (const SV *)POPPTR(ss,ix);
11127             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11128             ptr = POPPTR(ss,ix);
11129             TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
11130             break;
11131         case SAVEt_HV:                          /* hash reference */
11132         case SAVEt_AV:                          /* array reference */
11133             sv = (const SV *) POPPTR(ss,ix);
11134             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11135             /* fall through */
11136         case SAVEt_COMPPAD:
11137         case SAVEt_NSTAB:
11138             sv = (const SV *) POPPTR(ss,ix);
11139             TOPPTR(nss,ix) = sv_dup(sv, param);
11140             break;
11141         case SAVEt_INT:                         /* int reference */
11142             ptr = POPPTR(ss,ix);
11143             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11144             intval = (int)POPINT(ss,ix);
11145             TOPINT(nss,ix) = intval;
11146             break;
11147         case SAVEt_LONG:                        /* long reference */
11148             ptr = POPPTR(ss,ix);
11149             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11150             /* fall through */
11151         case SAVEt_CLEARSV:
11152             longval = (long)POPLONG(ss,ix);
11153             TOPLONG(nss,ix) = longval;
11154             break;
11155         case SAVEt_I32:                         /* I32 reference */
11156         case SAVEt_I16:                         /* I16 reference */
11157         case SAVEt_I8:                          /* I8 reference */
11158         case SAVEt_COP_ARYBASE:                 /* call CopARYBASE_set */
11159             ptr = POPPTR(ss,ix);
11160             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11161             i = POPINT(ss,ix);
11162             TOPINT(nss,ix) = i;
11163             break;
11164         case SAVEt_IV:                          /* IV reference */
11165             ptr = POPPTR(ss,ix);
11166             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11167             iv = POPIV(ss,ix);
11168             TOPIV(nss,ix) = iv;
11169             break;
11170         case SAVEt_HPTR:                        /* HV* reference */
11171         case SAVEt_APTR:                        /* AV* reference */
11172         case SAVEt_SPTR:                        /* SV* reference */
11173             ptr = POPPTR(ss,ix);
11174             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11175             sv = (const SV *)POPPTR(ss,ix);
11176             TOPPTR(nss,ix) = sv_dup(sv, param);
11177             break;
11178         case SAVEt_VPTR:                        /* random* reference */
11179             ptr = POPPTR(ss,ix);
11180             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11181             ptr = POPPTR(ss,ix);
11182             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11183             break;
11184         case SAVEt_GENERIC_PVREF:               /* generic char* */
11185         case SAVEt_PPTR:                        /* char* reference */
11186             ptr = POPPTR(ss,ix);
11187             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11188             c = (char*)POPPTR(ss,ix);
11189             TOPPTR(nss,ix) = pv_dup(c);
11190             break;
11191         case SAVEt_GP:                          /* scalar reference */
11192             gp = (GP*)POPPTR(ss,ix);
11193             TOPPTR(nss,ix) = gp = gp_dup(gp, param);
11194             (void)GpREFCNT_inc(gp);
11195             gv = (const GV *)POPPTR(ss,ix);
11196             TOPPTR(nss,ix) = gv_dup_inc(gv, param);
11197             break;
11198         case SAVEt_FREEOP:
11199             ptr = POPPTR(ss,ix);
11200             if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
11201                 /* these are assumed to be refcounted properly */
11202                 OP *o;
11203                 switch (((OP*)ptr)->op_type) {
11204                 case OP_LEAVESUB:
11205                 case OP_LEAVESUBLV:
11206                 case OP_LEAVEEVAL:
11207                 case OP_LEAVE:
11208                 case OP_SCOPE:
11209                 case OP_LEAVEWRITE:
11210                     TOPPTR(nss,ix) = ptr;
11211                     o = (OP*)ptr;
11212                     OP_REFCNT_LOCK;
11213                     (void) OpREFCNT_inc(o);
11214                     OP_REFCNT_UNLOCK;
11215                     break;
11216                 default:
11217                     TOPPTR(nss,ix) = NULL;
11218                     break;
11219                 }
11220             }
11221             else
11222                 TOPPTR(nss,ix) = NULL;
11223             break;
11224         case SAVEt_FREEPV:
11225             c = (char*)POPPTR(ss,ix);
11226             TOPPTR(nss,ix) = pv_dup_inc(c);
11227             break;
11228         case SAVEt_DELETE:
11229             hv = (const HV *)POPPTR(ss,ix);
11230             TOPPTR(nss,ix) = hv_dup_inc(hv, param);
11231             c = (char*)POPPTR(ss,ix);
11232             TOPPTR(nss,ix) = pv_dup_inc(c);
11233             /* fall through */
11234         case SAVEt_STACK_POS:           /* Position on Perl stack */
11235             i = POPINT(ss,ix);
11236             TOPINT(nss,ix) = i;
11237             break;
11238         case SAVEt_DESTRUCTOR:
11239             ptr = POPPTR(ss,ix);
11240             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);  /* XXX quite arbitrary */
11241             dptr = POPDPTR(ss,ix);
11242             TOPDPTR(nss,ix) = DPTR2FPTR(void (*)(void*),
11243                                         any_dup(FPTR2DPTR(void *, dptr),
11244                                                 proto_perl));
11245             break;
11246         case SAVEt_DESTRUCTOR_X:
11247             ptr = POPPTR(ss,ix);
11248             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);  /* XXX quite arbitrary */
11249             dxptr = POPDXPTR(ss,ix);
11250             TOPDXPTR(nss,ix) = DPTR2FPTR(void (*)(pTHX_ void*),
11251                                          any_dup(FPTR2DPTR(void *, dxptr),
11252                                                  proto_perl));
11253             break;
11254         case SAVEt_REGCONTEXT:
11255         case SAVEt_ALLOC:
11256             i = POPINT(ss,ix);
11257             TOPINT(nss,ix) = i;
11258             ix -= i;
11259             break;
11260         case SAVEt_AELEM:               /* array element */
11261             sv = (const SV *)POPPTR(ss,ix);
11262             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11263             i = POPINT(ss,ix);
11264             TOPINT(nss,ix) = i;
11265             av = (const AV *)POPPTR(ss,ix);
11266             TOPPTR(nss,ix) = av_dup_inc(av, param);
11267             break;
11268         case SAVEt_OP:
11269             ptr = POPPTR(ss,ix);
11270             TOPPTR(nss,ix) = ptr;
11271             break;
11272         case SAVEt_HINTS:
11273             i = POPINT(ss,ix);
11274             TOPINT(nss,ix) = i;
11275             ptr = POPPTR(ss,ix);
11276             if (ptr) {
11277                 HINTS_REFCNT_LOCK;
11278                 ((struct refcounted_he *)ptr)->refcounted_he_refcnt++;
11279                 HINTS_REFCNT_UNLOCK;
11280             }
11281             TOPPTR(nss,ix) = ptr;
11282             if (i & HINT_LOCALIZE_HH) {
11283                 hv = (const HV *)POPPTR(ss,ix);
11284                 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
11285             }
11286             break;
11287         case SAVEt_PADSV_AND_MORTALIZE:
11288             longval = (long)POPLONG(ss,ix);
11289             TOPLONG(nss,ix) = longval;
11290             ptr = POPPTR(ss,ix);
11291             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11292             sv = (const SV *)POPPTR(ss,ix);
11293             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11294             break;
11295         case SAVEt_BOOL:
11296             ptr = POPPTR(ss,ix);
11297             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11298             longval = (long)POPBOOL(ss,ix);
11299             TOPBOOL(nss,ix) = (bool)longval;
11300             break;
11301         case SAVEt_SET_SVFLAGS:
11302             i = POPINT(ss,ix);
11303             TOPINT(nss,ix) = i;
11304             i = POPINT(ss,ix);
11305             TOPINT(nss,ix) = i;
11306             sv = (const SV *)POPPTR(ss,ix);
11307             TOPPTR(nss,ix) = sv_dup(sv, param);
11308             break;
11309         case SAVEt_RE_STATE:
11310             {
11311                 const struct re_save_state *const old_state
11312                     = (struct re_save_state *)
11313                     (ss + ix - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
11314                 struct re_save_state *const new_state
11315                     = (struct re_save_state *)
11316                     (nss + ix - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
11317
11318                 Copy(old_state, new_state, 1, struct re_save_state);
11319                 ix -= SAVESTACK_ALLOC_FOR_RE_SAVE_STATE;
11320
11321                 new_state->re_state_bostr
11322                     = pv_dup(old_state->re_state_bostr);
11323                 new_state->re_state_reginput
11324                     = pv_dup(old_state->re_state_reginput);
11325                 new_state->re_state_regeol
11326                     = pv_dup(old_state->re_state_regeol);
11327                 new_state->re_state_regoffs
11328                     = (regexp_paren_pair*)
11329                         any_dup(old_state->re_state_regoffs, proto_perl);
11330                 new_state->re_state_reglastparen
11331                     = (U32*) any_dup(old_state->re_state_reglastparen, 
11332                               proto_perl);
11333                 new_state->re_state_reglastcloseparen
11334                     = (U32*)any_dup(old_state->re_state_reglastcloseparen,
11335                               proto_perl);
11336                 /* XXX This just has to be broken. The old save_re_context
11337                    code did SAVEGENERICPV(PL_reg_start_tmp);
11338                    PL_reg_start_tmp is char **.
11339                    Look above to what the dup code does for
11340                    SAVEt_GENERIC_PVREF
11341                    It can never have worked.
11342                    So this is merely a faithful copy of the exiting bug:  */
11343                 new_state->re_state_reg_start_tmp
11344                     = (char **) pv_dup((char *)
11345                                       old_state->re_state_reg_start_tmp);
11346                 /* I assume that it only ever "worked" because no-one called
11347                    (pseudo)fork while the regexp engine had re-entered itself.
11348                 */
11349 #ifdef PERL_OLD_COPY_ON_WRITE
11350                 new_state->re_state_nrs
11351                     = sv_dup(old_state->re_state_nrs, param);
11352 #endif
11353                 new_state->re_state_reg_magic
11354                     = (MAGIC*) any_dup(old_state->re_state_reg_magic, 
11355                                proto_perl);
11356                 new_state->re_state_reg_oldcurpm
11357                     = (PMOP*) any_dup(old_state->re_state_reg_oldcurpm, 
11358                               proto_perl);
11359                 new_state->re_state_reg_curpm
11360                     = (PMOP*)  any_dup(old_state->re_state_reg_curpm, 
11361                                proto_perl);
11362                 new_state->re_state_reg_oldsaved
11363                     = pv_dup(old_state->re_state_reg_oldsaved);
11364                 new_state->re_state_reg_poscache
11365                     = pv_dup(old_state->re_state_reg_poscache);
11366                 new_state->re_state_reg_starttry
11367                     = pv_dup(old_state->re_state_reg_starttry);
11368                 break;
11369             }
11370         case SAVEt_COMPILE_WARNINGS:
11371             ptr = POPPTR(ss,ix);
11372             TOPPTR(nss,ix) = DUP_WARNINGS((STRLEN*)ptr);
11373             break;
11374         case SAVEt_PARSER:
11375             ptr = POPPTR(ss,ix);
11376             TOPPTR(nss,ix) = parser_dup((const yy_parser*)ptr, param);
11377             break;
11378         default:
11379             Perl_croak(aTHX_
11380                        "panic: ss_dup inconsistency (%"IVdf")", (IV) type);
11381         }
11382     }
11383
11384     return nss;
11385 }
11386
11387
11388 /* if sv is a stash, call $class->CLONE_SKIP(), and set the SVphv_CLONEABLE
11389  * flag to the result. This is done for each stash before cloning starts,
11390  * so we know which stashes want their objects cloned */
11391
11392 static void
11393 do_mark_cloneable_stash(pTHX_ SV *const sv)
11394 {
11395     const HEK * const hvname = HvNAME_HEK((const HV *)sv);
11396     if (hvname) {
11397         GV* const cloner = gv_fetchmethod_autoload(MUTABLE_HV(sv), "CLONE_SKIP", 0);
11398         SvFLAGS(sv) |= SVphv_CLONEABLE; /* clone objects by default */
11399         if (cloner && GvCV(cloner)) {
11400             dSP;
11401             UV status;
11402
11403             ENTER;
11404             SAVETMPS;
11405             PUSHMARK(SP);
11406             mXPUSHs(newSVhek(hvname));
11407             PUTBACK;
11408             call_sv(MUTABLE_SV(GvCV(cloner)), G_SCALAR);
11409             SPAGAIN;
11410             status = POPu;
11411             PUTBACK;
11412             FREETMPS;
11413             LEAVE;
11414             if (status)
11415                 SvFLAGS(sv) &= ~SVphv_CLONEABLE;
11416         }
11417     }
11418 }
11419
11420
11421
11422 /*
11423 =for apidoc perl_clone
11424
11425 Create and return a new interpreter by cloning the current one.
11426
11427 perl_clone takes these flags as parameters:
11428
11429 CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
11430 without it we only clone the data and zero the stacks,
11431 with it we copy the stacks and the new perl interpreter is
11432 ready to run at the exact same point as the previous one.
11433 The pseudo-fork code uses COPY_STACKS while the
11434 threads->create doesn't.
11435
11436 CLONEf_KEEP_PTR_TABLE
11437 perl_clone keeps a ptr_table with the pointer of the old
11438 variable as a key and the new variable as a value,
11439 this allows it to check if something has been cloned and not
11440 clone it again but rather just use the value and increase the
11441 refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
11442 the ptr_table using the function
11443 C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
11444 reason to keep it around is if you want to dup some of your own
11445 variable who are outside the graph perl scans, example of this
11446 code is in threads.xs create
11447
11448 CLONEf_CLONE_HOST
11449 This is a win32 thing, it is ignored on unix, it tells perls
11450 win32host code (which is c++) to clone itself, this is needed on
11451 win32 if you want to run two threads at the same time,
11452 if you just want to do some stuff in a separate perl interpreter
11453 and then throw it away and return to the original one,
11454 you don't need to do anything.
11455
11456 =cut
11457 */
11458
11459 /* XXX the above needs expanding by someone who actually understands it ! */
11460 EXTERN_C PerlInterpreter *
11461 perl_clone_host(PerlInterpreter* proto_perl, UV flags);
11462
11463 PerlInterpreter *
11464 perl_clone(PerlInterpreter *proto_perl, UV flags)
11465 {
11466    dVAR;
11467 #ifdef PERL_IMPLICIT_SYS
11468
11469     PERL_ARGS_ASSERT_PERL_CLONE;
11470
11471    /* perlhost.h so we need to call into it
11472    to clone the host, CPerlHost should have a c interface, sky */
11473
11474    if (flags & CLONEf_CLONE_HOST) {
11475        return perl_clone_host(proto_perl,flags);
11476    }
11477    return perl_clone_using(proto_perl, flags,
11478                             proto_perl->IMem,
11479                             proto_perl->IMemShared,
11480                             proto_perl->IMemParse,
11481                             proto_perl->IEnv,
11482                             proto_perl->IStdIO,
11483                             proto_perl->ILIO,
11484                             proto_perl->IDir,
11485                             proto_perl->ISock,
11486                             proto_perl->IProc);
11487 }
11488
11489 PerlInterpreter *
11490 perl_clone_using(PerlInterpreter *proto_perl, UV flags,
11491                  struct IPerlMem* ipM, struct IPerlMem* ipMS,
11492                  struct IPerlMem* ipMP, struct IPerlEnv* ipE,
11493                  struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
11494                  struct IPerlDir* ipD, struct IPerlSock* ipS,
11495                  struct IPerlProc* ipP)
11496 {
11497     /* XXX many of the string copies here can be optimized if they're
11498      * constants; they need to be allocated as common memory and just
11499      * their pointers copied. */
11500
11501     IV i;
11502     CLONE_PARAMS clone_params;
11503     CLONE_PARAMS* const param = &clone_params;
11504
11505     PerlInterpreter * const my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
11506
11507     PERL_ARGS_ASSERT_PERL_CLONE_USING;
11508
11509     /* for each stash, determine whether its objects should be cloned */
11510     S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
11511     PERL_SET_THX(my_perl);
11512
11513 #  ifdef DEBUGGING
11514     PoisonNew(my_perl, 1, PerlInterpreter);
11515     PL_op = NULL;
11516     PL_curcop = NULL;
11517     PL_markstack = 0;
11518     PL_scopestack = 0;
11519     PL_savestack = 0;
11520     PL_savestack_ix = 0;
11521     PL_savestack_max = -1;
11522     PL_sig_pending = 0;
11523     PL_parser = NULL;
11524     Zero(&PL_debug_pad, 1, struct perl_debug_pad);
11525 #  else /* !DEBUGGING */
11526     Zero(my_perl, 1, PerlInterpreter);
11527 #  endif        /* DEBUGGING */
11528
11529     /* host pointers */
11530     PL_Mem              = ipM;
11531     PL_MemShared        = ipMS;
11532     PL_MemParse         = ipMP;
11533     PL_Env              = ipE;
11534     PL_StdIO            = ipStd;
11535     PL_LIO              = ipLIO;
11536     PL_Dir              = ipD;
11537     PL_Sock             = ipS;
11538     PL_Proc             = ipP;
11539 #else           /* !PERL_IMPLICIT_SYS */
11540     IV i;
11541     CLONE_PARAMS clone_params;
11542     CLONE_PARAMS* param = &clone_params;
11543     PerlInterpreter * const my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
11544
11545     PERL_ARGS_ASSERT_PERL_CLONE;
11546
11547     /* for each stash, determine whether its objects should be cloned */
11548     S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
11549     PERL_SET_THX(my_perl);
11550
11551 #    ifdef DEBUGGING
11552     PoisonNew(my_perl, 1, PerlInterpreter);
11553     PL_op = NULL;
11554     PL_curcop = NULL;
11555     PL_markstack = 0;
11556     PL_scopestack = 0;
11557     PL_savestack = 0;
11558     PL_savestack_ix = 0;
11559     PL_savestack_max = -1;
11560     PL_sig_pending = 0;
11561     PL_parser = NULL;
11562     Zero(&PL_debug_pad, 1, struct perl_debug_pad);
11563 #    else       /* !DEBUGGING */
11564     Zero(my_perl, 1, PerlInterpreter);
11565 #    endif      /* DEBUGGING */
11566 #endif          /* PERL_IMPLICIT_SYS */
11567     param->flags = flags;
11568     param->proto_perl = proto_perl;
11569
11570     INIT_TRACK_MEMPOOL(my_perl->Imemory_debug_header, my_perl);
11571
11572     PL_body_arenas = NULL;
11573     Zero(&PL_body_roots, 1, PL_body_roots);
11574     
11575     PL_nice_chunk       = NULL;
11576     PL_nice_chunk_size  = 0;
11577     PL_sv_count         = 0;
11578     PL_sv_objcount      = 0;
11579     PL_sv_root          = NULL;
11580     PL_sv_arenaroot     = NULL;
11581
11582     PL_debug            = proto_perl->Idebug;
11583
11584     PL_hash_seed        = proto_perl->Ihash_seed;
11585     PL_rehash_seed      = proto_perl->Irehash_seed;
11586
11587 #ifdef USE_REENTRANT_API
11588     /* XXX: things like -Dm will segfault here in perlio, but doing
11589      *  PERL_SET_CONTEXT(proto_perl);
11590      * breaks too many other things
11591      */
11592     Perl_reentrant_init(aTHX);
11593 #endif
11594
11595     /* create SV map for pointer relocation */
11596     PL_ptr_table = ptr_table_new();
11597
11598     /* initialize these special pointers as early as possible */
11599     SvANY(&PL_sv_undef)         = NULL;
11600     SvREFCNT(&PL_sv_undef)      = (~(U32)0)/2;
11601     SvFLAGS(&PL_sv_undef)       = SVf_READONLY|SVt_NULL;
11602     ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
11603
11604     SvANY(&PL_sv_no)            = new_XPVNV();
11605     SvREFCNT(&PL_sv_no)         = (~(U32)0)/2;
11606     SvFLAGS(&PL_sv_no)          = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
11607                                   |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
11608     SvPV_set(&PL_sv_no, savepvn(PL_No, 0));
11609     SvCUR_set(&PL_sv_no, 0);
11610     SvLEN_set(&PL_sv_no, 1);
11611     SvIV_set(&PL_sv_no, 0);
11612     SvNV_set(&PL_sv_no, 0);
11613     ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
11614
11615     SvANY(&PL_sv_yes)           = new_XPVNV();
11616     SvREFCNT(&PL_sv_yes)        = (~(U32)0)/2;
11617     SvFLAGS(&PL_sv_yes)         = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
11618                                   |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
11619     SvPV_set(&PL_sv_yes, savepvn(PL_Yes, 1));
11620     SvCUR_set(&PL_sv_yes, 1);
11621     SvLEN_set(&PL_sv_yes, 2);
11622     SvIV_set(&PL_sv_yes, 1);
11623     SvNV_set(&PL_sv_yes, 1);
11624     ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
11625
11626     /* create (a non-shared!) shared string table */
11627     PL_strtab           = newHV();
11628     HvSHAREKEYS_off(PL_strtab);
11629     hv_ksplit(PL_strtab, HvTOTALKEYS(proto_perl->Istrtab));
11630     ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
11631
11632     PL_compiling = proto_perl->Icompiling;
11633
11634     /* These two PVs will be free'd special way so must set them same way op.c does */
11635     PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
11636     ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
11637
11638     PL_compiling.cop_file    = savesharedpv(PL_compiling.cop_file);
11639     ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
11640
11641     ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
11642     PL_compiling.cop_warnings = DUP_WARNINGS(PL_compiling.cop_warnings);
11643     if (PL_compiling.cop_hints_hash) {
11644         HINTS_REFCNT_LOCK;
11645         PL_compiling.cop_hints_hash->refcounted_he_refcnt++;
11646         HINTS_REFCNT_UNLOCK;
11647     }
11648     PL_curcop           = (COP*)any_dup(proto_perl->Icurcop, proto_perl);
11649 #ifdef PERL_DEBUG_READONLY_OPS
11650     PL_slabs = NULL;
11651     PL_slab_count = 0;
11652 #endif
11653
11654     /* pseudo environmental stuff */
11655     PL_origargc         = proto_perl->Iorigargc;
11656     PL_origargv         = proto_perl->Iorigargv;
11657
11658     param->stashes      = newAV();  /* Setup array of objects to call clone on */
11659
11660     /* Set tainting stuff before PerlIO_debug can possibly get called */
11661     PL_tainting         = proto_perl->Itainting;
11662     PL_taint_warn       = proto_perl->Itaint_warn;
11663
11664 #ifdef PERLIO_LAYERS
11665     /* Clone PerlIO tables as soon as we can handle general xx_dup() */
11666     PerlIO_clone(aTHX_ proto_perl, param);
11667 #endif
11668
11669     PL_envgv            = gv_dup(proto_perl->Ienvgv, param);
11670     PL_incgv            = gv_dup(proto_perl->Iincgv, param);
11671     PL_hintgv           = gv_dup(proto_perl->Ihintgv, param);
11672     PL_origfilename     = SAVEPV(proto_perl->Iorigfilename);
11673     PL_diehook          = sv_dup_inc(proto_perl->Idiehook, param);
11674     PL_warnhook         = sv_dup_inc(proto_perl->Iwarnhook, param);
11675
11676     /* switches */
11677     PL_minus_c          = proto_perl->Iminus_c;
11678     PL_patchlevel       = sv_dup_inc(proto_perl->Ipatchlevel, param);
11679     PL_localpatches     = proto_perl->Ilocalpatches;
11680     PL_splitstr         = proto_perl->Isplitstr;
11681     PL_minus_n          = proto_perl->Iminus_n;
11682     PL_minus_p          = proto_perl->Iminus_p;
11683     PL_minus_l          = proto_perl->Iminus_l;
11684     PL_minus_a          = proto_perl->Iminus_a;
11685     PL_minus_E          = proto_perl->Iminus_E;
11686     PL_minus_F          = proto_perl->Iminus_F;
11687     PL_doswitches       = proto_perl->Idoswitches;
11688     PL_dowarn           = proto_perl->Idowarn;
11689     PL_doextract        = proto_perl->Idoextract;
11690     PL_sawampersand     = proto_perl->Isawampersand;
11691     PL_unsafe           = proto_perl->Iunsafe;
11692     PL_inplace          = SAVEPV(proto_perl->Iinplace);
11693     PL_e_script         = sv_dup_inc(proto_perl->Ie_script, param);
11694     PL_perldb           = proto_perl->Iperldb;
11695     PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
11696     PL_exit_flags       = proto_perl->Iexit_flags;
11697
11698     /* magical thingies */
11699     /* XXX time(&PL_basetime) when asked for? */
11700     PL_basetime         = proto_perl->Ibasetime;
11701     PL_formfeed         = sv_dup(proto_perl->Iformfeed, param);
11702
11703     PL_maxsysfd         = proto_perl->Imaxsysfd;
11704     PL_statusvalue      = proto_perl->Istatusvalue;
11705 #ifdef VMS
11706     PL_statusvalue_vms  = proto_perl->Istatusvalue_vms;
11707 #else
11708     PL_statusvalue_posix = proto_perl->Istatusvalue_posix;
11709 #endif
11710     PL_encoding         = sv_dup(proto_perl->Iencoding, param);
11711
11712     sv_setpvs(PERL_DEBUG_PAD(0), "");   /* For regex debugging. */
11713     sv_setpvs(PERL_DEBUG_PAD(1), "");   /* ext/re needs these */
11714     sv_setpvs(PERL_DEBUG_PAD(2), "");   /* even without DEBUGGING. */
11715
11716    
11717     /* RE engine related */
11718     Zero(&PL_reg_state, 1, struct re_save_state);
11719     PL_reginterp_cnt    = 0;
11720     PL_regmatch_slab    = NULL;
11721     
11722     /* Clone the regex array */
11723     /* ORANGE FIXME for plugins, probably in the SV dup code.
11724        newSViv(PTR2IV(CALLREGDUPE(
11725        INT2PTR(REGEXP *, SvIVX(regex)), param))))
11726     */
11727     PL_regex_padav = av_dup_inc(proto_perl->Iregex_padav, param);
11728     PL_regex_pad = AvARRAY(PL_regex_padav);
11729
11730     /* shortcuts to various I/O objects */
11731     PL_stdingv          = gv_dup(proto_perl->Istdingv, param);
11732     PL_stderrgv         = gv_dup(proto_perl->Istderrgv, param);
11733     PL_defgv            = gv_dup(proto_perl->Idefgv, param);
11734     PL_argvgv           = gv_dup(proto_perl->Iargvgv, param);
11735     PL_argvoutgv        = gv_dup(proto_perl->Iargvoutgv, param);
11736     PL_argvout_stack    = av_dup_inc(proto_perl->Iargvout_stack, param);
11737
11738     /* shortcuts to regexp stuff */
11739     PL_replgv           = gv_dup(proto_perl->Ireplgv, param);
11740
11741     /* shortcuts to misc objects */
11742     PL_errgv            = gv_dup(proto_perl->Ierrgv, param);
11743
11744     /* shortcuts to debugging objects */
11745     PL_DBgv             = gv_dup(proto_perl->IDBgv, param);
11746     PL_DBline           = gv_dup(proto_perl->IDBline, param);
11747     PL_DBsub            = gv_dup(proto_perl->IDBsub, param);
11748     PL_DBsingle         = sv_dup(proto_perl->IDBsingle, param);
11749     PL_DBtrace          = sv_dup(proto_perl->IDBtrace, param);
11750     PL_DBsignal         = sv_dup(proto_perl->IDBsignal, param);
11751     PL_dbargs           = av_dup(proto_perl->Idbargs, param);
11752
11753     /* symbol tables */
11754     PL_defstash         = hv_dup_inc(proto_perl->Idefstash, param);
11755     PL_curstash         = hv_dup(proto_perl->Icurstash, param);
11756     PL_debstash         = hv_dup(proto_perl->Idebstash, param);
11757     PL_globalstash      = hv_dup(proto_perl->Iglobalstash, param);
11758     PL_curstname        = sv_dup_inc(proto_perl->Icurstname, param);
11759
11760     PL_beginav          = av_dup_inc(proto_perl->Ibeginav, param);
11761     PL_beginav_save     = av_dup_inc(proto_perl->Ibeginav_save, param);
11762     PL_checkav_save     = av_dup_inc(proto_perl->Icheckav_save, param);
11763     PL_unitcheckav      = av_dup_inc(proto_perl->Iunitcheckav, param);
11764     PL_unitcheckav_save = av_dup_inc(proto_perl->Iunitcheckav_save, param);
11765     PL_endav            = av_dup_inc(proto_perl->Iendav, param);
11766     PL_checkav          = av_dup_inc(proto_perl->Icheckav, param);
11767     PL_initav           = av_dup_inc(proto_perl->Iinitav, param);
11768
11769     PL_sub_generation   = proto_perl->Isub_generation;
11770     PL_isarev           = hv_dup_inc(proto_perl->Iisarev, param);
11771
11772     /* funky return mechanisms */
11773     PL_forkprocess      = proto_perl->Iforkprocess;
11774
11775     /* subprocess state */
11776     PL_fdpid            = av_dup_inc(proto_perl->Ifdpid, param);
11777
11778     /* internal state */
11779     PL_maxo             = proto_perl->Imaxo;
11780     if (proto_perl->Iop_mask)
11781         PL_op_mask      = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
11782     else
11783         PL_op_mask      = NULL;
11784     /* PL_asserting        = proto_perl->Iasserting; */
11785
11786     /* current interpreter roots */
11787     PL_main_cv          = cv_dup_inc(proto_perl->Imain_cv, param);
11788     OP_REFCNT_LOCK;
11789     PL_main_root        = OpREFCNT_inc(proto_perl->Imain_root);
11790     OP_REFCNT_UNLOCK;
11791     PL_main_start       = proto_perl->Imain_start;
11792     PL_eval_root        = proto_perl->Ieval_root;
11793     PL_eval_start       = proto_perl->Ieval_start;
11794
11795     /* runtime control stuff */
11796     PL_curcopdb         = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
11797
11798     PL_filemode         = proto_perl->Ifilemode;
11799     PL_lastfd           = proto_perl->Ilastfd;
11800     PL_oldname          = proto_perl->Ioldname;         /* XXX not quite right */
11801     PL_Argv             = NULL;
11802     PL_Cmd              = NULL;
11803     PL_gensym           = proto_perl->Igensym;
11804     PL_preambleav       = av_dup_inc(proto_perl->Ipreambleav, param);
11805     PL_laststatval      = proto_perl->Ilaststatval;
11806     PL_laststype        = proto_perl->Ilaststype;
11807     PL_mess_sv          = NULL;
11808
11809     PL_ors_sv           = sv_dup_inc(proto_perl->Iors_sv, param);
11810
11811     /* interpreter atexit processing */
11812     PL_exitlistlen      = proto_perl->Iexitlistlen;
11813     if (PL_exitlistlen) {
11814         Newx(PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11815         Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11816     }
11817     else
11818         PL_exitlist     = (PerlExitListEntry*)NULL;
11819
11820     PL_my_cxt_size = proto_perl->Imy_cxt_size;
11821     if (PL_my_cxt_size) {
11822         Newx(PL_my_cxt_list, PL_my_cxt_size, void *);
11823         Copy(proto_perl->Imy_cxt_list, PL_my_cxt_list, PL_my_cxt_size, void *);
11824 #ifdef PERL_GLOBAL_STRUCT_PRIVATE
11825         Newx(PL_my_cxt_keys, PL_my_cxt_size, const char *);
11826         Copy(proto_perl->Imy_cxt_keys, PL_my_cxt_keys, PL_my_cxt_size, char *);
11827 #endif
11828     }
11829     else {
11830         PL_my_cxt_list  = (void**)NULL;
11831 #ifdef PERL_GLOBAL_STRUCT_PRIVATE
11832         PL_my_cxt_keys  = (const char**)NULL;
11833 #endif
11834     }
11835     PL_modglobal        = hv_dup_inc(proto_perl->Imodglobal, param);
11836     PL_custom_op_names  = hv_dup_inc(proto_perl->Icustom_op_names,param);
11837     PL_custom_op_descs  = hv_dup_inc(proto_perl->Icustom_op_descs,param);
11838
11839     PL_profiledata      = NULL;
11840
11841     PL_compcv                   = cv_dup(proto_perl->Icompcv, param);
11842
11843     PAD_CLONE_VARS(proto_perl, param);
11844
11845 #ifdef HAVE_INTERP_INTERN
11846     sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
11847 #endif
11848
11849     /* more statics moved here */
11850     PL_generation       = proto_perl->Igeneration;
11851     PL_DBcv             = cv_dup(proto_perl->IDBcv, param);
11852
11853     PL_in_clean_objs    = proto_perl->Iin_clean_objs;
11854     PL_in_clean_all     = proto_perl->Iin_clean_all;
11855
11856     PL_uid              = proto_perl->Iuid;
11857     PL_euid             = proto_perl->Ieuid;
11858     PL_gid              = proto_perl->Igid;
11859     PL_egid             = proto_perl->Iegid;
11860     PL_nomemok          = proto_perl->Inomemok;
11861     PL_an               = proto_perl->Ian;
11862     PL_evalseq          = proto_perl->Ievalseq;
11863     PL_origenviron      = proto_perl->Iorigenviron;     /* XXX not quite right */
11864     PL_origalen         = proto_perl->Iorigalen;
11865 #ifdef PERL_USES_PL_PIDSTATUS
11866     PL_pidstatus        = newHV();                      /* XXX flag for cloning? */
11867 #endif
11868     PL_osname           = SAVEPV(proto_perl->Iosname);
11869     PL_sighandlerp      = proto_perl->Isighandlerp;
11870
11871     PL_runops           = proto_perl->Irunops;
11872
11873     PL_parser           = parser_dup(proto_perl->Iparser, param);
11874
11875     PL_subline          = proto_perl->Isubline;
11876     PL_subname          = sv_dup_inc(proto_perl->Isubname, param);
11877
11878 #ifdef FCRYPT
11879     PL_cryptseen        = proto_perl->Icryptseen;
11880 #endif
11881
11882     PL_hints            = proto_perl->Ihints;
11883
11884     PL_amagic_generation        = proto_perl->Iamagic_generation;
11885
11886 #ifdef USE_LOCALE_COLLATE
11887     PL_collation_ix     = proto_perl->Icollation_ix;
11888     PL_collation_name   = SAVEPV(proto_perl->Icollation_name);
11889     PL_collation_standard       = proto_perl->Icollation_standard;
11890     PL_collxfrm_base    = proto_perl->Icollxfrm_base;
11891     PL_collxfrm_mult    = proto_perl->Icollxfrm_mult;
11892 #endif /* USE_LOCALE_COLLATE */
11893
11894 #ifdef USE_LOCALE_NUMERIC
11895     PL_numeric_name     = SAVEPV(proto_perl->Inumeric_name);
11896     PL_numeric_standard = proto_perl->Inumeric_standard;
11897     PL_numeric_local    = proto_perl->Inumeric_local;
11898     PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
11899 #endif /* !USE_LOCALE_NUMERIC */
11900
11901     /* utf8 character classes */
11902     PL_utf8_alnum       = sv_dup_inc(proto_perl->Iutf8_alnum, param);
11903     PL_utf8_alnumc      = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
11904     PL_utf8_ascii       = sv_dup_inc(proto_perl->Iutf8_ascii, param);
11905     PL_utf8_alpha       = sv_dup_inc(proto_perl->Iutf8_alpha, param);
11906     PL_utf8_space       = sv_dup_inc(proto_perl->Iutf8_space, param);
11907     PL_utf8_cntrl       = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
11908     PL_utf8_graph       = sv_dup_inc(proto_perl->Iutf8_graph, param);
11909     PL_utf8_digit       = sv_dup_inc(proto_perl->Iutf8_digit, param);
11910     PL_utf8_upper       = sv_dup_inc(proto_perl->Iutf8_upper, param);
11911     PL_utf8_lower       = sv_dup_inc(proto_perl->Iutf8_lower, param);
11912     PL_utf8_print       = sv_dup_inc(proto_perl->Iutf8_print, param);
11913     PL_utf8_punct       = sv_dup_inc(proto_perl->Iutf8_punct, param);
11914     PL_utf8_xdigit      = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
11915     PL_utf8_mark        = sv_dup_inc(proto_perl->Iutf8_mark, param);
11916     PL_utf8_toupper     = sv_dup_inc(proto_perl->Iutf8_toupper, param);
11917     PL_utf8_totitle     = sv_dup_inc(proto_perl->Iutf8_totitle, param);
11918     PL_utf8_tolower     = sv_dup_inc(proto_perl->Iutf8_tolower, param);
11919     PL_utf8_tofold      = sv_dup_inc(proto_perl->Iutf8_tofold, param);
11920     PL_utf8_idstart     = sv_dup_inc(proto_perl->Iutf8_idstart, param);
11921     PL_utf8_idcont      = sv_dup_inc(proto_perl->Iutf8_idcont, param);
11922
11923     /* Did the locale setup indicate UTF-8? */
11924     PL_utf8locale       = proto_perl->Iutf8locale;
11925     /* Unicode features (see perlrun/-C) */
11926     PL_unicode          = proto_perl->Iunicode;
11927
11928     /* Pre-5.8 signals control */
11929     PL_signals          = proto_perl->Isignals;
11930
11931     /* times() ticks per second */
11932     PL_clocktick        = proto_perl->Iclocktick;
11933
11934     /* Recursion stopper for PerlIO_find_layer */
11935     PL_in_load_module   = proto_perl->Iin_load_module;
11936
11937     /* sort() routine */
11938     PL_sort_RealCmp     = proto_perl->Isort_RealCmp;
11939
11940     /* Not really needed/useful since the reenrant_retint is "volatile",
11941      * but do it for consistency's sake. */
11942     PL_reentrant_retint = proto_perl->Ireentrant_retint;
11943
11944     /* Hooks to shared SVs and locks. */
11945     PL_sharehook        = proto_perl->Isharehook;
11946     PL_lockhook         = proto_perl->Ilockhook;
11947     PL_unlockhook       = proto_perl->Iunlockhook;
11948     PL_threadhook       = proto_perl->Ithreadhook;
11949     PL_destroyhook      = proto_perl->Idestroyhook;
11950
11951 #ifdef THREADS_HAVE_PIDS
11952     PL_ppid             = proto_perl->Ippid;
11953 #endif
11954
11955     /* swatch cache */
11956     PL_last_swash_hv    = NULL; /* reinits on demand */
11957     PL_last_swash_klen  = 0;
11958     PL_last_swash_key[0]= '\0';
11959     PL_last_swash_tmps  = (U8*)NULL;
11960     PL_last_swash_slen  = 0;
11961
11962     PL_glob_index       = proto_perl->Iglob_index;
11963     PL_srand_called     = proto_perl->Isrand_called;
11964     PL_bitcount         = NULL; /* reinits on demand */
11965
11966     if (proto_perl->Ipsig_pend) {
11967         Newxz(PL_psig_pend, SIG_SIZE, int);
11968     }
11969     else {
11970         PL_psig_pend    = (int*)NULL;
11971     }
11972
11973     if (proto_perl->Ipsig_ptr) {
11974         Newxz(PL_psig_ptr,  SIG_SIZE, SV*);
11975         Newxz(PL_psig_name, SIG_SIZE, SV*);
11976         for (i = 1; i < SIG_SIZE; i++) {
11977             PL_psig_ptr[i]  = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
11978             PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
11979         }
11980     }
11981     else {
11982         PL_psig_ptr     = (SV**)NULL;
11983         PL_psig_name    = (SV**)NULL;
11984     }
11985
11986     /* intrpvar.h stuff */
11987
11988     if (flags & CLONEf_COPY_STACKS) {
11989         /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
11990         PL_tmps_ix              = proto_perl->Itmps_ix;
11991         PL_tmps_max             = proto_perl->Itmps_max;
11992         PL_tmps_floor           = proto_perl->Itmps_floor;
11993         Newxz(PL_tmps_stack, PL_tmps_max, SV*);
11994         i = 0;
11995         while (i <= PL_tmps_ix) {
11996             PL_tmps_stack[i]    = sv_dup_inc(proto_perl->Itmps_stack[i], param);
11997             ++i;
11998         }
11999
12000         /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
12001         i = proto_perl->Imarkstack_max - proto_perl->Imarkstack;
12002         Newxz(PL_markstack, i, I32);
12003         PL_markstack_max        = PL_markstack + (proto_perl->Imarkstack_max
12004                                                   - proto_perl->Imarkstack);
12005         PL_markstack_ptr        = PL_markstack + (proto_perl->Imarkstack_ptr
12006                                                   - proto_perl->Imarkstack);
12007         Copy(proto_perl->Imarkstack, PL_markstack,
12008              PL_markstack_ptr - PL_markstack + 1, I32);
12009
12010         /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
12011          * NOTE: unlike the others! */
12012         PL_scopestack_ix        = proto_perl->Iscopestack_ix;
12013         PL_scopestack_max       = proto_perl->Iscopestack_max;
12014         Newxz(PL_scopestack, PL_scopestack_max, I32);
12015         Copy(proto_perl->Iscopestack, PL_scopestack, PL_scopestack_ix, I32);
12016
12017         /* NOTE: si_dup() looks at PL_markstack */
12018         PL_curstackinfo         = si_dup(proto_perl->Icurstackinfo, param);
12019
12020         /* PL_curstack          = PL_curstackinfo->si_stack; */
12021         PL_curstack             = av_dup(proto_perl->Icurstack, param);
12022         PL_mainstack            = av_dup(proto_perl->Imainstack, param);
12023
12024         /* next PUSHs() etc. set *(PL_stack_sp+1) */
12025         PL_stack_base           = AvARRAY(PL_curstack);
12026         PL_stack_sp             = PL_stack_base + (proto_perl->Istack_sp
12027                                                    - proto_perl->Istack_base);
12028         PL_stack_max            = PL_stack_base + AvMAX(PL_curstack);
12029
12030         /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
12031          * NOTE: unlike the others! */
12032         PL_savestack_ix         = proto_perl->Isavestack_ix;
12033         PL_savestack_max        = proto_perl->Isavestack_max;
12034         /*Newxz(PL_savestack, PL_savestack_max, ANY);*/
12035         PL_savestack            = ss_dup(proto_perl, param);
12036     }
12037     else {
12038         init_stacks();
12039         ENTER;                  /* perl_destruct() wants to LEAVE; */
12040
12041         /* although we're not duplicating the tmps stack, we should still
12042          * add entries for any SVs on the tmps stack that got cloned by a
12043          * non-refcount means (eg a temp in @_); otherwise they will be
12044          * orphaned
12045          */
12046         for (i = 0; i<= proto_perl->Itmps_ix; i++) {
12047             SV * const nsv = MUTABLE_SV(ptr_table_fetch(PL_ptr_table,
12048                     proto_perl->Itmps_stack[i]));
12049             if (nsv && !SvREFCNT(nsv)) {
12050                 EXTEND_MORTAL(1);
12051                 PL_tmps_stack[++PL_tmps_ix] = SvREFCNT_inc_simple(nsv);
12052             }
12053         }
12054     }
12055
12056     PL_start_env        = proto_perl->Istart_env;       /* XXXXXX */
12057     PL_top_env          = &PL_start_env;
12058
12059     PL_op               = proto_perl->Iop;
12060
12061     PL_Sv               = NULL;
12062     PL_Xpv              = (XPV*)NULL;
12063     my_perl->Ina        = proto_perl->Ina;
12064
12065     PL_statbuf          = proto_perl->Istatbuf;
12066     PL_statcache        = proto_perl->Istatcache;
12067     PL_statgv           = gv_dup(proto_perl->Istatgv, param);
12068     PL_statname         = sv_dup_inc(proto_perl->Istatname, param);
12069 #ifdef HAS_TIMES
12070     PL_timesbuf         = proto_perl->Itimesbuf;
12071 #endif
12072
12073     PL_tainted          = proto_perl->Itainted;
12074     PL_curpm            = proto_perl->Icurpm;   /* XXX No PMOP ref count */
12075     PL_rs               = sv_dup_inc(proto_perl->Irs, param);
12076     PL_last_in_gv       = gv_dup(proto_perl->Ilast_in_gv, param);
12077     PL_ofs_sv           = sv_dup_inc(proto_perl->Iofs_sv, param);
12078     PL_defoutgv         = gv_dup_inc(proto_perl->Idefoutgv, param);
12079     PL_chopset          = proto_perl->Ichopset; /* XXX never deallocated */
12080     PL_toptarget        = sv_dup_inc(proto_perl->Itoptarget, param);
12081     PL_bodytarget       = sv_dup_inc(proto_perl->Ibodytarget, param);
12082     PL_formtarget       = sv_dup(proto_perl->Iformtarget, param);
12083
12084     PL_restartop        = proto_perl->Irestartop;
12085     PL_in_eval          = proto_perl->Iin_eval;
12086     PL_delaymagic       = proto_perl->Idelaymagic;
12087     PL_dirty            = proto_perl->Idirty;
12088     PL_localizing       = proto_perl->Ilocalizing;
12089
12090     PL_errors           = sv_dup_inc(proto_perl->Ierrors, param);
12091     PL_hv_fetch_ent_mh  = NULL;
12092     PL_modcount         = proto_perl->Imodcount;
12093     PL_lastgotoprobe    = NULL;
12094     PL_dumpindent       = proto_perl->Idumpindent;
12095
12096     PL_sortcop          = (OP*)any_dup(proto_perl->Isortcop, proto_perl);
12097     PL_sortstash        = hv_dup(proto_perl->Isortstash, param);
12098     PL_firstgv          = gv_dup(proto_perl->Ifirstgv, param);
12099     PL_secondgv         = gv_dup(proto_perl->Isecondgv, param);
12100     PL_efloatbuf        = NULL;         /* reinits on demand */
12101     PL_efloatsize       = 0;                    /* reinits on demand */
12102
12103     /* regex stuff */
12104
12105     PL_screamfirst      = NULL;
12106     PL_screamnext       = NULL;
12107     PL_maxscream        = -1;                   /* reinits on demand */
12108     PL_lastscream       = NULL;
12109
12110
12111     PL_regdummy         = proto_perl->Iregdummy;
12112     PL_colorset         = 0;            /* reinits PL_colors[] */
12113     /*PL_colors[6]      = {0,0,0,0,0,0};*/
12114
12115
12116
12117     /* Pluggable optimizer */
12118     PL_peepp            = proto_perl->Ipeepp;
12119
12120     PL_stashcache       = newHV();
12121
12122     PL_watchaddr        = (char **) ptr_table_fetch(PL_ptr_table,
12123                                             proto_perl->Iwatchaddr);
12124     PL_watchok          = PL_watchaddr ? * PL_watchaddr : NULL;
12125     if (PL_debug && PL_watchaddr) {
12126         PerlIO_printf(Perl_debug_log,
12127           "WATCHING: %"UVxf" cloned as %"UVxf" with value %"UVxf"\n",
12128           PTR2UV(proto_perl->Iwatchaddr), PTR2UV(PL_watchaddr),
12129           PTR2UV(PL_watchok));
12130     }
12131
12132     if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
12133         ptr_table_free(PL_ptr_table);
12134         PL_ptr_table = NULL;
12135     }
12136
12137     /* Call the ->CLONE method, if it exists, for each of the stashes
12138        identified by sv_dup() above.
12139     */
12140     while(av_len(param->stashes) != -1) {
12141         HV* const stash = MUTABLE_HV(av_shift(param->stashes));
12142         GV* const cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
12143         if (cloner && GvCV(cloner)) {
12144             dSP;
12145             ENTER;
12146             SAVETMPS;
12147             PUSHMARK(SP);
12148             mXPUSHs(newSVhek(HvNAME_HEK(stash)));
12149             PUTBACK;
12150             call_sv(MUTABLE_SV(GvCV(cloner)), G_DISCARD);
12151             FREETMPS;
12152             LEAVE;
12153         }
12154     }
12155
12156     SvREFCNT_dec(param->stashes);
12157
12158     /* orphaned? eg threads->new inside BEGIN or use */
12159     if (PL_compcv && ! SvREFCNT(PL_compcv)) {
12160         SvREFCNT_inc_simple_void(PL_compcv);
12161         SAVEFREESV(PL_compcv);
12162     }
12163
12164     return my_perl;
12165 }
12166
12167 #endif /* USE_ITHREADS */
12168
12169 /*
12170 =head1 Unicode Support
12171
12172 =for apidoc sv_recode_to_utf8
12173
12174 The encoding is assumed to be an Encode object, on entry the PV
12175 of the sv is assumed to be octets in that encoding, and the sv
12176 will be converted into Unicode (and UTF-8).
12177
12178 If the sv already is UTF-8 (or if it is not POK), or if the encoding
12179 is not a reference, nothing is done to the sv.  If the encoding is not
12180 an C<Encode::XS> Encoding object, bad things will happen.
12181 (See F<lib/encoding.pm> and L<Encode>).
12182
12183 The PV of the sv is returned.
12184
12185 =cut */
12186
12187 char *
12188 Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
12189 {
12190     dVAR;
12191
12192     PERL_ARGS_ASSERT_SV_RECODE_TO_UTF8;
12193
12194     if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
12195         SV *uni;
12196         STRLEN len;
12197         const char *s;
12198         dSP;
12199         ENTER;
12200         SAVETMPS;
12201         save_re_context();
12202         PUSHMARK(sp);
12203         EXTEND(SP, 3);
12204         XPUSHs(encoding);
12205         XPUSHs(sv);
12206 /*
12207   NI-S 2002/07/09
12208   Passing sv_yes is wrong - it needs to be or'ed set of constants
12209   for Encode::XS, while UTf-8 decode (currently) assumes a true value means
12210   remove converted chars from source.
12211
12212   Both will default the value - let them.
12213
12214         XPUSHs(&PL_sv_yes);
12215 */
12216         PUTBACK;
12217         call_method("decode", G_SCALAR);
12218         SPAGAIN;
12219         uni = POPs;
12220         PUTBACK;
12221         s = SvPV_const(uni, len);
12222         if (s != SvPVX_const(sv)) {
12223             SvGROW(sv, len + 1);
12224             Move(s, SvPVX(sv), len + 1, char);
12225             SvCUR_set(sv, len);
12226         }
12227         FREETMPS;
12228         LEAVE;
12229         SvUTF8_on(sv);
12230         return SvPVX(sv);
12231     }
12232     return SvPOKp(sv) ? SvPVX(sv) : NULL;
12233 }
12234
12235 /*
12236 =for apidoc sv_cat_decode
12237
12238 The encoding is assumed to be an Encode object, the PV of the ssv is
12239 assumed to be octets in that encoding and decoding the input starts
12240 from the position which (PV + *offset) pointed to.  The dsv will be
12241 concatenated the decoded UTF-8 string from ssv.  Decoding will terminate
12242 when the string tstr appears in decoding output or the input ends on
12243 the PV of the ssv. The value which the offset points will be modified
12244 to the last input position on the ssv.
12245
12246 Returns TRUE if the terminator was found, else returns FALSE.
12247
12248 =cut */
12249
12250 bool
12251 Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
12252                    SV *ssv, int *offset, char *tstr, int tlen)
12253 {
12254     dVAR;
12255     bool ret = FALSE;
12256
12257     PERL_ARGS_ASSERT_SV_CAT_DECODE;
12258
12259     if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) {
12260         SV *offsv;
12261         dSP;
12262         ENTER;
12263         SAVETMPS;
12264         save_re_context();
12265         PUSHMARK(sp);
12266         EXTEND(SP, 6);
12267         XPUSHs(encoding);
12268         XPUSHs(dsv);
12269         XPUSHs(ssv);
12270         offsv = newSViv(*offset);
12271         mXPUSHs(offsv);
12272         mXPUSHp(tstr, tlen);
12273         PUTBACK;
12274         call_method("cat_decode", G_SCALAR);
12275         SPAGAIN;
12276         ret = SvTRUE(TOPs);
12277         *offset = SvIV(offsv);
12278         PUTBACK;
12279         FREETMPS;
12280         LEAVE;
12281     }
12282     else
12283         Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
12284     return ret;
12285
12286 }
12287
12288 /* ---------------------------------------------------------------------
12289  *
12290  * support functions for report_uninit()
12291  */
12292
12293 /* the maxiumum size of array or hash where we will scan looking
12294  * for the undefined element that triggered the warning */
12295
12296 #define FUV_MAX_SEARCH_SIZE 1000
12297
12298 /* Look for an entry in the hash whose value has the same SV as val;
12299  * If so, return a mortal copy of the key. */
12300
12301 STATIC SV*
12302 S_find_hash_subscript(pTHX_ const HV *const hv, const SV *const val)
12303 {
12304     dVAR;
12305     register HE **array;
12306     I32 i;
12307
12308     PERL_ARGS_ASSERT_FIND_HASH_SUBSCRIPT;
12309
12310     if (!hv || SvMAGICAL(hv) || !HvARRAY(hv) ||
12311                         (HvTOTALKEYS(hv) > FUV_MAX_SEARCH_SIZE))
12312         return NULL;
12313
12314     array = HvARRAY(hv);
12315
12316     for (i=HvMAX(hv); i>0; i--) {
12317         register HE *entry;
12318         for (entry = array[i]; entry; entry = HeNEXT(entry)) {
12319             if (HeVAL(entry) != val)
12320                 continue;
12321             if (    HeVAL(entry) == &PL_sv_undef ||
12322                     HeVAL(entry) == &PL_sv_placeholder)
12323                 continue;
12324             if (!HeKEY(entry))
12325                 return NULL;
12326             if (HeKLEN(entry) == HEf_SVKEY)
12327                 return sv_mortalcopy(HeKEY_sv(entry));
12328             return sv_2mortal(newSVhek(HeKEY_hek(entry)));
12329         }
12330     }
12331     return NULL;
12332 }
12333
12334 /* Look for an entry in the array whose value has the same SV as val;
12335  * If so, return the index, otherwise return -1. */
12336
12337 STATIC I32
12338 S_find_array_subscript(pTHX_ const AV *const av, const SV *const val)
12339 {
12340     dVAR;
12341
12342     PERL_ARGS_ASSERT_FIND_ARRAY_SUBSCRIPT;
12343
12344     if (!av || SvMAGICAL(av) || !AvARRAY(av) ||
12345                         (AvFILLp(av) > FUV_MAX_SEARCH_SIZE))
12346         return -1;
12347
12348     if (val != &PL_sv_undef) {
12349         SV ** const svp = AvARRAY(av);
12350         I32 i;
12351
12352         for (i=AvFILLp(av); i>=0; i--)
12353             if (svp[i] == val)
12354                 return i;
12355     }
12356     return -1;
12357 }
12358
12359 /* S_varname(): return the name of a variable, optionally with a subscript.
12360  * If gv is non-zero, use the name of that global, along with gvtype (one
12361  * of "$", "@", "%"); otherwise use the name of the lexical at pad offset
12362  * targ.  Depending on the value of the subscript_type flag, return:
12363  */
12364
12365 #define FUV_SUBSCRIPT_NONE      1       /* "@foo"          */
12366 #define FUV_SUBSCRIPT_ARRAY     2       /* "$foo[aindex]"  */
12367 #define FUV_SUBSCRIPT_HASH      3       /* "$foo{keyname}" */
12368 #define FUV_SUBSCRIPT_WITHIN    4       /* "within @foo"   */
12369
12370 STATIC SV*
12371 S_varname(pTHX_ const GV *const gv, const char gvtype, PADOFFSET targ,
12372         const SV *const keyname, I32 aindex, int subscript_type)
12373 {
12374
12375     SV * const name = sv_newmortal();
12376     if (gv) {
12377         char buffer[2];
12378         buffer[0] = gvtype;
12379         buffer[1] = 0;
12380
12381         /* as gv_fullname4(), but add literal '^' for $^FOO names  */
12382
12383         gv_fullname4(name, gv, buffer, 0);
12384
12385         if ((unsigned int)SvPVX(name)[1] <= 26) {
12386             buffer[0] = '^';
12387             buffer[1] = SvPVX(name)[1] + 'A' - 1;
12388
12389             /* Swap the 1 unprintable control character for the 2 byte pretty
12390                version - ie substr($name, 1, 1) = $buffer; */
12391             sv_insert(name, 1, 1, buffer, 2);
12392         }
12393     }
12394     else {
12395         CV * const cv = find_runcv(NULL);
12396         SV *sv;
12397         AV *av;
12398
12399         if (!cv || !CvPADLIST(cv))
12400             return NULL;
12401         av = MUTABLE_AV((*av_fetch(CvPADLIST(cv), 0, FALSE)));
12402         sv = *av_fetch(av, targ, FALSE);
12403         sv_setpvn(name, SvPV_nolen_const(sv), SvCUR(sv));
12404     }
12405
12406     if (subscript_type == FUV_SUBSCRIPT_HASH) {
12407         SV * const sv = newSV(0);
12408         *SvPVX(name) = '$';
12409         Perl_sv_catpvf(aTHX_ name, "{%s}",
12410             pv_display(sv,SvPVX_const(keyname), SvCUR(keyname), 0, 32));
12411         SvREFCNT_dec(sv);
12412     }
12413     else if (subscript_type == FUV_SUBSCRIPT_ARRAY) {
12414         *SvPVX(name) = '$';
12415         Perl_sv_catpvf(aTHX_ name, "[%"IVdf"]", (IV)aindex);
12416     }
12417     else if (subscript_type == FUV_SUBSCRIPT_WITHIN) {
12418         /* We know that name has no magic, so can use 0 instead of SV_GMAGIC */
12419         Perl_sv_insert_flags(aTHX_ name, 0, 0,  STR_WITH_LEN("within "), 0);
12420     }
12421
12422     return name;
12423 }
12424
12425
12426 /*
12427 =for apidoc find_uninit_var
12428
12429 Find the name of the undefined variable (if any) that caused the operator o
12430 to issue a "Use of uninitialized value" warning.
12431 If match is true, only return a name if it's value matches uninit_sv.
12432 So roughly speaking, if a unary operator (such as OP_COS) generates a
12433 warning, then following the direct child of the op may yield an
12434 OP_PADSV or OP_GV that gives the name of the undefined variable. On the
12435 other hand, with OP_ADD there are two branches to follow, so we only print
12436 the variable name if we get an exact match.
12437
12438 The name is returned as a mortal SV.
12439
12440 Assumes that PL_op is the op that originally triggered the error, and that
12441 PL_comppad/PL_curpad points to the currently executing pad.
12442
12443 =cut
12444 */
12445
12446 STATIC SV *
12447 S_find_uninit_var(pTHX_ const OP *const obase, const SV *const uninit_sv,
12448                   bool match)
12449 {
12450     dVAR;
12451     SV *sv;
12452     const GV *gv;
12453     const OP *o, *o2, *kid;
12454
12455     if (!obase || (match && (!uninit_sv || uninit_sv == &PL_sv_undef ||
12456                             uninit_sv == &PL_sv_placeholder)))
12457         return NULL;
12458
12459     switch (obase->op_type) {
12460
12461     case OP_RV2AV:
12462     case OP_RV2HV:
12463     case OP_PADAV:
12464     case OP_PADHV:
12465       {
12466         const bool pad  = (obase->op_type == OP_PADAV || obase->op_type == OP_PADHV);
12467         const bool hash = (obase->op_type == OP_PADHV || obase->op_type == OP_RV2HV);
12468         I32 index = 0;
12469         SV *keysv = NULL;
12470         int subscript_type = FUV_SUBSCRIPT_WITHIN;
12471
12472         if (pad) { /* @lex, %lex */
12473             sv = PAD_SVl(obase->op_targ);
12474             gv = NULL;
12475         }
12476         else {
12477             if (cUNOPx(obase)->op_first->op_type == OP_GV) {
12478             /* @global, %global */
12479                 gv = cGVOPx_gv(cUNOPx(obase)->op_first);
12480                 if (!gv)
12481                     break;
12482                 sv = hash ? MUTABLE_SV(GvHV(gv)): MUTABLE_SV(GvAV(gv));
12483             }
12484             else /* @{expr}, %{expr} */
12485                 return find_uninit_var(cUNOPx(obase)->op_first,
12486                                                     uninit_sv, match);
12487         }
12488
12489         /* attempt to find a match within the aggregate */
12490         if (hash) {
12491             keysv = find_hash_subscript((const HV*)sv, uninit_sv);
12492             if (keysv)
12493                 subscript_type = FUV_SUBSCRIPT_HASH;
12494         }
12495         else {
12496             index = find_array_subscript((const AV *)sv, uninit_sv);
12497             if (index >= 0)
12498                 subscript_type = FUV_SUBSCRIPT_ARRAY;
12499         }
12500
12501         if (match && subscript_type == FUV_SUBSCRIPT_WITHIN)
12502             break;
12503
12504         return varname(gv, hash ? '%' : '@', obase->op_targ,
12505                                     keysv, index, subscript_type);
12506       }
12507
12508     case OP_PADSV:
12509         if (match && PAD_SVl(obase->op_targ) != uninit_sv)
12510             break;
12511         return varname(NULL, '$', obase->op_targ,
12512                                     NULL, 0, FUV_SUBSCRIPT_NONE);
12513
12514     case OP_GVSV:
12515         gv = cGVOPx_gv(obase);
12516         if (!gv || (match && GvSV(gv) != uninit_sv))
12517             break;
12518         return varname(gv, '$', 0, NULL, 0, FUV_SUBSCRIPT_NONE);
12519
12520     case OP_AELEMFAST:
12521         if (obase->op_flags & OPf_SPECIAL) { /* lexical array */
12522             if (match) {
12523                 SV **svp;
12524                 AV *av = MUTABLE_AV(PAD_SV(obase->op_targ));
12525                 if (!av || SvRMAGICAL(av))
12526                     break;
12527                 svp = av_fetch(av, (I32)obase->op_private, FALSE);
12528                 if (!svp || *svp != uninit_sv)
12529                     break;
12530             }
12531             return varname(NULL, '$', obase->op_targ,
12532                     NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
12533         }
12534         else {
12535             gv = cGVOPx_gv(obase);
12536             if (!gv)
12537                 break;
12538             if (match) {
12539                 SV **svp;
12540                 AV *const av = GvAV(gv);
12541                 if (!av || SvRMAGICAL(av))
12542                     break;
12543                 svp = av_fetch(av, (I32)obase->op_private, FALSE);
12544                 if (!svp || *svp != uninit_sv)
12545                     break;
12546             }
12547             return varname(gv, '$', 0,
12548                     NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
12549         }
12550         break;
12551
12552     case OP_EXISTS:
12553         o = cUNOPx(obase)->op_first;
12554         if (!o || o->op_type != OP_NULL ||
12555                 ! (o->op_targ == OP_AELEM || o->op_targ == OP_HELEM))
12556             break;
12557         return find_uninit_var(cBINOPo->op_last, uninit_sv, match);
12558
12559     case OP_AELEM:
12560     case OP_HELEM:
12561         if (PL_op == obase)
12562             /* $a[uninit_expr] or $h{uninit_expr} */
12563             return find_uninit_var(cBINOPx(obase)->op_last, uninit_sv, match);
12564
12565         gv = NULL;
12566         o = cBINOPx(obase)->op_first;
12567         kid = cBINOPx(obase)->op_last;
12568
12569         /* get the av or hv, and optionally the gv */
12570         sv = NULL;
12571         if  (o->op_type == OP_PADAV || o->op_type == OP_PADHV) {
12572             sv = PAD_SV(o->op_targ);
12573         }
12574         else if ((o->op_type == OP_RV2AV || o->op_type == OP_RV2HV)
12575                 && cUNOPo->op_first->op_type == OP_GV)
12576         {
12577             gv = cGVOPx_gv(cUNOPo->op_first);
12578             if (!gv)
12579                 break;
12580             sv = o->op_type
12581                 == OP_RV2HV ? MUTABLE_SV(GvHV(gv)) : MUTABLE_SV(GvAV(gv));
12582         }
12583         if (!sv)
12584             break;
12585
12586         if (kid && kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid))) {
12587             /* index is constant */
12588             if (match) {
12589                 if (SvMAGICAL(sv))
12590                     break;
12591                 if (obase->op_type == OP_HELEM) {
12592                     HE* he = hv_fetch_ent(MUTABLE_HV(sv), cSVOPx_sv(kid), 0, 0);
12593                     if (!he || HeVAL(he) != uninit_sv)
12594                         break;
12595                 }
12596                 else {
12597                     SV * const * const svp = av_fetch(MUTABLE_AV(sv), SvIV(cSVOPx_sv(kid)), FALSE);
12598                     if (!svp || *svp != uninit_sv)
12599                         break;
12600                 }
12601             }
12602             if (obase->op_type == OP_HELEM)
12603                 return varname(gv, '%', o->op_targ,
12604                             cSVOPx_sv(kid), 0, FUV_SUBSCRIPT_HASH);
12605             else
12606                 return varname(gv, '@', o->op_targ, NULL,
12607                             SvIV(cSVOPx_sv(kid)), FUV_SUBSCRIPT_ARRAY);
12608         }
12609         else  {
12610             /* index is an expression;
12611              * attempt to find a match within the aggregate */
12612             if (obase->op_type == OP_HELEM) {
12613                 SV * const keysv = find_hash_subscript((const HV*)sv, uninit_sv);
12614                 if (keysv)
12615                     return varname(gv, '%', o->op_targ,
12616                                                 keysv, 0, FUV_SUBSCRIPT_HASH);
12617             }
12618             else {
12619                 const I32 index
12620                     = find_array_subscript((const AV *)sv, uninit_sv);
12621                 if (index >= 0)
12622                     return varname(gv, '@', o->op_targ,
12623                                         NULL, index, FUV_SUBSCRIPT_ARRAY);
12624             }
12625             if (match)
12626                 break;
12627             return varname(gv,
12628                 (o->op_type == OP_PADAV || o->op_type == OP_RV2AV)
12629                 ? '@' : '%',
12630                 o->op_targ, NULL, 0, FUV_SUBSCRIPT_WITHIN);
12631         }
12632         break;
12633
12634     case OP_AASSIGN:
12635         /* only examine RHS */
12636         return find_uninit_var(cBINOPx(obase)->op_first, uninit_sv, match);
12637
12638     case OP_OPEN:
12639         o = cUNOPx(obase)->op_first;
12640         if (o->op_type == OP_PUSHMARK)
12641             o = o->op_sibling;
12642
12643         if (!o->op_sibling) {
12644             /* one-arg version of open is highly magical */
12645
12646             if (o->op_type == OP_GV) { /* open FOO; */
12647                 gv = cGVOPx_gv(o);
12648                 if (match && GvSV(gv) != uninit_sv)
12649                     break;
12650                 return varname(gv, '$', 0,
12651                             NULL, 0, FUV_SUBSCRIPT_NONE);
12652             }
12653             /* other possibilities not handled are:
12654              * open $x; or open my $x;  should return '${*$x}'
12655              * open expr;               should return '$'.expr ideally
12656              */
12657              break;
12658         }
12659         goto do_op;
12660
12661     /* ops where $_ may be an implicit arg */
12662     case OP_TRANS:
12663     case OP_SUBST:
12664     case OP_MATCH:
12665         if ( !(obase->op_flags & OPf_STACKED)) {
12666             if (uninit_sv == ((obase->op_private & OPpTARGET_MY)
12667                                  ? PAD_SVl(obase->op_targ)
12668                                  : DEFSV))
12669             {
12670                 sv = sv_newmortal();
12671                 sv_setpvs(sv, "$_");
12672                 return sv;
12673             }
12674         }
12675         goto do_op;
12676
12677     case OP_PRTF:
12678     case OP_PRINT:
12679     case OP_SAY:
12680         match = 1; /* print etc can return undef on defined args */
12681         /* skip filehandle as it can't produce 'undef' warning  */
12682         o = cUNOPx(obase)->op_first;
12683         if ((obase->op_flags & OPf_STACKED) && o->op_type == OP_PUSHMARK)
12684             o = o->op_sibling->op_sibling;
12685         goto do_op2;
12686
12687
12688     case OP_ENTEREVAL: /* could be eval $undef or $x='$undef'; eval $x */
12689     case OP_RV2SV:
12690     case OP_CUSTOM: /* XS or custom code could trigger random warnings */
12691
12692         /* the following ops are capable of returning PL_sv_undef even for
12693          * defined arg(s) */
12694
12695     case OP_BACKTICK:
12696     case OP_PIPE_OP:
12697     case OP_FILENO:
12698     case OP_BINMODE:
12699     case OP_TIED:
12700     case OP_GETC:
12701     case OP_SYSREAD:
12702     case OP_SEND:
12703     case OP_IOCTL:
12704     case OP_SOCKET:
12705     case OP_SOCKPAIR:
12706     case OP_BIND:
12707     case OP_CONNECT:
12708     case OP_LISTEN:
12709     case OP_ACCEPT:
12710     case OP_SHUTDOWN:
12711     case OP_SSOCKOPT:
12712     case OP_GETPEERNAME:
12713     case OP_FTRREAD:
12714     case OP_FTRWRITE:
12715     case OP_FTREXEC:
12716     case OP_FTROWNED:
12717     case OP_FTEREAD:
12718     case OP_FTEWRITE:
12719     case OP_FTEEXEC:
12720     case OP_FTEOWNED:
12721     case OP_FTIS:
12722     case OP_FTZERO:
12723     case OP_FTSIZE:
12724     case OP_FTFILE:
12725     case OP_FTDIR:
12726     case OP_FTLINK:
12727     case OP_FTPIPE:
12728     case OP_FTSOCK:
12729     case OP_FTBLK:
12730     case OP_FTCHR:
12731     case OP_FTTTY:
12732     case OP_FTSUID:
12733     case OP_FTSGID:
12734     case OP_FTSVTX:
12735     case OP_FTTEXT:
12736     case OP_FTBINARY:
12737     case OP_FTMTIME:
12738     case OP_FTATIME:
12739     case OP_FTCTIME:
12740     case OP_READLINK:
12741     case OP_OPEN_DIR:
12742     case OP_READDIR:
12743     case OP_TELLDIR:
12744     case OP_SEEKDIR:
12745     case OP_REWINDDIR:
12746     case OP_CLOSEDIR:
12747     case OP_GMTIME:
12748     case OP_ALARM:
12749     case OP_SEMGET:
12750     case OP_GETLOGIN:
12751     case OP_UNDEF:
12752     case OP_SUBSTR:
12753     case OP_AEACH:
12754     case OP_EACH:
12755     case OP_SORT:
12756     case OP_CALLER:
12757     case OP_DOFILE:
12758     case OP_PROTOTYPE:
12759     case OP_NCMP:
12760     case OP_SMARTMATCH:
12761     case OP_UNPACK:
12762     case OP_SYSOPEN:
12763     case OP_SYSSEEK:
12764         match = 1;
12765         goto do_op;
12766
12767     case OP_ENTERSUB:
12768     case OP_GOTO:
12769         /* XXX tmp hack: these two may call an XS sub, and currently
12770           XS subs don't have a SUB entry on the context stack, so CV and
12771           pad determination goes wrong, and BAD things happen. So, just
12772           don't try to determine the value under those circumstances.
12773           Need a better fix at dome point. DAPM 11/2007 */
12774         break;
12775
12776
12777     case OP_POS:
12778         /* def-ness of rval pos() is independent of the def-ness of its arg */
12779         if ( !(obase->op_flags & OPf_MOD))
12780             break;
12781
12782     case OP_SCHOMP:
12783     case OP_CHOMP:
12784         if (SvROK(PL_rs) && uninit_sv == SvRV(PL_rs))
12785             return newSVpvs_flags("${$/}", SVs_TEMP);
12786         /*FALLTHROUGH*/
12787
12788     default:
12789     do_op:
12790         if (!(obase->op_flags & OPf_KIDS))
12791             break;
12792         o = cUNOPx(obase)->op_first;
12793         
12794     do_op2:
12795         if (!o)
12796             break;
12797
12798         /* if all except one arg are constant, or have no side-effects,
12799          * or are optimized away, then it's unambiguous */
12800         o2 = NULL;
12801         for (kid=o; kid; kid = kid->op_sibling) {
12802             if (kid) {
12803                 const OPCODE type = kid->op_type;
12804                 if ( (type == OP_CONST && SvOK(cSVOPx_sv(kid)))
12805                   || (type == OP_NULL  && ! (kid->op_flags & OPf_KIDS))
12806                   || (type == OP_PUSHMARK)
12807                 )
12808                 continue;
12809             }
12810             if (o2) { /* more than one found */
12811                 o2 = NULL;
12812                 break;
12813             }
12814             o2 = kid;
12815         }
12816         if (o2)
12817             return find_uninit_var(o2, uninit_sv, match);
12818
12819         /* scan all args */
12820         while (o) {
12821             sv = find_uninit_var(o, uninit_sv, 1);
12822             if (sv)
12823                 return sv;
12824             o = o->op_sibling;
12825         }
12826         break;
12827     }
12828     return NULL;
12829 }
12830
12831
12832 /*
12833 =for apidoc report_uninit
12834
12835 Print appropriate "Use of uninitialized variable" warning
12836
12837 =cut
12838 */
12839
12840 void
12841 Perl_report_uninit(pTHX_ const SV *uninit_sv)
12842 {
12843     dVAR;
12844     if (PL_op) {
12845         SV* varname = NULL;
12846         if (uninit_sv) {
12847             varname = find_uninit_var(PL_op, uninit_sv,0);
12848             if (varname)
12849                 sv_insert(varname, 0, 0, " ", 1);
12850         }
12851         Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
12852                 varname ? SvPV_nolen_const(varname) : "",
12853                 " in ", OP_DESC(PL_op));
12854     }
12855     else
12856         Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
12857                     "", "", "");
12858 }
12859
12860 /*
12861  * Local variables:
12862  * c-indentation-style: bsd
12863  * c-basic-offset: 4
12864  * indent-tabs-mode: t
12865  * End:
12866  *
12867  * ex: set ts=8 sts=4 sw=4 noet:
12868  */