This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
perlunicode: Discourage use of is_utf8_char()
[perl5.git] / sv.c
1 /*    sv.c
2  *
3  *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4  *    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by Larry Wall
5  *    and others
6  *
7  *    You may distribute under the terms of either the GNU General Public
8  *    License or the Artistic License, as specified in the README file.
9  *
10  */
11
12 /*
13  * 'I wonder what the Entish is for "yes" and "no",' he thought.
14  *                                                      --Pippin
15  *
16  *     [p.480 of _The Lord of the Rings_, III/iv: "Treebeard"]
17  */
18
19 /*
20  *
21  *
22  * This file contains the code that creates, manipulates and destroys
23  * scalar values (SVs). The other types (AV, HV, GV, etc.) reuse the
24  * structure of an SV, so their creation and destruction is handled
25  * here; higher-level functions are in av.c, hv.c, and so on. Opcode
26  * level functions (eg. substr, split, join) for each of the types are
27  * in the pp*.c files.
28  */
29
30 #include "EXTERN.h"
31 #define PERL_IN_SV_C
32 #include "perl.h"
33 #include "regcomp.h"
34
35 #ifndef HAS_C99
36 # if __STDC_VERSION__ >= 199901L && !defined(VMS)
37 #  define HAS_C99 1
38 # endif
39 #endif
40 #if HAS_C99
41 # include <stdint.h>
42 #endif
43
44 #define FCALL *f
45
46 #ifdef __Lynx__
47 /* Missing proto on LynxOS */
48   char *gconvert(double, int, int,  char *);
49 #endif
50
51 #ifdef PERL_UTF8_CACHE_ASSERT
52 /* if adding more checks watch out for the following tests:
53  *   t/op/index.t t/op/length.t t/op/pat.t t/op/substr.t
54  *   lib/utf8.t lib/Unicode/Collate/t/index.t
55  * --jhi
56  */
57 #   define ASSERT_UTF8_CACHE(cache) \
58     STMT_START { if (cache) { assert((cache)[0] <= (cache)[1]); \
59                               assert((cache)[2] <= (cache)[3]); \
60                               assert((cache)[3] <= (cache)[1]);} \
61                               } STMT_END
62 #else
63 #   define ASSERT_UTF8_CACHE(cache) NOOP
64 #endif
65
66 #ifdef PERL_OLD_COPY_ON_WRITE
67 #define SV_COW_NEXT_SV(sv)      INT2PTR(SV *,SvUVX(sv))
68 #define SV_COW_NEXT_SV_SET(current,next)        SvUV_set(current, PTR2UV(next))
69 /* This is a pessimistic view. Scalar must be purely a read-write PV to copy-
70    on-write.  */
71 #endif
72
73 /* ============================================================================
74
75 =head1 Allocation and deallocation of SVs.
76
77 An SV (or AV, HV, etc.) is allocated in two parts: the head (struct
78 sv, av, hv...) contains type and reference count information, and for
79 many types, a pointer to the body (struct xrv, xpv, xpviv...), which
80 contains fields specific to each type.  Some types store all they need
81 in the head, so don't have a body.
82
83 In all but the most memory-paranoid configurations (ex: PURIFY), heads
84 and bodies are allocated out of arenas, which by default are
85 approximately 4K chunks of memory parcelled up into N heads or bodies.
86 Sv-bodies are allocated by their sv-type, guaranteeing size
87 consistency needed to allocate safely from arrays.
88
89 For SV-heads, the first slot in each arena is reserved, and holds a
90 link to the next arena, some flags, and a note of the number of slots.
91 Snaked through each arena chain is a linked list of free items; when
92 this becomes empty, an extra arena is allocated and divided up into N
93 items which are threaded into the free list.
94
95 SV-bodies are similar, but they use arena-sets by default, which
96 separate the link and info from the arena itself, and reclaim the 1st
97 slot in the arena.  SV-bodies are further described later.
98
99 The following global variables are associated with arenas:
100
101     PL_sv_arenaroot     pointer to list of SV arenas
102     PL_sv_root          pointer to list of free SV structures
103
104     PL_body_arenas      head of linked-list of body arenas
105     PL_body_roots[]     array of pointers to list of free bodies of svtype
106                         arrays are indexed by the svtype needed
107
108 A few special SV heads are not allocated from an arena, but are
109 instead directly created in the interpreter structure, eg PL_sv_undef.
110 The size of arenas can be changed from the default by setting
111 PERL_ARENA_SIZE appropriately at compile time.
112
113 The SV arena serves the secondary purpose of allowing still-live SVs
114 to be located and destroyed during final cleanup.
115
116 At the lowest level, the macros new_SV() and del_SV() grab and free
117 an SV head.  (If debugging with -DD, del_SV() calls the function S_del_sv()
118 to return the SV to the free list with error checking.) new_SV() calls
119 more_sv() / sv_add_arena() to add an extra arena if the free list is empty.
120 SVs in the free list have their SvTYPE field set to all ones.
121
122 At the time of very final cleanup, sv_free_arenas() is called from
123 perl_destruct() to physically free all the arenas allocated since the
124 start of the interpreter.
125
126 The function visit() scans the SV arenas list, and calls a specified
127 function for each SV it finds which is still live - ie which has an SvTYPE
128 other than all 1's, and a non-zero SvREFCNT. visit() is used by the
129 following functions (specified as [function that calls visit()] / [function
130 called by visit() for each SV]):
131
132     sv_report_used() / do_report_used()
133                         dump all remaining SVs (debugging aid)
134
135     sv_clean_objs() / do_clean_objs(),do_clean_named_objs(),
136                       do_clean_named_io_objs()
137                         Attempt to free all objects pointed to by RVs,
138                         and try to do the same for all objects indirectly
139                         referenced by typeglobs too.  Called once from
140                         perl_destruct(), prior to calling sv_clean_all()
141                         below.
142
143     sv_clean_all() / do_clean_all()
144                         SvREFCNT_dec(sv) each remaining SV, possibly
145                         triggering an sv_free(). It also sets the
146                         SVf_BREAK flag on the SV to indicate that the
147                         refcnt has been artificially lowered, and thus
148                         stopping sv_free() from giving spurious warnings
149                         about SVs which unexpectedly have a refcnt
150                         of zero.  called repeatedly from perl_destruct()
151                         until there are no SVs left.
152
153 =head2 Arena allocator API Summary
154
155 Private API to rest of sv.c
156
157     new_SV(),  del_SV(),
158
159     new_XPVNV(), del_XPVGV(),
160     etc
161
162 Public API:
163
164     sv_report_used(), sv_clean_objs(), sv_clean_all(), sv_free_arenas()
165
166 =cut
167
168  * ========================================================================= */
169
170 /*
171  * "A time to plant, and a time to uproot what was planted..."
172  */
173
174 #ifdef PERL_MEM_LOG
175 #  define MEM_LOG_NEW_SV(sv, file, line, func)  \
176             Perl_mem_log_new_sv(sv, file, line, func)
177 #  define MEM_LOG_DEL_SV(sv, file, line, func)  \
178             Perl_mem_log_del_sv(sv, file, line, func)
179 #else
180 #  define MEM_LOG_NEW_SV(sv, file, line, func)  NOOP
181 #  define MEM_LOG_DEL_SV(sv, file, line, func)  NOOP
182 #endif
183
184 #ifdef DEBUG_LEAKING_SCALARS
185 #  define FREE_SV_DEBUG_FILE(sv) Safefree((sv)->sv_debug_file)
186 #  define DEBUG_SV_SERIAL(sv)                                               \
187     DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) del_SV\n",    \
188             PTR2UV(sv), (long)(sv)->sv_debug_serial))
189 #else
190 #  define FREE_SV_DEBUG_FILE(sv)
191 #  define DEBUG_SV_SERIAL(sv)   NOOP
192 #endif
193
194 #ifdef PERL_POISON
195 #  define SvARENA_CHAIN(sv)     ((sv)->sv_u.svu_rv)
196 #  define SvARENA_CHAIN_SET(sv,val)     (sv)->sv_u.svu_rv = MUTABLE_SV((val))
197 /* Whilst I'd love to do this, it seems that things like to check on
198    unreferenced scalars
199 #  define POSION_SV_HEAD(sv)    PoisonNew(sv, 1, struct STRUCT_SV)
200 */
201 #  define POSION_SV_HEAD(sv)    PoisonNew(&SvANY(sv), 1, void *), \
202                                 PoisonNew(&SvREFCNT(sv), 1, U32)
203 #else
204 #  define SvARENA_CHAIN(sv)     SvANY(sv)
205 #  define SvARENA_CHAIN_SET(sv,val)     SvANY(sv) = (void *)(val)
206 #  define POSION_SV_HEAD(sv)
207 #endif
208
209 /* Mark an SV head as unused, and add to free list.
210  *
211  * If SVf_BREAK is set, skip adding it to the free list, as this SV had
212  * its refcount artificially decremented during global destruction, so
213  * there may be dangling pointers to it. The last thing we want in that
214  * case is for it to be reused. */
215
216 #define plant_SV(p) \
217     STMT_START {                                        \
218         const U32 old_flags = SvFLAGS(p);                       \
219         MEM_LOG_DEL_SV(p, __FILE__, __LINE__, FUNCTION__);  \
220         DEBUG_SV_SERIAL(p);                             \
221         FREE_SV_DEBUG_FILE(p);                          \
222         POSION_SV_HEAD(p);                              \
223         SvFLAGS(p) = SVTYPEMASK;                        \
224         if (!(old_flags & SVf_BREAK)) {         \
225             SvARENA_CHAIN_SET(p, PL_sv_root);   \
226             PL_sv_root = (p);                           \
227         }                                               \
228         --PL_sv_count;                                  \
229     } STMT_END
230
231 #define uproot_SV(p) \
232     STMT_START {                                        \
233         (p) = PL_sv_root;                               \
234         PL_sv_root = MUTABLE_SV(SvARENA_CHAIN(p));              \
235         ++PL_sv_count;                                  \
236     } STMT_END
237
238
239 /* make some more SVs by adding another arena */
240
241 STATIC SV*
242 S_more_sv(pTHX)
243 {
244     dVAR;
245     SV* sv;
246     char *chunk;                /* must use New here to match call to */
247     Newx(chunk,PERL_ARENA_SIZE,char);  /* Safefree() in sv_free_arenas() */
248     sv_add_arena(chunk, PERL_ARENA_SIZE, 0);
249     uproot_SV(sv);
250     return sv;
251 }
252
253 /* new_SV(): return a new, empty SV head */
254
255 #ifdef DEBUG_LEAKING_SCALARS
256 /* provide a real function for a debugger to play with */
257 STATIC SV*
258 S_new_SV(pTHX_ const char *file, int line, const char *func)
259 {
260     SV* sv;
261
262     if (PL_sv_root)
263         uproot_SV(sv);
264     else
265         sv = S_more_sv(aTHX);
266     SvANY(sv) = 0;
267     SvREFCNT(sv) = 1;
268     SvFLAGS(sv) = 0;
269     sv->sv_debug_optype = PL_op ? PL_op->op_type : 0;
270     sv->sv_debug_line = (U16) (PL_parser && PL_parser->copline != NOLINE
271                 ? PL_parser->copline
272                 :  PL_curcop
273                     ? CopLINE(PL_curcop)
274                     : 0
275             );
276     sv->sv_debug_inpad = 0;
277     sv->sv_debug_parent = NULL;
278     sv->sv_debug_file = PL_curcop ? savepv(CopFILE(PL_curcop)): NULL;
279
280     sv->sv_debug_serial = PL_sv_serial++;
281
282     MEM_LOG_NEW_SV(sv, file, line, func);
283     DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) new_SV (from %s:%d [%s])\n",
284             PTR2UV(sv), (long)sv->sv_debug_serial, file, line, func));
285
286     return sv;
287 }
288 #  define new_SV(p) (p)=S_new_SV(aTHX_ __FILE__, __LINE__, FUNCTION__)
289
290 #else
291 #  define new_SV(p) \
292     STMT_START {                                        \
293         if (PL_sv_root)                                 \
294             uproot_SV(p);                               \
295         else                                            \
296             (p) = S_more_sv(aTHX);                      \
297         SvANY(p) = 0;                                   \
298         SvREFCNT(p) = 1;                                \
299         SvFLAGS(p) = 0;                                 \
300         MEM_LOG_NEW_SV(p, __FILE__, __LINE__, FUNCTION__);  \
301     } STMT_END
302 #endif
303
304
305 /* del_SV(): return an empty SV head to the free list */
306
307 #ifdef DEBUGGING
308
309 #define del_SV(p) \
310     STMT_START {                                        \
311         if (DEBUG_D_TEST)                               \
312             del_sv(p);                                  \
313         else                                            \
314             plant_SV(p);                                \
315     } STMT_END
316
317 STATIC void
318 S_del_sv(pTHX_ SV *p)
319 {
320     dVAR;
321
322     PERL_ARGS_ASSERT_DEL_SV;
323
324     if (DEBUG_D_TEST) {
325         SV* sva;
326         bool ok = 0;
327         for (sva = PL_sv_arenaroot; sva; sva = MUTABLE_SV(SvANY(sva))) {
328             const SV * const sv = sva + 1;
329             const SV * const svend = &sva[SvREFCNT(sva)];
330             if (p >= sv && p < svend) {
331                 ok = 1;
332                 break;
333             }
334         }
335         if (!ok) {
336             Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),
337                              "Attempt to free non-arena SV: 0x%"UVxf
338                              pTHX__FORMAT, PTR2UV(p) pTHX__VALUE);
339             return;
340         }
341     }
342     plant_SV(p);
343 }
344
345 #else /* ! DEBUGGING */
346
347 #define del_SV(p)   plant_SV(p)
348
349 #endif /* DEBUGGING */
350
351
352 /*
353 =head1 SV Manipulation Functions
354
355 =for apidoc sv_add_arena
356
357 Given a chunk of memory, link it to the head of the list of arenas,
358 and split it into a list of free SVs.
359
360 =cut
361 */
362
363 static void
364 S_sv_add_arena(pTHX_ char *const ptr, const U32 size, const U32 flags)
365 {
366     dVAR;
367     SV *const sva = MUTABLE_SV(ptr);
368     register SV* sv;
369     register SV* svend;
370
371     PERL_ARGS_ASSERT_SV_ADD_ARENA;
372
373     /* The first SV in an arena isn't an SV. */
374     SvANY(sva) = (void *) PL_sv_arenaroot;              /* ptr to next arena */
375     SvREFCNT(sva) = size / sizeof(SV);          /* number of SV slots */
376     SvFLAGS(sva) = flags;                       /* FAKE if not to be freed */
377
378     PL_sv_arenaroot = sva;
379     PL_sv_root = sva + 1;
380
381     svend = &sva[SvREFCNT(sva) - 1];
382     sv = sva + 1;
383     while (sv < svend) {
384         SvARENA_CHAIN_SET(sv, (sv + 1));
385 #ifdef DEBUGGING
386         SvREFCNT(sv) = 0;
387 #endif
388         /* Must always set typemask because it's always checked in on cleanup
389            when the arenas are walked looking for objects.  */
390         SvFLAGS(sv) = SVTYPEMASK;
391         sv++;
392     }
393     SvARENA_CHAIN_SET(sv, 0);
394 #ifdef DEBUGGING
395     SvREFCNT(sv) = 0;
396 #endif
397     SvFLAGS(sv) = SVTYPEMASK;
398 }
399
400 /* visit(): call the named function for each non-free SV in the arenas
401  * whose flags field matches the flags/mask args. */
402
403 STATIC I32
404 S_visit(pTHX_ SVFUNC_t f, const U32 flags, const U32 mask)
405 {
406     dVAR;
407     SV* sva;
408     I32 visited = 0;
409
410     PERL_ARGS_ASSERT_VISIT;
411
412     for (sva = PL_sv_arenaroot; sva; sva = MUTABLE_SV(SvANY(sva))) {
413         register const SV * const svend = &sva[SvREFCNT(sva)];
414         register SV* sv;
415         for (sv = sva + 1; sv < svend; ++sv) {
416             if (SvTYPE(sv) != (svtype)SVTYPEMASK
417                     && (sv->sv_flags & mask) == flags
418                     && SvREFCNT(sv))
419             {
420                 (FCALL)(aTHX_ sv);
421                 ++visited;
422             }
423         }
424     }
425     return visited;
426 }
427
428 #ifdef DEBUGGING
429
430 /* called by sv_report_used() for each live SV */
431
432 static void
433 do_report_used(pTHX_ SV *const sv)
434 {
435     if (SvTYPE(sv) != (svtype)SVTYPEMASK) {
436         PerlIO_printf(Perl_debug_log, "****\n");
437         sv_dump(sv);
438     }
439 }
440 #endif
441
442 /*
443 =for apidoc sv_report_used
444
445 Dump the contents of all SVs not yet freed (debugging aid).
446
447 =cut
448 */
449
450 void
451 Perl_sv_report_used(pTHX)
452 {
453 #ifdef DEBUGGING
454     visit(do_report_used, 0, 0);
455 #else
456     PERL_UNUSED_CONTEXT;
457 #endif
458 }
459
460 /* called by sv_clean_objs() for each live SV */
461
462 static void
463 do_clean_objs(pTHX_ SV *const ref)
464 {
465     dVAR;
466     assert (SvROK(ref));
467     {
468         SV * const target = SvRV(ref);
469         if (SvOBJECT(target)) {
470             DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(ref)));
471             if (SvWEAKREF(ref)) {
472                 sv_del_backref(target, ref);
473                 SvWEAKREF_off(ref);
474                 SvRV_set(ref, NULL);
475             } else {
476                 SvROK_off(ref);
477                 SvRV_set(ref, NULL);
478                 SvREFCNT_dec(target);
479             }
480         }
481     }
482
483     /* XXX Might want to check arrays, etc. */
484 }
485
486
487 /* clear any slots in a GV which hold objects - except IO;
488  * called by sv_clean_objs() for each live GV */
489
490 static void
491 do_clean_named_objs(pTHX_ SV *const sv)
492 {
493     dVAR;
494     SV *obj;
495     assert(SvTYPE(sv) == SVt_PVGV);
496     assert(isGV_with_GP(sv));
497     if (!GvGP(sv))
498         return;
499
500     /* freeing GP entries may indirectly free the current GV;
501      * hold onto it while we mess with the GP slots */
502     SvREFCNT_inc(sv);
503
504     if ( ((obj = GvSV(sv) )) && SvOBJECT(obj)) {
505         DEBUG_D((PerlIO_printf(Perl_debug_log,
506                 "Cleaning named glob SV object:\n "), sv_dump(obj)));
507         GvSV(sv) = NULL;
508         SvREFCNT_dec(obj);
509     }
510     if ( ((obj = MUTABLE_SV(GvAV(sv)) )) && SvOBJECT(obj)) {
511         DEBUG_D((PerlIO_printf(Perl_debug_log,
512                 "Cleaning named glob AV object:\n "), sv_dump(obj)));
513         GvAV(sv) = NULL;
514         SvREFCNT_dec(obj);
515     }
516     if ( ((obj = MUTABLE_SV(GvHV(sv)) )) && SvOBJECT(obj)) {
517         DEBUG_D((PerlIO_printf(Perl_debug_log,
518                 "Cleaning named glob HV object:\n "), sv_dump(obj)));
519         GvHV(sv) = NULL;
520         SvREFCNT_dec(obj);
521     }
522     if ( ((obj = MUTABLE_SV(GvCV(sv)) )) && SvOBJECT(obj)) {
523         DEBUG_D((PerlIO_printf(Perl_debug_log,
524                 "Cleaning named glob CV object:\n "), sv_dump(obj)));
525         GvCV_set(sv, NULL);
526         SvREFCNT_dec(obj);
527     }
528     SvREFCNT_dec(sv); /* undo the inc above */
529 }
530
531 /* clear any IO slots in a GV which hold objects (except stderr, defout);
532  * called by sv_clean_objs() for each live GV */
533
534 static void
535 do_clean_named_io_objs(pTHX_ SV *const sv)
536 {
537     dVAR;
538     SV *obj;
539     assert(SvTYPE(sv) == SVt_PVGV);
540     assert(isGV_with_GP(sv));
541     if (!GvGP(sv) || sv == (SV*)PL_stderrgv || sv == (SV*)PL_defoutgv)
542         return;
543
544     SvREFCNT_inc(sv);
545     if ( ((obj = MUTABLE_SV(GvIO(sv)) )) && SvOBJECT(obj)) {
546         DEBUG_D((PerlIO_printf(Perl_debug_log,
547                 "Cleaning named glob IO object:\n "), sv_dump(obj)));
548         GvIOp(sv) = NULL;
549         SvREFCNT_dec(obj);
550     }
551     SvREFCNT_dec(sv); /* undo the inc above */
552 }
553
554 /* Void wrapper to pass to visit() */
555 static void
556 do_curse(pTHX_ SV * const sv) {
557     if ((PL_stderrgv && GvGP(PL_stderrgv) && (SV*)GvIO(PL_stderrgv) == sv)
558      || (PL_defoutgv && GvGP(PL_defoutgv) && (SV*)GvIO(PL_defoutgv) == sv))
559         return;
560     (void)curse(sv, 0);
561 }
562
563 /*
564 =for apidoc sv_clean_objs
565
566 Attempt to destroy all objects not yet freed.
567
568 =cut
569 */
570
571 void
572 Perl_sv_clean_objs(pTHX)
573 {
574     dVAR;
575     GV *olddef, *olderr;
576     PL_in_clean_objs = TRUE;
577     visit(do_clean_objs, SVf_ROK, SVf_ROK);
578     /* Some barnacles may yet remain, clinging to typeglobs.
579      * Run the non-IO destructors first: they may want to output
580      * error messages, close files etc */
581     visit(do_clean_named_objs, SVt_PVGV|SVpgv_GP, SVTYPEMASK|SVp_POK|SVpgv_GP);
582     visit(do_clean_named_io_objs, SVt_PVGV|SVpgv_GP, SVTYPEMASK|SVp_POK|SVpgv_GP);
583     /* And if there are some very tenacious barnacles clinging to arrays,
584        closures, or what have you.... */
585     visit(do_curse, SVs_OBJECT, SVs_OBJECT);
586     olddef = PL_defoutgv;
587     PL_defoutgv = NULL; /* disable skip of PL_defoutgv */
588     if (olddef && isGV_with_GP(olddef))
589         do_clean_named_io_objs(aTHX_ MUTABLE_SV(olddef));
590     olderr = PL_stderrgv;
591     PL_stderrgv = NULL; /* disable skip of PL_stderrgv */
592     if (olderr && isGV_with_GP(olderr))
593         do_clean_named_io_objs(aTHX_ MUTABLE_SV(olderr));
594     SvREFCNT_dec(olddef);
595     PL_in_clean_objs = FALSE;
596 }
597
598 /* called by sv_clean_all() for each live SV */
599
600 static void
601 do_clean_all(pTHX_ SV *const sv)
602 {
603     dVAR;
604     if (sv == (const SV *) PL_fdpid || sv == (const SV *)PL_strtab) {
605         /* don't clean pid table and strtab */
606         return;
607     }
608     DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%"UVxf"\n", PTR2UV(sv)) ));
609     SvFLAGS(sv) |= SVf_BREAK;
610     SvREFCNT_dec(sv);
611 }
612
613 /*
614 =for apidoc sv_clean_all
615
616 Decrement the refcnt of each remaining SV, possibly triggering a
617 cleanup.  This function may have to be called multiple times to free
618 SVs which are in complex self-referential hierarchies.
619
620 =cut
621 */
622
623 I32
624 Perl_sv_clean_all(pTHX)
625 {
626     dVAR;
627     I32 cleaned;
628     PL_in_clean_all = TRUE;
629     cleaned = visit(do_clean_all, 0,0);
630     return cleaned;
631 }
632
633 /*
634   ARENASETS: a meta-arena implementation which separates arena-info
635   into struct arena_set, which contains an array of struct
636   arena_descs, each holding info for a single arena.  By separating
637   the meta-info from the arena, we recover the 1st slot, formerly
638   borrowed for list management.  The arena_set is about the size of an
639   arena, avoiding the needless malloc overhead of a naive linked-list.
640
641   The cost is 1 arena-set malloc per ~320 arena-mallocs, + the unused
642   memory in the last arena-set (1/2 on average).  In trade, we get
643   back the 1st slot in each arena (ie 1.7% of a CV-arena, less for
644   smaller types).  The recovery of the wasted space allows use of
645   small arenas for large, rare body types, by changing array* fields
646   in body_details_by_type[] below.
647 */
648 struct arena_desc {
649     char       *arena;          /* the raw storage, allocated aligned */
650     size_t      size;           /* its size ~4k typ */
651     svtype      utype;          /* bodytype stored in arena */
652 };
653
654 struct arena_set;
655
656 /* Get the maximum number of elements in set[] such that struct arena_set
657    will fit within PERL_ARENA_SIZE, which is probably just under 4K, and
658    therefore likely to be 1 aligned memory page.  */
659
660 #define ARENAS_PER_SET  ((PERL_ARENA_SIZE - sizeof(struct arena_set*) \
661                           - 2 * sizeof(int)) / sizeof (struct arena_desc))
662
663 struct arena_set {
664     struct arena_set* next;
665     unsigned int   set_size;    /* ie ARENAS_PER_SET */
666     unsigned int   curr;        /* index of next available arena-desc */
667     struct arena_desc set[ARENAS_PER_SET];
668 };
669
670 /*
671 =for apidoc sv_free_arenas
672
673 Deallocate the memory used by all arenas.  Note that all the individual SV
674 heads and bodies within the arenas must already have been freed.
675
676 =cut
677 */
678 void
679 Perl_sv_free_arenas(pTHX)
680 {
681     dVAR;
682     SV* sva;
683     SV* svanext;
684     unsigned int i;
685
686     /* Free arenas here, but be careful about fake ones.  (We assume
687        contiguity of the fake ones with the corresponding real ones.) */
688
689     for (sva = PL_sv_arenaroot; sva; sva = svanext) {
690         svanext = MUTABLE_SV(SvANY(sva));
691         while (svanext && SvFAKE(svanext))
692             svanext = MUTABLE_SV(SvANY(svanext));
693
694         if (!SvFAKE(sva))
695             Safefree(sva);
696     }
697
698     {
699         struct arena_set *aroot = (struct arena_set*) PL_body_arenas;
700
701         while (aroot) {
702             struct arena_set *current = aroot;
703             i = aroot->curr;
704             while (i--) {
705                 assert(aroot->set[i].arena);
706                 Safefree(aroot->set[i].arena);
707             }
708             aroot = aroot->next;
709             Safefree(current);
710         }
711     }
712     PL_body_arenas = 0;
713
714     i = PERL_ARENA_ROOTS_SIZE;
715     while (i--)
716         PL_body_roots[i] = 0;
717
718     PL_sv_arenaroot = 0;
719     PL_sv_root = 0;
720 }
721
722 /*
723   Here are mid-level routines that manage the allocation of bodies out
724   of the various arenas.  There are 5 kinds of arenas:
725
726   1. SV-head arenas, which are discussed and handled above
727   2. regular body arenas
728   3. arenas for reduced-size bodies
729   4. Hash-Entry arenas
730
731   Arena types 2 & 3 are chained by body-type off an array of
732   arena-root pointers, which is indexed by svtype.  Some of the
733   larger/less used body types are malloced singly, since a large
734   unused block of them is wasteful.  Also, several svtypes dont have
735   bodies; the data fits into the sv-head itself.  The arena-root
736   pointer thus has a few unused root-pointers (which may be hijacked
737   later for arena types 4,5)
738
739   3 differs from 2 as an optimization; some body types have several
740   unused fields in the front of the structure (which are kept in-place
741   for consistency).  These bodies can be allocated in smaller chunks,
742   because the leading fields arent accessed.  Pointers to such bodies
743   are decremented to point at the unused 'ghost' memory, knowing that
744   the pointers are used with offsets to the real memory.
745
746
747 =head1 SV-Body Allocation
748
749 Allocation of SV-bodies is similar to SV-heads, differing as follows;
750 the allocation mechanism is used for many body types, so is somewhat
751 more complicated, it uses arena-sets, and has no need for still-live
752 SV detection.
753
754 At the outermost level, (new|del)_X*V macros return bodies of the
755 appropriate type.  These macros call either (new|del)_body_type or
756 (new|del)_body_allocated macro pairs, depending on specifics of the
757 type.  Most body types use the former pair, the latter pair is used to
758 allocate body types with "ghost fields".
759
760 "ghost fields" are fields that are unused in certain types, and
761 consequently don't need to actually exist.  They are declared because
762 they're part of a "base type", which allows use of functions as
763 methods.  The simplest examples are AVs and HVs, 2 aggregate types
764 which don't use the fields which support SCALAR semantics.
765
766 For these types, the arenas are carved up into appropriately sized
767 chunks, we thus avoid wasted memory for those unaccessed members.
768 When bodies are allocated, we adjust the pointer back in memory by the
769 size of the part not allocated, so it's as if we allocated the full
770 structure.  (But things will all go boom if you write to the part that
771 is "not there", because you'll be overwriting the last members of the
772 preceding structure in memory.)
773
774 We calculate the correction using the STRUCT_OFFSET macro on the first
775 member present. If the allocated structure is smaller (no initial NV
776 actually allocated) then the net effect is to subtract the size of the NV
777 from the pointer, to return a new pointer as if an initial NV were actually
778 allocated. (We were using structures named *_allocated for this, but
779 this turned out to be a subtle bug, because a structure without an NV
780 could have a lower alignment constraint, but the compiler is allowed to
781 optimised accesses based on the alignment constraint of the actual pointer
782 to the full structure, for example, using a single 64 bit load instruction
783 because it "knows" that two adjacent 32 bit members will be 8-byte aligned.)
784
785 This is the same trick as was used for NV and IV bodies. Ironically it
786 doesn't need to be used for NV bodies any more, because NV is now at
787 the start of the structure. IV bodies don't need it either, because
788 they are no longer allocated.
789
790 In turn, the new_body_* allocators call S_new_body(), which invokes
791 new_body_inline macro, which takes a lock, and takes a body off the
792 linked list at PL_body_roots[sv_type], calling Perl_more_bodies() if
793 necessary to refresh an empty list.  Then the lock is released, and
794 the body is returned.
795
796 Perl_more_bodies allocates a new arena, and carves it up into an array of N
797 bodies, which it strings into a linked list.  It looks up arena-size
798 and body-size from the body_details table described below, thus
799 supporting the multiple body-types.
800
801 If PURIFY is defined, or PERL_ARENA_SIZE=0, arenas are not used, and
802 the (new|del)_X*V macros are mapped directly to malloc/free.
803
804 For each sv-type, struct body_details bodies_by_type[] carries
805 parameters which control these aspects of SV handling:
806
807 Arena_size determines whether arenas are used for this body type, and if
808 so, how big they are.  PURIFY or PERL_ARENA_SIZE=0 set this field to
809 zero, forcing individual mallocs and frees.
810
811 Body_size determines how big a body is, and therefore how many fit into
812 each arena.  Offset carries the body-pointer adjustment needed for
813 "ghost fields", and is used in *_allocated macros.
814
815 But its main purpose is to parameterize info needed in
816 Perl_sv_upgrade().  The info here dramatically simplifies the function
817 vs the implementation in 5.8.8, making it table-driven.  All fields
818 are used for this, except for arena_size.
819
820 For the sv-types that have no bodies, arenas are not used, so those
821 PL_body_roots[sv_type] are unused, and can be overloaded.  In
822 something of a special case, SVt_NULL is borrowed for HE arenas;
823 PL_body_roots[HE_SVSLOT=SVt_NULL] is filled by S_more_he, but the
824 bodies_by_type[SVt_NULL] slot is not used, as the table is not
825 available in hv.c.
826
827 */
828
829 struct body_details {
830     U8 body_size;       /* Size to allocate  */
831     U8 copy;            /* Size of structure to copy (may be shorter)  */
832     U8 offset;
833     unsigned int type : 4;          /* We have space for a sanity check.  */
834     unsigned int cant_upgrade : 1;  /* Cannot upgrade this type */
835     unsigned int zero_nv : 1;       /* zero the NV when upgrading from this */
836     unsigned int arena : 1;         /* Allocated from an arena */
837     size_t arena_size;              /* Size of arena to allocate */
838 };
839
840 #define HADNV FALSE
841 #define NONV TRUE
842
843
844 #ifdef PURIFY
845 /* With -DPURFIY we allocate everything directly, and don't use arenas.
846    This seems a rather elegant way to simplify some of the code below.  */
847 #define HASARENA FALSE
848 #else
849 #define HASARENA TRUE
850 #endif
851 #define NOARENA FALSE
852
853 /* Size the arenas to exactly fit a given number of bodies.  A count
854    of 0 fits the max number bodies into a PERL_ARENA_SIZE.block,
855    simplifying the default.  If count > 0, the arena is sized to fit
856    only that many bodies, allowing arenas to be used for large, rare
857    bodies (XPVFM, XPVIO) without undue waste.  The arena size is
858    limited by PERL_ARENA_SIZE, so we can safely oversize the
859    declarations.
860  */
861 #define FIT_ARENA0(body_size)                           \
862     ((size_t)(PERL_ARENA_SIZE / body_size) * body_size)
863 #define FIT_ARENAn(count,body_size)                     \
864     ( count * body_size <= PERL_ARENA_SIZE)             \
865     ? count * body_size                                 \
866     : FIT_ARENA0 (body_size)
867 #define FIT_ARENA(count,body_size)                      \
868     count                                               \
869     ? FIT_ARENAn (count, body_size)                     \
870     : FIT_ARENA0 (body_size)
871
872 /* Calculate the length to copy. Specifically work out the length less any
873    final padding the compiler needed to add.  See the comment in sv_upgrade
874    for why copying the padding proved to be a bug.  */
875
876 #define copy_length(type, last_member) \
877         STRUCT_OFFSET(type, last_member) \
878         + sizeof (((type*)SvANY((const SV *)0))->last_member)
879
880 static const struct body_details bodies_by_type[] = {
881     /* HEs use this offset for their arena.  */
882     { 0, 0, 0, SVt_NULL, FALSE, NONV, NOARENA, 0 },
883
884     /* The bind placeholder pretends to be an RV for now.
885        Also it's marked as "can't upgrade" to stop anyone using it before it's
886        implemented.  */
887     { 0, 0, 0, SVt_BIND, TRUE, NONV, NOARENA, 0 },
888
889     /* IVs are in the head, so the allocation size is 0.  */
890     { 0,
891       sizeof(IV), /* This is used to copy out the IV body.  */
892       STRUCT_OFFSET(XPVIV, xiv_iv), SVt_IV, FALSE, NONV,
893       NOARENA /* IVS don't need an arena  */, 0
894     },
895
896     { sizeof(NV), sizeof(NV),
897       STRUCT_OFFSET(XPVNV, xnv_u),
898       SVt_NV, FALSE, HADNV, HASARENA, FIT_ARENA(0, sizeof(NV)) },
899
900     { sizeof(XPV) - STRUCT_OFFSET(XPV, xpv_cur),
901       copy_length(XPV, xpv_len) - STRUCT_OFFSET(XPV, xpv_cur),
902       + STRUCT_OFFSET(XPV, xpv_cur),
903       SVt_PV, FALSE, NONV, HASARENA,
904       FIT_ARENA(0, sizeof(XPV) - STRUCT_OFFSET(XPV, xpv_cur)) },
905
906     { sizeof(XPVIV) - STRUCT_OFFSET(XPV, xpv_cur),
907       copy_length(XPVIV, xiv_u) - STRUCT_OFFSET(XPV, xpv_cur),
908       + STRUCT_OFFSET(XPV, xpv_cur),
909       SVt_PVIV, FALSE, NONV, HASARENA,
910       FIT_ARENA(0, sizeof(XPVIV) - STRUCT_OFFSET(XPV, xpv_cur)) },
911
912     { sizeof(XPVNV) - STRUCT_OFFSET(XPV, xpv_cur),
913       copy_length(XPVNV, xnv_u) - STRUCT_OFFSET(XPV, xpv_cur),
914       + STRUCT_OFFSET(XPV, xpv_cur),
915       SVt_PVNV, FALSE, HADNV, HASARENA,
916       FIT_ARENA(0, sizeof(XPVNV) - STRUCT_OFFSET(XPV, xpv_cur)) },
917
918     { sizeof(XPVMG), copy_length(XPVMG, xnv_u), 0, SVt_PVMG, FALSE, HADNV,
919       HASARENA, FIT_ARENA(0, sizeof(XPVMG)) },
920
921     { sizeof(regexp),
922       sizeof(regexp),
923       0,
924       SVt_REGEXP, FALSE, NONV, HASARENA,
925       FIT_ARENA(0, sizeof(regexp))
926     },
927
928     { sizeof(XPVGV), sizeof(XPVGV), 0, SVt_PVGV, TRUE, HADNV,
929       HASARENA, FIT_ARENA(0, sizeof(XPVGV)) },
930     
931     { sizeof(XPVLV), sizeof(XPVLV), 0, SVt_PVLV, TRUE, HADNV,
932       HASARENA, FIT_ARENA(0, sizeof(XPVLV)) },
933
934     { sizeof(XPVAV),
935       copy_length(XPVAV, xav_alloc),
936       0,
937       SVt_PVAV, TRUE, NONV, HASARENA,
938       FIT_ARENA(0, sizeof(XPVAV)) },
939
940     { sizeof(XPVHV),
941       copy_length(XPVHV, xhv_max),
942       0,
943       SVt_PVHV, TRUE, NONV, HASARENA,
944       FIT_ARENA(0, sizeof(XPVHV)) },
945
946     { sizeof(XPVCV),
947       sizeof(XPVCV),
948       0,
949       SVt_PVCV, TRUE, NONV, HASARENA,
950       FIT_ARENA(0, sizeof(XPVCV)) },
951
952     { sizeof(XPVFM),
953       sizeof(XPVFM),
954       0,
955       SVt_PVFM, TRUE, NONV, NOARENA,
956       FIT_ARENA(20, sizeof(XPVFM)) },
957
958     { sizeof(XPVIO),
959       sizeof(XPVIO),
960       0,
961       SVt_PVIO, TRUE, NONV, HASARENA,
962       FIT_ARENA(24, sizeof(XPVIO)) },
963 };
964
965 #define new_body_allocated(sv_type)             \
966     (void *)((char *)S_new_body(aTHX_ sv_type)  \
967              - bodies_by_type[sv_type].offset)
968
969 /* return a thing to the free list */
970
971 #define del_body(thing, root)                           \
972     STMT_START {                                        \
973         void ** const thing_copy = (void **)thing;      \
974         *thing_copy = *root;                            \
975         *root = (void*)thing_copy;                      \
976     } STMT_END
977
978 #ifdef PURIFY
979
980 #define new_XNV()       safemalloc(sizeof(XPVNV))
981 #define new_XPVNV()     safemalloc(sizeof(XPVNV))
982 #define new_XPVMG()     safemalloc(sizeof(XPVMG))
983
984 #define del_XPVGV(p)    safefree(p)
985
986 #else /* !PURIFY */
987
988 #define new_XNV()       new_body_allocated(SVt_NV)
989 #define new_XPVNV()     new_body_allocated(SVt_PVNV)
990 #define new_XPVMG()     new_body_allocated(SVt_PVMG)
991
992 #define del_XPVGV(p)    del_body(p + bodies_by_type[SVt_PVGV].offset,   \
993                                  &PL_body_roots[SVt_PVGV])
994
995 #endif /* PURIFY */
996
997 /* no arena for you! */
998
999 #define new_NOARENA(details) \
1000         safemalloc((details)->body_size + (details)->offset)
1001 #define new_NOARENAZ(details) \
1002         safecalloc((details)->body_size + (details)->offset, 1)
1003
1004 void *
1005 Perl_more_bodies (pTHX_ const svtype sv_type, const size_t body_size,
1006                   const size_t arena_size)
1007 {
1008     dVAR;
1009     void ** const root = &PL_body_roots[sv_type];
1010     struct arena_desc *adesc;
1011     struct arena_set *aroot = (struct arena_set *) PL_body_arenas;
1012     unsigned int curr;
1013     char *start;
1014     const char *end;
1015     const size_t good_arena_size = Perl_malloc_good_size(arena_size);
1016 #if defined(DEBUGGING) && !defined(PERL_GLOBAL_STRUCT_PRIVATE)
1017     static bool done_sanity_check;
1018
1019     /* PERL_GLOBAL_STRUCT_PRIVATE cannot coexist with global
1020      * variables like done_sanity_check. */
1021     if (!done_sanity_check) {
1022         unsigned int i = SVt_LAST;
1023
1024         done_sanity_check = TRUE;
1025
1026         while (i--)
1027             assert (bodies_by_type[i].type == i);
1028     }
1029 #endif
1030
1031     assert(arena_size);
1032
1033     /* may need new arena-set to hold new arena */
1034     if (!aroot || aroot->curr >= aroot->set_size) {
1035         struct arena_set *newroot;
1036         Newxz(newroot, 1, struct arena_set);
1037         newroot->set_size = ARENAS_PER_SET;
1038         newroot->next = aroot;
1039         aroot = newroot;
1040         PL_body_arenas = (void *) newroot;
1041         DEBUG_m(PerlIO_printf(Perl_debug_log, "new arenaset %p\n", (void*)aroot));
1042     }
1043
1044     /* ok, now have arena-set with at least 1 empty/available arena-desc */
1045     curr = aroot->curr++;
1046     adesc = &(aroot->set[curr]);
1047     assert(!adesc->arena);
1048     
1049     Newx(adesc->arena, good_arena_size, char);
1050     adesc->size = good_arena_size;
1051     adesc->utype = sv_type;
1052     DEBUG_m(PerlIO_printf(Perl_debug_log, "arena %d added: %p size %"UVuf"\n", 
1053                           curr, (void*)adesc->arena, (UV)good_arena_size));
1054
1055     start = (char *) adesc->arena;
1056
1057     /* Get the address of the byte after the end of the last body we can fit.
1058        Remember, this is integer division:  */
1059     end = start + good_arena_size / body_size * body_size;
1060
1061     /* computed count doesn't reflect the 1st slot reservation */
1062 #if defined(MYMALLOC) || defined(HAS_MALLOC_GOOD_SIZE)
1063     DEBUG_m(PerlIO_printf(Perl_debug_log,
1064                           "arena %p end %p arena-size %d (from %d) type %d "
1065                           "size %d ct %d\n",
1066                           (void*)start, (void*)end, (int)good_arena_size,
1067                           (int)arena_size, sv_type, (int)body_size,
1068                           (int)good_arena_size / (int)body_size));
1069 #else
1070     DEBUG_m(PerlIO_printf(Perl_debug_log,
1071                           "arena %p end %p arena-size %d type %d size %d ct %d\n",
1072                           (void*)start, (void*)end,
1073                           (int)arena_size, sv_type, (int)body_size,
1074                           (int)good_arena_size / (int)body_size));
1075 #endif
1076     *root = (void *)start;
1077
1078     while (1) {
1079         /* Where the next body would start:  */
1080         char * const next = start + body_size;
1081
1082         if (next >= end) {
1083             /* This is the last body:  */
1084             assert(next == end);
1085
1086             *(void **)start = 0;
1087             return *root;
1088         }
1089
1090         *(void**) start = (void *)next;
1091         start = next;
1092     }
1093 }
1094
1095 /* grab a new thing from the free list, allocating more if necessary.
1096    The inline version is used for speed in hot routines, and the
1097    function using it serves the rest (unless PURIFY).
1098 */
1099 #define new_body_inline(xpv, sv_type) \
1100     STMT_START { \
1101         void ** const r3wt = &PL_body_roots[sv_type]; \
1102         xpv = (PTR_TBL_ENT_t*) (*((void **)(r3wt))      \
1103           ? *((void **)(r3wt)) : Perl_more_bodies(aTHX_ sv_type, \
1104                                              bodies_by_type[sv_type].body_size,\
1105                                              bodies_by_type[sv_type].arena_size)); \
1106         *(r3wt) = *(void**)(xpv); \
1107     } STMT_END
1108
1109 #ifndef PURIFY
1110
1111 STATIC void *
1112 S_new_body(pTHX_ const svtype sv_type)
1113 {
1114     dVAR;
1115     void *xpv;
1116     new_body_inline(xpv, sv_type);
1117     return xpv;
1118 }
1119
1120 #endif
1121
1122 static const struct body_details fake_rv =
1123     { 0, 0, 0, SVt_IV, FALSE, NONV, NOARENA, 0 };
1124
1125 /*
1126 =for apidoc sv_upgrade
1127
1128 Upgrade an SV to a more complex form.  Generally adds a new body type to the
1129 SV, then copies across as much information as possible from the old body.
1130 It croaks if the SV is already in a more complex form than requested.  You
1131 generally want to use the C<SvUPGRADE> macro wrapper, which checks the type
1132 before calling C<sv_upgrade>, and hence does not croak.  See also
1133 C<svtype>.
1134
1135 =cut
1136 */
1137
1138 void
1139 Perl_sv_upgrade(pTHX_ register SV *const sv, svtype new_type)
1140 {
1141     dVAR;
1142     void*       old_body;
1143     void*       new_body;
1144     const svtype old_type = SvTYPE(sv);
1145     const struct body_details *new_type_details;
1146     const struct body_details *old_type_details
1147         = bodies_by_type + old_type;
1148     SV *referant = NULL;
1149
1150     PERL_ARGS_ASSERT_SV_UPGRADE;
1151
1152     if (old_type == new_type)
1153         return;
1154
1155     /* This clause was purposefully added ahead of the early return above to
1156        the shared string hackery for (sort {$a <=> $b} keys %hash), with the
1157        inference by Nick I-S that it would fix other troublesome cases. See
1158        changes 7162, 7163 (f130fd4589cf5fbb24149cd4db4137c8326f49c1 and parent)
1159
1160        Given that shared hash key scalars are no longer PVIV, but PV, there is
1161        no longer need to unshare so as to free up the IVX slot for its proper
1162        purpose. So it's safe to move the early return earlier.  */
1163
1164     if (new_type != SVt_PV && SvIsCOW(sv)) {
1165         sv_force_normal_flags(sv, 0);
1166     }
1167
1168     old_body = SvANY(sv);
1169
1170     /* Copying structures onto other structures that have been neatly zeroed
1171        has a subtle gotcha. Consider XPVMG
1172
1173        +------+------+------+------+------+-------+-------+
1174        |     NV      | CUR  | LEN  |  IV  | MAGIC | STASH |
1175        +------+------+------+------+------+-------+-------+
1176        0      4      8     12     16     20      24      28
1177
1178        where NVs are aligned to 8 bytes, so that sizeof that structure is
1179        actually 32 bytes long, with 4 bytes of padding at the end:
1180
1181        +------+------+------+------+------+-------+-------+------+
1182        |     NV      | CUR  | LEN  |  IV  | MAGIC | STASH | ???  |
1183        +------+------+------+------+------+-------+-------+------+
1184        0      4      8     12     16     20      24      28     32
1185
1186        so what happens if you allocate memory for this structure:
1187
1188        +------+------+------+------+------+-------+-------+------+------+...
1189        |     NV      | CUR  | LEN  |  IV  | MAGIC | STASH |  GP  | NAME |
1190        +------+------+------+------+------+-------+-------+------+------+...
1191        0      4      8     12     16     20      24      28     32     36
1192
1193        zero it, then copy sizeof(XPVMG) bytes on top of it? Not quite what you
1194        expect, because you copy the area marked ??? onto GP. Now, ??? may have
1195        started out as zero once, but it's quite possible that it isn't. So now,
1196        rather than a nicely zeroed GP, you have it pointing somewhere random.
1197        Bugs ensue.
1198
1199        (In fact, GP ends up pointing at a previous GP structure, because the
1200        principle cause of the padding in XPVMG getting garbage is a copy of
1201        sizeof(XPVMG) bytes from a XPVGV structure in sv_unglob. Right now
1202        this happens to be moot because XPVGV has been re-ordered, with GP
1203        no longer after STASH)
1204
1205        So we are careful and work out the size of used parts of all the
1206        structures.  */
1207
1208     switch (old_type) {
1209     case SVt_NULL:
1210         break;
1211     case SVt_IV:
1212         if (SvROK(sv)) {
1213             referant = SvRV(sv);
1214             old_type_details = &fake_rv;
1215             if (new_type == SVt_NV)
1216                 new_type = SVt_PVNV;
1217         } else {
1218             if (new_type < SVt_PVIV) {
1219                 new_type = (new_type == SVt_NV)
1220                     ? SVt_PVNV : SVt_PVIV;
1221             }
1222         }
1223         break;
1224     case SVt_NV:
1225         if (new_type < SVt_PVNV) {
1226             new_type = SVt_PVNV;
1227         }
1228         break;
1229     case SVt_PV:
1230         assert(new_type > SVt_PV);
1231         assert(SVt_IV < SVt_PV);
1232         assert(SVt_NV < SVt_PV);
1233         break;
1234     case SVt_PVIV:
1235         break;
1236     case SVt_PVNV:
1237         break;
1238     case SVt_PVMG:
1239         /* Because the XPVMG of PL_mess_sv isn't allocated from the arena,
1240            there's no way that it can be safely upgraded, because perl.c
1241            expects to Safefree(SvANY(PL_mess_sv))  */
1242         assert(sv != PL_mess_sv);
1243         /* This flag bit is used to mean other things in other scalar types.
1244            Given that it only has meaning inside the pad, it shouldn't be set
1245            on anything that can get upgraded.  */
1246         assert(!SvPAD_TYPED(sv));
1247         break;
1248     default:
1249         if (old_type_details->cant_upgrade)
1250             Perl_croak(aTHX_ "Can't upgrade %s (%" UVuf ") to %" UVuf,
1251                        sv_reftype(sv, 0), (UV) old_type, (UV) new_type);
1252     }
1253
1254     if (old_type > new_type)
1255         Perl_croak(aTHX_ "sv_upgrade from type %d down to type %d",
1256                 (int)old_type, (int)new_type);
1257
1258     new_type_details = bodies_by_type + new_type;
1259
1260     SvFLAGS(sv) &= ~SVTYPEMASK;
1261     SvFLAGS(sv) |= new_type;
1262
1263     /* This can't happen, as SVt_NULL is <= all values of new_type, so one of
1264        the return statements above will have triggered.  */
1265     assert (new_type != SVt_NULL);
1266     switch (new_type) {
1267     case SVt_IV:
1268         assert(old_type == SVt_NULL);
1269         SvANY(sv) = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
1270         SvIV_set(sv, 0);
1271         return;
1272     case SVt_NV:
1273         assert(old_type == SVt_NULL);
1274         SvANY(sv) = new_XNV();
1275         SvNV_set(sv, 0);
1276         return;
1277     case SVt_PVHV:
1278     case SVt_PVAV:
1279         assert(new_type_details->body_size);
1280
1281 #ifndef PURIFY  
1282         assert(new_type_details->arena);
1283         assert(new_type_details->arena_size);
1284         /* This points to the start of the allocated area.  */
1285         new_body_inline(new_body, new_type);
1286         Zero(new_body, new_type_details->body_size, char);
1287         new_body = ((char *)new_body) - new_type_details->offset;
1288 #else
1289         /* We always allocated the full length item with PURIFY. To do this
1290            we fake things so that arena is false for all 16 types..  */
1291         new_body = new_NOARENAZ(new_type_details);
1292 #endif
1293         SvANY(sv) = new_body;
1294         if (new_type == SVt_PVAV) {
1295             AvMAX(sv)   = -1;
1296             AvFILLp(sv) = -1;
1297             AvREAL_only(sv);
1298             if (old_type_details->body_size) {
1299                 AvALLOC(sv) = 0;
1300             } else {
1301                 /* It will have been zeroed when the new body was allocated.
1302                    Lets not write to it, in case it confuses a write-back
1303                    cache.  */
1304             }
1305         } else {
1306             assert(!SvOK(sv));
1307             SvOK_off(sv);
1308 #ifndef NODEFAULT_SHAREKEYS
1309             HvSHAREKEYS_on(sv);         /* key-sharing on by default */
1310 #endif
1311             HvMAX(sv) = 7; /* (start with 8 buckets) */
1312         }
1313
1314         /* SVt_NULL isn't the only thing upgraded to AV or HV.
1315            The target created by newSVrv also is, and it can have magic.
1316            However, it never has SvPVX set.
1317         */
1318         if (old_type == SVt_IV) {
1319             assert(!SvROK(sv));
1320         } else if (old_type >= SVt_PV) {
1321             assert(SvPVX_const(sv) == 0);
1322         }
1323
1324         if (old_type >= SVt_PVMG) {
1325             SvMAGIC_set(sv, ((XPVMG*)old_body)->xmg_u.xmg_magic);
1326             SvSTASH_set(sv, ((XPVMG*)old_body)->xmg_stash);
1327         } else {
1328             sv->sv_u.svu_array = NULL; /* or svu_hash  */
1329         }
1330         break;
1331
1332
1333     case SVt_REGEXP:
1334         /* This ensures that SvTHINKFIRST(sv) is true, and hence that
1335            sv_force_normal_flags(sv) is called.  */
1336         SvFAKE_on(sv);
1337     case SVt_PVIV:
1338         /* XXX Is this still needed?  Was it ever needed?   Surely as there is
1339            no route from NV to PVIV, NOK can never be true  */
1340         assert(!SvNOKp(sv));
1341         assert(!SvNOK(sv));
1342     case SVt_PVIO:
1343     case SVt_PVFM:
1344     case SVt_PVGV:
1345     case SVt_PVCV:
1346     case SVt_PVLV:
1347     case SVt_PVMG:
1348     case SVt_PVNV:
1349     case SVt_PV:
1350
1351         assert(new_type_details->body_size);
1352         /* We always allocated the full length item with PURIFY. To do this
1353            we fake things so that arena is false for all 16 types..  */
1354         if(new_type_details->arena) {
1355             /* This points to the start of the allocated area.  */
1356             new_body_inline(new_body, new_type);
1357             Zero(new_body, new_type_details->body_size, char);
1358             new_body = ((char *)new_body) - new_type_details->offset;
1359         } else {
1360             new_body = new_NOARENAZ(new_type_details);
1361         }
1362         SvANY(sv) = new_body;
1363
1364         if (old_type_details->copy) {
1365             /* There is now the potential for an upgrade from something without
1366                an offset (PVNV or PVMG) to something with one (PVCV, PVFM)  */
1367             int offset = old_type_details->offset;
1368             int length = old_type_details->copy;
1369
1370             if (new_type_details->offset > old_type_details->offset) {
1371                 const int difference
1372                     = new_type_details->offset - old_type_details->offset;
1373                 offset += difference;
1374                 length -= difference;
1375             }
1376             assert (length >= 0);
1377                 
1378             Copy((char *)old_body + offset, (char *)new_body + offset, length,
1379                  char);
1380         }
1381
1382 #ifndef NV_ZERO_IS_ALLBITS_ZERO
1383         /* If NV 0.0 is stores as all bits 0 then Zero() already creates a
1384          * correct 0.0 for us.  Otherwise, if the old body didn't have an
1385          * NV slot, but the new one does, then we need to initialise the
1386          * freshly created NV slot with whatever the correct bit pattern is
1387          * for 0.0  */
1388         if (old_type_details->zero_nv && !new_type_details->zero_nv
1389             && !isGV_with_GP(sv))
1390             SvNV_set(sv, 0);
1391 #endif
1392
1393         if (new_type == SVt_PVIO) {
1394             IO * const io = MUTABLE_IO(sv);
1395             GV *iogv = gv_fetchpvs("IO::File::", GV_ADD, SVt_PVHV);
1396
1397             SvOBJECT_on(io);
1398             /* Clear the stashcache because a new IO could overrule a package
1399                name */
1400             hv_clear(PL_stashcache);
1401
1402             SvSTASH_set(io, MUTABLE_HV(SvREFCNT_inc(GvHV(iogv))));
1403             IoPAGE_LEN(sv) = 60;
1404         }
1405         if (old_type < SVt_PV) {
1406             /* referant will be NULL unless the old type was SVt_IV emulating
1407                SVt_RV */
1408             sv->sv_u.svu_rv = referant;
1409         }
1410         break;
1411     default:
1412         Perl_croak(aTHX_ "panic: sv_upgrade to unknown type %lu",
1413                    (unsigned long)new_type);
1414     }
1415
1416     if (old_type > SVt_IV) {
1417 #ifdef PURIFY
1418         safefree(old_body);
1419 #else
1420         /* Note that there is an assumption that all bodies of types that
1421            can be upgraded came from arenas. Only the more complex non-
1422            upgradable types are allowed to be directly malloc()ed.  */
1423         assert(old_type_details->arena);
1424         del_body((void*)((char*)old_body + old_type_details->offset),
1425                  &PL_body_roots[old_type]);
1426 #endif
1427     }
1428 }
1429
1430 /*
1431 =for apidoc sv_backoff
1432
1433 Remove any string offset.  You should normally use the C<SvOOK_off> macro
1434 wrapper instead.
1435
1436 =cut
1437 */
1438
1439 int
1440 Perl_sv_backoff(pTHX_ register SV *const sv)
1441 {
1442     STRLEN delta;
1443     const char * const s = SvPVX_const(sv);
1444
1445     PERL_ARGS_ASSERT_SV_BACKOFF;
1446     PERL_UNUSED_CONTEXT;
1447
1448     assert(SvOOK(sv));
1449     assert(SvTYPE(sv) != SVt_PVHV);
1450     assert(SvTYPE(sv) != SVt_PVAV);
1451
1452     SvOOK_offset(sv, delta);
1453     
1454     SvLEN_set(sv, SvLEN(sv) + delta);
1455     SvPV_set(sv, SvPVX(sv) - delta);
1456     Move(s, SvPVX(sv), SvCUR(sv)+1, char);
1457     SvFLAGS(sv) &= ~SVf_OOK;
1458     return 0;
1459 }
1460
1461 /*
1462 =for apidoc sv_grow
1463
1464 Expands the character buffer in the SV.  If necessary, uses C<sv_unref> and
1465 upgrades the SV to C<SVt_PV>.  Returns a pointer to the character buffer.
1466 Use the C<SvGROW> wrapper instead.
1467
1468 =cut
1469 */
1470
1471 char *
1472 Perl_sv_grow(pTHX_ register SV *const sv, register STRLEN newlen)
1473 {
1474     register char *s;
1475
1476     PERL_ARGS_ASSERT_SV_GROW;
1477
1478     if (PL_madskills && newlen >= 0x100000) {
1479         PerlIO_printf(Perl_debug_log,
1480                       "Allocation too large: %"UVxf"\n", (UV)newlen);
1481     }
1482 #ifdef HAS_64K_LIMIT
1483     if (newlen >= 0x10000) {
1484         PerlIO_printf(Perl_debug_log,
1485                       "Allocation too large: %"UVxf"\n", (UV)newlen);
1486         my_exit(1);
1487     }
1488 #endif /* HAS_64K_LIMIT */
1489     if (SvROK(sv))
1490         sv_unref(sv);
1491     if (SvTYPE(sv) < SVt_PV) {
1492         sv_upgrade(sv, SVt_PV);
1493         s = SvPVX_mutable(sv);
1494     }
1495     else if (SvOOK(sv)) {       /* pv is offset? */
1496         sv_backoff(sv);
1497         s = SvPVX_mutable(sv);
1498         if (newlen > SvLEN(sv))
1499             newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
1500 #ifdef HAS_64K_LIMIT
1501         if (newlen >= 0x10000)
1502             newlen = 0xFFFF;
1503 #endif
1504     }
1505     else
1506         s = SvPVX_mutable(sv);
1507
1508     if (newlen > SvLEN(sv)) {           /* need more room? */
1509         STRLEN minlen = SvCUR(sv);
1510         minlen += (minlen >> PERL_STRLEN_EXPAND_SHIFT) + 10;
1511         if (newlen < minlen)
1512             newlen = minlen;
1513 #ifndef Perl_safesysmalloc_size
1514         newlen = PERL_STRLEN_ROUNDUP(newlen);
1515 #endif
1516         if (SvLEN(sv) && s) {
1517             s = (char*)saferealloc(s, newlen);
1518         }
1519         else {
1520             s = (char*)safemalloc(newlen);
1521             if (SvPVX_const(sv) && SvCUR(sv)) {
1522                 Move(SvPVX_const(sv), s, (newlen < SvCUR(sv)) ? newlen : SvCUR(sv), char);
1523             }
1524         }
1525         SvPV_set(sv, s);
1526 #ifdef Perl_safesysmalloc_size
1527         /* Do this here, do it once, do it right, and then we will never get
1528            called back into sv_grow() unless there really is some growing
1529            needed.  */
1530         SvLEN_set(sv, Perl_safesysmalloc_size(s));
1531 #else
1532         SvLEN_set(sv, newlen);
1533 #endif
1534     }
1535     return s;
1536 }
1537
1538 /*
1539 =for apidoc sv_setiv
1540
1541 Copies an integer into the given SV, upgrading first if necessary.
1542 Does not handle 'set' magic.  See also C<sv_setiv_mg>.
1543
1544 =cut
1545 */
1546
1547 void
1548 Perl_sv_setiv(pTHX_ register SV *const sv, const IV i)
1549 {
1550     dVAR;
1551
1552     PERL_ARGS_ASSERT_SV_SETIV;
1553
1554     SV_CHECK_THINKFIRST_COW_DROP(sv);
1555     switch (SvTYPE(sv)) {
1556     case SVt_NULL:
1557     case SVt_NV:
1558         sv_upgrade(sv, SVt_IV);
1559         break;
1560     case SVt_PV:
1561         sv_upgrade(sv, SVt_PVIV);
1562         break;
1563
1564     case SVt_PVGV:
1565         if (!isGV_with_GP(sv))
1566             break;
1567     case SVt_PVAV:
1568     case SVt_PVHV:
1569     case SVt_PVCV:
1570     case SVt_PVFM:
1571     case SVt_PVIO:
1572         /* diag_listed_as: Can't coerce %s to %s in %s */
1573         Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
1574                    OP_DESC(PL_op));
1575     default: NOOP;
1576     }
1577     (void)SvIOK_only(sv);                       /* validate number */
1578     SvIV_set(sv, i);
1579     SvTAINT(sv);
1580 }
1581
1582 /*
1583 =for apidoc sv_setiv_mg
1584
1585 Like C<sv_setiv>, but also handles 'set' magic.
1586
1587 =cut
1588 */
1589
1590 void
1591 Perl_sv_setiv_mg(pTHX_ register SV *const sv, const IV i)
1592 {
1593     PERL_ARGS_ASSERT_SV_SETIV_MG;
1594
1595     sv_setiv(sv,i);
1596     SvSETMAGIC(sv);
1597 }
1598
1599 /*
1600 =for apidoc sv_setuv
1601
1602 Copies an unsigned integer into the given SV, upgrading first if necessary.
1603 Does not handle 'set' magic.  See also C<sv_setuv_mg>.
1604
1605 =cut
1606 */
1607
1608 void
1609 Perl_sv_setuv(pTHX_ register SV *const sv, const UV u)
1610 {
1611     PERL_ARGS_ASSERT_SV_SETUV;
1612
1613     /* With these two if statements:
1614        u=1.49  s=0.52  cu=72.49  cs=10.64  scripts=270  tests=20865
1615
1616        without
1617        u=1.35  s=0.47  cu=73.45  cs=11.43  scripts=270  tests=20865
1618
1619        If you wish to remove them, please benchmark to see what the effect is
1620     */
1621     if (u <= (UV)IV_MAX) {
1622        sv_setiv(sv, (IV)u);
1623        return;
1624     }
1625     sv_setiv(sv, 0);
1626     SvIsUV_on(sv);
1627     SvUV_set(sv, u);
1628 }
1629
1630 /*
1631 =for apidoc sv_setuv_mg
1632
1633 Like C<sv_setuv>, but also handles 'set' magic.
1634
1635 =cut
1636 */
1637
1638 void
1639 Perl_sv_setuv_mg(pTHX_ register SV *const sv, const UV u)
1640 {
1641     PERL_ARGS_ASSERT_SV_SETUV_MG;
1642
1643     sv_setuv(sv,u);
1644     SvSETMAGIC(sv);
1645 }
1646
1647 /*
1648 =for apidoc sv_setnv
1649
1650 Copies a double into the given SV, upgrading first if necessary.
1651 Does not handle 'set' magic.  See also C<sv_setnv_mg>.
1652
1653 =cut
1654 */
1655
1656 void
1657 Perl_sv_setnv(pTHX_ register SV *const sv, const NV num)
1658 {
1659     dVAR;
1660
1661     PERL_ARGS_ASSERT_SV_SETNV;
1662
1663     SV_CHECK_THINKFIRST_COW_DROP(sv);
1664     switch (SvTYPE(sv)) {
1665     case SVt_NULL:
1666     case SVt_IV:
1667         sv_upgrade(sv, SVt_NV);
1668         break;
1669     case SVt_PV:
1670     case SVt_PVIV:
1671         sv_upgrade(sv, SVt_PVNV);
1672         break;
1673
1674     case SVt_PVGV:
1675         if (!isGV_with_GP(sv))
1676             break;
1677     case SVt_PVAV:
1678     case SVt_PVHV:
1679     case SVt_PVCV:
1680     case SVt_PVFM:
1681     case SVt_PVIO:
1682         /* diag_listed_as: Can't coerce %s to %s in %s */
1683         Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
1684                    OP_DESC(PL_op));
1685     default: NOOP;
1686     }
1687     SvNV_set(sv, num);
1688     (void)SvNOK_only(sv);                       /* validate number */
1689     SvTAINT(sv);
1690 }
1691
1692 /*
1693 =for apidoc sv_setnv_mg
1694
1695 Like C<sv_setnv>, but also handles 'set' magic.
1696
1697 =cut
1698 */
1699
1700 void
1701 Perl_sv_setnv_mg(pTHX_ register SV *const sv, const NV num)
1702 {
1703     PERL_ARGS_ASSERT_SV_SETNV_MG;
1704
1705     sv_setnv(sv,num);
1706     SvSETMAGIC(sv);
1707 }
1708
1709 /* Print an "isn't numeric" warning, using a cleaned-up,
1710  * printable version of the offending string
1711  */
1712
1713 STATIC void
1714 S_not_a_number(pTHX_ SV *const sv)
1715 {
1716      dVAR;
1717      SV *dsv;
1718      char tmpbuf[64];
1719      const char *pv;
1720
1721      PERL_ARGS_ASSERT_NOT_A_NUMBER;
1722
1723      if (DO_UTF8(sv)) {
1724           dsv = newSVpvs_flags("", SVs_TEMP);
1725           pv = sv_uni_display(dsv, sv, 10, UNI_DISPLAY_ISPRINT);
1726      } else {
1727           char *d = tmpbuf;
1728           const char * const limit = tmpbuf + sizeof(tmpbuf) - 8;
1729           /* each *s can expand to 4 chars + "...\0",
1730              i.e. need room for 8 chars */
1731         
1732           const char *s = SvPVX_const(sv);
1733           const char * const end = s + SvCUR(sv);
1734           for ( ; s < end && d < limit; s++ ) {
1735                int ch = *s & 0xFF;
1736                if (ch & 128 && !isPRINT_LC(ch)) {
1737                     *d++ = 'M';
1738                     *d++ = '-';
1739                     ch &= 127;
1740                }
1741                if (ch == '\n') {
1742                     *d++ = '\\';
1743                     *d++ = 'n';
1744                }
1745                else if (ch == '\r') {
1746                     *d++ = '\\';
1747                     *d++ = 'r';
1748                }
1749                else if (ch == '\f') {
1750                     *d++ = '\\';
1751                     *d++ = 'f';
1752                }
1753                else if (ch == '\\') {
1754                     *d++ = '\\';
1755                     *d++ = '\\';
1756                }
1757                else if (ch == '\0') {
1758                     *d++ = '\\';
1759                     *d++ = '0';
1760                }
1761                else if (isPRINT_LC(ch))
1762                     *d++ = ch;
1763                else {
1764                     *d++ = '^';
1765                     *d++ = toCTRL(ch);
1766                }
1767           }
1768           if (s < end) {
1769                *d++ = '.';
1770                *d++ = '.';
1771                *d++ = '.';
1772           }
1773           *d = '\0';
1774           pv = tmpbuf;
1775     }
1776
1777     if (PL_op)
1778         Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
1779                     /* diag_listed_as: Argument "%s" isn't numeric%s */
1780                     "Argument \"%s\" isn't numeric in %s", pv,
1781                     OP_DESC(PL_op));
1782     else
1783         Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
1784                     /* diag_listed_as: Argument "%s" isn't numeric%s */
1785                     "Argument \"%s\" isn't numeric", pv);
1786 }
1787
1788 /*
1789 =for apidoc looks_like_number
1790
1791 Test if the content of an SV looks like a number (or is a number).
1792 C<Inf> and C<Infinity> are treated as numbers (so will not issue a
1793 non-numeric warning), even if your atof() doesn't grok them.  Get-magic is
1794 ignored.
1795
1796 =cut
1797 */
1798
1799 I32
1800 Perl_looks_like_number(pTHX_ SV *const sv)
1801 {
1802     register const char *sbegin;
1803     STRLEN len;
1804
1805     PERL_ARGS_ASSERT_LOOKS_LIKE_NUMBER;
1806
1807     if (SvPOK(sv) || SvPOKp(sv)) {
1808         sbegin = SvPV_nomg_const(sv, len);
1809     }
1810     else
1811         return SvFLAGS(sv) & (SVf_NOK|SVp_NOK|SVf_IOK|SVp_IOK);
1812     return grok_number(sbegin, len, NULL);
1813 }
1814
1815 STATIC bool
1816 S_glob_2number(pTHX_ GV * const gv)
1817 {
1818     SV *const buffer = sv_newmortal();
1819
1820     PERL_ARGS_ASSERT_GLOB_2NUMBER;
1821
1822     gv_efullname3(buffer, gv, "*");
1823
1824     /* We know that all GVs stringify to something that is not-a-number,
1825         so no need to test that.  */
1826     if (ckWARN(WARN_NUMERIC))
1827         not_a_number(buffer);
1828     /* We just want something true to return, so that S_sv_2iuv_common
1829         can tail call us and return true.  */
1830     return TRUE;
1831 }
1832
1833 /* Actually, ISO C leaves conversion of UV to IV undefined, but
1834    until proven guilty, assume that things are not that bad... */
1835
1836 /*
1837    NV_PRESERVES_UV:
1838
1839    As 64 bit platforms often have an NV that doesn't preserve all bits of
1840    an IV (an assumption perl has been based on to date) it becomes necessary
1841    to remove the assumption that the NV always carries enough precision to
1842    recreate the IV whenever needed, and that the NV is the canonical form.
1843    Instead, IV/UV and NV need to be given equal rights. So as to not lose
1844    precision as a side effect of conversion (which would lead to insanity
1845    and the dragon(s) in t/op/numconvert.t getting very angry) the intent is
1846    1) to distinguish between IV/UV/NV slots that have cached a valid
1847       conversion where precision was lost and IV/UV/NV slots that have a
1848       valid conversion which has lost no precision
1849    2) to ensure that if a numeric conversion to one form is requested that
1850       would lose precision, the precise conversion (or differently
1851       imprecise conversion) is also performed and cached, to prevent
1852       requests for different numeric formats on the same SV causing
1853       lossy conversion chains. (lossless conversion chains are perfectly
1854       acceptable (still))
1855
1856
1857    flags are used:
1858    SvIOKp is true if the IV slot contains a valid value
1859    SvIOK  is true only if the IV value is accurate (UV if SvIOK_UV true)
1860    SvNOKp is true if the NV slot contains a valid value
1861    SvNOK  is true only if the NV value is accurate
1862
1863    so
1864    while converting from PV to NV, check to see if converting that NV to an
1865    IV(or UV) would lose accuracy over a direct conversion from PV to
1866    IV(or UV). If it would, cache both conversions, return NV, but mark
1867    SV as IOK NOKp (ie not NOK).
1868
1869    While converting from PV to IV, check to see if converting that IV to an
1870    NV would lose accuracy over a direct conversion from PV to NV. If it
1871    would, cache both conversions, flag similarly.
1872
1873    Before, the SV value "3.2" could become NV=3.2 IV=3 NOK, IOK quite
1874    correctly because if IV & NV were set NV *always* overruled.
1875    Now, "3.2" will become NV=3.2 IV=3 NOK, IOKp, because the flag's meaning
1876    changes - now IV and NV together means that the two are interchangeable:
1877    SvIVX == (IV) SvNVX && SvNVX == (NV) SvIVX;
1878
1879    The benefit of this is that operations such as pp_add know that if
1880    SvIOK is true for both left and right operands, then integer addition
1881    can be used instead of floating point (for cases where the result won't
1882    overflow). Before, floating point was always used, which could lead to
1883    loss of precision compared with integer addition.
1884
1885    * making IV and NV equal status should make maths accurate on 64 bit
1886      platforms
1887    * may speed up maths somewhat if pp_add and friends start to use
1888      integers when possible instead of fp. (Hopefully the overhead in
1889      looking for SvIOK and checking for overflow will not outweigh the
1890      fp to integer speedup)
1891    * will slow down integer operations (callers of SvIV) on "inaccurate"
1892      values, as the change from SvIOK to SvIOKp will cause a call into
1893      sv_2iv each time rather than a macro access direct to the IV slot
1894    * should speed up number->string conversion on integers as IV is
1895      favoured when IV and NV are equally accurate
1896
1897    ####################################################################
1898    You had better be using SvIOK_notUV if you want an IV for arithmetic:
1899    SvIOK is true if (IV or UV), so you might be getting (IV)SvUV.
1900    On the other hand, SvUOK is true iff UV.
1901    ####################################################################
1902
1903    Your mileage will vary depending your CPU's relative fp to integer
1904    performance ratio.
1905 */
1906
1907 #ifndef NV_PRESERVES_UV
1908 #  define IS_NUMBER_UNDERFLOW_IV 1
1909 #  define IS_NUMBER_UNDERFLOW_UV 2
1910 #  define IS_NUMBER_IV_AND_UV    2
1911 #  define IS_NUMBER_OVERFLOW_IV  4
1912 #  define IS_NUMBER_OVERFLOW_UV  5
1913
1914 /* sv_2iuv_non_preserve(): private routine for use by sv_2iv() and sv_2uv() */
1915
1916 /* For sv_2nv these three cases are "SvNOK and don't bother casting"  */
1917 STATIC int
1918 S_sv_2iuv_non_preserve(pTHX_ register SV *const sv
1919 #  ifdef DEBUGGING
1920                        , I32 numtype
1921 #  endif
1922                        )
1923 {
1924     dVAR;
1925
1926     PERL_ARGS_ASSERT_SV_2IUV_NON_PRESERVE;
1927
1928     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));
1929     if (SvNVX(sv) < (NV)IV_MIN) {
1930         (void)SvIOKp_on(sv);
1931         (void)SvNOK_on(sv);
1932         SvIV_set(sv, IV_MIN);
1933         return IS_NUMBER_UNDERFLOW_IV;
1934     }
1935     if (SvNVX(sv) > (NV)UV_MAX) {
1936         (void)SvIOKp_on(sv);
1937         (void)SvNOK_on(sv);
1938         SvIsUV_on(sv);
1939         SvUV_set(sv, UV_MAX);
1940         return IS_NUMBER_OVERFLOW_UV;
1941     }
1942     (void)SvIOKp_on(sv);
1943     (void)SvNOK_on(sv);
1944     /* Can't use strtol etc to convert this string.  (See truth table in
1945        sv_2iv  */
1946     if (SvNVX(sv) <= (UV)IV_MAX) {
1947         SvIV_set(sv, I_V(SvNVX(sv)));
1948         if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
1949             SvIOK_on(sv); /* Integer is precise. NOK, IOK */
1950         } else {
1951             /* Integer is imprecise. NOK, IOKp */
1952         }
1953         return SvNVX(sv) < 0 ? IS_NUMBER_UNDERFLOW_UV : IS_NUMBER_IV_AND_UV;
1954     }
1955     SvIsUV_on(sv);
1956     SvUV_set(sv, U_V(SvNVX(sv)));
1957     if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
1958         if (SvUVX(sv) == UV_MAX) {
1959             /* As we know that NVs don't preserve UVs, UV_MAX cannot
1960                possibly be preserved by NV. Hence, it must be overflow.
1961                NOK, IOKp */
1962             return IS_NUMBER_OVERFLOW_UV;
1963         }
1964         SvIOK_on(sv); /* Integer is precise. NOK, UOK */
1965     } else {
1966         /* Integer is imprecise. NOK, IOKp */
1967     }
1968     return IS_NUMBER_OVERFLOW_IV;
1969 }
1970 #endif /* !NV_PRESERVES_UV*/
1971
1972 STATIC bool
1973 S_sv_2iuv_common(pTHX_ SV *const sv)
1974 {
1975     dVAR;
1976
1977     PERL_ARGS_ASSERT_SV_2IUV_COMMON;
1978
1979     if (SvNOKp(sv)) {
1980         /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
1981          * without also getting a cached IV/UV from it at the same time
1982          * (ie PV->NV conversion should detect loss of accuracy and cache
1983          * IV or UV at same time to avoid this. */
1984         /* IV-over-UV optimisation - choose to cache IV if possible */
1985
1986         if (SvTYPE(sv) == SVt_NV)
1987             sv_upgrade(sv, SVt_PVNV);
1988
1989         (void)SvIOKp_on(sv);    /* Must do this first, to clear any SvOOK */
1990         /* < not <= as for NV doesn't preserve UV, ((NV)IV_MAX+1) will almost
1991            certainly cast into the IV range at IV_MAX, whereas the correct
1992            answer is the UV IV_MAX +1. Hence < ensures that dodgy boundary
1993            cases go to UV */
1994 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1995         if (Perl_isnan(SvNVX(sv))) {
1996             SvUV_set(sv, 0);
1997             SvIsUV_on(sv);
1998             return FALSE;
1999         }
2000 #endif
2001         if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2002             SvIV_set(sv, I_V(SvNVX(sv)));
2003             if (SvNVX(sv) == (NV) SvIVX(sv)
2004 #ifndef NV_PRESERVES_UV
2005                 && (((UV)1 << NV_PRESERVES_UV_BITS) >
2006                     (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
2007                 /* Don't flag it as "accurately an integer" if the number
2008                    came from a (by definition imprecise) NV operation, and
2009                    we're outside the range of NV integer precision */
2010 #endif
2011                 ) {
2012                 if (SvNOK(sv))
2013                     SvIOK_on(sv);  /* Can this go wrong with rounding? NWC */
2014                 else {
2015                     /* scalar has trailing garbage, eg "42a" */
2016                 }
2017                 DEBUG_c(PerlIO_printf(Perl_debug_log,
2018                                       "0x%"UVxf" iv(%"NVgf" => %"IVdf") (precise)\n",
2019                                       PTR2UV(sv),
2020                                       SvNVX(sv),
2021                                       SvIVX(sv)));
2022
2023             } else {
2024                 /* IV not precise.  No need to convert from PV, as NV
2025                    conversion would already have cached IV if it detected
2026                    that PV->IV would be better than PV->NV->IV
2027                    flags already correct - don't set public IOK.  */
2028                 DEBUG_c(PerlIO_printf(Perl_debug_log,
2029                                       "0x%"UVxf" iv(%"NVgf" => %"IVdf") (imprecise)\n",
2030                                       PTR2UV(sv),
2031                                       SvNVX(sv),
2032                                       SvIVX(sv)));
2033             }
2034             /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
2035                but the cast (NV)IV_MIN rounds to a the value less (more
2036                negative) than IV_MIN which happens to be equal to SvNVX ??
2037                Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
2038                NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
2039                (NV)UVX == NVX are both true, but the values differ. :-(
2040                Hopefully for 2s complement IV_MIN is something like
2041                0x8000000000000000 which will be exact. NWC */
2042         }
2043         else {
2044             SvUV_set(sv, U_V(SvNVX(sv)));
2045             if (
2046                 (SvNVX(sv) == (NV) SvUVX(sv))
2047 #ifndef  NV_PRESERVES_UV
2048                 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
2049                 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
2050                 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
2051                 /* Don't flag it as "accurately an integer" if the number
2052                    came from a (by definition imprecise) NV operation, and
2053                    we're outside the range of NV integer precision */
2054 #endif
2055                 && SvNOK(sv)
2056                 )
2057                 SvIOK_on(sv);
2058             SvIsUV_on(sv);
2059             DEBUG_c(PerlIO_printf(Perl_debug_log,
2060                                   "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
2061                                   PTR2UV(sv),
2062                                   SvUVX(sv),
2063                                   SvUVX(sv)));
2064         }
2065     }
2066     else if (SvPOKp(sv) && SvLEN(sv)) {
2067         UV value;
2068         const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2069         /* We want to avoid a possible problem when we cache an IV/ a UV which
2070            may be later translated to an NV, and the resulting NV is not
2071            the same as the direct translation of the initial string
2072            (eg 123.456 can shortcut to the IV 123 with atol(), but we must
2073            be careful to ensure that the value with the .456 is around if the
2074            NV value is requested in the future).
2075         
2076            This means that if we cache such an IV/a UV, we need to cache the
2077            NV as well.  Moreover, we trade speed for space, and do not
2078            cache the NV if we are sure it's not needed.
2079          */
2080
2081         /* SVt_PVNV is one higher than SVt_PVIV, hence this order  */
2082         if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2083              == IS_NUMBER_IN_UV) {
2084             /* It's definitely an integer, only upgrade to PVIV */
2085             if (SvTYPE(sv) < SVt_PVIV)
2086                 sv_upgrade(sv, SVt_PVIV);
2087             (void)SvIOK_on(sv);
2088         } else if (SvTYPE(sv) < SVt_PVNV)
2089             sv_upgrade(sv, SVt_PVNV);
2090
2091         /* If NVs preserve UVs then we only use the UV value if we know that
2092            we aren't going to call atof() below. If NVs don't preserve UVs
2093            then the value returned may have more precision than atof() will
2094            return, even though value isn't perfectly accurate.  */
2095         if ((numtype & (IS_NUMBER_IN_UV
2096 #ifdef NV_PRESERVES_UV
2097                         | IS_NUMBER_NOT_INT
2098 #endif
2099             )) == IS_NUMBER_IN_UV) {
2100             /* This won't turn off the public IOK flag if it was set above  */
2101             (void)SvIOKp_on(sv);
2102
2103             if (!(numtype & IS_NUMBER_NEG)) {
2104                 /* positive */;
2105                 if (value <= (UV)IV_MAX) {
2106                     SvIV_set(sv, (IV)value);
2107                 } else {
2108                     /* it didn't overflow, and it was positive. */
2109                     SvUV_set(sv, value);
2110                     SvIsUV_on(sv);
2111                 }
2112             } else {
2113                 /* 2s complement assumption  */
2114                 if (value <= (UV)IV_MIN) {
2115                     SvIV_set(sv, -(IV)value);
2116                 } else {
2117                     /* Too negative for an IV.  This is a double upgrade, but
2118                        I'm assuming it will be rare.  */
2119                     if (SvTYPE(sv) < SVt_PVNV)
2120                         sv_upgrade(sv, SVt_PVNV);
2121                     SvNOK_on(sv);
2122                     SvIOK_off(sv);
2123                     SvIOKp_on(sv);
2124                     SvNV_set(sv, -(NV)value);
2125                     SvIV_set(sv, IV_MIN);
2126                 }
2127             }
2128         }
2129         /* For !NV_PRESERVES_UV and IS_NUMBER_IN_UV and IS_NUMBER_NOT_INT we
2130            will be in the previous block to set the IV slot, and the next
2131            block to set the NV slot.  So no else here.  */
2132         
2133         if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2134             != IS_NUMBER_IN_UV) {
2135             /* It wasn't an (integer that doesn't overflow the UV). */
2136             SvNV_set(sv, Atof(SvPVX_const(sv)));
2137
2138             if (! numtype && ckWARN(WARN_NUMERIC))
2139                 not_a_number(sv);
2140
2141 #if defined(USE_LONG_DOUBLE)
2142             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%" PERL_PRIgldbl ")\n",
2143                                   PTR2UV(sv), SvNVX(sv)));
2144 #else
2145             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"NVgf")\n",
2146                                   PTR2UV(sv), SvNVX(sv)));
2147 #endif
2148
2149 #ifdef NV_PRESERVES_UV
2150             (void)SvIOKp_on(sv);
2151             (void)SvNOK_on(sv);
2152             if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2153                 SvIV_set(sv, I_V(SvNVX(sv)));
2154                 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2155                     SvIOK_on(sv);
2156                 } else {
2157                     NOOP;  /* Integer is imprecise. NOK, IOKp */
2158                 }
2159                 /* UV will not work better than IV */
2160             } else {
2161                 if (SvNVX(sv) > (NV)UV_MAX) {
2162                     SvIsUV_on(sv);
2163                     /* Integer is inaccurate. NOK, IOKp, is UV */
2164                     SvUV_set(sv, UV_MAX);
2165                 } else {
2166                     SvUV_set(sv, U_V(SvNVX(sv)));
2167                     /* 0xFFFFFFFFFFFFFFFF not an issue in here, NVs
2168                        NV preservse UV so can do correct comparison.  */
2169                     if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2170                         SvIOK_on(sv);
2171                     } else {
2172                         NOOP;   /* Integer is imprecise. NOK, IOKp, is UV */
2173                     }
2174                 }
2175                 SvIsUV_on(sv);
2176             }
2177 #else /* NV_PRESERVES_UV */
2178             if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2179                 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
2180                 /* The IV/UV slot will have been set from value returned by
2181                    grok_number above.  The NV slot has just been set using
2182                    Atof.  */
2183                 SvNOK_on(sv);
2184                 assert (SvIOKp(sv));
2185             } else {
2186                 if (((UV)1 << NV_PRESERVES_UV_BITS) >
2187                     U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2188                     /* Small enough to preserve all bits. */
2189                     (void)SvIOKp_on(sv);
2190                     SvNOK_on(sv);
2191                     SvIV_set(sv, I_V(SvNVX(sv)));
2192                     if ((NV)(SvIVX(sv)) == SvNVX(sv))
2193                         SvIOK_on(sv);
2194                     /* Assumption: first non-preserved integer is < IV_MAX,
2195                        this NV is in the preserved range, therefore: */
2196                     if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
2197                           < (UV)IV_MAX)) {
2198                         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);
2199                     }
2200                 } else {
2201                     /* IN_UV NOT_INT
2202                          0      0       already failed to read UV.
2203                          0      1       already failed to read UV.
2204                          1      0       you won't get here in this case. IV/UV
2205                                         slot set, public IOK, Atof() unneeded.
2206                          1      1       already read UV.
2207                        so there's no point in sv_2iuv_non_preserve() attempting
2208                        to use atol, strtol, strtoul etc.  */
2209 #  ifdef DEBUGGING
2210                     sv_2iuv_non_preserve (sv, numtype);
2211 #  else
2212                     sv_2iuv_non_preserve (sv);
2213 #  endif
2214                 }
2215             }
2216 #endif /* NV_PRESERVES_UV */
2217         /* It might be more code efficient to go through the entire logic above
2218            and conditionally set with SvIOKp_on() rather than SvIOK(), but it
2219            gets complex and potentially buggy, so more programmer efficient
2220            to do it this way, by turning off the public flags:  */
2221         if (!numtype)
2222             SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK);
2223         }
2224     }
2225     else  {
2226         if (isGV_with_GP(sv))
2227             return glob_2number(MUTABLE_GV(sv));
2228
2229         if (!SvPADTMP(sv)) {
2230             if (!PL_localizing && ckWARN(WARN_UNINITIALIZED))
2231                 report_uninit(sv);
2232         }
2233         if (SvTYPE(sv) < SVt_IV)
2234             /* Typically the caller expects that sv_any is not NULL now.  */
2235             sv_upgrade(sv, SVt_IV);
2236         /* Return 0 from the caller.  */
2237         return TRUE;
2238     }
2239     return FALSE;
2240 }
2241
2242 /*
2243 =for apidoc sv_2iv_flags
2244
2245 Return the integer value of an SV, doing any necessary string
2246 conversion.  If flags includes SV_GMAGIC, does an mg_get() first.
2247 Normally used via the C<SvIV(sv)> and C<SvIVx(sv)> macros.
2248
2249 =cut
2250 */
2251
2252 IV
2253 Perl_sv_2iv_flags(pTHX_ register SV *const sv, const I32 flags)
2254 {
2255     dVAR;
2256     if (!sv)
2257         return 0;
2258     if (SvGMAGICAL(sv) || SvVALID(sv)) {
2259         /* FBMs use the space for SvIVX and SvNVX for other purposes, and use
2260            the same flag bit as SVf_IVisUV, so must not let them cache IVs.
2261            In practice they are extremely unlikely to actually get anywhere
2262            accessible by user Perl code - the only way that I'm aware of is when
2263            a constant subroutine which is used as the second argument to index.
2264         */
2265         if (flags & SV_GMAGIC)
2266             mg_get(sv);
2267         if (SvIOKp(sv))
2268             return SvIVX(sv);
2269         if (SvNOKp(sv)) {
2270             return I_V(SvNVX(sv));
2271         }
2272         if (SvPOKp(sv) && SvLEN(sv)) {
2273             UV value;
2274             const int numtype
2275                 = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2276
2277             if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2278                 == IS_NUMBER_IN_UV) {
2279                 /* It's definitely an integer */
2280                 if (numtype & IS_NUMBER_NEG) {
2281                     if (value < (UV)IV_MIN)
2282                         return -(IV)value;
2283                 } else {
2284                     if (value < (UV)IV_MAX)
2285                         return (IV)value;
2286                 }
2287             }
2288             if (!numtype) {
2289                 if (ckWARN(WARN_NUMERIC))
2290                     not_a_number(sv);
2291             }
2292             return I_V(Atof(SvPVX_const(sv)));
2293         }
2294         if (SvROK(sv)) {
2295             goto return_rok;
2296         }
2297         assert(SvTYPE(sv) >= SVt_PVMG);
2298         /* This falls through to the report_uninit inside S_sv_2iuv_common.  */
2299     } else if (SvTHINKFIRST(sv)) {
2300         if (SvROK(sv)) {
2301         return_rok:
2302             if (SvAMAGIC(sv)) {
2303                 SV * tmpstr;
2304                 if (flags & SV_SKIP_OVERLOAD)
2305                     return 0;
2306                 tmpstr = AMG_CALLunary(sv, numer_amg);
2307                 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2308                     return SvIV(tmpstr);
2309                 }
2310             }
2311             return PTR2IV(SvRV(sv));
2312         }
2313         if (SvIsCOW(sv)) {
2314             sv_force_normal_flags(sv, 0);
2315         }
2316         if (SvREADONLY(sv) && !SvOK(sv)) {
2317             if (ckWARN(WARN_UNINITIALIZED))
2318                 report_uninit(sv);
2319             return 0;
2320         }
2321     }
2322     if (!SvIOKp(sv)) {
2323         if (S_sv_2iuv_common(aTHX_ sv))
2324             return 0;
2325     }
2326     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
2327         PTR2UV(sv),SvIVX(sv)));
2328     return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
2329 }
2330
2331 /*
2332 =for apidoc sv_2uv_flags
2333
2334 Return the unsigned integer value of an SV, doing any necessary string
2335 conversion.  If flags includes SV_GMAGIC, does an mg_get() first.
2336 Normally used via the C<SvUV(sv)> and C<SvUVx(sv)> macros.
2337
2338 =cut
2339 */
2340
2341 UV
2342 Perl_sv_2uv_flags(pTHX_ register SV *const sv, const I32 flags)
2343 {
2344     dVAR;
2345     if (!sv)
2346         return 0;
2347     if (SvGMAGICAL(sv) || SvVALID(sv)) {
2348         /* FBMs use the space for SvIVX and SvNVX for other purposes, and use
2349            the same flag bit as SVf_IVisUV, so must not let them cache IVs.  */
2350         if (flags & SV_GMAGIC)
2351             mg_get(sv);
2352         if (SvIOKp(sv))
2353             return SvUVX(sv);
2354         if (SvNOKp(sv))
2355             return U_V(SvNVX(sv));
2356         if (SvPOKp(sv) && SvLEN(sv)) {
2357             UV value;
2358             const int numtype
2359                 = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2360
2361             if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2362                 == IS_NUMBER_IN_UV) {
2363                 /* It's definitely an integer */
2364                 if (!(numtype & IS_NUMBER_NEG))
2365                     return value;
2366             }
2367             if (!numtype) {
2368                 if (ckWARN(WARN_NUMERIC))
2369                     not_a_number(sv);
2370             }
2371             return U_V(Atof(SvPVX_const(sv)));
2372         }
2373         if (SvROK(sv)) {
2374             goto return_rok;
2375         }
2376         assert(SvTYPE(sv) >= SVt_PVMG);
2377         /* This falls through to the report_uninit inside S_sv_2iuv_common.  */
2378     } else if (SvTHINKFIRST(sv)) {
2379         if (SvROK(sv)) {
2380         return_rok:
2381             if (SvAMAGIC(sv)) {
2382                 SV *tmpstr;
2383                 if (flags & SV_SKIP_OVERLOAD)
2384                     return 0;
2385                 tmpstr = AMG_CALLunary(sv, numer_amg);
2386                 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2387                     return SvUV(tmpstr);
2388                 }
2389             }
2390             return PTR2UV(SvRV(sv));
2391         }
2392         if (SvIsCOW(sv)) {
2393             sv_force_normal_flags(sv, 0);
2394         }
2395         if (SvREADONLY(sv) && !SvOK(sv)) {
2396             if (ckWARN(WARN_UNINITIALIZED))
2397                 report_uninit(sv);
2398             return 0;
2399         }
2400     }
2401     if (!SvIOKp(sv)) {
2402         if (S_sv_2iuv_common(aTHX_ sv))
2403             return 0;
2404     }
2405
2406     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
2407                           PTR2UV(sv),SvUVX(sv)));
2408     return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
2409 }
2410
2411 /*
2412 =for apidoc sv_2nv_flags
2413
2414 Return the num value of an SV, doing any necessary string or integer
2415 conversion.  If flags includes SV_GMAGIC, does an mg_get() first.
2416 Normally used via the C<SvNV(sv)> and C<SvNVx(sv)> macros.
2417
2418 =cut
2419 */
2420
2421 NV
2422 Perl_sv_2nv_flags(pTHX_ register SV *const sv, const I32 flags)
2423 {
2424     dVAR;
2425     if (!sv)
2426         return 0.0;
2427     if (SvGMAGICAL(sv) || SvVALID(sv)) {
2428         /* FBMs use the space for SvIVX and SvNVX for other purposes, and use
2429            the same flag bit as SVf_IVisUV, so must not let them cache NVs.  */
2430         if (flags & SV_GMAGIC)
2431             mg_get(sv);
2432         if (SvNOKp(sv))
2433             return SvNVX(sv);
2434         if ((SvPOKp(sv) && SvLEN(sv)) && !SvIOKp(sv)) {
2435             if (!SvIOKp(sv) && ckWARN(WARN_NUMERIC) &&
2436                 !grok_number(SvPVX_const(sv), SvCUR(sv), NULL))
2437                 not_a_number(sv);
2438             return Atof(SvPVX_const(sv));
2439         }
2440         if (SvIOKp(sv)) {
2441             if (SvIsUV(sv))
2442                 return (NV)SvUVX(sv);
2443             else
2444                 return (NV)SvIVX(sv);
2445         }
2446         if (SvROK(sv)) {
2447             goto return_rok;
2448         }
2449         assert(SvTYPE(sv) >= SVt_PVMG);
2450         /* This falls through to the report_uninit near the end of the
2451            function. */
2452     } else if (SvTHINKFIRST(sv)) {
2453         if (SvROK(sv)) {
2454         return_rok:
2455             if (SvAMAGIC(sv)) {
2456                 SV *tmpstr;
2457                 if (flags & SV_SKIP_OVERLOAD)
2458                     return 0;
2459                 tmpstr = AMG_CALLunary(sv, numer_amg);
2460                 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2461                     return SvNV(tmpstr);
2462                 }
2463             }
2464             return PTR2NV(SvRV(sv));
2465         }
2466         if (SvIsCOW(sv)) {
2467             sv_force_normal_flags(sv, 0);
2468         }
2469         if (SvREADONLY(sv) && !SvOK(sv)) {
2470             if (ckWARN(WARN_UNINITIALIZED))
2471                 report_uninit(sv);
2472             return 0.0;
2473         }
2474     }
2475     if (SvTYPE(sv) < SVt_NV) {
2476         /* The logic to use SVt_PVNV if necessary is in sv_upgrade.  */
2477         sv_upgrade(sv, SVt_NV);
2478 #ifdef USE_LONG_DOUBLE
2479         DEBUG_c({
2480             STORE_NUMERIC_LOCAL_SET_STANDARD();
2481             PerlIO_printf(Perl_debug_log,
2482                           "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
2483                           PTR2UV(sv), SvNVX(sv));
2484             RESTORE_NUMERIC_LOCAL();
2485         });
2486 #else
2487         DEBUG_c({
2488             STORE_NUMERIC_LOCAL_SET_STANDARD();
2489             PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%"NVgf")\n",
2490                           PTR2UV(sv), SvNVX(sv));
2491             RESTORE_NUMERIC_LOCAL();
2492         });
2493 #endif
2494     }
2495     else if (SvTYPE(sv) < SVt_PVNV)
2496         sv_upgrade(sv, SVt_PVNV);
2497     if (SvNOKp(sv)) {
2498         return SvNVX(sv);
2499     }
2500     if (SvIOKp(sv)) {
2501         SvNV_set(sv, SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv));
2502 #ifdef NV_PRESERVES_UV
2503         if (SvIOK(sv))
2504             SvNOK_on(sv);
2505         else
2506             SvNOKp_on(sv);
2507 #else
2508         /* Only set the public NV OK flag if this NV preserves the IV  */
2509         /* Check it's not 0xFFFFFFFFFFFFFFFF */
2510         if (SvIOK(sv) &&
2511             SvIsUV(sv) ? ((SvUVX(sv) != UV_MAX)&&(SvUVX(sv) == U_V(SvNVX(sv))))
2512                        : (SvIVX(sv) == I_V(SvNVX(sv))))
2513             SvNOK_on(sv);
2514         else
2515             SvNOKp_on(sv);
2516 #endif
2517     }
2518     else if (SvPOKp(sv) && SvLEN(sv)) {
2519         UV value;
2520         const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2521         if (!SvIOKp(sv) && !numtype && ckWARN(WARN_NUMERIC))
2522             not_a_number(sv);
2523 #ifdef NV_PRESERVES_UV
2524         if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2525             == IS_NUMBER_IN_UV) {
2526             /* It's definitely an integer */
2527             SvNV_set(sv, (numtype & IS_NUMBER_NEG) ? -(NV)value : (NV)value);
2528         } else
2529             SvNV_set(sv, Atof(SvPVX_const(sv)));
2530         if (numtype)
2531             SvNOK_on(sv);
2532         else
2533             SvNOKp_on(sv);
2534 #else
2535         SvNV_set(sv, Atof(SvPVX_const(sv)));
2536         /* Only set the public NV OK flag if this NV preserves the value in
2537            the PV at least as well as an IV/UV would.
2538            Not sure how to do this 100% reliably. */
2539         /* if that shift count is out of range then Configure's test is
2540            wonky. We shouldn't be in here with NV_PRESERVES_UV_BITS ==
2541            UV_BITS */
2542         if (((UV)1 << NV_PRESERVES_UV_BITS) >
2543             U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2544             SvNOK_on(sv); /* Definitely small enough to preserve all bits */
2545         } else if (!(numtype & IS_NUMBER_IN_UV)) {
2546             /* Can't use strtol etc to convert this string, so don't try.
2547                sv_2iv and sv_2uv will use the NV to convert, not the PV.  */
2548             SvNOK_on(sv);
2549         } else {
2550             /* value has been set.  It may not be precise.  */
2551             if ((numtype & IS_NUMBER_NEG) && (value > (UV)IV_MIN)) {
2552                 /* 2s complement assumption for (UV)IV_MIN  */
2553                 SvNOK_on(sv); /* Integer is too negative.  */
2554             } else {
2555                 SvNOKp_on(sv);
2556                 SvIOKp_on(sv);
2557
2558                 if (numtype & IS_NUMBER_NEG) {
2559                     SvIV_set(sv, -(IV)value);
2560                 } else if (value <= (UV)IV_MAX) {
2561                     SvIV_set(sv, (IV)value);
2562                 } else {
2563                     SvUV_set(sv, value);
2564                     SvIsUV_on(sv);
2565                 }
2566
2567                 if (numtype & IS_NUMBER_NOT_INT) {
2568                     /* I believe that even if the original PV had decimals,
2569                        they are lost beyond the limit of the FP precision.
2570                        However, neither is canonical, so both only get p
2571                        flags.  NWC, 2000/11/25 */
2572                     /* Both already have p flags, so do nothing */
2573                 } else {
2574                     const NV nv = SvNVX(sv);
2575                     if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2576                         if (SvIVX(sv) == I_V(nv)) {
2577                             SvNOK_on(sv);
2578                         } else {
2579                             /* It had no "." so it must be integer.  */
2580                         }
2581                         SvIOK_on(sv);
2582                     } else {
2583                         /* between IV_MAX and NV(UV_MAX).
2584                            Could be slightly > UV_MAX */
2585
2586                         if (numtype & IS_NUMBER_NOT_INT) {
2587                             /* UV and NV both imprecise.  */
2588                         } else {
2589                             const UV nv_as_uv = U_V(nv);
2590
2591                             if (value == nv_as_uv && SvUVX(sv) != UV_MAX) {
2592                                 SvNOK_on(sv);
2593                             }
2594                             SvIOK_on(sv);
2595                         }
2596                     }
2597                 }
2598             }
2599         }
2600         /* It might be more code efficient to go through the entire logic above
2601            and conditionally set with SvNOKp_on() rather than SvNOK(), but it
2602            gets complex and potentially buggy, so more programmer efficient
2603            to do it this way, by turning off the public flags:  */
2604         if (!numtype)
2605             SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK);
2606 #endif /* NV_PRESERVES_UV */
2607     }
2608     else  {
2609         if (isGV_with_GP(sv)) {
2610             glob_2number(MUTABLE_GV(sv));
2611             return 0.0;
2612         }
2613
2614         if (!PL_localizing && !SvPADTMP(sv) && ckWARN(WARN_UNINITIALIZED))
2615             report_uninit(sv);
2616         assert (SvTYPE(sv) >= SVt_NV);
2617         /* Typically the caller expects that sv_any is not NULL now.  */
2618         /* XXX Ilya implies that this is a bug in callers that assume this
2619            and ideally should be fixed.  */
2620         return 0.0;
2621     }
2622 #if defined(USE_LONG_DOUBLE)
2623     DEBUG_c({
2624         STORE_NUMERIC_LOCAL_SET_STANDARD();
2625         PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
2626                       PTR2UV(sv), SvNVX(sv));
2627         RESTORE_NUMERIC_LOCAL();
2628     });
2629 #else
2630     DEBUG_c({
2631         STORE_NUMERIC_LOCAL_SET_STANDARD();
2632         PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%"NVgf")\n",
2633                       PTR2UV(sv), SvNVX(sv));
2634         RESTORE_NUMERIC_LOCAL();
2635     });
2636 #endif
2637     return SvNVX(sv);
2638 }
2639
2640 /*
2641 =for apidoc sv_2num
2642
2643 Return an SV with the numeric value of the source SV, doing any necessary
2644 reference or overload conversion.  You must use the C<SvNUM(sv)> macro to
2645 access this function.
2646
2647 =cut
2648 */
2649
2650 SV *
2651 Perl_sv_2num(pTHX_ register SV *const sv)
2652 {
2653     PERL_ARGS_ASSERT_SV_2NUM;
2654
2655     if (!SvROK(sv))
2656         return sv;
2657     if (SvAMAGIC(sv)) {
2658         SV * const tmpsv = AMG_CALLunary(sv, numer_amg);
2659         TAINT_IF(tmpsv && SvTAINTED(tmpsv));
2660         if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
2661             return sv_2num(tmpsv);
2662     }
2663     return sv_2mortal(newSVuv(PTR2UV(SvRV(sv))));
2664 }
2665
2666 /* uiv_2buf(): private routine for use by sv_2pv_flags(): print an IV or
2667  * UV as a string towards the end of buf, and return pointers to start and
2668  * end of it.
2669  *
2670  * We assume that buf is at least TYPE_CHARS(UV) long.
2671  */
2672
2673 static char *
2674 S_uiv_2buf(char *const buf, const IV iv, UV uv, const int is_uv, char **const peob)
2675 {
2676     char *ptr = buf + TYPE_CHARS(UV);
2677     char * const ebuf = ptr;
2678     int sign;
2679
2680     PERL_ARGS_ASSERT_UIV_2BUF;
2681
2682     if (is_uv)
2683         sign = 0;
2684     else if (iv >= 0) {
2685         uv = iv;
2686         sign = 0;
2687     } else {
2688         uv = -iv;
2689         sign = 1;
2690     }
2691     do {
2692         *--ptr = '0' + (char)(uv % 10);
2693     } while (uv /= 10);
2694     if (sign)
2695         *--ptr = '-';
2696     *peob = ebuf;
2697     return ptr;
2698 }
2699
2700 /*
2701 =for apidoc sv_2pv_flags
2702
2703 Returns a pointer to the string value of an SV, and sets *lp to its length.
2704 If flags includes SV_GMAGIC, does an mg_get() first.  Coerces sv to a
2705 string if necessary.  Normally invoked via the C<SvPV_flags> macro.
2706 C<sv_2pv()> and C<sv_2pv_nomg> usually end up here too.
2707
2708 =cut
2709 */
2710
2711 char *
2712 Perl_sv_2pv_flags(pTHX_ register SV *const sv, STRLEN *const lp, const I32 flags)
2713 {
2714     dVAR;
2715     register char *s;
2716
2717     if (!sv) {
2718         if (lp)
2719             *lp = 0;
2720         return (char *)"";
2721     }
2722     if (SvGMAGICAL(sv)) {
2723         if (flags & SV_GMAGIC)
2724             mg_get(sv);
2725         if (SvPOKp(sv)) {
2726             if (lp)
2727                 *lp = SvCUR(sv);
2728             if (flags & SV_MUTABLE_RETURN)
2729                 return SvPVX_mutable(sv);
2730             if (flags & SV_CONST_RETURN)
2731                 return (char *)SvPVX_const(sv);
2732             return SvPVX(sv);
2733         }
2734         if (SvIOKp(sv) || SvNOKp(sv)) {
2735             char tbuf[64];  /* Must fit sprintf/Gconvert of longest IV/NV */
2736             STRLEN len;
2737
2738             if (SvIOKp(sv)) {
2739                 len = SvIsUV(sv)
2740                     ? my_snprintf(tbuf, sizeof(tbuf), "%"UVuf, (UV)SvUVX(sv))
2741                     : my_snprintf(tbuf, sizeof(tbuf), "%"IVdf, (IV)SvIVX(sv));
2742             } else if(SvNVX(sv) == 0.0) {
2743                     tbuf[0] = '0';
2744                     tbuf[1] = 0;
2745                     len = 1;
2746             } else {
2747                 Gconvert(SvNVX(sv), NV_DIG, 0, tbuf);
2748                 len = strlen(tbuf);
2749             }
2750             assert(!SvROK(sv));
2751             {
2752                 dVAR;
2753
2754                 SvUPGRADE(sv, SVt_PV);
2755                 if (lp)
2756                     *lp = len;
2757                 s = SvGROW_mutable(sv, len + 1);
2758                 SvCUR_set(sv, len);
2759                 SvPOKp_on(sv);
2760                 return (char*)memcpy(s, tbuf, len + 1);
2761             }
2762         }
2763         if (SvROK(sv)) {
2764             goto return_rok;
2765         }
2766         assert(SvTYPE(sv) >= SVt_PVMG);
2767         /* This falls through to the report_uninit near the end of the
2768            function. */
2769     } else if (SvTHINKFIRST(sv)) {
2770         if (SvROK(sv)) {
2771         return_rok:
2772             if (SvAMAGIC(sv)) {
2773                 SV *tmpstr;
2774                 if (flags & SV_SKIP_OVERLOAD)
2775                     return NULL;
2776                 tmpstr = AMG_CALLunary(sv, string_amg);
2777                 TAINT_IF(tmpstr && SvTAINTED(tmpstr));
2778                 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2779                     /* Unwrap this:  */
2780                     /* char *pv = lp ? SvPV(tmpstr, *lp) : SvPV_nolen(tmpstr);
2781                      */
2782
2783                     char *pv;
2784                     if ((SvFLAGS(tmpstr) & (SVf_POK)) == SVf_POK) {
2785                         if (flags & SV_CONST_RETURN) {
2786                             pv = (char *) SvPVX_const(tmpstr);
2787                         } else {
2788                             pv = (flags & SV_MUTABLE_RETURN)
2789                                 ? SvPVX_mutable(tmpstr) : SvPVX(tmpstr);
2790                         }
2791                         if (lp)
2792                             *lp = SvCUR(tmpstr);
2793                     } else {
2794                         pv = sv_2pv_flags(tmpstr, lp, flags);
2795                     }
2796                     if (SvUTF8(tmpstr))
2797                         SvUTF8_on(sv);
2798                     else
2799                         SvUTF8_off(sv);
2800                     return pv;
2801                 }
2802             }
2803             {
2804                 STRLEN len;
2805                 char *retval;
2806                 char *buffer;
2807                 SV *const referent = SvRV(sv);
2808
2809                 if (!referent) {
2810                     len = 7;
2811                     retval = buffer = savepvn("NULLREF", len);
2812                 } else if (SvTYPE(referent) == SVt_REGEXP) {
2813                     REGEXP * const re = (REGEXP *)MUTABLE_PTR(referent);
2814                     I32 seen_evals = 0;
2815
2816                     assert(re);
2817                         
2818                     /* If the regex is UTF-8 we want the containing scalar to
2819                        have an UTF-8 flag too */
2820                     if (RX_UTF8(re))
2821                         SvUTF8_on(sv);
2822                     else
2823                         SvUTF8_off(sv); 
2824
2825                     if ((seen_evals = RX_SEEN_EVALS(re)))
2826                         PL_reginterp_cnt += seen_evals;
2827
2828                     if (lp)
2829                         *lp = RX_WRAPLEN(re);
2830  
2831                     return RX_WRAPPED(re);
2832                 } else {
2833                     const char *const typestr = sv_reftype(referent, 0);
2834                     const STRLEN typelen = strlen(typestr);
2835                     UV addr = PTR2UV(referent);
2836                     const char *stashname = NULL;
2837                     STRLEN stashnamelen = 0; /* hush, gcc */
2838                     const char *buffer_end;
2839
2840                     if (SvOBJECT(referent)) {
2841                         const HEK *const name = HvNAME_HEK(SvSTASH(referent));
2842
2843                         if (name) {
2844                             stashname = HEK_KEY(name);
2845                             stashnamelen = HEK_LEN(name);
2846
2847                             if (HEK_UTF8(name)) {
2848                                 SvUTF8_on(sv);
2849                             } else {
2850                                 SvUTF8_off(sv);
2851                             }
2852                         } else {
2853                             stashname = "__ANON__";
2854                             stashnamelen = 8;
2855                         }
2856                         len = stashnamelen + 1 /* = */ + typelen + 3 /* (0x */
2857                             + 2 * sizeof(UV) + 2 /* )\0 */;
2858                     } else {
2859                         len = typelen + 3 /* (0x */
2860                             + 2 * sizeof(UV) + 2 /* )\0 */;
2861                     }
2862
2863                     Newx(buffer, len, char);
2864                     buffer_end = retval = buffer + len;
2865
2866                     /* Working backwards  */
2867                     *--retval = '\0';
2868                     *--retval = ')';
2869                     do {
2870                         *--retval = PL_hexdigit[addr & 15];
2871                     } while (addr >>= 4);
2872                     *--retval = 'x';
2873                     *--retval = '0';
2874                     *--retval = '(';
2875
2876                     retval -= typelen;
2877                     memcpy(retval, typestr, typelen);
2878
2879                     if (stashname) {
2880                         *--retval = '=';
2881                         retval -= stashnamelen;
2882                         memcpy(retval, stashname, stashnamelen);
2883                     }
2884                     /* retval may not necessarily have reached the start of the
2885                        buffer here.  */
2886                     assert (retval >= buffer);
2887
2888                     len = buffer_end - retval - 1; /* -1 for that \0  */
2889                 }
2890                 if (lp)
2891                     *lp = len;
2892                 SAVEFREEPV(buffer);
2893                 return retval;
2894             }
2895         }
2896         if (SvREADONLY(sv) && !SvOK(sv)) {
2897             if (lp)
2898                 *lp = 0;
2899             if (flags & SV_UNDEF_RETURNS_NULL)
2900                 return NULL;
2901             if (ckWARN(WARN_UNINITIALIZED))
2902                 report_uninit(sv);
2903             return (char *)"";
2904         }
2905     }
2906     if (SvIOK(sv) || ((SvIOKp(sv) && !SvNOKp(sv)))) {
2907         /* I'm assuming that if both IV and NV are equally valid then
2908            converting the IV is going to be more efficient */
2909         const U32 isUIOK = SvIsUV(sv);
2910         char buf[TYPE_CHARS(UV)];
2911         char *ebuf, *ptr;
2912         STRLEN len;
2913
2914         if (SvTYPE(sv) < SVt_PVIV)
2915             sv_upgrade(sv, SVt_PVIV);
2916         ptr = uiv_2buf(buf, SvIVX(sv), SvUVX(sv), isUIOK, &ebuf);
2917         len = ebuf - ptr;
2918         /* inlined from sv_setpvn */
2919         s = SvGROW_mutable(sv, len + 1);
2920         Move(ptr, s, len, char);
2921         s += len;
2922         *s = '\0';
2923     }
2924     else if (SvNOKp(sv)) {
2925         if (SvTYPE(sv) < SVt_PVNV)
2926             sv_upgrade(sv, SVt_PVNV);
2927         if (SvNVX(sv) == 0.0) {
2928             s = SvGROW_mutable(sv, 2);
2929             *s++ = '0';
2930             *s = '\0';
2931         } else {
2932             dSAVE_ERRNO;
2933             /* The +20 is pure guesswork.  Configure test needed. --jhi */
2934             s = SvGROW_mutable(sv, NV_DIG + 20);
2935             /* some Xenix systems wipe out errno here */
2936             Gconvert(SvNVX(sv), NV_DIG, 0, s);
2937             RESTORE_ERRNO;
2938             while (*s) s++;
2939         }
2940 #ifdef hcx
2941         if (s[-1] == '.')
2942             *--s = '\0';
2943 #endif
2944     }
2945     else {
2946         if (isGV_with_GP(sv)) {
2947             GV *const gv = MUTABLE_GV(sv);
2948             SV *const buffer = sv_newmortal();
2949
2950             gv_efullname3(buffer, gv, "*");
2951
2952             assert(SvPOK(buffer));
2953             if (lp) {
2954                     *lp = SvCUR(buffer);
2955             }
2956             if ( SvUTF8(buffer) ) SvUTF8_on(sv);
2957             return SvPVX(buffer);
2958         }
2959
2960         if (lp)
2961             *lp = 0;
2962         if (flags & SV_UNDEF_RETURNS_NULL)
2963             return NULL;
2964         if (!PL_localizing && !SvPADTMP(sv) && ckWARN(WARN_UNINITIALIZED))
2965             report_uninit(sv);
2966         if (SvTYPE(sv) < SVt_PV)
2967             /* Typically the caller expects that sv_any is not NULL now.  */
2968             sv_upgrade(sv, SVt_PV);
2969         return (char *)"";
2970     }
2971     {
2972         const STRLEN len = s - SvPVX_const(sv);
2973         if (lp) 
2974             *lp = len;
2975         SvCUR_set(sv, len);
2976     }
2977     SvPOK_on(sv);
2978     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
2979                           PTR2UV(sv),SvPVX_const(sv)));
2980     if (flags & SV_CONST_RETURN)
2981         return (char *)SvPVX_const(sv);
2982     if (flags & SV_MUTABLE_RETURN)
2983         return SvPVX_mutable(sv);
2984     return SvPVX(sv);
2985 }
2986
2987 /*
2988 =for apidoc sv_copypv
2989
2990 Copies a stringified representation of the source SV into the
2991 destination SV.  Automatically performs any necessary mg_get and
2992 coercion of numeric values into strings.  Guaranteed to preserve
2993 UTF8 flag even from overloaded objects.  Similar in nature to
2994 sv_2pv[_flags] but operates directly on an SV instead of just the
2995 string.  Mostly uses sv_2pv_flags to do its work, except when that
2996 would lose the UTF-8'ness of the PV.
2997
2998 =cut
2999 */
3000
3001 void
3002 Perl_sv_copypv(pTHX_ SV *const dsv, register SV *const ssv)
3003 {
3004     STRLEN len;
3005     const char * const s = SvPV_const(ssv,len);
3006
3007     PERL_ARGS_ASSERT_SV_COPYPV;
3008
3009     sv_setpvn(dsv,s,len);
3010     if (SvUTF8(ssv))
3011         SvUTF8_on(dsv);
3012     else
3013         SvUTF8_off(dsv);
3014 }
3015
3016 /*
3017 =for apidoc sv_2pvbyte
3018
3019 Return a pointer to the byte-encoded representation of the SV, and set *lp
3020 to its length.  May cause the SV to be downgraded from UTF-8 as a
3021 side-effect.
3022
3023 Usually accessed via the C<SvPVbyte> macro.
3024
3025 =cut
3026 */
3027
3028 char *
3029 Perl_sv_2pvbyte(pTHX_ register SV *const sv, STRLEN *const lp)
3030 {
3031     PERL_ARGS_ASSERT_SV_2PVBYTE;
3032
3033     SvGETMAGIC(sv);
3034     sv_utf8_downgrade(sv,0);
3035     return lp ? SvPV_nomg(sv,*lp) : SvPV_nomg_nolen(sv);
3036 }
3037
3038 /*
3039 =for apidoc sv_2pvutf8
3040
3041 Return a pointer to the UTF-8-encoded representation of the SV, and set *lp
3042 to its length.  May cause the SV to be upgraded to UTF-8 as a side-effect.
3043
3044 Usually accessed via the C<SvPVutf8> macro.
3045
3046 =cut
3047 */
3048
3049 char *
3050 Perl_sv_2pvutf8(pTHX_ register SV *const sv, STRLEN *const lp)
3051 {
3052     PERL_ARGS_ASSERT_SV_2PVUTF8;
3053
3054     sv_utf8_upgrade(sv);
3055     return lp ? SvPV(sv,*lp) : SvPV_nolen(sv);
3056 }
3057
3058
3059 /*
3060 =for apidoc sv_2bool
3061
3062 This macro is only used by sv_true() or its macro equivalent, and only if
3063 the latter's argument is neither SvPOK, SvIOK nor SvNOK.
3064 It calls sv_2bool_flags with the SV_GMAGIC flag.
3065
3066 =for apidoc sv_2bool_flags
3067
3068 This function is only used by sv_true() and friends,  and only if
3069 the latter's argument is neither SvPOK, SvIOK nor SvNOK.  If the flags
3070 contain SV_GMAGIC, then it does an mg_get() first.
3071
3072
3073 =cut
3074 */
3075
3076 bool
3077 Perl_sv_2bool_flags(pTHX_ register SV *const sv, const I32 flags)
3078 {
3079     dVAR;
3080
3081     PERL_ARGS_ASSERT_SV_2BOOL_FLAGS;
3082
3083     if(flags & SV_GMAGIC) SvGETMAGIC(sv);
3084
3085     if (!SvOK(sv))
3086         return 0;
3087     if (SvROK(sv)) {
3088         if (SvAMAGIC(sv)) {
3089             SV * const tmpsv = AMG_CALLunary(sv, bool__amg);
3090             if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
3091                 return cBOOL(SvTRUE(tmpsv));
3092         }
3093         return SvRV(sv) != 0;
3094     }
3095     if (SvPOKp(sv)) {
3096         register XPV* const Xpvtmp = (XPV*)SvANY(sv);
3097         if (Xpvtmp &&
3098                 (*sv->sv_u.svu_pv > '0' ||
3099                 Xpvtmp->xpv_cur > 1 ||
3100                 (Xpvtmp->xpv_cur && *sv->sv_u.svu_pv != '0')))
3101             return 1;
3102         else
3103             return 0;
3104     }
3105     else {
3106         if (SvIOKp(sv))
3107             return SvIVX(sv) != 0;
3108         else {
3109             if (SvNOKp(sv))
3110                 return SvNVX(sv) != 0.0;
3111             else {
3112                 if (isGV_with_GP(sv))
3113                     return TRUE;
3114                 else
3115                     return FALSE;
3116             }
3117         }
3118     }
3119 }
3120
3121 /*
3122 =for apidoc sv_utf8_upgrade
3123
3124 Converts the PV of an SV to its UTF-8-encoded form.
3125 Forces the SV to string form if it is not already.
3126 Will C<mg_get> on C<sv> if appropriate.
3127 Always sets the SvUTF8 flag to avoid future validity checks even
3128 if the whole string is the same in UTF-8 as not.
3129 Returns the number of bytes in the converted string
3130
3131 This is not as a general purpose byte encoding to Unicode interface:
3132 use the Encode extension for that.
3133
3134 =for apidoc sv_utf8_upgrade_nomg
3135
3136 Like sv_utf8_upgrade, but doesn't do magic on C<sv>.
3137
3138 =for apidoc sv_utf8_upgrade_flags
3139
3140 Converts the PV of an SV to its UTF-8-encoded form.
3141 Forces the SV to string form if it is not already.
3142 Always sets the SvUTF8 flag to avoid future validity checks even
3143 if all the bytes are invariant in UTF-8.
3144 If C<flags> has C<SV_GMAGIC> bit set,
3145 will C<mg_get> on C<sv> if appropriate, else not.
3146 Returns the number of bytes in the converted string
3147 C<sv_utf8_upgrade> and
3148 C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
3149
3150 This is not as a general purpose byte encoding to Unicode interface:
3151 use the Encode extension for that.
3152
3153 =cut
3154
3155 The grow version is currently not externally documented.  It adds a parameter,
3156 extra, which is the number of unused bytes the string of 'sv' is guaranteed to
3157 have free after it upon return.  This allows the caller to reserve extra space
3158 that it intends to fill, to avoid extra grows.
3159
3160 Also externally undocumented for the moment is the flag SV_FORCE_UTF8_UPGRADE,
3161 which can be used to tell this function to not first check to see if there are
3162 any characters that are different in UTF-8 (variant characters) which would
3163 force it to allocate a new string to sv, but to assume there are.  Typically
3164 this flag is used by a routine that has already parsed the string to find that
3165 there are such characters, and passes this information on so that the work
3166 doesn't have to be repeated.
3167
3168 (One might think that the calling routine could pass in the position of the
3169 first such variant, so it wouldn't have to be found again.  But that is not the
3170 case, because typically when the caller is likely to use this flag, it won't be
3171 calling this routine unless it finds something that won't fit into a byte.
3172 Otherwise it tries to not upgrade and just use bytes.  But some things that
3173 do fit into a byte are variants in utf8, and the caller may not have been
3174 keeping track of these.)
3175
3176 If the routine itself changes the string, it adds a trailing NUL.  Such a NUL
3177 isn't guaranteed due to having other routines do the work in some input cases,
3178 or if the input is already flagged as being in utf8.
3179
3180 The speed of this could perhaps be improved for many cases if someone wanted to
3181 write a fast function that counts the number of variant characters in a string,
3182 especially if it could return the position of the first one.
3183
3184 */
3185
3186 STRLEN
3187 Perl_sv_utf8_upgrade_flags_grow(pTHX_ register SV *const sv, const I32 flags, STRLEN extra)
3188 {
3189     dVAR;
3190
3191     PERL_ARGS_ASSERT_SV_UTF8_UPGRADE_FLAGS_GROW;
3192
3193     if (sv == &PL_sv_undef)
3194         return 0;
3195     if (!SvPOK(sv)) {
3196         STRLEN len = 0;
3197         if (SvREADONLY(sv) && (SvPOKp(sv) || SvIOKp(sv) || SvNOKp(sv))) {
3198             (void) sv_2pv_flags(sv,&len, flags);
3199             if (SvUTF8(sv)) {
3200                 if (extra) SvGROW(sv, SvCUR(sv) + extra);
3201                 return len;
3202             }
3203         } else {
3204             (void) SvPV_force_flags(sv,len,flags & SV_GMAGIC);
3205         }
3206     }
3207
3208     if (SvUTF8(sv)) {
3209         if (extra) SvGROW(sv, SvCUR(sv) + extra);
3210         return SvCUR(sv);
3211     }
3212
3213     if (SvIsCOW(sv)) {
3214         sv_force_normal_flags(sv, 0);
3215     }
3216
3217     if (PL_encoding && !(flags & SV_UTF8_NO_ENCODING)) {
3218         sv_recode_to_utf8(sv, PL_encoding);
3219         if (extra) SvGROW(sv, SvCUR(sv) + extra);
3220         return SvCUR(sv);
3221     }
3222
3223     if (SvCUR(sv) == 0) {
3224         if (extra) SvGROW(sv, extra);
3225     } else { /* Assume Latin-1/EBCDIC */
3226         /* This function could be much more efficient if we
3227          * had a FLAG in SVs to signal if there are any variant
3228          * chars in the PV.  Given that there isn't such a flag
3229          * make the loop as fast as possible (although there are certainly ways
3230          * to speed this up, eg. through vectorization) */
3231         U8 * s = (U8 *) SvPVX_const(sv);
3232         U8 * e = (U8 *) SvEND(sv);
3233         U8 *t = s;
3234         STRLEN two_byte_count = 0;
3235         
3236         if (flags & SV_FORCE_UTF8_UPGRADE) goto must_be_utf8;
3237
3238         /* See if really will need to convert to utf8.  We mustn't rely on our
3239          * incoming SV being well formed and having a trailing '\0', as certain
3240          * code in pp_formline can send us partially built SVs. */
3241
3242         while (t < e) {
3243             const U8 ch = *t++;
3244             if (NATIVE_IS_INVARIANT(ch)) continue;
3245
3246             t--;    /* t already incremented; re-point to first variant */
3247             two_byte_count = 1;
3248             goto must_be_utf8;
3249         }
3250
3251         /* utf8 conversion not needed because all are invariants.  Mark as
3252          * UTF-8 even if no variant - saves scanning loop */
3253         SvUTF8_on(sv);
3254         if (extra) SvGROW(sv, SvCUR(sv) + extra);
3255         return SvCUR(sv);
3256
3257 must_be_utf8:
3258
3259         /* Here, the string should be converted to utf8, either because of an
3260          * input flag (two_byte_count = 0), or because a character that
3261          * requires 2 bytes was found (two_byte_count = 1).  t points either to
3262          * the beginning of the string (if we didn't examine anything), or to
3263          * the first variant.  In either case, everything from s to t - 1 will
3264          * occupy only 1 byte each on output.
3265          *
3266          * There are two main ways to convert.  One is to create a new string
3267          * and go through the input starting from the beginning, appending each
3268          * converted value onto the new string as we go along.  It's probably
3269          * best to allocate enough space in the string for the worst possible
3270          * case rather than possibly running out of space and having to
3271          * reallocate and then copy what we've done so far.  Since everything
3272          * from s to t - 1 is invariant, the destination can be initialized
3273          * with these using a fast memory copy
3274          *
3275          * The other way is to figure out exactly how big the string should be
3276          * by parsing the entire input.  Then you don't have to make it big
3277          * enough to handle the worst possible case, and more importantly, if
3278          * the string you already have is large enough, you don't have to
3279          * allocate a new string, you can copy the last character in the input
3280          * string to the final position(s) that will be occupied by the
3281          * converted string and go backwards, stopping at t, since everything
3282          * before that is invariant.
3283          *
3284          * There are advantages and disadvantages to each method.
3285          *
3286          * In the first method, we can allocate a new string, do the memory
3287          * copy from the s to t - 1, and then proceed through the rest of the
3288          * string byte-by-byte.
3289          *
3290          * In the second method, we proceed through the rest of the input
3291          * string just calculating how big the converted string will be.  Then
3292          * there are two cases:
3293          *  1)  if the string has enough extra space to handle the converted
3294          *      value.  We go backwards through the string, converting until we
3295          *      get to the position we are at now, and then stop.  If this
3296          *      position is far enough along in the string, this method is
3297          *      faster than the other method.  If the memory copy were the same
3298          *      speed as the byte-by-byte loop, that position would be about
3299          *      half-way, as at the half-way mark, parsing to the end and back
3300          *      is one complete string's parse, the same amount as starting
3301          *      over and going all the way through.  Actually, it would be
3302          *      somewhat less than half-way, as it's faster to just count bytes
3303          *      than to also copy, and we don't have the overhead of allocating
3304          *      a new string, changing the scalar to use it, and freeing the
3305          *      existing one.  But if the memory copy is fast, the break-even
3306          *      point is somewhere after half way.  The counting loop could be
3307          *      sped up by vectorization, etc, to move the break-even point
3308          *      further towards the beginning.
3309          *  2)  if the string doesn't have enough space to handle the converted
3310          *      value.  A new string will have to be allocated, and one might
3311          *      as well, given that, start from the beginning doing the first
3312          *      method.  We've spent extra time parsing the string and in
3313          *      exchange all we've gotten is that we know precisely how big to
3314          *      make the new one.  Perl is more optimized for time than space,
3315          *      so this case is a loser.
3316          * So what I've decided to do is not use the 2nd method unless it is
3317          * guaranteed that a new string won't have to be allocated, assuming
3318          * the worst case.  I also decided not to put any more conditions on it
3319          * than this, for now.  It seems likely that, since the worst case is
3320          * twice as big as the unknown portion of the string (plus 1), we won't
3321          * be guaranteed enough space, causing us to go to the first method,
3322          * unless the string is short, or the first variant character is near
3323          * the end of it.  In either of these cases, it seems best to use the
3324          * 2nd method.  The only circumstance I can think of where this would
3325          * be really slower is if the string had once had much more data in it
3326          * than it does now, but there is still a substantial amount in it  */
3327
3328         {
3329             STRLEN invariant_head = t - s;
3330             STRLEN size = invariant_head + (e - t) * 2 + 1 + extra;
3331             if (SvLEN(sv) < size) {
3332
3333                 /* Here, have decided to allocate a new string */
3334
3335                 U8 *dst;
3336                 U8 *d;
3337
3338                 Newx(dst, size, U8);
3339
3340                 /* If no known invariants at the beginning of the input string,
3341                  * set so starts from there.  Otherwise, can use memory copy to
3342                  * get up to where we are now, and then start from here */
3343
3344                 if (invariant_head <= 0) {
3345                     d = dst;
3346                 } else {
3347                     Copy(s, dst, invariant_head, char);
3348                     d = dst + invariant_head;
3349                 }
3350
3351                 while (t < e) {
3352                     const UV uv = NATIVE8_TO_UNI(*t++);
3353                     if (UNI_IS_INVARIANT(uv))
3354                         *d++ = (U8)UNI_TO_NATIVE(uv);
3355                     else {
3356                         *d++ = (U8)UTF8_EIGHT_BIT_HI(uv);
3357                         *d++ = (U8)UTF8_EIGHT_BIT_LO(uv);
3358                     }
3359                 }
3360                 *d = '\0';
3361                 SvPV_free(sv); /* No longer using pre-existing string */
3362                 SvPV_set(sv, (char*)dst);
3363                 SvCUR_set(sv, d - dst);
3364                 SvLEN_set(sv, size);
3365             } else {
3366
3367                 /* Here, have decided to get the exact size of the string.
3368                  * Currently this happens only when we know that there is
3369                  * guaranteed enough space to fit the converted string, so
3370                  * don't have to worry about growing.  If two_byte_count is 0,
3371                  * then t points to the first byte of the string which hasn't
3372                  * been examined yet.  Otherwise two_byte_count is 1, and t
3373                  * points to the first byte in the string that will expand to
3374                  * two.  Depending on this, start examining at t or 1 after t.
3375                  * */
3376
3377                 U8 *d = t + two_byte_count;
3378
3379
3380                 /* Count up the remaining bytes that expand to two */
3381
3382                 while (d < e) {
3383                     const U8 chr = *d++;
3384                     if (! NATIVE_IS_INVARIANT(chr)) two_byte_count++;
3385                 }
3386
3387                 /* The string will expand by just the number of bytes that
3388                  * occupy two positions.  But we are one afterwards because of
3389                  * the increment just above.  This is the place to put the
3390                  * trailing NUL, and to set the length before we decrement */
3391
3392                 d += two_byte_count;
3393                 SvCUR_set(sv, d - s);
3394                 *d-- = '\0';
3395
3396
3397                 /* Having decremented d, it points to the position to put the
3398                  * very last byte of the expanded string.  Go backwards through
3399                  * the string, copying and expanding as we go, stopping when we
3400                  * get to the part that is invariant the rest of the way down */
3401
3402                 e--;
3403                 while (e >= t) {
3404                     const U8 ch = NATIVE8_TO_UNI(*e--);
3405                     if (UNI_IS_INVARIANT(ch)) {
3406                         *d-- = UNI_TO_NATIVE(ch);
3407                     } else {
3408                         *d-- = (U8)UTF8_EIGHT_BIT_LO(ch);
3409                         *d-- = (U8)UTF8_EIGHT_BIT_HI(ch);
3410                     }
3411                 }
3412             }
3413
3414             if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
3415                 /* Update pos. We do it at the end rather than during
3416                  * the upgrade, to avoid slowing down the common case
3417                  * (upgrade without pos) */
3418                 MAGIC * mg = mg_find(sv, PERL_MAGIC_regex_global);
3419                 if (mg) {
3420                     I32 pos = mg->mg_len;
3421                     if (pos > 0 && (U32)pos > invariant_head) {
3422                         U8 *d = (U8*) SvPVX(sv) + invariant_head;
3423                         STRLEN n = (U32)pos - invariant_head;
3424                         while (n > 0) {
3425                             if (UTF8_IS_START(*d))
3426                                 d++;
3427                             d++;
3428                             n--;
3429                         }
3430                         mg->mg_len  = d - (U8*)SvPVX(sv);
3431                     }
3432                 }
3433                 if ((mg = mg_find(sv, PERL_MAGIC_utf8)))
3434                     magic_setutf8(sv,mg); /* clear UTF8 cache */
3435             }
3436         }
3437     }
3438
3439     /* Mark as UTF-8 even if no variant - saves scanning loop */
3440     SvUTF8_on(sv);
3441     return SvCUR(sv);
3442 }
3443
3444 /*
3445 =for apidoc sv_utf8_downgrade
3446
3447 Attempts to convert the PV of an SV from characters to bytes.
3448 If the PV contains a character that cannot fit
3449 in a byte, this conversion will fail;
3450 in this case, either returns false or, if C<fail_ok> is not
3451 true, croaks.
3452
3453 This is not as a general purpose Unicode to byte encoding interface:
3454 use the Encode extension for that.
3455
3456 =cut
3457 */
3458
3459 bool
3460 Perl_sv_utf8_downgrade(pTHX_ register SV *const sv, const bool fail_ok)
3461 {
3462     dVAR;
3463
3464     PERL_ARGS_ASSERT_SV_UTF8_DOWNGRADE;
3465
3466     if (SvPOKp(sv) && SvUTF8(sv)) {
3467         if (SvCUR(sv)) {
3468             U8 *s;
3469             STRLEN len;
3470             int mg_flags = SV_GMAGIC;
3471
3472             if (SvIsCOW(sv)) {
3473                 sv_force_normal_flags(sv, 0);
3474             }
3475             if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
3476                 /* update pos */
3477                 MAGIC * mg = mg_find(sv, PERL_MAGIC_regex_global);
3478                 if (mg) {
3479                     I32 pos = mg->mg_len;
3480                     if (pos > 0) {
3481                         sv_pos_b2u(sv, &pos);
3482                         mg_flags = 0; /* sv_pos_b2u does get magic */
3483                         mg->mg_len  = pos;
3484                     }
3485                 }
3486                 if ((mg = mg_find(sv, PERL_MAGIC_utf8)))
3487                     magic_setutf8(sv,mg); /* clear UTF8 cache */
3488
3489             }
3490             s = (U8 *) SvPV_flags(sv, len, mg_flags);
3491
3492             if (!utf8_to_bytes(s, &len)) {
3493                 if (fail_ok)
3494                     return FALSE;
3495                 else {
3496                     if (PL_op)
3497                         Perl_croak(aTHX_ "Wide character in %s",
3498                                    OP_DESC(PL_op));
3499                     else
3500                         Perl_croak(aTHX_ "Wide character");
3501                 }
3502             }
3503             SvCUR_set(sv, len);
3504         }
3505     }
3506     SvUTF8_off(sv);
3507     return TRUE;
3508 }
3509
3510 /*
3511 =for apidoc sv_utf8_encode
3512
3513 Converts the PV of an SV to UTF-8, but then turns the C<SvUTF8>
3514 flag off so that it looks like octets again.
3515
3516 =cut
3517 */
3518
3519 void
3520 Perl_sv_utf8_encode(pTHX_ register SV *const sv)
3521 {
3522     PERL_ARGS_ASSERT_SV_UTF8_ENCODE;
3523
3524     if (SvIsCOW(sv)) {
3525         sv_force_normal_flags(sv, 0);
3526     }
3527     if (SvREADONLY(sv)) {
3528         Perl_croak_no_modify(aTHX);
3529     }
3530     (void) sv_utf8_upgrade(sv);
3531     SvUTF8_off(sv);
3532 }
3533
3534 /*
3535 =for apidoc sv_utf8_decode
3536
3537 If the PV of the SV is an octet sequence in UTF-8
3538 and contains a multiple-byte character, the C<SvUTF8> flag is turned on
3539 so that it looks like a character.  If the PV contains only single-byte
3540 characters, the C<SvUTF8> flag stays off.
3541 Scans PV for validity and returns false if the PV is invalid UTF-8.
3542
3543 =cut
3544 */
3545
3546 bool
3547 Perl_sv_utf8_decode(pTHX_ register SV *const sv)
3548 {
3549     PERL_ARGS_ASSERT_SV_UTF8_DECODE;
3550
3551     if (SvPOKp(sv)) {
3552         const U8 *start, *c;
3553         const U8 *e;
3554
3555         /* The octets may have got themselves encoded - get them back as
3556          * bytes
3557          */
3558         if (!sv_utf8_downgrade(sv, TRUE))
3559             return FALSE;
3560
3561         /* it is actually just a matter of turning the utf8 flag on, but
3562          * we want to make sure everything inside is valid utf8 first.
3563          */
3564         c = start = (const U8 *) SvPVX_const(sv);
3565         if (!is_utf8_string(c, SvCUR(sv)+1))
3566             return FALSE;
3567         e = (const U8 *) SvEND(sv);
3568         while (c < e) {
3569             const U8 ch = *c++;
3570             if (!UTF8_IS_INVARIANT(ch)) {
3571                 SvUTF8_on(sv);
3572                 break;
3573             }
3574         }
3575         if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
3576             /* adjust pos to the start of a UTF8 char sequence */
3577             MAGIC * mg = mg_find(sv, PERL_MAGIC_regex_global);
3578             if (mg) {
3579                 I32 pos = mg->mg_len;
3580                 if (pos > 0) {
3581                     for (c = start + pos; c > start; c--) {
3582                         if (UTF8_IS_START(*c))
3583                             break;
3584                     }
3585                     mg->mg_len  = c - start;
3586                 }
3587             }
3588             if ((mg = mg_find(sv, PERL_MAGIC_utf8)))
3589                 magic_setutf8(sv,mg); /* clear UTF8 cache */
3590         }
3591     }
3592     return TRUE;
3593 }
3594
3595 /*
3596 =for apidoc sv_setsv
3597
3598 Copies the contents of the source SV C<ssv> into the destination SV
3599 C<dsv>.  The source SV may be destroyed if it is mortal, so don't use this
3600 function if the source SV needs to be reused.  Does not handle 'set' magic.
3601 Loosely speaking, it performs a copy-by-value, obliterating any previous
3602 content of the destination.
3603
3604 You probably want to use one of the assortment of wrappers, such as
3605 C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3606 C<SvSetMagicSV_nosteal>.
3607
3608 =for apidoc sv_setsv_flags
3609
3610 Copies the contents of the source SV C<ssv> into the destination SV
3611 C<dsv>.  The source SV may be destroyed if it is mortal, so don't use this
3612 function if the source SV needs to be reused.  Does not handle 'set' magic.
3613 Loosely speaking, it performs a copy-by-value, obliterating any previous
3614 content of the destination.
3615 If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
3616 C<ssv> if appropriate, else not.  If the C<flags>
3617 parameter has the C<NOSTEAL> bit set then the
3618 buffers of temps will not be stolen.  <sv_setsv>
3619 and C<sv_setsv_nomg> are implemented in terms of this function.
3620
3621 You probably want to use one of the assortment of wrappers, such as
3622 C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3623 C<SvSetMagicSV_nosteal>.
3624
3625 This is the primary function for copying scalars, and most other
3626 copy-ish functions and macros use this underneath.
3627
3628 =cut
3629 */
3630
3631 static void
3632 S_glob_assign_glob(pTHX_ SV *const dstr, SV *const sstr, const int dtype)
3633 {
3634     I32 mro_changes = 0; /* 1 = method, 2 = isa, 3 = recursive isa */
3635     HV *old_stash = NULL;
3636
3637     PERL_ARGS_ASSERT_GLOB_ASSIGN_GLOB;
3638
3639     if (dtype != SVt_PVGV && !isGV_with_GP(dstr)) {
3640         const char * const name = GvNAME(sstr);
3641         const STRLEN len = GvNAMELEN(sstr);
3642         {
3643             if (dtype >= SVt_PV) {
3644                 SvPV_free(dstr);
3645                 SvPV_set(dstr, 0);
3646                 SvLEN_set(dstr, 0);
3647                 SvCUR_set(dstr, 0);
3648             }
3649             SvUPGRADE(dstr, SVt_PVGV);
3650             (void)SvOK_off(dstr);
3651             /* We have to turn this on here, even though we turn it off
3652                below, as GvSTASH will fail an assertion otherwise. */
3653             isGV_with_GP_on(dstr);
3654         }
3655         GvSTASH(dstr) = GvSTASH(sstr);
3656         if (GvSTASH(dstr))
3657             Perl_sv_add_backref(aTHX_ MUTABLE_SV(GvSTASH(dstr)), dstr);
3658         gv_name_set(MUTABLE_GV(dstr), name, len,
3659                         GV_ADD | (GvNAMEUTF8(sstr) ? SVf_UTF8 : 0 ));
3660         SvFAKE_on(dstr);        /* can coerce to non-glob */
3661     }
3662
3663     if(GvGP(MUTABLE_GV(sstr))) {
3664         /* If source has method cache entry, clear it */
3665         if(GvCVGEN(sstr)) {
3666             SvREFCNT_dec(GvCV(sstr));
3667             GvCV_set(sstr, NULL);
3668             GvCVGEN(sstr) = 0;
3669         }
3670         /* If source has a real method, then a method is
3671            going to change */
3672         else if(
3673          GvCV((const GV *)sstr) && GvSTASH(dstr) && HvENAME(GvSTASH(dstr))
3674         ) {
3675             mro_changes = 1;
3676         }
3677     }
3678
3679     /* If dest already had a real method, that's a change as well */
3680     if(
3681         !mro_changes && GvGP(MUTABLE_GV(dstr)) && GvCVu((const GV *)dstr)
3682      && GvSTASH(dstr) && HvENAME(GvSTASH(dstr))
3683     ) {
3684         mro_changes = 1;
3685     }
3686
3687     /* We don't need to check the name of the destination if it was not a
3688        glob to begin with. */
3689     if(dtype == SVt_PVGV) {
3690         const char * const name = GvNAME((const GV *)dstr);
3691         if(
3692             strEQ(name,"ISA")
3693          /* The stash may have been detached from the symbol table, so
3694             check its name. */
3695          && GvSTASH(dstr) && HvENAME(GvSTASH(dstr))
3696          && GvAV((const GV *)sstr)
3697         )
3698             mro_changes = 2;
3699         else {
3700             const STRLEN len = GvNAMELEN(dstr);
3701             if ((len > 1 && name[len-2] == ':' && name[len-1] == ':')
3702              || (len == 1 && name[0] == ':')) {
3703                 mro_changes = 3;
3704
3705                 /* Set aside the old stash, so we can reset isa caches on
3706                    its subclasses. */
3707                 if((old_stash = GvHV(dstr)))
3708                     /* Make sure we do not lose it early. */
3709                     SvREFCNT_inc_simple_void_NN(
3710                      sv_2mortal((SV *)old_stash)
3711                     );
3712             }
3713         }
3714     }
3715
3716     gp_free(MUTABLE_GV(dstr));
3717     isGV_with_GP_off(dstr); /* SvOK_off does not like globs. */
3718     (void)SvOK_off(dstr);
3719     isGV_with_GP_on(dstr);
3720     GvINTRO_off(dstr);          /* one-shot flag */
3721     GvGP_set(dstr, gp_ref(GvGP(sstr)));
3722     if (SvTAINTED(sstr))
3723         SvTAINT(dstr);
3724     if (GvIMPORTED(dstr) != GVf_IMPORTED
3725         && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3726         {
3727             GvIMPORTED_on(dstr);
3728         }
3729     GvMULTI_on(dstr);
3730     if(mro_changes == 2) {
3731         MAGIC *mg;
3732         SV * const sref = (SV *)GvAV((const GV *)dstr);
3733         if (SvSMAGICAL(sref) && (mg = mg_find(sref, PERL_MAGIC_isa))) {
3734             if (SvTYPE(mg->mg_obj) != SVt_PVAV) {
3735                 AV * const ary = newAV();
3736                 av_push(ary, mg->mg_obj); /* takes the refcount */
3737                 mg->mg_obj = (SV *)ary;
3738             }
3739             av_push((AV *)mg->mg_obj, SvREFCNT_inc_simple_NN(dstr));
3740         }
3741         else sv_magic(sref, dstr, PERL_MAGIC_isa, NULL, 0);
3742         mro_isa_changed_in(GvSTASH(dstr));
3743     }
3744     else if(mro_changes == 3) {
3745         HV * const stash = GvHV(dstr);
3746         if(old_stash ? (HV *)HvENAME_get(old_stash) : stash)
3747             mro_package_moved(
3748                 stash, old_stash,
3749                 (GV *)dstr, 0
3750             );
3751     }
3752     else if(mro_changes) mro_method_changed_in(GvSTASH(dstr));
3753     return;
3754 }
3755
3756 static void
3757 S_glob_assign_ref(pTHX_ SV *const dstr, SV *const sstr)
3758 {
3759     SV * const sref = SvREFCNT_inc(SvRV(sstr));
3760     SV *dref = NULL;
3761     const int intro = GvINTRO(dstr);
3762     SV **location;
3763     U8 import_flag = 0;
3764     const U32 stype = SvTYPE(sref);
3765
3766     PERL_ARGS_ASSERT_GLOB_ASSIGN_REF;
3767
3768     if (intro) {
3769         GvINTRO_off(dstr);      /* one-shot flag */
3770         GvLINE(dstr) = CopLINE(PL_curcop);
3771         GvEGV(dstr) = MUTABLE_GV(dstr);
3772     }
3773     GvMULTI_on(dstr);
3774     switch (stype) {
3775     case SVt_PVCV:
3776         location = (SV **) &(GvGP(dstr)->gp_cv); /* XXX bypassing GvCV_set */
3777         import_flag = GVf_IMPORTED_CV;
3778         goto common;
3779     case SVt_PVHV:
3780         location = (SV **) &GvHV(dstr);
3781         import_flag = GVf_IMPORTED_HV;
3782         goto common;
3783     case SVt_PVAV:
3784         location = (SV **) &GvAV(dstr);
3785         import_flag = GVf_IMPORTED_AV;
3786         goto common;
3787     case SVt_PVIO:
3788         location = (SV **) &GvIOp(dstr);
3789         goto common;
3790     case SVt_PVFM:
3791         location = (SV **) &GvFORM(dstr);
3792         goto common;
3793     default:
3794         location = &GvSV(dstr);
3795         import_flag = GVf_IMPORTED_SV;
3796     common:
3797         if (intro) {
3798             if (stype == SVt_PVCV) {
3799                 /*if (GvCVGEN(dstr) && (GvCV(dstr) != (const CV *)sref || GvCVGEN(dstr))) {*/
3800                 if (GvCVGEN(dstr)) {
3801                     SvREFCNT_dec(GvCV(dstr));
3802                     GvCV_set(dstr, NULL);
3803                     GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3804                 }
3805             }
3806             SAVEGENERICSV(*location);
3807         }
3808         else
3809             dref = *location;
3810         if (stype == SVt_PVCV && (*location != sref || GvCVGEN(dstr))) {
3811             CV* const cv = MUTABLE_CV(*location);
3812             if (cv) {
3813                 if (!GvCVGEN((const GV *)dstr) &&
3814                     (CvROOT(cv) || CvXSUB(cv)) &&
3815                     /* redundant check that avoids creating the extra SV
3816                        most of the time: */
3817                     (CvCONST(cv) || ckWARN(WARN_REDEFINE)))
3818                     {
3819                         SV * const new_const_sv =
3820                             CvCONST((const CV *)sref)
3821                                  ? cv_const_sv((const CV *)sref)
3822                                  : NULL;
3823                         report_redefined_cv(
3824                            sv_2mortal(Perl_newSVpvf(aTHX_
3825                                 "%"HEKf"::%"HEKf,
3826                                 HEKfARG(
3827                                  HvNAME_HEK(GvSTASH((const GV *)dstr))
3828                                 ),
3829                                 HEKfARG(GvENAME_HEK(MUTABLE_GV(dstr)))
3830                            )),
3831                            cv,
3832                            CvCONST((const CV *)sref) ? &new_const_sv : NULL
3833                         );
3834                     }
3835                 if (!intro)
3836                     cv_ckproto_len_flags(cv, (const GV *)dstr,
3837                                    SvPOK(sref) ? CvPROTO(sref) : NULL,
3838                                    SvPOK(sref) ? CvPROTOLEN(sref) : 0,
3839                                    SvPOK(sref) ? SvUTF8(sref) : 0);
3840             }
3841             GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3842             GvASSUMECV_on(dstr);
3843             if(GvSTASH(dstr)) mro_method_changed_in(GvSTASH(dstr)); /* sub foo { 1 } sub bar { 2 } *bar = \&foo */
3844         }
3845         *location = sref;
3846         if (import_flag && !(GvFLAGS(dstr) & import_flag)
3847             && CopSTASH_ne(PL_curcop, GvSTASH(dstr))) {
3848             GvFLAGS(dstr) |= import_flag;
3849         }
3850         if (stype == SVt_PVHV) {
3851             const char * const name = GvNAME((GV*)dstr);
3852             const STRLEN len = GvNAMELEN(dstr);
3853             if (
3854                 (
3855                    (len > 1 && name[len-2] == ':' && name[len-1] == ':')
3856                 || (len == 1 && name[0] == ':')
3857                 )
3858              && (!dref || HvENAME_get(dref))
3859             ) {
3860                 mro_package_moved(
3861                     (HV *)sref, (HV *)dref,
3862                     (GV *)dstr, 0
3863                 );
3864             }
3865         }
3866         else if (
3867             stype == SVt_PVAV && sref != dref
3868          && strEQ(GvNAME((GV*)dstr), "ISA")
3869          /* The stash may have been detached from the symbol table, so
3870             check its name before doing anything. */
3871          && GvSTASH(dstr) && HvENAME(GvSTASH(dstr))
3872         ) {
3873             MAGIC *mg;
3874             MAGIC * const omg = dref && SvSMAGICAL(dref)
3875                                  ? mg_find(dref, PERL_MAGIC_isa)
3876                                  : NULL;
3877             if (SvSMAGICAL(sref) && (mg = mg_find(sref, PERL_MAGIC_isa))) {
3878                 if (SvTYPE(mg->mg_obj) != SVt_PVAV) {
3879                     AV * const ary = newAV();
3880                     av_push(ary, mg->mg_obj); /* takes the refcount */
3881                     mg->mg_obj = (SV *)ary;
3882                 }
3883                 if (omg) {
3884                     if (SvTYPE(omg->mg_obj) == SVt_PVAV) {
3885                         SV **svp = AvARRAY((AV *)omg->mg_obj);
3886                         I32 items = AvFILLp((AV *)omg->mg_obj) + 1;
3887                         while (items--)
3888                             av_push(
3889                              (AV *)mg->mg_obj,
3890                              SvREFCNT_inc_simple_NN(*svp++)
3891                             );
3892                     }
3893                     else
3894                         av_push(
3895                          (AV *)mg->mg_obj,
3896                          SvREFCNT_inc_simple_NN(omg->mg_obj)
3897                         );
3898                 }
3899                 else
3900                     av_push((AV *)mg->mg_obj,SvREFCNT_inc_simple_NN(dstr));
3901             }
3902             else
3903             {
3904                 sv_magic(
3905                  sref, omg ? omg->mg_obj : dstr, PERL_MAGIC_isa, NULL, 0
3906                 );
3907                 mg = mg_find(sref, PERL_MAGIC_isa);
3908             }
3909             /* Since the *ISA assignment could have affected more than
3910                one stash, don't call mro_isa_changed_in directly, but let
3911                magic_clearisa do it for us, as it already has the logic for
3912                dealing with globs vs arrays of globs. */
3913             assert(mg);
3914             Perl_magic_clearisa(aTHX_ NULL, mg);
3915         }
3916         break;
3917     }
3918     SvREFCNT_dec(dref);
3919     if (SvTAINTED(sstr))
3920         SvTAINT(dstr);
3921     return;
3922 }
3923
3924 void
3925 Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV* sstr, const I32 flags)
3926 {
3927     dVAR;
3928     register U32 sflags;
3929     register int dtype;
3930     register svtype stype;
3931
3932     PERL_ARGS_ASSERT_SV_SETSV_FLAGS;
3933
3934     if (sstr == dstr)
3935         return;
3936
3937     if (SvIS_FREED(dstr)) {
3938         Perl_croak(aTHX_ "panic: attempt to copy value %" SVf
3939                    " to a freed scalar %p", SVfARG(sstr), (void *)dstr);
3940     }
3941     SV_CHECK_THINKFIRST_COW_DROP(dstr);
3942     if (!sstr)
3943         sstr = &PL_sv_undef;
3944     if (SvIS_FREED(sstr)) {
3945         Perl_croak(aTHX_ "panic: attempt to copy freed scalar %p to %p",
3946                    (void*)sstr, (void*)dstr);
3947     }
3948     stype = SvTYPE(sstr);
3949     dtype = SvTYPE(dstr);
3950
3951     (void)SvAMAGIC_off(dstr);
3952     if ( SvVOK(dstr) )
3953     {
3954         /* need to nuke the magic */
3955         sv_unmagic(dstr, PERL_MAGIC_vstring);
3956     }
3957
3958     /* There's a lot of redundancy below but we're going for speed here */
3959
3960     switch (stype) {
3961     case SVt_NULL:
3962       undef_sstr:
3963         if (dtype != SVt_PVGV && dtype != SVt_PVLV) {
3964             (void)SvOK_off(dstr);
3965             return;
3966         }
3967         break;
3968     case SVt_IV:
3969         if (SvIOK(sstr)) {
3970             switch (dtype) {
3971             case SVt_NULL:
3972                 sv_upgrade(dstr, SVt_IV);
3973                 break;
3974             case SVt_NV:
3975             case SVt_PV:
3976                 sv_upgrade(dstr, SVt_PVIV);
3977                 break;
3978             case SVt_PVGV:
3979             case SVt_PVLV:
3980                 goto end_of_first_switch;
3981             }
3982             (void)SvIOK_only(dstr);
3983             SvIV_set(dstr,  SvIVX(sstr));
3984             if (SvIsUV(sstr))
3985                 SvIsUV_on(dstr);
3986             /* SvTAINTED can only be true if the SV has taint magic, which in
3987                turn means that the SV type is PVMG (or greater). This is the
3988                case statement for SVt_IV, so this cannot be true (whatever gcov
3989                may say).  */
3990             assert(!SvTAINTED(sstr));
3991             return;
3992         }
3993         if (!SvROK(sstr))
3994             goto undef_sstr;
3995         if (dtype < SVt_PV && dtype != SVt_IV)
3996             sv_upgrade(dstr, SVt_IV);
3997         break;
3998
3999     case SVt_NV:
4000         if (SvNOK(sstr)) {
4001             switch (dtype) {
4002             case SVt_NULL:
4003             case SVt_IV:
4004                 sv_upgrade(dstr, SVt_NV);
4005                 break;
4006             case SVt_PV:
4007             case SVt_PVIV:
4008                 sv_upgrade(dstr, SVt_PVNV);
4009                 break;
4010             case SVt_PVGV:
4011             case SVt_PVLV:
4012                 goto end_of_first_switch;
4013             }
4014             SvNV_set(dstr, SvNVX(sstr));
4015             (void)SvNOK_only(dstr);
4016             /* SvTAINTED can only be true if the SV has taint magic, which in
4017                turn means that the SV type is PVMG (or greater). This is the
4018                case statement for SVt_NV, so this cannot be true (whatever gcov
4019                may say).  */
4020             assert(!SvTAINTED(sstr));
4021             return;
4022         }
4023         goto undef_sstr;
4024
4025     case SVt_PVFM:
4026 #ifdef PERL_OLD_COPY_ON_WRITE
4027         if ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS) {
4028             if (dtype < SVt_PVIV)
4029                 sv_upgrade(dstr, SVt_PVIV);
4030             break;
4031         }
4032         /* Fall through */
4033 #endif
4034     case SVt_PV:
4035         if (dtype < SVt_PV)
4036             sv_upgrade(dstr, SVt_PV);
4037         break;
4038     case SVt_PVIV:
4039         if (dtype < SVt_PVIV)
4040             sv_upgrade(dstr, SVt_PVIV);
4041         break;
4042     case SVt_PVNV:
4043         if (dtype < SVt_PVNV)
4044             sv_upgrade(dstr, SVt_PVNV);
4045         break;
4046     default:
4047         {
4048         const char * const type = sv_reftype(sstr,0);
4049         if (PL_op)
4050             /* diag_listed_as: Bizarre copy of %s */
4051             Perl_croak(aTHX_ "Bizarre copy of %s in %s", type, OP_DESC(PL_op));
4052         else
4053             Perl_croak(aTHX_ "Bizarre copy of %s", type);
4054         }
4055         break;
4056
4057     case SVt_REGEXP:
4058         if (dtype < SVt_REGEXP)
4059             sv_upgrade(dstr, SVt_REGEXP);
4060         break;
4061
4062         /* case SVt_BIND: */
4063     case SVt_PVLV:
4064     case SVt_PVGV:
4065     case SVt_PVMG:
4066         if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
4067             mg_get(sstr);
4068             if (SvTYPE(sstr) != stype)
4069                 stype = SvTYPE(sstr);
4070         }
4071         if (isGV_with_GP(sstr) && dtype <= SVt_PVLV) {
4072                     glob_assign_glob(dstr, sstr, dtype);
4073                     return;
4074         }
4075         if (stype == SVt_PVLV)
4076             SvUPGRADE(dstr, SVt_PVNV);
4077         else
4078             SvUPGRADE(dstr, (svtype)stype);
4079     }
4080  end_of_first_switch:
4081
4082     /* dstr may have been upgraded.  */
4083     dtype = SvTYPE(dstr);
4084     sflags = SvFLAGS(sstr);
4085
4086     if (dtype == SVt_PVCV || dtype == SVt_PVFM) {
4087         /* Assigning to a subroutine sets the prototype.  */
4088         if (SvOK(sstr)) {
4089             STRLEN len;
4090             const char *const ptr = SvPV_const(sstr, len);
4091
4092             SvGROW(dstr, len + 1);
4093             Copy(ptr, SvPVX(dstr), len + 1, char);
4094             SvCUR_set(dstr, len);
4095             SvPOK_only(dstr);
4096             SvFLAGS(dstr) |= sflags & SVf_UTF8;
4097             CvAUTOLOAD_off(dstr);
4098         } else {
4099             SvOK_off(dstr);
4100         }
4101     } else if (dtype == SVt_PVAV || dtype == SVt_PVHV) {
4102         const char * const type = sv_reftype(dstr,0);
4103         if (PL_op)
4104             /* diag_listed_as: Cannot copy to %s */
4105             Perl_croak(aTHX_ "Cannot copy to %s in %s", type, OP_DESC(PL_op));
4106         else
4107             Perl_croak(aTHX_ "Cannot copy to %s", type);
4108     } else if (sflags & SVf_ROK) {
4109         if (isGV_with_GP(dstr)
4110             && SvTYPE(SvRV(sstr)) == SVt_PVGV && isGV_with_GP(SvRV(sstr))) {
4111             sstr = SvRV(sstr);
4112             if (sstr == dstr) {
4113                 if (GvIMPORTED(dstr) != GVf_IMPORTED
4114                     && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4115                 {
4116                     GvIMPORTED_on(dstr);
4117                 }
4118                 GvMULTI_on(dstr);
4119                 return;
4120             }
4121             glob_assign_glob(dstr, sstr, dtype);
4122             return;
4123         }
4124
4125         if (dtype >= SVt_PV) {
4126             if (isGV_with_GP(dstr)) {
4127                 glob_assign_ref(dstr, sstr);
4128                 return;
4129             }
4130             if (SvPVX_const(dstr)) {
4131                 SvPV_free(dstr);
4132                 SvLEN_set(dstr, 0);
4133                 SvCUR_set(dstr, 0);
4134             }
4135         }
4136         (void)SvOK_off(dstr);
4137         SvRV_set(dstr, SvREFCNT_inc(SvRV(sstr)));
4138         SvFLAGS(dstr) |= sflags & SVf_ROK;
4139         assert(!(sflags & SVp_NOK));
4140         assert(!(sflags & SVp_IOK));
4141         assert(!(sflags & SVf_NOK));
4142         assert(!(sflags & SVf_IOK));
4143     }
4144     else if (isGV_with_GP(dstr)) {
4145         if (!(sflags & SVf_OK)) {
4146             Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
4147                            "Undefined value assigned to typeglob");
4148         }
4149         else {
4150             GV *gv = gv_fetchsv_nomg(sstr, GV_ADD, SVt_PVGV);
4151             if (dstr != (const SV *)gv) {
4152                 const char * const name = GvNAME((const GV *)dstr);
4153                 const STRLEN len = GvNAMELEN(dstr);
4154                 HV *old_stash = NULL;
4155                 bool reset_isa = FALSE;
4156                 if ((len > 1 && name[len-2] == ':' && name[len-1] == ':')
4157                  || (len == 1 && name[0] == ':')) {
4158                     /* Set aside the old stash, so we can reset isa caches
4159                        on its subclasses. */
4160                     if((old_stash = GvHV(dstr))) {
4161                         /* Make sure we do not lose it early. */
4162                         SvREFCNT_inc_simple_void_NN(
4163                          sv_2mortal((SV *)old_stash)
4164                         );
4165                     }
4166                     reset_isa = TRUE;
4167                 }
4168
4169                 if (GvGP(dstr))
4170                     gp_free(MUTABLE_GV(dstr));
4171                 GvGP_set(dstr, gp_ref(GvGP(gv)));
4172
4173                 if (reset_isa) {
4174                     HV * const stash = GvHV(dstr);
4175                     if(
4176                         old_stash ? (HV *)HvENAME_get(old_stash) : stash
4177                     )
4178                         mro_package_moved(
4179                          stash, old_stash,
4180                          (GV *)dstr, 0
4181                         );
4182                 }
4183             }
4184         }
4185     }
4186     else if (dtype == SVt_REGEXP && stype == SVt_REGEXP) {
4187         reg_temp_copy((REGEXP*)dstr, (REGEXP*)sstr);
4188     }
4189     else if (sflags & SVp_POK) {
4190         bool isSwipe = 0;
4191
4192         /*
4193          * Check to see if we can just swipe the string.  If so, it's a
4194          * possible small lose on short strings, but a big win on long ones.
4195          * It might even be a win on short strings if SvPVX_const(dstr)
4196          * has to be allocated and SvPVX_const(sstr) has to be freed.
4197          * Likewise if we can set up COW rather than doing an actual copy, we
4198          * drop to the else clause, as the swipe code and the COW setup code
4199          * have much in common.
4200          */
4201
4202         /* Whichever path we take through the next code, we want this true,
4203            and doing it now facilitates the COW check.  */
4204         (void)SvPOK_only(dstr);
4205
4206         if (
4207             /* If we're already COW then this clause is not true, and if COW
4208                is allowed then we drop down to the else and make dest COW 
4209                with us.  If caller hasn't said that we're allowed to COW
4210                shared hash keys then we don't do the COW setup, even if the
4211                source scalar is a shared hash key scalar.  */
4212             (((flags & SV_COW_SHARED_HASH_KEYS)
4213                ? (sflags & (SVf_FAKE|SVf_READONLY)) != (SVf_FAKE|SVf_READONLY)
4214                : 1 /* If making a COW copy is forbidden then the behaviour we
4215                        desire is as if the source SV isn't actually already
4216                        COW, even if it is.  So we act as if the source flags
4217                        are not COW, rather than actually testing them.  */
4218               )
4219 #ifndef PERL_OLD_COPY_ON_WRITE
4220              /* The change that added SV_COW_SHARED_HASH_KEYS makes the logic
4221                 when PERL_OLD_COPY_ON_WRITE is defined a little wrong.
4222                 Conceptually PERL_OLD_COPY_ON_WRITE being defined should
4223                 override SV_COW_SHARED_HASH_KEYS, because it means "always COW"
4224                 but in turn, it's somewhat dead code, never expected to go
4225                 live, but more kept as a placeholder on how to do it better
4226                 in a newer implementation.  */
4227              /* If we are COW and dstr is a suitable target then we drop down
4228                 into the else and make dest a COW of us.  */
4229              || (SvFLAGS(dstr) & CAN_COW_MASK) != CAN_COW_FLAGS
4230 #endif
4231              )
4232             &&
4233             !(isSwipe =
4234                  (sflags & SVs_TEMP) &&   /* slated for free anyway? */
4235                  !(sflags & SVf_OOK) &&   /* and not involved in OOK hack? */
4236                  (!(flags & SV_NOSTEAL)) &&
4237                                         /* and we're allowed to steal temps */
4238                  SvREFCNT(sstr) == 1 &&   /* and no other references to it? */
4239                  SvLEN(sstr))             /* and really is a string */
4240 #ifdef PERL_OLD_COPY_ON_WRITE
4241             && ((flags & SV_COW_SHARED_HASH_KEYS)
4242                 ? (!((sflags & CAN_COW_MASK) == CAN_COW_FLAGS
4243                      && (SvFLAGS(dstr) & CAN_COW_MASK) == CAN_COW_FLAGS
4244                      && SvTYPE(sstr) >= SVt_PVIV && SvTYPE(sstr) != SVt_PVFM))
4245                 : 1)
4246 #endif
4247             ) {
4248             /* Failed the swipe test, and it's not a shared hash key either.
4249                Have to copy the string.  */
4250             STRLEN len = SvCUR(sstr);
4251             SvGROW(dstr, len + 1);      /* inlined from sv_setpvn */
4252             Move(SvPVX_const(sstr),SvPVX(dstr),len,char);
4253             SvCUR_set(dstr, len);
4254             *SvEND(dstr) = '\0';
4255         } else {
4256             /* If PERL_OLD_COPY_ON_WRITE is not defined, then isSwipe will always
4257                be true in here.  */
4258             /* Either it's a shared hash key, or it's suitable for
4259                copy-on-write or we can swipe the string.  */
4260             if (DEBUG_C_TEST) {
4261                 PerlIO_printf(Perl_debug_log, "Copy on write: sstr --> dstr\n");
4262                 sv_dump(sstr);
4263                 sv_dump(dstr);
4264             }
4265 #ifdef PERL_OLD_COPY_ON_WRITE
4266             if (!isSwipe) {
4267                 if ((sflags & (SVf_FAKE | SVf_READONLY))
4268                     != (SVf_FAKE | SVf_READONLY)) {
4269                     SvREADONLY_on(sstr);
4270                     SvFAKE_on(sstr);
4271                     /* Make the source SV into a loop of 1.
4272                        (about to become 2) */
4273                     SV_COW_NEXT_SV_SET(sstr, sstr);
4274                 }
4275             }
4276 #endif
4277             /* Initial code is common.  */
4278             if (SvPVX_const(dstr)) {    /* we know that dtype >= SVt_PV */
4279                 SvPV_free(dstr);
4280             }
4281
4282             if (!isSwipe) {
4283                 /* making another shared SV.  */
4284                 STRLEN cur = SvCUR(sstr);
4285                 STRLEN len = SvLEN(sstr);
4286 #ifdef PERL_OLD_COPY_ON_WRITE
4287                 if (len) {
4288                     assert (SvTYPE(dstr) >= SVt_PVIV);
4289                     /* SvIsCOW_normal */
4290                     /* splice us in between source and next-after-source.  */
4291                     SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4292                     SV_COW_NEXT_SV_SET(sstr, dstr);
4293                     SvPV_set(dstr, SvPVX_mutable(sstr));
4294                 } else
4295 #endif
4296                 {
4297                     /* SvIsCOW_shared_hash */
4298                     DEBUG_C(PerlIO_printf(Perl_debug_log,
4299                                           "Copy on write: Sharing hash\n"));
4300
4301                     assert (SvTYPE(dstr) >= SVt_PV);
4302                     SvPV_set(dstr,
4303                              HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)))));
4304                 }
4305                 SvLEN_set(dstr, len);
4306                 SvCUR_set(dstr, cur);
4307                 SvREADONLY_on(dstr);
4308                 SvFAKE_on(dstr);
4309             }
4310             else
4311                 {       /* Passes the swipe test.  */
4312                 SvPV_set(dstr, SvPVX_mutable(sstr));
4313                 SvLEN_set(dstr, SvLEN(sstr));
4314                 SvCUR_set(dstr, SvCUR(sstr));
4315
4316                 SvTEMP_off(dstr);
4317                 (void)SvOK_off(sstr);   /* NOTE: nukes most SvFLAGS on sstr */
4318                 SvPV_set(sstr, NULL);
4319                 SvLEN_set(sstr, 0);
4320                 SvCUR_set(sstr, 0);
4321                 SvTEMP_off(sstr);
4322             }
4323         }
4324         if (sflags & SVp_NOK) {
4325             SvNV_set(dstr, SvNVX(sstr));
4326         }
4327         if (sflags & SVp_IOK) {
4328             SvIV_set(dstr, SvIVX(sstr));
4329             /* Must do this otherwise some other overloaded use of 0x80000000
4330                gets confused. I guess SVpbm_VALID */
4331             if (sflags & SVf_IVisUV)
4332                 SvIsUV_on(dstr);
4333         }
4334         SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_NOK|SVp_NOK|SVf_UTF8);
4335         {
4336             const MAGIC * const smg = SvVSTRING_mg(sstr);
4337             if (smg) {
4338                 sv_magic(dstr, NULL, PERL_MAGIC_vstring,
4339                          smg->mg_ptr, smg->mg_len);
4340                 SvRMAGICAL_on(dstr);
4341             }
4342         }
4343     }
4344     else if (sflags & (SVp_IOK|SVp_NOK)) {
4345         (void)SvOK_off(dstr);
4346         SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_IVisUV|SVf_NOK|SVp_NOK);
4347         if (sflags & SVp_IOK) {
4348             /* XXXX Do we want to set IsUV for IV(ROK)?  Be extra safe... */
4349             SvIV_set(dstr, SvIVX(sstr));
4350         }
4351         if (sflags & SVp_NOK) {
4352             SvNV_set(dstr, SvNVX(sstr));
4353         }
4354     }
4355     else {
4356         if (isGV_with_GP(sstr)) {
4357             gv_efullname3(dstr, MUTABLE_GV(sstr), "*");
4358         }
4359         else
4360             (void)SvOK_off(dstr);
4361     }
4362     if (SvTAINTED(sstr))
4363         SvTAINT(dstr);
4364 }
4365
4366 /*
4367 =for apidoc sv_setsv_mg
4368
4369 Like C<sv_setsv>, but also handles 'set' magic.
4370
4371 =cut
4372 */
4373
4374 void
4375 Perl_sv_setsv_mg(pTHX_ SV *const dstr, register SV *const sstr)
4376 {
4377     PERL_ARGS_ASSERT_SV_SETSV_MG;
4378
4379     sv_setsv(dstr,sstr);
4380     SvSETMAGIC(dstr);
4381 }
4382
4383 #ifdef PERL_OLD_COPY_ON_WRITE
4384 SV *
4385 Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
4386 {
4387     STRLEN cur = SvCUR(sstr);
4388     STRLEN len = SvLEN(sstr);
4389     register char *new_pv;
4390
4391     PERL_ARGS_ASSERT_SV_SETSV_COW;
4392
4393     if (DEBUG_C_TEST) {
4394         PerlIO_printf(Perl_debug_log, "Fast copy on write: %p -> %p\n",
4395                       (void*)sstr, (void*)dstr);
4396         sv_dump(sstr);
4397         if (dstr)
4398                     sv_dump(dstr);
4399     }
4400
4401     if (dstr) {
4402         if (SvTHINKFIRST(dstr))
4403             sv_force_normal_flags(dstr, SV_COW_DROP_PV);
4404         else if (SvPVX_const(dstr))
4405             Safefree(SvPVX_const(dstr));
4406     }
4407     else
4408         new_SV(dstr);
4409     SvUPGRADE(dstr, SVt_PVIV);
4410
4411     assert (SvPOK(sstr));
4412     assert (SvPOKp(sstr));
4413     assert (!SvIOK(sstr));
4414     assert (!SvIOKp(sstr));
4415     assert (!SvNOK(sstr));
4416     assert (!SvNOKp(sstr));
4417
4418     if (SvIsCOW(sstr)) {
4419
4420         if (SvLEN(sstr) == 0) {
4421             /* source is a COW shared hash key.  */
4422             DEBUG_C(PerlIO_printf(Perl_debug_log,
4423                                   "Fast copy on write: Sharing hash\n"));
4424             new_pv = HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr))));
4425             goto common_exit;
4426         }
4427         SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4428     } else {
4429         assert ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS);
4430         SvUPGRADE(sstr, SVt_PVIV);
4431         SvREADONLY_on(sstr);
4432         SvFAKE_on(sstr);
4433         DEBUG_C(PerlIO_printf(Perl_debug_log,
4434                               "Fast copy on write: Converting sstr to COW\n"));
4435         SV_COW_NEXT_SV_SET(dstr, sstr);
4436     }
4437     SV_COW_NEXT_SV_SET(sstr, dstr);
4438     new_pv = SvPVX_mutable(sstr);
4439
4440   common_exit:
4441     SvPV_set(dstr, new_pv);
4442     SvFLAGS(dstr) = (SVt_PVIV|SVf_POK|SVp_POK|SVf_FAKE|SVf_READONLY);
4443     if (SvUTF8(sstr))
4444         SvUTF8_on(dstr);
4445     SvLEN_set(dstr, len);
4446     SvCUR_set(dstr, cur);
4447     if (DEBUG_C_TEST) {
4448         sv_dump(dstr);
4449     }
4450     return dstr;
4451 }
4452 #endif
4453
4454 /*
4455 =for apidoc sv_setpvn
4456
4457 Copies a string into an SV.  The C<len> parameter indicates the number of
4458 bytes to be copied.  If the C<ptr> argument is NULL the SV will become
4459 undefined.  Does not handle 'set' magic.  See C<sv_setpvn_mg>.
4460
4461 =cut
4462 */
4463
4464 void
4465 Perl_sv_setpvn(pTHX_ register SV *const sv, register const char *const ptr, register const STRLEN len)
4466 {
4467     dVAR;
4468     register char *dptr;
4469
4470     PERL_ARGS_ASSERT_SV_SETPVN;
4471
4472     SV_CHECK_THINKFIRST_COW_DROP(sv);
4473     if (!ptr) {
4474         (void)SvOK_off(sv);
4475         return;
4476     }
4477     else {
4478         /* len is STRLEN which is unsigned, need to copy to signed */
4479         const IV iv = len;
4480         if (iv < 0)
4481             Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen");
4482     }
4483     SvUPGRADE(sv, SVt_PV);
4484
4485     dptr = SvGROW(sv, len + 1);
4486     Move(ptr,dptr,len,char);
4487     dptr[len] = '\0';
4488     SvCUR_set(sv, len);
4489     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4490     SvTAINT(sv);
4491     if (SvTYPE(sv) == SVt_PVCV) CvAUTOLOAD_off(sv);
4492 }
4493
4494 /*
4495 =for apidoc sv_setpvn_mg
4496
4497 Like C<sv_setpvn>, but also handles 'set' magic.
4498
4499 =cut
4500 */
4501
4502 void
4503 Perl_sv_setpvn_mg(pTHX_ register SV *const sv, register const char *const ptr, register const STRLEN len)
4504 {
4505     PERL_ARGS_ASSERT_SV_SETPVN_MG;
4506
4507     sv_setpvn(sv,ptr,len);
4508     SvSETMAGIC(sv);
4509 }
4510
4511 /*
4512 =for apidoc sv_setpv
4513
4514 Copies a string into an SV.  The string must be null-terminated.  Does not
4515 handle 'set' magic.  See C<sv_setpv_mg>.
4516
4517 =cut
4518 */
4519
4520 void
4521 Perl_sv_setpv(pTHX_ register SV *const sv, register const char *const ptr)
4522 {
4523     dVAR;
4524     register STRLEN len;
4525
4526     PERL_ARGS_ASSERT_SV_SETPV;
4527
4528     SV_CHECK_THINKFIRST_COW_DROP(sv);
4529     if (!ptr) {
4530         (void)SvOK_off(sv);
4531         return;
4532     }
4533     len = strlen(ptr);
4534     SvUPGRADE(sv, SVt_PV);
4535
4536     SvGROW(sv, len + 1);
4537     Move(ptr,SvPVX(sv),len+1,char);
4538     SvCUR_set(sv, len);
4539     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4540     SvTAINT(sv);
4541     if (SvTYPE(sv) == SVt_PVCV) CvAUTOLOAD_off(sv);
4542 }
4543
4544 /*
4545 =for apidoc sv_setpv_mg
4546
4547 Like C<sv_setpv>, but also handles 'set' magic.
4548
4549 =cut
4550 */
4551
4552 void
4553 Perl_sv_setpv_mg(pTHX_ register SV *const sv, register const char *const ptr)
4554 {
4555     PERL_ARGS_ASSERT_SV_SETPV_MG;
4556
4557     sv_setpv(sv,ptr);
4558     SvSETMAGIC(sv);
4559 }
4560
4561 void
4562 Perl_sv_sethek(pTHX_ register SV *const sv, const HEK *const hek)
4563 {
4564     dVAR;
4565
4566     PERL_ARGS_ASSERT_SV_SETHEK;
4567
4568     if (!hek) {
4569         return;
4570     }
4571
4572     if (HEK_LEN(hek) == HEf_SVKEY) {
4573         sv_setsv(sv, *(SV**)HEK_KEY(hek));
4574         return;
4575     } else {
4576         const int flags = HEK_FLAGS(hek);
4577         if (flags & HVhek_WASUTF8) {
4578             STRLEN utf8_len = HEK_LEN(hek);
4579             char *as_utf8 = (char *)bytes_to_utf8((U8*)HEK_KEY(hek), &utf8_len);
4580             sv_usepvn_flags(sv, as_utf8, utf8_len, SV_HAS_TRAILING_NUL);
4581             SvUTF8_on(sv);
4582             return;
4583         } else if (flags & (HVhek_REHASH|HVhek_UNSHARED)) {
4584             sv_setpvn(sv, HEK_KEY(hek), HEK_LEN(hek));
4585             if (HEK_UTF8(hek))
4586                 SvUTF8_on(sv);
4587             else SvUTF8_off(sv);
4588             return;
4589         }
4590         {
4591             SV_CHECK_THINKFIRST_COW_DROP(sv);
4592             SvUPGRADE(sv, SVt_PV);
4593             SvPV_set(sv,(char *)HEK_KEY(share_hek_hek(hek)));
4594             SvCUR_set(sv, HEK_LEN(hek));
4595             SvLEN_set(sv, 0);
4596             SvREADONLY_on(sv);
4597             SvFAKE_on(sv);
4598             SvPOK_on(sv);
4599             if (HEK_UTF8(hek))
4600                 SvUTF8_on(sv);
4601             else SvUTF8_off(sv);
4602             return;
4603         }
4604     }
4605 }
4606
4607
4608 /*
4609 =for apidoc sv_usepvn_flags
4610
4611 Tells an SV to use C<ptr> to find its string value.  Normally the
4612 string is stored inside the SV but sv_usepvn allows the SV to use an
4613 outside string.  The C<ptr> should point to memory that was allocated
4614 by C<malloc>.  It must be the start of a mallocked block
4615 of memory, and not a pointer to the middle of it.  The
4616 string length, C<len>, must be supplied.  By default
4617 this function will realloc (i.e. move) the memory pointed to by C<ptr>,
4618 so that pointer should not be freed or used by the programmer after
4619 giving it to sv_usepvn, and neither should any pointers from "behind"
4620 that pointer (e.g. ptr + 1) be used.
4621
4622 If C<flags> & SV_SMAGIC is true, will call SvSETMAGIC.  If C<flags> &
4623 SV_HAS_TRAILING_NUL is true, then C<ptr[len]> must be NUL, and the realloc
4624 will be skipped (i.e. the buffer is actually at least 1 byte longer than
4625 C<len>, and already meets the requirements for storing in C<SvPVX>).
4626
4627 =cut
4628 */
4629
4630 void
4631 Perl_sv_usepvn_flags(pTHX_ SV *const sv, char *ptr, const STRLEN len, const U32 flags)
4632 {
4633     dVAR;
4634     STRLEN allocate;
4635
4636     PERL_ARGS_ASSERT_SV_USEPVN_FLAGS;
4637
4638     SV_CHECK_THINKFIRST_COW_DROP(sv);
4639     SvUPGRADE(sv, SVt_PV);
4640     if (!ptr) {
4641         (void)SvOK_off(sv);
4642         if (flags & SV_SMAGIC)
4643             SvSETMAGIC(sv);
4644         return;
4645     }
4646     if (SvPVX_const(sv))
4647         SvPV_free(sv);
4648
4649 #ifdef DEBUGGING
4650     if (flags & SV_HAS_TRAILING_NUL)
4651         assert(ptr[len] == '\0');
4652 #endif
4653
4654     allocate = (flags & SV_HAS_TRAILING_NUL)
4655         ? len + 1 :
4656 #ifdef Perl_safesysmalloc_size
4657         len + 1;
4658 #else 
4659         PERL_STRLEN_ROUNDUP(len + 1);
4660 #endif
4661     if (flags & SV_HAS_TRAILING_NUL) {
4662         /* It's long enough - do nothing.
4663            Specifically Perl_newCONSTSUB is relying on this.  */
4664     } else {
4665 #ifdef DEBUGGING
4666         /* Force a move to shake out bugs in callers.  */
4667         char *new_ptr = (char*)safemalloc(allocate);
4668         Copy(ptr, new_ptr, len, char);
4669         PoisonFree(ptr,len,char);
4670         Safefree(ptr);
4671         ptr = new_ptr;
4672 #else
4673         ptr = (char*) saferealloc (ptr, allocate);
4674 #endif
4675     }
4676 #ifdef Perl_safesysmalloc_size
4677     SvLEN_set(sv, Perl_safesysmalloc_size(ptr));
4678 #else
4679     SvLEN_set(sv, allocate);
4680 #endif
4681     SvCUR_set(sv, len);
4682     SvPV_set(sv, ptr);
4683     if (!(flags & SV_HAS_TRAILING_NUL)) {
4684         ptr[len] = '\0';
4685     }
4686     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
4687     SvTAINT(sv);
4688     if (flags & SV_SMAGIC)
4689         SvSETMAGIC(sv);
4690 }
4691
4692 #ifdef PERL_OLD_COPY_ON_WRITE
4693 /* Need to do this *after* making the SV normal, as we need the buffer
4694    pointer to remain valid until after we've copied it.  If we let go too early,
4695    another thread could invalidate it by unsharing last of the same hash key
4696    (which it can do by means other than releasing copy-on-write Svs)
4697    or by changing the other copy-on-write SVs in the loop.  */
4698 STATIC void
4699 S_sv_release_COW(pTHX_ register SV *sv, const char *pvx, SV *after)
4700 {
4701     PERL_ARGS_ASSERT_SV_RELEASE_COW;
4702
4703     { /* this SV was SvIsCOW_normal(sv) */
4704          /* we need to find the SV pointing to us.  */
4705         SV *current = SV_COW_NEXT_SV(after);
4706
4707         if (current == sv) {
4708             /* The SV we point to points back to us (there were only two of us
4709                in the loop.)
4710                Hence other SV is no longer copy on write either.  */
4711             SvFAKE_off(after);
4712             SvREADONLY_off(after);
4713         } else {
4714             /* We need to follow the pointers around the loop.  */
4715             SV *next;
4716             while ((next = SV_COW_NEXT_SV(current)) != sv) {
4717                 assert (next);
4718                 current = next;
4719                  /* don't loop forever if the structure is bust, and we have
4720                     a pointer into a closed loop.  */
4721                 assert (current != after);
4722                 assert (SvPVX_const(current) == pvx);
4723             }
4724             /* Make the SV before us point to the SV after us.  */
4725             SV_COW_NEXT_SV_SET(current, after);
4726         }
4727     }
4728 }
4729 #endif
4730 /*
4731 =for apidoc sv_force_normal_flags
4732
4733 Undo various types of fakery on an SV: if the PV is a shared string, make
4734 a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
4735 an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
4736 we do the copy, and is also used locally.  If C<SV_COW_DROP_PV> is set
4737 then a copy-on-write scalar drops its PV buffer (if any) and becomes
4738 SvPOK_off rather than making a copy.  (Used where this
4739 scalar is about to be set to some other value.)  In addition,
4740 the C<flags> parameter gets passed to C<sv_unref_flags()>
4741 when unreffing.  C<sv_force_normal> calls this function
4742 with flags set to 0.
4743
4744 =cut
4745 */
4746
4747 void
4748 Perl_sv_force_normal_flags(pTHX_ register SV *const sv, const U32 flags)
4749 {
4750     dVAR;
4751
4752     PERL_ARGS_ASSERT_SV_FORCE_NORMAL_FLAGS;
4753
4754 #ifdef PERL_OLD_COPY_ON_WRITE
4755     if (SvREADONLY(sv)) {
4756         if (SvFAKE(sv)) {
4757             const char * const pvx = SvPVX_const(sv);
4758             const STRLEN len = SvLEN(sv);
4759             const STRLEN cur = SvCUR(sv);
4760             /* next COW sv in the loop.  If len is 0 then this is a shared-hash
4761                key scalar, so we mustn't attempt to call SV_COW_NEXT_SV(), as
4762                we'll fail an assertion.  */
4763             SV * const next = len ? SV_COW_NEXT_SV(sv) : 0;
4764
4765             if (DEBUG_C_TEST) {
4766                 PerlIO_printf(Perl_debug_log,
4767                               "Copy on write: Force normal %ld\n",
4768                               (long) flags);
4769                 sv_dump(sv);
4770             }
4771             SvFAKE_off(sv);
4772             SvREADONLY_off(sv);
4773             /* This SV doesn't own the buffer, so need to Newx() a new one:  */
4774             SvPV_set(sv, NULL);
4775             SvLEN_set(sv, 0);
4776             if (flags & SV_COW_DROP_PV) {
4777                 /* OK, so we don't need to copy our buffer.  */
4778                 SvPOK_off(sv);
4779             } else {
4780                 SvGROW(sv, cur + 1);
4781                 Move(pvx,SvPVX(sv),cur,char);
4782                 SvCUR_set(sv, cur);
4783                 *SvEND(sv) = '\0';
4784             }
4785             if (len) {
4786                 sv_release_COW(sv, pvx, next);
4787             } else {
4788                 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
4789             }
4790             if (DEBUG_C_TEST) {
4791                 sv_dump(sv);
4792             }
4793         }
4794         else if (IN_PERL_RUNTIME)
4795             Perl_croak_no_modify(aTHX);
4796     }
4797 #else
4798     if (SvREADONLY(sv)) {
4799         if (SvFAKE(sv) && !isGV_with_GP(sv)) {
4800             const char * const pvx = SvPVX_const(sv);
4801             const STRLEN len = SvCUR(sv);
4802             SvFAKE_off(sv);
4803             SvREADONLY_off(sv);
4804             SvPV_set(sv, NULL);
4805             SvLEN_set(sv, 0);
4806             if (flags & SV_COW_DROP_PV) {
4807                 /* OK, so we don't need to copy our buffer.  */
4808                 SvPOK_off(sv);
4809             } else {
4810                 SvGROW(sv, len + 1);
4811                 Move(pvx,SvPVX(sv),len,char);
4812                 *SvEND(sv) = '\0';
4813             }
4814             unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
4815         }
4816         else if (IN_PERL_RUNTIME)
4817             Perl_croak_no_modify(aTHX);
4818     }
4819 #endif
4820     if (SvROK(sv))
4821         sv_unref_flags(sv, flags);
4822     else if (SvFAKE(sv) && isGV_with_GP(sv))
4823         sv_unglob(sv, flags);
4824     else if (SvFAKE(sv) && SvTYPE(sv) == SVt_REGEXP) {
4825         /* Need to downgrade the REGEXP to a simple(r) scalar. This is analogous
4826            to sv_unglob. We only need it here, so inline it.  */
4827         const svtype new_type = SvMAGIC(sv) || SvSTASH(sv) ? SVt_PVMG : SVt_PV;
4828         SV *const temp = newSV_type(new_type);
4829         void *const temp_p = SvANY(sv);
4830
4831         if (new_type == SVt_PVMG) {
4832             SvMAGIC_set(temp, SvMAGIC(sv));
4833             SvMAGIC_set(sv, NULL);
4834             SvSTASH_set(temp, SvSTASH(sv));
4835             SvSTASH_set(sv, NULL);
4836         }
4837         SvCUR_set(temp, SvCUR(sv));
4838         /* Remember that SvPVX is in the head, not the body. */
4839         if (SvLEN(temp)) {
4840             SvLEN_set(temp, SvLEN(sv));
4841             /* This signals "buffer is owned by someone else" in sv_clear,
4842                which is the least effort way to stop it freeing the buffer.
4843             */
4844             SvLEN_set(sv, SvLEN(sv)+1);
4845         } else {
4846             /* Their buffer is already owned by someone else. */
4847             SvPVX(sv) = savepvn(SvPVX(sv), SvCUR(sv));
4848             SvLEN_set(temp, SvCUR(sv)+1);
4849         }
4850
4851         /* Now swap the rest of the bodies. */
4852
4853         SvFLAGS(sv) &= ~(SVf_FAKE|SVTYPEMASK);
4854         SvFLAGS(sv) |= new_type;
4855         SvANY(sv) = SvANY(temp);
4856
4857         SvFLAGS(temp) &= ~(SVTYPEMASK);
4858         SvFLAGS(temp) |= SVt_REGEXP|SVf_FAKE;
4859         SvANY(temp) = temp_p;
4860
4861         SvREFCNT_dec(temp);
4862     }
4863 }
4864
4865 /*
4866 =for apidoc sv_chop
4867
4868 Efficient removal of characters from the beginning of the string buffer.
4869 SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
4870 the string buffer.  The C<ptr> becomes the first character of the adjusted
4871 string.  Uses the "OOK hack".
4872
4873 Beware: after this function returns, C<ptr> and SvPVX_const(sv) may no longer
4874 refer to the same chunk of data.
4875
4876 The unfortunate similarity of this function's name to that of Perl's C<chop>
4877 operator is strictly coincidental.  This function works from the left;
4878 C<chop> works from the right.
4879
4880 =cut
4881 */
4882
4883 void
4884 Perl_sv_chop(pTHX_ register SV *const sv, register const char *const ptr)
4885 {
4886     STRLEN delta;
4887     STRLEN old_delta;
4888     U8 *p;
4889 #ifdef DEBUGGING
4890     const U8 *evacp;
4891     STRLEN evacn;
4892 #endif
4893     STRLEN max_delta;
4894
4895     PERL_ARGS_ASSERT_SV_CHOP;
4896
4897     if (!ptr || !SvPOKp(sv))
4898         return;
4899     delta = ptr - SvPVX_const(sv);
4900     if (!delta) {
4901         /* Nothing to do.  */
4902         return;
4903     }
4904     max_delta = SvLEN(sv) ? SvLEN(sv) : SvCUR(sv);
4905     if (delta > max_delta)
4906         Perl_croak(aTHX_ "panic: sv_chop ptr=%p, start=%p, end=%p",
4907                    ptr, SvPVX_const(sv), SvPVX_const(sv) + max_delta);
4908     /* SvPVX(sv) may move in SV_CHECK_THINKFIRST(sv), so don't use ptr any more */
4909     SV_CHECK_THINKFIRST(sv);
4910
4911     if (!SvOOK(sv)) {
4912         if (!SvLEN(sv)) { /* make copy of shared string */
4913             const char *pvx = SvPVX_const(sv);
4914             const STRLEN len = SvCUR(sv);
4915             SvGROW(sv, len + 1);
4916             Move(pvx,SvPVX(sv),len,char);
4917             *SvEND(sv) = '\0';
4918         }
4919         SvOOK_on(sv);
4920         old_delta = 0;
4921     } else {
4922         SvOOK_offset(sv, old_delta);
4923     }
4924     SvLEN_set(sv, SvLEN(sv) - delta);
4925     SvCUR_set(sv, SvCUR(sv) - delta);
4926     SvPV_set(sv, SvPVX(sv) + delta);
4927
4928     p = (U8 *)SvPVX_const(sv);
4929
4930 #ifdef DEBUGGING
4931     /* how many bytes were evacuated?  we will fill them with sentinel
4932        bytes, except for the part holding the new offset of course. */
4933     evacn = delta;
4934     if (old_delta)
4935         evacn += (old_delta < 0x100 ? 1 : 1 + sizeof(STRLEN));
4936     assert(evacn);
4937     assert(evacn <= delta + old_delta);
4938     evacp = p - evacn;
4939 #endif
4940
4941     delta += old_delta;
4942     assert(delta);
4943     if (delta < 0x100) {
4944         *--p = (U8) delta;
4945     } else {
4946         *--p = 0;
4947         p -= sizeof(STRLEN);
4948         Copy((U8*)&delta, p, sizeof(STRLEN), U8);
4949     }
4950
4951 #ifdef DEBUGGING
4952     /* Fill the preceding buffer with sentinals to verify that no-one is
4953        using it.  */
4954     while (p > evacp) {
4955         --p;
4956         *p = (U8)PTR2UV(p);
4957     }
4958 #endif
4959 }
4960
4961 /*
4962 =for apidoc sv_catpvn
4963
4964 Concatenates the string onto the end of the string which is in the SV.  The
4965 C<len> indicates number of bytes to copy.  If the SV has the UTF-8
4966 status set, then the bytes appended should be valid UTF-8.
4967 Handles 'get' magic, but not 'set' magic.  See C<sv_catpvn_mg>.
4968
4969 =for apidoc sv_catpvn_flags
4970
4971 Concatenates the string onto the end of the string which is in the SV.  The
4972 C<len> indicates number of bytes to copy.  If the SV has the UTF-8
4973 status set, then the bytes appended should be valid UTF-8.
4974 If C<flags> has the C<SV_SMAGIC> bit set, will
4975 C<mg_set> on C<dsv> afterwards if appropriate.
4976 C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
4977 in terms of this function.
4978
4979 =cut
4980 */
4981
4982 void
4983 Perl_sv_catpvn_flags(pTHX_ register SV *const dsv, register const char *sstr, register const STRLEN slen, const I32 flags)
4984 {
4985     dVAR;
4986     STRLEN dlen;
4987     const char * const dstr = SvPV_force_flags(dsv, dlen, flags);
4988
4989     PERL_ARGS_ASSERT_SV_CATPVN_FLAGS;
4990     assert((flags & (SV_CATBYTES|SV_CATUTF8)) != (SV_CATBYTES|SV_CATUTF8));
4991
4992     if (!(flags & SV_CATBYTES) || !SvUTF8(dsv)) {
4993       if (flags & SV_CATUTF8 && !SvUTF8(dsv)) {
4994          sv_utf8_upgrade_flags_grow(dsv, 0, slen + 1);
4995          dlen = SvCUR(dsv);
4996       }
4997       else SvGROW(dsv, dlen + slen + 1);
4998       if (sstr == dstr)
4999         sstr = SvPVX_const(dsv);
5000       Move(sstr, SvPVX(dsv) + dlen, slen, char);
5001       SvCUR_set(dsv, SvCUR(dsv) + slen);
5002     }
5003     else {
5004         /* We inline bytes_to_utf8, to avoid an extra malloc. */
5005         const char * const send = sstr + slen;
5006         U8 *d;
5007
5008         /* Something this code does not account for, which I think is
5009            impossible; it would require the same pv to be treated as
5010            bytes *and* utf8, which would indicate a bug elsewhere. */
5011         assert(sstr != dstr);
5012
5013         SvGROW(dsv, dlen + slen * 2 + 1);
5014         d = (U8 *)SvPVX(dsv) + dlen;
5015
5016         while (sstr < send) {
5017             const UV uv = NATIVE_TO_ASCII((U8)*sstr++);
5018             if (UNI_IS_INVARIANT(uv))
5019                 *d++ = (U8)UTF_TO_NATIVE(uv);
5020             else {
5021                 *d++ = (U8)UTF8_EIGHT_BIT_HI(uv);
5022                 *d++ = (U8)UTF8_EIGHT_BIT_LO(uv);
5023             }
5024         }
5025         SvCUR_set(dsv, d-(const U8 *)SvPVX(dsv));
5026     }
5027     *SvEND(dsv) = '\0';
5028     (void)SvPOK_only_UTF8(dsv);         /* validate pointer */
5029     SvTAINT(dsv);
5030     if (flags & SV_SMAGIC)
5031         SvSETMAGIC(dsv);
5032 }
5033
5034 /*
5035 =for apidoc sv_catsv
5036
5037 Concatenates the string from SV C<ssv> onto the end of the string in
5038 SV C<dsv>.  Modifies C<dsv> but not C<ssv>.  Handles 'get' magic, but
5039 not 'set' magic.  See C<sv_catsv_mg>.
5040
5041 =for apidoc sv_catsv_flags
5042
5043 Concatenates the string from SV C<ssv> onto the end of the string in
5044 SV C<dsv>.  Modifies C<dsv> but not C<ssv>.  If C<flags> has C<SV_GMAGIC>
5045 bit set, will C<mg_get> on the C<ssv>, if appropriate, before
5046 reading it.  If the C<flags> contain C<SV_SMAGIC>, C<mg_set> will be
5047 called on the modified SV afterward, if appropriate.  C<sv_catsv>
5048 and C<sv_catsv_nomg> are implemented in terms of this function.
5049
5050 =cut */
5051
5052 void
5053 Perl_sv_catsv_flags(pTHX_ SV *const dsv, register SV *const ssv, const I32 flags)
5054 {
5055     dVAR;
5056  
5057     PERL_ARGS_ASSERT_SV_CATSV_FLAGS;
5058
5059    if (ssv) {
5060         STRLEN slen;
5061         const char *spv = SvPV_flags_const(ssv, slen, flags);
5062         if (spv) {
5063             if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
5064                 mg_get(dsv);
5065             sv_catpvn_flags(dsv, spv, slen,
5066                             DO_UTF8(ssv) ? SV_CATUTF8 : SV_CATBYTES);
5067         }
5068     }
5069     if (flags & SV_SMAGIC)
5070         SvSETMAGIC(dsv);
5071 }
5072
5073 /*
5074 =for apidoc sv_catpv
5075
5076 Concatenates the string onto the end of the string which is in the SV.
5077 If the SV has the UTF-8 status set, then the bytes appended should be
5078 valid UTF-8.  Handles 'get' magic, but not 'set' magic.  See C<sv_catpv_mg>.
5079
5080 =cut */
5081
5082 void
5083 Perl_sv_catpv(pTHX_ register SV *const sv, register const char *ptr)
5084 {
5085     dVAR;
5086     register STRLEN len;
5087     STRLEN tlen;
5088     char *junk;
5089
5090     PERL_ARGS_ASSERT_SV_CATPV;
5091
5092     if (!ptr)
5093         return;
5094     junk = SvPV_force(sv, tlen);
5095     len = strlen(ptr);
5096     SvGROW(sv, tlen + len + 1);
5097     if (ptr == junk)
5098         ptr = SvPVX_const(sv);
5099     Move(ptr,SvPVX(sv)+tlen,len+1,char);
5100     SvCUR_set(sv, SvCUR(sv) + len);
5101     (void)SvPOK_only_UTF8(sv);          /* validate pointer */
5102     SvTAINT(sv);
5103 }
5104
5105 /*
5106 =for apidoc sv_catpv_flags
5107
5108 Concatenates the string onto the end of the string which is in the SV.
5109 If the SV has the UTF-8 status set, then the bytes appended should
5110 be valid UTF-8.  If C<flags> has the C<SV_SMAGIC> bit set, will C<mg_set>
5111 on the modified SV if appropriate.
5112
5113 =cut
5114 */
5115
5116 void
5117 Perl_sv_catpv_flags(pTHX_ SV *dstr, const char *sstr, const I32 flags)
5118 {
5119     PERL_ARGS_ASSERT_SV_CATPV_FLAGS;
5120     sv_catpvn_flags(dstr, sstr, strlen(sstr), flags);
5121 }
5122
5123 /*
5124 =for apidoc sv_catpv_mg
5125
5126 Like C<sv_catpv>, but also handles 'set' magic.
5127
5128 =cut
5129 */
5130
5131 void
5132 Perl_sv_catpv_mg(pTHX_ register SV *const sv, register const char *const ptr)
5133 {
5134     PERL_ARGS_ASSERT_SV_CATPV_MG;
5135
5136     sv_catpv(sv,ptr);
5137     SvSETMAGIC(sv);
5138 }
5139
5140 /*
5141 =for apidoc newSV
5142
5143 Creates a new SV.  A non-zero C<len> parameter indicates the number of
5144 bytes of preallocated string space the SV should have.  An extra byte for a
5145 trailing NUL is also reserved.  (SvPOK is not set for the SV even if string
5146 space is allocated.)  The reference count for the new SV is set to 1.
5147
5148 In 5.9.3, newSV() replaces the older NEWSV() API, and drops the first
5149 parameter, I<x>, a debug aid which allowed callers to identify themselves.
5150 This aid has been superseded by a new build option, PERL_MEM_LOG (see
5151 L<perlhacktips/PERL_MEM_LOG>).  The older API is still there for use in XS
5152 modules supporting older perls.
5153
5154 =cut
5155 */
5156
5157 SV *
5158 Perl_newSV(pTHX_ const STRLEN len)
5159 {
5160     dVAR;
5161     register SV *sv;
5162
5163     new_SV(sv);
5164     if (len) {
5165         sv_upgrade(sv, SVt_PV);
5166         SvGROW(sv, len + 1);
5167     }
5168     return sv;
5169 }
5170 /*
5171 =for apidoc sv_magicext
5172
5173 Adds magic to an SV, upgrading it if necessary.  Applies the
5174 supplied vtable and returns a pointer to the magic added.
5175
5176 Note that C<sv_magicext> will allow things that C<sv_magic> will not.
5177 In particular, you can add magic to SvREADONLY SVs, and add more than
5178 one instance of the same 'how'.
5179
5180 If C<namlen> is greater than zero then a C<savepvn> I<copy> of C<name> is
5181 stored, if C<namlen> is zero then C<name> is stored as-is and - as another
5182 special case - if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
5183 to contain an C<SV*> and is stored as-is with its REFCNT incremented.
5184
5185 (This is now used as a subroutine by C<sv_magic>.)
5186
5187 =cut
5188 */
5189 MAGIC * 
5190 Perl_sv_magicext(pTHX_ SV *const sv, SV *const obj, const int how, 
5191                 const MGVTBL *const vtable, const char *const name, const I32 namlen)
5192 {
5193     dVAR;
5194     MAGIC* mg;
5195
5196     PERL_ARGS_ASSERT_SV_MAGICEXT;
5197
5198     SvUPGRADE(sv, SVt_PVMG);
5199     Newxz(mg, 1, MAGIC);
5200     mg->mg_moremagic = SvMAGIC(sv);
5201     SvMAGIC_set(sv, mg);
5202
5203     /* Sometimes a magic contains a reference loop, where the sv and
5204        object refer to each other.  To prevent a reference loop that
5205        would prevent such objects being freed, we look for such loops
5206        and if we find one we avoid incrementing the object refcount.
5207
5208        Note we cannot do this to avoid self-tie loops as intervening RV must
5209        have its REFCNT incremented to keep it in existence.
5210
5211     */
5212     if (!obj || obj == sv ||
5213         how == PERL_MAGIC_arylen ||
5214         how == PERL_MAGIC_symtab ||
5215         (SvTYPE(obj) == SVt_PVGV &&
5216             (GvSV(obj) == sv || GvHV(obj) == (const HV *)sv
5217              || GvAV(obj) == (const AV *)sv || GvCV(obj) == (const CV *)sv
5218              || GvIOp(obj) == (const IO *)sv || GvFORM(obj) == (const CV *)sv)))
5219     {
5220         mg->mg_obj = obj;
5221     }
5222     else {
5223         mg->mg_obj = SvREFCNT_inc_simple(obj);
5224         mg->mg_flags |= MGf_REFCOUNTED;
5225     }
5226
5227     /* Normal self-ties simply pass a null object, and instead of
5228        using mg_obj directly, use the SvTIED_obj macro to produce a
5229        new RV as needed.  For glob "self-ties", we are tieing the PVIO
5230        with an RV obj pointing to the glob containing the PVIO.  In
5231        this case, to avoid a reference loop, we need to weaken the
5232        reference.
5233     */
5234
5235     if (how == PERL_MAGIC_tiedscalar && SvTYPE(sv) == SVt_PVIO &&
5236         obj && SvROK(obj) && GvIO(SvRV(obj)) == (const IO *)sv)
5237     {
5238       sv_rvweaken(obj);
5239     }
5240
5241     mg->mg_type = how;
5242     mg->mg_len = namlen;
5243     if (name) {
5244         if (namlen > 0)
5245             mg->mg_ptr = savepvn(name, namlen);
5246         else if (namlen == HEf_SVKEY) {
5247             /* Yes, this is casting away const. This is only for the case of
5248                HEf_SVKEY. I think we need to document this aberation of the
5249                constness of the API, rather than making name non-const, as
5250                that change propagating outwards a long way.  */
5251             mg->mg_ptr = (char*)SvREFCNT_inc_simple_NN((SV *)name);
5252         } else
5253             mg->mg_ptr = (char *) name;
5254     }
5255     mg->mg_virtual = (MGVTBL *) vtable;
5256
5257     mg_magical(sv);
5258     if (SvGMAGICAL(sv))
5259         SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
5260     return mg;
5261 }
5262
5263 /*
5264 =for apidoc sv_magic
5265
5266 Adds magic to an SV.  First upgrades C<sv> to type C<SVt_PVMG> if
5267 necessary, then adds a new magic item of type C<how> to the head of the
5268 magic list.
5269
5270 See C<sv_magicext> (which C<sv_magic> now calls) for a description of the
5271 handling of the C<name> and C<namlen> arguments.
5272
5273 You need to use C<sv_magicext> to add magic to SvREADONLY SVs and also
5274 to add more than one instance of the same 'how'.
5275
5276 =cut
5277 */
5278
5279 void
5280 Perl_sv_magic(pTHX_ register SV *const sv, SV *const obj, const int how, 
5281              const char *const name, const I32 namlen)
5282 {
5283     dVAR;
5284     const MGVTBL *vtable;
5285     MAGIC* mg;
5286     unsigned int flags;
5287     unsigned int vtable_index;
5288
5289     PERL_ARGS_ASSERT_SV_MAGIC;
5290
5291     if (how < 0 || (unsigned)how > C_ARRAY_LENGTH(PL_magic_data)
5292         || ((flags = PL_magic_data[how]),
5293             (vtable_index = flags & PERL_MAGIC_VTABLE_MASK)
5294             > magic_vtable_max))
5295         Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
5296
5297     /* PERL_MAGIC_ext is reserved for use by extensions not perl internals.
5298        Useful for attaching extension internal data to perl vars.
5299        Note that multiple extensions may clash if magical scalars
5300        etc holding private data from one are passed to another. */
5301
5302     vtable = (vtable_index == magic_vtable_max)
5303         ? NULL : PL_magic_vtables + vtable_index;
5304
5305 #ifdef PERL_OLD_COPY_ON_WRITE
5306     if (SvIsCOW(sv))
5307         sv_force_normal_flags(sv, 0);
5308 #endif
5309     if (SvREADONLY(sv)) {
5310         if (
5311             /* its okay to attach magic to shared strings */
5312             (!SvFAKE(sv) || isGV_with_GP(sv))
5313
5314             && IN_PERL_RUNTIME
5315             && !PERL_MAGIC_TYPE_READONLY_ACCEPTABLE(how)
5316            )
5317         {
5318             Perl_croak_no_modify(aTHX);
5319         }
5320     }
5321     if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
5322         if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
5323             /* sv_magic() refuses to add a magic of the same 'how' as an
5324                existing one
5325              */
5326             if (how == PERL_MAGIC_taint) {
5327                 mg->mg_len |= 1;
5328                 /* Any scalar which already had taint magic on which someone
5329                    (erroneously?) did SvIOK_on() or similar will now be
5330                    incorrectly sporting public "OK" flags.  */
5331                 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
5332             }
5333             return;
5334         }
5335     }
5336
5337     /* Rest of work is done else where */
5338     mg = sv_magicext(sv,obj,how,vtable,name,namlen);
5339
5340     switch (how) {
5341     case PERL_MAGIC_taint:
5342         mg->mg_len = 1;
5343         break;
5344     case PERL_MAGIC_ext:
5345     case PERL_MAGIC_dbfile:
5346         SvRMAGICAL_on(sv);
5347         break;
5348     }
5349 }
5350
5351 static int
5352 S_sv_unmagicext_flags(pTHX_ SV *const sv, const int type, MGVTBL *vtbl, const U32 flags)
5353 {
5354     MAGIC* mg;
5355     MAGIC** mgp;
5356
5357     assert(flags <= 1);
5358
5359     if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
5360         return 0;
5361     mgp = &(((XPVMG*) SvANY(sv))->xmg_u.xmg_magic);
5362     for (mg = *mgp; mg; mg = *mgp) {
5363         const MGVTBL* const virt = mg->mg_virtual;
5364         if (mg->mg_type == type && (!flags || virt == vtbl)) {
5365             *mgp = mg->mg_moremagic;
5366             if (virt && virt->svt_free)
5367                 virt->svt_free(aTHX_ sv, mg);
5368             if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
5369                 if (mg->mg_len > 0)
5370                     Safefree(mg->mg_ptr);
5371                 else if (mg->mg_len == HEf_SVKEY)
5372                     SvREFCNT_dec(MUTABLE_SV(mg->mg_ptr));
5373                 else if (mg->mg_type == PERL_MAGIC_utf8)
5374                     Safefree(mg->mg_ptr);
5375             }
5376             if (mg->mg_flags & MGf_REFCOUNTED)
5377                 SvREFCNT_dec(mg->mg_obj);
5378             Safefree(mg);
5379         }
5380         else
5381             mgp = &mg->mg_moremagic;
5382     }
5383     if (SvMAGIC(sv)) {
5384         if (SvMAGICAL(sv))      /* if we're under save_magic, wait for restore_magic; */
5385             mg_magical(sv);     /*    else fix the flags now */
5386     }
5387     else {
5388         SvMAGICAL_off(sv);
5389         SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
5390     }
5391     return 0;
5392 }
5393
5394 /*
5395 =for apidoc sv_unmagic
5396
5397 Removes all magic of type C<type> from an SV.
5398
5399 =cut
5400 */
5401
5402 int
5403 Perl_sv_unmagic(pTHX_ SV *const sv, const int type)
5404 {
5405     PERL_ARGS_ASSERT_SV_UNMAGIC;
5406     return S_sv_unmagicext_flags(aTHX_ sv, type, NULL, 0);
5407 }
5408
5409 /*
5410 =for apidoc sv_unmagicext
5411
5412 Removes all magic of type C<type> with the specified C<vtbl> from an SV.
5413
5414 =cut
5415 */
5416
5417 int
5418 Perl_sv_unmagicext(pTHX_ SV *const sv, const int type, MGVTBL *vtbl)
5419 {
5420     PERL_ARGS_ASSERT_SV_UNMAGICEXT;
5421     return S_sv_unmagicext_flags(aTHX_ sv, type, vtbl, 1);
5422 }
5423
5424 /*
5425 =for apidoc sv_rvweaken
5426
5427 Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
5428 referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
5429 push a back-reference to this RV onto the array of backreferences
5430 associated with that magic.  If the RV is magical, set magic will be
5431 called after the RV is cleared.
5432
5433 =cut
5434 */
5435
5436 SV *
5437 Perl_sv_rvweaken(pTHX_ SV *const sv)
5438 {
5439     SV *tsv;
5440
5441     PERL_ARGS_ASSERT_SV_RVWEAKEN;
5442
5443     if (!SvOK(sv))  /* let undefs pass */
5444         return sv;
5445     if (!SvROK(sv))
5446         Perl_croak(aTHX_ "Can't weaken a nonreference");
5447     else if (SvWEAKREF(sv)) {
5448         Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
5449         return sv;
5450     }
5451     else if (SvREADONLY(sv)) croak_no_modify();
5452     tsv = SvRV(sv);
5453     Perl_sv_add_backref(aTHX_ tsv, sv);
5454     SvWEAKREF_on(sv);
5455     SvREFCNT_dec(tsv);
5456     return sv;
5457 }
5458
5459 /* Give tsv backref magic if it hasn't already got it, then push a
5460  * back-reference to sv onto the array associated with the backref magic.
5461  *
5462  * As an optimisation, if there's only one backref and it's not an AV,
5463  * store it directly in the HvAUX or mg_obj slot, avoiding the need to
5464  * allocate an AV. (Whether the slot holds an AV tells us whether this is
5465  * active.)
5466  */
5467
5468 /* A discussion about the backreferences array and its refcount:
5469  *
5470  * The AV holding the backreferences is pointed to either as the mg_obj of
5471  * PERL_MAGIC_backref, or in the specific case of a HV, from the
5472  * xhv_backreferences field. The array is created with a refcount
5473  * of 2. This means that if during global destruction the array gets
5474  * picked on before its parent to have its refcount decremented by the
5475  * random zapper, it won't actually be freed, meaning it's still there for
5476  * when its parent gets freed.
5477  *
5478  * When the parent SV is freed, the extra ref is killed by
5479  * Perl_sv_kill_backrefs.  The other ref is killed, in the case of magic,
5480  * by mg_free() / MGf_REFCOUNTED, or for a hash, by Perl_hv_kill_backrefs.
5481  *
5482  * When a single backref SV is stored directly, it is not reference
5483  * counted.
5484  */
5485
5486 void
5487 Perl_sv_add_backref(pTHX_ SV *const tsv, SV *const sv)
5488 {
5489     dVAR;
5490     SV **svp;
5491     AV *av = NULL;
5492     MAGIC *mg = NULL;
5493
5494     PERL_ARGS_ASSERT_SV_ADD_BACKREF;
5495
5496     /* find slot to store array or singleton backref */
5497
5498     if (SvTYPE(tsv) == SVt_PVHV) {
5499         svp = (SV**)Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(tsv));
5500     } else {
5501         if (! ((mg =
5502             (SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL))))
5503         {
5504             sv_magic(tsv, NULL, PERL_MAGIC_backref, NULL, 0);
5505             mg = mg_find(tsv, PERL_MAGIC_backref);
5506         }
5507         svp = &(mg->mg_obj);
5508     }
5509
5510     /* create or retrieve the array */
5511
5512     if (   (!*svp && SvTYPE(sv) == SVt_PVAV)
5513         || (*svp && SvTYPE(*svp) != SVt_PVAV)
5514     ) {
5515         /* create array */
5516         av = newAV();
5517         AvREAL_off(av);
5518         SvREFCNT_inc_simple_void(av);
5519         /* av now has a refcnt of 2; see discussion above */
5520         if (*svp) {
5521             /* move single existing backref to the array */
5522             av_extend(av, 1);
5523             AvARRAY(av)[++AvFILLp(av)] = *svp; /* av_push() */
5524         }
5525         *svp = (SV*)av;
5526         if (mg)
5527             mg->mg_flags |= MGf_REFCOUNTED;
5528     }
5529     else
5530         av = MUTABLE_AV(*svp);
5531
5532     if (!av) {
5533         /* optimisation: store single backref directly in HvAUX or mg_obj */
5534         *svp = sv;
5535         return;
5536     }
5537     /* push new backref */
5538     assert(SvTYPE(av) == SVt_PVAV);
5539     if (AvFILLp(av) >= AvMAX(av)) {
5540         av_extend(av, AvFILLp(av)+1);
5541     }
5542     AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */
5543 }
5544
5545 /* delete a back-reference to ourselves from the backref magic associated
5546  * with the SV we point to.
5547  */
5548
5549 void
5550 Perl_sv_del_backref(pTHX_ SV *const tsv, SV *const sv)
5551 {
5552     dVAR;
5553     SV **svp = NULL;
5554
5555     PERL_ARGS_ASSERT_SV_DEL_BACKREF;
5556
5557     if (SvTYPE(tsv) == SVt_PVHV) {
5558         if (SvOOK(tsv))
5559             svp = (SV**)Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(tsv));
5560     }
5561     else {
5562         MAGIC *const mg
5563             = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
5564         svp =  mg ? &(mg->mg_obj) : NULL;
5565     }
5566
5567     if (!svp)
5568         Perl_croak(aTHX_ "panic: del_backref, svp=0");
5569     if (!*svp) {
5570         /* It's possible that sv is being freed recursively part way through the
5571            freeing of tsv. If this happens, the backreferences array of tsv has
5572            already been freed, and so svp will be NULL. If this is the case,
5573            we should not panic. Instead, nothing needs doing, so return.  */
5574         if (PL_phase == PERL_PHASE_DESTRUCT && SvREFCNT(tsv) == 0)
5575             return;
5576         Perl_croak(aTHX_ "panic: del_backref, *svp=%p phase=%s refcnt=%" UVuf,
5577                    *svp, PL_phase_names[PL_phase], SvREFCNT(tsv));
5578     }
5579
5580     if (SvTYPE(*svp) == SVt_PVAV) {
5581 #ifdef DEBUGGING
5582         int count = 1;
5583 #endif
5584         AV * const av = (AV*)*svp;
5585         SSize_t fill;
5586         assert(!SvIS_FREED(av));
5587         fill = AvFILLp(av);
5588         assert(fill > -1);
5589         svp = AvARRAY(av);
5590         /* for an SV with N weak references to it, if all those
5591          * weak refs are deleted, then sv_del_backref will be called
5592          * N times and O(N^2) compares will be done within the backref
5593          * array. To ameliorate this potential slowness, we:
5594          * 1) make sure this code is as tight as possible;
5595          * 2) when looking for SV, look for it at both the head and tail of the
5596          *    array first before searching the rest, since some create/destroy
5597          *    patterns will cause the backrefs to be freed in order.
5598          */
5599         if (*svp == sv) {
5600             AvARRAY(av)++;
5601             AvMAX(av)--;
5602         }
5603         else {
5604             SV **p = &svp[fill];
5605             SV *const topsv = *p;
5606             if (topsv != sv) {
5607 #ifdef DEBUGGING
5608                 count = 0;
5609 #endif
5610                 while (--p > svp) {
5611                     if (*p == sv) {
5612                         /* We weren't the last entry.
5613                            An unordered list has this property that you
5614                            can take the last element off the end to fill
5615                            the hole, and it's still an unordered list :-)
5616                         */
5617                         *p = topsv;
5618 #ifdef DEBUGGING
5619                         count++;
5620 #else
5621                         break; /* should only be one */
5622 #endif
5623                     }
5624                 }
5625             }
5626         }
5627         assert(count ==1);
5628         AvFILLp(av) = fill-1;
5629     }
5630     else if (SvIS_FREED(*svp) && PL_phase == PERL_PHASE_DESTRUCT) {
5631         /* freed AV; skip */
5632     }
5633     else {
5634         /* optimisation: only a single backref, stored directly */
5635         if (*svp != sv)
5636             Perl_croak(aTHX_ "panic: del_backref, *svp=%p, sv=%p", *svp, sv);
5637         *svp = NULL;
5638     }
5639
5640 }
5641
5642 void
5643 Perl_sv_kill_backrefs(pTHX_ SV *const sv, AV *const av)
5644 {
5645     SV **svp;
5646     SV **last;
5647     bool is_array;
5648
5649     PERL_ARGS_ASSERT_SV_KILL_BACKREFS;
5650
5651     if (!av)
5652         return;
5653
5654     /* after multiple passes through Perl_sv_clean_all() for a thinngy
5655      * that has badly leaked, the backref array may have gotten freed,
5656      * since we only protect it against 1 round of cleanup */
5657     if (SvIS_FREED(av)) {
5658         if (PL_in_clean_all) /* All is fair */
5659             return;
5660         Perl_croak(aTHX_
5661                    "panic: magic_killbackrefs (freed backref AV/SV)");
5662     }
5663
5664
5665     is_array = (SvTYPE(av) == SVt_PVAV);
5666     if (is_array) {
5667         assert(!SvIS_FREED(av));
5668         svp = AvARRAY(av);
5669         if (svp)
5670             last = svp + AvFILLp(av);
5671     }
5672     else {
5673         /* optimisation: only a single backref, stored directly */
5674         svp = (SV**)&av;
5675         last = svp;
5676     }
5677
5678     if (svp) {
5679         while (svp <= last) {
5680             if (*svp) {
5681                 SV *const referrer = *svp;
5682                 if (SvWEAKREF(referrer)) {
5683                     /* XXX Should we check that it hasn't changed? */
5684                     assert(SvROK(referrer));
5685                     SvRV_set(referrer, 0);
5686                     SvOK_off(referrer);
5687                     SvWEAKREF_off(referrer);
5688                     SvSETMAGIC(referrer);
5689                 } else if (SvTYPE(referrer) == SVt_PVGV ||
5690                            SvTYPE(referrer) == SVt_PVLV) {
5691                     assert(SvTYPE(sv) == SVt_PVHV); /* stash backref */
5692                     /* You lookin' at me?  */
5693                     assert(GvSTASH(referrer));
5694                     assert(GvSTASH(referrer) == (const HV *)sv);
5695                     GvSTASH(referrer) = 0;
5696                 } else if (SvTYPE(referrer) == SVt_PVCV ||
5697                            SvTYPE(referrer) == SVt_PVFM) {
5698                     if (SvTYPE(sv) == SVt_PVHV) { /* stash backref */
5699                         /* You lookin' at me?  */
5700                         assert(CvSTASH(referrer));
5701                         assert(CvSTASH(referrer) == (const HV *)sv);
5702                         SvANY(MUTABLE_CV(referrer))->xcv_stash = 0;
5703                     }
5704                     else {
5705                         assert(SvTYPE(sv) == SVt_PVGV);
5706                         /* You lookin' at me?  */
5707                         assert(CvGV(referrer));
5708                         assert(CvGV(referrer) == (const GV *)sv);
5709                         anonymise_cv_maybe(MUTABLE_GV(sv),
5710                                                 MUTABLE_CV(referrer));
5711                     }
5712
5713                 } else {
5714                     Perl_croak(aTHX_
5715                                "panic: magic_killbackrefs (flags=%"UVxf")",
5716                                (UV)SvFLAGS(referrer));
5717                 }
5718
5719                 if (is_array)
5720                     *svp = NULL;
5721             }
5722             svp++;
5723         }
5724     }
5725     if (is_array) {
5726         AvFILLp(av) = -1;
5727         SvREFCNT_dec(av); /* remove extra count added by sv_add_backref() */
5728     }
5729     return;
5730 }
5731
5732 /*
5733 =for apidoc sv_insert
5734
5735 Inserts a string at the specified offset/length within the SV.  Similar to
5736 the Perl substr() function.  Handles get magic.
5737
5738 =for apidoc sv_insert_flags
5739
5740 Same as C<sv_insert>, but the extra C<flags> are passed to the
5741 C<SvPV_force_flags> that applies to C<bigstr>.
5742
5743 =cut
5744 */
5745
5746 void
5747 Perl_sv_insert_flags(pTHX_ SV *const bigstr, const STRLEN offset, const STRLEN len, const char *const little, const STRLEN littlelen, const U32 flags)
5748 {
5749     dVAR;
5750     register char *big;
5751     register char *mid;
5752     register char *midend;
5753     register char *bigend;
5754     register SSize_t i;         /* better be sizeof(STRLEN) or bad things happen */
5755     STRLEN curlen;
5756
5757     PERL_ARGS_ASSERT_SV_INSERT_FLAGS;
5758
5759     if (!bigstr)
5760         Perl_croak(aTHX_ "Can't modify nonexistent substring");
5761     SvPV_force_flags(bigstr, curlen, flags);
5762     (void)SvPOK_only_UTF8(bigstr);
5763     if (offset + len > curlen) {
5764         SvGROW(bigstr, offset+len+1);
5765         Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
5766         SvCUR_set(bigstr, offset+len);
5767     }
5768
5769     SvTAINT(bigstr);
5770     i = littlelen - len;
5771     if (i > 0) {                        /* string might grow */
5772         big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
5773         mid = big + offset + len;
5774         midend = bigend = big + SvCUR(bigstr);
5775         bigend += i;
5776         *bigend = '\0';
5777         while (midend > mid)            /* shove everything down */
5778             *--bigend = *--midend;
5779         Move(little,big+offset,littlelen,char);
5780         SvCUR_set(bigstr, SvCUR(bigstr) + i);
5781         SvSETMAGIC(bigstr);
5782         return;
5783     }
5784     else if (i == 0) {
5785         Move(little,SvPVX(bigstr)+offset,len,char);
5786         SvSETMAGIC(bigstr);
5787         return;
5788     }
5789
5790     big = SvPVX(bigstr);
5791     mid = big + offset;
5792     midend = mid + len;
5793     bigend = big + SvCUR(bigstr);
5794
5795     if (midend > bigend)
5796         Perl_croak(aTHX_ "panic: sv_insert");
5797
5798     if (mid - big > bigend - midend) {  /* faster to shorten from end */
5799         if (littlelen) {
5800             Move(little, mid, littlelen,char);
5801             mid += littlelen;
5802         }
5803         i = bigend - midend;
5804         if (i > 0) {
5805             Move(midend, mid, i,char);
5806             mid += i;
5807         }
5808         *mid = '\0';
5809         SvCUR_set(bigstr, mid - big);
5810     }
5811     else if ((i = mid - big)) { /* faster from front */
5812         midend -= littlelen;
5813         mid = midend;
5814         Move(big, midend - i, i, char);
5815         sv_chop(bigstr,midend-i);
5816         if (littlelen)
5817             Move(little, mid, littlelen,char);
5818     }
5819     else if (littlelen) {
5820         midend -= littlelen;
5821         sv_chop(bigstr,midend);
5822         Move(little,midend,littlelen,char);
5823     }
5824     else {
5825         sv_chop(bigstr,midend);
5826     }
5827     SvSETMAGIC(bigstr);
5828 }
5829
5830 /*
5831 =for apidoc sv_replace
5832
5833 Make the first argument a copy of the second, then delete the original.
5834 The target SV physically takes over ownership of the body of the source SV
5835 and inherits its flags; however, the target keeps any magic it owns,
5836 and any magic in the source is discarded.
5837 Note that this is a rather specialist SV copying operation; most of the
5838 time you'll want to use C<sv_setsv> or one of its many macro front-ends.
5839
5840 =cut
5841 */
5842
5843 void
5844 Perl_sv_replace(pTHX_ register SV *const sv, register SV *const nsv)
5845 {
5846     dVAR;
5847     const U32 refcnt = SvREFCNT(sv);
5848
5849     PERL_ARGS_ASSERT_SV_REPLACE;
5850
5851     SV_CHECK_THINKFIRST_COW_DROP(sv);
5852     if (SvREFCNT(nsv) != 1) {
5853         Perl_croak(aTHX_ "panic: reference miscount on nsv in sv_replace()"
5854                    " (%" UVuf " != 1)", (UV) SvREFCNT(nsv));
5855     }
5856     if (SvMAGICAL(sv)) {
5857         if (SvMAGICAL(nsv))
5858             mg_free(nsv);
5859         else
5860             sv_upgrade(nsv, SVt_PVMG);
5861         SvMAGIC_set(nsv, SvMAGIC(sv));
5862         SvFLAGS(nsv) |= SvMAGICAL(sv);
5863         SvMAGICAL_off(sv);
5864         SvMAGIC_set(sv, NULL);
5865     }
5866     SvREFCNT(sv) = 0;
5867     sv_clear(sv);
5868     assert(!SvREFCNT(sv));
5869 #ifdef DEBUG_LEAKING_SCALARS
5870     sv->sv_flags  = nsv->sv_flags;
5871     sv->sv_any    = nsv->sv_any;
5872     sv->sv_refcnt = nsv->sv_refcnt;
5873     sv->sv_u      = nsv->sv_u;
5874 #else
5875     StructCopy(nsv,sv,SV);
5876 #endif
5877     if(SvTYPE(sv) == SVt_IV) {
5878         SvANY(sv)
5879             = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
5880     }
5881         
5882
5883 #ifdef PERL_OLD_COPY_ON_WRITE
5884     if (SvIsCOW_normal(nsv)) {
5885         /* We need to follow the pointers around the loop to make the
5886            previous SV point to sv, rather than nsv.  */
5887         SV *next;
5888         SV *current = nsv;
5889         while ((next = SV_COW_NEXT_SV(current)) != nsv) {
5890             assert(next);
5891             current = next;
5892             assert(SvPVX_const(current) == SvPVX_const(nsv));
5893         }
5894         /* Make the SV before us point to the SV after us.  */
5895         if (DEBUG_C_TEST) {
5896             PerlIO_printf(Perl_debug_log, "previous is\n");
5897             sv_dump(current);
5898             PerlIO_printf(Perl_debug_log,
5899                           "move it from 0x%"UVxf" to 0x%"UVxf"\n",
5900                           (UV) SV_COW_NEXT_SV(current), (UV) sv);
5901         }
5902         SV_COW_NEXT_SV_SET(current, sv);
5903     }
5904 #endif
5905     SvREFCNT(sv) = refcnt;
5906     SvFLAGS(nsv) |= SVTYPEMASK;         /* Mark as freed */
5907     SvREFCNT(nsv) = 0;
5908     del_SV(nsv);
5909 }
5910
5911 /* We're about to free a GV which has a CV that refers back to us.
5912  * If that CV will outlive us, make it anonymous (i.e. fix up its CvGV
5913  * field) */
5914
5915 STATIC void
5916 S_anonymise_cv_maybe(pTHX_ GV *gv, CV* cv)
5917 {
5918     SV *gvname;
5919     GV *anongv;
5920
5921     PERL_ARGS_ASSERT_ANONYMISE_CV_MAYBE;
5922
5923     /* be assertive! */
5924     assert(SvREFCNT(gv) == 0);
5925     assert(isGV(gv) && isGV_with_GP(gv));
5926     assert(GvGP(gv));
5927     assert(!CvANON(cv));
5928     assert(CvGV(cv) == gv);
5929
5930     /* will the CV shortly be freed by gp_free() ? */
5931     if (GvCV(gv) == cv && GvGP(gv)->gp_refcnt < 2 && SvREFCNT(cv) < 2) {
5932         SvANY(cv)->xcv_gv = NULL;
5933         return;
5934     }
5935
5936     /* if not, anonymise: */
5937     gvname = (GvSTASH(gv) && HvNAME(GvSTASH(gv)) && HvENAME(GvSTASH(gv)))
5938                     ? newSVhek(HvENAME_HEK(GvSTASH(gv)))
5939                     : newSVpvn_flags( "__ANON__", 8, 0 );
5940     sv_catpvs(gvname, "::__ANON__");
5941     anongv = gv_fetchsv(gvname, GV_ADDMULTI, SVt_PVCV);
5942     SvREFCNT_dec(gvname);
5943
5944     CvANON_on(cv);
5945     CvCVGV_RC_on(cv);
5946     SvANY(cv)->xcv_gv = MUTABLE_GV(SvREFCNT_inc(anongv));
5947 }
5948
5949
5950 /*
5951 =for apidoc sv_clear
5952
5953 Clear an SV: call any destructors, free up any memory used by the body,
5954 and free the body itself.  The SV's head is I<not> freed, although
5955 its type is set to all 1's so that it won't inadvertently be assumed
5956 to be live during global destruction etc.
5957 This function should only be called when REFCNT is zero.  Most of the time
5958 you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
5959 instead.
5960
5961 =cut
5962 */
5963
5964 void
5965 Perl_sv_clear(pTHX_ SV *const orig_sv)
5966 {
5967     dVAR;
5968     HV *stash;
5969     U32 type;
5970     const struct body_details *sv_type_details;
5971     SV* iter_sv = NULL;
5972     SV* next_sv = NULL;
5973     register SV *sv = orig_sv;
5974     STRLEN hash_index;
5975
5976     PERL_ARGS_ASSERT_SV_CLEAR;
5977
5978     /* within this loop, sv is the SV currently being freed, and
5979      * iter_sv is the most recent AV or whatever that's being iterated
5980      * over to provide more SVs */
5981
5982     while (sv) {
5983
5984         type = SvTYPE(sv);
5985
5986         assert(SvREFCNT(sv) == 0);
5987         assert(SvTYPE(sv) != (svtype)SVTYPEMASK);
5988
5989         if (type <= SVt_IV) {
5990             /* See the comment in sv.h about the collusion between this
5991              * early return and the overloading of the NULL slots in the
5992              * size table.  */
5993             if (SvROK(sv))
5994                 goto free_rv;
5995             SvFLAGS(sv) &= SVf_BREAK;
5996             SvFLAGS(sv) |= SVTYPEMASK;
5997             goto free_head;
5998         }
5999
6000         assert(!SvOBJECT(sv) || type >= SVt_PVMG); /* objs are always >= MG */
6001
6002         if (type >= SVt_PVMG) {
6003             if (SvOBJECT(sv)) {
6004                 if (!curse(sv, 1)) goto get_next_sv;
6005                 type = SvTYPE(sv); /* destructor may have changed it */
6006             }
6007             /* Free back-references before magic, in case the magic calls
6008              * Perl code that has weak references to sv. */
6009             if (type == SVt_PVHV) {
6010                 Perl_hv_kill_backrefs(aTHX_ MUTABLE_HV(sv));
6011                 if (SvMAGIC(sv))
6012                     mg_free(sv);
6013             }
6014             else if (type == SVt_PVMG && SvPAD_OUR(sv)) {
6015                 SvREFCNT_dec(SvOURSTASH(sv));
6016             } else if (SvMAGIC(sv)) {
6017                 /* Free back-references before other types of magic. */
6018                 sv_unmagic(sv, PERL_MAGIC_backref);
6019                 mg_free(sv);
6020             }
6021             if (type == SVt_PVMG && SvPAD_TYPED(sv))
6022                 SvREFCNT_dec(SvSTASH(sv));
6023         }
6024         switch (type) {
6025             /* case SVt_BIND: */
6026         case SVt_PVIO:
6027             if (IoIFP(sv) &&
6028                 IoIFP(sv) != PerlIO_stdin() &&
6029                 IoIFP(sv) != PerlIO_stdout() &&
6030                 IoIFP(sv) != PerlIO_stderr() &&
6031                 !(IoFLAGS(sv) & IOf_FAKE_DIRP))
6032             {
6033                 io_close(MUTABLE_IO(sv), FALSE);
6034             }
6035             if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
6036                 PerlDir_close(IoDIRP(sv));
6037             IoDIRP(sv) = (DIR*)NULL;
6038             Safefree(IoTOP_NAME(sv));
6039             Safefree(IoFMT_NAME(sv));
6040             Safefree(IoBOTTOM_NAME(sv));
6041             goto freescalar;
6042         case SVt_REGEXP:
6043             /* FIXME for plugins */
6044             pregfree2((REGEXP*) sv);
6045             goto freescalar;
6046         case SVt_PVCV:
6047         case SVt_PVFM:
6048             cv_undef(MUTABLE_CV(sv));
6049             /* If we're in a stash, we don't own a reference to it.
6050              * However it does have a back reference to us, which needs to
6051              * be cleared.  */
6052             if ((stash = CvSTASH(sv)))
6053                 sv_del_backref(MUTABLE_SV(stash), sv);
6054             goto freescalar;
6055         case SVt_PVHV:
6056             if (PL_last_swash_hv == (const HV *)sv) {
6057                 PL_last_swash_hv = NULL;
6058             }
6059             if (HvTOTALKEYS((HV*)sv) > 0) {
6060                 const char *name;
6061                 /* this statement should match the one at the beginning of
6062                  * hv_undef_flags() */
6063                 if (   PL_phase != PERL_PHASE_DESTRUCT
6064                     && (name = HvNAME((HV*)sv)))
6065                 {
6066                     if (PL_stashcache)
6067                         (void)hv_delete(PL_stashcache, name,
6068                             HvNAMEUTF8((HV*)sv) ? -HvNAMELEN_get((HV*)sv) : HvNAMELEN_get((HV*)sv), G_DISCARD);
6069                     hv_name_set((HV*)sv, NULL, 0, 0);
6070                 }
6071
6072                 /* save old iter_sv in unused SvSTASH field */
6073                 assert(!SvOBJECT(sv));
6074                 SvSTASH(sv) = (HV*)iter_sv;
6075                 iter_sv = sv;
6076
6077                 /* XXX ideally we should save the old value of hash_index
6078                  * too, but I can't think of any place to hide it. The
6079                  * effect of not saving it is that for freeing hashes of
6080                  * hashes, we become quadratic in scanning the HvARRAY of
6081                  * the top hash looking for new entries to free; but
6082                  * hopefully this will be dwarfed by the freeing of all
6083                  * the nested hashes. */
6084                 hash_index = 0;
6085                 next_sv = Perl_hfree_next_entry(aTHX_ (HV*)sv, &hash_index);
6086                 goto get_next_sv; /* process this new sv */
6087             }
6088             /* free empty hash */
6089             Perl_hv_undef_flags(aTHX_ MUTABLE_HV(sv), HV_NAME_SETALL);
6090             assert(!HvARRAY((HV*)sv));
6091             break;
6092         case SVt_PVAV:
6093             {
6094                 AV* av = MUTABLE_AV(sv);
6095                 if (PL_comppad == av) {
6096                     PL_comppad = NULL;
6097                     PL_curpad = NULL;
6098                 }
6099                 if (AvREAL(av) && AvFILLp(av) > -1) {
6100                     next_sv = AvARRAY(av)[AvFILLp(av)--];
6101                     /* save old iter_sv in top-most slot of AV,
6102                      * and pray that it doesn't get wiped in the meantime */
6103                     AvARRAY(av)[AvMAX(av)] = iter_sv;
6104                     iter_sv = sv;
6105                     goto get_next_sv; /* process this new sv */
6106                 }
6107                 Safefree(AvALLOC(av));
6108             }
6109
6110             break;
6111         case SVt_PVLV:
6112             if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
6113                 SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv)));
6114                 HeNEXT((HE*)LvTARG(sv)) = PL_hv_fetch_ent_mh;
6115                 PL_hv_fetch_ent_mh = (HE*)LvTARG(sv);
6116             }
6117             else if (LvTYPE(sv) != 't') /* unless tie: unrefcnted fake SV**  */
6118                 SvREFCNT_dec(LvTARG(sv));
6119         case SVt_PVGV:
6120             if (isGV_with_GP(sv)) {
6121                 if(GvCVu((const GV *)sv) && (stash = GvSTASH(MUTABLE_GV(sv)))
6122                    && HvENAME_get(stash))
6123                     mro_method_changed_in(stash);
6124                 gp_free(MUTABLE_GV(sv));
6125                 if (GvNAME_HEK(sv))
6126                     unshare_hek(GvNAME_HEK(sv));
6127                 /* If we're in a stash, we don't own a reference to it.
6128                  * However it does have a back reference to us, which
6129                  * needs to be cleared.  */
6130                 if (!SvVALID(sv) && (stash = GvSTASH(sv)))
6131                         sv_del_backref(MUTABLE_SV(stash), sv);
6132             }
6133             /* FIXME. There are probably more unreferenced pointers to SVs
6134              * in the interpreter struct that we should check and tidy in
6135              * a similar fashion to this:  */
6136             /* See also S_sv_unglob, which does the same thing. */
6137             if ((const GV *)sv == PL_last_in_gv)
6138                 PL_last_in_gv = NULL;
6139         case SVt_PVMG:
6140         case SVt_PVNV:
6141         case SVt_PVIV:
6142         case SVt_PV:
6143           freescalar:
6144             /* Don't bother with SvOOK_off(sv); as we're only going to
6145              * free it.  */
6146             if (SvOOK(sv)) {
6147                 STRLEN offset;
6148                 SvOOK_offset(sv, offset);
6149                 SvPV_set(sv, SvPVX_mutable(sv) - offset);
6150                 /* Don't even bother with turning off the OOK flag.  */
6151             }
6152             if (SvROK(sv)) {
6153             free_rv:
6154                 {
6155                     SV * const target = SvRV(sv);
6156                     if (SvWEAKREF(sv))
6157                         sv_del_backref(target, sv);
6158                     else
6159                         next_sv = target;
6160                 }
6161             }
6162 #ifdef PERL_OLD_COPY_ON_WRITE
6163             else if (SvPVX_const(sv)
6164                      && !(SvTYPE(sv) == SVt_PVIO
6165                      && !(IoFLAGS(sv) & IOf_FAKE_DIRP)))
6166             {
6167                 if (SvIsCOW(sv)) {
6168                     if (DEBUG_C_TEST) {
6169                         PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
6170                         sv_dump(sv);
6171                     }
6172                     if (SvLEN(sv)) {
6173                         sv_release_COW(sv, SvPVX_const(sv), SV_COW_NEXT_SV(sv));
6174                     } else {
6175                         unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
6176                     }
6177
6178                     SvFAKE_off(sv);
6179                 } else if (SvLEN(sv)) {
6180                     Safefree(SvPVX_const(sv));
6181                 }
6182             }
6183 #else
6184             else if (SvPVX_const(sv) && SvLEN(sv)
6185                      && !(SvTYPE(sv) == SVt_PVIO
6186                      && !(IoFLAGS(sv) & IOf_FAKE_DIRP)))
6187                 Safefree(SvPVX_mutable(sv));
6188             else if (SvPVX_const(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
6189                 unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
6190                 SvFAKE_off(sv);
6191             }
6192 #endif
6193             break;
6194         case SVt_NV:
6195             break;
6196         }
6197
6198       free_body:
6199
6200         SvFLAGS(sv) &= SVf_BREAK;
6201         SvFLAGS(sv) |= SVTYPEMASK;
6202
6203         sv_type_details = bodies_by_type + type;
6204         if (sv_type_details->arena) {
6205             del_body(((char *)SvANY(sv) + sv_type_details->offset),
6206                      &PL_body_roots[type]);
6207         }
6208         else if (sv_type_details->body_size) {
6209             safefree(SvANY(sv));
6210         }
6211
6212       free_head:
6213         /* caller is responsible for freeing the head of the original sv */
6214         if (sv != orig_sv && !SvREFCNT(sv))
6215             del_SV(sv);
6216
6217         /* grab and free next sv, if any */
6218       get_next_sv:
6219         while (1) {
6220             sv = NULL;
6221             if (next_sv) {
6222                 sv = next_sv;
6223                 next_sv = NULL;
6224             }
6225             else if (!iter_sv) {
6226                 break;
6227             } else if (SvTYPE(iter_sv) == SVt_PVAV) {
6228                 AV *const av = (AV*)iter_sv;
6229                 if (AvFILLp(av) > -1) {
6230                     sv = AvARRAY(av)[AvFILLp(av)--];
6231                 }
6232                 else { /* no more elements of current AV to free */
6233                     sv = iter_sv;
6234                     type = SvTYPE(sv);
6235                     /* restore previous value, squirrelled away */
6236                     iter_sv = AvARRAY(av)[AvMAX(av)];
6237                     Safefree(AvALLOC(av));
6238                     goto free_body;
6239                 }
6240             } else if (SvTYPE(iter_sv) == SVt_PVHV) {
6241                 sv = Perl_hfree_next_entry(aTHX_ (HV*)iter_sv, &hash_index);
6242                 if (!sv && !HvTOTALKEYS((HV *)iter_sv)) {
6243                     /* no more elements of current HV to free */
6244                     sv = iter_sv;
6245                     type = SvTYPE(sv);
6246                     /* Restore previous value of iter_sv, squirrelled away */
6247                     assert(!SvOBJECT(sv));
6248                     iter_sv = (SV*)SvSTASH(sv);
6249
6250                     /* ideally we should restore the old hash_index here,
6251                      * but we don't currently save the old value */
6252                     hash_index = 0;
6253
6254                     /* free any remaining detritus from the hash struct */
6255                     Perl_hv_undef_flags(aTHX_ MUTABLE_HV(sv), HV_NAME_SETALL);
6256                     assert(!HvARRAY((HV*)sv));
6257                     goto free_body;
6258                 }
6259             }
6260
6261             /* unrolled SvREFCNT_dec and sv_free2 follows: */
6262
6263             if (!sv)
6264                 continue;
6265             if (!SvREFCNT(sv)) {
6266                 sv_free(sv);
6267                 continue;
6268             }
6269             if (--(SvREFCNT(sv)))
6270                 continue;
6271 #ifdef DEBUGGING
6272             if (SvTEMP(sv)) {
6273                 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING),
6274                          "Attempt to free temp prematurely: SV 0x%"UVxf
6275                          pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
6276                 continue;
6277             }
6278 #endif
6279             if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
6280                 /* make sure SvREFCNT(sv)==0 happens very seldom */
6281                 SvREFCNT(sv) = (~(U32)0)/2;
6282                 continue;
6283             }
6284             break;
6285         } /* while 1 */
6286
6287     } /* while sv */
6288 }
6289
6290 /* This routine curses the sv itself, not the object referenced by sv. So
6291    sv does not have to be ROK. */
6292
6293 static bool
6294 S_curse(pTHX_ SV * const sv, const bool check_refcnt) {
6295     dVAR;
6296
6297     PERL_ARGS_ASSERT_CURSE;
6298     assert(SvOBJECT(sv));
6299
6300     if (PL_defstash &&  /* Still have a symbol table? */
6301         SvDESTROYABLE(sv))
6302     {
6303         dSP;
6304         HV* stash;
6305         do {
6306             CV* destructor;
6307             stash = SvSTASH(sv);
6308             destructor = StashHANDLER(stash,DESTROY);
6309             if (destructor
6310                 /* A constant subroutine can have no side effects, so
6311                    don't bother calling it.  */
6312                 && !CvCONST(destructor)
6313                 /* Don't bother calling an empty destructor or one that
6314                    returns immediately. */
6315                 && (CvISXSUB(destructor)
6316                 || (CvSTART(destructor)
6317                     && (CvSTART(destructor)->op_next->op_type
6318                                         != OP_LEAVESUB)
6319                     && (CvSTART(destructor)->op_next->op_type
6320                                         != OP_PUSHMARK
6321                         || CvSTART(destructor)->op_next->op_next->op_type
6322                                         != OP_RETURN
6323                        )
6324                    ))
6325                )
6326             {
6327                 SV* const tmpref = newRV(sv);
6328                 SvREADONLY_on(tmpref); /* DESTROY() could be naughty */
6329                 ENTER;
6330                 PUSHSTACKi(PERLSI_DESTROY);
6331                 EXTEND(SP, 2);
6332                 PUSHMARK(SP);
6333                 PUSHs(tmpref);
6334                 PUTBACK;
6335                 call_sv(MUTABLE_SV(destructor),
6336                             G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
6337                 POPSTACK;
6338                 SPAGAIN;
6339                 LEAVE;
6340                 if(SvREFCNT(tmpref) < 2) {
6341                     /* tmpref is not kept alive! */
6342                     SvREFCNT(sv)--;
6343                     SvRV_set(tmpref, NULL);
6344                     SvROK_off(tmpref);
6345                 }
6346                 SvREFCNT_dec(tmpref);
6347             }
6348         } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
6349
6350
6351         if (check_refcnt && SvREFCNT(sv)) {
6352             if (PL_in_clean_objs)
6353                 Perl_croak(aTHX_
6354                   "DESTROY created new reference to dead object '%"HEKf"'",
6355                    HEKfARG(HvNAME_HEK(stash)));
6356             /* DESTROY gave object new lease on life */
6357             return FALSE;
6358         }
6359     }
6360
6361     if (SvOBJECT(sv)) {
6362         SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
6363         SvOBJECT_off(sv);       /* Curse the object. */
6364         if (SvTYPE(sv) != SVt_PVIO)
6365             --PL_sv_objcount;/* XXX Might want something more general */
6366     }
6367     return TRUE;
6368 }
6369
6370 /*
6371 =for apidoc sv_newref
6372
6373 Increment an SV's reference count.  Use the C<SvREFCNT_inc()> wrapper
6374 instead.
6375
6376 =cut
6377 */
6378
6379 SV *
6380 Perl_sv_newref(pTHX_ SV *const sv)
6381 {
6382     PERL_UNUSED_CONTEXT;
6383     if (sv)
6384         (SvREFCNT(sv))++;
6385     return sv;
6386 }
6387
6388 /*
6389 =for apidoc sv_free
6390
6391 Decrement an SV's reference count, and if it drops to zero, call
6392 C<sv_clear> to invoke destructors and free up any memory used by
6393 the body; finally, deallocate the SV's head itself.
6394 Normally called via a wrapper macro C<SvREFCNT_dec>.
6395
6396 =cut
6397 */
6398
6399 void
6400 Perl_sv_free(pTHX_ SV *const sv)
6401 {
6402     dVAR;
6403     if (!sv)
6404         return;
6405     if (SvREFCNT(sv) == 0) {
6406         if (SvFLAGS(sv) & SVf_BREAK)
6407             /* this SV's refcnt has been artificially decremented to
6408              * trigger cleanup */
6409             return;
6410         if (PL_in_clean_all) /* All is fair */
6411             return;
6412         if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
6413             /* make sure SvREFCNT(sv)==0 happens very seldom */
6414             SvREFCNT(sv) = (~(U32)0)/2;
6415             return;
6416         }
6417         if (ckWARN_d(WARN_INTERNAL)) {
6418 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
6419             Perl_dump_sv_child(aTHX_ sv);
6420 #else
6421   #ifdef DEBUG_LEAKING_SCALARS
6422             sv_dump(sv);
6423   #endif
6424 #ifdef DEBUG_LEAKING_SCALARS_ABORT
6425             if (PL_warnhook == PERL_WARNHOOK_FATAL
6426                 || ckDEAD(packWARN(WARN_INTERNAL))) {
6427                 /* Don't let Perl_warner cause us to escape our fate:  */
6428                 abort();
6429             }
6430 #endif
6431             /* This may not return:  */
6432             Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
6433                         "Attempt to free unreferenced scalar: SV 0x%"UVxf
6434                         pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
6435 #endif
6436         }
6437 #ifdef DEBUG_LEAKING_SCALARS_ABORT
6438         abort();
6439 #endif
6440         return;
6441     }
6442     if (--(SvREFCNT(sv)) > 0)
6443         return;
6444     Perl_sv_free2(aTHX_ sv);
6445 }
6446
6447 void
6448 Perl_sv_free2(pTHX_ SV *const sv)
6449 {
6450     dVAR;
6451
6452     PERL_ARGS_ASSERT_SV_FREE2;
6453
6454 #ifdef DEBUGGING
6455     if (SvTEMP(sv)) {
6456         Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING),
6457                          "Attempt to free temp prematurely: SV 0x%"UVxf
6458                          pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
6459         return;
6460     }
6461 #endif
6462     if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
6463         /* make sure SvREFCNT(sv)==0 happens very seldom */
6464         SvREFCNT(sv) = (~(U32)0)/2;
6465         return;
6466     }
6467     sv_clear(sv);
6468     if (! SvREFCNT(sv))
6469         del_SV(sv);
6470 }
6471
6472 /*
6473 =for apidoc sv_len
6474
6475 Returns the length of the string in the SV.  Handles magic and type
6476 coercion.  See also C<SvCUR>, which gives raw access to the xpv_cur slot.
6477
6478 =cut
6479 */
6480
6481 STRLEN
6482 Perl_sv_len(pTHX_ register SV *const sv)
6483 {
6484     STRLEN len;
6485
6486     if (!sv)
6487         return 0;
6488
6489     if (SvGMAGICAL(sv))
6490         len = mg_length(sv);
6491     else
6492         (void)SvPV_const(sv, len);
6493     return len;
6494 }
6495
6496 /*
6497 =for apidoc sv_len_utf8
6498
6499 Returns the number of characters in the string in an SV, counting wide
6500 UTF-8 bytes as a single character.  Handles magic and type coercion.
6501
6502 =cut
6503 */
6504
6505 /*
6506  * The length is cached in PERL_MAGIC_utf8, in the mg_len field.  Also the
6507  * mg_ptr is used, by sv_pos_u2b() and sv_pos_b2u() - see the comments below.
6508  * (Note that the mg_len is not the length of the mg_ptr field.
6509  * This allows the cache to store the character length of the string without
6510  * needing to malloc() extra storage to attach to the mg_ptr.)
6511  *
6512  */
6513
6514 STRLEN
6515 Perl_sv_len_utf8(pTHX_ register SV *const sv)
6516 {
6517     if (!sv)
6518         return 0;
6519
6520     if (SvGMAGICAL(sv))
6521         return mg_length(sv);
6522     else
6523     {
6524         STRLEN len;
6525         const U8 *s = (U8*)SvPV_const(sv, len);
6526
6527         if (PL_utf8cache) {
6528             STRLEN ulen;
6529             MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : NULL;
6530
6531             if (mg && (mg->mg_len != -1 || mg->mg_ptr)) {
6532                 if (mg->mg_len != -1)
6533                     ulen = mg->mg_len;
6534                 else {
6535                     /* We can use the offset cache for a headstart.
6536                        The longer value is stored in the first pair.  */
6537                     STRLEN *cache = (STRLEN *) mg->mg_ptr;
6538
6539                     ulen = cache[0] + Perl_utf8_length(aTHX_ s + cache[1],
6540                                                        s + len);
6541                 }
6542                 
6543                 if (PL_utf8cache < 0) {
6544                     const STRLEN real = Perl_utf8_length(aTHX_ s, s + len);
6545                     assert_uft8_cache_coherent("sv_len_utf8", ulen, real, sv);
6546                 }
6547             }
6548             else {
6549                 ulen = Perl_utf8_length(aTHX_ s, s + len);
6550                 utf8_mg_len_cache_update(sv, &mg, ulen);
6551             }
6552             return ulen;
6553         }
6554         return Perl_utf8_length(aTHX_ s, s + len);
6555     }
6556 }
6557
6558 /* Walk forwards to find the byte corresponding to the passed in UTF-8
6559    offset.  */
6560 static STRLEN
6561 S_sv_pos_u2b_forwards(const U8 *const start, const U8 *const send,
6562                       STRLEN *const uoffset_p, bool *const at_end)
6563 {
6564     const U8 *s = start;
6565     STRLEN uoffset = *uoffset_p;
6566
6567     PERL_ARGS_ASSERT_SV_POS_U2B_FORWARDS;
6568
6569     while (s < send && uoffset) {
6570         --uoffset;
6571         s += UTF8SKIP(s);
6572     }
6573     if (s == send) {
6574         *at_end = TRUE;
6575     }
6576     else if (s > send) {
6577         *at_end = TRUE;
6578         /* This is the existing behaviour. Possibly it should be a croak, as
6579            it's actually a bounds error  */
6580         s = send;
6581     }
6582     *uoffset_p -= uoffset;
6583     return s - start;
6584 }
6585
6586 /* Given the length of the string in both bytes and UTF-8 characters, decide
6587    whether to walk forwards or backwards to find the byte corresponding to
6588    the passed in UTF-8 offset.  */
6589 static STRLEN
6590 S_sv_pos_u2b_midway(const U8 *const start, const U8 *send,
6591                     STRLEN uoffset, const STRLEN uend)
6592 {
6593     STRLEN backw = uend - uoffset;
6594
6595     PERL_ARGS_ASSERT_SV_POS_U2B_MIDWAY;
6596
6597     if (uoffset < 2 * backw) {
6598         /* The assumption is that going forwards is twice the speed of going
6599            forward (that's where the 2 * backw comes from).
6600            (The real figure of course depends on the UTF-8 data.)  */
6601         const U8 *s = start;
6602
6603         while (s < send && uoffset--)
6604             s += UTF8SKIP(s);
6605         assert (s <= send);
6606         if (s > send)
6607             s = send;
6608         return s - start;
6609     }
6610
6611     while (backw--) {
6612         send--;
6613         while (UTF8_IS_CONTINUATION(*send))
6614             send--;
6615     }
6616     return send - start;
6617 }
6618
6619 /* For the string representation of the given scalar, find the byte
6620    corresponding to the passed in UTF-8 offset.  uoffset0 and boffset0
6621    give another position in the string, *before* the sought offset, which
6622    (which is always true, as 0, 0 is a valid pair of positions), which should
6623    help reduce the amount of linear searching.
6624    If *mgp is non-NULL, it should point to the UTF-8 cache magic, which
6625    will be used to reduce the amount of linear searching. The cache will be
6626    created if necessary, and the found value offered to it for update.  */
6627 static STRLEN
6628 S_sv_pos_u2b_cached(pTHX_ SV *const sv, MAGIC **const mgp, const U8 *const start,
6629                     const U8 *const send, STRLEN uoffset,
6630                     STRLEN uoffset0, STRLEN boffset0)
6631 {
6632     STRLEN boffset = 0; /* Actually always set, but let's keep gcc happy.  */
6633     bool found = FALSE;
6634     bool at_end = FALSE;
6635
6636     PERL_ARGS_ASSERT_SV_POS_U2B_CACHED;
6637
6638     assert (uoffset >= uoffset0);
6639
6640     if (!uoffset)
6641         return 0;
6642
6643     if (!SvREADONLY(sv)
6644         && PL_utf8cache
6645         && (*mgp || (SvTYPE(sv) >= SVt_PVMG &&
6646                      (*mgp = mg_find(sv, PERL_MAGIC_utf8))))) {
6647         if ((*mgp)->mg_ptr) {
6648             STRLEN *cache = (STRLEN *) (*mgp)->mg_ptr;
6649             if (cache[0] == uoffset) {
6650                 /* An exact match. */
6651                 return cache[1];
6652             }
6653             if (cache[2] == uoffset) {
6654                 /* An exact match. */
6655                 return cache[3];
6656             }
6657
6658             if (cache[0] < uoffset) {
6659                 /* The cache already knows part of the way.   */
6660                 if (cache[0] > uoffset0) {
6661                     /* The cache knows more than the passed in pair  */
6662                     uoffset0 = cache[0];
6663                     boffset0 = cache[1];
6664                 }
6665                 if ((*mgp)->mg_len != -1) {
6666                     /* And we know the end too.  */
6667                     boffset = boffset0
6668                         + sv_pos_u2b_midway(start + boffset0, send,
6669                                               uoffset - uoffset0,
6670                                               (*mgp)->mg_len - uoffset0);
6671                 } else {
6672                     uoffset -= uoffset0;
6673                     boffset = boffset0
6674                         + sv_pos_u2b_forwards(start + boffset0,
6675                                               send, &uoffset, &at_end);
6676                     uoffset += uoffset0;
6677                 }
6678             }
6679             else if (cache[2] < uoffset) {
6680                 /* We're between the two cache entries.  */
6681                 if (cache[2] > uoffset0) {
6682                     /* and the cache knows more than the passed in pair  */
6683                     uoffset0 = cache[2];
6684                     boffset0 = cache[3];
6685                 }
6686
6687                 boffset = boffset0
6688                     + sv_pos_u2b_midway(start + boffset0,
6689                                           start + cache[1],
6690                                           uoffset - uoffset0,
6691                                           cache[0] - uoffset0);
6692             } else {
6693                 boffset = boffset0
6694                     + sv_pos_u2b_midway(start + boffset0,
6695                                           start + cache[3],
6696                                           uoffset - uoffset0,
6697                                           cache[2] - uoffset0);
6698             }
6699             found = TRUE;
6700         }
6701         else if ((*mgp)->mg_len != -1) {
6702             /* If we can take advantage of a passed in offset, do so.  */
6703             /* In fact, offset0 is either 0, or less than offset, so don't
6704                need to worry about the other possibility.  */
6705             boffset = boffset0
6706                 + sv_pos_u2b_midway(start + boffset0, send,
6707                                       uoffset - uoffset0,
6708                                       (*mgp)->mg_len - uoffset0);
6709             found = TRUE;
6710         }
6711     }
6712
6713     if (!found || PL_utf8cache < 0) {
6714         STRLEN real_boffset;
6715         uoffset -= uoffset0;
6716         real_boffset = boffset0 + sv_pos_u2b_forwards(start + boffset0,
6717                                                       send, &uoffset, &at_end);
6718         uoffset += uoffset0;
6719
6720         if (found && PL_utf8cache < 0)
6721             assert_uft8_cache_coherent("sv_pos_u2b_cache", boffset,
6722                                        real_boffset, sv);
6723         boffset = real_boffset;
6724     }
6725
6726     if (PL_utf8cache) {
6727         if (at_end)
6728             utf8_mg_len_cache_update(sv, mgp, uoffset);
6729         else
6730             utf8_mg_pos_cache_update(sv, mgp, boffset, uoffset, send - start);
6731     }
6732     return boffset;
6733 }
6734
6735
6736 /*
6737 =for apidoc sv_pos_u2b_flags
6738
6739 Converts the value pointed to by offsetp from a count of UTF-8 chars from
6740 the start of the string, to a count of the equivalent number of bytes; if
6741 lenp is non-zero, it does the same to lenp, but this time starting from
6742 the offset, rather than from the start
6743 of the string.  Handles type coercion.
6744 I<flags> is passed to C<SvPV_flags>, and usually should be
6745 C<SV_GMAGIC|SV_CONST_RETURN> to handle magic.
6746
6747 =cut
6748 */
6749
6750 /*
6751  * sv_pos_u2b_flags() uses, like sv_pos_b2u(), the mg_ptr of the potential
6752  * PERL_MAGIC_utf8 of the sv to store the mapping between UTF-8 and
6753  * byte offsets.  See also the comments of S_utf8_mg_pos_cache_update().
6754  *
6755  */
6756
6757 STRLEN
6758 Perl_sv_pos_u2b_flags(pTHX_ SV *const sv, STRLEN uoffset, STRLEN *const lenp,
6759                       U32 flags)
6760 {
6761     const U8 *start;
6762     STRLEN len;
6763     STRLEN boffset;
6764
6765     PERL_ARGS_ASSERT_SV_POS_U2B_FLAGS;
6766
6767     start = (U8*)SvPV_flags(sv, len, flags);
6768     if (len) {
6769         const U8 * const send = start + len;
6770         MAGIC *mg = NULL;
6771         boffset = sv_pos_u2b_cached(sv, &mg, start, send, uoffset, 0, 0);
6772
6773         if (lenp
6774             && *lenp /* don't bother doing work for 0, as its bytes equivalent
6775                         is 0, and *lenp is already set to that.  */) {
6776             /* Convert the relative offset to absolute.  */
6777             const STRLEN uoffset2 = uoffset + *lenp;
6778             const STRLEN boffset2
6779                 = sv_pos_u2b_cached(sv, &mg, start, send, uoffset2,
6780                                       uoffset, boffset) - boffset;
6781
6782             *lenp = boffset2;
6783         }
6784     } else {
6785         if (lenp)
6786             *lenp = 0;
6787         boffset = 0;
6788     }
6789
6790     return boffset;
6791 }
6792
6793 /*
6794 =for apidoc sv_pos_u2b
6795
6796 Converts the value pointed to by offsetp from a count of UTF-8 chars from
6797 the start of the string, to a count of the equivalent number of bytes; if
6798 lenp is non-zero, it does the same to lenp, but this time starting from
6799 the offset, rather than from the start of the string.  Handles magic and
6800 type coercion.
6801
6802 Use C<sv_pos_u2b_flags> in preference, which correctly handles strings longer
6803 than 2Gb.
6804
6805 =cut
6806 */
6807
6808 /*
6809  * sv_pos_u2b() uses, like sv_pos_b2u(), the mg_ptr of the potential
6810  * PERL_MAGIC_utf8 of the sv to store the mapping between UTF-8 and
6811  * byte offsets.  See also the comments of S_utf8_mg_pos_cache_update().
6812  *
6813  */
6814
6815 /* This function is subject to size and sign problems */
6816
6817 void
6818 Perl_sv_pos_u2b(pTHX_ register SV *const sv, I32 *const offsetp, I32 *const lenp)
6819 {
6820     PERL_ARGS_ASSERT_SV_POS_U2B;
6821
6822     if (lenp) {
6823         STRLEN ulen = (STRLEN)*lenp;
6824         *offsetp = (I32)sv_pos_u2b_flags(sv, (STRLEN)*offsetp, &ulen,
6825                                          SV_GMAGIC|SV_CONST_RETURN);
6826         *lenp = (I32)ulen;
6827     } else {
6828         *offsetp = (I32)sv_pos_u2b_flags(sv, (STRLEN)*offsetp, NULL,
6829                                          SV_GMAGIC|SV_CONST_RETURN);
6830     }
6831 }
6832
6833 static void
6834 S_utf8_mg_len_cache_update(pTHX_ SV *const sv, MAGIC **const mgp,
6835                            const STRLEN ulen)
6836 {
6837     PERL_ARGS_ASSERT_UTF8_MG_LEN_CACHE_UPDATE;
6838     if (SvREADONLY(sv))
6839         return;
6840
6841     if (!*mgp && (SvTYPE(sv) < SVt_PVMG ||
6842                   !(*mgp = mg_find(sv, PERL_MAGIC_utf8)))) {
6843         *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, &PL_vtbl_utf8, 0, 0);
6844     }
6845     assert(*mgp);
6846
6847     (*mgp)->mg_len = ulen;
6848     /* For now, treat "overflowed" as "still unknown". See RT #72924.  */
6849     if (ulen != (STRLEN) (*mgp)->mg_len)
6850         (*mgp)->mg_len = -1;
6851 }
6852
6853 /* Create and update the UTF8 magic offset cache, with the proffered utf8/
6854    byte length pairing. The (byte) length of the total SV is passed in too,
6855    as blen, because for some (more esoteric) SVs, the call to SvPV_const()
6856    may not have updated SvCUR, so we can't rely on reading it directly.
6857
6858    The proffered utf8/byte length pairing isn't used if the cache already has
6859    two pairs, and swapping either for the proffered pair would increase the
6860    RMS of the intervals between known byte offsets.
6861
6862    The cache itself consists of 4 STRLEN values
6863    0: larger UTF-8 offset
6864    1: corresponding byte offset
6865    2: smaller UTF-8 offset
6866    3: corresponding byte offset
6867
6868    Unused cache pairs have the value 0, 0.
6869    Keeping the cache "backwards" means that the invariant of
6870    cache[0] >= cache[2] is maintained even with empty slots, which means that
6871    the code that uses it doesn't need to worry if only 1 entry has actually
6872    been set to non-zero.  It also makes the "position beyond the end of the
6873    cache" logic much simpler, as the first slot is always the one to start
6874    from.   
6875 */
6876 static void
6877 S_utf8_mg_pos_cache_update(pTHX_ SV *const sv, MAGIC **const mgp, const STRLEN byte,
6878                            const STRLEN utf8, const STRLEN blen)
6879 {
6880     STRLEN *cache;
6881
6882     PERL_ARGS_ASSERT_UTF8_MG_POS_CACHE_UPDATE;
6883
6884     if (SvREADONLY(sv))
6885         return;
6886
6887     if (!*mgp && (SvTYPE(sv) < SVt_PVMG ||
6888                   !(*mgp = mg_find(sv, PERL_MAGIC_utf8)))) {
6889         *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, (MGVTBL*)&PL_vtbl_utf8, 0,
6890                            0);
6891         (*mgp)->mg_len = -1;
6892     }
6893     assert(*mgp);
6894
6895     if (!(cache = (STRLEN *)(*mgp)->mg_ptr)) {
6896         Newxz(cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
6897         (*mgp)->mg_ptr = (char *) cache;
6898     }
6899     assert(cache);
6900
6901     if (PL_utf8cache < 0 && SvPOKp(sv)) {
6902         /* SvPOKp() because it's possible that sv has string overloading, and
6903            therefore is a reference, hence SvPVX() is actually a pointer.
6904            This cures the (very real) symptoms of RT 69422, but I'm not actually
6905            sure whether we should even be caching the results of UTF-8
6906            operations on overloading, given that nothing stops overloading
6907            returning a different value every time it's called.  */
6908         const U8 *start = (const U8 *) SvPVX_const(sv);
6909         const STRLEN realutf8 = utf8_length(start, start + byte);
6910
6911         assert_uft8_cache_coherent("utf8_mg_pos_cache_update", utf8, realutf8,
6912                                    sv);
6913     }
6914
6915     /* Cache is held with the later position first, to simplify the code
6916        that deals with unbounded ends.  */
6917        
6918     ASSERT_UTF8_CACHE(cache);
6919     if (cache[1] == 0) {
6920         /* Cache is totally empty  */
6921         cache[0] = utf8;
6922         cache[1] = byte;
6923     } else if (cache[3] == 0) {
6924         if (byte > cache[1]) {
6925             /* New one is larger, so goes first.  */
6926             cache[2] = cache[0];
6927             cache[3] = cache[1];
6928             cache[0] = utf8;
6929             cache[1] = byte;
6930         } else {
6931             cache[2] = utf8;
6932             cache[3] = byte;
6933         }
6934     } else {
6935 #define THREEWAY_SQUARE(a,b,c,d) \
6936             ((float)((d) - (c))) * ((float)((d) - (c))) \
6937             + ((float)((c) - (b))) * ((float)((c) - (b))) \
6938                + ((float)((b) - (a))) * ((float)((b) - (a)))
6939
6940         /* Cache has 2 slots in use, and we know three potential pairs.
6941            Keep the two that give the lowest RMS distance. Do the
6942            calculation in bytes simply because we always know the byte
6943            length.  squareroot has the same ordering as the positive value,
6944            so don't bother with the actual square root.  */
6945         const float existing = THREEWAY_SQUARE(0, cache[3], cache[1], blen);
6946         if (byte > cache[1]) {
6947             /* New position is after the existing pair of pairs.  */
6948             const float keep_earlier
6949                 = THREEWAY_SQUARE(0, cache[3], byte, blen);
6950             const float keep_later
6951                 = THREEWAY_SQUARE(0, cache[1], byte, blen);
6952
6953             if (keep_later < keep_earlier) {
6954                 if (keep_later < existing) {
6955                     cache[2] = cache[0];
6956                     cache[3] = cache[1];
6957                     cache[0] = utf8;
6958                     cache[1] = byte;
6959                 }
6960             }
6961             else {
6962                 if (keep_earlier < existing) {
6963                     cache[0] = utf8;
6964                     cache[1] = byte;
6965                 }
6966             }
6967         }
6968         else if (byte > cache[3]) {
6969             /* New position is between the existing pair of pairs.  */
6970             const float keep_earlier
6971                 = THREEWAY_SQUARE(0, cache[3], byte, blen);
6972             const float keep_later
6973                 = THREEWAY_SQUARE(0, byte, cache[1], blen);
6974
6975             if (keep_later < keep_earlier) {
6976                 if (keep_later < existing) {
6977                     cache[2] = utf8;
6978                     cache[3] = byte;
6979                 }
6980             }
6981             else {
6982                 if (keep_earlier < existing) {
6983                     cache[0] = utf8;
6984                     cache[1] = byte;
6985                 }
6986             }
6987         }
6988         else {
6989             /* New position is before the existing pair of pairs.  */
6990             const float keep_earlier
6991                 = THREEWAY_SQUARE(0, byte, cache[3], blen);
6992             const float keep_later
6993                 = THREEWAY_SQUARE(0, byte, cache[1], blen);
6994
6995             if (keep_later < keep_earlier) {
6996                 if (keep_later < existing) {
6997                     cache[2] = utf8;
6998                     cache[3] = byte;
6999                 }
7000             }
7001             else {
7002                 if (keep_earlier < existing) {
7003                     cache[0] = cache[2];
7004                     cache[1] = cache[3];
7005                     cache[2] = utf8;
7006                     cache[3] = byte;
7007                 }
7008             }
7009         }
7010     }
7011     ASSERT_UTF8_CACHE(cache);
7012 }
7013
7014 /* We already know all of the way, now we may be able to walk back.  The same
7015    assumption is made as in S_sv_pos_u2b_midway(), namely that walking
7016    backward is half the speed of walking forward. */
7017 static STRLEN
7018 S_sv_pos_b2u_midway(pTHX_ const U8 *const s, const U8 *const target,
7019                     const U8 *end, STRLEN endu)
7020 {
7021     const STRLEN forw = target - s;
7022     STRLEN backw = end - target;
7023
7024     PERL_ARGS_ASSERT_SV_POS_B2U_MIDWAY;
7025
7026     if (forw < 2 * backw) {
7027         return utf8_length(s, target);
7028     }
7029
7030     while (end > target) {
7031         end--;
7032         while (UTF8_IS_CONTINUATION(*end)) {
7033             end--;
7034         }
7035         endu--;
7036     }
7037     return endu;
7038 }
7039
7040 /*
7041 =for apidoc sv_pos_b2u
7042
7043 Converts the value pointed to by offsetp from a count of bytes from the
7044 start of the string, to a count of the equivalent number of UTF-8 chars.
7045 Handles magic and type coercion.
7046
7047 =cut
7048 */
7049
7050 /*
7051  * sv_pos_b2u() uses, like sv_pos_u2b(), the mg_ptr of the potential
7052  * PERL_MAGIC_utf8 of the sv to store the mapping between UTF-8 and
7053  * byte offsets.
7054  *
7055  */
7056 void
7057 Perl_sv_pos_b2u(pTHX_ register SV *const sv, I32 *const offsetp)
7058 {
7059     const U8* s;
7060     const STRLEN byte = *offsetp;
7061     STRLEN len = 0; /* Actually always set, but let's keep gcc happy.  */
7062     STRLEN blen;
7063     MAGIC* mg = NULL;
7064     const U8* send;
7065     bool found = FALSE;
7066
7067     PERL_ARGS_ASSERT_SV_POS_B2U;
7068
7069     if (!sv)
7070         return;
7071
7072     s = (const U8*)SvPV_const(sv, blen);
7073
7074     if (blen < byte)
7075         Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
7076
7077     send = s + byte;
7078
7079     if (!SvREADONLY(sv)
7080         && PL_utf8cache
7081         && SvTYPE(sv) >= SVt_PVMG
7082         && (mg = mg_find(sv, PERL_MAGIC_utf8)))
7083     {
7084         if (mg->mg_ptr) {
7085             STRLEN * const cache = (STRLEN *) mg->mg_ptr;
7086             if (cache[1] == byte) {
7087                 /* An exact match. */
7088                 *offsetp = cache[0];
7089                 return;
7090             }
7091             if (cache[3] == byte) {
7092                 /* An exact match. */
7093                 *offsetp = cache[2];
7094                 return;
7095             }
7096
7097             if (cache[1] < byte) {
7098                 /* We already know part of the way. */
7099                 if (mg->mg_len != -1) {
7100                     /* Actually, we know the end too.  */
7101                     len = cache[0]
7102                         + S_sv_pos_b2u_midway(aTHX_ s + cache[1], send,
7103                                               s + blen, mg->mg_len - cache[0]);
7104                 } else {
7105                     len = cache[0] + utf8_length(s + cache[1], send);
7106                 }
7107             }
7108             else if (cache[3] < byte) {
7109                 /* We're between the two cached pairs, so we do the calculation
7110                    offset by the byte/utf-8 positions for the earlier pair,
7111                    then add the utf-8 characters from the string start to
7112                    there.  */
7113                 len = S_sv_pos_b2u_midway(aTHX_ s + cache[3], send,
7114                                           s + cache[1], cache[0] - cache[2])
7115                     + cache[2];
7116
7117             }
7118             else { /* cache[3] > byte */
7119                 len = S_sv_pos_b2u_midway(aTHX_ s, send, s + cache[3],
7120                                           cache[2]);
7121
7122             }
7123             ASSERT_UTF8_CACHE(cache);
7124             found = TRUE;
7125         } else if (mg->mg_len != -1) {
7126             len = S_sv_pos_b2u_midway(aTHX_ s, send, s + blen, mg->mg_len);
7127             found = TRUE;
7128         }
7129     }
7130     if (!found || PL_utf8cache < 0) {
7131         const STRLEN real_len = utf8_length(s, send);
7132
7133         if (found && PL_utf8cache < 0)
7134             assert_uft8_cache_coherent("sv_pos_b2u", len, real_len, sv);
7135         len = real_len;
7136     }
7137     *offsetp = len;
7138
7139     if (PL_utf8cache) {
7140         if (blen == byte)
7141             utf8_mg_len_cache_update(sv, &mg, len);
7142         else
7143             utf8_mg_pos_cache_update(sv, &mg, byte, len, blen);
7144     }
7145 }
7146
7147 static void
7148 S_assert_uft8_cache_coherent(pTHX_ const char *const func, STRLEN from_cache,
7149                              STRLEN real, SV *const sv)
7150 {
7151     PERL_ARGS_ASSERT_ASSERT_UFT8_CACHE_COHERENT;
7152
7153     /* As this is debugging only code, save space by keeping this test here,
7154        rather than inlining it in all the callers.  */
7155     if (from_cache == real)
7156         return;
7157
7158     /* Need to turn the assertions off otherwise we may recurse infinitely
7159        while printing error messages.  */
7160     SAVEI8(PL_utf8cache);
7161     PL_utf8cache = 0;
7162     Perl_croak(aTHX_ "panic: %s cache %"UVuf" real %"UVuf" for %"SVf,
7163                func, (UV) from_cache, (UV) real, SVfARG(sv));
7164 }
7165
7166 /*
7167 =for apidoc sv_eq
7168
7169 Returns a boolean indicating whether the strings in the two SVs are
7170 identical.  Is UTF-8 and 'use bytes' aware, handles get magic, and will
7171 coerce its args to strings if necessary.
7172
7173 =for apidoc sv_eq_flags
7174
7175 Returns a boolean indicating whether the strings in the two SVs are
7176 identical.  Is UTF-8 and 'use bytes' aware and coerces its args to strings
7177 if necessary.  If the flags include SV_GMAGIC, it handles get-magic, too.
7178
7179 =cut
7180 */
7181
7182 I32
7183 Perl_sv_eq_flags(pTHX_ register SV *sv1, register SV *sv2, const U32 flags)
7184 {
7185     dVAR;
7186     const char *pv1;
7187     STRLEN cur1;
7188     const char *pv2;
7189     STRLEN cur2;
7190     I32  eq     = 0;
7191     SV* svrecode = NULL;
7192
7193     if (!sv1) {
7194         pv1 = "";
7195         cur1 = 0;
7196     }
7197     else {
7198         /* if pv1 and pv2 are the same, second SvPV_const call may
7199          * invalidate pv1 (if we are handling magic), so we may need to
7200          * make a copy */
7201         if (sv1 == sv2 && flags & SV_GMAGIC
7202          && (SvTHINKFIRST(sv1) || SvGMAGICAL(sv1))) {
7203             pv1 = SvPV_const(sv1, cur1);
7204             sv1 = newSVpvn_flags(pv1, cur1, SVs_TEMP | SvUTF8(sv2));
7205         }
7206         pv1 = SvPV_flags_const(sv1, cur1, flags);
7207     }
7208
7209     if (!sv2){
7210         pv2 = "";
7211         cur2 = 0;
7212     }
7213     else
7214         pv2 = SvPV_flags_const(sv2, cur2, flags);
7215
7216     if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
7217         /* Differing utf8ness.
7218          * Do not UTF8size the comparands as a side-effect. */
7219          if (PL_encoding) {
7220               if (SvUTF8(sv1)) {
7221                    svrecode = newSVpvn(pv2, cur2);
7222                    sv_recode_to_utf8(svrecode, PL_encoding);
7223                    pv2 = SvPV_const(svrecode, cur2);
7224               }
7225               else {
7226                    svrecode = newSVpvn(pv1, cur1);
7227                    sv_recode_to_utf8(svrecode, PL_encoding);
7228                    pv1 = SvPV_const(svrecode, cur1);
7229               }
7230               /* Now both are in UTF-8. */
7231               if (cur1 != cur2) {
7232                    SvREFCNT_dec(svrecode);
7233                    return FALSE;
7234               }
7235          }
7236          else {
7237               if (SvUTF8(sv1)) {
7238                   /* sv1 is the UTF-8 one  */
7239                   return bytes_cmp_utf8((const U8*)pv2, cur2,
7240                                         (const U8*)pv1, cur1) == 0;
7241               }
7242               else {
7243                   /* sv2 is the UTF-8 one  */
7244                   return bytes_cmp_utf8((const U8*)pv1, cur1,
7245                                         (const U8*)pv2, cur2) == 0;
7246               }
7247          }
7248     }
7249
7250     if (cur1 == cur2)
7251         eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
7252         
7253     SvREFCNT_dec(svrecode);
7254
7255     return eq;
7256 }
7257
7258 /*
7259 =for apidoc sv_cmp
7260
7261 Compares the strings in two SVs.  Returns -1, 0, or 1 indicating whether the
7262 string in C<sv1> is less than, equal to, or greater than the string in
7263 C<sv2>.  Is UTF-8 and 'use bytes' aware, handles get magic, and will
7264 coerce its args to strings if necessary.  See also C<sv_cmp_locale>.
7265
7266 =for apidoc sv_cmp_flags
7267
7268 Compares the strings in two SVs.  Returns -1, 0, or 1 indicating whether the
7269 string in C<sv1> is less than, equal to, or greater than the string in
7270 C<sv2>.  Is UTF-8 and 'use bytes' aware and will coerce its args to strings
7271 if necessary.  If the flags include SV_GMAGIC, it handles get magic.  See
7272 also C<sv_cmp_locale_flags>.
7273
7274 =cut
7275 */
7276
7277 I32
7278 Perl_sv_cmp(pTHX_ register SV *const sv1, register SV *const sv2)
7279 {
7280     return sv_cmp_flags(sv1, sv2, SV_GMAGIC);
7281 }
7282
7283 I32
7284 Perl_sv_cmp_flags(pTHX_ register SV *const sv1, register SV *const sv2,
7285                   const U32 flags)
7286 {
7287     dVAR;
7288     STRLEN cur1, cur2;
7289     const char *pv1, *pv2;
7290     char *tpv = NULL;
7291     I32  cmp;
7292     SV *svrecode = NULL;
7293
7294     if (!sv1) {
7295         pv1 = "";
7296         cur1 = 0;
7297     }
7298     else
7299         pv1 = SvPV_flags_const(sv1, cur1, flags);
7300
7301     if (!sv2) {
7302         pv2 = "";
7303         cur2 = 0;
7304     }
7305     else
7306         pv2 = SvPV_flags_const(sv2, cur2, flags);
7307
7308     if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
7309         /* Differing utf8ness.
7310          * Do not UTF8size the comparands as a side-effect. */
7311         if (SvUTF8(sv1)) {
7312             if (PL_encoding) {
7313                  svrecode = newSVpvn(pv2, cur2);
7314                  sv_recode_to_utf8(svrecode, PL_encoding);
7315                  pv2 = SvPV_const(svrecode, cur2);
7316             }
7317             else {
7318                 const int retval = -bytes_cmp_utf8((const U8*)pv2, cur2,
7319                                                    (const U8*)pv1, cur1);
7320                 return retval ? retval < 0 ? -1 : +1 : 0;
7321             }
7322         }
7323         else {
7324             if (PL_encoding) {
7325                  svrecode = newSVpvn(pv1, cur1);
7326                  sv_recode_to_utf8(svrecode, PL_encoding);
7327                  pv1 = SvPV_const(svrecode, cur1);
7328             }
7329             else {
7330                 const int retval = bytes_cmp_utf8((const U8*)pv1, cur1,
7331                                                   (const U8*)pv2, cur2);
7332                 return retval ? retval < 0 ? -1 : +1 : 0;
7333             }
7334         }
7335     }
7336
7337     if (!cur1) {
7338         cmp = cur2 ? -1 : 0;
7339     } else if (!cur2) {
7340         cmp = 1;
7341     } else {
7342         const I32 retval = memcmp((const void*)pv1, (const void*)pv2, cur1 < cur2 ? cur1 : cur2);
7343
7344         if (retval) {
7345             cmp = retval < 0 ? -1 : 1;
7346         } else if (cur1 == cur2) {
7347             cmp = 0;
7348         } else {
7349             cmp = cur1 < cur2 ? -1 : 1;
7350         }
7351     }
7352
7353     SvREFCNT_dec(svrecode);
7354     if (tpv)
7355         Safefree(tpv);
7356
7357     return cmp;
7358 }
7359
7360 /*
7361 =for apidoc sv_cmp_locale
7362
7363 Compares the strings in two SVs in a locale-aware manner.  Is UTF-8 and
7364 'use bytes' aware, handles get magic, and will coerce its args to strings
7365 if necessary.  See also C<sv_cmp>.
7366
7367 =for apidoc sv_cmp_locale_flags
7368
7369 Compares the strings in two SVs in a locale-aware manner.  Is UTF-8 and
7370 'use bytes' aware and will coerce its args to strings if necessary.  If the
7371 flags contain SV_GMAGIC, it handles get magic.  See also C<sv_cmp_flags>.
7372
7373 =cut
7374 */
7375
7376 I32
7377 Perl_sv_cmp_locale(pTHX_ register SV *const sv1, register SV *const sv2)
7378 {
7379     return sv_cmp_locale_flags(sv1, sv2, SV_GMAGIC);
7380 }
7381
7382 I32
7383 Perl_sv_cmp_locale_flags(pTHX_ register SV *const sv1, register SV *const sv2,
7384                          const U32 flags)
7385 {
7386     dVAR;
7387 #ifdef USE_LOCALE_COLLATE
7388
7389     char *pv1, *pv2;
7390     STRLEN len1, len2;
7391     I32 retval;
7392
7393     if (PL_collation_standard)
7394         goto raw_compare;
7395
7396     len1 = 0;
7397     pv1 = sv1 ? sv_collxfrm_flags(sv1, &len1, flags) : (char *) NULL;
7398     len2 = 0;
7399     pv2 = sv2 ? sv_collxfrm_flags(sv2, &len2, flags) : (char *) NULL;
7400
7401     if (!pv1 || !len1) {
7402         if (pv2 && len2)
7403             return -1;
7404         else
7405             goto raw_compare;
7406     }
7407     else {
7408         if (!pv2 || !len2)
7409             return 1;
7410     }
7411
7412     retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
7413
7414     if (retval)
7415         return retval < 0 ? -1 : 1;
7416
7417     /*
7418      * When the result of collation is equality, that doesn't mean
7419      * that there are no differences -- some locales exclude some
7420      * characters from consideration.  So to avoid false equalities,
7421      * we use the raw string as a tiebreaker.
7422      */
7423
7424   raw_compare:
7425     /*FALLTHROUGH*/
7426
7427 #endif /* USE_LOCALE_COLLATE */
7428
7429     return sv_cmp(sv1, sv2);
7430 }
7431
7432
7433 #ifdef USE_LOCALE_COLLATE
7434
7435 /*
7436 =for apidoc sv_collxfrm
7437
7438 This calls C<sv_collxfrm_flags> with the SV_GMAGIC flag.  See
7439 C<sv_collxfrm_flags>.
7440
7441 =for apidoc sv_collxfrm_flags
7442
7443 Add Collate Transform magic to an SV if it doesn't already have it.  If the
7444 flags contain SV_GMAGIC, it handles get-magic.
7445
7446 Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
7447 scalar data of the variable, but transformed to such a format that a normal
7448 memory comparison can be used to compare the data according to the locale
7449 settings.
7450
7451 =cut
7452 */
7453
7454 char *
7455 Perl_sv_collxfrm_flags(pTHX_ SV *const sv, STRLEN *const nxp, const I32 flags)
7456 {
7457     dVAR;
7458     MAGIC *mg;
7459
7460     PERL_ARGS_ASSERT_SV_COLLXFRM_FLAGS;
7461
7462     mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
7463     if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
7464         const char *s;
7465         char *xf;
7466         STRLEN len, xlen;
7467
7468         if (mg)
7469             Safefree(mg->mg_ptr);
7470         s = SvPV_flags_const(sv, len, flags);
7471         if ((xf = mem_collxfrm(s, len, &xlen))) {
7472             if (! mg) {
7473 #ifdef PERL_OLD_COPY_ON_WRITE
7474                 if (SvIsCOW(sv))
7475                     sv_force_normal_flags(sv, 0);
7476 #endif
7477                 mg = sv_magicext(sv, 0, PERL_MAGIC_collxfrm, &PL_vtbl_collxfrm,
7478                                  0, 0);
7479                 assert(mg);
7480             }
7481             mg->mg_ptr = xf;
7482             mg->mg_len = xlen;
7483         }
7484         else {
7485             if (mg) {
7486                 mg->mg_ptr = NULL;
7487                 mg->mg_len = -1;
7488             }
7489         }
7490     }
7491     if (mg && mg->mg_ptr) {
7492         *nxp = mg->mg_len;
7493         return mg->mg_ptr + sizeof(PL_collation_ix);
7494     }
7495     else {
7496         *nxp = 0;
7497         return NULL;
7498     }
7499 }
7500
7501 #endif /* USE_LOCALE_COLLATE */
7502
7503 static char *
7504 S_sv_gets_append_to_utf8(pTHX_ SV *const sv, PerlIO *const fp, I32 append)
7505 {
7506     SV * const tsv = newSV(0);
7507     ENTER;
7508     SAVEFREESV(tsv);
7509     sv_gets(tsv, fp, 0);
7510     sv_utf8_upgrade_nomg(tsv);
7511     SvCUR_set(sv,append);
7512     sv_catsv(sv,tsv);
7513     LEAVE;
7514     return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
7515 }
7516
7517 static char *
7518 S_sv_gets_read_record(pTHX_ SV *const sv, PerlIO *const fp, I32 append)
7519 {
7520     I32 bytesread;
7521     const U32 recsize = SvUV(SvRV(PL_rs)); /* RsRECORD() guarantees > 0. */
7522       /* Grab the size of the record we're getting */
7523     char *const buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append;
7524 #ifdef VMS
7525     int fd;
7526 #endif
7527
7528     /* Go yank in */
7529 #ifdef VMS
7530     /* VMS wants read instead of fread, because fread doesn't respect */
7531     /* RMS record boundaries. This is not necessarily a good thing to be */
7532     /* doing, but we've got no other real choice - except avoid stdio
7533        as implementation - perhaps write a :vms layer ?
7534     */
7535     fd = PerlIO_fileno(fp);
7536     if (fd != -1) {
7537         bytesread = PerlLIO_read(fd, buffer, recsize);
7538     }
7539     else /* in-memory file from PerlIO::Scalar */
7540 #endif
7541     {
7542         bytesread = PerlIO_read(fp, buffer, recsize);
7543     }
7544
7545     if (bytesread < 0)
7546         bytesread = 0;
7547     SvCUR_set(sv, bytesread + append);
7548     buffer[bytesread] = '\0';
7549     return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
7550 }
7551
7552 /*
7553 =for apidoc sv_gets
7554
7555 Get a line from the filehandle and store it into the SV, optionally
7556 appending to the currently-stored string.
7557
7558 =cut
7559 */
7560
7561 char *
7562 Perl_sv_gets(pTHX_ register SV *const sv, register PerlIO *const fp, I32 append)
7563 {
7564     dVAR;
7565     const char *rsptr;
7566     STRLEN rslen;
7567     register STDCHAR rslast;
7568     register STDCHAR *bp;
7569     register I32 cnt;
7570     I32 i = 0;
7571     I32 rspara = 0;
7572
7573     PERL_ARGS_ASSERT_SV_GETS;
7574
7575     if (SvTHINKFIRST(sv))
7576         sv_force_normal_flags(sv, append ? 0 : SV_COW_DROP_PV);
7577     /* XXX. If you make this PVIV, then copy on write can copy scalars read
7578        from <>.
7579        However, perlbench says it's slower, because the existing swipe code
7580        is faster than copy on write.
7581        Swings and roundabouts.  */
7582     SvUPGRADE(sv, SVt_PV);
7583
7584     SvSCREAM_off(sv);
7585
7586     if (append) {
7587         if (PerlIO_isutf8(fp)) {
7588             if (!SvUTF8(sv)) {
7589                 sv_utf8_upgrade_nomg(sv);
7590                 sv_pos_u2b(sv,&append,0);
7591             }
7592         } else if (SvUTF8(sv)) {
7593             return S_sv_gets_append_to_utf8(aTHX_ sv, fp, append);
7594         }
7595     }
7596
7597     SvPOK_only(sv);
7598     if (!append) {
7599         SvCUR_set(sv,0);
7600     }
7601     if (PerlIO_isutf8(fp))
7602         SvUTF8_on(sv);
7603
7604     if (IN_PERL_COMPILETIME) {
7605         /* we always read code in line mode */
7606         rsptr = "\n";
7607         rslen = 1;
7608     }
7609     else if (RsSNARF(PL_rs)) {
7610         /* If it is a regular disk file use size from stat() as estimate
7611            of amount we are going to read -- may result in mallocing
7612            more memory than we really need if the layers below reduce
7613            the size we read (e.g. CRLF or a gzip layer).
7614          */
7615         Stat_t st;
7616         if (!PerlLIO_fstat(PerlIO_fileno(fp), &st) && S_ISREG(st.st_mode))  {
7617             const Off_t offset = PerlIO_tell(fp);
7618             if (offset != (Off_t) -1 && st.st_size + append > offset) {
7619                 (void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 1));
7620             }
7621         }
7622         rsptr = NULL;
7623         rslen = 0;
7624     }
7625     else if (RsRECORD(PL_rs)) {
7626         return S_sv_gets_read_record(aTHX_ sv, fp, append);
7627     }
7628     else if (RsPARA(PL_rs)) {
7629         rsptr = "\n\n";
7630         rslen = 2;
7631         rspara = 1;
7632     }
7633     else {
7634         /* Get $/ i.e. PL_rs into same encoding as stream wants */
7635         if (PerlIO_isutf8(fp)) {
7636             rsptr = SvPVutf8(PL_rs, rslen);
7637         }
7638         else {
7639             if (SvUTF8(PL_rs)) {
7640                 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
7641                     Perl_croak(aTHX_ "Wide character in $/");
7642                 }
7643             }
7644             rsptr = SvPV_const(PL_rs, rslen);
7645         }
7646     }
7647
7648     rslast = rslen ? rsptr[rslen - 1] : '\0';
7649
7650     if (rspara) {               /* have to do this both before and after */
7651         do {                    /* to make sure file boundaries work right */
7652             if (PerlIO_eof(fp))
7653                 return 0;
7654             i = PerlIO_getc(fp);
7655             if (i != '\n') {
7656                 if (i == -1)
7657                     return 0;
7658                 PerlIO_ungetc(fp,i);
7659                 break;
7660             }
7661         } while (i != EOF);
7662     }
7663
7664     /* See if we know enough about I/O mechanism to cheat it ! */
7665
7666     /* This used to be #ifdef test - it is made run-time test for ease
7667        of abstracting out stdio interface. One call should be cheap
7668        enough here - and may even be a macro allowing compile
7669        time optimization.
7670      */
7671
7672     if (PerlIO_fast_gets(fp)) {
7673
7674     /*
7675      * We're going to steal some values from the stdio struct
7676      * and put EVERYTHING in the innermost loop into registers.
7677      */
7678     register STDCHAR *ptr;
7679     STRLEN bpx;
7680     I32 shortbuffered;
7681
7682 #if defined(VMS) && defined(PERLIO_IS_STDIO)
7683     /* An ungetc()d char is handled separately from the regular
7684      * buffer, so we getc() it back out and stuff it in the buffer.
7685      */
7686     i = PerlIO_getc(fp);
7687     if (i == EOF) return 0;
7688     *(--((*fp)->_ptr)) = (unsigned char) i;
7689     (*fp)->_cnt++;
7690 #endif
7691
7692     /* Here is some breathtakingly efficient cheating */
7693
7694     cnt = PerlIO_get_cnt(fp);                   /* get count into register */
7695     /* make sure we have the room */
7696     if ((I32)(SvLEN(sv) - append) <= cnt + 1) {
7697         /* Not room for all of it
7698            if we are looking for a separator and room for some
7699          */
7700         if (rslen && cnt > 80 && (I32)SvLEN(sv) > append) {
7701             /* just process what we have room for */
7702             shortbuffered = cnt - SvLEN(sv) + append + 1;
7703             cnt -= shortbuffered;
7704         }
7705         else {
7706             shortbuffered = 0;
7707             /* remember that cnt can be negative */
7708             SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
7709         }
7710     }
7711     else
7712         shortbuffered = 0;
7713     bp = (STDCHAR*)SvPVX_const(sv) + append;  /* move these two too to registers */
7714     ptr = (STDCHAR*)PerlIO_get_ptr(fp);
7715     DEBUG_P(PerlIO_printf(Perl_debug_log,
7716         "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
7717     DEBUG_P(PerlIO_printf(Perl_debug_log,
7718         "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
7719                PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
7720                PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
7721     for (;;) {
7722       screamer:
7723         if (cnt > 0) {
7724             if (rslen) {
7725                 while (cnt > 0) {                    /* this     |  eat */
7726                     cnt--;
7727                     if ((*bp++ = *ptr++) == rslast)  /* really   |  dust */
7728                         goto thats_all_folks;        /* screams  |  sed :-) */
7729                 }
7730             }
7731             else {
7732                 Copy(ptr, bp, cnt, char);            /* this     |  eat */
7733                 bp += cnt;                           /* screams  |  dust */
7734                 ptr += cnt;                          /* louder   |  sed :-) */
7735                 cnt = 0;
7736                 assert (!shortbuffered);
7737                 goto cannot_be_shortbuffered;
7738             }
7739         }
7740         
7741         if (shortbuffered) {            /* oh well, must extend */
7742             cnt = shortbuffered;
7743             shortbuffered = 0;
7744             bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
7745             SvCUR_set(sv, bpx);
7746             SvGROW(sv, SvLEN(sv) + append + cnt + 2);
7747             bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
7748             continue;
7749         }
7750
7751     cannot_be_shortbuffered:
7752         DEBUG_P(PerlIO_printf(Perl_debug_log,
7753                               "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
7754                               PTR2UV(ptr),(long)cnt));
7755         PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
7756
7757         DEBUG_Pv(PerlIO_printf(Perl_debug_log,
7758             "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
7759             PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
7760             PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
7761
7762         /* This used to call 'filbuf' in stdio form, but as that behaves like
7763            getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
7764            another abstraction.  */
7765         i   = PerlIO_getc(fp);          /* get more characters */
7766
7767         DEBUG_Pv(PerlIO_printf(Perl_debug_log,
7768             "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
7769             PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
7770             PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
7771
7772         cnt = PerlIO_get_cnt(fp);
7773         ptr = (STDCHAR*)PerlIO_get_ptr(fp);     /* reregisterize cnt and ptr */
7774         DEBUG_P(PerlIO_printf(Perl_debug_log,
7775             "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
7776
7777         if (i == EOF)                   /* all done for ever? */
7778             goto thats_really_all_folks;
7779
7780         bpx = bp - (STDCHAR*)SvPVX_const(sv);   /* box up before relocation */
7781         SvCUR_set(sv, bpx);
7782         SvGROW(sv, bpx + cnt + 2);
7783         bp = (STDCHAR*)SvPVX_const(sv) + bpx;   /* unbox after relocation */
7784
7785         *bp++ = (STDCHAR)i;             /* store character from PerlIO_getc */
7786
7787         if (rslen && (STDCHAR)i == rslast)  /* all done for now? */
7788             goto thats_all_folks;
7789     }
7790
7791 thats_all_folks:
7792     if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX_const(sv)) < rslen) ||
7793           memNE((char*)bp - rslen, rsptr, rslen))
7794         goto screamer;                          /* go back to the fray */
7795 thats_really_all_folks:
7796     if (shortbuffered)
7797         cnt += shortbuffered;
7798         DEBUG_P(PerlIO_printf(Perl_debug_log,
7799             "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
7800     PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt);  /* put these back or we're in trouble */
7801     DEBUG_P(PerlIO_printf(Perl_debug_log,
7802         "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
7803         PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
7804         PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
7805     *bp = '\0';
7806     SvCUR_set(sv, bp - (STDCHAR*)SvPVX_const(sv));      /* set length */
7807     DEBUG_P(PerlIO_printf(Perl_debug_log,
7808         "Screamer: done, len=%ld, string=|%.*s|\n",
7809         (long)SvCUR(sv),(int)SvCUR(sv),SvPVX_const(sv)));
7810     }
7811    else
7812     {
7813        /*The big, slow, and stupid way. */
7814 #ifdef USE_HEAP_INSTEAD_OF_STACK        /* Even slower way. */
7815         STDCHAR *buf = NULL;
7816         Newx(buf, 8192, STDCHAR);
7817         assert(buf);
7818 #else
7819         STDCHAR buf[8192];
7820 #endif
7821
7822 screamer2:
7823         if (rslen) {
7824             register const STDCHAR * const bpe = buf + sizeof(buf);
7825             bp = buf;
7826             while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
7827                 ; /* keep reading */
7828             cnt = bp - buf;
7829         }
7830         else {
7831             cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
7832             /* Accommodate broken VAXC compiler, which applies U8 cast to
7833              * both args of ?: operator, causing EOF to change into 255
7834              */
7835             if (cnt > 0)
7836                  i = (U8)buf[cnt - 1];
7837             else
7838                  i = EOF;
7839         }
7840
7841         if (cnt < 0)
7842             cnt = 0;  /* we do need to re-set the sv even when cnt <= 0 */
7843         if (append)
7844              sv_catpvn(sv, (char *) buf, cnt);
7845         else
7846              sv_setpvn(sv, (char *) buf, cnt);
7847
7848         if (i != EOF &&                 /* joy */
7849             (!rslen ||
7850              SvCUR(sv) < rslen ||
7851              memNE(SvPVX_const(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
7852         {
7853             append = -1;
7854             /*
7855              * If we're reading from a TTY and we get a short read,
7856              * indicating that the user hit his EOF character, we need
7857              * to notice it now, because if we try to read from the TTY
7858              * again, the EOF condition will disappear.
7859              *
7860              * The comparison of cnt to sizeof(buf) is an optimization
7861              * that prevents unnecessary calls to feof().
7862              *
7863              * - jik 9/25/96
7864              */
7865             if (!(cnt < (I32)sizeof(buf) && PerlIO_eof(fp)))
7866                 goto screamer2;
7867         }
7868
7869 #ifdef USE_HEAP_INSTEAD_OF_STACK
7870         Safefree(buf);
7871 #endif
7872     }
7873
7874     if (rspara) {               /* have to do this both before and after */
7875         while (i != EOF) {      /* to make sure file boundaries work right */
7876             i = PerlIO_getc(fp);
7877             if (i != '\n') {
7878                 PerlIO_ungetc(fp,i);
7879                 break;
7880             }
7881         }
7882     }
7883
7884     return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
7885 }
7886
7887 /*
7888 =for apidoc sv_inc
7889
7890 Auto-increment of the value in the SV, doing string to numeric conversion
7891 if necessary.  Handles 'get' magic and operator overloading.
7892
7893 =cut
7894 */
7895
7896 void
7897 Perl_sv_inc(pTHX_ register SV *const sv)
7898 {
7899     if (!sv)
7900         return;
7901     SvGETMAGIC(sv);
7902     sv_inc_nomg(sv);
7903 }
7904
7905 /*
7906 =for apidoc sv_inc_nomg
7907
7908 Auto-increment of the value in the SV, doing string to numeric conversion
7909 if necessary.  Handles operator overloading.  Skips handling 'get' magic.
7910
7911 =cut
7912 */
7913
7914 void
7915 Perl_sv_inc_nomg(pTHX_ register SV *const sv)
7916 {
7917     dVAR;
7918     register char *d;
7919     int flags;
7920
7921     if (!sv)
7922         return;
7923     if (SvTHINKFIRST(sv)) {
7924         if (SvIsCOW(sv) || isGV_with_GP(sv))
7925             sv_force_normal_flags(sv, 0);
7926         if (SvREADONLY(sv)) {
7927             if (IN_PERL_RUNTIME)
7928                 Perl_croak_no_modify(aTHX);
7929         }
7930         if (SvROK(sv)) {
7931             IV i;
7932             if (SvAMAGIC(sv) && AMG_CALLunary(sv, inc_amg))
7933                 return;
7934             i = PTR2IV(SvRV(sv));
7935             sv_unref(sv);
7936             sv_setiv(sv, i);
7937         }
7938     }
7939     flags = SvFLAGS(sv);
7940     if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
7941         /* It's (privately or publicly) a float, but not tested as an
7942            integer, so test it to see. */
7943         (void) SvIV(sv);
7944         flags = SvFLAGS(sv);
7945     }
7946     if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
7947         /* It's publicly an integer, or privately an integer-not-float */
7948 #ifdef PERL_PRESERVE_IVUV
7949       oops_its_int:
7950 #endif
7951         if (SvIsUV(sv)) {
7952             if (SvUVX(sv) == UV_MAX)
7953                 sv_setnv(sv, UV_MAX_P1);
7954             else
7955                 (void)SvIOK_only_UV(sv);
7956                 SvUV_set(sv, SvUVX(sv) + 1);
7957         } else {
7958             if (SvIVX(sv) == IV_MAX)
7959                 sv_setuv(sv, (UV)IV_MAX + 1);
7960             else {
7961                 (void)SvIOK_only(sv);
7962                 SvIV_set(sv, SvIVX(sv) + 1);
7963             }   
7964         }
7965         return;
7966     }
7967     if (flags & SVp_NOK) {
7968         const NV was = SvNVX(sv);
7969         if (NV_OVERFLOWS_INTEGERS_AT &&
7970             was >= NV_OVERFLOWS_INTEGERS_AT) {
7971             /* diag_listed_as: Lost precision when %s %f by 1 */
7972             Perl_ck_warner(aTHX_ packWARN(WARN_IMPRECISION),
7973                            "Lost precision when incrementing %" NVff " by 1",
7974                            was);
7975         }
7976         (void)SvNOK_only(sv);
7977         SvNV_set(sv, was + 1.0);
7978         return;
7979     }
7980
7981     if (!(flags & SVp_POK) || !*SvPVX_const(sv)) {
7982         if ((flags & SVTYPEMASK) < SVt_PVIV)
7983             sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV ? SVt_PVIV : SVt_IV));
7984         (void)SvIOK_only(sv);
7985         SvIV_set(sv, 1);
7986         return;
7987     }
7988     d = SvPVX(sv);
7989     while (isALPHA(*d)) d++;
7990     while (isDIGIT(*d)) d++;
7991     if (d < SvEND(sv)) {
7992 #ifdef PERL_PRESERVE_IVUV
7993         /* Got to punt this as an integer if needs be, but we don't issue
7994            warnings. Probably ought to make the sv_iv_please() that does
7995            the conversion if possible, and silently.  */
7996         const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
7997         if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
7998             /* Need to try really hard to see if it's an integer.
7999                9.22337203685478e+18 is an integer.
8000                but "9.22337203685478e+18" + 0 is UV=9223372036854779904
8001                so $a="9.22337203685478e+18"; $a+0; $a++
8002                needs to be the same as $a="9.22337203685478e+18"; $a++
8003                or we go insane. */
8004         
8005             (void) sv_2iv(sv);
8006             if (SvIOK(sv))
8007                 goto oops_its_int;
8008
8009             /* sv_2iv *should* have made this an NV */
8010             if (flags & SVp_NOK) {
8011                 (void)SvNOK_only(sv);
8012                 SvNV_set(sv, SvNVX(sv) + 1.0);
8013                 return;
8014             }
8015             /* I don't think we can get here. Maybe I should assert this
8016                And if we do get here I suspect that sv_setnv will croak. NWC
8017                Fall through. */
8018 #if defined(USE_LONG_DOUBLE)
8019             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",
8020                                   SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
8021 #else
8022             DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_inc punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"NVgf"\n",
8023                                   SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
8024 #endif
8025         }
8026 #endif /* PERL_PRESERVE_IVUV */
8027         sv_setnv(sv,Atof(SvPVX_const(sv)) + 1.0);
8028         return;
8029     }
8030     d--;
8031     while (d >= SvPVX_const(sv)) {
8032         if (isDIGIT(*d)) {
8033             if (++*d <= '9')
8034                 return;
8035             *(d--) = '0';
8036         }
8037         else {
8038 #ifdef EBCDIC
8039             /* MKS: The original code here died if letters weren't consecutive.
8040              * at least it didn't have to worry about non-C locales.  The
8041              * new code assumes that ('z'-'a')==('Z'-'A'), letters are
8042              * arranged in order (although not consecutively) and that only
8043              * [A-Za-z] are accepted by isALPHA in the C locale.
8044              */
8045             if (*d != 'z' && *d != 'Z') {
8046                 do { ++*d; } while (!isALPHA(*d));
8047                 return;
8048             }
8049             *(d--) -= 'z' - 'a';
8050 #else
8051             ++*d;
8052             if (isALPHA(*d))
8053                 return;
8054             *(d--) -= 'z' - 'a' + 1;
8055 #endif
8056         }
8057     }
8058     /* oh,oh, the number grew */
8059     SvGROW(sv, SvCUR(sv) + 2);
8060     SvCUR_set(sv, SvCUR(sv) + 1);
8061     for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX_const(sv); d--)
8062         *d = d[-1];
8063     if (isDIGIT(d[1]))
8064         *d = '1';
8065     else
8066         *d = d[1];
8067 }
8068
8069 /*
8070 =for apidoc sv_dec
8071
8072 Auto-decrement of the value in the SV, doing string to numeric conversion
8073 if necessary.  Handles 'get' magic and operator overloading.
8074
8075 =cut
8076 */
8077
8078 void
8079 Perl_sv_dec(pTHX_ register SV *const sv)
8080 {
8081     dVAR;
8082     if (!sv)
8083         return;
8084     SvGETMAGIC(sv);
8085     sv_dec_nomg(sv);
8086 }
8087
8088 /*
8089 =for apidoc sv_dec_nomg
8090
8091 Auto-decrement of the value in the SV, doing string to numeric conversion
8092 if necessary.  Handles operator overloading.  Skips handling 'get' magic.
8093
8094 =cut
8095 */
8096
8097 void
8098 Perl_sv_dec_nomg(pTHX_ register SV *const sv)
8099 {
8100     dVAR;
8101     int flags;
8102
8103     if (!sv)
8104         return;
8105     if (SvTHINKFIRST(sv)) {
8106         if (SvIsCOW(sv) || isGV_with_GP(sv))
8107             sv_force_normal_flags(sv, 0);
8108         if (SvREADONLY(sv)) {
8109             if (IN_PERL_RUNTIME)
8110                 Perl_croak_no_modify(aTHX);
8111         }
8112         if (SvROK(sv)) {
8113             IV i;
8114             if (SvAMAGIC(sv) && AMG_CALLunary(sv, dec_amg))
8115                 return;
8116             i = PTR2IV(SvRV(sv));
8117             sv_unref(sv);
8118             sv_setiv(sv, i);
8119         }
8120     }
8121     /* Unlike sv_inc we don't have to worry about string-never-numbers
8122        and keeping them magic. But we mustn't warn on punting */
8123     flags = SvFLAGS(sv);
8124     if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
8125         /* It's publicly an integer, or privately an integer-not-float */
8126 #ifdef PERL_PRESERVE_IVUV
8127       oops_its_int:
8128 #endif
8129         if (SvIsUV(sv)) {
8130             if (SvUVX(sv) == 0) {
8131                 (void)SvIOK_only(sv);
8132                 SvIV_set(sv, -1);
8133             }
8134             else {
8135                 (void)SvIOK_only_UV(sv);
8136                 SvUV_set(sv, SvUVX(sv) - 1);
8137             }   
8138         } else {
8139             if (SvIVX(sv) == IV_MIN) {
8140                 sv_setnv(sv, (NV)IV_MIN);
8141                 goto oops_its_num;
8142             }
8143             else {
8144                 (void)SvIOK_only(sv);
8145                 SvIV_set(sv, SvIVX(sv) - 1);
8146             }   
8147         }
8148         return;
8149     }
8150     if (flags & SVp_NOK) {
8151     oops_its_num:
8152         {
8153             const NV was = SvNVX(sv);
8154             if (NV_OVERFLOWS_INTEGERS_AT &&
8155                 was <= -NV_OVERFLOWS_INTEGERS_AT) {
8156                 /* diag_listed_as: Lost precision when %s %f by 1 */
8157                 Perl_ck_warner(aTHX_ packWARN(WARN_IMPRECISION),
8158                                "Lost precision when decrementing %" NVff " by 1",
8159                                was);
8160             }
8161             (void)SvNOK_only(sv);
8162             SvNV_set(sv, was - 1.0);
8163             return;
8164         }
8165     }
8166     if (!(flags & SVp_POK)) {
8167         if ((flags & SVTYPEMASK) < SVt_PVIV)
8168             sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV) ? SVt_PVIV : SVt_IV);
8169         SvIV_set(sv, -1);
8170         (void)SvIOK_only(sv);
8171         return;
8172     }
8173 #ifdef PERL_PRESERVE_IVUV
8174     {
8175         const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
8176         if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
8177             /* Need to try really hard to see if it's an integer.
8178                9.22337203685478e+18 is an integer.
8179                but "9.22337203685478e+18" + 0 is UV=9223372036854779904
8180                so $a="9.22337203685478e+18"; $a+0; $a--
8181                needs to be the same as $a="9.22337203685478e+18"; $a--
8182                or we go insane. */
8183         
8184             (void) sv_2iv(sv);
8185             if (SvIOK(sv))
8186                 goto oops_its_int;
8187
8188             /* sv_2iv *should* have made this an NV */
8189             if (flags & SVp_NOK) {
8190                 (void)SvNOK_only(sv);
8191                 SvNV_set(sv, SvNVX(sv) - 1.0);
8192                 return;
8193             }
8194             /* I don't think we can get here. Maybe I should assert this
8195                And if we do get here I suspect that sv_setnv will croak. NWC
8196                Fall through. */
8197 #if defined(USE_LONG_DOUBLE)
8198             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",
8199                                   SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
8200 #else
8201             DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_dec punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"NVgf"\n",
8202                                   SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
8203 #endif
8204         }
8205     }
8206 #endif /* PERL_PRESERVE_IVUV */
8207     sv_setnv(sv,Atof(SvPVX_const(sv)) - 1.0);   /* punt */
8208 }
8209
8210 /* this define is used to eliminate a chunk of duplicated but shared logic
8211  * it has the suffix __SV_C to signal that it isnt API, and isnt meant to be
8212  * used anywhere but here - yves
8213  */
8214 #define PUSH_EXTEND_MORTAL__SV_C(AnSv) \
8215     STMT_START {      \
8216         EXTEND_MORTAL(1); \
8217         PL_tmps_stack[++PL_tmps_ix] = (AnSv); \
8218     } STMT_END
8219
8220 /*
8221 =for apidoc sv_mortalcopy
8222
8223 Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
8224 The new SV is marked as mortal.  It will be destroyed "soon", either by an
8225 explicit call to FREETMPS, or by an implicit call at places such as
8226 statement boundaries.  See also C<sv_newmortal> and C<sv_2mortal>.
8227
8228 =cut
8229 */
8230
8231 /* Make a string that will exist for the duration of the expression
8232  * evaluation.  Actually, it may have to last longer than that, but
8233  * hopefully we won't free it until it has been assigned to a
8234  * permanent location. */
8235
8236 SV *
8237 Perl_sv_mortalcopy(pTHX_ SV *const oldstr)
8238 {
8239     dVAR;
8240     register SV *sv;
8241
8242     new_SV(sv);
8243     sv_setsv(sv,oldstr);
8244     PUSH_EXTEND_MORTAL__SV_C(sv);
8245     SvTEMP_on(sv);
8246     return sv;
8247 }
8248
8249 /*
8250 =for apidoc sv_newmortal
8251
8252 Creates a new null SV which is mortal.  The reference count of the SV is
8253 set to 1.  It will be destroyed "soon", either by an explicit call to
8254 FREETMPS, or by an implicit call at places such as statement boundaries.
8255 See also C<sv_mortalcopy> and C<sv_2mortal>.
8256
8257 =cut
8258 */
8259
8260 SV *
8261 Perl_sv_newmortal(pTHX)
8262 {
8263     dVAR;
8264     register SV *sv;
8265
8266     new_SV(sv);
8267     SvFLAGS(sv) = SVs_TEMP;
8268     PUSH_EXTEND_MORTAL__SV_C(sv);
8269     return sv;
8270 }
8271
8272
8273 /*
8274 =for apidoc newSVpvn_flags
8275
8276 Creates a new SV and copies a string into it.  The reference count for the
8277 SV is set to 1.  Note that if C<len> is zero, Perl will create a zero length
8278 string.  You are responsible for ensuring that the source string is at least
8279 C<len> bytes long.  If the C<s> argument is NULL the new SV will be undefined.
8280 Currently the only flag bits accepted are C<SVf_UTF8> and C<SVs_TEMP>.
8281 If C<SVs_TEMP> is set, then C<sv_2mortal()> is called on the result before
8282 returning.  If C<SVf_UTF8> is set, C<s>
8283 is considered to be in UTF-8 and the
8284 C<SVf_UTF8> flag will be set on the new SV.
8285 C<newSVpvn_utf8()> is a convenience wrapper for this function, defined as
8286
8287     #define newSVpvn_utf8(s, len, u)                    \
8288         newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0)
8289
8290 =cut
8291 */
8292
8293 SV *
8294 Perl_newSVpvn_flags(pTHX_ const char *const s, const STRLEN len, const U32 flags)
8295 {
8296     dVAR;
8297     register SV *sv;
8298
8299     /* All the flags we don't support must be zero.
8300        And we're new code so I'm going to assert this from the start.  */
8301     assert(!(flags & ~(SVf_UTF8|SVs_TEMP)));
8302     new_SV(sv);
8303     sv_setpvn(sv,s,len);
8304
8305     /* This code used to a sv_2mortal(), however we now unroll the call to sv_2mortal()
8306      * and do what it does ourselves here.
8307      * Since we have asserted that flags can only have the SVf_UTF8 and/or SVs_TEMP flags
8308      * set above we can use it to enable the sv flags directly (bypassing SvTEMP_on), which
8309      * in turn means we dont need to mask out the SVf_UTF8 flag below, which means that we
8310      * eliminate quite a few steps than it looks - Yves (explaining patch by gfx)
8311      */
8312
8313     SvFLAGS(sv) |= flags;
8314
8315     if(flags & SVs_TEMP){
8316         PUSH_EXTEND_MORTAL__SV_C(sv);
8317     }
8318
8319     return sv;
8320 }
8321
8322 /*
8323 =for apidoc sv_2mortal
8324
8325 Marks an existing SV as mortal.  The SV will be destroyed "soon", either
8326 by an explicit call to FREETMPS, or by an implicit call at places such as
8327 statement boundaries.  SvTEMP() is turned on which means that the SV's
8328 string buffer can be "stolen" if this SV is copied.  See also C<sv_newmortal>
8329 and C<sv_mortalcopy>.
8330
8331 =cut
8332 */
8333
8334 SV *
8335 Perl_sv_2mortal(pTHX_ register SV *const sv)
8336 {
8337     dVAR;
8338     if (!sv)
8339         return NULL;
8340     if (SvREADONLY(sv) && SvIMMORTAL(sv))
8341         return sv;
8342     PUSH_EXTEND_MORTAL__SV_C(sv);
8343     SvTEMP_on(sv);
8344     return sv;
8345 }
8346
8347 /*
8348 =for apidoc newSVpv
8349
8350 Creates a new SV and copies a string into it.  The reference count for the
8351 SV is set to 1.  If C<len> is zero, Perl will compute the length using
8352 strlen().  For efficiency, consider using C<newSVpvn> instead.
8353
8354 =cut
8355 */
8356
8357 SV *
8358 Perl_newSVpv(pTHX_ const char *const s, const STRLEN len)
8359 {
8360     dVAR;
8361     register SV *sv;
8362
8363     new_SV(sv);
8364     sv_setpvn(sv, s, len || s == NULL ? len : strlen(s));
8365     return sv;
8366 }
8367
8368 /*
8369 =for apidoc newSVpvn
8370
8371 Creates a new SV and copies a string into it.  The reference count for the
8372 SV is set to 1.  Note that if C<len> is zero, Perl will create a zero length
8373 string.  You are responsible for ensuring that the source string is at least
8374 C<len> bytes long.  If the C<s> argument is NULL the new SV will be undefined.
8375
8376 =cut
8377 */
8378
8379 SV *
8380 Perl_newSVpvn(pTHX_ const char *const s, const STRLEN len)
8381 {
8382     dVAR;
8383     register SV *sv;
8384
8385     new_SV(sv);
8386     sv_setpvn(sv,s,len);
8387     return sv;
8388 }
8389
8390 /*
8391 =for apidoc newSVhek
8392
8393 Creates a new SV from the hash key structure.  It will generate scalars that
8394 point to the shared string table where possible.  Returns a new (undefined)
8395 SV if the hek is NULL.
8396
8397 =cut
8398 */
8399
8400 SV *
8401 Perl_newSVhek(pTHX_ const HEK *const hek)
8402 {
8403     dVAR;
8404     if (!hek) {
8405         SV *sv;
8406
8407         new_SV(sv);
8408         return sv;
8409     }
8410
8411     if (HEK_LEN(hek) == HEf_SVKEY) {
8412         return newSVsv(*(SV**)HEK_KEY(hek));
8413     } else {
8414         const int flags = HEK_FLAGS(hek);
8415         if (flags & HVhek_WASUTF8) {
8416             /* Trouble :-)
8417                Andreas would like keys he put in as utf8 to come back as utf8
8418             */
8419             STRLEN utf8_len = HEK_LEN(hek);
8420             SV * const sv = newSV_type(SVt_PV);
8421             char *as_utf8 = (char *)bytes_to_utf8 ((U8*)HEK_KEY(hek), &utf8_len);
8422             /* bytes_to_utf8() allocates a new string, which we can repurpose: */
8423             sv_usepvn_flags(sv, as_utf8, utf8_len, SV_HAS_TRAILING_NUL);
8424             SvUTF8_on (sv);
8425             return sv;
8426         } else if (flags & (HVhek_REHASH|HVhek_UNSHARED)) {
8427             /* We don't have a pointer to the hv, so we have to replicate the
8428                flag into every HEK. This hv is using custom a hasing
8429                algorithm. Hence we can't return a shared string scalar, as
8430                that would contain the (wrong) hash value, and might get passed
8431                into an hv routine with a regular hash.
8432                Similarly, a hash that isn't using shared hash keys has to have
8433                the flag in every key so that we know not to try to call
8434                share_hek_hek on it.  */
8435
8436             SV * const sv = newSVpvn (HEK_KEY(hek), HEK_LEN(hek));
8437             if (HEK_UTF8(hek))
8438                 SvUTF8_on (sv);
8439             return sv;
8440         }
8441         /* This will be overwhelminly the most common case.  */
8442         {
8443             /* Inline most of newSVpvn_share(), because share_hek_hek() is far
8444                more efficient than sharepvn().  */
8445             SV *sv;
8446
8447             new_SV(sv);
8448             sv_upgrade(sv, SVt_PV);
8449             SvPV_set(sv, (char *)HEK_KEY(share_hek_hek(hek)));
8450             SvCUR_set(sv, HEK_LEN(hek));
8451             SvLEN_set(sv, 0);
8452             SvREADONLY_on(sv);
8453             SvFAKE_on(sv);
8454             SvPOK_on(sv);
8455             if (HEK_UTF8(hek))
8456                 SvUTF8_on(sv);
8457             return sv;
8458         }
8459     }
8460 }
8461
8462 /*
8463 =for apidoc newSVpvn_share
8464
8465 Creates a new SV with its SvPVX_const pointing to a shared string in the string
8466 table.  If the string does not already exist in the table, it is
8467 created first.  Turns on READONLY and FAKE.  If the C<hash> parameter
8468 is non-zero, that value is used; otherwise the hash is computed.
8469 The string's hash can later be retrieved from the SV
8470 with the C<SvSHARED_HASH()> macro.  The idea here is
8471 that as the string table is used for shared hash keys these strings will have
8472 SvPVX_const == HeKEY and hash lookup will avoid string compare.
8473
8474 =cut
8475 */
8476
8477 SV *
8478 Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
8479 {
8480     dVAR;
8481     register SV *sv;
8482     bool is_utf8 = FALSE;
8483     const char *const orig_src = src;
8484
8485     if (len < 0) {
8486         STRLEN tmplen = -len;
8487         is_utf8 = TRUE;
8488         /* See the note in hv.c:hv_fetch() --jhi */
8489         src = (char*)bytes_from_utf8((const U8*)src, &tmplen, &is_utf8);
8490         len = tmplen;
8491     }
8492     if (!hash)
8493         PERL_HASH(hash, src, len);
8494     new_SV(sv);
8495     /* The logic for this is inlined in S_mro_get_linear_isa_dfs(), so if it
8496        changes here, update it there too.  */
8497     sv_upgrade(sv, SVt_PV);
8498     SvPV_set(sv, sharepvn(src, is_utf8?-len:len, hash));
8499     SvCUR_set(sv, len);
8500     SvLEN_set(sv, 0);
8501     SvREADONLY_on(sv);
8502     SvFAKE_on(sv);
8503     SvPOK_on(sv);
8504     if (is_utf8)
8505         SvUTF8_on(sv);
8506     if (src != orig_src)
8507         Safefree(src);
8508     return sv;
8509 }
8510
8511 /*
8512 =for apidoc newSVpv_share
8513
8514 Like C<newSVpvn_share>, but takes a nul-terminated string instead of a
8515 string/length pair.
8516
8517 =cut
8518 */
8519
8520 SV *
8521 Perl_newSVpv_share(pTHX_ const char *src, U32 hash)
8522 {
8523     return newSVpvn_share(src, strlen(src), hash);
8524 }
8525
8526 #if defined(PERL_IMPLICIT_CONTEXT)
8527
8528 /* pTHX_ magic can't cope with varargs, so this is a no-context
8529  * version of the main function, (which may itself be aliased to us).
8530  * Don't access this version directly.
8531  */
8532
8533 SV *
8534 Perl_newSVpvf_nocontext(const char *const pat, ...)
8535 {
8536     dTHX;
8537     register SV *sv;
8538     va_list args;
8539
8540     PERL_ARGS_ASSERT_NEWSVPVF_NOCONTEXT;
8541
8542     va_start(args, pat);
8543     sv = vnewSVpvf(pat, &args);
8544     va_end(args);
8545     return sv;
8546 }
8547 #endif
8548
8549 /*
8550 =for apidoc newSVpvf
8551
8552 Creates a new SV and initializes it with the string formatted like
8553 C<sprintf>.
8554
8555 =cut
8556 */
8557
8558 SV *
8559 Perl_newSVpvf(pTHX_ const char *const pat, ...)
8560 {
8561     register SV *sv;
8562     va_list args;
8563
8564     PERL_ARGS_ASSERT_NEWSVPVF;
8565
8566     va_start(args, pat);
8567     sv = vnewSVpvf(pat, &args);
8568     va_end(args);
8569     return sv;
8570 }
8571
8572 /* backend for newSVpvf() and newSVpvf_nocontext() */
8573
8574 SV *
8575 Perl_vnewSVpvf(pTHX_ const char *const pat, va_list *const args)
8576 {
8577     dVAR;
8578     register SV *sv;
8579
8580     PERL_ARGS_ASSERT_VNEWSVPVF;
8581
8582     new_SV(sv);
8583     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
8584     return sv;
8585 }
8586
8587 /*
8588 =for apidoc newSVnv
8589
8590 Creates a new SV and copies a floating point value into it.
8591 The reference count for the SV is set to 1.
8592
8593 =cut
8594 */
8595
8596 SV *
8597 Perl_newSVnv(pTHX_ const NV n)
8598 {
8599     dVAR;
8600     register SV *sv;
8601
8602     new_SV(sv);
8603     sv_setnv(sv,n);
8604     return sv;
8605 }
8606
8607 /*
8608 =for apidoc newSViv
8609
8610 Creates a new SV and copies an integer into it.  The reference count for the
8611 SV is set to 1.
8612
8613 =cut
8614 */
8615
8616 SV *
8617 Perl_newSViv(pTHX_ const IV i)
8618 {
8619     dVAR;
8620     register SV *sv;
8621
8622     new_SV(sv);
8623     sv_setiv(sv,i);
8624     return sv;
8625 }
8626
8627 /*
8628 =for apidoc newSVuv
8629
8630 Creates a new SV and copies an unsigned integer into it.
8631 The reference count for the SV is set to 1.
8632
8633 =cut
8634 */
8635
8636 SV *
8637 Perl_newSVuv(pTHX_ const UV u)
8638 {
8639     dVAR;
8640     register SV *sv;
8641
8642     new_SV(sv);
8643     sv_setuv(sv,u);
8644     return sv;
8645 }
8646
8647 /*
8648 =for apidoc newSV_type
8649
8650 Creates a new SV, of the type specified.  The reference count for the new SV
8651 is set to 1.
8652
8653 =cut
8654 */
8655
8656 SV *
8657 Perl_newSV_type(pTHX_ const svtype type)
8658 {
8659     register SV *sv;
8660
8661     new_SV(sv);
8662     sv_upgrade(sv, type);
8663     return sv;
8664 }
8665
8666 /*
8667 =for apidoc newRV_noinc
8668
8669 Creates an RV wrapper for an SV.  The reference count for the original
8670 SV is B<not> incremented.
8671
8672 =cut
8673 */
8674
8675 SV *
8676 Perl_newRV_noinc(pTHX_ SV *const tmpRef)
8677 {
8678     dVAR;
8679     register SV *sv = newSV_type(SVt_IV);
8680
8681     PERL_ARGS_ASSERT_NEWRV_NOINC;
8682
8683     SvTEMP_off(tmpRef);
8684     SvRV_set(sv, tmpRef);
8685     SvROK_on(sv);
8686     return sv;
8687 }
8688
8689 /* newRV_inc is the official function name to use now.
8690  * newRV_inc is in fact #defined to newRV in sv.h
8691  */
8692
8693 SV *
8694 Perl_newRV(pTHX_ SV *const sv)
8695 {
8696     dVAR;
8697
8698     PERL_ARGS_ASSERT_NEWRV;
8699
8700     return newRV_noinc(SvREFCNT_inc_simple_NN(sv));
8701 }
8702
8703 /*
8704 =for apidoc newSVsv
8705
8706 Creates a new SV which is an exact duplicate of the original SV.
8707 (Uses C<sv_setsv>.)
8708
8709 =cut
8710 */
8711
8712 SV *
8713 Perl_newSVsv(pTHX_ register SV *const old)
8714 {
8715     dVAR;
8716     register SV *sv;
8717
8718     if (!old)
8719         return NULL;
8720     if (SvTYPE(old) == (svtype)SVTYPEMASK) {
8721         Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
8722         return NULL;
8723     }
8724     new_SV(sv);
8725     /* SV_GMAGIC is the default for sv_setv()
8726        SV_NOSTEAL prevents TEMP buffers being, well, stolen, and saves games
8727        with SvTEMP_off and SvTEMP_on round a call to sv_setsv.  */
8728     sv_setsv_flags(sv, old, SV_GMAGIC | SV_NOSTEAL);
8729     return sv;
8730 }
8731
8732 /*
8733 =for apidoc sv_reset
8734
8735 Underlying implementation for the C<reset> Perl function.
8736 Note that the perl-level function is vaguely deprecated.
8737
8738 =cut
8739 */
8740
8741 void
8742 Perl_sv_reset(pTHX_ register const char *s, HV *const stash)
8743 {
8744     dVAR;
8745     char todo[PERL_UCHAR_MAX+1];
8746
8747     PERL_ARGS_ASSERT_SV_RESET;
8748
8749     if (!stash)
8750         return;
8751
8752     if (!*s) {          /* reset ?? searches */
8753         MAGIC * const mg = mg_find((const SV *)stash, PERL_MAGIC_symtab);
8754         if (mg) {
8755             const U32 count = mg->mg_len / sizeof(PMOP**);
8756             PMOP **pmp = (PMOP**) mg->mg_ptr;
8757             PMOP *const *const end = pmp + count;
8758
8759             while (pmp < end) {
8760 #ifdef USE_ITHREADS
8761                 SvREADONLY_off(PL_regex_pad[(*pmp)->op_pmoffset]);
8762 #else
8763                 (*pmp)->op_pmflags &= ~PMf_USED;
8764 #endif
8765                 ++pmp;
8766             }
8767         }
8768         return;
8769     }
8770
8771     /* reset variables */
8772
8773     if (!HvARRAY(stash))
8774         return;
8775
8776     Zero(todo, 256, char);
8777     while (*s) {
8778         I32 max;
8779         I32 i = (unsigned char)*s;
8780         if (s[1] == '-') {
8781             s += 2;
8782         }
8783         max = (unsigned char)*s++;
8784         for ( ; i <= max; i++) {
8785             todo[i] = 1;
8786         }
8787         for (i = 0; i <= (I32) HvMAX(stash); i++) {
8788             HE *entry;
8789             for (entry = HvARRAY(stash)[i];
8790                  entry;
8791                  entry = HeNEXT(entry))
8792             {
8793                 register GV *gv;
8794                 register SV *sv;
8795
8796                 if (!todo[(U8)*HeKEY(entry)])
8797                     continue;
8798                 gv = MUTABLE_GV(HeVAL(entry));
8799                 sv = GvSV(gv);
8800                 if (sv) {
8801                     if (SvTHINKFIRST(sv)) {
8802                         if (!SvREADONLY(sv) && SvROK(sv))
8803                             sv_unref(sv);
8804                         /* XXX Is this continue a bug? Why should THINKFIRST
8805                            exempt us from resetting arrays and hashes?  */
8806                         continue;
8807                     }
8808                     SvOK_off(sv);
8809                     if (SvTYPE(sv) >= SVt_PV) {
8810                         SvCUR_set(sv, 0);
8811                         if (SvPVX_const(sv) != NULL)
8812                             *SvPVX(sv) = '\0';
8813                         SvTAINT(sv);
8814                     }
8815                 }
8816                 if (GvAV(gv)) {
8817                     av_clear(GvAV(gv));
8818                 }
8819                 if (GvHV(gv) && !HvNAME_get(GvHV(gv))) {
8820 #if defined(VMS)
8821                     Perl_die(aTHX_ "Can't reset %%ENV on this system");
8822 #else /* ! VMS */
8823                     hv_clear(GvHV(gv));
8824 #  if defined(USE_ENVIRON_ARRAY)
8825                     if (gv == PL_envgv)
8826                         my_clearenv();
8827 #  endif /* USE_ENVIRON_ARRAY */
8828 #endif /* VMS */
8829                 }
8830             }
8831         }
8832     }
8833 }
8834
8835 /*
8836 =for apidoc sv_2io
8837
8838 Using various gambits, try to get an IO from an SV: the IO slot if its a
8839 GV; or the recursive result if we're an RV; or the IO slot of the symbol
8840 named after the PV if we're a string.
8841
8842 'Get' magic is ignored on the sv passed in, but will be called on
8843 C<SvRV(sv)> if sv is an RV.
8844
8845 =cut
8846 */
8847
8848 IO*
8849 Perl_sv_2io(pTHX_ SV *const sv)
8850 {
8851     IO* io;
8852     GV* gv;
8853
8854     PERL_ARGS_ASSERT_SV_2IO;
8855
8856     switch (SvTYPE(sv)) {
8857     case SVt_PVIO:
8858         io = MUTABLE_IO(sv);
8859         break;
8860     case SVt_PVGV:
8861     case SVt_PVLV:
8862         if (isGV_with_GP(sv)) {
8863             gv = MUTABLE_GV(sv);
8864             io = GvIO(gv);
8865             if (!io)
8866                 Perl_croak(aTHX_ "Bad filehandle: %"HEKf,
8867                                     HEKfARG(GvNAME_HEK(gv)));
8868             break;
8869         }
8870         /* FALL THROUGH */
8871     default:
8872         if (!SvOK(sv))
8873             Perl_croak(aTHX_ PL_no_usym, "filehandle");
8874         if (SvROK(sv)) {
8875             SvGETMAGIC(SvRV(sv));
8876             return sv_2io(SvRV(sv));
8877         }
8878         gv = gv_fetchsv_nomg(sv, 0, SVt_PVIO);
8879         if (gv)
8880             io = GvIO(gv);
8881         else
8882             io = 0;
8883         if (!io) {
8884             SV *newsv = sv;
8885             if (SvGMAGICAL(sv)) {
8886                 newsv = sv_newmortal();
8887                 sv_setsv_nomg(newsv, sv);
8888             }
8889             Perl_croak(aTHX_ "Bad filehandle: %"SVf, SVfARG(newsv));
8890         }
8891         break;
8892     }
8893     return io;
8894 }
8895
8896 /*
8897 =for apidoc sv_2cv
8898
8899 Using various gambits, try to get a CV from an SV; in addition, try if
8900 possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
8901 The flags in C<lref> are passed to gv_fetchsv.
8902
8903 =cut
8904 */
8905
8906 CV *
8907 Perl_sv_2cv(pTHX_ SV *sv, HV **const st, GV **const gvp, const I32 lref)
8908 {
8909     dVAR;
8910     GV *gv = NULL;
8911     CV *cv = NULL;
8912
8913     PERL_ARGS_ASSERT_SV_2CV;
8914
8915     if (!sv) {
8916         *st = NULL;
8917         *gvp = NULL;
8918         return NULL;
8919     }
8920     switch (SvTYPE(sv)) {
8921     case SVt_PVCV:
8922         *st = CvSTASH(sv);
8923         *gvp = NULL;
8924         return MUTABLE_CV(sv);
8925     case SVt_PVHV:
8926     case SVt_PVAV:
8927         *st = NULL;
8928         *gvp = NULL;
8929         return NULL;
8930     default:
8931         SvGETMAGIC(sv);
8932         if (SvROK(sv)) {
8933             if (SvAMAGIC(sv))
8934                 sv = amagic_deref_call(sv, to_cv_amg);
8935
8936             sv = SvRV(sv);
8937             if (SvTYPE(sv) == SVt_PVCV) {
8938                 cv = MUTABLE_CV(sv);
8939                 *gvp = NULL;
8940                 *st = CvSTASH(cv);
8941                 return cv;
8942             }
8943             else if(SvGETMAGIC(sv), isGV_with_GP(sv))
8944                 gv = MUTABLE_GV(sv);
8945             else
8946                 Perl_croak(aTHX_ "Not a subroutine reference");
8947         }
8948         else if (isGV_with_GP(sv)) {
8949             gv = MUTABLE_GV(sv);
8950         }
8951         else {
8952             gv = gv_fetchsv_nomg(sv, lref, SVt_PVCV);
8953         }
8954         *gvp = gv;
8955         if (!gv) {
8956             *st = NULL;
8957             return NULL;
8958         }
8959         /* Some flags to gv_fetchsv mean don't really create the GV  */
8960         if (!isGV_with_GP(gv)) {
8961             *st = NULL;
8962             return NULL;
8963         }
8964         *st = GvESTASH(gv);
8965         if (lref & ~GV_ADDMG && !GvCVu(gv)) {
8966             SV *tmpsv;
8967             ENTER;
8968             tmpsv = newSV(0);
8969             gv_efullname3(tmpsv, gv, NULL);
8970             /* XXX this is probably not what they think they're getting.
8971              * It has the same effect as "sub name;", i.e. just a forward
8972              * declaration! */
8973             newSUB(start_subparse(FALSE, 0),
8974                    newSVOP(OP_CONST, 0, tmpsv),
8975                    NULL, NULL);
8976             LEAVE;
8977             if (!GvCVu(gv))
8978                 Perl_croak(aTHX_ "Unable to create sub named \"%"SVf"\"",
8979                            SVfARG(SvOK(sv) ? sv : &PL_sv_no));
8980         }
8981         return GvCVu(gv);
8982     }
8983 }
8984
8985 /*
8986 =for apidoc sv_true
8987
8988 Returns true if the SV has a true value by Perl's rules.
8989 Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
8990 instead use an in-line version.
8991
8992 =cut
8993 */
8994
8995 I32
8996 Perl_sv_true(pTHX_ register SV *const sv)
8997 {
8998     if (!sv)
8999         return 0;
9000     if (SvPOK(sv)) {
9001         register const XPV* const tXpv = (XPV*)SvANY(sv);
9002         if (tXpv &&
9003                 (tXpv->xpv_cur > 1 ||
9004                 (tXpv->xpv_cur && *sv->sv_u.svu_pv != '0')))
9005             return 1;
9006         else
9007             return 0;
9008     }
9009     else {
9010         if (SvIOK(sv))
9011             return SvIVX(sv) != 0;
9012         else {
9013             if (SvNOK(sv))
9014                 return SvNVX(sv) != 0.0;
9015             else
9016                 return sv_2bool(sv);
9017         }
9018     }
9019 }
9020
9021 /*
9022 =for apidoc sv_pvn_force
9023
9024 Get a sensible string out of the SV somehow.
9025 A private implementation of the C<SvPV_force> macro for compilers which
9026 can't cope with complex macro expressions.  Always use the macro instead.
9027
9028 =for apidoc sv_pvn_force_flags
9029
9030 Get a sensible string out of the SV somehow.
9031 If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
9032 appropriate, else not.  C<sv_pvn_force> and C<sv_pvn_force_nomg> are
9033 implemented in terms of this function.
9034 You normally want to use the various wrapper macros instead: see
9035 C<SvPV_force> and C<SvPV_force_nomg>
9036
9037 =cut
9038 */
9039
9040 char *
9041 Perl_sv_pvn_force_flags(pTHX_ SV *const sv, STRLEN *const lp, const I32 flags)
9042 {
9043     dVAR;
9044
9045     PERL_ARGS_ASSERT_SV_PVN_FORCE_FLAGS;
9046
9047     if (flags & SV_GMAGIC) SvGETMAGIC(sv);
9048     if (SvTHINKFIRST(sv) && !SvROK(sv))
9049         sv_force_normal_flags(sv, 0);
9050
9051     if (SvPOK(sv)) {
9052         if (lp)
9053             *lp = SvCUR(sv);
9054     }
9055     else {
9056         char *s;
9057         STRLEN len;
9058  
9059         if (SvREADONLY(sv) && !(flags & SV_MUTABLE_RETURN)) {
9060             const char * const ref = sv_reftype(sv,0);
9061             if (PL_op)
9062                 Perl_croak(aTHX_ "Can't coerce readonly %s to string in %s",
9063                            ref, OP_DESC(PL_op));
9064             else
9065                 Perl_croak(aTHX_ "Can't coerce readonly %s to string", ref);
9066         }
9067         if ((SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM)
9068             || isGV_with_GP(sv))
9069             /* diag_listed_as: Can't coerce %s to %s in %s */
9070             Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
9071                 OP_DESC(PL_op));
9072         s = sv_2pv_flags(sv, &len, flags &~ SV_GMAGIC);
9073         if (lp)
9074             *lp = len;
9075
9076         if (s != SvPVX_const(sv)) {     /* Almost, but not quite, sv_setpvn() */
9077             if (SvROK(sv))
9078                 sv_unref(sv);
9079             SvUPGRADE(sv, SVt_PV);              /* Never FALSE */
9080             SvGROW(sv, len + 1);
9081             Move(s,SvPVX(sv),len,char);
9082             SvCUR_set(sv, len);
9083             SvPVX(sv)[len] = '\0';
9084         }
9085         if (!SvPOK(sv)) {
9086             SvPOK_on(sv);               /* validate pointer */
9087             SvTAINT(sv);
9088             DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
9089                                   PTR2UV(sv),SvPVX_const(sv)));
9090         }
9091     }
9092     return SvPVX_mutable(sv);
9093 }
9094
9095 /*
9096 =for apidoc sv_pvbyten_force
9097
9098 The backend for the C<SvPVbytex_force> macro.  Always use the macro
9099 instead.
9100
9101 =cut
9102 */
9103
9104 char *
9105 Perl_sv_pvbyten_force(pTHX_ SV *const sv, STRLEN *const lp)
9106 {
9107     PERL_ARGS_ASSERT_SV_PVBYTEN_FORCE;
9108
9109     sv_pvn_force(sv,lp);
9110     sv_utf8_downgrade(sv,0);
9111     *lp = SvCUR(sv);
9112     return SvPVX(sv);
9113 }
9114
9115 /*
9116 =for apidoc sv_pvutf8n_force
9117
9118 The backend for the C<SvPVutf8x_force> macro.  Always use the macro
9119 instead.
9120
9121 =cut
9122 */
9123
9124 char *
9125 Perl_sv_pvutf8n_force(pTHX_ SV *const sv, STRLEN *const lp)
9126 {
9127     PERL_ARGS_ASSERT_SV_PVUTF8N_FORCE;
9128
9129     sv_pvn_force(sv,lp);
9130     sv_utf8_upgrade(sv);
9131     *lp = SvCUR(sv);
9132     return SvPVX(sv);
9133 }
9134
9135 /*
9136 =for apidoc sv_reftype
9137
9138 Returns a string describing what the SV is a reference to.
9139
9140 =cut
9141 */
9142
9143 const char *
9144 Perl_sv_reftype(pTHX_ const SV *const sv, const int ob)
9145 {
9146     PERL_ARGS_ASSERT_SV_REFTYPE;
9147     if (ob && SvOBJECT(sv)) {
9148         return SvPV_nolen_const(sv_ref(NULL, sv, ob));
9149     }
9150     else {
9151         switch (SvTYPE(sv)) {
9152         case SVt_NULL:
9153         case SVt_IV:
9154         case SVt_NV:
9155         case SVt_PV:
9156         case SVt_PVIV:
9157         case SVt_PVNV:
9158         case SVt_PVMG:
9159                                 if (SvVOK(sv))
9160                                     return "VSTRING";
9161                                 if (SvROK(sv))
9162                                     return "REF";
9163                                 else
9164                                     return "SCALAR";
9165
9166         case SVt_PVLV:          return (char *)  (SvROK(sv) ? "REF"
9167                                 /* tied lvalues should appear to be
9168                                  * scalars for backwards compatibility */
9169                                 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
9170                                     ? "SCALAR" : "LVALUE");
9171         case SVt_PVAV:          return "ARRAY";
9172         case SVt_PVHV:          return "HASH";
9173         case SVt_PVCV:          return "CODE";
9174         case SVt_PVGV:          return (char *) (isGV_with_GP(sv)
9175                                     ? "GLOB" : "SCALAR");
9176         case SVt_PVFM:          return "FORMAT";
9177         case SVt_PVIO:          return "IO";
9178         case SVt_BIND:          return "BIND";
9179         case SVt_REGEXP:        return "REGEXP";
9180         default:                return "UNKNOWN";
9181         }
9182     }
9183 }
9184
9185 /*
9186 =for apidoc sv_ref
9187
9188 Returns a SV describing what the SV passed in is a reference to.
9189
9190 =cut
9191 */
9192
9193 SV *
9194 Perl_sv_ref(pTHX_ register SV *dst, const SV *const sv, const int ob)
9195 {
9196     PERL_ARGS_ASSERT_SV_REF;
9197
9198     if (!dst)
9199         dst = sv_newmortal();
9200
9201     if (ob && SvOBJECT(sv)) {
9202         HvNAME_get(SvSTASH(sv))
9203                     ? sv_sethek(dst, HvNAME_HEK(SvSTASH(sv)))
9204                     : sv_setpvn(dst, "__ANON__", 8);
9205     }
9206     else {
9207         const char * reftype = sv_reftype(sv, 0);
9208         sv_setpv(dst, reftype);
9209     }
9210     return dst;
9211 }
9212
9213 /*
9214 =for apidoc sv_isobject
9215
9216 Returns a boolean indicating whether the SV is an RV pointing to a blessed
9217 object.  If the SV is not an RV, or if the object is not blessed, then this
9218 will return false.
9219
9220 =cut
9221 */
9222
9223 int
9224 Perl_sv_isobject(pTHX_ SV *sv)
9225 {
9226     if (!sv)
9227         return 0;
9228     SvGETMAGIC(sv);
9229     if (!SvROK(sv))
9230         return 0;
9231     sv = SvRV(sv);
9232     if (!SvOBJECT(sv))
9233         return 0;
9234     return 1;
9235 }
9236
9237 /*
9238 =for apidoc sv_isa
9239
9240 Returns a boolean indicating whether the SV is blessed into the specified
9241 class.  This does not check for subtypes; use C<sv_derived_from> to verify
9242 an inheritance relationship.
9243
9244 =cut
9245 */
9246
9247 int
9248 Perl_sv_isa(pTHX_ SV *sv, const char *const name)
9249 {
9250     const char *hvname;
9251
9252     PERL_ARGS_ASSERT_SV_ISA;
9253
9254     if (!sv)
9255         return 0;
9256     SvGETMAGIC(sv);
9257     if (!SvROK(sv))
9258         return 0;
9259     sv = SvRV(sv);
9260     if (!SvOBJECT(sv))
9261         return 0;
9262     hvname = HvNAME_get(SvSTASH(sv));
9263     if (!hvname)
9264         return 0;
9265
9266     return strEQ(hvname, name);
9267 }
9268
9269 /*
9270 =for apidoc newSVrv
9271
9272 Creates a new SV for the RV, C<rv>, to point to.  If C<rv> is not an RV then
9273 it will be upgraded to one.  If C<classname> is non-null then the new SV will
9274 be blessed in the specified package.  The new SV is returned and its
9275 reference count is 1.
9276
9277 =cut
9278 */
9279
9280 SV*
9281 Perl_newSVrv(pTHX_ SV *const rv, const char *const classname)
9282 {
9283     dVAR;
9284     SV *sv;
9285
9286     PERL_ARGS_ASSERT_NEWSVRV;
9287
9288     new_SV(sv);
9289
9290     SV_CHECK_THINKFIRST_COW_DROP(rv);
9291     (void)SvAMAGIC_off(rv);
9292
9293     if (SvTYPE(rv) >= SVt_PVMG) {
9294         const U32 refcnt = SvREFCNT(rv);
9295         SvREFCNT(rv) = 0;
9296         sv_clear(rv);
9297         SvFLAGS(rv) = 0;
9298         SvREFCNT(rv) = refcnt;
9299
9300         sv_upgrade(rv, SVt_IV);
9301     } else if (SvROK(rv)) {
9302         SvREFCNT_dec(SvRV(rv));
9303     } else {
9304         prepare_SV_for_RV(rv);
9305     }
9306
9307     SvOK_off(rv);
9308     SvRV_set(rv, sv);
9309     SvROK_on(rv);
9310
9311     if (classname) {
9312         HV* const stash = gv_stashpv(classname, GV_ADD);
9313         (void)sv_bless(rv, stash);
9314     }
9315     return sv;
9316 }
9317
9318 /*
9319 =for apidoc sv_setref_pv
9320
9321 Copies a pointer into a new SV, optionally blessing the SV.  The C<rv>
9322 argument will be upgraded to an RV.  That RV will be modified to point to
9323 the new SV.  If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
9324 into the SV.  The C<classname> argument indicates the package for the
9325 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
9326 will have a reference count of 1, and the RV will be returned.
9327
9328 Do not use with other Perl types such as HV, AV, SV, CV, because those
9329 objects will become corrupted by the pointer copy process.
9330
9331 Note that C<sv_setref_pvn> copies the string while this copies the pointer.
9332
9333 =cut
9334 */
9335
9336 SV*
9337 Perl_sv_setref_pv(pTHX_ SV *const rv, const char *const classname, void *const pv)
9338 {
9339     dVAR;
9340
9341     PERL_ARGS_ASSERT_SV_SETREF_PV;
9342
9343     if (!pv) {
9344         sv_setsv(rv, &PL_sv_undef);
9345         SvSETMAGIC(rv);
9346     }
9347     else
9348         sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
9349     return rv;
9350 }
9351
9352 /*
9353 =for apidoc sv_setref_iv
9354
9355 Copies an integer into a new SV, optionally blessing the SV.  The C<rv>
9356 argument will be upgraded to an RV.  That RV will be modified to point to
9357 the new SV.  The C<classname> argument indicates the package for the
9358 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
9359 will have a reference count of 1, and the RV will be returned.
9360
9361 =cut
9362 */
9363
9364 SV*
9365 Perl_sv_setref_iv(pTHX_ SV *const rv, const char *const classname, const IV iv)
9366 {
9367     PERL_ARGS_ASSERT_SV_SETREF_IV;
9368
9369     sv_setiv(newSVrv(rv,classname), iv);
9370     return rv;
9371 }
9372
9373 /*
9374 =for apidoc sv_setref_uv
9375
9376 Copies an unsigned integer into a new SV, optionally blessing the SV.  The C<rv>
9377 argument will be upgraded to an RV.  That RV will be modified to point to
9378 the new SV.  The C<classname> argument indicates the package for the
9379 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
9380 will have a reference count of 1, and the RV will be returned.
9381
9382 =cut
9383 */
9384
9385 SV*
9386 Perl_sv_setref_uv(pTHX_ SV *const rv, const char *const classname, const UV uv)
9387 {
9388     PERL_ARGS_ASSERT_SV_SETREF_UV;
9389
9390     sv_setuv(newSVrv(rv,classname), uv);
9391     return rv;
9392 }
9393
9394 /*
9395 =for apidoc sv_setref_nv
9396
9397 Copies a double into a new SV, optionally blessing the SV.  The C<rv>
9398 argument will be upgraded to an RV.  That RV will be modified to point to
9399 the new SV.  The C<classname> argument indicates the package for the
9400 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
9401 will have a reference count of 1, and the RV will be returned.
9402
9403 =cut
9404 */
9405
9406 SV*
9407 Perl_sv_setref_nv(pTHX_ SV *const rv, const char *const classname, const NV nv)
9408 {
9409     PERL_ARGS_ASSERT_SV_SETREF_NV;
9410
9411     sv_setnv(newSVrv(rv,classname), nv);
9412     return rv;
9413 }
9414
9415 /*
9416 =for apidoc sv_setref_pvn
9417
9418 Copies a string into a new SV, optionally blessing the SV.  The length of the
9419 string must be specified with C<n>.  The C<rv> argument will be upgraded to
9420 an RV.  That RV will be modified to point to the new SV.  The C<classname>
9421 argument indicates the package for the blessing.  Set C<classname> to
9422 C<NULL> to avoid the blessing.  The new SV will have a reference count
9423 of 1, and the RV will be returned.
9424
9425 Note that C<sv_setref_pv> copies the pointer while this copies the string.
9426
9427 =cut
9428 */
9429
9430 SV*
9431 Perl_sv_setref_pvn(pTHX_ SV *const rv, const char *const classname,
9432                    const char *const pv, const STRLEN n)
9433 {
9434     PERL_ARGS_ASSERT_SV_SETREF_PVN;
9435
9436     sv_setpvn(newSVrv(rv,classname), pv, n);
9437     return rv;
9438 }
9439
9440 /*
9441 =for apidoc sv_bless
9442
9443 Blesses an SV into a specified package.  The SV must be an RV.  The package
9444 must be designated by its stash (see C<gv_stashpv()>).  The reference count
9445 of the SV is unaffected.
9446
9447 =cut
9448 */
9449
9450 SV*
9451 Perl_sv_bless(pTHX_ SV *const sv, HV *const stash)
9452 {
9453     dVAR;
9454     SV *tmpRef;
9455
9456     PERL_ARGS_ASSERT_SV_BLESS;
9457
9458     if (!SvROK(sv))
9459         Perl_croak(aTHX_ "Can't bless non-reference value");
9460     tmpRef = SvRV(sv);
9461     if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
9462         if (SvIsCOW(tmpRef))
9463             sv_force_normal_flags(tmpRef, 0);
9464         if (SvREADONLY(tmpRef))
9465             Perl_croak_no_modify(aTHX);
9466         if (SvOBJECT(tmpRef)) {
9467             if (SvTYPE(tmpRef) != SVt_PVIO)
9468                 --PL_sv_objcount;
9469             SvREFCNT_dec(SvSTASH(tmpRef));
9470         }
9471     }
9472     SvOBJECT_on(tmpRef);
9473     if (SvTYPE(tmpRef) != SVt_PVIO)
9474         ++PL_sv_objcount;
9475     SvUPGRADE(tmpRef, SVt_PVMG);
9476     SvSTASH_set(tmpRef, MUTABLE_HV(SvREFCNT_inc_simple(stash)));
9477
9478     if (Gv_AMG(stash))
9479         SvAMAGIC_on(sv);
9480     else
9481         (void)SvAMAGIC_off(sv);
9482
9483     if(SvSMAGICAL(tmpRef))
9484         if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
9485             mg_set(tmpRef);
9486
9487
9488
9489     return sv;
9490 }
9491
9492 /* Downgrades a PVGV to a PVMG. If it's actually a PVLV, we leave the type
9493  * as it is after unglobbing it.
9494  */
9495
9496 PERL_STATIC_INLINE void
9497 S_sv_unglob(pTHX_ SV *const sv, U32 flags)
9498 {
9499     dVAR;
9500     void *xpvmg;
9501     HV *stash;
9502     SV * const temp = flags & SV_COW_DROP_PV ? NULL : sv_newmortal();
9503
9504     PERL_ARGS_ASSERT_SV_UNGLOB;
9505
9506     assert(SvTYPE(sv) == SVt_PVGV || SvTYPE(sv) == SVt_PVLV);
9507     SvFAKE_off(sv);
9508     if (!(flags & SV_COW_DROP_PV))
9509         gv_efullname3(temp, MUTABLE_GV(sv), "*");
9510
9511     if (GvGP(sv)) {
9512         if(GvCVu((const GV *)sv) && (stash = GvSTASH(MUTABLE_GV(sv)))
9513            && HvNAME_get(stash))
9514             mro_method_changed_in(stash);
9515         gp_free(MUTABLE_GV(sv));
9516     }
9517     if (GvSTASH(sv)) {
9518         sv_del_backref(MUTABLE_SV(GvSTASH(sv)), sv);
9519         GvSTASH(sv) = NULL;
9520     }
9521     GvMULTI_off(sv);
9522     if (GvNAME_HEK(sv)) {
9523         unshare_hek(GvNAME_HEK(sv));
9524     }
9525     isGV_with_GP_off(sv);
9526
9527     if(SvTYPE(sv) == SVt_PVGV) {
9528         /* need to keep SvANY(sv) in the right arena */
9529         xpvmg = new_XPVMG();
9530         StructCopy(SvANY(sv), xpvmg, XPVMG);
9531         del_XPVGV(SvANY(sv));
9532         SvANY(sv) = xpvmg;
9533
9534         SvFLAGS(sv) &= ~SVTYPEMASK;
9535         SvFLAGS(sv) |= SVt_PVMG;
9536     }
9537
9538     /* Intentionally not calling any local SET magic, as this isn't so much a
9539        set operation as merely an internal storage change.  */
9540     if (flags & SV_COW_DROP_PV) SvOK_off(sv);
9541     else sv_setsv_flags(sv, temp, 0);
9542
9543     if ((const GV *)sv == PL_last_in_gv)
9544         PL_last_in_gv = NULL;
9545 }
9546
9547 /*
9548 =for apidoc sv_unref_flags
9549
9550 Unsets the RV status of the SV, and decrements the reference count of
9551 whatever was being referenced by the RV.  This can almost be thought of
9552 as a reversal of C<newSVrv>.  The C<cflags> argument can contain
9553 C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
9554 (otherwise the decrementing is conditional on the reference count being
9555 different from one or the reference being a readonly SV).
9556 See C<SvROK_off>.
9557
9558 =cut
9559 */
9560
9561 void
9562 Perl_sv_unref_flags(pTHX_ SV *const ref, const U32 flags)
9563 {
9564     SV* const target = SvRV(ref);
9565
9566     PERL_ARGS_ASSERT_SV_UNREF_FLAGS;
9567
9568     if (SvWEAKREF(ref)) {
9569         sv_del_backref(target, ref);
9570         SvWEAKREF_off(ref);
9571         SvRV_set(ref, NULL);
9572         return;
9573     }
9574     SvRV_set(ref, NULL);
9575     SvROK_off(ref);
9576     /* You can't have a || SvREADONLY(target) here, as $a = $$a, where $a was
9577        assigned to as BEGIN {$a = \"Foo"} will fail.  */
9578     if (SvREFCNT(target) != 1 || (flags & SV_IMMEDIATE_UNREF))
9579         SvREFCNT_dec(target);
9580     else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
9581         sv_2mortal(target);     /* Schedule for freeing later */
9582 }
9583
9584 /*
9585 =for apidoc sv_untaint
9586
9587 Untaint an SV.  Use C<SvTAINTED_off> instead.
9588
9589 =cut
9590 */
9591
9592 void
9593 Perl_sv_untaint(pTHX_ SV *const sv)
9594 {
9595     PERL_ARGS_ASSERT_SV_UNTAINT;
9596
9597     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
9598         MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
9599         if (mg)
9600             mg->mg_len &= ~1;
9601     }
9602 }
9603
9604 /*
9605 =for apidoc sv_tainted
9606
9607 Test an SV for taintedness.  Use C<SvTAINTED> instead.
9608
9609 =cut
9610 */
9611
9612 bool
9613 Perl_sv_tainted(pTHX_ SV *const sv)
9614 {
9615     PERL_ARGS_ASSERT_SV_TAINTED;
9616
9617     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
9618         const MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
9619         if (mg && (mg->mg_len & 1) )
9620             return TRUE;
9621     }
9622     return FALSE;
9623 }
9624
9625 /*
9626 =for apidoc sv_setpviv
9627
9628 Copies an integer into the given SV, also updating its string value.
9629 Does not handle 'set' magic.  See C<sv_setpviv_mg>.
9630
9631 =cut
9632 */
9633
9634 void
9635 Perl_sv_setpviv(pTHX_ SV *const sv, const IV iv)
9636 {
9637     char buf[TYPE_CHARS(UV)];
9638     char *ebuf;
9639     char * const ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
9640
9641     PERL_ARGS_ASSERT_SV_SETPVIV;
9642
9643     sv_setpvn(sv, ptr, ebuf - ptr);
9644 }
9645
9646 /*
9647 =for apidoc sv_setpviv_mg
9648
9649 Like C<sv_setpviv>, but also handles 'set' magic.
9650
9651 =cut
9652 */
9653
9654 void
9655 Perl_sv_setpviv_mg(pTHX_ SV *const sv, const IV iv)
9656 {
9657     PERL_ARGS_ASSERT_SV_SETPVIV_MG;
9658
9659     sv_setpviv(sv, iv);
9660     SvSETMAGIC(sv);
9661 }
9662
9663 #if defined(PERL_IMPLICIT_CONTEXT)
9664
9665 /* pTHX_ magic can't cope with varargs, so this is a no-context
9666  * version of the main function, (which may itself be aliased to us).
9667  * Don't access this version directly.
9668  */
9669
9670 void
9671 Perl_sv_setpvf_nocontext(SV *const sv, const char *const pat, ...)
9672 {
9673     dTHX;
9674     va_list args;
9675
9676     PERL_ARGS_ASSERT_SV_SETPVF_NOCONTEXT;
9677
9678     va_start(args, pat);
9679     sv_vsetpvf(sv, pat, &args);
9680     va_end(args);
9681 }
9682
9683 /* pTHX_ magic can't cope with varargs, so this is a no-context
9684  * version of the main function, (which may itself be aliased to us).
9685  * Don't access this version directly.
9686  */
9687
9688 void
9689 Perl_sv_setpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
9690 {
9691     dTHX;
9692     va_list args;
9693
9694     PERL_ARGS_ASSERT_SV_SETPVF_MG_NOCONTEXT;
9695
9696     va_start(args, pat);
9697     sv_vsetpvf_mg(sv, pat, &args);
9698     va_end(args);
9699 }
9700 #endif
9701
9702 /*
9703 =for apidoc sv_setpvf
9704
9705 Works like C<sv_catpvf> but copies the text into the SV instead of
9706 appending it.  Does not handle 'set' magic.  See C<sv_setpvf_mg>.
9707
9708 =cut
9709 */
9710
9711 void
9712 Perl_sv_setpvf(pTHX_ SV *const sv, const char *const pat, ...)
9713 {
9714     va_list args;
9715
9716     PERL_ARGS_ASSERT_SV_SETPVF;
9717
9718     va_start(args, pat);
9719     sv_vsetpvf(sv, pat, &args);
9720     va_end(args);
9721 }
9722
9723 /*
9724 =for apidoc sv_vsetpvf
9725
9726 Works like C<sv_vcatpvf> but copies the text into the SV instead of
9727 appending it.  Does not handle 'set' magic.  See C<sv_vsetpvf_mg>.
9728
9729 Usually used via its frontend C<sv_setpvf>.
9730
9731 =cut
9732 */
9733
9734 void
9735 Perl_sv_vsetpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args)
9736 {
9737     PERL_ARGS_ASSERT_SV_VSETPVF;
9738
9739     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
9740 }
9741
9742 /*
9743 =for apidoc sv_setpvf_mg
9744
9745 Like C<sv_setpvf>, but also handles 'set' magic.
9746
9747 =cut
9748 */
9749
9750 void
9751 Perl_sv_setpvf_mg(pTHX_ SV *const sv, const char *const pat, ...)
9752 {
9753     va_list args;
9754
9755     PERL_ARGS_ASSERT_SV_SETPVF_MG;
9756
9757     va_start(args, pat);
9758     sv_vsetpvf_mg(sv, pat, &args);
9759     va_end(args);
9760 }
9761
9762 /*
9763 =for apidoc sv_vsetpvf_mg
9764
9765 Like C<sv_vsetpvf>, but also handles 'set' magic.
9766
9767 Usually used via its frontend C<sv_setpvf_mg>.
9768
9769 =cut
9770 */
9771
9772 void
9773 Perl_sv_vsetpvf_mg(pTHX_ SV *const sv, const char *const pat, va_list *const args)
9774 {
9775     PERL_ARGS_ASSERT_SV_VSETPVF_MG;
9776
9777     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
9778     SvSETMAGIC(sv);
9779 }
9780
9781 #if defined(PERL_IMPLICIT_CONTEXT)
9782
9783 /* pTHX_ magic can't cope with varargs, so this is a no-context
9784  * version of the main function, (which may itself be aliased to us).
9785  * Don't access this version directly.
9786  */
9787
9788 void
9789 Perl_sv_catpvf_nocontext(SV *const sv, const char *const pat, ...)
9790 {
9791     dTHX;
9792     va_list args;
9793
9794     PERL_ARGS_ASSERT_SV_CATPVF_NOCONTEXT;
9795
9796     va_start(args, pat);
9797     sv_vcatpvf(sv, pat, &args);
9798     va_end(args);
9799 }
9800
9801 /* pTHX_ magic can't cope with varargs, so this is a no-context
9802  * version of the main function, (which may itself be aliased to us).
9803  * Don't access this version directly.
9804  */
9805
9806 void
9807 Perl_sv_catpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
9808 {
9809     dTHX;
9810     va_list args;
9811
9812     PERL_ARGS_ASSERT_SV_CATPVF_MG_NOCONTEXT;
9813
9814     va_start(args, pat);
9815     sv_vcatpvf_mg(sv, pat, &args);
9816     va_end(args);
9817 }
9818 #endif
9819
9820 /*
9821 =for apidoc sv_catpvf
9822
9823 Processes its arguments like C<sprintf> and appends the formatted
9824 output to an SV.  If the appended data contains "wide" characters
9825 (including, but not limited to, SVs with a UTF-8 PV formatted with %s,
9826 and characters >255 formatted with %c), the original SV might get
9827 upgraded to UTF-8.  Handles 'get' magic, but not 'set' magic.  See
9828 C<sv_catpvf_mg>.  If the original SV was UTF-8, the pattern should be
9829 valid UTF-8; if the original SV was bytes, the pattern should be too.
9830
9831 =cut */
9832
9833 void
9834 Perl_sv_catpvf(pTHX_ SV *const sv, const char *const pat, ...)
9835 {
9836     va_list args;
9837
9838     PERL_ARGS_ASSERT_SV_CATPVF;
9839
9840     va_start(args, pat);
9841     sv_vcatpvf(sv, pat, &args);
9842     va_end(args);
9843 }
9844
9845 /*
9846 =for apidoc sv_vcatpvf
9847
9848 Processes its arguments like C<vsprintf> and appends the formatted output
9849 to an SV.  Does not handle 'set' magic.  See C<sv_vcatpvf_mg>.
9850
9851 Usually used via its frontend C<sv_catpvf>.
9852
9853 =cut
9854 */
9855
9856 void
9857 Perl_sv_vcatpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args)
9858 {
9859     PERL_ARGS_ASSERT_SV_VCATPVF;
9860
9861     sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
9862 }
9863
9864 /*
9865 =for apidoc sv_catpvf_mg
9866
9867 Like C<sv_catpvf>, but also handles 'set' magic.
9868
9869 =cut
9870 */
9871
9872 void
9873 Perl_sv_catpvf_mg(pTHX_ SV *const sv, const char *const pat, ...)
9874 {
9875     va_list args;
9876
9877     PERL_ARGS_ASSERT_SV_CATPVF_MG;
9878
9879     va_start(args, pat);
9880     sv_vcatpvf_mg(sv, pat, &args);
9881     va_end(args);
9882 }
9883
9884 /*
9885 =for apidoc sv_vcatpvf_mg
9886
9887 Like C<sv_vcatpvf>, but also handles 'set' magic.
9888
9889 Usually used via its frontend C<sv_catpvf_mg>.
9890
9891 =cut
9892 */
9893
9894 void
9895 Perl_sv_vcatpvf_mg(pTHX_ SV *const sv, const char *const pat, va_list *const args)
9896 {
9897     PERL_ARGS_ASSERT_SV_VCATPVF_MG;
9898
9899     sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
9900     SvSETMAGIC(sv);
9901 }
9902
9903 /*
9904 =for apidoc sv_vsetpvfn
9905
9906 Works like C<sv_vcatpvfn> but copies the text into the SV instead of
9907 appending it.
9908
9909 Usually used via one of its frontends C<sv_vsetpvf> and C<sv_vsetpvf_mg>.
9910
9911 =cut
9912 */
9913
9914 void
9915 Perl_sv_vsetpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
9916                  va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted)
9917 {
9918     PERL_ARGS_ASSERT_SV_VSETPVFN;
9919
9920     sv_setpvs(sv, "");
9921     sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
9922 }
9923
9924
9925 /*
9926  * Warn of missing argument to sprintf, and then return a defined value
9927  * to avoid inappropriate "use of uninit" warnings [perl #71000].
9928  */
9929 #define WARN_MISSING WARN_UNINITIALIZED /* Not sure we want a new category */
9930 STATIC SV*
9931 S_vcatpvfn_missing_argument(pTHX) {
9932     if (ckWARN(WARN_MISSING)) {
9933         Perl_warner(aTHX_ packWARN(WARN_MISSING), "Missing argument in %s",
9934                 PL_op ? OP_DESC(PL_op) : "sv_vcatpvfn()");
9935     }
9936     return &PL_sv_no;
9937 }
9938
9939
9940 STATIC I32
9941 S_expect_number(pTHX_ char **const pattern)
9942 {
9943     dVAR;
9944     I32 var = 0;
9945
9946     PERL_ARGS_ASSERT_EXPECT_NUMBER;
9947
9948     switch (**pattern) {
9949     case '1': case '2': case '3':
9950     case '4': case '5': case '6':
9951     case '7': case '8': case '9':
9952         var = *(*pattern)++ - '0';
9953         while (isDIGIT(**pattern)) {
9954             const I32 tmp = var * 10 + (*(*pattern)++ - '0');
9955             if (tmp < var)
9956                 Perl_croak(aTHX_ "Integer overflow in format string for %s", (PL_op ? OP_DESC(PL_op) : "sv_vcatpvfn"));
9957             var = tmp;
9958         }
9959     }
9960     return var;
9961 }
9962
9963 STATIC char *
9964 S_F0convert(NV nv, char *const endbuf, STRLEN *const len)
9965 {
9966     const int neg = nv < 0;
9967     UV uv;
9968
9969     PERL_ARGS_ASSERT_F0CONVERT;
9970
9971     if (neg)
9972         nv = -nv;
9973     if (nv < UV_MAX) {
9974         char *p = endbuf;
9975         nv += 0.5;
9976         uv = (UV)nv;
9977         if (uv & 1 && uv == nv)
9978             uv--;                       /* Round to even */
9979         do {
9980             const unsigned dig = uv % 10;
9981             *--p = '0' + dig;
9982         } while (uv /= 10);
9983         if (neg)
9984             *--p = '-';
9985         *len = endbuf - p;
9986         return p;
9987     }
9988     return NULL;
9989 }
9990
9991
9992 /*
9993 =for apidoc sv_vcatpvfn
9994
9995 Processes its arguments like C<vsprintf> and appends the formatted output
9996 to an SV.  Uses an array of SVs if the C style variable argument list is
9997 missing (NULL).  When running with taint checks enabled, indicates via
9998 C<maybe_tainted> if results are untrustworthy (often due to the use of
9999 locales).
10000
10001 Usually used via one of its frontends C<sv_vcatpvf> and C<sv_vcatpvf_mg>.
10002
10003 =cut
10004 */
10005
10006
10007 #define VECTORIZE_ARGS  vecsv = va_arg(*args, SV*);\
10008                         vecstr = (U8*)SvPV_const(vecsv,veclen);\
10009                         vec_utf8 = DO_UTF8(vecsv);
10010
10011 /* XXX maybe_tainted is never assigned to, so the doc above is lying. */
10012
10013 void
10014 Perl_sv_vcatpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
10015                  va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted)
10016 {
10017     dVAR;
10018     char *p;
10019     char *q;
10020     const char *patend;
10021     STRLEN origlen;
10022     I32 svix = 0;
10023     static const char nullstr[] = "(null)";
10024     SV *argsv = NULL;
10025     bool has_utf8 = DO_UTF8(sv);    /* has the result utf8? */
10026     const bool pat_utf8 = has_utf8; /* the pattern is in utf8? */
10027     SV *nsv = NULL;
10028     /* Times 4: a decimal digit takes more than 3 binary digits.
10029      * NV_DIG: mantissa takes than many decimal digits.
10030      * Plus 32: Playing safe. */
10031     char ebuf[IV_DIG * 4 + NV_DIG + 32];
10032     /* large enough for "%#.#f" --chip */
10033     /* what about long double NVs? --jhi */
10034
10035     PERL_ARGS_ASSERT_SV_VCATPVFN;
10036     PERL_UNUSED_ARG(maybe_tainted);
10037
10038     /* no matter what, this is a string now */
10039     (void)SvPV_force(sv, origlen);
10040
10041     /* special-case "", "%s", and "%-p" (SVf - see below) */
10042     if (patlen == 0)
10043         return;
10044     if (patlen == 2 && pat[0] == '%' && pat[1] == 's') {
10045         if (args) {
10046             const char * const s = va_arg(*args, char*);
10047             sv_catpv(sv, s ? s : nullstr);
10048         }
10049         else if (svix < svmax) {
10050             sv_catsv(sv, *svargs);
10051         }
10052         else
10053             S_vcatpvfn_missing_argument(aTHX);
10054         return;
10055     }
10056     if (args && patlen == 3 && pat[0] == '%' &&
10057                 pat[1] == '-' && pat[2] == 'p') {
10058         argsv = MUTABLE_SV(va_arg(*args, void*));
10059         sv_catsv(sv, argsv);
10060         return;
10061     }
10062
10063 #ifndef USE_LONG_DOUBLE
10064     /* special-case "%.<number>[gf]" */
10065     if ( !args && patlen <= 5 && pat[0] == '%' && pat[1] == '.'
10066          && (pat[patlen-1] == 'g' || pat[patlen-1] == 'f') ) {
10067         unsigned digits = 0;
10068         const char *pp;
10069
10070         pp = pat + 2;
10071         while (*pp >= '0' && *pp <= '9')
10072             digits = 10 * digits + (*pp++ - '0');
10073         if (pp - pat == (int)patlen - 1 && svix < svmax) {
10074             const NV nv = SvNV(*svargs);
10075             if (*pp == 'g') {
10076                 /* Add check for digits != 0 because it seems that some
10077                    gconverts are buggy in this case, and we don't yet have
10078                    a Configure test for this.  */
10079                 if (digits && digits < sizeof(ebuf) - NV_DIG - 10) {
10080                      /* 0, point, slack */
10081                     Gconvert(nv, (int)digits, 0, ebuf);
10082                     sv_catpv(sv, ebuf);
10083                     if (*ebuf)  /* May return an empty string for digits==0 */
10084                         return;
10085                 }
10086             } else if (!digits) {
10087                 STRLEN l;
10088
10089                 if ((p = F0convert(nv, ebuf + sizeof ebuf, &l))) {
10090                     sv_catpvn(sv, p, l);
10091                     return;
10092                 }
10093             }
10094         }
10095     }
10096 #endif /* !USE_LONG_DOUBLE */
10097
10098     if (!args && svix < svmax && DO_UTF8(*svargs))
10099         has_utf8 = TRUE;
10100
10101     patend = (char*)pat + patlen;
10102     for (p = (char*)pat; p < patend; p = q) {
10103         bool alt = FALSE;
10104         bool left = FALSE;
10105         bool vectorize = FALSE;
10106         bool vectorarg = FALSE;
10107         bool vec_utf8 = FALSE;
10108         char fill = ' ';
10109         char plus = 0;
10110         char intsize = 0;
10111         STRLEN width = 0;
10112         STRLEN zeros = 0;
10113         bool has_precis = FALSE;
10114         STRLEN precis = 0;
10115         const I32 osvix = svix;
10116         bool is_utf8 = FALSE;  /* is this item utf8?   */
10117 #ifdef HAS_LDBL_SPRINTF_BUG
10118         /* This is to try to fix a bug with irix/nonstop-ux/powerux and
10119            with sfio - Allen <allens@cpan.org> */
10120         bool fix_ldbl_sprintf_bug = FALSE;
10121 #endif
10122
10123         char esignbuf[4];
10124         U8 utf8buf[UTF8_MAXBYTES+1];
10125         STRLEN esignlen = 0;
10126
10127         const char *eptr = NULL;
10128         const char *fmtstart;
10129         STRLEN elen = 0;
10130         SV *vecsv = NULL;
10131         const U8 *vecstr = NULL;
10132         STRLEN veclen = 0;
10133         char c = 0;
10134         int i;
10135         unsigned base = 0;
10136         IV iv = 0;
10137         UV uv = 0;
10138         /* we need a long double target in case HAS_LONG_DOUBLE but
10139            not USE_LONG_DOUBLE
10140         */
10141 #if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
10142         long double nv;
10143 #else
10144         NV nv;
10145 #endif
10146         STRLEN have;
10147         STRLEN need;
10148         STRLEN gap;
10149         const char *dotstr = ".";
10150         STRLEN dotstrlen = 1;
10151         I32 efix = 0; /* explicit format parameter index */
10152         I32 ewix = 0; /* explicit width index */
10153         I32 epix = 0; /* explicit precision index */
10154         I32 evix = 0; /* explicit vector index */
10155         bool asterisk = FALSE;
10156
10157         /* echo everything up to the next format specification */
10158         for (q = p; q < patend && *q != '%'; ++q) ;
10159         if (q > p) {
10160             if (has_utf8 && !pat_utf8)
10161                 sv_catpvn_utf8_upgrade(sv, p, q - p, nsv);
10162             else
10163                 sv_catpvn(sv, p, q - p);
10164             p = q;
10165         }
10166         if (q++ >= patend)
10167             break;
10168
10169         fmtstart = q;
10170
10171 /*
10172     We allow format specification elements in this order:
10173         \d+\$              explicit format parameter index
10174         [-+ 0#]+           flags
10175         v|\*(\d+\$)?v      vector with optional (optionally specified) arg
10176         0                  flag (as above): repeated to allow "v02"     
10177         \d+|\*(\d+\$)?     width using optional (optionally specified) arg
10178         \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
10179         [hlqLV]            size
10180     [%bcdefginopsuxDFOUX] format (mandatory)
10181 */
10182
10183         if (args) {
10184 /*  
10185         As of perl5.9.3, printf format checking is on by default.
10186         Internally, perl uses %p formats to provide an escape to
10187         some extended formatting.  This block deals with those
10188         extensions: if it does not match, (char*)q is reset and
10189         the normal format processing code is used.
10190
10191         Currently defined extensions are:
10192                 %p              include pointer address (standard)      
10193                 %-p     (SVf)   include an SV (previously %_)
10194                 %-<num>p        include an SV with precision <num>      
10195                 %2p             include a HEK
10196                 %3p             include a HEK with precision of 256
10197                 %<num>p         (where num != 2 or 3) reserved for future
10198                                 extensions
10199
10200         Robin Barker 2005-07-14 (but modified since)
10201
10202                 %1p     (VDf)   removed.  RMB 2007-10-19
10203 */
10204             char* r = q; 
10205             bool sv = FALSE;    
10206             STRLEN n = 0;
10207             if (*q == '-')
10208                 sv = *q++;
10209             n = expect_number(&q);
10210             if (*q++ == 'p') {
10211                 if (sv) {                       /* SVf */
10212                     if (n) {
10213                         precis = n;
10214                         has_precis = TRUE;
10215                     }
10216                     argsv = MUTABLE_SV(va_arg(*args, void*));
10217                     eptr = SvPV_const(argsv, elen);
10218                     if (DO_UTF8(argsv))
10219                         is_utf8 = TRUE;
10220                     goto string;
10221                 }
10222                 else if (n==2 || n==3) {        /* HEKf */
10223                     HEK * const hek = va_arg(*args, HEK *);
10224                     eptr = HEK_KEY(hek);
10225                     elen = HEK_LEN(hek);
10226                     if (HEK_UTF8(hek)) is_utf8 = TRUE;
10227                     if (n==3) precis = 256, has_precis = TRUE;
10228                     goto string;
10229                 }
10230                 else if (n) {
10231                     Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),
10232                                      "internal %%<num>p might conflict with future printf extensions");
10233                 }
10234             }
10235             q = r; 
10236         }
10237
10238         if ( (width = expect_number(&q)) ) {
10239             if (*q == '$') {
10240                 ++q;
10241                 efix = width;
10242             } else {
10243                 goto gotwidth;
10244             }
10245         }
10246
10247         /* FLAGS */
10248
10249         while (*q) {
10250             switch (*q) {
10251             case ' ':
10252             case '+':
10253                 if (plus == '+' && *q == ' ') /* '+' over ' ' */
10254                     q++;
10255                 else
10256                     plus = *q++;
10257                 continue;
10258
10259             case '-':
10260                 left = TRUE;
10261                 q++;
10262                 continue;
10263
10264             case '0':
10265                 fill = *q++;
10266                 continue;
10267
10268             case '#':
10269                 alt = TRUE;
10270                 q++;
10271                 continue;
10272
10273             default:
10274                 break;
10275             }
10276             break;
10277         }
10278
10279       tryasterisk:
10280         if (*q == '*') {
10281             q++;
10282             if ( (ewix = expect_number(&q)) )
10283                 if (*q++ != '$')
10284                     goto unknown;
10285             asterisk = TRUE;
10286         }
10287         if (*q == 'v') {
10288             q++;
10289             if (vectorize)
10290                 goto unknown;
10291             if ((vectorarg = asterisk)) {
10292                 evix = ewix;
10293                 ewix = 0;
10294                 asterisk = FALSE;
10295             }
10296             vectorize = TRUE;
10297             goto tryasterisk;
10298         }
10299
10300         if (!asterisk)
10301         {
10302             if( *q == '0' )
10303                 fill = *q++;
10304             width = expect_number(&q);
10305         }
10306
10307         if (vectorize && vectorarg) {
10308             /* vectorizing, but not with the default "." */
10309             if (args)
10310                 vecsv = va_arg(*args, SV*);
10311             else if (evix) {
10312                 vecsv = (evix > 0 && evix <= svmax)
10313                     ? svargs[evix-1] : S_vcatpvfn_missing_argument(aTHX);
10314             } else {
10315                 vecsv = svix < svmax
10316                     ? svargs[svix++] : S_vcatpvfn_missing_argument(aTHX);
10317             }
10318             dotstr = SvPV_const(vecsv, dotstrlen);
10319             /* Keep the DO_UTF8 test *after* the SvPV call, else things go
10320                bad with tied or overloaded values that return UTF8.  */
10321             if (DO_UTF8(vecsv))
10322                 is_utf8 = TRUE;
10323             else if (has_utf8) {
10324                 vecsv = sv_mortalcopy(vecsv);
10325                 sv_utf8_upgrade(vecsv);
10326                 dotstr = SvPV_const(vecsv, dotstrlen);
10327                 is_utf8 = TRUE;
10328             }               
10329         }
10330
10331         if (asterisk) {
10332             if (args)
10333                 i = va_arg(*args, int);
10334             else
10335                 i = (ewix ? ewix <= svmax : svix < svmax) ?
10336                     SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
10337             left |= (i < 0);
10338             width = (i < 0) ? -i : i;
10339         }
10340       gotwidth:
10341
10342         /* PRECISION */
10343
10344         if (*q == '.') {
10345             q++;
10346             if (*q == '*') {
10347                 q++;
10348                 if ( ((epix = expect_number(&q))) && (*q++ != '$') )
10349                     goto unknown;
10350                 /* XXX: todo, support specified precision parameter */
10351                 if (epix)
10352                     goto unknown;
10353                 if (args)
10354                     i = va_arg(*args, int);
10355                 else
10356                     i = (ewix ? ewix <= svmax : svix < svmax)
10357                         ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
10358                 precis = i;
10359                 has_precis = !(i < 0);
10360             }
10361             else {
10362                 precis = 0;
10363                 while (isDIGIT(*q))
10364                     precis = precis * 10 + (*q++ - '0');
10365                 has_precis = TRUE;
10366             }
10367         }
10368
10369         if (vectorize) {
10370             if (args) {
10371                 VECTORIZE_ARGS
10372             }
10373             else if (efix ? (efix > 0 && efix <= svmax) : svix < svmax) {
10374                 vecsv = svargs[efix ? efix-1 : svix++];
10375                 vecstr = (U8*)SvPV_const(vecsv,veclen);
10376                 vec_utf8 = DO_UTF8(vecsv);
10377
10378                 /* if this is a version object, we need to convert
10379                  * back into v-string notation and then let the
10380                  * vectorize happen normally
10381                  */
10382                 if (sv_isobject(vecsv) && sv_derived_from(vecsv, "version")) {
10383                     char *version = savesvpv(vecsv);
10384                     if ( hv_exists(MUTABLE_HV(SvRV(vecsv)), "alpha", 5 ) ) {
10385                         Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
10386                         "vector argument not supported with alpha versions");
10387                         goto unknown;
10388                     }
10389                     vecsv = sv_newmortal();
10390                     scan_vstring(version, version + veclen, vecsv);
10391                     vecstr = (U8*)SvPV_const(vecsv, veclen);
10392                     vec_utf8 = DO_UTF8(vecsv);
10393                     Safefree(version);
10394                 }
10395             }
10396             else {
10397                 vecstr = (U8*)"";
10398                 veclen = 0;
10399             }
10400         }
10401
10402         /* SIZE */
10403
10404         switch (*q) {
10405 #ifdef WIN32
10406         case 'I':                       /* Ix, I32x, and I64x */
10407 #  ifdef WIN64
10408             if (q[1] == '6' && q[2] == '4') {
10409                 q += 3;
10410                 intsize = 'q';
10411                 break;
10412             }
10413 #  endif
10414             if (q[1] == '3' && q[2] == '2') {
10415                 q += 3;
10416                 break;
10417             }
10418 #  ifdef WIN64
10419             intsize = 'q';
10420 #  endif
10421             q++;
10422             break;
10423 #endif
10424 #if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
10425         case 'L':                       /* Ld */
10426             /*FALLTHROUGH*/
10427 #ifdef HAS_QUAD
10428         case 'q':                       /* qd */
10429 #endif
10430             intsize = 'q';
10431             q++;
10432             break;
10433 #endif
10434         case 'l':
10435             ++q;
10436 #if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
10437             if (*q == 'l') {    /* lld, llf */
10438                 intsize = 'q';
10439                 ++q;
10440             }
10441             else
10442 #endif
10443                 intsize = 'l';
10444             break;
10445         case 'h':
10446             if (*++q == 'h') {  /* hhd, hhu */
10447                 intsize = 'c';
10448                 ++q;
10449             }
10450             else
10451                 intsize = 'h';
10452             break;
10453         case 'V':
10454         case 'z':
10455         case 't':
10456 #if HAS_C99
10457         case 'j':
10458 #endif
10459             intsize = *q++;
10460             break;
10461         }
10462
10463         /* CONVERSION */
10464
10465         if (*q == '%') {
10466             eptr = q++;
10467             elen = 1;
10468             if (vectorize) {
10469                 c = '%';
10470                 goto unknown;
10471             }
10472             goto string;
10473         }
10474
10475         if (!vectorize && !args) {
10476             if (efix) {
10477                 const I32 i = efix-1;
10478                 argsv = (i >= 0 && i < svmax)
10479                     ? svargs[i] : S_vcatpvfn_missing_argument(aTHX);
10480             } else {
10481                 argsv = (svix >= 0 && svix < svmax)
10482                     ? svargs[svix++] : S_vcatpvfn_missing_argument(aTHX);
10483             }
10484         }
10485
10486         switch (c = *q++) {
10487
10488             /* STRINGS */
10489
10490         case 'c':
10491             if (vectorize)
10492                 goto unknown;
10493             uv = (args) ? va_arg(*args, int) : SvIV(argsv);
10494             if ((uv > 255 ||
10495                  (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
10496                 && !IN_BYTES) {
10497                 eptr = (char*)utf8buf;
10498                 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
10499                 is_utf8 = TRUE;
10500             }
10501             else {
10502                 c = (char)uv;
10503                 eptr = &c;
10504                 elen = 1;
10505             }
10506             goto string;
10507
10508         case 's':
10509             if (vectorize)
10510                 goto unknown;
10511             if (args) {
10512                 eptr = va_arg(*args, char*);
10513                 if (eptr)
10514                     elen = strlen(eptr);
10515                 else {
10516                     eptr = (char *)nullstr;
10517                     elen = sizeof nullstr - 1;
10518                 }
10519             }
10520             else {
10521                 eptr = SvPV_const(argsv, elen);
10522                 if (DO_UTF8(argsv)) {
10523                     STRLEN old_precis = precis;
10524                     if (has_precis && precis < elen) {
10525                         STRLEN ulen = sv_len_utf8(argsv);
10526                         I32 p = precis > ulen ? ulen : precis;
10527                         sv_pos_u2b(argsv, &p, 0); /* sticks at end */
10528                         precis = p;
10529                     }
10530                     if (width) { /* fudge width (can't fudge elen) */
10531                         if (has_precis && precis < elen)
10532                             width += precis - old_precis;
10533                         else
10534                             width += elen - sv_len_utf8(argsv);
10535                     }
10536                     is_utf8 = TRUE;
10537                 }
10538             }
10539
10540         string:
10541             if (has_precis && precis < elen)
10542                 elen = precis;
10543             break;
10544
10545             /* INTEGERS */
10546
10547         case 'p':
10548             if (alt || vectorize)
10549                 goto unknown;
10550             uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
10551             base = 16;
10552             goto integer;
10553
10554         case 'D':
10555 #ifdef IV_IS_QUAD
10556             intsize = 'q';
10557 #else
10558             intsize = 'l';
10559 #endif
10560             /*FALLTHROUGH*/
10561         case 'd':
10562         case 'i':
10563 #if vdNUMBER
10564         format_vd:
10565 #endif
10566             if (vectorize) {
10567                 STRLEN ulen;
10568                 if (!veclen)
10569                     continue;
10570                 if (vec_utf8)
10571                     uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
10572                                         UTF8_ALLOW_ANYUV);
10573                 else {
10574                     uv = *vecstr;
10575                     ulen = 1;
10576                 }
10577                 vecstr += ulen;
10578                 veclen -= ulen;
10579                 if (plus)
10580                      esignbuf[esignlen++] = plus;
10581             }
10582             else if (args) {
10583                 switch (intsize) {
10584                 case 'c':       iv = (char)va_arg(*args, int); break;
10585                 case 'h':       iv = (short)va_arg(*args, int); break;
10586                 case 'l':       iv = va_arg(*args, long); break;
10587                 case 'V':       iv = va_arg(*args, IV); break;
10588                 case 'z':       iv = va_arg(*args, SSize_t); break;
10589                 case 't':       iv = va_arg(*args, ptrdiff_t); break;
10590                 default:        iv = va_arg(*args, int); break;
10591 #if HAS_C99
10592                 case 'j':       iv = va_arg(*args, intmax_t); break;
10593 #endif
10594                 case 'q':
10595 #ifdef HAS_QUAD
10596                                 iv = va_arg(*args, Quad_t); break;
10597 #else
10598                                 goto unknown;
10599 #endif
10600                 }
10601             }
10602             else {
10603                 IV tiv = SvIV(argsv); /* work around GCC bug #13488 */
10604                 switch (intsize) {
10605                 case 'c':       iv = (char)tiv; break;
10606                 case 'h':       iv = (short)tiv; break;
10607                 case 'l':       iv = (long)tiv; break;
10608                 case 'V':
10609                 default:        iv = tiv; break;
10610                 case 'q':
10611 #ifdef HAS_QUAD
10612                                 iv = (Quad_t)tiv; break;
10613 #else
10614                                 goto unknown;
10615 #endif
10616                 }
10617             }
10618             if ( !vectorize )   /* we already set uv above */
10619             {
10620                 if (iv >= 0) {
10621                     uv = iv;
10622                     if (plus)
10623                         esignbuf[esignlen++] = plus;
10624                 }
10625                 else {
10626                     uv = -iv;
10627                     esignbuf[esignlen++] = '-';
10628                 }
10629             }
10630             base = 10;
10631             goto integer;
10632
10633         case 'U':
10634 #ifdef IV_IS_QUAD
10635             intsize = 'q';
10636 #else
10637             intsize = 'l';
10638 #endif
10639             /*FALLTHROUGH*/
10640         case 'u':
10641             base = 10;
10642             goto uns_integer;
10643
10644         case 'B':
10645         case 'b':
10646             base = 2;
10647             goto uns_integer;
10648
10649         case 'O':
10650 #ifdef IV_IS_QUAD
10651             intsize = 'q';
10652 #else
10653             intsize = 'l';
10654 #endif
10655             /*FALLTHROUGH*/
10656         case 'o':
10657             base = 8;
10658             goto uns_integer;
10659
10660         case 'X':
10661         case 'x':
10662             base = 16;
10663
10664         uns_integer:
10665             if (vectorize) {
10666                 STRLEN ulen;
10667         vector:
10668                 if (!veclen)
10669                     continue;
10670                 if (vec_utf8)
10671                     uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
10672                                         UTF8_ALLOW_ANYUV);
10673                 else {
10674                     uv = *vecstr;
10675                     ulen = 1;
10676                 }
10677                 vecstr += ulen;
10678                 veclen -= ulen;
10679             }
10680             else if (args) {
10681                 switch (intsize) {
10682                 case 'c':  uv = (unsigned char)va_arg(*args, unsigned); break;
10683                 case 'h':  uv = (unsigned short)va_arg(*args, unsigned); break;
10684                 case 'l':  uv = va_arg(*args, unsigned long); break;
10685                 case 'V':  uv = va_arg(*args, UV); break;
10686                 case 'z':  uv = va_arg(*args, Size_t); break;
10687                 case 't':  uv = va_arg(*args, ptrdiff_t); break; /* will sign extend, but there is no uptrdiff_t, so oh well */
10688 #if HAS_C99
10689                 case 'j':  uv = va_arg(*args, uintmax_t); break;
10690 #endif
10691                 default:   uv = va_arg(*args, unsigned); break;
10692                 case 'q':
10693 #ifdef HAS_QUAD
10694                            uv = va_arg(*args, Uquad_t); break;
10695 #else
10696                            goto unknown;
10697 #endif
10698                 }
10699             }
10700             else {
10701                 UV tuv = SvUV(argsv); /* work around GCC bug #13488 */
10702                 switch (intsize) {
10703                 case 'c':       uv = (unsigned char)tuv; break;
10704                 case 'h':       uv = (unsigned short)tuv; break;
10705                 case 'l':       uv = (unsigned long)tuv; break;
10706                 case 'V':
10707                 default:        uv = tuv; break;
10708                 case 'q':
10709 #ifdef HAS_QUAD
10710                                 uv = (Uquad_t)tuv; break;
10711 #else
10712                                 goto unknown;
10713 #endif
10714                 }
10715             }
10716
10717         integer:
10718             {
10719                 char *ptr = ebuf + sizeof ebuf;
10720                 bool tempalt = uv ? alt : FALSE; /* Vectors can't change alt */
10721                 zeros = 0;
10722
10723                 switch (base) {
10724                     unsigned dig;
10725                 case 16:
10726                     p = (char *)((c == 'X') ? PL_hexdigit + 16 : PL_hexdigit);
10727                     do {
10728                         dig = uv & 15;
10729                         *--ptr = p[dig];
10730                     } while (uv >>= 4);
10731                     if (tempalt) {
10732                         esignbuf[esignlen++] = '0';
10733                         esignbuf[esignlen++] = c;  /* 'x' or 'X' */
10734                     }
10735                     break;
10736                 case 8:
10737                     do {
10738                         dig = uv & 7;
10739                         *--ptr = '0' + dig;
10740                     } while (uv >>= 3);
10741                     if (alt && *ptr != '0')
10742                         *--ptr = '0';
10743                     break;
10744                 case 2:
10745                     do {
10746                         dig = uv & 1;
10747                         *--ptr = '0' + dig;
10748                     } while (uv >>= 1);
10749                     if (tempalt) {
10750                         esignbuf[esignlen++] = '0';
10751                         esignbuf[esignlen++] = c;
10752                     }
10753                     break;
10754                 default:                /* it had better be ten or less */
10755                     do {
10756                         dig = uv % base;
10757                         *--ptr = '0' + dig;
10758                     } while (uv /= base);
10759                     break;
10760                 }
10761                 elen = (ebuf + sizeof ebuf) - ptr;
10762                 eptr = ptr;
10763                 if (has_precis) {
10764                     if (precis > elen)
10765                         zeros = precis - elen;
10766                     else if (precis == 0 && elen == 1 && *eptr == '0'
10767                              && !(base == 8 && alt)) /* "%#.0o" prints "0" */
10768                         elen = 0;
10769
10770                 /* a precision nullifies the 0 flag. */
10771                     if (fill == '0')
10772                         fill = ' ';
10773                 }
10774             }
10775             break;
10776
10777             /* FLOATING POINT */
10778
10779         case 'F':
10780             c = 'f';            /* maybe %F isn't supported here */
10781             /*FALLTHROUGH*/
10782         case 'e': case 'E':
10783         case 'f':
10784         case 'g': case 'G':
10785             if (vectorize)
10786                 goto unknown;
10787
10788             /* This is evil, but floating point is even more evil */
10789
10790             /* for SV-style calling, we can only get NV
10791                for C-style calling, we assume %f is double;
10792                for simplicity we allow any of %Lf, %llf, %qf for long double
10793             */
10794             switch (intsize) {
10795             case 'V':
10796 #if defined(USE_LONG_DOUBLE)
10797                 intsize = 'q';
10798 #endif
10799                 break;
10800 /* [perl #20339] - we should accept and ignore %lf rather than die */
10801             case 'l':
10802                 /*FALLTHROUGH*/
10803             default:
10804 #if defined(USE_LONG_DOUBLE)
10805                 intsize = args ? 0 : 'q';
10806 #endif
10807                 break;
10808             case 'q':
10809 #if defined(HAS_LONG_DOUBLE)
10810                 break;
10811 #else
10812                 /*FALLTHROUGH*/
10813 #endif
10814             case 'c':
10815             case 'h':
10816             case 'z':
10817             case 't':
10818             case 'j':
10819                 goto unknown;
10820             }
10821
10822             /* now we need (long double) if intsize == 'q', else (double) */
10823             nv = (args) ?
10824 #if LONG_DOUBLESIZE > DOUBLESIZE
10825                 intsize == 'q' ?
10826                     va_arg(*args, long double) :
10827                     va_arg(*args, double)
10828 #else
10829                     va_arg(*args, double)
10830 #endif
10831                 : SvNV(argsv);
10832
10833             need = 0;
10834             /* nv * 0 will be NaN for NaN, +Inf and -Inf, and 0 for anything
10835                else. frexp() has some unspecified behaviour for those three */
10836             if (c != 'e' && c != 'E' && (nv * 0) == 0) {
10837                 i = PERL_INT_MIN;
10838                 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
10839                    will cast our (long double) to (double) */
10840                 (void)Perl_frexp(nv, &i);
10841                 if (i == PERL_INT_MIN)
10842                     Perl_die(aTHX_ "panic: frexp");
10843                 if (i > 0)
10844                     need = BIT_DIGITS(i);
10845             }
10846             need += has_precis ? precis : 6; /* known default */
10847
10848             if (need < width)
10849                 need = width;
10850
10851 #ifdef HAS_LDBL_SPRINTF_BUG
10852             /* This is to try to fix a bug with irix/nonstop-ux/powerux and
10853                with sfio - Allen <allens@cpan.org> */
10854
10855 #  ifdef DBL_MAX
10856 #    define MY_DBL_MAX DBL_MAX
10857 #  else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
10858 #    if DOUBLESIZE >= 8
10859 #      define MY_DBL_MAX 1.7976931348623157E+308L
10860 #    else
10861 #      define MY_DBL_MAX 3.40282347E+38L
10862 #    endif
10863 #  endif
10864
10865 #  ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
10866 #    define MY_DBL_MAX_BUG 1L
10867 #  else
10868 #    define MY_DBL_MAX_BUG MY_DBL_MAX
10869 #  endif
10870
10871 #  ifdef DBL_MIN
10872 #    define MY_DBL_MIN DBL_MIN
10873 #  else  /* XXX guessing! -Allen */
10874 #    if DOUBLESIZE >= 8
10875 #      define MY_DBL_MIN 2.2250738585072014E-308L
10876 #    else
10877 #      define MY_DBL_MIN 1.17549435E-38L
10878 #    endif
10879 #  endif
10880
10881             if ((intsize == 'q') && (c == 'f') &&
10882                 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
10883                 (need < DBL_DIG)) {
10884                 /* it's going to be short enough that
10885                  * long double precision is not needed */
10886
10887                 if ((nv <= 0L) && (nv >= -0L))
10888                     fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
10889                 else {
10890                     /* would use Perl_fp_class as a double-check but not
10891                      * functional on IRIX - see perl.h comments */
10892
10893                     if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
10894                         /* It's within the range that a double can represent */
10895 #if defined(DBL_MAX) && !defined(DBL_MIN)
10896                         if ((nv >= ((long double)1/DBL_MAX)) ||
10897                             (nv <= (-(long double)1/DBL_MAX)))
10898 #endif
10899                         fix_ldbl_sprintf_bug = TRUE;
10900                     }
10901                 }
10902                 if (fix_ldbl_sprintf_bug == TRUE) {
10903                     double temp;
10904
10905                     intsize = 0;
10906                     temp = (double)nv;
10907                     nv = (NV)temp;
10908                 }
10909             }
10910
10911 #  undef MY_DBL_MAX
10912 #  undef MY_DBL_MAX_BUG
10913 #  undef MY_DBL_MIN
10914
10915 #endif /* HAS_LDBL_SPRINTF_BUG */
10916
10917             need += 20; /* fudge factor */
10918             if (PL_efloatsize < need) {
10919                 Safefree(PL_efloatbuf);
10920                 PL_efloatsize = need + 20; /* more fudge */
10921                 Newx(PL_efloatbuf, PL_efloatsize, char);
10922                 PL_efloatbuf[0] = '\0';
10923             }
10924
10925             if ( !(width || left || plus || alt) && fill != '0'
10926                  && has_precis && intsize != 'q' ) {    /* Shortcuts */
10927                 /* See earlier comment about buggy Gconvert when digits,
10928                    aka precis is 0  */
10929                 if ( c == 'g' && precis) {
10930                     Gconvert((NV)nv, (int)precis, 0, PL_efloatbuf);
10931                     /* May return an empty string for digits==0 */
10932                     if (*PL_efloatbuf) {
10933                         elen = strlen(PL_efloatbuf);
10934                         goto float_converted;
10935                     }
10936                 } else if ( c == 'f' && !precis) {
10937                     if ((eptr = F0convert(nv, ebuf + sizeof ebuf, &elen)))
10938                         break;
10939                 }
10940             }
10941             {
10942                 char *ptr = ebuf + sizeof ebuf;
10943                 *--ptr = '\0';
10944                 *--ptr = c;
10945                 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
10946 #if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
10947                 if (intsize == 'q') {
10948                     /* Copy the one or more characters in a long double
10949                      * format before the 'base' ([efgEFG]) character to
10950                      * the format string. */
10951                     static char const prifldbl[] = PERL_PRIfldbl;
10952                     char const *p = prifldbl + sizeof(prifldbl) - 3;
10953                     while (p >= prifldbl) { *--ptr = *p--; }
10954                 }
10955 #endif
10956                 if (has_precis) {
10957                     base = precis;
10958                     do { *--ptr = '0' + (base % 10); } while (base /= 10);
10959                     *--ptr = '.';
10960                 }
10961                 if (width) {
10962                     base = width;
10963                     do { *--ptr = '0' + (base % 10); } while (base /= 10);
10964                 }
10965                 if (fill == '0')
10966                     *--ptr = fill;
10967                 if (left)
10968                     *--ptr = '-';
10969                 if (plus)
10970                     *--ptr = plus;
10971                 if (alt)
10972                     *--ptr = '#';
10973                 *--ptr = '%';
10974
10975                 /* No taint.  Otherwise we are in the strange situation
10976                  * where printf() taints but print($float) doesn't.
10977                  * --jhi */
10978 #if defined(HAS_LONG_DOUBLE)
10979                 elen = ((intsize == 'q')
10980                         ? my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, nv)
10981                         : my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, (double)nv));
10982 #else
10983                 elen = my_sprintf(PL_efloatbuf, ptr, nv);
10984 #endif
10985             }
10986         float_converted:
10987             eptr = PL_efloatbuf;
10988             break;
10989
10990             /* SPECIAL */
10991
10992         case 'n':
10993             if (vectorize)
10994                 goto unknown;
10995             i = SvCUR(sv) - origlen;
10996             if (args) {
10997                 switch (intsize) {
10998                 case 'c':       *(va_arg(*args, char*)) = i; break;
10999                 case 'h':       *(va_arg(*args, short*)) = i; break;
11000                 default:        *(va_arg(*args, int*)) = i; break;
11001                 case 'l':       *(va_arg(*args, long*)) = i; break;
11002                 case 'V':       *(va_arg(*args, IV*)) = i; break;
11003                 case 'z':       *(va_arg(*args, SSize_t*)) = i; break;
11004                 case 't':       *(va_arg(*args, ptrdiff_t*)) = i; break;
11005 #if HAS_C99
11006                 case 'j':       *(va_arg(*args, intmax_t*)) = i; break;
11007 #endif
11008                 case 'q':
11009 #ifdef HAS_QUAD
11010                                 *(va_arg(*args, Quad_t*)) = i; break;
11011 #else
11012                                 goto unknown;
11013 #endif
11014                 }
11015             }
11016             else
11017                 sv_setuv_mg(argsv, has_utf8 ? (UV)sv_len_utf8(sv) : (UV)i);
11018             continue;   /* not "break" */
11019
11020             /* UNKNOWN */
11021
11022         default:
11023       unknown:
11024             if (!args
11025                 && (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)
11026                 && ckWARN(WARN_PRINTF))
11027             {
11028                 SV * const msg = sv_newmortal();
11029                 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
11030                           (PL_op->op_type == OP_PRTF) ? "" : "s");
11031                 if (fmtstart < patend) {
11032                     const char * const fmtend = q < patend ? q : patend;
11033                     const char * f;
11034                     sv_catpvs(msg, "\"%");
11035                     for (f = fmtstart; f < fmtend; f++) {
11036                         if (isPRINT(*f)) {
11037                             sv_catpvn(msg, f, 1);
11038                         } else {
11039                             Perl_sv_catpvf(aTHX_ msg,
11040                                            "\\%03"UVof, (UV)*f & 0xFF);
11041                         }
11042                     }
11043                     sv_catpvs(msg, "\"");
11044                 } else {
11045                     sv_catpvs(msg, "end of string");
11046                 }
11047                 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, SVfARG(msg)); /* yes, this is reentrant */
11048             }
11049
11050             /* output mangled stuff ... */
11051             if (c == '\0')
11052                 --q;
11053             eptr = p;
11054             elen = q - p;
11055
11056             /* ... right here, because formatting flags should not apply */
11057             SvGROW(sv, SvCUR(sv) + elen + 1);
11058             p = SvEND(sv);
11059             Copy(eptr, p, elen, char);
11060             p += elen;
11061             *p = '\0';
11062             SvCUR_set(sv, p - SvPVX_const(sv));
11063             svix = osvix;
11064             continue;   /* not "break" */
11065         }
11066
11067         if (is_utf8 != has_utf8) {
11068             if (is_utf8) {
11069                 if (SvCUR(sv))
11070                     sv_utf8_upgrade(sv);
11071             }
11072             else {
11073                 const STRLEN old_elen = elen;
11074                 SV * const nsv = newSVpvn_flags(eptr, elen, SVs_TEMP);
11075                 sv_utf8_upgrade(nsv);
11076                 eptr = SvPVX_const(nsv);
11077                 elen = SvCUR(nsv);
11078
11079                 if (width) { /* fudge width (can't fudge elen) */
11080                     width += elen - old_elen;
11081                 }
11082                 is_utf8 = TRUE;
11083             }
11084         }
11085
11086         have = esignlen + zeros + elen;
11087         if (have < zeros)
11088             Perl_croak_nocontext("%s", PL_memory_wrap);
11089
11090         need = (have > width ? have : width);
11091         gap = need - have;
11092
11093         if (need >= (((STRLEN)~0) - SvCUR(sv) - dotstrlen - 1))
11094             Perl_croak_nocontext("%s", PL_memory_wrap);
11095         SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
11096         p = SvEND(sv);
11097         if (esignlen && fill == '0') {
11098             int i;
11099             for (i = 0; i < (int)esignlen; i++)
11100                 *p++ = esignbuf[i];
11101         }
11102         if (gap && !left) {
11103             memset(p, fill, gap);
11104             p += gap;
11105         }
11106         if (esignlen && fill != '0') {
11107             int i;
11108             for (i = 0; i < (int)esignlen; i++)
11109                 *p++ = esignbuf[i];
11110         }
11111         if (zeros) {
11112             int i;
11113             for (i = zeros; i; i--)
11114                 *p++ = '0';
11115         }
11116         if (elen) {
11117             Copy(eptr, p, elen, char);
11118             p += elen;
11119         }
11120         if (gap && left) {
11121             memset(p, ' ', gap);
11122             p += gap;
11123         }
11124         if (vectorize) {
11125             if (veclen) {
11126                 Copy(dotstr, p, dotstrlen, char);
11127                 p += dotstrlen;
11128             }
11129             else
11130                 vectorize = FALSE;              /* done iterating over vecstr */
11131         }
11132         if (is_utf8)
11133             has_utf8 = TRUE;
11134         if (has_utf8)
11135             SvUTF8_on(sv);
11136         *p = '\0';
11137         SvCUR_set(sv, p - SvPVX_const(sv));
11138         if (vectorize) {
11139             esignlen = 0;
11140             goto vector;
11141         }
11142     }
11143     SvTAINT(sv);
11144 }
11145
11146 /* =========================================================================
11147
11148 =head1 Cloning an interpreter
11149
11150 All the macros and functions in this section are for the private use of
11151 the main function, perl_clone().
11152
11153 The foo_dup() functions make an exact copy of an existing foo thingy.
11154 During the course of a cloning, a hash table is used to map old addresses
11155 to new addresses.  The table is created and manipulated with the
11156 ptr_table_* functions.
11157
11158 =cut
11159
11160  * =========================================================================*/
11161
11162
11163 #if defined(USE_ITHREADS)
11164
11165 /* XXX Remove this so it doesn't have to go thru the macro and return for nothing */
11166 #ifndef GpREFCNT_inc
11167 #  define GpREFCNT_inc(gp)      ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
11168 #endif
11169
11170
11171 /* Certain cases in Perl_ss_dup have been merged, by relying on the fact
11172    that currently av_dup, gv_dup and hv_dup are the same as sv_dup.
11173    If this changes, please unmerge ss_dup.
11174    Likewise, sv_dup_inc_multiple() relies on this fact.  */
11175 #define sv_dup_inc_NN(s,t)      SvREFCNT_inc_NN(sv_dup_inc(s,t))
11176 #define av_dup(s,t)     MUTABLE_AV(sv_dup((const SV *)s,t))
11177 #define av_dup_inc(s,t) MUTABLE_AV(sv_dup_inc((const SV *)s,t))
11178 #define hv_dup(s,t)     MUTABLE_HV(sv_dup((const SV *)s,t))
11179 #define hv_dup_inc(s,t) MUTABLE_HV(sv_dup_inc((const SV *)s,t))
11180 #define cv_dup(s,t)     MUTABLE_CV(sv_dup((const SV *)s,t))
11181 #define cv_dup_inc(s,t) MUTABLE_CV(sv_dup_inc((const SV *)s,t))
11182 #define io_dup(s,t)     MUTABLE_IO(sv_dup((const SV *)s,t))
11183 #define io_dup_inc(s,t) MUTABLE_IO(sv_dup_inc((const SV *)s,t))
11184 #define gv_dup(s,t)     MUTABLE_GV(sv_dup((const SV *)s,t))
11185 #define gv_dup_inc(s,t) MUTABLE_GV(sv_dup_inc((const SV *)s,t))
11186 #define SAVEPV(p)       ((p) ? savepv(p) : NULL)
11187 #define SAVEPVN(p,n)    ((p) ? savepvn(p,n) : NULL)
11188
11189 /* clone a parser */
11190
11191 yy_parser *
11192 Perl_parser_dup(pTHX_ const yy_parser *const proto, CLONE_PARAMS *const param)
11193 {
11194     yy_parser *parser;
11195
11196     PERL_ARGS_ASSERT_PARSER_DUP;
11197
11198     if (!proto)
11199         return NULL;
11200
11201     /* look for it in the table first */
11202     parser = (yy_parser *)ptr_table_fetch(PL_ptr_table, proto);
11203     if (parser)
11204         return parser;
11205
11206     /* create anew and remember what it is */
11207     Newxz(parser, 1, yy_parser);
11208     ptr_table_store(PL_ptr_table, proto, parser);
11209
11210     /* XXX these not yet duped */
11211     parser->old_parser = NULL;
11212     parser->stack = NULL;
11213     parser->ps = NULL;
11214     parser->stack_size = 0;
11215     /* XXX parser->stack->state = 0; */
11216
11217     /* XXX eventually, just Copy() most of the parser struct ? */
11218
11219     parser->lex_brackets = proto->lex_brackets;
11220     parser->lex_casemods = proto->lex_casemods;
11221     parser->lex_brackstack = savepvn(proto->lex_brackstack,
11222                     (proto->lex_brackets < 120 ? 120 : proto->lex_brackets));
11223     parser->lex_casestack = savepvn(proto->lex_casestack,
11224                     (proto->lex_casemods < 12 ? 12 : proto->lex_casemods));
11225     parser->lex_defer   = proto->lex_defer;
11226     parser->lex_dojoin  = proto->lex_dojoin;
11227     parser->lex_expect  = proto->lex_expect;
11228     parser->lex_formbrack = proto->lex_formbrack;
11229     parser->lex_inpat   = proto->lex_inpat;
11230     parser->lex_inwhat  = proto->lex_inwhat;
11231     parser->lex_op      = proto->lex_op;
11232     parser->lex_repl    = sv_dup_inc(proto->lex_repl, param);
11233     parser->lex_starts  = proto->lex_starts;
11234     parser->lex_stuff   = sv_dup_inc(proto->lex_stuff, param);
11235     parser->multi_close = proto->multi_close;
11236     parser->multi_open  = proto->multi_open;
11237     parser->multi_start = proto->multi_start;
11238     parser->multi_end   = proto->multi_end;
11239     parser->pending_ident = proto->pending_ident;
11240     parser->preambled   = proto->preambled;
11241     parser->sublex_info = proto->sublex_info; /* XXX not quite right */
11242     parser->linestr     = sv_dup_inc(proto->linestr, param);
11243     parser->expect      = proto->expect;
11244     parser->copline     = proto->copline;
11245     parser->last_lop_op = proto->last_lop_op;
11246     parser->lex_state   = proto->lex_state;
11247     parser->rsfp        = fp_dup(proto->rsfp, '<', param);
11248     /* rsfp_filters entries have fake IoDIRP() */
11249     parser->rsfp_filters= av_dup_inc(proto->rsfp_filters, param);
11250     parser->in_my       = proto->in_my;
11251     parser->in_my_stash = hv_dup(proto->in_my_stash, param);
11252     parser->error_count = proto->error_count;
11253
11254
11255     parser->linestr     = sv_dup_inc(proto->linestr, param);
11256
11257     {
11258         char * const ols = SvPVX(proto->linestr);
11259         char * const ls  = SvPVX(parser->linestr);
11260
11261         parser->bufptr      = ls + (proto->bufptr >= ols ?
11262                                     proto->bufptr -  ols : 0);
11263         parser->oldbufptr   = ls + (proto->oldbufptr >= ols ?
11264                                     proto->oldbufptr -  ols : 0);
11265         parser->oldoldbufptr= ls + (proto->oldoldbufptr >= ols ?
11266                                     proto->oldoldbufptr -  ols : 0);
11267         parser->linestart   = ls + (proto->linestart >= ols ?
11268                                     proto->linestart -  ols : 0);
11269         parser->last_uni    = ls + (proto->last_uni >= ols ?
11270                                     proto->last_uni -  ols : 0);
11271         parser->last_lop    = ls + (proto->last_lop >= ols ?
11272                                     proto->last_lop -  ols : 0);
11273
11274         parser->bufend      = ls + SvCUR(parser->linestr);
11275     }
11276
11277     Copy(proto->tokenbuf, parser->tokenbuf, 256, char);
11278
11279
11280 #ifdef PERL_MAD
11281     parser->endwhite    = proto->endwhite;
11282     parser->faketokens  = proto->faketokens;
11283     parser->lasttoke    = proto->lasttoke;
11284     parser->nextwhite   = proto->nextwhite;
11285     parser->realtokenstart = proto->realtokenstart;
11286     parser->skipwhite   = proto->skipwhite;
11287     parser->thisclose   = proto->thisclose;
11288     parser->thismad     = proto->thismad;
11289     parser->thisopen    = proto->thisopen;
11290     parser->thisstuff   = proto->thisstuff;
11291     parser->thistoken   = proto->thistoken;
11292     parser->thiswhite   = proto->thiswhite;
11293
11294     Copy(proto->nexttoke, parser->nexttoke, 5, NEXTTOKE);
11295     parser->curforce    = proto->curforce;
11296 #else
11297     Copy(proto->nextval, parser->nextval, 5, YYSTYPE);
11298     Copy(proto->nexttype, parser->nexttype, 5,  I32);
11299     parser->nexttoke    = proto->nexttoke;
11300 #endif
11301
11302     /* XXX should clone saved_curcop here, but we aren't passed
11303      * proto_perl; so do it in perl_clone_using instead */
11304
11305     return parser;
11306 }
11307
11308
11309 /* duplicate a file handle */
11310
11311 PerlIO *
11312 Perl_fp_dup(pTHX_ PerlIO *const fp, const char type, CLONE_PARAMS *const param)
11313 {
11314     PerlIO *ret;
11315
11316     PERL_ARGS_ASSERT_FP_DUP;
11317     PERL_UNUSED_ARG(type);
11318
11319     if (!fp)
11320         return (PerlIO*)NULL;
11321
11322     /* look for it in the table first */
11323     ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
11324     if (ret)
11325         return ret;
11326
11327     /* create anew and remember what it is */
11328     ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
11329     ptr_table_store(PL_ptr_table, fp, ret);
11330     return ret;
11331 }
11332
11333 /* duplicate a directory handle */
11334
11335 DIR *
11336 Perl_dirp_dup(pTHX_ DIR *const dp, CLONE_PARAMS *const param)
11337 {
11338     DIR *ret;
11339
11340 #ifdef HAS_FCHDIR
11341     DIR *pwd;
11342     register const Direntry_t *dirent;
11343     char smallbuf[256];
11344     char *name = NULL;
11345     STRLEN len = 0;
11346     long pos;
11347 #endif
11348
11349     PERL_UNUSED_CONTEXT;
11350     PERL_ARGS_ASSERT_DIRP_DUP;
11351
11352     if (!dp)
11353         return (DIR*)NULL;
11354
11355     /* look for it in the table first */
11356     ret = (DIR*)ptr_table_fetch(PL_ptr_table, dp);
11357     if (ret)
11358         return ret;
11359
11360 #ifdef HAS_FCHDIR
11361
11362     PERL_UNUSED_ARG(param);
11363
11364     /* create anew */
11365
11366     /* open the current directory (so we can switch back) */
11367     if (!(pwd = PerlDir_open("."))) return (DIR *)NULL;
11368
11369     /* chdir to our dir handle and open the present working directory */
11370     if (fchdir(my_dirfd(dp)) < 0 || !(ret = PerlDir_open("."))) {
11371         PerlDir_close(pwd);
11372         return (DIR *)NULL;
11373     }
11374     /* Now we should have two dir handles pointing to the same dir. */
11375
11376     /* Be nice to the calling code and chdir back to where we were. */
11377     fchdir(my_dirfd(pwd)); /* If this fails, then what? */
11378
11379     /* We have no need of the pwd handle any more. */
11380     PerlDir_close(pwd);
11381
11382 #ifdef DIRNAMLEN
11383 # define d_namlen(d) (d)->d_namlen
11384 #else
11385 # define d_namlen(d) strlen((d)->d_name)
11386 #endif
11387     /* Iterate once through dp, to get the file name at the current posi-
11388        tion. Then step back. */
11389     pos = PerlDir_tell(dp);
11390     if ((dirent = PerlDir_read(dp))) {
11391         len = d_namlen(dirent);
11392         if (len <= sizeof smallbuf) name = smallbuf;
11393         else Newx(name, len, char);
11394         Move(dirent->d_name, name, len, char);
11395     }
11396     PerlDir_seek(dp, pos);
11397
11398     /* Iterate through the new dir handle, till we find a file with the
11399        right name. */
11400     if (!dirent) /* just before the end */
11401         for(;;) {
11402             pos = PerlDir_tell(ret);
11403             if (PerlDir_read(ret)) continue; /* not there yet */
11404             PerlDir_seek(ret, pos); /* step back */
11405             break;
11406         }
11407     else {
11408         const long pos0 = PerlDir_tell(ret);
11409         for(;;) {
11410             pos = PerlDir_tell(ret);
11411             if ((dirent = PerlDir_read(ret))) {
11412                 if (len == d_namlen(dirent)
11413                  && memEQ(name, dirent->d_name, len)) {
11414                     /* found it */
11415                     PerlDir_seek(ret, pos); /* step back */
11416                     break;
11417                 }
11418                 /* else we are not there yet; keep iterating */
11419             }
11420             else { /* This is not meant to happen. The best we can do is
11421                       reset the iterator to the beginning. */
11422                 PerlDir_seek(ret, pos0);
11423                 break;
11424             }
11425         }
11426     }
11427 #undef d_namlen
11428
11429     if (name && name != smallbuf)
11430         Safefree(name);
11431 #endif
11432
11433 #ifdef WIN32
11434     ret = win32_dirp_dup(dp, param);
11435 #endif
11436
11437     /* pop it in the pointer table */
11438     if (ret)
11439         ptr_table_store(PL_ptr_table, dp, ret);
11440
11441     return ret;
11442 }
11443
11444 /* duplicate a typeglob */
11445
11446 GP *
11447 Perl_gp_dup(pTHX_ GP *const gp, CLONE_PARAMS *const param)
11448 {
11449     GP *ret;
11450
11451     PERL_ARGS_ASSERT_GP_DUP;
11452
11453     if (!gp)
11454         return (GP*)NULL;
11455     /* look for it in the table first */
11456     ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
11457     if (ret)
11458         return ret;
11459
11460     /* create anew and remember what it is */
11461     Newxz(ret, 1, GP);
11462     ptr_table_store(PL_ptr_table, gp, ret);
11463
11464     /* clone */
11465     /* ret->gp_refcnt must be 0 before any other dups are called. We're relying
11466        on Newxz() to do this for us.  */
11467     ret->gp_sv          = sv_dup_inc(gp->gp_sv, param);
11468     ret->gp_io          = io_dup_inc(gp->gp_io, param);
11469     ret->gp_form        = cv_dup_inc(gp->gp_form, param);
11470     ret->gp_av          = av_dup_inc(gp->gp_av, param);
11471     ret->gp_hv          = hv_dup_inc(gp->gp_hv, param);
11472     ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
11473     ret->gp_cv          = cv_dup_inc(gp->gp_cv, param);
11474     ret->gp_cvgen       = gp->gp_cvgen;
11475     ret->gp_line        = gp->gp_line;
11476     ret->gp_file_hek    = hek_dup(gp->gp_file_hek, param);
11477     return ret;
11478 }
11479
11480 /* duplicate a chain of magic */
11481
11482 MAGIC *
11483 Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS *const param)
11484 {
11485     MAGIC *mgret = NULL;
11486     MAGIC **mgprev_p = &mgret;
11487
11488     PERL_ARGS_ASSERT_MG_DUP;
11489
11490     for (; mg; mg = mg->mg_moremagic) {
11491         MAGIC *nmg;
11492
11493         if ((param->flags & CLONEf_JOIN_IN)
11494                 && mg->mg_type == PERL_MAGIC_backref)
11495             /* when joining, we let the individual SVs add themselves to
11496              * backref as needed. */
11497             continue;
11498
11499         Newx(nmg, 1, MAGIC);
11500         *mgprev_p = nmg;
11501         mgprev_p = &(nmg->mg_moremagic);
11502
11503         /* There was a comment "XXX copy dynamic vtable?" but as we don't have
11504            dynamic vtables, I'm not sure why Sarathy wrote it. The comment dates
11505            from the original commit adding Perl_mg_dup() - revision 4538.
11506            Similarly there is the annotation "XXX random ptr?" next to the
11507            assignment to nmg->mg_ptr.  */
11508         *nmg = *mg;
11509
11510         /* FIXME for plugins
11511         if (nmg->mg_type == PERL_MAGIC_qr) {
11512             nmg->mg_obj = MUTABLE_SV(CALLREGDUPE((REGEXP*)nmg->mg_obj, param));
11513         }
11514         else
11515         */
11516         nmg->mg_obj = (nmg->mg_flags & MGf_REFCOUNTED)
11517                           ? nmg->mg_type == PERL_MAGIC_backref
11518                                 /* The backref AV has its reference
11519                                  * count deliberately bumped by 1 */
11520                                 ? SvREFCNT_inc(av_dup_inc((const AV *)
11521                                                     nmg->mg_obj, param))
11522                                 : sv_dup_inc(nmg->mg_obj, param)
11523                           : sv_dup(nmg->mg_obj, param);
11524
11525         if (nmg->mg_ptr && nmg->mg_type != PERL_MAGIC_regex_global) {
11526             if (nmg->mg_len > 0) {
11527                 nmg->mg_ptr     = SAVEPVN(nmg->mg_ptr, nmg->mg_len);
11528                 if (nmg->mg_type == PERL_MAGIC_overload_table &&
11529                         AMT_AMAGIC((AMT*)nmg->mg_ptr))
11530                 {
11531                     AMT * const namtp = (AMT*)nmg->mg_ptr;
11532                     sv_dup_inc_multiple((SV**)(namtp->table),
11533                                         (SV**)(namtp->table), NofAMmeth, param);
11534                 }
11535             }
11536             else if (nmg->mg_len == HEf_SVKEY)
11537                 nmg->mg_ptr = (char*)sv_dup_inc((const SV *)nmg->mg_ptr, param);
11538         }
11539         if ((nmg->mg_flags & MGf_DUP) && nmg->mg_virtual && nmg->mg_virtual->svt_dup) {
11540             nmg->mg_virtual->svt_dup(aTHX_ nmg, param);
11541         }
11542     }
11543     return mgret;
11544 }
11545
11546 #endif /* USE_ITHREADS */
11547
11548 struct ptr_tbl_arena {
11549     struct ptr_tbl_arena *next;
11550     struct ptr_tbl_ent array[1023/3]; /* as ptr_tbl_ent has 3 pointers.  */
11551 };
11552
11553 /* create a new pointer-mapping table */
11554
11555 PTR_TBL_t *
11556 Perl_ptr_table_new(pTHX)
11557 {
11558     PTR_TBL_t *tbl;
11559     PERL_UNUSED_CONTEXT;
11560
11561     Newx(tbl, 1, PTR_TBL_t);
11562     tbl->tbl_max        = 511;
11563     tbl->tbl_items      = 0;
11564     tbl->tbl_arena      = NULL;
11565     tbl->tbl_arena_next = NULL;
11566     tbl->tbl_arena_end  = NULL;
11567     Newxz(tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
11568     return tbl;
11569 }
11570
11571 #define PTR_TABLE_HASH(ptr) \
11572   ((PTR2UV(ptr) >> 3) ^ (PTR2UV(ptr) >> (3 + 7)) ^ (PTR2UV(ptr) >> (3 + 17)))
11573
11574 /* map an existing pointer using a table */
11575
11576 STATIC PTR_TBL_ENT_t *
11577 S_ptr_table_find(PTR_TBL_t *const tbl, const void *const sv)
11578 {
11579     PTR_TBL_ENT_t *tblent;
11580     const UV hash = PTR_TABLE_HASH(sv);
11581
11582     PERL_ARGS_ASSERT_PTR_TABLE_FIND;
11583
11584     tblent = tbl->tbl_ary[hash & tbl->tbl_max];
11585     for (; tblent; tblent = tblent->next) {
11586         if (tblent->oldval == sv)
11587             return tblent;
11588     }
11589     return NULL;
11590 }
11591
11592 void *
11593 Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *const tbl, const void *const sv)
11594 {
11595     PTR_TBL_ENT_t const *const tblent = ptr_table_find(tbl, sv);
11596
11597     PERL_ARGS_ASSERT_PTR_TABLE_FETCH;
11598     PERL_UNUSED_CONTEXT;
11599
11600     return tblent ? tblent->newval : NULL;
11601 }
11602
11603 /* add a new entry to a pointer-mapping table */
11604
11605 void
11606 Perl_ptr_table_store(pTHX_ PTR_TBL_t *const tbl, const void *const oldsv, void *const newsv)
11607 {
11608     PTR_TBL_ENT_t *tblent = ptr_table_find(tbl, oldsv);
11609
11610     PERL_ARGS_ASSERT_PTR_TABLE_STORE;
11611     PERL_UNUSED_CONTEXT;
11612
11613     if (tblent) {
11614         tblent->newval = newsv;
11615     } else {
11616         const UV entry = PTR_TABLE_HASH(oldsv) & tbl->tbl_max;
11617
11618         if (tbl->tbl_arena_next == tbl->tbl_arena_end) {
11619             struct ptr_tbl_arena *new_arena;
11620
11621             Newx(new_arena, 1, struct ptr_tbl_arena);
11622             new_arena->next = tbl->tbl_arena;
11623             tbl->tbl_arena = new_arena;
11624             tbl->tbl_arena_next = new_arena->array;
11625             tbl->tbl_arena_end = new_arena->array
11626                 + sizeof(new_arena->array) / sizeof(new_arena->array[0]);
11627         }
11628
11629         tblent = tbl->tbl_arena_next++;
11630
11631         tblent->oldval = oldsv;
11632         tblent->newval = newsv;
11633         tblent->next = tbl->tbl_ary[entry];
11634         tbl->tbl_ary[entry] = tblent;
11635         tbl->tbl_items++;
11636         if (tblent->next && tbl->tbl_items > tbl->tbl_max)
11637             ptr_table_split(tbl);
11638     }
11639 }
11640
11641 /* double the hash bucket size of an existing ptr table */
11642
11643 void
11644 Perl_ptr_table_split(pTHX_ PTR_TBL_t *const tbl)
11645 {
11646     PTR_TBL_ENT_t **ary = tbl->tbl_ary;
11647     const UV oldsize = tbl->tbl_max + 1;
11648     UV newsize = oldsize * 2;
11649     UV i;
11650
11651     PERL_ARGS_ASSERT_PTR_TABLE_SPLIT;
11652     PERL_UNUSED_CONTEXT;
11653
11654     Renew(ary, newsize, PTR_TBL_ENT_t*);
11655     Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
11656     tbl->tbl_max = --newsize;
11657     tbl->tbl_ary = ary;
11658     for (i=0; i < oldsize; i++, ary++) {
11659         PTR_TBL_ENT_t **entp = ary;
11660         PTR_TBL_ENT_t *ent = *ary;
11661         PTR_TBL_ENT_t **curentp;
11662         if (!ent)
11663             continue;
11664         curentp = ary + oldsize;
11665         do {
11666             if ((newsize & PTR_TABLE_HASH(ent->oldval)) != i) {
11667                 *entp = ent->next;
11668                 ent->next = *curentp;
11669                 *curentp = ent;
11670             }
11671             else
11672                 entp = &ent->next;
11673             ent = *entp;
11674         } while (ent);
11675     }
11676 }
11677
11678 /* remove all the entries from a ptr table */
11679 /* Deprecated - will be removed post 5.14 */
11680
11681 void
11682 Perl_ptr_table_clear(pTHX_ PTR_TBL_t *const tbl)
11683 {
11684     if (tbl && tbl->tbl_items) {
11685         struct ptr_tbl_arena *arena = tbl->tbl_arena;
11686
11687         Zero(tbl->tbl_ary, tbl->tbl_max + 1, struct ptr_tbl_ent **);
11688
11689         while (arena) {
11690             struct ptr_tbl_arena *next = arena->next;
11691
11692             Safefree(arena);
11693             arena = next;
11694         };
11695
11696         tbl->tbl_items = 0;
11697         tbl->tbl_arena = NULL;
11698         tbl->tbl_arena_next = NULL;
11699         tbl->tbl_arena_end = NULL;
11700     }
11701 }
11702
11703 /* clear and free a ptr table */
11704
11705 void
11706 Perl_ptr_table_free(pTHX_ PTR_TBL_t *const tbl)
11707 {
11708     struct ptr_tbl_arena *arena;
11709
11710     if (!tbl) {
11711         return;
11712     }
11713
11714     arena = tbl->tbl_arena;
11715
11716     while (arena) {
11717         struct ptr_tbl_arena *next = arena->next;
11718
11719         Safefree(arena);
11720         arena = next;
11721     }
11722
11723     Safefree(tbl->tbl_ary);
11724     Safefree(tbl);
11725 }
11726
11727 #if defined(USE_ITHREADS)
11728
11729 void
11730 Perl_rvpv_dup(pTHX_ SV *const dstr, const SV *const sstr, CLONE_PARAMS *const param)
11731 {
11732     PERL_ARGS_ASSERT_RVPV_DUP;
11733
11734     if (SvROK(sstr)) {
11735         if (SvWEAKREF(sstr)) {
11736             SvRV_set(dstr, sv_dup(SvRV_const(sstr), param));
11737             if (param->flags & CLONEf_JOIN_IN) {
11738                 /* if joining, we add any back references individually rather
11739                  * than copying the whole backref array */
11740                 Perl_sv_add_backref(aTHX_ SvRV(dstr), dstr);
11741             }
11742         }
11743         else
11744             SvRV_set(dstr, sv_dup_inc(SvRV_const(sstr), param));
11745     }
11746     else if (SvPVX_const(sstr)) {
11747         /* Has something there */
11748         if (SvLEN(sstr)) {
11749             /* Normal PV - clone whole allocated space */
11750             SvPV_set(dstr, SAVEPVN(SvPVX_const(sstr), SvLEN(sstr)-1));
11751             if (SvREADONLY(sstr) && SvFAKE(sstr)) {
11752                 /* Not that normal - actually sstr is copy on write.
11753                    But we are a true, independent SV, so:  */
11754                 SvREADONLY_off(dstr);
11755                 SvFAKE_off(dstr);
11756             }
11757         }
11758         else {
11759             /* Special case - not normally malloced for some reason */
11760             if (isGV_with_GP(sstr)) {
11761                 /* Don't need to do anything here.  */
11762             }
11763             else if ((SvREADONLY(sstr) && SvFAKE(sstr))) {
11764                 /* A "shared" PV - clone it as "shared" PV */
11765                 SvPV_set(dstr,
11766                          HEK_KEY(hek_dup(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)),
11767                                          param)));
11768             }
11769             else {
11770                 /* Some other special case - random pointer */
11771                 SvPV_set(dstr, (char *) SvPVX_const(sstr));             
11772             }
11773         }
11774     }
11775     else {
11776         /* Copy the NULL */
11777         SvPV_set(dstr, NULL);
11778     }
11779 }
11780
11781 /* duplicate a list of SVs. source and dest may point to the same memory.  */
11782 static SV **
11783 S_sv_dup_inc_multiple(pTHX_ SV *const *source, SV **dest,
11784                       SSize_t items, CLONE_PARAMS *const param)
11785 {
11786     PERL_ARGS_ASSERT_SV_DUP_INC_MULTIPLE;
11787
11788     while (items-- > 0) {
11789         *dest++ = sv_dup_inc(*source++, param);
11790     }
11791
11792     return dest;
11793 }
11794
11795 /* duplicate an SV of any type (including AV, HV etc) */
11796
11797 static SV *
11798 S_sv_dup_common(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
11799 {
11800     dVAR;
11801     SV *dstr;
11802
11803     PERL_ARGS_ASSERT_SV_DUP_COMMON;
11804
11805     if (SvTYPE(sstr) == (svtype)SVTYPEMASK) {
11806 #ifdef DEBUG_LEAKING_SCALARS_ABORT
11807         abort();
11808 #endif
11809         return NULL;
11810     }
11811     /* look for it in the table first */
11812     dstr = MUTABLE_SV(ptr_table_fetch(PL_ptr_table, sstr));
11813     if (dstr)
11814         return dstr;
11815
11816     if(param->flags & CLONEf_JOIN_IN) {
11817         /** We are joining here so we don't want do clone
11818             something that is bad **/
11819         if (SvTYPE(sstr) == SVt_PVHV) {
11820             const HEK * const hvname = HvNAME_HEK(sstr);
11821             if (hvname) {
11822                 /** don't clone stashes if they already exist **/
11823                 dstr = MUTABLE_SV(gv_stashpvn(HEK_KEY(hvname), HEK_LEN(hvname),
11824                                                 HEK_UTF8(hvname) ? SVf_UTF8 : 0));
11825                 ptr_table_store(PL_ptr_table, sstr, dstr);
11826                 return dstr;
11827             }
11828         }
11829         else if (SvTYPE(sstr) == SVt_PVGV && !SvFAKE(sstr)) {
11830             HV *stash = GvSTASH(sstr);
11831             const HEK * hvname;
11832             if (stash && (hvname = HvNAME_HEK(stash))) {
11833                 /** don't clone GVs if they already exist **/
11834                 SV **svp;
11835                 stash = gv_stashpvn(HEK_KEY(hvname), HEK_LEN(hvname),
11836                                     HEK_UTF8(hvname) ? SVf_UTF8 : 0);
11837                 svp = hv_fetch(
11838                         stash, GvNAME(sstr),
11839                         GvNAMEUTF8(sstr)
11840                             ? -GvNAMELEN(sstr)
11841                             :  GvNAMELEN(sstr),
11842                         0
11843                       );
11844                 if (svp && *svp && SvTYPE(*svp) == SVt_PVGV) {
11845                     ptr_table_store(PL_ptr_table, sstr, *svp);
11846                     return *svp;
11847                 }
11848             }
11849         }
11850     }
11851
11852     /* create anew and remember what it is */
11853     new_SV(dstr);
11854
11855 #ifdef DEBUG_LEAKING_SCALARS
11856     dstr->sv_debug_optype = sstr->sv_debug_optype;
11857     dstr->sv_debug_line = sstr->sv_debug_line;
11858     dstr->sv_debug_inpad = sstr->sv_debug_inpad;
11859     dstr->sv_debug_parent = (SV*)sstr;
11860     FREE_SV_DEBUG_FILE(dstr);
11861     dstr->sv_debug_file = savepv(sstr->sv_debug_file);
11862 #endif
11863
11864     ptr_table_store(PL_ptr_table, sstr, dstr);
11865
11866     /* clone */
11867     SvFLAGS(dstr)       = SvFLAGS(sstr);
11868     SvFLAGS(dstr)       &= ~SVf_OOK;            /* don't propagate OOK hack */
11869     SvREFCNT(dstr)      = 0;                    /* must be before any other dups! */
11870
11871 #ifdef DEBUGGING
11872     if (SvANY(sstr) && PL_watch_pvx && SvPVX_const(sstr) == PL_watch_pvx)
11873         PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
11874                       (void*)PL_watch_pvx, SvPVX_const(sstr));
11875 #endif
11876
11877     /* don't clone objects whose class has asked us not to */
11878     if (SvOBJECT(sstr) && ! (SvFLAGS(SvSTASH(sstr)) & SVphv_CLONEABLE)) {
11879         SvFLAGS(dstr) = 0;
11880         return dstr;
11881     }
11882
11883     switch (SvTYPE(sstr)) {
11884     case SVt_NULL:
11885         SvANY(dstr)     = NULL;
11886         break;
11887     case SVt_IV:
11888         SvANY(dstr)     = (XPVIV*)((char*)&(dstr->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
11889         if(SvROK(sstr)) {
11890             Perl_rvpv_dup(aTHX_ dstr, sstr, param);
11891         } else {
11892             SvIV_set(dstr, SvIVX(sstr));
11893         }
11894         break;
11895     case SVt_NV:
11896         SvANY(dstr)     = new_XNV();
11897         SvNV_set(dstr, SvNVX(sstr));
11898         break;
11899         /* case SVt_BIND: */
11900     default:
11901         {
11902             /* These are all the types that need complex bodies allocating.  */
11903             void *new_body;
11904             const svtype sv_type = SvTYPE(sstr);
11905             const struct body_details *const sv_type_details
11906                 = bodies_by_type + sv_type;
11907
11908             switch (sv_type) {
11909             default:
11910                 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
11911                 break;
11912
11913             case SVt_PVGV:
11914             case SVt_PVIO:
11915             case SVt_PVFM:
11916             case SVt_PVHV:
11917             case SVt_PVAV:
11918             case SVt_PVCV:
11919             case SVt_PVLV:
11920             case SVt_REGEXP:
11921             case SVt_PVMG:
11922             case SVt_PVNV:
11923             case SVt_PVIV:
11924             case SVt_PV:
11925                 assert(sv_type_details->body_size);
11926                 if (sv_type_details->arena) {
11927                     new_body_inline(new_body, sv_type);
11928                     new_body
11929                         = (void*)((char*)new_body - sv_type_details->offset);
11930                 } else {
11931                     new_body = new_NOARENA(sv_type_details);
11932                 }
11933             }
11934             assert(new_body);
11935             SvANY(dstr) = new_body;
11936
11937 #ifndef PURIFY
11938             Copy(((char*)SvANY(sstr)) + sv_type_details->offset,
11939                  ((char*)SvANY(dstr)) + sv_type_details->offset,
11940                  sv_type_details->copy, char);
11941 #else
11942             Copy(((char*)SvANY(sstr)),
11943                  ((char*)SvANY(dstr)),
11944                  sv_type_details->body_size + sv_type_details->offset, char);
11945 #endif
11946
11947             if (sv_type != SVt_PVAV && sv_type != SVt_PVHV
11948                 && !isGV_with_GP(dstr)
11949                 && !(sv_type == SVt_PVIO && !(IoFLAGS(dstr) & IOf_FAKE_DIRP)))
11950                 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
11951
11952             /* The Copy above means that all the source (unduplicated) pointers
11953                are now in the destination.  We can check the flags and the
11954                pointers in either, but it's possible that there's less cache
11955                missing by always going for the destination.
11956                FIXME - instrument and check that assumption  */
11957             if (sv_type >= SVt_PVMG) {
11958                 if ((sv_type == SVt_PVMG) && SvPAD_OUR(dstr)) {
11959                     SvOURSTASH_set(dstr, hv_dup_inc(SvOURSTASH(dstr), param));
11960                 } else if (SvMAGIC(dstr))
11961                     SvMAGIC_set(dstr, mg_dup(SvMAGIC(dstr), param));
11962                 if (SvSTASH(dstr))
11963                     SvSTASH_set(dstr, hv_dup_inc(SvSTASH(dstr), param));
11964             }
11965
11966             /* The cast silences a GCC warning about unhandled types.  */
11967             switch ((int)sv_type) {
11968             case SVt_PV:
11969                 break;
11970             case SVt_PVIV:
11971                 break;
11972             case SVt_PVNV:
11973                 break;
11974             case SVt_PVMG:
11975                 break;
11976             case SVt_REGEXP:
11977                 /* FIXME for plugins */
11978                 re_dup_guts((REGEXP*) sstr, (REGEXP*) dstr, param);
11979                 break;
11980             case SVt_PVLV:
11981                 /* XXX LvTARGOFF sometimes holds PMOP* when DEBUGGING */
11982                 if (LvTYPE(dstr) == 't') /* for tie: unrefcnted fake (SV**) */
11983                     LvTARG(dstr) = dstr;
11984                 else if (LvTYPE(dstr) == 'T') /* for tie: fake HE */
11985                     LvTARG(dstr) = MUTABLE_SV(he_dup((HE*)LvTARG(dstr), 0, param));
11986                 else
11987                     LvTARG(dstr) = sv_dup_inc(LvTARG(dstr), param);
11988             case SVt_PVGV:
11989                 /* non-GP case already handled above */
11990                 if(isGV_with_GP(sstr)) {
11991                     GvNAME_HEK(dstr) = hek_dup(GvNAME_HEK(dstr), param);
11992                     /* Don't call sv_add_backref here as it's going to be
11993                        created as part of the magic cloning of the symbol
11994                        table--unless this is during a join and the stash
11995                        is not actually being cloned.  */
11996                     /* Danger Will Robinson - GvGP(dstr) isn't initialised
11997                        at the point of this comment.  */
11998                     GvSTASH(dstr) = hv_dup(GvSTASH(dstr), param);
11999                     if (param->flags & CLONEf_JOIN_IN)
12000                         Perl_sv_add_backref(aTHX_ MUTABLE_SV(GvSTASH(dstr)), dstr);
12001                     GvGP_set(dstr, gp_dup(GvGP(sstr), param));
12002                     (void)GpREFCNT_inc(GvGP(dstr));
12003                 }
12004                 break;
12005             case SVt_PVIO:
12006                 /* PL_parser->rsfp_filters entries have fake IoDIRP() */
12007                 if(IoFLAGS(dstr) & IOf_FAKE_DIRP) {
12008                     /* I have no idea why fake dirp (rsfps)
12009                        should be treated differently but otherwise
12010                        we end up with leaks -- sky*/
12011                     IoTOP_GV(dstr)      = gv_dup_inc(IoTOP_GV(dstr), param);
12012                     IoFMT_GV(dstr)      = gv_dup_inc(IoFMT_GV(dstr), param);
12013                     IoBOTTOM_GV(dstr)   = gv_dup_inc(IoBOTTOM_GV(dstr), param);
12014                 } else {
12015                     IoTOP_GV(dstr)      = gv_dup(IoTOP_GV(dstr), param);
12016                     IoFMT_GV(dstr)      = gv_dup(IoFMT_GV(dstr), param);
12017                     IoBOTTOM_GV(dstr)   = gv_dup(IoBOTTOM_GV(dstr), param);
12018                     if (IoDIRP(dstr)) {
12019                         IoDIRP(dstr)    = dirp_dup(IoDIRP(dstr), param);
12020                     } else {
12021                         NOOP;
12022                         /* IoDIRP(dstr) is already a copy of IoDIRP(sstr)  */
12023                     }
12024                     IoIFP(dstr) = fp_dup(IoIFP(sstr), IoTYPE(dstr), param);
12025                 }
12026                 if (IoOFP(dstr) == IoIFP(sstr))
12027                     IoOFP(dstr) = IoIFP(dstr);
12028                 else
12029                     IoOFP(dstr) = fp_dup(IoOFP(dstr), IoTYPE(dstr), param);
12030                 IoTOP_NAME(dstr)        = SAVEPV(IoTOP_NAME(dstr));
12031                 IoFMT_NAME(dstr)        = SAVEPV(IoFMT_NAME(dstr));
12032                 IoBOTTOM_NAME(dstr)     = SAVEPV(IoBOTTOM_NAME(dstr));
12033                 break;
12034             case SVt_PVAV:
12035                 /* avoid cloning an empty array */
12036                 if (AvARRAY((const AV *)sstr) && AvFILLp((const AV *)sstr) >= 0) {
12037                     SV **dst_ary, **src_ary;
12038                     SSize_t items = AvFILLp((const AV *)sstr) + 1;
12039
12040                     src_ary = AvARRAY((const AV *)sstr);
12041                     Newxz(dst_ary, AvMAX((const AV *)sstr)+1, SV*);
12042                     ptr_table_store(PL_ptr_table, src_ary, dst_ary);
12043                     AvARRAY(MUTABLE_AV(dstr)) = dst_ary;
12044                     AvALLOC((const AV *)dstr) = dst_ary;
12045                     if (AvREAL((const AV *)sstr)) {
12046                         dst_ary = sv_dup_inc_multiple(src_ary, dst_ary, items,
12047                                                       param);
12048                     }
12049                     else {
12050                         while (items-- > 0)
12051                             *dst_ary++ = sv_dup(*src_ary++, param);
12052                     }
12053                     items = AvMAX((const AV *)sstr) - AvFILLp((const AV *)sstr);
12054                     while (items-- > 0) {
12055                         *dst_ary++ = &PL_sv_undef;
12056                     }
12057                 }
12058                 else {
12059                     AvARRAY(MUTABLE_AV(dstr))   = NULL;
12060                     AvALLOC((const AV *)dstr)   = (SV**)NULL;
12061                     AvMAX(  (const AV *)dstr)   = -1;
12062                     AvFILLp((const AV *)dstr)   = -1;
12063                 }
12064                 break;
12065             case SVt_PVHV:
12066                 if (HvARRAY((const HV *)sstr)) {
12067                     STRLEN i = 0;
12068                     const bool sharekeys = !!HvSHAREKEYS(sstr);
12069                     XPVHV * const dxhv = (XPVHV*)SvANY(dstr);
12070                     XPVHV * const sxhv = (XPVHV*)SvANY(sstr);
12071                     char *darray;
12072                     Newx(darray, PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1)
12073                         + (SvOOK(sstr) ? sizeof(struct xpvhv_aux) : 0),
12074                         char);
12075                     HvARRAY(dstr) = (HE**)darray;
12076                     while (i <= sxhv->xhv_max) {
12077                         const HE * const source = HvARRAY(sstr)[i];
12078                         HvARRAY(dstr)[i] = source
12079                             ? he_dup(source, sharekeys, param) : 0;
12080                         ++i;
12081                     }
12082                     if (SvOOK(sstr)) {
12083                         const struct xpvhv_aux * const saux = HvAUX(sstr);
12084                         struct xpvhv_aux * const daux = HvAUX(dstr);
12085                         /* This flag isn't copied.  */
12086                         SvOOK_on(dstr);
12087
12088                         if (saux->xhv_name_count) {
12089                             HEK ** const sname = saux->xhv_name_u.xhvnameu_names;
12090                             const I32 count
12091                              = saux->xhv_name_count < 0
12092                                 ? -saux->xhv_name_count
12093                                 :  saux->xhv_name_count;
12094                             HEK **shekp = sname + count;
12095                             HEK **dhekp;
12096                             Newx(daux->xhv_name_u.xhvnameu_names, count, HEK *);
12097                             dhekp = daux->xhv_name_u.xhvnameu_names + count;
12098                             while (shekp-- > sname) {
12099                                 dhekp--;
12100                                 *dhekp = hek_dup(*shekp, param);
12101                             }
12102                         }
12103                         else {
12104                             daux->xhv_name_u.xhvnameu_name
12105                                 = hek_dup(saux->xhv_name_u.xhvnameu_name,
12106                                           param);
12107                         }
12108                         daux->xhv_name_count = saux->xhv_name_count;
12109
12110                         daux->xhv_riter = saux->xhv_riter;
12111                         daux->xhv_eiter = saux->xhv_eiter
12112                             ? he_dup(saux->xhv_eiter,
12113                                         cBOOL(HvSHAREKEYS(sstr)), param) : 0;
12114                         /* backref array needs refcnt=2; see sv_add_backref */
12115                         daux->xhv_backreferences =
12116                             (param->flags & CLONEf_JOIN_IN)
12117                                 /* when joining, we let the individual GVs and
12118                                  * CVs add themselves to backref as
12119                                  * needed. This avoids pulling in stuff
12120                                  * that isn't required, and simplifies the
12121                                  * case where stashes aren't cloned back
12122                                  * if they already exist in the parent
12123                                  * thread */
12124                             ? NULL
12125                             : saux->xhv_backreferences
12126                                 ? (SvTYPE(saux->xhv_backreferences) == SVt_PVAV)
12127                                     ? MUTABLE_AV(SvREFCNT_inc(
12128                                           sv_dup_inc((const SV *)
12129                                             saux->xhv_backreferences, param)))
12130                                     : MUTABLE_AV(sv_dup((const SV *)
12131                                             saux->xhv_backreferences, param))
12132                                 : 0;
12133
12134                         daux->xhv_mro_meta = saux->xhv_mro_meta
12135                             ? mro_meta_dup(saux->xhv_mro_meta, param)
12136                             : 0;
12137
12138                         /* Record stashes for possible cloning in Perl_clone(). */
12139                         if (HvNAME(sstr))
12140                             av_push(param->stashes, dstr);
12141                     }
12142                 }
12143                 else
12144                     HvARRAY(MUTABLE_HV(dstr)) = NULL;
12145                 break;
12146             case SVt_PVCV:
12147                 if (!(param->flags & CLONEf_COPY_STACKS)) {
12148                     CvDEPTH(dstr) = 0;
12149                 }
12150                 /*FALLTHROUGH*/
12151             case SVt_PVFM:
12152                 /* NOTE: not refcounted */
12153                 SvANY(MUTABLE_CV(dstr))->xcv_stash =
12154                     hv_dup(CvSTASH(dstr), param);
12155                 if ((param->flags & CLONEf_JOIN_IN) && CvSTASH(dstr))
12156                     Perl_sv_add_backref(aTHX_ MUTABLE_SV(CvSTASH(dstr)), dstr);
12157                 if (!CvISXSUB(dstr)) {
12158                     OP_REFCNT_LOCK;
12159                     CvROOT(dstr) = OpREFCNT_inc(CvROOT(dstr));
12160                     OP_REFCNT_UNLOCK;
12161                 } else if (CvCONST(dstr)) {
12162                     CvXSUBANY(dstr).any_ptr =
12163                         sv_dup_inc((const SV *)CvXSUBANY(dstr).any_ptr, param);
12164                 }
12165                 if (CvDYNFILE(dstr)) CvFILE(dstr) = SAVEPV(CvFILE(dstr));
12166                 /* don't dup if copying back - CvGV isn't refcounted, so the
12167                  * duped GV may never be freed. A bit of a hack! DAPM */
12168                 SvANY(MUTABLE_CV(dstr))->xcv_gv =
12169                     CvCVGV_RC(dstr)
12170                     ? gv_dup_inc(CvGV(sstr), param)
12171                     : (param->flags & CLONEf_JOIN_IN)
12172                         ? NULL
12173                         : gv_dup(CvGV(sstr), param);
12174
12175                 CvPADLIST(dstr) = padlist_dup(CvPADLIST(sstr), param);
12176                 CvOUTSIDE(dstr) =
12177                     CvWEAKOUTSIDE(sstr)
12178                     ? cv_dup(    CvOUTSIDE(dstr), param)
12179                     : cv_dup_inc(CvOUTSIDE(dstr), param);
12180                 break;
12181             }
12182         }
12183     }
12184
12185     if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
12186         ++PL_sv_objcount;
12187
12188     return dstr;
12189  }
12190
12191 SV *
12192 Perl_sv_dup_inc(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
12193 {
12194     PERL_ARGS_ASSERT_SV_DUP_INC;
12195     return sstr ? SvREFCNT_inc(sv_dup_common(sstr, param)) : NULL;
12196 }
12197
12198 SV *
12199 Perl_sv_dup(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
12200 {
12201     SV *dstr = sstr ? sv_dup_common(sstr, param) : NULL;
12202     PERL_ARGS_ASSERT_SV_DUP;
12203
12204     /* Track every SV that (at least initially) had a reference count of 0.
12205        We need to do this by holding an actual reference to it in this array.
12206        If we attempt to cheat, turn AvREAL_off(), and store only pointers
12207        (akin to the stashes hash, and the perl stack), we come unstuck if
12208        a weak reference (or other SV legitimately SvREFCNT() == 0 for this
12209        thread) is manipulated in a CLONE method, because CLONE runs before the
12210        unreferenced array is walked to find SVs still with SvREFCNT() == 0
12211        (and fix things up by giving each a reference via the temps stack).
12212        Instead, during CLONE, if the 0-referenced SV has SvREFCNT_inc() and
12213        then SvREFCNT_dec(), it will be cleaned up (and added to the free list)
12214        before the walk of unreferenced happens and a reference to that is SV
12215        added to the temps stack. At which point we have the same SV considered
12216        to be in use, and free to be re-used. Not good.
12217     */
12218     if (dstr && !(param->flags & CLONEf_COPY_STACKS) && !SvREFCNT(dstr)) {
12219         assert(param->unreferenced);
12220         av_push(param->unreferenced, SvREFCNT_inc(dstr));
12221     }
12222
12223     return dstr;
12224 }
12225
12226 /* duplicate a context */
12227
12228 PERL_CONTEXT *
12229 Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
12230 {
12231     PERL_CONTEXT *ncxs;
12232
12233     PERL_ARGS_ASSERT_CX_DUP;
12234
12235     if (!cxs)
12236         return (PERL_CONTEXT*)NULL;
12237
12238     /* look for it in the table first */
12239     ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
12240     if (ncxs)
12241         return ncxs;
12242
12243     /* create anew and remember what it is */
12244     Newx(ncxs, max + 1, PERL_CONTEXT);
12245     ptr_table_store(PL_ptr_table, cxs, ncxs);
12246     Copy(cxs, ncxs, max + 1, PERL_CONTEXT);
12247
12248     while (ix >= 0) {
12249         PERL_CONTEXT * const ncx = &ncxs[ix];
12250         if (CxTYPE(ncx) == CXt_SUBST) {
12251             Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
12252         }
12253         else {
12254             switch (CxTYPE(ncx)) {
12255             case CXt_SUB:
12256                 ncx->blk_sub.cv         = (ncx->blk_sub.olddepth == 0
12257                                            ? cv_dup_inc(ncx->blk_sub.cv, param)
12258                                            : cv_dup(ncx->blk_sub.cv,param));
12259                 ncx->blk_sub.argarray   = (CxHASARGS(ncx)
12260                                            ? av_dup_inc(ncx->blk_sub.argarray,
12261                                                         param)
12262                                            : NULL);
12263                 ncx->blk_sub.savearray  = av_dup_inc(ncx->blk_sub.savearray,
12264                                                      param);
12265                 ncx->blk_sub.oldcomppad = (PAD*)ptr_table_fetch(PL_ptr_table,
12266                                            ncx->blk_sub.oldcomppad);
12267                 break;
12268             case CXt_EVAL:
12269                 ncx->blk_eval.old_namesv = sv_dup_inc(ncx->blk_eval.old_namesv,
12270                                                       param);
12271                 ncx->blk_eval.cur_text  = sv_dup(ncx->blk_eval.cur_text, param);
12272                 break;
12273             case CXt_LOOP_LAZYSV:
12274                 ncx->blk_loop.state_u.lazysv.end
12275                     = sv_dup_inc(ncx->blk_loop.state_u.lazysv.end, param);
12276                 /* We are taking advantage of av_dup_inc and sv_dup_inc
12277                    actually being the same function, and order equivalence of
12278                    the two unions.
12279                    We can assert the later [but only at run time :-(]  */
12280                 assert ((void *) &ncx->blk_loop.state_u.ary.ary ==
12281                         (void *) &ncx->blk_loop.state_u.lazysv.cur);
12282             case CXt_LOOP_FOR:
12283                 ncx->blk_loop.state_u.ary.ary
12284                     = av_dup_inc(ncx->blk_loop.state_u.ary.ary, param);
12285             case CXt_LOOP_LAZYIV:
12286             case CXt_LOOP_PLAIN:
12287                 if (CxPADLOOP(ncx)) {
12288                     ncx->blk_loop.itervar_u.oldcomppad
12289                         = (PAD*)ptr_table_fetch(PL_ptr_table,
12290                                         ncx->blk_loop.itervar_u.oldcomppad);
12291                 } else {
12292                     ncx->blk_loop.itervar_u.gv
12293                         = gv_dup((const GV *)ncx->blk_loop.itervar_u.gv,
12294                                     param);
12295                 }
12296                 break;
12297             case CXt_FORMAT:
12298                 ncx->blk_format.cv      = cv_dup(ncx->blk_format.cv, param);
12299                 ncx->blk_format.gv      = gv_dup(ncx->blk_format.gv, param);
12300                 ncx->blk_format.dfoutgv = gv_dup_inc(ncx->blk_format.dfoutgv,
12301                                                      param);
12302                 break;
12303             case CXt_BLOCK:
12304             case CXt_NULL:
12305                 break;
12306             }
12307         }
12308         --ix;
12309     }
12310     return ncxs;
12311 }
12312
12313 /* duplicate a stack info structure */
12314
12315 PERL_SI *
12316 Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
12317 {
12318     PERL_SI *nsi;
12319
12320     PERL_ARGS_ASSERT_SI_DUP;
12321
12322     if (!si)
12323         return (PERL_SI*)NULL;
12324
12325     /* look for it in the table first */
12326     nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
12327     if (nsi)
12328         return nsi;
12329
12330     /* create anew and remember what it is */
12331     Newxz(nsi, 1, PERL_SI);
12332     ptr_table_store(PL_ptr_table, si, nsi);
12333
12334     nsi->si_stack       = av_dup_inc(si->si_stack, param);
12335     nsi->si_cxix        = si->si_cxix;
12336     nsi->si_cxmax       = si->si_cxmax;
12337     nsi->si_cxstack     = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
12338     nsi->si_type        = si->si_type;
12339     nsi->si_prev        = si_dup(si->si_prev, param);
12340     nsi->si_next        = si_dup(si->si_next, param);
12341     nsi->si_markoff     = si->si_markoff;
12342
12343     return nsi;
12344 }
12345
12346 #define POPINT(ss,ix)   ((ss)[--(ix)].any_i32)
12347 #define TOPINT(ss,ix)   ((ss)[ix].any_i32)
12348 #define POPLONG(ss,ix)  ((ss)[--(ix)].any_long)
12349 #define TOPLONG(ss,ix)  ((ss)[ix].any_long)
12350 #define POPIV(ss,ix)    ((ss)[--(ix)].any_iv)
12351 #define TOPIV(ss,ix)    ((ss)[ix].any_iv)
12352 #define POPUV(ss,ix)    ((ss)[--(ix)].any_uv)
12353 #define TOPUV(ss,ix)    ((ss)[ix].any_uv)
12354 #define POPBOOL(ss,ix)  ((ss)[--(ix)].any_bool)
12355 #define TOPBOOL(ss,ix)  ((ss)[ix].any_bool)
12356 #define POPPTR(ss,ix)   ((ss)[--(ix)].any_ptr)
12357 #define TOPPTR(ss,ix)   ((ss)[ix].any_ptr)
12358 #define POPDPTR(ss,ix)  ((ss)[--(ix)].any_dptr)
12359 #define TOPDPTR(ss,ix)  ((ss)[ix].any_dptr)
12360 #define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
12361 #define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
12362
12363 /* XXXXX todo */
12364 #define pv_dup_inc(p)   SAVEPV(p)
12365 #define pv_dup(p)       SAVEPV(p)
12366 #define svp_dup_inc(p,pp)       any_dup(p,pp)
12367
12368 /* map any object to the new equivent - either something in the
12369  * ptr table, or something in the interpreter structure
12370  */
12371
12372 void *
12373 Perl_any_dup(pTHX_ void *v, const PerlInterpreter *proto_perl)
12374 {
12375     void *ret;
12376
12377     PERL_ARGS_ASSERT_ANY_DUP;
12378
12379     if (!v)
12380         return (void*)NULL;
12381
12382     /* look for it in the table first */
12383     ret = ptr_table_fetch(PL_ptr_table, v);
12384     if (ret)
12385         return ret;
12386
12387     /* see if it is part of the interpreter structure */
12388     if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
12389         ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
12390     else {
12391         ret = v;
12392     }
12393
12394     return ret;
12395 }
12396
12397 /* duplicate the save stack */
12398
12399 ANY *
12400 Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
12401 {
12402     dVAR;
12403     ANY * const ss      = proto_perl->Isavestack;
12404     const I32 max       = proto_perl->Isavestack_max;
12405     I32 ix              = proto_perl->Isavestack_ix;
12406     ANY *nss;
12407     const SV *sv;
12408     const GV *gv;
12409     const AV *av;
12410     const HV *hv;
12411     void* ptr;
12412     int intval;
12413     long longval;
12414     GP *gp;
12415     IV iv;
12416     I32 i;
12417     char *c = NULL;
12418     void (*dptr) (void*);
12419     void (*dxptr) (pTHX_ void*);
12420
12421     PERL_ARGS_ASSERT_SS_DUP;
12422
12423     Newxz(nss, max, ANY);
12424
12425     while (ix > 0) {
12426         const UV uv = POPUV(ss,ix);
12427         const U8 type = (U8)uv & SAVE_MASK;
12428
12429         TOPUV(nss,ix) = uv;
12430         switch (type) {
12431         case SAVEt_CLEARSV:
12432             break;
12433         case SAVEt_HELEM:               /* hash element */
12434             sv = (const SV *)POPPTR(ss,ix);
12435             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
12436             /* fall through */
12437         case SAVEt_ITEM:                        /* normal string */
12438         case SAVEt_GVSV:                        /* scalar slot in GV */
12439         case SAVEt_SV:                          /* scalar reference */
12440             sv = (const SV *)POPPTR(ss,ix);
12441             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
12442             /* fall through */
12443         case SAVEt_FREESV:
12444         case SAVEt_MORTALIZESV:
12445             sv = (const SV *)POPPTR(ss,ix);
12446             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
12447             break;
12448         case SAVEt_SHARED_PVREF:                /* char* in shared space */
12449             c = (char*)POPPTR(ss,ix);
12450             TOPPTR(nss,ix) = savesharedpv(c);
12451             ptr = POPPTR(ss,ix);
12452             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12453             break;
12454         case SAVEt_GENERIC_SVREF:               /* generic sv */
12455         case SAVEt_SVREF:                       /* scalar reference */
12456             sv = (const SV *)POPPTR(ss,ix);
12457             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
12458             ptr = POPPTR(ss,ix);
12459             TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
12460             break;
12461         case SAVEt_HV:                          /* hash reference */
12462         case SAVEt_AV:                          /* array reference */
12463             sv = (const SV *) POPPTR(ss,ix);
12464             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
12465             /* fall through */
12466         case SAVEt_COMPPAD:
12467         case SAVEt_NSTAB:
12468             sv = (const SV *) POPPTR(ss,ix);
12469             TOPPTR(nss,ix) = sv_dup(sv, param);
12470             break;
12471         case SAVEt_INT:                         /* int reference */
12472             ptr = POPPTR(ss,ix);
12473             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12474             intval = (int)POPINT(ss,ix);
12475             TOPINT(nss,ix) = intval;
12476             break;
12477         case SAVEt_LONG:                        /* long reference */
12478             ptr = POPPTR(ss,ix);
12479             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12480             longval = (long)POPLONG(ss,ix);
12481             TOPLONG(nss,ix) = longval;
12482             break;
12483         case SAVEt_I32:                         /* I32 reference */
12484             ptr = POPPTR(ss,ix);
12485             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12486             i = POPINT(ss,ix);
12487             TOPINT(nss,ix) = i;
12488             break;
12489         case SAVEt_IV:                          /* IV reference */
12490             ptr = POPPTR(ss,ix);
12491             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12492             iv = POPIV(ss,ix);
12493             TOPIV(nss,ix) = iv;
12494             break;
12495         case SAVEt_HPTR:                        /* HV* reference */
12496         case SAVEt_APTR:                        /* AV* reference */
12497         case SAVEt_SPTR:                        /* SV* reference */
12498             ptr = POPPTR(ss,ix);
12499             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12500             sv = (const SV *)POPPTR(ss,ix);
12501             TOPPTR(nss,ix) = sv_dup(sv, param);
12502             break;
12503         case SAVEt_VPTR:                        /* random* reference */
12504             ptr = POPPTR(ss,ix);
12505             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12506             /* Fall through */
12507         case SAVEt_INT_SMALL:
12508         case SAVEt_I32_SMALL:
12509         case SAVEt_I16:                         /* I16 reference */
12510         case SAVEt_I8:                          /* I8 reference */
12511         case SAVEt_BOOL:
12512             ptr = POPPTR(ss,ix);
12513             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12514             break;
12515         case SAVEt_GENERIC_PVREF:               /* generic char* */
12516         case SAVEt_PPTR:                        /* char* reference */
12517             ptr = POPPTR(ss,ix);
12518             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12519             c = (char*)POPPTR(ss,ix);
12520             TOPPTR(nss,ix) = pv_dup(c);
12521             break;
12522         case SAVEt_GP:                          /* scalar reference */
12523             gp = (GP*)POPPTR(ss,ix);
12524             TOPPTR(nss,ix) = gp = gp_dup(gp, param);
12525             (void)GpREFCNT_inc(gp);
12526             gv = (const GV *)POPPTR(ss,ix);
12527             TOPPTR(nss,ix) = gv_dup_inc(gv, param);
12528             break;
12529         case SAVEt_FREEOP:
12530             ptr = POPPTR(ss,ix);
12531             if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
12532                 /* these are assumed to be refcounted properly */
12533                 OP *o;
12534                 switch (((OP*)ptr)->op_type) {
12535                 case OP_LEAVESUB:
12536                 case OP_LEAVESUBLV:
12537                 case OP_LEAVEEVAL:
12538                 case OP_LEAVE:
12539                 case OP_SCOPE:
12540                 case OP_LEAVEWRITE:
12541                     TOPPTR(nss,ix) = ptr;
12542                     o = (OP*)ptr;
12543                     OP_REFCNT_LOCK;
12544                     (void) OpREFCNT_inc(o);
12545                     OP_REFCNT_UNLOCK;
12546                     break;
12547                 default:
12548                     TOPPTR(nss,ix) = NULL;
12549                     break;
12550                 }
12551             }
12552             else
12553                 TOPPTR(nss,ix) = NULL;
12554             break;
12555         case SAVEt_FREECOPHH:
12556             ptr = POPPTR(ss,ix);
12557             TOPPTR(nss,ix) = cophh_copy((COPHH *)ptr);
12558             break;
12559         case SAVEt_DELETE:
12560             hv = (const HV *)POPPTR(ss,ix);
12561             TOPPTR(nss,ix) = hv_dup_inc(hv, param);
12562             i = POPINT(ss,ix);
12563             TOPINT(nss,ix) = i;
12564             /* Fall through */
12565         case SAVEt_FREEPV:
12566             c = (char*)POPPTR(ss,ix);
12567             TOPPTR(nss,ix) = pv_dup_inc(c);
12568             break;
12569         case SAVEt_STACK_POS:           /* Position on Perl stack */
12570             i = POPINT(ss,ix);
12571             TOPINT(nss,ix) = i;
12572             break;
12573         case SAVEt_DESTRUCTOR:
12574             ptr = POPPTR(ss,ix);
12575             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);  /* XXX quite arbitrary */
12576             dptr = POPDPTR(ss,ix);
12577             TOPDPTR(nss,ix) = DPTR2FPTR(void (*)(void*),
12578                                         any_dup(FPTR2DPTR(void *, dptr),
12579                                                 proto_perl));
12580             break;
12581         case SAVEt_DESTRUCTOR_X:
12582             ptr = POPPTR(ss,ix);
12583             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);  /* XXX quite arbitrary */
12584             dxptr = POPDXPTR(ss,ix);
12585             TOPDXPTR(nss,ix) = DPTR2FPTR(void (*)(pTHX_ void*),
12586                                          any_dup(FPTR2DPTR(void *, dxptr),
12587                                                  proto_perl));
12588             break;
12589         case SAVEt_REGCONTEXT:
12590         case SAVEt_ALLOC:
12591             ix -= uv >> SAVE_TIGHT_SHIFT;
12592             break;
12593         case SAVEt_AELEM:               /* array element */
12594             sv = (const SV *)POPPTR(ss,ix);
12595             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
12596             i = POPINT(ss,ix);
12597             TOPINT(nss,ix) = i;
12598             av = (const AV *)POPPTR(ss,ix);
12599             TOPPTR(nss,ix) = av_dup_inc(av, param);
12600             break;
12601         case SAVEt_OP:
12602             ptr = POPPTR(ss,ix);
12603             TOPPTR(nss,ix) = ptr;
12604             break;
12605         case SAVEt_HINTS:
12606             ptr = POPPTR(ss,ix);
12607             ptr = cophh_copy((COPHH*)ptr);
12608             TOPPTR(nss,ix) = ptr;
12609             i = POPINT(ss,ix);
12610             TOPINT(nss,ix) = i;
12611             if (i & HINT_LOCALIZE_HH) {
12612                 hv = (const HV *)POPPTR(ss,ix);
12613                 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
12614             }
12615             break;
12616         case SAVEt_PADSV_AND_MORTALIZE:
12617             longval = (long)POPLONG(ss,ix);
12618             TOPLONG(nss,ix) = longval;
12619             ptr = POPPTR(ss,ix);
12620             TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12621             sv = (const SV *)POPPTR(ss,ix);
12622             TOPPTR(nss,ix) = sv_dup_inc(sv, param);
12623             break;
12624         case SAVEt_SET_SVFLAGS:
12625             i = POPINT(ss,ix);
12626             TOPINT(nss,ix) = i;
12627             i = POPINT(ss,ix);
12628             TOPINT(nss,ix) = i;
12629             sv = (const SV *)POPPTR(ss,ix);
12630             TOPPTR(nss,ix) = sv_dup(sv, param);
12631             break;
12632         case SAVEt_RE_STATE:
12633             {
12634                 const struct re_save_state *const old_state
12635                     = (struct re_save_state *)
12636                     (ss + ix - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
12637                 struct re_save_state *const new_state
12638                     = (struct re_save_state *)
12639                     (nss + ix - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
12640
12641                 Copy(old_state, new_state, 1, struct re_save_state);
12642                 ix -= SAVESTACK_ALLOC_FOR_RE_SAVE_STATE;
12643
12644                 new_state->re_state_bostr
12645                     = pv_dup(old_state->re_state_bostr);
12646                 new_state->re_state_reginput
12647                     = pv_dup(old_state->re_state_reginput);
12648                 new_state->re_state_regeol
12649                     = pv_dup(old_state->re_state_regeol);
12650                 new_state->re_state_regoffs
12651                     = (regexp_paren_pair*)
12652                         any_dup(old_state->re_state_regoffs, proto_perl);
12653                 new_state->re_state_reglastparen
12654                     = (U32*) any_dup(old_state->re_state_reglastparen, 
12655                               proto_perl);
12656                 new_state->re_state_reglastcloseparen
12657                     = (U32*)any_dup(old_state->re_state_reglastcloseparen,
12658                               proto_perl);
12659                 /* XXX This just has to be broken. The old save_re_context
12660                    code did SAVEGENERICPV(PL_reg_start_tmp);
12661                    PL_reg_start_tmp is char **.
12662                    Look above to what the dup code does for
12663                    SAVEt_GENERIC_PVREF
12664                    It can never have worked.
12665                    So this is merely a faithful copy of the exiting bug:  */
12666                 new_state->re_state_reg_start_tmp
12667                     = (char **) pv_dup((char *)
12668                                       old_state->re_state_reg_start_tmp);
12669                 /* I assume that it only ever "worked" because no-one called
12670                    (pseudo)fork while the regexp engine had re-entered itself.
12671                 */
12672 #ifdef PERL_OLD_COPY_ON_WRITE
12673                 new_state->re_state_nrs
12674                     = sv_dup(old_state->re_state_nrs, param);
12675 #endif
12676                 new_state->re_state_reg_magic
12677                     = (MAGIC*) any_dup(old_state->re_state_reg_magic, 
12678                                proto_perl);
12679                 new_state->re_state_reg_oldcurpm
12680                     = (PMOP*) any_dup(old_state->re_state_reg_oldcurpm, 
12681                               proto_perl);
12682                 new_state->re_state_reg_curpm
12683                     = (PMOP*)  any_dup(old_state->re_state_reg_curpm, 
12684                                proto_perl);
12685                 new_state->re_state_reg_oldsaved
12686                     = pv_dup(old_state->re_state_reg_oldsaved);
12687                 new_state->re_state_reg_poscache
12688                     = pv_dup(old_state->re_state_reg_poscache);
12689                 new_state->re_state_reg_starttry
12690                     = pv_dup(old_state->re_state_reg_starttry);
12691                 break;
12692             }
12693         case SAVEt_COMPILE_WARNINGS:
12694             ptr = POPPTR(ss,ix);
12695             TOPPTR(nss,ix) = DUP_WARNINGS((STRLEN*)ptr);
12696             break;
12697         case SAVEt_PARSER:
12698             ptr = POPPTR(ss,ix);
12699             TOPPTR(nss,ix) = parser_dup((const yy_parser*)ptr, param);
12700             break;
12701         default:
12702             Perl_croak(aTHX_
12703                        "panic: ss_dup inconsistency (%"IVdf")", (IV) type);
12704         }
12705     }
12706
12707     return nss;
12708 }
12709
12710
12711 /* if sv is a stash, call $class->CLONE_SKIP(), and set the SVphv_CLONEABLE
12712  * flag to the result. This is done for each stash before cloning starts,
12713  * so we know which stashes want their objects cloned */
12714
12715 static void
12716 do_mark_cloneable_stash(pTHX_ SV *const sv)
12717 {
12718     const HEK * const hvname = HvNAME_HEK((const HV *)sv);
12719     if (hvname) {
12720         GV* const cloner = gv_fetchmethod_autoload(MUTABLE_HV(sv), "CLONE_SKIP", 0);
12721         SvFLAGS(sv) |= SVphv_CLONEABLE; /* clone objects by default */
12722         if (cloner && GvCV(cloner)) {
12723             dSP;
12724             UV status;
12725
12726             ENTER;
12727             SAVETMPS;
12728             PUSHMARK(SP);
12729             mXPUSHs(newSVhek(hvname));
12730             PUTBACK;
12731             call_sv(MUTABLE_SV(GvCV(cloner)), G_SCALAR);
12732             SPAGAIN;
12733             status = POPu;
12734             PUTBACK;
12735             FREETMPS;
12736             LEAVE;
12737             if (status)
12738                 SvFLAGS(sv) &= ~SVphv_CLONEABLE;
12739         }
12740     }
12741 }
12742
12743
12744
12745 /*
12746 =for apidoc perl_clone
12747
12748 Create and return a new interpreter by cloning the current one.
12749
12750 perl_clone takes these flags as parameters:
12751
12752 CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
12753 without it we only clone the data and zero the stacks,
12754 with it we copy the stacks and the new perl interpreter is
12755 ready to run at the exact same point as the previous one.
12756 The pseudo-fork code uses COPY_STACKS while the
12757 threads->create doesn't.
12758
12759 CLONEf_KEEP_PTR_TABLE -
12760 perl_clone keeps a ptr_table with the pointer of the old
12761 variable as a key and the new variable as a value,
12762 this allows it to check if something has been cloned and not
12763 clone it again but rather just use the value and increase the
12764 refcount.  If KEEP_PTR_TABLE is not set then perl_clone will kill
12765 the ptr_table using the function
12766 C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
12767 reason to keep it around is if you want to dup some of your own
12768 variable who are outside the graph perl scans, example of this
12769 code is in threads.xs create.
12770
12771 CLONEf_CLONE_HOST -
12772 This is a win32 thing, it is ignored on unix, it tells perls
12773 win32host code (which is c++) to clone itself, this is needed on
12774 win32 if you want to run two threads at the same time,
12775 if you just want to do some stuff in a separate perl interpreter
12776 and then throw it away and return to the original one,
12777 you don't need to do anything.
12778
12779 =cut
12780 */
12781
12782 /* XXX the above needs expanding by someone who actually understands it ! */
12783 EXTERN_C PerlInterpreter *
12784 perl_clone_host(PerlInterpreter* proto_perl, UV flags);
12785
12786 PerlInterpreter *
12787 perl_clone(PerlInterpreter *proto_perl, UV flags)
12788 {
12789    dVAR;
12790 #ifdef PERL_IMPLICIT_SYS
12791
12792     PERL_ARGS_ASSERT_PERL_CLONE;
12793
12794    /* perlhost.h so we need to call into it
12795    to clone the host, CPerlHost should have a c interface, sky */
12796
12797    if (flags & CLONEf_CLONE_HOST) {
12798        return perl_clone_host(proto_perl,flags);
12799    }
12800    return perl_clone_using(proto_perl, flags,
12801                             proto_perl->IMem,
12802                             proto_perl->IMemShared,
12803                             proto_perl->IMemParse,
12804                             proto_perl->IEnv,
12805                             proto_perl->IStdIO,
12806                             proto_perl->ILIO,
12807                             proto_perl->IDir,
12808                             proto_perl->ISock,
12809                             proto_perl->IProc);
12810 }
12811
12812 PerlInterpreter *
12813 perl_clone_using(PerlInterpreter *proto_perl, UV flags,
12814                  struct IPerlMem* ipM, struct IPerlMem* ipMS,
12815                  struct IPerlMem* ipMP, struct IPerlEnv* ipE,
12816                  struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
12817                  struct IPerlDir* ipD, struct IPerlSock* ipS,
12818                  struct IPerlProc* ipP)
12819 {
12820     /* XXX many of the string copies here can be optimized if they're
12821      * constants; they need to be allocated as common memory and just
12822      * their pointers copied. */
12823
12824     IV i;
12825     CLONE_PARAMS clone_params;
12826     CLONE_PARAMS* const param = &clone_params;
12827
12828     PerlInterpreter * const my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
12829
12830     PERL_ARGS_ASSERT_PERL_CLONE_USING;
12831 #else           /* !PERL_IMPLICIT_SYS */
12832     IV i;
12833     CLONE_PARAMS clone_params;
12834     CLONE_PARAMS* param = &clone_params;
12835     PerlInterpreter * const my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
12836
12837     PERL_ARGS_ASSERT_PERL_CLONE;
12838 #endif          /* PERL_IMPLICIT_SYS */
12839
12840     /* for each stash, determine whether its objects should be cloned */
12841     S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
12842     PERL_SET_THX(my_perl);
12843
12844 #ifdef DEBUGGING
12845     PoisonNew(my_perl, 1, PerlInterpreter);
12846     PL_op = NULL;
12847     PL_curcop = NULL;
12848     PL_defstash = NULL; /* may be used by perl malloc() */
12849     PL_markstack = 0;
12850     PL_scopestack = 0;
12851     PL_scopestack_name = 0;
12852     PL_savestack = 0;
12853     PL_savestack_ix = 0;
12854     PL_savestack_max = -1;
12855     PL_sig_pending = 0;
12856     PL_parser = NULL;
12857     Zero(&PL_debug_pad, 1, struct perl_debug_pad);
12858 #  ifdef DEBUG_LEAKING_SCALARS
12859     PL_sv_serial = (((UV)my_perl >> 2) & 0xfff) * 1000000;
12860 #  endif
12861 #else   /* !DEBUGGING */
12862     Zero(my_perl, 1, PerlInterpreter);
12863 #endif  /* DEBUGGING */
12864
12865 #ifdef PERL_IMPLICIT_SYS
12866     /* host pointers */
12867     PL_Mem              = ipM;
12868     PL_MemShared        = ipMS;
12869     PL_MemParse         = ipMP;
12870     PL_Env              = ipE;
12871     PL_StdIO            = ipStd;
12872     PL_LIO              = ipLIO;
12873     PL_Dir              = ipD;
12874     PL_Sock             = ipS;
12875     PL_Proc             = ipP;
12876 #endif          /* PERL_IMPLICIT_SYS */
12877
12878     param->flags = flags;
12879     /* Nothing in the core code uses this, but we make it available to
12880        extensions (using mg_dup).  */
12881     param->proto_perl = proto_perl;
12882     /* Likely nothing will use this, but it is initialised to be consistent
12883        with Perl_clone_params_new().  */
12884     param->new_perl = my_perl;
12885     param->unreferenced = NULL;
12886
12887     INIT_TRACK_MEMPOOL(my_perl->Imemory_debug_header, my_perl);
12888
12889     PL_body_arenas = NULL;
12890     Zero(&PL_body_roots, 1, PL_body_roots);
12891     
12892     PL_sv_count         = 0;
12893     PL_sv_objcount      = 0;
12894     PL_sv_root          = NULL;
12895     PL_sv_arenaroot     = NULL;
12896
12897     PL_debug            = proto_perl->Idebug;
12898
12899     PL_hash_seed        = proto_perl->Ihash_seed;
12900     PL_rehash_seed      = proto_perl->Irehash_seed;
12901
12902     SvANY(&PL_sv_undef)         = NULL;
12903     SvREFCNT(&PL_sv_undef)      = (~(U32)0)/2;
12904     SvFLAGS(&PL_sv_undef)       = SVf_READONLY|SVt_NULL;
12905     SvREFCNT(&PL_sv_no)         = (~(U32)0)/2;
12906     SvFLAGS(&PL_sv_no)          = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
12907                                   |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
12908
12909     SvANY(&PL_sv_yes)           = new_XPVNV();
12910     SvREFCNT(&PL_sv_yes)        = (~(U32)0)/2;
12911     SvFLAGS(&PL_sv_yes)         = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
12912                                   |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
12913
12914     /* dbargs array probably holds garbage */
12915     PL_dbargs           = NULL;
12916
12917     PL_compiling = proto_perl->Icompiling;
12918
12919 #ifdef PERL_DEBUG_READONLY_OPS
12920     PL_slabs = NULL;
12921     PL_slab_count = 0;
12922 #endif
12923
12924     /* pseudo environmental stuff */
12925     PL_origargc         = proto_perl->Iorigargc;
12926     PL_origargv         = proto_perl->Iorigargv;
12927
12928     /* Set tainting stuff before PerlIO_debug can possibly get called */
12929     PL_tainting         = proto_perl->Itainting;
12930     PL_taint_warn       = proto_perl->Itaint_warn;
12931
12932     PL_minus_c          = proto_perl->Iminus_c;
12933
12934     PL_localpatches     = proto_perl->Ilocalpatches;
12935     PL_splitstr         = proto_perl->Isplitstr;
12936     PL_minus_n          = proto_perl->Iminus_n;
12937     PL_minus_p          = proto_perl->Iminus_p;
12938     PL_minus_l          = proto_perl->Iminus_l;
12939     PL_minus_a          = proto_perl->Iminus_a;
12940     PL_minus_E          = proto_perl->Iminus_E;
12941     PL_minus_F          = proto_perl->Iminus_F;
12942     PL_doswitches       = proto_perl->Idoswitches;
12943     PL_dowarn           = proto_perl->Idowarn;
12944     PL_sawampersand     = proto_perl->Isawampersand;
12945     PL_unsafe           = proto_perl->Iunsafe;
12946     PL_perldb           = proto_perl->Iperldb;
12947     PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
12948     PL_exit_flags       = proto_perl->Iexit_flags;
12949
12950     /* XXX time(&PL_basetime) when asked for? */
12951     PL_basetime         = proto_perl->Ibasetime;
12952
12953     PL_maxsysfd         = proto_perl->Imaxsysfd;
12954     PL_statusvalue      = proto_perl->Istatusvalue;
12955 #ifdef VMS
12956     PL_statusvalue_vms  = proto_perl->Istatusvalue_vms;
12957 #else
12958     PL_statusvalue_posix = proto_perl->Istatusvalue_posix;
12959 #endif
12960
12961     /* RE engine related */
12962     Zero(&PL_reg_state, 1, struct re_save_state);
12963     PL_reginterp_cnt    = 0;
12964     PL_regmatch_slab    = NULL;
12965
12966     PL_sub_generation   = proto_perl->Isub_generation;
12967
12968     /* funky return mechanisms */
12969     PL_forkprocess      = proto_perl->Iforkprocess;
12970
12971     /* internal state */
12972     PL_maxo             = proto_perl->Imaxo;
12973
12974     PL_main_start       = proto_perl->Imain_start;
12975     PL_eval_root        = proto_perl->Ieval_root;
12976     PL_eval_start       = proto_perl->Ieval_start;
12977
12978     PL_filemode         = proto_perl->Ifilemode;
12979     PL_lastfd           = proto_perl->Ilastfd;
12980     PL_oldname          = proto_perl->Ioldname;         /* XXX not quite right */
12981     PL_Argv             = NULL;
12982     PL_Cmd              = NULL;
12983     PL_gensym           = proto_perl->Igensym;
12984
12985     PL_laststatval      = proto_perl->Ilaststatval;
12986     PL_laststype        = proto_perl->Ilaststype;
12987     PL_mess_sv          = NULL;
12988
12989     PL_profiledata      = NULL;
12990
12991     PL_generation       = proto_perl->Igeneration;
12992
12993     PL_in_clean_objs    = proto_perl->Iin_clean_objs;
12994     PL_in_clean_all     = proto_perl->Iin_clean_all;
12995
12996     PL_uid              = proto_perl->Iuid;
12997     PL_euid             = proto_perl->Ieuid;
12998     PL_gid              = proto_perl->Igid;
12999     PL_egid             = proto_perl->Iegid;
13000     PL_nomemok          = proto_perl->Inomemok;
13001     PL_an               = proto_perl->Ian;
13002     PL_evalseq          = proto_perl->Ievalseq;
13003     PL_origenviron      = proto_perl->Iorigenviron;     /* XXX not quite right */
13004     PL_origalen         = proto_perl->Iorigalen;
13005
13006     PL_sighandlerp      = proto_perl->Isighandlerp;
13007
13008     PL_runops           = proto_perl->Irunops;
13009
13010     PL_subline          = proto_perl->Isubline;
13011
13012 #ifdef FCRYPT
13013     PL_cryptseen        = proto_perl->Icryptseen;
13014 #endif
13015
13016     PL_hints            = proto_perl->Ihints;
13017
13018     PL_amagic_generation        = proto_perl->Iamagic_generation;
13019
13020 #ifdef USE_LOCALE_COLLATE
13021     PL_collation_ix     = proto_perl->Icollation_ix;
13022     PL_collation_standard       = proto_perl->Icollation_standard;
13023     PL_collxfrm_base    = proto_perl->Icollxfrm_base;
13024     PL_collxfrm_mult    = proto_perl->Icollxfrm_mult;
13025 #endif /* USE_LOCALE_COLLATE */
13026
13027 #ifdef USE_LOCALE_NUMERIC
13028     PL_numeric_standard = proto_perl->Inumeric_standard;
13029     PL_numeric_local    = proto_perl->Inumeric_local;
13030 #endif /* !USE_LOCALE_NUMERIC */
13031
13032     /* Did the locale setup indicate UTF-8? */
13033     PL_utf8locale       = proto_perl->Iutf8locale;
13034     /* Unicode features (see perlrun/-C) */
13035     PL_unicode          = proto_perl->Iunicode;
13036
13037     /* Pre-5.8 signals control */
13038     PL_signals          = proto_perl->Isignals;
13039
13040     /* times() ticks per second */
13041     PL_clocktick        = proto_perl->Iclocktick;
13042
13043     /* Recursion stopper for PerlIO_find_layer */
13044     PL_in_load_module   = proto_perl->Iin_load_module;
13045
13046     /* sort() routine */
13047     PL_sort_RealCmp     = proto_perl->Isort_RealCmp;
13048
13049     /* Not really needed/useful since the reenrant_retint is "volatile",
13050      * but do it for consistency's sake. */
13051     PL_reentrant_retint = proto_perl->Ireentrant_retint;
13052
13053     /* Hooks to shared SVs and locks. */
13054     PL_sharehook        = proto_perl->Isharehook;
13055     PL_lockhook         = proto_perl->Ilockhook;
13056     PL_unlockhook       = proto_perl->Iunlockhook;
13057     PL_threadhook       = proto_perl->Ithreadhook;
13058     PL_destroyhook      = proto_perl->Idestroyhook;
13059     PL_signalhook       = proto_perl->Isignalhook;
13060
13061     PL_globhook         = proto_perl->Iglobhook;
13062
13063 #ifdef THREADS_HAVE_PIDS
13064     PL_ppid             = proto_perl->Ippid;
13065 #endif
13066
13067     /* swatch cache */
13068     PL_last_swash_hv    = NULL; /* reinits on demand */
13069     PL_last_swash_klen  = 0;
13070     PL_last_swash_key[0]= '\0';
13071     PL_last_swash_tmps  = (U8*)NULL;
13072     PL_last_swash_slen  = 0;
13073
13074     PL_glob_index       = proto_perl->Iglob_index;
13075     PL_srand_called     = proto_perl->Isrand_called;
13076
13077     if (flags & CLONEf_COPY_STACKS) {
13078         /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
13079         PL_tmps_ix              = proto_perl->Itmps_ix;
13080         PL_tmps_max             = proto_perl->Itmps_max;
13081         PL_tmps_floor           = proto_perl->Itmps_floor;
13082
13083         /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
13084          * NOTE: unlike the others! */
13085         PL_scopestack_ix        = proto_perl->Iscopestack_ix;
13086         PL_scopestack_max       = proto_perl->Iscopestack_max;
13087
13088         /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
13089          * NOTE: unlike the others! */
13090         PL_savestack_ix         = proto_perl->Isavestack_ix;
13091         PL_savestack_max        = proto_perl->Isavestack_max;
13092     }
13093
13094     PL_start_env        = proto_perl->Istart_env;       /* XXXXXX */
13095     PL_top_env          = &PL_start_env;
13096
13097     PL_op               = proto_perl->Iop;
13098
13099     PL_Sv               = NULL;
13100     PL_Xpv              = (XPV*)NULL;
13101     my_perl->Ina        = proto_perl->Ina;
13102
13103     PL_statbuf          = proto_perl->Istatbuf;
13104     PL_statcache        = proto_perl->Istatcache;
13105
13106 #ifdef HAS_TIMES
13107     PL_timesbuf         = proto_perl->Itimesbuf;
13108 #endif
13109
13110     PL_tainted          = proto_perl->Itainted;
13111     PL_curpm            = proto_perl->Icurpm;   /* XXX No PMOP ref count */
13112
13113     PL_chopset          = proto_perl->Ichopset; /* XXX never deallocated */
13114
13115     PL_restartjmpenv    = proto_perl->Irestartjmpenv;
13116     PL_restartop        = proto_perl->Irestartop;
13117     PL_in_eval          = proto_perl->Iin_eval;
13118     PL_delaymagic       = proto_perl->Idelaymagic;
13119     PL_phase            = proto_perl->Iphase;
13120     PL_localizing       = proto_perl->Ilocalizing;
13121
13122     PL_hv_fetch_ent_mh  = NULL;
13123     PL_modcount         = proto_perl->Imodcount;
13124     PL_lastgotoprobe    = NULL;
13125     PL_dumpindent       = proto_perl->Idumpindent;
13126
13127     PL_efloatbuf        = NULL;         /* reinits on demand */
13128     PL_efloatsize       = 0;                    /* reinits on demand */
13129
13130     /* regex stuff */
13131
13132     PL_regdummy         = proto_perl->Iregdummy;
13133     PL_colorset         = 0;            /* reinits PL_colors[] */
13134     /*PL_colors[6]      = {0,0,0,0,0,0};*/
13135
13136     /* Pluggable optimizer */
13137     PL_peepp            = proto_perl->Ipeepp;
13138     PL_rpeepp           = proto_perl->Irpeepp;
13139     /* op_free() hook */
13140     PL_opfreehook       = proto_perl->Iopfreehook;
13141
13142 #ifdef USE_REENTRANT_API
13143     /* XXX: things like -Dm will segfault here in perlio, but doing
13144      *  PERL_SET_CONTEXT(proto_perl);
13145      * breaks too many other things
13146      */
13147     Perl_reentrant_init(aTHX);
13148 #endif
13149
13150     /* create SV map for pointer relocation */
13151     PL_ptr_table = ptr_table_new();
13152
13153     /* initialize these special pointers as early as possible */
13154     ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
13155
13156     SvANY(&PL_sv_no)            = new_XPVNV();
13157     SvPV_set(&PL_sv_no, savepvn(PL_No, 0));
13158     SvCUR_set(&PL_sv_no, 0);
13159     SvLEN_set(&PL_sv_no, 1);
13160     SvIV_set(&PL_sv_no, 0);
13161     SvNV_set(&PL_sv_no, 0);
13162     ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
13163
13164     SvPV_set(&PL_sv_yes, savepvn(PL_Yes, 1));
13165     SvCUR_set(&PL_sv_yes, 1);
13166     SvLEN_set(&PL_sv_yes, 2);
13167     SvIV_set(&PL_sv_yes, 1);
13168     SvNV_set(&PL_sv_yes, 1);
13169     ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
13170
13171     /* create (a non-shared!) shared string table */
13172     PL_strtab           = newHV();
13173     HvSHAREKEYS_off(PL_strtab);
13174     hv_ksplit(PL_strtab, HvTOTALKEYS(proto_perl->Istrtab));
13175     ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
13176
13177     /* These two PVs will be free'd special way so must set them same way op.c does */
13178     PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
13179     ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
13180
13181     PL_compiling.cop_file    = savesharedpv(PL_compiling.cop_file);
13182     ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
13183
13184     ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
13185     PL_compiling.cop_warnings = DUP_WARNINGS(PL_compiling.cop_warnings);
13186     CopHINTHASH_set(&PL_compiling, cophh_copy(CopHINTHASH_get(&PL_compiling)));
13187     PL_curcop           = (COP*)any_dup(proto_perl->Icurcop, proto_perl);
13188
13189     param->stashes      = newAV();  /* Setup array of objects to call clone on */
13190     /* This makes no difference to the implementation, as it always pushes
13191        and shifts pointers to other SVs without changing their reference
13192        count, with the array becoming empty before it is freed. However, it
13193        makes it conceptually clear what is going on, and will avoid some
13194        work inside av.c, filling slots between AvFILL() and AvMAX() with
13195        &PL_sv_undef, and SvREFCNT_dec()ing those.  */
13196     AvREAL_off(param->stashes);
13197
13198     if (!(flags & CLONEf_COPY_STACKS)) {
13199         param->unreferenced = newAV();
13200     }
13201
13202 #ifdef PERLIO_LAYERS
13203     /* Clone PerlIO tables as soon as we can handle general xx_dup() */
13204     PerlIO_clone(aTHX_ proto_perl, param);
13205 #endif
13206
13207     PL_envgv            = gv_dup(proto_perl->Ienvgv, param);
13208     PL_incgv            = gv_dup(proto_perl->Iincgv, param);
13209     PL_hintgv           = gv_dup(proto_perl->Ihintgv, param);
13210     PL_origfilename     = SAVEPV(proto_perl->Iorigfilename);
13211     PL_diehook          = sv_dup_inc(proto_perl->Idiehook, param);
13212     PL_warnhook         = sv_dup_inc(proto_perl->Iwarnhook, param);
13213
13214     /* switches */
13215     PL_patchlevel       = sv_dup_inc(proto_perl->Ipatchlevel, param);
13216     PL_apiversion       = sv_dup_inc(proto_perl->Iapiversion, param);
13217     PL_inplace          = SAVEPV(proto_perl->Iinplace);
13218     PL_e_script         = sv_dup_inc(proto_perl->Ie_script, param);
13219
13220     /* magical thingies */
13221     PL_formfeed         = sv_dup(proto_perl->Iformfeed, param);
13222
13223     PL_encoding         = sv_dup(proto_perl->Iencoding, param);
13224
13225     sv_setpvs(PERL_DEBUG_PAD(0), "");   /* For regex debugging. */
13226     sv_setpvs(PERL_DEBUG_PAD(1), "");   /* ext/re needs these */
13227     sv_setpvs(PERL_DEBUG_PAD(2), "");   /* even without DEBUGGING. */
13228
13229    
13230     /* Clone the regex array */
13231     /* ORANGE FIXME for plugins, probably in the SV dup code.
13232        newSViv(PTR2IV(CALLREGDUPE(
13233        INT2PTR(REGEXP *, SvIVX(regex)), param))))
13234     */
13235     PL_regex_padav = av_dup_inc(proto_perl->Iregex_padav, param);
13236     PL_regex_pad = AvARRAY(PL_regex_padav);
13237
13238     /* shortcuts to various I/O objects */
13239     PL_ofsgv            = gv_dup_inc(proto_perl->Iofsgv, param);
13240     PL_stdingv          = gv_dup(proto_perl->Istdingv, param);
13241     PL_stderrgv         = gv_dup(proto_perl->Istderrgv, param);
13242     PL_defgv            = gv_dup(proto_perl->Idefgv, param);
13243     PL_argvgv           = gv_dup(proto_perl->Iargvgv, param);
13244     PL_argvoutgv        = gv_dup(proto_perl->Iargvoutgv, param);
13245     PL_argvout_stack    = av_dup_inc(proto_perl->Iargvout_stack, param);
13246
13247     /* shortcuts to regexp stuff */
13248     PL_replgv           = gv_dup(proto_perl->Ireplgv, param);
13249
13250     /* shortcuts to misc objects */
13251     PL_errgv            = gv_dup(proto_perl->Ierrgv, param);
13252
13253     /* shortcuts to debugging objects */
13254     PL_DBgv             = gv_dup(proto_perl->IDBgv, param);
13255     PL_DBline           = gv_dup(proto_perl->IDBline, param);
13256     PL_DBsub            = gv_dup(proto_perl->IDBsub, param);
13257     PL_DBsingle         = sv_dup(proto_perl->IDBsingle, param);
13258     PL_DBtrace          = sv_dup(proto_perl->IDBtrace, param);
13259     PL_DBsignal         = sv_dup(proto_perl->IDBsignal, param);
13260
13261     /* symbol tables */
13262     PL_defstash         = hv_dup_inc(proto_perl->Idefstash, param);
13263     PL_curstash         = hv_dup_inc(proto_perl->Icurstash, param);
13264     PL_debstash         = hv_dup(proto_perl->Idebstash, param);
13265     PL_globalstash      = hv_dup(proto_perl->Iglobalstash, param);
13266     PL_curstname        = sv_dup_inc(proto_perl->Icurstname, param);
13267
13268     PL_beginav          = av_dup_inc(proto_perl->Ibeginav, param);
13269     PL_beginav_save     = av_dup_inc(proto_perl->Ibeginav_save, param);
13270     PL_checkav_save     = av_dup_inc(proto_perl->Icheckav_save, param);
13271     PL_unitcheckav      = av_dup_inc(proto_perl->Iunitcheckav, param);
13272     PL_unitcheckav_save = av_dup_inc(proto_perl->Iunitcheckav_save, param);
13273     PL_endav            = av_dup_inc(proto_perl->Iendav, param);
13274     PL_checkav          = av_dup_inc(proto_perl->Icheckav, param);
13275     PL_initav           = av_dup_inc(proto_perl->Iinitav, param);
13276
13277     PL_isarev           = hv_dup_inc(proto_perl->Iisarev, param);
13278
13279     /* subprocess state */
13280     PL_fdpid            = av_dup_inc(proto_perl->Ifdpid, param);
13281
13282     if (proto_perl->Iop_mask)
13283         PL_op_mask      = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
13284     else
13285         PL_op_mask      = NULL;
13286     /* PL_asserting        = proto_perl->Iasserting; */
13287
13288     /* current interpreter roots */
13289     PL_main_cv          = cv_dup_inc(proto_perl->Imain_cv, param);
13290     OP_REFCNT_LOCK;
13291     PL_main_root        = OpREFCNT_inc(proto_perl->Imain_root);
13292     OP_REFCNT_UNLOCK;
13293
13294     /* runtime control stuff */
13295     PL_curcopdb         = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
13296
13297     PL_preambleav       = av_dup_inc(proto_perl->Ipreambleav, param);
13298
13299     PL_ors_sv           = sv_dup_inc(proto_perl->Iors_sv, param);
13300
13301     /* interpreter atexit processing */
13302     PL_exitlistlen      = proto_perl->Iexitlistlen;
13303     if (PL_exitlistlen) {
13304         Newx(PL_exitlist, PL_exitlistlen, PerlExitListEntry);
13305         Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
13306     }
13307     else
13308         PL_exitlist     = (PerlExitListEntry*)NULL;
13309
13310     PL_my_cxt_size = proto_perl->Imy_cxt_size;
13311     if (PL_my_cxt_size) {
13312         Newx(PL_my_cxt_list, PL_my_cxt_size, void *);
13313         Copy(proto_perl->Imy_cxt_list, PL_my_cxt_list, PL_my_cxt_size, void *);
13314 #ifdef PERL_GLOBAL_STRUCT_PRIVATE
13315         Newx(PL_my_cxt_keys, PL_my_cxt_size, const char *);
13316         Copy(proto_perl->Imy_cxt_keys, PL_my_cxt_keys, PL_my_cxt_size, char *);
13317 #endif
13318     }
13319     else {
13320         PL_my_cxt_list  = (void**)NULL;
13321 #ifdef PERL_GLOBAL_STRUCT_PRIVATE
13322         PL_my_cxt_keys  = (const char**)NULL;
13323 #endif
13324     }
13325     PL_modglobal        = hv_dup_inc(proto_perl->Imodglobal, param);
13326     PL_custom_op_names  = hv_dup_inc(proto_perl->Icustom_op_names,param);
13327     PL_custom_op_descs  = hv_dup_inc(proto_perl->Icustom_op_descs,param);
13328     PL_custom_ops       = hv_dup_inc(proto_perl->Icustom_ops, param);
13329
13330     PL_compcv                   = cv_dup(proto_perl->Icompcv, param);
13331
13332     PAD_CLONE_VARS(proto_perl, param);
13333
13334 #ifdef HAVE_INTERP_INTERN
13335     sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
13336 #endif
13337
13338     PL_DBcv             = cv_dup(proto_perl->IDBcv, param);
13339
13340 #ifdef PERL_USES_PL_PIDSTATUS
13341     PL_pidstatus        = newHV();                      /* XXX flag for cloning? */
13342 #endif
13343     PL_osname           = SAVEPV(proto_perl->Iosname);
13344     PL_parser           = parser_dup(proto_perl->Iparser, param);
13345
13346     /* XXX this only works if the saved cop has already been cloned */
13347     if (proto_perl->Iparser) {
13348         PL_parser->saved_curcop = (COP*)any_dup(
13349                                     proto_perl->Iparser->saved_curcop,
13350                                     proto_perl);
13351     }
13352
13353     PL_subname          = sv_dup_inc(proto_perl->Isubname, param);
13354
13355 #ifdef USE_LOCALE_COLLATE
13356     PL_collation_name   = SAVEPV(proto_perl->Icollation_name);
13357 #endif /* USE_LOCALE_COLLATE */
13358
13359 #ifdef USE_LOCALE_NUMERIC
13360     PL_numeric_name     = SAVEPV(proto_perl->Inumeric_name);
13361     PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
13362 #endif /* !USE_LOCALE_NUMERIC */
13363
13364     /* utf8 character classes */
13365     PL_utf8_alnum       = sv_dup_inc(proto_perl->Iutf8_alnum, param);
13366     PL_utf8_alpha       = sv_dup_inc(proto_perl->Iutf8_alpha, param);
13367     PL_utf8_space       = sv_dup_inc(proto_perl->Iutf8_space, param);
13368     PL_utf8_graph       = sv_dup_inc(proto_perl->Iutf8_graph, param);
13369     PL_utf8_digit       = sv_dup_inc(proto_perl->Iutf8_digit, param);
13370     PL_utf8_upper       = sv_dup_inc(proto_perl->Iutf8_upper, param);
13371     PL_utf8_lower       = sv_dup_inc(proto_perl->Iutf8_lower, param);
13372     PL_utf8_print       = sv_dup_inc(proto_perl->Iutf8_print, param);
13373     PL_utf8_punct       = sv_dup_inc(proto_perl->Iutf8_punct, param);
13374     PL_utf8_xdigit      = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
13375     PL_utf8_mark        = sv_dup_inc(proto_perl->Iutf8_mark, param);
13376     PL_utf8_X_begin     = sv_dup_inc(proto_perl->Iutf8_X_begin, param);
13377     PL_utf8_X_extend    = sv_dup_inc(proto_perl->Iutf8_X_extend, param);
13378     PL_utf8_X_prepend   = sv_dup_inc(proto_perl->Iutf8_X_prepend, param);
13379     PL_utf8_X_non_hangul        = sv_dup_inc(proto_perl->Iutf8_X_non_hangul, param);
13380     PL_utf8_X_L = sv_dup_inc(proto_perl->Iutf8_X_L, param);
13381     PL_utf8_X_LV        = sv_dup_inc(proto_perl->Iutf8_X_LV, param);
13382     PL_utf8_X_LVT       = sv_dup_inc(proto_perl->Iutf8_X_LVT, param);
13383     PL_utf8_X_T = sv_dup_inc(proto_perl->Iutf8_X_T, param);
13384     PL_utf8_X_V = sv_dup_inc(proto_perl->Iutf8_X_V, param);
13385     PL_utf8_X_LV_LVT_V  = sv_dup_inc(proto_perl->Iutf8_X_LV_LVT_V, param);
13386     PL_utf8_toupper     = sv_dup_inc(proto_perl->Iutf8_toupper, param);
13387     PL_utf8_totitle     = sv_dup_inc(proto_perl->Iutf8_totitle, param);
13388     PL_utf8_tolower     = sv_dup_inc(proto_perl->Iutf8_tolower, param);
13389     PL_utf8_tofold      = sv_dup_inc(proto_perl->Iutf8_tofold, param);
13390     PL_utf8_idstart     = sv_dup_inc(proto_perl->Iutf8_idstart, param);
13391     PL_utf8_xidstart    = sv_dup_inc(proto_perl->Iutf8_xidstart, param);
13392     PL_utf8_perl_idstart = sv_dup_inc(proto_perl->Iutf8_perl_idstart, param);
13393     PL_utf8_idcont      = sv_dup_inc(proto_perl->Iutf8_idcont, param);
13394     PL_utf8_xidcont     = sv_dup_inc(proto_perl->Iutf8_xidcont, param);
13395     PL_utf8_foldable    = sv_dup_inc(proto_perl->Iutf8_foldable, param);
13396
13397
13398     if (proto_perl->Ipsig_pend) {
13399         Newxz(PL_psig_pend, SIG_SIZE, int);
13400     }
13401     else {
13402         PL_psig_pend    = (int*)NULL;
13403     }
13404
13405     if (proto_perl->Ipsig_name) {
13406         Newx(PL_psig_name, 2 * SIG_SIZE, SV*);
13407         sv_dup_inc_multiple(proto_perl->Ipsig_name, PL_psig_name, 2 * SIG_SIZE,
13408                             param);
13409         PL_psig_ptr = PL_psig_name + SIG_SIZE;
13410     }
13411     else {
13412         PL_psig_ptr     = (SV**)NULL;
13413         PL_psig_name    = (SV**)NULL;
13414     }
13415
13416     if (flags & CLONEf_COPY_STACKS) {
13417         Newx(PL_tmps_stack, PL_tmps_max, SV*);
13418         sv_dup_inc_multiple(proto_perl->Itmps_stack, PL_tmps_stack,
13419                             PL_tmps_ix+1, param);
13420
13421         /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
13422         i = proto_perl->Imarkstack_max - proto_perl->Imarkstack;
13423         Newxz(PL_markstack, i, I32);
13424         PL_markstack_max        = PL_markstack + (proto_perl->Imarkstack_max
13425                                                   - proto_perl->Imarkstack);
13426         PL_markstack_ptr        = PL_markstack + (proto_perl->Imarkstack_ptr
13427                                                   - proto_perl->Imarkstack);
13428         Copy(proto_perl->Imarkstack, PL_markstack,
13429              PL_markstack_ptr - PL_markstack + 1, I32);
13430
13431         /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
13432          * NOTE: unlike the others! */
13433         Newxz(PL_scopestack, PL_scopestack_max, I32);
13434         Copy(proto_perl->Iscopestack, PL_scopestack, PL_scopestack_ix, I32);
13435
13436 #ifdef DEBUGGING
13437         Newxz(PL_scopestack_name, PL_scopestack_max, const char *);
13438         Copy(proto_perl->Iscopestack_name, PL_scopestack_name, PL_scopestack_ix, const char *);
13439 #endif
13440         /* NOTE: si_dup() looks at PL_markstack */
13441         PL_curstackinfo         = si_dup(proto_perl->Icurstackinfo, param);
13442
13443         /* PL_curstack          = PL_curstackinfo->si_stack; */
13444         PL_curstack             = av_dup(proto_perl->Icurstack, param);
13445         PL_mainstack            = av_dup(proto_perl->Imainstack, param);
13446
13447         /* next PUSHs() etc. set *(PL_stack_sp+1) */
13448         PL_stack_base           = AvARRAY(PL_curstack);
13449         PL_stack_sp             = PL_stack_base + (proto_perl->Istack_sp
13450                                                    - proto_perl->Istack_base);
13451         PL_stack_max            = PL_stack_base + AvMAX(PL_curstack);
13452
13453         /*Newxz(PL_savestack, PL_savestack_max, ANY);*/
13454         PL_savestack            = ss_dup(proto_perl, param);
13455     }
13456     else {
13457         init_stacks();
13458         ENTER;                  /* perl_destruct() wants to LEAVE; */
13459     }
13460
13461     PL_statgv           = gv_dup(proto_perl->Istatgv, param);
13462     PL_statname         = sv_dup_inc(proto_perl->Istatname, param);
13463
13464     PL_rs               = sv_dup_inc(proto_perl->Irs, param);
13465     PL_last_in_gv       = gv_dup(proto_perl->Ilast_in_gv, param);
13466     PL_defoutgv         = gv_dup_inc(proto_perl->Idefoutgv, param);
13467     PL_toptarget        = sv_dup_inc(proto_perl->Itoptarget, param);
13468     PL_bodytarget       = sv_dup_inc(proto_perl->Ibodytarget, param);
13469     PL_formtarget       = sv_dup(proto_perl->Iformtarget, param);
13470
13471     PL_errors           = sv_dup_inc(proto_perl->Ierrors, param);
13472
13473     PL_sortcop          = (OP*)any_dup(proto_perl->Isortcop, proto_perl);
13474     PL_sortstash        = hv_dup(proto_perl->Isortstash, param);
13475     PL_firstgv          = gv_dup(proto_perl->Ifirstgv, param);
13476     PL_secondgv         = gv_dup(proto_perl->Isecondgv, param);
13477
13478     PL_stashcache       = newHV();
13479
13480     PL_watchaddr        = (char **) ptr_table_fetch(PL_ptr_table,
13481                                             proto_perl->Iwatchaddr);
13482     PL_watchok          = PL_watchaddr ? * PL_watchaddr : NULL;
13483     if (PL_debug && PL_watchaddr) {
13484         PerlIO_printf(Perl_debug_log,
13485           "WATCHING: %"UVxf" cloned as %"UVxf" with value %"UVxf"\n",
13486           PTR2UV(proto_perl->Iwatchaddr), PTR2UV(PL_watchaddr),
13487           PTR2UV(PL_watchok));
13488     }
13489
13490     PL_registered_mros  = hv_dup_inc(proto_perl->Iregistered_mros, param);
13491     PL_blockhooks       = av_dup_inc(proto_perl->Iblockhooks, param);
13492     PL_utf8_foldclosures = hv_dup_inc(proto_perl->Iutf8_foldclosures, param);
13493
13494     /* Call the ->CLONE method, if it exists, for each of the stashes
13495        identified by sv_dup() above.
13496     */
13497     while(av_len(param->stashes) != -1) {
13498         HV* const stash = MUTABLE_HV(av_shift(param->stashes));
13499         GV* const cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
13500         if (cloner && GvCV(cloner)) {
13501             dSP;
13502             ENTER;
13503             SAVETMPS;
13504             PUSHMARK(SP);
13505             mXPUSHs(newSVhek(HvNAME_HEK(stash)));
13506             PUTBACK;
13507             call_sv(MUTABLE_SV(GvCV(cloner)), G_DISCARD);
13508             FREETMPS;
13509             LEAVE;
13510         }
13511     }
13512
13513     if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
13514         ptr_table_free(PL_ptr_table);
13515         PL_ptr_table = NULL;
13516     }
13517
13518     if (!(flags & CLONEf_COPY_STACKS)) {
13519         unreferenced_to_tmp_stack(param->unreferenced);
13520     }
13521
13522     SvREFCNT_dec(param->stashes);
13523
13524     /* orphaned? eg threads->new inside BEGIN or use */
13525     if (PL_compcv && ! SvREFCNT(PL_compcv)) {
13526         SvREFCNT_inc_simple_void(PL_compcv);
13527         SAVEFREESV(PL_compcv);
13528     }
13529
13530     return my_perl;
13531 }
13532
13533 static void
13534 S_unreferenced_to_tmp_stack(pTHX_ AV *const unreferenced)
13535 {
13536     PERL_ARGS_ASSERT_UNREFERENCED_TO_TMP_STACK;
13537     
13538     if (AvFILLp(unreferenced) > -1) {
13539         SV **svp = AvARRAY(unreferenced);
13540         SV **const last = svp + AvFILLp(unreferenced);
13541         SSize_t count = 0;
13542
13543         do {
13544             if (SvREFCNT(*svp) == 1)
13545                 ++count;
13546         } while (++svp <= last);
13547
13548         EXTEND_MORTAL(count);
13549         svp = AvARRAY(unreferenced);
13550
13551         do {
13552             if (SvREFCNT(*svp) == 1) {
13553                 /* Our reference is the only one to this SV. This means that
13554                    in this thread, the scalar effectively has a 0 reference.
13555                    That doesn't work (cleanup never happens), so donate our
13556                    reference to it onto the save stack. */
13557                 PL_tmps_stack[++PL_tmps_ix] = *svp;
13558             } else {
13559                 /* As an optimisation, because we are already walking the
13560                    entire array, instead of above doing either
13561                    SvREFCNT_inc(*svp) or *svp = &PL_sv_undef, we can instead
13562                    release our reference to the scalar, so that at the end of
13563                    the array owns zero references to the scalars it happens to
13564                    point to. We are effectively converting the array from
13565                    AvREAL() on to AvREAL() off. This saves the av_clear()
13566                    (triggered by the SvREFCNT_dec(unreferenced) below) from
13567                    walking the array a second time.  */
13568                 SvREFCNT_dec(*svp);
13569             }
13570
13571         } while (++svp <= last);
13572         AvREAL_off(unreferenced);
13573     }
13574     SvREFCNT_dec(unreferenced);
13575 }
13576
13577 void
13578 Perl_clone_params_del(CLONE_PARAMS *param)
13579 {
13580     /* This seemingly funky ordering keeps the build with PERL_GLOBAL_STRUCT
13581        happy: */
13582     PerlInterpreter *const to = param->new_perl;
13583     dTHXa(to);
13584     PerlInterpreter *const was = PERL_GET_THX;
13585
13586     PERL_ARGS_ASSERT_CLONE_PARAMS_DEL;
13587
13588     if (was != to) {
13589         PERL_SET_THX(to);
13590     }
13591
13592     SvREFCNT_dec(param->stashes);
13593     if (param->unreferenced)
13594         unreferenced_to_tmp_stack(param->unreferenced);
13595
13596     Safefree(param);
13597
13598     if (was != to) {
13599         PERL_SET_THX(was);
13600     }
13601 }
13602
13603 CLONE_PARAMS *
13604 Perl_clone_params_new(PerlInterpreter *const from, PerlInterpreter *const to)
13605 {
13606     dVAR;
13607     /* Need to play this game, as newAV() can call safesysmalloc(), and that
13608        does a dTHX; to get the context from thread local storage.
13609        FIXME - under PERL_CORE Newx(), Safefree() and friends should expand to
13610        a version that passes in my_perl.  */
13611     PerlInterpreter *const was = PERL_GET_THX;
13612     CLONE_PARAMS *param;
13613
13614     PERL_ARGS_ASSERT_CLONE_PARAMS_NEW;
13615
13616     if (was != to) {
13617         PERL_SET_THX(to);
13618     }
13619
13620     /* Given that we've set the context, we can do this unshared.  */
13621     Newx(param, 1, CLONE_PARAMS);
13622
13623     param->flags = 0;
13624     param->proto_perl = from;
13625     param->new_perl = to;
13626     param->stashes = (AV *)Perl_newSV_type(to, SVt_PVAV);
13627     AvREAL_off(param->stashes);
13628     param->unreferenced = (AV *)Perl_newSV_type(to, SVt_PVAV);
13629
13630     if (was != to) {
13631         PERL_SET_THX(was);
13632     }
13633     return param;
13634 }
13635
13636 #endif /* USE_ITHREADS */
13637
13638 /*
13639 =head1 Unicode Support
13640
13641 =for apidoc sv_recode_to_utf8
13642
13643 The encoding is assumed to be an Encode object, on entry the PV
13644 of the sv is assumed to be octets in that encoding, and the sv
13645 will be converted into Unicode (and UTF-8).
13646
13647 If the sv already is UTF-8 (or if it is not POK), or if the encoding
13648 is not a reference, nothing is done to the sv.  If the encoding is not
13649 an C<Encode::XS> Encoding object, bad things will happen.
13650 (See F<lib/encoding.pm> and L<Encode>.)
13651
13652 The PV of the sv is returned.
13653
13654 =cut */
13655
13656 char *
13657 Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
13658 {
13659     dVAR;
13660
13661     PERL_ARGS_ASSERT_SV_RECODE_TO_UTF8;
13662
13663     if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
13664         SV *uni;
13665         STRLEN len;
13666         const char *s;
13667         dSP;
13668         ENTER;
13669         SAVETMPS;
13670         save_re_context();
13671         PUSHMARK(sp);
13672         EXTEND(SP, 3);
13673         XPUSHs(encoding);
13674         XPUSHs(sv);
13675 /*
13676   NI-S 2002/07/09
13677   Passing sv_yes is wrong - it needs to be or'ed set of constants
13678   for Encode::XS, while UTf-8 decode (currently) assumes a true value means
13679   remove converted chars from source.
13680
13681   Both will default the value - let them.
13682
13683         XPUSHs(&PL_sv_yes);
13684 */
13685         PUTBACK;
13686         call_method("decode", G_SCALAR);
13687         SPAGAIN;
13688         uni = POPs;
13689         PUTBACK;
13690         s = SvPV_const(uni, len);
13691         if (s != SvPVX_const(sv)) {
13692             SvGROW(sv, len + 1);
13693             Move(s, SvPVX(sv), len + 1, char);
13694             SvCUR_set(sv, len);
13695         }
13696         FREETMPS;
13697         LEAVE;
13698         if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
13699             /* clear pos and any utf8 cache */
13700             MAGIC * mg = mg_find(sv, PERL_MAGIC_regex_global);
13701             if (mg)
13702                 mg->mg_len = -1;
13703             if ((mg = mg_find(sv, PERL_MAGIC_utf8)))
13704                 magic_setutf8(sv,mg); /* clear UTF8 cache */
13705         }
13706         SvUTF8_on(sv);
13707         return SvPVX(sv);
13708     }
13709     return SvPOKp(sv) ? SvPVX(sv) : NULL;
13710 }
13711
13712 /*
13713 =for apidoc sv_cat_decode
13714
13715 The encoding is assumed to be an Encode object, the PV of the ssv is
13716 assumed to be octets in that encoding and decoding the input starts
13717 from the position which (PV + *offset) pointed to.  The dsv will be
13718 concatenated the decoded UTF-8 string from ssv.  Decoding will terminate
13719 when the string tstr appears in decoding output or the input ends on
13720 the PV of the ssv.  The value which the offset points will be modified
13721 to the last input position on the ssv.
13722
13723 Returns TRUE if the terminator was found, else returns FALSE.
13724
13725 =cut */
13726
13727 bool
13728 Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
13729                    SV *ssv, int *offset, char *tstr, int tlen)
13730 {
13731     dVAR;
13732     bool ret = FALSE;
13733
13734     PERL_ARGS_ASSERT_SV_CAT_DECODE;
13735
13736     if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) {
13737         SV *offsv;
13738         dSP;
13739         ENTER;
13740         SAVETMPS;
13741         save_re_context();
13742         PUSHMARK(sp);
13743         EXTEND(SP, 6);
13744         XPUSHs(encoding);
13745         XPUSHs(dsv);
13746         XPUSHs(ssv);
13747         offsv = newSViv(*offset);
13748         mXPUSHs(offsv);
13749         mXPUSHp(tstr, tlen);
13750         PUTBACK;
13751         call_method("cat_decode", G_SCALAR);
13752         SPAGAIN;
13753         ret = SvTRUE(TOPs);
13754         *offset = SvIV(offsv);
13755         PUTBACK;
13756         FREETMPS;
13757         LEAVE;
13758     }
13759     else
13760         Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
13761     return ret;
13762
13763 }
13764
13765 /* ---------------------------------------------------------------------
13766  *
13767  * support functions for report_uninit()
13768  */
13769
13770 /* the maxiumum size of array or hash where we will scan looking
13771  * for the undefined element that triggered the warning */
13772
13773 #define FUV_MAX_SEARCH_SIZE 1000
13774
13775 /* Look for an entry in the hash whose value has the same SV as val;
13776  * If so, return a mortal copy of the key. */
13777
13778 STATIC SV*
13779 S_find_hash_subscript(pTHX_ const HV *const hv, const SV *const val)
13780 {
13781     dVAR;
13782     register HE **array;
13783     I32 i;
13784
13785     PERL_ARGS_ASSERT_FIND_HASH_SUBSCRIPT;
13786
13787     if (!hv || SvMAGICAL(hv) || !HvARRAY(hv) ||
13788                         (HvTOTALKEYS(hv) > FUV_MAX_SEARCH_SIZE))
13789         return NULL;
13790
13791     array = HvARRAY(hv);
13792
13793     for (i=HvMAX(hv); i>0; i--) {
13794         register HE *entry;
13795         for (entry = array[i]; entry; entry = HeNEXT(entry)) {
13796             if (HeVAL(entry) != val)
13797                 continue;
13798             if (    HeVAL(entry) == &PL_sv_undef ||
13799                     HeVAL(entry) == &PL_sv_placeholder)
13800                 continue;
13801             if (!HeKEY(entry))
13802                 return NULL;
13803             if (HeKLEN(entry) == HEf_SVKEY)
13804                 return sv_mortalcopy(HeKEY_sv(entry));
13805             return sv_2mortal(newSVhek(HeKEY_hek(entry)));
13806         }
13807     }
13808     return NULL;
13809 }
13810
13811 /* Look for an entry in the array whose value has the same SV as val;
13812  * If so, return the index, otherwise return -1. */
13813
13814 STATIC I32
13815 S_find_array_subscript(pTHX_ const AV *const av, const SV *const val)
13816 {
13817     dVAR;
13818
13819     PERL_ARGS_ASSERT_FIND_ARRAY_SUBSCRIPT;
13820
13821     if (!av || SvMAGICAL(av) || !AvARRAY(av) ||
13822                         (AvFILLp(av) > FUV_MAX_SEARCH_SIZE))
13823         return -1;
13824
13825     if (val != &PL_sv_undef) {
13826         SV ** const svp = AvARRAY(av);
13827         I32 i;
13828
13829         for (i=AvFILLp(av); i>=0; i--)
13830             if (svp[i] == val)
13831                 return i;
13832     }
13833     return -1;
13834 }
13835
13836 /* S_varname(): return the name of a variable, optionally with a subscript.
13837  * If gv is non-zero, use the name of that global, along with gvtype (one
13838  * of "$", "@", "%"); otherwise use the name of the lexical at pad offset
13839  * targ.  Depending on the value of the subscript_type flag, return:
13840  */
13841
13842 #define FUV_SUBSCRIPT_NONE      1       /* "@foo"          */
13843 #define FUV_SUBSCRIPT_ARRAY     2       /* "$foo[aindex]"  */
13844 #define FUV_SUBSCRIPT_HASH      3       /* "$foo{keyname}" */
13845 #define FUV_SUBSCRIPT_WITHIN    4       /* "within @foo"   */
13846
13847 SV*
13848 Perl_varname(pTHX_ const GV *const gv, const char gvtype, PADOFFSET targ,
13849         const SV *const keyname, I32 aindex, int subscript_type)
13850 {
13851
13852     SV * const name = sv_newmortal();
13853     if (gv) {
13854         char buffer[2];
13855         buffer[0] = gvtype;
13856         buffer[1] = 0;
13857
13858         /* as gv_fullname4(), but add literal '^' for $^FOO names  */
13859
13860         gv_fullname4(name, gv, buffer, 0);
13861
13862         if ((unsigned int)SvPVX(name)[1] <= 26) {
13863             buffer[0] = '^';
13864             buffer[1] = SvPVX(name)[1] + 'A' - 1;
13865
13866             /* Swap the 1 unprintable control character for the 2 byte pretty
13867                version - ie substr($name, 1, 1) = $buffer; */
13868             sv_insert(name, 1, 1, buffer, 2);
13869         }
13870     }
13871     else {
13872         CV * const cv = find_runcv(NULL);
13873         SV *sv;
13874         AV *av;
13875
13876         if (!cv || !CvPADLIST(cv))
13877             return NULL;
13878         av = MUTABLE_AV((*av_fetch(CvPADLIST(cv), 0, FALSE)));
13879         sv = *av_fetch(av, targ, FALSE);
13880         sv_setsv(name, sv);
13881     }
13882
13883     if (subscript_type == FUV_SUBSCRIPT_HASH) {
13884         SV * const sv = newSV(0);
13885         *SvPVX(name) = '$';
13886         Perl_sv_catpvf(aTHX_ name, "{%s}",
13887             pv_display(sv,SvPVX_const(keyname), SvCUR(keyname), 0, 32));
13888         SvREFCNT_dec(sv);
13889     }
13890     else if (subscript_type == FUV_SUBSCRIPT_ARRAY) {
13891         *SvPVX(name) = '$';
13892         Perl_sv_catpvf(aTHX_ name, "[%"IVdf"]", (IV)aindex);
13893     }
13894     else if (subscript_type == FUV_SUBSCRIPT_WITHIN) {
13895         /* We know that name has no magic, so can use 0 instead of SV_GMAGIC */
13896         Perl_sv_insert_flags(aTHX_ name, 0, 0,  STR_WITH_LEN("within "), 0);
13897     }
13898
13899     return name;
13900 }
13901
13902
13903 /*
13904 =for apidoc find_uninit_var
13905
13906 Find the name of the undefined variable (if any) that caused the operator
13907 to issue a "Use of uninitialized value" warning.
13908 If match is true, only return a name if its value matches uninit_sv.
13909 So roughly speaking, if a unary operator (such as OP_COS) generates a
13910 warning, then following the direct child of the op may yield an
13911 OP_PADSV or OP_GV that gives the name of the undefined variable.  On the
13912 other hand, with OP_ADD there are two branches to follow, so we only print
13913 the variable name if we get an exact match.
13914
13915 The name is returned as a mortal SV.
13916
13917 Assumes that PL_op is the op that originally triggered the error, and that
13918 PL_comppad/PL_curpad points to the currently executing pad.
13919
13920 =cut
13921 */
13922
13923 STATIC SV *
13924 S_find_uninit_var(pTHX_ const OP *const obase, const SV *const uninit_sv,
13925                   bool match)
13926 {
13927     dVAR;
13928     SV *sv;
13929     const GV *gv;
13930     const OP *o, *o2, *kid;
13931
13932     if (!obase || (match && (!uninit_sv || uninit_sv == &PL_sv_undef ||
13933                             uninit_sv == &PL_sv_placeholder)))
13934         return NULL;
13935
13936     switch (obase->op_type) {
13937
13938     case OP_RV2AV:
13939     case OP_RV2HV:
13940     case OP_PADAV:
13941     case OP_PADHV:
13942       {
13943         const bool pad  = (obase->op_type == OP_PADAV || obase->op_type == OP_PADHV);
13944         const bool hash = (obase->op_type == OP_PADHV || obase->op_type == OP_RV2HV);
13945         I32 index = 0;
13946         SV *keysv = NULL;
13947         int subscript_type = FUV_SUBSCRIPT_WITHIN;
13948
13949         if (pad) { /* @lex, %lex */
13950             sv = PAD_SVl(obase->op_targ);
13951             gv = NULL;
13952         }
13953         else {
13954             if (cUNOPx(obase)->op_first->op_type == OP_GV) {
13955             /* @global, %global */
13956                 gv = cGVOPx_gv(cUNOPx(obase)->op_first);
13957                 if (!gv)
13958                     break;
13959                 sv = hash ? MUTABLE_SV(GvHV(gv)): MUTABLE_SV(GvAV(gv));
13960             }
13961             else if (obase == PL_op) /* @{expr}, %{expr} */
13962                 return find_uninit_var(cUNOPx(obase)->op_first,
13963                                                     uninit_sv, match);
13964             else /* @{expr}, %{expr} as a sub-expression */
13965                 return NULL;
13966         }
13967
13968         /* attempt to find a match within the aggregate */
13969         if (hash) {
13970             keysv = find_hash_subscript((const HV*)sv, uninit_sv);
13971             if (keysv)
13972                 subscript_type = FUV_SUBSCRIPT_HASH;
13973         }
13974         else {
13975             index = find_array_subscript((const AV *)sv, uninit_sv);
13976             if (index >= 0)
13977                 subscript_type = FUV_SUBSCRIPT_ARRAY;
13978         }
13979
13980         if (match && subscript_type == FUV_SUBSCRIPT_WITHIN)
13981             break;
13982
13983         return varname(gv, hash ? '%' : '@', obase->op_targ,
13984                                     keysv, index, subscript_type);
13985       }
13986
13987     case OP_RV2SV:
13988         if (cUNOPx(obase)->op_first->op_type == OP_GV) {
13989             /* $global */
13990             gv = cGVOPx_gv(cUNOPx(obase)->op_first);
13991             if (!gv || !GvSTASH(gv))
13992                 break;
13993             if (match && (GvSV(gv) != uninit_sv))
13994                 break;
13995             return varname(gv, '$', 0, NULL, 0, FUV_SUBSCRIPT_NONE);
13996         }
13997         /* ${expr} */
13998         return find_uninit_var(cUNOPx(obase)->op_first, uninit_sv, 1);
13999
14000     case OP_PADSV:
14001         if (match && PAD_SVl(obase->op_targ) != uninit_sv)
14002             break;
14003         return varname(NULL, '$', obase->op_targ,
14004                                     NULL, 0, FUV_SUBSCRIPT_NONE);
14005
14006     case OP_GVSV:
14007         gv = cGVOPx_gv(obase);
14008         if (!gv || (match && GvSV(gv) != uninit_sv) || !GvSTASH(gv))
14009             break;
14010         return varname(gv, '$', 0, NULL, 0, FUV_SUBSCRIPT_NONE);
14011
14012     case OP_AELEMFAST_LEX:
14013         if (match) {
14014             SV **svp;
14015             AV *av = MUTABLE_AV(PAD_SV(obase->op_targ));
14016             if (!av || SvRMAGICAL(av))
14017                 break;
14018             svp = av_fetch(av, (I32)obase->op_private, FALSE);
14019             if (!svp || *svp != uninit_sv)
14020                 break;
14021         }
14022         return varname(NULL, '$', obase->op_targ,
14023                        NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
14024     case OP_AELEMFAST:
14025         {
14026             gv = cGVOPx_gv(obase);
14027             if (!gv)
14028                 break;
14029             if (match) {
14030                 SV **svp;
14031                 AV *const av = GvAV(gv);
14032                 if (!av || SvRMAGICAL(av))
14033                     break;
14034                 svp = av_fetch(av, (I32)obase->op_private, FALSE);
14035                 if (!svp || *svp != uninit_sv)
14036                     break;
14037             }
14038             return varname(gv, '$', 0,
14039                     NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
14040         }
14041         break;
14042
14043     case OP_EXISTS:
14044         o = cUNOPx(obase)->op_first;
14045         if (!o || o->op_type != OP_NULL ||
14046                 ! (o->op_targ == OP_AELEM || o->op_targ == OP_HELEM))
14047             break;
14048         return find_uninit_var(cBINOPo->op_last, uninit_sv, match);
14049
14050     case OP_AELEM:
14051     case OP_HELEM:
14052     {
14053         bool negate = FALSE;
14054
14055         if (PL_op == obase)
14056             /* $a[uninit_expr] or $h{uninit_expr} */
14057             return find_uninit_var(cBINOPx(obase)->op_last, uninit_sv, match);
14058
14059         gv = NULL;
14060         o = cBINOPx(obase)->op_first;
14061         kid = cBINOPx(obase)->op_last;
14062
14063         /* get the av or hv, and optionally the gv */
14064         sv = NULL;
14065         if  (o->op_type == OP_PADAV || o->op_type == OP_PADHV) {
14066             sv = PAD_SV(o->op_targ);
14067         }
14068         else if ((o->op_type == OP_RV2AV || o->op_type == OP_RV2HV)
14069                 && cUNOPo->op_first->op_type == OP_GV)
14070         {
14071             gv = cGVOPx_gv(cUNOPo->op_first);
14072             if (!gv)
14073                 break;
14074             sv = o->op_type
14075                 == OP_RV2HV ? MUTABLE_SV(GvHV(gv)) : MUTABLE_SV(GvAV(gv));
14076         }
14077         if (!sv)
14078             break;
14079
14080         if (kid && kid->op_type == OP_NEGATE) {
14081             negate = TRUE;
14082             kid = cUNOPx(kid)->op_first;
14083         }
14084
14085         if (kid && kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid))) {
14086             /* index is constant */
14087             SV* kidsv;
14088             if (negate) {
14089                 kidsv = sv_2mortal(newSVpvs("-"));
14090                 sv_catsv(kidsv, cSVOPx_sv(kid));
14091             }
14092             else
14093                 kidsv = cSVOPx_sv(kid);
14094             if (match) {
14095                 if (SvMAGICAL(sv))
14096                     break;
14097                 if (obase->op_type == OP_HELEM) {
14098                     HE* he = hv_fetch_ent(MUTABLE_HV(sv), kidsv, 0, 0);
14099                     if (!he || HeVAL(he) != uninit_sv)
14100                         break;
14101                 }
14102                 else {
14103                     SV * const * const svp = av_fetch(MUTABLE_AV(sv),
14104                         negate ? - SvIV(cSVOPx_sv(kid)) : SvIV(cSVOPx_sv(kid)),
14105                         FALSE);
14106                     if (!svp || *svp != uninit_sv)
14107                         break;
14108                 }
14109             }
14110             if (obase->op_type == OP_HELEM)
14111                 return varname(gv, '%', o->op_targ,
14112                             kidsv, 0, FUV_SUBSCRIPT_HASH);
14113             else
14114                 return varname(gv, '@', o->op_targ, NULL,
14115                     negate ? - SvIV(cSVOPx_sv(kid)) : SvIV(cSVOPx_sv(kid)),
14116                     FUV_SUBSCRIPT_ARRAY);
14117         }
14118         else  {
14119             /* index is an expression;
14120              * attempt to find a match within the aggregate */
14121             if (obase->op_type == OP_HELEM) {
14122                 SV * const keysv = find_hash_subscript((const HV*)sv, uninit_sv);
14123                 if (keysv)
14124                     return varname(gv, '%', o->op_targ,
14125                                                 keysv, 0, FUV_SUBSCRIPT_HASH);
14126             }
14127             else {
14128                 const I32 index
14129                     = find_array_subscript((const AV *)sv, uninit_sv);
14130                 if (index >= 0)
14131                     return varname(gv, '@', o->op_targ,
14132                                         NULL, index, FUV_SUBSCRIPT_ARRAY);
14133             }
14134             if (match)
14135                 break;
14136             return varname(gv,
14137                 (o->op_type == OP_PADAV || o->op_type == OP_RV2AV)
14138                 ? '@' : '%',
14139                 o->op_targ, NULL, 0, FUV_SUBSCRIPT_WITHIN);
14140         }
14141         break;
14142     }
14143
14144     case OP_AASSIGN:
14145         /* only examine RHS */
14146         return find_uninit_var(cBINOPx(obase)->op_first, uninit_sv, match);
14147
14148     case OP_OPEN:
14149         o = cUNOPx(obase)->op_first;
14150         if (o->op_type == OP_PUSHMARK)
14151             o = o->op_sibling;
14152
14153         if (!o->op_sibling) {
14154             /* one-arg version of open is highly magical */
14155
14156             if (o->op_type == OP_GV) { /* open FOO; */
14157                 gv = cGVOPx_gv(o);
14158                 if (match && GvSV(gv) != uninit_sv)
14159                     break;
14160                 return varname(gv, '$', 0,
14161                             NULL, 0, FUV_SUBSCRIPT_NONE);
14162             }
14163             /* other possibilities not handled are:
14164              * open $x; or open my $x;  should return '${*$x}'
14165              * open expr;               should return '$'.expr ideally
14166              */
14167              break;
14168         }
14169         goto do_op;
14170
14171     /* ops where $_ may be an implicit arg */
14172     case OP_TRANS:
14173     case OP_TRANSR:
14174     case OP_SUBST:
14175     case OP_MATCH:
14176         if ( !(obase->op_flags & OPf_STACKED)) {
14177             if (uninit_sv == ((obase->op_private & OPpTARGET_MY)
14178                                  ? PAD_SVl(obase->op_targ)
14179                                  : DEFSV))
14180             {
14181                 sv = sv_newmortal();
14182                 sv_setpvs(sv, "$_");
14183                 return sv;
14184             }
14185         }
14186         goto do_op;
14187
14188     case OP_PRTF:
14189     case OP_PRINT:
14190     case OP_SAY:
14191         match = 1; /* print etc can return undef on defined args */
14192         /* skip filehandle as it can't produce 'undef' warning  */
14193         o = cUNOPx(obase)->op_first;
14194         if ((obase->op_flags & OPf_STACKED) && o->op_type == OP_PUSHMARK)
14195             o = o->op_sibling->op_sibling;
14196         goto do_op2;
14197
14198
14199     case OP_ENTEREVAL: /* could be eval $undef or $x='$undef'; eval $x */
14200     case OP_CUSTOM: /* XS or custom code could trigger random warnings */
14201
14202         /* the following ops are capable of returning PL_sv_undef even for
14203          * defined arg(s) */
14204
14205     case OP_BACKTICK:
14206     case OP_PIPE_OP:
14207     case OP_FILENO:
14208     case OP_BINMODE:
14209     case OP_TIED:
14210     case OP_GETC:
14211     case OP_SYSREAD:
14212     case OP_SEND:
14213     case OP_IOCTL:
14214     case OP_SOCKET:
14215     case OP_SOCKPAIR:
14216     case OP_BIND:
14217     case OP_CONNECT:
14218     case OP_LISTEN:
14219     case OP_ACCEPT:
14220     case OP_SHUTDOWN:
14221     case OP_SSOCKOPT:
14222     case OP_GETPEERNAME:
14223     case OP_FTRREAD:
14224     case OP_FTRWRITE:
14225     case OP_FTREXEC:
14226     case OP_FTROWNED:
14227     case OP_FTEREAD:
14228     case OP_FTEWRITE:
14229     case OP_FTEEXEC:
14230     case OP_FTEOWNED:
14231     case OP_FTIS:
14232     case OP_FTZERO:
14233     case OP_FTSIZE:
14234     case OP_FTFILE:
14235     case OP_FTDIR:
14236     case OP_FTLINK:
14237     case OP_FTPIPE:
14238     case OP_FTSOCK:
14239     case OP_FTBLK:
14240     case OP_FTCHR:
14241     case OP_FTTTY:
14242     case OP_FTSUID:
14243     case OP_FTSGID:
14244     case OP_FTSVTX:
14245     case OP_FTTEXT:
14246     case OP_FTBINARY:
14247     case OP_FTMTIME:
14248     case OP_FTATIME:
14249     case OP_FTCTIME:
14250     case OP_READLINK:
14251     case OP_OPEN_DIR:
14252     case OP_READDIR:
14253     case OP_TELLDIR:
14254     case OP_SEEKDIR:
14255     case OP_REWINDDIR:
14256     case OP_CLOSEDIR:
14257     case OP_GMTIME:
14258     case OP_ALARM:
14259     case OP_SEMGET:
14260     case OP_GETLOGIN:
14261     case OP_UNDEF:
14262     case OP_SUBSTR:
14263     case OP_AEACH:
14264     case OP_EACH:
14265     case OP_SORT:
14266     case OP_CALLER:
14267     case OP_DOFILE:
14268     case OP_PROTOTYPE:
14269     case OP_NCMP:
14270     case OP_SMARTMATCH:
14271     case OP_UNPACK:
14272     case OP_SYSOPEN:
14273     case OP_SYSSEEK:
14274         match = 1;
14275         goto do_op;
14276
14277     case OP_ENTERSUB:
14278     case OP_GOTO:
14279         /* XXX tmp hack: these two may call an XS sub, and currently
14280           XS subs don't have a SUB entry on the context stack, so CV and
14281           pad determination goes wrong, and BAD things happen. So, just
14282           don't try to determine the value under those circumstances.
14283           Need a better fix at dome point. DAPM 11/2007 */
14284         break;
14285
14286     case OP_FLIP:
14287     case OP_FLOP:
14288     {
14289         GV * const gv = gv_fetchpvs(".", GV_NOTQUAL, SVt_PV);
14290         if (gv && GvSV(gv) == uninit_sv)
14291             return newSVpvs_flags("$.", SVs_TEMP);
14292         goto do_op;
14293     }
14294
14295     case OP_POS:
14296         /* def-ness of rval pos() is independent of the def-ness of its arg */
14297         if ( !(obase->op_flags & OPf_MOD))
14298             break;
14299
14300     case OP_SCHOMP:
14301     case OP_CHOMP:
14302         if (SvROK(PL_rs) && uninit_sv == SvRV(PL_rs))
14303             return newSVpvs_flags("${$/}", SVs_TEMP);
14304         /*FALLTHROUGH*/
14305
14306     default:
14307     do_op:
14308         if (!(obase->op_flags & OPf_KIDS))
14309             break;
14310         o = cUNOPx(obase)->op_first;
14311         
14312     do_op2:
14313         if (!o)
14314             break;
14315
14316         /* This loop checks all the kid ops, skipping any that cannot pos-
14317          * sibly be responsible for the uninitialized value; i.e., defined
14318          * constants and ops that return nothing.  If there is only one op
14319          * left that is not skipped, then we *know* it is responsible for
14320          * the uninitialized value.  If there is more than one op left, we
14321          * have to look for an exact match in the while() loop below.
14322          */
14323         o2 = NULL;
14324         for (kid=o; kid; kid = kid->op_sibling) {
14325             if (kid) {
14326                 const OPCODE type = kid->op_type;
14327                 if ( (type == OP_CONST && SvOK(cSVOPx_sv(kid)))
14328                   || (type == OP_NULL  && ! (kid->op_flags & OPf_KIDS))
14329                   || (type == OP_PUSHMARK)
14330                 )
14331                 continue;
14332             }
14333             if (o2) { /* more than one found */
14334                 o2 = NULL;
14335                 break;
14336             }
14337             o2 = kid;
14338         }
14339         if (o2)
14340             return find_uninit_var(o2, uninit_sv, match);
14341
14342         /* scan all args */
14343         while (o) {
14344             sv = find_uninit_var(o, uninit_sv, 1);
14345             if (sv)
14346                 return sv;
14347             o = o->op_sibling;
14348         }
14349         break;
14350     }
14351     return NULL;
14352 }
14353
14354
14355 /*
14356 =for apidoc report_uninit
14357
14358 Print appropriate "Use of uninitialized variable" warning.
14359
14360 =cut
14361 */
14362
14363 void
14364 Perl_report_uninit(pTHX_ const SV *uninit_sv)
14365 {
14366     dVAR;
14367     if (PL_op) {
14368         SV* varname = NULL;
14369         if (uninit_sv && PL_curpad) {
14370             varname = find_uninit_var(PL_op, uninit_sv,0);
14371             if (varname)
14372                 sv_insert(varname, 0, 0, " ", 1);
14373         }
14374         /* diag_listed_as: Use of uninitialized value%s */
14375         Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit_sv,
14376                 SVfARG(varname ? varname : &PL_sv_no),
14377                 " in ", OP_DESC(PL_op));
14378     }
14379     else
14380         Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
14381                     "", "", "");
14382 }
14383
14384 /*
14385  * Local variables:
14386  * c-indentation-style: bsd
14387  * c-basic-offset: 4
14388  * indent-tabs-mode: t
14389  * End:
14390  *
14391  * ex: set ts=8 sts=4 sw=4 noet:
14392  */