This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Merge branch 'blead' of ssh://perl5.git.perl.org/gitroot/perl into blead
[perl5.git] / sv.c
CommitLineData
a0d0e21e 1/* sv.c
79072805 2 *
1129b882 3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
83706693
RGS
4 * 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by Larry Wall
5 * and others
79072805
LW
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 *
4ac71550
TC
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/*
645c22ef
DM
20 *
21 *
5e045b90
AMS
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.
79072805
LW
28 */
29
30#include "EXTERN.h"
864dbfa3 31#define PERL_IN_SV_C
79072805 32#include "perl.h"
d2f185dc 33#include "regcomp.h"
79072805 34
07208e09 35#ifndef HAS_C99
4b2d6671 36# if __STDC_VERSION__ >= 199901L && !defined(VMS)
07208e09
CS
37# define HAS_C99 1
38# endif
39#endif
40#if HAS_C99
41# include <stdint.h>
42#endif
43
51371543 44#define FCALL *f
2c5424a7 45
2f8ed50e
OS
46#ifdef __Lynx__
47/* Missing proto on LynxOS */
48 char *gconvert(double, int, int, char *);
49#endif
50
e23c8137 51#ifdef PERL_UTF8_CACHE_ASSERT
ab455f60 52/* if adding more checks watch out for the following tests:
e23c8137
JH
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 */
6f207bd3 57# define ASSERT_UTF8_CACHE(cache) \
ab455f60
NC
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
e23c8137 62#else
6f207bd3 63# define ASSERT_UTF8_CACHE(cache) NOOP
e23c8137
JH
64#endif
65
f8c7b90f 66#ifdef PERL_OLD_COPY_ON_WRITE
765f542d 67#define SV_COW_NEXT_SV(sv) INT2PTR(SV *,SvUVX(sv))
607fa7f2 68#define SV_COW_NEXT_SV_SET(current,next) SvUV_set(current, PTR2UV(next))
b5ccf5f2 69/* This is a pessimistic view. Scalar must be purely a read-write PV to copy-
765f542d 70 on-write. */
765f542d 71#endif
645c22ef
DM
72
73/* ============================================================================
74
75=head1 Allocation and deallocation of SVs.
76
d2a0f284
JC
77An SV (or AV, HV, etc.) is allocated in two parts: the head (struct
78sv, av, hv...) contains type and reference count information, and for
79many types, a pointer to the body (struct xrv, xpv, xpviv...), which
80contains fields specific to each type. Some types store all they need
81in the head, so don't have a body.
82
486ec47a 83In all but the most memory-paranoid configurations (ex: PURIFY), heads
d2a0f284
JC
84and bodies are allocated out of arenas, which by default are
85approximately 4K chunks of memory parcelled up into N heads or bodies.
93e68bfb
JC
86Sv-bodies are allocated by their sv-type, guaranteeing size
87consistency needed to allocate safely from arrays.
88
d2a0f284
JC
89For SV-heads, the first slot in each arena is reserved, and holds a
90link to the next arena, some flags, and a note of the number of slots.
91Snaked through each arena chain is a linked list of free items; when
92this becomes empty, an extra arena is allocated and divided up into N
93items which are threaded into the free list.
94
95SV-bodies are similar, but they use arena-sets by default, which
96separate the link and info from the arena itself, and reclaim the 1st
97slot in the arena. SV-bodies are further described later.
645c22ef
DM
98
99The following global variables are associated with arenas:
100
101 PL_sv_arenaroot pointer to list of SV arenas
102 PL_sv_root pointer to list of free SV structures
103
d2a0f284
JC
104 PL_body_arenas head of linked-list of body arenas
105 PL_body_roots[] array of pointers to list of free bodies of svtype
106 arrays are indexed by the svtype needed
93e68bfb 107
d2a0f284
JC
108A few special SV heads are not allocated from an arena, but are
109instead directly created in the interpreter structure, eg PL_sv_undef.
93e68bfb
JC
110The size of arenas can be changed from the default by setting
111PERL_ARENA_SIZE appropriately at compile time.
645c22ef
DM
112
113The SV arena serves the secondary purpose of allowing still-live SVs
114to be located and destroyed during final cleanup.
115
116At the lowest level, the macros new_SV() and del_SV() grab and free
117an SV head. (If debugging with -DD, del_SV() calls the function S_del_sv()
118to return the SV to the free list with error checking.) new_SV() calls
119more_sv() / sv_add_arena() to add an extra arena if the free list is empty.
120SVs in the free list have their SvTYPE field set to all ones.
121
ff276b08 122At the time of very final cleanup, sv_free_arenas() is called from
645c22ef 123perl_destruct() to physically free all the arenas allocated since the
6a93a7e5 124start of the interpreter.
645c22ef 125
645c22ef
DM
126The function visit() scans the SV arenas list, and calls a specified
127function for each SV it finds which is still live - ie which has an SvTYPE
128other than all 1's, and a non-zero SvREFCNT. visit() is used by the
129following functions (specified as [function that calls visit()] / [function
130called by visit() for each SV]):
131
132 sv_report_used() / do_report_used()
f2524eef 133 dump all remaining SVs (debugging aid)
645c22ef 134
e4487e9b
DM
135 sv_clean_objs() / do_clean_objs(),do_clean_named_objs(),
136 do_clean_named_io_objs()
645c22ef 137 Attempt to free all objects pointed to by RVs,
c3b19b5c 138 and try to do the same for all objects indirectly
645c22ef
DM
139 referenced by typeglobs too. Called once from
140 perl_destruct(), prior to calling sv_clean_all()
141 below.
142
143 sv_clean_all() / do_clean_all()
144 SvREFCNT_dec(sv) each remaining SV, possibly
145 triggering an sv_free(). It also sets the
146 SVf_BREAK flag on the SV to indicate that the
147 refcnt has been artificially lowered, and thus
148 stopping sv_free() from giving spurious warnings
149 about SVs which unexpectedly have a refcnt
150 of zero. called repeatedly from perl_destruct()
151 until there are no SVs left.
152
93e68bfb 153=head2 Arena allocator API Summary
645c22ef
DM
154
155Private API to rest of sv.c
156
157 new_SV(), del_SV(),
158
df0f0429 159 new_XPVNV(), del_XPVGV(),
645c22ef
DM
160 etc
161
162Public API:
163
8cf8f3d1 164 sv_report_used(), sv_clean_objs(), sv_clean_all(), sv_free_arenas()
645c22ef 165
645c22ef
DM
166=cut
167
3e8320cc 168 * ========================================================================= */
645c22ef 169
4561caa4
CS
170/*
171 * "A time to plant, and a time to uproot what was planted..."
172 */
173
d7a2c63c
MHM
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
fd0854ff 184#ifdef DEBUG_LEAKING_SCALARS
22162ca8 185# define FREE_SV_DEBUG_FILE(sv) Safefree((sv)->sv_debug_file)
d7a2c63c
MHM
186# define DEBUG_SV_SERIAL(sv) \
187 DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) del_SV\n", \
188 PTR2UV(sv), (long)(sv)->sv_debug_serial))
fd0854ff
DM
189#else
190# define FREE_SV_DEBUG_FILE(sv)
d7a2c63c 191# define DEBUG_SV_SERIAL(sv) NOOP
fd0854ff
DM
192#endif
193
48614a46
NC
194#ifdef PERL_POISON
195# define SvARENA_CHAIN(sv) ((sv)->sv_u.svu_rv)
daba3364 196# define SvARENA_CHAIN_SET(sv,val) (sv)->sv_u.svu_rv = MUTABLE_SV((val))
48614a46
NC
197/* Whilst I'd love to do this, it seems that things like to check on
198 unreferenced scalars
7e337ee0 199# define POSION_SV_HEAD(sv) PoisonNew(sv, 1, struct STRUCT_SV)
48614a46 200*/
7e337ee0
JH
201# define POSION_SV_HEAD(sv) PoisonNew(&SvANY(sv), 1, void *), \
202 PoisonNew(&SvREFCNT(sv), 1, U32)
48614a46
NC
203#else
204# define SvARENA_CHAIN(sv) SvANY(sv)
3eef1deb 205# define SvARENA_CHAIN_SET(sv,val) SvANY(sv) = (void *)(val)
48614a46
NC
206# define POSION_SV_HEAD(sv)
207#endif
208
990198f0
DM
209/* Mark an SV head as unused, and add to free list.
210 *
211 * If SVf_BREAK is set, skip adding it to the free list, as this SV had
212 * its refcount artificially decremented during global destruction, so
213 * there may be dangling pointers to it. The last thing we want in that
214 * case is for it to be reused. */
215
053fc874
GS
216#define plant_SV(p) \
217 STMT_START { \
990198f0 218 const U32 old_flags = SvFLAGS(p); \
d7a2c63c
MHM
219 MEM_LOG_DEL_SV(p, __FILE__, __LINE__, FUNCTION__); \
220 DEBUG_SV_SERIAL(p); \
fd0854ff 221 FREE_SV_DEBUG_FILE(p); \
48614a46 222 POSION_SV_HEAD(p); \
053fc874 223 SvFLAGS(p) = SVTYPEMASK; \
990198f0 224 if (!(old_flags & SVf_BREAK)) { \
3eef1deb 225 SvARENA_CHAIN_SET(p, PL_sv_root); \
990198f0
DM
226 PL_sv_root = (p); \
227 } \
053fc874
GS
228 --PL_sv_count; \
229 } STMT_END
a0d0e21e 230
053fc874
GS
231#define uproot_SV(p) \
232 STMT_START { \
233 (p) = PL_sv_root; \
daba3364 234 PL_sv_root = MUTABLE_SV(SvARENA_CHAIN(p)); \
053fc874
GS
235 ++PL_sv_count; \
236 } STMT_END
237
645c22ef 238
cac9b346
NC
239/* make some more SVs by adding another arena */
240
cac9b346
NC
241STATIC SV*
242S_more_sv(pTHX)
243{
97aff369 244 dVAR;
cac9b346 245 SV* sv;
9a87bd09
NC
246 char *chunk; /* must use New here to match call to */
247 Newx(chunk,PERL_ARENA_SIZE,char); /* Safefree() in sv_free_arenas() */
248 sv_add_arena(chunk, PERL_ARENA_SIZE, 0);
cac9b346
NC
249 uproot_SV(sv);
250 return sv;
251}
252
645c22ef
DM
253/* new_SV(): return a new, empty SV head */
254
eba0f806
DM
255#ifdef DEBUG_LEAKING_SCALARS
256/* provide a real function for a debugger to play with */
257STATIC SV*
d7a2c63c 258S_new_SV(pTHX_ const char *file, int line, const char *func)
eba0f806
DM
259{
260 SV* sv;
261
eba0f806
DM
262 if (PL_sv_root)
263 uproot_SV(sv);
264 else
cac9b346 265 sv = S_more_sv(aTHX);
eba0f806
DM
266 SvANY(sv) = 0;
267 SvREFCNT(sv) = 1;
268 SvFLAGS(sv) = 0;
fd0854ff 269 sv->sv_debug_optype = PL_op ? PL_op->op_type : 0;
e385c3bf
DM
270 sv->sv_debug_line = (U16) (PL_parser && PL_parser->copline != NOLINE
271 ? PL_parser->copline
272 : PL_curcop
f24aceb1
DM
273 ? CopLINE(PL_curcop)
274 : 0
e385c3bf 275 );
fd0854ff 276 sv->sv_debug_inpad = 0;
cd676548 277 sv->sv_debug_parent = NULL;
fd0854ff 278 sv->sv_debug_file = PL_curcop ? savepv(CopFILE(PL_curcop)): NULL;
d7a2c63c
MHM
279
280 sv->sv_debug_serial = PL_sv_serial++;
281
282 MEM_LOG_NEW_SV(sv, file, line, func);
283 DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) new_SV (from %s:%d [%s])\n",
284 PTR2UV(sv), (long)sv->sv_debug_serial, file, line, func));
285
eba0f806
DM
286 return sv;
287}
d7a2c63c 288# define new_SV(p) (p)=S_new_SV(aTHX_ __FILE__, __LINE__, FUNCTION__)
eba0f806
DM
289
290#else
291# define new_SV(p) \
053fc874 292 STMT_START { \
053fc874
GS
293 if (PL_sv_root) \
294 uproot_SV(p); \
295 else \
cac9b346 296 (p) = S_more_sv(aTHX); \
053fc874
GS
297 SvANY(p) = 0; \
298 SvREFCNT(p) = 1; \
299 SvFLAGS(p) = 0; \
d7a2c63c 300 MEM_LOG_NEW_SV(p, __FILE__, __LINE__, FUNCTION__); \
053fc874 301 } STMT_END
eba0f806 302#endif
463ee0b2 303
645c22ef
DM
304
305/* del_SV(): return an empty SV head to the free list */
306
a0d0e21e 307#ifdef DEBUGGING
4561caa4 308
053fc874
GS
309#define del_SV(p) \
310 STMT_START { \
aea4f609 311 if (DEBUG_D_TEST) \
053fc874
GS
312 del_sv(p); \
313 else \
314 plant_SV(p); \
053fc874 315 } STMT_END
a0d0e21e 316
76e3520e 317STATIC void
cea2e8a9 318S_del_sv(pTHX_ SV *p)
463ee0b2 319{
97aff369 320 dVAR;
7918f24d
NC
321
322 PERL_ARGS_ASSERT_DEL_SV;
323
aea4f609 324 if (DEBUG_D_TEST) {
4633a7c4 325 SV* sva;
a3b680e6 326 bool ok = 0;
daba3364 327 for (sva = PL_sv_arenaroot; sva; sva = MUTABLE_SV(SvANY(sva))) {
53c1dcc0
AL
328 const SV * const sv = sva + 1;
329 const SV * const svend = &sva[SvREFCNT(sva)];
c0ff570e 330 if (p >= sv && p < svend) {
a0d0e21e 331 ok = 1;
c0ff570e
NC
332 break;
333 }
a0d0e21e
LW
334 }
335 if (!ok) {
9b387841
NC
336 Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),
337 "Attempt to free non-arena SV: 0x%"UVxf
338 pTHX__FORMAT, PTR2UV(p) pTHX__VALUE);
a0d0e21e
LW
339 return;
340 }
341 }
4561caa4 342 plant_SV(p);
463ee0b2 343}
a0d0e21e 344
4561caa4
CS
345#else /* ! DEBUGGING */
346
347#define del_SV(p) plant_SV(p)
348
349#endif /* DEBUGGING */
463ee0b2 350
645c22ef
DM
351
352/*
ccfc67b7
JH
353=head1 SV Manipulation Functions
354
645c22ef
DM
355=for apidoc sv_add_arena
356
357Given a chunk of memory, link it to the head of the list of arenas,
358and split it into a list of free SVs.
359
360=cut
361*/
362
d2bd4e7f
NC
363static void
364S_sv_add_arena(pTHX_ char *const ptr, const U32 size, const U32 flags)
463ee0b2 365{
97aff369 366 dVAR;
daba3364 367 SV *const sva = MUTABLE_SV(ptr);
463ee0b2
LW
368 register SV* sv;
369 register SV* svend;
4633a7c4 370
7918f24d
NC
371 PERL_ARGS_ASSERT_SV_ADD_ARENA;
372
4633a7c4 373 /* The first SV in an arena isn't an SV. */
3280af22 374 SvANY(sva) = (void *) PL_sv_arenaroot; /* ptr to next arena */
4633a7c4
LW
375 SvREFCNT(sva) = size / sizeof(SV); /* number of SV slots */
376 SvFLAGS(sva) = flags; /* FAKE if not to be freed */
377
3280af22
NIS
378 PL_sv_arenaroot = sva;
379 PL_sv_root = sva + 1;
4633a7c4
LW
380
381 svend = &sva[SvREFCNT(sva) - 1];
382 sv = sva + 1;
463ee0b2 383 while (sv < svend) {
3eef1deb 384 SvARENA_CHAIN_SET(sv, (sv + 1));
03e36789 385#ifdef DEBUGGING
978b032e 386 SvREFCNT(sv) = 0;
03e36789 387#endif
4b69cbe3 388 /* Must always set typemask because it's always checked in on cleanup
03e36789 389 when the arenas are walked looking for objects. */
8990e307 390 SvFLAGS(sv) = SVTYPEMASK;
463ee0b2
LW
391 sv++;
392 }
3eef1deb 393 SvARENA_CHAIN_SET(sv, 0);
03e36789
NC
394#ifdef DEBUGGING
395 SvREFCNT(sv) = 0;
396#endif
4633a7c4
LW
397 SvFLAGS(sv) = SVTYPEMASK;
398}
399
055972dc
DM
400/* visit(): call the named function for each non-free SV in the arenas
401 * whose flags field matches the flags/mask args. */
645c22ef 402
5226ed68 403STATIC I32
de37a194 404S_visit(pTHX_ SVFUNC_t f, const U32 flags, const U32 mask)
8990e307 405{
97aff369 406 dVAR;
4633a7c4 407 SV* sva;
5226ed68 408 I32 visited = 0;
8990e307 409
7918f24d
NC
410 PERL_ARGS_ASSERT_VISIT;
411
daba3364 412 for (sva = PL_sv_arenaroot; sva; sva = MUTABLE_SV(SvANY(sva))) {
53c1dcc0 413 register const SV * const svend = &sva[SvREFCNT(sva)];
a3b680e6 414 register SV* sv;
4561caa4 415 for (sv = sva + 1; sv < svend; ++sv) {
055972dc
DM
416 if (SvTYPE(sv) != SVTYPEMASK
417 && (sv->sv_flags & mask) == flags
418 && SvREFCNT(sv))
419 {
acfe0abc 420 (FCALL)(aTHX_ sv);
5226ed68
JH
421 ++visited;
422 }
8990e307
LW
423 }
424 }
5226ed68 425 return visited;
8990e307
LW
426}
427
758a08c3
JH
428#ifdef DEBUGGING
429
645c22ef
DM
430/* called by sv_report_used() for each live SV */
431
432static void
5fa45a31 433do_report_used(pTHX_ SV *const sv)
645c22ef
DM
434{
435 if (SvTYPE(sv) != SVTYPEMASK) {
436 PerlIO_printf(Perl_debug_log, "****\n");
437 sv_dump(sv);
438 }
439}
758a08c3 440#endif
645c22ef
DM
441
442/*
443=for apidoc sv_report_used
444
445Dump the contents of all SVs not yet freed. (Debugging aid).
446
447=cut
448*/
449
8990e307 450void
864dbfa3 451Perl_sv_report_used(pTHX)
4561caa4 452{
ff270d3a 453#ifdef DEBUGGING
055972dc 454 visit(do_report_used, 0, 0);
96a5add6
AL
455#else
456 PERL_UNUSED_CONTEXT;
ff270d3a 457#endif
4561caa4
CS
458}
459
645c22ef
DM
460/* called by sv_clean_objs() for each live SV */
461
462static void
de37a194 463do_clean_objs(pTHX_ SV *const ref)
645c22ef 464{
97aff369 465 dVAR;
ea724faa
NC
466 assert (SvROK(ref));
467 {
823a54a3
AL
468 SV * const target = SvRV(ref);
469 if (SvOBJECT(target)) {
470 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(ref)));
471 if (SvWEAKREF(ref)) {
472 sv_del_backref(target, ref);
473 SvWEAKREF_off(ref);
474 SvRV_set(ref, NULL);
475 } else {
476 SvROK_off(ref);
477 SvRV_set(ref, NULL);
478 SvREFCNT_dec(target);
479 }
645c22ef
DM
480 }
481 }
482
483 /* XXX Might want to check arrays, etc. */
484}
485
645c22ef 486
e4487e9b
DM
487/* clear any slots in a GV which hold objects - except IO;
488 * called by sv_clean_objs() for each live GV */
489
645c22ef 490static void
f30de749 491do_clean_named_objs(pTHX_ SV *const sv)
645c22ef 492{
97aff369 493 dVAR;
57ef47cc 494 SV *obj;
ea724faa 495 assert(SvTYPE(sv) == SVt_PVGV);
d011219a 496 assert(isGV_with_GP(sv));
57ef47cc
DM
497 if (!GvGP(sv))
498 return;
499
500 /* freeing GP entries may indirectly free the current GV;
501 * hold onto it while we mess with the GP slots */
502 SvREFCNT_inc(sv);
503
504 if ( ((obj = GvSV(sv) )) && SvOBJECT(obj)) {
505 DEBUG_D((PerlIO_printf(Perl_debug_log,
506 "Cleaning named glob SV object:\n "), sv_dump(obj)));
507 GvSV(sv) = NULL;
508 SvREFCNT_dec(obj);
509 }
510 if ( ((obj = MUTABLE_SV(GvAV(sv)) )) && SvOBJECT(obj)) {
511 DEBUG_D((PerlIO_printf(Perl_debug_log,
512 "Cleaning named glob AV object:\n "), sv_dump(obj)));
513 GvAV(sv) = NULL;
514 SvREFCNT_dec(obj);
515 }
516 if ( ((obj = MUTABLE_SV(GvHV(sv)) )) && SvOBJECT(obj)) {
517 DEBUG_D((PerlIO_printf(Perl_debug_log,
518 "Cleaning named glob HV object:\n "), sv_dump(obj)));
519 GvHV(sv) = NULL;
520 SvREFCNT_dec(obj);
521 }
522 if ( ((obj = MUTABLE_SV(GvCV(sv)) )) && SvOBJECT(obj)) {
523 DEBUG_D((PerlIO_printf(Perl_debug_log,
524 "Cleaning named glob CV object:\n "), sv_dump(obj)));
c43ae56f 525 GvCV_set(sv, NULL);
57ef47cc
DM
526 SvREFCNT_dec(obj);
527 }
e4487e9b
DM
528 SvREFCNT_dec(sv); /* undo the inc above */
529}
530
68b590d9 531/* clear any IO slots in a GV which hold objects (except stderr, defout);
e4487e9b
DM
532 * called by sv_clean_objs() for each live GV */
533
534static void
535do_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));
68b590d9 541 if (!GvGP(sv) || sv == (SV*)PL_stderrgv || sv == (SV*)PL_defoutgv)
e4487e9b
DM
542 return;
543
544 SvREFCNT_inc(sv);
57ef47cc
DM
545 if ( ((obj = MUTABLE_SV(GvIO(sv)) )) && SvOBJECT(obj)) {
546 DEBUG_D((PerlIO_printf(Perl_debug_log,
547 "Cleaning named glob IO object:\n "), sv_dump(obj)));
548 GvIOp(sv) = NULL;
549 SvREFCNT_dec(obj);
645c22ef 550 }
57ef47cc 551 SvREFCNT_dec(sv); /* undo the inc above */
645c22ef 552}
645c22ef 553
4155e4fe 554/* Void wrapper to pass to visit() */
82336099 555/* XXX
4155e4fe
FC
556static void
557do_curse(pTHX_ SV * const sv) {
c2910e6c
FC
558 if ((PL_stderrgv && GvGP(PL_stderrgv) && (SV*)GvIO(PL_stderrgv) == sv)
559 || (PL_defoutgv && GvGP(PL_defoutgv) && (SV*)GvIO(PL_defoutgv) == sv))
4155e4fe
FC
560 return;
561 (void)curse(sv, 0);
562}
82336099 563*/
4155e4fe 564
645c22ef
DM
565/*
566=for apidoc sv_clean_objs
567
568Attempt to destroy all objects not yet freed
569
570=cut
571*/
572
4561caa4 573void
864dbfa3 574Perl_sv_clean_objs(pTHX)
4561caa4 575{
97aff369 576 dVAR;
68b590d9 577 GV *olddef, *olderr;
3280af22 578 PL_in_clean_objs = TRUE;
055972dc 579 visit(do_clean_objs, SVf_ROK, SVf_ROK);
e4487e9b
DM
580 /* Some barnacles may yet remain, clinging to typeglobs.
581 * Run the non-IO destructors first: they may want to output
582 * error messages, close files etc */
d011219a 583 visit(do_clean_named_objs, SVt_PVGV|SVpgv_GP, SVTYPEMASK|SVp_POK|SVpgv_GP);
e4487e9b 584 visit(do_clean_named_io_objs, SVt_PVGV|SVpgv_GP, SVTYPEMASK|SVp_POK|SVpgv_GP);
4155e4fe
FC
585 /* And if there are some very tenacious barnacles clinging to arrays,
586 closures, or what have you.... */
7f586e41 587 /* XXX This line breaks Tk and Gtk2. See [perl #82542].
4155e4fe 588 visit(do_curse, SVs_OBJECT, SVs_OBJECT);
7f586e41 589 */
68b590d9
DM
590 olddef = PL_defoutgv;
591 PL_defoutgv = NULL; /* disable skip of PL_defoutgv */
592 if (olddef && isGV_with_GP(olddef))
593 do_clean_named_io_objs(aTHX_ MUTABLE_SV(olddef));
594 olderr = PL_stderrgv;
595 PL_stderrgv = NULL; /* disable skip of PL_stderrgv */
596 if (olderr && isGV_with_GP(olderr))
597 do_clean_named_io_objs(aTHX_ MUTABLE_SV(olderr));
598 SvREFCNT_dec(olddef);
3280af22 599 PL_in_clean_objs = FALSE;
4561caa4
CS
600}
601
645c22ef
DM
602/* called by sv_clean_all() for each live SV */
603
604static void
de37a194 605do_clean_all(pTHX_ SV *const sv)
645c22ef 606{
97aff369 607 dVAR;
daba3364 608 if (sv == (const SV *) PL_fdpid || sv == (const SV *)PL_strtab) {
cddfcddc 609 /* don't clean pid table and strtab */
d17ea597 610 return;
cddfcddc 611 }
645c22ef
DM
612 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%"UVxf"\n", PTR2UV(sv)) ));
613 SvFLAGS(sv) |= SVf_BREAK;
614 SvREFCNT_dec(sv);
615}
616
617/*
618=for apidoc sv_clean_all
619
620Decrement the refcnt of each remaining SV, possibly triggering a
621cleanup. This function may have to be called multiple times to free
ff276b08 622SVs which are in complex self-referential hierarchies.
645c22ef
DM
623
624=cut
625*/
626
5226ed68 627I32
864dbfa3 628Perl_sv_clean_all(pTHX)
8990e307 629{
97aff369 630 dVAR;
5226ed68 631 I32 cleaned;
3280af22 632 PL_in_clean_all = TRUE;
055972dc 633 cleaned = visit(do_clean_all, 0,0);
5226ed68 634 return cleaned;
8990e307 635}
463ee0b2 636
5e258f8c
JC
637/*
638 ARENASETS: a meta-arena implementation which separates arena-info
639 into struct arena_set, which contains an array of struct
640 arena_descs, each holding info for a single arena. By separating
641 the meta-info from the arena, we recover the 1st slot, formerly
642 borrowed for list management. The arena_set is about the size of an
39244528 643 arena, avoiding the needless malloc overhead of a naive linked-list.
5e258f8c
JC
644
645 The cost is 1 arena-set malloc per ~320 arena-mallocs, + the unused
646 memory in the last arena-set (1/2 on average). In trade, we get
647 back the 1st slot in each arena (ie 1.7% of a CV-arena, less for
d2a0f284 648 smaller types). The recovery of the wasted space allows use of
e15dad31
JC
649 small arenas for large, rare body types, by changing array* fields
650 in body_details_by_type[] below.
5e258f8c 651*/
5e258f8c 652struct arena_desc {
398c677b
NC
653 char *arena; /* the raw storage, allocated aligned */
654 size_t size; /* its size ~4k typ */
e5973ed5 655 svtype utype; /* bodytype stored in arena */
5e258f8c
JC
656};
657
e6148039
NC
658struct arena_set;
659
660/* Get the maximum number of elements in set[] such that struct arena_set
e15dad31 661 will fit within PERL_ARENA_SIZE, which is probably just under 4K, and
e6148039
NC
662 therefore likely to be 1 aligned memory page. */
663
664#define ARENAS_PER_SET ((PERL_ARENA_SIZE - sizeof(struct arena_set*) \
665 - 2 * sizeof(int)) / sizeof (struct arena_desc))
5e258f8c
JC
666
667struct arena_set {
668 struct arena_set* next;
0a848332
NC
669 unsigned int set_size; /* ie ARENAS_PER_SET */
670 unsigned int curr; /* index of next available arena-desc */
5e258f8c
JC
671 struct arena_desc set[ARENAS_PER_SET];
672};
673
645c22ef
DM
674/*
675=for apidoc sv_free_arenas
676
677Deallocate the memory used by all arenas. Note that all the individual SV
678heads and bodies within the arenas must already have been freed.
679
680=cut
681*/
4633a7c4 682void
864dbfa3 683Perl_sv_free_arenas(pTHX)
4633a7c4 684{
97aff369 685 dVAR;
4633a7c4
LW
686 SV* sva;
687 SV* svanext;
0a848332 688 unsigned int i;
4633a7c4
LW
689
690 /* Free arenas here, but be careful about fake ones. (We assume
691 contiguity of the fake ones with the corresponding real ones.) */
692
3280af22 693 for (sva = PL_sv_arenaroot; sva; sva = svanext) {
daba3364 694 svanext = MUTABLE_SV(SvANY(sva));
4633a7c4 695 while (svanext && SvFAKE(svanext))
daba3364 696 svanext = MUTABLE_SV(SvANY(svanext));
4633a7c4
LW
697
698 if (!SvFAKE(sva))
1df70142 699 Safefree(sva);
4633a7c4 700 }
93e68bfb 701
5e258f8c 702 {
0a848332
NC
703 struct arena_set *aroot = (struct arena_set*) PL_body_arenas;
704
705 while (aroot) {
706 struct arena_set *current = aroot;
707 i = aroot->curr;
708 while (i--) {
5e258f8c
JC
709 assert(aroot->set[i].arena);
710 Safefree(aroot->set[i].arena);
711 }
0a848332
NC
712 aroot = aroot->next;
713 Safefree(current);
5e258f8c
JC
714 }
715 }
dc8220bf 716 PL_body_arenas = 0;
fdda85ca 717
0a848332
NC
718 i = PERL_ARENA_ROOTS_SIZE;
719 while (i--)
93e68bfb 720 PL_body_roots[i] = 0;
93e68bfb 721
3280af22
NIS
722 PL_sv_arenaroot = 0;
723 PL_sv_root = 0;
4633a7c4
LW
724}
725
bd81e77b
NC
726/*
727 Here are mid-level routines that manage the allocation of bodies out
728 of the various arenas. There are 5 kinds of arenas:
29489e7c 729
bd81e77b
NC
730 1. SV-head arenas, which are discussed and handled above
731 2. regular body arenas
732 3. arenas for reduced-size bodies
733 4. Hash-Entry arenas
29489e7c 734
bd81e77b
NC
735 Arena types 2 & 3 are chained by body-type off an array of
736 arena-root pointers, which is indexed by svtype. Some of the
737 larger/less used body types are malloced singly, since a large
738 unused block of them is wasteful. Also, several svtypes dont have
739 bodies; the data fits into the sv-head itself. The arena-root
740 pointer thus has a few unused root-pointers (which may be hijacked
741 later for arena types 4,5)
29489e7c 742
bd81e77b
NC
743 3 differs from 2 as an optimization; some body types have several
744 unused fields in the front of the structure (which are kept in-place
745 for consistency). These bodies can be allocated in smaller chunks,
746 because the leading fields arent accessed. Pointers to such bodies
747 are decremented to point at the unused 'ghost' memory, knowing that
748 the pointers are used with offsets to the real memory.
29489e7c 749
d2a0f284
JC
750
751=head1 SV-Body Allocation
752
753Allocation of SV-bodies is similar to SV-heads, differing as follows;
754the allocation mechanism is used for many body types, so is somewhat
755more complicated, it uses arena-sets, and has no need for still-live
756SV detection.
757
758At the outermost level, (new|del)_X*V macros return bodies of the
759appropriate type. These macros call either (new|del)_body_type or
760(new|del)_body_allocated macro pairs, depending on specifics of the
761type. Most body types use the former pair, the latter pair is used to
762allocate body types with "ghost fields".
763
764"ghost fields" are fields that are unused in certain types, and
69ba284b 765consequently don't need to actually exist. They are declared because
d2a0f284
JC
766they're part of a "base type", which allows use of functions as
767methods. The simplest examples are AVs and HVs, 2 aggregate types
768which don't use the fields which support SCALAR semantics.
769
69ba284b 770For these types, the arenas are carved up into appropriately sized
d2a0f284
JC
771chunks, we thus avoid wasted memory for those unaccessed members.
772When bodies are allocated, we adjust the pointer back in memory by the
69ba284b 773size of the part not allocated, so it's as if we allocated the full
d2a0f284
JC
774structure. (But things will all go boom if you write to the part that
775is "not there", because you'll be overwriting the last members of the
776preceding structure in memory.)
777
69ba284b
NC
778We calculate the correction using the STRUCT_OFFSET macro on the first
779member present. If the allocated structure is smaller (no initial NV
780actually allocated) then the net effect is to subtract the size of the NV
781from the pointer, to return a new pointer as if an initial NV were actually
782allocated. (We were using structures named *_allocated for this, but
783this turned out to be a subtle bug, because a structure without an NV
784could have a lower alignment constraint, but the compiler is allowed to
785optimised accesses based on the alignment constraint of the actual pointer
786to the full structure, for example, using a single 64 bit load instruction
787because it "knows" that two adjacent 32 bit members will be 8-byte aligned.)
d2a0f284
JC
788
789This is the same trick as was used for NV and IV bodies. Ironically it
790doesn't need to be used for NV bodies any more, because NV is now at
791the start of the structure. IV bodies don't need it either, because
792they are no longer allocated.
793
794In turn, the new_body_* allocators call S_new_body(), which invokes
795new_body_inline macro, which takes a lock, and takes a body off the
1e30fcd5 796linked list at PL_body_roots[sv_type], calling Perl_more_bodies() if
d2a0f284
JC
797necessary to refresh an empty list. Then the lock is released, and
798the body is returned.
799
99816f8d 800Perl_more_bodies allocates a new arena, and carves it up into an array of N
d2a0f284
JC
801bodies, which it strings into a linked list. It looks up arena-size
802and body-size from the body_details table described below, thus
803supporting the multiple body-types.
804
805If PURIFY is defined, or PERL_ARENA_SIZE=0, arenas are not used, and
806the (new|del)_X*V macros are mapped directly to malloc/free.
807
d2a0f284
JC
808For each sv-type, struct body_details bodies_by_type[] carries
809parameters which control these aspects of SV handling:
810
811Arena_size determines whether arenas are used for this body type, and if
812so, how big they are. PURIFY or PERL_ARENA_SIZE=0 set this field to
813zero, forcing individual mallocs and frees.
814
815Body_size determines how big a body is, and therefore how many fit into
816each arena. Offset carries the body-pointer adjustment needed for
69ba284b 817"ghost fields", and is used in *_allocated macros.
d2a0f284
JC
818
819But its main purpose is to parameterize info needed in
820Perl_sv_upgrade(). The info here dramatically simplifies the function
69ba284b 821vs the implementation in 5.8.8, making it table-driven. All fields
d2a0f284
JC
822are used for this, except for arena_size.
823
824For the sv-types that have no bodies, arenas are not used, so those
825PL_body_roots[sv_type] are unused, and can be overloaded. In
826something of a special case, SVt_NULL is borrowed for HE arenas;
c6f8b1d0 827PL_body_roots[HE_SVSLOT=SVt_NULL] is filled by S_more_he, but the
d2a0f284 828bodies_by_type[SVt_NULL] slot is not used, as the table is not
c6f8b1d0 829available in hv.c.
d2a0f284 830
29489e7c
DM
831*/
832
bd81e77b 833struct body_details {
0fb58b32 834 U8 body_size; /* Size to allocate */
10666ae3 835 U8 copy; /* Size of structure to copy (may be shorter) */
0fb58b32 836 U8 offset;
10666ae3
NC
837 unsigned int type : 4; /* We have space for a sanity check. */
838 unsigned int cant_upgrade : 1; /* Cannot upgrade this type */
839 unsigned int zero_nv : 1; /* zero the NV when upgrading from this */
840 unsigned int arena : 1; /* Allocated from an arena */
841 size_t arena_size; /* Size of arena to allocate */
bd81e77b 842};
29489e7c 843
bd81e77b
NC
844#define HADNV FALSE
845#define NONV TRUE
29489e7c 846
d2a0f284 847
bd81e77b
NC
848#ifdef PURIFY
849/* With -DPURFIY we allocate everything directly, and don't use arenas.
850 This seems a rather elegant way to simplify some of the code below. */
851#define HASARENA FALSE
852#else
853#define HASARENA TRUE
854#endif
855#define NOARENA FALSE
29489e7c 856
d2a0f284
JC
857/* Size the arenas to exactly fit a given number of bodies. A count
858 of 0 fits the max number bodies into a PERL_ARENA_SIZE.block,
859 simplifying the default. If count > 0, the arena is sized to fit
860 only that many bodies, allowing arenas to be used for large, rare
861 bodies (XPVFM, XPVIO) without undue waste. The arena size is
862 limited by PERL_ARENA_SIZE, so we can safely oversize the
863 declarations.
864 */
95db5f15
MB
865#define FIT_ARENA0(body_size) \
866 ((size_t)(PERL_ARENA_SIZE / body_size) * body_size)
867#define FIT_ARENAn(count,body_size) \
868 ( count * body_size <= PERL_ARENA_SIZE) \
869 ? count * body_size \
870 : FIT_ARENA0 (body_size)
871#define FIT_ARENA(count,body_size) \
872 count \
873 ? FIT_ARENAn (count, body_size) \
874 : FIT_ARENA0 (body_size)
d2a0f284 875
bd81e77b
NC
876/* Calculate the length to copy. Specifically work out the length less any
877 final padding the compiler needed to add. See the comment in sv_upgrade
878 for why copying the padding proved to be a bug. */
29489e7c 879
bd81e77b
NC
880#define copy_length(type, last_member) \
881 STRUCT_OFFSET(type, last_member) \
daba3364 882 + sizeof (((type*)SvANY((const SV *)0))->last_member)
29489e7c 883
bd81e77b 884static const struct body_details bodies_by_type[] = {
829cd18a
NC
885 /* HEs use this offset for their arena. */
886 { 0, 0, 0, SVt_NULL, FALSE, NONV, NOARENA, 0 },
d2a0f284 887
1cb9cd50 888 /* The bind placeholder pretends to be an RV for now.
c6f8b1d0 889 Also it's marked as "can't upgrade" to stop anyone using it before it's
1cb9cd50
NC
890 implemented. */
891 { 0, 0, 0, SVt_BIND, TRUE, NONV, NOARENA, 0 },
892
db93c0c4
NC
893 /* IVs are in the head, so the allocation size is 0. */
894 { 0,
d2a0f284 895 sizeof(IV), /* This is used to copy out the IV body. */
10666ae3 896 STRUCT_OFFSET(XPVIV, xiv_iv), SVt_IV, FALSE, NONV,
db93c0c4 897 NOARENA /* IVS don't need an arena */, 0
d2a0f284
JC
898 },
899
bd81e77b 900 /* 8 bytes on most ILP32 with IEEE doubles */
6e128786
NC
901 { sizeof(NV), sizeof(NV),
902 STRUCT_OFFSET(XPVNV, xnv_u),
903 SVt_NV, FALSE, HADNV, HASARENA, FIT_ARENA(0, sizeof(NV)) },
d2a0f284 904
bd81e77b 905 /* 8 bytes on most ILP32 with IEEE doubles */
bc337e5c 906 { sizeof(XPV) - STRUCT_OFFSET(XPV, xpv_cur),
889d28b2
NC
907 copy_length(XPV, xpv_len) - STRUCT_OFFSET(XPV, xpv_cur),
908 + STRUCT_OFFSET(XPV, xpv_cur),
69ba284b 909 SVt_PV, FALSE, NONV, HASARENA,
889d28b2 910 FIT_ARENA(0, sizeof(XPV) - STRUCT_OFFSET(XPV, xpv_cur)) },
d2a0f284 911
bd81e77b 912 /* 12 */
bc337e5c 913 { sizeof(XPVIV) - STRUCT_OFFSET(XPV, xpv_cur),
889d28b2
NC
914 copy_length(XPVIV, xiv_u) - STRUCT_OFFSET(XPV, xpv_cur),
915 + STRUCT_OFFSET(XPV, xpv_cur),
916 SVt_PVIV, FALSE, NONV, HASARENA,
917 FIT_ARENA(0, sizeof(XPVIV) - STRUCT_OFFSET(XPV, xpv_cur)) },
d2a0f284 918
889d28b2 919 /* 20 */
bc337e5c 920 { sizeof(XPVNV) - STRUCT_OFFSET(XPV, xpv_cur),
889d28b2
NC
921 copy_length(XPVNV, xnv_u) - STRUCT_OFFSET(XPV, xpv_cur),
922 + STRUCT_OFFSET(XPV, xpv_cur),
923 SVt_PVNV, FALSE, HADNV, HASARENA,
924 FIT_ARENA(0, sizeof(XPVNV) - STRUCT_OFFSET(XPV, xpv_cur)) },
d2a0f284 925
bd81e77b 926 /* 28 */
6e128786 927 { sizeof(XPVMG), copy_length(XPVMG, xnv_u), 0, SVt_PVMG, FALSE, HADNV,
d2a0f284 928 HASARENA, FIT_ARENA(0, sizeof(XPVMG)) },
4df7f6af 929
288b8c02 930 /* something big */
601dfd0a
NC
931 { sizeof(regexp),
932 sizeof(regexp),
933 0,
08e44740 934 SVt_REGEXP, FALSE, NONV, HASARENA,
eaeb1e7f 935 FIT_ARENA(0, sizeof(regexp))
5c35adbb 936 },
4df7f6af 937
bd81e77b 938 /* 48 */
10666ae3 939 { sizeof(XPVGV), sizeof(XPVGV), 0, SVt_PVGV, TRUE, HADNV,
d2a0f284
JC
940 HASARENA, FIT_ARENA(0, sizeof(XPVGV)) },
941
bd81e77b 942 /* 64 */
10666ae3 943 { sizeof(XPVLV), sizeof(XPVLV), 0, SVt_PVLV, TRUE, HADNV,
d2a0f284
JC
944 HASARENA, FIT_ARENA(0, sizeof(XPVLV)) },
945
601dfd0a 946 { sizeof(XPVAV),
4f7003f5 947 copy_length(XPVAV, xav_alloc),
601dfd0a 948 0,
69ba284b 949 SVt_PVAV, TRUE, NONV, HASARENA,
601dfd0a 950 FIT_ARENA(0, sizeof(XPVAV)) },
d2a0f284 951
601dfd0a 952 { sizeof(XPVHV),
359164a0 953 copy_length(XPVHV, xhv_max),
601dfd0a 954 0,
69ba284b 955 SVt_PVHV, TRUE, NONV, HASARENA,
601dfd0a 956 FIT_ARENA(0, sizeof(XPVHV)) },
d2a0f284 957
c84c4652 958 /* 56 */
601dfd0a
NC
959 { sizeof(XPVCV),
960 sizeof(XPVCV),
961 0,
69ba284b 962 SVt_PVCV, TRUE, NONV, HASARENA,
601dfd0a 963 FIT_ARENA(0, sizeof(XPVCV)) },
69ba284b 964
601dfd0a
NC
965 { sizeof(XPVFM),
966 sizeof(XPVFM),
967 0,
69ba284b 968 SVt_PVFM, TRUE, NONV, NOARENA,
601dfd0a 969 FIT_ARENA(20, sizeof(XPVFM)) },
d2a0f284
JC
970
971 /* XPVIO is 84 bytes, fits 48x */
601dfd0a
NC
972 { sizeof(XPVIO),
973 sizeof(XPVIO),
974 0,
b6f60916 975 SVt_PVIO, TRUE, NONV, HASARENA,
601dfd0a 976 FIT_ARENA(24, sizeof(XPVIO)) },
bd81e77b 977};
29489e7c 978
bd81e77b 979#define new_body_allocated(sv_type) \
d2a0f284 980 (void *)((char *)S_new_body(aTHX_ sv_type) \
bd81e77b 981 - bodies_by_type[sv_type].offset)
29489e7c 982
26359cfa
NC
983/* return a thing to the free list */
984
985#define del_body(thing, root) \
986 STMT_START { \
987 void ** const thing_copy = (void **)thing; \
988 *thing_copy = *root; \
989 *root = (void*)thing_copy; \
990 } STMT_END
29489e7c 991
bd81e77b 992#ifdef PURIFY
29489e7c 993
beeec492
NC
994#define new_XNV() safemalloc(sizeof(XPVNV))
995#define new_XPVNV() safemalloc(sizeof(XPVNV))
996#define new_XPVMG() safemalloc(sizeof(XPVMG))
29489e7c 997
beeec492 998#define del_XPVGV(p) safefree(p)
29489e7c 999
bd81e77b 1000#else /* !PURIFY */
29489e7c 1001
65ac1738 1002#define new_XNV() new_body_allocated(SVt_NV)
65ac1738 1003#define new_XPVNV() new_body_allocated(SVt_PVNV)
65ac1738 1004#define new_XPVMG() new_body_allocated(SVt_PVMG)
645c22ef 1005
26359cfa
NC
1006#define del_XPVGV(p) del_body(p + bodies_by_type[SVt_PVGV].offset, \
1007 &PL_body_roots[SVt_PVGV])
1d7c1841 1008
bd81e77b 1009#endif /* PURIFY */
93e68bfb 1010
bd81e77b 1011/* no arena for you! */
93e68bfb 1012
bd81e77b 1013#define new_NOARENA(details) \
beeec492 1014 safemalloc((details)->body_size + (details)->offset)
bd81e77b 1015#define new_NOARENAZ(details) \
beeec492 1016 safecalloc((details)->body_size + (details)->offset, 1)
d2a0f284 1017
1e30fcd5
NC
1018void *
1019Perl_more_bodies (pTHX_ const svtype sv_type, const size_t body_size,
1020 const size_t arena_size)
d2a0f284
JC
1021{
1022 dVAR;
1023 void ** const root = &PL_body_roots[sv_type];
99816f8d
NC
1024 struct arena_desc *adesc;
1025 struct arena_set *aroot = (struct arena_set *) PL_body_arenas;
1026 unsigned int curr;
d2a0f284
JC
1027 char *start;
1028 const char *end;
02982131 1029 const size_t good_arena_size = Perl_malloc_good_size(arena_size);
0b2d3faa 1030#if defined(DEBUGGING) && !defined(PERL_GLOBAL_STRUCT_PRIVATE)
23e9d66c
NC
1031 static bool done_sanity_check;
1032
0b2d3faa
JH
1033 /* PERL_GLOBAL_STRUCT_PRIVATE cannot coexist with global
1034 * variables like done_sanity_check. */
10666ae3 1035 if (!done_sanity_check) {
ea471437 1036 unsigned int i = SVt_LAST;
10666ae3
NC
1037
1038 done_sanity_check = TRUE;
1039
1040 while (i--)
1041 assert (bodies_by_type[i].type == i);
1042 }
1043#endif
1044
02982131 1045 assert(arena_size);
23e9d66c 1046
99816f8d
NC
1047 /* may need new arena-set to hold new arena */
1048 if (!aroot || aroot->curr >= aroot->set_size) {
1049 struct arena_set *newroot;
1050 Newxz(newroot, 1, struct arena_set);
1051 newroot->set_size = ARENAS_PER_SET;
1052 newroot->next = aroot;
1053 aroot = newroot;
1054 PL_body_arenas = (void *) newroot;
1055 DEBUG_m(PerlIO_printf(Perl_debug_log, "new arenaset %p\n", (void*)aroot));
1056 }
1057
1058 /* ok, now have arena-set with at least 1 empty/available arena-desc */
1059 curr = aroot->curr++;
1060 adesc = &(aroot->set[curr]);
1061 assert(!adesc->arena);
1062
1063 Newx(adesc->arena, good_arena_size, char);
1064 adesc->size = good_arena_size;
1065 adesc->utype = sv_type;
1066 DEBUG_m(PerlIO_printf(Perl_debug_log, "arena %d added: %p size %"UVuf"\n",
1067 curr, (void*)adesc->arena, (UV)good_arena_size));
1068
1069 start = (char *) adesc->arena;
d2a0f284 1070
29657bb6
NC
1071 /* Get the address of the byte after the end of the last body we can fit.
1072 Remember, this is integer division: */
02982131 1073 end = start + good_arena_size / body_size * body_size;
d2a0f284 1074
486ec47a 1075 /* computed count doesn't reflect the 1st slot reservation */
d8fca402
NC
1076#if defined(MYMALLOC) || defined(HAS_MALLOC_GOOD_SIZE)
1077 DEBUG_m(PerlIO_printf(Perl_debug_log,
1078 "arena %p end %p arena-size %d (from %d) type %d "
1079 "size %d ct %d\n",
02982131
NC
1080 (void*)start, (void*)end, (int)good_arena_size,
1081 (int)arena_size, sv_type, (int)body_size,
1082 (int)good_arena_size / (int)body_size));
d8fca402 1083#else
d2a0f284
JC
1084 DEBUG_m(PerlIO_printf(Perl_debug_log,
1085 "arena %p end %p arena-size %d type %d size %d ct %d\n",
6c9570dc 1086 (void*)start, (void*)end,
02982131
NC
1087 (int)arena_size, sv_type, (int)body_size,
1088 (int)good_arena_size / (int)body_size));
d8fca402 1089#endif
d2a0f284
JC
1090 *root = (void *)start;
1091
29657bb6
NC
1092 while (1) {
1093 /* Where the next body would start: */
d2a0f284 1094 char * const next = start + body_size;
29657bb6
NC
1095
1096 if (next >= end) {
1097 /* This is the last body: */
1098 assert(next == end);
1099
1100 *(void **)start = 0;
1101 return *root;
1102 }
1103
d2a0f284
JC
1104 *(void**) start = (void *)next;
1105 start = next;
1106 }
d2a0f284
JC
1107}
1108
1109/* grab a new thing from the free list, allocating more if necessary.
1110 The inline version is used for speed in hot routines, and the
1111 function using it serves the rest (unless PURIFY).
1112*/
1113#define new_body_inline(xpv, sv_type) \
1114 STMT_START { \
1115 void ** const r3wt = &PL_body_roots[sv_type]; \
11b79775 1116 xpv = (PTR_TBL_ENT_t*) (*((void **)(r3wt)) \
1e30fcd5 1117 ? *((void **)(r3wt)) : Perl_more_bodies(aTHX_ sv_type, \
02982131
NC
1118 bodies_by_type[sv_type].body_size,\
1119 bodies_by_type[sv_type].arena_size)); \
d2a0f284 1120 *(r3wt) = *(void**)(xpv); \
d2a0f284
JC
1121 } STMT_END
1122
1123#ifndef PURIFY
1124
1125STATIC void *
de37a194 1126S_new_body(pTHX_ const svtype sv_type)
d2a0f284
JC
1127{
1128 dVAR;
1129 void *xpv;
1130 new_body_inline(xpv, sv_type);
1131 return xpv;
1132}
1133
1134#endif
93e68bfb 1135
238b27b3
NC
1136static const struct body_details fake_rv =
1137 { 0, 0, 0, SVt_IV, FALSE, NONV, NOARENA, 0 };
1138
bd81e77b
NC
1139/*
1140=for apidoc sv_upgrade
93e68bfb 1141
bd81e77b
NC
1142Upgrade an SV to a more complex form. Generally adds a new body type to the
1143SV, then copies across as much information as possible from the old body.
1144You generally want to use the C<SvUPGRADE> macro wrapper. See also C<svtype>.
93e68bfb 1145
bd81e77b 1146=cut
93e68bfb 1147*/
93e68bfb 1148
bd81e77b 1149void
aad570aa 1150Perl_sv_upgrade(pTHX_ register SV *const sv, svtype new_type)
cac9b346 1151{
97aff369 1152 dVAR;
bd81e77b
NC
1153 void* old_body;
1154 void* new_body;
42d0e0b7 1155 const svtype old_type = SvTYPE(sv);
d2a0f284 1156 const struct body_details *new_type_details;
238b27b3 1157 const struct body_details *old_type_details
bd81e77b 1158 = bodies_by_type + old_type;
4df7f6af 1159 SV *referant = NULL;
cac9b346 1160
7918f24d
NC
1161 PERL_ARGS_ASSERT_SV_UPGRADE;
1162
1776cbe8
NC
1163 if (old_type == new_type)
1164 return;
1165
1166 /* This clause was purposefully added ahead of the early return above to
1167 the shared string hackery for (sort {$a <=> $b} keys %hash), with the
1168 inference by Nick I-S that it would fix other troublesome cases. See
1169 changes 7162, 7163 (f130fd4589cf5fbb24149cd4db4137c8326f49c1 and parent)
1170
1171 Given that shared hash key scalars are no longer PVIV, but PV, there is
1172 no longer need to unshare so as to free up the IVX slot for its proper
1173 purpose. So it's safe to move the early return earlier. */
1174
bd81e77b
NC
1175 if (new_type != SVt_PV && SvIsCOW(sv)) {
1176 sv_force_normal_flags(sv, 0);
1177 }
cac9b346 1178
bd81e77b 1179 old_body = SvANY(sv);
de042e1d 1180
bd81e77b
NC
1181 /* Copying structures onto other structures that have been neatly zeroed
1182 has a subtle gotcha. Consider XPVMG
cac9b346 1183
bd81e77b
NC
1184 +------+------+------+------+------+-------+-------+
1185 | NV | CUR | LEN | IV | MAGIC | STASH |
1186 +------+------+------+------+------+-------+-------+
1187 0 4 8 12 16 20 24 28
645c22ef 1188
bd81e77b
NC
1189 where NVs are aligned to 8 bytes, so that sizeof that structure is
1190 actually 32 bytes long, with 4 bytes of padding at the end:
08742458 1191
bd81e77b
NC
1192 +------+------+------+------+------+-------+-------+------+
1193 | NV | CUR | LEN | IV | MAGIC | STASH | ??? |
1194 +------+------+------+------+------+-------+-------+------+
1195 0 4 8 12 16 20 24 28 32
08742458 1196
bd81e77b 1197 so what happens if you allocate memory for this structure:
30f9da9e 1198
bd81e77b
NC
1199 +------+------+------+------+------+-------+-------+------+------+...
1200 | NV | CUR | LEN | IV | MAGIC | STASH | GP | NAME |
1201 +------+------+------+------+------+-------+-------+------+------+...
1202 0 4 8 12 16 20 24 28 32 36
bfc44f79 1203
bd81e77b
NC
1204 zero it, then copy sizeof(XPVMG) bytes on top of it? Not quite what you
1205 expect, because you copy the area marked ??? onto GP. Now, ??? may have
1206 started out as zero once, but it's quite possible that it isn't. So now,
1207 rather than a nicely zeroed GP, you have it pointing somewhere random.
1208 Bugs ensue.
bfc44f79 1209
bd81e77b
NC
1210 (In fact, GP ends up pointing at a previous GP structure, because the
1211 principle cause of the padding in XPVMG getting garbage is a copy of
6c9e42f7
NC
1212 sizeof(XPVMG) bytes from a XPVGV structure in sv_unglob. Right now
1213 this happens to be moot because XPVGV has been re-ordered, with GP
1214 no longer after STASH)
30f9da9e 1215
bd81e77b
NC
1216 So we are careful and work out the size of used parts of all the
1217 structures. */
bfc44f79 1218
bd81e77b
NC
1219 switch (old_type) {
1220 case SVt_NULL:
1221 break;
1222 case SVt_IV:
4df7f6af
NC
1223 if (SvROK(sv)) {
1224 referant = SvRV(sv);
238b27b3
NC
1225 old_type_details = &fake_rv;
1226 if (new_type == SVt_NV)
1227 new_type = SVt_PVNV;
4df7f6af
NC
1228 } else {
1229 if (new_type < SVt_PVIV) {
1230 new_type = (new_type == SVt_NV)
1231 ? SVt_PVNV : SVt_PVIV;
1232 }
bd81e77b
NC
1233 }
1234 break;
1235 case SVt_NV:
1236 if (new_type < SVt_PVNV) {
1237 new_type = SVt_PVNV;
bd81e77b
NC
1238 }
1239 break;
bd81e77b
NC
1240 case SVt_PV:
1241 assert(new_type > SVt_PV);
1242 assert(SVt_IV < SVt_PV);
1243 assert(SVt_NV < SVt_PV);
1244 break;
1245 case SVt_PVIV:
1246 break;
1247 case SVt_PVNV:
1248 break;
1249 case SVt_PVMG:
1250 /* Because the XPVMG of PL_mess_sv isn't allocated from the arena,
1251 there's no way that it can be safely upgraded, because perl.c
1252 expects to Safefree(SvANY(PL_mess_sv)) */
1253 assert(sv != PL_mess_sv);
1254 /* This flag bit is used to mean other things in other scalar types.
1255 Given that it only has meaning inside the pad, it shouldn't be set
1256 on anything that can get upgraded. */
00b1698f 1257 assert(!SvPAD_TYPED(sv));
bd81e77b
NC
1258 break;
1259 default:
1260 if (old_type_details->cant_upgrade)
c81225bc
NC
1261 Perl_croak(aTHX_ "Can't upgrade %s (%" UVuf ") to %" UVuf,
1262 sv_reftype(sv, 0), (UV) old_type, (UV) new_type);
bd81e77b 1263 }
3376de98
NC
1264
1265 if (old_type > new_type)
1266 Perl_croak(aTHX_ "sv_upgrade from type %d down to type %d",
1267 (int)old_type, (int)new_type);
1268
2fa1109b 1269 new_type_details = bodies_by_type + new_type;
645c22ef 1270
bd81e77b
NC
1271 SvFLAGS(sv) &= ~SVTYPEMASK;
1272 SvFLAGS(sv) |= new_type;
932e9ff9 1273
ab4416c0
NC
1274 /* This can't happen, as SVt_NULL is <= all values of new_type, so one of
1275 the return statements above will have triggered. */
1276 assert (new_type != SVt_NULL);
bd81e77b 1277 switch (new_type) {
bd81e77b
NC
1278 case SVt_IV:
1279 assert(old_type == SVt_NULL);
1280 SvANY(sv) = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
1281 SvIV_set(sv, 0);
1282 return;
1283 case SVt_NV:
1284 assert(old_type == SVt_NULL);
1285 SvANY(sv) = new_XNV();
1286 SvNV_set(sv, 0);
1287 return;
bd81e77b 1288 case SVt_PVHV:
bd81e77b 1289 case SVt_PVAV:
d2a0f284 1290 assert(new_type_details->body_size);
c1ae03ae
NC
1291
1292#ifndef PURIFY
1293 assert(new_type_details->arena);
d2a0f284 1294 assert(new_type_details->arena_size);
c1ae03ae 1295 /* This points to the start of the allocated area. */
d2a0f284
JC
1296 new_body_inline(new_body, new_type);
1297 Zero(new_body, new_type_details->body_size, char);
c1ae03ae
NC
1298 new_body = ((char *)new_body) - new_type_details->offset;
1299#else
1300 /* We always allocated the full length item with PURIFY. To do this
1301 we fake things so that arena is false for all 16 types.. */
1302 new_body = new_NOARENAZ(new_type_details);
1303#endif
1304 SvANY(sv) = new_body;
1305 if (new_type == SVt_PVAV) {
1306 AvMAX(sv) = -1;
1307 AvFILLp(sv) = -1;
1308 AvREAL_only(sv);
64484faa 1309 if (old_type_details->body_size) {
ac572bf4
NC
1310 AvALLOC(sv) = 0;
1311 } else {
1312 /* It will have been zeroed when the new body was allocated.
1313 Lets not write to it, in case it confuses a write-back
1314 cache. */
1315 }
78ac7dd9
NC
1316 } else {
1317 assert(!SvOK(sv));
1318 SvOK_off(sv);
1319#ifndef NODEFAULT_SHAREKEYS
1320 HvSHAREKEYS_on(sv); /* key-sharing on by default */
1321#endif
1322 HvMAX(sv) = 7; /* (start with 8 buckets) */
c1ae03ae 1323 }
aeb18a1e 1324
bd81e77b
NC
1325 /* SVt_NULL isn't the only thing upgraded to AV or HV.
1326 The target created by newSVrv also is, and it can have magic.
1327 However, it never has SvPVX set.
1328 */
4df7f6af
NC
1329 if (old_type == SVt_IV) {
1330 assert(!SvROK(sv));
1331 } else if (old_type >= SVt_PV) {
bd81e77b
NC
1332 assert(SvPVX_const(sv) == 0);
1333 }
aeb18a1e 1334
bd81e77b 1335 if (old_type >= SVt_PVMG) {
e736a858 1336 SvMAGIC_set(sv, ((XPVMG*)old_body)->xmg_u.xmg_magic);
bd81e77b 1337 SvSTASH_set(sv, ((XPVMG*)old_body)->xmg_stash);
797c7171
NC
1338 } else {
1339 sv->sv_u.svu_array = NULL; /* or svu_hash */
bd81e77b
NC
1340 }
1341 break;
93e68bfb 1342
93e68bfb 1343
b9ad13ac
NC
1344 case SVt_REGEXP:
1345 /* This ensures that SvTHINKFIRST(sv) is true, and hence that
1346 sv_force_normal_flags(sv) is called. */
1347 SvFAKE_on(sv);
bd81e77b
NC
1348 case SVt_PVIV:
1349 /* XXX Is this still needed? Was it ever needed? Surely as there is
1350 no route from NV to PVIV, NOK can never be true */
1351 assert(!SvNOKp(sv));
1352 assert(!SvNOK(sv));
1353 case SVt_PVIO:
1354 case SVt_PVFM:
bd81e77b
NC
1355 case SVt_PVGV:
1356 case SVt_PVCV:
1357 case SVt_PVLV:
1358 case SVt_PVMG:
1359 case SVt_PVNV:
1360 case SVt_PV:
93e68bfb 1361
d2a0f284 1362 assert(new_type_details->body_size);
bd81e77b
NC
1363 /* We always allocated the full length item with PURIFY. To do this
1364 we fake things so that arena is false for all 16 types.. */
1365 if(new_type_details->arena) {
1366 /* This points to the start of the allocated area. */
d2a0f284
JC
1367 new_body_inline(new_body, new_type);
1368 Zero(new_body, new_type_details->body_size, char);
bd81e77b
NC
1369 new_body = ((char *)new_body) - new_type_details->offset;
1370 } else {
1371 new_body = new_NOARENAZ(new_type_details);
1372 }
1373 SvANY(sv) = new_body;
5e2fc214 1374
bd81e77b 1375 if (old_type_details->copy) {
f9ba3d20
NC
1376 /* There is now the potential for an upgrade from something without
1377 an offset (PVNV or PVMG) to something with one (PVCV, PVFM) */
1378 int offset = old_type_details->offset;
1379 int length = old_type_details->copy;
1380
1381 if (new_type_details->offset > old_type_details->offset) {
d4c19fe8 1382 const int difference
f9ba3d20
NC
1383 = new_type_details->offset - old_type_details->offset;
1384 offset += difference;
1385 length -= difference;
1386 }
1387 assert (length >= 0);
1388
1389 Copy((char *)old_body + offset, (char *)new_body + offset, length,
1390 char);
bd81e77b
NC
1391 }
1392
1393#ifndef NV_ZERO_IS_ALLBITS_ZERO
f2524eef 1394 /* If NV 0.0 is stores as all bits 0 then Zero() already creates a
e5ce394c
NC
1395 * correct 0.0 for us. Otherwise, if the old body didn't have an
1396 * NV slot, but the new one does, then we need to initialise the
1397 * freshly created NV slot with whatever the correct bit pattern is
1398 * for 0.0 */
e22a937e
NC
1399 if (old_type_details->zero_nv && !new_type_details->zero_nv
1400 && !isGV_with_GP(sv))
bd81e77b 1401 SvNV_set(sv, 0);
82048762 1402#endif
5e2fc214 1403
85dca89a
NC
1404 if (new_type == SVt_PVIO) {
1405 IO * const io = MUTABLE_IO(sv);
d963bf01 1406 GV *iogv = gv_fetchpvs("IO::File::", GV_ADD, SVt_PVHV);
85dca89a
NC
1407
1408 SvOBJECT_on(io);
1409 /* Clear the stashcache because a new IO could overrule a package
1410 name */
1411 hv_clear(PL_stashcache);
1412
85dca89a 1413 SvSTASH_set(io, MUTABLE_HV(SvREFCNT_inc(GvHV(iogv))));
f2524eef 1414 IoPAGE_LEN(sv) = 60;
85dca89a 1415 }
4df7f6af
NC
1416 if (old_type < SVt_PV) {
1417 /* referant will be NULL unless the old type was SVt_IV emulating
1418 SVt_RV */
1419 sv->sv_u.svu_rv = referant;
1420 }
bd81e77b
NC
1421 break;
1422 default:
afd78fd5
JH
1423 Perl_croak(aTHX_ "panic: sv_upgrade to unknown type %lu",
1424 (unsigned long)new_type);
bd81e77b 1425 }
73171d91 1426
db93c0c4 1427 if (old_type > SVt_IV) {
bd81e77b 1428#ifdef PURIFY
beeec492 1429 safefree(old_body);
bd81e77b 1430#else
bc786448
GG
1431 /* Note that there is an assumption that all bodies of types that
1432 can be upgraded came from arenas. Only the more complex non-
1433 upgradable types are allowed to be directly malloc()ed. */
1434 assert(old_type_details->arena);
bd81e77b
NC
1435 del_body((void*)((char*)old_body + old_type_details->offset),
1436 &PL_body_roots[old_type]);
1437#endif
1438 }
1439}
73171d91 1440
bd81e77b
NC
1441/*
1442=for apidoc sv_backoff
73171d91 1443
bd81e77b
NC
1444Remove any string offset. You should normally use the C<SvOOK_off> macro
1445wrapper instead.
73171d91 1446
bd81e77b 1447=cut
73171d91
NC
1448*/
1449
bd81e77b 1450int
aad570aa 1451Perl_sv_backoff(pTHX_ register SV *const sv)
bd81e77b 1452{
69240efd 1453 STRLEN delta;
7a4bba22 1454 const char * const s = SvPVX_const(sv);
7918f24d
NC
1455
1456 PERL_ARGS_ASSERT_SV_BACKOFF;
96a5add6 1457 PERL_UNUSED_CONTEXT;
7918f24d 1458
bd81e77b
NC
1459 assert(SvOOK(sv));
1460 assert(SvTYPE(sv) != SVt_PVHV);
1461 assert(SvTYPE(sv) != SVt_PVAV);
7a4bba22 1462
69240efd
NC
1463 SvOOK_offset(sv, delta);
1464
7a4bba22
NC
1465 SvLEN_set(sv, SvLEN(sv) + delta);
1466 SvPV_set(sv, SvPVX(sv) - delta);
1467 Move(s, SvPVX(sv), SvCUR(sv)+1, char);
bd81e77b
NC
1468 SvFLAGS(sv) &= ~SVf_OOK;
1469 return 0;
1470}
73171d91 1471
bd81e77b
NC
1472/*
1473=for apidoc sv_grow
73171d91 1474
bd81e77b
NC
1475Expands the character buffer in the SV. If necessary, uses C<sv_unref> and
1476upgrades the SV to C<SVt_PV>. Returns a pointer to the character buffer.
1477Use the C<SvGROW> wrapper instead.
93e68bfb 1478
bd81e77b
NC
1479=cut
1480*/
93e68bfb 1481
bd81e77b 1482char *
aad570aa 1483Perl_sv_grow(pTHX_ register SV *const sv, register STRLEN newlen)
bd81e77b
NC
1484{
1485 register char *s;
93e68bfb 1486
7918f24d
NC
1487 PERL_ARGS_ASSERT_SV_GROW;
1488
5db06880
NC
1489 if (PL_madskills && newlen >= 0x100000) {
1490 PerlIO_printf(Perl_debug_log,
1491 "Allocation too large: %"UVxf"\n", (UV)newlen);
1492 }
bd81e77b
NC
1493#ifdef HAS_64K_LIMIT
1494 if (newlen >= 0x10000) {
1495 PerlIO_printf(Perl_debug_log,
1496 "Allocation too large: %"UVxf"\n", (UV)newlen);
1497 my_exit(1);
1498 }
1499#endif /* HAS_64K_LIMIT */
1500 if (SvROK(sv))
1501 sv_unref(sv);
1502 if (SvTYPE(sv) < SVt_PV) {
1503 sv_upgrade(sv, SVt_PV);
1504 s = SvPVX_mutable(sv);
1505 }
1506 else if (SvOOK(sv)) { /* pv is offset? */
1507 sv_backoff(sv);
1508 s = SvPVX_mutable(sv);
1509 if (newlen > SvLEN(sv))
1510 newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
1511#ifdef HAS_64K_LIMIT
1512 if (newlen >= 0x10000)
1513 newlen = 0xFFFF;
1514#endif
1515 }
1516 else
1517 s = SvPVX_mutable(sv);
aeb18a1e 1518
bd81e77b 1519 if (newlen > SvLEN(sv)) { /* need more room? */
f1200559
WH
1520 STRLEN minlen = SvCUR(sv);
1521 minlen += (minlen >> PERL_STRLEN_EXPAND_SHIFT) + 10;
1522 if (newlen < minlen)
1523 newlen = minlen;
aedff202 1524#ifndef Perl_safesysmalloc_size
bd81e77b 1525 newlen = PERL_STRLEN_ROUNDUP(newlen);
bd81e77b 1526#endif
98653f18 1527 if (SvLEN(sv) && s) {
10edeb5d 1528 s = (char*)saferealloc(s, newlen);
bd81e77b
NC
1529 }
1530 else {
10edeb5d 1531 s = (char*)safemalloc(newlen);
bd81e77b
NC
1532 if (SvPVX_const(sv) && SvCUR(sv)) {
1533 Move(SvPVX_const(sv), s, (newlen < SvCUR(sv)) ? newlen : SvCUR(sv), char);
1534 }
1535 }
1536 SvPV_set(sv, s);
ca7c1a29 1537#ifdef Perl_safesysmalloc_size
98653f18
NC
1538 /* Do this here, do it once, do it right, and then we will never get
1539 called back into sv_grow() unless there really is some growing
1540 needed. */
ca7c1a29 1541 SvLEN_set(sv, Perl_safesysmalloc_size(s));
98653f18 1542#else
bd81e77b 1543 SvLEN_set(sv, newlen);
98653f18 1544#endif
bd81e77b
NC
1545 }
1546 return s;
1547}
aeb18a1e 1548
bd81e77b
NC
1549/*
1550=for apidoc sv_setiv
932e9ff9 1551
bd81e77b
NC
1552Copies an integer into the given SV, upgrading first if necessary.
1553Does not handle 'set' magic. See also C<sv_setiv_mg>.
463ee0b2 1554
bd81e77b
NC
1555=cut
1556*/
463ee0b2 1557
bd81e77b 1558void
aad570aa 1559Perl_sv_setiv(pTHX_ register SV *const sv, const IV i)
bd81e77b 1560{
97aff369 1561 dVAR;
7918f24d
NC
1562
1563 PERL_ARGS_ASSERT_SV_SETIV;
1564
bd81e77b
NC
1565 SV_CHECK_THINKFIRST_COW_DROP(sv);
1566 switch (SvTYPE(sv)) {
1567 case SVt_NULL:
bd81e77b 1568 case SVt_NV:
3376de98 1569 sv_upgrade(sv, SVt_IV);
bd81e77b 1570 break;
bd81e77b
NC
1571 case SVt_PV:
1572 sv_upgrade(sv, SVt_PVIV);
1573 break;
463ee0b2 1574
bd81e77b 1575 case SVt_PVGV:
6e592b3a
BM
1576 if (!isGV_with_GP(sv))
1577 break;
bd81e77b
NC
1578 case SVt_PVAV:
1579 case SVt_PVHV:
1580 case SVt_PVCV:
1581 case SVt_PVFM:
1582 case SVt_PVIO:
22e74366 1583 /* diag_listed_as: Can't coerce %s to %s in %s */
bd81e77b
NC
1584 Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
1585 OP_DESC(PL_op));
42d0e0b7 1586 default: NOOP;
bd81e77b
NC
1587 }
1588 (void)SvIOK_only(sv); /* validate number */
1589 SvIV_set(sv, i);
1590 SvTAINT(sv);
1591}
932e9ff9 1592
bd81e77b
NC
1593/*
1594=for apidoc sv_setiv_mg
d33b2eba 1595
bd81e77b 1596Like C<sv_setiv>, but also handles 'set' magic.
1c846c1f 1597
bd81e77b
NC
1598=cut
1599*/
d33b2eba 1600
bd81e77b 1601void
aad570aa 1602Perl_sv_setiv_mg(pTHX_ register SV *const sv, const IV i)
bd81e77b 1603{
7918f24d
NC
1604 PERL_ARGS_ASSERT_SV_SETIV_MG;
1605
bd81e77b
NC
1606 sv_setiv(sv,i);
1607 SvSETMAGIC(sv);
1608}
727879eb 1609
bd81e77b
NC
1610/*
1611=for apidoc sv_setuv
d33b2eba 1612
bd81e77b
NC
1613Copies an unsigned integer into the given SV, upgrading first if necessary.
1614Does not handle 'set' magic. See also C<sv_setuv_mg>.
9b94d1dd 1615
bd81e77b
NC
1616=cut
1617*/
d33b2eba 1618
bd81e77b 1619void
aad570aa 1620Perl_sv_setuv(pTHX_ register SV *const sv, const UV u)
bd81e77b 1621{
7918f24d
NC
1622 PERL_ARGS_ASSERT_SV_SETUV;
1623
bd81e77b
NC
1624 /* With these two if statements:
1625 u=1.49 s=0.52 cu=72.49 cs=10.64 scripts=270 tests=20865
d33b2eba 1626
bd81e77b
NC
1627 without
1628 u=1.35 s=0.47 cu=73.45 cs=11.43 scripts=270 tests=20865
1c846c1f 1629
bd81e77b
NC
1630 If you wish to remove them, please benchmark to see what the effect is
1631 */
1632 if (u <= (UV)IV_MAX) {
1633 sv_setiv(sv, (IV)u);
1634 return;
1635 }
1636 sv_setiv(sv, 0);
1637 SvIsUV_on(sv);
1638 SvUV_set(sv, u);
1639}
d33b2eba 1640
bd81e77b
NC
1641/*
1642=for apidoc sv_setuv_mg
727879eb 1643
bd81e77b 1644Like C<sv_setuv>, but also handles 'set' magic.
9b94d1dd 1645
bd81e77b
NC
1646=cut
1647*/
5e2fc214 1648
bd81e77b 1649void
aad570aa 1650Perl_sv_setuv_mg(pTHX_ register SV *const sv, const UV u)
bd81e77b 1651{
7918f24d
NC
1652 PERL_ARGS_ASSERT_SV_SETUV_MG;
1653
bd81e77b
NC
1654 sv_setuv(sv,u);
1655 SvSETMAGIC(sv);
1656}
5e2fc214 1657
954c1994 1658/*
bd81e77b 1659=for apidoc sv_setnv
954c1994 1660
bd81e77b
NC
1661Copies a double into the given SV, upgrading first if necessary.
1662Does not handle 'set' magic. See also C<sv_setnv_mg>.
954c1994
GS
1663
1664=cut
1665*/
1666
63f97190 1667void
aad570aa 1668Perl_sv_setnv(pTHX_ register SV *const sv, const NV num)
79072805 1669{
97aff369 1670 dVAR;
7918f24d
NC
1671
1672 PERL_ARGS_ASSERT_SV_SETNV;
1673
bd81e77b
NC
1674 SV_CHECK_THINKFIRST_COW_DROP(sv);
1675 switch (SvTYPE(sv)) {
79072805 1676 case SVt_NULL:
79072805 1677 case SVt_IV:
bd81e77b 1678 sv_upgrade(sv, SVt_NV);
79072805
LW
1679 break;
1680 case SVt_PV:
79072805 1681 case SVt_PVIV:
bd81e77b 1682 sv_upgrade(sv, SVt_PVNV);
79072805 1683 break;
bd4b1eb5 1684
bd4b1eb5 1685 case SVt_PVGV:
6e592b3a
BM
1686 if (!isGV_with_GP(sv))
1687 break;
bd81e77b
NC
1688 case SVt_PVAV:
1689 case SVt_PVHV:
79072805 1690 case SVt_PVCV:
bd81e77b
NC
1691 case SVt_PVFM:
1692 case SVt_PVIO:
22e74366 1693 /* diag_listed_as: Can't coerce %s to %s in %s */
bd81e77b 1694 Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
94bbb3f4 1695 OP_DESC(PL_op));
42d0e0b7 1696 default: NOOP;
2068cd4d 1697 }
bd81e77b
NC
1698 SvNV_set(sv, num);
1699 (void)SvNOK_only(sv); /* validate number */
1700 SvTAINT(sv);
79072805
LW
1701}
1702
645c22ef 1703/*
bd81e77b 1704=for apidoc sv_setnv_mg
645c22ef 1705
bd81e77b 1706Like C<sv_setnv>, but also handles 'set' magic.
645c22ef
DM
1707
1708=cut
1709*/
1710
bd81e77b 1711void
aad570aa 1712Perl_sv_setnv_mg(pTHX_ register SV *const sv, const NV num)
79072805 1713{
7918f24d
NC
1714 PERL_ARGS_ASSERT_SV_SETNV_MG;
1715
bd81e77b
NC
1716 sv_setnv(sv,num);
1717 SvSETMAGIC(sv);
79072805
LW
1718}
1719
bd81e77b
NC
1720/* Print an "isn't numeric" warning, using a cleaned-up,
1721 * printable version of the offending string
1722 */
954c1994 1723
bd81e77b 1724STATIC void
aad570aa 1725S_not_a_number(pTHX_ SV *const sv)
79072805 1726{
97aff369 1727 dVAR;
bd81e77b
NC
1728 SV *dsv;
1729 char tmpbuf[64];
1730 const char *pv;
94463019 1731
7918f24d
NC
1732 PERL_ARGS_ASSERT_NOT_A_NUMBER;
1733
94463019 1734 if (DO_UTF8(sv)) {
84bafc02 1735 dsv = newSVpvs_flags("", SVs_TEMP);
94463019
JH
1736 pv = sv_uni_display(dsv, sv, 10, 0);
1737 } else {
1738 char *d = tmpbuf;
551405c4 1739 const char * const limit = tmpbuf + sizeof(tmpbuf) - 8;
94463019
JH
1740 /* each *s can expand to 4 chars + "...\0",
1741 i.e. need room for 8 chars */
ecdeb87c 1742
00b6aa41
AL
1743 const char *s = SvPVX_const(sv);
1744 const char * const end = s + SvCUR(sv);
1745 for ( ; s < end && d < limit; s++ ) {
94463019
JH
1746 int ch = *s & 0xFF;
1747 if (ch & 128 && !isPRINT_LC(ch)) {
1748 *d++ = 'M';
1749 *d++ = '-';
1750 ch &= 127;
1751 }
1752 if (ch == '\n') {
1753 *d++ = '\\';
1754 *d++ = 'n';
1755 }
1756 else if (ch == '\r') {
1757 *d++ = '\\';
1758 *d++ = 'r';
1759 }
1760 else if (ch == '\f') {
1761 *d++ = '\\';
1762 *d++ = 'f';
1763 }
1764 else if (ch == '\\') {
1765 *d++ = '\\';
1766 *d++ = '\\';
1767 }
1768 else if (ch == '\0') {
1769 *d++ = '\\';
1770 *d++ = '0';
1771 }
1772 else if (isPRINT_LC(ch))
1773 *d++ = ch;
1774 else {
1775 *d++ = '^';
1776 *d++ = toCTRL(ch);
1777 }
1778 }
1779 if (s < end) {
1780 *d++ = '.';
1781 *d++ = '.';
1782 *d++ = '.';
1783 }
1784 *d = '\0';
1785 pv = tmpbuf;
a0d0e21e 1786 }
a0d0e21e 1787
533c011a 1788 if (PL_op)
9014280d 1789 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019
JH
1790 "Argument \"%s\" isn't numeric in %s", pv,
1791 OP_DESC(PL_op));
a0d0e21e 1792 else
9014280d 1793 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019 1794 "Argument \"%s\" isn't numeric", pv);
a0d0e21e
LW
1795}
1796
c2988b20
NC
1797/*
1798=for apidoc looks_like_number
1799
645c22ef
DM
1800Test if the content of an SV looks like a number (or is a number).
1801C<Inf> and C<Infinity> are treated as numbers (so will not issue a
1802non-numeric warning), even if your atof() doesn't grok them.
c2988b20
NC
1803
1804=cut
1805*/
1806
1807I32
aad570aa 1808Perl_looks_like_number(pTHX_ SV *const sv)
c2988b20 1809{
a3b680e6 1810 register const char *sbegin;
c2988b20
NC
1811 STRLEN len;
1812
7918f24d
NC
1813 PERL_ARGS_ASSERT_LOOKS_LIKE_NUMBER;
1814
c2988b20 1815 if (SvPOK(sv)) {
3f7c398e 1816 sbegin = SvPVX_const(sv);
c2988b20
NC
1817 len = SvCUR(sv);
1818 }
1819 else if (SvPOKp(sv))
83003860 1820 sbegin = SvPV_const(sv, len);
c2988b20 1821 else
e0ab1c0e 1822 return SvFLAGS(sv) & (SVf_NOK|SVp_NOK|SVf_IOK|SVp_IOK);
c2988b20
NC
1823 return grok_number(sbegin, len, NULL);
1824}
25da4f38 1825
19f6321d
NC
1826STATIC bool
1827S_glob_2number(pTHX_ GV * const gv)
180488f8
NC
1828{
1829 const U32 wasfake = SvFLAGS(gv) & SVf_FAKE;
1830 SV *const buffer = sv_newmortal();
1831
7918f24d
NC
1832 PERL_ARGS_ASSERT_GLOB_2NUMBER;
1833
180488f8
NC
1834 /* FAKE globs can get coerced, so need to turn this off temporarily if it
1835 is on. */
1836 SvFAKE_off(gv);
1837 gv_efullname3(buffer, gv, "*");
1838 SvFLAGS(gv) |= wasfake;
1839
675c862f
AL
1840 /* We know that all GVs stringify to something that is not-a-number,
1841 so no need to test that. */
1842 if (ckWARN(WARN_NUMERIC))
1843 not_a_number(buffer);
1844 /* We just want something true to return, so that S_sv_2iuv_common
1845 can tail call us and return true. */
19f6321d 1846 return TRUE;
675c862f
AL
1847}
1848
25da4f38
IZ
1849/* Actually, ISO C leaves conversion of UV to IV undefined, but
1850 until proven guilty, assume that things are not that bad... */
1851
645c22ef
DM
1852/*
1853 NV_PRESERVES_UV:
1854
1855 As 64 bit platforms often have an NV that doesn't preserve all bits of
28e5dec8
JH
1856 an IV (an assumption perl has been based on to date) it becomes necessary
1857 to remove the assumption that the NV always carries enough precision to
1858 recreate the IV whenever needed, and that the NV is the canonical form.
1859 Instead, IV/UV and NV need to be given equal rights. So as to not lose
645c22ef 1860 precision as a side effect of conversion (which would lead to insanity
28e5dec8
JH
1861 and the dragon(s) in t/op/numconvert.t getting very angry) the intent is
1862 1) to distinguish between IV/UV/NV slots that have cached a valid
1863 conversion where precision was lost and IV/UV/NV slots that have a
1864 valid conversion which has lost no precision
645c22ef 1865 2) to ensure that if a numeric conversion to one form is requested that
28e5dec8
JH
1866 would lose precision, the precise conversion (or differently
1867 imprecise conversion) is also performed and cached, to prevent
1868 requests for different numeric formats on the same SV causing
1869 lossy conversion chains. (lossless conversion chains are perfectly
1870 acceptable (still))
1871
1872
1873 flags are used:
1874 SvIOKp is true if the IV slot contains a valid value
1875 SvIOK is true only if the IV value is accurate (UV if SvIOK_UV true)
1876 SvNOKp is true if the NV slot contains a valid value
1877 SvNOK is true only if the NV value is accurate
1878
1879 so
645c22ef 1880 while converting from PV to NV, check to see if converting that NV to an
28e5dec8
JH
1881 IV(or UV) would lose accuracy over a direct conversion from PV to
1882 IV(or UV). If it would, cache both conversions, return NV, but mark
1883 SV as IOK NOKp (ie not NOK).
1884
645c22ef 1885 While converting from PV to IV, check to see if converting that IV to an
28e5dec8
JH
1886 NV would lose accuracy over a direct conversion from PV to NV. If it
1887 would, cache both conversions, flag similarly.
1888
1889 Before, the SV value "3.2" could become NV=3.2 IV=3 NOK, IOK quite
1890 correctly because if IV & NV were set NV *always* overruled.
645c22ef
DM
1891 Now, "3.2" will become NV=3.2 IV=3 NOK, IOKp, because the flag's meaning
1892 changes - now IV and NV together means that the two are interchangeable:
28e5dec8 1893 SvIVX == (IV) SvNVX && SvNVX == (NV) SvIVX;
d460ef45 1894
645c22ef
DM
1895 The benefit of this is that operations such as pp_add know that if
1896 SvIOK is true for both left and right operands, then integer addition
1897 can be used instead of floating point (for cases where the result won't
1898 overflow). Before, floating point was always used, which could lead to
28e5dec8
JH
1899 loss of precision compared with integer addition.
1900
1901 * making IV and NV equal status should make maths accurate on 64 bit
1902 platforms
1903 * may speed up maths somewhat if pp_add and friends start to use
645c22ef 1904 integers when possible instead of fp. (Hopefully the overhead in
28e5dec8
JH
1905 looking for SvIOK and checking for overflow will not outweigh the
1906 fp to integer speedup)
1907 * will slow down integer operations (callers of SvIV) on "inaccurate"
1908 values, as the change from SvIOK to SvIOKp will cause a call into
1909 sv_2iv each time rather than a macro access direct to the IV slot
1910 * should speed up number->string conversion on integers as IV is
645c22ef 1911 favoured when IV and NV are equally accurate
28e5dec8
JH
1912
1913 ####################################################################
645c22ef
DM
1914 You had better be using SvIOK_notUV if you want an IV for arithmetic:
1915 SvIOK is true if (IV or UV), so you might be getting (IV)SvUV.
1916 On the other hand, SvUOK is true iff UV.
28e5dec8
JH
1917 ####################################################################
1918
645c22ef 1919 Your mileage will vary depending your CPU's relative fp to integer
28e5dec8
JH
1920 performance ratio.
1921*/
1922
1923#ifndef NV_PRESERVES_UV
645c22ef
DM
1924# define IS_NUMBER_UNDERFLOW_IV 1
1925# define IS_NUMBER_UNDERFLOW_UV 2
1926# define IS_NUMBER_IV_AND_UV 2
1927# define IS_NUMBER_OVERFLOW_IV 4
1928# define IS_NUMBER_OVERFLOW_UV 5
1929
1930/* sv_2iuv_non_preserve(): private routine for use by sv_2iv() and sv_2uv() */
28e5dec8
JH
1931
1932/* For sv_2nv these three cases are "SvNOK and don't bother casting" */
1933STATIC int
5de3775c 1934S_sv_2iuv_non_preserve(pTHX_ register SV *const sv
47031da6
NC
1935# ifdef DEBUGGING
1936 , I32 numtype
1937# endif
1938 )
28e5dec8 1939{
97aff369 1940 dVAR;
7918f24d
NC
1941
1942 PERL_ARGS_ASSERT_SV_2IUV_NON_PRESERVE;
1943
3f7c398e 1944 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));
28e5dec8
JH
1945 if (SvNVX(sv) < (NV)IV_MIN) {
1946 (void)SvIOKp_on(sv);
1947 (void)SvNOK_on(sv);
45977657 1948 SvIV_set(sv, IV_MIN);
28e5dec8
JH
1949 return IS_NUMBER_UNDERFLOW_IV;
1950 }
1951 if (SvNVX(sv) > (NV)UV_MAX) {
1952 (void)SvIOKp_on(sv);
1953 (void)SvNOK_on(sv);
1954 SvIsUV_on(sv);
607fa7f2 1955 SvUV_set(sv, UV_MAX);
28e5dec8
JH
1956 return IS_NUMBER_OVERFLOW_UV;
1957 }
c2988b20
NC
1958 (void)SvIOKp_on(sv);
1959 (void)SvNOK_on(sv);
1960 /* Can't use strtol etc to convert this string. (See truth table in
1961 sv_2iv */
1962 if (SvNVX(sv) <= (UV)IV_MAX) {
45977657 1963 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
1964 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
1965 SvIOK_on(sv); /* Integer is precise. NOK, IOK */
1966 } else {
1967 /* Integer is imprecise. NOK, IOKp */
1968 }
1969 return SvNVX(sv) < 0 ? IS_NUMBER_UNDERFLOW_UV : IS_NUMBER_IV_AND_UV;
1970 }
1971 SvIsUV_on(sv);
607fa7f2 1972 SvUV_set(sv, U_V(SvNVX(sv)));
c2988b20
NC
1973 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
1974 if (SvUVX(sv) == UV_MAX) {
1975 /* As we know that NVs don't preserve UVs, UV_MAX cannot
1976 possibly be preserved by NV. Hence, it must be overflow.
1977 NOK, IOKp */
1978 return IS_NUMBER_OVERFLOW_UV;
1979 }
1980 SvIOK_on(sv); /* Integer is precise. NOK, UOK */
1981 } else {
1982 /* Integer is imprecise. NOK, IOKp */
28e5dec8 1983 }
c2988b20 1984 return IS_NUMBER_OVERFLOW_IV;
28e5dec8 1985}
645c22ef
DM
1986#endif /* !NV_PRESERVES_UV*/
1987
af359546 1988STATIC bool
7918f24d
NC
1989S_sv_2iuv_common(pTHX_ SV *const sv)
1990{
97aff369 1991 dVAR;
7918f24d
NC
1992
1993 PERL_ARGS_ASSERT_SV_2IUV_COMMON;
1994
af359546 1995 if (SvNOKp(sv)) {
28e5dec8
JH
1996 /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
1997 * without also getting a cached IV/UV from it at the same time
1998 * (ie PV->NV conversion should detect loss of accuracy and cache
af359546
NC
1999 * IV or UV at same time to avoid this. */
2000 /* IV-over-UV optimisation - choose to cache IV if possible */
25da4f38
IZ
2001
2002 if (SvTYPE(sv) == SVt_NV)
2003 sv_upgrade(sv, SVt_PVNV);
2004
28e5dec8
JH
2005 (void)SvIOKp_on(sv); /* Must do this first, to clear any SvOOK */
2006 /* < not <= as for NV doesn't preserve UV, ((NV)IV_MAX+1) will almost
2007 certainly cast into the IV range at IV_MAX, whereas the correct
2008 answer is the UV IV_MAX +1. Hence < ensures that dodgy boundary
2009 cases go to UV */
cab190d4
JD
2010#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2011 if (Perl_isnan(SvNVX(sv))) {
2012 SvUV_set(sv, 0);
2013 SvIsUV_on(sv);
fdbe6d7c 2014 return FALSE;
cab190d4 2015 }
cab190d4 2016#endif
28e5dec8 2017 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
45977657 2018 SvIV_set(sv, I_V(SvNVX(sv)));
28e5dec8
JH
2019 if (SvNVX(sv) == (NV) SvIVX(sv)
2020#ifndef NV_PRESERVES_UV
2021 && (((UV)1 << NV_PRESERVES_UV_BITS) >
2022 (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
2023 /* Don't flag it as "accurately an integer" if the number
2024 came from a (by definition imprecise) NV operation, and
2025 we're outside the range of NV integer precision */
2026#endif
2027 ) {
a43d94f2
NC
2028 if (SvNOK(sv))
2029 SvIOK_on(sv); /* Can this go wrong with rounding? NWC */
2030 else {
2031 /* scalar has trailing garbage, eg "42a" */
2032 }
28e5dec8 2033 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2034 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (precise)\n",
28e5dec8
JH
2035 PTR2UV(sv),
2036 SvNVX(sv),
2037 SvIVX(sv)));
2038
2039 } else {
2040 /* IV not precise. No need to convert from PV, as NV
2041 conversion would already have cached IV if it detected
2042 that PV->IV would be better than PV->NV->IV
2043 flags already correct - don't set public IOK. */
2044 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2045 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (imprecise)\n",
28e5dec8
JH
2046 PTR2UV(sv),
2047 SvNVX(sv),
2048 SvIVX(sv)));
2049 }
2050 /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
2051 but the cast (NV)IV_MIN rounds to a the value less (more
2052 negative) than IV_MIN which happens to be equal to SvNVX ??
2053 Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
2054 NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
2055 (NV)UVX == NVX are both true, but the values differ. :-(
2056 Hopefully for 2s complement IV_MIN is something like
2057 0x8000000000000000 which will be exact. NWC */
d460ef45 2058 }
25da4f38 2059 else {
607fa7f2 2060 SvUV_set(sv, U_V(SvNVX(sv)));
28e5dec8
JH
2061 if (
2062 (SvNVX(sv) == (NV) SvUVX(sv))
2063#ifndef NV_PRESERVES_UV
2064 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
2065 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
2066 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
2067 /* Don't flag it as "accurately an integer" if the number
2068 came from a (by definition imprecise) NV operation, and
2069 we're outside the range of NV integer precision */
2070#endif
a43d94f2 2071 && SvNOK(sv)
28e5dec8
JH
2072 )
2073 SvIOK_on(sv);
25da4f38 2074 SvIsUV_on(sv);
1c846c1f 2075 DEBUG_c(PerlIO_printf(Perl_debug_log,
57def98f 2076 "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
56431972 2077 PTR2UV(sv),
57def98f
JH
2078 SvUVX(sv),
2079 SvUVX(sv)));
25da4f38 2080 }
748a9306
LW
2081 }
2082 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 2083 UV value;
504618e9 2084 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
af359546 2085 /* We want to avoid a possible problem when we cache an IV/ a UV which
25da4f38 2086 may be later translated to an NV, and the resulting NV is not
c2988b20
NC
2087 the same as the direct translation of the initial string
2088 (eg 123.456 can shortcut to the IV 123 with atol(), but we must
2089 be careful to ensure that the value with the .456 is around if the
2090 NV value is requested in the future).
1c846c1f 2091
af359546 2092 This means that if we cache such an IV/a UV, we need to cache the
25da4f38 2093 NV as well. Moreover, we trade speed for space, and do not
28e5dec8 2094 cache the NV if we are sure it's not needed.
25da4f38 2095 */
16b7a9a4 2096
c2988b20
NC
2097 /* SVt_PVNV is one higher than SVt_PVIV, hence this order */
2098 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2099 == IS_NUMBER_IN_UV) {
5e045b90 2100 /* It's definitely an integer, only upgrade to PVIV */
28e5dec8
JH
2101 if (SvTYPE(sv) < SVt_PVIV)
2102 sv_upgrade(sv, SVt_PVIV);
f7bbb42a 2103 (void)SvIOK_on(sv);
c2988b20
NC
2104 } else if (SvTYPE(sv) < SVt_PVNV)
2105 sv_upgrade(sv, SVt_PVNV);
28e5dec8 2106
f2524eef 2107 /* If NVs preserve UVs then we only use the UV value if we know that
c2988b20
NC
2108 we aren't going to call atof() below. If NVs don't preserve UVs
2109 then the value returned may have more precision than atof() will
2110 return, even though value isn't perfectly accurate. */
2111 if ((numtype & (IS_NUMBER_IN_UV
2112#ifdef NV_PRESERVES_UV
2113 | IS_NUMBER_NOT_INT
2114#endif
2115 )) == IS_NUMBER_IN_UV) {
2116 /* This won't turn off the public IOK flag if it was set above */
2117 (void)SvIOKp_on(sv);
2118
2119 if (!(numtype & IS_NUMBER_NEG)) {
2120 /* positive */;
2121 if (value <= (UV)IV_MAX) {
45977657 2122 SvIV_set(sv, (IV)value);
c2988b20 2123 } else {
af359546 2124 /* it didn't overflow, and it was positive. */
607fa7f2 2125 SvUV_set(sv, value);
c2988b20
NC
2126 SvIsUV_on(sv);
2127 }
2128 } else {
2129 /* 2s complement assumption */
2130 if (value <= (UV)IV_MIN) {
45977657 2131 SvIV_set(sv, -(IV)value);
c2988b20
NC
2132 } else {
2133 /* Too negative for an IV. This is a double upgrade, but
d1be9408 2134 I'm assuming it will be rare. */
c2988b20
NC
2135 if (SvTYPE(sv) < SVt_PVNV)
2136 sv_upgrade(sv, SVt_PVNV);
2137 SvNOK_on(sv);
2138 SvIOK_off(sv);
2139 SvIOKp_on(sv);
9d6ce603 2140 SvNV_set(sv, -(NV)value);
45977657 2141 SvIV_set(sv, IV_MIN);
c2988b20
NC
2142 }
2143 }
2144 }
2145 /* For !NV_PRESERVES_UV and IS_NUMBER_IN_UV and IS_NUMBER_NOT_INT we
2146 will be in the previous block to set the IV slot, and the next
2147 block to set the NV slot. So no else here. */
2148
2149 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2150 != IS_NUMBER_IN_UV) {
2151 /* It wasn't an (integer that doesn't overflow the UV). */
3f7c398e 2152 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8 2153
c2988b20
NC
2154 if (! numtype && ckWARN(WARN_NUMERIC))
2155 not_a_number(sv);
28e5dec8 2156
65202027 2157#if defined(USE_LONG_DOUBLE)
c2988b20
NC
2158 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%" PERL_PRIgldbl ")\n",
2159 PTR2UV(sv), SvNVX(sv)));
65202027 2160#else
1779d84d 2161 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"NVgf")\n",
c2988b20 2162 PTR2UV(sv), SvNVX(sv)));
65202027 2163#endif
28e5dec8 2164
28e5dec8 2165#ifdef NV_PRESERVES_UV
af359546
NC
2166 (void)SvIOKp_on(sv);
2167 (void)SvNOK_on(sv);
2168 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2169 SvIV_set(sv, I_V(SvNVX(sv)));
2170 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2171 SvIOK_on(sv);
2172 } else {
6f207bd3 2173 NOOP; /* Integer is imprecise. NOK, IOKp */
af359546
NC
2174 }
2175 /* UV will not work better than IV */
2176 } else {
2177 if (SvNVX(sv) > (NV)UV_MAX) {
2178 SvIsUV_on(sv);
2179 /* Integer is inaccurate. NOK, IOKp, is UV */
2180 SvUV_set(sv, UV_MAX);
af359546
NC
2181 } else {
2182 SvUV_set(sv, U_V(SvNVX(sv)));
2183 /* 0xFFFFFFFFFFFFFFFF not an issue in here, NVs
2184 NV preservse UV so can do correct comparison. */
2185 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2186 SvIOK_on(sv);
af359546 2187 } else {
6f207bd3 2188 NOOP; /* Integer is imprecise. NOK, IOKp, is UV */
af359546
NC
2189 }
2190 }
4b0c9573 2191 SvIsUV_on(sv);
af359546 2192 }
28e5dec8 2193#else /* NV_PRESERVES_UV */
c2988b20
NC
2194 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2195 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
af359546 2196 /* The IV/UV slot will have been set from value returned by
c2988b20
NC
2197 grok_number above. The NV slot has just been set using
2198 Atof. */
560b0c46 2199 SvNOK_on(sv);
c2988b20
NC
2200 assert (SvIOKp(sv));
2201 } else {
2202 if (((UV)1 << NV_PRESERVES_UV_BITS) >
2203 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2204 /* Small enough to preserve all bits. */
2205 (void)SvIOKp_on(sv);
2206 SvNOK_on(sv);
45977657 2207 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
2208 if ((NV)(SvIVX(sv)) == SvNVX(sv))
2209 SvIOK_on(sv);
2210 /* Assumption: first non-preserved integer is < IV_MAX,
2211 this NV is in the preserved range, therefore: */
2212 if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
2213 < (UV)IV_MAX)) {
32fdb065 2214 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);
c2988b20
NC
2215 }
2216 } else {
2217 /* IN_UV NOT_INT
2218 0 0 already failed to read UV.
2219 0 1 already failed to read UV.
2220 1 0 you won't get here in this case. IV/UV
2221 slot set, public IOK, Atof() unneeded.
2222 1 1 already read UV.
2223 so there's no point in sv_2iuv_non_preserve() attempting
2224 to use atol, strtol, strtoul etc. */
47031da6 2225# ifdef DEBUGGING
40a17c4c 2226 sv_2iuv_non_preserve (sv, numtype);
47031da6
NC
2227# else
2228 sv_2iuv_non_preserve (sv);
2229# endif
c2988b20
NC
2230 }
2231 }
28e5dec8 2232#endif /* NV_PRESERVES_UV */
a43d94f2
NC
2233 /* It might be more code efficient to go through the entire logic above
2234 and conditionally set with SvIOKp_on() rather than SvIOK(), but it
2235 gets complex and potentially buggy, so more programmer efficient
2236 to do it this way, by turning off the public flags: */
2237 if (!numtype)
2238 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK);
25da4f38 2239 }
af359546
NC
2240 }
2241 else {
675c862f 2242 if (isGV_with_GP(sv))
159b6efe 2243 return glob_2number(MUTABLE_GV(sv));
180488f8 2244
af359546
NC
2245 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
2246 if (!PL_localizing && ckWARN(WARN_UNINITIALIZED))
2247 report_uninit(sv);
2248 }
25da4f38
IZ
2249 if (SvTYPE(sv) < SVt_IV)
2250 /* Typically the caller expects that sv_any is not NULL now. */
2251 sv_upgrade(sv, SVt_IV);
af359546
NC
2252 /* Return 0 from the caller. */
2253 return TRUE;
2254 }
2255 return FALSE;
2256}
2257
2258/*
2259=for apidoc sv_2iv_flags
2260
2261Return the integer value of an SV, doing any necessary string
2262conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2263Normally used via the C<SvIV(sv)> and C<SvIVx(sv)> macros.
2264
2265=cut
2266*/
2267
2268IV
5de3775c 2269Perl_sv_2iv_flags(pTHX_ register SV *const sv, const I32 flags)
af359546 2270{
97aff369 2271 dVAR;
af359546 2272 if (!sv)
a0d0e21e 2273 return 0;
cecf5685
NC
2274 if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
2275 /* FBMs use the same flag bit as SVf_IVisUV, so must let them
50caf62e
NC
2276 cache IVs just in case. In practice it seems that they never
2277 actually anywhere accessible by user Perl code, let alone get used
2278 in anything other than a string context. */
af359546
NC
2279 if (flags & SV_GMAGIC)
2280 mg_get(sv);
2281 if (SvIOKp(sv))
2282 return SvIVX(sv);
2283 if (SvNOKp(sv)) {
2284 return I_V(SvNVX(sv));
2285 }
71c558c3
NC
2286 if (SvPOKp(sv) && SvLEN(sv)) {
2287 UV value;
2288 const int numtype
2289 = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2290
2291 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2292 == IS_NUMBER_IN_UV) {
2293 /* It's definitely an integer */
2294 if (numtype & IS_NUMBER_NEG) {
2295 if (value < (UV)IV_MIN)
2296 return -(IV)value;
2297 } else {
2298 if (value < (UV)IV_MAX)
2299 return (IV)value;
2300 }
2301 }
2302 if (!numtype) {
2303 if (ckWARN(WARN_NUMERIC))
2304 not_a_number(sv);
2305 }
2306 return I_V(Atof(SvPVX_const(sv)));
2307 }
1c7ff15e
NC
2308 if (SvROK(sv)) {
2309 goto return_rok;
af359546 2310 }
1c7ff15e
NC
2311 assert(SvTYPE(sv) >= SVt_PVMG);
2312 /* This falls through to the report_uninit inside S_sv_2iuv_common. */
4cb1ec55 2313 } else if (SvTHINKFIRST(sv)) {
af359546 2314 if (SvROK(sv)) {
1c7ff15e 2315 return_rok:
af359546 2316 if (SvAMAGIC(sv)) {
aee036bb
DM
2317 SV * tmpstr;
2318 if (flags & SV_SKIP_OVERLOAD)
2319 return 0;
31d632c3 2320 tmpstr = AMG_CALLunary(sv, numer_amg);
af359546
NC
2321 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2322 return SvIV(tmpstr);
2323 }
2324 }
2325 return PTR2IV(SvRV(sv));
2326 }
2327 if (SvIsCOW(sv)) {
2328 sv_force_normal_flags(sv, 0);
2329 }
2330 if (SvREADONLY(sv) && !SvOK(sv)) {
2331 if (ckWARN(WARN_UNINITIALIZED))
2332 report_uninit(sv);
2333 return 0;
2334 }
2335 }
2336 if (!SvIOKp(sv)) {
2337 if (S_sv_2iuv_common(aTHX_ sv))
2338 return 0;
79072805 2339 }
1d7c1841
GS
2340 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
2341 PTR2UV(sv),SvIVX(sv)));
25da4f38 2342 return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
79072805
LW
2343}
2344
645c22ef 2345/*
891f9566 2346=for apidoc sv_2uv_flags
645c22ef
DM
2347
2348Return the unsigned integer value of an SV, doing any necessary string
891f9566
YST
2349conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2350Normally used via the C<SvUV(sv)> and C<SvUVx(sv)> macros.
645c22ef
DM
2351
2352=cut
2353*/
2354
ff68c719 2355UV
5de3775c 2356Perl_sv_2uv_flags(pTHX_ register SV *const sv, const I32 flags)
ff68c719 2357{
97aff369 2358 dVAR;
ff68c719 2359 if (!sv)
2360 return 0;
cecf5685
NC
2361 if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
2362 /* FBMs use the same flag bit as SVf_IVisUV, so must let them
50caf62e 2363 cache IVs just in case. */
891f9566
YST
2364 if (flags & SV_GMAGIC)
2365 mg_get(sv);
ff68c719 2366 if (SvIOKp(sv))
2367 return SvUVX(sv);
2368 if (SvNOKp(sv))
2369 return U_V(SvNVX(sv));
71c558c3
NC
2370 if (SvPOKp(sv) && SvLEN(sv)) {
2371 UV value;
2372 const int numtype
2373 = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2374
2375 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2376 == IS_NUMBER_IN_UV) {
2377 /* It's definitely an integer */
2378 if (!(numtype & IS_NUMBER_NEG))
2379 return value;
2380 }
2381 if (!numtype) {
2382 if (ckWARN(WARN_NUMERIC))
2383 not_a_number(sv);
2384 }
2385 return U_V(Atof(SvPVX_const(sv)));
2386 }
1c7ff15e
NC
2387 if (SvROK(sv)) {
2388 goto return_rok;
3fe9a6f1 2389 }
1c7ff15e
NC
2390 assert(SvTYPE(sv) >= SVt_PVMG);
2391 /* This falls through to the report_uninit inside S_sv_2iuv_common. */
4cb1ec55 2392 } else if (SvTHINKFIRST(sv)) {
ff68c719 2393 if (SvROK(sv)) {
1c7ff15e 2394 return_rok:
deb46114 2395 if (SvAMAGIC(sv)) {
aee036bb
DM
2396 SV *tmpstr;
2397 if (flags & SV_SKIP_OVERLOAD)
2398 return 0;
31d632c3 2399 tmpstr = AMG_CALLunary(sv, numer_amg);
deb46114
NC
2400 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2401 return SvUV(tmpstr);
2402 }
2403 }
2404 return PTR2UV(SvRV(sv));
ff68c719 2405 }
765f542d
NC
2406 if (SvIsCOW(sv)) {
2407 sv_force_normal_flags(sv, 0);
8a818333 2408 }
0336b60e 2409 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2410 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2411 report_uninit(sv);
ff68c719 2412 return 0;
2413 }
2414 }
af359546
NC
2415 if (!SvIOKp(sv)) {
2416 if (S_sv_2iuv_common(aTHX_ sv))
2417 return 0;
ff68c719 2418 }
25da4f38 2419
1d7c1841
GS
2420 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
2421 PTR2UV(sv),SvUVX(sv)));
25da4f38 2422 return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
ff68c719 2423}
2424
645c22ef 2425/*
196007d1 2426=for apidoc sv_2nv_flags
645c22ef
DM
2427
2428Return the num value of an SV, doing any necessary string or integer
39d5de13
DM
2429conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2430Normally used via the C<SvNV(sv)> and C<SvNVx(sv)> macros.
645c22ef
DM
2431
2432=cut
2433*/
2434
65202027 2435NV
39d5de13 2436Perl_sv_2nv_flags(pTHX_ register SV *const sv, const I32 flags)
79072805 2437{
97aff369 2438 dVAR;
79072805
LW
2439 if (!sv)
2440 return 0.0;
cecf5685
NC
2441 if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
2442 /* FBMs use the same flag bit as SVf_IVisUV, so must let them
50caf62e 2443 cache IVs just in case. */
39d5de13
DM
2444 if (flags & SV_GMAGIC)
2445 mg_get(sv);
463ee0b2
LW
2446 if (SvNOKp(sv))
2447 return SvNVX(sv);
0aa395f8 2448 if ((SvPOKp(sv) && SvLEN(sv)) && !SvIOKp(sv)) {
041457d9 2449 if (!SvIOKp(sv) && ckWARN(WARN_NUMERIC) &&
504618e9 2450 !grok_number(SvPVX_const(sv), SvCUR(sv), NULL))
a0d0e21e 2451 not_a_number(sv);
3f7c398e 2452 return Atof(SvPVX_const(sv));
a0d0e21e 2453 }
25da4f38 2454 if (SvIOKp(sv)) {
1c846c1f 2455 if (SvIsUV(sv))
65202027 2456 return (NV)SvUVX(sv);
25da4f38 2457 else
65202027 2458 return (NV)SvIVX(sv);
47a72cb8
NC
2459 }
2460 if (SvROK(sv)) {
2461 goto return_rok;
2462 }
2463 assert(SvTYPE(sv) >= SVt_PVMG);
2464 /* This falls through to the report_uninit near the end of the
2465 function. */
2466 } else if (SvTHINKFIRST(sv)) {
a0d0e21e 2467 if (SvROK(sv)) {
47a72cb8 2468 return_rok:
deb46114 2469 if (SvAMAGIC(sv)) {
aee036bb
DM
2470 SV *tmpstr;
2471 if (flags & SV_SKIP_OVERLOAD)
2472 return 0;
31d632c3 2473 tmpstr = AMG_CALLunary(sv, numer_amg);
deb46114
NC
2474 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2475 return SvNV(tmpstr);
2476 }
2477 }
2478 return PTR2NV(SvRV(sv));
a0d0e21e 2479 }
765f542d
NC
2480 if (SvIsCOW(sv)) {
2481 sv_force_normal_flags(sv, 0);
8a818333 2482 }
0336b60e 2483 if (SvREADONLY(sv) && !SvOK(sv)) {
599cee73 2484 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2485 report_uninit(sv);
ed6116ce
LW
2486 return 0.0;
2487 }
79072805
LW
2488 }
2489 if (SvTYPE(sv) < SVt_NV) {
7e25a7e9
NC
2490 /* The logic to use SVt_PVNV if necessary is in sv_upgrade. */
2491 sv_upgrade(sv, SVt_NV);
906f284f 2492#ifdef USE_LONG_DOUBLE
097ee67d 2493 DEBUG_c({
f93f4e46 2494 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
2495 PerlIO_printf(Perl_debug_log,
2496 "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
2497 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
2498 RESTORE_NUMERIC_LOCAL();
2499 });
65202027 2500#else
572bbb43 2501 DEBUG_c({
f93f4e46 2502 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 2503 PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%"NVgf")\n",
1d7c1841 2504 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
2505 RESTORE_NUMERIC_LOCAL();
2506 });
572bbb43 2507#endif
79072805
LW
2508 }
2509 else if (SvTYPE(sv) < SVt_PVNV)
2510 sv_upgrade(sv, SVt_PVNV);
59d8ce62
NC
2511 if (SvNOKp(sv)) {
2512 return SvNVX(sv);
61604483 2513 }
59d8ce62 2514 if (SvIOKp(sv)) {
9d6ce603 2515 SvNV_set(sv, SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv));
28e5dec8 2516#ifdef NV_PRESERVES_UV
a43d94f2
NC
2517 if (SvIOK(sv))
2518 SvNOK_on(sv);
2519 else
2520 SvNOKp_on(sv);
28e5dec8
JH
2521#else
2522 /* Only set the public NV OK flag if this NV preserves the IV */
2523 /* Check it's not 0xFFFFFFFFFFFFFFFF */
a43d94f2
NC
2524 if (SvIOK(sv) &&
2525 SvIsUV(sv) ? ((SvUVX(sv) != UV_MAX)&&(SvUVX(sv) == U_V(SvNVX(sv))))
28e5dec8
JH
2526 : (SvIVX(sv) == I_V(SvNVX(sv))))
2527 SvNOK_on(sv);
2528 else
2529 SvNOKp_on(sv);
2530#endif
93a17b20 2531 }
748a9306 2532 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 2533 UV value;
3f7c398e 2534 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
041457d9 2535 if (!SvIOKp(sv) && !numtype && ckWARN(WARN_NUMERIC))
a0d0e21e 2536 not_a_number(sv);
28e5dec8 2537#ifdef NV_PRESERVES_UV
c2988b20
NC
2538 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2539 == IS_NUMBER_IN_UV) {
5e045b90 2540 /* It's definitely an integer */
9d6ce603 2541 SvNV_set(sv, (numtype & IS_NUMBER_NEG) ? -(NV)value : (NV)value);
c2988b20 2542 } else
3f7c398e 2543 SvNV_set(sv, Atof(SvPVX_const(sv)));
a43d94f2
NC
2544 if (numtype)
2545 SvNOK_on(sv);
2546 else
2547 SvNOKp_on(sv);
28e5dec8 2548#else
3f7c398e 2549 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8
JH
2550 /* Only set the public NV OK flag if this NV preserves the value in
2551 the PV at least as well as an IV/UV would.
2552 Not sure how to do this 100% reliably. */
2553 /* if that shift count is out of range then Configure's test is
2554 wonky. We shouldn't be in here with NV_PRESERVES_UV_BITS ==
2555 UV_BITS */
2556 if (((UV)1 << NV_PRESERVES_UV_BITS) >
c2988b20 2557 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
28e5dec8 2558 SvNOK_on(sv); /* Definitely small enough to preserve all bits */
c2988b20
NC
2559 } else if (!(numtype & IS_NUMBER_IN_UV)) {
2560 /* Can't use strtol etc to convert this string, so don't try.
2561 sv_2iv and sv_2uv will use the NV to convert, not the PV. */
2562 SvNOK_on(sv);
2563 } else {
2564 /* value has been set. It may not be precise. */
2565 if ((numtype & IS_NUMBER_NEG) && (value > (UV)IV_MIN)) {
2566 /* 2s complement assumption for (UV)IV_MIN */
2567 SvNOK_on(sv); /* Integer is too negative. */
2568 } else {
2569 SvNOKp_on(sv);
2570 SvIOKp_on(sv);
6fa402ec 2571
c2988b20 2572 if (numtype & IS_NUMBER_NEG) {
45977657 2573 SvIV_set(sv, -(IV)value);
c2988b20 2574 } else if (value <= (UV)IV_MAX) {
45977657 2575 SvIV_set(sv, (IV)value);
c2988b20 2576 } else {
607fa7f2 2577 SvUV_set(sv, value);
c2988b20
NC
2578 SvIsUV_on(sv);
2579 }
2580
2581 if (numtype & IS_NUMBER_NOT_INT) {
2582 /* I believe that even if the original PV had decimals,
2583 they are lost beyond the limit of the FP precision.
2584 However, neither is canonical, so both only get p
2585 flags. NWC, 2000/11/25 */
2586 /* Both already have p flags, so do nothing */
2587 } else {
66a1b24b 2588 const NV nv = SvNVX(sv);
c2988b20
NC
2589 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2590 if (SvIVX(sv) == I_V(nv)) {
2591 SvNOK_on(sv);
c2988b20 2592 } else {
c2988b20
NC
2593 /* It had no "." so it must be integer. */
2594 }
00b6aa41 2595 SvIOK_on(sv);
c2988b20
NC
2596 } else {
2597 /* between IV_MAX and NV(UV_MAX).
2598 Could be slightly > UV_MAX */
6fa402ec 2599
c2988b20
NC
2600 if (numtype & IS_NUMBER_NOT_INT) {
2601 /* UV and NV both imprecise. */
2602 } else {
66a1b24b 2603 const UV nv_as_uv = U_V(nv);
c2988b20
NC
2604
2605 if (value == nv_as_uv && SvUVX(sv) != UV_MAX) {
2606 SvNOK_on(sv);
c2988b20 2607 }
00b6aa41 2608 SvIOK_on(sv);
c2988b20
NC
2609 }
2610 }
2611 }
2612 }
2613 }
a43d94f2
NC
2614 /* It might be more code efficient to go through the entire logic above
2615 and conditionally set with SvNOKp_on() rather than SvNOK(), but it
2616 gets complex and potentially buggy, so more programmer efficient
2617 to do it this way, by turning off the public flags: */
2618 if (!numtype)
2619 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK);
28e5dec8 2620#endif /* NV_PRESERVES_UV */
93a17b20 2621 }
79072805 2622 else {
f7877b28 2623 if (isGV_with_GP(sv)) {
159b6efe 2624 glob_2number(MUTABLE_GV(sv));
180488f8
NC
2625 return 0.0;
2626 }
2627
041457d9 2628 if (!PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP) && ckWARN(WARN_UNINITIALIZED))
29489e7c 2629 report_uninit(sv);
7e25a7e9
NC
2630 assert (SvTYPE(sv) >= SVt_NV);
2631 /* Typically the caller expects that sv_any is not NULL now. */
2632 /* XXX Ilya implies that this is a bug in callers that assume this
2633 and ideally should be fixed. */
a0d0e21e 2634 return 0.0;
79072805 2635 }
572bbb43 2636#if defined(USE_LONG_DOUBLE)
097ee67d 2637 DEBUG_c({
f93f4e46 2638 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
2639 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
2640 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
2641 RESTORE_NUMERIC_LOCAL();
2642 });
65202027 2643#else
572bbb43 2644 DEBUG_c({
f93f4e46 2645 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 2646 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%"NVgf")\n",
1d7c1841 2647 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
2648 RESTORE_NUMERIC_LOCAL();
2649 });
572bbb43 2650#endif
463ee0b2 2651 return SvNVX(sv);
79072805
LW
2652}
2653
800401ee
JH
2654/*
2655=for apidoc sv_2num
2656
2657Return an SV with the numeric value of the source SV, doing any necessary
a196a5fa
JH
2658reference or overload conversion. You must use the C<SvNUM(sv)> macro to
2659access this function.
800401ee
JH
2660
2661=cut
2662*/
2663
2664SV *
5de3775c 2665Perl_sv_2num(pTHX_ register SV *const sv)
800401ee 2666{
7918f24d
NC
2667 PERL_ARGS_ASSERT_SV_2NUM;
2668
b9ee0594
RGS
2669 if (!SvROK(sv))
2670 return sv;
800401ee 2671 if (SvAMAGIC(sv)) {
31d632c3 2672 SV * const tmpsv = AMG_CALLunary(sv, numer_amg);
a02ec77a 2673 TAINT_IF(tmpsv && SvTAINTED(tmpsv));
800401ee
JH
2674 if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
2675 return sv_2num(tmpsv);
2676 }
2677 return sv_2mortal(newSVuv(PTR2UV(SvRV(sv))));
2678}
2679
645c22ef
DM
2680/* uiv_2buf(): private routine for use by sv_2pv_flags(): print an IV or
2681 * UV as a string towards the end of buf, and return pointers to start and
2682 * end of it.
2683 *
2684 * We assume that buf is at least TYPE_CHARS(UV) long.
2685 */
2686
864dbfa3 2687static char *
5de3775c 2688S_uiv_2buf(char *const buf, const IV iv, UV uv, const int is_uv, char **const peob)
25da4f38 2689{
25da4f38 2690 char *ptr = buf + TYPE_CHARS(UV);
823a54a3 2691 char * const ebuf = ptr;
25da4f38 2692 int sign;
25da4f38 2693
7918f24d
NC
2694 PERL_ARGS_ASSERT_UIV_2BUF;
2695
25da4f38
IZ
2696 if (is_uv)
2697 sign = 0;
2698 else if (iv >= 0) {
2699 uv = iv;
2700 sign = 0;
2701 } else {
2702 uv = -iv;
2703 sign = 1;
2704 }
2705 do {
eb160463 2706 *--ptr = '0' + (char)(uv % 10);
25da4f38
IZ
2707 } while (uv /= 10);
2708 if (sign)
2709 *--ptr = '-';
2710 *peob = ebuf;
2711 return ptr;
2712}
2713
645c22ef
DM
2714/*
2715=for apidoc sv_2pv_flags
2716
ff276b08 2717Returns a pointer to the string value of an SV, and sets *lp to its length.
645c22ef
DM
2718If flags includes SV_GMAGIC, does an mg_get() first. Coerces sv to a string
2719if necessary.
2720Normally invoked via the C<SvPV_flags> macro. C<sv_2pv()> and C<sv_2pv_nomg>
2721usually end up here too.
2722
2723=cut
2724*/
2725
8d6d96c1 2726char *
5de3775c 2727Perl_sv_2pv_flags(pTHX_ register SV *const sv, STRLEN *const lp, const I32 flags)
8d6d96c1 2728{
97aff369 2729 dVAR;
79072805 2730 register char *s;
79072805 2731
463ee0b2 2732 if (!sv) {
cdb061a3
NC
2733 if (lp)
2734 *lp = 0;
73d840c0 2735 return (char *)"";
463ee0b2 2736 }
8990e307 2737 if (SvGMAGICAL(sv)) {
8d6d96c1
HS
2738 if (flags & SV_GMAGIC)
2739 mg_get(sv);
463ee0b2 2740 if (SvPOKp(sv)) {
cdb061a3
NC
2741 if (lp)
2742 *lp = SvCUR(sv);
10516c54
NC
2743 if (flags & SV_MUTABLE_RETURN)
2744 return SvPVX_mutable(sv);
4d84ee25
NC
2745 if (flags & SV_CONST_RETURN)
2746 return (char *)SvPVX_const(sv);
463ee0b2
LW
2747 return SvPVX(sv);
2748 }
75dfc8ec
NC
2749 if (SvIOKp(sv) || SvNOKp(sv)) {
2750 char tbuf[64]; /* Must fit sprintf/Gconvert of longest IV/NV */
75dfc8ec
NC
2751 STRLEN len;
2752
2753 if (SvIOKp(sv)) {
e80fed9d 2754 len = SvIsUV(sv)
d9fad198
JH
2755 ? my_snprintf(tbuf, sizeof(tbuf), "%"UVuf, (UV)SvUVX(sv))
2756 : my_snprintf(tbuf, sizeof(tbuf), "%"IVdf, (IV)SvIVX(sv));
29912d93
NC
2757 } else if(SvNVX(sv) == 0.0) {
2758 tbuf[0] = '0';
2759 tbuf[1] = 0;
2760 len = 1;
75dfc8ec 2761 } else {
e8ada2d0
NC
2762 Gconvert(SvNVX(sv), NV_DIG, 0, tbuf);
2763 len = strlen(tbuf);
75dfc8ec 2764 }
b5b886f0
NC
2765 assert(!SvROK(sv));
2766 {
75dfc8ec
NC
2767 dVAR;
2768
75dfc8ec
NC
2769 SvUPGRADE(sv, SVt_PV);
2770 if (lp)
2771 *lp = len;
2772 s = SvGROW_mutable(sv, len + 1);
2773 SvCUR_set(sv, len);
2774 SvPOKp_on(sv);
10edeb5d 2775 return (char*)memcpy(s, tbuf, len + 1);
75dfc8ec 2776 }
463ee0b2 2777 }
1c7ff15e
NC
2778 if (SvROK(sv)) {
2779 goto return_rok;
2780 }
2781 assert(SvTYPE(sv) >= SVt_PVMG);
2782 /* This falls through to the report_uninit near the end of the
2783 function. */
2784 } else if (SvTHINKFIRST(sv)) {
ed6116ce 2785 if (SvROK(sv)) {
1c7ff15e 2786 return_rok:
deb46114 2787 if (SvAMAGIC(sv)) {
aee036bb
DM
2788 SV *tmpstr;
2789 if (flags & SV_SKIP_OVERLOAD)
2790 return NULL;
31d632c3 2791 tmpstr = AMG_CALLunary(sv, string_amg);
a02ec77a 2792 TAINT_IF(tmpstr && SvTAINTED(tmpstr));
deb46114
NC
2793 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2794 /* Unwrap this: */
2795 /* char *pv = lp ? SvPV(tmpstr, *lp) : SvPV_nolen(tmpstr);
2796 */
2797
2798 char *pv;
2799 if ((SvFLAGS(tmpstr) & (SVf_POK)) == SVf_POK) {
2800 if (flags & SV_CONST_RETURN) {
2801 pv = (char *) SvPVX_const(tmpstr);
2802 } else {
2803 pv = (flags & SV_MUTABLE_RETURN)
2804 ? SvPVX_mutable(tmpstr) : SvPVX(tmpstr);
2805 }
2806 if (lp)
2807 *lp = SvCUR(tmpstr);
50adf7d2 2808 } else {
deb46114 2809 pv = sv_2pv_flags(tmpstr, lp, flags);
50adf7d2 2810 }
deb46114
NC
2811 if (SvUTF8(tmpstr))
2812 SvUTF8_on(sv);
2813 else
2814 SvUTF8_off(sv);
2815 return pv;
50adf7d2 2816 }
deb46114
NC
2817 }
2818 {
fafee734
NC
2819 STRLEN len;
2820 char *retval;
2821 char *buffer;
d2c6dc5e 2822 SV *const referent = SvRV(sv);
d8eae41e
NC
2823
2824 if (!referent) {
fafee734
NC
2825 len = 7;
2826 retval = buffer = savepvn("NULLREF", len);
5c35adbb 2827 } else if (SvTYPE(referent) == SVt_REGEXP) {
d2c6dc5e 2828 REGEXP * const re = (REGEXP *)MUTABLE_PTR(referent);
67d2d14d
AB
2829 I32 seen_evals = 0;
2830
2831 assert(re);
2832
2833 /* If the regex is UTF-8 we want the containing scalar to
2834 have an UTF-8 flag too */
2835 if (RX_UTF8(re))
2836 SvUTF8_on(sv);
2837 else
2838 SvUTF8_off(sv);
2839
2840 if ((seen_evals = RX_SEEN_EVALS(re)))
2841 PL_reginterp_cnt += seen_evals;
2842
2843 if (lp)
2844 *lp = RX_WRAPLEN(re);
2845
2846 return RX_WRAPPED(re);
d8eae41e
NC
2847 } else {
2848 const char *const typestr = sv_reftype(referent, 0);
fafee734
NC
2849 const STRLEN typelen = strlen(typestr);
2850 UV addr = PTR2UV(referent);
2851 const char *stashname = NULL;
2852 STRLEN stashnamelen = 0; /* hush, gcc */
2853 const char *buffer_end;
d8eae41e 2854
d8eae41e 2855 if (SvOBJECT(referent)) {
fafee734
NC
2856 const HEK *const name = HvNAME_HEK(SvSTASH(referent));
2857
2858 if (name) {
2859 stashname = HEK_KEY(name);
2860 stashnamelen = HEK_LEN(name);
2861
2862 if (HEK_UTF8(name)) {
2863 SvUTF8_on(sv);
2864 } else {
2865 SvUTF8_off(sv);
2866 }
2867 } else {
2868 stashname = "__ANON__";
2869 stashnamelen = 8;
2870 }
2871 len = stashnamelen + 1 /* = */ + typelen + 3 /* (0x */
2872 + 2 * sizeof(UV) + 2 /* )\0 */;
2873 } else {
2874 len = typelen + 3 /* (0x */
2875 + 2 * sizeof(UV) + 2 /* )\0 */;
d8eae41e 2876 }
fafee734
NC
2877
2878 Newx(buffer, len, char);
2879 buffer_end = retval = buffer + len;
2880
2881 /* Working backwards */
2882 *--retval = '\0';
2883 *--retval = ')';
2884 do {
2885 *--retval = PL_hexdigit[addr & 15];
2886 } while (addr >>= 4);
2887 *--retval = 'x';
2888 *--retval = '0';
2889 *--retval = '(';
2890
2891 retval -= typelen;
2892 memcpy(retval, typestr, typelen);
2893
2894 if (stashname) {
2895 *--retval = '=';
2896 retval -= stashnamelen;
2897 memcpy(retval, stashname, stashnamelen);
2898 }
486ec47a 2899 /* retval may not necessarily have reached the start of the
fafee734
NC
2900 buffer here. */
2901 assert (retval >= buffer);
2902
2903 len = buffer_end - retval - 1; /* -1 for that \0 */
c080367d 2904 }
042dae7a 2905 if (lp)
fafee734
NC
2906 *lp = len;
2907 SAVEFREEPV(buffer);
2908 return retval;
463ee0b2 2909 }
79072805 2910 }
0336b60e 2911 if (SvREADONLY(sv) && !SvOK(sv)) {
cdb061a3
NC
2912 if (lp)
2913 *lp = 0;
9f621bb0
NC
2914 if (flags & SV_UNDEF_RETURNS_NULL)
2915 return NULL;
2916 if (ckWARN(WARN_UNINITIALIZED))
2917 report_uninit(sv);
73d840c0 2918 return (char *)"";
79072805 2919 }
79072805 2920 }
28e5dec8
JH
2921 if (SvIOK(sv) || ((SvIOKp(sv) && !SvNOKp(sv)))) {
2922 /* I'm assuming that if both IV and NV are equally valid then
2923 converting the IV is going to be more efficient */
e1ec3a88 2924 const U32 isUIOK = SvIsUV(sv);
28e5dec8
JH
2925 char buf[TYPE_CHARS(UV)];
2926 char *ebuf, *ptr;
97a130b8 2927 STRLEN len;
28e5dec8
JH
2928
2929 if (SvTYPE(sv) < SVt_PVIV)
2930 sv_upgrade(sv, SVt_PVIV);
4ea1d550 2931 ptr = uiv_2buf(buf, SvIVX(sv), SvUVX(sv), isUIOK, &ebuf);
97a130b8 2932 len = ebuf - ptr;
5902b6a9 2933 /* inlined from sv_setpvn */
97a130b8
NC
2934 s = SvGROW_mutable(sv, len + 1);
2935 Move(ptr, s, len, char);
2936 s += len;
28e5dec8 2937 *s = '\0';
28e5dec8
JH
2938 }
2939 else if (SvNOKp(sv)) {
79072805
LW
2940 if (SvTYPE(sv) < SVt_PVNV)
2941 sv_upgrade(sv, SVt_PVNV);
29912d93
NC
2942 if (SvNVX(sv) == 0.0) {
2943 s = SvGROW_mutable(sv, 2);
2944 *s++ = '0';
2945 *s = '\0';
2946 } else {
2947 dSAVE_ERRNO;
2948 /* The +20 is pure guesswork. Configure test needed. --jhi */
2949 s = SvGROW_mutable(sv, NV_DIG + 20);
2950 /* some Xenix systems wipe out errno here */
2d4389e4 2951 Gconvert(SvNVX(sv), NV_DIG, 0, s);
29912d93
NC
2952 RESTORE_ERRNO;
2953 while (*s) s++;
bbce6d69 2954 }
79072805
LW
2955#ifdef hcx
2956 if (s[-1] == '.')
46fc3d4c 2957 *--s = '\0';
79072805
LW
2958#endif
2959 }
79072805 2960 else {
8d1c3e26
NC
2961 if (isGV_with_GP(sv)) {
2962 GV *const gv = MUTABLE_GV(sv);
2963 const U32 wasfake = SvFLAGS(gv) & SVf_FAKE;
2964 SV *const buffer = sv_newmortal();
2965
2966 /* FAKE globs can get coerced, so need to turn this off temporarily
2967 if it is on. */
2968 SvFAKE_off(gv);
2969 gv_efullname3(buffer, gv, "*");
2970 SvFLAGS(gv) |= wasfake;
2971
1809c940
DM
2972 if (SvPOK(buffer)) {
2973 if (lp) {
2974 *lp = SvCUR(buffer);
2975 }
2976 return SvPVX(buffer);
2977 }
2978 else {
2979 if (lp)
2980 *lp = 0;
2981 return (char *)"";
8d1c3e26 2982 }
8d1c3e26 2983 }
180488f8 2984
cdb061a3 2985 if (lp)
00b6aa41 2986 *lp = 0;
9f621bb0
NC
2987 if (flags & SV_UNDEF_RETURNS_NULL)
2988 return NULL;
2989 if (!PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP) && ckWARN(WARN_UNINITIALIZED))
2990 report_uninit(sv);
25da4f38
IZ
2991 if (SvTYPE(sv) < SVt_PV)
2992 /* Typically the caller expects that sv_any is not NULL now. */
2993 sv_upgrade(sv, SVt_PV);
73d840c0 2994 return (char *)"";
79072805 2995 }
cdb061a3 2996 {
823a54a3 2997 const STRLEN len = s - SvPVX_const(sv);
cdb061a3
NC
2998 if (lp)
2999 *lp = len;
3000 SvCUR_set(sv, len);
3001 }
79072805 3002 SvPOK_on(sv);
1d7c1841 3003 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3f7c398e 3004 PTR2UV(sv),SvPVX_const(sv)));
4d84ee25
NC
3005 if (flags & SV_CONST_RETURN)
3006 return (char *)SvPVX_const(sv);
10516c54
NC
3007 if (flags & SV_MUTABLE_RETURN)
3008 return SvPVX_mutable(sv);
463ee0b2
LW
3009 return SvPVX(sv);
3010}
3011
645c22ef 3012/*
6050d10e
JP
3013=for apidoc sv_copypv
3014
3015Copies a stringified representation of the source SV into the
3016destination SV. Automatically performs any necessary mg_get and
54f0641b 3017coercion of numeric values into strings. Guaranteed to preserve
2575c402 3018UTF8 flag even from overloaded objects. Similar in nature to
54f0641b
NIS
3019sv_2pv[_flags] but operates directly on an SV instead of just the
3020string. Mostly uses sv_2pv_flags to do its work, except when that
6050d10e
JP
3021would lose the UTF-8'ness of the PV.
3022
3023=cut
3024*/
3025
3026void
5de3775c 3027Perl_sv_copypv(pTHX_ SV *const dsv, register SV *const ssv)
6050d10e 3028{
446eaa42 3029 STRLEN len;
53c1dcc0 3030 const char * const s = SvPV_const(ssv,len);
7918f24d
NC
3031
3032 PERL_ARGS_ASSERT_SV_COPYPV;
3033
cb50f42d 3034 sv_setpvn(dsv,s,len);
446eaa42 3035 if (SvUTF8(ssv))
cb50f42d 3036 SvUTF8_on(dsv);
446eaa42 3037 else
cb50f42d 3038 SvUTF8_off(dsv);
6050d10e
JP
3039}
3040
3041/*
645c22ef
DM
3042=for apidoc sv_2pvbyte
3043
3044Return a pointer to the byte-encoded representation of the SV, and set *lp
1e54db1a 3045to its length. May cause the SV to be downgraded from UTF-8 as a
645c22ef
DM
3046side-effect.
3047
3048Usually accessed via the C<SvPVbyte> macro.
3049
3050=cut
3051*/
3052
7340a771 3053char *
5de3775c 3054Perl_sv_2pvbyte(pTHX_ register SV *const sv, STRLEN *const lp)
7340a771 3055{
7918f24d
NC
3056 PERL_ARGS_ASSERT_SV_2PVBYTE;
3057
71eb6d8c 3058 SvGETMAGIC(sv);
0875d2fe 3059 sv_utf8_downgrade(sv,0);
71eb6d8c 3060 return lp ? SvPV_nomg(sv,*lp) : SvPV_nomg_nolen(sv);
7340a771
GS
3061}
3062
645c22ef 3063/*
035cbb0e
RGS
3064=for apidoc sv_2pvutf8
3065
3066Return a pointer to the UTF-8-encoded representation of the SV, and set *lp
3067to its length. May cause the SV to be upgraded to UTF-8 as a side-effect.
3068
3069Usually accessed via the C<SvPVutf8> macro.
3070
3071=cut
3072*/
645c22ef 3073
7340a771 3074char *
7bc54cea 3075Perl_sv_2pvutf8(pTHX_ register SV *const sv, STRLEN *const lp)
7340a771 3076{
7918f24d
NC
3077 PERL_ARGS_ASSERT_SV_2PVUTF8;
3078
035cbb0e
RGS
3079 sv_utf8_upgrade(sv);
3080 return lp ? SvPV(sv,*lp) : SvPV_nolen(sv);
7340a771 3081}
1c846c1f 3082
7ee2227d 3083
645c22ef
DM
3084/*
3085=for apidoc sv_2bool
3086
06c841cf
FC
3087This macro is only used by sv_true() or its macro equivalent, and only if
3088the latter's argument is neither SvPOK, SvIOK nor SvNOK.
3089It calls sv_2bool_flags with the SV_GMAGIC flag.
3090
3091=for apidoc sv_2bool_flags
3092
3093This function is only used by sv_true() and friends, and only if
3094the latter's argument is neither SvPOK, SvIOK nor SvNOK. If the flags
3095contain SV_GMAGIC, then it does an mg_get() first.
3096
645c22ef
DM
3097
3098=cut
3099*/
3100
463ee0b2 3101bool
06c841cf 3102Perl_sv_2bool_flags(pTHX_ register SV *const sv, const I32 flags)
463ee0b2 3103{
97aff369 3104 dVAR;
7918f24d 3105
06c841cf 3106 PERL_ARGS_ASSERT_SV_2BOOL_FLAGS;
7918f24d 3107
06c841cf 3108 if(flags & SV_GMAGIC) SvGETMAGIC(sv);
463ee0b2 3109
a0d0e21e
LW
3110 if (!SvOK(sv))
3111 return 0;
3112 if (SvROK(sv)) {
fabdb6c0 3113 if (SvAMAGIC(sv)) {
31d632c3 3114 SV * const tmpsv = AMG_CALLunary(sv, bool__amg);
fabdb6c0 3115 if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
f2338a2e 3116 return cBOOL(SvTRUE(tmpsv));
fabdb6c0
AL
3117 }
3118 return SvRV(sv) != 0;
a0d0e21e 3119 }
463ee0b2 3120 if (SvPOKp(sv)) {
53c1dcc0
AL
3121 register XPV* const Xpvtmp = (XPV*)SvANY(sv);
3122 if (Xpvtmp &&
339049b0 3123 (*sv->sv_u.svu_pv > '0' ||
11343788 3124 Xpvtmp->xpv_cur > 1 ||
339049b0 3125 (Xpvtmp->xpv_cur && *sv->sv_u.svu_pv != '0')))
463ee0b2
LW
3126 return 1;
3127 else
3128 return 0;
3129 }
3130 else {
3131 if (SvIOKp(sv))
3132 return SvIVX(sv) != 0;
3133 else {
3134 if (SvNOKp(sv))
3135 return SvNVX(sv) != 0.0;
180488f8 3136 else {
f7877b28 3137 if (isGV_with_GP(sv))
180488f8
NC
3138 return TRUE;
3139 else
3140 return FALSE;
3141 }
463ee0b2
LW
3142 }
3143 }
79072805
LW
3144}
3145
c461cf8f
JH
3146/*
3147=for apidoc sv_utf8_upgrade
3148
78ea37eb 3149Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 3150Forces the SV to string form if it is not already.
2bbc8d55 3151Will C<mg_get> on C<sv> if appropriate.
4411f3b6 3152Always sets the SvUTF8 flag to avoid future validity checks even
2bbc8d55
SP
3153if the whole string is the same in UTF-8 as not.
3154Returns the number of bytes in the converted string
c461cf8f 3155
13a6c0e0
JH
3156This is not as a general purpose byte encoding to Unicode interface:
3157use the Encode extension for that.
3158
fe749c9a
KW
3159=for apidoc sv_utf8_upgrade_nomg
3160
3161Like sv_utf8_upgrade, but doesn't do magic on C<sv>
3162
8d6d96c1
HS
3163=for apidoc sv_utf8_upgrade_flags
3164
78ea37eb 3165Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 3166Forces the SV to string form if it is not already.
8d6d96c1 3167Always sets the SvUTF8 flag to avoid future validity checks even
2bbc8d55
SP
3168if all the bytes are invariant in UTF-8. If C<flags> has C<SV_GMAGIC> bit set,
3169will C<mg_get> on C<sv> if appropriate, else not.
3170Returns the number of bytes in the converted string
3171C<sv_utf8_upgrade> and
8d6d96c1
HS
3172C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
3173
13a6c0e0
JH
3174This is not as a general purpose byte encoding to Unicode interface:
3175use the Encode extension for that.
3176
8d6d96c1 3177=cut
b3ab6785
KW
3178
3179The grow version is currently not externally documented. It adds a parameter,
3180extra, which is the number of unused bytes the string of 'sv' is guaranteed to
3181have free after it upon return. This allows the caller to reserve extra space
3182that it intends to fill, to avoid extra grows.
3183
3184Also externally undocumented for the moment is the flag SV_FORCE_UTF8_UPGRADE,
3185which can be used to tell this function to not first check to see if there are
3186any characters that are different in UTF-8 (variant characters) which would
3187force it to allocate a new string to sv, but to assume there are. Typically
3188this flag is used by a routine that has already parsed the string to find that
3189there are such characters, and passes this information on so that the work
3190doesn't have to be repeated.
3191
3192(One might think that the calling routine could pass in the position of the
3193first such variant, so it wouldn't have to be found again. But that is not the
3194case, because typically when the caller is likely to use this flag, it won't be
3195calling this routine unless it finds something that won't fit into a byte.
3196Otherwise it tries to not upgrade and just use bytes. But some things that
3197do fit into a byte are variants in utf8, and the caller may not have been
3198keeping track of these.)
3199
3200If the routine itself changes the string, it adds a trailing NUL. Such a NUL
3201isn't guaranteed due to having other routines do the work in some input cases,
3202or if the input is already flagged as being in utf8.
3203
3204The speed of this could perhaps be improved for many cases if someone wanted to
3205write a fast function that counts the number of variant characters in a string,
3206especially if it could return the position of the first one.
3207
8d6d96c1
HS
3208*/
3209
3210STRLEN
b3ab6785 3211Perl_sv_utf8_upgrade_flags_grow(pTHX_ register SV *const sv, const I32 flags, STRLEN extra)
8d6d96c1 3212{
97aff369 3213 dVAR;
7918f24d 3214
b3ab6785 3215 PERL_ARGS_ASSERT_SV_UTF8_UPGRADE_FLAGS_GROW;
7918f24d 3216
808c356f
RGS
3217 if (sv == &PL_sv_undef)
3218 return 0;
e0e62c2a
NIS
3219 if (!SvPOK(sv)) {
3220 STRLEN len = 0;
d52b7888
NC
3221 if (SvREADONLY(sv) && (SvPOKp(sv) || SvIOKp(sv) || SvNOKp(sv))) {
3222 (void) sv_2pv_flags(sv,&len, flags);
b3ab6785
KW
3223 if (SvUTF8(sv)) {
3224 if (extra) SvGROW(sv, SvCUR(sv) + extra);
d52b7888 3225 return len;
b3ab6785 3226 }
d52b7888 3227 } else {
33fb6f35 3228 (void) SvPV_force_flags(sv,len,flags & SV_GMAGIC);
d52b7888 3229 }
e0e62c2a 3230 }
4411f3b6 3231
f5cee72b 3232 if (SvUTF8(sv)) {
b3ab6785 3233 if (extra) SvGROW(sv, SvCUR(sv) + extra);
5fec3b1d 3234 return SvCUR(sv);
f5cee72b 3235 }
5fec3b1d 3236
765f542d
NC
3237 if (SvIsCOW(sv)) {
3238 sv_force_normal_flags(sv, 0);
db42d148
NIS
3239 }
3240
b3ab6785 3241 if (PL_encoding && !(flags & SV_UTF8_NO_ENCODING)) {
799ef3cb 3242 sv_recode_to_utf8(sv, PL_encoding);
b3ab6785
KW
3243 if (extra) SvGROW(sv, SvCUR(sv) + extra);
3244 return SvCUR(sv);
3245 }
3246
4e93345f
KW
3247 if (SvCUR(sv) == 0) {
3248 if (extra) SvGROW(sv, extra);
3249 } else { /* Assume Latin-1/EBCDIC */
c4e7c712 3250 /* This function could be much more efficient if we
2bbc8d55 3251 * had a FLAG in SVs to signal if there are any variant
c4e7c712 3252 * chars in the PV. Given that there isn't such a flag
b3ab6785
KW
3253 * make the loop as fast as possible (although there are certainly ways
3254 * to speed this up, eg. through vectorization) */
3255 U8 * s = (U8 *) SvPVX_const(sv);
3256 U8 * e = (U8 *) SvEND(sv);
3257 U8 *t = s;
3258 STRLEN two_byte_count = 0;
c4e7c712 3259
b3ab6785
KW
3260 if (flags & SV_FORCE_UTF8_UPGRADE) goto must_be_utf8;
3261
3262 /* See if really will need to convert to utf8. We mustn't rely on our
3263 * incoming SV being well formed and having a trailing '\0', as certain
3264 * code in pp_formline can send us partially built SVs. */
3265
c4e7c712 3266 while (t < e) {
53c1dcc0 3267 const U8 ch = *t++;
b3ab6785
KW
3268 if (NATIVE_IS_INVARIANT(ch)) continue;
3269
3270 t--; /* t already incremented; re-point to first variant */
3271 two_byte_count = 1;
3272 goto must_be_utf8;
c4e7c712 3273 }
b3ab6785
KW
3274
3275 /* utf8 conversion not needed because all are invariants. Mark as
3276 * UTF-8 even if no variant - saves scanning loop */
c4e7c712 3277 SvUTF8_on(sv);
b3ab6785
KW
3278 return SvCUR(sv);
3279
3280must_be_utf8:
3281
3282 /* Here, the string should be converted to utf8, either because of an
3283 * input flag (two_byte_count = 0), or because a character that
3284 * requires 2 bytes was found (two_byte_count = 1). t points either to
3285 * the beginning of the string (if we didn't examine anything), or to
3286 * the first variant. In either case, everything from s to t - 1 will
3287 * occupy only 1 byte each on output.
3288 *
3289 * There are two main ways to convert. One is to create a new string
3290 * and go through the input starting from the beginning, appending each
3291 * converted value onto the new string as we go along. It's probably
3292 * best to allocate enough space in the string for the worst possible
3293 * case rather than possibly running out of space and having to
3294 * reallocate and then copy what we've done so far. Since everything
3295 * from s to t - 1 is invariant, the destination can be initialized
3296 * with these using a fast memory copy
3297 *
3298 * The other way is to figure out exactly how big the string should be
3299 * by parsing the entire input. Then you don't have to make it big
3300 * enough to handle the worst possible case, and more importantly, if
3301 * the string you already have is large enough, you don't have to
3302 * allocate a new string, you can copy the last character in the input
3303 * string to the final position(s) that will be occupied by the
3304 * converted string and go backwards, stopping at t, since everything
3305 * before that is invariant.
3306 *
3307 * There are advantages and disadvantages to each method.
3308 *
3309 * In the first method, we can allocate a new string, do the memory
3310 * copy from the s to t - 1, and then proceed through the rest of the
3311 * string byte-by-byte.
3312 *
3313 * In the second method, we proceed through the rest of the input
3314 * string just calculating how big the converted string will be. Then
3315 * there are two cases:
3316 * 1) if the string has enough extra space to handle the converted
3317 * value. We go backwards through the string, converting until we
3318 * get to the position we are at now, and then stop. If this
3319 * position is far enough along in the string, this method is
3320 * faster than the other method. If the memory copy were the same
3321 * speed as the byte-by-byte loop, that position would be about
3322 * half-way, as at the half-way mark, parsing to the end and back
3323 * is one complete string's parse, the same amount as starting
3324 * over and going all the way through. Actually, it would be
3325 * somewhat less than half-way, as it's faster to just count bytes
3326 * than to also copy, and we don't have the overhead of allocating
3327 * a new string, changing the scalar to use it, and freeing the
3328 * existing one. But if the memory copy is fast, the break-even
3329 * point is somewhere after half way. The counting loop could be
3330 * sped up by vectorization, etc, to move the break-even point
3331 * further towards the beginning.
3332 * 2) if the string doesn't have enough space to handle the converted
3333 * value. A new string will have to be allocated, and one might
3334 * as well, given that, start from the beginning doing the first
3335 * method. We've spent extra time parsing the string and in
3336 * exchange all we've gotten is that we know precisely how big to
3337 * make the new one. Perl is more optimized for time than space,
3338 * so this case is a loser.
3339 * So what I've decided to do is not use the 2nd method unless it is
3340 * guaranteed that a new string won't have to be allocated, assuming
3341 * the worst case. I also decided not to put any more conditions on it
3342 * than this, for now. It seems likely that, since the worst case is
3343 * twice as big as the unknown portion of the string (plus 1), we won't
3344 * be guaranteed enough space, causing us to go to the first method,
3345 * unless the string is short, or the first variant character is near
3346 * the end of it. In either of these cases, it seems best to use the
3347 * 2nd method. The only circumstance I can think of where this would
3348 * be really slower is if the string had once had much more data in it
3349 * than it does now, but there is still a substantial amount in it */
3350
3351 {
3352 STRLEN invariant_head = t - s;
3353 STRLEN size = invariant_head + (e - t) * 2 + 1 + extra;
3354 if (SvLEN(sv) < size) {
3355
3356 /* Here, have decided to allocate a new string */
3357
3358 U8 *dst;
3359 U8 *d;
3360
3361 Newx(dst, size, U8);
3362
3363 /* If no known invariants at the beginning of the input string,
3364 * set so starts from there. Otherwise, can use memory copy to
3365 * get up to where we are now, and then start from here */
3366
3367 if (invariant_head <= 0) {
3368 d = dst;
3369 } else {
3370 Copy(s, dst, invariant_head, char);
3371 d = dst + invariant_head;
3372 }
3373
3374 while (t < e) {
3375 const UV uv = NATIVE8_TO_UNI(*t++);
3376 if (UNI_IS_INVARIANT(uv))
3377 *d++ = (U8)UNI_TO_NATIVE(uv);
3378 else {
3379 *d++ = (U8)UTF8_EIGHT_BIT_HI(uv);
3380 *d++ = (U8)UTF8_EIGHT_BIT_LO(uv);
3381 }
3382 }
3383 *d = '\0';
3384 SvPV_free(sv); /* No longer using pre-existing string */
3385 SvPV_set(sv, (char*)dst);
3386 SvCUR_set(sv, d - dst);
3387 SvLEN_set(sv, size);
3388 } else {
3389
3390 /* Here, have decided to get the exact size of the string.
3391 * Currently this happens only when we know that there is
3392 * guaranteed enough space to fit the converted string, so
3393 * don't have to worry about growing. If two_byte_count is 0,
3394 * then t points to the first byte of the string which hasn't
3395 * been examined yet. Otherwise two_byte_count is 1, and t
3396 * points to the first byte in the string that will expand to
3397 * two. Depending on this, start examining at t or 1 after t.
3398 * */
3399
3400 U8 *d = t + two_byte_count;
3401
3402
3403 /* Count up the remaining bytes that expand to two */
3404
3405 while (d < e) {
3406 const U8 chr = *d++;
3407 if (! NATIVE_IS_INVARIANT(chr)) two_byte_count++;
3408 }
3409
3410 /* The string will expand by just the number of bytes that
3411 * occupy two positions. But we are one afterwards because of
3412 * the increment just above. This is the place to put the
3413 * trailing NUL, and to set the length before we decrement */
3414
3415 d += two_byte_count;
3416 SvCUR_set(sv, d - s);
3417 *d-- = '\0';
3418
3419
3420 /* Having decremented d, it points to the position to put the
3421 * very last byte of the expanded string. Go backwards through
3422 * the string, copying and expanding as we go, stopping when we
3423 * get to the part that is invariant the rest of the way down */
3424
3425 e--;
3426 while (e >= t) {
3427 const U8 ch = NATIVE8_TO_UNI(*e--);
3428 if (UNI_IS_INVARIANT(ch)) {
3429 *d-- = UNI_TO_NATIVE(ch);
3430 } else {
3431 *d-- = (U8)UTF8_EIGHT_BIT_LO(ch);
3432 *d-- = (U8)UTF8_EIGHT_BIT_HI(ch);
3433 }
3434 }
3435 }
3436 }
560a288e 3437 }
b3ab6785
KW
3438
3439 /* Mark as UTF-8 even if no variant - saves scanning loop */
3440 SvUTF8_on(sv);
4411f3b6 3441 return SvCUR(sv);
560a288e
GS
3442}
3443
c461cf8f
JH
3444/*
3445=for apidoc sv_utf8_downgrade
3446
78ea37eb 3447Attempts to convert the PV of an SV from characters to bytes.
2bbc8d55
SP
3448If the PV contains a character that cannot fit
3449in a byte, this conversion will fail;
78ea37eb 3450in this case, either returns false or, if C<fail_ok> is not
c461cf8f
JH
3451true, croaks.
3452
13a6c0e0
JH
3453This is not as a general purpose Unicode to byte encoding interface:
3454use the Encode extension for that.
3455
c461cf8f
JH
3456=cut
3457*/
3458
560a288e 3459bool
7bc54cea 3460Perl_sv_utf8_downgrade(pTHX_ register SV *const sv, const bool fail_ok)
560a288e 3461{
97aff369 3462 dVAR;
7918f24d
NC
3463
3464 PERL_ARGS_ASSERT_SV_UTF8_DOWNGRADE;
3465
78ea37eb 3466 if (SvPOKp(sv) && SvUTF8(sv)) {
fa301091 3467 if (SvCUR(sv)) {
03cfe0ae 3468 U8 *s;
652088fc 3469 STRLEN len;
fa301091 3470
765f542d
NC
3471 if (SvIsCOW(sv)) {
3472 sv_force_normal_flags(sv, 0);
3473 }
03cfe0ae
NIS
3474 s = (U8 *) SvPV(sv, len);
3475 if (!utf8_to_bytes(s, &len)) {
fa301091
JH
3476 if (fail_ok)
3477 return FALSE;
3478 else {
3479 if (PL_op)
3480 Perl_croak(aTHX_ "Wide character in %s",
53e06cf0 3481 OP_DESC(PL_op));
fa301091
JH
3482 else
3483 Perl_croak(aTHX_ "Wide character");
3484 }
4b3603a4 3485 }
b162af07 3486 SvCUR_set(sv, len);
67e989fb 3487 }
560a288e 3488 }
ffebcc3e 3489 SvUTF8_off(sv);
560a288e
GS
3490 return TRUE;
3491}
3492
c461cf8f
JH
3493/*
3494=for apidoc sv_utf8_encode
3495
78ea37eb
TS
3496Converts the PV of an SV to UTF-8, but then turns the C<SvUTF8>
3497flag off so that it looks like octets again.
c461cf8f
JH
3498
3499=cut
3500*/
3501
560a288e 3502void
7bc54cea 3503Perl_sv_utf8_encode(pTHX_ register SV *const sv)
560a288e 3504{
7918f24d
NC
3505 PERL_ARGS_ASSERT_SV_UTF8_ENCODE;
3506
4c94c214
NC
3507 if (SvIsCOW(sv)) {
3508 sv_force_normal_flags(sv, 0);
3509 }
3510 if (SvREADONLY(sv)) {
6ad8f254 3511 Perl_croak_no_modify(aTHX);
4c94c214 3512 }
a5f5288a 3513 (void) sv_utf8_upgrade(sv);
560a288e
GS
3514 SvUTF8_off(sv);
3515}
3516
4411f3b6
NIS
3517/*
3518=for apidoc sv_utf8_decode
3519
78ea37eb
TS
3520If the PV of the SV is an octet sequence in UTF-8
3521and contains a multiple-byte character, the C<SvUTF8> flag is turned on
3522so that it looks like a character. If the PV contains only single-byte
3523characters, the C<SvUTF8> flag stays being off.
3524Scans PV for validity and returns false if the PV is invalid UTF-8.
4411f3b6
NIS
3525
3526=cut
3527*/
3528
560a288e 3529bool
7bc54cea 3530Perl_sv_utf8_decode(pTHX_ register SV *const sv)
560a288e 3531{
7918f24d
NC
3532 PERL_ARGS_ASSERT_SV_UTF8_DECODE;
3533
78ea37eb 3534 if (SvPOKp(sv)) {
93524f2b
NC
3535 const U8 *c;
3536 const U8 *e;
9cbac4c7 3537
645c22ef
DM
3538 /* The octets may have got themselves encoded - get them back as
3539 * bytes
3540 */
3541 if (!sv_utf8_downgrade(sv, TRUE))
560a288e
GS
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 */
93524f2b 3547 c = (const U8 *) SvPVX_const(sv);
63cd0674 3548 if (!is_utf8_string(c, SvCUR(sv)+1))
67e989fb 3549 return FALSE;
93524f2b 3550 e = (const U8 *) SvEND(sv);
511c2ff0 3551 while (c < e) {
b64e5050 3552 const U8 ch = *c++;
c4d5f83a 3553 if (!UTF8_IS_INVARIANT(ch)) {
67e989fb
JH
3554 SvUTF8_on(sv);
3555 break;
3556 }
560a288e 3557 }
560a288e
GS
3558 }
3559 return TRUE;
3560}
3561
954c1994
GS
3562/*
3563=for apidoc sv_setsv
3564
645c22ef
DM
3565Copies the contents of the source SV C<ssv> into the destination SV
3566C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
3567function if the source SV needs to be reused. Does not handle 'set' magic.
3568Loosely speaking, it performs a copy-by-value, obliterating any previous
3569content of the destination.
3570
3571You probably want to use one of the assortment of wrappers, such as
3572C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3573C<SvSetMagicSV_nosteal>.
3574
8d6d96c1
HS
3575=for apidoc sv_setsv_flags
3576
645c22ef
DM
3577Copies the contents of the source SV C<ssv> into the destination SV
3578C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
3579function if the source SV needs to be reused. Does not handle 'set' magic.
3580Loosely speaking, it performs a copy-by-value, obliterating any previous
3581content of the destination.
3582If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
5fcdf167
NC
3583C<ssv> if appropriate, else not. If the C<flags> parameter has the
3584C<NOSTEAL> bit set then the buffers of temps will not be stolen. <sv_setsv>
3585and C<sv_setsv_nomg> are implemented in terms of this function.
645c22ef
DM
3586
3587You probably want to use one of the assortment of wrappers, such as
3588C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3589C<SvSetMagicSV_nosteal>.
3590
3591This is the primary function for copying scalars, and most other
3592copy-ish functions and macros use this underneath.
8d6d96c1
HS
3593
3594=cut
3595*/
3596
5d0301b7 3597static void
7bc54cea 3598S_glob_assign_glob(pTHX_ SV *const dstr, SV *const sstr, const int dtype)
5d0301b7 3599{
c8bbf675 3600 I32 mro_changes = 0; /* 1 = method, 2 = isa, 3 = recursive isa */
3e6edce2 3601 HV *old_stash = NULL;
dd69841b 3602
7918f24d
NC
3603 PERL_ARGS_ASSERT_GLOB_ASSIGN_GLOB;
3604
bec4f4b4 3605 if (dtype != SVt_PVGV && !isGV_with_GP(dstr)) {
5d0301b7
NC
3606 const char * const name = GvNAME(sstr);
3607 const STRLEN len = GvNAMELEN(sstr);
0d092c36 3608 {
f7877b28
NC
3609 if (dtype >= SVt_PV) {
3610 SvPV_free(dstr);
3611 SvPV_set(dstr, 0);
3612 SvLEN_set(dstr, 0);
3613 SvCUR_set(dstr, 0);
3614 }
0d092c36 3615 SvUPGRADE(dstr, SVt_PVGV);
dedf8e73 3616 (void)SvOK_off(dstr);
2e5b91de
NC
3617 /* FIXME - why are we doing this, then turning it off and on again
3618 below? */
3619 isGV_with_GP_on(dstr);
f7877b28 3620 }
5d0301b7
NC
3621 GvSTASH(dstr) = GvSTASH(sstr);
3622 if (GvSTASH(dstr))
daba3364 3623 Perl_sv_add_backref(aTHX_ MUTABLE_SV(GvSTASH(dstr)), dstr);
159b6efe 3624 gv_name_set(MUTABLE_GV(dstr), name, len, GV_ADD);
5d0301b7
NC
3625 SvFAKE_on(dstr); /* can coerce to non-glob */
3626 }
3627
159b6efe 3628 if(GvGP(MUTABLE_GV(sstr))) {
dd69841b
BB
3629 /* If source has method cache entry, clear it */
3630 if(GvCVGEN(sstr)) {
3631 SvREFCNT_dec(GvCV(sstr));
c43ae56f 3632 GvCV_set(sstr, NULL);
dd69841b
BB
3633 GvCVGEN(sstr) = 0;
3634 }
3635 /* If source has a real method, then a method is
3636 going to change */
00169e2c
FC
3637 else if(
3638 GvCV((const GV *)sstr) && GvSTASH(dstr) && HvENAME(GvSTASH(dstr))
3639 ) {
70cd14a1 3640 mro_changes = 1;
dd69841b
BB
3641 }
3642 }
3643
3644 /* If dest already had a real method, that's a change as well */
00169e2c
FC
3645 if(
3646 !mro_changes && GvGP(MUTABLE_GV(dstr)) && GvCVu((const GV *)dstr)
3647 && GvSTASH(dstr) && HvENAME(GvSTASH(dstr))
3648 ) {
70cd14a1 3649 mro_changes = 1;
dd69841b
BB
3650 }
3651
c8bbf675
FC
3652 /* We don’t need to check the name of the destination if it was not a
3653 glob to begin with. */
3654 if(dtype == SVt_PVGV) {
3655 const char * const name = GvNAME((const GV *)dstr);
00169e2c
FC
3656 if(
3657 strEQ(name,"ISA")
3658 /* The stash may have been detached from the symbol table, so
3659 check its name. */
3660 && GvSTASH(dstr) && HvENAME(GvSTASH(dstr))
6624142a 3661 && GvAV((const GV *)sstr)
00169e2c 3662 )
c8bbf675
FC
3663 mro_changes = 2;
3664 else {
3665 const STRLEN len = GvNAMELEN(dstr);
3666 if (len > 1 && name[len-2] == ':' && name[len-1] == ':') {
3667 mro_changes = 3;
3668
3669 /* Set aside the old stash, so we can reset isa caches on
3670 its subclasses. */
bf01568a
FC
3671 if((old_stash = GvHV(dstr)))
3672 /* Make sure we do not lose it early. */
3673 SvREFCNT_inc_simple_void_NN(
3674 sv_2mortal((SV *)old_stash)
3675 );
c8bbf675
FC
3676 }
3677 }
3678 }
70cd14a1 3679
159b6efe 3680 gp_free(MUTABLE_GV(dstr));
2e5b91de 3681 isGV_with_GP_off(dstr);
5d0301b7 3682 (void)SvOK_off(dstr);
2e5b91de 3683 isGV_with_GP_on(dstr);
dedf8e73 3684 GvINTRO_off(dstr); /* one-shot flag */
c43ae56f 3685 GvGP_set(dstr, gp_ref(GvGP(sstr)));
5d0301b7
NC
3686 if (SvTAINTED(sstr))
3687 SvTAINT(dstr);
3688 if (GvIMPORTED(dstr) != GVf_IMPORTED
3689 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3690 {
3691 GvIMPORTED_on(dstr);
3692 }
3693 GvMULTI_on(dstr);
6624142a
FC
3694 if(mro_changes == 2) {
3695 MAGIC *mg;
3696 SV * const sref = (SV *)GvAV((const GV *)dstr);
3697 if (SvSMAGICAL(sref) && (mg = mg_find(sref, PERL_MAGIC_isa))) {
3698 if (SvTYPE(mg->mg_obj) != SVt_PVAV) {
3699 AV * const ary = newAV();
3700 av_push(ary, mg->mg_obj); /* takes the refcount */
3701 mg->mg_obj = (SV *)ary;
3702 }
3703 av_push((AV *)mg->mg_obj, SvREFCNT_inc_simple_NN(dstr));
3704 }
3705 else sv_magic(sref, dstr, PERL_MAGIC_isa, NULL, 0);
3706 mro_isa_changed_in(GvSTASH(dstr));
3707 }
c8bbf675 3708 else if(mro_changes == 3) {
d056e33c 3709 HV * const stash = GvHV(dstr);
78b79c77 3710 if(old_stash ? (HV *)HvENAME_get(old_stash) : stash)
d056e33c 3711 mro_package_moved(
35759254 3712 stash, old_stash,
afdbe55d 3713 (GV *)dstr, 0
d056e33c 3714 );
c8bbf675 3715 }
70cd14a1 3716 else if(mro_changes) mro_method_changed_in(GvSTASH(dstr));
5d0301b7
NC
3717 return;
3718}
3719
b8473700 3720static void
7bc54cea 3721S_glob_assign_ref(pTHX_ SV *const dstr, SV *const sstr)
7918f24d 3722{
b8473700
NC
3723 SV * const sref = SvREFCNT_inc(SvRV(sstr));
3724 SV *dref = NULL;
3725 const int intro = GvINTRO(dstr);
2440974c 3726 SV **location;
3386d083 3727 U8 import_flag = 0;
27242d61
NC
3728 const U32 stype = SvTYPE(sref);
3729
7918f24d 3730 PERL_ARGS_ASSERT_GLOB_ASSIGN_REF;
b8473700 3731
b8473700
NC
3732 if (intro) {
3733 GvINTRO_off(dstr); /* one-shot flag */
3734 GvLINE(dstr) = CopLINE(PL_curcop);
159b6efe 3735 GvEGV(dstr) = MUTABLE_GV(dstr);
b8473700
NC
3736 }
3737 GvMULTI_on(dstr);
27242d61 3738 switch (stype) {
b8473700 3739 case SVt_PVCV:
c43ae56f 3740 location = (SV **) &(GvGP(dstr)->gp_cv); /* XXX bypassing GvCV_set */
27242d61
NC
3741 import_flag = GVf_IMPORTED_CV;
3742 goto common;
3743 case SVt_PVHV:
3744 location = (SV **) &GvHV(dstr);
3745 import_flag = GVf_IMPORTED_HV;
3746 goto common;
3747 case SVt_PVAV:
3748 location = (SV **) &GvAV(dstr);
3749 import_flag = GVf_IMPORTED_AV;
3750 goto common;
3751 case SVt_PVIO:
3752 location = (SV **) &GvIOp(dstr);
3753 goto common;
3754 case SVt_PVFM:
3755 location = (SV **) &GvFORM(dstr);
ef595a33 3756 goto common;
27242d61
NC
3757 default:
3758 location = &GvSV(dstr);
3759 import_flag = GVf_IMPORTED_SV;
3760 common:
b8473700 3761 if (intro) {
27242d61 3762 if (stype == SVt_PVCV) {
ea726b52 3763 /*if (GvCVGEN(dstr) && (GvCV(dstr) != (const CV *)sref || GvCVGEN(dstr))) {*/
5f2fca8a 3764 if (GvCVGEN(dstr)) {
27242d61 3765 SvREFCNT_dec(GvCV(dstr));
c43ae56f 3766 GvCV_set(dstr, NULL);
27242d61 3767 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
27242d61 3768 }
b8473700 3769 }
27242d61 3770 SAVEGENERICSV(*location);
b8473700
NC
3771 }
3772 else
27242d61 3773 dref = *location;
5f2fca8a 3774 if (stype == SVt_PVCV && (*location != sref || GvCVGEN(dstr))) {
ea726b52 3775 CV* const cv = MUTABLE_CV(*location);
b8473700 3776 if (cv) {
159b6efe 3777 if (!GvCVGEN((const GV *)dstr) &&
b8473700
NC
3778 (CvROOT(cv) || CvXSUB(cv)))
3779 {
3780 /* Redefining a sub - warning is mandatory if
3781 it was a const and its value changed. */
ea726b52 3782 if (CvCONST(cv) && CvCONST((const CV *)sref)
126f53f3
NC
3783 && cv_const_sv(cv)
3784 == cv_const_sv((const CV *)sref)) {
6f207bd3 3785 NOOP;
b8473700
NC
3786 /* They are 2 constant subroutines generated from
3787 the same constant. This probably means that
3788 they are really the "same" proxy subroutine
3789 instantiated in 2 places. Most likely this is
3790 when a constant is exported twice. Don't warn.
3791 */
3792 }
3793 else if (ckWARN(WARN_REDEFINE)
3794 || (CvCONST(cv)
ea726b52 3795 && (!CvCONST((const CV *)sref)
b8473700 3796 || sv_cmp(cv_const_sv(cv),
126f53f3
NC
3797 cv_const_sv((const CV *)
3798 sref))))) {
b8473700 3799 Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
10edeb5d
JH
3800 (const char *)
3801 (CvCONST(cv)
3802 ? "Constant subroutine %s::%s redefined"
3803 : "Subroutine %s::%s redefined"),
159b6efe
NC
3804 HvNAME_get(GvSTASH((const GV *)dstr)),
3805 GvENAME(MUTABLE_GV(dstr)));
b8473700
NC
3806 }
3807 }
3808 if (!intro)
159b6efe 3809 cv_ckproto_len(cv, (const GV *)dstr,
cbf82dd0
NC
3810 SvPOK(sref) ? SvPVX_const(sref) : NULL,
3811 SvPOK(sref) ? SvCUR(sref) : 0);
b8473700 3812 }
b8473700
NC
3813 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3814 GvASSUMECV_on(dstr);
dd69841b 3815 if(GvSTASH(dstr)) mro_method_changed_in(GvSTASH(dstr)); /* sub foo { 1 } sub bar { 2 } *bar = \&foo */
b8473700 3816 }
2440974c 3817 *location = sref;
3386d083
NC
3818 if (import_flag && !(GvFLAGS(dstr) & import_flag)
3819 && CopSTASH_ne(PL_curcop, GvSTASH(dstr))) {
3820 GvFLAGS(dstr) |= import_flag;
b8473700 3821 }
3e79609f
FC
3822 if (stype == SVt_PVHV) {
3823 const char * const name = GvNAME((GV*)dstr);
3824 const STRLEN len = GvNAMELEN(dstr);
d056e33c
FC
3825 if (
3826 len > 1 && name[len-2] == ':' && name[len-1] == ':'
78b79c77 3827 && (!dref || HvENAME_get(dref))
d056e33c
FC
3828 ) {
3829 mro_package_moved(
35759254 3830 (HV *)sref, (HV *)dref,
afdbe55d 3831 (GV *)dstr, 0
d056e33c 3832 );
3e79609f
FC
3833 }
3834 }
00169e2c 3835 else if (
a00c27eb
FC
3836 stype == SVt_PVAV && sref != dref
3837 && strEQ(GvNAME((GV*)dstr), "ISA")
00169e2c
FC
3838 /* The stash may have been detached from the symbol table, so
3839 check its name before doing anything. */
3840 && GvSTASH(dstr) && HvENAME(GvSTASH(dstr))
3841 ) {
6624142a 3842 MAGIC *mg;
a5dba54a
FC
3843 MAGIC * const omg = dref && SvSMAGICAL(dref)
3844 ? mg_find(dref, PERL_MAGIC_isa)
3845 : NULL;
6624142a
FC
3846 if (SvSMAGICAL(sref) && (mg = mg_find(sref, PERL_MAGIC_isa))) {
3847 if (SvTYPE(mg->mg_obj) != SVt_PVAV) {
3848 AV * const ary = newAV();
3849 av_push(ary, mg->mg_obj); /* takes the refcount */
3850 mg->mg_obj = (SV *)ary;
3851 }
a5dba54a
FC
3852 if (omg) {
3853 if (SvTYPE(omg->mg_obj) == SVt_PVAV) {
3854 SV **svp = AvARRAY((AV *)omg->mg_obj);
3855 I32 items = AvFILLp((AV *)omg->mg_obj) + 1;
3856 while (items--)
3857 av_push(
3858 (AV *)mg->mg_obj,
3859 SvREFCNT_inc_simple_NN(*svp++)
3860 );
3861 }
3862 else
3863 av_push(
3864 (AV *)mg->mg_obj,
3865 SvREFCNT_inc_simple_NN(omg->mg_obj)
3866 );
3867 }
3868 else
3869 av_push((AV *)mg->mg_obj,SvREFCNT_inc_simple_NN(dstr));
6624142a 3870 }
a5dba54a 3871 else
3e1892cc 3872 {
a5dba54a
FC
3873 sv_magic(
3874 sref, omg ? omg->mg_obj : dstr, PERL_MAGIC_isa, NULL, 0
3875 );
3e1892cc
FC
3876 mg = mg_find(sref, PERL_MAGIC_isa);
3877 }
a5dba54a
FC
3878 /* Since the *ISA assignment could have affected more than
3879 one stash, don’t call mro_isa_changed_in directly, but let
3e1892cc 3880 magic_clearisa do it for us, as it already has the logic for
a5dba54a 3881 dealing with globs vs arrays of globs. */
3e1892cc
FC
3882 assert(mg);
3883 Perl_magic_clearisa(aTHX_ NULL, mg);
d851b122 3884 }
b8473700
NC
3885 break;
3886 }
b37c2d43 3887 SvREFCNT_dec(dref);
b8473700
NC
3888 if (SvTAINTED(sstr))
3889 SvTAINT(dstr);
3890 return;
3891}
3892
8d6d96c1 3893void
7bc54cea 3894Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV* sstr, const I32 flags)
8d6d96c1 3895{
97aff369 3896 dVAR;
8990e307
LW
3897 register U32 sflags;
3898 register int dtype;
42d0e0b7 3899 register svtype stype;
463ee0b2 3900
7918f24d
NC
3901 PERL_ARGS_ASSERT_SV_SETSV_FLAGS;
3902
79072805
LW
3903 if (sstr == dstr)
3904 return;
29f4f0ab
NC
3905
3906 if (SvIS_FREED(dstr)) {
3907 Perl_croak(aTHX_ "panic: attempt to copy value %" SVf
be2597df 3908 " to a freed scalar %p", SVfARG(sstr), (void *)dstr);
29f4f0ab 3909 }
765f542d 3910 SV_CHECK_THINKFIRST_COW_DROP(dstr);
79072805 3911 if (!sstr)
3280af22 3912 sstr = &PL_sv_undef;
29f4f0ab 3913 if (SvIS_FREED(sstr)) {
6c9570dc
MHM
3914 Perl_croak(aTHX_ "panic: attempt to copy freed scalar %p to %p",
3915 (void*)sstr, (void*)dstr);
29f4f0ab 3916 }
8990e307
LW
3917 stype = SvTYPE(sstr);
3918 dtype = SvTYPE(dstr);
79072805 3919
52944de8 3920 (void)SvAMAGIC_off(dstr);
7a5fa8a2 3921 if ( SvVOK(dstr) )
ece467f9
JP
3922 {
3923 /* need to nuke the magic */
3924 mg_free(dstr);
ece467f9 3925 }
9e7bc3e8 3926
463ee0b2 3927 /* There's a lot of redundancy below but we're going for speed here */
79072805 3928
8990e307 3929 switch (stype) {
79072805 3930 case SVt_NULL:
aece5585 3931 undef_sstr:
13be902c 3932 if (dtype != SVt_PVGV && dtype != SVt_PVLV) {
20408e3c
GS
3933 (void)SvOK_off(dstr);
3934 return;
3935 }
3936 break;
463ee0b2 3937 case SVt_IV:
aece5585
GA
3938 if (SvIOK(sstr)) {
3939 switch (dtype) {
3940 case SVt_NULL:
8990e307 3941 sv_upgrade(dstr, SVt_IV);
aece5585
GA
3942 break;
3943 case SVt_NV:
aece5585 3944 case SVt_PV:
a0d0e21e 3945 sv_upgrade(dstr, SVt_PVIV);
aece5585 3946 break;
010be86b 3947 case SVt_PVGV:
13be902c 3948 case SVt_PVLV:
010be86b 3949 goto end_of_first_switch;
aece5585
GA
3950 }
3951 (void)SvIOK_only(dstr);
45977657 3952 SvIV_set(dstr, SvIVX(sstr));
25da4f38
IZ
3953 if (SvIsUV(sstr))
3954 SvIsUV_on(dstr);
37c25af0
NC
3955 /* SvTAINTED can only be true if the SV has taint magic, which in
3956 turn means that the SV type is PVMG (or greater). This is the
3957 case statement for SVt_IV, so this cannot be true (whatever gcov
3958 may say). */
3959 assert(!SvTAINTED(sstr));
aece5585 3960 return;
8990e307 3961 }
4df7f6af
NC
3962 if (!SvROK(sstr))
3963 goto undef_sstr;
3964 if (dtype < SVt_PV && dtype != SVt_IV)
3965 sv_upgrade(dstr, SVt_IV);
3966 break;
aece5585 3967
463ee0b2 3968 case SVt_NV:
aece5585
GA
3969 if (SvNOK(sstr)) {
3970 switch (dtype) {
3971 case SVt_NULL:
3972 case SVt_IV:
8990e307 3973 sv_upgrade(dstr, SVt_NV);
aece5585 3974 break;
aece5585
GA
3975 case SVt_PV:
3976 case SVt_PVIV:
a0d0e21e 3977 sv_upgrade(dstr, SVt_PVNV);
aece5585 3978 break;
010be86b 3979 case SVt_PVGV:
13be902c 3980 case SVt_PVLV:
010be86b 3981 goto end_of_first_switch;
aece5585 3982 }
9d6ce603 3983 SvNV_set(dstr, SvNVX(sstr));
aece5585 3984 (void)SvNOK_only(dstr);
37c25af0
NC
3985 /* SvTAINTED can only be true if the SV has taint magic, which in
3986 turn means that the SV type is PVMG (or greater). This is the
3987 case statement for SVt_NV, so this cannot be true (whatever gcov
3988 may say). */
3989 assert(!SvTAINTED(sstr));
aece5585 3990 return;
8990e307 3991 }
aece5585
GA
3992 goto undef_sstr;
3993
fc36a67e 3994 case SVt_PVFM:
f8c7b90f 3995#ifdef PERL_OLD_COPY_ON_WRITE
d89fc664
NC
3996 if ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS) {
3997 if (dtype < SVt_PVIV)
3998 sv_upgrade(dstr, SVt_PVIV);
3999 break;
4000 }
4001 /* Fall through */
4002#endif
4003 case SVt_PV:
8990e307 4004 if (dtype < SVt_PV)
463ee0b2 4005 sv_upgrade(dstr, SVt_PV);
463ee0b2
LW
4006 break;
4007 case SVt_PVIV:
8990e307 4008 if (dtype < SVt_PVIV)
463ee0b2 4009 sv_upgrade(dstr, SVt_PVIV);
463ee0b2
LW
4010 break;
4011 case SVt_PVNV:
8990e307 4012 if (dtype < SVt_PVNV)
463ee0b2 4013 sv_upgrade(dstr, SVt_PVNV);
463ee0b2 4014 break;
489f7bfe 4015 default:
a3b680e6
AL
4016 {
4017 const char * const type = sv_reftype(sstr,0);
533c011a 4018 if (PL_op)
94bbb3f4 4019 Perl_croak(aTHX_ "Bizarre copy of %s in %s", type, OP_DESC(PL_op));
4633a7c4 4020 else
a3b680e6
AL
4021 Perl_croak(aTHX_ "Bizarre copy of %s", type);
4022 }
4633a7c4
LW
4023 break;
4024
f0826785
BM
4025 case SVt_REGEXP:
4026 if (dtype < SVt_REGEXP)
4027 sv_upgrade(dstr, SVt_REGEXP);
4028 break;
4029
cecf5685 4030 /* case SVt_BIND: */
39cb70dc 4031 case SVt_PVLV:
79072805 4032 case SVt_PVGV:
cecf5685 4033 /* SvVALID means that this PVGV is playing at being an FBM. */
79072805 4034
489f7bfe 4035 case SVt_PVMG:
8d6d96c1 4036 if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
973f89ab 4037 mg_get(sstr);
13be902c 4038 if (SvTYPE(sstr) != stype)
973f89ab 4039 stype = SvTYPE(sstr);
5cf4b255
FC
4040 }
4041 if (isGV_with_GP(sstr) && dtype <= SVt_PVLV) {
d4c19fe8 4042 glob_assign_glob(dstr, sstr, dtype);
b8c701c1 4043 return;
973f89ab 4044 }
ded42b9f 4045 if (stype == SVt_PVLV)
862a34c6 4046 SvUPGRADE(dstr, SVt_PVNV);
ded42b9f 4047 else
42d0e0b7 4048 SvUPGRADE(dstr, (svtype)stype);
79072805 4049 }
010be86b 4050 end_of_first_switch:
79072805 4051
ff920335
NC
4052 /* dstr may have been upgraded. */
4053 dtype = SvTYPE(dstr);
8990e307
LW
4054 sflags = SvFLAGS(sstr);
4055
ba2fdce6 4056 if (dtype == SVt_PVCV || dtype == SVt_PVFM) {
85324b4d
NC
4057 /* Assigning to a subroutine sets the prototype. */
4058 if (SvOK(sstr)) {
4059 STRLEN len;
4060 const char *const ptr = SvPV_const(sstr, len);
4061
4062 SvGROW(dstr, len + 1);
4063 Copy(ptr, SvPVX(dstr), len + 1, char);
4064 SvCUR_set(dstr, len);
fcddd32e 4065 SvPOK_only(dstr);
ba2fdce6 4066 SvFLAGS(dstr) |= sflags & SVf_UTF8;
85324b4d
NC
4067 } else {
4068 SvOK_off(dstr);
4069 }
ba2fdce6
NC
4070 } else if (dtype == SVt_PVAV || dtype == SVt_PVHV) {
4071 const char * const type = sv_reftype(dstr,0);
4072 if (PL_op)
94bbb3f4 4073 Perl_croak(aTHX_ "Cannot copy to %s in %s", type, OP_DESC(PL_op));
ba2fdce6
NC
4074 else
4075 Perl_croak(aTHX_ "Cannot copy to %s", type);
85324b4d 4076 } else if (sflags & SVf_ROK) {
13be902c 4077 if (isGV_with_GP(dstr)
785bee4f 4078 && SvTYPE(SvRV(sstr)) == SVt_PVGV && isGV_with_GP(SvRV(sstr))) {
acaa9288
NC
4079 sstr = SvRV(sstr);
4080 if (sstr == dstr) {
4081 if (GvIMPORTED(dstr) != GVf_IMPORTED
4082 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4083 {
4084 GvIMPORTED_on(dstr);
4085 }
4086 GvMULTI_on(dstr);
4087 return;
4088 }
785bee4f
NC
4089 glob_assign_glob(dstr, sstr, dtype);
4090 return;
acaa9288
NC
4091 }
4092
8990e307 4093 if (dtype >= SVt_PV) {
13be902c 4094 if (isGV_with_GP(dstr)) {
d4c19fe8 4095 glob_assign_ref(dstr, sstr);
b8c701c1
NC
4096 return;
4097 }
3f7c398e 4098 if (SvPVX_const(dstr)) {
8bd4d4c5 4099 SvPV_free(dstr);
b162af07
SP
4100 SvLEN_set(dstr, 0);
4101 SvCUR_set(dstr, 0);
a0d0e21e 4102 }
8990e307 4103 }
a0d0e21e 4104 (void)SvOK_off(dstr);
b162af07 4105 SvRV_set(dstr, SvREFCNT_inc(SvRV(sstr)));
96d4b0ee 4106 SvFLAGS(dstr) |= sflags & SVf_ROK;
dfd48732
NC
4107 assert(!(sflags & SVp_NOK));
4108 assert(!(sflags & SVp_IOK));
4109 assert(!(sflags & SVf_NOK));
4110 assert(!(sflags & SVf_IOK));
ed6116ce 4111 }
13be902c 4112 else if (isGV_with_GP(dstr)) {
c0c44674 4113 if (!(sflags & SVf_OK)) {
a2a5de95
NC
4114 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
4115 "Undefined value assigned to typeglob");
c0c44674
NC
4116 }
4117 else {
4118 GV *gv = gv_fetchsv(sstr, GV_ADD, SVt_PVGV);
daba3364 4119 if (dstr != (const SV *)gv) {
3e79609f
FC
4120 const char * const name = GvNAME((const GV *)dstr);
4121 const STRLEN len = GvNAMELEN(dstr);
4122 HV *old_stash = NULL;
4123 bool reset_isa = FALSE;
4124 if (len > 1 && name[len-2] == ':' && name[len-1] == ':') {
4125 /* Set aside the old stash, so we can reset isa caches
4126 on its subclasses. */
c8eb3813 4127 if((old_stash = GvHV(dstr))) {
31f1461f
FC
4128 /* Make sure we do not lose it early. */
4129 SvREFCNT_inc_simple_void_NN(
4130 sv_2mortal((SV *)old_stash)
4131 );
c8eb3813 4132 }
3e79609f
FC
4133 reset_isa = TRUE;
4134 }
4135
c0c44674 4136 if (GvGP(dstr))
159b6efe 4137 gp_free(MUTABLE_GV(dstr));
c43ae56f 4138 GvGP_set(dstr, gp_ref(GvGP(gv)));
3e79609f
FC
4139
4140 if (reset_isa) {
d056e33c
FC
4141 HV * const stash = GvHV(dstr);
4142 if(
78b79c77 4143 old_stash ? (HV *)HvENAME_get(old_stash) : stash
d056e33c
FC
4144 )
4145 mro_package_moved(
35759254 4146 stash, old_stash,
afdbe55d 4147 (GV *)dstr, 0
d056e33c 4148 );
3e79609f 4149 }
c0c44674
NC
4150 }
4151 }
4152 }
f0826785
BM
4153 else if (dtype == SVt_REGEXP && stype == SVt_REGEXP) {
4154 reg_temp_copy((REGEXP*)dstr, (REGEXP*)sstr);
4155 }
8990e307 4156 else if (sflags & SVp_POK) {
765f542d 4157 bool isSwipe = 0;
79072805
LW
4158
4159 /*
4160 * Check to see if we can just swipe the string. If so, it's a
4161 * possible small lose on short strings, but a big win on long ones.
3f7c398e
SP
4162 * It might even be a win on short strings if SvPVX_const(dstr)
4163 * has to be allocated and SvPVX_const(sstr) has to be freed.
34482cd6
NC
4164 * Likewise if we can set up COW rather than doing an actual copy, we
4165 * drop to the else clause, as the swipe code and the COW setup code
4166 * have much in common.
79072805
LW
4167 */
4168
120fac95
NC
4169 /* Whichever path we take through the next code, we want this true,
4170 and doing it now facilitates the COW check. */
4171 (void)SvPOK_only(dstr);
4172
765f542d 4173 if (
34482cd6
NC
4174 /* If we're already COW then this clause is not true, and if COW
4175 is allowed then we drop down to the else and make dest COW
4176 with us. If caller hasn't said that we're allowed to COW
4177 shared hash keys then we don't do the COW setup, even if the
4178 source scalar is a shared hash key scalar. */
4179 (((flags & SV_COW_SHARED_HASH_KEYS)
4180 ? (sflags & (SVf_FAKE|SVf_READONLY)) != (SVf_FAKE|SVf_READONLY)
4181 : 1 /* If making a COW copy is forbidden then the behaviour we
4182 desire is as if the source SV isn't actually already
4183 COW, even if it is. So we act as if the source flags
4184 are not COW, rather than actually testing them. */
4185 )
f8c7b90f 4186#ifndef PERL_OLD_COPY_ON_WRITE
34482cd6
NC
4187 /* The change that added SV_COW_SHARED_HASH_KEYS makes the logic
4188 when PERL_OLD_COPY_ON_WRITE is defined a little wrong.
4189 Conceptually PERL_OLD_COPY_ON_WRITE being defined should
4190 override SV_COW_SHARED_HASH_KEYS, because it means "always COW"
4191 but in turn, it's somewhat dead code, never expected to go
4192 live, but more kept as a placeholder on how to do it better
4193 in a newer implementation. */
4194 /* If we are COW and dstr is a suitable target then we drop down
4195 into the else and make dest a COW of us. */
b8f9541a
NC
4196 || (SvFLAGS(dstr) & CAN_COW_MASK) != CAN_COW_FLAGS
4197#endif
4198 )
765f542d 4199 &&
765f542d
NC
4200 !(isSwipe =
4201 (sflags & SVs_TEMP) && /* slated for free anyway? */
4202 !(sflags & SVf_OOK) && /* and not involved in OOK hack? */
5fcdf167
NC
4203 (!(flags & SV_NOSTEAL)) &&
4204 /* and we're allowed to steal temps */
765f542d 4205 SvREFCNT(sstr) == 1 && /* and no other references to it? */
61e5f455 4206 SvLEN(sstr)) /* and really is a string */
f8c7b90f 4207#ifdef PERL_OLD_COPY_ON_WRITE
cb23d5b1
NC
4208 && ((flags & SV_COW_SHARED_HASH_KEYS)
4209 ? (!((sflags & CAN_COW_MASK) == CAN_COW_FLAGS
4210 && (SvFLAGS(dstr) & CAN_COW_MASK) == CAN_COW_FLAGS
4b1c7d9e 4211 && SvTYPE(sstr) >= SVt_PVIV && SvTYPE(sstr) != SVt_PVFM))
cb23d5b1 4212 : 1)
765f542d
NC
4213#endif
4214 ) {
4215 /* Failed the swipe test, and it's not a shared hash key either.
4216 Have to copy the string. */
4217 STRLEN len = SvCUR(sstr);
4218 SvGROW(dstr, len + 1); /* inlined from sv_setpvn */
3f7c398e 4219 Move(SvPVX_const(sstr),SvPVX(dstr),len,char);
765f542d
NC
4220 SvCUR_set(dstr, len);
4221 *SvEND(dstr) = '\0';
765f542d 4222 } else {
f8c7b90f 4223 /* If PERL_OLD_COPY_ON_WRITE is not defined, then isSwipe will always
765f542d 4224 be true in here. */
765f542d
NC
4225 /* Either it's a shared hash key, or it's suitable for
4226 copy-on-write or we can swipe the string. */
46187eeb 4227 if (DEBUG_C_TEST) {
ed252734 4228 PerlIO_printf(Perl_debug_log, "Copy on write: sstr --> dstr\n");
e419cbc5
NC
4229 sv_dump(sstr);
4230 sv_dump(dstr);
46187eeb 4231 }
f8c7b90f 4232#ifdef PERL_OLD_COPY_ON_WRITE
765f542d 4233 if (!isSwipe) {
765f542d
NC
4234 if ((sflags & (SVf_FAKE | SVf_READONLY))
4235 != (SVf_FAKE | SVf_READONLY)) {
4236 SvREADONLY_on(sstr);
4237 SvFAKE_on(sstr);
4238 /* Make the source SV into a loop of 1.
4239 (about to become 2) */
a29f6d03 4240 SV_COW_NEXT_SV_SET(sstr, sstr);
765f542d
NC
4241 }
4242 }
4243#endif
4244 /* Initial code is common. */
94010e71
NC
4245 if (SvPVX_const(dstr)) { /* we know that dtype >= SVt_PV */
4246 SvPV_free(dstr);
79072805 4247 }
765f542d 4248
765f542d
NC
4249 if (!isSwipe) {
4250 /* making another shared SV. */
4251 STRLEN cur = SvCUR(sstr);
4252 STRLEN len = SvLEN(sstr);
f8c7b90f 4253#ifdef PERL_OLD_COPY_ON_WRITE
765f542d 4254 if (len) {
b8f9541a 4255 assert (SvTYPE(dstr) >= SVt_PVIV);
765f542d
NC
4256 /* SvIsCOW_normal */
4257 /* splice us in between source and next-after-source. */
a29f6d03
NC
4258 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4259 SV_COW_NEXT_SV_SET(sstr, dstr);
940132f3 4260 SvPV_set(dstr, SvPVX_mutable(sstr));
a604c751
NC
4261 } else
4262#endif
4263 {
765f542d 4264 /* SvIsCOW_shared_hash */
46187eeb
NC
4265 DEBUG_C(PerlIO_printf(Perl_debug_log,
4266 "Copy on write: Sharing hash\n"));
b8f9541a 4267
bdd68bc3 4268 assert (SvTYPE(dstr) >= SVt_PV);
765f542d 4269 SvPV_set(dstr,
d1db91c6 4270 HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)))));
bdd68bc3 4271 }
87a1ef3d
SP
4272 SvLEN_set(dstr, len);
4273 SvCUR_set(dstr, cur);
765f542d
NC
4274 SvREADONLY_on(dstr);
4275 SvFAKE_on(dstr);
765f542d
NC
4276 }
4277 else
765f542d 4278 { /* Passes the swipe test. */
78d1e721 4279 SvPV_set(dstr, SvPVX_mutable(sstr));
765f542d
NC
4280 SvLEN_set(dstr, SvLEN(sstr));
4281 SvCUR_set(dstr, SvCUR(sstr));
4282
4283 SvTEMP_off(dstr);
4284 (void)SvOK_off(sstr); /* NOTE: nukes most SvFLAGS on sstr */
6136c704 4285 SvPV_set(sstr, NULL);
765f542d
NC
4286 SvLEN_set(sstr, 0);
4287 SvCUR_set(sstr, 0);
4288 SvTEMP_off(sstr);
4289 }
4290 }
8990e307 4291 if (sflags & SVp_NOK) {
9d6ce603 4292 SvNV_set(dstr, SvNVX(sstr));
79072805 4293 }
8990e307 4294 if (sflags & SVp_IOK) {
23525414
NC
4295 SvIV_set(dstr, SvIVX(sstr));
4296 /* Must do this otherwise some other overloaded use of 0x80000000
4297 gets confused. I guess SVpbm_VALID */
2b1c7e3e 4298 if (sflags & SVf_IVisUV)
25da4f38 4299 SvIsUV_on(dstr);
79072805 4300 }
96d4b0ee 4301 SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_NOK|SVp_NOK|SVf_UTF8);
4f2da183 4302 {
b0a11fe1 4303 const MAGIC * const smg = SvVSTRING_mg(sstr);
4f2da183
NC
4304 if (smg) {
4305 sv_magic(dstr, NULL, PERL_MAGIC_vstring,
4306 smg->mg_ptr, smg->mg_len);
4307 SvRMAGICAL_on(dstr);
4308 }
7a5fa8a2 4309 }
79072805 4310 }
5d581361 4311 else if (sflags & (SVp_IOK|SVp_NOK)) {
c2468cc7 4312 (void)SvOK_off(dstr);
96d4b0ee 4313 SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_IVisUV|SVf_NOK|SVp_NOK);
5d581361
NC
4314 if (sflags & SVp_IOK) {
4315 /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
4316 SvIV_set(dstr, SvIVX(sstr));
4317 }
3332b3c1 4318 if (sflags & SVp_NOK) {
9d6ce603 4319 SvNV_set(dstr, SvNVX(sstr));
3332b3c1
JH
4320 }
4321 }
79072805 4322 else {
f7877b28 4323 if (isGV_with_GP(sstr)) {
180488f8
NC
4324 /* This stringification rule for globs is spread in 3 places.
4325 This feels bad. FIXME. */
4326 const U32 wasfake = sflags & SVf_FAKE;
4327
4328 /* FAKE globs can get coerced, so need to turn this off
4329 temporarily if it is on. */
4330 SvFAKE_off(sstr);
159b6efe 4331 gv_efullname3(dstr, MUTABLE_GV(sstr), "*");
180488f8
NC
4332 SvFLAGS(sstr) |= wasfake;
4333 }
20408e3c
GS
4334 else
4335 (void)SvOK_off(dstr);
a0d0e21e 4336 }
27c9684d
AP
4337 if (SvTAINTED(sstr))
4338 SvTAINT(dstr);
79072805
LW
4339}
4340
954c1994
GS
4341/*
4342=for apidoc sv_setsv_mg
4343
4344Like C<sv_setsv>, but also handles 'set' magic.
4345
4346=cut
4347*/
4348
79072805 4349void
7bc54cea 4350Perl_sv_setsv_mg(pTHX_ SV *const dstr, register SV *const sstr)
ef50df4b 4351{
7918f24d
NC
4352 PERL_ARGS_ASSERT_SV_SETSV_MG;
4353
ef50df4b
GS
4354 sv_setsv(dstr,sstr);
4355 SvSETMAGIC(dstr);
4356}
4357
f8c7b90f 4358#ifdef PERL_OLD_COPY_ON_WRITE
ed252734
NC
4359SV *
4360Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
4361{
4362 STRLEN cur = SvCUR(sstr);
4363 STRLEN len = SvLEN(sstr);
4364 register char *new_pv;
4365
7918f24d
NC
4366 PERL_ARGS_ASSERT_SV_SETSV_COW;
4367
ed252734
NC
4368 if (DEBUG_C_TEST) {
4369 PerlIO_printf(Perl_debug_log, "Fast copy on write: %p -> %p\n",
6c9570dc 4370 (void*)sstr, (void*)dstr);
ed252734
NC
4371 sv_dump(sstr);
4372 if (dstr)
4373 sv_dump(dstr);
4374 }
4375
4376 if (dstr) {
4377 if (SvTHINKFIRST(dstr))
4378 sv_force_normal_flags(dstr, SV_COW_DROP_PV);
3f7c398e
SP
4379 else if (SvPVX_const(dstr))
4380 Safefree(SvPVX_const(dstr));
ed252734
NC
4381 }
4382 else
4383 new_SV(dstr);
862a34c6 4384 SvUPGRADE(dstr, SVt_PVIV);
ed252734
NC
4385
4386 assert (SvPOK(sstr));
4387 assert (SvPOKp(sstr));
4388 assert (!SvIOK(sstr));
4389 assert (!SvIOKp(sstr));
4390 assert (!SvNOK(sstr));
4391 assert (!SvNOKp(sstr));
4392
4393 if (SvIsCOW(sstr)) {
4394
4395 if (SvLEN(sstr) == 0) {
4396 /* source is a COW shared hash key. */
ed252734
NC
4397 DEBUG_C(PerlIO_printf(Perl_debug_log,
4398 "Fast copy on write: Sharing hash\n"));
d1db91c6 4399 new_pv = HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr))));
ed252734
NC
4400 goto common_exit;
4401 }
4402 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4403 } else {
4404 assert ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS);
862a34c6 4405 SvUPGRADE(sstr, SVt_PVIV);
ed252734
NC
4406 SvREADONLY_on(sstr);
4407 SvFAKE_on(sstr);
4408 DEBUG_C(PerlIO_printf(Perl_debug_log,
4409 "Fast copy on write: Converting sstr to COW\n"));
4410 SV_COW_NEXT_SV_SET(dstr, sstr);
4411 }
4412 SV_COW_NEXT_SV_SET(sstr, dstr);
940132f3 4413 new_pv = SvPVX_mutable(sstr);
ed252734
NC
4414
4415 common_exit:
4416 SvPV_set(dstr, new_pv);
4417 SvFLAGS(dstr) = (SVt_PVIV|SVf_POK|SVp_POK|SVf_FAKE|SVf_READONLY);
4418 if (SvUTF8(sstr))
4419 SvUTF8_on(dstr);
87a1ef3d
SP
4420 SvLEN_set(dstr, len);
4421 SvCUR_set(dstr, cur);
ed252734
NC
4422 if (DEBUG_C_TEST) {
4423 sv_dump(dstr);
4424 }
4425 return dstr;
4426}
4427#endif
4428
954c1994
GS
4429/*
4430=for apidoc sv_setpvn
4431
4432Copies a string into an SV. The C<len> parameter indicates the number of
9e09f5f2
MHM
4433bytes to be copied. If the C<ptr> argument is NULL the SV will become
4434undefined. Does not handle 'set' magic. See C<sv_setpvn_mg>.
954c1994
GS
4435
4436=cut
4437*/
4438
ef50df4b 4439void
2e000ff2 4440Perl_sv_setpvn(pTHX_ register SV *const sv, register const char *const ptr, register const STRLEN len)
79072805 4441{
97aff369 4442 dVAR;
c6f8c383 4443 register char *dptr;
22c522df 4444
7918f24d
NC
4445 PERL_ARGS_ASSERT_SV_SETPVN;
4446
765f542d 4447 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 4448 if (!ptr) {
a0d0e21e 4449 (void)SvOK_off(sv);
463ee0b2
LW
4450 return;
4451 }
22c522df
JH
4452 else {
4453 /* len is STRLEN which is unsigned, need to copy to signed */
a3b680e6 4454 const IV iv = len;
9c5ffd7c
JH
4455 if (iv < 0)
4456 Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen");
22c522df 4457 }
862a34c6 4458 SvUPGRADE(sv, SVt_PV);
c6f8c383 4459
5902b6a9 4460 dptr = SvGROW(sv, len + 1);
c6f8c383
GA
4461 Move(ptr,dptr,len,char);
4462 dptr[len] = '\0';
79072805 4463 SvCUR_set(sv, len);
1aa99e6b 4464 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4465 SvTAINT(sv);
79072805
LW
4466}
4467
954c1994
GS
4468/*
4469=for apidoc sv_setpvn_mg
4470
4471Like C<sv_setpvn>, but also handles 'set' magic.
4472
4473=cut
4474*/
4475
79072805 4476void
2e000ff2 4477Perl_sv_setpvn_mg(pTHX_ register SV *const sv, register const char *const ptr, register const STRLEN len)
ef50df4b 4478{
7918f24d
NC
4479 PERL_ARGS_ASSERT_SV_SETPVN_MG;
4480
ef50df4b
GS
4481 sv_setpvn(sv,ptr,len);
4482 SvSETMAGIC(sv);
4483}
4484
954c1994
GS
4485/*
4486=for apidoc sv_setpv
4487
4488Copies a string into an SV. The string must be null-terminated. Does not
4489handle 'set' magic. See C<sv_setpv_mg>.
4490
4491=cut
4492*/
4493
ef50df4b 4494void
2e000ff2 4495Perl_sv_setpv(pTHX_ register SV *const sv, register const char *const ptr)
79072805 4496{
97aff369 4497 dVAR;
79072805
LW
4498 register STRLEN len;
4499
7918f24d
NC
4500 PERL_ARGS_ASSERT_SV_SETPV;
4501
765f542d 4502 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 4503 if (!ptr) {
a0d0e21e 4504 (void)SvOK_off(sv);
463ee0b2
LW
4505 return;
4506 }
79072805 4507 len = strlen(ptr);
862a34c6 4508 SvUPGRADE(sv, SVt_PV);
c6f8c383 4509
79072805 4510 SvGROW(sv, len + 1);
463ee0b2 4511 Move(ptr,SvPVX(sv),len+1,char);
79072805 4512 SvCUR_set(sv, len);
1aa99e6b 4513 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2
LW
4514 SvTAINT(sv);
4515}
4516
954c1994
GS
4517/*
4518=for apidoc sv_setpv_mg
4519
4520Like C<sv_setpv>, but also handles 'set' magic.
4521
4522=cut
4523*/
4524
463ee0b2 4525void
2e000ff2 4526Perl_sv_setpv_mg(pTHX_ register SV *const sv, register const char *const ptr)
ef50df4b 4527{
7918f24d
NC
4528 PERL_ARGS_ASSERT_SV_SETPV_MG;
4529
ef50df4b
GS
4530 sv_setpv(sv,ptr);
4531 SvSETMAGIC(sv);
4532}
4533
954c1994 4534/*
47518d95 4535=for apidoc sv_usepvn_flags
954c1994 4536
794a0d33
JH
4537Tells an SV to use C<ptr> to find its string value. Normally the
4538string is stored inside the SV but sv_usepvn allows the SV to use an
4539outside string. The C<ptr> should point to memory that was allocated
c1c21316
NC
4540by C<malloc>. The string length, C<len>, must be supplied. By default
4541this function will realloc (i.e. move) the memory pointed to by C<ptr>,
794a0d33
JH
4542so that pointer should not be freed or used by the programmer after
4543giving it to sv_usepvn, and neither should any pointers from "behind"
c1c21316
NC
4544that pointer (e.g. ptr + 1) be used.
4545
4546If C<flags> & SV_SMAGIC is true, will call SvSETMAGIC. If C<flags> &
4547SV_HAS_TRAILING_NUL is true, then C<ptr[len]> must be NUL, and the realloc
cbf82dd0 4548will be skipped. (i.e. the buffer is actually at least 1 byte longer than
c1c21316 4549C<len>, and already meets the requirements for storing in C<SvPVX>)
954c1994
GS
4550
4551=cut
4552*/
4553
ef50df4b 4554void
2e000ff2 4555Perl_sv_usepvn_flags(pTHX_ SV *const sv, char *ptr, const STRLEN len, const U32 flags)
463ee0b2 4556{
97aff369 4557 dVAR;
1936d2a7 4558 STRLEN allocate;
7918f24d
NC
4559
4560 PERL_ARGS_ASSERT_SV_USEPVN_FLAGS;
4561
765f542d 4562 SV_CHECK_THINKFIRST_COW_DROP(sv);
862a34c6 4563 SvUPGRADE(sv, SVt_PV);
463ee0b2 4564 if (!ptr) {
a0d0e21e 4565 (void)SvOK_off(sv);
47518d95
NC
4566 if (flags & SV_SMAGIC)
4567 SvSETMAGIC(sv);
463ee0b2
LW
4568 return;
4569 }
3f7c398e 4570 if (SvPVX_const(sv))
8bd4d4c5 4571 SvPV_free(sv);
1936d2a7 4572
0b7042f9 4573#ifdef DEBUGGING
2e90b4cd
NC
4574 if (flags & SV_HAS_TRAILING_NUL)
4575 assert(ptr[len] == '\0');
0b7042f9 4576#endif
2e90b4cd 4577
c1c21316 4578 allocate = (flags & SV_HAS_TRAILING_NUL)
5d487c26 4579 ? len + 1 :
ca7c1a29 4580#ifdef Perl_safesysmalloc_size
5d487c26
NC
4581 len + 1;
4582#else
4583 PERL_STRLEN_ROUNDUP(len + 1);
4584#endif
cbf82dd0
NC
4585 if (flags & SV_HAS_TRAILING_NUL) {
4586 /* It's long enough - do nothing.
486ec47a 4587 Specifically Perl_newCONSTSUB is relying on this. */
cbf82dd0 4588 } else {
69d25b4f 4589#ifdef DEBUGGING
69d25b4f 4590 /* Force a move to shake out bugs in callers. */
10edeb5d 4591 char *new_ptr = (char*)safemalloc(allocate);
69d25b4f
NC
4592 Copy(ptr, new_ptr, len, char);
4593 PoisonFree(ptr,len,char);
4594 Safefree(ptr);
4595 ptr = new_ptr;
69d25b4f 4596#else
10edeb5d 4597 ptr = (char*) saferealloc (ptr, allocate);
69d25b4f 4598#endif
cbf82dd0 4599 }
ca7c1a29
NC
4600#ifdef Perl_safesysmalloc_size
4601 SvLEN_set(sv, Perl_safesysmalloc_size(ptr));
5d487c26 4602#else
1936d2a7 4603 SvLEN_set(sv, allocate);
5d487c26
NC
4604#endif
4605 SvCUR_set(sv, len);
4606 SvPV_set(sv, ptr);
c1c21316 4607 if (!(flags & SV_HAS_TRAILING_NUL)) {
97a130b8 4608 ptr[len] = '\0';
c1c21316 4609 }
1aa99e6b 4610 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4611 SvTAINT(sv);
47518d95
NC
4612 if (flags & SV_SMAGIC)
4613 SvSETMAGIC(sv);
ef50df4b
GS
4614}
4615
f8c7b90f 4616#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
4617/* Need to do this *after* making the SV normal, as we need the buffer
4618 pointer to remain valid until after we've copied it. If we let go too early,
4619 another thread could invalidate it by unsharing last of the same hash key
4620 (which it can do by means other than releasing copy-on-write Svs)
4621 or by changing the other copy-on-write SVs in the loop. */
4622STATIC void
5302ffd4 4623S_sv_release_COW(pTHX_ register SV *sv, const char *pvx, SV *after)
765f542d 4624{
7918f24d
NC
4625 PERL_ARGS_ASSERT_SV_RELEASE_COW;
4626
5302ffd4 4627 { /* this SV was SvIsCOW_normal(sv) */
765f542d 4628 /* we need to find the SV pointing to us. */
cf5629ad 4629 SV *current = SV_COW_NEXT_SV(after);
7a5fa8a2 4630
765f542d
NC
4631 if (current == sv) {
4632 /* The SV we point to points back to us (there were only two of us
4633 in the loop.)
4634 Hence other SV is no longer copy on write either. */
4635 SvFAKE_off(after);
4636 SvREADONLY_off(after);
4637 } else {
4638 /* We need to follow the pointers around the loop. */
4639 SV *next;
4640 while ((next = SV_COW_NEXT_SV(current)) != sv) {
4641 assert (next);
4642 current = next;
4643 /* don't loop forever if the structure is bust, and we have
4644 a pointer into a closed loop. */
4645 assert (current != after);
3f7c398e 4646 assert (SvPVX_const(current) == pvx);
765f542d
NC
4647 }
4648 /* Make the SV before us point to the SV after us. */
a29f6d03 4649 SV_COW_NEXT_SV_SET(current, after);
765f542d 4650 }
765f542d
NC
4651 }
4652}
765f542d 4653#endif
645c22ef
DM
4654/*
4655=for apidoc sv_force_normal_flags
4656
4657Undo various types of fakery on an SV: if the PV is a shared string, make
4658a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
765f542d
NC
4659an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
4660we do the copy, and is also used locally. If C<SV_COW_DROP_PV> is set
4661then a copy-on-write scalar drops its PV buffer (if any) and becomes
4662SvPOK_off rather than making a copy. (Used where this scalar is about to be
d3050d9d 4663set to some other value.) In addition, the C<flags> parameter gets passed to
4082acab 4664C<sv_unref_flags()> when unreffing. C<sv_force_normal> calls this function
765f542d 4665with flags set to 0.
645c22ef
DM
4666
4667=cut
4668*/
4669
6fc92669 4670void
2e000ff2 4671Perl_sv_force_normal_flags(pTHX_ register SV *const sv, const U32 flags)
0f15f207 4672{
97aff369 4673 dVAR;
7918f24d
NC
4674
4675 PERL_ARGS_ASSERT_SV_FORCE_NORMAL_FLAGS;
4676
f8c7b90f 4677#ifdef PERL_OLD_COPY_ON_WRITE
765f542d 4678 if (SvREADONLY(sv)) {
765f542d 4679 if (SvFAKE(sv)) {
b64e5050 4680 const char * const pvx = SvPVX_const(sv);
a28509cc
AL
4681 const STRLEN len = SvLEN(sv);
4682 const STRLEN cur = SvCUR(sv);
5302ffd4
NC
4683 /* next COW sv in the loop. If len is 0 then this is a shared-hash
4684 key scalar, so we mustn't attempt to call SV_COW_NEXT_SV(), as
4685 we'll fail an assertion. */
4686 SV * const next = len ? SV_COW_NEXT_SV(sv) : 0;
4687
46187eeb
NC
4688 if (DEBUG_C_TEST) {
4689 PerlIO_printf(Perl_debug_log,
4690 "Copy on write: Force normal %ld\n",
4691 (long) flags);
e419cbc5 4692 sv_dump(sv);
46187eeb 4693 }
765f542d
NC
4694 SvFAKE_off(sv);
4695 SvREADONLY_off(sv);
9f653bb5 4696 /* This SV doesn't own the buffer, so need to Newx() a new one: */
6136c704 4697 SvPV_set(sv, NULL);
87a1ef3d 4698 SvLEN_set(sv, 0);
765f542d
NC
4699 if (flags & SV_COW_DROP_PV) {
4700 /* OK, so we don't need to copy our buffer. */
4701 SvPOK_off(sv);
4702 } else {
4703 SvGROW(sv, cur + 1);
4704 Move(pvx,SvPVX(sv),cur,char);
87a1ef3d 4705 SvCUR_set(sv, cur);
765f542d
NC
4706 *SvEND(sv) = '\0';
4707 }
5302ffd4
NC
4708 if (len) {
4709 sv_release_COW(sv, pvx, next);
4710 } else {
4711 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
4712 }
46187eeb 4713 if (DEBUG_C_TEST) {
e419cbc5 4714 sv_dump(sv);
46187eeb 4715 }
765f542d 4716 }
923e4eb5 4717 else if (IN_PERL_RUNTIME)
6ad8f254 4718 Perl_croak_no_modify(aTHX);
765f542d
NC
4719 }
4720#else
2213622d 4721 if (SvREADONLY(sv)) {
1c846c1f 4722 if (SvFAKE(sv)) {
b64e5050 4723 const char * const pvx = SvPVX_const(sv);
66a1b24b 4724 const STRLEN len = SvCUR(sv);
10bcdfd6
NC
4725 SvFAKE_off(sv);
4726 SvREADONLY_off(sv);
bd61b366 4727 SvPV_set(sv, NULL);
66a1b24b 4728 SvLEN_set(sv, 0);
1c846c1f 4729 SvGROW(sv, len + 1);
706aa1c9 4730 Move(pvx,SvPVX(sv),len,char);
1c846c1f 4731 *SvEND(sv) = '\0';
bdd68bc3 4732 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
1c846c1f 4733 }
923e4eb5 4734 else if (IN_PERL_RUNTIME)
6ad8f254 4735 Perl_croak_no_modify(aTHX);
0f15f207 4736 }
765f542d 4737#endif
2213622d 4738 if (SvROK(sv))
840a7b70 4739 sv_unref_flags(sv, flags);
13be902c 4740 else if (SvFAKE(sv) && isGV_with_GP(sv))
6fc92669 4741 sv_unglob(sv);
b9ad13ac 4742 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_REGEXP) {
486ec47a 4743 /* Need to downgrade the REGEXP to a simple(r) scalar. This is analogous
b9ad13ac
NC
4744 to sv_unglob. We only need it here, so inline it. */
4745 const svtype new_type = SvMAGIC(sv) || SvSTASH(sv) ? SVt_PVMG : SVt_PV;
4746 SV *const temp = newSV_type(new_type);
4747 void *const temp_p = SvANY(sv);
4748
4749 if (new_type == SVt_PVMG) {
4750 SvMAGIC_set(temp, SvMAGIC(sv));
4751 SvMAGIC_set(sv, NULL);
4752 SvSTASH_set(temp, SvSTASH(sv));
4753 SvSTASH_set(sv, NULL);
4754 }
4755 SvCUR_set(temp, SvCUR(sv));
4756 /* Remember that SvPVX is in the head, not the body. */
4757 if (SvLEN(temp)) {
4758 SvLEN_set(temp, SvLEN(sv));
4759 /* This signals "buffer is owned by someone else" in sv_clear,
4760 which is the least effort way to stop it freeing the buffer.
4761 */
4762 SvLEN_set(sv, SvLEN(sv)+1);
4763 } else {
4764 /* Their buffer is already owned by someone else. */
4765 SvPVX(sv) = savepvn(SvPVX(sv), SvCUR(sv));
4766 SvLEN_set(temp, SvCUR(sv)+1);
4767 }
4768
4769 /* Now swap the rest of the bodies. */
4770
4771 SvFLAGS(sv) &= ~(SVf_FAKE|SVTYPEMASK);
4772 SvFLAGS(sv) |= new_type;
4773 SvANY(sv) = SvANY(temp);
4774
4775 SvFLAGS(temp) &= ~(SVTYPEMASK);
4776 SvFLAGS(temp) |= SVt_REGEXP|SVf_FAKE;
4777 SvANY(temp) = temp_p;
4778
4779 SvREFCNT_dec(temp);
4780 }
0f15f207 4781}
1c846c1f 4782
645c22ef 4783/*
954c1994
GS
4784=for apidoc sv_chop
4785
1c846c1f 4786Efficient removal of characters from the beginning of the string buffer.
954c1994
GS
4787SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
4788the string buffer. The C<ptr> becomes the first character of the adjusted
645c22ef 4789string. Uses the "OOK hack".
3f7c398e 4790Beware: after this function returns, C<ptr> and SvPVX_const(sv) may no longer
31869a79 4791refer to the same chunk of data.
954c1994
GS
4792
4793=cut
4794*/
4795
79072805 4796void
2e000ff2 4797Perl_sv_chop(pTHX_ register SV *const sv, register const char *const ptr)
79072805 4798{
69240efd
NC
4799 STRLEN delta;
4800 STRLEN old_delta;
7a4bba22
NC
4801 U8 *p;
4802#ifdef DEBUGGING
4803 const U8 *real_start;
4804#endif
6c65d5f9 4805 STRLEN max_delta;
7a4bba22 4806
7918f24d
NC
4807 PERL_ARGS_ASSERT_SV_CHOP;
4808
a0d0e21e 4809 if (!ptr || !SvPOKp(sv))
79072805 4810 return;
3f7c398e 4811 delta = ptr - SvPVX_const(sv);
15895f8a
NC
4812 if (!delta) {
4813 /* Nothing to do. */
4814 return;
4815 }
6c65d5f9
NC
4816 /* SvPVX(sv) may move in SV_CHECK_THINKFIRST(sv), but after this line,
4817 nothing uses the value of ptr any more. */
837cb3ba 4818 max_delta = SvLEN(sv) ? SvLEN(sv) : SvCUR(sv);
6c65d5f9
NC
4819 if (ptr <= SvPVX_const(sv))
4820 Perl_croak(aTHX_ "panic: sv_chop ptr=%p, start=%p, end=%p",
4821 ptr, SvPVX_const(sv), SvPVX_const(sv) + max_delta);
2213622d 4822 SV_CHECK_THINKFIRST(sv);
6c65d5f9
NC
4823 if (delta > max_delta)
4824 Perl_croak(aTHX_ "panic: sv_chop ptr=%p (was %p), start=%p, end=%p",
4825 SvPVX_const(sv) + delta, ptr, SvPVX_const(sv),
4826 SvPVX_const(sv) + max_delta);
79072805
LW
4827
4828 if (!SvOOK(sv)) {
50483b2c 4829 if (!SvLEN(sv)) { /* make copy of shared string */
3f7c398e 4830 const char *pvx = SvPVX_const(sv);
a28509cc 4831 const STRLEN len = SvCUR(sv);
50483b2c 4832 SvGROW(sv, len + 1);
706aa1c9 4833 Move(pvx,SvPVX(sv),len,char);
50483b2c
JD
4834 *SvEND(sv) = '\0';
4835 }
7a5fa8a2 4836 SvFLAGS(sv) |= SVf_OOK;
7a4bba22
NC
4837 old_delta = 0;
4838 } else {
69240efd 4839 SvOOK_offset(sv, old_delta);
79072805 4840 }
b162af07
SP
4841 SvLEN_set(sv, SvLEN(sv) - delta);
4842 SvCUR_set(sv, SvCUR(sv) - delta);
f880fe2f 4843 SvPV_set(sv, SvPVX(sv) + delta);
7a4bba22
NC
4844
4845 p = (U8 *)SvPVX_const(sv);
4846
4847 delta += old_delta;
4848
50af2e61 4849#ifdef DEBUGGING
7a4bba22
NC
4850 real_start = p - delta;
4851#endif
4852
69240efd
NC
4853 assert(delta);
4854 if (delta < 0x100) {
7a4bba22
NC
4855 *--p = (U8) delta;
4856 } else {
69240efd
NC
4857 *--p = 0;
4858 p -= sizeof(STRLEN);
4859 Copy((U8*)&delta, p, sizeof(STRLEN), U8);
7a4bba22
NC
4860 }
4861
4862#ifdef DEBUGGING
4863 /* Fill the preceding buffer with sentinals to verify that no-one is
4864 using it. */
4865 while (p > real_start) {
4866 --p;
4867 *p = (U8)PTR2UV(p);
50af2e61
NC
4868 }
4869#endif
79072805
LW
4870}
4871
954c1994
GS
4872/*
4873=for apidoc sv_catpvn
4874
4875Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
4876C<len> indicates number of bytes to copy. If the SV has the UTF-8
4877status set, then the bytes appended should be valid UTF-8.
d5ce4a7c 4878Handles 'get' magic, but not 'set' magic. See C<sv_catpvn_mg>.
954c1994 4879
8d6d96c1
HS
4880=for apidoc sv_catpvn_flags
4881
4882Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
4883C<len> indicates number of bytes to copy. If the SV has the UTF-8
4884status set, then the bytes appended should be valid UTF-8.
8d6d96c1
HS
4885If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
4886appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
4887in terms of this function.
4888
4889=cut
4890*/
4891
4892void
2e000ff2 4893Perl_sv_catpvn_flags(pTHX_ register SV *const dsv, register const char *sstr, register const STRLEN slen, const I32 flags)
8d6d96c1 4894{
97aff369 4895 dVAR;
8d6d96c1 4896 STRLEN dlen;
fabdb6c0 4897 const char * const dstr = SvPV_force_flags(dsv, dlen, flags);
8d6d96c1 4898
7918f24d
NC
4899 PERL_ARGS_ASSERT_SV_CATPVN_FLAGS;
4900
8d6d96c1
HS
4901 SvGROW(dsv, dlen + slen + 1);
4902 if (sstr == dstr)
3f7c398e 4903 sstr = SvPVX_const(dsv);
8d6d96c1 4904 Move(sstr, SvPVX(dsv) + dlen, slen, char);
b162af07 4905 SvCUR_set(dsv, SvCUR(dsv) + slen);
8d6d96c1
HS
4906 *SvEND(dsv) = '\0';
4907 (void)SvPOK_only_UTF8(dsv); /* validate pointer */
4908 SvTAINT(dsv);
bddd5118
NC
4909 if (flags & SV_SMAGIC)
4910 SvSETMAGIC(dsv);
79072805
LW
4911}
4912
954c1994 4913/*
954c1994
GS
4914=for apidoc sv_catsv
4915
13e8c8e3
JH
4916Concatenates the string from SV C<ssv> onto the end of the string in
4917SV C<dsv>. Modifies C<dsv> but not C<ssv>. Handles 'get' magic, but
4918not 'set' magic. See C<sv_catsv_mg>.
954c1994 4919
8d6d96c1
HS
4920=for apidoc sv_catsv_flags
4921
4922Concatenates the string from SV C<ssv> onto the end of the string in
4923SV C<dsv>. Modifies C<dsv> but not C<ssv>. If C<flags> has C<SV_GMAGIC>
4924bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
4925and C<sv_catsv_nomg> are implemented in terms of this function.
4926
4927=cut */
4928
ef50df4b 4929void
2e000ff2 4930Perl_sv_catsv_flags(pTHX_ SV *const dsv, register SV *const ssv, const I32 flags)
79072805 4931{
97aff369 4932 dVAR;
7918f24d
NC
4933
4934 PERL_ARGS_ASSERT_SV_CATSV_FLAGS;
4935
4936 if (ssv) {
00b6aa41 4937 STRLEN slen;
a9984b10 4938 const char *spv = SvPV_flags_const(ssv, slen, flags);
00b6aa41 4939 if (spv) {
bddd5118
NC
4940 /* sutf8 and dutf8 were type bool, but under USE_ITHREADS,
4941 gcc version 2.95.2 20000220 (Debian GNU/Linux) for
4942 Linux xxx 2.2.17 on sparc64 with gcc -O2, we erroneously
4943 get dutf8 = 0x20000000, (i.e. SVf_UTF8) even though
4944 dsv->sv_flags doesn't have that bit set.
4fd84b44 4945 Andy Dougherty 12 Oct 2001
bddd5118
NC
4946 */
4947 const I32 sutf8 = DO_UTF8(ssv);
4948 I32 dutf8;
13e8c8e3 4949
bddd5118
NC
4950 if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
4951 mg_get(dsv);
4952 dutf8 = DO_UTF8(dsv);
8d6d96c1 4953
bddd5118
NC
4954 if (dutf8 != sutf8) {
4955 if (dutf8) {
4956 /* Not modifying source SV, so taking a temporary copy. */
59cd0e26 4957 SV* const csv = newSVpvn_flags(spv, slen, SVs_TEMP);
13e8c8e3 4958
bddd5118
NC
4959 sv_utf8_upgrade(csv);
4960 spv = SvPV_const(csv, slen);
4961 }
4962 else
7bf79863
KW
4963 /* Leave enough space for the cat that's about to happen */
4964 sv_utf8_upgrade_flags_grow(dsv, 0, slen);
13e8c8e3 4965 }
bddd5118 4966 sv_catpvn_nomg(dsv, spv, slen);
e84ff256 4967 }
560a288e 4968 }
bddd5118
NC
4969 if (flags & SV_SMAGIC)
4970 SvSETMAGIC(dsv);
79072805
LW
4971}
4972
954c1994 4973/*
954c1994
GS
4974=for apidoc sv_catpv
4975
4976Concatenates the string onto the end of the string which is in the SV.
1e54db1a
JH
4977If the SV has the UTF-8 status set, then the bytes appended should be
4978valid UTF-8. Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
954c1994 4979
d5ce4a7c 4980=cut */
954c1994 4981
ef50df4b 4982void
2b021c53 4983Perl_sv_catpv(pTHX_ register SV *const sv, register const char *ptr)
79072805 4984{
97aff369 4985 dVAR;
79072805 4986 register STRLEN len;
463ee0b2 4987 STRLEN tlen;
748a9306 4988 char *junk;
79072805 4989
7918f24d
NC
4990 PERL_ARGS_ASSERT_SV_CATPV;
4991
0c981600 4992 if (!ptr)
79072805 4993 return;
748a9306 4994 junk = SvPV_force(sv, tlen);
0c981600 4995 len = strlen(ptr);
463ee0b2 4996 SvGROW(sv, tlen + len + 1);
0c981600 4997 if (ptr == junk)
3f7c398e 4998 ptr = SvPVX_const(sv);
0c981600 4999 Move(ptr,SvPVX(sv)+tlen,len+1,char);
b162af07 5000 SvCUR_set(sv, SvCUR(sv) + len);
d41ff1b8 5001 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 5002 SvTAINT(sv);
79072805
LW
5003}
5004
954c1994 5005/*
9dcc53ea
Z
5006=for apidoc sv_catpv_flags
5007
5008Concatenates the string onto the end of the string which is in the SV.
5009If the SV has the UTF-8 status set, then the bytes appended should
5010be valid UTF-8. If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get>
5011on the SVs if appropriate, else not.
5012
5013=cut
5014*/
5015
5016void
fe00c367 5017Perl_sv_catpv_flags(pTHX_ SV *dstr, const char *sstr, const I32 flags)
9dcc53ea
Z
5018{
5019 PERL_ARGS_ASSERT_SV_CATPV_FLAGS;
5020 sv_catpvn_flags(dstr, sstr, strlen(sstr), flags);
5021}
5022
5023/*
954c1994
GS
5024=for apidoc sv_catpv_mg
5025
5026Like C<sv_catpv>, but also handles 'set' magic.
5027
5028=cut
5029*/
5030
ef50df4b 5031void
2b021c53 5032Perl_sv_catpv_mg(pTHX_ register SV *const sv, register const char *const ptr)
ef50df4b 5033{
7918f24d
NC
5034 PERL_ARGS_ASSERT_SV_CATPV_MG;
5035
0c981600 5036 sv_catpv(sv,ptr);
ef50df4b
GS
5037 SvSETMAGIC(sv);
5038}
5039
645c22ef
DM
5040/*
5041=for apidoc newSV
5042
561b68a9
SH
5043Creates a new SV. A non-zero C<len> parameter indicates the number of
5044bytes of preallocated string space the SV should have. An extra byte for a
5045trailing NUL is also reserved. (SvPOK is not set for the SV even if string
5046space is allocated.) The reference count for the new SV is set to 1.
5047
5048In 5.9.3, newSV() replaces the older NEWSV() API, and drops the first
5049parameter, I<x>, a debug aid which allowed callers to identify themselves.
5050This aid has been superseded by a new build option, PERL_MEM_LOG (see
5051L<perlhack/PERL_MEM_LOG>). The older API is still there for use in XS
5052modules supporting older perls.
645c22ef
DM
5053
5054=cut
5055*/
5056
79072805 5057SV *
2b021c53 5058Perl_newSV(pTHX_ const STRLEN len)
79072805 5059{
97aff369 5060 dVAR;
79072805 5061 register SV *sv;
1c846c1f 5062
4561caa4 5063 new_SV(sv);
79072805
LW
5064 if (len) {
5065 sv_upgrade(sv, SVt_PV);
5066 SvGROW(sv, len + 1);
5067 }
5068 return sv;
5069}
954c1994 5070/*
92110913 5071=for apidoc sv_magicext
954c1994 5072
68795e93 5073Adds magic to an SV, upgrading it if necessary. Applies the
2d8d5d5a 5074supplied vtable and returns a pointer to the magic added.
92110913 5075
2d8d5d5a
SH
5076Note that C<sv_magicext> will allow things that C<sv_magic> will not.
5077In particular, you can add magic to SvREADONLY SVs, and add more than
5078one instance of the same 'how'.
645c22ef 5079
2d8d5d5a
SH
5080If C<namlen> is greater than zero then a C<savepvn> I<copy> of C<name> is
5081stored, if C<namlen> is zero then C<name> is stored as-is and - as another
5082special case - if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
5083to contain an C<SV*> and is stored as-is with its REFCNT incremented.
92110913 5084
2d8d5d5a 5085(This is now used as a subroutine by C<sv_magic>.)
954c1994
GS
5086
5087=cut
5088*/
92110913 5089MAGIC *
2b021c53
SS
5090Perl_sv_magicext(pTHX_ SV *const sv, SV *const obj, const int how,
5091 const MGVTBL *const vtable, const char *const name, const I32 namlen)
79072805 5092{
97aff369 5093 dVAR;
79072805 5094 MAGIC* mg;
68795e93 5095
7918f24d
NC
5096 PERL_ARGS_ASSERT_SV_MAGICEXT;
5097
7a7f3e45 5098 SvUPGRADE(sv, SVt_PVMG);
a02a5408 5099 Newxz(mg, 1, MAGIC);
79072805 5100 mg->mg_moremagic = SvMAGIC(sv);
b162af07 5101 SvMAGIC_set(sv, mg);
75f9d97a 5102
05f95b08
SB
5103 /* Sometimes a magic contains a reference loop, where the sv and
5104 object refer to each other. To prevent a reference loop that
5105 would prevent such objects being freed, we look for such loops
5106 and if we find one we avoid incrementing the object refcount.
87f0b213
JH
5107
5108 Note we cannot do this to avoid self-tie loops as intervening RV must
b5ccf5f2 5109 have its REFCNT incremented to keep it in existence.
87f0b213
JH
5110
5111 */
14befaf4
DM
5112 if (!obj || obj == sv ||
5113 how == PERL_MAGIC_arylen ||
8d2f4536 5114 how == PERL_MAGIC_symtab ||
75f9d97a 5115 (SvTYPE(obj) == SVt_PVGV &&
4c4652b6
NC
5116 (GvSV(obj) == sv || GvHV(obj) == (const HV *)sv
5117 || GvAV(obj) == (const AV *)sv || GvCV(obj) == (const CV *)sv
5118 || GvIOp(obj) == (const IO *)sv || GvFORM(obj) == (const CV *)sv)))
75f9d97a 5119 {
8990e307 5120 mg->mg_obj = obj;
75f9d97a 5121 }
85e6fe83 5122 else {
b37c2d43 5123 mg->mg_obj = SvREFCNT_inc_simple(obj);
85e6fe83
LW
5124 mg->mg_flags |= MGf_REFCOUNTED;
5125 }
b5ccf5f2
YST
5126
5127 /* Normal self-ties simply pass a null object, and instead of
5128 using mg_obj directly, use the SvTIED_obj macro to produce a
5129 new RV as needed. For glob "self-ties", we are tieing the PVIO
5130 with an RV obj pointing to the glob containing the PVIO. In
5131 this case, to avoid a reference loop, we need to weaken the
5132 reference.
5133 */
5134
5135 if (how == PERL_MAGIC_tiedscalar && SvTYPE(sv) == SVt_PVIO &&
a45c7426 5136 obj && SvROK(obj) && GvIO(SvRV(obj)) == (const IO *)sv)
b5ccf5f2
YST
5137 {
5138 sv_rvweaken(obj);
5139 }
5140
79072805 5141 mg->mg_type = how;
565764a8 5142 mg->mg_len = namlen;
9cbac4c7 5143 if (name) {
92110913 5144 if (namlen > 0)
1edc1566 5145 mg->mg_ptr = savepvn(name, namlen);
daba3364
NC
5146 else if (namlen == HEf_SVKEY) {
5147 /* Yes, this is casting away const. This is only for the case of
486ec47a 5148 HEf_SVKEY. I think we need to document this aberation of the
daba3364
NC
5149 constness of the API, rather than making name non-const, as
5150 that change propagating outwards a long way. */
5151 mg->mg_ptr = (char*)SvREFCNT_inc_simple_NN((SV *)name);
5152 } else
92110913 5153 mg->mg_ptr = (char *) name;
9cbac4c7 5154 }
53d44271 5155 mg->mg_virtual = (MGVTBL *) vtable;
68795e93 5156
92110913
NIS
5157 mg_magical(sv);
5158 if (SvGMAGICAL(sv))
5159 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
5160 return mg;
5161}
5162
5163/*
5164=for apidoc sv_magic
1c846c1f 5165
92110913
NIS
5166Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
5167then adds a new magic item of type C<how> to the head of the magic list.
5168
2d8d5d5a
SH
5169See C<sv_magicext> (which C<sv_magic> now calls) for a description of the
5170handling of the C<name> and C<namlen> arguments.
5171
4509d3fb
SB
5172You need to use C<sv_magicext> to add magic to SvREADONLY SVs and also
5173to add more than one instance of the same 'how'.
5174
92110913
NIS
5175=cut
5176*/
5177
5178void
2b021c53
SS
5179Perl_sv_magic(pTHX_ register SV *const sv, SV *const obj, const int how,
5180 const char *const name, const I32 namlen)
68795e93 5181{
97aff369 5182 dVAR;
53d44271 5183 const MGVTBL *vtable;
92110913 5184 MAGIC* mg;
92110913 5185
7918f24d
NC
5186 PERL_ARGS_ASSERT_SV_MAGIC;
5187
f8c7b90f 5188#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
5189 if (SvIsCOW(sv))
5190 sv_force_normal_flags(sv, 0);
5191#endif
92110913 5192 if (SvREADONLY(sv)) {
d8084ca5
DM
5193 if (
5194 /* its okay to attach magic to shared strings; the subsequent
5195 * upgrade to PVMG will unshare the string */
5196 !(SvFAKE(sv) && SvTYPE(sv) < SVt_PVMG)
5197
5198 && IN_PERL_RUNTIME
92110913
NIS
5199 && how != PERL_MAGIC_regex_global
5200 && how != PERL_MAGIC_bm
5201 && how != PERL_MAGIC_fm
5202 && how != PERL_MAGIC_sv
e6469971 5203 && how != PERL_MAGIC_backref
92110913
NIS
5204 )
5205 {
6ad8f254 5206 Perl_croak_no_modify(aTHX);
92110913
NIS
5207 }
5208 }
5209 if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
5210 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
68795e93
NIS
5211 /* sv_magic() refuses to add a magic of the same 'how' as an
5212 existing one
92110913 5213 */
2a509ed3 5214 if (how == PERL_MAGIC_taint) {
92110913 5215 mg->mg_len |= 1;
2a509ed3
NC
5216 /* Any scalar which already had taint magic on which someone
5217 (erroneously?) did SvIOK_on() or similar will now be
5218 incorrectly sporting public "OK" flags. */
5219 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
5220 }
92110913
NIS
5221 return;
5222 }
5223 }
68795e93 5224
79072805 5225 switch (how) {
14befaf4 5226 case PERL_MAGIC_sv:
92110913 5227 vtable = &PL_vtbl_sv;
79072805 5228 break;
14befaf4 5229 case PERL_MAGIC_overload:
92110913 5230 vtable = &PL_vtbl_amagic;
a0d0e21e 5231 break;
14befaf4 5232 case PERL_MAGIC_overload_elem:
92110913 5233 vtable = &PL_vtbl_amagicelem;
a0d0e21e 5234 break;
14befaf4 5235 case PERL_MAGIC_overload_table:
92110913 5236 vtable = &PL_vtbl_ovrld;
a0d0e21e 5237 break;
14befaf4 5238 case PERL_MAGIC_bm:
92110913 5239 vtable = &PL_vtbl_bm;
79072805 5240 break;
14befaf4 5241 case PERL_MAGIC_regdata:
92110913 5242 vtable = &PL_vtbl_regdata;
6cef1e77 5243 break;
14befaf4 5244 case PERL_MAGIC_regdatum:
92110913 5245 vtable = &PL_vtbl_regdatum;
6cef1e77 5246 break;
14befaf4 5247 case PERL_MAGIC_env:
92110913 5248 vtable = &PL_vtbl_env;
79072805 5249 break;
14befaf4 5250 case PERL_MAGIC_fm:
92110913 5251 vtable = &PL_vtbl_fm;
55497cff 5252 break;
14befaf4 5253 case PERL_MAGIC_envelem:
92110913 5254 vtable = &PL_vtbl_envelem;
79072805 5255 break;
14befaf4 5256 case PERL_MAGIC_regex_global:
92110913 5257 vtable = &PL_vtbl_mglob;
93a17b20 5258 break;
14befaf4 5259 case PERL_MAGIC_isa:
92110913 5260 vtable = &PL_vtbl_isa;
463ee0b2 5261 break;
14befaf4 5262 case PERL_MAGIC_isaelem:
92110913 5263 vtable = &PL_vtbl_isaelem;
463ee0b2 5264 break;
14befaf4 5265 case PERL_MAGIC_nkeys:
92110913 5266 vtable = &PL_vtbl_nkeys;
16660edb 5267 break;
14befaf4 5268 case PERL_MAGIC_dbfile:
aec46f14 5269 vtable = NULL;
93a17b20 5270 break;
14befaf4 5271 case PERL_MAGIC_dbline:
92110913 5272 vtable = &PL_vtbl_dbline;
79072805 5273 break;
36477c24 5274#ifdef USE_LOCALE_COLLATE
14befaf4 5275 case PERL_MAGIC_collxfrm:
92110913 5276 vtable = &PL_vtbl_collxfrm;
bbce6d69 5277 break;
36477c24 5278#endif /* USE_LOCALE_COLLATE */
14befaf4 5279 case PERL_MAGIC_tied:
92110913 5280 vtable = &PL_vtbl_pack;
463ee0b2 5281 break;
14befaf4
DM
5282 case PERL_MAGIC_tiedelem:
5283 case PERL_MAGIC_tiedscalar:
92110913 5284 vtable = &PL_vtbl_packelem;
463ee0b2 5285 break;
14befaf4 5286 case PERL_MAGIC_qr:
92110913 5287 vtable = &PL_vtbl_regexp;
c277df42 5288 break;
14befaf4 5289 case PERL_MAGIC_sig:
92110913 5290 vtable = &PL_vtbl_sig;
79072805 5291 break;
14befaf4 5292 case PERL_MAGIC_sigelem:
92110913 5293 vtable = &PL_vtbl_sigelem;
79072805 5294 break;
14befaf4 5295 case PERL_MAGIC_taint:
92110913 5296 vtable = &PL_vtbl_taint;
463ee0b2 5297 break;
14befaf4 5298 case PERL_MAGIC_uvar:
92110913 5299 vtable = &PL_vtbl_uvar;
79072805 5300 break;
14befaf4 5301 case PERL_MAGIC_vec:
92110913 5302 vtable = &PL_vtbl_vec;
79072805 5303 break;
a3874608 5304 case PERL_MAGIC_arylen_p:
bfcb3514 5305 case PERL_MAGIC_rhash:
8d2f4536 5306 case PERL_MAGIC_symtab:
ece467f9 5307 case PERL_MAGIC_vstring:
d9088386 5308 case PERL_MAGIC_checkcall:
aec46f14 5309 vtable = NULL;
ece467f9 5310 break;
7e8c5dac
HS
5311 case PERL_MAGIC_utf8:
5312 vtable = &PL_vtbl_utf8;
5313 break;
14befaf4 5314 case PERL_MAGIC_substr:
92110913 5315 vtable = &PL_vtbl_substr;
79072805 5316 break;
14befaf4 5317 case PERL_MAGIC_defelem:
92110913 5318 vtable = &PL_vtbl_defelem;
5f05dabc 5319 break;
14befaf4 5320 case PERL_MAGIC_arylen:
92110913 5321 vtable = &PL_vtbl_arylen;
79072805 5322 break;
14befaf4 5323 case PERL_MAGIC_pos:
92110913 5324 vtable = &PL_vtbl_pos;
a0d0e21e 5325 break;
14befaf4 5326 case PERL_MAGIC_backref:
92110913 5327 vtable = &PL_vtbl_backref;
810b8aa5 5328 break;
b3ca2e83
NC
5329 case PERL_MAGIC_hintselem:
5330 vtable = &PL_vtbl_hintselem;
5331 break;
f747ebd6
Z
5332 case PERL_MAGIC_hints:
5333 vtable = &PL_vtbl_hints;
5334 break;
14befaf4
DM
5335 case PERL_MAGIC_ext:
5336 /* Reserved for use by extensions not perl internals. */
4633a7c4
LW
5337 /* Useful for attaching extension internal data to perl vars. */
5338 /* Note that multiple extensions may clash if magical scalars */
5339 /* etc holding private data from one are passed to another. */
aec46f14 5340 vtable = NULL;
a0d0e21e 5341 break;
79072805 5342 default:
14befaf4 5343 Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
463ee0b2 5344 }
68795e93 5345
92110913 5346 /* Rest of work is done else where */
aec46f14 5347 mg = sv_magicext(sv,obj,how,vtable,name,namlen);
68795e93 5348
92110913
NIS
5349 switch (how) {
5350 case PERL_MAGIC_taint:
5351 mg->mg_len = 1;
5352 break;
5353 case PERL_MAGIC_ext:
5354 case PERL_MAGIC_dbfile:
5355 SvRMAGICAL_on(sv);
5356 break;
5357 }
463ee0b2
LW
5358}
5359
5360int
b83794c7 5361S_sv_unmagicext_flags(pTHX_ SV *const sv, const int type, MGVTBL *vtbl, const U32 flags)
463ee0b2
LW
5362{
5363 MAGIC* mg;
5364 MAGIC** mgp;
7918f24d 5365
b83794c7 5366 assert(flags <= 1);
7918f24d 5367
91bba347 5368 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2 5369 return 0;
064cf529 5370 mgp = &(((XPVMG*) SvANY(sv))->xmg_u.xmg_magic);
463ee0b2 5371 for (mg = *mgp; mg; mg = *mgp) {
b83794c7
FR
5372 const MGVTBL* const virt = mg->mg_virtual;
5373 if (mg->mg_type == type && (!flags || virt == vtbl)) {
463ee0b2 5374 *mgp = mg->mg_moremagic;
b83794c7
FR
5375 if (virt && virt->svt_free)
5376 virt->svt_free(aTHX_ sv, mg);
14befaf4 5377 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
92110913 5378 if (mg->mg_len > 0)
1edc1566 5379 Safefree(mg->mg_ptr);
565764a8 5380 else if (mg->mg_len == HEf_SVKEY)
daba3364 5381 SvREFCNT_dec(MUTABLE_SV(mg->mg_ptr));
d2923cdd 5382 else if (mg->mg_type == PERL_MAGIC_utf8)
7e8c5dac 5383 Safefree(mg->mg_ptr);
9cbac4c7 5384 }
a0d0e21e
LW
5385 if (mg->mg_flags & MGf_REFCOUNTED)
5386 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
5387 Safefree(mg);
5388 }
5389 else
5390 mgp = &mg->mg_moremagic;
79072805 5391 }
806e7ca7
CS
5392 if (SvMAGIC(sv)) {
5393 if (SvMAGICAL(sv)) /* if we're under save_magic, wait for restore_magic; */
5394 mg_magical(sv); /* else fix the flags now */
5395 }
5396 else {
463ee0b2 5397 SvMAGICAL_off(sv);
c268c2a6 5398 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
463ee0b2 5399 }
463ee0b2 5400 return 0;
79072805
LW
5401}
5402
c461cf8f 5403/*
b83794c7
FR
5404=for apidoc sv_unmagic
5405
5406Removes all magic of type C<type> from an SV.
5407
5408=cut
5409*/
5410
5411int
5412Perl_sv_unmagic(pTHX_ SV *const sv, const int type)
5413{
5414 PERL_ARGS_ASSERT_SV_UNMAGIC;
5415 return S_sv_unmagicext_flags(aTHX_ sv, type, NULL, 0);
5416}
5417
5418/*
5419=for apidoc sv_unmagicext
5420
5421Removes all magic of type C<type> with the specified C<vtbl> from an SV.
5422
5423=cut
5424*/
5425
5426int
5427Perl_sv_unmagicext(pTHX_ SV *const sv, const int type, MGVTBL *vtbl)
5428{
5429 PERL_ARGS_ASSERT_SV_UNMAGICEXT;
5430 return S_sv_unmagicext_flags(aTHX_ sv, type, vtbl, 1);
5431}
5432
5433/*
c461cf8f
JH
5434=for apidoc sv_rvweaken
5435
645c22ef
DM
5436Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
5437referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
5438push a back-reference to this RV onto the array of backreferences
1e73acc8
AS
5439associated with that magic. If the RV is magical, set magic will be
5440called after the RV is cleared.
c461cf8f
JH
5441
5442=cut
5443*/
5444
810b8aa5 5445SV *
2b021c53 5446Perl_sv_rvweaken(pTHX_ SV *const sv)
810b8aa5
GS
5447{
5448 SV *tsv;
7918f24d
NC
5449
5450 PERL_ARGS_ASSERT_SV_RVWEAKEN;
5451
810b8aa5
GS
5452 if (!SvOK(sv)) /* let undefs pass */
5453 return sv;
5454 if (!SvROK(sv))
cea2e8a9 5455 Perl_croak(aTHX_ "Can't weaken a nonreference");
810b8aa5 5456 else if (SvWEAKREF(sv)) {
a2a5de95 5457 Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
810b8aa5
GS
5458 return sv;
5459 }
5460 tsv = SvRV(sv);
e15faf7d 5461 Perl_sv_add_backref(aTHX_ tsv, sv);
810b8aa5 5462 SvWEAKREF_on(sv);
1c846c1f 5463 SvREFCNT_dec(tsv);
810b8aa5
GS
5464 return sv;
5465}
5466
645c22ef
DM
5467/* Give tsv backref magic if it hasn't already got it, then push a
5468 * back-reference to sv onto the array associated with the backref magic.
5648c0ae
DM
5469 *
5470 * As an optimisation, if there's only one backref and it's not an AV,
5471 * store it directly in the HvAUX or mg_obj slot, avoiding the need to
5472 * allocate an AV. (Whether the slot holds an AV tells us whether this is
5473 * active.)
8ac9a371
DM
5474 *
5475 * If an HV's backref is stored in magic, it is moved back to HvAUX.
645c22ef
DM
5476 */
5477
fd996479
DM
5478/* A discussion about the backreferences array and its refcount:
5479 *
5480 * The AV holding the backreferences is pointed to either as the mg_obj of
09aad8f0
DM
5481 * PERL_MAGIC_backref, or in the specific case of a HV that has the hv_aux
5482 * structure, from the xhv_backreferences field. (A HV without hv_aux will
5483 * have the standard magic instead.) The array is created with a refcount
5484 * of 2. This means that if during global destruction the array gets
cef0c2ea
DM
5485 * picked on before its parent to have its refcount decremented by the
5486 * random zapper, it won't actually be freed, meaning it's still there for
5487 * when its parent gets freed.
5648c0ae
DM
5488 *
5489 * When the parent SV is freed, the extra ref is killed by
5490 * Perl_sv_kill_backrefs. The other ref is killed, in the case of magic,
5491 * by mg_free() / MGf_REFCOUNTED, or for a hash, by Perl_hv_kill_backrefs.
5492 *
5493 * When a single backref SV is stored directly, it is not reference
5494 * counted.
fd996479
DM
5495 */
5496
e15faf7d 5497void
2b021c53 5498Perl_sv_add_backref(pTHX_ SV *const tsv, SV *const sv)
810b8aa5 5499{
97aff369 5500 dVAR;
757971c4 5501 SV **svp;
5648c0ae 5502 AV *av = NULL;
757971c4 5503 MAGIC *mg = NULL;
86f55936 5504
7918f24d
NC
5505 PERL_ARGS_ASSERT_SV_ADD_BACKREF;
5506
5648c0ae
DM
5507 /* find slot to store array or singleton backref */
5508
86f55936 5509 if (SvTYPE(tsv) == SVt_PVHV) {
757971c4 5510 svp = (SV**)Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(tsv));
09aad8f0 5511
757971c4
DM
5512 if (!*svp) {
5513 if ((mg = mg_find(tsv, PERL_MAGIC_backref))) {
5514 /* Aha. They've got it stowed in magic instead.
5515 * Move it back to xhv_backreferences */
5516 *svp = mg->mg_obj;
cdb996f4 5517 /* Stop mg_free decreasing the reference count. */
09aad8f0
DM
5518 mg->mg_obj = NULL;
5519 /* Stop mg_free even calling the destructor, given that
5520 there's no AV to free up. */
5521 mg->mg_virtual = 0;
5522 sv_unmagic(tsv, PERL_MAGIC_backref);
757971c4 5523 mg = NULL;
09aad8f0 5524 }
86f55936
NC
5525 }
5526 } else {
757971c4
DM
5527 if (! ((mg =
5528 (SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL))))
5529 {
5530 sv_magic(tsv, NULL, PERL_MAGIC_backref, NULL, 0);
5531 mg = mg_find(tsv, PERL_MAGIC_backref);
86f55936 5532 }
757971c4 5533 svp = &(mg->mg_obj);
810b8aa5 5534 }
757971c4 5535
5648c0ae
DM
5536 /* create or retrieve the array */
5537
5538 if ( (!*svp && SvTYPE(sv) == SVt_PVAV)
5539 || (*svp && SvTYPE(*svp) != SVt_PVAV)
5540 ) {
5541 /* create array */
757971c4
DM
5542 av = newAV();
5543 AvREAL_off(av);
5544 SvREFCNT_inc_simple_void(av);
5545 /* av now has a refcnt of 2; see discussion above */
5648c0ae
DM
5546 if (*svp) {
5547 /* move single existing backref to the array */
5548 av_extend(av, 1);
5549 AvARRAY(av)[++AvFILLp(av)] = *svp; /* av_push() */
5550 }
5551 *svp = (SV*)av;
757971c4
DM
5552 if (mg)
5553 mg->mg_flags |= MGf_REFCOUNTED;
757971c4
DM
5554 }
5555 else
5648c0ae 5556 av = MUTABLE_AV(*svp);
757971c4 5557
5648c0ae
DM
5558 if (!av) {
5559 /* optimisation: store single backref directly in HvAUX or mg_obj */
5560 *svp = sv;
5561 return;
5562 }
5563 /* push new backref */
5564 assert(SvTYPE(av) == SVt_PVAV);
d91d49e8 5565 if (AvFILLp(av) >= AvMAX(av)) {
d91d49e8
MM
5566 av_extend(av, AvFILLp(av)+1);
5567 }
5568 AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */
810b8aa5
GS
5569}
5570
645c22ef
DM
5571/* delete a back-reference to ourselves from the backref magic associated
5572 * with the SV we point to.
5573 */
5574
4c74a7df
DM
5575void
5576Perl_sv_del_backref(pTHX_ SV *const tsv, SV *const sv)
810b8aa5 5577{
97aff369 5578 dVAR;
5648c0ae 5579 SV **svp = NULL;
86f55936 5580
7918f24d
NC
5581 PERL_ARGS_ASSERT_SV_DEL_BACKREF;
5582
317ec34c 5583 if (SvTYPE(tsv) == SVt_PVHV && SvOOK(tsv)) {
5648c0ae 5584 svp = (SV**)Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(tsv));
86f55936 5585 }
5648c0ae
DM
5586 if (!svp || !*svp) {
5587 MAGIC *const mg
86f55936 5588 = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
5648c0ae 5589 svp = mg ? &(mg->mg_obj) : NULL;
86f55936 5590 }
41fae7a1 5591
5648c0ae 5592 if (!svp || !*svp)
cea2e8a9 5593 Perl_croak(aTHX_ "panic: del_backref");
86f55936 5594
5648c0ae 5595 if (SvTYPE(*svp) == SVt_PVAV) {
51698cb3
DM
5596#ifdef DEBUGGING
5597 int count = 1;
5598#endif
5648c0ae 5599 AV * const av = (AV*)*svp;
51698cb3 5600 SSize_t fill;
5648c0ae 5601 assert(!SvIS_FREED(av));
51698cb3
DM
5602 fill = AvFILLp(av);
5603 assert(fill > -1);
5648c0ae 5604 svp = AvARRAY(av);
51698cb3
DM
5605 /* for an SV with N weak references to it, if all those
5606 * weak refs are deleted, then sv_del_backref will be called
5607 * N times and O(N^2) compares will be done within the backref
5608 * array. To ameliorate this potential slowness, we:
5609 * 1) make sure this code is as tight as possible;
5610 * 2) when looking for SV, look for it at both the head and tail of the
5611 * array first before searching the rest, since some create/destroy
5612 * patterns will cause the backrefs to be freed in order.
5613 */
5614 if (*svp == sv) {
5615 AvARRAY(av)++;
5616 AvMAX(av)--;
5617 }
5618 else {
5619 SV **p = &svp[fill];
5620 SV *const topsv = *p;
5621 if (topsv != sv) {
5622#ifdef DEBUGGING
5623 count = 0;
5624#endif
5625 while (--p > svp) {
5626 if (*p == sv) {
5627 /* We weren't the last entry.
5628 An unordered list has this property that you
5629 can take the last element off the end to fill
5630 the hole, and it's still an unordered list :-)
5631 */
5632 *p = topsv;
5633#ifdef DEBUGGING
5634 count++;
5635#else
5636 break; /* should only be one */
254f8c6a 5637#endif
51698cb3
DM
5638 }
5639 }
6a76db8b 5640 }
6a76db8b 5641 }
51698cb3
DM
5642 assert(count ==1);
5643 AvFILLp(av) = fill-1;
6a76db8b 5644 }
5648c0ae
DM
5645 else {
5646 /* optimisation: only a single backref, stored directly */
5647 if (*svp != sv)
5648 Perl_croak(aTHX_ "panic: del_backref");
5649 *svp = NULL;
5650 }
5651
810b8aa5
GS
5652}
5653
5648c0ae 5654void
2b021c53 5655Perl_sv_kill_backrefs(pTHX_ SV *const sv, AV *const av)
86f55936 5656{
5648c0ae
DM
5657 SV **svp;
5658 SV **last;
5659 bool is_array;
86f55936 5660
7918f24d 5661 PERL_ARGS_ASSERT_SV_KILL_BACKREFS;
86f55936 5662
5648c0ae
DM
5663 if (!av)
5664 return;
86f55936 5665
5648c0ae
DM
5666 is_array = (SvTYPE(av) == SVt_PVAV);
5667 if (is_array) {
cef0c2ea 5668 assert(!SvIS_FREED(av));
5648c0ae
DM
5669 svp = AvARRAY(av);
5670 if (svp)
5671 last = svp + AvFILLp(av);
5672 }
5673 else {
5674 /* optimisation: only a single backref, stored directly */
5675 svp = (SV**)&av;
5676 last = svp;
5677 }
5678
5679 if (svp) {
86f55936
NC
5680 while (svp <= last) {
5681 if (*svp) {
5682 SV *const referrer = *svp;
5683 if (SvWEAKREF(referrer)) {
5684 /* XXX Should we check that it hasn't changed? */
4c74a7df 5685 assert(SvROK(referrer));
86f55936
NC
5686 SvRV_set(referrer, 0);
5687 SvOK_off(referrer);
5688 SvWEAKREF_off(referrer);
1e73acc8 5689 SvSETMAGIC(referrer);
86f55936
NC
5690 } else if (SvTYPE(referrer) == SVt_PVGV ||
5691 SvTYPE(referrer) == SVt_PVLV) {
803f2748 5692 assert(SvTYPE(sv) == SVt_PVHV); /* stash backref */
86f55936
NC
5693 /* You lookin' at me? */
5694 assert(GvSTASH(referrer));
1d193675 5695 assert(GvSTASH(referrer) == (const HV *)sv);
86f55936 5696 GvSTASH(referrer) = 0;
803f2748
DM
5697 } else if (SvTYPE(referrer) == SVt_PVCV ||
5698 SvTYPE(referrer) == SVt_PVFM) {
5699 if (SvTYPE(sv) == SVt_PVHV) { /* stash backref */
5700 /* You lookin' at me? */
5701 assert(CvSTASH(referrer));
5702 assert(CvSTASH(referrer) == (const HV *)sv);
c68d9564 5703 SvANY(MUTABLE_CV(referrer))->xcv_stash = 0;
803f2748
DM
5704 }
5705 else {
5706 assert(SvTYPE(sv) == SVt_PVGV);
5707 /* You lookin' at me? */
5708 assert(CvGV(referrer));
5709 assert(CvGV(referrer) == (const GV *)sv);
5710 anonymise_cv_maybe(MUTABLE_GV(sv),
5711 MUTABLE_CV(referrer));
5712 }
5713
86f55936
NC
5714 } else {
5715 Perl_croak(aTHX_
5716 "panic: magic_killbackrefs (flags=%"UVxf")",
5717 (UV)SvFLAGS(referrer));
5718 }
5719
5648c0ae
DM
5720 if (is_array)
5721 *svp = NULL;
86f55936
NC
5722 }
5723 svp++;
5724 }
5648c0ae
DM
5725 }
5726 if (is_array) {
cef0c2ea 5727 AvFILLp(av) = -1;
5648c0ae 5728 SvREFCNT_dec(av); /* remove extra count added by sv_add_backref() */
86f55936 5729 }
5648c0ae 5730 return;
86f55936
NC
5731}
5732
954c1994
GS
5733/*
5734=for apidoc sv_insert
5735
5736Inserts a string at the specified offset/length within the SV. Similar to
c0dd94a0 5737the Perl substr() function. Handles get magic.
954c1994 5738
c0dd94a0
VP
5739=for apidoc sv_insert_flags
5740
5741Same as C<sv_insert>, but the extra C<flags> are passed the C<SvPV_force_flags> that applies to C<bigstr>.
5742
5743=cut
5744*/
5745
5746void
5747Perl_sv_insert_flags(pTHX_ SV *const bigstr, const STRLEN offset, const STRLEN len, const char *const little, const STRLEN littlelen, const U32 flags)
5748{
97aff369 5749 dVAR;
79072805
LW
5750 register char *big;
5751 register char *mid;
5752 register char *midend;
5753 register char *bigend;
5754 register I32 i;
6ff81951 5755 STRLEN curlen;
1c846c1f 5756
27aecdc6 5757 PERL_ARGS_ASSERT_SV_INSERT_FLAGS;
79072805 5758
8990e307 5759 if (!bigstr)
cea2e8a9 5760 Perl_croak(aTHX_ "Can't modify non-existent substring");
c0dd94a0 5761 SvPV_force_flags(bigstr, curlen, flags);
60fa28ff 5762 (void)SvPOK_only_UTF8(bigstr);
6ff81951
GS
5763 if (offset + len > curlen) {
5764 SvGROW(bigstr, offset+len+1);
93524f2b 5765 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
6ff81951
GS
5766 SvCUR_set(bigstr, offset+len);
5767 }
79072805 5768
69b47968 5769 SvTAINT(bigstr);
79072805
LW
5770 i = littlelen - len;
5771 if (i > 0) { /* string might grow */
a0d0e21e 5772 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
5773 mid = big + offset + len;
5774 midend = bigend = big + SvCUR(bigstr);
5775 bigend += i;
5776 *bigend = '\0';
5777 while (midend > mid) /* shove everything down */
5778 *--bigend = *--midend;
5779 Move(little,big+offset,littlelen,char);
b162af07 5780 SvCUR_set(bigstr, SvCUR(bigstr) + i);
79072805
LW
5781 SvSETMAGIC(bigstr);
5782 return;
5783 }
5784 else if (i == 0) {
463ee0b2 5785 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
5786 SvSETMAGIC(bigstr);
5787 return;
5788 }
5789
463ee0b2 5790 big = SvPVX(bigstr);
79072805
LW
5791 mid = big + offset;
5792 midend = mid + len;
5793 bigend = big + SvCUR(bigstr);
5794
5795 if (midend > bigend)
cea2e8a9 5796 Perl_croak(aTHX_ "panic: sv_insert");
79072805
LW
5797
5798 if (mid - big > bigend - midend) { /* faster to shorten from end */
5799 if (littlelen) {
5800 Move(little, mid, littlelen,char);
5801 mid += littlelen;
5802 }
5803 i = bigend - midend;
5804 if (i > 0) {
5805 Move(midend, mid, i,char);
5806 mid += i;
5807 }
5808 *mid = '\0';
5809 SvCUR_set(bigstr, mid - big);
5810 }
155aba94 5811 else if ((i = mid - big)) { /* faster from front */
79072805
LW
5812 midend -= littlelen;
5813 mid = midend;
0d3c21b0 5814 Move(big, midend - i, i, char);
79072805 5815 sv_chop(bigstr,midend-i);
79072805
LW
5816 if (littlelen)
5817 Move(little, mid, littlelen,char);
5818 }
5819 else if (littlelen) {
5820 midend -= littlelen;
5821 sv_chop(bigstr,midend);
5822 Move(little,midend,littlelen,char);
5823 }
5824 else {
5825 sv_chop(bigstr,midend);
5826 }
5827 SvSETMAGIC(bigstr);
5828}
5829
c461cf8f
JH
5830/*
5831=for apidoc sv_replace
5832
5833Make the first argument a copy of the second, then delete the original.
645c22ef
DM
5834The target SV physically takes over ownership of the body of the source SV
5835and inherits its flags; however, the target keeps any magic it owns,
5836and any magic in the source is discarded.
ff276b08 5837Note that this is a rather specialist SV copying operation; most of the
645c22ef 5838time you'll want to use C<sv_setsv> or one of its many macro front-ends.
c461cf8f
JH
5839
5840=cut
5841*/
79072805
LW
5842
5843void
af828c01 5844Perl_sv_replace(pTHX_ register SV *const sv, register SV *const nsv)
79072805 5845{
97aff369 5846 dVAR;
a3b680e6 5847 const U32 refcnt = SvREFCNT(sv);
7918f24d
NC
5848
5849 PERL_ARGS_ASSERT_SV_REPLACE;
5850
765f542d 5851 SV_CHECK_THINKFIRST_COW_DROP(sv);
30e5c352 5852 if (SvREFCNT(nsv) != 1) {
fe13d51d
JM
5853 Perl_croak(aTHX_ "panic: reference miscount on nsv in sv_replace()"
5854 " (%" UVuf " != 1)", (UV) SvREFCNT(nsv));
30e5c352 5855 }
93a17b20 5856 if (SvMAGICAL(sv)) {
a0d0e21e
LW
5857 if (SvMAGICAL(nsv))
5858 mg_free(nsv);
5859 else
5860 sv_upgrade(nsv, SVt_PVMG);
b162af07 5861 SvMAGIC_set(nsv, SvMAGIC(sv));
a0d0e21e 5862 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20 5863 SvMAGICAL_off(sv);
b162af07 5864 SvMAGIC_set(sv, NULL);
93a17b20 5865 }
79072805
LW
5866 SvREFCNT(sv) = 0;
5867 sv_clear(sv);
477f5d66 5868 assert(!SvREFCNT(sv));
fd0854ff
DM
5869#ifdef DEBUG_LEAKING_SCALARS
5870 sv->sv_flags = nsv->sv_flags;
5871 sv->sv_any = nsv->sv_any;
5872 sv->sv_refcnt = nsv->sv_refcnt;
f34d0642 5873 sv->sv_u = nsv->sv_u;
fd0854ff 5874#else
79072805 5875 StructCopy(nsv,sv,SV);
fd0854ff 5876#endif
4df7f6af 5877 if(SvTYPE(sv) == SVt_IV) {
7b2c381c 5878 SvANY(sv)
339049b0 5879 = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
7b2c381c
NC
5880 }
5881
fd0854ff 5882
f8c7b90f 5883#ifdef PERL_OLD_COPY_ON_WRITE
d3d0e6f1
NC
5884 if (SvIsCOW_normal(nsv)) {
5885 /* We need to follow the pointers around the loop to make the
5886 previous SV point to sv, rather than nsv. */
5887 SV *next;
5888 SV *current = nsv;
5889 while ((next = SV_COW_NEXT_SV(current)) != nsv) {
5890 assert(next);
5891 current = next;
3f7c398e 5892 assert(SvPVX_const(current) == SvPVX_const(nsv));
d3d0e6f1
NC
5893 }
5894 /* Make the SV before us point to the SV after us. */
5895 if (DEBUG_C_TEST) {
5896 PerlIO_printf(Perl_debug_log, "previous is\n");
5897 sv_dump(current);
a29f6d03
NC
5898 PerlIO_printf(Perl_debug_log,
5899 "move it from 0x%"UVxf" to 0x%"UVxf"\n",
d3d0e6f1
NC
5900 (UV) SV_COW_NEXT_SV(current), (UV) sv);
5901 }
a29f6d03 5902 SV_COW_NEXT_SV_SET(current, sv);
d3d0e6f1
NC
5903 }
5904#endif
79072805 5905 SvREFCNT(sv) = refcnt;
1edc1566 5906 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
39cf41c2 5907 SvREFCNT(nsv) = 0;
463ee0b2 5908 del_SV(nsv);
79072805
LW
5909}
5910
803f2748
DM
5911/* We're about to free a GV which has a CV that refers back to us.
5912 * If that CV will outlive us, make it anonymous (i.e. fix up its CvGV
5913 * field) */
5914
5915STATIC void
5916S_anonymise_cv_maybe(pTHX_ GV *gv, CV* cv)
5917{
5918 char *stash;
5919 SV *gvname;
5920 GV *anongv;
5921
5922 PERL_ARGS_ASSERT_ANONYMISE_CV_MAYBE;
5923
5924 /* be assertive! */
5925 assert(SvREFCNT(gv) == 0);
5926 assert(isGV(gv) && isGV_with_GP(gv));
5927 assert(GvGP(gv));
5928 assert(!CvANON(cv));
5929 assert(CvGV(cv) == gv);
5930
5931 /* will the CV shortly be freed by gp_free() ? */
5932 if (GvCV(gv) == cv && GvGP(gv)->gp_refcnt < 2 && SvREFCNT(cv) < 2) {
b3f91e91 5933 SvANY(cv)->xcv_gv = NULL;
803f2748
DM
5934 return;
5935 }
5936
5937 /* if not, anonymise: */
5938 stash = GvSTASH(gv) ? HvNAME(GvSTASH(gv)) : NULL;
5939 gvname = Perl_newSVpvf(aTHX_ "%s::__ANON__",
5940 stash ? stash : "__ANON__");
5941 anongv = gv_fetchsv(gvname, GV_ADDMULTI, SVt_PVCV);
5942 SvREFCNT_dec(gvname);
5943
5944 CvANON_on(cv);
cfc1e951 5945 CvCVGV_RC_on(cv);
b3f91e91 5946 SvANY(cv)->xcv_gv = MUTABLE_GV(SvREFCNT_inc(anongv));
803f2748
DM
5947}
5948
5949
c461cf8f
JH
5950/*
5951=for apidoc sv_clear
5952
645c22ef
DM
5953Clear an SV: call any destructors, free up any memory used by the body,
5954and free the body itself. The SV's head is I<not> freed, although
5955its type is set to all 1's so that it won't inadvertently be assumed
5956to be live during global destruction etc.
5957This function should only be called when REFCNT is zero. Most of the time
5958you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
5959instead.
c461cf8f
JH
5960
5961=cut
5962*/
5963
79072805 5964void
5239d5c4 5965Perl_sv_clear(pTHX_ SV *const orig_sv)
79072805 5966{
27da23d5 5967 dVAR;
dd69841b 5968 HV *stash;
5239d5c4
DM
5969 U32 type;
5970 const struct body_details *sv_type_details;
5971 SV* iter_sv = NULL;
5972 SV* next_sv = NULL;
5973 register SV *sv = orig_sv;
82bb6deb 5974
7918f24d 5975 PERL_ARGS_ASSERT_SV_CLEAR;
5239d5c4
DM
5976
5977 /* within this loop, sv is the SV currently being freed, and
5978 * iter_sv is the most recent AV or whatever that's being iterated
5979 * over to provide more SVs */
5980
5981 while (sv) {
5982
df90f6af
DM
5983 type = SvTYPE(sv);
5984
5985 assert(SvREFCNT(sv) == 0);
5986 assert(SvTYPE(sv) != SVTYPEMASK);
5987
5988 if (type <= SVt_IV) {
5989 /* See the comment in sv.h about the collusion between this
5990 * early return and the overloading of the NULL slots in the
5991 * size table. */
5992 if (SvROK(sv))
5993 goto free_rv;
5994 SvFLAGS(sv) &= SVf_BREAK;
5995 SvFLAGS(sv) |= SVTYPEMASK;
5996 goto free_head;
5997 }
82bb6deb 5998
df90f6af 5999 if (SvOBJECT(sv)) {
4155e4fe 6000 if (!curse(sv, 1)) goto get_next_sv;
93578b34 6001 }
df90f6af
DM
6002 if (type >= SVt_PVMG) {
6003 if (type == SVt_PVMG && SvPAD_OUR(sv)) {
6004 SvREFCNT_dec(SvOURSTASH(sv));
6005 } else if (SvMAGIC(sv))
6006 mg_free(sv);
6007 if (type == SVt_PVMG && SvPAD_TYPED(sv))
6008 SvREFCNT_dec(SvSTASH(sv));
e7fab884 6009 }
df90f6af
DM
6010 switch (type) {
6011 /* case SVt_BIND: */
6012 case SVt_PVIO:
6013 if (IoIFP(sv) &&
6014 IoIFP(sv) != PerlIO_stdin() &&
6015 IoIFP(sv) != PerlIO_stdout() &&
6016 IoIFP(sv) != PerlIO_stderr() &&
6017 !(IoFLAGS(sv) & IOf_FAKE_DIRP))
6018 {
6019 io_close(MUTABLE_IO(sv), FALSE);
5239d5c4 6020 }
df90f6af
DM
6021 if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
6022 PerlDir_close(IoDIRP(sv));
6023 IoDIRP(sv) = (DIR*)NULL;
6024 Safefree(IoTOP_NAME(sv));
6025 Safefree(IoFMT_NAME(sv));
6026 Safefree(IoBOTTOM_NAME(sv));
6027 goto freescalar;
6028 case SVt_REGEXP:
6029 /* FIXME for plugins */
6030 pregfree2((REGEXP*) sv);
6031 goto freescalar;
6032 case SVt_PVCV:
6033 case SVt_PVFM:
6034 cv_undef(MUTABLE_CV(sv));
6035 /* If we're in a stash, we don't own a reference to it.
6036 * However it does have a back reference to us, which needs to
6037 * be cleared. */
6038 if ((stash = CvSTASH(sv)))
6039 sv_del_backref(MUTABLE_SV(stash), sv);
6040 goto freescalar;
6041 case SVt_PVHV:
6042 if (PL_last_swash_hv == (const HV *)sv) {
6043 PL_last_swash_hv = NULL;
5239d5c4 6044 }
df90f6af 6045 Perl_hv_kill_backrefs(aTHX_ MUTABLE_HV(sv));
745edda6 6046 Perl_hv_undef_flags(aTHX_ MUTABLE_HV(sv), HV_NAME_SETALL);
df90f6af
DM
6047 break;
6048 case SVt_PVAV:
db93c0c4 6049 {
df90f6af
DM
6050 AV* av = MUTABLE_AV(sv);
6051 if (PL_comppad == av) {
6052 PL_comppad = NULL;
6053 PL_curpad = NULL;
6054 }
6055 if (AvREAL(av) && AvFILLp(av) > -1) {
6056 next_sv = AvARRAY(av)[AvFILLp(av)--];
6057 /* save old iter_sv in top-most slot of AV,
6058 * and pray that it doesn't get wiped in the meantime */
6059 AvARRAY(av)[AvMAX(av)] = iter_sv;
6060 iter_sv = sv;
6061 goto get_next_sv; /* process this new sv */
6062 }
6063 Safefree(AvALLOC(av));
db93c0c4 6064 }
df90f6af
DM
6065
6066 break;
6067 case SVt_PVLV:
6068 if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
6069 SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv)));
6070 HeNEXT((HE*)LvTARG(sv)) = PL_hv_fetch_ent_mh;
6071 PL_hv_fetch_ent_mh = (HE*)LvTARG(sv);
6072 }
6073 else if (LvTYPE(sv) != 't') /* unless tie: unrefcnted fake SV** */
6074 SvREFCNT_dec(LvTARG(sv));
6075 case SVt_PVGV:
6076 if (isGV_with_GP(sv)) {
6077 if(GvCVu((const GV *)sv) && (stash = GvSTASH(MUTABLE_GV(sv)))
00169e2c 6078 && HvENAME_get(stash))
df90f6af
DM
6079 mro_method_changed_in(stash);
6080 gp_free(MUTABLE_GV(sv));
6081 if (GvNAME_HEK(sv))
6082 unshare_hek(GvNAME_HEK(sv));
6083 /* If we're in a stash, we don't own a reference to it.
6084 * However it does have a back reference to us, which
6085 * needs to be cleared. */
6086 if (!SvVALID(sv) && (stash = GvSTASH(sv)))
6087 sv_del_backref(MUTABLE_SV(stash), sv);
6088 }
6089 /* FIXME. There are probably more unreferenced pointers to SVs
6090 * in the interpreter struct that we should check and tidy in
6091 * a similar fashion to this: */
6092 if ((const GV *)sv == PL_last_in_gv)
6093 PL_last_in_gv = NULL;
6094 case SVt_PVMG:
6095 case SVt_PVNV:
6096 case SVt_PVIV:
6097 case SVt_PV:
6098 freescalar:
6099 /* Don't bother with SvOOK_off(sv); as we're only going to
6100 * free it. */
6101 if (SvOOK(sv)) {
6102 STRLEN offset;
6103 SvOOK_offset(sv, offset);
6104 SvPV_set(sv, SvPVX_mutable(sv) - offset);
6105 /* Don't even bother with turning off the OOK flag. */
6106 }
6107 if (SvROK(sv)) {
6108 free_rv:
6109 {
6110 SV * const target = SvRV(sv);
6111 if (SvWEAKREF(sv))
6112 sv_del_backref(target, sv);
6113 else
b98b62bc 6114 next_sv = target;
5302ffd4 6115 }
df90f6af
DM
6116 }
6117#ifdef PERL_OLD_COPY_ON_WRITE
6118 else if (SvPVX_const(sv)
6119 && !(SvTYPE(sv) == SVt_PVIO
6120 && !(IoFLAGS(sv) & IOf_FAKE_DIRP)))
6121 {
6122 if (SvIsCOW(sv)) {
6123 if (DEBUG_C_TEST) {
6124 PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
6125 sv_dump(sv);
6126 }
6127 if (SvLEN(sv)) {
6128 sv_release_COW(sv, SvPVX_const(sv), SV_COW_NEXT_SV(sv));
6129 } else {
6130 unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
6131 }
5302ffd4 6132
df90f6af
DM
6133 SvFAKE_off(sv);
6134 } else if (SvLEN(sv)) {
6135 Safefree(SvPVX_const(sv));
6136 }
6137 }
765f542d 6138#else
df90f6af
DM
6139 else if (SvPVX_const(sv) && SvLEN(sv)
6140 && !(SvTYPE(sv) == SVt_PVIO
6141 && !(IoFLAGS(sv) & IOf_FAKE_DIRP)))
6142 Safefree(SvPVX_mutable(sv));
6143 else if (SvPVX_const(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
6144 unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
6145 SvFAKE_off(sv);
6146 }
765f542d 6147#endif
df90f6af
DM
6148 break;
6149 case SVt_NV:
6150 break;
6151 }
79072805 6152
df90f6af 6153 free_body:
5239d5c4 6154
df90f6af
DM
6155 SvFLAGS(sv) &= SVf_BREAK;
6156 SvFLAGS(sv) |= SVTYPEMASK;
893645bd 6157
df90f6af
DM
6158 sv_type_details = bodies_by_type + type;
6159 if (sv_type_details->arena) {
6160 del_body(((char *)SvANY(sv) + sv_type_details->offset),
6161 &PL_body_roots[type]);
6162 }
6163 else if (sv_type_details->body_size) {
6164 safefree(SvANY(sv));
6165 }
5239d5c4
DM
6166
6167 free_head:
6168 /* caller is responsible for freeing the head of the original sv */
6169 if (sv != orig_sv && !SvREFCNT(sv))
6170 del_SV(sv);
6171
6172 /* grab and free next sv, if any */
6173 get_next_sv:
6174 while (1) {
6175 sv = NULL;
6176 if (next_sv) {
6177 sv = next_sv;
6178 next_sv = NULL;
6179 }
6180 else if (!iter_sv) {
6181 break;
6182 } else if (SvTYPE(iter_sv) == SVt_PVAV) {
6183 AV *const av = (AV*)iter_sv;
6184 if (AvFILLp(av) > -1) {
6185 sv = AvARRAY(av)[AvFILLp(av)--];
6186 }
6187 else { /* no more elements of current AV to free */
6188 sv = iter_sv;
6189 type = SvTYPE(sv);
6190 /* restore previous value, squirrelled away */
6191 iter_sv = AvARRAY(av)[AvMAX(av)];
6192 Safefree(AvALLOC(av));
6193 goto free_body;
6194 }
6195 }
6196
6197 /* unrolled SvREFCNT_dec and sv_free2 follows: */
6198
6199 if (!sv)
6200 continue;
6201 if (!SvREFCNT(sv)) {
6202 sv_free(sv);
6203 continue;
6204 }
6205 if (--(SvREFCNT(sv)))
6206 continue;
df90f6af 6207#ifdef DEBUGGING
5239d5c4
DM
6208 if (SvTEMP(sv)) {
6209 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING),
6210 "Attempt to free temp prematurely: SV 0x%"UVxf
6211 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
6212 continue;
6213 }
df90f6af 6214#endif
5239d5c4
DM
6215 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
6216 /* make sure SvREFCNT(sv)==0 happens very seldom */
6217 SvREFCNT(sv) = (~(U32)0)/2;
6218 continue;
6219 }
6220 break;
6221 } /* while 1 */
6222
6223 } /* while sv */
79072805
LW
6224}
6225
4155e4fe
FC
6226/* This routine curses the sv itself, not the object referenced by sv. So
6227 sv does not have to be ROK. */
6228
6229static bool
6230S_curse(pTHX_ SV * const sv, const bool check_refcnt) {
6231 dVAR;
6232
6233 PERL_ARGS_ASSERT_CURSE;
6234 assert(SvOBJECT(sv));
6235
6236 if (PL_defstash && /* Still have a symbol table? */
6237 SvDESTROYABLE(sv))
6238 {
6239 dSP;
6240 HV* stash;
6241 do {
6242 CV* destructor;
6243 stash = SvSTASH(sv);
6244 destructor = StashHANDLER(stash,DESTROY);
6245 if (destructor
6246 /* A constant subroutine can have no side effects, so
6247 don't bother calling it. */
6248 && !CvCONST(destructor)
6249 /* Don't bother calling an empty destructor */
6250 && (CvISXSUB(destructor)
6251 || (CvSTART(destructor)
6252 && (CvSTART(destructor)->op_next->op_type
6253 != OP_LEAVESUB))))
6254 {
6255 SV* const tmpref = newRV(sv);
6256 SvREADONLY_on(tmpref); /* DESTROY() could be naughty */
6257 ENTER;
6258 PUSHSTACKi(PERLSI_DESTROY);
6259 EXTEND(SP, 2);
6260 PUSHMARK(SP);
6261 PUSHs(tmpref);
6262 PUTBACK;
6263 call_sv(MUTABLE_SV(destructor),
6264 G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
6265 POPSTACK;
6266 SPAGAIN;
6267 LEAVE;
6268 if(SvREFCNT(tmpref) < 2) {
6269 /* tmpref is not kept alive! */
6270 SvREFCNT(sv)--;
6271 SvRV_set(tmpref, NULL);
6272 SvROK_off(tmpref);
6273 }
6274 SvREFCNT_dec(tmpref);
6275 }
6276 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
6277
6278
6279 if (check_refcnt && SvREFCNT(sv)) {
6280 if (PL_in_clean_objs)
6281 Perl_croak(aTHX_
6282 "DESTROY created new reference to dead object '%s'",
6283 HvNAME_get(stash));
6284 /* DESTROY gave object new lease on life */
6285 return FALSE;
6286 }
6287 }
6288
6289 if (SvOBJECT(sv)) {
6290 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
6291 SvOBJECT_off(sv); /* Curse the object. */
6292 if (SvTYPE(sv) != SVt_PVIO)
6293 --PL_sv_objcount;/* XXX Might want something more general */
6294 }
6295 return TRUE;
6296}
6297
645c22ef
DM
6298/*
6299=for apidoc sv_newref
6300
6301Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
6302instead.
6303
6304=cut
6305*/
6306
79072805 6307SV *
af828c01 6308Perl_sv_newref(pTHX_ SV *const sv)
79072805 6309{
96a5add6 6310 PERL_UNUSED_CONTEXT;
463ee0b2 6311 if (sv)
4db098f4 6312 (SvREFCNT(sv))++;
79072805
LW
6313 return sv;
6314}
6315
c461cf8f
JH
6316/*
6317=for apidoc sv_free
6318
645c22ef
DM
6319Decrement an SV's reference count, and if it drops to zero, call
6320C<sv_clear> to invoke destructors and free up any memory used by
6321the body; finally, deallocate the SV's head itself.
6322Normally called via a wrapper macro C<SvREFCNT_dec>.
c461cf8f
JH
6323
6324=cut
6325*/
6326
79072805 6327void
af828c01 6328Perl_sv_free(pTHX_ SV *const sv)
79072805 6329{
27da23d5 6330 dVAR;
79072805
LW
6331 if (!sv)
6332 return;
a0d0e21e
LW
6333 if (SvREFCNT(sv) == 0) {
6334 if (SvFLAGS(sv) & SVf_BREAK)
645c22ef
DM
6335 /* this SV's refcnt has been artificially decremented to
6336 * trigger cleanup */
a0d0e21e 6337 return;
3280af22 6338 if (PL_in_clean_all) /* All is fair */
1edc1566 6339 return;
d689ffdd
JP
6340 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
6341 /* make sure SvREFCNT(sv)==0 happens very seldom */
6342 SvREFCNT(sv) = (~(U32)0)/2;
6343 return;
6344 }
41e4abd8 6345 if (ckWARN_d(WARN_INTERNAL)) {
41e4abd8
NC
6346#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
6347 Perl_dump_sv_child(aTHX_ sv);
e4c5322d
DM
6348#else
6349 #ifdef DEBUG_LEAKING_SCALARS
bfd95973 6350 sv_dump(sv);
e4c5322d 6351 #endif
bfd95973
NC
6352#ifdef DEBUG_LEAKING_SCALARS_ABORT
6353 if (PL_warnhook == PERL_WARNHOOK_FATAL
6354 || ckDEAD(packWARN(WARN_INTERNAL))) {
6355 /* Don't let Perl_warner cause us to escape our fate: */
6356 abort();
6357 }
6358#endif
6359 /* This may not return: */
6360 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
6361 "Attempt to free unreferenced scalar: SV 0x%"UVxf
6362 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
41e4abd8
NC
6363#endif
6364 }
77abb4c6
NC
6365#ifdef DEBUG_LEAKING_SCALARS_ABORT
6366 abort();
6367#endif
79072805
LW
6368 return;
6369 }
4db098f4 6370 if (--(SvREFCNT(sv)) > 0)
8990e307 6371 return;
8c4d3c90
NC
6372 Perl_sv_free2(aTHX_ sv);
6373}
6374
6375void
af828c01 6376Perl_sv_free2(pTHX_ SV *const sv)
8c4d3c90 6377{
27da23d5 6378 dVAR;
7918f24d
NC
6379
6380 PERL_ARGS_ASSERT_SV_FREE2;
6381
463ee0b2
LW
6382#ifdef DEBUGGING
6383 if (SvTEMP(sv)) {
9b387841
NC
6384 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING),
6385 "Attempt to free temp prematurely: SV 0x%"UVxf
6386 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
79072805 6387 return;
79072805 6388 }
463ee0b2 6389#endif
d689ffdd
JP
6390 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
6391 /* make sure SvREFCNT(sv)==0 happens very seldom */
6392 SvREFCNT(sv) = (~(U32)0)/2;
6393 return;
6394 }
79072805 6395 sv_clear(sv);
477f5d66
CS
6396 if (! SvREFCNT(sv))
6397 del_SV(sv);
79072805
LW
6398}
6399
954c1994
GS
6400/*
6401=for apidoc sv_len
6402
645c22ef
DM
6403Returns the length of the string in the SV. Handles magic and type
6404coercion. See also C<SvCUR>, which gives raw access to the xpv_cur slot.
954c1994
GS
6405
6406=cut
6407*/
6408
79072805 6409STRLEN
af828c01 6410Perl_sv_len(pTHX_ register SV *const sv)
79072805 6411{
463ee0b2 6412 STRLEN len;
79072805
LW
6413
6414 if (!sv)
6415 return 0;
6416
8990e307 6417 if (SvGMAGICAL(sv))
565764a8 6418 len = mg_length(sv);
8990e307 6419 else
4d84ee25 6420 (void)SvPV_const(sv, len);
463ee0b2 6421 return len;
79072805
LW
6422}
6423
c461cf8f
JH
6424/*
6425=for apidoc sv_len_utf8
6426
6427Returns the number of characters in the string in an SV, counting wide
1e54db1a 6428UTF-8 bytes as a single character. Handles magic and type coercion.
c461cf8f
JH
6429
6430=cut
6431*/
6432
7e8c5dac 6433/*
c05a5c57 6434 * The length is cached in PERL_MAGIC_utf8, in the mg_len field. Also the
9564a3bd
NC
6435 * mg_ptr is used, by sv_pos_u2b() and sv_pos_b2u() - see the comments below.
6436 * (Note that the mg_len is not the length of the mg_ptr field.
6437 * This allows the cache to store the character length of the string without
6438 * needing to malloc() extra storage to attach to the mg_ptr.)
7a5fa8a2 6439 *
7e8c5dac
HS
6440 */
6441
a0ed51b3 6442STRLEN
af828c01 6443Perl_sv_len_utf8(pTHX_ register SV *const sv)
a0ed51b3 6444{
a0ed51b3
LW
6445 if (!sv)
6446 return 0;
6447
a0ed51b3 6448 if (SvGMAGICAL(sv))
b76347f2 6449 return mg_length(sv);
a0ed51b3 6450 else
b76347f2 6451 {
26346457 6452 STRLEN len;
e62f0680 6453 const U8 *s = (U8*)SvPV_const(sv, len);
7e8c5dac 6454
26346457
NC
6455 if (PL_utf8cache) {
6456 STRLEN ulen;
fe5bfecd 6457 MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : NULL;
26346457 6458
6ef2ab89
NC
6459 if (mg && (mg->mg_len != -1 || mg->mg_ptr)) {
6460 if (mg->mg_len != -1)
6461 ulen = mg->mg_len;
6462 else {
6463 /* We can use the offset cache for a headstart.
6464 The longer value is stored in the first pair. */
6465 STRLEN *cache = (STRLEN *) mg->mg_ptr;
6466
6467 ulen = cache[0] + Perl_utf8_length(aTHX_ s + cache[1],
6468 s + len);
6469 }
6470
26346457
NC
6471 if (PL_utf8cache < 0) {
6472 const STRLEN real = Perl_utf8_length(aTHX_ s, s + len);
9df83ffd 6473 assert_uft8_cache_coherent("sv_len_utf8", ulen, real, sv);
26346457
NC
6474 }
6475 }
6476 else {
6477 ulen = Perl_utf8_length(aTHX_ s, s + len);
ec49a12c 6478 utf8_mg_len_cache_update(sv, &mg, ulen);
cb9e20bb 6479 }
26346457 6480 return ulen;
7e8c5dac 6481 }
26346457 6482 return Perl_utf8_length(aTHX_ s, s + len);
7e8c5dac
HS
6483 }
6484}
6485
9564a3bd
NC
6486/* Walk forwards to find the byte corresponding to the passed in UTF-8
6487 offset. */
bdf30dd6 6488static STRLEN
721e86b6 6489S_sv_pos_u2b_forwards(const U8 *const start, const U8 *const send,
79d2d448 6490 STRLEN *const uoffset_p, bool *const at_end)
bdf30dd6
NC
6491{
6492 const U8 *s = start;
3e2d3818 6493 STRLEN uoffset = *uoffset_p;
bdf30dd6 6494
7918f24d
NC
6495 PERL_ARGS_ASSERT_SV_POS_U2B_FORWARDS;
6496
3e2d3818
NC
6497 while (s < send && uoffset) {
6498 --uoffset;
bdf30dd6 6499 s += UTF8SKIP(s);
3e2d3818 6500 }
79d2d448
NC
6501 if (s == send) {
6502 *at_end = TRUE;
6503 }
6504 else if (s > send) {
6505 *at_end = TRUE;
bdf30dd6
NC
6506 /* This is the existing behaviour. Possibly it should be a croak, as
6507 it's actually a bounds error */
6508 s = send;
6509 }
3e2d3818 6510 *uoffset_p -= uoffset;
bdf30dd6
NC
6511 return s - start;
6512}
6513
9564a3bd
NC
6514/* Given the length of the string in both bytes and UTF-8 characters, decide
6515 whether to walk forwards or backwards to find the byte corresponding to
6516 the passed in UTF-8 offset. */
c336ad0b 6517static STRLEN
721e86b6 6518S_sv_pos_u2b_midway(const U8 *const start, const U8 *send,
503752a1 6519 STRLEN uoffset, const STRLEN uend)
c336ad0b
NC
6520{
6521 STRLEN backw = uend - uoffset;
7918f24d
NC
6522
6523 PERL_ARGS_ASSERT_SV_POS_U2B_MIDWAY;
6524
c336ad0b 6525 if (uoffset < 2 * backw) {
25a8a4ef 6526 /* The assumption is that going forwards is twice the speed of going
c336ad0b
NC
6527 forward (that's where the 2 * backw comes from).
6528 (The real figure of course depends on the UTF-8 data.) */
503752a1
NC
6529 const U8 *s = start;
6530
6531 while (s < send && uoffset--)
6532 s += UTF8SKIP(s);
6533 assert (s <= send);
6534 if (s > send)
6535 s = send;
6536 return s - start;
c336ad0b
NC
6537 }
6538
6539 while (backw--) {
6540 send--;
6541 while (UTF8_IS_CONTINUATION(*send))
6542 send--;
6543 }
6544 return send - start;
6545}
6546
9564a3bd
NC
6547/* For the string representation of the given scalar, find the byte
6548 corresponding to the passed in UTF-8 offset. uoffset0 and boffset0
6549 give another position in the string, *before* the sought offset, which
6550 (which is always true, as 0, 0 is a valid pair of positions), which should
6551 help reduce the amount of linear searching.
6552 If *mgp is non-NULL, it should point to the UTF-8 cache magic, which
6553 will be used to reduce the amount of linear searching. The cache will be
6554 created if necessary, and the found value offered to it for update. */
28ccbf94 6555static STRLEN
af828c01 6556S_sv_pos_u2b_cached(pTHX_ SV *const sv, MAGIC **const mgp, const U8 *const start,
3e2d3818 6557 const U8 *const send, STRLEN uoffset,
7918f24d
NC
6558 STRLEN uoffset0, STRLEN boffset0)
6559{
7087a21c 6560 STRLEN boffset = 0; /* Actually always set, but let's keep gcc happy. */
c336ad0b 6561 bool found = FALSE;
79d2d448 6562 bool at_end = FALSE;
c336ad0b 6563
7918f24d
NC
6564 PERL_ARGS_ASSERT_SV_POS_U2B_CACHED;
6565
75c33c12
NC
6566 assert (uoffset >= uoffset0);
6567
48f9cf71
NC
6568 if (!uoffset)
6569 return 0;
6570
f89a570b
CS
6571 if (!SvREADONLY(sv)
6572 && PL_utf8cache
6573 && (*mgp || (SvTYPE(sv) >= SVt_PVMG &&
6574 (*mgp = mg_find(sv, PERL_MAGIC_utf8))))) {
d8b2e1f9
NC
6575 if ((*mgp)->mg_ptr) {
6576 STRLEN *cache = (STRLEN *) (*mgp)->mg_ptr;
6577 if (cache[0] == uoffset) {
6578 /* An exact match. */
6579 return cache[1];
6580 }
ab455f60
NC
6581 if (cache[2] == uoffset) {
6582 /* An exact match. */
6583 return cache[3];
6584 }
668af93f
NC
6585
6586 if (cache[0] < uoffset) {
d8b2e1f9
NC
6587 /* The cache already knows part of the way. */
6588 if (cache[0] > uoffset0) {
6589 /* The cache knows more than the passed in pair */
6590 uoffset0 = cache[0];
6591 boffset0 = cache[1];
6592 }
6593 if ((*mgp)->mg_len != -1) {
6594 /* And we know the end too. */
6595 boffset = boffset0
721e86b6 6596 + sv_pos_u2b_midway(start + boffset0, send,
d8b2e1f9
NC
6597 uoffset - uoffset0,
6598 (*mgp)->mg_len - uoffset0);
6599 } else {
3e2d3818 6600 uoffset -= uoffset0;
d8b2e1f9 6601 boffset = boffset0
721e86b6 6602 + sv_pos_u2b_forwards(start + boffset0,
79d2d448 6603 send, &uoffset, &at_end);
3e2d3818 6604 uoffset += uoffset0;
d8b2e1f9 6605 }
dd7c5fd3
NC
6606 }
6607 else if (cache[2] < uoffset) {
6608 /* We're between the two cache entries. */
6609 if (cache[2] > uoffset0) {
6610 /* and the cache knows more than the passed in pair */
6611 uoffset0 = cache[2];
6612 boffset0 = cache[3];
6613 }
6614
668af93f 6615 boffset = boffset0
721e86b6 6616 + sv_pos_u2b_midway(start + boffset0,
668af93f
NC
6617 start + cache[1],
6618 uoffset - uoffset0,
6619 cache[0] - uoffset0);
dd7c5fd3
NC
6620 } else {
6621 boffset = boffset0
721e86b6 6622 + sv_pos_u2b_midway(start + boffset0,
dd7c5fd3
NC
6623 start + cache[3],
6624 uoffset - uoffset0,
6625 cache[2] - uoffset0);
d8b2e1f9 6626 }
668af93f 6627 found = TRUE;
d8b2e1f9
NC
6628 }
6629 else if ((*mgp)->mg_len != -1) {
75c33c12
NC
6630 /* If we can take advantage of a passed in offset, do so. */
6631 /* In fact, offset0 is either 0, or less than offset, so don't
6632 need to worry about the other possibility. */
6633 boffset = boffset0
721e86b6 6634 + sv_pos_u2b_midway(start + boffset0, send,
75c33c12
NC
6635 uoffset - uoffset0,
6636 (*mgp)->mg_len - uoffset0);
c336ad0b
NC
6637 found = TRUE;
6638 }
28ccbf94 6639 }
c336ad0b
NC
6640
6641 if (!found || PL_utf8cache < 0) {
3e2d3818
NC
6642 STRLEN real_boffset;
6643 uoffset -= uoffset0;
6644 real_boffset = boffset0 + sv_pos_u2b_forwards(start + boffset0,
79d2d448 6645 send, &uoffset, &at_end);
3e2d3818 6646 uoffset += uoffset0;
75c33c12 6647
9df83ffd
NC
6648 if (found && PL_utf8cache < 0)
6649 assert_uft8_cache_coherent("sv_pos_u2b_cache", boffset,
6650 real_boffset, sv);
c336ad0b 6651 boffset = real_boffset;
28ccbf94 6652 }
0905937d 6653
79d2d448
NC
6654 if (PL_utf8cache) {
6655 if (at_end)
6656 utf8_mg_len_cache_update(sv, mgp, uoffset);
6657 else
6658 utf8_mg_pos_cache_update(sv, mgp, boffset, uoffset, send - start);
6659 }
28ccbf94
NC
6660 return boffset;
6661}
6662
9564a3bd
NC
6663
6664/*
d931b1be 6665=for apidoc sv_pos_u2b_flags
9564a3bd
NC
6666
6667Converts the value pointed to by offsetp from a count of UTF-8 chars from
6668the start of the string, to a count of the equivalent number of bytes; if
6669lenp is non-zero, it does the same to lenp, but this time starting from
d931b1be
NC
6670the offset, rather than from the start of the string. Handles type coercion.
6671I<flags> is passed to C<SvPV_flags>, and usually should be
6672C<SV_GMAGIC|SV_CONST_RETURN> to handle magic.
9564a3bd
NC
6673
6674=cut
6675*/
6676
6677/*
d931b1be 6678 * sv_pos_u2b_flags() uses, like sv_pos_b2u(), the mg_ptr of the potential
c05a5c57 6679 * PERL_MAGIC_utf8 of the sv to store the mapping between UTF-8 and
9564a3bd
NC
6680 * byte offsets. See also the comments of S_utf8_mg_pos_cache_update().
6681 *
6682 */
6683
d931b1be
NC
6684STRLEN
6685Perl_sv_pos_u2b_flags(pTHX_ SV *const sv, STRLEN uoffset, STRLEN *const lenp,
6686 U32 flags)
a0ed51b3 6687{
245d4a47 6688 const U8 *start;
a0ed51b3 6689 STRLEN len;
d931b1be 6690 STRLEN boffset;
a0ed51b3 6691
d931b1be 6692 PERL_ARGS_ASSERT_SV_POS_U2B_FLAGS;
7918f24d 6693
d931b1be 6694 start = (U8*)SvPV_flags(sv, len, flags);
7e8c5dac 6695 if (len) {
bdf30dd6 6696 const U8 * const send = start + len;
0905937d 6697 MAGIC *mg = NULL;
d931b1be 6698 boffset = sv_pos_u2b_cached(sv, &mg, start, send, uoffset, 0, 0);
bdf30dd6 6699
48f9cf71
NC
6700 if (lenp
6701 && *lenp /* don't bother doing work for 0, as its bytes equivalent
6702 is 0, and *lenp is already set to that. */) {
28ccbf94 6703 /* Convert the relative offset to absolute. */
777f7c56 6704 const STRLEN uoffset2 = uoffset + *lenp;
721e86b6
AL
6705 const STRLEN boffset2
6706 = sv_pos_u2b_cached(sv, &mg, start, send, uoffset2,
28ccbf94 6707 uoffset, boffset) - boffset;
bdf30dd6 6708
28ccbf94 6709 *lenp = boffset2;
bdf30dd6 6710 }
d931b1be
NC
6711 } else {
6712 if (lenp)
6713 *lenp = 0;
6714 boffset = 0;
a0ed51b3 6715 }
e23c8137 6716
d931b1be 6717 return boffset;
a0ed51b3
LW
6718}
6719
777f7c56
EB
6720/*
6721=for apidoc sv_pos_u2b
6722
6723Converts the value pointed to by offsetp from a count of UTF-8 chars from
6724the start of the string, to a count of the equivalent number of bytes; if
6725lenp is non-zero, it does the same to lenp, but this time starting from
6726the offset, rather than from the start of the string. Handles magic and
6727type coercion.
6728
d931b1be
NC
6729Use C<sv_pos_u2b_flags> in preference, which correctly handles strings longer
6730than 2Gb.
6731
777f7c56
EB
6732=cut
6733*/
6734
6735/*
6736 * sv_pos_u2b() uses, like sv_pos_b2u(), the mg_ptr of the potential
6737 * PERL_MAGIC_utf8 of the sv to store the mapping between UTF-8 and
6738 * byte offsets. See also the comments of S_utf8_mg_pos_cache_update().
6739 *
6740 */
6741
6742/* This function is subject to size and sign problems */
6743
6744void
6745Perl_sv_pos_u2b(pTHX_ register SV *const sv, I32 *const offsetp, I32 *const lenp)
6746{
d931b1be
NC
6747 PERL_ARGS_ASSERT_SV_POS_U2B;
6748
777f7c56
EB
6749 if (lenp) {
6750 STRLEN ulen = (STRLEN)*lenp;
d931b1be
NC
6751 *offsetp = (I32)sv_pos_u2b_flags(sv, (STRLEN)*offsetp, &ulen,
6752 SV_GMAGIC|SV_CONST_RETURN);
777f7c56
EB
6753 *lenp = (I32)ulen;
6754 } else {
d931b1be
NC
6755 *offsetp = (I32)sv_pos_u2b_flags(sv, (STRLEN)*offsetp, NULL,
6756 SV_GMAGIC|SV_CONST_RETURN);
777f7c56 6757 }
777f7c56
EB
6758}
6759
ec49a12c
NC
6760static void
6761S_utf8_mg_len_cache_update(pTHX_ SV *const sv, MAGIC **const mgp,
6762 const STRLEN ulen)
6763{
6764 PERL_ARGS_ASSERT_UTF8_MG_LEN_CACHE_UPDATE;
6765 if (SvREADONLY(sv))
6766 return;
6767
6768 if (!*mgp && (SvTYPE(sv) < SVt_PVMG ||
6769 !(*mgp = mg_find(sv, PERL_MAGIC_utf8)))) {
6770 *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, &PL_vtbl_utf8, 0, 0);
6771 }
6772 assert(*mgp);
6773
6774 (*mgp)->mg_len = ulen;
6775 /* For now, treat "overflowed" as "still unknown". See RT #72924. */
6776 if (ulen != (STRLEN) (*mgp)->mg_len)
6777 (*mgp)->mg_len = -1;
6778}
6779
9564a3bd
NC
6780/* Create and update the UTF8 magic offset cache, with the proffered utf8/
6781 byte length pairing. The (byte) length of the total SV is passed in too,
6782 as blen, because for some (more esoteric) SVs, the call to SvPV_const()
6783 may not have updated SvCUR, so we can't rely on reading it directly.
6784
6785 The proffered utf8/byte length pairing isn't used if the cache already has
6786 two pairs, and swapping either for the proffered pair would increase the
6787 RMS of the intervals between known byte offsets.
6788
6789 The cache itself consists of 4 STRLEN values
6790 0: larger UTF-8 offset
6791 1: corresponding byte offset
6792 2: smaller UTF-8 offset
6793 3: corresponding byte offset
6794
6795 Unused cache pairs have the value 0, 0.
6796 Keeping the cache "backwards" means that the invariant of
6797 cache[0] >= cache[2] is maintained even with empty slots, which means that
6798 the code that uses it doesn't need to worry if only 1 entry has actually
6799 been set to non-zero. It also makes the "position beyond the end of the
6800 cache" logic much simpler, as the first slot is always the one to start
6801 from.
645c22ef 6802*/
ec07b5e0 6803static void
ac1e9476
SS
6804S_utf8_mg_pos_cache_update(pTHX_ SV *const sv, MAGIC **const mgp, const STRLEN byte,
6805 const STRLEN utf8, const STRLEN blen)
ec07b5e0
NC
6806{
6807 STRLEN *cache;
7918f24d
NC
6808
6809 PERL_ARGS_ASSERT_UTF8_MG_POS_CACHE_UPDATE;
6810
ec07b5e0
NC
6811 if (SvREADONLY(sv))
6812 return;
6813
f89a570b
CS
6814 if (!*mgp && (SvTYPE(sv) < SVt_PVMG ||
6815 !(*mgp = mg_find(sv, PERL_MAGIC_utf8)))) {
ec07b5e0
NC
6816 *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, (MGVTBL*)&PL_vtbl_utf8, 0,
6817 0);
6818 (*mgp)->mg_len = -1;
6819 }
6820 assert(*mgp);
6821
6822 if (!(cache = (STRLEN *)(*mgp)->mg_ptr)) {
6823 Newxz(cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
6824 (*mgp)->mg_ptr = (char *) cache;
6825 }
6826 assert(cache);
6827
ab8be49d
NC
6828 if (PL_utf8cache < 0 && SvPOKp(sv)) {
6829 /* SvPOKp() because it's possible that sv has string overloading, and
6830 therefore is a reference, hence SvPVX() is actually a pointer.
6831 This cures the (very real) symptoms of RT 69422, but I'm not actually
6832 sure whether we should even be caching the results of UTF-8
6833 operations on overloading, given that nothing stops overloading
6834 returning a different value every time it's called. */
ef816a78 6835 const U8 *start = (const U8 *) SvPVX_const(sv);
6448472a 6836 const STRLEN realutf8 = utf8_length(start, start + byte);
ec07b5e0 6837
9df83ffd
NC
6838 assert_uft8_cache_coherent("utf8_mg_pos_cache_update", utf8, realutf8,
6839 sv);
ec07b5e0 6840 }
ab455f60
NC
6841
6842 /* Cache is held with the later position first, to simplify the code
6843 that deals with unbounded ends. */
6844
6845 ASSERT_UTF8_CACHE(cache);
6846 if (cache[1] == 0) {
6847 /* Cache is totally empty */
6848 cache[0] = utf8;
6849 cache[1] = byte;
6850 } else if (cache[3] == 0) {
6851 if (byte > cache[1]) {
6852 /* New one is larger, so goes first. */
6853 cache[2] = cache[0];
6854 cache[3] = cache[1];
6855 cache[0] = utf8;
6856 cache[1] = byte;
6857 } else {
6858 cache[2] = utf8;
6859 cache[3] = byte;
6860 }
6861 } else {
6862#define THREEWAY_SQUARE(a,b,c,d) \
6863 ((float)((d) - (c))) * ((float)((d) - (c))) \
6864 + ((float)((c) - (b))) * ((float)((c) - (b))) \
6865 + ((float)((b) - (a))) * ((float)((b) - (a)))
6866
6867 /* Cache has 2 slots in use, and we know three potential pairs.
6868 Keep the two that give the lowest RMS distance. Do the
486ec47a 6869 calculation in bytes simply because we always know the byte
ab455f60
NC
6870 length. squareroot has the same ordering as the positive value,
6871 so don't bother with the actual square root. */
6872 const float existing = THREEWAY_SQUARE(0, cache[3], cache[1], blen);
6873 if (byte > cache[1]) {
6874 /* New position is after the existing pair of pairs. */
6875 const float keep_earlier
6876 = THREEWAY_SQUARE(0, cache[3], byte, blen);
6877 const float keep_later
6878 = THREEWAY_SQUARE(0, cache[1], byte, blen);
6879
6880 if (keep_later < keep_earlier) {
6881 if (keep_later < existing) {
6882 cache[2] = cache[0];
6883 cache[3] = cache[1];
6884 cache[0] = utf8;
6885 cache[1] = byte;
6886 }
6887 }
6888 else {
6889 if (keep_earlier < existing) {
6890 cache[0] = utf8;
6891 cache[1] = byte;
6892 }
6893 }
6894 }
57d7fbf1
NC
6895 else if (byte > cache[3]) {
6896 /* New position is between the existing pair of pairs. */
6897 const float keep_earlier
6898 = THREEWAY_SQUARE(0, cache[3], byte, blen);
6899 const float keep_later
6900 = THREEWAY_SQUARE(0, byte, cache[1], blen);
6901
6902 if (keep_later < keep_earlier) {
6903 if (keep_later < existing) {
6904 cache[2] = utf8;
6905 cache[3] = byte;
6906 }
6907 }
6908 else {
6909 if (keep_earlier < existing) {
6910 cache[0] = utf8;
6911 cache[1] = byte;
6912 }
6913 }
6914 }
6915 else {
6916 /* New position is before the existing pair of pairs. */
6917 const float keep_earlier
6918 = THREEWAY_SQUARE(0, byte, cache[3], blen);
6919 const float keep_later
6920 = THREEWAY_SQUARE(0, byte, cache[1], blen);
6921
6922 if (keep_later < keep_earlier) {
6923 if (keep_later < existing) {
6924 cache[2] = utf8;
6925 cache[3] = byte;
6926 }
6927 }
6928 else {
6929 if (keep_earlier < existing) {
6930 cache[0] = cache[2];
6931 cache[1] = cache[3];
6932 cache[2] = utf8;
6933 cache[3] = byte;
6934 }
6935 }
6936 }
ab455f60 6937 }
0905937d 6938 ASSERT_UTF8_CACHE(cache);
ec07b5e0
NC
6939}
6940
ec07b5e0 6941/* We already know all of the way, now we may be able to walk back. The same
25a8a4ef
NC
6942 assumption is made as in S_sv_pos_u2b_midway(), namely that walking
6943 backward is half the speed of walking forward. */
ec07b5e0 6944static STRLEN
ac1e9476
SS
6945S_sv_pos_b2u_midway(pTHX_ const U8 *const s, const U8 *const target,
6946 const U8 *end, STRLEN endu)
ec07b5e0
NC
6947{
6948 const STRLEN forw = target - s;
6949 STRLEN backw = end - target;
6950
7918f24d
NC
6951 PERL_ARGS_ASSERT_SV_POS_B2U_MIDWAY;
6952
ec07b5e0 6953 if (forw < 2 * backw) {
6448472a 6954 return utf8_length(s, target);
ec07b5e0
NC
6955 }
6956
6957 while (end > target) {
6958 end--;
6959 while (UTF8_IS_CONTINUATION(*end)) {
6960 end--;
6961 }
6962 endu--;
6963 }
6964 return endu;
6965}
6966
9564a3bd
NC
6967/*
6968=for apidoc sv_pos_b2u
6969
6970Converts the value pointed to by offsetp from a count of bytes from the
6971start of the string, to a count of the equivalent number of UTF-8 chars.
6972Handles magic and type coercion.
6973
6974=cut
6975*/
6976
6977/*
6978 * sv_pos_b2u() uses, like sv_pos_u2b(), the mg_ptr of the potential
c05a5c57 6979 * PERL_MAGIC_utf8 of the sv to store the mapping between UTF-8 and
9564a3bd
NC
6980 * byte offsets.
6981 *
6982 */
a0ed51b3 6983void
ac1e9476 6984Perl_sv_pos_b2u(pTHX_ register SV *const sv, I32 *const offsetp)
a0ed51b3 6985{
83003860 6986 const U8* s;
ec07b5e0 6987 const STRLEN byte = *offsetp;
7087a21c 6988 STRLEN len = 0; /* Actually always set, but let's keep gcc happy. */
ab455f60 6989 STRLEN blen;
ec07b5e0
NC
6990 MAGIC* mg = NULL;
6991 const U8* send;
a922f900 6992 bool found = FALSE;
a0ed51b3 6993
7918f24d
NC
6994 PERL_ARGS_ASSERT_SV_POS_B2U;
6995
a0ed51b3
LW
6996 if (!sv)
6997 return;
6998
ab455f60 6999 s = (const U8*)SvPV_const(sv, blen);
7e8c5dac 7000
ab455f60 7001 if (blen < byte)
ec07b5e0 7002 Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
7e8c5dac 7003
ec07b5e0 7004 send = s + byte;
a67d7df9 7005
f89a570b
CS
7006 if (!SvREADONLY(sv)
7007 && PL_utf8cache
7008 && SvTYPE(sv) >= SVt_PVMG
7009 && (mg = mg_find(sv, PERL_MAGIC_utf8)))
7010 {
ffca234a 7011 if (mg->mg_ptr) {
d4c19fe8 7012 STRLEN * const cache = (STRLEN *) mg->mg_ptr;
b9f984a5 7013 if (cache[1] == byte) {
ec07b5e0
NC
7014 /* An exact match. */
7015 *offsetp = cache[0];
ec07b5e0 7016 return;
7e8c5dac 7017 }
ab455f60
NC
7018 if (cache[3] == byte) {
7019 /* An exact match. */
7020 *offsetp = cache[2];
7021 return;
7022 }
668af93f
NC
7023
7024 if (cache[1] < byte) {
ec07b5e0 7025 /* We already know part of the way. */
b9f984a5
NC
7026 if (mg->mg_len != -1) {
7027 /* Actually, we know the end too. */
7028 len = cache[0]
7029 + S_sv_pos_b2u_midway(aTHX_ s + cache[1], send,
ab455f60 7030 s + blen, mg->mg_len - cache[0]);
b9f984a5 7031 } else {
6448472a 7032 len = cache[0] + utf8_length(s + cache[1], send);
b9f984a5 7033 }
7e8c5dac 7034 }
9f985e4c
NC
7035 else if (cache[3] < byte) {
7036 /* We're between the two cached pairs, so we do the calculation
7037 offset by the byte/utf-8 positions for the earlier pair,
7038 then add the utf-8 characters from the string start to
7039 there. */
7040 len = S_sv_pos_b2u_midway(aTHX_ s + cache[3], send,
7041 s + cache[1], cache[0] - cache[2])
7042 + cache[2];
7043
7044 }
7045 else { /* cache[3] > byte */
7046 len = S_sv_pos_b2u_midway(aTHX_ s, send, s + cache[3],
7047 cache[2]);
7e8c5dac 7048
7e8c5dac 7049 }
ec07b5e0 7050 ASSERT_UTF8_CACHE(cache);
a922f900 7051 found = TRUE;
ffca234a 7052 } else if (mg->mg_len != -1) {
ab455f60 7053 len = S_sv_pos_b2u_midway(aTHX_ s, send, s + blen, mg->mg_len);
a922f900 7054 found = TRUE;
7e8c5dac 7055 }
a0ed51b3 7056 }
a922f900 7057 if (!found || PL_utf8cache < 0) {
6448472a 7058 const STRLEN real_len = utf8_length(s, send);
a922f900 7059
9df83ffd
NC
7060 if (found && PL_utf8cache < 0)
7061 assert_uft8_cache_coherent("sv_pos_b2u", len, real_len, sv);
a922f900 7062 len = real_len;
ec07b5e0
NC
7063 }
7064 *offsetp = len;
7065
0d7caf4c
NC
7066 if (PL_utf8cache) {
7067 if (blen == byte)
7068 utf8_mg_len_cache_update(sv, &mg, len);
7069 else
7070 utf8_mg_pos_cache_update(sv, &mg, byte, len, blen);
7071 }
a0ed51b3
LW
7072}
7073
9df83ffd
NC
7074static void
7075S_assert_uft8_cache_coherent(pTHX_ const char *const func, STRLEN from_cache,
7076 STRLEN real, SV *const sv)
7077{
7078 PERL_ARGS_ASSERT_ASSERT_UFT8_CACHE_COHERENT;
7079
7080 /* As this is debugging only code, save space by keeping this test here,
7081 rather than inlining it in all the callers. */
7082 if (from_cache == real)
7083 return;
7084
7085 /* Need to turn the assertions off otherwise we may recurse infinitely
7086 while printing error messages. */
7087 SAVEI8(PL_utf8cache);
7088 PL_utf8cache = 0;
7089 Perl_croak(aTHX_ "panic: %s cache %"UVuf" real %"UVuf" for %"SVf,
7090 func, (UV) from_cache, (UV) real, SVfARG(sv));
7091}
7092
954c1994
GS
7093/*
7094=for apidoc sv_eq
7095
7096Returns a boolean indicating whether the strings in the two SVs are
645c22ef
DM
7097identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
7098coerce its args to strings if necessary.
954c1994 7099
078504b2
FC
7100=for apidoc sv_eq_flags
7101
7102Returns a boolean indicating whether the strings in the two SVs are
7103identical. Is UTF-8 and 'use bytes' aware and coerces its args to strings
7104if necessary. If the flags include SV_GMAGIC, it handles get-magic, too.
7105
954c1994
GS
7106=cut
7107*/
7108
79072805 7109I32
31c72c81 7110Perl_sv_eq_flags(pTHX_ register SV *sv1, register SV *sv2, const U32 flags)
79072805 7111{
97aff369 7112 dVAR;
e1ec3a88 7113 const char *pv1;
463ee0b2 7114 STRLEN cur1;
e1ec3a88 7115 const char *pv2;
463ee0b2 7116 STRLEN cur2;
e01b9e88 7117 I32 eq = 0;
bd61b366 7118 char *tpv = NULL;
a0714e2c 7119 SV* svrecode = NULL;
79072805 7120
e01b9e88 7121 if (!sv1) {
79072805
LW
7122 pv1 = "";
7123 cur1 = 0;
7124 }
ced497e2
YST
7125 else {
7126 /* if pv1 and pv2 are the same, second SvPV_const call may
078504b2
FC
7127 * invalidate pv1 (if we are handling magic), so we may need to
7128 * make a copy */
7129 if (sv1 == sv2 && flags & SV_GMAGIC
7130 && (SvTHINKFIRST(sv1) || SvGMAGICAL(sv1))) {
ced497e2 7131 pv1 = SvPV_const(sv1, cur1);
59cd0e26 7132 sv1 = newSVpvn_flags(pv1, cur1, SVs_TEMP | SvUTF8(sv2));
ced497e2 7133 }
078504b2 7134 pv1 = SvPV_flags_const(sv1, cur1, flags);
ced497e2 7135 }
79072805 7136
e01b9e88
SC
7137 if (!sv2){
7138 pv2 = "";
7139 cur2 = 0;
92d29cee 7140 }
e01b9e88 7141 else
078504b2 7142 pv2 = SvPV_flags_const(sv2, cur2, flags);
79072805 7143
cf48d248 7144 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
7145 /* Differing utf8ness.
7146 * Do not UTF8size the comparands as a side-effect. */
7147 if (PL_encoding) {
7148 if (SvUTF8(sv1)) {
553e1bcc
AT
7149 svrecode = newSVpvn(pv2, cur2);
7150 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 7151 pv2 = SvPV_const(svrecode, cur2);
799ef3cb
JH
7152 }
7153 else {
553e1bcc
AT
7154 svrecode = newSVpvn(pv1, cur1);
7155 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 7156 pv1 = SvPV_const(svrecode, cur1);
799ef3cb
JH
7157 }
7158 /* Now both are in UTF-8. */
0a1bd7ac
DM
7159 if (cur1 != cur2) {
7160 SvREFCNT_dec(svrecode);
799ef3cb 7161 return FALSE;
0a1bd7ac 7162 }
799ef3cb
JH
7163 }
7164 else {
799ef3cb 7165 if (SvUTF8(sv1)) {
fed3ba5d
NC
7166 /* sv1 is the UTF-8 one */
7167 return bytes_cmp_utf8((const U8*)pv2, cur2,
7168 (const U8*)pv1, cur1) == 0;
799ef3cb
JH
7169 }
7170 else {
fed3ba5d
NC
7171 /* sv2 is the UTF-8 one */
7172 return bytes_cmp_utf8((const U8*)pv1, cur1,
7173 (const U8*)pv2, cur2) == 0;
799ef3cb
JH
7174 }
7175 }
cf48d248
JH
7176 }
7177
7178 if (cur1 == cur2)
765f542d 7179 eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
e01b9e88 7180
b37c2d43 7181 SvREFCNT_dec(svrecode);
553e1bcc
AT
7182 if (tpv)
7183 Safefree(tpv);
cf48d248 7184
e01b9e88 7185 return eq;
79072805
LW
7186}
7187
954c1994
GS
7188/*
7189=for apidoc sv_cmp
7190
7191Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
7192string in C<sv1> is less than, equal to, or greater than the string in
645c22ef
DM
7193C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
7194coerce its args to strings if necessary. See also C<sv_cmp_locale>.
954c1994 7195
078504b2
FC
7196=for apidoc sv_cmp_flags
7197
7198Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
7199string in C<sv1> is less than, equal to, or greater than the string in
7200C<sv2>. Is UTF-8 and 'use bytes' aware and will coerce its args to strings
7201if necessary. If the flags include SV_GMAGIC, it handles get magic. See
7202also C<sv_cmp_locale_flags>.
7203
954c1994
GS
7204=cut
7205*/
7206
79072805 7207I32
ac1e9476 7208Perl_sv_cmp(pTHX_ register SV *const sv1, register SV *const sv2)
79072805 7209{
078504b2
FC
7210 return sv_cmp_flags(sv1, sv2, SV_GMAGIC);
7211}
7212
7213I32
31c72c81
NC
7214Perl_sv_cmp_flags(pTHX_ register SV *const sv1, register SV *const sv2,
7215 const U32 flags)
078504b2 7216{
97aff369 7217 dVAR;
560a288e 7218 STRLEN cur1, cur2;
e1ec3a88 7219 const char *pv1, *pv2;
bd61b366 7220 char *tpv = NULL;
cf48d248 7221 I32 cmp;
a0714e2c 7222 SV *svrecode = NULL;
560a288e 7223
e01b9e88
SC
7224 if (!sv1) {
7225 pv1 = "";
560a288e
GS
7226 cur1 = 0;
7227 }
e01b9e88 7228 else
078504b2 7229 pv1 = SvPV_flags_const(sv1, cur1, flags);
560a288e 7230
553e1bcc 7231 if (!sv2) {
e01b9e88 7232 pv2 = "";
560a288e
GS
7233 cur2 = 0;
7234 }
e01b9e88 7235 else
078504b2 7236 pv2 = SvPV_flags_const(sv2, cur2, flags);
79072805 7237
cf48d248 7238 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
7239 /* Differing utf8ness.
7240 * Do not UTF8size the comparands as a side-effect. */
cf48d248 7241 if (SvUTF8(sv1)) {
799ef3cb 7242 if (PL_encoding) {
553e1bcc
AT
7243 svrecode = newSVpvn(pv2, cur2);
7244 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 7245 pv2 = SvPV_const(svrecode, cur2);
799ef3cb
JH
7246 }
7247 else {
fed3ba5d
NC
7248 const int retval = -bytes_cmp_utf8((const U8*)pv2, cur2,
7249 (const U8*)pv1, cur1);
7250 return retval ? retval < 0 ? -1 : +1 : 0;
799ef3cb 7251 }
cf48d248
JH
7252 }
7253 else {
799ef3cb 7254 if (PL_encoding) {
553e1bcc
AT
7255 svrecode = newSVpvn(pv1, cur1);
7256 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 7257 pv1 = SvPV_const(svrecode, cur1);
799ef3cb
JH
7258 }
7259 else {
fed3ba5d
NC
7260 const int retval = bytes_cmp_utf8((const U8*)pv1, cur1,
7261 (const U8*)pv2, cur2);
7262 return retval ? retval < 0 ? -1 : +1 : 0;
799ef3cb 7263 }
cf48d248
JH
7264 }
7265 }
7266
e01b9e88 7267 if (!cur1) {
cf48d248 7268 cmp = cur2 ? -1 : 0;
e01b9e88 7269 } else if (!cur2) {
cf48d248
JH
7270 cmp = 1;
7271 } else {
e1ec3a88 7272 const I32 retval = memcmp((const void*)pv1, (const void*)pv2, cur1 < cur2 ? cur1 : cur2);
e01b9e88
SC
7273
7274 if (retval) {
cf48d248 7275 cmp = retval < 0 ? -1 : 1;
e01b9e88 7276 } else if (cur1 == cur2) {
cf48d248
JH
7277 cmp = 0;
7278 } else {
7279 cmp = cur1 < cur2 ? -1 : 1;
e01b9e88 7280 }
cf48d248 7281 }
16660edb 7282
b37c2d43 7283 SvREFCNT_dec(svrecode);
553e1bcc
AT
7284 if (tpv)
7285 Safefree(tpv);
cf48d248
JH
7286
7287 return cmp;
bbce6d69 7288}
16660edb 7289
c461cf8f
JH
7290/*
7291=for apidoc sv_cmp_locale
7292
645c22ef
DM
7293Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
7294'use bytes' aware, handles get magic, and will coerce its args to strings
d77cdebf 7295if necessary. See also C<sv_cmp>.
c461cf8f 7296
078504b2
FC
7297=for apidoc sv_cmp_locale_flags
7298
7299Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
7300'use bytes' aware and will coerce its args to strings if necessary. If the
7301flags contain SV_GMAGIC, it handles get magic. See also C<sv_cmp_flags>.
7302
c461cf8f
JH
7303=cut
7304*/
7305
bbce6d69 7306I32
ac1e9476 7307Perl_sv_cmp_locale(pTHX_ register SV *const sv1, register SV *const sv2)
bbce6d69 7308{
078504b2
FC
7309 return sv_cmp_locale_flags(sv1, sv2, SV_GMAGIC);
7310}
7311
7312I32
31c72c81
NC
7313Perl_sv_cmp_locale_flags(pTHX_ register SV *const sv1, register SV *const sv2,
7314 const U32 flags)
078504b2 7315{
97aff369 7316 dVAR;
36477c24 7317#ifdef USE_LOCALE_COLLATE
16660edb 7318
bbce6d69 7319 char *pv1, *pv2;
7320 STRLEN len1, len2;
7321 I32 retval;
16660edb 7322
3280af22 7323 if (PL_collation_standard)
bbce6d69 7324 goto raw_compare;
16660edb 7325
bbce6d69 7326 len1 = 0;
078504b2 7327 pv1 = sv1 ? sv_collxfrm_flags(sv1, &len1, flags) : (char *) NULL;
bbce6d69 7328 len2 = 0;
078504b2 7329 pv2 = sv2 ? sv_collxfrm_flags(sv2, &len2, flags) : (char *) NULL;
16660edb 7330
bbce6d69 7331 if (!pv1 || !len1) {
7332 if (pv2 && len2)
7333 return -1;
7334 else
7335 goto raw_compare;
7336 }
7337 else {
7338 if (!pv2 || !len2)
7339 return 1;
7340 }
16660edb 7341
bbce6d69 7342 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 7343
bbce6d69 7344 if (retval)
16660edb 7345 return retval < 0 ? -1 : 1;
7346
bbce6d69 7347 /*
7348 * When the result of collation is equality, that doesn't mean
7349 * that there are no differences -- some locales exclude some
7350 * characters from consideration. So to avoid false equalities,
7351 * we use the raw string as a tiebreaker.
7352 */
16660edb 7353
bbce6d69 7354 raw_compare:
5f66b61c 7355 /*FALLTHROUGH*/
16660edb 7356
36477c24 7357#endif /* USE_LOCALE_COLLATE */
16660edb 7358
bbce6d69 7359 return sv_cmp(sv1, sv2);
7360}
79072805 7361
645c22ef 7362
36477c24 7363#ifdef USE_LOCALE_COLLATE
645c22ef 7364
7a4c00b4 7365/*
645c22ef
DM
7366=for apidoc sv_collxfrm
7367
078504b2
FC
7368This calls C<sv_collxfrm_flags> with the SV_GMAGIC flag. See
7369C<sv_collxfrm_flags>.
7370
7371=for apidoc sv_collxfrm_flags
7372
7373Add Collate Transform magic to an SV if it doesn't already have it. If the
7374flags contain SV_GMAGIC, it handles get-magic.
645c22ef
DM
7375
7376Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
7377scalar data of the variable, but transformed to such a format that a normal
7378memory comparison can be used to compare the data according to the locale
7379settings.
7380
7381=cut
7382*/
7383
bbce6d69 7384char *
078504b2 7385Perl_sv_collxfrm_flags(pTHX_ SV *const sv, STRLEN *const nxp, const I32 flags)
bbce6d69 7386{
97aff369 7387 dVAR;
7a4c00b4 7388 MAGIC *mg;
16660edb 7389
078504b2 7390 PERL_ARGS_ASSERT_SV_COLLXFRM_FLAGS;
7918f24d 7391
14befaf4 7392 mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
3280af22 7393 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
93524f2b
NC
7394 const char *s;
7395 char *xf;
bbce6d69 7396 STRLEN len, xlen;
7397
7a4c00b4 7398 if (mg)
7399 Safefree(mg->mg_ptr);
078504b2 7400 s = SvPV_flags_const(sv, len, flags);
bbce6d69 7401 if ((xf = mem_collxfrm(s, len, &xlen))) {
7a4c00b4 7402 if (! mg) {
d83f0a82
NC
7403#ifdef PERL_OLD_COPY_ON_WRITE
7404 if (SvIsCOW(sv))
7405 sv_force_normal_flags(sv, 0);
7406#endif
7407 mg = sv_magicext(sv, 0, PERL_MAGIC_collxfrm, &PL_vtbl_collxfrm,
7408 0, 0);
7a4c00b4 7409 assert(mg);
bbce6d69 7410 }
7a4c00b4 7411 mg->mg_ptr = xf;
565764a8 7412 mg->mg_len = xlen;
7a4c00b4 7413 }
7414 else {
ff0cee69 7415 if (mg) {
7416 mg->mg_ptr = NULL;
565764a8 7417 mg->mg_len = -1;
ff0cee69 7418 }
bbce6d69 7419 }
7420 }
7a4c00b4 7421 if (mg && mg->mg_ptr) {
565764a8 7422 *nxp = mg->mg_len;
3280af22 7423 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 7424 }
7425 else {
7426 *nxp = 0;
7427 return NULL;
16660edb 7428 }
79072805
LW
7429}
7430
36477c24 7431#endif /* USE_LOCALE_COLLATE */
bbce6d69 7432
f80c2205
NC
7433static char *
7434S_sv_gets_append_to_utf8(pTHX_ SV *const sv, PerlIO *const fp, I32 append)
7435{
7436 SV * const tsv = newSV(0);
7437 ENTER;
7438 SAVEFREESV(tsv);
7439 sv_gets(tsv, fp, 0);
7440 sv_utf8_upgrade_nomg(tsv);
7441 SvCUR_set(sv,append);
7442 sv_catsv(sv,tsv);
7443 LEAVE;
7444 return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
7445}
7446
7447static char *
7448S_sv_gets_read_record(pTHX_ SV *const sv, PerlIO *const fp, I32 append)
7449{
7450 I32 bytesread;
7451 const U32 recsize = SvUV(SvRV(PL_rs)); /* RsRECORD() guarantees > 0. */
7452 /* Grab the size of the record we're getting */
7453 char *const buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append;
7454#ifdef VMS
7455 int fd;
7456#endif
7457
7458 /* Go yank in */
7459#ifdef VMS
7460 /* VMS wants read instead of fread, because fread doesn't respect */
7461 /* RMS record boundaries. This is not necessarily a good thing to be */
7462 /* doing, but we've got no other real choice - except avoid stdio
7463 as implementation - perhaps write a :vms layer ?
7464 */
7465 fd = PerlIO_fileno(fp);
7466 if (fd != -1) {
7467 bytesread = PerlLIO_read(fd, buffer, recsize);
7468 }
7469 else /* in-memory file from PerlIO::Scalar */
7470#endif
7471 {
7472 bytesread = PerlIO_read(fp, buffer, recsize);
7473 }
7474
7475 if (bytesread < 0)
7476 bytesread = 0;
7477 SvCUR_set(sv, bytesread + append);
7478 buffer[bytesread] = '\0';
7479 return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
7480}
7481
c461cf8f
JH
7482/*
7483=for apidoc sv_gets
7484
7485Get a line from the filehandle and store it into the SV, optionally
7486appending to the currently-stored string.
7487
7488=cut
7489*/
7490
79072805 7491char *
ac1e9476 7492Perl_sv_gets(pTHX_ register SV *const sv, register PerlIO *const fp, I32 append)
79072805 7493{
97aff369 7494 dVAR;
e1ec3a88 7495 const char *rsptr;
c07a80fd 7496 STRLEN rslen;
7497 register STDCHAR rslast;
7498 register STDCHAR *bp;
7499 register I32 cnt;
9c5ffd7c 7500 I32 i = 0;
8bfdd7d9 7501 I32 rspara = 0;
c07a80fd 7502
7918f24d
NC
7503 PERL_ARGS_ASSERT_SV_GETS;
7504
bc44a8a2
NC
7505 if (SvTHINKFIRST(sv))
7506 sv_force_normal_flags(sv, append ? 0 : SV_COW_DROP_PV);
765f542d
NC
7507 /* XXX. If you make this PVIV, then copy on write can copy scalars read
7508 from <>.
7509 However, perlbench says it's slower, because the existing swipe code
7510 is faster than copy on write.
7511 Swings and roundabouts. */
862a34c6 7512 SvUPGRADE(sv, SVt_PV);
99491443 7513
ff68c719 7514 SvSCREAM_off(sv);
efd8b2ba
AE
7515
7516 if (append) {
7517 if (PerlIO_isutf8(fp)) {
7518 if (!SvUTF8(sv)) {
7519 sv_utf8_upgrade_nomg(sv);
7520 sv_pos_u2b(sv,&append,0);
7521 }
7522 } else if (SvUTF8(sv)) {
f80c2205 7523 return S_sv_gets_append_to_utf8(aTHX_ sv, fp, append);
efd8b2ba
AE
7524 }
7525 }
7526
7527 SvPOK_only(sv);
05dee287
JJ
7528 if (!append) {
7529 SvCUR_set(sv,0);
7530 }
efd8b2ba
AE
7531 if (PerlIO_isutf8(fp))
7532 SvUTF8_on(sv);
c07a80fd 7533
923e4eb5 7534 if (IN_PERL_COMPILETIME) {
8bfdd7d9
HS
7535 /* we always read code in line mode */
7536 rsptr = "\n";
7537 rslen = 1;
7538 }
7539 else if (RsSNARF(PL_rs)) {
7a5fa8a2 7540 /* If it is a regular disk file use size from stat() as estimate
acbd132f
JH
7541 of amount we are going to read -- may result in mallocing
7542 more memory than we really need if the layers below reduce
7543 the size we read (e.g. CRLF or a gzip layer).
e468d35b 7544 */
e311fd51 7545 Stat_t st;
e468d35b 7546 if (!PerlLIO_fstat(PerlIO_fileno(fp), &st) && S_ISREG(st.st_mode)) {
f54cb97a 7547 const Off_t offset = PerlIO_tell(fp);
58f1856e 7548 if (offset != (Off_t) -1 && st.st_size + append > offset) {
e468d35b
NIS
7549 (void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 1));
7550 }
7551 }
c07a80fd 7552 rsptr = NULL;
7553 rslen = 0;
7554 }
3280af22 7555 else if (RsRECORD(PL_rs)) {
f80c2205 7556 return S_sv_gets_read_record(aTHX_ sv, fp, append);
5b2b9c68 7557 }
3280af22 7558 else if (RsPARA(PL_rs)) {
c07a80fd 7559 rsptr = "\n\n";
7560 rslen = 2;
8bfdd7d9 7561 rspara = 1;
c07a80fd 7562 }
7d59b7e4
NIS
7563 else {
7564 /* Get $/ i.e. PL_rs into same encoding as stream wants */
7565 if (PerlIO_isutf8(fp)) {
7566 rsptr = SvPVutf8(PL_rs, rslen);
7567 }
7568 else {
7569 if (SvUTF8(PL_rs)) {
7570 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
7571 Perl_croak(aTHX_ "Wide character in $/");
7572 }
7573 }
93524f2b 7574 rsptr = SvPV_const(PL_rs, rslen);
7d59b7e4
NIS
7575 }
7576 }
7577
c07a80fd 7578 rslast = rslen ? rsptr[rslen - 1] : '\0';
7579
8bfdd7d9 7580 if (rspara) { /* have to do this both before and after */
79072805 7581 do { /* to make sure file boundaries work right */
760ac839 7582 if (PerlIO_eof(fp))
a0d0e21e 7583 return 0;
760ac839 7584 i = PerlIO_getc(fp);
79072805 7585 if (i != '\n') {
a0d0e21e
LW
7586 if (i == -1)
7587 return 0;
760ac839 7588 PerlIO_ungetc(fp,i);
79072805
LW
7589 break;
7590 }
7591 } while (i != EOF);
7592 }
c07a80fd 7593
760ac839
LW
7594 /* See if we know enough about I/O mechanism to cheat it ! */
7595
7596 /* This used to be #ifdef test - it is made run-time test for ease
1c846c1f 7597 of abstracting out stdio interface. One call should be cheap
760ac839
LW
7598 enough here - and may even be a macro allowing compile
7599 time optimization.
7600 */
7601
7602 if (PerlIO_fast_gets(fp)) {
7603
7604 /*
7605 * We're going to steal some values from the stdio struct
7606 * and put EVERYTHING in the innermost loop into registers.
7607 */
7608 register STDCHAR *ptr;
7609 STRLEN bpx;
7610 I32 shortbuffered;
7611
16660edb 7612#if defined(VMS) && defined(PERLIO_IS_STDIO)
7613 /* An ungetc()d char is handled separately from the regular
7614 * buffer, so we getc() it back out and stuff it in the buffer.
7615 */
7616 i = PerlIO_getc(fp);
7617 if (i == EOF) return 0;
7618 *(--((*fp)->_ptr)) = (unsigned char) i;
7619 (*fp)->_cnt++;
7620#endif
c07a80fd 7621
c2960299 7622 /* Here is some breathtakingly efficient cheating */
c07a80fd 7623
a20bf0c3 7624 cnt = PerlIO_get_cnt(fp); /* get count into register */
e468d35b 7625 /* make sure we have the room */
7a5fa8a2 7626 if ((I32)(SvLEN(sv) - append) <= cnt + 1) {
e468d35b 7627 /* Not room for all of it
7a5fa8a2 7628 if we are looking for a separator and room for some
e468d35b
NIS
7629 */
7630 if (rslen && cnt > 80 && (I32)SvLEN(sv) > append) {
7a5fa8a2 7631 /* just process what we have room for */
79072805
LW
7632 shortbuffered = cnt - SvLEN(sv) + append + 1;
7633 cnt -= shortbuffered;
7634 }
7635 else {
7636 shortbuffered = 0;
bbce6d69 7637 /* remember that cnt can be negative */
eb160463 7638 SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
79072805
LW
7639 }
7640 }
7a5fa8a2 7641 else
79072805 7642 shortbuffered = 0;
3f7c398e 7643 bp = (STDCHAR*)SvPVX_const(sv) + append; /* move these two too to registers */
a20bf0c3 7644 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 7645 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7646 "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
16660edb 7647 DEBUG_P(PerlIO_printf(Perl_debug_log,
ba7abf9d 7648 "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 7649 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 7650 PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
7651 for (;;) {
7652 screamer:
93a17b20 7653 if (cnt > 0) {
c07a80fd 7654 if (rslen) {
760ac839
LW
7655 while (cnt > 0) { /* this | eat */
7656 cnt--;
c07a80fd 7657 if ((*bp++ = *ptr++) == rslast) /* really | dust */
7658 goto thats_all_folks; /* screams | sed :-) */
7659 }
7660 }
7661 else {
1c846c1f
NIS
7662 Copy(ptr, bp, cnt, char); /* this | eat */
7663 bp += cnt; /* screams | dust */
c07a80fd 7664 ptr += cnt; /* louder | sed :-) */
a5f75d66 7665 cnt = 0;
0f93bb20
NC
7666 assert (!shortbuffered);
7667 goto cannot_be_shortbuffered;
93a17b20 7668 }
79072805
LW
7669 }
7670
748a9306 7671 if (shortbuffered) { /* oh well, must extend */
79072805
LW
7672 cnt = shortbuffered;
7673 shortbuffered = 0;
3f7c398e 7674 bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
79072805
LW
7675 SvCUR_set(sv, bpx);
7676 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
3f7c398e 7677 bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
79072805
LW
7678 continue;
7679 }
7680
0f93bb20 7681 cannot_be_shortbuffered:
16660edb 7682 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841
GS
7683 "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
7684 PTR2UV(ptr),(long)cnt));
cc00df79 7685 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
ad9e76a8
NC
7686
7687 DEBUG_Pv(PerlIO_printf(Perl_debug_log,
1d7c1841 7688 "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 7689 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 7690 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ad9e76a8 7691
1c846c1f 7692 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b 7693 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
7694 another abstraction. */
760ac839 7695 i = PerlIO_getc(fp); /* get more characters */
ad9e76a8
NC
7696
7697 DEBUG_Pv(PerlIO_printf(Perl_debug_log,
1d7c1841 7698 "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 7699 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 7700 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ad9e76a8 7701
a20bf0c3
JH
7702 cnt = PerlIO_get_cnt(fp);
7703 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
16660edb 7704 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7705 "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
79072805 7706
748a9306
LW
7707 if (i == EOF) /* all done for ever? */
7708 goto thats_really_all_folks;
7709
3f7c398e 7710 bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
79072805
LW
7711 SvCUR_set(sv, bpx);
7712 SvGROW(sv, bpx + cnt + 2);
3f7c398e 7713 bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
c07a80fd 7714
eb160463 7715 *bp++ = (STDCHAR)i; /* store character from PerlIO_getc */
79072805 7716
c07a80fd 7717 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
79072805 7718 goto thats_all_folks;
79072805
LW
7719 }
7720
7721thats_all_folks:
3f7c398e 7722 if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX_const(sv)) < rslen) ||
36477c24 7723 memNE((char*)bp - rslen, rsptr, rslen))
760ac839 7724 goto screamer; /* go back to the fray */
79072805
LW
7725thats_really_all_folks:
7726 if (shortbuffered)
7727 cnt += shortbuffered;
16660edb 7728 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7729 "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
cc00df79 7730 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* put these back or we're in trouble */
16660edb 7731 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7732 "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 7733 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 7734 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
79072805 7735 *bp = '\0';
3f7c398e 7736 SvCUR_set(sv, bp - (STDCHAR*)SvPVX_const(sv)); /* set length */
16660edb 7737 DEBUG_P(PerlIO_printf(Perl_debug_log,
fb73857a 7738 "Screamer: done, len=%ld, string=|%.*s|\n",
3f7c398e 7739 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX_const(sv)));
760ac839
LW
7740 }
7741 else
79072805 7742 {
6edd2cd5 7743 /*The big, slow, and stupid way. */
27da23d5 7744#ifdef USE_HEAP_INSTEAD_OF_STACK /* Even slower way. */
cbbf8932 7745 STDCHAR *buf = NULL;
a02a5408 7746 Newx(buf, 8192, STDCHAR);
6edd2cd5 7747 assert(buf);
4d2c4e07 7748#else
6edd2cd5 7749 STDCHAR buf[8192];
4d2c4e07 7750#endif
79072805 7751
760ac839 7752screamer2:
c07a80fd 7753 if (rslen) {
00b6aa41 7754 register const STDCHAR * const bpe = buf + sizeof(buf);
760ac839 7755 bp = buf;
eb160463 7756 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
760ac839
LW
7757 ; /* keep reading */
7758 cnt = bp - buf;
c07a80fd 7759 }
7760 else {
760ac839 7761 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
486ec47a 7762 /* Accommodate broken VAXC compiler, which applies U8 cast to
16660edb 7763 * both args of ?: operator, causing EOF to change into 255
7764 */
37be0adf 7765 if (cnt > 0)
cbe9e203
JH
7766 i = (U8)buf[cnt - 1];
7767 else
37be0adf 7768 i = EOF;
c07a80fd 7769 }
79072805 7770
cbe9e203
JH
7771 if (cnt < 0)
7772 cnt = 0; /* we do need to re-set the sv even when cnt <= 0 */
7773 if (append)
7774 sv_catpvn(sv, (char *) buf, cnt);
7775 else
7776 sv_setpvn(sv, (char *) buf, cnt);
c07a80fd 7777
7778 if (i != EOF && /* joy */
7779 (!rslen ||
7780 SvCUR(sv) < rslen ||
3f7c398e 7781 memNE(SvPVX_const(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
79072805
LW
7782 {
7783 append = -1;
63e4d877
CS
7784 /*
7785 * If we're reading from a TTY and we get a short read,
7786 * indicating that the user hit his EOF character, we need
7787 * to notice it now, because if we try to read from the TTY
7788 * again, the EOF condition will disappear.
7789 *
7790 * The comparison of cnt to sizeof(buf) is an optimization
7791 * that prevents unnecessary calls to feof().
7792 *
7793 * - jik 9/25/96
7794 */
bb7a0f54 7795 if (!(cnt < (I32)sizeof(buf) && PerlIO_eof(fp)))
63e4d877 7796 goto screamer2;
79072805 7797 }
6edd2cd5 7798
27da23d5 7799#ifdef USE_HEAP_INSTEAD_OF_STACK
6edd2cd5
JH
7800 Safefree(buf);
7801#endif
79072805
LW
7802 }
7803
8bfdd7d9 7804 if (rspara) { /* have to do this both before and after */
c07a80fd 7805 while (i != EOF) { /* to make sure file boundaries work right */
760ac839 7806 i = PerlIO_getc(fp);
79072805 7807 if (i != '\n') {
760ac839 7808 PerlIO_ungetc(fp,i);
79072805
LW
7809 break;
7810 }
7811 }
7812 }
c07a80fd 7813
bd61b366 7814 return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
79072805
LW
7815}
7816
954c1994
GS
7817/*
7818=for apidoc sv_inc
7819
645c22ef 7820Auto-increment of the value in the SV, doing string to numeric conversion
6f1401dc 7821if necessary. Handles 'get' magic and operator overloading.
954c1994
GS
7822
7823=cut
7824*/
7825
79072805 7826void
ac1e9476 7827Perl_sv_inc(pTHX_ register SV *const sv)
79072805 7828{
6f1401dc
DM
7829 if (!sv)
7830 return;
7831 SvGETMAGIC(sv);
7832 sv_inc_nomg(sv);
7833}
7834
7835/*
7836=for apidoc sv_inc_nomg
7837
7838Auto-increment of the value in the SV, doing string to numeric conversion
7839if necessary. Handles operator overloading. Skips handling 'get' magic.
7840
7841=cut
7842*/
7843
7844void
7845Perl_sv_inc_nomg(pTHX_ register SV *const sv)
7846{
97aff369 7847 dVAR;
79072805 7848 register char *d;
463ee0b2 7849 int flags;
79072805
LW
7850
7851 if (!sv)
7852 return;
ed6116ce 7853 if (SvTHINKFIRST(sv)) {
765f542d
NC
7854 if (SvIsCOW(sv))
7855 sv_force_normal_flags(sv, 0);
0f15f207 7856 if (SvREADONLY(sv)) {
923e4eb5 7857 if (IN_PERL_RUNTIME)
6ad8f254 7858 Perl_croak_no_modify(aTHX);
0f15f207 7859 }
a0d0e21e 7860 if (SvROK(sv)) {
b5be31e9 7861 IV i;
31d632c3 7862 if (SvAMAGIC(sv) && AMG_CALLunary(sv, inc_amg))
9e7bc3e8 7863 return;
56431972 7864 i = PTR2IV(SvRV(sv));
b5be31e9
SM
7865 sv_unref(sv);
7866 sv_setiv(sv, i);
a0d0e21e 7867 }
ed6116ce 7868 }
8990e307 7869 flags = SvFLAGS(sv);
28e5dec8
JH
7870 if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
7871 /* It's (privately or publicly) a float, but not tested as an
7872 integer, so test it to see. */
d460ef45 7873 (void) SvIV(sv);
28e5dec8
JH
7874 flags = SvFLAGS(sv);
7875 }
7876 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
7877 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 7878#ifdef PERL_PRESERVE_IVUV
28e5dec8 7879 oops_its_int:
59d8ce62 7880#endif
25da4f38
IZ
7881 if (SvIsUV(sv)) {
7882 if (SvUVX(sv) == UV_MAX)
a1e868e7 7883 sv_setnv(sv, UV_MAX_P1);
25da4f38
IZ
7884 else
7885 (void)SvIOK_only_UV(sv);
607fa7f2 7886 SvUV_set(sv, SvUVX(sv) + 1);
25da4f38
IZ
7887 } else {
7888 if (SvIVX(sv) == IV_MAX)
28e5dec8 7889 sv_setuv(sv, (UV)IV_MAX + 1);
25da4f38
IZ
7890 else {
7891 (void)SvIOK_only(sv);
45977657 7892 SvIV_set(sv, SvIVX(sv) + 1);
1c846c1f 7893 }
55497cff 7894 }
79072805
LW
7895 return;
7896 }
28e5dec8 7897 if (flags & SVp_NOK) {
b88df990 7898 const NV was = SvNVX(sv);
b68c599a 7899 if (NV_OVERFLOWS_INTEGERS_AT &&
a2a5de95
NC
7900 was >= NV_OVERFLOWS_INTEGERS_AT) {
7901 Perl_ck_warner(aTHX_ packWARN(WARN_IMPRECISION),
7902 "Lost precision when incrementing %" NVff " by 1",
7903 was);
b88df990 7904 }
28e5dec8 7905 (void)SvNOK_only(sv);
b68c599a 7906 SvNV_set(sv, was + 1.0);
28e5dec8
JH
7907 return;
7908 }
7909
3f7c398e 7910 if (!(flags & SVp_POK) || !*SvPVX_const(sv)) {
28e5dec8 7911 if ((flags & SVTYPEMASK) < SVt_PVIV)
f5282e15 7912 sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV ? SVt_PVIV : SVt_IV));
28e5dec8 7913 (void)SvIOK_only(sv);
45977657 7914 SvIV_set(sv, 1);
79072805
LW
7915 return;
7916 }
463ee0b2 7917 d = SvPVX(sv);
79072805
LW
7918 while (isALPHA(*d)) d++;
7919 while (isDIGIT(*d)) d++;
6aff239d 7920 if (d < SvEND(sv)) {
28e5dec8 7921#ifdef PERL_PRESERVE_IVUV
d1be9408 7922 /* Got to punt this as an integer if needs be, but we don't issue
28e5dec8
JH
7923 warnings. Probably ought to make the sv_iv_please() that does
7924 the conversion if possible, and silently. */
504618e9 7925 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
28e5dec8
JH
7926 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
7927 /* Need to try really hard to see if it's an integer.
7928 9.22337203685478e+18 is an integer.
7929 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
7930 so $a="9.22337203685478e+18"; $a+0; $a++
7931 needs to be the same as $a="9.22337203685478e+18"; $a++
7932 or we go insane. */
d460ef45 7933
28e5dec8
JH
7934 (void) sv_2iv(sv);
7935 if (SvIOK(sv))
7936 goto oops_its_int;
7937
7938 /* sv_2iv *should* have made this an NV */
7939 if (flags & SVp_NOK) {
7940 (void)SvNOK_only(sv);
9d6ce603 7941 SvNV_set(sv, SvNVX(sv) + 1.0);
28e5dec8
JH
7942 return;
7943 }
7944 /* I don't think we can get here. Maybe I should assert this
7945 And if we do get here I suspect that sv_setnv will croak. NWC
7946 Fall through. */
7947#if defined(USE_LONG_DOUBLE)
7948 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",
3f7c398e 7949 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8 7950#else
1779d84d 7951 DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_inc punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"NVgf"\n",
3f7c398e 7952 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8
JH
7953#endif
7954 }
7955#endif /* PERL_PRESERVE_IVUV */
3f7c398e 7956 sv_setnv(sv,Atof(SvPVX_const(sv)) + 1.0);
79072805
LW
7957 return;
7958 }
7959 d--;
3f7c398e 7960 while (d >= SvPVX_const(sv)) {
79072805
LW
7961 if (isDIGIT(*d)) {
7962 if (++*d <= '9')
7963 return;
7964 *(d--) = '0';
7965 }
7966 else {
9d116dd7
JH
7967#ifdef EBCDIC
7968 /* MKS: The original code here died if letters weren't consecutive.
7969 * at least it didn't have to worry about non-C locales. The
7970 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
1c846c1f 7971 * arranged in order (although not consecutively) and that only
9d116dd7
JH
7972 * [A-Za-z] are accepted by isALPHA in the C locale.
7973 */
7974 if (*d != 'z' && *d != 'Z') {
7975 do { ++*d; } while (!isALPHA(*d));
7976 return;
7977 }
7978 *(d--) -= 'z' - 'a';
7979#else
79072805
LW
7980 ++*d;
7981 if (isALPHA(*d))
7982 return;
7983 *(d--) -= 'z' - 'a' + 1;
9d116dd7 7984#endif
79072805
LW
7985 }
7986 }
7987 /* oh,oh, the number grew */
7988 SvGROW(sv, SvCUR(sv) + 2);
b162af07 7989 SvCUR_set(sv, SvCUR(sv) + 1);
3f7c398e 7990 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX_const(sv); d--)
79072805
LW
7991 *d = d[-1];
7992 if (isDIGIT(d[1]))
7993 *d = '1';
7994 else
7995 *d = d[1];
7996}
7997
954c1994
GS
7998/*
7999=for apidoc sv_dec
8000
645c22ef 8001Auto-decrement of the value in the SV, doing string to numeric conversion
6f1401dc 8002if necessary. Handles 'get' magic and operator overloading.
954c1994
GS
8003
8004=cut
8005*/
8006
79072805 8007void
ac1e9476 8008Perl_sv_dec(pTHX_ register SV *const sv)
79072805 8009{
97aff369 8010 dVAR;
6f1401dc
DM
8011 if (!sv)
8012 return;
8013 SvGETMAGIC(sv);
8014 sv_dec_nomg(sv);
8015}
8016
8017/*
8018=for apidoc sv_dec_nomg
8019
8020Auto-decrement of the value in the SV, doing string to numeric conversion
8021if necessary. Handles operator overloading. Skips handling 'get' magic.
8022
8023=cut
8024*/
8025
8026void
8027Perl_sv_dec_nomg(pTHX_ register SV *const sv)
8028{
8029 dVAR;
463ee0b2
LW
8030 int flags;
8031
79072805
LW
8032 if (!sv)
8033 return;
ed6116ce 8034 if (SvTHINKFIRST(sv)) {
765f542d
NC
8035 if (SvIsCOW(sv))
8036 sv_force_normal_flags(sv, 0);
0f15f207 8037 if (SvREADONLY(sv)) {
923e4eb5 8038 if (IN_PERL_RUNTIME)
6ad8f254 8039 Perl_croak_no_modify(aTHX);
0f15f207 8040 }
a0d0e21e 8041 if (SvROK(sv)) {
b5be31e9 8042 IV i;
31d632c3 8043 if (SvAMAGIC(sv) && AMG_CALLunary(sv, dec_amg))
9e7bc3e8 8044 return;
56431972 8045 i = PTR2IV(SvRV(sv));
b5be31e9
SM
8046 sv_unref(sv);
8047 sv_setiv(sv, i);
a0d0e21e 8048 }
ed6116ce 8049 }
28e5dec8
JH
8050 /* Unlike sv_inc we don't have to worry about string-never-numbers
8051 and keeping them magic. But we mustn't warn on punting */
8990e307 8052 flags = SvFLAGS(sv);
28e5dec8
JH
8053 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
8054 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 8055#ifdef PERL_PRESERVE_IVUV
28e5dec8 8056 oops_its_int:
59d8ce62 8057#endif
25da4f38
IZ
8058 if (SvIsUV(sv)) {
8059 if (SvUVX(sv) == 0) {
8060 (void)SvIOK_only(sv);
45977657 8061 SvIV_set(sv, -1);
25da4f38
IZ
8062 }
8063 else {
8064 (void)SvIOK_only_UV(sv);
f4eee32f 8065 SvUV_set(sv, SvUVX(sv) - 1);
1c846c1f 8066 }
25da4f38 8067 } else {
b88df990
NC
8068 if (SvIVX(sv) == IV_MIN) {
8069 sv_setnv(sv, (NV)IV_MIN);
8070 goto oops_its_num;
8071 }
25da4f38
IZ
8072 else {
8073 (void)SvIOK_only(sv);
45977657 8074 SvIV_set(sv, SvIVX(sv) - 1);
1c846c1f 8075 }
55497cff 8076 }
8077 return;
8078 }
28e5dec8 8079 if (flags & SVp_NOK) {
b88df990
NC
8080 oops_its_num:
8081 {
8082 const NV was = SvNVX(sv);
b68c599a 8083 if (NV_OVERFLOWS_INTEGERS_AT &&
a2a5de95
NC
8084 was <= -NV_OVERFLOWS_INTEGERS_AT) {
8085 Perl_ck_warner(aTHX_ packWARN(WARN_IMPRECISION),
8086 "Lost precision when decrementing %" NVff " by 1",
8087 was);
b88df990
NC
8088 }
8089 (void)SvNOK_only(sv);
b68c599a 8090 SvNV_set(sv, was - 1.0);
b88df990
NC
8091 return;
8092 }
28e5dec8 8093 }
8990e307 8094 if (!(flags & SVp_POK)) {
ef088171
NC
8095 if ((flags & SVTYPEMASK) < SVt_PVIV)
8096 sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV) ? SVt_PVIV : SVt_IV);
8097 SvIV_set(sv, -1);
8098 (void)SvIOK_only(sv);
79072805
LW
8099 return;
8100 }
28e5dec8
JH
8101#ifdef PERL_PRESERVE_IVUV
8102 {
504618e9 8103 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
28e5dec8
JH
8104 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
8105 /* Need to try really hard to see if it's an integer.
8106 9.22337203685478e+18 is an integer.
8107 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
8108 so $a="9.22337203685478e+18"; $a+0; $a--
8109 needs to be the same as $a="9.22337203685478e+18"; $a--
8110 or we go insane. */
d460ef45 8111
28e5dec8
JH
8112 (void) sv_2iv(sv);
8113 if (SvIOK(sv))
8114 goto oops_its_int;
8115
8116 /* sv_2iv *should* have made this an NV */
8117 if (flags & SVp_NOK) {
8118 (void)SvNOK_only(sv);
9d6ce603 8119 SvNV_set(sv, SvNVX(sv) - 1.0);
28e5dec8
JH
8120 return;
8121 }
8122 /* I don't think we can get here. Maybe I should assert this
8123 And if we do get here I suspect that sv_setnv will croak. NWC
8124 Fall through. */
8125#if defined(USE_LONG_DOUBLE)
8126 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",
3f7c398e 8127 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8 8128#else
1779d84d 8129 DEBUG_c(PerlIO_printf(Perl_debug_log,"sv_dec punt failed to convert '%s' to IOK or NOKp, UV=0x%"UVxf" NV=%"NVgf"\n",
3f7c398e 8130 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8
JH
8131#endif
8132 }
8133 }
8134#endif /* PERL_PRESERVE_IVUV */
3f7c398e 8135 sv_setnv(sv,Atof(SvPVX_const(sv)) - 1.0); /* punt */
79072805
LW
8136}
8137
81041c50
YO
8138/* this define is used to eliminate a chunk of duplicated but shared logic
8139 * it has the suffix __SV_C to signal that it isnt API, and isnt meant to be
8140 * used anywhere but here - yves
8141 */
8142#define PUSH_EXTEND_MORTAL__SV_C(AnSv) \
8143 STMT_START { \
8144 EXTEND_MORTAL(1); \
8145 PL_tmps_stack[++PL_tmps_ix] = (AnSv); \
8146 } STMT_END
8147
954c1994
GS
8148/*
8149=for apidoc sv_mortalcopy
8150
645c22ef 8151Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
d4236ebc
DM
8152The new SV is marked as mortal. It will be destroyed "soon", either by an
8153explicit call to FREETMPS, or by an implicit call at places such as
8154statement boundaries. See also C<sv_newmortal> and C<sv_2mortal>.
954c1994
GS
8155
8156=cut
8157*/
8158
79072805
LW
8159/* Make a string that will exist for the duration of the expression
8160 * evaluation. Actually, it may have to last longer than that, but
8161 * hopefully we won't free it until it has been assigned to a
8162 * permanent location. */
8163
8164SV *
ac1e9476 8165Perl_sv_mortalcopy(pTHX_ SV *const oldstr)
79072805 8166{
97aff369 8167 dVAR;
463ee0b2 8168 register SV *sv;
b881518d 8169
4561caa4 8170 new_SV(sv);
79072805 8171 sv_setsv(sv,oldstr);
81041c50 8172 PUSH_EXTEND_MORTAL__SV_C(sv);
8990e307
LW
8173 SvTEMP_on(sv);
8174 return sv;
8175}
8176
954c1994
GS
8177/*
8178=for apidoc sv_newmortal
8179
645c22ef 8180Creates a new null SV which is mortal. The reference count of the SV is
d4236ebc
DM
8181set to 1. It will be destroyed "soon", either by an explicit call to
8182FREETMPS, or by an implicit call at places such as statement boundaries.
8183See also C<sv_mortalcopy> and C<sv_2mortal>.
954c1994
GS
8184
8185=cut
8186*/
8187
8990e307 8188SV *
864dbfa3 8189Perl_sv_newmortal(pTHX)
8990e307 8190{
97aff369 8191 dVAR;
8990e307
LW
8192 register SV *sv;
8193
4561caa4 8194 new_SV(sv);
8990e307 8195 SvFLAGS(sv) = SVs_TEMP;
81041c50 8196 PUSH_EXTEND_MORTAL__SV_C(sv);
79072805
LW
8197 return sv;
8198}
8199
59cd0e26
NC
8200
8201/*
8202=for apidoc newSVpvn_flags
8203
8204Creates a new SV and copies a string into it. The reference count for the
8205SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
8206string. You are responsible for ensuring that the source string is at least
8207C<len> bytes long. If the C<s> argument is NULL the new SV will be undefined.
8208Currently the only flag bits accepted are C<SVf_UTF8> and C<SVs_TEMP>.
d9f0b464 8209If C<SVs_TEMP> is set, then C<sv_2mortal()> is called on the result before
c790c9b6
KW
8210returning. If C<SVf_UTF8> is set, C<s> is considered to be in UTF-8 and the
8211C<SVf_UTF8> flag will be set on the new SV.
59cd0e26
NC
8212C<newSVpvn_utf8()> is a convenience wrapper for this function, defined as
8213
8214 #define newSVpvn_utf8(s, len, u) \
8215 newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0)
8216
8217=cut
8218*/
8219
8220SV *
23f13727 8221Perl_newSVpvn_flags(pTHX_ const char *const s, const STRLEN len, const U32 flags)
59cd0e26
NC
8222{
8223 dVAR;
8224 register SV *sv;
8225
8226 /* All the flags we don't support must be zero.
8227 And we're new code so I'm going to assert this from the start. */
8228 assert(!(flags & ~(SVf_UTF8|SVs_TEMP)));
8229 new_SV(sv);
8230 sv_setpvn(sv,s,len);
d21488d7
YO
8231
8232 /* This code used to a sv_2mortal(), however we now unroll the call to sv_2mortal()
486ec47a 8233 * and do what it does ourselves here.
d21488d7
YO
8234 * Since we have asserted that flags can only have the SVf_UTF8 and/or SVs_TEMP flags
8235 * set above we can use it to enable the sv flags directly (bypassing SvTEMP_on), which
8236 * in turn means we dont need to mask out the SVf_UTF8 flag below, which means that we
486ec47a 8237 * eliminate quite a few steps than it looks - Yves (explaining patch by gfx)
d21488d7
YO
8238 */
8239
6dfeccca
GF
8240 SvFLAGS(sv) |= flags;
8241
8242 if(flags & SVs_TEMP){
81041c50 8243 PUSH_EXTEND_MORTAL__SV_C(sv);
6dfeccca
GF
8244 }
8245
8246 return sv;
59cd0e26
NC
8247}
8248
954c1994
GS
8249/*
8250=for apidoc sv_2mortal
8251
d4236ebc
DM
8252Marks an existing SV as mortal. The SV will be destroyed "soon", either
8253by an explicit call to FREETMPS, or by an implicit call at places such as
37d2ac18
NC
8254statement boundaries. SvTEMP() is turned on which means that the SV's
8255string buffer can be "stolen" if this SV is copied. See also C<sv_newmortal>
8256and C<sv_mortalcopy>.
954c1994
GS
8257
8258=cut
8259*/
8260
79072805 8261SV *
23f13727 8262Perl_sv_2mortal(pTHX_ register SV *const sv)
79072805 8263{
27da23d5 8264 dVAR;
79072805 8265 if (!sv)
7a5b473e 8266 return NULL;
d689ffdd 8267 if (SvREADONLY(sv) && SvIMMORTAL(sv))
11162842 8268 return sv;
81041c50 8269 PUSH_EXTEND_MORTAL__SV_C(sv);
8990e307 8270 SvTEMP_on(sv);
79072805
LW
8271 return sv;
8272}
8273
954c1994
GS
8274/*
8275=for apidoc newSVpv
8276
8277Creates a new SV and copies a string into it. The reference count for the
8278SV is set to 1. If C<len> is zero, Perl will compute the length using
8279strlen(). For efficiency, consider using C<newSVpvn> instead.
8280
8281=cut
8282*/
8283
79072805 8284SV *
23f13727 8285Perl_newSVpv(pTHX_ const char *const s, const STRLEN len)
79072805 8286{
97aff369 8287 dVAR;
463ee0b2 8288 register SV *sv;
79072805 8289
4561caa4 8290 new_SV(sv);
ddfa59c7 8291 sv_setpvn(sv, s, len || s == NULL ? len : strlen(s));
79072805
LW
8292 return sv;
8293}
8294
954c1994
GS
8295/*
8296=for apidoc newSVpvn
8297
8298Creates a new SV and copies a string into it. The reference count for the
1c846c1f 8299SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
954c1994 8300string. You are responsible for ensuring that the source string is at least
9e09f5f2 8301C<len> bytes long. If the C<s> argument is NULL the new SV will be undefined.
954c1994
GS
8302
8303=cut
8304*/
8305
9da1e3b5 8306SV *
23f13727 8307Perl_newSVpvn(pTHX_ const char *const s, const STRLEN len)
9da1e3b5 8308{
97aff369 8309 dVAR;
9da1e3b5
MUN
8310 register SV *sv;
8311
8312 new_SV(sv);
9da1e3b5
MUN
8313 sv_setpvn(sv,s,len);
8314 return sv;
8315}
8316
740cce10 8317/*
926f8064 8318=for apidoc newSVhek
bd08039b
NC
8319
8320Creates a new SV from the hash key structure. It will generate scalars that
5aaec2b4
NC
8321point to the shared string table where possible. Returns a new (undefined)
8322SV if the hek is NULL.
bd08039b
NC
8323
8324=cut
8325*/
8326
8327SV *
23f13727 8328Perl_newSVhek(pTHX_ const HEK *const hek)
bd08039b 8329{
97aff369 8330 dVAR;
5aaec2b4
NC
8331 if (!hek) {
8332 SV *sv;
8333
8334 new_SV(sv);
8335 return sv;
8336 }
8337
bd08039b
NC
8338 if (HEK_LEN(hek) == HEf_SVKEY) {
8339 return newSVsv(*(SV**)HEK_KEY(hek));
8340 } else {
8341 const int flags = HEK_FLAGS(hek);
8342 if (flags & HVhek_WASUTF8) {
8343 /* Trouble :-)
8344 Andreas would like keys he put in as utf8 to come back as utf8
8345 */
8346 STRLEN utf8_len = HEK_LEN(hek);
678febd7
NC
8347 SV * const sv = newSV_type(SVt_PV);
8348 char *as_utf8 = (char *)bytes_to_utf8 ((U8*)HEK_KEY(hek), &utf8_len);
8349 /* bytes_to_utf8() allocates a new string, which we can repurpose: */
8350 sv_usepvn_flags(sv, as_utf8, utf8_len, SV_HAS_TRAILING_NUL);
bd08039b 8351 SvUTF8_on (sv);
bd08039b 8352 return sv;
45e34800 8353 } else if (flags & (HVhek_REHASH|HVhek_UNSHARED)) {
bd08039b
NC
8354 /* We don't have a pointer to the hv, so we have to replicate the
8355 flag into every HEK. This hv is using custom a hasing
8356 algorithm. Hence we can't return a shared string scalar, as
8357 that would contain the (wrong) hash value, and might get passed
45e34800
NC
8358 into an hv routine with a regular hash.
8359 Similarly, a hash that isn't using shared hash keys has to have
8360 the flag in every key so that we know not to try to call
8361 share_hek_kek on it. */
bd08039b 8362
b64e5050 8363 SV * const sv = newSVpvn (HEK_KEY(hek), HEK_LEN(hek));
bd08039b
NC
8364 if (HEK_UTF8(hek))
8365 SvUTF8_on (sv);
8366 return sv;
8367 }
8368 /* This will be overwhelminly the most common case. */
409dfe77
NC
8369 {
8370 /* Inline most of newSVpvn_share(), because share_hek_hek() is far
8371 more efficient than sharepvn(). */
8372 SV *sv;
8373
8374 new_SV(sv);
8375 sv_upgrade(sv, SVt_PV);
8376 SvPV_set(sv, (char *)HEK_KEY(share_hek_hek(hek)));
8377 SvCUR_set(sv, HEK_LEN(hek));
8378 SvLEN_set(sv, 0);
8379 SvREADONLY_on(sv);
8380 SvFAKE_on(sv);
8381 SvPOK_on(sv);
8382 if (HEK_UTF8(hek))
8383 SvUTF8_on(sv);
8384 return sv;
8385 }
bd08039b
NC
8386 }
8387}
8388
1c846c1f
NIS
8389/*
8390=for apidoc newSVpvn_share
8391
3f7c398e 8392Creates a new SV with its SvPVX_const pointing to a shared string in the string
645c22ef 8393table. If the string does not already exist in the table, it is created
758fcfc1
VP
8394first. Turns on READONLY and FAKE. If the C<hash> parameter is non-zero, that
8395value is used; otherwise the hash is computed. The string's hash can be later
8396be retrieved from the SV with the C<SvSHARED_HASH()> macro. The idea here is
8397that as the string table is used for shared hash keys these strings will have
8398SvPVX_const == HeKEY and hash lookup will avoid string compare.
1c846c1f
NIS
8399
8400=cut
8401*/
8402
8403SV *
c3654f1a 8404Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
1c846c1f 8405{
97aff369 8406 dVAR;
1c846c1f 8407 register SV *sv;
c3654f1a 8408 bool is_utf8 = FALSE;
a51caccf
NC
8409 const char *const orig_src = src;
8410
c3654f1a 8411 if (len < 0) {
77caf834 8412 STRLEN tmplen = -len;
c3654f1a 8413 is_utf8 = TRUE;
75a54232 8414 /* See the note in hv.c:hv_fetch() --jhi */
e1ec3a88 8415 src = (char*)bytes_from_utf8((const U8*)src, &tmplen, &is_utf8);
75a54232
JH
8416 len = tmplen;
8417 }
1c846c1f 8418 if (!hash)
5afd6d42 8419 PERL_HASH(hash, src, len);
1c846c1f 8420 new_SV(sv);
f46ee248
NC
8421 /* The logic for this is inlined in S_mro_get_linear_isa_dfs(), so if it
8422 changes here, update it there too. */
bdd68bc3 8423 sv_upgrade(sv, SVt_PV);
f880fe2f 8424 SvPV_set(sv, sharepvn(src, is_utf8?-len:len, hash));
b162af07 8425 SvCUR_set(sv, len);
b162af07 8426 SvLEN_set(sv, 0);
1c846c1f
NIS
8427 SvREADONLY_on(sv);
8428 SvFAKE_on(sv);
8429 SvPOK_on(sv);
c3654f1a
IH
8430 if (is_utf8)
8431 SvUTF8_on(sv);
a51caccf
NC
8432 if (src != orig_src)
8433 Safefree(src);
1c846c1f
NIS
8434 return sv;
8435}
8436
9dcc53ea
Z
8437/*
8438=for apidoc newSVpv_share
8439
8440Like C<newSVpvn_share>, but takes a nul-terminated string instead of a
8441string/length pair.
8442
8443=cut
8444*/
8445
8446SV *
8447Perl_newSVpv_share(pTHX_ const char *src, U32 hash)
8448{
8449 return newSVpvn_share(src, strlen(src), hash);
8450}
645c22ef 8451
cea2e8a9 8452#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8453
8454/* pTHX_ magic can't cope with varargs, so this is a no-context
8455 * version of the main function, (which may itself be aliased to us).
8456 * Don't access this version directly.
8457 */
8458
46fc3d4c 8459SV *
23f13727 8460Perl_newSVpvf_nocontext(const char *const pat, ...)
46fc3d4c 8461{
cea2e8a9 8462 dTHX;
46fc3d4c 8463 register SV *sv;
8464 va_list args;
7918f24d
NC
8465
8466 PERL_ARGS_ASSERT_NEWSVPVF_NOCONTEXT;
8467
46fc3d4c 8468 va_start(args, pat);
c5be433b 8469 sv = vnewSVpvf(pat, &args);
46fc3d4c 8470 va_end(args);
8471 return sv;
8472}
cea2e8a9 8473#endif
46fc3d4c 8474
954c1994
GS
8475/*
8476=for apidoc newSVpvf
8477
645c22ef 8478Creates a new SV and initializes it with the string formatted like
954c1994
GS
8479C<sprintf>.
8480
8481=cut
8482*/
8483
cea2e8a9 8484SV *
23f13727 8485Perl_newSVpvf(pTHX_ const char *const pat, ...)
cea2e8a9
GS
8486{
8487 register SV *sv;
8488 va_list args;
7918f24d
NC
8489
8490 PERL_ARGS_ASSERT_NEWSVPVF;
8491
cea2e8a9 8492 va_start(args, pat);
c5be433b 8493 sv = vnewSVpvf(pat, &args);
cea2e8a9
GS
8494 va_end(args);
8495 return sv;
8496}
46fc3d4c 8497
645c22ef
DM
8498/* backend for newSVpvf() and newSVpvf_nocontext() */
8499
79072805 8500SV *
23f13727 8501Perl_vnewSVpvf(pTHX_ const char *const pat, va_list *const args)
c5be433b 8502{
97aff369 8503 dVAR;
c5be433b 8504 register SV *sv;
7918f24d
NC
8505
8506 PERL_ARGS_ASSERT_VNEWSVPVF;
8507
c5be433b 8508 new_SV(sv);
4608196e 8509 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
c5be433b
GS
8510 return sv;
8511}
8512
954c1994
GS
8513/*
8514=for apidoc newSVnv
8515
8516Creates a new SV and copies a floating point value into it.
8517The reference count for the SV is set to 1.
8518
8519=cut
8520*/
8521
c5be433b 8522SV *
23f13727 8523Perl_newSVnv(pTHX_ const NV n)
79072805 8524{
97aff369 8525 dVAR;
463ee0b2 8526 register SV *sv;
79072805 8527
4561caa4 8528 new_SV(sv);
79072805
LW
8529 sv_setnv(sv,n);
8530 return sv;
8531}
8532
954c1994
GS
8533/*
8534=for apidoc newSViv
8535
8536Creates a new SV and copies an integer into it. The reference count for the
8537SV is set to 1.
8538
8539=cut
8540*/
8541
79072805 8542SV *
23f13727 8543Perl_newSViv(pTHX_ const IV i)
79072805 8544{
97aff369 8545 dVAR;
463ee0b2 8546 register SV *sv;
79072805 8547
4561caa4 8548 new_SV(sv);
79072805
LW
8549 sv_setiv(sv,i);
8550 return sv;
8551}
8552
954c1994 8553/*
1a3327fb
JH
8554=for apidoc newSVuv
8555
8556Creates a new SV and copies an unsigned integer into it.
8557The reference count for the SV is set to 1.
8558
8559=cut
8560*/
8561
8562SV *
23f13727 8563Perl_newSVuv(pTHX_ const UV u)
1a3327fb 8564{
97aff369 8565 dVAR;
1a3327fb
JH
8566 register SV *sv;
8567
8568 new_SV(sv);
8569 sv_setuv(sv,u);
8570 return sv;
8571}
8572
8573/*
b9f83d2f
NC
8574=for apidoc newSV_type
8575
c41f7ed2 8576Creates a new SV, of the type specified. The reference count for the new SV
b9f83d2f
NC
8577is set to 1.
8578
8579=cut
8580*/
8581
8582SV *
fe9845cc 8583Perl_newSV_type(pTHX_ const svtype type)
b9f83d2f
NC
8584{
8585 register SV *sv;
8586
8587 new_SV(sv);
8588 sv_upgrade(sv, type);
8589 return sv;
8590}
8591
8592/*
954c1994
GS
8593=for apidoc newRV_noinc
8594
8595Creates an RV wrapper for an SV. The reference count for the original
8596SV is B<not> incremented.
8597
8598=cut
8599*/
8600
2304df62 8601SV *
23f13727 8602Perl_newRV_noinc(pTHX_ SV *const tmpRef)
2304df62 8603{
97aff369 8604 dVAR;
4df7f6af 8605 register SV *sv = newSV_type(SVt_IV);
7918f24d
NC
8606
8607 PERL_ARGS_ASSERT_NEWRV_NOINC;
8608
76e3520e 8609 SvTEMP_off(tmpRef);
b162af07 8610 SvRV_set(sv, tmpRef);
2304df62 8611 SvROK_on(sv);
2304df62
AD
8612 return sv;
8613}
8614
ff276b08 8615/* newRV_inc is the official function name to use now.
645c22ef
DM
8616 * newRV_inc is in fact #defined to newRV in sv.h
8617 */
8618
5f05dabc 8619SV *
23f13727 8620Perl_newRV(pTHX_ SV *const sv)
5f05dabc 8621{
97aff369 8622 dVAR;
7918f24d
NC
8623
8624 PERL_ARGS_ASSERT_NEWRV;
8625
7f466ec7 8626 return newRV_noinc(SvREFCNT_inc_simple_NN(sv));
5f05dabc 8627}
5f05dabc 8628
954c1994
GS
8629/*
8630=for apidoc newSVsv
8631
8632Creates a new SV which is an exact duplicate of the original SV.
645c22ef 8633(Uses C<sv_setsv>).
954c1994
GS
8634
8635=cut
8636*/
8637
79072805 8638SV *
23f13727 8639Perl_newSVsv(pTHX_ register SV *const old)
79072805 8640{
97aff369 8641 dVAR;
463ee0b2 8642 register SV *sv;
79072805
LW
8643
8644 if (!old)
7a5b473e 8645 return NULL;
8990e307 8646 if (SvTYPE(old) == SVTYPEMASK) {
9b387841 8647 Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
a0714e2c 8648 return NULL;
79072805 8649 }
4561caa4 8650 new_SV(sv);
e90aabeb
NC
8651 /* SV_GMAGIC is the default for sv_setv()
8652 SV_NOSTEAL prevents TEMP buffers being, well, stolen, and saves games
8653 with SvTEMP_off and SvTEMP_on round a call to sv_setsv. */
8654 sv_setsv_flags(sv, old, SV_GMAGIC | SV_NOSTEAL);
463ee0b2 8655 return sv;
79072805
LW
8656}
8657
645c22ef
DM
8658/*
8659=for apidoc sv_reset
8660
8661Underlying implementation for the C<reset> Perl function.
8662Note that the perl-level function is vaguely deprecated.
8663
8664=cut
8665*/
8666
79072805 8667void
23f13727 8668Perl_sv_reset(pTHX_ register const char *s, HV *const stash)
79072805 8669{
27da23d5 8670 dVAR;
4802d5d7 8671 char todo[PERL_UCHAR_MAX+1];
79072805 8672
7918f24d
NC
8673 PERL_ARGS_ASSERT_SV_RESET;
8674
49d8d3a1
MB
8675 if (!stash)
8676 return;
8677
79072805 8678 if (!*s) { /* reset ?? searches */
daba3364 8679 MAGIC * const mg = mg_find((const SV *)stash, PERL_MAGIC_symtab);
8d2f4536 8680 if (mg) {
c2b1997a
NC
8681 const U32 count = mg->mg_len / sizeof(PMOP**);
8682 PMOP **pmp = (PMOP**) mg->mg_ptr;
8683 PMOP *const *const end = pmp + count;
8684
8685 while (pmp < end) {
c737faaf 8686#ifdef USE_ITHREADS
c2b1997a 8687 SvREADONLY_off(PL_regex_pad[(*pmp)->op_pmoffset]);
c737faaf 8688#else
c2b1997a 8689 (*pmp)->op_pmflags &= ~PMf_USED;
c737faaf 8690#endif
c2b1997a 8691 ++pmp;
8d2f4536 8692 }
79072805
LW
8693 }
8694 return;
8695 }
8696
8697 /* reset variables */
8698
8699 if (!HvARRAY(stash))
8700 return;
463ee0b2
LW
8701
8702 Zero(todo, 256, char);
79072805 8703 while (*s) {
b464bac0
AL
8704 I32 max;
8705 I32 i = (unsigned char)*s;
79072805
LW
8706 if (s[1] == '-') {
8707 s += 2;
8708 }
4802d5d7 8709 max = (unsigned char)*s++;
79072805 8710 for ( ; i <= max; i++) {
463ee0b2
LW
8711 todo[i] = 1;
8712 }
a0d0e21e 8713 for (i = 0; i <= (I32) HvMAX(stash); i++) {
b464bac0 8714 HE *entry;
79072805 8715 for (entry = HvARRAY(stash)[i];
9e35f4b3
GS
8716 entry;
8717 entry = HeNEXT(entry))
8718 {
b464bac0
AL
8719 register GV *gv;
8720 register SV *sv;
8721
1edc1566 8722 if (!todo[(U8)*HeKEY(entry)])
463ee0b2 8723 continue;
159b6efe 8724 gv = MUTABLE_GV(HeVAL(entry));
79072805 8725 sv = GvSV(gv);
e203899d
NC
8726 if (sv) {
8727 if (SvTHINKFIRST(sv)) {
8728 if (!SvREADONLY(sv) && SvROK(sv))
8729 sv_unref(sv);
8730 /* XXX Is this continue a bug? Why should THINKFIRST
8731 exempt us from resetting arrays and hashes? */
8732 continue;
8733 }
8734 SvOK_off(sv);
8735 if (SvTYPE(sv) >= SVt_PV) {
8736 SvCUR_set(sv, 0);
bd61b366 8737 if (SvPVX_const(sv) != NULL)
e203899d
NC
8738 *SvPVX(sv) = '\0';
8739 SvTAINT(sv);
8740 }
79072805
LW
8741 }
8742 if (GvAV(gv)) {
8743 av_clear(GvAV(gv));
8744 }
bfcb3514 8745 if (GvHV(gv) && !HvNAME_get(GvHV(gv))) {
b0269e46
AB
8746#if defined(VMS)
8747 Perl_die(aTHX_ "Can't reset %%ENV on this system");
8748#else /* ! VMS */
463ee0b2 8749 hv_clear(GvHV(gv));
b0269e46
AB
8750# if defined(USE_ENVIRON_ARRAY)
8751 if (gv == PL_envgv)
8752 my_clearenv();
8753# endif /* USE_ENVIRON_ARRAY */
8754#endif /* VMS */
79072805
LW
8755 }
8756 }
8757 }
8758 }
8759}
8760
645c22ef
DM
8761/*
8762=for apidoc sv_2io
8763
8764Using various gambits, try to get an IO from an SV: the IO slot if its a
8765GV; or the recursive result if we're an RV; or the IO slot of the symbol
8766named after the PV if we're a string.
8767
8768=cut
8769*/
8770
46fc3d4c 8771IO*
23f13727 8772Perl_sv_2io(pTHX_ SV *const sv)
46fc3d4c 8773{
8774 IO* io;
8775 GV* gv;
8776
7918f24d
NC
8777 PERL_ARGS_ASSERT_SV_2IO;
8778
46fc3d4c 8779 switch (SvTYPE(sv)) {
8780 case SVt_PVIO:
a45c7426 8781 io = MUTABLE_IO(sv);
46fc3d4c 8782 break;
8783 case SVt_PVGV:
13be902c 8784 case SVt_PVLV:
6e592b3a 8785 if (isGV_with_GP(sv)) {
159b6efe 8786 gv = MUTABLE_GV(sv);
6e592b3a
BM
8787 io = GvIO(gv);
8788 if (!io)
8789 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
8790 break;
8791 }
8792 /* FALL THROUGH */
46fc3d4c 8793 default:
8794 if (!SvOK(sv))
cea2e8a9 8795 Perl_croak(aTHX_ PL_no_usym, "filehandle");
46fc3d4c 8796 if (SvROK(sv))
8797 return sv_2io(SvRV(sv));
f776e3cd 8798 gv = gv_fetchsv(sv, 0, SVt_PVIO);
46fc3d4c 8799 if (gv)
8800 io = GvIO(gv);
8801 else
8802 io = 0;
8803 if (!io)
be2597df 8804 Perl_croak(aTHX_ "Bad filehandle: %"SVf, SVfARG(sv));
46fc3d4c 8805 break;
8806 }
8807 return io;
8808}
8809
645c22ef
DM
8810/*
8811=for apidoc sv_2cv
8812
8813Using various gambits, try to get a CV from an SV; in addition, try if
8814possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
8e324704 8815The flags in C<lref> are passed to gv_fetchsv.
645c22ef
DM
8816
8817=cut
8818*/
8819
79072805 8820CV *
23f13727 8821Perl_sv_2cv(pTHX_ SV *sv, HV **const st, GV **const gvp, const I32 lref)
79072805 8822{
27da23d5 8823 dVAR;
a0714e2c 8824 GV *gv = NULL;
601f1833 8825 CV *cv = NULL;
79072805 8826
7918f24d
NC
8827 PERL_ARGS_ASSERT_SV_2CV;
8828
85dec29a
NC
8829 if (!sv) {
8830 *st = NULL;
8831 *gvp = NULL;
8832 return NULL;
8833 }
79072805 8834 switch (SvTYPE(sv)) {
79072805
LW
8835 case SVt_PVCV:
8836 *st = CvSTASH(sv);
a0714e2c 8837 *gvp = NULL;
ea726b52 8838 return MUTABLE_CV(sv);
79072805
LW
8839 case SVt_PVHV:
8840 case SVt_PVAV:
ef58ba18 8841 *st = NULL;
a0714e2c 8842 *gvp = NULL;
601f1833 8843 return NULL;
8990e307 8844 case SVt_PVGV:
6e592b3a 8845 if (isGV_with_GP(sv)) {
159b6efe 8846 gv = MUTABLE_GV(sv);
6e592b3a
BM
8847 *gvp = gv;
8848 *st = GvESTASH(gv);
8849 goto fix_gv;
8850 }
8851 /* FALL THROUGH */
8990e307 8852
79072805 8853 default:
a0d0e21e 8854 if (SvROK(sv)) {
c4f3bd1e 8855 SvGETMAGIC(sv);
93d7320b
DM
8856 if (SvAMAGIC(sv))
8857 sv = amagic_deref_call(sv, to_cv_amg);
8897dcaa
NC
8858 /* At this point I'd like to do SPAGAIN, but really I need to
8859 force it upon my callers. Hmmm. This is a mess... */
f5284f61 8860
62f274bf
GS
8861 sv = SvRV(sv);
8862 if (SvTYPE(sv) == SVt_PVCV) {
ea726b52 8863 cv = MUTABLE_CV(sv);
a0714e2c 8864 *gvp = NULL;
62f274bf
GS
8865 *st = CvSTASH(cv);
8866 return cv;
8867 }
6e592b3a 8868 else if(isGV_with_GP(sv))
159b6efe 8869 gv = MUTABLE_GV(sv);
62f274bf 8870 else
cea2e8a9 8871 Perl_croak(aTHX_ "Not a subroutine reference");
a0d0e21e 8872 }
6e592b3a 8873 else if (isGV_with_GP(sv)) {
9d0f7ed7 8874 SvGETMAGIC(sv);
159b6efe 8875 gv = MUTABLE_GV(sv);
9d0f7ed7 8876 }
79072805 8877 else
9d0f7ed7 8878 gv = gv_fetchsv(sv, lref, SVt_PVCV); /* Calls get magic */
79072805 8879 *gvp = gv;
ef58ba18
NC
8880 if (!gv) {
8881 *st = NULL;
601f1833 8882 return NULL;
ef58ba18 8883 }
e26df76a 8884 /* Some flags to gv_fetchsv mean don't really create the GV */
6e592b3a 8885 if (!isGV_with_GP(gv)) {
e26df76a
NC
8886 *st = NULL;
8887 return NULL;
8888 }
79072805 8889 *st = GvESTASH(gv);
8990e307 8890 fix_gv:
8ebc5c01 8891 if (lref && !GvCVu(gv)) {
4633a7c4 8892 SV *tmpsv;
748a9306 8893 ENTER;
561b68a9 8894 tmpsv = newSV(0);
bd61b366 8895 gv_efullname3(tmpsv, gv, NULL);
f6ec51f7
GS
8896 /* XXX this is probably not what they think they're getting.
8897 * It has the same effect as "sub name;", i.e. just a forward
8898 * declaration! */
774d564b 8899 newSUB(start_subparse(FALSE, 0),
4633a7c4 8900 newSVOP(OP_CONST, 0, tmpsv),
5f66b61c 8901 NULL, NULL);
748a9306 8902 LEAVE;
8ebc5c01 8903 if (!GvCVu(gv))
35c1215d 8904 Perl_croak(aTHX_ "Unable to create sub named \"%"SVf"\"",
4052d21c 8905 SVfARG(SvOK(sv) ? sv : &PL_sv_no));
8990e307 8906 }
8ebc5c01 8907 return GvCVu(gv);
79072805
LW
8908 }
8909}
8910
c461cf8f
JH
8911/*
8912=for apidoc sv_true
8913
8914Returns true if the SV has a true value by Perl's rules.
645c22ef
DM
8915Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
8916instead use an in-line version.
c461cf8f
JH
8917
8918=cut
8919*/
8920
79072805 8921I32
23f13727 8922Perl_sv_true(pTHX_ register SV *const sv)
79072805 8923{
8990e307
LW
8924 if (!sv)
8925 return 0;
79072805 8926 if (SvPOK(sv)) {
823a54a3
AL
8927 register const XPV* const tXpv = (XPV*)SvANY(sv);
8928 if (tXpv &&
c2f1de04 8929 (tXpv->xpv_cur > 1 ||
339049b0 8930 (tXpv->xpv_cur && *sv->sv_u.svu_pv != '0')))
79072805
LW
8931 return 1;
8932 else
8933 return 0;
8934 }
8935 else {
8936 if (SvIOK(sv))
463ee0b2 8937 return SvIVX(sv) != 0;
79072805
LW
8938 else {
8939 if (SvNOK(sv))
463ee0b2 8940 return SvNVX(sv) != 0.0;
79072805 8941 else
463ee0b2 8942 return sv_2bool(sv);
79072805
LW
8943 }
8944 }
8945}
79072805 8946
645c22ef 8947/*
c461cf8f
JH
8948=for apidoc sv_pvn_force
8949
8950Get a sensible string out of the SV somehow.
645c22ef
DM
8951A private implementation of the C<SvPV_force> macro for compilers which
8952can't cope with complex macro expressions. Always use the macro instead.
c461cf8f 8953
8d6d96c1
HS
8954=for apidoc sv_pvn_force_flags
8955
8956Get a sensible string out of the SV somehow.
8957If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
8958appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
8959implemented in terms of this function.
645c22ef
DM
8960You normally want to use the various wrapper macros instead: see
8961C<SvPV_force> and C<SvPV_force_nomg>
8d6d96c1
HS
8962
8963=cut
8964*/
8965
8966char *
12964ddd 8967Perl_sv_pvn_force_flags(pTHX_ SV *const sv, STRLEN *const lp, const I32 flags)
8d6d96c1 8968{
97aff369 8969 dVAR;
7918f24d
NC
8970
8971 PERL_ARGS_ASSERT_SV_PVN_FORCE_FLAGS;
8972
6fc92669 8973 if (SvTHINKFIRST(sv) && !SvROK(sv))
765f542d 8974 sv_force_normal_flags(sv, 0);
1c846c1f 8975
a0d0e21e 8976 if (SvPOK(sv)) {
13c5b33c
NC
8977 if (lp)
8978 *lp = SvCUR(sv);
a0d0e21e
LW
8979 }
8980 else {
a3b680e6 8981 char *s;
13c5b33c
NC
8982 STRLEN len;
8983
4d84ee25 8984 if (SvREADONLY(sv) && !(flags & SV_MUTABLE_RETURN)) {
b64e5050 8985 const char * const ref = sv_reftype(sv,0);
4d84ee25
NC
8986 if (PL_op)
8987 Perl_croak(aTHX_ "Can't coerce readonly %s to string in %s",
94bbb3f4 8988 ref, OP_DESC(PL_op));
4d84ee25 8989 else
b64e5050 8990 Perl_croak(aTHX_ "Can't coerce readonly %s to string", ref);
4d84ee25 8991 }
1f257c95
NC
8992 if ((SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM)
8993 || isGV_with_GP(sv))
22e74366 8994 /* diag_listed_as: Can't coerce %s to %s in %s */
cea2e8a9 8995 Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
94bbb3f4 8996 OP_DESC(PL_op));
b64e5050 8997 s = sv_2pv_flags(sv, &len, flags);
13c5b33c
NC
8998 if (lp)
8999 *lp = len;
9000
3f7c398e 9001 if (s != SvPVX_const(sv)) { /* Almost, but not quite, sv_setpvn() */
a0d0e21e
LW
9002 if (SvROK(sv))
9003 sv_unref(sv);
862a34c6 9004 SvUPGRADE(sv, SVt_PV); /* Never FALSE */
a0d0e21e 9005 SvGROW(sv, len + 1);
706aa1c9 9006 Move(s,SvPVX(sv),len,char);
a0d0e21e 9007 SvCUR_set(sv, len);
97a130b8 9008 SvPVX(sv)[len] = '\0';
a0d0e21e
LW
9009 }
9010 if (!SvPOK(sv)) {
9011 SvPOK_on(sv); /* validate pointer */
9012 SvTAINT(sv);
1d7c1841 9013 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3f7c398e 9014 PTR2UV(sv),SvPVX_const(sv)));
a0d0e21e
LW
9015 }
9016 }
4d84ee25 9017 return SvPVX_mutable(sv);
a0d0e21e
LW
9018}
9019
645c22ef 9020/*
645c22ef
DM
9021=for apidoc sv_pvbyten_force
9022
0feed65a 9023The backend for the C<SvPVbytex_force> macro. Always use the macro instead.
645c22ef
DM
9024
9025=cut
9026*/
9027
7340a771 9028char *
12964ddd 9029Perl_sv_pvbyten_force(pTHX_ SV *const sv, STRLEN *const lp)
7340a771 9030{
7918f24d
NC
9031 PERL_ARGS_ASSERT_SV_PVBYTEN_FORCE;
9032
46ec2f14 9033 sv_pvn_force(sv,lp);
ffebcc3e 9034 sv_utf8_downgrade(sv,0);
46ec2f14
TS
9035 *lp = SvCUR(sv);
9036 return SvPVX(sv);
7340a771
GS
9037}
9038
645c22ef 9039/*
c461cf8f
JH
9040=for apidoc sv_pvutf8n_force
9041
0feed65a 9042The backend for the C<SvPVutf8x_force> macro. Always use the macro instead.
c461cf8f
JH
9043
9044=cut
9045*/
9046
7340a771 9047char *
12964ddd 9048Perl_sv_pvutf8n_force(pTHX_ SV *const sv, STRLEN *const lp)
7340a771 9049{
7918f24d
NC
9050 PERL_ARGS_ASSERT_SV_PVUTF8N_FORCE;
9051
46ec2f14 9052 sv_pvn_force(sv,lp);
560a288e 9053 sv_utf8_upgrade(sv);
46ec2f14
TS
9054 *lp = SvCUR(sv);
9055 return SvPVX(sv);
7340a771
GS
9056}
9057
c461cf8f 9058/*
cba0b539 9059=for apidoc sv_reftype
05c0d6bb 9060
cba0b539 9061Returns a string describing what the SV is a reference to.
c461cf8f
JH
9062
9063=cut
9064*/
9065
2b388283 9066const char *
cba0b539 9067Perl_sv_reftype(pTHX_ const SV *const sv, const int ob)
a0d0e21e 9068{
cba0b539 9069 PERL_ARGS_ASSERT_SV_REFTYPE;
7918f24d 9070
cba0b539 9071 /* The fact that I don't need to downcast to char * everywhere, only in ?:
07409e01 9072 inside return suggests a const propagation bug in g++. */
c86bf373 9073 if (ob && SvOBJECT(sv)) {
1b6737cc 9074 char * const name = HvNAME_get(SvSTASH(sv));
cba0b539 9075 return name ? name : (char *) "__ANON__";
c86bf373 9076 }
a0d0e21e
LW
9077 else {
9078 switch (SvTYPE(sv)) {
9079 case SVt_NULL:
9080 case SVt_IV:
9081 case SVt_NV:
a0d0e21e
LW
9082 case SVt_PV:
9083 case SVt_PVIV:
9084 case SVt_PVNV:
9085 case SVt_PVMG:
1cb0ed9b 9086 if (SvVOK(sv))
cba0b539 9087 return "VSTRING";
a0d0e21e 9088 if (SvROK(sv))
cba0b539 9089 return "REF";
a0d0e21e 9090 else
cba0b539
FR
9091 return "SCALAR";
9092
9093 case SVt_PVLV: return (char *) (SvROK(sv) ? "REF"
9094 /* tied lvalues should appear to be
486ec47a 9095 * scalars for backwards compatibility */
cba0b539
FR
9096 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
9097 ? "SCALAR" : "LVALUE");
9098 case SVt_PVAV: return "ARRAY";
9099 case SVt_PVHV: return "HASH";
9100 case SVt_PVCV: return "CODE";
9101 case SVt_PVGV: return (char *) (isGV_with_GP(sv)
9102 ? "GLOB" : "SCALAR");
9103 case SVt_PVFM: return "FORMAT";
9104 case SVt_PVIO: return "IO";
9105 case SVt_BIND: return "BIND";
9106 case SVt_REGEXP: return "REGEXP";
9107 default: return "UNKNOWN";
a0d0e21e
LW
9108 }
9109 }
9110}
9111
954c1994
GS
9112/*
9113=for apidoc sv_isobject
9114
9115Returns a boolean indicating whether the SV is an RV pointing to a blessed
9116object. If the SV is not an RV, or if the object is not blessed, then this
9117will return false.
9118
9119=cut
9120*/
9121
463ee0b2 9122int
864dbfa3 9123Perl_sv_isobject(pTHX_ SV *sv)
85e6fe83 9124{
68dc0745 9125 if (!sv)
9126 return 0;
5b295bef 9127 SvGETMAGIC(sv);
85e6fe83
LW
9128 if (!SvROK(sv))
9129 return 0;
daba3364 9130 sv = SvRV(sv);
85e6fe83
LW
9131 if (!SvOBJECT(sv))
9132 return 0;
9133 return 1;
9134}
9135
954c1994
GS
9136/*
9137=for apidoc sv_isa
9138
9139Returns a boolean indicating whether the SV is blessed into the specified
9140class. This does not check for subtypes; use C<sv_derived_from> to verify
9141an inheritance relationship.
9142
9143=cut
9144*/
9145
85e6fe83 9146int
12964ddd 9147Perl_sv_isa(pTHX_ SV *sv, const char *const name)
463ee0b2 9148{
bfcb3514 9149 const char *hvname;
7918f24d
NC
9150
9151 PERL_ARGS_ASSERT_SV_ISA;
9152
68dc0745 9153 if (!sv)
9154 return 0;
5b295bef 9155 SvGETMAGIC(sv);
ed6116ce 9156 if (!SvROK(sv))
463ee0b2 9157 return 0;
daba3364 9158 sv = SvRV(sv);
ed6116ce 9159 if (!SvOBJECT(sv))
463ee0b2 9160 return 0;
bfcb3514
NC
9161 hvname = HvNAME_get(SvSTASH(sv));
9162 if (!hvname)
e27ad1f2 9163 return 0;
463ee0b2 9164
bfcb3514 9165 return strEQ(hvname, name);
463ee0b2
LW
9166}
9167
954c1994
GS
9168/*
9169=for apidoc newSVrv
9170
9171Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
9172it will be upgraded to one. If C<classname> is non-null then the new SV will
9173be blessed in the specified package. The new SV is returned and its
9174reference count is 1.
9175
9176=cut
9177*/
9178
463ee0b2 9179SV*
12964ddd 9180Perl_newSVrv(pTHX_ SV *const rv, const char *const classname)
463ee0b2 9181{
97aff369 9182 dVAR;
463ee0b2
LW
9183 SV *sv;
9184
7918f24d
NC
9185 PERL_ARGS_ASSERT_NEWSVRV;
9186
4561caa4 9187 new_SV(sv);
51cf62d8 9188
765f542d 9189 SV_CHECK_THINKFIRST_COW_DROP(rv);
52944de8 9190 (void)SvAMAGIC_off(rv);
51cf62d8 9191
0199fce9 9192 if (SvTYPE(rv) >= SVt_PVMG) {
a3b680e6 9193 const U32 refcnt = SvREFCNT(rv);
0199fce9
JD
9194 SvREFCNT(rv) = 0;
9195 sv_clear(rv);
9196 SvFLAGS(rv) = 0;
9197 SvREFCNT(rv) = refcnt;
0199fce9 9198
4df7f6af 9199 sv_upgrade(rv, SVt_IV);
dc5494d2
NC
9200 } else if (SvROK(rv)) {
9201 SvREFCNT_dec(SvRV(rv));
43230e26
NC
9202 } else {
9203 prepare_SV_for_RV(rv);
0199fce9 9204 }
51cf62d8 9205
0c34ef67 9206 SvOK_off(rv);
b162af07 9207 SvRV_set(rv, sv);
ed6116ce 9208 SvROK_on(rv);
463ee0b2 9209
a0d0e21e 9210 if (classname) {
da51bb9b 9211 HV* const stash = gv_stashpv(classname, GV_ADD);
a0d0e21e
LW
9212 (void)sv_bless(rv, stash);
9213 }
9214 return sv;
9215}
9216
954c1994
GS
9217/*
9218=for apidoc sv_setref_pv
9219
9220Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
9221argument will be upgraded to an RV. That RV will be modified to point to
9222the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
9223into the SV. The C<classname> argument indicates the package for the
bd61b366 9224blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 9225will have a reference count of 1, and the RV will be returned.
954c1994
GS
9226
9227Do not use with other Perl types such as HV, AV, SV, CV, because those
9228objects will become corrupted by the pointer copy process.
9229
9230Note that C<sv_setref_pvn> copies the string while this copies the pointer.
9231
9232=cut
9233*/
9234
a0d0e21e 9235SV*
12964ddd 9236Perl_sv_setref_pv(pTHX_ SV *const rv, const char *const classname, void *const pv)
a0d0e21e 9237{
97aff369 9238 dVAR;
7918f24d
NC
9239
9240 PERL_ARGS_ASSERT_SV_SETREF_PV;
9241
189b2af5 9242 if (!pv) {
3280af22 9243 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
9244 SvSETMAGIC(rv);
9245 }
a0d0e21e 9246 else
56431972 9247 sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
a0d0e21e
LW
9248 return rv;
9249}
9250
954c1994
GS
9251/*
9252=for apidoc sv_setref_iv
9253
9254Copies an integer into a new SV, optionally blessing the SV. The C<rv>
9255argument will be upgraded to an RV. That RV will be modified to point to
9256the new SV. The C<classname> argument indicates the package for the
bd61b366 9257blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 9258will have a reference count of 1, and the RV will be returned.
954c1994
GS
9259
9260=cut
9261*/
9262
a0d0e21e 9263SV*
12964ddd 9264Perl_sv_setref_iv(pTHX_ SV *const rv, const char *const classname, const IV iv)
a0d0e21e 9265{
7918f24d
NC
9266 PERL_ARGS_ASSERT_SV_SETREF_IV;
9267
a0d0e21e
LW
9268 sv_setiv(newSVrv(rv,classname), iv);
9269 return rv;
9270}
9271
954c1994 9272/*
e1c57cef
JH
9273=for apidoc sv_setref_uv
9274
9275Copies an unsigned integer into a new SV, optionally blessing the SV. The C<rv>
9276argument will be upgraded to an RV. That RV will be modified to point to
9277the new SV. The C<classname> argument indicates the package for the
bd61b366 9278blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 9279will have a reference count of 1, and the RV will be returned.
e1c57cef
JH
9280
9281=cut
9282*/
9283
9284SV*
12964ddd 9285Perl_sv_setref_uv(pTHX_ SV *const rv, const char *const classname, const UV uv)
e1c57cef 9286{
7918f24d
NC
9287 PERL_ARGS_ASSERT_SV_SETREF_UV;
9288
e1c57cef
JH
9289 sv_setuv(newSVrv(rv,classname), uv);
9290 return rv;
9291}
9292
9293/*
954c1994
GS
9294=for apidoc sv_setref_nv
9295
9296Copies a double into a new SV, optionally blessing the SV. The C<rv>
9297argument will be upgraded to an RV. That RV will be modified to point to
9298the new SV. The C<classname> argument indicates the package for the
bd61b366 9299blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 9300will have a reference count of 1, and the RV will be returned.
954c1994
GS
9301
9302=cut
9303*/
9304
a0d0e21e 9305SV*
12964ddd 9306Perl_sv_setref_nv(pTHX_ SV *const rv, const char *const classname, const NV nv)
a0d0e21e 9307{
7918f24d
NC
9308 PERL_ARGS_ASSERT_SV_SETREF_NV;
9309
a0d0e21e
LW
9310 sv_setnv(newSVrv(rv,classname), nv);
9311 return rv;
9312}
463ee0b2 9313
954c1994
GS
9314/*
9315=for apidoc sv_setref_pvn
9316
9317Copies a string into a new SV, optionally blessing the SV. The length of the
9318string must be specified with C<n>. The C<rv> argument will be upgraded to
9319an RV. That RV will be modified to point to the new SV. The C<classname>
9320argument indicates the package for the blessing. Set C<classname> to
bd61b366 9321C<NULL> to avoid the blessing. The new SV will have a reference count
d34c2299 9322of 1, and the RV will be returned.
954c1994
GS
9323
9324Note that C<sv_setref_pv> copies the pointer while this copies the string.
9325
9326=cut
9327*/
9328
a0d0e21e 9329SV*
12964ddd
SS
9330Perl_sv_setref_pvn(pTHX_ SV *const rv, const char *const classname,
9331 const char *const pv, const STRLEN n)
a0d0e21e 9332{
7918f24d
NC
9333 PERL_ARGS_ASSERT_SV_SETREF_PVN;
9334
a0d0e21e 9335 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
9336 return rv;
9337}
9338
954c1994
GS
9339/*
9340=for apidoc sv_bless
9341
9342Blesses an SV into a specified package. The SV must be an RV. The package
9343must be designated by its stash (see C<gv_stashpv()>). The reference count
9344of the SV is unaffected.
9345
9346=cut
9347*/
9348
a0d0e21e 9349SV*
12964ddd 9350Perl_sv_bless(pTHX_ SV *const sv, HV *const stash)
a0d0e21e 9351{
97aff369 9352 dVAR;
76e3520e 9353 SV *tmpRef;
7918f24d
NC
9354
9355 PERL_ARGS_ASSERT_SV_BLESS;
9356
a0d0e21e 9357 if (!SvROK(sv))
cea2e8a9 9358 Perl_croak(aTHX_ "Can't bless non-reference value");
76e3520e
GS
9359 tmpRef = SvRV(sv);
9360 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
e0744413
NC
9361 if (SvIsCOW(tmpRef))
9362 sv_force_normal_flags(tmpRef, 0);
76e3520e 9363 if (SvREADONLY(tmpRef))
6ad8f254 9364 Perl_croak_no_modify(aTHX);
76e3520e
GS
9365 if (SvOBJECT(tmpRef)) {
9366 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 9367 --PL_sv_objcount;
76e3520e 9368 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 9369 }
a0d0e21e 9370 }
76e3520e
GS
9371 SvOBJECT_on(tmpRef);
9372 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 9373 ++PL_sv_objcount;
862a34c6 9374 SvUPGRADE(tmpRef, SVt_PVMG);
85fbaab2 9375 SvSTASH_set(tmpRef, MUTABLE_HV(SvREFCNT_inc_simple(stash)));
a0d0e21e 9376
2e3febc6
CS
9377 if (Gv_AMG(stash))
9378 SvAMAGIC_on(sv);
9379 else
52944de8 9380 (void)SvAMAGIC_off(sv);
a0d0e21e 9381
1edbfb88
AB
9382 if(SvSMAGICAL(tmpRef))
9383 if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
9384 mg_set(tmpRef);
9385
9386
ecdeb87c 9387
a0d0e21e
LW
9388 return sv;
9389}
9390
13be902c
FC
9391/* Downgrades a PVGV to a PVMG. If it’s actually a PVLV, we leave the type
9392 * as it is after unglobbing it.
645c22ef
DM
9393 */
9394
76e3520e 9395STATIC void
89e38212 9396S_sv_unglob(pTHX_ SV *const sv)
a0d0e21e 9397{
97aff369 9398 dVAR;
850fabdf 9399 void *xpvmg;
dd69841b 9400 HV *stash;
b37c2d43 9401 SV * const temp = sv_newmortal();
850fabdf 9402
7918f24d
NC
9403 PERL_ARGS_ASSERT_SV_UNGLOB;
9404
13be902c 9405 assert(SvTYPE(sv) == SVt_PVGV || SvTYPE(sv) == SVt_PVLV);
a0d0e21e 9406 SvFAKE_off(sv);
159b6efe 9407 gv_efullname3(temp, MUTABLE_GV(sv), "*");
180488f8 9408
f7877b28 9409 if (GvGP(sv)) {
159b6efe
NC
9410 if(GvCVu((const GV *)sv) && (stash = GvSTASH(MUTABLE_GV(sv)))
9411 && HvNAME_get(stash))
dd69841b 9412 mro_method_changed_in(stash);
159b6efe 9413 gp_free(MUTABLE_GV(sv));
f7877b28 9414 }
e826b3c7 9415 if (GvSTASH(sv)) {
daba3364 9416 sv_del_backref(MUTABLE_SV(GvSTASH(sv)), sv);
5c284bb0 9417 GvSTASH(sv) = NULL;
e826b3c7 9418 }
a5f75d66 9419 GvMULTI_off(sv);
acda4c6a
NC
9420 if (GvNAME_HEK(sv)) {
9421 unshare_hek(GvNAME_HEK(sv));
9422 }
2e5b91de 9423 isGV_with_GP_off(sv);
850fabdf 9424
13be902c
FC
9425 if(SvTYPE(sv) == SVt_PVGV) {
9426 /* need to keep SvANY(sv) in the right arena */
9427 xpvmg = new_XPVMG();
9428 StructCopy(SvANY(sv), xpvmg, XPVMG);
9429 del_XPVGV(SvANY(sv));
9430 SvANY(sv) = xpvmg;
850fabdf 9431
13be902c
FC
9432 SvFLAGS(sv) &= ~SVTYPEMASK;
9433 SvFLAGS(sv) |= SVt_PVMG;
9434 }
180488f8
NC
9435
9436 /* Intentionally not calling any local SET magic, as this isn't so much a
9437 set operation as merely an internal storage change. */
9438 sv_setsv_flags(sv, temp, 0);
a0d0e21e
LW
9439}
9440
954c1994 9441/*
840a7b70 9442=for apidoc sv_unref_flags
954c1994
GS
9443
9444Unsets the RV status of the SV, and decrements the reference count of
9445whatever was being referenced by the RV. This can almost be thought of
840a7b70
IZ
9446as a reversal of C<newSVrv>. The C<cflags> argument can contain
9447C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
9448(otherwise the decrementing is conditional on the reference count being
9449different from one or the reference being a readonly SV).
7889fe52 9450See C<SvROK_off>.
954c1994
GS
9451
9452=cut
9453*/
9454
ed6116ce 9455void
89e38212 9456Perl_sv_unref_flags(pTHX_ SV *const ref, const U32 flags)
ed6116ce 9457{
b64e5050 9458 SV* const target = SvRV(ref);
810b8aa5 9459
7918f24d
NC
9460 PERL_ARGS_ASSERT_SV_UNREF_FLAGS;
9461
e15faf7d
NC
9462 if (SvWEAKREF(ref)) {
9463 sv_del_backref(target, ref);
9464 SvWEAKREF_off(ref);
9465 SvRV_set(ref, NULL);
810b8aa5
GS
9466 return;
9467 }
e15faf7d
NC
9468 SvRV_set(ref, NULL);
9469 SvROK_off(ref);
9470 /* You can't have a || SvREADONLY(target) here, as $a = $$a, where $a was
04ca4930 9471 assigned to as BEGIN {$a = \"Foo"} will fail. */
e15faf7d
NC
9472 if (SvREFCNT(target) != 1 || (flags & SV_IMMEDIATE_UNREF))
9473 SvREFCNT_dec(target);
840a7b70 9474 else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
e15faf7d 9475 sv_2mortal(target); /* Schedule for freeing later */
ed6116ce 9476}
8990e307 9477
840a7b70 9478/*
645c22ef
DM
9479=for apidoc sv_untaint
9480
9481Untaint an SV. Use C<SvTAINTED_off> instead.
9482=cut
9483*/
9484
bbce6d69 9485void
89e38212 9486Perl_sv_untaint(pTHX_ SV *const sv)
bbce6d69 9487{
7918f24d
NC
9488 PERL_ARGS_ASSERT_SV_UNTAINT;
9489
13f57bf8 9490 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
b64e5050 9491 MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
36477c24 9492 if (mg)
565764a8 9493 mg->mg_len &= ~1;
36477c24 9494 }
bbce6d69 9495}
9496
645c22ef
DM
9497/*
9498=for apidoc sv_tainted
9499
9500Test an SV for taintedness. Use C<SvTAINTED> instead.
9501=cut
9502*/
9503
bbce6d69 9504bool
89e38212 9505Perl_sv_tainted(pTHX_ SV *const sv)
bbce6d69 9506{
7918f24d
NC
9507 PERL_ARGS_ASSERT_SV_TAINTED;
9508
13f57bf8 9509 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
823a54a3 9510 const MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
2ddb8a4f 9511 if (mg && (mg->mg_len & 1) )
36477c24 9512 return TRUE;
9513 }
9514 return FALSE;
bbce6d69 9515}
9516
09540bc3
JH
9517/*
9518=for apidoc sv_setpviv
9519
9520Copies an integer into the given SV, also updating its string value.
9521Does not handle 'set' magic. See C<sv_setpviv_mg>.
9522
9523=cut
9524*/
9525
9526void
89e38212 9527Perl_sv_setpviv(pTHX_ SV *const sv, const IV iv)
09540bc3
JH
9528{
9529 char buf[TYPE_CHARS(UV)];
9530 char *ebuf;
b64e5050 9531 char * const ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
09540bc3 9532
7918f24d
NC
9533 PERL_ARGS_ASSERT_SV_SETPVIV;
9534
09540bc3
JH
9535 sv_setpvn(sv, ptr, ebuf - ptr);
9536}
9537
9538/*
9539=for apidoc sv_setpviv_mg
9540
9541Like C<sv_setpviv>, but also handles 'set' magic.
9542
9543=cut
9544*/
9545
9546void
89e38212 9547Perl_sv_setpviv_mg(pTHX_ SV *const sv, const IV iv)
09540bc3 9548{
7918f24d
NC
9549 PERL_ARGS_ASSERT_SV_SETPVIV_MG;
9550
df7eb254 9551 sv_setpviv(sv, iv);
09540bc3
JH
9552 SvSETMAGIC(sv);
9553}
9554
cea2e8a9 9555#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
9556
9557/* pTHX_ magic can't cope with varargs, so this is a no-context
9558 * version of the main function, (which may itself be aliased to us).
9559 * Don't access this version directly.
9560 */
9561
cea2e8a9 9562void
89e38212 9563Perl_sv_setpvf_nocontext(SV *const sv, const char *const pat, ...)
cea2e8a9
GS
9564{
9565 dTHX;
9566 va_list args;
7918f24d
NC
9567
9568 PERL_ARGS_ASSERT_SV_SETPVF_NOCONTEXT;
9569
cea2e8a9 9570 va_start(args, pat);
c5be433b 9571 sv_vsetpvf(sv, pat, &args);
cea2e8a9
GS
9572 va_end(args);
9573}
9574
645c22ef
DM
9575/* pTHX_ magic can't cope with varargs, so this is a no-context
9576 * version of the main function, (which may itself be aliased to us).
9577 * Don't access this version directly.
9578 */
cea2e8a9
GS
9579
9580void
89e38212 9581Perl_sv_setpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
cea2e8a9
GS
9582{
9583 dTHX;
9584 va_list args;
7918f24d
NC
9585
9586 PERL_ARGS_ASSERT_SV_SETPVF_MG_NOCONTEXT;
9587
cea2e8a9 9588 va_start(args, pat);
c5be433b 9589 sv_vsetpvf_mg(sv, pat, &args);
cea2e8a9 9590 va_end(args);
cea2e8a9
GS
9591}
9592#endif
9593
954c1994
GS
9594/*
9595=for apidoc sv_setpvf
9596
bffc3d17
SH
9597Works like C<sv_catpvf> but copies the text into the SV instead of
9598appending it. Does not handle 'set' magic. See C<sv_setpvf_mg>.
954c1994
GS
9599
9600=cut
9601*/
9602
46fc3d4c 9603void
89e38212 9604Perl_sv_setpvf(pTHX_ SV *const sv, const char *const pat, ...)
46fc3d4c 9605{
9606 va_list args;
7918f24d
NC
9607
9608 PERL_ARGS_ASSERT_SV_SETPVF;
9609
46fc3d4c 9610 va_start(args, pat);
c5be433b 9611 sv_vsetpvf(sv, pat, &args);
46fc3d4c 9612 va_end(args);
9613}
9614
bffc3d17
SH
9615/*
9616=for apidoc sv_vsetpvf
9617
9618Works like C<sv_vcatpvf> but copies the text into the SV instead of
9619appending it. Does not handle 'set' magic. See C<sv_vsetpvf_mg>.
9620
9621Usually used via its frontend C<sv_setpvf>.
9622
9623=cut
9624*/
645c22ef 9625
c5be433b 9626void
89e38212 9627Perl_sv_vsetpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args)
c5be433b 9628{
7918f24d
NC
9629 PERL_ARGS_ASSERT_SV_VSETPVF;
9630
4608196e 9631 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
c5be433b 9632}
ef50df4b 9633
954c1994
GS
9634/*
9635=for apidoc sv_setpvf_mg
9636
9637Like C<sv_setpvf>, but also handles 'set' magic.
9638
9639=cut
9640*/
9641
ef50df4b 9642void
89e38212 9643Perl_sv_setpvf_mg(pTHX_ SV *const sv, const char *const pat, ...)
ef50df4b
GS
9644{
9645 va_list args;
7918f24d
NC
9646
9647 PERL_ARGS_ASSERT_SV_SETPVF_MG;
9648
ef50df4b 9649 va_start(args, pat);
c5be433b 9650 sv_vsetpvf_mg(sv, pat, &args);
ef50df4b 9651 va_end(args);
c5be433b
GS
9652}
9653
bffc3d17
SH
9654/*
9655=for apidoc sv_vsetpvf_mg
9656
9657Like C<sv_vsetpvf>, but also handles 'set' magic.
9658
9659Usually used via its frontend C<sv_setpvf_mg>.
9660
9661=cut
9662*/
645c22ef 9663
c5be433b 9664void
89e38212 9665Perl_sv_vsetpvf_mg(pTHX_ SV *const sv, const char *const pat, va_list *const args)
c5be433b 9666{
7918f24d
NC
9667 PERL_ARGS_ASSERT_SV_VSETPVF_MG;
9668
4608196e 9669 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
ef50df4b
GS
9670 SvSETMAGIC(sv);
9671}
9672
cea2e8a9 9673#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
9674
9675/* pTHX_ magic can't cope with varargs, so this is a no-context
9676 * version of the main function, (which may itself be aliased to us).
9677 * Don't access this version directly.
9678 */
9679
cea2e8a9 9680void
89e38212 9681Perl_sv_catpvf_nocontext(SV *const sv, const char *const pat, ...)
cea2e8a9
GS
9682{
9683 dTHX;
9684 va_list args;
7918f24d
NC
9685
9686 PERL_ARGS_ASSERT_SV_CATPVF_NOCONTEXT;
9687
cea2e8a9 9688 va_start(args, pat);
c5be433b 9689 sv_vcatpvf(sv, pat, &args);
cea2e8a9
GS
9690 va_end(args);
9691}
9692
645c22ef
DM
9693/* pTHX_ magic can't cope with varargs, so this is a no-context
9694 * version of the main function, (which may itself be aliased to us).
9695 * Don't access this version directly.
9696 */
9697
cea2e8a9 9698void
89e38212 9699Perl_sv_catpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
cea2e8a9
GS
9700{
9701 dTHX;
9702 va_list args;
7918f24d
NC
9703
9704 PERL_ARGS_ASSERT_SV_CATPVF_MG_NOCONTEXT;
9705
cea2e8a9 9706 va_start(args, pat);
c5be433b 9707 sv_vcatpvf_mg(sv, pat, &args);
cea2e8a9 9708 va_end(args);
cea2e8a9
GS
9709}
9710#endif
9711
954c1994
GS
9712/*
9713=for apidoc sv_catpvf
9714
d5ce4a7c
GA
9715Processes its arguments like C<sprintf> and appends the formatted
9716output to an SV. If the appended data contains "wide" characters
9717(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
9718and characters >255 formatted with %c), the original SV might get
bffc3d17 9719upgraded to UTF-8. Handles 'get' magic, but not 'set' magic. See
cdd94ca7
NC
9720C<sv_catpvf_mg>. If the original SV was UTF-8, the pattern should be
9721valid UTF-8; if the original SV was bytes, the pattern should be too.
954c1994 9722
d5ce4a7c 9723=cut */
954c1994 9724
46fc3d4c 9725void
66ceb532 9726Perl_sv_catpvf(pTHX_ SV *const sv, const char *const pat, ...)
46fc3d4c 9727{
9728 va_list args;
7918f24d
NC
9729
9730 PERL_ARGS_ASSERT_SV_CATPVF;
9731
46fc3d4c 9732 va_start(args, pat);
c5be433b 9733 sv_vcatpvf(sv, pat, &args);
46fc3d4c 9734 va_end(args);
9735}
9736
bffc3d17
SH
9737/*
9738=for apidoc sv_vcatpvf
9739
9740Processes its arguments like C<vsprintf> and appends the formatted output
9741to an SV. Does not handle 'set' magic. See C<sv_vcatpvf_mg>.
9742
9743Usually used via its frontend C<sv_catpvf>.
9744
9745=cut
9746*/
645c22ef 9747
ef50df4b 9748void
66ceb532 9749Perl_sv_vcatpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args)
c5be433b 9750{
7918f24d
NC
9751 PERL_ARGS_ASSERT_SV_VCATPVF;
9752
4608196e 9753 sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
c5be433b
GS
9754}
9755
954c1994
GS
9756/*
9757=for apidoc sv_catpvf_mg
9758
9759Like C<sv_catpvf>, but also handles 'set' magic.
9760
9761=cut
9762*/
9763
c5be433b 9764void
66ceb532 9765Perl_sv_catpvf_mg(pTHX_ SV *const sv, const char *const pat, ...)
ef50df4b
GS
9766{
9767 va_list args;
7918f24d
NC
9768
9769 PERL_ARGS_ASSERT_SV_CATPVF_MG;
9770
ef50df4b 9771 va_start(args, pat);
c5be433b 9772 sv_vcatpvf_mg(sv, pat, &args);
ef50df4b 9773 va_end(args);
c5be433b
GS
9774}
9775
bffc3d17
SH
9776/*
9777=for apidoc sv_vcatpvf_mg
9778
9779Like C<sv_vcatpvf>, but also handles 'set' magic.
9780
9781Usually used via its frontend C<sv_catpvf_mg>.
9782
9783=cut
9784*/
645c22ef 9785
c5be433b 9786void
66ceb532 9787Perl_sv_vcatpvf_mg(pTHX_ SV *const sv, const char *const pat, va_list *const args)
c5be433b 9788{
7918f24d
NC
9789 PERL_ARGS_ASSERT_SV_VCATPVF_MG;
9790
4608196e 9791 sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
ef50df4b
GS
9792 SvSETMAGIC(sv);
9793}
9794
954c1994
GS
9795/*
9796=for apidoc sv_vsetpvfn
9797
bffc3d17 9798Works like C<sv_vcatpvfn> but copies the text into the SV instead of
954c1994
GS
9799appending it.
9800
bffc3d17 9801Usually used via one of its frontends C<sv_vsetpvf> and C<sv_vsetpvf_mg>.
645c22ef 9802
954c1994
GS
9803=cut
9804*/
9805
46fc3d4c 9806void
66ceb532
SS
9807Perl_sv_vsetpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
9808 va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted)
46fc3d4c 9809{
7918f24d
NC
9810 PERL_ARGS_ASSERT_SV_VSETPVFN;
9811
76f68e9b 9812 sv_setpvs(sv, "");
7d5ea4e7 9813 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
46fc3d4c 9814}
9815
7baa4690
HS
9816
9817/*
9818 * Warn of missing argument to sprintf, and then return a defined value
9819 * to avoid inappropriate "use of uninit" warnings [perl #71000].
9820 */
9821#define WARN_MISSING WARN_UNINITIALIZED /* Not sure we want a new category */
9822STATIC SV*
81ae3cde 9823S_vcatpvfn_missing_argument(pTHX) {
7baa4690
HS
9824 if (ckWARN(WARN_MISSING)) {
9825 Perl_warner(aTHX_ packWARN(WARN_MISSING), "Missing argument in %s",
9826 PL_op ? OP_DESC(PL_op) : "sv_vcatpvfn()");
9827 }
9828 return &PL_sv_no;
9829}
9830
9831
2d00ba3b 9832STATIC I32
66ceb532 9833S_expect_number(pTHX_ char **const pattern)
211dfcf1 9834{
97aff369 9835 dVAR;
211dfcf1 9836 I32 var = 0;
7918f24d
NC
9837
9838 PERL_ARGS_ASSERT_EXPECT_NUMBER;
9839
211dfcf1
HS
9840 switch (**pattern) {
9841 case '1': case '2': case '3':
9842 case '4': case '5': case '6':
9843 case '7': case '8': case '9':
2fba7546
GA
9844 var = *(*pattern)++ - '0';
9845 while (isDIGIT(**pattern)) {
5f66b61c 9846 const I32 tmp = var * 10 + (*(*pattern)++ - '0');
2fba7546 9847 if (tmp < var)
94bbb3f4 9848 Perl_croak(aTHX_ "Integer overflow in format string for %s", (PL_op ? OP_DESC(PL_op) : "sv_vcatpvfn"));
2fba7546
GA
9849 var = tmp;
9850 }
211dfcf1
HS
9851 }
9852 return var;
9853}
211dfcf1 9854
c445ea15 9855STATIC char *
66ceb532 9856S_F0convert(NV nv, char *const endbuf, STRLEN *const len)
4151a5fe 9857{
a3b680e6 9858 const int neg = nv < 0;
4151a5fe 9859 UV uv;
4151a5fe 9860
7918f24d
NC
9861 PERL_ARGS_ASSERT_F0CONVERT;
9862
4151a5fe
IZ
9863 if (neg)
9864 nv = -nv;
9865 if (nv < UV_MAX) {
b464bac0 9866 char *p = endbuf;
4151a5fe 9867 nv += 0.5;
028f8eaa 9868 uv = (UV)nv;
4151a5fe
IZ
9869 if (uv & 1 && uv == nv)
9870 uv--; /* Round to even */
9871 do {
a3b680e6 9872 const unsigned dig = uv % 10;
4151a5fe
IZ
9873 *--p = '0' + dig;
9874 } while (uv /= 10);
9875 if (neg)
9876 *--p = '-';
9877 *len = endbuf - p;
9878 return p;
9879 }
bd61b366 9880 return NULL;
4151a5fe
IZ
9881}
9882
9883
954c1994
GS
9884/*
9885=for apidoc sv_vcatpvfn
9886
9887Processes its arguments like C<vsprintf> and appends the formatted output
9888to an SV. Uses an array of SVs if the C style variable argument list is
9889missing (NULL). When running with taint checks enabled, indicates via
9890C<maybe_tainted> if results are untrustworthy (often due to the use of
9891locales).
9892
bffc3d17 9893Usually used via one of its frontends C<sv_vcatpvf> and C<sv_vcatpvf_mg>.
645c22ef 9894
954c1994
GS
9895=cut
9896*/
9897
8896765a
RB
9898
9899#define VECTORIZE_ARGS vecsv = va_arg(*args, SV*);\
9900 vecstr = (U8*)SvPV_const(vecsv,veclen);\
9901 vec_utf8 = DO_UTF8(vecsv);
9902
1ef29b0e
RGS
9903/* XXX maybe_tainted is never assigned to, so the doc above is lying. */
9904
46fc3d4c 9905void
66ceb532
SS
9906Perl_sv_vcatpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
9907 va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted)
46fc3d4c 9908{
97aff369 9909 dVAR;
46fc3d4c 9910 char *p;
9911 char *q;
a3b680e6 9912 const char *patend;
fc36a67e 9913 STRLEN origlen;
46fc3d4c 9914 I32 svix = 0;
27da23d5 9915 static const char nullstr[] = "(null)";
a0714e2c 9916 SV *argsv = NULL;
b464bac0
AL
9917 bool has_utf8 = DO_UTF8(sv); /* has the result utf8? */
9918 const bool pat_utf8 = has_utf8; /* the pattern is in utf8? */
a0714e2c 9919 SV *nsv = NULL;
4151a5fe
IZ
9920 /* Times 4: a decimal digit takes more than 3 binary digits.
9921 * NV_DIG: mantissa takes than many decimal digits.
9922 * Plus 32: Playing safe. */
9923 char ebuf[IV_DIG * 4 + NV_DIG + 32];
9924 /* large enough for "%#.#f" --chip */
9925 /* what about long double NVs? --jhi */
db79b45b 9926
7918f24d 9927 PERL_ARGS_ASSERT_SV_VCATPVFN;
53c1dcc0
AL
9928 PERL_UNUSED_ARG(maybe_tainted);
9929
46fc3d4c 9930 /* no matter what, this is a string now */
fc36a67e 9931 (void)SvPV_force(sv, origlen);
46fc3d4c 9932
8896765a 9933 /* special-case "", "%s", and "%-p" (SVf - see below) */
46fc3d4c 9934 if (patlen == 0)
9935 return;
0dbb1585 9936 if (patlen == 2 && pat[0] == '%' && pat[1] == 's') {
2d03de9c
AL
9937 if (args) {
9938 const char * const s = va_arg(*args, char*);
9939 sv_catpv(sv, s ? s : nullstr);
9940 }
9941 else if (svix < svmax) {
9942 sv_catsv(sv, *svargs);
2d03de9c 9943 }
5b98cd54
VP
9944 else
9945 S_vcatpvfn_missing_argument(aTHX);
2d03de9c 9946 return;
0dbb1585 9947 }
8896765a
RB
9948 if (args && patlen == 3 && pat[0] == '%' &&
9949 pat[1] == '-' && pat[2] == 'p') {
daba3364 9950 argsv = MUTABLE_SV(va_arg(*args, void*));
8896765a 9951 sv_catsv(sv, argsv);
8896765a 9952 return;
46fc3d4c 9953 }
9954
1d917b39 9955#ifndef USE_LONG_DOUBLE
4151a5fe 9956 /* special-case "%.<number>[gf]" */
7af36d83 9957 if ( !args && patlen <= 5 && pat[0] == '%' && pat[1] == '.'
4151a5fe
IZ
9958 && (pat[patlen-1] == 'g' || pat[patlen-1] == 'f') ) {
9959 unsigned digits = 0;
9960 const char *pp;
9961
9962 pp = pat + 2;
9963 while (*pp >= '0' && *pp <= '9')
9964 digits = 10 * digits + (*pp++ - '0');
95ea86d5
NC
9965 if (pp - pat == (int)patlen - 1 && svix < svmax) {
9966 const NV nv = SvNV(*svargs);
4151a5fe 9967 if (*pp == 'g') {
2873255c
NC
9968 /* Add check for digits != 0 because it seems that some
9969 gconverts are buggy in this case, and we don't yet have
9970 a Configure test for this. */
9971 if (digits && digits < sizeof(ebuf) - NV_DIG - 10) {
9972 /* 0, point, slack */
2e59c212 9973 Gconvert(nv, (int)digits, 0, ebuf);
4151a5fe
IZ
9974 sv_catpv(sv, ebuf);
9975 if (*ebuf) /* May return an empty string for digits==0 */
9976 return;
9977 }
9978 } else if (!digits) {
9979 STRLEN l;
9980
9981 if ((p = F0convert(nv, ebuf + sizeof ebuf, &l))) {
9982 sv_catpvn(sv, p, l);
9983 return;
9984 }
9985 }
9986 }
9987 }
1d917b39 9988#endif /* !USE_LONG_DOUBLE */
4151a5fe 9989
2cf2cfc6 9990 if (!args && svix < svmax && DO_UTF8(*svargs))
205f51d8 9991 has_utf8 = TRUE;
2cf2cfc6 9992
46fc3d4c 9993 patend = (char*)pat + patlen;
9994 for (p = (char*)pat; p < patend; p = q) {
9995 bool alt = FALSE;
9996 bool left = FALSE;
b22c7a20 9997 bool vectorize = FALSE;
211dfcf1 9998 bool vectorarg = FALSE;
2cf2cfc6 9999 bool vec_utf8 = FALSE;
46fc3d4c 10000 char fill = ' ';
10001 char plus = 0;
10002 char intsize = 0;
10003 STRLEN width = 0;
fc36a67e 10004 STRLEN zeros = 0;
46fc3d4c 10005 bool has_precis = FALSE;
10006 STRLEN precis = 0;
c445ea15 10007 const I32 osvix = svix;
2cf2cfc6 10008 bool is_utf8 = FALSE; /* is this item utf8? */
20f6aaab
AS
10009#ifdef HAS_LDBL_SPRINTF_BUG
10010 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8 10011 with sfio - Allen <allens@cpan.org> */
20f6aaab
AS
10012 bool fix_ldbl_sprintf_bug = FALSE;
10013#endif
205f51d8 10014
46fc3d4c 10015 char esignbuf[4];
89ebb4a3 10016 U8 utf8buf[UTF8_MAXBYTES+1];
46fc3d4c 10017 STRLEN esignlen = 0;
10018
bd61b366 10019 const char *eptr = NULL;
1d1ac7bc 10020 const char *fmtstart;
fc36a67e 10021 STRLEN elen = 0;
a0714e2c 10022 SV *vecsv = NULL;
4608196e 10023 const U8 *vecstr = NULL;
b22c7a20 10024 STRLEN veclen = 0;
934abaf1 10025 char c = 0;
46fc3d4c 10026 int i;
9c5ffd7c 10027 unsigned base = 0;
8c8eb53c
RB
10028 IV iv = 0;
10029 UV uv = 0;
9e5b023a
JH
10030 /* we need a long double target in case HAS_LONG_DOUBLE but
10031 not USE_LONG_DOUBLE
10032 */
35fff930 10033#if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
9e5b023a
JH
10034 long double nv;
10035#else
65202027 10036 NV nv;
9e5b023a 10037#endif
46fc3d4c 10038 STRLEN have;
10039 STRLEN need;
10040 STRLEN gap;
7af36d83 10041 const char *dotstr = ".";
b22c7a20 10042 STRLEN dotstrlen = 1;
211dfcf1 10043 I32 efix = 0; /* explicit format parameter index */
eb3fce90 10044 I32 ewix = 0; /* explicit width index */
211dfcf1
HS
10045 I32 epix = 0; /* explicit precision index */
10046 I32 evix = 0; /* explicit vector index */
eb3fce90 10047 bool asterisk = FALSE;
46fc3d4c 10048
211dfcf1 10049 /* echo everything up to the next format specification */
46fc3d4c 10050 for (q = p; q < patend && *q != '%'; ++q) ;
10051 if (q > p) {
db79b45b
JH
10052 if (has_utf8 && !pat_utf8)
10053 sv_catpvn_utf8_upgrade(sv, p, q - p, nsv);
10054 else
10055 sv_catpvn(sv, p, q - p);
46fc3d4c 10056 p = q;
10057 }
10058 if (q++ >= patend)
10059 break;
10060
1d1ac7bc
MHM
10061 fmtstart = q;
10062
211dfcf1
HS
10063/*
10064 We allow format specification elements in this order:
10065 \d+\$ explicit format parameter index
10066 [-+ 0#]+ flags
a472f209 10067 v|\*(\d+\$)?v vector with optional (optionally specified) arg
f3583277 10068 0 flag (as above): repeated to allow "v02"
211dfcf1
HS
10069 \d+|\*(\d+\$)? width using optional (optionally specified) arg
10070 \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
10071 [hlqLV] size
8896765a
RB
10072 [%bcdefginopsuxDFOUX] format (mandatory)
10073*/
10074
10075 if (args) {
10076/*
10077 As of perl5.9.3, printf format checking is on by default.
10078 Internally, perl uses %p formats to provide an escape to
10079 some extended formatting. This block deals with those
10080 extensions: if it does not match, (char*)q is reset and
10081 the normal format processing code is used.
10082
10083 Currently defined extensions are:
10084 %p include pointer address (standard)
10085 %-p (SVf) include an SV (previously %_)
10086 %-<num>p include an SV with precision <num>
8896765a
RB
10087 %<num>p reserved for future extensions
10088
10089 Robin Barker 2005-07-14
f46d31f2
RB
10090
10091 %1p (VDf) removed. RMB 2007-10-19
211dfcf1 10092*/
8896765a
RB
10093 char* r = q;
10094 bool sv = FALSE;
10095 STRLEN n = 0;
10096 if (*q == '-')
10097 sv = *q++;
c445ea15 10098 n = expect_number(&q);
8896765a
RB
10099 if (*q++ == 'p') {
10100 if (sv) { /* SVf */
10101 if (n) {
10102 precis = n;
10103 has_precis = TRUE;
10104 }
daba3364 10105 argsv = MUTABLE_SV(va_arg(*args, void*));
4ea561bc 10106 eptr = SvPV_const(argsv, elen);
8896765a
RB
10107 if (DO_UTF8(argsv))
10108 is_utf8 = TRUE;
10109 goto string;
10110 }
8896765a 10111 else if (n) {
9b387841
NC
10112 Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),
10113 "internal %%<num>p might conflict with future printf extensions");
8896765a
RB
10114 }
10115 }
10116 q = r;
10117 }
10118
c445ea15 10119 if ( (width = expect_number(&q)) ) {
211dfcf1
HS
10120 if (*q == '$') {
10121 ++q;
10122 efix = width;
10123 } else {
10124 goto gotwidth;
10125 }
10126 }
10127
fc36a67e 10128 /* FLAGS */
10129
46fc3d4c 10130 while (*q) {
10131 switch (*q) {
10132 case ' ':
10133 case '+':
9911cee9
TS
10134 if (plus == '+' && *q == ' ') /* '+' over ' ' */
10135 q++;
10136 else
10137 plus = *q++;
46fc3d4c 10138 continue;
10139
10140 case '-':
10141 left = TRUE;
10142 q++;
10143 continue;
10144
10145 case '0':
10146 fill = *q++;
10147 continue;
10148
10149 case '#':
10150 alt = TRUE;
10151 q++;
10152 continue;
10153
fc36a67e 10154 default:
10155 break;
10156 }
10157 break;
10158 }
46fc3d4c 10159
211dfcf1 10160 tryasterisk:
eb3fce90 10161 if (*q == '*') {
211dfcf1 10162 q++;
c445ea15 10163 if ( (ewix = expect_number(&q)) )
211dfcf1
HS
10164 if (*q++ != '$')
10165 goto unknown;
eb3fce90 10166 asterisk = TRUE;
211dfcf1
HS
10167 }
10168 if (*q == 'v') {
eb3fce90 10169 q++;
211dfcf1
HS
10170 if (vectorize)
10171 goto unknown;
9cbac4c7 10172 if ((vectorarg = asterisk)) {
211dfcf1
HS
10173 evix = ewix;
10174 ewix = 0;
10175 asterisk = FALSE;
10176 }
10177 vectorize = TRUE;
10178 goto tryasterisk;
eb3fce90
JH
10179 }
10180
211dfcf1 10181 if (!asterisk)
858a90f9 10182 {
7a5fa8a2 10183 if( *q == '0' )
f3583277 10184 fill = *q++;
c445ea15 10185 width = expect_number(&q);
858a90f9 10186 }
211dfcf1 10187
ed362004
HS
10188 if (vectorize && vectorarg) {
10189 /* vectorizing, but not with the default "." */
10190 if (args)
10191 vecsv = va_arg(*args, SV*);
10192 else if (evix) {
10193 vecsv = (evix > 0 && evix <= svmax)
10194 ? svargs[evix-1] : S_vcatpvfn_missing_argument(aTHX);
10195 } else {
10196 vecsv = svix < svmax
10197 ? svargs[svix++] : S_vcatpvfn_missing_argument(aTHX);
211dfcf1 10198 }
ed362004
HS
10199 dotstr = SvPV_const(vecsv, dotstrlen);
10200 /* Keep the DO_UTF8 test *after* the SvPV call, else things go
10201 bad with tied or overloaded values that return UTF8. */
10202 if (DO_UTF8(vecsv))
10203 is_utf8 = TRUE;
10204 else if (has_utf8) {
10205 vecsv = sv_mortalcopy(vecsv);
10206 sv_utf8_upgrade(vecsv);
10207 dotstr = SvPV_const(vecsv, dotstrlen);
10208 is_utf8 = TRUE;
10209 }
eb3fce90 10210 }
fc36a67e 10211
eb3fce90 10212 if (asterisk) {
fc36a67e 10213 if (args)
10214 i = va_arg(*args, int);
10215 else
eb3fce90
JH
10216 i = (ewix ? ewix <= svmax : svix < svmax) ?
10217 SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 10218 left |= (i < 0);
10219 width = (i < 0) ? -i : i;
fc36a67e 10220 }
211dfcf1 10221 gotwidth:
fc36a67e 10222
10223 /* PRECISION */
46fc3d4c 10224
fc36a67e 10225 if (*q == '.') {
10226 q++;
10227 if (*q == '*') {
211dfcf1 10228 q++;
c445ea15 10229 if ( ((epix = expect_number(&q))) && (*q++ != '$') )
7b8dd722
HS
10230 goto unknown;
10231 /* XXX: todo, support specified precision parameter */
10232 if (epix)
211dfcf1 10233 goto unknown;
46fc3d4c 10234 if (args)
10235 i = va_arg(*args, int);
10236 else
eb3fce90
JH
10237 i = (ewix ? ewix <= svmax : svix < svmax)
10238 ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
9911cee9
TS
10239 precis = i;
10240 has_precis = !(i < 0);
fc36a67e 10241 }
10242 else {
10243 precis = 0;
10244 while (isDIGIT(*q))
10245 precis = precis * 10 + (*q++ - '0');
9911cee9 10246 has_precis = TRUE;
fc36a67e 10247 }
fc36a67e 10248 }
46fc3d4c 10249
ed362004
HS
10250 if (vectorize) {
10251 if (args) {
10252 VECTORIZE_ARGS
10253 }
10254 else if (efix ? (efix > 0 && efix <= svmax) : svix < svmax) {
10255 vecsv = svargs[efix ? efix-1 : svix++];
10256 vecstr = (U8*)SvPV_const(vecsv,veclen);
10257 vec_utf8 = DO_UTF8(vecsv);
10258
10259 /* if this is a version object, we need to convert
10260 * back into v-string notation and then let the
10261 * vectorize happen normally
10262 */
10263 if (sv_derived_from(vecsv, "version")) {
10264 char *version = savesvpv(vecsv);
10265 if ( hv_exists(MUTABLE_HV(SvRV(vecsv)), "alpha", 5 ) ) {
10266 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
10267 "vector argument not supported with alpha versions");
10268 goto unknown;
10269 }
10270 vecsv = sv_newmortal();
10271 scan_vstring(version, version + veclen, vecsv);
10272 vecstr = (U8*)SvPV_const(vecsv, veclen);
10273 vec_utf8 = DO_UTF8(vecsv);
10274 Safefree(version);
10275 }
10276 }
10277 else {
10278 vecstr = (U8*)"";
10279 veclen = 0;
10280 }
10281 }
10282
fc36a67e 10283 /* SIZE */
46fc3d4c 10284
fc36a67e 10285 switch (*q) {
c623ac67
GS
10286#ifdef WIN32
10287 case 'I': /* Ix, I32x, and I64x */
10288# ifdef WIN64
10289 if (q[1] == '6' && q[2] == '4') {
10290 q += 3;
10291 intsize = 'q';
10292 break;
10293 }
10294# endif
10295 if (q[1] == '3' && q[2] == '2') {
10296 q += 3;
10297 break;
10298 }
10299# ifdef WIN64
10300 intsize = 'q';
10301# endif
10302 q++;
10303 break;
10304#endif
9e5b023a 10305#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
6f9bb7fd 10306 case 'L': /* Ld */
5f66b61c 10307 /*FALLTHROUGH*/
e5c81feb 10308#ifdef HAS_QUAD
6f9bb7fd 10309 case 'q': /* qd */
9e5b023a 10310#endif
6f9bb7fd
GS
10311 intsize = 'q';
10312 q++;
10313 break;
10314#endif
fc36a67e 10315 case 'l':
9e5b023a 10316#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
07208e09 10317 if (*++q == 'l') { /* lld, llf */
fc36a67e 10318 intsize = 'q';
07208e09
CS
10319 ++q;
10320 }
10321 else
fc36a67e 10322#endif
07208e09
CS
10323 intsize = 'l';
10324 break;
fc36a67e 10325 case 'h':
07208e09
CS
10326 if (*++q == 'h') { /* hhd, hhu */
10327 intsize = 'c';
10328 ++q;
10329 }
10330 else
10331 intsize = 'h';
10332 break;
fc36a67e 10333 case 'V':
07208e09
CS
10334 case 'z':
10335 case 't':
10336#if HAS_C99
10337 case 'j':
10338#endif
fc36a67e 10339 intsize = *q++;
46fc3d4c 10340 break;
10341 }
10342
fc36a67e 10343 /* CONVERSION */
10344
211dfcf1
HS
10345 if (*q == '%') {
10346 eptr = q++;
10347 elen = 1;
26372e71
GA
10348 if (vectorize) {
10349 c = '%';
10350 goto unknown;
10351 }
211dfcf1
HS
10352 goto string;
10353 }
10354
26372e71 10355 if (!vectorize && !args) {
86c51f8b
NC
10356 if (efix) {
10357 const I32 i = efix-1;
7baa4690 10358 argsv = (i >= 0 && i < svmax)
81ae3cde 10359 ? svargs[i] : S_vcatpvfn_missing_argument(aTHX);
86c51f8b
NC
10360 } else {
10361 argsv = (svix >= 0 && svix < svmax)
81ae3cde 10362 ? svargs[svix++] : S_vcatpvfn_missing_argument(aTHX);
86c51f8b 10363 }
863811b2 10364 }
211dfcf1 10365
46fc3d4c 10366 switch (c = *q++) {
10367
10368 /* STRINGS */
10369
46fc3d4c 10370 case 'c':
26372e71
GA
10371 if (vectorize)
10372 goto unknown;
4ea561bc 10373 uv = (args) ? va_arg(*args, int) : SvIV(argsv);
1bd104fb
JH
10374 if ((uv > 255 ||
10375 (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
0064a8a9 10376 && !IN_BYTES) {
dfe13c55 10377 eptr = (char*)utf8buf;
9041c2e3 10378 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
2cf2cfc6 10379 is_utf8 = TRUE;
7e2040f0
GS
10380 }
10381 else {
10382 c = (char)uv;
10383 eptr = &c;
10384 elen = 1;
a0ed51b3 10385 }
46fc3d4c 10386 goto string;
10387
46fc3d4c 10388 case 's':
26372e71
GA
10389 if (vectorize)
10390 goto unknown;
10391 if (args) {
fc36a67e 10392 eptr = va_arg(*args, char*);
c635e13b 10393 if (eptr)
10394 elen = strlen(eptr);
10395 else {
27da23d5 10396 eptr = (char *)nullstr;
c635e13b 10397 elen = sizeof nullstr - 1;
10398 }
46fc3d4c 10399 }
211dfcf1 10400 else {
4ea561bc 10401 eptr = SvPV_const(argsv, elen);
7e2040f0 10402 if (DO_UTF8(argsv)) {
c494f1f4 10403 STRLEN old_precis = precis;
a0ed51b3 10404 if (has_precis && precis < elen) {
c494f1f4 10405 STRLEN ulen = sv_len_utf8(argsv);
9ef5ed94 10406 I32 p = precis > ulen ? ulen : precis;
7e2040f0 10407 sv_pos_u2b(argsv, &p, 0); /* sticks at end */
a0ed51b3
LW
10408 precis = p;
10409 }
10410 if (width) { /* fudge width (can't fudge elen) */
59b61096
AV
10411 if (has_precis && precis < elen)
10412 width += precis - old_precis;
10413 else
10414 width += elen - sv_len_utf8(argsv);
a0ed51b3 10415 }
2cf2cfc6 10416 is_utf8 = TRUE;
a0ed51b3
LW
10417 }
10418 }
fc36a67e 10419
46fc3d4c 10420 string:
9ef5ed94 10421 if (has_precis && precis < elen)
46fc3d4c 10422 elen = precis;
10423 break;
10424
10425 /* INTEGERS */
10426
fc36a67e 10427 case 'p':
be75b157 10428 if (alt || vectorize)
c2e66d9e 10429 goto unknown;
211dfcf1 10430 uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
fc36a67e 10431 base = 16;
10432 goto integer;
10433
46fc3d4c 10434 case 'D':
29fe7a80 10435#ifdef IV_IS_QUAD
22f3ae8c 10436 intsize = 'q';
29fe7a80 10437#else
46fc3d4c 10438 intsize = 'l';
29fe7a80 10439#endif
5f66b61c 10440 /*FALLTHROUGH*/
46fc3d4c 10441 case 'd':
10442 case 'i':
8896765a
RB
10443#if vdNUMBER
10444 format_vd:
10445#endif
b22c7a20 10446 if (vectorize) {
ba210ebe 10447 STRLEN ulen;
211dfcf1
HS
10448 if (!veclen)
10449 continue;
2cf2cfc6
A
10450 if (vec_utf8)
10451 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
10452 UTF8_ALLOW_ANYUV);
b22c7a20 10453 else {
e83d50c9 10454 uv = *vecstr;
b22c7a20
GS
10455 ulen = 1;
10456 }
10457 vecstr += ulen;
10458 veclen -= ulen;
e83d50c9
JP
10459 if (plus)
10460 esignbuf[esignlen++] = plus;
b22c7a20
GS
10461 }
10462 else if (args) {
46fc3d4c 10463 switch (intsize) {
07208e09 10464 case 'c': iv = (char)va_arg(*args, int); break;
46fc3d4c 10465 case 'h': iv = (short)va_arg(*args, int); break;
46fc3d4c 10466 case 'l': iv = va_arg(*args, long); break;
fc36a67e 10467 case 'V': iv = va_arg(*args, IV); break;
07208e09
CS
10468 case 'z': iv = va_arg(*args, SSize_t); break;
10469 case 't': iv = va_arg(*args, ptrdiff_t); break;
b10c0dba 10470 default: iv = va_arg(*args, int); break;
07208e09
CS
10471#if HAS_C99
10472 case 'j': iv = va_arg(*args, intmax_t); break;
10473#endif
53f65a9e 10474 case 'q':
cf2093f6 10475#ifdef HAS_QUAD
53f65a9e
HS
10476 iv = va_arg(*args, Quad_t); break;
10477#else
10478 goto unknown;
cf2093f6 10479#endif
46fc3d4c 10480 }
10481 }
10482 else {
4ea561bc 10483 IV tiv = SvIV(argsv); /* work around GCC bug #13488 */
46fc3d4c 10484 switch (intsize) {
07208e09 10485 case 'c': iv = (char)tiv; break;
b10c0dba
MHM
10486 case 'h': iv = (short)tiv; break;
10487 case 'l': iv = (long)tiv; break;
10488 case 'V':
10489 default: iv = tiv; break;
53f65a9e 10490 case 'q':
cf2093f6 10491#ifdef HAS_QUAD
53f65a9e
HS
10492 iv = (Quad_t)tiv; break;
10493#else
10494 goto unknown;
cf2093f6 10495#endif
46fc3d4c 10496 }
10497 }
e83d50c9
JP
10498 if ( !vectorize ) /* we already set uv above */
10499 {
10500 if (iv >= 0) {
10501 uv = iv;
10502 if (plus)
10503 esignbuf[esignlen++] = plus;
10504 }
10505 else {
10506 uv = -iv;
10507 esignbuf[esignlen++] = '-';
10508 }
46fc3d4c 10509 }
10510 base = 10;
10511 goto integer;
10512
fc36a67e 10513 case 'U':
29fe7a80 10514#ifdef IV_IS_QUAD
22f3ae8c 10515 intsize = 'q';
29fe7a80 10516#else
fc36a67e 10517 intsize = 'l';
29fe7a80 10518#endif
5f66b61c 10519 /*FALLTHROUGH*/
fc36a67e 10520 case 'u':
10521 base = 10;
10522 goto uns_integer;
10523
7ff06cc7 10524 case 'B':
4f19785b
WSI
10525 case 'b':
10526 base = 2;
10527 goto uns_integer;
10528
46fc3d4c 10529 case 'O':
29fe7a80 10530#ifdef IV_IS_QUAD
22f3ae8c 10531 intsize = 'q';
29fe7a80 10532#else
46fc3d4c 10533 intsize = 'l';
29fe7a80 10534#endif
5f66b61c 10535 /*FALLTHROUGH*/
46fc3d4c 10536 case 'o':
10537 base = 8;
10538 goto uns_integer;
10539
10540 case 'X':
46fc3d4c 10541 case 'x':
10542 base = 16;
46fc3d4c 10543
10544 uns_integer:
b22c7a20 10545 if (vectorize) {
ba210ebe 10546 STRLEN ulen;
b22c7a20 10547 vector:
211dfcf1
HS
10548 if (!veclen)
10549 continue;
2cf2cfc6
A
10550 if (vec_utf8)
10551 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
10552 UTF8_ALLOW_ANYUV);
b22c7a20 10553 else {
a05b299f 10554 uv = *vecstr;
b22c7a20
GS
10555 ulen = 1;
10556 }
10557 vecstr += ulen;
10558 veclen -= ulen;
10559 }
10560 else if (args) {
46fc3d4c 10561 switch (intsize) {
07208e09 10562 case 'c': uv = (unsigned char)va_arg(*args, unsigned); break;
46fc3d4c 10563 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
46fc3d4c 10564 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 10565 case 'V': uv = va_arg(*args, UV); break;
07208e09
CS
10566 case 'z': uv = va_arg(*args, Size_t); break;
10567 case 't': uv = va_arg(*args, ptrdiff_t); break; /* will sign extend, but there is no uptrdiff_t, so oh well */
10568#if HAS_C99
10569 case 'j': uv = va_arg(*args, uintmax_t); break;
10570#endif
b10c0dba 10571 default: uv = va_arg(*args, unsigned); break;
53f65a9e 10572 case 'q':
cf2093f6 10573#ifdef HAS_QUAD
53f65a9e
HS
10574 uv = va_arg(*args, Uquad_t); break;
10575#else
10576 goto unknown;
cf2093f6 10577#endif
46fc3d4c 10578 }
10579 }
10580 else {
4ea561bc 10581 UV tuv = SvUV(argsv); /* work around GCC bug #13488 */
46fc3d4c 10582 switch (intsize) {
07208e09 10583 case 'c': uv = (unsigned char)tuv; break;
b10c0dba
MHM
10584 case 'h': uv = (unsigned short)tuv; break;
10585 case 'l': uv = (unsigned long)tuv; break;
10586 case 'V':
10587 default: uv = tuv; break;
53f65a9e 10588 case 'q':
cf2093f6 10589#ifdef HAS_QUAD
53f65a9e
HS
10590 uv = (Uquad_t)tuv; break;
10591#else
10592 goto unknown;
cf2093f6 10593#endif
46fc3d4c 10594 }
10595 }
10596
10597 integer:
4d84ee25
NC
10598 {
10599 char *ptr = ebuf + sizeof ebuf;
1387f30c
DD
10600 bool tempalt = uv ? alt : FALSE; /* Vectors can't change alt */
10601 zeros = 0;
10602
4d84ee25
NC
10603 switch (base) {
10604 unsigned dig;
10605 case 16:
14eb61ab 10606 p = (char *)((c == 'X') ? PL_hexdigit + 16 : PL_hexdigit);
4d84ee25
NC
10607 do {
10608 dig = uv & 15;
10609 *--ptr = p[dig];
10610 } while (uv >>= 4);
1387f30c 10611 if (tempalt) {
4d84ee25
NC
10612 esignbuf[esignlen++] = '0';
10613 esignbuf[esignlen++] = c; /* 'x' or 'X' */
10614 }
10615 break;
10616 case 8:
10617 do {
10618 dig = uv & 7;
10619 *--ptr = '0' + dig;
10620 } while (uv >>= 3);
10621 if (alt && *ptr != '0')
10622 *--ptr = '0';
10623 break;
10624 case 2:
10625 do {
10626 dig = uv & 1;
10627 *--ptr = '0' + dig;
10628 } while (uv >>= 1);
1387f30c 10629 if (tempalt) {
4d84ee25 10630 esignbuf[esignlen++] = '0';
7ff06cc7 10631 esignbuf[esignlen++] = c;
4d84ee25
NC
10632 }
10633 break;
10634 default: /* it had better be ten or less */
10635 do {
10636 dig = uv % base;
10637 *--ptr = '0' + dig;
10638 } while (uv /= base);
10639 break;
46fc3d4c 10640 }
4d84ee25
NC
10641 elen = (ebuf + sizeof ebuf) - ptr;
10642 eptr = ptr;
10643 if (has_precis) {
10644 if (precis > elen)
10645 zeros = precis - elen;
e6bb52fd
TS
10646 else if (precis == 0 && elen == 1 && *eptr == '0'
10647 && !(base == 8 && alt)) /* "%#.0o" prints "0" */
4d84ee25 10648 elen = 0;
9911cee9
TS
10649
10650 /* a precision nullifies the 0 flag. */
10651 if (fill == '0')
10652 fill = ' ';
eda88b6d 10653 }
c10ed8b9 10654 }
46fc3d4c 10655 break;
10656
10657 /* FLOATING POINT */
10658
fc36a67e 10659 case 'F':
10660 c = 'f'; /* maybe %F isn't supported here */
5f66b61c 10661 /*FALLTHROUGH*/
46fc3d4c 10662 case 'e': case 'E':
fc36a67e 10663 case 'f':
46fc3d4c 10664 case 'g': case 'G':
26372e71
GA
10665 if (vectorize)
10666 goto unknown;
46fc3d4c 10667
10668 /* This is evil, but floating point is even more evil */
10669
9e5b023a
JH
10670 /* for SV-style calling, we can only get NV
10671 for C-style calling, we assume %f is double;
10672 for simplicity we allow any of %Lf, %llf, %qf for long double
10673 */
10674 switch (intsize) {
10675 case 'V':
10676#if defined(USE_LONG_DOUBLE)
10677 intsize = 'q';
10678#endif
10679 break;
8a2e3f14 10680/* [perl #20339] - we should accept and ignore %lf rather than die */
00e17364 10681 case 'l':
5f66b61c 10682 /*FALLTHROUGH*/
9e5b023a
JH
10683 default:
10684#if defined(USE_LONG_DOUBLE)
10685 intsize = args ? 0 : 'q';
10686#endif
10687 break;
10688 case 'q':
10689#if defined(HAS_LONG_DOUBLE)
10690 break;
10691#else
5f66b61c 10692 /*FALLTHROUGH*/
9e5b023a 10693#endif
07208e09 10694 case 'c':
9e5b023a 10695 case 'h':
07208e09
CS
10696 case 'z':
10697 case 't':
10698 case 'j':
9e5b023a
JH
10699 goto unknown;
10700 }
10701
10702 /* now we need (long double) if intsize == 'q', else (double) */
26372e71 10703 nv = (args) ?
35fff930
JH
10704#if LONG_DOUBLESIZE > DOUBLESIZE
10705 intsize == 'q' ?
205f51d8
AS
10706 va_arg(*args, long double) :
10707 va_arg(*args, double)
35fff930 10708#else
205f51d8 10709 va_arg(*args, double)
35fff930 10710#endif
4ea561bc 10711 : SvNV(argsv);
fc36a67e 10712
10713 need = 0;
3952c29a
NC
10714 /* nv * 0 will be NaN for NaN, +Inf and -Inf, and 0 for anything
10715 else. frexp() has some unspecified behaviour for those three */
10716 if (c != 'e' && c != 'E' && (nv * 0) == 0) {
fc36a67e 10717 i = PERL_INT_MIN;
9e5b023a
JH
10718 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
10719 will cast our (long double) to (double) */
73b309ea 10720 (void)Perl_frexp(nv, &i);
fc36a67e 10721 if (i == PERL_INT_MIN)
cea2e8a9 10722 Perl_die(aTHX_ "panic: frexp");
c635e13b 10723 if (i > 0)
fc36a67e 10724 need = BIT_DIGITS(i);
10725 }
10726 need += has_precis ? precis : 6; /* known default */
20f6aaab 10727
fc36a67e 10728 if (need < width)
10729 need = width;
10730
20f6aaab
AS
10731#ifdef HAS_LDBL_SPRINTF_BUG
10732 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8
AS
10733 with sfio - Allen <allens@cpan.org> */
10734
10735# ifdef DBL_MAX
10736# define MY_DBL_MAX DBL_MAX
10737# else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
10738# if DOUBLESIZE >= 8
10739# define MY_DBL_MAX 1.7976931348623157E+308L
10740# else
10741# define MY_DBL_MAX 3.40282347E+38L
10742# endif
10743# endif
10744
10745# ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
10746# define MY_DBL_MAX_BUG 1L
20f6aaab 10747# else
205f51d8 10748# define MY_DBL_MAX_BUG MY_DBL_MAX
20f6aaab 10749# endif
20f6aaab 10750
205f51d8
AS
10751# ifdef DBL_MIN
10752# define MY_DBL_MIN DBL_MIN
10753# else /* XXX guessing! -Allen */
10754# if DOUBLESIZE >= 8
10755# define MY_DBL_MIN 2.2250738585072014E-308L
10756# else
10757# define MY_DBL_MIN 1.17549435E-38L
10758# endif
10759# endif
20f6aaab 10760
205f51d8
AS
10761 if ((intsize == 'q') && (c == 'f') &&
10762 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
10763 (need < DBL_DIG)) {
10764 /* it's going to be short enough that
10765 * long double precision is not needed */
10766
10767 if ((nv <= 0L) && (nv >= -0L))
10768 fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
10769 else {
10770 /* would use Perl_fp_class as a double-check but not
10771 * functional on IRIX - see perl.h comments */
10772
10773 if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
10774 /* It's within the range that a double can represent */
10775#if defined(DBL_MAX) && !defined(DBL_MIN)
10776 if ((nv >= ((long double)1/DBL_MAX)) ||
10777 (nv <= (-(long double)1/DBL_MAX)))
20f6aaab 10778#endif
205f51d8 10779 fix_ldbl_sprintf_bug = TRUE;
20f6aaab 10780 }
205f51d8
AS
10781 }
10782 if (fix_ldbl_sprintf_bug == TRUE) {
10783 double temp;
10784
10785 intsize = 0;
10786 temp = (double)nv;
10787 nv = (NV)temp;
10788 }
20f6aaab 10789 }
205f51d8
AS
10790
10791# undef MY_DBL_MAX
10792# undef MY_DBL_MAX_BUG
10793# undef MY_DBL_MIN
10794
20f6aaab
AS
10795#endif /* HAS_LDBL_SPRINTF_BUG */
10796
46fc3d4c 10797 need += 20; /* fudge factor */
80252599
GS
10798 if (PL_efloatsize < need) {
10799 Safefree(PL_efloatbuf);
10800 PL_efloatsize = need + 20; /* more fudge */
a02a5408 10801 Newx(PL_efloatbuf, PL_efloatsize, char);
7d5ea4e7 10802 PL_efloatbuf[0] = '\0';
46fc3d4c 10803 }
10804
4151a5fe
IZ
10805 if ( !(width || left || plus || alt) && fill != '0'
10806 && has_precis && intsize != 'q' ) { /* Shortcuts */
2873255c
NC
10807 /* See earlier comment about buggy Gconvert when digits,
10808 aka precis is 0 */
10809 if ( c == 'g' && precis) {
2e59c212 10810 Gconvert((NV)nv, (int)precis, 0, PL_efloatbuf);
4150c189
NC
10811 /* May return an empty string for digits==0 */
10812 if (*PL_efloatbuf) {
10813 elen = strlen(PL_efloatbuf);
4151a5fe 10814 goto float_converted;
4150c189 10815 }
4151a5fe
IZ
10816 } else if ( c == 'f' && !precis) {
10817 if ((eptr = F0convert(nv, ebuf + sizeof ebuf, &elen)))
10818 break;
10819 }
10820 }
4d84ee25
NC
10821 {
10822 char *ptr = ebuf + sizeof ebuf;
10823 *--ptr = '\0';
10824 *--ptr = c;
10825 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
9e5b023a 10826#if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
4d84ee25
NC
10827 if (intsize == 'q') {
10828 /* Copy the one or more characters in a long double
10829 * format before the 'base' ([efgEFG]) character to
10830 * the format string. */
10831 static char const prifldbl[] = PERL_PRIfldbl;
10832 char const *p = prifldbl + sizeof(prifldbl) - 3;
10833 while (p >= prifldbl) { *--ptr = *p--; }
10834 }
65202027 10835#endif
4d84ee25
NC
10836 if (has_precis) {
10837 base = precis;
10838 do { *--ptr = '0' + (base % 10); } while (base /= 10);
10839 *--ptr = '.';
10840 }
10841 if (width) {
10842 base = width;
10843 do { *--ptr = '0' + (base % 10); } while (base /= 10);
10844 }
10845 if (fill == '0')
10846 *--ptr = fill;
10847 if (left)
10848 *--ptr = '-';
10849 if (plus)
10850 *--ptr = plus;
10851 if (alt)
10852 *--ptr = '#';
10853 *--ptr = '%';
10854
10855 /* No taint. Otherwise we are in the strange situation
10856 * where printf() taints but print($float) doesn't.
10857 * --jhi */
9e5b023a 10858#if defined(HAS_LONG_DOUBLE)
4150c189 10859 elen = ((intsize == 'q')
d9fad198
JH
10860 ? my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, nv)
10861 : my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, (double)nv));
9e5b023a 10862#else
4150c189 10863 elen = my_sprintf(PL_efloatbuf, ptr, nv);
9e5b023a 10864#endif
4d84ee25 10865 }
4151a5fe 10866 float_converted:
80252599 10867 eptr = PL_efloatbuf;
46fc3d4c 10868 break;
10869
fc36a67e 10870 /* SPECIAL */
10871
10872 case 'n':
26372e71
GA
10873 if (vectorize)
10874 goto unknown;
fc36a67e 10875 i = SvCUR(sv) - origlen;
26372e71 10876 if (args) {
c635e13b 10877 switch (intsize) {
07208e09 10878 case 'c': *(va_arg(*args, char*)) = i; break;
c635e13b 10879 case 'h': *(va_arg(*args, short*)) = i; break;
10880 default: *(va_arg(*args, int*)) = i; break;
10881 case 'l': *(va_arg(*args, long*)) = i; break;
10882 case 'V': *(va_arg(*args, IV*)) = i; break;
07208e09
CS
10883 case 'z': *(va_arg(*args, SSize_t*)) = i; break;
10884 case 't': *(va_arg(*args, ptrdiff_t*)) = i; break;
10885#if HAS_C99
10886 case 'j': *(va_arg(*args, intmax_t*)) = i; break;
10887#endif
53f65a9e 10888 case 'q':
cf2093f6 10889#ifdef HAS_QUAD
53f65a9e
HS
10890 *(va_arg(*args, Quad_t*)) = i; break;
10891#else
10892 goto unknown;
cf2093f6 10893#endif
c635e13b 10894 }
fc36a67e 10895 }
9dd79c3f 10896 else
211dfcf1 10897 sv_setuv_mg(argsv, (UV)i);
fc36a67e 10898 continue; /* not "break" */
10899
10900 /* UNKNOWN */
10901
46fc3d4c 10902 default:
fc36a67e 10903 unknown:
041457d9
DM
10904 if (!args
10905 && (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)
10906 && ckWARN(WARN_PRINTF))
10907 {
c4420975 10908 SV * const msg = sv_newmortal();
35c1215d
NC
10909 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
10910 (PL_op->op_type == OP_PRTF) ? "" : "s");
1d1ac7bc
MHM
10911 if (fmtstart < patend) {
10912 const char * const fmtend = q < patend ? q : patend;
10913 const char * f;
10914 sv_catpvs(msg, "\"%");
10915 for (f = fmtstart; f < fmtend; f++) {
10916 if (isPRINT(*f)) {
10917 sv_catpvn(msg, f, 1);
10918 } else {
10919 Perl_sv_catpvf(aTHX_ msg,
10920 "\\%03"UVof, (UV)*f & 0xFF);
10921 }
10922 }
10923 sv_catpvs(msg, "\"");
10924 } else {
396482e1 10925 sv_catpvs(msg, "end of string");
1d1ac7bc 10926 }
be2597df 10927 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, SVfARG(msg)); /* yes, this is reentrant */
c635e13b 10928 }
fb73857a 10929
10930 /* output mangled stuff ... */
10931 if (c == '\0')
10932 --q;
46fc3d4c 10933 eptr = p;
10934 elen = q - p;
fb73857a 10935
10936 /* ... right here, because formatting flags should not apply */
10937 SvGROW(sv, SvCUR(sv) + elen + 1);
10938 p = SvEND(sv);
4459522c 10939 Copy(eptr, p, elen, char);
fb73857a 10940 p += elen;
10941 *p = '\0';
3f7c398e 10942 SvCUR_set(sv, p - SvPVX_const(sv));
58e33a90 10943 svix = osvix;
fb73857a 10944 continue; /* not "break" */
46fc3d4c 10945 }
10946
cc61b222
TS
10947 if (is_utf8 != has_utf8) {
10948 if (is_utf8) {
10949 if (SvCUR(sv))
10950 sv_utf8_upgrade(sv);
10951 }
10952 else {
10953 const STRLEN old_elen = elen;
59cd0e26 10954 SV * const nsv = newSVpvn_flags(eptr, elen, SVs_TEMP);
cc61b222
TS
10955 sv_utf8_upgrade(nsv);
10956 eptr = SvPVX_const(nsv);
10957 elen = SvCUR(nsv);
10958
10959 if (width) { /* fudge width (can't fudge elen) */
10960 width += elen - old_elen;
10961 }
10962 is_utf8 = TRUE;
10963 }
10964 }
10965
6c94ec8b 10966 have = esignlen + zeros + elen;
ed2b91d2 10967 if (have < zeros)
f1f66076 10968 Perl_croak_nocontext("%s", PL_memory_wrap);
6c94ec8b 10969
46fc3d4c 10970 need = (have > width ? have : width);
10971 gap = need - have;
10972
d2641cbd 10973 if (need >= (((STRLEN)~0) - SvCUR(sv) - dotstrlen - 1))
f1f66076 10974 Perl_croak_nocontext("%s", PL_memory_wrap);
b22c7a20 10975 SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
46fc3d4c 10976 p = SvEND(sv);
10977 if (esignlen && fill == '0') {
53c1dcc0 10978 int i;
eb160463 10979 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 10980 *p++ = esignbuf[i];
10981 }
10982 if (gap && !left) {
10983 memset(p, fill, gap);
10984 p += gap;
10985 }
10986 if (esignlen && fill != '0') {
53c1dcc0 10987 int i;
eb160463 10988 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 10989 *p++ = esignbuf[i];
10990 }
fc36a67e 10991 if (zeros) {
53c1dcc0 10992 int i;
fc36a67e 10993 for (i = zeros; i; i--)
10994 *p++ = '0';
10995 }
46fc3d4c 10996 if (elen) {
4459522c 10997 Copy(eptr, p, elen, char);
46fc3d4c 10998 p += elen;
10999 }
11000 if (gap && left) {
11001 memset(p, ' ', gap);
11002 p += gap;
11003 }
b22c7a20
GS
11004 if (vectorize) {
11005 if (veclen) {
4459522c 11006 Copy(dotstr, p, dotstrlen, char);
b22c7a20
GS
11007 p += dotstrlen;
11008 }
11009 else
11010 vectorize = FALSE; /* done iterating over vecstr */
11011 }
2cf2cfc6
A
11012 if (is_utf8)
11013 has_utf8 = TRUE;
11014 if (has_utf8)
7e2040f0 11015 SvUTF8_on(sv);
46fc3d4c 11016 *p = '\0';
3f7c398e 11017 SvCUR_set(sv, p - SvPVX_const(sv));
b22c7a20
GS
11018 if (vectorize) {
11019 esignlen = 0;
11020 goto vector;
11021 }
46fc3d4c 11022 }
3e6bd4bf 11023 SvTAINT(sv);
46fc3d4c 11024}
51371543 11025
645c22ef
DM
11026/* =========================================================================
11027
11028=head1 Cloning an interpreter
11029
11030All the macros and functions in this section are for the private use of
11031the main function, perl_clone().
11032
f2fc5c80 11033The foo_dup() functions make an exact copy of an existing foo thingy.
645c22ef
DM
11034During the course of a cloning, a hash table is used to map old addresses
11035to new addresses. The table is created and manipulated with the
11036ptr_table_* functions.
11037
11038=cut
11039
3e8320cc 11040 * =========================================================================*/
645c22ef
DM
11041
11042
1d7c1841
GS
11043#if defined(USE_ITHREADS)
11044
d4c19fe8 11045/* XXX Remove this so it doesn't have to go thru the macro and return for nothing */
1d7c1841
GS
11046#ifndef GpREFCNT_inc
11047# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
11048#endif
11049
11050
a41cc44e 11051/* Certain cases in Perl_ss_dup have been merged, by relying on the fact
3e07292d 11052 that currently av_dup, gv_dup and hv_dup are the same as sv_dup.
538f2e76
NC
11053 If this changes, please unmerge ss_dup.
11054 Likewise, sv_dup_inc_multiple() relies on this fact. */
a09252eb 11055#define sv_dup_inc_NN(s,t) SvREFCNT_inc_NN(sv_dup_inc(s,t))
502c6561 11056#define av_dup(s,t) MUTABLE_AV(sv_dup((const SV *)s,t))
a09252eb 11057#define av_dup_inc(s,t) MUTABLE_AV(sv_dup_inc((const SV *)s,t))
85fbaab2 11058#define hv_dup(s,t) MUTABLE_HV(sv_dup((const SV *)s,t))
a09252eb 11059#define hv_dup_inc(s,t) MUTABLE_HV(sv_dup_inc((const SV *)s,t))
daba3364 11060#define cv_dup(s,t) MUTABLE_CV(sv_dup((const SV *)s,t))
a09252eb 11061#define cv_dup_inc(s,t) MUTABLE_CV(sv_dup_inc((const SV *)s,t))
daba3364 11062#define io_dup(s,t) MUTABLE_IO(sv_dup((const SV *)s,t))
a09252eb 11063#define io_dup_inc(s,t) MUTABLE_IO(sv_dup_inc((const SV *)s,t))
159b6efe 11064#define gv_dup(s,t) MUTABLE_GV(sv_dup((const SV *)s,t))
a09252eb 11065#define gv_dup_inc(s,t) MUTABLE_GV(sv_dup_inc((const SV *)s,t))
6136c704
AL
11066#define SAVEPV(p) ((p) ? savepv(p) : NULL)
11067#define SAVEPVN(p,n) ((p) ? savepvn(p,n) : NULL)
8cf8f3d1 11068
199e78b7
DM
11069/* clone a parser */
11070
11071yy_parser *
66ceb532 11072Perl_parser_dup(pTHX_ const yy_parser *const proto, CLONE_PARAMS *const param)
199e78b7
DM
11073{
11074 yy_parser *parser;
11075
7918f24d
NC
11076 PERL_ARGS_ASSERT_PARSER_DUP;
11077
199e78b7
DM
11078 if (!proto)
11079 return NULL;
11080
7c197c94
DM
11081 /* look for it in the table first */
11082 parser = (yy_parser *)ptr_table_fetch(PL_ptr_table, proto);
11083 if (parser)
11084 return parser;
11085
11086 /* create anew and remember what it is */
199e78b7 11087 Newxz(parser, 1, yy_parser);
7c197c94 11088 ptr_table_store(PL_ptr_table, proto, parser);
199e78b7 11089
199e78b7
DM
11090 /* XXX these not yet duped */
11091 parser->old_parser = NULL;
11092 parser->stack = NULL;
11093 parser->ps = NULL;
11094 parser->stack_size = 0;
11095 /* XXX parser->stack->state = 0; */
11096
11097 /* XXX eventually, just Copy() most of the parser struct ? */
11098
11099 parser->lex_brackets = proto->lex_brackets;
11100 parser->lex_casemods = proto->lex_casemods;
11101 parser->lex_brackstack = savepvn(proto->lex_brackstack,
11102 (proto->lex_brackets < 120 ? 120 : proto->lex_brackets));
11103 parser->lex_casestack = savepvn(proto->lex_casestack,
11104 (proto->lex_casemods < 12 ? 12 : proto->lex_casemods));
11105 parser->lex_defer = proto->lex_defer;
11106 parser->lex_dojoin = proto->lex_dojoin;
11107 parser->lex_expect = proto->lex_expect;
11108 parser->lex_formbrack = proto->lex_formbrack;
11109 parser->lex_inpat = proto->lex_inpat;
11110 parser->lex_inwhat = proto->lex_inwhat;
11111 parser->lex_op = proto->lex_op;
11112 parser->lex_repl = sv_dup_inc(proto->lex_repl, param);
11113 parser->lex_starts = proto->lex_starts;
11114 parser->lex_stuff = sv_dup_inc(proto->lex_stuff, param);
11115 parser->multi_close = proto->multi_close;
11116 parser->multi_open = proto->multi_open;
11117 parser->multi_start = proto->multi_start;
670a9cb2 11118 parser->multi_end = proto->multi_end;
199e78b7
DM
11119 parser->pending_ident = proto->pending_ident;
11120 parser->preambled = proto->preambled;
11121 parser->sublex_info = proto->sublex_info; /* XXX not quite right */
bdc0bf6f 11122 parser->linestr = sv_dup_inc(proto->linestr, param);
53a7735b
DM
11123 parser->expect = proto->expect;
11124 parser->copline = proto->copline;
f06b5848 11125 parser->last_lop_op = proto->last_lop_op;
bc177e6b 11126 parser->lex_state = proto->lex_state;
2f9285f8 11127 parser->rsfp = fp_dup(proto->rsfp, '<', param);
5486870f
DM
11128 /* rsfp_filters entries have fake IoDIRP() */
11129 parser->rsfp_filters= av_dup_inc(proto->rsfp_filters, param);
12bd6ede
DM
11130 parser->in_my = proto->in_my;
11131 parser->in_my_stash = hv_dup(proto->in_my_stash, param);
13765c85 11132 parser->error_count = proto->error_count;
bc177e6b 11133
53a7735b 11134
f06b5848
DM
11135 parser->linestr = sv_dup_inc(proto->linestr, param);
11136
11137 {
1e05feb3
AL
11138 char * const ols = SvPVX(proto->linestr);
11139 char * const ls = SvPVX(parser->linestr);
f06b5848
DM
11140
11141 parser->bufptr = ls + (proto->bufptr >= ols ?
11142 proto->bufptr - ols : 0);
11143 parser->oldbufptr = ls + (proto->oldbufptr >= ols ?
11144 proto->oldbufptr - ols : 0);
11145 parser->oldoldbufptr= ls + (proto->oldoldbufptr >= ols ?
11146 proto->oldoldbufptr - ols : 0);
11147 parser->linestart = ls + (proto->linestart >= ols ?
11148 proto->linestart - ols : 0);
11149 parser->last_uni = ls + (proto->last_uni >= ols ?
11150 proto->last_uni - ols : 0);
11151 parser->last_lop = ls + (proto->last_lop >= ols ?
11152 proto->last_lop - ols : 0);
11153
11154 parser->bufend = ls + SvCUR(parser->linestr);
11155 }
199e78b7 11156
14047fc9
DM
11157 Copy(proto->tokenbuf, parser->tokenbuf, 256, char);
11158
2f9285f8 11159
199e78b7
DM
11160#ifdef PERL_MAD
11161 parser->endwhite = proto->endwhite;
11162 parser->faketokens = proto->faketokens;
11163 parser->lasttoke = proto->lasttoke;
11164 parser->nextwhite = proto->nextwhite;
11165 parser->realtokenstart = proto->realtokenstart;
11166 parser->skipwhite = proto->skipwhite;
11167 parser->thisclose = proto->thisclose;
11168 parser->thismad = proto->thismad;
11169 parser->thisopen = proto->thisopen;
11170 parser->thisstuff = proto->thisstuff;
11171 parser->thistoken = proto->thistoken;
11172 parser->thiswhite = proto->thiswhite;
fb205e7a
DM
11173
11174 Copy(proto->nexttoke, parser->nexttoke, 5, NEXTTOKE);
11175 parser->curforce = proto->curforce;
11176#else
11177 Copy(proto->nextval, parser->nextval, 5, YYSTYPE);
11178 Copy(proto->nexttype, parser->nexttype, 5, I32);
11179 parser->nexttoke = proto->nexttoke;
199e78b7 11180#endif
f0c5aa00
DM
11181
11182 /* XXX should clone saved_curcop here, but we aren't passed
11183 * proto_perl; so do it in perl_clone_using instead */
11184
199e78b7
DM
11185 return parser;
11186}
11187
d2d73c3e 11188
d2d73c3e 11189/* duplicate a file handle */
645c22ef 11190
1d7c1841 11191PerlIO *
3be3cdd6 11192Perl_fp_dup(pTHX_ PerlIO *const fp, const char type, CLONE_PARAMS *const param)
1d7c1841
GS
11193{
11194 PerlIO *ret;
53c1dcc0 11195
7918f24d 11196 PERL_ARGS_ASSERT_FP_DUP;
53c1dcc0 11197 PERL_UNUSED_ARG(type);
73d840c0 11198
1d7c1841
GS
11199 if (!fp)
11200 return (PerlIO*)NULL;
11201
11202 /* look for it in the table first */
11203 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
11204 if (ret)
11205 return ret;
11206
11207 /* create anew and remember what it is */
ecdeb87c 11208 ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
1d7c1841
GS
11209 ptr_table_store(PL_ptr_table, fp, ret);
11210 return ret;
11211}
11212
645c22ef
DM
11213/* duplicate a directory handle */
11214
1d7c1841 11215DIR *
60b22aca 11216Perl_dirp_dup(pTHX_ DIR *const dp, CLONE_PARAMS *const param)
1d7c1841 11217{
11a11ecf 11218 DIR *ret;
60b22aca
JD
11219
11220#ifdef HAS_FCHDIR
11a11ecf
FC
11221 DIR *pwd;
11222 register const Direntry_t *dirent;
11223 char smallbuf[256];
11224 char *name = NULL;
11225 STRLEN len = -1;
11226 long pos;
11227#endif
11228
96a5add6 11229 PERL_UNUSED_CONTEXT;
60b22aca 11230 PERL_ARGS_ASSERT_DIRP_DUP;
11a11ecf 11231
1d7c1841
GS
11232 if (!dp)
11233 return (DIR*)NULL;
60b22aca 11234
11a11ecf
FC
11235 /* look for it in the table first */
11236 ret = (DIR*)ptr_table_fetch(PL_ptr_table, dp);
11237 if (ret)
11238 return ret;
11239
60b22aca
JD
11240#ifdef HAS_FCHDIR
11241
11242 PERL_UNUSED_ARG(param);
11243
11a11ecf
FC
11244 /* create anew */
11245
11246 /* open the current directory (so we can switch back) */
11247 if (!(pwd = PerlDir_open("."))) return (DIR *)NULL;
11248
11249 /* chdir to our dir handle and open the present working directory */
11250 if (fchdir(my_dirfd(dp)) < 0 || !(ret = PerlDir_open("."))) {
11251 PerlDir_close(pwd);
11252 return (DIR *)NULL;
11253 }
11254 /* Now we should have two dir handles pointing to the same dir. */
11255
11256 /* Be nice to the calling code and chdir back to where we were. */
11257 fchdir(my_dirfd(pwd)); /* If this fails, then what? */
11258
11259 /* We have no need of the pwd handle any more. */
11260 PerlDir_close(pwd);
11261
11262#ifdef DIRNAMLEN
11263# define d_namlen(d) (d)->d_namlen
11264#else
11265# define d_namlen(d) strlen((d)->d_name)
11266#endif
11267 /* Iterate once through dp, to get the file name at the current posi-
11268 tion. Then step back. */
11269 pos = PerlDir_tell(dp);
11270 if ((dirent = PerlDir_read(dp))) {
11271 len = d_namlen(dirent);
11272 if (len <= sizeof smallbuf) name = smallbuf;
11273 else Newx(name, len, char);
11274 Move(dirent->d_name, name, len, char);
11275 }
11276 PerlDir_seek(dp, pos);
11277
11278 /* Iterate through the new dir handle, till we find a file with the
11279 right name. */
11280 if (!dirent) /* just before the end */
11281 for(;;) {
11282 pos = PerlDir_tell(ret);
11283 if (PerlDir_read(ret)) continue; /* not there yet */
11284 PerlDir_seek(ret, pos); /* step back */
11285 break;
11286 }
11287 else {
11288 const long pos0 = PerlDir_tell(ret);
11289 for(;;) {
11290 pos = PerlDir_tell(ret);
11291 if ((dirent = PerlDir_read(ret))) {
11292 if (len == d_namlen(dirent)
11293 && memEQ(name, dirent->d_name, len)) {
11294 /* found it */
11295 PerlDir_seek(ret, pos); /* step back */
11296 break;
11297 }
11298 /* else we are not there yet; keep iterating */
11299 }
11300 else { /* This is not meant to happen. The best we can do is
11301 reset the iterator to the beginning. */
11302 PerlDir_seek(ret, pos0);
11303 break;
11304 }
11305 }
11306 }
11307#undef d_namlen
11308
11309 if (name && name != smallbuf)
11310 Safefree(name);
60b22aca
JD
11311#endif
11312
11313#ifdef WIN32
11314 ret = win32_dirp_dup(dp, param);
11315#endif
11a11ecf
FC
11316
11317 /* pop it in the pointer table */
60b22aca
JD
11318 if (ret)
11319 ptr_table_store(PL_ptr_table, dp, ret);
11a11ecf
FC
11320
11321 return ret;
1d7c1841
GS
11322}
11323
ff276b08 11324/* duplicate a typeglob */
645c22ef 11325
1d7c1841 11326GP *
66ceb532 11327Perl_gp_dup(pTHX_ GP *const gp, CLONE_PARAMS *const param)
1d7c1841
GS
11328{
11329 GP *ret;
b37c2d43 11330
7918f24d
NC
11331 PERL_ARGS_ASSERT_GP_DUP;
11332
1d7c1841
GS
11333 if (!gp)
11334 return (GP*)NULL;
11335 /* look for it in the table first */
11336 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
11337 if (ret)
11338 return ret;
11339
11340 /* create anew and remember what it is */
a02a5408 11341 Newxz(ret, 1, GP);
1d7c1841
GS
11342 ptr_table_store(PL_ptr_table, gp, ret);
11343
11344 /* clone */
46d65037
NC
11345 /* ret->gp_refcnt must be 0 before any other dups are called. We're relying
11346 on Newxz() to do this for us. */
d2d73c3e
AB
11347 ret->gp_sv = sv_dup_inc(gp->gp_sv, param);
11348 ret->gp_io = io_dup_inc(gp->gp_io, param);
11349 ret->gp_form = cv_dup_inc(gp->gp_form, param);
11350 ret->gp_av = av_dup_inc(gp->gp_av, param);
11351 ret->gp_hv = hv_dup_inc(gp->gp_hv, param);
11352 ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
11353 ret->gp_cv = cv_dup_inc(gp->gp_cv, param);
1d7c1841 11354 ret->gp_cvgen = gp->gp_cvgen;
1d7c1841 11355 ret->gp_line = gp->gp_line;
566771cc 11356 ret->gp_file_hek = hek_dup(gp->gp_file_hek, param);
1d7c1841
GS
11357 return ret;
11358}
11359
645c22ef
DM
11360/* duplicate a chain of magic */
11361
1d7c1841 11362MAGIC *
b88ec9b8 11363Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS *const param)
1d7c1841 11364{
c160a186 11365 MAGIC *mgret = NULL;
0228edf6 11366 MAGIC **mgprev_p = &mgret;
7918f24d
NC
11367
11368 PERL_ARGS_ASSERT_MG_DUP;
11369
1d7c1841
GS
11370 for (; mg; mg = mg->mg_moremagic) {
11371 MAGIC *nmg;
803f2748
DM
11372
11373 if ((param->flags & CLONEf_JOIN_IN)
11374 && mg->mg_type == PERL_MAGIC_backref)
11375 /* when joining, we let the individual SVs add themselves to
11376 * backref as needed. */
11377 continue;
11378
45f7fcc8 11379 Newx(nmg, 1, MAGIC);
0228edf6
NC
11380 *mgprev_p = nmg;
11381 mgprev_p = &(nmg->mg_moremagic);
11382
45f7fcc8
NC
11383 /* There was a comment "XXX copy dynamic vtable?" but as we don't have
11384 dynamic vtables, I'm not sure why Sarathy wrote it. The comment dates
11385 from the original commit adding Perl_mg_dup() - revision 4538.
11386 Similarly there is the annotation "XXX random ptr?" next to the
11387 assignment to nmg->mg_ptr. */
11388 *nmg = *mg;
11389
288b8c02 11390 /* FIXME for plugins
45f7fcc8
NC
11391 if (nmg->mg_type == PERL_MAGIC_qr) {
11392 nmg->mg_obj = MUTABLE_SV(CALLREGDUPE((REGEXP*)nmg->mg_obj, param));
1d7c1841 11393 }
288b8c02
NC
11394 else
11395 */
5648c0ae
DM
11396 nmg->mg_obj = (nmg->mg_flags & MGf_REFCOUNTED)
11397 ? nmg->mg_type == PERL_MAGIC_backref
11398 /* The backref AV has its reference
11399 * count deliberately bumped by 1 */
11400 ? SvREFCNT_inc(av_dup_inc((const AV *)
11401 nmg->mg_obj, param))
11402 : sv_dup_inc(nmg->mg_obj, param)
11403 : sv_dup(nmg->mg_obj, param);
45f7fcc8
NC
11404
11405 if (nmg->mg_ptr && nmg->mg_type != PERL_MAGIC_regex_global) {
11406 if (nmg->mg_len > 0) {
11407 nmg->mg_ptr = SAVEPVN(nmg->mg_ptr, nmg->mg_len);
11408 if (nmg->mg_type == PERL_MAGIC_overload_table &&
11409 AMT_AMAGIC((AMT*)nmg->mg_ptr))
14befaf4 11410 {
0bcc34c2 11411 AMT * const namtp = (AMT*)nmg->mg_ptr;
538f2e76
NC
11412 sv_dup_inc_multiple((SV**)(namtp->table),
11413 (SV**)(namtp->table), NofAMmeth, param);
1d7c1841
GS
11414 }
11415 }
45f7fcc8
NC
11416 else if (nmg->mg_len == HEf_SVKEY)
11417 nmg->mg_ptr = (char*)sv_dup_inc((const SV *)nmg->mg_ptr, param);
1d7c1841 11418 }
45f7fcc8 11419 if ((nmg->mg_flags & MGf_DUP) && nmg->mg_virtual && nmg->mg_virtual->svt_dup) {
16c91539 11420 nmg->mg_virtual->svt_dup(aTHX_ nmg, param);
68795e93 11421 }
1d7c1841
GS
11422 }
11423 return mgret;
11424}
11425
4674ade5
NC
11426#endif /* USE_ITHREADS */
11427
db93c0c4
NC
11428struct ptr_tbl_arena {
11429 struct ptr_tbl_arena *next;
11430 struct ptr_tbl_ent array[1023/3]; /* as ptr_tbl_ent has 3 pointers. */
11431};
11432
645c22ef
DM
11433/* create a new pointer-mapping table */
11434
1d7c1841
GS
11435PTR_TBL_t *
11436Perl_ptr_table_new(pTHX)
11437{
11438 PTR_TBL_t *tbl;
96a5add6
AL
11439 PERL_UNUSED_CONTEXT;
11440
b3a120bf 11441 Newx(tbl, 1, PTR_TBL_t);
1d7c1841
GS
11442 tbl->tbl_max = 511;
11443 tbl->tbl_items = 0;
db93c0c4
NC
11444 tbl->tbl_arena = NULL;
11445 tbl->tbl_arena_next = NULL;
11446 tbl->tbl_arena_end = NULL;
a02a5408 11447 Newxz(tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
1d7c1841
GS
11448 return tbl;
11449}
11450
7119fd33
NC
11451#define PTR_TABLE_HASH(ptr) \
11452 ((PTR2UV(ptr) >> 3) ^ (PTR2UV(ptr) >> (3 + 7)) ^ (PTR2UV(ptr) >> (3 + 17)))
134ca3d6 11453
645c22ef
DM
11454/* map an existing pointer using a table */
11455
7bf61b54 11456STATIC PTR_TBL_ENT_t *
1eb6e4ca 11457S_ptr_table_find(PTR_TBL_t *const tbl, const void *const sv)
7918f24d 11458{
1d7c1841 11459 PTR_TBL_ENT_t *tblent;
4373e329 11460 const UV hash = PTR_TABLE_HASH(sv);
7918f24d
NC
11461
11462 PERL_ARGS_ASSERT_PTR_TABLE_FIND;
11463
1d7c1841
GS
11464 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
11465 for (; tblent; tblent = tblent->next) {
11466 if (tblent->oldval == sv)
7bf61b54 11467 return tblent;
1d7c1841 11468 }
d4c19fe8 11469 return NULL;
7bf61b54
NC
11470}
11471
11472void *
1eb6e4ca 11473Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *const tbl, const void *const sv)
7bf61b54 11474{
b0e6ae5b 11475 PTR_TBL_ENT_t const *const tblent = ptr_table_find(tbl, sv);
7918f24d
NC
11476
11477 PERL_ARGS_ASSERT_PTR_TABLE_FETCH;
96a5add6 11478 PERL_UNUSED_CONTEXT;
7918f24d 11479
d4c19fe8 11480 return tblent ? tblent->newval : NULL;
1d7c1841
GS
11481}
11482
645c22ef
DM
11483/* add a new entry to a pointer-mapping table */
11484
1d7c1841 11485void
1eb6e4ca 11486Perl_ptr_table_store(pTHX_ PTR_TBL_t *const tbl, const void *const oldsv, void *const newsv)
1d7c1841 11487{
0c9fdfe0 11488 PTR_TBL_ENT_t *tblent = ptr_table_find(tbl, oldsv);
7918f24d
NC
11489
11490 PERL_ARGS_ASSERT_PTR_TABLE_STORE;
96a5add6 11491 PERL_UNUSED_CONTEXT;
1d7c1841 11492
7bf61b54
NC
11493 if (tblent) {
11494 tblent->newval = newsv;
11495 } else {
11496 const UV entry = PTR_TABLE_HASH(oldsv) & tbl->tbl_max;
11497
db93c0c4
NC
11498 if (tbl->tbl_arena_next == tbl->tbl_arena_end) {
11499 struct ptr_tbl_arena *new_arena;
11500
11501 Newx(new_arena, 1, struct ptr_tbl_arena);
11502 new_arena->next = tbl->tbl_arena;
11503 tbl->tbl_arena = new_arena;
11504 tbl->tbl_arena_next = new_arena->array;
11505 tbl->tbl_arena_end = new_arena->array
11506 + sizeof(new_arena->array) / sizeof(new_arena->array[0]);
11507 }
11508
11509 tblent = tbl->tbl_arena_next++;
d2a0f284 11510
7bf61b54
NC
11511 tblent->oldval = oldsv;
11512 tblent->newval = newsv;
11513 tblent->next = tbl->tbl_ary[entry];
11514 tbl->tbl_ary[entry] = tblent;
11515 tbl->tbl_items++;
11516 if (tblent->next && tbl->tbl_items > tbl->tbl_max)
11517 ptr_table_split(tbl);
1d7c1841 11518 }
1d7c1841
GS
11519}
11520
645c22ef
DM
11521/* double the hash bucket size of an existing ptr table */
11522
1d7c1841 11523void
1eb6e4ca 11524Perl_ptr_table_split(pTHX_ PTR_TBL_t *const tbl)
1d7c1841
GS
11525{
11526 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
4373e329 11527 const UV oldsize = tbl->tbl_max + 1;
1d7c1841
GS
11528 UV newsize = oldsize * 2;
11529 UV i;
7918f24d
NC
11530
11531 PERL_ARGS_ASSERT_PTR_TABLE_SPLIT;
96a5add6 11532 PERL_UNUSED_CONTEXT;
1d7c1841
GS
11533
11534 Renew(ary, newsize, PTR_TBL_ENT_t*);
11535 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
11536 tbl->tbl_max = --newsize;
11537 tbl->tbl_ary = ary;
11538 for (i=0; i < oldsize; i++, ary++) {
4c9d89c5
NC
11539 PTR_TBL_ENT_t **entp = ary;
11540 PTR_TBL_ENT_t *ent = *ary;
11541 PTR_TBL_ENT_t **curentp;
11542 if (!ent)
1d7c1841
GS
11543 continue;
11544 curentp = ary + oldsize;
4c9d89c5 11545 do {
134ca3d6 11546 if ((newsize & PTR_TABLE_HASH(ent->oldval)) != i) {
1d7c1841
GS
11547 *entp = ent->next;
11548 ent->next = *curentp;
11549 *curentp = ent;
1d7c1841
GS
11550 }
11551 else
11552 entp = &ent->next;
4c9d89c5
NC
11553 ent = *entp;
11554 } while (ent);
1d7c1841
GS
11555 }
11556}
11557
645c22ef 11558/* remove all the entries from a ptr table */
5c5ade3e 11559/* Deprecated - will be removed post 5.14 */
645c22ef 11560
a0739874 11561void
1eb6e4ca 11562Perl_ptr_table_clear(pTHX_ PTR_TBL_t *const tbl)
a0739874 11563{
d5cefff9 11564 if (tbl && tbl->tbl_items) {
db93c0c4 11565 struct ptr_tbl_arena *arena = tbl->tbl_arena;
a0739874 11566
db93c0c4 11567 Zero(tbl->tbl_ary, tbl->tbl_max + 1, struct ptr_tbl_ent **);
ab1e7f95 11568
db93c0c4
NC
11569 while (arena) {
11570 struct ptr_tbl_arena *next = arena->next;
11571
11572 Safefree(arena);
11573 arena = next;
11574 };
a0739874 11575
d5cefff9 11576 tbl->tbl_items = 0;
db93c0c4
NC
11577 tbl->tbl_arena = NULL;
11578 tbl->tbl_arena_next = NULL;
11579 tbl->tbl_arena_end = NULL;
d5cefff9 11580 }
a0739874
DM
11581}
11582
645c22ef
DM
11583/* clear and free a ptr table */
11584
a0739874 11585void
1eb6e4ca 11586Perl_ptr_table_free(pTHX_ PTR_TBL_t *const tbl)
a0739874 11587{
5c5ade3e
NC
11588 struct ptr_tbl_arena *arena;
11589
a0739874
DM
11590 if (!tbl) {
11591 return;
11592 }
5c5ade3e
NC
11593
11594 arena = tbl->tbl_arena;
11595
11596 while (arena) {
11597 struct ptr_tbl_arena *next = arena->next;
11598
11599 Safefree(arena);
11600 arena = next;
11601 }
11602
a0739874
DM
11603 Safefree(tbl->tbl_ary);
11604 Safefree(tbl);
11605}
11606
4674ade5 11607#if defined(USE_ITHREADS)
5bd07a3d 11608
83841fad 11609void
1eb6e4ca 11610Perl_rvpv_dup(pTHX_ SV *const dstr, const SV *const sstr, CLONE_PARAMS *const param)
83841fad 11611{
7918f24d
NC
11612 PERL_ARGS_ASSERT_RVPV_DUP;
11613
83841fad 11614 if (SvROK(sstr)) {
803f2748
DM
11615 if (SvWEAKREF(sstr)) {
11616 SvRV_set(dstr, sv_dup(SvRV_const(sstr), param));
11617 if (param->flags & CLONEf_JOIN_IN) {
11618 /* if joining, we add any back references individually rather
11619 * than copying the whole backref array */
11620 Perl_sv_add_backref(aTHX_ SvRV(dstr), dstr);
11621 }
11622 }
11623 else
11624 SvRV_set(dstr, sv_dup_inc(SvRV_const(sstr), param));
83841fad 11625 }
3f7c398e 11626 else if (SvPVX_const(sstr)) {
83841fad
NIS
11627 /* Has something there */
11628 if (SvLEN(sstr)) {
68795e93 11629 /* Normal PV - clone whole allocated space */
3f7c398e 11630 SvPV_set(dstr, SAVEPVN(SvPVX_const(sstr), SvLEN(sstr)-1));
d3d0e6f1
NC
11631 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
11632 /* Not that normal - actually sstr is copy on write.
486ec47a 11633 But we are a true, independent SV, so: */
d3d0e6f1
NC
11634 SvREADONLY_off(dstr);
11635 SvFAKE_off(dstr);
11636 }
68795e93 11637 }
83841fad
NIS
11638 else {
11639 /* Special case - not normally malloced for some reason */
f7877b28
NC
11640 if (isGV_with_GP(sstr)) {
11641 /* Don't need to do anything here. */
11642 }
11643 else if ((SvREADONLY(sstr) && SvFAKE(sstr))) {
ef10be65
NC
11644 /* A "shared" PV - clone it as "shared" PV */
11645 SvPV_set(dstr,
11646 HEK_KEY(hek_dup(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)),
11647 param)));
83841fad
NIS
11648 }
11649 else {
11650 /* Some other special case - random pointer */
d2c6dc5e 11651 SvPV_set(dstr, (char *) SvPVX_const(sstr));
d3d0e6f1 11652 }
83841fad
NIS
11653 }
11654 }
11655 else {
4608196e 11656 /* Copy the NULL */
4df7f6af 11657 SvPV_set(dstr, NULL);
83841fad
NIS
11658 }
11659}
11660
538f2e76
NC
11661/* duplicate a list of SVs. source and dest may point to the same memory. */
11662static SV **
11663S_sv_dup_inc_multiple(pTHX_ SV *const *source, SV **dest,
11664 SSize_t items, CLONE_PARAMS *const param)
11665{
11666 PERL_ARGS_ASSERT_SV_DUP_INC_MULTIPLE;
11667
11668 while (items-- > 0) {
11669 *dest++ = sv_dup_inc(*source++, param);
11670 }
11671
11672 return dest;
11673}
11674
662fb8b2
NC
11675/* duplicate an SV of any type (including AV, HV etc) */
11676
d08d57ef
NC
11677static SV *
11678S_sv_dup_common(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
1d7c1841 11679{
27da23d5 11680 dVAR;
1d7c1841
GS
11681 SV *dstr;
11682
d08d57ef 11683 PERL_ARGS_ASSERT_SV_DUP_COMMON;
7918f24d 11684
bfd95973
NC
11685 if (SvTYPE(sstr) == SVTYPEMASK) {
11686#ifdef DEBUG_LEAKING_SCALARS_ABORT
11687 abort();
11688#endif
6136c704 11689 return NULL;
bfd95973 11690 }
1d7c1841 11691 /* look for it in the table first */
daba3364 11692 dstr = MUTABLE_SV(ptr_table_fetch(PL_ptr_table, sstr));
1d7c1841
GS
11693 if (dstr)
11694 return dstr;
11695
0405e91e
AB
11696 if(param->flags & CLONEf_JOIN_IN) {
11697 /** We are joining here so we don't want do clone
11698 something that is bad **/
eb86f8b3 11699 if (SvTYPE(sstr) == SVt_PVHV) {
9bde8eb0 11700 const HEK * const hvname = HvNAME_HEK(sstr);
96bafef9 11701 if (hvname) {
eb86f8b3 11702 /** don't clone stashes if they already exist **/
96bafef9
DM
11703 dstr = MUTABLE_SV(gv_stashpvn(HEK_KEY(hvname), HEK_LEN(hvname), 0));
11704 ptr_table_store(PL_ptr_table, sstr, dstr);
11705 return dstr;
11706 }
0405e91e
AB
11707 }
11708 }
11709
1d7c1841
GS
11710 /* create anew and remember what it is */
11711 new_SV(dstr);
fd0854ff
DM
11712
11713#ifdef DEBUG_LEAKING_SCALARS
11714 dstr->sv_debug_optype = sstr->sv_debug_optype;
11715 dstr->sv_debug_line = sstr->sv_debug_line;
11716 dstr->sv_debug_inpad = sstr->sv_debug_inpad;
cd676548 11717 dstr->sv_debug_parent = (SV*)sstr;
de61950a 11718 FREE_SV_DEBUG_FILE(dstr);
fd0854ff 11719 dstr->sv_debug_file = savepv(sstr->sv_debug_file);
fd0854ff
DM
11720#endif
11721
1d7c1841
GS
11722 ptr_table_store(PL_ptr_table, sstr, dstr);
11723
11724 /* clone */
11725 SvFLAGS(dstr) = SvFLAGS(sstr);
11726 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
11727 SvREFCNT(dstr) = 0; /* must be before any other dups! */
11728
11729#ifdef DEBUGGING
3f7c398e 11730 if (SvANY(sstr) && PL_watch_pvx && SvPVX_const(sstr) == PL_watch_pvx)
1d7c1841 11731 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
6c9570dc 11732 (void*)PL_watch_pvx, SvPVX_const(sstr));
1d7c1841
GS
11733#endif
11734
9660f481
DM
11735 /* don't clone objects whose class has asked us not to */
11736 if (SvOBJECT(sstr) && ! (SvFLAGS(SvSTASH(sstr)) & SVphv_CLONEABLE)) {
33de8e4a 11737 SvFLAGS(dstr) = 0;
9660f481
DM
11738 return dstr;
11739 }
11740
1d7c1841
GS
11741 switch (SvTYPE(sstr)) {
11742 case SVt_NULL:
11743 SvANY(dstr) = NULL;
11744 break;
11745 case SVt_IV:
339049b0 11746 SvANY(dstr) = (XPVIV*)((char*)&(dstr->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
4df7f6af
NC
11747 if(SvROK(sstr)) {
11748 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
11749 } else {
11750 SvIV_set(dstr, SvIVX(sstr));
11751 }
1d7c1841
GS
11752 break;
11753 case SVt_NV:
11754 SvANY(dstr) = new_XNV();
9d6ce603 11755 SvNV_set(dstr, SvNVX(sstr));
1d7c1841 11756 break;
cecf5685 11757 /* case SVt_BIND: */
662fb8b2
NC
11758 default:
11759 {
11760 /* These are all the types that need complex bodies allocating. */
662fb8b2 11761 void *new_body;
2bcc16b3
NC
11762 const svtype sv_type = SvTYPE(sstr);
11763 const struct body_details *const sv_type_details
11764 = bodies_by_type + sv_type;
662fb8b2 11765
93e68bfb 11766 switch (sv_type) {
662fb8b2 11767 default:
bb263b4e 11768 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
662fb8b2
NC
11769 break;
11770
662fb8b2 11771 case SVt_PVGV:
c22188b4
NC
11772 case SVt_PVIO:
11773 case SVt_PVFM:
11774 case SVt_PVHV:
11775 case SVt_PVAV:
662fb8b2 11776 case SVt_PVCV:
662fb8b2 11777 case SVt_PVLV:
5c35adbb 11778 case SVt_REGEXP:
662fb8b2 11779 case SVt_PVMG:
662fb8b2 11780 case SVt_PVNV:
662fb8b2 11781 case SVt_PVIV:
662fb8b2 11782 case SVt_PV:
d2a0f284 11783 assert(sv_type_details->body_size);
c22188b4 11784 if (sv_type_details->arena) {
d2a0f284 11785 new_body_inline(new_body, sv_type);
c22188b4 11786 new_body
b9502f15 11787 = (void*)((char*)new_body - sv_type_details->offset);
c22188b4
NC
11788 } else {
11789 new_body = new_NOARENA(sv_type_details);
11790 }
1d7c1841 11791 }
662fb8b2
NC
11792 assert(new_body);
11793 SvANY(dstr) = new_body;
11794
2bcc16b3 11795#ifndef PURIFY
b9502f15
NC
11796 Copy(((char*)SvANY(sstr)) + sv_type_details->offset,
11797 ((char*)SvANY(dstr)) + sv_type_details->offset,
f32993d6 11798 sv_type_details->copy, char);
2bcc16b3
NC
11799#else
11800 Copy(((char*)SvANY(sstr)),
11801 ((char*)SvANY(dstr)),
d2a0f284 11802 sv_type_details->body_size + sv_type_details->offset, char);
2bcc16b3 11803#endif
662fb8b2 11804
f7877b28 11805 if (sv_type != SVt_PVAV && sv_type != SVt_PVHV
5bb89d25
NC
11806 && !isGV_with_GP(dstr)
11807 && !(sv_type == SVt_PVIO && !(IoFLAGS(dstr) & IOf_FAKE_DIRP)))
662fb8b2
NC
11808 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
11809
11810 /* The Copy above means that all the source (unduplicated) pointers
11811 are now in the destination. We can check the flags and the
11812 pointers in either, but it's possible that there's less cache
11813 missing by always going for the destination.
11814 FIXME - instrument and check that assumption */
f32993d6 11815 if (sv_type >= SVt_PVMG) {
885ffcb3 11816 if ((sv_type == SVt_PVMG) && SvPAD_OUR(dstr)) {
73d95100 11817 SvOURSTASH_set(dstr, hv_dup_inc(SvOURSTASH(dstr), param));
e736a858 11818 } else if (SvMAGIC(dstr))
662fb8b2
NC
11819 SvMAGIC_set(dstr, mg_dup(SvMAGIC(dstr), param));
11820 if (SvSTASH(dstr))
11821 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(dstr), param));
1d7c1841 11822 }
662fb8b2 11823
f32993d6
NC
11824 /* The cast silences a GCC warning about unhandled types. */
11825 switch ((int)sv_type) {
662fb8b2
NC
11826 case SVt_PV:
11827 break;
11828 case SVt_PVIV:
11829 break;
11830 case SVt_PVNV:
11831 break;
11832 case SVt_PVMG:
11833 break;
5c35adbb 11834 case SVt_REGEXP:
288b8c02 11835 /* FIXME for plugins */
d2f13c59 11836 re_dup_guts((REGEXP*) sstr, (REGEXP*) dstr, param);
f708cfc1 11837 break;
662fb8b2
NC
11838 case SVt_PVLV:
11839 /* XXX LvTARGOFF sometimes holds PMOP* when DEBUGGING */
11840 if (LvTYPE(dstr) == 't') /* for tie: unrefcnted fake (SV**) */
11841 LvTARG(dstr) = dstr;
11842 else if (LvTYPE(dstr) == 'T') /* for tie: fake HE */
daba3364 11843 LvTARG(dstr) = MUTABLE_SV(he_dup((HE*)LvTARG(dstr), 0, param));
662fb8b2
NC
11844 else
11845 LvTARG(dstr) = sv_dup_inc(LvTARG(dstr), param);
662fb8b2 11846 case SVt_PVGV:
61e14cb4 11847 /* non-GP case already handled above */
cecf5685 11848 if(isGV_with_GP(sstr)) {
566771cc 11849 GvNAME_HEK(dstr) = hek_dup(GvNAME_HEK(dstr), param);
39cb70dc
NC
11850 /* Don't call sv_add_backref here as it's going to be
11851 created as part of the magic cloning of the symbol
27bca322
FC
11852 table--unless this is during a join and the stash
11853 is not actually being cloned. */
f7877b28
NC
11854 /* Danger Will Robinson - GvGP(dstr) isn't initialised
11855 at the point of this comment. */
39cb70dc 11856 GvSTASH(dstr) = hv_dup(GvSTASH(dstr), param);
ab95db60
DM
11857 if (param->flags & CLONEf_JOIN_IN)
11858 Perl_sv_add_backref(aTHX_ MUTABLE_SV(GvSTASH(dstr)), dstr);
c43ae56f 11859 GvGP_set(dstr, gp_dup(GvGP(sstr), param));
f7877b28 11860 (void)GpREFCNT_inc(GvGP(dstr));
61e14cb4 11861 }
662fb8b2
NC
11862 break;
11863 case SVt_PVIO:
5486870f 11864 /* PL_parser->rsfp_filters entries have fake IoDIRP() */
662fb8b2
NC
11865 if(IoFLAGS(dstr) & IOf_FAKE_DIRP) {
11866 /* I have no idea why fake dirp (rsfps)
11867 should be treated differently but otherwise
11868 we end up with leaks -- sky*/
11869 IoTOP_GV(dstr) = gv_dup_inc(IoTOP_GV(dstr), param);
11870 IoFMT_GV(dstr) = gv_dup_inc(IoFMT_GV(dstr), param);
11871 IoBOTTOM_GV(dstr) = gv_dup_inc(IoBOTTOM_GV(dstr), param);
11872 } else {
11873 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(dstr), param);
11874 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(dstr), param);
11875 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(dstr), param);
100ce7e1 11876 if (IoDIRP(dstr)) {
60b22aca 11877 IoDIRP(dstr) = dirp_dup(IoDIRP(dstr), param);
100ce7e1 11878 } else {
6f207bd3 11879 NOOP;
100ce7e1
NC
11880 /* IoDIRP(dstr) is already a copy of IoDIRP(sstr) */
11881 }
6f7e8353 11882 IoIFP(dstr) = fp_dup(IoIFP(sstr), IoTYPE(dstr), param);
662fb8b2 11883 }
6f7e8353
NC
11884 if (IoOFP(dstr) == IoIFP(sstr))
11885 IoOFP(dstr) = IoIFP(dstr);
11886 else
11887 IoOFP(dstr) = fp_dup(IoOFP(dstr), IoTYPE(dstr), param);
662fb8b2
NC
11888 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(dstr));
11889 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(dstr));
11890 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(dstr));
11891 break;
11892 case SVt_PVAV:
2779b694
KB
11893 /* avoid cloning an empty array */
11894 if (AvARRAY((const AV *)sstr) && AvFILLp((const AV *)sstr) >= 0) {
662fb8b2 11895 SV **dst_ary, **src_ary;
502c6561 11896 SSize_t items = AvFILLp((const AV *)sstr) + 1;
662fb8b2 11897
502c6561
NC
11898 src_ary = AvARRAY((const AV *)sstr);
11899 Newxz(dst_ary, AvMAX((const AV *)sstr)+1, SV*);
662fb8b2 11900 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
502c6561
NC
11901 AvARRAY(MUTABLE_AV(dstr)) = dst_ary;
11902 AvALLOC((const AV *)dstr) = dst_ary;
11903 if (AvREAL((const AV *)sstr)) {
538f2e76
NC
11904 dst_ary = sv_dup_inc_multiple(src_ary, dst_ary, items,
11905 param);
662fb8b2
NC
11906 }
11907 else {
11908 while (items-- > 0)
11909 *dst_ary++ = sv_dup(*src_ary++, param);
11910 }
502c6561 11911 items = AvMAX((const AV *)sstr) - AvFILLp((const AV *)sstr);
662fb8b2
NC
11912 while (items-- > 0) {
11913 *dst_ary++ = &PL_sv_undef;
11914 }
bfcb3514 11915 }
662fb8b2 11916 else {
502c6561
NC
11917 AvARRAY(MUTABLE_AV(dstr)) = NULL;
11918 AvALLOC((const AV *)dstr) = (SV**)NULL;
2779b694
KB
11919 AvMAX( (const AV *)dstr) = -1;
11920 AvFILLp((const AV *)dstr) = -1;
b79f7545 11921 }
662fb8b2
NC
11922 break;
11923 case SVt_PVHV:
1d193675 11924 if (HvARRAY((const HV *)sstr)) {
7e265ef3
AL
11925 STRLEN i = 0;
11926 const bool sharekeys = !!HvSHAREKEYS(sstr);
11927 XPVHV * const dxhv = (XPVHV*)SvANY(dstr);
11928 XPVHV * const sxhv = (XPVHV*)SvANY(sstr);
11929 char *darray;
11930 Newx(darray, PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1)
11931 + (SvOOK(sstr) ? sizeof(struct xpvhv_aux) : 0),
11932 char);
11933 HvARRAY(dstr) = (HE**)darray;
11934 while (i <= sxhv->xhv_max) {
11935 const HE * const source = HvARRAY(sstr)[i];
11936 HvARRAY(dstr)[i] = source
11937 ? he_dup(source, sharekeys, param) : 0;
11938 ++i;
11939 }
11940 if (SvOOK(sstr)) {
7e265ef3
AL
11941 const struct xpvhv_aux * const saux = HvAUX(sstr);
11942 struct xpvhv_aux * const daux = HvAUX(dstr);
11943 /* This flag isn't copied. */
11944 /* SvOOK_on(hv) attacks the IV flags. */
11945 SvFLAGS(dstr) |= SVf_OOK;
11946
b7247a80 11947 if (saux->xhv_name_count) {
36b0d498 11948 HEK ** const sname = saux->xhv_name_u.xhvnameu_names;
78b79c77
FC
11949 const I32 count
11950 = saux->xhv_name_count < 0
11951 ? -saux->xhv_name_count
11952 : saux->xhv_name_count;
b7247a80
FC
11953 HEK **shekp = sname + count;
11954 HEK **dhekp;
15d9236d
NC
11955 Newx(daux->xhv_name_u.xhvnameu_names, count, HEK *);
11956 dhekp = daux->xhv_name_u.xhvnameu_names + count;
b7247a80
FC
11957 while (shekp-- > sname) {
11958 dhekp--;
11959 *dhekp = hek_dup(*shekp, param);
11960 }
11961 }
15d9236d
NC
11962 else {
11963 daux->xhv_name_u.xhvnameu_name
11964 = hek_dup(saux->xhv_name_u.xhvnameu_name,
11965 param);
11966 }
b7247a80 11967 daux->xhv_name_count = saux->xhv_name_count;
7e265ef3
AL
11968
11969 daux->xhv_riter = saux->xhv_riter;
11970 daux->xhv_eiter = saux->xhv_eiter
11971 ? he_dup(saux->xhv_eiter,
f2338a2e 11972 cBOOL(HvSHAREKEYS(sstr)), param) : 0;
b17f5ab7 11973 /* backref array needs refcnt=2; see sv_add_backref */
7e265ef3 11974 daux->xhv_backreferences =
ab95db60
DM
11975 (param->flags & CLONEf_JOIN_IN)
11976 /* when joining, we let the individual GVs and
11977 * CVs add themselves to backref as
11978 * needed. This avoids pulling in stuff
11979 * that isn't required, and simplifies the
11980 * case where stashes aren't cloned back
11981 * if they already exist in the parent
11982 * thread */
11983 ? NULL
11984 : saux->xhv_backreferences
5648c0ae
DM
11985 ? (SvTYPE(saux->xhv_backreferences) == SVt_PVAV)
11986 ? MUTABLE_AV(SvREFCNT_inc(
11987 sv_dup_inc((const SV *)
11988 saux->xhv_backreferences, param)))
11989 : MUTABLE_AV(sv_dup((const SV *)
11990 saux->xhv_backreferences, param))
86f55936 11991 : 0;
e1a479c5
BB
11992
11993 daux->xhv_mro_meta = saux->xhv_mro_meta
11994 ? mro_meta_dup(saux->xhv_mro_meta, param)
11995 : 0;
11996
7e265ef3 11997 /* Record stashes for possible cloning in Perl_clone(). */
605aedcc 11998 if (HvNAME(sstr))
7e265ef3 11999 av_push(param->stashes, dstr);
662fb8b2 12000 }
662fb8b2 12001 }
7e265ef3 12002 else
85fbaab2 12003 HvARRAY(MUTABLE_HV(dstr)) = NULL;
662fb8b2 12004 break;
662fb8b2 12005 case SVt_PVCV:
bb172083
NC
12006 if (!(param->flags & CLONEf_COPY_STACKS)) {
12007 CvDEPTH(dstr) = 0;
12008 }
4c74a7df 12009 /*FALLTHROUGH*/
bb172083 12010 case SVt_PVFM:
662fb8b2 12011 /* NOTE: not refcounted */
c68d9564
Z
12012 SvANY(MUTABLE_CV(dstr))->xcv_stash =
12013 hv_dup(CvSTASH(dstr), param);
ab95db60
DM
12014 if ((param->flags & CLONEf_JOIN_IN) && CvSTASH(dstr))
12015 Perl_sv_add_backref(aTHX_ MUTABLE_SV(CvSTASH(dstr)), dstr);
f352ce09
NC
12016 if (!CvISXSUB(dstr)) {
12017 OP_REFCNT_LOCK;
d04ba589 12018 CvROOT(dstr) = OpREFCNT_inc(CvROOT(dstr));
f352ce09
NC
12019 OP_REFCNT_UNLOCK;
12020 CvFILE(dstr) = SAVEPV(CvFILE(dstr));
12021 } else if (CvCONST(dstr)) {
d32faaf3 12022 CvXSUBANY(dstr).any_ptr =
daba3364 12023 sv_dup_inc((const SV *)CvXSUBANY(dstr).any_ptr, param);
662fb8b2
NC
12024 }
12025 /* don't dup if copying back - CvGV isn't refcounted, so the
12026 * duped GV may never be freed. A bit of a hack! DAPM */
b3f91e91 12027 SvANY(MUTABLE_CV(dstr))->xcv_gv =
cfc1e951 12028 CvCVGV_RC(dstr)
803f2748
DM
12029 ? gv_dup_inc(CvGV(sstr), param)
12030 : (param->flags & CLONEf_JOIN_IN)
12031 ? NULL
12032 : gv_dup(CvGV(sstr), param);
12033
d5b1589c 12034 CvPADLIST(dstr) = padlist_dup(CvPADLIST(sstr), param);
662fb8b2
NC
12035 CvOUTSIDE(dstr) =
12036 CvWEAKOUTSIDE(sstr)
12037 ? cv_dup( CvOUTSIDE(dstr), param)
12038 : cv_dup_inc(CvOUTSIDE(dstr), param);
662fb8b2 12039 break;
bfcb3514 12040 }
1d7c1841 12041 }
1d7c1841
GS
12042 }
12043
12044 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
12045 ++PL_sv_objcount;
12046
12047 return dstr;
d2d73c3e 12048 }
1d7c1841 12049
a09252eb
NC
12050SV *
12051Perl_sv_dup_inc(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
12052{
12053 PERL_ARGS_ASSERT_SV_DUP_INC;
d08d57ef
NC
12054 return sstr ? SvREFCNT_inc(sv_dup_common(sstr, param)) : NULL;
12055}
12056
12057SV *
12058Perl_sv_dup(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
12059{
12060 SV *dstr = sstr ? sv_dup_common(sstr, param) : NULL;
12061 PERL_ARGS_ASSERT_SV_DUP;
12062
04518cc3
NC
12063 /* Track every SV that (at least initially) had a reference count of 0.
12064 We need to do this by holding an actual reference to it in this array.
12065 If we attempt to cheat, turn AvREAL_off(), and store only pointers
12066 (akin to the stashes hash, and the perl stack), we come unstuck if
12067 a weak reference (or other SV legitimately SvREFCNT() == 0 for this
12068 thread) is manipulated in a CLONE method, because CLONE runs before the
12069 unreferenced array is walked to find SVs still with SvREFCNT() == 0
12070 (and fix things up by giving each a reference via the temps stack).
12071 Instead, during CLONE, if the 0-referenced SV has SvREFCNT_inc() and
12072 then SvREFCNT_dec(), it will be cleaned up (and added to the free list)
12073 before the walk of unreferenced happens and a reference to that is SV
12074 added to the temps stack. At which point we have the same SV considered
12075 to be in use, and free to be re-used. Not good.
12076 */
d08d57ef
NC
12077 if (dstr && !(param->flags & CLONEf_COPY_STACKS) && !SvREFCNT(dstr)) {
12078 assert(param->unreferenced);
04518cc3 12079 av_push(param->unreferenced, SvREFCNT_inc(dstr));
d08d57ef
NC
12080 }
12081
12082 return dstr;
a09252eb
NC
12083}
12084
645c22ef
DM
12085/* duplicate a context */
12086
1d7c1841 12087PERL_CONTEXT *
a8fc9800 12088Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
1d7c1841
GS
12089{
12090 PERL_CONTEXT *ncxs;
12091
7918f24d
NC
12092 PERL_ARGS_ASSERT_CX_DUP;
12093
1d7c1841
GS
12094 if (!cxs)
12095 return (PERL_CONTEXT*)NULL;
12096
12097 /* look for it in the table first */
12098 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
12099 if (ncxs)
12100 return ncxs;
12101
12102 /* create anew and remember what it is */
c2d565bf 12103 Newx(ncxs, max + 1, PERL_CONTEXT);
1d7c1841 12104 ptr_table_store(PL_ptr_table, cxs, ncxs);
c2d565bf 12105 Copy(cxs, ncxs, max + 1, PERL_CONTEXT);
1d7c1841
GS
12106
12107 while (ix >= 0) {
c445ea15 12108 PERL_CONTEXT * const ncx = &ncxs[ix];
c2d565bf 12109 if (CxTYPE(ncx) == CXt_SUBST) {
1d7c1841
GS
12110 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
12111 }
12112 else {
c2d565bf 12113 switch (CxTYPE(ncx)) {
1d7c1841 12114 case CXt_SUB:
c2d565bf
NC
12115 ncx->blk_sub.cv = (ncx->blk_sub.olddepth == 0
12116 ? cv_dup_inc(ncx->blk_sub.cv, param)
12117 : cv_dup(ncx->blk_sub.cv,param));
bafb2adc 12118 ncx->blk_sub.argarray = (CxHASARGS(ncx)
c2d565bf
NC
12119 ? av_dup_inc(ncx->blk_sub.argarray,
12120 param)
7d49f689 12121 : NULL);
c2d565bf
NC
12122 ncx->blk_sub.savearray = av_dup_inc(ncx->blk_sub.savearray,
12123 param);
d8d97e70 12124 ncx->blk_sub.oldcomppad = (PAD*)ptr_table_fetch(PL_ptr_table,
c2d565bf 12125 ncx->blk_sub.oldcomppad);
1d7c1841
GS
12126 break;
12127 case CXt_EVAL:
c2d565bf
NC
12128 ncx->blk_eval.old_namesv = sv_dup_inc(ncx->blk_eval.old_namesv,
12129 param);
12130 ncx->blk_eval.cur_text = sv_dup(ncx->blk_eval.cur_text, param);
1d7c1841 12131 break;
d01136d6 12132 case CXt_LOOP_LAZYSV:
d01136d6
BS
12133 ncx->blk_loop.state_u.lazysv.end
12134 = sv_dup_inc(ncx->blk_loop.state_u.lazysv.end, param);
840fe433 12135 /* We are taking advantage of av_dup_inc and sv_dup_inc
486ec47a 12136 actually being the same function, and order equivalence of
840fe433
NC
12137 the two unions.
12138 We can assert the later [but only at run time :-(] */
12139 assert ((void *) &ncx->blk_loop.state_u.ary.ary ==
12140 (void *) &ncx->blk_loop.state_u.lazysv.cur);
3b719c58 12141 case CXt_LOOP_FOR:
d01136d6
BS
12142 ncx->blk_loop.state_u.ary.ary
12143 = av_dup_inc(ncx->blk_loop.state_u.ary.ary, param);
12144 case CXt_LOOP_LAZYIV:
3b719c58 12145 case CXt_LOOP_PLAIN:
e846cb92 12146 if (CxPADLOOP(ncx)) {
df530c37 12147 ncx->blk_loop.itervar_u.oldcomppad
e846cb92 12148 = (PAD*)ptr_table_fetch(PL_ptr_table,
df530c37 12149 ncx->blk_loop.itervar_u.oldcomppad);
e846cb92 12150 } else {
df530c37
DM
12151 ncx->blk_loop.itervar_u.gv
12152 = gv_dup((const GV *)ncx->blk_loop.itervar_u.gv,
12153 param);
e846cb92 12154 }
1d7c1841
GS
12155 break;
12156 case CXt_FORMAT:
f9c764c5
NC
12157 ncx->blk_format.cv = cv_dup(ncx->blk_format.cv, param);
12158 ncx->blk_format.gv = gv_dup(ncx->blk_format.gv, param);
12159 ncx->blk_format.dfoutgv = gv_dup_inc(ncx->blk_format.dfoutgv,
c2d565bf 12160 param);
1d7c1841
GS
12161 break;
12162 case CXt_BLOCK:
12163 case CXt_NULL:
12164 break;
12165 }
12166 }
12167 --ix;
12168 }
12169 return ncxs;
12170}
12171
645c22ef
DM
12172/* duplicate a stack info structure */
12173
1d7c1841 12174PERL_SI *
a8fc9800 12175Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
1d7c1841
GS
12176{
12177 PERL_SI *nsi;
12178
7918f24d
NC
12179 PERL_ARGS_ASSERT_SI_DUP;
12180
1d7c1841
GS
12181 if (!si)
12182 return (PERL_SI*)NULL;
12183
12184 /* look for it in the table first */
12185 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
12186 if (nsi)
12187 return nsi;
12188
12189 /* create anew and remember what it is */
a02a5408 12190 Newxz(nsi, 1, PERL_SI);
1d7c1841
GS
12191 ptr_table_store(PL_ptr_table, si, nsi);
12192
d2d73c3e 12193 nsi->si_stack = av_dup_inc(si->si_stack, param);
1d7c1841
GS
12194 nsi->si_cxix = si->si_cxix;
12195 nsi->si_cxmax = si->si_cxmax;
d2d73c3e 12196 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
1d7c1841 12197 nsi->si_type = si->si_type;
d2d73c3e
AB
12198 nsi->si_prev = si_dup(si->si_prev, param);
12199 nsi->si_next = si_dup(si->si_next, param);
1d7c1841
GS
12200 nsi->si_markoff = si->si_markoff;
12201
12202 return nsi;
12203}
12204
12205#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
12206#define TOPINT(ss,ix) ((ss)[ix].any_i32)
12207#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
12208#define TOPLONG(ss,ix) ((ss)[ix].any_long)
12209#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
12210#define TOPIV(ss,ix) ((ss)[ix].any_iv)
c6bf6a65
NC
12211#define POPUV(ss,ix) ((ss)[--(ix)].any_uv)
12212#define TOPUV(ss,ix) ((ss)[ix].any_uv)
38d8b13e
HS
12213#define POPBOOL(ss,ix) ((ss)[--(ix)].any_bool)
12214#define TOPBOOL(ss,ix) ((ss)[ix].any_bool)
1d7c1841
GS
12215#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
12216#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
12217#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
12218#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
12219#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
12220#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
12221
12222/* XXXXX todo */
12223#define pv_dup_inc(p) SAVEPV(p)
12224#define pv_dup(p) SAVEPV(p)
12225#define svp_dup_inc(p,pp) any_dup(p,pp)
12226
645c22ef
DM
12227/* map any object to the new equivent - either something in the
12228 * ptr table, or something in the interpreter structure
12229 */
12230
1d7c1841 12231void *
53c1dcc0 12232Perl_any_dup(pTHX_ void *v, const PerlInterpreter *proto_perl)
1d7c1841
GS
12233{
12234 void *ret;
12235
7918f24d
NC
12236 PERL_ARGS_ASSERT_ANY_DUP;
12237
1d7c1841
GS
12238 if (!v)
12239 return (void*)NULL;
12240
12241 /* look for it in the table first */
12242 ret = ptr_table_fetch(PL_ptr_table, v);
12243 if (ret)
12244 return ret;
12245
12246 /* see if it is part of the interpreter structure */
12247 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
acfe0abc 12248 ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
05ec9bb3 12249 else {
1d7c1841 12250 ret = v;
05ec9bb3 12251 }
1d7c1841
GS
12252
12253 return ret;
12254}
12255
645c22ef
DM
12256/* duplicate the save stack */
12257
1d7c1841 12258ANY *
a8fc9800 12259Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
1d7c1841 12260{
53d44271 12261 dVAR;
907b3e23
DM
12262 ANY * const ss = proto_perl->Isavestack;
12263 const I32 max = proto_perl->Isavestack_max;
12264 I32 ix = proto_perl->Isavestack_ix;
1d7c1841 12265 ANY *nss;
daba3364 12266 const SV *sv;
1d193675
NC
12267 const GV *gv;
12268 const AV *av;
12269 const HV *hv;
1d7c1841
GS
12270 void* ptr;
12271 int intval;
12272 long longval;
12273 GP *gp;
12274 IV iv;
b24356f5 12275 I32 i;
c4e33207 12276 char *c = NULL;
1d7c1841 12277 void (*dptr) (void*);
acfe0abc 12278 void (*dxptr) (pTHX_ void*);
1d7c1841 12279
7918f24d
NC
12280 PERL_ARGS_ASSERT_SS_DUP;
12281
a02a5408 12282 Newxz(nss, max, ANY);
1d7c1841
GS
12283
12284 while (ix > 0) {
c6bf6a65
NC
12285 const UV uv = POPUV(ss,ix);
12286 const U8 type = (U8)uv & SAVE_MASK;
12287
12288 TOPUV(nss,ix) = uv;
b24356f5 12289 switch (type) {
cdcdfc56
NC
12290 case SAVEt_CLEARSV:
12291 break;
3e07292d 12292 case SAVEt_HELEM: /* hash element */
daba3364 12293 sv = (const SV *)POPPTR(ss,ix);
3e07292d
NC
12294 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
12295 /* fall through */
1d7c1841 12296 case SAVEt_ITEM: /* normal string */
0d1db40e 12297 case SAVEt_GVSV: /* scalar slot in GV */
a41cc44e 12298 case SAVEt_SV: /* scalar reference */
daba3364 12299 sv = (const SV *)POPPTR(ss,ix);
d2d73c3e 12300 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
3e07292d
NC
12301 /* fall through */
12302 case SAVEt_FREESV:
12303 case SAVEt_MORTALIZESV:
daba3364 12304 sv = (const SV *)POPPTR(ss,ix);
d2d73c3e 12305 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 12306 break;
05ec9bb3
NIS
12307 case SAVEt_SHARED_PVREF: /* char* in shared space */
12308 c = (char*)POPPTR(ss,ix);
12309 TOPPTR(nss,ix) = savesharedpv(c);
12310 ptr = POPPTR(ss,ix);
12311 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12312 break;
1d7c1841
GS
12313 case SAVEt_GENERIC_SVREF: /* generic sv */
12314 case SAVEt_SVREF: /* scalar reference */
daba3364 12315 sv = (const SV *)POPPTR(ss,ix);
d2d73c3e 12316 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
12317 ptr = POPPTR(ss,ix);
12318 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
12319 break;
a41cc44e 12320 case SAVEt_HV: /* hash reference */
1d7c1841 12321 case SAVEt_AV: /* array reference */
daba3364 12322 sv = (const SV *) POPPTR(ss,ix);
337d28f5 12323 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
3e07292d
NC
12324 /* fall through */
12325 case SAVEt_COMPPAD:
12326 case SAVEt_NSTAB:
daba3364 12327 sv = (const SV *) POPPTR(ss,ix);
3e07292d 12328 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
12329 break;
12330 case SAVEt_INT: /* int reference */
12331 ptr = POPPTR(ss,ix);
12332 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12333 intval = (int)POPINT(ss,ix);
12334 TOPINT(nss,ix) = intval;
12335 break;
12336 case SAVEt_LONG: /* long reference */
12337 ptr = POPPTR(ss,ix);
12338 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12339 longval = (long)POPLONG(ss,ix);
12340 TOPLONG(nss,ix) = longval;
12341 break;
12342 case SAVEt_I32: /* I32 reference */
88effcc9 12343 case SAVEt_COP_ARYBASE: /* call CopARYBASE_set */
1d7c1841
GS
12344 ptr = POPPTR(ss,ix);
12345 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
1ccabee8 12346 i = POPINT(ss,ix);
1d7c1841
GS
12347 TOPINT(nss,ix) = i;
12348 break;
12349 case SAVEt_IV: /* IV reference */
12350 ptr = POPPTR(ss,ix);
12351 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12352 iv = POPIV(ss,ix);
12353 TOPIV(nss,ix) = iv;
12354 break;
a41cc44e
NC
12355 case SAVEt_HPTR: /* HV* reference */
12356 case SAVEt_APTR: /* AV* reference */
1d7c1841
GS
12357 case SAVEt_SPTR: /* SV* reference */
12358 ptr = POPPTR(ss,ix);
12359 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
daba3364 12360 sv = (const SV *)POPPTR(ss,ix);
d2d73c3e 12361 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
12362 break;
12363 case SAVEt_VPTR: /* random* reference */
12364 ptr = POPPTR(ss,ix);
12365 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
65504245 12366 /* Fall through */
994d373a 12367 case SAVEt_INT_SMALL:
89abef21 12368 case SAVEt_I32_SMALL:
c9441fce 12369 case SAVEt_I16: /* I16 reference */
6c61c2d4 12370 case SAVEt_I8: /* I8 reference */
65504245 12371 case SAVEt_BOOL:
1d7c1841
GS
12372 ptr = POPPTR(ss,ix);
12373 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12374 break;
b03d03b0 12375 case SAVEt_GENERIC_PVREF: /* generic char* */
1d7c1841
GS
12376 case SAVEt_PPTR: /* char* reference */
12377 ptr = POPPTR(ss,ix);
12378 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12379 c = (char*)POPPTR(ss,ix);
12380 TOPPTR(nss,ix) = pv_dup(c);
12381 break;
1d7c1841
GS
12382 case SAVEt_GP: /* scalar reference */
12383 gp = (GP*)POPPTR(ss,ix);
d2d73c3e 12384 TOPPTR(nss,ix) = gp = gp_dup(gp, param);
1d7c1841 12385 (void)GpREFCNT_inc(gp);
10507e11
FC
12386 gv = (const GV *)POPPTR(ss,ix);
12387 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
b9e00b79 12388 break;
1d7c1841
GS
12389 case SAVEt_FREEOP:
12390 ptr = POPPTR(ss,ix);
12391 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
12392 /* these are assumed to be refcounted properly */
53c1dcc0 12393 OP *o;
1d7c1841
GS
12394 switch (((OP*)ptr)->op_type) {
12395 case OP_LEAVESUB:
12396 case OP_LEAVESUBLV:
12397 case OP_LEAVEEVAL:
12398 case OP_LEAVE:
12399 case OP_SCOPE:
12400 case OP_LEAVEWRITE:
e977893f
GS
12401 TOPPTR(nss,ix) = ptr;
12402 o = (OP*)ptr;
d3c72c2a 12403 OP_REFCNT_LOCK;
594cd643 12404 (void) OpREFCNT_inc(o);
d3c72c2a 12405 OP_REFCNT_UNLOCK;
1d7c1841
GS
12406 break;
12407 default:
5f66b61c 12408 TOPPTR(nss,ix) = NULL;
1d7c1841
GS
12409 break;
12410 }
12411 }
12412 else
5f66b61c 12413 TOPPTR(nss,ix) = NULL;
1d7c1841 12414 break;
3987a177
Z
12415 case SAVEt_FREECOPHH:
12416 ptr = POPPTR(ss,ix);
12417 TOPPTR(nss,ix) = cophh_copy((COPHH *)ptr);
12418 break;
1d7c1841 12419 case SAVEt_DELETE:
1d193675 12420 hv = (const HV *)POPPTR(ss,ix);
d2d73c3e 12421 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
35d4f826
NC
12422 i = POPINT(ss,ix);
12423 TOPINT(nss,ix) = i;
8e41545f
NC
12424 /* Fall through */
12425 case SAVEt_FREEPV:
1d7c1841
GS
12426 c = (char*)POPPTR(ss,ix);
12427 TOPPTR(nss,ix) = pv_dup_inc(c);
35d4f826 12428 break;
3e07292d 12429 case SAVEt_STACK_POS: /* Position on Perl stack */
1d7c1841
GS
12430 i = POPINT(ss,ix);
12431 TOPINT(nss,ix) = i;
12432 break;
12433 case SAVEt_DESTRUCTOR:
12434 ptr = POPPTR(ss,ix);
12435 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
12436 dptr = POPDPTR(ss,ix);
8141890a
JH
12437 TOPDPTR(nss,ix) = DPTR2FPTR(void (*)(void*),
12438 any_dup(FPTR2DPTR(void *, dptr),
12439 proto_perl));
1d7c1841
GS
12440 break;
12441 case SAVEt_DESTRUCTOR_X:
12442 ptr = POPPTR(ss,ix);
12443 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
12444 dxptr = POPDXPTR(ss,ix);
8141890a
JH
12445 TOPDXPTR(nss,ix) = DPTR2FPTR(void (*)(pTHX_ void*),
12446 any_dup(FPTR2DPTR(void *, dxptr),
12447 proto_perl));
1d7c1841
GS
12448 break;
12449 case SAVEt_REGCONTEXT:
12450 case SAVEt_ALLOC:
1be36ce0 12451 ix -= uv >> SAVE_TIGHT_SHIFT;
1d7c1841 12452 break;
1d7c1841 12453 case SAVEt_AELEM: /* array element */
daba3364 12454 sv = (const SV *)POPPTR(ss,ix);
d2d73c3e 12455 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
12456 i = POPINT(ss,ix);
12457 TOPINT(nss,ix) = i;
502c6561 12458 av = (const AV *)POPPTR(ss,ix);
d2d73c3e 12459 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841 12460 break;
1d7c1841
GS
12461 case SAVEt_OP:
12462 ptr = POPPTR(ss,ix);
12463 TOPPTR(nss,ix) = ptr;
12464 break;
12465 case SAVEt_HINTS:
b3ca2e83 12466 ptr = POPPTR(ss,ix);
20439bc7 12467 ptr = cophh_copy((COPHH*)ptr);
cbb1fbea 12468 TOPPTR(nss,ix) = ptr;
601cee3b
NC
12469 i = POPINT(ss,ix);
12470 TOPINT(nss,ix) = i;
a8f8b6a7 12471 if (i & HINT_LOCALIZE_HH) {
1d193675 12472 hv = (const HV *)POPPTR(ss,ix);
a8f8b6a7
NC
12473 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
12474 }
1d7c1841 12475 break;
09edbca0 12476 case SAVEt_PADSV_AND_MORTALIZE:
c3564e5c
GS
12477 longval = (long)POPLONG(ss,ix);
12478 TOPLONG(nss,ix) = longval;
12479 ptr = POPPTR(ss,ix);
12480 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
daba3364 12481 sv = (const SV *)POPPTR(ss,ix);
09edbca0 12482 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
c3564e5c 12483 break;
8bd2680e
MHM
12484 case SAVEt_SET_SVFLAGS:
12485 i = POPINT(ss,ix);
12486 TOPINT(nss,ix) = i;
12487 i = POPINT(ss,ix);
12488 TOPINT(nss,ix) = i;
daba3364 12489 sv = (const SV *)POPPTR(ss,ix);
8bd2680e
MHM
12490 TOPPTR(nss,ix) = sv_dup(sv, param);
12491 break;
5bfb7d0e
NC
12492 case SAVEt_RE_STATE:
12493 {
12494 const struct re_save_state *const old_state
12495 = (struct re_save_state *)
12496 (ss + ix - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
12497 struct re_save_state *const new_state
12498 = (struct re_save_state *)
12499 (nss + ix - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
12500
12501 Copy(old_state, new_state, 1, struct re_save_state);
12502 ix -= SAVESTACK_ALLOC_FOR_RE_SAVE_STATE;
12503
12504 new_state->re_state_bostr
12505 = pv_dup(old_state->re_state_bostr);
12506 new_state->re_state_reginput
12507 = pv_dup(old_state->re_state_reginput);
5bfb7d0e
NC
12508 new_state->re_state_regeol
12509 = pv_dup(old_state->re_state_regeol);
f0ab9afb
NC
12510 new_state->re_state_regoffs
12511 = (regexp_paren_pair*)
12512 any_dup(old_state->re_state_regoffs, proto_perl);
5bfb7d0e 12513 new_state->re_state_reglastparen
11b79775
DD
12514 = (U32*) any_dup(old_state->re_state_reglastparen,
12515 proto_perl);
5bfb7d0e 12516 new_state->re_state_reglastcloseparen
11b79775 12517 = (U32*)any_dup(old_state->re_state_reglastcloseparen,
5bfb7d0e 12518 proto_perl);
5bfb7d0e
NC
12519 /* XXX This just has to be broken. The old save_re_context
12520 code did SAVEGENERICPV(PL_reg_start_tmp);
12521 PL_reg_start_tmp is char **.
12522 Look above to what the dup code does for
12523 SAVEt_GENERIC_PVREF
12524 It can never have worked.
12525 So this is merely a faithful copy of the exiting bug: */
12526 new_state->re_state_reg_start_tmp
12527 = (char **) pv_dup((char *)
12528 old_state->re_state_reg_start_tmp);
12529 /* I assume that it only ever "worked" because no-one called
12530 (pseudo)fork while the regexp engine had re-entered itself.
12531 */
5bfb7d0e
NC
12532#ifdef PERL_OLD_COPY_ON_WRITE
12533 new_state->re_state_nrs
12534 = sv_dup(old_state->re_state_nrs, param);
12535#endif
12536 new_state->re_state_reg_magic
11b79775
DD
12537 = (MAGIC*) any_dup(old_state->re_state_reg_magic,
12538 proto_perl);
5bfb7d0e 12539 new_state->re_state_reg_oldcurpm
11b79775
DD
12540 = (PMOP*) any_dup(old_state->re_state_reg_oldcurpm,
12541 proto_perl);
5bfb7d0e 12542 new_state->re_state_reg_curpm
11b79775
DD
12543 = (PMOP*) any_dup(old_state->re_state_reg_curpm,
12544 proto_perl);
5bfb7d0e
NC
12545 new_state->re_state_reg_oldsaved
12546 = pv_dup(old_state->re_state_reg_oldsaved);
12547 new_state->re_state_reg_poscache
12548 = pv_dup(old_state->re_state_reg_poscache);
5bfb7d0e
NC
12549 new_state->re_state_reg_starttry
12550 = pv_dup(old_state->re_state_reg_starttry);
5bfb7d0e
NC
12551 break;
12552 }
68da3b2f
NC
12553 case SAVEt_COMPILE_WARNINGS:
12554 ptr = POPPTR(ss,ix);
12555 TOPPTR(nss,ix) = DUP_WARNINGS((STRLEN*)ptr);
7b6dd8c3 12556 break;
7c197c94
DM
12557 case SAVEt_PARSER:
12558 ptr = POPPTR(ss,ix);
456084a8 12559 TOPPTR(nss,ix) = parser_dup((const yy_parser*)ptr, param);
7c197c94 12560 break;
1d7c1841 12561 default:
147bc374
NC
12562 Perl_croak(aTHX_
12563 "panic: ss_dup inconsistency (%"IVdf")", (IV) type);
1d7c1841
GS
12564 }
12565 }
12566
bd81e77b
NC
12567 return nss;
12568}
12569
12570
12571/* if sv is a stash, call $class->CLONE_SKIP(), and set the SVphv_CLONEABLE
12572 * flag to the result. This is done for each stash before cloning starts,
12573 * so we know which stashes want their objects cloned */
12574
12575static void
f30de749 12576do_mark_cloneable_stash(pTHX_ SV *const sv)
bd81e77b 12577{
1d193675 12578 const HEK * const hvname = HvNAME_HEK((const HV *)sv);
bd81e77b 12579 if (hvname) {
85fbaab2 12580 GV* const cloner = gv_fetchmethod_autoload(MUTABLE_HV(sv), "CLONE_SKIP", 0);
bd81e77b
NC
12581 SvFLAGS(sv) |= SVphv_CLONEABLE; /* clone objects by default */
12582 if (cloner && GvCV(cloner)) {
12583 dSP;
12584 UV status;
12585
12586 ENTER;
12587 SAVETMPS;
12588 PUSHMARK(SP);
6e449a3a 12589 mXPUSHs(newSVhek(hvname));
bd81e77b 12590 PUTBACK;
daba3364 12591 call_sv(MUTABLE_SV(GvCV(cloner)), G_SCALAR);
bd81e77b
NC
12592 SPAGAIN;
12593 status = POPu;
12594 PUTBACK;
12595 FREETMPS;
12596 LEAVE;
12597 if (status)
12598 SvFLAGS(sv) &= ~SVphv_CLONEABLE;
12599 }
12600 }
12601}
12602
12603
12604
12605/*
12606=for apidoc perl_clone
12607
12608Create and return a new interpreter by cloning the current one.
12609
12610perl_clone takes these flags as parameters:
12611
12612CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
12613without it we only clone the data and zero the stacks,
12614with it we copy the stacks and the new perl interpreter is
12615ready to run at the exact same point as the previous one.
12616The pseudo-fork code uses COPY_STACKS while the
878090d5 12617threads->create doesn't.
bd81e77b
NC
12618
12619CLONEf_KEEP_PTR_TABLE
12620perl_clone keeps a ptr_table with the pointer of the old
12621variable as a key and the new variable as a value,
12622this allows it to check if something has been cloned and not
12623clone it again but rather just use the value and increase the
12624refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
12625the ptr_table using the function
12626C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
12627reason to keep it around is if you want to dup some of your own
12628variable who are outside the graph perl scans, example of this
12629code is in threads.xs create
12630
12631CLONEf_CLONE_HOST
12632This is a win32 thing, it is ignored on unix, it tells perls
12633win32host code (which is c++) to clone itself, this is needed on
12634win32 if you want to run two threads at the same time,
12635if you just want to do some stuff in a separate perl interpreter
12636and then throw it away and return to the original one,
12637you don't need to do anything.
12638
12639=cut
12640*/
12641
12642/* XXX the above needs expanding by someone who actually understands it ! */
12643EXTERN_C PerlInterpreter *
12644perl_clone_host(PerlInterpreter* proto_perl, UV flags);
12645
12646PerlInterpreter *
12647perl_clone(PerlInterpreter *proto_perl, UV flags)
12648{
12649 dVAR;
12650#ifdef PERL_IMPLICIT_SYS
12651
7918f24d
NC
12652 PERL_ARGS_ASSERT_PERL_CLONE;
12653
bd81e77b
NC
12654 /* perlhost.h so we need to call into it
12655 to clone the host, CPerlHost should have a c interface, sky */
12656
12657 if (flags & CLONEf_CLONE_HOST) {
12658 return perl_clone_host(proto_perl,flags);
12659 }
12660 return perl_clone_using(proto_perl, flags,
12661 proto_perl->IMem,
12662 proto_perl->IMemShared,
12663 proto_perl->IMemParse,
12664 proto_perl->IEnv,
12665 proto_perl->IStdIO,
12666 proto_perl->ILIO,
12667 proto_perl->IDir,
12668 proto_perl->ISock,
12669 proto_perl->IProc);
12670}
12671
12672PerlInterpreter *
12673perl_clone_using(PerlInterpreter *proto_perl, UV flags,
12674 struct IPerlMem* ipM, struct IPerlMem* ipMS,
12675 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
12676 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
12677 struct IPerlDir* ipD, struct IPerlSock* ipS,
12678 struct IPerlProc* ipP)
12679{
12680 /* XXX many of the string copies here can be optimized if they're
12681 * constants; they need to be allocated as common memory and just
12682 * their pointers copied. */
12683
12684 IV i;
12685 CLONE_PARAMS clone_params;
5f66b61c 12686 CLONE_PARAMS* const param = &clone_params;
bd81e77b 12687
5f66b61c 12688 PerlInterpreter * const my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
7918f24d
NC
12689
12690 PERL_ARGS_ASSERT_PERL_CLONE_USING;
bd81e77b
NC
12691#else /* !PERL_IMPLICIT_SYS */
12692 IV i;
12693 CLONE_PARAMS clone_params;
12694 CLONE_PARAMS* param = &clone_params;
5f66b61c 12695 PerlInterpreter * const my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
7918f24d
NC
12696
12697 PERL_ARGS_ASSERT_PERL_CLONE;
b59cce4c 12698#endif /* PERL_IMPLICIT_SYS */
7918f24d 12699
bd81e77b
NC
12700 /* for each stash, determine whether its objects should be cloned */
12701 S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
12702 PERL_SET_THX(my_perl);
12703
b59cce4c 12704#ifdef DEBUGGING
7e337ee0 12705 PoisonNew(my_perl, 1, PerlInterpreter);
5f66b61c
AL
12706 PL_op = NULL;
12707 PL_curcop = NULL;
bd81e77b
NC
12708 PL_markstack = 0;
12709 PL_scopestack = 0;
cbdd5331 12710 PL_scopestack_name = 0;
bd81e77b
NC
12711 PL_savestack = 0;
12712 PL_savestack_ix = 0;
12713 PL_savestack_max = -1;
12714 PL_sig_pending = 0;
b8328dae 12715 PL_parser = NULL;
bd81e77b 12716 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
02d9cd5e 12717# ifdef DEBUG_LEAKING_SCALARS
c895a371 12718 PL_sv_serial = (((UV)my_perl >> 2) & 0xfff) * 1000000;
02d9cd5e 12719# endif
b59cce4c 12720#else /* !DEBUGGING */
bd81e77b 12721 Zero(my_perl, 1, PerlInterpreter);
b59cce4c 12722#endif /* DEBUGGING */
742421a6
DM
12723
12724#ifdef PERL_IMPLICIT_SYS
12725 /* host pointers */
12726 PL_Mem = ipM;
12727 PL_MemShared = ipMS;
12728 PL_MemParse = ipMP;
12729 PL_Env = ipE;
12730 PL_StdIO = ipStd;
12731 PL_LIO = ipLIO;
12732 PL_Dir = ipD;
12733 PL_Sock = ipS;
12734 PL_Proc = ipP;
12735#endif /* PERL_IMPLICIT_SYS */
12736
bd81e77b 12737 param->flags = flags;
f7abe70b
NC
12738 /* Nothing in the core code uses this, but we make it available to
12739 extensions (using mg_dup). */
bd81e77b 12740 param->proto_perl = proto_perl;
f7abe70b
NC
12741 /* Likely nothing will use this, but it is initialised to be consistent
12742 with Perl_clone_params_new(). */
ec2fb142 12743 param->new_perl = my_perl;
d08d57ef 12744 param->unreferenced = NULL;
bd81e77b 12745
7cb608b5
NC
12746 INIT_TRACK_MEMPOOL(my_perl->Imemory_debug_header, my_perl);
12747
fdda85ca 12748 PL_body_arenas = NULL;
bd81e77b
NC
12749 Zero(&PL_body_roots, 1, PL_body_roots);
12750
bd81e77b
NC
12751 PL_sv_count = 0;
12752 PL_sv_objcount = 0;
a0714e2c
SS
12753 PL_sv_root = NULL;
12754 PL_sv_arenaroot = NULL;
bd81e77b
NC
12755
12756 PL_debug = proto_perl->Idebug;
12757
12758 PL_hash_seed = proto_perl->Ihash_seed;
12759 PL_rehash_seed = proto_perl->Irehash_seed;
12760
12761#ifdef USE_REENTRANT_API
12762 /* XXX: things like -Dm will segfault here in perlio, but doing
12763 * PERL_SET_CONTEXT(proto_perl);
12764 * breaks too many other things
12765 */
12766 Perl_reentrant_init(aTHX);
12767#endif
12768
12769 /* create SV map for pointer relocation */
12770 PL_ptr_table = ptr_table_new();
12771
12772 /* initialize these special pointers as early as possible */
12773 SvANY(&PL_sv_undef) = NULL;
12774 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
12775 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
12776 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
12777
12778 SvANY(&PL_sv_no) = new_XPVNV();
12779 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
12780 SvFLAGS(&PL_sv_no) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
12781 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
bb7a0f54 12782 SvPV_set(&PL_sv_no, savepvn(PL_No, 0));
bd81e77b
NC
12783 SvCUR_set(&PL_sv_no, 0);
12784 SvLEN_set(&PL_sv_no, 1);
12785 SvIV_set(&PL_sv_no, 0);
12786 SvNV_set(&PL_sv_no, 0);
12787 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
12788
12789 SvANY(&PL_sv_yes) = new_XPVNV();
12790 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
12791 SvFLAGS(&PL_sv_yes) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
12792 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
bb7a0f54 12793 SvPV_set(&PL_sv_yes, savepvn(PL_Yes, 1));
bd81e77b
NC
12794 SvCUR_set(&PL_sv_yes, 1);
12795 SvLEN_set(&PL_sv_yes, 2);
12796 SvIV_set(&PL_sv_yes, 1);
12797 SvNV_set(&PL_sv_yes, 1);
12798 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
12799
a1f97a07
DM
12800 /* dbargs array probably holds garbage */
12801 PL_dbargs = NULL;
7fa38291 12802
bd81e77b
NC
12803 /* create (a non-shared!) shared string table */
12804 PL_strtab = newHV();
12805 HvSHAREKEYS_off(PL_strtab);
12806 hv_ksplit(PL_strtab, HvTOTALKEYS(proto_perl->Istrtab));
12807 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
12808
12809 PL_compiling = proto_perl->Icompiling;
12810
12811 /* These two PVs will be free'd special way so must set them same way op.c does */
12812 PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
12813 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
12814
12815 PL_compiling.cop_file = savesharedpv(PL_compiling.cop_file);
12816 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
12817
12818 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
72dc9ed5 12819 PL_compiling.cop_warnings = DUP_WARNINGS(PL_compiling.cop_warnings);
20439bc7 12820 CopHINTHASH_set(&PL_compiling, cophh_copy(CopHINTHASH_get(&PL_compiling)));
907b3e23 12821 PL_curcop = (COP*)any_dup(proto_perl->Icurcop, proto_perl);
5892a4d4
NC
12822#ifdef PERL_DEBUG_READONLY_OPS
12823 PL_slabs = NULL;
12824 PL_slab_count = 0;
12825#endif
bd81e77b
NC
12826
12827 /* pseudo environmental stuff */
12828 PL_origargc = proto_perl->Iorigargc;
12829 PL_origargv = proto_perl->Iorigargv;
12830
12831 param->stashes = newAV(); /* Setup array of objects to call clone on */
842c4123
NC
12832 /* This makes no difference to the implementation, as it always pushes
12833 and shifts pointers to other SVs without changing their reference
12834 count, with the array becoming empty before it is freed. However, it
12835 makes it conceptually clear what is going on, and will avoid some
12836 work inside av.c, filling slots between AvFILL() and AvMAX() with
12837 &PL_sv_undef, and SvREFCNT_dec()ing those. */
12838 AvREAL_off(param->stashes);
bd81e77b 12839
d08d57ef
NC
12840 if (!(flags & CLONEf_COPY_STACKS)) {
12841 param->unreferenced = newAV();
d08d57ef
NC
12842 }
12843
bd81e77b
NC
12844 /* Set tainting stuff before PerlIO_debug can possibly get called */
12845 PL_tainting = proto_perl->Itainting;
12846 PL_taint_warn = proto_perl->Itaint_warn;
12847
12848#ifdef PERLIO_LAYERS
12849 /* Clone PerlIO tables as soon as we can handle general xx_dup() */
12850 PerlIO_clone(aTHX_ proto_perl, param);
12851#endif
12852
12853 PL_envgv = gv_dup(proto_perl->Ienvgv, param);
12854 PL_incgv = gv_dup(proto_perl->Iincgv, param);
12855 PL_hintgv = gv_dup(proto_perl->Ihintgv, param);
12856 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
12857 PL_diehook = sv_dup_inc(proto_perl->Idiehook, param);
12858 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param);
12859
12860 /* switches */
12861 PL_minus_c = proto_perl->Iminus_c;
12862 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel, param);
1e8125c6 12863 PL_apiversion = sv_dup_inc(proto_perl->Iapiversion, param);
bd81e77b
NC
12864 PL_localpatches = proto_perl->Ilocalpatches;
12865 PL_splitstr = proto_perl->Isplitstr;
bd81e77b
NC
12866 PL_minus_n = proto_perl->Iminus_n;
12867 PL_minus_p = proto_perl->Iminus_p;
12868 PL_minus_l = proto_perl->Iminus_l;
12869 PL_minus_a = proto_perl->Iminus_a;
bc9b29db 12870 PL_minus_E = proto_perl->Iminus_E;
bd81e77b
NC
12871 PL_minus_F = proto_perl->Iminus_F;
12872 PL_doswitches = proto_perl->Idoswitches;
12873 PL_dowarn = proto_perl->Idowarn;
bd81e77b
NC
12874 PL_sawampersand = proto_perl->Isawampersand;
12875 PL_unsafe = proto_perl->Iunsafe;
12876 PL_inplace = SAVEPV(proto_perl->Iinplace);
12877 PL_e_script = sv_dup_inc(proto_perl->Ie_script, param);
12878 PL_perldb = proto_perl->Iperldb;
12879 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
12880 PL_exit_flags = proto_perl->Iexit_flags;
12881
12882 /* magical thingies */
12883 /* XXX time(&PL_basetime) when asked for? */
12884 PL_basetime = proto_perl->Ibasetime;
12885 PL_formfeed = sv_dup(proto_perl->Iformfeed, param);
12886
12887 PL_maxsysfd = proto_perl->Imaxsysfd;
bd81e77b
NC
12888 PL_statusvalue = proto_perl->Istatusvalue;
12889#ifdef VMS
12890 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
12891#else
12892 PL_statusvalue_posix = proto_perl->Istatusvalue_posix;
12893#endif
12894 PL_encoding = sv_dup(proto_perl->Iencoding, param);
12895
76f68e9b
MHM
12896 sv_setpvs(PERL_DEBUG_PAD(0), ""); /* For regex debugging. */
12897 sv_setpvs(PERL_DEBUG_PAD(1), ""); /* ext/re needs these */
12898 sv_setpvs(PERL_DEBUG_PAD(2), ""); /* even without DEBUGGING. */
bd81e77b 12899
84da74a7 12900
f9f4320a 12901 /* RE engine related */
84da74a7
YO
12902 Zero(&PL_reg_state, 1, struct re_save_state);
12903 PL_reginterp_cnt = 0;
12904 PL_regmatch_slab = NULL;
12905
bd81e77b 12906 /* Clone the regex array */
937c6efd
NC
12907 /* ORANGE FIXME for plugins, probably in the SV dup code.
12908 newSViv(PTR2IV(CALLREGDUPE(
12909 INT2PTR(REGEXP *, SvIVX(regex)), param))))
12910 */
12911 PL_regex_padav = av_dup_inc(proto_perl->Iregex_padav, param);
bd81e77b
NC
12912 PL_regex_pad = AvARRAY(PL_regex_padav);
12913
12914 /* shortcuts to various I/O objects */
b2ea9a00 12915 PL_ofsgv = gv_dup_inc(proto_perl->Iofsgv, param);
bd81e77b
NC
12916 PL_stdingv = gv_dup(proto_perl->Istdingv, param);
12917 PL_stderrgv = gv_dup(proto_perl->Istderrgv, param);
12918 PL_defgv = gv_dup(proto_perl->Idefgv, param);
12919 PL_argvgv = gv_dup(proto_perl->Iargvgv, param);
12920 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv, param);
12921 PL_argvout_stack = av_dup_inc(proto_perl->Iargvout_stack, param);
1d7c1841 12922
bd81e77b
NC
12923 /* shortcuts to regexp stuff */
12924 PL_replgv = gv_dup(proto_perl->Ireplgv, param);
9660f481 12925
bd81e77b
NC
12926 /* shortcuts to misc objects */
12927 PL_errgv = gv_dup(proto_perl->Ierrgv, param);
9660f481 12928
bd81e77b
NC
12929 /* shortcuts to debugging objects */
12930 PL_DBgv = gv_dup(proto_perl->IDBgv, param);
12931 PL_DBline = gv_dup(proto_perl->IDBline, param);
12932 PL_DBsub = gv_dup(proto_perl->IDBsub, param);
12933 PL_DBsingle = sv_dup(proto_perl->IDBsingle, param);
12934 PL_DBtrace = sv_dup(proto_perl->IDBtrace, param);
12935 PL_DBsignal = sv_dup(proto_perl->IDBsignal, param);
9660f481 12936
bd81e77b 12937 /* symbol tables */
907b3e23
DM
12938 PL_defstash = hv_dup_inc(proto_perl->Idefstash, param);
12939 PL_curstash = hv_dup(proto_perl->Icurstash, param);
bd81e77b
NC
12940 PL_debstash = hv_dup(proto_perl->Idebstash, param);
12941 PL_globalstash = hv_dup(proto_perl->Iglobalstash, param);
12942 PL_curstname = sv_dup_inc(proto_perl->Icurstname, param);
12943
12944 PL_beginav = av_dup_inc(proto_perl->Ibeginav, param);
12945 PL_beginav_save = av_dup_inc(proto_perl->Ibeginav_save, param);
12946 PL_checkav_save = av_dup_inc(proto_perl->Icheckav_save, param);
3c10abe3
AG
12947 PL_unitcheckav = av_dup_inc(proto_perl->Iunitcheckav, param);
12948 PL_unitcheckav_save = av_dup_inc(proto_perl->Iunitcheckav_save, param);
bd81e77b
NC
12949 PL_endav = av_dup_inc(proto_perl->Iendav, param);
12950 PL_checkav = av_dup_inc(proto_perl->Icheckav, param);
12951 PL_initav = av_dup_inc(proto_perl->Iinitav, param);
12952
12953 PL_sub_generation = proto_perl->Isub_generation;
dd69841b 12954 PL_isarev = hv_dup_inc(proto_perl->Iisarev, param);
bd81e77b
NC
12955
12956 /* funky return mechanisms */
12957 PL_forkprocess = proto_perl->Iforkprocess;
12958
12959 /* subprocess state */
12960 PL_fdpid = av_dup_inc(proto_perl->Ifdpid, param);
12961
12962 /* internal state */
12963 PL_maxo = proto_perl->Imaxo;
12964 if (proto_perl->Iop_mask)
12965 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
12966 else
bd61b366 12967 PL_op_mask = NULL;
bd81e77b
NC
12968 /* PL_asserting = proto_perl->Iasserting; */
12969
12970 /* current interpreter roots */
12971 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv, param);
d3c72c2a 12972 OP_REFCNT_LOCK;
bd81e77b 12973 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
d3c72c2a 12974 OP_REFCNT_UNLOCK;
bd81e77b
NC
12975 PL_main_start = proto_perl->Imain_start;
12976 PL_eval_root = proto_perl->Ieval_root;
12977 PL_eval_start = proto_perl->Ieval_start;
12978
12979 /* runtime control stuff */
12980 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
bd81e77b
NC
12981
12982 PL_filemode = proto_perl->Ifilemode;
12983 PL_lastfd = proto_perl->Ilastfd;
12984 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
12985 PL_Argv = NULL;
bd61b366 12986 PL_Cmd = NULL;
bd81e77b 12987 PL_gensym = proto_perl->Igensym;
bd81e77b
NC
12988 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav, param);
12989 PL_laststatval = proto_perl->Ilaststatval;
12990 PL_laststype = proto_perl->Ilaststype;
a0714e2c 12991 PL_mess_sv = NULL;
bd81e77b
NC
12992
12993 PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv, param);
12994
12995 /* interpreter atexit processing */
12996 PL_exitlistlen = proto_perl->Iexitlistlen;
12997 if (PL_exitlistlen) {
12998 Newx(PL_exitlist, PL_exitlistlen, PerlExitListEntry);
12999 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
9660f481 13000 }
bd81e77b
NC
13001 else
13002 PL_exitlist = (PerlExitListEntry*)NULL;
f16dd614
DM
13003
13004 PL_my_cxt_size = proto_perl->Imy_cxt_size;
4c901e72 13005 if (PL_my_cxt_size) {
f16dd614
DM
13006 Newx(PL_my_cxt_list, PL_my_cxt_size, void *);
13007 Copy(proto_perl->Imy_cxt_list, PL_my_cxt_list, PL_my_cxt_size, void *);
53d44271 13008#ifdef PERL_GLOBAL_STRUCT_PRIVATE
bae1192d 13009 Newx(PL_my_cxt_keys, PL_my_cxt_size, const char *);
53d44271
JH
13010 Copy(proto_perl->Imy_cxt_keys, PL_my_cxt_keys, PL_my_cxt_size, char *);
13011#endif
f16dd614 13012 }
53d44271 13013 else {
f16dd614 13014 PL_my_cxt_list = (void**)NULL;
53d44271 13015#ifdef PERL_GLOBAL_STRUCT_PRIVATE
bae1192d 13016 PL_my_cxt_keys = (const char**)NULL;
53d44271
JH
13017#endif
13018 }
bd81e77b
NC
13019 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal, param);
13020 PL_custom_op_names = hv_dup_inc(proto_perl->Icustom_op_names,param);
13021 PL_custom_op_descs = hv_dup_inc(proto_perl->Icustom_op_descs,param);
1830b3d9 13022 PL_custom_ops = hv_dup_inc(proto_perl->Icustom_ops, param);
bd81e77b
NC
13023
13024 PL_profiledata = NULL;
9660f481 13025
bd81e77b 13026 PL_compcv = cv_dup(proto_perl->Icompcv, param);
9660f481 13027
bd81e77b 13028 PAD_CLONE_VARS(proto_perl, param);
9660f481 13029
bd81e77b
NC
13030#ifdef HAVE_INTERP_INTERN
13031 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
13032#endif
645c22ef 13033
bd81e77b
NC
13034 /* more statics moved here */
13035 PL_generation = proto_perl->Igeneration;
13036 PL_DBcv = cv_dup(proto_perl->IDBcv, param);
645c22ef 13037
bd81e77b
NC
13038 PL_in_clean_objs = proto_perl->Iin_clean_objs;
13039 PL_in_clean_all = proto_perl->Iin_clean_all;
6a78b4db 13040
bd81e77b
NC
13041 PL_uid = proto_perl->Iuid;
13042 PL_euid = proto_perl->Ieuid;
13043 PL_gid = proto_perl->Igid;
13044 PL_egid = proto_perl->Iegid;
13045 PL_nomemok = proto_perl->Inomemok;
13046 PL_an = proto_perl->Ian;
13047 PL_evalseq = proto_perl->Ievalseq;
13048 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
13049 PL_origalen = proto_perl->Iorigalen;
13050#ifdef PERL_USES_PL_PIDSTATUS
13051 PL_pidstatus = newHV(); /* XXX flag for cloning? */
13052#endif
13053 PL_osname = SAVEPV(proto_perl->Iosname);
13054 PL_sighandlerp = proto_perl->Isighandlerp;
6a78b4db 13055
bd81e77b 13056 PL_runops = proto_perl->Irunops;
6a78b4db 13057
199e78b7
DM
13058 PL_parser = parser_dup(proto_perl->Iparser, param);
13059
f0c5aa00
DM
13060 /* XXX this only works if the saved cop has already been cloned */
13061 if (proto_perl->Iparser) {
13062 PL_parser->saved_curcop = (COP*)any_dup(
13063 proto_perl->Iparser->saved_curcop,
13064 proto_perl);
13065 }
13066
bd81e77b
NC
13067 PL_subline = proto_perl->Isubline;
13068 PL_subname = sv_dup_inc(proto_perl->Isubname, param);
c43294b8 13069
bd81e77b
NC
13070#ifdef FCRYPT
13071 PL_cryptseen = proto_perl->Icryptseen;
13072#endif
1d7c1841 13073
bd81e77b 13074 PL_hints = proto_perl->Ihints;
1d7c1841 13075
bd81e77b 13076 PL_amagic_generation = proto_perl->Iamagic_generation;
d2d73c3e 13077
bd81e77b
NC
13078#ifdef USE_LOCALE_COLLATE
13079 PL_collation_ix = proto_perl->Icollation_ix;
13080 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
13081 PL_collation_standard = proto_perl->Icollation_standard;
13082 PL_collxfrm_base = proto_perl->Icollxfrm_base;
13083 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
13084#endif /* USE_LOCALE_COLLATE */
1d7c1841 13085
bd81e77b
NC
13086#ifdef USE_LOCALE_NUMERIC
13087 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
13088 PL_numeric_standard = proto_perl->Inumeric_standard;
13089 PL_numeric_local = proto_perl->Inumeric_local;
13090 PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
13091#endif /* !USE_LOCALE_NUMERIC */
1d7c1841 13092
bd81e77b
NC
13093 /* utf8 character classes */
13094 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum, param);
bd81e77b
NC
13095 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii, param);
13096 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha, param);
13097 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space, param);
13098 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
13099 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph, param);
13100 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit, param);
13101 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper, param);
13102 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower, param);
13103 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print, param);
13104 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct, param);
13105 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
13106 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark, param);
37e2e78e
KW
13107 PL_utf8_X_begin = sv_dup_inc(proto_perl->Iutf8_X_begin, param);
13108 PL_utf8_X_extend = sv_dup_inc(proto_perl->Iutf8_X_extend, param);
13109 PL_utf8_X_prepend = sv_dup_inc(proto_perl->Iutf8_X_prepend, param);
13110 PL_utf8_X_non_hangul = sv_dup_inc(proto_perl->Iutf8_X_non_hangul, param);
13111 PL_utf8_X_L = sv_dup_inc(proto_perl->Iutf8_X_L, param);
13112 PL_utf8_X_LV = sv_dup_inc(proto_perl->Iutf8_X_LV, param);
13113 PL_utf8_X_LVT = sv_dup_inc(proto_perl->Iutf8_X_LVT, param);
13114 PL_utf8_X_T = sv_dup_inc(proto_perl->Iutf8_X_T, param);
13115 PL_utf8_X_V = sv_dup_inc(proto_perl->Iutf8_X_V, param);
13116 PL_utf8_X_LV_LVT_V = sv_dup_inc(proto_perl->Iutf8_X_LV_LVT_V, param);
bd81e77b
NC
13117 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper, param);
13118 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle, param);
13119 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower, param);
13120 PL_utf8_tofold = sv_dup_inc(proto_perl->Iutf8_tofold, param);
13121 PL_utf8_idstart = sv_dup_inc(proto_perl->Iutf8_idstart, param);
c11ff943 13122 PL_utf8_xidstart = sv_dup_inc(proto_perl->Iutf8_xidstart, param);
bd81e77b 13123 PL_utf8_idcont = sv_dup_inc(proto_perl->Iutf8_idcont, param);
c11ff943 13124 PL_utf8_xidcont = sv_dup_inc(proto_perl->Iutf8_xidcont, param);
377157fd 13125 PL_utf8_foldable = hv_dup_inc(proto_perl->Iutf8_foldable, param);
1d7c1841 13126
bd81e77b
NC
13127 /* Did the locale setup indicate UTF-8? */
13128 PL_utf8locale = proto_perl->Iutf8locale;
13129 /* Unicode features (see perlrun/-C) */
13130 PL_unicode = proto_perl->Iunicode;
1d7c1841 13131
bd81e77b
NC
13132 /* Pre-5.8 signals control */
13133 PL_signals = proto_perl->Isignals;
1d7c1841 13134
bd81e77b
NC
13135 /* times() ticks per second */
13136 PL_clocktick = proto_perl->Iclocktick;
1d7c1841 13137
bd81e77b
NC
13138 /* Recursion stopper for PerlIO_find_layer */
13139 PL_in_load_module = proto_perl->Iin_load_module;
8df990a8 13140
bd81e77b
NC
13141 /* sort() routine */
13142 PL_sort_RealCmp = proto_perl->Isort_RealCmp;
e5dd39fc 13143
bd81e77b
NC
13144 /* Not really needed/useful since the reenrant_retint is "volatile",
13145 * but do it for consistency's sake. */
13146 PL_reentrant_retint = proto_perl->Ireentrant_retint;
1d7c1841 13147
bd81e77b
NC
13148 /* Hooks to shared SVs and locks. */
13149 PL_sharehook = proto_perl->Isharehook;
13150 PL_lockhook = proto_perl->Ilockhook;
13151 PL_unlockhook = proto_perl->Iunlockhook;
13152 PL_threadhook = proto_perl->Ithreadhook;
eba16661 13153 PL_destroyhook = proto_perl->Idestroyhook;
92f022bb 13154 PL_signalhook = proto_perl->Isignalhook;
1d7c1841 13155
bd81e77b
NC
13156#ifdef THREADS_HAVE_PIDS
13157 PL_ppid = proto_perl->Ippid;
13158#endif
1d7c1841 13159
bd81e77b 13160 /* swatch cache */
5c284bb0 13161 PL_last_swash_hv = NULL; /* reinits on demand */
bd81e77b
NC
13162 PL_last_swash_klen = 0;
13163 PL_last_swash_key[0]= '\0';
13164 PL_last_swash_tmps = (U8*)NULL;
13165 PL_last_swash_slen = 0;
1d7c1841 13166
bd81e77b
NC
13167 PL_glob_index = proto_perl->Iglob_index;
13168 PL_srand_called = proto_perl->Isrand_called;
05ec9bb3 13169
bd81e77b
NC
13170 if (proto_perl->Ipsig_pend) {
13171 Newxz(PL_psig_pend, SIG_SIZE, int);
13172 }
13173 else {
13174 PL_psig_pend = (int*)NULL;
13175 }
05ec9bb3 13176
d525a7b2
NC
13177 if (proto_perl->Ipsig_name) {
13178 Newx(PL_psig_name, 2 * SIG_SIZE, SV*);
13179 sv_dup_inc_multiple(proto_perl->Ipsig_name, PL_psig_name, 2 * SIG_SIZE,
538f2e76 13180 param);
d525a7b2 13181 PL_psig_ptr = PL_psig_name + SIG_SIZE;
bd81e77b
NC
13182 }
13183 else {
13184 PL_psig_ptr = (SV**)NULL;
13185 PL_psig_name = (SV**)NULL;
13186 }
05ec9bb3 13187
907b3e23 13188 /* intrpvar.h stuff */
1d7c1841 13189
bd81e77b
NC
13190 if (flags & CLONEf_COPY_STACKS) {
13191 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
907b3e23
DM
13192 PL_tmps_ix = proto_perl->Itmps_ix;
13193 PL_tmps_max = proto_perl->Itmps_max;
13194 PL_tmps_floor = proto_perl->Itmps_floor;
e92c6be8 13195 Newx(PL_tmps_stack, PL_tmps_max, SV*);
1d8a41fe
JD
13196 sv_dup_inc_multiple(proto_perl->Itmps_stack, PL_tmps_stack,
13197 PL_tmps_ix+1, param);
d2d73c3e 13198
bd81e77b 13199 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
907b3e23 13200 i = proto_perl->Imarkstack_max - proto_perl->Imarkstack;
bd81e77b 13201 Newxz(PL_markstack, i, I32);
907b3e23
DM
13202 PL_markstack_max = PL_markstack + (proto_perl->Imarkstack_max
13203 - proto_perl->Imarkstack);
13204 PL_markstack_ptr = PL_markstack + (proto_perl->Imarkstack_ptr
13205 - proto_perl->Imarkstack);
13206 Copy(proto_perl->Imarkstack, PL_markstack,
bd81e77b 13207 PL_markstack_ptr - PL_markstack + 1, I32);
d2d73c3e 13208
bd81e77b
NC
13209 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
13210 * NOTE: unlike the others! */
907b3e23
DM
13211 PL_scopestack_ix = proto_perl->Iscopestack_ix;
13212 PL_scopestack_max = proto_perl->Iscopestack_max;
bd81e77b 13213 Newxz(PL_scopestack, PL_scopestack_max, I32);
907b3e23 13214 Copy(proto_perl->Iscopestack, PL_scopestack, PL_scopestack_ix, I32);
d419787a 13215
cbdd5331
JD
13216#ifdef DEBUGGING
13217 Newxz(PL_scopestack_name, PL_scopestack_max, const char *);
13218 Copy(proto_perl->Iscopestack_name, PL_scopestack_name, PL_scopestack_ix, const char *);
13219#endif
bd81e77b 13220 /* NOTE: si_dup() looks at PL_markstack */
907b3e23 13221 PL_curstackinfo = si_dup(proto_perl->Icurstackinfo, param);
d2d73c3e 13222
bd81e77b 13223 /* PL_curstack = PL_curstackinfo->si_stack; */
907b3e23
DM
13224 PL_curstack = av_dup(proto_perl->Icurstack, param);
13225 PL_mainstack = av_dup(proto_perl->Imainstack, param);
1d7c1841 13226
bd81e77b
NC
13227 /* next PUSHs() etc. set *(PL_stack_sp+1) */
13228 PL_stack_base = AvARRAY(PL_curstack);
907b3e23
DM
13229 PL_stack_sp = PL_stack_base + (proto_perl->Istack_sp
13230 - proto_perl->Istack_base);
bd81e77b 13231 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
1d7c1841 13232
bd81e77b
NC
13233 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
13234 * NOTE: unlike the others! */
907b3e23
DM
13235 PL_savestack_ix = proto_perl->Isavestack_ix;
13236 PL_savestack_max = proto_perl->Isavestack_max;
bd81e77b
NC
13237 /*Newxz(PL_savestack, PL_savestack_max, ANY);*/
13238 PL_savestack = ss_dup(proto_perl, param);
13239 }
13240 else {
13241 init_stacks();
13242 ENTER; /* perl_destruct() wants to LEAVE; */
13243 }
1d7c1841 13244
907b3e23 13245 PL_start_env = proto_perl->Istart_env; /* XXXXXX */
bd81e77b 13246 PL_top_env = &PL_start_env;
1d7c1841 13247
907b3e23 13248 PL_op = proto_perl->Iop;
4a4c6fe3 13249
a0714e2c 13250 PL_Sv = NULL;
bd81e77b 13251 PL_Xpv = (XPV*)NULL;
24792b8d 13252 my_perl->Ina = proto_perl->Ina;
1fcf4c12 13253
907b3e23
DM
13254 PL_statbuf = proto_perl->Istatbuf;
13255 PL_statcache = proto_perl->Istatcache;
13256 PL_statgv = gv_dup(proto_perl->Istatgv, param);
13257 PL_statname = sv_dup_inc(proto_perl->Istatname, param);
bd81e77b 13258#ifdef HAS_TIMES
907b3e23 13259 PL_timesbuf = proto_perl->Itimesbuf;
bd81e77b 13260#endif
1d7c1841 13261
907b3e23
DM
13262 PL_tainted = proto_perl->Itainted;
13263 PL_curpm = proto_perl->Icurpm; /* XXX No PMOP ref count */
13264 PL_rs = sv_dup_inc(proto_perl->Irs, param);
13265 PL_last_in_gv = gv_dup(proto_perl->Ilast_in_gv, param);
907b3e23
DM
13266 PL_defoutgv = gv_dup_inc(proto_perl->Idefoutgv, param);
13267 PL_chopset = proto_perl->Ichopset; /* XXX never deallocated */
13268 PL_toptarget = sv_dup_inc(proto_perl->Itoptarget, param);
13269 PL_bodytarget = sv_dup_inc(proto_perl->Ibodytarget, param);
13270 PL_formtarget = sv_dup(proto_perl->Iformtarget, param);
13271
febb3a6d 13272 PL_restartjmpenv = proto_perl->Irestartjmpenv;
907b3e23
DM
13273 PL_restartop = proto_perl->Irestartop;
13274 PL_in_eval = proto_perl->Iin_eval;
13275 PL_delaymagic = proto_perl->Idelaymagic;
9ebf26ad 13276 PL_phase = proto_perl->Iphase;
907b3e23
DM
13277 PL_localizing = proto_perl->Ilocalizing;
13278
13279 PL_errors = sv_dup_inc(proto_perl->Ierrors, param);
4608196e 13280 PL_hv_fetch_ent_mh = NULL;
907b3e23 13281 PL_modcount = proto_perl->Imodcount;
5f66b61c 13282 PL_lastgotoprobe = NULL;
907b3e23 13283 PL_dumpindent = proto_perl->Idumpindent;
1d7c1841 13284
907b3e23
DM
13285 PL_sortcop = (OP*)any_dup(proto_perl->Isortcop, proto_perl);
13286 PL_sortstash = hv_dup(proto_perl->Isortstash, param);
13287 PL_firstgv = gv_dup(proto_perl->Ifirstgv, param);
13288 PL_secondgv = gv_dup(proto_perl->Isecondgv, param);
bd61b366 13289 PL_efloatbuf = NULL; /* reinits on demand */
bd81e77b 13290 PL_efloatsize = 0; /* reinits on demand */
d2d73c3e 13291
bd81e77b 13292 /* regex stuff */
1d7c1841 13293
bd81e77b
NC
13294 PL_screamfirst = NULL;
13295 PL_screamnext = NULL;
13296 PL_maxscream = -1; /* reinits on demand */
a0714e2c 13297 PL_lastscream = NULL;
1d7c1841 13298
1d7c1841 13299
907b3e23 13300 PL_regdummy = proto_perl->Iregdummy;
bd81e77b
NC
13301 PL_colorset = 0; /* reinits PL_colors[] */
13302 /*PL_colors[6] = {0,0,0,0,0,0};*/
1d7c1841 13303
84da74a7 13304
1d7c1841 13305
bd81e77b 13306 /* Pluggable optimizer */
907b3e23 13307 PL_peepp = proto_perl->Ipeepp;
1a0a2ba9 13308 PL_rpeepp = proto_perl->Irpeepp;
f37b8c3f
VP
13309 /* op_free() hook */
13310 PL_opfreehook = proto_perl->Iopfreehook;
1d7c1841 13311
bd81e77b 13312 PL_stashcache = newHV();
1d7c1841 13313
b7185faf 13314 PL_watchaddr = (char **) ptr_table_fetch(PL_ptr_table,
907b3e23 13315 proto_perl->Iwatchaddr);
b7185faf
DM
13316 PL_watchok = PL_watchaddr ? * PL_watchaddr : NULL;
13317 if (PL_debug && PL_watchaddr) {
13318 PerlIO_printf(Perl_debug_log,
13319 "WATCHING: %"UVxf" cloned as %"UVxf" with value %"UVxf"\n",
907b3e23 13320 PTR2UV(proto_perl->Iwatchaddr), PTR2UV(PL_watchaddr),
b7185faf
DM
13321 PTR2UV(PL_watchok));
13322 }
13323
a3e6e81e 13324 PL_registered_mros = hv_dup_inc(proto_perl->Iregistered_mros, param);
1930840b 13325 PL_blockhooks = av_dup_inc(proto_perl->Iblockhooks, param);
2726813d 13326 PL_utf8_foldclosures = hv_dup_inc(proto_perl->Iutf8_foldclosures, param);
a3e6e81e 13327
bd81e77b
NC
13328 /* Call the ->CLONE method, if it exists, for each of the stashes
13329 identified by sv_dup() above.
13330 */
13331 while(av_len(param->stashes) != -1) {
85fbaab2 13332 HV* const stash = MUTABLE_HV(av_shift(param->stashes));
bd81e77b
NC
13333 GV* const cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
13334 if (cloner && GvCV(cloner)) {
13335 dSP;
13336 ENTER;
13337 SAVETMPS;
13338 PUSHMARK(SP);
6e449a3a 13339 mXPUSHs(newSVhek(HvNAME_HEK(stash)));
bd81e77b 13340 PUTBACK;
daba3364 13341 call_sv(MUTABLE_SV(GvCV(cloner)), G_DISCARD);
bd81e77b
NC
13342 FREETMPS;
13343 LEAVE;
13344 }
1d7c1841 13345 }
1d7c1841 13346
b0b93b3c
DM
13347 if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
13348 ptr_table_free(PL_ptr_table);
13349 PL_ptr_table = NULL;
13350 }
13351
d08d57ef 13352 if (!(flags & CLONEf_COPY_STACKS)) {
e4295668 13353 unreferenced_to_tmp_stack(param->unreferenced);
d08d57ef 13354 }
b0b93b3c 13355
bd81e77b 13356 SvREFCNT_dec(param->stashes);
1d7c1841 13357
bd81e77b
NC
13358 /* orphaned? eg threads->new inside BEGIN or use */
13359 if (PL_compcv && ! SvREFCNT(PL_compcv)) {
b37c2d43 13360 SvREFCNT_inc_simple_void(PL_compcv);
bd81e77b
NC
13361 SAVEFREESV(PL_compcv);
13362 }
dd2155a4 13363
bd81e77b
NC
13364 return my_perl;
13365}
1d7c1841 13366
e4295668
NC
13367static void
13368S_unreferenced_to_tmp_stack(pTHX_ AV *const unreferenced)
13369{
13370 PERL_ARGS_ASSERT_UNREFERENCED_TO_TMP_STACK;
13371
13372 if (AvFILLp(unreferenced) > -1) {
13373 SV **svp = AvARRAY(unreferenced);
13374 SV **const last = svp + AvFILLp(unreferenced);
13375 SSize_t count = 0;
13376
13377 do {
04518cc3 13378 if (SvREFCNT(*svp) == 1)
e4295668
NC
13379 ++count;
13380 } while (++svp <= last);
13381
13382 EXTEND_MORTAL(count);
13383 svp = AvARRAY(unreferenced);
13384
13385 do {
04518cc3
NC
13386 if (SvREFCNT(*svp) == 1) {
13387 /* Our reference is the only one to this SV. This means that
13388 in this thread, the scalar effectively has a 0 reference.
13389 That doesn't work (cleanup never happens), so donate our
13390 reference to it onto the save stack. */
13391 PL_tmps_stack[++PL_tmps_ix] = *svp;
13392 } else {
13393 /* As an optimisation, because we are already walking the
13394 entire array, instead of above doing either
13395 SvREFCNT_inc(*svp) or *svp = &PL_sv_undef, we can instead
13396 release our reference to the scalar, so that at the end of
13397 the array owns zero references to the scalars it happens to
13398 point to. We are effectively converting the array from
13399 AvREAL() on to AvREAL() off. This saves the av_clear()
13400 (triggered by the SvREFCNT_dec(unreferenced) below) from
13401 walking the array a second time. */
13402 SvREFCNT_dec(*svp);
13403 }
13404
e4295668 13405 } while (++svp <= last);
04518cc3 13406 AvREAL_off(unreferenced);
e4295668
NC
13407 }
13408 SvREFCNT_dec(unreferenced);
13409}
13410
f7abe70b
NC
13411void
13412Perl_clone_params_del(CLONE_PARAMS *param)
13413{
90d4a638
NC
13414 /* This seemingly funky ordering keeps the build with PERL_GLOBAL_STRUCT
13415 happy: */
1db366cc
NC
13416 PerlInterpreter *const to = param->new_perl;
13417 dTHXa(to);
90d4a638 13418 PerlInterpreter *const was = PERL_GET_THX;
f7abe70b
NC
13419
13420 PERL_ARGS_ASSERT_CLONE_PARAMS_DEL;
13421
1db366cc
NC
13422 if (was != to) {
13423 PERL_SET_THX(to);
13424 }
f7abe70b 13425
1db366cc 13426 SvREFCNT_dec(param->stashes);
e4295668
NC
13427 if (param->unreferenced)
13428 unreferenced_to_tmp_stack(param->unreferenced);
f7abe70b 13429
1db366cc 13430 Safefree(param);
f7abe70b 13431
1db366cc
NC
13432 if (was != to) {
13433 PERL_SET_THX(was);
f7abe70b
NC
13434 }
13435}
13436
13437CLONE_PARAMS *
13438Perl_clone_params_new(PerlInterpreter *const from, PerlInterpreter *const to)
13439{
90d4a638 13440 dVAR;
f7abe70b
NC
13441 /* Need to play this game, as newAV() can call safesysmalloc(), and that
13442 does a dTHX; to get the context from thread local storage.
13443 FIXME - under PERL_CORE Newx(), Safefree() and friends should expand to
13444 a version that passes in my_perl. */
13445 PerlInterpreter *const was = PERL_GET_THX;
13446 CLONE_PARAMS *param;
f7abe70b
NC
13447
13448 PERL_ARGS_ASSERT_CLONE_PARAMS_NEW;
13449
13450 if (was != to) {
13451 PERL_SET_THX(to);
13452 }
13453
13454 /* Given that we've set the context, we can do this unshared. */
13455 Newx(param, 1, CLONE_PARAMS);
13456
13457 param->flags = 0;
13458 param->proto_perl = from;
1db366cc 13459 param->new_perl = to;
f7abe70b
NC
13460 param->stashes = (AV *)Perl_newSV_type(to, SVt_PVAV);
13461 AvREAL_off(param->stashes);
d08d57ef 13462 param->unreferenced = (AV *)Perl_newSV_type(to, SVt_PVAV);
f7abe70b 13463
f7abe70b
NC
13464 if (was != to) {
13465 PERL_SET_THX(was);
13466 }
13467 return param;
13468}
13469
bd81e77b 13470#endif /* USE_ITHREADS */
1d7c1841 13471
bd81e77b
NC
13472/*
13473=head1 Unicode Support
1d7c1841 13474
bd81e77b 13475=for apidoc sv_recode_to_utf8
1d7c1841 13476
bd81e77b
NC
13477The encoding is assumed to be an Encode object, on entry the PV
13478of the sv is assumed to be octets in that encoding, and the sv
13479will be converted into Unicode (and UTF-8).
1d7c1841 13480
bd81e77b
NC
13481If the sv already is UTF-8 (or if it is not POK), or if the encoding
13482is not a reference, nothing is done to the sv. If the encoding is not
13483an C<Encode::XS> Encoding object, bad things will happen.
13484(See F<lib/encoding.pm> and L<Encode>).
1d7c1841 13485
bd81e77b 13486The PV of the sv is returned.
1d7c1841 13487
bd81e77b 13488=cut */
1d7c1841 13489
bd81e77b
NC
13490char *
13491Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
13492{
13493 dVAR;
7918f24d
NC
13494
13495 PERL_ARGS_ASSERT_SV_RECODE_TO_UTF8;
13496
bd81e77b
NC
13497 if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
13498 SV *uni;
13499 STRLEN len;
13500 const char *s;
13501 dSP;
13502 ENTER;
13503 SAVETMPS;
13504 save_re_context();
13505 PUSHMARK(sp);
13506 EXTEND(SP, 3);
13507 XPUSHs(encoding);
13508 XPUSHs(sv);
13509/*
13510 NI-S 2002/07/09
13511 Passing sv_yes is wrong - it needs to be or'ed set of constants
13512 for Encode::XS, while UTf-8 decode (currently) assumes a true value means
13513 remove converted chars from source.
1d7c1841 13514
bd81e77b 13515 Both will default the value - let them.
1d7c1841 13516
bd81e77b
NC
13517 XPUSHs(&PL_sv_yes);
13518*/
13519 PUTBACK;
13520 call_method("decode", G_SCALAR);
13521 SPAGAIN;
13522 uni = POPs;
13523 PUTBACK;
13524 s = SvPV_const(uni, len);
13525 if (s != SvPVX_const(sv)) {
13526 SvGROW(sv, len + 1);
13527 Move(s, SvPVX(sv), len + 1, char);
13528 SvCUR_set(sv, len);
13529 }
13530 FREETMPS;
13531 LEAVE;
13532 SvUTF8_on(sv);
13533 return SvPVX(sv);
389edf32 13534 }
bd81e77b
NC
13535 return SvPOKp(sv) ? SvPVX(sv) : NULL;
13536}
1d7c1841 13537
bd81e77b
NC
13538/*
13539=for apidoc sv_cat_decode
1d7c1841 13540
bd81e77b
NC
13541The encoding is assumed to be an Encode object, the PV of the ssv is
13542assumed to be octets in that encoding and decoding the input starts
13543from the position which (PV + *offset) pointed to. The dsv will be
13544concatenated the decoded UTF-8 string from ssv. Decoding will terminate
13545when the string tstr appears in decoding output or the input ends on
13546the PV of the ssv. The value which the offset points will be modified
13547to the last input position on the ssv.
1d7c1841 13548
bd81e77b 13549Returns TRUE if the terminator was found, else returns FALSE.
1d7c1841 13550
bd81e77b
NC
13551=cut */
13552
13553bool
13554Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
13555 SV *ssv, int *offset, char *tstr, int tlen)
13556{
13557 dVAR;
13558 bool ret = FALSE;
7918f24d
NC
13559
13560 PERL_ARGS_ASSERT_SV_CAT_DECODE;
13561
bd81e77b
NC
13562 if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) {
13563 SV *offsv;
13564 dSP;
13565 ENTER;
13566 SAVETMPS;
13567 save_re_context();
13568 PUSHMARK(sp);
13569 EXTEND(SP, 6);
13570 XPUSHs(encoding);
13571 XPUSHs(dsv);
13572 XPUSHs(ssv);
6e449a3a
MHM
13573 offsv = newSViv(*offset);
13574 mXPUSHs(offsv);
13575 mXPUSHp(tstr, tlen);
bd81e77b
NC
13576 PUTBACK;
13577 call_method("cat_decode", G_SCALAR);
13578 SPAGAIN;
13579 ret = SvTRUE(TOPs);
13580 *offset = SvIV(offsv);
13581 PUTBACK;
13582 FREETMPS;
13583 LEAVE;
389edf32 13584 }
bd81e77b
NC
13585 else
13586 Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
13587 return ret;
1d7c1841 13588
bd81e77b 13589}
1d7c1841 13590
bd81e77b
NC
13591/* ---------------------------------------------------------------------
13592 *
13593 * support functions for report_uninit()
13594 */
1d7c1841 13595
bd81e77b
NC
13596/* the maxiumum size of array or hash where we will scan looking
13597 * for the undefined element that triggered the warning */
1d7c1841 13598
bd81e77b 13599#define FUV_MAX_SEARCH_SIZE 1000
1d7c1841 13600
bd81e77b
NC
13601/* Look for an entry in the hash whose value has the same SV as val;
13602 * If so, return a mortal copy of the key. */
1d7c1841 13603
bd81e77b 13604STATIC SV*
6c1b357c 13605S_find_hash_subscript(pTHX_ const HV *const hv, const SV *const val)
bd81e77b
NC
13606{
13607 dVAR;
13608 register HE **array;
13609 I32 i;
6c3182a5 13610
7918f24d
NC
13611 PERL_ARGS_ASSERT_FIND_HASH_SUBSCRIPT;
13612
bd81e77b
NC
13613 if (!hv || SvMAGICAL(hv) || !HvARRAY(hv) ||
13614 (HvTOTALKEYS(hv) > FUV_MAX_SEARCH_SIZE))
a0714e2c 13615 return NULL;
6c3182a5 13616
bd81e77b 13617 array = HvARRAY(hv);
6c3182a5 13618
bd81e77b
NC
13619 for (i=HvMAX(hv); i>0; i--) {
13620 register HE *entry;
13621 for (entry = array[i]; entry; entry = HeNEXT(entry)) {
13622 if (HeVAL(entry) != val)
13623 continue;
13624 if ( HeVAL(entry) == &PL_sv_undef ||
13625 HeVAL(entry) == &PL_sv_placeholder)
13626 continue;
13627 if (!HeKEY(entry))
a0714e2c 13628 return NULL;
bd81e77b
NC
13629 if (HeKLEN(entry) == HEf_SVKEY)
13630 return sv_mortalcopy(HeKEY_sv(entry));
a663657d 13631 return sv_2mortal(newSVhek(HeKEY_hek(entry)));
bd81e77b
NC
13632 }
13633 }
a0714e2c 13634 return NULL;
bd81e77b 13635}
6c3182a5 13636
bd81e77b
NC
13637/* Look for an entry in the array whose value has the same SV as val;
13638 * If so, return the index, otherwise return -1. */
6c3182a5 13639
bd81e77b 13640STATIC I32
6c1b357c 13641S_find_array_subscript(pTHX_ const AV *const av, const SV *const val)
bd81e77b 13642{
97aff369 13643 dVAR;
7918f24d
NC
13644
13645 PERL_ARGS_ASSERT_FIND_ARRAY_SUBSCRIPT;
13646
bd81e77b
NC
13647 if (!av || SvMAGICAL(av) || !AvARRAY(av) ||
13648 (AvFILLp(av) > FUV_MAX_SEARCH_SIZE))
13649 return -1;
57c6e6d2 13650
4a021917
AL
13651 if (val != &PL_sv_undef) {
13652 SV ** const svp = AvARRAY(av);
13653 I32 i;
13654
13655 for (i=AvFILLp(av); i>=0; i--)
13656 if (svp[i] == val)
13657 return i;
bd81e77b
NC
13658 }
13659 return -1;
13660}
15a5279a 13661
bd81e77b
NC
13662/* S_varname(): return the name of a variable, optionally with a subscript.
13663 * If gv is non-zero, use the name of that global, along with gvtype (one
13664 * of "$", "@", "%"); otherwise use the name of the lexical at pad offset
13665 * targ. Depending on the value of the subscript_type flag, return:
13666 */
bce260cd 13667
bd81e77b
NC
13668#define FUV_SUBSCRIPT_NONE 1 /* "@foo" */
13669#define FUV_SUBSCRIPT_ARRAY 2 /* "$foo[aindex]" */
13670#define FUV_SUBSCRIPT_HASH 3 /* "$foo{keyname}" */
13671#define FUV_SUBSCRIPT_WITHIN 4 /* "within @foo" */
bce260cd 13672
bd81e77b 13673STATIC SV*
6c1b357c
NC
13674S_varname(pTHX_ const GV *const gv, const char gvtype, PADOFFSET targ,
13675 const SV *const keyname, I32 aindex, int subscript_type)
bd81e77b 13676{
1d7c1841 13677
bd81e77b
NC
13678 SV * const name = sv_newmortal();
13679 if (gv) {
13680 char buffer[2];
13681 buffer[0] = gvtype;
13682 buffer[1] = 0;
1d7c1841 13683
bd81e77b 13684 /* as gv_fullname4(), but add literal '^' for $^FOO names */
66fe0623 13685
bd81e77b 13686 gv_fullname4(name, gv, buffer, 0);
1d7c1841 13687
bd81e77b
NC
13688 if ((unsigned int)SvPVX(name)[1] <= 26) {
13689 buffer[0] = '^';
13690 buffer[1] = SvPVX(name)[1] + 'A' - 1;
1d7c1841 13691
bd81e77b
NC
13692 /* Swap the 1 unprintable control character for the 2 byte pretty
13693 version - ie substr($name, 1, 1) = $buffer; */
13694 sv_insert(name, 1, 1, buffer, 2);
1d7c1841 13695 }
bd81e77b
NC
13696 }
13697 else {
289b91d9 13698 CV * const cv = find_runcv(NULL);
bd81e77b
NC
13699 SV *sv;
13700 AV *av;
1d7c1841 13701
bd81e77b 13702 if (!cv || !CvPADLIST(cv))
a0714e2c 13703 return NULL;
502c6561 13704 av = MUTABLE_AV((*av_fetch(CvPADLIST(cv), 0, FALSE)));
bd81e77b 13705 sv = *av_fetch(av, targ, FALSE);
f8503592 13706 sv_setpvn(name, SvPV_nolen_const(sv), SvCUR(sv));
bd81e77b 13707 }
1d7c1841 13708
bd81e77b 13709 if (subscript_type == FUV_SUBSCRIPT_HASH) {
561b68a9 13710 SV * const sv = newSV(0);
bd81e77b
NC
13711 *SvPVX(name) = '$';
13712 Perl_sv_catpvf(aTHX_ name, "{%s}",
13713 pv_display(sv,SvPVX_const(keyname), SvCUR(keyname), 0, 32));
13714 SvREFCNT_dec(sv);
13715 }
13716 else if (subscript_type == FUV_SUBSCRIPT_ARRAY) {
13717 *SvPVX(name) = '$';
13718 Perl_sv_catpvf(aTHX_ name, "[%"IVdf"]", (IV)aindex);
13719 }
84335ee9
NC
13720 else if (subscript_type == FUV_SUBSCRIPT_WITHIN) {
13721 /* We know that name has no magic, so can use 0 instead of SV_GMAGIC */
13722 Perl_sv_insert_flags(aTHX_ name, 0, 0, STR_WITH_LEN("within "), 0);
13723 }
1d7c1841 13724
bd81e77b
NC
13725 return name;
13726}
1d7c1841 13727
1d7c1841 13728
bd81e77b
NC
13729/*
13730=for apidoc find_uninit_var
1d7c1841 13731
bd81e77b
NC
13732Find the name of the undefined variable (if any) that caused the operator o
13733to issue a "Use of uninitialized value" warning.
13734If match is true, only return a name if it's value matches uninit_sv.
13735So roughly speaking, if a unary operator (such as OP_COS) generates a
13736warning, then following the direct child of the op may yield an
13737OP_PADSV or OP_GV that gives the name of the undefined variable. On the
13738other hand, with OP_ADD there are two branches to follow, so we only print
13739the variable name if we get an exact match.
1d7c1841 13740
bd81e77b 13741The name is returned as a mortal SV.
1d7c1841 13742
bd81e77b
NC
13743Assumes that PL_op is the op that originally triggered the error, and that
13744PL_comppad/PL_curpad points to the currently executing pad.
1d7c1841 13745
bd81e77b
NC
13746=cut
13747*/
1d7c1841 13748
bd81e77b 13749STATIC SV *
6c1b357c
NC
13750S_find_uninit_var(pTHX_ const OP *const obase, const SV *const uninit_sv,
13751 bool match)
bd81e77b
NC
13752{
13753 dVAR;
13754 SV *sv;
6c1b357c
NC
13755 const GV *gv;
13756 const OP *o, *o2, *kid;
1d7c1841 13757
bd81e77b
NC
13758 if (!obase || (match && (!uninit_sv || uninit_sv == &PL_sv_undef ||
13759 uninit_sv == &PL_sv_placeholder)))
a0714e2c 13760 return NULL;
1d7c1841 13761
bd81e77b 13762 switch (obase->op_type) {
1d7c1841 13763
bd81e77b
NC
13764 case OP_RV2AV:
13765 case OP_RV2HV:
13766 case OP_PADAV:
13767 case OP_PADHV:
13768 {
13769 const bool pad = (obase->op_type == OP_PADAV || obase->op_type == OP_PADHV);
13770 const bool hash = (obase->op_type == OP_PADHV || obase->op_type == OP_RV2HV);
13771 I32 index = 0;
a0714e2c 13772 SV *keysv = NULL;
bd81e77b 13773 int subscript_type = FUV_SUBSCRIPT_WITHIN;
1d7c1841 13774
bd81e77b
NC
13775 if (pad) { /* @lex, %lex */
13776 sv = PAD_SVl(obase->op_targ);
a0714e2c 13777 gv = NULL;
bd81e77b
NC
13778 }
13779 else {
13780 if (cUNOPx(obase)->op_first->op_type == OP_GV) {
13781 /* @global, %global */
13782 gv = cGVOPx_gv(cUNOPx(obase)->op_first);
13783 if (!gv)
13784 break;
daba3364 13785 sv = hash ? MUTABLE_SV(GvHV(gv)): MUTABLE_SV(GvAV(gv));
bd81e77b
NC
13786 }
13787 else /* @{expr}, %{expr} */
13788 return find_uninit_var(cUNOPx(obase)->op_first,
13789 uninit_sv, match);
13790 }
1d7c1841 13791
bd81e77b
NC
13792 /* attempt to find a match within the aggregate */
13793 if (hash) {
85fbaab2 13794 keysv = find_hash_subscript((const HV*)sv, uninit_sv);
bd81e77b
NC
13795 if (keysv)
13796 subscript_type = FUV_SUBSCRIPT_HASH;
13797 }
13798 else {
502c6561 13799 index = find_array_subscript((const AV *)sv, uninit_sv);
bd81e77b
NC
13800 if (index >= 0)
13801 subscript_type = FUV_SUBSCRIPT_ARRAY;
13802 }
1d7c1841 13803
bd81e77b
NC
13804 if (match && subscript_type == FUV_SUBSCRIPT_WITHIN)
13805 break;
1d7c1841 13806
bd81e77b
NC
13807 return varname(gv, hash ? '%' : '@', obase->op_targ,
13808 keysv, index, subscript_type);
13809 }
1d7c1841 13810
bd81e77b
NC
13811 case OP_PADSV:
13812 if (match && PAD_SVl(obase->op_targ) != uninit_sv)
13813 break;
a0714e2c
SS
13814 return varname(NULL, '$', obase->op_targ,
13815 NULL, 0, FUV_SUBSCRIPT_NONE);
1d7c1841 13816
bd81e77b
NC
13817 case OP_GVSV:
13818 gv = cGVOPx_gv(obase);
249534c3 13819 if (!gv || (match && GvSV(gv) != uninit_sv) || !GvSTASH(gv))
bd81e77b 13820 break;
a0714e2c 13821 return varname(gv, '$', 0, NULL, 0, FUV_SUBSCRIPT_NONE);
1d7c1841 13822
bd81e77b
NC
13823 case OP_AELEMFAST:
13824 if (obase->op_flags & OPf_SPECIAL) { /* lexical array */
13825 if (match) {
13826 SV **svp;
502c6561 13827 AV *av = MUTABLE_AV(PAD_SV(obase->op_targ));
bd81e77b
NC
13828 if (!av || SvRMAGICAL(av))
13829 break;
13830 svp = av_fetch(av, (I32)obase->op_private, FALSE);
13831 if (!svp || *svp != uninit_sv)
13832 break;
13833 }
a0714e2c
SS
13834 return varname(NULL, '$', obase->op_targ,
13835 NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
13836 }
13837 else {
13838 gv = cGVOPx_gv(obase);
13839 if (!gv)
13840 break;
13841 if (match) {
13842 SV **svp;
6c1b357c 13843 AV *const av = GvAV(gv);
bd81e77b
NC
13844 if (!av || SvRMAGICAL(av))
13845 break;
13846 svp = av_fetch(av, (I32)obase->op_private, FALSE);
13847 if (!svp || *svp != uninit_sv)
13848 break;
13849 }
13850 return varname(gv, '$', 0,
a0714e2c 13851 NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
13852 }
13853 break;
1d7c1841 13854
bd81e77b
NC
13855 case OP_EXISTS:
13856 o = cUNOPx(obase)->op_first;
13857 if (!o || o->op_type != OP_NULL ||
13858 ! (o->op_targ == OP_AELEM || o->op_targ == OP_HELEM))
13859 break;
13860 return find_uninit_var(cBINOPo->op_last, uninit_sv, match);
a2efc822 13861
bd81e77b
NC
13862 case OP_AELEM:
13863 case OP_HELEM:
13864 if (PL_op == obase)
13865 /* $a[uninit_expr] or $h{uninit_expr} */
13866 return find_uninit_var(cBINOPx(obase)->op_last, uninit_sv, match);
081fc587 13867
a0714e2c 13868 gv = NULL;
bd81e77b
NC
13869 o = cBINOPx(obase)->op_first;
13870 kid = cBINOPx(obase)->op_last;
8cf8f3d1 13871
bd81e77b 13872 /* get the av or hv, and optionally the gv */
a0714e2c 13873 sv = NULL;
bd81e77b
NC
13874 if (o->op_type == OP_PADAV || o->op_type == OP_PADHV) {
13875 sv = PAD_SV(o->op_targ);
13876 }
13877 else if ((o->op_type == OP_RV2AV || o->op_type == OP_RV2HV)
13878 && cUNOPo->op_first->op_type == OP_GV)
13879 {
13880 gv = cGVOPx_gv(cUNOPo->op_first);
13881 if (!gv)
13882 break;
daba3364
NC
13883 sv = o->op_type
13884 == OP_RV2HV ? MUTABLE_SV(GvHV(gv)) : MUTABLE_SV(GvAV(gv));
bd81e77b
NC
13885 }
13886 if (!sv)
13887 break;
13888
13889 if (kid && kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid))) {
13890 /* index is constant */
13891 if (match) {
13892 if (SvMAGICAL(sv))
13893 break;
13894 if (obase->op_type == OP_HELEM) {
85fbaab2 13895 HE* he = hv_fetch_ent(MUTABLE_HV(sv), cSVOPx_sv(kid), 0, 0);
bd81e77b
NC
13896 if (!he || HeVAL(he) != uninit_sv)
13897 break;
13898 }
13899 else {
502c6561 13900 SV * const * const svp = av_fetch(MUTABLE_AV(sv), SvIV(cSVOPx_sv(kid)), FALSE);
bd81e77b
NC
13901 if (!svp || *svp != uninit_sv)
13902 break;
13903 }
13904 }
13905 if (obase->op_type == OP_HELEM)
13906 return varname(gv, '%', o->op_targ,
13907 cSVOPx_sv(kid), 0, FUV_SUBSCRIPT_HASH);
13908 else
a0714e2c 13909 return varname(gv, '@', o->op_targ, NULL,
bd81e77b 13910 SvIV(cSVOPx_sv(kid)), FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
13911 }
13912 else {
13913 /* index is an expression;
13914 * attempt to find a match within the aggregate */
13915 if (obase->op_type == OP_HELEM) {
85fbaab2 13916 SV * const keysv = find_hash_subscript((const HV*)sv, uninit_sv);
bd81e77b
NC
13917 if (keysv)
13918 return varname(gv, '%', o->op_targ,
13919 keysv, 0, FUV_SUBSCRIPT_HASH);
13920 }
13921 else {
502c6561
NC
13922 const I32 index
13923 = find_array_subscript((const AV *)sv, uninit_sv);
bd81e77b
NC
13924 if (index >= 0)
13925 return varname(gv, '@', o->op_targ,
a0714e2c 13926 NULL, index, FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
13927 }
13928 if (match)
13929 break;
13930 return varname(gv,
13931 (o->op_type == OP_PADAV || o->op_type == OP_RV2AV)
13932 ? '@' : '%',
a0714e2c 13933 o->op_targ, NULL, 0, FUV_SUBSCRIPT_WITHIN);
f284b03f 13934 }
bd81e77b 13935 break;
dc507217 13936
bd81e77b
NC
13937 case OP_AASSIGN:
13938 /* only examine RHS */
13939 return find_uninit_var(cBINOPx(obase)->op_first, uninit_sv, match);
6d26897e 13940
bd81e77b
NC
13941 case OP_OPEN:
13942 o = cUNOPx(obase)->op_first;
13943 if (o->op_type == OP_PUSHMARK)
13944 o = o->op_sibling;
1d7c1841 13945
bd81e77b
NC
13946 if (!o->op_sibling) {
13947 /* one-arg version of open is highly magical */
a0ae6670 13948
bd81e77b
NC
13949 if (o->op_type == OP_GV) { /* open FOO; */
13950 gv = cGVOPx_gv(o);
13951 if (match && GvSV(gv) != uninit_sv)
13952 break;
13953 return varname(gv, '$', 0,
a0714e2c 13954 NULL, 0, FUV_SUBSCRIPT_NONE);
bd81e77b
NC
13955 }
13956 /* other possibilities not handled are:
13957 * open $x; or open my $x; should return '${*$x}'
13958 * open expr; should return '$'.expr ideally
13959 */
13960 break;
13961 }
13962 goto do_op;
ccfc67b7 13963
bd81e77b
NC
13964 /* ops where $_ may be an implicit arg */
13965 case OP_TRANS:
13966 case OP_SUBST:
13967 case OP_MATCH:
13968 if ( !(obase->op_flags & OPf_STACKED)) {
13969 if (uninit_sv == ((obase->op_private & OPpTARGET_MY)
13970 ? PAD_SVl(obase->op_targ)
13971 : DEFSV))
13972 {
13973 sv = sv_newmortal();
76f68e9b 13974 sv_setpvs(sv, "$_");
bd81e77b
NC
13975 return sv;
13976 }
13977 }
13978 goto do_op;
9f4817db 13979
bd81e77b
NC
13980 case OP_PRTF:
13981 case OP_PRINT:
3ef1310e 13982 case OP_SAY:
fa8d1836 13983 match = 1; /* print etc can return undef on defined args */
bd81e77b
NC
13984 /* skip filehandle as it can't produce 'undef' warning */
13985 o = cUNOPx(obase)->op_first;
13986 if ((obase->op_flags & OPf_STACKED) && o->op_type == OP_PUSHMARK)
13987 o = o->op_sibling->op_sibling;
13988 goto do_op2;
9f4817db 13989
9f4817db 13990
50edf520 13991 case OP_ENTEREVAL: /* could be eval $undef or $x='$undef'; eval $x */
bd81e77b 13992 case OP_RV2SV:
8b0dea50
DM
13993 case OP_CUSTOM: /* XS or custom code could trigger random warnings */
13994
13995 /* the following ops are capable of returning PL_sv_undef even for
13996 * defined arg(s) */
13997
13998 case OP_BACKTICK:
13999 case OP_PIPE_OP:
14000 case OP_FILENO:
14001 case OP_BINMODE:
14002 case OP_TIED:
14003 case OP_GETC:
14004 case OP_SYSREAD:
14005 case OP_SEND:
14006 case OP_IOCTL:
14007 case OP_SOCKET:
14008 case OP_SOCKPAIR:
14009 case OP_BIND:
14010 case OP_CONNECT:
14011 case OP_LISTEN:
14012 case OP_ACCEPT:
14013 case OP_SHUTDOWN:
14014 case OP_SSOCKOPT:
14015 case OP_GETPEERNAME:
14016 case OP_FTRREAD:
14017 case OP_FTRWRITE:
14018 case OP_FTREXEC:
14019 case OP_FTROWNED:
14020 case OP_FTEREAD:
14021 case OP_FTEWRITE:
14022 case OP_FTEEXEC:
14023 case OP_FTEOWNED:
14024 case OP_FTIS:
14025 case OP_FTZERO:
14026 case OP_FTSIZE:
14027 case OP_FTFILE:
14028 case OP_FTDIR:
14029 case OP_FTLINK:
14030 case OP_FTPIPE:
14031 case OP_FTSOCK:
14032 case OP_FTBLK:
14033 case OP_FTCHR:
14034 case OP_FTTTY:
14035 case OP_FTSUID:
14036 case OP_FTSGID:
14037 case OP_FTSVTX:
14038 case OP_FTTEXT:
14039 case OP_FTBINARY:
14040 case OP_FTMTIME:
14041 case OP_FTATIME:
14042 case OP_FTCTIME:
14043 case OP_READLINK:
14044 case OP_OPEN_DIR:
14045 case OP_READDIR:
14046 case OP_TELLDIR:
14047 case OP_SEEKDIR:
14048 case OP_REWINDDIR:
14049 case OP_CLOSEDIR:
14050 case OP_GMTIME:
14051 case OP_ALARM:
14052 case OP_SEMGET:
14053 case OP_GETLOGIN:
14054 case OP_UNDEF:
14055 case OP_SUBSTR:
14056 case OP_AEACH:
14057 case OP_EACH:
14058 case OP_SORT:
14059 case OP_CALLER:
14060 case OP_DOFILE:
fa8d1836
DM
14061 case OP_PROTOTYPE:
14062 case OP_NCMP:
14063 case OP_SMARTMATCH:
14064 case OP_UNPACK:
14065 case OP_SYSOPEN:
14066 case OP_SYSSEEK:
8b0dea50 14067 match = 1;
bd81e77b 14068 goto do_op;
9f4817db 14069
7697b7e7
DM
14070 case OP_ENTERSUB:
14071 case OP_GOTO:
a2fb3d36
DM
14072 /* XXX tmp hack: these two may call an XS sub, and currently
14073 XS subs don't have a SUB entry on the context stack, so CV and
14074 pad determination goes wrong, and BAD things happen. So, just
14075 don't try to determine the value under those circumstances.
7697b7e7
DM
14076 Need a better fix at dome point. DAPM 11/2007 */
14077 break;
14078
4f187fc9
VP
14079 case OP_FLIP:
14080 case OP_FLOP:
14081 {
14082 GV * const gv = gv_fetchpvs(".", GV_NOTQUAL, SVt_PV);
14083 if (gv && GvSV(gv) == uninit_sv)
14084 return newSVpvs_flags("$.", SVs_TEMP);
14085 goto do_op;
14086 }
8b0dea50 14087
cc4b8646
DM
14088 case OP_POS:
14089 /* def-ness of rval pos() is independent of the def-ness of its arg */
14090 if ( !(obase->op_flags & OPf_MOD))
14091 break;
14092
bd81e77b
NC
14093 case OP_SCHOMP:
14094 case OP_CHOMP:
14095 if (SvROK(PL_rs) && uninit_sv == SvRV(PL_rs))
84bafc02 14096 return newSVpvs_flags("${$/}", SVs_TEMP);
5f66b61c 14097 /*FALLTHROUGH*/
5d170f3a 14098
bd81e77b
NC
14099 default:
14100 do_op:
14101 if (!(obase->op_flags & OPf_KIDS))
14102 break;
14103 o = cUNOPx(obase)->op_first;
14104
14105 do_op2:
14106 if (!o)
14107 break;
f9893866 14108
bd81e77b
NC
14109 /* if all except one arg are constant, or have no side-effects,
14110 * or are optimized away, then it's unambiguous */
5f66b61c 14111 o2 = NULL;
bd81e77b 14112 for (kid=o; kid; kid = kid->op_sibling) {
e15d5972
AL
14113 if (kid) {
14114 const OPCODE type = kid->op_type;
14115 if ( (type == OP_CONST && SvOK(cSVOPx_sv(kid)))
14116 || (type == OP_NULL && ! (kid->op_flags & OPf_KIDS))
14117 || (type == OP_PUSHMARK)
6d1f0892
FC
14118 || (
14119 /* @$a and %$a, but not @a or %a */
14120 (type == OP_RV2AV || type == OP_RV2HV)
14121 && cUNOPx(kid)->op_first
14122 && cUNOPx(kid)->op_first->op_type != OP_GV
14123 )
bd81e77b 14124 )
bd81e77b 14125 continue;
e15d5972 14126 }
bd81e77b 14127 if (o2) { /* more than one found */
5f66b61c 14128 o2 = NULL;
bd81e77b
NC
14129 break;
14130 }
14131 o2 = kid;
14132 }
14133 if (o2)
14134 return find_uninit_var(o2, uninit_sv, match);
7a5fa8a2 14135
bd81e77b
NC
14136 /* scan all args */
14137 while (o) {
14138 sv = find_uninit_var(o, uninit_sv, 1);
14139 if (sv)
14140 return sv;
14141 o = o->op_sibling;
d0063567 14142 }
bd81e77b 14143 break;
f9893866 14144 }
a0714e2c 14145 return NULL;
9f4817db
JH
14146}
14147
220e2d4e 14148
bd81e77b
NC
14149/*
14150=for apidoc report_uninit
68795e93 14151
bd81e77b 14152Print appropriate "Use of uninitialized variable" warning
220e2d4e 14153
bd81e77b
NC
14154=cut
14155*/
220e2d4e 14156
bd81e77b 14157void
b3dbd76e 14158Perl_report_uninit(pTHX_ const SV *uninit_sv)
220e2d4e 14159{
97aff369 14160 dVAR;
bd81e77b 14161 if (PL_op) {
a0714e2c 14162 SV* varname = NULL;
bd81e77b
NC
14163 if (uninit_sv) {
14164 varname = find_uninit_var(PL_op, uninit_sv,0);
14165 if (varname)
14166 sv_insert(varname, 0, 0, " ", 1);
14167 }
14168 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
14169 varname ? SvPV_nolen_const(varname) : "",
14170 " in ", OP_DESC(PL_op));
220e2d4e 14171 }
a73e8557 14172 else
bd81e77b
NC
14173 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
14174 "", "", "");
220e2d4e 14175}
f9893866 14176
241d1a3b
NC
14177/*
14178 * Local variables:
14179 * c-indentation-style: bsd
14180 * c-basic-offset: 4
14181 * indent-tabs-mode: t
14182 * End:
14183 *
37442d52
RGS
14184 * ex: set ts=8 sts=4 sw=4 noet:
14185 */