This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
The program spawned from process.t needs to set up @INC correctly, as
[perl5.git] / sv.c
CommitLineData
a0d0e21e 1/* sv.c
79072805 2 *
4bb101f2 3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
7272f7c1 4 * 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, by Larry Wall and others
79072805
LW
5 *
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
8 *
a0d0e21e 9 * "I wonder what the Entish is for 'yes' and 'no'," he thought.
645c22ef
DM
10 *
11 *
5e045b90
AMS
12 * This file contains the code that creates, manipulates and destroys
13 * scalar values (SVs). The other types (AV, HV, GV, etc.) reuse the
14 * structure of an SV, so their creation and destruction is handled
15 * here; higher-level functions are in av.c, hv.c, and so on. Opcode
16 * level functions (eg. substr, split, join) for each of the types are
17 * in the pp*.c files.
79072805
LW
18 */
19
20#include "EXTERN.h"
864dbfa3 21#define PERL_IN_SV_C
79072805 22#include "perl.h"
d2f185dc 23#include "regcomp.h"
79072805 24
51371543 25#define FCALL *f
2c5424a7 26
2f8ed50e
OS
27#ifdef __Lynx__
28/* Missing proto on LynxOS */
29 char *gconvert(double, int, int, char *);
30#endif
31
e23c8137 32#ifdef PERL_UTF8_CACHE_ASSERT
ab455f60 33/* if adding more checks watch out for the following tests:
e23c8137
JH
34 * t/op/index.t t/op/length.t t/op/pat.t t/op/substr.t
35 * lib/utf8.t lib/Unicode/Collate/t/index.t
36 * --jhi
37 */
6f207bd3 38# define ASSERT_UTF8_CACHE(cache) \
ab455f60
NC
39 STMT_START { if (cache) { assert((cache)[0] <= (cache)[1]); \
40 assert((cache)[2] <= (cache)[3]); \
41 assert((cache)[3] <= (cache)[1]);} \
42 } STMT_END
e23c8137 43#else
6f207bd3 44# define ASSERT_UTF8_CACHE(cache) NOOP
e23c8137
JH
45#endif
46
f8c7b90f 47#ifdef PERL_OLD_COPY_ON_WRITE
765f542d 48#define SV_COW_NEXT_SV(sv) INT2PTR(SV *,SvUVX(sv))
607fa7f2 49#define SV_COW_NEXT_SV_SET(current,next) SvUV_set(current, PTR2UV(next))
b5ccf5f2 50/* This is a pessimistic view. Scalar must be purely a read-write PV to copy-
765f542d 51 on-write. */
765f542d 52#endif
645c22ef
DM
53
54/* ============================================================================
55
56=head1 Allocation and deallocation of SVs.
57
d2a0f284
JC
58An SV (or AV, HV, etc.) is allocated in two parts: the head (struct
59sv, av, hv...) contains type and reference count information, and for
60many types, a pointer to the body (struct xrv, xpv, xpviv...), which
61contains fields specific to each type. Some types store all they need
62in the head, so don't have a body.
63
64In all but the most memory-paranoid configuations (ex: PURIFY), heads
65and bodies are allocated out of arenas, which by default are
66approximately 4K chunks of memory parcelled up into N heads or bodies.
93e68bfb
JC
67Sv-bodies are allocated by their sv-type, guaranteeing size
68consistency needed to allocate safely from arrays.
69
d2a0f284
JC
70For SV-heads, the first slot in each arena is reserved, and holds a
71link to the next arena, some flags, and a note of the number of slots.
72Snaked through each arena chain is a linked list of free items; when
73this becomes empty, an extra arena is allocated and divided up into N
74items which are threaded into the free list.
75
76SV-bodies are similar, but they use arena-sets by default, which
77separate the link and info from the arena itself, and reclaim the 1st
78slot in the arena. SV-bodies are further described later.
645c22ef
DM
79
80The following global variables are associated with arenas:
81
82 PL_sv_arenaroot pointer to list of SV arenas
83 PL_sv_root pointer to list of free SV structures
84
d2a0f284
JC
85 PL_body_arenas head of linked-list of body arenas
86 PL_body_roots[] array of pointers to list of free bodies of svtype
87 arrays are indexed by the svtype needed
93e68bfb 88
d2a0f284
JC
89A few special SV heads are not allocated from an arena, but are
90instead directly created in the interpreter structure, eg PL_sv_undef.
93e68bfb
JC
91The size of arenas can be changed from the default by setting
92PERL_ARENA_SIZE appropriately at compile time.
645c22ef
DM
93
94The SV arena serves the secondary purpose of allowing still-live SVs
95to be located and destroyed during final cleanup.
96
97At the lowest level, the macros new_SV() and del_SV() grab and free
98an SV head. (If debugging with -DD, del_SV() calls the function S_del_sv()
99to return the SV to the free list with error checking.) new_SV() calls
100more_sv() / sv_add_arena() to add an extra arena if the free list is empty.
101SVs in the free list have their SvTYPE field set to all ones.
102
ff276b08 103At the time of very final cleanup, sv_free_arenas() is called from
645c22ef 104perl_destruct() to physically free all the arenas allocated since the
6a93a7e5 105start of the interpreter.
645c22ef 106
645c22ef
DM
107The function visit() scans the SV arenas list, and calls a specified
108function for each SV it finds which is still live - ie which has an SvTYPE
109other than all 1's, and a non-zero SvREFCNT. visit() is used by the
110following functions (specified as [function that calls visit()] / [function
111called by visit() for each SV]):
112
113 sv_report_used() / do_report_used()
f2524eef 114 dump all remaining SVs (debugging aid)
645c22ef
DM
115
116 sv_clean_objs() / do_clean_objs(),do_clean_named_objs()
117 Attempt to free all objects pointed to by RVs,
118 and, unless DISABLE_DESTRUCTOR_KLUDGE is defined,
119 try to do the same for all objects indirectly
120 referenced by typeglobs too. Called once from
121 perl_destruct(), prior to calling sv_clean_all()
122 below.
123
124 sv_clean_all() / do_clean_all()
125 SvREFCNT_dec(sv) each remaining SV, possibly
126 triggering an sv_free(). It also sets the
127 SVf_BREAK flag on the SV to indicate that the
128 refcnt has been artificially lowered, and thus
129 stopping sv_free() from giving spurious warnings
130 about SVs which unexpectedly have a refcnt
131 of zero. called repeatedly from perl_destruct()
132 until there are no SVs left.
133
93e68bfb 134=head2 Arena allocator API Summary
645c22ef
DM
135
136Private API to rest of sv.c
137
138 new_SV(), del_SV(),
139
140 new_XIV(), del_XIV(),
141 new_XNV(), del_XNV(),
142 etc
143
144Public API:
145
8cf8f3d1 146 sv_report_used(), sv_clean_objs(), sv_clean_all(), sv_free_arenas()
645c22ef 147
645c22ef
DM
148=cut
149
150============================================================================ */
151
4561caa4
CS
152/*
153 * "A time to plant, and a time to uproot what was planted..."
154 */
155
77354fb4 156void
de37a194 157Perl_offer_nice_chunk(pTHX_ void *const chunk, const U32 chunk_size)
77354fb4 158{
97aff369 159 dVAR;
77354fb4
NC
160 void *new_chunk;
161 U32 new_chunk_size;
7918f24d
NC
162
163 PERL_ARGS_ASSERT_OFFER_NICE_CHUNK;
164
77354fb4
NC
165 new_chunk = (void *)(chunk);
166 new_chunk_size = (chunk_size);
167 if (new_chunk_size > PL_nice_chunk_size) {
168 Safefree(PL_nice_chunk);
169 PL_nice_chunk = (char *) new_chunk;
170 PL_nice_chunk_size = new_chunk_size;
171 } else {
172 Safefree(chunk);
173 }
77354fb4 174}
cac9b346 175
fd0854ff 176#ifdef DEBUG_LEAKING_SCALARS
22162ca8 177# define FREE_SV_DEBUG_FILE(sv) Safefree((sv)->sv_debug_file)
fd0854ff
DM
178#else
179# define FREE_SV_DEBUG_FILE(sv)
180#endif
181
48614a46
NC
182#ifdef PERL_POISON
183# define SvARENA_CHAIN(sv) ((sv)->sv_u.svu_rv)
184/* Whilst I'd love to do this, it seems that things like to check on
185 unreferenced scalars
7e337ee0 186# define POSION_SV_HEAD(sv) PoisonNew(sv, 1, struct STRUCT_SV)
48614a46 187*/
7e337ee0
JH
188# define POSION_SV_HEAD(sv) PoisonNew(&SvANY(sv), 1, void *), \
189 PoisonNew(&SvREFCNT(sv), 1, U32)
48614a46
NC
190#else
191# define SvARENA_CHAIN(sv) SvANY(sv)
192# define POSION_SV_HEAD(sv)
193#endif
194
990198f0
DM
195/* Mark an SV head as unused, and add to free list.
196 *
197 * If SVf_BREAK is set, skip adding it to the free list, as this SV had
198 * its refcount artificially decremented during global destruction, so
199 * there may be dangling pointers to it. The last thing we want in that
200 * case is for it to be reused. */
201
053fc874
GS
202#define plant_SV(p) \
203 STMT_START { \
990198f0 204 const U32 old_flags = SvFLAGS(p); \
fd0854ff 205 FREE_SV_DEBUG_FILE(p); \
48614a46 206 POSION_SV_HEAD(p); \
053fc874 207 SvFLAGS(p) = SVTYPEMASK; \
990198f0
DM
208 if (!(old_flags & SVf_BREAK)) { \
209 SvARENA_CHAIN(p) = (void *)PL_sv_root; \
210 PL_sv_root = (p); \
211 } \
053fc874
GS
212 --PL_sv_count; \
213 } STMT_END
a0d0e21e 214
053fc874
GS
215#define uproot_SV(p) \
216 STMT_START { \
217 (p) = PL_sv_root; \
bb7bbd9c 218 PL_sv_root = (SV*)SvARENA_CHAIN(p); \
053fc874
GS
219 ++PL_sv_count; \
220 } STMT_END
221
645c22ef 222
cac9b346
NC
223/* make some more SVs by adding another arena */
224
cac9b346
NC
225STATIC SV*
226S_more_sv(pTHX)
227{
97aff369 228 dVAR;
cac9b346
NC
229 SV* sv;
230
231 if (PL_nice_chunk) {
232 sv_add_arena(PL_nice_chunk, PL_nice_chunk_size, 0);
bd61b366 233 PL_nice_chunk = NULL;
cac9b346
NC
234 PL_nice_chunk_size = 0;
235 }
236 else {
237 char *chunk; /* must use New here to match call to */
d2a0f284 238 Newx(chunk,PERL_ARENA_SIZE,char); /* Safefree() in sv_free_arenas() */
2e7ed132 239 sv_add_arena(chunk, PERL_ARENA_SIZE, 0);
cac9b346
NC
240 }
241 uproot_SV(sv);
242 return sv;
243}
244
645c22ef
DM
245/* new_SV(): return a new, empty SV head */
246
eba0f806
DM
247#ifdef DEBUG_LEAKING_SCALARS
248/* provide a real function for a debugger to play with */
249STATIC SV*
250S_new_SV(pTHX)
251{
252 SV* sv;
253
eba0f806
DM
254 if (PL_sv_root)
255 uproot_SV(sv);
256 else
cac9b346 257 sv = S_more_sv(aTHX);
eba0f806
DM
258 SvANY(sv) = 0;
259 SvREFCNT(sv) = 1;
260 SvFLAGS(sv) = 0;
fd0854ff 261 sv->sv_debug_optype = PL_op ? PL_op->op_type : 0;
e385c3bf
DM
262 sv->sv_debug_line = (U16) (PL_parser && PL_parser->copline != NOLINE
263 ? PL_parser->copline
264 : PL_curcop
f24aceb1
DM
265 ? CopLINE(PL_curcop)
266 : 0
e385c3bf 267 );
fd0854ff
DM
268 sv->sv_debug_inpad = 0;
269 sv->sv_debug_cloned = 0;
fd0854ff 270 sv->sv_debug_file = PL_curcop ? savepv(CopFILE(PL_curcop)): NULL;
fd0854ff 271
eba0f806
DM
272 return sv;
273}
274# define new_SV(p) (p)=S_new_SV(aTHX)
275
276#else
277# define new_SV(p) \
053fc874 278 STMT_START { \
053fc874
GS
279 if (PL_sv_root) \
280 uproot_SV(p); \
281 else \
cac9b346 282 (p) = S_more_sv(aTHX); \
053fc874
GS
283 SvANY(p) = 0; \
284 SvREFCNT(p) = 1; \
285 SvFLAGS(p) = 0; \
286 } STMT_END
eba0f806 287#endif
463ee0b2 288
645c22ef
DM
289
290/* del_SV(): return an empty SV head to the free list */
291
a0d0e21e 292#ifdef DEBUGGING
4561caa4 293
053fc874
GS
294#define del_SV(p) \
295 STMT_START { \
aea4f609 296 if (DEBUG_D_TEST) \
053fc874
GS
297 del_sv(p); \
298 else \
299 plant_SV(p); \
053fc874 300 } STMT_END
a0d0e21e 301
76e3520e 302STATIC void
cea2e8a9 303S_del_sv(pTHX_ SV *p)
463ee0b2 304{
97aff369 305 dVAR;
7918f24d
NC
306
307 PERL_ARGS_ASSERT_DEL_SV;
308
aea4f609 309 if (DEBUG_D_TEST) {
4633a7c4 310 SV* sva;
a3b680e6 311 bool ok = 0;
3280af22 312 for (sva = PL_sv_arenaroot; sva; sva = (SV *) SvANY(sva)) {
53c1dcc0
AL
313 const SV * const sv = sva + 1;
314 const SV * const svend = &sva[SvREFCNT(sva)];
c0ff570e 315 if (p >= sv && p < svend) {
a0d0e21e 316 ok = 1;
c0ff570e
NC
317 break;
318 }
a0d0e21e
LW
319 }
320 if (!ok) {
0453d815 321 if (ckWARN_d(WARN_INTERNAL))
9014280d 322 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
472d47bc
SB
323 "Attempt to free non-arena SV: 0x%"UVxf
324 pTHX__FORMAT, PTR2UV(p) pTHX__VALUE);
a0d0e21e
LW
325 return;
326 }
327 }
4561caa4 328 plant_SV(p);
463ee0b2 329}
a0d0e21e 330
4561caa4
CS
331#else /* ! DEBUGGING */
332
333#define del_SV(p) plant_SV(p)
334
335#endif /* DEBUGGING */
463ee0b2 336
645c22ef
DM
337
338/*
ccfc67b7
JH
339=head1 SV Manipulation Functions
340
645c22ef
DM
341=for apidoc sv_add_arena
342
343Given a chunk of memory, link it to the head of the list of arenas,
344and split it into a list of free SVs.
345
346=cut
347*/
348
4633a7c4 349void
de37a194 350Perl_sv_add_arena(pTHX_ char *const ptr, const U32 size, const U32 flags)
463ee0b2 351{
97aff369 352 dVAR;
0bd48802 353 SV* const sva = (SV*)ptr;
463ee0b2
LW
354 register SV* sv;
355 register SV* svend;
4633a7c4 356
7918f24d
NC
357 PERL_ARGS_ASSERT_SV_ADD_ARENA;
358
4633a7c4 359 /* The first SV in an arena isn't an SV. */
3280af22 360 SvANY(sva) = (void *) PL_sv_arenaroot; /* ptr to next arena */
4633a7c4
LW
361 SvREFCNT(sva) = size / sizeof(SV); /* number of SV slots */
362 SvFLAGS(sva) = flags; /* FAKE if not to be freed */
363
3280af22
NIS
364 PL_sv_arenaroot = sva;
365 PL_sv_root = sva + 1;
4633a7c4
LW
366
367 svend = &sva[SvREFCNT(sva) - 1];
368 sv = sva + 1;
463ee0b2 369 while (sv < svend) {
48614a46 370 SvARENA_CHAIN(sv) = (void *)(SV*)(sv + 1);
03e36789 371#ifdef DEBUGGING
978b032e 372 SvREFCNT(sv) = 0;
03e36789 373#endif
4b69cbe3 374 /* Must always set typemask because it's always checked in on cleanup
03e36789 375 when the arenas are walked looking for objects. */
8990e307 376 SvFLAGS(sv) = SVTYPEMASK;
463ee0b2
LW
377 sv++;
378 }
48614a46 379 SvARENA_CHAIN(sv) = 0;
03e36789
NC
380#ifdef DEBUGGING
381 SvREFCNT(sv) = 0;
382#endif
4633a7c4
LW
383 SvFLAGS(sv) = SVTYPEMASK;
384}
385
055972dc
DM
386/* visit(): call the named function for each non-free SV in the arenas
387 * whose flags field matches the flags/mask args. */
645c22ef 388
5226ed68 389STATIC I32
de37a194 390S_visit(pTHX_ SVFUNC_t f, const U32 flags, const U32 mask)
8990e307 391{
97aff369 392 dVAR;
4633a7c4 393 SV* sva;
5226ed68 394 I32 visited = 0;
8990e307 395
7918f24d
NC
396 PERL_ARGS_ASSERT_VISIT;
397
3280af22 398 for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
53c1dcc0 399 register const SV * const svend = &sva[SvREFCNT(sva)];
a3b680e6 400 register SV* sv;
4561caa4 401 for (sv = sva + 1; sv < svend; ++sv) {
055972dc
DM
402 if (SvTYPE(sv) != SVTYPEMASK
403 && (sv->sv_flags & mask) == flags
404 && SvREFCNT(sv))
405 {
acfe0abc 406 (FCALL)(aTHX_ sv);
5226ed68
JH
407 ++visited;
408 }
8990e307
LW
409 }
410 }
5226ed68 411 return visited;
8990e307
LW
412}
413
758a08c3
JH
414#ifdef DEBUGGING
415
645c22ef
DM
416/* called by sv_report_used() for each live SV */
417
418static void
5fa45a31 419do_report_used(pTHX_ SV *const sv)
645c22ef
DM
420{
421 if (SvTYPE(sv) != SVTYPEMASK) {
422 PerlIO_printf(Perl_debug_log, "****\n");
423 sv_dump(sv);
424 }
425}
758a08c3 426#endif
645c22ef
DM
427
428/*
429=for apidoc sv_report_used
430
431Dump the contents of all SVs not yet freed. (Debugging aid).
432
433=cut
434*/
435
8990e307 436void
864dbfa3 437Perl_sv_report_used(pTHX)
4561caa4 438{
ff270d3a 439#ifdef DEBUGGING
055972dc 440 visit(do_report_used, 0, 0);
96a5add6
AL
441#else
442 PERL_UNUSED_CONTEXT;
ff270d3a 443#endif
4561caa4
CS
444}
445
645c22ef
DM
446/* called by sv_clean_objs() for each live SV */
447
448static void
de37a194 449do_clean_objs(pTHX_ SV *const ref)
645c22ef 450{
97aff369 451 dVAR;
ea724faa
NC
452 assert (SvROK(ref));
453 {
823a54a3
AL
454 SV * const target = SvRV(ref);
455 if (SvOBJECT(target)) {
456 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(ref)));
457 if (SvWEAKREF(ref)) {
458 sv_del_backref(target, ref);
459 SvWEAKREF_off(ref);
460 SvRV_set(ref, NULL);
461 } else {
462 SvROK_off(ref);
463 SvRV_set(ref, NULL);
464 SvREFCNT_dec(target);
465 }
645c22ef
DM
466 }
467 }
468
469 /* XXX Might want to check arrays, etc. */
470}
471
472/* called by sv_clean_objs() for each live SV */
473
474#ifndef DISABLE_DESTRUCTOR_KLUDGE
475static void
f30de749 476do_clean_named_objs(pTHX_ SV *const sv)
645c22ef 477{
97aff369 478 dVAR;
ea724faa 479 assert(SvTYPE(sv) == SVt_PVGV);
d011219a
NC
480 assert(isGV_with_GP(sv));
481 if (GvGP(sv)) {
c69033f2
NC
482 if ((
483#ifdef PERL_DONT_CREATE_GVSV
484 GvSV(sv) &&
485#endif
486 SvOBJECT(GvSV(sv))) ||
645c22ef
DM
487 (GvAV(sv) && SvOBJECT(GvAV(sv))) ||
488 (GvHV(sv) && SvOBJECT(GvHV(sv))) ||
9c12f1e5
RGS
489 /* In certain rare cases GvIOp(sv) can be NULL, which would make SvOBJECT(GvIO(sv)) dereference NULL. */
490 (GvIO(sv) ? (SvFLAGS(GvIOp(sv)) & SVs_OBJECT) : 0) ||
645c22ef
DM
491 (GvCV(sv) && SvOBJECT(GvCV(sv))) )
492 {
493 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning named glob object:\n "), sv_dump(sv)));
ec5f3c78 494 SvFLAGS(sv) |= SVf_BREAK;
645c22ef
DM
495 SvREFCNT_dec(sv);
496 }
497 }
498}
499#endif
500
501/*
502=for apidoc sv_clean_objs
503
504Attempt to destroy all objects not yet freed
505
506=cut
507*/
508
4561caa4 509void
864dbfa3 510Perl_sv_clean_objs(pTHX)
4561caa4 511{
97aff369 512 dVAR;
3280af22 513 PL_in_clean_objs = TRUE;
055972dc 514 visit(do_clean_objs, SVf_ROK, SVf_ROK);
4561caa4 515#ifndef DISABLE_DESTRUCTOR_KLUDGE
2d0f3c12 516 /* some barnacles may yet remain, clinging to typeglobs */
d011219a 517 visit(do_clean_named_objs, SVt_PVGV|SVpgv_GP, SVTYPEMASK|SVp_POK|SVpgv_GP);
4561caa4 518#endif
3280af22 519 PL_in_clean_objs = FALSE;
4561caa4
CS
520}
521
645c22ef
DM
522/* called by sv_clean_all() for each live SV */
523
524static void
de37a194 525do_clean_all(pTHX_ SV *const sv)
645c22ef 526{
97aff369 527 dVAR;
cddfcddc
NC
528 if (sv == (SV*) PL_fdpid || sv == (SV *)PL_strtab) {
529 /* don't clean pid table and strtab */
d17ea597 530 return;
cddfcddc 531 }
645c22ef
DM
532 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%"UVxf"\n", PTR2UV(sv)) ));
533 SvFLAGS(sv) |= SVf_BREAK;
534 SvREFCNT_dec(sv);
535}
536
537/*
538=for apidoc sv_clean_all
539
540Decrement the refcnt of each remaining SV, possibly triggering a
541cleanup. This function may have to be called multiple times to free
ff276b08 542SVs which are in complex self-referential hierarchies.
645c22ef
DM
543
544=cut
545*/
546
5226ed68 547I32
864dbfa3 548Perl_sv_clean_all(pTHX)
8990e307 549{
97aff369 550 dVAR;
5226ed68 551 I32 cleaned;
3280af22 552 PL_in_clean_all = TRUE;
055972dc 553 cleaned = visit(do_clean_all, 0,0);
3280af22 554 PL_in_clean_all = FALSE;
5226ed68 555 return cleaned;
8990e307 556}
463ee0b2 557
5e258f8c
JC
558/*
559 ARENASETS: a meta-arena implementation which separates arena-info
560 into struct arena_set, which contains an array of struct
561 arena_descs, each holding info for a single arena. By separating
562 the meta-info from the arena, we recover the 1st slot, formerly
563 borrowed for list management. The arena_set is about the size of an
39244528 564 arena, avoiding the needless malloc overhead of a naive linked-list.
5e258f8c
JC
565
566 The cost is 1 arena-set malloc per ~320 arena-mallocs, + the unused
567 memory in the last arena-set (1/2 on average). In trade, we get
568 back the 1st slot in each arena (ie 1.7% of a CV-arena, less for
d2a0f284 569 smaller types). The recovery of the wasted space allows use of
e15dad31
JC
570 small arenas for large, rare body types, by changing array* fields
571 in body_details_by_type[] below.
5e258f8c 572*/
5e258f8c 573struct arena_desc {
398c677b
NC
574 char *arena; /* the raw storage, allocated aligned */
575 size_t size; /* its size ~4k typ */
0a848332 576 U32 misc; /* type, and in future other things. */
5e258f8c
JC
577};
578
e6148039
NC
579struct arena_set;
580
581/* Get the maximum number of elements in set[] such that struct arena_set
e15dad31 582 will fit within PERL_ARENA_SIZE, which is probably just under 4K, and
e6148039
NC
583 therefore likely to be 1 aligned memory page. */
584
585#define ARENAS_PER_SET ((PERL_ARENA_SIZE - sizeof(struct arena_set*) \
586 - 2 * sizeof(int)) / sizeof (struct arena_desc))
5e258f8c
JC
587
588struct arena_set {
589 struct arena_set* next;
0a848332
NC
590 unsigned int set_size; /* ie ARENAS_PER_SET */
591 unsigned int curr; /* index of next available arena-desc */
5e258f8c
JC
592 struct arena_desc set[ARENAS_PER_SET];
593};
594
645c22ef
DM
595/*
596=for apidoc sv_free_arenas
597
598Deallocate the memory used by all arenas. Note that all the individual SV
599heads and bodies within the arenas must already have been freed.
600
601=cut
602*/
4633a7c4 603void
864dbfa3 604Perl_sv_free_arenas(pTHX)
4633a7c4 605{
97aff369 606 dVAR;
4633a7c4
LW
607 SV* sva;
608 SV* svanext;
0a848332 609 unsigned int i;
4633a7c4
LW
610
611 /* Free arenas here, but be careful about fake ones. (We assume
612 contiguity of the fake ones with the corresponding real ones.) */
613
3280af22 614 for (sva = PL_sv_arenaroot; sva; sva = svanext) {
4633a7c4
LW
615 svanext = (SV*) SvANY(sva);
616 while (svanext && SvFAKE(svanext))
617 svanext = (SV*) SvANY(svanext);
618
619 if (!SvFAKE(sva))
1df70142 620 Safefree(sva);
4633a7c4 621 }
93e68bfb 622
5e258f8c 623 {
0a848332
NC
624 struct arena_set *aroot = (struct arena_set*) PL_body_arenas;
625
626 while (aroot) {
627 struct arena_set *current = aroot;
628 i = aroot->curr;
629 while (i--) {
5e258f8c
JC
630 assert(aroot->set[i].arena);
631 Safefree(aroot->set[i].arena);
632 }
0a848332
NC
633 aroot = aroot->next;
634 Safefree(current);
5e258f8c
JC
635 }
636 }
dc8220bf 637 PL_body_arenas = 0;
fdda85ca 638
0a848332
NC
639 i = PERL_ARENA_ROOTS_SIZE;
640 while (i--)
93e68bfb 641 PL_body_roots[i] = 0;
93e68bfb 642
43c5f42d 643 Safefree(PL_nice_chunk);
bd61b366 644 PL_nice_chunk = NULL;
3280af22
NIS
645 PL_nice_chunk_size = 0;
646 PL_sv_arenaroot = 0;
647 PL_sv_root = 0;
4633a7c4
LW
648}
649
bd81e77b
NC
650/*
651 Here are mid-level routines that manage the allocation of bodies out
652 of the various arenas. There are 5 kinds of arenas:
29489e7c 653
bd81e77b
NC
654 1. SV-head arenas, which are discussed and handled above
655 2. regular body arenas
656 3. arenas for reduced-size bodies
657 4. Hash-Entry arenas
658 5. pte arenas (thread related)
29489e7c 659
bd81e77b
NC
660 Arena types 2 & 3 are chained by body-type off an array of
661 arena-root pointers, which is indexed by svtype. Some of the
662 larger/less used body types are malloced singly, since a large
663 unused block of them is wasteful. Also, several svtypes dont have
664 bodies; the data fits into the sv-head itself. The arena-root
665 pointer thus has a few unused root-pointers (which may be hijacked
666 later for arena types 4,5)
29489e7c 667
bd81e77b
NC
668 3 differs from 2 as an optimization; some body types have several
669 unused fields in the front of the structure (which are kept in-place
670 for consistency). These bodies can be allocated in smaller chunks,
671 because the leading fields arent accessed. Pointers to such bodies
672 are decremented to point at the unused 'ghost' memory, knowing that
673 the pointers are used with offsets to the real memory.
29489e7c 674
bd81e77b
NC
675 HE, HEK arenas are managed separately, with separate code, but may
676 be merge-able later..
677
678 PTE arenas are not sv-bodies, but they share these mid-level
679 mechanics, so are considered here. The new mid-level mechanics rely
680 on the sv_type of the body being allocated, so we just reserve one
681 of the unused body-slots for PTEs, then use it in those (2) PTE
682 contexts below (line ~10k)
683*/
684
bd26d9a3 685/* get_arena(size): this creates custom-sized arenas
5e258f8c
JC
686 TBD: export properly for hv.c: S_more_he().
687*/
688void*
de37a194 689Perl_get_arena(pTHX_ const size_t arena_size, const U32 misc)
5e258f8c 690{
7a89be66 691 dVAR;
5e258f8c 692 struct arena_desc* adesc;
39244528 693 struct arena_set *aroot = (struct arena_set*) PL_body_arenas;
0a848332 694 unsigned int curr;
5e258f8c 695
476a1e16
JC
696 /* shouldnt need this
697 if (!arena_size) arena_size = PERL_ARENA_SIZE;
698 */
5e258f8c
JC
699
700 /* may need new arena-set to hold new arena */
39244528
NC
701 if (!aroot || aroot->curr >= aroot->set_size) {
702 struct arena_set *newroot;
5e258f8c
JC
703 Newxz(newroot, 1, struct arena_set);
704 newroot->set_size = ARENAS_PER_SET;
39244528
NC
705 newroot->next = aroot;
706 aroot = newroot;
707 PL_body_arenas = (void *) newroot;
52944de8 708 DEBUG_m(PerlIO_printf(Perl_debug_log, "new arenaset %p\n", (void*)aroot));
5e258f8c
JC
709 }
710
711 /* ok, now have arena-set with at least 1 empty/available arena-desc */
39244528
NC
712 curr = aroot->curr++;
713 adesc = &(aroot->set[curr]);
5e258f8c
JC
714 assert(!adesc->arena);
715
89086707 716 Newx(adesc->arena, arena_size, char);
5e258f8c 717 adesc->size = arena_size;
0a848332 718 adesc->misc = misc;
d67b3c53
JH
719 DEBUG_m(PerlIO_printf(Perl_debug_log, "arena %d added: %p size %"UVuf"\n",
720 curr, (void*)adesc->arena, (UV)arena_size));
5e258f8c
JC
721
722 return adesc->arena;
5e258f8c
JC
723}
724
53c1dcc0 725
bd81e77b 726/* return a thing to the free list */
29489e7c 727
bd81e77b
NC
728#define del_body(thing, root) \
729 STMT_START { \
00b6aa41 730 void ** const thing_copy = (void **)thing;\
bd81e77b
NC
731 *thing_copy = *root; \
732 *root = (void*)thing_copy; \
bd81e77b 733 } STMT_END
29489e7c 734
bd81e77b 735/*
d2a0f284
JC
736
737=head1 SV-Body Allocation
738
739Allocation of SV-bodies is similar to SV-heads, differing as follows;
740the allocation mechanism is used for many body types, so is somewhat
741more complicated, it uses arena-sets, and has no need for still-live
742SV detection.
743
744At the outermost level, (new|del)_X*V macros return bodies of the
745appropriate type. These macros call either (new|del)_body_type or
746(new|del)_body_allocated macro pairs, depending on specifics of the
747type. Most body types use the former pair, the latter pair is used to
748allocate body types with "ghost fields".
749
750"ghost fields" are fields that are unused in certain types, and
751consequently dont need to actually exist. They are declared because
752they're part of a "base type", which allows use of functions as
753methods. The simplest examples are AVs and HVs, 2 aggregate types
754which don't use the fields which support SCALAR semantics.
755
756For these types, the arenas are carved up into *_allocated size
757chunks, we thus avoid wasted memory for those unaccessed members.
758When bodies are allocated, we adjust the pointer back in memory by the
759size of the bit not allocated, so it's as if we allocated the full
760structure. (But things will all go boom if you write to the part that
761is "not there", because you'll be overwriting the last members of the
762preceding structure in memory.)
763
764We calculate the correction using the STRUCT_OFFSET macro. For
765example, if xpv_allocated is the same structure as XPV then the two
766OFFSETs sum to zero, and the pointer is unchanged. If the allocated
767structure is smaller (no initial NV actually allocated) then the net
768effect is to subtract the size of the NV from the pointer, to return a
769new pointer as if an initial NV were actually allocated.
770
771This is the same trick as was used for NV and IV bodies. Ironically it
772doesn't need to be used for NV bodies any more, because NV is now at
773the start of the structure. IV bodies don't need it either, because
774they are no longer allocated.
775
776In turn, the new_body_* allocators call S_new_body(), which invokes
777new_body_inline macro, which takes a lock, and takes a body off the
778linked list at PL_body_roots[sv_type], calling S_more_bodies() if
779necessary to refresh an empty list. Then the lock is released, and
780the body is returned.
781
782S_more_bodies calls get_arena(), and carves it up into an array of N
783bodies, which it strings into a linked list. It looks up arena-size
784and body-size from the body_details table described below, thus
785supporting the multiple body-types.
786
787If PURIFY is defined, or PERL_ARENA_SIZE=0, arenas are not used, and
788the (new|del)_X*V macros are mapped directly to malloc/free.
789
790*/
791
792/*
793
794For each sv-type, struct body_details bodies_by_type[] carries
795parameters which control these aspects of SV handling:
796
797Arena_size determines whether arenas are used for this body type, and if
798so, how big they are. PURIFY or PERL_ARENA_SIZE=0 set this field to
799zero, forcing individual mallocs and frees.
800
801Body_size determines how big a body is, and therefore how many fit into
802each arena. Offset carries the body-pointer adjustment needed for
803*_allocated body types, and is used in *_allocated macros.
804
805But its main purpose is to parameterize info needed in
806Perl_sv_upgrade(). The info here dramatically simplifies the function
807vs the implementation in 5.8.7, making it table-driven. All fields
808are used for this, except for arena_size.
809
810For the sv-types that have no bodies, arenas are not used, so those
811PL_body_roots[sv_type] are unused, and can be overloaded. In
812something of a special case, SVt_NULL is borrowed for HE arenas;
c6f8b1d0 813PL_body_roots[HE_SVSLOT=SVt_NULL] is filled by S_more_he, but the
d2a0f284 814bodies_by_type[SVt_NULL] slot is not used, as the table is not
c6f8b1d0 815available in hv.c.
d2a0f284 816
c6f8b1d0
JC
817PTEs also use arenas, but are never seen in Perl_sv_upgrade. Nonetheless,
818they get their own slot in bodies_by_type[PTE_SVSLOT =SVt_IV], so they can
819just use the same allocation semantics. At first, PTEs were also
820overloaded to a non-body sv-type, but this yielded hard-to-find malloc
821bugs, so was simplified by claiming a new slot. This choice has no
822consequence at this time.
d2a0f284 823
29489e7c
DM
824*/
825
bd81e77b 826struct body_details {
0fb58b32 827 U8 body_size; /* Size to allocate */
10666ae3 828 U8 copy; /* Size of structure to copy (may be shorter) */
0fb58b32 829 U8 offset;
10666ae3
NC
830 unsigned int type : 4; /* We have space for a sanity check. */
831 unsigned int cant_upgrade : 1; /* Cannot upgrade this type */
832 unsigned int zero_nv : 1; /* zero the NV when upgrading from this */
833 unsigned int arena : 1; /* Allocated from an arena */
834 size_t arena_size; /* Size of arena to allocate */
bd81e77b 835};
29489e7c 836
bd81e77b
NC
837#define HADNV FALSE
838#define NONV TRUE
29489e7c 839
d2a0f284 840
bd81e77b
NC
841#ifdef PURIFY
842/* With -DPURFIY we allocate everything directly, and don't use arenas.
843 This seems a rather elegant way to simplify some of the code below. */
844#define HASARENA FALSE
845#else
846#define HASARENA TRUE
847#endif
848#define NOARENA FALSE
29489e7c 849
d2a0f284
JC
850/* Size the arenas to exactly fit a given number of bodies. A count
851 of 0 fits the max number bodies into a PERL_ARENA_SIZE.block,
852 simplifying the default. If count > 0, the arena is sized to fit
853 only that many bodies, allowing arenas to be used for large, rare
854 bodies (XPVFM, XPVIO) without undue waste. The arena size is
855 limited by PERL_ARENA_SIZE, so we can safely oversize the
856 declarations.
857 */
95db5f15
MB
858#define FIT_ARENA0(body_size) \
859 ((size_t)(PERL_ARENA_SIZE / body_size) * body_size)
860#define FIT_ARENAn(count,body_size) \
861 ( count * body_size <= PERL_ARENA_SIZE) \
862 ? count * body_size \
863 : FIT_ARENA0 (body_size)
864#define FIT_ARENA(count,body_size) \
865 count \
866 ? FIT_ARENAn (count, body_size) \
867 : FIT_ARENA0 (body_size)
d2a0f284 868
bd81e77b 869/* A macro to work out the offset needed to subtract from a pointer to (say)
29489e7c 870
bd81e77b
NC
871typedef struct {
872 STRLEN xpv_cur;
873 STRLEN xpv_len;
874} xpv_allocated;
29489e7c 875
bd81e77b 876to make its members accessible via a pointer to (say)
29489e7c 877
bd81e77b
NC
878struct xpv {
879 NV xnv_nv;
880 STRLEN xpv_cur;
881 STRLEN xpv_len;
882};
29489e7c 883
bd81e77b 884*/
29489e7c 885
bd81e77b
NC
886#define relative_STRUCT_OFFSET(longer, shorter, member) \
887 (STRUCT_OFFSET(shorter, member) - STRUCT_OFFSET(longer, member))
29489e7c 888
bd81e77b
NC
889/* Calculate the length to copy. Specifically work out the length less any
890 final padding the compiler needed to add. See the comment in sv_upgrade
891 for why copying the padding proved to be a bug. */
29489e7c 892
bd81e77b
NC
893#define copy_length(type, last_member) \
894 STRUCT_OFFSET(type, last_member) \
895 + sizeof (((type*)SvANY((SV*)0))->last_member)
29489e7c 896
bd81e77b 897static const struct body_details bodies_by_type[] = {
10666ae3
NC
898 { sizeof(HE), 0, 0, SVt_NULL,
899 FALSE, NONV, NOARENA, FIT_ARENA(0, sizeof(HE)) },
d2a0f284 900
1cb9cd50 901 /* The bind placeholder pretends to be an RV for now.
c6f8b1d0 902 Also it's marked as "can't upgrade" to stop anyone using it before it's
1cb9cd50
NC
903 implemented. */
904 { 0, 0, 0, SVt_BIND, TRUE, NONV, NOARENA, 0 },
905
d2a0f284
JC
906 /* IVs are in the head, so the allocation size is 0.
907 However, the slot is overloaded for PTEs. */
908 { sizeof(struct ptr_tbl_ent), /* This is used for PTEs. */
909 sizeof(IV), /* This is used to copy out the IV body. */
10666ae3 910 STRUCT_OFFSET(XPVIV, xiv_iv), SVt_IV, FALSE, NONV,
d2a0f284
JC
911 NOARENA /* IVS don't need an arena */,
912 /* But PTEs need to know the size of their arena */
913 FIT_ARENA(0, sizeof(struct ptr_tbl_ent))
914 },
915
bd81e77b 916 /* 8 bytes on most ILP32 with IEEE doubles */
10666ae3 917 { sizeof(NV), sizeof(NV), 0, SVt_NV, FALSE, HADNV, HASARENA,
d2a0f284
JC
918 FIT_ARENA(0, sizeof(NV)) },
919
bd81e77b 920 /* 8 bytes on most ILP32 with IEEE doubles */
d2a0f284
JC
921 { sizeof(xpv_allocated),
922 copy_length(XPV, xpv_len)
923 - relative_STRUCT_OFFSET(xpv_allocated, XPV, xpv_cur),
924 + relative_STRUCT_OFFSET(xpv_allocated, XPV, xpv_cur),
10666ae3 925 SVt_PV, FALSE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpv_allocated)) },
d2a0f284 926
bd81e77b 927 /* 12 */
d2a0f284
JC
928 { sizeof(xpviv_allocated),
929 copy_length(XPVIV, xiv_u)
930 - relative_STRUCT_OFFSET(xpviv_allocated, XPVIV, xpv_cur),
931 + relative_STRUCT_OFFSET(xpviv_allocated, XPVIV, xpv_cur),
10666ae3 932 SVt_PVIV, FALSE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpviv_allocated)) },
d2a0f284 933
bd81e77b 934 /* 20 */
10666ae3 935 { sizeof(XPVNV), copy_length(XPVNV, xiv_u), 0, SVt_PVNV, FALSE, HADNV,
d2a0f284
JC
936 HASARENA, FIT_ARENA(0, sizeof(XPVNV)) },
937
bd81e77b 938 /* 28 */
10666ae3 939 { sizeof(XPVMG), copy_length(XPVMG, xmg_stash), 0, SVt_PVMG, FALSE, HADNV,
d2a0f284 940 HASARENA, FIT_ARENA(0, sizeof(XPVMG)) },
4df7f6af 941
288b8c02 942 /* something big */
08e44740
NC
943 { sizeof(struct regexp_allocated), sizeof(struct regexp_allocated),
944 + relative_STRUCT_OFFSET(struct regexp_allocated, regexp, xpv_cur),
945 SVt_REGEXP, FALSE, NONV, HASARENA,
946 FIT_ARENA(0, sizeof(struct regexp_allocated))
5c35adbb 947 },
4df7f6af 948
bd81e77b 949 /* 48 */
10666ae3 950 { sizeof(XPVGV), sizeof(XPVGV), 0, SVt_PVGV, TRUE, HADNV,
d2a0f284
JC
951 HASARENA, FIT_ARENA(0, sizeof(XPVGV)) },
952
bd81e77b 953 /* 64 */
10666ae3 954 { sizeof(XPVLV), sizeof(XPVLV), 0, SVt_PVLV, TRUE, HADNV,
d2a0f284
JC
955 HASARENA, FIT_ARENA(0, sizeof(XPVLV)) },
956
957 { sizeof(xpvav_allocated),
958 copy_length(XPVAV, xmg_stash)
959 - relative_STRUCT_OFFSET(xpvav_allocated, XPVAV, xav_fill),
960 + relative_STRUCT_OFFSET(xpvav_allocated, XPVAV, xav_fill),
9c59bb28 961 SVt_PVAV, TRUE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpvav_allocated)) },
d2a0f284
JC
962
963 { sizeof(xpvhv_allocated),
964 copy_length(XPVHV, xmg_stash)
965 - relative_STRUCT_OFFSET(xpvhv_allocated, XPVHV, xhv_fill),
966 + relative_STRUCT_OFFSET(xpvhv_allocated, XPVHV, xhv_fill),
9c59bb28 967 SVt_PVHV, TRUE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpvhv_allocated)) },
d2a0f284 968
c84c4652 969 /* 56 */
4115f141 970 { sizeof(xpvcv_allocated), sizeof(xpvcv_allocated),
c84c4652 971 + relative_STRUCT_OFFSET(xpvcv_allocated, XPVCV, xpv_cur),
10666ae3 972 SVt_PVCV, TRUE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpvcv_allocated)) },
d2a0f284 973
4115f141 974 { sizeof(xpvfm_allocated), sizeof(xpvfm_allocated),
3038937b 975 + relative_STRUCT_OFFSET(xpvfm_allocated, XPVFM, xpv_cur),
10666ae3 976 SVt_PVFM, TRUE, NONV, NOARENA, FIT_ARENA(20, sizeof(xpvfm_allocated)) },
d2a0f284
JC
977
978 /* XPVIO is 84 bytes, fits 48x */
167f2c4d
NC
979 { sizeof(xpvio_allocated), sizeof(xpvio_allocated),
980 + relative_STRUCT_OFFSET(xpvio_allocated, XPVIO, xpv_cur),
981 SVt_PVIO, TRUE, NONV, HASARENA, FIT_ARENA(24, sizeof(xpvio_allocated)) },
bd81e77b 982};
29489e7c 983
d2a0f284
JC
984#define new_body_type(sv_type) \
985 (void *)((char *)S_new_body(aTHX_ sv_type))
29489e7c 986
bd81e77b
NC
987#define del_body_type(p, sv_type) \
988 del_body(p, &PL_body_roots[sv_type])
29489e7c 989
29489e7c 990
bd81e77b 991#define new_body_allocated(sv_type) \
d2a0f284 992 (void *)((char *)S_new_body(aTHX_ sv_type) \
bd81e77b 993 - bodies_by_type[sv_type].offset)
29489e7c 994
bd81e77b
NC
995#define del_body_allocated(p, sv_type) \
996 del_body(p + bodies_by_type[sv_type].offset, &PL_body_roots[sv_type])
29489e7c 997
29489e7c 998
bd81e77b
NC
999#define my_safemalloc(s) (void*)safemalloc(s)
1000#define my_safecalloc(s) (void*)safecalloc(s, 1)
1001#define my_safefree(p) safefree((char*)p)
29489e7c 1002
bd81e77b 1003#ifdef PURIFY
29489e7c 1004
bd81e77b
NC
1005#define new_XNV() my_safemalloc(sizeof(XPVNV))
1006#define del_XNV(p) my_safefree(p)
29489e7c 1007
bd81e77b
NC
1008#define new_XPVNV() my_safemalloc(sizeof(XPVNV))
1009#define del_XPVNV(p) my_safefree(p)
29489e7c 1010
bd81e77b
NC
1011#define new_XPVAV() my_safemalloc(sizeof(XPVAV))
1012#define del_XPVAV(p) my_safefree(p)
29489e7c 1013
bd81e77b
NC
1014#define new_XPVHV() my_safemalloc(sizeof(XPVHV))
1015#define del_XPVHV(p) my_safefree(p)
29489e7c 1016
bd81e77b
NC
1017#define new_XPVMG() my_safemalloc(sizeof(XPVMG))
1018#define del_XPVMG(p) my_safefree(p)
29489e7c 1019
bd81e77b
NC
1020#define new_XPVGV() my_safemalloc(sizeof(XPVGV))
1021#define del_XPVGV(p) my_safefree(p)
29489e7c 1022
bd81e77b 1023#else /* !PURIFY */
29489e7c 1024
bd81e77b
NC
1025#define new_XNV() new_body_type(SVt_NV)
1026#define del_XNV(p) del_body_type(p, SVt_NV)
29489e7c 1027
bd81e77b
NC
1028#define new_XPVNV() new_body_type(SVt_PVNV)
1029#define del_XPVNV(p) del_body_type(p, SVt_PVNV)
29489e7c 1030
bd81e77b
NC
1031#define new_XPVAV() new_body_allocated(SVt_PVAV)
1032#define del_XPVAV(p) del_body_allocated(p, SVt_PVAV)
645c22ef 1033
bd81e77b
NC
1034#define new_XPVHV() new_body_allocated(SVt_PVHV)
1035#define del_XPVHV(p) del_body_allocated(p, SVt_PVHV)
645c22ef 1036
bd81e77b
NC
1037#define new_XPVMG() new_body_type(SVt_PVMG)
1038#define del_XPVMG(p) del_body_type(p, SVt_PVMG)
645c22ef 1039
bd81e77b
NC
1040#define new_XPVGV() new_body_type(SVt_PVGV)
1041#define del_XPVGV(p) del_body_type(p, SVt_PVGV)
1d7c1841 1042
bd81e77b 1043#endif /* PURIFY */
93e68bfb 1044
bd81e77b 1045/* no arena for you! */
93e68bfb 1046
bd81e77b 1047#define new_NOARENA(details) \
d2a0f284 1048 my_safemalloc((details)->body_size + (details)->offset)
bd81e77b 1049#define new_NOARENAZ(details) \
d2a0f284
JC
1050 my_safecalloc((details)->body_size + (details)->offset)
1051
1052STATIC void *
de37a194 1053S_more_bodies (pTHX_ const svtype sv_type)
d2a0f284
JC
1054{
1055 dVAR;
1056 void ** const root = &PL_body_roots[sv_type];
96a5add6 1057 const struct body_details * const bdp = &bodies_by_type[sv_type];
d2a0f284
JC
1058 const size_t body_size = bdp->body_size;
1059 char *start;
1060 const char *end;
d8fca402 1061 const size_t arena_size = Perl_malloc_good_size(bdp->arena_size);
0b2d3faa 1062#if defined(DEBUGGING) && !defined(PERL_GLOBAL_STRUCT_PRIVATE)
23e9d66c
NC
1063 static bool done_sanity_check;
1064
0b2d3faa
JH
1065 /* PERL_GLOBAL_STRUCT_PRIVATE cannot coexist with global
1066 * variables like done_sanity_check. */
10666ae3 1067 if (!done_sanity_check) {
ea471437 1068 unsigned int i = SVt_LAST;
10666ae3
NC
1069
1070 done_sanity_check = TRUE;
1071
1072 while (i--)
1073 assert (bodies_by_type[i].type == i);
1074 }
1075#endif
1076
23e9d66c
NC
1077 assert(bdp->arena_size);
1078
d8fca402 1079 start = (char*) Perl_get_arena(aTHX_ arena_size, sv_type);
d2a0f284 1080
d8fca402 1081 end = start + arena_size - 2 * body_size;
d2a0f284 1082
d2a0f284 1083 /* computed count doesnt reflect the 1st slot reservation */
d8fca402
NC
1084#if defined(MYMALLOC) || defined(HAS_MALLOC_GOOD_SIZE)
1085 DEBUG_m(PerlIO_printf(Perl_debug_log,
1086 "arena %p end %p arena-size %d (from %d) type %d "
1087 "size %d ct %d\n",
1088 (void*)start, (void*)end, (int)arena_size,
1089 (int)bdp->arena_size, sv_type, (int)body_size,
1090 (int)arena_size / (int)body_size));
1091#else
d2a0f284
JC
1092 DEBUG_m(PerlIO_printf(Perl_debug_log,
1093 "arena %p end %p arena-size %d type %d size %d ct %d\n",
6c9570dc 1094 (void*)start, (void*)end,
0e84aef4
JH
1095 (int)bdp->arena_size, sv_type, (int)body_size,
1096 (int)bdp->arena_size / (int)body_size));
d8fca402 1097#endif
d2a0f284
JC
1098 *root = (void *)start;
1099
d8fca402 1100 while (start <= end) {
d2a0f284
JC
1101 char * const next = start + body_size;
1102 *(void**) start = (void *)next;
1103 start = next;
1104 }
1105 *(void **)start = 0;
1106
1107 return *root;
1108}
1109
1110/* grab a new thing from the free list, allocating more if necessary.
1111 The inline version is used for speed in hot routines, and the
1112 function using it serves the rest (unless PURIFY).
1113*/
1114#define new_body_inline(xpv, sv_type) \
1115 STMT_START { \
1116 void ** const r3wt = &PL_body_roots[sv_type]; \
11b79775
DD
1117 xpv = (PTR_TBL_ENT_t*) (*((void **)(r3wt)) \
1118 ? *((void **)(r3wt)) : more_bodies(sv_type)); \
d2a0f284 1119 *(r3wt) = *(void**)(xpv); \
d2a0f284
JC
1120 } STMT_END
1121
1122#ifndef PURIFY
1123
1124STATIC void *
de37a194 1125S_new_body(pTHX_ const svtype sv_type)
d2a0f284
JC
1126{
1127 dVAR;
1128 void *xpv;
1129 new_body_inline(xpv, sv_type);
1130 return xpv;
1131}
1132
1133#endif
93e68bfb 1134
238b27b3
NC
1135static const struct body_details fake_rv =
1136 { 0, 0, 0, SVt_IV, FALSE, NONV, NOARENA, 0 };
1137
bd81e77b
NC
1138/*
1139=for apidoc sv_upgrade
93e68bfb 1140
bd81e77b
NC
1141Upgrade an SV to a more complex form. Generally adds a new body type to the
1142SV, then copies across as much information as possible from the old body.
1143You generally want to use the C<SvUPGRADE> macro wrapper. See also C<svtype>.
93e68bfb 1144
bd81e77b 1145=cut
93e68bfb 1146*/
93e68bfb 1147
bd81e77b 1148void
aad570aa 1149Perl_sv_upgrade(pTHX_ register SV *const sv, svtype new_type)
cac9b346 1150{
97aff369 1151 dVAR;
bd81e77b
NC
1152 void* old_body;
1153 void* new_body;
42d0e0b7 1154 const svtype old_type = SvTYPE(sv);
d2a0f284 1155 const struct body_details *new_type_details;
238b27b3 1156 const struct body_details *old_type_details
bd81e77b 1157 = bodies_by_type + old_type;
4df7f6af 1158 SV *referant = NULL;
cac9b346 1159
7918f24d
NC
1160 PERL_ARGS_ASSERT_SV_UPGRADE;
1161
bd81e77b
NC
1162 if (new_type != SVt_PV && SvIsCOW(sv)) {
1163 sv_force_normal_flags(sv, 0);
1164 }
cac9b346 1165
bd81e77b
NC
1166 if (old_type == new_type)
1167 return;
cac9b346 1168
bd81e77b 1169 old_body = SvANY(sv);
de042e1d 1170
bd81e77b
NC
1171 /* Copying structures onto other structures that have been neatly zeroed
1172 has a subtle gotcha. Consider XPVMG
cac9b346 1173
bd81e77b
NC
1174 +------+------+------+------+------+-------+-------+
1175 | NV | CUR | LEN | IV | MAGIC | STASH |
1176 +------+------+------+------+------+-------+-------+
1177 0 4 8 12 16 20 24 28
645c22ef 1178
bd81e77b
NC
1179 where NVs are aligned to 8 bytes, so that sizeof that structure is
1180 actually 32 bytes long, with 4 bytes of padding at the end:
08742458 1181
bd81e77b
NC
1182 +------+------+------+------+------+-------+-------+------+
1183 | NV | CUR | LEN | IV | MAGIC | STASH | ??? |
1184 +------+------+------+------+------+-------+-------+------+
1185 0 4 8 12 16 20 24 28 32
08742458 1186
bd81e77b 1187 so what happens if you allocate memory for this structure:
30f9da9e 1188
bd81e77b
NC
1189 +------+------+------+------+------+-------+-------+------+------+...
1190 | NV | CUR | LEN | IV | MAGIC | STASH | GP | NAME |
1191 +------+------+------+------+------+-------+-------+------+------+...
1192 0 4 8 12 16 20 24 28 32 36
bfc44f79 1193
bd81e77b
NC
1194 zero it, then copy sizeof(XPVMG) bytes on top of it? Not quite what you
1195 expect, because you copy the area marked ??? onto GP. Now, ??? may have
1196 started out as zero once, but it's quite possible that it isn't. So now,
1197 rather than a nicely zeroed GP, you have it pointing somewhere random.
1198 Bugs ensue.
bfc44f79 1199
bd81e77b
NC
1200 (In fact, GP ends up pointing at a previous GP structure, because the
1201 principle cause of the padding in XPVMG getting garbage is a copy of
6c9e42f7
NC
1202 sizeof(XPVMG) bytes from a XPVGV structure in sv_unglob. Right now
1203 this happens to be moot because XPVGV has been re-ordered, with GP
1204 no longer after STASH)
30f9da9e 1205
bd81e77b
NC
1206 So we are careful and work out the size of used parts of all the
1207 structures. */
bfc44f79 1208
bd81e77b
NC
1209 switch (old_type) {
1210 case SVt_NULL:
1211 break;
1212 case SVt_IV:
4df7f6af
NC
1213 if (SvROK(sv)) {
1214 referant = SvRV(sv);
238b27b3
NC
1215 old_type_details = &fake_rv;
1216 if (new_type == SVt_NV)
1217 new_type = SVt_PVNV;
4df7f6af
NC
1218 } else {
1219 if (new_type < SVt_PVIV) {
1220 new_type = (new_type == SVt_NV)
1221 ? SVt_PVNV : SVt_PVIV;
1222 }
bd81e77b
NC
1223 }
1224 break;
1225 case SVt_NV:
1226 if (new_type < SVt_PVNV) {
1227 new_type = SVt_PVNV;
bd81e77b
NC
1228 }
1229 break;
bd81e77b
NC
1230 case SVt_PV:
1231 assert(new_type > SVt_PV);
1232 assert(SVt_IV < SVt_PV);
1233 assert(SVt_NV < SVt_PV);
1234 break;
1235 case SVt_PVIV:
1236 break;
1237 case SVt_PVNV:
1238 break;
1239 case SVt_PVMG:
1240 /* Because the XPVMG of PL_mess_sv isn't allocated from the arena,
1241 there's no way that it can be safely upgraded, because perl.c
1242 expects to Safefree(SvANY(PL_mess_sv)) */
1243 assert(sv != PL_mess_sv);
1244 /* This flag bit is used to mean other things in other scalar types.
1245 Given that it only has meaning inside the pad, it shouldn't be set
1246 on anything that can get upgraded. */
00b1698f 1247 assert(!SvPAD_TYPED(sv));
bd81e77b
NC
1248 break;
1249 default:
1250 if (old_type_details->cant_upgrade)
c81225bc
NC
1251 Perl_croak(aTHX_ "Can't upgrade %s (%" UVuf ") to %" UVuf,
1252 sv_reftype(sv, 0), (UV) old_type, (UV) new_type);
bd81e77b 1253 }
3376de98
NC
1254
1255 if (old_type > new_type)
1256 Perl_croak(aTHX_ "sv_upgrade from type %d down to type %d",
1257 (int)old_type, (int)new_type);
1258
2fa1109b 1259 new_type_details = bodies_by_type + new_type;
645c22ef 1260
bd81e77b
NC
1261 SvFLAGS(sv) &= ~SVTYPEMASK;
1262 SvFLAGS(sv) |= new_type;
932e9ff9 1263
ab4416c0
NC
1264 /* This can't happen, as SVt_NULL is <= all values of new_type, so one of
1265 the return statements above will have triggered. */
1266 assert (new_type != SVt_NULL);
bd81e77b 1267 switch (new_type) {
bd81e77b
NC
1268 case SVt_IV:
1269 assert(old_type == SVt_NULL);
1270 SvANY(sv) = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
1271 SvIV_set(sv, 0);
1272 return;
1273 case SVt_NV:
1274 assert(old_type == SVt_NULL);
1275 SvANY(sv) = new_XNV();
1276 SvNV_set(sv, 0);
1277 return;
bd81e77b 1278 case SVt_PVHV:
bd81e77b 1279 case SVt_PVAV:
d2a0f284 1280 assert(new_type_details->body_size);
c1ae03ae
NC
1281
1282#ifndef PURIFY
1283 assert(new_type_details->arena);
d2a0f284 1284 assert(new_type_details->arena_size);
c1ae03ae 1285 /* This points to the start of the allocated area. */
d2a0f284
JC
1286 new_body_inline(new_body, new_type);
1287 Zero(new_body, new_type_details->body_size, char);
c1ae03ae
NC
1288 new_body = ((char *)new_body) - new_type_details->offset;
1289#else
1290 /* We always allocated the full length item with PURIFY. To do this
1291 we fake things so that arena is false for all 16 types.. */
1292 new_body = new_NOARENAZ(new_type_details);
1293#endif
1294 SvANY(sv) = new_body;
1295 if (new_type == SVt_PVAV) {
1296 AvMAX(sv) = -1;
1297 AvFILLp(sv) = -1;
1298 AvREAL_only(sv);
64484faa 1299 if (old_type_details->body_size) {
ac572bf4
NC
1300 AvALLOC(sv) = 0;
1301 } else {
1302 /* It will have been zeroed when the new body was allocated.
1303 Lets not write to it, in case it confuses a write-back
1304 cache. */
1305 }
78ac7dd9
NC
1306 } else {
1307 assert(!SvOK(sv));
1308 SvOK_off(sv);
1309#ifndef NODEFAULT_SHAREKEYS
1310 HvSHAREKEYS_on(sv); /* key-sharing on by default */
1311#endif
1312 HvMAX(sv) = 7; /* (start with 8 buckets) */
64484faa 1313 if (old_type_details->body_size) {
78ac7dd9
NC
1314 HvFILL(sv) = 0;
1315 } else {
1316 /* It will have been zeroed when the new body was allocated.
1317 Lets not write to it, in case it confuses a write-back
1318 cache. */
1319 }
c1ae03ae 1320 }
aeb18a1e 1321
bd81e77b
NC
1322 /* SVt_NULL isn't the only thing upgraded to AV or HV.
1323 The target created by newSVrv also is, and it can have magic.
1324 However, it never has SvPVX set.
1325 */
4df7f6af
NC
1326 if (old_type == SVt_IV) {
1327 assert(!SvROK(sv));
1328 } else if (old_type >= SVt_PV) {
bd81e77b
NC
1329 assert(SvPVX_const(sv) == 0);
1330 }
aeb18a1e 1331
bd81e77b 1332 if (old_type >= SVt_PVMG) {
e736a858 1333 SvMAGIC_set(sv, ((XPVMG*)old_body)->xmg_u.xmg_magic);
bd81e77b 1334 SvSTASH_set(sv, ((XPVMG*)old_body)->xmg_stash);
797c7171
NC
1335 } else {
1336 sv->sv_u.svu_array = NULL; /* or svu_hash */
bd81e77b
NC
1337 }
1338 break;
93e68bfb 1339
93e68bfb 1340
bd81e77b
NC
1341 case SVt_PVIV:
1342 /* XXX Is this still needed? Was it ever needed? Surely as there is
1343 no route from NV to PVIV, NOK can never be true */
1344 assert(!SvNOKp(sv));
1345 assert(!SvNOK(sv));
1346 case SVt_PVIO:
1347 case SVt_PVFM:
bd81e77b
NC
1348 case SVt_PVGV:
1349 case SVt_PVCV:
1350 case SVt_PVLV:
5c35adbb 1351 case SVt_REGEXP:
bd81e77b
NC
1352 case SVt_PVMG:
1353 case SVt_PVNV:
1354 case SVt_PV:
93e68bfb 1355
d2a0f284 1356 assert(new_type_details->body_size);
bd81e77b
NC
1357 /* We always allocated the full length item with PURIFY. To do this
1358 we fake things so that arena is false for all 16 types.. */
1359 if(new_type_details->arena) {
1360 /* This points to the start of the allocated area. */
d2a0f284
JC
1361 new_body_inline(new_body, new_type);
1362 Zero(new_body, new_type_details->body_size, char);
bd81e77b
NC
1363 new_body = ((char *)new_body) - new_type_details->offset;
1364 } else {
1365 new_body = new_NOARENAZ(new_type_details);
1366 }
1367 SvANY(sv) = new_body;
5e2fc214 1368
bd81e77b 1369 if (old_type_details->copy) {
f9ba3d20
NC
1370 /* There is now the potential for an upgrade from something without
1371 an offset (PVNV or PVMG) to something with one (PVCV, PVFM) */
1372 int offset = old_type_details->offset;
1373 int length = old_type_details->copy;
1374
1375 if (new_type_details->offset > old_type_details->offset) {
d4c19fe8 1376 const int difference
f9ba3d20
NC
1377 = new_type_details->offset - old_type_details->offset;
1378 offset += difference;
1379 length -= difference;
1380 }
1381 assert (length >= 0);
1382
1383 Copy((char *)old_body + offset, (char *)new_body + offset, length,
1384 char);
bd81e77b
NC
1385 }
1386
1387#ifndef NV_ZERO_IS_ALLBITS_ZERO
f2524eef 1388 /* If NV 0.0 is stores as all bits 0 then Zero() already creates a
e5ce394c
NC
1389 * correct 0.0 for us. Otherwise, if the old body didn't have an
1390 * NV slot, but the new one does, then we need to initialise the
1391 * freshly created NV slot with whatever the correct bit pattern is
1392 * for 0.0 */
e22a937e
NC
1393 if (old_type_details->zero_nv && !new_type_details->zero_nv
1394 && !isGV_with_GP(sv))
bd81e77b 1395 SvNV_set(sv, 0);
82048762 1396#endif
5e2fc214 1397
bd81e77b 1398 if (new_type == SVt_PVIO)
f2524eef 1399 IoPAGE_LEN(sv) = 60;
4df7f6af
NC
1400 if (old_type < SVt_PV) {
1401 /* referant will be NULL unless the old type was SVt_IV emulating
1402 SVt_RV */
1403 sv->sv_u.svu_rv = referant;
1404 }
bd81e77b
NC
1405 break;
1406 default:
afd78fd5
JH
1407 Perl_croak(aTHX_ "panic: sv_upgrade to unknown type %lu",
1408 (unsigned long)new_type);
bd81e77b 1409 }
73171d91 1410
d2a0f284
JC
1411 if (old_type_details->arena) {
1412 /* If there was an old body, then we need to free it.
1413 Note that there is an assumption that all bodies of types that
1414 can be upgraded came from arenas. Only the more complex non-
1415 upgradable types are allowed to be directly malloc()ed. */
bd81e77b
NC
1416#ifdef PURIFY
1417 my_safefree(old_body);
1418#else
1419 del_body((void*)((char*)old_body + old_type_details->offset),
1420 &PL_body_roots[old_type]);
1421#endif
1422 }
1423}
73171d91 1424
bd81e77b
NC
1425/*
1426=for apidoc sv_backoff
73171d91 1427
bd81e77b
NC
1428Remove any string offset. You should normally use the C<SvOOK_off> macro
1429wrapper instead.
73171d91 1430
bd81e77b 1431=cut
73171d91
NC
1432*/
1433
bd81e77b 1434int
aad570aa 1435Perl_sv_backoff(pTHX_ register SV *const sv)
bd81e77b 1436{
69240efd 1437 STRLEN delta;
7a4bba22 1438 const char * const s = SvPVX_const(sv);
7918f24d
NC
1439
1440 PERL_ARGS_ASSERT_SV_BACKOFF;
96a5add6 1441 PERL_UNUSED_CONTEXT;
7918f24d 1442
bd81e77b
NC
1443 assert(SvOOK(sv));
1444 assert(SvTYPE(sv) != SVt_PVHV);
1445 assert(SvTYPE(sv) != SVt_PVAV);
7a4bba22 1446
69240efd
NC
1447 SvOOK_offset(sv, delta);
1448
7a4bba22
NC
1449 SvLEN_set(sv, SvLEN(sv) + delta);
1450 SvPV_set(sv, SvPVX(sv) - delta);
1451 Move(s, SvPVX(sv), SvCUR(sv)+1, char);
bd81e77b
NC
1452 SvFLAGS(sv) &= ~SVf_OOK;
1453 return 0;
1454}
73171d91 1455
bd81e77b
NC
1456/*
1457=for apidoc sv_grow
73171d91 1458
bd81e77b
NC
1459Expands the character buffer in the SV. If necessary, uses C<sv_unref> and
1460upgrades the SV to C<SVt_PV>. Returns a pointer to the character buffer.
1461Use the C<SvGROW> wrapper instead.
93e68bfb 1462
bd81e77b
NC
1463=cut
1464*/
93e68bfb 1465
bd81e77b 1466char *
aad570aa 1467Perl_sv_grow(pTHX_ register SV *const sv, register STRLEN newlen)
bd81e77b
NC
1468{
1469 register char *s;
93e68bfb 1470
7918f24d
NC
1471 PERL_ARGS_ASSERT_SV_GROW;
1472
5db06880
NC
1473 if (PL_madskills && newlen >= 0x100000) {
1474 PerlIO_printf(Perl_debug_log,
1475 "Allocation too large: %"UVxf"\n", (UV)newlen);
1476 }
bd81e77b
NC
1477#ifdef HAS_64K_LIMIT
1478 if (newlen >= 0x10000) {
1479 PerlIO_printf(Perl_debug_log,
1480 "Allocation too large: %"UVxf"\n", (UV)newlen);
1481 my_exit(1);
1482 }
1483#endif /* HAS_64K_LIMIT */
1484 if (SvROK(sv))
1485 sv_unref(sv);
1486 if (SvTYPE(sv) < SVt_PV) {
1487 sv_upgrade(sv, SVt_PV);
1488 s = SvPVX_mutable(sv);
1489 }
1490 else if (SvOOK(sv)) { /* pv is offset? */
1491 sv_backoff(sv);
1492 s = SvPVX_mutable(sv);
1493 if (newlen > SvLEN(sv))
1494 newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
1495#ifdef HAS_64K_LIMIT
1496 if (newlen >= 0x10000)
1497 newlen = 0xFFFF;
1498#endif
1499 }
1500 else
1501 s = SvPVX_mutable(sv);
aeb18a1e 1502
bd81e77b 1503 if (newlen > SvLEN(sv)) { /* need more room? */
aedff202 1504#ifndef Perl_safesysmalloc_size
bd81e77b 1505 newlen = PERL_STRLEN_ROUNDUP(newlen);
bd81e77b 1506#endif
98653f18 1507 if (SvLEN(sv) && s) {
10edeb5d 1508 s = (char*)saferealloc(s, newlen);
bd81e77b
NC
1509 }
1510 else {
10edeb5d 1511 s = (char*)safemalloc(newlen);
bd81e77b
NC
1512 if (SvPVX_const(sv) && SvCUR(sv)) {
1513 Move(SvPVX_const(sv), s, (newlen < SvCUR(sv)) ? newlen : SvCUR(sv), char);
1514 }
1515 }
1516 SvPV_set(sv, s);
ca7c1a29 1517#ifdef Perl_safesysmalloc_size
98653f18
NC
1518 /* Do this here, do it once, do it right, and then we will never get
1519 called back into sv_grow() unless there really is some growing
1520 needed. */
ca7c1a29 1521 SvLEN_set(sv, Perl_safesysmalloc_size(s));
98653f18 1522#else
bd81e77b 1523 SvLEN_set(sv, newlen);
98653f18 1524#endif
bd81e77b
NC
1525 }
1526 return s;
1527}
aeb18a1e 1528
bd81e77b
NC
1529/*
1530=for apidoc sv_setiv
932e9ff9 1531
bd81e77b
NC
1532Copies an integer into the given SV, upgrading first if necessary.
1533Does not handle 'set' magic. See also C<sv_setiv_mg>.
463ee0b2 1534
bd81e77b
NC
1535=cut
1536*/
463ee0b2 1537
bd81e77b 1538void
aad570aa 1539Perl_sv_setiv(pTHX_ register SV *const sv, const IV i)
bd81e77b 1540{
97aff369 1541 dVAR;
7918f24d
NC
1542
1543 PERL_ARGS_ASSERT_SV_SETIV;
1544
bd81e77b
NC
1545 SV_CHECK_THINKFIRST_COW_DROP(sv);
1546 switch (SvTYPE(sv)) {
1547 case SVt_NULL:
bd81e77b 1548 case SVt_NV:
3376de98 1549 sv_upgrade(sv, SVt_IV);
bd81e77b 1550 break;
bd81e77b
NC
1551 case SVt_PV:
1552 sv_upgrade(sv, SVt_PVIV);
1553 break;
463ee0b2 1554
bd81e77b 1555 case SVt_PVGV:
6e592b3a
BM
1556 if (!isGV_with_GP(sv))
1557 break;
bd81e77b
NC
1558 case SVt_PVAV:
1559 case SVt_PVHV:
1560 case SVt_PVCV:
1561 case SVt_PVFM:
1562 case SVt_PVIO:
1563 Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
1564 OP_DESC(PL_op));
42d0e0b7 1565 default: NOOP;
bd81e77b
NC
1566 }
1567 (void)SvIOK_only(sv); /* validate number */
1568 SvIV_set(sv, i);
1569 SvTAINT(sv);
1570}
932e9ff9 1571
bd81e77b
NC
1572/*
1573=for apidoc sv_setiv_mg
d33b2eba 1574
bd81e77b 1575Like C<sv_setiv>, but also handles 'set' magic.
1c846c1f 1576
bd81e77b
NC
1577=cut
1578*/
d33b2eba 1579
bd81e77b 1580void
aad570aa 1581Perl_sv_setiv_mg(pTHX_ register SV *const sv, const IV i)
bd81e77b 1582{
7918f24d
NC
1583 PERL_ARGS_ASSERT_SV_SETIV_MG;
1584
bd81e77b
NC
1585 sv_setiv(sv,i);
1586 SvSETMAGIC(sv);
1587}
727879eb 1588
bd81e77b
NC
1589/*
1590=for apidoc sv_setuv
d33b2eba 1591
bd81e77b
NC
1592Copies an unsigned integer into the given SV, upgrading first if necessary.
1593Does not handle 'set' magic. See also C<sv_setuv_mg>.
9b94d1dd 1594
bd81e77b
NC
1595=cut
1596*/
d33b2eba 1597
bd81e77b 1598void
aad570aa 1599Perl_sv_setuv(pTHX_ register SV *const sv, const UV u)
bd81e77b 1600{
7918f24d
NC
1601 PERL_ARGS_ASSERT_SV_SETUV;
1602
bd81e77b
NC
1603 /* With these two if statements:
1604 u=1.49 s=0.52 cu=72.49 cs=10.64 scripts=270 tests=20865
d33b2eba 1605
bd81e77b
NC
1606 without
1607 u=1.35 s=0.47 cu=73.45 cs=11.43 scripts=270 tests=20865
1c846c1f 1608
bd81e77b
NC
1609 If you wish to remove them, please benchmark to see what the effect is
1610 */
1611 if (u <= (UV)IV_MAX) {
1612 sv_setiv(sv, (IV)u);
1613 return;
1614 }
1615 sv_setiv(sv, 0);
1616 SvIsUV_on(sv);
1617 SvUV_set(sv, u);
1618}
d33b2eba 1619
bd81e77b
NC
1620/*
1621=for apidoc sv_setuv_mg
727879eb 1622
bd81e77b 1623Like C<sv_setuv>, but also handles 'set' magic.
9b94d1dd 1624
bd81e77b
NC
1625=cut
1626*/
5e2fc214 1627
bd81e77b 1628void
aad570aa 1629Perl_sv_setuv_mg(pTHX_ register SV *const sv, const UV u)
bd81e77b 1630{
7918f24d
NC
1631 PERL_ARGS_ASSERT_SV_SETUV_MG;
1632
bd81e77b
NC
1633 sv_setuv(sv,u);
1634 SvSETMAGIC(sv);
1635}
5e2fc214 1636
954c1994 1637/*
bd81e77b 1638=for apidoc sv_setnv
954c1994 1639
bd81e77b
NC
1640Copies a double into the given SV, upgrading first if necessary.
1641Does not handle 'set' magic. See also C<sv_setnv_mg>.
954c1994
GS
1642
1643=cut
1644*/
1645
63f97190 1646void
aad570aa 1647Perl_sv_setnv(pTHX_ register SV *const sv, const NV num)
79072805 1648{
97aff369 1649 dVAR;
7918f24d
NC
1650
1651 PERL_ARGS_ASSERT_SV_SETNV;
1652
bd81e77b
NC
1653 SV_CHECK_THINKFIRST_COW_DROP(sv);
1654 switch (SvTYPE(sv)) {
79072805 1655 case SVt_NULL:
79072805 1656 case SVt_IV:
bd81e77b 1657 sv_upgrade(sv, SVt_NV);
79072805
LW
1658 break;
1659 case SVt_PV:
79072805 1660 case SVt_PVIV:
bd81e77b 1661 sv_upgrade(sv, SVt_PVNV);
79072805 1662 break;
bd4b1eb5 1663
bd4b1eb5 1664 case SVt_PVGV:
6e592b3a
BM
1665 if (!isGV_with_GP(sv))
1666 break;
bd81e77b
NC
1667 case SVt_PVAV:
1668 case SVt_PVHV:
79072805 1669 case SVt_PVCV:
bd81e77b
NC
1670 case SVt_PVFM:
1671 case SVt_PVIO:
1672 Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
1673 OP_NAME(PL_op));
42d0e0b7 1674 default: NOOP;
2068cd4d 1675 }
bd81e77b
NC
1676 SvNV_set(sv, num);
1677 (void)SvNOK_only(sv); /* validate number */
1678 SvTAINT(sv);
79072805
LW
1679}
1680
645c22ef 1681/*
bd81e77b 1682=for apidoc sv_setnv_mg
645c22ef 1683
bd81e77b 1684Like C<sv_setnv>, but also handles 'set' magic.
645c22ef
DM
1685
1686=cut
1687*/
1688
bd81e77b 1689void
aad570aa 1690Perl_sv_setnv_mg(pTHX_ register SV *const sv, const NV num)
79072805 1691{
7918f24d
NC
1692 PERL_ARGS_ASSERT_SV_SETNV_MG;
1693
bd81e77b
NC
1694 sv_setnv(sv,num);
1695 SvSETMAGIC(sv);
79072805
LW
1696}
1697
bd81e77b
NC
1698/* Print an "isn't numeric" warning, using a cleaned-up,
1699 * printable version of the offending string
1700 */
954c1994 1701
bd81e77b 1702STATIC void
aad570aa 1703S_not_a_number(pTHX_ SV *const sv)
79072805 1704{
97aff369 1705 dVAR;
bd81e77b
NC
1706 SV *dsv;
1707 char tmpbuf[64];
1708 const char *pv;
94463019 1709
7918f24d
NC
1710 PERL_ARGS_ASSERT_NOT_A_NUMBER;
1711
94463019 1712 if (DO_UTF8(sv)) {
84bafc02 1713 dsv = newSVpvs_flags("", SVs_TEMP);
94463019
JH
1714 pv = sv_uni_display(dsv, sv, 10, 0);
1715 } else {
1716 char *d = tmpbuf;
551405c4 1717 const char * const limit = tmpbuf + sizeof(tmpbuf) - 8;
94463019
JH
1718 /* each *s can expand to 4 chars + "...\0",
1719 i.e. need room for 8 chars */
ecdeb87c 1720
00b6aa41
AL
1721 const char *s = SvPVX_const(sv);
1722 const char * const end = s + SvCUR(sv);
1723 for ( ; s < end && d < limit; s++ ) {
94463019
JH
1724 int ch = *s & 0xFF;
1725 if (ch & 128 && !isPRINT_LC(ch)) {
1726 *d++ = 'M';
1727 *d++ = '-';
1728 ch &= 127;
1729 }
1730 if (ch == '\n') {
1731 *d++ = '\\';
1732 *d++ = 'n';
1733 }
1734 else if (ch == '\r') {
1735 *d++ = '\\';
1736 *d++ = 'r';
1737 }
1738 else if (ch == '\f') {
1739 *d++ = '\\';
1740 *d++ = 'f';
1741 }
1742 else if (ch == '\\') {
1743 *d++ = '\\';
1744 *d++ = '\\';
1745 }
1746 else if (ch == '\0') {
1747 *d++ = '\\';
1748 *d++ = '0';
1749 }
1750 else if (isPRINT_LC(ch))
1751 *d++ = ch;
1752 else {
1753 *d++ = '^';
1754 *d++ = toCTRL(ch);
1755 }
1756 }
1757 if (s < end) {
1758 *d++ = '.';
1759 *d++ = '.';
1760 *d++ = '.';
1761 }
1762 *d = '\0';
1763 pv = tmpbuf;
a0d0e21e 1764 }
a0d0e21e 1765
533c011a 1766 if (PL_op)
9014280d 1767 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019
JH
1768 "Argument \"%s\" isn't numeric in %s", pv,
1769 OP_DESC(PL_op));
a0d0e21e 1770 else
9014280d 1771 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019 1772 "Argument \"%s\" isn't numeric", pv);
a0d0e21e
LW
1773}
1774
c2988b20
NC
1775/*
1776=for apidoc looks_like_number
1777
645c22ef
DM
1778Test if the content of an SV looks like a number (or is a number).
1779C<Inf> and C<Infinity> are treated as numbers (so will not issue a
1780non-numeric warning), even if your atof() doesn't grok them.
c2988b20
NC
1781
1782=cut
1783*/
1784
1785I32
aad570aa 1786Perl_looks_like_number(pTHX_ SV *const sv)
c2988b20 1787{
a3b680e6 1788 register const char *sbegin;
c2988b20
NC
1789 STRLEN len;
1790
7918f24d
NC
1791 PERL_ARGS_ASSERT_LOOKS_LIKE_NUMBER;
1792
c2988b20 1793 if (SvPOK(sv)) {
3f7c398e 1794 sbegin = SvPVX_const(sv);
c2988b20
NC
1795 len = SvCUR(sv);
1796 }
1797 else if (SvPOKp(sv))
83003860 1798 sbegin = SvPV_const(sv, len);
c2988b20 1799 else
e0ab1c0e 1800 return SvFLAGS(sv) & (SVf_NOK|SVp_NOK|SVf_IOK|SVp_IOK);
c2988b20
NC
1801 return grok_number(sbegin, len, NULL);
1802}
25da4f38 1803
19f6321d
NC
1804STATIC bool
1805S_glob_2number(pTHX_ GV * const gv)
180488f8
NC
1806{
1807 const U32 wasfake = SvFLAGS(gv) & SVf_FAKE;
1808 SV *const buffer = sv_newmortal();
1809
7918f24d
NC
1810 PERL_ARGS_ASSERT_GLOB_2NUMBER;
1811
180488f8
NC
1812 /* FAKE globs can get coerced, so need to turn this off temporarily if it
1813 is on. */
1814 SvFAKE_off(gv);
1815 gv_efullname3(buffer, gv, "*");
1816 SvFLAGS(gv) |= wasfake;
1817
675c862f
AL
1818 /* We know that all GVs stringify to something that is not-a-number,
1819 so no need to test that. */
1820 if (ckWARN(WARN_NUMERIC))
1821 not_a_number(buffer);
1822 /* We just want something true to return, so that S_sv_2iuv_common
1823 can tail call us and return true. */
19f6321d 1824 return TRUE;
675c862f
AL
1825}
1826
1827STATIC char *
19f6321d 1828S_glob_2pv(pTHX_ GV * const gv, STRLEN * const len)
675c862f
AL
1829{
1830 const U32 wasfake = SvFLAGS(gv) & SVf_FAKE;
1831 SV *const buffer = sv_newmortal();
1832
7918f24d
NC
1833 PERL_ARGS_ASSERT_GLOB_2PV;
1834
675c862f
AL
1835 /* FAKE globs can get coerced, so need to turn this off temporarily if it
1836 is on. */
1837 SvFAKE_off(gv);
1838 gv_efullname3(buffer, gv, "*");
1839 SvFLAGS(gv) |= wasfake;
1840
1841 assert(SvPOK(buffer));
a6d61a6c
NC
1842 if (len) {
1843 *len = SvCUR(buffer);
1844 }
675c862f 1845 return SvPVX(buffer);
180488f8
NC
1846}
1847
25da4f38
IZ
1848/* Actually, ISO C leaves conversion of UV to IV undefined, but
1849 until proven guilty, assume that things are not that bad... */
1850
645c22ef
DM
1851/*
1852 NV_PRESERVES_UV:
1853
1854 As 64 bit platforms often have an NV that doesn't preserve all bits of
28e5dec8
JH
1855 an IV (an assumption perl has been based on to date) it becomes necessary
1856 to remove the assumption that the NV always carries enough precision to
1857 recreate the IV whenever needed, and that the NV is the canonical form.
1858 Instead, IV/UV and NV need to be given equal rights. So as to not lose
645c22ef 1859 precision as a side effect of conversion (which would lead to insanity
28e5dec8
JH
1860 and the dragon(s) in t/op/numconvert.t getting very angry) the intent is
1861 1) to distinguish between IV/UV/NV slots that have cached a valid
1862 conversion where precision was lost and IV/UV/NV slots that have a
1863 valid conversion which has lost no precision
645c22ef 1864 2) to ensure that if a numeric conversion to one form is requested that
28e5dec8
JH
1865 would lose precision, the precise conversion (or differently
1866 imprecise conversion) is also performed and cached, to prevent
1867 requests for different numeric formats on the same SV causing
1868 lossy conversion chains. (lossless conversion chains are perfectly
1869 acceptable (still))
1870
1871
1872 flags are used:
1873 SvIOKp is true if the IV slot contains a valid value
1874 SvIOK is true only if the IV value is accurate (UV if SvIOK_UV true)
1875 SvNOKp is true if the NV slot contains a valid value
1876 SvNOK is true only if the NV value is accurate
1877
1878 so
645c22ef 1879 while converting from PV to NV, check to see if converting that NV to an
28e5dec8
JH
1880 IV(or UV) would lose accuracy over a direct conversion from PV to
1881 IV(or UV). If it would, cache both conversions, return NV, but mark
1882 SV as IOK NOKp (ie not NOK).
1883
645c22ef 1884 While converting from PV to IV, check to see if converting that IV to an
28e5dec8
JH
1885 NV would lose accuracy over a direct conversion from PV to NV. If it
1886 would, cache both conversions, flag similarly.
1887
1888 Before, the SV value "3.2" could become NV=3.2 IV=3 NOK, IOK quite
1889 correctly because if IV & NV were set NV *always* overruled.
645c22ef
DM
1890 Now, "3.2" will become NV=3.2 IV=3 NOK, IOKp, because the flag's meaning
1891 changes - now IV and NV together means that the two are interchangeable:
28e5dec8 1892 SvIVX == (IV) SvNVX && SvNVX == (NV) SvIVX;
d460ef45 1893
645c22ef
DM
1894 The benefit of this is that operations such as pp_add know that if
1895 SvIOK is true for both left and right operands, then integer addition
1896 can be used instead of floating point (for cases where the result won't
1897 overflow). Before, floating point was always used, which could lead to
28e5dec8
JH
1898 loss of precision compared with integer addition.
1899
1900 * making IV and NV equal status should make maths accurate on 64 bit
1901 platforms
1902 * may speed up maths somewhat if pp_add and friends start to use
645c22ef 1903 integers when possible instead of fp. (Hopefully the overhead in
28e5dec8
JH
1904 looking for SvIOK and checking for overflow will not outweigh the
1905 fp to integer speedup)
1906 * will slow down integer operations (callers of SvIV) on "inaccurate"
1907 values, as the change from SvIOK to SvIOKp will cause a call into
1908 sv_2iv each time rather than a macro access direct to the IV slot
1909 * should speed up number->string conversion on integers as IV is
645c22ef 1910 favoured when IV and NV are equally accurate
28e5dec8
JH
1911
1912 ####################################################################
645c22ef
DM
1913 You had better be using SvIOK_notUV if you want an IV for arithmetic:
1914 SvIOK is true if (IV or UV), so you might be getting (IV)SvUV.
1915 On the other hand, SvUOK is true iff UV.
28e5dec8
JH
1916 ####################################################################
1917
645c22ef 1918 Your mileage will vary depending your CPU's relative fp to integer
28e5dec8
JH
1919 performance ratio.
1920*/
1921
1922#ifndef NV_PRESERVES_UV
645c22ef
DM
1923# define IS_NUMBER_UNDERFLOW_IV 1
1924# define IS_NUMBER_UNDERFLOW_UV 2
1925# define IS_NUMBER_IV_AND_UV 2
1926# define IS_NUMBER_OVERFLOW_IV 4
1927# define IS_NUMBER_OVERFLOW_UV 5
1928
1929/* sv_2iuv_non_preserve(): private routine for use by sv_2iv() and sv_2uv() */
28e5dec8
JH
1930
1931/* For sv_2nv these three cases are "SvNOK and don't bother casting" */
1932STATIC int
5de3775c 1933S_sv_2iuv_non_preserve(pTHX_ register SV *const sv
47031da6
NC
1934# ifdef DEBUGGING
1935 , I32 numtype
1936# endif
1937 )
28e5dec8 1938{
97aff369 1939 dVAR;
7918f24d
NC
1940
1941 PERL_ARGS_ASSERT_SV_2IUV_NON_PRESERVE;
1942
3f7c398e 1943 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
1944 if (SvNVX(sv) < (NV)IV_MIN) {
1945 (void)SvIOKp_on(sv);
1946 (void)SvNOK_on(sv);
45977657 1947 SvIV_set(sv, IV_MIN);
28e5dec8
JH
1948 return IS_NUMBER_UNDERFLOW_IV;
1949 }
1950 if (SvNVX(sv) > (NV)UV_MAX) {
1951 (void)SvIOKp_on(sv);
1952 (void)SvNOK_on(sv);
1953 SvIsUV_on(sv);
607fa7f2 1954 SvUV_set(sv, UV_MAX);
28e5dec8
JH
1955 return IS_NUMBER_OVERFLOW_UV;
1956 }
c2988b20
NC
1957 (void)SvIOKp_on(sv);
1958 (void)SvNOK_on(sv);
1959 /* Can't use strtol etc to convert this string. (See truth table in
1960 sv_2iv */
1961 if (SvNVX(sv) <= (UV)IV_MAX) {
45977657 1962 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
1963 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
1964 SvIOK_on(sv); /* Integer is precise. NOK, IOK */
1965 } else {
1966 /* Integer is imprecise. NOK, IOKp */
1967 }
1968 return SvNVX(sv) < 0 ? IS_NUMBER_UNDERFLOW_UV : IS_NUMBER_IV_AND_UV;
1969 }
1970 SvIsUV_on(sv);
607fa7f2 1971 SvUV_set(sv, U_V(SvNVX(sv)));
c2988b20
NC
1972 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
1973 if (SvUVX(sv) == UV_MAX) {
1974 /* As we know that NVs don't preserve UVs, UV_MAX cannot
1975 possibly be preserved by NV. Hence, it must be overflow.
1976 NOK, IOKp */
1977 return IS_NUMBER_OVERFLOW_UV;
1978 }
1979 SvIOK_on(sv); /* Integer is precise. NOK, UOK */
1980 } else {
1981 /* Integer is imprecise. NOK, IOKp */
28e5dec8 1982 }
c2988b20 1983 return IS_NUMBER_OVERFLOW_IV;
28e5dec8 1984}
645c22ef
DM
1985#endif /* !NV_PRESERVES_UV*/
1986
af359546 1987STATIC bool
7918f24d
NC
1988S_sv_2iuv_common(pTHX_ SV *const sv)
1989{
97aff369 1990 dVAR;
7918f24d
NC
1991
1992 PERL_ARGS_ASSERT_SV_2IUV_COMMON;
1993
af359546 1994 if (SvNOKp(sv)) {
28e5dec8
JH
1995 /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
1996 * without also getting a cached IV/UV from it at the same time
1997 * (ie PV->NV conversion should detect loss of accuracy and cache
af359546
NC
1998 * IV or UV at same time to avoid this. */
1999 /* IV-over-UV optimisation - choose to cache IV if possible */
25da4f38
IZ
2000
2001 if (SvTYPE(sv) == SVt_NV)
2002 sv_upgrade(sv, SVt_PVNV);
2003
28e5dec8
JH
2004 (void)SvIOKp_on(sv); /* Must do this first, to clear any SvOOK */
2005 /* < not <= as for NV doesn't preserve UV, ((NV)IV_MAX+1) will almost
2006 certainly cast into the IV range at IV_MAX, whereas the correct
2007 answer is the UV IV_MAX +1. Hence < ensures that dodgy boundary
2008 cases go to UV */
cab190d4
JD
2009#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
2010 if (Perl_isnan(SvNVX(sv))) {
2011 SvUV_set(sv, 0);
2012 SvIsUV_on(sv);
fdbe6d7c 2013 return FALSE;
cab190d4 2014 }
cab190d4 2015#endif
28e5dec8 2016 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
45977657 2017 SvIV_set(sv, I_V(SvNVX(sv)));
28e5dec8
JH
2018 if (SvNVX(sv) == (NV) SvIVX(sv)
2019#ifndef NV_PRESERVES_UV
2020 && (((UV)1 << NV_PRESERVES_UV_BITS) >
2021 (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
2022 /* Don't flag it as "accurately an integer" if the number
2023 came from a (by definition imprecise) NV operation, and
2024 we're outside the range of NV integer precision */
2025#endif
2026 ) {
a43d94f2
NC
2027 if (SvNOK(sv))
2028 SvIOK_on(sv); /* Can this go wrong with rounding? NWC */
2029 else {
2030 /* scalar has trailing garbage, eg "42a" */
2031 }
28e5dec8 2032 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2033 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (precise)\n",
28e5dec8
JH
2034 PTR2UV(sv),
2035 SvNVX(sv),
2036 SvIVX(sv)));
2037
2038 } else {
2039 /* IV not precise. No need to convert from PV, as NV
2040 conversion would already have cached IV if it detected
2041 that PV->IV would be better than PV->NV->IV
2042 flags already correct - don't set public IOK. */
2043 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2044 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (imprecise)\n",
28e5dec8
JH
2045 PTR2UV(sv),
2046 SvNVX(sv),
2047 SvIVX(sv)));
2048 }
2049 /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
2050 but the cast (NV)IV_MIN rounds to a the value less (more
2051 negative) than IV_MIN which happens to be equal to SvNVX ??
2052 Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
2053 NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
2054 (NV)UVX == NVX are both true, but the values differ. :-(
2055 Hopefully for 2s complement IV_MIN is something like
2056 0x8000000000000000 which will be exact. NWC */
d460ef45 2057 }
25da4f38 2058 else {
607fa7f2 2059 SvUV_set(sv, U_V(SvNVX(sv)));
28e5dec8
JH
2060 if (
2061 (SvNVX(sv) == (NV) SvUVX(sv))
2062#ifndef NV_PRESERVES_UV
2063 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
2064 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
2065 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
2066 /* Don't flag it as "accurately an integer" if the number
2067 came from a (by definition imprecise) NV operation, and
2068 we're outside the range of NV integer precision */
2069#endif
a43d94f2 2070 && SvNOK(sv)
28e5dec8
JH
2071 )
2072 SvIOK_on(sv);
25da4f38 2073 SvIsUV_on(sv);
1c846c1f 2074 DEBUG_c(PerlIO_printf(Perl_debug_log,
57def98f 2075 "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
56431972 2076 PTR2UV(sv),
57def98f
JH
2077 SvUVX(sv),
2078 SvUVX(sv)));
25da4f38 2079 }
748a9306
LW
2080 }
2081 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 2082 UV value;
504618e9 2083 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
af359546 2084 /* We want to avoid a possible problem when we cache an IV/ a UV which
25da4f38 2085 may be later translated to an NV, and the resulting NV is not
c2988b20
NC
2086 the same as the direct translation of the initial string
2087 (eg 123.456 can shortcut to the IV 123 with atol(), but we must
2088 be careful to ensure that the value with the .456 is around if the
2089 NV value is requested in the future).
1c846c1f 2090
af359546 2091 This means that if we cache such an IV/a UV, we need to cache the
25da4f38 2092 NV as well. Moreover, we trade speed for space, and do not
28e5dec8 2093 cache the NV if we are sure it's not needed.
25da4f38 2094 */
16b7a9a4 2095
c2988b20
NC
2096 /* SVt_PVNV is one higher than SVt_PVIV, hence this order */
2097 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2098 == IS_NUMBER_IN_UV) {
5e045b90 2099 /* It's definitely an integer, only upgrade to PVIV */
28e5dec8
JH
2100 if (SvTYPE(sv) < SVt_PVIV)
2101 sv_upgrade(sv, SVt_PVIV);
f7bbb42a 2102 (void)SvIOK_on(sv);
c2988b20
NC
2103 } else if (SvTYPE(sv) < SVt_PVNV)
2104 sv_upgrade(sv, SVt_PVNV);
28e5dec8 2105
f2524eef 2106 /* If NVs preserve UVs then we only use the UV value if we know that
c2988b20
NC
2107 we aren't going to call atof() below. If NVs don't preserve UVs
2108 then the value returned may have more precision than atof() will
2109 return, even though value isn't perfectly accurate. */
2110 if ((numtype & (IS_NUMBER_IN_UV
2111#ifdef NV_PRESERVES_UV
2112 | IS_NUMBER_NOT_INT
2113#endif
2114 )) == IS_NUMBER_IN_UV) {
2115 /* This won't turn off the public IOK flag if it was set above */
2116 (void)SvIOKp_on(sv);
2117
2118 if (!(numtype & IS_NUMBER_NEG)) {
2119 /* positive */;
2120 if (value <= (UV)IV_MAX) {
45977657 2121 SvIV_set(sv, (IV)value);
c2988b20 2122 } else {
af359546 2123 /* it didn't overflow, and it was positive. */
607fa7f2 2124 SvUV_set(sv, value);
c2988b20
NC
2125 SvIsUV_on(sv);
2126 }
2127 } else {
2128 /* 2s complement assumption */
2129 if (value <= (UV)IV_MIN) {
45977657 2130 SvIV_set(sv, -(IV)value);
c2988b20
NC
2131 } else {
2132 /* Too negative for an IV. This is a double upgrade, but
d1be9408 2133 I'm assuming it will be rare. */
c2988b20
NC
2134 if (SvTYPE(sv) < SVt_PVNV)
2135 sv_upgrade(sv, SVt_PVNV);
2136 SvNOK_on(sv);
2137 SvIOK_off(sv);
2138 SvIOKp_on(sv);
9d6ce603 2139 SvNV_set(sv, -(NV)value);
45977657 2140 SvIV_set(sv, IV_MIN);
c2988b20
NC
2141 }
2142 }
2143 }
2144 /* For !NV_PRESERVES_UV and IS_NUMBER_IN_UV and IS_NUMBER_NOT_INT we
2145 will be in the previous block to set the IV slot, and the next
2146 block to set the NV slot. So no else here. */
2147
2148 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2149 != IS_NUMBER_IN_UV) {
2150 /* It wasn't an (integer that doesn't overflow the UV). */
3f7c398e 2151 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8 2152
c2988b20
NC
2153 if (! numtype && ckWARN(WARN_NUMERIC))
2154 not_a_number(sv);
28e5dec8 2155
65202027 2156#if defined(USE_LONG_DOUBLE)
c2988b20
NC
2157 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%" PERL_PRIgldbl ")\n",
2158 PTR2UV(sv), SvNVX(sv)));
65202027 2159#else
1779d84d 2160 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"NVgf")\n",
c2988b20 2161 PTR2UV(sv), SvNVX(sv)));
65202027 2162#endif
28e5dec8 2163
28e5dec8 2164#ifdef NV_PRESERVES_UV
af359546
NC
2165 (void)SvIOKp_on(sv);
2166 (void)SvNOK_on(sv);
2167 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2168 SvIV_set(sv, I_V(SvNVX(sv)));
2169 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2170 SvIOK_on(sv);
2171 } else {
6f207bd3 2172 NOOP; /* Integer is imprecise. NOK, IOKp */
af359546
NC
2173 }
2174 /* UV will not work better than IV */
2175 } else {
2176 if (SvNVX(sv) > (NV)UV_MAX) {
2177 SvIsUV_on(sv);
2178 /* Integer is inaccurate. NOK, IOKp, is UV */
2179 SvUV_set(sv, UV_MAX);
af359546
NC
2180 } else {
2181 SvUV_set(sv, U_V(SvNVX(sv)));
2182 /* 0xFFFFFFFFFFFFFFFF not an issue in here, NVs
2183 NV preservse UV so can do correct comparison. */
2184 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2185 SvIOK_on(sv);
af359546 2186 } else {
6f207bd3 2187 NOOP; /* Integer is imprecise. NOK, IOKp, is UV */
af359546
NC
2188 }
2189 }
4b0c9573 2190 SvIsUV_on(sv);
af359546 2191 }
28e5dec8 2192#else /* NV_PRESERVES_UV */
c2988b20
NC
2193 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2194 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
af359546 2195 /* The IV/UV slot will have been set from value returned by
c2988b20
NC
2196 grok_number above. The NV slot has just been set using
2197 Atof. */
560b0c46 2198 SvNOK_on(sv);
c2988b20
NC
2199 assert (SvIOKp(sv));
2200 } else {
2201 if (((UV)1 << NV_PRESERVES_UV_BITS) >
2202 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2203 /* Small enough to preserve all bits. */
2204 (void)SvIOKp_on(sv);
2205 SvNOK_on(sv);
45977657 2206 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
2207 if ((NV)(SvIVX(sv)) == SvNVX(sv))
2208 SvIOK_on(sv);
2209 /* Assumption: first non-preserved integer is < IV_MAX,
2210 this NV is in the preserved range, therefore: */
2211 if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
2212 < (UV)IV_MAX)) {
32fdb065 2213 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
2214 }
2215 } else {
2216 /* IN_UV NOT_INT
2217 0 0 already failed to read UV.
2218 0 1 already failed to read UV.
2219 1 0 you won't get here in this case. IV/UV
2220 slot set, public IOK, Atof() unneeded.
2221 1 1 already read UV.
2222 so there's no point in sv_2iuv_non_preserve() attempting
2223 to use atol, strtol, strtoul etc. */
47031da6 2224# ifdef DEBUGGING
40a17c4c 2225 sv_2iuv_non_preserve (sv, numtype);
47031da6
NC
2226# else
2227 sv_2iuv_non_preserve (sv);
2228# endif
c2988b20
NC
2229 }
2230 }
28e5dec8 2231#endif /* NV_PRESERVES_UV */
a43d94f2
NC
2232 /* It might be more code efficient to go through the entire logic above
2233 and conditionally set with SvIOKp_on() rather than SvIOK(), but it
2234 gets complex and potentially buggy, so more programmer efficient
2235 to do it this way, by turning off the public flags: */
2236 if (!numtype)
2237 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK);
25da4f38 2238 }
af359546
NC
2239 }
2240 else {
675c862f 2241 if (isGV_with_GP(sv))
a0933d07 2242 return glob_2number((GV *)sv);
180488f8 2243
af359546
NC
2244 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
2245 if (!PL_localizing && ckWARN(WARN_UNINITIALIZED))
2246 report_uninit(sv);
2247 }
25da4f38
IZ
2248 if (SvTYPE(sv) < SVt_IV)
2249 /* Typically the caller expects that sv_any is not NULL now. */
2250 sv_upgrade(sv, SVt_IV);
af359546
NC
2251 /* Return 0 from the caller. */
2252 return TRUE;
2253 }
2254 return FALSE;
2255}
2256
2257/*
2258=for apidoc sv_2iv_flags
2259
2260Return the integer value of an SV, doing any necessary string
2261conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2262Normally used via the C<SvIV(sv)> and C<SvIVx(sv)> macros.
2263
2264=cut
2265*/
2266
2267IV
5de3775c 2268Perl_sv_2iv_flags(pTHX_ register SV *const sv, const I32 flags)
af359546 2269{
97aff369 2270 dVAR;
af359546 2271 if (!sv)
a0d0e21e 2272 return 0;
cecf5685
NC
2273 if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
2274 /* FBMs use the same flag bit as SVf_IVisUV, so must let them
50caf62e
NC
2275 cache IVs just in case. In practice it seems that they never
2276 actually anywhere accessible by user Perl code, let alone get used
2277 in anything other than a string context. */
af359546
NC
2278 if (flags & SV_GMAGIC)
2279 mg_get(sv);
2280 if (SvIOKp(sv))
2281 return SvIVX(sv);
2282 if (SvNOKp(sv)) {
2283 return I_V(SvNVX(sv));
2284 }
71c558c3
NC
2285 if (SvPOKp(sv) && SvLEN(sv)) {
2286 UV value;
2287 const int numtype
2288 = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2289
2290 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2291 == IS_NUMBER_IN_UV) {
2292 /* It's definitely an integer */
2293 if (numtype & IS_NUMBER_NEG) {
2294 if (value < (UV)IV_MIN)
2295 return -(IV)value;
2296 } else {
2297 if (value < (UV)IV_MAX)
2298 return (IV)value;
2299 }
2300 }
2301 if (!numtype) {
2302 if (ckWARN(WARN_NUMERIC))
2303 not_a_number(sv);
2304 }
2305 return I_V(Atof(SvPVX_const(sv)));
2306 }
1c7ff15e
NC
2307 if (SvROK(sv)) {
2308 goto return_rok;
af359546 2309 }
1c7ff15e
NC
2310 assert(SvTYPE(sv) >= SVt_PVMG);
2311 /* This falls through to the report_uninit inside S_sv_2iuv_common. */
4cb1ec55 2312 } else if (SvTHINKFIRST(sv)) {
af359546 2313 if (SvROK(sv)) {
1c7ff15e 2314 return_rok:
af359546
NC
2315 if (SvAMAGIC(sv)) {
2316 SV * const tmpstr=AMG_CALLun(sv,numer);
2317 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2318 return SvIV(tmpstr);
2319 }
2320 }
2321 return PTR2IV(SvRV(sv));
2322 }
2323 if (SvIsCOW(sv)) {
2324 sv_force_normal_flags(sv, 0);
2325 }
2326 if (SvREADONLY(sv) && !SvOK(sv)) {
2327 if (ckWARN(WARN_UNINITIALIZED))
2328 report_uninit(sv);
2329 return 0;
2330 }
2331 }
2332 if (!SvIOKp(sv)) {
2333 if (S_sv_2iuv_common(aTHX_ sv))
2334 return 0;
79072805 2335 }
1d7c1841
GS
2336 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
2337 PTR2UV(sv),SvIVX(sv)));
25da4f38 2338 return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
79072805
LW
2339}
2340
645c22ef 2341/*
891f9566 2342=for apidoc sv_2uv_flags
645c22ef
DM
2343
2344Return the unsigned integer value of an SV, doing any necessary string
891f9566
YST
2345conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2346Normally used via the C<SvUV(sv)> and C<SvUVx(sv)> macros.
645c22ef
DM
2347
2348=cut
2349*/
2350
ff68c719 2351UV
5de3775c 2352Perl_sv_2uv_flags(pTHX_ register SV *const sv, const I32 flags)
ff68c719 2353{
97aff369 2354 dVAR;
ff68c719 2355 if (!sv)
2356 return 0;
cecf5685
NC
2357 if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
2358 /* FBMs use the same flag bit as SVf_IVisUV, so must let them
50caf62e 2359 cache IVs just in case. */
891f9566
YST
2360 if (flags & SV_GMAGIC)
2361 mg_get(sv);
ff68c719 2362 if (SvIOKp(sv))
2363 return SvUVX(sv);
2364 if (SvNOKp(sv))
2365 return U_V(SvNVX(sv));
71c558c3
NC
2366 if (SvPOKp(sv) && SvLEN(sv)) {
2367 UV value;
2368 const int numtype
2369 = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2370
2371 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2372 == IS_NUMBER_IN_UV) {
2373 /* It's definitely an integer */
2374 if (!(numtype & IS_NUMBER_NEG))
2375 return value;
2376 }
2377 if (!numtype) {
2378 if (ckWARN(WARN_NUMERIC))
2379 not_a_number(sv);
2380 }
2381 return U_V(Atof(SvPVX_const(sv)));
2382 }
1c7ff15e
NC
2383 if (SvROK(sv)) {
2384 goto return_rok;
3fe9a6f1 2385 }
1c7ff15e
NC
2386 assert(SvTYPE(sv) >= SVt_PVMG);
2387 /* This falls through to the report_uninit inside S_sv_2iuv_common. */
4cb1ec55 2388 } else if (SvTHINKFIRST(sv)) {
ff68c719 2389 if (SvROK(sv)) {
1c7ff15e 2390 return_rok:
deb46114
NC
2391 if (SvAMAGIC(sv)) {
2392 SV *const tmpstr = AMG_CALLun(sv,numer);
2393 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2394 return SvUV(tmpstr);
2395 }
2396 }
2397 return PTR2UV(SvRV(sv));
ff68c719 2398 }
765f542d
NC
2399 if (SvIsCOW(sv)) {
2400 sv_force_normal_flags(sv, 0);
8a818333 2401 }
0336b60e 2402 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2403 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2404 report_uninit(sv);
ff68c719 2405 return 0;
2406 }
2407 }
af359546
NC
2408 if (!SvIOKp(sv)) {
2409 if (S_sv_2iuv_common(aTHX_ sv))
2410 return 0;
ff68c719 2411 }
25da4f38 2412
1d7c1841
GS
2413 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
2414 PTR2UV(sv),SvUVX(sv)));
25da4f38 2415 return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
ff68c719 2416}
2417
645c22ef
DM
2418/*
2419=for apidoc sv_2nv
2420
2421Return the num value of an SV, doing any necessary string or integer
2422conversion, magic etc. Normally used via the C<SvNV(sv)> and C<SvNVx(sv)>
2423macros.
2424
2425=cut
2426*/
2427
65202027 2428NV
5de3775c 2429Perl_sv_2nv(pTHX_ register SV *const sv)
79072805 2430{
97aff369 2431 dVAR;
79072805
LW
2432 if (!sv)
2433 return 0.0;
cecf5685
NC
2434 if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
2435 /* FBMs use the same flag bit as SVf_IVisUV, so must let them
50caf62e 2436 cache IVs just in case. */
463ee0b2
LW
2437 mg_get(sv);
2438 if (SvNOKp(sv))
2439 return SvNVX(sv);
0aa395f8 2440 if ((SvPOKp(sv) && SvLEN(sv)) && !SvIOKp(sv)) {
041457d9 2441 if (!SvIOKp(sv) && ckWARN(WARN_NUMERIC) &&
504618e9 2442 !grok_number(SvPVX_const(sv), SvCUR(sv), NULL))
a0d0e21e 2443 not_a_number(sv);
3f7c398e 2444 return Atof(SvPVX_const(sv));
a0d0e21e 2445 }
25da4f38 2446 if (SvIOKp(sv)) {
1c846c1f 2447 if (SvIsUV(sv))
65202027 2448 return (NV)SvUVX(sv);
25da4f38 2449 else
65202027 2450 return (NV)SvIVX(sv);
47a72cb8
NC
2451 }
2452 if (SvROK(sv)) {
2453 goto return_rok;
2454 }
2455 assert(SvTYPE(sv) >= SVt_PVMG);
2456 /* This falls through to the report_uninit near the end of the
2457 function. */
2458 } else if (SvTHINKFIRST(sv)) {
a0d0e21e 2459 if (SvROK(sv)) {
47a72cb8 2460 return_rok:
deb46114
NC
2461 if (SvAMAGIC(sv)) {
2462 SV *const tmpstr = AMG_CALLun(sv,numer);
2463 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2464 return SvNV(tmpstr);
2465 }
2466 }
2467 return PTR2NV(SvRV(sv));
a0d0e21e 2468 }
765f542d
NC
2469 if (SvIsCOW(sv)) {
2470 sv_force_normal_flags(sv, 0);
8a818333 2471 }
0336b60e 2472 if (SvREADONLY(sv) && !SvOK(sv)) {
599cee73 2473 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2474 report_uninit(sv);
ed6116ce
LW
2475 return 0.0;
2476 }
79072805
LW
2477 }
2478 if (SvTYPE(sv) < SVt_NV) {
7e25a7e9
NC
2479 /* The logic to use SVt_PVNV if necessary is in sv_upgrade. */
2480 sv_upgrade(sv, SVt_NV);
906f284f 2481#ifdef USE_LONG_DOUBLE
097ee67d 2482 DEBUG_c({
f93f4e46 2483 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
2484 PerlIO_printf(Perl_debug_log,
2485 "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
2486 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
2487 RESTORE_NUMERIC_LOCAL();
2488 });
65202027 2489#else
572bbb43 2490 DEBUG_c({
f93f4e46 2491 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 2492 PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%"NVgf")\n",
1d7c1841 2493 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
2494 RESTORE_NUMERIC_LOCAL();
2495 });
572bbb43 2496#endif
79072805
LW
2497 }
2498 else if (SvTYPE(sv) < SVt_PVNV)
2499 sv_upgrade(sv, SVt_PVNV);
59d8ce62
NC
2500 if (SvNOKp(sv)) {
2501 return SvNVX(sv);
61604483 2502 }
59d8ce62 2503 if (SvIOKp(sv)) {
9d6ce603 2504 SvNV_set(sv, SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv));
28e5dec8 2505#ifdef NV_PRESERVES_UV
a43d94f2
NC
2506 if (SvIOK(sv))
2507 SvNOK_on(sv);
2508 else
2509 SvNOKp_on(sv);
28e5dec8
JH
2510#else
2511 /* Only set the public NV OK flag if this NV preserves the IV */
2512 /* Check it's not 0xFFFFFFFFFFFFFFFF */
a43d94f2
NC
2513 if (SvIOK(sv) &&
2514 SvIsUV(sv) ? ((SvUVX(sv) != UV_MAX)&&(SvUVX(sv) == U_V(SvNVX(sv))))
28e5dec8
JH
2515 : (SvIVX(sv) == I_V(SvNVX(sv))))
2516 SvNOK_on(sv);
2517 else
2518 SvNOKp_on(sv);
2519#endif
93a17b20 2520 }
748a9306 2521 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 2522 UV value;
3f7c398e 2523 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
041457d9 2524 if (!SvIOKp(sv) && !numtype && ckWARN(WARN_NUMERIC))
a0d0e21e 2525 not_a_number(sv);
28e5dec8 2526#ifdef NV_PRESERVES_UV
c2988b20
NC
2527 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2528 == IS_NUMBER_IN_UV) {
5e045b90 2529 /* It's definitely an integer */
9d6ce603 2530 SvNV_set(sv, (numtype & IS_NUMBER_NEG) ? -(NV)value : (NV)value);
c2988b20 2531 } else
3f7c398e 2532 SvNV_set(sv, Atof(SvPVX_const(sv)));
a43d94f2
NC
2533 if (numtype)
2534 SvNOK_on(sv);
2535 else
2536 SvNOKp_on(sv);
28e5dec8 2537#else
3f7c398e 2538 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8
JH
2539 /* Only set the public NV OK flag if this NV preserves the value in
2540 the PV at least as well as an IV/UV would.
2541 Not sure how to do this 100% reliably. */
2542 /* if that shift count is out of range then Configure's test is
2543 wonky. We shouldn't be in here with NV_PRESERVES_UV_BITS ==
2544 UV_BITS */
2545 if (((UV)1 << NV_PRESERVES_UV_BITS) >
c2988b20 2546 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
28e5dec8 2547 SvNOK_on(sv); /* Definitely small enough to preserve all bits */
c2988b20
NC
2548 } else if (!(numtype & IS_NUMBER_IN_UV)) {
2549 /* Can't use strtol etc to convert this string, so don't try.
2550 sv_2iv and sv_2uv will use the NV to convert, not the PV. */
2551 SvNOK_on(sv);
2552 } else {
2553 /* value has been set. It may not be precise. */
2554 if ((numtype & IS_NUMBER_NEG) && (value > (UV)IV_MIN)) {
2555 /* 2s complement assumption for (UV)IV_MIN */
2556 SvNOK_on(sv); /* Integer is too negative. */
2557 } else {
2558 SvNOKp_on(sv);
2559 SvIOKp_on(sv);
6fa402ec 2560
c2988b20 2561 if (numtype & IS_NUMBER_NEG) {
45977657 2562 SvIV_set(sv, -(IV)value);
c2988b20 2563 } else if (value <= (UV)IV_MAX) {
45977657 2564 SvIV_set(sv, (IV)value);
c2988b20 2565 } else {
607fa7f2 2566 SvUV_set(sv, value);
c2988b20
NC
2567 SvIsUV_on(sv);
2568 }
2569
2570 if (numtype & IS_NUMBER_NOT_INT) {
2571 /* I believe that even if the original PV had decimals,
2572 they are lost beyond the limit of the FP precision.
2573 However, neither is canonical, so both only get p
2574 flags. NWC, 2000/11/25 */
2575 /* Both already have p flags, so do nothing */
2576 } else {
66a1b24b 2577 const NV nv = SvNVX(sv);
c2988b20
NC
2578 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2579 if (SvIVX(sv) == I_V(nv)) {
2580 SvNOK_on(sv);
c2988b20 2581 } else {
c2988b20
NC
2582 /* It had no "." so it must be integer. */
2583 }
00b6aa41 2584 SvIOK_on(sv);
c2988b20
NC
2585 } else {
2586 /* between IV_MAX and NV(UV_MAX).
2587 Could be slightly > UV_MAX */
6fa402ec 2588
c2988b20
NC
2589 if (numtype & IS_NUMBER_NOT_INT) {
2590 /* UV and NV both imprecise. */
2591 } else {
66a1b24b 2592 const UV nv_as_uv = U_V(nv);
c2988b20
NC
2593
2594 if (value == nv_as_uv && SvUVX(sv) != UV_MAX) {
2595 SvNOK_on(sv);
c2988b20 2596 }
00b6aa41 2597 SvIOK_on(sv);
c2988b20
NC
2598 }
2599 }
2600 }
2601 }
2602 }
a43d94f2
NC
2603 /* It might be more code efficient to go through the entire logic above
2604 and conditionally set with SvNOKp_on() rather than SvNOK(), but it
2605 gets complex and potentially buggy, so more programmer efficient
2606 to do it this way, by turning off the public flags: */
2607 if (!numtype)
2608 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK);
28e5dec8 2609#endif /* NV_PRESERVES_UV */
93a17b20 2610 }
79072805 2611 else {
f7877b28 2612 if (isGV_with_GP(sv)) {
19f6321d 2613 glob_2number((GV *)sv);
180488f8
NC
2614 return 0.0;
2615 }
2616
041457d9 2617 if (!PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP) && ckWARN(WARN_UNINITIALIZED))
29489e7c 2618 report_uninit(sv);
7e25a7e9
NC
2619 assert (SvTYPE(sv) >= SVt_NV);
2620 /* Typically the caller expects that sv_any is not NULL now. */
2621 /* XXX Ilya implies that this is a bug in callers that assume this
2622 and ideally should be fixed. */
a0d0e21e 2623 return 0.0;
79072805 2624 }
572bbb43 2625#if defined(USE_LONG_DOUBLE)
097ee67d 2626 DEBUG_c({
f93f4e46 2627 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
2628 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
2629 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
2630 RESTORE_NUMERIC_LOCAL();
2631 });
65202027 2632#else
572bbb43 2633 DEBUG_c({
f93f4e46 2634 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 2635 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%"NVgf")\n",
1d7c1841 2636 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
2637 RESTORE_NUMERIC_LOCAL();
2638 });
572bbb43 2639#endif
463ee0b2 2640 return SvNVX(sv);
79072805
LW
2641}
2642
800401ee
JH
2643/*
2644=for apidoc sv_2num
2645
2646Return an SV with the numeric value of the source SV, doing any necessary
a196a5fa
JH
2647reference or overload conversion. You must use the C<SvNUM(sv)> macro to
2648access this function.
800401ee
JH
2649
2650=cut
2651*/
2652
2653SV *
5de3775c 2654Perl_sv_2num(pTHX_ register SV *const sv)
800401ee 2655{
7918f24d
NC
2656 PERL_ARGS_ASSERT_SV_2NUM;
2657
b9ee0594
RGS
2658 if (!SvROK(sv))
2659 return sv;
800401ee
JH
2660 if (SvAMAGIC(sv)) {
2661 SV * const tmpsv = AMG_CALLun(sv,numer);
2662 if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
2663 return sv_2num(tmpsv);
2664 }
2665 return sv_2mortal(newSVuv(PTR2UV(SvRV(sv))));
2666}
2667
645c22ef
DM
2668/* uiv_2buf(): private routine for use by sv_2pv_flags(): print an IV or
2669 * UV as a string towards the end of buf, and return pointers to start and
2670 * end of it.
2671 *
2672 * We assume that buf is at least TYPE_CHARS(UV) long.
2673 */
2674
864dbfa3 2675static char *
5de3775c 2676S_uiv_2buf(char *const buf, const IV iv, UV uv, const int is_uv, char **const peob)
25da4f38 2677{
25da4f38 2678 char *ptr = buf + TYPE_CHARS(UV);
823a54a3 2679 char * const ebuf = ptr;
25da4f38 2680 int sign;
25da4f38 2681
7918f24d
NC
2682 PERL_ARGS_ASSERT_UIV_2BUF;
2683
25da4f38
IZ
2684 if (is_uv)
2685 sign = 0;
2686 else if (iv >= 0) {
2687 uv = iv;
2688 sign = 0;
2689 } else {
2690 uv = -iv;
2691 sign = 1;
2692 }
2693 do {
eb160463 2694 *--ptr = '0' + (char)(uv % 10);
25da4f38
IZ
2695 } while (uv /= 10);
2696 if (sign)
2697 *--ptr = '-';
2698 *peob = ebuf;
2699 return ptr;
2700}
2701
645c22ef
DM
2702/*
2703=for apidoc sv_2pv_flags
2704
ff276b08 2705Returns a pointer to the string value of an SV, and sets *lp to its length.
645c22ef
DM
2706If flags includes SV_GMAGIC, does an mg_get() first. Coerces sv to a string
2707if necessary.
2708Normally invoked via the C<SvPV_flags> macro. C<sv_2pv()> and C<sv_2pv_nomg>
2709usually end up here too.
2710
2711=cut
2712*/
2713
8d6d96c1 2714char *
5de3775c 2715Perl_sv_2pv_flags(pTHX_ register SV *const sv, STRLEN *const lp, const I32 flags)
8d6d96c1 2716{
97aff369 2717 dVAR;
79072805 2718 register char *s;
79072805 2719
463ee0b2 2720 if (!sv) {
cdb061a3
NC
2721 if (lp)
2722 *lp = 0;
73d840c0 2723 return (char *)"";
463ee0b2 2724 }
8990e307 2725 if (SvGMAGICAL(sv)) {
8d6d96c1
HS
2726 if (flags & SV_GMAGIC)
2727 mg_get(sv);
463ee0b2 2728 if (SvPOKp(sv)) {
cdb061a3
NC
2729 if (lp)
2730 *lp = SvCUR(sv);
10516c54
NC
2731 if (flags & SV_MUTABLE_RETURN)
2732 return SvPVX_mutable(sv);
4d84ee25
NC
2733 if (flags & SV_CONST_RETURN)
2734 return (char *)SvPVX_const(sv);
463ee0b2
LW
2735 return SvPVX(sv);
2736 }
75dfc8ec
NC
2737 if (SvIOKp(sv) || SvNOKp(sv)) {
2738 char tbuf[64]; /* Must fit sprintf/Gconvert of longest IV/NV */
75dfc8ec
NC
2739 STRLEN len;
2740
2741 if (SvIOKp(sv)) {
e80fed9d 2742 len = SvIsUV(sv)
d9fad198
JH
2743 ? my_snprintf(tbuf, sizeof(tbuf), "%"UVuf, (UV)SvUVX(sv))
2744 : my_snprintf(tbuf, sizeof(tbuf), "%"IVdf, (IV)SvIVX(sv));
75dfc8ec 2745 } else {
e8ada2d0
NC
2746 Gconvert(SvNVX(sv), NV_DIG, 0, tbuf);
2747 len = strlen(tbuf);
75dfc8ec 2748 }
b5b886f0
NC
2749 assert(!SvROK(sv));
2750 {
75dfc8ec
NC
2751 dVAR;
2752
2753#ifdef FIXNEGATIVEZERO
e8ada2d0
NC
2754 if (len == 2 && tbuf[0] == '-' && tbuf[1] == '0') {
2755 tbuf[0] = '0';
2756 tbuf[1] = 0;
75dfc8ec
NC
2757 len = 1;
2758 }
2759#endif
2760 SvUPGRADE(sv, SVt_PV);
2761 if (lp)
2762 *lp = len;
2763 s = SvGROW_mutable(sv, len + 1);
2764 SvCUR_set(sv, len);
2765 SvPOKp_on(sv);
10edeb5d 2766 return (char*)memcpy(s, tbuf, len + 1);
75dfc8ec 2767 }
463ee0b2 2768 }
1c7ff15e
NC
2769 if (SvROK(sv)) {
2770 goto return_rok;
2771 }
2772 assert(SvTYPE(sv) >= SVt_PVMG);
2773 /* This falls through to the report_uninit near the end of the
2774 function. */
2775 } else if (SvTHINKFIRST(sv)) {
ed6116ce 2776 if (SvROK(sv)) {
1c7ff15e 2777 return_rok:
deb46114
NC
2778 if (SvAMAGIC(sv)) {
2779 SV *const tmpstr = AMG_CALLun(sv,string);
2780 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2781 /* Unwrap this: */
2782 /* char *pv = lp ? SvPV(tmpstr, *lp) : SvPV_nolen(tmpstr);
2783 */
2784
2785 char *pv;
2786 if ((SvFLAGS(tmpstr) & (SVf_POK)) == SVf_POK) {
2787 if (flags & SV_CONST_RETURN) {
2788 pv = (char *) SvPVX_const(tmpstr);
2789 } else {
2790 pv = (flags & SV_MUTABLE_RETURN)
2791 ? SvPVX_mutable(tmpstr) : SvPVX(tmpstr);
2792 }
2793 if (lp)
2794 *lp = SvCUR(tmpstr);
50adf7d2 2795 } else {
deb46114 2796 pv = sv_2pv_flags(tmpstr, lp, flags);
50adf7d2 2797 }
deb46114
NC
2798 if (SvUTF8(tmpstr))
2799 SvUTF8_on(sv);
2800 else
2801 SvUTF8_off(sv);
2802 return pv;
50adf7d2 2803 }
deb46114
NC
2804 }
2805 {
fafee734
NC
2806 STRLEN len;
2807 char *retval;
2808 char *buffer;
d8eae41e
NC
2809 const SV *const referent = (SV*)SvRV(sv);
2810
2811 if (!referent) {
fafee734
NC
2812 len = 7;
2813 retval = buffer = savepvn("NULLREF", len);
5c35adbb 2814 } else if (SvTYPE(referent) == SVt_REGEXP) {
67d2d14d
AB
2815 const REGEXP * const re = (REGEXP *)referent;
2816 I32 seen_evals = 0;
2817
2818 assert(re);
2819
2820 /* If the regex is UTF-8 we want the containing scalar to
2821 have an UTF-8 flag too */
2822 if (RX_UTF8(re))
2823 SvUTF8_on(sv);
2824 else
2825 SvUTF8_off(sv);
2826
2827 if ((seen_evals = RX_SEEN_EVALS(re)))
2828 PL_reginterp_cnt += seen_evals;
2829
2830 if (lp)
2831 *lp = RX_WRAPLEN(re);
2832
2833 return RX_WRAPPED(re);
d8eae41e
NC
2834 } else {
2835 const char *const typestr = sv_reftype(referent, 0);
fafee734
NC
2836 const STRLEN typelen = strlen(typestr);
2837 UV addr = PTR2UV(referent);
2838 const char *stashname = NULL;
2839 STRLEN stashnamelen = 0; /* hush, gcc */
2840 const char *buffer_end;
d8eae41e 2841
d8eae41e 2842 if (SvOBJECT(referent)) {
fafee734
NC
2843 const HEK *const name = HvNAME_HEK(SvSTASH(referent));
2844
2845 if (name) {
2846 stashname = HEK_KEY(name);
2847 stashnamelen = HEK_LEN(name);
2848
2849 if (HEK_UTF8(name)) {
2850 SvUTF8_on(sv);
2851 } else {
2852 SvUTF8_off(sv);
2853 }
2854 } else {
2855 stashname = "__ANON__";
2856 stashnamelen = 8;
2857 }
2858 len = stashnamelen + 1 /* = */ + typelen + 3 /* (0x */
2859 + 2 * sizeof(UV) + 2 /* )\0 */;
2860 } else {
2861 len = typelen + 3 /* (0x */
2862 + 2 * sizeof(UV) + 2 /* )\0 */;
d8eae41e 2863 }
fafee734
NC
2864
2865 Newx(buffer, len, char);
2866 buffer_end = retval = buffer + len;
2867
2868 /* Working backwards */
2869 *--retval = '\0';
2870 *--retval = ')';
2871 do {
2872 *--retval = PL_hexdigit[addr & 15];
2873 } while (addr >>= 4);
2874 *--retval = 'x';
2875 *--retval = '0';
2876 *--retval = '(';
2877
2878 retval -= typelen;
2879 memcpy(retval, typestr, typelen);
2880
2881 if (stashname) {
2882 *--retval = '=';
2883 retval -= stashnamelen;
2884 memcpy(retval, stashname, stashnamelen);
2885 }
2886 /* retval may not neccesarily have reached the start of the
2887 buffer here. */
2888 assert (retval >= buffer);
2889
2890 len = buffer_end - retval - 1; /* -1 for that \0 */
c080367d 2891 }
042dae7a 2892 if (lp)
fafee734
NC
2893 *lp = len;
2894 SAVEFREEPV(buffer);
2895 return retval;
463ee0b2 2896 }
79072805 2897 }
0336b60e 2898 if (SvREADONLY(sv) && !SvOK(sv)) {
cdb061a3
NC
2899 if (lp)
2900 *lp = 0;
9f621bb0
NC
2901 if (flags & SV_UNDEF_RETURNS_NULL)
2902 return NULL;
2903 if (ckWARN(WARN_UNINITIALIZED))
2904 report_uninit(sv);
73d840c0 2905 return (char *)"";
79072805 2906 }
79072805 2907 }
28e5dec8
JH
2908 if (SvIOK(sv) || ((SvIOKp(sv) && !SvNOKp(sv)))) {
2909 /* I'm assuming that if both IV and NV are equally valid then
2910 converting the IV is going to be more efficient */
e1ec3a88 2911 const U32 isUIOK = SvIsUV(sv);
28e5dec8
JH
2912 char buf[TYPE_CHARS(UV)];
2913 char *ebuf, *ptr;
97a130b8 2914 STRLEN len;
28e5dec8
JH
2915
2916 if (SvTYPE(sv) < SVt_PVIV)
2917 sv_upgrade(sv, SVt_PVIV);
4ea1d550 2918 ptr = uiv_2buf(buf, SvIVX(sv), SvUVX(sv), isUIOK, &ebuf);
97a130b8 2919 len = ebuf - ptr;
5902b6a9 2920 /* inlined from sv_setpvn */
97a130b8
NC
2921 s = SvGROW_mutable(sv, len + 1);
2922 Move(ptr, s, len, char);
2923 s += len;
28e5dec8 2924 *s = '\0';
28e5dec8
JH
2925 }
2926 else if (SvNOKp(sv)) {
c81271c3 2927 const int olderrno = errno;
79072805
LW
2928 if (SvTYPE(sv) < SVt_PVNV)
2929 sv_upgrade(sv, SVt_PVNV);
1c846c1f 2930 /* The +20 is pure guesswork. Configure test needed. --jhi */
5902b6a9 2931 s = SvGROW_mutable(sv, NV_DIG + 20);
c81271c3 2932 /* some Xenix systems wipe out errno here */
79072805 2933#ifdef apollo
463ee0b2 2934 if (SvNVX(sv) == 0.0)
d1307786 2935 my_strlcpy(s, "0", SvLEN(sv));
79072805
LW
2936 else
2937#endif /*apollo*/
bbce6d69 2938 {
2d4389e4 2939 Gconvert(SvNVX(sv), NV_DIG, 0, s);
bbce6d69 2940 }
79072805 2941 errno = olderrno;
a0d0e21e 2942#ifdef FIXNEGATIVEZERO
20773dcd
NC
2943 if (*s == '-' && s[1] == '0' && !s[2]) {
2944 s[0] = '0';
2945 s[1] = 0;
2946 }
a0d0e21e 2947#endif
79072805
LW
2948 while (*s) s++;
2949#ifdef hcx
2950 if (s[-1] == '.')
46fc3d4c 2951 *--s = '\0';
79072805
LW
2952#endif
2953 }
79072805 2954 else {
675c862f 2955 if (isGV_with_GP(sv))
19f6321d 2956 return glob_2pv((GV *)sv, lp);
180488f8 2957
cdb061a3 2958 if (lp)
00b6aa41 2959 *lp = 0;
9f621bb0
NC
2960 if (flags & SV_UNDEF_RETURNS_NULL)
2961 return NULL;
2962 if (!PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP) && ckWARN(WARN_UNINITIALIZED))
2963 report_uninit(sv);
25da4f38
IZ
2964 if (SvTYPE(sv) < SVt_PV)
2965 /* Typically the caller expects that sv_any is not NULL now. */
2966 sv_upgrade(sv, SVt_PV);
73d840c0 2967 return (char *)"";
79072805 2968 }
cdb061a3 2969 {
823a54a3 2970 const STRLEN len = s - SvPVX_const(sv);
cdb061a3
NC
2971 if (lp)
2972 *lp = len;
2973 SvCUR_set(sv, len);
2974 }
79072805 2975 SvPOK_on(sv);
1d7c1841 2976 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3f7c398e 2977 PTR2UV(sv),SvPVX_const(sv)));
4d84ee25
NC
2978 if (flags & SV_CONST_RETURN)
2979 return (char *)SvPVX_const(sv);
10516c54
NC
2980 if (flags & SV_MUTABLE_RETURN)
2981 return SvPVX_mutable(sv);
463ee0b2
LW
2982 return SvPVX(sv);
2983}
2984
645c22ef 2985/*
6050d10e
JP
2986=for apidoc sv_copypv
2987
2988Copies a stringified representation of the source SV into the
2989destination SV. Automatically performs any necessary mg_get and
54f0641b 2990coercion of numeric values into strings. Guaranteed to preserve
2575c402 2991UTF8 flag even from overloaded objects. Similar in nature to
54f0641b
NIS
2992sv_2pv[_flags] but operates directly on an SV instead of just the
2993string. Mostly uses sv_2pv_flags to do its work, except when that
6050d10e
JP
2994would lose the UTF-8'ness of the PV.
2995
2996=cut
2997*/
2998
2999void
5de3775c 3000Perl_sv_copypv(pTHX_ SV *const dsv, register SV *const ssv)
6050d10e 3001{
446eaa42 3002 STRLEN len;
53c1dcc0 3003 const char * const s = SvPV_const(ssv,len);
7918f24d
NC
3004
3005 PERL_ARGS_ASSERT_SV_COPYPV;
3006
cb50f42d 3007 sv_setpvn(dsv,s,len);
446eaa42 3008 if (SvUTF8(ssv))
cb50f42d 3009 SvUTF8_on(dsv);
446eaa42 3010 else
cb50f42d 3011 SvUTF8_off(dsv);
6050d10e
JP
3012}
3013
3014/*
645c22ef
DM
3015=for apidoc sv_2pvbyte
3016
3017Return a pointer to the byte-encoded representation of the SV, and set *lp
1e54db1a 3018to its length. May cause the SV to be downgraded from UTF-8 as a
645c22ef
DM
3019side-effect.
3020
3021Usually accessed via the C<SvPVbyte> macro.
3022
3023=cut
3024*/
3025
7340a771 3026char *
5de3775c 3027Perl_sv_2pvbyte(pTHX_ register SV *const sv, STRLEN *const lp)
7340a771 3028{
7918f24d
NC
3029 PERL_ARGS_ASSERT_SV_2PVBYTE;
3030
0875d2fe 3031 sv_utf8_downgrade(sv,0);
97972285 3032 return lp ? SvPV(sv,*lp) : SvPV_nolen(sv);
7340a771
GS
3033}
3034
645c22ef 3035/*
035cbb0e
RGS
3036=for apidoc sv_2pvutf8
3037
3038Return a pointer to the UTF-8-encoded representation of the SV, and set *lp
3039to its length. May cause the SV to be upgraded to UTF-8 as a side-effect.
3040
3041Usually accessed via the C<SvPVutf8> macro.
3042
3043=cut
3044*/
645c22ef 3045
7340a771 3046char *
7bc54cea 3047Perl_sv_2pvutf8(pTHX_ register SV *const sv, STRLEN *const lp)
7340a771 3048{
7918f24d
NC
3049 PERL_ARGS_ASSERT_SV_2PVUTF8;
3050
035cbb0e
RGS
3051 sv_utf8_upgrade(sv);
3052 return lp ? SvPV(sv,*lp) : SvPV_nolen(sv);
7340a771 3053}
1c846c1f 3054
7ee2227d 3055
645c22ef
DM
3056/*
3057=for apidoc sv_2bool
3058
3059This function is only called on magical items, and is only used by
8cf8f3d1 3060sv_true() or its macro equivalent.
645c22ef
DM
3061
3062=cut
3063*/
3064
463ee0b2 3065bool
7bc54cea 3066Perl_sv_2bool(pTHX_ register SV *const sv)
463ee0b2 3067{
97aff369 3068 dVAR;
7918f24d
NC
3069
3070 PERL_ARGS_ASSERT_SV_2BOOL;
3071
5b295bef 3072 SvGETMAGIC(sv);
463ee0b2 3073
a0d0e21e
LW
3074 if (!SvOK(sv))
3075 return 0;
3076 if (SvROK(sv)) {
fabdb6c0
AL
3077 if (SvAMAGIC(sv)) {
3078 SV * const tmpsv = AMG_CALLun(sv,bool_);
3079 if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
3080 return (bool)SvTRUE(tmpsv);
3081 }
3082 return SvRV(sv) != 0;
a0d0e21e 3083 }
463ee0b2 3084 if (SvPOKp(sv)) {
53c1dcc0
AL
3085 register XPV* const Xpvtmp = (XPV*)SvANY(sv);
3086 if (Xpvtmp &&
339049b0 3087 (*sv->sv_u.svu_pv > '0' ||
11343788 3088 Xpvtmp->xpv_cur > 1 ||
339049b0 3089 (Xpvtmp->xpv_cur && *sv->sv_u.svu_pv != '0')))
463ee0b2
LW
3090 return 1;
3091 else
3092 return 0;
3093 }
3094 else {
3095 if (SvIOKp(sv))
3096 return SvIVX(sv) != 0;
3097 else {
3098 if (SvNOKp(sv))
3099 return SvNVX(sv) != 0.0;
180488f8 3100 else {
f7877b28 3101 if (isGV_with_GP(sv))
180488f8
NC
3102 return TRUE;
3103 else
3104 return FALSE;
3105 }
463ee0b2
LW
3106 }
3107 }
79072805
LW
3108}
3109
c461cf8f
JH
3110/*
3111=for apidoc sv_utf8_upgrade
3112
78ea37eb 3113Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 3114Forces the SV to string form if it is not already.
4411f3b6
NIS
3115Always sets the SvUTF8 flag to avoid future validity checks even
3116if all the bytes have hibit clear.
c461cf8f 3117
13a6c0e0
JH
3118This is not as a general purpose byte encoding to Unicode interface:
3119use the Encode extension for that.
3120
8d6d96c1
HS
3121=for apidoc sv_utf8_upgrade_flags
3122
78ea37eb 3123Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 3124Forces the SV to string form if it is not already.
8d6d96c1
HS
3125Always sets the SvUTF8 flag to avoid future validity checks even
3126if all the bytes have hibit clear. If C<flags> has C<SV_GMAGIC> bit set,
3127will C<mg_get> on C<sv> if appropriate, else not. C<sv_utf8_upgrade> and
3128C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
3129
13a6c0e0
JH
3130This is not as a general purpose byte encoding to Unicode interface:
3131use the Encode extension for that.
3132
8d6d96c1
HS
3133=cut
3134*/
3135
3136STRLEN
7bc54cea 3137Perl_sv_utf8_upgrade_flags(pTHX_ register SV *const sv, const I32 flags)
8d6d96c1 3138{
97aff369 3139 dVAR;
7918f24d
NC
3140
3141 PERL_ARGS_ASSERT_SV_UTF8_UPGRADE_FLAGS;
3142
808c356f
RGS
3143 if (sv == &PL_sv_undef)
3144 return 0;
e0e62c2a
NIS
3145 if (!SvPOK(sv)) {
3146 STRLEN len = 0;
d52b7888
NC
3147 if (SvREADONLY(sv) && (SvPOKp(sv) || SvIOKp(sv) || SvNOKp(sv))) {
3148 (void) sv_2pv_flags(sv,&len, flags);
3149 if (SvUTF8(sv))
3150 return len;
3151 } else {
3152 (void) SvPV_force(sv,len);
3153 }
e0e62c2a 3154 }
4411f3b6 3155
f5cee72b 3156 if (SvUTF8(sv)) {
5fec3b1d 3157 return SvCUR(sv);
f5cee72b 3158 }
5fec3b1d 3159
765f542d
NC
3160 if (SvIsCOW(sv)) {
3161 sv_force_normal_flags(sv, 0);
db42d148
NIS
3162 }
3163
88632417 3164 if (PL_encoding && !(flags & SV_UTF8_NO_ENCODING))
799ef3cb 3165 sv_recode_to_utf8(sv, PL_encoding);
9f4817db 3166 else { /* Assume Latin-1/EBCDIC */
c4e7c712
NC
3167 /* This function could be much more efficient if we
3168 * had a FLAG in SVs to signal if there are any hibit
3169 * chars in the PV. Given that there isn't such a flag
3170 * make the loop as fast as possible. */
00b6aa41 3171 const U8 * const s = (U8 *) SvPVX_const(sv);
c4420975 3172 const U8 * const e = (U8 *) SvEND(sv);
93524f2b 3173 const U8 *t = s;
c4e7c712
NC
3174
3175 while (t < e) {
53c1dcc0 3176 const U8 ch = *t++;
00b6aa41
AL
3177 /* Check for hi bit */
3178 if (!NATIVE_IS_INVARIANT(ch)) {
4612962a
NC
3179 STRLEN len = SvCUR(sv);
3180 /* *Currently* bytes_to_utf8() adds a '\0' after every string
3181 it converts. This isn't documented. It's not clear if it's
3182 a bad thing to be doing, and should be changed to do exactly
3183 what the documentation says. If so, this code will have to
3184 be changed.
3185 As is, we mustn't rely on our incoming SV being well formed
3186 and having a trailing '\0', as certain code in pp_formline
3187 can send us partially built SVs. */
00b6aa41
AL
3188 U8 * const recoded = bytes_to_utf8((U8*)s, &len);
3189
3190 SvPV_free(sv); /* No longer using what was there before. */
3191 SvPV_set(sv, (char*)recoded);
4612962a
NC
3192 SvCUR_set(sv, len);
3193 SvLEN_set(sv, len + 1); /* No longer know the real size. */
c4e7c712 3194 break;
00b6aa41 3195 }
c4e7c712
NC
3196 }
3197 /* Mark as UTF-8 even if no hibit - saves scanning loop */
3198 SvUTF8_on(sv);
560a288e 3199 }
4411f3b6 3200 return SvCUR(sv);
560a288e
GS
3201}
3202
c461cf8f
JH
3203/*
3204=for apidoc sv_utf8_downgrade
3205
78ea37eb
TS
3206Attempts to convert the PV of an SV from characters to bytes.
3207If the PV contains a character beyond byte, this conversion will fail;
3208in this case, either returns false or, if C<fail_ok> is not
c461cf8f
JH
3209true, croaks.
3210
13a6c0e0
JH
3211This is not as a general purpose Unicode to byte encoding interface:
3212use the Encode extension for that.
3213
c461cf8f
JH
3214=cut
3215*/
3216
560a288e 3217bool
7bc54cea 3218Perl_sv_utf8_downgrade(pTHX_ register SV *const sv, const bool fail_ok)
560a288e 3219{
97aff369 3220 dVAR;
7918f24d
NC
3221
3222 PERL_ARGS_ASSERT_SV_UTF8_DOWNGRADE;
3223
78ea37eb 3224 if (SvPOKp(sv) && SvUTF8(sv)) {
fa301091 3225 if (SvCUR(sv)) {
03cfe0ae 3226 U8 *s;
652088fc 3227 STRLEN len;
fa301091 3228
765f542d
NC
3229 if (SvIsCOW(sv)) {
3230 sv_force_normal_flags(sv, 0);
3231 }
03cfe0ae
NIS
3232 s = (U8 *) SvPV(sv, len);
3233 if (!utf8_to_bytes(s, &len)) {
fa301091
JH
3234 if (fail_ok)
3235 return FALSE;
3236 else {
3237 if (PL_op)
3238 Perl_croak(aTHX_ "Wide character in %s",
53e06cf0 3239 OP_DESC(PL_op));
fa301091
JH
3240 else
3241 Perl_croak(aTHX_ "Wide character");
3242 }
4b3603a4 3243 }
b162af07 3244 SvCUR_set(sv, len);
67e989fb 3245 }
560a288e 3246 }
ffebcc3e 3247 SvUTF8_off(sv);
560a288e
GS
3248 return TRUE;
3249}
3250
c461cf8f
JH
3251/*
3252=for apidoc sv_utf8_encode
3253
78ea37eb
TS
3254Converts the PV of an SV to UTF-8, but then turns the C<SvUTF8>
3255flag off so that it looks like octets again.
c461cf8f
JH
3256
3257=cut
3258*/
3259
560a288e 3260void
7bc54cea 3261Perl_sv_utf8_encode(pTHX_ register SV *const sv)
560a288e 3262{
7918f24d
NC
3263 PERL_ARGS_ASSERT_SV_UTF8_ENCODE;
3264
4c94c214
NC
3265 if (SvIsCOW(sv)) {
3266 sv_force_normal_flags(sv, 0);
3267 }
3268 if (SvREADONLY(sv)) {
3269 Perl_croak(aTHX_ PL_no_modify);
3270 }
a5f5288a 3271 (void) sv_utf8_upgrade(sv);
560a288e
GS
3272 SvUTF8_off(sv);
3273}
3274
4411f3b6
NIS
3275/*
3276=for apidoc sv_utf8_decode
3277
78ea37eb
TS
3278If the PV of the SV is an octet sequence in UTF-8
3279and contains a multiple-byte character, the C<SvUTF8> flag is turned on
3280so that it looks like a character. If the PV contains only single-byte
3281characters, the C<SvUTF8> flag stays being off.
3282Scans PV for validity and returns false if the PV is invalid UTF-8.
4411f3b6
NIS
3283
3284=cut
3285*/
3286
560a288e 3287bool
7bc54cea 3288Perl_sv_utf8_decode(pTHX_ register SV *const sv)
560a288e 3289{
7918f24d
NC
3290 PERL_ARGS_ASSERT_SV_UTF8_DECODE;
3291
78ea37eb 3292 if (SvPOKp(sv)) {
93524f2b
NC
3293 const U8 *c;
3294 const U8 *e;
9cbac4c7 3295
645c22ef
DM
3296 /* The octets may have got themselves encoded - get them back as
3297 * bytes
3298 */
3299 if (!sv_utf8_downgrade(sv, TRUE))
560a288e
GS
3300 return FALSE;
3301
3302 /* it is actually just a matter of turning the utf8 flag on, but
3303 * we want to make sure everything inside is valid utf8 first.
3304 */
93524f2b 3305 c = (const U8 *) SvPVX_const(sv);
63cd0674 3306 if (!is_utf8_string(c, SvCUR(sv)+1))
67e989fb 3307 return FALSE;
93524f2b 3308 e = (const U8 *) SvEND(sv);
511c2ff0 3309 while (c < e) {
b64e5050 3310 const U8 ch = *c++;
c4d5f83a 3311 if (!UTF8_IS_INVARIANT(ch)) {
67e989fb
JH
3312 SvUTF8_on(sv);
3313 break;
3314 }
560a288e 3315 }
560a288e
GS
3316 }
3317 return TRUE;
3318}
3319
954c1994
GS
3320/*
3321=for apidoc sv_setsv
3322
645c22ef
DM
3323Copies the contents of the source SV C<ssv> into the destination SV
3324C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
3325function if the source SV needs to be reused. Does not handle 'set' magic.
3326Loosely speaking, it performs a copy-by-value, obliterating any previous
3327content of the destination.
3328
3329You probably want to use one of the assortment of wrappers, such as
3330C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3331C<SvSetMagicSV_nosteal>.
3332
8d6d96c1
HS
3333=for apidoc sv_setsv_flags
3334
645c22ef
DM
3335Copies the contents of the source SV C<ssv> into the destination SV
3336C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
3337function if the source SV needs to be reused. Does not handle 'set' magic.
3338Loosely speaking, it performs a copy-by-value, obliterating any previous
3339content of the destination.
3340If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
5fcdf167
NC
3341C<ssv> if appropriate, else not. If the C<flags> parameter has the
3342C<NOSTEAL> bit set then the buffers of temps will not be stolen. <sv_setsv>
3343and C<sv_setsv_nomg> are implemented in terms of this function.
645c22ef
DM
3344
3345You probably want to use one of the assortment of wrappers, such as
3346C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3347C<SvSetMagicSV_nosteal>.
3348
3349This is the primary function for copying scalars, and most other
3350copy-ish functions and macros use this underneath.
8d6d96c1
HS
3351
3352=cut
3353*/
3354
5d0301b7 3355static void
7bc54cea 3356S_glob_assign_glob(pTHX_ SV *const dstr, SV *const sstr, const int dtype)
5d0301b7 3357{
70cd14a1 3358 I32 mro_changes = 0; /* 1 = method, 2 = isa */
dd69841b 3359
7918f24d
NC
3360 PERL_ARGS_ASSERT_GLOB_ASSIGN_GLOB;
3361
5d0301b7
NC
3362 if (dtype != SVt_PVGV) {
3363 const char * const name = GvNAME(sstr);
3364 const STRLEN len = GvNAMELEN(sstr);
0d092c36 3365 {
f7877b28
NC
3366 if (dtype >= SVt_PV) {
3367 SvPV_free(dstr);
3368 SvPV_set(dstr, 0);
3369 SvLEN_set(dstr, 0);
3370 SvCUR_set(dstr, 0);
3371 }
0d092c36 3372 SvUPGRADE(dstr, SVt_PVGV);
dedf8e73 3373 (void)SvOK_off(dstr);
2e5b91de
NC
3374 /* FIXME - why are we doing this, then turning it off and on again
3375 below? */
3376 isGV_with_GP_on(dstr);
f7877b28 3377 }
5d0301b7
NC
3378 GvSTASH(dstr) = GvSTASH(sstr);
3379 if (GvSTASH(dstr))
3380 Perl_sv_add_backref(aTHX_ (SV*)GvSTASH(dstr), dstr);
ae8cc45f 3381 gv_name_set((GV *)dstr, name, len, GV_ADD);
5d0301b7
NC
3382 SvFAKE_on(dstr); /* can coerce to non-glob */
3383 }
3384
3385#ifdef GV_UNIQUE_CHECK
3386 if (GvUNIQUE((GV*)dstr)) {
3387 Perl_croak(aTHX_ PL_no_modify);
3388 }
3389#endif
3390
dd69841b
BB
3391 if(GvGP((GV*)sstr)) {
3392 /* If source has method cache entry, clear it */
3393 if(GvCVGEN(sstr)) {
3394 SvREFCNT_dec(GvCV(sstr));
3395 GvCV(sstr) = NULL;
3396 GvCVGEN(sstr) = 0;
3397 }
3398 /* If source has a real method, then a method is
3399 going to change */
3400 else if(GvCV((GV*)sstr)) {
70cd14a1 3401 mro_changes = 1;
dd69841b
BB
3402 }
3403 }
3404
3405 /* If dest already had a real method, that's a change as well */
70cd14a1
CB
3406 if(!mro_changes && GvGP((GV*)dstr) && GvCVu((GV*)dstr)) {
3407 mro_changes = 1;
dd69841b
BB
3408 }
3409
70cd14a1
CB
3410 if(strEQ(GvNAME((GV*)dstr),"ISA"))
3411 mro_changes = 2;
3412
f7877b28 3413 gp_free((GV*)dstr);
2e5b91de 3414 isGV_with_GP_off(dstr);
5d0301b7 3415 (void)SvOK_off(dstr);
2e5b91de 3416 isGV_with_GP_on(dstr);
dedf8e73 3417 GvINTRO_off(dstr); /* one-shot flag */
5d0301b7
NC
3418 GvGP(dstr) = gp_ref(GvGP(sstr));
3419 if (SvTAINTED(sstr))
3420 SvTAINT(dstr);
3421 if (GvIMPORTED(dstr) != GVf_IMPORTED
3422 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3423 {
3424 GvIMPORTED_on(dstr);
3425 }
3426 GvMULTI_on(dstr);
70cd14a1
CB
3427 if(mro_changes == 2) mro_isa_changed_in(GvSTASH(dstr));
3428 else if(mro_changes) mro_method_changed_in(GvSTASH(dstr));
5d0301b7
NC
3429 return;
3430}
3431
b8473700 3432static void
7bc54cea 3433S_glob_assign_ref(pTHX_ SV *const dstr, SV *const sstr)
7918f24d 3434{
b8473700
NC
3435 SV * const sref = SvREFCNT_inc(SvRV(sstr));
3436 SV *dref = NULL;
3437 const int intro = GvINTRO(dstr);
2440974c 3438 SV **location;
3386d083 3439 U8 import_flag = 0;
27242d61
NC
3440 const U32 stype = SvTYPE(sref);
3441
7918f24d 3442 PERL_ARGS_ASSERT_GLOB_ASSIGN_REF;
b8473700
NC
3443
3444#ifdef GV_UNIQUE_CHECK
3445 if (GvUNIQUE((GV*)dstr)) {
3446 Perl_croak(aTHX_ PL_no_modify);
3447 }
3448#endif
3449
3450 if (intro) {
3451 GvINTRO_off(dstr); /* one-shot flag */
3452 GvLINE(dstr) = CopLINE(PL_curcop);
3453 GvEGV(dstr) = (GV*)dstr;
3454 }
3455 GvMULTI_on(dstr);
27242d61 3456 switch (stype) {
b8473700 3457 case SVt_PVCV:
27242d61
NC
3458 location = (SV **) &GvCV(dstr);
3459 import_flag = GVf_IMPORTED_CV;
3460 goto common;
3461 case SVt_PVHV:
3462 location = (SV **) &GvHV(dstr);
3463 import_flag = GVf_IMPORTED_HV;
3464 goto common;
3465 case SVt_PVAV:
3466 location = (SV **) &GvAV(dstr);
3467 import_flag = GVf_IMPORTED_AV;
3468 goto common;
3469 case SVt_PVIO:
3470 location = (SV **) &GvIOp(dstr);
3471 goto common;
3472 case SVt_PVFM:
3473 location = (SV **) &GvFORM(dstr);
3474 default:
3475 location = &GvSV(dstr);
3476 import_flag = GVf_IMPORTED_SV;
3477 common:
b8473700 3478 if (intro) {
27242d61 3479 if (stype == SVt_PVCV) {
5f2fca8a
BB
3480 /*if (GvCVGEN(dstr) && (GvCV(dstr) != (CV*)sref || GvCVGEN(dstr))) {*/
3481 if (GvCVGEN(dstr)) {
27242d61
NC
3482 SvREFCNT_dec(GvCV(dstr));
3483 GvCV(dstr) = NULL;
3484 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
27242d61 3485 }
b8473700 3486 }
27242d61 3487 SAVEGENERICSV(*location);
b8473700
NC
3488 }
3489 else
27242d61 3490 dref = *location;
5f2fca8a 3491 if (stype == SVt_PVCV && (*location != sref || GvCVGEN(dstr))) {
27242d61 3492 CV* const cv = (CV*)*location;
b8473700
NC
3493 if (cv) {
3494 if (!GvCVGEN((GV*)dstr) &&
3495 (CvROOT(cv) || CvXSUB(cv)))
3496 {
3497 /* Redefining a sub - warning is mandatory if
3498 it was a const and its value changed. */
3499 if (CvCONST(cv) && CvCONST((CV*)sref)
3500 && cv_const_sv(cv) == cv_const_sv((CV*)sref)) {
6f207bd3 3501 NOOP;
b8473700
NC
3502 /* They are 2 constant subroutines generated from
3503 the same constant. This probably means that
3504 they are really the "same" proxy subroutine
3505 instantiated in 2 places. Most likely this is
3506 when a constant is exported twice. Don't warn.
3507 */
3508 }
3509 else if (ckWARN(WARN_REDEFINE)
3510 || (CvCONST(cv)
3511 && (!CvCONST((CV*)sref)
3512 || sv_cmp(cv_const_sv(cv),
3513 cv_const_sv((CV*)sref))))) {
3514 Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
10edeb5d
JH
3515 (const char *)
3516 (CvCONST(cv)
3517 ? "Constant subroutine %s::%s redefined"
3518 : "Subroutine %s::%s redefined"),
b8473700
NC
3519 HvNAME_get(GvSTASH((GV*)dstr)),
3520 GvENAME((GV*)dstr));
3521 }
3522 }
3523 if (!intro)
cbf82dd0
NC
3524 cv_ckproto_len(cv, (GV*)dstr,
3525 SvPOK(sref) ? SvPVX_const(sref) : NULL,
3526 SvPOK(sref) ? SvCUR(sref) : 0);
b8473700 3527 }
b8473700
NC
3528 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3529 GvASSUMECV_on(dstr);
dd69841b 3530 if(GvSTASH(dstr)) mro_method_changed_in(GvSTASH(dstr)); /* sub foo { 1 } sub bar { 2 } *bar = \&foo */
b8473700 3531 }
2440974c 3532 *location = sref;
3386d083
NC
3533 if (import_flag && !(GvFLAGS(dstr) & import_flag)
3534 && CopSTASH_ne(PL_curcop, GvSTASH(dstr))) {
3535 GvFLAGS(dstr) |= import_flag;
b8473700
NC
3536 }
3537 break;
3538 }
b37c2d43 3539 SvREFCNT_dec(dref);
b8473700
NC
3540 if (SvTAINTED(sstr))
3541 SvTAINT(dstr);
3542 return;
3543}
3544
8d6d96c1 3545void
7bc54cea 3546Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV* sstr, const I32 flags)
8d6d96c1 3547{
97aff369 3548 dVAR;
8990e307
LW
3549 register U32 sflags;
3550 register int dtype;
42d0e0b7 3551 register svtype stype;
463ee0b2 3552
7918f24d
NC
3553 PERL_ARGS_ASSERT_SV_SETSV_FLAGS;
3554
79072805
LW
3555 if (sstr == dstr)
3556 return;
29f4f0ab
NC
3557
3558 if (SvIS_FREED(dstr)) {
3559 Perl_croak(aTHX_ "panic: attempt to copy value %" SVf
be2597df 3560 " to a freed scalar %p", SVfARG(sstr), (void *)dstr);
29f4f0ab 3561 }
765f542d 3562 SV_CHECK_THINKFIRST_COW_DROP(dstr);
79072805 3563 if (!sstr)
3280af22 3564 sstr = &PL_sv_undef;
29f4f0ab 3565 if (SvIS_FREED(sstr)) {
6c9570dc
MHM
3566 Perl_croak(aTHX_ "panic: attempt to copy freed scalar %p to %p",
3567 (void*)sstr, (void*)dstr);
29f4f0ab 3568 }
8990e307
LW
3569 stype = SvTYPE(sstr);
3570 dtype = SvTYPE(dstr);
79072805 3571
52944de8 3572 (void)SvAMAGIC_off(dstr);
7a5fa8a2 3573 if ( SvVOK(dstr) )
ece467f9
JP
3574 {
3575 /* need to nuke the magic */
3576 mg_free(dstr);
ece467f9 3577 }
9e7bc3e8 3578
463ee0b2 3579 /* There's a lot of redundancy below but we're going for speed here */
79072805 3580
8990e307 3581 switch (stype) {
79072805 3582 case SVt_NULL:
aece5585 3583 undef_sstr:
20408e3c
GS
3584 if (dtype != SVt_PVGV) {
3585 (void)SvOK_off(dstr);
3586 return;
3587 }
3588 break;
463ee0b2 3589 case SVt_IV:
aece5585
GA
3590 if (SvIOK(sstr)) {
3591 switch (dtype) {
3592 case SVt_NULL:
8990e307 3593 sv_upgrade(dstr, SVt_IV);
aece5585
GA
3594 break;
3595 case SVt_NV:
aece5585 3596 case SVt_PV:
a0d0e21e 3597 sv_upgrade(dstr, SVt_PVIV);
aece5585 3598 break;
010be86b
NC
3599 case SVt_PVGV:
3600 goto end_of_first_switch;
aece5585
GA
3601 }
3602 (void)SvIOK_only(dstr);
45977657 3603 SvIV_set(dstr, SvIVX(sstr));
25da4f38
IZ
3604 if (SvIsUV(sstr))
3605 SvIsUV_on(dstr);
37c25af0
NC
3606 /* SvTAINTED can only be true if the SV has taint magic, which in
3607 turn means that the SV type is PVMG (or greater). This is the
3608 case statement for SVt_IV, so this cannot be true (whatever gcov
3609 may say). */
3610 assert(!SvTAINTED(sstr));
aece5585 3611 return;
8990e307 3612 }
4df7f6af
NC
3613 if (!SvROK(sstr))
3614 goto undef_sstr;
3615 if (dtype < SVt_PV && dtype != SVt_IV)
3616 sv_upgrade(dstr, SVt_IV);
3617 break;
aece5585 3618
463ee0b2 3619 case SVt_NV:
aece5585
GA
3620 if (SvNOK(sstr)) {
3621 switch (dtype) {
3622 case SVt_NULL:
3623 case SVt_IV:
8990e307 3624 sv_upgrade(dstr, SVt_NV);
aece5585 3625 break;
aece5585
GA
3626 case SVt_PV:
3627 case SVt_PVIV:
a0d0e21e 3628 sv_upgrade(dstr, SVt_PVNV);
aece5585 3629 break;
010be86b
NC
3630 case SVt_PVGV:
3631 goto end_of_first_switch;
aece5585 3632 }
9d6ce603 3633 SvNV_set(dstr, SvNVX(sstr));
aece5585 3634 (void)SvNOK_only(dstr);
37c25af0
NC
3635 /* SvTAINTED can only be true if the SV has taint magic, which in
3636 turn means that the SV type is PVMG (or greater). This is the
3637 case statement for SVt_NV, so this cannot be true (whatever gcov
3638 may say). */
3639 assert(!SvTAINTED(sstr));
aece5585 3640 return;
8990e307 3641 }
aece5585
GA
3642 goto undef_sstr;
3643
fc36a67e 3644 case SVt_PVFM:
f8c7b90f 3645#ifdef PERL_OLD_COPY_ON_WRITE
d89fc664
NC
3646 if ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS) {
3647 if (dtype < SVt_PVIV)
3648 sv_upgrade(dstr, SVt_PVIV);
3649 break;
3650 }
3651 /* Fall through */
3652#endif
fd44068c 3653 case SVt_REGEXP:
d89fc664 3654 case SVt_PV:
8990e307 3655 if (dtype < SVt_PV)
463ee0b2 3656 sv_upgrade(dstr, SVt_PV);
463ee0b2
LW
3657 break;
3658 case SVt_PVIV:
8990e307 3659 if (dtype < SVt_PVIV)
463ee0b2 3660 sv_upgrade(dstr, SVt_PVIV);
463ee0b2
LW
3661 break;
3662 case SVt_PVNV:
8990e307 3663 if (dtype < SVt_PVNV)
463ee0b2 3664 sv_upgrade(dstr, SVt_PVNV);
463ee0b2 3665 break;
489f7bfe 3666 default:
a3b680e6
AL
3667 {
3668 const char * const type = sv_reftype(sstr,0);
533c011a 3669 if (PL_op)
a3b680e6 3670 Perl_croak(aTHX_ "Bizarre copy of %s in %s", type, OP_NAME(PL_op));
4633a7c4 3671 else
a3b680e6
AL
3672 Perl_croak(aTHX_ "Bizarre copy of %s", type);
3673 }
4633a7c4
LW
3674 break;
3675
cecf5685 3676 /* case SVt_BIND: */
39cb70dc 3677 case SVt_PVLV:
79072805 3678 case SVt_PVGV:
cecf5685 3679 if (isGV_with_GP(sstr) && dtype <= SVt_PVGV) {
d4c19fe8 3680 glob_assign_glob(dstr, sstr, dtype);
b8c701c1 3681 return;
79072805 3682 }
cecf5685 3683 /* SvVALID means that this PVGV is playing at being an FBM. */
5f66b61c 3684 /*FALLTHROUGH*/
79072805 3685
489f7bfe 3686 case SVt_PVMG:
8d6d96c1 3687 if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
973f89ab 3688 mg_get(sstr);
1d9c78c6 3689 if (SvTYPE(sstr) != stype) {
973f89ab 3690 stype = SvTYPE(sstr);
cecf5685 3691 if (isGV_with_GP(sstr) && stype == SVt_PVGV && dtype <= SVt_PVGV) {
d4c19fe8 3692 glob_assign_glob(dstr, sstr, dtype);
b8c701c1
NC
3693 return;
3694 }
973f89ab
CS
3695 }
3696 }
ded42b9f 3697 if (stype == SVt_PVLV)
862a34c6 3698 SvUPGRADE(dstr, SVt_PVNV);
ded42b9f 3699 else
42d0e0b7 3700 SvUPGRADE(dstr, (svtype)stype);
79072805 3701 }
010be86b 3702 end_of_first_switch:
79072805 3703
ff920335
NC
3704 /* dstr may have been upgraded. */
3705 dtype = SvTYPE(dstr);
8990e307
LW
3706 sflags = SvFLAGS(sstr);
3707
ba2fdce6 3708 if (dtype == SVt_PVCV || dtype == SVt_PVFM) {
85324b4d
NC
3709 /* Assigning to a subroutine sets the prototype. */
3710 if (SvOK(sstr)) {
3711 STRLEN len;
3712 const char *const ptr = SvPV_const(sstr, len);
3713
3714 SvGROW(dstr, len + 1);
3715 Copy(ptr, SvPVX(dstr), len + 1, char);
3716 SvCUR_set(dstr, len);
fcddd32e 3717 SvPOK_only(dstr);
ba2fdce6 3718 SvFLAGS(dstr) |= sflags & SVf_UTF8;
85324b4d
NC
3719 } else {
3720 SvOK_off(dstr);
3721 }
ba2fdce6
NC
3722 } else if (dtype == SVt_PVAV || dtype == SVt_PVHV) {
3723 const char * const type = sv_reftype(dstr,0);
3724 if (PL_op)
3725 Perl_croak(aTHX_ "Cannot copy to %s in %s", type, OP_NAME(PL_op));
3726 else
3727 Perl_croak(aTHX_ "Cannot copy to %s", type);
85324b4d 3728 } else if (sflags & SVf_ROK) {
cecf5685 3729 if (isGV_with_GP(dstr) && dtype == SVt_PVGV
785bee4f 3730 && SvTYPE(SvRV(sstr)) == SVt_PVGV && isGV_with_GP(SvRV(sstr))) {
acaa9288
NC
3731 sstr = SvRV(sstr);
3732 if (sstr == dstr) {
3733 if (GvIMPORTED(dstr) != GVf_IMPORTED
3734 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3735 {
3736 GvIMPORTED_on(dstr);
3737 }
3738 GvMULTI_on(dstr);
3739 return;
3740 }
785bee4f
NC
3741 glob_assign_glob(dstr, sstr, dtype);
3742 return;
acaa9288
NC
3743 }
3744
8990e307 3745 if (dtype >= SVt_PV) {
fdc5b023 3746 if (dtype == SVt_PVGV && isGV_with_GP(dstr)) {
d4c19fe8 3747 glob_assign_ref(dstr, sstr);
b8c701c1
NC
3748 return;
3749 }
3f7c398e 3750 if (SvPVX_const(dstr)) {
8bd4d4c5 3751 SvPV_free(dstr);
b162af07
SP
3752 SvLEN_set(dstr, 0);
3753 SvCUR_set(dstr, 0);
a0d0e21e 3754 }
8990e307 3755 }
a0d0e21e 3756 (void)SvOK_off(dstr);
b162af07 3757 SvRV_set(dstr, SvREFCNT_inc(SvRV(sstr)));
96d4b0ee 3758 SvFLAGS(dstr) |= sflags & SVf_ROK;
dfd48732
NC
3759 assert(!(sflags & SVp_NOK));
3760 assert(!(sflags & SVp_IOK));
3761 assert(!(sflags & SVf_NOK));
3762 assert(!(sflags & SVf_IOK));
ed6116ce 3763 }
cecf5685 3764 else if (dtype == SVt_PVGV && isGV_with_GP(dstr)) {
c0c44674
NC
3765 if (!(sflags & SVf_OK)) {
3766 if (ckWARN(WARN_MISC))
3767 Perl_warner(aTHX_ packWARN(WARN_MISC),
3768 "Undefined value assigned to typeglob");
3769 }
3770 else {
3771 GV *gv = gv_fetchsv(sstr, GV_ADD, SVt_PVGV);
3772 if (dstr != (SV*)gv) {
3773 if (GvGP(dstr))
3774 gp_free((GV*)dstr);
3775 GvGP(dstr) = gp_ref(GvGP(gv));
3776 }
3777 }
3778 }
8990e307 3779 else if (sflags & SVp_POK) {
765f542d 3780 bool isSwipe = 0;
79072805
LW
3781
3782 /*
3783 * Check to see if we can just swipe the string. If so, it's a
3784 * possible small lose on short strings, but a big win on long ones.
3f7c398e
SP
3785 * It might even be a win on short strings if SvPVX_const(dstr)
3786 * has to be allocated and SvPVX_const(sstr) has to be freed.
34482cd6
NC
3787 * Likewise if we can set up COW rather than doing an actual copy, we
3788 * drop to the else clause, as the swipe code and the COW setup code
3789 * have much in common.
79072805
LW
3790 */
3791
120fac95
NC
3792 /* Whichever path we take through the next code, we want this true,
3793 and doing it now facilitates the COW check. */
3794 (void)SvPOK_only(dstr);
3795
765f542d 3796 if (
34482cd6
NC
3797 /* If we're already COW then this clause is not true, and if COW
3798 is allowed then we drop down to the else and make dest COW
3799 with us. If caller hasn't said that we're allowed to COW
3800 shared hash keys then we don't do the COW setup, even if the
3801 source scalar is a shared hash key scalar. */
3802 (((flags & SV_COW_SHARED_HASH_KEYS)
3803 ? (sflags & (SVf_FAKE|SVf_READONLY)) != (SVf_FAKE|SVf_READONLY)
3804 : 1 /* If making a COW copy is forbidden then the behaviour we
3805 desire is as if the source SV isn't actually already
3806 COW, even if it is. So we act as if the source flags
3807 are not COW, rather than actually testing them. */
3808 )
f8c7b90f 3809#ifndef PERL_OLD_COPY_ON_WRITE
34482cd6
NC
3810 /* The change that added SV_COW_SHARED_HASH_KEYS makes the logic
3811 when PERL_OLD_COPY_ON_WRITE is defined a little wrong.
3812 Conceptually PERL_OLD_COPY_ON_WRITE being defined should
3813 override SV_COW_SHARED_HASH_KEYS, because it means "always COW"
3814 but in turn, it's somewhat dead code, never expected to go
3815 live, but more kept as a placeholder on how to do it better
3816 in a newer implementation. */
3817 /* If we are COW and dstr is a suitable target then we drop down
3818 into the else and make dest a COW of us. */
b8f9541a
NC
3819 || (SvFLAGS(dstr) & CAN_COW_MASK) != CAN_COW_FLAGS
3820#endif
3821 )
765f542d 3822 &&
765f542d
NC
3823 !(isSwipe =
3824 (sflags & SVs_TEMP) && /* slated for free anyway? */
3825 !(sflags & SVf_OOK) && /* and not involved in OOK hack? */
5fcdf167
NC
3826 (!(flags & SV_NOSTEAL)) &&
3827 /* and we're allowed to steal temps */
765f542d
NC
3828 SvREFCNT(sstr) == 1 && /* and no other references to it? */
3829 SvLEN(sstr) && /* and really is a string */
645c22ef 3830 /* and won't be needed again, potentially */
765f542d 3831 !(PL_op && PL_op->op_type == OP_AASSIGN))
f8c7b90f 3832#ifdef PERL_OLD_COPY_ON_WRITE
cb23d5b1
NC
3833 && ((flags & SV_COW_SHARED_HASH_KEYS)
3834 ? (!((sflags & CAN_COW_MASK) == CAN_COW_FLAGS
3835 && (SvFLAGS(dstr) & CAN_COW_MASK) == CAN_COW_FLAGS
3836 && SvTYPE(sstr) >= SVt_PVIV))
3837 : 1)
765f542d
NC
3838#endif
3839 ) {
3840 /* Failed the swipe test, and it's not a shared hash key either.
3841 Have to copy the string. */
3842 STRLEN len = SvCUR(sstr);
3843 SvGROW(dstr, len + 1); /* inlined from sv_setpvn */
3f7c398e 3844 Move(SvPVX_const(sstr),SvPVX(dstr),len,char);
765f542d
NC
3845 SvCUR_set(dstr, len);
3846 *SvEND(dstr) = '\0';
765f542d 3847 } else {
f8c7b90f 3848 /* If PERL_OLD_COPY_ON_WRITE is not defined, then isSwipe will always
765f542d 3849 be true in here. */
765f542d
NC
3850 /* Either it's a shared hash key, or it's suitable for
3851 copy-on-write or we can swipe the string. */
46187eeb 3852 if (DEBUG_C_TEST) {
ed252734 3853 PerlIO_printf(Perl_debug_log, "Copy on write: sstr --> dstr\n");
e419cbc5
NC
3854 sv_dump(sstr);
3855 sv_dump(dstr);
46187eeb 3856 }
f8c7b90f 3857#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
3858 if (!isSwipe) {
3859 /* I believe I should acquire a global SV mutex if
3860 it's a COW sv (not a shared hash key) to stop
3861 it going un copy-on-write.
3862 If the source SV has gone un copy on write between up there
3863 and down here, then (assert() that) it is of the correct
3864 form to make it copy on write again */
3865 if ((sflags & (SVf_FAKE | SVf_READONLY))
3866 != (SVf_FAKE | SVf_READONLY)) {
3867 SvREADONLY_on(sstr);
3868 SvFAKE_on(sstr);
3869 /* Make the source SV into a loop of 1.
3870 (about to become 2) */
a29f6d03 3871 SV_COW_NEXT_SV_SET(sstr, sstr);
765f542d
NC
3872 }
3873 }
3874#endif
3875 /* Initial code is common. */
94010e71
NC
3876 if (SvPVX_const(dstr)) { /* we know that dtype >= SVt_PV */
3877 SvPV_free(dstr);
79072805 3878 }
765f542d 3879
765f542d
NC
3880 if (!isSwipe) {
3881 /* making another shared SV. */
3882 STRLEN cur = SvCUR(sstr);
3883 STRLEN len = SvLEN(sstr);
f8c7b90f 3884#ifdef PERL_OLD_COPY_ON_WRITE
765f542d 3885 if (len) {
b8f9541a 3886 assert (SvTYPE(dstr) >= SVt_PVIV);
765f542d
NC
3887 /* SvIsCOW_normal */
3888 /* splice us in between source and next-after-source. */
a29f6d03
NC
3889 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
3890 SV_COW_NEXT_SV_SET(sstr, dstr);
940132f3 3891 SvPV_set(dstr, SvPVX_mutable(sstr));
a604c751
NC
3892 } else
3893#endif
3894 {
765f542d 3895 /* SvIsCOW_shared_hash */
46187eeb
NC
3896 DEBUG_C(PerlIO_printf(Perl_debug_log,
3897 "Copy on write: Sharing hash\n"));
b8f9541a 3898
bdd68bc3 3899 assert (SvTYPE(dstr) >= SVt_PV);
765f542d 3900 SvPV_set(dstr,
d1db91c6 3901 HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)))));
bdd68bc3 3902 }
87a1ef3d
SP
3903 SvLEN_set(dstr, len);
3904 SvCUR_set(dstr, cur);
765f542d
NC
3905 SvREADONLY_on(dstr);
3906 SvFAKE_on(dstr);
3907 /* Relesase a global SV mutex. */
3908 }
3909 else
765f542d 3910 { /* Passes the swipe test. */
78d1e721 3911 SvPV_set(dstr, SvPVX_mutable(sstr));
765f542d
NC
3912 SvLEN_set(dstr, SvLEN(sstr));
3913 SvCUR_set(dstr, SvCUR(sstr));
3914
3915 SvTEMP_off(dstr);
3916 (void)SvOK_off(sstr); /* NOTE: nukes most SvFLAGS on sstr */
6136c704 3917 SvPV_set(sstr, NULL);
765f542d
NC
3918 SvLEN_set(sstr, 0);
3919 SvCUR_set(sstr, 0);
3920 SvTEMP_off(sstr);
3921 }
3922 }
8990e307 3923 if (sflags & SVp_NOK) {
9d6ce603 3924 SvNV_set(dstr, SvNVX(sstr));
79072805 3925 }
8990e307 3926 if (sflags & SVp_IOK) {
23525414
NC
3927 SvIV_set(dstr, SvIVX(sstr));
3928 /* Must do this otherwise some other overloaded use of 0x80000000
3929 gets confused. I guess SVpbm_VALID */
2b1c7e3e 3930 if (sflags & SVf_IVisUV)
25da4f38 3931 SvIsUV_on(dstr);
79072805 3932 }
96d4b0ee 3933 SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_NOK|SVp_NOK|SVf_UTF8);
4f2da183 3934 {
b0a11fe1 3935 const MAGIC * const smg = SvVSTRING_mg(sstr);
4f2da183
NC
3936 if (smg) {
3937 sv_magic(dstr, NULL, PERL_MAGIC_vstring,
3938 smg->mg_ptr, smg->mg_len);
3939 SvRMAGICAL_on(dstr);
3940 }
7a5fa8a2 3941 }
79072805 3942 }
5d581361 3943 else if (sflags & (SVp_IOK|SVp_NOK)) {
c2468cc7 3944 (void)SvOK_off(dstr);
96d4b0ee 3945 SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_IVisUV|SVf_NOK|SVp_NOK);
5d581361
NC
3946 if (sflags & SVp_IOK) {
3947 /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
3948 SvIV_set(dstr, SvIVX(sstr));
3949 }
3332b3c1 3950 if (sflags & SVp_NOK) {
9d6ce603 3951 SvNV_set(dstr, SvNVX(sstr));
3332b3c1
JH
3952 }
3953 }
79072805 3954 else {
f7877b28 3955 if (isGV_with_GP(sstr)) {
180488f8
NC
3956 /* This stringification rule for globs is spread in 3 places.
3957 This feels bad. FIXME. */
3958 const U32 wasfake = sflags & SVf_FAKE;
3959
3960 /* FAKE globs can get coerced, so need to turn this off
3961 temporarily if it is on. */
3962 SvFAKE_off(sstr);
3963 gv_efullname3(dstr, (GV *)sstr, "*");
3964 SvFLAGS(sstr) |= wasfake;
3965 }
20408e3c
GS
3966 else
3967 (void)SvOK_off(dstr);
a0d0e21e 3968 }
27c9684d
AP
3969 if (SvTAINTED(sstr))
3970 SvTAINT(dstr);
79072805
LW
3971}
3972
954c1994
GS
3973/*
3974=for apidoc sv_setsv_mg
3975
3976Like C<sv_setsv>, but also handles 'set' magic.
3977
3978=cut
3979*/
3980
79072805 3981void
7bc54cea 3982Perl_sv_setsv_mg(pTHX_ SV *const dstr, register SV *const sstr)
ef50df4b 3983{
7918f24d
NC
3984 PERL_ARGS_ASSERT_SV_SETSV_MG;
3985
ef50df4b
GS
3986 sv_setsv(dstr,sstr);
3987 SvSETMAGIC(dstr);
3988}
3989
f8c7b90f 3990#ifdef PERL_OLD_COPY_ON_WRITE
ed252734
NC
3991SV *
3992Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
3993{
3994 STRLEN cur = SvCUR(sstr);
3995 STRLEN len = SvLEN(sstr);
3996 register char *new_pv;
3997
7918f24d
NC
3998 PERL_ARGS_ASSERT_SV_SETSV_COW;
3999
ed252734
NC
4000 if (DEBUG_C_TEST) {
4001 PerlIO_printf(Perl_debug_log, "Fast copy on write: %p -> %p\n",
6c9570dc 4002 (void*)sstr, (void*)dstr);
ed252734
NC
4003 sv_dump(sstr);
4004 if (dstr)
4005 sv_dump(dstr);
4006 }
4007
4008 if (dstr) {
4009 if (SvTHINKFIRST(dstr))
4010 sv_force_normal_flags(dstr, SV_COW_DROP_PV);
3f7c398e
SP
4011 else if (SvPVX_const(dstr))
4012 Safefree(SvPVX_const(dstr));
ed252734
NC
4013 }
4014 else
4015 new_SV(dstr);
862a34c6 4016 SvUPGRADE(dstr, SVt_PVIV);
ed252734
NC
4017
4018 assert (SvPOK(sstr));
4019 assert (SvPOKp(sstr));
4020 assert (!SvIOK(sstr));
4021 assert (!SvIOKp(sstr));
4022 assert (!SvNOK(sstr));
4023 assert (!SvNOKp(sstr));
4024
4025 if (SvIsCOW(sstr)) {
4026
4027 if (SvLEN(sstr) == 0) {
4028 /* source is a COW shared hash key. */
ed252734
NC
4029 DEBUG_C(PerlIO_printf(Perl_debug_log,
4030 "Fast copy on write: Sharing hash\n"));
d1db91c6 4031 new_pv = HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr))));
ed252734
NC
4032 goto common_exit;
4033 }
4034 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4035 } else {
4036 assert ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS);
862a34c6 4037 SvUPGRADE(sstr, SVt_PVIV);
ed252734
NC
4038 SvREADONLY_on(sstr);
4039 SvFAKE_on(sstr);
4040 DEBUG_C(PerlIO_printf(Perl_debug_log,
4041 "Fast copy on write: Converting sstr to COW\n"));
4042 SV_COW_NEXT_SV_SET(dstr, sstr);
4043 }
4044 SV_COW_NEXT_SV_SET(sstr, dstr);
940132f3 4045 new_pv = SvPVX_mutable(sstr);
ed252734
NC
4046
4047 common_exit:
4048 SvPV_set(dstr, new_pv);
4049 SvFLAGS(dstr) = (SVt_PVIV|SVf_POK|SVp_POK|SVf_FAKE|SVf_READONLY);
4050 if (SvUTF8(sstr))
4051 SvUTF8_on(dstr);
87a1ef3d
SP
4052 SvLEN_set(dstr, len);
4053 SvCUR_set(dstr, cur);
ed252734
NC
4054 if (DEBUG_C_TEST) {
4055 sv_dump(dstr);
4056 }
4057 return dstr;
4058}
4059#endif
4060
954c1994
GS
4061/*
4062=for apidoc sv_setpvn
4063
4064Copies a string into an SV. The C<len> parameter indicates the number of
9e09f5f2
MHM
4065bytes to be copied. If the C<ptr> argument is NULL the SV will become
4066undefined. Does not handle 'set' magic. See C<sv_setpvn_mg>.
954c1994
GS
4067
4068=cut
4069*/
4070
ef50df4b 4071void
2e000ff2 4072Perl_sv_setpvn(pTHX_ register SV *const sv, register const char *const ptr, register const STRLEN len)
79072805 4073{
97aff369 4074 dVAR;
c6f8c383 4075 register char *dptr;
22c522df 4076
7918f24d
NC
4077 PERL_ARGS_ASSERT_SV_SETPVN;
4078
765f542d 4079 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 4080 if (!ptr) {
a0d0e21e 4081 (void)SvOK_off(sv);
463ee0b2
LW
4082 return;
4083 }
22c522df
JH
4084 else {
4085 /* len is STRLEN which is unsigned, need to copy to signed */
a3b680e6 4086 const IV iv = len;
9c5ffd7c
JH
4087 if (iv < 0)
4088 Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen");
22c522df 4089 }
862a34c6 4090 SvUPGRADE(sv, SVt_PV);
c6f8c383 4091
5902b6a9 4092 dptr = SvGROW(sv, len + 1);
c6f8c383
GA
4093 Move(ptr,dptr,len,char);
4094 dptr[len] = '\0';
79072805 4095 SvCUR_set(sv, len);
1aa99e6b 4096 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4097 SvTAINT(sv);
79072805
LW
4098}
4099
954c1994
GS
4100/*
4101=for apidoc sv_setpvn_mg
4102
4103Like C<sv_setpvn>, but also handles 'set' magic.
4104
4105=cut
4106*/
4107
79072805 4108void
2e000ff2 4109Perl_sv_setpvn_mg(pTHX_ register SV *const sv, register const char *const ptr, register const STRLEN len)
ef50df4b 4110{
7918f24d
NC
4111 PERL_ARGS_ASSERT_SV_SETPVN_MG;
4112
ef50df4b
GS
4113 sv_setpvn(sv,ptr,len);
4114 SvSETMAGIC(sv);
4115}
4116
954c1994
GS
4117/*
4118=for apidoc sv_setpv
4119
4120Copies a string into an SV. The string must be null-terminated. Does not
4121handle 'set' magic. See C<sv_setpv_mg>.
4122
4123=cut
4124*/
4125
ef50df4b 4126void
2e000ff2 4127Perl_sv_setpv(pTHX_ register SV *const sv, register const char *const ptr)
79072805 4128{
97aff369 4129 dVAR;
79072805
LW
4130 register STRLEN len;
4131
7918f24d
NC
4132 PERL_ARGS_ASSERT_SV_SETPV;
4133
765f542d 4134 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 4135 if (!ptr) {
a0d0e21e 4136 (void)SvOK_off(sv);
463ee0b2
LW
4137 return;
4138 }
79072805 4139 len = strlen(ptr);
862a34c6 4140 SvUPGRADE(sv, SVt_PV);
c6f8c383 4141
79072805 4142 SvGROW(sv, len + 1);
463ee0b2 4143 Move(ptr,SvPVX(sv),len+1,char);
79072805 4144 SvCUR_set(sv, len);
1aa99e6b 4145 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2
LW
4146 SvTAINT(sv);
4147}
4148
954c1994
GS
4149/*
4150=for apidoc sv_setpv_mg
4151
4152Like C<sv_setpv>, but also handles 'set' magic.
4153
4154=cut
4155*/
4156
463ee0b2 4157void
2e000ff2 4158Perl_sv_setpv_mg(pTHX_ register SV *const sv, register const char *const ptr)
ef50df4b 4159{
7918f24d
NC
4160 PERL_ARGS_ASSERT_SV_SETPV_MG;
4161
ef50df4b
GS
4162 sv_setpv(sv,ptr);
4163 SvSETMAGIC(sv);
4164}
4165
954c1994 4166/*
47518d95 4167=for apidoc sv_usepvn_flags
954c1994 4168
794a0d33
JH
4169Tells an SV to use C<ptr> to find its string value. Normally the
4170string is stored inside the SV but sv_usepvn allows the SV to use an
4171outside string. The C<ptr> should point to memory that was allocated
c1c21316
NC
4172by C<malloc>. The string length, C<len>, must be supplied. By default
4173this function will realloc (i.e. move) the memory pointed to by C<ptr>,
794a0d33
JH
4174so that pointer should not be freed or used by the programmer after
4175giving it to sv_usepvn, and neither should any pointers from "behind"
c1c21316
NC
4176that pointer (e.g. ptr + 1) be used.
4177
4178If C<flags> & SV_SMAGIC is true, will call SvSETMAGIC. If C<flags> &
4179SV_HAS_TRAILING_NUL is true, then C<ptr[len]> must be NUL, and the realloc
cbf82dd0 4180will be skipped. (i.e. the buffer is actually at least 1 byte longer than
c1c21316 4181C<len>, and already meets the requirements for storing in C<SvPVX>)
954c1994
GS
4182
4183=cut
4184*/
4185
ef50df4b 4186void
2e000ff2 4187Perl_sv_usepvn_flags(pTHX_ SV *const sv, char *ptr, const STRLEN len, const U32 flags)
463ee0b2 4188{
97aff369 4189 dVAR;
1936d2a7 4190 STRLEN allocate;
7918f24d
NC
4191
4192 PERL_ARGS_ASSERT_SV_USEPVN_FLAGS;
4193
765f542d 4194 SV_CHECK_THINKFIRST_COW_DROP(sv);
862a34c6 4195 SvUPGRADE(sv, SVt_PV);
463ee0b2 4196 if (!ptr) {
a0d0e21e 4197 (void)SvOK_off(sv);
47518d95
NC
4198 if (flags & SV_SMAGIC)
4199 SvSETMAGIC(sv);
463ee0b2
LW
4200 return;
4201 }
3f7c398e 4202 if (SvPVX_const(sv))
8bd4d4c5 4203 SvPV_free(sv);
1936d2a7 4204
0b7042f9 4205#ifdef DEBUGGING
2e90b4cd
NC
4206 if (flags & SV_HAS_TRAILING_NUL)
4207 assert(ptr[len] == '\0');
0b7042f9 4208#endif
2e90b4cd 4209
c1c21316 4210 allocate = (flags & SV_HAS_TRAILING_NUL)
5d487c26 4211 ? len + 1 :
ca7c1a29 4212#ifdef Perl_safesysmalloc_size
5d487c26
NC
4213 len + 1;
4214#else
4215 PERL_STRLEN_ROUNDUP(len + 1);
4216#endif
cbf82dd0
NC
4217 if (flags & SV_HAS_TRAILING_NUL) {
4218 /* It's long enough - do nothing.
4219 Specfically Perl_newCONSTSUB is relying on this. */
4220 } else {
69d25b4f 4221#ifdef DEBUGGING
69d25b4f 4222 /* Force a move to shake out bugs in callers. */
10edeb5d 4223 char *new_ptr = (char*)safemalloc(allocate);
69d25b4f
NC
4224 Copy(ptr, new_ptr, len, char);
4225 PoisonFree(ptr,len,char);
4226 Safefree(ptr);
4227 ptr = new_ptr;
69d25b4f 4228#else
10edeb5d 4229 ptr = (char*) saferealloc (ptr, allocate);
69d25b4f 4230#endif
cbf82dd0 4231 }
ca7c1a29
NC
4232#ifdef Perl_safesysmalloc_size
4233 SvLEN_set(sv, Perl_safesysmalloc_size(ptr));
5d487c26 4234#else
1936d2a7 4235 SvLEN_set(sv, allocate);
5d487c26
NC
4236#endif
4237 SvCUR_set(sv, len);
4238 SvPV_set(sv, ptr);
c1c21316 4239 if (!(flags & SV_HAS_TRAILING_NUL)) {
97a130b8 4240 ptr[len] = '\0';
c1c21316 4241 }
1aa99e6b 4242 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4243 SvTAINT(sv);
47518d95
NC
4244 if (flags & SV_SMAGIC)
4245 SvSETMAGIC(sv);
ef50df4b
GS
4246}
4247
f8c7b90f 4248#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
4249/* Need to do this *after* making the SV normal, as we need the buffer
4250 pointer to remain valid until after we've copied it. If we let go too early,
4251 another thread could invalidate it by unsharing last of the same hash key
4252 (which it can do by means other than releasing copy-on-write Svs)
4253 or by changing the other copy-on-write SVs in the loop. */
4254STATIC void
5302ffd4 4255S_sv_release_COW(pTHX_ register SV *sv, const char *pvx, SV *after)
765f542d 4256{
7918f24d
NC
4257 PERL_ARGS_ASSERT_SV_RELEASE_COW;
4258
5302ffd4 4259 { /* this SV was SvIsCOW_normal(sv) */
765f542d 4260 /* we need to find the SV pointing to us. */
cf5629ad 4261 SV *current = SV_COW_NEXT_SV(after);
7a5fa8a2 4262
765f542d
NC
4263 if (current == sv) {
4264 /* The SV we point to points back to us (there were only two of us
4265 in the loop.)
4266 Hence other SV is no longer copy on write either. */
4267 SvFAKE_off(after);
4268 SvREADONLY_off(after);
4269 } else {
4270 /* We need to follow the pointers around the loop. */
4271 SV *next;
4272 while ((next = SV_COW_NEXT_SV(current)) != sv) {
4273 assert (next);
4274 current = next;
4275 /* don't loop forever if the structure is bust, and we have
4276 a pointer into a closed loop. */
4277 assert (current != after);
3f7c398e 4278 assert (SvPVX_const(current) == pvx);
765f542d
NC
4279 }
4280 /* Make the SV before us point to the SV after us. */
a29f6d03 4281 SV_COW_NEXT_SV_SET(current, after);
765f542d 4282 }
765f542d
NC
4283 }
4284}
765f542d 4285#endif
645c22ef
DM
4286/*
4287=for apidoc sv_force_normal_flags
4288
4289Undo various types of fakery on an SV: if the PV is a shared string, make
4290a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
765f542d
NC
4291an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
4292we do the copy, and is also used locally. If C<SV_COW_DROP_PV> is set
4293then a copy-on-write scalar drops its PV buffer (if any) and becomes
4294SvPOK_off rather than making a copy. (Used where this scalar is about to be
d3050d9d 4295set to some other value.) In addition, the C<flags> parameter gets passed to
765f542d
NC
4296C<sv_unref_flags()> when unrefing. C<sv_force_normal> calls this function
4297with flags set to 0.
645c22ef
DM
4298
4299=cut
4300*/
4301
6fc92669 4302void
2e000ff2 4303Perl_sv_force_normal_flags(pTHX_ register SV *const sv, const U32 flags)
0f15f207 4304{
97aff369 4305 dVAR;
7918f24d
NC
4306
4307 PERL_ARGS_ASSERT_SV_FORCE_NORMAL_FLAGS;
4308
f8c7b90f 4309#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
4310 if (SvREADONLY(sv)) {
4311 /* At this point I believe I should acquire a global SV mutex. */
4312 if (SvFAKE(sv)) {
b64e5050 4313 const char * const pvx = SvPVX_const(sv);
a28509cc
AL
4314 const STRLEN len = SvLEN(sv);
4315 const STRLEN cur = SvCUR(sv);
5302ffd4
NC
4316 /* next COW sv in the loop. If len is 0 then this is a shared-hash
4317 key scalar, so we mustn't attempt to call SV_COW_NEXT_SV(), as
4318 we'll fail an assertion. */
4319 SV * const next = len ? SV_COW_NEXT_SV(sv) : 0;
4320
46187eeb
NC
4321 if (DEBUG_C_TEST) {
4322 PerlIO_printf(Perl_debug_log,
4323 "Copy on write: Force normal %ld\n",
4324 (long) flags);
e419cbc5 4325 sv_dump(sv);
46187eeb 4326 }
765f542d
NC
4327 SvFAKE_off(sv);
4328 SvREADONLY_off(sv);
9f653bb5 4329 /* This SV doesn't own the buffer, so need to Newx() a new one: */
6136c704 4330 SvPV_set(sv, NULL);
87a1ef3d 4331 SvLEN_set(sv, 0);
765f542d
NC
4332 if (flags & SV_COW_DROP_PV) {
4333 /* OK, so we don't need to copy our buffer. */
4334 SvPOK_off(sv);
4335 } else {
4336 SvGROW(sv, cur + 1);
4337 Move(pvx,SvPVX(sv),cur,char);
87a1ef3d 4338 SvCUR_set(sv, cur);
765f542d
NC
4339 *SvEND(sv) = '\0';
4340 }
5302ffd4
NC
4341 if (len) {
4342 sv_release_COW(sv, pvx, next);
4343 } else {
4344 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
4345 }
46187eeb 4346 if (DEBUG_C_TEST) {
e419cbc5 4347 sv_dump(sv);
46187eeb 4348 }
765f542d 4349 }
923e4eb5 4350 else if (IN_PERL_RUNTIME)
765f542d
NC
4351 Perl_croak(aTHX_ PL_no_modify);
4352 /* At this point I believe that I can drop the global SV mutex. */
4353 }
4354#else
2213622d 4355 if (SvREADONLY(sv)) {
1c846c1f 4356 if (SvFAKE(sv)) {
b64e5050 4357 const char * const pvx = SvPVX_const(sv);
66a1b24b 4358 const STRLEN len = SvCUR(sv);
10bcdfd6
NC
4359 SvFAKE_off(sv);
4360 SvREADONLY_off(sv);
bd61b366 4361 SvPV_set(sv, NULL);
66a1b24b 4362 SvLEN_set(sv, 0);
1c846c1f 4363 SvGROW(sv, len + 1);
706aa1c9 4364 Move(pvx,SvPVX(sv),len,char);
1c846c1f 4365 *SvEND(sv) = '\0';
bdd68bc3 4366 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
1c846c1f 4367 }
923e4eb5 4368 else if (IN_PERL_RUNTIME)
cea2e8a9 4369 Perl_croak(aTHX_ PL_no_modify);
0f15f207 4370 }
765f542d 4371#endif
2213622d 4372 if (SvROK(sv))
840a7b70 4373 sv_unref_flags(sv, flags);
6fc92669
GS
4374 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
4375 sv_unglob(sv);
0f15f207 4376}
1c846c1f 4377
645c22ef 4378/*
954c1994
GS
4379=for apidoc sv_chop
4380
1c846c1f 4381Efficient removal of characters from the beginning of the string buffer.
954c1994
GS
4382SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
4383the string buffer. The C<ptr> becomes the first character of the adjusted
645c22ef 4384string. Uses the "OOK hack".
3f7c398e 4385Beware: after this function returns, C<ptr> and SvPVX_const(sv) may no longer
31869a79 4386refer to the same chunk of data.
954c1994
GS
4387
4388=cut
4389*/
4390
79072805 4391void
2e000ff2 4392Perl_sv_chop(pTHX_ register SV *const sv, register const char *const ptr)
79072805 4393{
69240efd
NC
4394 STRLEN delta;
4395 STRLEN old_delta;
7a4bba22
NC
4396 U8 *p;
4397#ifdef DEBUGGING
4398 const U8 *real_start;
4399#endif
6c65d5f9 4400 STRLEN max_delta;
7a4bba22 4401
7918f24d
NC
4402 PERL_ARGS_ASSERT_SV_CHOP;
4403
a0d0e21e 4404 if (!ptr || !SvPOKp(sv))
79072805 4405 return;
3f7c398e 4406 delta = ptr - SvPVX_const(sv);
15895f8a
NC
4407 if (!delta) {
4408 /* Nothing to do. */
4409 return;
4410 }
6c65d5f9
NC
4411 /* SvPVX(sv) may move in SV_CHECK_THINKFIRST(sv), but after this line,
4412 nothing uses the value of ptr any more. */
837cb3ba 4413 max_delta = SvLEN(sv) ? SvLEN(sv) : SvCUR(sv);
6c65d5f9
NC
4414 if (ptr <= SvPVX_const(sv))
4415 Perl_croak(aTHX_ "panic: sv_chop ptr=%p, start=%p, end=%p",
4416 ptr, SvPVX_const(sv), SvPVX_const(sv) + max_delta);
2213622d 4417 SV_CHECK_THINKFIRST(sv);
6c65d5f9
NC
4418 if (delta > max_delta)
4419 Perl_croak(aTHX_ "panic: sv_chop ptr=%p (was %p), start=%p, end=%p",
4420 SvPVX_const(sv) + delta, ptr, SvPVX_const(sv),
4421 SvPVX_const(sv) + max_delta);
79072805
LW
4422
4423 if (!SvOOK(sv)) {
50483b2c 4424 if (!SvLEN(sv)) { /* make copy of shared string */
3f7c398e 4425 const char *pvx = SvPVX_const(sv);
a28509cc 4426 const STRLEN len = SvCUR(sv);
50483b2c 4427 SvGROW(sv, len + 1);
706aa1c9 4428 Move(pvx,SvPVX(sv),len,char);
50483b2c
JD
4429 *SvEND(sv) = '\0';
4430 }
7a5fa8a2 4431 SvFLAGS(sv) |= SVf_OOK;
7a4bba22
NC
4432 old_delta = 0;
4433 } else {
69240efd 4434 SvOOK_offset(sv, old_delta);
79072805 4435 }
b162af07
SP
4436 SvLEN_set(sv, SvLEN(sv) - delta);
4437 SvCUR_set(sv, SvCUR(sv) - delta);
f880fe2f 4438 SvPV_set(sv, SvPVX(sv) + delta);
7a4bba22
NC
4439
4440 p = (U8 *)SvPVX_const(sv);
4441
4442 delta += old_delta;
4443
50af2e61 4444#ifdef DEBUGGING
7a4bba22
NC
4445 real_start = p - delta;
4446#endif
4447
69240efd
NC
4448 assert(delta);
4449 if (delta < 0x100) {
7a4bba22
NC
4450 *--p = (U8) delta;
4451 } else {
69240efd
NC
4452 *--p = 0;
4453 p -= sizeof(STRLEN);
4454 Copy((U8*)&delta, p, sizeof(STRLEN), U8);
7a4bba22
NC
4455 }
4456
4457#ifdef DEBUGGING
4458 /* Fill the preceding buffer with sentinals to verify that no-one is
4459 using it. */
4460 while (p > real_start) {
4461 --p;
4462 *p = (U8)PTR2UV(p);
50af2e61
NC
4463 }
4464#endif
79072805
LW
4465}
4466
954c1994
GS
4467/*
4468=for apidoc sv_catpvn
4469
4470Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
4471C<len> indicates number of bytes to copy. If the SV has the UTF-8
4472status set, then the bytes appended should be valid UTF-8.
d5ce4a7c 4473Handles 'get' magic, but not 'set' magic. See C<sv_catpvn_mg>.
954c1994 4474
8d6d96c1
HS
4475=for apidoc sv_catpvn_flags
4476
4477Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
4478C<len> indicates number of bytes to copy. If the SV has the UTF-8
4479status set, then the bytes appended should be valid UTF-8.
8d6d96c1
HS
4480If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
4481appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
4482in terms of this function.
4483
4484=cut
4485*/
4486
4487void
2e000ff2 4488Perl_sv_catpvn_flags(pTHX_ register SV *const dsv, register const char *sstr, register const STRLEN slen, const I32 flags)
8d6d96c1 4489{
97aff369 4490 dVAR;
8d6d96c1 4491 STRLEN dlen;
fabdb6c0 4492 const char * const dstr = SvPV_force_flags(dsv, dlen, flags);
8d6d96c1 4493
7918f24d
NC
4494 PERL_ARGS_ASSERT_SV_CATPVN_FLAGS;
4495
8d6d96c1
HS
4496 SvGROW(dsv, dlen + slen + 1);
4497 if (sstr == dstr)
3f7c398e 4498 sstr = SvPVX_const(dsv);
8d6d96c1 4499 Move(sstr, SvPVX(dsv) + dlen, slen, char);
b162af07 4500 SvCUR_set(dsv, SvCUR(dsv) + slen);
8d6d96c1
HS
4501 *SvEND(dsv) = '\0';
4502 (void)SvPOK_only_UTF8(dsv); /* validate pointer */
4503 SvTAINT(dsv);
bddd5118
NC
4504 if (flags & SV_SMAGIC)
4505 SvSETMAGIC(dsv);
79072805
LW
4506}
4507
954c1994 4508/*
954c1994
GS
4509=for apidoc sv_catsv
4510
13e8c8e3
JH
4511Concatenates the string from SV C<ssv> onto the end of the string in
4512SV C<dsv>. Modifies C<dsv> but not C<ssv>. Handles 'get' magic, but
4513not 'set' magic. See C<sv_catsv_mg>.
954c1994 4514
8d6d96c1
HS
4515=for apidoc sv_catsv_flags
4516
4517Concatenates the string from SV C<ssv> onto the end of the string in
4518SV C<dsv>. Modifies C<dsv> but not C<ssv>. If C<flags> has C<SV_GMAGIC>
4519bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
4520and C<sv_catsv_nomg> are implemented in terms of this function.
4521
4522=cut */
4523
ef50df4b 4524void
2e000ff2 4525Perl_sv_catsv_flags(pTHX_ SV *const dsv, register SV *const ssv, const I32 flags)
79072805 4526{
97aff369 4527 dVAR;
7918f24d
NC
4528
4529 PERL_ARGS_ASSERT_SV_CATSV_FLAGS;
4530
4531 if (ssv) {
00b6aa41
AL
4532 STRLEN slen;
4533 const char *spv = SvPV_const(ssv, slen);
4534 if (spv) {
bddd5118
NC
4535 /* sutf8 and dutf8 were type bool, but under USE_ITHREADS,
4536 gcc version 2.95.2 20000220 (Debian GNU/Linux) for
4537 Linux xxx 2.2.17 on sparc64 with gcc -O2, we erroneously
4538 get dutf8 = 0x20000000, (i.e. SVf_UTF8) even though
4539 dsv->sv_flags doesn't have that bit set.
4fd84b44 4540 Andy Dougherty 12 Oct 2001
bddd5118
NC
4541 */
4542 const I32 sutf8 = DO_UTF8(ssv);
4543 I32 dutf8;
13e8c8e3 4544
bddd5118
NC
4545 if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
4546 mg_get(dsv);
4547 dutf8 = DO_UTF8(dsv);
8d6d96c1 4548
bddd5118
NC
4549 if (dutf8 != sutf8) {
4550 if (dutf8) {
4551 /* Not modifying source SV, so taking a temporary copy. */
59cd0e26 4552 SV* const csv = newSVpvn_flags(spv, slen, SVs_TEMP);
13e8c8e3 4553
bddd5118
NC
4554 sv_utf8_upgrade(csv);
4555 spv = SvPV_const(csv, slen);
4556 }
4557 else
4558 sv_utf8_upgrade_nomg(dsv);
13e8c8e3 4559 }
bddd5118 4560 sv_catpvn_nomg(dsv, spv, slen);
e84ff256 4561 }
560a288e 4562 }
bddd5118
NC
4563 if (flags & SV_SMAGIC)
4564 SvSETMAGIC(dsv);
79072805
LW
4565}
4566
954c1994 4567/*
954c1994
GS
4568=for apidoc sv_catpv
4569
4570Concatenates the string onto the end of the string which is in the SV.
1e54db1a
JH
4571If the SV has the UTF-8 status set, then the bytes appended should be
4572valid UTF-8. Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
954c1994 4573
d5ce4a7c 4574=cut */
954c1994 4575
ef50df4b 4576void
2b021c53 4577Perl_sv_catpv(pTHX_ register SV *const sv, register const char *ptr)
79072805 4578{
97aff369 4579 dVAR;
79072805 4580 register STRLEN len;
463ee0b2 4581 STRLEN tlen;
748a9306 4582 char *junk;
79072805 4583
7918f24d
NC
4584 PERL_ARGS_ASSERT_SV_CATPV;
4585
0c981600 4586 if (!ptr)
79072805 4587 return;
748a9306 4588 junk = SvPV_force(sv, tlen);
0c981600 4589 len = strlen(ptr);
463ee0b2 4590 SvGROW(sv, tlen + len + 1);
0c981600 4591 if (ptr == junk)
3f7c398e 4592 ptr = SvPVX_const(sv);
0c981600 4593 Move(ptr,SvPVX(sv)+tlen,len+1,char);
b162af07 4594 SvCUR_set(sv, SvCUR(sv) + len);
d41ff1b8 4595 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4596 SvTAINT(sv);
79072805
LW
4597}
4598
954c1994
GS
4599/*
4600=for apidoc sv_catpv_mg
4601
4602Like C<sv_catpv>, but also handles 'set' magic.
4603
4604=cut
4605*/
4606
ef50df4b 4607void
2b021c53 4608Perl_sv_catpv_mg(pTHX_ register SV *const sv, register const char *const ptr)
ef50df4b 4609{
7918f24d
NC
4610 PERL_ARGS_ASSERT_SV_CATPV_MG;
4611
0c981600 4612 sv_catpv(sv,ptr);
ef50df4b
GS
4613 SvSETMAGIC(sv);
4614}
4615
645c22ef
DM
4616/*
4617=for apidoc newSV
4618
561b68a9
SH
4619Creates a new SV. A non-zero C<len> parameter indicates the number of
4620bytes of preallocated string space the SV should have. An extra byte for a
4621trailing NUL is also reserved. (SvPOK is not set for the SV even if string
4622space is allocated.) The reference count for the new SV is set to 1.
4623
4624In 5.9.3, newSV() replaces the older NEWSV() API, and drops the first
4625parameter, I<x>, a debug aid which allowed callers to identify themselves.
4626This aid has been superseded by a new build option, PERL_MEM_LOG (see
4627L<perlhack/PERL_MEM_LOG>). The older API is still there for use in XS
4628modules supporting older perls.
645c22ef
DM
4629
4630=cut
4631*/
4632
79072805 4633SV *
2b021c53 4634Perl_newSV(pTHX_ const STRLEN len)
79072805 4635{
97aff369 4636 dVAR;
79072805 4637 register SV *sv;
1c846c1f 4638
4561caa4 4639 new_SV(sv);
79072805
LW
4640 if (len) {
4641 sv_upgrade(sv, SVt_PV);
4642 SvGROW(sv, len + 1);
4643 }
4644 return sv;
4645}
954c1994 4646/*
92110913 4647=for apidoc sv_magicext
954c1994 4648
68795e93 4649Adds magic to an SV, upgrading it if necessary. Applies the
2d8d5d5a 4650supplied vtable and returns a pointer to the magic added.
92110913 4651
2d8d5d5a
SH
4652Note that C<sv_magicext> will allow things that C<sv_magic> will not.
4653In particular, you can add magic to SvREADONLY SVs, and add more than
4654one instance of the same 'how'.
645c22ef 4655
2d8d5d5a
SH
4656If C<namlen> is greater than zero then a C<savepvn> I<copy> of C<name> is
4657stored, if C<namlen> is zero then C<name> is stored as-is and - as another
4658special case - if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
4659to contain an C<SV*> and is stored as-is with its REFCNT incremented.
92110913 4660
2d8d5d5a 4661(This is now used as a subroutine by C<sv_magic>.)
954c1994
GS
4662
4663=cut
4664*/
92110913 4665MAGIC *
2b021c53
SS
4666Perl_sv_magicext(pTHX_ SV *const sv, SV *const obj, const int how,
4667 const MGVTBL *const vtable, const char *const name, const I32 namlen)
79072805 4668{
97aff369 4669 dVAR;
79072805 4670 MAGIC* mg;
68795e93 4671
7918f24d
NC
4672 PERL_ARGS_ASSERT_SV_MAGICEXT;
4673
7a7f3e45 4674 SvUPGRADE(sv, SVt_PVMG);
a02a5408 4675 Newxz(mg, 1, MAGIC);
79072805 4676 mg->mg_moremagic = SvMAGIC(sv);
b162af07 4677 SvMAGIC_set(sv, mg);
75f9d97a 4678
05f95b08
SB
4679 /* Sometimes a magic contains a reference loop, where the sv and
4680 object refer to each other. To prevent a reference loop that
4681 would prevent such objects being freed, we look for such loops
4682 and if we find one we avoid incrementing the object refcount.
87f0b213
JH
4683
4684 Note we cannot do this to avoid self-tie loops as intervening RV must
b5ccf5f2 4685 have its REFCNT incremented to keep it in existence.
87f0b213
JH
4686
4687 */
14befaf4
DM
4688 if (!obj || obj == sv ||
4689 how == PERL_MAGIC_arylen ||
8d2f4536 4690 how == PERL_MAGIC_symtab ||
75f9d97a
JH
4691 (SvTYPE(obj) == SVt_PVGV &&
4692 (GvSV(obj) == sv || GvHV(obj) == (HV*)sv || GvAV(obj) == (AV*)sv ||
4693 GvCV(obj) == (CV*)sv || GvIOp(obj) == (IO*)sv ||
2628be26 4694 GvFORM(obj) == (CV*)sv)))
75f9d97a 4695 {
8990e307 4696 mg->mg_obj = obj;
75f9d97a 4697 }
85e6fe83 4698 else {
b37c2d43 4699 mg->mg_obj = SvREFCNT_inc_simple(obj);
85e6fe83
LW
4700 mg->mg_flags |= MGf_REFCOUNTED;
4701 }
b5ccf5f2
YST
4702
4703 /* Normal self-ties simply pass a null object, and instead of
4704 using mg_obj directly, use the SvTIED_obj macro to produce a
4705 new RV as needed. For glob "self-ties", we are tieing the PVIO
4706 with an RV obj pointing to the glob containing the PVIO. In
4707 this case, to avoid a reference loop, we need to weaken the
4708 reference.
4709 */
4710
4711 if (how == PERL_MAGIC_tiedscalar && SvTYPE(sv) == SVt_PVIO &&
4712 obj && SvROK(obj) && GvIO(SvRV(obj)) == (IO*)sv)
4713 {
4714 sv_rvweaken(obj);
4715 }
4716
79072805 4717 mg->mg_type = how;
565764a8 4718 mg->mg_len = namlen;
9cbac4c7 4719 if (name) {
92110913 4720 if (namlen > 0)
1edc1566 4721 mg->mg_ptr = savepvn(name, namlen);
c6ee37c5 4722 else if (namlen == HEf_SVKEY)
b37c2d43 4723 mg->mg_ptr = (char*)SvREFCNT_inc_simple_NN((SV*)name);
68795e93 4724 else
92110913 4725 mg->mg_ptr = (char *) name;
9cbac4c7 4726 }
53d44271 4727 mg->mg_virtual = (MGVTBL *) vtable;
68795e93 4728
92110913
NIS
4729 mg_magical(sv);
4730 if (SvGMAGICAL(sv))
4731 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
4732 return mg;
4733}
4734
4735/*
4736=for apidoc sv_magic
1c846c1f 4737
92110913
NIS
4738Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
4739then adds a new magic item of type C<how> to the head of the magic list.
4740
2d8d5d5a
SH
4741See C<sv_magicext> (which C<sv_magic> now calls) for a description of the
4742handling of the C<name> and C<namlen> arguments.
4743
4509d3fb
SB
4744You need to use C<sv_magicext> to add magic to SvREADONLY SVs and also
4745to add more than one instance of the same 'how'.
4746
92110913
NIS
4747=cut
4748*/
4749
4750void
2b021c53
SS
4751Perl_sv_magic(pTHX_ register SV *const sv, SV *const obj, const int how,
4752 const char *const name, const I32 namlen)
68795e93 4753{
97aff369 4754 dVAR;
53d44271 4755 const MGVTBL *vtable;
92110913 4756 MAGIC* mg;
92110913 4757
7918f24d
NC
4758 PERL_ARGS_ASSERT_SV_MAGIC;
4759
f8c7b90f 4760#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
4761 if (SvIsCOW(sv))
4762 sv_force_normal_flags(sv, 0);
4763#endif
92110913 4764 if (SvREADONLY(sv)) {
d8084ca5
DM
4765 if (
4766 /* its okay to attach magic to shared strings; the subsequent
4767 * upgrade to PVMG will unshare the string */
4768 !(SvFAKE(sv) && SvTYPE(sv) < SVt_PVMG)
4769
4770 && IN_PERL_RUNTIME
92110913
NIS
4771 && how != PERL_MAGIC_regex_global
4772 && how != PERL_MAGIC_bm
4773 && how != PERL_MAGIC_fm
4774 && how != PERL_MAGIC_sv
e6469971 4775 && how != PERL_MAGIC_backref
92110913
NIS
4776 )
4777 {
4778 Perl_croak(aTHX_ PL_no_modify);
4779 }
4780 }
4781 if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
4782 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
68795e93
NIS
4783 /* sv_magic() refuses to add a magic of the same 'how' as an
4784 existing one
92110913 4785 */
2a509ed3 4786 if (how == PERL_MAGIC_taint) {
92110913 4787 mg->mg_len |= 1;
2a509ed3
NC
4788 /* Any scalar which already had taint magic on which someone
4789 (erroneously?) did SvIOK_on() or similar will now be
4790 incorrectly sporting public "OK" flags. */
4791 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
4792 }
92110913
NIS
4793 return;
4794 }
4795 }
68795e93 4796
79072805 4797 switch (how) {
14befaf4 4798 case PERL_MAGIC_sv:
92110913 4799 vtable = &PL_vtbl_sv;
79072805 4800 break;
14befaf4 4801 case PERL_MAGIC_overload:
92110913 4802 vtable = &PL_vtbl_amagic;
a0d0e21e 4803 break;
14befaf4 4804 case PERL_MAGIC_overload_elem:
92110913 4805 vtable = &PL_vtbl_amagicelem;
a0d0e21e 4806 break;
14befaf4 4807 case PERL_MAGIC_overload_table:
92110913 4808 vtable = &PL_vtbl_ovrld;
a0d0e21e 4809 break;
14befaf4 4810 case PERL_MAGIC_bm:
92110913 4811 vtable = &PL_vtbl_bm;
79072805 4812 break;
14befaf4 4813 case PERL_MAGIC_regdata:
92110913 4814 vtable = &PL_vtbl_regdata;
6cef1e77 4815 break;
14befaf4 4816 case PERL_MAGIC_regdatum:
92110913 4817 vtable = &PL_vtbl_regdatum;
6cef1e77 4818 break;
14befaf4 4819 case PERL_MAGIC_env:
92110913 4820 vtable = &PL_vtbl_env;
79072805 4821 break;
14befaf4 4822 case PERL_MAGIC_fm:
92110913 4823 vtable = &PL_vtbl_fm;
55497cff 4824 break;
14befaf4 4825 case PERL_MAGIC_envelem:
92110913 4826 vtable = &PL_vtbl_envelem;
79072805 4827 break;
14befaf4 4828 case PERL_MAGIC_regex_global:
92110913 4829 vtable = &PL_vtbl_mglob;
93a17b20 4830 break;
14befaf4 4831 case PERL_MAGIC_isa:
92110913 4832 vtable = &PL_vtbl_isa;
463ee0b2 4833 break;
14befaf4 4834 case PERL_MAGIC_isaelem:
92110913 4835 vtable = &PL_vtbl_isaelem;
463ee0b2 4836 break;
14befaf4 4837 case PERL_MAGIC_nkeys:
92110913 4838 vtable = &PL_vtbl_nkeys;
16660edb 4839 break;
14befaf4 4840 case PERL_MAGIC_dbfile:
aec46f14 4841 vtable = NULL;
93a17b20 4842 break;
14befaf4 4843 case PERL_MAGIC_dbline:
92110913 4844 vtable = &PL_vtbl_dbline;
79072805 4845 break;
36477c24 4846#ifdef USE_LOCALE_COLLATE
14befaf4 4847 case PERL_MAGIC_collxfrm:
92110913 4848 vtable = &PL_vtbl_collxfrm;
bbce6d69 4849 break;
36477c24 4850#endif /* USE_LOCALE_COLLATE */
14befaf4 4851 case PERL_MAGIC_tied:
92110913 4852 vtable = &PL_vtbl_pack;
463ee0b2 4853 break;
14befaf4
DM
4854 case PERL_MAGIC_tiedelem:
4855 case PERL_MAGIC_tiedscalar:
92110913 4856 vtable = &PL_vtbl_packelem;
463ee0b2 4857 break;
14befaf4 4858 case PERL_MAGIC_qr:
92110913 4859 vtable = &PL_vtbl_regexp;
c277df42 4860 break;
b3ca2e83
NC
4861 case PERL_MAGIC_hints:
4862 /* As this vtable is all NULL, we can reuse it. */
14befaf4 4863 case PERL_MAGIC_sig:
92110913 4864 vtable = &PL_vtbl_sig;
79072805 4865 break;
14befaf4 4866 case PERL_MAGIC_sigelem:
92110913 4867 vtable = &PL_vtbl_sigelem;
79072805 4868 break;
14befaf4 4869 case PERL_MAGIC_taint:
92110913 4870 vtable = &PL_vtbl_taint;
463ee0b2 4871 break;
14befaf4 4872 case PERL_MAGIC_uvar:
92110913 4873 vtable = &PL_vtbl_uvar;
79072805 4874 break;
14befaf4 4875 case PERL_MAGIC_vec:
92110913 4876 vtable = &PL_vtbl_vec;
79072805 4877 break;
a3874608 4878 case PERL_MAGIC_arylen_p:
bfcb3514 4879 case PERL_MAGIC_rhash:
8d2f4536 4880 case PERL_MAGIC_symtab:
ece467f9 4881 case PERL_MAGIC_vstring:
aec46f14 4882 vtable = NULL;
ece467f9 4883 break;
7e8c5dac
HS
4884 case PERL_MAGIC_utf8:
4885 vtable = &PL_vtbl_utf8;
4886 break;
14befaf4 4887 case PERL_MAGIC_substr:
92110913 4888 vtable = &PL_vtbl_substr;
79072805 4889 break;
14befaf4 4890 case PERL_MAGIC_defelem:
92110913 4891 vtable = &PL_vtbl_defelem;
5f05dabc 4892 break;
14befaf4 4893 case PERL_MAGIC_arylen:
92110913 4894 vtable = &PL_vtbl_arylen;
79072805 4895 break;
14befaf4 4896 case PERL_MAGIC_pos:
92110913 4897 vtable = &PL_vtbl_pos;
a0d0e21e 4898 break;
14befaf4 4899 case PERL_MAGIC_backref:
92110913 4900 vtable = &PL_vtbl_backref;
810b8aa5 4901 break;
b3ca2e83
NC
4902 case PERL_MAGIC_hintselem:
4903 vtable = &PL_vtbl_hintselem;
4904 break;
14befaf4
DM
4905 case PERL_MAGIC_ext:
4906 /* Reserved for use by extensions not perl internals. */
4633a7c4
LW
4907 /* Useful for attaching extension internal data to perl vars. */
4908 /* Note that multiple extensions may clash if magical scalars */
4909 /* etc holding private data from one are passed to another. */
aec46f14 4910 vtable = NULL;
a0d0e21e 4911 break;
79072805 4912 default:
14befaf4 4913 Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
463ee0b2 4914 }
68795e93 4915
92110913 4916 /* Rest of work is done else where */
aec46f14 4917 mg = sv_magicext(sv,obj,how,vtable,name,namlen);
68795e93 4918
92110913
NIS
4919 switch (how) {
4920 case PERL_MAGIC_taint:
4921 mg->mg_len = 1;
4922 break;
4923 case PERL_MAGIC_ext:
4924 case PERL_MAGIC_dbfile:
4925 SvRMAGICAL_on(sv);
4926 break;
4927 }
463ee0b2
LW
4928}
4929
c461cf8f
JH
4930/*
4931=for apidoc sv_unmagic
4932
645c22ef 4933Removes all magic of type C<type> from an SV.
c461cf8f
JH
4934
4935=cut
4936*/
4937
463ee0b2 4938int
2b021c53 4939Perl_sv_unmagic(pTHX_ SV *const sv, const int type)
463ee0b2
LW
4940{
4941 MAGIC* mg;
4942 MAGIC** mgp;
7918f24d
NC
4943
4944 PERL_ARGS_ASSERT_SV_UNMAGIC;
4945
91bba347 4946 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2 4947 return 0;
064cf529 4948 mgp = &(((XPVMG*) SvANY(sv))->xmg_u.xmg_magic);
463ee0b2
LW
4949 for (mg = *mgp; mg; mg = *mgp) {
4950 if (mg->mg_type == type) {
e1ec3a88 4951 const MGVTBL* const vtbl = mg->mg_virtual;
463ee0b2 4952 *mgp = mg->mg_moremagic;
1d7c1841 4953 if (vtbl && vtbl->svt_free)
fc0dc3b3 4954 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
14befaf4 4955 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
92110913 4956 if (mg->mg_len > 0)
1edc1566 4957 Safefree(mg->mg_ptr);
565764a8 4958 else if (mg->mg_len == HEf_SVKEY)
1edc1566 4959 SvREFCNT_dec((SV*)mg->mg_ptr);
d2923cdd 4960 else if (mg->mg_type == PERL_MAGIC_utf8)
7e8c5dac 4961 Safefree(mg->mg_ptr);
9cbac4c7 4962 }
a0d0e21e
LW
4963 if (mg->mg_flags & MGf_REFCOUNTED)
4964 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
4965 Safefree(mg);
4966 }
4967 else
4968 mgp = &mg->mg_moremagic;
79072805 4969 }
91bba347 4970 if (!SvMAGIC(sv)) {
463ee0b2 4971 SvMAGICAL_off(sv);
c268c2a6 4972 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
86f55936 4973 SvMAGIC_set(sv, NULL);
463ee0b2
LW
4974 }
4975
4976 return 0;
79072805
LW
4977}
4978
c461cf8f
JH
4979/*
4980=for apidoc sv_rvweaken
4981
645c22ef
DM
4982Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
4983referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
4984push a back-reference to this RV onto the array of backreferences
1e73acc8
AS
4985associated with that magic. If the RV is magical, set magic will be
4986called after the RV is cleared.
c461cf8f
JH
4987
4988=cut
4989*/
4990
810b8aa5 4991SV *
2b021c53 4992Perl_sv_rvweaken(pTHX_ SV *const sv)
810b8aa5
GS
4993{
4994 SV *tsv;
7918f24d
NC
4995
4996 PERL_ARGS_ASSERT_SV_RVWEAKEN;
4997
810b8aa5
GS
4998 if (!SvOK(sv)) /* let undefs pass */
4999 return sv;
5000 if (!SvROK(sv))
cea2e8a9 5001 Perl_croak(aTHX_ "Can't weaken a nonreference");
810b8aa5 5002 else if (SvWEAKREF(sv)) {
810b8aa5 5003 if (ckWARN(WARN_MISC))
9014280d 5004 Perl_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
810b8aa5
GS
5005 return sv;
5006 }
5007 tsv = SvRV(sv);
e15faf7d 5008 Perl_sv_add_backref(aTHX_ tsv, sv);
810b8aa5 5009 SvWEAKREF_on(sv);
1c846c1f 5010 SvREFCNT_dec(tsv);
810b8aa5
GS
5011 return sv;
5012}
5013
645c22ef
DM
5014/* Give tsv backref magic if it hasn't already got it, then push a
5015 * back-reference to sv onto the array associated with the backref magic.
5016 */
5017
fd996479
DM
5018/* A discussion about the backreferences array and its refcount:
5019 *
5020 * The AV holding the backreferences is pointed to either as the mg_obj of
5021 * PERL_MAGIC_backref, or in the specific case of a HV that has the hv_aux
5022 * structure, from the xhv_backreferences field. (A HV without hv_aux will
5023 * have the standard magic instead.) The array is created with a refcount
5024 * of 2. This means that if during global destruction the array gets
5025 * picked on first to have its refcount decremented by the random zapper,
5026 * it won't actually be freed, meaning it's still theere for when its
5027 * parent gets freed.
5028 * When the parent SV is freed, in the case of magic, the magic is freed,
5029 * Perl_magic_killbackrefs is called which decrements one refcount, then
5030 * mg_obj is freed which kills the second count.
5031 * In the vase of a HV being freed, one ref is removed by
5032 * Perl_hv_kill_backrefs, the other by Perl_sv_kill_backrefs, which it
5033 * calls.
5034 */
5035
e15faf7d 5036void
2b021c53 5037Perl_sv_add_backref(pTHX_ SV *const tsv, SV *const sv)
810b8aa5 5038{
97aff369 5039 dVAR;
810b8aa5 5040 AV *av;
86f55936 5041
7918f24d
NC
5042 PERL_ARGS_ASSERT_SV_ADD_BACKREF;
5043
86f55936
NC
5044 if (SvTYPE(tsv) == SVt_PVHV) {
5045 AV **const avp = Perl_hv_backreferences_p(aTHX_ (HV*)tsv);
5046
5047 av = *avp;
5048 if (!av) {
5049 /* There is no AV in the offical place - try a fixup. */
5050 MAGIC *const mg = mg_find(tsv, PERL_MAGIC_backref);
5051
5052 if (mg) {
5053 /* Aha. They've got it stowed in magic. Bring it back. */
5054 av = (AV*)mg->mg_obj;
5055 /* Stop mg_free decreasing the refernce count. */
5056 mg->mg_obj = NULL;
5057 /* Stop mg_free even calling the destructor, given that
5058 there's no AV to free up. */
5059 mg->mg_virtual = 0;
5060 sv_unmagic(tsv, PERL_MAGIC_backref);
5061 } else {
5062 av = newAV();
5063 AvREAL_off(av);
fd996479 5064 SvREFCNT_inc_simple_void(av); /* see discussion above */
86f55936
NC
5065 }
5066 *avp = av;
5067 }
5068 } else {
5069 const MAGIC *const mg
5070 = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
5071 if (mg)
5072 av = (AV*)mg->mg_obj;
5073 else {
5074 av = newAV();
5075 AvREAL_off(av);
5076 sv_magic(tsv, (SV*)av, PERL_MAGIC_backref, NULL, 0);
fd996479 5077 /* av now has a refcnt of 2; see discussion above */
86f55936 5078 }
810b8aa5 5079 }
d91d49e8 5080 if (AvFILLp(av) >= AvMAX(av)) {
d91d49e8
MM
5081 av_extend(av, AvFILLp(av)+1);
5082 }
5083 AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */
810b8aa5
GS
5084}
5085
645c22ef
DM
5086/* delete a back-reference to ourselves from the backref magic associated
5087 * with the SV we point to.
5088 */
5089
1c846c1f 5090STATIC void
2b021c53 5091S_sv_del_backref(pTHX_ SV *const tsv, SV *const sv)
810b8aa5 5092{
97aff369 5093 dVAR;
86f55936 5094 AV *av = NULL;
810b8aa5
GS
5095 SV **svp;
5096 I32 i;
86f55936 5097
7918f24d
NC
5098 PERL_ARGS_ASSERT_SV_DEL_BACKREF;
5099
86f55936
NC
5100 if (SvTYPE(tsv) == SVt_PVHV && SvOOK(tsv)) {
5101 av = *Perl_hv_backreferences_p(aTHX_ (HV*)tsv);
5b285ea4
NC
5102 /* We mustn't attempt to "fix up" the hash here by moving the
5103 backreference array back to the hv_aux structure, as that is stored
5104 in the main HvARRAY(), and hfreentries assumes that no-one
5105 reallocates HvARRAY() while it is running. */
86f55936
NC
5106 }
5107 if (!av) {
5108 const MAGIC *const mg
5109 = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
5110 if (mg)
5111 av = (AV *)mg->mg_obj;
5112 }
41fae7a1
DM
5113
5114 if (!av)
cea2e8a9 5115 Perl_croak(aTHX_ "panic: del_backref");
86f55936 5116
41fae7a1 5117 assert(!SvIS_FREED(av));
86f55936 5118
810b8aa5 5119 svp = AvARRAY(av);
6a76db8b
NC
5120 /* We shouldn't be in here more than once, but for paranoia reasons lets
5121 not assume this. */
5122 for (i = AvFILLp(av); i >= 0; i--) {
5123 if (svp[i] == sv) {
5124 const SSize_t fill = AvFILLp(av);
5125 if (i != fill) {
5126 /* We weren't the last entry.
5127 An unordered list has this property that you can take the
5128 last element off the end to fill the hole, and it's still
5129 an unordered list :-)
5130 */
5131 svp[i] = svp[fill];
5132 }
a0714e2c 5133 svp[fill] = NULL;
6a76db8b
NC
5134 AvFILLp(av) = fill - 1;
5135 }
5136 }
810b8aa5
GS
5137}
5138
86f55936 5139int
2b021c53 5140Perl_sv_kill_backrefs(pTHX_ SV *const sv, AV *const av)
86f55936
NC
5141{
5142 SV **svp = AvARRAY(av);
5143
7918f24d 5144 PERL_ARGS_ASSERT_SV_KILL_BACKREFS;
86f55936
NC
5145 PERL_UNUSED_ARG(sv);
5146
41fae7a1
DM
5147 assert(!svp || !SvIS_FREED(av));
5148 if (svp) {
86f55936
NC
5149 SV *const *const last = svp + AvFILLp(av);
5150
5151 while (svp <= last) {
5152 if (*svp) {
5153 SV *const referrer = *svp;
5154 if (SvWEAKREF(referrer)) {
5155 /* XXX Should we check that it hasn't changed? */
5156 SvRV_set(referrer, 0);
5157 SvOK_off(referrer);
5158 SvWEAKREF_off(referrer);
1e73acc8 5159 SvSETMAGIC(referrer);
86f55936
NC
5160 } else if (SvTYPE(referrer) == SVt_PVGV ||
5161 SvTYPE(referrer) == SVt_PVLV) {
5162 /* You lookin' at me? */
5163 assert(GvSTASH(referrer));
5164 assert(GvSTASH(referrer) == (HV*)sv);
5165 GvSTASH(referrer) = 0;
5166 } else {
5167 Perl_croak(aTHX_
5168 "panic: magic_killbackrefs (flags=%"UVxf")",
5169 (UV)SvFLAGS(referrer));
5170 }
5171
a0714e2c 5172 *svp = NULL;
86f55936
NC
5173 }
5174 svp++;
5175 }
5176 }
5177 SvREFCNT_dec(av); /* remove extra count added by sv_add_backref() */
5178 return 0;
5179}
5180
954c1994
GS
5181/*
5182=for apidoc sv_insert
5183
5184Inserts a string at the specified offset/length within the SV. Similar to
c0dd94a0 5185the Perl substr() function. Handles get magic.
954c1994 5186
c0dd94a0
VP
5187=for apidoc sv_insert_flags
5188
5189Same as C<sv_insert>, but the extra C<flags> are passed the C<SvPV_force_flags> that applies to C<bigstr>.
5190
5191=cut
5192*/
5193
5194void
5195Perl_sv_insert_flags(pTHX_ SV *const bigstr, const STRLEN offset, const STRLEN len, const char *const little, const STRLEN littlelen, const U32 flags)
5196{
97aff369 5197 dVAR;
79072805
LW
5198 register char *big;
5199 register char *mid;
5200 register char *midend;
5201 register char *bigend;
5202 register I32 i;
6ff81951 5203 STRLEN curlen;
1c846c1f 5204
27aecdc6 5205 PERL_ARGS_ASSERT_SV_INSERT_FLAGS;
79072805 5206
8990e307 5207 if (!bigstr)
cea2e8a9 5208 Perl_croak(aTHX_ "Can't modify non-existent substring");
c0dd94a0 5209 SvPV_force_flags(bigstr, curlen, flags);
60fa28ff 5210 (void)SvPOK_only_UTF8(bigstr);
6ff81951
GS
5211 if (offset + len > curlen) {
5212 SvGROW(bigstr, offset+len+1);
93524f2b 5213 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
6ff81951
GS
5214 SvCUR_set(bigstr, offset+len);
5215 }
79072805 5216
69b47968 5217 SvTAINT(bigstr);
79072805
LW
5218 i = littlelen - len;
5219 if (i > 0) { /* string might grow */
a0d0e21e 5220 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
5221 mid = big + offset + len;
5222 midend = bigend = big + SvCUR(bigstr);
5223 bigend += i;
5224 *bigend = '\0';
5225 while (midend > mid) /* shove everything down */
5226 *--bigend = *--midend;
5227 Move(little,big+offset,littlelen,char);
b162af07 5228 SvCUR_set(bigstr, SvCUR(bigstr) + i);
79072805
LW
5229 SvSETMAGIC(bigstr);
5230 return;
5231 }
5232 else if (i == 0) {
463ee0b2 5233 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
5234 SvSETMAGIC(bigstr);
5235 return;
5236 }
5237
463ee0b2 5238 big = SvPVX(bigstr);
79072805
LW
5239 mid = big + offset;
5240 midend = mid + len;
5241 bigend = big + SvCUR(bigstr);
5242
5243 if (midend > bigend)
cea2e8a9 5244 Perl_croak(aTHX_ "panic: sv_insert");
79072805
LW
5245
5246 if (mid - big > bigend - midend) { /* faster to shorten from end */
5247 if (littlelen) {
5248 Move(little, mid, littlelen,char);
5249 mid += littlelen;
5250 }
5251 i = bigend - midend;
5252 if (i > 0) {
5253 Move(midend, mid, i,char);
5254 mid += i;
5255 }
5256 *mid = '\0';
5257 SvCUR_set(bigstr, mid - big);
5258 }
155aba94 5259 else if ((i = mid - big)) { /* faster from front */
79072805
LW
5260 midend -= littlelen;
5261 mid = midend;
0d3c21b0 5262 Move(big, midend - i, i, char);
79072805 5263 sv_chop(bigstr,midend-i);
79072805
LW
5264 if (littlelen)
5265 Move(little, mid, littlelen,char);
5266 }
5267 else if (littlelen) {
5268 midend -= littlelen;
5269 sv_chop(bigstr,midend);
5270 Move(little,midend,littlelen,char);
5271 }
5272 else {
5273 sv_chop(bigstr,midend);
5274 }
5275 SvSETMAGIC(bigstr);
5276}
5277
c461cf8f
JH
5278/*
5279=for apidoc sv_replace
5280
5281Make the first argument a copy of the second, then delete the original.
645c22ef
DM
5282The target SV physically takes over ownership of the body of the source SV
5283and inherits its flags; however, the target keeps any magic it owns,
5284and any magic in the source is discarded.
ff276b08 5285Note that this is a rather specialist SV copying operation; most of the
645c22ef 5286time you'll want to use C<sv_setsv> or one of its many macro front-ends.
c461cf8f
JH
5287
5288=cut
5289*/
79072805
LW
5290
5291void
af828c01 5292Perl_sv_replace(pTHX_ register SV *const sv, register SV *const nsv)
79072805 5293{
97aff369 5294 dVAR;
a3b680e6 5295 const U32 refcnt = SvREFCNT(sv);
7918f24d
NC
5296
5297 PERL_ARGS_ASSERT_SV_REPLACE;
5298
765f542d 5299 SV_CHECK_THINKFIRST_COW_DROP(sv);
30e5c352 5300 if (SvREFCNT(nsv) != 1) {
7437becc 5301 Perl_croak(aTHX_ "panic: reference miscount on nsv in sv_replace() (%"
30e5c352
NC
5302 UVuf " != 1)", (UV) SvREFCNT(nsv));
5303 }
93a17b20 5304 if (SvMAGICAL(sv)) {
a0d0e21e
LW
5305 if (SvMAGICAL(nsv))
5306 mg_free(nsv);
5307 else
5308 sv_upgrade(nsv, SVt_PVMG);
b162af07 5309 SvMAGIC_set(nsv, SvMAGIC(sv));
a0d0e21e 5310 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20 5311 SvMAGICAL_off(sv);
b162af07 5312 SvMAGIC_set(sv, NULL);
93a17b20 5313 }
79072805
LW
5314 SvREFCNT(sv) = 0;
5315 sv_clear(sv);
477f5d66 5316 assert(!SvREFCNT(sv));
fd0854ff
DM
5317#ifdef DEBUG_LEAKING_SCALARS
5318 sv->sv_flags = nsv->sv_flags;
5319 sv->sv_any = nsv->sv_any;
5320 sv->sv_refcnt = nsv->sv_refcnt;
f34d0642 5321 sv->sv_u = nsv->sv_u;
fd0854ff 5322#else
79072805 5323 StructCopy(nsv,sv,SV);
fd0854ff 5324#endif
4df7f6af 5325 if(SvTYPE(sv) == SVt_IV) {
7b2c381c 5326 SvANY(sv)
339049b0 5327 = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
7b2c381c
NC
5328 }
5329
fd0854ff 5330
f8c7b90f 5331#ifdef PERL_OLD_COPY_ON_WRITE
d3d0e6f1
NC
5332 if (SvIsCOW_normal(nsv)) {
5333 /* We need to follow the pointers around the loop to make the
5334 previous SV point to sv, rather than nsv. */
5335 SV *next;
5336 SV *current = nsv;
5337 while ((next = SV_COW_NEXT_SV(current)) != nsv) {
5338 assert(next);
5339 current = next;
3f7c398e 5340 assert(SvPVX_const(current) == SvPVX_const(nsv));
d3d0e6f1
NC
5341 }
5342 /* Make the SV before us point to the SV after us. */
5343 if (DEBUG_C_TEST) {
5344 PerlIO_printf(Perl_debug_log, "previous is\n");
5345 sv_dump(current);
a29f6d03
NC
5346 PerlIO_printf(Perl_debug_log,
5347 "move it from 0x%"UVxf" to 0x%"UVxf"\n",
d3d0e6f1
NC
5348 (UV) SV_COW_NEXT_SV(current), (UV) sv);
5349 }
a29f6d03 5350 SV_COW_NEXT_SV_SET(current, sv);
d3d0e6f1
NC
5351 }
5352#endif
79072805 5353 SvREFCNT(sv) = refcnt;
1edc1566 5354 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
39cf41c2 5355 SvREFCNT(nsv) = 0;
463ee0b2 5356 del_SV(nsv);
79072805
LW
5357}
5358
c461cf8f
JH
5359/*
5360=for apidoc sv_clear
5361
645c22ef
DM
5362Clear an SV: call any destructors, free up any memory used by the body,
5363and free the body itself. The SV's head is I<not> freed, although
5364its type is set to all 1's so that it won't inadvertently be assumed
5365to be live during global destruction etc.
5366This function should only be called when REFCNT is zero. Most of the time
5367you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
5368instead.
c461cf8f
JH
5369
5370=cut
5371*/
5372
79072805 5373void
af828c01 5374Perl_sv_clear(pTHX_ register SV *const sv)
79072805 5375{
27da23d5 5376 dVAR;
82bb6deb 5377 const U32 type = SvTYPE(sv);
8edfc514
NC
5378 const struct body_details *const sv_type_details
5379 = bodies_by_type + type;
dd69841b 5380 HV *stash;
82bb6deb 5381
7918f24d 5382 PERL_ARGS_ASSERT_SV_CLEAR;
79072805 5383 assert(SvREFCNT(sv) == 0);
ceb531cd 5384 assert(SvTYPE(sv) != SVTYPEMASK);
79072805 5385
d2a0f284
JC
5386 if (type <= SVt_IV) {
5387 /* See the comment in sv.h about the collusion between this early
5388 return and the overloading of the NULL and IV slots in the size
5389 table. */
4df7f6af
NC
5390 if (SvROK(sv)) {
5391 SV * const target = SvRV(sv);
5392 if (SvWEAKREF(sv))
5393 sv_del_backref(target, sv);
5394 else
5395 SvREFCNT_dec(target);
5396 }
5397 SvFLAGS(sv) &= SVf_BREAK;
5398 SvFLAGS(sv) |= SVTYPEMASK;
82bb6deb 5399 return;
d2a0f284 5400 }
82bb6deb 5401
ed6116ce 5402 if (SvOBJECT(sv)) {
eba16661
JH
5403 if (PL_defstash && /* Still have a symbol table? */
5404 SvDESTROYABLE(sv))
5405 {
39644a26 5406 dSP;
893645bd 5407 HV* stash;
d460ef45 5408 do {
b464bac0 5409 CV* destructor;
4e8e7886 5410 stash = SvSTASH(sv);
32251b26 5411 destructor = StashHANDLER(stash,DESTROY);
4e8e7886 5412 if (destructor) {
1b6737cc 5413 SV* const tmpref = newRV(sv);
5cc433a6 5414 SvREADONLY_on(tmpref); /* DESTROY() could be naughty */
4e8e7886 5415 ENTER;
e788e7d3 5416 PUSHSTACKi(PERLSI_DESTROY);
4e8e7886
GS
5417 EXTEND(SP, 2);
5418 PUSHMARK(SP);
5cc433a6 5419 PUSHs(tmpref);
4e8e7886 5420 PUTBACK;
44389ee9 5421 call_sv((SV*)destructor, G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
7a5fa8a2
NIS
5422
5423
d3acc0f7 5424 POPSTACK;
3095d977 5425 SPAGAIN;
4e8e7886 5426 LEAVE;
5cc433a6
AB
5427 if(SvREFCNT(tmpref) < 2) {
5428 /* tmpref is not kept alive! */
5429 SvREFCNT(sv)--;
b162af07 5430 SvRV_set(tmpref, NULL);
5cc433a6
AB
5431 SvROK_off(tmpref);
5432 }
5433 SvREFCNT_dec(tmpref);
4e8e7886
GS
5434 }
5435 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 5436
6f44e0a4
JP
5437
5438 if (SvREFCNT(sv)) {
5439 if (PL_in_clean_objs)
cea2e8a9 5440 Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
bfcb3514 5441 HvNAME_get(stash));
6f44e0a4
JP
5442 /* DESTROY gave object new lease on life */
5443 return;
5444 }
a0d0e21e 5445 }
4e8e7886 5446
a0d0e21e 5447 if (SvOBJECT(sv)) {
4e8e7886 5448 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
a0d0e21e 5449 SvOBJECT_off(sv); /* Curse the object. */
82bb6deb 5450 if (type != SVt_PVIO)
3280af22 5451 --PL_sv_objcount; /* XXX Might want something more general */
a0d0e21e 5452 }
463ee0b2 5453 }
82bb6deb 5454 if (type >= SVt_PVMG) {
cecf5685 5455 if (type == SVt_PVMG && SvPAD_OUR(sv)) {
73d95100 5456 SvREFCNT_dec(SvOURSTASH(sv));
e736a858 5457 } else if (SvMAGIC(sv))
524189f1 5458 mg_free(sv);
00b1698f 5459 if (type == SVt_PVMG && SvPAD_TYPED(sv))
524189f1
JH
5460 SvREFCNT_dec(SvSTASH(sv));
5461 }
82bb6deb 5462 switch (type) {
cecf5685 5463 /* case SVt_BIND: */
8990e307 5464 case SVt_PVIO:
df0bd2f4
GS
5465 if (IoIFP(sv) &&
5466 IoIFP(sv) != PerlIO_stdin() &&
5f05dabc 5467 IoIFP(sv) != PerlIO_stdout() &&
5468 IoIFP(sv) != PerlIO_stderr())
93578b34 5469 {
f2b5be74 5470 io_close((IO*)sv, FALSE);
93578b34 5471 }
1d7c1841 5472 if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
1236053a 5473 PerlDir_close(IoDIRP(sv));
1d7c1841 5474 IoDIRP(sv) = (DIR*)NULL;
8990e307
LW
5475 Safefree(IoTOP_NAME(sv));
5476 Safefree(IoFMT_NAME(sv));
5477 Safefree(IoBOTTOM_NAME(sv));
82bb6deb 5478 goto freescalar;
5c35adbb 5479 case SVt_REGEXP:
288b8c02 5480 /* FIXME for plugins */
d2f13c59 5481 pregfree2((REGEXP*) sv);
5c35adbb 5482 goto freescalar;
79072805 5483 case SVt_PVCV:
748a9306 5484 case SVt_PVFM:
85e6fe83 5485 cv_undef((CV*)sv);
a0d0e21e 5486 goto freescalar;
79072805 5487 case SVt_PVHV:
86f55936 5488 Perl_hv_kill_backrefs(aTHX_ (HV*)sv);
85e6fe83 5489 hv_undef((HV*)sv);
a0d0e21e 5490 break;
79072805 5491 case SVt_PVAV:
3f90d085
DM
5492 if (PL_comppad == (AV*)sv) {
5493 PL_comppad = NULL;
5494 PL_curpad = NULL;
5495 }
85e6fe83 5496 av_undef((AV*)sv);
a0d0e21e 5497 break;
02270b4e 5498 case SVt_PVLV:
dd28f7bb
DM
5499 if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
5500 SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv)));
5501 HeNEXT((HE*)LvTARG(sv)) = PL_hv_fetch_ent_mh;
5502 PL_hv_fetch_ent_mh = (HE*)LvTARG(sv);
5503 }
5504 else if (LvTYPE(sv) != 't') /* unless tie: unrefcnted fake SV** */
5505 SvREFCNT_dec(LvTARG(sv));
a0d0e21e 5506 case SVt_PVGV:
cecf5685 5507 if (isGV_with_GP(sv)) {
dd69841b
BB
5508 if(GvCVu((GV*)sv) && (stash = GvSTASH((GV*)sv)) && HvNAME_get(stash))
5509 mro_method_changed_in(stash);
cecf5685
NC
5510 gp_free((GV*)sv);
5511 if (GvNAME_HEK(sv))
5512 unshare_hek(GvNAME_HEK(sv));
dd69841b
BB
5513 /* If we're in a stash, we don't own a reference to it. However it does
5514 have a back reference to us, which needs to be cleared. */
5515 if (!SvVALID(sv) && (stash = GvSTASH(sv)))
5516 sv_del_backref((SV*)stash, sv);
cecf5685 5517 }
8571fe2f
NC
5518 /* FIXME. There are probably more unreferenced pointers to SVs in the
5519 interpreter struct that we should check and tidy in a similar
5520 fashion to this: */
5521 if ((GV*)sv == PL_last_in_gv)
5522 PL_last_in_gv = NULL;
79072805 5523 case SVt_PVMG:
79072805
LW
5524 case SVt_PVNV:
5525 case SVt_PVIV:
7a4bba22 5526 case SVt_PV:
a0d0e21e 5527 freescalar:
5228ca4e
NC
5528 /* Don't bother with SvOOK_off(sv); as we're only going to free it. */
5529 if (SvOOK(sv)) {
69240efd
NC
5530 STRLEN offset;
5531 SvOOK_offset(sv, offset);
5532 SvPV_set(sv, SvPVX_mutable(sv) - offset);
5228ca4e
NC
5533 /* Don't even bother with turning off the OOK flag. */
5534 }
810b8aa5 5535 if (SvROK(sv)) {
b37c2d43 5536 SV * const target = SvRV(sv);
810b8aa5 5537 if (SvWEAKREF(sv))
e15faf7d 5538 sv_del_backref(target, sv);
810b8aa5 5539 else
e15faf7d 5540 SvREFCNT_dec(target);
810b8aa5 5541 }
f8c7b90f 5542#ifdef PERL_OLD_COPY_ON_WRITE
3f7c398e 5543 else if (SvPVX_const(sv)) {
765f542d
NC
5544 if (SvIsCOW(sv)) {
5545 /* I believe I need to grab the global SV mutex here and
5546 then recheck the COW status. */
46187eeb
NC
5547 if (DEBUG_C_TEST) {
5548 PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
e419cbc5 5549 sv_dump(sv);
46187eeb 5550 }
5302ffd4
NC
5551 if (SvLEN(sv)) {
5552 sv_release_COW(sv, SvPVX_const(sv), SV_COW_NEXT_SV(sv));
5553 } else {
5554 unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
5555 }
5556
765f542d
NC
5557 /* And drop it here. */
5558 SvFAKE_off(sv);
5559 } else if (SvLEN(sv)) {
3f7c398e 5560 Safefree(SvPVX_const(sv));
765f542d
NC
5561 }
5562 }
5563#else
3f7c398e 5564 else if (SvPVX_const(sv) && SvLEN(sv))
94010e71 5565 Safefree(SvPVX_mutable(sv));
3f7c398e 5566 else if (SvPVX_const(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
bdd68bc3 5567 unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
1c846c1f
NIS
5568 SvFAKE_off(sv);
5569 }
765f542d 5570#endif
79072805
LW
5571 break;
5572 case SVt_NV:
79072805
LW
5573 break;
5574 }
5575
893645bd
NC
5576 SvFLAGS(sv) &= SVf_BREAK;
5577 SvFLAGS(sv) |= SVTYPEMASK;
5578
8edfc514 5579 if (sv_type_details->arena) {
b9502f15 5580 del_body(((char *)SvANY(sv) + sv_type_details->offset),
8edfc514
NC
5581 &PL_body_roots[type]);
5582 }
d2a0f284 5583 else if (sv_type_details->body_size) {
8edfc514
NC
5584 my_safefree(SvANY(sv));
5585 }
79072805
LW
5586}
5587
645c22ef
DM
5588/*
5589=for apidoc sv_newref
5590
5591Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
5592instead.
5593
5594=cut
5595*/
5596
79072805 5597SV *
af828c01 5598Perl_sv_newref(pTHX_ SV *const sv)
79072805 5599{
96a5add6 5600 PERL_UNUSED_CONTEXT;
463ee0b2 5601 if (sv)
4db098f4 5602 (SvREFCNT(sv))++;
79072805
LW
5603 return sv;
5604}
5605
c461cf8f
JH
5606/*
5607=for apidoc sv_free
5608
645c22ef
DM
5609Decrement an SV's reference count, and if it drops to zero, call
5610C<sv_clear> to invoke destructors and free up any memory used by
5611the body; finally, deallocate the SV's head itself.
5612Normally called via a wrapper macro C<SvREFCNT_dec>.
c461cf8f
JH
5613
5614=cut
5615*/
5616
79072805 5617void
af828c01 5618Perl_sv_free(pTHX_ SV *const sv)
79072805 5619{
27da23d5 5620 dVAR;
79072805
LW
5621 if (!sv)
5622 return;
a0d0e21e
LW
5623 if (SvREFCNT(sv) == 0) {
5624 if (SvFLAGS(sv) & SVf_BREAK)
645c22ef
DM
5625 /* this SV's refcnt has been artificially decremented to
5626 * trigger cleanup */
a0d0e21e 5627 return;
3280af22 5628 if (PL_in_clean_all) /* All is fair */
1edc1566 5629 return;
d689ffdd
JP
5630 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5631 /* make sure SvREFCNT(sv)==0 happens very seldom */
5632 SvREFCNT(sv) = (~(U32)0)/2;
5633 return;
5634 }
41e4abd8 5635 if (ckWARN_d(WARN_INTERNAL)) {
41e4abd8
NC
5636#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
5637 Perl_dump_sv_child(aTHX_ sv);
e4c5322d
DM
5638#else
5639 #ifdef DEBUG_LEAKING_SCALARS
bfd95973 5640 sv_dump(sv);
e4c5322d 5641 #endif
bfd95973
NC
5642#ifdef DEBUG_LEAKING_SCALARS_ABORT
5643 if (PL_warnhook == PERL_WARNHOOK_FATAL
5644 || ckDEAD(packWARN(WARN_INTERNAL))) {
5645 /* Don't let Perl_warner cause us to escape our fate: */
5646 abort();
5647 }
5648#endif
5649 /* This may not return: */
5650 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
5651 "Attempt to free unreferenced scalar: SV 0x%"UVxf
5652 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
41e4abd8
NC
5653#endif
5654 }
77abb4c6
NC
5655#ifdef DEBUG_LEAKING_SCALARS_ABORT
5656 abort();
5657#endif
79072805
LW
5658 return;
5659 }
4db098f4 5660 if (--(SvREFCNT(sv)) > 0)
8990e307 5661 return;
8c4d3c90
NC
5662 Perl_sv_free2(aTHX_ sv);
5663}
5664
5665void
af828c01 5666Perl_sv_free2(pTHX_ SV *const sv)
8c4d3c90 5667{
27da23d5 5668 dVAR;
7918f24d
NC
5669
5670 PERL_ARGS_ASSERT_SV_FREE2;
5671
463ee0b2
LW
5672#ifdef DEBUGGING
5673 if (SvTEMP(sv)) {
0453d815 5674 if (ckWARN_d(WARN_DEBUGGING))
9014280d 5675 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
472d47bc
SB
5676 "Attempt to free temp prematurely: SV 0x%"UVxf
5677 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
79072805 5678 return;
79072805 5679 }
463ee0b2 5680#endif
d689ffdd
JP
5681 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5682 /* make sure SvREFCNT(sv)==0 happens very seldom */
5683 SvREFCNT(sv) = (~(U32)0)/2;
5684 return;
5685 }
79072805 5686 sv_clear(sv);
477f5d66
CS
5687 if (! SvREFCNT(sv))
5688 del_SV(sv);
79072805
LW
5689}
5690
954c1994
GS
5691/*
5692=for apidoc sv_len
5693
645c22ef
DM
5694Returns the length of the string in the SV. Handles magic and type
5695coercion. See also C<SvCUR>, which gives raw access to the xpv_cur slot.
954c1994
GS
5696
5697=cut
5698*/
5699
79072805 5700STRLEN
af828c01 5701Perl_sv_len(pTHX_ register SV *const sv)
79072805 5702{
463ee0b2 5703 STRLEN len;
79072805
LW
5704
5705 if (!sv)
5706 return 0;
5707
8990e307 5708 if (SvGMAGICAL(sv))
565764a8 5709 len = mg_length(sv);
8990e307 5710 else
4d84ee25 5711 (void)SvPV_const(sv, len);
463ee0b2 5712 return len;
79072805
LW
5713}
5714
c461cf8f
JH
5715/*
5716=for apidoc sv_len_utf8
5717
5718Returns the number of characters in the string in an SV, counting wide
1e54db1a 5719UTF-8 bytes as a single character. Handles magic and type coercion.
c461cf8f
JH
5720
5721=cut
5722*/
5723
7e8c5dac
HS
5724/*
5725 * The length is cached in PERL_UTF8_magic, in the mg_len field. Also the
9564a3bd
NC
5726 * mg_ptr is used, by sv_pos_u2b() and sv_pos_b2u() - see the comments below.
5727 * (Note that the mg_len is not the length of the mg_ptr field.
5728 * This allows the cache to store the character length of the string without
5729 * needing to malloc() extra storage to attach to the mg_ptr.)
7a5fa8a2 5730 *
7e8c5dac
HS
5731 */
5732
a0ed51b3 5733STRLEN
af828c01 5734Perl_sv_len_utf8(pTHX_ register SV *const sv)
a0ed51b3 5735{
a0ed51b3
LW
5736 if (!sv)
5737 return 0;
5738
a0ed51b3 5739 if (SvGMAGICAL(sv))
b76347f2 5740 return mg_length(sv);
a0ed51b3 5741 else
b76347f2 5742 {
26346457 5743 STRLEN len;
e62f0680 5744 const U8 *s = (U8*)SvPV_const(sv, len);
7e8c5dac 5745
26346457
NC
5746 if (PL_utf8cache) {
5747 STRLEN ulen;
fe5bfecd 5748 MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : NULL;
26346457
NC
5749
5750 if (mg && mg->mg_len != -1) {
5751 ulen = mg->mg_len;
5752 if (PL_utf8cache < 0) {
5753 const STRLEN real = Perl_utf8_length(aTHX_ s, s + len);
5754 if (real != ulen) {
5755 /* Need to turn the assertions off otherwise we may
5756 recurse infinitely while printing error messages.
5757 */
5758 SAVEI8(PL_utf8cache);
5759 PL_utf8cache = 0;
f5992bc4
RB
5760 Perl_croak(aTHX_ "panic: sv_len_utf8 cache %"UVuf
5761 " real %"UVuf" for %"SVf,
be2597df 5762 (UV) ulen, (UV) real, SVfARG(sv));
26346457
NC
5763 }
5764 }
5765 }
5766 else {
5767 ulen = Perl_utf8_length(aTHX_ s, s + len);
5768 if (!SvREADONLY(sv)) {
5769 if (!mg) {
5770 mg = sv_magicext(sv, 0, PERL_MAGIC_utf8,
5771 &PL_vtbl_utf8, 0, 0);
5772 }
cb9e20bb 5773 assert(mg);
26346457 5774 mg->mg_len = ulen;
cb9e20bb 5775 }
cb9e20bb 5776 }
26346457 5777 return ulen;
7e8c5dac 5778 }
26346457 5779 return Perl_utf8_length(aTHX_ s, s + len);
7e8c5dac
HS
5780 }
5781}
5782
9564a3bd
NC
5783/* Walk forwards to find the byte corresponding to the passed in UTF-8
5784 offset. */
bdf30dd6 5785static STRLEN
721e86b6 5786S_sv_pos_u2b_forwards(const U8 *const start, const U8 *const send,
bdf30dd6
NC
5787 STRLEN uoffset)
5788{
5789 const U8 *s = start;
5790
7918f24d
NC
5791 PERL_ARGS_ASSERT_SV_POS_U2B_FORWARDS;
5792
bdf30dd6
NC
5793 while (s < send && uoffset--)
5794 s += UTF8SKIP(s);
5795 if (s > send) {
5796 /* This is the existing behaviour. Possibly it should be a croak, as
5797 it's actually a bounds error */
5798 s = send;
5799 }
5800 return s - start;
5801}
5802
9564a3bd
NC
5803/* Given the length of the string in both bytes and UTF-8 characters, decide
5804 whether to walk forwards or backwards to find the byte corresponding to
5805 the passed in UTF-8 offset. */
c336ad0b 5806static STRLEN
721e86b6 5807S_sv_pos_u2b_midway(const U8 *const start, const U8 *send,
af828c01 5808 const STRLEN uoffset, const STRLEN uend)
c336ad0b
NC
5809{
5810 STRLEN backw = uend - uoffset;
7918f24d
NC
5811
5812 PERL_ARGS_ASSERT_SV_POS_U2B_MIDWAY;
5813
c336ad0b 5814 if (uoffset < 2 * backw) {
25a8a4ef 5815 /* The assumption is that going forwards is twice the speed of going
c336ad0b
NC
5816 forward (that's where the 2 * backw comes from).
5817 (The real figure of course depends on the UTF-8 data.) */
721e86b6 5818 return sv_pos_u2b_forwards(start, send, uoffset);
c336ad0b
NC
5819 }
5820
5821 while (backw--) {
5822 send--;
5823 while (UTF8_IS_CONTINUATION(*send))
5824 send--;
5825 }
5826 return send - start;
5827}
5828
9564a3bd
NC
5829/* For the string representation of the given scalar, find the byte
5830 corresponding to the passed in UTF-8 offset. uoffset0 and boffset0
5831 give another position in the string, *before* the sought offset, which
5832 (which is always true, as 0, 0 is a valid pair of positions), which should
5833 help reduce the amount of linear searching.
5834 If *mgp is non-NULL, it should point to the UTF-8 cache magic, which
5835 will be used to reduce the amount of linear searching. The cache will be
5836 created if necessary, and the found value offered to it for update. */
28ccbf94 5837static STRLEN
af828c01
SS
5838S_sv_pos_u2b_cached(pTHX_ SV *const sv, MAGIC **const mgp, const U8 *const start,
5839 const U8 *const send, const STRLEN uoffset,
7918f24d
NC
5840 STRLEN uoffset0, STRLEN boffset0)
5841{
7087a21c 5842 STRLEN boffset = 0; /* Actually always set, but let's keep gcc happy. */
c336ad0b
NC
5843 bool found = FALSE;
5844
7918f24d
NC
5845 PERL_ARGS_ASSERT_SV_POS_U2B_CACHED;
5846
75c33c12
NC
5847 assert (uoffset >= uoffset0);
5848
c336ad0b 5849 if (SvMAGICAL(sv) && !SvREADONLY(sv) && PL_utf8cache
0905937d 5850 && (*mgp || (*mgp = mg_find(sv, PERL_MAGIC_utf8)))) {
d8b2e1f9
NC
5851 if ((*mgp)->mg_ptr) {
5852 STRLEN *cache = (STRLEN *) (*mgp)->mg_ptr;
5853 if (cache[0] == uoffset) {
5854 /* An exact match. */
5855 return cache[1];
5856 }
ab455f60
NC
5857 if (cache[2] == uoffset) {
5858 /* An exact match. */
5859 return cache[3];
5860 }
668af93f
NC
5861
5862 if (cache[0] < uoffset) {
d8b2e1f9
NC
5863 /* The cache already knows part of the way. */
5864 if (cache[0] > uoffset0) {
5865 /* The cache knows more than the passed in pair */
5866 uoffset0 = cache[0];
5867 boffset0 = cache[1];
5868 }
5869 if ((*mgp)->mg_len != -1) {
5870 /* And we know the end too. */
5871 boffset = boffset0
721e86b6 5872 + sv_pos_u2b_midway(start + boffset0, send,
d8b2e1f9
NC
5873 uoffset - uoffset0,
5874 (*mgp)->mg_len - uoffset0);
5875 } else {
5876 boffset = boffset0
721e86b6 5877 + sv_pos_u2b_forwards(start + boffset0,
d8b2e1f9
NC
5878 send, uoffset - uoffset0);
5879 }
dd7c5fd3
NC
5880 }
5881 else if (cache[2] < uoffset) {
5882 /* We're between the two cache entries. */
5883 if (cache[2] > uoffset0) {
5884 /* and the cache knows more than the passed in pair */
5885 uoffset0 = cache[2];
5886 boffset0 = cache[3];
5887 }
5888
668af93f 5889 boffset = boffset0
721e86b6 5890 + sv_pos_u2b_midway(start + boffset0,
668af93f
NC
5891 start + cache[1],
5892 uoffset - uoffset0,
5893 cache[0] - uoffset0);
dd7c5fd3
NC
5894 } else {
5895 boffset = boffset0
721e86b6 5896 + sv_pos_u2b_midway(start + boffset0,
dd7c5fd3
NC
5897 start + cache[3],
5898 uoffset - uoffset0,
5899 cache[2] - uoffset0);
d8b2e1f9 5900 }
668af93f 5901 found = TRUE;
d8b2e1f9
NC
5902 }
5903 else if ((*mgp)->mg_len != -1) {
75c33c12
NC
5904 /* If we can take advantage of a passed in offset, do so. */
5905 /* In fact, offset0 is either 0, or less than offset, so don't
5906 need to worry about the other possibility. */
5907 boffset = boffset0
721e86b6 5908 + sv_pos_u2b_midway(start + boffset0, send,
75c33c12
NC
5909 uoffset - uoffset0,
5910 (*mgp)->mg_len - uoffset0);
c336ad0b
NC
5911 found = TRUE;
5912 }
28ccbf94 5913 }
c336ad0b
NC
5914
5915 if (!found || PL_utf8cache < 0) {
75c33c12 5916 const STRLEN real_boffset
721e86b6 5917 = boffset0 + sv_pos_u2b_forwards(start + boffset0,
75c33c12
NC
5918 send, uoffset - uoffset0);
5919
c336ad0b
NC
5920 if (found && PL_utf8cache < 0) {
5921 if (real_boffset != boffset) {
5922 /* Need to turn the assertions off otherwise we may recurse
5923 infinitely while printing error messages. */
5924 SAVEI8(PL_utf8cache);
5925 PL_utf8cache = 0;
f5992bc4
RB
5926 Perl_croak(aTHX_ "panic: sv_pos_u2b_cache cache %"UVuf
5927 " real %"UVuf" for %"SVf,
be2597df 5928 (UV) boffset, (UV) real_boffset, SVfARG(sv));
c336ad0b
NC
5929 }
5930 }
5931 boffset = real_boffset;
28ccbf94 5932 }
0905937d 5933
efcbbafb
NC
5934 if (PL_utf8cache)
5935 utf8_mg_pos_cache_update(sv, mgp, boffset, uoffset, send - start);
28ccbf94
NC
5936 return boffset;
5937}
5938
9564a3bd
NC
5939
5940/*
5941=for apidoc sv_pos_u2b
5942
5943Converts the value pointed to by offsetp from a count of UTF-8 chars from
5944the start of the string, to a count of the equivalent number of bytes; if
5945lenp is non-zero, it does the same to lenp, but this time starting from
5946the offset, rather than from the start of the string. Handles magic and
5947type coercion.
5948
5949=cut
5950*/
5951
5952/*
5953 * sv_pos_u2b() uses, like sv_pos_b2u(), the mg_ptr of the potential
5954 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
5955 * byte offsets. See also the comments of S_utf8_mg_pos_cache_update().
5956 *
5957 */
5958
a0ed51b3 5959void
af828c01 5960Perl_sv_pos_u2b(pTHX_ register SV *const sv, I32 *const offsetp, I32 *const lenp)
a0ed51b3 5961{
245d4a47 5962 const U8 *start;
a0ed51b3
LW
5963 STRLEN len;
5964
7918f24d
NC
5965 PERL_ARGS_ASSERT_SV_POS_U2B;
5966
a0ed51b3
LW
5967 if (!sv)
5968 return;
5969
245d4a47 5970 start = (U8*)SvPV_const(sv, len);
7e8c5dac 5971 if (len) {
bdf30dd6
NC
5972 STRLEN uoffset = (STRLEN) *offsetp;
5973 const U8 * const send = start + len;
0905937d 5974 MAGIC *mg = NULL;
721e86b6 5975 const STRLEN boffset = sv_pos_u2b_cached(sv, &mg, start, send,
28ccbf94 5976 uoffset, 0, 0);
bdf30dd6
NC
5977
5978 *offsetp = (I32) boffset;
5979
5980 if (lenp) {
28ccbf94 5981 /* Convert the relative offset to absolute. */
721e86b6
AL
5982 const STRLEN uoffset2 = uoffset + (STRLEN) *lenp;
5983 const STRLEN boffset2
5984 = sv_pos_u2b_cached(sv, &mg, start, send, uoffset2,
28ccbf94 5985 uoffset, boffset) - boffset;
bdf30dd6 5986
28ccbf94 5987 *lenp = boffset2;
bdf30dd6 5988 }
7e8c5dac
HS
5989 }
5990 else {
5991 *offsetp = 0;
5992 if (lenp)
5993 *lenp = 0;
a0ed51b3 5994 }
e23c8137 5995
a0ed51b3
LW
5996 return;
5997}
5998
9564a3bd
NC
5999/* Create and update the UTF8 magic offset cache, with the proffered utf8/
6000 byte length pairing. The (byte) length of the total SV is passed in too,
6001 as blen, because for some (more esoteric) SVs, the call to SvPV_const()
6002 may not have updated SvCUR, so we can't rely on reading it directly.
6003
6004 The proffered utf8/byte length pairing isn't used if the cache already has
6005 two pairs, and swapping either for the proffered pair would increase the
6006 RMS of the intervals between known byte offsets.
6007
6008 The cache itself consists of 4 STRLEN values
6009 0: larger UTF-8 offset
6010 1: corresponding byte offset
6011 2: smaller UTF-8 offset
6012 3: corresponding byte offset
6013
6014 Unused cache pairs have the value 0, 0.
6015 Keeping the cache "backwards" means that the invariant of
6016 cache[0] >= cache[2] is maintained even with empty slots, which means that
6017 the code that uses it doesn't need to worry if only 1 entry has actually
6018 been set to non-zero. It also makes the "position beyond the end of the
6019 cache" logic much simpler, as the first slot is always the one to start
6020 from.
645c22ef 6021*/
ec07b5e0 6022static void
ac1e9476
SS
6023S_utf8_mg_pos_cache_update(pTHX_ SV *const sv, MAGIC **const mgp, const STRLEN byte,
6024 const STRLEN utf8, const STRLEN blen)
ec07b5e0
NC
6025{
6026 STRLEN *cache;
7918f24d
NC
6027
6028 PERL_ARGS_ASSERT_UTF8_MG_POS_CACHE_UPDATE;
6029
ec07b5e0
NC
6030 if (SvREADONLY(sv))
6031 return;
6032
6033 if (!*mgp) {
6034 *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, (MGVTBL*)&PL_vtbl_utf8, 0,
6035 0);
6036 (*mgp)->mg_len = -1;
6037 }
6038 assert(*mgp);
6039
6040 if (!(cache = (STRLEN *)(*mgp)->mg_ptr)) {
6041 Newxz(cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
6042 (*mgp)->mg_ptr = (char *) cache;
6043 }
6044 assert(cache);
6045
6046 if (PL_utf8cache < 0) {
ef816a78 6047 const U8 *start = (const U8 *) SvPVX_const(sv);
6448472a 6048 const STRLEN realutf8 = utf8_length(start, start + byte);
ec07b5e0
NC
6049
6050 if (realutf8 != utf8) {
6051 /* Need to turn the assertions off otherwise we may recurse
6052 infinitely while printing error messages. */
6053 SAVEI8(PL_utf8cache);
6054 PL_utf8cache = 0;
f5992bc4 6055 Perl_croak(aTHX_ "panic: utf8_mg_pos_cache_update cache %"UVuf
be2597df 6056 " real %"UVuf" for %"SVf, (UV) utf8, (UV) realutf8, SVfARG(sv));
ec07b5e0
NC
6057 }
6058 }
ab455f60
NC
6059
6060 /* Cache is held with the later position first, to simplify the code
6061 that deals with unbounded ends. */
6062
6063 ASSERT_UTF8_CACHE(cache);
6064 if (cache[1] == 0) {
6065 /* Cache is totally empty */
6066 cache[0] = utf8;
6067 cache[1] = byte;
6068 } else if (cache[3] == 0) {
6069 if (byte > cache[1]) {
6070 /* New one is larger, so goes first. */
6071 cache[2] = cache[0];
6072 cache[3] = cache[1];
6073 cache[0] = utf8;
6074 cache[1] = byte;
6075 } else {
6076 cache[2] = utf8;
6077 cache[3] = byte;
6078 }
6079 } else {
6080#define THREEWAY_SQUARE(a,b,c,d) \
6081 ((float)((d) - (c))) * ((float)((d) - (c))) \
6082 + ((float)((c) - (b))) * ((float)((c) - (b))) \
6083 + ((float)((b) - (a))) * ((float)((b) - (a)))
6084
6085 /* Cache has 2 slots in use, and we know three potential pairs.
6086 Keep the two that give the lowest RMS distance. Do the
6087 calcualation in bytes simply because we always know the byte
6088 length. squareroot has the same ordering as the positive value,
6089 so don't bother with the actual square root. */
6090 const float existing = THREEWAY_SQUARE(0, cache[3], cache[1], blen);
6091 if (byte > cache[1]) {
6092 /* New position is after the existing pair of pairs. */
6093 const float keep_earlier
6094 = THREEWAY_SQUARE(0, cache[3], byte, blen);
6095 const float keep_later
6096 = THREEWAY_SQUARE(0, cache[1], byte, blen);
6097
6098 if (keep_later < keep_earlier) {
6099 if (keep_later < existing) {
6100 cache[2] = cache[0];
6101 cache[3] = cache[1];
6102 cache[0] = utf8;
6103 cache[1] = byte;
6104 }
6105 }
6106 else {
6107 if (keep_earlier < existing) {
6108 cache[0] = utf8;
6109 cache[1] = byte;
6110 }
6111 }
6112 }
57d7fbf1
NC
6113 else if (byte > cache[3]) {
6114 /* New position is between the existing pair of pairs. */
6115 const float keep_earlier
6116 = THREEWAY_SQUARE(0, cache[3], byte, blen);
6117 const float keep_later
6118 = THREEWAY_SQUARE(0, byte, cache[1], blen);
6119
6120 if (keep_later < keep_earlier) {
6121 if (keep_later < existing) {
6122 cache[2] = utf8;
6123 cache[3] = byte;
6124 }
6125 }
6126 else {
6127 if (keep_earlier < existing) {
6128 cache[0] = utf8;
6129 cache[1] = byte;
6130 }
6131 }
6132 }
6133 else {
6134 /* New position is before the existing pair of pairs. */
6135 const float keep_earlier
6136 = THREEWAY_SQUARE(0, byte, cache[3], blen);
6137 const float keep_later
6138 = THREEWAY_SQUARE(0, byte, cache[1], blen);
6139
6140 if (keep_later < keep_earlier) {
6141 if (keep_later < existing) {
6142 cache[2] = utf8;
6143 cache[3] = byte;
6144 }
6145 }
6146 else {
6147 if (keep_earlier < existing) {
6148 cache[0] = cache[2];
6149 cache[1] = cache[3];
6150 cache[2] = utf8;
6151 cache[3] = byte;
6152 }
6153 }
6154 }
ab455f60 6155 }
0905937d 6156 ASSERT_UTF8_CACHE(cache);
ec07b5e0
NC
6157}
6158
ec07b5e0 6159/* We already know all of the way, now we may be able to walk back. The same
25a8a4ef
NC
6160 assumption is made as in S_sv_pos_u2b_midway(), namely that walking
6161 backward is half the speed of walking forward. */
ec07b5e0 6162static STRLEN
ac1e9476
SS
6163S_sv_pos_b2u_midway(pTHX_ const U8 *const s, const U8 *const target,
6164 const U8 *end, STRLEN endu)
ec07b5e0
NC
6165{
6166 const STRLEN forw = target - s;
6167 STRLEN backw = end - target;
6168
7918f24d
NC
6169 PERL_ARGS_ASSERT_SV_POS_B2U_MIDWAY;
6170
ec07b5e0 6171 if (forw < 2 * backw) {
6448472a 6172 return utf8_length(s, target);
ec07b5e0
NC
6173 }
6174
6175 while (end > target) {
6176 end--;
6177 while (UTF8_IS_CONTINUATION(*end)) {
6178 end--;
6179 }
6180 endu--;
6181 }
6182 return endu;
6183}
6184
9564a3bd
NC
6185/*
6186=for apidoc sv_pos_b2u
6187
6188Converts the value pointed to by offsetp from a count of bytes from the
6189start of the string, to a count of the equivalent number of UTF-8 chars.
6190Handles magic and type coercion.
6191
6192=cut
6193*/
6194
6195/*
6196 * sv_pos_b2u() uses, like sv_pos_u2b(), the mg_ptr of the potential
6197 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
6198 * byte offsets.
6199 *
6200 */
a0ed51b3 6201void
ac1e9476 6202Perl_sv_pos_b2u(pTHX_ register SV *const sv, I32 *const offsetp)
a0ed51b3 6203{
83003860 6204 const U8* s;
ec07b5e0 6205 const STRLEN byte = *offsetp;
7087a21c 6206 STRLEN len = 0; /* Actually always set, but let's keep gcc happy. */
ab455f60 6207 STRLEN blen;
ec07b5e0
NC
6208 MAGIC* mg = NULL;
6209 const U8* send;
a922f900 6210 bool found = FALSE;
a0ed51b3 6211
7918f24d
NC
6212 PERL_ARGS_ASSERT_SV_POS_B2U;
6213
a0ed51b3
LW
6214 if (!sv)
6215 return;
6216
ab455f60 6217 s = (const U8*)SvPV_const(sv, blen);
7e8c5dac 6218
ab455f60 6219 if (blen < byte)
ec07b5e0 6220 Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
7e8c5dac 6221
ec07b5e0 6222 send = s + byte;
a67d7df9 6223
ffca234a
NC
6224 if (SvMAGICAL(sv) && !SvREADONLY(sv) && PL_utf8cache
6225 && (mg = mg_find(sv, PERL_MAGIC_utf8))) {
6226 if (mg->mg_ptr) {
d4c19fe8 6227 STRLEN * const cache = (STRLEN *) mg->mg_ptr;
b9f984a5 6228 if (cache[1] == byte) {
ec07b5e0
NC
6229 /* An exact match. */
6230 *offsetp = cache[0];
ec07b5e0 6231 return;
7e8c5dac 6232 }
ab455f60
NC
6233 if (cache[3] == byte) {
6234 /* An exact match. */
6235 *offsetp = cache[2];
6236 return;
6237 }
668af93f
NC
6238
6239 if (cache[1] < byte) {
ec07b5e0 6240 /* We already know part of the way. */
b9f984a5
NC
6241 if (mg->mg_len != -1) {
6242 /* Actually, we know the end too. */
6243 len = cache[0]
6244 + S_sv_pos_b2u_midway(aTHX_ s + cache[1], send,
ab455f60 6245 s + blen, mg->mg_len - cache[0]);
b9f984a5 6246 } else {
6448472a 6247 len = cache[0] + utf8_length(s + cache[1], send);
b9f984a5 6248 }
7e8c5dac 6249 }
9f985e4c
NC
6250 else if (cache[3] < byte) {
6251 /* We're between the two cached pairs, so we do the calculation
6252 offset by the byte/utf-8 positions for the earlier pair,
6253 then add the utf-8 characters from the string start to
6254 there. */
6255 len = S_sv_pos_b2u_midway(aTHX_ s + cache[3], send,
6256 s + cache[1], cache[0] - cache[2])
6257 + cache[2];
6258
6259 }
6260 else { /* cache[3] > byte */
6261 len = S_sv_pos_b2u_midway(aTHX_ s, send, s + cache[3],
6262 cache[2]);
7e8c5dac 6263
7e8c5dac 6264 }
ec07b5e0 6265 ASSERT_UTF8_CACHE(cache);
a922f900 6266 found = TRUE;
ffca234a 6267 } else if (mg->mg_len != -1) {
ab455f60 6268 len = S_sv_pos_b2u_midway(aTHX_ s, send, s + blen, mg->mg_len);
a922f900 6269 found = TRUE;
7e8c5dac 6270 }
a0ed51b3 6271 }
a922f900 6272 if (!found || PL_utf8cache < 0) {
6448472a 6273 const STRLEN real_len = utf8_length(s, send);
a922f900
NC
6274
6275 if (found && PL_utf8cache < 0) {
6276 if (len != real_len) {
6277 /* Need to turn the assertions off otherwise we may recurse
6278 infinitely while printing error messages. */
6279 SAVEI8(PL_utf8cache);
6280 PL_utf8cache = 0;
f5992bc4
RB
6281 Perl_croak(aTHX_ "panic: sv_pos_b2u cache %"UVuf
6282 " real %"UVuf" for %"SVf,
be2597df 6283 (UV) len, (UV) real_len, SVfARG(sv));
a922f900
NC
6284 }
6285 }
6286 len = real_len;
ec07b5e0
NC
6287 }
6288 *offsetp = len;
6289
efcbbafb
NC
6290 if (PL_utf8cache)
6291 utf8_mg_pos_cache_update(sv, &mg, byte, len, blen);
a0ed51b3
LW
6292}
6293
954c1994
GS
6294/*
6295=for apidoc sv_eq
6296
6297Returns a boolean indicating whether the strings in the two SVs are
645c22ef
DM
6298identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6299coerce its args to strings if necessary.
954c1994
GS
6300
6301=cut
6302*/
6303
79072805 6304I32
e01b9e88 6305Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
79072805 6306{
97aff369 6307 dVAR;
e1ec3a88 6308 const char *pv1;
463ee0b2 6309 STRLEN cur1;
e1ec3a88 6310 const char *pv2;
463ee0b2 6311 STRLEN cur2;
e01b9e88 6312 I32 eq = 0;
bd61b366 6313 char *tpv = NULL;
a0714e2c 6314 SV* svrecode = NULL;
79072805 6315
e01b9e88 6316 if (!sv1) {
79072805
LW
6317 pv1 = "";
6318 cur1 = 0;
6319 }
ced497e2
YST
6320 else {
6321 /* if pv1 and pv2 are the same, second SvPV_const call may
6322 * invalidate pv1, so we may need to make a copy */
6323 if (sv1 == sv2 && (SvTHINKFIRST(sv1) || SvGMAGICAL(sv1))) {
6324 pv1 = SvPV_const(sv1, cur1);
59cd0e26 6325 sv1 = newSVpvn_flags(pv1, cur1, SVs_TEMP | SvUTF8(sv2));
ced497e2 6326 }
4d84ee25 6327 pv1 = SvPV_const(sv1, cur1);
ced497e2 6328 }
79072805 6329
e01b9e88
SC
6330 if (!sv2){
6331 pv2 = "";
6332 cur2 = 0;
92d29cee 6333 }
e01b9e88 6334 else
4d84ee25 6335 pv2 = SvPV_const(sv2, cur2);
79072805 6336
cf48d248 6337 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
6338 /* Differing utf8ness.
6339 * Do not UTF8size the comparands as a side-effect. */
6340 if (PL_encoding) {
6341 if (SvUTF8(sv1)) {
553e1bcc
AT
6342 svrecode = newSVpvn(pv2, cur2);
6343 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 6344 pv2 = SvPV_const(svrecode, cur2);
799ef3cb
JH
6345 }
6346 else {
553e1bcc
AT
6347 svrecode = newSVpvn(pv1, cur1);
6348 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 6349 pv1 = SvPV_const(svrecode, cur1);
799ef3cb
JH
6350 }
6351 /* Now both are in UTF-8. */
0a1bd7ac
DM
6352 if (cur1 != cur2) {
6353 SvREFCNT_dec(svrecode);
799ef3cb 6354 return FALSE;
0a1bd7ac 6355 }
799ef3cb
JH
6356 }
6357 else {
6358 bool is_utf8 = TRUE;
6359
6360 if (SvUTF8(sv1)) {
6361 /* sv1 is the UTF-8 one,
6362 * if is equal it must be downgrade-able */
9d4ba2ae 6363 char * const pv = (char*)bytes_from_utf8((const U8*)pv1,
799ef3cb
JH
6364 &cur1, &is_utf8);
6365 if (pv != pv1)
553e1bcc 6366 pv1 = tpv = pv;
799ef3cb
JH
6367 }
6368 else {
6369 /* sv2 is the UTF-8 one,
6370 * if is equal it must be downgrade-able */
9d4ba2ae 6371 char * const pv = (char *)bytes_from_utf8((const U8*)pv2,
799ef3cb
JH
6372 &cur2, &is_utf8);
6373 if (pv != pv2)
553e1bcc 6374 pv2 = tpv = pv;
799ef3cb
JH
6375 }
6376 if (is_utf8) {
6377 /* Downgrade not possible - cannot be eq */
bf694877 6378 assert (tpv == 0);
799ef3cb
JH
6379 return FALSE;
6380 }
6381 }
cf48d248
JH
6382 }
6383
6384 if (cur1 == cur2)
765f542d 6385 eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
e01b9e88 6386
b37c2d43 6387 SvREFCNT_dec(svrecode);
553e1bcc
AT
6388 if (tpv)
6389 Safefree(tpv);
cf48d248 6390
e01b9e88 6391 return eq;
79072805
LW
6392}
6393
954c1994
GS
6394/*
6395=for apidoc sv_cmp
6396
6397Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
6398string in C<sv1> is less than, equal to, or greater than the string in
645c22ef
DM
6399C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6400coerce its args to strings if necessary. See also C<sv_cmp_locale>.
954c1994
GS
6401
6402=cut
6403*/
6404
79072805 6405I32
ac1e9476 6406Perl_sv_cmp(pTHX_ register SV *const sv1, register SV *const sv2)
79072805 6407{
97aff369 6408 dVAR;
560a288e 6409 STRLEN cur1, cur2;
e1ec3a88 6410 const char *pv1, *pv2;
bd61b366 6411 char *tpv = NULL;
cf48d248 6412 I32 cmp;
a0714e2c 6413 SV *svrecode = NULL;
560a288e 6414
e01b9e88
SC
6415 if (!sv1) {
6416 pv1 = "";
560a288e
GS
6417 cur1 = 0;
6418 }
e01b9e88 6419 else
4d84ee25 6420 pv1 = SvPV_const(sv1, cur1);
560a288e 6421
553e1bcc 6422 if (!sv2) {
e01b9e88 6423 pv2 = "";
560a288e
GS
6424 cur2 = 0;
6425 }
e01b9e88 6426 else
4d84ee25 6427 pv2 = SvPV_const(sv2, cur2);
79072805 6428
cf48d248 6429 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
6430 /* Differing utf8ness.
6431 * Do not UTF8size the comparands as a side-effect. */
cf48d248 6432 if (SvUTF8(sv1)) {
799ef3cb 6433 if (PL_encoding) {
553e1bcc
AT
6434 svrecode = newSVpvn(pv2, cur2);
6435 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 6436 pv2 = SvPV_const(svrecode, cur2);
799ef3cb
JH
6437 }
6438 else {
e1ec3a88 6439 pv2 = tpv = (char*)bytes_to_utf8((const U8*)pv2, &cur2);
799ef3cb 6440 }
cf48d248
JH
6441 }
6442 else {
799ef3cb 6443 if (PL_encoding) {
553e1bcc
AT
6444 svrecode = newSVpvn(pv1, cur1);
6445 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 6446 pv1 = SvPV_const(svrecode, cur1);
799ef3cb
JH
6447 }
6448 else {
e1ec3a88 6449 pv1 = tpv = (char*)bytes_to_utf8((const U8*)pv1, &cur1);
799ef3cb 6450 }
cf48d248
JH
6451 }
6452 }
6453
e01b9e88 6454 if (!cur1) {
cf48d248 6455 cmp = cur2 ? -1 : 0;
e01b9e88 6456 } else if (!cur2) {
cf48d248
JH
6457 cmp = 1;
6458 } else {
e1ec3a88 6459 const I32 retval = memcmp((const void*)pv1, (const void*)pv2, cur1 < cur2 ? cur1 : cur2);
e01b9e88
SC
6460
6461 if (retval) {
cf48d248 6462 cmp = retval < 0 ? -1 : 1;
e01b9e88 6463 } else if (cur1 == cur2) {
cf48d248
JH
6464 cmp = 0;
6465 } else {
6466 cmp = cur1 < cur2 ? -1 : 1;
e01b9e88 6467 }
cf48d248 6468 }
16660edb 6469
b37c2d43 6470 SvREFCNT_dec(svrecode);
553e1bcc
AT
6471 if (tpv)
6472 Safefree(tpv);
cf48d248
JH
6473
6474 return cmp;
bbce6d69 6475}
16660edb 6476
c461cf8f
JH
6477/*
6478=for apidoc sv_cmp_locale
6479
645c22ef
DM
6480Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
6481'use bytes' aware, handles get magic, and will coerce its args to strings
d77cdebf 6482if necessary. See also C<sv_cmp>.
c461cf8f
JH
6483
6484=cut
6485*/
6486
bbce6d69 6487I32
ac1e9476 6488Perl_sv_cmp_locale(pTHX_ register SV *const sv1, register SV *const sv2)
bbce6d69 6489{
97aff369 6490 dVAR;
36477c24 6491#ifdef USE_LOCALE_COLLATE
16660edb 6492
bbce6d69 6493 char *pv1, *pv2;
6494 STRLEN len1, len2;
6495 I32 retval;
16660edb 6496
3280af22 6497 if (PL_collation_standard)
bbce6d69 6498 goto raw_compare;
16660edb 6499
bbce6d69 6500 len1 = 0;
8ac85365 6501 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
bbce6d69 6502 len2 = 0;
8ac85365 6503 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
16660edb 6504
bbce6d69 6505 if (!pv1 || !len1) {
6506 if (pv2 && len2)
6507 return -1;
6508 else
6509 goto raw_compare;
6510 }
6511 else {
6512 if (!pv2 || !len2)
6513 return 1;
6514 }
16660edb 6515
bbce6d69 6516 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 6517
bbce6d69 6518 if (retval)
16660edb 6519 return retval < 0 ? -1 : 1;
6520
bbce6d69 6521 /*
6522 * When the result of collation is equality, that doesn't mean
6523 * that there are no differences -- some locales exclude some
6524 * characters from consideration. So to avoid false equalities,
6525 * we use the raw string as a tiebreaker.
6526 */
16660edb 6527
bbce6d69 6528 raw_compare:
5f66b61c 6529 /*FALLTHROUGH*/
16660edb 6530
36477c24 6531#endif /* USE_LOCALE_COLLATE */
16660edb 6532
bbce6d69 6533 return sv_cmp(sv1, sv2);
6534}
79072805 6535
645c22ef 6536
36477c24 6537#ifdef USE_LOCALE_COLLATE
645c22ef 6538
7a4c00b4 6539/*
645c22ef
DM
6540=for apidoc sv_collxfrm
6541
6542Add Collate Transform magic to an SV if it doesn't already have it.
6543
6544Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
6545scalar data of the variable, but transformed to such a format that a normal
6546memory comparison can be used to compare the data according to the locale
6547settings.
6548
6549=cut
6550*/
6551
bbce6d69 6552char *
ac1e9476 6553Perl_sv_collxfrm(pTHX_ SV *const sv, STRLEN *const nxp)
bbce6d69 6554{
97aff369 6555 dVAR;
7a4c00b4 6556 MAGIC *mg;
16660edb 6557
7918f24d
NC
6558 PERL_ARGS_ASSERT_SV_COLLXFRM;
6559
14befaf4 6560 mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
3280af22 6561 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
93524f2b
NC
6562 const char *s;
6563 char *xf;
bbce6d69 6564 STRLEN len, xlen;
6565
7a4c00b4 6566 if (mg)
6567 Safefree(mg->mg_ptr);
93524f2b 6568 s = SvPV_const(sv, len);
bbce6d69 6569 if ((xf = mem_collxfrm(s, len, &xlen))) {
7a4c00b4 6570 if (! mg) {
d83f0a82
NC
6571#ifdef PERL_OLD_COPY_ON_WRITE
6572 if (SvIsCOW(sv))
6573 sv_force_normal_flags(sv, 0);
6574#endif
6575 mg = sv_magicext(sv, 0, PERL_MAGIC_collxfrm, &PL_vtbl_collxfrm,
6576 0, 0);
7a4c00b4 6577 assert(mg);
bbce6d69 6578 }
7a4c00b4 6579 mg->mg_ptr = xf;
565764a8 6580 mg->mg_len = xlen;
7a4c00b4 6581 }
6582 else {
ff0cee69 6583 if (mg) {
6584 mg->mg_ptr = NULL;
565764a8 6585 mg->mg_len = -1;
ff0cee69 6586 }
bbce6d69 6587 }
6588 }
7a4c00b4 6589 if (mg && mg->mg_ptr) {
565764a8 6590 *nxp = mg->mg_len;
3280af22 6591 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 6592 }
6593 else {
6594 *nxp = 0;
6595 return NULL;
16660edb 6596 }
79072805
LW
6597}
6598
36477c24 6599#endif /* USE_LOCALE_COLLATE */
bbce6d69 6600
c461cf8f
JH
6601/*
6602=for apidoc sv_gets
6603
6604Get a line from the filehandle and store it into the SV, optionally
6605appending to the currently-stored string.
6606
6607=cut
6608*/
6609
79072805 6610char *
ac1e9476 6611Perl_sv_gets(pTHX_ register SV *const sv, register PerlIO *const fp, I32 append)
79072805 6612{
97aff369 6613 dVAR;
e1ec3a88 6614 const char *rsptr;
c07a80fd 6615 STRLEN rslen;
6616 register STDCHAR rslast;
6617 register STDCHAR *bp;
6618 register I32 cnt;
9c5ffd7c 6619 I32 i = 0;
8bfdd7d9 6620 I32 rspara = 0;
c07a80fd 6621
7918f24d
NC
6622 PERL_ARGS_ASSERT_SV_GETS;
6623
bc44a8a2
NC
6624 if (SvTHINKFIRST(sv))
6625 sv_force_normal_flags(sv, append ? 0 : SV_COW_DROP_PV);
765f542d
NC
6626 /* XXX. If you make this PVIV, then copy on write can copy scalars read
6627 from <>.
6628 However, perlbench says it's slower, because the existing swipe code
6629 is faster than copy on write.
6630 Swings and roundabouts. */
862a34c6 6631 SvUPGRADE(sv, SVt_PV);
99491443 6632
ff68c719 6633 SvSCREAM_off(sv);
efd8b2ba
AE
6634
6635 if (append) {
6636 if (PerlIO_isutf8(fp)) {
6637 if (!SvUTF8(sv)) {
6638 sv_utf8_upgrade_nomg(sv);
6639 sv_pos_u2b(sv,&append,0);
6640 }
6641 } else if (SvUTF8(sv)) {
561b68a9 6642 SV * const tsv = newSV(0);
efd8b2ba
AE
6643 sv_gets(tsv, fp, 0);
6644 sv_utf8_upgrade_nomg(tsv);
6645 SvCUR_set(sv,append);
6646 sv_catsv(sv,tsv);
6647 sv_free(tsv);
6648 goto return_string_or_null;
6649 }
6650 }
6651
6652 SvPOK_only(sv);
6653 if (PerlIO_isutf8(fp))
6654 SvUTF8_on(sv);
c07a80fd 6655
923e4eb5 6656 if (IN_PERL_COMPILETIME) {
8bfdd7d9
HS
6657 /* we always read code in line mode */
6658 rsptr = "\n";
6659 rslen = 1;
6660 }
6661 else if (RsSNARF(PL_rs)) {
7a5fa8a2 6662 /* If it is a regular disk file use size from stat() as estimate
acbd132f
JH
6663 of amount we are going to read -- may result in mallocing
6664 more memory than we really need if the layers below reduce
6665 the size we read (e.g. CRLF or a gzip layer).
e468d35b 6666 */
e311fd51 6667 Stat_t st;
e468d35b 6668 if (!PerlLIO_fstat(PerlIO_fileno(fp), &st) && S_ISREG(st.st_mode)) {
f54cb97a 6669 const Off_t offset = PerlIO_tell(fp);
58f1856e 6670 if (offset != (Off_t) -1 && st.st_size + append > offset) {
e468d35b
NIS
6671 (void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 1));
6672 }
6673 }
c07a80fd 6674 rsptr = NULL;
6675 rslen = 0;
6676 }
3280af22 6677 else if (RsRECORD(PL_rs)) {
e311fd51 6678 I32 bytesread;
5b2b9c68 6679 char *buffer;
acbd132f 6680 U32 recsize;
048d9da8
CB
6681#ifdef VMS
6682 int fd;
6683#endif
5b2b9c68
HM
6684
6685 /* Grab the size of the record we're getting */
acbd132f 6686 recsize = SvUV(SvRV(PL_rs)); /* RsRECORD() guarantees > 0. */
e311fd51 6687 buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append;
5b2b9c68
HM
6688 /* Go yank in */
6689#ifdef VMS
6690 /* VMS wants read instead of fread, because fread doesn't respect */
6691 /* RMS record boundaries. This is not necessarily a good thing to be */
e468d35b
NIS
6692 /* doing, but we've got no other real choice - except avoid stdio
6693 as implementation - perhaps write a :vms layer ?
6694 */
048d9da8
CB
6695 fd = PerlIO_fileno(fp);
6696 if (fd == -1) { /* in-memory file from PerlIO::Scalar */
6697 bytesread = PerlIO_read(fp, buffer, recsize);
6698 }
6699 else {
6700 bytesread = PerlLIO_read(fd, buffer, recsize);
6701 }
5b2b9c68
HM
6702#else
6703 bytesread = PerlIO_read(fp, buffer, recsize);
6704#endif
27e6ca2d
AE
6705 if (bytesread < 0)
6706 bytesread = 0;
e311fd51 6707 SvCUR_set(sv, bytesread += append);
e670df4e 6708 buffer[bytesread] = '\0';
efd8b2ba 6709 goto return_string_or_null;
5b2b9c68 6710 }
3280af22 6711 else if (RsPARA(PL_rs)) {
c07a80fd 6712 rsptr = "\n\n";
6713 rslen = 2;
8bfdd7d9 6714 rspara = 1;
c07a80fd 6715 }
7d59b7e4
NIS
6716 else {
6717 /* Get $/ i.e. PL_rs into same encoding as stream wants */
6718 if (PerlIO_isutf8(fp)) {
6719 rsptr = SvPVutf8(PL_rs, rslen);
6720 }
6721 else {
6722 if (SvUTF8(PL_rs)) {
6723 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
6724 Perl_croak(aTHX_ "Wide character in $/");
6725 }
6726 }
93524f2b 6727 rsptr = SvPV_const(PL_rs, rslen);
7d59b7e4
NIS
6728 }
6729 }
6730
c07a80fd 6731 rslast = rslen ? rsptr[rslen - 1] : '\0';
6732
8bfdd7d9 6733 if (rspara) { /* have to do this both before and after */
79072805 6734 do { /* to make sure file boundaries work right */
760ac839 6735 if (PerlIO_eof(fp))
a0d0e21e 6736 return 0;
760ac839 6737 i = PerlIO_getc(fp);
79072805 6738 if (i != '\n') {
a0d0e21e
LW
6739 if (i == -1)
6740 return 0;
760ac839 6741 PerlIO_ungetc(fp,i);
79072805
LW
6742 break;
6743 }
6744 } while (i != EOF);
6745 }
c07a80fd 6746
760ac839
LW
6747 /* See if we know enough about I/O mechanism to cheat it ! */
6748
6749 /* This used to be #ifdef test - it is made run-time test for ease
1c846c1f 6750 of abstracting out stdio interface. One call should be cheap
760ac839
LW
6751 enough here - and may even be a macro allowing compile
6752 time optimization.
6753 */
6754
6755 if (PerlIO_fast_gets(fp)) {
6756
6757 /*
6758 * We're going to steal some values from the stdio struct
6759 * and put EVERYTHING in the innermost loop into registers.
6760 */
6761 register STDCHAR *ptr;
6762 STRLEN bpx;
6763 I32 shortbuffered;
6764
16660edb 6765#if defined(VMS) && defined(PERLIO_IS_STDIO)
6766 /* An ungetc()d char is handled separately from the regular
6767 * buffer, so we getc() it back out and stuff it in the buffer.
6768 */
6769 i = PerlIO_getc(fp);
6770 if (i == EOF) return 0;
6771 *(--((*fp)->_ptr)) = (unsigned char) i;
6772 (*fp)->_cnt++;
6773#endif
c07a80fd 6774
c2960299 6775 /* Here is some breathtakingly efficient cheating */
c07a80fd 6776
a20bf0c3 6777 cnt = PerlIO_get_cnt(fp); /* get count into register */
e468d35b 6778 /* make sure we have the room */
7a5fa8a2 6779 if ((I32)(SvLEN(sv) - append) <= cnt + 1) {
e468d35b 6780 /* Not room for all of it
7a5fa8a2 6781 if we are looking for a separator and room for some
e468d35b
NIS
6782 */
6783 if (rslen && cnt > 80 && (I32)SvLEN(sv) > append) {
7a5fa8a2 6784 /* just process what we have room for */
79072805
LW
6785 shortbuffered = cnt - SvLEN(sv) + append + 1;
6786 cnt -= shortbuffered;
6787 }
6788 else {
6789 shortbuffered = 0;
bbce6d69 6790 /* remember that cnt can be negative */
eb160463 6791 SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
79072805
LW
6792 }
6793 }
7a5fa8a2 6794 else
79072805 6795 shortbuffered = 0;
3f7c398e 6796 bp = (STDCHAR*)SvPVX_const(sv) + append; /* move these two too to registers */
a20bf0c3 6797 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 6798 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6799 "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
16660edb 6800 DEBUG_P(PerlIO_printf(Perl_debug_log,
ba7abf9d 6801 "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6802 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6803 PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
6804 for (;;) {
6805 screamer:
93a17b20 6806 if (cnt > 0) {
c07a80fd 6807 if (rslen) {
760ac839
LW
6808 while (cnt > 0) { /* this | eat */
6809 cnt--;
c07a80fd 6810 if ((*bp++ = *ptr++) == rslast) /* really | dust */
6811 goto thats_all_folks; /* screams | sed :-) */
6812 }
6813 }
6814 else {
1c846c1f
NIS
6815 Copy(ptr, bp, cnt, char); /* this | eat */
6816 bp += cnt; /* screams | dust */
c07a80fd 6817 ptr += cnt; /* louder | sed :-) */
a5f75d66 6818 cnt = 0;
93a17b20 6819 }
79072805
LW
6820 }
6821
748a9306 6822 if (shortbuffered) { /* oh well, must extend */
79072805
LW
6823 cnt = shortbuffered;
6824 shortbuffered = 0;
3f7c398e 6825 bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
79072805
LW
6826 SvCUR_set(sv, bpx);
6827 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
3f7c398e 6828 bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
79072805
LW
6829 continue;
6830 }
6831
16660edb 6832 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841
GS
6833 "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
6834 PTR2UV(ptr),(long)cnt));
cc00df79 6835 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
ba7abf9d 6836#if 0
16660edb 6837 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6838 "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6839 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6840 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 6841#endif
1c846c1f 6842 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b 6843 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
6844 another abstraction. */
760ac839 6845 i = PerlIO_getc(fp); /* get more characters */
ba7abf9d 6846#if 0
16660edb 6847 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6848 "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6849 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6850 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 6851#endif
a20bf0c3
JH
6852 cnt = PerlIO_get_cnt(fp);
6853 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
16660edb 6854 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6855 "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
79072805 6856
748a9306
LW
6857 if (i == EOF) /* all done for ever? */
6858 goto thats_really_all_folks;
6859
3f7c398e 6860 bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
79072805
LW
6861 SvCUR_set(sv, bpx);
6862 SvGROW(sv, bpx + cnt + 2);
3f7c398e 6863 bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
c07a80fd 6864
eb160463 6865 *bp++ = (STDCHAR)i; /* store character from PerlIO_getc */
79072805 6866
c07a80fd 6867 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
79072805 6868 goto thats_all_folks;
79072805
LW
6869 }
6870
6871thats_all_folks:
3f7c398e 6872 if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX_const(sv)) < rslen) ||
36477c24 6873 memNE((char*)bp - rslen, rsptr, rslen))
760ac839 6874 goto screamer; /* go back to the fray */
79072805
LW
6875thats_really_all_folks:
6876 if (shortbuffered)
6877 cnt += shortbuffered;
16660edb 6878 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6879 "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
cc00df79 6880 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* put these back or we're in trouble */
16660edb 6881 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6882 "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6883 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6884 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
79072805 6885 *bp = '\0';
3f7c398e 6886 SvCUR_set(sv, bp - (STDCHAR*)SvPVX_const(sv)); /* set length */
16660edb 6887 DEBUG_P(PerlIO_printf(Perl_debug_log,
fb73857a 6888 "Screamer: done, len=%ld, string=|%.*s|\n",
3f7c398e 6889 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX_const(sv)));
760ac839
LW
6890 }
6891 else
79072805 6892 {
6edd2cd5 6893 /*The big, slow, and stupid way. */
27da23d5 6894#ifdef USE_HEAP_INSTEAD_OF_STACK /* Even slower way. */
cbbf8932 6895 STDCHAR *buf = NULL;
a02a5408 6896 Newx(buf, 8192, STDCHAR);
6edd2cd5 6897 assert(buf);
4d2c4e07 6898#else
6edd2cd5 6899 STDCHAR buf[8192];
4d2c4e07 6900#endif
79072805 6901
760ac839 6902screamer2:
c07a80fd 6903 if (rslen) {
00b6aa41 6904 register const STDCHAR * const bpe = buf + sizeof(buf);
760ac839 6905 bp = buf;
eb160463 6906 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
760ac839
LW
6907 ; /* keep reading */
6908 cnt = bp - buf;
c07a80fd 6909 }
6910 else {
760ac839 6911 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
16660edb 6912 /* Accomodate broken VAXC compiler, which applies U8 cast to
6913 * both args of ?: operator, causing EOF to change into 255
6914 */
37be0adf 6915 if (cnt > 0)
cbe9e203
JH
6916 i = (U8)buf[cnt - 1];
6917 else
37be0adf 6918 i = EOF;
c07a80fd 6919 }
79072805 6920
cbe9e203
JH
6921 if (cnt < 0)
6922 cnt = 0; /* we do need to re-set the sv even when cnt <= 0 */
6923 if (append)
6924 sv_catpvn(sv, (char *) buf, cnt);
6925 else
6926 sv_setpvn(sv, (char *) buf, cnt);
c07a80fd 6927
6928 if (i != EOF && /* joy */
6929 (!rslen ||
6930 SvCUR(sv) < rslen ||
3f7c398e 6931 memNE(SvPVX_const(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
79072805
LW
6932 {
6933 append = -1;
63e4d877
CS
6934 /*
6935 * If we're reading from a TTY and we get a short read,
6936 * indicating that the user hit his EOF character, we need
6937 * to notice it now, because if we try to read from the TTY
6938 * again, the EOF condition will disappear.
6939 *
6940 * The comparison of cnt to sizeof(buf) is an optimization
6941 * that prevents unnecessary calls to feof().
6942 *
6943 * - jik 9/25/96
6944 */
bb7a0f54 6945 if (!(cnt < (I32)sizeof(buf) && PerlIO_eof(fp)))
63e4d877 6946 goto screamer2;
79072805 6947 }
6edd2cd5 6948
27da23d5 6949#ifdef USE_HEAP_INSTEAD_OF_STACK
6edd2cd5
JH
6950 Safefree(buf);
6951#endif
79072805
LW
6952 }
6953
8bfdd7d9 6954 if (rspara) { /* have to do this both before and after */
c07a80fd 6955 while (i != EOF) { /* to make sure file boundaries work right */
760ac839 6956 i = PerlIO_getc(fp);
79072805 6957 if (i != '\n') {
760ac839 6958 PerlIO_ungetc(fp,i);
79072805
LW
6959 break;
6960 }
6961 }
6962 }
c07a80fd 6963
efd8b2ba 6964return_string_or_null:
bd61b366 6965 return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
79072805
LW
6966}
6967
954c1994
GS
6968/*
6969=for apidoc sv_inc
6970
645c22ef
DM
6971Auto-increment of the value in the SV, doing string to numeric conversion
6972if necessary. Handles 'get' magic.
954c1994
GS
6973
6974=cut
6975*/
6976
79072805 6977void
ac1e9476 6978Perl_sv_inc(pTHX_ register SV *const sv)
79072805 6979{
97aff369 6980 dVAR;
79072805 6981 register char *d;
463ee0b2 6982 int flags;
79072805
LW
6983
6984 if (!sv)
6985 return;
5b295bef 6986 SvGETMAGIC(sv);
ed6116ce 6987 if (SvTHINKFIRST(sv)) {
765f542d
NC
6988 if (SvIsCOW(sv))
6989 sv_force_normal_flags(sv, 0);
0f15f207 6990 if (SvREADONLY(sv)) {
923e4eb5 6991 if (IN_PERL_RUNTIME)
cea2e8a9 6992 Perl_croak(aTHX_ PL_no_modify);
0f15f207 6993 }
a0d0e21e 6994 if (SvROK(sv)) {
b5be31e9 6995 IV i;
9e7bc3e8
JD
6996 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
6997 return;
56431972 6998 i = PTR2IV(SvRV(sv));
b5be31e9
SM
6999 sv_unref(sv);
7000 sv_setiv(sv, i);
a0d0e21e 7001 }
ed6116ce 7002 }
8990e307 7003 flags = SvFLAGS(sv);
28e5dec8
JH
7004 if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
7005 /* It's (privately or publicly) a float, but not tested as an
7006 integer, so test it to see. */
d460ef45 7007 (void) SvIV(sv);
28e5dec8
JH
7008 flags = SvFLAGS(sv);
7009 }
7010 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
7011 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 7012#ifdef PERL_PRESERVE_IVUV
28e5dec8 7013 oops_its_int:
59d8ce62 7014#endif
25da4f38
IZ
7015 if (SvIsUV(sv)) {
7016 if (SvUVX(sv) == UV_MAX)
a1e868e7 7017 sv_setnv(sv, UV_MAX_P1);
25da4f38
IZ
7018 else
7019 (void)SvIOK_only_UV(sv);
607fa7f2 7020 SvUV_set(sv, SvUVX(sv) + 1);
25da4f38
IZ
7021 } else {
7022 if (SvIVX(sv) == IV_MAX)
28e5dec8 7023 sv_setuv(sv, (UV)IV_MAX + 1);
25da4f38
IZ
7024 else {
7025 (void)SvIOK_only(sv);
45977657 7026 SvIV_set(sv, SvIVX(sv) + 1);
1c846c1f 7027 }
55497cff 7028 }
79072805
LW
7029 return;
7030 }
28e5dec8 7031 if (flags & SVp_NOK) {
b88df990 7032 const NV was = SvNVX(sv);
b68c599a
NC
7033 if (NV_OVERFLOWS_INTEGERS_AT &&
7034 was >= NV_OVERFLOWS_INTEGERS_AT && ckWARN(WARN_IMPRECISION)) {
b88df990
NC
7035 Perl_warner(aTHX_ packWARN(WARN_IMPRECISION),
7036 "Lost precision when incrementing %" NVff " by 1",
7037 was);
7038 }
28e5dec8 7039 (void)SvNOK_only(sv);
b68c599a 7040 SvNV_set(sv, was + 1.0);
28e5dec8
JH
7041 return;
7042 }
7043
3f7c398e 7044 if (!(flags & SVp_POK) || !*SvPVX_const(sv)) {
28e5dec8 7045 if ((flags & SVTYPEMASK) < SVt_PVIV)
f5282e15 7046 sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV ? SVt_PVIV : SVt_IV));
28e5dec8 7047 (void)SvIOK_only(sv);
45977657 7048 SvIV_set(sv, 1);
79072805
LW
7049 return;
7050 }
463ee0b2 7051 d = SvPVX(sv);
79072805
LW
7052 while (isALPHA(*d)) d++;
7053 while (isDIGIT(*d)) d++;
7054 if (*d) {
28e5dec8 7055#ifdef PERL_PRESERVE_IVUV
d1be9408 7056 /* Got to punt this as an integer if needs be, but we don't issue
28e5dec8
JH
7057 warnings. Probably ought to make the sv_iv_please() that does
7058 the conversion if possible, and silently. */
504618e9 7059 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
28e5dec8
JH
7060 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
7061 /* Need to try really hard to see if it's an integer.
7062 9.22337203685478e+18 is an integer.
7063 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
7064 so $a="9.22337203685478e+18"; $a+0; $a++
7065 needs to be the same as $a="9.22337203685478e+18"; $a++
7066 or we go insane. */
d460ef45 7067
28e5dec8
JH
7068 (void) sv_2iv(sv);
7069 if (SvIOK(sv))
7070 goto oops_its_int;
7071
7072 /* sv_2iv *should* have made this an NV */
7073 if (flags & SVp_NOK) {
7074 (void)SvNOK_only(sv);
9d6ce603 7075 SvNV_set(sv, SvNVX(sv) + 1.0);
28e5dec8
JH
7076 return;
7077 }
7078 /* I don't think we can get here. Maybe I should assert this
7079 And if we do get here I suspect that sv_setnv will croak. NWC
7080 Fall through. */
7081#if defined(USE_LONG_DOUBLE)
7082 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 7083 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8 7084#else
1779d84d 7085 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 7086 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8
JH
7087#endif
7088 }
7089#endif /* PERL_PRESERVE_IVUV */
3f7c398e 7090 sv_setnv(sv,Atof(SvPVX_const(sv)) + 1.0);
79072805
LW
7091 return;
7092 }
7093 d--;
3f7c398e 7094 while (d >= SvPVX_const(sv)) {
79072805
LW
7095 if (isDIGIT(*d)) {
7096 if (++*d <= '9')
7097 return;
7098 *(d--) = '0';
7099 }
7100 else {
9d116dd7
JH
7101#ifdef EBCDIC
7102 /* MKS: The original code here died if letters weren't consecutive.
7103 * at least it didn't have to worry about non-C locales. The
7104 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
1c846c1f 7105 * arranged in order (although not consecutively) and that only
9d116dd7
JH
7106 * [A-Za-z] are accepted by isALPHA in the C locale.
7107 */
7108 if (*d != 'z' && *d != 'Z') {
7109 do { ++*d; } while (!isALPHA(*d));
7110 return;
7111 }
7112 *(d--) -= 'z' - 'a';
7113#else
79072805
LW
7114 ++*d;
7115 if (isALPHA(*d))
7116 return;
7117 *(d--) -= 'z' - 'a' + 1;
9d116dd7 7118#endif
79072805
LW
7119 }
7120 }
7121 /* oh,oh, the number grew */
7122 SvGROW(sv, SvCUR(sv) + 2);
b162af07 7123 SvCUR_set(sv, SvCUR(sv) + 1);
3f7c398e 7124 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX_const(sv); d--)
79072805
LW
7125 *d = d[-1];
7126 if (isDIGIT(d[1]))
7127 *d = '1';
7128 else
7129 *d = d[1];
7130}
7131
954c1994
GS
7132/*
7133=for apidoc sv_dec
7134
645c22ef
DM
7135Auto-decrement of the value in the SV, doing string to numeric conversion
7136if necessary. Handles 'get' magic.
954c1994
GS
7137
7138=cut
7139*/
7140
79072805 7141void
ac1e9476 7142Perl_sv_dec(pTHX_ register SV *const sv)
79072805 7143{
97aff369 7144 dVAR;
463ee0b2
LW
7145 int flags;
7146
79072805
LW
7147 if (!sv)
7148 return;
5b295bef 7149 SvGETMAGIC(sv);
ed6116ce 7150 if (SvTHINKFIRST(sv)) {
765f542d
NC
7151 if (SvIsCOW(sv))
7152 sv_force_normal_flags(sv, 0);
0f15f207 7153 if (SvREADONLY(sv)) {
923e4eb5 7154 if (IN_PERL_RUNTIME)
cea2e8a9 7155 Perl_croak(aTHX_ PL_no_modify);
0f15f207 7156 }
a0d0e21e 7157 if (SvROK(sv)) {
b5be31e9 7158 IV i;
9e7bc3e8
JD
7159 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
7160 return;
56431972 7161 i = PTR2IV(SvRV(sv));
b5be31e9
SM
7162 sv_unref(sv);
7163 sv_setiv(sv, i);
a0d0e21e 7164 }
ed6116ce 7165 }
28e5dec8
JH
7166 /* Unlike sv_inc we don't have to worry about string-never-numbers
7167 and keeping them magic. But we mustn't warn on punting */
8990e307 7168 flags = SvFLAGS(sv);
28e5dec8
JH
7169 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
7170 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 7171#ifdef PERL_PRESERVE_IVUV
28e5dec8 7172 oops_its_int:
59d8ce62 7173#endif
25da4f38
IZ
7174 if (SvIsUV(sv)) {
7175 if (SvUVX(sv) == 0) {
7176 (void)SvIOK_only(sv);
45977657 7177 SvIV_set(sv, -1);
25da4f38
IZ
7178 }
7179 else {
7180 (void)SvIOK_only_UV(sv);
f4eee32f 7181 SvUV_set(sv, SvUVX(sv) - 1);
1c846c1f 7182 }
25da4f38 7183 } else {
b88df990
NC
7184 if (SvIVX(sv) == IV_MIN) {
7185 sv_setnv(sv, (NV)IV_MIN);
7186 goto oops_its_num;
7187 }
25da4f38
IZ
7188 else {
7189 (void)SvIOK_only(sv);
45977657 7190 SvIV_set(sv, SvIVX(sv) - 1);
1c846c1f 7191 }
55497cff 7192 }
7193 return;
7194 }
28e5dec8 7195 if (flags & SVp_NOK) {
b88df990
NC
7196 oops_its_num:
7197 {
7198 const NV was = SvNVX(sv);
b68c599a
NC
7199 if (NV_OVERFLOWS_INTEGERS_AT &&
7200 was <= -NV_OVERFLOWS_INTEGERS_AT && ckWARN(WARN_IMPRECISION)) {
b88df990
NC
7201 Perl_warner(aTHX_ packWARN(WARN_IMPRECISION),
7202 "Lost precision when decrementing %" NVff " by 1",
7203 was);
7204 }
7205 (void)SvNOK_only(sv);
b68c599a 7206 SvNV_set(sv, was - 1.0);
b88df990
NC
7207 return;
7208 }
28e5dec8 7209 }
8990e307 7210 if (!(flags & SVp_POK)) {
ef088171
NC
7211 if ((flags & SVTYPEMASK) < SVt_PVIV)
7212 sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV) ? SVt_PVIV : SVt_IV);
7213 SvIV_set(sv, -1);
7214 (void)SvIOK_only(sv);
79072805
LW
7215 return;
7216 }
28e5dec8
JH
7217#ifdef PERL_PRESERVE_IVUV
7218 {
504618e9 7219 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
28e5dec8
JH
7220 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
7221 /* Need to try really hard to see if it's an integer.
7222 9.22337203685478e+18 is an integer.
7223 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
7224 so $a="9.22337203685478e+18"; $a+0; $a--
7225 needs to be the same as $a="9.22337203685478e+18"; $a--
7226 or we go insane. */
d460ef45 7227
28e5dec8
JH
7228 (void) sv_2iv(sv);
7229 if (SvIOK(sv))
7230 goto oops_its_int;
7231
7232 /* sv_2iv *should* have made this an NV */
7233 if (flags & SVp_NOK) {
7234 (void)SvNOK_only(sv);
9d6ce603 7235 SvNV_set(sv, SvNVX(sv) - 1.0);
28e5dec8
JH
7236 return;
7237 }
7238 /* I don't think we can get here. Maybe I should assert this
7239 And if we do get here I suspect that sv_setnv will croak. NWC
7240 Fall through. */
7241#if defined(USE_LONG_DOUBLE)
7242 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 7243 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8 7244#else
1779d84d 7245 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 7246 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8
JH
7247#endif
7248 }
7249 }
7250#endif /* PERL_PRESERVE_IVUV */
3f7c398e 7251 sv_setnv(sv,Atof(SvPVX_const(sv)) - 1.0); /* punt */
79072805
LW
7252}
7253
954c1994
GS
7254/*
7255=for apidoc sv_mortalcopy
7256
645c22ef 7257Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
d4236ebc
DM
7258The new SV is marked as mortal. It will be destroyed "soon", either by an
7259explicit call to FREETMPS, or by an implicit call at places such as
7260statement boundaries. See also C<sv_newmortal> and C<sv_2mortal>.
954c1994
GS
7261
7262=cut
7263*/
7264
79072805
LW
7265/* Make a string that will exist for the duration of the expression
7266 * evaluation. Actually, it may have to last longer than that, but
7267 * hopefully we won't free it until it has been assigned to a
7268 * permanent location. */
7269
7270SV *
ac1e9476 7271Perl_sv_mortalcopy(pTHX_ SV *const oldstr)
79072805 7272{
97aff369 7273 dVAR;
463ee0b2 7274 register SV *sv;
b881518d 7275
4561caa4 7276 new_SV(sv);
79072805 7277 sv_setsv(sv,oldstr);
677b06e3
GS
7278 EXTEND_MORTAL(1);
7279 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307
LW
7280 SvTEMP_on(sv);
7281 return sv;
7282}
7283
954c1994
GS
7284/*
7285=for apidoc sv_newmortal
7286
645c22ef 7287Creates a new null SV which is mortal. The reference count of the SV is
d4236ebc
DM
7288set to 1. It will be destroyed "soon", either by an explicit call to
7289FREETMPS, or by an implicit call at places such as statement boundaries.
7290See also C<sv_mortalcopy> and C<sv_2mortal>.
954c1994
GS
7291
7292=cut
7293*/
7294
8990e307 7295SV *
864dbfa3 7296Perl_sv_newmortal(pTHX)
8990e307 7297{
97aff369 7298 dVAR;
8990e307
LW
7299 register SV *sv;
7300
4561caa4 7301 new_SV(sv);
8990e307 7302 SvFLAGS(sv) = SVs_TEMP;
677b06e3
GS
7303 EXTEND_MORTAL(1);
7304 PL_tmps_stack[++PL_tmps_ix] = sv;
79072805
LW
7305 return sv;
7306}
7307
59cd0e26
NC
7308
7309/*
7310=for apidoc newSVpvn_flags
7311
7312Creates a new SV and copies a string into it. The reference count for the
7313SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
7314string. You are responsible for ensuring that the source string is at least
7315C<len> bytes long. If the C<s> argument is NULL the new SV will be undefined.
7316Currently the only flag bits accepted are C<SVf_UTF8> and C<SVs_TEMP>.
7317If C<SVs_TEMP> is set, then C<sv2mortal()> is called on the result before
7318returning. If C<SVf_UTF8> is set, then it will be set on the new SV.
7319C<newSVpvn_utf8()> is a convenience wrapper for this function, defined as
7320
7321 #define newSVpvn_utf8(s, len, u) \
7322 newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0)
7323
7324=cut
7325*/
7326
7327SV *
23f13727 7328Perl_newSVpvn_flags(pTHX_ const char *const s, const STRLEN len, const U32 flags)
59cd0e26
NC
7329{
7330 dVAR;
7331 register SV *sv;
7332
7333 /* All the flags we don't support must be zero.
7334 And we're new code so I'm going to assert this from the start. */
7335 assert(!(flags & ~(SVf_UTF8|SVs_TEMP)));
7336 new_SV(sv);
7337 sv_setpvn(sv,s,len);
7338 SvFLAGS(sv) |= (flags & SVf_UTF8);
7339 return (flags & SVs_TEMP) ? sv_2mortal(sv) : sv;
7340}
7341
954c1994
GS
7342/*
7343=for apidoc sv_2mortal
7344
d4236ebc
DM
7345Marks an existing SV as mortal. The SV will be destroyed "soon", either
7346by an explicit call to FREETMPS, or by an implicit call at places such as
37d2ac18
NC
7347statement boundaries. SvTEMP() is turned on which means that the SV's
7348string buffer can be "stolen" if this SV is copied. See also C<sv_newmortal>
7349and C<sv_mortalcopy>.
954c1994
GS
7350
7351=cut
7352*/
7353
79072805 7354SV *
23f13727 7355Perl_sv_2mortal(pTHX_ register SV *const sv)
79072805 7356{
27da23d5 7357 dVAR;
79072805 7358 if (!sv)
7a5b473e 7359 return NULL;
d689ffdd 7360 if (SvREADONLY(sv) && SvIMMORTAL(sv))
11162842 7361 return sv;
677b06e3
GS
7362 EXTEND_MORTAL(1);
7363 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307 7364 SvTEMP_on(sv);
79072805
LW
7365 return sv;
7366}
7367
954c1994
GS
7368/*
7369=for apidoc newSVpv
7370
7371Creates a new SV and copies a string into it. The reference count for the
7372SV is set to 1. If C<len> is zero, Perl will compute the length using
7373strlen(). For efficiency, consider using C<newSVpvn> instead.
7374
7375=cut
7376*/
7377
79072805 7378SV *
23f13727 7379Perl_newSVpv(pTHX_ const char *const s, const STRLEN len)
79072805 7380{
97aff369 7381 dVAR;
463ee0b2 7382 register SV *sv;
79072805 7383
4561caa4 7384 new_SV(sv);
ddfa59c7 7385 sv_setpvn(sv, s, len || s == NULL ? len : strlen(s));
79072805
LW
7386 return sv;
7387}
7388
954c1994
GS
7389/*
7390=for apidoc newSVpvn
7391
7392Creates a new SV and copies a string into it. The reference count for the
1c846c1f 7393SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
954c1994 7394string. You are responsible for ensuring that the source string is at least
9e09f5f2 7395C<len> bytes long. If the C<s> argument is NULL the new SV will be undefined.
954c1994
GS
7396
7397=cut
7398*/
7399
9da1e3b5 7400SV *
23f13727 7401Perl_newSVpvn(pTHX_ const char *const s, const STRLEN len)
9da1e3b5 7402{
97aff369 7403 dVAR;
9da1e3b5
MUN
7404 register SV *sv;
7405
7406 new_SV(sv);
9da1e3b5
MUN
7407 sv_setpvn(sv,s,len);
7408 return sv;
7409}
7410
740cce10 7411/*
926f8064 7412=for apidoc newSVhek
bd08039b
NC
7413
7414Creates a new SV from the hash key structure. It will generate scalars that
5aaec2b4
NC
7415point to the shared string table where possible. Returns a new (undefined)
7416SV if the hek is NULL.
bd08039b
NC
7417
7418=cut
7419*/
7420
7421SV *
23f13727 7422Perl_newSVhek(pTHX_ const HEK *const hek)
bd08039b 7423{
97aff369 7424 dVAR;
5aaec2b4
NC
7425 if (!hek) {
7426 SV *sv;
7427
7428 new_SV(sv);
7429 return sv;
7430 }
7431
bd08039b
NC
7432 if (HEK_LEN(hek) == HEf_SVKEY) {
7433 return newSVsv(*(SV**)HEK_KEY(hek));
7434 } else {
7435 const int flags = HEK_FLAGS(hek);
7436 if (flags & HVhek_WASUTF8) {
7437 /* Trouble :-)
7438 Andreas would like keys he put in as utf8 to come back as utf8
7439 */
7440 STRLEN utf8_len = HEK_LEN(hek);
b64e5050
AL
7441 const U8 *as_utf8 = bytes_to_utf8 ((U8*)HEK_KEY(hek), &utf8_len);
7442 SV * const sv = newSVpvn ((const char*)as_utf8, utf8_len);
bd08039b
NC
7443
7444 SvUTF8_on (sv);
7445 Safefree (as_utf8); /* bytes_to_utf8() allocates a new string */
7446 return sv;
45e34800 7447 } else if (flags & (HVhek_REHASH|HVhek_UNSHARED)) {
bd08039b
NC
7448 /* We don't have a pointer to the hv, so we have to replicate the
7449 flag into every HEK. This hv is using custom a hasing
7450 algorithm. Hence we can't return a shared string scalar, as
7451 that would contain the (wrong) hash value, and might get passed
45e34800
NC
7452 into an hv routine with a regular hash.
7453 Similarly, a hash that isn't using shared hash keys has to have
7454 the flag in every key so that we know not to try to call
7455 share_hek_kek on it. */
bd08039b 7456
b64e5050 7457 SV * const sv = newSVpvn (HEK_KEY(hek), HEK_LEN(hek));
bd08039b
NC
7458 if (HEK_UTF8(hek))
7459 SvUTF8_on (sv);
7460 return sv;
7461 }
7462 /* This will be overwhelminly the most common case. */
409dfe77
NC
7463 {
7464 /* Inline most of newSVpvn_share(), because share_hek_hek() is far
7465 more efficient than sharepvn(). */
7466 SV *sv;
7467
7468 new_SV(sv);
7469 sv_upgrade(sv, SVt_PV);
7470 SvPV_set(sv, (char *)HEK_KEY(share_hek_hek(hek)));
7471 SvCUR_set(sv, HEK_LEN(hek));
7472 SvLEN_set(sv, 0);
7473 SvREADONLY_on(sv);
7474 SvFAKE_on(sv);
7475 SvPOK_on(sv);
7476 if (HEK_UTF8(hek))
7477 SvUTF8_on(sv);
7478 return sv;
7479 }
bd08039b
NC
7480 }
7481}
7482
1c846c1f
NIS
7483/*
7484=for apidoc newSVpvn_share
7485
3f7c398e 7486Creates a new SV with its SvPVX_const pointing to a shared string in the string
645c22ef 7487table. If the string does not already exist in the table, it is created
758fcfc1
VP
7488first. Turns on READONLY and FAKE. If the C<hash> parameter is non-zero, that
7489value is used; otherwise the hash is computed. The string's hash can be later
7490be retrieved from the SV with the C<SvSHARED_HASH()> macro. The idea here is
7491that as the string table is used for shared hash keys these strings will have
7492SvPVX_const == HeKEY and hash lookup will avoid string compare.
1c846c1f
NIS
7493
7494=cut
7495*/
7496
7497SV *
c3654f1a 7498Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
1c846c1f 7499{
97aff369 7500 dVAR;
1c846c1f 7501 register SV *sv;
c3654f1a 7502 bool is_utf8 = FALSE;
a51caccf
NC
7503 const char *const orig_src = src;
7504
c3654f1a 7505 if (len < 0) {
77caf834 7506 STRLEN tmplen = -len;
c3654f1a 7507 is_utf8 = TRUE;
75a54232 7508 /* See the note in hv.c:hv_fetch() --jhi */
e1ec3a88 7509 src = (char*)bytes_from_utf8((const U8*)src, &tmplen, &is_utf8);
75a54232
JH
7510 len = tmplen;
7511 }
1c846c1f 7512 if (!hash)
5afd6d42 7513 PERL_HASH(hash, src, len);
1c846c1f 7514 new_SV(sv);
f46ee248
NC
7515 /* The logic for this is inlined in S_mro_get_linear_isa_dfs(), so if it
7516 changes here, update it there too. */
bdd68bc3 7517 sv_upgrade(sv, SVt_PV);
f880fe2f 7518 SvPV_set(sv, sharepvn(src, is_utf8?-len:len, hash));
b162af07 7519 SvCUR_set(sv, len);
b162af07 7520 SvLEN_set(sv, 0);
1c846c1f
NIS
7521 SvREADONLY_on(sv);
7522 SvFAKE_on(sv);
7523 SvPOK_on(sv);
c3654f1a
IH
7524 if (is_utf8)
7525 SvUTF8_on(sv);
a51caccf
NC
7526 if (src != orig_src)
7527 Safefree(src);
1c846c1f
NIS
7528 return sv;
7529}
7530
645c22ef 7531
cea2e8a9 7532#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7533
7534/* pTHX_ magic can't cope with varargs, so this is a no-context
7535 * version of the main function, (which may itself be aliased to us).
7536 * Don't access this version directly.
7537 */
7538
46fc3d4c 7539SV *
23f13727 7540Perl_newSVpvf_nocontext(const char *const pat, ...)
46fc3d4c 7541{
cea2e8a9 7542 dTHX;
46fc3d4c 7543 register SV *sv;
7544 va_list args;
7918f24d
NC
7545
7546 PERL_ARGS_ASSERT_NEWSVPVF_NOCONTEXT;
7547
46fc3d4c 7548 va_start(args, pat);
c5be433b 7549 sv = vnewSVpvf(pat, &args);
46fc3d4c 7550 va_end(args);
7551 return sv;
7552}
cea2e8a9 7553#endif
46fc3d4c 7554
954c1994
GS
7555/*
7556=for apidoc newSVpvf
7557
645c22ef 7558Creates a new SV and initializes it with the string formatted like
954c1994
GS
7559C<sprintf>.
7560
7561=cut
7562*/
7563
cea2e8a9 7564SV *
23f13727 7565Perl_newSVpvf(pTHX_ const char *const pat, ...)
cea2e8a9
GS
7566{
7567 register SV *sv;
7568 va_list args;
7918f24d
NC
7569
7570 PERL_ARGS_ASSERT_NEWSVPVF;
7571
cea2e8a9 7572 va_start(args, pat);
c5be433b 7573 sv = vnewSVpvf(pat, &args);
cea2e8a9
GS
7574 va_end(args);
7575 return sv;
7576}
46fc3d4c 7577
645c22ef
DM
7578/* backend for newSVpvf() and newSVpvf_nocontext() */
7579
79072805 7580SV *
23f13727 7581Perl_vnewSVpvf(pTHX_ const char *const pat, va_list *const args)
c5be433b 7582{
97aff369 7583 dVAR;
c5be433b 7584 register SV *sv;
7918f24d
NC
7585
7586 PERL_ARGS_ASSERT_VNEWSVPVF;
7587
c5be433b 7588 new_SV(sv);
4608196e 7589 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
c5be433b
GS
7590 return sv;
7591}
7592
954c1994
GS
7593/*
7594=for apidoc newSVnv
7595
7596Creates a new SV and copies a floating point value into it.
7597The reference count for the SV is set to 1.
7598
7599=cut
7600*/
7601
c5be433b 7602SV *
23f13727 7603Perl_newSVnv(pTHX_ const NV n)
79072805 7604{
97aff369 7605 dVAR;
463ee0b2 7606 register SV *sv;
79072805 7607
4561caa4 7608 new_SV(sv);
79072805
LW
7609 sv_setnv(sv,n);
7610 return sv;
7611}
7612
954c1994
GS
7613/*
7614=for apidoc newSViv
7615
7616Creates a new SV and copies an integer into it. The reference count for the
7617SV is set to 1.
7618
7619=cut
7620*/
7621
79072805 7622SV *
23f13727 7623Perl_newSViv(pTHX_ const IV i)
79072805 7624{
97aff369 7625 dVAR;
463ee0b2 7626 register SV *sv;
79072805 7627
4561caa4 7628 new_SV(sv);
79072805
LW
7629 sv_setiv(sv,i);
7630 return sv;
7631}
7632
954c1994 7633/*
1a3327fb
JH
7634=for apidoc newSVuv
7635
7636Creates a new SV and copies an unsigned integer into it.
7637The reference count for the SV is set to 1.
7638
7639=cut
7640*/
7641
7642SV *
23f13727 7643Perl_newSVuv(pTHX_ const UV u)
1a3327fb 7644{
97aff369 7645 dVAR;
1a3327fb
JH
7646 register SV *sv;
7647
7648 new_SV(sv);
7649 sv_setuv(sv,u);
7650 return sv;
7651}
7652
7653/*
b9f83d2f
NC
7654=for apidoc newSV_type
7655
c41f7ed2 7656Creates a new SV, of the type specified. The reference count for the new SV
b9f83d2f
NC
7657is set to 1.
7658
7659=cut
7660*/
7661
7662SV *
fe9845cc 7663Perl_newSV_type(pTHX_ const svtype type)
b9f83d2f
NC
7664{
7665 register SV *sv;
7666
7667 new_SV(sv);
7668 sv_upgrade(sv, type);
7669 return sv;
7670}
7671
7672/*
954c1994
GS
7673=for apidoc newRV_noinc
7674
7675Creates an RV wrapper for an SV. The reference count for the original
7676SV is B<not> incremented.
7677
7678=cut
7679*/
7680
2304df62 7681SV *
23f13727 7682Perl_newRV_noinc(pTHX_ SV *const tmpRef)
2304df62 7683{
97aff369 7684 dVAR;
4df7f6af 7685 register SV *sv = newSV_type(SVt_IV);
7918f24d
NC
7686
7687 PERL_ARGS_ASSERT_NEWRV_NOINC;
7688
76e3520e 7689 SvTEMP_off(tmpRef);
b162af07 7690 SvRV_set(sv, tmpRef);
2304df62 7691 SvROK_on(sv);
2304df62
AD
7692 return sv;
7693}
7694
ff276b08 7695/* newRV_inc is the official function name to use now.
645c22ef
DM
7696 * newRV_inc is in fact #defined to newRV in sv.h
7697 */
7698
5f05dabc 7699SV *
23f13727 7700Perl_newRV(pTHX_ SV *const sv)
5f05dabc 7701{
97aff369 7702 dVAR;
7918f24d
NC
7703
7704 PERL_ARGS_ASSERT_NEWRV;
7705
7f466ec7 7706 return newRV_noinc(SvREFCNT_inc_simple_NN(sv));
5f05dabc 7707}
5f05dabc 7708
954c1994
GS
7709/*
7710=for apidoc newSVsv
7711
7712Creates a new SV which is an exact duplicate of the original SV.
645c22ef 7713(Uses C<sv_setsv>).
954c1994
GS
7714
7715=cut
7716*/
7717
79072805 7718SV *
23f13727 7719Perl_newSVsv(pTHX_ register SV *const old)
79072805 7720{
97aff369 7721 dVAR;
463ee0b2 7722 register SV *sv;
79072805
LW
7723
7724 if (!old)
7a5b473e 7725 return NULL;
8990e307 7726 if (SvTYPE(old) == SVTYPEMASK) {
0453d815 7727 if (ckWARN_d(WARN_INTERNAL))
9014280d 7728 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
a0714e2c 7729 return NULL;
79072805 7730 }
4561caa4 7731 new_SV(sv);
e90aabeb
NC
7732 /* SV_GMAGIC is the default for sv_setv()
7733 SV_NOSTEAL prevents TEMP buffers being, well, stolen, and saves games
7734 with SvTEMP_off and SvTEMP_on round a call to sv_setsv. */
7735 sv_setsv_flags(sv, old, SV_GMAGIC | SV_NOSTEAL);
463ee0b2 7736 return sv;
79072805
LW
7737}
7738
645c22ef
DM
7739/*
7740=for apidoc sv_reset
7741
7742Underlying implementation for the C<reset> Perl function.
7743Note that the perl-level function is vaguely deprecated.
7744
7745=cut
7746*/
7747
79072805 7748void
23f13727 7749Perl_sv_reset(pTHX_ register const char *s, HV *const stash)
79072805 7750{
27da23d5 7751 dVAR;
4802d5d7 7752 char todo[PERL_UCHAR_MAX+1];
79072805 7753
7918f24d
NC
7754 PERL_ARGS_ASSERT_SV_RESET;
7755
49d8d3a1
MB
7756 if (!stash)
7757 return;
7758
79072805 7759 if (!*s) { /* reset ?? searches */
aec46f14 7760 MAGIC * const mg = mg_find((SV *)stash, PERL_MAGIC_symtab);
8d2f4536 7761 if (mg) {
c2b1997a
NC
7762 const U32 count = mg->mg_len / sizeof(PMOP**);
7763 PMOP **pmp = (PMOP**) mg->mg_ptr;
7764 PMOP *const *const end = pmp + count;
7765
7766 while (pmp < end) {
c737faaf 7767#ifdef USE_ITHREADS
c2b1997a 7768 SvREADONLY_off(PL_regex_pad[(*pmp)->op_pmoffset]);
c737faaf 7769#else
c2b1997a 7770 (*pmp)->op_pmflags &= ~PMf_USED;
c737faaf 7771#endif
c2b1997a 7772 ++pmp;
8d2f4536 7773 }
79072805
LW
7774 }
7775 return;
7776 }
7777
7778 /* reset variables */
7779
7780 if (!HvARRAY(stash))
7781 return;
463ee0b2
LW
7782
7783 Zero(todo, 256, char);
79072805 7784 while (*s) {
b464bac0
AL
7785 I32 max;
7786 I32 i = (unsigned char)*s;
79072805
LW
7787 if (s[1] == '-') {
7788 s += 2;
7789 }
4802d5d7 7790 max = (unsigned char)*s++;
79072805 7791 for ( ; i <= max; i++) {
463ee0b2
LW
7792 todo[i] = 1;
7793 }
a0d0e21e 7794 for (i = 0; i <= (I32) HvMAX(stash); i++) {
b464bac0 7795 HE *entry;
79072805 7796 for (entry = HvARRAY(stash)[i];
9e35f4b3
GS
7797 entry;
7798 entry = HeNEXT(entry))
7799 {
b464bac0
AL
7800 register GV *gv;
7801 register SV *sv;
7802
1edc1566 7803 if (!todo[(U8)*HeKEY(entry)])
463ee0b2 7804 continue;
1edc1566 7805 gv = (GV*)HeVAL(entry);
79072805 7806 sv = GvSV(gv);
e203899d
NC
7807 if (sv) {
7808 if (SvTHINKFIRST(sv)) {
7809 if (!SvREADONLY(sv) && SvROK(sv))
7810 sv_unref(sv);
7811 /* XXX Is this continue a bug? Why should THINKFIRST
7812 exempt us from resetting arrays and hashes? */
7813 continue;
7814 }
7815 SvOK_off(sv);
7816 if (SvTYPE(sv) >= SVt_PV) {
7817 SvCUR_set(sv, 0);
bd61b366 7818 if (SvPVX_const(sv) != NULL)
e203899d
NC
7819 *SvPVX(sv) = '\0';
7820 SvTAINT(sv);
7821 }
79072805
LW
7822 }
7823 if (GvAV(gv)) {
7824 av_clear(GvAV(gv));
7825 }
bfcb3514 7826 if (GvHV(gv) && !HvNAME_get(GvHV(gv))) {
b0269e46
AB
7827#if defined(VMS)
7828 Perl_die(aTHX_ "Can't reset %%ENV on this system");
7829#else /* ! VMS */
463ee0b2 7830 hv_clear(GvHV(gv));
b0269e46
AB
7831# if defined(USE_ENVIRON_ARRAY)
7832 if (gv == PL_envgv)
7833 my_clearenv();
7834# endif /* USE_ENVIRON_ARRAY */
7835#endif /* VMS */
79072805
LW
7836 }
7837 }
7838 }
7839 }
7840}
7841
645c22ef
DM
7842/*
7843=for apidoc sv_2io
7844
7845Using various gambits, try to get an IO from an SV: the IO slot if its a
7846GV; or the recursive result if we're an RV; or the IO slot of the symbol
7847named after the PV if we're a string.
7848
7849=cut
7850*/
7851
46fc3d4c 7852IO*
23f13727 7853Perl_sv_2io(pTHX_ SV *const sv)
46fc3d4c 7854{
7855 IO* io;
7856 GV* gv;
7857
7918f24d
NC
7858 PERL_ARGS_ASSERT_SV_2IO;
7859
46fc3d4c 7860 switch (SvTYPE(sv)) {
7861 case SVt_PVIO:
7862 io = (IO*)sv;
7863 break;
7864 case SVt_PVGV:
6e592b3a
BM
7865 if (isGV_with_GP(sv)) {
7866 gv = (GV*)sv;
7867 io = GvIO(gv);
7868 if (!io)
7869 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
7870 break;
7871 }
7872 /* FALL THROUGH */
46fc3d4c 7873 default:
7874 if (!SvOK(sv))
cea2e8a9 7875 Perl_croak(aTHX_ PL_no_usym, "filehandle");
46fc3d4c 7876 if (SvROK(sv))
7877 return sv_2io(SvRV(sv));
f776e3cd 7878 gv = gv_fetchsv(sv, 0, SVt_PVIO);
46fc3d4c 7879 if (gv)
7880 io = GvIO(gv);
7881 else
7882 io = 0;
7883 if (!io)
be2597df 7884 Perl_croak(aTHX_ "Bad filehandle: %"SVf, SVfARG(sv));
46fc3d4c 7885 break;
7886 }
7887 return io;
7888}
7889
645c22ef
DM
7890/*
7891=for apidoc sv_2cv
7892
7893Using various gambits, try to get a CV from an SV; in addition, try if
7894possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
f2c0649b 7895The flags in C<lref> are passed to sv_fetchsv.
645c22ef
DM
7896
7897=cut
7898*/
7899
79072805 7900CV *
23f13727 7901Perl_sv_2cv(pTHX_ SV *sv, HV **const st, GV **const gvp, const I32 lref)
79072805 7902{
27da23d5 7903 dVAR;
a0714e2c 7904 GV *gv = NULL;
601f1833 7905 CV *cv = NULL;
79072805 7906
7918f24d
NC
7907 PERL_ARGS_ASSERT_SV_2CV;
7908
85dec29a
NC
7909 if (!sv) {
7910 *st = NULL;
7911 *gvp = NULL;
7912 return NULL;
7913 }
79072805 7914 switch (SvTYPE(sv)) {
79072805
LW
7915 case SVt_PVCV:
7916 *st = CvSTASH(sv);
a0714e2c 7917 *gvp = NULL;
79072805
LW
7918 return (CV*)sv;
7919 case SVt_PVHV:
7920 case SVt_PVAV:
ef58ba18 7921 *st = NULL;
a0714e2c 7922 *gvp = NULL;
601f1833 7923 return NULL;
8990e307 7924 case SVt_PVGV:
6e592b3a
BM
7925 if (isGV_with_GP(sv)) {
7926 gv = (GV*)sv;
7927 *gvp = gv;
7928 *st = GvESTASH(gv);
7929 goto fix_gv;
7930 }
7931 /* FALL THROUGH */
8990e307 7932
79072805 7933 default:
a0d0e21e 7934 if (SvROK(sv)) {
823a54a3 7935 SV * const *sp = &sv; /* Used in tryAMAGICunDEREF macro. */
c4f3bd1e 7936 SvGETMAGIC(sv);
f5284f61
IZ
7937 tryAMAGICunDEREF(to_cv);
7938
62f274bf
GS
7939 sv = SvRV(sv);
7940 if (SvTYPE(sv) == SVt_PVCV) {
7941 cv = (CV*)sv;
a0714e2c 7942 *gvp = NULL;
62f274bf
GS
7943 *st = CvSTASH(cv);
7944 return cv;
7945 }
6e592b3a 7946 else if(isGV_with_GP(sv))
62f274bf
GS
7947 gv = (GV*)sv;
7948 else
cea2e8a9 7949 Perl_croak(aTHX_ "Not a subroutine reference");
a0d0e21e 7950 }
6e592b3a 7951 else if (isGV_with_GP(sv)) {
9d0f7ed7 7952 SvGETMAGIC(sv);
79072805 7953 gv = (GV*)sv;
9d0f7ed7 7954 }
79072805 7955 else
9d0f7ed7 7956 gv = gv_fetchsv(sv, lref, SVt_PVCV); /* Calls get magic */
79072805 7957 *gvp = gv;
ef58ba18
NC
7958 if (!gv) {
7959 *st = NULL;
601f1833 7960 return NULL;
ef58ba18 7961 }
e26df76a 7962 /* Some flags to gv_fetchsv mean don't really create the GV */
6e592b3a 7963 if (!isGV_with_GP(gv)) {
e26df76a
NC
7964 *st = NULL;
7965 return NULL;
7966 }
79072805 7967 *st = GvESTASH(gv);
8990e307 7968 fix_gv:
8ebc5c01 7969 if (lref && !GvCVu(gv)) {
4633a7c4 7970 SV *tmpsv;
748a9306 7971 ENTER;
561b68a9 7972 tmpsv = newSV(0);
bd61b366 7973 gv_efullname3(tmpsv, gv, NULL);
f6ec51f7
GS
7974 /* XXX this is probably not what they think they're getting.
7975 * It has the same effect as "sub name;", i.e. just a forward
7976 * declaration! */
774d564b 7977 newSUB(start_subparse(FALSE, 0),
4633a7c4 7978 newSVOP(OP_CONST, 0, tmpsv),
5f66b61c 7979 NULL, NULL);
748a9306 7980 LEAVE;
8ebc5c01 7981 if (!GvCVu(gv))
35c1215d 7982 Perl_croak(aTHX_ "Unable to create sub named \"%"SVf"\"",
4052d21c 7983 SVfARG(SvOK(sv) ? sv : &PL_sv_no));
8990e307 7984 }
8ebc5c01 7985 return GvCVu(gv);
79072805
LW
7986 }
7987}
7988
c461cf8f
JH
7989/*
7990=for apidoc sv_true
7991
7992Returns true if the SV has a true value by Perl's rules.
645c22ef
DM
7993Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
7994instead use an in-line version.
c461cf8f
JH
7995
7996=cut
7997*/
7998
79072805 7999I32
23f13727 8000Perl_sv_true(pTHX_ register SV *const sv)
79072805 8001{
8990e307
LW
8002 if (!sv)
8003 return 0;
79072805 8004 if (SvPOK(sv)) {
823a54a3
AL
8005 register const XPV* const tXpv = (XPV*)SvANY(sv);
8006 if (tXpv &&
c2f1de04 8007 (tXpv->xpv_cur > 1 ||
339049b0 8008 (tXpv->xpv_cur && *sv->sv_u.svu_pv != '0')))
79072805
LW
8009 return 1;
8010 else
8011 return 0;
8012 }
8013 else {
8014 if (SvIOK(sv))
463ee0b2 8015 return SvIVX(sv) != 0;
79072805
LW
8016 else {
8017 if (SvNOK(sv))
463ee0b2 8018 return SvNVX(sv) != 0.0;
79072805 8019 else
463ee0b2 8020 return sv_2bool(sv);
79072805
LW
8021 }
8022 }
8023}
79072805 8024
645c22ef 8025/*
c461cf8f
JH
8026=for apidoc sv_pvn_force
8027
8028Get a sensible string out of the SV somehow.
645c22ef
DM
8029A private implementation of the C<SvPV_force> macro for compilers which
8030can't cope with complex macro expressions. Always use the macro instead.
c461cf8f 8031
8d6d96c1
HS
8032=for apidoc sv_pvn_force_flags
8033
8034Get a sensible string out of the SV somehow.
8035If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
8036appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
8037implemented in terms of this function.
645c22ef
DM
8038You normally want to use the various wrapper macros instead: see
8039C<SvPV_force> and C<SvPV_force_nomg>
8d6d96c1
HS
8040
8041=cut
8042*/
8043
8044char *
12964ddd 8045Perl_sv_pvn_force_flags(pTHX_ SV *const sv, STRLEN *const lp, const I32 flags)
8d6d96c1 8046{
97aff369 8047 dVAR;
7918f24d
NC
8048
8049 PERL_ARGS_ASSERT_SV_PVN_FORCE_FLAGS;
8050
6fc92669 8051 if (SvTHINKFIRST(sv) && !SvROK(sv))
765f542d 8052 sv_force_normal_flags(sv, 0);
1c846c1f 8053
a0d0e21e 8054 if (SvPOK(sv)) {
13c5b33c
NC
8055 if (lp)
8056 *lp = SvCUR(sv);
a0d0e21e
LW
8057 }
8058 else {
a3b680e6 8059 char *s;
13c5b33c
NC
8060 STRLEN len;
8061
4d84ee25 8062 if (SvREADONLY(sv) && !(flags & SV_MUTABLE_RETURN)) {
b64e5050 8063 const char * const ref = sv_reftype(sv,0);
4d84ee25
NC
8064 if (PL_op)
8065 Perl_croak(aTHX_ "Can't coerce readonly %s to string in %s",
b64e5050 8066 ref, OP_NAME(PL_op));
4d84ee25 8067 else
b64e5050 8068 Perl_croak(aTHX_ "Can't coerce readonly %s to string", ref);
4d84ee25 8069 }
1f257c95
NC
8070 if ((SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM)
8071 || isGV_with_GP(sv))
cea2e8a9 8072 Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
53e06cf0 8073 OP_NAME(PL_op));
b64e5050 8074 s = sv_2pv_flags(sv, &len, flags);
13c5b33c
NC
8075 if (lp)
8076 *lp = len;
8077
3f7c398e 8078 if (s != SvPVX_const(sv)) { /* Almost, but not quite, sv_setpvn() */
a0d0e21e
LW
8079 if (SvROK(sv))
8080 sv_unref(sv);
862a34c6 8081 SvUPGRADE(sv, SVt_PV); /* Never FALSE */
a0d0e21e 8082 SvGROW(sv, len + 1);
706aa1c9 8083 Move(s,SvPVX(sv),len,char);
a0d0e21e 8084 SvCUR_set(sv, len);
97a130b8 8085 SvPVX(sv)[len] = '\0';
a0d0e21e
LW
8086 }
8087 if (!SvPOK(sv)) {
8088 SvPOK_on(sv); /* validate pointer */
8089 SvTAINT(sv);
1d7c1841 8090 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3f7c398e 8091 PTR2UV(sv),SvPVX_const(sv)));
a0d0e21e
LW
8092 }
8093 }
4d84ee25 8094 return SvPVX_mutable(sv);
a0d0e21e
LW
8095}
8096
645c22ef 8097/*
645c22ef
DM
8098=for apidoc sv_pvbyten_force
8099
0feed65a 8100The backend for the C<SvPVbytex_force> macro. Always use the macro instead.
645c22ef
DM
8101
8102=cut
8103*/
8104
7340a771 8105char *
12964ddd 8106Perl_sv_pvbyten_force(pTHX_ SV *const sv, STRLEN *const lp)
7340a771 8107{
7918f24d
NC
8108 PERL_ARGS_ASSERT_SV_PVBYTEN_FORCE;
8109
46ec2f14 8110 sv_pvn_force(sv,lp);
ffebcc3e 8111 sv_utf8_downgrade(sv,0);
46ec2f14
TS
8112 *lp = SvCUR(sv);
8113 return SvPVX(sv);
7340a771
GS
8114}
8115
645c22ef 8116/*
c461cf8f
JH
8117=for apidoc sv_pvutf8n_force
8118
0feed65a 8119The backend for the C<SvPVutf8x_force> macro. Always use the macro instead.
c461cf8f
JH
8120
8121=cut
8122*/
8123
7340a771 8124char *
12964ddd 8125Perl_sv_pvutf8n_force(pTHX_ SV *const sv, STRLEN *const lp)
7340a771 8126{
7918f24d
NC
8127 PERL_ARGS_ASSERT_SV_PVUTF8N_FORCE;
8128
46ec2f14 8129 sv_pvn_force(sv,lp);
560a288e 8130 sv_utf8_upgrade(sv);
46ec2f14
TS
8131 *lp = SvCUR(sv);
8132 return SvPVX(sv);
7340a771
GS
8133}
8134
c461cf8f
JH
8135/*
8136=for apidoc sv_reftype
8137
8138Returns a string describing what the SV is a reference to.
8139
8140=cut
8141*/
8142
2b388283 8143const char *
12964ddd 8144Perl_sv_reftype(pTHX_ const SV *const sv, const int ob)
a0d0e21e 8145{
7918f24d
NC
8146 PERL_ARGS_ASSERT_SV_REFTYPE;
8147
07409e01
NC
8148 /* The fact that I don't need to downcast to char * everywhere, only in ?:
8149 inside return suggests a const propagation bug in g++. */
c86bf373 8150 if (ob && SvOBJECT(sv)) {
1b6737cc 8151 char * const name = HvNAME_get(SvSTASH(sv));
07409e01 8152 return name ? name : (char *) "__ANON__";
c86bf373 8153 }
a0d0e21e
LW
8154 else {
8155 switch (SvTYPE(sv)) {
8156 case SVt_NULL:
8157 case SVt_IV:
8158 case SVt_NV:
a0d0e21e
LW
8159 case SVt_PV:
8160 case SVt_PVIV:
8161 case SVt_PVNV:
8162 case SVt_PVMG:
1cb0ed9b 8163 if (SvVOK(sv))
439cb1c4 8164 return "VSTRING";
a0d0e21e
LW
8165 if (SvROK(sv))
8166 return "REF";
8167 else
8168 return "SCALAR";
1cb0ed9b 8169
07409e01 8170 case SVt_PVLV: return (char *) (SvROK(sv) ? "REF"
be65207d
DM
8171 /* tied lvalues should appear to be
8172 * scalars for backwards compatitbility */
8173 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
07409e01 8174 ? "SCALAR" : "LVALUE");
a0d0e21e
LW
8175 case SVt_PVAV: return "ARRAY";
8176 case SVt_PVHV: return "HASH";
8177 case SVt_PVCV: return "CODE";
6e592b3a
BM
8178 case SVt_PVGV: return (char *) (isGV_with_GP(sv)
8179 ? "GLOB" : "SCALAR");
1d2dff63 8180 case SVt_PVFM: return "FORMAT";
27f9d8f3 8181 case SVt_PVIO: return "IO";
cecf5685 8182 case SVt_BIND: return "BIND";
b7c9370f 8183 case SVt_REGEXP: return "REGEXP";
a0d0e21e
LW
8184 default: return "UNKNOWN";
8185 }
8186 }
8187}
8188
954c1994
GS
8189/*
8190=for apidoc sv_isobject
8191
8192Returns a boolean indicating whether the SV is an RV pointing to a blessed
8193object. If the SV is not an RV, or if the object is not blessed, then this
8194will return false.
8195
8196=cut
8197*/
8198
463ee0b2 8199int
864dbfa3 8200Perl_sv_isobject(pTHX_ SV *sv)
85e6fe83 8201{
68dc0745 8202 if (!sv)
8203 return 0;
5b295bef 8204 SvGETMAGIC(sv);
85e6fe83
LW
8205 if (!SvROK(sv))
8206 return 0;
8207 sv = (SV*)SvRV(sv);
8208 if (!SvOBJECT(sv))
8209 return 0;
8210 return 1;
8211}
8212
954c1994
GS
8213/*
8214=for apidoc sv_isa
8215
8216Returns a boolean indicating whether the SV is blessed into the specified
8217class. This does not check for subtypes; use C<sv_derived_from> to verify
8218an inheritance relationship.
8219
8220=cut
8221*/
8222
85e6fe83 8223int
12964ddd 8224Perl_sv_isa(pTHX_ SV *sv, const char *const name)
463ee0b2 8225{
bfcb3514 8226 const char *hvname;
7918f24d
NC
8227
8228 PERL_ARGS_ASSERT_SV_ISA;
8229
68dc0745 8230 if (!sv)
8231 return 0;
5b295bef 8232 SvGETMAGIC(sv);
ed6116ce 8233 if (!SvROK(sv))
463ee0b2 8234 return 0;
ed6116ce
LW
8235 sv = (SV*)SvRV(sv);
8236 if (!SvOBJECT(sv))
463ee0b2 8237 return 0;
bfcb3514
NC
8238 hvname = HvNAME_get(SvSTASH(sv));
8239 if (!hvname)
e27ad1f2 8240 return 0;
463ee0b2 8241
bfcb3514 8242 return strEQ(hvname, name);
463ee0b2
LW
8243}
8244
954c1994
GS
8245/*
8246=for apidoc newSVrv
8247
8248Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
8249it will be upgraded to one. If C<classname> is non-null then the new SV will
8250be blessed in the specified package. The new SV is returned and its
8251reference count is 1.
8252
8253=cut
8254*/
8255
463ee0b2 8256SV*
12964ddd 8257Perl_newSVrv(pTHX_ SV *const rv, const char *const classname)
463ee0b2 8258{
97aff369 8259 dVAR;
463ee0b2
LW
8260 SV *sv;
8261
7918f24d
NC
8262 PERL_ARGS_ASSERT_NEWSVRV;
8263
4561caa4 8264 new_SV(sv);
51cf62d8 8265
765f542d 8266 SV_CHECK_THINKFIRST_COW_DROP(rv);
52944de8 8267 (void)SvAMAGIC_off(rv);
51cf62d8 8268
0199fce9 8269 if (SvTYPE(rv) >= SVt_PVMG) {
a3b680e6 8270 const U32 refcnt = SvREFCNT(rv);
0199fce9
JD
8271 SvREFCNT(rv) = 0;
8272 sv_clear(rv);
8273 SvFLAGS(rv) = 0;
8274 SvREFCNT(rv) = refcnt;
0199fce9 8275
4df7f6af 8276 sv_upgrade(rv, SVt_IV);
dc5494d2
NC
8277 } else if (SvROK(rv)) {
8278 SvREFCNT_dec(SvRV(rv));
43230e26
NC
8279 } else {
8280 prepare_SV_for_RV(rv);
0199fce9 8281 }
51cf62d8 8282
0c34ef67 8283 SvOK_off(rv);
b162af07 8284 SvRV_set(rv, sv);
ed6116ce 8285 SvROK_on(rv);
463ee0b2 8286
a0d0e21e 8287 if (classname) {
da51bb9b 8288 HV* const stash = gv_stashpv(classname, GV_ADD);
a0d0e21e
LW
8289 (void)sv_bless(rv, stash);
8290 }
8291 return sv;
8292}
8293
954c1994
GS
8294/*
8295=for apidoc sv_setref_pv
8296
8297Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
8298argument will be upgraded to an RV. That RV will be modified to point to
8299the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
8300into the SV. The C<classname> argument indicates the package for the
bd61b366 8301blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 8302will have a reference count of 1, and the RV will be returned.
954c1994
GS
8303
8304Do not use with other Perl types such as HV, AV, SV, CV, because those
8305objects will become corrupted by the pointer copy process.
8306
8307Note that C<sv_setref_pvn> copies the string while this copies the pointer.
8308
8309=cut
8310*/
8311
a0d0e21e 8312SV*
12964ddd 8313Perl_sv_setref_pv(pTHX_ SV *const rv, const char *const classname, void *const pv)
a0d0e21e 8314{
97aff369 8315 dVAR;
7918f24d
NC
8316
8317 PERL_ARGS_ASSERT_SV_SETREF_PV;
8318
189b2af5 8319 if (!pv) {
3280af22 8320 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
8321 SvSETMAGIC(rv);
8322 }
a0d0e21e 8323 else
56431972 8324 sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
a0d0e21e
LW
8325 return rv;
8326}
8327
954c1994
GS
8328/*
8329=for apidoc sv_setref_iv
8330
8331Copies an integer into a new SV, optionally blessing the SV. The C<rv>
8332argument will be upgraded to an RV. That RV will be modified to point to
8333the new SV. The C<classname> argument indicates the package for the
bd61b366 8334blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 8335will have a reference count of 1, and the RV will be returned.
954c1994
GS
8336
8337=cut
8338*/
8339
a0d0e21e 8340SV*
12964ddd 8341Perl_sv_setref_iv(pTHX_ SV *const rv, const char *const classname, const IV iv)
a0d0e21e 8342{
7918f24d
NC
8343 PERL_ARGS_ASSERT_SV_SETREF_IV;
8344
a0d0e21e
LW
8345 sv_setiv(newSVrv(rv,classname), iv);
8346 return rv;
8347}
8348
954c1994 8349/*
e1c57cef
JH
8350=for apidoc sv_setref_uv
8351
8352Copies an unsigned integer into a new SV, optionally blessing the SV. The C<rv>
8353argument will be upgraded to an RV. That RV will be modified to point to
8354the new SV. The C<classname> argument indicates the package for the
bd61b366 8355blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 8356will have a reference count of 1, and the RV will be returned.
e1c57cef
JH
8357
8358=cut
8359*/
8360
8361SV*
12964ddd 8362Perl_sv_setref_uv(pTHX_ SV *const rv, const char *const classname, const UV uv)
e1c57cef 8363{
7918f24d
NC
8364 PERL_ARGS_ASSERT_SV_SETREF_UV;
8365
e1c57cef
JH
8366 sv_setuv(newSVrv(rv,classname), uv);
8367 return rv;
8368}
8369
8370/*
954c1994
GS
8371=for apidoc sv_setref_nv
8372
8373Copies a double into a new SV, optionally blessing the SV. The C<rv>
8374argument will be upgraded to an RV. That RV will be modified to point to
8375the new SV. The C<classname> argument indicates the package for the
bd61b366 8376blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 8377will have a reference count of 1, and the RV will be returned.
954c1994
GS
8378
8379=cut
8380*/
8381
a0d0e21e 8382SV*
12964ddd 8383Perl_sv_setref_nv(pTHX_ SV *const rv, const char *const classname, const NV nv)
a0d0e21e 8384{
7918f24d
NC
8385 PERL_ARGS_ASSERT_SV_SETREF_NV;
8386
a0d0e21e
LW
8387 sv_setnv(newSVrv(rv,classname), nv);
8388 return rv;
8389}
463ee0b2 8390
954c1994
GS
8391/*
8392=for apidoc sv_setref_pvn
8393
8394Copies a string into a new SV, optionally blessing the SV. The length of the
8395string must be specified with C<n>. The C<rv> argument will be upgraded to
8396an RV. That RV will be modified to point to the new SV. The C<classname>
8397argument indicates the package for the blessing. Set C<classname> to
bd61b366 8398C<NULL> to avoid the blessing. The new SV will have a reference count
d34c2299 8399of 1, and the RV will be returned.
954c1994
GS
8400
8401Note that C<sv_setref_pv> copies the pointer while this copies the string.
8402
8403=cut
8404*/
8405
a0d0e21e 8406SV*
12964ddd
SS
8407Perl_sv_setref_pvn(pTHX_ SV *const rv, const char *const classname,
8408 const char *const pv, const STRLEN n)
a0d0e21e 8409{
7918f24d
NC
8410 PERL_ARGS_ASSERT_SV_SETREF_PVN;
8411
a0d0e21e 8412 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
8413 return rv;
8414}
8415
954c1994
GS
8416/*
8417=for apidoc sv_bless
8418
8419Blesses an SV into a specified package. The SV must be an RV. The package
8420must be designated by its stash (see C<gv_stashpv()>). The reference count
8421of the SV is unaffected.
8422
8423=cut
8424*/
8425
a0d0e21e 8426SV*
12964ddd 8427Perl_sv_bless(pTHX_ SV *const sv, HV *const stash)
a0d0e21e 8428{
97aff369 8429 dVAR;
76e3520e 8430 SV *tmpRef;
7918f24d
NC
8431
8432 PERL_ARGS_ASSERT_SV_BLESS;
8433
a0d0e21e 8434 if (!SvROK(sv))
cea2e8a9 8435 Perl_croak(aTHX_ "Can't bless non-reference value");
76e3520e
GS
8436 tmpRef = SvRV(sv);
8437 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
e0744413
NC
8438 if (SvIsCOW(tmpRef))
8439 sv_force_normal_flags(tmpRef, 0);
76e3520e 8440 if (SvREADONLY(tmpRef))
cea2e8a9 8441 Perl_croak(aTHX_ PL_no_modify);
76e3520e
GS
8442 if (SvOBJECT(tmpRef)) {
8443 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 8444 --PL_sv_objcount;
76e3520e 8445 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 8446 }
a0d0e21e 8447 }
76e3520e
GS
8448 SvOBJECT_on(tmpRef);
8449 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 8450 ++PL_sv_objcount;
862a34c6 8451 SvUPGRADE(tmpRef, SVt_PVMG);
b37c2d43 8452 SvSTASH_set(tmpRef, (HV*)SvREFCNT_inc_simple(stash));
a0d0e21e 8453
2e3febc6
CS
8454 if (Gv_AMG(stash))
8455 SvAMAGIC_on(sv);
8456 else
52944de8 8457 (void)SvAMAGIC_off(sv);
a0d0e21e 8458
1edbfb88
AB
8459 if(SvSMAGICAL(tmpRef))
8460 if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
8461 mg_set(tmpRef);
8462
8463
ecdeb87c 8464
a0d0e21e
LW
8465 return sv;
8466}
8467
645c22ef 8468/* Downgrades a PVGV to a PVMG.
645c22ef
DM
8469 */
8470
76e3520e 8471STATIC void
89e38212 8472S_sv_unglob(pTHX_ SV *const sv)
a0d0e21e 8473{
97aff369 8474 dVAR;
850fabdf 8475 void *xpvmg;
dd69841b 8476 HV *stash;
b37c2d43 8477 SV * const temp = sv_newmortal();
850fabdf 8478
7918f24d
NC
8479 PERL_ARGS_ASSERT_SV_UNGLOB;
8480
a0d0e21e
LW
8481 assert(SvTYPE(sv) == SVt_PVGV);
8482 SvFAKE_off(sv);
180488f8
NC
8483 gv_efullname3(temp, (GV *) sv, "*");
8484
f7877b28 8485 if (GvGP(sv)) {
dd69841b
BB
8486 if(GvCVu((GV*)sv) && (stash = GvSTASH((GV*)sv)) && HvNAME_get(stash))
8487 mro_method_changed_in(stash);
1edc1566 8488 gp_free((GV*)sv);
f7877b28 8489 }
e826b3c7 8490 if (GvSTASH(sv)) {
e15faf7d 8491 sv_del_backref((SV*)GvSTASH(sv), sv);
5c284bb0 8492 GvSTASH(sv) = NULL;
e826b3c7 8493 }
a5f75d66 8494 GvMULTI_off(sv);
acda4c6a
NC
8495 if (GvNAME_HEK(sv)) {
8496 unshare_hek(GvNAME_HEK(sv));
8497 }
2e5b91de 8498 isGV_with_GP_off(sv);
850fabdf
GS
8499
8500 /* need to keep SvANY(sv) in the right arena */
8501 xpvmg = new_XPVMG();
8502 StructCopy(SvANY(sv), xpvmg, XPVMG);
8503 del_XPVGV(SvANY(sv));
8504 SvANY(sv) = xpvmg;
8505
a0d0e21e
LW
8506 SvFLAGS(sv) &= ~SVTYPEMASK;
8507 SvFLAGS(sv) |= SVt_PVMG;
180488f8
NC
8508
8509 /* Intentionally not calling any local SET magic, as this isn't so much a
8510 set operation as merely an internal storage change. */
8511 sv_setsv_flags(sv, temp, 0);
a0d0e21e
LW
8512}
8513
954c1994 8514/*
840a7b70 8515=for apidoc sv_unref_flags
954c1994
GS
8516
8517Unsets the RV status of the SV, and decrements the reference count of
8518whatever was being referenced by the RV. This can almost be thought of
840a7b70
IZ
8519as a reversal of C<newSVrv>. The C<cflags> argument can contain
8520C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
8521(otherwise the decrementing is conditional on the reference count being
8522different from one or the reference being a readonly SV).
7889fe52 8523See C<SvROK_off>.
954c1994
GS
8524
8525=cut
8526*/
8527
ed6116ce 8528void
89e38212 8529Perl_sv_unref_flags(pTHX_ SV *const ref, const U32 flags)
ed6116ce 8530{
b64e5050 8531 SV* const target = SvRV(ref);
810b8aa5 8532
7918f24d
NC
8533 PERL_ARGS_ASSERT_SV_UNREF_FLAGS;
8534
e15faf7d
NC
8535 if (SvWEAKREF(ref)) {
8536 sv_del_backref(target, ref);
8537 SvWEAKREF_off(ref);
8538 SvRV_set(ref, NULL);
810b8aa5
GS
8539 return;
8540 }
e15faf7d
NC
8541 SvRV_set(ref, NULL);
8542 SvROK_off(ref);
8543 /* You can't have a || SvREADONLY(target) here, as $a = $$a, where $a was
04ca4930 8544 assigned to as BEGIN {$a = \"Foo"} will fail. */
e15faf7d
NC
8545 if (SvREFCNT(target) != 1 || (flags & SV_IMMEDIATE_UNREF))
8546 SvREFCNT_dec(target);
840a7b70 8547 else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
e15faf7d 8548 sv_2mortal(target); /* Schedule for freeing later */
ed6116ce 8549}
8990e307 8550
840a7b70 8551/*
645c22ef
DM
8552=for apidoc sv_untaint
8553
8554Untaint an SV. Use C<SvTAINTED_off> instead.
8555=cut
8556*/
8557
bbce6d69 8558void
89e38212 8559Perl_sv_untaint(pTHX_ SV *const sv)
bbce6d69 8560{
7918f24d
NC
8561 PERL_ARGS_ASSERT_SV_UNTAINT;
8562
13f57bf8 8563 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
b64e5050 8564 MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
36477c24 8565 if (mg)
565764a8 8566 mg->mg_len &= ~1;
36477c24 8567 }
bbce6d69 8568}
8569
645c22ef
DM
8570/*
8571=for apidoc sv_tainted
8572
8573Test an SV for taintedness. Use C<SvTAINTED> instead.
8574=cut
8575*/
8576
bbce6d69 8577bool
89e38212 8578Perl_sv_tainted(pTHX_ SV *const sv)
bbce6d69 8579{
7918f24d
NC
8580 PERL_ARGS_ASSERT_SV_TAINTED;
8581
13f57bf8 8582 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
823a54a3 8583 const MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
2ddb8a4f 8584 if (mg && (mg->mg_len & 1) )
36477c24 8585 return TRUE;
8586 }
8587 return FALSE;
bbce6d69 8588}
8589
09540bc3
JH
8590/*
8591=for apidoc sv_setpviv
8592
8593Copies an integer into the given SV, also updating its string value.
8594Does not handle 'set' magic. See C<sv_setpviv_mg>.
8595
8596=cut
8597*/
8598
8599void
89e38212 8600Perl_sv_setpviv(pTHX_ SV *const sv, const IV iv)
09540bc3
JH
8601{
8602 char buf[TYPE_CHARS(UV)];
8603 char *ebuf;
b64e5050 8604 char * const ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
09540bc3 8605
7918f24d
NC
8606 PERL_ARGS_ASSERT_SV_SETPVIV;
8607
09540bc3
JH
8608 sv_setpvn(sv, ptr, ebuf - ptr);
8609}
8610
8611/*
8612=for apidoc sv_setpviv_mg
8613
8614Like C<sv_setpviv>, but also handles 'set' magic.
8615
8616=cut
8617*/
8618
8619void
89e38212 8620Perl_sv_setpviv_mg(pTHX_ SV *const sv, const IV iv)
09540bc3 8621{
7918f24d
NC
8622 PERL_ARGS_ASSERT_SV_SETPVIV_MG;
8623
df7eb254 8624 sv_setpviv(sv, iv);
09540bc3
JH
8625 SvSETMAGIC(sv);
8626}
8627
cea2e8a9 8628#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8629
8630/* pTHX_ magic can't cope with varargs, so this is a no-context
8631 * version of the main function, (which may itself be aliased to us).
8632 * Don't access this version directly.
8633 */
8634
cea2e8a9 8635void
89e38212 8636Perl_sv_setpvf_nocontext(SV *const sv, const char *const pat, ...)
cea2e8a9
GS
8637{
8638 dTHX;
8639 va_list args;
7918f24d
NC
8640
8641 PERL_ARGS_ASSERT_SV_SETPVF_NOCONTEXT;
8642
cea2e8a9 8643 va_start(args, pat);
c5be433b 8644 sv_vsetpvf(sv, pat, &args);
cea2e8a9
GS
8645 va_end(args);
8646}
8647
645c22ef
DM
8648/* pTHX_ magic can't cope with varargs, so this is a no-context
8649 * version of the main function, (which may itself be aliased to us).
8650 * Don't access this version directly.
8651 */
cea2e8a9
GS
8652
8653void
89e38212 8654Perl_sv_setpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
cea2e8a9
GS
8655{
8656 dTHX;
8657 va_list args;
7918f24d
NC
8658
8659 PERL_ARGS_ASSERT_SV_SETPVF_MG_NOCONTEXT;
8660
cea2e8a9 8661 va_start(args, pat);
c5be433b 8662 sv_vsetpvf_mg(sv, pat, &args);
cea2e8a9 8663 va_end(args);
cea2e8a9
GS
8664}
8665#endif
8666
954c1994
GS
8667/*
8668=for apidoc sv_setpvf
8669
bffc3d17
SH
8670Works like C<sv_catpvf> but copies the text into the SV instead of
8671appending it. Does not handle 'set' magic. See C<sv_setpvf_mg>.
954c1994
GS
8672
8673=cut
8674*/
8675
46fc3d4c 8676void
89e38212 8677Perl_sv_setpvf(pTHX_ SV *const sv, const char *const pat, ...)
46fc3d4c 8678{
8679 va_list args;
7918f24d
NC
8680
8681 PERL_ARGS_ASSERT_SV_SETPVF;
8682
46fc3d4c 8683 va_start(args, pat);
c5be433b 8684 sv_vsetpvf(sv, pat, &args);
46fc3d4c 8685 va_end(args);
8686}
8687
bffc3d17
SH
8688/*
8689=for apidoc sv_vsetpvf
8690
8691Works like C<sv_vcatpvf> but copies the text into the SV instead of
8692appending it. Does not handle 'set' magic. See C<sv_vsetpvf_mg>.
8693
8694Usually used via its frontend C<sv_setpvf>.
8695
8696=cut
8697*/
645c22ef 8698
c5be433b 8699void
89e38212 8700Perl_sv_vsetpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args)
c5be433b 8701{
7918f24d
NC
8702 PERL_ARGS_ASSERT_SV_VSETPVF;
8703
4608196e 8704 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
c5be433b 8705}
ef50df4b 8706
954c1994
GS
8707/*
8708=for apidoc sv_setpvf_mg
8709
8710Like C<sv_setpvf>, but also handles 'set' magic.
8711
8712=cut
8713*/
8714
ef50df4b 8715void
89e38212 8716Perl_sv_setpvf_mg(pTHX_ SV *const sv, const char *const pat, ...)
ef50df4b
GS
8717{
8718 va_list args;
7918f24d
NC
8719
8720 PERL_ARGS_ASSERT_SV_SETPVF_MG;
8721
ef50df4b 8722 va_start(args, pat);
c5be433b 8723 sv_vsetpvf_mg(sv, pat, &args);
ef50df4b 8724 va_end(args);
c5be433b
GS
8725}
8726
bffc3d17
SH
8727/*
8728=for apidoc sv_vsetpvf_mg
8729
8730Like C<sv_vsetpvf>, but also handles 'set' magic.
8731
8732Usually used via its frontend C<sv_setpvf_mg>.
8733
8734=cut
8735*/
645c22ef 8736
c5be433b 8737void
89e38212 8738Perl_sv_vsetpvf_mg(pTHX_ SV *const sv, const char *const pat, va_list *const args)
c5be433b 8739{
7918f24d
NC
8740 PERL_ARGS_ASSERT_SV_VSETPVF_MG;
8741
4608196e 8742 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
ef50df4b
GS
8743 SvSETMAGIC(sv);
8744}
8745
cea2e8a9 8746#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8747
8748/* pTHX_ magic can't cope with varargs, so this is a no-context
8749 * version of the main function, (which may itself be aliased to us).
8750 * Don't access this version directly.
8751 */
8752
cea2e8a9 8753void
89e38212 8754Perl_sv_catpvf_nocontext(SV *const sv, const char *const pat, ...)
cea2e8a9
GS
8755{
8756 dTHX;
8757 va_list args;
7918f24d
NC
8758
8759 PERL_ARGS_ASSERT_SV_CATPVF_NOCONTEXT;
8760
cea2e8a9 8761 va_start(args, pat);
c5be433b 8762 sv_vcatpvf(sv, pat, &args);
cea2e8a9
GS
8763 va_end(args);
8764}
8765
645c22ef
DM
8766/* pTHX_ magic can't cope with varargs, so this is a no-context
8767 * version of the main function, (which may itself be aliased to us).
8768 * Don't access this version directly.
8769 */
8770
cea2e8a9 8771void
89e38212 8772Perl_sv_catpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
cea2e8a9
GS
8773{
8774 dTHX;
8775 va_list args;
7918f24d
NC
8776
8777 PERL_ARGS_ASSERT_SV_CATPVF_MG_NOCONTEXT;
8778
cea2e8a9 8779 va_start(args, pat);
c5be433b 8780 sv_vcatpvf_mg(sv, pat, &args);
cea2e8a9 8781 va_end(args);
cea2e8a9
GS
8782}
8783#endif
8784
954c1994
GS
8785/*
8786=for apidoc sv_catpvf
8787
d5ce4a7c
GA
8788Processes its arguments like C<sprintf> and appends the formatted
8789output to an SV. If the appended data contains "wide" characters
8790(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
8791and characters >255 formatted with %c), the original SV might get
bffc3d17 8792upgraded to UTF-8. Handles 'get' magic, but not 'set' magic. See
cdd94ca7
NC
8793C<sv_catpvf_mg>. If the original SV was UTF-8, the pattern should be
8794valid UTF-8; if the original SV was bytes, the pattern should be too.
954c1994 8795
d5ce4a7c 8796=cut */
954c1994 8797
46fc3d4c 8798void
66ceb532 8799Perl_sv_catpvf(pTHX_ SV *const sv, const char *const pat, ...)
46fc3d4c 8800{
8801 va_list args;
7918f24d
NC
8802
8803 PERL_ARGS_ASSERT_SV_CATPVF;
8804
46fc3d4c 8805 va_start(args, pat);
c5be433b 8806 sv_vcatpvf(sv, pat, &args);
46fc3d4c 8807 va_end(args);
8808}
8809
bffc3d17
SH
8810/*
8811=for apidoc sv_vcatpvf
8812
8813Processes its arguments like C<vsprintf> and appends the formatted output
8814to an SV. Does not handle 'set' magic. See C<sv_vcatpvf_mg>.
8815
8816Usually used via its frontend C<sv_catpvf>.
8817
8818=cut
8819*/
645c22ef 8820
ef50df4b 8821void
66ceb532 8822Perl_sv_vcatpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args)
c5be433b 8823{
7918f24d
NC
8824 PERL_ARGS_ASSERT_SV_VCATPVF;
8825
4608196e 8826 sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
c5be433b
GS
8827}
8828
954c1994
GS
8829/*
8830=for apidoc sv_catpvf_mg
8831
8832Like C<sv_catpvf>, but also handles 'set' magic.
8833
8834=cut
8835*/
8836
c5be433b 8837void
66ceb532 8838Perl_sv_catpvf_mg(pTHX_ SV *const sv, const char *const pat, ...)
ef50df4b
GS
8839{
8840 va_list args;
7918f24d
NC
8841
8842 PERL_ARGS_ASSERT_SV_CATPVF_MG;
8843
ef50df4b 8844 va_start(args, pat);
c5be433b 8845 sv_vcatpvf_mg(sv, pat, &args);
ef50df4b 8846 va_end(args);
c5be433b
GS
8847}
8848
bffc3d17
SH
8849/*
8850=for apidoc sv_vcatpvf_mg
8851
8852Like C<sv_vcatpvf>, but also handles 'set' magic.
8853
8854Usually used via its frontend C<sv_catpvf_mg>.
8855
8856=cut
8857*/
645c22ef 8858
c5be433b 8859void
66ceb532 8860Perl_sv_vcatpvf_mg(pTHX_ SV *const sv, const char *const pat, va_list *const args)
c5be433b 8861{
7918f24d
NC
8862 PERL_ARGS_ASSERT_SV_VCATPVF_MG;
8863
4608196e 8864 sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
ef50df4b
GS
8865 SvSETMAGIC(sv);
8866}
8867
954c1994
GS
8868/*
8869=for apidoc sv_vsetpvfn
8870
bffc3d17 8871Works like C<sv_vcatpvfn> but copies the text into the SV instead of
954c1994
GS
8872appending it.
8873
bffc3d17 8874Usually used via one of its frontends C<sv_vsetpvf> and C<sv_vsetpvf_mg>.
645c22ef 8875
954c1994
GS
8876=cut
8877*/
8878
46fc3d4c 8879void
66ceb532
SS
8880Perl_sv_vsetpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
8881 va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted)
46fc3d4c 8882{
7918f24d
NC
8883 PERL_ARGS_ASSERT_SV_VSETPVFN;
8884
46fc3d4c 8885 sv_setpvn(sv, "", 0);
7d5ea4e7 8886 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
46fc3d4c 8887}
8888
2d00ba3b 8889STATIC I32
66ceb532 8890S_expect_number(pTHX_ char **const pattern)
211dfcf1 8891{
97aff369 8892 dVAR;
211dfcf1 8893 I32 var = 0;
7918f24d
NC
8894
8895 PERL_ARGS_ASSERT_EXPECT_NUMBER;
8896
211dfcf1
HS
8897 switch (**pattern) {
8898 case '1': case '2': case '3':
8899 case '4': case '5': case '6':
8900 case '7': case '8': case '9':
2fba7546
GA
8901 var = *(*pattern)++ - '0';
8902 while (isDIGIT(**pattern)) {
5f66b61c 8903 const I32 tmp = var * 10 + (*(*pattern)++ - '0');
2fba7546
GA
8904 if (tmp < var)
8905 Perl_croak(aTHX_ "Integer overflow in format string for %s", (PL_op ? OP_NAME(PL_op) : "sv_vcatpvfn"));
8906 var = tmp;
8907 }
211dfcf1
HS
8908 }
8909 return var;
8910}
211dfcf1 8911
c445ea15 8912STATIC char *
66ceb532 8913S_F0convert(NV nv, char *const endbuf, STRLEN *const len)
4151a5fe 8914{
a3b680e6 8915 const int neg = nv < 0;
4151a5fe 8916 UV uv;
4151a5fe 8917
7918f24d
NC
8918 PERL_ARGS_ASSERT_F0CONVERT;
8919
4151a5fe
IZ
8920 if (neg)
8921 nv = -nv;
8922 if (nv < UV_MAX) {
b464bac0 8923 char *p = endbuf;
4151a5fe 8924 nv += 0.5;
028f8eaa 8925 uv = (UV)nv;
4151a5fe
IZ
8926 if (uv & 1 && uv == nv)
8927 uv--; /* Round to even */
8928 do {
a3b680e6 8929 const unsigned dig = uv % 10;
4151a5fe
IZ
8930 *--p = '0' + dig;
8931 } while (uv /= 10);
8932 if (neg)
8933 *--p = '-';
8934 *len = endbuf - p;
8935 return p;
8936 }
bd61b366 8937 return NULL;
4151a5fe
IZ
8938}
8939
8940
954c1994
GS
8941/*
8942=for apidoc sv_vcatpvfn
8943
8944Processes its arguments like C<vsprintf> and appends the formatted output
8945to an SV. Uses an array of SVs if the C style variable argument list is
8946missing (NULL). When running with taint checks enabled, indicates via
8947C<maybe_tainted> if results are untrustworthy (often due to the use of
8948locales).
8949
bffc3d17 8950Usually used via one of its frontends C<sv_vcatpvf> and C<sv_vcatpvf_mg>.
645c22ef 8951
954c1994
GS
8952=cut
8953*/
8954
8896765a
RB
8955
8956#define VECTORIZE_ARGS vecsv = va_arg(*args, SV*);\
8957 vecstr = (U8*)SvPV_const(vecsv,veclen);\
8958 vec_utf8 = DO_UTF8(vecsv);
8959
1ef29b0e
RGS
8960/* XXX maybe_tainted is never assigned to, so the doc above is lying. */
8961
46fc3d4c 8962void
66ceb532
SS
8963Perl_sv_vcatpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
8964 va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted)
46fc3d4c 8965{
97aff369 8966 dVAR;
46fc3d4c 8967 char *p;
8968 char *q;
a3b680e6 8969 const char *patend;
fc36a67e 8970 STRLEN origlen;
46fc3d4c 8971 I32 svix = 0;
27da23d5 8972 static const char nullstr[] = "(null)";
a0714e2c 8973 SV *argsv = NULL;
b464bac0
AL
8974 bool has_utf8 = DO_UTF8(sv); /* has the result utf8? */
8975 const bool pat_utf8 = has_utf8; /* the pattern is in utf8? */
a0714e2c 8976 SV *nsv = NULL;
4151a5fe
IZ
8977 /* Times 4: a decimal digit takes more than 3 binary digits.
8978 * NV_DIG: mantissa takes than many decimal digits.
8979 * Plus 32: Playing safe. */
8980 char ebuf[IV_DIG * 4 + NV_DIG + 32];
8981 /* large enough for "%#.#f" --chip */
8982 /* what about long double NVs? --jhi */
db79b45b 8983
7918f24d 8984 PERL_ARGS_ASSERT_SV_VCATPVFN;
53c1dcc0
AL
8985 PERL_UNUSED_ARG(maybe_tainted);
8986
46fc3d4c 8987 /* no matter what, this is a string now */
fc36a67e 8988 (void)SvPV_force(sv, origlen);
46fc3d4c 8989
8896765a 8990 /* special-case "", "%s", and "%-p" (SVf - see below) */
46fc3d4c 8991 if (patlen == 0)
8992 return;
0dbb1585 8993 if (patlen == 2 && pat[0] == '%' && pat[1] == 's') {
2d03de9c
AL
8994 if (args) {
8995 const char * const s = va_arg(*args, char*);
8996 sv_catpv(sv, s ? s : nullstr);
8997 }
8998 else if (svix < svmax) {
8999 sv_catsv(sv, *svargs);
2d03de9c
AL
9000 }
9001 return;
0dbb1585 9002 }
8896765a
RB
9003 if (args && patlen == 3 && pat[0] == '%' &&
9004 pat[1] == '-' && pat[2] == 'p') {
6c9570dc 9005 argsv = (SV*)va_arg(*args, void*);
8896765a 9006 sv_catsv(sv, argsv);
8896765a 9007 return;
46fc3d4c 9008 }
9009
1d917b39 9010#ifndef USE_LONG_DOUBLE
4151a5fe 9011 /* special-case "%.<number>[gf]" */
7af36d83 9012 if ( !args && patlen <= 5 && pat[0] == '%' && pat[1] == '.'
4151a5fe
IZ
9013 && (pat[patlen-1] == 'g' || pat[patlen-1] == 'f') ) {
9014 unsigned digits = 0;
9015 const char *pp;
9016
9017 pp = pat + 2;
9018 while (*pp >= '0' && *pp <= '9')
9019 digits = 10 * digits + (*pp++ - '0');
028f8eaa 9020 if (pp - pat == (int)patlen - 1) {
4151a5fe
IZ
9021 NV nv;
9022
7af36d83 9023 if (svix < svmax)
4151a5fe
IZ
9024 nv = SvNV(*svargs);
9025 else
9026 return;
9027 if (*pp == 'g') {
2873255c
NC
9028 /* Add check for digits != 0 because it seems that some
9029 gconverts are buggy in this case, and we don't yet have
9030 a Configure test for this. */
9031 if (digits && digits < sizeof(ebuf) - NV_DIG - 10) {
9032 /* 0, point, slack */
2e59c212 9033 Gconvert(nv, (int)digits, 0, ebuf);
4151a5fe
IZ
9034 sv_catpv(sv, ebuf);
9035 if (*ebuf) /* May return an empty string for digits==0 */
9036 return;
9037 }
9038 } else if (!digits) {
9039 STRLEN l;
9040
9041 if ((p = F0convert(nv, ebuf + sizeof ebuf, &l))) {
9042 sv_catpvn(sv, p, l);
9043 return;
9044 }
9045 }
9046 }
9047 }
1d917b39 9048#endif /* !USE_LONG_DOUBLE */
4151a5fe 9049
2cf2cfc6 9050 if (!args && svix < svmax && DO_UTF8(*svargs))
205f51d8 9051 has_utf8 = TRUE;
2cf2cfc6 9052
46fc3d4c 9053 patend = (char*)pat + patlen;
9054 for (p = (char*)pat; p < patend; p = q) {
9055 bool alt = FALSE;
9056 bool left = FALSE;
b22c7a20 9057 bool vectorize = FALSE;
211dfcf1 9058 bool vectorarg = FALSE;
2cf2cfc6 9059 bool vec_utf8 = FALSE;
46fc3d4c 9060 char fill = ' ';
9061 char plus = 0;
9062 char intsize = 0;
9063 STRLEN width = 0;
fc36a67e 9064 STRLEN zeros = 0;
46fc3d4c 9065 bool has_precis = FALSE;
9066 STRLEN precis = 0;
c445ea15 9067 const I32 osvix = svix;
2cf2cfc6 9068 bool is_utf8 = FALSE; /* is this item utf8? */
20f6aaab
AS
9069#ifdef HAS_LDBL_SPRINTF_BUG
9070 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8 9071 with sfio - Allen <allens@cpan.org> */
20f6aaab
AS
9072 bool fix_ldbl_sprintf_bug = FALSE;
9073#endif
205f51d8 9074
46fc3d4c 9075 char esignbuf[4];
89ebb4a3 9076 U8 utf8buf[UTF8_MAXBYTES+1];
46fc3d4c 9077 STRLEN esignlen = 0;
9078
bd61b366 9079 const char *eptr = NULL;
fc36a67e 9080 STRLEN elen = 0;
a0714e2c 9081 SV *vecsv = NULL;
4608196e 9082 const U8 *vecstr = NULL;
b22c7a20 9083 STRLEN veclen = 0;
934abaf1 9084 char c = 0;
46fc3d4c 9085 int i;
9c5ffd7c 9086 unsigned base = 0;
8c8eb53c
RB
9087 IV iv = 0;
9088 UV uv = 0;
9e5b023a
JH
9089 /* we need a long double target in case HAS_LONG_DOUBLE but
9090 not USE_LONG_DOUBLE
9091 */
35fff930 9092#if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
9e5b023a
JH
9093 long double nv;
9094#else
65202027 9095 NV nv;
9e5b023a 9096#endif
46fc3d4c 9097 STRLEN have;
9098 STRLEN need;
9099 STRLEN gap;
7af36d83 9100 const char *dotstr = ".";
b22c7a20 9101 STRLEN dotstrlen = 1;
211dfcf1 9102 I32 efix = 0; /* explicit format parameter index */
eb3fce90 9103 I32 ewix = 0; /* explicit width index */
211dfcf1
HS
9104 I32 epix = 0; /* explicit precision index */
9105 I32 evix = 0; /* explicit vector index */
eb3fce90 9106 bool asterisk = FALSE;
46fc3d4c 9107
211dfcf1 9108 /* echo everything up to the next format specification */
46fc3d4c 9109 for (q = p; q < patend && *q != '%'; ++q) ;
9110 if (q > p) {
db79b45b
JH
9111 if (has_utf8 && !pat_utf8)
9112 sv_catpvn_utf8_upgrade(sv, p, q - p, nsv);
9113 else
9114 sv_catpvn(sv, p, q - p);
46fc3d4c 9115 p = q;
9116 }
9117 if (q++ >= patend)
9118 break;
9119
211dfcf1
HS
9120/*
9121 We allow format specification elements in this order:
9122 \d+\$ explicit format parameter index
9123 [-+ 0#]+ flags
a472f209 9124 v|\*(\d+\$)?v vector with optional (optionally specified) arg
f3583277 9125 0 flag (as above): repeated to allow "v02"
211dfcf1
HS
9126 \d+|\*(\d+\$)? width using optional (optionally specified) arg
9127 \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
9128 [hlqLV] size
8896765a
RB
9129 [%bcdefginopsuxDFOUX] format (mandatory)
9130*/
9131
9132 if (args) {
9133/*
9134 As of perl5.9.3, printf format checking is on by default.
9135 Internally, perl uses %p formats to provide an escape to
9136 some extended formatting. This block deals with those
9137 extensions: if it does not match, (char*)q is reset and
9138 the normal format processing code is used.
9139
9140 Currently defined extensions are:
9141 %p include pointer address (standard)
9142 %-p (SVf) include an SV (previously %_)
9143 %-<num>p include an SV with precision <num>
8896765a
RB
9144 %<num>p reserved for future extensions
9145
9146 Robin Barker 2005-07-14
f46d31f2
RB
9147
9148 %1p (VDf) removed. RMB 2007-10-19
211dfcf1 9149*/
8896765a
RB
9150 char* r = q;
9151 bool sv = FALSE;
9152 STRLEN n = 0;
9153 if (*q == '-')
9154 sv = *q++;
c445ea15 9155 n = expect_number(&q);
8896765a
RB
9156 if (*q++ == 'p') {
9157 if (sv) { /* SVf */
9158 if (n) {
9159 precis = n;
9160 has_precis = TRUE;
9161 }
6c9570dc 9162 argsv = (SV*)va_arg(*args, void*);
4ea561bc 9163 eptr = SvPV_const(argsv, elen);
8896765a
RB
9164 if (DO_UTF8(argsv))
9165 is_utf8 = TRUE;
9166 goto string;
9167 }
8896765a
RB
9168 else if (n) {
9169 if (ckWARN_d(WARN_INTERNAL))
9170 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
9171 "internal %%<num>p might conflict with future printf extensions");
9172 }
9173 }
9174 q = r;
9175 }
9176
c445ea15 9177 if ( (width = expect_number(&q)) ) {
211dfcf1
HS
9178 if (*q == '$') {
9179 ++q;
9180 efix = width;
9181 } else {
9182 goto gotwidth;
9183 }
9184 }
9185
fc36a67e 9186 /* FLAGS */
9187
46fc3d4c 9188 while (*q) {
9189 switch (*q) {
9190 case ' ':
9191 case '+':
9911cee9
TS
9192 if (plus == '+' && *q == ' ') /* '+' over ' ' */
9193 q++;
9194 else
9195 plus = *q++;
46fc3d4c 9196 continue;
9197
9198 case '-':
9199 left = TRUE;
9200 q++;
9201 continue;
9202
9203 case '0':
9204 fill = *q++;
9205 continue;
9206
9207 case '#':
9208 alt = TRUE;
9209 q++;
9210 continue;
9211
fc36a67e 9212 default:
9213 break;
9214 }
9215 break;
9216 }
46fc3d4c 9217
211dfcf1 9218 tryasterisk:
eb3fce90 9219 if (*q == '*') {
211dfcf1 9220 q++;
c445ea15 9221 if ( (ewix = expect_number(&q)) )
211dfcf1
HS
9222 if (*q++ != '$')
9223 goto unknown;
eb3fce90 9224 asterisk = TRUE;
211dfcf1
HS
9225 }
9226 if (*q == 'v') {
eb3fce90 9227 q++;
211dfcf1
HS
9228 if (vectorize)
9229 goto unknown;
9cbac4c7 9230 if ((vectorarg = asterisk)) {
211dfcf1
HS
9231 evix = ewix;
9232 ewix = 0;
9233 asterisk = FALSE;
9234 }
9235 vectorize = TRUE;
9236 goto tryasterisk;
eb3fce90
JH
9237 }
9238
211dfcf1 9239 if (!asterisk)
858a90f9 9240 {
7a5fa8a2 9241 if( *q == '0' )
f3583277 9242 fill = *q++;
c445ea15 9243 width = expect_number(&q);
858a90f9 9244 }
211dfcf1
HS
9245
9246 if (vectorize) {
9247 if (vectorarg) {
9248 if (args)
9249 vecsv = va_arg(*args, SV*);
7ad96abb
NC
9250 else if (evix) {
9251 vecsv = (evix > 0 && evix <= svmax)
9252 ? svargs[evix-1] : &PL_sv_undef;
9253 } else {
9254 vecsv = svix < svmax ? svargs[svix++] : &PL_sv_undef;
9255 }
245d4a47 9256 dotstr = SvPV_const(vecsv, dotstrlen);
640283f5
NC
9257 /* Keep the DO_UTF8 test *after* the SvPV call, else things go
9258 bad with tied or overloaded values that return UTF8. */
211dfcf1 9259 if (DO_UTF8(vecsv))
2cf2cfc6 9260 is_utf8 = TRUE;
640283f5
NC
9261 else if (has_utf8) {
9262 vecsv = sv_mortalcopy(vecsv);
9263 sv_utf8_upgrade(vecsv);
9264 dotstr = SvPV_const(vecsv, dotstrlen);
9265 is_utf8 = TRUE;
9266 }
211dfcf1
HS
9267 }
9268 if (args) {
8896765a 9269 VECTORIZE_ARGS
eb3fce90 9270 }
7ad96abb 9271 else if (efix ? (efix > 0 && efix <= svmax) : svix < svmax) {
211dfcf1 9272 vecsv = svargs[efix ? efix-1 : svix++];
245d4a47 9273 vecstr = (U8*)SvPV_const(vecsv,veclen);
2cf2cfc6 9274 vec_utf8 = DO_UTF8(vecsv);
96b8f7ce
JP
9275
9276 /* if this is a version object, we need to convert
9277 * back into v-string notation and then let the
9278 * vectorize happen normally
d7aa5382 9279 */
96b8f7ce
JP
9280 if (sv_derived_from(vecsv, "version")) {
9281 char *version = savesvpv(vecsv);
34ba6322
SP
9282 if ( hv_exists((HV*)SvRV(vecsv), "alpha", 5 ) ) {
9283 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
9284 "vector argument not supported with alpha versions");
9285 goto unknown;
9286 }
96b8f7ce 9287 vecsv = sv_newmortal();
65b06e02 9288 scan_vstring(version, version + veclen, vecsv);
96b8f7ce
JP
9289 vecstr = (U8*)SvPV_const(vecsv, veclen);
9290 vec_utf8 = DO_UTF8(vecsv);
9291 Safefree(version);
d7aa5382 9292 }
211dfcf1
HS
9293 }
9294 else {
9295 vecstr = (U8*)"";
9296 veclen = 0;
9297 }
eb3fce90 9298 }
fc36a67e 9299
eb3fce90 9300 if (asterisk) {
fc36a67e 9301 if (args)
9302 i = va_arg(*args, int);
9303 else
eb3fce90
JH
9304 i = (ewix ? ewix <= svmax : svix < svmax) ?
9305 SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 9306 left |= (i < 0);
9307 width = (i < 0) ? -i : i;
fc36a67e 9308 }
211dfcf1 9309 gotwidth:
fc36a67e 9310
9311 /* PRECISION */
46fc3d4c 9312
fc36a67e 9313 if (*q == '.') {
9314 q++;
9315 if (*q == '*') {
211dfcf1 9316 q++;
c445ea15 9317 if ( ((epix = expect_number(&q))) && (*q++ != '$') )
7b8dd722
HS
9318 goto unknown;
9319 /* XXX: todo, support specified precision parameter */
9320 if (epix)
211dfcf1 9321 goto unknown;
46fc3d4c 9322 if (args)
9323 i = va_arg(*args, int);
9324 else
eb3fce90
JH
9325 i = (ewix ? ewix <= svmax : svix < svmax)
9326 ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
9911cee9
TS
9327 precis = i;
9328 has_precis = !(i < 0);
fc36a67e 9329 }
9330 else {
9331 precis = 0;
9332 while (isDIGIT(*q))
9333 precis = precis * 10 + (*q++ - '0');
9911cee9 9334 has_precis = TRUE;
fc36a67e 9335 }
fc36a67e 9336 }
46fc3d4c 9337
fc36a67e 9338 /* SIZE */
46fc3d4c 9339
fc36a67e 9340 switch (*q) {
c623ac67
GS
9341#ifdef WIN32
9342 case 'I': /* Ix, I32x, and I64x */
9343# ifdef WIN64
9344 if (q[1] == '6' && q[2] == '4') {
9345 q += 3;
9346 intsize = 'q';
9347 break;
9348 }
9349# endif
9350 if (q[1] == '3' && q[2] == '2') {
9351 q += 3;
9352 break;
9353 }
9354# ifdef WIN64
9355 intsize = 'q';
9356# endif
9357 q++;
9358 break;
9359#endif
9e5b023a 9360#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
6f9bb7fd 9361 case 'L': /* Ld */
5f66b61c 9362 /*FALLTHROUGH*/
e5c81feb 9363#ifdef HAS_QUAD
6f9bb7fd 9364 case 'q': /* qd */
9e5b023a 9365#endif
6f9bb7fd
GS
9366 intsize = 'q';
9367 q++;
9368 break;
9369#endif
fc36a67e 9370 case 'l':
9e5b023a 9371#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
205f51d8 9372 if (*(q + 1) == 'l') { /* lld, llf */
fc36a67e 9373 intsize = 'q';
9374 q += 2;
46fc3d4c 9375 break;
cf2093f6 9376 }
fc36a67e 9377#endif
5f66b61c 9378 /*FALLTHROUGH*/
fc36a67e 9379 case 'h':
5f66b61c 9380 /*FALLTHROUGH*/
fc36a67e 9381 case 'V':
9382 intsize = *q++;
46fc3d4c 9383 break;
9384 }
9385
fc36a67e 9386 /* CONVERSION */
9387
211dfcf1
HS
9388 if (*q == '%') {
9389 eptr = q++;
9390 elen = 1;
26372e71
GA
9391 if (vectorize) {
9392 c = '%';
9393 goto unknown;
9394 }
211dfcf1
HS
9395 goto string;
9396 }
9397
26372e71 9398 if (!vectorize && !args) {
86c51f8b
NC
9399 if (efix) {
9400 const I32 i = efix-1;
9401 argsv = (i >= 0 && i < svmax) ? svargs[i] : &PL_sv_undef;
9402 } else {
9403 argsv = (svix >= 0 && svix < svmax)
9404 ? svargs[svix++] : &PL_sv_undef;
9405 }
863811b2 9406 }
211dfcf1 9407
46fc3d4c 9408 switch (c = *q++) {
9409
9410 /* STRINGS */
9411
46fc3d4c 9412 case 'c':
26372e71
GA
9413 if (vectorize)
9414 goto unknown;
4ea561bc 9415 uv = (args) ? va_arg(*args, int) : SvIV(argsv);
1bd104fb
JH
9416 if ((uv > 255 ||
9417 (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
0064a8a9 9418 && !IN_BYTES) {
dfe13c55 9419 eptr = (char*)utf8buf;
9041c2e3 9420 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
2cf2cfc6 9421 is_utf8 = TRUE;
7e2040f0
GS
9422 }
9423 else {
9424 c = (char)uv;
9425 eptr = &c;
9426 elen = 1;
a0ed51b3 9427 }
46fc3d4c 9428 goto string;
9429
46fc3d4c 9430 case 's':
26372e71
GA
9431 if (vectorize)
9432 goto unknown;
9433 if (args) {
fc36a67e 9434 eptr = va_arg(*args, char*);
c635e13b 9435 if (eptr)
1d7c1841
GS
9436#ifdef MACOS_TRADITIONAL
9437 /* On MacOS, %#s format is used for Pascal strings */
9438 if (alt)
9439 elen = *eptr++;
9440 else
9441#endif
c635e13b 9442 elen = strlen(eptr);
9443 else {
27da23d5 9444 eptr = (char *)nullstr;
c635e13b 9445 elen = sizeof nullstr - 1;
9446 }
46fc3d4c 9447 }
211dfcf1 9448 else {
4ea561bc 9449 eptr = SvPV_const(argsv, elen);
7e2040f0 9450 if (DO_UTF8(argsv)) {
59b61096 9451 I32 old_precis = precis;
a0ed51b3
LW
9452 if (has_precis && precis < elen) {
9453 I32 p = precis;
7e2040f0 9454 sv_pos_u2b(argsv, &p, 0); /* sticks at end */
a0ed51b3
LW
9455 precis = p;
9456 }
9457 if (width) { /* fudge width (can't fudge elen) */
59b61096
AV
9458 if (has_precis && precis < elen)
9459 width += precis - old_precis;
9460 else
9461 width += elen - sv_len_utf8(argsv);
a0ed51b3 9462 }
2cf2cfc6 9463 is_utf8 = TRUE;
a0ed51b3
LW
9464 }
9465 }
fc36a67e 9466
46fc3d4c 9467 string:
9468 if (has_precis && elen > precis)
9469 elen = precis;
9470 break;
9471
9472 /* INTEGERS */
9473
fc36a67e 9474 case 'p':
be75b157 9475 if (alt || vectorize)
c2e66d9e 9476 goto unknown;
211dfcf1 9477 uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
fc36a67e 9478 base = 16;
9479 goto integer;
9480
46fc3d4c 9481 case 'D':
29fe7a80 9482#ifdef IV_IS_QUAD
22f3ae8c 9483 intsize = 'q';
29fe7a80 9484#else
46fc3d4c 9485 intsize = 'l';
29fe7a80 9486#endif
5f66b61c 9487 /*FALLTHROUGH*/
46fc3d4c 9488 case 'd':
9489 case 'i':
8896765a
RB
9490#if vdNUMBER
9491 format_vd:
9492#endif
b22c7a20 9493 if (vectorize) {
ba210ebe 9494 STRLEN ulen;
211dfcf1
HS
9495 if (!veclen)
9496 continue;
2cf2cfc6
A
9497 if (vec_utf8)
9498 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9499 UTF8_ALLOW_ANYUV);
b22c7a20 9500 else {
e83d50c9 9501 uv = *vecstr;
b22c7a20
GS
9502 ulen = 1;
9503 }
9504 vecstr += ulen;
9505 veclen -= ulen;
e83d50c9
JP
9506 if (plus)
9507 esignbuf[esignlen++] = plus;
b22c7a20
GS
9508 }
9509 else if (args) {
46fc3d4c 9510 switch (intsize) {
9511 case 'h': iv = (short)va_arg(*args, int); break;
46fc3d4c 9512 case 'l': iv = va_arg(*args, long); break;
fc36a67e 9513 case 'V': iv = va_arg(*args, IV); break;
b10c0dba 9514 default: iv = va_arg(*args, int); break;
cf2093f6
JH
9515#ifdef HAS_QUAD
9516 case 'q': iv = va_arg(*args, Quad_t); break;
9517#endif
46fc3d4c 9518 }
9519 }
9520 else {
4ea561bc 9521 IV tiv = SvIV(argsv); /* work around GCC bug #13488 */
46fc3d4c 9522 switch (intsize) {
b10c0dba
MHM
9523 case 'h': iv = (short)tiv; break;
9524 case 'l': iv = (long)tiv; break;
9525 case 'V':
9526 default: iv = tiv; break;
cf2093f6 9527#ifdef HAS_QUAD
b10c0dba 9528 case 'q': iv = (Quad_t)tiv; break;
cf2093f6 9529#endif
46fc3d4c 9530 }
9531 }
e83d50c9
JP
9532 if ( !vectorize ) /* we already set uv above */
9533 {
9534 if (iv >= 0) {
9535 uv = iv;
9536 if (plus)
9537 esignbuf[esignlen++] = plus;
9538 }
9539 else {
9540 uv = -iv;
9541 esignbuf[esignlen++] = '-';
9542 }
46fc3d4c 9543 }
9544 base = 10;
9545 goto integer;
9546
fc36a67e 9547 case 'U':
29fe7a80 9548#ifdef IV_IS_QUAD
22f3ae8c 9549 intsize = 'q';
29fe7a80 9550#else
fc36a67e 9551 intsize = 'l';
29fe7a80 9552#endif
5f66b61c 9553 /*FALLTHROUGH*/
fc36a67e 9554 case 'u':
9555 base = 10;
9556 goto uns_integer;
9557
7ff06cc7 9558 case 'B':
4f19785b
WSI
9559 case 'b':
9560 base = 2;
9561 goto uns_integer;
9562
46fc3d4c 9563 case 'O':
29fe7a80 9564#ifdef IV_IS_QUAD
22f3ae8c 9565 intsize = 'q';
29fe7a80 9566#else
46fc3d4c 9567 intsize = 'l';
29fe7a80 9568#endif
5f66b61c 9569 /*FALLTHROUGH*/
46fc3d4c 9570 case 'o':
9571 base = 8;
9572 goto uns_integer;
9573
9574 case 'X':
46fc3d4c 9575 case 'x':
9576 base = 16;
46fc3d4c 9577
9578 uns_integer:
b22c7a20 9579 if (vectorize) {
ba210ebe 9580 STRLEN ulen;
b22c7a20 9581 vector:
211dfcf1
HS
9582 if (!veclen)
9583 continue;
2cf2cfc6
A
9584 if (vec_utf8)
9585 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9586 UTF8_ALLOW_ANYUV);
b22c7a20 9587 else {
a05b299f 9588 uv = *vecstr;
b22c7a20
GS
9589 ulen = 1;
9590 }
9591 vecstr += ulen;
9592 veclen -= ulen;
9593 }
9594 else if (args) {
46fc3d4c 9595 switch (intsize) {
9596 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
46fc3d4c 9597 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 9598 case 'V': uv = va_arg(*args, UV); break;
b10c0dba 9599 default: uv = va_arg(*args, unsigned); break;
cf2093f6 9600#ifdef HAS_QUAD
9e3321a5 9601 case 'q': uv = va_arg(*args, Uquad_t); break;
cf2093f6 9602#endif
46fc3d4c 9603 }
9604 }
9605 else {
4ea561bc 9606 UV tuv = SvUV(argsv); /* work around GCC bug #13488 */
46fc3d4c 9607 switch (intsize) {
b10c0dba
MHM
9608 case 'h': uv = (unsigned short)tuv; break;
9609 case 'l': uv = (unsigned long)tuv; break;
9610 case 'V':
9611 default: uv = tuv; break;
cf2093f6 9612#ifdef HAS_QUAD
b10c0dba 9613 case 'q': uv = (Uquad_t)tuv; break;
cf2093f6 9614#endif
46fc3d4c 9615 }
9616 }
9617
9618 integer:
4d84ee25
NC
9619 {
9620 char *ptr = ebuf + sizeof ebuf;
1387f30c
DD
9621 bool tempalt = uv ? alt : FALSE; /* Vectors can't change alt */
9622 zeros = 0;
9623
4d84ee25
NC
9624 switch (base) {
9625 unsigned dig;
9626 case 16:
14eb61ab 9627 p = (char *)((c == 'X') ? PL_hexdigit + 16 : PL_hexdigit);
4d84ee25
NC
9628 do {
9629 dig = uv & 15;
9630 *--ptr = p[dig];
9631 } while (uv >>= 4);
1387f30c 9632 if (tempalt) {
4d84ee25
NC
9633 esignbuf[esignlen++] = '0';
9634 esignbuf[esignlen++] = c; /* 'x' or 'X' */
9635 }
9636 break;
9637 case 8:
9638 do {
9639 dig = uv & 7;
9640 *--ptr = '0' + dig;
9641 } while (uv >>= 3);
9642 if (alt && *ptr != '0')
9643 *--ptr = '0';
9644 break;
9645 case 2:
9646 do {
9647 dig = uv & 1;
9648 *--ptr = '0' + dig;
9649 } while (uv >>= 1);
1387f30c 9650 if (tempalt) {
4d84ee25 9651 esignbuf[esignlen++] = '0';
7ff06cc7 9652 esignbuf[esignlen++] = c;
4d84ee25
NC
9653 }
9654 break;
9655 default: /* it had better be ten or less */
9656 do {
9657 dig = uv % base;
9658 *--ptr = '0' + dig;
9659 } while (uv /= base);
9660 break;
46fc3d4c 9661 }
4d84ee25
NC
9662 elen = (ebuf + sizeof ebuf) - ptr;
9663 eptr = ptr;
9664 if (has_precis) {
9665 if (precis > elen)
9666 zeros = precis - elen;
e6bb52fd
TS
9667 else if (precis == 0 && elen == 1 && *eptr == '0'
9668 && !(base == 8 && alt)) /* "%#.0o" prints "0" */
4d84ee25 9669 elen = 0;
9911cee9
TS
9670
9671 /* a precision nullifies the 0 flag. */
9672 if (fill == '0')
9673 fill = ' ';
eda88b6d 9674 }
c10ed8b9 9675 }
46fc3d4c 9676 break;
9677
9678 /* FLOATING POINT */
9679
fc36a67e 9680 case 'F':
9681 c = 'f'; /* maybe %F isn't supported here */
5f66b61c 9682 /*FALLTHROUGH*/
46fc3d4c 9683 case 'e': case 'E':
fc36a67e 9684 case 'f':
46fc3d4c 9685 case 'g': case 'G':
26372e71
GA
9686 if (vectorize)
9687 goto unknown;
46fc3d4c 9688
9689 /* This is evil, but floating point is even more evil */
9690
9e5b023a
JH
9691 /* for SV-style calling, we can only get NV
9692 for C-style calling, we assume %f is double;
9693 for simplicity we allow any of %Lf, %llf, %qf for long double
9694 */
9695 switch (intsize) {
9696 case 'V':
9697#if defined(USE_LONG_DOUBLE)
9698 intsize = 'q';
9699#endif
9700 break;
8a2e3f14 9701/* [perl #20339] - we should accept and ignore %lf rather than die */
00e17364 9702 case 'l':
5f66b61c 9703 /*FALLTHROUGH*/
9e5b023a
JH
9704 default:
9705#if defined(USE_LONG_DOUBLE)
9706 intsize = args ? 0 : 'q';
9707#endif
9708 break;
9709 case 'q':
9710#if defined(HAS_LONG_DOUBLE)
9711 break;
9712#else
5f66b61c 9713 /*FALLTHROUGH*/
9e5b023a
JH
9714#endif
9715 case 'h':
9e5b023a
JH
9716 goto unknown;
9717 }
9718
9719 /* now we need (long double) if intsize == 'q', else (double) */
26372e71 9720 nv = (args) ?
35fff930
JH
9721#if LONG_DOUBLESIZE > DOUBLESIZE
9722 intsize == 'q' ?
205f51d8
AS
9723 va_arg(*args, long double) :
9724 va_arg(*args, double)
35fff930 9725#else
205f51d8 9726 va_arg(*args, double)
35fff930 9727#endif
4ea561bc 9728 : SvNV(argsv);
fc36a67e 9729
9730 need = 0;
3952c29a
NC
9731 /* nv * 0 will be NaN for NaN, +Inf and -Inf, and 0 for anything
9732 else. frexp() has some unspecified behaviour for those three */
9733 if (c != 'e' && c != 'E' && (nv * 0) == 0) {
fc36a67e 9734 i = PERL_INT_MIN;
9e5b023a
JH
9735 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
9736 will cast our (long double) to (double) */
73b309ea 9737 (void)Perl_frexp(nv, &i);
fc36a67e 9738 if (i == PERL_INT_MIN)
cea2e8a9 9739 Perl_die(aTHX_ "panic: frexp");
c635e13b 9740 if (i > 0)
fc36a67e 9741 need = BIT_DIGITS(i);
9742 }
9743 need += has_precis ? precis : 6; /* known default */
20f6aaab 9744
fc36a67e 9745 if (need < width)
9746 need = width;
9747
20f6aaab
AS
9748#ifdef HAS_LDBL_SPRINTF_BUG
9749 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8
AS
9750 with sfio - Allen <allens@cpan.org> */
9751
9752# ifdef DBL_MAX
9753# define MY_DBL_MAX DBL_MAX
9754# else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
9755# if DOUBLESIZE >= 8
9756# define MY_DBL_MAX 1.7976931348623157E+308L
9757# else
9758# define MY_DBL_MAX 3.40282347E+38L
9759# endif
9760# endif
9761
9762# ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
9763# define MY_DBL_MAX_BUG 1L
20f6aaab 9764# else
205f51d8 9765# define MY_DBL_MAX_BUG MY_DBL_MAX
20f6aaab 9766# endif
20f6aaab 9767
205f51d8
AS
9768# ifdef DBL_MIN
9769# define MY_DBL_MIN DBL_MIN
9770# else /* XXX guessing! -Allen */
9771# if DOUBLESIZE >= 8
9772# define MY_DBL_MIN 2.2250738585072014E-308L
9773# else
9774# define MY_DBL_MIN 1.17549435E-38L
9775# endif
9776# endif
20f6aaab 9777
205f51d8
AS
9778 if ((intsize == 'q') && (c == 'f') &&
9779 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
9780 (need < DBL_DIG)) {
9781 /* it's going to be short enough that
9782 * long double precision is not needed */
9783
9784 if ((nv <= 0L) && (nv >= -0L))
9785 fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
9786 else {
9787 /* would use Perl_fp_class as a double-check but not
9788 * functional on IRIX - see perl.h comments */
9789
9790 if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
9791 /* It's within the range that a double can represent */
9792#if defined(DBL_MAX) && !defined(DBL_MIN)
9793 if ((nv >= ((long double)1/DBL_MAX)) ||
9794 (nv <= (-(long double)1/DBL_MAX)))
20f6aaab 9795#endif
205f51d8 9796 fix_ldbl_sprintf_bug = TRUE;
20f6aaab 9797 }
205f51d8
AS
9798 }
9799 if (fix_ldbl_sprintf_bug == TRUE) {
9800 double temp;
9801
9802 intsize = 0;
9803 temp = (double)nv;
9804 nv = (NV)temp;
9805 }
20f6aaab 9806 }
205f51d8
AS
9807
9808# undef MY_DBL_MAX
9809# undef MY_DBL_MAX_BUG
9810# undef MY_DBL_MIN
9811
20f6aaab
AS
9812#endif /* HAS_LDBL_SPRINTF_BUG */
9813
46fc3d4c 9814 need += 20; /* fudge factor */
80252599
GS
9815 if (PL_efloatsize < need) {
9816 Safefree(PL_efloatbuf);
9817 PL_efloatsize = need + 20; /* more fudge */
a02a5408 9818 Newx(PL_efloatbuf, PL_efloatsize, char);
7d5ea4e7 9819 PL_efloatbuf[0] = '\0';
46fc3d4c 9820 }
9821
4151a5fe
IZ
9822 if ( !(width || left || plus || alt) && fill != '0'
9823 && has_precis && intsize != 'q' ) { /* Shortcuts */
2873255c
NC
9824 /* See earlier comment about buggy Gconvert when digits,
9825 aka precis is 0 */
9826 if ( c == 'g' && precis) {
2e59c212 9827 Gconvert((NV)nv, (int)precis, 0, PL_efloatbuf);
4150c189
NC
9828 /* May return an empty string for digits==0 */
9829 if (*PL_efloatbuf) {
9830 elen = strlen(PL_efloatbuf);
4151a5fe 9831 goto float_converted;
4150c189 9832 }
4151a5fe
IZ
9833 } else if ( c == 'f' && !precis) {
9834 if ((eptr = F0convert(nv, ebuf + sizeof ebuf, &elen)))
9835 break;
9836 }
9837 }
4d84ee25
NC
9838 {
9839 char *ptr = ebuf + sizeof ebuf;
9840 *--ptr = '\0';
9841 *--ptr = c;
9842 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
9e5b023a 9843#if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
4d84ee25
NC
9844 if (intsize == 'q') {
9845 /* Copy the one or more characters in a long double
9846 * format before the 'base' ([efgEFG]) character to
9847 * the format string. */
9848 static char const prifldbl[] = PERL_PRIfldbl;
9849 char const *p = prifldbl + sizeof(prifldbl) - 3;
9850 while (p >= prifldbl) { *--ptr = *p--; }
9851 }
65202027 9852#endif
4d84ee25
NC
9853 if (has_precis) {
9854 base = precis;
9855 do { *--ptr = '0' + (base % 10); } while (base /= 10);
9856 *--ptr = '.';
9857 }
9858 if (width) {
9859 base = width;
9860 do { *--ptr = '0' + (base % 10); } while (base /= 10);
9861 }
9862 if (fill == '0')
9863 *--ptr = fill;
9864 if (left)
9865 *--ptr = '-';
9866 if (plus)
9867 *--ptr = plus;
9868 if (alt)
9869 *--ptr = '#';
9870 *--ptr = '%';
9871
9872 /* No taint. Otherwise we are in the strange situation
9873 * where printf() taints but print($float) doesn't.
9874 * --jhi */
9e5b023a 9875#if defined(HAS_LONG_DOUBLE)
4150c189 9876 elen = ((intsize == 'q')
d9fad198
JH
9877 ? my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, nv)
9878 : my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, (double)nv));
9e5b023a 9879#else
4150c189 9880 elen = my_sprintf(PL_efloatbuf, ptr, nv);
9e5b023a 9881#endif
4d84ee25 9882 }
4151a5fe 9883 float_converted:
80252599 9884 eptr = PL_efloatbuf;
46fc3d4c 9885 break;
9886
fc36a67e 9887 /* SPECIAL */
9888
9889 case 'n':
26372e71
GA
9890 if (vectorize)
9891 goto unknown;
fc36a67e 9892 i = SvCUR(sv) - origlen;
26372e71 9893 if (args) {
c635e13b 9894 switch (intsize) {
9895 case 'h': *(va_arg(*args, short*)) = i; break;
9896 default: *(va_arg(*args, int*)) = i; break;
9897 case 'l': *(va_arg(*args, long*)) = i; break;
9898 case 'V': *(va_arg(*args, IV*)) = i; break;
cf2093f6
JH
9899#ifdef HAS_QUAD
9900 case 'q': *(va_arg(*args, Quad_t*)) = i; break;
9901#endif
c635e13b 9902 }
fc36a67e 9903 }
9dd79c3f 9904 else
211dfcf1 9905 sv_setuv_mg(argsv, (UV)i);
fc36a67e 9906 continue; /* not "break" */
9907
9908 /* UNKNOWN */
9909
46fc3d4c 9910 default:
fc36a67e 9911 unknown:
041457d9
DM
9912 if (!args
9913 && (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)
9914 && ckWARN(WARN_PRINTF))
9915 {
c4420975 9916 SV * const msg = sv_newmortal();
35c1215d
NC
9917 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
9918 (PL_op->op_type == OP_PRTF) ? "" : "s");
0f4b6630 9919 if (c) {
0f4b6630 9920 if (isPRINT(c))
1c846c1f 9921 Perl_sv_catpvf(aTHX_ msg,
0f4b6630
JH
9922 "\"%%%c\"", c & 0xFF);
9923 else
9924 Perl_sv_catpvf(aTHX_ msg,
57def98f 9925 "\"%%\\%03"UVof"\"",
0f4b6630 9926 (UV)c & 0xFF);
0f4b6630 9927 } else
396482e1 9928 sv_catpvs(msg, "end of string");
be2597df 9929 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, SVfARG(msg)); /* yes, this is reentrant */
c635e13b 9930 }
fb73857a 9931
9932 /* output mangled stuff ... */
9933 if (c == '\0')
9934 --q;
46fc3d4c 9935 eptr = p;
9936 elen = q - p;
fb73857a 9937
9938 /* ... right here, because formatting flags should not apply */
9939 SvGROW(sv, SvCUR(sv) + elen + 1);
9940 p = SvEND(sv);
4459522c 9941 Copy(eptr, p, elen, char);
fb73857a 9942 p += elen;
9943 *p = '\0';
3f7c398e 9944 SvCUR_set(sv, p - SvPVX_const(sv));
58e33a90 9945 svix = osvix;
fb73857a 9946 continue; /* not "break" */
46fc3d4c 9947 }
9948
cc61b222
TS
9949 if (is_utf8 != has_utf8) {
9950 if (is_utf8) {
9951 if (SvCUR(sv))
9952 sv_utf8_upgrade(sv);
9953 }
9954 else {
9955 const STRLEN old_elen = elen;
59cd0e26 9956 SV * const nsv = newSVpvn_flags(eptr, elen, SVs_TEMP);
cc61b222
TS
9957 sv_utf8_upgrade(nsv);
9958 eptr = SvPVX_const(nsv);
9959 elen = SvCUR(nsv);
9960
9961 if (width) { /* fudge width (can't fudge elen) */
9962 width += elen - old_elen;
9963 }
9964 is_utf8 = TRUE;
9965 }
9966 }
9967
6c94ec8b 9968 have = esignlen + zeros + elen;
ed2b91d2
GA
9969 if (have < zeros)
9970 Perl_croak_nocontext(PL_memory_wrap);
6c94ec8b 9971
46fc3d4c 9972 need = (have > width ? have : width);
9973 gap = need - have;
9974
d2641cbd
PC
9975 if (need >= (((STRLEN)~0) - SvCUR(sv) - dotstrlen - 1))
9976 Perl_croak_nocontext(PL_memory_wrap);
b22c7a20 9977 SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
46fc3d4c 9978 p = SvEND(sv);
9979 if (esignlen && fill == '0') {
53c1dcc0 9980 int i;
eb160463 9981 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 9982 *p++ = esignbuf[i];
9983 }
9984 if (gap && !left) {
9985 memset(p, fill, gap);
9986 p += gap;
9987 }
9988 if (esignlen && fill != '0') {
53c1dcc0 9989 int i;
eb160463 9990 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 9991 *p++ = esignbuf[i];
9992 }
fc36a67e 9993 if (zeros) {
53c1dcc0 9994 int i;
fc36a67e 9995 for (i = zeros; i; i--)
9996 *p++ = '0';
9997 }
46fc3d4c 9998 if (elen) {
4459522c 9999 Copy(eptr, p, elen, char);
46fc3d4c 10000 p += elen;
10001 }
10002 if (gap && left) {
10003 memset(p, ' ', gap);
10004 p += gap;
10005 }
b22c7a20
GS
10006 if (vectorize) {
10007 if (veclen) {
4459522c 10008 Copy(dotstr, p, dotstrlen, char);
b22c7a20
GS
10009 p += dotstrlen;
10010 }
10011 else
10012 vectorize = FALSE; /* done iterating over vecstr */
10013 }
2cf2cfc6
A
10014 if (is_utf8)
10015 has_utf8 = TRUE;
10016 if (has_utf8)
7e2040f0 10017 SvUTF8_on(sv);
46fc3d4c 10018 *p = '\0';
3f7c398e 10019 SvCUR_set(sv, p - SvPVX_const(sv));
b22c7a20
GS
10020 if (vectorize) {
10021 esignlen = 0;
10022 goto vector;
10023 }
46fc3d4c 10024 }
10025}
51371543 10026
645c22ef
DM
10027/* =========================================================================
10028
10029=head1 Cloning an interpreter
10030
10031All the macros and functions in this section are for the private use of
10032the main function, perl_clone().
10033
f2fc5c80 10034The foo_dup() functions make an exact copy of an existing foo thingy.
645c22ef
DM
10035During the course of a cloning, a hash table is used to map old addresses
10036to new addresses. The table is created and manipulated with the
10037ptr_table_* functions.
10038
10039=cut
10040
10041============================================================================*/
10042
10043
1d7c1841
GS
10044#if defined(USE_ITHREADS)
10045
d4c19fe8 10046/* XXX Remove this so it doesn't have to go thru the macro and return for nothing */
1d7c1841
GS
10047#ifndef GpREFCNT_inc
10048# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
10049#endif
10050
10051
a41cc44e 10052/* Certain cases in Perl_ss_dup have been merged, by relying on the fact
3e07292d
NC
10053 that currently av_dup, gv_dup and hv_dup are the same as sv_dup.
10054 If this changes, please unmerge ss_dup. */
d2d73c3e 10055#define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
7f466ec7 10056#define sv_dup_inc_NN(s,t) SvREFCNT_inc_NN(sv_dup(s,t))
d2d73c3e
AB
10057#define av_dup(s,t) (AV*)sv_dup((SV*)s,t)
10058#define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
10059#define hv_dup(s,t) (HV*)sv_dup((SV*)s,t)
10060#define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
10061#define cv_dup(s,t) (CV*)sv_dup((SV*)s,t)
10062#define cv_dup_inc(s,t) (CV*)SvREFCNT_inc(sv_dup((SV*)s,t))
10063#define io_dup(s,t) (IO*)sv_dup((SV*)s,t)
10064#define io_dup_inc(s,t) (IO*)SvREFCNT_inc(sv_dup((SV*)s,t))
10065#define gv_dup(s,t) (GV*)sv_dup((SV*)s,t)
10066#define gv_dup_inc(s,t) (GV*)SvREFCNT_inc(sv_dup((SV*)s,t))
6136c704
AL
10067#define SAVEPV(p) ((p) ? savepv(p) : NULL)
10068#define SAVEPVN(p,n) ((p) ? savepvn(p,n) : NULL)
8cf8f3d1 10069
199e78b7
DM
10070/* clone a parser */
10071
10072yy_parser *
66ceb532 10073Perl_parser_dup(pTHX_ const yy_parser *const proto, CLONE_PARAMS *const param)
199e78b7
DM
10074{
10075 yy_parser *parser;
10076
7918f24d
NC
10077 PERL_ARGS_ASSERT_PARSER_DUP;
10078
199e78b7
DM
10079 if (!proto)
10080 return NULL;
10081
7c197c94
DM
10082 /* look for it in the table first */
10083 parser = (yy_parser *)ptr_table_fetch(PL_ptr_table, proto);
10084 if (parser)
10085 return parser;
10086
10087 /* create anew and remember what it is */
199e78b7 10088 Newxz(parser, 1, yy_parser);
7c197c94 10089 ptr_table_store(PL_ptr_table, proto, parser);
199e78b7
DM
10090
10091 parser->yyerrstatus = 0;
10092 parser->yychar = YYEMPTY; /* Cause a token to be read. */
10093
10094 /* XXX these not yet duped */
10095 parser->old_parser = NULL;
10096 parser->stack = NULL;
10097 parser->ps = NULL;
10098 parser->stack_size = 0;
10099 /* XXX parser->stack->state = 0; */
10100
10101 /* XXX eventually, just Copy() most of the parser struct ? */
10102
10103 parser->lex_brackets = proto->lex_brackets;
10104 parser->lex_casemods = proto->lex_casemods;
10105 parser->lex_brackstack = savepvn(proto->lex_brackstack,
10106 (proto->lex_brackets < 120 ? 120 : proto->lex_brackets));
10107 parser->lex_casestack = savepvn(proto->lex_casestack,
10108 (proto->lex_casemods < 12 ? 12 : proto->lex_casemods));
10109 parser->lex_defer = proto->lex_defer;
10110 parser->lex_dojoin = proto->lex_dojoin;
10111 parser->lex_expect = proto->lex_expect;
10112 parser->lex_formbrack = proto->lex_formbrack;
10113 parser->lex_inpat = proto->lex_inpat;
10114 parser->lex_inwhat = proto->lex_inwhat;
10115 parser->lex_op = proto->lex_op;
10116 parser->lex_repl = sv_dup_inc(proto->lex_repl, param);
10117 parser->lex_starts = proto->lex_starts;
10118 parser->lex_stuff = sv_dup_inc(proto->lex_stuff, param);
10119 parser->multi_close = proto->multi_close;
10120 parser->multi_open = proto->multi_open;
10121 parser->multi_start = proto->multi_start;
670a9cb2 10122 parser->multi_end = proto->multi_end;
199e78b7
DM
10123 parser->pending_ident = proto->pending_ident;
10124 parser->preambled = proto->preambled;
10125 parser->sublex_info = proto->sublex_info; /* XXX not quite right */
bdc0bf6f 10126 parser->linestr = sv_dup_inc(proto->linestr, param);
53a7735b
DM
10127 parser->expect = proto->expect;
10128 parser->copline = proto->copline;
f06b5848 10129 parser->last_lop_op = proto->last_lop_op;
bc177e6b 10130 parser->lex_state = proto->lex_state;
2f9285f8 10131 parser->rsfp = fp_dup(proto->rsfp, '<', param);
5486870f
DM
10132 /* rsfp_filters entries have fake IoDIRP() */
10133 parser->rsfp_filters= av_dup_inc(proto->rsfp_filters, param);
12bd6ede
DM
10134 parser->in_my = proto->in_my;
10135 parser->in_my_stash = hv_dup(proto->in_my_stash, param);
13765c85 10136 parser->error_count = proto->error_count;
bc177e6b 10137
53a7735b 10138
f06b5848
DM
10139 parser->linestr = sv_dup_inc(proto->linestr, param);
10140
10141 {
1e05feb3
AL
10142 char * const ols = SvPVX(proto->linestr);
10143 char * const ls = SvPVX(parser->linestr);
f06b5848
DM
10144
10145 parser->bufptr = ls + (proto->bufptr >= ols ?
10146 proto->bufptr - ols : 0);
10147 parser->oldbufptr = ls + (proto->oldbufptr >= ols ?
10148 proto->oldbufptr - ols : 0);
10149 parser->oldoldbufptr= ls + (proto->oldoldbufptr >= ols ?
10150 proto->oldoldbufptr - ols : 0);
10151 parser->linestart = ls + (proto->linestart >= ols ?
10152 proto->linestart - ols : 0);
10153 parser->last_uni = ls + (proto->last_uni >= ols ?
10154 proto->last_uni - ols : 0);
10155 parser->last_lop = ls + (proto->last_lop >= ols ?
10156 proto->last_lop - ols : 0);
10157
10158 parser->bufend = ls + SvCUR(parser->linestr);
10159 }
199e78b7 10160
14047fc9
DM
10161 Copy(proto->tokenbuf, parser->tokenbuf, 256, char);
10162
2f9285f8 10163
199e78b7
DM
10164#ifdef PERL_MAD
10165 parser->endwhite = proto->endwhite;
10166 parser->faketokens = proto->faketokens;
10167 parser->lasttoke = proto->lasttoke;
10168 parser->nextwhite = proto->nextwhite;
10169 parser->realtokenstart = proto->realtokenstart;
10170 parser->skipwhite = proto->skipwhite;
10171 parser->thisclose = proto->thisclose;
10172 parser->thismad = proto->thismad;
10173 parser->thisopen = proto->thisopen;
10174 parser->thisstuff = proto->thisstuff;
10175 parser->thistoken = proto->thistoken;
10176 parser->thiswhite = proto->thiswhite;
fb205e7a
DM
10177
10178 Copy(proto->nexttoke, parser->nexttoke, 5, NEXTTOKE);
10179 parser->curforce = proto->curforce;
10180#else
10181 Copy(proto->nextval, parser->nextval, 5, YYSTYPE);
10182 Copy(proto->nexttype, parser->nexttype, 5, I32);
10183 parser->nexttoke = proto->nexttoke;
199e78b7
DM
10184#endif
10185 return parser;
10186}
10187
d2d73c3e 10188
d2d73c3e 10189/* duplicate a file handle */
645c22ef 10190
1d7c1841 10191PerlIO *
3be3cdd6 10192Perl_fp_dup(pTHX_ PerlIO *const fp, const char type, CLONE_PARAMS *const param)
1d7c1841
GS
10193{
10194 PerlIO *ret;
53c1dcc0 10195
7918f24d 10196 PERL_ARGS_ASSERT_FP_DUP;
53c1dcc0 10197 PERL_UNUSED_ARG(type);
73d840c0 10198
1d7c1841
GS
10199 if (!fp)
10200 return (PerlIO*)NULL;
10201
10202 /* look for it in the table first */
10203 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
10204 if (ret)
10205 return ret;
10206
10207 /* create anew and remember what it is */
ecdeb87c 10208 ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
1d7c1841
GS
10209 ptr_table_store(PL_ptr_table, fp, ret);
10210 return ret;
10211}
10212
645c22ef
DM
10213/* duplicate a directory handle */
10214
1d7c1841 10215DIR *
66ceb532 10216Perl_dirp_dup(pTHX_ DIR *const dp)
1d7c1841 10217{
96a5add6 10218 PERL_UNUSED_CONTEXT;
1d7c1841
GS
10219 if (!dp)
10220 return (DIR*)NULL;
10221 /* XXX TODO */
10222 return dp;
10223}
10224
ff276b08 10225/* duplicate a typeglob */
645c22ef 10226
1d7c1841 10227GP *
66ceb532 10228Perl_gp_dup(pTHX_ GP *const gp, CLONE_PARAMS *const param)
1d7c1841
GS
10229{
10230 GP *ret;
b37c2d43 10231
7918f24d
NC
10232 PERL_ARGS_ASSERT_GP_DUP;
10233
1d7c1841
GS
10234 if (!gp)
10235 return (GP*)NULL;
10236 /* look for it in the table first */
10237 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
10238 if (ret)
10239 return ret;
10240
10241 /* create anew and remember what it is */
a02a5408 10242 Newxz(ret, 1, GP);
1d7c1841
GS
10243 ptr_table_store(PL_ptr_table, gp, ret);
10244
10245 /* clone */
10246 ret->gp_refcnt = 0; /* must be before any other dups! */
d2d73c3e
AB
10247 ret->gp_sv = sv_dup_inc(gp->gp_sv, param);
10248 ret->gp_io = io_dup_inc(gp->gp_io, param);
10249 ret->gp_form = cv_dup_inc(gp->gp_form, param);
10250 ret->gp_av = av_dup_inc(gp->gp_av, param);
10251 ret->gp_hv = hv_dup_inc(gp->gp_hv, param);
10252 ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
10253 ret->gp_cv = cv_dup_inc(gp->gp_cv, param);
1d7c1841 10254 ret->gp_cvgen = gp->gp_cvgen;
1d7c1841 10255 ret->gp_line = gp->gp_line;
f4890806 10256 ret->gp_file_hek = hek_dup(gp->gp_file_hek, param);
1d7c1841
GS
10257 return ret;
10258}
10259
645c22ef
DM
10260/* duplicate a chain of magic */
10261
1d7c1841 10262MAGIC *
b88ec9b8 10263Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS *const param)
1d7c1841 10264{
cb359b41
JH
10265 MAGIC *mgprev = (MAGIC*)NULL;
10266 MAGIC *mgret;
7918f24d
NC
10267
10268 PERL_ARGS_ASSERT_MG_DUP;
10269
1d7c1841
GS
10270 if (!mg)
10271 return (MAGIC*)NULL;
10272 /* look for it in the table first */
10273 mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
10274 if (mgret)
10275 return mgret;
10276
10277 for (; mg; mg = mg->mg_moremagic) {
10278 MAGIC *nmg;
a02a5408 10279 Newxz(nmg, 1, MAGIC);
cb359b41 10280 if (mgprev)
1d7c1841 10281 mgprev->mg_moremagic = nmg;
cb359b41
JH
10282 else
10283 mgret = nmg;
1d7c1841
GS
10284 nmg->mg_virtual = mg->mg_virtual; /* XXX copy dynamic vtable? */
10285 nmg->mg_private = mg->mg_private;
10286 nmg->mg_type = mg->mg_type;
10287 nmg->mg_flags = mg->mg_flags;
288b8c02 10288 /* FIXME for plugins
14befaf4 10289 if (mg->mg_type == PERL_MAGIC_qr) {
f8149455 10290 nmg->mg_obj = (SV*)CALLREGDUPE((REGEXP*)mg->mg_obj, param);
1d7c1841 10291 }
288b8c02
NC
10292 else
10293 */
10294 if(mg->mg_type == PERL_MAGIC_backref) {
d7cbc7b5
NC
10295 /* The backref AV has its reference count deliberately bumped by
10296 1. */
10297 nmg->mg_obj = SvREFCNT_inc(av_dup_inc((AV*) mg->mg_obj, param));
05bd4103 10298 }
1d7c1841
GS
10299 else {
10300 nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
d2d73c3e
AB
10301 ? sv_dup_inc(mg->mg_obj, param)
10302 : sv_dup(mg->mg_obj, param);
1d7c1841
GS
10303 }
10304 nmg->mg_len = mg->mg_len;
10305 nmg->mg_ptr = mg->mg_ptr; /* XXX random ptr? */
14befaf4 10306 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
68795e93 10307 if (mg->mg_len > 0) {
1d7c1841 10308 nmg->mg_ptr = SAVEPVN(mg->mg_ptr, mg->mg_len);
14befaf4
DM
10309 if (mg->mg_type == PERL_MAGIC_overload_table &&
10310 AMT_AMAGIC((AMT*)mg->mg_ptr))
10311 {
c445ea15 10312 const AMT * const amtp = (AMT*)mg->mg_ptr;
0bcc34c2 10313 AMT * const namtp = (AMT*)nmg->mg_ptr;
1d7c1841
GS
10314 I32 i;
10315 for (i = 1; i < NofAMmeth; i++) {
d2d73c3e 10316 namtp->table[i] = cv_dup_inc(amtp->table[i], param);
1d7c1841
GS
10317 }
10318 }
10319 }
10320 else if (mg->mg_len == HEf_SVKEY)
d2d73c3e 10321 nmg->mg_ptr = (char*)sv_dup_inc((SV*)mg->mg_ptr, param);
1d7c1841 10322 }
68795e93
NIS
10323 if ((mg->mg_flags & MGf_DUP) && mg->mg_virtual && mg->mg_virtual->svt_dup) {
10324 CALL_FPTR(nmg->mg_virtual->svt_dup)(aTHX_ nmg, param);
10325 }
1d7c1841
GS
10326 mgprev = nmg;
10327 }
10328 return mgret;
10329}
10330
4674ade5
NC
10331#endif /* USE_ITHREADS */
10332
645c22ef
DM
10333/* create a new pointer-mapping table */
10334
1d7c1841
GS
10335PTR_TBL_t *
10336Perl_ptr_table_new(pTHX)
10337{
10338 PTR_TBL_t *tbl;
96a5add6
AL
10339 PERL_UNUSED_CONTEXT;
10340
a02a5408 10341 Newxz(tbl, 1, PTR_TBL_t);
1d7c1841
GS
10342 tbl->tbl_max = 511;
10343 tbl->tbl_items = 0;
a02a5408 10344 Newxz(tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
1d7c1841
GS
10345 return tbl;
10346}
10347
7119fd33
NC
10348#define PTR_TABLE_HASH(ptr) \
10349 ((PTR2UV(ptr) >> 3) ^ (PTR2UV(ptr) >> (3 + 7)) ^ (PTR2UV(ptr) >> (3 + 17)))
134ca3d6 10350
93e68bfb
JC
10351/*
10352 we use the PTE_SVSLOT 'reservation' made above, both here (in the
10353 following define) and at call to new_body_inline made below in
10354 Perl_ptr_table_store()
10355 */
10356
10357#define del_pte(p) del_body_type(p, PTE_SVSLOT)
32e691d0 10358
645c22ef
DM
10359/* map an existing pointer using a table */
10360
7bf61b54 10361STATIC PTR_TBL_ENT_t *
1eb6e4ca 10362S_ptr_table_find(PTR_TBL_t *const tbl, const void *const sv)
7918f24d 10363{
1d7c1841 10364 PTR_TBL_ENT_t *tblent;
4373e329 10365 const UV hash = PTR_TABLE_HASH(sv);
7918f24d
NC
10366
10367 PERL_ARGS_ASSERT_PTR_TABLE_FIND;
10368
1d7c1841
GS
10369 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
10370 for (; tblent; tblent = tblent->next) {
10371 if (tblent->oldval == sv)
7bf61b54 10372 return tblent;
1d7c1841 10373 }
d4c19fe8 10374 return NULL;
7bf61b54
NC
10375}
10376
10377void *
1eb6e4ca 10378Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *const tbl, const void *const sv)
7bf61b54 10379{
b0e6ae5b 10380 PTR_TBL_ENT_t const *const tblent = ptr_table_find(tbl, sv);
7918f24d
NC
10381
10382 PERL_ARGS_ASSERT_PTR_TABLE_FETCH;
96a5add6 10383 PERL_UNUSED_CONTEXT;
7918f24d 10384
d4c19fe8 10385 return tblent ? tblent->newval : NULL;
1d7c1841
GS
10386}
10387
645c22ef
DM
10388/* add a new entry to a pointer-mapping table */
10389
1d7c1841 10390void
1eb6e4ca 10391Perl_ptr_table_store(pTHX_ PTR_TBL_t *const tbl, const void *const oldsv, void *const newsv)
1d7c1841 10392{
0c9fdfe0 10393 PTR_TBL_ENT_t *tblent = ptr_table_find(tbl, oldsv);
7918f24d
NC
10394
10395 PERL_ARGS_ASSERT_PTR_TABLE_STORE;
96a5add6 10396 PERL_UNUSED_CONTEXT;
1d7c1841 10397
7bf61b54
NC
10398 if (tblent) {
10399 tblent->newval = newsv;
10400 } else {
10401 const UV entry = PTR_TABLE_HASH(oldsv) & tbl->tbl_max;
10402
d2a0f284
JC
10403 new_body_inline(tblent, PTE_SVSLOT);
10404
7bf61b54
NC
10405 tblent->oldval = oldsv;
10406 tblent->newval = newsv;
10407 tblent->next = tbl->tbl_ary[entry];
10408 tbl->tbl_ary[entry] = tblent;
10409 tbl->tbl_items++;
10410 if (tblent->next && tbl->tbl_items > tbl->tbl_max)
10411 ptr_table_split(tbl);
1d7c1841 10412 }
1d7c1841
GS
10413}
10414
645c22ef
DM
10415/* double the hash bucket size of an existing ptr table */
10416
1d7c1841 10417void
1eb6e4ca 10418Perl_ptr_table_split(pTHX_ PTR_TBL_t *const tbl)
1d7c1841
GS
10419{
10420 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
4373e329 10421 const UV oldsize = tbl->tbl_max + 1;
1d7c1841
GS
10422 UV newsize = oldsize * 2;
10423 UV i;
7918f24d
NC
10424
10425 PERL_ARGS_ASSERT_PTR_TABLE_SPLIT;
96a5add6 10426 PERL_UNUSED_CONTEXT;
1d7c1841
GS
10427
10428 Renew(ary, newsize, PTR_TBL_ENT_t*);
10429 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
10430 tbl->tbl_max = --newsize;
10431 tbl->tbl_ary = ary;
10432 for (i=0; i < oldsize; i++, ary++) {
10433 PTR_TBL_ENT_t **curentp, **entp, *ent;
10434 if (!*ary)
10435 continue;
10436 curentp = ary + oldsize;
10437 for (entp = ary, ent = *ary; ent; ent = *entp) {
134ca3d6 10438 if ((newsize & PTR_TABLE_HASH(ent->oldval)) != i) {
1d7c1841
GS
10439 *entp = ent->next;
10440 ent->next = *curentp;
10441 *curentp = ent;
10442 continue;
10443 }
10444 else
10445 entp = &ent->next;
10446 }
10447 }
10448}
10449
645c22ef
DM
10450/* remove all the entries from a ptr table */
10451
a0739874 10452void
1eb6e4ca 10453Perl_ptr_table_clear(pTHX_ PTR_TBL_t *const tbl)
a0739874 10454{
d5cefff9 10455 if (tbl && tbl->tbl_items) {
c445ea15 10456 register PTR_TBL_ENT_t * const * const array = tbl->tbl_ary;
d5cefff9 10457 UV riter = tbl->tbl_max;
a0739874 10458
d5cefff9
NC
10459 do {
10460 PTR_TBL_ENT_t *entry = array[riter];
ab1e7f95 10461
d5cefff9 10462 while (entry) {
00b6aa41 10463 PTR_TBL_ENT_t * const oentry = entry;
d5cefff9
NC
10464 entry = entry->next;
10465 del_pte(oentry);
10466 }
10467 } while (riter--);
a0739874 10468
d5cefff9
NC
10469 tbl->tbl_items = 0;
10470 }
a0739874
DM
10471}
10472
645c22ef
DM
10473/* clear and free a ptr table */
10474
a0739874 10475void
1eb6e4ca 10476Perl_ptr_table_free(pTHX_ PTR_TBL_t *const tbl)
a0739874
DM
10477{
10478 if (!tbl) {
10479 return;
10480 }
10481 ptr_table_clear(tbl);
10482 Safefree(tbl->tbl_ary);
10483 Safefree(tbl);
10484}
10485
4674ade5 10486#if defined(USE_ITHREADS)
5bd07a3d 10487
83841fad 10488void
1eb6e4ca 10489Perl_rvpv_dup(pTHX_ SV *const dstr, const SV *const sstr, CLONE_PARAMS *const param)
83841fad 10490{
7918f24d
NC
10491 PERL_ARGS_ASSERT_RVPV_DUP;
10492
83841fad 10493 if (SvROK(sstr)) {
b162af07
SP
10494 SvRV_set(dstr, SvWEAKREF(sstr)
10495 ? sv_dup(SvRV(sstr), param)
10496 : sv_dup_inc(SvRV(sstr), param));
f880fe2f 10497
83841fad 10498 }
3f7c398e 10499 else if (SvPVX_const(sstr)) {
83841fad
NIS
10500 /* Has something there */
10501 if (SvLEN(sstr)) {
68795e93 10502 /* Normal PV - clone whole allocated space */
3f7c398e 10503 SvPV_set(dstr, SAVEPVN(SvPVX_const(sstr), SvLEN(sstr)-1));
d3d0e6f1
NC
10504 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
10505 /* Not that normal - actually sstr is copy on write.
10506 But we are a true, independant SV, so: */
10507 SvREADONLY_off(dstr);
10508 SvFAKE_off(dstr);
10509 }
68795e93 10510 }
83841fad
NIS
10511 else {
10512 /* Special case - not normally malloced for some reason */
f7877b28
NC
10513 if (isGV_with_GP(sstr)) {
10514 /* Don't need to do anything here. */
10515 }
10516 else if ((SvREADONLY(sstr) && SvFAKE(sstr))) {
ef10be65
NC
10517 /* A "shared" PV - clone it as "shared" PV */
10518 SvPV_set(dstr,
10519 HEK_KEY(hek_dup(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)),
10520 param)));
83841fad
NIS
10521 }
10522 else {
10523 /* Some other special case - random pointer */
f880fe2f 10524 SvPV_set(dstr, SvPVX(sstr));
d3d0e6f1 10525 }
83841fad
NIS
10526 }
10527 }
10528 else {
4608196e 10529 /* Copy the NULL */
4df7f6af 10530 SvPV_set(dstr, NULL);
83841fad
NIS
10531 }
10532}
10533
662fb8b2
NC
10534/* duplicate an SV of any type (including AV, HV etc) */
10535
1d7c1841 10536SV *
1eb6e4ca 10537Perl_sv_dup(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
1d7c1841 10538{
27da23d5 10539 dVAR;
1d7c1841
GS
10540 SV *dstr;
10541
7918f24d
NC
10542 PERL_ARGS_ASSERT_SV_DUP;
10543
bfd95973
NC
10544 if (!sstr)
10545 return NULL;
10546 if (SvTYPE(sstr) == SVTYPEMASK) {
10547#ifdef DEBUG_LEAKING_SCALARS_ABORT
10548 abort();
10549#endif
6136c704 10550 return NULL;
bfd95973 10551 }
1d7c1841
GS
10552 /* look for it in the table first */
10553 dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
10554 if (dstr)
10555 return dstr;
10556
0405e91e
AB
10557 if(param->flags & CLONEf_JOIN_IN) {
10558 /** We are joining here so we don't want do clone
10559 something that is bad **/
eb86f8b3 10560 if (SvTYPE(sstr) == SVt_PVHV) {
9bde8eb0 10561 const HEK * const hvname = HvNAME_HEK(sstr);
eb86f8b3
AL
10562 if (hvname)
10563 /** don't clone stashes if they already exist **/
9bde8eb0 10564 return (SV*)gv_stashpvn(HEK_KEY(hvname), HEK_LEN(hvname), 0);
0405e91e
AB
10565 }
10566 }
10567
1d7c1841
GS
10568 /* create anew and remember what it is */
10569 new_SV(dstr);
fd0854ff
DM
10570
10571#ifdef DEBUG_LEAKING_SCALARS
10572 dstr->sv_debug_optype = sstr->sv_debug_optype;
10573 dstr->sv_debug_line = sstr->sv_debug_line;
10574 dstr->sv_debug_inpad = sstr->sv_debug_inpad;
10575 dstr->sv_debug_cloned = 1;
fd0854ff 10576 dstr->sv_debug_file = savepv(sstr->sv_debug_file);
fd0854ff
DM
10577#endif
10578
1d7c1841
GS
10579 ptr_table_store(PL_ptr_table, sstr, dstr);
10580
10581 /* clone */
10582 SvFLAGS(dstr) = SvFLAGS(sstr);
10583 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
10584 SvREFCNT(dstr) = 0; /* must be before any other dups! */
10585
10586#ifdef DEBUGGING
3f7c398e 10587 if (SvANY(sstr) && PL_watch_pvx && SvPVX_const(sstr) == PL_watch_pvx)
1d7c1841 10588 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
6c9570dc 10589 (void*)PL_watch_pvx, SvPVX_const(sstr));
1d7c1841
GS
10590#endif
10591
9660f481
DM
10592 /* don't clone objects whose class has asked us not to */
10593 if (SvOBJECT(sstr) && ! (SvFLAGS(SvSTASH(sstr)) & SVphv_CLONEABLE)) {
33de8e4a 10594 SvFLAGS(dstr) = 0;
9660f481
DM
10595 return dstr;
10596 }
10597
1d7c1841
GS
10598 switch (SvTYPE(sstr)) {
10599 case SVt_NULL:
10600 SvANY(dstr) = NULL;
10601 break;
10602 case SVt_IV:
339049b0 10603 SvANY(dstr) = (XPVIV*)((char*)&(dstr->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
4df7f6af
NC
10604 if(SvROK(sstr)) {
10605 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
10606 } else {
10607 SvIV_set(dstr, SvIVX(sstr));
10608 }
1d7c1841
GS
10609 break;
10610 case SVt_NV:
10611 SvANY(dstr) = new_XNV();
9d6ce603 10612 SvNV_set(dstr, SvNVX(sstr));
1d7c1841 10613 break;
cecf5685 10614 /* case SVt_BIND: */
662fb8b2
NC
10615 default:
10616 {
10617 /* These are all the types that need complex bodies allocating. */
662fb8b2 10618 void *new_body;
2bcc16b3
NC
10619 const svtype sv_type = SvTYPE(sstr);
10620 const struct body_details *const sv_type_details
10621 = bodies_by_type + sv_type;
662fb8b2 10622
93e68bfb 10623 switch (sv_type) {
662fb8b2 10624 default:
bb263b4e 10625 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
662fb8b2
NC
10626 break;
10627
662fb8b2
NC
10628 case SVt_PVGV:
10629 if (GvUNIQUE((GV*)sstr)) {
6f207bd3 10630 NOOP; /* Do sharing here, and fall through */
662fb8b2 10631 }
c22188b4
NC
10632 case SVt_PVIO:
10633 case SVt_PVFM:
10634 case SVt_PVHV:
10635 case SVt_PVAV:
662fb8b2 10636 case SVt_PVCV:
662fb8b2 10637 case SVt_PVLV:
5c35adbb 10638 case SVt_REGEXP:
662fb8b2 10639 case SVt_PVMG:
662fb8b2 10640 case SVt_PVNV:
662fb8b2 10641 case SVt_PVIV:
662fb8b2 10642 case SVt_PV:
d2a0f284 10643 assert(sv_type_details->body_size);
c22188b4 10644 if (sv_type_details->arena) {
d2a0f284 10645 new_body_inline(new_body, sv_type);
c22188b4 10646 new_body
b9502f15 10647 = (void*)((char*)new_body - sv_type_details->offset);
c22188b4
NC
10648 } else {
10649 new_body = new_NOARENA(sv_type_details);
10650 }
1d7c1841 10651 }
662fb8b2
NC
10652 assert(new_body);
10653 SvANY(dstr) = new_body;
10654
2bcc16b3 10655#ifndef PURIFY
b9502f15
NC
10656 Copy(((char*)SvANY(sstr)) + sv_type_details->offset,
10657 ((char*)SvANY(dstr)) + sv_type_details->offset,
f32993d6 10658 sv_type_details->copy, char);
2bcc16b3
NC
10659#else
10660 Copy(((char*)SvANY(sstr)),
10661 ((char*)SvANY(dstr)),
d2a0f284 10662 sv_type_details->body_size + sv_type_details->offset, char);
2bcc16b3 10663#endif
662fb8b2 10664
f7877b28
NC
10665 if (sv_type != SVt_PVAV && sv_type != SVt_PVHV
10666 && !isGV_with_GP(dstr))
662fb8b2
NC
10667 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
10668
10669 /* The Copy above means that all the source (unduplicated) pointers
10670 are now in the destination. We can check the flags and the
10671 pointers in either, but it's possible that there's less cache
10672 missing by always going for the destination.
10673 FIXME - instrument and check that assumption */
f32993d6 10674 if (sv_type >= SVt_PVMG) {
885ffcb3 10675 if ((sv_type == SVt_PVMG) && SvPAD_OUR(dstr)) {
73d95100 10676 SvOURSTASH_set(dstr, hv_dup_inc(SvOURSTASH(dstr), param));
e736a858 10677 } else if (SvMAGIC(dstr))
662fb8b2
NC
10678 SvMAGIC_set(dstr, mg_dup(SvMAGIC(dstr), param));
10679 if (SvSTASH(dstr))
10680 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(dstr), param));
1d7c1841 10681 }
662fb8b2 10682
f32993d6
NC
10683 /* The cast silences a GCC warning about unhandled types. */
10684 switch ((int)sv_type) {
662fb8b2
NC
10685 case SVt_PV:
10686 break;
10687 case SVt_PVIV:
10688 break;
10689 case SVt_PVNV:
10690 break;
10691 case SVt_PVMG:
10692 break;
5c35adbb 10693 case SVt_REGEXP:
288b8c02 10694 /* FIXME for plugins */
d2f13c59 10695 re_dup_guts((REGEXP*) sstr, (REGEXP*) dstr, param);
f708cfc1 10696 break;
662fb8b2
NC
10697 case SVt_PVLV:
10698 /* XXX LvTARGOFF sometimes holds PMOP* when DEBUGGING */
10699 if (LvTYPE(dstr) == 't') /* for tie: unrefcnted fake (SV**) */
10700 LvTARG(dstr) = dstr;
10701 else if (LvTYPE(dstr) == 'T') /* for tie: fake HE */
10702 LvTARG(dstr) = (SV*)he_dup((HE*)LvTARG(dstr), 0, param);
10703 else
10704 LvTARG(dstr) = sv_dup_inc(LvTARG(dstr), param);
662fb8b2 10705 case SVt_PVGV:
cecf5685
NC
10706 if(isGV_with_GP(sstr)) {
10707 if (GvNAME_HEK(dstr))
10708 GvNAME_HEK(dstr) = hek_dup(GvNAME_HEK(dstr), param);
39cb70dc
NC
10709 /* Don't call sv_add_backref here as it's going to be
10710 created as part of the magic cloning of the symbol
10711 table. */
f7877b28
NC
10712 /* Danger Will Robinson - GvGP(dstr) isn't initialised
10713 at the point of this comment. */
39cb70dc 10714 GvSTASH(dstr) = hv_dup(GvSTASH(dstr), param);
f7877b28
NC
10715 GvGP(dstr) = gp_dup(GvGP(sstr), param);
10716 (void)GpREFCNT_inc(GvGP(dstr));
10717 } else
10718 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
662fb8b2
NC
10719 break;
10720 case SVt_PVIO:
10721 IoIFP(dstr) = fp_dup(IoIFP(dstr), IoTYPE(dstr), param);
10722 if (IoOFP(dstr) == IoIFP(sstr))
10723 IoOFP(dstr) = IoIFP(dstr);
10724 else
10725 IoOFP(dstr) = fp_dup(IoOFP(dstr), IoTYPE(dstr), param);
5486870f 10726 /* PL_parser->rsfp_filters entries have fake IoDIRP() */
662fb8b2
NC
10727 if(IoFLAGS(dstr) & IOf_FAKE_DIRP) {
10728 /* I have no idea why fake dirp (rsfps)
10729 should be treated differently but otherwise
10730 we end up with leaks -- sky*/
10731 IoTOP_GV(dstr) = gv_dup_inc(IoTOP_GV(dstr), param);
10732 IoFMT_GV(dstr) = gv_dup_inc(IoFMT_GV(dstr), param);
10733 IoBOTTOM_GV(dstr) = gv_dup_inc(IoBOTTOM_GV(dstr), param);
10734 } else {
10735 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(dstr), param);
10736 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(dstr), param);
10737 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(dstr), param);
100ce7e1
NC
10738 if (IoDIRP(dstr)) {
10739 IoDIRP(dstr) = dirp_dup(IoDIRP(dstr));
10740 } else {
6f207bd3 10741 NOOP;
100ce7e1
NC
10742 /* IoDIRP(dstr) is already a copy of IoDIRP(sstr) */
10743 }
662fb8b2
NC
10744 }
10745 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(dstr));
10746 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(dstr));
10747 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(dstr));
10748 break;
10749 case SVt_PVAV:
10750 if (AvARRAY((AV*)sstr)) {
10751 SV **dst_ary, **src_ary;
10752 SSize_t items = AvFILLp((AV*)sstr) + 1;
10753
10754 src_ary = AvARRAY((AV*)sstr);
a02a5408 10755 Newxz(dst_ary, AvMAX((AV*)sstr)+1, SV*);
662fb8b2 10756 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
9c6bc640 10757 AvARRAY((AV*)dstr) = dst_ary;
662fb8b2
NC
10758 AvALLOC((AV*)dstr) = dst_ary;
10759 if (AvREAL((AV*)sstr)) {
10760 while (items-- > 0)
10761 *dst_ary++ = sv_dup_inc(*src_ary++, param);
10762 }
10763 else {
10764 while (items-- > 0)
10765 *dst_ary++ = sv_dup(*src_ary++, param);
10766 }
10767 items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
10768 while (items-- > 0) {
10769 *dst_ary++ = &PL_sv_undef;
10770 }
bfcb3514 10771 }
662fb8b2 10772 else {
9c6bc640 10773 AvARRAY((AV*)dstr) = NULL;
662fb8b2 10774 AvALLOC((AV*)dstr) = (SV**)NULL;
b79f7545 10775 }
662fb8b2
NC
10776 break;
10777 case SVt_PVHV:
7e265ef3
AL
10778 if (HvARRAY((HV*)sstr)) {
10779 STRLEN i = 0;
10780 const bool sharekeys = !!HvSHAREKEYS(sstr);
10781 XPVHV * const dxhv = (XPVHV*)SvANY(dstr);
10782 XPVHV * const sxhv = (XPVHV*)SvANY(sstr);
10783 char *darray;
10784 Newx(darray, PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1)
10785 + (SvOOK(sstr) ? sizeof(struct xpvhv_aux) : 0),
10786 char);
10787 HvARRAY(dstr) = (HE**)darray;
10788 while (i <= sxhv->xhv_max) {
10789 const HE * const source = HvARRAY(sstr)[i];
10790 HvARRAY(dstr)[i] = source
10791 ? he_dup(source, sharekeys, param) : 0;
10792 ++i;
10793 }
10794 if (SvOOK(sstr)) {
10795 HEK *hvname;
10796 const struct xpvhv_aux * const saux = HvAUX(sstr);
10797 struct xpvhv_aux * const daux = HvAUX(dstr);
10798 /* This flag isn't copied. */
10799 /* SvOOK_on(hv) attacks the IV flags. */
10800 SvFLAGS(dstr) |= SVf_OOK;
10801
10802 hvname = saux->xhv_name;
10803 daux->xhv_name = hvname ? hek_dup(hvname, param) : hvname;
10804
10805 daux->xhv_riter = saux->xhv_riter;
10806 daux->xhv_eiter = saux->xhv_eiter
10807 ? he_dup(saux->xhv_eiter,
10808 (bool)!!HvSHAREKEYS(sstr), param) : 0;
b17f5ab7 10809 /* backref array needs refcnt=2; see sv_add_backref */
7e265ef3
AL
10810 daux->xhv_backreferences =
10811 saux->xhv_backreferences
86f55936 10812 ? (AV*) SvREFCNT_inc(
b17f5ab7 10813 sv_dup_inc((SV*)saux->xhv_backreferences, param))
86f55936 10814 : 0;
e1a479c5
BB
10815
10816 daux->xhv_mro_meta = saux->xhv_mro_meta
10817 ? mro_meta_dup(saux->xhv_mro_meta, param)
10818 : 0;
10819
7e265ef3
AL
10820 /* Record stashes for possible cloning in Perl_clone(). */
10821 if (hvname)
10822 av_push(param->stashes, dstr);
662fb8b2 10823 }
662fb8b2 10824 }
7e265ef3 10825 else
797c7171 10826 HvARRAY((HV*)dstr) = NULL;
662fb8b2 10827 break;
662fb8b2 10828 case SVt_PVCV:
bb172083
NC
10829 if (!(param->flags & CLONEf_COPY_STACKS)) {
10830 CvDEPTH(dstr) = 0;
10831 }
10832 case SVt_PVFM:
662fb8b2
NC
10833 /* NOTE: not refcounted */
10834 CvSTASH(dstr) = hv_dup(CvSTASH(dstr), param);
10835 OP_REFCNT_LOCK;
d04ba589
NC
10836 if (!CvISXSUB(dstr))
10837 CvROOT(dstr) = OpREFCNT_inc(CvROOT(dstr));
662fb8b2 10838 OP_REFCNT_UNLOCK;
cfae286e 10839 if (CvCONST(dstr) && CvISXSUB(dstr)) {
662fb8b2
NC
10840 CvXSUBANY(dstr).any_ptr = GvUNIQUE(CvGV(dstr)) ?
10841 SvREFCNT_inc(CvXSUBANY(dstr).any_ptr) :
10842 sv_dup_inc((SV *)CvXSUBANY(dstr).any_ptr, param);
10843 }
10844 /* don't dup if copying back - CvGV isn't refcounted, so the
10845 * duped GV may never be freed. A bit of a hack! DAPM */
10846 CvGV(dstr) = (param->flags & CLONEf_JOIN_IN) ?
a0714e2c 10847 NULL : gv_dup(CvGV(dstr), param) ;
662fb8b2
NC
10848 PAD_DUP(CvPADLIST(dstr), CvPADLIST(sstr), param);
10849 CvOUTSIDE(dstr) =
10850 CvWEAKOUTSIDE(sstr)
10851 ? cv_dup( CvOUTSIDE(dstr), param)
10852 : cv_dup_inc(CvOUTSIDE(dstr), param);
aed2304a 10853 if (!CvISXSUB(dstr))
662fb8b2
NC
10854 CvFILE(dstr) = SAVEPV(CvFILE(dstr));
10855 break;
bfcb3514 10856 }
1d7c1841 10857 }
1d7c1841
GS
10858 }
10859
10860 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
10861 ++PL_sv_objcount;
10862
10863 return dstr;
d2d73c3e 10864 }
1d7c1841 10865
645c22ef
DM
10866/* duplicate a context */
10867
1d7c1841 10868PERL_CONTEXT *
a8fc9800 10869Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
1d7c1841
GS
10870{
10871 PERL_CONTEXT *ncxs;
10872
7918f24d
NC
10873 PERL_ARGS_ASSERT_CX_DUP;
10874
1d7c1841
GS
10875 if (!cxs)
10876 return (PERL_CONTEXT*)NULL;
10877
10878 /* look for it in the table first */
10879 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
10880 if (ncxs)
10881 return ncxs;
10882
10883 /* create anew and remember what it is */
c2d565bf 10884 Newx(ncxs, max + 1, PERL_CONTEXT);
1d7c1841 10885 ptr_table_store(PL_ptr_table, cxs, ncxs);
c2d565bf 10886 Copy(cxs, ncxs, max + 1, PERL_CONTEXT);
1d7c1841
GS
10887
10888 while (ix >= 0) {
c445ea15 10889 PERL_CONTEXT * const ncx = &ncxs[ix];
c2d565bf 10890 if (CxTYPE(ncx) == CXt_SUBST) {
1d7c1841
GS
10891 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
10892 }
10893 else {
c2d565bf 10894 switch (CxTYPE(ncx)) {
1d7c1841 10895 case CXt_SUB:
c2d565bf
NC
10896 ncx->blk_sub.cv = (ncx->blk_sub.olddepth == 0
10897 ? cv_dup_inc(ncx->blk_sub.cv, param)
10898 : cv_dup(ncx->blk_sub.cv,param));
bafb2adc 10899 ncx->blk_sub.argarray = (CxHASARGS(ncx)
c2d565bf
NC
10900 ? av_dup_inc(ncx->blk_sub.argarray,
10901 param)
7d49f689 10902 : NULL);
c2d565bf
NC
10903 ncx->blk_sub.savearray = av_dup_inc(ncx->blk_sub.savearray,
10904 param);
d8d97e70 10905 ncx->blk_sub.oldcomppad = (PAD*)ptr_table_fetch(PL_ptr_table,
c2d565bf 10906 ncx->blk_sub.oldcomppad);
1d7c1841
GS
10907 break;
10908 case CXt_EVAL:
c2d565bf
NC
10909 ncx->blk_eval.old_namesv = sv_dup_inc(ncx->blk_eval.old_namesv,
10910 param);
10911 ncx->blk_eval.cur_text = sv_dup(ncx->blk_eval.cur_text, param);
1d7c1841 10912 break;
d01136d6 10913 case CXt_LOOP_LAZYSV:
d01136d6
BS
10914 ncx->blk_loop.state_u.lazysv.end
10915 = sv_dup_inc(ncx->blk_loop.state_u.lazysv.end, param);
840fe433
NC
10916 /* We are taking advantage of av_dup_inc and sv_dup_inc
10917 actually being the same function, and order equivalance of
10918 the two unions.
10919 We can assert the later [but only at run time :-(] */
10920 assert ((void *) &ncx->blk_loop.state_u.ary.ary ==
10921 (void *) &ncx->blk_loop.state_u.lazysv.cur);
3b719c58 10922 case CXt_LOOP_FOR:
d01136d6
BS
10923 ncx->blk_loop.state_u.ary.ary
10924 = av_dup_inc(ncx->blk_loop.state_u.ary.ary, param);
10925 case CXt_LOOP_LAZYIV:
3b719c58 10926 case CXt_LOOP_PLAIN:
e846cb92
NC
10927 if (CxPADLOOP(ncx)) {
10928 ncx->blk_loop.oldcomppad
10929 = (PAD*)ptr_table_fetch(PL_ptr_table,
10930 ncx->blk_loop.oldcomppad);
10931 } else {
10932 ncx->blk_loop.oldcomppad
10933 = (PAD*)gv_dup((GV*)ncx->blk_loop.oldcomppad, param);
10934 }
1d7c1841
GS
10935 break;
10936 case CXt_FORMAT:
f9c764c5
NC
10937 ncx->blk_format.cv = cv_dup(ncx->blk_format.cv, param);
10938 ncx->blk_format.gv = gv_dup(ncx->blk_format.gv, param);
10939 ncx->blk_format.dfoutgv = gv_dup_inc(ncx->blk_format.dfoutgv,
c2d565bf 10940 param);
1d7c1841
GS
10941 break;
10942 case CXt_BLOCK:
10943 case CXt_NULL:
10944 break;
10945 }
10946 }
10947 --ix;
10948 }
10949 return ncxs;
10950}
10951
645c22ef
DM
10952/* duplicate a stack info structure */
10953
1d7c1841 10954PERL_SI *
a8fc9800 10955Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
1d7c1841
GS
10956{
10957 PERL_SI *nsi;
10958
7918f24d
NC
10959 PERL_ARGS_ASSERT_SI_DUP;
10960
1d7c1841
GS
10961 if (!si)
10962 return (PERL_SI*)NULL;
10963
10964 /* look for it in the table first */
10965 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
10966 if (nsi)
10967 return nsi;
10968
10969 /* create anew and remember what it is */
a02a5408 10970 Newxz(nsi, 1, PERL_SI);
1d7c1841
GS
10971 ptr_table_store(PL_ptr_table, si, nsi);
10972
d2d73c3e 10973 nsi->si_stack = av_dup_inc(si->si_stack, param);
1d7c1841
GS
10974 nsi->si_cxix = si->si_cxix;
10975 nsi->si_cxmax = si->si_cxmax;
d2d73c3e 10976 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
1d7c1841 10977 nsi->si_type = si->si_type;
d2d73c3e
AB
10978 nsi->si_prev = si_dup(si->si_prev, param);
10979 nsi->si_next = si_dup(si->si_next, param);
1d7c1841
GS
10980 nsi->si_markoff = si->si_markoff;
10981
10982 return nsi;
10983}
10984
10985#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
10986#define TOPINT(ss,ix) ((ss)[ix].any_i32)
10987#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
10988#define TOPLONG(ss,ix) ((ss)[ix].any_long)
10989#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
10990#define TOPIV(ss,ix) ((ss)[ix].any_iv)
38d8b13e
HS
10991#define POPBOOL(ss,ix) ((ss)[--(ix)].any_bool)
10992#define TOPBOOL(ss,ix) ((ss)[ix].any_bool)
1d7c1841
GS
10993#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
10994#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
10995#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
10996#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
10997#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
10998#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
10999
11000/* XXXXX todo */
11001#define pv_dup_inc(p) SAVEPV(p)
11002#define pv_dup(p) SAVEPV(p)
11003#define svp_dup_inc(p,pp) any_dup(p,pp)
11004
645c22ef
DM
11005/* map any object to the new equivent - either something in the
11006 * ptr table, or something in the interpreter structure
11007 */
11008
1d7c1841 11009void *
53c1dcc0 11010Perl_any_dup(pTHX_ void *v, const PerlInterpreter *proto_perl)
1d7c1841
GS
11011{
11012 void *ret;
11013
7918f24d
NC
11014 PERL_ARGS_ASSERT_ANY_DUP;
11015
1d7c1841
GS
11016 if (!v)
11017 return (void*)NULL;
11018
11019 /* look for it in the table first */
11020 ret = ptr_table_fetch(PL_ptr_table, v);
11021 if (ret)
11022 return ret;
11023
11024 /* see if it is part of the interpreter structure */
11025 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
acfe0abc 11026 ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
05ec9bb3 11027 else {
1d7c1841 11028 ret = v;
05ec9bb3 11029 }
1d7c1841
GS
11030
11031 return ret;
11032}
11033
645c22ef
DM
11034/* duplicate the save stack */
11035
1d7c1841 11036ANY *
a8fc9800 11037Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
1d7c1841 11038{
53d44271 11039 dVAR;
907b3e23
DM
11040 ANY * const ss = proto_perl->Isavestack;
11041 const I32 max = proto_perl->Isavestack_max;
11042 I32 ix = proto_perl->Isavestack_ix;
1d7c1841
GS
11043 ANY *nss;
11044 SV *sv;
11045 GV *gv;
11046 AV *av;
11047 HV *hv;
11048 void* ptr;
11049 int intval;
11050 long longval;
11051 GP *gp;
11052 IV iv;
b24356f5 11053 I32 i;
c4e33207 11054 char *c = NULL;
1d7c1841 11055 void (*dptr) (void*);
acfe0abc 11056 void (*dxptr) (pTHX_ void*);
1d7c1841 11057
7918f24d
NC
11058 PERL_ARGS_ASSERT_SS_DUP;
11059
a02a5408 11060 Newxz(nss, max, ANY);
1d7c1841
GS
11061
11062 while (ix > 0) {
b24356f5
NC
11063 const I32 type = POPINT(ss,ix);
11064 TOPINT(nss,ix) = type;
11065 switch (type) {
3e07292d
NC
11066 case SAVEt_HELEM: /* hash element */
11067 sv = (SV*)POPPTR(ss,ix);
11068 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
11069 /* fall through */
1d7c1841 11070 case SAVEt_ITEM: /* normal string */
a41cc44e 11071 case SAVEt_SV: /* scalar reference */
1d7c1841 11072 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11073 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
3e07292d
NC
11074 /* fall through */
11075 case SAVEt_FREESV:
11076 case SAVEt_MORTALIZESV:
1d7c1841 11077 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11078 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 11079 break;
05ec9bb3
NIS
11080 case SAVEt_SHARED_PVREF: /* char* in shared space */
11081 c = (char*)POPPTR(ss,ix);
11082 TOPPTR(nss,ix) = savesharedpv(c);
11083 ptr = POPPTR(ss,ix);
11084 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11085 break;
1d7c1841
GS
11086 case SAVEt_GENERIC_SVREF: /* generic sv */
11087 case SAVEt_SVREF: /* scalar reference */
11088 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11089 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
11090 ptr = POPPTR(ss,ix);
11091 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
11092 break;
a41cc44e 11093 case SAVEt_HV: /* hash reference */
1d7c1841 11094 case SAVEt_AV: /* array reference */
11b79775 11095 sv = (SV*) POPPTR(ss,ix);
337d28f5 11096 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
3e07292d
NC
11097 /* fall through */
11098 case SAVEt_COMPPAD:
11099 case SAVEt_NSTAB:
667e2948 11100 sv = (SV*) POPPTR(ss,ix);
3e07292d 11101 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
11102 break;
11103 case SAVEt_INT: /* int reference */
11104 ptr = POPPTR(ss,ix);
11105 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11106 intval = (int)POPINT(ss,ix);
11107 TOPINT(nss,ix) = intval;
11108 break;
11109 case SAVEt_LONG: /* long reference */
11110 ptr = POPPTR(ss,ix);
11111 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
3e07292d
NC
11112 /* fall through */
11113 case SAVEt_CLEARSV:
1d7c1841
GS
11114 longval = (long)POPLONG(ss,ix);
11115 TOPLONG(nss,ix) = longval;
11116 break;
11117 case SAVEt_I32: /* I32 reference */
11118 case SAVEt_I16: /* I16 reference */
11119 case SAVEt_I8: /* I8 reference */
88effcc9 11120 case SAVEt_COP_ARYBASE: /* call CopARYBASE_set */
1d7c1841
GS
11121 ptr = POPPTR(ss,ix);
11122 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
1ccabee8 11123 i = POPINT(ss,ix);
1d7c1841
GS
11124 TOPINT(nss,ix) = i;
11125 break;
11126 case SAVEt_IV: /* IV reference */
11127 ptr = POPPTR(ss,ix);
11128 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11129 iv = POPIV(ss,ix);
11130 TOPIV(nss,ix) = iv;
11131 break;
a41cc44e
NC
11132 case SAVEt_HPTR: /* HV* reference */
11133 case SAVEt_APTR: /* AV* reference */
1d7c1841
GS
11134 case SAVEt_SPTR: /* SV* reference */
11135 ptr = POPPTR(ss,ix);
11136 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11137 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11138 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
11139 break;
11140 case SAVEt_VPTR: /* random* reference */
11141 ptr = POPPTR(ss,ix);
11142 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11143 ptr = POPPTR(ss,ix);
11144 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11145 break;
b03d03b0 11146 case SAVEt_GENERIC_PVREF: /* generic char* */
1d7c1841
GS
11147 case SAVEt_PPTR: /* char* reference */
11148 ptr = POPPTR(ss,ix);
11149 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11150 c = (char*)POPPTR(ss,ix);
11151 TOPPTR(nss,ix) = pv_dup(c);
11152 break;
1d7c1841
GS
11153 case SAVEt_GP: /* scalar reference */
11154 gp = (GP*)POPPTR(ss,ix);
d2d73c3e 11155 TOPPTR(nss,ix) = gp = gp_dup(gp, param);
1d7c1841
GS
11156 (void)GpREFCNT_inc(gp);
11157 gv = (GV*)POPPTR(ss,ix);
2ed3c8fc 11158 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841 11159 break;
1d7c1841
GS
11160 case SAVEt_FREEOP:
11161 ptr = POPPTR(ss,ix);
11162 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
11163 /* these are assumed to be refcounted properly */
53c1dcc0 11164 OP *o;
1d7c1841
GS
11165 switch (((OP*)ptr)->op_type) {
11166 case OP_LEAVESUB:
11167 case OP_LEAVESUBLV:
11168 case OP_LEAVEEVAL:
11169 case OP_LEAVE:
11170 case OP_SCOPE:
11171 case OP_LEAVEWRITE:
e977893f
GS
11172 TOPPTR(nss,ix) = ptr;
11173 o = (OP*)ptr;
d3c72c2a 11174 OP_REFCNT_LOCK;
594cd643 11175 (void) OpREFCNT_inc(o);
d3c72c2a 11176 OP_REFCNT_UNLOCK;
1d7c1841
GS
11177 break;
11178 default:
5f66b61c 11179 TOPPTR(nss,ix) = NULL;
1d7c1841
GS
11180 break;
11181 }
11182 }
11183 else
5f66b61c 11184 TOPPTR(nss,ix) = NULL;
1d7c1841
GS
11185 break;
11186 case SAVEt_FREEPV:
11187 c = (char*)POPPTR(ss,ix);
11188 TOPPTR(nss,ix) = pv_dup_inc(c);
11189 break;
1d7c1841
GS
11190 case SAVEt_DELETE:
11191 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 11192 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
11193 c = (char*)POPPTR(ss,ix);
11194 TOPPTR(nss,ix) = pv_dup_inc(c);
3e07292d
NC
11195 /* fall through */
11196 case SAVEt_STACK_POS: /* Position on Perl stack */
1d7c1841
GS
11197 i = POPINT(ss,ix);
11198 TOPINT(nss,ix) = i;
11199 break;
11200 case SAVEt_DESTRUCTOR:
11201 ptr = POPPTR(ss,ix);
11202 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
11203 dptr = POPDPTR(ss,ix);
8141890a
JH
11204 TOPDPTR(nss,ix) = DPTR2FPTR(void (*)(void*),
11205 any_dup(FPTR2DPTR(void *, dptr),
11206 proto_perl));
1d7c1841
GS
11207 break;
11208 case SAVEt_DESTRUCTOR_X:
11209 ptr = POPPTR(ss,ix);
11210 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
11211 dxptr = POPDXPTR(ss,ix);
8141890a
JH
11212 TOPDXPTR(nss,ix) = DPTR2FPTR(void (*)(pTHX_ void*),
11213 any_dup(FPTR2DPTR(void *, dxptr),
11214 proto_perl));
1d7c1841
GS
11215 break;
11216 case SAVEt_REGCONTEXT:
11217 case SAVEt_ALLOC:
11218 i = POPINT(ss,ix);
11219 TOPINT(nss,ix) = i;
11220 ix -= i;
11221 break;
1d7c1841
GS
11222 case SAVEt_AELEM: /* array element */
11223 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 11224 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
11225 i = POPINT(ss,ix);
11226 TOPINT(nss,ix) = i;
11227 av = (AV*)POPPTR(ss,ix);
d2d73c3e 11228 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841 11229 break;
1d7c1841
GS
11230 case SAVEt_OP:
11231 ptr = POPPTR(ss,ix);
11232 TOPPTR(nss,ix) = ptr;
11233 break;
11234 case SAVEt_HINTS:
11235 i = POPINT(ss,ix);
11236 TOPINT(nss,ix) = i;
b3ca2e83 11237 ptr = POPPTR(ss,ix);
080ac856 11238 if (ptr) {
7b6dd8c3 11239 HINTS_REFCNT_LOCK;
080ac856 11240 ((struct refcounted_he *)ptr)->refcounted_he_refcnt++;
7b6dd8c3
NC
11241 HINTS_REFCNT_UNLOCK;
11242 }
cbb1fbea 11243 TOPPTR(nss,ix) = ptr;
a8f8b6a7
NC
11244 if (i & HINT_LOCALIZE_HH) {
11245 hv = (HV*)POPPTR(ss,ix);
11246 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
11247 }
1d7c1841 11248 break;
09edbca0 11249 case SAVEt_PADSV_AND_MORTALIZE:
c3564e5c
GS
11250 longval = (long)POPLONG(ss,ix);
11251 TOPLONG(nss,ix) = longval;
11252 ptr = POPPTR(ss,ix);
11253 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
11254 sv = (SV*)POPPTR(ss,ix);
09edbca0 11255 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
c3564e5c 11256 break;
a1bb4754 11257 case SAVEt_BOOL:
38d8b13e 11258 ptr = POPPTR(ss,ix);
b9609c01 11259 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
38d8b13e 11260 longval = (long)POPBOOL(ss,ix);
b9609c01 11261 TOPBOOL(nss,ix) = (bool)longval;
a1bb4754 11262 break;
8bd2680e
MHM
11263 case SAVEt_SET_SVFLAGS:
11264 i = POPINT(ss,ix);
11265 TOPINT(nss,ix) = i;
11266 i = POPINT(ss,ix);
11267 TOPINT(nss,ix) = i;
11268 sv = (SV*)POPPTR(ss,ix);
11269 TOPPTR(nss,ix) = sv_dup(sv, param);
11270 break;
5bfb7d0e
NC
11271 case SAVEt_RE_STATE:
11272 {
11273 const struct re_save_state *const old_state
11274 = (struct re_save_state *)
11275 (ss + ix - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
11276 struct re_save_state *const new_state
11277 = (struct re_save_state *)
11278 (nss + ix - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
11279
11280 Copy(old_state, new_state, 1, struct re_save_state);
11281 ix -= SAVESTACK_ALLOC_FOR_RE_SAVE_STATE;
11282
11283 new_state->re_state_bostr
11284 = pv_dup(old_state->re_state_bostr);
11285 new_state->re_state_reginput
11286 = pv_dup(old_state->re_state_reginput);
5bfb7d0e
NC
11287 new_state->re_state_regeol
11288 = pv_dup(old_state->re_state_regeol);
f0ab9afb
NC
11289 new_state->re_state_regoffs
11290 = (regexp_paren_pair*)
11291 any_dup(old_state->re_state_regoffs, proto_perl);
5bfb7d0e 11292 new_state->re_state_reglastparen
11b79775
DD
11293 = (U32*) any_dup(old_state->re_state_reglastparen,
11294 proto_perl);
5bfb7d0e 11295 new_state->re_state_reglastcloseparen
11b79775 11296 = (U32*)any_dup(old_state->re_state_reglastcloseparen,
5bfb7d0e 11297 proto_perl);
5bfb7d0e
NC
11298 /* XXX This just has to be broken. The old save_re_context
11299 code did SAVEGENERICPV(PL_reg_start_tmp);
11300 PL_reg_start_tmp is char **.
11301 Look above to what the dup code does for
11302 SAVEt_GENERIC_PVREF
11303 It can never have worked.
11304 So this is merely a faithful copy of the exiting bug: */
11305 new_state->re_state_reg_start_tmp
11306 = (char **) pv_dup((char *)
11307 old_state->re_state_reg_start_tmp);
11308 /* I assume that it only ever "worked" because no-one called
11309 (pseudo)fork while the regexp engine had re-entered itself.
11310 */
5bfb7d0e
NC
11311#ifdef PERL_OLD_COPY_ON_WRITE
11312 new_state->re_state_nrs
11313 = sv_dup(old_state->re_state_nrs, param);
11314#endif
11315 new_state->re_state_reg_magic
11b79775
DD
11316 = (MAGIC*) any_dup(old_state->re_state_reg_magic,
11317 proto_perl);
5bfb7d0e 11318 new_state->re_state_reg_oldcurpm
11b79775
DD
11319 = (PMOP*) any_dup(old_state->re_state_reg_oldcurpm,
11320 proto_perl);
5bfb7d0e 11321 new_state->re_state_reg_curpm
11b79775
DD
11322 = (PMOP*) any_dup(old_state->re_state_reg_curpm,
11323 proto_perl);
5bfb7d0e
NC
11324 new_state->re_state_reg_oldsaved
11325 = pv_dup(old_state->re_state_reg_oldsaved);
11326 new_state->re_state_reg_poscache
11327 = pv_dup(old_state->re_state_reg_poscache);
5bfb7d0e
NC
11328 new_state->re_state_reg_starttry
11329 = pv_dup(old_state->re_state_reg_starttry);
5bfb7d0e
NC
11330 break;
11331 }
68da3b2f
NC
11332 case SAVEt_COMPILE_WARNINGS:
11333 ptr = POPPTR(ss,ix);
11334 TOPPTR(nss,ix) = DUP_WARNINGS((STRLEN*)ptr);
7b6dd8c3 11335 break;
7c197c94
DM
11336 case SAVEt_PARSER:
11337 ptr = POPPTR(ss,ix);
456084a8 11338 TOPPTR(nss,ix) = parser_dup((const yy_parser*)ptr, param);
7c197c94 11339 break;
1d7c1841 11340 default:
147bc374
NC
11341 Perl_croak(aTHX_
11342 "panic: ss_dup inconsistency (%"IVdf")", (IV) type);
1d7c1841
GS
11343 }
11344 }
11345
bd81e77b
NC
11346 return nss;
11347}
11348
11349
11350/* if sv is a stash, call $class->CLONE_SKIP(), and set the SVphv_CLONEABLE
11351 * flag to the result. This is done for each stash before cloning starts,
11352 * so we know which stashes want their objects cloned */
11353
11354static void
f30de749 11355do_mark_cloneable_stash(pTHX_ SV *const sv)
bd81e77b
NC
11356{
11357 const HEK * const hvname = HvNAME_HEK((HV*)sv);
11358 if (hvname) {
11359 GV* const cloner = gv_fetchmethod_autoload((HV*)sv, "CLONE_SKIP", 0);
11360 SvFLAGS(sv) |= SVphv_CLONEABLE; /* clone objects by default */
11361 if (cloner && GvCV(cloner)) {
11362 dSP;
11363 UV status;
11364
11365 ENTER;
11366 SAVETMPS;
11367 PUSHMARK(SP);
6e449a3a 11368 mXPUSHs(newSVhek(hvname));
bd81e77b
NC
11369 PUTBACK;
11370 call_sv((SV*)GvCV(cloner), G_SCALAR);
11371 SPAGAIN;
11372 status = POPu;
11373 PUTBACK;
11374 FREETMPS;
11375 LEAVE;
11376 if (status)
11377 SvFLAGS(sv) &= ~SVphv_CLONEABLE;
11378 }
11379 }
11380}
11381
11382
11383
11384/*
11385=for apidoc perl_clone
11386
11387Create and return a new interpreter by cloning the current one.
11388
11389perl_clone takes these flags as parameters:
11390
11391CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
11392without it we only clone the data and zero the stacks,
11393with it we copy the stacks and the new perl interpreter is
11394ready to run at the exact same point as the previous one.
11395The pseudo-fork code uses COPY_STACKS while the
878090d5 11396threads->create doesn't.
bd81e77b
NC
11397
11398CLONEf_KEEP_PTR_TABLE
11399perl_clone keeps a ptr_table with the pointer of the old
11400variable as a key and the new variable as a value,
11401this allows it to check if something has been cloned and not
11402clone it again but rather just use the value and increase the
11403refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
11404the ptr_table using the function
11405C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
11406reason to keep it around is if you want to dup some of your own
11407variable who are outside the graph perl scans, example of this
11408code is in threads.xs create
11409
11410CLONEf_CLONE_HOST
11411This is a win32 thing, it is ignored on unix, it tells perls
11412win32host code (which is c++) to clone itself, this is needed on
11413win32 if you want to run two threads at the same time,
11414if you just want to do some stuff in a separate perl interpreter
11415and then throw it away and return to the original one,
11416you don't need to do anything.
11417
11418=cut
11419*/
11420
11421/* XXX the above needs expanding by someone who actually understands it ! */
11422EXTERN_C PerlInterpreter *
11423perl_clone_host(PerlInterpreter* proto_perl, UV flags);
11424
11425PerlInterpreter *
11426perl_clone(PerlInterpreter *proto_perl, UV flags)
11427{
11428 dVAR;
11429#ifdef PERL_IMPLICIT_SYS
11430
7918f24d
NC
11431 PERL_ARGS_ASSERT_PERL_CLONE;
11432
bd81e77b
NC
11433 /* perlhost.h so we need to call into it
11434 to clone the host, CPerlHost should have a c interface, sky */
11435
11436 if (flags & CLONEf_CLONE_HOST) {
11437 return perl_clone_host(proto_perl,flags);
11438 }
11439 return perl_clone_using(proto_perl, flags,
11440 proto_perl->IMem,
11441 proto_perl->IMemShared,
11442 proto_perl->IMemParse,
11443 proto_perl->IEnv,
11444 proto_perl->IStdIO,
11445 proto_perl->ILIO,
11446 proto_perl->IDir,
11447 proto_perl->ISock,
11448 proto_perl->IProc);
11449}
11450
11451PerlInterpreter *
11452perl_clone_using(PerlInterpreter *proto_perl, UV flags,
11453 struct IPerlMem* ipM, struct IPerlMem* ipMS,
11454 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
11455 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
11456 struct IPerlDir* ipD, struct IPerlSock* ipS,
11457 struct IPerlProc* ipP)
11458{
11459 /* XXX many of the string copies here can be optimized if they're
11460 * constants; they need to be allocated as common memory and just
11461 * their pointers copied. */
11462
11463 IV i;
11464 CLONE_PARAMS clone_params;
5f66b61c 11465 CLONE_PARAMS* const param = &clone_params;
bd81e77b 11466
5f66b61c 11467 PerlInterpreter * const my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
7918f24d
NC
11468
11469 PERL_ARGS_ASSERT_PERL_CLONE_USING;
11470
bd81e77b
NC
11471 /* for each stash, determine whether its objects should be cloned */
11472 S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
11473 PERL_SET_THX(my_perl);
11474
11475# ifdef DEBUGGING
7e337ee0 11476 PoisonNew(my_perl, 1, PerlInterpreter);
5f66b61c
AL
11477 PL_op = NULL;
11478 PL_curcop = NULL;
bd81e77b
NC
11479 PL_markstack = 0;
11480 PL_scopestack = 0;
11481 PL_savestack = 0;
11482 PL_savestack_ix = 0;
11483 PL_savestack_max = -1;
11484 PL_sig_pending = 0;
b8328dae 11485 PL_parser = NULL;
bd81e77b
NC
11486 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
11487# else /* !DEBUGGING */
11488 Zero(my_perl, 1, PerlInterpreter);
11489# endif /* DEBUGGING */
11490
11491 /* host pointers */
11492 PL_Mem = ipM;
11493 PL_MemShared = ipMS;
11494 PL_MemParse = ipMP;
11495 PL_Env = ipE;
11496 PL_StdIO = ipStd;
11497 PL_LIO = ipLIO;
11498 PL_Dir = ipD;
11499 PL_Sock = ipS;
11500 PL_Proc = ipP;
11501#else /* !PERL_IMPLICIT_SYS */
11502 IV i;
11503 CLONE_PARAMS clone_params;
11504 CLONE_PARAMS* param = &clone_params;
5f66b61c 11505 PerlInterpreter * const my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
7918f24d
NC
11506
11507 PERL_ARGS_ASSERT_PERL_CLONE;
11508
bd81e77b
NC
11509 /* for each stash, determine whether its objects should be cloned */
11510 S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
11511 PERL_SET_THX(my_perl);
11512
11513# ifdef DEBUGGING
7e337ee0 11514 PoisonNew(my_perl, 1, PerlInterpreter);
5f66b61c
AL
11515 PL_op = NULL;
11516 PL_curcop = NULL;
bd81e77b
NC
11517 PL_markstack = 0;
11518 PL_scopestack = 0;
11519 PL_savestack = 0;
11520 PL_savestack_ix = 0;
11521 PL_savestack_max = -1;
11522 PL_sig_pending = 0;
b8328dae 11523 PL_parser = NULL;
bd81e77b
NC
11524 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
11525# else /* !DEBUGGING */
11526 Zero(my_perl, 1, PerlInterpreter);
11527# endif /* DEBUGGING */
11528#endif /* PERL_IMPLICIT_SYS */
11529 param->flags = flags;
11530 param->proto_perl = proto_perl;
11531
7cb608b5
NC
11532 INIT_TRACK_MEMPOOL(my_perl->Imemory_debug_header, my_perl);
11533
fdda85ca 11534 PL_body_arenas = NULL;
bd81e77b
NC
11535 Zero(&PL_body_roots, 1, PL_body_roots);
11536
11537 PL_nice_chunk = NULL;
11538 PL_nice_chunk_size = 0;
11539 PL_sv_count = 0;
11540 PL_sv_objcount = 0;
a0714e2c
SS
11541 PL_sv_root = NULL;
11542 PL_sv_arenaroot = NULL;
bd81e77b
NC
11543
11544 PL_debug = proto_perl->Idebug;
11545
11546 PL_hash_seed = proto_perl->Ihash_seed;
11547 PL_rehash_seed = proto_perl->Irehash_seed;
11548
11549#ifdef USE_REENTRANT_API
11550 /* XXX: things like -Dm will segfault here in perlio, but doing
11551 * PERL_SET_CONTEXT(proto_perl);
11552 * breaks too many other things
11553 */
11554 Perl_reentrant_init(aTHX);
11555#endif
11556
11557 /* create SV map for pointer relocation */
11558 PL_ptr_table = ptr_table_new();
11559
11560 /* initialize these special pointers as early as possible */
11561 SvANY(&PL_sv_undef) = NULL;
11562 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
11563 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
11564 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
11565
11566 SvANY(&PL_sv_no) = new_XPVNV();
11567 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
11568 SvFLAGS(&PL_sv_no) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
11569 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
bb7a0f54 11570 SvPV_set(&PL_sv_no, savepvn(PL_No, 0));
bd81e77b
NC
11571 SvCUR_set(&PL_sv_no, 0);
11572 SvLEN_set(&PL_sv_no, 1);
11573 SvIV_set(&PL_sv_no, 0);
11574 SvNV_set(&PL_sv_no, 0);
11575 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
11576
11577 SvANY(&PL_sv_yes) = new_XPVNV();
11578 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
11579 SvFLAGS(&PL_sv_yes) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
11580 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
bb7a0f54 11581 SvPV_set(&PL_sv_yes, savepvn(PL_Yes, 1));
bd81e77b
NC
11582 SvCUR_set(&PL_sv_yes, 1);
11583 SvLEN_set(&PL_sv_yes, 2);
11584 SvIV_set(&PL_sv_yes, 1);
11585 SvNV_set(&PL_sv_yes, 1);
11586 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
11587
11588 /* create (a non-shared!) shared string table */
11589 PL_strtab = newHV();
11590 HvSHAREKEYS_off(PL_strtab);
11591 hv_ksplit(PL_strtab, HvTOTALKEYS(proto_perl->Istrtab));
11592 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
11593
11594 PL_compiling = proto_perl->Icompiling;
11595
11596 /* These two PVs will be free'd special way so must set them same way op.c does */
11597 PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
11598 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
11599
11600 PL_compiling.cop_file = savesharedpv(PL_compiling.cop_file);
11601 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
11602
11603 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
72dc9ed5 11604 PL_compiling.cop_warnings = DUP_WARNINGS(PL_compiling.cop_warnings);
c28fe1ec 11605 if (PL_compiling.cop_hints_hash) {
cbb1fbea 11606 HINTS_REFCNT_LOCK;
c28fe1ec 11607 PL_compiling.cop_hints_hash->refcounted_he_refcnt++;
cbb1fbea
NC
11608 HINTS_REFCNT_UNLOCK;
11609 }
907b3e23 11610 PL_curcop = (COP*)any_dup(proto_perl->Icurcop, proto_perl);
5892a4d4
NC
11611#ifdef PERL_DEBUG_READONLY_OPS
11612 PL_slabs = NULL;
11613 PL_slab_count = 0;
11614#endif
bd81e77b
NC
11615
11616 /* pseudo environmental stuff */
11617 PL_origargc = proto_perl->Iorigargc;
11618 PL_origargv = proto_perl->Iorigargv;
11619
11620 param->stashes = newAV(); /* Setup array of objects to call clone on */
11621
11622 /* Set tainting stuff before PerlIO_debug can possibly get called */
11623 PL_tainting = proto_perl->Itainting;
11624 PL_taint_warn = proto_perl->Itaint_warn;
11625
11626#ifdef PERLIO_LAYERS
11627 /* Clone PerlIO tables as soon as we can handle general xx_dup() */
11628 PerlIO_clone(aTHX_ proto_perl, param);
11629#endif
11630
11631 PL_envgv = gv_dup(proto_perl->Ienvgv, param);
11632 PL_incgv = gv_dup(proto_perl->Iincgv, param);
11633 PL_hintgv = gv_dup(proto_perl->Ihintgv, param);
11634 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
11635 PL_diehook = sv_dup_inc(proto_perl->Idiehook, param);
11636 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param);
11637
11638 /* switches */
11639 PL_minus_c = proto_perl->Iminus_c;
11640 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel, param);
11641 PL_localpatches = proto_perl->Ilocalpatches;
11642 PL_splitstr = proto_perl->Isplitstr;
bd81e77b
NC
11643 PL_minus_n = proto_perl->Iminus_n;
11644 PL_minus_p = proto_perl->Iminus_p;
11645 PL_minus_l = proto_perl->Iminus_l;
11646 PL_minus_a = proto_perl->Iminus_a;
bc9b29db 11647 PL_minus_E = proto_perl->Iminus_E;
bd81e77b
NC
11648 PL_minus_F = proto_perl->Iminus_F;
11649 PL_doswitches = proto_perl->Idoswitches;
11650 PL_dowarn = proto_perl->Idowarn;
11651 PL_doextract = proto_perl->Idoextract;
11652 PL_sawampersand = proto_perl->Isawampersand;
11653 PL_unsafe = proto_perl->Iunsafe;
11654 PL_inplace = SAVEPV(proto_perl->Iinplace);
11655 PL_e_script = sv_dup_inc(proto_perl->Ie_script, param);
11656 PL_perldb = proto_perl->Iperldb;
11657 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
11658 PL_exit_flags = proto_perl->Iexit_flags;
11659
11660 /* magical thingies */
11661 /* XXX time(&PL_basetime) when asked for? */
11662 PL_basetime = proto_perl->Ibasetime;
11663 PL_formfeed = sv_dup(proto_perl->Iformfeed, param);
11664
11665 PL_maxsysfd = proto_perl->Imaxsysfd;
bd81e77b
NC
11666 PL_statusvalue = proto_perl->Istatusvalue;
11667#ifdef VMS
11668 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
11669#else
11670 PL_statusvalue_posix = proto_perl->Istatusvalue_posix;
11671#endif
11672 PL_encoding = sv_dup(proto_perl->Iencoding, param);
11673
11674 sv_setpvn(PERL_DEBUG_PAD(0), "", 0); /* For regex debugging. */
11675 sv_setpvn(PERL_DEBUG_PAD(1), "", 0); /* ext/re needs these */
11676 sv_setpvn(PERL_DEBUG_PAD(2), "", 0); /* even without DEBUGGING. */
11677
84da74a7 11678
f9f4320a 11679 /* RE engine related */
84da74a7
YO
11680 Zero(&PL_reg_state, 1, struct re_save_state);
11681 PL_reginterp_cnt = 0;
11682 PL_regmatch_slab = NULL;
11683
bd81e77b 11684 /* Clone the regex array */
937c6efd
NC
11685 /* ORANGE FIXME for plugins, probably in the SV dup code.
11686 newSViv(PTR2IV(CALLREGDUPE(
11687 INT2PTR(REGEXP *, SvIVX(regex)), param))))
11688 */
11689 PL_regex_padav = av_dup_inc(proto_perl->Iregex_padav, param);
bd81e77b
NC
11690 PL_regex_pad = AvARRAY(PL_regex_padav);
11691
11692 /* shortcuts to various I/O objects */
11693 PL_stdingv = gv_dup(proto_perl->Istdingv, param);
11694 PL_stderrgv = gv_dup(proto_perl->Istderrgv, param);
11695 PL_defgv = gv_dup(proto_perl->Idefgv, param);
11696 PL_argvgv = gv_dup(proto_perl->Iargvgv, param);
11697 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv, param);
11698 PL_argvout_stack = av_dup_inc(proto_perl->Iargvout_stack, param);
1d7c1841 11699
bd81e77b
NC
11700 /* shortcuts to regexp stuff */
11701 PL_replgv = gv_dup(proto_perl->Ireplgv, param);
9660f481 11702
bd81e77b
NC
11703 /* shortcuts to misc objects */
11704 PL_errgv = gv_dup(proto_perl->Ierrgv, param);
9660f481 11705
bd81e77b
NC
11706 /* shortcuts to debugging objects */
11707 PL_DBgv = gv_dup(proto_perl->IDBgv, param);
11708 PL_DBline = gv_dup(proto_perl->IDBline, param);
11709 PL_DBsub = gv_dup(proto_perl->IDBsub, param);
11710 PL_DBsingle = sv_dup(proto_perl->IDBsingle, param);
11711 PL_DBtrace = sv_dup(proto_perl->IDBtrace, param);
11712 PL_DBsignal = sv_dup(proto_perl->IDBsignal, param);
bd81e77b 11713 PL_dbargs = av_dup(proto_perl->Idbargs, param);
9660f481 11714
bd81e77b 11715 /* symbol tables */
907b3e23
DM
11716 PL_defstash = hv_dup_inc(proto_perl->Idefstash, param);
11717 PL_curstash = hv_dup(proto_perl->Icurstash, param);
bd81e77b
NC
11718 PL_debstash = hv_dup(proto_perl->Idebstash, param);
11719 PL_globalstash = hv_dup(proto_perl->Iglobalstash, param);
11720 PL_curstname = sv_dup_inc(proto_perl->Icurstname, param);
11721
11722 PL_beginav = av_dup_inc(proto_perl->Ibeginav, param);
11723 PL_beginav_save = av_dup_inc(proto_perl->Ibeginav_save, param);
11724 PL_checkav_save = av_dup_inc(proto_perl->Icheckav_save, param);
3c10abe3
AG
11725 PL_unitcheckav = av_dup_inc(proto_perl->Iunitcheckav, param);
11726 PL_unitcheckav_save = av_dup_inc(proto_perl->Iunitcheckav_save, param);
bd81e77b
NC
11727 PL_endav = av_dup_inc(proto_perl->Iendav, param);
11728 PL_checkav = av_dup_inc(proto_perl->Icheckav, param);
11729 PL_initav = av_dup_inc(proto_perl->Iinitav, param);
11730
11731 PL_sub_generation = proto_perl->Isub_generation;
dd69841b 11732 PL_isarev = hv_dup_inc(proto_perl->Iisarev, param);
bd81e77b
NC
11733
11734 /* funky return mechanisms */
11735 PL_forkprocess = proto_perl->Iforkprocess;
11736
11737 /* subprocess state */
11738 PL_fdpid = av_dup_inc(proto_perl->Ifdpid, param);
11739
11740 /* internal state */
11741 PL_maxo = proto_perl->Imaxo;
11742 if (proto_perl->Iop_mask)
11743 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
11744 else
bd61b366 11745 PL_op_mask = NULL;
bd81e77b
NC
11746 /* PL_asserting = proto_perl->Iasserting; */
11747
11748 /* current interpreter roots */
11749 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv, param);
d3c72c2a 11750 OP_REFCNT_LOCK;
bd81e77b 11751 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
d3c72c2a 11752 OP_REFCNT_UNLOCK;
bd81e77b
NC
11753 PL_main_start = proto_perl->Imain_start;
11754 PL_eval_root = proto_perl->Ieval_root;
11755 PL_eval_start = proto_perl->Ieval_start;
11756
11757 /* runtime control stuff */
11758 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
bd81e77b
NC
11759
11760 PL_filemode = proto_perl->Ifilemode;
11761 PL_lastfd = proto_perl->Ilastfd;
11762 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
11763 PL_Argv = NULL;
bd61b366 11764 PL_Cmd = NULL;
bd81e77b 11765 PL_gensym = proto_perl->Igensym;
bd81e77b
NC
11766 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav, param);
11767 PL_laststatval = proto_perl->Ilaststatval;
11768 PL_laststype = proto_perl->Ilaststype;
a0714e2c 11769 PL_mess_sv = NULL;
bd81e77b
NC
11770
11771 PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv, param);
11772
11773 /* interpreter atexit processing */
11774 PL_exitlistlen = proto_perl->Iexitlistlen;
11775 if (PL_exitlistlen) {
11776 Newx(PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11777 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
9660f481 11778 }
bd81e77b
NC
11779 else
11780 PL_exitlist = (PerlExitListEntry*)NULL;
f16dd614
DM
11781
11782 PL_my_cxt_size = proto_perl->Imy_cxt_size;
4c901e72 11783 if (PL_my_cxt_size) {
f16dd614
DM
11784 Newx(PL_my_cxt_list, PL_my_cxt_size, void *);
11785 Copy(proto_perl->Imy_cxt_list, PL_my_cxt_list, PL_my_cxt_size, void *);
53d44271 11786#ifdef PERL_GLOBAL_STRUCT_PRIVATE
bae1192d 11787 Newx(PL_my_cxt_keys, PL_my_cxt_size, const char *);
53d44271
JH
11788 Copy(proto_perl->Imy_cxt_keys, PL_my_cxt_keys, PL_my_cxt_size, char *);
11789#endif
f16dd614 11790 }
53d44271 11791 else {
f16dd614 11792 PL_my_cxt_list = (void**)NULL;
53d44271 11793#ifdef PERL_GLOBAL_STRUCT_PRIVATE
bae1192d 11794 PL_my_cxt_keys = (const char**)NULL;
53d44271
JH
11795#endif
11796 }
bd81e77b
NC
11797 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal, param);
11798 PL_custom_op_names = hv_dup_inc(proto_perl->Icustom_op_names,param);
11799 PL_custom_op_descs = hv_dup_inc(proto_perl->Icustom_op_descs,param);
11800
11801 PL_profiledata = NULL;
9660f481 11802
bd81e77b 11803 PL_compcv = cv_dup(proto_perl->Icompcv, param);
9660f481 11804
bd81e77b 11805 PAD_CLONE_VARS(proto_perl, param);
9660f481 11806
bd81e77b
NC
11807#ifdef HAVE_INTERP_INTERN
11808 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
11809#endif
645c22ef 11810
bd81e77b
NC
11811 /* more statics moved here */
11812 PL_generation = proto_perl->Igeneration;
11813 PL_DBcv = cv_dup(proto_perl->IDBcv, param);
645c22ef 11814
bd81e77b
NC
11815 PL_in_clean_objs = proto_perl->Iin_clean_objs;
11816 PL_in_clean_all = proto_perl->Iin_clean_all;
6a78b4db 11817
bd81e77b
NC
11818 PL_uid = proto_perl->Iuid;
11819 PL_euid = proto_perl->Ieuid;
11820 PL_gid = proto_perl->Igid;
11821 PL_egid = proto_perl->Iegid;
11822 PL_nomemok = proto_perl->Inomemok;
11823 PL_an = proto_perl->Ian;
11824 PL_evalseq = proto_perl->Ievalseq;
11825 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
11826 PL_origalen = proto_perl->Iorigalen;
11827#ifdef PERL_USES_PL_PIDSTATUS
11828 PL_pidstatus = newHV(); /* XXX flag for cloning? */
11829#endif
11830 PL_osname = SAVEPV(proto_perl->Iosname);
11831 PL_sighandlerp = proto_perl->Isighandlerp;
6a78b4db 11832
bd81e77b 11833 PL_runops = proto_perl->Irunops;
6a78b4db 11834
199e78b7
DM
11835 PL_parser = parser_dup(proto_perl->Iparser, param);
11836
bd81e77b
NC
11837 PL_subline = proto_perl->Isubline;
11838 PL_subname = sv_dup_inc(proto_perl->Isubname, param);
c43294b8 11839
bd81e77b
NC
11840#ifdef FCRYPT
11841 PL_cryptseen = proto_perl->Icryptseen;
11842#endif
1d7c1841 11843
bd81e77b 11844 PL_hints = proto_perl->Ihints;
1d7c1841 11845
bd81e77b 11846 PL_amagic_generation = proto_perl->Iamagic_generation;
d2d73c3e 11847
bd81e77b
NC
11848#ifdef USE_LOCALE_COLLATE
11849 PL_collation_ix = proto_perl->Icollation_ix;
11850 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
11851 PL_collation_standard = proto_perl->Icollation_standard;
11852 PL_collxfrm_base = proto_perl->Icollxfrm_base;
11853 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
11854#endif /* USE_LOCALE_COLLATE */
1d7c1841 11855
bd81e77b
NC
11856#ifdef USE_LOCALE_NUMERIC
11857 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
11858 PL_numeric_standard = proto_perl->Inumeric_standard;
11859 PL_numeric_local = proto_perl->Inumeric_local;
11860 PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
11861#endif /* !USE_LOCALE_NUMERIC */
1d7c1841 11862
bd81e77b
NC
11863 /* utf8 character classes */
11864 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum, param);
11865 PL_utf8_alnumc = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
11866 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii, param);
11867 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha, param);
11868 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space, param);
11869 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
11870 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph, param);
11871 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit, param);
11872 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper, param);
11873 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower, param);
11874 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print, param);
11875 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct, param);
11876 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
11877 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark, param);
11878 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper, param);
11879 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle, param);
11880 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower, param);
11881 PL_utf8_tofold = sv_dup_inc(proto_perl->Iutf8_tofold, param);
11882 PL_utf8_idstart = sv_dup_inc(proto_perl->Iutf8_idstart, param);
11883 PL_utf8_idcont = sv_dup_inc(proto_perl->Iutf8_idcont, param);
1d7c1841 11884
bd81e77b
NC
11885 /* Did the locale setup indicate UTF-8? */
11886 PL_utf8locale = proto_perl->Iutf8locale;
11887 /* Unicode features (see perlrun/-C) */
11888 PL_unicode = proto_perl->Iunicode;
1d7c1841 11889
bd81e77b
NC
11890 /* Pre-5.8 signals control */
11891 PL_signals = proto_perl->Isignals;
1d7c1841 11892
bd81e77b
NC
11893 /* times() ticks per second */
11894 PL_clocktick = proto_perl->Iclocktick;
1d7c1841 11895
bd81e77b
NC
11896 /* Recursion stopper for PerlIO_find_layer */
11897 PL_in_load_module = proto_perl->Iin_load_module;
8df990a8 11898
bd81e77b
NC
11899 /* sort() routine */
11900 PL_sort_RealCmp = proto_perl->Isort_RealCmp;
e5dd39fc 11901
bd81e77b
NC
11902 /* Not really needed/useful since the reenrant_retint is "volatile",
11903 * but do it for consistency's sake. */
11904 PL_reentrant_retint = proto_perl->Ireentrant_retint;
1d7c1841 11905
bd81e77b
NC
11906 /* Hooks to shared SVs and locks. */
11907 PL_sharehook = proto_perl->Isharehook;
11908 PL_lockhook = proto_perl->Ilockhook;
11909 PL_unlockhook = proto_perl->Iunlockhook;
11910 PL_threadhook = proto_perl->Ithreadhook;
eba16661 11911 PL_destroyhook = proto_perl->Idestroyhook;
1d7c1841 11912
bd81e77b
NC
11913#ifdef THREADS_HAVE_PIDS
11914 PL_ppid = proto_perl->Ippid;
11915#endif
1d7c1841 11916
bd81e77b 11917 /* swatch cache */
5c284bb0 11918 PL_last_swash_hv = NULL; /* reinits on demand */
bd81e77b
NC
11919 PL_last_swash_klen = 0;
11920 PL_last_swash_key[0]= '\0';
11921 PL_last_swash_tmps = (U8*)NULL;
11922 PL_last_swash_slen = 0;
1d7c1841 11923
bd81e77b
NC
11924 PL_glob_index = proto_perl->Iglob_index;
11925 PL_srand_called = proto_perl->Isrand_called;
bd61b366 11926 PL_bitcount = NULL; /* reinits on demand */
05ec9bb3 11927
bd81e77b
NC
11928 if (proto_perl->Ipsig_pend) {
11929 Newxz(PL_psig_pend, SIG_SIZE, int);
11930 }
11931 else {
11932 PL_psig_pend = (int*)NULL;
11933 }
05ec9bb3 11934
bd81e77b
NC
11935 if (proto_perl->Ipsig_ptr) {
11936 Newxz(PL_psig_ptr, SIG_SIZE, SV*);
11937 Newxz(PL_psig_name, SIG_SIZE, SV*);
11938 for (i = 1; i < SIG_SIZE; i++) {
11939 PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
11940 PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
11941 }
11942 }
11943 else {
11944 PL_psig_ptr = (SV**)NULL;
11945 PL_psig_name = (SV**)NULL;
11946 }
05ec9bb3 11947
907b3e23 11948 /* intrpvar.h stuff */
1d7c1841 11949
bd81e77b
NC
11950 if (flags & CLONEf_COPY_STACKS) {
11951 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
907b3e23
DM
11952 PL_tmps_ix = proto_perl->Itmps_ix;
11953 PL_tmps_max = proto_perl->Itmps_max;
11954 PL_tmps_floor = proto_perl->Itmps_floor;
bd81e77b
NC
11955 Newxz(PL_tmps_stack, PL_tmps_max, SV*);
11956 i = 0;
11957 while (i <= PL_tmps_ix) {
907b3e23 11958 PL_tmps_stack[i] = sv_dup_inc(proto_perl->Itmps_stack[i], param);
bd81e77b
NC
11959 ++i;
11960 }
d2d73c3e 11961
bd81e77b 11962 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
907b3e23 11963 i = proto_perl->Imarkstack_max - proto_perl->Imarkstack;
bd81e77b 11964 Newxz(PL_markstack, i, I32);
907b3e23
DM
11965 PL_markstack_max = PL_markstack + (proto_perl->Imarkstack_max
11966 - proto_perl->Imarkstack);
11967 PL_markstack_ptr = PL_markstack + (proto_perl->Imarkstack_ptr
11968 - proto_perl->Imarkstack);
11969 Copy(proto_perl->Imarkstack, PL_markstack,
bd81e77b 11970 PL_markstack_ptr - PL_markstack + 1, I32);
d2d73c3e 11971
bd81e77b
NC
11972 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
11973 * NOTE: unlike the others! */
907b3e23
DM
11974 PL_scopestack_ix = proto_perl->Iscopestack_ix;
11975 PL_scopestack_max = proto_perl->Iscopestack_max;
bd81e77b 11976 Newxz(PL_scopestack, PL_scopestack_max, I32);
907b3e23 11977 Copy(proto_perl->Iscopestack, PL_scopestack, PL_scopestack_ix, I32);
d419787a 11978
bd81e77b 11979 /* NOTE: si_dup() looks at PL_markstack */
907b3e23 11980 PL_curstackinfo = si_dup(proto_perl->Icurstackinfo, param);
d2d73c3e 11981
bd81e77b 11982 /* PL_curstack = PL_curstackinfo->si_stack; */
907b3e23
DM
11983 PL_curstack = av_dup(proto_perl->Icurstack, param);
11984 PL_mainstack = av_dup(proto_perl->Imainstack, param);
1d7c1841 11985
bd81e77b
NC
11986 /* next PUSHs() etc. set *(PL_stack_sp+1) */
11987 PL_stack_base = AvARRAY(PL_curstack);
907b3e23
DM
11988 PL_stack_sp = PL_stack_base + (proto_perl->Istack_sp
11989 - proto_perl->Istack_base);
bd81e77b 11990 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
1d7c1841 11991
bd81e77b
NC
11992 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
11993 * NOTE: unlike the others! */
907b3e23
DM
11994 PL_savestack_ix = proto_perl->Isavestack_ix;
11995 PL_savestack_max = proto_perl->Isavestack_max;
bd81e77b
NC
11996 /*Newxz(PL_savestack, PL_savestack_max, ANY);*/
11997 PL_savestack = ss_dup(proto_perl, param);
11998 }
11999 else {
12000 init_stacks();
12001 ENTER; /* perl_destruct() wants to LEAVE; */
34394ecd
DM
12002
12003 /* although we're not duplicating the tmps stack, we should still
12004 * add entries for any SVs on the tmps stack that got cloned by a
12005 * non-refcount means (eg a temp in @_); otherwise they will be
12006 * orphaned
12007 */
907b3e23 12008 for (i = 0; i<= proto_perl->Itmps_ix; i++) {
6136c704 12009 SV * const nsv = (SV*)ptr_table_fetch(PL_ptr_table,
907b3e23 12010 proto_perl->Itmps_stack[i]);
34394ecd
DM
12011 if (nsv && !SvREFCNT(nsv)) {
12012 EXTEND_MORTAL(1);
b37c2d43 12013 PL_tmps_stack[++PL_tmps_ix] = SvREFCNT_inc_simple(nsv);
34394ecd
DM
12014 }
12015 }
bd81e77b 12016 }
1d7c1841 12017
907b3e23 12018 PL_start_env = proto_perl->Istart_env; /* XXXXXX */
bd81e77b 12019 PL_top_env = &PL_start_env;
1d7c1841 12020
907b3e23 12021 PL_op = proto_perl->Iop;
4a4c6fe3 12022
a0714e2c 12023 PL_Sv = NULL;
bd81e77b 12024 PL_Xpv = (XPV*)NULL;
24792b8d 12025 my_perl->Ina = proto_perl->Ina;
1fcf4c12 12026
907b3e23
DM
12027 PL_statbuf = proto_perl->Istatbuf;
12028 PL_statcache = proto_perl->Istatcache;
12029 PL_statgv = gv_dup(proto_perl->Istatgv, param);
12030 PL_statname = sv_dup_inc(proto_perl->Istatname, param);
bd81e77b 12031#ifdef HAS_TIMES
907b3e23 12032 PL_timesbuf = proto_perl->Itimesbuf;
bd81e77b 12033#endif
1d7c1841 12034
907b3e23
DM
12035 PL_tainted = proto_perl->Itainted;
12036 PL_curpm = proto_perl->Icurpm; /* XXX No PMOP ref count */
12037 PL_rs = sv_dup_inc(proto_perl->Irs, param);
12038 PL_last_in_gv = gv_dup(proto_perl->Ilast_in_gv, param);
12039 PL_ofs_sv = sv_dup_inc(proto_perl->Iofs_sv, param);
12040 PL_defoutgv = gv_dup_inc(proto_perl->Idefoutgv, param);
12041 PL_chopset = proto_perl->Ichopset; /* XXX never deallocated */
12042 PL_toptarget = sv_dup_inc(proto_perl->Itoptarget, param);
12043 PL_bodytarget = sv_dup_inc(proto_perl->Ibodytarget, param);
12044 PL_formtarget = sv_dup(proto_perl->Iformtarget, param);
12045
12046 PL_restartop = proto_perl->Irestartop;
12047 PL_in_eval = proto_perl->Iin_eval;
12048 PL_delaymagic = proto_perl->Idelaymagic;
12049 PL_dirty = proto_perl->Idirty;
12050 PL_localizing = proto_perl->Ilocalizing;
12051
12052 PL_errors = sv_dup_inc(proto_perl->Ierrors, param);
4608196e 12053 PL_hv_fetch_ent_mh = NULL;
907b3e23 12054 PL_modcount = proto_perl->Imodcount;
5f66b61c 12055 PL_lastgotoprobe = NULL;
907b3e23 12056 PL_dumpindent = proto_perl->Idumpindent;
1d7c1841 12057
907b3e23
DM
12058 PL_sortcop = (OP*)any_dup(proto_perl->Isortcop, proto_perl);
12059 PL_sortstash = hv_dup(proto_perl->Isortstash, param);
12060 PL_firstgv = gv_dup(proto_perl->Ifirstgv, param);
12061 PL_secondgv = gv_dup(proto_perl->Isecondgv, param);
bd61b366 12062 PL_efloatbuf = NULL; /* reinits on demand */
bd81e77b 12063 PL_efloatsize = 0; /* reinits on demand */
d2d73c3e 12064
bd81e77b 12065 /* regex stuff */
1d7c1841 12066
bd81e77b
NC
12067 PL_screamfirst = NULL;
12068 PL_screamnext = NULL;
12069 PL_maxscream = -1; /* reinits on demand */
a0714e2c 12070 PL_lastscream = NULL;
1d7c1841 12071
1d7c1841 12072
907b3e23 12073 PL_regdummy = proto_perl->Iregdummy;
bd81e77b
NC
12074 PL_colorset = 0; /* reinits PL_colors[] */
12075 /*PL_colors[6] = {0,0,0,0,0,0};*/
1d7c1841 12076
84da74a7 12077
1d7c1841 12078
bd81e77b 12079 /* Pluggable optimizer */
907b3e23 12080 PL_peepp = proto_perl->Ipeepp;
1d7c1841 12081
bd81e77b 12082 PL_stashcache = newHV();
1d7c1841 12083
b7185faf 12084 PL_watchaddr = (char **) ptr_table_fetch(PL_ptr_table,
907b3e23 12085 proto_perl->Iwatchaddr);
b7185faf
DM
12086 PL_watchok = PL_watchaddr ? * PL_watchaddr : NULL;
12087 if (PL_debug && PL_watchaddr) {
12088 PerlIO_printf(Perl_debug_log,
12089 "WATCHING: %"UVxf" cloned as %"UVxf" with value %"UVxf"\n",
907b3e23 12090 PTR2UV(proto_perl->Iwatchaddr), PTR2UV(PL_watchaddr),
b7185faf
DM
12091 PTR2UV(PL_watchok));
12092 }
12093
bd81e77b
NC
12094 if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
12095 ptr_table_free(PL_ptr_table);
12096 PL_ptr_table = NULL;
12097 }
1d7c1841 12098
bd81e77b
NC
12099 /* Call the ->CLONE method, if it exists, for each of the stashes
12100 identified by sv_dup() above.
12101 */
12102 while(av_len(param->stashes) != -1) {
12103 HV* const stash = (HV*) av_shift(param->stashes);
12104 GV* const cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
12105 if (cloner && GvCV(cloner)) {
12106 dSP;
12107 ENTER;
12108 SAVETMPS;
12109 PUSHMARK(SP);
6e449a3a 12110 mXPUSHs(newSVhek(HvNAME_HEK(stash)));
bd81e77b
NC
12111 PUTBACK;
12112 call_sv((SV*)GvCV(cloner), G_DISCARD);
12113 FREETMPS;
12114 LEAVE;
12115 }
1d7c1841 12116 }
1d7c1841 12117
bd81e77b 12118 SvREFCNT_dec(param->stashes);
1d7c1841 12119
bd81e77b
NC
12120 /* orphaned? eg threads->new inside BEGIN or use */
12121 if (PL_compcv && ! SvREFCNT(PL_compcv)) {
b37c2d43 12122 SvREFCNT_inc_simple_void(PL_compcv);
bd81e77b
NC
12123 SAVEFREESV(PL_compcv);
12124 }
dd2155a4 12125
bd81e77b
NC
12126 return my_perl;
12127}
1d7c1841 12128
bd81e77b 12129#endif /* USE_ITHREADS */
1d7c1841 12130
bd81e77b
NC
12131/*
12132=head1 Unicode Support
1d7c1841 12133
bd81e77b 12134=for apidoc sv_recode_to_utf8
1d7c1841 12135
bd81e77b
NC
12136The encoding is assumed to be an Encode object, on entry the PV
12137of the sv is assumed to be octets in that encoding, and the sv
12138will be converted into Unicode (and UTF-8).
1d7c1841 12139
bd81e77b
NC
12140If the sv already is UTF-8 (or if it is not POK), or if the encoding
12141is not a reference, nothing is done to the sv. If the encoding is not
12142an C<Encode::XS> Encoding object, bad things will happen.
12143(See F<lib/encoding.pm> and L<Encode>).
1d7c1841 12144
bd81e77b 12145The PV of the sv is returned.
1d7c1841 12146
bd81e77b 12147=cut */
1d7c1841 12148
bd81e77b
NC
12149char *
12150Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
12151{
12152 dVAR;
7918f24d
NC
12153
12154 PERL_ARGS_ASSERT_SV_RECODE_TO_UTF8;
12155
bd81e77b
NC
12156 if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
12157 SV *uni;
12158 STRLEN len;
12159 const char *s;
12160 dSP;
12161 ENTER;
12162 SAVETMPS;
12163 save_re_context();
12164 PUSHMARK(sp);
12165 EXTEND(SP, 3);
12166 XPUSHs(encoding);
12167 XPUSHs(sv);
12168/*
12169 NI-S 2002/07/09
12170 Passing sv_yes is wrong - it needs to be or'ed set of constants
12171 for Encode::XS, while UTf-8 decode (currently) assumes a true value means
12172 remove converted chars from source.
1d7c1841 12173
bd81e77b 12174 Both will default the value - let them.
1d7c1841 12175
bd81e77b
NC
12176 XPUSHs(&PL_sv_yes);
12177*/
12178 PUTBACK;
12179 call_method("decode", G_SCALAR);
12180 SPAGAIN;
12181 uni = POPs;
12182 PUTBACK;
12183 s = SvPV_const(uni, len);
12184 if (s != SvPVX_const(sv)) {
12185 SvGROW(sv, len + 1);
12186 Move(s, SvPVX(sv), len + 1, char);
12187 SvCUR_set(sv, len);
12188 }
12189 FREETMPS;
12190 LEAVE;
12191 SvUTF8_on(sv);
12192 return SvPVX(sv);
389edf32 12193 }
bd81e77b
NC
12194 return SvPOKp(sv) ? SvPVX(sv) : NULL;
12195}
1d7c1841 12196
bd81e77b
NC
12197/*
12198=for apidoc sv_cat_decode
1d7c1841 12199
bd81e77b
NC
12200The encoding is assumed to be an Encode object, the PV of the ssv is
12201assumed to be octets in that encoding and decoding the input starts
12202from the position which (PV + *offset) pointed to. The dsv will be
12203concatenated the decoded UTF-8 string from ssv. Decoding will terminate
12204when the string tstr appears in decoding output or the input ends on
12205the PV of the ssv. The value which the offset points will be modified
12206to the last input position on the ssv.
1d7c1841 12207
bd81e77b 12208Returns TRUE if the terminator was found, else returns FALSE.
1d7c1841 12209
bd81e77b
NC
12210=cut */
12211
12212bool
12213Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
12214 SV *ssv, int *offset, char *tstr, int tlen)
12215{
12216 dVAR;
12217 bool ret = FALSE;
7918f24d
NC
12218
12219 PERL_ARGS_ASSERT_SV_CAT_DECODE;
12220
bd81e77b
NC
12221 if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) {
12222 SV *offsv;
12223 dSP;
12224 ENTER;
12225 SAVETMPS;
12226 save_re_context();
12227 PUSHMARK(sp);
12228 EXTEND(SP, 6);
12229 XPUSHs(encoding);
12230 XPUSHs(dsv);
12231 XPUSHs(ssv);
6e449a3a
MHM
12232 offsv = newSViv(*offset);
12233 mXPUSHs(offsv);
12234 mXPUSHp(tstr, tlen);
bd81e77b
NC
12235 PUTBACK;
12236 call_method("cat_decode", G_SCALAR);
12237 SPAGAIN;
12238 ret = SvTRUE(TOPs);
12239 *offset = SvIV(offsv);
12240 PUTBACK;
12241 FREETMPS;
12242 LEAVE;
389edf32 12243 }
bd81e77b
NC
12244 else
12245 Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
12246 return ret;
1d7c1841 12247
bd81e77b 12248}
1d7c1841 12249
bd81e77b
NC
12250/* ---------------------------------------------------------------------
12251 *
12252 * support functions for report_uninit()
12253 */
1d7c1841 12254
bd81e77b
NC
12255/* the maxiumum size of array or hash where we will scan looking
12256 * for the undefined element that triggered the warning */
1d7c1841 12257
bd81e77b 12258#define FUV_MAX_SEARCH_SIZE 1000
1d7c1841 12259
bd81e77b
NC
12260/* Look for an entry in the hash whose value has the same SV as val;
12261 * If so, return a mortal copy of the key. */
1d7c1841 12262
bd81e77b
NC
12263STATIC SV*
12264S_find_hash_subscript(pTHX_ HV *hv, SV* val)
12265{
12266 dVAR;
12267 register HE **array;
12268 I32 i;
6c3182a5 12269
7918f24d
NC
12270 PERL_ARGS_ASSERT_FIND_HASH_SUBSCRIPT;
12271
bd81e77b
NC
12272 if (!hv || SvMAGICAL(hv) || !HvARRAY(hv) ||
12273 (HvTOTALKEYS(hv) > FUV_MAX_SEARCH_SIZE))
a0714e2c 12274 return NULL;
6c3182a5 12275
bd81e77b 12276 array = HvARRAY(hv);
6c3182a5 12277
bd81e77b
NC
12278 for (i=HvMAX(hv); i>0; i--) {
12279 register HE *entry;
12280 for (entry = array[i]; entry; entry = HeNEXT(entry)) {
12281 if (HeVAL(entry) != val)
12282 continue;
12283 if ( HeVAL(entry) == &PL_sv_undef ||
12284 HeVAL(entry) == &PL_sv_placeholder)
12285 continue;
12286 if (!HeKEY(entry))
a0714e2c 12287 return NULL;
bd81e77b
NC
12288 if (HeKLEN(entry) == HEf_SVKEY)
12289 return sv_mortalcopy(HeKEY_sv(entry));
a663657d 12290 return sv_2mortal(newSVhek(HeKEY_hek(entry)));
bd81e77b
NC
12291 }
12292 }
a0714e2c 12293 return NULL;
bd81e77b 12294}
6c3182a5 12295
bd81e77b
NC
12296/* Look for an entry in the array whose value has the same SV as val;
12297 * If so, return the index, otherwise return -1. */
6c3182a5 12298
bd81e77b
NC
12299STATIC I32
12300S_find_array_subscript(pTHX_ AV *av, SV* val)
12301{
97aff369 12302 dVAR;
7918f24d
NC
12303
12304 PERL_ARGS_ASSERT_FIND_ARRAY_SUBSCRIPT;
12305
bd81e77b
NC
12306 if (!av || SvMAGICAL(av) || !AvARRAY(av) ||
12307 (AvFILLp(av) > FUV_MAX_SEARCH_SIZE))
12308 return -1;
57c6e6d2 12309
4a021917
AL
12310 if (val != &PL_sv_undef) {
12311 SV ** const svp = AvARRAY(av);
12312 I32 i;
12313
12314 for (i=AvFILLp(av); i>=0; i--)
12315 if (svp[i] == val)
12316 return i;
bd81e77b
NC
12317 }
12318 return -1;
12319}
15a5279a 12320
bd81e77b
NC
12321/* S_varname(): return the name of a variable, optionally with a subscript.
12322 * If gv is non-zero, use the name of that global, along with gvtype (one
12323 * of "$", "@", "%"); otherwise use the name of the lexical at pad offset
12324 * targ. Depending on the value of the subscript_type flag, return:
12325 */
bce260cd 12326
bd81e77b
NC
12327#define FUV_SUBSCRIPT_NONE 1 /* "@foo" */
12328#define FUV_SUBSCRIPT_ARRAY 2 /* "$foo[aindex]" */
12329#define FUV_SUBSCRIPT_HASH 3 /* "$foo{keyname}" */
12330#define FUV_SUBSCRIPT_WITHIN 4 /* "within @foo" */
bce260cd 12331
bd81e77b
NC
12332STATIC SV*
12333S_varname(pTHX_ GV *gv, const char gvtype, PADOFFSET targ,
12334 SV* keyname, I32 aindex, int subscript_type)
12335{
1d7c1841 12336
bd81e77b
NC
12337 SV * const name = sv_newmortal();
12338 if (gv) {
12339 char buffer[2];
12340 buffer[0] = gvtype;
12341 buffer[1] = 0;
1d7c1841 12342
bd81e77b 12343 /* as gv_fullname4(), but add literal '^' for $^FOO names */
66fe0623 12344
bd81e77b 12345 gv_fullname4(name, gv, buffer, 0);
1d7c1841 12346
bd81e77b
NC
12347 if ((unsigned int)SvPVX(name)[1] <= 26) {
12348 buffer[0] = '^';
12349 buffer[1] = SvPVX(name)[1] + 'A' - 1;
1d7c1841 12350
bd81e77b
NC
12351 /* Swap the 1 unprintable control character for the 2 byte pretty
12352 version - ie substr($name, 1, 1) = $buffer; */
12353 sv_insert(name, 1, 1, buffer, 2);
1d7c1841 12354 }
bd81e77b
NC
12355 }
12356 else {
289b91d9 12357 CV * const cv = find_runcv(NULL);
bd81e77b
NC
12358 SV *sv;
12359 AV *av;
1d7c1841 12360
bd81e77b 12361 if (!cv || !CvPADLIST(cv))
a0714e2c 12362 return NULL;
bd81e77b
NC
12363 av = (AV*)(*av_fetch(CvPADLIST(cv), 0, FALSE));
12364 sv = *av_fetch(av, targ, FALSE);
f8503592 12365 sv_setpvn(name, SvPV_nolen_const(sv), SvCUR(sv));
bd81e77b 12366 }
1d7c1841 12367
bd81e77b 12368 if (subscript_type == FUV_SUBSCRIPT_HASH) {
561b68a9 12369 SV * const sv = newSV(0);
bd81e77b
NC
12370 *SvPVX(name) = '$';
12371 Perl_sv_catpvf(aTHX_ name, "{%s}",
12372 pv_display(sv,SvPVX_const(keyname), SvCUR(keyname), 0, 32));
12373 SvREFCNT_dec(sv);
12374 }
12375 else if (subscript_type == FUV_SUBSCRIPT_ARRAY) {
12376 *SvPVX(name) = '$';
12377 Perl_sv_catpvf(aTHX_ name, "[%"IVdf"]", (IV)aindex);
12378 }
84335ee9
NC
12379 else if (subscript_type == FUV_SUBSCRIPT_WITHIN) {
12380 /* We know that name has no magic, so can use 0 instead of SV_GMAGIC */
12381 Perl_sv_insert_flags(aTHX_ name, 0, 0, STR_WITH_LEN("within "), 0);
12382 }
1d7c1841 12383
bd81e77b
NC
12384 return name;
12385}
1d7c1841 12386
1d7c1841 12387
bd81e77b
NC
12388/*
12389=for apidoc find_uninit_var
1d7c1841 12390
bd81e77b
NC
12391Find the name of the undefined variable (if any) that caused the operator o
12392to issue a "Use of uninitialized value" warning.
12393If match is true, only return a name if it's value matches uninit_sv.
12394So roughly speaking, if a unary operator (such as OP_COS) generates a
12395warning, then following the direct child of the op may yield an
12396OP_PADSV or OP_GV that gives the name of the undefined variable. On the
12397other hand, with OP_ADD there are two branches to follow, so we only print
12398the variable name if we get an exact match.
1d7c1841 12399
bd81e77b 12400The name is returned as a mortal SV.
1d7c1841 12401
bd81e77b
NC
12402Assumes that PL_op is the op that originally triggered the error, and that
12403PL_comppad/PL_curpad points to the currently executing pad.
1d7c1841 12404
bd81e77b
NC
12405=cut
12406*/
1d7c1841 12407
bd81e77b
NC
12408STATIC SV *
12409S_find_uninit_var(pTHX_ OP* obase, SV* uninit_sv, bool match)
12410{
12411 dVAR;
12412 SV *sv;
12413 AV *av;
12414 GV *gv;
12415 OP *o, *o2, *kid;
1d7c1841 12416
bd81e77b
NC
12417 if (!obase || (match && (!uninit_sv || uninit_sv == &PL_sv_undef ||
12418 uninit_sv == &PL_sv_placeholder)))
a0714e2c 12419 return NULL;
1d7c1841 12420
bd81e77b 12421 switch (obase->op_type) {
1d7c1841 12422
bd81e77b
NC
12423 case OP_RV2AV:
12424 case OP_RV2HV:
12425 case OP_PADAV:
12426 case OP_PADHV:
12427 {
12428 const bool pad = (obase->op_type == OP_PADAV || obase->op_type == OP_PADHV);
12429 const bool hash = (obase->op_type == OP_PADHV || obase->op_type == OP_RV2HV);
12430 I32 index = 0;
a0714e2c 12431 SV *keysv = NULL;
bd81e77b 12432 int subscript_type = FUV_SUBSCRIPT_WITHIN;
1d7c1841 12433
bd81e77b
NC
12434 if (pad) { /* @lex, %lex */
12435 sv = PAD_SVl(obase->op_targ);
a0714e2c 12436 gv = NULL;
bd81e77b
NC
12437 }
12438 else {
12439 if (cUNOPx(obase)->op_first->op_type == OP_GV) {
12440 /* @global, %global */
12441 gv = cGVOPx_gv(cUNOPx(obase)->op_first);
12442 if (!gv)
12443 break;
12444 sv = hash ? (SV*)GvHV(gv): (SV*)GvAV(gv);
12445 }
12446 else /* @{expr}, %{expr} */
12447 return find_uninit_var(cUNOPx(obase)->op_first,
12448 uninit_sv, match);
12449 }
1d7c1841 12450
bd81e77b
NC
12451 /* attempt to find a match within the aggregate */
12452 if (hash) {
d4c19fe8 12453 keysv = find_hash_subscript((HV*)sv, uninit_sv);
bd81e77b
NC
12454 if (keysv)
12455 subscript_type = FUV_SUBSCRIPT_HASH;
12456 }
12457 else {
e15d5972 12458 index = find_array_subscript((AV*)sv, uninit_sv);
bd81e77b
NC
12459 if (index >= 0)
12460 subscript_type = FUV_SUBSCRIPT_ARRAY;
12461 }
1d7c1841 12462
bd81e77b
NC
12463 if (match && subscript_type == FUV_SUBSCRIPT_WITHIN)
12464 break;
1d7c1841 12465
bd81e77b
NC
12466 return varname(gv, hash ? '%' : '@', obase->op_targ,
12467 keysv, index, subscript_type);
12468 }
1d7c1841 12469
bd81e77b
NC
12470 case OP_PADSV:
12471 if (match && PAD_SVl(obase->op_targ) != uninit_sv)
12472 break;
a0714e2c
SS
12473 return varname(NULL, '$', obase->op_targ,
12474 NULL, 0, FUV_SUBSCRIPT_NONE);
1d7c1841 12475
bd81e77b
NC
12476 case OP_GVSV:
12477 gv = cGVOPx_gv(obase);
12478 if (!gv || (match && GvSV(gv) != uninit_sv))
12479 break;
a0714e2c 12480 return varname(gv, '$', 0, NULL, 0, FUV_SUBSCRIPT_NONE);
1d7c1841 12481
bd81e77b
NC
12482 case OP_AELEMFAST:
12483 if (obase->op_flags & OPf_SPECIAL) { /* lexical array */
12484 if (match) {
12485 SV **svp;
12486 av = (AV*)PAD_SV(obase->op_targ);
12487 if (!av || SvRMAGICAL(av))
12488 break;
12489 svp = av_fetch(av, (I32)obase->op_private, FALSE);
12490 if (!svp || *svp != uninit_sv)
12491 break;
12492 }
a0714e2c
SS
12493 return varname(NULL, '$', obase->op_targ,
12494 NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
12495 }
12496 else {
12497 gv = cGVOPx_gv(obase);
12498 if (!gv)
12499 break;
12500 if (match) {
12501 SV **svp;
12502 av = GvAV(gv);
12503 if (!av || SvRMAGICAL(av))
12504 break;
12505 svp = av_fetch(av, (I32)obase->op_private, FALSE);
12506 if (!svp || *svp != uninit_sv)
12507 break;
12508 }
12509 return varname(gv, '$', 0,
a0714e2c 12510 NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
12511 }
12512 break;
1d7c1841 12513
bd81e77b
NC
12514 case OP_EXISTS:
12515 o = cUNOPx(obase)->op_first;
12516 if (!o || o->op_type != OP_NULL ||
12517 ! (o->op_targ == OP_AELEM || o->op_targ == OP_HELEM))
12518 break;
12519 return find_uninit_var(cBINOPo->op_last, uninit_sv, match);
a2efc822 12520
bd81e77b
NC
12521 case OP_AELEM:
12522 case OP_HELEM:
12523 if (PL_op == obase)
12524 /* $a[uninit_expr] or $h{uninit_expr} */
12525 return find_uninit_var(cBINOPx(obase)->op_last, uninit_sv, match);
081fc587 12526
a0714e2c 12527 gv = NULL;
bd81e77b
NC
12528 o = cBINOPx(obase)->op_first;
12529 kid = cBINOPx(obase)->op_last;
8cf8f3d1 12530
bd81e77b 12531 /* get the av or hv, and optionally the gv */
a0714e2c 12532 sv = NULL;
bd81e77b
NC
12533 if (o->op_type == OP_PADAV || o->op_type == OP_PADHV) {
12534 sv = PAD_SV(o->op_targ);
12535 }
12536 else if ((o->op_type == OP_RV2AV || o->op_type == OP_RV2HV)
12537 && cUNOPo->op_first->op_type == OP_GV)
12538 {
12539 gv = cGVOPx_gv(cUNOPo->op_first);
12540 if (!gv)
12541 break;
12542 sv = o->op_type == OP_RV2HV ? (SV*)GvHV(gv) : (SV*)GvAV(gv);
12543 }
12544 if (!sv)
12545 break;
12546
12547 if (kid && kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid))) {
12548 /* index is constant */
12549 if (match) {
12550 if (SvMAGICAL(sv))
12551 break;
12552 if (obase->op_type == OP_HELEM) {
12553 HE* he = hv_fetch_ent((HV*)sv, cSVOPx_sv(kid), 0, 0);
12554 if (!he || HeVAL(he) != uninit_sv)
12555 break;
12556 }
12557 else {
00b6aa41 12558 SV * const * const svp = av_fetch((AV*)sv, SvIV(cSVOPx_sv(kid)), FALSE);
bd81e77b
NC
12559 if (!svp || *svp != uninit_sv)
12560 break;
12561 }
12562 }
12563 if (obase->op_type == OP_HELEM)
12564 return varname(gv, '%', o->op_targ,
12565 cSVOPx_sv(kid), 0, FUV_SUBSCRIPT_HASH);
12566 else
a0714e2c 12567 return varname(gv, '@', o->op_targ, NULL,
bd81e77b 12568 SvIV(cSVOPx_sv(kid)), FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
12569 }
12570 else {
12571 /* index is an expression;
12572 * attempt to find a match within the aggregate */
12573 if (obase->op_type == OP_HELEM) {
d4c19fe8 12574 SV * const keysv = find_hash_subscript((HV*)sv, uninit_sv);
bd81e77b
NC
12575 if (keysv)
12576 return varname(gv, '%', o->op_targ,
12577 keysv, 0, FUV_SUBSCRIPT_HASH);
12578 }
12579 else {
d4c19fe8 12580 const I32 index = find_array_subscript((AV*)sv, uninit_sv);
bd81e77b
NC
12581 if (index >= 0)
12582 return varname(gv, '@', o->op_targ,
a0714e2c 12583 NULL, index, FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
12584 }
12585 if (match)
12586 break;
12587 return varname(gv,
12588 (o->op_type == OP_PADAV || o->op_type == OP_RV2AV)
12589 ? '@' : '%',
a0714e2c 12590 o->op_targ, NULL, 0, FUV_SUBSCRIPT_WITHIN);
f284b03f 12591 }
bd81e77b 12592 break;
dc507217 12593
bd81e77b
NC
12594 case OP_AASSIGN:
12595 /* only examine RHS */
12596 return find_uninit_var(cBINOPx(obase)->op_first, uninit_sv, match);
6d26897e 12597
bd81e77b
NC
12598 case OP_OPEN:
12599 o = cUNOPx(obase)->op_first;
12600 if (o->op_type == OP_PUSHMARK)
12601 o = o->op_sibling;
1d7c1841 12602
bd81e77b
NC
12603 if (!o->op_sibling) {
12604 /* one-arg version of open is highly magical */
a0ae6670 12605
bd81e77b
NC
12606 if (o->op_type == OP_GV) { /* open FOO; */
12607 gv = cGVOPx_gv(o);
12608 if (match && GvSV(gv) != uninit_sv)
12609 break;
12610 return varname(gv, '$', 0,
a0714e2c 12611 NULL, 0, FUV_SUBSCRIPT_NONE);
bd81e77b
NC
12612 }
12613 /* other possibilities not handled are:
12614 * open $x; or open my $x; should return '${*$x}'
12615 * open expr; should return '$'.expr ideally
12616 */
12617 break;
12618 }
12619 goto do_op;
ccfc67b7 12620
bd81e77b
NC
12621 /* ops where $_ may be an implicit arg */
12622 case OP_TRANS:
12623 case OP_SUBST:
12624 case OP_MATCH:
12625 if ( !(obase->op_flags & OPf_STACKED)) {
12626 if (uninit_sv == ((obase->op_private & OPpTARGET_MY)
12627 ? PAD_SVl(obase->op_targ)
12628 : DEFSV))
12629 {
12630 sv = sv_newmortal();
12631 sv_setpvn(sv, "$_", 2);
12632 return sv;
12633 }
12634 }
12635 goto do_op;
9f4817db 12636
bd81e77b
NC
12637 case OP_PRTF:
12638 case OP_PRINT:
3ef1310e 12639 case OP_SAY:
fa8d1836 12640 match = 1; /* print etc can return undef on defined args */
bd81e77b
NC
12641 /* skip filehandle as it can't produce 'undef' warning */
12642 o = cUNOPx(obase)->op_first;
12643 if ((obase->op_flags & OPf_STACKED) && o->op_type == OP_PUSHMARK)
12644 o = o->op_sibling->op_sibling;
12645 goto do_op2;
9f4817db 12646
9f4817db 12647
50edf520 12648 case OP_ENTEREVAL: /* could be eval $undef or $x='$undef'; eval $x */
bd81e77b 12649 case OP_RV2SV:
8b0dea50
DM
12650 case OP_CUSTOM: /* XS or custom code could trigger random warnings */
12651
12652 /* the following ops are capable of returning PL_sv_undef even for
12653 * defined arg(s) */
12654
12655 case OP_BACKTICK:
12656 case OP_PIPE_OP:
12657 case OP_FILENO:
12658 case OP_BINMODE:
12659 case OP_TIED:
12660 case OP_GETC:
12661 case OP_SYSREAD:
12662 case OP_SEND:
12663 case OP_IOCTL:
12664 case OP_SOCKET:
12665 case OP_SOCKPAIR:
12666 case OP_BIND:
12667 case OP_CONNECT:
12668 case OP_LISTEN:
12669 case OP_ACCEPT:
12670 case OP_SHUTDOWN:
12671 case OP_SSOCKOPT:
12672 case OP_GETPEERNAME:
12673 case OP_FTRREAD:
12674 case OP_FTRWRITE:
12675 case OP_FTREXEC:
12676 case OP_FTROWNED:
12677 case OP_FTEREAD:
12678 case OP_FTEWRITE:
12679 case OP_FTEEXEC:
12680 case OP_FTEOWNED:
12681 case OP_FTIS:
12682 case OP_FTZERO:
12683 case OP_FTSIZE:
12684 case OP_FTFILE:
12685 case OP_FTDIR:
12686 case OP_FTLINK:
12687 case OP_FTPIPE:
12688 case OP_FTSOCK:
12689 case OP_FTBLK:
12690 case OP_FTCHR:
12691 case OP_FTTTY:
12692 case OP_FTSUID:
12693 case OP_FTSGID:
12694 case OP_FTSVTX:
12695 case OP_FTTEXT:
12696 case OP_FTBINARY:
12697 case OP_FTMTIME:
12698 case OP_FTATIME:
12699 case OP_FTCTIME:
12700 case OP_READLINK:
12701 case OP_OPEN_DIR:
12702 case OP_READDIR:
12703 case OP_TELLDIR:
12704 case OP_SEEKDIR:
12705 case OP_REWINDDIR:
12706 case OP_CLOSEDIR:
12707 case OP_GMTIME:
12708 case OP_ALARM:
12709 case OP_SEMGET:
12710 case OP_GETLOGIN:
12711 case OP_UNDEF:
12712 case OP_SUBSTR:
12713 case OP_AEACH:
12714 case OP_EACH:
12715 case OP_SORT:
12716 case OP_CALLER:
12717 case OP_DOFILE:
fa8d1836
DM
12718 case OP_PROTOTYPE:
12719 case OP_NCMP:
12720 case OP_SMARTMATCH:
12721 case OP_UNPACK:
12722 case OP_SYSOPEN:
12723 case OP_SYSSEEK:
8b0dea50 12724 match = 1;
bd81e77b 12725 goto do_op;
9f4817db 12726
7697b7e7
DM
12727 case OP_ENTERSUB:
12728 case OP_GOTO:
a2fb3d36
DM
12729 /* XXX tmp hack: these two may call an XS sub, and currently
12730 XS subs don't have a SUB entry on the context stack, so CV and
12731 pad determination goes wrong, and BAD things happen. So, just
12732 don't try to determine the value under those circumstances.
7697b7e7
DM
12733 Need a better fix at dome point. DAPM 11/2007 */
12734 break;
12735
8b0dea50 12736
cc4b8646
DM
12737 case OP_POS:
12738 /* def-ness of rval pos() is independent of the def-ness of its arg */
12739 if ( !(obase->op_flags & OPf_MOD))
12740 break;
12741
bd81e77b
NC
12742 case OP_SCHOMP:
12743 case OP_CHOMP:
12744 if (SvROK(PL_rs) && uninit_sv == SvRV(PL_rs))
84bafc02 12745 return newSVpvs_flags("${$/}", SVs_TEMP);
5f66b61c 12746 /*FALLTHROUGH*/
5d170f3a 12747
bd81e77b
NC
12748 default:
12749 do_op:
12750 if (!(obase->op_flags & OPf_KIDS))
12751 break;
12752 o = cUNOPx(obase)->op_first;
12753
12754 do_op2:
12755 if (!o)
12756 break;
f9893866 12757
bd81e77b
NC
12758 /* if all except one arg are constant, or have no side-effects,
12759 * or are optimized away, then it's unambiguous */
5f66b61c 12760 o2 = NULL;
bd81e77b 12761 for (kid=o; kid; kid = kid->op_sibling) {
e15d5972
AL
12762 if (kid) {
12763 const OPCODE type = kid->op_type;
12764 if ( (type == OP_CONST && SvOK(cSVOPx_sv(kid)))
12765 || (type == OP_NULL && ! (kid->op_flags & OPf_KIDS))
12766 || (type == OP_PUSHMARK)
bd81e77b 12767 )
bd81e77b 12768 continue;
e15d5972 12769 }
bd81e77b 12770 if (o2) { /* more than one found */
5f66b61c 12771 o2 = NULL;
bd81e77b
NC
12772 break;
12773 }
12774 o2 = kid;
12775 }
12776 if (o2)
12777 return find_uninit_var(o2, uninit_sv, match);
7a5fa8a2 12778
bd81e77b
NC
12779 /* scan all args */
12780 while (o) {
12781 sv = find_uninit_var(o, uninit_sv, 1);
12782 if (sv)
12783 return sv;
12784 o = o->op_sibling;
d0063567 12785 }
bd81e77b 12786 break;
f9893866 12787 }
a0714e2c 12788 return NULL;
9f4817db
JH
12789}
12790
220e2d4e 12791
bd81e77b
NC
12792/*
12793=for apidoc report_uninit
68795e93 12794
bd81e77b 12795Print appropriate "Use of uninitialized variable" warning
220e2d4e 12796
bd81e77b
NC
12797=cut
12798*/
220e2d4e 12799
bd81e77b
NC
12800void
12801Perl_report_uninit(pTHX_ SV* uninit_sv)
220e2d4e 12802{
97aff369 12803 dVAR;
bd81e77b 12804 if (PL_op) {
a0714e2c 12805 SV* varname = NULL;
bd81e77b
NC
12806 if (uninit_sv) {
12807 varname = find_uninit_var(PL_op, uninit_sv,0);
12808 if (varname)
12809 sv_insert(varname, 0, 0, " ", 1);
12810 }
12811 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
12812 varname ? SvPV_nolen_const(varname) : "",
12813 " in ", OP_DESC(PL_op));
220e2d4e 12814 }
a73e8557 12815 else
bd81e77b
NC
12816 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
12817 "", "", "");
220e2d4e 12818}
f9893866 12819
241d1a3b
NC
12820/*
12821 * Local variables:
12822 * c-indentation-style: bsd
12823 * c-basic-offset: 4
12824 * indent-tabs-mode: t
12825 * End:
12826 *
37442d52
RGS
12827 * ex: set ts=8 sts=4 sw=4 noet:
12828 */