xref: /openbsd-src/gnu/usr.bin/perl/sv.c (revision 50b7afb2c2c0993b0894d4e34bf857cb13ed9c80)
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 #endif
70 
71 /* ============================================================================
72 
73 =head1 Allocation and deallocation of SVs.
74 
75 An SV (or AV, HV, etc.) is allocated in two parts: the head (struct
76 sv, av, hv...) contains type and reference count information, and for
77 many types, a pointer to the body (struct xrv, xpv, xpviv...), which
78 contains fields specific to each type.  Some types store all they need
79 in the head, so don't have a body.
80 
81 In all but the most memory-paranoid configurations (ex: PURIFY), heads
82 and bodies are allocated out of arenas, which by default are
83 approximately 4K chunks of memory parcelled up into N heads or bodies.
84 Sv-bodies are allocated by their sv-type, guaranteeing size
85 consistency needed to allocate safely from arrays.
86 
87 For SV-heads, the first slot in each arena is reserved, and holds a
88 link to the next arena, some flags, and a note of the number of slots.
89 Snaked through each arena chain is a linked list of free items; when
90 this becomes empty, an extra arena is allocated and divided up into N
91 items which are threaded into the free list.
92 
93 SV-bodies are similar, but they use arena-sets by default, which
94 separate the link and info from the arena itself, and reclaim the 1st
95 slot in the arena.  SV-bodies are further described later.
96 
97 The following global variables are associated with arenas:
98 
99     PL_sv_arenaroot	pointer to list of SV arenas
100     PL_sv_root		pointer to list of free SV structures
101 
102     PL_body_arenas	head of linked-list of body arenas
103     PL_body_roots[]	array of pointers to list of free bodies of svtype
104 			arrays are indexed by the svtype needed
105 
106 A few special SV heads are not allocated from an arena, but are
107 instead directly created in the interpreter structure, eg PL_sv_undef.
108 The size of arenas can be changed from the default by setting
109 PERL_ARENA_SIZE appropriately at compile time.
110 
111 The SV arena serves the secondary purpose of allowing still-live SVs
112 to be located and destroyed during final cleanup.
113 
114 At the lowest level, the macros new_SV() and del_SV() grab and free
115 an SV head.  (If debugging with -DD, del_SV() calls the function S_del_sv()
116 to return the SV to the free list with error checking.) new_SV() calls
117 more_sv() / sv_add_arena() to add an extra arena if the free list is empty.
118 SVs in the free list have their SvTYPE field set to all ones.
119 
120 At the time of very final cleanup, sv_free_arenas() is called from
121 perl_destruct() to physically free all the arenas allocated since the
122 start of the interpreter.
123 
124 The function visit() scans the SV arenas list, and calls a specified
125 function for each SV it finds which is still live - ie which has an SvTYPE
126 other than all 1's, and a non-zero SvREFCNT. visit() is used by the
127 following functions (specified as [function that calls visit()] / [function
128 called by visit() for each SV]):
129 
130     sv_report_used() / do_report_used()
131 			dump all remaining SVs (debugging aid)
132 
133     sv_clean_objs() / do_clean_objs(),do_clean_named_objs(),
134 		      do_clean_named_io_objs(),do_curse()
135 			Attempt to free all objects pointed to by RVs,
136 			try to do the same for all objects indir-
137 			ectly referenced by typeglobs too, and
138 			then do a final sweep, cursing any
139 			objects that remain.  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) STMT_START { \
186 	if ((sv)->sv_debug_file) PerlMemShared_free((sv)->sv_debug_file); \
187     } STMT_END
188 #  define DEBUG_SV_SERIAL(sv)						    \
189     DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) del_SV\n",    \
190 	    PTR2UV(sv), (long)(sv)->sv_debug_serial))
191 #else
192 #  define FREE_SV_DEBUG_FILE(sv)
193 #  define DEBUG_SV_SERIAL(sv)	NOOP
194 #endif
195 
196 #ifdef PERL_POISON
197 #  define SvARENA_CHAIN(sv)	((sv)->sv_u.svu_rv)
198 #  define SvARENA_CHAIN_SET(sv,val)	(sv)->sv_u.svu_rv = MUTABLE_SV((val))
199 /* Whilst I'd love to do this, it seems that things like to check on
200    unreferenced scalars
201 #  define POSION_SV_HEAD(sv)	PoisonNew(sv, 1, struct STRUCT_SV)
202 */
203 #  define POSION_SV_HEAD(sv)	PoisonNew(&SvANY(sv), 1, void *), \
204 				PoisonNew(&SvREFCNT(sv), 1, U32)
205 #else
206 #  define SvARENA_CHAIN(sv)	SvANY(sv)
207 #  define SvARENA_CHAIN_SET(sv,val)	SvANY(sv) = (void *)(val)
208 #  define POSION_SV_HEAD(sv)
209 #endif
210 
211 /* Mark an SV head as unused, and add to free list.
212  *
213  * If SVf_BREAK is set, skip adding it to the free list, as this SV had
214  * its refcount artificially decremented during global destruction, so
215  * there may be dangling pointers to it. The last thing we want in that
216  * case is for it to be reused. */
217 
218 #define plant_SV(p) \
219     STMT_START {					\
220 	const U32 old_flags = SvFLAGS(p);			\
221 	MEM_LOG_DEL_SV(p, __FILE__, __LINE__, FUNCTION__);  \
222 	DEBUG_SV_SERIAL(p);				\
223 	FREE_SV_DEBUG_FILE(p);				\
224 	POSION_SV_HEAD(p);				\
225 	SvFLAGS(p) = SVTYPEMASK;			\
226 	if (!(old_flags & SVf_BREAK)) {		\
227 	    SvARENA_CHAIN_SET(p, PL_sv_root);	\
228 	    PL_sv_root = (p);				\
229 	}						\
230 	--PL_sv_count;					\
231     } STMT_END
232 
233 #define uproot_SV(p) \
234     STMT_START {					\
235 	(p) = PL_sv_root;				\
236 	PL_sv_root = MUTABLE_SV(SvARENA_CHAIN(p));		\
237 	++PL_sv_count;					\
238     } STMT_END
239 
240 
241 /* make some more SVs by adding another arena */
242 
243 STATIC SV*
244 S_more_sv(pTHX)
245 {
246     dVAR;
247     SV* sv;
248     char *chunk;                /* must use New here to match call to */
249     Newx(chunk,PERL_ARENA_SIZE,char);  /* Safefree() in sv_free_arenas() */
250     sv_add_arena(chunk, PERL_ARENA_SIZE, 0);
251     uproot_SV(sv);
252     return sv;
253 }
254 
255 /* new_SV(): return a new, empty SV head */
256 
257 #ifdef DEBUG_LEAKING_SCALARS
258 /* provide a real function for a debugger to play with */
259 STATIC SV*
260 S_new_SV(pTHX_ const char *file, int line, const char *func)
261 {
262     SV* sv;
263 
264     if (PL_sv_root)
265 	uproot_SV(sv);
266     else
267 	sv = S_more_sv(aTHX);
268     SvANY(sv) = 0;
269     SvREFCNT(sv) = 1;
270     SvFLAGS(sv) = 0;
271     sv->sv_debug_optype = PL_op ? PL_op->op_type : 0;
272     sv->sv_debug_line = (U16) (PL_parser && PL_parser->copline != NOLINE
273 		? PL_parser->copline
274 		:  PL_curcop
275 		    ? CopLINE(PL_curcop)
276 		    : 0
277 	    );
278     sv->sv_debug_inpad = 0;
279     sv->sv_debug_parent = NULL;
280     sv->sv_debug_file = PL_curcop ? savesharedpv(CopFILE(PL_curcop)): NULL;
281 
282     sv->sv_debug_serial = PL_sv_serial++;
283 
284     MEM_LOG_NEW_SV(sv, file, line, func);
285     DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) new_SV (from %s:%d [%s])\n",
286 	    PTR2UV(sv), (long)sv->sv_debug_serial, file, line, func));
287 
288     return sv;
289 }
290 #  define new_SV(p) (p)=S_new_SV(aTHX_ __FILE__, __LINE__, FUNCTION__)
291 
292 #else
293 #  define new_SV(p) \
294     STMT_START {					\
295 	if (PL_sv_root)					\
296 	    uproot_SV(p);				\
297 	else						\
298 	    (p) = S_more_sv(aTHX);			\
299 	SvANY(p) = 0;					\
300 	SvREFCNT(p) = 1;				\
301 	SvFLAGS(p) = 0;					\
302 	MEM_LOG_NEW_SV(p, __FILE__, __LINE__, FUNCTION__);  \
303     } STMT_END
304 #endif
305 
306 
307 /* del_SV(): return an empty SV head to the free list */
308 
309 #ifdef DEBUGGING
310 
311 #define del_SV(p) \
312     STMT_START {					\
313 	if (DEBUG_D_TEST)				\
314 	    del_sv(p);					\
315 	else						\
316 	    plant_SV(p);				\
317     } STMT_END
318 
319 STATIC void
320 S_del_sv(pTHX_ SV *p)
321 {
322     dVAR;
323 
324     PERL_ARGS_ASSERT_DEL_SV;
325 
326     if (DEBUG_D_TEST) {
327 	SV* sva;
328 	bool ok = 0;
329 	for (sva = PL_sv_arenaroot; sva; sva = MUTABLE_SV(SvANY(sva))) {
330 	    const SV * const sv = sva + 1;
331 	    const SV * const svend = &sva[SvREFCNT(sva)];
332 	    if (p >= sv && p < svend) {
333 		ok = 1;
334 		break;
335 	    }
336 	}
337 	if (!ok) {
338 	    Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),
339 			     "Attempt to free non-arena SV: 0x%"UVxf
340 			     pTHX__FORMAT, PTR2UV(p) pTHX__VALUE);
341 	    return;
342 	}
343     }
344     plant_SV(p);
345 }
346 
347 #else /* ! DEBUGGING */
348 
349 #define del_SV(p)   plant_SV(p)
350 
351 #endif /* DEBUGGING */
352 
353 
354 /*
355 =head1 SV Manipulation Functions
356 
357 =for apidoc sv_add_arena
358 
359 Given a chunk of memory, link it to the head of the list of arenas,
360 and split it into a list of free SVs.
361 
362 =cut
363 */
364 
365 static void
366 S_sv_add_arena(pTHX_ char *const ptr, const U32 size, const U32 flags)
367 {
368     dVAR;
369     SV *const sva = MUTABLE_SV(ptr);
370     SV* sv;
371     SV* svend;
372 
373     PERL_ARGS_ASSERT_SV_ADD_ARENA;
374 
375     /* The first SV in an arena isn't an SV. */
376     SvANY(sva) = (void *) PL_sv_arenaroot;		/* ptr to next arena */
377     SvREFCNT(sva) = size / sizeof(SV);		/* number of SV slots */
378     SvFLAGS(sva) = flags;			/* FAKE if not to be freed */
379 
380     PL_sv_arenaroot = sva;
381     PL_sv_root = sva + 1;
382 
383     svend = &sva[SvREFCNT(sva) - 1];
384     sv = sva + 1;
385     while (sv < svend) {
386 	SvARENA_CHAIN_SET(sv, (sv + 1));
387 #ifdef DEBUGGING
388 	SvREFCNT(sv) = 0;
389 #endif
390 	/* Must always set typemask because it's always checked in on cleanup
391 	   when the arenas are walked looking for objects.  */
392 	SvFLAGS(sv) = SVTYPEMASK;
393 	sv++;
394     }
395     SvARENA_CHAIN_SET(sv, 0);
396 #ifdef DEBUGGING
397     SvREFCNT(sv) = 0;
398 #endif
399     SvFLAGS(sv) = SVTYPEMASK;
400 }
401 
402 /* visit(): call the named function for each non-free SV in the arenas
403  * whose flags field matches the flags/mask args. */
404 
405 STATIC I32
406 S_visit(pTHX_ SVFUNC_t f, const U32 flags, const U32 mask)
407 {
408     dVAR;
409     SV* sva;
410     I32 visited = 0;
411 
412     PERL_ARGS_ASSERT_VISIT;
413 
414     for (sva = PL_sv_arenaroot; sva; sva = MUTABLE_SV(SvANY(sva))) {
415 	const SV * const svend = &sva[SvREFCNT(sva)];
416 	SV* sv;
417 	for (sv = sva + 1; sv < svend; ++sv) {
418 	    if (SvTYPE(sv) != (svtype)SVTYPEMASK
419 		    && (sv->sv_flags & mask) == flags
420 		    && SvREFCNT(sv))
421 	    {
422 		(FCALL)(aTHX_ sv);
423 		++visited;
424 	    }
425 	}
426     }
427     return visited;
428 }
429 
430 #ifdef DEBUGGING
431 
432 /* called by sv_report_used() for each live SV */
433 
434 static void
435 do_report_used(pTHX_ SV *const sv)
436 {
437     if (SvTYPE(sv) != (svtype)SVTYPEMASK) {
438 	PerlIO_printf(Perl_debug_log, "****\n");
439 	sv_dump(sv);
440     }
441 }
442 #endif
443 
444 /*
445 =for apidoc sv_report_used
446 
447 Dump the contents of all SVs not yet freed (debugging aid).
448 
449 =cut
450 */
451 
452 void
453 Perl_sv_report_used(pTHX)
454 {
455 #ifdef DEBUGGING
456     visit(do_report_used, 0, 0);
457 #else
458     PERL_UNUSED_CONTEXT;
459 #endif
460 }
461 
462 /* called by sv_clean_objs() for each live SV */
463 
464 static void
465 do_clean_objs(pTHX_ SV *const ref)
466 {
467     dVAR;
468     assert (SvROK(ref));
469     {
470 	SV * const target = SvRV(ref);
471 	if (SvOBJECT(target)) {
472 	    DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(ref)));
473 	    if (SvWEAKREF(ref)) {
474 		sv_del_backref(target, ref);
475 		SvWEAKREF_off(ref);
476 		SvRV_set(ref, NULL);
477 	    } else {
478 		SvROK_off(ref);
479 		SvRV_set(ref, NULL);
480 		SvREFCNT_dec_NN(target);
481 	    }
482 	}
483     }
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_NN(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_NN(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_NN(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_NN(obj);
527     }
528     SvREFCNT_dec_NN(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_NN(obj);
550     }
551     SvREFCNT_dec_NN(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_NN(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_ 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_PVMG && 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 (UNLIKELY(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 (UNLIKELY(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     case SVt_PVIV:
1333 	/* XXX Is this still needed?  Was it ever needed?   Surely as there is
1334 	   no route from NV to PVIV, NOK can never be true  */
1335 	assert(!SvNOKp(sv));
1336 	assert(!SvNOK(sv));
1337     case SVt_PVIO:
1338     case SVt_PVFM:
1339     case SVt_PVGV:
1340     case SVt_PVCV:
1341     case SVt_PVLV:
1342     case SVt_REGEXP:
1343     case SVt_PVMG:
1344     case SVt_PVNV:
1345     case SVt_PV:
1346 
1347 	assert(new_type_details->body_size);
1348 	/* We always allocated the full length item with PURIFY. To do this
1349 	   we fake things so that arena is false for all 16 types..  */
1350 	if(new_type_details->arena) {
1351 	    /* This points to the start of the allocated area.  */
1352 	    new_body_inline(new_body, new_type);
1353 	    Zero(new_body, new_type_details->body_size, char);
1354 	    new_body = ((char *)new_body) - new_type_details->offset;
1355 	} else {
1356 	    new_body = new_NOARENAZ(new_type_details);
1357 	}
1358 	SvANY(sv) = new_body;
1359 
1360 	if (old_type_details->copy) {
1361 	    /* There is now the potential for an upgrade from something without
1362 	       an offset (PVNV or PVMG) to something with one (PVCV, PVFM)  */
1363 	    int offset = old_type_details->offset;
1364 	    int length = old_type_details->copy;
1365 
1366 	    if (new_type_details->offset > old_type_details->offset) {
1367 		const int difference
1368 		    = new_type_details->offset - old_type_details->offset;
1369 		offset += difference;
1370 		length -= difference;
1371 	    }
1372 	    assert (length >= 0);
1373 
1374 	    Copy((char *)old_body + offset, (char *)new_body + offset, length,
1375 		 char);
1376 	}
1377 
1378 #ifndef NV_ZERO_IS_ALLBITS_ZERO
1379 	/* If NV 0.0 is stores as all bits 0 then Zero() already creates a
1380 	 * correct 0.0 for us.  Otherwise, if the old body didn't have an
1381 	 * NV slot, but the new one does, then we need to initialise the
1382 	 * freshly created NV slot with whatever the correct bit pattern is
1383 	 * for 0.0  */
1384 	if (old_type_details->zero_nv && !new_type_details->zero_nv
1385 	    && !isGV_with_GP(sv))
1386 	    SvNV_set(sv, 0);
1387 #endif
1388 
1389 	if (UNLIKELY(new_type == SVt_PVIO)) {
1390 	    IO * const io = MUTABLE_IO(sv);
1391 	    GV *iogv = gv_fetchpvs("IO::File::", GV_ADD, SVt_PVHV);
1392 
1393 	    SvOBJECT_on(io);
1394 	    /* Clear the stashcache because a new IO could overrule a package
1395 	       name */
1396             DEBUG_o(Perl_deb(aTHX_ "sv_upgrade clearing PL_stashcache\n"));
1397 	    hv_clear(PL_stashcache);
1398 
1399 	    SvSTASH_set(io, MUTABLE_HV(SvREFCNT_inc(GvHV(iogv))));
1400 	    IoPAGE_LEN(sv) = 60;
1401 	}
1402 	if (UNLIKELY(new_type == SVt_REGEXP))
1403 	    sv->sv_u.svu_rx = (regexp *)new_body;
1404 	else if (old_type < SVt_PV) {
1405 	    /* referant will be NULL unless the old type was SVt_IV emulating
1406 	       SVt_RV */
1407 	    sv->sv_u.svu_rv = referant;
1408 	}
1409 	break;
1410     default:
1411 	Perl_croak(aTHX_ "panic: sv_upgrade to unknown type %lu",
1412 		   (unsigned long)new_type);
1413     }
1414 
1415     if (old_type > SVt_IV) {
1416 #ifdef PURIFY
1417 	safefree(old_body);
1418 #else
1419 	/* Note that there is an assumption that all bodies of types that
1420 	   can be upgraded came from arenas. Only the more complex non-
1421 	   upgradable types are allowed to be directly malloc()ed.  */
1422 	assert(old_type_details->arena);
1423 	del_body((void*)((char*)old_body + old_type_details->offset),
1424 		 &PL_body_roots[old_type]);
1425 #endif
1426     }
1427 }
1428 
1429 /*
1430 =for apidoc sv_backoff
1431 
1432 Remove any string offset.  You should normally use the C<SvOOK_off> macro
1433 wrapper instead.
1434 
1435 =cut
1436 */
1437 
1438 int
1439 Perl_sv_backoff(pTHX_ SV *const sv)
1440 {
1441     STRLEN delta;
1442     const char * const s = SvPVX_const(sv);
1443 
1444     PERL_ARGS_ASSERT_SV_BACKOFF;
1445     PERL_UNUSED_CONTEXT;
1446 
1447     assert(SvOOK(sv));
1448     assert(SvTYPE(sv) != SVt_PVHV);
1449     assert(SvTYPE(sv) != SVt_PVAV);
1450 
1451     SvOOK_offset(sv, delta);
1452 
1453     SvLEN_set(sv, SvLEN(sv) + delta);
1454     SvPV_set(sv, SvPVX(sv) - delta);
1455     Move(s, SvPVX(sv), SvCUR(sv)+1, char);
1456     SvFLAGS(sv) &= ~SVf_OOK;
1457     return 0;
1458 }
1459 
1460 /*
1461 =for apidoc sv_grow
1462 
1463 Expands the character buffer in the SV.  If necessary, uses C<sv_unref> and
1464 upgrades the SV to C<SVt_PV>.  Returns a pointer to the character buffer.
1465 Use the C<SvGROW> wrapper instead.
1466 
1467 =cut
1468 */
1469 
1470 char *
1471 Perl_sv_grow(pTHX_ SV *const sv, STRLEN newlen)
1472 {
1473     char *s;
1474 
1475     PERL_ARGS_ASSERT_SV_GROW;
1476 
1477     if (PL_madskills && newlen >= 0x100000) {
1478 	PerlIO_printf(Perl_debug_log,
1479 		      "Allocation too large: %"UVxf"\n", (UV)newlen);
1480     }
1481 #ifdef HAS_64K_LIMIT
1482     if (newlen >= 0x10000) {
1483 	PerlIO_printf(Perl_debug_log,
1484 		      "Allocation too large: %"UVxf"\n", (UV)newlen);
1485 	my_exit(1);
1486     }
1487 #endif /* HAS_64K_LIMIT */
1488     if (SvROK(sv))
1489 	sv_unref(sv);
1490     if (SvTYPE(sv) < SVt_PV) {
1491 	sv_upgrade(sv, SVt_PV);
1492 	s = SvPVX_mutable(sv);
1493     }
1494     else if (SvOOK(sv)) {	/* pv is offset? */
1495 	sv_backoff(sv);
1496 	s = SvPVX_mutable(sv);
1497 	if (newlen > SvLEN(sv))
1498 	    newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
1499 #ifdef HAS_64K_LIMIT
1500 	if (newlen >= 0x10000)
1501 	    newlen = 0xFFFF;
1502 #endif
1503     }
1504     else
1505     {
1506 	if (SvIsCOW(sv)) sv_force_normal(sv);
1507 	s = SvPVX_mutable(sv);
1508     }
1509 
1510     if (newlen > SvLEN(sv)) {		/* need more room? */
1511 	STRLEN minlen = SvCUR(sv);
1512 	minlen += (minlen >> PERL_STRLEN_EXPAND_SHIFT) + 10;
1513 	if (newlen < minlen)
1514 	    newlen = minlen;
1515 #ifndef Perl_safesysmalloc_size
1516 	newlen = PERL_STRLEN_ROUNDUP(newlen);
1517 #endif
1518 	if (SvLEN(sv) && s) {
1519 	    s = (char*)saferealloc(s, newlen);
1520 	}
1521 	else {
1522 	    s = (char*)safemalloc(newlen);
1523 	    if (SvPVX_const(sv) && SvCUR(sv)) {
1524 	        Move(SvPVX_const(sv), s, (newlen < SvCUR(sv)) ? newlen : SvCUR(sv), char);
1525 	    }
1526 	}
1527 	SvPV_set(sv, s);
1528 #ifdef Perl_safesysmalloc_size
1529 	/* Do this here, do it once, do it right, and then we will never get
1530 	   called back into sv_grow() unless there really is some growing
1531 	   needed.  */
1532 	SvLEN_set(sv, Perl_safesysmalloc_size(s));
1533 #else
1534         SvLEN_set(sv, newlen);
1535 #endif
1536     }
1537     return s;
1538 }
1539 
1540 /*
1541 =for apidoc sv_setiv
1542 
1543 Copies an integer into the given SV, upgrading first if necessary.
1544 Does not handle 'set' magic.  See also C<sv_setiv_mg>.
1545 
1546 =cut
1547 */
1548 
1549 void
1550 Perl_sv_setiv(pTHX_ SV *const sv, const IV i)
1551 {
1552     dVAR;
1553 
1554     PERL_ARGS_ASSERT_SV_SETIV;
1555 
1556     SV_CHECK_THINKFIRST_COW_DROP(sv);
1557     switch (SvTYPE(sv)) {
1558     case SVt_NULL:
1559     case SVt_NV:
1560 	sv_upgrade(sv, SVt_IV);
1561 	break;
1562     case SVt_PV:
1563 	sv_upgrade(sv, SVt_PVIV);
1564 	break;
1565 
1566     case SVt_PVGV:
1567 	if (!isGV_with_GP(sv))
1568 	    break;
1569     case SVt_PVAV:
1570     case SVt_PVHV:
1571     case SVt_PVCV:
1572     case SVt_PVFM:
1573     case SVt_PVIO:
1574 	/* diag_listed_as: Can't coerce %s to %s in %s */
1575 	Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
1576 		   OP_DESC(PL_op));
1577     default: NOOP;
1578     }
1579     (void)SvIOK_only(sv);			/* validate number */
1580     SvIV_set(sv, i);
1581     SvTAINT(sv);
1582 }
1583 
1584 /*
1585 =for apidoc sv_setiv_mg
1586 
1587 Like C<sv_setiv>, but also handles 'set' magic.
1588 
1589 =cut
1590 */
1591 
1592 void
1593 Perl_sv_setiv_mg(pTHX_ SV *const sv, const IV i)
1594 {
1595     PERL_ARGS_ASSERT_SV_SETIV_MG;
1596 
1597     sv_setiv(sv,i);
1598     SvSETMAGIC(sv);
1599 }
1600 
1601 /*
1602 =for apidoc sv_setuv
1603 
1604 Copies an unsigned integer into the given SV, upgrading first if necessary.
1605 Does not handle 'set' magic.  See also C<sv_setuv_mg>.
1606 
1607 =cut
1608 */
1609 
1610 void
1611 Perl_sv_setuv(pTHX_ SV *const sv, const UV u)
1612 {
1613     PERL_ARGS_ASSERT_SV_SETUV;
1614 
1615     /* With the if statement to ensure that integers are stored as IVs whenever
1616        possible:
1617        u=1.49  s=0.52  cu=72.49  cs=10.64  scripts=270  tests=20865
1618 
1619        without
1620        u=1.35  s=0.47  cu=73.45  cs=11.43  scripts=270  tests=20865
1621 
1622        If you wish to remove the following if statement, so that this routine
1623        (and its callers) always return UVs, please benchmark to see what the
1624        effect is. Modern CPUs may be different. Or may not :-)
1625     */
1626     if (u <= (UV)IV_MAX) {
1627        sv_setiv(sv, (IV)u);
1628        return;
1629     }
1630     sv_setiv(sv, 0);
1631     SvIsUV_on(sv);
1632     SvUV_set(sv, u);
1633 }
1634 
1635 /*
1636 =for apidoc sv_setuv_mg
1637 
1638 Like C<sv_setuv>, but also handles 'set' magic.
1639 
1640 =cut
1641 */
1642 
1643 void
1644 Perl_sv_setuv_mg(pTHX_ SV *const sv, const UV u)
1645 {
1646     PERL_ARGS_ASSERT_SV_SETUV_MG;
1647 
1648     sv_setuv(sv,u);
1649     SvSETMAGIC(sv);
1650 }
1651 
1652 /*
1653 =for apidoc sv_setnv
1654 
1655 Copies a double into the given SV, upgrading first if necessary.
1656 Does not handle 'set' magic.  See also C<sv_setnv_mg>.
1657 
1658 =cut
1659 */
1660 
1661 void
1662 Perl_sv_setnv(pTHX_ SV *const sv, const NV num)
1663 {
1664     dVAR;
1665 
1666     PERL_ARGS_ASSERT_SV_SETNV;
1667 
1668     SV_CHECK_THINKFIRST_COW_DROP(sv);
1669     switch (SvTYPE(sv)) {
1670     case SVt_NULL:
1671     case SVt_IV:
1672 	sv_upgrade(sv, SVt_NV);
1673 	break;
1674     case SVt_PV:
1675     case SVt_PVIV:
1676 	sv_upgrade(sv, SVt_PVNV);
1677 	break;
1678 
1679     case SVt_PVGV:
1680 	if (!isGV_with_GP(sv))
1681 	    break;
1682     case SVt_PVAV:
1683     case SVt_PVHV:
1684     case SVt_PVCV:
1685     case SVt_PVFM:
1686     case SVt_PVIO:
1687 	/* diag_listed_as: Can't coerce %s to %s in %s */
1688 	Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
1689 		   OP_DESC(PL_op));
1690     default: NOOP;
1691     }
1692     SvNV_set(sv, num);
1693     (void)SvNOK_only(sv);			/* validate number */
1694     SvTAINT(sv);
1695 }
1696 
1697 /*
1698 =for apidoc sv_setnv_mg
1699 
1700 Like C<sv_setnv>, but also handles 'set' magic.
1701 
1702 =cut
1703 */
1704 
1705 void
1706 Perl_sv_setnv_mg(pTHX_ SV *const sv, const NV num)
1707 {
1708     PERL_ARGS_ASSERT_SV_SETNV_MG;
1709 
1710     sv_setnv(sv,num);
1711     SvSETMAGIC(sv);
1712 }
1713 
1714 /* Print an "isn't numeric" warning, using a cleaned-up,
1715  * printable version of the offending string
1716  */
1717 
1718 STATIC void
1719 S_not_a_number(pTHX_ SV *const sv)
1720 {
1721      dVAR;
1722      SV *dsv;
1723      char tmpbuf[64];
1724      const char *pv;
1725 
1726      PERL_ARGS_ASSERT_NOT_A_NUMBER;
1727 
1728      if (DO_UTF8(sv)) {
1729           dsv = newSVpvs_flags("", SVs_TEMP);
1730           pv = sv_uni_display(dsv, sv, 10, UNI_DISPLAY_ISPRINT);
1731      } else {
1732 	  char *d = tmpbuf;
1733 	  const char * const limit = tmpbuf + sizeof(tmpbuf) - 8;
1734 	  /* each *s can expand to 4 chars + "...\0",
1735 	     i.e. need room for 8 chars */
1736 
1737 	  const char *s = SvPVX_const(sv);
1738 	  const char * const end = s + SvCUR(sv);
1739 	  for ( ; s < end && d < limit; s++ ) {
1740 	       int ch = *s & 0xFF;
1741 	       if (ch & 128 && !isPRINT_LC(ch)) {
1742 		    *d++ = 'M';
1743 		    *d++ = '-';
1744 		    ch &= 127;
1745 	       }
1746 	       if (ch == '\n') {
1747 		    *d++ = '\\';
1748 		    *d++ = 'n';
1749 	       }
1750 	       else if (ch == '\r') {
1751 		    *d++ = '\\';
1752 		    *d++ = 'r';
1753 	       }
1754 	       else if (ch == '\f') {
1755 		    *d++ = '\\';
1756 		    *d++ = 'f';
1757 	       }
1758 	       else if (ch == '\\') {
1759 		    *d++ = '\\';
1760 		    *d++ = '\\';
1761 	       }
1762 	       else if (ch == '\0') {
1763 		    *d++ = '\\';
1764 		    *d++ = '0';
1765 	       }
1766 	       else if (isPRINT_LC(ch))
1767 		    *d++ = ch;
1768 	       else {
1769 		    *d++ = '^';
1770 		    *d++ = toCTRL(ch);
1771 	       }
1772 	  }
1773 	  if (s < end) {
1774 	       *d++ = '.';
1775 	       *d++ = '.';
1776 	       *d++ = '.';
1777 	  }
1778 	  *d = '\0';
1779 	  pv = tmpbuf;
1780     }
1781 
1782     if (PL_op)
1783 	Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
1784 		    /* diag_listed_as: Argument "%s" isn't numeric%s */
1785 		    "Argument \"%s\" isn't numeric in %s", pv,
1786 		    OP_DESC(PL_op));
1787     else
1788 	Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
1789 		    /* diag_listed_as: Argument "%s" isn't numeric%s */
1790 		    "Argument \"%s\" isn't numeric", pv);
1791 }
1792 
1793 /*
1794 =for apidoc looks_like_number
1795 
1796 Test if the content of an SV looks like a number (or is a number).
1797 C<Inf> and C<Infinity> are treated as numbers (so will not issue a
1798 non-numeric warning), even if your atof() doesn't grok them.  Get-magic is
1799 ignored.
1800 
1801 =cut
1802 */
1803 
1804 I32
1805 Perl_looks_like_number(pTHX_ SV *const sv)
1806 {
1807     const char *sbegin;
1808     STRLEN len;
1809 
1810     PERL_ARGS_ASSERT_LOOKS_LIKE_NUMBER;
1811 
1812     if (SvPOK(sv) || SvPOKp(sv)) {
1813 	sbegin = SvPV_nomg_const(sv, len);
1814     }
1815     else
1816 	return SvFLAGS(sv) & (SVf_NOK|SVp_NOK|SVf_IOK|SVp_IOK);
1817     return grok_number(sbegin, len, NULL);
1818 }
1819 
1820 STATIC bool
1821 S_glob_2number(pTHX_ GV * const gv)
1822 {
1823     PERL_ARGS_ASSERT_GLOB_2NUMBER;
1824 
1825     /* We know that all GVs stringify to something that is not-a-number,
1826 	so no need to test that.  */
1827     if (ckWARN(WARN_NUMERIC))
1828     {
1829 	SV *const buffer = sv_newmortal();
1830 	gv_efullname3(buffer, gv, "*");
1831 	not_a_number(buffer);
1832     }
1833     /* We just want something true to return, so that S_sv_2iuv_common
1834 	can tail call us and return true.  */
1835     return TRUE;
1836 }
1837 
1838 /* Actually, ISO C leaves conversion of UV to IV undefined, but
1839    until proven guilty, assume that things are not that bad... */
1840 
1841 /*
1842    NV_PRESERVES_UV:
1843 
1844    As 64 bit platforms often have an NV that doesn't preserve all bits of
1845    an IV (an assumption perl has been based on to date) it becomes necessary
1846    to remove the assumption that the NV always carries enough precision to
1847    recreate the IV whenever needed, and that the NV is the canonical form.
1848    Instead, IV/UV and NV need to be given equal rights. So as to not lose
1849    precision as a side effect of conversion (which would lead to insanity
1850    and the dragon(s) in t/op/numconvert.t getting very angry) the intent is
1851    1) to distinguish between IV/UV/NV slots that have cached a valid
1852       conversion where precision was lost and IV/UV/NV slots that have a
1853       valid conversion which has lost no precision
1854    2) to ensure that if a numeric conversion to one form is requested that
1855       would lose precision, the precise conversion (or differently
1856       imprecise conversion) is also performed and cached, to prevent
1857       requests for different numeric formats on the same SV causing
1858       lossy conversion chains. (lossless conversion chains are perfectly
1859       acceptable (still))
1860 
1861 
1862    flags are used:
1863    SvIOKp is true if the IV slot contains a valid value
1864    SvIOK  is true only if the IV value is accurate (UV if SvIOK_UV true)
1865    SvNOKp is true if the NV slot contains a valid value
1866    SvNOK  is true only if the NV value is accurate
1867 
1868    so
1869    while converting from PV to NV, check to see if converting that NV to an
1870    IV(or UV) would lose accuracy over a direct conversion from PV to
1871    IV(or UV). If it would, cache both conversions, return NV, but mark
1872    SV as IOK NOKp (ie not NOK).
1873 
1874    While converting from PV to IV, check to see if converting that IV to an
1875    NV would lose accuracy over a direct conversion from PV to NV. If it
1876    would, cache both conversions, flag similarly.
1877 
1878    Before, the SV value "3.2" could become NV=3.2 IV=3 NOK, IOK quite
1879    correctly because if IV & NV were set NV *always* overruled.
1880    Now, "3.2" will become NV=3.2 IV=3 NOK, IOKp, because the flag's meaning
1881    changes - now IV and NV together means that the two are interchangeable:
1882    SvIVX == (IV) SvNVX && SvNVX == (NV) SvIVX;
1883 
1884    The benefit of this is that operations such as pp_add know that if
1885    SvIOK is true for both left and right operands, then integer addition
1886    can be used instead of floating point (for cases where the result won't
1887    overflow). Before, floating point was always used, which could lead to
1888    loss of precision compared with integer addition.
1889 
1890    * making IV and NV equal status should make maths accurate on 64 bit
1891      platforms
1892    * may speed up maths somewhat if pp_add and friends start to use
1893      integers when possible instead of fp. (Hopefully the overhead in
1894      looking for SvIOK and checking for overflow will not outweigh the
1895      fp to integer speedup)
1896    * will slow down integer operations (callers of SvIV) on "inaccurate"
1897      values, as the change from SvIOK to SvIOKp will cause a call into
1898      sv_2iv each time rather than a macro access direct to the IV slot
1899    * should speed up number->string conversion on integers as IV is
1900      favoured when IV and NV are equally accurate
1901 
1902    ####################################################################
1903    You had better be using SvIOK_notUV if you want an IV for arithmetic:
1904    SvIOK is true if (IV or UV), so you might be getting (IV)SvUV.
1905    On the other hand, SvUOK is true iff UV.
1906    ####################################################################
1907 
1908    Your mileage will vary depending your CPU's relative fp to integer
1909    performance ratio.
1910 */
1911 
1912 #ifndef NV_PRESERVES_UV
1913 #  define IS_NUMBER_UNDERFLOW_IV 1
1914 #  define IS_NUMBER_UNDERFLOW_UV 2
1915 #  define IS_NUMBER_IV_AND_UV    2
1916 #  define IS_NUMBER_OVERFLOW_IV  4
1917 #  define IS_NUMBER_OVERFLOW_UV  5
1918 
1919 /* sv_2iuv_non_preserve(): private routine for use by sv_2iv() and sv_2uv() */
1920 
1921 /* For sv_2nv these three cases are "SvNOK and don't bother casting"  */
1922 STATIC int
1923 S_sv_2iuv_non_preserve(pTHX_ SV *const sv
1924 #  ifdef DEBUGGING
1925 		       , I32 numtype
1926 #  endif
1927 		       )
1928 {
1929     dVAR;
1930 
1931     PERL_ARGS_ASSERT_SV_2IUV_NON_PRESERVE;
1932 
1933     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));
1934     if (SvNVX(sv) < (NV)IV_MIN) {
1935 	(void)SvIOKp_on(sv);
1936 	(void)SvNOK_on(sv);
1937 	SvIV_set(sv, IV_MIN);
1938 	return IS_NUMBER_UNDERFLOW_IV;
1939     }
1940     if (SvNVX(sv) > (NV)UV_MAX) {
1941 	(void)SvIOKp_on(sv);
1942 	(void)SvNOK_on(sv);
1943 	SvIsUV_on(sv);
1944 	SvUV_set(sv, UV_MAX);
1945 	return IS_NUMBER_OVERFLOW_UV;
1946     }
1947     (void)SvIOKp_on(sv);
1948     (void)SvNOK_on(sv);
1949     /* Can't use strtol etc to convert this string.  (See truth table in
1950        sv_2iv  */
1951     if (SvNVX(sv) <= (UV)IV_MAX) {
1952         SvIV_set(sv, I_V(SvNVX(sv)));
1953         if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
1954             SvIOK_on(sv); /* Integer is precise. NOK, IOK */
1955         } else {
1956             /* Integer is imprecise. NOK, IOKp */
1957         }
1958         return SvNVX(sv) < 0 ? IS_NUMBER_UNDERFLOW_UV : IS_NUMBER_IV_AND_UV;
1959     }
1960     SvIsUV_on(sv);
1961     SvUV_set(sv, U_V(SvNVX(sv)));
1962     if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
1963         if (SvUVX(sv) == UV_MAX) {
1964             /* As we know that NVs don't preserve UVs, UV_MAX cannot
1965                possibly be preserved by NV. Hence, it must be overflow.
1966                NOK, IOKp */
1967             return IS_NUMBER_OVERFLOW_UV;
1968         }
1969         SvIOK_on(sv); /* Integer is precise. NOK, UOK */
1970     } else {
1971         /* Integer is imprecise. NOK, IOKp */
1972     }
1973     return IS_NUMBER_OVERFLOW_IV;
1974 }
1975 #endif /* !NV_PRESERVES_UV*/
1976 
1977 STATIC bool
1978 S_sv_2iuv_common(pTHX_ SV *const sv)
1979 {
1980     dVAR;
1981 
1982     PERL_ARGS_ASSERT_SV_2IUV_COMMON;
1983 
1984     if (SvNOKp(sv)) {
1985 	/* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
1986 	 * without also getting a cached IV/UV from it at the same time
1987 	 * (ie PV->NV conversion should detect loss of accuracy and cache
1988 	 * IV or UV at same time to avoid this. */
1989 	/* IV-over-UV optimisation - choose to cache IV if possible */
1990 
1991 	if (SvTYPE(sv) == SVt_NV)
1992 	    sv_upgrade(sv, SVt_PVNV);
1993 
1994 	(void)SvIOKp_on(sv);	/* Must do this first, to clear any SvOOK */
1995 	/* < not <= as for NV doesn't preserve UV, ((NV)IV_MAX+1) will almost
1996 	   certainly cast into the IV range at IV_MAX, whereas the correct
1997 	   answer is the UV IV_MAX +1. Hence < ensures that dodgy boundary
1998 	   cases go to UV */
1999 #if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2000 	if (Perl_isnan(SvNVX(sv))) {
2001 	    SvUV_set(sv, 0);
2002 	    SvIsUV_on(sv);
2003 	    return FALSE;
2004 	}
2005 #endif
2006 	if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2007 	    SvIV_set(sv, I_V(SvNVX(sv)));
2008 	    if (SvNVX(sv) == (NV) SvIVX(sv)
2009 #ifndef NV_PRESERVES_UV
2010 		&& (((UV)1 << NV_PRESERVES_UV_BITS) >
2011 		    (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
2012 		/* Don't flag it as "accurately an integer" if the number
2013 		   came from a (by definition imprecise) NV operation, and
2014 		   we're outside the range of NV integer precision */
2015 #endif
2016 		) {
2017 		if (SvNOK(sv))
2018 		    SvIOK_on(sv);  /* Can this go wrong with rounding? NWC */
2019 		else {
2020 		    /* scalar has trailing garbage, eg "42a" */
2021 		}
2022 		DEBUG_c(PerlIO_printf(Perl_debug_log,
2023 				      "0x%"UVxf" iv(%"NVgf" => %"IVdf") (precise)\n",
2024 				      PTR2UV(sv),
2025 				      SvNVX(sv),
2026 				      SvIVX(sv)));
2027 
2028 	    } else {
2029 		/* IV not precise.  No need to convert from PV, as NV
2030 		   conversion would already have cached IV if it detected
2031 		   that PV->IV would be better than PV->NV->IV
2032 		   flags already correct - don't set public IOK.  */
2033 		DEBUG_c(PerlIO_printf(Perl_debug_log,
2034 				      "0x%"UVxf" iv(%"NVgf" => %"IVdf") (imprecise)\n",
2035 				      PTR2UV(sv),
2036 				      SvNVX(sv),
2037 				      SvIVX(sv)));
2038 	    }
2039 	    /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
2040 	       but the cast (NV)IV_MIN rounds to a the value less (more
2041 	       negative) than IV_MIN which happens to be equal to SvNVX ??
2042 	       Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
2043 	       NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
2044 	       (NV)UVX == NVX are both true, but the values differ. :-(
2045 	       Hopefully for 2s complement IV_MIN is something like
2046 	       0x8000000000000000 which will be exact. NWC */
2047 	}
2048 	else {
2049 	    SvUV_set(sv, U_V(SvNVX(sv)));
2050 	    if (
2051 		(SvNVX(sv) == (NV) SvUVX(sv))
2052 #ifndef  NV_PRESERVES_UV
2053 		/* Make sure it's not 0xFFFFFFFFFFFFFFFF */
2054 		/*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
2055 		&& (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
2056 		/* Don't flag it as "accurately an integer" if the number
2057 		   came from a (by definition imprecise) NV operation, and
2058 		   we're outside the range of NV integer precision */
2059 #endif
2060 		&& SvNOK(sv)
2061 		)
2062 		SvIOK_on(sv);
2063 	    SvIsUV_on(sv);
2064 	    DEBUG_c(PerlIO_printf(Perl_debug_log,
2065 				  "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
2066 				  PTR2UV(sv),
2067 				  SvUVX(sv),
2068 				  SvUVX(sv)));
2069 	}
2070     }
2071     else if (SvPOKp(sv)) {
2072 	UV value;
2073 	const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2074 	/* We want to avoid a possible problem when we cache an IV/ a UV which
2075 	   may be later translated to an NV, and the resulting NV is not
2076 	   the same as the direct translation of the initial string
2077 	   (eg 123.456 can shortcut to the IV 123 with atol(), but we must
2078 	   be careful to ensure that the value with the .456 is around if the
2079 	   NV value is requested in the future).
2080 
2081 	   This means that if we cache such an IV/a UV, we need to cache the
2082 	   NV as well.  Moreover, we trade speed for space, and do not
2083 	   cache the NV if we are sure it's not needed.
2084 	 */
2085 
2086 	/* SVt_PVNV is one higher than SVt_PVIV, hence this order  */
2087 	if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2088 	     == IS_NUMBER_IN_UV) {
2089 	    /* It's definitely an integer, only upgrade to PVIV */
2090 	    if (SvTYPE(sv) < SVt_PVIV)
2091 		sv_upgrade(sv, SVt_PVIV);
2092 	    (void)SvIOK_on(sv);
2093 	} else if (SvTYPE(sv) < SVt_PVNV)
2094 	    sv_upgrade(sv, SVt_PVNV);
2095 
2096 	/* If NVs preserve UVs then we only use the UV value if we know that
2097 	   we aren't going to call atof() below. If NVs don't preserve UVs
2098 	   then the value returned may have more precision than atof() will
2099 	   return, even though value isn't perfectly accurate.  */
2100 	if ((numtype & (IS_NUMBER_IN_UV
2101 #ifdef NV_PRESERVES_UV
2102 			| IS_NUMBER_NOT_INT
2103 #endif
2104 	    )) == IS_NUMBER_IN_UV) {
2105 	    /* This won't turn off the public IOK flag if it was set above  */
2106 	    (void)SvIOKp_on(sv);
2107 
2108 	    if (!(numtype & IS_NUMBER_NEG)) {
2109 		/* positive */;
2110 		if (value <= (UV)IV_MAX) {
2111 		    SvIV_set(sv, (IV)value);
2112 		} else {
2113 		    /* it didn't overflow, and it was positive. */
2114 		    SvUV_set(sv, value);
2115 		    SvIsUV_on(sv);
2116 		}
2117 	    } else {
2118 		/* 2s complement assumption  */
2119 		if (value <= (UV)IV_MIN) {
2120 		    SvIV_set(sv, -(IV)value);
2121 		} else {
2122 		    /* Too negative for an IV.  This is a double upgrade, but
2123 		       I'm assuming it will be rare.  */
2124 		    if (SvTYPE(sv) < SVt_PVNV)
2125 			sv_upgrade(sv, SVt_PVNV);
2126 		    SvNOK_on(sv);
2127 		    SvIOK_off(sv);
2128 		    SvIOKp_on(sv);
2129 		    SvNV_set(sv, -(NV)value);
2130 		    SvIV_set(sv, IV_MIN);
2131 		}
2132 	    }
2133 	}
2134 	/* For !NV_PRESERVES_UV and IS_NUMBER_IN_UV and IS_NUMBER_NOT_INT we
2135            will be in the previous block to set the IV slot, and the next
2136            block to set the NV slot.  So no else here.  */
2137 
2138 	if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2139 	    != IS_NUMBER_IN_UV) {
2140 	    /* It wasn't an (integer that doesn't overflow the UV). */
2141 	    SvNV_set(sv, Atof(SvPVX_const(sv)));
2142 
2143 	    if (! numtype && ckWARN(WARN_NUMERIC))
2144 		not_a_number(sv);
2145 
2146 #if defined(USE_LONG_DOUBLE)
2147 	    DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%" PERL_PRIgldbl ")\n",
2148 				  PTR2UV(sv), SvNVX(sv)));
2149 #else
2150 	    DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"NVgf")\n",
2151 				  PTR2UV(sv), SvNVX(sv)));
2152 #endif
2153 
2154 #ifdef NV_PRESERVES_UV
2155             (void)SvIOKp_on(sv);
2156             (void)SvNOK_on(sv);
2157             if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2158                 SvIV_set(sv, I_V(SvNVX(sv)));
2159                 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2160                     SvIOK_on(sv);
2161                 } else {
2162 		    NOOP;  /* Integer is imprecise. NOK, IOKp */
2163                 }
2164                 /* UV will not work better than IV */
2165             } else {
2166                 if (SvNVX(sv) > (NV)UV_MAX) {
2167                     SvIsUV_on(sv);
2168                     /* Integer is inaccurate. NOK, IOKp, is UV */
2169                     SvUV_set(sv, UV_MAX);
2170                 } else {
2171                     SvUV_set(sv, U_V(SvNVX(sv)));
2172                     /* 0xFFFFFFFFFFFFFFFF not an issue in here, NVs
2173                        NV preservse UV so can do correct comparison.  */
2174                     if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2175                         SvIOK_on(sv);
2176                     } else {
2177 			NOOP;   /* Integer is imprecise. NOK, IOKp, is UV */
2178                     }
2179                 }
2180 		SvIsUV_on(sv);
2181             }
2182 #else /* NV_PRESERVES_UV */
2183             if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2184                 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
2185                 /* The IV/UV slot will have been set from value returned by
2186                    grok_number above.  The NV slot has just been set using
2187                    Atof.  */
2188 	        SvNOK_on(sv);
2189                 assert (SvIOKp(sv));
2190             } else {
2191                 if (((UV)1 << NV_PRESERVES_UV_BITS) >
2192                     U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2193                     /* Small enough to preserve all bits. */
2194                     (void)SvIOKp_on(sv);
2195                     SvNOK_on(sv);
2196                     SvIV_set(sv, I_V(SvNVX(sv)));
2197                     if ((NV)(SvIVX(sv)) == SvNVX(sv))
2198                         SvIOK_on(sv);
2199                     /* Assumption: first non-preserved integer is < IV_MAX,
2200                        this NV is in the preserved range, therefore: */
2201                     if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
2202                           < (UV)IV_MAX)) {
2203                         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);
2204                     }
2205                 } else {
2206                     /* IN_UV NOT_INT
2207                          0      0	already failed to read UV.
2208                          0      1       already failed to read UV.
2209                          1      0       you won't get here in this case. IV/UV
2210                          	        slot set, public IOK, Atof() unneeded.
2211                          1      1       already read UV.
2212                        so there's no point in sv_2iuv_non_preserve() attempting
2213                        to use atol, strtol, strtoul etc.  */
2214 #  ifdef DEBUGGING
2215                     sv_2iuv_non_preserve (sv, numtype);
2216 #  else
2217                     sv_2iuv_non_preserve (sv);
2218 #  endif
2219                 }
2220             }
2221 #endif /* NV_PRESERVES_UV */
2222 	/* It might be more code efficient to go through the entire logic above
2223 	   and conditionally set with SvIOKp_on() rather than SvIOK(), but it
2224 	   gets complex and potentially buggy, so more programmer efficient
2225 	   to do it this way, by turning off the public flags:  */
2226 	if (!numtype)
2227 	    SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK);
2228 	}
2229     }
2230     else  {
2231 	if (isGV_with_GP(sv))
2232 	    return glob_2number(MUTABLE_GV(sv));
2233 
2234 	if (!SvPADTMP(sv)) {
2235 	    if (!PL_localizing && ckWARN(WARN_UNINITIALIZED))
2236 		report_uninit(sv);
2237 	}
2238 	if (SvTYPE(sv) < SVt_IV)
2239 	    /* Typically the caller expects that sv_any is not NULL now.  */
2240 	    sv_upgrade(sv, SVt_IV);
2241 	/* Return 0 from the caller.  */
2242 	return TRUE;
2243     }
2244     return FALSE;
2245 }
2246 
2247 /*
2248 =for apidoc sv_2iv_flags
2249 
2250 Return the integer value of an SV, doing any necessary string
2251 conversion.  If flags includes SV_GMAGIC, does an mg_get() first.
2252 Normally used via the C<SvIV(sv)> and C<SvIVx(sv)> macros.
2253 
2254 =cut
2255 */
2256 
2257 IV
2258 Perl_sv_2iv_flags(pTHX_ SV *const sv, const I32 flags)
2259 {
2260     dVAR;
2261 
2262     if (!sv)
2263 	return 0;
2264 
2265     if (SvGMAGICAL(sv) && (flags & SV_GMAGIC))
2266 	mg_get(sv);
2267 
2268     if (SvROK(sv)) {
2269 	if (SvAMAGIC(sv)) {
2270 	    SV * tmpstr;
2271 	    if (flags & SV_SKIP_OVERLOAD)
2272 		return 0;
2273 	    tmpstr = AMG_CALLunary(sv, numer_amg);
2274 	    if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2275 		return SvIV(tmpstr);
2276 	    }
2277 	}
2278 	return PTR2IV(SvRV(sv));
2279     }
2280 
2281     if (SvVALID(sv) || isREGEXP(sv)) {
2282 	/* FBMs use the space for SvIVX and SvNVX for other purposes, and use
2283 	   the same flag bit as SVf_IVisUV, so must not let them cache IVs.
2284 	   In practice they are extremely unlikely to actually get anywhere
2285 	   accessible by user Perl code - the only way that I'm aware of is when
2286 	   a constant subroutine which is used as the second argument to index.
2287 
2288 	   Regexps have no SvIVX and SvNVX fields.
2289 	*/
2290 	assert(isREGEXP(sv) || SvPOKp(sv));
2291 	{
2292 	    UV value;
2293 	    const char * const ptr =
2294 		isREGEXP(sv) ? RX_WRAPPED((REGEXP*)sv) : SvPVX_const(sv);
2295 	    const int numtype
2296 		= grok_number(ptr, SvCUR(sv), &value);
2297 
2298 	    if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2299 		== IS_NUMBER_IN_UV) {
2300 		/* It's definitely an integer */
2301 		if (numtype & IS_NUMBER_NEG) {
2302 		    if (value < (UV)IV_MIN)
2303 			return -(IV)value;
2304 		} else {
2305 		    if (value < (UV)IV_MAX)
2306 			return (IV)value;
2307 		}
2308 	    }
2309 	    if (!numtype) {
2310 		if (ckWARN(WARN_NUMERIC))
2311 		    not_a_number(sv);
2312 	    }
2313 	    return I_V(Atof(ptr));
2314 	}
2315     }
2316 
2317     if (SvTHINKFIRST(sv)) {
2318 #ifdef PERL_OLD_COPY_ON_WRITE
2319 	if (SvIsCOW(sv)) {
2320 	    sv_force_normal_flags(sv, 0);
2321 	}
2322 #endif
2323 	if (SvREADONLY(sv) && !SvOK(sv)) {
2324 	    if (ckWARN(WARN_UNINITIALIZED))
2325 		report_uninit(sv);
2326 	    return 0;
2327 	}
2328     }
2329 
2330     if (!SvIOKp(sv)) {
2331 	if (S_sv_2iuv_common(aTHX_ sv))
2332 	    return 0;
2333     }
2334 
2335     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
2336 	PTR2UV(sv),SvIVX(sv)));
2337     return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
2338 }
2339 
2340 /*
2341 =for apidoc sv_2uv_flags
2342 
2343 Return the unsigned integer value of an SV, doing any necessary string
2344 conversion.  If flags includes SV_GMAGIC, does an mg_get() first.
2345 Normally used via the C<SvUV(sv)> and C<SvUVx(sv)> macros.
2346 
2347 =cut
2348 */
2349 
2350 UV
2351 Perl_sv_2uv_flags(pTHX_ SV *const sv, const I32 flags)
2352 {
2353     dVAR;
2354 
2355     if (!sv)
2356 	return 0;
2357 
2358     if (SvGMAGICAL(sv) && (flags & SV_GMAGIC))
2359 	mg_get(sv);
2360 
2361     if (SvROK(sv)) {
2362 	if (SvAMAGIC(sv)) {
2363 	    SV *tmpstr;
2364 	    if (flags & SV_SKIP_OVERLOAD)
2365 		return 0;
2366 	    tmpstr = AMG_CALLunary(sv, numer_amg);
2367 	    if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2368 		return SvUV(tmpstr);
2369 	    }
2370 	}
2371 	return PTR2UV(SvRV(sv));
2372     }
2373 
2374     if (SvVALID(sv) || isREGEXP(sv)) {
2375 	/* FBMs use the space for SvIVX and SvNVX for other purposes, and use
2376 	   the same flag bit as SVf_IVisUV, so must not let them cache IVs.
2377 	   Regexps have no SvIVX and SvNVX fields. */
2378 	assert(isREGEXP(sv) || SvPOKp(sv));
2379 	{
2380 	    UV value;
2381 	    const char * const ptr =
2382 		isREGEXP(sv) ? RX_WRAPPED((REGEXP*)sv) : SvPVX_const(sv);
2383 	    const int numtype
2384 		= grok_number(ptr, SvCUR(sv), &value);
2385 
2386 	    if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2387 		== IS_NUMBER_IN_UV) {
2388 		/* It's definitely an integer */
2389 		if (!(numtype & IS_NUMBER_NEG))
2390 		    return value;
2391 	    }
2392 	    if (!numtype) {
2393 		if (ckWARN(WARN_NUMERIC))
2394 		    not_a_number(sv);
2395 	    }
2396 	    return U_V(Atof(ptr));
2397 	}
2398     }
2399 
2400     if (SvTHINKFIRST(sv)) {
2401 #ifdef PERL_OLD_COPY_ON_WRITE
2402 	if (SvIsCOW(sv)) {
2403 	    sv_force_normal_flags(sv, 0);
2404 	}
2405 #endif
2406 	if (SvREADONLY(sv) && !SvOK(sv)) {
2407 	    if (ckWARN(WARN_UNINITIALIZED))
2408 		report_uninit(sv);
2409 	    return 0;
2410 	}
2411     }
2412 
2413     if (!SvIOKp(sv)) {
2414 	if (S_sv_2iuv_common(aTHX_ sv))
2415 	    return 0;
2416     }
2417 
2418     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
2419 			  PTR2UV(sv),SvUVX(sv)));
2420     return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
2421 }
2422 
2423 /*
2424 =for apidoc sv_2nv_flags
2425 
2426 Return the num value of an SV, doing any necessary string or integer
2427 conversion.  If flags includes SV_GMAGIC, does an mg_get() first.
2428 Normally used via the C<SvNV(sv)> and C<SvNVx(sv)> macros.
2429 
2430 =cut
2431 */
2432 
2433 NV
2434 Perl_sv_2nv_flags(pTHX_ SV *const sv, const I32 flags)
2435 {
2436     dVAR;
2437     if (!sv)
2438 	return 0.0;
2439     if (SvGMAGICAL(sv) || SvVALID(sv) || isREGEXP(sv)) {
2440 	/* FBMs use the space for SvIVX and SvNVX for other purposes, and use
2441 	   the same flag bit as SVf_IVisUV, so must not let them cache NVs.
2442 	   Regexps have no SvIVX and SvNVX fields.  */
2443 	const char *ptr;
2444 	if (flags & SV_GMAGIC)
2445 	    mg_get(sv);
2446 	if (SvNOKp(sv))
2447 	    return SvNVX(sv);
2448 	if (SvPOKp(sv) && !SvIOKp(sv)) {
2449 	    ptr = SvPVX_const(sv);
2450 	  grokpv:
2451 	    if (!SvIOKp(sv) && ckWARN(WARN_NUMERIC) &&
2452 		!grok_number(ptr, SvCUR(sv), NULL))
2453 		not_a_number(sv);
2454 	    return Atof(ptr);
2455 	}
2456 	if (SvIOKp(sv)) {
2457 	    if (SvIsUV(sv))
2458 		return (NV)SvUVX(sv);
2459 	    else
2460 		return (NV)SvIVX(sv);
2461 	}
2462         if (SvROK(sv)) {
2463 	    goto return_rok;
2464 	}
2465 	if (isREGEXP(sv)) {
2466 	    ptr = RX_WRAPPED((REGEXP *)sv);
2467 	    goto grokpv;
2468 	}
2469 	assert(SvTYPE(sv) >= SVt_PVMG);
2470 	/* This falls through to the report_uninit near the end of the
2471 	   function. */
2472     } else if (SvTHINKFIRST(sv)) {
2473 	if (SvROK(sv)) {
2474 	return_rok:
2475 	    if (SvAMAGIC(sv)) {
2476 		SV *tmpstr;
2477 		if (flags & SV_SKIP_OVERLOAD)
2478 		    return 0;
2479 		tmpstr = AMG_CALLunary(sv, numer_amg);
2480                 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2481 		    return SvNV(tmpstr);
2482 		}
2483 	    }
2484 	    return PTR2NV(SvRV(sv));
2485 	}
2486 #ifdef PERL_OLD_COPY_ON_WRITE
2487 	if (SvIsCOW(sv)) {
2488 	    sv_force_normal_flags(sv, 0);
2489 	}
2490 #endif
2491 	if (SvREADONLY(sv) && !SvOK(sv)) {
2492 	    if (ckWARN(WARN_UNINITIALIZED))
2493 		report_uninit(sv);
2494 	    return 0.0;
2495 	}
2496     }
2497     if (SvTYPE(sv) < SVt_NV) {
2498 	/* The logic to use SVt_PVNV if necessary is in sv_upgrade.  */
2499 	sv_upgrade(sv, SVt_NV);
2500 #ifdef USE_LONG_DOUBLE
2501 	DEBUG_c({
2502 	    STORE_NUMERIC_LOCAL_SET_STANDARD();
2503 	    PerlIO_printf(Perl_debug_log,
2504 			  "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
2505 			  PTR2UV(sv), SvNVX(sv));
2506 	    RESTORE_NUMERIC_LOCAL();
2507 	});
2508 #else
2509 	DEBUG_c({
2510 	    STORE_NUMERIC_LOCAL_SET_STANDARD();
2511 	    PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%"NVgf")\n",
2512 			  PTR2UV(sv), SvNVX(sv));
2513 	    RESTORE_NUMERIC_LOCAL();
2514 	});
2515 #endif
2516     }
2517     else if (SvTYPE(sv) < SVt_PVNV)
2518 	sv_upgrade(sv, SVt_PVNV);
2519     if (SvNOKp(sv)) {
2520         return SvNVX(sv);
2521     }
2522     if (SvIOKp(sv)) {
2523 	SvNV_set(sv, SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv));
2524 #ifdef NV_PRESERVES_UV
2525 	if (SvIOK(sv))
2526 	    SvNOK_on(sv);
2527 	else
2528 	    SvNOKp_on(sv);
2529 #else
2530 	/* Only set the public NV OK flag if this NV preserves the IV  */
2531 	/* Check it's not 0xFFFFFFFFFFFFFFFF */
2532 	if (SvIOK(sv) &&
2533 	    SvIsUV(sv) ? ((SvUVX(sv) != UV_MAX)&&(SvUVX(sv) == U_V(SvNVX(sv))))
2534 		       : (SvIVX(sv) == I_V(SvNVX(sv))))
2535 	    SvNOK_on(sv);
2536 	else
2537 	    SvNOKp_on(sv);
2538 #endif
2539     }
2540     else if (SvPOKp(sv)) {
2541 	UV value;
2542 	const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2543 	if (!SvIOKp(sv) && !numtype && ckWARN(WARN_NUMERIC))
2544 	    not_a_number(sv);
2545 #ifdef NV_PRESERVES_UV
2546 	if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2547 	    == IS_NUMBER_IN_UV) {
2548 	    /* It's definitely an integer */
2549 	    SvNV_set(sv, (numtype & IS_NUMBER_NEG) ? -(NV)value : (NV)value);
2550 	} else
2551 	    SvNV_set(sv, Atof(SvPVX_const(sv)));
2552 	if (numtype)
2553 	    SvNOK_on(sv);
2554 	else
2555 	    SvNOKp_on(sv);
2556 #else
2557 	SvNV_set(sv, Atof(SvPVX_const(sv)));
2558 	/* Only set the public NV OK flag if this NV preserves the value in
2559 	   the PV at least as well as an IV/UV would.
2560 	   Not sure how to do this 100% reliably. */
2561 	/* if that shift count is out of range then Configure's test is
2562 	   wonky. We shouldn't be in here with NV_PRESERVES_UV_BITS ==
2563 	   UV_BITS */
2564 	if (((UV)1 << NV_PRESERVES_UV_BITS) >
2565 	    U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2566 	    SvNOK_on(sv); /* Definitely small enough to preserve all bits */
2567 	} else if (!(numtype & IS_NUMBER_IN_UV)) {
2568             /* Can't use strtol etc to convert this string, so don't try.
2569                sv_2iv and sv_2uv will use the NV to convert, not the PV.  */
2570             SvNOK_on(sv);
2571         } else {
2572             /* value has been set.  It may not be precise.  */
2573 	    if ((numtype & IS_NUMBER_NEG) && (value > (UV)IV_MIN)) {
2574 		/* 2s complement assumption for (UV)IV_MIN  */
2575                 SvNOK_on(sv); /* Integer is too negative.  */
2576             } else {
2577                 SvNOKp_on(sv);
2578                 SvIOKp_on(sv);
2579 
2580                 if (numtype & IS_NUMBER_NEG) {
2581                     SvIV_set(sv, -(IV)value);
2582                 } else if (value <= (UV)IV_MAX) {
2583 		    SvIV_set(sv, (IV)value);
2584 		} else {
2585 		    SvUV_set(sv, value);
2586 		    SvIsUV_on(sv);
2587 		}
2588 
2589                 if (numtype & IS_NUMBER_NOT_INT) {
2590                     /* I believe that even if the original PV had decimals,
2591                        they are lost beyond the limit of the FP precision.
2592                        However, neither is canonical, so both only get p
2593                        flags.  NWC, 2000/11/25 */
2594                     /* Both already have p flags, so do nothing */
2595                 } else {
2596 		    const NV nv = SvNVX(sv);
2597                     if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2598                         if (SvIVX(sv) == I_V(nv)) {
2599                             SvNOK_on(sv);
2600                         } else {
2601                             /* It had no "." so it must be integer.  */
2602                         }
2603 			SvIOK_on(sv);
2604                     } else {
2605                         /* between IV_MAX and NV(UV_MAX).
2606                            Could be slightly > UV_MAX */
2607 
2608                         if (numtype & IS_NUMBER_NOT_INT) {
2609                             /* UV and NV both imprecise.  */
2610                         } else {
2611 			    const UV nv_as_uv = U_V(nv);
2612 
2613                             if (value == nv_as_uv && SvUVX(sv) != UV_MAX) {
2614                                 SvNOK_on(sv);
2615                             }
2616 			    SvIOK_on(sv);
2617                         }
2618                     }
2619                 }
2620             }
2621         }
2622 	/* It might be more code efficient to go through the entire logic above
2623 	   and conditionally set with SvNOKp_on() rather than SvNOK(), but it
2624 	   gets complex and potentially buggy, so more programmer efficient
2625 	   to do it this way, by turning off the public flags:  */
2626 	if (!numtype)
2627 	    SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK);
2628 #endif /* NV_PRESERVES_UV */
2629     }
2630     else  {
2631 	if (isGV_with_GP(sv)) {
2632 	    glob_2number(MUTABLE_GV(sv));
2633 	    return 0.0;
2634 	}
2635 
2636 	if (!PL_localizing && !SvPADTMP(sv) && ckWARN(WARN_UNINITIALIZED))
2637 	    report_uninit(sv);
2638 	assert (SvTYPE(sv) >= SVt_NV);
2639 	/* Typically the caller expects that sv_any is not NULL now.  */
2640 	/* XXX Ilya implies that this is a bug in callers that assume this
2641 	   and ideally should be fixed.  */
2642 	return 0.0;
2643     }
2644 #if defined(USE_LONG_DOUBLE)
2645     DEBUG_c({
2646 	STORE_NUMERIC_LOCAL_SET_STANDARD();
2647 	PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
2648 		      PTR2UV(sv), SvNVX(sv));
2649 	RESTORE_NUMERIC_LOCAL();
2650     });
2651 #else
2652     DEBUG_c({
2653 	STORE_NUMERIC_LOCAL_SET_STANDARD();
2654 	PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%"NVgf")\n",
2655 		      PTR2UV(sv), SvNVX(sv));
2656 	RESTORE_NUMERIC_LOCAL();
2657     });
2658 #endif
2659     return SvNVX(sv);
2660 }
2661 
2662 /*
2663 =for apidoc sv_2num
2664 
2665 Return an SV with the numeric value of the source SV, doing any necessary
2666 reference or overload conversion.  You must use the C<SvNUM(sv)> macro to
2667 access this function.
2668 
2669 =cut
2670 */
2671 
2672 SV *
2673 Perl_sv_2num(pTHX_ SV *const sv)
2674 {
2675     PERL_ARGS_ASSERT_SV_2NUM;
2676 
2677     if (!SvROK(sv))
2678 	return sv;
2679     if (SvAMAGIC(sv)) {
2680 	SV * const tmpsv = AMG_CALLunary(sv, numer_amg);
2681 	TAINT_IF(tmpsv && SvTAINTED(tmpsv));
2682 	if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
2683 	    return sv_2num(tmpsv);
2684     }
2685     return sv_2mortal(newSVuv(PTR2UV(SvRV(sv))));
2686 }
2687 
2688 /* uiv_2buf(): private routine for use by sv_2pv_flags(): print an IV or
2689  * UV as a string towards the end of buf, and return pointers to start and
2690  * end of it.
2691  *
2692  * We assume that buf is at least TYPE_CHARS(UV) long.
2693  */
2694 
2695 static char *
2696 S_uiv_2buf(char *const buf, const IV iv, UV uv, const int is_uv, char **const peob)
2697 {
2698     char *ptr = buf + TYPE_CHARS(UV);
2699     char * const ebuf = ptr;
2700     int sign;
2701 
2702     PERL_ARGS_ASSERT_UIV_2BUF;
2703 
2704     if (is_uv)
2705 	sign = 0;
2706     else if (iv >= 0) {
2707 	uv = iv;
2708 	sign = 0;
2709     } else {
2710 	uv = -iv;
2711 	sign = 1;
2712     }
2713     do {
2714 	*--ptr = '0' + (char)(uv % 10);
2715     } while (uv /= 10);
2716     if (sign)
2717 	*--ptr = '-';
2718     *peob = ebuf;
2719     return ptr;
2720 }
2721 
2722 /*
2723 =for apidoc sv_2pv_flags
2724 
2725 Returns a pointer to the string value of an SV, and sets *lp to its length.
2726 If flags includes SV_GMAGIC, does an mg_get() first.  Coerces sv to a
2727 string if necessary.  Normally invoked via the C<SvPV_flags> macro.
2728 C<sv_2pv()> and C<sv_2pv_nomg> usually end up here too.
2729 
2730 =cut
2731 */
2732 
2733 char *
2734 Perl_sv_2pv_flags(pTHX_ SV *const sv, STRLEN *const lp, const I32 flags)
2735 {
2736     dVAR;
2737     char *s;
2738 
2739     if (!sv) {
2740 	if (lp)
2741 	    *lp = 0;
2742 	return (char *)"";
2743     }
2744     if (SvGMAGICAL(sv) && (flags & SV_GMAGIC))
2745 	mg_get(sv);
2746     if (SvROK(sv)) {
2747 	if (SvAMAGIC(sv)) {
2748 	    SV *tmpstr;
2749 	    if (flags & SV_SKIP_OVERLOAD)
2750 		return NULL;
2751 	    tmpstr = AMG_CALLunary(sv, string_amg);
2752 	    TAINT_IF(tmpstr && SvTAINTED(tmpstr));
2753 	    if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2754 		/* Unwrap this:  */
2755 		/* char *pv = lp ? SvPV(tmpstr, *lp) : SvPV_nolen(tmpstr);
2756 		 */
2757 
2758 		char *pv;
2759 		if ((SvFLAGS(tmpstr) & (SVf_POK)) == SVf_POK) {
2760 		    if (flags & SV_CONST_RETURN) {
2761 			pv = (char *) SvPVX_const(tmpstr);
2762 		    } else {
2763 			pv = (flags & SV_MUTABLE_RETURN)
2764 			    ? SvPVX_mutable(tmpstr) : SvPVX(tmpstr);
2765 		    }
2766 		    if (lp)
2767 			*lp = SvCUR(tmpstr);
2768 		} else {
2769 		    pv = sv_2pv_flags(tmpstr, lp, flags);
2770 		}
2771 		if (SvUTF8(tmpstr))
2772 		    SvUTF8_on(sv);
2773 		else
2774 		    SvUTF8_off(sv);
2775 		return pv;
2776 	    }
2777 	}
2778 	{
2779 	    STRLEN len;
2780 	    char *retval;
2781 	    char *buffer;
2782 	    SV *const referent = SvRV(sv);
2783 
2784 	    if (!referent) {
2785 		len = 7;
2786 		retval = buffer = savepvn("NULLREF", len);
2787 	    } else if (SvTYPE(referent) == SVt_REGEXP &&
2788 		       (!(PL_curcop->cop_hints & HINT_NO_AMAGIC) ||
2789 			amagic_is_enabled(string_amg))) {
2790 		REGEXP * const re = (REGEXP *)MUTABLE_PTR(referent);
2791 
2792 		assert(re);
2793 
2794 		/* If the regex is UTF-8 we want the containing scalar to
2795 		   have an UTF-8 flag too */
2796 		if (RX_UTF8(re))
2797 		    SvUTF8_on(sv);
2798 		else
2799 		    SvUTF8_off(sv);
2800 
2801 		if (lp)
2802 		    *lp = RX_WRAPLEN(re);
2803 
2804 		return RX_WRAPPED(re);
2805 	    } else {
2806 		const char *const typestr = sv_reftype(referent, 0);
2807 		const STRLEN typelen = strlen(typestr);
2808 		UV addr = PTR2UV(referent);
2809 		const char *stashname = NULL;
2810 		STRLEN stashnamelen = 0; /* hush, gcc */
2811 		const char *buffer_end;
2812 
2813 		if (SvOBJECT(referent)) {
2814 		    const HEK *const name = HvNAME_HEK(SvSTASH(referent));
2815 
2816 		    if (name) {
2817 			stashname = HEK_KEY(name);
2818 			stashnamelen = HEK_LEN(name);
2819 
2820 			if (HEK_UTF8(name)) {
2821 			    SvUTF8_on(sv);
2822 			} else {
2823 			    SvUTF8_off(sv);
2824 			}
2825 		    } else {
2826 			stashname = "__ANON__";
2827 			stashnamelen = 8;
2828 		    }
2829 		    len = stashnamelen + 1 /* = */ + typelen + 3 /* (0x */
2830 			+ 2 * sizeof(UV) + 2 /* )\0 */;
2831 		} else {
2832 		    len = typelen + 3 /* (0x */
2833 			+ 2 * sizeof(UV) + 2 /* )\0 */;
2834 		}
2835 
2836 		Newx(buffer, len, char);
2837 		buffer_end = retval = buffer + len;
2838 
2839 		/* Working backwards  */
2840 		*--retval = '\0';
2841 		*--retval = ')';
2842 		do {
2843 		    *--retval = PL_hexdigit[addr & 15];
2844 		} while (addr >>= 4);
2845 		*--retval = 'x';
2846 		*--retval = '0';
2847 		*--retval = '(';
2848 
2849 		retval -= typelen;
2850 		memcpy(retval, typestr, typelen);
2851 
2852 		if (stashname) {
2853 		    *--retval = '=';
2854 		    retval -= stashnamelen;
2855 		    memcpy(retval, stashname, stashnamelen);
2856 		}
2857 		/* retval may not necessarily have reached the start of the
2858 		   buffer here.  */
2859 		assert (retval >= buffer);
2860 
2861 		len = buffer_end - retval - 1; /* -1 for that \0  */
2862 	    }
2863 	    if (lp)
2864 		*lp = len;
2865 	    SAVEFREEPV(buffer);
2866 	    return retval;
2867 	}
2868     }
2869 
2870     if (SvPOKp(sv)) {
2871 	if (lp)
2872 	    *lp = SvCUR(sv);
2873 	if (flags & SV_MUTABLE_RETURN)
2874 	    return SvPVX_mutable(sv);
2875 	if (flags & SV_CONST_RETURN)
2876 	    return (char *)SvPVX_const(sv);
2877 	return SvPVX(sv);
2878     }
2879 
2880     if (SvIOK(sv)) {
2881 	/* I'm assuming that if both IV and NV are equally valid then
2882 	   converting the IV is going to be more efficient */
2883 	const U32 isUIOK = SvIsUV(sv);
2884 	char buf[TYPE_CHARS(UV)];
2885 	char *ebuf, *ptr;
2886 	STRLEN len;
2887 
2888 	if (SvTYPE(sv) < SVt_PVIV)
2889 	    sv_upgrade(sv, SVt_PVIV);
2890  	ptr = uiv_2buf(buf, SvIVX(sv), SvUVX(sv), isUIOK, &ebuf);
2891 	len = ebuf - ptr;
2892 	/* inlined from sv_setpvn */
2893 	s = SvGROW_mutable(sv, len + 1);
2894 	Move(ptr, s, len, char);
2895 	s += len;
2896 	*s = '\0';
2897     }
2898     else if (SvNOK(sv)) {
2899 	if (SvTYPE(sv) < SVt_PVNV)
2900 	    sv_upgrade(sv, SVt_PVNV);
2901 	if (SvNVX(sv) == 0.0) {
2902 	    s = SvGROW_mutable(sv, 2);
2903 	    *s++ = '0';
2904 	    *s = '\0';
2905 	} else {
2906 	    dSAVE_ERRNO;
2907 	    /* The +20 is pure guesswork.  Configure test needed. --jhi */
2908 	    s = SvGROW_mutable(sv, NV_DIG + 20);
2909 	    /* some Xenix systems wipe out errno here */
2910 	    Gconvert(SvNVX(sv), NV_DIG, 0, s);
2911 	    RESTORE_ERRNO;
2912 	    while (*s) s++;
2913 	}
2914 #ifdef hcx
2915 	if (s[-1] == '.')
2916 	    *--s = '\0';
2917 #endif
2918     }
2919     else if (isGV_with_GP(sv)) {
2920 	GV *const gv = MUTABLE_GV(sv);
2921 	SV *const buffer = sv_newmortal();
2922 
2923 	gv_efullname3(buffer, gv, "*");
2924 
2925 	assert(SvPOK(buffer));
2926 	if (SvUTF8(buffer))
2927 	    SvUTF8_on(sv);
2928 	if (lp)
2929 	    *lp = SvCUR(buffer);
2930 	return SvPVX(buffer);
2931     }
2932     else if (isREGEXP(sv)) {
2933 	if (lp) *lp = RX_WRAPLEN((REGEXP *)sv);
2934 	return RX_WRAPPED((REGEXP *)sv);
2935     }
2936     else {
2937 	if (lp)
2938 	    *lp = 0;
2939 	if (flags & SV_UNDEF_RETURNS_NULL)
2940 	    return NULL;
2941 	if (!PL_localizing && !SvPADTMP(sv) && ckWARN(WARN_UNINITIALIZED))
2942 	    report_uninit(sv);
2943 	/* Typically the caller expects that sv_any is not NULL now.  */
2944 	if (!SvREADONLY(sv) && SvTYPE(sv) < SVt_PV)
2945 	    sv_upgrade(sv, SVt_PV);
2946 	return (char *)"";
2947     }
2948 
2949     {
2950 	const STRLEN len = s - SvPVX_const(sv);
2951 	if (lp)
2952 	    *lp = len;
2953 	SvCUR_set(sv, len);
2954     }
2955     SvPOK_on(sv);
2956     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
2957 			  PTR2UV(sv),SvPVX_const(sv)));
2958     if (flags & SV_CONST_RETURN)
2959 	return (char *)SvPVX_const(sv);
2960     if (flags & SV_MUTABLE_RETURN)
2961 	return SvPVX_mutable(sv);
2962     return SvPVX(sv);
2963 }
2964 
2965 /*
2966 =for apidoc sv_copypv
2967 
2968 Copies a stringified representation of the source SV into the
2969 destination SV.  Automatically performs any necessary mg_get and
2970 coercion of numeric values into strings.  Guaranteed to preserve
2971 UTF8 flag even from overloaded objects.  Similar in nature to
2972 sv_2pv[_flags] but operates directly on an SV instead of just the
2973 string.  Mostly uses sv_2pv_flags to do its work, except when that
2974 would lose the UTF-8'ness of the PV.
2975 
2976 =for apidoc sv_copypv_nomg
2977 
2978 Like sv_copypv, but doesn't invoke get magic first.
2979 
2980 =for apidoc sv_copypv_flags
2981 
2982 Implementation of sv_copypv and sv_copypv_nomg.  Calls get magic iff flags
2983 include SV_GMAGIC.
2984 
2985 =cut
2986 */
2987 
2988 void
2989 Perl_sv_copypv(pTHX_ SV *const dsv, SV *const ssv)
2990 {
2991     PERL_ARGS_ASSERT_SV_COPYPV;
2992 
2993     sv_copypv_flags(dsv, ssv, 0);
2994 }
2995 
2996 void
2997 Perl_sv_copypv_flags(pTHX_ SV *const dsv, SV *const ssv, const I32 flags)
2998 {
2999     STRLEN len;
3000     const char *s;
3001 
3002     PERL_ARGS_ASSERT_SV_COPYPV_FLAGS;
3003 
3004     if ((flags & SV_GMAGIC) && SvGMAGICAL(ssv))
3005 	mg_get(ssv);
3006     s = SvPV_nomg_const(ssv,len);
3007     sv_setpvn(dsv,s,len);
3008     if (SvUTF8(ssv))
3009 	SvUTF8_on(dsv);
3010     else
3011 	SvUTF8_off(dsv);
3012 }
3013 
3014 /*
3015 =for apidoc sv_2pvbyte
3016 
3017 Return a pointer to the byte-encoded representation of the SV, and set *lp
3018 to its length.  May cause the SV to be downgraded from UTF-8 as a
3019 side-effect.
3020 
3021 Usually accessed via the C<SvPVbyte> macro.
3022 
3023 =cut
3024 */
3025 
3026 char *
3027 Perl_sv_2pvbyte(pTHX_ SV *sv, STRLEN *const lp)
3028 {
3029     PERL_ARGS_ASSERT_SV_2PVBYTE;
3030 
3031     if (((SvREADONLY(sv) || SvFAKE(sv)) && !SvIsCOW(sv))
3032      || isGV_with_GP(sv) || SvROK(sv)) {
3033 	SV *sv2 = sv_newmortal();
3034 	sv_copypv(sv2,sv);
3035 	sv = sv2;
3036     }
3037     else SvGETMAGIC(sv);
3038     sv_utf8_downgrade(sv,0);
3039     return lp ? SvPV_nomg(sv,*lp) : SvPV_nomg_nolen(sv);
3040 }
3041 
3042 /*
3043 =for apidoc sv_2pvutf8
3044 
3045 Return a pointer to the UTF-8-encoded representation of the SV, and set *lp
3046 to its length.  May cause the SV to be upgraded to UTF-8 as a side-effect.
3047 
3048 Usually accessed via the C<SvPVutf8> macro.
3049 
3050 =cut
3051 */
3052 
3053 char *
3054 Perl_sv_2pvutf8(pTHX_ SV *sv, STRLEN *const lp)
3055 {
3056     PERL_ARGS_ASSERT_SV_2PVUTF8;
3057 
3058     if (((SvREADONLY(sv) || SvFAKE(sv)) && !SvIsCOW(sv))
3059      || isGV_with_GP(sv) || SvROK(sv))
3060 	sv = sv_mortalcopy(sv);
3061     else
3062         SvGETMAGIC(sv);
3063     sv_utf8_upgrade_nomg(sv);
3064     return lp ? SvPV_nomg(sv,*lp) : SvPV_nomg_nolen(sv);
3065 }
3066 
3067 
3068 /*
3069 =for apidoc sv_2bool
3070 
3071 This macro is only used by sv_true() or its macro equivalent, and only if
3072 the latter's argument is neither SvPOK, SvIOK nor SvNOK.
3073 It calls sv_2bool_flags with the SV_GMAGIC flag.
3074 
3075 =for apidoc sv_2bool_flags
3076 
3077 This function is only used by sv_true() and friends,  and only if
3078 the latter's argument is neither SvPOK, SvIOK nor SvNOK.  If the flags
3079 contain SV_GMAGIC, then it does an mg_get() first.
3080 
3081 
3082 =cut
3083 */
3084 
3085 bool
3086 Perl_sv_2bool_flags(pTHX_ SV *const sv, const I32 flags)
3087 {
3088     dVAR;
3089 
3090     PERL_ARGS_ASSERT_SV_2BOOL_FLAGS;
3091 
3092     if(flags & SV_GMAGIC) SvGETMAGIC(sv);
3093 
3094     if (!SvOK(sv))
3095 	return 0;
3096     if (SvROK(sv)) {
3097 	if (SvAMAGIC(sv)) {
3098 	    SV * const tmpsv = AMG_CALLunary(sv, bool__amg);
3099 	    if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
3100 		return cBOOL(SvTRUE(tmpsv));
3101 	}
3102 	return SvRV(sv) != 0;
3103     }
3104     return SvTRUE_common(sv, isGV_with_GP(sv) ? 1 : 0);
3105 }
3106 
3107 /*
3108 =for apidoc sv_utf8_upgrade
3109 
3110 Converts the PV of an SV to its UTF-8-encoded form.
3111 Forces the SV to string form if it is not already.
3112 Will C<mg_get> on C<sv> if appropriate.
3113 Always sets the SvUTF8 flag to avoid future validity checks even
3114 if the whole string is the same in UTF-8 as not.
3115 Returns the number of bytes in the converted string
3116 
3117 This is not a general purpose byte encoding to Unicode interface:
3118 use the Encode extension for that.
3119 
3120 =for apidoc sv_utf8_upgrade_nomg
3121 
3122 Like sv_utf8_upgrade, but doesn't do magic on C<sv>.
3123 
3124 =for apidoc sv_utf8_upgrade_flags
3125 
3126 Converts the PV of an SV to its UTF-8-encoded form.
3127 Forces the SV to string form if it is not already.
3128 Always sets the SvUTF8 flag to avoid future validity checks even
3129 if all the bytes are invariant in UTF-8.
3130 If C<flags> has C<SV_GMAGIC> bit set,
3131 will C<mg_get> on C<sv> if appropriate, else not.
3132 Returns the number of bytes in the converted string
3133 C<sv_utf8_upgrade> and
3134 C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
3135 
3136 This is not a general purpose byte encoding to Unicode interface:
3137 use the Encode extension for that.
3138 
3139 =cut
3140 
3141 The grow version is currently not externally documented.  It adds a parameter,
3142 extra, which is the number of unused bytes the string of 'sv' is guaranteed to
3143 have free after it upon return.  This allows the caller to reserve extra space
3144 that it intends to fill, to avoid extra grows.
3145 
3146 Also externally undocumented for the moment is the flag SV_FORCE_UTF8_UPGRADE,
3147 which can be used to tell this function to not first check to see if there are
3148 any characters that are different in UTF-8 (variant characters) which would
3149 force it to allocate a new string to sv, but to assume there are.  Typically
3150 this flag is used by a routine that has already parsed the string to find that
3151 there are such characters, and passes this information on so that the work
3152 doesn't have to be repeated.
3153 
3154 (One might think that the calling routine could pass in the position of the
3155 first such variant, so it wouldn't have to be found again.  But that is not the
3156 case, because typically when the caller is likely to use this flag, it won't be
3157 calling this routine unless it finds something that won't fit into a byte.
3158 Otherwise it tries to not upgrade and just use bytes.  But some things that
3159 do fit into a byte are variants in utf8, and the caller may not have been
3160 keeping track of these.)
3161 
3162 If the routine itself changes the string, it adds a trailing NUL.  Such a NUL
3163 isn't guaranteed due to having other routines do the work in some input cases,
3164 or if the input is already flagged as being in utf8.
3165 
3166 The speed of this could perhaps be improved for many cases if someone wanted to
3167 write a fast function that counts the number of variant characters in a string,
3168 especially if it could return the position of the first one.
3169 
3170 */
3171 
3172 STRLEN
3173 Perl_sv_utf8_upgrade_flags_grow(pTHX_ SV *const sv, const I32 flags, STRLEN extra)
3174 {
3175     dVAR;
3176 
3177     PERL_ARGS_ASSERT_SV_UTF8_UPGRADE_FLAGS_GROW;
3178 
3179     if (sv == &PL_sv_undef)
3180 	return 0;
3181     if (!SvPOK_nog(sv)) {
3182 	STRLEN len = 0;
3183 	if (SvREADONLY(sv) && (SvPOKp(sv) || SvIOKp(sv) || SvNOKp(sv))) {
3184 	    (void) sv_2pv_flags(sv,&len, flags);
3185 	    if (SvUTF8(sv)) {
3186 		if (extra) SvGROW(sv, SvCUR(sv) + extra);
3187 		return len;
3188 	    }
3189 	} else {
3190 	    (void) SvPV_force_flags(sv,len,flags & SV_GMAGIC);
3191 	}
3192     }
3193 
3194     if (SvUTF8(sv)) {
3195 	if (extra) SvGROW(sv, SvCUR(sv) + extra);
3196 	return SvCUR(sv);
3197     }
3198 
3199     if (SvIsCOW(sv)) {
3200         sv_force_normal_flags(sv, 0);
3201     }
3202 
3203     if (PL_encoding && !(flags & SV_UTF8_NO_ENCODING)) {
3204         sv_recode_to_utf8(sv, PL_encoding);
3205 	if (extra) SvGROW(sv, SvCUR(sv) + extra);
3206 	return SvCUR(sv);
3207     }
3208 
3209     if (SvCUR(sv) == 0) {
3210 	if (extra) SvGROW(sv, extra);
3211     } else { /* Assume Latin-1/EBCDIC */
3212 	/* This function could be much more efficient if we
3213 	 * had a FLAG in SVs to signal if there are any variant
3214 	 * chars in the PV.  Given that there isn't such a flag
3215 	 * make the loop as fast as possible (although there are certainly ways
3216 	 * to speed this up, eg. through vectorization) */
3217 	U8 * s = (U8 *) SvPVX_const(sv);
3218 	U8 * e = (U8 *) SvEND(sv);
3219 	U8 *t = s;
3220 	STRLEN two_byte_count = 0;
3221 
3222 	if (flags & SV_FORCE_UTF8_UPGRADE) goto must_be_utf8;
3223 
3224 	/* See if really will need to convert to utf8.  We mustn't rely on our
3225 	 * incoming SV being well formed and having a trailing '\0', as certain
3226 	 * code in pp_formline can send us partially built SVs. */
3227 
3228 	while (t < e) {
3229 	    const U8 ch = *t++;
3230 	    if (NATIVE_IS_INVARIANT(ch)) continue;
3231 
3232 	    t--;    /* t already incremented; re-point to first variant */
3233 	    two_byte_count = 1;
3234 	    goto must_be_utf8;
3235 	}
3236 
3237 	/* utf8 conversion not needed because all are invariants.  Mark as
3238 	 * UTF-8 even if no variant - saves scanning loop */
3239 	SvUTF8_on(sv);
3240 	if (extra) SvGROW(sv, SvCUR(sv) + extra);
3241 	return SvCUR(sv);
3242 
3243 must_be_utf8:
3244 
3245 	/* Here, the string should be converted to utf8, either because of an
3246 	 * input flag (two_byte_count = 0), or because a character that
3247 	 * requires 2 bytes was found (two_byte_count = 1).  t points either to
3248 	 * the beginning of the string (if we didn't examine anything), or to
3249 	 * the first variant.  In either case, everything from s to t - 1 will
3250 	 * occupy only 1 byte each on output.
3251 	 *
3252 	 * There are two main ways to convert.  One is to create a new string
3253 	 * and go through the input starting from the beginning, appending each
3254 	 * converted value onto the new string as we go along.  It's probably
3255 	 * best to allocate enough space in the string for the worst possible
3256 	 * case rather than possibly running out of space and having to
3257 	 * reallocate and then copy what we've done so far.  Since everything
3258 	 * from s to t - 1 is invariant, the destination can be initialized
3259 	 * with these using a fast memory copy
3260 	 *
3261 	 * The other way is to figure out exactly how big the string should be
3262 	 * by parsing the entire input.  Then you don't have to make it big
3263 	 * enough to handle the worst possible case, and more importantly, if
3264 	 * the string you already have is large enough, you don't have to
3265 	 * allocate a new string, you can copy the last character in the input
3266 	 * string to the final position(s) that will be occupied by the
3267 	 * converted string and go backwards, stopping at t, since everything
3268 	 * before that is invariant.
3269 	 *
3270 	 * There are advantages and disadvantages to each method.
3271 	 *
3272 	 * In the first method, we can allocate a new string, do the memory
3273 	 * copy from the s to t - 1, and then proceed through the rest of the
3274 	 * string byte-by-byte.
3275 	 *
3276 	 * In the second method, we proceed through the rest of the input
3277 	 * string just calculating how big the converted string will be.  Then
3278 	 * there are two cases:
3279 	 *  1)	if the string has enough extra space to handle the converted
3280 	 *	value.  We go backwards through the string, converting until we
3281 	 *	get to the position we are at now, and then stop.  If this
3282 	 *	position is far enough along in the string, this method is
3283 	 *	faster than the other method.  If the memory copy were the same
3284 	 *	speed as the byte-by-byte loop, that position would be about
3285 	 *	half-way, as at the half-way mark, parsing to the end and back
3286 	 *	is one complete string's parse, the same amount as starting
3287 	 *	over and going all the way through.  Actually, it would be
3288 	 *	somewhat less than half-way, as it's faster to just count bytes
3289 	 *	than to also copy, and we don't have the overhead of allocating
3290 	 *	a new string, changing the scalar to use it, and freeing the
3291 	 *	existing one.  But if the memory copy is fast, the break-even
3292 	 *	point is somewhere after half way.  The counting loop could be
3293 	 *	sped up by vectorization, etc, to move the break-even point
3294 	 *	further towards the beginning.
3295 	 *  2)	if the string doesn't have enough space to handle the converted
3296 	 *	value.  A new string will have to be allocated, and one might
3297 	 *	as well, given that, start from the beginning doing the first
3298 	 *	method.  We've spent extra time parsing the string and in
3299 	 *	exchange all we've gotten is that we know precisely how big to
3300 	 *	make the new one.  Perl is more optimized for time than space,
3301 	 *	so this case is a loser.
3302 	 * So what I've decided to do is not use the 2nd method unless it is
3303 	 * guaranteed that a new string won't have to be allocated, assuming
3304 	 * the worst case.  I also decided not to put any more conditions on it
3305 	 * than this, for now.  It seems likely that, since the worst case is
3306 	 * twice as big as the unknown portion of the string (plus 1), we won't
3307 	 * be guaranteed enough space, causing us to go to the first method,
3308 	 * unless the string is short, or the first variant character is near
3309 	 * the end of it.  In either of these cases, it seems best to use the
3310 	 * 2nd method.  The only circumstance I can think of where this would
3311 	 * be really slower is if the string had once had much more data in it
3312 	 * than it does now, but there is still a substantial amount in it  */
3313 
3314 	{
3315 	    STRLEN invariant_head = t - s;
3316 	    STRLEN size = invariant_head + (e - t) * 2 + 1 + extra;
3317 	    if (SvLEN(sv) < size) {
3318 
3319 		/* Here, have decided to allocate a new string */
3320 
3321 		U8 *dst;
3322 		U8 *d;
3323 
3324 		Newx(dst, size, U8);
3325 
3326 		/* If no known invariants at the beginning of the input string,
3327 		 * set so starts from there.  Otherwise, can use memory copy to
3328 		 * get up to where we are now, and then start from here */
3329 
3330 		if (invariant_head <= 0) {
3331 		    d = dst;
3332 		} else {
3333 		    Copy(s, dst, invariant_head, char);
3334 		    d = dst + invariant_head;
3335 		}
3336 
3337 		while (t < e) {
3338 		    const UV uv = NATIVE8_TO_UNI(*t++);
3339 		    if (UNI_IS_INVARIANT(uv))
3340 			*d++ = (U8)UNI_TO_NATIVE(uv);
3341 		    else {
3342 			*d++ = (U8)UTF8_EIGHT_BIT_HI(uv);
3343 			*d++ = (U8)UTF8_EIGHT_BIT_LO(uv);
3344 		    }
3345 		}
3346 		*d = '\0';
3347 		SvPV_free(sv); /* No longer using pre-existing string */
3348 		SvPV_set(sv, (char*)dst);
3349 		SvCUR_set(sv, d - dst);
3350 		SvLEN_set(sv, size);
3351 	    } else {
3352 
3353 		/* Here, have decided to get the exact size of the string.
3354 		 * Currently this happens only when we know that there is
3355 		 * guaranteed enough space to fit the converted string, so
3356 		 * don't have to worry about growing.  If two_byte_count is 0,
3357 		 * then t points to the first byte of the string which hasn't
3358 		 * been examined yet.  Otherwise two_byte_count is 1, and t
3359 		 * points to the first byte in the string that will expand to
3360 		 * two.  Depending on this, start examining at t or 1 after t.
3361 		 * */
3362 
3363 		U8 *d = t + two_byte_count;
3364 
3365 
3366 		/* Count up the remaining bytes that expand to two */
3367 
3368 		while (d < e) {
3369 		    const U8 chr = *d++;
3370 		    if (! NATIVE_IS_INVARIANT(chr)) two_byte_count++;
3371 		}
3372 
3373 		/* The string will expand by just the number of bytes that
3374 		 * occupy two positions.  But we are one afterwards because of
3375 		 * the increment just above.  This is the place to put the
3376 		 * trailing NUL, and to set the length before we decrement */
3377 
3378 		d += two_byte_count;
3379 		SvCUR_set(sv, d - s);
3380 		*d-- = '\0';
3381 
3382 
3383 		/* Having decremented d, it points to the position to put the
3384 		 * very last byte of the expanded string.  Go backwards through
3385 		 * the string, copying and expanding as we go, stopping when we
3386 		 * get to the part that is invariant the rest of the way down */
3387 
3388 		e--;
3389 		while (e >= t) {
3390 		    const U8 ch = NATIVE8_TO_UNI(*e--);
3391 		    if (UNI_IS_INVARIANT(ch)) {
3392 			*d-- = UNI_TO_NATIVE(ch);
3393 		    } else {
3394 			*d-- = (U8)UTF8_EIGHT_BIT_LO(ch);
3395 			*d-- = (U8)UTF8_EIGHT_BIT_HI(ch);
3396 		    }
3397 		}
3398 	    }
3399 
3400 	    if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
3401 		/* Update pos. We do it at the end rather than during
3402 		 * the upgrade, to avoid slowing down the common case
3403 		 * (upgrade without pos) */
3404 		MAGIC * mg = mg_find(sv, PERL_MAGIC_regex_global);
3405 		if (mg) {
3406 		    I32 pos = mg->mg_len;
3407 		    if (pos > 0 && (U32)pos > invariant_head) {
3408 			U8 *d = (U8*) SvPVX(sv) + invariant_head;
3409 			STRLEN n = (U32)pos - invariant_head;
3410 			while (n > 0) {
3411 			    if (UTF8_IS_START(*d))
3412 				d++;
3413 			    d++;
3414 			    n--;
3415 			}
3416 			mg->mg_len  = d - (U8*)SvPVX(sv);
3417 		    }
3418 		}
3419 		if ((mg = mg_find(sv, PERL_MAGIC_utf8)))
3420 		    magic_setutf8(sv,mg); /* clear UTF8 cache */
3421 	    }
3422 	}
3423     }
3424 
3425     /* Mark as UTF-8 even if no variant - saves scanning loop */
3426     SvUTF8_on(sv);
3427     return SvCUR(sv);
3428 }
3429 
3430 /*
3431 =for apidoc sv_utf8_downgrade
3432 
3433 Attempts to convert the PV of an SV from characters to bytes.
3434 If the PV contains a character that cannot fit
3435 in a byte, this conversion will fail;
3436 in this case, either returns false or, if C<fail_ok> is not
3437 true, croaks.
3438 
3439 This is not a general purpose Unicode to byte encoding interface:
3440 use the Encode extension for that.
3441 
3442 =cut
3443 */
3444 
3445 bool
3446 Perl_sv_utf8_downgrade(pTHX_ SV *const sv, const bool fail_ok)
3447 {
3448     dVAR;
3449 
3450     PERL_ARGS_ASSERT_SV_UTF8_DOWNGRADE;
3451 
3452     if (SvPOKp(sv) && SvUTF8(sv)) {
3453         if (SvCUR(sv)) {
3454 	    U8 *s;
3455 	    STRLEN len;
3456 	    int mg_flags = SV_GMAGIC;
3457 
3458             if (SvIsCOW(sv)) {
3459                 sv_force_normal_flags(sv, 0);
3460             }
3461 	    if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
3462 		/* update pos */
3463 		MAGIC * mg = mg_find(sv, PERL_MAGIC_regex_global);
3464 		if (mg) {
3465 		    I32 pos = mg->mg_len;
3466 		    if (pos > 0) {
3467 			sv_pos_b2u(sv, &pos);
3468 			mg_flags = 0; /* sv_pos_b2u does get magic */
3469 			mg->mg_len  = pos;
3470 		    }
3471 		}
3472 		if ((mg = mg_find(sv, PERL_MAGIC_utf8)))
3473 		    magic_setutf8(sv,mg); /* clear UTF8 cache */
3474 
3475 	    }
3476 	    s = (U8 *) SvPV_flags(sv, len, mg_flags);
3477 
3478 	    if (!utf8_to_bytes(s, &len)) {
3479 	        if (fail_ok)
3480 		    return FALSE;
3481 		else {
3482 		    if (PL_op)
3483 		        Perl_croak(aTHX_ "Wide character in %s",
3484 				   OP_DESC(PL_op));
3485 		    else
3486 		        Perl_croak(aTHX_ "Wide character");
3487 		}
3488 	    }
3489 	    SvCUR_set(sv, len);
3490 	}
3491     }
3492     SvUTF8_off(sv);
3493     return TRUE;
3494 }
3495 
3496 /*
3497 =for apidoc sv_utf8_encode
3498 
3499 Converts the PV of an SV to UTF-8, but then turns the C<SvUTF8>
3500 flag off so that it looks like octets again.
3501 
3502 =cut
3503 */
3504 
3505 void
3506 Perl_sv_utf8_encode(pTHX_ SV *const sv)
3507 {
3508     PERL_ARGS_ASSERT_SV_UTF8_ENCODE;
3509 
3510     if (SvREADONLY(sv)) {
3511 	sv_force_normal_flags(sv, 0);
3512     }
3513     (void) sv_utf8_upgrade(sv);
3514     SvUTF8_off(sv);
3515 }
3516 
3517 /*
3518 =for apidoc sv_utf8_decode
3519 
3520 If the PV of the SV is an octet sequence in UTF-8
3521 and contains a multiple-byte character, the C<SvUTF8> flag is turned on
3522 so that it looks like a character.  If the PV contains only single-byte
3523 characters, the C<SvUTF8> flag stays off.
3524 Scans PV for validity and returns false if the PV is invalid UTF-8.
3525 
3526 =cut
3527 */
3528 
3529 bool
3530 Perl_sv_utf8_decode(pTHX_ SV *const sv)
3531 {
3532     PERL_ARGS_ASSERT_SV_UTF8_DECODE;
3533 
3534     if (SvPOKp(sv)) {
3535         const U8 *start, *c;
3536         const U8 *e;
3537 
3538 	/* The octets may have got themselves encoded - get them back as
3539 	 * bytes
3540 	 */
3541 	if (!sv_utf8_downgrade(sv, TRUE))
3542 	    return FALSE;
3543 
3544         /* it is actually just a matter of turning the utf8 flag on, but
3545          * we want to make sure everything inside is valid utf8 first.
3546          */
3547         c = start = (const U8 *) SvPVX_const(sv);
3548 	if (!is_utf8_string(c, SvCUR(sv)))
3549 	    return FALSE;
3550         e = (const U8 *) SvEND(sv);
3551         while (c < e) {
3552 	    const U8 ch = *c++;
3553             if (!UTF8_IS_INVARIANT(ch)) {
3554 		SvUTF8_on(sv);
3555 		break;
3556 	    }
3557         }
3558 	if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
3559 	    /* adjust pos to the start of a UTF8 char sequence */
3560 	    MAGIC * mg = mg_find(sv, PERL_MAGIC_regex_global);
3561 	    if (mg) {
3562 		I32 pos = mg->mg_len;
3563 		if (pos > 0) {
3564 		    for (c = start + pos; c > start; c--) {
3565 			if (UTF8_IS_START(*c))
3566 			    break;
3567 		    }
3568 		    mg->mg_len  = c - start;
3569 		}
3570 	    }
3571 	    if ((mg = mg_find(sv, PERL_MAGIC_utf8)))
3572 		magic_setutf8(sv,mg); /* clear UTF8 cache */
3573 	}
3574     }
3575     return TRUE;
3576 }
3577 
3578 /*
3579 =for apidoc sv_setsv
3580 
3581 Copies the contents of the source SV C<ssv> into the destination SV
3582 C<dsv>.  The source SV may be destroyed if it is mortal, so don't use this
3583 function if the source SV needs to be reused.  Does not handle 'set' magic.
3584 Loosely speaking, it performs a copy-by-value, obliterating any previous
3585 content of the destination.
3586 
3587 You probably want to use one of the assortment of wrappers, such as
3588 C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3589 C<SvSetMagicSV_nosteal>.
3590 
3591 =for apidoc sv_setsv_flags
3592 
3593 Copies the contents of the source SV C<ssv> into the destination SV
3594 C<dsv>.  The source SV may be destroyed if it is mortal, so don't use this
3595 function if the source SV needs to be reused.  Does not handle 'set' magic.
3596 Loosely speaking, it performs a copy-by-value, obliterating any previous
3597 content of the destination.
3598 If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
3599 C<ssv> if appropriate, else not.  If the C<flags>
3600 parameter has the C<NOSTEAL> bit set then the
3601 buffers of temps will not be stolen.  <sv_setsv>
3602 and C<sv_setsv_nomg> are implemented in terms of this function.
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 This is the primary function for copying scalars, and most other
3609 copy-ish functions and macros use this underneath.
3610 
3611 =cut
3612 */
3613 
3614 static void
3615 S_glob_assign_glob(pTHX_ SV *const dstr, SV *const sstr, const int dtype)
3616 {
3617     I32 mro_changes = 0; /* 1 = method, 2 = isa, 3 = recursive isa */
3618     HV *old_stash = NULL;
3619 
3620     PERL_ARGS_ASSERT_GLOB_ASSIGN_GLOB;
3621 
3622     if (dtype != SVt_PVGV && !isGV_with_GP(dstr)) {
3623 	const char * const name = GvNAME(sstr);
3624 	const STRLEN len = GvNAMELEN(sstr);
3625 	{
3626 	    if (dtype >= SVt_PV) {
3627 		SvPV_free(dstr);
3628 		SvPV_set(dstr, 0);
3629 		SvLEN_set(dstr, 0);
3630 		SvCUR_set(dstr, 0);
3631 	    }
3632 	    SvUPGRADE(dstr, SVt_PVGV);
3633 	    (void)SvOK_off(dstr);
3634 	    /* We have to turn this on here, even though we turn it off
3635 	       below, as GvSTASH will fail an assertion otherwise. */
3636 	    isGV_with_GP_on(dstr);
3637 	}
3638 	GvSTASH(dstr) = GvSTASH(sstr);
3639 	if (GvSTASH(dstr))
3640 	    Perl_sv_add_backref(aTHX_ MUTABLE_SV(GvSTASH(dstr)), dstr);
3641         gv_name_set(MUTABLE_GV(dstr), name, len,
3642                         GV_ADD | (GvNAMEUTF8(sstr) ? SVf_UTF8 : 0 ));
3643 	SvFAKE_on(dstr);	/* can coerce to non-glob */
3644     }
3645 
3646     if(GvGP(MUTABLE_GV(sstr))) {
3647         /* If source has method cache entry, clear it */
3648         if(GvCVGEN(sstr)) {
3649             SvREFCNT_dec(GvCV(sstr));
3650             GvCV_set(sstr, NULL);
3651             GvCVGEN(sstr) = 0;
3652         }
3653         /* If source has a real method, then a method is
3654            going to change */
3655         else if(
3656          GvCV((const GV *)sstr) && GvSTASH(dstr) && HvENAME(GvSTASH(dstr))
3657         ) {
3658             mro_changes = 1;
3659         }
3660     }
3661 
3662     /* If dest already had a real method, that's a change as well */
3663     if(
3664         !mro_changes && GvGP(MUTABLE_GV(dstr)) && GvCVu((const GV *)dstr)
3665      && GvSTASH(dstr) && HvENAME(GvSTASH(dstr))
3666     ) {
3667         mro_changes = 1;
3668     }
3669 
3670     /* We don't need to check the name of the destination if it was not a
3671        glob to begin with. */
3672     if(dtype == SVt_PVGV) {
3673         const char * const name = GvNAME((const GV *)dstr);
3674         if(
3675             strEQ(name,"ISA")
3676          /* The stash may have been detached from the symbol table, so
3677             check its name. */
3678          && GvSTASH(dstr) && HvENAME(GvSTASH(dstr))
3679         )
3680             mro_changes = 2;
3681         else {
3682             const STRLEN len = GvNAMELEN(dstr);
3683             if ((len > 1 && name[len-2] == ':' && name[len-1] == ':')
3684              || (len == 1 && name[0] == ':')) {
3685                 mro_changes = 3;
3686 
3687                 /* Set aside the old stash, so we can reset isa caches on
3688                    its subclasses. */
3689                 if((old_stash = GvHV(dstr)))
3690                     /* Make sure we do not lose it early. */
3691                     SvREFCNT_inc_simple_void_NN(
3692                      sv_2mortal((SV *)old_stash)
3693                     );
3694             }
3695         }
3696     }
3697 
3698     gp_free(MUTABLE_GV(dstr));
3699     isGV_with_GP_off(dstr); /* SvOK_off does not like globs. */
3700     (void)SvOK_off(dstr);
3701     isGV_with_GP_on(dstr);
3702     GvINTRO_off(dstr);		/* one-shot flag */
3703     GvGP_set(dstr, gp_ref(GvGP(sstr)));
3704     if (SvTAINTED(sstr))
3705 	SvTAINT(dstr);
3706     if (GvIMPORTED(dstr) != GVf_IMPORTED
3707 	&& CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3708 	{
3709 	    GvIMPORTED_on(dstr);
3710 	}
3711     GvMULTI_on(dstr);
3712     if(mro_changes == 2) {
3713       if (GvAV((const GV *)sstr)) {
3714 	MAGIC *mg;
3715 	SV * const sref = (SV *)GvAV((const GV *)dstr);
3716 	if (SvSMAGICAL(sref) && (mg = mg_find(sref, PERL_MAGIC_isa))) {
3717 	    if (SvTYPE(mg->mg_obj) != SVt_PVAV) {
3718 		AV * const ary = newAV();
3719 		av_push(ary, mg->mg_obj); /* takes the refcount */
3720 		mg->mg_obj = (SV *)ary;
3721 	    }
3722 	    av_push((AV *)mg->mg_obj, SvREFCNT_inc_simple_NN(dstr));
3723 	}
3724 	else sv_magic(sref, dstr, PERL_MAGIC_isa, NULL, 0);
3725       }
3726       mro_isa_changed_in(GvSTASH(dstr));
3727     }
3728     else if(mro_changes == 3) {
3729 	HV * const stash = GvHV(dstr);
3730 	if(old_stash ? (HV *)HvENAME_get(old_stash) : stash)
3731 	    mro_package_moved(
3732 		stash, old_stash,
3733 		(GV *)dstr, 0
3734 	    );
3735     }
3736     else if(mro_changes) mro_method_changed_in(GvSTASH(dstr));
3737     return;
3738 }
3739 
3740 static void
3741 S_glob_assign_ref(pTHX_ SV *const dstr, SV *const sstr)
3742 {
3743     SV * const sref = SvRV(sstr);
3744     SV *dref;
3745     const int intro = GvINTRO(dstr);
3746     SV **location;
3747     U8 import_flag = 0;
3748     const U32 stype = SvTYPE(sref);
3749 
3750     PERL_ARGS_ASSERT_GLOB_ASSIGN_REF;
3751 
3752     if (intro) {
3753 	GvINTRO_off(dstr);	/* one-shot flag */
3754 	GvLINE(dstr) = CopLINE(PL_curcop);
3755 	GvEGV(dstr) = MUTABLE_GV(dstr);
3756     }
3757     GvMULTI_on(dstr);
3758     switch (stype) {
3759     case SVt_PVCV:
3760 	location = (SV **) &(GvGP(dstr)->gp_cv); /* XXX bypassing GvCV_set */
3761 	import_flag = GVf_IMPORTED_CV;
3762 	goto common;
3763     case SVt_PVHV:
3764 	location = (SV **) &GvHV(dstr);
3765 	import_flag = GVf_IMPORTED_HV;
3766 	goto common;
3767     case SVt_PVAV:
3768 	location = (SV **) &GvAV(dstr);
3769 	import_flag = GVf_IMPORTED_AV;
3770 	goto common;
3771     case SVt_PVIO:
3772 	location = (SV **) &GvIOp(dstr);
3773 	goto common;
3774     case SVt_PVFM:
3775 	location = (SV **) &GvFORM(dstr);
3776 	goto common;
3777     default:
3778 	location = &GvSV(dstr);
3779 	import_flag = GVf_IMPORTED_SV;
3780     common:
3781 	if (intro) {
3782 	    if (stype == SVt_PVCV) {
3783 		/*if (GvCVGEN(dstr) && (GvCV(dstr) != (const CV *)sref || GvCVGEN(dstr))) {*/
3784 		if (GvCVGEN(dstr)) {
3785 		    SvREFCNT_dec(GvCV(dstr));
3786 		    GvCV_set(dstr, NULL);
3787 		    GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3788 		}
3789 	    }
3790 	    /* SAVEt_GVSLOT takes more room on the savestack and has more
3791 	       overhead in leave_scope than SAVEt_GENERIC_SV.  But for CVs
3792 	       leave_scope needs access to the GV so it can reset method
3793 	       caches.  We must use SAVEt_GVSLOT whenever the type is
3794 	       SVt_PVCV, even if the stash is anonymous, as the stash may
3795 	       gain a name somehow before leave_scope. */
3796 	    if (stype == SVt_PVCV) {
3797 		/* There is no save_pushptrptrptr.  Creating it for this
3798 		   one call site would be overkill.  So inline the ss add
3799 		   routines here. */
3800                 dSS_ADD;
3801 		SS_ADD_PTR(dstr);
3802 		SS_ADD_PTR(location);
3803 		SS_ADD_PTR(SvREFCNT_inc(*location));
3804 		SS_ADD_UV(SAVEt_GVSLOT);
3805 		SS_ADD_END(4);
3806 	    }
3807 	    else SAVEGENERICSV(*location);
3808 	}
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)) gv_method_changed(dstr); /* sub foo { 1 } sub bar { 2 } *bar = \&foo */
3844 	}
3845 	*location = SvREFCNT_inc_simple_NN(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         else if (stype == SVt_PVIO) {
3917             DEBUG_o(Perl_deb(aTHX_ "glob_assign_ref clearing PL_stashcache\n"));
3918             /* It's a cache. It will rebuild itself quite happily.
3919                It's a lot of effort to work out exactly which key (or keys)
3920                might be invalidated by the creation of the this file handle.
3921             */
3922             hv_clear(PL_stashcache);
3923         }
3924 	break;
3925     }
3926     if (!intro) SvREFCNT_dec(dref);
3927     if (SvTAINTED(sstr))
3928 	SvTAINT(dstr);
3929     return;
3930 }
3931 
3932 /* Work around compiler warnings about unsigned >= THRESHOLD when thres-
3933    hold is 0. */
3934 #if SV_COW_THRESHOLD
3935 # define GE_COW_THRESHOLD(len)		((len) >= SV_COW_THRESHOLD)
3936 #else
3937 # define GE_COW_THRESHOLD(len)		1
3938 #endif
3939 #if SV_COWBUF_THRESHOLD
3940 # define GE_COWBUF_THRESHOLD(len)	((len) >= SV_COWBUF_THRESHOLD)
3941 #else
3942 # define GE_COWBUF_THRESHOLD(len)	1
3943 #endif
3944 
3945 void
3946 Perl_sv_setsv_flags(pTHX_ SV *dstr, SV* sstr, const I32 flags)
3947 {
3948     dVAR;
3949     U32 sflags;
3950     int dtype;
3951     svtype stype;
3952 
3953     PERL_ARGS_ASSERT_SV_SETSV_FLAGS;
3954 
3955     if (sstr == dstr)
3956 	return;
3957 
3958     if (SvIS_FREED(dstr)) {
3959 	Perl_croak(aTHX_ "panic: attempt to copy value %" SVf
3960 		   " to a freed scalar %p", SVfARG(sstr), (void *)dstr);
3961     }
3962     SV_CHECK_THINKFIRST_COW_DROP(dstr);
3963     if (!sstr)
3964 	sstr = &PL_sv_undef;
3965     if (SvIS_FREED(sstr)) {
3966 	Perl_croak(aTHX_ "panic: attempt to copy freed scalar %p to %p",
3967 		   (void*)sstr, (void*)dstr);
3968     }
3969     stype = SvTYPE(sstr);
3970     dtype = SvTYPE(dstr);
3971 
3972     /* There's a lot of redundancy below but we're going for speed here */
3973 
3974     switch (stype) {
3975     case SVt_NULL:
3976       undef_sstr:
3977 	if (dtype != SVt_PVGV && dtype != SVt_PVLV) {
3978 	    (void)SvOK_off(dstr);
3979 	    return;
3980 	}
3981 	break;
3982     case SVt_IV:
3983 	if (SvIOK(sstr)) {
3984 	    switch (dtype) {
3985 	    case SVt_NULL:
3986 		sv_upgrade(dstr, SVt_IV);
3987 		break;
3988 	    case SVt_NV:
3989 	    case SVt_PV:
3990 		sv_upgrade(dstr, SVt_PVIV);
3991 		break;
3992 	    case SVt_PVGV:
3993 	    case SVt_PVLV:
3994 		goto end_of_first_switch;
3995 	    }
3996 	    (void)SvIOK_only(dstr);
3997 	    SvIV_set(dstr,  SvIVX(sstr));
3998 	    if (SvIsUV(sstr))
3999 		SvIsUV_on(dstr);
4000 	    /* SvTAINTED can only be true if the SV has taint magic, which in
4001 	       turn means that the SV type is PVMG (or greater). This is the
4002 	       case statement for SVt_IV, so this cannot be true (whatever gcov
4003 	       may say).  */
4004 	    assert(!SvTAINTED(sstr));
4005 	    return;
4006 	}
4007 	if (!SvROK(sstr))
4008 	    goto undef_sstr;
4009 	if (dtype < SVt_PV && dtype != SVt_IV)
4010 	    sv_upgrade(dstr, SVt_IV);
4011 	break;
4012 
4013     case SVt_NV:
4014 	if (SvNOK(sstr)) {
4015 	    switch (dtype) {
4016 	    case SVt_NULL:
4017 	    case SVt_IV:
4018 		sv_upgrade(dstr, SVt_NV);
4019 		break;
4020 	    case SVt_PV:
4021 	    case SVt_PVIV:
4022 		sv_upgrade(dstr, SVt_PVNV);
4023 		break;
4024 	    case SVt_PVGV:
4025 	    case SVt_PVLV:
4026 		goto end_of_first_switch;
4027 	    }
4028 	    SvNV_set(dstr, SvNVX(sstr));
4029 	    (void)SvNOK_only(dstr);
4030 	    /* SvTAINTED can only be true if the SV has taint magic, which in
4031 	       turn means that the SV type is PVMG (or greater). This is the
4032 	       case statement for SVt_NV, so this cannot be true (whatever gcov
4033 	       may say).  */
4034 	    assert(!SvTAINTED(sstr));
4035 	    return;
4036 	}
4037 	goto undef_sstr;
4038 
4039     case SVt_PV:
4040 	if (dtype < SVt_PV)
4041 	    sv_upgrade(dstr, SVt_PV);
4042 	break;
4043     case SVt_PVIV:
4044 	if (dtype < SVt_PVIV)
4045 	    sv_upgrade(dstr, SVt_PVIV);
4046 	break;
4047     case SVt_PVNV:
4048 	if (dtype < SVt_PVNV)
4049 	    sv_upgrade(dstr, SVt_PVNV);
4050 	break;
4051     default:
4052 	{
4053 	const char * const type = sv_reftype(sstr,0);
4054 	if (PL_op)
4055 	    /* diag_listed_as: Bizarre copy of %s */
4056 	    Perl_croak(aTHX_ "Bizarre copy of %s in %s", type, OP_DESC(PL_op));
4057 	else
4058 	    Perl_croak(aTHX_ "Bizarre copy of %s", type);
4059 	}
4060 	break;
4061 
4062     case SVt_REGEXP:
4063       upgregexp:
4064 	if (dtype < SVt_REGEXP)
4065 	{
4066 	    if (dtype >= SVt_PV) {
4067 		SvPV_free(dstr);
4068 		SvPV_set(dstr, 0);
4069 		SvLEN_set(dstr, 0);
4070 		SvCUR_set(dstr, 0);
4071 	    }
4072 	    sv_upgrade(dstr, SVt_REGEXP);
4073 	}
4074 	break;
4075 
4076 	/* case SVt_BIND: */
4077     case SVt_PVLV:
4078     case SVt_PVGV:
4079     case SVt_PVMG:
4080 	if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
4081 	    mg_get(sstr);
4082 	    if (SvTYPE(sstr) != stype)
4083 		stype = SvTYPE(sstr);
4084 	}
4085 	if (isGV_with_GP(sstr) && dtype <= SVt_PVLV) {
4086 		    glob_assign_glob(dstr, sstr, dtype);
4087 		    return;
4088 	}
4089 	if (stype == SVt_PVLV)
4090 	{
4091 	    if (isREGEXP(sstr)) goto upgregexp;
4092 	    SvUPGRADE(dstr, SVt_PVNV);
4093 	}
4094 	else
4095 	    SvUPGRADE(dstr, (svtype)stype);
4096     }
4097  end_of_first_switch:
4098 
4099     /* dstr may have been upgraded.  */
4100     dtype = SvTYPE(dstr);
4101     sflags = SvFLAGS(sstr);
4102 
4103     if (dtype == SVt_PVCV) {
4104 	/* Assigning to a subroutine sets the prototype.  */
4105 	if (SvOK(sstr)) {
4106 	    STRLEN len;
4107 	    const char *const ptr = SvPV_const(sstr, len);
4108 
4109             SvGROW(dstr, len + 1);
4110             Copy(ptr, SvPVX(dstr), len + 1, char);
4111             SvCUR_set(dstr, len);
4112 	    SvPOK_only(dstr);
4113 	    SvFLAGS(dstr) |= sflags & SVf_UTF8;
4114 	    CvAUTOLOAD_off(dstr);
4115 	} else {
4116 	    SvOK_off(dstr);
4117 	}
4118     }
4119     else if (dtype == SVt_PVAV || dtype == SVt_PVHV || dtype == SVt_PVFM) {
4120 	const char * const type = sv_reftype(dstr,0);
4121 	if (PL_op)
4122 	    /* diag_listed_as: Cannot copy to %s */
4123 	    Perl_croak(aTHX_ "Cannot copy to %s in %s", type, OP_DESC(PL_op));
4124 	else
4125 	    Perl_croak(aTHX_ "Cannot copy to %s", type);
4126     } else if (sflags & SVf_ROK) {
4127 	if (isGV_with_GP(dstr)
4128 	    && SvTYPE(SvRV(sstr)) == SVt_PVGV && isGV_with_GP(SvRV(sstr))) {
4129 	    sstr = SvRV(sstr);
4130 	    if (sstr == dstr) {
4131 		if (GvIMPORTED(dstr) != GVf_IMPORTED
4132 		    && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4133 		{
4134 		    GvIMPORTED_on(dstr);
4135 		}
4136 		GvMULTI_on(dstr);
4137 		return;
4138 	    }
4139 	    glob_assign_glob(dstr, sstr, dtype);
4140 	    return;
4141 	}
4142 
4143 	if (dtype >= SVt_PV) {
4144 	    if (isGV_with_GP(dstr)) {
4145 		glob_assign_ref(dstr, sstr);
4146 		return;
4147 	    }
4148 	    if (SvPVX_const(dstr)) {
4149 		SvPV_free(dstr);
4150 		SvLEN_set(dstr, 0);
4151                 SvCUR_set(dstr, 0);
4152 	    }
4153 	}
4154 	(void)SvOK_off(dstr);
4155 	SvRV_set(dstr, SvREFCNT_inc(SvRV(sstr)));
4156 	SvFLAGS(dstr) |= sflags & SVf_ROK;
4157 	assert(!(sflags & SVp_NOK));
4158 	assert(!(sflags & SVp_IOK));
4159 	assert(!(sflags & SVf_NOK));
4160 	assert(!(sflags & SVf_IOK));
4161     }
4162     else if (isGV_with_GP(dstr)) {
4163 	if (!(sflags & SVf_OK)) {
4164 	    Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
4165 			   "Undefined value assigned to typeglob");
4166 	}
4167 	else {
4168 	    GV *gv = gv_fetchsv_nomg(sstr, GV_ADD, SVt_PVGV);
4169 	    if (dstr != (const SV *)gv) {
4170 		const char * const name = GvNAME((const GV *)dstr);
4171 		const STRLEN len = GvNAMELEN(dstr);
4172 		HV *old_stash = NULL;
4173 		bool reset_isa = FALSE;
4174 		if ((len > 1 && name[len-2] == ':' && name[len-1] == ':')
4175 		 || (len == 1 && name[0] == ':')) {
4176 		    /* Set aside the old stash, so we can reset isa caches
4177 		       on its subclasses. */
4178 		    if((old_stash = GvHV(dstr))) {
4179 			/* Make sure we do not lose it early. */
4180 			SvREFCNT_inc_simple_void_NN(
4181 			 sv_2mortal((SV *)old_stash)
4182 			);
4183 		    }
4184 		    reset_isa = TRUE;
4185 		}
4186 
4187 		if (GvGP(dstr))
4188 		    gp_free(MUTABLE_GV(dstr));
4189 		GvGP_set(dstr, gp_ref(GvGP(gv)));
4190 
4191 		if (reset_isa) {
4192 		    HV * const stash = GvHV(dstr);
4193 		    if(
4194 		        old_stash ? (HV *)HvENAME_get(old_stash) : stash
4195 		    )
4196 			mro_package_moved(
4197 			 stash, old_stash,
4198 			 (GV *)dstr, 0
4199 			);
4200 		}
4201 	    }
4202 	}
4203     }
4204     else if ((dtype == SVt_REGEXP || dtype == SVt_PVLV)
4205 	  && (stype == SVt_REGEXP || isREGEXP(sstr))) {
4206 	reg_temp_copy((REGEXP*)dstr, (REGEXP*)sstr);
4207     }
4208     else if (sflags & SVp_POK) {
4209         bool isSwipe = 0;
4210 	const STRLEN cur = SvCUR(sstr);
4211 	const STRLEN len = SvLEN(sstr);
4212 
4213 	/*
4214 	 * Check to see if we can just swipe the string.  If so, it's a
4215 	 * possible small lose on short strings, but a big win on long ones.
4216 	 * It might even be a win on short strings if SvPVX_const(dstr)
4217 	 * has to be allocated and SvPVX_const(sstr) has to be freed.
4218 	 * Likewise if we can set up COW rather than doing an actual copy, we
4219 	 * drop to the else clause, as the swipe code and the COW setup code
4220 	 * have much in common.
4221 	 */
4222 
4223 	/* Whichever path we take through the next code, we want this true,
4224 	   and doing it now facilitates the COW check.  */
4225 	(void)SvPOK_only(dstr);
4226 
4227 	if (
4228 	    /* If we're already COW then this clause is not true, and if COW
4229 	       is allowed then we drop down to the else and make dest COW
4230 	       with us.  If caller hasn't said that we're allowed to COW
4231 	       shared hash keys then we don't do the COW setup, even if the
4232 	       source scalar is a shared hash key scalar.  */
4233             (((flags & SV_COW_SHARED_HASH_KEYS)
4234 	       ? !(sflags & SVf_IsCOW)
4235 #ifdef PERL_NEW_COPY_ON_WRITE
4236 		|| (len &&
4237 		    ((!GE_COWBUF_THRESHOLD(cur) && SvLEN(dstr) > cur)
4238 		   /* If this is a regular (non-hek) COW, only so many COW
4239 		      "copies" are possible. */
4240 		    || CowREFCNT(sstr) == SV_COW_REFCNT_MAX))
4241 #endif
4242 	       : 1 /* If making a COW copy is forbidden then the behaviour we
4243 		       desire is as if the source SV isn't actually already
4244 		       COW, even if it is.  So we act as if the source flags
4245 		       are not COW, rather than actually testing them.  */
4246 	      )
4247 #ifndef PERL_ANY_COW
4248 	     /* The change that added SV_COW_SHARED_HASH_KEYS makes the logic
4249 		when PERL_OLD_COPY_ON_WRITE is defined a little wrong.
4250 		Conceptually PERL_OLD_COPY_ON_WRITE being defined should
4251 		override SV_COW_SHARED_HASH_KEYS, because it means "always COW"
4252 		but in turn, it's somewhat dead code, never expected to go
4253 		live, but more kept as a placeholder on how to do it better
4254 		in a newer implementation.  */
4255 	     /* If we are COW and dstr is a suitable target then we drop down
4256 		into the else and make dest a COW of us.  */
4257 	     || (SvFLAGS(dstr) & SVf_BREAK)
4258 #endif
4259 	     )
4260             &&
4261             !(isSwipe =
4262 #ifdef PERL_NEW_COPY_ON_WRITE
4263 				/* slated for free anyway (and not COW)? */
4264                  (sflags & (SVs_TEMP|SVf_IsCOW)) == SVs_TEMP &&
4265 #else
4266                  (sflags & SVs_TEMP) &&   /* slated for free anyway? */
4267 #endif
4268                  !(sflags & SVf_OOK) &&   /* and not involved in OOK hack? */
4269 	         (!(flags & SV_NOSTEAL)) &&
4270 					/* and we're allowed to steal temps */
4271                  SvREFCNT(sstr) == 1 &&   /* and no other references to it? */
4272                  len)             /* and really is a string */
4273 #ifdef PERL_ANY_COW
4274             && ((flags & SV_COW_SHARED_HASH_KEYS)
4275 		? (!((sflags & CAN_COW_MASK) == CAN_COW_FLAGS
4276 # ifdef PERL_OLD_COPY_ON_WRITE
4277 		     && (SvFLAGS(dstr) & CAN_COW_MASK) == CAN_COW_FLAGS
4278 		     && SvTYPE(sstr) >= SVt_PVIV
4279 # else
4280 		     && !(SvFLAGS(dstr) & SVf_BREAK)
4281 		     && !(sflags & SVf_IsCOW)
4282 		     && GE_COW_THRESHOLD(cur) && cur+1 < len
4283 		     && (GE_COWBUF_THRESHOLD(cur) || SvLEN(dstr) < cur+1)
4284 # endif
4285 		    ))
4286 		: 1)
4287 #endif
4288             ) {
4289             /* Failed the swipe test, and it's not a shared hash key either.
4290                Have to copy the string.  */
4291             SvGROW(dstr, cur + 1);	/* inlined from sv_setpvn */
4292             Move(SvPVX_const(sstr),SvPVX(dstr),cur,char);
4293             SvCUR_set(dstr, cur);
4294             *SvEND(dstr) = '\0';
4295         } else {
4296             /* If PERL_OLD_COPY_ON_WRITE is not defined, then isSwipe will always
4297                be true in here.  */
4298             /* Either it's a shared hash key, or it's suitable for
4299                copy-on-write or we can swipe the string.  */
4300             if (DEBUG_C_TEST) {
4301                 PerlIO_printf(Perl_debug_log, "Copy on write: sstr --> dstr\n");
4302                 sv_dump(sstr);
4303                 sv_dump(dstr);
4304             }
4305 #ifdef PERL_ANY_COW
4306             if (!isSwipe) {
4307                 if (!(sflags & SVf_IsCOW)) {
4308                     SvIsCOW_on(sstr);
4309 # ifdef PERL_OLD_COPY_ON_WRITE
4310                     /* Make the source SV into a loop of 1.
4311                        (about to become 2) */
4312                     SV_COW_NEXT_SV_SET(sstr, sstr);
4313 # else
4314 		    CowREFCNT(sstr) = 0;
4315 # endif
4316                 }
4317             }
4318 #endif
4319             /* Initial code is common.  */
4320 	    if (SvPVX_const(dstr)) {	/* we know that dtype >= SVt_PV */
4321 		SvPV_free(dstr);
4322 	    }
4323 
4324             if (!isSwipe) {
4325                 /* making another shared SV.  */
4326 #ifdef PERL_ANY_COW
4327                 if (len) {
4328 # ifdef PERL_OLD_COPY_ON_WRITE
4329 		    assert (SvTYPE(dstr) >= SVt_PVIV);
4330                     /* SvIsCOW_normal */
4331                     /* splice us in between source and next-after-source.  */
4332                     SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4333                     SV_COW_NEXT_SV_SET(sstr, dstr);
4334 # else
4335 		    CowREFCNT(sstr)++;
4336 # endif
4337                     SvPV_set(dstr, SvPVX_mutable(sstr));
4338                 } else
4339 #endif
4340 		{
4341                     /* SvIsCOW_shared_hash */
4342                     DEBUG_C(PerlIO_printf(Perl_debug_log,
4343                                           "Copy on write: Sharing hash\n"));
4344 
4345 		    assert (SvTYPE(dstr) >= SVt_PV);
4346                     SvPV_set(dstr,
4347 			     HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)))));
4348 		}
4349                 SvLEN_set(dstr, len);
4350                 SvCUR_set(dstr, cur);
4351                 SvIsCOW_on(dstr);
4352             }
4353             else
4354                 {	/* Passes the swipe test.  */
4355                 SvPV_set(dstr, SvPVX_mutable(sstr));
4356                 SvLEN_set(dstr, SvLEN(sstr));
4357                 SvCUR_set(dstr, SvCUR(sstr));
4358 
4359                 SvTEMP_off(dstr);
4360                 (void)SvOK_off(sstr);	/* NOTE: nukes most SvFLAGS on sstr */
4361                 SvPV_set(sstr, NULL);
4362                 SvLEN_set(sstr, 0);
4363                 SvCUR_set(sstr, 0);
4364                 SvTEMP_off(sstr);
4365             }
4366         }
4367 	if (sflags & SVp_NOK) {
4368 	    SvNV_set(dstr, SvNVX(sstr));
4369 	}
4370 	if (sflags & SVp_IOK) {
4371 	    SvIV_set(dstr, SvIVX(sstr));
4372 	    /* Must do this otherwise some other overloaded use of 0x80000000
4373 	       gets confused. I guess SVpbm_VALID */
4374 	    if (sflags & SVf_IVisUV)
4375 		SvIsUV_on(dstr);
4376 	}
4377 	SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_NOK|SVp_NOK|SVf_UTF8);
4378 	{
4379 	    const MAGIC * const smg = SvVSTRING_mg(sstr);
4380 	    if (smg) {
4381 		sv_magic(dstr, NULL, PERL_MAGIC_vstring,
4382 			 smg->mg_ptr, smg->mg_len);
4383 		SvRMAGICAL_on(dstr);
4384 	    }
4385 	}
4386     }
4387     else if (sflags & (SVp_IOK|SVp_NOK)) {
4388 	(void)SvOK_off(dstr);
4389 	SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_IVisUV|SVf_NOK|SVp_NOK);
4390 	if (sflags & SVp_IOK) {
4391 	    /* XXXX Do we want to set IsUV for IV(ROK)?  Be extra safe... */
4392 	    SvIV_set(dstr, SvIVX(sstr));
4393 	}
4394 	if (sflags & SVp_NOK) {
4395 	    SvNV_set(dstr, SvNVX(sstr));
4396 	}
4397     }
4398     else {
4399 	if (isGV_with_GP(sstr)) {
4400 	    gv_efullname3(dstr, MUTABLE_GV(sstr), "*");
4401 	}
4402 	else
4403 	    (void)SvOK_off(dstr);
4404     }
4405     if (SvTAINTED(sstr))
4406 	SvTAINT(dstr);
4407 }
4408 
4409 /*
4410 =for apidoc sv_setsv_mg
4411 
4412 Like C<sv_setsv>, but also handles 'set' magic.
4413 
4414 =cut
4415 */
4416 
4417 void
4418 Perl_sv_setsv_mg(pTHX_ SV *const dstr, SV *const sstr)
4419 {
4420     PERL_ARGS_ASSERT_SV_SETSV_MG;
4421 
4422     sv_setsv(dstr,sstr);
4423     SvSETMAGIC(dstr);
4424 }
4425 
4426 #ifdef PERL_ANY_COW
4427 # ifdef PERL_OLD_COPY_ON_WRITE
4428 #  define SVt_COW SVt_PVIV
4429 # else
4430 #  define SVt_COW SVt_PV
4431 # endif
4432 SV *
4433 Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
4434 {
4435     STRLEN cur = SvCUR(sstr);
4436     STRLEN len = SvLEN(sstr);
4437     char *new_pv;
4438 
4439     PERL_ARGS_ASSERT_SV_SETSV_COW;
4440 
4441     if (DEBUG_C_TEST) {
4442 	PerlIO_printf(Perl_debug_log, "Fast copy on write: %p -> %p\n",
4443 		      (void*)sstr, (void*)dstr);
4444 	sv_dump(sstr);
4445 	if (dstr)
4446 		    sv_dump(dstr);
4447     }
4448 
4449     if (dstr) {
4450 	if (SvTHINKFIRST(dstr))
4451 	    sv_force_normal_flags(dstr, SV_COW_DROP_PV);
4452 	else if (SvPVX_const(dstr))
4453 	    Safefree(SvPVX_mutable(dstr));
4454     }
4455     else
4456 	new_SV(dstr);
4457     SvUPGRADE(dstr, SVt_COW);
4458 
4459     assert (SvPOK(sstr));
4460     assert (SvPOKp(sstr));
4461 # ifdef PERL_OLD_COPY_ON_WRITE
4462     assert (!SvIOK(sstr));
4463     assert (!SvIOKp(sstr));
4464     assert (!SvNOK(sstr));
4465     assert (!SvNOKp(sstr));
4466 # endif
4467 
4468     if (SvIsCOW(sstr)) {
4469 
4470 	if (SvLEN(sstr) == 0) {
4471 	    /* source is a COW shared hash key.  */
4472 	    DEBUG_C(PerlIO_printf(Perl_debug_log,
4473 				  "Fast copy on write: Sharing hash\n"));
4474 	    new_pv = HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr))));
4475 	    goto common_exit;
4476 	}
4477 # ifdef PERL_OLD_COPY_ON_WRITE
4478 	SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4479 # else
4480 	assert(SvCUR(sstr)+1 < SvLEN(sstr));
4481 	assert(CowREFCNT(sstr) < SV_COW_REFCNT_MAX);
4482 # endif
4483     } else {
4484 	assert ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS);
4485 	SvUPGRADE(sstr, SVt_COW);
4486 	SvIsCOW_on(sstr);
4487 	DEBUG_C(PerlIO_printf(Perl_debug_log,
4488 			      "Fast copy on write: Converting sstr to COW\n"));
4489 # ifdef PERL_OLD_COPY_ON_WRITE
4490 	SV_COW_NEXT_SV_SET(dstr, sstr);
4491 # else
4492 	CowREFCNT(sstr) = 0;
4493 # endif
4494     }
4495 # ifdef PERL_OLD_COPY_ON_WRITE
4496     SV_COW_NEXT_SV_SET(sstr, dstr);
4497 # else
4498     CowREFCNT(sstr)++;
4499 # endif
4500     new_pv = SvPVX_mutable(sstr);
4501 
4502   common_exit:
4503     SvPV_set(dstr, new_pv);
4504     SvFLAGS(dstr) = (SVt_COW|SVf_POK|SVp_POK|SVf_IsCOW);
4505     if (SvUTF8(sstr))
4506 	SvUTF8_on(dstr);
4507     SvLEN_set(dstr, len);
4508     SvCUR_set(dstr, cur);
4509     if (DEBUG_C_TEST) {
4510 	sv_dump(dstr);
4511     }
4512     return dstr;
4513 }
4514 #endif
4515 
4516 /*
4517 =for apidoc sv_setpvn
4518 
4519 Copies a string into an SV.  The C<len> parameter indicates the number of
4520 bytes to be copied.  If the C<ptr> argument is NULL the SV will become
4521 undefined.  Does not handle 'set' magic.  See C<sv_setpvn_mg>.
4522 
4523 =cut
4524 */
4525 
4526 void
4527 Perl_sv_setpvn(pTHX_ SV *const sv, const char *const ptr, const STRLEN len)
4528 {
4529     dVAR;
4530     char *dptr;
4531 
4532     PERL_ARGS_ASSERT_SV_SETPVN;
4533 
4534     SV_CHECK_THINKFIRST_COW_DROP(sv);
4535     if (!ptr) {
4536 	(void)SvOK_off(sv);
4537 	return;
4538     }
4539     else {
4540         /* len is STRLEN which is unsigned, need to copy to signed */
4541 	const IV iv = len;
4542 	if (iv < 0)
4543 	    Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen %"
4544 		       IVdf, iv);
4545     }
4546     SvUPGRADE(sv, SVt_PV);
4547 
4548     dptr = SvGROW(sv, len + 1);
4549     Move(ptr,dptr,len,char);
4550     dptr[len] = '\0';
4551     SvCUR_set(sv, len);
4552     (void)SvPOK_only_UTF8(sv);		/* validate pointer */
4553     SvTAINT(sv);
4554     if (SvTYPE(sv) == SVt_PVCV) CvAUTOLOAD_off(sv);
4555 }
4556 
4557 /*
4558 =for apidoc sv_setpvn_mg
4559 
4560 Like C<sv_setpvn>, but also handles 'set' magic.
4561 
4562 =cut
4563 */
4564 
4565 void
4566 Perl_sv_setpvn_mg(pTHX_ SV *const sv, const char *const ptr, const STRLEN len)
4567 {
4568     PERL_ARGS_ASSERT_SV_SETPVN_MG;
4569 
4570     sv_setpvn(sv,ptr,len);
4571     SvSETMAGIC(sv);
4572 }
4573 
4574 /*
4575 =for apidoc sv_setpv
4576 
4577 Copies a string into an SV.  The string must be null-terminated.  Does not
4578 handle 'set' magic.  See C<sv_setpv_mg>.
4579 
4580 =cut
4581 */
4582 
4583 void
4584 Perl_sv_setpv(pTHX_ SV *const sv, const char *const ptr)
4585 {
4586     dVAR;
4587     STRLEN len;
4588 
4589     PERL_ARGS_ASSERT_SV_SETPV;
4590 
4591     SV_CHECK_THINKFIRST_COW_DROP(sv);
4592     if (!ptr) {
4593 	(void)SvOK_off(sv);
4594 	return;
4595     }
4596     len = strlen(ptr);
4597     SvUPGRADE(sv, SVt_PV);
4598 
4599     SvGROW(sv, len + 1);
4600     Move(ptr,SvPVX(sv),len+1,char);
4601     SvCUR_set(sv, len);
4602     (void)SvPOK_only_UTF8(sv);		/* validate pointer */
4603     SvTAINT(sv);
4604     if (SvTYPE(sv) == SVt_PVCV) CvAUTOLOAD_off(sv);
4605 }
4606 
4607 /*
4608 =for apidoc sv_setpv_mg
4609 
4610 Like C<sv_setpv>, but also handles 'set' magic.
4611 
4612 =cut
4613 */
4614 
4615 void
4616 Perl_sv_setpv_mg(pTHX_ SV *const sv, const char *const ptr)
4617 {
4618     PERL_ARGS_ASSERT_SV_SETPV_MG;
4619 
4620     sv_setpv(sv,ptr);
4621     SvSETMAGIC(sv);
4622 }
4623 
4624 void
4625 Perl_sv_sethek(pTHX_ SV *const sv, const HEK *const hek)
4626 {
4627     dVAR;
4628 
4629     PERL_ARGS_ASSERT_SV_SETHEK;
4630 
4631     if (!hek) {
4632 	return;
4633     }
4634 
4635     if (HEK_LEN(hek) == HEf_SVKEY) {
4636 	sv_setsv(sv, *(SV**)HEK_KEY(hek));
4637         return;
4638     } else {
4639 	const int flags = HEK_FLAGS(hek);
4640 	if (flags & HVhek_WASUTF8) {
4641 	    STRLEN utf8_len = HEK_LEN(hek);
4642 	    char *as_utf8 = (char *)bytes_to_utf8((U8*)HEK_KEY(hek), &utf8_len);
4643 	    sv_usepvn_flags(sv, as_utf8, utf8_len, SV_HAS_TRAILING_NUL);
4644 	    SvUTF8_on(sv);
4645             return;
4646         } else if (flags & HVhek_UNSHARED) {
4647 	    sv_setpvn(sv, HEK_KEY(hek), HEK_LEN(hek));
4648 	    if (HEK_UTF8(hek))
4649 		SvUTF8_on(sv);
4650 	    else SvUTF8_off(sv);
4651             return;
4652 	}
4653         {
4654 	    SV_CHECK_THINKFIRST_COW_DROP(sv);
4655 	    SvUPGRADE(sv, SVt_PV);
4656 	    Safefree(SvPVX(sv));
4657 	    SvPV_set(sv,(char *)HEK_KEY(share_hek_hek(hek)));
4658 	    SvCUR_set(sv, HEK_LEN(hek));
4659 	    SvLEN_set(sv, 0);
4660 	    SvIsCOW_on(sv);
4661 	    SvPOK_on(sv);
4662 	    if (HEK_UTF8(hek))
4663 		SvUTF8_on(sv);
4664 	    else SvUTF8_off(sv);
4665             return;
4666 	}
4667     }
4668 }
4669 
4670 
4671 /*
4672 =for apidoc sv_usepvn_flags
4673 
4674 Tells an SV to use C<ptr> to find its string value.  Normally the
4675 string is stored inside the SV but sv_usepvn allows the SV to use an
4676 outside string.  The C<ptr> should point to memory that was allocated
4677 by C<malloc>.  It must be the start of a mallocked block
4678 of memory, and not a pointer to the middle of it.  The
4679 string length, C<len>, must be supplied.  By default
4680 this function will realloc (i.e. move) the memory pointed to by C<ptr>,
4681 so that pointer should not be freed or used by the programmer after
4682 giving it to sv_usepvn, and neither should any pointers from "behind"
4683 that pointer (e.g. ptr + 1) be used.
4684 
4685 If C<flags> & SV_SMAGIC is true, will call SvSETMAGIC.  If C<flags> &
4686 SV_HAS_TRAILING_NUL is true, then C<ptr[len]> must be NUL, and the realloc
4687 will be skipped (i.e. the buffer is actually at least 1 byte longer than
4688 C<len>, and already meets the requirements for storing in C<SvPVX>).
4689 
4690 =cut
4691 */
4692 
4693 void
4694 Perl_sv_usepvn_flags(pTHX_ SV *const sv, char *ptr, const STRLEN len, const U32 flags)
4695 {
4696     dVAR;
4697     STRLEN allocate;
4698 
4699     PERL_ARGS_ASSERT_SV_USEPVN_FLAGS;
4700 
4701     SV_CHECK_THINKFIRST_COW_DROP(sv);
4702     SvUPGRADE(sv, SVt_PV);
4703     if (!ptr) {
4704 	(void)SvOK_off(sv);
4705 	if (flags & SV_SMAGIC)
4706 	    SvSETMAGIC(sv);
4707 	return;
4708     }
4709     if (SvPVX_const(sv))
4710 	SvPV_free(sv);
4711 
4712 #ifdef DEBUGGING
4713     if (flags & SV_HAS_TRAILING_NUL)
4714 	assert(ptr[len] == '\0');
4715 #endif
4716 
4717     allocate = (flags & SV_HAS_TRAILING_NUL)
4718 	? len + 1 :
4719 #ifdef Perl_safesysmalloc_size
4720 	len + 1;
4721 #else
4722 	PERL_STRLEN_ROUNDUP(len + 1);
4723 #endif
4724     if (flags & SV_HAS_TRAILING_NUL) {
4725 	/* It's long enough - do nothing.
4726 	   Specifically Perl_newCONSTSUB is relying on this.  */
4727     } else {
4728 #ifdef DEBUGGING
4729 	/* Force a move to shake out bugs in callers.  */
4730 	char *new_ptr = (char*)safemalloc(allocate);
4731 	Copy(ptr, new_ptr, len, char);
4732 	PoisonFree(ptr,len,char);
4733 	Safefree(ptr);
4734 	ptr = new_ptr;
4735 #else
4736 	ptr = (char*) saferealloc (ptr, allocate);
4737 #endif
4738     }
4739 #ifdef Perl_safesysmalloc_size
4740     SvLEN_set(sv, Perl_safesysmalloc_size(ptr));
4741 #else
4742     SvLEN_set(sv, allocate);
4743 #endif
4744     SvCUR_set(sv, len);
4745     SvPV_set(sv, ptr);
4746     if (!(flags & SV_HAS_TRAILING_NUL)) {
4747 	ptr[len] = '\0';
4748     }
4749     (void)SvPOK_only_UTF8(sv);		/* validate pointer */
4750     SvTAINT(sv);
4751     if (flags & SV_SMAGIC)
4752 	SvSETMAGIC(sv);
4753 }
4754 
4755 #ifdef PERL_OLD_COPY_ON_WRITE
4756 /* Need to do this *after* making the SV normal, as we need the buffer
4757    pointer to remain valid until after we've copied it.  If we let go too early,
4758    another thread could invalidate it by unsharing last of the same hash key
4759    (which it can do by means other than releasing copy-on-write Svs)
4760    or by changing the other copy-on-write SVs in the loop.  */
4761 STATIC void
4762 S_sv_release_COW(pTHX_ SV *sv, const char *pvx, SV *after)
4763 {
4764     PERL_ARGS_ASSERT_SV_RELEASE_COW;
4765 
4766     { /* this SV was SvIsCOW_normal(sv) */
4767          /* we need to find the SV pointing to us.  */
4768         SV *current = SV_COW_NEXT_SV(after);
4769 
4770         if (current == sv) {
4771             /* The SV we point to points back to us (there were only two of us
4772                in the loop.)
4773                Hence other SV is no longer copy on write either.  */
4774             SvIsCOW_off(after);
4775         } else {
4776             /* We need to follow the pointers around the loop.  */
4777             SV *next;
4778             while ((next = SV_COW_NEXT_SV(current)) != sv) {
4779                 assert (next);
4780                 current = next;
4781                  /* don't loop forever if the structure is bust, and we have
4782                     a pointer into a closed loop.  */
4783                 assert (current != after);
4784                 assert (SvPVX_const(current) == pvx);
4785             }
4786             /* Make the SV before us point to the SV after us.  */
4787             SV_COW_NEXT_SV_SET(current, after);
4788         }
4789     }
4790 }
4791 #endif
4792 /*
4793 =for apidoc sv_force_normal_flags
4794 
4795 Undo various types of fakery on an SV, where fakery means
4796 "more than" a string: if the PV is a shared string, make
4797 a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
4798 an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
4799 we do the copy, and is also used locally; if this is a
4800 vstring, drop the vstring magic.  If C<SV_COW_DROP_PV> is set
4801 then a copy-on-write scalar drops its PV buffer (if any) and becomes
4802 SvPOK_off rather than making a copy.  (Used where this
4803 scalar is about to be set to some other value.)  In addition,
4804 the C<flags> parameter gets passed to C<sv_unref_flags()>
4805 when unreffing.  C<sv_force_normal> calls this function
4806 with flags set to 0.
4807 
4808 =cut
4809 */
4810 
4811 void
4812 Perl_sv_force_normal_flags(pTHX_ SV *const sv, const U32 flags)
4813 {
4814     dVAR;
4815 
4816     PERL_ARGS_ASSERT_SV_FORCE_NORMAL_FLAGS;
4817 
4818 #ifdef PERL_ANY_COW
4819     if (SvREADONLY(sv)) {
4820 	if (IN_PERL_RUNTIME)
4821 	    Perl_croak_no_modify();
4822     }
4823     else if (SvIsCOW(sv)) {
4824 	const char * const pvx = SvPVX_const(sv);
4825 	const STRLEN len = SvLEN(sv);
4826 	const STRLEN cur = SvCUR(sv);
4827 # ifdef PERL_OLD_COPY_ON_WRITE
4828 	/* next COW sv in the loop.  If len is 0 then this is a shared-hash
4829 	   key scalar, so we mustn't attempt to call SV_COW_NEXT_SV(), as
4830 	   we'll fail an assertion.  */
4831 	SV * const next = len ? SV_COW_NEXT_SV(sv) : 0;
4832 # endif
4833 
4834         if (DEBUG_C_TEST) {
4835                 PerlIO_printf(Perl_debug_log,
4836                               "Copy on write: Force normal %ld\n",
4837                               (long) flags);
4838                 sv_dump(sv);
4839         }
4840         SvIsCOW_off(sv);
4841 # ifdef PERL_NEW_COPY_ON_WRITE
4842 	if (len && CowREFCNT(sv) == 0)
4843 	    /* We own the buffer ourselves. */
4844 	    NOOP;
4845 	else
4846 # endif
4847 	{
4848 
4849             /* This SV doesn't own the buffer, so need to Newx() a new one:  */
4850 # ifdef PERL_NEW_COPY_ON_WRITE
4851 	    /* Must do this first, since the macro uses SvPVX. */
4852 	    if (len) CowREFCNT(sv)--;
4853 # endif
4854             SvPV_set(sv, NULL);
4855             SvLEN_set(sv, 0);
4856             if (flags & SV_COW_DROP_PV) {
4857                 /* OK, so we don't need to copy our buffer.  */
4858                 SvPOK_off(sv);
4859             } else {
4860                 SvGROW(sv, cur + 1);
4861                 Move(pvx,SvPVX(sv),cur,char);
4862                 SvCUR_set(sv, cur);
4863                 *SvEND(sv) = '\0';
4864             }
4865 	    if (len) {
4866 # ifdef PERL_OLD_COPY_ON_WRITE
4867 		sv_release_COW(sv, pvx, next);
4868 # endif
4869 	    } else {
4870 		unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
4871 	    }
4872             if (DEBUG_C_TEST) {
4873                 sv_dump(sv);
4874             }
4875 	}
4876     }
4877 #else
4878     if (SvREADONLY(sv)) {
4879 	if (IN_PERL_RUNTIME)
4880 	    Perl_croak_no_modify();
4881     }
4882     else
4883 	if (SvIsCOW(sv)) {
4884 	    const char * const pvx = SvPVX_const(sv);
4885 	    const STRLEN len = SvCUR(sv);
4886 	    SvIsCOW_off(sv);
4887 	    SvPV_set(sv, NULL);
4888 	    SvLEN_set(sv, 0);
4889 	    if (flags & SV_COW_DROP_PV) {
4890 		/* OK, so we don't need to copy our buffer.  */
4891 		SvPOK_off(sv);
4892 	    } else {
4893 		SvGROW(sv, len + 1);
4894 		Move(pvx,SvPVX(sv),len,char);
4895 		*SvEND(sv) = '\0';
4896 	    }
4897 	    unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
4898 	}
4899 #endif
4900     if (SvROK(sv))
4901 	sv_unref_flags(sv, flags);
4902     else if (SvFAKE(sv) && isGV_with_GP(sv))
4903 	sv_unglob(sv, flags);
4904     else if (SvFAKE(sv) && isREGEXP(sv)) {
4905 	/* Need to downgrade the REGEXP to a simple(r) scalar. This is analogous
4906 	   to sv_unglob. We only need it here, so inline it.  */
4907 	const bool islv = SvTYPE(sv) == SVt_PVLV;
4908 	const svtype new_type =
4909 	  islv ? SVt_NULL : SvMAGIC(sv) || SvSTASH(sv) ? SVt_PVMG : SVt_PV;
4910 	SV *const temp = newSV_type(new_type);
4911 	regexp *const temp_p = ReANY((REGEXP *)sv);
4912 
4913 	if (new_type == SVt_PVMG) {
4914 	    SvMAGIC_set(temp, SvMAGIC(sv));
4915 	    SvMAGIC_set(sv, NULL);
4916 	    SvSTASH_set(temp, SvSTASH(sv));
4917 	    SvSTASH_set(sv, NULL);
4918 	}
4919 	if (!islv) SvCUR_set(temp, SvCUR(sv));
4920 	/* Remember that SvPVX is in the head, not the body.  But
4921 	   RX_WRAPPED is in the body. */
4922 	assert(ReANY((REGEXP *)sv)->mother_re);
4923 	/* Their buffer is already owned by someone else. */
4924 	if (flags & SV_COW_DROP_PV) {
4925 	    /* SvLEN is already 0.  For SVt_REGEXP, we have a brand new
4926 	       zeroed body.  For SVt_PVLV, it should have been set to 0
4927 	       before turning into a regexp. */
4928 	    assert(!SvLEN(islv ? sv : temp));
4929 	    sv->sv_u.svu_pv = 0;
4930 	}
4931 	else {
4932 	    sv->sv_u.svu_pv = savepvn(RX_WRAPPED((REGEXP *)sv), SvCUR(sv));
4933 	    SvLEN_set(islv ? sv : temp, SvCUR(sv)+1);
4934 	    SvPOK_on(sv);
4935 	}
4936 
4937 	/* Now swap the rest of the bodies. */
4938 
4939 	SvFAKE_off(sv);
4940 	if (!islv) {
4941 	    SvFLAGS(sv) &= ~SVTYPEMASK;
4942 	    SvFLAGS(sv) |= new_type;
4943 	    SvANY(sv) = SvANY(temp);
4944 	}
4945 
4946 	SvFLAGS(temp) &= ~(SVTYPEMASK);
4947 	SvFLAGS(temp) |= SVt_REGEXP|SVf_FAKE;
4948 	SvANY(temp) = temp_p;
4949 	temp->sv_u.svu_rx = (regexp *)temp_p;
4950 
4951 	SvREFCNT_dec_NN(temp);
4952     }
4953     else if (SvVOK(sv)) sv_unmagic(sv, PERL_MAGIC_vstring);
4954 }
4955 
4956 /*
4957 =for apidoc sv_chop
4958 
4959 Efficient removal of characters from the beginning of the string buffer.
4960 SvPOK(sv), or at least SvPOKp(sv), must be true and the C<ptr> must be a
4961 pointer to somewhere inside the string buffer.  The C<ptr> becomes the first
4962 character of the adjusted string.  Uses the "OOK hack".  On return, only
4963 SvPOK(sv) and SvPOKp(sv) among the OK flags will be true.
4964 
4965 Beware: after this function returns, C<ptr> and SvPVX_const(sv) may no longer
4966 refer to the same chunk of data.
4967 
4968 The unfortunate similarity of this function's name to that of Perl's C<chop>
4969 operator is strictly coincidental.  This function works from the left;
4970 C<chop> works from the right.
4971 
4972 =cut
4973 */
4974 
4975 void
4976 Perl_sv_chop(pTHX_ SV *const sv, const char *const ptr)
4977 {
4978     STRLEN delta;
4979     STRLEN old_delta;
4980     U8 *p;
4981 #ifdef DEBUGGING
4982     const U8 *evacp;
4983     STRLEN evacn;
4984 #endif
4985     STRLEN max_delta;
4986 
4987     PERL_ARGS_ASSERT_SV_CHOP;
4988 
4989     if (!ptr || !SvPOKp(sv))
4990 	return;
4991     delta = ptr - SvPVX_const(sv);
4992     if (!delta) {
4993 	/* Nothing to do.  */
4994 	return;
4995     }
4996     max_delta = SvLEN(sv) ? SvLEN(sv) : SvCUR(sv);
4997     if (delta > max_delta)
4998 	Perl_croak(aTHX_ "panic: sv_chop ptr=%p, start=%p, end=%p",
4999 		   ptr, SvPVX_const(sv), SvPVX_const(sv) + max_delta);
5000     /* SvPVX(sv) may move in SV_CHECK_THINKFIRST(sv), so don't use ptr any more */
5001     SV_CHECK_THINKFIRST(sv);
5002     SvPOK_only_UTF8(sv);
5003 
5004     if (!SvOOK(sv)) {
5005 	if (!SvLEN(sv)) { /* make copy of shared string */
5006 	    const char *pvx = SvPVX_const(sv);
5007 	    const STRLEN len = SvCUR(sv);
5008 	    SvGROW(sv, len + 1);
5009 	    Move(pvx,SvPVX(sv),len,char);
5010 	    *SvEND(sv) = '\0';
5011 	}
5012 	SvOOK_on(sv);
5013 	old_delta = 0;
5014     } else {
5015 	SvOOK_offset(sv, old_delta);
5016     }
5017     SvLEN_set(sv, SvLEN(sv) - delta);
5018     SvCUR_set(sv, SvCUR(sv) - delta);
5019     SvPV_set(sv, SvPVX(sv) + delta);
5020 
5021     p = (U8 *)SvPVX_const(sv);
5022 
5023 #ifdef DEBUGGING
5024     /* how many bytes were evacuated?  we will fill them with sentinel
5025        bytes, except for the part holding the new offset of course. */
5026     evacn = delta;
5027     if (old_delta)
5028 	evacn += (old_delta < 0x100 ? 1 : 1 + sizeof(STRLEN));
5029     assert(evacn);
5030     assert(evacn <= delta + old_delta);
5031     evacp = p - evacn;
5032 #endif
5033 
5034     delta += old_delta;
5035     assert(delta);
5036     if (delta < 0x100) {
5037 	*--p = (U8) delta;
5038     } else {
5039 	*--p = 0;
5040 	p -= sizeof(STRLEN);
5041 	Copy((U8*)&delta, p, sizeof(STRLEN), U8);
5042     }
5043 
5044 #ifdef DEBUGGING
5045     /* Fill the preceding buffer with sentinals to verify that no-one is
5046        using it.  */
5047     while (p > evacp) {
5048 	--p;
5049 	*p = (U8)PTR2UV(p);
5050     }
5051 #endif
5052 }
5053 
5054 /*
5055 =for apidoc sv_catpvn
5056 
5057 Concatenates the string onto the end of the string which is in the SV.  The
5058 C<len> indicates number of bytes to copy.  If the SV has the UTF-8
5059 status set, then the bytes appended should be valid UTF-8.
5060 Handles 'get' magic, but not 'set' magic.  See C<sv_catpvn_mg>.
5061 
5062 =for apidoc sv_catpvn_flags
5063 
5064 Concatenates the string onto the end of the string which is in the SV.  The
5065 C<len> indicates number of bytes to copy.  If the SV has the UTF-8
5066 status set, then the bytes appended should be valid UTF-8.
5067 If C<flags> has the C<SV_SMAGIC> bit set, will
5068 C<mg_set> on C<dsv> afterwards if appropriate.
5069 C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
5070 in terms of this function.
5071 
5072 =cut
5073 */
5074 
5075 void
5076 Perl_sv_catpvn_flags(pTHX_ SV *const dsv, const char *sstr, const STRLEN slen, const I32 flags)
5077 {
5078     dVAR;
5079     STRLEN dlen;
5080     const char * const dstr = SvPV_force_flags(dsv, dlen, flags);
5081 
5082     PERL_ARGS_ASSERT_SV_CATPVN_FLAGS;
5083     assert((flags & (SV_CATBYTES|SV_CATUTF8)) != (SV_CATBYTES|SV_CATUTF8));
5084 
5085     if (!(flags & SV_CATBYTES) || !SvUTF8(dsv)) {
5086       if (flags & SV_CATUTF8 && !SvUTF8(dsv)) {
5087 	 sv_utf8_upgrade_flags_grow(dsv, 0, slen + 1);
5088 	 dlen = SvCUR(dsv);
5089       }
5090       else SvGROW(dsv, dlen + slen + 1);
5091       if (sstr == dstr)
5092 	sstr = SvPVX_const(dsv);
5093       Move(sstr, SvPVX(dsv) + dlen, slen, char);
5094       SvCUR_set(dsv, SvCUR(dsv) + slen);
5095     }
5096     else {
5097 	/* We inline bytes_to_utf8, to avoid an extra malloc. */
5098 	const char * const send = sstr + slen;
5099 	U8 *d;
5100 
5101 	/* Something this code does not account for, which I think is
5102 	   impossible; it would require the same pv to be treated as
5103 	   bytes *and* utf8, which would indicate a bug elsewhere. */
5104 	assert(sstr != dstr);
5105 
5106 	SvGROW(dsv, dlen + slen * 2 + 1);
5107 	d = (U8 *)SvPVX(dsv) + dlen;
5108 
5109 	while (sstr < send) {
5110 	    const UV uv = NATIVE_TO_ASCII((U8)*sstr++);
5111 	    if (UNI_IS_INVARIANT(uv))
5112 		*d++ = (U8)UTF_TO_NATIVE(uv);
5113 	    else {
5114 		*d++ = (U8)UTF8_EIGHT_BIT_HI(uv);
5115 		*d++ = (U8)UTF8_EIGHT_BIT_LO(uv);
5116 	    }
5117 	}
5118 	SvCUR_set(dsv, d-(const U8 *)SvPVX(dsv));
5119     }
5120     *SvEND(dsv) = '\0';
5121     (void)SvPOK_only_UTF8(dsv);		/* validate pointer */
5122     SvTAINT(dsv);
5123     if (flags & SV_SMAGIC)
5124 	SvSETMAGIC(dsv);
5125 }
5126 
5127 /*
5128 =for apidoc sv_catsv
5129 
5130 Concatenates the string from SV C<ssv> onto the end of the string in SV
5131 C<dsv>.  If C<ssv> is null, does nothing; otherwise modifies only C<dsv>.
5132 Handles 'get' magic on both SVs, but no 'set' magic.  See C<sv_catsv_mg> and
5133 C<sv_catsv_nomg>.
5134 
5135 =for apidoc sv_catsv_flags
5136 
5137 Concatenates the string from SV C<ssv> onto the end of the string in SV
5138 C<dsv>.  If C<ssv> is null, does nothing; otherwise modifies only C<dsv>.
5139 If C<flags> include C<SV_GMAGIC> bit set, will call C<mg_get> on both SVs if
5140 appropriate.  If C<flags> include C<SV_SMAGIC>, C<mg_set> will be called on
5141 the modified SV afterward, if appropriate.  C<sv_catsv>, C<sv_catsv_nomg>,
5142 and C<sv_catsv_mg> are implemented in terms of this function.
5143 
5144 =cut */
5145 
5146 void
5147 Perl_sv_catsv_flags(pTHX_ SV *const dsv, SV *const ssv, const I32 flags)
5148 {
5149     dVAR;
5150 
5151     PERL_ARGS_ASSERT_SV_CATSV_FLAGS;
5152 
5153     if (ssv) {
5154 	STRLEN slen;
5155 	const char *spv = SvPV_flags_const(ssv, slen, flags);
5156 	if (spv) {
5157             if (flags & SV_GMAGIC)
5158                 SvGETMAGIC(dsv);
5159 	    sv_catpvn_flags(dsv, spv, slen,
5160 			    DO_UTF8(ssv) ? SV_CATUTF8 : SV_CATBYTES);
5161             if (flags & SV_SMAGIC)
5162                 SvSETMAGIC(dsv);
5163         }
5164     }
5165 }
5166 
5167 /*
5168 =for apidoc sv_catpv
5169 
5170 Concatenates the string onto the end of the string which is in the SV.
5171 If the SV has the UTF-8 status set, then the bytes appended should be
5172 valid UTF-8.  Handles 'get' magic, but not 'set' magic.  See C<sv_catpv_mg>.
5173 
5174 =cut */
5175 
5176 void
5177 Perl_sv_catpv(pTHX_ SV *const sv, const char *ptr)
5178 {
5179     dVAR;
5180     STRLEN len;
5181     STRLEN tlen;
5182     char *junk;
5183 
5184     PERL_ARGS_ASSERT_SV_CATPV;
5185 
5186     if (!ptr)
5187 	return;
5188     junk = SvPV_force(sv, tlen);
5189     len = strlen(ptr);
5190     SvGROW(sv, tlen + len + 1);
5191     if (ptr == junk)
5192 	ptr = SvPVX_const(sv);
5193     Move(ptr,SvPVX(sv)+tlen,len+1,char);
5194     SvCUR_set(sv, SvCUR(sv) + len);
5195     (void)SvPOK_only_UTF8(sv);		/* validate pointer */
5196     SvTAINT(sv);
5197 }
5198 
5199 /*
5200 =for apidoc sv_catpv_flags
5201 
5202 Concatenates the string onto the end of the string which is in the SV.
5203 If the SV has the UTF-8 status set, then the bytes appended should
5204 be valid UTF-8.  If C<flags> has the C<SV_SMAGIC> bit set, will C<mg_set>
5205 on the modified SV if appropriate.
5206 
5207 =cut
5208 */
5209 
5210 void
5211 Perl_sv_catpv_flags(pTHX_ SV *dstr, const char *sstr, const I32 flags)
5212 {
5213     PERL_ARGS_ASSERT_SV_CATPV_FLAGS;
5214     sv_catpvn_flags(dstr, sstr, strlen(sstr), flags);
5215 }
5216 
5217 /*
5218 =for apidoc sv_catpv_mg
5219 
5220 Like C<sv_catpv>, but also handles 'set' magic.
5221 
5222 =cut
5223 */
5224 
5225 void
5226 Perl_sv_catpv_mg(pTHX_ SV *const sv, const char *const ptr)
5227 {
5228     PERL_ARGS_ASSERT_SV_CATPV_MG;
5229 
5230     sv_catpv(sv,ptr);
5231     SvSETMAGIC(sv);
5232 }
5233 
5234 /*
5235 =for apidoc newSV
5236 
5237 Creates a new SV.  A non-zero C<len> parameter indicates the number of
5238 bytes of preallocated string space the SV should have.  An extra byte for a
5239 trailing NUL is also reserved.  (SvPOK is not set for the SV even if string
5240 space is allocated.)  The reference count for the new SV is set to 1.
5241 
5242 In 5.9.3, newSV() replaces the older NEWSV() API, and drops the first
5243 parameter, I<x>, a debug aid which allowed callers to identify themselves.
5244 This aid has been superseded by a new build option, PERL_MEM_LOG (see
5245 L<perlhacktips/PERL_MEM_LOG>).  The older API is still there for use in XS
5246 modules supporting older perls.
5247 
5248 =cut
5249 */
5250 
5251 SV *
5252 Perl_newSV(pTHX_ const STRLEN len)
5253 {
5254     dVAR;
5255     SV *sv;
5256 
5257     new_SV(sv);
5258     if (len) {
5259 	sv_upgrade(sv, SVt_PV);
5260 	SvGROW(sv, len + 1);
5261     }
5262     return sv;
5263 }
5264 /*
5265 =for apidoc sv_magicext
5266 
5267 Adds magic to an SV, upgrading it if necessary.  Applies the
5268 supplied vtable and returns a pointer to the magic added.
5269 
5270 Note that C<sv_magicext> will allow things that C<sv_magic> will not.
5271 In particular, you can add magic to SvREADONLY SVs, and add more than
5272 one instance of the same 'how'.
5273 
5274 If C<namlen> is greater than zero then a C<savepvn> I<copy> of C<name> is
5275 stored, if C<namlen> is zero then C<name> is stored as-is and - as another
5276 special case - if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
5277 to contain an C<SV*> and is stored as-is with its REFCNT incremented.
5278 
5279 (This is now used as a subroutine by C<sv_magic>.)
5280 
5281 =cut
5282 */
5283 MAGIC *
5284 Perl_sv_magicext(pTHX_ SV *const sv, SV *const obj, const int how,
5285                 const MGVTBL *const vtable, const char *const name, const I32 namlen)
5286 {
5287     dVAR;
5288     MAGIC* mg;
5289 
5290     PERL_ARGS_ASSERT_SV_MAGICEXT;
5291 
5292     SvUPGRADE(sv, SVt_PVMG);
5293     Newxz(mg, 1, MAGIC);
5294     mg->mg_moremagic = SvMAGIC(sv);
5295     SvMAGIC_set(sv, mg);
5296 
5297     /* Sometimes a magic contains a reference loop, where the sv and
5298        object refer to each other.  To prevent a reference loop that
5299        would prevent such objects being freed, we look for such loops
5300        and if we find one we avoid incrementing the object refcount.
5301 
5302        Note we cannot do this to avoid self-tie loops as intervening RV must
5303        have its REFCNT incremented to keep it in existence.
5304 
5305     */
5306     if (!obj || obj == sv ||
5307 	how == PERL_MAGIC_arylen ||
5308 	how == PERL_MAGIC_symtab ||
5309 	(SvTYPE(obj) == SVt_PVGV &&
5310 	    (GvSV(obj) == sv || GvHV(obj) == (const HV *)sv
5311 	     || GvAV(obj) == (const AV *)sv || GvCV(obj) == (const CV *)sv
5312 	     || GvIOp(obj) == (const IO *)sv || GvFORM(obj) == (const CV *)sv)))
5313     {
5314 	mg->mg_obj = obj;
5315     }
5316     else {
5317 	mg->mg_obj = SvREFCNT_inc_simple(obj);
5318 	mg->mg_flags |= MGf_REFCOUNTED;
5319     }
5320 
5321     /* Normal self-ties simply pass a null object, and instead of
5322        using mg_obj directly, use the SvTIED_obj macro to produce a
5323        new RV as needed.  For glob "self-ties", we are tieing the PVIO
5324        with an RV obj pointing to the glob containing the PVIO.  In
5325        this case, to avoid a reference loop, we need to weaken the
5326        reference.
5327     */
5328 
5329     if (how == PERL_MAGIC_tiedscalar && SvTYPE(sv) == SVt_PVIO &&
5330         obj && SvROK(obj) && GvIO(SvRV(obj)) == (const IO *)sv)
5331     {
5332       sv_rvweaken(obj);
5333     }
5334 
5335     mg->mg_type = how;
5336     mg->mg_len = namlen;
5337     if (name) {
5338 	if (namlen > 0)
5339 	    mg->mg_ptr = savepvn(name, namlen);
5340 	else if (namlen == HEf_SVKEY) {
5341 	    /* Yes, this is casting away const. This is only for the case of
5342 	       HEf_SVKEY. I think we need to document this aberation of the
5343 	       constness of the API, rather than making name non-const, as
5344 	       that change propagating outwards a long way.  */
5345 	    mg->mg_ptr = (char*)SvREFCNT_inc_simple_NN((SV *)name);
5346 	} else
5347 	    mg->mg_ptr = (char *) name;
5348     }
5349     mg->mg_virtual = (MGVTBL *) vtable;
5350 
5351     mg_magical(sv);
5352     return mg;
5353 }
5354 
5355 /*
5356 =for apidoc sv_magic
5357 
5358 Adds magic to an SV.  First upgrades C<sv> to type C<SVt_PVMG> if
5359 necessary, then adds a new magic item of type C<how> to the head of the
5360 magic list.
5361 
5362 See C<sv_magicext> (which C<sv_magic> now calls) for a description of the
5363 handling of the C<name> and C<namlen> arguments.
5364 
5365 You need to use C<sv_magicext> to add magic to SvREADONLY SVs and also
5366 to add more than one instance of the same 'how'.
5367 
5368 =cut
5369 */
5370 
5371 void
5372 Perl_sv_magic(pTHX_ SV *const sv, SV *const obj, const int how,
5373              const char *const name, const I32 namlen)
5374 {
5375     dVAR;
5376     const MGVTBL *vtable;
5377     MAGIC* mg;
5378     unsigned int flags;
5379     unsigned int vtable_index;
5380 
5381     PERL_ARGS_ASSERT_SV_MAGIC;
5382 
5383     if (how < 0 || (unsigned)how > C_ARRAY_LENGTH(PL_magic_data)
5384 	|| ((flags = PL_magic_data[how]),
5385 	    (vtable_index = flags & PERL_MAGIC_VTABLE_MASK)
5386 	    > magic_vtable_max))
5387 	Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
5388 
5389     /* PERL_MAGIC_ext is reserved for use by extensions not perl internals.
5390        Useful for attaching extension internal data to perl vars.
5391        Note that multiple extensions may clash if magical scalars
5392        etc holding private data from one are passed to another. */
5393 
5394     vtable = (vtable_index == magic_vtable_max)
5395 	? NULL : PL_magic_vtables + vtable_index;
5396 
5397 #ifdef PERL_ANY_COW
5398     if (SvIsCOW(sv))
5399         sv_force_normal_flags(sv, 0);
5400 #endif
5401     if (SvREADONLY(sv)) {
5402 	if (
5403 	    /* its okay to attach magic to shared strings */
5404 	    !SvIsCOW(sv)
5405 
5406 	    && IN_PERL_RUNTIME
5407 	    && !PERL_MAGIC_TYPE_READONLY_ACCEPTABLE(how)
5408 	   )
5409 	{
5410 	    Perl_croak_no_modify();
5411 	}
5412     }
5413     if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
5414 	if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
5415 	    /* sv_magic() refuses to add a magic of the same 'how' as an
5416 	       existing one
5417 	     */
5418 	    if (how == PERL_MAGIC_taint)
5419 		mg->mg_len |= 1;
5420 	    return;
5421 	}
5422     }
5423 
5424     /* Rest of work is done else where */
5425     mg = sv_magicext(sv,obj,how,vtable,name,namlen);
5426 
5427     switch (how) {
5428     case PERL_MAGIC_taint:
5429 	mg->mg_len = 1;
5430 	break;
5431     case PERL_MAGIC_ext:
5432     case PERL_MAGIC_dbfile:
5433 	SvRMAGICAL_on(sv);
5434 	break;
5435     }
5436 }
5437 
5438 static int
5439 S_sv_unmagicext_flags(pTHX_ SV *const sv, const int type, MGVTBL *vtbl, const U32 flags)
5440 {
5441     MAGIC* mg;
5442     MAGIC** mgp;
5443 
5444     assert(flags <= 1);
5445 
5446     if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
5447 	return 0;
5448     mgp = &(((XPVMG*) SvANY(sv))->xmg_u.xmg_magic);
5449     for (mg = *mgp; mg; mg = *mgp) {
5450 	const MGVTBL* const virt = mg->mg_virtual;
5451 	if (mg->mg_type == type && (!flags || virt == vtbl)) {
5452 	    *mgp = mg->mg_moremagic;
5453 	    if (virt && virt->svt_free)
5454 		virt->svt_free(aTHX_ sv, mg);
5455 	    if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
5456 		if (mg->mg_len > 0)
5457 		    Safefree(mg->mg_ptr);
5458 		else if (mg->mg_len == HEf_SVKEY)
5459 		    SvREFCNT_dec(MUTABLE_SV(mg->mg_ptr));
5460 		else if (mg->mg_type == PERL_MAGIC_utf8)
5461 		    Safefree(mg->mg_ptr);
5462             }
5463 	    if (mg->mg_flags & MGf_REFCOUNTED)
5464 		SvREFCNT_dec(mg->mg_obj);
5465 	    Safefree(mg);
5466 	}
5467 	else
5468 	    mgp = &mg->mg_moremagic;
5469     }
5470     if (SvMAGIC(sv)) {
5471 	if (SvMAGICAL(sv))	/* if we're under save_magic, wait for restore_magic; */
5472 	    mg_magical(sv);	/*    else fix the flags now */
5473     }
5474     else {
5475 	SvMAGICAL_off(sv);
5476 	SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
5477     }
5478     return 0;
5479 }
5480 
5481 /*
5482 =for apidoc sv_unmagic
5483 
5484 Removes all magic of type C<type> from an SV.
5485 
5486 =cut
5487 */
5488 
5489 int
5490 Perl_sv_unmagic(pTHX_ SV *const sv, const int type)
5491 {
5492     PERL_ARGS_ASSERT_SV_UNMAGIC;
5493     return S_sv_unmagicext_flags(aTHX_ sv, type, NULL, 0);
5494 }
5495 
5496 /*
5497 =for apidoc sv_unmagicext
5498 
5499 Removes all magic of type C<type> with the specified C<vtbl> from an SV.
5500 
5501 =cut
5502 */
5503 
5504 int
5505 Perl_sv_unmagicext(pTHX_ SV *const sv, const int type, MGVTBL *vtbl)
5506 {
5507     PERL_ARGS_ASSERT_SV_UNMAGICEXT;
5508     return S_sv_unmagicext_flags(aTHX_ sv, type, vtbl, 1);
5509 }
5510 
5511 /*
5512 =for apidoc sv_rvweaken
5513 
5514 Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
5515 referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
5516 push a back-reference to this RV onto the array of backreferences
5517 associated with that magic.  If the RV is magical, set magic will be
5518 called after the RV is cleared.
5519 
5520 =cut
5521 */
5522 
5523 SV *
5524 Perl_sv_rvweaken(pTHX_ SV *const sv)
5525 {
5526     SV *tsv;
5527 
5528     PERL_ARGS_ASSERT_SV_RVWEAKEN;
5529 
5530     if (!SvOK(sv))  /* let undefs pass */
5531 	return sv;
5532     if (!SvROK(sv))
5533 	Perl_croak(aTHX_ "Can't weaken a nonreference");
5534     else if (SvWEAKREF(sv)) {
5535 	Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
5536 	return sv;
5537     }
5538     else if (SvREADONLY(sv)) croak_no_modify();
5539     tsv = SvRV(sv);
5540     Perl_sv_add_backref(aTHX_ tsv, sv);
5541     SvWEAKREF_on(sv);
5542     SvREFCNT_dec_NN(tsv);
5543     return sv;
5544 }
5545 
5546 /* Give tsv backref magic if it hasn't already got it, then push a
5547  * back-reference to sv onto the array associated with the backref magic.
5548  *
5549  * As an optimisation, if there's only one backref and it's not an AV,
5550  * store it directly in the HvAUX or mg_obj slot, avoiding the need to
5551  * allocate an AV. (Whether the slot holds an AV tells us whether this is
5552  * active.)
5553  */
5554 
5555 /* A discussion about the backreferences array and its refcount:
5556  *
5557  * The AV holding the backreferences is pointed to either as the mg_obj of
5558  * PERL_MAGIC_backref, or in the specific case of a HV, from the
5559  * xhv_backreferences field. The array is created with a refcount
5560  * of 2. This means that if during global destruction the array gets
5561  * picked on before its parent to have its refcount decremented by the
5562  * random zapper, it won't actually be freed, meaning it's still there for
5563  * when its parent gets freed.
5564  *
5565  * When the parent SV is freed, the extra ref is killed by
5566  * Perl_sv_kill_backrefs.  The other ref is killed, in the case of magic,
5567  * by mg_free() / MGf_REFCOUNTED, or for a hash, by Perl_hv_kill_backrefs.
5568  *
5569  * When a single backref SV is stored directly, it is not reference
5570  * counted.
5571  */
5572 
5573 void
5574 Perl_sv_add_backref(pTHX_ SV *const tsv, SV *const sv)
5575 {
5576     dVAR;
5577     SV **svp;
5578     AV *av = NULL;
5579     MAGIC *mg = NULL;
5580 
5581     PERL_ARGS_ASSERT_SV_ADD_BACKREF;
5582 
5583     /* find slot to store array or singleton backref */
5584 
5585     if (SvTYPE(tsv) == SVt_PVHV) {
5586 	svp = (SV**)Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(tsv));
5587     } else {
5588 	if (! ((mg =
5589 	    (SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL))))
5590 	{
5591 	    sv_magic(tsv, NULL, PERL_MAGIC_backref, NULL, 0);
5592 	    mg = mg_find(tsv, PERL_MAGIC_backref);
5593 	}
5594 	svp = &(mg->mg_obj);
5595     }
5596 
5597     /* create or retrieve the array */
5598 
5599     if (   (!*svp && SvTYPE(sv) == SVt_PVAV)
5600 	|| (*svp && SvTYPE(*svp) != SVt_PVAV)
5601     ) {
5602 	/* create array */
5603 	av = newAV();
5604 	AvREAL_off(av);
5605 	SvREFCNT_inc_simple_void(av);
5606 	/* av now has a refcnt of 2; see discussion above */
5607 	if (*svp) {
5608 	    /* move single existing backref to the array */
5609 	    av_extend(av, 1);
5610 	    AvARRAY(av)[++AvFILLp(av)] = *svp; /* av_push() */
5611 	}
5612 	*svp = (SV*)av;
5613 	if (mg)
5614 	    mg->mg_flags |= MGf_REFCOUNTED;
5615     }
5616     else
5617 	av = MUTABLE_AV(*svp);
5618 
5619     if (!av) {
5620 	/* optimisation: store single backref directly in HvAUX or mg_obj */
5621 	*svp = sv;
5622 	return;
5623     }
5624     /* push new backref */
5625     assert(SvTYPE(av) == SVt_PVAV);
5626     if (AvFILLp(av) >= AvMAX(av)) {
5627         av_extend(av, AvFILLp(av)+1);
5628     }
5629     AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */
5630 }
5631 
5632 /* delete a back-reference to ourselves from the backref magic associated
5633  * with the SV we point to.
5634  */
5635 
5636 void
5637 Perl_sv_del_backref(pTHX_ SV *const tsv, SV *const sv)
5638 {
5639     dVAR;
5640     SV **svp = NULL;
5641 
5642     PERL_ARGS_ASSERT_SV_DEL_BACKREF;
5643 
5644     if (SvTYPE(tsv) == SVt_PVHV) {
5645 	if (SvOOK(tsv))
5646 	    svp = (SV**)Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(tsv));
5647     }
5648     else if (SvIS_FREED(tsv) && PL_phase == PERL_PHASE_DESTRUCT) {
5649 	/* It's possible for the the last (strong) reference to tsv to have
5650 	   become freed *before* the last thing holding a weak reference.
5651 	   If both survive longer than the backreferences array, then when
5652 	   the referent's reference count drops to 0 and it is freed, it's
5653 	   not able to chase the backreferences, so they aren't NULLed.
5654 
5655 	   For example, a CV holds a weak reference to its stash. If both the
5656 	   CV and the stash survive longer than the backreferences array,
5657 	   and the CV gets picked for the SvBREAK() treatment first,
5658 	   *and* it turns out that the stash is only being kept alive because
5659 	   of an our variable in the pad of the CV, then midway during CV
5660 	   destruction the stash gets freed, but CvSTASH() isn't set to NULL.
5661 	   It ends up pointing to the freed HV. Hence it's chased in here, and
5662 	   if this block wasn't here, it would hit the !svp panic just below.
5663 
5664 	   I don't believe that "better" destruction ordering is going to help
5665 	   here - during global destruction there's always going to be the
5666 	   chance that something goes out of order. We've tried to make it
5667 	   foolproof before, and it only resulted in evolutionary pressure on
5668 	   fools. Which made us look foolish for our hubris. :-(
5669 	*/
5670 	return;
5671     }
5672     else {
5673 	MAGIC *const mg
5674 	    = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
5675 	svp =  mg ? &(mg->mg_obj) : NULL;
5676     }
5677 
5678     if (!svp)
5679 	Perl_croak(aTHX_ "panic: del_backref, svp=0");
5680     if (!*svp) {
5681 	/* It's possible that sv is being freed recursively part way through the
5682 	   freeing of tsv. If this happens, the backreferences array of tsv has
5683 	   already been freed, and so svp will be NULL. If this is the case,
5684 	   we should not panic. Instead, nothing needs doing, so return.  */
5685 	if (PL_phase == PERL_PHASE_DESTRUCT && SvREFCNT(tsv) == 0)
5686 	    return;
5687 	Perl_croak(aTHX_ "panic: del_backref, *svp=%p phase=%s refcnt=%" UVuf,
5688 		   *svp, PL_phase_names[PL_phase], (UV)SvREFCNT(tsv));
5689     }
5690 
5691     if (SvTYPE(*svp) == SVt_PVAV) {
5692 #ifdef DEBUGGING
5693 	int count = 1;
5694 #endif
5695 	AV * const av = (AV*)*svp;
5696 	SSize_t fill;
5697 	assert(!SvIS_FREED(av));
5698 	fill = AvFILLp(av);
5699 	assert(fill > -1);
5700 	svp = AvARRAY(av);
5701 	/* for an SV with N weak references to it, if all those
5702 	 * weak refs are deleted, then sv_del_backref will be called
5703 	 * N times and O(N^2) compares will be done within the backref
5704 	 * array. To ameliorate this potential slowness, we:
5705 	 * 1) make sure this code is as tight as possible;
5706 	 * 2) when looking for SV, look for it at both the head and tail of the
5707 	 *    array first before searching the rest, since some create/destroy
5708 	 *    patterns will cause the backrefs to be freed in order.
5709 	 */
5710 	if (*svp == sv) {
5711 	    AvARRAY(av)++;
5712 	    AvMAX(av)--;
5713 	}
5714 	else {
5715 	    SV **p = &svp[fill];
5716 	    SV *const topsv = *p;
5717 	    if (topsv != sv) {
5718 #ifdef DEBUGGING
5719 		count = 0;
5720 #endif
5721 		while (--p > svp) {
5722 		    if (*p == sv) {
5723 			/* We weren't the last entry.
5724 			   An unordered list has this property that you
5725 			   can take the last element off the end to fill
5726 			   the hole, and it's still an unordered list :-)
5727 			*/
5728 			*p = topsv;
5729 #ifdef DEBUGGING
5730 			count++;
5731 #else
5732 			break; /* should only be one */
5733 #endif
5734 		    }
5735 		}
5736 	    }
5737 	}
5738 	assert(count ==1);
5739 	AvFILLp(av) = fill-1;
5740     }
5741     else if (SvIS_FREED(*svp) && PL_phase == PERL_PHASE_DESTRUCT) {
5742 	/* freed AV; skip */
5743     }
5744     else {
5745 	/* optimisation: only a single backref, stored directly */
5746 	if (*svp != sv)
5747 	    Perl_croak(aTHX_ "panic: del_backref, *svp=%p, sv=%p", *svp, sv);
5748 	*svp = NULL;
5749     }
5750 
5751 }
5752 
5753 void
5754 Perl_sv_kill_backrefs(pTHX_ SV *const sv, AV *const av)
5755 {
5756     SV **svp;
5757     SV **last;
5758     bool is_array;
5759 
5760     PERL_ARGS_ASSERT_SV_KILL_BACKREFS;
5761 
5762     if (!av)
5763 	return;
5764 
5765     /* after multiple passes through Perl_sv_clean_all() for a thingy
5766      * that has badly leaked, the backref array may have gotten freed,
5767      * since we only protect it against 1 round of cleanup */
5768     if (SvIS_FREED(av)) {
5769 	if (PL_in_clean_all) /* All is fair */
5770 	    return;
5771 	Perl_croak(aTHX_
5772 		   "panic: magic_killbackrefs (freed backref AV/SV)");
5773     }
5774 
5775 
5776     is_array = (SvTYPE(av) == SVt_PVAV);
5777     if (is_array) {
5778 	assert(!SvIS_FREED(av));
5779 	svp = AvARRAY(av);
5780 	if (svp)
5781 	    last = svp + AvFILLp(av);
5782     }
5783     else {
5784 	/* optimisation: only a single backref, stored directly */
5785 	svp = (SV**)&av;
5786 	last = svp;
5787     }
5788 
5789     if (svp) {
5790 	while (svp <= last) {
5791 	    if (*svp) {
5792 		SV *const referrer = *svp;
5793 		if (SvWEAKREF(referrer)) {
5794 		    /* XXX Should we check that it hasn't changed? */
5795 		    assert(SvROK(referrer));
5796 		    SvRV_set(referrer, 0);
5797 		    SvOK_off(referrer);
5798 		    SvWEAKREF_off(referrer);
5799 		    SvSETMAGIC(referrer);
5800 		} else if (SvTYPE(referrer) == SVt_PVGV ||
5801 			   SvTYPE(referrer) == SVt_PVLV) {
5802 		    assert(SvTYPE(sv) == SVt_PVHV); /* stash backref */
5803 		    /* You lookin' at me?  */
5804 		    assert(GvSTASH(referrer));
5805 		    assert(GvSTASH(referrer) == (const HV *)sv);
5806 		    GvSTASH(referrer) = 0;
5807 		} else if (SvTYPE(referrer) == SVt_PVCV ||
5808 			   SvTYPE(referrer) == SVt_PVFM) {
5809 		    if (SvTYPE(sv) == SVt_PVHV) { /* stash backref */
5810 			/* You lookin' at me?  */
5811 			assert(CvSTASH(referrer));
5812 			assert(CvSTASH(referrer) == (const HV *)sv);
5813 			SvANY(MUTABLE_CV(referrer))->xcv_stash = 0;
5814 		    }
5815 		    else {
5816 			assert(SvTYPE(sv) == SVt_PVGV);
5817 			/* You lookin' at me?  */
5818 			assert(CvGV(referrer));
5819 			assert(CvGV(referrer) == (const GV *)sv);
5820 			anonymise_cv_maybe(MUTABLE_GV(sv),
5821 						MUTABLE_CV(referrer));
5822 		    }
5823 
5824 		} else {
5825 		    Perl_croak(aTHX_
5826 			       "panic: magic_killbackrefs (flags=%"UVxf")",
5827 			       (UV)SvFLAGS(referrer));
5828 		}
5829 
5830 		if (is_array)
5831 		    *svp = NULL;
5832 	    }
5833 	    svp++;
5834 	}
5835     }
5836     if (is_array) {
5837 	AvFILLp(av) = -1;
5838 	SvREFCNT_dec_NN(av); /* remove extra count added by sv_add_backref() */
5839     }
5840     return;
5841 }
5842 
5843 /*
5844 =for apidoc sv_insert
5845 
5846 Inserts a string at the specified offset/length within the SV.  Similar to
5847 the Perl substr() function.  Handles get magic.
5848 
5849 =for apidoc sv_insert_flags
5850 
5851 Same as C<sv_insert>, but the extra C<flags> are passed to the
5852 C<SvPV_force_flags> that applies to C<bigstr>.
5853 
5854 =cut
5855 */
5856 
5857 void
5858 Perl_sv_insert_flags(pTHX_ SV *const bigstr, const STRLEN offset, const STRLEN len, const char *const little, const STRLEN littlelen, const U32 flags)
5859 {
5860     dVAR;
5861     char *big;
5862     char *mid;
5863     char *midend;
5864     char *bigend;
5865     SSize_t i;		/* better be sizeof(STRLEN) or bad things happen */
5866     STRLEN curlen;
5867 
5868     PERL_ARGS_ASSERT_SV_INSERT_FLAGS;
5869 
5870     if (!bigstr)
5871 	Perl_croak(aTHX_ "Can't modify nonexistent substring");
5872     SvPV_force_flags(bigstr, curlen, flags);
5873     (void)SvPOK_only_UTF8(bigstr);
5874     if (offset + len > curlen) {
5875 	SvGROW(bigstr, offset+len+1);
5876 	Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
5877 	SvCUR_set(bigstr, offset+len);
5878     }
5879 
5880     SvTAINT(bigstr);
5881     i = littlelen - len;
5882     if (i > 0) {			/* string might grow */
5883 	big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
5884 	mid = big + offset + len;
5885 	midend = bigend = big + SvCUR(bigstr);
5886 	bigend += i;
5887 	*bigend = '\0';
5888 	while (midend > mid)		/* shove everything down */
5889 	    *--bigend = *--midend;
5890 	Move(little,big+offset,littlelen,char);
5891 	SvCUR_set(bigstr, SvCUR(bigstr) + i);
5892 	SvSETMAGIC(bigstr);
5893 	return;
5894     }
5895     else if (i == 0) {
5896 	Move(little,SvPVX(bigstr)+offset,len,char);
5897 	SvSETMAGIC(bigstr);
5898 	return;
5899     }
5900 
5901     big = SvPVX(bigstr);
5902     mid = big + offset;
5903     midend = mid + len;
5904     bigend = big + SvCUR(bigstr);
5905 
5906     if (midend > bigend)
5907 	Perl_croak(aTHX_ "panic: sv_insert, midend=%p, bigend=%p",
5908 		   midend, bigend);
5909 
5910     if (mid - big > bigend - midend) {	/* faster to shorten from end */
5911 	if (littlelen) {
5912 	    Move(little, mid, littlelen,char);
5913 	    mid += littlelen;
5914 	}
5915 	i = bigend - midend;
5916 	if (i > 0) {
5917 	    Move(midend, mid, i,char);
5918 	    mid += i;
5919 	}
5920 	*mid = '\0';
5921 	SvCUR_set(bigstr, mid - big);
5922     }
5923     else if ((i = mid - big)) {	/* faster from front */
5924 	midend -= littlelen;
5925 	mid = midend;
5926 	Move(big, midend - i, i, char);
5927 	sv_chop(bigstr,midend-i);
5928 	if (littlelen)
5929 	    Move(little, mid, littlelen,char);
5930     }
5931     else if (littlelen) {
5932 	midend -= littlelen;
5933 	sv_chop(bigstr,midend);
5934 	Move(little,midend,littlelen,char);
5935     }
5936     else {
5937 	sv_chop(bigstr,midend);
5938     }
5939     SvSETMAGIC(bigstr);
5940 }
5941 
5942 /*
5943 =for apidoc sv_replace
5944 
5945 Make the first argument a copy of the second, then delete the original.
5946 The target SV physically takes over ownership of the body of the source SV
5947 and inherits its flags; however, the target keeps any magic it owns,
5948 and any magic in the source is discarded.
5949 Note that this is a rather specialist SV copying operation; most of the
5950 time you'll want to use C<sv_setsv> or one of its many macro front-ends.
5951 
5952 =cut
5953 */
5954 
5955 void
5956 Perl_sv_replace(pTHX_ SV *const sv, SV *const nsv)
5957 {
5958     dVAR;
5959     const U32 refcnt = SvREFCNT(sv);
5960 
5961     PERL_ARGS_ASSERT_SV_REPLACE;
5962 
5963     SV_CHECK_THINKFIRST_COW_DROP(sv);
5964     if (SvREFCNT(nsv) != 1) {
5965 	Perl_croak(aTHX_ "panic: reference miscount on nsv in sv_replace()"
5966 		   " (%" UVuf " != 1)", (UV) SvREFCNT(nsv));
5967     }
5968     if (SvMAGICAL(sv)) {
5969 	if (SvMAGICAL(nsv))
5970 	    mg_free(nsv);
5971 	else
5972 	    sv_upgrade(nsv, SVt_PVMG);
5973 	SvMAGIC_set(nsv, SvMAGIC(sv));
5974 	SvFLAGS(nsv) |= SvMAGICAL(sv);
5975 	SvMAGICAL_off(sv);
5976 	SvMAGIC_set(sv, NULL);
5977     }
5978     SvREFCNT(sv) = 0;
5979     sv_clear(sv);
5980     assert(!SvREFCNT(sv));
5981 #ifdef DEBUG_LEAKING_SCALARS
5982     sv->sv_flags  = nsv->sv_flags;
5983     sv->sv_any    = nsv->sv_any;
5984     sv->sv_refcnt = nsv->sv_refcnt;
5985     sv->sv_u      = nsv->sv_u;
5986 #else
5987     StructCopy(nsv,sv,SV);
5988 #endif
5989     if(SvTYPE(sv) == SVt_IV) {
5990 	SvANY(sv)
5991 	    = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
5992     }
5993 
5994 
5995 #ifdef PERL_OLD_COPY_ON_WRITE
5996     if (SvIsCOW_normal(nsv)) {
5997 	/* We need to follow the pointers around the loop to make the
5998 	   previous SV point to sv, rather than nsv.  */
5999 	SV *next;
6000 	SV *current = nsv;
6001 	while ((next = SV_COW_NEXT_SV(current)) != nsv) {
6002 	    assert(next);
6003 	    current = next;
6004 	    assert(SvPVX_const(current) == SvPVX_const(nsv));
6005 	}
6006 	/* Make the SV before us point to the SV after us.  */
6007 	if (DEBUG_C_TEST) {
6008 	    PerlIO_printf(Perl_debug_log, "previous is\n");
6009 	    sv_dump(current);
6010 	    PerlIO_printf(Perl_debug_log,
6011                           "move it from 0x%"UVxf" to 0x%"UVxf"\n",
6012 			  (UV) SV_COW_NEXT_SV(current), (UV) sv);
6013 	}
6014 	SV_COW_NEXT_SV_SET(current, sv);
6015     }
6016 #endif
6017     SvREFCNT(sv) = refcnt;
6018     SvFLAGS(nsv) |= SVTYPEMASK;		/* Mark as freed */
6019     SvREFCNT(nsv) = 0;
6020     del_SV(nsv);
6021 }
6022 
6023 /* We're about to free a GV which has a CV that refers back to us.
6024  * If that CV will outlive us, make it anonymous (i.e. fix up its CvGV
6025  * field) */
6026 
6027 STATIC void
6028 S_anonymise_cv_maybe(pTHX_ GV *gv, CV* cv)
6029 {
6030     SV *gvname;
6031     GV *anongv;
6032 
6033     PERL_ARGS_ASSERT_ANONYMISE_CV_MAYBE;
6034 
6035     /* be assertive! */
6036     assert(SvREFCNT(gv) == 0);
6037     assert(isGV(gv) && isGV_with_GP(gv));
6038     assert(GvGP(gv));
6039     assert(!CvANON(cv));
6040     assert(CvGV(cv) == gv);
6041     assert(!CvNAMED(cv));
6042 
6043     /* will the CV shortly be freed by gp_free() ? */
6044     if (GvCV(gv) == cv && GvGP(gv)->gp_refcnt < 2 && SvREFCNT(cv) < 2) {
6045 	SvANY(cv)->xcv_gv_u.xcv_gv = NULL;
6046 	return;
6047     }
6048 
6049     /* if not, anonymise: */
6050     gvname = (GvSTASH(gv) && HvNAME(GvSTASH(gv)) && HvENAME(GvSTASH(gv)))
6051                     ? newSVhek(HvENAME_HEK(GvSTASH(gv)))
6052                     : newSVpvn_flags( "__ANON__", 8, 0 );
6053     sv_catpvs(gvname, "::__ANON__");
6054     anongv = gv_fetchsv(gvname, GV_ADDMULTI, SVt_PVCV);
6055     SvREFCNT_dec_NN(gvname);
6056 
6057     CvANON_on(cv);
6058     CvCVGV_RC_on(cv);
6059     SvANY(cv)->xcv_gv_u.xcv_gv = MUTABLE_GV(SvREFCNT_inc(anongv));
6060 }
6061 
6062 
6063 /*
6064 =for apidoc sv_clear
6065 
6066 Clear an SV: call any destructors, free up any memory used by the body,
6067 and free the body itself.  The SV's head is I<not> freed, although
6068 its type is set to all 1's so that it won't inadvertently be assumed
6069 to be live during global destruction etc.
6070 This function should only be called when REFCNT is zero.  Most of the time
6071 you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
6072 instead.
6073 
6074 =cut
6075 */
6076 
6077 void
6078 Perl_sv_clear(pTHX_ SV *const orig_sv)
6079 {
6080     dVAR;
6081     HV *stash;
6082     U32 type;
6083     const struct body_details *sv_type_details;
6084     SV* iter_sv = NULL;
6085     SV* next_sv = NULL;
6086     SV *sv = orig_sv;
6087     STRLEN hash_index;
6088 
6089     PERL_ARGS_ASSERT_SV_CLEAR;
6090 
6091     /* within this loop, sv is the SV currently being freed, and
6092      * iter_sv is the most recent AV or whatever that's being iterated
6093      * over to provide more SVs */
6094 
6095     while (sv) {
6096 
6097 	type = SvTYPE(sv);
6098 
6099 	assert(SvREFCNT(sv) == 0);
6100 	assert(SvTYPE(sv) != (svtype)SVTYPEMASK);
6101 
6102 	if (type <= SVt_IV) {
6103 	    /* See the comment in sv.h about the collusion between this
6104 	     * early return and the overloading of the NULL slots in the
6105 	     * size table.  */
6106 	    if (SvROK(sv))
6107 		goto free_rv;
6108 	    SvFLAGS(sv) &= SVf_BREAK;
6109 	    SvFLAGS(sv) |= SVTYPEMASK;
6110 	    goto free_head;
6111 	}
6112 
6113 	assert(!SvOBJECT(sv) || type >= SVt_PVMG); /* objs are always >= MG */
6114 
6115 	if (type >= SVt_PVMG) {
6116 	    if (SvOBJECT(sv)) {
6117 		if (!curse(sv, 1)) goto get_next_sv;
6118 		type = SvTYPE(sv); /* destructor may have changed it */
6119 	    }
6120 	    /* Free back-references before magic, in case the magic calls
6121 	     * Perl code that has weak references to sv. */
6122 	    if (type == SVt_PVHV) {
6123 		Perl_hv_kill_backrefs(aTHX_ MUTABLE_HV(sv));
6124 		if (SvMAGIC(sv))
6125 		    mg_free(sv);
6126 	    }
6127 	    else if (type == SVt_PVMG && SvPAD_OUR(sv)) {
6128 		SvREFCNT_dec(SvOURSTASH(sv));
6129 	    } else if (SvMAGIC(sv)) {
6130 		/* Free back-references before other types of magic. */
6131 		sv_unmagic(sv, PERL_MAGIC_backref);
6132 		mg_free(sv);
6133 	    }
6134 	    SvMAGICAL_off(sv);
6135 	    if (type == SVt_PVMG && SvPAD_TYPED(sv))
6136 		SvREFCNT_dec(SvSTASH(sv));
6137 	}
6138 	switch (type) {
6139 	    /* case SVt_BIND: */
6140 	case SVt_PVIO:
6141 	    if (IoIFP(sv) &&
6142 		IoIFP(sv) != PerlIO_stdin() &&
6143 		IoIFP(sv) != PerlIO_stdout() &&
6144 		IoIFP(sv) != PerlIO_stderr() &&
6145 		!(IoFLAGS(sv) & IOf_FAKE_DIRP))
6146 	    {
6147 		io_close(MUTABLE_IO(sv), FALSE);
6148 	    }
6149 	    if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
6150 		PerlDir_close(IoDIRP(sv));
6151 	    IoDIRP(sv) = (DIR*)NULL;
6152 	    Safefree(IoTOP_NAME(sv));
6153 	    Safefree(IoFMT_NAME(sv));
6154 	    Safefree(IoBOTTOM_NAME(sv));
6155 	    if ((const GV *)sv == PL_statgv)
6156 		PL_statgv = NULL;
6157 	    goto freescalar;
6158 	case SVt_REGEXP:
6159 	    /* FIXME for plugins */
6160 	  freeregexp:
6161 	    pregfree2((REGEXP*) sv);
6162 	    goto freescalar;
6163 	case SVt_PVCV:
6164 	case SVt_PVFM:
6165 	    cv_undef(MUTABLE_CV(sv));
6166 	    /* If we're in a stash, we don't own a reference to it.
6167 	     * However it does have a back reference to us, which needs to
6168 	     * be cleared.  */
6169 	    if ((stash = CvSTASH(sv)))
6170 		sv_del_backref(MUTABLE_SV(stash), sv);
6171 	    goto freescalar;
6172 	case SVt_PVHV:
6173 	    if (PL_last_swash_hv == (const HV *)sv) {
6174 		PL_last_swash_hv = NULL;
6175 	    }
6176 	    if (HvTOTALKEYS((HV*)sv) > 0) {
6177 		const char *name;
6178 		/* this statement should match the one at the beginning of
6179 		 * hv_undef_flags() */
6180 		if (   PL_phase != PERL_PHASE_DESTRUCT
6181 		    && (name = HvNAME((HV*)sv)))
6182 		{
6183 		    if (PL_stashcache) {
6184                     DEBUG_o(Perl_deb(aTHX_ "sv_clear clearing PL_stashcache for '%"SVf"'\n",
6185                                      sv));
6186 			(void)hv_delete(PL_stashcache, name,
6187 			    HvNAMEUTF8((HV*)sv) ? -HvNAMELEN_get((HV*)sv) : HvNAMELEN_get((HV*)sv), G_DISCARD);
6188                     }
6189 		    hv_name_set((HV*)sv, NULL, 0, 0);
6190 		}
6191 
6192 		/* save old iter_sv in unused SvSTASH field */
6193 		assert(!SvOBJECT(sv));
6194 		SvSTASH(sv) = (HV*)iter_sv;
6195 		iter_sv = sv;
6196 
6197 		/* save old hash_index in unused SvMAGIC field */
6198 		assert(!SvMAGICAL(sv));
6199 		assert(!SvMAGIC(sv));
6200 		((XPVMG*) SvANY(sv))->xmg_u.xmg_hash_index = hash_index;
6201 		hash_index = 0;
6202 
6203 		next_sv = Perl_hfree_next_entry(aTHX_ (HV*)sv, &hash_index);
6204 		goto get_next_sv; /* process this new sv */
6205 	    }
6206 	    /* free empty hash */
6207 	    Perl_hv_undef_flags(aTHX_ MUTABLE_HV(sv), HV_NAME_SETALL);
6208 	    assert(!HvARRAY((HV*)sv));
6209 	    break;
6210 	case SVt_PVAV:
6211 	    {
6212 		AV* av = MUTABLE_AV(sv);
6213 		if (PL_comppad == av) {
6214 		    PL_comppad = NULL;
6215 		    PL_curpad = NULL;
6216 		}
6217 		if (AvREAL(av) && AvFILLp(av) > -1) {
6218 		    next_sv = AvARRAY(av)[AvFILLp(av)--];
6219 		    /* save old iter_sv in top-most slot of AV,
6220 		     * and pray that it doesn't get wiped in the meantime */
6221 		    AvARRAY(av)[AvMAX(av)] = iter_sv;
6222 		    iter_sv = sv;
6223 		    goto get_next_sv; /* process this new sv */
6224 		}
6225 		Safefree(AvALLOC(av));
6226 	    }
6227 
6228 	    break;
6229 	case SVt_PVLV:
6230 	    if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
6231 		SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv)));
6232 		HeNEXT((HE*)LvTARG(sv)) = PL_hv_fetch_ent_mh;
6233 		PL_hv_fetch_ent_mh = (HE*)LvTARG(sv);
6234 	    }
6235 	    else if (LvTYPE(sv) != 't') /* unless tie: unrefcnted fake SV**  */
6236 		SvREFCNT_dec(LvTARG(sv));
6237 	    if (isREGEXP(sv)) goto freeregexp;
6238 	case SVt_PVGV:
6239 	    if (isGV_with_GP(sv)) {
6240 		if(GvCVu((const GV *)sv) && (stash = GvSTASH(MUTABLE_GV(sv)))
6241 		   && HvENAME_get(stash))
6242 		    mro_method_changed_in(stash);
6243 		gp_free(MUTABLE_GV(sv));
6244 		if (GvNAME_HEK(sv))
6245 		    unshare_hek(GvNAME_HEK(sv));
6246 		/* If we're in a stash, we don't own a reference to it.
6247 		 * However it does have a back reference to us, which
6248 		 * needs to be cleared.  */
6249 		if (!SvVALID(sv) && (stash = GvSTASH(sv)))
6250 			sv_del_backref(MUTABLE_SV(stash), sv);
6251 	    }
6252 	    /* FIXME. There are probably more unreferenced pointers to SVs
6253 	     * in the interpreter struct that we should check and tidy in
6254 	     * a similar fashion to this:  */
6255 	    /* See also S_sv_unglob, which does the same thing. */
6256 	    if ((const GV *)sv == PL_last_in_gv)
6257 		PL_last_in_gv = NULL;
6258 	    else if ((const GV *)sv == PL_statgv)
6259 		PL_statgv = NULL;
6260             else if ((const GV *)sv == PL_stderrgv)
6261                 PL_stderrgv = NULL;
6262 	case SVt_PVMG:
6263 	case SVt_PVNV:
6264 	case SVt_PVIV:
6265 	case SVt_PV:
6266 	  freescalar:
6267 	    /* Don't bother with SvOOK_off(sv); as we're only going to
6268 	     * free it.  */
6269 	    if (SvOOK(sv)) {
6270 		STRLEN offset;
6271 		SvOOK_offset(sv, offset);
6272 		SvPV_set(sv, SvPVX_mutable(sv) - offset);
6273 		/* Don't even bother with turning off the OOK flag.  */
6274 	    }
6275 	    if (SvROK(sv)) {
6276 	    free_rv:
6277 		{
6278 		    SV * const target = SvRV(sv);
6279 		    if (SvWEAKREF(sv))
6280 			sv_del_backref(target, sv);
6281 		    else
6282 			next_sv = target;
6283 		}
6284 	    }
6285 #ifdef PERL_ANY_COW
6286 	    else if (SvPVX_const(sv)
6287 		     && !(SvTYPE(sv) == SVt_PVIO
6288 		     && !(IoFLAGS(sv) & IOf_FAKE_DIRP)))
6289 	    {
6290 		if (SvIsCOW(sv)) {
6291 		    if (DEBUG_C_TEST) {
6292 			PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
6293 			sv_dump(sv);
6294 		    }
6295 		    if (SvLEN(sv)) {
6296 # ifdef PERL_OLD_COPY_ON_WRITE
6297 			sv_release_COW(sv, SvPVX_const(sv), SV_COW_NEXT_SV(sv));
6298 # else
6299 			if (CowREFCNT(sv)) {
6300 			    CowREFCNT(sv)--;
6301 			    SvLEN_set(sv, 0);
6302 			}
6303 # endif
6304 		    } else {
6305 			unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
6306 		    }
6307 
6308 		}
6309 # ifdef PERL_OLD_COPY_ON_WRITE
6310 		else
6311 # endif
6312 		if (SvLEN(sv)) {
6313 		    Safefree(SvPVX_mutable(sv));
6314 		}
6315 	    }
6316 #else
6317 	    else if (SvPVX_const(sv) && SvLEN(sv)
6318 		     && !(SvTYPE(sv) == SVt_PVIO
6319 		     && !(IoFLAGS(sv) & IOf_FAKE_DIRP)))
6320 		Safefree(SvPVX_mutable(sv));
6321 	    else if (SvPVX_const(sv) && SvIsCOW(sv)) {
6322 		unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
6323 	    }
6324 #endif
6325 	    break;
6326 	case SVt_NV:
6327 	    break;
6328 	}
6329 
6330       free_body:
6331 
6332 	SvFLAGS(sv) &= SVf_BREAK;
6333 	SvFLAGS(sv) |= SVTYPEMASK;
6334 
6335 	sv_type_details = bodies_by_type + type;
6336 	if (sv_type_details->arena) {
6337 	    del_body(((char *)SvANY(sv) + sv_type_details->offset),
6338 		     &PL_body_roots[type]);
6339 	}
6340 	else if (sv_type_details->body_size) {
6341 	    safefree(SvANY(sv));
6342 	}
6343 
6344       free_head:
6345 	/* caller is responsible for freeing the head of the original sv */
6346 	if (sv != orig_sv && !SvREFCNT(sv))
6347 	    del_SV(sv);
6348 
6349 	/* grab and free next sv, if any */
6350       get_next_sv:
6351 	while (1) {
6352 	    sv = NULL;
6353 	    if (next_sv) {
6354 		sv = next_sv;
6355 		next_sv = NULL;
6356 	    }
6357 	    else if (!iter_sv) {
6358 		break;
6359 	    } else if (SvTYPE(iter_sv) == SVt_PVAV) {
6360 		AV *const av = (AV*)iter_sv;
6361 		if (AvFILLp(av) > -1) {
6362 		    sv = AvARRAY(av)[AvFILLp(av)--];
6363 		}
6364 		else { /* no more elements of current AV to free */
6365 		    sv = iter_sv;
6366 		    type = SvTYPE(sv);
6367 		    /* restore previous value, squirrelled away */
6368 		    iter_sv = AvARRAY(av)[AvMAX(av)];
6369 		    Safefree(AvALLOC(av));
6370 		    goto free_body;
6371 		}
6372 	    } else if (SvTYPE(iter_sv) == SVt_PVHV) {
6373 		sv = Perl_hfree_next_entry(aTHX_ (HV*)iter_sv, &hash_index);
6374 		if (!sv && !HvTOTALKEYS((HV *)iter_sv)) {
6375 		    /* no more elements of current HV to free */
6376 		    sv = iter_sv;
6377 		    type = SvTYPE(sv);
6378 		    /* Restore previous values of iter_sv and hash_index,
6379 		     * squirrelled away */
6380 		    assert(!SvOBJECT(sv));
6381 		    iter_sv = (SV*)SvSTASH(sv);
6382 		    assert(!SvMAGICAL(sv));
6383 		    hash_index = ((XPVMG*) SvANY(sv))->xmg_u.xmg_hash_index;
6384 #ifdef DEBUGGING
6385 		    /* perl -DA does not like rubbish in SvMAGIC. */
6386 		    SvMAGIC_set(sv, 0);
6387 #endif
6388 
6389 		    /* free any remaining detritus from the hash struct */
6390 		    Perl_hv_undef_flags(aTHX_ MUTABLE_HV(sv), HV_NAME_SETALL);
6391 		    assert(!HvARRAY((HV*)sv));
6392 		    goto free_body;
6393 		}
6394 	    }
6395 
6396 	    /* unrolled SvREFCNT_dec and sv_free2 follows: */
6397 
6398 	    if (!sv)
6399 		continue;
6400 	    if (!SvREFCNT(sv)) {
6401 		sv_free(sv);
6402 		continue;
6403 	    }
6404 	    if (--(SvREFCNT(sv)))
6405 		continue;
6406 #ifdef DEBUGGING
6407 	    if (SvTEMP(sv)) {
6408 		Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING),
6409 			 "Attempt to free temp prematurely: SV 0x%"UVxf
6410 			 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
6411 		continue;
6412 	    }
6413 #endif
6414 	    if (SvIMMORTAL(sv)) {
6415 		/* make sure SvREFCNT(sv)==0 happens very seldom */
6416 		SvREFCNT(sv) = SvREFCNT_IMMORTAL;
6417 		continue;
6418 	    }
6419 	    break;
6420 	} /* while 1 */
6421 
6422     } /* while sv */
6423 }
6424 
6425 /* This routine curses the sv itself, not the object referenced by sv. So
6426    sv does not have to be ROK. */
6427 
6428 static bool
6429 S_curse(pTHX_ SV * const sv, const bool check_refcnt) {
6430     dVAR;
6431 
6432     PERL_ARGS_ASSERT_CURSE;
6433     assert(SvOBJECT(sv));
6434 
6435     if (PL_defstash &&	/* Still have a symbol table? */
6436 	SvDESTROYABLE(sv))
6437     {
6438 	dSP;
6439 	HV* stash;
6440 	do {
6441 	  stash = SvSTASH(sv);
6442 	  assert(SvTYPE(stash) == SVt_PVHV);
6443 	  if (HvNAME(stash)) {
6444 	    CV* destructor = NULL;
6445 	    assert (SvOOK(stash));
6446 	    if (!SvOBJECT(stash)) destructor = (CV *)SvSTASH(stash);
6447 	    if (!destructor || HvMROMETA(stash)->destroy_gen
6448 				!= PL_sub_generation)
6449 	    {
6450 		GV * const gv =
6451 		    gv_fetchmeth_autoload(stash, "DESTROY", 7, 0);
6452 		if (gv) destructor = GvCV(gv);
6453 		if (!SvOBJECT(stash))
6454 		{
6455 		    SvSTASH(stash) =
6456 			destructor ? (HV *)destructor : ((HV *)0)+1;
6457 		    HvAUX(stash)->xhv_mro_meta->destroy_gen =
6458 			PL_sub_generation;
6459 		}
6460 	    }
6461 	    assert(!destructor || destructor == ((CV *)0)+1
6462 		|| SvTYPE(destructor) == SVt_PVCV);
6463 	    if (destructor && destructor != ((CV *)0)+1
6464 		/* A constant subroutine can have no side effects, so
6465 		   don't bother calling it.  */
6466 		&& !CvCONST(destructor)
6467 		/* Don't bother calling an empty destructor or one that
6468 		   returns immediately. */
6469 		&& (CvISXSUB(destructor)
6470 		|| (CvSTART(destructor)
6471 		    && (CvSTART(destructor)->op_next->op_type
6472 					!= OP_LEAVESUB)
6473 		    && (CvSTART(destructor)->op_next->op_type
6474 					!= OP_PUSHMARK
6475 			|| CvSTART(destructor)->op_next->op_next->op_type
6476 					!= OP_RETURN
6477 		       )
6478 		   ))
6479 	       )
6480 	    {
6481 		SV* const tmpref = newRV(sv);
6482 		SvREADONLY_on(tmpref); /* DESTROY() could be naughty */
6483 		ENTER;
6484 		PUSHSTACKi(PERLSI_DESTROY);
6485 		EXTEND(SP, 2);
6486 		PUSHMARK(SP);
6487 		PUSHs(tmpref);
6488 		PUTBACK;
6489 		call_sv(MUTABLE_SV(destructor),
6490 			    G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
6491 		POPSTACK;
6492 		SPAGAIN;
6493 		LEAVE;
6494 		if(SvREFCNT(tmpref) < 2) {
6495 		    /* tmpref is not kept alive! */
6496 		    SvREFCNT(sv)--;
6497 		    SvRV_set(tmpref, NULL);
6498 		    SvROK_off(tmpref);
6499 		}
6500 		SvREFCNT_dec_NN(tmpref);
6501 	    }
6502 	  }
6503 	} while (SvOBJECT(sv) && SvSTASH(sv) != stash);
6504 
6505 
6506 	if (check_refcnt && SvREFCNT(sv)) {
6507 	    if (PL_in_clean_objs)
6508 		Perl_croak(aTHX_
6509 		  "DESTROY created new reference to dead object '%"HEKf"'",
6510 		   HEKfARG(HvNAME_HEK(stash)));
6511 	    /* DESTROY gave object new lease on life */
6512 	    return FALSE;
6513 	}
6514     }
6515 
6516     if (SvOBJECT(sv)) {
6517 	HV * const stash = SvSTASH(sv);
6518 	/* Curse before freeing the stash, as freeing the stash could cause
6519 	   a recursive call into S_curse. */
6520 	SvOBJECT_off(sv);	/* Curse the object. */
6521 	SvSTASH_set(sv,0);	/* SvREFCNT_dec may try to read this */
6522 	SvREFCNT_dec(stash); /* possibly of changed persuasion */
6523     }
6524     return TRUE;
6525 }
6526 
6527 /*
6528 =for apidoc sv_newref
6529 
6530 Increment an SV's reference count.  Use the C<SvREFCNT_inc()> wrapper
6531 instead.
6532 
6533 =cut
6534 */
6535 
6536 SV *
6537 Perl_sv_newref(pTHX_ SV *const sv)
6538 {
6539     PERL_UNUSED_CONTEXT;
6540     if (sv)
6541 	(SvREFCNT(sv))++;
6542     return sv;
6543 }
6544 
6545 /*
6546 =for apidoc sv_free
6547 
6548 Decrement an SV's reference count, and if it drops to zero, call
6549 C<sv_clear> to invoke destructors and free up any memory used by
6550 the body; finally, deallocate the SV's head itself.
6551 Normally called via a wrapper macro C<SvREFCNT_dec>.
6552 
6553 =cut
6554 */
6555 
6556 void
6557 Perl_sv_free(pTHX_ SV *const sv)
6558 {
6559     SvREFCNT_dec(sv);
6560 }
6561 
6562 
6563 /* Private helper function for SvREFCNT_dec().
6564  * Called with rc set to original SvREFCNT(sv), where rc == 0 or 1 */
6565 
6566 void
6567 Perl_sv_free2(pTHX_ SV *const sv, const U32 rc)
6568 {
6569     dVAR;
6570 
6571     PERL_ARGS_ASSERT_SV_FREE2;
6572 
6573     if (rc == 1) {
6574         /* normal case */
6575         SvREFCNT(sv) = 0;
6576 
6577 #ifdef DEBUGGING
6578         if (SvTEMP(sv)) {
6579             Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING),
6580                              "Attempt to free temp prematurely: SV 0x%"UVxf
6581                              pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
6582             return;
6583         }
6584 #endif
6585         if (SvIMMORTAL(sv)) {
6586             /* make sure SvREFCNT(sv)==0 happens very seldom */
6587             SvREFCNT(sv) = SvREFCNT_IMMORTAL;
6588             return;
6589         }
6590         sv_clear(sv);
6591         if (! SvREFCNT(sv)) /* may have have been resurrected */
6592             del_SV(sv);
6593         return;
6594     }
6595 
6596     /* handle exceptional cases */
6597 
6598     assert(rc == 0);
6599 
6600     if (SvFLAGS(sv) & SVf_BREAK)
6601         /* this SV's refcnt has been artificially decremented to
6602          * trigger cleanup */
6603         return;
6604     if (PL_in_clean_all) /* All is fair */
6605         return;
6606     if (SvIMMORTAL(sv)) {
6607         /* make sure SvREFCNT(sv)==0 happens very seldom */
6608         SvREFCNT(sv) = SvREFCNT_IMMORTAL;
6609         return;
6610     }
6611     if (ckWARN_d(WARN_INTERNAL)) {
6612 #ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
6613         Perl_dump_sv_child(aTHX_ sv);
6614 #else
6615     #ifdef DEBUG_LEAKING_SCALARS
6616         sv_dump(sv);
6617     #endif
6618 #ifdef DEBUG_LEAKING_SCALARS_ABORT
6619         if (PL_warnhook == PERL_WARNHOOK_FATAL
6620             || ckDEAD(packWARN(WARN_INTERNAL))) {
6621             /* Don't let Perl_warner cause us to escape our fate:  */
6622             abort();
6623         }
6624 #endif
6625         /* This may not return:  */
6626         Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
6627                     "Attempt to free unreferenced scalar: SV 0x%"UVxf
6628                     pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
6629 #endif
6630     }
6631 #ifdef DEBUG_LEAKING_SCALARS_ABORT
6632     abort();
6633 #endif
6634 
6635 }
6636 
6637 
6638 /*
6639 =for apidoc sv_len
6640 
6641 Returns the length of the string in the SV.  Handles magic and type
6642 coercion and sets the UTF8 flag appropriately.  See also C<SvCUR>, which
6643 gives raw access to the xpv_cur slot.
6644 
6645 =cut
6646 */
6647 
6648 STRLEN
6649 Perl_sv_len(pTHX_ SV *const sv)
6650 {
6651     STRLEN len;
6652 
6653     if (!sv)
6654 	return 0;
6655 
6656     (void)SvPV_const(sv, len);
6657     return len;
6658 }
6659 
6660 /*
6661 =for apidoc sv_len_utf8
6662 
6663 Returns the number of characters in the string in an SV, counting wide
6664 UTF-8 bytes as a single character.  Handles magic and type coercion.
6665 
6666 =cut
6667 */
6668 
6669 /*
6670  * The length is cached in PERL_MAGIC_utf8, in the mg_len field.  Also the
6671  * mg_ptr is used, by sv_pos_u2b() and sv_pos_b2u() - see the comments below.
6672  * (Note that the mg_len is not the length of the mg_ptr field.
6673  * This allows the cache to store the character length of the string without
6674  * needing to malloc() extra storage to attach to the mg_ptr.)
6675  *
6676  */
6677 
6678 STRLEN
6679 Perl_sv_len_utf8(pTHX_ SV *const sv)
6680 {
6681     if (!sv)
6682 	return 0;
6683 
6684     SvGETMAGIC(sv);
6685     return sv_len_utf8_nomg(sv);
6686 }
6687 
6688 STRLEN
6689 Perl_sv_len_utf8_nomg(pTHX_ SV * const sv)
6690 {
6691     dVAR;
6692     STRLEN len;
6693     const U8 *s = (U8*)SvPV_nomg_const(sv, len);
6694 
6695     PERL_ARGS_ASSERT_SV_LEN_UTF8_NOMG;
6696 
6697     if (PL_utf8cache && SvUTF8(sv)) {
6698 	    STRLEN ulen;
6699 	    MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : NULL;
6700 
6701 	    if (mg && (mg->mg_len != -1 || mg->mg_ptr)) {
6702 		if (mg->mg_len != -1)
6703 		    ulen = mg->mg_len;
6704 		else {
6705 		    /* We can use the offset cache for a headstart.
6706 		       The longer value is stored in the first pair.  */
6707 		    STRLEN *cache = (STRLEN *) mg->mg_ptr;
6708 
6709 		    ulen = cache[0] + Perl_utf8_length(aTHX_ s + cache[1],
6710 						       s + len);
6711 		}
6712 
6713 		if (PL_utf8cache < 0) {
6714 		    const STRLEN real = Perl_utf8_length(aTHX_ s, s + len);
6715 		    assert_uft8_cache_coherent("sv_len_utf8", ulen, real, sv);
6716 		}
6717 	    }
6718 	    else {
6719 		ulen = Perl_utf8_length(aTHX_ s, s + len);
6720 		utf8_mg_len_cache_update(sv, &mg, ulen);
6721 	    }
6722 	    return ulen;
6723     }
6724     return SvUTF8(sv) ? Perl_utf8_length(aTHX_ s, s + len) : len;
6725 }
6726 
6727 /* Walk forwards to find the byte corresponding to the passed in UTF-8
6728    offset.  */
6729 static STRLEN
6730 S_sv_pos_u2b_forwards(const U8 *const start, const U8 *const send,
6731 		      STRLEN *const uoffset_p, bool *const at_end)
6732 {
6733     const U8 *s = start;
6734     STRLEN uoffset = *uoffset_p;
6735 
6736     PERL_ARGS_ASSERT_SV_POS_U2B_FORWARDS;
6737 
6738     while (s < send && uoffset) {
6739 	--uoffset;
6740 	s += UTF8SKIP(s);
6741     }
6742     if (s == send) {
6743 	*at_end = TRUE;
6744     }
6745     else if (s > send) {
6746 	*at_end = TRUE;
6747 	/* This is the existing behaviour. Possibly it should be a croak, as
6748 	   it's actually a bounds error  */
6749 	s = send;
6750     }
6751     *uoffset_p -= uoffset;
6752     return s - start;
6753 }
6754 
6755 /* Given the length of the string in both bytes and UTF-8 characters, decide
6756    whether to walk forwards or backwards to find the byte corresponding to
6757    the passed in UTF-8 offset.  */
6758 static STRLEN
6759 S_sv_pos_u2b_midway(const U8 *const start, const U8 *send,
6760 		    STRLEN uoffset, const STRLEN uend)
6761 {
6762     STRLEN backw = uend - uoffset;
6763 
6764     PERL_ARGS_ASSERT_SV_POS_U2B_MIDWAY;
6765 
6766     if (uoffset < 2 * backw) {
6767 	/* The assumption is that going forwards is twice the speed of going
6768 	   forward (that's where the 2 * backw comes from).
6769 	   (The real figure of course depends on the UTF-8 data.)  */
6770 	const U8 *s = start;
6771 
6772 	while (s < send && uoffset--)
6773 	    s += UTF8SKIP(s);
6774 	assert (s <= send);
6775 	if (s > send)
6776 	    s = send;
6777 	return s - start;
6778     }
6779 
6780     while (backw--) {
6781 	send--;
6782 	while (UTF8_IS_CONTINUATION(*send))
6783 	    send--;
6784     }
6785     return send - start;
6786 }
6787 
6788 /* For the string representation of the given scalar, find the byte
6789    corresponding to the passed in UTF-8 offset.  uoffset0 and boffset0
6790    give another position in the string, *before* the sought offset, which
6791    (which is always true, as 0, 0 is a valid pair of positions), which should
6792    help reduce the amount of linear searching.
6793    If *mgp is non-NULL, it should point to the UTF-8 cache magic, which
6794    will be used to reduce the amount of linear searching. The cache will be
6795    created if necessary, and the found value offered to it for update.  */
6796 static STRLEN
6797 S_sv_pos_u2b_cached(pTHX_ SV *const sv, MAGIC **const mgp, const U8 *const start,
6798 		    const U8 *const send, STRLEN uoffset,
6799 		    STRLEN uoffset0, STRLEN boffset0)
6800 {
6801     STRLEN boffset = 0; /* Actually always set, but let's keep gcc happy.  */
6802     bool found = FALSE;
6803     bool at_end = FALSE;
6804 
6805     PERL_ARGS_ASSERT_SV_POS_U2B_CACHED;
6806 
6807     assert (uoffset >= uoffset0);
6808 
6809     if (!uoffset)
6810 	return 0;
6811 
6812     if (!SvREADONLY(sv) && !SvGMAGICAL(sv) && SvPOK(sv)
6813 	&& PL_utf8cache
6814 	&& (*mgp || (SvTYPE(sv) >= SVt_PVMG &&
6815 		     (*mgp = mg_find(sv, PERL_MAGIC_utf8))))) {
6816 	if ((*mgp)->mg_ptr) {
6817 	    STRLEN *cache = (STRLEN *) (*mgp)->mg_ptr;
6818 	    if (cache[0] == uoffset) {
6819 		/* An exact match. */
6820 		return cache[1];
6821 	    }
6822 	    if (cache[2] == uoffset) {
6823 		/* An exact match. */
6824 		return cache[3];
6825 	    }
6826 
6827 	    if (cache[0] < uoffset) {
6828 		/* The cache already knows part of the way.   */
6829 		if (cache[0] > uoffset0) {
6830 		    /* The cache knows more than the passed in pair  */
6831 		    uoffset0 = cache[0];
6832 		    boffset0 = cache[1];
6833 		}
6834 		if ((*mgp)->mg_len != -1) {
6835 		    /* And we know the end too.  */
6836 		    boffset = boffset0
6837 			+ sv_pos_u2b_midway(start + boffset0, send,
6838 					      uoffset - uoffset0,
6839 					      (*mgp)->mg_len - uoffset0);
6840 		} else {
6841 		    uoffset -= uoffset0;
6842 		    boffset = boffset0
6843 			+ sv_pos_u2b_forwards(start + boffset0,
6844 					      send, &uoffset, &at_end);
6845 		    uoffset += uoffset0;
6846 		}
6847 	    }
6848 	    else if (cache[2] < uoffset) {
6849 		/* We're between the two cache entries.  */
6850 		if (cache[2] > uoffset0) {
6851 		    /* and the cache knows more than the passed in pair  */
6852 		    uoffset0 = cache[2];
6853 		    boffset0 = cache[3];
6854 		}
6855 
6856 		boffset = boffset0
6857 		    + sv_pos_u2b_midway(start + boffset0,
6858 					  start + cache[1],
6859 					  uoffset - uoffset0,
6860 					  cache[0] - uoffset0);
6861 	    } else {
6862 		boffset = boffset0
6863 		    + sv_pos_u2b_midway(start + boffset0,
6864 					  start + cache[3],
6865 					  uoffset - uoffset0,
6866 					  cache[2] - uoffset0);
6867 	    }
6868 	    found = TRUE;
6869 	}
6870 	else if ((*mgp)->mg_len != -1) {
6871 	    /* If we can take advantage of a passed in offset, do so.  */
6872 	    /* In fact, offset0 is either 0, or less than offset, so don't
6873 	       need to worry about the other possibility.  */
6874 	    boffset = boffset0
6875 		+ sv_pos_u2b_midway(start + boffset0, send,
6876 				      uoffset - uoffset0,
6877 				      (*mgp)->mg_len - uoffset0);
6878 	    found = TRUE;
6879 	}
6880     }
6881 
6882     if (!found || PL_utf8cache < 0) {
6883 	STRLEN real_boffset;
6884 	uoffset -= uoffset0;
6885 	real_boffset = boffset0 + sv_pos_u2b_forwards(start + boffset0,
6886 						      send, &uoffset, &at_end);
6887 	uoffset += uoffset0;
6888 
6889 	if (found && PL_utf8cache < 0)
6890 	    assert_uft8_cache_coherent("sv_pos_u2b_cache", boffset,
6891 				       real_boffset, sv);
6892 	boffset = real_boffset;
6893     }
6894 
6895     if (PL_utf8cache && !SvGMAGICAL(sv) && SvPOK(sv)) {
6896 	if (at_end)
6897 	    utf8_mg_len_cache_update(sv, mgp, uoffset);
6898 	else
6899 	    utf8_mg_pos_cache_update(sv, mgp, boffset, uoffset, send - start);
6900     }
6901     return boffset;
6902 }
6903 
6904 
6905 /*
6906 =for apidoc sv_pos_u2b_flags
6907 
6908 Converts the value pointed to by offsetp from a count of UTF-8 chars from
6909 the start of the string, to a count of the equivalent number of bytes; if
6910 lenp is non-zero, it does the same to lenp, but this time starting from
6911 the offset, rather than from the start
6912 of the string.  Handles type coercion.
6913 I<flags> is passed to C<SvPV_flags>, and usually should be
6914 C<SV_GMAGIC|SV_CONST_RETURN> to handle magic.
6915 
6916 =cut
6917 */
6918 
6919 /*
6920  * sv_pos_u2b_flags() uses, like sv_pos_b2u(), the mg_ptr of the potential
6921  * PERL_MAGIC_utf8 of the sv to store the mapping between UTF-8 and
6922  * byte offsets.  See also the comments of S_utf8_mg_pos_cache_update().
6923  *
6924  */
6925 
6926 STRLEN
6927 Perl_sv_pos_u2b_flags(pTHX_ SV *const sv, STRLEN uoffset, STRLEN *const lenp,
6928 		      U32 flags)
6929 {
6930     const U8 *start;
6931     STRLEN len;
6932     STRLEN boffset;
6933 
6934     PERL_ARGS_ASSERT_SV_POS_U2B_FLAGS;
6935 
6936     start = (U8*)SvPV_flags(sv, len, flags);
6937     if (len) {
6938 	const U8 * const send = start + len;
6939 	MAGIC *mg = NULL;
6940 	boffset = sv_pos_u2b_cached(sv, &mg, start, send, uoffset, 0, 0);
6941 
6942 	if (lenp
6943 	    && *lenp /* don't bother doing work for 0, as its bytes equivalent
6944 			is 0, and *lenp is already set to that.  */) {
6945 	    /* Convert the relative offset to absolute.  */
6946 	    const STRLEN uoffset2 = uoffset + *lenp;
6947 	    const STRLEN boffset2
6948 		= sv_pos_u2b_cached(sv, &mg, start, send, uoffset2,
6949 				      uoffset, boffset) - boffset;
6950 
6951 	    *lenp = boffset2;
6952 	}
6953     } else {
6954 	if (lenp)
6955 	    *lenp = 0;
6956 	boffset = 0;
6957     }
6958 
6959     return boffset;
6960 }
6961 
6962 /*
6963 =for apidoc sv_pos_u2b
6964 
6965 Converts the value pointed to by offsetp from a count of UTF-8 chars from
6966 the start of the string, to a count of the equivalent number of bytes; if
6967 lenp is non-zero, it does the same to lenp, but this time starting from
6968 the offset, rather than from the start of the string.  Handles magic and
6969 type coercion.
6970 
6971 Use C<sv_pos_u2b_flags> in preference, which correctly handles strings longer
6972 than 2Gb.
6973 
6974 =cut
6975 */
6976 
6977 /*
6978  * sv_pos_u2b() uses, like sv_pos_b2u(), the mg_ptr of the potential
6979  * PERL_MAGIC_utf8 of the sv to store the mapping between UTF-8 and
6980  * byte offsets.  See also the comments of S_utf8_mg_pos_cache_update().
6981  *
6982  */
6983 
6984 /* This function is subject to size and sign problems */
6985 
6986 void
6987 Perl_sv_pos_u2b(pTHX_ SV *const sv, I32 *const offsetp, I32 *const lenp)
6988 {
6989     PERL_ARGS_ASSERT_SV_POS_U2B;
6990 
6991     if (lenp) {
6992 	STRLEN ulen = (STRLEN)*lenp;
6993 	*offsetp = (I32)sv_pos_u2b_flags(sv, (STRLEN)*offsetp, &ulen,
6994 					 SV_GMAGIC|SV_CONST_RETURN);
6995 	*lenp = (I32)ulen;
6996     } else {
6997 	*offsetp = (I32)sv_pos_u2b_flags(sv, (STRLEN)*offsetp, NULL,
6998 					 SV_GMAGIC|SV_CONST_RETURN);
6999     }
7000 }
7001 
7002 static void
7003 S_utf8_mg_len_cache_update(pTHX_ SV *const sv, MAGIC **const mgp,
7004 			   const STRLEN ulen)
7005 {
7006     PERL_ARGS_ASSERT_UTF8_MG_LEN_CACHE_UPDATE;
7007     if (SvREADONLY(sv) || SvGMAGICAL(sv) || !SvPOK(sv))
7008 	return;
7009 
7010     if (!*mgp && (SvTYPE(sv) < SVt_PVMG ||
7011 		  !(*mgp = mg_find(sv, PERL_MAGIC_utf8)))) {
7012 	*mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, &PL_vtbl_utf8, 0, 0);
7013     }
7014     assert(*mgp);
7015 
7016     (*mgp)->mg_len = ulen;
7017     /* For now, treat "overflowed" as "still unknown". See RT #72924.  */
7018     if (ulen != (STRLEN) (*mgp)->mg_len)
7019 	(*mgp)->mg_len = -1;
7020 }
7021 
7022 /* Create and update the UTF8 magic offset cache, with the proffered utf8/
7023    byte length pairing. The (byte) length of the total SV is passed in too,
7024    as blen, because for some (more esoteric) SVs, the call to SvPV_const()
7025    may not have updated SvCUR, so we can't rely on reading it directly.
7026 
7027    The proffered utf8/byte length pairing isn't used if the cache already has
7028    two pairs, and swapping either for the proffered pair would increase the
7029    RMS of the intervals between known byte offsets.
7030 
7031    The cache itself consists of 4 STRLEN values
7032    0: larger UTF-8 offset
7033    1: corresponding byte offset
7034    2: smaller UTF-8 offset
7035    3: corresponding byte offset
7036 
7037    Unused cache pairs have the value 0, 0.
7038    Keeping the cache "backwards" means that the invariant of
7039    cache[0] >= cache[2] is maintained even with empty slots, which means that
7040    the code that uses it doesn't need to worry if only 1 entry has actually
7041    been set to non-zero.  It also makes the "position beyond the end of the
7042    cache" logic much simpler, as the first slot is always the one to start
7043    from.
7044 */
7045 static void
7046 S_utf8_mg_pos_cache_update(pTHX_ SV *const sv, MAGIC **const mgp, const STRLEN byte,
7047                            const STRLEN utf8, const STRLEN blen)
7048 {
7049     STRLEN *cache;
7050 
7051     PERL_ARGS_ASSERT_UTF8_MG_POS_CACHE_UPDATE;
7052 
7053     if (SvREADONLY(sv))
7054 	return;
7055 
7056     if (!*mgp && (SvTYPE(sv) < SVt_PVMG ||
7057 		  !(*mgp = mg_find(sv, PERL_MAGIC_utf8)))) {
7058 	*mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, (MGVTBL*)&PL_vtbl_utf8, 0,
7059 			   0);
7060 	(*mgp)->mg_len = -1;
7061     }
7062     assert(*mgp);
7063 
7064     if (!(cache = (STRLEN *)(*mgp)->mg_ptr)) {
7065 	Newxz(cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
7066 	(*mgp)->mg_ptr = (char *) cache;
7067     }
7068     assert(cache);
7069 
7070     if (PL_utf8cache < 0 && SvPOKp(sv)) {
7071 	/* SvPOKp() because it's possible that sv has string overloading, and
7072 	   therefore is a reference, hence SvPVX() is actually a pointer.
7073 	   This cures the (very real) symptoms of RT 69422, but I'm not actually
7074 	   sure whether we should even be caching the results of UTF-8
7075 	   operations on overloading, given that nothing stops overloading
7076 	   returning a different value every time it's called.  */
7077 	const U8 *start = (const U8 *) SvPVX_const(sv);
7078 	const STRLEN realutf8 = utf8_length(start, start + byte);
7079 
7080 	assert_uft8_cache_coherent("utf8_mg_pos_cache_update", utf8, realutf8,
7081 				   sv);
7082     }
7083 
7084     /* Cache is held with the later position first, to simplify the code
7085        that deals with unbounded ends.  */
7086 
7087     ASSERT_UTF8_CACHE(cache);
7088     if (cache[1] == 0) {
7089 	/* Cache is totally empty  */
7090 	cache[0] = utf8;
7091 	cache[1] = byte;
7092     } else if (cache[3] == 0) {
7093 	if (byte > cache[1]) {
7094 	    /* New one is larger, so goes first.  */
7095 	    cache[2] = cache[0];
7096 	    cache[3] = cache[1];
7097 	    cache[0] = utf8;
7098 	    cache[1] = byte;
7099 	} else {
7100 	    cache[2] = utf8;
7101 	    cache[3] = byte;
7102 	}
7103     } else {
7104 #define THREEWAY_SQUARE(a,b,c,d) \
7105 	    ((float)((d) - (c))) * ((float)((d) - (c))) \
7106 	    + ((float)((c) - (b))) * ((float)((c) - (b))) \
7107 	       + ((float)((b) - (a))) * ((float)((b) - (a)))
7108 
7109 	/* Cache has 2 slots in use, and we know three potential pairs.
7110 	   Keep the two that give the lowest RMS distance. Do the
7111 	   calculation in bytes simply because we always know the byte
7112 	   length.  squareroot has the same ordering as the positive value,
7113 	   so don't bother with the actual square root.  */
7114 	if (byte > cache[1]) {
7115 	    /* New position is after the existing pair of pairs.  */
7116 	    const float keep_earlier
7117 		= THREEWAY_SQUARE(0, cache[3], byte, blen);
7118 	    const float keep_later
7119 		= THREEWAY_SQUARE(0, cache[1], byte, blen);
7120 
7121 	    if (keep_later < keep_earlier) {
7122                 cache[2] = cache[0];
7123                 cache[3] = cache[1];
7124                 cache[0] = utf8;
7125                 cache[1] = byte;
7126 	    }
7127 	    else {
7128                 cache[0] = utf8;
7129                 cache[1] = byte;
7130 	    }
7131 	}
7132 	else if (byte > cache[3]) {
7133 	    /* New position is between the existing pair of pairs.  */
7134 	    const float keep_earlier
7135 		= THREEWAY_SQUARE(0, cache[3], byte, blen);
7136 	    const float keep_later
7137 		= THREEWAY_SQUARE(0, byte, cache[1], blen);
7138 
7139 	    if (keep_later < keep_earlier) {
7140                 cache[2] = utf8;
7141                 cache[3] = byte;
7142 	    }
7143 	    else {
7144                 cache[0] = utf8;
7145                 cache[1] = byte;
7146 	    }
7147 	}
7148 	else {
7149  	    /* New position is before the existing pair of pairs.  */
7150 	    const float keep_earlier
7151 		= THREEWAY_SQUARE(0, byte, cache[3], blen);
7152 	    const float keep_later
7153 		= THREEWAY_SQUARE(0, byte, cache[1], blen);
7154 
7155 	    if (keep_later < keep_earlier) {
7156                 cache[2] = utf8;
7157                 cache[3] = byte;
7158 	    }
7159 	    else {
7160                 cache[0] = cache[2];
7161                 cache[1] = cache[3];
7162                 cache[2] = utf8;
7163                 cache[3] = byte;
7164 	    }
7165 	}
7166     }
7167     ASSERT_UTF8_CACHE(cache);
7168 }
7169 
7170 /* We already know all of the way, now we may be able to walk back.  The same
7171    assumption is made as in S_sv_pos_u2b_midway(), namely that walking
7172    backward is half the speed of walking forward. */
7173 static STRLEN
7174 S_sv_pos_b2u_midway(pTHX_ const U8 *const s, const U8 *const target,
7175                     const U8 *end, STRLEN endu)
7176 {
7177     const STRLEN forw = target - s;
7178     STRLEN backw = end - target;
7179 
7180     PERL_ARGS_ASSERT_SV_POS_B2U_MIDWAY;
7181 
7182     if (forw < 2 * backw) {
7183 	return utf8_length(s, target);
7184     }
7185 
7186     while (end > target) {
7187 	end--;
7188 	while (UTF8_IS_CONTINUATION(*end)) {
7189 	    end--;
7190 	}
7191 	endu--;
7192     }
7193     return endu;
7194 }
7195 
7196 /*
7197 =for apidoc sv_pos_b2u
7198 
7199 Converts the value pointed to by offsetp from a count of bytes from the
7200 start of the string, to a count of the equivalent number of UTF-8 chars.
7201 Handles magic and type coercion.
7202 
7203 =cut
7204 */
7205 
7206 /*
7207  * sv_pos_b2u() uses, like sv_pos_u2b(), the mg_ptr of the potential
7208  * PERL_MAGIC_utf8 of the sv to store the mapping between UTF-8 and
7209  * byte offsets.
7210  *
7211  */
7212 void
7213 Perl_sv_pos_b2u(pTHX_ SV *const sv, I32 *const offsetp)
7214 {
7215     const U8* s;
7216     const STRLEN byte = *offsetp;
7217     STRLEN len = 0; /* Actually always set, but let's keep gcc happy.  */
7218     STRLEN blen;
7219     MAGIC* mg = NULL;
7220     const U8* send;
7221     bool found = FALSE;
7222 
7223     PERL_ARGS_ASSERT_SV_POS_B2U;
7224 
7225     if (!sv)
7226 	return;
7227 
7228     s = (const U8*)SvPV_const(sv, blen);
7229 
7230     if (blen < byte)
7231 	Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset, blen=%"UVuf
7232 		   ", byte=%"UVuf, (UV)blen, (UV)byte);
7233 
7234     send = s + byte;
7235 
7236     if (!SvREADONLY(sv)
7237 	&& PL_utf8cache
7238 	&& SvTYPE(sv) >= SVt_PVMG
7239 	&& (mg = mg_find(sv, PERL_MAGIC_utf8)))
7240     {
7241 	if (mg->mg_ptr) {
7242 	    STRLEN * const cache = (STRLEN *) mg->mg_ptr;
7243 	    if (cache[1] == byte) {
7244 		/* An exact match. */
7245 		*offsetp = cache[0];
7246 		return;
7247 	    }
7248 	    if (cache[3] == byte) {
7249 		/* An exact match. */
7250 		*offsetp = cache[2];
7251 		return;
7252 	    }
7253 
7254 	    if (cache[1] < byte) {
7255 		/* We already know part of the way. */
7256 		if (mg->mg_len != -1) {
7257 		    /* Actually, we know the end too.  */
7258 		    len = cache[0]
7259 			+ S_sv_pos_b2u_midway(aTHX_ s + cache[1], send,
7260 					      s + blen, mg->mg_len - cache[0]);
7261 		} else {
7262 		    len = cache[0] + utf8_length(s + cache[1], send);
7263 		}
7264 	    }
7265 	    else if (cache[3] < byte) {
7266 		/* We're between the two cached pairs, so we do the calculation
7267 		   offset by the byte/utf-8 positions for the earlier pair,
7268 		   then add the utf-8 characters from the string start to
7269 		   there.  */
7270 		len = S_sv_pos_b2u_midway(aTHX_ s + cache[3], send,
7271 					  s + cache[1], cache[0] - cache[2])
7272 		    + cache[2];
7273 
7274 	    }
7275 	    else { /* cache[3] > byte */
7276 		len = S_sv_pos_b2u_midway(aTHX_ s, send, s + cache[3],
7277 					  cache[2]);
7278 
7279 	    }
7280 	    ASSERT_UTF8_CACHE(cache);
7281 	    found = TRUE;
7282 	} else if (mg->mg_len != -1) {
7283 	    len = S_sv_pos_b2u_midway(aTHX_ s, send, s + blen, mg->mg_len);
7284 	    found = TRUE;
7285 	}
7286     }
7287     if (!found || PL_utf8cache < 0) {
7288 	const STRLEN real_len = utf8_length(s, send);
7289 
7290 	if (found && PL_utf8cache < 0)
7291 	    assert_uft8_cache_coherent("sv_pos_b2u", len, real_len, sv);
7292 	len = real_len;
7293     }
7294     *offsetp = len;
7295 
7296     if (PL_utf8cache) {
7297 	if (blen == byte)
7298 	    utf8_mg_len_cache_update(sv, &mg, len);
7299 	else
7300 	    utf8_mg_pos_cache_update(sv, &mg, byte, len, blen);
7301     }
7302 }
7303 
7304 static void
7305 S_assert_uft8_cache_coherent(pTHX_ const char *const func, STRLEN from_cache,
7306 			     STRLEN real, SV *const sv)
7307 {
7308     PERL_ARGS_ASSERT_ASSERT_UFT8_CACHE_COHERENT;
7309 
7310     /* As this is debugging only code, save space by keeping this test here,
7311        rather than inlining it in all the callers.  */
7312     if (from_cache == real)
7313 	return;
7314 
7315     /* Need to turn the assertions off otherwise we may recurse infinitely
7316        while printing error messages.  */
7317     SAVEI8(PL_utf8cache);
7318     PL_utf8cache = 0;
7319     Perl_croak(aTHX_ "panic: %s cache %"UVuf" real %"UVuf" for %"SVf,
7320 	       func, (UV) from_cache, (UV) real, SVfARG(sv));
7321 }
7322 
7323 /*
7324 =for apidoc sv_eq
7325 
7326 Returns a boolean indicating whether the strings in the two SVs are
7327 identical.  Is UTF-8 and 'use bytes' aware, handles get magic, and will
7328 coerce its args to strings if necessary.
7329 
7330 =for apidoc sv_eq_flags
7331 
7332 Returns a boolean indicating whether the strings in the two SVs are
7333 identical.  Is UTF-8 and 'use bytes' aware and coerces its args to strings
7334 if necessary.  If the flags include SV_GMAGIC, it handles get-magic, too.
7335 
7336 =cut
7337 */
7338 
7339 I32
7340 Perl_sv_eq_flags(pTHX_ SV *sv1, SV *sv2, const U32 flags)
7341 {
7342     dVAR;
7343     const char *pv1;
7344     STRLEN cur1;
7345     const char *pv2;
7346     STRLEN cur2;
7347     I32  eq     = 0;
7348     SV* svrecode = NULL;
7349 
7350     if (!sv1) {
7351 	pv1 = "";
7352 	cur1 = 0;
7353     }
7354     else {
7355 	/* if pv1 and pv2 are the same, second SvPV_const call may
7356 	 * invalidate pv1 (if we are handling magic), so we may need to
7357 	 * make a copy */
7358 	if (sv1 == sv2 && flags & SV_GMAGIC
7359 	 && (SvTHINKFIRST(sv1) || SvGMAGICAL(sv1))) {
7360 	    pv1 = SvPV_const(sv1, cur1);
7361 	    sv1 = newSVpvn_flags(pv1, cur1, SVs_TEMP | SvUTF8(sv2));
7362 	}
7363 	pv1 = SvPV_flags_const(sv1, cur1, flags);
7364     }
7365 
7366     if (!sv2){
7367 	pv2 = "";
7368 	cur2 = 0;
7369     }
7370     else
7371 	pv2 = SvPV_flags_const(sv2, cur2, flags);
7372 
7373     if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
7374         /* Differing utf8ness.
7375 	 * Do not UTF8size the comparands as a side-effect. */
7376 	 if (PL_encoding) {
7377 	      if (SvUTF8(sv1)) {
7378 		   svrecode = newSVpvn(pv2, cur2);
7379 		   sv_recode_to_utf8(svrecode, PL_encoding);
7380 		   pv2 = SvPV_const(svrecode, cur2);
7381 	      }
7382 	      else {
7383 		   svrecode = newSVpvn(pv1, cur1);
7384 		   sv_recode_to_utf8(svrecode, PL_encoding);
7385 		   pv1 = SvPV_const(svrecode, cur1);
7386 	      }
7387 	      /* Now both are in UTF-8. */
7388 	      if (cur1 != cur2) {
7389 		   SvREFCNT_dec_NN(svrecode);
7390 		   return FALSE;
7391 	      }
7392 	 }
7393 	 else {
7394 	      if (SvUTF8(sv1)) {
7395 		  /* sv1 is the UTF-8 one  */
7396 		  return bytes_cmp_utf8((const U8*)pv2, cur2,
7397 					(const U8*)pv1, cur1) == 0;
7398 	      }
7399 	      else {
7400 		  /* sv2 is the UTF-8 one  */
7401 		  return bytes_cmp_utf8((const U8*)pv1, cur1,
7402 					(const U8*)pv2, cur2) == 0;
7403 	      }
7404 	 }
7405     }
7406 
7407     if (cur1 == cur2)
7408 	eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
7409 
7410     SvREFCNT_dec(svrecode);
7411 
7412     return eq;
7413 }
7414 
7415 /*
7416 =for apidoc sv_cmp
7417 
7418 Compares the strings in two SVs.  Returns -1, 0, or 1 indicating whether the
7419 string in C<sv1> is less than, equal to, or greater than the string in
7420 C<sv2>.  Is UTF-8 and 'use bytes' aware, handles get magic, and will
7421 coerce its args to strings if necessary.  See also C<sv_cmp_locale>.
7422 
7423 =for apidoc sv_cmp_flags
7424 
7425 Compares the strings in two SVs.  Returns -1, 0, or 1 indicating whether the
7426 string in C<sv1> is less than, equal to, or greater than the string in
7427 C<sv2>.  Is UTF-8 and 'use bytes' aware and will coerce its args to strings
7428 if necessary.  If the flags include SV_GMAGIC, it handles get magic.  See
7429 also C<sv_cmp_locale_flags>.
7430 
7431 =cut
7432 */
7433 
7434 I32
7435 Perl_sv_cmp(pTHX_ SV *const sv1, SV *const sv2)
7436 {
7437     return sv_cmp_flags(sv1, sv2, SV_GMAGIC);
7438 }
7439 
7440 I32
7441 Perl_sv_cmp_flags(pTHX_ SV *const sv1, SV *const sv2,
7442 		  const U32 flags)
7443 {
7444     dVAR;
7445     STRLEN cur1, cur2;
7446     const char *pv1, *pv2;
7447     I32  cmp;
7448     SV *svrecode = NULL;
7449 
7450     if (!sv1) {
7451 	pv1 = "";
7452 	cur1 = 0;
7453     }
7454     else
7455 	pv1 = SvPV_flags_const(sv1, cur1, flags);
7456 
7457     if (!sv2) {
7458 	pv2 = "";
7459 	cur2 = 0;
7460     }
7461     else
7462 	pv2 = SvPV_flags_const(sv2, cur2, flags);
7463 
7464     if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
7465         /* Differing utf8ness.
7466 	 * Do not UTF8size the comparands as a side-effect. */
7467 	if (SvUTF8(sv1)) {
7468 	    if (PL_encoding) {
7469 		 svrecode = newSVpvn(pv2, cur2);
7470 		 sv_recode_to_utf8(svrecode, PL_encoding);
7471 		 pv2 = SvPV_const(svrecode, cur2);
7472 	    }
7473 	    else {
7474 		const int retval = -bytes_cmp_utf8((const U8*)pv2, cur2,
7475 						   (const U8*)pv1, cur1);
7476 		return retval ? retval < 0 ? -1 : +1 : 0;
7477 	    }
7478 	}
7479 	else {
7480 	    if (PL_encoding) {
7481 		 svrecode = newSVpvn(pv1, cur1);
7482 		 sv_recode_to_utf8(svrecode, PL_encoding);
7483 		 pv1 = SvPV_const(svrecode, cur1);
7484 	    }
7485 	    else {
7486 		const int retval = bytes_cmp_utf8((const U8*)pv1, cur1,
7487 						  (const U8*)pv2, cur2);
7488 		return retval ? retval < 0 ? -1 : +1 : 0;
7489 	    }
7490 	}
7491     }
7492 
7493     if (!cur1) {
7494 	cmp = cur2 ? -1 : 0;
7495     } else if (!cur2) {
7496 	cmp = 1;
7497     } else {
7498         const I32 retval = memcmp((const void*)pv1, (const void*)pv2, cur1 < cur2 ? cur1 : cur2);
7499 
7500 	if (retval) {
7501 	    cmp = retval < 0 ? -1 : 1;
7502 	} else if (cur1 == cur2) {
7503 	    cmp = 0;
7504         } else {
7505 	    cmp = cur1 < cur2 ? -1 : 1;
7506 	}
7507     }
7508 
7509     SvREFCNT_dec(svrecode);
7510 
7511     return cmp;
7512 }
7513 
7514 /*
7515 =for apidoc sv_cmp_locale
7516 
7517 Compares the strings in two SVs in a locale-aware manner.  Is UTF-8 and
7518 'use bytes' aware, handles get magic, and will coerce its args to strings
7519 if necessary.  See also C<sv_cmp>.
7520 
7521 =for apidoc sv_cmp_locale_flags
7522 
7523 Compares the strings in two SVs in a locale-aware manner.  Is UTF-8 and
7524 'use bytes' aware and will coerce its args to strings if necessary.  If the
7525 flags contain SV_GMAGIC, it handles get magic.  See also C<sv_cmp_flags>.
7526 
7527 =cut
7528 */
7529 
7530 I32
7531 Perl_sv_cmp_locale(pTHX_ SV *const sv1, SV *const sv2)
7532 {
7533     return sv_cmp_locale_flags(sv1, sv2, SV_GMAGIC);
7534 }
7535 
7536 I32
7537 Perl_sv_cmp_locale_flags(pTHX_ SV *const sv1, SV *const sv2,
7538 			 const U32 flags)
7539 {
7540     dVAR;
7541 #ifdef USE_LOCALE_COLLATE
7542 
7543     char *pv1, *pv2;
7544     STRLEN len1, len2;
7545     I32 retval;
7546 
7547     if (PL_collation_standard)
7548 	goto raw_compare;
7549 
7550     len1 = 0;
7551     pv1 = sv1 ? sv_collxfrm_flags(sv1, &len1, flags) : (char *) NULL;
7552     len2 = 0;
7553     pv2 = sv2 ? sv_collxfrm_flags(sv2, &len2, flags) : (char *) NULL;
7554 
7555     if (!pv1 || !len1) {
7556 	if (pv2 && len2)
7557 	    return -1;
7558 	else
7559 	    goto raw_compare;
7560     }
7561     else {
7562 	if (!pv2 || !len2)
7563 	    return 1;
7564     }
7565 
7566     retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
7567 
7568     if (retval)
7569 	return retval < 0 ? -1 : 1;
7570 
7571     /*
7572      * When the result of collation is equality, that doesn't mean
7573      * that there are no differences -- some locales exclude some
7574      * characters from consideration.  So to avoid false equalities,
7575      * we use the raw string as a tiebreaker.
7576      */
7577 
7578   raw_compare:
7579     /*FALLTHROUGH*/
7580 
7581 #endif /* USE_LOCALE_COLLATE */
7582 
7583     return sv_cmp(sv1, sv2);
7584 }
7585 
7586 
7587 #ifdef USE_LOCALE_COLLATE
7588 
7589 /*
7590 =for apidoc sv_collxfrm
7591 
7592 This calls C<sv_collxfrm_flags> with the SV_GMAGIC flag.  See
7593 C<sv_collxfrm_flags>.
7594 
7595 =for apidoc sv_collxfrm_flags
7596 
7597 Add Collate Transform magic to an SV if it doesn't already have it.  If the
7598 flags contain SV_GMAGIC, it handles get-magic.
7599 
7600 Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
7601 scalar data of the variable, but transformed to such a format that a normal
7602 memory comparison can be used to compare the data according to the locale
7603 settings.
7604 
7605 =cut
7606 */
7607 
7608 char *
7609 Perl_sv_collxfrm_flags(pTHX_ SV *const sv, STRLEN *const nxp, const I32 flags)
7610 {
7611     dVAR;
7612     MAGIC *mg;
7613 
7614     PERL_ARGS_ASSERT_SV_COLLXFRM_FLAGS;
7615 
7616     mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
7617     if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
7618 	const char *s;
7619 	char *xf;
7620 	STRLEN len, xlen;
7621 
7622 	if (mg)
7623 	    Safefree(mg->mg_ptr);
7624 	s = SvPV_flags_const(sv, len, flags);
7625 	if ((xf = mem_collxfrm(s, len, &xlen))) {
7626 	    if (! mg) {
7627 #ifdef PERL_OLD_COPY_ON_WRITE
7628 		if (SvIsCOW(sv))
7629 		    sv_force_normal_flags(sv, 0);
7630 #endif
7631 		mg = sv_magicext(sv, 0, PERL_MAGIC_collxfrm, &PL_vtbl_collxfrm,
7632 				 0, 0);
7633 		assert(mg);
7634 	    }
7635 	    mg->mg_ptr = xf;
7636 	    mg->mg_len = xlen;
7637 	}
7638 	else {
7639 	    if (mg) {
7640 		mg->mg_ptr = NULL;
7641 		mg->mg_len = -1;
7642 	    }
7643 	}
7644     }
7645     if (mg && mg->mg_ptr) {
7646 	*nxp = mg->mg_len;
7647 	return mg->mg_ptr + sizeof(PL_collation_ix);
7648     }
7649     else {
7650 	*nxp = 0;
7651 	return NULL;
7652     }
7653 }
7654 
7655 #endif /* USE_LOCALE_COLLATE */
7656 
7657 static char *
7658 S_sv_gets_append_to_utf8(pTHX_ SV *const sv, PerlIO *const fp, I32 append)
7659 {
7660     SV * const tsv = newSV(0);
7661     ENTER;
7662     SAVEFREESV(tsv);
7663     sv_gets(tsv, fp, 0);
7664     sv_utf8_upgrade_nomg(tsv);
7665     SvCUR_set(sv,append);
7666     sv_catsv(sv,tsv);
7667     LEAVE;
7668     return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
7669 }
7670 
7671 static char *
7672 S_sv_gets_read_record(pTHX_ SV *const sv, PerlIO *const fp, I32 append)
7673 {
7674     SSize_t bytesread;
7675     const STRLEN recsize = SvUV(SvRV(PL_rs)); /* RsRECORD() guarantees > 0. */
7676       /* Grab the size of the record we're getting */
7677     char *buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append;
7678 
7679     /* Go yank in */
7680 #ifdef VMS
7681 #include <rms.h>
7682     int fd;
7683     Stat_t st;
7684 
7685     /* With a true, record-oriented file on VMS, we need to use read directly
7686      * to ensure that we respect RMS record boundaries.  The user is responsible
7687      * for providing a PL_rs value that corresponds to the FAB$W_MRS (maximum
7688      * record size) field.  N.B. This is likely to produce invalid results on
7689      * varying-width character data when a record ends mid-character.
7690      */
7691     fd = PerlIO_fileno(fp);
7692     if (fd != -1
7693 	&& PerlLIO_fstat(fd, &st) == 0
7694 	&& (st.st_fab_rfm == FAB$C_VAR
7695 	    || st.st_fab_rfm == FAB$C_VFC
7696 	    || st.st_fab_rfm == FAB$C_FIX)) {
7697 
7698 	bytesread = PerlLIO_read(fd, buffer, recsize);
7699     }
7700     else /* in-memory file from PerlIO::Scalar
7701           * or not a record-oriented file
7702           */
7703 #endif
7704     {
7705 	bytesread = PerlIO_read(fp, buffer, recsize);
7706 
7707 	/* At this point, the logic in sv_get() means that sv will
7708 	   be treated as utf-8 if the handle is utf8.
7709 	*/
7710 	if (PerlIO_isutf8(fp) && bytesread > 0) {
7711 	    char *bend = buffer + bytesread;
7712 	    char *bufp = buffer;
7713 	    size_t charcount = 0;
7714 	    bool charstart = TRUE;
7715 	    STRLEN skip = 0;
7716 
7717 	    while (charcount < recsize) {
7718 		/* count accumulated characters */
7719 		while (bufp < bend) {
7720 		    if (charstart) {
7721 			skip = UTF8SKIP(bufp);
7722 		    }
7723 		    if (bufp + skip > bend) {
7724 			/* partial at the end */
7725 			charstart = FALSE;
7726 			break;
7727 		    }
7728 		    else {
7729 			++charcount;
7730 			bufp += skip;
7731 			charstart = TRUE;
7732 		    }
7733 		}
7734 
7735 		if (charcount < recsize) {
7736 		    STRLEN readsize;
7737 		    STRLEN bufp_offset = bufp - buffer;
7738 		    SSize_t morebytesread;
7739 
7740 		    /* originally I read enough to fill any incomplete
7741 		       character and the first byte of the next
7742 		       character if needed, but if there's many
7743 		       multi-byte encoded characters we're going to be
7744 		       making a read call for every character beyond
7745 		       the original read size.
7746 
7747 		       So instead, read the rest of the character if
7748 		       any, and enough bytes to match at least the
7749 		       start bytes for each character we're going to
7750 		       read.
7751 		    */
7752 		    if (charstart)
7753 			readsize = recsize - charcount;
7754 		    else
7755 			readsize = skip - (bend - bufp) + recsize - charcount - 1;
7756 		    buffer = SvGROW(sv, append + bytesread + readsize + 1) + append;
7757 		    bend = buffer + bytesread;
7758 		    morebytesread = PerlIO_read(fp, bend, readsize);
7759 		    if (morebytesread <= 0) {
7760 			/* we're done, if we still have incomplete
7761 			   characters the check code in sv_gets() will
7762 			   warn about them.
7763 
7764 			   I'd originally considered doing
7765 			   PerlIO_ungetc() on all but the lead
7766 			   character of the incomplete character, but
7767 			   read() doesn't do that, so I don't.
7768 			*/
7769 			break;
7770 		    }
7771 
7772 		    /* prepare to scan some more */
7773 		    bytesread += morebytesread;
7774 		    bend = buffer + bytesread;
7775 		    bufp = buffer + bufp_offset;
7776 		}
7777 	    }
7778 	}
7779     }
7780 
7781     if (bytesread < 0)
7782 	bytesread = 0;
7783     SvCUR_set(sv, bytesread + append);
7784     buffer[bytesread] = '\0';
7785     return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
7786 }
7787 
7788 /*
7789 =for apidoc sv_gets
7790 
7791 Get a line from the filehandle and store it into the SV, optionally
7792 appending to the currently-stored string. If C<append> is not 0, the
7793 line is appended to the SV instead of overwriting it. C<append> should
7794 be set to the byte offset that the appended string should start at
7795 in the SV (typically, C<SvCUR(sv)> is a suitable choice).
7796 
7797 =cut
7798 */
7799 
7800 char *
7801 Perl_sv_gets(pTHX_ SV *const sv, PerlIO *const fp, I32 append)
7802 {
7803     dVAR;
7804     const char *rsptr;
7805     STRLEN rslen;
7806     STDCHAR rslast;
7807     STDCHAR *bp;
7808     I32 cnt;
7809     I32 i = 0;
7810     I32 rspara = 0;
7811 
7812     PERL_ARGS_ASSERT_SV_GETS;
7813 
7814     if (SvTHINKFIRST(sv))
7815 	sv_force_normal_flags(sv, append ? 0 : SV_COW_DROP_PV);
7816     /* XXX. If you make this PVIV, then copy on write can copy scalars read
7817        from <>.
7818        However, perlbench says it's slower, because the existing swipe code
7819        is faster than copy on write.
7820        Swings and roundabouts.  */
7821     SvUPGRADE(sv, SVt_PV);
7822 
7823     if (append) {
7824 	if (PerlIO_isutf8(fp)) {
7825 	    if (!SvUTF8(sv)) {
7826 		sv_utf8_upgrade_nomg(sv);
7827 		sv_pos_u2b(sv,&append,0);
7828 	    }
7829 	} else if (SvUTF8(sv)) {
7830 	    return S_sv_gets_append_to_utf8(aTHX_ sv, fp, append);
7831 	}
7832     }
7833 
7834     SvPOK_only(sv);
7835     if (!append) {
7836         SvCUR_set(sv,0);
7837     }
7838     if (PerlIO_isutf8(fp))
7839 	SvUTF8_on(sv);
7840 
7841     if (IN_PERL_COMPILETIME) {
7842 	/* we always read code in line mode */
7843 	rsptr = "\n";
7844 	rslen = 1;
7845     }
7846     else if (RsSNARF(PL_rs)) {
7847     	/* If it is a regular disk file use size from stat() as estimate
7848 	   of amount we are going to read -- may result in mallocing
7849 	   more memory than we really need if the layers below reduce
7850 	   the size we read (e.g. CRLF or a gzip layer).
7851 	 */
7852 	Stat_t st;
7853 	if (!PerlLIO_fstat(PerlIO_fileno(fp), &st) && S_ISREG(st.st_mode))  {
7854 	    const Off_t offset = PerlIO_tell(fp);
7855 	    if (offset != (Off_t) -1 && st.st_size + append > offset) {
7856 	     	(void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 1));
7857 	    }
7858 	}
7859 	rsptr = NULL;
7860 	rslen = 0;
7861     }
7862     else if (RsRECORD(PL_rs)) {
7863 	return S_sv_gets_read_record(aTHX_ sv, fp, append);
7864     }
7865     else if (RsPARA(PL_rs)) {
7866 	rsptr = "\n\n";
7867 	rslen = 2;
7868 	rspara = 1;
7869     }
7870     else {
7871 	/* Get $/ i.e. PL_rs into same encoding as stream wants */
7872 	if (PerlIO_isutf8(fp)) {
7873 	    rsptr = SvPVutf8(PL_rs, rslen);
7874 	}
7875 	else {
7876 	    if (SvUTF8(PL_rs)) {
7877 		if (!sv_utf8_downgrade(PL_rs, TRUE)) {
7878 		    Perl_croak(aTHX_ "Wide character in $/");
7879 		}
7880 	    }
7881 	    rsptr = SvPV_const(PL_rs, rslen);
7882 	}
7883     }
7884 
7885     rslast = rslen ? rsptr[rslen - 1] : '\0';
7886 
7887     if (rspara) {		/* have to do this both before and after */
7888 	do {			/* to make sure file boundaries work right */
7889 	    if (PerlIO_eof(fp))
7890 		return 0;
7891 	    i = PerlIO_getc(fp);
7892 	    if (i != '\n') {
7893 		if (i == -1)
7894 		    return 0;
7895 		PerlIO_ungetc(fp,i);
7896 		break;
7897 	    }
7898 	} while (i != EOF);
7899     }
7900 
7901     /* See if we know enough about I/O mechanism to cheat it ! */
7902 
7903     /* This used to be #ifdef test - it is made run-time test for ease
7904        of abstracting out stdio interface. One call should be cheap
7905        enough here - and may even be a macro allowing compile
7906        time optimization.
7907      */
7908 
7909     if (PerlIO_fast_gets(fp)) {
7910 
7911     /*
7912      * We're going to steal some values from the stdio struct
7913      * and put EVERYTHING in the innermost loop into registers.
7914      */
7915     STDCHAR *ptr;
7916     STRLEN bpx;
7917     I32 shortbuffered;
7918 
7919 #if defined(VMS) && defined(PERLIO_IS_STDIO)
7920     /* An ungetc()d char is handled separately from the regular
7921      * buffer, so we getc() it back out and stuff it in the buffer.
7922      */
7923     i = PerlIO_getc(fp);
7924     if (i == EOF) return 0;
7925     *(--((*fp)->_ptr)) = (unsigned char) i;
7926     (*fp)->_cnt++;
7927 #endif
7928 
7929     /* Here is some breathtakingly efficient cheating */
7930 
7931     cnt = PerlIO_get_cnt(fp);			/* get count into register */
7932     /* make sure we have the room */
7933     if ((I32)(SvLEN(sv) - append) <= cnt + 1) {
7934     	/* Not room for all of it
7935 	   if we are looking for a separator and room for some
7936 	 */
7937 	if (rslen && cnt > 80 && (I32)SvLEN(sv) > append) {
7938 	    /* just process what we have room for */
7939 	    shortbuffered = cnt - SvLEN(sv) + append + 1;
7940 	    cnt -= shortbuffered;
7941 	}
7942 	else {
7943 	    shortbuffered = 0;
7944 	    /* remember that cnt can be negative */
7945 	    SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
7946 	}
7947     }
7948     else
7949 	shortbuffered = 0;
7950     bp = (STDCHAR*)SvPVX_const(sv) + append;  /* move these two too to registers */
7951     ptr = (STDCHAR*)PerlIO_get_ptr(fp);
7952     DEBUG_P(PerlIO_printf(Perl_debug_log,
7953 	"Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
7954     DEBUG_P(PerlIO_printf(Perl_debug_log,
7955 	"Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
7956 	       PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
7957 	       PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
7958     for (;;) {
7959       screamer:
7960 	if (cnt > 0) {
7961 	    if (rslen) {
7962 		while (cnt > 0) {		     /* this     |  eat */
7963 		    cnt--;
7964 		    if ((*bp++ = *ptr++) == rslast)  /* really   |  dust */
7965 			goto thats_all_folks;	     /* screams  |  sed :-) */
7966 		}
7967 	    }
7968 	    else {
7969 	        Copy(ptr, bp, cnt, char);	     /* this     |  eat */
7970 		bp += cnt;			     /* screams  |  dust */
7971 		ptr += cnt;			     /* louder   |  sed :-) */
7972 		cnt = 0;
7973 		assert (!shortbuffered);
7974 		goto cannot_be_shortbuffered;
7975 	    }
7976 	}
7977 
7978 	if (shortbuffered) {		/* oh well, must extend */
7979 	    cnt = shortbuffered;
7980 	    shortbuffered = 0;
7981 	    bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
7982 	    SvCUR_set(sv, bpx);
7983 	    SvGROW(sv, SvLEN(sv) + append + cnt + 2);
7984 	    bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
7985 	    continue;
7986 	}
7987 
7988     cannot_be_shortbuffered:
7989 	DEBUG_P(PerlIO_printf(Perl_debug_log,
7990 			      "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
7991 			      PTR2UV(ptr),(long)cnt));
7992 	PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
7993 
7994 	DEBUG_Pv(PerlIO_printf(Perl_debug_log,
7995 	    "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
7996 	    PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
7997 	    PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
7998 
7999 	/* This used to call 'filbuf' in stdio form, but as that behaves like
8000 	   getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
8001 	   another abstraction.  */
8002 	i   = PerlIO_getc(fp);		/* get more characters */
8003 
8004 	DEBUG_Pv(PerlIO_printf(Perl_debug_log,
8005 	    "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
8006 	    PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
8007 	    PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
8008 
8009 	cnt = PerlIO_get_cnt(fp);
8010 	ptr = (STDCHAR*)PerlIO_get_ptr(fp);	/* reregisterize cnt and ptr */
8011 	DEBUG_P(PerlIO_printf(Perl_debug_log,
8012 	    "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
8013 
8014 	if (i == EOF)			/* all done for ever? */
8015 	    goto thats_really_all_folks;
8016 
8017 	bpx = bp - (STDCHAR*)SvPVX_const(sv);	/* box up before relocation */
8018 	SvCUR_set(sv, bpx);
8019 	SvGROW(sv, bpx + cnt + 2);
8020 	bp = (STDCHAR*)SvPVX_const(sv) + bpx;	/* unbox after relocation */
8021 
8022 	*bp++ = (STDCHAR)i;		/* store character from PerlIO_getc */
8023 
8024 	if (rslen && (STDCHAR)i == rslast)  /* all done for now? */
8025 	    goto thats_all_folks;
8026     }
8027 
8028 thats_all_folks:
8029     if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX_const(sv)) < rslen) ||
8030 	  memNE((char*)bp - rslen, rsptr, rslen))
8031 	goto screamer;				/* go back to the fray */
8032 thats_really_all_folks:
8033     if (shortbuffered)
8034 	cnt += shortbuffered;
8035 	DEBUG_P(PerlIO_printf(Perl_debug_log,
8036 	    "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
8037     PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt);	/* put these back or we're in trouble */
8038     DEBUG_P(PerlIO_printf(Perl_debug_log,
8039 	"Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
8040 	PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
8041 	PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
8042     *bp = '\0';
8043     SvCUR_set(sv, bp - (STDCHAR*)SvPVX_const(sv));	/* set length */
8044     DEBUG_P(PerlIO_printf(Perl_debug_log,
8045 	"Screamer: done, len=%ld, string=|%.*s|\n",
8046 	(long)SvCUR(sv),(int)SvCUR(sv),SvPVX_const(sv)));
8047     }
8048    else
8049     {
8050        /*The big, slow, and stupid way. */
8051 #ifdef USE_HEAP_INSTEAD_OF_STACK	/* Even slower way. */
8052 	STDCHAR *buf = NULL;
8053 	Newx(buf, 8192, STDCHAR);
8054 	assert(buf);
8055 #else
8056 	STDCHAR buf[8192];
8057 #endif
8058 
8059 screamer2:
8060 	if (rslen) {
8061             const STDCHAR * const bpe = buf + sizeof(buf);
8062 	    bp = buf;
8063 	    while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
8064 		; /* keep reading */
8065 	    cnt = bp - buf;
8066 	}
8067 	else {
8068 	    cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
8069 	    /* Accommodate broken VAXC compiler, which applies U8 cast to
8070 	     * both args of ?: operator, causing EOF to change into 255
8071 	     */
8072 	    if (cnt > 0)
8073 		 i = (U8)buf[cnt - 1];
8074 	    else
8075 		 i = EOF;
8076 	}
8077 
8078 	if (cnt < 0)
8079 	    cnt = 0;  /* we do need to re-set the sv even when cnt <= 0 */
8080 	if (append)
8081             sv_catpvn_nomg(sv, (char *) buf, cnt);
8082 	else
8083             sv_setpvn(sv, (char *) buf, cnt);   /* "nomg" is implied */
8084 
8085 	if (i != EOF &&			/* joy */
8086 	    (!rslen ||
8087 	     SvCUR(sv) < rslen ||
8088 	     memNE(SvPVX_const(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
8089 	{
8090 	    append = -1;
8091 	    /*
8092 	     * If we're reading from a TTY and we get a short read,
8093 	     * indicating that the user hit his EOF character, we need
8094 	     * to notice it now, because if we try to read from the TTY
8095 	     * again, the EOF condition will disappear.
8096 	     *
8097 	     * The comparison of cnt to sizeof(buf) is an optimization
8098 	     * that prevents unnecessary calls to feof().
8099 	     *
8100 	     * - jik 9/25/96
8101 	     */
8102 	    if (!(cnt < (I32)sizeof(buf) && PerlIO_eof(fp)))
8103 		goto screamer2;
8104 	}
8105 
8106 #ifdef USE_HEAP_INSTEAD_OF_STACK
8107 	Safefree(buf);
8108 #endif
8109     }
8110 
8111     if (rspara) {		/* have to do this both before and after */
8112         while (i != EOF) {	/* to make sure file boundaries work right */
8113 	    i = PerlIO_getc(fp);
8114 	    if (i != '\n') {
8115 		PerlIO_ungetc(fp,i);
8116 		break;
8117 	    }
8118 	}
8119     }
8120 
8121     return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
8122 }
8123 
8124 /*
8125 =for apidoc sv_inc
8126 
8127 Auto-increment of the value in the SV, doing string to numeric conversion
8128 if necessary.  Handles 'get' magic and operator overloading.
8129 
8130 =cut
8131 */
8132 
8133 void
8134 Perl_sv_inc(pTHX_ SV *const sv)
8135 {
8136     if (!sv)
8137 	return;
8138     SvGETMAGIC(sv);
8139     sv_inc_nomg(sv);
8140 }
8141 
8142 /*
8143 =for apidoc sv_inc_nomg
8144 
8145 Auto-increment of the value in the SV, doing string to numeric conversion
8146 if necessary.  Handles operator overloading.  Skips handling 'get' magic.
8147 
8148 =cut
8149 */
8150 
8151 void
8152 Perl_sv_inc_nomg(pTHX_ SV *const sv)
8153 {
8154     dVAR;
8155     char *d;
8156     int flags;
8157 
8158     if (!sv)
8159 	return;
8160     if (SvTHINKFIRST(sv)) {
8161 	if (SvIsCOW(sv) || isGV_with_GP(sv))
8162 	    sv_force_normal_flags(sv, 0);
8163 	if (SvREADONLY(sv)) {
8164 	    if (IN_PERL_RUNTIME)
8165 		Perl_croak_no_modify();
8166 	}
8167 	if (SvROK(sv)) {
8168 	    IV i;
8169 	    if (SvAMAGIC(sv) && AMG_CALLunary(sv, inc_amg))
8170 		return;
8171 	    i = PTR2IV(SvRV(sv));
8172 	    sv_unref(sv);
8173 	    sv_setiv(sv, i);
8174 	}
8175     }
8176     flags = SvFLAGS(sv);
8177     if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
8178 	/* It's (privately or publicly) a float, but not tested as an
8179 	   integer, so test it to see. */
8180 	(void) SvIV(sv);
8181 	flags = SvFLAGS(sv);
8182     }
8183     if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
8184 	/* It's publicly an integer, or privately an integer-not-float */
8185 #ifdef PERL_PRESERVE_IVUV
8186       oops_its_int:
8187 #endif
8188 	if (SvIsUV(sv)) {
8189 	    if (SvUVX(sv) == UV_MAX)
8190 		sv_setnv(sv, UV_MAX_P1);
8191 	    else
8192 		(void)SvIOK_only_UV(sv);
8193 		SvUV_set(sv, SvUVX(sv) + 1);
8194 	} else {
8195 	    if (SvIVX(sv) == IV_MAX)
8196 		sv_setuv(sv, (UV)IV_MAX + 1);
8197 	    else {
8198 		(void)SvIOK_only(sv);
8199 		SvIV_set(sv, SvIVX(sv) + 1);
8200 	    }
8201 	}
8202 	return;
8203     }
8204     if (flags & SVp_NOK) {
8205 	const NV was = SvNVX(sv);
8206 	if (NV_OVERFLOWS_INTEGERS_AT &&
8207 	    was >= NV_OVERFLOWS_INTEGERS_AT) {
8208 	    /* diag_listed_as: Lost precision when %s %f by 1 */
8209 	    Perl_ck_warner(aTHX_ packWARN(WARN_IMPRECISION),
8210 			   "Lost precision when incrementing %" NVff " by 1",
8211 			   was);
8212 	}
8213 	(void)SvNOK_only(sv);
8214         SvNV_set(sv, was + 1.0);
8215 	return;
8216     }
8217 
8218     if (!(flags & SVp_POK) || !*SvPVX_const(sv)) {
8219 	if ((flags & SVTYPEMASK) < SVt_PVIV)
8220 	    sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV ? SVt_PVIV : SVt_IV));
8221 	(void)SvIOK_only(sv);
8222 	SvIV_set(sv, 1);
8223 	return;
8224     }
8225     d = SvPVX(sv);
8226     while (isALPHA(*d)) d++;
8227     while (isDIGIT(*d)) d++;
8228     if (d < SvEND(sv)) {
8229 #ifdef PERL_PRESERVE_IVUV
8230 	/* Got to punt this as an integer if needs be, but we don't issue
8231 	   warnings. Probably ought to make the sv_iv_please() that does
8232 	   the conversion if possible, and silently.  */
8233 	const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
8234 	if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
8235 	    /* Need to try really hard to see if it's an integer.
8236 	       9.22337203685478e+18 is an integer.
8237 	       but "9.22337203685478e+18" + 0 is UV=9223372036854779904
8238 	       so $a="9.22337203685478e+18"; $a+0; $a++
8239 	       needs to be the same as $a="9.22337203685478e+18"; $a++
8240 	       or we go insane. */
8241 
8242 	    (void) sv_2iv(sv);
8243 	    if (SvIOK(sv))
8244 		goto oops_its_int;
8245 
8246 	    /* sv_2iv *should* have made this an NV */
8247 	    if (flags & SVp_NOK) {
8248 		(void)SvNOK_only(sv);
8249                 SvNV_set(sv, SvNVX(sv) + 1.0);
8250 		return;
8251 	    }
8252 	    /* I don't think we can get here. Maybe I should assert this
8253 	       And if we do get here I suspect that sv_setnv will croak. NWC
8254 	       Fall through. */
8255 #if defined(USE_LONG_DOUBLE)
8256 	    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",
8257 				  SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
8258 #else
8259 	    DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_inc punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"NVgf"\n",
8260 				  SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
8261 #endif
8262 	}
8263 #endif /* PERL_PRESERVE_IVUV */
8264 	sv_setnv(sv,Atof(SvPVX_const(sv)) + 1.0);
8265 	return;
8266     }
8267     d--;
8268     while (d >= SvPVX_const(sv)) {
8269 	if (isDIGIT(*d)) {
8270 	    if (++*d <= '9')
8271 		return;
8272 	    *(d--) = '0';
8273 	}
8274 	else {
8275 #ifdef EBCDIC
8276 	    /* MKS: The original code here died if letters weren't consecutive.
8277 	     * at least it didn't have to worry about non-C locales.  The
8278 	     * new code assumes that ('z'-'a')==('Z'-'A'), letters are
8279 	     * arranged in order (although not consecutively) and that only
8280 	     * [A-Za-z] are accepted by isALPHA in the C locale.
8281 	     */
8282 	    if (*d != 'z' && *d != 'Z') {
8283 		do { ++*d; } while (!isALPHA(*d));
8284 		return;
8285 	    }
8286 	    *(d--) -= 'z' - 'a';
8287 #else
8288 	    ++*d;
8289 	    if (isALPHA(*d))
8290 		return;
8291 	    *(d--) -= 'z' - 'a' + 1;
8292 #endif
8293 	}
8294     }
8295     /* oh,oh, the number grew */
8296     SvGROW(sv, SvCUR(sv) + 2);
8297     SvCUR_set(sv, SvCUR(sv) + 1);
8298     for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX_const(sv); d--)
8299 	*d = d[-1];
8300     if (isDIGIT(d[1]))
8301 	*d = '1';
8302     else
8303 	*d = d[1];
8304 }
8305 
8306 /*
8307 =for apidoc sv_dec
8308 
8309 Auto-decrement of the value in the SV, doing string to numeric conversion
8310 if necessary.  Handles 'get' magic and operator overloading.
8311 
8312 =cut
8313 */
8314 
8315 void
8316 Perl_sv_dec(pTHX_ SV *const sv)
8317 {
8318     dVAR;
8319     if (!sv)
8320 	return;
8321     SvGETMAGIC(sv);
8322     sv_dec_nomg(sv);
8323 }
8324 
8325 /*
8326 =for apidoc sv_dec_nomg
8327 
8328 Auto-decrement of the value in the SV, doing string to numeric conversion
8329 if necessary.  Handles operator overloading.  Skips handling 'get' magic.
8330 
8331 =cut
8332 */
8333 
8334 void
8335 Perl_sv_dec_nomg(pTHX_ SV *const sv)
8336 {
8337     dVAR;
8338     int flags;
8339 
8340     if (!sv)
8341 	return;
8342     if (SvTHINKFIRST(sv)) {
8343 	if (SvIsCOW(sv) || isGV_with_GP(sv))
8344 	    sv_force_normal_flags(sv, 0);
8345 	if (SvREADONLY(sv)) {
8346 	    if (IN_PERL_RUNTIME)
8347 		Perl_croak_no_modify();
8348 	}
8349 	if (SvROK(sv)) {
8350 	    IV i;
8351 	    if (SvAMAGIC(sv) && AMG_CALLunary(sv, dec_amg))
8352 		return;
8353 	    i = PTR2IV(SvRV(sv));
8354 	    sv_unref(sv);
8355 	    sv_setiv(sv, i);
8356 	}
8357     }
8358     /* Unlike sv_inc we don't have to worry about string-never-numbers
8359        and keeping them magic. But we mustn't warn on punting */
8360     flags = SvFLAGS(sv);
8361     if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
8362 	/* It's publicly an integer, or privately an integer-not-float */
8363 #ifdef PERL_PRESERVE_IVUV
8364       oops_its_int:
8365 #endif
8366 	if (SvIsUV(sv)) {
8367 	    if (SvUVX(sv) == 0) {
8368 		(void)SvIOK_only(sv);
8369 		SvIV_set(sv, -1);
8370 	    }
8371 	    else {
8372 		(void)SvIOK_only_UV(sv);
8373 		SvUV_set(sv, SvUVX(sv) - 1);
8374 	    }
8375 	} else {
8376 	    if (SvIVX(sv) == IV_MIN) {
8377 		sv_setnv(sv, (NV)IV_MIN);
8378 		goto oops_its_num;
8379 	    }
8380 	    else {
8381 		(void)SvIOK_only(sv);
8382 		SvIV_set(sv, SvIVX(sv) - 1);
8383 	    }
8384 	}
8385 	return;
8386     }
8387     if (flags & SVp_NOK) {
8388     oops_its_num:
8389 	{
8390 	    const NV was = SvNVX(sv);
8391 	    if (NV_OVERFLOWS_INTEGERS_AT &&
8392 		was <= -NV_OVERFLOWS_INTEGERS_AT) {
8393 		/* diag_listed_as: Lost precision when %s %f by 1 */
8394 		Perl_ck_warner(aTHX_ packWARN(WARN_IMPRECISION),
8395 			       "Lost precision when decrementing %" NVff " by 1",
8396 			       was);
8397 	    }
8398 	    (void)SvNOK_only(sv);
8399 	    SvNV_set(sv, was - 1.0);
8400 	    return;
8401 	}
8402     }
8403     if (!(flags & SVp_POK)) {
8404 	if ((flags & SVTYPEMASK) < SVt_PVIV)
8405 	    sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV) ? SVt_PVIV : SVt_IV);
8406 	SvIV_set(sv, -1);
8407 	(void)SvIOK_only(sv);
8408 	return;
8409     }
8410 #ifdef PERL_PRESERVE_IVUV
8411     {
8412 	const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
8413 	if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
8414 	    /* Need to try really hard to see if it's an integer.
8415 	       9.22337203685478e+18 is an integer.
8416 	       but "9.22337203685478e+18" + 0 is UV=9223372036854779904
8417 	       so $a="9.22337203685478e+18"; $a+0; $a--
8418 	       needs to be the same as $a="9.22337203685478e+18"; $a--
8419 	       or we go insane. */
8420 
8421 	    (void) sv_2iv(sv);
8422 	    if (SvIOK(sv))
8423 		goto oops_its_int;
8424 
8425 	    /* sv_2iv *should* have made this an NV */
8426 	    if (flags & SVp_NOK) {
8427 		(void)SvNOK_only(sv);
8428                 SvNV_set(sv, SvNVX(sv) - 1.0);
8429 		return;
8430 	    }
8431 	    /* I don't think we can get here. Maybe I should assert this
8432 	       And if we do get here I suspect that sv_setnv will croak. NWC
8433 	       Fall through. */
8434 #if defined(USE_LONG_DOUBLE)
8435 	    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",
8436 				  SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
8437 #else
8438 	    DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_dec punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"NVgf"\n",
8439 				  SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
8440 #endif
8441 	}
8442     }
8443 #endif /* PERL_PRESERVE_IVUV */
8444     sv_setnv(sv,Atof(SvPVX_const(sv)) - 1.0);	/* punt */
8445 }
8446 
8447 /* this define is used to eliminate a chunk of duplicated but shared logic
8448  * it has the suffix __SV_C to signal that it isnt API, and isnt meant to be
8449  * used anywhere but here - yves
8450  */
8451 #define PUSH_EXTEND_MORTAL__SV_C(AnSv) \
8452     STMT_START {      \
8453 	EXTEND_MORTAL(1); \
8454 	PL_tmps_stack[++PL_tmps_ix] = (AnSv); \
8455     } STMT_END
8456 
8457 /*
8458 =for apidoc sv_mortalcopy
8459 
8460 Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
8461 The new SV is marked as mortal.  It will be destroyed "soon", either by an
8462 explicit call to FREETMPS, or by an implicit call at places such as
8463 statement boundaries.  See also C<sv_newmortal> and C<sv_2mortal>.
8464 
8465 =cut
8466 */
8467 
8468 /* Make a string that will exist for the duration of the expression
8469  * evaluation.  Actually, it may have to last longer than that, but
8470  * hopefully we won't free it until it has been assigned to a
8471  * permanent location. */
8472 
8473 SV *
8474 Perl_sv_mortalcopy_flags(pTHX_ SV *const oldstr, U32 flags)
8475 {
8476     dVAR;
8477     SV *sv;
8478 
8479     if (flags & SV_GMAGIC)
8480 	SvGETMAGIC(oldstr); /* before new_SV, in case it dies */
8481     new_SV(sv);
8482     sv_setsv_flags(sv,oldstr,flags & ~SV_GMAGIC);
8483     PUSH_EXTEND_MORTAL__SV_C(sv);
8484     SvTEMP_on(sv);
8485     return sv;
8486 }
8487 
8488 /*
8489 =for apidoc sv_newmortal
8490 
8491 Creates a new null SV which is mortal.  The reference count of the SV is
8492 set to 1.  It will be destroyed "soon", either by an explicit call to
8493 FREETMPS, or by an implicit call at places such as statement boundaries.
8494 See also C<sv_mortalcopy> and C<sv_2mortal>.
8495 
8496 =cut
8497 */
8498 
8499 SV *
8500 Perl_sv_newmortal(pTHX)
8501 {
8502     dVAR;
8503     SV *sv;
8504 
8505     new_SV(sv);
8506     SvFLAGS(sv) = SVs_TEMP;
8507     PUSH_EXTEND_MORTAL__SV_C(sv);
8508     return sv;
8509 }
8510 
8511 
8512 /*
8513 =for apidoc newSVpvn_flags
8514 
8515 Creates a new SV and copies a string into it.  The reference count for the
8516 SV is set to 1.  Note that if C<len> is zero, Perl will create a zero length
8517 string.  You are responsible for ensuring that the source string is at least
8518 C<len> bytes long.  If the C<s> argument is NULL the new SV will be undefined.
8519 Currently the only flag bits accepted are C<SVf_UTF8> and C<SVs_TEMP>.
8520 If C<SVs_TEMP> is set, then C<sv_2mortal()> is called on the result before
8521 returning.  If C<SVf_UTF8> is set, C<s>
8522 is considered to be in UTF-8 and the
8523 C<SVf_UTF8> flag will be set on the new SV.
8524 C<newSVpvn_utf8()> is a convenience wrapper for this function, defined as
8525 
8526     #define newSVpvn_utf8(s, len, u)			\
8527 	newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0)
8528 
8529 =cut
8530 */
8531 
8532 SV *
8533 Perl_newSVpvn_flags(pTHX_ const char *const s, const STRLEN len, const U32 flags)
8534 {
8535     dVAR;
8536     SV *sv;
8537 
8538     /* All the flags we don't support must be zero.
8539        And we're new code so I'm going to assert this from the start.  */
8540     assert(!(flags & ~(SVf_UTF8|SVs_TEMP)));
8541     new_SV(sv);
8542     sv_setpvn(sv,s,len);
8543 
8544     /* This code used to a sv_2mortal(), however we now unroll the call to sv_2mortal()
8545      * and do what it does ourselves here.
8546      * Since we have asserted that flags can only have the SVf_UTF8 and/or SVs_TEMP flags
8547      * set above we can use it to enable the sv flags directly (bypassing SvTEMP_on), which
8548      * in turn means we dont need to mask out the SVf_UTF8 flag below, which means that we
8549      * eliminate quite a few steps than it looks - Yves (explaining patch by gfx)
8550      */
8551 
8552     SvFLAGS(sv) |= flags;
8553 
8554     if(flags & SVs_TEMP){
8555 	PUSH_EXTEND_MORTAL__SV_C(sv);
8556     }
8557 
8558     return sv;
8559 }
8560 
8561 /*
8562 =for apidoc sv_2mortal
8563 
8564 Marks an existing SV as mortal.  The SV will be destroyed "soon", either
8565 by an explicit call to FREETMPS, or by an implicit call at places such as
8566 statement boundaries.  SvTEMP() is turned on which means that the SV's
8567 string buffer can be "stolen" if this SV is copied.  See also C<sv_newmortal>
8568 and C<sv_mortalcopy>.
8569 
8570 =cut
8571 */
8572 
8573 SV *
8574 Perl_sv_2mortal(pTHX_ SV *const sv)
8575 {
8576     dVAR;
8577     if (!sv)
8578 	return NULL;
8579     if (SvIMMORTAL(sv))
8580 	return sv;
8581     PUSH_EXTEND_MORTAL__SV_C(sv);
8582     SvTEMP_on(sv);
8583     return sv;
8584 }
8585 
8586 /*
8587 =for apidoc newSVpv
8588 
8589 Creates a new SV and copies a string into it.  The reference count for the
8590 SV is set to 1.  If C<len> is zero, Perl will compute the length using
8591 strlen().  For efficiency, consider using C<newSVpvn> instead.
8592 
8593 =cut
8594 */
8595 
8596 SV *
8597 Perl_newSVpv(pTHX_ const char *const s, const STRLEN len)
8598 {
8599     dVAR;
8600     SV *sv;
8601 
8602     new_SV(sv);
8603     sv_setpvn(sv, s, len || s == NULL ? len : strlen(s));
8604     return sv;
8605 }
8606 
8607 /*
8608 =for apidoc newSVpvn
8609 
8610 Creates a new SV and copies a buffer into it, which may contain NUL characters
8611 (C<\0>) and other binary data.  The reference count for the SV is set to 1.
8612 Note that if C<len> is zero, Perl will create a zero length (Perl) string.  You
8613 are responsible for ensuring that the source buffer is at least
8614 C<len> bytes long.  If the C<buffer> argument is NULL the new SV will be
8615 undefined.
8616 
8617 =cut
8618 */
8619 
8620 SV *
8621 Perl_newSVpvn(pTHX_ const char *const buffer, const STRLEN len)
8622 {
8623     dVAR;
8624     SV *sv;
8625 
8626     new_SV(sv);
8627     sv_setpvn(sv,buffer,len);
8628     return sv;
8629 }
8630 
8631 /*
8632 =for apidoc newSVhek
8633 
8634 Creates a new SV from the hash key structure.  It will generate scalars that
8635 point to the shared string table where possible.  Returns a new (undefined)
8636 SV if the hek is NULL.
8637 
8638 =cut
8639 */
8640 
8641 SV *
8642 Perl_newSVhek(pTHX_ const HEK *const hek)
8643 {
8644     dVAR;
8645     if (!hek) {
8646 	SV *sv;
8647 
8648 	new_SV(sv);
8649 	return sv;
8650     }
8651 
8652     if (HEK_LEN(hek) == HEf_SVKEY) {
8653 	return newSVsv(*(SV**)HEK_KEY(hek));
8654     } else {
8655 	const int flags = HEK_FLAGS(hek);
8656 	if (flags & HVhek_WASUTF8) {
8657 	    /* Trouble :-)
8658 	       Andreas would like keys he put in as utf8 to come back as utf8
8659 	    */
8660 	    STRLEN utf8_len = HEK_LEN(hek);
8661 	    SV * const sv = newSV_type(SVt_PV);
8662 	    char *as_utf8 = (char *)bytes_to_utf8 ((U8*)HEK_KEY(hek), &utf8_len);
8663 	    /* bytes_to_utf8() allocates a new string, which we can repurpose: */
8664 	    sv_usepvn_flags(sv, as_utf8, utf8_len, SV_HAS_TRAILING_NUL);
8665 	    SvUTF8_on (sv);
8666 	    return sv;
8667         } else if (flags & HVhek_UNSHARED) {
8668             /* A hash that isn't using shared hash keys has to have
8669 	       the flag in every key so that we know not to try to call
8670 	       share_hek_hek on it.  */
8671 
8672 	    SV * const sv = newSVpvn (HEK_KEY(hek), HEK_LEN(hek));
8673 	    if (HEK_UTF8(hek))
8674 		SvUTF8_on (sv);
8675 	    return sv;
8676 	}
8677 	/* This will be overwhelminly the most common case.  */
8678 	{
8679 	    /* Inline most of newSVpvn_share(), because share_hek_hek() is far
8680 	       more efficient than sharepvn().  */
8681 	    SV *sv;
8682 
8683 	    new_SV(sv);
8684 	    sv_upgrade(sv, SVt_PV);
8685 	    SvPV_set(sv, (char *)HEK_KEY(share_hek_hek(hek)));
8686 	    SvCUR_set(sv, HEK_LEN(hek));
8687 	    SvLEN_set(sv, 0);
8688 	    SvIsCOW_on(sv);
8689 	    SvPOK_on(sv);
8690 	    if (HEK_UTF8(hek))
8691 		SvUTF8_on(sv);
8692 	    return sv;
8693 	}
8694     }
8695 }
8696 
8697 /*
8698 =for apidoc newSVpvn_share
8699 
8700 Creates a new SV with its SvPVX_const pointing to a shared string in the string
8701 table.  If the string does not already exist in the table, it is
8702 created first.  Turns on the SvIsCOW flag (or READONLY
8703 and FAKE in 5.16 and earlier).  If the C<hash> parameter
8704 is non-zero, that value is used; otherwise the hash is computed.
8705 The string's hash can later be retrieved from the SV
8706 with the C<SvSHARED_HASH()> macro.  The idea here is
8707 that as the string table is used for shared hash keys these strings will have
8708 SvPVX_const == HeKEY and hash lookup will avoid string compare.
8709 
8710 =cut
8711 */
8712 
8713 SV *
8714 Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
8715 {
8716     dVAR;
8717     SV *sv;
8718     bool is_utf8 = FALSE;
8719     const char *const orig_src = src;
8720 
8721     if (len < 0) {
8722 	STRLEN tmplen = -len;
8723         is_utf8 = TRUE;
8724 	/* See the note in hv.c:hv_fetch() --jhi */
8725 	src = (char*)bytes_from_utf8((const U8*)src, &tmplen, &is_utf8);
8726 	len = tmplen;
8727     }
8728     if (!hash)
8729 	PERL_HASH(hash, src, len);
8730     new_SV(sv);
8731     /* The logic for this is inlined in S_mro_get_linear_isa_dfs(), so if it
8732        changes here, update it there too.  */
8733     sv_upgrade(sv, SVt_PV);
8734     SvPV_set(sv, sharepvn(src, is_utf8?-len:len, hash));
8735     SvCUR_set(sv, len);
8736     SvLEN_set(sv, 0);
8737     SvIsCOW_on(sv);
8738     SvPOK_on(sv);
8739     if (is_utf8)
8740         SvUTF8_on(sv);
8741     if (src != orig_src)
8742 	Safefree(src);
8743     return sv;
8744 }
8745 
8746 /*
8747 =for apidoc newSVpv_share
8748 
8749 Like C<newSVpvn_share>, but takes a nul-terminated string instead of a
8750 string/length pair.
8751 
8752 =cut
8753 */
8754 
8755 SV *
8756 Perl_newSVpv_share(pTHX_ const char *src, U32 hash)
8757 {
8758     return newSVpvn_share(src, strlen(src), hash);
8759 }
8760 
8761 #if defined(PERL_IMPLICIT_CONTEXT)
8762 
8763 /* pTHX_ magic can't cope with varargs, so this is a no-context
8764  * version of the main function, (which may itself be aliased to us).
8765  * Don't access this version directly.
8766  */
8767 
8768 SV *
8769 Perl_newSVpvf_nocontext(const char *const pat, ...)
8770 {
8771     dTHX;
8772     SV *sv;
8773     va_list args;
8774 
8775     PERL_ARGS_ASSERT_NEWSVPVF_NOCONTEXT;
8776 
8777     va_start(args, pat);
8778     sv = vnewSVpvf(pat, &args);
8779     va_end(args);
8780     return sv;
8781 }
8782 #endif
8783 
8784 /*
8785 =for apidoc newSVpvf
8786 
8787 Creates a new SV and initializes it with the string formatted like
8788 C<sprintf>.
8789 
8790 =cut
8791 */
8792 
8793 SV *
8794 Perl_newSVpvf(pTHX_ const char *const pat, ...)
8795 {
8796     SV *sv;
8797     va_list args;
8798 
8799     PERL_ARGS_ASSERT_NEWSVPVF;
8800 
8801     va_start(args, pat);
8802     sv = vnewSVpvf(pat, &args);
8803     va_end(args);
8804     return sv;
8805 }
8806 
8807 /* backend for newSVpvf() and newSVpvf_nocontext() */
8808 
8809 SV *
8810 Perl_vnewSVpvf(pTHX_ const char *const pat, va_list *const args)
8811 {
8812     dVAR;
8813     SV *sv;
8814 
8815     PERL_ARGS_ASSERT_VNEWSVPVF;
8816 
8817     new_SV(sv);
8818     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
8819     return sv;
8820 }
8821 
8822 /*
8823 =for apidoc newSVnv
8824 
8825 Creates a new SV and copies a floating point value into it.
8826 The reference count for the SV is set to 1.
8827 
8828 =cut
8829 */
8830 
8831 SV *
8832 Perl_newSVnv(pTHX_ const NV n)
8833 {
8834     dVAR;
8835     SV *sv;
8836 
8837     new_SV(sv);
8838     sv_setnv(sv,n);
8839     return sv;
8840 }
8841 
8842 /*
8843 =for apidoc newSViv
8844 
8845 Creates a new SV and copies an integer into it.  The reference count for the
8846 SV is set to 1.
8847 
8848 =cut
8849 */
8850 
8851 SV *
8852 Perl_newSViv(pTHX_ const IV i)
8853 {
8854     dVAR;
8855     SV *sv;
8856 
8857     new_SV(sv);
8858     sv_setiv(sv,i);
8859     return sv;
8860 }
8861 
8862 /*
8863 =for apidoc newSVuv
8864 
8865 Creates a new SV and copies an unsigned integer into it.
8866 The reference count for the SV is set to 1.
8867 
8868 =cut
8869 */
8870 
8871 SV *
8872 Perl_newSVuv(pTHX_ const UV u)
8873 {
8874     dVAR;
8875     SV *sv;
8876 
8877     new_SV(sv);
8878     sv_setuv(sv,u);
8879     return sv;
8880 }
8881 
8882 /*
8883 =for apidoc newSV_type
8884 
8885 Creates a new SV, of the type specified.  The reference count for the new SV
8886 is set to 1.
8887 
8888 =cut
8889 */
8890 
8891 SV *
8892 Perl_newSV_type(pTHX_ const svtype type)
8893 {
8894     SV *sv;
8895 
8896     new_SV(sv);
8897     sv_upgrade(sv, type);
8898     return sv;
8899 }
8900 
8901 /*
8902 =for apidoc newRV_noinc
8903 
8904 Creates an RV wrapper for an SV.  The reference count for the original
8905 SV is B<not> incremented.
8906 
8907 =cut
8908 */
8909 
8910 SV *
8911 Perl_newRV_noinc(pTHX_ SV *const tmpRef)
8912 {
8913     dVAR;
8914     SV *sv = newSV_type(SVt_IV);
8915 
8916     PERL_ARGS_ASSERT_NEWRV_NOINC;
8917 
8918     SvTEMP_off(tmpRef);
8919     SvRV_set(sv, tmpRef);
8920     SvROK_on(sv);
8921     return sv;
8922 }
8923 
8924 /* newRV_inc is the official function name to use now.
8925  * newRV_inc is in fact #defined to newRV in sv.h
8926  */
8927 
8928 SV *
8929 Perl_newRV(pTHX_ SV *const sv)
8930 {
8931     dVAR;
8932 
8933     PERL_ARGS_ASSERT_NEWRV;
8934 
8935     return newRV_noinc(SvREFCNT_inc_simple_NN(sv));
8936 }
8937 
8938 /*
8939 =for apidoc newSVsv
8940 
8941 Creates a new SV which is an exact duplicate of the original SV.
8942 (Uses C<sv_setsv>.)
8943 
8944 =cut
8945 */
8946 
8947 SV *
8948 Perl_newSVsv(pTHX_ SV *const old)
8949 {
8950     dVAR;
8951     SV *sv;
8952 
8953     if (!old)
8954 	return NULL;
8955     if (SvTYPE(old) == (svtype)SVTYPEMASK) {
8956 	Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
8957 	return NULL;
8958     }
8959     /* Do this here, otherwise we leak the new SV if this croaks. */
8960     SvGETMAGIC(old);
8961     new_SV(sv);
8962     /* SV_NOSTEAL prevents TEMP buffers being, well, stolen, and saves games
8963        with SvTEMP_off and SvTEMP_on round a call to sv_setsv.  */
8964     sv_setsv_flags(sv, old, SV_NOSTEAL);
8965     return sv;
8966 }
8967 
8968 /*
8969 =for apidoc sv_reset
8970 
8971 Underlying implementation for the C<reset> Perl function.
8972 Note that the perl-level function is vaguely deprecated.
8973 
8974 =cut
8975 */
8976 
8977 void
8978 Perl_sv_reset(pTHX_ const char *s, HV *const stash)
8979 {
8980     PERL_ARGS_ASSERT_SV_RESET;
8981 
8982     sv_resetpvn(*s ? s : NULL, strlen(s), stash);
8983 }
8984 
8985 void
8986 Perl_sv_resetpvn(pTHX_ const char *s, STRLEN len, HV * const stash)
8987 {
8988     dVAR;
8989     char todo[PERL_UCHAR_MAX+1];
8990     const char *send;
8991 
8992     if (!stash)
8993 	return;
8994 
8995     if (!s) {		/* reset ?? searches */
8996 	MAGIC * const mg = mg_find((const SV *)stash, PERL_MAGIC_symtab);
8997 	if (mg) {
8998 	    const U32 count = mg->mg_len / sizeof(PMOP**);
8999 	    PMOP **pmp = (PMOP**) mg->mg_ptr;
9000 	    PMOP *const *const end = pmp + count;
9001 
9002 	    while (pmp < end) {
9003 #ifdef USE_ITHREADS
9004                 SvREADONLY_off(PL_regex_pad[(*pmp)->op_pmoffset]);
9005 #else
9006 		(*pmp)->op_pmflags &= ~PMf_USED;
9007 #endif
9008 		++pmp;
9009 	    }
9010 	}
9011 	return;
9012     }
9013 
9014     /* reset variables */
9015 
9016     if (!HvARRAY(stash))
9017 	return;
9018 
9019     Zero(todo, 256, char);
9020     send = s + len;
9021     while (s < send) {
9022 	I32 max;
9023 	I32 i = (unsigned char)*s;
9024 	if (s[1] == '-') {
9025 	    s += 2;
9026 	}
9027 	max = (unsigned char)*s++;
9028 	for ( ; i <= max; i++) {
9029 	    todo[i] = 1;
9030 	}
9031 	for (i = 0; i <= (I32) HvMAX(stash); i++) {
9032 	    HE *entry;
9033 	    for (entry = HvARRAY(stash)[i];
9034 		 entry;
9035 		 entry = HeNEXT(entry))
9036 	    {
9037 		GV *gv;
9038 		SV *sv;
9039 
9040 		if (!todo[(U8)*HeKEY(entry)])
9041 		    continue;
9042 		gv = MUTABLE_GV(HeVAL(entry));
9043 		sv = GvSV(gv);
9044 		if (sv) {
9045 		    if (SvTHINKFIRST(sv)) {
9046 			if (!SvREADONLY(sv) && SvROK(sv))
9047 			    sv_unref(sv);
9048 			/* XXX Is this continue a bug? Why should THINKFIRST
9049 			   exempt us from resetting arrays and hashes?  */
9050 			continue;
9051 		    }
9052 		    SvOK_off(sv);
9053 		    if (SvTYPE(sv) >= SVt_PV) {
9054 			SvCUR_set(sv, 0);
9055 			if (SvPVX_const(sv) != NULL)
9056 			    *SvPVX(sv) = '\0';
9057 			SvTAINT(sv);
9058 		    }
9059 		}
9060 		if (GvAV(gv)) {
9061 		    av_clear(GvAV(gv));
9062 		}
9063 		if (GvHV(gv) && !HvNAME_get(GvHV(gv))) {
9064 #if defined(VMS)
9065 		    Perl_die(aTHX_ "Can't reset %%ENV on this system");
9066 #else /* ! VMS */
9067 		    hv_clear(GvHV(gv));
9068 #  if defined(USE_ENVIRON_ARRAY)
9069 		    if (gv == PL_envgv)
9070 		        my_clearenv();
9071 #  endif /* USE_ENVIRON_ARRAY */
9072 #endif /* VMS */
9073 		}
9074 	    }
9075 	}
9076     }
9077 }
9078 
9079 /*
9080 =for apidoc sv_2io
9081 
9082 Using various gambits, try to get an IO from an SV: the IO slot if its a
9083 GV; or the recursive result if we're an RV; or the IO slot of the symbol
9084 named after the PV if we're a string.
9085 
9086 'Get' magic is ignored on the sv passed in, but will be called on
9087 C<SvRV(sv)> if sv is an RV.
9088 
9089 =cut
9090 */
9091 
9092 IO*
9093 Perl_sv_2io(pTHX_ SV *const sv)
9094 {
9095     IO* io;
9096     GV* gv;
9097 
9098     PERL_ARGS_ASSERT_SV_2IO;
9099 
9100     switch (SvTYPE(sv)) {
9101     case SVt_PVIO:
9102 	io = MUTABLE_IO(sv);
9103 	break;
9104     case SVt_PVGV:
9105     case SVt_PVLV:
9106 	if (isGV_with_GP(sv)) {
9107 	    gv = MUTABLE_GV(sv);
9108 	    io = GvIO(gv);
9109 	    if (!io)
9110 		Perl_croak(aTHX_ "Bad filehandle: %"HEKf,
9111                                     HEKfARG(GvNAME_HEK(gv)));
9112 	    break;
9113 	}
9114 	/* FALL THROUGH */
9115     default:
9116 	if (!SvOK(sv))
9117 	    Perl_croak(aTHX_ PL_no_usym, "filehandle");
9118 	if (SvROK(sv)) {
9119 	    SvGETMAGIC(SvRV(sv));
9120 	    return sv_2io(SvRV(sv));
9121 	}
9122 	gv = gv_fetchsv_nomg(sv, 0, SVt_PVIO);
9123 	if (gv)
9124 	    io = GvIO(gv);
9125 	else
9126 	    io = 0;
9127 	if (!io) {
9128 	    SV *newsv = sv;
9129 	    if (SvGMAGICAL(sv)) {
9130 		newsv = sv_newmortal();
9131 		sv_setsv_nomg(newsv, sv);
9132 	    }
9133 	    Perl_croak(aTHX_ "Bad filehandle: %"SVf, SVfARG(newsv));
9134 	}
9135 	break;
9136     }
9137     return io;
9138 }
9139 
9140 /*
9141 =for apidoc sv_2cv
9142 
9143 Using various gambits, try to get a CV from an SV; in addition, try if
9144 possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
9145 The flags in C<lref> are passed to gv_fetchsv.
9146 
9147 =cut
9148 */
9149 
9150 CV *
9151 Perl_sv_2cv(pTHX_ SV *sv, HV **const st, GV **const gvp, const I32 lref)
9152 {
9153     dVAR;
9154     GV *gv = NULL;
9155     CV *cv = NULL;
9156 
9157     PERL_ARGS_ASSERT_SV_2CV;
9158 
9159     if (!sv) {
9160 	*st = NULL;
9161 	*gvp = NULL;
9162 	return NULL;
9163     }
9164     switch (SvTYPE(sv)) {
9165     case SVt_PVCV:
9166 	*st = CvSTASH(sv);
9167 	*gvp = NULL;
9168 	return MUTABLE_CV(sv);
9169     case SVt_PVHV:
9170     case SVt_PVAV:
9171 	*st = NULL;
9172 	*gvp = NULL;
9173 	return NULL;
9174     default:
9175 	SvGETMAGIC(sv);
9176 	if (SvROK(sv)) {
9177 	    if (SvAMAGIC(sv))
9178 		sv = amagic_deref_call(sv, to_cv_amg);
9179 
9180 	    sv = SvRV(sv);
9181 	    if (SvTYPE(sv) == SVt_PVCV) {
9182 		cv = MUTABLE_CV(sv);
9183 		*gvp = NULL;
9184 		*st = CvSTASH(cv);
9185 		return cv;
9186 	    }
9187 	    else if(SvGETMAGIC(sv), isGV_with_GP(sv))
9188 		gv = MUTABLE_GV(sv);
9189 	    else
9190 		Perl_croak(aTHX_ "Not a subroutine reference");
9191 	}
9192 	else if (isGV_with_GP(sv)) {
9193 	    gv = MUTABLE_GV(sv);
9194 	}
9195 	else {
9196 	    gv = gv_fetchsv_nomg(sv, lref, SVt_PVCV);
9197 	}
9198 	*gvp = gv;
9199 	if (!gv) {
9200 	    *st = NULL;
9201 	    return NULL;
9202 	}
9203 	/* Some flags to gv_fetchsv mean don't really create the GV  */
9204 	if (!isGV_with_GP(gv)) {
9205 	    *st = NULL;
9206 	    return NULL;
9207 	}
9208 	*st = GvESTASH(gv);
9209 	if (lref & ~GV_ADDMG && !GvCVu(gv)) {
9210 	    /* XXX this is probably not what they think they're getting.
9211 	     * It has the same effect as "sub name;", i.e. just a forward
9212 	     * declaration! */
9213 	    newSTUB(gv,0);
9214 	}
9215 	return GvCVu(gv);
9216     }
9217 }
9218 
9219 /*
9220 =for apidoc sv_true
9221 
9222 Returns true if the SV has a true value by Perl's rules.
9223 Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
9224 instead use an in-line version.
9225 
9226 =cut
9227 */
9228 
9229 I32
9230 Perl_sv_true(pTHX_ SV *const sv)
9231 {
9232     if (!sv)
9233 	return 0;
9234     if (SvPOK(sv)) {
9235 	const XPV* const tXpv = (XPV*)SvANY(sv);
9236 	if (tXpv &&
9237 		(tXpv->xpv_cur > 1 ||
9238 		(tXpv->xpv_cur && *sv->sv_u.svu_pv != '0')))
9239 	    return 1;
9240 	else
9241 	    return 0;
9242     }
9243     else {
9244 	if (SvIOK(sv))
9245 	    return SvIVX(sv) != 0;
9246 	else {
9247 	    if (SvNOK(sv))
9248 		return SvNVX(sv) != 0.0;
9249 	    else
9250 		return sv_2bool(sv);
9251 	}
9252     }
9253 }
9254 
9255 /*
9256 =for apidoc sv_pvn_force
9257 
9258 Get a sensible string out of the SV somehow.
9259 A private implementation of the C<SvPV_force> macro for compilers which
9260 can't cope with complex macro expressions.  Always use the macro instead.
9261 
9262 =for apidoc sv_pvn_force_flags
9263 
9264 Get a sensible string out of the SV somehow.
9265 If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
9266 appropriate, else not.  C<sv_pvn_force> and C<sv_pvn_force_nomg> are
9267 implemented in terms of this function.
9268 You normally want to use the various wrapper macros instead: see
9269 C<SvPV_force> and C<SvPV_force_nomg>
9270 
9271 =cut
9272 */
9273 
9274 char *
9275 Perl_sv_pvn_force_flags(pTHX_ SV *const sv, STRLEN *const lp, const I32 flags)
9276 {
9277     dVAR;
9278 
9279     PERL_ARGS_ASSERT_SV_PVN_FORCE_FLAGS;
9280 
9281     if (flags & SV_GMAGIC) SvGETMAGIC(sv);
9282     if (SvTHINKFIRST(sv) && !SvROK(sv))
9283         sv_force_normal_flags(sv, 0);
9284 
9285     if (SvPOK(sv)) {
9286 	if (lp)
9287 	    *lp = SvCUR(sv);
9288     }
9289     else {
9290 	char *s;
9291 	STRLEN len;
9292 
9293 	if (SvREADONLY(sv) && !(flags & SV_MUTABLE_RETURN)) {
9294 	    const char * const ref = sv_reftype(sv,0);
9295 	    if (PL_op)
9296 		Perl_croak(aTHX_ "Can't coerce readonly %s to string in %s",
9297 			   ref, OP_DESC(PL_op));
9298 	    else
9299 		Perl_croak(aTHX_ "Can't coerce readonly %s to string", ref);
9300 	}
9301 	if (SvTYPE(sv) > SVt_PVLV
9302 	    || isGV_with_GP(sv))
9303 	    /* diag_listed_as: Can't coerce %s to %s in %s */
9304 	    Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
9305 		OP_DESC(PL_op));
9306 	s = sv_2pv_flags(sv, &len, flags &~ SV_GMAGIC);
9307 	if (!s) {
9308 	  s = (char *)"";
9309 	}
9310 	if (lp)
9311 	    *lp = len;
9312 
9313 	if (s != SvPVX_const(sv)) {	/* Almost, but not quite, sv_setpvn() */
9314 	    if (SvROK(sv))
9315 		sv_unref(sv);
9316 	    SvUPGRADE(sv, SVt_PV);		/* Never FALSE */
9317 	    SvGROW(sv, len + 1);
9318 	    Move(s,SvPVX(sv),len,char);
9319 	    SvCUR_set(sv, len);
9320 	    SvPVX(sv)[len] = '\0';
9321 	}
9322 	if (!SvPOK(sv)) {
9323 	    SvPOK_on(sv);		/* validate pointer */
9324 	    SvTAINT(sv);
9325 	    DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
9326 				  PTR2UV(sv),SvPVX_const(sv)));
9327 	}
9328     }
9329     (void)SvPOK_only_UTF8(sv);
9330     return SvPVX_mutable(sv);
9331 }
9332 
9333 /*
9334 =for apidoc sv_pvbyten_force
9335 
9336 The backend for the C<SvPVbytex_force> macro.  Always use the macro
9337 instead.
9338 
9339 =cut
9340 */
9341 
9342 char *
9343 Perl_sv_pvbyten_force(pTHX_ SV *const sv, STRLEN *const lp)
9344 {
9345     PERL_ARGS_ASSERT_SV_PVBYTEN_FORCE;
9346 
9347     sv_pvn_force(sv,lp);
9348     sv_utf8_downgrade(sv,0);
9349     *lp = SvCUR(sv);
9350     return SvPVX(sv);
9351 }
9352 
9353 /*
9354 =for apidoc sv_pvutf8n_force
9355 
9356 The backend for the C<SvPVutf8x_force> macro.  Always use the macro
9357 instead.
9358 
9359 =cut
9360 */
9361 
9362 char *
9363 Perl_sv_pvutf8n_force(pTHX_ SV *const sv, STRLEN *const lp)
9364 {
9365     PERL_ARGS_ASSERT_SV_PVUTF8N_FORCE;
9366 
9367     sv_pvn_force(sv,0);
9368     sv_utf8_upgrade_nomg(sv);
9369     *lp = SvCUR(sv);
9370     return SvPVX(sv);
9371 }
9372 
9373 /*
9374 =for apidoc sv_reftype
9375 
9376 Returns a string describing what the SV is a reference to.
9377 
9378 =cut
9379 */
9380 
9381 const char *
9382 Perl_sv_reftype(pTHX_ const SV *const sv, const int ob)
9383 {
9384     PERL_ARGS_ASSERT_SV_REFTYPE;
9385     if (ob && SvOBJECT(sv)) {
9386 	return SvPV_nolen_const(sv_ref(NULL, sv, ob));
9387     }
9388     else {
9389 	switch (SvTYPE(sv)) {
9390 	case SVt_NULL:
9391 	case SVt_IV:
9392 	case SVt_NV:
9393 	case SVt_PV:
9394 	case SVt_PVIV:
9395 	case SVt_PVNV:
9396 	case SVt_PVMG:
9397 				if (SvVOK(sv))
9398 				    return "VSTRING";
9399 				if (SvROK(sv))
9400 				    return "REF";
9401 				else
9402 				    return "SCALAR";
9403 
9404 	case SVt_PVLV:		return (char *)  (SvROK(sv) ? "REF"
9405 				/* tied lvalues should appear to be
9406 				 * scalars for backwards compatibility */
9407 				: (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
9408 				    ? "SCALAR" : "LVALUE");
9409 	case SVt_PVAV:		return "ARRAY";
9410 	case SVt_PVHV:		return "HASH";
9411 	case SVt_PVCV:		return "CODE";
9412 	case SVt_PVGV:		return (char *) (isGV_with_GP(sv)
9413 				    ? "GLOB" : "SCALAR");
9414 	case SVt_PVFM:		return "FORMAT";
9415 	case SVt_PVIO:		return "IO";
9416 	case SVt_BIND:		return "BIND";
9417 	case SVt_REGEXP:	return "REGEXP";
9418 	default:		return "UNKNOWN";
9419 	}
9420     }
9421 }
9422 
9423 /*
9424 =for apidoc sv_ref
9425 
9426 Returns a SV describing what the SV passed in is a reference to.
9427 
9428 =cut
9429 */
9430 
9431 SV *
9432 Perl_sv_ref(pTHX_ SV *dst, const SV *const sv, const int ob)
9433 {
9434     PERL_ARGS_ASSERT_SV_REF;
9435 
9436     if (!dst)
9437         dst = sv_newmortal();
9438 
9439     if (ob && SvOBJECT(sv)) {
9440 	HvNAME_get(SvSTASH(sv))
9441                     ? sv_sethek(dst, HvNAME_HEK(SvSTASH(sv)))
9442                     : sv_setpvn(dst, "__ANON__", 8);
9443     }
9444     else {
9445         const char * reftype = sv_reftype(sv, 0);
9446         sv_setpv(dst, reftype);
9447     }
9448     return dst;
9449 }
9450 
9451 /*
9452 =for apidoc sv_isobject
9453 
9454 Returns a boolean indicating whether the SV is an RV pointing to a blessed
9455 object.  If the SV is not an RV, or if the object is not blessed, then this
9456 will return false.
9457 
9458 =cut
9459 */
9460 
9461 int
9462 Perl_sv_isobject(pTHX_ SV *sv)
9463 {
9464     if (!sv)
9465 	return 0;
9466     SvGETMAGIC(sv);
9467     if (!SvROK(sv))
9468 	return 0;
9469     sv = SvRV(sv);
9470     if (!SvOBJECT(sv))
9471 	return 0;
9472     return 1;
9473 }
9474 
9475 /*
9476 =for apidoc sv_isa
9477 
9478 Returns a boolean indicating whether the SV is blessed into the specified
9479 class.  This does not check for subtypes; use C<sv_derived_from> to verify
9480 an inheritance relationship.
9481 
9482 =cut
9483 */
9484 
9485 int
9486 Perl_sv_isa(pTHX_ SV *sv, const char *const name)
9487 {
9488     const char *hvname;
9489 
9490     PERL_ARGS_ASSERT_SV_ISA;
9491 
9492     if (!sv)
9493 	return 0;
9494     SvGETMAGIC(sv);
9495     if (!SvROK(sv))
9496 	return 0;
9497     sv = SvRV(sv);
9498     if (!SvOBJECT(sv))
9499 	return 0;
9500     hvname = HvNAME_get(SvSTASH(sv));
9501     if (!hvname)
9502 	return 0;
9503 
9504     return strEQ(hvname, name);
9505 }
9506 
9507 /*
9508 =for apidoc newSVrv
9509 
9510 Creates a new SV for the existing RV, C<rv>, to point to.  If C<rv> is not an
9511 RV then it will be upgraded to one.  If C<classname> is non-null then the new
9512 SV will be blessed in the specified package.  The new SV is returned and its
9513 reference count is 1. The reference count 1 is owned by C<rv>.
9514 
9515 =cut
9516 */
9517 
9518 SV*
9519 Perl_newSVrv(pTHX_ SV *const rv, const char *const classname)
9520 {
9521     dVAR;
9522     SV *sv;
9523 
9524     PERL_ARGS_ASSERT_NEWSVRV;
9525 
9526     new_SV(sv);
9527 
9528     SV_CHECK_THINKFIRST_COW_DROP(rv);
9529 
9530     if (SvTYPE(rv) >= SVt_PVMG) {
9531 	const U32 refcnt = SvREFCNT(rv);
9532 	SvREFCNT(rv) = 0;
9533 	sv_clear(rv);
9534 	SvFLAGS(rv) = 0;
9535 	SvREFCNT(rv) = refcnt;
9536 
9537 	sv_upgrade(rv, SVt_IV);
9538     } else if (SvROK(rv)) {
9539 	SvREFCNT_dec(SvRV(rv));
9540     } else {
9541 	prepare_SV_for_RV(rv);
9542     }
9543 
9544     SvOK_off(rv);
9545     SvRV_set(rv, sv);
9546     SvROK_on(rv);
9547 
9548     if (classname) {
9549 	HV* const stash = gv_stashpv(classname, GV_ADD);
9550 	(void)sv_bless(rv, stash);
9551     }
9552     return sv;
9553 }
9554 
9555 /*
9556 =for apidoc sv_setref_pv
9557 
9558 Copies a pointer into a new SV, optionally blessing the SV.  The C<rv>
9559 argument will be upgraded to an RV.  That RV will be modified to point to
9560 the new SV.  If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
9561 into the SV.  The C<classname> argument indicates the package for the
9562 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
9563 will have a reference count of 1, and the RV will be returned.
9564 
9565 Do not use with other Perl types such as HV, AV, SV, CV, because those
9566 objects will become corrupted by the pointer copy process.
9567 
9568 Note that C<sv_setref_pvn> copies the string while this copies the pointer.
9569 
9570 =cut
9571 */
9572 
9573 SV*
9574 Perl_sv_setref_pv(pTHX_ SV *const rv, const char *const classname, void *const pv)
9575 {
9576     dVAR;
9577 
9578     PERL_ARGS_ASSERT_SV_SETREF_PV;
9579 
9580     if (!pv) {
9581 	sv_setsv(rv, &PL_sv_undef);
9582 	SvSETMAGIC(rv);
9583     }
9584     else
9585 	sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
9586     return rv;
9587 }
9588 
9589 /*
9590 =for apidoc sv_setref_iv
9591 
9592 Copies an integer into a new SV, optionally blessing the SV.  The C<rv>
9593 argument will be upgraded to an RV.  That RV will be modified to point to
9594 the new SV.  The C<classname> argument indicates the package for the
9595 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
9596 will have a reference count of 1, and the RV will be returned.
9597 
9598 =cut
9599 */
9600 
9601 SV*
9602 Perl_sv_setref_iv(pTHX_ SV *const rv, const char *const classname, const IV iv)
9603 {
9604     PERL_ARGS_ASSERT_SV_SETREF_IV;
9605 
9606     sv_setiv(newSVrv(rv,classname), iv);
9607     return rv;
9608 }
9609 
9610 /*
9611 =for apidoc sv_setref_uv
9612 
9613 Copies an unsigned integer into a new SV, optionally blessing the SV.  The C<rv>
9614 argument will be upgraded to an RV.  That RV will be modified to point to
9615 the new SV.  The C<classname> argument indicates the package for the
9616 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
9617 will have a reference count of 1, and the RV will be returned.
9618 
9619 =cut
9620 */
9621 
9622 SV*
9623 Perl_sv_setref_uv(pTHX_ SV *const rv, const char *const classname, const UV uv)
9624 {
9625     PERL_ARGS_ASSERT_SV_SETREF_UV;
9626 
9627     sv_setuv(newSVrv(rv,classname), uv);
9628     return rv;
9629 }
9630 
9631 /*
9632 =for apidoc sv_setref_nv
9633 
9634 Copies a double into a new SV, optionally blessing the SV.  The C<rv>
9635 argument will be upgraded to an RV.  That RV will be modified to point to
9636 the new SV.  The C<classname> argument indicates the package for the
9637 blessing.  Set C<classname> to C<NULL> to avoid the blessing.  The new SV
9638 will have a reference count of 1, and the RV will be returned.
9639 
9640 =cut
9641 */
9642 
9643 SV*
9644 Perl_sv_setref_nv(pTHX_ SV *const rv, const char *const classname, const NV nv)
9645 {
9646     PERL_ARGS_ASSERT_SV_SETREF_NV;
9647 
9648     sv_setnv(newSVrv(rv,classname), nv);
9649     return rv;
9650 }
9651 
9652 /*
9653 =for apidoc sv_setref_pvn
9654 
9655 Copies a string into a new SV, optionally blessing the SV.  The length of the
9656 string must be specified with C<n>.  The C<rv> argument will be upgraded to
9657 an RV.  That RV will be modified to point to the new SV.  The C<classname>
9658 argument indicates the package for the blessing.  Set C<classname> to
9659 C<NULL> to avoid the blessing.  The new SV will have a reference count
9660 of 1, and the RV will be returned.
9661 
9662 Note that C<sv_setref_pv> copies the pointer while this copies the string.
9663 
9664 =cut
9665 */
9666 
9667 SV*
9668 Perl_sv_setref_pvn(pTHX_ SV *const rv, const char *const classname,
9669                    const char *const pv, const STRLEN n)
9670 {
9671     PERL_ARGS_ASSERT_SV_SETREF_PVN;
9672 
9673     sv_setpvn(newSVrv(rv,classname), pv, n);
9674     return rv;
9675 }
9676 
9677 /*
9678 =for apidoc sv_bless
9679 
9680 Blesses an SV into a specified package.  The SV must be an RV.  The package
9681 must be designated by its stash (see C<gv_stashpv()>).  The reference count
9682 of the SV is unaffected.
9683 
9684 =cut
9685 */
9686 
9687 SV*
9688 Perl_sv_bless(pTHX_ SV *const sv, HV *const stash)
9689 {
9690     dVAR;
9691     SV *tmpRef;
9692 
9693     PERL_ARGS_ASSERT_SV_BLESS;
9694 
9695     if (!SvROK(sv))
9696         Perl_croak(aTHX_ "Can't bless non-reference value");
9697     tmpRef = SvRV(sv);
9698     if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
9699 	if (SvREADONLY(tmpRef) && !SvIsCOW(tmpRef))
9700 	    Perl_croak_no_modify();
9701 	if (SvOBJECT(tmpRef)) {
9702 	    SvREFCNT_dec(SvSTASH(tmpRef));
9703 	}
9704     }
9705     SvOBJECT_on(tmpRef);
9706     SvUPGRADE(tmpRef, SVt_PVMG);
9707     SvSTASH_set(tmpRef, MUTABLE_HV(SvREFCNT_inc_simple(stash)));
9708 
9709     if(SvSMAGICAL(tmpRef))
9710         if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
9711             mg_set(tmpRef);
9712 
9713 
9714 
9715     return sv;
9716 }
9717 
9718 /* Downgrades a PVGV to a PVMG. If it's actually a PVLV, we leave the type
9719  * as it is after unglobbing it.
9720  */
9721 
9722 PERL_STATIC_INLINE void
9723 S_sv_unglob(pTHX_ SV *const sv, U32 flags)
9724 {
9725     dVAR;
9726     void *xpvmg;
9727     HV *stash;
9728     SV * const temp = flags & SV_COW_DROP_PV ? NULL : sv_newmortal();
9729 
9730     PERL_ARGS_ASSERT_SV_UNGLOB;
9731 
9732     assert(SvTYPE(sv) == SVt_PVGV || SvTYPE(sv) == SVt_PVLV);
9733     SvFAKE_off(sv);
9734     if (!(flags & SV_COW_DROP_PV))
9735 	gv_efullname3(temp, MUTABLE_GV(sv), "*");
9736 
9737     if (GvGP(sv)) {
9738         if(GvCVu((const GV *)sv) && (stash = GvSTASH(MUTABLE_GV(sv)))
9739 	   && HvNAME_get(stash))
9740             mro_method_changed_in(stash);
9741 	gp_free(MUTABLE_GV(sv));
9742     }
9743     if (GvSTASH(sv)) {
9744 	sv_del_backref(MUTABLE_SV(GvSTASH(sv)), sv);
9745 	GvSTASH(sv) = NULL;
9746     }
9747     GvMULTI_off(sv);
9748     if (GvNAME_HEK(sv)) {
9749 	unshare_hek(GvNAME_HEK(sv));
9750     }
9751     isGV_with_GP_off(sv);
9752 
9753     if(SvTYPE(sv) == SVt_PVGV) {
9754 	/* need to keep SvANY(sv) in the right arena */
9755 	xpvmg = new_XPVMG();
9756 	StructCopy(SvANY(sv), xpvmg, XPVMG);
9757 	del_XPVGV(SvANY(sv));
9758 	SvANY(sv) = xpvmg;
9759 
9760 	SvFLAGS(sv) &= ~SVTYPEMASK;
9761 	SvFLAGS(sv) |= SVt_PVMG;
9762     }
9763 
9764     /* Intentionally not calling any local SET magic, as this isn't so much a
9765        set operation as merely an internal storage change.  */
9766     if (flags & SV_COW_DROP_PV) SvOK_off(sv);
9767     else sv_setsv_flags(sv, temp, 0);
9768 
9769     if ((const GV *)sv == PL_last_in_gv)
9770 	PL_last_in_gv = NULL;
9771     else if ((const GV *)sv == PL_statgv)
9772 	PL_statgv = NULL;
9773 }
9774 
9775 /*
9776 =for apidoc sv_unref_flags
9777 
9778 Unsets the RV status of the SV, and decrements the reference count of
9779 whatever was being referenced by the RV.  This can almost be thought of
9780 as a reversal of C<newSVrv>.  The C<cflags> argument can contain
9781 C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
9782 (otherwise the decrementing is conditional on the reference count being
9783 different from one or the reference being a readonly SV).
9784 See C<SvROK_off>.
9785 
9786 =cut
9787 */
9788 
9789 void
9790 Perl_sv_unref_flags(pTHX_ SV *const ref, const U32 flags)
9791 {
9792     SV* const target = SvRV(ref);
9793 
9794     PERL_ARGS_ASSERT_SV_UNREF_FLAGS;
9795 
9796     if (SvWEAKREF(ref)) {
9797     	sv_del_backref(target, ref);
9798 	SvWEAKREF_off(ref);
9799 	SvRV_set(ref, NULL);
9800 	return;
9801     }
9802     SvRV_set(ref, NULL);
9803     SvROK_off(ref);
9804     /* You can't have a || SvREADONLY(target) here, as $a = $$a, where $a was
9805        assigned to as BEGIN {$a = \"Foo"} will fail.  */
9806     if (SvREFCNT(target) != 1 || (flags & SV_IMMEDIATE_UNREF))
9807 	SvREFCNT_dec_NN(target);
9808     else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
9809 	sv_2mortal(target);	/* Schedule for freeing later */
9810 }
9811 
9812 /*
9813 =for apidoc sv_untaint
9814 
9815 Untaint an SV.  Use C<SvTAINTED_off> instead.
9816 
9817 =cut
9818 */
9819 
9820 void
9821 Perl_sv_untaint(pTHX_ SV *const sv)
9822 {
9823     PERL_ARGS_ASSERT_SV_UNTAINT;
9824 
9825     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
9826 	MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
9827 	if (mg)
9828 	    mg->mg_len &= ~1;
9829     }
9830 }
9831 
9832 /*
9833 =for apidoc sv_tainted
9834 
9835 Test an SV for taintedness.  Use C<SvTAINTED> instead.
9836 
9837 =cut
9838 */
9839 
9840 bool
9841 Perl_sv_tainted(pTHX_ SV *const sv)
9842 {
9843     PERL_ARGS_ASSERT_SV_TAINTED;
9844 
9845     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
9846 	const MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
9847 	if (mg && (mg->mg_len & 1) )
9848 	    return TRUE;
9849     }
9850     return FALSE;
9851 }
9852 
9853 /*
9854 =for apidoc sv_setpviv
9855 
9856 Copies an integer into the given SV, also updating its string value.
9857 Does not handle 'set' magic.  See C<sv_setpviv_mg>.
9858 
9859 =cut
9860 */
9861 
9862 void
9863 Perl_sv_setpviv(pTHX_ SV *const sv, const IV iv)
9864 {
9865     char buf[TYPE_CHARS(UV)];
9866     char *ebuf;
9867     char * const ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
9868 
9869     PERL_ARGS_ASSERT_SV_SETPVIV;
9870 
9871     sv_setpvn(sv, ptr, ebuf - ptr);
9872 }
9873 
9874 /*
9875 =for apidoc sv_setpviv_mg
9876 
9877 Like C<sv_setpviv>, but also handles 'set' magic.
9878 
9879 =cut
9880 */
9881 
9882 void
9883 Perl_sv_setpviv_mg(pTHX_ SV *const sv, const IV iv)
9884 {
9885     PERL_ARGS_ASSERT_SV_SETPVIV_MG;
9886 
9887     sv_setpviv(sv, iv);
9888     SvSETMAGIC(sv);
9889 }
9890 
9891 #if defined(PERL_IMPLICIT_CONTEXT)
9892 
9893 /* pTHX_ magic can't cope with varargs, so this is a no-context
9894  * version of the main function, (which may itself be aliased to us).
9895  * Don't access this version directly.
9896  */
9897 
9898 void
9899 Perl_sv_setpvf_nocontext(SV *const sv, const char *const pat, ...)
9900 {
9901     dTHX;
9902     va_list args;
9903 
9904     PERL_ARGS_ASSERT_SV_SETPVF_NOCONTEXT;
9905 
9906     va_start(args, pat);
9907     sv_vsetpvf(sv, pat, &args);
9908     va_end(args);
9909 }
9910 
9911 /* pTHX_ magic can't cope with varargs, so this is a no-context
9912  * version of the main function, (which may itself be aliased to us).
9913  * Don't access this version directly.
9914  */
9915 
9916 void
9917 Perl_sv_setpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
9918 {
9919     dTHX;
9920     va_list args;
9921 
9922     PERL_ARGS_ASSERT_SV_SETPVF_MG_NOCONTEXT;
9923 
9924     va_start(args, pat);
9925     sv_vsetpvf_mg(sv, pat, &args);
9926     va_end(args);
9927 }
9928 #endif
9929 
9930 /*
9931 =for apidoc sv_setpvf
9932 
9933 Works like C<sv_catpvf> but copies the text into the SV instead of
9934 appending it.  Does not handle 'set' magic.  See C<sv_setpvf_mg>.
9935 
9936 =cut
9937 */
9938 
9939 void
9940 Perl_sv_setpvf(pTHX_ SV *const sv, const char *const pat, ...)
9941 {
9942     va_list args;
9943 
9944     PERL_ARGS_ASSERT_SV_SETPVF;
9945 
9946     va_start(args, pat);
9947     sv_vsetpvf(sv, pat, &args);
9948     va_end(args);
9949 }
9950 
9951 /*
9952 =for apidoc sv_vsetpvf
9953 
9954 Works like C<sv_vcatpvf> but copies the text into the SV instead of
9955 appending it.  Does not handle 'set' magic.  See C<sv_vsetpvf_mg>.
9956 
9957 Usually used via its frontend C<sv_setpvf>.
9958 
9959 =cut
9960 */
9961 
9962 void
9963 Perl_sv_vsetpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args)
9964 {
9965     PERL_ARGS_ASSERT_SV_VSETPVF;
9966 
9967     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
9968 }
9969 
9970 /*
9971 =for apidoc sv_setpvf_mg
9972 
9973 Like C<sv_setpvf>, but also handles 'set' magic.
9974 
9975 =cut
9976 */
9977 
9978 void
9979 Perl_sv_setpvf_mg(pTHX_ SV *const sv, const char *const pat, ...)
9980 {
9981     va_list args;
9982 
9983     PERL_ARGS_ASSERT_SV_SETPVF_MG;
9984 
9985     va_start(args, pat);
9986     sv_vsetpvf_mg(sv, pat, &args);
9987     va_end(args);
9988 }
9989 
9990 /*
9991 =for apidoc sv_vsetpvf_mg
9992 
9993 Like C<sv_vsetpvf>, but also handles 'set' magic.
9994 
9995 Usually used via its frontend C<sv_setpvf_mg>.
9996 
9997 =cut
9998 */
9999 
10000 void
10001 Perl_sv_vsetpvf_mg(pTHX_ SV *const sv, const char *const pat, va_list *const args)
10002 {
10003     PERL_ARGS_ASSERT_SV_VSETPVF_MG;
10004 
10005     sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
10006     SvSETMAGIC(sv);
10007 }
10008 
10009 #if defined(PERL_IMPLICIT_CONTEXT)
10010 
10011 /* pTHX_ magic can't cope with varargs, so this is a no-context
10012  * version of the main function, (which may itself be aliased to us).
10013  * Don't access this version directly.
10014  */
10015 
10016 void
10017 Perl_sv_catpvf_nocontext(SV *const sv, const char *const pat, ...)
10018 {
10019     dTHX;
10020     va_list args;
10021 
10022     PERL_ARGS_ASSERT_SV_CATPVF_NOCONTEXT;
10023 
10024     va_start(args, pat);
10025     sv_vcatpvf(sv, pat, &args);
10026     va_end(args);
10027 }
10028 
10029 /* pTHX_ magic can't cope with varargs, so this is a no-context
10030  * version of the main function, (which may itself be aliased to us).
10031  * Don't access this version directly.
10032  */
10033 
10034 void
10035 Perl_sv_catpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
10036 {
10037     dTHX;
10038     va_list args;
10039 
10040     PERL_ARGS_ASSERT_SV_CATPVF_MG_NOCONTEXT;
10041 
10042     va_start(args, pat);
10043     sv_vcatpvf_mg(sv, pat, &args);
10044     va_end(args);
10045 }
10046 #endif
10047 
10048 /*
10049 =for apidoc sv_catpvf
10050 
10051 Processes its arguments like C<sprintf> and appends the formatted
10052 output to an SV.  If the appended data contains "wide" characters
10053 (including, but not limited to, SVs with a UTF-8 PV formatted with %s,
10054 and characters >255 formatted with %c), the original SV might get
10055 upgraded to UTF-8.  Handles 'get' magic, but not 'set' magic.  See
10056 C<sv_catpvf_mg>.  If the original SV was UTF-8, the pattern should be
10057 valid UTF-8; if the original SV was bytes, the pattern should be too.
10058 
10059 =cut */
10060 
10061 void
10062 Perl_sv_catpvf(pTHX_ SV *const sv, const char *const pat, ...)
10063 {
10064     va_list args;
10065 
10066     PERL_ARGS_ASSERT_SV_CATPVF;
10067 
10068     va_start(args, pat);
10069     sv_vcatpvf(sv, pat, &args);
10070     va_end(args);
10071 }
10072 
10073 /*
10074 =for apidoc sv_vcatpvf
10075 
10076 Processes its arguments like C<vsprintf> and appends the formatted output
10077 to an SV.  Does not handle 'set' magic.  See C<sv_vcatpvf_mg>.
10078 
10079 Usually used via its frontend C<sv_catpvf>.
10080 
10081 =cut
10082 */
10083 
10084 void
10085 Perl_sv_vcatpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args)
10086 {
10087     PERL_ARGS_ASSERT_SV_VCATPVF;
10088 
10089     sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
10090 }
10091 
10092 /*
10093 =for apidoc sv_catpvf_mg
10094 
10095 Like C<sv_catpvf>, but also handles 'set' magic.
10096 
10097 =cut
10098 */
10099 
10100 void
10101 Perl_sv_catpvf_mg(pTHX_ SV *const sv, const char *const pat, ...)
10102 {
10103     va_list args;
10104 
10105     PERL_ARGS_ASSERT_SV_CATPVF_MG;
10106 
10107     va_start(args, pat);
10108     sv_vcatpvf_mg(sv, pat, &args);
10109     va_end(args);
10110 }
10111 
10112 /*
10113 =for apidoc sv_vcatpvf_mg
10114 
10115 Like C<sv_vcatpvf>, but also handles 'set' magic.
10116 
10117 Usually used via its frontend C<sv_catpvf_mg>.
10118 
10119 =cut
10120 */
10121 
10122 void
10123 Perl_sv_vcatpvf_mg(pTHX_ SV *const sv, const char *const pat, va_list *const args)
10124 {
10125     PERL_ARGS_ASSERT_SV_VCATPVF_MG;
10126 
10127     sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
10128     SvSETMAGIC(sv);
10129 }
10130 
10131 /*
10132 =for apidoc sv_vsetpvfn
10133 
10134 Works like C<sv_vcatpvfn> but copies the text into the SV instead of
10135 appending it.
10136 
10137 Usually used via one of its frontends C<sv_vsetpvf> and C<sv_vsetpvf_mg>.
10138 
10139 =cut
10140 */
10141 
10142 void
10143 Perl_sv_vsetpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
10144                  va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted)
10145 {
10146     PERL_ARGS_ASSERT_SV_VSETPVFN;
10147 
10148     sv_setpvs(sv, "");
10149     sv_vcatpvfn_flags(sv, pat, patlen, args, svargs, svmax, maybe_tainted, 0);
10150 }
10151 
10152 
10153 /*
10154  * Warn of missing argument to sprintf, and then return a defined value
10155  * to avoid inappropriate "use of uninit" warnings [perl #71000].
10156  */
10157 #define WARN_MISSING WARN_UNINITIALIZED /* Not sure we want a new category */
10158 STATIC SV*
10159 S_vcatpvfn_missing_argument(pTHX) {
10160     if (ckWARN(WARN_MISSING)) {
10161 	Perl_warner(aTHX_ packWARN(WARN_MISSING), "Missing argument in %s",
10162 		PL_op ? OP_DESC(PL_op) : "sv_vcatpvfn()");
10163     }
10164     return &PL_sv_no;
10165 }
10166 
10167 
10168 STATIC I32
10169 S_expect_number(pTHX_ char **const pattern)
10170 {
10171     dVAR;
10172     I32 var = 0;
10173 
10174     PERL_ARGS_ASSERT_EXPECT_NUMBER;
10175 
10176     switch (**pattern) {
10177     case '1': case '2': case '3':
10178     case '4': case '5': case '6':
10179     case '7': case '8': case '9':
10180 	var = *(*pattern)++ - '0';
10181 	while (isDIGIT(**pattern)) {
10182 	    const I32 tmp = var * 10 + (*(*pattern)++ - '0');
10183 	    if (tmp < var)
10184 		Perl_croak(aTHX_ "Integer overflow in format string for %s", (PL_op ? OP_DESC(PL_op) : "sv_vcatpvfn"));
10185 	    var = tmp;
10186 	}
10187     }
10188     return var;
10189 }
10190 
10191 STATIC char *
10192 S_F0convert(NV nv, char *const endbuf, STRLEN *const len)
10193 {
10194     const int neg = nv < 0;
10195     UV uv;
10196 
10197     PERL_ARGS_ASSERT_F0CONVERT;
10198 
10199     if (neg)
10200 	nv = -nv;
10201     if (nv < UV_MAX) {
10202 	char *p = endbuf;
10203 	nv += 0.5;
10204 	uv = (UV)nv;
10205 	if (uv & 1 && uv == nv)
10206 	    uv--;			/* Round to even */
10207 	do {
10208 	    const unsigned dig = uv % 10;
10209 	    *--p = '0' + dig;
10210 	} while (uv /= 10);
10211 	if (neg)
10212 	    *--p = '-';
10213 	*len = endbuf - p;
10214 	return p;
10215     }
10216     return NULL;
10217 }
10218 
10219 
10220 /*
10221 =for apidoc sv_vcatpvfn
10222 
10223 =for apidoc sv_vcatpvfn_flags
10224 
10225 Processes its arguments like C<vsprintf> and appends the formatted output
10226 to an SV.  Uses an array of SVs if the C style variable argument list is
10227 missing (NULL).  When running with taint checks enabled, indicates via
10228 C<maybe_tainted> if results are untrustworthy (often due to the use of
10229 locales).
10230 
10231 If called as C<sv_vcatpvfn> or flags include C<SV_GMAGIC>, calls get magic.
10232 
10233 Usually used via one of its frontends C<sv_vcatpvf> and C<sv_vcatpvf_mg>.
10234 
10235 =cut
10236 */
10237 
10238 #define VECTORIZE_ARGS	vecsv = va_arg(*args, SV*);\
10239 			vecstr = (U8*)SvPV_const(vecsv,veclen);\
10240 			vec_utf8 = DO_UTF8(vecsv);
10241 
10242 /* XXX maybe_tainted is never assigned to, so the doc above is lying. */
10243 
10244 void
10245 Perl_sv_vcatpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
10246                  va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted)
10247 {
10248     PERL_ARGS_ASSERT_SV_VCATPVFN;
10249 
10250     sv_vcatpvfn_flags(sv, pat, patlen, args, svargs, svmax, maybe_tainted, SV_GMAGIC|SV_SMAGIC);
10251 }
10252 
10253 void
10254 Perl_sv_vcatpvfn_flags(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
10255                        va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted,
10256                        const U32 flags)
10257 {
10258     dVAR;
10259     char *p;
10260     char *q;
10261     const char *patend;
10262     STRLEN origlen;
10263     I32 svix = 0;
10264     static const char nullstr[] = "(null)";
10265     SV *argsv = NULL;
10266     bool has_utf8 = DO_UTF8(sv);    /* has the result utf8? */
10267     const bool pat_utf8 = has_utf8; /* the pattern is in utf8? */
10268     SV *nsv = NULL;
10269     /* Times 4: a decimal digit takes more than 3 binary digits.
10270      * NV_DIG: mantissa takes than many decimal digits.
10271      * Plus 32: Playing safe. */
10272     char ebuf[IV_DIG * 4 + NV_DIG + 32];
10273     /* large enough for "%#.#f" --chip */
10274     /* what about long double NVs? --jhi */
10275 
10276     PERL_ARGS_ASSERT_SV_VCATPVFN_FLAGS;
10277     PERL_UNUSED_ARG(maybe_tainted);
10278 
10279     if (flags & SV_GMAGIC)
10280         SvGETMAGIC(sv);
10281 
10282     /* no matter what, this is a string now */
10283     (void)SvPV_force_nomg(sv, origlen);
10284 
10285     /* special-case "", "%s", and "%-p" (SVf - see below) */
10286     if (patlen == 0)
10287 	return;
10288     if (patlen == 2 && pat[0] == '%' && pat[1] == 's') {
10289 	if (args) {
10290 	    const char * const s = va_arg(*args, char*);
10291 	    sv_catpv_nomg(sv, s ? s : nullstr);
10292 	}
10293 	else if (svix < svmax) {
10294 	    /* we want get magic on the source but not the target. sv_catsv can't do that, though */
10295 	    SvGETMAGIC(*svargs);
10296 	    sv_catsv_nomg(sv, *svargs);
10297 	}
10298 	else
10299 	    S_vcatpvfn_missing_argument(aTHX);
10300 	return;
10301     }
10302     if (args && patlen == 3 && pat[0] == '%' &&
10303 		pat[1] == '-' && pat[2] == 'p') {
10304 	argsv = MUTABLE_SV(va_arg(*args, void*));
10305 	sv_catsv_nomg(sv, argsv);
10306 	return;
10307     }
10308 
10309 #ifndef USE_LONG_DOUBLE
10310     /* special-case "%.<number>[gf]" */
10311     if ( !args && patlen <= 5 && pat[0] == '%' && pat[1] == '.'
10312 	 && (pat[patlen-1] == 'g' || pat[patlen-1] == 'f') ) {
10313 	unsigned digits = 0;
10314 	const char *pp;
10315 
10316 	pp = pat + 2;
10317 	while (*pp >= '0' && *pp <= '9')
10318 	    digits = 10 * digits + (*pp++ - '0');
10319 	if (pp - pat == (int)patlen - 1 && svix < svmax) {
10320 	    const NV nv = SvNV(*svargs);
10321 	    if (*pp == 'g') {
10322 		/* Add check for digits != 0 because it seems that some
10323 		   gconverts are buggy in this case, and we don't yet have
10324 		   a Configure test for this.  */
10325 		if (digits && digits < sizeof(ebuf) - NV_DIG - 10) {
10326 		     /* 0, point, slack */
10327 		    Gconvert(nv, (int)digits, 0, ebuf);
10328 		    sv_catpv_nomg(sv, ebuf);
10329 		    if (*ebuf)	/* May return an empty string for digits==0 */
10330 			return;
10331 		}
10332 	    } else if (!digits) {
10333 		STRLEN l;
10334 
10335 		if ((p = F0convert(nv, ebuf + sizeof ebuf, &l))) {
10336 		    sv_catpvn_nomg(sv, p, l);
10337 		    return;
10338 		}
10339 	    }
10340 	}
10341     }
10342 #endif /* !USE_LONG_DOUBLE */
10343 
10344     if (!args && svix < svmax && DO_UTF8(*svargs))
10345 	has_utf8 = TRUE;
10346 
10347     patend = (char*)pat + patlen;
10348     for (p = (char*)pat; p < patend; p = q) {
10349 	bool alt = FALSE;
10350 	bool left = FALSE;
10351 	bool vectorize = FALSE;
10352 	bool vectorarg = FALSE;
10353 	bool vec_utf8 = FALSE;
10354 	char fill = ' ';
10355 	char plus = 0;
10356 	char intsize = 0;
10357 	STRLEN width = 0;
10358 	STRLEN zeros = 0;
10359 	bool has_precis = FALSE;
10360 	STRLEN precis = 0;
10361 	const I32 osvix = svix;
10362 	bool is_utf8 = FALSE;  /* is this item utf8?   */
10363 #ifdef HAS_LDBL_SPRINTF_BUG
10364 	/* This is to try to fix a bug with irix/nonstop-ux/powerux and
10365 	   with sfio - Allen <allens@cpan.org> */
10366 	bool fix_ldbl_sprintf_bug = FALSE;
10367 #endif
10368 
10369 	char esignbuf[4];
10370 	U8 utf8buf[UTF8_MAXBYTES+1];
10371 	STRLEN esignlen = 0;
10372 
10373 	const char *eptr = NULL;
10374 	const char *fmtstart;
10375 	STRLEN elen = 0;
10376 	SV *vecsv = NULL;
10377 	const U8 *vecstr = NULL;
10378 	STRLEN veclen = 0;
10379 	char c = 0;
10380 	int i;
10381 	unsigned base = 0;
10382 	IV iv = 0;
10383 	UV uv = 0;
10384 	/* we need a long double target in case HAS_LONG_DOUBLE but
10385 	   not USE_LONG_DOUBLE
10386 	*/
10387 #if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
10388 	long double nv;
10389 #else
10390 	NV nv;
10391 #endif
10392 	STRLEN have;
10393 	STRLEN need;
10394 	STRLEN gap;
10395 	const char *dotstr = ".";
10396 	STRLEN dotstrlen = 1;
10397 	I32 efix = 0; /* explicit format parameter index */
10398 	I32 ewix = 0; /* explicit width index */
10399 	I32 epix = 0; /* explicit precision index */
10400 	I32 evix = 0; /* explicit vector index */
10401 	bool asterisk = FALSE;
10402 
10403 	/* echo everything up to the next format specification */
10404 	for (q = p; q < patend && *q != '%'; ++q) ;
10405 	if (q > p) {
10406 	    if (has_utf8 && !pat_utf8)
10407 		sv_catpvn_nomg_utf8_upgrade(sv, p, q - p, nsv);
10408 	    else
10409 		sv_catpvn_nomg(sv, p, q - p);
10410 	    p = q;
10411 	}
10412 	if (q++ >= patend)
10413 	    break;
10414 
10415 	fmtstart = q;
10416 
10417 /*
10418     We allow format specification elements in this order:
10419 	\d+\$              explicit format parameter index
10420 	[-+ 0#]+           flags
10421 	v|\*(\d+\$)?v      vector with optional (optionally specified) arg
10422 	0		   flag (as above): repeated to allow "v02"
10423 	\d+|\*(\d+\$)?     width using optional (optionally specified) arg
10424 	\.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
10425 	[hlqLV]            size
10426     [%bcdefginopsuxDFOUX] format (mandatory)
10427 */
10428 
10429 	if (args) {
10430 /*
10431 	As of perl5.9.3, printf format checking is on by default.
10432 	Internally, perl uses %p formats to provide an escape to
10433 	some extended formatting.  This block deals with those
10434 	extensions: if it does not match, (char*)q is reset and
10435 	the normal format processing code is used.
10436 
10437 	Currently defined extensions are:
10438 		%p		include pointer address (standard)
10439 		%-p	(SVf)	include an SV (previously %_)
10440 		%-<num>p	include an SV with precision <num>
10441 		%2p		include a HEK
10442 		%3p		include a HEK with precision of 256
10443 		%<num>p		(where num != 2 or 3) reserved for future
10444 				extensions
10445 
10446 	Robin Barker 2005-07-14 (but modified since)
10447 
10448 		%1p	(VDf)	removed.  RMB 2007-10-19
10449 */
10450  	    char* r = q;
10451 	    bool sv = FALSE;
10452 	    STRLEN n = 0;
10453 	    if (*q == '-')
10454 		sv = *q++;
10455 	    n = expect_number(&q);
10456 	    if (*q++ == 'p') {
10457 		if (sv) {			/* SVf */
10458 		    if (n) {
10459 			precis = n;
10460 			has_precis = TRUE;
10461 		    }
10462 		    argsv = MUTABLE_SV(va_arg(*args, void*));
10463 		    eptr = SvPV_const(argsv, elen);
10464 		    if (DO_UTF8(argsv))
10465 			is_utf8 = TRUE;
10466 		    goto string;
10467 		}
10468 		else if (n==2 || n==3) {	/* HEKf */
10469 		    HEK * const hek = va_arg(*args, HEK *);
10470 		    eptr = HEK_KEY(hek);
10471 		    elen = HEK_LEN(hek);
10472 		    if (HEK_UTF8(hek)) is_utf8 = TRUE;
10473 		    if (n==3) precis = 256, has_precis = TRUE;
10474 		    goto string;
10475 		}
10476 		else if (n) {
10477 		    Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),
10478 				     "internal %%<num>p might conflict with future printf extensions");
10479 		}
10480 	    }
10481 	    q = r;
10482 	}
10483 
10484 	if ( (width = expect_number(&q)) ) {
10485 	    if (*q == '$') {
10486 		++q;
10487 		efix = width;
10488 	    } else {
10489 		goto gotwidth;
10490 	    }
10491 	}
10492 
10493 	/* FLAGS */
10494 
10495 	while (*q) {
10496 	    switch (*q) {
10497 	    case ' ':
10498 	    case '+':
10499 		if (plus == '+' && *q == ' ') /* '+' over ' ' */
10500 		    q++;
10501 		else
10502 		    plus = *q++;
10503 		continue;
10504 
10505 	    case '-':
10506 		left = TRUE;
10507 		q++;
10508 		continue;
10509 
10510 	    case '0':
10511 		fill = *q++;
10512 		continue;
10513 
10514 	    case '#':
10515 		alt = TRUE;
10516 		q++;
10517 		continue;
10518 
10519 	    default:
10520 		break;
10521 	    }
10522 	    break;
10523 	}
10524 
10525       tryasterisk:
10526 	if (*q == '*') {
10527 	    q++;
10528 	    if ( (ewix = expect_number(&q)) )
10529 		if (*q++ != '$')
10530 		    goto unknown;
10531 	    asterisk = TRUE;
10532 	}
10533 	if (*q == 'v') {
10534 	    q++;
10535 	    if (vectorize)
10536 		goto unknown;
10537 	    if ((vectorarg = asterisk)) {
10538 		evix = ewix;
10539 		ewix = 0;
10540 		asterisk = FALSE;
10541 	    }
10542 	    vectorize = TRUE;
10543 	    goto tryasterisk;
10544 	}
10545 
10546 	if (!asterisk)
10547 	{
10548 	    if( *q == '0' )
10549 		fill = *q++;
10550 	    width = expect_number(&q);
10551 	}
10552 
10553 	if (vectorize && vectorarg) {
10554 	    /* vectorizing, but not with the default "." */
10555 	    if (args)
10556 		vecsv = va_arg(*args, SV*);
10557 	    else if (evix) {
10558 		vecsv = (evix > 0 && evix <= svmax)
10559 		    ? svargs[evix-1] : S_vcatpvfn_missing_argument(aTHX);
10560 	    } else {
10561 		vecsv = svix < svmax
10562 		    ? svargs[svix++] : S_vcatpvfn_missing_argument(aTHX);
10563 	    }
10564 	    dotstr = SvPV_const(vecsv, dotstrlen);
10565 	    /* Keep the DO_UTF8 test *after* the SvPV call, else things go
10566 	       bad with tied or overloaded values that return UTF8.  */
10567 	    if (DO_UTF8(vecsv))
10568 		is_utf8 = TRUE;
10569 	    else if (has_utf8) {
10570 		vecsv = sv_mortalcopy(vecsv);
10571 		sv_utf8_upgrade(vecsv);
10572 		dotstr = SvPV_const(vecsv, dotstrlen);
10573 		is_utf8 = TRUE;
10574 	    }
10575 	}
10576 
10577 	if (asterisk) {
10578 	    if (args)
10579 		i = va_arg(*args, int);
10580 	    else
10581 		i = (ewix ? ewix <= svmax : svix < svmax) ?
10582 		    SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
10583 	    left |= (i < 0);
10584 	    width = (i < 0) ? -i : i;
10585 	}
10586       gotwidth:
10587 
10588 	/* PRECISION */
10589 
10590 	if (*q == '.') {
10591 	    q++;
10592 	    if (*q == '*') {
10593 		q++;
10594 		if ( ((epix = expect_number(&q))) && (*q++ != '$') )
10595 		    goto unknown;
10596 		/* XXX: todo, support specified precision parameter */
10597 		if (epix)
10598 		    goto unknown;
10599 		if (args)
10600 		    i = va_arg(*args, int);
10601 		else
10602 		    i = (ewix ? ewix <= svmax : svix < svmax)
10603 			? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
10604 		precis = i;
10605 		has_precis = !(i < 0);
10606 	    }
10607 	    else {
10608 		precis = 0;
10609 		while (isDIGIT(*q))
10610 		    precis = precis * 10 + (*q++ - '0');
10611 		has_precis = TRUE;
10612 	    }
10613 	}
10614 
10615 	if (vectorize) {
10616 	    if (args) {
10617 		VECTORIZE_ARGS
10618 	    }
10619 	    else if (efix ? (efix > 0 && efix <= svmax) : svix < svmax) {
10620 		vecsv = svargs[efix ? efix-1 : svix++];
10621 		vecstr = (U8*)SvPV_const(vecsv,veclen);
10622 		vec_utf8 = DO_UTF8(vecsv);
10623 
10624 		/* if this is a version object, we need to convert
10625 		 * back into v-string notation and then let the
10626 		 * vectorize happen normally
10627 		 */
10628 		if (sv_isobject(vecsv) && sv_derived_from(vecsv, "version")) {
10629 		    if ( hv_exists(MUTABLE_HV(SvRV(vecsv)), "alpha", 5 ) ) {
10630 			Perl_ck_warner_d(aTHX_ packWARN(WARN_PRINTF),
10631 			"vector argument not supported with alpha versions");
10632 			goto vdblank;
10633 		    }
10634 		    vecsv = sv_newmortal();
10635 		    scan_vstring((char *)vecstr, (char *)vecstr + veclen,
10636 				 vecsv);
10637 		    vecstr = (U8*)SvPV_const(vecsv, veclen);
10638 		    vec_utf8 = DO_UTF8(vecsv);
10639 		}
10640 	    }
10641 	    else {
10642 	      vdblank:
10643 		vecstr = (U8*)"";
10644 		veclen = 0;
10645 	    }
10646 	}
10647 
10648 	/* SIZE */
10649 
10650 	switch (*q) {
10651 #ifdef WIN32
10652 	case 'I':			/* Ix, I32x, and I64x */
10653 #  ifdef USE_64_BIT_INT
10654 	    if (q[1] == '6' && q[2] == '4') {
10655 		q += 3;
10656 		intsize = 'q';
10657 		break;
10658 	    }
10659 #  endif
10660 	    if (q[1] == '3' && q[2] == '2') {
10661 		q += 3;
10662 		break;
10663 	    }
10664 #  ifdef USE_64_BIT_INT
10665 	    intsize = 'q';
10666 #  endif
10667 	    q++;
10668 	    break;
10669 #endif
10670 #if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
10671 	case 'L':			/* Ld */
10672 	    /*FALLTHROUGH*/
10673 #ifdef HAS_QUAD
10674 	case 'q':			/* qd */
10675 #endif
10676 	    intsize = 'q';
10677 	    q++;
10678 	    break;
10679 #endif
10680 	case 'l':
10681 	    ++q;
10682 #if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
10683 	    if (*q == 'l') {	/* lld, llf */
10684 		intsize = 'q';
10685 		++q;
10686 	    }
10687 	    else
10688 #endif
10689 		intsize = 'l';
10690 	    break;
10691 	case 'h':
10692 	    if (*++q == 'h') {	/* hhd, hhu */
10693 		intsize = 'c';
10694 		++q;
10695 	    }
10696 	    else
10697 		intsize = 'h';
10698 	    break;
10699 	case 'V':
10700 	case 'z':
10701 	case 't':
10702 #if HAS_C99
10703         case 'j':
10704 #endif
10705 	    intsize = *q++;
10706 	    break;
10707 	}
10708 
10709 	/* CONVERSION */
10710 
10711 	if (*q == '%') {
10712 	    eptr = q++;
10713 	    elen = 1;
10714 	    if (vectorize) {
10715 		c = '%';
10716 		goto unknown;
10717 	    }
10718 	    goto string;
10719 	}
10720 
10721 	if (!vectorize && !args) {
10722 	    if (efix) {
10723 		const I32 i = efix-1;
10724 		argsv = (i >= 0 && i < svmax)
10725 		    ? svargs[i] : S_vcatpvfn_missing_argument(aTHX);
10726 	    } else {
10727 		argsv = (svix >= 0 && svix < svmax)
10728 		    ? svargs[svix++] : S_vcatpvfn_missing_argument(aTHX);
10729 	    }
10730 	}
10731 
10732 	switch (c = *q++) {
10733 
10734 	    /* STRINGS */
10735 
10736 	case 'c':
10737 	    if (vectorize)
10738 		goto unknown;
10739 	    uv = (args) ? va_arg(*args, int) : SvIV(argsv);
10740 	    if ((uv > 255 ||
10741 		 (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
10742 		&& !IN_BYTES) {
10743 		eptr = (char*)utf8buf;
10744 		elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
10745 		is_utf8 = TRUE;
10746 	    }
10747 	    else {
10748 		c = (char)uv;
10749 		eptr = &c;
10750 		elen = 1;
10751 	    }
10752 	    goto string;
10753 
10754 	case 's':
10755 	    if (vectorize)
10756 		goto unknown;
10757 	    if (args) {
10758 		eptr = va_arg(*args, char*);
10759 		if (eptr)
10760 		    elen = strlen(eptr);
10761 		else {
10762 		    eptr = (char *)nullstr;
10763 		    elen = sizeof nullstr - 1;
10764 		}
10765 	    }
10766 	    else {
10767 		eptr = SvPV_const(argsv, elen);
10768 		if (DO_UTF8(argsv)) {
10769 		    STRLEN old_precis = precis;
10770 		    if (has_precis && precis < elen) {
10771 			STRLEN ulen = sv_or_pv_len_utf8(argsv, eptr, elen);
10772 			STRLEN p = precis > ulen ? ulen : precis;
10773 			precis = sv_or_pv_pos_u2b(argsv, eptr, p, 0);
10774 							/* sticks at end */
10775 		    }
10776 		    if (width) { /* fudge width (can't fudge elen) */
10777 			if (has_precis && precis < elen)
10778 			    width += precis - old_precis;
10779 			else
10780 			    width +=
10781 				elen - sv_or_pv_len_utf8(argsv,eptr,elen);
10782 		    }
10783 		    is_utf8 = TRUE;
10784 		}
10785 	    }
10786 
10787 	string:
10788 	    if (has_precis && precis < elen)
10789 		elen = precis;
10790 	    break;
10791 
10792 	    /* INTEGERS */
10793 
10794 	case 'p':
10795 	    if (alt || vectorize)
10796 		goto unknown;
10797 	    uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
10798 	    base = 16;
10799 	    goto integer;
10800 
10801 	case 'D':
10802 #ifdef IV_IS_QUAD
10803 	    intsize = 'q';
10804 #else
10805 	    intsize = 'l';
10806 #endif
10807 	    /*FALLTHROUGH*/
10808 	case 'd':
10809 	case 'i':
10810 #if vdNUMBER
10811 	format_vd:
10812 #endif
10813 	    if (vectorize) {
10814 		STRLEN ulen;
10815 		if (!veclen)
10816 		    continue;
10817 		if (vec_utf8)
10818 		    uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
10819 					UTF8_ALLOW_ANYUV);
10820 		else {
10821 		    uv = *vecstr;
10822 		    ulen = 1;
10823 		}
10824 		vecstr += ulen;
10825 		veclen -= ulen;
10826 		if (plus)
10827 		     esignbuf[esignlen++] = plus;
10828 	    }
10829 	    else if (args) {
10830 		switch (intsize) {
10831 		case 'c':	iv = (char)va_arg(*args, int); break;
10832 		case 'h':	iv = (short)va_arg(*args, int); break;
10833 		case 'l':	iv = va_arg(*args, long); break;
10834 		case 'V':	iv = va_arg(*args, IV); break;
10835 		case 'z':	iv = va_arg(*args, SSize_t); break;
10836 		case 't':	iv = va_arg(*args, ptrdiff_t); break;
10837 		default:	iv = va_arg(*args, int); break;
10838 #if HAS_C99
10839 		case 'j':	iv = va_arg(*args, intmax_t); break;
10840 #endif
10841 		case 'q':
10842 #ifdef HAS_QUAD
10843 				iv = va_arg(*args, Quad_t); break;
10844 #else
10845 				goto unknown;
10846 #endif
10847 		}
10848 	    }
10849 	    else {
10850 		IV tiv = SvIV(argsv); /* work around GCC bug #13488 */
10851 		switch (intsize) {
10852 		case 'c':	iv = (char)tiv; break;
10853 		case 'h':	iv = (short)tiv; break;
10854 		case 'l':	iv = (long)tiv; break;
10855 		case 'V':
10856 		default:	iv = tiv; break;
10857 		case 'q':
10858 #ifdef HAS_QUAD
10859 				iv = (Quad_t)tiv; break;
10860 #else
10861 				goto unknown;
10862 #endif
10863 		}
10864 	    }
10865 	    if ( !vectorize )	/* we already set uv above */
10866 	    {
10867 		if (iv >= 0) {
10868 		    uv = iv;
10869 		    if (plus)
10870 			esignbuf[esignlen++] = plus;
10871 		}
10872 		else {
10873 		    uv = -iv;
10874 		    esignbuf[esignlen++] = '-';
10875 		}
10876 	    }
10877 	    base = 10;
10878 	    goto integer;
10879 
10880 	case 'U':
10881 #ifdef IV_IS_QUAD
10882 	    intsize = 'q';
10883 #else
10884 	    intsize = 'l';
10885 #endif
10886 	    /*FALLTHROUGH*/
10887 	case 'u':
10888 	    base = 10;
10889 	    goto uns_integer;
10890 
10891 	case 'B':
10892 	case 'b':
10893 	    base = 2;
10894 	    goto uns_integer;
10895 
10896 	case 'O':
10897 #ifdef IV_IS_QUAD
10898 	    intsize = 'q';
10899 #else
10900 	    intsize = 'l';
10901 #endif
10902 	    /*FALLTHROUGH*/
10903 	case 'o':
10904 	    base = 8;
10905 	    goto uns_integer;
10906 
10907 	case 'X':
10908 	case 'x':
10909 	    base = 16;
10910 
10911 	uns_integer:
10912 	    if (vectorize) {
10913 		STRLEN ulen;
10914 	vector:
10915 		if (!veclen)
10916 		    continue;
10917 		if (vec_utf8)
10918 		    uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
10919 					UTF8_ALLOW_ANYUV);
10920 		else {
10921 		    uv = *vecstr;
10922 		    ulen = 1;
10923 		}
10924 		vecstr += ulen;
10925 		veclen -= ulen;
10926 	    }
10927 	    else if (args) {
10928 		switch (intsize) {
10929 		case 'c':  uv = (unsigned char)va_arg(*args, unsigned); break;
10930 		case 'h':  uv = (unsigned short)va_arg(*args, unsigned); break;
10931 		case 'l':  uv = va_arg(*args, unsigned long); break;
10932 		case 'V':  uv = va_arg(*args, UV); break;
10933 		case 'z':  uv = va_arg(*args, Size_t); break;
10934 	        case 't':  uv = va_arg(*args, ptrdiff_t); break; /* will sign extend, but there is no uptrdiff_t, so oh well */
10935 #if HAS_C99
10936 		case 'j':  uv = va_arg(*args, uintmax_t); break;
10937 #endif
10938 		default:   uv = va_arg(*args, unsigned); break;
10939 		case 'q':
10940 #ifdef HAS_QUAD
10941 			   uv = va_arg(*args, Uquad_t); break;
10942 #else
10943 			   goto unknown;
10944 #endif
10945 		}
10946 	    }
10947 	    else {
10948 		UV tuv = SvUV(argsv); /* work around GCC bug #13488 */
10949 		switch (intsize) {
10950 		case 'c':	uv = (unsigned char)tuv; break;
10951 		case 'h':	uv = (unsigned short)tuv; break;
10952 		case 'l':	uv = (unsigned long)tuv; break;
10953 		case 'V':
10954 		default:	uv = tuv; break;
10955 		case 'q':
10956 #ifdef HAS_QUAD
10957 				uv = (Uquad_t)tuv; break;
10958 #else
10959 				goto unknown;
10960 #endif
10961 		}
10962 	    }
10963 
10964 	integer:
10965 	    {
10966 		char *ptr = ebuf + sizeof ebuf;
10967 		bool tempalt = uv ? alt : FALSE; /* Vectors can't change alt */
10968 		zeros = 0;
10969 
10970 		switch (base) {
10971 		    unsigned dig;
10972 		case 16:
10973 		    p = (char *)((c == 'X') ? PL_hexdigit + 16 : PL_hexdigit);
10974 		    do {
10975 			dig = uv & 15;
10976 			*--ptr = p[dig];
10977 		    } while (uv >>= 4);
10978 		    if (tempalt) {
10979 			esignbuf[esignlen++] = '0';
10980 			esignbuf[esignlen++] = c;  /* 'x' or 'X' */
10981 		    }
10982 		    break;
10983 		case 8:
10984 		    do {
10985 			dig = uv & 7;
10986 			*--ptr = '0' + dig;
10987 		    } while (uv >>= 3);
10988 		    if (alt && *ptr != '0')
10989 			*--ptr = '0';
10990 		    break;
10991 		case 2:
10992 		    do {
10993 			dig = uv & 1;
10994 			*--ptr = '0' + dig;
10995 		    } while (uv >>= 1);
10996 		    if (tempalt) {
10997 			esignbuf[esignlen++] = '0';
10998 			esignbuf[esignlen++] = c;
10999 		    }
11000 		    break;
11001 		default:		/* it had better be ten or less */
11002 		    do {
11003 			dig = uv % base;
11004 			*--ptr = '0' + dig;
11005 		    } while (uv /= base);
11006 		    break;
11007 		}
11008 		elen = (ebuf + sizeof ebuf) - ptr;
11009 		eptr = ptr;
11010 		if (has_precis) {
11011 		    if (precis > elen)
11012 			zeros = precis - elen;
11013 		    else if (precis == 0 && elen == 1 && *eptr == '0'
11014 			     && !(base == 8 && alt)) /* "%#.0o" prints "0" */
11015 			elen = 0;
11016 
11017 		/* a precision nullifies the 0 flag. */
11018 		    if (fill == '0')
11019 			fill = ' ';
11020 		}
11021 	    }
11022 	    break;
11023 
11024 	    /* FLOATING POINT */
11025 
11026 	case 'F':
11027 	    c = 'f';		/* maybe %F isn't supported here */
11028 	    /*FALLTHROUGH*/
11029 	case 'e': case 'E':
11030 	case 'f':
11031 	case 'g': case 'G':
11032 	    if (vectorize)
11033 		goto unknown;
11034 
11035 	    /* This is evil, but floating point is even more evil */
11036 
11037 	    /* for SV-style calling, we can only get NV
11038 	       for C-style calling, we assume %f is double;
11039 	       for simplicity we allow any of %Lf, %llf, %qf for long double
11040 	    */
11041 	    switch (intsize) {
11042 	    case 'V':
11043 #if defined(USE_LONG_DOUBLE)
11044 		intsize = 'q';
11045 #endif
11046 		break;
11047 /* [perl #20339] - we should accept and ignore %lf rather than die */
11048 	    case 'l':
11049 		/*FALLTHROUGH*/
11050 	    default:
11051 #if defined(USE_LONG_DOUBLE)
11052 		intsize = args ? 0 : 'q';
11053 #endif
11054 		break;
11055 	    case 'q':
11056 #if defined(HAS_LONG_DOUBLE)
11057 		break;
11058 #else
11059 		/*FALLTHROUGH*/
11060 #endif
11061 	    case 'c':
11062 	    case 'h':
11063 	    case 'z':
11064 	    case 't':
11065 	    case 'j':
11066 		goto unknown;
11067 	    }
11068 
11069 	    /* now we need (long double) if intsize == 'q', else (double) */
11070 	    nv = (args) ?
11071 #if LONG_DOUBLESIZE > DOUBLESIZE
11072 		intsize == 'q' ?
11073 		    va_arg(*args, long double) :
11074 		    va_arg(*args, double)
11075 #else
11076 		    va_arg(*args, double)
11077 #endif
11078 		: SvNV(argsv);
11079 
11080 	    need = 0;
11081 	    /* nv * 0 will be NaN for NaN, +Inf and -Inf, and 0 for anything
11082 	       else. frexp() has some unspecified behaviour for those three */
11083 	    if (c != 'e' && c != 'E' && (nv * 0) == 0) {
11084 		i = PERL_INT_MIN;
11085 		/* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
11086 		   will cast our (long double) to (double) */
11087 		(void)Perl_frexp(nv, &i);
11088 		if (i == PERL_INT_MIN)
11089 		    Perl_die(aTHX_ "panic: frexp");
11090 		if (i > 0)
11091 		    need = BIT_DIGITS(i);
11092 	    }
11093 	    need += has_precis ? precis : 6; /* known default */
11094 
11095 	    if (need < width)
11096 		need = width;
11097 
11098 #ifdef HAS_LDBL_SPRINTF_BUG
11099 	    /* This is to try to fix a bug with irix/nonstop-ux/powerux and
11100 	       with sfio - Allen <allens@cpan.org> */
11101 
11102 #  ifdef DBL_MAX
11103 #    define MY_DBL_MAX DBL_MAX
11104 #  else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
11105 #    if DOUBLESIZE >= 8
11106 #      define MY_DBL_MAX 1.7976931348623157E+308L
11107 #    else
11108 #      define MY_DBL_MAX 3.40282347E+38L
11109 #    endif
11110 #  endif
11111 
11112 #  ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
11113 #    define MY_DBL_MAX_BUG 1L
11114 #  else
11115 #    define MY_DBL_MAX_BUG MY_DBL_MAX
11116 #  endif
11117 
11118 #  ifdef DBL_MIN
11119 #    define MY_DBL_MIN DBL_MIN
11120 #  else  /* XXX guessing! -Allen */
11121 #    if DOUBLESIZE >= 8
11122 #      define MY_DBL_MIN 2.2250738585072014E-308L
11123 #    else
11124 #      define MY_DBL_MIN 1.17549435E-38L
11125 #    endif
11126 #  endif
11127 
11128 	    if ((intsize == 'q') && (c == 'f') &&
11129 		((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
11130 		(need < DBL_DIG)) {
11131 		/* it's going to be short enough that
11132 		 * long double precision is not needed */
11133 
11134 		if ((nv <= 0L) && (nv >= -0L))
11135 		    fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
11136 		else {
11137 		    /* would use Perl_fp_class as a double-check but not
11138 		     * functional on IRIX - see perl.h comments */
11139 
11140 		    if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
11141 			/* It's within the range that a double can represent */
11142 #if defined(DBL_MAX) && !defined(DBL_MIN)
11143 			if ((nv >= ((long double)1/DBL_MAX)) ||
11144 			    (nv <= (-(long double)1/DBL_MAX)))
11145 #endif
11146 			fix_ldbl_sprintf_bug = TRUE;
11147 		    }
11148 		}
11149 		if (fix_ldbl_sprintf_bug == TRUE) {
11150 		    double temp;
11151 
11152 		    intsize = 0;
11153 		    temp = (double)nv;
11154 		    nv = (NV)temp;
11155 		}
11156 	    }
11157 
11158 #  undef MY_DBL_MAX
11159 #  undef MY_DBL_MAX_BUG
11160 #  undef MY_DBL_MIN
11161 
11162 #endif /* HAS_LDBL_SPRINTF_BUG */
11163 
11164 	    need += 20; /* fudge factor */
11165 	    if (PL_efloatsize < need) {
11166 		Safefree(PL_efloatbuf);
11167 		PL_efloatsize = need + 20; /* more fudge */
11168 		Newx(PL_efloatbuf, PL_efloatsize, char);
11169 		PL_efloatbuf[0] = '\0';
11170 	    }
11171 
11172 	    if ( !(width || left || plus || alt) && fill != '0'
11173 		 && has_precis && intsize != 'q' ) {	/* Shortcuts */
11174 		/* See earlier comment about buggy Gconvert when digits,
11175 		   aka precis is 0  */
11176 		if ( c == 'g' && precis) {
11177 		    Gconvert((NV)nv, (int)precis, 0, PL_efloatbuf);
11178 		    /* May return an empty string for digits==0 */
11179 		    if (*PL_efloatbuf) {
11180 			elen = strlen(PL_efloatbuf);
11181 			goto float_converted;
11182 		    }
11183 		} else if ( c == 'f' && !precis) {
11184 		    if ((eptr = F0convert(nv, ebuf + sizeof ebuf, &elen)))
11185 			break;
11186 		}
11187 	    }
11188 	    {
11189 		char *ptr = ebuf + sizeof ebuf;
11190 		*--ptr = '\0';
11191 		*--ptr = c;
11192 		/* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
11193 #if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
11194 		if (intsize == 'q') {
11195 		    /* Copy the one or more characters in a long double
11196 		     * format before the 'base' ([efgEFG]) character to
11197 		     * the format string. */
11198 		    static char const prifldbl[] = PERL_PRIfldbl;
11199 		    char const *p = prifldbl + sizeof(prifldbl) - 3;
11200 		    while (p >= prifldbl) { *--ptr = *p--; }
11201 		}
11202 #endif
11203 		if (has_precis) {
11204 		    base = precis;
11205 		    do { *--ptr = '0' + (base % 10); } while (base /= 10);
11206 		    *--ptr = '.';
11207 		}
11208 		if (width) {
11209 		    base = width;
11210 		    do { *--ptr = '0' + (base % 10); } while (base /= 10);
11211 		}
11212 		if (fill == '0')
11213 		    *--ptr = fill;
11214 		if (left)
11215 		    *--ptr = '-';
11216 		if (plus)
11217 		    *--ptr = plus;
11218 		if (alt)
11219 		    *--ptr = '#';
11220 		*--ptr = '%';
11221 
11222 		/* No taint.  Otherwise we are in the strange situation
11223 		 * where printf() taints but print($float) doesn't.
11224 		 * --jhi */
11225 #if defined(HAS_LONG_DOUBLE)
11226 		elen = ((intsize == 'q')
11227 			? my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, nv)
11228 			: my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, (double)nv));
11229 #else
11230 		elen = my_sprintf(PL_efloatbuf, ptr, nv);
11231 #endif
11232 	    }
11233 	float_converted:
11234 	    eptr = PL_efloatbuf;
11235 	    break;
11236 
11237 	    /* SPECIAL */
11238 
11239 	case 'n':
11240 	    if (vectorize)
11241 		goto unknown;
11242 	    i = SvCUR(sv) - origlen;
11243 	    if (args) {
11244 		switch (intsize) {
11245 		case 'c':	*(va_arg(*args, char*)) = i; break;
11246 		case 'h':	*(va_arg(*args, short*)) = i; break;
11247 		default:	*(va_arg(*args, int*)) = i; break;
11248 		case 'l':	*(va_arg(*args, long*)) = i; break;
11249 		case 'V':	*(va_arg(*args, IV*)) = i; break;
11250 		case 'z':	*(va_arg(*args, SSize_t*)) = i; break;
11251 		case 't':	*(va_arg(*args, ptrdiff_t*)) = i; break;
11252 #if HAS_C99
11253 		case 'j':	*(va_arg(*args, intmax_t*)) = i; break;
11254 #endif
11255 		case 'q':
11256 #ifdef HAS_QUAD
11257 				*(va_arg(*args, Quad_t*)) = i; break;
11258 #else
11259 				goto unknown;
11260 #endif
11261 		}
11262 	    }
11263 	    else
11264 		sv_setuv_mg(argsv, has_utf8 ? (UV)sv_len_utf8(sv) : (UV)i);
11265 	    continue;	/* not "break" */
11266 
11267 	    /* UNKNOWN */
11268 
11269 	default:
11270       unknown:
11271 	    if (!args
11272 		&& (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)
11273 		&& ckWARN(WARN_PRINTF))
11274 	    {
11275 		SV * const msg = sv_newmortal();
11276 		Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
11277 			  (PL_op->op_type == OP_PRTF) ? "" : "s");
11278 		if (fmtstart < patend) {
11279 		    const char * const fmtend = q < patend ? q : patend;
11280 		    const char * f;
11281 		    sv_catpvs(msg, "\"%");
11282 		    for (f = fmtstart; f < fmtend; f++) {
11283 			if (isPRINT(*f)) {
11284 			    sv_catpvn_nomg(msg, f, 1);
11285 			} else {
11286 			    Perl_sv_catpvf(aTHX_ msg,
11287 					   "\\%03"UVof, (UV)*f & 0xFF);
11288 			}
11289 		    }
11290 		    sv_catpvs(msg, "\"");
11291 		} else {
11292 		    sv_catpvs(msg, "end of string");
11293 		}
11294 		Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, SVfARG(msg)); /* yes, this is reentrant */
11295 	    }
11296 
11297 	    /* output mangled stuff ... */
11298 	    if (c == '\0')
11299 		--q;
11300 	    eptr = p;
11301 	    elen = q - p;
11302 
11303 	    /* ... right here, because formatting flags should not apply */
11304 	    SvGROW(sv, SvCUR(sv) + elen + 1);
11305 	    p = SvEND(sv);
11306 	    Copy(eptr, p, elen, char);
11307 	    p += elen;
11308 	    *p = '\0';
11309 	    SvCUR_set(sv, p - SvPVX_const(sv));
11310 	    svix = osvix;
11311 	    continue;	/* not "break" */
11312 	}
11313 
11314 	if (is_utf8 != has_utf8) {
11315 	    if (is_utf8) {
11316 		if (SvCUR(sv))
11317 		    sv_utf8_upgrade(sv);
11318 	    }
11319 	    else {
11320 		const STRLEN old_elen = elen;
11321 		SV * const nsv = newSVpvn_flags(eptr, elen, SVs_TEMP);
11322 		sv_utf8_upgrade(nsv);
11323 		eptr = SvPVX_const(nsv);
11324 		elen = SvCUR(nsv);
11325 
11326 		if (width) { /* fudge width (can't fudge elen) */
11327 		    width += elen - old_elen;
11328 		}
11329 		is_utf8 = TRUE;
11330 	    }
11331 	}
11332 
11333 	have = esignlen + zeros + elen;
11334 	if (have < zeros)
11335 	    Perl_croak_memory_wrap();
11336 
11337 	need = (have > width ? have : width);
11338 	gap = need - have;
11339 
11340 	if (need >= (((STRLEN)~0) - SvCUR(sv) - dotstrlen - 1))
11341 	    Perl_croak_memory_wrap();
11342 	SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
11343 	p = SvEND(sv);
11344 	if (esignlen && fill == '0') {
11345 	    int i;
11346 	    for (i = 0; i < (int)esignlen; i++)
11347 		*p++ = esignbuf[i];
11348 	}
11349 	if (gap && !left) {
11350 	    memset(p, fill, gap);
11351 	    p += gap;
11352 	}
11353 	if (esignlen && fill != '0') {
11354 	    int i;
11355 	    for (i = 0; i < (int)esignlen; i++)
11356 		*p++ = esignbuf[i];
11357 	}
11358 	if (zeros) {
11359 	    int i;
11360 	    for (i = zeros; i; i--)
11361 		*p++ = '0';
11362 	}
11363 	if (elen) {
11364 	    Copy(eptr, p, elen, char);
11365 	    p += elen;
11366 	}
11367 	if (gap && left) {
11368 	    memset(p, ' ', gap);
11369 	    p += gap;
11370 	}
11371 	if (vectorize) {
11372 	    if (veclen) {
11373 		Copy(dotstr, p, dotstrlen, char);
11374 		p += dotstrlen;
11375 	    }
11376 	    else
11377 		vectorize = FALSE;		/* done iterating over vecstr */
11378 	}
11379 	if (is_utf8)
11380 	    has_utf8 = TRUE;
11381 	if (has_utf8)
11382 	    SvUTF8_on(sv);
11383 	*p = '\0';
11384 	SvCUR_set(sv, p - SvPVX_const(sv));
11385 	if (vectorize) {
11386 	    esignlen = 0;
11387 	    goto vector;
11388 	}
11389     }
11390     SvTAINT(sv);
11391 }
11392 
11393 /* =========================================================================
11394 
11395 =head1 Cloning an interpreter
11396 
11397 All the macros and functions in this section are for the private use of
11398 the main function, perl_clone().
11399 
11400 The foo_dup() functions make an exact copy of an existing foo thingy.
11401 During the course of a cloning, a hash table is used to map old addresses
11402 to new addresses.  The table is created and manipulated with the
11403 ptr_table_* functions.
11404 
11405 =cut
11406 
11407  * =========================================================================*/
11408 
11409 
11410 #if defined(USE_ITHREADS)
11411 
11412 /* XXX Remove this so it doesn't have to go thru the macro and return for nothing */
11413 #ifndef GpREFCNT_inc
11414 #  define GpREFCNT_inc(gp)	((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
11415 #endif
11416 
11417 
11418 /* Certain cases in Perl_ss_dup have been merged, by relying on the fact
11419    that currently av_dup, gv_dup and hv_dup are the same as sv_dup.
11420    If this changes, please unmerge ss_dup.
11421    Likewise, sv_dup_inc_multiple() relies on this fact.  */
11422 #define sv_dup_inc_NN(s,t)	SvREFCNT_inc_NN(sv_dup_inc(s,t))
11423 #define av_dup(s,t)	MUTABLE_AV(sv_dup((const SV *)s,t))
11424 #define av_dup_inc(s,t)	MUTABLE_AV(sv_dup_inc((const SV *)s,t))
11425 #define hv_dup(s,t)	MUTABLE_HV(sv_dup((const SV *)s,t))
11426 #define hv_dup_inc(s,t)	MUTABLE_HV(sv_dup_inc((const SV *)s,t))
11427 #define cv_dup(s,t)	MUTABLE_CV(sv_dup((const SV *)s,t))
11428 #define cv_dup_inc(s,t)	MUTABLE_CV(sv_dup_inc((const SV *)s,t))
11429 #define io_dup(s,t)	MUTABLE_IO(sv_dup((const SV *)s,t))
11430 #define io_dup_inc(s,t)	MUTABLE_IO(sv_dup_inc((const SV *)s,t))
11431 #define gv_dup(s,t)	MUTABLE_GV(sv_dup((const SV *)s,t))
11432 #define gv_dup_inc(s,t)	MUTABLE_GV(sv_dup_inc((const SV *)s,t))
11433 #define SAVEPV(p)	((p) ? savepv(p) : NULL)
11434 #define SAVEPVN(p,n)	((p) ? savepvn(p,n) : NULL)
11435 
11436 /* clone a parser */
11437 
11438 yy_parser *
11439 Perl_parser_dup(pTHX_ const yy_parser *const proto, CLONE_PARAMS *const param)
11440 {
11441     yy_parser *parser;
11442 
11443     PERL_ARGS_ASSERT_PARSER_DUP;
11444 
11445     if (!proto)
11446 	return NULL;
11447 
11448     /* look for it in the table first */
11449     parser = (yy_parser *)ptr_table_fetch(PL_ptr_table, proto);
11450     if (parser)
11451 	return parser;
11452 
11453     /* create anew and remember what it is */
11454     Newxz(parser, 1, yy_parser);
11455     ptr_table_store(PL_ptr_table, proto, parser);
11456 
11457     /* XXX these not yet duped */
11458     parser->old_parser = NULL;
11459     parser->stack = NULL;
11460     parser->ps = NULL;
11461     parser->stack_size = 0;
11462     /* XXX parser->stack->state = 0; */
11463 
11464     /* XXX eventually, just Copy() most of the parser struct ? */
11465 
11466     parser->lex_brackets = proto->lex_brackets;
11467     parser->lex_casemods = proto->lex_casemods;
11468     parser->lex_brackstack = savepvn(proto->lex_brackstack,
11469 		    (proto->lex_brackets < 120 ? 120 : proto->lex_brackets));
11470     parser->lex_casestack = savepvn(proto->lex_casestack,
11471 		    (proto->lex_casemods < 12 ? 12 : proto->lex_casemods));
11472     parser->lex_defer	= proto->lex_defer;
11473     parser->lex_dojoin	= proto->lex_dojoin;
11474     parser->lex_expect	= proto->lex_expect;
11475     parser->lex_formbrack = proto->lex_formbrack;
11476     parser->lex_inpat	= proto->lex_inpat;
11477     parser->lex_inwhat	= proto->lex_inwhat;
11478     parser->lex_op	= proto->lex_op;
11479     parser->lex_repl	= sv_dup_inc(proto->lex_repl, param);
11480     parser->lex_starts	= proto->lex_starts;
11481     parser->lex_stuff	= sv_dup_inc(proto->lex_stuff, param);
11482     parser->multi_close	= proto->multi_close;
11483     parser->multi_open	= proto->multi_open;
11484     parser->multi_start	= proto->multi_start;
11485     parser->multi_end	= proto->multi_end;
11486     parser->preambled	= proto->preambled;
11487     parser->sublex_info	= proto->sublex_info; /* XXX not quite right */
11488     parser->linestr	= sv_dup_inc(proto->linestr, param);
11489     parser->expect	= proto->expect;
11490     parser->copline	= proto->copline;
11491     parser->last_lop_op	= proto->last_lop_op;
11492     parser->lex_state	= proto->lex_state;
11493     parser->rsfp	= fp_dup(proto->rsfp, '<', param);
11494     /* rsfp_filters entries have fake IoDIRP() */
11495     parser->rsfp_filters= av_dup_inc(proto->rsfp_filters, param);
11496     parser->in_my	= proto->in_my;
11497     parser->in_my_stash	= hv_dup(proto->in_my_stash, param);
11498     parser->error_count	= proto->error_count;
11499 
11500 
11501     parser->linestr	= sv_dup_inc(proto->linestr, param);
11502 
11503     {
11504 	char * const ols = SvPVX(proto->linestr);
11505 	char * const ls  = SvPVX(parser->linestr);
11506 
11507 	parser->bufptr	    = ls + (proto->bufptr >= ols ?
11508 				    proto->bufptr -  ols : 0);
11509 	parser->oldbufptr   = ls + (proto->oldbufptr >= ols ?
11510 				    proto->oldbufptr -  ols : 0);
11511 	parser->oldoldbufptr= ls + (proto->oldoldbufptr >= ols ?
11512 				    proto->oldoldbufptr -  ols : 0);
11513 	parser->linestart   = ls + (proto->linestart >= ols ?
11514 				    proto->linestart -  ols : 0);
11515 	parser->last_uni    = ls + (proto->last_uni >= ols ?
11516 				    proto->last_uni -  ols : 0);
11517 	parser->last_lop    = ls + (proto->last_lop >= ols ?
11518 				    proto->last_lop -  ols : 0);
11519 
11520 	parser->bufend	    = ls + SvCUR(parser->linestr);
11521     }
11522 
11523     Copy(proto->tokenbuf, parser->tokenbuf, 256, char);
11524 
11525 
11526 #ifdef PERL_MAD
11527     parser->endwhite	= proto->endwhite;
11528     parser->faketokens	= proto->faketokens;
11529     parser->lasttoke	= proto->lasttoke;
11530     parser->nextwhite	= proto->nextwhite;
11531     parser->realtokenstart = proto->realtokenstart;
11532     parser->skipwhite	= proto->skipwhite;
11533     parser->thisclose	= proto->thisclose;
11534     parser->thismad	= proto->thismad;
11535     parser->thisopen	= proto->thisopen;
11536     parser->thisstuff	= proto->thisstuff;
11537     parser->thistoken	= proto->thistoken;
11538     parser->thiswhite	= proto->thiswhite;
11539 
11540     Copy(proto->nexttoke, parser->nexttoke, 5, NEXTTOKE);
11541     parser->curforce	= proto->curforce;
11542 #else
11543     Copy(proto->nextval, parser->nextval, 5, YYSTYPE);
11544     Copy(proto->nexttype, parser->nexttype, 5,	I32);
11545     parser->nexttoke	= proto->nexttoke;
11546 #endif
11547 
11548     /* XXX should clone saved_curcop here, but we aren't passed
11549      * proto_perl; so do it in perl_clone_using instead */
11550 
11551     return parser;
11552 }
11553 
11554 
11555 /* duplicate a file handle */
11556 
11557 PerlIO *
11558 Perl_fp_dup(pTHX_ PerlIO *const fp, const char type, CLONE_PARAMS *const param)
11559 {
11560     PerlIO *ret;
11561 
11562     PERL_ARGS_ASSERT_FP_DUP;
11563     PERL_UNUSED_ARG(type);
11564 
11565     if (!fp)
11566 	return (PerlIO*)NULL;
11567 
11568     /* look for it in the table first */
11569     ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
11570     if (ret)
11571 	return ret;
11572 
11573     /* create anew and remember what it is */
11574     ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
11575     ptr_table_store(PL_ptr_table, fp, ret);
11576     return ret;
11577 }
11578 
11579 /* duplicate a directory handle */
11580 
11581 DIR *
11582 Perl_dirp_dup(pTHX_ DIR *const dp, CLONE_PARAMS *const param)
11583 {
11584     DIR *ret;
11585 
11586 #ifdef HAS_FCHDIR
11587     DIR *pwd;
11588     const Direntry_t *dirent;
11589     char smallbuf[256];
11590     char *name = NULL;
11591     STRLEN len = 0;
11592     long pos;
11593 #endif
11594 
11595     PERL_UNUSED_CONTEXT;
11596     PERL_ARGS_ASSERT_DIRP_DUP;
11597 
11598     if (!dp)
11599 	return (DIR*)NULL;
11600 
11601     /* look for it in the table first */
11602     ret = (DIR*)ptr_table_fetch(PL_ptr_table, dp);
11603     if (ret)
11604 	return ret;
11605 
11606 #ifdef HAS_FCHDIR
11607 
11608     PERL_UNUSED_ARG(param);
11609 
11610     /* create anew */
11611 
11612     /* open the current directory (so we can switch back) */
11613     if (!(pwd = PerlDir_open("."))) return (DIR *)NULL;
11614 
11615     /* chdir to our dir handle and open the present working directory */
11616     if (fchdir(my_dirfd(dp)) < 0 || !(ret = PerlDir_open("."))) {
11617 	PerlDir_close(pwd);
11618 	return (DIR *)NULL;
11619     }
11620     /* Now we should have two dir handles pointing to the same dir. */
11621 
11622     /* Be nice to the calling code and chdir back to where we were. */
11623     fchdir(my_dirfd(pwd)); /* If this fails, then what? */
11624 
11625     /* We have no need of the pwd handle any more. */
11626     PerlDir_close(pwd);
11627 
11628 #ifdef DIRNAMLEN
11629 # define d_namlen(d) (d)->d_namlen
11630 #else
11631 # define d_namlen(d) strlen((d)->d_name)
11632 #endif
11633     /* Iterate once through dp, to get the file name at the current posi-
11634        tion. Then step back. */
11635     pos = PerlDir_tell(dp);
11636     if ((dirent = PerlDir_read(dp))) {
11637 	len = d_namlen(dirent);
11638 	if (len <= sizeof smallbuf) name = smallbuf;
11639 	else Newx(name, len, char);
11640 	Move(dirent->d_name, name, len, char);
11641     }
11642     PerlDir_seek(dp, pos);
11643 
11644     /* Iterate through the new dir handle, till we find a file with the
11645        right name. */
11646     if (!dirent) /* just before the end */
11647 	for(;;) {
11648 	    pos = PerlDir_tell(ret);
11649 	    if (PerlDir_read(ret)) continue; /* not there yet */
11650 	    PerlDir_seek(ret, pos); /* step back */
11651 	    break;
11652 	}
11653     else {
11654 	const long pos0 = PerlDir_tell(ret);
11655 	for(;;) {
11656 	    pos = PerlDir_tell(ret);
11657 	    if ((dirent = PerlDir_read(ret))) {
11658 		if (len == d_namlen(dirent)
11659 		 && memEQ(name, dirent->d_name, len)) {
11660 		    /* found it */
11661 		    PerlDir_seek(ret, pos); /* step back */
11662 		    break;
11663 		}
11664 		/* else we are not there yet; keep iterating */
11665 	    }
11666 	    else { /* This is not meant to happen. The best we can do is
11667 	              reset the iterator to the beginning. */
11668 		PerlDir_seek(ret, pos0);
11669 		break;
11670 	    }
11671 	}
11672     }
11673 #undef d_namlen
11674 
11675     if (name && name != smallbuf)
11676 	Safefree(name);
11677 #endif
11678 
11679 #ifdef WIN32
11680     ret = win32_dirp_dup(dp, param);
11681 #endif
11682 
11683     /* pop it in the pointer table */
11684     if (ret)
11685 	ptr_table_store(PL_ptr_table, dp, ret);
11686 
11687     return ret;
11688 }
11689 
11690 /* duplicate a typeglob */
11691 
11692 GP *
11693 Perl_gp_dup(pTHX_ GP *const gp, CLONE_PARAMS *const param)
11694 {
11695     GP *ret;
11696 
11697     PERL_ARGS_ASSERT_GP_DUP;
11698 
11699     if (!gp)
11700 	return (GP*)NULL;
11701     /* look for it in the table first */
11702     ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
11703     if (ret)
11704 	return ret;
11705 
11706     /* create anew and remember what it is */
11707     Newxz(ret, 1, GP);
11708     ptr_table_store(PL_ptr_table, gp, ret);
11709 
11710     /* clone */
11711     /* ret->gp_refcnt must be 0 before any other dups are called. We're relying
11712        on Newxz() to do this for us.  */
11713     ret->gp_sv		= sv_dup_inc(gp->gp_sv, param);
11714     ret->gp_io		= io_dup_inc(gp->gp_io, param);
11715     ret->gp_form	= cv_dup_inc(gp->gp_form, param);
11716     ret->gp_av		= av_dup_inc(gp->gp_av, param);
11717     ret->gp_hv		= hv_dup_inc(gp->gp_hv, param);
11718     ret->gp_egv	= gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
11719     ret->gp_cv		= cv_dup_inc(gp->gp_cv, param);
11720     ret->gp_cvgen	= gp->gp_cvgen;
11721     ret->gp_line	= gp->gp_line;
11722     ret->gp_file_hek	= hek_dup(gp->gp_file_hek, param);
11723     return ret;
11724 }
11725 
11726 /* duplicate a chain of magic */
11727 
11728 MAGIC *
11729 Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS *const param)
11730 {
11731     MAGIC *mgret = NULL;
11732     MAGIC **mgprev_p = &mgret;
11733 
11734     PERL_ARGS_ASSERT_MG_DUP;
11735 
11736     for (; mg; mg = mg->mg_moremagic) {
11737 	MAGIC *nmg;
11738 
11739 	if ((param->flags & CLONEf_JOIN_IN)
11740 		&& mg->mg_type == PERL_MAGIC_backref)
11741 	    /* when joining, we let the individual SVs add themselves to
11742 	     * backref as needed. */
11743 	    continue;
11744 
11745 	Newx(nmg, 1, MAGIC);
11746 	*mgprev_p = nmg;
11747 	mgprev_p = &(nmg->mg_moremagic);
11748 
11749 	/* There was a comment "XXX copy dynamic vtable?" but as we don't have
11750 	   dynamic vtables, I'm not sure why Sarathy wrote it. The comment dates
11751 	   from the original commit adding Perl_mg_dup() - revision 4538.
11752 	   Similarly there is the annotation "XXX random ptr?" next to the
11753 	   assignment to nmg->mg_ptr.  */
11754 	*nmg = *mg;
11755 
11756 	/* FIXME for plugins
11757 	if (nmg->mg_type == PERL_MAGIC_qr) {
11758 	    nmg->mg_obj	= MUTABLE_SV(CALLREGDUPE((REGEXP*)nmg->mg_obj, param));
11759 	}
11760 	else
11761 	*/
11762 	nmg->mg_obj = (nmg->mg_flags & MGf_REFCOUNTED)
11763 			  ? nmg->mg_type == PERL_MAGIC_backref
11764 				/* The backref AV has its reference
11765 				 * count deliberately bumped by 1 */
11766 				? SvREFCNT_inc(av_dup_inc((const AV *)
11767 						    nmg->mg_obj, param))
11768 				: sv_dup_inc(nmg->mg_obj, param)
11769 			  : sv_dup(nmg->mg_obj, param);
11770 
11771 	if (nmg->mg_ptr && nmg->mg_type != PERL_MAGIC_regex_global) {
11772 	    if (nmg->mg_len > 0) {
11773 		nmg->mg_ptr	= SAVEPVN(nmg->mg_ptr, nmg->mg_len);
11774 		if (nmg->mg_type == PERL_MAGIC_overload_table &&
11775 			AMT_AMAGIC((AMT*)nmg->mg_ptr))
11776 		{
11777 		    AMT * const namtp = (AMT*)nmg->mg_ptr;
11778 		    sv_dup_inc_multiple((SV**)(namtp->table),
11779 					(SV**)(namtp->table), NofAMmeth, param);
11780 		}
11781 	    }
11782 	    else if (nmg->mg_len == HEf_SVKEY)
11783 		nmg->mg_ptr = (char*)sv_dup_inc((const SV *)nmg->mg_ptr, param);
11784 	}
11785 	if ((nmg->mg_flags & MGf_DUP) && nmg->mg_virtual && nmg->mg_virtual->svt_dup) {
11786 	    nmg->mg_virtual->svt_dup(aTHX_ nmg, param);
11787 	}
11788     }
11789     return mgret;
11790 }
11791 
11792 #endif /* USE_ITHREADS */
11793 
11794 struct ptr_tbl_arena {
11795     struct ptr_tbl_arena *next;
11796     struct ptr_tbl_ent array[1023/3]; /* as ptr_tbl_ent has 3 pointers.  */
11797 };
11798 
11799 /* create a new pointer-mapping table */
11800 
11801 PTR_TBL_t *
11802 Perl_ptr_table_new(pTHX)
11803 {
11804     PTR_TBL_t *tbl;
11805     PERL_UNUSED_CONTEXT;
11806 
11807     Newx(tbl, 1, PTR_TBL_t);
11808     tbl->tbl_max	= 511;
11809     tbl->tbl_items	= 0;
11810     tbl->tbl_arena	= NULL;
11811     tbl->tbl_arena_next	= NULL;
11812     tbl->tbl_arena_end	= NULL;
11813     Newxz(tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
11814     return tbl;
11815 }
11816 
11817 #define PTR_TABLE_HASH(ptr) \
11818   ((PTR2UV(ptr) >> 3) ^ (PTR2UV(ptr) >> (3 + 7)) ^ (PTR2UV(ptr) >> (3 + 17)))
11819 
11820 /* map an existing pointer using a table */
11821 
11822 STATIC PTR_TBL_ENT_t *
11823 S_ptr_table_find(PTR_TBL_t *const tbl, const void *const sv)
11824 {
11825     PTR_TBL_ENT_t *tblent;
11826     const UV hash = PTR_TABLE_HASH(sv);
11827 
11828     PERL_ARGS_ASSERT_PTR_TABLE_FIND;
11829 
11830     tblent = tbl->tbl_ary[hash & tbl->tbl_max];
11831     for (; tblent; tblent = tblent->next) {
11832 	if (tblent->oldval == sv)
11833 	    return tblent;
11834     }
11835     return NULL;
11836 }
11837 
11838 void *
11839 Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *const tbl, const void *const sv)
11840 {
11841     PTR_TBL_ENT_t const *const tblent = ptr_table_find(tbl, sv);
11842 
11843     PERL_ARGS_ASSERT_PTR_TABLE_FETCH;
11844     PERL_UNUSED_CONTEXT;
11845 
11846     return tblent ? tblent->newval : NULL;
11847 }
11848 
11849 /* add a new entry to a pointer-mapping table */
11850 
11851 void
11852 Perl_ptr_table_store(pTHX_ PTR_TBL_t *const tbl, const void *const oldsv, void *const newsv)
11853 {
11854     PTR_TBL_ENT_t *tblent = ptr_table_find(tbl, oldsv);
11855 
11856     PERL_ARGS_ASSERT_PTR_TABLE_STORE;
11857     PERL_UNUSED_CONTEXT;
11858 
11859     if (tblent) {
11860 	tblent->newval = newsv;
11861     } else {
11862 	const UV entry = PTR_TABLE_HASH(oldsv) & tbl->tbl_max;
11863 
11864 	if (tbl->tbl_arena_next == tbl->tbl_arena_end) {
11865 	    struct ptr_tbl_arena *new_arena;
11866 
11867 	    Newx(new_arena, 1, struct ptr_tbl_arena);
11868 	    new_arena->next = tbl->tbl_arena;
11869 	    tbl->tbl_arena = new_arena;
11870 	    tbl->tbl_arena_next = new_arena->array;
11871 	    tbl->tbl_arena_end = new_arena->array
11872 		+ sizeof(new_arena->array) / sizeof(new_arena->array[0]);
11873 	}
11874 
11875 	tblent = tbl->tbl_arena_next++;
11876 
11877 	tblent->oldval = oldsv;
11878 	tblent->newval = newsv;
11879 	tblent->next = tbl->tbl_ary[entry];
11880 	tbl->tbl_ary[entry] = tblent;
11881 	tbl->tbl_items++;
11882 	if (tblent->next && tbl->tbl_items > tbl->tbl_max)
11883 	    ptr_table_split(tbl);
11884     }
11885 }
11886 
11887 /* double the hash bucket size of an existing ptr table */
11888 
11889 void
11890 Perl_ptr_table_split(pTHX_ PTR_TBL_t *const tbl)
11891 {
11892     PTR_TBL_ENT_t **ary = tbl->tbl_ary;
11893     const UV oldsize = tbl->tbl_max + 1;
11894     UV newsize = oldsize * 2;
11895     UV i;
11896 
11897     PERL_ARGS_ASSERT_PTR_TABLE_SPLIT;
11898     PERL_UNUSED_CONTEXT;
11899 
11900     Renew(ary, newsize, PTR_TBL_ENT_t*);
11901     Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
11902     tbl->tbl_max = --newsize;
11903     tbl->tbl_ary = ary;
11904     for (i=0; i < oldsize; i++, ary++) {
11905 	PTR_TBL_ENT_t **entp = ary;
11906 	PTR_TBL_ENT_t *ent = *ary;
11907 	PTR_TBL_ENT_t **curentp;
11908 	if (!ent)
11909 	    continue;
11910 	curentp = ary + oldsize;
11911 	do {
11912 	    if ((newsize & PTR_TABLE_HASH(ent->oldval)) != i) {
11913 		*entp = ent->next;
11914 		ent->next = *curentp;
11915 		*curentp = ent;
11916 	    }
11917 	    else
11918 		entp = &ent->next;
11919 	    ent = *entp;
11920 	} while (ent);
11921     }
11922 }
11923 
11924 /* remove all the entries from a ptr table */
11925 /* Deprecated - will be removed post 5.14 */
11926 
11927 void
11928 Perl_ptr_table_clear(pTHX_ PTR_TBL_t *const tbl)
11929 {
11930     if (tbl && tbl->tbl_items) {
11931 	struct ptr_tbl_arena *arena = tbl->tbl_arena;
11932 
11933 	Zero(tbl->tbl_ary, tbl->tbl_max + 1, struct ptr_tbl_ent **);
11934 
11935 	while (arena) {
11936 	    struct ptr_tbl_arena *next = arena->next;
11937 
11938 	    Safefree(arena);
11939 	    arena = next;
11940 	};
11941 
11942 	tbl->tbl_items = 0;
11943 	tbl->tbl_arena = NULL;
11944 	tbl->tbl_arena_next = NULL;
11945 	tbl->tbl_arena_end = NULL;
11946     }
11947 }
11948 
11949 /* clear and free a ptr table */
11950 
11951 void
11952 Perl_ptr_table_free(pTHX_ PTR_TBL_t *const tbl)
11953 {
11954     struct ptr_tbl_arena *arena;
11955 
11956     if (!tbl) {
11957         return;
11958     }
11959 
11960     arena = tbl->tbl_arena;
11961 
11962     while (arena) {
11963 	struct ptr_tbl_arena *next = arena->next;
11964 
11965 	Safefree(arena);
11966 	arena = next;
11967     }
11968 
11969     Safefree(tbl->tbl_ary);
11970     Safefree(tbl);
11971 }
11972 
11973 #if defined(USE_ITHREADS)
11974 
11975 void
11976 Perl_rvpv_dup(pTHX_ SV *const dstr, const SV *const sstr, CLONE_PARAMS *const param)
11977 {
11978     PERL_ARGS_ASSERT_RVPV_DUP;
11979 
11980     assert(!isREGEXP(sstr));
11981     if (SvROK(sstr)) {
11982 	if (SvWEAKREF(sstr)) {
11983 	    SvRV_set(dstr, sv_dup(SvRV_const(sstr), param));
11984 	    if (param->flags & CLONEf_JOIN_IN) {
11985 		/* if joining, we add any back references individually rather
11986 		 * than copying the whole backref array */
11987 		Perl_sv_add_backref(aTHX_ SvRV(dstr), dstr);
11988 	    }
11989 	}
11990 	else
11991 	    SvRV_set(dstr, sv_dup_inc(SvRV_const(sstr), param));
11992     }
11993     else if (SvPVX_const(sstr)) {
11994 	/* Has something there */
11995 	if (SvLEN(sstr)) {
11996 	    /* Normal PV - clone whole allocated space */
11997 	    SvPV_set(dstr, SAVEPVN(SvPVX_const(sstr), SvLEN(sstr)-1));
11998 	    /* sstr may not be that normal, but actually copy on write.
11999 	       But we are a true, independent SV, so:  */
12000 	    SvIsCOW_off(dstr);
12001 	}
12002 	else {
12003 	    /* Special case - not normally malloced for some reason */
12004 	    if (isGV_with_GP(sstr)) {
12005 		/* Don't need to do anything here.  */
12006 	    }
12007 	    else if ((SvIsCOW(sstr))) {
12008 		/* A "shared" PV - clone it as "shared" PV */
12009 		SvPV_set(dstr,
12010 			 HEK_KEY(hek_dup(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)),
12011 					 param)));
12012 	    }
12013 	    else {
12014 		/* Some other special case - random pointer */
12015 		SvPV_set(dstr, (char *) SvPVX_const(sstr));
12016 	    }
12017 	}
12018     }
12019     else {
12020 	/* Copy the NULL */
12021 	SvPV_set(dstr, NULL);
12022     }
12023 }
12024 
12025 /* duplicate a list of SVs. source and dest may point to the same memory.  */
12026 static SV **
12027 S_sv_dup_inc_multiple(pTHX_ SV *const *source, SV **dest,
12028 		      SSize_t items, CLONE_PARAMS *const param)
12029 {
12030     PERL_ARGS_ASSERT_SV_DUP_INC_MULTIPLE;
12031 
12032     while (items-- > 0) {
12033 	*dest++ = sv_dup_inc(*source++, param);
12034     }
12035 
12036     return dest;
12037 }
12038 
12039 /* duplicate an SV of any type (including AV, HV etc) */
12040 
12041 static SV *
12042 S_sv_dup_common(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
12043 {
12044     dVAR;
12045     SV *dstr;
12046 
12047     PERL_ARGS_ASSERT_SV_DUP_COMMON;
12048 
12049     if (SvTYPE(sstr) == (svtype)SVTYPEMASK) {
12050 #ifdef DEBUG_LEAKING_SCALARS_ABORT
12051 	abort();
12052 #endif
12053 	return NULL;
12054     }
12055     /* look for it in the table first */
12056     dstr = MUTABLE_SV(ptr_table_fetch(PL_ptr_table, sstr));
12057     if (dstr)
12058 	return dstr;
12059 
12060     if(param->flags & CLONEf_JOIN_IN) {
12061         /** We are joining here so we don't want do clone
12062 	    something that is bad **/
12063 	if (SvTYPE(sstr) == SVt_PVHV) {
12064 	    const HEK * const hvname = HvNAME_HEK(sstr);
12065 	    if (hvname) {
12066 		/** don't clone stashes if they already exist **/
12067 		dstr = MUTABLE_SV(gv_stashpvn(HEK_KEY(hvname), HEK_LEN(hvname),
12068                                                 HEK_UTF8(hvname) ? SVf_UTF8 : 0));
12069 		ptr_table_store(PL_ptr_table, sstr, dstr);
12070 		return dstr;
12071 	    }
12072         }
12073 	else if (SvTYPE(sstr) == SVt_PVGV && !SvFAKE(sstr)) {
12074 	    HV *stash = GvSTASH(sstr);
12075 	    const HEK * hvname;
12076 	    if (stash && (hvname = HvNAME_HEK(stash))) {
12077 		/** don't clone GVs if they already exist **/
12078 		SV **svp;
12079 		stash = gv_stashpvn(HEK_KEY(hvname), HEK_LEN(hvname),
12080 				    HEK_UTF8(hvname) ? SVf_UTF8 : 0);
12081 		svp = hv_fetch(
12082 			stash, GvNAME(sstr),
12083 			GvNAMEUTF8(sstr)
12084 			    ? -GvNAMELEN(sstr)
12085 			    :  GvNAMELEN(sstr),
12086 			0
12087 		      );
12088 		if (svp && *svp && SvTYPE(*svp) == SVt_PVGV) {
12089 		    ptr_table_store(PL_ptr_table, sstr, *svp);
12090 		    return *svp;
12091 		}
12092 	    }
12093         }
12094     }
12095 
12096     /* create anew and remember what it is */
12097     new_SV(dstr);
12098 
12099 #ifdef DEBUG_LEAKING_SCALARS
12100     dstr->sv_debug_optype = sstr->sv_debug_optype;
12101     dstr->sv_debug_line = sstr->sv_debug_line;
12102     dstr->sv_debug_inpad = sstr->sv_debug_inpad;
12103     dstr->sv_debug_parent = (SV*)sstr;
12104     FREE_SV_DEBUG_FILE(dstr);
12105     dstr->sv_debug_file = savesharedpv(sstr->sv_debug_file);
12106 #endif
12107 
12108     ptr_table_store(PL_ptr_table, sstr, dstr);
12109 
12110     /* clone */
12111     SvFLAGS(dstr)	= SvFLAGS(sstr);
12112     SvFLAGS(dstr)	&= ~SVf_OOK;		/* don't propagate OOK hack */
12113     SvREFCNT(dstr)	= 0;			/* must be before any other dups! */
12114 
12115 #ifdef DEBUGGING
12116     if (SvANY(sstr) && PL_watch_pvx && SvPVX_const(sstr) == PL_watch_pvx)
12117 	PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
12118 		      (void*)PL_watch_pvx, SvPVX_const(sstr));
12119 #endif
12120 
12121     /* don't clone objects whose class has asked us not to */
12122     if (SvOBJECT(sstr) && ! (SvFLAGS(SvSTASH(sstr)) & SVphv_CLONEABLE)) {
12123 	SvFLAGS(dstr) = 0;
12124 	return dstr;
12125     }
12126 
12127     switch (SvTYPE(sstr)) {
12128     case SVt_NULL:
12129 	SvANY(dstr)	= NULL;
12130 	break;
12131     case SVt_IV:
12132 	SvANY(dstr)	= (XPVIV*)((char*)&(dstr->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
12133 	if(SvROK(sstr)) {
12134 	    Perl_rvpv_dup(aTHX_ dstr, sstr, param);
12135 	} else {
12136 	    SvIV_set(dstr, SvIVX(sstr));
12137 	}
12138 	break;
12139     case SVt_NV:
12140 	SvANY(dstr)	= new_XNV();
12141 	SvNV_set(dstr, SvNVX(sstr));
12142 	break;
12143 	/* case SVt_BIND: */
12144     default:
12145 	{
12146 	    /* These are all the types that need complex bodies allocating.  */
12147 	    void *new_body;
12148 	    const svtype sv_type = SvTYPE(sstr);
12149 	    const struct body_details *const sv_type_details
12150 		= bodies_by_type + sv_type;
12151 
12152 	    switch (sv_type) {
12153 	    default:
12154 		Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
12155 		break;
12156 
12157 	    case SVt_PVGV:
12158 	    case SVt_PVIO:
12159 	    case SVt_PVFM:
12160 	    case SVt_PVHV:
12161 	    case SVt_PVAV:
12162 	    case SVt_PVCV:
12163 	    case SVt_PVLV:
12164 	    case SVt_REGEXP:
12165 	    case SVt_PVMG:
12166 	    case SVt_PVNV:
12167 	    case SVt_PVIV:
12168 	    case SVt_PV:
12169 		assert(sv_type_details->body_size);
12170 		if (sv_type_details->arena) {
12171 		    new_body_inline(new_body, sv_type);
12172 		    new_body
12173 			= (void*)((char*)new_body - sv_type_details->offset);
12174 		} else {
12175 		    new_body = new_NOARENA(sv_type_details);
12176 		}
12177 	    }
12178 	    assert(new_body);
12179 	    SvANY(dstr) = new_body;
12180 
12181 #ifndef PURIFY
12182 	    Copy(((char*)SvANY(sstr)) + sv_type_details->offset,
12183 		 ((char*)SvANY(dstr)) + sv_type_details->offset,
12184 		 sv_type_details->copy, char);
12185 #else
12186 	    Copy(((char*)SvANY(sstr)),
12187 		 ((char*)SvANY(dstr)),
12188 		 sv_type_details->body_size + sv_type_details->offset, char);
12189 #endif
12190 
12191 	    if (sv_type != SVt_PVAV && sv_type != SVt_PVHV
12192 		&& !isGV_with_GP(dstr)
12193 		&& !isREGEXP(dstr)
12194 		&& !(sv_type == SVt_PVIO && !(IoFLAGS(dstr) & IOf_FAKE_DIRP)))
12195 		Perl_rvpv_dup(aTHX_ dstr, sstr, param);
12196 
12197 	    /* The Copy above means that all the source (unduplicated) pointers
12198 	       are now in the destination.  We can check the flags and the
12199 	       pointers in either, but it's possible that there's less cache
12200 	       missing by always going for the destination.
12201 	       FIXME - instrument and check that assumption  */
12202 	    if (sv_type >= SVt_PVMG) {
12203 		if ((sv_type == SVt_PVMG) && SvPAD_OUR(dstr)) {
12204 		    SvOURSTASH_set(dstr, hv_dup_inc(SvOURSTASH(dstr), param));
12205 		} else if (SvMAGIC(dstr))
12206 		    SvMAGIC_set(dstr, mg_dup(SvMAGIC(dstr), param));
12207 		if (SvOBJECT(dstr) && SvSTASH(dstr))
12208 		    SvSTASH_set(dstr, hv_dup_inc(SvSTASH(dstr), param));
12209 		else SvSTASH_set(dstr, 0); /* don't copy DESTROY cache */
12210 	    }
12211 
12212 	    /* The cast silences a GCC warning about unhandled types.  */
12213 	    switch ((int)sv_type) {
12214 	    case SVt_PV:
12215 		break;
12216 	    case SVt_PVIV:
12217 		break;
12218 	    case SVt_PVNV:
12219 		break;
12220 	    case SVt_PVMG:
12221 		break;
12222 	    case SVt_REGEXP:
12223 	      duprex:
12224 		/* FIXME for plugins */
12225 		dstr->sv_u.svu_rx = ((REGEXP *)dstr)->sv_any;
12226 		re_dup_guts((REGEXP*) sstr, (REGEXP*) dstr, param);
12227 		break;
12228 	    case SVt_PVLV:
12229 		/* XXX LvTARGOFF sometimes holds PMOP* when DEBUGGING */
12230 		if (LvTYPE(dstr) == 't') /* for tie: unrefcnted fake (SV**) */
12231 		    LvTARG(dstr) = dstr;
12232 		else if (LvTYPE(dstr) == 'T') /* for tie: fake HE */
12233 		    LvTARG(dstr) = MUTABLE_SV(he_dup((HE*)LvTARG(dstr), 0, param));
12234 		else
12235 		    LvTARG(dstr) = sv_dup_inc(LvTARG(dstr), param);
12236 		if (isREGEXP(sstr)) goto duprex;
12237 	    case SVt_PVGV:
12238 		/* non-GP case already handled above */
12239 		if(isGV_with_GP(sstr)) {
12240 		    GvNAME_HEK(dstr) = hek_dup(GvNAME_HEK(dstr), param);
12241 		    /* Don't call sv_add_backref here as it's going to be
12242 		       created as part of the magic cloning of the symbol
12243 		       table--unless this is during a join and the stash
12244 		       is not actually being cloned.  */
12245 		    /* Danger Will Robinson - GvGP(dstr) isn't initialised
12246 		       at the point of this comment.  */
12247 		    GvSTASH(dstr) = hv_dup(GvSTASH(dstr), param);
12248 		    if (param->flags & CLONEf_JOIN_IN)
12249 			Perl_sv_add_backref(aTHX_ MUTABLE_SV(GvSTASH(dstr)), dstr);
12250 		    GvGP_set(dstr, gp_dup(GvGP(sstr), param));
12251 		    (void)GpREFCNT_inc(GvGP(dstr));
12252 		}
12253 		break;
12254 	    case SVt_PVIO:
12255 		/* PL_parser->rsfp_filters entries have fake IoDIRP() */
12256 		if(IoFLAGS(dstr) & IOf_FAKE_DIRP) {
12257 		    /* I have no idea why fake dirp (rsfps)
12258 		       should be treated differently but otherwise
12259 		       we end up with leaks -- sky*/
12260 		    IoTOP_GV(dstr)      = gv_dup_inc(IoTOP_GV(dstr), param);
12261 		    IoFMT_GV(dstr)      = gv_dup_inc(IoFMT_GV(dstr), param);
12262 		    IoBOTTOM_GV(dstr)   = gv_dup_inc(IoBOTTOM_GV(dstr), param);
12263 		} else {
12264 		    IoTOP_GV(dstr)      = gv_dup(IoTOP_GV(dstr), param);
12265 		    IoFMT_GV(dstr)      = gv_dup(IoFMT_GV(dstr), param);
12266 		    IoBOTTOM_GV(dstr)   = gv_dup(IoBOTTOM_GV(dstr), param);
12267 		    if (IoDIRP(dstr)) {
12268 			IoDIRP(dstr)	= dirp_dup(IoDIRP(dstr), param);
12269 		    } else {
12270 			NOOP;
12271 			/* IoDIRP(dstr) is already a copy of IoDIRP(sstr)  */
12272 		    }
12273 		    IoIFP(dstr)	= fp_dup(IoIFP(sstr), IoTYPE(dstr), param);
12274 		}
12275 		if (IoOFP(dstr) == IoIFP(sstr))
12276 		    IoOFP(dstr) = IoIFP(dstr);
12277 		else
12278 		    IoOFP(dstr)	= fp_dup(IoOFP(dstr), IoTYPE(dstr), param);
12279 		IoTOP_NAME(dstr)	= SAVEPV(IoTOP_NAME(dstr));
12280 		IoFMT_NAME(dstr)	= SAVEPV(IoFMT_NAME(dstr));
12281 		IoBOTTOM_NAME(dstr)	= SAVEPV(IoBOTTOM_NAME(dstr));
12282 		break;
12283 	    case SVt_PVAV:
12284 		/* avoid cloning an empty array */
12285 		if (AvARRAY((const AV *)sstr) && AvFILLp((const AV *)sstr) >= 0) {
12286 		    SV **dst_ary, **src_ary;
12287 		    SSize_t items = AvFILLp((const AV *)sstr) + 1;
12288 
12289 		    src_ary = AvARRAY((const AV *)sstr);
12290 		    Newxz(dst_ary, AvMAX((const AV *)sstr)+1, SV*);
12291 		    ptr_table_store(PL_ptr_table, src_ary, dst_ary);
12292 		    AvARRAY(MUTABLE_AV(dstr)) = dst_ary;
12293 		    AvALLOC((const AV *)dstr) = dst_ary;
12294 		    if (AvREAL((const AV *)sstr)) {
12295 			dst_ary = sv_dup_inc_multiple(src_ary, dst_ary, items,
12296 						      param);
12297 		    }
12298 		    else {
12299 			while (items-- > 0)
12300 			    *dst_ary++ = sv_dup(*src_ary++, param);
12301 		    }
12302 		    items = AvMAX((const AV *)sstr) - AvFILLp((const AV *)sstr);
12303 		    while (items-- > 0) {
12304 			*dst_ary++ = &PL_sv_undef;
12305 		    }
12306 		}
12307 		else {
12308 		    AvARRAY(MUTABLE_AV(dstr))	= NULL;
12309 		    AvALLOC((const AV *)dstr)	= (SV**)NULL;
12310 		    AvMAX(  (const AV *)dstr)	= -1;
12311 		    AvFILLp((const AV *)dstr)	= -1;
12312 		}
12313 		break;
12314 	    case SVt_PVHV:
12315 		if (HvARRAY((const HV *)sstr)) {
12316 		    STRLEN i = 0;
12317 		    const bool sharekeys = !!HvSHAREKEYS(sstr);
12318 		    XPVHV * const dxhv = (XPVHV*)SvANY(dstr);
12319 		    XPVHV * const sxhv = (XPVHV*)SvANY(sstr);
12320 		    char *darray;
12321 		    Newx(darray, PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1)
12322 			+ (SvOOK(sstr) ? sizeof(struct xpvhv_aux) : 0),
12323 			char);
12324 		    HvARRAY(dstr) = (HE**)darray;
12325 		    while (i <= sxhv->xhv_max) {
12326 			const HE * const source = HvARRAY(sstr)[i];
12327 			HvARRAY(dstr)[i] = source
12328 			    ? he_dup(source, sharekeys, param) : 0;
12329 			++i;
12330 		    }
12331 		    if (SvOOK(sstr)) {
12332 			const struct xpvhv_aux * const saux = HvAUX(sstr);
12333 			struct xpvhv_aux * const daux = HvAUX(dstr);
12334 			/* This flag isn't copied.  */
12335 			SvOOK_on(dstr);
12336 
12337 			if (saux->xhv_name_count) {
12338 			    HEK ** const sname = saux->xhv_name_u.xhvnameu_names;
12339 			    const I32 count
12340 			     = saux->xhv_name_count < 0
12341 			        ? -saux->xhv_name_count
12342 			        :  saux->xhv_name_count;
12343 			    HEK **shekp = sname + count;
12344 			    HEK **dhekp;
12345 			    Newx(daux->xhv_name_u.xhvnameu_names, count, HEK *);
12346 			    dhekp = daux->xhv_name_u.xhvnameu_names + count;
12347 			    while (shekp-- > sname) {
12348 				dhekp--;
12349 				*dhekp = hek_dup(*shekp, param);
12350 			    }
12351 			}
12352 			else {
12353 			    daux->xhv_name_u.xhvnameu_name
12354 				= hek_dup(saux->xhv_name_u.xhvnameu_name,
12355 					  param);
12356 			}
12357 			daux->xhv_name_count = saux->xhv_name_count;
12358 
12359 			daux->xhv_riter = saux->xhv_riter;
12360 			daux->xhv_eiter = saux->xhv_eiter
12361 			    ? he_dup(saux->xhv_eiter,
12362 					cBOOL(HvSHAREKEYS(sstr)), param) : 0;
12363 			/* backref array needs refcnt=2; see sv_add_backref */
12364 			daux->xhv_backreferences =
12365 			    (param->flags & CLONEf_JOIN_IN)
12366 				/* when joining, we let the individual GVs and
12367 				 * CVs add themselves to backref as
12368 				 * needed. This avoids pulling in stuff
12369 				 * that isn't required, and simplifies the
12370 				 * case where stashes aren't cloned back
12371 				 * if they already exist in the parent
12372 				 * thread */
12373 			    ? NULL
12374 			    : saux->xhv_backreferences
12375 				? (SvTYPE(saux->xhv_backreferences) == SVt_PVAV)
12376 				    ? MUTABLE_AV(SvREFCNT_inc(
12377 					  sv_dup_inc((const SV *)
12378 					    saux->xhv_backreferences, param)))
12379 				    : MUTABLE_AV(sv_dup((const SV *)
12380 					    saux->xhv_backreferences, param))
12381 				: 0;
12382 
12383                         daux->xhv_mro_meta = saux->xhv_mro_meta
12384                             ? mro_meta_dup(saux->xhv_mro_meta, param)
12385                             : 0;
12386 			daux->xhv_super = NULL;
12387 
12388 			/* Record stashes for possible cloning in Perl_clone(). */
12389 			if (HvNAME(sstr))
12390 			    av_push(param->stashes, dstr);
12391 		    }
12392 		}
12393 		else
12394 		    HvARRAY(MUTABLE_HV(dstr)) = NULL;
12395 		break;
12396 	    case SVt_PVCV:
12397 		if (!(param->flags & CLONEf_COPY_STACKS)) {
12398 		    CvDEPTH(dstr) = 0;
12399 		}
12400 		/*FALLTHROUGH*/
12401 	    case SVt_PVFM:
12402 		/* NOTE: not refcounted */
12403 		SvANY(MUTABLE_CV(dstr))->xcv_stash =
12404 		    hv_dup(CvSTASH(dstr), param);
12405 		if ((param->flags & CLONEf_JOIN_IN) && CvSTASH(dstr))
12406 		    Perl_sv_add_backref(aTHX_ MUTABLE_SV(CvSTASH(dstr)), dstr);
12407 		if (!CvISXSUB(dstr)) {
12408 		    OP_REFCNT_LOCK;
12409 		    CvROOT(dstr) = OpREFCNT_inc(CvROOT(dstr));
12410 		    OP_REFCNT_UNLOCK;
12411 		    CvSLABBED_off(dstr);
12412 		} else if (CvCONST(dstr)) {
12413 		    CvXSUBANY(dstr).any_ptr =
12414 			sv_dup_inc((const SV *)CvXSUBANY(dstr).any_ptr, param);
12415 		}
12416 		assert(!CvSLABBED(dstr));
12417 		if (CvDYNFILE(dstr)) CvFILE(dstr) = SAVEPV(CvFILE(dstr));
12418 		if (CvNAMED(dstr))
12419 		    SvANY((CV *)dstr)->xcv_gv_u.xcv_hek =
12420 			share_hek_hek(CvNAME_HEK((CV *)sstr));
12421 		/* don't dup if copying back - CvGV isn't refcounted, so the
12422 		 * duped GV may never be freed. A bit of a hack! DAPM */
12423 		else
12424 		  SvANY(MUTABLE_CV(dstr))->xcv_gv_u.xcv_gv =
12425 		    CvCVGV_RC(dstr)
12426 		    ? gv_dup_inc(CvGV(sstr), param)
12427 		    : (param->flags & CLONEf_JOIN_IN)
12428 			? NULL
12429 			: gv_dup(CvGV(sstr), param);
12430 
12431 		CvPADLIST(dstr) = padlist_dup(CvPADLIST(sstr), param);
12432 		CvOUTSIDE(dstr)	=
12433 		    CvWEAKOUTSIDE(sstr)
12434 		    ? cv_dup(    CvOUTSIDE(dstr), param)
12435 		    : cv_dup_inc(CvOUTSIDE(dstr), param);
12436 		break;
12437 	    }
12438 	}
12439     }
12440 
12441     return dstr;
12442  }
12443 
12444 SV *
12445 Perl_sv_dup_inc(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
12446 {
12447     PERL_ARGS_ASSERT_SV_DUP_INC;
12448     return sstr ? SvREFCNT_inc(sv_dup_common(sstr, param)) : NULL;
12449 }
12450 
12451 SV *
12452 Perl_sv_dup(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
12453 {
12454     SV *dstr = sstr ? sv_dup_common(sstr, param) : NULL;
12455     PERL_ARGS_ASSERT_SV_DUP;
12456 
12457     /* Track every SV that (at least initially) had a reference count of 0.
12458        We need to do this by holding an actual reference to it in this array.
12459        If we attempt to cheat, turn AvREAL_off(), and store only pointers
12460        (akin to the stashes hash, and the perl stack), we come unstuck if
12461        a weak reference (or other SV legitimately SvREFCNT() == 0 for this
12462        thread) is manipulated in a CLONE method, because CLONE runs before the
12463        unreferenced array is walked to find SVs still with SvREFCNT() == 0
12464        (and fix things up by giving each a reference via the temps stack).
12465        Instead, during CLONE, if the 0-referenced SV has SvREFCNT_inc() and
12466        then SvREFCNT_dec(), it will be cleaned up (and added to the free list)
12467        before the walk of unreferenced happens and a reference to that is SV
12468        added to the temps stack. At which point we have the same SV considered
12469        to be in use, and free to be re-used. Not good.
12470     */
12471     if (dstr && !(param->flags & CLONEf_COPY_STACKS) && !SvREFCNT(dstr)) {
12472 	assert(param->unreferenced);
12473 	av_push(param->unreferenced, SvREFCNT_inc(dstr));
12474     }
12475 
12476     return dstr;
12477 }
12478 
12479 /* duplicate a context */
12480 
12481 PERL_CONTEXT *
12482 Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
12483 {
12484     PERL_CONTEXT *ncxs;
12485 
12486     PERL_ARGS_ASSERT_CX_DUP;
12487 
12488     if (!cxs)
12489 	return (PERL_CONTEXT*)NULL;
12490 
12491     /* look for it in the table first */
12492     ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
12493     if (ncxs)
12494 	return ncxs;
12495 
12496     /* create anew and remember what it is */
12497     Newx(ncxs, max + 1, PERL_CONTEXT);
12498     ptr_table_store(PL_ptr_table, cxs, ncxs);
12499     Copy(cxs, ncxs, max + 1, PERL_CONTEXT);
12500 
12501     while (ix >= 0) {
12502 	PERL_CONTEXT * const ncx = &ncxs[ix];
12503 	if (CxTYPE(ncx) == CXt_SUBST) {
12504 	    Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
12505 	}
12506 	else {
12507 	    ncx->blk_oldcop = (COP*)any_dup(ncx->blk_oldcop, param->proto_perl);
12508 	    switch (CxTYPE(ncx)) {
12509 	    case CXt_SUB:
12510 		ncx->blk_sub.cv		= (ncx->blk_sub.olddepth == 0
12511 					   ? cv_dup_inc(ncx->blk_sub.cv, param)
12512 					   : cv_dup(ncx->blk_sub.cv,param));
12513 		ncx->blk_sub.argarray	= (CxHASARGS(ncx)
12514 					   ? av_dup_inc(ncx->blk_sub.argarray,
12515 							param)
12516 					   : NULL);
12517 		ncx->blk_sub.savearray	= av_dup_inc(ncx->blk_sub.savearray,
12518 						     param);
12519 		ncx->blk_sub.oldcomppad = (PAD*)ptr_table_fetch(PL_ptr_table,
12520 					   ncx->blk_sub.oldcomppad);
12521 		break;
12522 	    case CXt_EVAL:
12523 		ncx->blk_eval.old_namesv = sv_dup_inc(ncx->blk_eval.old_namesv,
12524 						      param);
12525 		ncx->blk_eval.cur_text	= sv_dup(ncx->blk_eval.cur_text, param);
12526 		ncx->blk_eval.cv = cv_dup(ncx->blk_eval.cv, param);
12527 		break;
12528 	    case CXt_LOOP_LAZYSV:
12529 		ncx->blk_loop.state_u.lazysv.end
12530 		    = sv_dup_inc(ncx->blk_loop.state_u.lazysv.end, param);
12531 		/* We are taking advantage of av_dup_inc and sv_dup_inc
12532 		   actually being the same function, and order equivalence of
12533 		   the two unions.
12534 		   We can assert the later [but only at run time :-(]  */
12535 		assert ((void *) &ncx->blk_loop.state_u.ary.ary ==
12536 			(void *) &ncx->blk_loop.state_u.lazysv.cur);
12537 	    case CXt_LOOP_FOR:
12538 		ncx->blk_loop.state_u.ary.ary
12539 		    = av_dup_inc(ncx->blk_loop.state_u.ary.ary, param);
12540 	    case CXt_LOOP_LAZYIV:
12541 	    case CXt_LOOP_PLAIN:
12542 		if (CxPADLOOP(ncx)) {
12543 		    ncx->blk_loop.itervar_u.oldcomppad
12544 			= (PAD*)ptr_table_fetch(PL_ptr_table,
12545 					ncx->blk_loop.itervar_u.oldcomppad);
12546 		} else {
12547 		    ncx->blk_loop.itervar_u.gv
12548 			= gv_dup((const GV *)ncx->blk_loop.itervar_u.gv,
12549 				    param);
12550 		}
12551 		break;
12552 	    case CXt_FORMAT:
12553 		ncx->blk_format.cv	= cv_dup(ncx->blk_format.cv, param);
12554 		ncx->blk_format.gv	= gv_dup(ncx->blk_format.gv, param);
12555 		ncx->blk_format.dfoutgv	= gv_dup_inc(ncx->blk_format.dfoutgv,
12556 						     param);
12557 		break;
12558 	    case CXt_BLOCK:
12559 	    case CXt_NULL:
12560 	    case CXt_WHEN:
12561 	    case CXt_GIVEN:
12562 		break;
12563 	    }
12564 	}
12565 	--ix;
12566     }
12567     return ncxs;
12568 }
12569 
12570 /* duplicate a stack info structure */
12571 
12572 PERL_SI *
12573 Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
12574 {
12575     PERL_SI *nsi;
12576 
12577     PERL_ARGS_ASSERT_SI_DUP;
12578 
12579     if (!si)
12580 	return (PERL_SI*)NULL;
12581 
12582     /* look for it in the table first */
12583     nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
12584     if (nsi)
12585 	return nsi;
12586 
12587     /* create anew and remember what it is */
12588     Newxz(nsi, 1, PERL_SI);
12589     ptr_table_store(PL_ptr_table, si, nsi);
12590 
12591     nsi->si_stack	= av_dup_inc(si->si_stack, param);
12592     nsi->si_cxix	= si->si_cxix;
12593     nsi->si_cxmax	= si->si_cxmax;
12594     nsi->si_cxstack	= cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
12595     nsi->si_type	= si->si_type;
12596     nsi->si_prev	= si_dup(si->si_prev, param);
12597     nsi->si_next	= si_dup(si->si_next, param);
12598     nsi->si_markoff	= si->si_markoff;
12599 
12600     return nsi;
12601 }
12602 
12603 #define POPINT(ss,ix)	((ss)[--(ix)].any_i32)
12604 #define TOPINT(ss,ix)	((ss)[ix].any_i32)
12605 #define POPLONG(ss,ix)	((ss)[--(ix)].any_long)
12606 #define TOPLONG(ss,ix)	((ss)[ix].any_long)
12607 #define POPIV(ss,ix)	((ss)[--(ix)].any_iv)
12608 #define TOPIV(ss,ix)	((ss)[ix].any_iv)
12609 #define POPUV(ss,ix)	((ss)[--(ix)].any_uv)
12610 #define TOPUV(ss,ix)	((ss)[ix].any_uv)
12611 #define POPBOOL(ss,ix)	((ss)[--(ix)].any_bool)
12612 #define TOPBOOL(ss,ix)	((ss)[ix].any_bool)
12613 #define POPPTR(ss,ix)	((ss)[--(ix)].any_ptr)
12614 #define TOPPTR(ss,ix)	((ss)[ix].any_ptr)
12615 #define POPDPTR(ss,ix)	((ss)[--(ix)].any_dptr)
12616 #define TOPDPTR(ss,ix)	((ss)[ix].any_dptr)
12617 #define POPDXPTR(ss,ix)	((ss)[--(ix)].any_dxptr)
12618 #define TOPDXPTR(ss,ix)	((ss)[ix].any_dxptr)
12619 
12620 /* XXXXX todo */
12621 #define pv_dup_inc(p)	SAVEPV(p)
12622 #define pv_dup(p)	SAVEPV(p)
12623 #define svp_dup_inc(p,pp)	any_dup(p,pp)
12624 
12625 /* map any object to the new equivent - either something in the
12626  * ptr table, or something in the interpreter structure
12627  */
12628 
12629 void *
12630 Perl_any_dup(pTHX_ void *v, const PerlInterpreter *proto_perl)
12631 {
12632     void *ret;
12633 
12634     PERL_ARGS_ASSERT_ANY_DUP;
12635 
12636     if (!v)
12637 	return (void*)NULL;
12638 
12639     /* look for it in the table first */
12640     ret = ptr_table_fetch(PL_ptr_table, v);
12641     if (ret)
12642 	return ret;
12643 
12644     /* see if it is part of the interpreter structure */
12645     if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
12646 	ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
12647     else {
12648 	ret = v;
12649     }
12650 
12651     return ret;
12652 }
12653 
12654 /* duplicate the save stack */
12655 
12656 ANY *
12657 Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
12658 {
12659     dVAR;
12660     ANY * const ss	= proto_perl->Isavestack;
12661     const I32 max	= proto_perl->Isavestack_max;
12662     I32 ix		= proto_perl->Isavestack_ix;
12663     ANY *nss;
12664     const SV *sv;
12665     const GV *gv;
12666     const AV *av;
12667     const HV *hv;
12668     void* ptr;
12669     int intval;
12670     long longval;
12671     GP *gp;
12672     IV iv;
12673     I32 i;
12674     char *c = NULL;
12675     void (*dptr) (void*);
12676     void (*dxptr) (pTHX_ void*);
12677 
12678     PERL_ARGS_ASSERT_SS_DUP;
12679 
12680     Newxz(nss, max, ANY);
12681 
12682     while (ix > 0) {
12683 	const UV uv = POPUV(ss,ix);
12684 	const U8 type = (U8)uv & SAVE_MASK;
12685 
12686 	TOPUV(nss,ix) = uv;
12687 	switch (type) {
12688 	case SAVEt_CLEARSV:
12689 	case SAVEt_CLEARPADRANGE:
12690 	    break;
12691 	case SAVEt_HELEM:		/* hash element */
12692 	    sv = (const SV *)POPPTR(ss,ix);
12693 	    TOPPTR(nss,ix) = sv_dup_inc(sv, param);
12694 	    /* fall through */
12695 	case SAVEt_ITEM:			/* normal string */
12696         case SAVEt_GVSV:			/* scalar slot in GV */
12697         case SAVEt_SV:				/* scalar reference */
12698 	    sv = (const SV *)POPPTR(ss,ix);
12699 	    TOPPTR(nss,ix) = sv_dup_inc(sv, param);
12700 	    /* fall through */
12701 	case SAVEt_FREESV:
12702 	case SAVEt_MORTALIZESV:
12703 	    sv = (const SV *)POPPTR(ss,ix);
12704 	    TOPPTR(nss,ix) = sv_dup_inc(sv, param);
12705 	    break;
12706 	case SAVEt_SHARED_PVREF:		/* char* in shared space */
12707 	    c = (char*)POPPTR(ss,ix);
12708 	    TOPPTR(nss,ix) = savesharedpv(c);
12709 	    ptr = POPPTR(ss,ix);
12710 	    TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12711 	    break;
12712         case SAVEt_GENERIC_SVREF:		/* generic sv */
12713         case SAVEt_SVREF:			/* scalar reference */
12714 	    sv = (const SV *)POPPTR(ss,ix);
12715 	    TOPPTR(nss,ix) = sv_dup_inc(sv, param);
12716 	    ptr = POPPTR(ss,ix);
12717 	    TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
12718 	    break;
12719         case SAVEt_GVSLOT:		/* any slot in GV */
12720 	    sv = (const SV *)POPPTR(ss,ix);
12721 	    TOPPTR(nss,ix) = sv_dup_inc(sv, param);
12722 	    ptr = POPPTR(ss,ix);
12723 	    TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
12724 	    sv = (const SV *)POPPTR(ss,ix);
12725 	    TOPPTR(nss,ix) = sv_dup_inc(sv, param);
12726 	    break;
12727         case SAVEt_HV:				/* hash reference */
12728         case SAVEt_AV:				/* array reference */
12729 	    sv = (const SV *) POPPTR(ss,ix);
12730 	    TOPPTR(nss,ix) = sv_dup_inc(sv, param);
12731 	    /* fall through */
12732 	case SAVEt_COMPPAD:
12733 	case SAVEt_NSTAB:
12734 	    sv = (const SV *) POPPTR(ss,ix);
12735 	    TOPPTR(nss,ix) = sv_dup(sv, param);
12736 	    break;
12737 	case SAVEt_INT:				/* int reference */
12738 	    ptr = POPPTR(ss,ix);
12739 	    TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12740 	    intval = (int)POPINT(ss,ix);
12741 	    TOPINT(nss,ix) = intval;
12742 	    break;
12743 	case SAVEt_LONG:			/* long reference */
12744 	    ptr = POPPTR(ss,ix);
12745 	    TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12746 	    longval = (long)POPLONG(ss,ix);
12747 	    TOPLONG(nss,ix) = longval;
12748 	    break;
12749 	case SAVEt_I32:				/* I32 reference */
12750 	    ptr = POPPTR(ss,ix);
12751 	    TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12752 	    i = POPINT(ss,ix);
12753 	    TOPINT(nss,ix) = i;
12754 	    break;
12755 	case SAVEt_IV:				/* IV reference */
12756 	    ptr = POPPTR(ss,ix);
12757 	    TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12758 	    iv = POPIV(ss,ix);
12759 	    TOPIV(nss,ix) = iv;
12760 	    break;
12761 	case SAVEt_HPTR:			/* HV* reference */
12762 	case SAVEt_APTR:			/* AV* reference */
12763 	case SAVEt_SPTR:			/* SV* reference */
12764 	    ptr = POPPTR(ss,ix);
12765 	    TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12766 	    sv = (const SV *)POPPTR(ss,ix);
12767 	    TOPPTR(nss,ix) = sv_dup(sv, param);
12768 	    break;
12769 	case SAVEt_VPTR:			/* random* reference */
12770 	    ptr = POPPTR(ss,ix);
12771 	    TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12772 	    /* Fall through */
12773 	case SAVEt_INT_SMALL:
12774 	case SAVEt_I32_SMALL:
12775 	case SAVEt_I16:				/* I16 reference */
12776 	case SAVEt_I8:				/* I8 reference */
12777 	case SAVEt_BOOL:
12778 	    ptr = POPPTR(ss,ix);
12779 	    TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12780 	    break;
12781 	case SAVEt_GENERIC_PVREF:		/* generic char* */
12782 	case SAVEt_PPTR:			/* char* reference */
12783 	    ptr = POPPTR(ss,ix);
12784 	    TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12785 	    c = (char*)POPPTR(ss,ix);
12786 	    TOPPTR(nss,ix) = pv_dup(c);
12787 	    break;
12788 	case SAVEt_GP:				/* scalar reference */
12789 	    gp = (GP*)POPPTR(ss,ix);
12790 	    TOPPTR(nss,ix) = gp = gp_dup(gp, param);
12791 	    (void)GpREFCNT_inc(gp);
12792 	    gv = (const GV *)POPPTR(ss,ix);
12793 	    TOPPTR(nss,ix) = gv_dup_inc(gv, param);
12794 	    break;
12795 	case SAVEt_FREEOP:
12796 	    ptr = POPPTR(ss,ix);
12797 	    if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
12798 		/* these are assumed to be refcounted properly */
12799 		OP *o;
12800 		switch (((OP*)ptr)->op_type) {
12801 		case OP_LEAVESUB:
12802 		case OP_LEAVESUBLV:
12803 		case OP_LEAVEEVAL:
12804 		case OP_LEAVE:
12805 		case OP_SCOPE:
12806 		case OP_LEAVEWRITE:
12807 		    TOPPTR(nss,ix) = ptr;
12808 		    o = (OP*)ptr;
12809 		    OP_REFCNT_LOCK;
12810 		    (void) OpREFCNT_inc(o);
12811 		    OP_REFCNT_UNLOCK;
12812 		    break;
12813 		default:
12814 		    TOPPTR(nss,ix) = NULL;
12815 		    break;
12816 		}
12817 	    }
12818 	    else
12819 		TOPPTR(nss,ix) = NULL;
12820 	    break;
12821 	case SAVEt_FREECOPHH:
12822 	    ptr = POPPTR(ss,ix);
12823 	    TOPPTR(nss,ix) = cophh_copy((COPHH *)ptr);
12824 	    break;
12825 	case SAVEt_DELETE:
12826 	    hv = (const HV *)POPPTR(ss,ix);
12827 	    TOPPTR(nss,ix) = hv_dup_inc(hv, param);
12828 	    i = POPINT(ss,ix);
12829 	    TOPINT(nss,ix) = i;
12830 	    /* Fall through */
12831 	case SAVEt_FREEPV:
12832 	    c = (char*)POPPTR(ss,ix);
12833 	    TOPPTR(nss,ix) = pv_dup_inc(c);
12834 	    break;
12835 	case SAVEt_STACK_POS:		/* Position on Perl stack */
12836 	    i = POPINT(ss,ix);
12837 	    TOPINT(nss,ix) = i;
12838 	    break;
12839 	case SAVEt_DESTRUCTOR:
12840 	    ptr = POPPTR(ss,ix);
12841 	    TOPPTR(nss,ix) = any_dup(ptr, proto_perl);	/* XXX quite arbitrary */
12842 	    dptr = POPDPTR(ss,ix);
12843 	    TOPDPTR(nss,ix) = DPTR2FPTR(void (*)(void*),
12844 					any_dup(FPTR2DPTR(void *, dptr),
12845 						proto_perl));
12846 	    break;
12847 	case SAVEt_DESTRUCTOR_X:
12848 	    ptr = POPPTR(ss,ix);
12849 	    TOPPTR(nss,ix) = any_dup(ptr, proto_perl);	/* XXX quite arbitrary */
12850 	    dxptr = POPDXPTR(ss,ix);
12851 	    TOPDXPTR(nss,ix) = DPTR2FPTR(void (*)(pTHX_ void*),
12852 					 any_dup(FPTR2DPTR(void *, dxptr),
12853 						 proto_perl));
12854 	    break;
12855 	case SAVEt_REGCONTEXT:
12856 	case SAVEt_ALLOC:
12857 	    ix -= uv >> SAVE_TIGHT_SHIFT;
12858 	    break;
12859 	case SAVEt_AELEM:		/* array element */
12860 	    sv = (const SV *)POPPTR(ss,ix);
12861 	    TOPPTR(nss,ix) = sv_dup_inc(sv, param);
12862 	    i = POPINT(ss,ix);
12863 	    TOPINT(nss,ix) = i;
12864 	    av = (const AV *)POPPTR(ss,ix);
12865 	    TOPPTR(nss,ix) = av_dup_inc(av, param);
12866 	    break;
12867 	case SAVEt_OP:
12868 	    ptr = POPPTR(ss,ix);
12869 	    TOPPTR(nss,ix) = ptr;
12870 	    break;
12871 	case SAVEt_HINTS:
12872 	    ptr = POPPTR(ss,ix);
12873 	    ptr = cophh_copy((COPHH*)ptr);
12874 	    TOPPTR(nss,ix) = ptr;
12875 	    i = POPINT(ss,ix);
12876 	    TOPINT(nss,ix) = i;
12877 	    if (i & HINT_LOCALIZE_HH) {
12878 		hv = (const HV *)POPPTR(ss,ix);
12879 		TOPPTR(nss,ix) = hv_dup_inc(hv, param);
12880 	    }
12881 	    break;
12882 	case SAVEt_PADSV_AND_MORTALIZE:
12883 	    longval = (long)POPLONG(ss,ix);
12884 	    TOPLONG(nss,ix) = longval;
12885 	    ptr = POPPTR(ss,ix);
12886 	    TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12887 	    sv = (const SV *)POPPTR(ss,ix);
12888 	    TOPPTR(nss,ix) = sv_dup_inc(sv, param);
12889 	    break;
12890 	case SAVEt_SET_SVFLAGS:
12891 	    i = POPINT(ss,ix);
12892 	    TOPINT(nss,ix) = i;
12893 	    i = POPINT(ss,ix);
12894 	    TOPINT(nss,ix) = i;
12895 	    sv = (const SV *)POPPTR(ss,ix);
12896 	    TOPPTR(nss,ix) = sv_dup(sv, param);
12897 	    break;
12898 	case SAVEt_RE_STATE:
12899 	    {
12900 		const struct re_save_state *const old_state
12901 		    = (struct re_save_state *)
12902 		    (ss + ix - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
12903 		struct re_save_state *const new_state
12904 		    = (struct re_save_state *)
12905 		    (nss + ix - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
12906 
12907 		Copy(old_state, new_state, 1, struct re_save_state);
12908 		ix -= SAVESTACK_ALLOC_FOR_RE_SAVE_STATE;
12909 
12910 		new_state->re_state_bostr
12911 		    = pv_dup(old_state->re_state_bostr);
12912 		new_state->re_state_regeol
12913 		    = pv_dup(old_state->re_state_regeol);
12914 #ifdef PERL_ANY_COW
12915 		new_state->re_state_nrs
12916 		    = sv_dup(old_state->re_state_nrs, param);
12917 #endif
12918 		new_state->re_state_reg_magic
12919 		    = (MAGIC*) any_dup(old_state->re_state_reg_magic,
12920 			       proto_perl);
12921 		new_state->re_state_reg_oldcurpm
12922 		    = (PMOP*) any_dup(old_state->re_state_reg_oldcurpm,
12923 			      proto_perl);
12924 		new_state->re_state_reg_curpm
12925 		    = (PMOP*)  any_dup(old_state->re_state_reg_curpm,
12926 			       proto_perl);
12927 		new_state->re_state_reg_oldsaved
12928 		    = pv_dup(old_state->re_state_reg_oldsaved);
12929 		new_state->re_state_reg_poscache
12930 		    = pv_dup(old_state->re_state_reg_poscache);
12931 		new_state->re_state_reg_starttry
12932 		    = pv_dup(old_state->re_state_reg_starttry);
12933 		break;
12934 	    }
12935 	case SAVEt_COMPILE_WARNINGS:
12936 	    ptr = POPPTR(ss,ix);
12937 	    TOPPTR(nss,ix) = DUP_WARNINGS((STRLEN*)ptr);
12938 	    break;
12939 	case SAVEt_PARSER:
12940 	    ptr = POPPTR(ss,ix);
12941 	    TOPPTR(nss,ix) = parser_dup((const yy_parser*)ptr, param);
12942 	    break;
12943 	default:
12944 	    Perl_croak(aTHX_
12945 		       "panic: ss_dup inconsistency (%"IVdf")", (IV) type);
12946 	}
12947     }
12948 
12949     return nss;
12950 }
12951 
12952 
12953 /* if sv is a stash, call $class->CLONE_SKIP(), and set the SVphv_CLONEABLE
12954  * flag to the result. This is done for each stash before cloning starts,
12955  * so we know which stashes want their objects cloned */
12956 
12957 static void
12958 do_mark_cloneable_stash(pTHX_ SV *const sv)
12959 {
12960     const HEK * const hvname = HvNAME_HEK((const HV *)sv);
12961     if (hvname) {
12962 	GV* const cloner = gv_fetchmethod_autoload(MUTABLE_HV(sv), "CLONE_SKIP", 0);
12963 	SvFLAGS(sv) |= SVphv_CLONEABLE; /* clone objects by default */
12964 	if (cloner && GvCV(cloner)) {
12965 	    dSP;
12966 	    UV status;
12967 
12968 	    ENTER;
12969 	    SAVETMPS;
12970 	    PUSHMARK(SP);
12971 	    mXPUSHs(newSVhek(hvname));
12972 	    PUTBACK;
12973 	    call_sv(MUTABLE_SV(GvCV(cloner)), G_SCALAR);
12974 	    SPAGAIN;
12975 	    status = POPu;
12976 	    PUTBACK;
12977 	    FREETMPS;
12978 	    LEAVE;
12979 	    if (status)
12980 		SvFLAGS(sv) &= ~SVphv_CLONEABLE;
12981 	}
12982     }
12983 }
12984 
12985 
12986 
12987 /*
12988 =for apidoc perl_clone
12989 
12990 Create and return a new interpreter by cloning the current one.
12991 
12992 perl_clone takes these flags as parameters:
12993 
12994 CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
12995 without it we only clone the data and zero the stacks,
12996 with it we copy the stacks and the new perl interpreter is
12997 ready to run at the exact same point as the previous one.
12998 The pseudo-fork code uses COPY_STACKS while the
12999 threads->create doesn't.
13000 
13001 CLONEf_KEEP_PTR_TABLE -
13002 perl_clone keeps a ptr_table with the pointer of the old
13003 variable as a key and the new variable as a value,
13004 this allows it to check if something has been cloned and not
13005 clone it again but rather just use the value and increase the
13006 refcount.  If KEEP_PTR_TABLE is not set then perl_clone will kill
13007 the ptr_table using the function
13008 C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
13009 reason to keep it around is if you want to dup some of your own
13010 variable who are outside the graph perl scans, example of this
13011 code is in threads.xs create.
13012 
13013 CLONEf_CLONE_HOST -
13014 This is a win32 thing, it is ignored on unix, it tells perls
13015 win32host code (which is c++) to clone itself, this is needed on
13016 win32 if you want to run two threads at the same time,
13017 if you just want to do some stuff in a separate perl interpreter
13018 and then throw it away and return to the original one,
13019 you don't need to do anything.
13020 
13021 =cut
13022 */
13023 
13024 /* XXX the above needs expanding by someone who actually understands it ! */
13025 EXTERN_C PerlInterpreter *
13026 perl_clone_host(PerlInterpreter* proto_perl, UV flags);
13027 
13028 PerlInterpreter *
13029 perl_clone(PerlInterpreter *proto_perl, UV flags)
13030 {
13031    dVAR;
13032 #ifdef PERL_IMPLICIT_SYS
13033 
13034     PERL_ARGS_ASSERT_PERL_CLONE;
13035 
13036    /* perlhost.h so we need to call into it
13037    to clone the host, CPerlHost should have a c interface, sky */
13038 
13039    if (flags & CLONEf_CLONE_HOST) {
13040        return perl_clone_host(proto_perl,flags);
13041    }
13042    return perl_clone_using(proto_perl, flags,
13043 			    proto_perl->IMem,
13044 			    proto_perl->IMemShared,
13045 			    proto_perl->IMemParse,
13046 			    proto_perl->IEnv,
13047 			    proto_perl->IStdIO,
13048 			    proto_perl->ILIO,
13049 			    proto_perl->IDir,
13050 			    proto_perl->ISock,
13051 			    proto_perl->IProc);
13052 }
13053 
13054 PerlInterpreter *
13055 perl_clone_using(PerlInterpreter *proto_perl, UV flags,
13056 		 struct IPerlMem* ipM, struct IPerlMem* ipMS,
13057 		 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
13058 		 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
13059 		 struct IPerlDir* ipD, struct IPerlSock* ipS,
13060 		 struct IPerlProc* ipP)
13061 {
13062     /* XXX many of the string copies here can be optimized if they're
13063      * constants; they need to be allocated as common memory and just
13064      * their pointers copied. */
13065 
13066     IV i;
13067     CLONE_PARAMS clone_params;
13068     CLONE_PARAMS* const param = &clone_params;
13069 
13070     PerlInterpreter * const my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
13071 
13072     PERL_ARGS_ASSERT_PERL_CLONE_USING;
13073 #else		/* !PERL_IMPLICIT_SYS */
13074     IV i;
13075     CLONE_PARAMS clone_params;
13076     CLONE_PARAMS* param = &clone_params;
13077     PerlInterpreter * const my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
13078 
13079     PERL_ARGS_ASSERT_PERL_CLONE;
13080 #endif		/* PERL_IMPLICIT_SYS */
13081 
13082     /* for each stash, determine whether its objects should be cloned */
13083     S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
13084     PERL_SET_THX(my_perl);
13085 
13086 #ifdef DEBUGGING
13087     PoisonNew(my_perl, 1, PerlInterpreter);
13088     PL_op = NULL;
13089     PL_curcop = NULL;
13090     PL_defstash = NULL; /* may be used by perl malloc() */
13091     PL_markstack = 0;
13092     PL_scopestack = 0;
13093     PL_scopestack_name = 0;
13094     PL_savestack = 0;
13095     PL_savestack_ix = 0;
13096     PL_savestack_max = -1;
13097     PL_sig_pending = 0;
13098     PL_parser = NULL;
13099     Zero(&PL_debug_pad, 1, struct perl_debug_pad);
13100 #  ifdef DEBUG_LEAKING_SCALARS
13101     PL_sv_serial = (((UV)my_perl >> 2) & 0xfff) * 1000000;
13102 #  endif
13103 #else	/* !DEBUGGING */
13104     Zero(my_perl, 1, PerlInterpreter);
13105 #endif	/* DEBUGGING */
13106 
13107 #ifdef PERL_IMPLICIT_SYS
13108     /* host pointers */
13109     PL_Mem		= ipM;
13110     PL_MemShared	= ipMS;
13111     PL_MemParse		= ipMP;
13112     PL_Env		= ipE;
13113     PL_StdIO		= ipStd;
13114     PL_LIO		= ipLIO;
13115     PL_Dir		= ipD;
13116     PL_Sock		= ipS;
13117     PL_Proc		= ipP;
13118 #endif		/* PERL_IMPLICIT_SYS */
13119 
13120 
13121     param->flags = flags;
13122     /* Nothing in the core code uses this, but we make it available to
13123        extensions (using mg_dup).  */
13124     param->proto_perl = proto_perl;
13125     /* Likely nothing will use this, but it is initialised to be consistent
13126        with Perl_clone_params_new().  */
13127     param->new_perl = my_perl;
13128     param->unreferenced = NULL;
13129 
13130 
13131     INIT_TRACK_MEMPOOL(my_perl->Imemory_debug_header, my_perl);
13132 
13133     PL_body_arenas = NULL;
13134     Zero(&PL_body_roots, 1, PL_body_roots);
13135 
13136     PL_sv_count		= 0;
13137     PL_sv_root		= NULL;
13138     PL_sv_arenaroot	= NULL;
13139 
13140     PL_debug		= proto_perl->Idebug;
13141 
13142     /* dbargs array probably holds garbage */
13143     PL_dbargs		= NULL;
13144 
13145     PL_compiling = proto_perl->Icompiling;
13146 
13147     /* pseudo environmental stuff */
13148     PL_origargc		= proto_perl->Iorigargc;
13149     PL_origargv		= proto_perl->Iorigargv;
13150 
13151 #if !NO_TAINT_SUPPORT
13152     /* Set tainting stuff before PerlIO_debug can possibly get called */
13153     PL_tainting		= proto_perl->Itainting;
13154     PL_taint_warn	= proto_perl->Itaint_warn;
13155 #else
13156     PL_tainting         = FALSE;
13157     PL_taint_warn	= FALSE;
13158 #endif
13159 
13160     PL_minus_c		= proto_perl->Iminus_c;
13161 
13162     PL_localpatches	= proto_perl->Ilocalpatches;
13163     PL_splitstr		= proto_perl->Isplitstr;
13164     PL_minus_n		= proto_perl->Iminus_n;
13165     PL_minus_p		= proto_perl->Iminus_p;
13166     PL_minus_l		= proto_perl->Iminus_l;
13167     PL_minus_a		= proto_perl->Iminus_a;
13168     PL_minus_E		= proto_perl->Iminus_E;
13169     PL_minus_F		= proto_perl->Iminus_F;
13170     PL_doswitches	= proto_perl->Idoswitches;
13171     PL_dowarn		= proto_perl->Idowarn;
13172 #ifdef PERL_SAWAMPERSAND
13173     PL_sawampersand	= proto_perl->Isawampersand;
13174 #endif
13175     PL_unsafe		= proto_perl->Iunsafe;
13176     PL_perldb		= proto_perl->Iperldb;
13177     PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
13178     PL_exit_flags       = proto_perl->Iexit_flags;
13179 
13180     /* XXX time(&PL_basetime) when asked for? */
13181     PL_basetime		= proto_perl->Ibasetime;
13182 
13183     PL_maxsysfd		= proto_perl->Imaxsysfd;
13184     PL_statusvalue	= proto_perl->Istatusvalue;
13185 #ifdef VMS
13186     PL_statusvalue_vms	= proto_perl->Istatusvalue_vms;
13187 #else
13188     PL_statusvalue_posix = proto_perl->Istatusvalue_posix;
13189 #endif
13190 
13191     /* RE engine related */
13192     Zero(&PL_reg_state, 1, struct re_save_state);
13193     PL_regmatch_slab	= NULL;
13194 
13195     PL_sub_generation	= proto_perl->Isub_generation;
13196 
13197     /* funky return mechanisms */
13198     PL_forkprocess	= proto_perl->Iforkprocess;
13199 
13200     /* internal state */
13201     PL_maxo		= proto_perl->Imaxo;
13202 
13203     PL_main_start	= proto_perl->Imain_start;
13204     PL_eval_root	= proto_perl->Ieval_root;
13205     PL_eval_start	= proto_perl->Ieval_start;
13206 
13207     PL_filemode		= proto_perl->Ifilemode;
13208     PL_lastfd		= proto_perl->Ilastfd;
13209     PL_oldname		= proto_perl->Ioldname;		/* XXX not quite right */
13210     PL_Argv		= NULL;
13211     PL_Cmd		= NULL;
13212     PL_gensym		= proto_perl->Igensym;
13213 
13214     PL_laststatval	= proto_perl->Ilaststatval;
13215     PL_laststype	= proto_perl->Ilaststype;
13216     PL_mess_sv		= NULL;
13217 
13218     PL_profiledata	= NULL;
13219 
13220     PL_generation	= proto_perl->Igeneration;
13221 
13222     PL_in_clean_objs	= proto_perl->Iin_clean_objs;
13223     PL_in_clean_all	= proto_perl->Iin_clean_all;
13224 
13225     PL_delaymagic_uid	= proto_perl->Idelaymagic_uid;
13226     PL_delaymagic_euid	= proto_perl->Idelaymagic_euid;
13227     PL_delaymagic_gid	= proto_perl->Idelaymagic_gid;
13228     PL_delaymagic_egid	= proto_perl->Idelaymagic_egid;
13229     PL_nomemok		= proto_perl->Inomemok;
13230     PL_an		= proto_perl->Ian;
13231     PL_evalseq		= proto_perl->Ievalseq;
13232     PL_origenviron	= proto_perl->Iorigenviron;	/* XXX not quite right */
13233     PL_origalen		= proto_perl->Iorigalen;
13234 
13235     PL_sighandlerp	= proto_perl->Isighandlerp;
13236 
13237     PL_runops		= proto_perl->Irunops;
13238 
13239     PL_subline		= proto_perl->Isubline;
13240 
13241 #ifdef FCRYPT
13242     PL_cryptseen	= proto_perl->Icryptseen;
13243 #endif
13244 
13245     PL_hints		= proto_perl->Ihints;
13246 
13247 #ifdef USE_LOCALE_COLLATE
13248     PL_collation_ix	= proto_perl->Icollation_ix;
13249     PL_collation_standard	= proto_perl->Icollation_standard;
13250     PL_collxfrm_base	= proto_perl->Icollxfrm_base;
13251     PL_collxfrm_mult	= proto_perl->Icollxfrm_mult;
13252 #endif /* USE_LOCALE_COLLATE */
13253 
13254 #ifdef USE_LOCALE_NUMERIC
13255     PL_numeric_standard	= proto_perl->Inumeric_standard;
13256     PL_numeric_local	= proto_perl->Inumeric_local;
13257 #endif /* !USE_LOCALE_NUMERIC */
13258 
13259     /* Did the locale setup indicate UTF-8? */
13260     PL_utf8locale	= proto_perl->Iutf8locale;
13261     /* Unicode features (see perlrun/-C) */
13262     PL_unicode		= proto_perl->Iunicode;
13263 
13264     /* Pre-5.8 signals control */
13265     PL_signals		= proto_perl->Isignals;
13266 
13267     /* times() ticks per second */
13268     PL_clocktick	= proto_perl->Iclocktick;
13269 
13270     /* Recursion stopper for PerlIO_find_layer */
13271     PL_in_load_module	= proto_perl->Iin_load_module;
13272 
13273     /* sort() routine */
13274     PL_sort_RealCmp	= proto_perl->Isort_RealCmp;
13275 
13276     /* Not really needed/useful since the reenrant_retint is "volatile",
13277      * but do it for consistency's sake. */
13278     PL_reentrant_retint	= proto_perl->Ireentrant_retint;
13279 
13280     /* Hooks to shared SVs and locks. */
13281     PL_sharehook	= proto_perl->Isharehook;
13282     PL_lockhook		= proto_perl->Ilockhook;
13283     PL_unlockhook	= proto_perl->Iunlockhook;
13284     PL_threadhook	= proto_perl->Ithreadhook;
13285     PL_destroyhook	= proto_perl->Idestroyhook;
13286     PL_signalhook	= proto_perl->Isignalhook;
13287 
13288     PL_globhook		= proto_perl->Iglobhook;
13289 
13290     /* swatch cache */
13291     PL_last_swash_hv	= NULL;	/* reinits on demand */
13292     PL_last_swash_klen	= 0;
13293     PL_last_swash_key[0]= '\0';
13294     PL_last_swash_tmps	= (U8*)NULL;
13295     PL_last_swash_slen	= 0;
13296 
13297     PL_srand_called	= proto_perl->Isrand_called;
13298 
13299     if (flags & CLONEf_COPY_STACKS) {
13300 	/* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
13301 	PL_tmps_ix		= proto_perl->Itmps_ix;
13302 	PL_tmps_max		= proto_perl->Itmps_max;
13303 	PL_tmps_floor		= proto_perl->Itmps_floor;
13304 
13305 	/* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
13306 	 * NOTE: unlike the others! */
13307 	PL_scopestack_ix	= proto_perl->Iscopestack_ix;
13308 	PL_scopestack_max	= proto_perl->Iscopestack_max;
13309 
13310 	/* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
13311 	 * NOTE: unlike the others! */
13312 	PL_savestack_ix		= proto_perl->Isavestack_ix;
13313 	PL_savestack_max	= proto_perl->Isavestack_max;
13314     }
13315 
13316     PL_start_env	= proto_perl->Istart_env;	/* XXXXXX */
13317     PL_top_env		= &PL_start_env;
13318 
13319     PL_op		= proto_perl->Iop;
13320 
13321     PL_Sv		= NULL;
13322     PL_Xpv		= (XPV*)NULL;
13323     my_perl->Ina	= proto_perl->Ina;
13324 
13325     PL_statbuf		= proto_perl->Istatbuf;
13326     PL_statcache	= proto_perl->Istatcache;
13327 
13328 #ifdef HAS_TIMES
13329     PL_timesbuf		= proto_perl->Itimesbuf;
13330 #endif
13331 
13332 #if !NO_TAINT_SUPPORT
13333     PL_tainted		= proto_perl->Itainted;
13334 #else
13335     PL_tainted          = FALSE;
13336 #endif
13337     PL_curpm		= proto_perl->Icurpm;	/* XXX No PMOP ref count */
13338 
13339     PL_chopset		= proto_perl->Ichopset;	/* XXX never deallocated */
13340 
13341     PL_restartjmpenv	= proto_perl->Irestartjmpenv;
13342     PL_restartop	= proto_perl->Irestartop;
13343     PL_in_eval		= proto_perl->Iin_eval;
13344     PL_delaymagic	= proto_perl->Idelaymagic;
13345     PL_phase		= proto_perl->Iphase;
13346     PL_localizing	= proto_perl->Ilocalizing;
13347 
13348     PL_hv_fetch_ent_mh	= NULL;
13349     PL_modcount		= proto_perl->Imodcount;
13350     PL_lastgotoprobe	= NULL;
13351     PL_dumpindent	= proto_perl->Idumpindent;
13352 
13353     PL_efloatbuf	= NULL;		/* reinits on demand */
13354     PL_efloatsize	= 0;			/* reinits on demand */
13355 
13356     /* regex stuff */
13357 
13358     PL_regdummy		= proto_perl->Iregdummy;
13359     PL_colorset		= 0;		/* reinits PL_colors[] */
13360     /*PL_colors[6]	= {0,0,0,0,0,0};*/
13361 
13362     /* Pluggable optimizer */
13363     PL_peepp		= proto_perl->Ipeepp;
13364     PL_rpeepp		= proto_perl->Irpeepp;
13365     /* op_free() hook */
13366     PL_opfreehook	= proto_perl->Iopfreehook;
13367 
13368 #ifdef USE_REENTRANT_API
13369     /* XXX: things like -Dm will segfault here in perlio, but doing
13370      *  PERL_SET_CONTEXT(proto_perl);
13371      * breaks too many other things
13372      */
13373     Perl_reentrant_init(aTHX);
13374 #endif
13375 
13376     /* create SV map for pointer relocation */
13377     PL_ptr_table = ptr_table_new();
13378 
13379     /* initialize these special pointers as early as possible */
13380     init_constants();
13381     ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
13382     ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
13383     ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
13384 
13385     /* create (a non-shared!) shared string table */
13386     PL_strtab		= newHV();
13387     HvSHAREKEYS_off(PL_strtab);
13388     hv_ksplit(PL_strtab, HvTOTALKEYS(proto_perl->Istrtab));
13389     ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
13390 
13391     /* This PV will be free'd special way so must set it same way op.c does */
13392     PL_compiling.cop_file    = savesharedpv(PL_compiling.cop_file);
13393     ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
13394 
13395     ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
13396     PL_compiling.cop_warnings = DUP_WARNINGS(PL_compiling.cop_warnings);
13397     CopHINTHASH_set(&PL_compiling, cophh_copy(CopHINTHASH_get(&PL_compiling)));
13398     PL_curcop		= (COP*)any_dup(proto_perl->Icurcop, proto_perl);
13399 
13400     param->stashes      = newAV();  /* Setup array of objects to call clone on */
13401     /* This makes no difference to the implementation, as it always pushes
13402        and shifts pointers to other SVs without changing their reference
13403        count, with the array becoming empty before it is freed. However, it
13404        makes it conceptually clear what is going on, and will avoid some
13405        work inside av.c, filling slots between AvFILL() and AvMAX() with
13406        &PL_sv_undef, and SvREFCNT_dec()ing those.  */
13407     AvREAL_off(param->stashes);
13408 
13409     if (!(flags & CLONEf_COPY_STACKS)) {
13410 	param->unreferenced = newAV();
13411     }
13412 
13413 #ifdef PERLIO_LAYERS
13414     /* Clone PerlIO tables as soon as we can handle general xx_dup() */
13415     PerlIO_clone(aTHX_ proto_perl, param);
13416 #endif
13417 
13418     PL_envgv		= gv_dup(proto_perl->Ienvgv, param);
13419     PL_incgv		= gv_dup(proto_perl->Iincgv, param);
13420     PL_hintgv		= gv_dup(proto_perl->Ihintgv, param);
13421     PL_origfilename	= SAVEPV(proto_perl->Iorigfilename);
13422     PL_diehook		= sv_dup_inc(proto_perl->Idiehook, param);
13423     PL_warnhook		= sv_dup_inc(proto_perl->Iwarnhook, param);
13424 
13425     /* switches */
13426     PL_patchlevel	= sv_dup_inc(proto_perl->Ipatchlevel, param);
13427     PL_apiversion	= sv_dup_inc(proto_perl->Iapiversion, param);
13428     PL_inplace		= SAVEPV(proto_perl->Iinplace);
13429     PL_e_script		= sv_dup_inc(proto_perl->Ie_script, param);
13430 
13431     /* magical thingies */
13432 
13433     PL_encoding		= sv_dup(proto_perl->Iencoding, param);
13434 
13435     sv_setpvs(PERL_DEBUG_PAD(0), "");	/* For regex debugging. */
13436     sv_setpvs(PERL_DEBUG_PAD(1), "");	/* ext/re needs these */
13437     sv_setpvs(PERL_DEBUG_PAD(2), "");	/* even without DEBUGGING. */
13438 
13439 
13440     /* Clone the regex array */
13441     /* ORANGE FIXME for plugins, probably in the SV dup code.
13442        newSViv(PTR2IV(CALLREGDUPE(
13443        INT2PTR(REGEXP *, SvIVX(regex)), param))))
13444     */
13445     PL_regex_padav = av_dup_inc(proto_perl->Iregex_padav, param);
13446     PL_regex_pad = AvARRAY(PL_regex_padav);
13447 
13448     PL_stashpadmax	= proto_perl->Istashpadmax;
13449     PL_stashpadix	= proto_perl->Istashpadix ;
13450     Newx(PL_stashpad, PL_stashpadmax, HV *);
13451     {
13452 	PADOFFSET o = 0;
13453 	for (; o < PL_stashpadmax; ++o)
13454 	    PL_stashpad[o] = hv_dup(proto_perl->Istashpad[o], param);
13455     }
13456 
13457     /* shortcuts to various I/O objects */
13458     PL_ofsgv            = gv_dup_inc(proto_perl->Iofsgv, param);
13459     PL_stdingv		= gv_dup(proto_perl->Istdingv, param);
13460     PL_stderrgv		= gv_dup(proto_perl->Istderrgv, param);
13461     PL_defgv		= gv_dup(proto_perl->Idefgv, param);
13462     PL_argvgv		= gv_dup(proto_perl->Iargvgv, param);
13463     PL_argvoutgv	= gv_dup(proto_perl->Iargvoutgv, param);
13464     PL_argvout_stack	= av_dup_inc(proto_perl->Iargvout_stack, param);
13465 
13466     /* shortcuts to regexp stuff */
13467     PL_replgv		= gv_dup(proto_perl->Ireplgv, param);
13468 
13469     /* shortcuts to misc objects */
13470     PL_errgv		= gv_dup(proto_perl->Ierrgv, param);
13471 
13472     /* shortcuts to debugging objects */
13473     PL_DBgv		= gv_dup(proto_perl->IDBgv, param);
13474     PL_DBline		= gv_dup(proto_perl->IDBline, param);
13475     PL_DBsub		= gv_dup(proto_perl->IDBsub, param);
13476     PL_DBsingle		= sv_dup(proto_perl->IDBsingle, param);
13477     PL_DBtrace		= sv_dup(proto_perl->IDBtrace, param);
13478     PL_DBsignal		= sv_dup(proto_perl->IDBsignal, param);
13479 
13480     /* symbol tables */
13481     PL_defstash		= hv_dup_inc(proto_perl->Idefstash, param);
13482     PL_curstash		= hv_dup_inc(proto_perl->Icurstash, param);
13483     PL_debstash		= hv_dup(proto_perl->Idebstash, param);
13484     PL_globalstash	= hv_dup(proto_perl->Iglobalstash, param);
13485     PL_curstname	= sv_dup_inc(proto_perl->Icurstname, param);
13486 
13487     PL_beginav		= av_dup_inc(proto_perl->Ibeginav, param);
13488     PL_beginav_save	= av_dup_inc(proto_perl->Ibeginav_save, param);
13489     PL_checkav_save	= av_dup_inc(proto_perl->Icheckav_save, param);
13490     PL_unitcheckav      = av_dup_inc(proto_perl->Iunitcheckav, param);
13491     PL_unitcheckav_save = av_dup_inc(proto_perl->Iunitcheckav_save, param);
13492     PL_endav		= av_dup_inc(proto_perl->Iendav, param);
13493     PL_checkav		= av_dup_inc(proto_perl->Icheckav, param);
13494     PL_initav		= av_dup_inc(proto_perl->Iinitav, param);
13495 
13496     PL_isarev		= hv_dup_inc(proto_perl->Iisarev, param);
13497 
13498     /* subprocess state */
13499     PL_fdpid		= av_dup_inc(proto_perl->Ifdpid, param);
13500 
13501     if (proto_perl->Iop_mask)
13502 	PL_op_mask	= SAVEPVN(proto_perl->Iop_mask, PL_maxo);
13503     else
13504 	PL_op_mask 	= NULL;
13505     /* PL_asserting        = proto_perl->Iasserting; */
13506 
13507     /* current interpreter roots */
13508     PL_main_cv		= cv_dup_inc(proto_perl->Imain_cv, param);
13509     OP_REFCNT_LOCK;
13510     PL_main_root	= OpREFCNT_inc(proto_perl->Imain_root);
13511     OP_REFCNT_UNLOCK;
13512 
13513     /* runtime control stuff */
13514     PL_curcopdb		= (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
13515 
13516     PL_preambleav	= av_dup_inc(proto_perl->Ipreambleav, param);
13517 
13518     PL_ors_sv		= sv_dup_inc(proto_perl->Iors_sv, param);
13519 
13520     /* interpreter atexit processing */
13521     PL_exitlistlen	= proto_perl->Iexitlistlen;
13522     if (PL_exitlistlen) {
13523 	Newx(PL_exitlist, PL_exitlistlen, PerlExitListEntry);
13524 	Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
13525     }
13526     else
13527 	PL_exitlist	= (PerlExitListEntry*)NULL;
13528 
13529     PL_my_cxt_size = proto_perl->Imy_cxt_size;
13530     if (PL_my_cxt_size) {
13531 	Newx(PL_my_cxt_list, PL_my_cxt_size, void *);
13532 	Copy(proto_perl->Imy_cxt_list, PL_my_cxt_list, PL_my_cxt_size, void *);
13533 #ifdef PERL_GLOBAL_STRUCT_PRIVATE
13534 	Newx(PL_my_cxt_keys, PL_my_cxt_size, const char *);
13535 	Copy(proto_perl->Imy_cxt_keys, PL_my_cxt_keys, PL_my_cxt_size, char *);
13536 #endif
13537     }
13538     else {
13539 	PL_my_cxt_list	= (void**)NULL;
13540 #ifdef PERL_GLOBAL_STRUCT_PRIVATE
13541 	PL_my_cxt_keys	= (const char**)NULL;
13542 #endif
13543     }
13544     PL_modglobal	= hv_dup_inc(proto_perl->Imodglobal, param);
13545     PL_custom_op_names  = hv_dup_inc(proto_perl->Icustom_op_names,param);
13546     PL_custom_op_descs  = hv_dup_inc(proto_perl->Icustom_op_descs,param);
13547     PL_custom_ops	= hv_dup_inc(proto_perl->Icustom_ops, param);
13548 
13549     PL_compcv			= cv_dup(proto_perl->Icompcv, param);
13550 
13551     PAD_CLONE_VARS(proto_perl, param);
13552 
13553 #ifdef HAVE_INTERP_INTERN
13554     sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
13555 #endif
13556 
13557     PL_DBcv		= cv_dup(proto_perl->IDBcv, param);
13558 
13559 #ifdef PERL_USES_PL_PIDSTATUS
13560     PL_pidstatus	= newHV();			/* XXX flag for cloning? */
13561 #endif
13562     PL_osname		= SAVEPV(proto_perl->Iosname);
13563     PL_parser		= parser_dup(proto_perl->Iparser, param);
13564 
13565     /* XXX this only works if the saved cop has already been cloned */
13566     if (proto_perl->Iparser) {
13567 	PL_parser->saved_curcop = (COP*)any_dup(
13568 				    proto_perl->Iparser->saved_curcop,
13569 				    proto_perl);
13570     }
13571 
13572     PL_subname		= sv_dup_inc(proto_perl->Isubname, param);
13573 
13574 #ifdef USE_LOCALE_COLLATE
13575     PL_collation_name	= SAVEPV(proto_perl->Icollation_name);
13576 #endif /* USE_LOCALE_COLLATE */
13577 
13578 #ifdef USE_LOCALE_NUMERIC
13579     PL_numeric_name	= SAVEPV(proto_perl->Inumeric_name);
13580     PL_numeric_radix_sv	= sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
13581 #endif /* !USE_LOCALE_NUMERIC */
13582 
13583     /* Unicode inversion lists */
13584     PL_ASCII		= sv_dup_inc(proto_perl->IASCII, param);
13585     PL_Latin1		= sv_dup_inc(proto_perl->ILatin1, param);
13586 
13587     PL_NonL1NonFinalFold = sv_dup_inc(proto_perl->INonL1NonFinalFold, param);
13588     PL_HasMultiCharFold= sv_dup_inc(proto_perl->IHasMultiCharFold, param);
13589 
13590     /* utf8 character class swashes */
13591     for (i = 0; i < POSIX_SWASH_COUNT; i++) {
13592         PL_utf8_swash_ptrs[i] = sv_dup_inc(proto_perl->Iutf8_swash_ptrs[i], param);
13593     }
13594     for (i = 0; i < POSIX_CC_COUNT; i++) {
13595         PL_Posix_ptrs[i] = sv_dup_inc(proto_perl->IPosix_ptrs[i], param);
13596         PL_L1Posix_ptrs[i] = sv_dup_inc(proto_perl->IL1Posix_ptrs[i], param);
13597         PL_XPosix_ptrs[i] = sv_dup_inc(proto_perl->IXPosix_ptrs[i], param);
13598     }
13599     PL_utf8_mark	= sv_dup_inc(proto_perl->Iutf8_mark, param);
13600     PL_utf8_X_regular_begin	= sv_dup_inc(proto_perl->Iutf8_X_regular_begin, param);
13601     PL_utf8_X_extend	= sv_dup_inc(proto_perl->Iutf8_X_extend, param);
13602     PL_utf8_toupper	= sv_dup_inc(proto_perl->Iutf8_toupper, param);
13603     PL_utf8_totitle	= sv_dup_inc(proto_perl->Iutf8_totitle, param);
13604     PL_utf8_tolower	= sv_dup_inc(proto_perl->Iutf8_tolower, param);
13605     PL_utf8_tofold	= sv_dup_inc(proto_perl->Iutf8_tofold, param);
13606     PL_utf8_idstart	= sv_dup_inc(proto_perl->Iutf8_idstart, param);
13607     PL_utf8_xidstart	= sv_dup_inc(proto_perl->Iutf8_xidstart, param);
13608     PL_utf8_perl_idstart = sv_dup_inc(proto_perl->Iutf8_perl_idstart, param);
13609     PL_utf8_perl_idcont = sv_dup_inc(proto_perl->Iutf8_perl_idcont, param);
13610     PL_utf8_idcont	= sv_dup_inc(proto_perl->Iutf8_idcont, param);
13611     PL_utf8_xidcont	= sv_dup_inc(proto_perl->Iutf8_xidcont, param);
13612     PL_utf8_foldable	= sv_dup_inc(proto_perl->Iutf8_foldable, param);
13613     PL_utf8_charname_begin = sv_dup_inc(proto_perl->Iutf8_charname_begin, param);
13614     PL_utf8_charname_continue = sv_dup_inc(proto_perl->Iutf8_charname_continue, param);
13615     PL_ASCII		= sv_dup_inc(proto_perl->IASCII, param);
13616     PL_AboveLatin1	= sv_dup_inc(proto_perl->IAboveLatin1, param);
13617     PL_Latin1		= sv_dup_inc(proto_perl->ILatin1, param);
13618 
13619     if (proto_perl->Ipsig_pend) {
13620 	Newxz(PL_psig_pend, SIG_SIZE, int);
13621     }
13622     else {
13623 	PL_psig_pend	= (int*)NULL;
13624     }
13625 
13626     if (proto_perl->Ipsig_name) {
13627 	Newx(PL_psig_name, 2 * SIG_SIZE, SV*);
13628 	sv_dup_inc_multiple(proto_perl->Ipsig_name, PL_psig_name, 2 * SIG_SIZE,
13629 			    param);
13630 	PL_psig_ptr = PL_psig_name + SIG_SIZE;
13631     }
13632     else {
13633 	PL_psig_ptr	= (SV**)NULL;
13634 	PL_psig_name	= (SV**)NULL;
13635     }
13636 
13637     if (flags & CLONEf_COPY_STACKS) {
13638 	Newx(PL_tmps_stack, PL_tmps_max, SV*);
13639 	sv_dup_inc_multiple(proto_perl->Itmps_stack, PL_tmps_stack,
13640 			    PL_tmps_ix+1, param);
13641 
13642 	/* next PUSHMARK() sets *(PL_markstack_ptr+1) */
13643 	i = proto_perl->Imarkstack_max - proto_perl->Imarkstack;
13644 	Newxz(PL_markstack, i, I32);
13645 	PL_markstack_max	= PL_markstack + (proto_perl->Imarkstack_max
13646 						  - proto_perl->Imarkstack);
13647 	PL_markstack_ptr	= PL_markstack + (proto_perl->Imarkstack_ptr
13648 						  - proto_perl->Imarkstack);
13649 	Copy(proto_perl->Imarkstack, PL_markstack,
13650 	     PL_markstack_ptr - PL_markstack + 1, I32);
13651 
13652 	/* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
13653 	 * NOTE: unlike the others! */
13654 	Newxz(PL_scopestack, PL_scopestack_max, I32);
13655 	Copy(proto_perl->Iscopestack, PL_scopestack, PL_scopestack_ix, I32);
13656 
13657 #ifdef DEBUGGING
13658 	Newxz(PL_scopestack_name, PL_scopestack_max, const char *);
13659 	Copy(proto_perl->Iscopestack_name, PL_scopestack_name, PL_scopestack_ix, const char *);
13660 #endif
13661         /* reset stack AV to correct length before its duped via
13662          * PL_curstackinfo */
13663         AvFILLp(proto_perl->Icurstack) =
13664                             proto_perl->Istack_sp - proto_perl->Istack_base;
13665 
13666 	/* NOTE: si_dup() looks at PL_markstack */
13667 	PL_curstackinfo		= si_dup(proto_perl->Icurstackinfo, param);
13668 
13669 	/* PL_curstack		= PL_curstackinfo->si_stack; */
13670 	PL_curstack		= av_dup(proto_perl->Icurstack, param);
13671 	PL_mainstack		= av_dup(proto_perl->Imainstack, param);
13672 
13673 	/* next PUSHs() etc. set *(PL_stack_sp+1) */
13674 	PL_stack_base		= AvARRAY(PL_curstack);
13675 	PL_stack_sp		= PL_stack_base + (proto_perl->Istack_sp
13676 						   - proto_perl->Istack_base);
13677 	PL_stack_max		= PL_stack_base + AvMAX(PL_curstack);
13678 
13679 	/*Newxz(PL_savestack, PL_savestack_max, ANY);*/
13680 	PL_savestack		= ss_dup(proto_perl, param);
13681     }
13682     else {
13683 	init_stacks();
13684 	ENTER;			/* perl_destruct() wants to LEAVE; */
13685     }
13686 
13687     PL_statgv		= gv_dup(proto_perl->Istatgv, param);
13688     PL_statname		= sv_dup_inc(proto_perl->Istatname, param);
13689 
13690     PL_rs		= sv_dup_inc(proto_perl->Irs, param);
13691     PL_last_in_gv	= gv_dup(proto_perl->Ilast_in_gv, param);
13692     PL_defoutgv		= gv_dup_inc(proto_perl->Idefoutgv, param);
13693     PL_toptarget	= sv_dup_inc(proto_perl->Itoptarget, param);
13694     PL_bodytarget	= sv_dup_inc(proto_perl->Ibodytarget, param);
13695     PL_formtarget	= sv_dup(proto_perl->Iformtarget, param);
13696 
13697     PL_errors		= sv_dup_inc(proto_perl->Ierrors, param);
13698 
13699     PL_sortcop		= (OP*)any_dup(proto_perl->Isortcop, proto_perl);
13700     PL_sortstash	= hv_dup(proto_perl->Isortstash, param);
13701     PL_firstgv		= gv_dup(proto_perl->Ifirstgv, param);
13702     PL_secondgv		= gv_dup(proto_perl->Isecondgv, param);
13703 
13704     PL_stashcache       = newHV();
13705 
13706     PL_watchaddr	= (char **) ptr_table_fetch(PL_ptr_table,
13707 					    proto_perl->Iwatchaddr);
13708     PL_watchok		= PL_watchaddr ? * PL_watchaddr : NULL;
13709     if (PL_debug && PL_watchaddr) {
13710 	PerlIO_printf(Perl_debug_log,
13711 	  "WATCHING: %"UVxf" cloned as %"UVxf" with value %"UVxf"\n",
13712 	  PTR2UV(proto_perl->Iwatchaddr), PTR2UV(PL_watchaddr),
13713 	  PTR2UV(PL_watchok));
13714     }
13715 
13716     PL_registered_mros  = hv_dup_inc(proto_perl->Iregistered_mros, param);
13717     PL_blockhooks	= av_dup_inc(proto_perl->Iblockhooks, param);
13718     PL_utf8_foldclosures = hv_dup_inc(proto_perl->Iutf8_foldclosures, param);
13719 
13720     /* Call the ->CLONE method, if it exists, for each of the stashes
13721        identified by sv_dup() above.
13722     */
13723     while(av_len(param->stashes) != -1) {
13724 	HV* const stash = MUTABLE_HV(av_shift(param->stashes));
13725 	GV* const cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
13726 	if (cloner && GvCV(cloner)) {
13727 	    dSP;
13728 	    ENTER;
13729 	    SAVETMPS;
13730 	    PUSHMARK(SP);
13731 	    mXPUSHs(newSVhek(HvNAME_HEK(stash)));
13732 	    PUTBACK;
13733 	    call_sv(MUTABLE_SV(GvCV(cloner)), G_DISCARD);
13734 	    FREETMPS;
13735 	    LEAVE;
13736 	}
13737     }
13738 
13739     if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
13740         ptr_table_free(PL_ptr_table);
13741         PL_ptr_table = NULL;
13742     }
13743 
13744     if (!(flags & CLONEf_COPY_STACKS)) {
13745 	unreferenced_to_tmp_stack(param->unreferenced);
13746     }
13747 
13748     SvREFCNT_dec(param->stashes);
13749 
13750     /* orphaned? eg threads->new inside BEGIN or use */
13751     if (PL_compcv && ! SvREFCNT(PL_compcv)) {
13752 	SvREFCNT_inc_simple_void(PL_compcv);
13753 	SAVEFREESV(PL_compcv);
13754     }
13755 
13756     return my_perl;
13757 }
13758 
13759 static void
13760 S_unreferenced_to_tmp_stack(pTHX_ AV *const unreferenced)
13761 {
13762     PERL_ARGS_ASSERT_UNREFERENCED_TO_TMP_STACK;
13763 
13764     if (AvFILLp(unreferenced) > -1) {
13765 	SV **svp = AvARRAY(unreferenced);
13766 	SV **const last = svp + AvFILLp(unreferenced);
13767 	SSize_t count = 0;
13768 
13769 	do {
13770 	    if (SvREFCNT(*svp) == 1)
13771 		++count;
13772 	} while (++svp <= last);
13773 
13774 	EXTEND_MORTAL(count);
13775 	svp = AvARRAY(unreferenced);
13776 
13777 	do {
13778 	    if (SvREFCNT(*svp) == 1) {
13779 		/* Our reference is the only one to this SV. This means that
13780 		   in this thread, the scalar effectively has a 0 reference.
13781 		   That doesn't work (cleanup never happens), so donate our
13782 		   reference to it onto the save stack. */
13783 		PL_tmps_stack[++PL_tmps_ix] = *svp;
13784 	    } else {
13785 		/* As an optimisation, because we are already walking the
13786 		   entire array, instead of above doing either
13787 		   SvREFCNT_inc(*svp) or *svp = &PL_sv_undef, we can instead
13788 		   release our reference to the scalar, so that at the end of
13789 		   the array owns zero references to the scalars it happens to
13790 		   point to. We are effectively converting the array from
13791 		   AvREAL() on to AvREAL() off. This saves the av_clear()
13792 		   (triggered by the SvREFCNT_dec(unreferenced) below) from
13793 		   walking the array a second time.  */
13794 		SvREFCNT_dec(*svp);
13795 	    }
13796 
13797 	} while (++svp <= last);
13798 	AvREAL_off(unreferenced);
13799     }
13800     SvREFCNT_dec_NN(unreferenced);
13801 }
13802 
13803 void
13804 Perl_clone_params_del(CLONE_PARAMS *param)
13805 {
13806     /* This seemingly funky ordering keeps the build with PERL_GLOBAL_STRUCT
13807        happy: */
13808     PerlInterpreter *const to = param->new_perl;
13809     dTHXa(to);
13810     PerlInterpreter *const was = PERL_GET_THX;
13811 
13812     PERL_ARGS_ASSERT_CLONE_PARAMS_DEL;
13813 
13814     if (was != to) {
13815 	PERL_SET_THX(to);
13816     }
13817 
13818     SvREFCNT_dec(param->stashes);
13819     if (param->unreferenced)
13820 	unreferenced_to_tmp_stack(param->unreferenced);
13821 
13822     Safefree(param);
13823 
13824     if (was != to) {
13825 	PERL_SET_THX(was);
13826     }
13827 }
13828 
13829 CLONE_PARAMS *
13830 Perl_clone_params_new(PerlInterpreter *const from, PerlInterpreter *const to)
13831 {
13832     dVAR;
13833     /* Need to play this game, as newAV() can call safesysmalloc(), and that
13834        does a dTHX; to get the context from thread local storage.
13835        FIXME - under PERL_CORE Newx(), Safefree() and friends should expand to
13836        a version that passes in my_perl.  */
13837     PerlInterpreter *const was = PERL_GET_THX;
13838     CLONE_PARAMS *param;
13839 
13840     PERL_ARGS_ASSERT_CLONE_PARAMS_NEW;
13841 
13842     if (was != to) {
13843 	PERL_SET_THX(to);
13844     }
13845 
13846     /* Given that we've set the context, we can do this unshared.  */
13847     Newx(param, 1, CLONE_PARAMS);
13848 
13849     param->flags = 0;
13850     param->proto_perl = from;
13851     param->new_perl = to;
13852     param->stashes = (AV *)Perl_newSV_type(to, SVt_PVAV);
13853     AvREAL_off(param->stashes);
13854     param->unreferenced = (AV *)Perl_newSV_type(to, SVt_PVAV);
13855 
13856     if (was != to) {
13857 	PERL_SET_THX(was);
13858     }
13859     return param;
13860 }
13861 
13862 #endif /* USE_ITHREADS */
13863 
13864 void
13865 Perl_init_constants(pTHX)
13866 {
13867     SvREFCNT(&PL_sv_undef)	= SvREFCNT_IMMORTAL;
13868     SvFLAGS(&PL_sv_undef)	= SVf_READONLY|SVt_NULL;
13869     SvANY(&PL_sv_undef)		= NULL;
13870 
13871     SvANY(&PL_sv_no)		= new_XPVNV();
13872     SvREFCNT(&PL_sv_no)		= SvREFCNT_IMMORTAL;
13873     SvFLAGS(&PL_sv_no)		= SVt_PVNV|SVf_READONLY
13874 				  |SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
13875 				  |SVp_POK|SVf_POK;
13876 
13877     SvANY(&PL_sv_yes)		= new_XPVNV();
13878     SvREFCNT(&PL_sv_yes)	= SvREFCNT_IMMORTAL;
13879     SvFLAGS(&PL_sv_yes)		= SVt_PVNV|SVf_READONLY
13880 				  |SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
13881 				  |SVp_POK|SVf_POK;
13882 
13883     SvPV_set(&PL_sv_no, (char*)PL_No);
13884     SvCUR_set(&PL_sv_no, 0);
13885     SvLEN_set(&PL_sv_no, 0);
13886     SvIV_set(&PL_sv_no, 0);
13887     SvNV_set(&PL_sv_no, 0);
13888 
13889     SvPV_set(&PL_sv_yes, (char*)PL_Yes);
13890     SvCUR_set(&PL_sv_yes, 1);
13891     SvLEN_set(&PL_sv_yes, 0);
13892     SvIV_set(&PL_sv_yes, 1);
13893     SvNV_set(&PL_sv_yes, 1);
13894 }
13895 
13896 /*
13897 =head1 Unicode Support
13898 
13899 =for apidoc sv_recode_to_utf8
13900 
13901 The encoding is assumed to be an Encode object, on entry the PV
13902 of the sv is assumed to be octets in that encoding, and the sv
13903 will be converted into Unicode (and UTF-8).
13904 
13905 If the sv already is UTF-8 (or if it is not POK), or if the encoding
13906 is not a reference, nothing is done to the sv.  If the encoding is not
13907 an C<Encode::XS> Encoding object, bad things will happen.
13908 (See F<lib/encoding.pm> and L<Encode>.)
13909 
13910 The PV of the sv is returned.
13911 
13912 =cut */
13913 
13914 char *
13915 Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
13916 {
13917     dVAR;
13918 
13919     PERL_ARGS_ASSERT_SV_RECODE_TO_UTF8;
13920 
13921     if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
13922 	SV *uni;
13923 	STRLEN len;
13924 	const char *s;
13925 	dSP;
13926 	ENTER;
13927 	SAVETMPS;
13928 	save_re_context();
13929 	PUSHMARK(sp);
13930 	EXTEND(SP, 3);
13931 	PUSHs(encoding);
13932 	PUSHs(sv);
13933 /*
13934   NI-S 2002/07/09
13935   Passing sv_yes is wrong - it needs to be or'ed set of constants
13936   for Encode::XS, while UTf-8 decode (currently) assumes a true value means
13937   remove converted chars from source.
13938 
13939   Both will default the value - let them.
13940 
13941 	XPUSHs(&PL_sv_yes);
13942 */
13943 	PUTBACK;
13944 	call_method("decode", G_SCALAR);
13945 	SPAGAIN;
13946 	uni = POPs;
13947 	PUTBACK;
13948 	s = SvPV_const(uni, len);
13949 	if (s != SvPVX_const(sv)) {
13950 	    SvGROW(sv, len + 1);
13951 	    Move(s, SvPVX(sv), len + 1, char);
13952 	    SvCUR_set(sv, len);
13953 	}
13954 	FREETMPS;
13955 	LEAVE;
13956 	if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
13957 	    /* clear pos and any utf8 cache */
13958 	    MAGIC * mg = mg_find(sv, PERL_MAGIC_regex_global);
13959 	    if (mg)
13960 		mg->mg_len = -1;
13961 	    if ((mg = mg_find(sv, PERL_MAGIC_utf8)))
13962 		magic_setutf8(sv,mg); /* clear UTF8 cache */
13963 	}
13964 	SvUTF8_on(sv);
13965 	return SvPVX(sv);
13966     }
13967     return SvPOKp(sv) ? SvPVX(sv) : NULL;
13968 }
13969 
13970 /*
13971 =for apidoc sv_cat_decode
13972 
13973 The encoding is assumed to be an Encode object, the PV of the ssv is
13974 assumed to be octets in that encoding and decoding the input starts
13975 from the position which (PV + *offset) pointed to.  The dsv will be
13976 concatenated the decoded UTF-8 string from ssv.  Decoding will terminate
13977 when the string tstr appears in decoding output or the input ends on
13978 the PV of the ssv.  The value which the offset points will be modified
13979 to the last input position on the ssv.
13980 
13981 Returns TRUE if the terminator was found, else returns FALSE.
13982 
13983 =cut */
13984 
13985 bool
13986 Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
13987 		   SV *ssv, int *offset, char *tstr, int tlen)
13988 {
13989     dVAR;
13990     bool ret = FALSE;
13991 
13992     PERL_ARGS_ASSERT_SV_CAT_DECODE;
13993 
13994     if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) {
13995 	SV *offsv;
13996 	dSP;
13997 	ENTER;
13998 	SAVETMPS;
13999 	save_re_context();
14000 	PUSHMARK(sp);
14001 	EXTEND(SP, 6);
14002 	PUSHs(encoding);
14003 	PUSHs(dsv);
14004 	PUSHs(ssv);
14005 	offsv = newSViv(*offset);
14006 	mPUSHs(offsv);
14007 	mPUSHp(tstr, tlen);
14008 	PUTBACK;
14009 	call_method("cat_decode", G_SCALAR);
14010 	SPAGAIN;
14011 	ret = SvTRUE(TOPs);
14012 	*offset = SvIV(offsv);
14013 	PUTBACK;
14014 	FREETMPS;
14015 	LEAVE;
14016     }
14017     else
14018         Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
14019     return ret;
14020 
14021 }
14022 
14023 /* ---------------------------------------------------------------------
14024  *
14025  * support functions for report_uninit()
14026  */
14027 
14028 /* the maxiumum size of array or hash where we will scan looking
14029  * for the undefined element that triggered the warning */
14030 
14031 #define FUV_MAX_SEARCH_SIZE 1000
14032 
14033 /* Look for an entry in the hash whose value has the same SV as val;
14034  * If so, return a mortal copy of the key. */
14035 
14036 STATIC SV*
14037 S_find_hash_subscript(pTHX_ const HV *const hv, const SV *const val)
14038 {
14039     dVAR;
14040     HE **array;
14041     I32 i;
14042 
14043     PERL_ARGS_ASSERT_FIND_HASH_SUBSCRIPT;
14044 
14045     if (!hv || SvMAGICAL(hv) || !HvARRAY(hv) ||
14046 			(HvTOTALKEYS(hv) > FUV_MAX_SEARCH_SIZE))
14047 	return NULL;
14048 
14049     array = HvARRAY(hv);
14050 
14051     for (i=HvMAX(hv); i>=0; i--) {
14052 	HE *entry;
14053 	for (entry = array[i]; entry; entry = HeNEXT(entry)) {
14054 	    if (HeVAL(entry) != val)
14055 		continue;
14056 	    if (    HeVAL(entry) == &PL_sv_undef ||
14057 		    HeVAL(entry) == &PL_sv_placeholder)
14058 		continue;
14059 	    if (!HeKEY(entry))
14060 		return NULL;
14061 	    if (HeKLEN(entry) == HEf_SVKEY)
14062 		return sv_mortalcopy(HeKEY_sv(entry));
14063 	    return sv_2mortal(newSVhek(HeKEY_hek(entry)));
14064 	}
14065     }
14066     return NULL;
14067 }
14068 
14069 /* Look for an entry in the array whose value has the same SV as val;
14070  * If so, return the index, otherwise return -1. */
14071 
14072 STATIC I32
14073 S_find_array_subscript(pTHX_ const AV *const av, const SV *const val)
14074 {
14075     dVAR;
14076 
14077     PERL_ARGS_ASSERT_FIND_ARRAY_SUBSCRIPT;
14078 
14079     if (!av || SvMAGICAL(av) || !AvARRAY(av) ||
14080 			(AvFILLp(av) > FUV_MAX_SEARCH_SIZE))
14081 	return -1;
14082 
14083     if (val != &PL_sv_undef) {
14084 	SV ** const svp = AvARRAY(av);
14085 	I32 i;
14086 
14087 	for (i=AvFILLp(av); i>=0; i--)
14088 	    if (svp[i] == val)
14089 		return i;
14090     }
14091     return -1;
14092 }
14093 
14094 /* varname(): return the name of a variable, optionally with a subscript.
14095  * If gv is non-zero, use the name of that global, along with gvtype (one
14096  * of "$", "@", "%"); otherwise use the name of the lexical at pad offset
14097  * targ.  Depending on the value of the subscript_type flag, return:
14098  */
14099 
14100 #define FUV_SUBSCRIPT_NONE	1	/* "@foo"          */
14101 #define FUV_SUBSCRIPT_ARRAY	2	/* "$foo[aindex]"  */
14102 #define FUV_SUBSCRIPT_HASH	3	/* "$foo{keyname}" */
14103 #define FUV_SUBSCRIPT_WITHIN	4	/* "within @foo"   */
14104 
14105 SV*
14106 Perl_varname(pTHX_ const GV *const gv, const char gvtype, PADOFFSET targ,
14107 	const SV *const keyname, I32 aindex, int subscript_type)
14108 {
14109 
14110     SV * const name = sv_newmortal();
14111     if (gv && isGV(gv)) {
14112 	char buffer[2];
14113 	buffer[0] = gvtype;
14114 	buffer[1] = 0;
14115 
14116 	/* as gv_fullname4(), but add literal '^' for $^FOO names  */
14117 
14118 	gv_fullname4(name, gv, buffer, 0);
14119 
14120 	if ((unsigned int)SvPVX(name)[1] <= 26) {
14121 	    buffer[0] = '^';
14122 	    buffer[1] = SvPVX(name)[1] + 'A' - 1;
14123 
14124 	    /* Swap the 1 unprintable control character for the 2 byte pretty
14125 	       version - ie substr($name, 1, 1) = $buffer; */
14126 	    sv_insert(name, 1, 1, buffer, 2);
14127 	}
14128     }
14129     else {
14130 	CV * const cv = gv ? ((CV *)gv) : find_runcv(NULL);
14131 	SV *sv;
14132 	AV *av;
14133 
14134 	assert(!cv || SvTYPE(cv) == SVt_PVCV || SvTYPE(cv) == SVt_PVFM);
14135 
14136 	if (!cv || !CvPADLIST(cv))
14137 	    return NULL;
14138 	av = *PadlistARRAY(CvPADLIST(cv));
14139 	sv = *av_fetch(av, targ, FALSE);
14140 	sv_setsv_flags(name, sv, 0);
14141     }
14142 
14143     if (subscript_type == FUV_SUBSCRIPT_HASH) {
14144 	SV * const sv = newSV(0);
14145 	*SvPVX(name) = '$';
14146 	Perl_sv_catpvf(aTHX_ name, "{%s}",
14147 	    pv_pretty(sv, SvPVX_const(keyname), SvCUR(keyname), 32, NULL, NULL,
14148 		    PERL_PV_PRETTY_DUMP | PERL_PV_ESCAPE_UNI_DETECT ));
14149 	SvREFCNT_dec_NN(sv);
14150     }
14151     else if (subscript_type == FUV_SUBSCRIPT_ARRAY) {
14152 	*SvPVX(name) = '$';
14153 	Perl_sv_catpvf(aTHX_ name, "[%"IVdf"]", (IV)aindex);
14154     }
14155     else if (subscript_type == FUV_SUBSCRIPT_WITHIN) {
14156 	/* We know that name has no magic, so can use 0 instead of SV_GMAGIC */
14157 	Perl_sv_insert_flags(aTHX_ name, 0, 0,  STR_WITH_LEN("within "), 0);
14158     }
14159 
14160     return name;
14161 }
14162 
14163 
14164 /*
14165 =for apidoc find_uninit_var
14166 
14167 Find the name of the undefined variable (if any) that caused the operator
14168 to issue a "Use of uninitialized value" warning.
14169 If match is true, only return a name if its value matches uninit_sv.
14170 So roughly speaking, if a unary operator (such as OP_COS) generates a
14171 warning, then following the direct child of the op may yield an
14172 OP_PADSV or OP_GV that gives the name of the undefined variable.  On the
14173 other hand, with OP_ADD there are two branches to follow, so we only print
14174 the variable name if we get an exact match.
14175 
14176 The name is returned as a mortal SV.
14177 
14178 Assumes that PL_op is the op that originally triggered the error, and that
14179 PL_comppad/PL_curpad points to the currently executing pad.
14180 
14181 =cut
14182 */
14183 
14184 STATIC SV *
14185 S_find_uninit_var(pTHX_ const OP *const obase, const SV *const uninit_sv,
14186 		  bool match)
14187 {
14188     dVAR;
14189     SV *sv;
14190     const GV *gv;
14191     const OP *o, *o2, *kid;
14192 
14193     if (!obase || (match && (!uninit_sv || uninit_sv == &PL_sv_undef ||
14194 			    uninit_sv == &PL_sv_placeholder)))
14195 	return NULL;
14196 
14197     switch (obase->op_type) {
14198 
14199     case OP_RV2AV:
14200     case OP_RV2HV:
14201     case OP_PADAV:
14202     case OP_PADHV:
14203       {
14204 	const bool pad  = (    obase->op_type == OP_PADAV
14205                             || obase->op_type == OP_PADHV
14206                             || obase->op_type == OP_PADRANGE
14207                           );
14208 
14209 	const bool hash = (    obase->op_type == OP_PADHV
14210                             || obase->op_type == OP_RV2HV
14211                             || (obase->op_type == OP_PADRANGE
14212                                 && SvTYPE(PAD_SVl(obase->op_targ)) == SVt_PVHV)
14213                           );
14214 	I32 index = 0;
14215 	SV *keysv = NULL;
14216 	int subscript_type = FUV_SUBSCRIPT_WITHIN;
14217 
14218 	if (pad) { /* @lex, %lex */
14219 	    sv = PAD_SVl(obase->op_targ);
14220 	    gv = NULL;
14221 	}
14222 	else {
14223 	    if (cUNOPx(obase)->op_first->op_type == OP_GV) {
14224 	    /* @global, %global */
14225 		gv = cGVOPx_gv(cUNOPx(obase)->op_first);
14226 		if (!gv)
14227 		    break;
14228 		sv = hash ? MUTABLE_SV(GvHV(gv)): MUTABLE_SV(GvAV(gv));
14229 	    }
14230 	    else if (obase == PL_op) /* @{expr}, %{expr} */
14231 		return find_uninit_var(cUNOPx(obase)->op_first,
14232 						    uninit_sv, match);
14233 	    else /* @{expr}, %{expr} as a sub-expression */
14234 		return NULL;
14235 	}
14236 
14237 	/* attempt to find a match within the aggregate */
14238 	if (hash) {
14239 	    keysv = find_hash_subscript((const HV*)sv, uninit_sv);
14240 	    if (keysv)
14241 		subscript_type = FUV_SUBSCRIPT_HASH;
14242 	}
14243 	else {
14244 	    index = find_array_subscript((const AV *)sv, uninit_sv);
14245 	    if (index >= 0)
14246 		subscript_type = FUV_SUBSCRIPT_ARRAY;
14247 	}
14248 
14249 	if (match && subscript_type == FUV_SUBSCRIPT_WITHIN)
14250 	    break;
14251 
14252 	return varname(gv, hash ? '%' : '@', obase->op_targ,
14253 				    keysv, index, subscript_type);
14254       }
14255 
14256     case OP_RV2SV:
14257 	if (cUNOPx(obase)->op_first->op_type == OP_GV) {
14258 	    /* $global */
14259 	    gv = cGVOPx_gv(cUNOPx(obase)->op_first);
14260 	    if (!gv || !GvSTASH(gv))
14261 		break;
14262 	    if (match && (GvSV(gv) != uninit_sv))
14263 		break;
14264 	    return varname(gv, '$', 0, NULL, 0, FUV_SUBSCRIPT_NONE);
14265 	}
14266 	/* ${expr} */
14267 	return find_uninit_var(cUNOPx(obase)->op_first, uninit_sv, 1);
14268 
14269     case OP_PADSV:
14270 	if (match && PAD_SVl(obase->op_targ) != uninit_sv)
14271 	    break;
14272 	return varname(NULL, '$', obase->op_targ,
14273 				    NULL, 0, FUV_SUBSCRIPT_NONE);
14274 
14275     case OP_GVSV:
14276 	gv = cGVOPx_gv(obase);
14277 	if (!gv || (match && GvSV(gv) != uninit_sv) || !GvSTASH(gv))
14278 	    break;
14279 	return varname(gv, '$', 0, NULL, 0, FUV_SUBSCRIPT_NONE);
14280 
14281     case OP_AELEMFAST_LEX:
14282 	if (match) {
14283 	    SV **svp;
14284 	    AV *av = MUTABLE_AV(PAD_SV(obase->op_targ));
14285 	    if (!av || SvRMAGICAL(av))
14286 		break;
14287 	    svp = av_fetch(av, (I32)obase->op_private, FALSE);
14288 	    if (!svp || *svp != uninit_sv)
14289 		break;
14290 	}
14291 	return varname(NULL, '$', obase->op_targ,
14292 		       NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
14293     case OP_AELEMFAST:
14294 	{
14295 	    gv = cGVOPx_gv(obase);
14296 	    if (!gv)
14297 		break;
14298 	    if (match) {
14299 		SV **svp;
14300 		AV *const av = GvAV(gv);
14301 		if (!av || SvRMAGICAL(av))
14302 		    break;
14303 		svp = av_fetch(av, (I32)obase->op_private, FALSE);
14304 		if (!svp || *svp != uninit_sv)
14305 		    break;
14306 	    }
14307 	    return varname(gv, '$', 0,
14308 		    NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
14309 	}
14310 	break;
14311 
14312     case OP_EXISTS:
14313 	o = cUNOPx(obase)->op_first;
14314 	if (!o || o->op_type != OP_NULL ||
14315 		! (o->op_targ == OP_AELEM || o->op_targ == OP_HELEM))
14316 	    break;
14317 	return find_uninit_var(cBINOPo->op_last, uninit_sv, match);
14318 
14319     case OP_AELEM:
14320     case OP_HELEM:
14321     {
14322 	bool negate = FALSE;
14323 
14324 	if (PL_op == obase)
14325 	    /* $a[uninit_expr] or $h{uninit_expr} */
14326 	    return find_uninit_var(cBINOPx(obase)->op_last, uninit_sv, match);
14327 
14328 	gv = NULL;
14329 	o = cBINOPx(obase)->op_first;
14330 	kid = cBINOPx(obase)->op_last;
14331 
14332 	/* get the av or hv, and optionally the gv */
14333 	sv = NULL;
14334 	if  (o->op_type == OP_PADAV || o->op_type == OP_PADHV) {
14335 	    sv = PAD_SV(o->op_targ);
14336 	}
14337 	else if ((o->op_type == OP_RV2AV || o->op_type == OP_RV2HV)
14338 		&& cUNOPo->op_first->op_type == OP_GV)
14339 	{
14340 	    gv = cGVOPx_gv(cUNOPo->op_first);
14341 	    if (!gv)
14342 		break;
14343 	    sv = o->op_type
14344 		== OP_RV2HV ? MUTABLE_SV(GvHV(gv)) : MUTABLE_SV(GvAV(gv));
14345 	}
14346 	if (!sv)
14347 	    break;
14348 
14349 	if (kid && kid->op_type == OP_NEGATE) {
14350 	    negate = TRUE;
14351 	    kid = cUNOPx(kid)->op_first;
14352 	}
14353 
14354 	if (kid && kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid))) {
14355 	    /* index is constant */
14356 	    SV* kidsv;
14357 	    if (negate) {
14358 		kidsv = sv_2mortal(newSVpvs("-"));
14359 		sv_catsv(kidsv, cSVOPx_sv(kid));
14360 	    }
14361 	    else
14362 		kidsv = cSVOPx_sv(kid);
14363 	    if (match) {
14364 		if (SvMAGICAL(sv))
14365 		    break;
14366 		if (obase->op_type == OP_HELEM) {
14367 		    HE* he = hv_fetch_ent(MUTABLE_HV(sv), kidsv, 0, 0);
14368 		    if (!he || HeVAL(he) != uninit_sv)
14369 			break;
14370 		}
14371 		else {
14372 		    SV * const * const svp = av_fetch(MUTABLE_AV(sv),
14373 			negate ? - SvIV(cSVOPx_sv(kid)) : SvIV(cSVOPx_sv(kid)),
14374 			FALSE);
14375 		    if (!svp || *svp != uninit_sv)
14376 			break;
14377 		}
14378 	    }
14379 	    if (obase->op_type == OP_HELEM)
14380 		return varname(gv, '%', o->op_targ,
14381 			    kidsv, 0, FUV_SUBSCRIPT_HASH);
14382 	    else
14383 		return varname(gv, '@', o->op_targ, NULL,
14384 		    negate ? - SvIV(cSVOPx_sv(kid)) : SvIV(cSVOPx_sv(kid)),
14385 		    FUV_SUBSCRIPT_ARRAY);
14386 	}
14387 	else  {
14388 	    /* index is an expression;
14389 	     * attempt to find a match within the aggregate */
14390 	    if (obase->op_type == OP_HELEM) {
14391 		SV * const keysv = find_hash_subscript((const HV*)sv, uninit_sv);
14392 		if (keysv)
14393 		    return varname(gv, '%', o->op_targ,
14394 						keysv, 0, FUV_SUBSCRIPT_HASH);
14395 	    }
14396 	    else {
14397 		const I32 index
14398 		    = find_array_subscript((const AV *)sv, uninit_sv);
14399 		if (index >= 0)
14400 		    return varname(gv, '@', o->op_targ,
14401 					NULL, index, FUV_SUBSCRIPT_ARRAY);
14402 	    }
14403 	    if (match)
14404 		break;
14405 	    return varname(gv,
14406 		(o->op_type == OP_PADAV || o->op_type == OP_RV2AV)
14407 		? '@' : '%',
14408 		o->op_targ, NULL, 0, FUV_SUBSCRIPT_WITHIN);
14409 	}
14410 	break;
14411     }
14412 
14413     case OP_AASSIGN:
14414 	/* only examine RHS */
14415 	return find_uninit_var(cBINOPx(obase)->op_first, uninit_sv, match);
14416 
14417     case OP_OPEN:
14418 	o = cUNOPx(obase)->op_first;
14419 	if (   o->op_type == OP_PUSHMARK
14420 	   || (o->op_type == OP_NULL && o->op_targ == OP_PUSHMARK)
14421         )
14422 	    o = o->op_sibling;
14423 
14424 	if (!o->op_sibling) {
14425 	    /* one-arg version of open is highly magical */
14426 
14427 	    if (o->op_type == OP_GV) { /* open FOO; */
14428 		gv = cGVOPx_gv(o);
14429 		if (match && GvSV(gv) != uninit_sv)
14430 		    break;
14431 		return varname(gv, '$', 0,
14432 			    NULL, 0, FUV_SUBSCRIPT_NONE);
14433 	    }
14434 	    /* other possibilities not handled are:
14435 	     * open $x; or open my $x;	should return '${*$x}'
14436 	     * open expr;		should return '$'.expr ideally
14437 	     */
14438 	     break;
14439 	}
14440 	goto do_op;
14441 
14442     /* ops where $_ may be an implicit arg */
14443     case OP_TRANS:
14444     case OP_TRANSR:
14445     case OP_SUBST:
14446     case OP_MATCH:
14447 	if ( !(obase->op_flags & OPf_STACKED)) {
14448 	    if (uninit_sv == ((obase->op_private & OPpTARGET_MY)
14449 				 ? PAD_SVl(obase->op_targ)
14450 				 : DEFSV))
14451 	    {
14452 		sv = sv_newmortal();
14453 		sv_setpvs(sv, "$_");
14454 		return sv;
14455 	    }
14456 	}
14457 	goto do_op;
14458 
14459     case OP_PRTF:
14460     case OP_PRINT:
14461     case OP_SAY:
14462 	match = 1; /* print etc can return undef on defined args */
14463 	/* skip filehandle as it can't produce 'undef' warning  */
14464 	o = cUNOPx(obase)->op_first;
14465 	if ((obase->op_flags & OPf_STACKED)
14466             &&
14467                (   o->op_type == OP_PUSHMARK
14468                || (o->op_type == OP_NULL && o->op_targ == OP_PUSHMARK)))
14469 	    o = o->op_sibling->op_sibling;
14470 	goto do_op2;
14471 
14472 
14473     case OP_ENTEREVAL: /* could be eval $undef or $x='$undef'; eval $x */
14474     case OP_CUSTOM: /* XS or custom code could trigger random warnings */
14475 
14476 	/* the following ops are capable of returning PL_sv_undef even for
14477 	 * defined arg(s) */
14478 
14479     case OP_BACKTICK:
14480     case OP_PIPE_OP:
14481     case OP_FILENO:
14482     case OP_BINMODE:
14483     case OP_TIED:
14484     case OP_GETC:
14485     case OP_SYSREAD:
14486     case OP_SEND:
14487     case OP_IOCTL:
14488     case OP_SOCKET:
14489     case OP_SOCKPAIR:
14490     case OP_BIND:
14491     case OP_CONNECT:
14492     case OP_LISTEN:
14493     case OP_ACCEPT:
14494     case OP_SHUTDOWN:
14495     case OP_SSOCKOPT:
14496     case OP_GETPEERNAME:
14497     case OP_FTRREAD:
14498     case OP_FTRWRITE:
14499     case OP_FTREXEC:
14500     case OP_FTROWNED:
14501     case OP_FTEREAD:
14502     case OP_FTEWRITE:
14503     case OP_FTEEXEC:
14504     case OP_FTEOWNED:
14505     case OP_FTIS:
14506     case OP_FTZERO:
14507     case OP_FTSIZE:
14508     case OP_FTFILE:
14509     case OP_FTDIR:
14510     case OP_FTLINK:
14511     case OP_FTPIPE:
14512     case OP_FTSOCK:
14513     case OP_FTBLK:
14514     case OP_FTCHR:
14515     case OP_FTTTY:
14516     case OP_FTSUID:
14517     case OP_FTSGID:
14518     case OP_FTSVTX:
14519     case OP_FTTEXT:
14520     case OP_FTBINARY:
14521     case OP_FTMTIME:
14522     case OP_FTATIME:
14523     case OP_FTCTIME:
14524     case OP_READLINK:
14525     case OP_OPEN_DIR:
14526     case OP_READDIR:
14527     case OP_TELLDIR:
14528     case OP_SEEKDIR:
14529     case OP_REWINDDIR:
14530     case OP_CLOSEDIR:
14531     case OP_GMTIME:
14532     case OP_ALARM:
14533     case OP_SEMGET:
14534     case OP_GETLOGIN:
14535     case OP_UNDEF:
14536     case OP_SUBSTR:
14537     case OP_AEACH:
14538     case OP_EACH:
14539     case OP_SORT:
14540     case OP_CALLER:
14541     case OP_DOFILE:
14542     case OP_PROTOTYPE:
14543     case OP_NCMP:
14544     case OP_SMARTMATCH:
14545     case OP_UNPACK:
14546     case OP_SYSOPEN:
14547     case OP_SYSSEEK:
14548 	match = 1;
14549 	goto do_op;
14550 
14551     case OP_ENTERSUB:
14552     case OP_GOTO:
14553 	/* XXX tmp hack: these two may call an XS sub, and currently
14554 	  XS subs don't have a SUB entry on the context stack, so CV and
14555 	  pad determination goes wrong, and BAD things happen. So, just
14556 	  don't try to determine the value under those circumstances.
14557 	  Need a better fix at dome point. DAPM 11/2007 */
14558 	break;
14559 
14560     case OP_FLIP:
14561     case OP_FLOP:
14562     {
14563 	GV * const gv = gv_fetchpvs(".", GV_NOTQUAL, SVt_PV);
14564 	if (gv && GvSV(gv) == uninit_sv)
14565 	    return newSVpvs_flags("$.", SVs_TEMP);
14566 	goto do_op;
14567     }
14568 
14569     case OP_POS:
14570 	/* def-ness of rval pos() is independent of the def-ness of its arg */
14571 	if ( !(obase->op_flags & OPf_MOD))
14572 	    break;
14573 
14574     case OP_SCHOMP:
14575     case OP_CHOMP:
14576 	if (SvROK(PL_rs) && uninit_sv == SvRV(PL_rs))
14577 	    return newSVpvs_flags("${$/}", SVs_TEMP);
14578 	/*FALLTHROUGH*/
14579 
14580     default:
14581     do_op:
14582 	if (!(obase->op_flags & OPf_KIDS))
14583 	    break;
14584 	o = cUNOPx(obase)->op_first;
14585 
14586     do_op2:
14587 	if (!o)
14588 	    break;
14589 
14590 	/* This loop checks all the kid ops, skipping any that cannot pos-
14591 	 * sibly be responsible for the uninitialized value; i.e., defined
14592 	 * constants and ops that return nothing.  If there is only one op
14593 	 * left that is not skipped, then we *know* it is responsible for
14594 	 * the uninitialized value.  If there is more than one op left, we
14595 	 * have to look for an exact match in the while() loop below.
14596          * Note that we skip padrange, because the individual pad ops that
14597          * it replaced are still in the tree, so we work on them instead.
14598 	 */
14599 	o2 = NULL;
14600 	for (kid=o; kid; kid = kid->op_sibling) {
14601 	    if (kid) {
14602 		const OPCODE type = kid->op_type;
14603 		if ( (type == OP_CONST && SvOK(cSVOPx_sv(kid)))
14604 		  || (type == OP_NULL  && ! (kid->op_flags & OPf_KIDS))
14605 		  || (type == OP_PUSHMARK)
14606 		  || (type == OP_PADRANGE)
14607 		)
14608 		continue;
14609 	    }
14610 	    if (o2) { /* more than one found */
14611 		o2 = NULL;
14612 		break;
14613 	    }
14614 	    o2 = kid;
14615 	}
14616 	if (o2)
14617 	    return find_uninit_var(o2, uninit_sv, match);
14618 
14619 	/* scan all args */
14620 	while (o) {
14621 	    sv = find_uninit_var(o, uninit_sv, 1);
14622 	    if (sv)
14623 		return sv;
14624 	    o = o->op_sibling;
14625 	}
14626 	break;
14627     }
14628     return NULL;
14629 }
14630 
14631 
14632 /*
14633 =for apidoc report_uninit
14634 
14635 Print appropriate "Use of uninitialized variable" warning.
14636 
14637 =cut
14638 */
14639 
14640 void
14641 Perl_report_uninit(pTHX_ const SV *uninit_sv)
14642 {
14643     dVAR;
14644     if (PL_op) {
14645 	SV* varname = NULL;
14646 	if (uninit_sv && PL_curpad) {
14647 	    varname = find_uninit_var(PL_op, uninit_sv,0);
14648 	    if (varname)
14649 		sv_insert(varname, 0, 0, " ", 1);
14650 	}
14651 	/* diag_listed_as: Use of uninitialized value%s */
14652 	Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit_sv,
14653 		SVfARG(varname ? varname : &PL_sv_no),
14654 		" in ", OP_DESC(PL_op));
14655     }
14656     else
14657 	Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
14658 		    "", "", "");
14659 }
14660 
14661 /*
14662  * Local variables:
14663  * c-indentation-style: bsd
14664  * c-basic-offset: 4
14665  * indent-tabs-mode: nil
14666  * End:
14667  *
14668  * ex: set ts=8 sts=4 sw=4 et:
14669  */
14670