This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
regcomp.sym: update comment
[perl5.git] / sv.c
CommitLineData
a0d0e21e 1/* sv.c
79072805 2 *
1129b882 3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
83706693
RGS
4 * 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by Larry Wall
5 * and others
79072805
LW
6 *
7 * You may distribute under the terms of either the GNU General Public
8 * License or the Artistic License, as specified in the README file.
9 *
4ac71550
TC
10 */
11
12/*
13 * 'I wonder what the Entish is for "yes" and "no",' he thought.
14 * --Pippin
15 *
16 * [p.480 of _The Lord of the Rings_, III/iv: "Treebeard"]
17 */
18
19/*
645c22ef
DM
20 *
21 *
5e045b90
AMS
22 * This file contains the code that creates, manipulates and destroys
23 * scalar values (SVs). The other types (AV, HV, GV, etc.) reuse the
24 * structure of an SV, so their creation and destruction is handled
25 * here; higher-level functions are in av.c, hv.c, and so on. Opcode
26 * level functions (eg. substr, split, join) for each of the types are
27 * in the pp*.c files.
79072805
LW
28 */
29
30#include "EXTERN.h"
864dbfa3 31#define PERL_IN_SV_C
79072805 32#include "perl.h"
d2f185dc 33#include "regcomp.h"
79072805 34
51371543 35#define FCALL *f
2c5424a7 36
2f8ed50e
OS
37#ifdef __Lynx__
38/* Missing proto on LynxOS */
39 char *gconvert(double, int, int, char *);
40#endif
41
e23c8137 42#ifdef PERL_UTF8_CACHE_ASSERT
ab455f60 43/* if adding more checks watch out for the following tests:
e23c8137
JH
44 * t/op/index.t t/op/length.t t/op/pat.t t/op/substr.t
45 * lib/utf8.t lib/Unicode/Collate/t/index.t
46 * --jhi
47 */
6f207bd3 48# define ASSERT_UTF8_CACHE(cache) \
ab455f60
NC
49 STMT_START { if (cache) { assert((cache)[0] <= (cache)[1]); \
50 assert((cache)[2] <= (cache)[3]); \
51 assert((cache)[3] <= (cache)[1]);} \
52 } STMT_END
e23c8137 53#else
6f207bd3 54# define ASSERT_UTF8_CACHE(cache) NOOP
e23c8137
JH
55#endif
56
f8c7b90f 57#ifdef PERL_OLD_COPY_ON_WRITE
765f542d 58#define SV_COW_NEXT_SV(sv) INT2PTR(SV *,SvUVX(sv))
607fa7f2 59#define SV_COW_NEXT_SV_SET(current,next) SvUV_set(current, PTR2UV(next))
b5ccf5f2 60/* This is a pessimistic view. Scalar must be purely a read-write PV to copy-
765f542d 61 on-write. */
765f542d 62#endif
645c22ef
DM
63
64/* ============================================================================
65
66=head1 Allocation and deallocation of SVs.
67
d2a0f284
JC
68An SV (or AV, HV, etc.) is allocated in two parts: the head (struct
69sv, av, hv...) contains type and reference count information, and for
70many types, a pointer to the body (struct xrv, xpv, xpviv...), which
71contains fields specific to each type. Some types store all they need
72in the head, so don't have a body.
73
74In all but the most memory-paranoid configuations (ex: PURIFY), heads
75and bodies are allocated out of arenas, which by default are
76approximately 4K chunks of memory parcelled up into N heads or bodies.
93e68bfb
JC
77Sv-bodies are allocated by their sv-type, guaranteeing size
78consistency needed to allocate safely from arrays.
79
d2a0f284
JC
80For SV-heads, the first slot in each arena is reserved, and holds a
81link to the next arena, some flags, and a note of the number of slots.
82Snaked through each arena chain is a linked list of free items; when
83this becomes empty, an extra arena is allocated and divided up into N
84items which are threaded into the free list.
85
86SV-bodies are similar, but they use arena-sets by default, which
87separate the link and info from the arena itself, and reclaim the 1st
88slot in the arena. SV-bodies are further described later.
645c22ef
DM
89
90The following global variables are associated with arenas:
91
92 PL_sv_arenaroot pointer to list of SV arenas
93 PL_sv_root pointer to list of free SV structures
94
d2a0f284
JC
95 PL_body_arenas head of linked-list of body arenas
96 PL_body_roots[] array of pointers to list of free bodies of svtype
97 arrays are indexed by the svtype needed
93e68bfb 98
d2a0f284
JC
99A few special SV heads are not allocated from an arena, but are
100instead directly created in the interpreter structure, eg PL_sv_undef.
93e68bfb
JC
101The size of arenas can be changed from the default by setting
102PERL_ARENA_SIZE appropriately at compile time.
645c22ef
DM
103
104The SV arena serves the secondary purpose of allowing still-live SVs
105to be located and destroyed during final cleanup.
106
107At the lowest level, the macros new_SV() and del_SV() grab and free
108an SV head. (If debugging with -DD, del_SV() calls the function S_del_sv()
109to return the SV to the free list with error checking.) new_SV() calls
110more_sv() / sv_add_arena() to add an extra arena if the free list is empty.
111SVs in the free list have their SvTYPE field set to all ones.
112
ff276b08 113At the time of very final cleanup, sv_free_arenas() is called from
645c22ef 114perl_destruct() to physically free all the arenas allocated since the
6a93a7e5 115start of the interpreter.
645c22ef 116
645c22ef
DM
117The function visit() scans the SV arenas list, and calls a specified
118function for each SV it finds which is still live - ie which has an SvTYPE
119other than all 1's, and a non-zero SvREFCNT. visit() is used by the
120following functions (specified as [function that calls visit()] / [function
121called by visit() for each SV]):
122
123 sv_report_used() / do_report_used()
f2524eef 124 dump all remaining SVs (debugging aid)
645c22ef 125
e4487e9b
DM
126 sv_clean_objs() / do_clean_objs(),do_clean_named_objs(),
127 do_clean_named_io_objs()
645c22ef 128 Attempt to free all objects pointed to by RVs,
c3b19b5c 129 and try to do the same for all objects indirectly
645c22ef
DM
130 referenced by typeglobs too. Called once from
131 perl_destruct(), prior to calling sv_clean_all()
132 below.
133
134 sv_clean_all() / do_clean_all()
135 SvREFCNT_dec(sv) each remaining SV, possibly
136 triggering an sv_free(). It also sets the
137 SVf_BREAK flag on the SV to indicate that the
138 refcnt has been artificially lowered, and thus
139 stopping sv_free() from giving spurious warnings
140 about SVs which unexpectedly have a refcnt
141 of zero. called repeatedly from perl_destruct()
142 until there are no SVs left.
143
93e68bfb 144=head2 Arena allocator API Summary
645c22ef
DM
145
146Private API to rest of sv.c
147
148 new_SV(), del_SV(),
149
df0f0429 150 new_XPVNV(), del_XPVGV(),
645c22ef
DM
151 etc
152
153Public API:
154
8cf8f3d1 155 sv_report_used(), sv_clean_objs(), sv_clean_all(), sv_free_arenas()
645c22ef 156
645c22ef
DM
157=cut
158
3e8320cc 159 * ========================================================================= */
645c22ef 160
4561caa4
CS
161/*
162 * "A time to plant, and a time to uproot what was planted..."
163 */
164
d7a2c63c
MHM
165#ifdef PERL_MEM_LOG
166# define MEM_LOG_NEW_SV(sv, file, line, func) \
167 Perl_mem_log_new_sv(sv, file, line, func)
168# define MEM_LOG_DEL_SV(sv, file, line, func) \
169 Perl_mem_log_del_sv(sv, file, line, func)
170#else
171# define MEM_LOG_NEW_SV(sv, file, line, func) NOOP
172# define MEM_LOG_DEL_SV(sv, file, line, func) NOOP
173#endif
174
fd0854ff 175#ifdef DEBUG_LEAKING_SCALARS
22162ca8 176# define FREE_SV_DEBUG_FILE(sv) Safefree((sv)->sv_debug_file)
d7a2c63c
MHM
177# define DEBUG_SV_SERIAL(sv) \
178 DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) del_SV\n", \
179 PTR2UV(sv), (long)(sv)->sv_debug_serial))
fd0854ff
DM
180#else
181# define FREE_SV_DEBUG_FILE(sv)
d7a2c63c 182# define DEBUG_SV_SERIAL(sv) NOOP
fd0854ff
DM
183#endif
184
48614a46
NC
185#ifdef PERL_POISON
186# define SvARENA_CHAIN(sv) ((sv)->sv_u.svu_rv)
daba3364 187# define SvARENA_CHAIN_SET(sv,val) (sv)->sv_u.svu_rv = MUTABLE_SV((val))
48614a46
NC
188/* Whilst I'd love to do this, it seems that things like to check on
189 unreferenced scalars
7e337ee0 190# define POSION_SV_HEAD(sv) PoisonNew(sv, 1, struct STRUCT_SV)
48614a46 191*/
7e337ee0
JH
192# define POSION_SV_HEAD(sv) PoisonNew(&SvANY(sv), 1, void *), \
193 PoisonNew(&SvREFCNT(sv), 1, U32)
48614a46
NC
194#else
195# define SvARENA_CHAIN(sv) SvANY(sv)
3eef1deb 196# define SvARENA_CHAIN_SET(sv,val) SvANY(sv) = (void *)(val)
48614a46
NC
197# define POSION_SV_HEAD(sv)
198#endif
199
990198f0
DM
200/* Mark an SV head as unused, and add to free list.
201 *
202 * If SVf_BREAK is set, skip adding it to the free list, as this SV had
203 * its refcount artificially decremented during global destruction, so
204 * there may be dangling pointers to it. The last thing we want in that
205 * case is for it to be reused. */
206
053fc874
GS
207#define plant_SV(p) \
208 STMT_START { \
990198f0 209 const U32 old_flags = SvFLAGS(p); \
d7a2c63c
MHM
210 MEM_LOG_DEL_SV(p, __FILE__, __LINE__, FUNCTION__); \
211 DEBUG_SV_SERIAL(p); \
fd0854ff 212 FREE_SV_DEBUG_FILE(p); \
48614a46 213 POSION_SV_HEAD(p); \
053fc874 214 SvFLAGS(p) = SVTYPEMASK; \
990198f0 215 if (!(old_flags & SVf_BREAK)) { \
3eef1deb 216 SvARENA_CHAIN_SET(p, PL_sv_root); \
990198f0
DM
217 PL_sv_root = (p); \
218 } \
053fc874
GS
219 --PL_sv_count; \
220 } STMT_END
a0d0e21e 221
053fc874
GS
222#define uproot_SV(p) \
223 STMT_START { \
224 (p) = PL_sv_root; \
daba3364 225 PL_sv_root = MUTABLE_SV(SvARENA_CHAIN(p)); \
053fc874
GS
226 ++PL_sv_count; \
227 } STMT_END
228
645c22ef 229
cac9b346
NC
230/* make some more SVs by adding another arena */
231
cac9b346
NC
232STATIC SV*
233S_more_sv(pTHX)
234{
97aff369 235 dVAR;
cac9b346 236 SV* sv;
9a87bd09
NC
237 char *chunk; /* must use New here to match call to */
238 Newx(chunk,PERL_ARENA_SIZE,char); /* Safefree() in sv_free_arenas() */
239 sv_add_arena(chunk, PERL_ARENA_SIZE, 0);
cac9b346
NC
240 uproot_SV(sv);
241 return sv;
242}
243
645c22ef
DM
244/* new_SV(): return a new, empty SV head */
245
eba0f806
DM
246#ifdef DEBUG_LEAKING_SCALARS
247/* provide a real function for a debugger to play with */
248STATIC SV*
d7a2c63c 249S_new_SV(pTHX_ const char *file, int line, const char *func)
eba0f806
DM
250{
251 SV* sv;
252
eba0f806
DM
253 if (PL_sv_root)
254 uproot_SV(sv);
255 else
cac9b346 256 sv = S_more_sv(aTHX);
eba0f806
DM
257 SvANY(sv) = 0;
258 SvREFCNT(sv) = 1;
259 SvFLAGS(sv) = 0;
fd0854ff 260 sv->sv_debug_optype = PL_op ? PL_op->op_type : 0;
e385c3bf
DM
261 sv->sv_debug_line = (U16) (PL_parser && PL_parser->copline != NOLINE
262 ? PL_parser->copline
263 : PL_curcop
f24aceb1
DM
264 ? CopLINE(PL_curcop)
265 : 0
e385c3bf 266 );
fd0854ff 267 sv->sv_debug_inpad = 0;
cd676548 268 sv->sv_debug_parent = NULL;
fd0854ff 269 sv->sv_debug_file = PL_curcop ? savepv(CopFILE(PL_curcop)): NULL;
d7a2c63c
MHM
270
271 sv->sv_debug_serial = PL_sv_serial++;
272
273 MEM_LOG_NEW_SV(sv, file, line, func);
274 DEBUG_m(PerlIO_printf(Perl_debug_log, "0x%"UVxf": (%05ld) new_SV (from %s:%d [%s])\n",
275 PTR2UV(sv), (long)sv->sv_debug_serial, file, line, func));
276
eba0f806
DM
277 return sv;
278}
d7a2c63c 279# define new_SV(p) (p)=S_new_SV(aTHX_ __FILE__, __LINE__, FUNCTION__)
eba0f806
DM
280
281#else
282# define new_SV(p) \
053fc874 283 STMT_START { \
053fc874
GS
284 if (PL_sv_root) \
285 uproot_SV(p); \
286 else \
cac9b346 287 (p) = S_more_sv(aTHX); \
053fc874
GS
288 SvANY(p) = 0; \
289 SvREFCNT(p) = 1; \
290 SvFLAGS(p) = 0; \
d7a2c63c 291 MEM_LOG_NEW_SV(p, __FILE__, __LINE__, FUNCTION__); \
053fc874 292 } STMT_END
eba0f806 293#endif
463ee0b2 294
645c22ef
DM
295
296/* del_SV(): return an empty SV head to the free list */
297
a0d0e21e 298#ifdef DEBUGGING
4561caa4 299
053fc874
GS
300#define del_SV(p) \
301 STMT_START { \
aea4f609 302 if (DEBUG_D_TEST) \
053fc874
GS
303 del_sv(p); \
304 else \
305 plant_SV(p); \
053fc874 306 } STMT_END
a0d0e21e 307
76e3520e 308STATIC void
cea2e8a9 309S_del_sv(pTHX_ SV *p)
463ee0b2 310{
97aff369 311 dVAR;
7918f24d
NC
312
313 PERL_ARGS_ASSERT_DEL_SV;
314
aea4f609 315 if (DEBUG_D_TEST) {
4633a7c4 316 SV* sva;
a3b680e6 317 bool ok = 0;
daba3364 318 for (sva = PL_sv_arenaroot; sva; sva = MUTABLE_SV(SvANY(sva))) {
53c1dcc0
AL
319 const SV * const sv = sva + 1;
320 const SV * const svend = &sva[SvREFCNT(sva)];
c0ff570e 321 if (p >= sv && p < svend) {
a0d0e21e 322 ok = 1;
c0ff570e
NC
323 break;
324 }
a0d0e21e
LW
325 }
326 if (!ok) {
9b387841
NC
327 Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),
328 "Attempt to free non-arena SV: 0x%"UVxf
329 pTHX__FORMAT, PTR2UV(p) pTHX__VALUE);
a0d0e21e
LW
330 return;
331 }
332 }
4561caa4 333 plant_SV(p);
463ee0b2 334}
a0d0e21e 335
4561caa4
CS
336#else /* ! DEBUGGING */
337
338#define del_SV(p) plant_SV(p)
339
340#endif /* DEBUGGING */
463ee0b2 341
645c22ef
DM
342
343/*
ccfc67b7
JH
344=head1 SV Manipulation Functions
345
645c22ef
DM
346=for apidoc sv_add_arena
347
348Given a chunk of memory, link it to the head of the list of arenas,
349and split it into a list of free SVs.
350
351=cut
352*/
353
d2bd4e7f
NC
354static void
355S_sv_add_arena(pTHX_ char *const ptr, const U32 size, const U32 flags)
463ee0b2 356{
97aff369 357 dVAR;
daba3364 358 SV *const sva = MUTABLE_SV(ptr);
463ee0b2
LW
359 register SV* sv;
360 register SV* svend;
4633a7c4 361
7918f24d
NC
362 PERL_ARGS_ASSERT_SV_ADD_ARENA;
363
4633a7c4 364 /* The first SV in an arena isn't an SV. */
3280af22 365 SvANY(sva) = (void *) PL_sv_arenaroot; /* ptr to next arena */
4633a7c4
LW
366 SvREFCNT(sva) = size / sizeof(SV); /* number of SV slots */
367 SvFLAGS(sva) = flags; /* FAKE if not to be freed */
368
3280af22
NIS
369 PL_sv_arenaroot = sva;
370 PL_sv_root = sva + 1;
4633a7c4
LW
371
372 svend = &sva[SvREFCNT(sva) - 1];
373 sv = sva + 1;
463ee0b2 374 while (sv < svend) {
3eef1deb 375 SvARENA_CHAIN_SET(sv, (sv + 1));
03e36789 376#ifdef DEBUGGING
978b032e 377 SvREFCNT(sv) = 0;
03e36789 378#endif
4b69cbe3 379 /* Must always set typemask because it's always checked in on cleanup
03e36789 380 when the arenas are walked looking for objects. */
8990e307 381 SvFLAGS(sv) = SVTYPEMASK;
463ee0b2
LW
382 sv++;
383 }
3eef1deb 384 SvARENA_CHAIN_SET(sv, 0);
03e36789
NC
385#ifdef DEBUGGING
386 SvREFCNT(sv) = 0;
387#endif
4633a7c4
LW
388 SvFLAGS(sv) = SVTYPEMASK;
389}
390
055972dc
DM
391/* visit(): call the named function for each non-free SV in the arenas
392 * whose flags field matches the flags/mask args. */
645c22ef 393
5226ed68 394STATIC I32
de37a194 395S_visit(pTHX_ SVFUNC_t f, const U32 flags, const U32 mask)
8990e307 396{
97aff369 397 dVAR;
4633a7c4 398 SV* sva;
5226ed68 399 I32 visited = 0;
8990e307 400
7918f24d
NC
401 PERL_ARGS_ASSERT_VISIT;
402
daba3364 403 for (sva = PL_sv_arenaroot; sva; sva = MUTABLE_SV(SvANY(sva))) {
53c1dcc0 404 register const SV * const svend = &sva[SvREFCNT(sva)];
a3b680e6 405 register SV* sv;
4561caa4 406 for (sv = sva + 1; sv < svend; ++sv) {
055972dc
DM
407 if (SvTYPE(sv) != SVTYPEMASK
408 && (sv->sv_flags & mask) == flags
409 && SvREFCNT(sv))
410 {
acfe0abc 411 (FCALL)(aTHX_ sv);
5226ed68
JH
412 ++visited;
413 }
8990e307
LW
414 }
415 }
5226ed68 416 return visited;
8990e307
LW
417}
418
758a08c3
JH
419#ifdef DEBUGGING
420
645c22ef
DM
421/* called by sv_report_used() for each live SV */
422
423static void
5fa45a31 424do_report_used(pTHX_ SV *const sv)
645c22ef
DM
425{
426 if (SvTYPE(sv) != SVTYPEMASK) {
427 PerlIO_printf(Perl_debug_log, "****\n");
428 sv_dump(sv);
429 }
430}
758a08c3 431#endif
645c22ef
DM
432
433/*
434=for apidoc sv_report_used
435
436Dump the contents of all SVs not yet freed. (Debugging aid).
437
438=cut
439*/
440
8990e307 441void
864dbfa3 442Perl_sv_report_used(pTHX)
4561caa4 443{
ff270d3a 444#ifdef DEBUGGING
055972dc 445 visit(do_report_used, 0, 0);
96a5add6
AL
446#else
447 PERL_UNUSED_CONTEXT;
ff270d3a 448#endif
4561caa4
CS
449}
450
645c22ef
DM
451/* called by sv_clean_objs() for each live SV */
452
453static void
de37a194 454do_clean_objs(pTHX_ SV *const ref)
645c22ef 455{
97aff369 456 dVAR;
ea724faa
NC
457 assert (SvROK(ref));
458 {
823a54a3
AL
459 SV * const target = SvRV(ref);
460 if (SvOBJECT(target)) {
461 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(ref)));
462 if (SvWEAKREF(ref)) {
463 sv_del_backref(target, ref);
464 SvWEAKREF_off(ref);
465 SvRV_set(ref, NULL);
466 } else {
467 SvROK_off(ref);
468 SvRV_set(ref, NULL);
469 SvREFCNT_dec(target);
470 }
645c22ef
DM
471 }
472 }
473
474 /* XXX Might want to check arrays, etc. */
475}
476
645c22ef 477
e4487e9b
DM
478/* clear any slots in a GV which hold objects - except IO;
479 * called by sv_clean_objs() for each live GV */
480
645c22ef 481static void
f30de749 482do_clean_named_objs(pTHX_ SV *const sv)
645c22ef 483{
97aff369 484 dVAR;
57ef47cc 485 SV *obj;
ea724faa 486 assert(SvTYPE(sv) == SVt_PVGV);
d011219a 487 assert(isGV_with_GP(sv));
57ef47cc
DM
488 if (!GvGP(sv))
489 return;
490
491 /* freeing GP entries may indirectly free the current GV;
492 * hold onto it while we mess with the GP slots */
493 SvREFCNT_inc(sv);
494
495 if ( ((obj = GvSV(sv) )) && SvOBJECT(obj)) {
496 DEBUG_D((PerlIO_printf(Perl_debug_log,
497 "Cleaning named glob SV object:\n "), sv_dump(obj)));
498 GvSV(sv) = NULL;
499 SvREFCNT_dec(obj);
500 }
501 if ( ((obj = MUTABLE_SV(GvAV(sv)) )) && SvOBJECT(obj)) {
502 DEBUG_D((PerlIO_printf(Perl_debug_log,
503 "Cleaning named glob AV object:\n "), sv_dump(obj)));
504 GvAV(sv) = NULL;
505 SvREFCNT_dec(obj);
506 }
507 if ( ((obj = MUTABLE_SV(GvHV(sv)) )) && SvOBJECT(obj)) {
508 DEBUG_D((PerlIO_printf(Perl_debug_log,
509 "Cleaning named glob HV object:\n "), sv_dump(obj)));
510 GvHV(sv) = NULL;
511 SvREFCNT_dec(obj);
512 }
513 if ( ((obj = MUTABLE_SV(GvCV(sv)) )) && SvOBJECT(obj)) {
514 DEBUG_D((PerlIO_printf(Perl_debug_log,
515 "Cleaning named glob CV object:\n "), sv_dump(obj)));
516 GvCV(sv) = NULL;
517 SvREFCNT_dec(obj);
518 }
e4487e9b
DM
519 SvREFCNT_dec(sv); /* undo the inc above */
520}
521
68b590d9 522/* clear any IO slots in a GV which hold objects (except stderr, defout);
e4487e9b
DM
523 * called by sv_clean_objs() for each live GV */
524
525static void
526do_clean_named_io_objs(pTHX_ SV *const sv)
527{
528 dVAR;
529 SV *obj;
530 assert(SvTYPE(sv) == SVt_PVGV);
531 assert(isGV_with_GP(sv));
68b590d9 532 if (!GvGP(sv) || sv == (SV*)PL_stderrgv || sv == (SV*)PL_defoutgv)
e4487e9b
DM
533 return;
534
535 SvREFCNT_inc(sv);
57ef47cc
DM
536 if ( ((obj = MUTABLE_SV(GvIO(sv)) )) && SvOBJECT(obj)) {
537 DEBUG_D((PerlIO_printf(Perl_debug_log,
538 "Cleaning named glob IO object:\n "), sv_dump(obj)));
539 GvIOp(sv) = NULL;
540 SvREFCNT_dec(obj);
645c22ef 541 }
57ef47cc 542 SvREFCNT_dec(sv); /* undo the inc above */
645c22ef 543}
645c22ef
DM
544
545/*
546=for apidoc sv_clean_objs
547
548Attempt to destroy all objects not yet freed
549
550=cut
551*/
552
4561caa4 553void
864dbfa3 554Perl_sv_clean_objs(pTHX)
4561caa4 555{
97aff369 556 dVAR;
68b590d9 557 GV *olddef, *olderr;
3280af22 558 PL_in_clean_objs = TRUE;
055972dc 559 visit(do_clean_objs, SVf_ROK, SVf_ROK);
e4487e9b
DM
560 /* Some barnacles may yet remain, clinging to typeglobs.
561 * Run the non-IO destructors first: they may want to output
562 * error messages, close files etc */
d011219a 563 visit(do_clean_named_objs, SVt_PVGV|SVpgv_GP, SVTYPEMASK|SVp_POK|SVpgv_GP);
e4487e9b 564 visit(do_clean_named_io_objs, SVt_PVGV|SVpgv_GP, SVTYPEMASK|SVp_POK|SVpgv_GP);
68b590d9
DM
565 olddef = PL_defoutgv;
566 PL_defoutgv = NULL; /* disable skip of PL_defoutgv */
567 if (olddef && isGV_with_GP(olddef))
568 do_clean_named_io_objs(aTHX_ MUTABLE_SV(olddef));
569 olderr = PL_stderrgv;
570 PL_stderrgv = NULL; /* disable skip of PL_stderrgv */
571 if (olderr && isGV_with_GP(olderr))
572 do_clean_named_io_objs(aTHX_ MUTABLE_SV(olderr));
573 SvREFCNT_dec(olddef);
3280af22 574 PL_in_clean_objs = FALSE;
4561caa4
CS
575}
576
645c22ef
DM
577/* called by sv_clean_all() for each live SV */
578
579static void
de37a194 580do_clean_all(pTHX_ SV *const sv)
645c22ef 581{
97aff369 582 dVAR;
daba3364 583 if (sv == (const SV *) PL_fdpid || sv == (const SV *)PL_strtab) {
cddfcddc 584 /* don't clean pid table and strtab */
d17ea597 585 return;
cddfcddc 586 }
645c22ef
DM
587 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%"UVxf"\n", PTR2UV(sv)) ));
588 SvFLAGS(sv) |= SVf_BREAK;
589 SvREFCNT_dec(sv);
590}
591
592/*
593=for apidoc sv_clean_all
594
595Decrement the refcnt of each remaining SV, possibly triggering a
596cleanup. This function may have to be called multiple times to free
ff276b08 597SVs which are in complex self-referential hierarchies.
645c22ef
DM
598
599=cut
600*/
601
5226ed68 602I32
864dbfa3 603Perl_sv_clean_all(pTHX)
8990e307 604{
97aff369 605 dVAR;
5226ed68 606 I32 cleaned;
3280af22 607 PL_in_clean_all = TRUE;
055972dc 608 cleaned = visit(do_clean_all, 0,0);
5226ed68 609 return cleaned;
8990e307 610}
463ee0b2 611
5e258f8c
JC
612/*
613 ARENASETS: a meta-arena implementation which separates arena-info
614 into struct arena_set, which contains an array of struct
615 arena_descs, each holding info for a single arena. By separating
616 the meta-info from the arena, we recover the 1st slot, formerly
617 borrowed for list management. The arena_set is about the size of an
39244528 618 arena, avoiding the needless malloc overhead of a naive linked-list.
5e258f8c
JC
619
620 The cost is 1 arena-set malloc per ~320 arena-mallocs, + the unused
621 memory in the last arena-set (1/2 on average). In trade, we get
622 back the 1st slot in each arena (ie 1.7% of a CV-arena, less for
d2a0f284 623 smaller types). The recovery of the wasted space allows use of
e15dad31
JC
624 small arenas for large, rare body types, by changing array* fields
625 in body_details_by_type[] below.
5e258f8c 626*/
5e258f8c 627struct arena_desc {
398c677b
NC
628 char *arena; /* the raw storage, allocated aligned */
629 size_t size; /* its size ~4k typ */
e5973ed5 630 svtype utype; /* bodytype stored in arena */
5e258f8c
JC
631};
632
e6148039
NC
633struct arena_set;
634
635/* Get the maximum number of elements in set[] such that struct arena_set
e15dad31 636 will fit within PERL_ARENA_SIZE, which is probably just under 4K, and
e6148039
NC
637 therefore likely to be 1 aligned memory page. */
638
639#define ARENAS_PER_SET ((PERL_ARENA_SIZE - sizeof(struct arena_set*) \
640 - 2 * sizeof(int)) / sizeof (struct arena_desc))
5e258f8c
JC
641
642struct arena_set {
643 struct arena_set* next;
0a848332
NC
644 unsigned int set_size; /* ie ARENAS_PER_SET */
645 unsigned int curr; /* index of next available arena-desc */
5e258f8c
JC
646 struct arena_desc set[ARENAS_PER_SET];
647};
648
645c22ef
DM
649/*
650=for apidoc sv_free_arenas
651
652Deallocate the memory used by all arenas. Note that all the individual SV
653heads and bodies within the arenas must already have been freed.
654
655=cut
656*/
4633a7c4 657void
864dbfa3 658Perl_sv_free_arenas(pTHX)
4633a7c4 659{
97aff369 660 dVAR;
4633a7c4
LW
661 SV* sva;
662 SV* svanext;
0a848332 663 unsigned int i;
4633a7c4
LW
664
665 /* Free arenas here, but be careful about fake ones. (We assume
666 contiguity of the fake ones with the corresponding real ones.) */
667
3280af22 668 for (sva = PL_sv_arenaroot; sva; sva = svanext) {
daba3364 669 svanext = MUTABLE_SV(SvANY(sva));
4633a7c4 670 while (svanext && SvFAKE(svanext))
daba3364 671 svanext = MUTABLE_SV(SvANY(svanext));
4633a7c4
LW
672
673 if (!SvFAKE(sva))
1df70142 674 Safefree(sva);
4633a7c4 675 }
93e68bfb 676
5e258f8c 677 {
0a848332
NC
678 struct arena_set *aroot = (struct arena_set*) PL_body_arenas;
679
680 while (aroot) {
681 struct arena_set *current = aroot;
682 i = aroot->curr;
683 while (i--) {
5e258f8c
JC
684 assert(aroot->set[i].arena);
685 Safefree(aroot->set[i].arena);
686 }
0a848332
NC
687 aroot = aroot->next;
688 Safefree(current);
5e258f8c
JC
689 }
690 }
dc8220bf 691 PL_body_arenas = 0;
fdda85ca 692
0a848332
NC
693 i = PERL_ARENA_ROOTS_SIZE;
694 while (i--)
93e68bfb 695 PL_body_roots[i] = 0;
93e68bfb 696
3280af22
NIS
697 PL_sv_arenaroot = 0;
698 PL_sv_root = 0;
4633a7c4
LW
699}
700
bd81e77b
NC
701/*
702 Here are mid-level routines that manage the allocation of bodies out
703 of the various arenas. There are 5 kinds of arenas:
29489e7c 704
bd81e77b
NC
705 1. SV-head arenas, which are discussed and handled above
706 2. regular body arenas
707 3. arenas for reduced-size bodies
708 4. Hash-Entry arenas
29489e7c 709
bd81e77b
NC
710 Arena types 2 & 3 are chained by body-type off an array of
711 arena-root pointers, which is indexed by svtype. Some of the
712 larger/less used body types are malloced singly, since a large
713 unused block of them is wasteful. Also, several svtypes dont have
714 bodies; the data fits into the sv-head itself. The arena-root
715 pointer thus has a few unused root-pointers (which may be hijacked
716 later for arena types 4,5)
29489e7c 717
bd81e77b
NC
718 3 differs from 2 as an optimization; some body types have several
719 unused fields in the front of the structure (which are kept in-place
720 for consistency). These bodies can be allocated in smaller chunks,
721 because the leading fields arent accessed. Pointers to such bodies
722 are decremented to point at the unused 'ghost' memory, knowing that
723 the pointers are used with offsets to the real memory.
29489e7c 724
d2a0f284
JC
725
726=head1 SV-Body Allocation
727
728Allocation of SV-bodies is similar to SV-heads, differing as follows;
729the allocation mechanism is used for many body types, so is somewhat
730more complicated, it uses arena-sets, and has no need for still-live
731SV detection.
732
733At the outermost level, (new|del)_X*V macros return bodies of the
734appropriate type. These macros call either (new|del)_body_type or
735(new|del)_body_allocated macro pairs, depending on specifics of the
736type. Most body types use the former pair, the latter pair is used to
737allocate body types with "ghost fields".
738
739"ghost fields" are fields that are unused in certain types, and
69ba284b 740consequently don't need to actually exist. They are declared because
d2a0f284
JC
741they're part of a "base type", which allows use of functions as
742methods. The simplest examples are AVs and HVs, 2 aggregate types
743which don't use the fields which support SCALAR semantics.
744
69ba284b 745For these types, the arenas are carved up into appropriately sized
d2a0f284
JC
746chunks, we thus avoid wasted memory for those unaccessed members.
747When bodies are allocated, we adjust the pointer back in memory by the
69ba284b 748size of the part not allocated, so it's as if we allocated the full
d2a0f284
JC
749structure. (But things will all go boom if you write to the part that
750is "not there", because you'll be overwriting the last members of the
751preceding structure in memory.)
752
69ba284b
NC
753We calculate the correction using the STRUCT_OFFSET macro on the first
754member present. If the allocated structure is smaller (no initial NV
755actually allocated) then the net effect is to subtract the size of the NV
756from the pointer, to return a new pointer as if an initial NV were actually
757allocated. (We were using structures named *_allocated for this, but
758this turned out to be a subtle bug, because a structure without an NV
759could have a lower alignment constraint, but the compiler is allowed to
760optimised accesses based on the alignment constraint of the actual pointer
761to the full structure, for example, using a single 64 bit load instruction
762because it "knows" that two adjacent 32 bit members will be 8-byte aligned.)
d2a0f284
JC
763
764This is the same trick as was used for NV and IV bodies. Ironically it
765doesn't need to be used for NV bodies any more, because NV is now at
766the start of the structure. IV bodies don't need it either, because
767they are no longer allocated.
768
769In turn, the new_body_* allocators call S_new_body(), which invokes
770new_body_inline macro, which takes a lock, and takes a body off the
1e30fcd5 771linked list at PL_body_roots[sv_type], calling Perl_more_bodies() if
d2a0f284
JC
772necessary to refresh an empty list. Then the lock is released, and
773the body is returned.
774
99816f8d 775Perl_more_bodies allocates a new arena, and carves it up into an array of N
d2a0f284
JC
776bodies, which it strings into a linked list. It looks up arena-size
777and body-size from the body_details table described below, thus
778supporting the multiple body-types.
779
780If PURIFY is defined, or PERL_ARENA_SIZE=0, arenas are not used, and
781the (new|del)_X*V macros are mapped directly to malloc/free.
782
d2a0f284
JC
783For each sv-type, struct body_details bodies_by_type[] carries
784parameters which control these aspects of SV handling:
785
786Arena_size determines whether arenas are used for this body type, and if
787so, how big they are. PURIFY or PERL_ARENA_SIZE=0 set this field to
788zero, forcing individual mallocs and frees.
789
790Body_size determines how big a body is, and therefore how many fit into
791each arena. Offset carries the body-pointer adjustment needed for
69ba284b 792"ghost fields", and is used in *_allocated macros.
d2a0f284
JC
793
794But its main purpose is to parameterize info needed in
795Perl_sv_upgrade(). The info here dramatically simplifies the function
69ba284b 796vs the implementation in 5.8.8, making it table-driven. All fields
d2a0f284
JC
797are used for this, except for arena_size.
798
799For the sv-types that have no bodies, arenas are not used, so those
800PL_body_roots[sv_type] are unused, and can be overloaded. In
801something of a special case, SVt_NULL is borrowed for HE arenas;
c6f8b1d0 802PL_body_roots[HE_SVSLOT=SVt_NULL] is filled by S_more_he, but the
d2a0f284 803bodies_by_type[SVt_NULL] slot is not used, as the table is not
c6f8b1d0 804available in hv.c.
d2a0f284 805
29489e7c
DM
806*/
807
bd81e77b 808struct body_details {
0fb58b32 809 U8 body_size; /* Size to allocate */
10666ae3 810 U8 copy; /* Size of structure to copy (may be shorter) */
0fb58b32 811 U8 offset;
10666ae3
NC
812 unsigned int type : 4; /* We have space for a sanity check. */
813 unsigned int cant_upgrade : 1; /* Cannot upgrade this type */
814 unsigned int zero_nv : 1; /* zero the NV when upgrading from this */
815 unsigned int arena : 1; /* Allocated from an arena */
816 size_t arena_size; /* Size of arena to allocate */
bd81e77b 817};
29489e7c 818
bd81e77b
NC
819#define HADNV FALSE
820#define NONV TRUE
29489e7c 821
d2a0f284 822
bd81e77b
NC
823#ifdef PURIFY
824/* With -DPURFIY we allocate everything directly, and don't use arenas.
825 This seems a rather elegant way to simplify some of the code below. */
826#define HASARENA FALSE
827#else
828#define HASARENA TRUE
829#endif
830#define NOARENA FALSE
29489e7c 831
d2a0f284
JC
832/* Size the arenas to exactly fit a given number of bodies. A count
833 of 0 fits the max number bodies into a PERL_ARENA_SIZE.block,
834 simplifying the default. If count > 0, the arena is sized to fit
835 only that many bodies, allowing arenas to be used for large, rare
836 bodies (XPVFM, XPVIO) without undue waste. The arena size is
837 limited by PERL_ARENA_SIZE, so we can safely oversize the
838 declarations.
839 */
95db5f15
MB
840#define FIT_ARENA0(body_size) \
841 ((size_t)(PERL_ARENA_SIZE / body_size) * body_size)
842#define FIT_ARENAn(count,body_size) \
843 ( count * body_size <= PERL_ARENA_SIZE) \
844 ? count * body_size \
845 : FIT_ARENA0 (body_size)
846#define FIT_ARENA(count,body_size) \
847 count \
848 ? FIT_ARENAn (count, body_size) \
849 : FIT_ARENA0 (body_size)
d2a0f284 850
bd81e77b
NC
851/* Calculate the length to copy. Specifically work out the length less any
852 final padding the compiler needed to add. See the comment in sv_upgrade
853 for why copying the padding proved to be a bug. */
29489e7c 854
bd81e77b
NC
855#define copy_length(type, last_member) \
856 STRUCT_OFFSET(type, last_member) \
daba3364 857 + sizeof (((type*)SvANY((const SV *)0))->last_member)
29489e7c 858
bd81e77b 859static const struct body_details bodies_by_type[] = {
829cd18a
NC
860 /* HEs use this offset for their arena. */
861 { 0, 0, 0, SVt_NULL, FALSE, NONV, NOARENA, 0 },
d2a0f284 862
1cb9cd50 863 /* The bind placeholder pretends to be an RV for now.
c6f8b1d0 864 Also it's marked as "can't upgrade" to stop anyone using it before it's
1cb9cd50
NC
865 implemented. */
866 { 0, 0, 0, SVt_BIND, TRUE, NONV, NOARENA, 0 },
867
db93c0c4
NC
868 /* IVs are in the head, so the allocation size is 0. */
869 { 0,
d2a0f284 870 sizeof(IV), /* This is used to copy out the IV body. */
10666ae3 871 STRUCT_OFFSET(XPVIV, xiv_iv), SVt_IV, FALSE, NONV,
db93c0c4 872 NOARENA /* IVS don't need an arena */, 0
d2a0f284
JC
873 },
874
bd81e77b 875 /* 8 bytes on most ILP32 with IEEE doubles */
6e128786
NC
876 { sizeof(NV), sizeof(NV),
877 STRUCT_OFFSET(XPVNV, xnv_u),
878 SVt_NV, FALSE, HADNV, HASARENA, FIT_ARENA(0, sizeof(NV)) },
d2a0f284 879
bd81e77b 880 /* 8 bytes on most ILP32 with IEEE doubles */
bc337e5c 881 { sizeof(XPV) - STRUCT_OFFSET(XPV, xpv_cur),
889d28b2
NC
882 copy_length(XPV, xpv_len) - STRUCT_OFFSET(XPV, xpv_cur),
883 + STRUCT_OFFSET(XPV, xpv_cur),
69ba284b 884 SVt_PV, FALSE, NONV, HASARENA,
889d28b2 885 FIT_ARENA(0, sizeof(XPV) - STRUCT_OFFSET(XPV, xpv_cur)) },
d2a0f284 886
bd81e77b 887 /* 12 */
bc337e5c 888 { sizeof(XPVIV) - STRUCT_OFFSET(XPV, xpv_cur),
889d28b2
NC
889 copy_length(XPVIV, xiv_u) - STRUCT_OFFSET(XPV, xpv_cur),
890 + STRUCT_OFFSET(XPV, xpv_cur),
891 SVt_PVIV, FALSE, NONV, HASARENA,
892 FIT_ARENA(0, sizeof(XPVIV) - STRUCT_OFFSET(XPV, xpv_cur)) },
d2a0f284 893
889d28b2 894 /* 20 */
bc337e5c 895 { sizeof(XPVNV) - STRUCT_OFFSET(XPV, xpv_cur),
889d28b2
NC
896 copy_length(XPVNV, xnv_u) - STRUCT_OFFSET(XPV, xpv_cur),
897 + STRUCT_OFFSET(XPV, xpv_cur),
898 SVt_PVNV, FALSE, HADNV, HASARENA,
899 FIT_ARENA(0, sizeof(XPVNV) - STRUCT_OFFSET(XPV, xpv_cur)) },
d2a0f284 900
bd81e77b 901 /* 28 */
6e128786 902 { sizeof(XPVMG), copy_length(XPVMG, xnv_u), 0, SVt_PVMG, FALSE, HADNV,
d2a0f284 903 HASARENA, FIT_ARENA(0, sizeof(XPVMG)) },
4df7f6af 904
288b8c02 905 /* something big */
601dfd0a
NC
906 { sizeof(regexp),
907 sizeof(regexp),
908 0,
08e44740 909 SVt_REGEXP, FALSE, NONV, HASARENA,
eaeb1e7f 910 FIT_ARENA(0, sizeof(regexp))
5c35adbb 911 },
4df7f6af 912
bd81e77b 913 /* 48 */
10666ae3 914 { sizeof(XPVGV), sizeof(XPVGV), 0, SVt_PVGV, TRUE, HADNV,
d2a0f284
JC
915 HASARENA, FIT_ARENA(0, sizeof(XPVGV)) },
916
bd81e77b 917 /* 64 */
10666ae3 918 { sizeof(XPVLV), sizeof(XPVLV), 0, SVt_PVLV, TRUE, HADNV,
d2a0f284
JC
919 HASARENA, FIT_ARENA(0, sizeof(XPVLV)) },
920
601dfd0a 921 { sizeof(XPVAV),
4f7003f5 922 copy_length(XPVAV, xav_alloc),
601dfd0a 923 0,
69ba284b 924 SVt_PVAV, TRUE, NONV, HASARENA,
601dfd0a 925 FIT_ARENA(0, sizeof(XPVAV)) },
d2a0f284 926
601dfd0a 927 { sizeof(XPVHV),
359164a0 928 copy_length(XPVHV, xhv_max),
601dfd0a 929 0,
69ba284b 930 SVt_PVHV, TRUE, NONV, HASARENA,
601dfd0a 931 FIT_ARENA(0, sizeof(XPVHV)) },
d2a0f284 932
c84c4652 933 /* 56 */
601dfd0a
NC
934 { sizeof(XPVCV),
935 sizeof(XPVCV),
936 0,
69ba284b 937 SVt_PVCV, TRUE, NONV, HASARENA,
601dfd0a 938 FIT_ARENA(0, sizeof(XPVCV)) },
69ba284b 939
601dfd0a
NC
940 { sizeof(XPVFM),
941 sizeof(XPVFM),
942 0,
69ba284b 943 SVt_PVFM, TRUE, NONV, NOARENA,
601dfd0a 944 FIT_ARENA(20, sizeof(XPVFM)) },
d2a0f284
JC
945
946 /* XPVIO is 84 bytes, fits 48x */
601dfd0a
NC
947 { sizeof(XPVIO),
948 sizeof(XPVIO),
949 0,
b6f60916 950 SVt_PVIO, TRUE, NONV, HASARENA,
601dfd0a 951 FIT_ARENA(24, sizeof(XPVIO)) },
bd81e77b 952};
29489e7c 953
bd81e77b 954#define new_body_allocated(sv_type) \
d2a0f284 955 (void *)((char *)S_new_body(aTHX_ sv_type) \
bd81e77b 956 - bodies_by_type[sv_type].offset)
29489e7c 957
26359cfa
NC
958/* return a thing to the free list */
959
960#define del_body(thing, root) \
961 STMT_START { \
962 void ** const thing_copy = (void **)thing; \
963 *thing_copy = *root; \
964 *root = (void*)thing_copy; \
965 } STMT_END
29489e7c 966
bd81e77b 967#ifdef PURIFY
29489e7c 968
beeec492
NC
969#define new_XNV() safemalloc(sizeof(XPVNV))
970#define new_XPVNV() safemalloc(sizeof(XPVNV))
971#define new_XPVMG() safemalloc(sizeof(XPVMG))
29489e7c 972
beeec492 973#define del_XPVGV(p) safefree(p)
29489e7c 974
bd81e77b 975#else /* !PURIFY */
29489e7c 976
65ac1738 977#define new_XNV() new_body_allocated(SVt_NV)
65ac1738 978#define new_XPVNV() new_body_allocated(SVt_PVNV)
65ac1738 979#define new_XPVMG() new_body_allocated(SVt_PVMG)
645c22ef 980
26359cfa
NC
981#define del_XPVGV(p) del_body(p + bodies_by_type[SVt_PVGV].offset, \
982 &PL_body_roots[SVt_PVGV])
1d7c1841 983
bd81e77b 984#endif /* PURIFY */
93e68bfb 985
bd81e77b 986/* no arena for you! */
93e68bfb 987
bd81e77b 988#define new_NOARENA(details) \
beeec492 989 safemalloc((details)->body_size + (details)->offset)
bd81e77b 990#define new_NOARENAZ(details) \
beeec492 991 safecalloc((details)->body_size + (details)->offset, 1)
d2a0f284 992
1e30fcd5
NC
993void *
994Perl_more_bodies (pTHX_ const svtype sv_type, const size_t body_size,
995 const size_t arena_size)
d2a0f284
JC
996{
997 dVAR;
998 void ** const root = &PL_body_roots[sv_type];
99816f8d
NC
999 struct arena_desc *adesc;
1000 struct arena_set *aroot = (struct arena_set *) PL_body_arenas;
1001 unsigned int curr;
d2a0f284
JC
1002 char *start;
1003 const char *end;
02982131 1004 const size_t good_arena_size = Perl_malloc_good_size(arena_size);
0b2d3faa 1005#if defined(DEBUGGING) && !defined(PERL_GLOBAL_STRUCT_PRIVATE)
23e9d66c
NC
1006 static bool done_sanity_check;
1007
0b2d3faa
JH
1008 /* PERL_GLOBAL_STRUCT_PRIVATE cannot coexist with global
1009 * variables like done_sanity_check. */
10666ae3 1010 if (!done_sanity_check) {
ea471437 1011 unsigned int i = SVt_LAST;
10666ae3
NC
1012
1013 done_sanity_check = TRUE;
1014
1015 while (i--)
1016 assert (bodies_by_type[i].type == i);
1017 }
1018#endif
1019
02982131 1020 assert(arena_size);
23e9d66c 1021
99816f8d
NC
1022 /* may need new arena-set to hold new arena */
1023 if (!aroot || aroot->curr >= aroot->set_size) {
1024 struct arena_set *newroot;
1025 Newxz(newroot, 1, struct arena_set);
1026 newroot->set_size = ARENAS_PER_SET;
1027 newroot->next = aroot;
1028 aroot = newroot;
1029 PL_body_arenas = (void *) newroot;
1030 DEBUG_m(PerlIO_printf(Perl_debug_log, "new arenaset %p\n", (void*)aroot));
1031 }
1032
1033 /* ok, now have arena-set with at least 1 empty/available arena-desc */
1034 curr = aroot->curr++;
1035 adesc = &(aroot->set[curr]);
1036 assert(!adesc->arena);
1037
1038 Newx(adesc->arena, good_arena_size, char);
1039 adesc->size = good_arena_size;
1040 adesc->utype = sv_type;
1041 DEBUG_m(PerlIO_printf(Perl_debug_log, "arena %d added: %p size %"UVuf"\n",
1042 curr, (void*)adesc->arena, (UV)good_arena_size));
1043
1044 start = (char *) adesc->arena;
d2a0f284 1045
29657bb6
NC
1046 /* Get the address of the byte after the end of the last body we can fit.
1047 Remember, this is integer division: */
02982131 1048 end = start + good_arena_size / body_size * body_size;
d2a0f284 1049
d2a0f284 1050 /* computed count doesnt reflect the 1st slot reservation */
d8fca402
NC
1051#if defined(MYMALLOC) || defined(HAS_MALLOC_GOOD_SIZE)
1052 DEBUG_m(PerlIO_printf(Perl_debug_log,
1053 "arena %p end %p arena-size %d (from %d) type %d "
1054 "size %d ct %d\n",
02982131
NC
1055 (void*)start, (void*)end, (int)good_arena_size,
1056 (int)arena_size, sv_type, (int)body_size,
1057 (int)good_arena_size / (int)body_size));
d8fca402 1058#else
d2a0f284
JC
1059 DEBUG_m(PerlIO_printf(Perl_debug_log,
1060 "arena %p end %p arena-size %d type %d size %d ct %d\n",
6c9570dc 1061 (void*)start, (void*)end,
02982131
NC
1062 (int)arena_size, sv_type, (int)body_size,
1063 (int)good_arena_size / (int)body_size));
d8fca402 1064#endif
d2a0f284
JC
1065 *root = (void *)start;
1066
29657bb6
NC
1067 while (1) {
1068 /* Where the next body would start: */
d2a0f284 1069 char * const next = start + body_size;
29657bb6
NC
1070
1071 if (next >= end) {
1072 /* This is the last body: */
1073 assert(next == end);
1074
1075 *(void **)start = 0;
1076 return *root;
1077 }
1078
d2a0f284
JC
1079 *(void**) start = (void *)next;
1080 start = next;
1081 }
d2a0f284
JC
1082}
1083
1084/* grab a new thing from the free list, allocating more if necessary.
1085 The inline version is used for speed in hot routines, and the
1086 function using it serves the rest (unless PURIFY).
1087*/
1088#define new_body_inline(xpv, sv_type) \
1089 STMT_START { \
1090 void ** const r3wt = &PL_body_roots[sv_type]; \
11b79775 1091 xpv = (PTR_TBL_ENT_t*) (*((void **)(r3wt)) \
1e30fcd5 1092 ? *((void **)(r3wt)) : Perl_more_bodies(aTHX_ sv_type, \
02982131
NC
1093 bodies_by_type[sv_type].body_size,\
1094 bodies_by_type[sv_type].arena_size)); \
d2a0f284 1095 *(r3wt) = *(void**)(xpv); \
d2a0f284
JC
1096 } STMT_END
1097
1098#ifndef PURIFY
1099
1100STATIC void *
de37a194 1101S_new_body(pTHX_ const svtype sv_type)
d2a0f284
JC
1102{
1103 dVAR;
1104 void *xpv;
1105 new_body_inline(xpv, sv_type);
1106 return xpv;
1107}
1108
1109#endif
93e68bfb 1110
238b27b3
NC
1111static const struct body_details fake_rv =
1112 { 0, 0, 0, SVt_IV, FALSE, NONV, NOARENA, 0 };
1113
bd81e77b
NC
1114/*
1115=for apidoc sv_upgrade
93e68bfb 1116
bd81e77b
NC
1117Upgrade an SV to a more complex form. Generally adds a new body type to the
1118SV, then copies across as much information as possible from the old body.
1119You generally want to use the C<SvUPGRADE> macro wrapper. See also C<svtype>.
93e68bfb 1120
bd81e77b 1121=cut
93e68bfb 1122*/
93e68bfb 1123
bd81e77b 1124void
aad570aa 1125Perl_sv_upgrade(pTHX_ register SV *const sv, svtype new_type)
cac9b346 1126{
97aff369 1127 dVAR;
bd81e77b
NC
1128 void* old_body;
1129 void* new_body;
42d0e0b7 1130 const svtype old_type = SvTYPE(sv);
d2a0f284 1131 const struct body_details *new_type_details;
238b27b3 1132 const struct body_details *old_type_details
bd81e77b 1133 = bodies_by_type + old_type;
4df7f6af 1134 SV *referant = NULL;
cac9b346 1135
7918f24d
NC
1136 PERL_ARGS_ASSERT_SV_UPGRADE;
1137
1776cbe8
NC
1138 if (old_type == new_type)
1139 return;
1140
1141 /* This clause was purposefully added ahead of the early return above to
1142 the shared string hackery for (sort {$a <=> $b} keys %hash), with the
1143 inference by Nick I-S that it would fix other troublesome cases. See
1144 changes 7162, 7163 (f130fd4589cf5fbb24149cd4db4137c8326f49c1 and parent)
1145
1146 Given that shared hash key scalars are no longer PVIV, but PV, there is
1147 no longer need to unshare so as to free up the IVX slot for its proper
1148 purpose. So it's safe to move the early return earlier. */
1149
bd81e77b
NC
1150 if (new_type != SVt_PV && SvIsCOW(sv)) {
1151 sv_force_normal_flags(sv, 0);
1152 }
cac9b346 1153
bd81e77b 1154 old_body = SvANY(sv);
de042e1d 1155
bd81e77b
NC
1156 /* Copying structures onto other structures that have been neatly zeroed
1157 has a subtle gotcha. Consider XPVMG
cac9b346 1158
bd81e77b
NC
1159 +------+------+------+------+------+-------+-------+
1160 | NV | CUR | LEN | IV | MAGIC | STASH |
1161 +------+------+------+------+------+-------+-------+
1162 0 4 8 12 16 20 24 28
645c22ef 1163
bd81e77b
NC
1164 where NVs are aligned to 8 bytes, so that sizeof that structure is
1165 actually 32 bytes long, with 4 bytes of padding at the end:
08742458 1166
bd81e77b
NC
1167 +------+------+------+------+------+-------+-------+------+
1168 | NV | CUR | LEN | IV | MAGIC | STASH | ??? |
1169 +------+------+------+------+------+-------+-------+------+
1170 0 4 8 12 16 20 24 28 32
08742458 1171
bd81e77b 1172 so what happens if you allocate memory for this structure:
30f9da9e 1173
bd81e77b
NC
1174 +------+------+------+------+------+-------+-------+------+------+...
1175 | NV | CUR | LEN | IV | MAGIC | STASH | GP | NAME |
1176 +------+------+------+------+------+-------+-------+------+------+...
1177 0 4 8 12 16 20 24 28 32 36
bfc44f79 1178
bd81e77b
NC
1179 zero it, then copy sizeof(XPVMG) bytes on top of it? Not quite what you
1180 expect, because you copy the area marked ??? onto GP. Now, ??? may have
1181 started out as zero once, but it's quite possible that it isn't. So now,
1182 rather than a nicely zeroed GP, you have it pointing somewhere random.
1183 Bugs ensue.
bfc44f79 1184
bd81e77b
NC
1185 (In fact, GP ends up pointing at a previous GP structure, because the
1186 principle cause of the padding in XPVMG getting garbage is a copy of
6c9e42f7
NC
1187 sizeof(XPVMG) bytes from a XPVGV structure in sv_unglob. Right now
1188 this happens to be moot because XPVGV has been re-ordered, with GP
1189 no longer after STASH)
30f9da9e 1190
bd81e77b
NC
1191 So we are careful and work out the size of used parts of all the
1192 structures. */
bfc44f79 1193
bd81e77b
NC
1194 switch (old_type) {
1195 case SVt_NULL:
1196 break;
1197 case SVt_IV:
4df7f6af
NC
1198 if (SvROK(sv)) {
1199 referant = SvRV(sv);
238b27b3
NC
1200 old_type_details = &fake_rv;
1201 if (new_type == SVt_NV)
1202 new_type = SVt_PVNV;
4df7f6af
NC
1203 } else {
1204 if (new_type < SVt_PVIV) {
1205 new_type = (new_type == SVt_NV)
1206 ? SVt_PVNV : SVt_PVIV;
1207 }
bd81e77b
NC
1208 }
1209 break;
1210 case SVt_NV:
1211 if (new_type < SVt_PVNV) {
1212 new_type = SVt_PVNV;
bd81e77b
NC
1213 }
1214 break;
bd81e77b
NC
1215 case SVt_PV:
1216 assert(new_type > SVt_PV);
1217 assert(SVt_IV < SVt_PV);
1218 assert(SVt_NV < SVt_PV);
1219 break;
1220 case SVt_PVIV:
1221 break;
1222 case SVt_PVNV:
1223 break;
1224 case SVt_PVMG:
1225 /* Because the XPVMG of PL_mess_sv isn't allocated from the arena,
1226 there's no way that it can be safely upgraded, because perl.c
1227 expects to Safefree(SvANY(PL_mess_sv)) */
1228 assert(sv != PL_mess_sv);
1229 /* This flag bit is used to mean other things in other scalar types.
1230 Given that it only has meaning inside the pad, it shouldn't be set
1231 on anything that can get upgraded. */
00b1698f 1232 assert(!SvPAD_TYPED(sv));
bd81e77b
NC
1233 break;
1234 default:
1235 if (old_type_details->cant_upgrade)
c81225bc
NC
1236 Perl_croak(aTHX_ "Can't upgrade %s (%" UVuf ") to %" UVuf,
1237 sv_reftype(sv, 0), (UV) old_type, (UV) new_type);
bd81e77b 1238 }
3376de98
NC
1239
1240 if (old_type > new_type)
1241 Perl_croak(aTHX_ "sv_upgrade from type %d down to type %d",
1242 (int)old_type, (int)new_type);
1243
2fa1109b 1244 new_type_details = bodies_by_type + new_type;
645c22ef 1245
bd81e77b
NC
1246 SvFLAGS(sv) &= ~SVTYPEMASK;
1247 SvFLAGS(sv) |= new_type;
932e9ff9 1248
ab4416c0
NC
1249 /* This can't happen, as SVt_NULL is <= all values of new_type, so one of
1250 the return statements above will have triggered. */
1251 assert (new_type != SVt_NULL);
bd81e77b 1252 switch (new_type) {
bd81e77b
NC
1253 case SVt_IV:
1254 assert(old_type == SVt_NULL);
1255 SvANY(sv) = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
1256 SvIV_set(sv, 0);
1257 return;
1258 case SVt_NV:
1259 assert(old_type == SVt_NULL);
1260 SvANY(sv) = new_XNV();
1261 SvNV_set(sv, 0);
1262 return;
bd81e77b 1263 case SVt_PVHV:
bd81e77b 1264 case SVt_PVAV:
d2a0f284 1265 assert(new_type_details->body_size);
c1ae03ae
NC
1266
1267#ifndef PURIFY
1268 assert(new_type_details->arena);
d2a0f284 1269 assert(new_type_details->arena_size);
c1ae03ae 1270 /* This points to the start of the allocated area. */
d2a0f284
JC
1271 new_body_inline(new_body, new_type);
1272 Zero(new_body, new_type_details->body_size, char);
c1ae03ae
NC
1273 new_body = ((char *)new_body) - new_type_details->offset;
1274#else
1275 /* We always allocated the full length item with PURIFY. To do this
1276 we fake things so that arena is false for all 16 types.. */
1277 new_body = new_NOARENAZ(new_type_details);
1278#endif
1279 SvANY(sv) = new_body;
1280 if (new_type == SVt_PVAV) {
1281 AvMAX(sv) = -1;
1282 AvFILLp(sv) = -1;
1283 AvREAL_only(sv);
64484faa 1284 if (old_type_details->body_size) {
ac572bf4
NC
1285 AvALLOC(sv) = 0;
1286 } else {
1287 /* It will have been zeroed when the new body was allocated.
1288 Lets not write to it, in case it confuses a write-back
1289 cache. */
1290 }
78ac7dd9
NC
1291 } else {
1292 assert(!SvOK(sv));
1293 SvOK_off(sv);
1294#ifndef NODEFAULT_SHAREKEYS
1295 HvSHAREKEYS_on(sv); /* key-sharing on by default */
1296#endif
1297 HvMAX(sv) = 7; /* (start with 8 buckets) */
c1ae03ae 1298 }
aeb18a1e 1299
bd81e77b
NC
1300 /* SVt_NULL isn't the only thing upgraded to AV or HV.
1301 The target created by newSVrv also is, and it can have magic.
1302 However, it never has SvPVX set.
1303 */
4df7f6af
NC
1304 if (old_type == SVt_IV) {
1305 assert(!SvROK(sv));
1306 } else if (old_type >= SVt_PV) {
bd81e77b
NC
1307 assert(SvPVX_const(sv) == 0);
1308 }
aeb18a1e 1309
bd81e77b 1310 if (old_type >= SVt_PVMG) {
e736a858 1311 SvMAGIC_set(sv, ((XPVMG*)old_body)->xmg_u.xmg_magic);
bd81e77b 1312 SvSTASH_set(sv, ((XPVMG*)old_body)->xmg_stash);
797c7171
NC
1313 } else {
1314 sv->sv_u.svu_array = NULL; /* or svu_hash */
bd81e77b
NC
1315 }
1316 break;
93e68bfb 1317
93e68bfb 1318
b9ad13ac
NC
1319 case SVt_REGEXP:
1320 /* This ensures that SvTHINKFIRST(sv) is true, and hence that
1321 sv_force_normal_flags(sv) is called. */
1322 SvFAKE_on(sv);
bd81e77b
NC
1323 case SVt_PVIV:
1324 /* XXX Is this still needed? Was it ever needed? Surely as there is
1325 no route from NV to PVIV, NOK can never be true */
1326 assert(!SvNOKp(sv));
1327 assert(!SvNOK(sv));
1328 case SVt_PVIO:
1329 case SVt_PVFM:
bd81e77b
NC
1330 case SVt_PVGV:
1331 case SVt_PVCV:
1332 case SVt_PVLV:
1333 case SVt_PVMG:
1334 case SVt_PVNV:
1335 case SVt_PV:
93e68bfb 1336
d2a0f284 1337 assert(new_type_details->body_size);
bd81e77b
NC
1338 /* We always allocated the full length item with PURIFY. To do this
1339 we fake things so that arena is false for all 16 types.. */
1340 if(new_type_details->arena) {
1341 /* This points to the start of the allocated area. */
d2a0f284
JC
1342 new_body_inline(new_body, new_type);
1343 Zero(new_body, new_type_details->body_size, char);
bd81e77b
NC
1344 new_body = ((char *)new_body) - new_type_details->offset;
1345 } else {
1346 new_body = new_NOARENAZ(new_type_details);
1347 }
1348 SvANY(sv) = new_body;
5e2fc214 1349
bd81e77b 1350 if (old_type_details->copy) {
f9ba3d20
NC
1351 /* There is now the potential for an upgrade from something without
1352 an offset (PVNV or PVMG) to something with one (PVCV, PVFM) */
1353 int offset = old_type_details->offset;
1354 int length = old_type_details->copy;
1355
1356 if (new_type_details->offset > old_type_details->offset) {
d4c19fe8 1357 const int difference
f9ba3d20
NC
1358 = new_type_details->offset - old_type_details->offset;
1359 offset += difference;
1360 length -= difference;
1361 }
1362 assert (length >= 0);
1363
1364 Copy((char *)old_body + offset, (char *)new_body + offset, length,
1365 char);
bd81e77b
NC
1366 }
1367
1368#ifndef NV_ZERO_IS_ALLBITS_ZERO
f2524eef 1369 /* If NV 0.0 is stores as all bits 0 then Zero() already creates a
e5ce394c
NC
1370 * correct 0.0 for us. Otherwise, if the old body didn't have an
1371 * NV slot, but the new one does, then we need to initialise the
1372 * freshly created NV slot with whatever the correct bit pattern is
1373 * for 0.0 */
e22a937e
NC
1374 if (old_type_details->zero_nv && !new_type_details->zero_nv
1375 && !isGV_with_GP(sv))
bd81e77b 1376 SvNV_set(sv, 0);
82048762 1377#endif
5e2fc214 1378
85dca89a
NC
1379 if (new_type == SVt_PVIO) {
1380 IO * const io = MUTABLE_IO(sv);
d963bf01 1381 GV *iogv = gv_fetchpvs("IO::File::", GV_ADD, SVt_PVHV);
85dca89a
NC
1382
1383 SvOBJECT_on(io);
1384 /* Clear the stashcache because a new IO could overrule a package
1385 name */
1386 hv_clear(PL_stashcache);
1387
85dca89a 1388 SvSTASH_set(io, MUTABLE_HV(SvREFCNT_inc(GvHV(iogv))));
f2524eef 1389 IoPAGE_LEN(sv) = 60;
85dca89a 1390 }
4df7f6af
NC
1391 if (old_type < SVt_PV) {
1392 /* referant will be NULL unless the old type was SVt_IV emulating
1393 SVt_RV */
1394 sv->sv_u.svu_rv = referant;
1395 }
bd81e77b
NC
1396 break;
1397 default:
afd78fd5
JH
1398 Perl_croak(aTHX_ "panic: sv_upgrade to unknown type %lu",
1399 (unsigned long)new_type);
bd81e77b 1400 }
73171d91 1401
db93c0c4 1402 if (old_type > SVt_IV) {
bd81e77b 1403#ifdef PURIFY
beeec492 1404 safefree(old_body);
bd81e77b 1405#else
bc786448
GG
1406 /* Note that there is an assumption that all bodies of types that
1407 can be upgraded came from arenas. Only the more complex non-
1408 upgradable types are allowed to be directly malloc()ed. */
1409 assert(old_type_details->arena);
bd81e77b
NC
1410 del_body((void*)((char*)old_body + old_type_details->offset),
1411 &PL_body_roots[old_type]);
1412#endif
1413 }
1414}
73171d91 1415
bd81e77b
NC
1416/*
1417=for apidoc sv_backoff
73171d91 1418
bd81e77b
NC
1419Remove any string offset. You should normally use the C<SvOOK_off> macro
1420wrapper instead.
73171d91 1421
bd81e77b 1422=cut
73171d91
NC
1423*/
1424
bd81e77b 1425int
aad570aa 1426Perl_sv_backoff(pTHX_ register SV *const sv)
bd81e77b 1427{
69240efd 1428 STRLEN delta;
7a4bba22 1429 const char * const s = SvPVX_const(sv);
7918f24d
NC
1430
1431 PERL_ARGS_ASSERT_SV_BACKOFF;
96a5add6 1432 PERL_UNUSED_CONTEXT;
7918f24d 1433
bd81e77b
NC
1434 assert(SvOOK(sv));
1435 assert(SvTYPE(sv) != SVt_PVHV);
1436 assert(SvTYPE(sv) != SVt_PVAV);
7a4bba22 1437
69240efd
NC
1438 SvOOK_offset(sv, delta);
1439
7a4bba22
NC
1440 SvLEN_set(sv, SvLEN(sv) + delta);
1441 SvPV_set(sv, SvPVX(sv) - delta);
1442 Move(s, SvPVX(sv), SvCUR(sv)+1, char);
bd81e77b
NC
1443 SvFLAGS(sv) &= ~SVf_OOK;
1444 return 0;
1445}
73171d91 1446
bd81e77b
NC
1447/*
1448=for apidoc sv_grow
73171d91 1449
bd81e77b
NC
1450Expands the character buffer in the SV. If necessary, uses C<sv_unref> and
1451upgrades the SV to C<SVt_PV>. Returns a pointer to the character buffer.
1452Use the C<SvGROW> wrapper instead.
93e68bfb 1453
bd81e77b
NC
1454=cut
1455*/
93e68bfb 1456
bd81e77b 1457char *
aad570aa 1458Perl_sv_grow(pTHX_ register SV *const sv, register STRLEN newlen)
bd81e77b
NC
1459{
1460 register char *s;
93e68bfb 1461
7918f24d
NC
1462 PERL_ARGS_ASSERT_SV_GROW;
1463
5db06880
NC
1464 if (PL_madskills && newlen >= 0x100000) {
1465 PerlIO_printf(Perl_debug_log,
1466 "Allocation too large: %"UVxf"\n", (UV)newlen);
1467 }
bd81e77b
NC
1468#ifdef HAS_64K_LIMIT
1469 if (newlen >= 0x10000) {
1470 PerlIO_printf(Perl_debug_log,
1471 "Allocation too large: %"UVxf"\n", (UV)newlen);
1472 my_exit(1);
1473 }
1474#endif /* HAS_64K_LIMIT */
1475 if (SvROK(sv))
1476 sv_unref(sv);
1477 if (SvTYPE(sv) < SVt_PV) {
1478 sv_upgrade(sv, SVt_PV);
1479 s = SvPVX_mutable(sv);
1480 }
1481 else if (SvOOK(sv)) { /* pv is offset? */
1482 sv_backoff(sv);
1483 s = SvPVX_mutable(sv);
1484 if (newlen > SvLEN(sv))
1485 newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
1486#ifdef HAS_64K_LIMIT
1487 if (newlen >= 0x10000)
1488 newlen = 0xFFFF;
1489#endif
1490 }
1491 else
1492 s = SvPVX_mutable(sv);
aeb18a1e 1493
bd81e77b 1494 if (newlen > SvLEN(sv)) { /* need more room? */
f1200559
WH
1495 STRLEN minlen = SvCUR(sv);
1496 minlen += (minlen >> PERL_STRLEN_EXPAND_SHIFT) + 10;
1497 if (newlen < minlen)
1498 newlen = minlen;
aedff202 1499#ifndef Perl_safesysmalloc_size
bd81e77b 1500 newlen = PERL_STRLEN_ROUNDUP(newlen);
bd81e77b 1501#endif
98653f18 1502 if (SvLEN(sv) && s) {
10edeb5d 1503 s = (char*)saferealloc(s, newlen);
bd81e77b
NC
1504 }
1505 else {
10edeb5d 1506 s = (char*)safemalloc(newlen);
bd81e77b
NC
1507 if (SvPVX_const(sv) && SvCUR(sv)) {
1508 Move(SvPVX_const(sv), s, (newlen < SvCUR(sv)) ? newlen : SvCUR(sv), char);
1509 }
1510 }
1511 SvPV_set(sv, s);
ca7c1a29 1512#ifdef Perl_safesysmalloc_size
98653f18
NC
1513 /* Do this here, do it once, do it right, and then we will never get
1514 called back into sv_grow() unless there really is some growing
1515 needed. */
ca7c1a29 1516 SvLEN_set(sv, Perl_safesysmalloc_size(s));
98653f18 1517#else
bd81e77b 1518 SvLEN_set(sv, newlen);
98653f18 1519#endif
bd81e77b
NC
1520 }
1521 return s;
1522}
aeb18a1e 1523
bd81e77b
NC
1524/*
1525=for apidoc sv_setiv
932e9ff9 1526
bd81e77b
NC
1527Copies an integer into the given SV, upgrading first if necessary.
1528Does not handle 'set' magic. See also C<sv_setiv_mg>.
463ee0b2 1529
bd81e77b
NC
1530=cut
1531*/
463ee0b2 1532
bd81e77b 1533void
aad570aa 1534Perl_sv_setiv(pTHX_ register SV *const sv, const IV i)
bd81e77b 1535{
97aff369 1536 dVAR;
7918f24d
NC
1537
1538 PERL_ARGS_ASSERT_SV_SETIV;
1539
bd81e77b
NC
1540 SV_CHECK_THINKFIRST_COW_DROP(sv);
1541 switch (SvTYPE(sv)) {
1542 case SVt_NULL:
bd81e77b 1543 case SVt_NV:
3376de98 1544 sv_upgrade(sv, SVt_IV);
bd81e77b 1545 break;
bd81e77b
NC
1546 case SVt_PV:
1547 sv_upgrade(sv, SVt_PVIV);
1548 break;
463ee0b2 1549
bd81e77b 1550 case SVt_PVGV:
6e592b3a
BM
1551 if (!isGV_with_GP(sv))
1552 break;
bd81e77b
NC
1553 case SVt_PVAV:
1554 case SVt_PVHV:
1555 case SVt_PVCV:
1556 case SVt_PVFM:
1557 case SVt_PVIO:
1558 Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
1559 OP_DESC(PL_op));
42d0e0b7 1560 default: NOOP;
bd81e77b
NC
1561 }
1562 (void)SvIOK_only(sv); /* validate number */
1563 SvIV_set(sv, i);
1564 SvTAINT(sv);
1565}
932e9ff9 1566
bd81e77b
NC
1567/*
1568=for apidoc sv_setiv_mg
d33b2eba 1569
bd81e77b 1570Like C<sv_setiv>, but also handles 'set' magic.
1c846c1f 1571
bd81e77b
NC
1572=cut
1573*/
d33b2eba 1574
bd81e77b 1575void
aad570aa 1576Perl_sv_setiv_mg(pTHX_ register SV *const sv, const IV i)
bd81e77b 1577{
7918f24d
NC
1578 PERL_ARGS_ASSERT_SV_SETIV_MG;
1579
bd81e77b
NC
1580 sv_setiv(sv,i);
1581 SvSETMAGIC(sv);
1582}
727879eb 1583
bd81e77b
NC
1584/*
1585=for apidoc sv_setuv
d33b2eba 1586
bd81e77b
NC
1587Copies an unsigned integer into the given SV, upgrading first if necessary.
1588Does not handle 'set' magic. See also C<sv_setuv_mg>.
9b94d1dd 1589
bd81e77b
NC
1590=cut
1591*/
d33b2eba 1592
bd81e77b 1593void
aad570aa 1594Perl_sv_setuv(pTHX_ register SV *const sv, const UV u)
bd81e77b 1595{
7918f24d
NC
1596 PERL_ARGS_ASSERT_SV_SETUV;
1597
bd81e77b
NC
1598 /* With these two if statements:
1599 u=1.49 s=0.52 cu=72.49 cs=10.64 scripts=270 tests=20865
d33b2eba 1600
bd81e77b
NC
1601 without
1602 u=1.35 s=0.47 cu=73.45 cs=11.43 scripts=270 tests=20865
1c846c1f 1603
bd81e77b
NC
1604 If you wish to remove them, please benchmark to see what the effect is
1605 */
1606 if (u <= (UV)IV_MAX) {
1607 sv_setiv(sv, (IV)u);
1608 return;
1609 }
1610 sv_setiv(sv, 0);
1611 SvIsUV_on(sv);
1612 SvUV_set(sv, u);
1613}
d33b2eba 1614
bd81e77b
NC
1615/*
1616=for apidoc sv_setuv_mg
727879eb 1617
bd81e77b 1618Like C<sv_setuv>, but also handles 'set' magic.
9b94d1dd 1619
bd81e77b
NC
1620=cut
1621*/
5e2fc214 1622
bd81e77b 1623void
aad570aa 1624Perl_sv_setuv_mg(pTHX_ register SV *const sv, const UV u)
bd81e77b 1625{
7918f24d
NC
1626 PERL_ARGS_ASSERT_SV_SETUV_MG;
1627
bd81e77b
NC
1628 sv_setuv(sv,u);
1629 SvSETMAGIC(sv);
1630}
5e2fc214 1631
954c1994 1632/*
bd81e77b 1633=for apidoc sv_setnv
954c1994 1634
bd81e77b
NC
1635Copies a double into the given SV, upgrading first if necessary.
1636Does not handle 'set' magic. See also C<sv_setnv_mg>.
954c1994
GS
1637
1638=cut
1639*/
1640
63f97190 1641void
aad570aa 1642Perl_sv_setnv(pTHX_ register SV *const sv, const NV num)
79072805 1643{
97aff369 1644 dVAR;
7918f24d
NC
1645
1646 PERL_ARGS_ASSERT_SV_SETNV;
1647
bd81e77b
NC
1648 SV_CHECK_THINKFIRST_COW_DROP(sv);
1649 switch (SvTYPE(sv)) {
79072805 1650 case SVt_NULL:
79072805 1651 case SVt_IV:
bd81e77b 1652 sv_upgrade(sv, SVt_NV);
79072805
LW
1653 break;
1654 case SVt_PV:
79072805 1655 case SVt_PVIV:
bd81e77b 1656 sv_upgrade(sv, SVt_PVNV);
79072805 1657 break;
bd4b1eb5 1658
bd4b1eb5 1659 case SVt_PVGV:
6e592b3a
BM
1660 if (!isGV_with_GP(sv))
1661 break;
bd81e77b
NC
1662 case SVt_PVAV:
1663 case SVt_PVHV:
79072805 1664 case SVt_PVCV:
bd81e77b
NC
1665 case SVt_PVFM:
1666 case SVt_PVIO:
1667 Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
94bbb3f4 1668 OP_DESC(PL_op));
42d0e0b7 1669 default: NOOP;
2068cd4d 1670 }
bd81e77b
NC
1671 SvNV_set(sv, num);
1672 (void)SvNOK_only(sv); /* validate number */
1673 SvTAINT(sv);
79072805
LW
1674}
1675
645c22ef 1676/*
bd81e77b 1677=for apidoc sv_setnv_mg
645c22ef 1678
bd81e77b 1679Like C<sv_setnv>, but also handles 'set' magic.
645c22ef
DM
1680
1681=cut
1682*/
1683
bd81e77b 1684void
aad570aa 1685Perl_sv_setnv_mg(pTHX_ register SV *const sv, const NV num)
79072805 1686{
7918f24d
NC
1687 PERL_ARGS_ASSERT_SV_SETNV_MG;
1688
bd81e77b
NC
1689 sv_setnv(sv,num);
1690 SvSETMAGIC(sv);
79072805
LW
1691}
1692
bd81e77b
NC
1693/* Print an "isn't numeric" warning, using a cleaned-up,
1694 * printable version of the offending string
1695 */
954c1994 1696
bd81e77b 1697STATIC void
aad570aa 1698S_not_a_number(pTHX_ SV *const sv)
79072805 1699{
97aff369 1700 dVAR;
bd81e77b
NC
1701 SV *dsv;
1702 char tmpbuf[64];
1703 const char *pv;
94463019 1704
7918f24d
NC
1705 PERL_ARGS_ASSERT_NOT_A_NUMBER;
1706
94463019 1707 if (DO_UTF8(sv)) {
84bafc02 1708 dsv = newSVpvs_flags("", SVs_TEMP);
94463019
JH
1709 pv = sv_uni_display(dsv, sv, 10, 0);
1710 } else {
1711 char *d = tmpbuf;
551405c4 1712 const char * const limit = tmpbuf + sizeof(tmpbuf) - 8;
94463019
JH
1713 /* each *s can expand to 4 chars + "...\0",
1714 i.e. need room for 8 chars */
ecdeb87c 1715
00b6aa41
AL
1716 const char *s = SvPVX_const(sv);
1717 const char * const end = s + SvCUR(sv);
1718 for ( ; s < end && d < limit; s++ ) {
94463019
JH
1719 int ch = *s & 0xFF;
1720 if (ch & 128 && !isPRINT_LC(ch)) {
1721 *d++ = 'M';
1722 *d++ = '-';
1723 ch &= 127;
1724 }
1725 if (ch == '\n') {
1726 *d++ = '\\';
1727 *d++ = 'n';
1728 }
1729 else if (ch == '\r') {
1730 *d++ = '\\';
1731 *d++ = 'r';
1732 }
1733 else if (ch == '\f') {
1734 *d++ = '\\';
1735 *d++ = 'f';
1736 }
1737 else if (ch == '\\') {
1738 *d++ = '\\';
1739 *d++ = '\\';
1740 }
1741 else if (ch == '\0') {
1742 *d++ = '\\';
1743 *d++ = '0';
1744 }
1745 else if (isPRINT_LC(ch))
1746 *d++ = ch;
1747 else {
1748 *d++ = '^';
1749 *d++ = toCTRL(ch);
1750 }
1751 }
1752 if (s < end) {
1753 *d++ = '.';
1754 *d++ = '.';
1755 *d++ = '.';
1756 }
1757 *d = '\0';
1758 pv = tmpbuf;
a0d0e21e 1759 }
a0d0e21e 1760
533c011a 1761 if (PL_op)
9014280d 1762 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019
JH
1763 "Argument \"%s\" isn't numeric in %s", pv,
1764 OP_DESC(PL_op));
a0d0e21e 1765 else
9014280d 1766 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019 1767 "Argument \"%s\" isn't numeric", pv);
a0d0e21e
LW
1768}
1769
c2988b20
NC
1770/*
1771=for apidoc looks_like_number
1772
645c22ef
DM
1773Test if the content of an SV looks like a number (or is a number).
1774C<Inf> and C<Infinity> are treated as numbers (so will not issue a
1775non-numeric warning), even if your atof() doesn't grok them.
c2988b20
NC
1776
1777=cut
1778*/
1779
1780I32
aad570aa 1781Perl_looks_like_number(pTHX_ SV *const sv)
c2988b20 1782{
a3b680e6 1783 register const char *sbegin;
c2988b20
NC
1784 STRLEN len;
1785
7918f24d
NC
1786 PERL_ARGS_ASSERT_LOOKS_LIKE_NUMBER;
1787
c2988b20 1788 if (SvPOK(sv)) {
3f7c398e 1789 sbegin = SvPVX_const(sv);
c2988b20
NC
1790 len = SvCUR(sv);
1791 }
1792 else if (SvPOKp(sv))
83003860 1793 sbegin = SvPV_const(sv, len);
c2988b20 1794 else
e0ab1c0e 1795 return SvFLAGS(sv) & (SVf_NOK|SVp_NOK|SVf_IOK|SVp_IOK);
c2988b20
NC
1796 return grok_number(sbegin, len, NULL);
1797}
25da4f38 1798
19f6321d
NC
1799STATIC bool
1800S_glob_2number(pTHX_ GV * const gv)
180488f8
NC
1801{
1802 const U32 wasfake = SvFLAGS(gv) & SVf_FAKE;
1803 SV *const buffer = sv_newmortal();
1804
7918f24d
NC
1805 PERL_ARGS_ASSERT_GLOB_2NUMBER;
1806
180488f8
NC
1807 /* FAKE globs can get coerced, so need to turn this off temporarily if it
1808 is on. */
1809 SvFAKE_off(gv);
1810 gv_efullname3(buffer, gv, "*");
1811 SvFLAGS(gv) |= wasfake;
1812
675c862f
AL
1813 /* We know that all GVs stringify to something that is not-a-number,
1814 so no need to test that. */
1815 if (ckWARN(WARN_NUMERIC))
1816 not_a_number(buffer);
1817 /* We just want something true to return, so that S_sv_2iuv_common
1818 can tail call us and return true. */
19f6321d 1819 return TRUE;
675c862f
AL
1820}
1821
25da4f38
IZ
1822/* Actually, ISO C leaves conversion of UV to IV undefined, but
1823 until proven guilty, assume that things are not that bad... */
1824
645c22ef
DM
1825/*
1826 NV_PRESERVES_UV:
1827
1828 As 64 bit platforms often have an NV that doesn't preserve all bits of
28e5dec8
JH
1829 an IV (an assumption perl has been based on to date) it becomes necessary
1830 to remove the assumption that the NV always carries enough precision to
1831 recreate the IV whenever needed, and that the NV is the canonical form.
1832 Instead, IV/UV and NV need to be given equal rights. So as to not lose
645c22ef 1833 precision as a side effect of conversion (which would lead to insanity
28e5dec8
JH
1834 and the dragon(s) in t/op/numconvert.t getting very angry) the intent is
1835 1) to distinguish between IV/UV/NV slots that have cached a valid
1836 conversion where precision was lost and IV/UV/NV slots that have a
1837 valid conversion which has lost no precision
645c22ef 1838 2) to ensure that if a numeric conversion to one form is requested that
28e5dec8
JH
1839 would lose precision, the precise conversion (or differently
1840 imprecise conversion) is also performed and cached, to prevent
1841 requests for different numeric formats on the same SV causing
1842 lossy conversion chains. (lossless conversion chains are perfectly
1843 acceptable (still))
1844
1845
1846 flags are used:
1847 SvIOKp is true if the IV slot contains a valid value
1848 SvIOK is true only if the IV value is accurate (UV if SvIOK_UV true)
1849 SvNOKp is true if the NV slot contains a valid value
1850 SvNOK is true only if the NV value is accurate
1851
1852 so
645c22ef 1853 while converting from PV to NV, check to see if converting that NV to an
28e5dec8
JH
1854 IV(or UV) would lose accuracy over a direct conversion from PV to
1855 IV(or UV). If it would, cache both conversions, return NV, but mark
1856 SV as IOK NOKp (ie not NOK).
1857
645c22ef 1858 While converting from PV to IV, check to see if converting that IV to an
28e5dec8
JH
1859 NV would lose accuracy over a direct conversion from PV to NV. If it
1860 would, cache both conversions, flag similarly.
1861
1862 Before, the SV value "3.2" could become NV=3.2 IV=3 NOK, IOK quite
1863 correctly because if IV & NV were set NV *always* overruled.
645c22ef
DM
1864 Now, "3.2" will become NV=3.2 IV=3 NOK, IOKp, because the flag's meaning
1865 changes - now IV and NV together means that the two are interchangeable:
28e5dec8 1866 SvIVX == (IV) SvNVX && SvNVX == (NV) SvIVX;
d460ef45 1867
645c22ef
DM
1868 The benefit of this is that operations such as pp_add know that if
1869 SvIOK is true for both left and right operands, then integer addition
1870 can be used instead of floating point (for cases where the result won't
1871 overflow). Before, floating point was always used, which could lead to
28e5dec8
JH
1872 loss of precision compared with integer addition.
1873
1874 * making IV and NV equal status should make maths accurate on 64 bit
1875 platforms
1876 * may speed up maths somewhat if pp_add and friends start to use
645c22ef 1877 integers when possible instead of fp. (Hopefully the overhead in
28e5dec8
JH
1878 looking for SvIOK and checking for overflow will not outweigh the
1879 fp to integer speedup)
1880 * will slow down integer operations (callers of SvIV) on "inaccurate"
1881 values, as the change from SvIOK to SvIOKp will cause a call into
1882 sv_2iv each time rather than a macro access direct to the IV slot
1883 * should speed up number->string conversion on integers as IV is
645c22ef 1884 favoured when IV and NV are equally accurate
28e5dec8
JH
1885
1886 ####################################################################
645c22ef
DM
1887 You had better be using SvIOK_notUV if you want an IV for arithmetic:
1888 SvIOK is true if (IV or UV), so you might be getting (IV)SvUV.
1889 On the other hand, SvUOK is true iff UV.
28e5dec8
JH
1890 ####################################################################
1891
645c22ef 1892 Your mileage will vary depending your CPU's relative fp to integer
28e5dec8
JH
1893 performance ratio.
1894*/
1895
1896#ifndef NV_PRESERVES_UV
645c22ef
DM
1897# define IS_NUMBER_UNDERFLOW_IV 1
1898# define IS_NUMBER_UNDERFLOW_UV 2
1899# define IS_NUMBER_IV_AND_UV 2
1900# define IS_NUMBER_OVERFLOW_IV 4
1901# define IS_NUMBER_OVERFLOW_UV 5
1902
1903/* sv_2iuv_non_preserve(): private routine for use by sv_2iv() and sv_2uv() */
28e5dec8
JH
1904
1905/* For sv_2nv these three cases are "SvNOK and don't bother casting" */
1906STATIC int
5de3775c 1907S_sv_2iuv_non_preserve(pTHX_ register SV *const sv
47031da6
NC
1908# ifdef DEBUGGING
1909 , I32 numtype
1910# endif
1911 )
28e5dec8 1912{
97aff369 1913 dVAR;
7918f24d
NC
1914
1915 PERL_ARGS_ASSERT_SV_2IUV_NON_PRESERVE;
1916
3f7c398e 1917 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
1918 if (SvNVX(sv) < (NV)IV_MIN) {
1919 (void)SvIOKp_on(sv);
1920 (void)SvNOK_on(sv);
45977657 1921 SvIV_set(sv, IV_MIN);
28e5dec8
JH
1922 return IS_NUMBER_UNDERFLOW_IV;
1923 }
1924 if (SvNVX(sv) > (NV)UV_MAX) {
1925 (void)SvIOKp_on(sv);
1926 (void)SvNOK_on(sv);
1927 SvIsUV_on(sv);
607fa7f2 1928 SvUV_set(sv, UV_MAX);
28e5dec8
JH
1929 return IS_NUMBER_OVERFLOW_UV;
1930 }
c2988b20
NC
1931 (void)SvIOKp_on(sv);
1932 (void)SvNOK_on(sv);
1933 /* Can't use strtol etc to convert this string. (See truth table in
1934 sv_2iv */
1935 if (SvNVX(sv) <= (UV)IV_MAX) {
45977657 1936 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
1937 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
1938 SvIOK_on(sv); /* Integer is precise. NOK, IOK */
1939 } else {
1940 /* Integer is imprecise. NOK, IOKp */
1941 }
1942 return SvNVX(sv) < 0 ? IS_NUMBER_UNDERFLOW_UV : IS_NUMBER_IV_AND_UV;
1943 }
1944 SvIsUV_on(sv);
607fa7f2 1945 SvUV_set(sv, U_V(SvNVX(sv)));
c2988b20
NC
1946 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
1947 if (SvUVX(sv) == UV_MAX) {
1948 /* As we know that NVs don't preserve UVs, UV_MAX cannot
1949 possibly be preserved by NV. Hence, it must be overflow.
1950 NOK, IOKp */
1951 return IS_NUMBER_OVERFLOW_UV;
1952 }
1953 SvIOK_on(sv); /* Integer is precise. NOK, UOK */
1954 } else {
1955 /* Integer is imprecise. NOK, IOKp */
28e5dec8 1956 }
c2988b20 1957 return IS_NUMBER_OVERFLOW_IV;
28e5dec8 1958}
645c22ef
DM
1959#endif /* !NV_PRESERVES_UV*/
1960
af359546 1961STATIC bool
7918f24d
NC
1962S_sv_2iuv_common(pTHX_ SV *const sv)
1963{
97aff369 1964 dVAR;
7918f24d
NC
1965
1966 PERL_ARGS_ASSERT_SV_2IUV_COMMON;
1967
af359546 1968 if (SvNOKp(sv)) {
28e5dec8
JH
1969 /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
1970 * without also getting a cached IV/UV from it at the same time
1971 * (ie PV->NV conversion should detect loss of accuracy and cache
af359546
NC
1972 * IV or UV at same time to avoid this. */
1973 /* IV-over-UV optimisation - choose to cache IV if possible */
25da4f38
IZ
1974
1975 if (SvTYPE(sv) == SVt_NV)
1976 sv_upgrade(sv, SVt_PVNV);
1977
28e5dec8
JH
1978 (void)SvIOKp_on(sv); /* Must do this first, to clear any SvOOK */
1979 /* < not <= as for NV doesn't preserve UV, ((NV)IV_MAX+1) will almost
1980 certainly cast into the IV range at IV_MAX, whereas the correct
1981 answer is the UV IV_MAX +1. Hence < ensures that dodgy boundary
1982 cases go to UV */
cab190d4
JD
1983#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1984 if (Perl_isnan(SvNVX(sv))) {
1985 SvUV_set(sv, 0);
1986 SvIsUV_on(sv);
fdbe6d7c 1987 return FALSE;
cab190d4 1988 }
cab190d4 1989#endif
28e5dec8 1990 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
45977657 1991 SvIV_set(sv, I_V(SvNVX(sv)));
28e5dec8
JH
1992 if (SvNVX(sv) == (NV) SvIVX(sv)
1993#ifndef NV_PRESERVES_UV
1994 && (((UV)1 << NV_PRESERVES_UV_BITS) >
1995 (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
1996 /* Don't flag it as "accurately an integer" if the number
1997 came from a (by definition imprecise) NV operation, and
1998 we're outside the range of NV integer precision */
1999#endif
2000 ) {
a43d94f2
NC
2001 if (SvNOK(sv))
2002 SvIOK_on(sv); /* Can this go wrong with rounding? NWC */
2003 else {
2004 /* scalar has trailing garbage, eg "42a" */
2005 }
28e5dec8 2006 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2007 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (precise)\n",
28e5dec8
JH
2008 PTR2UV(sv),
2009 SvNVX(sv),
2010 SvIVX(sv)));
2011
2012 } else {
2013 /* IV not precise. No need to convert from PV, as NV
2014 conversion would already have cached IV if it detected
2015 that PV->IV would be better than PV->NV->IV
2016 flags already correct - don't set public IOK. */
2017 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 2018 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (imprecise)\n",
28e5dec8
JH
2019 PTR2UV(sv),
2020 SvNVX(sv),
2021 SvIVX(sv)));
2022 }
2023 /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
2024 but the cast (NV)IV_MIN rounds to a the value less (more
2025 negative) than IV_MIN which happens to be equal to SvNVX ??
2026 Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
2027 NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
2028 (NV)UVX == NVX are both true, but the values differ. :-(
2029 Hopefully for 2s complement IV_MIN is something like
2030 0x8000000000000000 which will be exact. NWC */
d460ef45 2031 }
25da4f38 2032 else {
607fa7f2 2033 SvUV_set(sv, U_V(SvNVX(sv)));
28e5dec8
JH
2034 if (
2035 (SvNVX(sv) == (NV) SvUVX(sv))
2036#ifndef NV_PRESERVES_UV
2037 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
2038 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
2039 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
2040 /* Don't flag it as "accurately an integer" if the number
2041 came from a (by definition imprecise) NV operation, and
2042 we're outside the range of NV integer precision */
2043#endif
a43d94f2 2044 && SvNOK(sv)
28e5dec8
JH
2045 )
2046 SvIOK_on(sv);
25da4f38 2047 SvIsUV_on(sv);
1c846c1f 2048 DEBUG_c(PerlIO_printf(Perl_debug_log,
57def98f 2049 "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
56431972 2050 PTR2UV(sv),
57def98f
JH
2051 SvUVX(sv),
2052 SvUVX(sv)));
25da4f38 2053 }
748a9306
LW
2054 }
2055 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 2056 UV value;
504618e9 2057 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
af359546 2058 /* We want to avoid a possible problem when we cache an IV/ a UV which
25da4f38 2059 may be later translated to an NV, and the resulting NV is not
c2988b20
NC
2060 the same as the direct translation of the initial string
2061 (eg 123.456 can shortcut to the IV 123 with atol(), but we must
2062 be careful to ensure that the value with the .456 is around if the
2063 NV value is requested in the future).
1c846c1f 2064
af359546 2065 This means that if we cache such an IV/a UV, we need to cache the
25da4f38 2066 NV as well. Moreover, we trade speed for space, and do not
28e5dec8 2067 cache the NV if we are sure it's not needed.
25da4f38 2068 */
16b7a9a4 2069
c2988b20
NC
2070 /* SVt_PVNV is one higher than SVt_PVIV, hence this order */
2071 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2072 == IS_NUMBER_IN_UV) {
5e045b90 2073 /* It's definitely an integer, only upgrade to PVIV */
28e5dec8
JH
2074 if (SvTYPE(sv) < SVt_PVIV)
2075 sv_upgrade(sv, SVt_PVIV);
f7bbb42a 2076 (void)SvIOK_on(sv);
c2988b20
NC
2077 } else if (SvTYPE(sv) < SVt_PVNV)
2078 sv_upgrade(sv, SVt_PVNV);
28e5dec8 2079
f2524eef 2080 /* If NVs preserve UVs then we only use the UV value if we know that
c2988b20
NC
2081 we aren't going to call atof() below. If NVs don't preserve UVs
2082 then the value returned may have more precision than atof() will
2083 return, even though value isn't perfectly accurate. */
2084 if ((numtype & (IS_NUMBER_IN_UV
2085#ifdef NV_PRESERVES_UV
2086 | IS_NUMBER_NOT_INT
2087#endif
2088 )) == IS_NUMBER_IN_UV) {
2089 /* This won't turn off the public IOK flag if it was set above */
2090 (void)SvIOKp_on(sv);
2091
2092 if (!(numtype & IS_NUMBER_NEG)) {
2093 /* positive */;
2094 if (value <= (UV)IV_MAX) {
45977657 2095 SvIV_set(sv, (IV)value);
c2988b20 2096 } else {
af359546 2097 /* it didn't overflow, and it was positive. */
607fa7f2 2098 SvUV_set(sv, value);
c2988b20
NC
2099 SvIsUV_on(sv);
2100 }
2101 } else {
2102 /* 2s complement assumption */
2103 if (value <= (UV)IV_MIN) {
45977657 2104 SvIV_set(sv, -(IV)value);
c2988b20
NC
2105 } else {
2106 /* Too negative for an IV. This is a double upgrade, but
d1be9408 2107 I'm assuming it will be rare. */
c2988b20
NC
2108 if (SvTYPE(sv) < SVt_PVNV)
2109 sv_upgrade(sv, SVt_PVNV);
2110 SvNOK_on(sv);
2111 SvIOK_off(sv);
2112 SvIOKp_on(sv);
9d6ce603 2113 SvNV_set(sv, -(NV)value);
45977657 2114 SvIV_set(sv, IV_MIN);
c2988b20
NC
2115 }
2116 }
2117 }
2118 /* For !NV_PRESERVES_UV and IS_NUMBER_IN_UV and IS_NUMBER_NOT_INT we
2119 will be in the previous block to set the IV slot, and the next
2120 block to set the NV slot. So no else here. */
2121
2122 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2123 != IS_NUMBER_IN_UV) {
2124 /* It wasn't an (integer that doesn't overflow the UV). */
3f7c398e 2125 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8 2126
c2988b20
NC
2127 if (! numtype && ckWARN(WARN_NUMERIC))
2128 not_a_number(sv);
28e5dec8 2129
65202027 2130#if defined(USE_LONG_DOUBLE)
c2988b20
NC
2131 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%" PERL_PRIgldbl ")\n",
2132 PTR2UV(sv), SvNVX(sv)));
65202027 2133#else
1779d84d 2134 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"NVgf")\n",
c2988b20 2135 PTR2UV(sv), SvNVX(sv)));
65202027 2136#endif
28e5dec8 2137
28e5dec8 2138#ifdef NV_PRESERVES_UV
af359546
NC
2139 (void)SvIOKp_on(sv);
2140 (void)SvNOK_on(sv);
2141 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2142 SvIV_set(sv, I_V(SvNVX(sv)));
2143 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2144 SvIOK_on(sv);
2145 } else {
6f207bd3 2146 NOOP; /* Integer is imprecise. NOK, IOKp */
af359546
NC
2147 }
2148 /* UV will not work better than IV */
2149 } else {
2150 if (SvNVX(sv) > (NV)UV_MAX) {
2151 SvIsUV_on(sv);
2152 /* Integer is inaccurate. NOK, IOKp, is UV */
2153 SvUV_set(sv, UV_MAX);
af359546
NC
2154 } else {
2155 SvUV_set(sv, U_V(SvNVX(sv)));
2156 /* 0xFFFFFFFFFFFFFFFF not an issue in here, NVs
2157 NV preservse UV so can do correct comparison. */
2158 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2159 SvIOK_on(sv);
af359546 2160 } else {
6f207bd3 2161 NOOP; /* Integer is imprecise. NOK, IOKp, is UV */
af359546
NC
2162 }
2163 }
4b0c9573 2164 SvIsUV_on(sv);
af359546 2165 }
28e5dec8 2166#else /* NV_PRESERVES_UV */
c2988b20
NC
2167 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2168 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
af359546 2169 /* The IV/UV slot will have been set from value returned by
c2988b20
NC
2170 grok_number above. The NV slot has just been set using
2171 Atof. */
560b0c46 2172 SvNOK_on(sv);
c2988b20
NC
2173 assert (SvIOKp(sv));
2174 } else {
2175 if (((UV)1 << NV_PRESERVES_UV_BITS) >
2176 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2177 /* Small enough to preserve all bits. */
2178 (void)SvIOKp_on(sv);
2179 SvNOK_on(sv);
45977657 2180 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
2181 if ((NV)(SvIVX(sv)) == SvNVX(sv))
2182 SvIOK_on(sv);
2183 /* Assumption: first non-preserved integer is < IV_MAX,
2184 this NV is in the preserved range, therefore: */
2185 if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
2186 < (UV)IV_MAX)) {
32fdb065 2187 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
2188 }
2189 } else {
2190 /* IN_UV NOT_INT
2191 0 0 already failed to read UV.
2192 0 1 already failed to read UV.
2193 1 0 you won't get here in this case. IV/UV
2194 slot set, public IOK, Atof() unneeded.
2195 1 1 already read UV.
2196 so there's no point in sv_2iuv_non_preserve() attempting
2197 to use atol, strtol, strtoul etc. */
47031da6 2198# ifdef DEBUGGING
40a17c4c 2199 sv_2iuv_non_preserve (sv, numtype);
47031da6
NC
2200# else
2201 sv_2iuv_non_preserve (sv);
2202# endif
c2988b20
NC
2203 }
2204 }
28e5dec8 2205#endif /* NV_PRESERVES_UV */
a43d94f2
NC
2206 /* It might be more code efficient to go through the entire logic above
2207 and conditionally set with SvIOKp_on() rather than SvIOK(), but it
2208 gets complex and potentially buggy, so more programmer efficient
2209 to do it this way, by turning off the public flags: */
2210 if (!numtype)
2211 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK);
25da4f38 2212 }
af359546
NC
2213 }
2214 else {
675c862f 2215 if (isGV_with_GP(sv))
159b6efe 2216 return glob_2number(MUTABLE_GV(sv));
180488f8 2217
af359546
NC
2218 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
2219 if (!PL_localizing && ckWARN(WARN_UNINITIALIZED))
2220 report_uninit(sv);
2221 }
25da4f38
IZ
2222 if (SvTYPE(sv) < SVt_IV)
2223 /* Typically the caller expects that sv_any is not NULL now. */
2224 sv_upgrade(sv, SVt_IV);
af359546
NC
2225 /* Return 0 from the caller. */
2226 return TRUE;
2227 }
2228 return FALSE;
2229}
2230
2231/*
2232=for apidoc sv_2iv_flags
2233
2234Return the integer value of an SV, doing any necessary string
2235conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2236Normally used via the C<SvIV(sv)> and C<SvIVx(sv)> macros.
2237
2238=cut
2239*/
2240
2241IV
5de3775c 2242Perl_sv_2iv_flags(pTHX_ register SV *const sv, const I32 flags)
af359546 2243{
97aff369 2244 dVAR;
af359546 2245 if (!sv)
a0d0e21e 2246 return 0;
cecf5685
NC
2247 if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
2248 /* FBMs use the same flag bit as SVf_IVisUV, so must let them
50caf62e
NC
2249 cache IVs just in case. In practice it seems that they never
2250 actually anywhere accessible by user Perl code, let alone get used
2251 in anything other than a string context. */
af359546
NC
2252 if (flags & SV_GMAGIC)
2253 mg_get(sv);
2254 if (SvIOKp(sv))
2255 return SvIVX(sv);
2256 if (SvNOKp(sv)) {
2257 return I_V(SvNVX(sv));
2258 }
71c558c3
NC
2259 if (SvPOKp(sv) && SvLEN(sv)) {
2260 UV value;
2261 const int numtype
2262 = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2263
2264 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2265 == IS_NUMBER_IN_UV) {
2266 /* It's definitely an integer */
2267 if (numtype & IS_NUMBER_NEG) {
2268 if (value < (UV)IV_MIN)
2269 return -(IV)value;
2270 } else {
2271 if (value < (UV)IV_MAX)
2272 return (IV)value;
2273 }
2274 }
2275 if (!numtype) {
2276 if (ckWARN(WARN_NUMERIC))
2277 not_a_number(sv);
2278 }
2279 return I_V(Atof(SvPVX_const(sv)));
2280 }
1c7ff15e
NC
2281 if (SvROK(sv)) {
2282 goto return_rok;
af359546 2283 }
1c7ff15e
NC
2284 assert(SvTYPE(sv) >= SVt_PVMG);
2285 /* This falls through to the report_uninit inside S_sv_2iuv_common. */
4cb1ec55 2286 } else if (SvTHINKFIRST(sv)) {
af359546 2287 if (SvROK(sv)) {
1c7ff15e 2288 return_rok:
af359546 2289 if (SvAMAGIC(sv)) {
aee036bb
DM
2290 SV * tmpstr;
2291 if (flags & SV_SKIP_OVERLOAD)
2292 return 0;
2293 tmpstr=AMG_CALLun(sv,numer);
af359546
NC
2294 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2295 return SvIV(tmpstr);
2296 }
2297 }
2298 return PTR2IV(SvRV(sv));
2299 }
2300 if (SvIsCOW(sv)) {
2301 sv_force_normal_flags(sv, 0);
2302 }
2303 if (SvREADONLY(sv) && !SvOK(sv)) {
2304 if (ckWARN(WARN_UNINITIALIZED))
2305 report_uninit(sv);
2306 return 0;
2307 }
2308 }
2309 if (!SvIOKp(sv)) {
2310 if (S_sv_2iuv_common(aTHX_ sv))
2311 return 0;
79072805 2312 }
1d7c1841
GS
2313 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
2314 PTR2UV(sv),SvIVX(sv)));
25da4f38 2315 return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
79072805
LW
2316}
2317
645c22ef 2318/*
891f9566 2319=for apidoc sv_2uv_flags
645c22ef
DM
2320
2321Return the unsigned integer value of an SV, doing any necessary string
891f9566
YST
2322conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2323Normally used via the C<SvUV(sv)> and C<SvUVx(sv)> macros.
645c22ef
DM
2324
2325=cut
2326*/
2327
ff68c719 2328UV
5de3775c 2329Perl_sv_2uv_flags(pTHX_ register SV *const sv, const I32 flags)
ff68c719 2330{
97aff369 2331 dVAR;
ff68c719 2332 if (!sv)
2333 return 0;
cecf5685
NC
2334 if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
2335 /* FBMs use the same flag bit as SVf_IVisUV, so must let them
50caf62e 2336 cache IVs just in case. */
891f9566
YST
2337 if (flags & SV_GMAGIC)
2338 mg_get(sv);
ff68c719 2339 if (SvIOKp(sv))
2340 return SvUVX(sv);
2341 if (SvNOKp(sv))
2342 return U_V(SvNVX(sv));
71c558c3
NC
2343 if (SvPOKp(sv) && SvLEN(sv)) {
2344 UV value;
2345 const int numtype
2346 = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2347
2348 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2349 == IS_NUMBER_IN_UV) {
2350 /* It's definitely an integer */
2351 if (!(numtype & IS_NUMBER_NEG))
2352 return value;
2353 }
2354 if (!numtype) {
2355 if (ckWARN(WARN_NUMERIC))
2356 not_a_number(sv);
2357 }
2358 return U_V(Atof(SvPVX_const(sv)));
2359 }
1c7ff15e
NC
2360 if (SvROK(sv)) {
2361 goto return_rok;
3fe9a6f1 2362 }
1c7ff15e
NC
2363 assert(SvTYPE(sv) >= SVt_PVMG);
2364 /* This falls through to the report_uninit inside S_sv_2iuv_common. */
4cb1ec55 2365 } else if (SvTHINKFIRST(sv)) {
ff68c719 2366 if (SvROK(sv)) {
1c7ff15e 2367 return_rok:
deb46114 2368 if (SvAMAGIC(sv)) {
aee036bb
DM
2369 SV *tmpstr;
2370 if (flags & SV_SKIP_OVERLOAD)
2371 return 0;
2372 tmpstr = AMG_CALLun(sv,numer);
deb46114
NC
2373 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2374 return SvUV(tmpstr);
2375 }
2376 }
2377 return PTR2UV(SvRV(sv));
ff68c719 2378 }
765f542d
NC
2379 if (SvIsCOW(sv)) {
2380 sv_force_normal_flags(sv, 0);
8a818333 2381 }
0336b60e 2382 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2383 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2384 report_uninit(sv);
ff68c719 2385 return 0;
2386 }
2387 }
af359546
NC
2388 if (!SvIOKp(sv)) {
2389 if (S_sv_2iuv_common(aTHX_ sv))
2390 return 0;
ff68c719 2391 }
25da4f38 2392
1d7c1841
GS
2393 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
2394 PTR2UV(sv),SvUVX(sv)));
25da4f38 2395 return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
ff68c719 2396}
2397
645c22ef 2398/*
196007d1 2399=for apidoc sv_2nv_flags
645c22ef
DM
2400
2401Return the num value of an SV, doing any necessary string or integer
39d5de13
DM
2402conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2403Normally used via the C<SvNV(sv)> and C<SvNVx(sv)> macros.
645c22ef
DM
2404
2405=cut
2406*/
2407
65202027 2408NV
39d5de13 2409Perl_sv_2nv_flags(pTHX_ register SV *const sv, const I32 flags)
79072805 2410{
97aff369 2411 dVAR;
79072805
LW
2412 if (!sv)
2413 return 0.0;
cecf5685
NC
2414 if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
2415 /* FBMs use the same flag bit as SVf_IVisUV, so must let them
50caf62e 2416 cache IVs just in case. */
39d5de13
DM
2417 if (flags & SV_GMAGIC)
2418 mg_get(sv);
463ee0b2
LW
2419 if (SvNOKp(sv))
2420 return SvNVX(sv);
0aa395f8 2421 if ((SvPOKp(sv) && SvLEN(sv)) && !SvIOKp(sv)) {
041457d9 2422 if (!SvIOKp(sv) && ckWARN(WARN_NUMERIC) &&
504618e9 2423 !grok_number(SvPVX_const(sv), SvCUR(sv), NULL))
a0d0e21e 2424 not_a_number(sv);
3f7c398e 2425 return Atof(SvPVX_const(sv));
a0d0e21e 2426 }
25da4f38 2427 if (SvIOKp(sv)) {
1c846c1f 2428 if (SvIsUV(sv))
65202027 2429 return (NV)SvUVX(sv);
25da4f38 2430 else
65202027 2431 return (NV)SvIVX(sv);
47a72cb8
NC
2432 }
2433 if (SvROK(sv)) {
2434 goto return_rok;
2435 }
2436 assert(SvTYPE(sv) >= SVt_PVMG);
2437 /* This falls through to the report_uninit near the end of the
2438 function. */
2439 } else if (SvTHINKFIRST(sv)) {
a0d0e21e 2440 if (SvROK(sv)) {
47a72cb8 2441 return_rok:
deb46114 2442 if (SvAMAGIC(sv)) {
aee036bb
DM
2443 SV *tmpstr;
2444 if (flags & SV_SKIP_OVERLOAD)
2445 return 0;
2446 tmpstr = AMG_CALLun(sv,numer);
deb46114
NC
2447 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2448 return SvNV(tmpstr);
2449 }
2450 }
2451 return PTR2NV(SvRV(sv));
a0d0e21e 2452 }
765f542d
NC
2453 if (SvIsCOW(sv)) {
2454 sv_force_normal_flags(sv, 0);
8a818333 2455 }
0336b60e 2456 if (SvREADONLY(sv) && !SvOK(sv)) {
599cee73 2457 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2458 report_uninit(sv);
ed6116ce
LW
2459 return 0.0;
2460 }
79072805
LW
2461 }
2462 if (SvTYPE(sv) < SVt_NV) {
7e25a7e9
NC
2463 /* The logic to use SVt_PVNV if necessary is in sv_upgrade. */
2464 sv_upgrade(sv, SVt_NV);
906f284f 2465#ifdef USE_LONG_DOUBLE
097ee67d 2466 DEBUG_c({
f93f4e46 2467 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
2468 PerlIO_printf(Perl_debug_log,
2469 "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
2470 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
2471 RESTORE_NUMERIC_LOCAL();
2472 });
65202027 2473#else
572bbb43 2474 DEBUG_c({
f93f4e46 2475 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 2476 PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%"NVgf")\n",
1d7c1841 2477 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
2478 RESTORE_NUMERIC_LOCAL();
2479 });
572bbb43 2480#endif
79072805
LW
2481 }
2482 else if (SvTYPE(sv) < SVt_PVNV)
2483 sv_upgrade(sv, SVt_PVNV);
59d8ce62
NC
2484 if (SvNOKp(sv)) {
2485 return SvNVX(sv);
61604483 2486 }
59d8ce62 2487 if (SvIOKp(sv)) {
9d6ce603 2488 SvNV_set(sv, SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv));
28e5dec8 2489#ifdef NV_PRESERVES_UV
a43d94f2
NC
2490 if (SvIOK(sv))
2491 SvNOK_on(sv);
2492 else
2493 SvNOKp_on(sv);
28e5dec8
JH
2494#else
2495 /* Only set the public NV OK flag if this NV preserves the IV */
2496 /* Check it's not 0xFFFFFFFFFFFFFFFF */
a43d94f2
NC
2497 if (SvIOK(sv) &&
2498 SvIsUV(sv) ? ((SvUVX(sv) != UV_MAX)&&(SvUVX(sv) == U_V(SvNVX(sv))))
28e5dec8
JH
2499 : (SvIVX(sv) == I_V(SvNVX(sv))))
2500 SvNOK_on(sv);
2501 else
2502 SvNOKp_on(sv);
2503#endif
93a17b20 2504 }
748a9306 2505 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 2506 UV value;
3f7c398e 2507 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
041457d9 2508 if (!SvIOKp(sv) && !numtype && ckWARN(WARN_NUMERIC))
a0d0e21e 2509 not_a_number(sv);
28e5dec8 2510#ifdef NV_PRESERVES_UV
c2988b20
NC
2511 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2512 == IS_NUMBER_IN_UV) {
5e045b90 2513 /* It's definitely an integer */
9d6ce603 2514 SvNV_set(sv, (numtype & IS_NUMBER_NEG) ? -(NV)value : (NV)value);
c2988b20 2515 } else
3f7c398e 2516 SvNV_set(sv, Atof(SvPVX_const(sv)));
a43d94f2
NC
2517 if (numtype)
2518 SvNOK_on(sv);
2519 else
2520 SvNOKp_on(sv);
28e5dec8 2521#else
3f7c398e 2522 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8
JH
2523 /* Only set the public NV OK flag if this NV preserves the value in
2524 the PV at least as well as an IV/UV would.
2525 Not sure how to do this 100% reliably. */
2526 /* if that shift count is out of range then Configure's test is
2527 wonky. We shouldn't be in here with NV_PRESERVES_UV_BITS ==
2528 UV_BITS */
2529 if (((UV)1 << NV_PRESERVES_UV_BITS) >
c2988b20 2530 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
28e5dec8 2531 SvNOK_on(sv); /* Definitely small enough to preserve all bits */
c2988b20
NC
2532 } else if (!(numtype & IS_NUMBER_IN_UV)) {
2533 /* Can't use strtol etc to convert this string, so don't try.
2534 sv_2iv and sv_2uv will use the NV to convert, not the PV. */
2535 SvNOK_on(sv);
2536 } else {
2537 /* value has been set. It may not be precise. */
2538 if ((numtype & IS_NUMBER_NEG) && (value > (UV)IV_MIN)) {
2539 /* 2s complement assumption for (UV)IV_MIN */
2540 SvNOK_on(sv); /* Integer is too negative. */
2541 } else {
2542 SvNOKp_on(sv);
2543 SvIOKp_on(sv);
6fa402ec 2544
c2988b20 2545 if (numtype & IS_NUMBER_NEG) {
45977657 2546 SvIV_set(sv, -(IV)value);
c2988b20 2547 } else if (value <= (UV)IV_MAX) {
45977657 2548 SvIV_set(sv, (IV)value);
c2988b20 2549 } else {
607fa7f2 2550 SvUV_set(sv, value);
c2988b20
NC
2551 SvIsUV_on(sv);
2552 }
2553
2554 if (numtype & IS_NUMBER_NOT_INT) {
2555 /* I believe that even if the original PV had decimals,
2556 they are lost beyond the limit of the FP precision.
2557 However, neither is canonical, so both only get p
2558 flags. NWC, 2000/11/25 */
2559 /* Both already have p flags, so do nothing */
2560 } else {
66a1b24b 2561 const NV nv = SvNVX(sv);
c2988b20
NC
2562 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2563 if (SvIVX(sv) == I_V(nv)) {
2564 SvNOK_on(sv);
c2988b20 2565 } else {
c2988b20
NC
2566 /* It had no "." so it must be integer. */
2567 }
00b6aa41 2568 SvIOK_on(sv);
c2988b20
NC
2569 } else {
2570 /* between IV_MAX and NV(UV_MAX).
2571 Could be slightly > UV_MAX */
6fa402ec 2572
c2988b20
NC
2573 if (numtype & IS_NUMBER_NOT_INT) {
2574 /* UV and NV both imprecise. */
2575 } else {
66a1b24b 2576 const UV nv_as_uv = U_V(nv);
c2988b20
NC
2577
2578 if (value == nv_as_uv && SvUVX(sv) != UV_MAX) {
2579 SvNOK_on(sv);
c2988b20 2580 }
00b6aa41 2581 SvIOK_on(sv);
c2988b20
NC
2582 }
2583 }
2584 }
2585 }
2586 }
a43d94f2
NC
2587 /* It might be more code efficient to go through the entire logic above
2588 and conditionally set with SvNOKp_on() rather than SvNOK(), but it
2589 gets complex and potentially buggy, so more programmer efficient
2590 to do it this way, by turning off the public flags: */
2591 if (!numtype)
2592 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK);
28e5dec8 2593#endif /* NV_PRESERVES_UV */
93a17b20 2594 }
79072805 2595 else {
f7877b28 2596 if (isGV_with_GP(sv)) {
159b6efe 2597 glob_2number(MUTABLE_GV(sv));
180488f8
NC
2598 return 0.0;
2599 }
2600
041457d9 2601 if (!PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP) && ckWARN(WARN_UNINITIALIZED))
29489e7c 2602 report_uninit(sv);
7e25a7e9
NC
2603 assert (SvTYPE(sv) >= SVt_NV);
2604 /* Typically the caller expects that sv_any is not NULL now. */
2605 /* XXX Ilya implies that this is a bug in callers that assume this
2606 and ideally should be fixed. */
a0d0e21e 2607 return 0.0;
79072805 2608 }
572bbb43 2609#if defined(USE_LONG_DOUBLE)
097ee67d 2610 DEBUG_c({
f93f4e46 2611 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
2612 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
2613 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
2614 RESTORE_NUMERIC_LOCAL();
2615 });
65202027 2616#else
572bbb43 2617 DEBUG_c({
f93f4e46 2618 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 2619 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%"NVgf")\n",
1d7c1841 2620 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
2621 RESTORE_NUMERIC_LOCAL();
2622 });
572bbb43 2623#endif
463ee0b2 2624 return SvNVX(sv);
79072805
LW
2625}
2626
800401ee
JH
2627/*
2628=for apidoc sv_2num
2629
2630Return an SV with the numeric value of the source SV, doing any necessary
a196a5fa
JH
2631reference or overload conversion. You must use the C<SvNUM(sv)> macro to
2632access this function.
800401ee
JH
2633
2634=cut
2635*/
2636
2637SV *
5de3775c 2638Perl_sv_2num(pTHX_ register SV *const sv)
800401ee 2639{
7918f24d
NC
2640 PERL_ARGS_ASSERT_SV_2NUM;
2641
b9ee0594
RGS
2642 if (!SvROK(sv))
2643 return sv;
800401ee
JH
2644 if (SvAMAGIC(sv)) {
2645 SV * const tmpsv = AMG_CALLun(sv,numer);
a02ec77a 2646 TAINT_IF(tmpsv && SvTAINTED(tmpsv));
800401ee
JH
2647 if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
2648 return sv_2num(tmpsv);
2649 }
2650 return sv_2mortal(newSVuv(PTR2UV(SvRV(sv))));
2651}
2652
645c22ef
DM
2653/* uiv_2buf(): private routine for use by sv_2pv_flags(): print an IV or
2654 * UV as a string towards the end of buf, and return pointers to start and
2655 * end of it.
2656 *
2657 * We assume that buf is at least TYPE_CHARS(UV) long.
2658 */
2659
864dbfa3 2660static char *
5de3775c 2661S_uiv_2buf(char *const buf, const IV iv, UV uv, const int is_uv, char **const peob)
25da4f38 2662{
25da4f38 2663 char *ptr = buf + TYPE_CHARS(UV);
823a54a3 2664 char * const ebuf = ptr;
25da4f38 2665 int sign;
25da4f38 2666
7918f24d
NC
2667 PERL_ARGS_ASSERT_UIV_2BUF;
2668
25da4f38
IZ
2669 if (is_uv)
2670 sign = 0;
2671 else if (iv >= 0) {
2672 uv = iv;
2673 sign = 0;
2674 } else {
2675 uv = -iv;
2676 sign = 1;
2677 }
2678 do {
eb160463 2679 *--ptr = '0' + (char)(uv % 10);
25da4f38
IZ
2680 } while (uv /= 10);
2681 if (sign)
2682 *--ptr = '-';
2683 *peob = ebuf;
2684 return ptr;
2685}
2686
645c22ef
DM
2687/*
2688=for apidoc sv_2pv_flags
2689
ff276b08 2690Returns a pointer to the string value of an SV, and sets *lp to its length.
645c22ef
DM
2691If flags includes SV_GMAGIC, does an mg_get() first. Coerces sv to a string
2692if necessary.
2693Normally invoked via the C<SvPV_flags> macro. C<sv_2pv()> and C<sv_2pv_nomg>
2694usually end up here too.
2695
2696=cut
2697*/
2698
8d6d96c1 2699char *
5de3775c 2700Perl_sv_2pv_flags(pTHX_ register SV *const sv, STRLEN *const lp, const I32 flags)
8d6d96c1 2701{
97aff369 2702 dVAR;
79072805 2703 register char *s;
79072805 2704
463ee0b2 2705 if (!sv) {
cdb061a3
NC
2706 if (lp)
2707 *lp = 0;
73d840c0 2708 return (char *)"";
463ee0b2 2709 }
8990e307 2710 if (SvGMAGICAL(sv)) {
8d6d96c1
HS
2711 if (flags & SV_GMAGIC)
2712 mg_get(sv);
463ee0b2 2713 if (SvPOKp(sv)) {
cdb061a3
NC
2714 if (lp)
2715 *lp = SvCUR(sv);
10516c54
NC
2716 if (flags & SV_MUTABLE_RETURN)
2717 return SvPVX_mutable(sv);
4d84ee25
NC
2718 if (flags & SV_CONST_RETURN)
2719 return (char *)SvPVX_const(sv);
463ee0b2
LW
2720 return SvPVX(sv);
2721 }
75dfc8ec
NC
2722 if (SvIOKp(sv) || SvNOKp(sv)) {
2723 char tbuf[64]; /* Must fit sprintf/Gconvert of longest IV/NV */
75dfc8ec
NC
2724 STRLEN len;
2725
2726 if (SvIOKp(sv)) {
e80fed9d 2727 len = SvIsUV(sv)
d9fad198
JH
2728 ? my_snprintf(tbuf, sizeof(tbuf), "%"UVuf, (UV)SvUVX(sv))
2729 : my_snprintf(tbuf, sizeof(tbuf), "%"IVdf, (IV)SvIVX(sv));
29912d93
NC
2730 } else if(SvNVX(sv) == 0.0) {
2731 tbuf[0] = '0';
2732 tbuf[1] = 0;
2733 len = 1;
75dfc8ec 2734 } else {
e8ada2d0
NC
2735 Gconvert(SvNVX(sv), NV_DIG, 0, tbuf);
2736 len = strlen(tbuf);
75dfc8ec 2737 }
b5b886f0
NC
2738 assert(!SvROK(sv));
2739 {
75dfc8ec
NC
2740 dVAR;
2741
75dfc8ec
NC
2742 SvUPGRADE(sv, SVt_PV);
2743 if (lp)
2744 *lp = len;
2745 s = SvGROW_mutable(sv, len + 1);
2746 SvCUR_set(sv, len);
2747 SvPOKp_on(sv);
10edeb5d 2748 return (char*)memcpy(s, tbuf, len + 1);
75dfc8ec 2749 }
463ee0b2 2750 }
1c7ff15e
NC
2751 if (SvROK(sv)) {
2752 goto return_rok;
2753 }
2754 assert(SvTYPE(sv) >= SVt_PVMG);
2755 /* This falls through to the report_uninit near the end of the
2756 function. */
2757 } else if (SvTHINKFIRST(sv)) {
ed6116ce 2758 if (SvROK(sv)) {
1c7ff15e 2759 return_rok:
deb46114 2760 if (SvAMAGIC(sv)) {
aee036bb
DM
2761 SV *tmpstr;
2762 if (flags & SV_SKIP_OVERLOAD)
2763 return NULL;
2764 tmpstr = AMG_CALLun(sv,string);
a02ec77a 2765 TAINT_IF(tmpstr && SvTAINTED(tmpstr));
deb46114
NC
2766 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2767 /* Unwrap this: */
2768 /* char *pv = lp ? SvPV(tmpstr, *lp) : SvPV_nolen(tmpstr);
2769 */
2770
2771 char *pv;
2772 if ((SvFLAGS(tmpstr) & (SVf_POK)) == SVf_POK) {
2773 if (flags & SV_CONST_RETURN) {
2774 pv = (char *) SvPVX_const(tmpstr);
2775 } else {
2776 pv = (flags & SV_MUTABLE_RETURN)
2777 ? SvPVX_mutable(tmpstr) : SvPVX(tmpstr);
2778 }
2779 if (lp)
2780 *lp = SvCUR(tmpstr);
50adf7d2 2781 } else {
deb46114 2782 pv = sv_2pv_flags(tmpstr, lp, flags);
50adf7d2 2783 }
deb46114
NC
2784 if (SvUTF8(tmpstr))
2785 SvUTF8_on(sv);
2786 else
2787 SvUTF8_off(sv);
2788 return pv;
50adf7d2 2789 }
deb46114
NC
2790 }
2791 {
fafee734
NC
2792 STRLEN len;
2793 char *retval;
2794 char *buffer;
d2c6dc5e 2795 SV *const referent = SvRV(sv);
d8eae41e
NC
2796
2797 if (!referent) {
fafee734
NC
2798 len = 7;
2799 retval = buffer = savepvn("NULLREF", len);
5c35adbb 2800 } else if (SvTYPE(referent) == SVt_REGEXP) {
d2c6dc5e 2801 REGEXP * const re = (REGEXP *)MUTABLE_PTR(referent);
67d2d14d
AB
2802 I32 seen_evals = 0;
2803
2804 assert(re);
2805
2806 /* If the regex is UTF-8 we want the containing scalar to
2807 have an UTF-8 flag too */
2808 if (RX_UTF8(re))
2809 SvUTF8_on(sv);
2810 else
2811 SvUTF8_off(sv);
2812
2813 if ((seen_evals = RX_SEEN_EVALS(re)))
2814 PL_reginterp_cnt += seen_evals;
2815
2816 if (lp)
2817 *lp = RX_WRAPLEN(re);
2818
2819 return RX_WRAPPED(re);
d8eae41e
NC
2820 } else {
2821 const char *const typestr = sv_reftype(referent, 0);
fafee734
NC
2822 const STRLEN typelen = strlen(typestr);
2823 UV addr = PTR2UV(referent);
2824 const char *stashname = NULL;
2825 STRLEN stashnamelen = 0; /* hush, gcc */
2826 const char *buffer_end;
d8eae41e 2827
d8eae41e 2828 if (SvOBJECT(referent)) {
fafee734
NC
2829 const HEK *const name = HvNAME_HEK(SvSTASH(referent));
2830
2831 if (name) {
2832 stashname = HEK_KEY(name);
2833 stashnamelen = HEK_LEN(name);
2834
2835 if (HEK_UTF8(name)) {
2836 SvUTF8_on(sv);
2837 } else {
2838 SvUTF8_off(sv);
2839 }
2840 } else {
2841 stashname = "__ANON__";
2842 stashnamelen = 8;
2843 }
2844 len = stashnamelen + 1 /* = */ + typelen + 3 /* (0x */
2845 + 2 * sizeof(UV) + 2 /* )\0 */;
2846 } else {
2847 len = typelen + 3 /* (0x */
2848 + 2 * sizeof(UV) + 2 /* )\0 */;
d8eae41e 2849 }
fafee734
NC
2850
2851 Newx(buffer, len, char);
2852 buffer_end = retval = buffer + len;
2853
2854 /* Working backwards */
2855 *--retval = '\0';
2856 *--retval = ')';
2857 do {
2858 *--retval = PL_hexdigit[addr & 15];
2859 } while (addr >>= 4);
2860 *--retval = 'x';
2861 *--retval = '0';
2862 *--retval = '(';
2863
2864 retval -= typelen;
2865 memcpy(retval, typestr, typelen);
2866
2867 if (stashname) {
2868 *--retval = '=';
2869 retval -= stashnamelen;
2870 memcpy(retval, stashname, stashnamelen);
2871 }
2872 /* retval may not neccesarily have reached the start of the
2873 buffer here. */
2874 assert (retval >= buffer);
2875
2876 len = buffer_end - retval - 1; /* -1 for that \0 */
c080367d 2877 }
042dae7a 2878 if (lp)
fafee734
NC
2879 *lp = len;
2880 SAVEFREEPV(buffer);
2881 return retval;
463ee0b2 2882 }
79072805 2883 }
0336b60e 2884 if (SvREADONLY(sv) && !SvOK(sv)) {
cdb061a3
NC
2885 if (lp)
2886 *lp = 0;
9f621bb0
NC
2887 if (flags & SV_UNDEF_RETURNS_NULL)
2888 return NULL;
2889 if (ckWARN(WARN_UNINITIALIZED))
2890 report_uninit(sv);
73d840c0 2891 return (char *)"";
79072805 2892 }
79072805 2893 }
28e5dec8
JH
2894 if (SvIOK(sv) || ((SvIOKp(sv) && !SvNOKp(sv)))) {
2895 /* I'm assuming that if both IV and NV are equally valid then
2896 converting the IV is going to be more efficient */
e1ec3a88 2897 const U32 isUIOK = SvIsUV(sv);
28e5dec8
JH
2898 char buf[TYPE_CHARS(UV)];
2899 char *ebuf, *ptr;
97a130b8 2900 STRLEN len;
28e5dec8
JH
2901
2902 if (SvTYPE(sv) < SVt_PVIV)
2903 sv_upgrade(sv, SVt_PVIV);
4ea1d550 2904 ptr = uiv_2buf(buf, SvIVX(sv), SvUVX(sv), isUIOK, &ebuf);
97a130b8 2905 len = ebuf - ptr;
5902b6a9 2906 /* inlined from sv_setpvn */
97a130b8
NC
2907 s = SvGROW_mutable(sv, len + 1);
2908 Move(ptr, s, len, char);
2909 s += len;
28e5dec8 2910 *s = '\0';
28e5dec8
JH
2911 }
2912 else if (SvNOKp(sv)) {
79072805
LW
2913 if (SvTYPE(sv) < SVt_PVNV)
2914 sv_upgrade(sv, SVt_PVNV);
29912d93
NC
2915 if (SvNVX(sv) == 0.0) {
2916 s = SvGROW_mutable(sv, 2);
2917 *s++ = '0';
2918 *s = '\0';
2919 } else {
2920 dSAVE_ERRNO;
2921 /* The +20 is pure guesswork. Configure test needed. --jhi */
2922 s = SvGROW_mutable(sv, NV_DIG + 20);
2923 /* some Xenix systems wipe out errno here */
2d4389e4 2924 Gconvert(SvNVX(sv), NV_DIG, 0, s);
29912d93
NC
2925 RESTORE_ERRNO;
2926 while (*s) s++;
bbce6d69 2927 }
79072805
LW
2928#ifdef hcx
2929 if (s[-1] == '.')
46fc3d4c 2930 *--s = '\0';
79072805
LW
2931#endif
2932 }
79072805 2933 else {
8d1c3e26
NC
2934 if (isGV_with_GP(sv)) {
2935 GV *const gv = MUTABLE_GV(sv);
2936 const U32 wasfake = SvFLAGS(gv) & SVf_FAKE;
2937 SV *const buffer = sv_newmortal();
2938
2939 /* FAKE globs can get coerced, so need to turn this off temporarily
2940 if it is on. */
2941 SvFAKE_off(gv);
2942 gv_efullname3(buffer, gv, "*");
2943 SvFLAGS(gv) |= wasfake;
2944
1809c940
DM
2945 if (SvPOK(buffer)) {
2946 if (lp) {
2947 *lp = SvCUR(buffer);
2948 }
2949 return SvPVX(buffer);
2950 }
2951 else {
2952 if (lp)
2953 *lp = 0;
2954 return (char *)"";
8d1c3e26 2955 }
8d1c3e26 2956 }
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
71eb6d8c 3031 SvGETMAGIC(sv);
0875d2fe 3032 sv_utf8_downgrade(sv,0);
71eb6d8c 3033 return lp ? SvPV_nomg(sv,*lp) : SvPV_nomg_nolen(sv);
7340a771
GS
3034}
3035
645c22ef 3036/*
035cbb0e
RGS
3037=for apidoc sv_2pvutf8
3038
3039Return a pointer to the UTF-8-encoded representation of the SV, and set *lp
3040to its length. May cause the SV to be upgraded to UTF-8 as a side-effect.
3041
3042Usually accessed via the C<SvPVutf8> macro.
3043
3044=cut
3045*/
645c22ef 3046
7340a771 3047char *
7bc54cea 3048Perl_sv_2pvutf8(pTHX_ register SV *const sv, STRLEN *const lp)
7340a771 3049{
7918f24d
NC
3050 PERL_ARGS_ASSERT_SV_2PVUTF8;
3051
035cbb0e
RGS
3052 sv_utf8_upgrade(sv);
3053 return lp ? SvPV(sv,*lp) : SvPV_nolen(sv);
7340a771 3054}
1c846c1f 3055
7ee2227d 3056
645c22ef
DM
3057/*
3058=for apidoc sv_2bool
3059
06c841cf
FC
3060This macro is only used by sv_true() or its macro equivalent, and only if
3061the latter's argument is neither SvPOK, SvIOK nor SvNOK.
3062It calls sv_2bool_flags with the SV_GMAGIC flag.
3063
3064=for apidoc sv_2bool_flags
3065
3066This function is only used by sv_true() and friends, and only if
3067the latter's argument is neither SvPOK, SvIOK nor SvNOK. If the flags
3068contain SV_GMAGIC, then it does an mg_get() first.
3069
645c22ef
DM
3070
3071=cut
3072*/
3073
463ee0b2 3074bool
06c841cf 3075Perl_sv_2bool_flags(pTHX_ register SV *const sv, const I32 flags)
463ee0b2 3076{
97aff369 3077 dVAR;
7918f24d 3078
06c841cf 3079 PERL_ARGS_ASSERT_SV_2BOOL_FLAGS;
7918f24d 3080
06c841cf 3081 if(flags & SV_GMAGIC) SvGETMAGIC(sv);
463ee0b2 3082
a0d0e21e
LW
3083 if (!SvOK(sv))
3084 return 0;
3085 if (SvROK(sv)) {
fabdb6c0
AL
3086 if (SvAMAGIC(sv)) {
3087 SV * const tmpsv = AMG_CALLun(sv,bool_);
3088 if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
f2338a2e 3089 return cBOOL(SvTRUE(tmpsv));
fabdb6c0
AL
3090 }
3091 return SvRV(sv) != 0;
a0d0e21e 3092 }
463ee0b2 3093 if (SvPOKp(sv)) {
53c1dcc0
AL
3094 register XPV* const Xpvtmp = (XPV*)SvANY(sv);
3095 if (Xpvtmp &&
339049b0 3096 (*sv->sv_u.svu_pv > '0' ||
11343788 3097 Xpvtmp->xpv_cur > 1 ||
339049b0 3098 (Xpvtmp->xpv_cur && *sv->sv_u.svu_pv != '0')))
463ee0b2
LW
3099 return 1;
3100 else
3101 return 0;
3102 }
3103 else {
3104 if (SvIOKp(sv))
3105 return SvIVX(sv) != 0;
3106 else {
3107 if (SvNOKp(sv))
3108 return SvNVX(sv) != 0.0;
180488f8 3109 else {
f7877b28 3110 if (isGV_with_GP(sv))
180488f8
NC
3111 return TRUE;
3112 else
3113 return FALSE;
3114 }
463ee0b2
LW
3115 }
3116 }
79072805
LW
3117}
3118
c461cf8f
JH
3119/*
3120=for apidoc sv_utf8_upgrade
3121
78ea37eb 3122Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 3123Forces the SV to string form if it is not already.
2bbc8d55 3124Will C<mg_get> on C<sv> if appropriate.
4411f3b6 3125Always sets the SvUTF8 flag to avoid future validity checks even
2bbc8d55
SP
3126if the whole string is the same in UTF-8 as not.
3127Returns the number of bytes in the converted string
c461cf8f 3128
13a6c0e0
JH
3129This is not as a general purpose byte encoding to Unicode interface:
3130use the Encode extension for that.
3131
fe749c9a
KW
3132=for apidoc sv_utf8_upgrade_nomg
3133
3134Like sv_utf8_upgrade, but doesn't do magic on C<sv>
3135
8d6d96c1
HS
3136=for apidoc sv_utf8_upgrade_flags
3137
78ea37eb 3138Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 3139Forces the SV to string form if it is not already.
8d6d96c1 3140Always sets the SvUTF8 flag to avoid future validity checks even
2bbc8d55
SP
3141if all the bytes are invariant in UTF-8. If C<flags> has C<SV_GMAGIC> bit set,
3142will C<mg_get> on C<sv> if appropriate, else not.
3143Returns the number of bytes in the converted string
3144C<sv_utf8_upgrade> and
8d6d96c1
HS
3145C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
3146
13a6c0e0
JH
3147This is not as a general purpose byte encoding to Unicode interface:
3148use the Encode extension for that.
3149
8d6d96c1 3150=cut
b3ab6785
KW
3151
3152The grow version is currently not externally documented. It adds a parameter,
3153extra, which is the number of unused bytes the string of 'sv' is guaranteed to
3154have free after it upon return. This allows the caller to reserve extra space
3155that it intends to fill, to avoid extra grows.
3156
3157Also externally undocumented for the moment is the flag SV_FORCE_UTF8_UPGRADE,
3158which can be used to tell this function to not first check to see if there are
3159any characters that are different in UTF-8 (variant characters) which would
3160force it to allocate a new string to sv, but to assume there are. Typically
3161this flag is used by a routine that has already parsed the string to find that
3162there are such characters, and passes this information on so that the work
3163doesn't have to be repeated.
3164
3165(One might think that the calling routine could pass in the position of the
3166first such variant, so it wouldn't have to be found again. But that is not the
3167case, because typically when the caller is likely to use this flag, it won't be
3168calling this routine unless it finds something that won't fit into a byte.
3169Otherwise it tries to not upgrade and just use bytes. But some things that
3170do fit into a byte are variants in utf8, and the caller may not have been
3171keeping track of these.)
3172
3173If the routine itself changes the string, it adds a trailing NUL. Such a NUL
3174isn't guaranteed due to having other routines do the work in some input cases,
3175or if the input is already flagged as being in utf8.
3176
3177The speed of this could perhaps be improved for many cases if someone wanted to
3178write a fast function that counts the number of variant characters in a string,
3179especially if it could return the position of the first one.
3180
8d6d96c1
HS
3181*/
3182
3183STRLEN
b3ab6785 3184Perl_sv_utf8_upgrade_flags_grow(pTHX_ register SV *const sv, const I32 flags, STRLEN extra)
8d6d96c1 3185{
97aff369 3186 dVAR;
7918f24d 3187
b3ab6785 3188 PERL_ARGS_ASSERT_SV_UTF8_UPGRADE_FLAGS_GROW;
7918f24d 3189
808c356f
RGS
3190 if (sv == &PL_sv_undef)
3191 return 0;
e0e62c2a
NIS
3192 if (!SvPOK(sv)) {
3193 STRLEN len = 0;
d52b7888
NC
3194 if (SvREADONLY(sv) && (SvPOKp(sv) || SvIOKp(sv) || SvNOKp(sv))) {
3195 (void) sv_2pv_flags(sv,&len, flags);
b3ab6785
KW
3196 if (SvUTF8(sv)) {
3197 if (extra) SvGROW(sv, SvCUR(sv) + extra);
d52b7888 3198 return len;
b3ab6785 3199 }
d52b7888
NC
3200 } else {
3201 (void) SvPV_force(sv,len);
3202 }
e0e62c2a 3203 }
4411f3b6 3204
f5cee72b 3205 if (SvUTF8(sv)) {
b3ab6785 3206 if (extra) SvGROW(sv, SvCUR(sv) + extra);
5fec3b1d 3207 return SvCUR(sv);
f5cee72b 3208 }
5fec3b1d 3209
765f542d
NC
3210 if (SvIsCOW(sv)) {
3211 sv_force_normal_flags(sv, 0);
db42d148
NIS
3212 }
3213
b3ab6785 3214 if (PL_encoding && !(flags & SV_UTF8_NO_ENCODING)) {
799ef3cb 3215 sv_recode_to_utf8(sv, PL_encoding);
b3ab6785
KW
3216 if (extra) SvGROW(sv, SvCUR(sv) + extra);
3217 return SvCUR(sv);
3218 }
3219
4e93345f
KW
3220 if (SvCUR(sv) == 0) {
3221 if (extra) SvGROW(sv, extra);
3222 } else { /* Assume Latin-1/EBCDIC */
c4e7c712 3223 /* This function could be much more efficient if we
2bbc8d55 3224 * had a FLAG in SVs to signal if there are any variant
c4e7c712 3225 * chars in the PV. Given that there isn't such a flag
b3ab6785
KW
3226 * make the loop as fast as possible (although there are certainly ways
3227 * to speed this up, eg. through vectorization) */
3228 U8 * s = (U8 *) SvPVX_const(sv);
3229 U8 * e = (U8 *) SvEND(sv);
3230 U8 *t = s;
3231 STRLEN two_byte_count = 0;
c4e7c712 3232
b3ab6785
KW
3233 if (flags & SV_FORCE_UTF8_UPGRADE) goto must_be_utf8;
3234
3235 /* See if really will need to convert to utf8. We mustn't rely on our
3236 * incoming SV being well formed and having a trailing '\0', as certain
3237 * code in pp_formline can send us partially built SVs. */
3238
c4e7c712 3239 while (t < e) {
53c1dcc0 3240 const U8 ch = *t++;
b3ab6785
KW
3241 if (NATIVE_IS_INVARIANT(ch)) continue;
3242
3243 t--; /* t already incremented; re-point to first variant */
3244 two_byte_count = 1;
3245 goto must_be_utf8;
c4e7c712 3246 }
b3ab6785
KW
3247
3248 /* utf8 conversion not needed because all are invariants. Mark as
3249 * UTF-8 even if no variant - saves scanning loop */
c4e7c712 3250 SvUTF8_on(sv);
b3ab6785
KW
3251 return SvCUR(sv);
3252
3253must_be_utf8:
3254
3255 /* Here, the string should be converted to utf8, either because of an
3256 * input flag (two_byte_count = 0), or because a character that
3257 * requires 2 bytes was found (two_byte_count = 1). t points either to
3258 * the beginning of the string (if we didn't examine anything), or to
3259 * the first variant. In either case, everything from s to t - 1 will
3260 * occupy only 1 byte each on output.
3261 *
3262 * There are two main ways to convert. One is to create a new string
3263 * and go through the input starting from the beginning, appending each
3264 * converted value onto the new string as we go along. It's probably
3265 * best to allocate enough space in the string for the worst possible
3266 * case rather than possibly running out of space and having to
3267 * reallocate and then copy what we've done so far. Since everything
3268 * from s to t - 1 is invariant, the destination can be initialized
3269 * with these using a fast memory copy
3270 *
3271 * The other way is to figure out exactly how big the string should be
3272 * by parsing the entire input. Then you don't have to make it big
3273 * enough to handle the worst possible case, and more importantly, if
3274 * the string you already have is large enough, you don't have to
3275 * allocate a new string, you can copy the last character in the input
3276 * string to the final position(s) that will be occupied by the
3277 * converted string and go backwards, stopping at t, since everything
3278 * before that is invariant.
3279 *
3280 * There are advantages and disadvantages to each method.
3281 *
3282 * In the first method, we can allocate a new string, do the memory
3283 * copy from the s to t - 1, and then proceed through the rest of the
3284 * string byte-by-byte.
3285 *
3286 * In the second method, we proceed through the rest of the input
3287 * string just calculating how big the converted string will be. Then
3288 * there are two cases:
3289 * 1) if the string has enough extra space to handle the converted
3290 * value. We go backwards through the string, converting until we
3291 * get to the position we are at now, and then stop. If this
3292 * position is far enough along in the string, this method is
3293 * faster than the other method. If the memory copy were the same
3294 * speed as the byte-by-byte loop, that position would be about
3295 * half-way, as at the half-way mark, parsing to the end and back
3296 * is one complete string's parse, the same amount as starting
3297 * over and going all the way through. Actually, it would be
3298 * somewhat less than half-way, as it's faster to just count bytes
3299 * than to also copy, and we don't have the overhead of allocating
3300 * a new string, changing the scalar to use it, and freeing the
3301 * existing one. But if the memory copy is fast, the break-even
3302 * point is somewhere after half way. The counting loop could be
3303 * sped up by vectorization, etc, to move the break-even point
3304 * further towards the beginning.
3305 * 2) if the string doesn't have enough space to handle the converted
3306 * value. A new string will have to be allocated, and one might
3307 * as well, given that, start from the beginning doing the first
3308 * method. We've spent extra time parsing the string and in
3309 * exchange all we've gotten is that we know precisely how big to
3310 * make the new one. Perl is more optimized for time than space,
3311 * so this case is a loser.
3312 * So what I've decided to do is not use the 2nd method unless it is
3313 * guaranteed that a new string won't have to be allocated, assuming
3314 * the worst case. I also decided not to put any more conditions on it
3315 * than this, for now. It seems likely that, since the worst case is
3316 * twice as big as the unknown portion of the string (plus 1), we won't
3317 * be guaranteed enough space, causing us to go to the first method,
3318 * unless the string is short, or the first variant character is near
3319 * the end of it. In either of these cases, it seems best to use the
3320 * 2nd method. The only circumstance I can think of where this would
3321 * be really slower is if the string had once had much more data in it
3322 * than it does now, but there is still a substantial amount in it */
3323
3324 {
3325 STRLEN invariant_head = t - s;
3326 STRLEN size = invariant_head + (e - t) * 2 + 1 + extra;
3327 if (SvLEN(sv) < size) {
3328
3329 /* Here, have decided to allocate a new string */
3330
3331 U8 *dst;
3332 U8 *d;
3333
3334 Newx(dst, size, U8);
3335
3336 /* If no known invariants at the beginning of the input string,
3337 * set so starts from there. Otherwise, can use memory copy to
3338 * get up to where we are now, and then start from here */
3339
3340 if (invariant_head <= 0) {
3341 d = dst;
3342 } else {
3343 Copy(s, dst, invariant_head, char);
3344 d = dst + invariant_head;
3345 }
3346
3347 while (t < e) {
3348 const UV uv = NATIVE8_TO_UNI(*t++);
3349 if (UNI_IS_INVARIANT(uv))
3350 *d++ = (U8)UNI_TO_NATIVE(uv);
3351 else {
3352 *d++ = (U8)UTF8_EIGHT_BIT_HI(uv);
3353 *d++ = (U8)UTF8_EIGHT_BIT_LO(uv);
3354 }
3355 }
3356 *d = '\0';
3357 SvPV_free(sv); /* No longer using pre-existing string */
3358 SvPV_set(sv, (char*)dst);
3359 SvCUR_set(sv, d - dst);
3360 SvLEN_set(sv, size);
3361 } else {
3362
3363 /* Here, have decided to get the exact size of the string.
3364 * Currently this happens only when we know that there is
3365 * guaranteed enough space to fit the converted string, so
3366 * don't have to worry about growing. If two_byte_count is 0,
3367 * then t points to the first byte of the string which hasn't
3368 * been examined yet. Otherwise two_byte_count is 1, and t
3369 * points to the first byte in the string that will expand to
3370 * two. Depending on this, start examining at t or 1 after t.
3371 * */
3372
3373 U8 *d = t + two_byte_count;
3374
3375
3376 /* Count up the remaining bytes that expand to two */
3377
3378 while (d < e) {
3379 const U8 chr = *d++;
3380 if (! NATIVE_IS_INVARIANT(chr)) two_byte_count++;
3381 }
3382
3383 /* The string will expand by just the number of bytes that
3384 * occupy two positions. But we are one afterwards because of
3385 * the increment just above. This is the place to put the
3386 * trailing NUL, and to set the length before we decrement */
3387
3388 d += two_byte_count;
3389 SvCUR_set(sv, d - s);
3390 *d-- = '\0';
3391
3392
3393 /* Having decremented d, it points to the position to put the
3394 * very last byte of the expanded string. Go backwards through
3395 * the string, copying and expanding as we go, stopping when we
3396 * get to the part that is invariant the rest of the way down */
3397
3398 e--;
3399 while (e >= t) {
3400 const U8 ch = NATIVE8_TO_UNI(*e--);
3401 if (UNI_IS_INVARIANT(ch)) {
3402 *d-- = UNI_TO_NATIVE(ch);
3403 } else {
3404 *d-- = (U8)UTF8_EIGHT_BIT_LO(ch);
3405 *d-- = (U8)UTF8_EIGHT_BIT_HI(ch);
3406 }
3407 }
3408 }
3409 }
560a288e 3410 }
b3ab6785
KW
3411
3412 /* Mark as UTF-8 even if no variant - saves scanning loop */
3413 SvUTF8_on(sv);
4411f3b6 3414 return SvCUR(sv);
560a288e
GS
3415}
3416
c461cf8f
JH
3417/*
3418=for apidoc sv_utf8_downgrade
3419
78ea37eb 3420Attempts to convert the PV of an SV from characters to bytes.
2bbc8d55
SP
3421If the PV contains a character that cannot fit
3422in a byte, this conversion will fail;
78ea37eb 3423in this case, either returns false or, if C<fail_ok> is not
c461cf8f
JH
3424true, croaks.
3425
13a6c0e0
JH
3426This is not as a general purpose Unicode to byte encoding interface:
3427use the Encode extension for that.
3428
c461cf8f
JH
3429=cut
3430*/
3431
560a288e 3432bool
7bc54cea 3433Perl_sv_utf8_downgrade(pTHX_ register SV *const sv, const bool fail_ok)
560a288e 3434{
97aff369 3435 dVAR;
7918f24d
NC
3436
3437 PERL_ARGS_ASSERT_SV_UTF8_DOWNGRADE;
3438
78ea37eb 3439 if (SvPOKp(sv) && SvUTF8(sv)) {
fa301091 3440 if (SvCUR(sv)) {
03cfe0ae 3441 U8 *s;
652088fc 3442 STRLEN len;
fa301091 3443
765f542d
NC
3444 if (SvIsCOW(sv)) {
3445 sv_force_normal_flags(sv, 0);
3446 }
03cfe0ae
NIS
3447 s = (U8 *) SvPV(sv, len);
3448 if (!utf8_to_bytes(s, &len)) {
fa301091
JH
3449 if (fail_ok)
3450 return FALSE;
3451 else {
3452 if (PL_op)
3453 Perl_croak(aTHX_ "Wide character in %s",
53e06cf0 3454 OP_DESC(PL_op));
fa301091
JH
3455 else
3456 Perl_croak(aTHX_ "Wide character");
3457 }
4b3603a4 3458 }
b162af07 3459 SvCUR_set(sv, len);
67e989fb 3460 }
560a288e 3461 }
ffebcc3e 3462 SvUTF8_off(sv);
560a288e
GS
3463 return TRUE;
3464}
3465
c461cf8f
JH
3466/*
3467=for apidoc sv_utf8_encode
3468
78ea37eb
TS
3469Converts the PV of an SV to UTF-8, but then turns the C<SvUTF8>
3470flag off so that it looks like octets again.
c461cf8f
JH
3471
3472=cut
3473*/
3474
560a288e 3475void
7bc54cea 3476Perl_sv_utf8_encode(pTHX_ register SV *const sv)
560a288e 3477{
7918f24d
NC
3478 PERL_ARGS_ASSERT_SV_UTF8_ENCODE;
3479
4c94c214
NC
3480 if (SvIsCOW(sv)) {
3481 sv_force_normal_flags(sv, 0);
3482 }
3483 if (SvREADONLY(sv)) {
6ad8f254 3484 Perl_croak_no_modify(aTHX);
4c94c214 3485 }
a5f5288a 3486 (void) sv_utf8_upgrade(sv);
560a288e
GS
3487 SvUTF8_off(sv);
3488}
3489
4411f3b6
NIS
3490/*
3491=for apidoc sv_utf8_decode
3492
78ea37eb
TS
3493If the PV of the SV is an octet sequence in UTF-8
3494and contains a multiple-byte character, the C<SvUTF8> flag is turned on
3495so that it looks like a character. If the PV contains only single-byte
3496characters, the C<SvUTF8> flag stays being off.
3497Scans PV for validity and returns false if the PV is invalid UTF-8.
4411f3b6
NIS
3498
3499=cut
3500*/
3501
560a288e 3502bool
7bc54cea 3503Perl_sv_utf8_decode(pTHX_ register SV *const sv)
560a288e 3504{
7918f24d
NC
3505 PERL_ARGS_ASSERT_SV_UTF8_DECODE;
3506
78ea37eb 3507 if (SvPOKp(sv)) {
93524f2b
NC
3508 const U8 *c;
3509 const U8 *e;
9cbac4c7 3510
645c22ef
DM
3511 /* The octets may have got themselves encoded - get them back as
3512 * bytes
3513 */
3514 if (!sv_utf8_downgrade(sv, TRUE))
560a288e
GS
3515 return FALSE;
3516
3517 /* it is actually just a matter of turning the utf8 flag on, but
3518 * we want to make sure everything inside is valid utf8 first.
3519 */
93524f2b 3520 c = (const U8 *) SvPVX_const(sv);
63cd0674 3521 if (!is_utf8_string(c, SvCUR(sv)+1))
67e989fb 3522 return FALSE;
93524f2b 3523 e = (const U8 *) SvEND(sv);
511c2ff0 3524 while (c < e) {
b64e5050 3525 const U8 ch = *c++;
c4d5f83a 3526 if (!UTF8_IS_INVARIANT(ch)) {
67e989fb
JH
3527 SvUTF8_on(sv);
3528 break;
3529 }
560a288e 3530 }
560a288e
GS
3531 }
3532 return TRUE;
3533}
3534
954c1994
GS
3535/*
3536=for apidoc sv_setsv
3537
645c22ef
DM
3538Copies the contents of the source SV C<ssv> into the destination SV
3539C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
3540function if the source SV needs to be reused. Does not handle 'set' magic.
3541Loosely speaking, it performs a copy-by-value, obliterating any previous
3542content of the destination.
3543
3544You probably want to use one of the assortment of wrappers, such as
3545C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3546C<SvSetMagicSV_nosteal>.
3547
8d6d96c1
HS
3548=for apidoc sv_setsv_flags
3549
645c22ef
DM
3550Copies the contents of the source SV C<ssv> into the destination SV
3551C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
3552function if the source SV needs to be reused. Does not handle 'set' magic.
3553Loosely speaking, it performs a copy-by-value, obliterating any previous
3554content of the destination.
3555If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
5fcdf167
NC
3556C<ssv> if appropriate, else not. If the C<flags> parameter has the
3557C<NOSTEAL> bit set then the buffers of temps will not be stolen. <sv_setsv>
3558and C<sv_setsv_nomg> are implemented in terms of this function.
645c22ef
DM
3559
3560You probably want to use one of the assortment of wrappers, such as
3561C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3562C<SvSetMagicSV_nosteal>.
3563
3564This is the primary function for copying scalars, and most other
3565copy-ish functions and macros use this underneath.
8d6d96c1
HS
3566
3567=cut
3568*/
3569
5d0301b7 3570static void
7bc54cea 3571S_glob_assign_glob(pTHX_ SV *const dstr, SV *const sstr, const int dtype)
5d0301b7 3572{
c8bbf675 3573 I32 mro_changes = 0; /* 1 = method, 2 = isa, 3 = recursive isa */
3e6edce2 3574 HV *old_stash = NULL;
dd69841b 3575
7918f24d
NC
3576 PERL_ARGS_ASSERT_GLOB_ASSIGN_GLOB;
3577
bec4f4b4 3578 if (dtype != SVt_PVGV && !isGV_with_GP(dstr)) {
5d0301b7
NC
3579 const char * const name = GvNAME(sstr);
3580 const STRLEN len = GvNAMELEN(sstr);
0d092c36 3581 {
f7877b28
NC
3582 if (dtype >= SVt_PV) {
3583 SvPV_free(dstr);
3584 SvPV_set(dstr, 0);
3585 SvLEN_set(dstr, 0);
3586 SvCUR_set(dstr, 0);
3587 }
0d092c36 3588 SvUPGRADE(dstr, SVt_PVGV);
dedf8e73 3589 (void)SvOK_off(dstr);
2e5b91de
NC
3590 /* FIXME - why are we doing this, then turning it off and on again
3591 below? */
3592 isGV_with_GP_on(dstr);
f7877b28 3593 }
5d0301b7
NC
3594 GvSTASH(dstr) = GvSTASH(sstr);
3595 if (GvSTASH(dstr))
daba3364 3596 Perl_sv_add_backref(aTHX_ MUTABLE_SV(GvSTASH(dstr)), dstr);
159b6efe 3597 gv_name_set(MUTABLE_GV(dstr), name, len, GV_ADD);
5d0301b7
NC
3598 SvFAKE_on(dstr); /* can coerce to non-glob */
3599 }
3600
159b6efe 3601 if(GvGP(MUTABLE_GV(sstr))) {
dd69841b
BB
3602 /* If source has method cache entry, clear it */
3603 if(GvCVGEN(sstr)) {
3604 SvREFCNT_dec(GvCV(sstr));
3605 GvCV(sstr) = NULL;
3606 GvCVGEN(sstr) = 0;
3607 }
3608 /* If source has a real method, then a method is
3609 going to change */
00169e2c
FC
3610 else if(
3611 GvCV((const GV *)sstr) && GvSTASH(dstr) && HvENAME(GvSTASH(dstr))
3612 ) {
70cd14a1 3613 mro_changes = 1;
dd69841b
BB
3614 }
3615 }
3616
3617 /* If dest already had a real method, that's a change as well */
00169e2c
FC
3618 if(
3619 !mro_changes && GvGP(MUTABLE_GV(dstr)) && GvCVu((const GV *)dstr)
3620 && GvSTASH(dstr) && HvENAME(GvSTASH(dstr))
3621 ) {
70cd14a1 3622 mro_changes = 1;
dd69841b
BB
3623 }
3624
c8bbf675
FC
3625 /* We don’t need to check the name of the destination if it was not a
3626 glob to begin with. */
3627 if(dtype == SVt_PVGV) {
3628 const char * const name = GvNAME((const GV *)dstr);
00169e2c
FC
3629 if(
3630 strEQ(name,"ISA")
3631 /* The stash may have been detached from the symbol table, so
3632 check its name. */
3633 && GvSTASH(dstr) && HvENAME(GvSTASH(dstr))
6624142a 3634 && GvAV((const GV *)sstr)
00169e2c 3635 )
c8bbf675
FC
3636 mro_changes = 2;
3637 else {
3638 const STRLEN len = GvNAMELEN(dstr);
3639 if (len > 1 && name[len-2] == ':' && name[len-1] == ':') {
3640 mro_changes = 3;
3641
3642 /* Set aside the old stash, so we can reset isa caches on
3643 its subclasses. */
bf01568a
FC
3644 if((old_stash = GvHV(dstr)))
3645 /* Make sure we do not lose it early. */
3646 SvREFCNT_inc_simple_void_NN(
3647 sv_2mortal((SV *)old_stash)
3648 );
c8bbf675
FC
3649 }
3650 }
3651 }
70cd14a1 3652
159b6efe 3653 gp_free(MUTABLE_GV(dstr));
2e5b91de 3654 isGV_with_GP_off(dstr);
5d0301b7 3655 (void)SvOK_off(dstr);
2e5b91de 3656 isGV_with_GP_on(dstr);
dedf8e73 3657 GvINTRO_off(dstr); /* one-shot flag */
5d0301b7
NC
3658 GvGP(dstr) = gp_ref(GvGP(sstr));
3659 if (SvTAINTED(sstr))
3660 SvTAINT(dstr);
3661 if (GvIMPORTED(dstr) != GVf_IMPORTED
3662 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3663 {
3664 GvIMPORTED_on(dstr);
3665 }
3666 GvMULTI_on(dstr);
6624142a
FC
3667 if(mro_changes == 2) {
3668 MAGIC *mg;
3669 SV * const sref = (SV *)GvAV((const GV *)dstr);
3670 if (SvSMAGICAL(sref) && (mg = mg_find(sref, PERL_MAGIC_isa))) {
3671 if (SvTYPE(mg->mg_obj) != SVt_PVAV) {
3672 AV * const ary = newAV();
3673 av_push(ary, mg->mg_obj); /* takes the refcount */
3674 mg->mg_obj = (SV *)ary;
3675 }
3676 av_push((AV *)mg->mg_obj, SvREFCNT_inc_simple_NN(dstr));
3677 }
3678 else sv_magic(sref, dstr, PERL_MAGIC_isa, NULL, 0);
3679 mro_isa_changed_in(GvSTASH(dstr));
3680 }
c8bbf675 3681 else if(mro_changes == 3) {
d056e33c 3682 HV * const stash = GvHV(dstr);
78b79c77 3683 if(old_stash ? (HV *)HvENAME_get(old_stash) : stash)
d056e33c 3684 mro_package_moved(
35759254 3685 stash, old_stash,
afdbe55d 3686 (GV *)dstr, 0
d056e33c 3687 );
c8bbf675 3688 }
70cd14a1 3689 else if(mro_changes) mro_method_changed_in(GvSTASH(dstr));
5d0301b7
NC
3690 return;
3691}
3692
b8473700 3693static void
7bc54cea 3694S_glob_assign_ref(pTHX_ SV *const dstr, SV *const sstr)
7918f24d 3695{
b8473700
NC
3696 SV * const sref = SvREFCNT_inc(SvRV(sstr));
3697 SV *dref = NULL;
3698 const int intro = GvINTRO(dstr);
2440974c 3699 SV **location;
3386d083 3700 U8 import_flag = 0;
27242d61
NC
3701 const U32 stype = SvTYPE(sref);
3702
7918f24d 3703 PERL_ARGS_ASSERT_GLOB_ASSIGN_REF;
b8473700 3704
b8473700
NC
3705 if (intro) {
3706 GvINTRO_off(dstr); /* one-shot flag */
3707 GvLINE(dstr) = CopLINE(PL_curcop);
159b6efe 3708 GvEGV(dstr) = MUTABLE_GV(dstr);
b8473700
NC
3709 }
3710 GvMULTI_on(dstr);
27242d61 3711 switch (stype) {
b8473700 3712 case SVt_PVCV:
27242d61
NC
3713 location = (SV **) &GvCV(dstr);
3714 import_flag = GVf_IMPORTED_CV;
3715 goto common;
3716 case SVt_PVHV:
3717 location = (SV **) &GvHV(dstr);
3718 import_flag = GVf_IMPORTED_HV;
3719 goto common;
3720 case SVt_PVAV:
3721 location = (SV **) &GvAV(dstr);
3722 import_flag = GVf_IMPORTED_AV;
3723 goto common;
3724 case SVt_PVIO:
3725 location = (SV **) &GvIOp(dstr);
3726 goto common;
3727 case SVt_PVFM:
3728 location = (SV **) &GvFORM(dstr);
ef595a33 3729 goto common;
27242d61
NC
3730 default:
3731 location = &GvSV(dstr);
3732 import_flag = GVf_IMPORTED_SV;
3733 common:
b8473700 3734 if (intro) {
27242d61 3735 if (stype == SVt_PVCV) {
ea726b52 3736 /*if (GvCVGEN(dstr) && (GvCV(dstr) != (const CV *)sref || GvCVGEN(dstr))) {*/
5f2fca8a 3737 if (GvCVGEN(dstr)) {
27242d61
NC
3738 SvREFCNT_dec(GvCV(dstr));
3739 GvCV(dstr) = NULL;
3740 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
27242d61 3741 }
b8473700 3742 }
27242d61 3743 SAVEGENERICSV(*location);
b8473700
NC
3744 }
3745 else
27242d61 3746 dref = *location;
5f2fca8a 3747 if (stype == SVt_PVCV && (*location != sref || GvCVGEN(dstr))) {
ea726b52 3748 CV* const cv = MUTABLE_CV(*location);
b8473700 3749 if (cv) {
159b6efe 3750 if (!GvCVGEN((const GV *)dstr) &&
b8473700
NC
3751 (CvROOT(cv) || CvXSUB(cv)))
3752 {
3753 /* Redefining a sub - warning is mandatory if
3754 it was a const and its value changed. */
ea726b52 3755 if (CvCONST(cv) && CvCONST((const CV *)sref)
126f53f3
NC
3756 && cv_const_sv(cv)
3757 == cv_const_sv((const CV *)sref)) {
6f207bd3 3758 NOOP;
b8473700
NC
3759 /* They are 2 constant subroutines generated from
3760 the same constant. This probably means that
3761 they are really the "same" proxy subroutine
3762 instantiated in 2 places. Most likely this is
3763 when a constant is exported twice. Don't warn.
3764 */
3765 }
3766 else if (ckWARN(WARN_REDEFINE)
3767 || (CvCONST(cv)
ea726b52 3768 && (!CvCONST((const CV *)sref)
b8473700 3769 || sv_cmp(cv_const_sv(cv),
126f53f3
NC
3770 cv_const_sv((const CV *)
3771 sref))))) {
b8473700 3772 Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
10edeb5d
JH
3773 (const char *)
3774 (CvCONST(cv)
3775 ? "Constant subroutine %s::%s redefined"
3776 : "Subroutine %s::%s redefined"),
159b6efe
NC
3777 HvNAME_get(GvSTASH((const GV *)dstr)),
3778 GvENAME(MUTABLE_GV(dstr)));
b8473700
NC
3779 }
3780 }
3781 if (!intro)
159b6efe 3782 cv_ckproto_len(cv, (const GV *)dstr,
cbf82dd0
NC
3783 SvPOK(sref) ? SvPVX_const(sref) : NULL,
3784 SvPOK(sref) ? SvCUR(sref) : 0);
b8473700 3785 }
b8473700
NC
3786 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3787 GvASSUMECV_on(dstr);
dd69841b 3788 if(GvSTASH(dstr)) mro_method_changed_in(GvSTASH(dstr)); /* sub foo { 1 } sub bar { 2 } *bar = \&foo */
b8473700 3789 }
2440974c 3790 *location = sref;
3386d083
NC
3791 if (import_flag && !(GvFLAGS(dstr) & import_flag)
3792 && CopSTASH_ne(PL_curcop, GvSTASH(dstr))) {
3793 GvFLAGS(dstr) |= import_flag;
b8473700 3794 }
3e79609f
FC
3795 if (stype == SVt_PVHV) {
3796 const char * const name = GvNAME((GV*)dstr);
3797 const STRLEN len = GvNAMELEN(dstr);
d056e33c
FC
3798 if (
3799 len > 1 && name[len-2] == ':' && name[len-1] == ':'
78b79c77 3800 && (!dref || HvENAME_get(dref))
d056e33c
FC
3801 ) {
3802 mro_package_moved(
35759254 3803 (HV *)sref, (HV *)dref,
afdbe55d 3804 (GV *)dstr, 0
d056e33c 3805 );
3e79609f
FC
3806 }
3807 }
00169e2c 3808 else if (
a00c27eb
FC
3809 stype == SVt_PVAV && sref != dref
3810 && strEQ(GvNAME((GV*)dstr), "ISA")
00169e2c
FC
3811 /* The stash may have been detached from the symbol table, so
3812 check its name before doing anything. */
3813 && GvSTASH(dstr) && HvENAME(GvSTASH(dstr))
3814 ) {
6624142a 3815 MAGIC *mg;
a5dba54a
FC
3816 MAGIC * const omg = dref && SvSMAGICAL(dref)
3817 ? mg_find(dref, PERL_MAGIC_isa)
3818 : NULL;
6624142a
FC
3819 if (SvSMAGICAL(sref) && (mg = mg_find(sref, PERL_MAGIC_isa))) {
3820 if (SvTYPE(mg->mg_obj) != SVt_PVAV) {
3821 AV * const ary = newAV();
3822 av_push(ary, mg->mg_obj); /* takes the refcount */
3823 mg->mg_obj = (SV *)ary;
3824 }
a5dba54a
FC
3825 if (omg) {
3826 if (SvTYPE(omg->mg_obj) == SVt_PVAV) {
3827 SV **svp = AvARRAY((AV *)omg->mg_obj);
3828 I32 items = AvFILLp((AV *)omg->mg_obj) + 1;
3829 while (items--)
3830 av_push(
3831 (AV *)mg->mg_obj,
3832 SvREFCNT_inc_simple_NN(*svp++)
3833 );
3834 }
3835 else
3836 av_push(
3837 (AV *)mg->mg_obj,
3838 SvREFCNT_inc_simple_NN(omg->mg_obj)
3839 );
3840 }
3841 else
3842 av_push((AV *)mg->mg_obj,SvREFCNT_inc_simple_NN(dstr));
6624142a 3843 }
a5dba54a 3844 else
3e1892cc 3845 {
a5dba54a
FC
3846 sv_magic(
3847 sref, omg ? omg->mg_obj : dstr, PERL_MAGIC_isa, NULL, 0
3848 );
3e1892cc
FC
3849 mg = mg_find(sref, PERL_MAGIC_isa);
3850 }
a5dba54a
FC
3851 /* Since the *ISA assignment could have affected more than
3852 one stash, don’t call mro_isa_changed_in directly, but let
3e1892cc 3853 magic_clearisa do it for us, as it already has the logic for
a5dba54a 3854 dealing with globs vs arrays of globs. */
3e1892cc
FC
3855 assert(mg);
3856 Perl_magic_clearisa(aTHX_ NULL, mg);
d851b122 3857 }
b8473700
NC
3858 break;
3859 }
b37c2d43 3860 SvREFCNT_dec(dref);
b8473700
NC
3861 if (SvTAINTED(sstr))
3862 SvTAINT(dstr);
3863 return;
3864}
3865
8d6d96c1 3866void
7bc54cea 3867Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV* sstr, const I32 flags)
8d6d96c1 3868{
97aff369 3869 dVAR;
8990e307
LW
3870 register U32 sflags;
3871 register int dtype;
42d0e0b7 3872 register svtype stype;
463ee0b2 3873
7918f24d
NC
3874 PERL_ARGS_ASSERT_SV_SETSV_FLAGS;
3875
79072805
LW
3876 if (sstr == dstr)
3877 return;
29f4f0ab
NC
3878
3879 if (SvIS_FREED(dstr)) {
3880 Perl_croak(aTHX_ "panic: attempt to copy value %" SVf
be2597df 3881 " to a freed scalar %p", SVfARG(sstr), (void *)dstr);
29f4f0ab 3882 }
765f542d 3883 SV_CHECK_THINKFIRST_COW_DROP(dstr);
79072805 3884 if (!sstr)
3280af22 3885 sstr = &PL_sv_undef;
29f4f0ab 3886 if (SvIS_FREED(sstr)) {
6c9570dc
MHM
3887 Perl_croak(aTHX_ "panic: attempt to copy freed scalar %p to %p",
3888 (void*)sstr, (void*)dstr);
29f4f0ab 3889 }
8990e307
LW
3890 stype = SvTYPE(sstr);
3891 dtype = SvTYPE(dstr);
79072805 3892
52944de8 3893 (void)SvAMAGIC_off(dstr);
7a5fa8a2 3894 if ( SvVOK(dstr) )
ece467f9
JP
3895 {
3896 /* need to nuke the magic */
3897 mg_free(dstr);
ece467f9 3898 }
9e7bc3e8 3899
463ee0b2 3900 /* There's a lot of redundancy below but we're going for speed here */
79072805 3901
8990e307 3902 switch (stype) {
79072805 3903 case SVt_NULL:
aece5585 3904 undef_sstr:
13be902c 3905 if (dtype != SVt_PVGV && dtype != SVt_PVLV) {
20408e3c
GS
3906 (void)SvOK_off(dstr);
3907 return;
3908 }
3909 break;
463ee0b2 3910 case SVt_IV:
aece5585
GA
3911 if (SvIOK(sstr)) {
3912 switch (dtype) {
3913 case SVt_NULL:
8990e307 3914 sv_upgrade(dstr, SVt_IV);
aece5585
GA
3915 break;
3916 case SVt_NV:
aece5585 3917 case SVt_PV:
a0d0e21e 3918 sv_upgrade(dstr, SVt_PVIV);
aece5585 3919 break;
010be86b 3920 case SVt_PVGV:
13be902c 3921 case SVt_PVLV:
010be86b 3922 goto end_of_first_switch;
aece5585
GA
3923 }
3924 (void)SvIOK_only(dstr);
45977657 3925 SvIV_set(dstr, SvIVX(sstr));
25da4f38
IZ
3926 if (SvIsUV(sstr))
3927 SvIsUV_on(dstr);
37c25af0
NC
3928 /* SvTAINTED can only be true if the SV has taint magic, which in
3929 turn means that the SV type is PVMG (or greater). This is the
3930 case statement for SVt_IV, so this cannot be true (whatever gcov
3931 may say). */
3932 assert(!SvTAINTED(sstr));
aece5585 3933 return;
8990e307 3934 }
4df7f6af
NC
3935 if (!SvROK(sstr))
3936 goto undef_sstr;
3937 if (dtype < SVt_PV && dtype != SVt_IV)
3938 sv_upgrade(dstr, SVt_IV);
3939 break;
aece5585 3940
463ee0b2 3941 case SVt_NV:
aece5585
GA
3942 if (SvNOK(sstr)) {
3943 switch (dtype) {
3944 case SVt_NULL:
3945 case SVt_IV:
8990e307 3946 sv_upgrade(dstr, SVt_NV);
aece5585 3947 break;
aece5585
GA
3948 case SVt_PV:
3949 case SVt_PVIV:
a0d0e21e 3950 sv_upgrade(dstr, SVt_PVNV);
aece5585 3951 break;
010be86b 3952 case SVt_PVGV:
13be902c 3953 case SVt_PVLV:
010be86b 3954 goto end_of_first_switch;
aece5585 3955 }
9d6ce603 3956 SvNV_set(dstr, SvNVX(sstr));
aece5585 3957 (void)SvNOK_only(dstr);
37c25af0
NC
3958 /* SvTAINTED can only be true if the SV has taint magic, which in
3959 turn means that the SV type is PVMG (or greater). This is the
3960 case statement for SVt_NV, so this cannot be true (whatever gcov
3961 may say). */
3962 assert(!SvTAINTED(sstr));
aece5585 3963 return;
8990e307 3964 }
aece5585
GA
3965 goto undef_sstr;
3966
fc36a67e 3967 case SVt_PVFM:
f8c7b90f 3968#ifdef PERL_OLD_COPY_ON_WRITE
d89fc664
NC
3969 if ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS) {
3970 if (dtype < SVt_PVIV)
3971 sv_upgrade(dstr, SVt_PVIV);
3972 break;
3973 }
3974 /* Fall through */
3975#endif
3976 case SVt_PV:
8990e307 3977 if (dtype < SVt_PV)
463ee0b2 3978 sv_upgrade(dstr, SVt_PV);
463ee0b2
LW
3979 break;
3980 case SVt_PVIV:
8990e307 3981 if (dtype < SVt_PVIV)
463ee0b2 3982 sv_upgrade(dstr, SVt_PVIV);
463ee0b2
LW
3983 break;
3984 case SVt_PVNV:
8990e307 3985 if (dtype < SVt_PVNV)
463ee0b2 3986 sv_upgrade(dstr, SVt_PVNV);
463ee0b2 3987 break;
489f7bfe 3988 default:
a3b680e6
AL
3989 {
3990 const char * const type = sv_reftype(sstr,0);
533c011a 3991 if (PL_op)
94bbb3f4 3992 Perl_croak(aTHX_ "Bizarre copy of %s in %s", type, OP_DESC(PL_op));
4633a7c4 3993 else
a3b680e6
AL
3994 Perl_croak(aTHX_ "Bizarre copy of %s", type);
3995 }
4633a7c4
LW
3996 break;
3997
f0826785
BM
3998 case SVt_REGEXP:
3999 if (dtype < SVt_REGEXP)
4000 sv_upgrade(dstr, SVt_REGEXP);
4001 break;
4002
cecf5685 4003 /* case SVt_BIND: */
39cb70dc 4004 case SVt_PVLV:
79072805 4005 case SVt_PVGV:
cecf5685 4006 /* SvVALID means that this PVGV is playing at being an FBM. */
79072805 4007
489f7bfe 4008 case SVt_PVMG:
8d6d96c1 4009 if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
973f89ab 4010 mg_get(sstr);
13be902c 4011 if (SvTYPE(sstr) != stype)
973f89ab 4012 stype = SvTYPE(sstr);
5cf4b255
FC
4013 }
4014 if (isGV_with_GP(sstr) && dtype <= SVt_PVLV) {
d4c19fe8 4015 glob_assign_glob(dstr, sstr, dtype);
b8c701c1 4016 return;
973f89ab 4017 }
ded42b9f 4018 if (stype == SVt_PVLV)
862a34c6 4019 SvUPGRADE(dstr, SVt_PVNV);
ded42b9f 4020 else
42d0e0b7 4021 SvUPGRADE(dstr, (svtype)stype);
79072805 4022 }
010be86b 4023 end_of_first_switch:
79072805 4024
ff920335
NC
4025 /* dstr may have been upgraded. */
4026 dtype = SvTYPE(dstr);
8990e307
LW
4027 sflags = SvFLAGS(sstr);
4028
ba2fdce6 4029 if (dtype == SVt_PVCV || dtype == SVt_PVFM) {
85324b4d
NC
4030 /* Assigning to a subroutine sets the prototype. */
4031 if (SvOK(sstr)) {
4032 STRLEN len;
4033 const char *const ptr = SvPV_const(sstr, len);
4034
4035 SvGROW(dstr, len + 1);
4036 Copy(ptr, SvPVX(dstr), len + 1, char);
4037 SvCUR_set(dstr, len);
fcddd32e 4038 SvPOK_only(dstr);
ba2fdce6 4039 SvFLAGS(dstr) |= sflags & SVf_UTF8;
85324b4d
NC
4040 } else {
4041 SvOK_off(dstr);
4042 }
ba2fdce6
NC
4043 } else if (dtype == SVt_PVAV || dtype == SVt_PVHV) {
4044 const char * const type = sv_reftype(dstr,0);
4045 if (PL_op)
94bbb3f4 4046 Perl_croak(aTHX_ "Cannot copy to %s in %s", type, OP_DESC(PL_op));
ba2fdce6
NC
4047 else
4048 Perl_croak(aTHX_ "Cannot copy to %s", type);
85324b4d 4049 } else if (sflags & SVf_ROK) {
13be902c 4050 if (isGV_with_GP(dstr)
785bee4f 4051 && SvTYPE(SvRV(sstr)) == SVt_PVGV && isGV_with_GP(SvRV(sstr))) {
acaa9288
NC
4052 sstr = SvRV(sstr);
4053 if (sstr == dstr) {
4054 if (GvIMPORTED(dstr) != GVf_IMPORTED
4055 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
4056 {
4057 GvIMPORTED_on(dstr);
4058 }
4059 GvMULTI_on(dstr);
4060 return;
4061 }
785bee4f
NC
4062 glob_assign_glob(dstr, sstr, dtype);
4063 return;
acaa9288
NC
4064 }
4065
8990e307 4066 if (dtype >= SVt_PV) {
13be902c 4067 if (isGV_with_GP(dstr)) {
d4c19fe8 4068 glob_assign_ref(dstr, sstr);
b8c701c1
NC
4069 return;
4070 }
3f7c398e 4071 if (SvPVX_const(dstr)) {
8bd4d4c5 4072 SvPV_free(dstr);
b162af07
SP
4073 SvLEN_set(dstr, 0);
4074 SvCUR_set(dstr, 0);
a0d0e21e 4075 }
8990e307 4076 }
a0d0e21e 4077 (void)SvOK_off(dstr);
b162af07 4078 SvRV_set(dstr, SvREFCNT_inc(SvRV(sstr)));
96d4b0ee 4079 SvFLAGS(dstr) |= sflags & SVf_ROK;
dfd48732
NC
4080 assert(!(sflags & SVp_NOK));
4081 assert(!(sflags & SVp_IOK));
4082 assert(!(sflags & SVf_NOK));
4083 assert(!(sflags & SVf_IOK));
ed6116ce 4084 }
13be902c 4085 else if (isGV_with_GP(dstr)) {
c0c44674 4086 if (!(sflags & SVf_OK)) {
a2a5de95
NC
4087 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
4088 "Undefined value assigned to typeglob");
c0c44674
NC
4089 }
4090 else {
4091 GV *gv = gv_fetchsv(sstr, GV_ADD, SVt_PVGV);
daba3364 4092 if (dstr != (const SV *)gv) {
3e79609f
FC
4093 const char * const name = GvNAME((const GV *)dstr);
4094 const STRLEN len = GvNAMELEN(dstr);
4095 HV *old_stash = NULL;
4096 bool reset_isa = FALSE;
4097 if (len > 1 && name[len-2] == ':' && name[len-1] == ':') {
4098 /* Set aside the old stash, so we can reset isa caches
4099 on its subclasses. */
c8eb3813 4100 if((old_stash = GvHV(dstr))) {
31f1461f
FC
4101 /* Make sure we do not lose it early. */
4102 SvREFCNT_inc_simple_void_NN(
4103 sv_2mortal((SV *)old_stash)
4104 );
c8eb3813 4105 }
3e79609f
FC
4106 reset_isa = TRUE;
4107 }
4108
c0c44674 4109 if (GvGP(dstr))
159b6efe 4110 gp_free(MUTABLE_GV(dstr));
c0c44674 4111 GvGP(dstr) = gp_ref(GvGP(gv));
3e79609f
FC
4112
4113 if (reset_isa) {
d056e33c
FC
4114 HV * const stash = GvHV(dstr);
4115 if(
78b79c77 4116 old_stash ? (HV *)HvENAME_get(old_stash) : stash
d056e33c
FC
4117 )
4118 mro_package_moved(
35759254 4119 stash, old_stash,
afdbe55d 4120 (GV *)dstr, 0
d056e33c 4121 );
3e79609f 4122 }
c0c44674
NC
4123 }
4124 }
4125 }
f0826785
BM
4126 else if (dtype == SVt_REGEXP && stype == SVt_REGEXP) {
4127 reg_temp_copy((REGEXP*)dstr, (REGEXP*)sstr);
4128 }
8990e307 4129 else if (sflags & SVp_POK) {
765f542d 4130 bool isSwipe = 0;
79072805
LW
4131
4132 /*
4133 * Check to see if we can just swipe the string. If so, it's a
4134 * possible small lose on short strings, but a big win on long ones.
3f7c398e
SP
4135 * It might even be a win on short strings if SvPVX_const(dstr)
4136 * has to be allocated and SvPVX_const(sstr) has to be freed.
34482cd6
NC
4137 * Likewise if we can set up COW rather than doing an actual copy, we
4138 * drop to the else clause, as the swipe code and the COW setup code
4139 * have much in common.
79072805
LW
4140 */
4141
120fac95
NC
4142 /* Whichever path we take through the next code, we want this true,
4143 and doing it now facilitates the COW check. */
4144 (void)SvPOK_only(dstr);
4145
765f542d 4146 if (
34482cd6
NC
4147 /* If we're already COW then this clause is not true, and if COW
4148 is allowed then we drop down to the else and make dest COW
4149 with us. If caller hasn't said that we're allowed to COW
4150 shared hash keys then we don't do the COW setup, even if the
4151 source scalar is a shared hash key scalar. */
4152 (((flags & SV_COW_SHARED_HASH_KEYS)
4153 ? (sflags & (SVf_FAKE|SVf_READONLY)) != (SVf_FAKE|SVf_READONLY)
4154 : 1 /* If making a COW copy is forbidden then the behaviour we
4155 desire is as if the source SV isn't actually already
4156 COW, even if it is. So we act as if the source flags
4157 are not COW, rather than actually testing them. */
4158 )
f8c7b90f 4159#ifndef PERL_OLD_COPY_ON_WRITE
34482cd6
NC
4160 /* The change that added SV_COW_SHARED_HASH_KEYS makes the logic
4161 when PERL_OLD_COPY_ON_WRITE is defined a little wrong.
4162 Conceptually PERL_OLD_COPY_ON_WRITE being defined should
4163 override SV_COW_SHARED_HASH_KEYS, because it means "always COW"
4164 but in turn, it's somewhat dead code, never expected to go
4165 live, but more kept as a placeholder on how to do it better
4166 in a newer implementation. */
4167 /* If we are COW and dstr is a suitable target then we drop down
4168 into the else and make dest a COW of us. */
b8f9541a
NC
4169 || (SvFLAGS(dstr) & CAN_COW_MASK) != CAN_COW_FLAGS
4170#endif
4171 )
765f542d 4172 &&
765f542d
NC
4173 !(isSwipe =
4174 (sflags & SVs_TEMP) && /* slated for free anyway? */
4175 !(sflags & SVf_OOK) && /* and not involved in OOK hack? */
5fcdf167
NC
4176 (!(flags & SV_NOSTEAL)) &&
4177 /* and we're allowed to steal temps */
765f542d 4178 SvREFCNT(sstr) == 1 && /* and no other references to it? */
61e5f455 4179 SvLEN(sstr)) /* and really is a string */
f8c7b90f 4180#ifdef PERL_OLD_COPY_ON_WRITE
cb23d5b1
NC
4181 && ((flags & SV_COW_SHARED_HASH_KEYS)
4182 ? (!((sflags & CAN_COW_MASK) == CAN_COW_FLAGS
4183 && (SvFLAGS(dstr) & CAN_COW_MASK) == CAN_COW_FLAGS
4b1c7d9e 4184 && SvTYPE(sstr) >= SVt_PVIV && SvTYPE(sstr) != SVt_PVFM))
cb23d5b1 4185 : 1)
765f542d
NC
4186#endif
4187 ) {
4188 /* Failed the swipe test, and it's not a shared hash key either.
4189 Have to copy the string. */
4190 STRLEN len = SvCUR(sstr);
4191 SvGROW(dstr, len + 1); /* inlined from sv_setpvn */
3f7c398e 4192 Move(SvPVX_const(sstr),SvPVX(dstr),len,char);
765f542d
NC
4193 SvCUR_set(dstr, len);
4194 *SvEND(dstr) = '\0';
765f542d 4195 } else {
f8c7b90f 4196 /* If PERL_OLD_COPY_ON_WRITE is not defined, then isSwipe will always
765f542d 4197 be true in here. */
765f542d
NC
4198 /* Either it's a shared hash key, or it's suitable for
4199 copy-on-write or we can swipe the string. */
46187eeb 4200 if (DEBUG_C_TEST) {
ed252734 4201 PerlIO_printf(Perl_debug_log, "Copy on write: sstr --> dstr\n");
e419cbc5
NC
4202 sv_dump(sstr);
4203 sv_dump(dstr);
46187eeb 4204 }
f8c7b90f 4205#ifdef PERL_OLD_COPY_ON_WRITE
765f542d 4206 if (!isSwipe) {
765f542d
NC
4207 if ((sflags & (SVf_FAKE | SVf_READONLY))
4208 != (SVf_FAKE | SVf_READONLY)) {
4209 SvREADONLY_on(sstr);
4210 SvFAKE_on(sstr);
4211 /* Make the source SV into a loop of 1.
4212 (about to become 2) */
a29f6d03 4213 SV_COW_NEXT_SV_SET(sstr, sstr);
765f542d
NC
4214 }
4215 }
4216#endif
4217 /* Initial code is common. */
94010e71
NC
4218 if (SvPVX_const(dstr)) { /* we know that dtype >= SVt_PV */
4219 SvPV_free(dstr);
79072805 4220 }
765f542d 4221
765f542d
NC
4222 if (!isSwipe) {
4223 /* making another shared SV. */
4224 STRLEN cur = SvCUR(sstr);
4225 STRLEN len = SvLEN(sstr);
f8c7b90f 4226#ifdef PERL_OLD_COPY_ON_WRITE
765f542d 4227 if (len) {
b8f9541a 4228 assert (SvTYPE(dstr) >= SVt_PVIV);
765f542d
NC
4229 /* SvIsCOW_normal */
4230 /* splice us in between source and next-after-source. */
a29f6d03
NC
4231 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4232 SV_COW_NEXT_SV_SET(sstr, dstr);
940132f3 4233 SvPV_set(dstr, SvPVX_mutable(sstr));
a604c751
NC
4234 } else
4235#endif
4236 {
765f542d 4237 /* SvIsCOW_shared_hash */
46187eeb
NC
4238 DEBUG_C(PerlIO_printf(Perl_debug_log,
4239 "Copy on write: Sharing hash\n"));
b8f9541a 4240
bdd68bc3 4241 assert (SvTYPE(dstr) >= SVt_PV);
765f542d 4242 SvPV_set(dstr,
d1db91c6 4243 HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)))));
bdd68bc3 4244 }
87a1ef3d
SP
4245 SvLEN_set(dstr, len);
4246 SvCUR_set(dstr, cur);
765f542d
NC
4247 SvREADONLY_on(dstr);
4248 SvFAKE_on(dstr);
765f542d
NC
4249 }
4250 else
765f542d 4251 { /* Passes the swipe test. */
78d1e721 4252 SvPV_set(dstr, SvPVX_mutable(sstr));
765f542d
NC
4253 SvLEN_set(dstr, SvLEN(sstr));
4254 SvCUR_set(dstr, SvCUR(sstr));
4255
4256 SvTEMP_off(dstr);
4257 (void)SvOK_off(sstr); /* NOTE: nukes most SvFLAGS on sstr */
6136c704 4258 SvPV_set(sstr, NULL);
765f542d
NC
4259 SvLEN_set(sstr, 0);
4260 SvCUR_set(sstr, 0);
4261 SvTEMP_off(sstr);
4262 }
4263 }
8990e307 4264 if (sflags & SVp_NOK) {
9d6ce603 4265 SvNV_set(dstr, SvNVX(sstr));
79072805 4266 }
8990e307 4267 if (sflags & SVp_IOK) {
23525414
NC
4268 SvIV_set(dstr, SvIVX(sstr));
4269 /* Must do this otherwise some other overloaded use of 0x80000000
4270 gets confused. I guess SVpbm_VALID */
2b1c7e3e 4271 if (sflags & SVf_IVisUV)
25da4f38 4272 SvIsUV_on(dstr);
79072805 4273 }
96d4b0ee 4274 SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_NOK|SVp_NOK|SVf_UTF8);
4f2da183 4275 {
b0a11fe1 4276 const MAGIC * const smg = SvVSTRING_mg(sstr);
4f2da183
NC
4277 if (smg) {
4278 sv_magic(dstr, NULL, PERL_MAGIC_vstring,
4279 smg->mg_ptr, smg->mg_len);
4280 SvRMAGICAL_on(dstr);
4281 }
7a5fa8a2 4282 }
79072805 4283 }
5d581361 4284 else if (sflags & (SVp_IOK|SVp_NOK)) {
c2468cc7 4285 (void)SvOK_off(dstr);
96d4b0ee 4286 SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_IVisUV|SVf_NOK|SVp_NOK);
5d581361
NC
4287 if (sflags & SVp_IOK) {
4288 /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
4289 SvIV_set(dstr, SvIVX(sstr));
4290 }
3332b3c1 4291 if (sflags & SVp_NOK) {
9d6ce603 4292 SvNV_set(dstr, SvNVX(sstr));
3332b3c1
JH
4293 }
4294 }
79072805 4295 else {
f7877b28 4296 if (isGV_with_GP(sstr)) {
180488f8
NC
4297 /* This stringification rule for globs is spread in 3 places.
4298 This feels bad. FIXME. */
4299 const U32 wasfake = sflags & SVf_FAKE;
4300
4301 /* FAKE globs can get coerced, so need to turn this off
4302 temporarily if it is on. */
4303 SvFAKE_off(sstr);
159b6efe 4304 gv_efullname3(dstr, MUTABLE_GV(sstr), "*");
180488f8
NC
4305 SvFLAGS(sstr) |= wasfake;
4306 }
20408e3c
GS
4307 else
4308 (void)SvOK_off(dstr);
a0d0e21e 4309 }
27c9684d
AP
4310 if (SvTAINTED(sstr))
4311 SvTAINT(dstr);
79072805
LW
4312}
4313
954c1994
GS
4314/*
4315=for apidoc sv_setsv_mg
4316
4317Like C<sv_setsv>, but also handles 'set' magic.
4318
4319=cut
4320*/
4321
79072805 4322void
7bc54cea 4323Perl_sv_setsv_mg(pTHX_ SV *const dstr, register SV *const sstr)
ef50df4b 4324{
7918f24d
NC
4325 PERL_ARGS_ASSERT_SV_SETSV_MG;
4326
ef50df4b
GS
4327 sv_setsv(dstr,sstr);
4328 SvSETMAGIC(dstr);
4329}
4330
f8c7b90f 4331#ifdef PERL_OLD_COPY_ON_WRITE
ed252734
NC
4332SV *
4333Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
4334{
4335 STRLEN cur = SvCUR(sstr);
4336 STRLEN len = SvLEN(sstr);
4337 register char *new_pv;
4338
7918f24d
NC
4339 PERL_ARGS_ASSERT_SV_SETSV_COW;
4340
ed252734
NC
4341 if (DEBUG_C_TEST) {
4342 PerlIO_printf(Perl_debug_log, "Fast copy on write: %p -> %p\n",
6c9570dc 4343 (void*)sstr, (void*)dstr);
ed252734
NC
4344 sv_dump(sstr);
4345 if (dstr)
4346 sv_dump(dstr);
4347 }
4348
4349 if (dstr) {
4350 if (SvTHINKFIRST(dstr))
4351 sv_force_normal_flags(dstr, SV_COW_DROP_PV);
3f7c398e
SP
4352 else if (SvPVX_const(dstr))
4353 Safefree(SvPVX_const(dstr));
ed252734
NC
4354 }
4355 else
4356 new_SV(dstr);
862a34c6 4357 SvUPGRADE(dstr, SVt_PVIV);
ed252734
NC
4358
4359 assert (SvPOK(sstr));
4360 assert (SvPOKp(sstr));
4361 assert (!SvIOK(sstr));
4362 assert (!SvIOKp(sstr));
4363 assert (!SvNOK(sstr));
4364 assert (!SvNOKp(sstr));
4365
4366 if (SvIsCOW(sstr)) {
4367
4368 if (SvLEN(sstr) == 0) {
4369 /* source is a COW shared hash key. */
ed252734
NC
4370 DEBUG_C(PerlIO_printf(Perl_debug_log,
4371 "Fast copy on write: Sharing hash\n"));
d1db91c6 4372 new_pv = HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr))));
ed252734
NC
4373 goto common_exit;
4374 }
4375 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
4376 } else {
4377 assert ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS);
862a34c6 4378 SvUPGRADE(sstr, SVt_PVIV);
ed252734
NC
4379 SvREADONLY_on(sstr);
4380 SvFAKE_on(sstr);
4381 DEBUG_C(PerlIO_printf(Perl_debug_log,
4382 "Fast copy on write: Converting sstr to COW\n"));
4383 SV_COW_NEXT_SV_SET(dstr, sstr);
4384 }
4385 SV_COW_NEXT_SV_SET(sstr, dstr);
940132f3 4386 new_pv = SvPVX_mutable(sstr);
ed252734
NC
4387
4388 common_exit:
4389 SvPV_set(dstr, new_pv);
4390 SvFLAGS(dstr) = (SVt_PVIV|SVf_POK|SVp_POK|SVf_FAKE|SVf_READONLY);
4391 if (SvUTF8(sstr))
4392 SvUTF8_on(dstr);
87a1ef3d
SP
4393 SvLEN_set(dstr, len);
4394 SvCUR_set(dstr, cur);
ed252734
NC
4395 if (DEBUG_C_TEST) {
4396 sv_dump(dstr);
4397 }
4398 return dstr;
4399}
4400#endif
4401
954c1994
GS
4402/*
4403=for apidoc sv_setpvn
4404
4405Copies a string into an SV. The C<len> parameter indicates the number of
9e09f5f2
MHM
4406bytes to be copied. If the C<ptr> argument is NULL the SV will become
4407undefined. Does not handle 'set' magic. See C<sv_setpvn_mg>.
954c1994
GS
4408
4409=cut
4410*/
4411
ef50df4b 4412void
2e000ff2 4413Perl_sv_setpvn(pTHX_ register SV *const sv, register const char *const ptr, register const STRLEN len)
79072805 4414{
97aff369 4415 dVAR;
c6f8c383 4416 register char *dptr;
22c522df 4417
7918f24d
NC
4418 PERL_ARGS_ASSERT_SV_SETPVN;
4419
765f542d 4420 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 4421 if (!ptr) {
a0d0e21e 4422 (void)SvOK_off(sv);
463ee0b2
LW
4423 return;
4424 }
22c522df
JH
4425 else {
4426 /* len is STRLEN which is unsigned, need to copy to signed */
a3b680e6 4427 const IV iv = len;
9c5ffd7c
JH
4428 if (iv < 0)
4429 Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen");
22c522df 4430 }
862a34c6 4431 SvUPGRADE(sv, SVt_PV);
c6f8c383 4432
5902b6a9 4433 dptr = SvGROW(sv, len + 1);
c6f8c383
GA
4434 Move(ptr,dptr,len,char);
4435 dptr[len] = '\0';
79072805 4436 SvCUR_set(sv, len);
1aa99e6b 4437 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4438 SvTAINT(sv);
79072805
LW
4439}
4440
954c1994
GS
4441/*
4442=for apidoc sv_setpvn_mg
4443
4444Like C<sv_setpvn>, but also handles 'set' magic.
4445
4446=cut
4447*/
4448
79072805 4449void
2e000ff2 4450Perl_sv_setpvn_mg(pTHX_ register SV *const sv, register const char *const ptr, register const STRLEN len)
ef50df4b 4451{
7918f24d
NC
4452 PERL_ARGS_ASSERT_SV_SETPVN_MG;
4453
ef50df4b
GS
4454 sv_setpvn(sv,ptr,len);
4455 SvSETMAGIC(sv);
4456}
4457
954c1994
GS
4458/*
4459=for apidoc sv_setpv
4460
4461Copies a string into an SV. The string must be null-terminated. Does not
4462handle 'set' magic. See C<sv_setpv_mg>.
4463
4464=cut
4465*/
4466
ef50df4b 4467void
2e000ff2 4468Perl_sv_setpv(pTHX_ register SV *const sv, register const char *const ptr)
79072805 4469{
97aff369 4470 dVAR;
79072805
LW
4471 register STRLEN len;
4472
7918f24d
NC
4473 PERL_ARGS_ASSERT_SV_SETPV;
4474
765f542d 4475 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 4476 if (!ptr) {
a0d0e21e 4477 (void)SvOK_off(sv);
463ee0b2
LW
4478 return;
4479 }
79072805 4480 len = strlen(ptr);
862a34c6 4481 SvUPGRADE(sv, SVt_PV);
c6f8c383 4482
79072805 4483 SvGROW(sv, len + 1);
463ee0b2 4484 Move(ptr,SvPVX(sv),len+1,char);
79072805 4485 SvCUR_set(sv, len);
1aa99e6b 4486 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2
LW
4487 SvTAINT(sv);
4488}
4489
954c1994
GS
4490/*
4491=for apidoc sv_setpv_mg
4492
4493Like C<sv_setpv>, but also handles 'set' magic.
4494
4495=cut
4496*/
4497
463ee0b2 4498void
2e000ff2 4499Perl_sv_setpv_mg(pTHX_ register SV *const sv, register const char *const ptr)
ef50df4b 4500{
7918f24d
NC
4501 PERL_ARGS_ASSERT_SV_SETPV_MG;
4502
ef50df4b
GS
4503 sv_setpv(sv,ptr);
4504 SvSETMAGIC(sv);
4505}
4506
954c1994 4507/*
47518d95 4508=for apidoc sv_usepvn_flags
954c1994 4509
794a0d33
JH
4510Tells an SV to use C<ptr> to find its string value. Normally the
4511string is stored inside the SV but sv_usepvn allows the SV to use an
4512outside string. The C<ptr> should point to memory that was allocated
c1c21316
NC
4513by C<malloc>. The string length, C<len>, must be supplied. By default
4514this function will realloc (i.e. move) the memory pointed to by C<ptr>,
794a0d33
JH
4515so that pointer should not be freed or used by the programmer after
4516giving it to sv_usepvn, and neither should any pointers from "behind"
c1c21316
NC
4517that pointer (e.g. ptr + 1) be used.
4518
4519If C<flags> & SV_SMAGIC is true, will call SvSETMAGIC. If C<flags> &
4520SV_HAS_TRAILING_NUL is true, then C<ptr[len]> must be NUL, and the realloc
cbf82dd0 4521will be skipped. (i.e. the buffer is actually at least 1 byte longer than
c1c21316 4522C<len>, and already meets the requirements for storing in C<SvPVX>)
954c1994
GS
4523
4524=cut
4525*/
4526
ef50df4b 4527void
2e000ff2 4528Perl_sv_usepvn_flags(pTHX_ SV *const sv, char *ptr, const STRLEN len, const U32 flags)
463ee0b2 4529{
97aff369 4530 dVAR;
1936d2a7 4531 STRLEN allocate;
7918f24d
NC
4532
4533 PERL_ARGS_ASSERT_SV_USEPVN_FLAGS;
4534
765f542d 4535 SV_CHECK_THINKFIRST_COW_DROP(sv);
862a34c6 4536 SvUPGRADE(sv, SVt_PV);
463ee0b2 4537 if (!ptr) {
a0d0e21e 4538 (void)SvOK_off(sv);
47518d95
NC
4539 if (flags & SV_SMAGIC)
4540 SvSETMAGIC(sv);
463ee0b2
LW
4541 return;
4542 }
3f7c398e 4543 if (SvPVX_const(sv))
8bd4d4c5 4544 SvPV_free(sv);
1936d2a7 4545
0b7042f9 4546#ifdef DEBUGGING
2e90b4cd
NC
4547 if (flags & SV_HAS_TRAILING_NUL)
4548 assert(ptr[len] == '\0');
0b7042f9 4549#endif
2e90b4cd 4550
c1c21316 4551 allocate = (flags & SV_HAS_TRAILING_NUL)
5d487c26 4552 ? len + 1 :
ca7c1a29 4553#ifdef Perl_safesysmalloc_size
5d487c26
NC
4554 len + 1;
4555#else
4556 PERL_STRLEN_ROUNDUP(len + 1);
4557#endif
cbf82dd0
NC
4558 if (flags & SV_HAS_TRAILING_NUL) {
4559 /* It's long enough - do nothing.
4560 Specfically Perl_newCONSTSUB is relying on this. */
4561 } else {
69d25b4f 4562#ifdef DEBUGGING
69d25b4f 4563 /* Force a move to shake out bugs in callers. */
10edeb5d 4564 char *new_ptr = (char*)safemalloc(allocate);
69d25b4f
NC
4565 Copy(ptr, new_ptr, len, char);
4566 PoisonFree(ptr,len,char);
4567 Safefree(ptr);
4568 ptr = new_ptr;
69d25b4f 4569#else
10edeb5d 4570 ptr = (char*) saferealloc (ptr, allocate);
69d25b4f 4571#endif
cbf82dd0 4572 }
ca7c1a29
NC
4573#ifdef Perl_safesysmalloc_size
4574 SvLEN_set(sv, Perl_safesysmalloc_size(ptr));
5d487c26 4575#else
1936d2a7 4576 SvLEN_set(sv, allocate);
5d487c26
NC
4577#endif
4578 SvCUR_set(sv, len);
4579 SvPV_set(sv, ptr);
c1c21316 4580 if (!(flags & SV_HAS_TRAILING_NUL)) {
97a130b8 4581 ptr[len] = '\0';
c1c21316 4582 }
1aa99e6b 4583 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4584 SvTAINT(sv);
47518d95
NC
4585 if (flags & SV_SMAGIC)
4586 SvSETMAGIC(sv);
ef50df4b
GS
4587}
4588
f8c7b90f 4589#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
4590/* Need to do this *after* making the SV normal, as we need the buffer
4591 pointer to remain valid until after we've copied it. If we let go too early,
4592 another thread could invalidate it by unsharing last of the same hash key
4593 (which it can do by means other than releasing copy-on-write Svs)
4594 or by changing the other copy-on-write SVs in the loop. */
4595STATIC void
5302ffd4 4596S_sv_release_COW(pTHX_ register SV *sv, const char *pvx, SV *after)
765f542d 4597{
7918f24d
NC
4598 PERL_ARGS_ASSERT_SV_RELEASE_COW;
4599
5302ffd4 4600 { /* this SV was SvIsCOW_normal(sv) */
765f542d 4601 /* we need to find the SV pointing to us. */
cf5629ad 4602 SV *current = SV_COW_NEXT_SV(after);
7a5fa8a2 4603
765f542d
NC
4604 if (current == sv) {
4605 /* The SV we point to points back to us (there were only two of us
4606 in the loop.)
4607 Hence other SV is no longer copy on write either. */
4608 SvFAKE_off(after);
4609 SvREADONLY_off(after);
4610 } else {
4611 /* We need to follow the pointers around the loop. */
4612 SV *next;
4613 while ((next = SV_COW_NEXT_SV(current)) != sv) {
4614 assert (next);
4615 current = next;
4616 /* don't loop forever if the structure is bust, and we have
4617 a pointer into a closed loop. */
4618 assert (current != after);
3f7c398e 4619 assert (SvPVX_const(current) == pvx);
765f542d
NC
4620 }
4621 /* Make the SV before us point to the SV after us. */
a29f6d03 4622 SV_COW_NEXT_SV_SET(current, after);
765f542d 4623 }
765f542d
NC
4624 }
4625}
765f542d 4626#endif
645c22ef
DM
4627/*
4628=for apidoc sv_force_normal_flags
4629
4630Undo various types of fakery on an SV: if the PV is a shared string, make
4631a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
765f542d
NC
4632an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
4633we do the copy, and is also used locally. If C<SV_COW_DROP_PV> is set
4634then a copy-on-write scalar drops its PV buffer (if any) and becomes
4635SvPOK_off rather than making a copy. (Used where this scalar is about to be
d3050d9d 4636set to some other value.) In addition, the C<flags> parameter gets passed to
765f542d
NC
4637C<sv_unref_flags()> when unrefing. C<sv_force_normal> calls this function
4638with flags set to 0.
645c22ef
DM
4639
4640=cut
4641*/
4642
6fc92669 4643void
2e000ff2 4644Perl_sv_force_normal_flags(pTHX_ register SV *const sv, const U32 flags)
0f15f207 4645{
97aff369 4646 dVAR;
7918f24d
NC
4647
4648 PERL_ARGS_ASSERT_SV_FORCE_NORMAL_FLAGS;
4649
f8c7b90f 4650#ifdef PERL_OLD_COPY_ON_WRITE
765f542d 4651 if (SvREADONLY(sv)) {
765f542d 4652 if (SvFAKE(sv)) {
b64e5050 4653 const char * const pvx = SvPVX_const(sv);
a28509cc
AL
4654 const STRLEN len = SvLEN(sv);
4655 const STRLEN cur = SvCUR(sv);
5302ffd4
NC
4656 /* next COW sv in the loop. If len is 0 then this is a shared-hash
4657 key scalar, so we mustn't attempt to call SV_COW_NEXT_SV(), as
4658 we'll fail an assertion. */
4659 SV * const next = len ? SV_COW_NEXT_SV(sv) : 0;
4660
46187eeb
NC
4661 if (DEBUG_C_TEST) {
4662 PerlIO_printf(Perl_debug_log,
4663 "Copy on write: Force normal %ld\n",
4664 (long) flags);
e419cbc5 4665 sv_dump(sv);
46187eeb 4666 }
765f542d
NC
4667 SvFAKE_off(sv);
4668 SvREADONLY_off(sv);
9f653bb5 4669 /* This SV doesn't own the buffer, so need to Newx() a new one: */
6136c704 4670 SvPV_set(sv, NULL);
87a1ef3d 4671 SvLEN_set(sv, 0);
765f542d
NC
4672 if (flags & SV_COW_DROP_PV) {
4673 /* OK, so we don't need to copy our buffer. */
4674 SvPOK_off(sv);
4675 } else {
4676 SvGROW(sv, cur + 1);
4677 Move(pvx,SvPVX(sv),cur,char);
87a1ef3d 4678 SvCUR_set(sv, cur);
765f542d
NC
4679 *SvEND(sv) = '\0';
4680 }
5302ffd4
NC
4681 if (len) {
4682 sv_release_COW(sv, pvx, next);
4683 } else {
4684 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
4685 }
46187eeb 4686 if (DEBUG_C_TEST) {
e419cbc5 4687 sv_dump(sv);
46187eeb 4688 }
765f542d 4689 }
923e4eb5 4690 else if (IN_PERL_RUNTIME)
6ad8f254 4691 Perl_croak_no_modify(aTHX);
765f542d
NC
4692 }
4693#else
2213622d 4694 if (SvREADONLY(sv)) {
1c846c1f 4695 if (SvFAKE(sv)) {
b64e5050 4696 const char * const pvx = SvPVX_const(sv);
66a1b24b 4697 const STRLEN len = SvCUR(sv);
10bcdfd6
NC
4698 SvFAKE_off(sv);
4699 SvREADONLY_off(sv);
bd61b366 4700 SvPV_set(sv, NULL);
66a1b24b 4701 SvLEN_set(sv, 0);
1c846c1f 4702 SvGROW(sv, len + 1);
706aa1c9 4703 Move(pvx,SvPVX(sv),len,char);
1c846c1f 4704 *SvEND(sv) = '\0';
bdd68bc3 4705 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
1c846c1f 4706 }
923e4eb5 4707 else if (IN_PERL_RUNTIME)
6ad8f254 4708 Perl_croak_no_modify(aTHX);
0f15f207 4709 }
765f542d 4710#endif
2213622d 4711 if (SvROK(sv))
840a7b70 4712 sv_unref_flags(sv, flags);
13be902c 4713 else if (SvFAKE(sv) && isGV_with_GP(sv))
6fc92669 4714 sv_unglob(sv);
b9ad13ac
NC
4715 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_REGEXP) {
4716 /* Need to downgrade the REGEXP to a simple(r) scalar. This is analagous
4717 to sv_unglob. We only need it here, so inline it. */
4718 const svtype new_type = SvMAGIC(sv) || SvSTASH(sv) ? SVt_PVMG : SVt_PV;
4719 SV *const temp = newSV_type(new_type);
4720 void *const temp_p = SvANY(sv);
4721
4722 if (new_type == SVt_PVMG) {
4723 SvMAGIC_set(temp, SvMAGIC(sv));
4724 SvMAGIC_set(sv, NULL);
4725 SvSTASH_set(temp, SvSTASH(sv));
4726 SvSTASH_set(sv, NULL);
4727 }
4728 SvCUR_set(temp, SvCUR(sv));
4729 /* Remember that SvPVX is in the head, not the body. */
4730 if (SvLEN(temp)) {
4731 SvLEN_set(temp, SvLEN(sv));
4732 /* This signals "buffer is owned by someone else" in sv_clear,
4733 which is the least effort way to stop it freeing the buffer.
4734 */
4735 SvLEN_set(sv, SvLEN(sv)+1);
4736 } else {
4737 /* Their buffer is already owned by someone else. */
4738 SvPVX(sv) = savepvn(SvPVX(sv), SvCUR(sv));
4739 SvLEN_set(temp, SvCUR(sv)+1);
4740 }
4741
4742 /* Now swap the rest of the bodies. */
4743
4744 SvFLAGS(sv) &= ~(SVf_FAKE|SVTYPEMASK);
4745 SvFLAGS(sv) |= new_type;
4746 SvANY(sv) = SvANY(temp);
4747
4748 SvFLAGS(temp) &= ~(SVTYPEMASK);
4749 SvFLAGS(temp) |= SVt_REGEXP|SVf_FAKE;
4750 SvANY(temp) = temp_p;
4751
4752 SvREFCNT_dec(temp);
4753 }
0f15f207 4754}
1c846c1f 4755
645c22ef 4756/*
954c1994
GS
4757=for apidoc sv_chop
4758
1c846c1f 4759Efficient removal of characters from the beginning of the string buffer.
954c1994
GS
4760SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
4761the string buffer. The C<ptr> becomes the first character of the adjusted
645c22ef 4762string. Uses the "OOK hack".
3f7c398e 4763Beware: after this function returns, C<ptr> and SvPVX_const(sv) may no longer
31869a79 4764refer to the same chunk of data.
954c1994
GS
4765
4766=cut
4767*/
4768
79072805 4769void
2e000ff2 4770Perl_sv_chop(pTHX_ register SV *const sv, register const char *const ptr)
79072805 4771{
69240efd
NC
4772 STRLEN delta;
4773 STRLEN old_delta;
7a4bba22
NC
4774 U8 *p;
4775#ifdef DEBUGGING
4776 const U8 *real_start;
4777#endif
6c65d5f9 4778 STRLEN max_delta;
7a4bba22 4779
7918f24d
NC
4780 PERL_ARGS_ASSERT_SV_CHOP;
4781
a0d0e21e 4782 if (!ptr || !SvPOKp(sv))
79072805 4783 return;
3f7c398e 4784 delta = ptr - SvPVX_const(sv);
15895f8a
NC
4785 if (!delta) {
4786 /* Nothing to do. */
4787 return;
4788 }
6c65d5f9
NC
4789 /* SvPVX(sv) may move in SV_CHECK_THINKFIRST(sv), but after this line,
4790 nothing uses the value of ptr any more. */
837cb3ba 4791 max_delta = SvLEN(sv) ? SvLEN(sv) : SvCUR(sv);
6c65d5f9
NC
4792 if (ptr <= SvPVX_const(sv))
4793 Perl_croak(aTHX_ "panic: sv_chop ptr=%p, start=%p, end=%p",
4794 ptr, SvPVX_const(sv), SvPVX_const(sv) + max_delta);
2213622d 4795 SV_CHECK_THINKFIRST(sv);
6c65d5f9
NC
4796 if (delta > max_delta)
4797 Perl_croak(aTHX_ "panic: sv_chop ptr=%p (was %p), start=%p, end=%p",
4798 SvPVX_const(sv) + delta, ptr, SvPVX_const(sv),
4799 SvPVX_const(sv) + max_delta);
79072805
LW
4800
4801 if (!SvOOK(sv)) {
50483b2c 4802 if (!SvLEN(sv)) { /* make copy of shared string */
3f7c398e 4803 const char *pvx = SvPVX_const(sv);
a28509cc 4804 const STRLEN len = SvCUR(sv);
50483b2c 4805 SvGROW(sv, len + 1);
706aa1c9 4806 Move(pvx,SvPVX(sv),len,char);
50483b2c
JD
4807 *SvEND(sv) = '\0';
4808 }
7a5fa8a2 4809 SvFLAGS(sv) |= SVf_OOK;
7a4bba22
NC
4810 old_delta = 0;
4811 } else {
69240efd 4812 SvOOK_offset(sv, old_delta);
79072805 4813 }
b162af07
SP
4814 SvLEN_set(sv, SvLEN(sv) - delta);
4815 SvCUR_set(sv, SvCUR(sv) - delta);
f880fe2f 4816 SvPV_set(sv, SvPVX(sv) + delta);
7a4bba22
NC
4817
4818 p = (U8 *)SvPVX_const(sv);
4819
4820 delta += old_delta;
4821
50af2e61 4822#ifdef DEBUGGING
7a4bba22
NC
4823 real_start = p - delta;
4824#endif
4825
69240efd
NC
4826 assert(delta);
4827 if (delta < 0x100) {
7a4bba22
NC
4828 *--p = (U8) delta;
4829 } else {
69240efd
NC
4830 *--p = 0;
4831 p -= sizeof(STRLEN);
4832 Copy((U8*)&delta, p, sizeof(STRLEN), U8);
7a4bba22
NC
4833 }
4834
4835#ifdef DEBUGGING
4836 /* Fill the preceding buffer with sentinals to verify that no-one is
4837 using it. */
4838 while (p > real_start) {
4839 --p;
4840 *p = (U8)PTR2UV(p);
50af2e61
NC
4841 }
4842#endif
79072805
LW
4843}
4844
954c1994
GS
4845/*
4846=for apidoc sv_catpvn
4847
4848Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
4849C<len> indicates number of bytes to copy. If the SV has the UTF-8
4850status set, then the bytes appended should be valid UTF-8.
d5ce4a7c 4851Handles 'get' magic, but not 'set' magic. See C<sv_catpvn_mg>.
954c1994 4852
8d6d96c1
HS
4853=for apidoc sv_catpvn_flags
4854
4855Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
4856C<len> indicates number of bytes to copy. If the SV has the UTF-8
4857status set, then the bytes appended should be valid UTF-8.
8d6d96c1
HS
4858If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
4859appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
4860in terms of this function.
4861
4862=cut
4863*/
4864
4865void
2e000ff2 4866Perl_sv_catpvn_flags(pTHX_ register SV *const dsv, register const char *sstr, register const STRLEN slen, const I32 flags)
8d6d96c1 4867{
97aff369 4868 dVAR;
8d6d96c1 4869 STRLEN dlen;
fabdb6c0 4870 const char * const dstr = SvPV_force_flags(dsv, dlen, flags);
8d6d96c1 4871
7918f24d
NC
4872 PERL_ARGS_ASSERT_SV_CATPVN_FLAGS;
4873
8d6d96c1
HS
4874 SvGROW(dsv, dlen + slen + 1);
4875 if (sstr == dstr)
3f7c398e 4876 sstr = SvPVX_const(dsv);
8d6d96c1 4877 Move(sstr, SvPVX(dsv) + dlen, slen, char);
b162af07 4878 SvCUR_set(dsv, SvCUR(dsv) + slen);
8d6d96c1
HS
4879 *SvEND(dsv) = '\0';
4880 (void)SvPOK_only_UTF8(dsv); /* validate pointer */
4881 SvTAINT(dsv);
bddd5118
NC
4882 if (flags & SV_SMAGIC)
4883 SvSETMAGIC(dsv);
79072805
LW
4884}
4885
954c1994 4886/*
954c1994
GS
4887=for apidoc sv_catsv
4888
13e8c8e3
JH
4889Concatenates the string from SV C<ssv> onto the end of the string in
4890SV C<dsv>. Modifies C<dsv> but not C<ssv>. Handles 'get' magic, but
4891not 'set' magic. See C<sv_catsv_mg>.
954c1994 4892
8d6d96c1
HS
4893=for apidoc sv_catsv_flags
4894
4895Concatenates the string from SV C<ssv> onto the end of the string in
4896SV C<dsv>. Modifies C<dsv> but not C<ssv>. If C<flags> has C<SV_GMAGIC>
4897bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
4898and C<sv_catsv_nomg> are implemented in terms of this function.
4899
4900=cut */
4901
ef50df4b 4902void
2e000ff2 4903Perl_sv_catsv_flags(pTHX_ SV *const dsv, register SV *const ssv, const I32 flags)
79072805 4904{
97aff369 4905 dVAR;
7918f24d
NC
4906
4907 PERL_ARGS_ASSERT_SV_CATSV_FLAGS;
4908
4909 if (ssv) {
00b6aa41 4910 STRLEN slen;
a9984b10 4911 const char *spv = SvPV_flags_const(ssv, slen, flags);
00b6aa41 4912 if (spv) {
bddd5118
NC
4913 /* sutf8 and dutf8 were type bool, but under USE_ITHREADS,
4914 gcc version 2.95.2 20000220 (Debian GNU/Linux) for
4915 Linux xxx 2.2.17 on sparc64 with gcc -O2, we erroneously
4916 get dutf8 = 0x20000000, (i.e. SVf_UTF8) even though
4917 dsv->sv_flags doesn't have that bit set.
4fd84b44 4918 Andy Dougherty 12 Oct 2001
bddd5118
NC
4919 */
4920 const I32 sutf8 = DO_UTF8(ssv);
4921 I32 dutf8;
13e8c8e3 4922
bddd5118
NC
4923 if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
4924 mg_get(dsv);
4925 dutf8 = DO_UTF8(dsv);
8d6d96c1 4926
bddd5118
NC
4927 if (dutf8 != sutf8) {
4928 if (dutf8) {
4929 /* Not modifying source SV, so taking a temporary copy. */
59cd0e26 4930 SV* const csv = newSVpvn_flags(spv, slen, SVs_TEMP);
13e8c8e3 4931
bddd5118
NC
4932 sv_utf8_upgrade(csv);
4933 spv = SvPV_const(csv, slen);
4934 }
4935 else
7bf79863
KW
4936 /* Leave enough space for the cat that's about to happen */
4937 sv_utf8_upgrade_flags_grow(dsv, 0, slen);
13e8c8e3 4938 }
bddd5118 4939 sv_catpvn_nomg(dsv, spv, slen);
e84ff256 4940 }
560a288e 4941 }
bddd5118
NC
4942 if (flags & SV_SMAGIC)
4943 SvSETMAGIC(dsv);
79072805
LW
4944}
4945
954c1994 4946/*
954c1994
GS
4947=for apidoc sv_catpv
4948
4949Concatenates the string onto the end of the string which is in the SV.
1e54db1a
JH
4950If the SV has the UTF-8 status set, then the bytes appended should be
4951valid UTF-8. Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
954c1994 4952
d5ce4a7c 4953=cut */
954c1994 4954
ef50df4b 4955void
2b021c53 4956Perl_sv_catpv(pTHX_ register SV *const sv, register const char *ptr)
79072805 4957{
97aff369 4958 dVAR;
79072805 4959 register STRLEN len;
463ee0b2 4960 STRLEN tlen;
748a9306 4961 char *junk;
79072805 4962
7918f24d
NC
4963 PERL_ARGS_ASSERT_SV_CATPV;
4964
0c981600 4965 if (!ptr)
79072805 4966 return;
748a9306 4967 junk = SvPV_force(sv, tlen);
0c981600 4968 len = strlen(ptr);
463ee0b2 4969 SvGROW(sv, tlen + len + 1);
0c981600 4970 if (ptr == junk)
3f7c398e 4971 ptr = SvPVX_const(sv);
0c981600 4972 Move(ptr,SvPVX(sv)+tlen,len+1,char);
b162af07 4973 SvCUR_set(sv, SvCUR(sv) + len);
d41ff1b8 4974 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4975 SvTAINT(sv);
79072805
LW
4976}
4977
954c1994 4978/*
9dcc53ea
Z
4979=for apidoc sv_catpv_flags
4980
4981Concatenates the string onto the end of the string which is in the SV.
4982If the SV has the UTF-8 status set, then the bytes appended should
4983be valid UTF-8. If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get>
4984on the SVs if appropriate, else not.
4985
4986=cut
4987*/
4988
4989void
fe00c367 4990Perl_sv_catpv_flags(pTHX_ SV *dstr, const char *sstr, const I32 flags)
9dcc53ea
Z
4991{
4992 PERL_ARGS_ASSERT_SV_CATPV_FLAGS;
4993 sv_catpvn_flags(dstr, sstr, strlen(sstr), flags);
4994}
4995
4996/*
954c1994
GS
4997=for apidoc sv_catpv_mg
4998
4999Like C<sv_catpv>, but also handles 'set' magic.
5000
5001=cut
5002*/
5003
ef50df4b 5004void
2b021c53 5005Perl_sv_catpv_mg(pTHX_ register SV *const sv, register const char *const ptr)
ef50df4b 5006{
7918f24d
NC
5007 PERL_ARGS_ASSERT_SV_CATPV_MG;
5008
0c981600 5009 sv_catpv(sv,ptr);
ef50df4b
GS
5010 SvSETMAGIC(sv);
5011}
5012
645c22ef
DM
5013/*
5014=for apidoc newSV
5015
561b68a9
SH
5016Creates a new SV. A non-zero C<len> parameter indicates the number of
5017bytes of preallocated string space the SV should have. An extra byte for a
5018trailing NUL is also reserved. (SvPOK is not set for the SV even if string
5019space is allocated.) The reference count for the new SV is set to 1.
5020
5021In 5.9.3, newSV() replaces the older NEWSV() API, and drops the first
5022parameter, I<x>, a debug aid which allowed callers to identify themselves.
5023This aid has been superseded by a new build option, PERL_MEM_LOG (see
5024L<perlhack/PERL_MEM_LOG>). The older API is still there for use in XS
5025modules supporting older perls.
645c22ef
DM
5026
5027=cut
5028*/
5029
79072805 5030SV *
2b021c53 5031Perl_newSV(pTHX_ const STRLEN len)
79072805 5032{
97aff369 5033 dVAR;
79072805 5034 register SV *sv;
1c846c1f 5035
4561caa4 5036 new_SV(sv);
79072805
LW
5037 if (len) {
5038 sv_upgrade(sv, SVt_PV);
5039 SvGROW(sv, len + 1);
5040 }
5041 return sv;
5042}
954c1994 5043/*
92110913 5044=for apidoc sv_magicext
954c1994 5045
68795e93 5046Adds magic to an SV, upgrading it if necessary. Applies the
2d8d5d5a 5047supplied vtable and returns a pointer to the magic added.
92110913 5048
2d8d5d5a
SH
5049Note that C<sv_magicext> will allow things that C<sv_magic> will not.
5050In particular, you can add magic to SvREADONLY SVs, and add more than
5051one instance of the same 'how'.
645c22ef 5052
2d8d5d5a
SH
5053If C<namlen> is greater than zero then a C<savepvn> I<copy> of C<name> is
5054stored, if C<namlen> is zero then C<name> is stored as-is and - as another
5055special case - if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
5056to contain an C<SV*> and is stored as-is with its REFCNT incremented.
92110913 5057
2d8d5d5a 5058(This is now used as a subroutine by C<sv_magic>.)
954c1994
GS
5059
5060=cut
5061*/
92110913 5062MAGIC *
2b021c53
SS
5063Perl_sv_magicext(pTHX_ SV *const sv, SV *const obj, const int how,
5064 const MGVTBL *const vtable, const char *const name, const I32 namlen)
79072805 5065{
97aff369 5066 dVAR;
79072805 5067 MAGIC* mg;
68795e93 5068
7918f24d
NC
5069 PERL_ARGS_ASSERT_SV_MAGICEXT;
5070
7a7f3e45 5071 SvUPGRADE(sv, SVt_PVMG);
a02a5408 5072 Newxz(mg, 1, MAGIC);
79072805 5073 mg->mg_moremagic = SvMAGIC(sv);
b162af07 5074 SvMAGIC_set(sv, mg);
75f9d97a 5075
05f95b08
SB
5076 /* Sometimes a magic contains a reference loop, where the sv and
5077 object refer to each other. To prevent a reference loop that
5078 would prevent such objects being freed, we look for such loops
5079 and if we find one we avoid incrementing the object refcount.
87f0b213
JH
5080
5081 Note we cannot do this to avoid self-tie loops as intervening RV must
b5ccf5f2 5082 have its REFCNT incremented to keep it in existence.
87f0b213
JH
5083
5084 */
14befaf4
DM
5085 if (!obj || obj == sv ||
5086 how == PERL_MAGIC_arylen ||
8d2f4536 5087 how == PERL_MAGIC_symtab ||
75f9d97a 5088 (SvTYPE(obj) == SVt_PVGV &&
4c4652b6
NC
5089 (GvSV(obj) == sv || GvHV(obj) == (const HV *)sv
5090 || GvAV(obj) == (const AV *)sv || GvCV(obj) == (const CV *)sv
5091 || GvIOp(obj) == (const IO *)sv || GvFORM(obj) == (const CV *)sv)))
75f9d97a 5092 {
8990e307 5093 mg->mg_obj = obj;
75f9d97a 5094 }
85e6fe83 5095 else {
b37c2d43 5096 mg->mg_obj = SvREFCNT_inc_simple(obj);
85e6fe83
LW
5097 mg->mg_flags |= MGf_REFCOUNTED;
5098 }
b5ccf5f2
YST
5099
5100 /* Normal self-ties simply pass a null object, and instead of
5101 using mg_obj directly, use the SvTIED_obj macro to produce a
5102 new RV as needed. For glob "self-ties", we are tieing the PVIO
5103 with an RV obj pointing to the glob containing the PVIO. In
5104 this case, to avoid a reference loop, we need to weaken the
5105 reference.
5106 */
5107
5108 if (how == PERL_MAGIC_tiedscalar && SvTYPE(sv) == SVt_PVIO &&
a45c7426 5109 obj && SvROK(obj) && GvIO(SvRV(obj)) == (const IO *)sv)
b5ccf5f2
YST
5110 {
5111 sv_rvweaken(obj);
5112 }
5113
79072805 5114 mg->mg_type = how;
565764a8 5115 mg->mg_len = namlen;
9cbac4c7 5116 if (name) {
92110913 5117 if (namlen > 0)
1edc1566 5118 mg->mg_ptr = savepvn(name, namlen);
daba3364
NC
5119 else if (namlen == HEf_SVKEY) {
5120 /* Yes, this is casting away const. This is only for the case of
5121 HEf_SVKEY. I think we need to document this abberation of the
5122 constness of the API, rather than making name non-const, as
5123 that change propagating outwards a long way. */
5124 mg->mg_ptr = (char*)SvREFCNT_inc_simple_NN((SV *)name);
5125 } else
92110913 5126 mg->mg_ptr = (char *) name;
9cbac4c7 5127 }
53d44271 5128 mg->mg_virtual = (MGVTBL *) vtable;
68795e93 5129
92110913
NIS
5130 mg_magical(sv);
5131 if (SvGMAGICAL(sv))
5132 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
5133 return mg;
5134}
5135
5136/*
5137=for apidoc sv_magic
1c846c1f 5138
92110913
NIS
5139Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
5140then adds a new magic item of type C<how> to the head of the magic list.
5141
2d8d5d5a
SH
5142See C<sv_magicext> (which C<sv_magic> now calls) for a description of the
5143handling of the C<name> and C<namlen> arguments.
5144
4509d3fb
SB
5145You need to use C<sv_magicext> to add magic to SvREADONLY SVs and also
5146to add more than one instance of the same 'how'.
5147
92110913
NIS
5148=cut
5149*/
5150
5151void
2b021c53
SS
5152Perl_sv_magic(pTHX_ register SV *const sv, SV *const obj, const int how,
5153 const char *const name, const I32 namlen)
68795e93 5154{
97aff369 5155 dVAR;
53d44271 5156 const MGVTBL *vtable;
92110913 5157 MAGIC* mg;
92110913 5158
7918f24d
NC
5159 PERL_ARGS_ASSERT_SV_MAGIC;
5160
f8c7b90f 5161#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
5162 if (SvIsCOW(sv))
5163 sv_force_normal_flags(sv, 0);
5164#endif
92110913 5165 if (SvREADONLY(sv)) {
d8084ca5
DM
5166 if (
5167 /* its okay to attach magic to shared strings; the subsequent
5168 * upgrade to PVMG will unshare the string */
5169 !(SvFAKE(sv) && SvTYPE(sv) < SVt_PVMG)
5170
5171 && IN_PERL_RUNTIME
92110913
NIS
5172 && how != PERL_MAGIC_regex_global
5173 && how != PERL_MAGIC_bm
5174 && how != PERL_MAGIC_fm
5175 && how != PERL_MAGIC_sv
e6469971 5176 && how != PERL_MAGIC_backref
92110913
NIS
5177 )
5178 {
6ad8f254 5179 Perl_croak_no_modify(aTHX);
92110913
NIS
5180 }
5181 }
5182 if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
5183 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
68795e93
NIS
5184 /* sv_magic() refuses to add a magic of the same 'how' as an
5185 existing one
92110913 5186 */
2a509ed3 5187 if (how == PERL_MAGIC_taint) {
92110913 5188 mg->mg_len |= 1;
2a509ed3
NC
5189 /* Any scalar which already had taint magic on which someone
5190 (erroneously?) did SvIOK_on() or similar will now be
5191 incorrectly sporting public "OK" flags. */
5192 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
5193 }
92110913
NIS
5194 return;
5195 }
5196 }
68795e93 5197
79072805 5198 switch (how) {
14befaf4 5199 case PERL_MAGIC_sv:
92110913 5200 vtable = &PL_vtbl_sv;
79072805 5201 break;
14befaf4 5202 case PERL_MAGIC_overload:
92110913 5203 vtable = &PL_vtbl_amagic;
a0d0e21e 5204 break;
14befaf4 5205 case PERL_MAGIC_overload_elem:
92110913 5206 vtable = &PL_vtbl_amagicelem;
a0d0e21e 5207 break;
14befaf4 5208 case PERL_MAGIC_overload_table:
92110913 5209 vtable = &PL_vtbl_ovrld;
a0d0e21e 5210 break;
14befaf4 5211 case PERL_MAGIC_bm:
92110913 5212 vtable = &PL_vtbl_bm;
79072805 5213 break;
14befaf4 5214 case PERL_MAGIC_regdata:
92110913 5215 vtable = &PL_vtbl_regdata;
6cef1e77 5216 break;
14befaf4 5217 case PERL_MAGIC_regdatum:
92110913 5218 vtable = &PL_vtbl_regdatum;
6cef1e77 5219 break;
14befaf4 5220 case PERL_MAGIC_env:
92110913 5221 vtable = &PL_vtbl_env;
79072805 5222 break;
14befaf4 5223 case PERL_MAGIC_fm:
92110913 5224 vtable = &PL_vtbl_fm;
55497cff 5225 break;
14befaf4 5226 case PERL_MAGIC_envelem:
92110913 5227 vtable = &PL_vtbl_envelem;
79072805 5228 break;
14befaf4 5229 case PERL_MAGIC_regex_global:
92110913 5230 vtable = &PL_vtbl_mglob;
93a17b20 5231 break;
14befaf4 5232 case PERL_MAGIC_isa:
92110913 5233 vtable = &PL_vtbl_isa;
463ee0b2 5234 break;
14befaf4 5235 case PERL_MAGIC_isaelem:
92110913 5236 vtable = &PL_vtbl_isaelem;
463ee0b2 5237 break;
14befaf4 5238 case PERL_MAGIC_nkeys:
92110913 5239 vtable = &PL_vtbl_nkeys;
16660edb 5240 break;
14befaf4 5241 case PERL_MAGIC_dbfile:
aec46f14 5242 vtable = NULL;
93a17b20 5243 break;
14befaf4 5244 case PERL_MAGIC_dbline:
92110913 5245 vtable = &PL_vtbl_dbline;
79072805 5246 break;
36477c24 5247#ifdef USE_LOCALE_COLLATE
14befaf4 5248 case PERL_MAGIC_collxfrm:
92110913 5249 vtable = &PL_vtbl_collxfrm;
bbce6d69 5250 break;
36477c24 5251#endif /* USE_LOCALE_COLLATE */
14befaf4 5252 case PERL_MAGIC_tied:
92110913 5253 vtable = &PL_vtbl_pack;
463ee0b2 5254 break;
14befaf4
DM
5255 case PERL_MAGIC_tiedelem:
5256 case PERL_MAGIC_tiedscalar:
92110913 5257 vtable = &PL_vtbl_packelem;
463ee0b2 5258 break;
14befaf4 5259 case PERL_MAGIC_qr:
92110913 5260 vtable = &PL_vtbl_regexp;
c277df42 5261 break;
14befaf4 5262 case PERL_MAGIC_sig:
92110913 5263 vtable = &PL_vtbl_sig;
79072805 5264 break;
14befaf4 5265 case PERL_MAGIC_sigelem:
92110913 5266 vtable = &PL_vtbl_sigelem;
79072805 5267 break;
14befaf4 5268 case PERL_MAGIC_taint:
92110913 5269 vtable = &PL_vtbl_taint;
463ee0b2 5270 break;
14befaf4 5271 case PERL_MAGIC_uvar:
92110913 5272 vtable = &PL_vtbl_uvar;
79072805 5273 break;
14befaf4 5274 case PERL_MAGIC_vec:
92110913 5275 vtable = &PL_vtbl_vec;
79072805 5276 break;
a3874608 5277 case PERL_MAGIC_arylen_p:
bfcb3514 5278 case PERL_MAGIC_rhash:
8d2f4536 5279 case PERL_MAGIC_symtab:
ece467f9 5280 case PERL_MAGIC_vstring:
d9088386 5281 case PERL_MAGIC_checkcall:
aec46f14 5282 vtable = NULL;
ece467f9 5283 break;
7e8c5dac
HS
5284 case PERL_MAGIC_utf8:
5285 vtable = &PL_vtbl_utf8;
5286 break;
14befaf4 5287 case PERL_MAGIC_substr:
92110913 5288 vtable = &PL_vtbl_substr;
79072805 5289 break;
14befaf4 5290 case PERL_MAGIC_defelem:
92110913 5291 vtable = &PL_vtbl_defelem;
5f05dabc 5292 break;
14befaf4 5293 case PERL_MAGIC_arylen:
92110913 5294 vtable = &PL_vtbl_arylen;
79072805 5295 break;
14befaf4 5296 case PERL_MAGIC_pos:
92110913 5297 vtable = &PL_vtbl_pos;
a0d0e21e 5298 break;
14befaf4 5299 case PERL_MAGIC_backref:
92110913 5300 vtable = &PL_vtbl_backref;
810b8aa5 5301 break;
b3ca2e83
NC
5302 case PERL_MAGIC_hintselem:
5303 vtable = &PL_vtbl_hintselem;
5304 break;
f747ebd6
Z
5305 case PERL_MAGIC_hints:
5306 vtable = &PL_vtbl_hints;
5307 break;
14befaf4
DM
5308 case PERL_MAGIC_ext:
5309 /* Reserved for use by extensions not perl internals. */
4633a7c4
LW
5310 /* Useful for attaching extension internal data to perl vars. */
5311 /* Note that multiple extensions may clash if magical scalars */
5312 /* etc holding private data from one are passed to another. */
aec46f14 5313 vtable = NULL;
a0d0e21e 5314 break;
79072805 5315 default:
14befaf4 5316 Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
463ee0b2 5317 }
68795e93 5318
92110913 5319 /* Rest of work is done else where */
aec46f14 5320 mg = sv_magicext(sv,obj,how,vtable,name,namlen);
68795e93 5321
92110913
NIS
5322 switch (how) {
5323 case PERL_MAGIC_taint:
5324 mg->mg_len = 1;
5325 break;
5326 case PERL_MAGIC_ext:
5327 case PERL_MAGIC_dbfile:
5328 SvRMAGICAL_on(sv);
5329 break;
5330 }
463ee0b2
LW
5331}
5332
5333int
b83794c7 5334S_sv_unmagicext_flags(pTHX_ SV *const sv, const int type, MGVTBL *vtbl, const U32 flags)
463ee0b2
LW
5335{
5336 MAGIC* mg;
5337 MAGIC** mgp;
7918f24d 5338
b83794c7 5339 assert(flags <= 1);
7918f24d 5340
91bba347 5341 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2 5342 return 0;
064cf529 5343 mgp = &(((XPVMG*) SvANY(sv))->xmg_u.xmg_magic);
463ee0b2 5344 for (mg = *mgp; mg; mg = *mgp) {
b83794c7
FR
5345 const MGVTBL* const virt = mg->mg_virtual;
5346 if (mg->mg_type == type && (!flags || virt == vtbl)) {
463ee0b2 5347 *mgp = mg->mg_moremagic;
b83794c7
FR
5348 if (virt && virt->svt_free)
5349 virt->svt_free(aTHX_ sv, mg);
14befaf4 5350 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
92110913 5351 if (mg->mg_len > 0)
1edc1566 5352 Safefree(mg->mg_ptr);
565764a8 5353 else if (mg->mg_len == HEf_SVKEY)
daba3364 5354 SvREFCNT_dec(MUTABLE_SV(mg->mg_ptr));
d2923cdd 5355 else if (mg->mg_type == PERL_MAGIC_utf8)
7e8c5dac 5356 Safefree(mg->mg_ptr);
9cbac4c7 5357 }
a0d0e21e
LW
5358 if (mg->mg_flags & MGf_REFCOUNTED)
5359 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
5360 Safefree(mg);
5361 }
5362 else
5363 mgp = &mg->mg_moremagic;
79072805 5364 }
806e7ca7
CS
5365 if (SvMAGIC(sv)) {
5366 if (SvMAGICAL(sv)) /* if we're under save_magic, wait for restore_magic; */
5367 mg_magical(sv); /* else fix the flags now */
5368 }
5369 else {
463ee0b2 5370 SvMAGICAL_off(sv);
c268c2a6 5371 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
463ee0b2 5372 }
463ee0b2 5373 return 0;
79072805
LW
5374}
5375
c461cf8f 5376/*
b83794c7
FR
5377=for apidoc sv_unmagic
5378
5379Removes all magic of type C<type> from an SV.
5380
5381=cut
5382*/
5383
5384int
5385Perl_sv_unmagic(pTHX_ SV *const sv, const int type)
5386{
5387 PERL_ARGS_ASSERT_SV_UNMAGIC;
5388 return S_sv_unmagicext_flags(aTHX_ sv, type, NULL, 0);
5389}
5390
5391/*
5392=for apidoc sv_unmagicext
5393
5394Removes all magic of type C<type> with the specified C<vtbl> from an SV.
5395
5396=cut
5397*/
5398
5399int
5400Perl_sv_unmagicext(pTHX_ SV *const sv, const int type, MGVTBL *vtbl)
5401{
5402 PERL_ARGS_ASSERT_SV_UNMAGICEXT;
5403 return S_sv_unmagicext_flags(aTHX_ sv, type, vtbl, 1);
5404}
5405
5406/*
c461cf8f
JH
5407=for apidoc sv_rvweaken
5408
645c22ef
DM
5409Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
5410referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
5411push a back-reference to this RV onto the array of backreferences
1e73acc8
AS
5412associated with that magic. If the RV is magical, set magic will be
5413called after the RV is cleared.
c461cf8f
JH
5414
5415=cut
5416*/
5417
810b8aa5 5418SV *
2b021c53 5419Perl_sv_rvweaken(pTHX_ SV *const sv)
810b8aa5
GS
5420{
5421 SV *tsv;
7918f24d
NC
5422
5423 PERL_ARGS_ASSERT_SV_RVWEAKEN;
5424
810b8aa5
GS
5425 if (!SvOK(sv)) /* let undefs pass */
5426 return sv;
5427 if (!SvROK(sv))
cea2e8a9 5428 Perl_croak(aTHX_ "Can't weaken a nonreference");
810b8aa5 5429 else if (SvWEAKREF(sv)) {
a2a5de95 5430 Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
810b8aa5
GS
5431 return sv;
5432 }
5433 tsv = SvRV(sv);
e15faf7d 5434 Perl_sv_add_backref(aTHX_ tsv, sv);
810b8aa5 5435 SvWEAKREF_on(sv);
1c846c1f 5436 SvREFCNT_dec(tsv);
810b8aa5
GS
5437 return sv;
5438}
5439
645c22ef
DM
5440/* Give tsv backref magic if it hasn't already got it, then push a
5441 * back-reference to sv onto the array associated with the backref magic.
5648c0ae
DM
5442 *
5443 * As an optimisation, if there's only one backref and it's not an AV,
5444 * store it directly in the HvAUX or mg_obj slot, avoiding the need to
5445 * allocate an AV. (Whether the slot holds an AV tells us whether this is
5446 * active.)
8ac9a371
DM
5447 *
5448 * If an HV's backref is stored in magic, it is moved back to HvAUX.
645c22ef
DM
5449 */
5450
fd996479
DM
5451/* A discussion about the backreferences array and its refcount:
5452 *
5453 * The AV holding the backreferences is pointed to either as the mg_obj of
09aad8f0
DM
5454 * PERL_MAGIC_backref, or in the specific case of a HV that has the hv_aux
5455 * structure, from the xhv_backreferences field. (A HV without hv_aux will
5456 * have the standard magic instead.) The array is created with a refcount
5457 * of 2. This means that if during global destruction the array gets
cef0c2ea
DM
5458 * picked on before its parent to have its refcount decremented by the
5459 * random zapper, it won't actually be freed, meaning it's still there for
5460 * when its parent gets freed.
5648c0ae
DM
5461 *
5462 * When the parent SV is freed, the extra ref is killed by
5463 * Perl_sv_kill_backrefs. The other ref is killed, in the case of magic,
5464 * by mg_free() / MGf_REFCOUNTED, or for a hash, by Perl_hv_kill_backrefs.
5465 *
5466 * When a single backref SV is stored directly, it is not reference
5467 * counted.
fd996479
DM
5468 */
5469
e15faf7d 5470void
2b021c53 5471Perl_sv_add_backref(pTHX_ SV *const tsv, SV *const sv)
810b8aa5 5472{
97aff369 5473 dVAR;
757971c4 5474 SV **svp;
5648c0ae 5475 AV *av = NULL;
757971c4 5476 MAGIC *mg = NULL;
86f55936 5477
7918f24d
NC
5478 PERL_ARGS_ASSERT_SV_ADD_BACKREF;
5479
5648c0ae
DM
5480 /* find slot to store array or singleton backref */
5481
86f55936 5482 if (SvTYPE(tsv) == SVt_PVHV) {
757971c4 5483 svp = (SV**)Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(tsv));
09aad8f0 5484
757971c4
DM
5485 if (!*svp) {
5486 if ((mg = mg_find(tsv, PERL_MAGIC_backref))) {
5487 /* Aha. They've got it stowed in magic instead.
5488 * Move it back to xhv_backreferences */
5489 *svp = mg->mg_obj;
cdb996f4 5490 /* Stop mg_free decreasing the reference count. */
09aad8f0
DM
5491 mg->mg_obj = NULL;
5492 /* Stop mg_free even calling the destructor, given that
5493 there's no AV to free up. */
5494 mg->mg_virtual = 0;
5495 sv_unmagic(tsv, PERL_MAGIC_backref);
757971c4 5496 mg = NULL;
09aad8f0 5497 }
86f55936
NC
5498 }
5499 } else {
757971c4
DM
5500 if (! ((mg =
5501 (SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL))))
5502 {
5503 sv_magic(tsv, NULL, PERL_MAGIC_backref, NULL, 0);
5504 mg = mg_find(tsv, PERL_MAGIC_backref);
86f55936 5505 }
757971c4 5506 svp = &(mg->mg_obj);
810b8aa5 5507 }
757971c4 5508
5648c0ae
DM
5509 /* create or retrieve the array */
5510
5511 if ( (!*svp && SvTYPE(sv) == SVt_PVAV)
5512 || (*svp && SvTYPE(*svp) != SVt_PVAV)
5513 ) {
5514 /* create array */
757971c4
DM
5515 av = newAV();
5516 AvREAL_off(av);
5517 SvREFCNT_inc_simple_void(av);
5518 /* av now has a refcnt of 2; see discussion above */
5648c0ae
DM
5519 if (*svp) {
5520 /* move single existing backref to the array */
5521 av_extend(av, 1);
5522 AvARRAY(av)[++AvFILLp(av)] = *svp; /* av_push() */
5523 }
5524 *svp = (SV*)av;
757971c4
DM
5525 if (mg)
5526 mg->mg_flags |= MGf_REFCOUNTED;
757971c4
DM
5527 }
5528 else
5648c0ae 5529 av = MUTABLE_AV(*svp);
757971c4 5530
5648c0ae
DM
5531 if (!av) {
5532 /* optimisation: store single backref directly in HvAUX or mg_obj */
5533 *svp = sv;
5534 return;
5535 }
5536 /* push new backref */
5537 assert(SvTYPE(av) == SVt_PVAV);
d91d49e8 5538 if (AvFILLp(av) >= AvMAX(av)) {
d91d49e8
MM
5539 av_extend(av, AvFILLp(av)+1);
5540 }
5541 AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */
810b8aa5
GS
5542}
5543
645c22ef
DM
5544/* delete a back-reference to ourselves from the backref magic associated
5545 * with the SV we point to.
5546 */
5547
4c74a7df
DM
5548void
5549Perl_sv_del_backref(pTHX_ SV *const tsv, SV *const sv)
810b8aa5 5550{
97aff369 5551 dVAR;
5648c0ae 5552 SV **svp = NULL;
86f55936 5553
7918f24d
NC
5554 PERL_ARGS_ASSERT_SV_DEL_BACKREF;
5555
317ec34c 5556 if (SvTYPE(tsv) == SVt_PVHV && SvOOK(tsv)) {
5648c0ae 5557 svp = (SV**)Perl_hv_backreferences_p(aTHX_ MUTABLE_HV(tsv));
86f55936 5558 }
5648c0ae
DM
5559 if (!svp || !*svp) {
5560 MAGIC *const mg
86f55936 5561 = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
5648c0ae 5562 svp = mg ? &(mg->mg_obj) : NULL;
86f55936 5563 }
41fae7a1 5564
5648c0ae 5565 if (!svp || !*svp)
cea2e8a9 5566 Perl_croak(aTHX_ "panic: del_backref");
86f55936 5567
5648c0ae 5568 if (SvTYPE(*svp) == SVt_PVAV) {
51698cb3
DM
5569#ifdef DEBUGGING
5570 int count = 1;
5571#endif
5648c0ae 5572 AV * const av = (AV*)*svp;
51698cb3 5573 SSize_t fill;
5648c0ae 5574 assert(!SvIS_FREED(av));
51698cb3
DM
5575 fill = AvFILLp(av);
5576 assert(fill > -1);
5648c0ae 5577 svp = AvARRAY(av);
51698cb3
DM
5578 /* for an SV with N weak references to it, if all those
5579 * weak refs are deleted, then sv_del_backref will be called
5580 * N times and O(N^2) compares will be done within the backref
5581 * array. To ameliorate this potential slowness, we:
5582 * 1) make sure this code is as tight as possible;
5583 * 2) when looking for SV, look for it at both the head and tail of the
5584 * array first before searching the rest, since some create/destroy
5585 * patterns will cause the backrefs to be freed in order.
5586 */
5587 if (*svp == sv) {
5588 AvARRAY(av)++;
5589 AvMAX(av)--;
5590 }
5591 else {
5592 SV **p = &svp[fill];
5593 SV *const topsv = *p;
5594 if (topsv != sv) {
5595#ifdef DEBUGGING
5596 count = 0;
5597#endif
5598 while (--p > svp) {
5599 if (*p == sv) {
5600 /* We weren't the last entry.
5601 An unordered list has this property that you
5602 can take the last element off the end to fill
5603 the hole, and it's still an unordered list :-)
5604 */
5605 *p = topsv;
5606#ifdef DEBUGGING
5607 count++;
5608#else
5609 break; /* should only be one */
254f8c6a 5610#endif
51698cb3
DM
5611 }
5612 }
6a76db8b 5613 }
6a76db8b 5614 }
51698cb3
DM
5615 assert(count ==1);
5616 AvFILLp(av) = fill-1;
6a76db8b 5617 }
5648c0ae
DM
5618 else {
5619 /* optimisation: only a single backref, stored directly */
5620 if (*svp != sv)
5621 Perl_croak(aTHX_ "panic: del_backref");
5622 *svp = NULL;
5623 }
5624
810b8aa5
GS
5625}
5626
5648c0ae 5627void
2b021c53 5628Perl_sv_kill_backrefs(pTHX_ SV *const sv, AV *const av)
86f55936 5629{
5648c0ae
DM
5630 SV **svp;
5631 SV **last;
5632 bool is_array;
86f55936 5633
7918f24d 5634 PERL_ARGS_ASSERT_SV_KILL_BACKREFS;
86f55936 5635
5648c0ae
DM
5636 if (!av)
5637 return;
86f55936 5638
5648c0ae
DM
5639 is_array = (SvTYPE(av) == SVt_PVAV);
5640 if (is_array) {
cef0c2ea 5641 assert(!SvIS_FREED(av));
5648c0ae
DM
5642 svp = AvARRAY(av);
5643 if (svp)
5644 last = svp + AvFILLp(av);
5645 }
5646 else {
5647 /* optimisation: only a single backref, stored directly */
5648 svp = (SV**)&av;
5649 last = svp;
5650 }
5651
5652 if (svp) {
86f55936
NC
5653 while (svp <= last) {
5654 if (*svp) {
5655 SV *const referrer = *svp;
5656 if (SvWEAKREF(referrer)) {
5657 /* XXX Should we check that it hasn't changed? */
4c74a7df 5658 assert(SvROK(referrer));
86f55936
NC
5659 SvRV_set(referrer, 0);
5660 SvOK_off(referrer);
5661 SvWEAKREF_off(referrer);
1e73acc8 5662 SvSETMAGIC(referrer);
86f55936
NC
5663 } else if (SvTYPE(referrer) == SVt_PVGV ||
5664 SvTYPE(referrer) == SVt_PVLV) {
803f2748 5665 assert(SvTYPE(sv) == SVt_PVHV); /* stash backref */
86f55936
NC
5666 /* You lookin' at me? */
5667 assert(GvSTASH(referrer));
1d193675 5668 assert(GvSTASH(referrer) == (const HV *)sv);
86f55936 5669 GvSTASH(referrer) = 0;
803f2748
DM
5670 } else if (SvTYPE(referrer) == SVt_PVCV ||
5671 SvTYPE(referrer) == SVt_PVFM) {
5672 if (SvTYPE(sv) == SVt_PVHV) { /* stash backref */
5673 /* You lookin' at me? */
5674 assert(CvSTASH(referrer));
5675 assert(CvSTASH(referrer) == (const HV *)sv);
c68d9564 5676 SvANY(MUTABLE_CV(referrer))->xcv_stash = 0;
803f2748
DM
5677 }
5678 else {
5679 assert(SvTYPE(sv) == SVt_PVGV);
5680 /* You lookin' at me? */
5681 assert(CvGV(referrer));
5682 assert(CvGV(referrer) == (const GV *)sv);
5683 anonymise_cv_maybe(MUTABLE_GV(sv),
5684 MUTABLE_CV(referrer));
5685 }
5686
86f55936
NC
5687 } else {
5688 Perl_croak(aTHX_
5689 "panic: magic_killbackrefs (flags=%"UVxf")",
5690 (UV)SvFLAGS(referrer));
5691 }
5692
5648c0ae
DM
5693 if (is_array)
5694 *svp = NULL;
86f55936
NC
5695 }
5696 svp++;
5697 }
5648c0ae
DM
5698 }
5699 if (is_array) {
cef0c2ea 5700 AvFILLp(av) = -1;
5648c0ae 5701 SvREFCNT_dec(av); /* remove extra count added by sv_add_backref() */
86f55936 5702 }
5648c0ae 5703 return;
86f55936
NC
5704}
5705
954c1994
GS
5706/*
5707=for apidoc sv_insert
5708
5709Inserts a string at the specified offset/length within the SV. Similar to
c0dd94a0 5710the Perl substr() function. Handles get magic.
954c1994 5711
c0dd94a0
VP
5712=for apidoc sv_insert_flags
5713
5714Same as C<sv_insert>, but the extra C<flags> are passed the C<SvPV_force_flags> that applies to C<bigstr>.
5715
5716=cut
5717*/
5718
5719void
5720Perl_sv_insert_flags(pTHX_ SV *const bigstr, const STRLEN offset, const STRLEN len, const char *const little, const STRLEN littlelen, const U32 flags)
5721{
97aff369 5722 dVAR;
79072805
LW
5723 register char *big;
5724 register char *mid;
5725 register char *midend;
5726 register char *bigend;
5727 register I32 i;
6ff81951 5728 STRLEN curlen;
1c846c1f 5729
27aecdc6 5730 PERL_ARGS_ASSERT_SV_INSERT_FLAGS;
79072805 5731
8990e307 5732 if (!bigstr)
cea2e8a9 5733 Perl_croak(aTHX_ "Can't modify non-existent substring");
c0dd94a0 5734 SvPV_force_flags(bigstr, curlen, flags);
60fa28ff 5735 (void)SvPOK_only_UTF8(bigstr);
6ff81951
GS
5736 if (offset + len > curlen) {
5737 SvGROW(bigstr, offset+len+1);
93524f2b 5738 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
6ff81951
GS
5739 SvCUR_set(bigstr, offset+len);
5740 }
79072805 5741
69b47968 5742 SvTAINT(bigstr);
79072805
LW
5743 i = littlelen - len;
5744 if (i > 0) { /* string might grow */
a0d0e21e 5745 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
5746 mid = big + offset + len;
5747 midend = bigend = big + SvCUR(bigstr);
5748 bigend += i;
5749 *bigend = '\0';
5750 while (midend > mid) /* shove everything down */
5751 *--bigend = *--midend;
5752 Move(little,big+offset,littlelen,char);
b162af07 5753 SvCUR_set(bigstr, SvCUR(bigstr) + i);
79072805
LW
5754 SvSETMAGIC(bigstr);
5755 return;
5756 }
5757 else if (i == 0) {
463ee0b2 5758 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
5759 SvSETMAGIC(bigstr);
5760 return;
5761 }
5762
463ee0b2 5763 big = SvPVX(bigstr);
79072805
LW
5764 mid = big + offset;
5765 midend = mid + len;
5766 bigend = big + SvCUR(bigstr);
5767
5768 if (midend > bigend)
cea2e8a9 5769 Perl_croak(aTHX_ "panic: sv_insert");
79072805
LW
5770
5771 if (mid - big > bigend - midend) { /* faster to shorten from end */
5772 if (littlelen) {
5773 Move(little, mid, littlelen,char);
5774 mid += littlelen;
5775 }
5776 i = bigend - midend;
5777 if (i > 0) {
5778 Move(midend, mid, i,char);
5779 mid += i;
5780 }
5781 *mid = '\0';
5782 SvCUR_set(bigstr, mid - big);
5783 }
155aba94 5784 else if ((i = mid - big)) { /* faster from front */
79072805
LW
5785 midend -= littlelen;
5786 mid = midend;
0d3c21b0 5787 Move(big, midend - i, i, char);
79072805 5788 sv_chop(bigstr,midend-i);
79072805
LW
5789 if (littlelen)
5790 Move(little, mid, littlelen,char);
5791 }
5792 else if (littlelen) {
5793 midend -= littlelen;
5794 sv_chop(bigstr,midend);
5795 Move(little,midend,littlelen,char);
5796 }
5797 else {
5798 sv_chop(bigstr,midend);
5799 }
5800 SvSETMAGIC(bigstr);
5801}
5802
c461cf8f
JH
5803/*
5804=for apidoc sv_replace
5805
5806Make the first argument a copy of the second, then delete the original.
645c22ef
DM
5807The target SV physically takes over ownership of the body of the source SV
5808and inherits its flags; however, the target keeps any magic it owns,
5809and any magic in the source is discarded.
ff276b08 5810Note that this is a rather specialist SV copying operation; most of the
645c22ef 5811time you'll want to use C<sv_setsv> or one of its many macro front-ends.
c461cf8f
JH
5812
5813=cut
5814*/
79072805
LW
5815
5816void
af828c01 5817Perl_sv_replace(pTHX_ register SV *const sv, register SV *const nsv)
79072805 5818{
97aff369 5819 dVAR;
a3b680e6 5820 const U32 refcnt = SvREFCNT(sv);
7918f24d
NC
5821
5822 PERL_ARGS_ASSERT_SV_REPLACE;
5823
765f542d 5824 SV_CHECK_THINKFIRST_COW_DROP(sv);
30e5c352 5825 if (SvREFCNT(nsv) != 1) {
fe13d51d
JM
5826 Perl_croak(aTHX_ "panic: reference miscount on nsv in sv_replace()"
5827 " (%" UVuf " != 1)", (UV) SvREFCNT(nsv));
30e5c352 5828 }
93a17b20 5829 if (SvMAGICAL(sv)) {
a0d0e21e
LW
5830 if (SvMAGICAL(nsv))
5831 mg_free(nsv);
5832 else
5833 sv_upgrade(nsv, SVt_PVMG);
b162af07 5834 SvMAGIC_set(nsv, SvMAGIC(sv));
a0d0e21e 5835 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20 5836 SvMAGICAL_off(sv);
b162af07 5837 SvMAGIC_set(sv, NULL);
93a17b20 5838 }
79072805
LW
5839 SvREFCNT(sv) = 0;
5840 sv_clear(sv);
477f5d66 5841 assert(!SvREFCNT(sv));
fd0854ff
DM
5842#ifdef DEBUG_LEAKING_SCALARS
5843 sv->sv_flags = nsv->sv_flags;
5844 sv->sv_any = nsv->sv_any;
5845 sv->sv_refcnt = nsv->sv_refcnt;
f34d0642 5846 sv->sv_u = nsv->sv_u;
fd0854ff 5847#else
79072805 5848 StructCopy(nsv,sv,SV);
fd0854ff 5849#endif
4df7f6af 5850 if(SvTYPE(sv) == SVt_IV) {
7b2c381c 5851 SvANY(sv)
339049b0 5852 = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
7b2c381c
NC
5853 }
5854
fd0854ff 5855
f8c7b90f 5856#ifdef PERL_OLD_COPY_ON_WRITE
d3d0e6f1
NC
5857 if (SvIsCOW_normal(nsv)) {
5858 /* We need to follow the pointers around the loop to make the
5859 previous SV point to sv, rather than nsv. */
5860 SV *next;
5861 SV *current = nsv;
5862 while ((next = SV_COW_NEXT_SV(current)) != nsv) {
5863 assert(next);
5864 current = next;
3f7c398e 5865 assert(SvPVX_const(current) == SvPVX_const(nsv));
d3d0e6f1
NC
5866 }
5867 /* Make the SV before us point to the SV after us. */
5868 if (DEBUG_C_TEST) {
5869 PerlIO_printf(Perl_debug_log, "previous is\n");
5870 sv_dump(current);
a29f6d03
NC
5871 PerlIO_printf(Perl_debug_log,
5872 "move it from 0x%"UVxf" to 0x%"UVxf"\n",
d3d0e6f1
NC
5873 (UV) SV_COW_NEXT_SV(current), (UV) sv);
5874 }
a29f6d03 5875 SV_COW_NEXT_SV_SET(current, sv);
d3d0e6f1
NC
5876 }
5877#endif
79072805 5878 SvREFCNT(sv) = refcnt;
1edc1566 5879 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
39cf41c2 5880 SvREFCNT(nsv) = 0;
463ee0b2 5881 del_SV(nsv);
79072805
LW
5882}
5883
803f2748
DM
5884/* We're about to free a GV which has a CV that refers back to us.
5885 * If that CV will outlive us, make it anonymous (i.e. fix up its CvGV
5886 * field) */
5887
5888STATIC void
5889S_anonymise_cv_maybe(pTHX_ GV *gv, CV* cv)
5890{
5891 char *stash;
5892 SV *gvname;
5893 GV *anongv;
5894
5895 PERL_ARGS_ASSERT_ANONYMISE_CV_MAYBE;
5896
5897 /* be assertive! */
5898 assert(SvREFCNT(gv) == 0);
5899 assert(isGV(gv) && isGV_with_GP(gv));
5900 assert(GvGP(gv));
5901 assert(!CvANON(cv));
5902 assert(CvGV(cv) == gv);
5903
5904 /* will the CV shortly be freed by gp_free() ? */
5905 if (GvCV(gv) == cv && GvGP(gv)->gp_refcnt < 2 && SvREFCNT(cv) < 2) {
b3f91e91 5906 SvANY(cv)->xcv_gv = NULL;
803f2748
DM
5907 return;
5908 }
5909
5910 /* if not, anonymise: */
5911 stash = GvSTASH(gv) ? HvNAME(GvSTASH(gv)) : NULL;
5912 gvname = Perl_newSVpvf(aTHX_ "%s::__ANON__",
5913 stash ? stash : "__ANON__");
5914 anongv = gv_fetchsv(gvname, GV_ADDMULTI, SVt_PVCV);
5915 SvREFCNT_dec(gvname);
5916
5917 CvANON_on(cv);
cfc1e951 5918 CvCVGV_RC_on(cv);
b3f91e91 5919 SvANY(cv)->xcv_gv = MUTABLE_GV(SvREFCNT_inc(anongv));
803f2748
DM
5920}
5921
5922
c461cf8f
JH
5923/*
5924=for apidoc sv_clear
5925
645c22ef
DM
5926Clear an SV: call any destructors, free up any memory used by the body,
5927and free the body itself. The SV's head is I<not> freed, although
5928its type is set to all 1's so that it won't inadvertently be assumed
5929to be live during global destruction etc.
5930This function should only be called when REFCNT is zero. Most of the time
5931you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
5932instead.
c461cf8f
JH
5933
5934=cut
5935*/
5936
79072805 5937void
5239d5c4 5938Perl_sv_clear(pTHX_ SV *const orig_sv)
79072805 5939{
27da23d5 5940 dVAR;
dd69841b 5941 HV *stash;
5239d5c4
DM
5942 U32 type;
5943 const struct body_details *sv_type_details;
5944 SV* iter_sv = NULL;
5945 SV* next_sv = NULL;
5946 register SV *sv = orig_sv;
82bb6deb 5947
7918f24d 5948 PERL_ARGS_ASSERT_SV_CLEAR;
5239d5c4
DM
5949
5950 /* within this loop, sv is the SV currently being freed, and
5951 * iter_sv is the most recent AV or whatever that's being iterated
5952 * over to provide more SVs */
5953
5954 while (sv) {
5955
df90f6af
DM
5956 type = SvTYPE(sv);
5957
5958 assert(SvREFCNT(sv) == 0);
5959 assert(SvTYPE(sv) != SVTYPEMASK);
5960
5961 if (type <= SVt_IV) {
5962 /* See the comment in sv.h about the collusion between this
5963 * early return and the overloading of the NULL slots in the
5964 * size table. */
5965 if (SvROK(sv))
5966 goto free_rv;
5967 SvFLAGS(sv) &= SVf_BREAK;
5968 SvFLAGS(sv) |= SVTYPEMASK;
5969 goto free_head;
5970 }
82bb6deb 5971
df90f6af
DM
5972 if (SvOBJECT(sv)) {
5973 if (PL_defstash && /* Still have a symbol table? */
5974 SvDESTROYABLE(sv))
5975 {
5976 dSP;
5977 HV* stash;
5978 do {
5979 CV* destructor;
5980 stash = SvSTASH(sv);
5981 destructor = StashHANDLER(stash,DESTROY);
5982 if (destructor
99ab892b
NC
5983 /* A constant subroutine can have no side effects, so
5984 don't bother calling it. */
5985 && !CvCONST(destructor)
fbb3ee5a
RGS
5986 /* Don't bother calling an empty destructor */
5987 && (CvISXSUB(destructor)
1f15e670 5988 || (CvSTART(destructor)
df90f6af
DM
5989 && (CvSTART(destructor)->op_next->op_type
5990 != OP_LEAVESUB))))
5991 {
5992 SV* const tmpref = newRV(sv);
5993 SvREADONLY_on(tmpref); /* DESTROY() could be naughty */
5994 ENTER;
5995 PUSHSTACKi(PERLSI_DESTROY);
5996 EXTEND(SP, 2);
5997 PUSHMARK(SP);
5998 PUSHs(tmpref);
5999 PUTBACK;
6000 call_sv(MUTABLE_SV(destructor),
6001 G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
6002 POPSTACK;
6003 SPAGAIN;
6004 LEAVE;
6005 if(SvREFCNT(tmpref) < 2) {
6006 /* tmpref is not kept alive! */
6007 SvREFCNT(sv)--;
6008 SvRV_set(tmpref, NULL);
6009 SvROK_off(tmpref);
6010 }
6011 SvREFCNT_dec(tmpref);
5cc433a6 6012 }
df90f6af 6013 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 6014
6f44e0a4 6015
df90f6af
DM
6016 if (SvREFCNT(sv)) {
6017 if (PL_in_clean_objs)
6018 Perl_croak(aTHX_
6019 "DESTROY created new reference to dead object '%s'",
6020 HvNAME_get(stash));
6021 /* DESTROY gave object new lease on life */
6022 goto get_next_sv;
6023 }
6f44e0a4 6024 }
4e8e7886 6025
df90f6af
DM
6026 if (SvOBJECT(sv)) {
6027 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
6028 SvOBJECT_off(sv); /* Curse the object. */
6029 if (type != SVt_PVIO)
6030 --PL_sv_objcount;/* XXX Might want something more general */
6031 }
93578b34 6032 }
df90f6af
DM
6033 if (type >= SVt_PVMG) {
6034 if (type == SVt_PVMG && SvPAD_OUR(sv)) {
6035 SvREFCNT_dec(SvOURSTASH(sv));
6036 } else if (SvMAGIC(sv))
6037 mg_free(sv);
6038 if (type == SVt_PVMG && SvPAD_TYPED(sv))
6039 SvREFCNT_dec(SvSTASH(sv));
e7fab884 6040 }
df90f6af
DM
6041 switch (type) {
6042 /* case SVt_BIND: */
6043 case SVt_PVIO:
6044 if (IoIFP(sv) &&
6045 IoIFP(sv) != PerlIO_stdin() &&
6046 IoIFP(sv) != PerlIO_stdout() &&
6047 IoIFP(sv) != PerlIO_stderr() &&
6048 !(IoFLAGS(sv) & IOf_FAKE_DIRP))
6049 {
6050 io_close(MUTABLE_IO(sv), FALSE);
5239d5c4 6051 }
df90f6af
DM
6052 if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
6053 PerlDir_close(IoDIRP(sv));
6054 IoDIRP(sv) = (DIR*)NULL;
6055 Safefree(IoTOP_NAME(sv));
6056 Safefree(IoFMT_NAME(sv));
6057 Safefree(IoBOTTOM_NAME(sv));
6058 goto freescalar;
6059 case SVt_REGEXP:
6060 /* FIXME for plugins */
6061 pregfree2((REGEXP*) sv);
6062 goto freescalar;
6063 case SVt_PVCV:
6064 case SVt_PVFM:
6065 cv_undef(MUTABLE_CV(sv));
6066 /* If we're in a stash, we don't own a reference to it.
6067 * However it does have a back reference to us, which needs to
6068 * be cleared. */
6069 if ((stash = CvSTASH(sv)))
6070 sv_del_backref(MUTABLE_SV(stash), sv);
6071 goto freescalar;
6072 case SVt_PVHV:
6073 if (PL_last_swash_hv == (const HV *)sv) {
6074 PL_last_swash_hv = NULL;
5239d5c4 6075 }
df90f6af 6076 Perl_hv_kill_backrefs(aTHX_ MUTABLE_HV(sv));
745edda6 6077 Perl_hv_undef_flags(aTHX_ MUTABLE_HV(sv), HV_NAME_SETALL);
df90f6af
DM
6078 break;
6079 case SVt_PVAV:
db93c0c4 6080 {
df90f6af
DM
6081 AV* av = MUTABLE_AV(sv);
6082 if (PL_comppad == av) {
6083 PL_comppad = NULL;
6084 PL_curpad = NULL;
6085 }
6086 if (AvREAL(av) && AvFILLp(av) > -1) {
6087 next_sv = AvARRAY(av)[AvFILLp(av)--];
6088 /* save old iter_sv in top-most slot of AV,
6089 * and pray that it doesn't get wiped in the meantime */
6090 AvARRAY(av)[AvMAX(av)] = iter_sv;
6091 iter_sv = sv;
6092 goto get_next_sv; /* process this new sv */
6093 }
6094 Safefree(AvALLOC(av));
db93c0c4 6095 }
df90f6af
DM
6096
6097 break;
6098 case SVt_PVLV:
6099 if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
6100 SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv)));
6101 HeNEXT((HE*)LvTARG(sv)) = PL_hv_fetch_ent_mh;
6102 PL_hv_fetch_ent_mh = (HE*)LvTARG(sv);
6103 }
6104 else if (LvTYPE(sv) != 't') /* unless tie: unrefcnted fake SV** */
6105 SvREFCNT_dec(LvTARG(sv));
6106 case SVt_PVGV:
6107 if (isGV_with_GP(sv)) {
6108 if(GvCVu((const GV *)sv) && (stash = GvSTASH(MUTABLE_GV(sv)))
00169e2c 6109 && HvENAME_get(stash))
df90f6af
DM
6110 mro_method_changed_in(stash);
6111 gp_free(MUTABLE_GV(sv));
6112 if (GvNAME_HEK(sv))
6113 unshare_hek(GvNAME_HEK(sv));
6114 /* If we're in a stash, we don't own a reference to it.
6115 * However it does have a back reference to us, which
6116 * needs to be cleared. */
6117 if (!SvVALID(sv) && (stash = GvSTASH(sv)))
6118 sv_del_backref(MUTABLE_SV(stash), sv);
6119 }
6120 /* FIXME. There are probably more unreferenced pointers to SVs
6121 * in the interpreter struct that we should check and tidy in
6122 * a similar fashion to this: */
6123 if ((const GV *)sv == PL_last_in_gv)
6124 PL_last_in_gv = NULL;
6125 case SVt_PVMG:
6126 case SVt_PVNV:
6127 case SVt_PVIV:
6128 case SVt_PV:
6129 freescalar:
6130 /* Don't bother with SvOOK_off(sv); as we're only going to
6131 * free it. */
6132 if (SvOOK(sv)) {
6133 STRLEN offset;
6134 SvOOK_offset(sv, offset);
6135 SvPV_set(sv, SvPVX_mutable(sv) - offset);
6136 /* Don't even bother with turning off the OOK flag. */
6137 }
6138 if (SvROK(sv)) {
6139 free_rv:
6140 {
6141 SV * const target = SvRV(sv);
6142 if (SvWEAKREF(sv))
6143 sv_del_backref(target, sv);
6144 else
b98b62bc 6145 next_sv = target;
5302ffd4 6146 }
df90f6af
DM
6147 }
6148#ifdef PERL_OLD_COPY_ON_WRITE
6149 else if (SvPVX_const(sv)
6150 && !(SvTYPE(sv) == SVt_PVIO
6151 && !(IoFLAGS(sv) & IOf_FAKE_DIRP)))
6152 {
6153 if (SvIsCOW(sv)) {
6154 if (DEBUG_C_TEST) {
6155 PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
6156 sv_dump(sv);
6157 }
6158 if (SvLEN(sv)) {
6159 sv_release_COW(sv, SvPVX_const(sv), SV_COW_NEXT_SV(sv));
6160 } else {
6161 unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
6162 }
5302ffd4 6163
df90f6af
DM
6164 SvFAKE_off(sv);
6165 } else if (SvLEN(sv)) {
6166 Safefree(SvPVX_const(sv));
6167 }
6168 }
765f542d 6169#else
df90f6af
DM
6170 else if (SvPVX_const(sv) && SvLEN(sv)
6171 && !(SvTYPE(sv) == SVt_PVIO
6172 && !(IoFLAGS(sv) & IOf_FAKE_DIRP)))
6173 Safefree(SvPVX_mutable(sv));
6174 else if (SvPVX_const(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
6175 unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
6176 SvFAKE_off(sv);
6177 }
765f542d 6178#endif
df90f6af
DM
6179 break;
6180 case SVt_NV:
6181 break;
6182 }
79072805 6183
df90f6af 6184 free_body:
5239d5c4 6185
df90f6af
DM
6186 SvFLAGS(sv) &= SVf_BREAK;
6187 SvFLAGS(sv) |= SVTYPEMASK;
893645bd 6188
df90f6af
DM
6189 sv_type_details = bodies_by_type + type;
6190 if (sv_type_details->arena) {
6191 del_body(((char *)SvANY(sv) + sv_type_details->offset),
6192 &PL_body_roots[type]);
6193 }
6194 else if (sv_type_details->body_size) {
6195 safefree(SvANY(sv));
6196 }
5239d5c4
DM
6197
6198 free_head:
6199 /* caller is responsible for freeing the head of the original sv */
6200 if (sv != orig_sv && !SvREFCNT(sv))
6201 del_SV(sv);
6202
6203 /* grab and free next sv, if any */
6204 get_next_sv:
6205 while (1) {
6206 sv = NULL;
6207 if (next_sv) {
6208 sv = next_sv;
6209 next_sv = NULL;
6210 }
6211 else if (!iter_sv) {
6212 break;
6213 } else if (SvTYPE(iter_sv) == SVt_PVAV) {
6214 AV *const av = (AV*)iter_sv;
6215 if (AvFILLp(av) > -1) {
6216 sv = AvARRAY(av)[AvFILLp(av)--];
6217 }
6218 else { /* no more elements of current AV to free */
6219 sv = iter_sv;
6220 type = SvTYPE(sv);
6221 /* restore previous value, squirrelled away */
6222 iter_sv = AvARRAY(av)[AvMAX(av)];
6223 Safefree(AvALLOC(av));
6224 goto free_body;
6225 }
6226 }
6227
6228 /* unrolled SvREFCNT_dec and sv_free2 follows: */
6229
6230 if (!sv)
6231 continue;
6232 if (!SvREFCNT(sv)) {
6233 sv_free(sv);
6234 continue;
6235 }
6236 if (--(SvREFCNT(sv)))
6237 continue;
df90f6af 6238#ifdef DEBUGGING
5239d5c4
DM
6239 if (SvTEMP(sv)) {
6240 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING),
6241 "Attempt to free temp prematurely: SV 0x%"UVxf
6242 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
6243 continue;
6244 }
df90f6af 6245#endif
5239d5c4
DM
6246 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
6247 /* make sure SvREFCNT(sv)==0 happens very seldom */
6248 SvREFCNT(sv) = (~(U32)0)/2;
6249 continue;
6250 }
6251 break;
6252 } /* while 1 */
6253
6254 } /* while sv */
79072805
LW
6255}
6256
645c22ef
DM
6257/*
6258=for apidoc sv_newref
6259
6260Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
6261instead.
6262
6263=cut
6264*/
6265
79072805 6266SV *
af828c01 6267Perl_sv_newref(pTHX_ SV *const sv)
79072805 6268{
96a5add6 6269 PERL_UNUSED_CONTEXT;
463ee0b2 6270 if (sv)
4db098f4 6271 (SvREFCNT(sv))++;
79072805
LW
6272 return sv;
6273}
6274
c461cf8f
JH
6275/*
6276=for apidoc sv_free
6277
645c22ef
DM
6278Decrement an SV's reference count, and if it drops to zero, call
6279C<sv_clear> to invoke destructors and free up any memory used by
6280the body; finally, deallocate the SV's head itself.
6281Normally called via a wrapper macro C<SvREFCNT_dec>.
c461cf8f
JH
6282
6283=cut
6284*/
6285
79072805 6286void
af828c01 6287Perl_sv_free(pTHX_ SV *const sv)
79072805 6288{
27da23d5 6289 dVAR;
79072805
LW
6290 if (!sv)
6291 return;
a0d0e21e
LW
6292 if (SvREFCNT(sv) == 0) {
6293 if (SvFLAGS(sv) & SVf_BREAK)
645c22ef
DM
6294 /* this SV's refcnt has been artificially decremented to
6295 * trigger cleanup */
a0d0e21e 6296 return;
3280af22 6297 if (PL_in_clean_all) /* All is fair */
1edc1566 6298 return;
d689ffdd
JP
6299 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
6300 /* make sure SvREFCNT(sv)==0 happens very seldom */
6301 SvREFCNT(sv) = (~(U32)0)/2;
6302 return;
6303 }
41e4abd8 6304 if (ckWARN_d(WARN_INTERNAL)) {
41e4abd8
NC
6305#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
6306 Perl_dump_sv_child(aTHX_ sv);
e4c5322d
DM
6307#else
6308 #ifdef DEBUG_LEAKING_SCALARS
bfd95973 6309 sv_dump(sv);
e4c5322d 6310 #endif
bfd95973
NC
6311#ifdef DEBUG_LEAKING_SCALARS_ABORT
6312 if (PL_warnhook == PERL_WARNHOOK_FATAL
6313 || ckDEAD(packWARN(WARN_INTERNAL))) {
6314 /* Don't let Perl_warner cause us to escape our fate: */
6315 abort();
6316 }
6317#endif
6318 /* This may not return: */
6319 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
6320 "Attempt to free unreferenced scalar: SV 0x%"UVxf
6321 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
41e4abd8
NC
6322#endif
6323 }
77abb4c6
NC
6324#ifdef DEBUG_LEAKING_SCALARS_ABORT
6325 abort();
6326#endif
79072805
LW
6327 return;
6328 }
4db098f4 6329 if (--(SvREFCNT(sv)) > 0)
8990e307 6330 return;
8c4d3c90
NC
6331 Perl_sv_free2(aTHX_ sv);
6332}
6333
6334void
af828c01 6335Perl_sv_free2(pTHX_ SV *const sv)
8c4d3c90 6336{
27da23d5 6337 dVAR;
7918f24d
NC
6338
6339 PERL_ARGS_ASSERT_SV_FREE2;
6340
463ee0b2
LW
6341#ifdef DEBUGGING
6342 if (SvTEMP(sv)) {
9b387841
NC
6343 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING),
6344 "Attempt to free temp prematurely: SV 0x%"UVxf
6345 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
79072805 6346 return;
79072805 6347 }
463ee0b2 6348#endif
d689ffdd
JP
6349 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
6350 /* make sure SvREFCNT(sv)==0 happens very seldom */
6351 SvREFCNT(sv) = (~(U32)0)/2;
6352 return;
6353 }
79072805 6354 sv_clear(sv);
477f5d66
CS
6355 if (! SvREFCNT(sv))
6356 del_SV(sv);
79072805
LW
6357}
6358
954c1994
GS
6359/*
6360=for apidoc sv_len
6361
645c22ef
DM
6362Returns the length of the string in the SV. Handles magic and type
6363coercion. See also C<SvCUR>, which gives raw access to the xpv_cur slot.
954c1994
GS
6364
6365=cut
6366*/
6367
79072805 6368STRLEN
af828c01 6369Perl_sv_len(pTHX_ register SV *const sv)
79072805 6370{
463ee0b2 6371 STRLEN len;
79072805
LW
6372
6373 if (!sv)
6374 return 0;
6375
8990e307 6376 if (SvGMAGICAL(sv))
565764a8 6377 len = mg_length(sv);
8990e307 6378 else
4d84ee25 6379 (void)SvPV_const(sv, len);
463ee0b2 6380 return len;
79072805
LW
6381}
6382
c461cf8f
JH
6383/*
6384=for apidoc sv_len_utf8
6385
6386Returns the number of characters in the string in an SV, counting wide
1e54db1a 6387UTF-8 bytes as a single character. Handles magic and type coercion.
c461cf8f
JH
6388
6389=cut
6390*/
6391
7e8c5dac 6392/*
c05a5c57 6393 * The length is cached in PERL_MAGIC_utf8, in the mg_len field. Also the
9564a3bd
NC
6394 * mg_ptr is used, by sv_pos_u2b() and sv_pos_b2u() - see the comments below.
6395 * (Note that the mg_len is not the length of the mg_ptr field.
6396 * This allows the cache to store the character length of the string without
6397 * needing to malloc() extra storage to attach to the mg_ptr.)
7a5fa8a2 6398 *
7e8c5dac
HS
6399 */
6400
a0ed51b3 6401STRLEN
af828c01 6402Perl_sv_len_utf8(pTHX_ register SV *const sv)
a0ed51b3 6403{
a0ed51b3
LW
6404 if (!sv)
6405 return 0;
6406
a0ed51b3 6407 if (SvGMAGICAL(sv))
b76347f2 6408 return mg_length(sv);
a0ed51b3 6409 else
b76347f2 6410 {
26346457 6411 STRLEN len;
e62f0680 6412 const U8 *s = (U8*)SvPV_const(sv, len);
7e8c5dac 6413
26346457
NC
6414 if (PL_utf8cache) {
6415 STRLEN ulen;
fe5bfecd 6416 MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : NULL;
26346457 6417
6ef2ab89
NC
6418 if (mg && (mg->mg_len != -1 || mg->mg_ptr)) {
6419 if (mg->mg_len != -1)
6420 ulen = mg->mg_len;
6421 else {
6422 /* We can use the offset cache for a headstart.
6423 The longer value is stored in the first pair. */
6424 STRLEN *cache = (STRLEN *) mg->mg_ptr;
6425
6426 ulen = cache[0] + Perl_utf8_length(aTHX_ s + cache[1],
6427 s + len);
6428 }
6429
26346457
NC
6430 if (PL_utf8cache < 0) {
6431 const STRLEN real = Perl_utf8_length(aTHX_ s, s + len);
9df83ffd 6432 assert_uft8_cache_coherent("sv_len_utf8", ulen, real, sv);
26346457
NC
6433 }
6434 }
6435 else {
6436 ulen = Perl_utf8_length(aTHX_ s, s + len);
ec49a12c 6437 utf8_mg_len_cache_update(sv, &mg, ulen);
cb9e20bb 6438 }
26346457 6439 return ulen;
7e8c5dac 6440 }
26346457 6441 return Perl_utf8_length(aTHX_ s, s + len);
7e8c5dac
HS
6442 }
6443}
6444
9564a3bd
NC
6445/* Walk forwards to find the byte corresponding to the passed in UTF-8
6446 offset. */
bdf30dd6 6447static STRLEN
721e86b6 6448S_sv_pos_u2b_forwards(const U8 *const start, const U8 *const send,
79d2d448 6449 STRLEN *const uoffset_p, bool *const at_end)
bdf30dd6
NC
6450{
6451 const U8 *s = start;
3e2d3818 6452 STRLEN uoffset = *uoffset_p;
bdf30dd6 6453
7918f24d
NC
6454 PERL_ARGS_ASSERT_SV_POS_U2B_FORWARDS;
6455
3e2d3818
NC
6456 while (s < send && uoffset) {
6457 --uoffset;
bdf30dd6 6458 s += UTF8SKIP(s);
3e2d3818 6459 }
79d2d448
NC
6460 if (s == send) {
6461 *at_end = TRUE;
6462 }
6463 else if (s > send) {
6464 *at_end = TRUE;
bdf30dd6
NC
6465 /* This is the existing behaviour. Possibly it should be a croak, as
6466 it's actually a bounds error */
6467 s = send;
6468 }
3e2d3818 6469 *uoffset_p -= uoffset;
bdf30dd6
NC
6470 return s - start;
6471}
6472
9564a3bd
NC
6473/* Given the length of the string in both bytes and UTF-8 characters, decide
6474 whether to walk forwards or backwards to find the byte corresponding to
6475 the passed in UTF-8 offset. */
c336ad0b 6476static STRLEN
721e86b6 6477S_sv_pos_u2b_midway(const U8 *const start, const U8 *send,
503752a1 6478 STRLEN uoffset, const STRLEN uend)
c336ad0b
NC
6479{
6480 STRLEN backw = uend - uoffset;
7918f24d
NC
6481
6482 PERL_ARGS_ASSERT_SV_POS_U2B_MIDWAY;
6483
c336ad0b 6484 if (uoffset < 2 * backw) {
25a8a4ef 6485 /* The assumption is that going forwards is twice the speed of going
c336ad0b
NC
6486 forward (that's where the 2 * backw comes from).
6487 (The real figure of course depends on the UTF-8 data.) */
503752a1
NC
6488 const U8 *s = start;
6489
6490 while (s < send && uoffset--)
6491 s += UTF8SKIP(s);
6492 assert (s <= send);
6493 if (s > send)
6494 s = send;
6495 return s - start;
c336ad0b
NC
6496 }
6497
6498 while (backw--) {
6499 send--;
6500 while (UTF8_IS_CONTINUATION(*send))
6501 send--;
6502 }
6503 return send - start;
6504}
6505
9564a3bd
NC
6506/* For the string representation of the given scalar, find the byte
6507 corresponding to the passed in UTF-8 offset. uoffset0 and boffset0
6508 give another position in the string, *before* the sought offset, which
6509 (which is always true, as 0, 0 is a valid pair of positions), which should
6510 help reduce the amount of linear searching.
6511 If *mgp is non-NULL, it should point to the UTF-8 cache magic, which
6512 will be used to reduce the amount of linear searching. The cache will be
6513 created if necessary, and the found value offered to it for update. */
28ccbf94 6514static STRLEN
af828c01 6515S_sv_pos_u2b_cached(pTHX_ SV *const sv, MAGIC **const mgp, const U8 *const start,
3e2d3818 6516 const U8 *const send, STRLEN uoffset,
7918f24d
NC
6517 STRLEN uoffset0, STRLEN boffset0)
6518{
7087a21c 6519 STRLEN boffset = 0; /* Actually always set, but let's keep gcc happy. */
c336ad0b 6520 bool found = FALSE;
79d2d448 6521 bool at_end = FALSE;
c336ad0b 6522
7918f24d
NC
6523 PERL_ARGS_ASSERT_SV_POS_U2B_CACHED;
6524
75c33c12
NC
6525 assert (uoffset >= uoffset0);
6526
48f9cf71
NC
6527 if (!uoffset)
6528 return 0;
6529
f89a570b
CS
6530 if (!SvREADONLY(sv)
6531 && PL_utf8cache
6532 && (*mgp || (SvTYPE(sv) >= SVt_PVMG &&
6533 (*mgp = mg_find(sv, PERL_MAGIC_utf8))))) {
d8b2e1f9
NC
6534 if ((*mgp)->mg_ptr) {
6535 STRLEN *cache = (STRLEN *) (*mgp)->mg_ptr;
6536 if (cache[0] == uoffset) {
6537 /* An exact match. */
6538 return cache[1];
6539 }
ab455f60
NC
6540 if (cache[2] == uoffset) {
6541 /* An exact match. */
6542 return cache[3];
6543 }
668af93f
NC
6544
6545 if (cache[0] < uoffset) {
d8b2e1f9
NC
6546 /* The cache already knows part of the way. */
6547 if (cache[0] > uoffset0) {
6548 /* The cache knows more than the passed in pair */
6549 uoffset0 = cache[0];
6550 boffset0 = cache[1];
6551 }
6552 if ((*mgp)->mg_len != -1) {
6553 /* And we know the end too. */
6554 boffset = boffset0
721e86b6 6555 + sv_pos_u2b_midway(start + boffset0, send,
d8b2e1f9
NC
6556 uoffset - uoffset0,
6557 (*mgp)->mg_len - uoffset0);
6558 } else {
3e2d3818 6559 uoffset -= uoffset0;
d8b2e1f9 6560 boffset = boffset0
721e86b6 6561 + sv_pos_u2b_forwards(start + boffset0,
79d2d448 6562 send, &uoffset, &at_end);
3e2d3818 6563 uoffset += uoffset0;
d8b2e1f9 6564 }
dd7c5fd3
NC
6565 }
6566 else if (cache[2] < uoffset) {
6567 /* We're between the two cache entries. */
6568 if (cache[2] > uoffset0) {
6569 /* and the cache knows more than the passed in pair */
6570 uoffset0 = cache[2];
6571 boffset0 = cache[3];
6572 }
6573
668af93f 6574 boffset = boffset0
721e86b6 6575 + sv_pos_u2b_midway(start + boffset0,
668af93f
NC
6576 start + cache[1],
6577 uoffset - uoffset0,
6578 cache[0] - uoffset0);
dd7c5fd3
NC
6579 } else {
6580 boffset = boffset0
721e86b6 6581 + sv_pos_u2b_midway(start + boffset0,
dd7c5fd3
NC
6582 start + cache[3],
6583 uoffset - uoffset0,
6584 cache[2] - uoffset0);
d8b2e1f9 6585 }
668af93f 6586 found = TRUE;
d8b2e1f9
NC
6587 }
6588 else if ((*mgp)->mg_len != -1) {
75c33c12
NC
6589 /* If we can take advantage of a passed in offset, do so. */
6590 /* In fact, offset0 is either 0, or less than offset, so don't
6591 need to worry about the other possibility. */
6592 boffset = boffset0
721e86b6 6593 + sv_pos_u2b_midway(start + boffset0, send,
75c33c12
NC
6594 uoffset - uoffset0,
6595 (*mgp)->mg_len - uoffset0);
c336ad0b
NC
6596 found = TRUE;
6597 }
28ccbf94 6598 }
c336ad0b
NC
6599
6600 if (!found || PL_utf8cache < 0) {
3e2d3818
NC
6601 STRLEN real_boffset;
6602 uoffset -= uoffset0;
6603 real_boffset = boffset0 + sv_pos_u2b_forwards(start + boffset0,
79d2d448 6604 send, &uoffset, &at_end);
3e2d3818 6605 uoffset += uoffset0;
75c33c12 6606
9df83ffd
NC
6607 if (found && PL_utf8cache < 0)
6608 assert_uft8_cache_coherent("sv_pos_u2b_cache", boffset,
6609 real_boffset, sv);
c336ad0b 6610 boffset = real_boffset;
28ccbf94 6611 }
0905937d 6612
79d2d448
NC
6613 if (PL_utf8cache) {
6614 if (at_end)
6615 utf8_mg_len_cache_update(sv, mgp, uoffset);
6616 else
6617 utf8_mg_pos_cache_update(sv, mgp, boffset, uoffset, send - start);
6618 }
28ccbf94
NC
6619 return boffset;
6620}
6621
9564a3bd
NC
6622
6623/*
d931b1be 6624=for apidoc sv_pos_u2b_flags
9564a3bd
NC
6625
6626Converts the value pointed to by offsetp from a count of UTF-8 chars from
6627the start of the string, to a count of the equivalent number of bytes; if
6628lenp is non-zero, it does the same to lenp, but this time starting from
d931b1be
NC
6629the offset, rather than from the start of the string. Handles type coercion.
6630I<flags> is passed to C<SvPV_flags>, and usually should be
6631C<SV_GMAGIC|SV_CONST_RETURN> to handle magic.
9564a3bd
NC
6632
6633=cut
6634*/
6635
6636/*
d931b1be 6637 * sv_pos_u2b_flags() uses, like sv_pos_b2u(), the mg_ptr of the potential
c05a5c57 6638 * PERL_MAGIC_utf8 of the sv to store the mapping between UTF-8 and
9564a3bd
NC
6639 * byte offsets. See also the comments of S_utf8_mg_pos_cache_update().
6640 *
6641 */
6642
d931b1be
NC
6643STRLEN
6644Perl_sv_pos_u2b_flags(pTHX_ SV *const sv, STRLEN uoffset, STRLEN *const lenp,
6645 U32 flags)
a0ed51b3 6646{
245d4a47 6647 const U8 *start;
a0ed51b3 6648 STRLEN len;
d931b1be 6649 STRLEN boffset;
a0ed51b3 6650
d931b1be 6651 PERL_ARGS_ASSERT_SV_POS_U2B_FLAGS;
7918f24d 6652
d931b1be 6653 start = (U8*)SvPV_flags(sv, len, flags);
7e8c5dac 6654 if (len) {
bdf30dd6 6655 const U8 * const send = start + len;
0905937d 6656 MAGIC *mg = NULL;
d931b1be 6657 boffset = sv_pos_u2b_cached(sv, &mg, start, send, uoffset, 0, 0);
bdf30dd6 6658
48f9cf71
NC
6659 if (lenp
6660 && *lenp /* don't bother doing work for 0, as its bytes equivalent
6661 is 0, and *lenp is already set to that. */) {
28ccbf94 6662 /* Convert the relative offset to absolute. */
777f7c56 6663 const STRLEN uoffset2 = uoffset + *lenp;
721e86b6
AL
6664 const STRLEN boffset2
6665 = sv_pos_u2b_cached(sv, &mg, start, send, uoffset2,
28ccbf94 6666 uoffset, boffset) - boffset;
bdf30dd6 6667
28ccbf94 6668 *lenp = boffset2;
bdf30dd6 6669 }
d931b1be
NC
6670 } else {
6671 if (lenp)
6672 *lenp = 0;
6673 boffset = 0;
a0ed51b3 6674 }
e23c8137 6675
d931b1be 6676 return boffset;
a0ed51b3
LW
6677}
6678
777f7c56
EB
6679/*
6680=for apidoc sv_pos_u2b
6681
6682Converts the value pointed to by offsetp from a count of UTF-8 chars from
6683the start of the string, to a count of the equivalent number of bytes; if
6684lenp is non-zero, it does the same to lenp, but this time starting from
6685the offset, rather than from the start of the string. Handles magic and
6686type coercion.
6687
d931b1be
NC
6688Use C<sv_pos_u2b_flags> in preference, which correctly handles strings longer
6689than 2Gb.
6690
777f7c56
EB
6691=cut
6692*/
6693
6694/*
6695 * sv_pos_u2b() uses, like sv_pos_b2u(), the mg_ptr of the potential
6696 * PERL_MAGIC_utf8 of the sv to store the mapping between UTF-8 and
6697 * byte offsets. See also the comments of S_utf8_mg_pos_cache_update().
6698 *
6699 */
6700
6701/* This function is subject to size and sign problems */
6702
6703void
6704Perl_sv_pos_u2b(pTHX_ register SV *const sv, I32 *const offsetp, I32 *const lenp)
6705{
d931b1be
NC
6706 PERL_ARGS_ASSERT_SV_POS_U2B;
6707
777f7c56
EB
6708 if (lenp) {
6709 STRLEN ulen = (STRLEN)*lenp;
d931b1be
NC
6710 *offsetp = (I32)sv_pos_u2b_flags(sv, (STRLEN)*offsetp, &ulen,
6711 SV_GMAGIC|SV_CONST_RETURN);
777f7c56
EB
6712 *lenp = (I32)ulen;
6713 } else {
d931b1be
NC
6714 *offsetp = (I32)sv_pos_u2b_flags(sv, (STRLEN)*offsetp, NULL,
6715 SV_GMAGIC|SV_CONST_RETURN);
777f7c56 6716 }
777f7c56
EB
6717}
6718
ec49a12c
NC
6719static void
6720S_utf8_mg_len_cache_update(pTHX_ SV *const sv, MAGIC **const mgp,
6721 const STRLEN ulen)
6722{
6723 PERL_ARGS_ASSERT_UTF8_MG_LEN_CACHE_UPDATE;
6724 if (SvREADONLY(sv))
6725 return;
6726
6727 if (!*mgp && (SvTYPE(sv) < SVt_PVMG ||
6728 !(*mgp = mg_find(sv, PERL_MAGIC_utf8)))) {
6729 *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, &PL_vtbl_utf8, 0, 0);
6730 }
6731 assert(*mgp);
6732
6733 (*mgp)->mg_len = ulen;
6734 /* For now, treat "overflowed" as "still unknown". See RT #72924. */
6735 if (ulen != (STRLEN) (*mgp)->mg_len)
6736 (*mgp)->mg_len = -1;
6737}
6738
9564a3bd
NC
6739/* Create and update the UTF8 magic offset cache, with the proffered utf8/
6740 byte length pairing. The (byte) length of the total SV is passed in too,
6741 as blen, because for some (more esoteric) SVs, the call to SvPV_const()
6742 may not have updated SvCUR, so we can't rely on reading it directly.
6743
6744 The proffered utf8/byte length pairing isn't used if the cache already has
6745 two pairs, and swapping either for the proffered pair would increase the
6746 RMS of the intervals between known byte offsets.
6747
6748 The cache itself consists of 4 STRLEN values
6749 0: larger UTF-8 offset
6750 1: corresponding byte offset
6751 2: smaller UTF-8 offset
6752 3: corresponding byte offset
6753
6754 Unused cache pairs have the value 0, 0.
6755 Keeping the cache "backwards" means that the invariant of
6756 cache[0] >= cache[2] is maintained even with empty slots, which means that
6757 the code that uses it doesn't need to worry if only 1 entry has actually
6758 been set to non-zero. It also makes the "position beyond the end of the
6759 cache" logic much simpler, as the first slot is always the one to start
6760 from.
645c22ef 6761*/
ec07b5e0 6762static void
ac1e9476
SS
6763S_utf8_mg_pos_cache_update(pTHX_ SV *const sv, MAGIC **const mgp, const STRLEN byte,
6764 const STRLEN utf8, const STRLEN blen)
ec07b5e0
NC
6765{
6766 STRLEN *cache;
7918f24d
NC
6767
6768 PERL_ARGS_ASSERT_UTF8_MG_POS_CACHE_UPDATE;
6769
ec07b5e0
NC
6770 if (SvREADONLY(sv))
6771 return;
6772
f89a570b
CS
6773 if (!*mgp && (SvTYPE(sv) < SVt_PVMG ||
6774 !(*mgp = mg_find(sv, PERL_MAGIC_utf8)))) {
ec07b5e0
NC
6775 *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, (MGVTBL*)&PL_vtbl_utf8, 0,
6776 0);
6777 (*mgp)->mg_len = -1;
6778 }
6779 assert(*mgp);
6780
6781 if (!(cache = (STRLEN *)(*mgp)->mg_ptr)) {
6782 Newxz(cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
6783 (*mgp)->mg_ptr = (char *) cache;
6784 }
6785 assert(cache);
6786
ab8be49d
NC
6787 if (PL_utf8cache < 0 && SvPOKp(sv)) {
6788 /* SvPOKp() because it's possible that sv has string overloading, and
6789 therefore is a reference, hence SvPVX() is actually a pointer.
6790 This cures the (very real) symptoms of RT 69422, but I'm not actually
6791 sure whether we should even be caching the results of UTF-8
6792 operations on overloading, given that nothing stops overloading
6793 returning a different value every time it's called. */
ef816a78 6794 const U8 *start = (const U8 *) SvPVX_const(sv);
6448472a 6795 const STRLEN realutf8 = utf8_length(start, start + byte);
ec07b5e0 6796
9df83ffd
NC
6797 assert_uft8_cache_coherent("utf8_mg_pos_cache_update", utf8, realutf8,
6798 sv);
ec07b5e0 6799 }
ab455f60
NC
6800
6801 /* Cache is held with the later position first, to simplify the code
6802 that deals with unbounded ends. */
6803
6804 ASSERT_UTF8_CACHE(cache);
6805 if (cache[1] == 0) {
6806 /* Cache is totally empty */
6807 cache[0] = utf8;
6808 cache[1] = byte;
6809 } else if (cache[3] == 0) {
6810 if (byte > cache[1]) {
6811 /* New one is larger, so goes first. */
6812 cache[2] = cache[0];
6813 cache[3] = cache[1];
6814 cache[0] = utf8;
6815 cache[1] = byte;
6816 } else {
6817 cache[2] = utf8;
6818 cache[3] = byte;
6819 }
6820 } else {
6821#define THREEWAY_SQUARE(a,b,c,d) \
6822 ((float)((d) - (c))) * ((float)((d) - (c))) \
6823 + ((float)((c) - (b))) * ((float)((c) - (b))) \
6824 + ((float)((b) - (a))) * ((float)((b) - (a)))
6825
6826 /* Cache has 2 slots in use, and we know three potential pairs.
6827 Keep the two that give the lowest RMS distance. Do the
6828 calcualation in bytes simply because we always know the byte
6829 length. squareroot has the same ordering as the positive value,
6830 so don't bother with the actual square root. */
6831 const float existing = THREEWAY_SQUARE(0, cache[3], cache[1], blen);
6832 if (byte > cache[1]) {
6833 /* New position is after the existing pair of pairs. */
6834 const float keep_earlier
6835 = THREEWAY_SQUARE(0, cache[3], byte, blen);
6836 const float keep_later
6837 = THREEWAY_SQUARE(0, cache[1], byte, blen);
6838
6839 if (keep_later < keep_earlier) {
6840 if (keep_later < existing) {
6841 cache[2] = cache[0];
6842 cache[3] = cache[1];
6843 cache[0] = utf8;
6844 cache[1] = byte;
6845 }
6846 }
6847 else {
6848 if (keep_earlier < existing) {
6849 cache[0] = utf8;
6850 cache[1] = byte;
6851 }
6852 }
6853 }
57d7fbf1
NC
6854 else if (byte > cache[3]) {
6855 /* New position is between the existing pair of pairs. */
6856 const float keep_earlier
6857 = THREEWAY_SQUARE(0, cache[3], byte, blen);
6858 const float keep_later
6859 = THREEWAY_SQUARE(0, byte, cache[1], blen);
6860
6861 if (keep_later < keep_earlier) {
6862 if (keep_later < existing) {
6863 cache[2] = utf8;
6864 cache[3] = byte;
6865 }
6866 }
6867 else {
6868 if (keep_earlier < existing) {
6869 cache[0] = utf8;
6870 cache[1] = byte;
6871 }
6872 }
6873 }
6874 else {
6875 /* New position is before the existing pair of pairs. */
6876 const float keep_earlier
6877 = THREEWAY_SQUARE(0, byte, cache[3], blen);
6878 const float keep_later
6879 = THREEWAY_SQUARE(0, byte, cache[1], blen);
6880
6881 if (keep_later < keep_earlier) {
6882 if (keep_later < existing) {
6883 cache[2] = utf8;
6884 cache[3] = byte;
6885 }
6886 }
6887 else {
6888 if (keep_earlier < existing) {
6889 cache[0] = cache[2];
6890 cache[1] = cache[3];
6891 cache[2] = utf8;
6892 cache[3] = byte;
6893 }
6894 }
6895 }
ab455f60 6896 }
0905937d 6897 ASSERT_UTF8_CACHE(cache);
ec07b5e0
NC
6898}
6899
ec07b5e0 6900/* We already know all of the way, now we may be able to walk back. The same
25a8a4ef
NC
6901 assumption is made as in S_sv_pos_u2b_midway(), namely that walking
6902 backward is half the speed of walking forward. */
ec07b5e0 6903static STRLEN
ac1e9476
SS
6904S_sv_pos_b2u_midway(pTHX_ const U8 *const s, const U8 *const target,
6905 const U8 *end, STRLEN endu)
ec07b5e0
NC
6906{
6907 const STRLEN forw = target - s;
6908 STRLEN backw = end - target;
6909
7918f24d
NC
6910 PERL_ARGS_ASSERT_SV_POS_B2U_MIDWAY;
6911
ec07b5e0 6912 if (forw < 2 * backw) {
6448472a 6913 return utf8_length(s, target);
ec07b5e0
NC
6914 }
6915
6916 while (end > target) {
6917 end--;
6918 while (UTF8_IS_CONTINUATION(*end)) {
6919 end--;
6920 }
6921 endu--;
6922 }
6923 return endu;
6924}
6925
9564a3bd
NC
6926/*
6927=for apidoc sv_pos_b2u
6928
6929Converts the value pointed to by offsetp from a count of bytes from the
6930start of the string, to a count of the equivalent number of UTF-8 chars.
6931Handles magic and type coercion.
6932
6933=cut
6934*/
6935
6936/*
6937 * sv_pos_b2u() uses, like sv_pos_u2b(), the mg_ptr of the potential
c05a5c57 6938 * PERL_MAGIC_utf8 of the sv to store the mapping between UTF-8 and
9564a3bd
NC
6939 * byte offsets.
6940 *
6941 */
a0ed51b3 6942void
ac1e9476 6943Perl_sv_pos_b2u(pTHX_ register SV *const sv, I32 *const offsetp)
a0ed51b3 6944{
83003860 6945 const U8* s;
ec07b5e0 6946 const STRLEN byte = *offsetp;
7087a21c 6947 STRLEN len = 0; /* Actually always set, but let's keep gcc happy. */
ab455f60 6948 STRLEN blen;
ec07b5e0
NC
6949 MAGIC* mg = NULL;
6950 const U8* send;
a922f900 6951 bool found = FALSE;
a0ed51b3 6952
7918f24d
NC
6953 PERL_ARGS_ASSERT_SV_POS_B2U;
6954
a0ed51b3
LW
6955 if (!sv)
6956 return;
6957
ab455f60 6958 s = (const U8*)SvPV_const(sv, blen);
7e8c5dac 6959
ab455f60 6960 if (blen < byte)
ec07b5e0 6961 Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
7e8c5dac 6962
ec07b5e0 6963 send = s + byte;
a67d7df9 6964
f89a570b
CS
6965 if (!SvREADONLY(sv)
6966 && PL_utf8cache
6967 && SvTYPE(sv) >= SVt_PVMG
6968 && (mg = mg_find(sv, PERL_MAGIC_utf8)))
6969 {
ffca234a 6970 if (mg->mg_ptr) {
d4c19fe8 6971 STRLEN * const cache = (STRLEN *) mg->mg_ptr;
b9f984a5 6972 if (cache[1] == byte) {
ec07b5e0
NC
6973 /* An exact match. */
6974 *offsetp = cache[0];
ec07b5e0 6975 return;
7e8c5dac 6976 }
ab455f60
NC
6977 if (cache[3] == byte) {
6978 /* An exact match. */
6979 *offsetp = cache[2];
6980 return;
6981 }
668af93f
NC
6982
6983 if (cache[1] < byte) {
ec07b5e0 6984 /* We already know part of the way. */
b9f984a5
NC
6985 if (mg->mg_len != -1) {
6986 /* Actually, we know the end too. */
6987 len = cache[0]
6988 + S_sv_pos_b2u_midway(aTHX_ s + cache[1], send,
ab455f60 6989 s + blen, mg->mg_len - cache[0]);
b9f984a5 6990 } else {
6448472a 6991 len = cache[0] + utf8_length(s + cache[1], send);
b9f984a5 6992 }
7e8c5dac 6993 }
9f985e4c
NC
6994 else if (cache[3] < byte) {
6995 /* We're between the two cached pairs, so we do the calculation
6996 offset by the byte/utf-8 positions for the earlier pair,
6997 then add the utf-8 characters from the string start to
6998 there. */
6999 len = S_sv_pos_b2u_midway(aTHX_ s + cache[3], send,
7000 s + cache[1], cache[0] - cache[2])
7001 + cache[2];
7002
7003 }
7004 else { /* cache[3] > byte */
7005 len = S_sv_pos_b2u_midway(aTHX_ s, send, s + cache[3],
7006 cache[2]);
7e8c5dac 7007
7e8c5dac 7008 }
ec07b5e0 7009 ASSERT_UTF8_CACHE(cache);
a922f900 7010 found = TRUE;
ffca234a 7011 } else if (mg->mg_len != -1) {
ab455f60 7012 len = S_sv_pos_b2u_midway(aTHX_ s, send, s + blen, mg->mg_len);
a922f900 7013 found = TRUE;
7e8c5dac 7014 }
a0ed51b3 7015 }
a922f900 7016 if (!found || PL_utf8cache < 0) {
6448472a 7017 const STRLEN real_len = utf8_length(s, send);
a922f900 7018
9df83ffd
NC
7019 if (found && PL_utf8cache < 0)
7020 assert_uft8_cache_coherent("sv_pos_b2u", len, real_len, sv);
a922f900 7021 len = real_len;
ec07b5e0
NC
7022 }
7023 *offsetp = len;
7024
0d7caf4c
NC
7025 if (PL_utf8cache) {
7026 if (blen == byte)
7027 utf8_mg_len_cache_update(sv, &mg, len);
7028 else
7029 utf8_mg_pos_cache_update(sv, &mg, byte, len, blen);
7030 }
a0ed51b3
LW
7031}
7032
9df83ffd
NC
7033static void
7034S_assert_uft8_cache_coherent(pTHX_ const char *const func, STRLEN from_cache,
7035 STRLEN real, SV *const sv)
7036{
7037 PERL_ARGS_ASSERT_ASSERT_UFT8_CACHE_COHERENT;
7038
7039 /* As this is debugging only code, save space by keeping this test here,
7040 rather than inlining it in all the callers. */
7041 if (from_cache == real)
7042 return;
7043
7044 /* Need to turn the assertions off otherwise we may recurse infinitely
7045 while printing error messages. */
7046 SAVEI8(PL_utf8cache);
7047 PL_utf8cache = 0;
7048 Perl_croak(aTHX_ "panic: %s cache %"UVuf" real %"UVuf" for %"SVf,
7049 func, (UV) from_cache, (UV) real, SVfARG(sv));
7050}
7051
954c1994
GS
7052/*
7053=for apidoc sv_eq
7054
7055Returns a boolean indicating whether the strings in the two SVs are
645c22ef
DM
7056identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
7057coerce its args to strings if necessary.
954c1994 7058
078504b2
FC
7059=for apidoc sv_eq_flags
7060
7061Returns a boolean indicating whether the strings in the two SVs are
7062identical. Is UTF-8 and 'use bytes' aware and coerces its args to strings
7063if necessary. If the flags include SV_GMAGIC, it handles get-magic, too.
7064
954c1994
GS
7065=cut
7066*/
7067
79072805 7068I32
31c72c81 7069Perl_sv_eq_flags(pTHX_ register SV *sv1, register SV *sv2, const U32 flags)
79072805 7070{
97aff369 7071 dVAR;
e1ec3a88 7072 const char *pv1;
463ee0b2 7073 STRLEN cur1;
e1ec3a88 7074 const char *pv2;
463ee0b2 7075 STRLEN cur2;
e01b9e88 7076 I32 eq = 0;
bd61b366 7077 char *tpv = NULL;
a0714e2c 7078 SV* svrecode = NULL;
79072805 7079
e01b9e88 7080 if (!sv1) {
79072805
LW
7081 pv1 = "";
7082 cur1 = 0;
7083 }
ced497e2
YST
7084 else {
7085 /* if pv1 and pv2 are the same, second SvPV_const call may
078504b2
FC
7086 * invalidate pv1 (if we are handling magic), so we may need to
7087 * make a copy */
7088 if (sv1 == sv2 && flags & SV_GMAGIC
7089 && (SvTHINKFIRST(sv1) || SvGMAGICAL(sv1))) {
ced497e2 7090 pv1 = SvPV_const(sv1, cur1);
59cd0e26 7091 sv1 = newSVpvn_flags(pv1, cur1, SVs_TEMP | SvUTF8(sv2));
ced497e2 7092 }
078504b2 7093 pv1 = SvPV_flags_const(sv1, cur1, flags);
ced497e2 7094 }
79072805 7095
e01b9e88
SC
7096 if (!sv2){
7097 pv2 = "";
7098 cur2 = 0;
92d29cee 7099 }
e01b9e88 7100 else
078504b2 7101 pv2 = SvPV_flags_const(sv2, cur2, flags);
79072805 7102
cf48d248 7103 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
7104 /* Differing utf8ness.
7105 * Do not UTF8size the comparands as a side-effect. */
7106 if (PL_encoding) {
7107 if (SvUTF8(sv1)) {
553e1bcc
AT
7108 svrecode = newSVpvn(pv2, cur2);
7109 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 7110 pv2 = SvPV_const(svrecode, cur2);
799ef3cb
JH
7111 }
7112 else {
553e1bcc
AT
7113 svrecode = newSVpvn(pv1, cur1);
7114 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 7115 pv1 = SvPV_const(svrecode, cur1);
799ef3cb
JH
7116 }
7117 /* Now both are in UTF-8. */
0a1bd7ac
DM
7118 if (cur1 != cur2) {
7119 SvREFCNT_dec(svrecode);
799ef3cb 7120 return FALSE;
0a1bd7ac 7121 }
799ef3cb
JH
7122 }
7123 else {
799ef3cb 7124 if (SvUTF8(sv1)) {
fed3ba5d
NC
7125 /* sv1 is the UTF-8 one */
7126 return bytes_cmp_utf8((const U8*)pv2, cur2,
7127 (const U8*)pv1, cur1) == 0;
799ef3cb
JH
7128 }
7129 else {
fed3ba5d
NC
7130 /* sv2 is the UTF-8 one */
7131 return bytes_cmp_utf8((const U8*)pv1, cur1,
7132 (const U8*)pv2, cur2) == 0;
799ef3cb
JH
7133 }
7134 }
cf48d248
JH
7135 }
7136
7137 if (cur1 == cur2)
765f542d 7138 eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
e01b9e88 7139
b37c2d43 7140 SvREFCNT_dec(svrecode);
553e1bcc
AT
7141 if (tpv)
7142 Safefree(tpv);
cf48d248 7143
e01b9e88 7144 return eq;
79072805
LW
7145}
7146
954c1994
GS
7147/*
7148=for apidoc sv_cmp
7149
7150Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
7151string in C<sv1> is less than, equal to, or greater than the string in
645c22ef
DM
7152C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
7153coerce its args to strings if necessary. See also C<sv_cmp_locale>.
954c1994 7154
078504b2
FC
7155=for apidoc sv_cmp_flags
7156
7157Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
7158string in C<sv1> is less than, equal to, or greater than the string in
7159C<sv2>. Is UTF-8 and 'use bytes' aware and will coerce its args to strings
7160if necessary. If the flags include SV_GMAGIC, it handles get magic. See
7161also C<sv_cmp_locale_flags>.
7162
954c1994
GS
7163=cut
7164*/
7165
79072805 7166I32
ac1e9476 7167Perl_sv_cmp(pTHX_ register SV *const sv1, register SV *const sv2)
79072805 7168{
078504b2
FC
7169 return sv_cmp_flags(sv1, sv2, SV_GMAGIC);
7170}
7171
7172I32
31c72c81
NC
7173Perl_sv_cmp_flags(pTHX_ register SV *const sv1, register SV *const sv2,
7174 const U32 flags)
078504b2 7175{
97aff369 7176 dVAR;
560a288e 7177 STRLEN cur1, cur2;
e1ec3a88 7178 const char *pv1, *pv2;
bd61b366 7179 char *tpv = NULL;
cf48d248 7180 I32 cmp;
a0714e2c 7181 SV *svrecode = NULL;
560a288e 7182
e01b9e88
SC
7183 if (!sv1) {
7184 pv1 = "";
560a288e
GS
7185 cur1 = 0;
7186 }
e01b9e88 7187 else
078504b2 7188 pv1 = SvPV_flags_const(sv1, cur1, flags);
560a288e 7189
553e1bcc 7190 if (!sv2) {
e01b9e88 7191 pv2 = "";
560a288e
GS
7192 cur2 = 0;
7193 }
e01b9e88 7194 else
078504b2 7195 pv2 = SvPV_flags_const(sv2, cur2, flags);
79072805 7196
cf48d248 7197 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
7198 /* Differing utf8ness.
7199 * Do not UTF8size the comparands as a side-effect. */
cf48d248 7200 if (SvUTF8(sv1)) {
799ef3cb 7201 if (PL_encoding) {
553e1bcc
AT
7202 svrecode = newSVpvn(pv2, cur2);
7203 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 7204 pv2 = SvPV_const(svrecode, cur2);
799ef3cb
JH
7205 }
7206 else {
fed3ba5d
NC
7207 const int retval = -bytes_cmp_utf8((const U8*)pv2, cur2,
7208 (const U8*)pv1, cur1);
7209 return retval ? retval < 0 ? -1 : +1 : 0;
799ef3cb 7210 }
cf48d248
JH
7211 }
7212 else {
799ef3cb 7213 if (PL_encoding) {
553e1bcc
AT
7214 svrecode = newSVpvn(pv1, cur1);
7215 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 7216 pv1 = SvPV_const(svrecode, cur1);
799ef3cb
JH
7217 }
7218 else {
fed3ba5d
NC
7219 const int retval = bytes_cmp_utf8((const U8*)pv1, cur1,
7220 (const U8*)pv2, cur2);
7221 return retval ? retval < 0 ? -1 : +1 : 0;
799ef3cb 7222 }
cf48d248
JH
7223 }
7224 }
7225
e01b9e88 7226 if (!cur1) {
cf48d248 7227 cmp = cur2 ? -1 : 0;
e01b9e88 7228 } else if (!cur2) {
cf48d248
JH
7229 cmp = 1;
7230 } else {
e1ec3a88 7231 const I32 retval = memcmp((const void*)pv1, (const void*)pv2, cur1 < cur2 ? cur1 : cur2);
e01b9e88
SC
7232
7233 if (retval) {
cf48d248 7234 cmp = retval < 0 ? -1 : 1;
e01b9e88 7235 } else if (cur1 == cur2) {
cf48d248
JH
7236 cmp = 0;
7237 } else {
7238 cmp = cur1 < cur2 ? -1 : 1;
e01b9e88 7239 }
cf48d248 7240 }
16660edb 7241
b37c2d43 7242 SvREFCNT_dec(svrecode);
553e1bcc
AT
7243 if (tpv)
7244 Safefree(tpv);
cf48d248
JH
7245
7246 return cmp;
bbce6d69 7247}
16660edb 7248
c461cf8f
JH
7249/*
7250=for apidoc sv_cmp_locale
7251
645c22ef
DM
7252Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
7253'use bytes' aware, handles get magic, and will coerce its args to strings
d77cdebf 7254if necessary. See also C<sv_cmp>.
c461cf8f 7255
078504b2
FC
7256=for apidoc sv_cmp_locale_flags
7257
7258Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
7259'use bytes' aware and will coerce its args to strings if necessary. If the
7260flags contain SV_GMAGIC, it handles get magic. See also C<sv_cmp_flags>.
7261
c461cf8f
JH
7262=cut
7263*/
7264
bbce6d69 7265I32
ac1e9476 7266Perl_sv_cmp_locale(pTHX_ register SV *const sv1, register SV *const sv2)
bbce6d69 7267{
078504b2
FC
7268 return sv_cmp_locale_flags(sv1, sv2, SV_GMAGIC);
7269}
7270
7271I32
31c72c81
NC
7272Perl_sv_cmp_locale_flags(pTHX_ register SV *const sv1, register SV *const sv2,
7273 const U32 flags)
078504b2 7274{
97aff369 7275 dVAR;
36477c24 7276#ifdef USE_LOCALE_COLLATE
16660edb 7277
bbce6d69 7278 char *pv1, *pv2;
7279 STRLEN len1, len2;
7280 I32 retval;
16660edb 7281
3280af22 7282 if (PL_collation_standard)
bbce6d69 7283 goto raw_compare;
16660edb 7284
bbce6d69 7285 len1 = 0;
078504b2 7286 pv1 = sv1 ? sv_collxfrm_flags(sv1, &len1, flags) : (char *) NULL;
bbce6d69 7287 len2 = 0;
078504b2 7288 pv2 = sv2 ? sv_collxfrm_flags(sv2, &len2, flags) : (char *) NULL;
16660edb 7289
bbce6d69 7290 if (!pv1 || !len1) {
7291 if (pv2 && len2)
7292 return -1;
7293 else
7294 goto raw_compare;
7295 }
7296 else {
7297 if (!pv2 || !len2)
7298 return 1;
7299 }
16660edb 7300
bbce6d69 7301 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 7302
bbce6d69 7303 if (retval)
16660edb 7304 return retval < 0 ? -1 : 1;
7305
bbce6d69 7306 /*
7307 * When the result of collation is equality, that doesn't mean
7308 * that there are no differences -- some locales exclude some
7309 * characters from consideration. So to avoid false equalities,
7310 * we use the raw string as a tiebreaker.
7311 */
16660edb 7312
bbce6d69 7313 raw_compare:
5f66b61c 7314 /*FALLTHROUGH*/
16660edb 7315
36477c24 7316#endif /* USE_LOCALE_COLLATE */
16660edb 7317
bbce6d69 7318 return sv_cmp(sv1, sv2);
7319}
79072805 7320
645c22ef 7321
36477c24 7322#ifdef USE_LOCALE_COLLATE
645c22ef 7323
7a4c00b4 7324/*
645c22ef
DM
7325=for apidoc sv_collxfrm
7326
078504b2
FC
7327This calls C<sv_collxfrm_flags> with the SV_GMAGIC flag. See
7328C<sv_collxfrm_flags>.
7329
7330=for apidoc sv_collxfrm_flags
7331
7332Add Collate Transform magic to an SV if it doesn't already have it. If the
7333flags contain SV_GMAGIC, it handles get-magic.
645c22ef
DM
7334
7335Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
7336scalar data of the variable, but transformed to such a format that a normal
7337memory comparison can be used to compare the data according to the locale
7338settings.
7339
7340=cut
7341*/
7342
bbce6d69 7343char *
078504b2 7344Perl_sv_collxfrm_flags(pTHX_ SV *const sv, STRLEN *const nxp, const I32 flags)
bbce6d69 7345{
97aff369 7346 dVAR;
7a4c00b4 7347 MAGIC *mg;
16660edb 7348
078504b2 7349 PERL_ARGS_ASSERT_SV_COLLXFRM_FLAGS;
7918f24d 7350
14befaf4 7351 mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
3280af22 7352 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
93524f2b
NC
7353 const char *s;
7354 char *xf;
bbce6d69 7355 STRLEN len, xlen;
7356
7a4c00b4 7357 if (mg)
7358 Safefree(mg->mg_ptr);
078504b2 7359 s = SvPV_flags_const(sv, len, flags);
bbce6d69 7360 if ((xf = mem_collxfrm(s, len, &xlen))) {
7a4c00b4 7361 if (! mg) {
d83f0a82
NC
7362#ifdef PERL_OLD_COPY_ON_WRITE
7363 if (SvIsCOW(sv))
7364 sv_force_normal_flags(sv, 0);
7365#endif
7366 mg = sv_magicext(sv, 0, PERL_MAGIC_collxfrm, &PL_vtbl_collxfrm,
7367 0, 0);
7a4c00b4 7368 assert(mg);
bbce6d69 7369 }
7a4c00b4 7370 mg->mg_ptr = xf;
565764a8 7371 mg->mg_len = xlen;
7a4c00b4 7372 }
7373 else {
ff0cee69 7374 if (mg) {
7375 mg->mg_ptr = NULL;
565764a8 7376 mg->mg_len = -1;
ff0cee69 7377 }
bbce6d69 7378 }
7379 }
7a4c00b4 7380 if (mg && mg->mg_ptr) {
565764a8 7381 *nxp = mg->mg_len;
3280af22 7382 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 7383 }
7384 else {
7385 *nxp = 0;
7386 return NULL;
16660edb 7387 }
79072805
LW
7388}
7389
36477c24 7390#endif /* USE_LOCALE_COLLATE */
bbce6d69 7391
f80c2205
NC
7392static char *
7393S_sv_gets_append_to_utf8(pTHX_ SV *const sv, PerlIO *const fp, I32 append)
7394{
7395 SV * const tsv = newSV(0);
7396 ENTER;
7397 SAVEFREESV(tsv);
7398 sv_gets(tsv, fp, 0);
7399 sv_utf8_upgrade_nomg(tsv);
7400 SvCUR_set(sv,append);
7401 sv_catsv(sv,tsv);
7402 LEAVE;
7403 return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
7404}
7405
7406static char *
7407S_sv_gets_read_record(pTHX_ SV *const sv, PerlIO *const fp, I32 append)
7408{
7409 I32 bytesread;
7410 const U32 recsize = SvUV(SvRV(PL_rs)); /* RsRECORD() guarantees > 0. */
7411 /* Grab the size of the record we're getting */
7412 char *const buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append;
7413#ifdef VMS
7414 int fd;
7415#endif
7416
7417 /* Go yank in */
7418#ifdef VMS
7419 /* VMS wants read instead of fread, because fread doesn't respect */
7420 /* RMS record boundaries. This is not necessarily a good thing to be */
7421 /* doing, but we've got no other real choice - except avoid stdio
7422 as implementation - perhaps write a :vms layer ?
7423 */
7424 fd = PerlIO_fileno(fp);
7425 if (fd != -1) {
7426 bytesread = PerlLIO_read(fd, buffer, recsize);
7427 }
7428 else /* in-memory file from PerlIO::Scalar */
7429#endif
7430 {
7431 bytesread = PerlIO_read(fp, buffer, recsize);
7432 }
7433
7434 if (bytesread < 0)
7435 bytesread = 0;
7436 SvCUR_set(sv, bytesread + append);
7437 buffer[bytesread] = '\0';
7438 return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
7439}
7440
c461cf8f
JH
7441/*
7442=for apidoc sv_gets
7443
7444Get a line from the filehandle and store it into the SV, optionally
7445appending to the currently-stored string.
7446
7447=cut
7448*/
7449
79072805 7450char *
ac1e9476 7451Perl_sv_gets(pTHX_ register SV *const sv, register PerlIO *const fp, I32 append)
79072805 7452{
97aff369 7453 dVAR;
e1ec3a88 7454 const char *rsptr;
c07a80fd 7455 STRLEN rslen;
7456 register STDCHAR rslast;
7457 register STDCHAR *bp;
7458 register I32 cnt;
9c5ffd7c 7459 I32 i = 0;
8bfdd7d9 7460 I32 rspara = 0;
c07a80fd 7461
7918f24d
NC
7462 PERL_ARGS_ASSERT_SV_GETS;
7463
bc44a8a2
NC
7464 if (SvTHINKFIRST(sv))
7465 sv_force_normal_flags(sv, append ? 0 : SV_COW_DROP_PV);
765f542d
NC
7466 /* XXX. If you make this PVIV, then copy on write can copy scalars read
7467 from <>.
7468 However, perlbench says it's slower, because the existing swipe code
7469 is faster than copy on write.
7470 Swings and roundabouts. */
862a34c6 7471 SvUPGRADE(sv, SVt_PV);
99491443 7472
ff68c719 7473 SvSCREAM_off(sv);
efd8b2ba
AE
7474
7475 if (append) {
7476 if (PerlIO_isutf8(fp)) {
7477 if (!SvUTF8(sv)) {
7478 sv_utf8_upgrade_nomg(sv);
7479 sv_pos_u2b(sv,&append,0);
7480 }
7481 } else if (SvUTF8(sv)) {
f80c2205 7482 return S_sv_gets_append_to_utf8(aTHX_ sv, fp, append);
efd8b2ba
AE
7483 }
7484 }
7485
7486 SvPOK_only(sv);
05dee287
JJ
7487 if (!append) {
7488 SvCUR_set(sv,0);
7489 }
efd8b2ba
AE
7490 if (PerlIO_isutf8(fp))
7491 SvUTF8_on(sv);
c07a80fd 7492
923e4eb5 7493 if (IN_PERL_COMPILETIME) {
8bfdd7d9
HS
7494 /* we always read code in line mode */
7495 rsptr = "\n";
7496 rslen = 1;
7497 }
7498 else if (RsSNARF(PL_rs)) {
7a5fa8a2 7499 /* If it is a regular disk file use size from stat() as estimate
acbd132f
JH
7500 of amount we are going to read -- may result in mallocing
7501 more memory than we really need if the layers below reduce
7502 the size we read (e.g. CRLF or a gzip layer).
e468d35b 7503 */
e311fd51 7504 Stat_t st;
e468d35b 7505 if (!PerlLIO_fstat(PerlIO_fileno(fp), &st) && S_ISREG(st.st_mode)) {
f54cb97a 7506 const Off_t offset = PerlIO_tell(fp);
58f1856e 7507 if (offset != (Off_t) -1 && st.st_size + append > offset) {
e468d35b
NIS
7508 (void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 1));
7509 }
7510 }
c07a80fd 7511 rsptr = NULL;
7512 rslen = 0;
7513 }
3280af22 7514 else if (RsRECORD(PL_rs)) {
f80c2205 7515 return S_sv_gets_read_record(aTHX_ sv, fp, append);
5b2b9c68 7516 }
3280af22 7517 else if (RsPARA(PL_rs)) {
c07a80fd 7518 rsptr = "\n\n";
7519 rslen = 2;
8bfdd7d9 7520 rspara = 1;
c07a80fd 7521 }
7d59b7e4
NIS
7522 else {
7523 /* Get $/ i.e. PL_rs into same encoding as stream wants */
7524 if (PerlIO_isutf8(fp)) {
7525 rsptr = SvPVutf8(PL_rs, rslen);
7526 }
7527 else {
7528 if (SvUTF8(PL_rs)) {
7529 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
7530 Perl_croak(aTHX_ "Wide character in $/");
7531 }
7532 }
93524f2b 7533 rsptr = SvPV_const(PL_rs, rslen);
7d59b7e4
NIS
7534 }
7535 }
7536
c07a80fd 7537 rslast = rslen ? rsptr[rslen - 1] : '\0';
7538
8bfdd7d9 7539 if (rspara) { /* have to do this both before and after */
79072805 7540 do { /* to make sure file boundaries work right */
760ac839 7541 if (PerlIO_eof(fp))
a0d0e21e 7542 return 0;
760ac839 7543 i = PerlIO_getc(fp);
79072805 7544 if (i != '\n') {
a0d0e21e
LW
7545 if (i == -1)
7546 return 0;
760ac839 7547 PerlIO_ungetc(fp,i);
79072805
LW
7548 break;
7549 }
7550 } while (i != EOF);
7551 }
c07a80fd 7552
760ac839
LW
7553 /* See if we know enough about I/O mechanism to cheat it ! */
7554
7555 /* This used to be #ifdef test - it is made run-time test for ease
1c846c1f 7556 of abstracting out stdio interface. One call should be cheap
760ac839
LW
7557 enough here - and may even be a macro allowing compile
7558 time optimization.
7559 */
7560
7561 if (PerlIO_fast_gets(fp)) {
7562
7563 /*
7564 * We're going to steal some values from the stdio struct
7565 * and put EVERYTHING in the innermost loop into registers.
7566 */
7567 register STDCHAR *ptr;
7568 STRLEN bpx;
7569 I32 shortbuffered;
7570
16660edb 7571#if defined(VMS) && defined(PERLIO_IS_STDIO)
7572 /* An ungetc()d char is handled separately from the regular
7573 * buffer, so we getc() it back out and stuff it in the buffer.
7574 */
7575 i = PerlIO_getc(fp);
7576 if (i == EOF) return 0;
7577 *(--((*fp)->_ptr)) = (unsigned char) i;
7578 (*fp)->_cnt++;
7579#endif
c07a80fd 7580
c2960299 7581 /* Here is some breathtakingly efficient cheating */
c07a80fd 7582
a20bf0c3 7583 cnt = PerlIO_get_cnt(fp); /* get count into register */
e468d35b 7584 /* make sure we have the room */
7a5fa8a2 7585 if ((I32)(SvLEN(sv) - append) <= cnt + 1) {
e468d35b 7586 /* Not room for all of it
7a5fa8a2 7587 if we are looking for a separator and room for some
e468d35b
NIS
7588 */
7589 if (rslen && cnt > 80 && (I32)SvLEN(sv) > append) {
7a5fa8a2 7590 /* just process what we have room for */
79072805
LW
7591 shortbuffered = cnt - SvLEN(sv) + append + 1;
7592 cnt -= shortbuffered;
7593 }
7594 else {
7595 shortbuffered = 0;
bbce6d69 7596 /* remember that cnt can be negative */
eb160463 7597 SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
79072805
LW
7598 }
7599 }
7a5fa8a2 7600 else
79072805 7601 shortbuffered = 0;
3f7c398e 7602 bp = (STDCHAR*)SvPVX_const(sv) + append; /* move these two too to registers */
a20bf0c3 7603 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 7604 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7605 "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
16660edb 7606 DEBUG_P(PerlIO_printf(Perl_debug_log,
ba7abf9d 7607 "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 7608 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 7609 PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
7610 for (;;) {
7611 screamer:
93a17b20 7612 if (cnt > 0) {
c07a80fd 7613 if (rslen) {
760ac839
LW
7614 while (cnt > 0) { /* this | eat */
7615 cnt--;
c07a80fd 7616 if ((*bp++ = *ptr++) == rslast) /* really | dust */
7617 goto thats_all_folks; /* screams | sed :-) */
7618 }
7619 }
7620 else {
1c846c1f
NIS
7621 Copy(ptr, bp, cnt, char); /* this | eat */
7622 bp += cnt; /* screams | dust */
c07a80fd 7623 ptr += cnt; /* louder | sed :-) */
a5f75d66 7624 cnt = 0;
0f93bb20
NC
7625 assert (!shortbuffered);
7626 goto cannot_be_shortbuffered;
93a17b20 7627 }
79072805
LW
7628 }
7629
748a9306 7630 if (shortbuffered) { /* oh well, must extend */
79072805
LW
7631 cnt = shortbuffered;
7632 shortbuffered = 0;
3f7c398e 7633 bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
79072805
LW
7634 SvCUR_set(sv, bpx);
7635 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
3f7c398e 7636 bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
79072805
LW
7637 continue;
7638 }
7639
0f93bb20 7640 cannot_be_shortbuffered:
16660edb 7641 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841
GS
7642 "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
7643 PTR2UV(ptr),(long)cnt));
cc00df79 7644 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
ad9e76a8
NC
7645
7646 DEBUG_Pv(PerlIO_printf(Perl_debug_log,
1d7c1841 7647 "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 7648 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 7649 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ad9e76a8 7650
1c846c1f 7651 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b 7652 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
7653 another abstraction. */
760ac839 7654 i = PerlIO_getc(fp); /* get more characters */
ad9e76a8
NC
7655
7656 DEBUG_Pv(PerlIO_printf(Perl_debug_log,
1d7c1841 7657 "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 7658 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 7659 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ad9e76a8 7660
a20bf0c3
JH
7661 cnt = PerlIO_get_cnt(fp);
7662 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
16660edb 7663 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7664 "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
79072805 7665
748a9306
LW
7666 if (i == EOF) /* all done for ever? */
7667 goto thats_really_all_folks;
7668
3f7c398e 7669 bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
79072805
LW
7670 SvCUR_set(sv, bpx);
7671 SvGROW(sv, bpx + cnt + 2);
3f7c398e 7672 bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
c07a80fd 7673
eb160463 7674 *bp++ = (STDCHAR)i; /* store character from PerlIO_getc */
79072805 7675
c07a80fd 7676 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
79072805 7677 goto thats_all_folks;
79072805
LW
7678 }
7679
7680thats_all_folks:
3f7c398e 7681 if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX_const(sv)) < rslen) ||
36477c24 7682 memNE((char*)bp - rslen, rsptr, rslen))
760ac839 7683 goto screamer; /* go back to the fray */
79072805
LW
7684thats_really_all_folks:
7685 if (shortbuffered)
7686 cnt += shortbuffered;
16660edb 7687 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7688 "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
cc00df79 7689 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* put these back or we're in trouble */
16660edb 7690 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 7691 "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 7692 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 7693 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
79072805 7694 *bp = '\0';
3f7c398e 7695 SvCUR_set(sv, bp - (STDCHAR*)SvPVX_const(sv)); /* set length */
16660edb 7696 DEBUG_P(PerlIO_printf(Perl_debug_log,
fb73857a 7697 "Screamer: done, len=%ld, string=|%.*s|\n",
3f7c398e 7698 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX_const(sv)));
760ac839
LW
7699 }
7700 else
79072805 7701 {
6edd2cd5 7702 /*The big, slow, and stupid way. */
27da23d5 7703#ifdef USE_HEAP_INSTEAD_OF_STACK /* Even slower way. */
cbbf8932 7704 STDCHAR *buf = NULL;
a02a5408 7705 Newx(buf, 8192, STDCHAR);
6edd2cd5 7706 assert(buf);
4d2c4e07 7707#else
6edd2cd5 7708 STDCHAR buf[8192];
4d2c4e07 7709#endif
79072805 7710
760ac839 7711screamer2:
c07a80fd 7712 if (rslen) {
00b6aa41 7713 register const STDCHAR * const bpe = buf + sizeof(buf);
760ac839 7714 bp = buf;
eb160463 7715 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
760ac839
LW
7716 ; /* keep reading */
7717 cnt = bp - buf;
c07a80fd 7718 }
7719 else {
760ac839 7720 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
16660edb 7721 /* Accomodate broken VAXC compiler, which applies U8 cast to
7722 * both args of ?: operator, causing EOF to change into 255
7723 */
37be0adf 7724 if (cnt > 0)
cbe9e203
JH
7725 i = (U8)buf[cnt - 1];
7726 else
37be0adf 7727 i = EOF;
c07a80fd 7728 }
79072805 7729
cbe9e203
JH
7730 if (cnt < 0)
7731 cnt = 0; /* we do need to re-set the sv even when cnt <= 0 */
7732 if (append)
7733 sv_catpvn(sv, (char *) buf, cnt);
7734 else
7735 sv_setpvn(sv, (char *) buf, cnt);
c07a80fd 7736
7737 if (i != EOF && /* joy */
7738 (!rslen ||
7739 SvCUR(sv) < rslen ||
3f7c398e 7740 memNE(SvPVX_const(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
79072805
LW
7741 {
7742 append = -1;
63e4d877
CS
7743 /*
7744 * If we're reading from a TTY and we get a short read,
7745 * indicating that the user hit his EOF character, we need
7746 * to notice it now, because if we try to read from the TTY
7747 * again, the EOF condition will disappear.
7748 *
7749 * The comparison of cnt to sizeof(buf) is an optimization
7750 * that prevents unnecessary calls to feof().
7751 *
7752 * - jik 9/25/96
7753 */
bb7a0f54 7754 if (!(cnt < (I32)sizeof(buf) && PerlIO_eof(fp)))
63e4d877 7755 goto screamer2;
79072805 7756 }
6edd2cd5 7757
27da23d5 7758#ifdef USE_HEAP_INSTEAD_OF_STACK
6edd2cd5
JH
7759 Safefree(buf);
7760#endif
79072805
LW
7761 }
7762
8bfdd7d9 7763 if (rspara) { /* have to do this both before and after */
c07a80fd 7764 while (i != EOF) { /* to make sure file boundaries work right */
760ac839 7765 i = PerlIO_getc(fp);
79072805 7766 if (i != '\n') {
760ac839 7767 PerlIO_ungetc(fp,i);
79072805
LW
7768 break;
7769 }
7770 }
7771 }
c07a80fd 7772
bd61b366 7773 return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
79072805
LW
7774}
7775
954c1994
GS
7776/*
7777=for apidoc sv_inc
7778
645c22ef 7779Auto-increment of the value in the SV, doing string to numeric conversion
6f1401dc 7780if necessary. Handles 'get' magic and operator overloading.
954c1994
GS
7781
7782=cut
7783*/
7784
79072805 7785void
ac1e9476 7786Perl_sv_inc(pTHX_ register SV *const sv)
79072805 7787{
6f1401dc
DM
7788 if (!sv)
7789 return;
7790 SvGETMAGIC(sv);
7791 sv_inc_nomg(sv);
7792}
7793
7794/*
7795=for apidoc sv_inc_nomg
7796
7797Auto-increment of the value in the SV, doing string to numeric conversion
7798if necessary. Handles operator overloading. Skips handling 'get' magic.
7799
7800=cut
7801*/
7802
7803void
7804Perl_sv_inc_nomg(pTHX_ register SV *const sv)
7805{
97aff369 7806 dVAR;
79072805 7807 register char *d;
463ee0b2 7808 int flags;
79072805
LW
7809
7810 if (!sv)
7811 return;
ed6116ce 7812 if (SvTHINKFIRST(sv)) {
765f542d
NC
7813 if (SvIsCOW(sv))
7814 sv_force_normal_flags(sv, 0);
0f15f207 7815 if (SvREADONLY(sv)) {
923e4eb5 7816 if (IN_PERL_RUNTIME)
6ad8f254 7817 Perl_croak_no_modify(aTHX);
0f15f207 7818 }
a0d0e21e 7819 if (SvROK(sv)) {
b5be31e9 7820 IV i;
9e7bc3e8
JD
7821 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
7822 return;
56431972 7823 i = PTR2IV(SvRV(sv));
b5be31e9
SM
7824 sv_unref(sv);
7825 sv_setiv(sv, i);
a0d0e21e 7826 }
ed6116ce 7827 }
8990e307 7828 flags = SvFLAGS(sv);
28e5dec8
JH
7829 if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
7830 /* It's (privately or publicly) a float, but not tested as an
7831 integer, so test it to see. */
d460ef45 7832 (void) SvIV(sv);
28e5dec8
JH
7833 flags = SvFLAGS(sv);
7834 }
7835 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
7836 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 7837#ifdef PERL_PRESERVE_IVUV
28e5dec8 7838 oops_its_int:
59d8ce62 7839#endif
25da4f38
IZ
7840 if (SvIsUV(sv)) {
7841 if (SvUVX(sv) == UV_MAX)
a1e868e7 7842 sv_setnv(sv, UV_MAX_P1);
25da4f38
IZ
7843 else
7844 (void)SvIOK_only_UV(sv);
607fa7f2 7845 SvUV_set(sv, SvUVX(sv) + 1);
25da4f38
IZ
7846 } else {
7847 if (SvIVX(sv) == IV_MAX)
28e5dec8 7848 sv_setuv(sv, (UV)IV_MAX + 1);
25da4f38
IZ
7849 else {
7850 (void)SvIOK_only(sv);
45977657 7851 SvIV_set(sv, SvIVX(sv) + 1);
1c846c1f 7852 }
55497cff 7853 }
79072805
LW
7854 return;
7855 }
28e5dec8 7856 if (flags & SVp_NOK) {
b88df990 7857 const NV was = SvNVX(sv);
b68c599a 7858 if (NV_OVERFLOWS_INTEGERS_AT &&
a2a5de95
NC
7859 was >= NV_OVERFLOWS_INTEGERS_AT) {
7860 Perl_ck_warner(aTHX_ packWARN(WARN_IMPRECISION),
7861 "Lost precision when incrementing %" NVff " by 1",
7862 was);
b88df990 7863 }
28e5dec8 7864 (void)SvNOK_only(sv);
b68c599a 7865 SvNV_set(sv, was + 1.0);
28e5dec8
JH
7866 return;
7867 }
7868
3f7c398e 7869 if (!(flags & SVp_POK) || !*SvPVX_const(sv)) {
28e5dec8 7870 if ((flags & SVTYPEMASK) < SVt_PVIV)
f5282e15 7871 sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV ? SVt_PVIV : SVt_IV));
28e5dec8 7872 (void)SvIOK_only(sv);
45977657 7873 SvIV_set(sv, 1);
79072805
LW
7874 return;
7875 }
463ee0b2 7876 d = SvPVX(sv);
79072805
LW
7877 while (isALPHA(*d)) d++;
7878 while (isDIGIT(*d)) d++;
6aff239d 7879 if (d < SvEND(sv)) {
28e5dec8 7880#ifdef PERL_PRESERVE_IVUV
d1be9408 7881 /* Got to punt this as an integer if needs be, but we don't issue
28e5dec8
JH
7882 warnings. Probably ought to make the sv_iv_please() that does
7883 the conversion if possible, and silently. */
504618e9 7884 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
28e5dec8
JH
7885 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
7886 /* Need to try really hard to see if it's an integer.
7887 9.22337203685478e+18 is an integer.
7888 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
7889 so $a="9.22337203685478e+18"; $a+0; $a++
7890 needs to be the same as $a="9.22337203685478e+18"; $a++
7891 or we go insane. */
d460ef45 7892
28e5dec8
JH
7893 (void) sv_2iv(sv);
7894 if (SvIOK(sv))
7895 goto oops_its_int;
7896
7897 /* sv_2iv *should* have made this an NV */
7898 if (flags & SVp_NOK) {
7899 (void)SvNOK_only(sv);
9d6ce603 7900 SvNV_set(sv, SvNVX(sv) + 1.0);
28e5dec8
JH
7901 return;
7902 }
7903 /* I don't think we can get here. Maybe I should assert this
7904 And if we do get here I suspect that sv_setnv will croak. NWC
7905 Fall through. */
7906#if defined(USE_LONG_DOUBLE)
7907 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 7908 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8 7909#else
1779d84d 7910 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 7911 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8
JH
7912#endif
7913 }
7914#endif /* PERL_PRESERVE_IVUV */
3f7c398e 7915 sv_setnv(sv,Atof(SvPVX_const(sv)) + 1.0);
79072805
LW
7916 return;
7917 }
7918 d--;
3f7c398e 7919 while (d >= SvPVX_const(sv)) {
79072805
LW
7920 if (isDIGIT(*d)) {
7921 if (++*d <= '9')
7922 return;
7923 *(d--) = '0';
7924 }
7925 else {
9d116dd7
JH
7926#ifdef EBCDIC
7927 /* MKS: The original code here died if letters weren't consecutive.
7928 * at least it didn't have to worry about non-C locales. The
7929 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
1c846c1f 7930 * arranged in order (although not consecutively) and that only
9d116dd7
JH
7931 * [A-Za-z] are accepted by isALPHA in the C locale.
7932 */
7933 if (*d != 'z' && *d != 'Z') {
7934 do { ++*d; } while (!isALPHA(*d));
7935 return;
7936 }
7937 *(d--) -= 'z' - 'a';
7938#else
79072805
LW
7939 ++*d;
7940 if (isALPHA(*d))
7941 return;
7942 *(d--) -= 'z' - 'a' + 1;
9d116dd7 7943#endif
79072805
LW
7944 }
7945 }
7946 /* oh,oh, the number grew */
7947 SvGROW(sv, SvCUR(sv) + 2);
b162af07 7948 SvCUR_set(sv, SvCUR(sv) + 1);
3f7c398e 7949 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX_const(sv); d--)
79072805
LW
7950 *d = d[-1];
7951 if (isDIGIT(d[1]))
7952 *d = '1';
7953 else
7954 *d = d[1];
7955}
7956
954c1994
GS
7957/*
7958=for apidoc sv_dec
7959
645c22ef 7960Auto-decrement of the value in the SV, doing string to numeric conversion
6f1401dc 7961if necessary. Handles 'get' magic and operator overloading.
954c1994
GS
7962
7963=cut
7964*/
7965
79072805 7966void
ac1e9476 7967Perl_sv_dec(pTHX_ register SV *const sv)
79072805 7968{
97aff369 7969 dVAR;
6f1401dc
DM
7970 if (!sv)
7971 return;
7972 SvGETMAGIC(sv);
7973 sv_dec_nomg(sv);
7974}
7975
7976/*
7977=for apidoc sv_dec_nomg
7978
7979Auto-decrement of the value in the SV, doing string to numeric conversion
7980if necessary. Handles operator overloading. Skips handling 'get' magic.
7981
7982=cut
7983*/
7984
7985void
7986Perl_sv_dec_nomg(pTHX_ register SV *const sv)
7987{
7988 dVAR;
463ee0b2
LW
7989 int flags;
7990
79072805
LW
7991 if (!sv)
7992 return;
ed6116ce 7993 if (SvTHINKFIRST(sv)) {
765f542d
NC
7994 if (SvIsCOW(sv))
7995 sv_force_normal_flags(sv, 0);
0f15f207 7996 if (SvREADONLY(sv)) {
923e4eb5 7997 if (IN_PERL_RUNTIME)
6ad8f254 7998 Perl_croak_no_modify(aTHX);
0f15f207 7999 }
a0d0e21e 8000 if (SvROK(sv)) {
b5be31e9 8001 IV i;
9e7bc3e8
JD
8002 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
8003 return;
56431972 8004 i = PTR2IV(SvRV(sv));
b5be31e9
SM
8005 sv_unref(sv);
8006 sv_setiv(sv, i);
a0d0e21e 8007 }
ed6116ce 8008 }
28e5dec8
JH
8009 /* Unlike sv_inc we don't have to worry about string-never-numbers
8010 and keeping them magic. But we mustn't warn on punting */
8990e307 8011 flags = SvFLAGS(sv);
28e5dec8
JH
8012 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
8013 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 8014#ifdef PERL_PRESERVE_IVUV
28e5dec8 8015 oops_its_int:
59d8ce62 8016#endif
25da4f38
IZ
8017 if (SvIsUV(sv)) {
8018 if (SvUVX(sv) == 0) {
8019 (void)SvIOK_only(sv);
45977657 8020 SvIV_set(sv, -1);
25da4f38
IZ
8021 }
8022 else {
8023 (void)SvIOK_only_UV(sv);
f4eee32f 8024 SvUV_set(sv, SvUVX(sv) - 1);
1c846c1f 8025 }
25da4f38 8026 } else {
b88df990
NC
8027 if (SvIVX(sv) == IV_MIN) {
8028 sv_setnv(sv, (NV)IV_MIN);
8029 goto oops_its_num;
8030 }
25da4f38
IZ
8031 else {
8032 (void)SvIOK_only(sv);
45977657 8033 SvIV_set(sv, SvIVX(sv) - 1);
1c846c1f 8034 }
55497cff 8035 }
8036 return;
8037 }
28e5dec8 8038 if (flags & SVp_NOK) {
b88df990
NC
8039 oops_its_num:
8040 {
8041 const NV was = SvNVX(sv);
b68c599a 8042 if (NV_OVERFLOWS_INTEGERS_AT &&
a2a5de95
NC
8043 was <= -NV_OVERFLOWS_INTEGERS_AT) {
8044 Perl_ck_warner(aTHX_ packWARN(WARN_IMPRECISION),
8045 "Lost precision when decrementing %" NVff " by 1",
8046 was);
b88df990
NC
8047 }
8048 (void)SvNOK_only(sv);
b68c599a 8049 SvNV_set(sv, was - 1.0);
b88df990
NC
8050 return;
8051 }
28e5dec8 8052 }
8990e307 8053 if (!(flags & SVp_POK)) {
ef088171
NC
8054 if ((flags & SVTYPEMASK) < SVt_PVIV)
8055 sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV) ? SVt_PVIV : SVt_IV);
8056 SvIV_set(sv, -1);
8057 (void)SvIOK_only(sv);
79072805
LW
8058 return;
8059 }
28e5dec8
JH
8060#ifdef PERL_PRESERVE_IVUV
8061 {
504618e9 8062 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
28e5dec8
JH
8063 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
8064 /* Need to try really hard to see if it's an integer.
8065 9.22337203685478e+18 is an integer.
8066 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
8067 so $a="9.22337203685478e+18"; $a+0; $a--
8068 needs to be the same as $a="9.22337203685478e+18"; $a--
8069 or we go insane. */
d460ef45 8070
28e5dec8
JH
8071 (void) sv_2iv(sv);
8072 if (SvIOK(sv))
8073 goto oops_its_int;
8074
8075 /* sv_2iv *should* have made this an NV */
8076 if (flags & SVp_NOK) {
8077 (void)SvNOK_only(sv);
9d6ce603 8078 SvNV_set(sv, SvNVX(sv) - 1.0);
28e5dec8
JH
8079 return;
8080 }
8081 /* I don't think we can get here. Maybe I should assert this
8082 And if we do get here I suspect that sv_setnv will croak. NWC
8083 Fall through. */
8084#if defined(USE_LONG_DOUBLE)
8085 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 8086 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8 8087#else
1779d84d 8088 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 8089 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8
JH
8090#endif
8091 }
8092 }
8093#endif /* PERL_PRESERVE_IVUV */
3f7c398e 8094 sv_setnv(sv,Atof(SvPVX_const(sv)) - 1.0); /* punt */
79072805
LW
8095}
8096
81041c50
YO
8097/* this define is used to eliminate a chunk of duplicated but shared logic
8098 * it has the suffix __SV_C to signal that it isnt API, and isnt meant to be
8099 * used anywhere but here - yves
8100 */
8101#define PUSH_EXTEND_MORTAL__SV_C(AnSv) \
8102 STMT_START { \
8103 EXTEND_MORTAL(1); \
8104 PL_tmps_stack[++PL_tmps_ix] = (AnSv); \
8105 } STMT_END
8106
954c1994
GS
8107/*
8108=for apidoc sv_mortalcopy
8109
645c22ef 8110Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
d4236ebc
DM
8111The new SV is marked as mortal. It will be destroyed "soon", either by an
8112explicit call to FREETMPS, or by an implicit call at places such as
8113statement boundaries. See also C<sv_newmortal> and C<sv_2mortal>.
954c1994
GS
8114
8115=cut
8116*/
8117
79072805
LW
8118/* Make a string that will exist for the duration of the expression
8119 * evaluation. Actually, it may have to last longer than that, but
8120 * hopefully we won't free it until it has been assigned to a
8121 * permanent location. */
8122
8123SV *
ac1e9476 8124Perl_sv_mortalcopy(pTHX_ SV *const oldstr)
79072805 8125{
97aff369 8126 dVAR;
463ee0b2 8127 register SV *sv;
b881518d 8128
4561caa4 8129 new_SV(sv);
79072805 8130 sv_setsv(sv,oldstr);
81041c50 8131 PUSH_EXTEND_MORTAL__SV_C(sv);
8990e307
LW
8132 SvTEMP_on(sv);
8133 return sv;
8134}
8135
954c1994
GS
8136/*
8137=for apidoc sv_newmortal
8138
645c22ef 8139Creates a new null SV which is mortal. The reference count of the SV is
d4236ebc
DM
8140set to 1. It will be destroyed "soon", either by an explicit call to
8141FREETMPS, or by an implicit call at places such as statement boundaries.
8142See also C<sv_mortalcopy> and C<sv_2mortal>.
954c1994
GS
8143
8144=cut
8145*/
8146
8990e307 8147SV *
864dbfa3 8148Perl_sv_newmortal(pTHX)
8990e307 8149{
97aff369 8150 dVAR;
8990e307
LW
8151 register SV *sv;
8152
4561caa4 8153 new_SV(sv);
8990e307 8154 SvFLAGS(sv) = SVs_TEMP;
81041c50 8155 PUSH_EXTEND_MORTAL__SV_C(sv);
79072805
LW
8156 return sv;
8157}
8158
59cd0e26
NC
8159
8160/*
8161=for apidoc newSVpvn_flags
8162
8163Creates a new SV and copies a string into it. The reference count for the
8164SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
8165string. You are responsible for ensuring that the source string is at least
8166C<len> bytes long. If the C<s> argument is NULL the new SV will be undefined.
8167Currently the only flag bits accepted are C<SVf_UTF8> and C<SVs_TEMP>.
d9f0b464 8168If C<SVs_TEMP> is set, then C<sv_2mortal()> is called on the result before
c790c9b6
KW
8169returning. If C<SVf_UTF8> is set, C<s> is considered to be in UTF-8 and the
8170C<SVf_UTF8> flag will be set on the new SV.
59cd0e26
NC
8171C<newSVpvn_utf8()> is a convenience wrapper for this function, defined as
8172
8173 #define newSVpvn_utf8(s, len, u) \
8174 newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0)
8175
8176=cut
8177*/
8178
8179SV *
23f13727 8180Perl_newSVpvn_flags(pTHX_ const char *const s, const STRLEN len, const U32 flags)
59cd0e26
NC
8181{
8182 dVAR;
8183 register SV *sv;
8184
8185 /* All the flags we don't support must be zero.
8186 And we're new code so I'm going to assert this from the start. */
8187 assert(!(flags & ~(SVf_UTF8|SVs_TEMP)));
8188 new_SV(sv);
8189 sv_setpvn(sv,s,len);
d21488d7
YO
8190
8191 /* This code used to a sv_2mortal(), however we now unroll the call to sv_2mortal()
8192 * and do what it does outselves here.
8193 * Since we have asserted that flags can only have the SVf_UTF8 and/or SVs_TEMP flags
8194 * set above we can use it to enable the sv flags directly (bypassing SvTEMP_on), which
8195 * in turn means we dont need to mask out the SVf_UTF8 flag below, which means that we
8196 * eleminate quite a few steps than it looks - Yves (explaining patch by gfx)
8197 */
8198
6dfeccca
GF
8199 SvFLAGS(sv) |= flags;
8200
8201 if(flags & SVs_TEMP){
81041c50 8202 PUSH_EXTEND_MORTAL__SV_C(sv);
6dfeccca
GF
8203 }
8204
8205 return sv;
59cd0e26
NC
8206}
8207
954c1994
GS
8208/*
8209=for apidoc sv_2mortal
8210
d4236ebc
DM
8211Marks an existing SV as mortal. The SV will be destroyed "soon", either
8212by an explicit call to FREETMPS, or by an implicit call at places such as
37d2ac18
NC
8213statement boundaries. SvTEMP() is turned on which means that the SV's
8214string buffer can be "stolen" if this SV is copied. See also C<sv_newmortal>
8215and C<sv_mortalcopy>.
954c1994
GS
8216
8217=cut
8218*/
8219
79072805 8220SV *
23f13727 8221Perl_sv_2mortal(pTHX_ register SV *const sv)
79072805 8222{
27da23d5 8223 dVAR;
79072805 8224 if (!sv)
7a5b473e 8225 return NULL;
d689ffdd 8226 if (SvREADONLY(sv) && SvIMMORTAL(sv))
11162842 8227 return sv;
81041c50 8228 PUSH_EXTEND_MORTAL__SV_C(sv);
8990e307 8229 SvTEMP_on(sv);
79072805
LW
8230 return sv;
8231}
8232
954c1994
GS
8233/*
8234=for apidoc newSVpv
8235
8236Creates a new SV and copies a string into it. The reference count for the
8237SV is set to 1. If C<len> is zero, Perl will compute the length using
8238strlen(). For efficiency, consider using C<newSVpvn> instead.
8239
8240=cut
8241*/
8242
79072805 8243SV *
23f13727 8244Perl_newSVpv(pTHX_ const char *const s, const STRLEN len)
79072805 8245{
97aff369 8246 dVAR;
463ee0b2 8247 register SV *sv;
79072805 8248
4561caa4 8249 new_SV(sv);
ddfa59c7 8250 sv_setpvn(sv, s, len || s == NULL ? len : strlen(s));
79072805
LW
8251 return sv;
8252}
8253
954c1994
GS
8254/*
8255=for apidoc newSVpvn
8256
8257Creates a new SV and copies a string into it. The reference count for the
1c846c1f 8258SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
954c1994 8259string. You are responsible for ensuring that the source string is at least
9e09f5f2 8260C<len> bytes long. If the C<s> argument is NULL the new SV will be undefined.
954c1994
GS
8261
8262=cut
8263*/
8264
9da1e3b5 8265SV *
23f13727 8266Perl_newSVpvn(pTHX_ const char *const s, const STRLEN len)
9da1e3b5 8267{
97aff369 8268 dVAR;
9da1e3b5
MUN
8269 register SV *sv;
8270
8271 new_SV(sv);
9da1e3b5
MUN
8272 sv_setpvn(sv,s,len);
8273 return sv;
8274}
8275
740cce10 8276/*
926f8064 8277=for apidoc newSVhek
bd08039b
NC
8278
8279Creates a new SV from the hash key structure. It will generate scalars that
5aaec2b4
NC
8280point to the shared string table where possible. Returns a new (undefined)
8281SV if the hek is NULL.
bd08039b
NC
8282
8283=cut
8284*/
8285
8286SV *
23f13727 8287Perl_newSVhek(pTHX_ const HEK *const hek)
bd08039b 8288{
97aff369 8289 dVAR;
5aaec2b4
NC
8290 if (!hek) {
8291 SV *sv;
8292
8293 new_SV(sv);
8294 return sv;
8295 }
8296
bd08039b
NC
8297 if (HEK_LEN(hek) == HEf_SVKEY) {
8298 return newSVsv(*(SV**)HEK_KEY(hek));
8299 } else {
8300 const int flags = HEK_FLAGS(hek);
8301 if (flags & HVhek_WASUTF8) {
8302 /* Trouble :-)
8303 Andreas would like keys he put in as utf8 to come back as utf8
8304 */
8305 STRLEN utf8_len = HEK_LEN(hek);
678febd7
NC
8306 SV * const sv = newSV_type(SVt_PV);
8307 char *as_utf8 = (char *)bytes_to_utf8 ((U8*)HEK_KEY(hek), &utf8_len);
8308 /* bytes_to_utf8() allocates a new string, which we can repurpose: */
8309 sv_usepvn_flags(sv, as_utf8, utf8_len, SV_HAS_TRAILING_NUL);
bd08039b 8310 SvUTF8_on (sv);
bd08039b 8311 return sv;
45e34800 8312 } else if (flags & (HVhek_REHASH|HVhek_UNSHARED)) {
bd08039b
NC
8313 /* We don't have a pointer to the hv, so we have to replicate the
8314 flag into every HEK. This hv is using custom a hasing
8315 algorithm. Hence we can't return a shared string scalar, as
8316 that would contain the (wrong) hash value, and might get passed
45e34800
NC
8317 into an hv routine with a regular hash.
8318 Similarly, a hash that isn't using shared hash keys has to have
8319 the flag in every key so that we know not to try to call
8320 share_hek_kek on it. */
bd08039b 8321
b64e5050 8322 SV * const sv = newSVpvn (HEK_KEY(hek), HEK_LEN(hek));
bd08039b
NC
8323 if (HEK_UTF8(hek))
8324 SvUTF8_on (sv);
8325 return sv;
8326 }
8327 /* This will be overwhelminly the most common case. */
409dfe77
NC
8328 {
8329 /* Inline most of newSVpvn_share(), because share_hek_hek() is far
8330 more efficient than sharepvn(). */
8331 SV *sv;
8332
8333 new_SV(sv);
8334 sv_upgrade(sv, SVt_PV);
8335 SvPV_set(sv, (char *)HEK_KEY(share_hek_hek(hek)));
8336 SvCUR_set(sv, HEK_LEN(hek));
8337 SvLEN_set(sv, 0);
8338 SvREADONLY_on(sv);
8339 SvFAKE_on(sv);
8340 SvPOK_on(sv);
8341 if (HEK_UTF8(hek))
8342 SvUTF8_on(sv);
8343 return sv;
8344 }
bd08039b
NC
8345 }
8346}
8347
1c846c1f
NIS
8348/*
8349=for apidoc newSVpvn_share
8350
3f7c398e 8351Creates a new SV with its SvPVX_const pointing to a shared string in the string
645c22ef 8352table. If the string does not already exist in the table, it is created
758fcfc1
VP
8353first. Turns on READONLY and FAKE. If the C<hash> parameter is non-zero, that
8354value is used; otherwise the hash is computed. The string's hash can be later
8355be retrieved from the SV with the C<SvSHARED_HASH()> macro. The idea here is
8356that as the string table is used for shared hash keys these strings will have
8357SvPVX_const == HeKEY and hash lookup will avoid string compare.
1c846c1f
NIS
8358
8359=cut
8360*/
8361
8362SV *
c3654f1a 8363Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
1c846c1f 8364{
97aff369 8365 dVAR;
1c846c1f 8366 register SV *sv;
c3654f1a 8367 bool is_utf8 = FALSE;
a51caccf
NC
8368 const char *const orig_src = src;
8369
c3654f1a 8370 if (len < 0) {
77caf834 8371 STRLEN tmplen = -len;
c3654f1a 8372 is_utf8 = TRUE;
75a54232 8373 /* See the note in hv.c:hv_fetch() --jhi */
e1ec3a88 8374 src = (char*)bytes_from_utf8((const U8*)src, &tmplen, &is_utf8);
75a54232
JH
8375 len = tmplen;
8376 }
1c846c1f 8377 if (!hash)
5afd6d42 8378 PERL_HASH(hash, src, len);
1c846c1f 8379 new_SV(sv);
f46ee248
NC
8380 /* The logic for this is inlined in S_mro_get_linear_isa_dfs(), so if it
8381 changes here, update it there too. */
bdd68bc3 8382 sv_upgrade(sv, SVt_PV);
f880fe2f 8383 SvPV_set(sv, sharepvn(src, is_utf8?-len:len, hash));
b162af07 8384 SvCUR_set(sv, len);
b162af07 8385 SvLEN_set(sv, 0);
1c846c1f
NIS
8386 SvREADONLY_on(sv);
8387 SvFAKE_on(sv);
8388 SvPOK_on(sv);
c3654f1a
IH
8389 if (is_utf8)
8390 SvUTF8_on(sv);
a51caccf
NC
8391 if (src != orig_src)
8392 Safefree(src);
1c846c1f
NIS
8393 return sv;
8394}
8395
9dcc53ea
Z
8396/*
8397=for apidoc newSVpv_share
8398
8399Like C<newSVpvn_share>, but takes a nul-terminated string instead of a
8400string/length pair.
8401
8402=cut
8403*/
8404
8405SV *
8406Perl_newSVpv_share(pTHX_ const char *src, U32 hash)
8407{
8408 return newSVpvn_share(src, strlen(src), hash);
8409}
645c22ef 8410
cea2e8a9 8411#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8412
8413/* pTHX_ magic can't cope with varargs, so this is a no-context
8414 * version of the main function, (which may itself be aliased to us).
8415 * Don't access this version directly.
8416 */
8417
46fc3d4c 8418SV *
23f13727 8419Perl_newSVpvf_nocontext(const char *const pat, ...)
46fc3d4c 8420{
cea2e8a9 8421 dTHX;
46fc3d4c 8422 register SV *sv;
8423 va_list args;
7918f24d
NC
8424
8425 PERL_ARGS_ASSERT_NEWSVPVF_NOCONTEXT;
8426
46fc3d4c 8427 va_start(args, pat);
c5be433b 8428 sv = vnewSVpvf(pat, &args);
46fc3d4c 8429 va_end(args);
8430 return sv;
8431}
cea2e8a9 8432#endif
46fc3d4c 8433
954c1994
GS
8434/*
8435=for apidoc newSVpvf
8436
645c22ef 8437Creates a new SV and initializes it with the string formatted like
954c1994
GS
8438C<sprintf>.
8439
8440=cut
8441*/
8442
cea2e8a9 8443SV *
23f13727 8444Perl_newSVpvf(pTHX_ const char *const pat, ...)
cea2e8a9
GS
8445{
8446 register SV *sv;
8447 va_list args;
7918f24d
NC
8448
8449 PERL_ARGS_ASSERT_NEWSVPVF;
8450
cea2e8a9 8451 va_start(args, pat);
c5be433b 8452 sv = vnewSVpvf(pat, &args);
cea2e8a9
GS
8453 va_end(args);
8454 return sv;
8455}
46fc3d4c 8456
645c22ef
DM
8457/* backend for newSVpvf() and newSVpvf_nocontext() */
8458
79072805 8459SV *
23f13727 8460Perl_vnewSVpvf(pTHX_ const char *const pat, va_list *const args)
c5be433b 8461{
97aff369 8462 dVAR;
c5be433b 8463 register SV *sv;
7918f24d
NC
8464
8465 PERL_ARGS_ASSERT_VNEWSVPVF;
8466
c5be433b 8467 new_SV(sv);
4608196e 8468 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
c5be433b
GS
8469 return sv;
8470}
8471
954c1994
GS
8472/*
8473=for apidoc newSVnv
8474
8475Creates a new SV and copies a floating point value into it.
8476The reference count for the SV is set to 1.
8477
8478=cut
8479*/
8480
c5be433b 8481SV *
23f13727 8482Perl_newSVnv(pTHX_ const NV n)
79072805 8483{
97aff369 8484 dVAR;
463ee0b2 8485 register SV *sv;
79072805 8486
4561caa4 8487 new_SV(sv);
79072805
LW
8488 sv_setnv(sv,n);
8489 return sv;
8490}
8491
954c1994
GS
8492/*
8493=for apidoc newSViv
8494
8495Creates a new SV and copies an integer into it. The reference count for the
8496SV is set to 1.
8497
8498=cut
8499*/
8500
79072805 8501SV *
23f13727 8502Perl_newSViv(pTHX_ const IV i)
79072805 8503{
97aff369 8504 dVAR;
463ee0b2 8505 register SV *sv;
79072805 8506
4561caa4 8507 new_SV(sv);
79072805
LW
8508 sv_setiv(sv,i);
8509 return sv;
8510}
8511
954c1994 8512/*
1a3327fb
JH
8513=for apidoc newSVuv
8514
8515Creates a new SV and copies an unsigned integer into it.
8516The reference count for the SV is set to 1.
8517
8518=cut
8519*/
8520
8521SV *
23f13727 8522Perl_newSVuv(pTHX_ const UV u)
1a3327fb 8523{
97aff369 8524 dVAR;
1a3327fb
JH
8525 register SV *sv;
8526
8527 new_SV(sv);
8528 sv_setuv(sv,u);
8529 return sv;
8530}
8531
8532/*
b9f83d2f
NC
8533=for apidoc newSV_type
8534
c41f7ed2 8535Creates a new SV, of the type specified. The reference count for the new SV
b9f83d2f
NC
8536is set to 1.
8537
8538=cut
8539*/
8540
8541SV *
fe9845cc 8542Perl_newSV_type(pTHX_ const svtype type)
b9f83d2f
NC
8543{
8544 register SV *sv;
8545
8546 new_SV(sv);
8547 sv_upgrade(sv, type);
8548 return sv;
8549}
8550
8551/*
954c1994
GS
8552=for apidoc newRV_noinc
8553
8554Creates an RV wrapper for an SV. The reference count for the original
8555SV is B<not> incremented.
8556
8557=cut
8558*/
8559
2304df62 8560SV *
23f13727 8561Perl_newRV_noinc(pTHX_ SV *const tmpRef)
2304df62 8562{
97aff369 8563 dVAR;
4df7f6af 8564 register SV *sv = newSV_type(SVt_IV);
7918f24d
NC
8565
8566 PERL_ARGS_ASSERT_NEWRV_NOINC;
8567
76e3520e 8568 SvTEMP_off(tmpRef);
b162af07 8569 SvRV_set(sv, tmpRef);
2304df62 8570 SvROK_on(sv);
2304df62
AD
8571 return sv;
8572}
8573
ff276b08 8574/* newRV_inc is the official function name to use now.
645c22ef
DM
8575 * newRV_inc is in fact #defined to newRV in sv.h
8576 */
8577
5f05dabc 8578SV *
23f13727 8579Perl_newRV(pTHX_ SV *const sv)
5f05dabc 8580{
97aff369 8581 dVAR;
7918f24d
NC
8582
8583 PERL_ARGS_ASSERT_NEWRV;
8584
7f466ec7 8585 return newRV_noinc(SvREFCNT_inc_simple_NN(sv));
5f05dabc 8586}
5f05dabc 8587
954c1994
GS
8588/*
8589=for apidoc newSVsv
8590
8591Creates a new SV which is an exact duplicate of the original SV.
645c22ef 8592(Uses C<sv_setsv>).
954c1994
GS
8593
8594=cut
8595*/
8596
79072805 8597SV *
23f13727 8598Perl_newSVsv(pTHX_ register SV *const old)
79072805 8599{
97aff369 8600 dVAR;
463ee0b2 8601 register SV *sv;
79072805
LW
8602
8603 if (!old)
7a5b473e 8604 return NULL;
8990e307 8605 if (SvTYPE(old) == SVTYPEMASK) {
9b387841 8606 Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
a0714e2c 8607 return NULL;
79072805 8608 }
4561caa4 8609 new_SV(sv);
e90aabeb
NC
8610 /* SV_GMAGIC is the default for sv_setv()
8611 SV_NOSTEAL prevents TEMP buffers being, well, stolen, and saves games
8612 with SvTEMP_off and SvTEMP_on round a call to sv_setsv. */
8613 sv_setsv_flags(sv, old, SV_GMAGIC | SV_NOSTEAL);
463ee0b2 8614 return sv;
79072805
LW
8615}
8616
645c22ef
DM
8617/*
8618=for apidoc sv_reset
8619
8620Underlying implementation for the C<reset> Perl function.
8621Note that the perl-level function is vaguely deprecated.
8622
8623=cut
8624*/
8625
79072805 8626void
23f13727 8627Perl_sv_reset(pTHX_ register const char *s, HV *const stash)
79072805 8628{
27da23d5 8629 dVAR;
4802d5d7 8630 char todo[PERL_UCHAR_MAX+1];
79072805 8631
7918f24d
NC
8632 PERL_ARGS_ASSERT_SV_RESET;
8633
49d8d3a1
MB
8634 if (!stash)
8635 return;
8636
79072805 8637 if (!*s) { /* reset ?? searches */
daba3364 8638 MAGIC * const mg = mg_find((const SV *)stash, PERL_MAGIC_symtab);
8d2f4536 8639 if (mg) {
c2b1997a
NC
8640 const U32 count = mg->mg_len / sizeof(PMOP**);
8641 PMOP **pmp = (PMOP**) mg->mg_ptr;
8642 PMOP *const *const end = pmp + count;
8643
8644 while (pmp < end) {
c737faaf 8645#ifdef USE_ITHREADS
c2b1997a 8646 SvREADONLY_off(PL_regex_pad[(*pmp)->op_pmoffset]);
c737faaf 8647#else
c2b1997a 8648 (*pmp)->op_pmflags &= ~PMf_USED;
c737faaf 8649#endif
c2b1997a 8650 ++pmp;
8d2f4536 8651 }
79072805
LW
8652 }
8653 return;
8654 }
8655
8656 /* reset variables */
8657
8658 if (!HvARRAY(stash))
8659 return;
463ee0b2
LW
8660
8661 Zero(todo, 256, char);
79072805 8662 while (*s) {
b464bac0
AL
8663 I32 max;
8664 I32 i = (unsigned char)*s;
79072805
LW
8665 if (s[1] == '-') {
8666 s += 2;
8667 }
4802d5d7 8668 max = (unsigned char)*s++;
79072805 8669 for ( ; i <= max; i++) {
463ee0b2
LW
8670 todo[i] = 1;
8671 }
a0d0e21e 8672 for (i = 0; i <= (I32) HvMAX(stash); i++) {
b464bac0 8673 HE *entry;
79072805 8674 for (entry = HvARRAY(stash)[i];
9e35f4b3
GS
8675 entry;
8676 entry = HeNEXT(entry))
8677 {
b464bac0
AL
8678 register GV *gv;
8679 register SV *sv;
8680
1edc1566 8681 if (!todo[(U8)*HeKEY(entry)])
463ee0b2 8682 continue;
159b6efe 8683 gv = MUTABLE_GV(HeVAL(entry));
79072805 8684 sv = GvSV(gv);
e203899d
NC
8685 if (sv) {
8686 if (SvTHINKFIRST(sv)) {
8687 if (!SvREADONLY(sv) && SvROK(sv))
8688 sv_unref(sv);
8689 /* XXX Is this continue a bug? Why should THINKFIRST
8690 exempt us from resetting arrays and hashes? */
8691 continue;
8692 }
8693 SvOK_off(sv);
8694 if (SvTYPE(sv) >= SVt_PV) {
8695 SvCUR_set(sv, 0);
bd61b366 8696 if (SvPVX_const(sv) != NULL)
e203899d
NC
8697 *SvPVX(sv) = '\0';
8698 SvTAINT(sv);
8699 }
79072805
LW
8700 }
8701 if (GvAV(gv)) {
8702 av_clear(GvAV(gv));
8703 }
bfcb3514 8704 if (GvHV(gv) && !HvNAME_get(GvHV(gv))) {
b0269e46
AB
8705#if defined(VMS)
8706 Perl_die(aTHX_ "Can't reset %%ENV on this system");
8707#else /* ! VMS */
463ee0b2 8708 hv_clear(GvHV(gv));
b0269e46
AB
8709# if defined(USE_ENVIRON_ARRAY)
8710 if (gv == PL_envgv)
8711 my_clearenv();
8712# endif /* USE_ENVIRON_ARRAY */
8713#endif /* VMS */
79072805
LW
8714 }
8715 }
8716 }
8717 }
8718}
8719
645c22ef
DM
8720/*
8721=for apidoc sv_2io
8722
8723Using various gambits, try to get an IO from an SV: the IO slot if its a
8724GV; or the recursive result if we're an RV; or the IO slot of the symbol
8725named after the PV if we're a string.
8726
8727=cut
8728*/
8729
46fc3d4c 8730IO*
23f13727 8731Perl_sv_2io(pTHX_ SV *const sv)
46fc3d4c 8732{
8733 IO* io;
8734 GV* gv;
8735
7918f24d
NC
8736 PERL_ARGS_ASSERT_SV_2IO;
8737
46fc3d4c 8738 switch (SvTYPE(sv)) {
8739 case SVt_PVIO:
a45c7426 8740 io = MUTABLE_IO(sv);
46fc3d4c 8741 break;
8742 case SVt_PVGV:
13be902c 8743 case SVt_PVLV:
6e592b3a 8744 if (isGV_with_GP(sv)) {
159b6efe 8745 gv = MUTABLE_GV(sv);
6e592b3a
BM
8746 io = GvIO(gv);
8747 if (!io)
8748 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
8749 break;
8750 }
8751 /* FALL THROUGH */
46fc3d4c 8752 default:
8753 if (!SvOK(sv))
cea2e8a9 8754 Perl_croak(aTHX_ PL_no_usym, "filehandle");
46fc3d4c 8755 if (SvROK(sv))
8756 return sv_2io(SvRV(sv));
f776e3cd 8757 gv = gv_fetchsv(sv, 0, SVt_PVIO);
46fc3d4c 8758 if (gv)
8759 io = GvIO(gv);
8760 else
8761 io = 0;
8762 if (!io)
be2597df 8763 Perl_croak(aTHX_ "Bad filehandle: %"SVf, SVfARG(sv));
46fc3d4c 8764 break;
8765 }
8766 return io;
8767}
8768
645c22ef
DM
8769/*
8770=for apidoc sv_2cv
8771
8772Using various gambits, try to get a CV from an SV; in addition, try if
8773possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
8e324704 8774The flags in C<lref> are passed to gv_fetchsv.
645c22ef
DM
8775
8776=cut
8777*/
8778
79072805 8779CV *
23f13727 8780Perl_sv_2cv(pTHX_ SV *sv, HV **const st, GV **const gvp, const I32 lref)
79072805 8781{
27da23d5 8782 dVAR;
a0714e2c 8783 GV *gv = NULL;
601f1833 8784 CV *cv = NULL;
79072805 8785
7918f24d
NC
8786 PERL_ARGS_ASSERT_SV_2CV;
8787
85dec29a
NC
8788 if (!sv) {
8789 *st = NULL;
8790 *gvp = NULL;
8791 return NULL;
8792 }
79072805 8793 switch (SvTYPE(sv)) {
79072805
LW
8794 case SVt_PVCV:
8795 *st = CvSTASH(sv);
a0714e2c 8796 *gvp = NULL;
ea726b52 8797 return MUTABLE_CV(sv);
79072805
LW
8798 case SVt_PVHV:
8799 case SVt_PVAV:
ef58ba18 8800 *st = NULL;
a0714e2c 8801 *gvp = NULL;
601f1833 8802 return NULL;
8990e307 8803 case SVt_PVGV:
6e592b3a 8804 if (isGV_with_GP(sv)) {
159b6efe 8805 gv = MUTABLE_GV(sv);
6e592b3a
BM
8806 *gvp = gv;
8807 *st = GvESTASH(gv);
8808 goto fix_gv;
8809 }
8810 /* FALL THROUGH */
8990e307 8811
79072805 8812 default:
a0d0e21e 8813 if (SvROK(sv)) {
c4f3bd1e 8814 SvGETMAGIC(sv);
8897dcaa
NC
8815 sv = amagic_deref_call(sv, to_cv_amg);
8816 /* At this point I'd like to do SPAGAIN, but really I need to
8817 force it upon my callers. Hmmm. This is a mess... */
f5284f61 8818
62f274bf
GS
8819 sv = SvRV(sv);
8820 if (SvTYPE(sv) == SVt_PVCV) {
ea726b52 8821 cv = MUTABLE_CV(sv);
a0714e2c 8822 *gvp = NULL;
62f274bf
GS
8823 *st = CvSTASH(cv);
8824 return cv;
8825 }
6e592b3a 8826 else if(isGV_with_GP(sv))
159b6efe 8827 gv = MUTABLE_GV(sv);
62f274bf 8828 else
cea2e8a9 8829 Perl_croak(aTHX_ "Not a subroutine reference");
a0d0e21e 8830 }
6e592b3a 8831 else if (isGV_with_GP(sv)) {
9d0f7ed7 8832 SvGETMAGIC(sv);
159b6efe 8833 gv = MUTABLE_GV(sv);
9d0f7ed7 8834 }
79072805 8835 else
9d0f7ed7 8836 gv = gv_fetchsv(sv, lref, SVt_PVCV); /* Calls get magic */
79072805 8837 *gvp = gv;
ef58ba18
NC
8838 if (!gv) {
8839 *st = NULL;
601f1833 8840 return NULL;
ef58ba18 8841 }
e26df76a 8842 /* Some flags to gv_fetchsv mean don't really create the GV */
6e592b3a 8843 if (!isGV_with_GP(gv)) {
e26df76a
NC
8844 *st = NULL;
8845 return NULL;
8846 }
79072805 8847 *st = GvESTASH(gv);
8990e307 8848 fix_gv:
8ebc5c01 8849 if (lref && !GvCVu(gv)) {
4633a7c4 8850 SV *tmpsv;
748a9306 8851 ENTER;
561b68a9 8852 tmpsv = newSV(0);
bd61b366 8853 gv_efullname3(tmpsv, gv, NULL);
f6ec51f7
GS
8854 /* XXX this is probably not what they think they're getting.
8855 * It has the same effect as "sub name;", i.e. just a forward
8856 * declaration! */
774d564b 8857 newSUB(start_subparse(FALSE, 0),
4633a7c4 8858 newSVOP(OP_CONST, 0, tmpsv),
5f66b61c 8859 NULL, NULL);
748a9306 8860 LEAVE;
8ebc5c01 8861 if (!GvCVu(gv))
35c1215d 8862 Perl_croak(aTHX_ "Unable to create sub named \"%"SVf"\"",
4052d21c 8863 SVfARG(SvOK(sv) ? sv : &PL_sv_no));
8990e307 8864 }
8ebc5c01 8865 return GvCVu(gv);
79072805
LW
8866 }
8867}
8868
c461cf8f
JH
8869/*
8870=for apidoc sv_true
8871
8872Returns true if the SV has a true value by Perl's rules.
645c22ef
DM
8873Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
8874instead use an in-line version.
c461cf8f
JH
8875
8876=cut
8877*/
8878
79072805 8879I32
23f13727 8880Perl_sv_true(pTHX_ register SV *const sv)
79072805 8881{
8990e307
LW
8882 if (!sv)
8883 return 0;
79072805 8884 if (SvPOK(sv)) {
823a54a3
AL
8885 register const XPV* const tXpv = (XPV*)SvANY(sv);
8886 if (tXpv &&
c2f1de04 8887 (tXpv->xpv_cur > 1 ||
339049b0 8888 (tXpv->xpv_cur && *sv->sv_u.svu_pv != '0')))
79072805
LW
8889 return 1;
8890 else
8891 return 0;
8892 }
8893 else {
8894 if (SvIOK(sv))
463ee0b2 8895 return SvIVX(sv) != 0;
79072805
LW
8896 else {
8897 if (SvNOK(sv))
463ee0b2 8898 return SvNVX(sv) != 0.0;
79072805 8899 else
463ee0b2 8900 return sv_2bool(sv);
79072805
LW
8901 }
8902 }
8903}
79072805 8904
645c22ef 8905/*
c461cf8f
JH
8906=for apidoc sv_pvn_force
8907
8908Get a sensible string out of the SV somehow.
645c22ef
DM
8909A private implementation of the C<SvPV_force> macro for compilers which
8910can't cope with complex macro expressions. Always use the macro instead.
c461cf8f 8911
8d6d96c1
HS
8912=for apidoc sv_pvn_force_flags
8913
8914Get a sensible string out of the SV somehow.
8915If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
8916appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
8917implemented in terms of this function.
645c22ef
DM
8918You normally want to use the various wrapper macros instead: see
8919C<SvPV_force> and C<SvPV_force_nomg>
8d6d96c1
HS
8920
8921=cut
8922*/
8923
8924char *
12964ddd 8925Perl_sv_pvn_force_flags(pTHX_ SV *const sv, STRLEN *const lp, const I32 flags)
8d6d96c1 8926{
97aff369 8927 dVAR;
7918f24d
NC
8928
8929 PERL_ARGS_ASSERT_SV_PVN_FORCE_FLAGS;
8930
6fc92669 8931 if (SvTHINKFIRST(sv) && !SvROK(sv))
765f542d 8932 sv_force_normal_flags(sv, 0);
1c846c1f 8933
a0d0e21e 8934 if (SvPOK(sv)) {
13c5b33c
NC
8935 if (lp)
8936 *lp = SvCUR(sv);
a0d0e21e
LW
8937 }
8938 else {
a3b680e6 8939 char *s;
13c5b33c
NC
8940 STRLEN len;
8941
4d84ee25 8942 if (SvREADONLY(sv) && !(flags & SV_MUTABLE_RETURN)) {
b64e5050 8943 const char * const ref = sv_reftype(sv,0);
4d84ee25
NC
8944 if (PL_op)
8945 Perl_croak(aTHX_ "Can't coerce readonly %s to string in %s",
94bbb3f4 8946 ref, OP_DESC(PL_op));
4d84ee25 8947 else
b64e5050 8948 Perl_croak(aTHX_ "Can't coerce readonly %s to string", ref);
4d84ee25 8949 }
1f257c95
NC
8950 if ((SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM)
8951 || isGV_with_GP(sv))
cea2e8a9 8952 Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
94bbb3f4 8953 OP_DESC(PL_op));
b64e5050 8954 s = sv_2pv_flags(sv, &len, flags);
13c5b33c
NC
8955 if (lp)
8956 *lp = len;
8957
3f7c398e 8958 if (s != SvPVX_const(sv)) { /* Almost, but not quite, sv_setpvn() */
a0d0e21e
LW
8959 if (SvROK(sv))
8960 sv_unref(sv);
862a34c6 8961 SvUPGRADE(sv, SVt_PV); /* Never FALSE */
a0d0e21e 8962 SvGROW(sv, len + 1);
706aa1c9 8963 Move(s,SvPVX(sv),len,char);
a0d0e21e 8964 SvCUR_set(sv, len);
97a130b8 8965 SvPVX(sv)[len] = '\0';
a0d0e21e
LW
8966 }
8967 if (!SvPOK(sv)) {
8968 SvPOK_on(sv); /* validate pointer */
8969 SvTAINT(sv);
1d7c1841 8970 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3f7c398e 8971 PTR2UV(sv),SvPVX_const(sv)));
a0d0e21e
LW
8972 }
8973 }
4d84ee25 8974 return SvPVX_mutable(sv);
a0d0e21e
LW
8975}
8976
645c22ef 8977/*
645c22ef
DM
8978=for apidoc sv_pvbyten_force
8979
0feed65a 8980The backend for the C<SvPVbytex_force> macro. Always use the macro instead.
645c22ef
DM
8981
8982=cut
8983*/
8984
7340a771 8985char *
12964ddd 8986Perl_sv_pvbyten_force(pTHX_ SV *const sv, STRLEN *const lp)
7340a771 8987{
7918f24d
NC
8988 PERL_ARGS_ASSERT_SV_PVBYTEN_FORCE;
8989
46ec2f14 8990 sv_pvn_force(sv,lp);
ffebcc3e 8991 sv_utf8_downgrade(sv,0);
46ec2f14
TS
8992 *lp = SvCUR(sv);
8993 return SvPVX(sv);
7340a771
GS
8994}
8995
645c22ef 8996/*
c461cf8f
JH
8997=for apidoc sv_pvutf8n_force
8998
0feed65a 8999The backend for the C<SvPVutf8x_force> macro. Always use the macro instead.
c461cf8f
JH
9000
9001=cut
9002*/
9003
7340a771 9004char *
12964ddd 9005Perl_sv_pvutf8n_force(pTHX_ SV *const sv, STRLEN *const lp)
7340a771 9006{
7918f24d
NC
9007 PERL_ARGS_ASSERT_SV_PVUTF8N_FORCE;
9008
46ec2f14 9009 sv_pvn_force(sv,lp);
560a288e 9010 sv_utf8_upgrade(sv);
46ec2f14
TS
9011 *lp = SvCUR(sv);
9012 return SvPVX(sv);
7340a771
GS
9013}
9014
c461cf8f 9015/*
cba0b539 9016=for apidoc sv_reftype
05c0d6bb 9017
cba0b539 9018Returns a string describing what the SV is a reference to.
c461cf8f
JH
9019
9020=cut
9021*/
9022
2b388283 9023const char *
cba0b539 9024Perl_sv_reftype(pTHX_ const SV *const sv, const int ob)
a0d0e21e 9025{
cba0b539 9026 PERL_ARGS_ASSERT_SV_REFTYPE;
7918f24d 9027
cba0b539 9028 /* The fact that I don't need to downcast to char * everywhere, only in ?:
07409e01 9029 inside return suggests a const propagation bug in g++. */
c86bf373 9030 if (ob && SvOBJECT(sv)) {
1b6737cc 9031 char * const name = HvNAME_get(SvSTASH(sv));
cba0b539 9032 return name ? name : (char *) "__ANON__";
c86bf373 9033 }
a0d0e21e
LW
9034 else {
9035 switch (SvTYPE(sv)) {
9036 case SVt_NULL:
9037 case SVt_IV:
9038 case SVt_NV:
a0d0e21e
LW
9039 case SVt_PV:
9040 case SVt_PVIV:
9041 case SVt_PVNV:
9042 case SVt_PVMG:
1cb0ed9b 9043 if (SvVOK(sv))
cba0b539 9044 return "VSTRING";
a0d0e21e 9045 if (SvROK(sv))
cba0b539 9046 return "REF";
a0d0e21e 9047 else
cba0b539
FR
9048 return "SCALAR";
9049
9050 case SVt_PVLV: return (char *) (SvROK(sv) ? "REF"
9051 /* tied lvalues should appear to be
9052 * scalars for backwards compatitbility */
9053 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
9054 ? "SCALAR" : "LVALUE");
9055 case SVt_PVAV: return "ARRAY";
9056 case SVt_PVHV: return "HASH";
9057 case SVt_PVCV: return "CODE";
9058 case SVt_PVGV: return (char *) (isGV_with_GP(sv)
9059 ? "GLOB" : "SCALAR");
9060 case SVt_PVFM: return "FORMAT";
9061 case SVt_PVIO: return "IO";
9062 case SVt_BIND: return "BIND";
9063 case SVt_REGEXP: return "REGEXP";
9064 default: return "UNKNOWN";
a0d0e21e
LW
9065 }
9066 }
9067}
9068
954c1994
GS
9069/*
9070=for apidoc sv_isobject
9071
9072Returns a boolean indicating whether the SV is an RV pointing to a blessed
9073object. If the SV is not an RV, or if the object is not blessed, then this
9074will return false.
9075
9076=cut
9077*/
9078
463ee0b2 9079int
864dbfa3 9080Perl_sv_isobject(pTHX_ SV *sv)
85e6fe83 9081{
68dc0745 9082 if (!sv)
9083 return 0;
5b295bef 9084 SvGETMAGIC(sv);
85e6fe83
LW
9085 if (!SvROK(sv))
9086 return 0;
daba3364 9087 sv = SvRV(sv);
85e6fe83
LW
9088 if (!SvOBJECT(sv))
9089 return 0;
9090 return 1;
9091}
9092
954c1994
GS
9093/*
9094=for apidoc sv_isa
9095
9096Returns a boolean indicating whether the SV is blessed into the specified
9097class. This does not check for subtypes; use C<sv_derived_from> to verify
9098an inheritance relationship.
9099
9100=cut
9101*/
9102
85e6fe83 9103int
12964ddd 9104Perl_sv_isa(pTHX_ SV *sv, const char *const name)
463ee0b2 9105{
bfcb3514 9106 const char *hvname;
7918f24d
NC
9107
9108 PERL_ARGS_ASSERT_SV_ISA;
9109
68dc0745 9110 if (!sv)
9111 return 0;
5b295bef 9112 SvGETMAGIC(sv);
ed6116ce 9113 if (!SvROK(sv))
463ee0b2 9114 return 0;
daba3364 9115 sv = SvRV(sv);
ed6116ce 9116 if (!SvOBJECT(sv))
463ee0b2 9117 return 0;
bfcb3514
NC
9118 hvname = HvNAME_get(SvSTASH(sv));
9119 if (!hvname)
e27ad1f2 9120 return 0;
463ee0b2 9121
bfcb3514 9122 return strEQ(hvname, name);
463ee0b2
LW
9123}
9124
954c1994
GS
9125/*
9126=for apidoc newSVrv
9127
9128Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
9129it will be upgraded to one. If C<classname> is non-null then the new SV will
9130be blessed in the specified package. The new SV is returned and its
9131reference count is 1.
9132
9133=cut
9134*/
9135
463ee0b2 9136SV*
12964ddd 9137Perl_newSVrv(pTHX_ SV *const rv, const char *const classname)
463ee0b2 9138{
97aff369 9139 dVAR;
463ee0b2
LW
9140 SV *sv;
9141
7918f24d
NC
9142 PERL_ARGS_ASSERT_NEWSVRV;
9143
4561caa4 9144 new_SV(sv);
51cf62d8 9145
765f542d 9146 SV_CHECK_THINKFIRST_COW_DROP(rv);
52944de8 9147 (void)SvAMAGIC_off(rv);
51cf62d8 9148
0199fce9 9149 if (SvTYPE(rv) >= SVt_PVMG) {
a3b680e6 9150 const U32 refcnt = SvREFCNT(rv);
0199fce9
JD
9151 SvREFCNT(rv) = 0;
9152 sv_clear(rv);
9153 SvFLAGS(rv) = 0;
9154 SvREFCNT(rv) = refcnt;
0199fce9 9155
4df7f6af 9156 sv_upgrade(rv, SVt_IV);
dc5494d2
NC
9157 } else if (SvROK(rv)) {
9158 SvREFCNT_dec(SvRV(rv));
43230e26
NC
9159 } else {
9160 prepare_SV_for_RV(rv);
0199fce9 9161 }
51cf62d8 9162
0c34ef67 9163 SvOK_off(rv);
b162af07 9164 SvRV_set(rv, sv);
ed6116ce 9165 SvROK_on(rv);
463ee0b2 9166
a0d0e21e 9167 if (classname) {
da51bb9b 9168 HV* const stash = gv_stashpv(classname, GV_ADD);
a0d0e21e
LW
9169 (void)sv_bless(rv, stash);
9170 }
9171 return sv;
9172}
9173
954c1994
GS
9174/*
9175=for apidoc sv_setref_pv
9176
9177Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
9178argument will be upgraded to an RV. That RV will be modified to point to
9179the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
9180into the SV. The C<classname> argument indicates the package for the
bd61b366 9181blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 9182will have a reference count of 1, and the RV will be returned.
954c1994
GS
9183
9184Do not use with other Perl types such as HV, AV, SV, CV, because those
9185objects will become corrupted by the pointer copy process.
9186
9187Note that C<sv_setref_pvn> copies the string while this copies the pointer.
9188
9189=cut
9190*/
9191
a0d0e21e 9192SV*
12964ddd 9193Perl_sv_setref_pv(pTHX_ SV *const rv, const char *const classname, void *const pv)
a0d0e21e 9194{
97aff369 9195 dVAR;
7918f24d
NC
9196
9197 PERL_ARGS_ASSERT_SV_SETREF_PV;
9198
189b2af5 9199 if (!pv) {
3280af22 9200 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
9201 SvSETMAGIC(rv);
9202 }
a0d0e21e 9203 else
56431972 9204 sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
a0d0e21e
LW
9205 return rv;
9206}
9207
954c1994
GS
9208/*
9209=for apidoc sv_setref_iv
9210
9211Copies an integer into a new SV, optionally blessing the SV. The C<rv>
9212argument will be upgraded to an RV. That RV will be modified to point to
9213the new SV. The C<classname> argument indicates the package for the
bd61b366 9214blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 9215will have a reference count of 1, and the RV will be returned.
954c1994
GS
9216
9217=cut
9218*/
9219
a0d0e21e 9220SV*
12964ddd 9221Perl_sv_setref_iv(pTHX_ SV *const rv, const char *const classname, const IV iv)
a0d0e21e 9222{
7918f24d
NC
9223 PERL_ARGS_ASSERT_SV_SETREF_IV;
9224
a0d0e21e
LW
9225 sv_setiv(newSVrv(rv,classname), iv);
9226 return rv;
9227}
9228
954c1994 9229/*
e1c57cef
JH
9230=for apidoc sv_setref_uv
9231
9232Copies an unsigned integer into a new SV, optionally blessing the SV. The C<rv>
9233argument will be upgraded to an RV. That RV will be modified to point to
9234the new SV. The C<classname> argument indicates the package for the
bd61b366 9235blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 9236will have a reference count of 1, and the RV will be returned.
e1c57cef
JH
9237
9238=cut
9239*/
9240
9241SV*
12964ddd 9242Perl_sv_setref_uv(pTHX_ SV *const rv, const char *const classname, const UV uv)
e1c57cef 9243{
7918f24d
NC
9244 PERL_ARGS_ASSERT_SV_SETREF_UV;
9245
e1c57cef
JH
9246 sv_setuv(newSVrv(rv,classname), uv);
9247 return rv;
9248}
9249
9250/*
954c1994
GS
9251=for apidoc sv_setref_nv
9252
9253Copies a double into a new SV, optionally blessing the SV. The C<rv>
9254argument will be upgraded to an RV. That RV will be modified to point to
9255the new SV. The C<classname> argument indicates the package for the
bd61b366 9256blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 9257will have a reference count of 1, and the RV will be returned.
954c1994
GS
9258
9259=cut
9260*/
9261
a0d0e21e 9262SV*
12964ddd 9263Perl_sv_setref_nv(pTHX_ SV *const rv, const char *const classname, const NV nv)
a0d0e21e 9264{
7918f24d
NC
9265 PERL_ARGS_ASSERT_SV_SETREF_NV;
9266
a0d0e21e
LW
9267 sv_setnv(newSVrv(rv,classname), nv);
9268 return rv;
9269}
463ee0b2 9270
954c1994
GS
9271/*
9272=for apidoc sv_setref_pvn
9273
9274Copies a string into a new SV, optionally blessing the SV. The length of the
9275string must be specified with C<n>. The C<rv> argument will be upgraded to
9276an RV. That RV will be modified to point to the new SV. The C<classname>
9277argument indicates the package for the blessing. Set C<classname> to
bd61b366 9278C<NULL> to avoid the blessing. The new SV will have a reference count
d34c2299 9279of 1, and the RV will be returned.
954c1994
GS
9280
9281Note that C<sv_setref_pv> copies the pointer while this copies the string.
9282
9283=cut
9284*/
9285
a0d0e21e 9286SV*
12964ddd
SS
9287Perl_sv_setref_pvn(pTHX_ SV *const rv, const char *const classname,
9288 const char *const pv, const STRLEN n)
a0d0e21e 9289{
7918f24d
NC
9290 PERL_ARGS_ASSERT_SV_SETREF_PVN;
9291
a0d0e21e 9292 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
9293 return rv;
9294}
9295
954c1994
GS
9296/*
9297=for apidoc sv_bless
9298
9299Blesses an SV into a specified package. The SV must be an RV. The package
9300must be designated by its stash (see C<gv_stashpv()>). The reference count
9301of the SV is unaffected.
9302
9303=cut
9304*/
9305
a0d0e21e 9306SV*
12964ddd 9307Perl_sv_bless(pTHX_ SV *const sv, HV *const stash)
a0d0e21e 9308{
97aff369 9309 dVAR;
76e3520e 9310 SV *tmpRef;
7918f24d
NC
9311
9312 PERL_ARGS_ASSERT_SV_BLESS;
9313
a0d0e21e 9314 if (!SvROK(sv))
cea2e8a9 9315 Perl_croak(aTHX_ "Can't bless non-reference value");
76e3520e
GS
9316 tmpRef = SvRV(sv);
9317 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
e0744413
NC
9318 if (SvIsCOW(tmpRef))
9319 sv_force_normal_flags(tmpRef, 0);
76e3520e 9320 if (SvREADONLY(tmpRef))
6ad8f254 9321 Perl_croak_no_modify(aTHX);
76e3520e
GS
9322 if (SvOBJECT(tmpRef)) {
9323 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 9324 --PL_sv_objcount;
76e3520e 9325 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 9326 }
a0d0e21e 9327 }
76e3520e
GS
9328 SvOBJECT_on(tmpRef);
9329 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 9330 ++PL_sv_objcount;
862a34c6 9331 SvUPGRADE(tmpRef, SVt_PVMG);
85fbaab2 9332 SvSTASH_set(tmpRef, MUTABLE_HV(SvREFCNT_inc_simple(stash)));
a0d0e21e 9333
2e3febc6
CS
9334 if (Gv_AMG(stash))
9335 SvAMAGIC_on(sv);
9336 else
52944de8 9337 (void)SvAMAGIC_off(sv);
a0d0e21e 9338
1edbfb88
AB
9339 if(SvSMAGICAL(tmpRef))
9340 if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
9341 mg_set(tmpRef);
9342
9343
ecdeb87c 9344
a0d0e21e
LW
9345 return sv;
9346}
9347
13be902c
FC
9348/* Downgrades a PVGV to a PVMG. If it’s actually a PVLV, we leave the type
9349 * as it is after unglobbing it.
645c22ef
DM
9350 */
9351
76e3520e 9352STATIC void
89e38212 9353S_sv_unglob(pTHX_ SV *const sv)
a0d0e21e 9354{
97aff369 9355 dVAR;
850fabdf 9356 void *xpvmg;
dd69841b 9357 HV *stash;
b37c2d43 9358 SV * const temp = sv_newmortal();
850fabdf 9359
7918f24d
NC
9360 PERL_ARGS_ASSERT_SV_UNGLOB;
9361
13be902c 9362 assert(SvTYPE(sv) == SVt_PVGV || SvTYPE(sv) == SVt_PVLV);
a0d0e21e 9363 SvFAKE_off(sv);
159b6efe 9364 gv_efullname3(temp, MUTABLE_GV(sv), "*");
180488f8 9365
f7877b28 9366 if (GvGP(sv)) {
159b6efe
NC
9367 if(GvCVu((const GV *)sv) && (stash = GvSTASH(MUTABLE_GV(sv)))
9368 && HvNAME_get(stash))
dd69841b 9369 mro_method_changed_in(stash);
159b6efe 9370 gp_free(MUTABLE_GV(sv));
f7877b28 9371 }
e826b3c7 9372 if (GvSTASH(sv)) {
daba3364 9373 sv_del_backref(MUTABLE_SV(GvSTASH(sv)), sv);
5c284bb0 9374 GvSTASH(sv) = NULL;
e826b3c7 9375 }
a5f75d66 9376 GvMULTI_off(sv);
acda4c6a
NC
9377 if (GvNAME_HEK(sv)) {
9378 unshare_hek(GvNAME_HEK(sv));
9379 }
2e5b91de 9380 isGV_with_GP_off(sv);
850fabdf 9381
13be902c
FC
9382 if(SvTYPE(sv) == SVt_PVGV) {
9383 /* need to keep SvANY(sv) in the right arena */
9384 xpvmg = new_XPVMG();
9385 StructCopy(SvANY(sv), xpvmg, XPVMG);
9386 del_XPVGV(SvANY(sv));
9387 SvANY(sv) = xpvmg;
850fabdf 9388
13be902c
FC
9389 SvFLAGS(sv) &= ~SVTYPEMASK;
9390 SvFLAGS(sv) |= SVt_PVMG;
9391 }
180488f8
NC
9392
9393 /* Intentionally not calling any local SET magic, as this isn't so much a
9394 set operation as merely an internal storage change. */
9395 sv_setsv_flags(sv, temp, 0);
a0d0e21e
LW
9396}
9397
954c1994 9398/*
840a7b70 9399=for apidoc sv_unref_flags
954c1994
GS
9400
9401Unsets the RV status of the SV, and decrements the reference count of
9402whatever was being referenced by the RV. This can almost be thought of
840a7b70
IZ
9403as a reversal of C<newSVrv>. The C<cflags> argument can contain
9404C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
9405(otherwise the decrementing is conditional on the reference count being
9406different from one or the reference being a readonly SV).
7889fe52 9407See C<SvROK_off>.
954c1994
GS
9408
9409=cut
9410*/
9411
ed6116ce 9412void
89e38212 9413Perl_sv_unref_flags(pTHX_ SV *const ref, const U32 flags)
ed6116ce 9414{
b64e5050 9415 SV* const target = SvRV(ref);
810b8aa5 9416
7918f24d
NC
9417 PERL_ARGS_ASSERT_SV_UNREF_FLAGS;
9418
e15faf7d
NC
9419 if (SvWEAKREF(ref)) {
9420 sv_del_backref(target, ref);
9421 SvWEAKREF_off(ref);
9422 SvRV_set(ref, NULL);
810b8aa5
GS
9423 return;
9424 }
e15faf7d
NC
9425 SvRV_set(ref, NULL);
9426 SvROK_off(ref);
9427 /* You can't have a || SvREADONLY(target) here, as $a = $$a, where $a was
04ca4930 9428 assigned to as BEGIN {$a = \"Foo"} will fail. */
e15faf7d
NC
9429 if (SvREFCNT(target) != 1 || (flags & SV_IMMEDIATE_UNREF))
9430 SvREFCNT_dec(target);
840a7b70 9431 else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
e15faf7d 9432 sv_2mortal(target); /* Schedule for freeing later */
ed6116ce 9433}
8990e307 9434
840a7b70 9435/*
645c22ef
DM
9436=for apidoc sv_untaint
9437
9438Untaint an SV. Use C<SvTAINTED_off> instead.
9439=cut
9440*/
9441
bbce6d69 9442void
89e38212 9443Perl_sv_untaint(pTHX_ SV *const sv)
bbce6d69 9444{
7918f24d
NC
9445 PERL_ARGS_ASSERT_SV_UNTAINT;
9446
13f57bf8 9447 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
b64e5050 9448 MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
36477c24 9449 if (mg)
565764a8 9450 mg->mg_len &= ~1;
36477c24 9451 }
bbce6d69 9452}
9453
645c22ef
DM
9454/*
9455=for apidoc sv_tainted
9456
9457Test an SV for taintedness. Use C<SvTAINTED> instead.
9458=cut
9459*/
9460
bbce6d69 9461bool
89e38212 9462Perl_sv_tainted(pTHX_ SV *const sv)
bbce6d69 9463{
7918f24d
NC
9464 PERL_ARGS_ASSERT_SV_TAINTED;
9465
13f57bf8 9466 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
823a54a3 9467 const MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
2ddb8a4f 9468 if (mg && (mg->mg_len & 1) )
36477c24 9469 return TRUE;
9470 }
9471 return FALSE;
bbce6d69 9472}
9473
09540bc3
JH
9474/*
9475=for apidoc sv_setpviv
9476
9477Copies an integer into the given SV, also updating its string value.
9478Does not handle 'set' magic. See C<sv_setpviv_mg>.
9479
9480=cut
9481*/
9482
9483void
89e38212 9484Perl_sv_setpviv(pTHX_ SV *const sv, const IV iv)
09540bc3
JH
9485{
9486 char buf[TYPE_CHARS(UV)];
9487 char *ebuf;
b64e5050 9488 char * const ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
09540bc3 9489
7918f24d
NC
9490 PERL_ARGS_ASSERT_SV_SETPVIV;
9491
09540bc3
JH
9492 sv_setpvn(sv, ptr, ebuf - ptr);
9493}
9494
9495/*
9496=for apidoc sv_setpviv_mg
9497
9498Like C<sv_setpviv>, but also handles 'set' magic.
9499
9500=cut
9501*/
9502
9503void
89e38212 9504Perl_sv_setpviv_mg(pTHX_ SV *const sv, const IV iv)
09540bc3 9505{
7918f24d
NC
9506 PERL_ARGS_ASSERT_SV_SETPVIV_MG;
9507
df7eb254 9508 sv_setpviv(sv, iv);
09540bc3
JH
9509 SvSETMAGIC(sv);
9510}
9511
cea2e8a9 9512#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
9513
9514/* pTHX_ magic can't cope with varargs, so this is a no-context
9515 * version of the main function, (which may itself be aliased to us).
9516 * Don't access this version directly.
9517 */
9518
cea2e8a9 9519void
89e38212 9520Perl_sv_setpvf_nocontext(SV *const sv, const char *const pat, ...)
cea2e8a9
GS
9521{
9522 dTHX;
9523 va_list args;
7918f24d
NC
9524
9525 PERL_ARGS_ASSERT_SV_SETPVF_NOCONTEXT;
9526
cea2e8a9 9527 va_start(args, pat);
c5be433b 9528 sv_vsetpvf(sv, pat, &args);
cea2e8a9
GS
9529 va_end(args);
9530}
9531
645c22ef
DM
9532/* pTHX_ magic can't cope with varargs, so this is a no-context
9533 * version of the main function, (which may itself be aliased to us).
9534 * Don't access this version directly.
9535 */
cea2e8a9
GS
9536
9537void
89e38212 9538Perl_sv_setpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
cea2e8a9
GS
9539{
9540 dTHX;
9541 va_list args;
7918f24d
NC
9542
9543 PERL_ARGS_ASSERT_SV_SETPVF_MG_NOCONTEXT;
9544
cea2e8a9 9545 va_start(args, pat);
c5be433b 9546 sv_vsetpvf_mg(sv, pat, &args);
cea2e8a9 9547 va_end(args);
cea2e8a9
GS
9548}
9549#endif
9550
954c1994
GS
9551/*
9552=for apidoc sv_setpvf
9553
bffc3d17
SH
9554Works like C<sv_catpvf> but copies the text into the SV instead of
9555appending it. Does not handle 'set' magic. See C<sv_setpvf_mg>.
954c1994
GS
9556
9557=cut
9558*/
9559
46fc3d4c 9560void
89e38212 9561Perl_sv_setpvf(pTHX_ SV *const sv, const char *const pat, ...)
46fc3d4c 9562{
9563 va_list args;
7918f24d
NC
9564
9565 PERL_ARGS_ASSERT_SV_SETPVF;
9566
46fc3d4c 9567 va_start(args, pat);
c5be433b 9568 sv_vsetpvf(sv, pat, &args);
46fc3d4c 9569 va_end(args);
9570}
9571
bffc3d17
SH
9572/*
9573=for apidoc sv_vsetpvf
9574
9575Works like C<sv_vcatpvf> but copies the text into the SV instead of
9576appending it. Does not handle 'set' magic. See C<sv_vsetpvf_mg>.
9577
9578Usually used via its frontend C<sv_setpvf>.
9579
9580=cut
9581*/
645c22ef 9582
c5be433b 9583void
89e38212 9584Perl_sv_vsetpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args)
c5be433b 9585{
7918f24d
NC
9586 PERL_ARGS_ASSERT_SV_VSETPVF;
9587
4608196e 9588 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
c5be433b 9589}
ef50df4b 9590
954c1994
GS
9591/*
9592=for apidoc sv_setpvf_mg
9593
9594Like C<sv_setpvf>, but also handles 'set' magic.
9595
9596=cut
9597*/
9598
ef50df4b 9599void
89e38212 9600Perl_sv_setpvf_mg(pTHX_ SV *const sv, const char *const pat, ...)
ef50df4b
GS
9601{
9602 va_list args;
7918f24d
NC
9603
9604 PERL_ARGS_ASSERT_SV_SETPVF_MG;
9605
ef50df4b 9606 va_start(args, pat);
c5be433b 9607 sv_vsetpvf_mg(sv, pat, &args);
ef50df4b 9608 va_end(args);
c5be433b
GS
9609}
9610
bffc3d17
SH
9611/*
9612=for apidoc sv_vsetpvf_mg
9613
9614Like C<sv_vsetpvf>, but also handles 'set' magic.
9615
9616Usually used via its frontend C<sv_setpvf_mg>.
9617
9618=cut
9619*/
645c22ef 9620
c5be433b 9621void
89e38212 9622Perl_sv_vsetpvf_mg(pTHX_ SV *const sv, const char *const pat, va_list *const args)
c5be433b 9623{
7918f24d
NC
9624 PERL_ARGS_ASSERT_SV_VSETPVF_MG;
9625
4608196e 9626 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
ef50df4b
GS
9627 SvSETMAGIC(sv);
9628}
9629
cea2e8a9 9630#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
9631
9632/* pTHX_ magic can't cope with varargs, so this is a no-context
9633 * version of the main function, (which may itself be aliased to us).
9634 * Don't access this version directly.
9635 */
9636
cea2e8a9 9637void
89e38212 9638Perl_sv_catpvf_nocontext(SV *const sv, const char *const pat, ...)
cea2e8a9
GS
9639{
9640 dTHX;
9641 va_list args;
7918f24d
NC
9642
9643 PERL_ARGS_ASSERT_SV_CATPVF_NOCONTEXT;
9644
cea2e8a9 9645 va_start(args, pat);
c5be433b 9646 sv_vcatpvf(sv, pat, &args);
cea2e8a9
GS
9647 va_end(args);
9648}
9649
645c22ef
DM
9650/* pTHX_ magic can't cope with varargs, so this is a no-context
9651 * version of the main function, (which may itself be aliased to us).
9652 * Don't access this version directly.
9653 */
9654
cea2e8a9 9655void
89e38212 9656Perl_sv_catpvf_mg_nocontext(SV *const sv, const char *const pat, ...)
cea2e8a9
GS
9657{
9658 dTHX;
9659 va_list args;
7918f24d
NC
9660
9661 PERL_ARGS_ASSERT_SV_CATPVF_MG_NOCONTEXT;
9662
cea2e8a9 9663 va_start(args, pat);
c5be433b 9664 sv_vcatpvf_mg(sv, pat, &args);
cea2e8a9 9665 va_end(args);
cea2e8a9
GS
9666}
9667#endif
9668
954c1994
GS
9669/*
9670=for apidoc sv_catpvf
9671
d5ce4a7c
GA
9672Processes its arguments like C<sprintf> and appends the formatted
9673output to an SV. If the appended data contains "wide" characters
9674(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
9675and characters >255 formatted with %c), the original SV might get
bffc3d17 9676upgraded to UTF-8. Handles 'get' magic, but not 'set' magic. See
cdd94ca7
NC
9677C<sv_catpvf_mg>. If the original SV was UTF-8, the pattern should be
9678valid UTF-8; if the original SV was bytes, the pattern should be too.
954c1994 9679
d5ce4a7c 9680=cut */
954c1994 9681
46fc3d4c 9682void
66ceb532 9683Perl_sv_catpvf(pTHX_ SV *const sv, const char *const pat, ...)
46fc3d4c 9684{
9685 va_list args;
7918f24d
NC
9686
9687 PERL_ARGS_ASSERT_SV_CATPVF;
9688
46fc3d4c 9689 va_start(args, pat);
c5be433b 9690 sv_vcatpvf(sv, pat, &args);
46fc3d4c 9691 va_end(args);
9692}
9693
bffc3d17
SH
9694/*
9695=for apidoc sv_vcatpvf
9696
9697Processes its arguments like C<vsprintf> and appends the formatted output
9698to an SV. Does not handle 'set' magic. See C<sv_vcatpvf_mg>.
9699
9700Usually used via its frontend C<sv_catpvf>.
9701
9702=cut
9703*/
645c22ef 9704
ef50df4b 9705void
66ceb532 9706Perl_sv_vcatpvf(pTHX_ SV *const sv, const char *const pat, va_list *const args)
c5be433b 9707{
7918f24d
NC
9708 PERL_ARGS_ASSERT_SV_VCATPVF;
9709
4608196e 9710 sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
c5be433b
GS
9711}
9712
954c1994
GS
9713/*
9714=for apidoc sv_catpvf_mg
9715
9716Like C<sv_catpvf>, but also handles 'set' magic.
9717
9718=cut
9719*/
9720
c5be433b 9721void
66ceb532 9722Perl_sv_catpvf_mg(pTHX_ SV *const sv, const char *const pat, ...)
ef50df4b
GS
9723{
9724 va_list args;
7918f24d
NC
9725
9726 PERL_ARGS_ASSERT_SV_CATPVF_MG;
9727
ef50df4b 9728 va_start(args, pat);
c5be433b 9729 sv_vcatpvf_mg(sv, pat, &args);
ef50df4b 9730 va_end(args);
c5be433b
GS
9731}
9732
bffc3d17
SH
9733/*
9734=for apidoc sv_vcatpvf_mg
9735
9736Like C<sv_vcatpvf>, but also handles 'set' magic.
9737
9738Usually used via its frontend C<sv_catpvf_mg>.
9739
9740=cut
9741*/
645c22ef 9742
c5be433b 9743void
66ceb532 9744Perl_sv_vcatpvf_mg(pTHX_ SV *const sv, const char *const pat, va_list *const args)
c5be433b 9745{
7918f24d
NC
9746 PERL_ARGS_ASSERT_SV_VCATPVF_MG;
9747
4608196e 9748 sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
ef50df4b
GS
9749 SvSETMAGIC(sv);
9750}
9751
954c1994
GS
9752/*
9753=for apidoc sv_vsetpvfn
9754
bffc3d17 9755Works like C<sv_vcatpvfn> but copies the text into the SV instead of
954c1994
GS
9756appending it.
9757
bffc3d17 9758Usually used via one of its frontends C<sv_vsetpvf> and C<sv_vsetpvf_mg>.
645c22ef 9759
954c1994
GS
9760=cut
9761*/
9762
46fc3d4c 9763void
66ceb532
SS
9764Perl_sv_vsetpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
9765 va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted)
46fc3d4c 9766{
7918f24d
NC
9767 PERL_ARGS_ASSERT_SV_VSETPVFN;
9768
76f68e9b 9769 sv_setpvs(sv, "");
7d5ea4e7 9770 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
46fc3d4c 9771}
9772
7baa4690
HS
9773
9774/*
9775 * Warn of missing argument to sprintf, and then return a defined value
9776 * to avoid inappropriate "use of uninit" warnings [perl #71000].
9777 */
9778#define WARN_MISSING WARN_UNINITIALIZED /* Not sure we want a new category */
9779STATIC SV*
81ae3cde 9780S_vcatpvfn_missing_argument(pTHX) {
7baa4690
HS
9781 if (ckWARN(WARN_MISSING)) {
9782 Perl_warner(aTHX_ packWARN(WARN_MISSING), "Missing argument in %s",
9783 PL_op ? OP_DESC(PL_op) : "sv_vcatpvfn()");
9784 }
9785 return &PL_sv_no;
9786}
9787
9788
2d00ba3b 9789STATIC I32
66ceb532 9790S_expect_number(pTHX_ char **const pattern)
211dfcf1 9791{
97aff369 9792 dVAR;
211dfcf1 9793 I32 var = 0;
7918f24d
NC
9794
9795 PERL_ARGS_ASSERT_EXPECT_NUMBER;
9796
211dfcf1
HS
9797 switch (**pattern) {
9798 case '1': case '2': case '3':
9799 case '4': case '5': case '6':
9800 case '7': case '8': case '9':
2fba7546
GA
9801 var = *(*pattern)++ - '0';
9802 while (isDIGIT(**pattern)) {
5f66b61c 9803 const I32 tmp = var * 10 + (*(*pattern)++ - '0');
2fba7546 9804 if (tmp < var)
94bbb3f4 9805 Perl_croak(aTHX_ "Integer overflow in format string for %s", (PL_op ? OP_DESC(PL_op) : "sv_vcatpvfn"));
2fba7546
GA
9806 var = tmp;
9807 }
211dfcf1
HS
9808 }
9809 return var;
9810}
211dfcf1 9811
c445ea15 9812STATIC char *
66ceb532 9813S_F0convert(NV nv, char *const endbuf, STRLEN *const len)
4151a5fe 9814{
a3b680e6 9815 const int neg = nv < 0;
4151a5fe 9816 UV uv;
4151a5fe 9817
7918f24d
NC
9818 PERL_ARGS_ASSERT_F0CONVERT;
9819
4151a5fe
IZ
9820 if (neg)
9821 nv = -nv;
9822 if (nv < UV_MAX) {
b464bac0 9823 char *p = endbuf;
4151a5fe 9824 nv += 0.5;
028f8eaa 9825 uv = (UV)nv;
4151a5fe
IZ
9826 if (uv & 1 && uv == nv)
9827 uv--; /* Round to even */
9828 do {
a3b680e6 9829 const unsigned dig = uv % 10;
4151a5fe
IZ
9830 *--p = '0' + dig;
9831 } while (uv /= 10);
9832 if (neg)
9833 *--p = '-';
9834 *len = endbuf - p;
9835 return p;
9836 }
bd61b366 9837 return NULL;
4151a5fe
IZ
9838}
9839
9840
954c1994
GS
9841/*
9842=for apidoc sv_vcatpvfn
9843
9844Processes its arguments like C<vsprintf> and appends the formatted output
9845to an SV. Uses an array of SVs if the C style variable argument list is
9846missing (NULL). When running with taint checks enabled, indicates via
9847C<maybe_tainted> if results are untrustworthy (often due to the use of
9848locales).
9849
bffc3d17 9850Usually used via one of its frontends C<sv_vcatpvf> and C<sv_vcatpvf_mg>.
645c22ef 9851
954c1994
GS
9852=cut
9853*/
9854
8896765a
RB
9855
9856#define VECTORIZE_ARGS vecsv = va_arg(*args, SV*);\
9857 vecstr = (U8*)SvPV_const(vecsv,veclen);\
9858 vec_utf8 = DO_UTF8(vecsv);
9859
1ef29b0e
RGS
9860/* XXX maybe_tainted is never assigned to, so the doc above is lying. */
9861
46fc3d4c 9862void
66ceb532
SS
9863Perl_sv_vcatpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
9864 va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted)
46fc3d4c 9865{
97aff369 9866 dVAR;
46fc3d4c 9867 char *p;
9868 char *q;
a3b680e6 9869 const char *patend;
fc36a67e 9870 STRLEN origlen;
46fc3d4c 9871 I32 svix = 0;
27da23d5 9872 static const char nullstr[] = "(null)";
a0714e2c 9873 SV *argsv = NULL;
b464bac0
AL
9874 bool has_utf8 = DO_UTF8(sv); /* has the result utf8? */
9875 const bool pat_utf8 = has_utf8; /* the pattern is in utf8? */
a0714e2c 9876 SV *nsv = NULL;
4151a5fe
IZ
9877 /* Times 4: a decimal digit takes more than 3 binary digits.
9878 * NV_DIG: mantissa takes than many decimal digits.
9879 * Plus 32: Playing safe. */
9880 char ebuf[IV_DIG * 4 + NV_DIG + 32];
9881 /* large enough for "%#.#f" --chip */
9882 /* what about long double NVs? --jhi */
db79b45b 9883
7918f24d 9884 PERL_ARGS_ASSERT_SV_VCATPVFN;
53c1dcc0
AL
9885 PERL_UNUSED_ARG(maybe_tainted);
9886
46fc3d4c 9887 /* no matter what, this is a string now */
fc36a67e 9888 (void)SvPV_force(sv, origlen);
46fc3d4c 9889
8896765a 9890 /* special-case "", "%s", and "%-p" (SVf - see below) */
46fc3d4c 9891 if (patlen == 0)
9892 return;
0dbb1585 9893 if (patlen == 2 && pat[0] == '%' && pat[1] == 's') {
2d03de9c
AL
9894 if (args) {
9895 const char * const s = va_arg(*args, char*);
9896 sv_catpv(sv, s ? s : nullstr);
9897 }
9898 else if (svix < svmax) {
9899 sv_catsv(sv, *svargs);
2d03de9c 9900 }
5b98cd54
VP
9901 else
9902 S_vcatpvfn_missing_argument(aTHX);
2d03de9c 9903 return;
0dbb1585 9904 }
8896765a
RB
9905 if (args && patlen == 3 && pat[0] == '%' &&
9906 pat[1] == '-' && pat[2] == 'p') {
daba3364 9907 argsv = MUTABLE_SV(va_arg(*args, void*));
8896765a 9908 sv_catsv(sv, argsv);
8896765a 9909 return;
46fc3d4c 9910 }
9911
1d917b39 9912#ifndef USE_LONG_DOUBLE
4151a5fe 9913 /* special-case "%.<number>[gf]" */
7af36d83 9914 if ( !args && patlen <= 5 && pat[0] == '%' && pat[1] == '.'
4151a5fe
IZ
9915 && (pat[patlen-1] == 'g' || pat[patlen-1] == 'f') ) {
9916 unsigned digits = 0;
9917 const char *pp;
9918
9919 pp = pat + 2;
9920 while (*pp >= '0' && *pp <= '9')
9921 digits = 10 * digits + (*pp++ - '0');
95ea86d5
NC
9922 if (pp - pat == (int)patlen - 1 && svix < svmax) {
9923 const NV nv = SvNV(*svargs);
4151a5fe 9924 if (*pp == 'g') {
2873255c
NC
9925 /* Add check for digits != 0 because it seems that some
9926 gconverts are buggy in this case, and we don't yet have
9927 a Configure test for this. */
9928 if (digits && digits < sizeof(ebuf) - NV_DIG - 10) {
9929 /* 0, point, slack */
2e59c212 9930 Gconvert(nv, (int)digits, 0, ebuf);
4151a5fe
IZ
9931 sv_catpv(sv, ebuf);
9932 if (*ebuf) /* May return an empty string for digits==0 */
9933 return;
9934 }
9935 } else if (!digits) {
9936 STRLEN l;
9937
9938 if ((p = F0convert(nv, ebuf + sizeof ebuf, &l))) {
9939 sv_catpvn(sv, p, l);
9940 return;
9941 }
9942 }
9943 }
9944 }
1d917b39 9945#endif /* !USE_LONG_DOUBLE */
4151a5fe 9946
2cf2cfc6 9947 if (!args && svix < svmax && DO_UTF8(*svargs))
205f51d8 9948 has_utf8 = TRUE;
2cf2cfc6 9949
46fc3d4c 9950 patend = (char*)pat + patlen;
9951 for (p = (char*)pat; p < patend; p = q) {
9952 bool alt = FALSE;
9953 bool left = FALSE;
b22c7a20 9954 bool vectorize = FALSE;
211dfcf1 9955 bool vectorarg = FALSE;
2cf2cfc6 9956 bool vec_utf8 = FALSE;
46fc3d4c 9957 char fill = ' ';
9958 char plus = 0;
9959 char intsize = 0;
9960 STRLEN width = 0;
fc36a67e 9961 STRLEN zeros = 0;
46fc3d4c 9962 bool has_precis = FALSE;
9963 STRLEN precis = 0;
c445ea15 9964 const I32 osvix = svix;
2cf2cfc6 9965 bool is_utf8 = FALSE; /* is this item utf8? */
20f6aaab
AS
9966#ifdef HAS_LDBL_SPRINTF_BUG
9967 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8 9968 with sfio - Allen <allens@cpan.org> */
20f6aaab
AS
9969 bool fix_ldbl_sprintf_bug = FALSE;
9970#endif
205f51d8 9971
46fc3d4c 9972 char esignbuf[4];
89ebb4a3 9973 U8 utf8buf[UTF8_MAXBYTES+1];
46fc3d4c 9974 STRLEN esignlen = 0;
9975
bd61b366 9976 const char *eptr = NULL;
1d1ac7bc 9977 const char *fmtstart;
fc36a67e 9978 STRLEN elen = 0;
a0714e2c 9979 SV *vecsv = NULL;
4608196e 9980 const U8 *vecstr = NULL;
b22c7a20 9981 STRLEN veclen = 0;
934abaf1 9982 char c = 0;
46fc3d4c 9983 int i;
9c5ffd7c 9984 unsigned base = 0;
8c8eb53c
RB
9985 IV iv = 0;
9986 UV uv = 0;
9e5b023a
JH
9987 /* we need a long double target in case HAS_LONG_DOUBLE but
9988 not USE_LONG_DOUBLE
9989 */
35fff930 9990#if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
9e5b023a
JH
9991 long double nv;
9992#else
65202027 9993 NV nv;
9e5b023a 9994#endif
46fc3d4c 9995 STRLEN have;
9996 STRLEN need;
9997 STRLEN gap;
7af36d83 9998 const char *dotstr = ".";
b22c7a20 9999 STRLEN dotstrlen = 1;
211dfcf1 10000 I32 efix = 0; /* explicit format parameter index */
eb3fce90 10001 I32 ewix = 0; /* explicit width index */
211dfcf1
HS
10002 I32 epix = 0; /* explicit precision index */
10003 I32 evix = 0; /* explicit vector index */
eb3fce90 10004 bool asterisk = FALSE;
46fc3d4c 10005
211dfcf1 10006 /* echo everything up to the next format specification */
46fc3d4c 10007 for (q = p; q < patend && *q != '%'; ++q) ;
10008 if (q > p) {
db79b45b
JH
10009 if (has_utf8 && !pat_utf8)
10010 sv_catpvn_utf8_upgrade(sv, p, q - p, nsv);
10011 else
10012 sv_catpvn(sv, p, q - p);
46fc3d4c 10013 p = q;
10014 }
10015 if (q++ >= patend)
10016 break;
10017
1d1ac7bc
MHM
10018 fmtstart = q;
10019
211dfcf1
HS
10020/*
10021 We allow format specification elements in this order:
10022 \d+\$ explicit format parameter index
10023 [-+ 0#]+ flags
a472f209 10024 v|\*(\d+\$)?v vector with optional (optionally specified) arg
f3583277 10025 0 flag (as above): repeated to allow "v02"
211dfcf1
HS
10026 \d+|\*(\d+\$)? width using optional (optionally specified) arg
10027 \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
10028 [hlqLV] size
8896765a
RB
10029 [%bcdefginopsuxDFOUX] format (mandatory)
10030*/
10031
10032 if (args) {
10033/*
10034 As of perl5.9.3, printf format checking is on by default.
10035 Internally, perl uses %p formats to provide an escape to
10036 some extended formatting. This block deals with those
10037 extensions: if it does not match, (char*)q is reset and
10038 the normal format processing code is used.
10039
10040 Currently defined extensions are:
10041 %p include pointer address (standard)
10042 %-p (SVf) include an SV (previously %_)
10043 %-<num>p include an SV with precision <num>
8896765a
RB
10044 %<num>p reserved for future extensions
10045
10046 Robin Barker 2005-07-14
f46d31f2
RB
10047
10048 %1p (VDf) removed. RMB 2007-10-19
211dfcf1 10049*/
8896765a
RB
10050 char* r = q;
10051 bool sv = FALSE;
10052 STRLEN n = 0;
10053 if (*q == '-')
10054 sv = *q++;
c445ea15 10055 n = expect_number(&q);
8896765a
RB
10056 if (*q++ == 'p') {
10057 if (sv) { /* SVf */
10058 if (n) {
10059 precis = n;
10060 has_precis = TRUE;
10061 }
daba3364 10062 argsv = MUTABLE_SV(va_arg(*args, void*));
4ea561bc 10063 eptr = SvPV_const(argsv, elen);
8896765a
RB
10064 if (DO_UTF8(argsv))
10065 is_utf8 = TRUE;
10066 goto string;
10067 }
8896765a 10068 else if (n) {
9b387841
NC
10069 Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL),
10070 "internal %%<num>p might conflict with future printf extensions");
8896765a
RB
10071 }
10072 }
10073 q = r;
10074 }
10075
c445ea15 10076 if ( (width = expect_number(&q)) ) {
211dfcf1
HS
10077 if (*q == '$') {
10078 ++q;
10079 efix = width;
10080 } else {
10081 goto gotwidth;
10082 }
10083 }
10084
fc36a67e 10085 /* FLAGS */
10086
46fc3d4c 10087 while (*q) {
10088 switch (*q) {
10089 case ' ':
10090 case '+':
9911cee9
TS
10091 if (plus == '+' && *q == ' ') /* '+' over ' ' */
10092 q++;
10093 else
10094 plus = *q++;
46fc3d4c 10095 continue;
10096
10097 case '-':
10098 left = TRUE;
10099 q++;
10100 continue;
10101
10102 case '0':
10103 fill = *q++;
10104 continue;
10105
10106 case '#':
10107 alt = TRUE;
10108 q++;
10109 continue;
10110
fc36a67e 10111 default:
10112 break;
10113 }
10114 break;
10115 }
46fc3d4c 10116
211dfcf1 10117 tryasterisk:
eb3fce90 10118 if (*q == '*') {
211dfcf1 10119 q++;
c445ea15 10120 if ( (ewix = expect_number(&q)) )
211dfcf1
HS
10121 if (*q++ != '$')
10122 goto unknown;
eb3fce90 10123 asterisk = TRUE;
211dfcf1
HS
10124 }
10125 if (*q == 'v') {
eb3fce90 10126 q++;
211dfcf1
HS
10127 if (vectorize)
10128 goto unknown;
9cbac4c7 10129 if ((vectorarg = asterisk)) {
211dfcf1
HS
10130 evix = ewix;
10131 ewix = 0;
10132 asterisk = FALSE;
10133 }
10134 vectorize = TRUE;
10135 goto tryasterisk;
eb3fce90
JH
10136 }
10137
211dfcf1 10138 if (!asterisk)
858a90f9 10139 {
7a5fa8a2 10140 if( *q == '0' )
f3583277 10141 fill = *q++;
c445ea15 10142 width = expect_number(&q);
858a90f9 10143 }
211dfcf1
HS
10144
10145 if (vectorize) {
10146 if (vectorarg) {
10147 if (args)
10148 vecsv = va_arg(*args, SV*);
7ad96abb
NC
10149 else if (evix) {
10150 vecsv = (evix > 0 && evix <= svmax)
81ae3cde 10151 ? svargs[evix-1] : S_vcatpvfn_missing_argument(aTHX);
7ad96abb 10152 } else {
7baa4690 10153 vecsv = svix < svmax
81ae3cde 10154 ? svargs[svix++] : S_vcatpvfn_missing_argument(aTHX);
7ad96abb 10155 }
245d4a47 10156 dotstr = SvPV_const(vecsv, dotstrlen);
640283f5
NC
10157 /* Keep the DO_UTF8 test *after* the SvPV call, else things go
10158 bad with tied or overloaded values that return UTF8. */
211dfcf1 10159 if (DO_UTF8(vecsv))
2cf2cfc6 10160 is_utf8 = TRUE;
640283f5
NC
10161 else if (has_utf8) {
10162 vecsv = sv_mortalcopy(vecsv);
10163 sv_utf8_upgrade(vecsv);
10164 dotstr = SvPV_const(vecsv, dotstrlen);
10165 is_utf8 = TRUE;
10166 }
211dfcf1
HS
10167 }
10168 if (args) {
8896765a 10169 VECTORIZE_ARGS
eb3fce90 10170 }
7ad96abb 10171 else if (efix ? (efix > 0 && efix <= svmax) : svix < svmax) {
211dfcf1 10172 vecsv = svargs[efix ? efix-1 : svix++];
245d4a47 10173 vecstr = (U8*)SvPV_const(vecsv,veclen);
2cf2cfc6 10174 vec_utf8 = DO_UTF8(vecsv);
96b8f7ce
JP
10175
10176 /* if this is a version object, we need to convert
10177 * back into v-string notation and then let the
10178 * vectorize happen normally
d7aa5382 10179 */
96b8f7ce
JP
10180 if (sv_derived_from(vecsv, "version")) {
10181 char *version = savesvpv(vecsv);
85fbaab2 10182 if ( hv_exists(MUTABLE_HV(SvRV(vecsv)), "alpha", 5 ) ) {
34ba6322
SP
10183 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
10184 "vector argument not supported with alpha versions");
10185 goto unknown;
10186 }
96b8f7ce 10187 vecsv = sv_newmortal();
65b06e02 10188 scan_vstring(version, version + veclen, vecsv);
96b8f7ce
JP
10189 vecstr = (U8*)SvPV_const(vecsv, veclen);
10190 vec_utf8 = DO_UTF8(vecsv);
10191 Safefree(version);
d7aa5382 10192 }
211dfcf1
HS
10193 }
10194 else {
10195 vecstr = (U8*)"";
10196 veclen = 0;
10197 }
eb3fce90 10198 }
fc36a67e 10199
eb3fce90 10200 if (asterisk) {
fc36a67e 10201 if (args)
10202 i = va_arg(*args, int);
10203 else
eb3fce90
JH
10204 i = (ewix ? ewix <= svmax : svix < svmax) ?
10205 SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 10206 left |= (i < 0);
10207 width = (i < 0) ? -i : i;
fc36a67e 10208 }
211dfcf1 10209 gotwidth:
fc36a67e 10210
10211 /* PRECISION */
46fc3d4c 10212
fc36a67e 10213 if (*q == '.') {
10214 q++;
10215 if (*q == '*') {
211dfcf1 10216 q++;
c445ea15 10217 if ( ((epix = expect_number(&q))) && (*q++ != '$') )
7b8dd722
HS
10218 goto unknown;
10219 /* XXX: todo, support specified precision parameter */
10220 if (epix)
211dfcf1 10221 goto unknown;
46fc3d4c 10222 if (args)
10223 i = va_arg(*args, int);
10224 else
eb3fce90
JH
10225 i = (ewix ? ewix <= svmax : svix < svmax)
10226 ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
9911cee9
TS
10227 precis = i;
10228 has_precis = !(i < 0);
fc36a67e 10229 }
10230 else {
10231 precis = 0;
10232 while (isDIGIT(*q))
10233 precis = precis * 10 + (*q++ - '0');
9911cee9 10234 has_precis = TRUE;
fc36a67e 10235 }
fc36a67e 10236 }
46fc3d4c 10237
fc36a67e 10238 /* SIZE */
46fc3d4c 10239
fc36a67e 10240 switch (*q) {
c623ac67
GS
10241#ifdef WIN32
10242 case 'I': /* Ix, I32x, and I64x */
10243# ifdef WIN64
10244 if (q[1] == '6' && q[2] == '4') {
10245 q += 3;
10246 intsize = 'q';
10247 break;
10248 }
10249# endif
10250 if (q[1] == '3' && q[2] == '2') {
10251 q += 3;
10252 break;
10253 }
10254# ifdef WIN64
10255 intsize = 'q';
10256# endif
10257 q++;
10258 break;
10259#endif
9e5b023a 10260#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
6f9bb7fd 10261 case 'L': /* Ld */
5f66b61c 10262 /*FALLTHROUGH*/
e5c81feb 10263#ifdef HAS_QUAD
6f9bb7fd 10264 case 'q': /* qd */
9e5b023a 10265#endif
6f9bb7fd
GS
10266 intsize = 'q';
10267 q++;
10268 break;
10269#endif
fc36a67e 10270 case 'l':
9e5b023a 10271#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
205f51d8 10272 if (*(q + 1) == 'l') { /* lld, llf */
fc36a67e 10273 intsize = 'q';
10274 q += 2;
46fc3d4c 10275 break;
cf2093f6 10276 }
fc36a67e 10277#endif
5f66b61c 10278 /*FALLTHROUGH*/
fc36a67e 10279 case 'h':
5f66b61c 10280 /*FALLTHROUGH*/
fc36a67e 10281 case 'V':
10282 intsize = *q++;
46fc3d4c 10283 break;
10284 }
10285
fc36a67e 10286 /* CONVERSION */
10287
211dfcf1
HS
10288 if (*q == '%') {
10289 eptr = q++;
10290 elen = 1;
26372e71
GA
10291 if (vectorize) {
10292 c = '%';
10293 goto unknown;
10294 }
211dfcf1
HS
10295 goto string;
10296 }
10297
26372e71 10298 if (!vectorize && !args) {
86c51f8b
NC
10299 if (efix) {
10300 const I32 i = efix-1;
7baa4690 10301 argsv = (i >= 0 && i < svmax)
81ae3cde 10302 ? svargs[i] : S_vcatpvfn_missing_argument(aTHX);
86c51f8b
NC
10303 } else {
10304 argsv = (svix >= 0 && svix < svmax)
81ae3cde 10305 ? svargs[svix++] : S_vcatpvfn_missing_argument(aTHX);
86c51f8b 10306 }
863811b2 10307 }
211dfcf1 10308
46fc3d4c 10309 switch (c = *q++) {
10310
10311 /* STRINGS */
10312
46fc3d4c 10313 case 'c':
26372e71
GA
10314 if (vectorize)
10315 goto unknown;
4ea561bc 10316 uv = (args) ? va_arg(*args, int) : SvIV(argsv);
1bd104fb
JH
10317 if ((uv > 255 ||
10318 (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
0064a8a9 10319 && !IN_BYTES) {
dfe13c55 10320 eptr = (char*)utf8buf;
9041c2e3 10321 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
2cf2cfc6 10322 is_utf8 = TRUE;
7e2040f0
GS
10323 }
10324 else {
10325 c = (char)uv;
10326 eptr = &c;
10327 elen = 1;
a0ed51b3 10328 }
46fc3d4c 10329 goto string;
10330
46fc3d4c 10331 case 's':
26372e71
GA
10332 if (vectorize)
10333 goto unknown;
10334 if (args) {
fc36a67e 10335 eptr = va_arg(*args, char*);
c635e13b 10336 if (eptr)
10337 elen = strlen(eptr);
10338 else {
27da23d5 10339 eptr = (char *)nullstr;
c635e13b 10340 elen = sizeof nullstr - 1;
10341 }
46fc3d4c 10342 }
211dfcf1 10343 else {
4ea561bc 10344 eptr = SvPV_const(argsv, elen);
7e2040f0 10345 if (DO_UTF8(argsv)) {
c494f1f4 10346 STRLEN old_precis = precis;
a0ed51b3 10347 if (has_precis && precis < elen) {
c494f1f4 10348 STRLEN ulen = sv_len_utf8(argsv);
9ef5ed94 10349 I32 p = precis > ulen ? ulen : precis;
7e2040f0 10350 sv_pos_u2b(argsv, &p, 0); /* sticks at end */
a0ed51b3
LW
10351 precis = p;
10352 }
10353 if (width) { /* fudge width (can't fudge elen) */
59b61096
AV
10354 if (has_precis && precis < elen)
10355 width += precis - old_precis;
10356 else
10357 width += elen - sv_len_utf8(argsv);
a0ed51b3 10358 }
2cf2cfc6 10359 is_utf8 = TRUE;
a0ed51b3
LW
10360 }
10361 }
fc36a67e 10362
46fc3d4c 10363 string:
9ef5ed94 10364 if (has_precis && precis < elen)
46fc3d4c 10365 elen = precis;
10366 break;
10367
10368 /* INTEGERS */
10369
fc36a67e 10370 case 'p':
be75b157 10371 if (alt || vectorize)
c2e66d9e 10372 goto unknown;
211dfcf1 10373 uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
fc36a67e 10374 base = 16;
10375 goto integer;
10376
46fc3d4c 10377 case 'D':
29fe7a80 10378#ifdef IV_IS_QUAD
22f3ae8c 10379 intsize = 'q';
29fe7a80 10380#else
46fc3d4c 10381 intsize = 'l';
29fe7a80 10382#endif
5f66b61c 10383 /*FALLTHROUGH*/
46fc3d4c 10384 case 'd':
10385 case 'i':
8896765a
RB
10386#if vdNUMBER
10387 format_vd:
10388#endif
b22c7a20 10389 if (vectorize) {
ba210ebe 10390 STRLEN ulen;
211dfcf1
HS
10391 if (!veclen)
10392 continue;
2cf2cfc6
A
10393 if (vec_utf8)
10394 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
10395 UTF8_ALLOW_ANYUV);
b22c7a20 10396 else {
e83d50c9 10397 uv = *vecstr;
b22c7a20
GS
10398 ulen = 1;
10399 }
10400 vecstr += ulen;
10401 veclen -= ulen;
e83d50c9
JP
10402 if (plus)
10403 esignbuf[esignlen++] = plus;
b22c7a20
GS
10404 }
10405 else if (args) {
46fc3d4c 10406 switch (intsize) {
10407 case 'h': iv = (short)va_arg(*args, int); break;
46fc3d4c 10408 case 'l': iv = va_arg(*args, long); break;
fc36a67e 10409 case 'V': iv = va_arg(*args, IV); break;
b10c0dba 10410 default: iv = va_arg(*args, int); break;
53f65a9e 10411 case 'q':
cf2093f6 10412#ifdef HAS_QUAD
53f65a9e
HS
10413 iv = va_arg(*args, Quad_t); break;
10414#else
10415 goto unknown;
cf2093f6 10416#endif
46fc3d4c 10417 }
10418 }
10419 else {
4ea561bc 10420 IV tiv = SvIV(argsv); /* work around GCC bug #13488 */
46fc3d4c 10421 switch (intsize) {
b10c0dba
MHM
10422 case 'h': iv = (short)tiv; break;
10423 case 'l': iv = (long)tiv; break;
10424 case 'V':
10425 default: iv = tiv; break;
53f65a9e 10426 case 'q':
cf2093f6 10427#ifdef HAS_QUAD
53f65a9e
HS
10428 iv = (Quad_t)tiv; break;
10429#else
10430 goto unknown;
cf2093f6 10431#endif
46fc3d4c 10432 }
10433 }
e83d50c9
JP
10434 if ( !vectorize ) /* we already set uv above */
10435 {
10436 if (iv >= 0) {
10437 uv = iv;
10438 if (plus)
10439 esignbuf[esignlen++] = plus;
10440 }
10441 else {
10442 uv = -iv;
10443 esignbuf[esignlen++] = '-';
10444 }
46fc3d4c 10445 }
10446 base = 10;
10447 goto integer;
10448
fc36a67e 10449 case 'U':
29fe7a80 10450#ifdef IV_IS_QUAD
22f3ae8c 10451 intsize = 'q';
29fe7a80 10452#else
fc36a67e 10453 intsize = 'l';
29fe7a80 10454#endif
5f66b61c 10455 /*FALLTHROUGH*/
fc36a67e 10456 case 'u':
10457 base = 10;
10458 goto uns_integer;
10459
7ff06cc7 10460 case 'B':
4f19785b
WSI
10461 case 'b':
10462 base = 2;
10463 goto uns_integer;
10464
46fc3d4c 10465 case 'O':
29fe7a80 10466#ifdef IV_IS_QUAD
22f3ae8c 10467 intsize = 'q';
29fe7a80 10468#else
46fc3d4c 10469 intsize = 'l';
29fe7a80 10470#endif
5f66b61c 10471 /*FALLTHROUGH*/
46fc3d4c 10472 case 'o':
10473 base = 8;
10474 goto uns_integer;
10475
10476 case 'X':
46fc3d4c 10477 case 'x':
10478 base = 16;
46fc3d4c 10479
10480 uns_integer:
b22c7a20 10481 if (vectorize) {
ba210ebe 10482 STRLEN ulen;
b22c7a20 10483 vector:
211dfcf1
HS
10484 if (!veclen)
10485 continue;
2cf2cfc6
A
10486 if (vec_utf8)
10487 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
10488 UTF8_ALLOW_ANYUV);
b22c7a20 10489 else {
a05b299f 10490 uv = *vecstr;
b22c7a20
GS
10491 ulen = 1;
10492 }
10493 vecstr += ulen;
10494 veclen -= ulen;
10495 }
10496 else if (args) {
46fc3d4c 10497 switch (intsize) {
10498 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
46fc3d4c 10499 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 10500 case 'V': uv = va_arg(*args, UV); break;
b10c0dba 10501 default: uv = va_arg(*args, unsigned); break;
53f65a9e 10502 case 'q':
cf2093f6 10503#ifdef HAS_QUAD
53f65a9e
HS
10504 uv = va_arg(*args, Uquad_t); break;
10505#else
10506 goto unknown;
cf2093f6 10507#endif
46fc3d4c 10508 }
10509 }
10510 else {
4ea561bc 10511 UV tuv = SvUV(argsv); /* work around GCC bug #13488 */
46fc3d4c 10512 switch (intsize) {
b10c0dba
MHM
10513 case 'h': uv = (unsigned short)tuv; break;
10514 case 'l': uv = (unsigned long)tuv; break;
10515 case 'V':
10516 default: uv = tuv; break;
53f65a9e 10517 case 'q':
cf2093f6 10518#ifdef HAS_QUAD
53f65a9e
HS
10519 uv = (Uquad_t)tuv; break;
10520#else
10521 goto unknown;
cf2093f6 10522#endif
46fc3d4c 10523 }
10524 }
10525
10526 integer:
4d84ee25
NC
10527 {
10528 char *ptr = ebuf + sizeof ebuf;
1387f30c
DD
10529 bool tempalt = uv ? alt : FALSE; /* Vectors can't change alt */
10530 zeros = 0;
10531
4d84ee25
NC
10532 switch (base) {
10533 unsigned dig;
10534 case 16:
14eb61ab 10535 p = (char *)((c == 'X') ? PL_hexdigit + 16 : PL_hexdigit);
4d84ee25
NC
10536 do {
10537 dig = uv & 15;
10538 *--ptr = p[dig];
10539 } while (uv >>= 4);
1387f30c 10540 if (tempalt) {
4d84ee25
NC
10541 esignbuf[esignlen++] = '0';
10542 esignbuf[esignlen++] = c; /* 'x' or 'X' */
10543 }
10544 break;
10545 case 8:
10546 do {
10547 dig = uv & 7;
10548 *--ptr = '0' + dig;
10549 } while (uv >>= 3);
10550 if (alt && *ptr != '0')
10551 *--ptr = '0';
10552 break;
10553 case 2:
10554 do {
10555 dig = uv & 1;
10556 *--ptr = '0' + dig;
10557 } while (uv >>= 1);
1387f30c 10558 if (tempalt) {
4d84ee25 10559 esignbuf[esignlen++] = '0';
7ff06cc7 10560 esignbuf[esignlen++] = c;
4d84ee25
NC
10561 }
10562 break;
10563 default: /* it had better be ten or less */
10564 do {
10565 dig = uv % base;
10566 *--ptr = '0' + dig;
10567 } while (uv /= base);
10568 break;
46fc3d4c 10569 }
4d84ee25
NC
10570 elen = (ebuf + sizeof ebuf) - ptr;
10571 eptr = ptr;
10572 if (has_precis) {
10573 if (precis > elen)
10574 zeros = precis - elen;
e6bb52fd
TS
10575 else if (precis == 0 && elen == 1 && *eptr == '0'
10576 && !(base == 8 && alt)) /* "%#.0o" prints "0" */
4d84ee25 10577 elen = 0;
9911cee9
TS
10578
10579 /* a precision nullifies the 0 flag. */
10580 if (fill == '0')
10581 fill = ' ';
eda88b6d 10582 }
c10ed8b9 10583 }
46fc3d4c 10584 break;
10585
10586 /* FLOATING POINT */
10587
fc36a67e 10588 case 'F':
10589 c = 'f'; /* maybe %F isn't supported here */
5f66b61c 10590 /*FALLTHROUGH*/
46fc3d4c 10591 case 'e': case 'E':
fc36a67e 10592 case 'f':
46fc3d4c 10593 case 'g': case 'G':
26372e71
GA
10594 if (vectorize)
10595 goto unknown;
46fc3d4c 10596
10597 /* This is evil, but floating point is even more evil */
10598
9e5b023a
JH
10599 /* for SV-style calling, we can only get NV
10600 for C-style calling, we assume %f is double;
10601 for simplicity we allow any of %Lf, %llf, %qf for long double
10602 */
10603 switch (intsize) {
10604 case 'V':
10605#if defined(USE_LONG_DOUBLE)
10606 intsize = 'q';
10607#endif
10608 break;
8a2e3f14 10609/* [perl #20339] - we should accept and ignore %lf rather than die */
00e17364 10610 case 'l':
5f66b61c 10611 /*FALLTHROUGH*/
9e5b023a
JH
10612 default:
10613#if defined(USE_LONG_DOUBLE)
10614 intsize = args ? 0 : 'q';
10615#endif
10616 break;
10617 case 'q':
10618#if defined(HAS_LONG_DOUBLE)
10619 break;
10620#else
5f66b61c 10621 /*FALLTHROUGH*/
9e5b023a
JH
10622#endif
10623 case 'h':
9e5b023a
JH
10624 goto unknown;
10625 }
10626
10627 /* now we need (long double) if intsize == 'q', else (double) */
26372e71 10628 nv = (args) ?
35fff930
JH
10629#if LONG_DOUBLESIZE > DOUBLESIZE
10630 intsize == 'q' ?
205f51d8
AS
10631 va_arg(*args, long double) :
10632 va_arg(*args, double)
35fff930 10633#else
205f51d8 10634 va_arg(*args, double)
35fff930 10635#endif
4ea561bc 10636 : SvNV(argsv);
fc36a67e 10637
10638 need = 0;
3952c29a
NC
10639 /* nv * 0 will be NaN for NaN, +Inf and -Inf, and 0 for anything
10640 else. frexp() has some unspecified behaviour for those three */
10641 if (c != 'e' && c != 'E' && (nv * 0) == 0) {
fc36a67e 10642 i = PERL_INT_MIN;
9e5b023a
JH
10643 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
10644 will cast our (long double) to (double) */
73b309ea 10645 (void)Perl_frexp(nv, &i);
fc36a67e 10646 if (i == PERL_INT_MIN)
cea2e8a9 10647 Perl_die(aTHX_ "panic: frexp");
c635e13b 10648 if (i > 0)
fc36a67e 10649 need = BIT_DIGITS(i);
10650 }
10651 need += has_precis ? precis : 6; /* known default */
20f6aaab 10652
fc36a67e 10653 if (need < width)
10654 need = width;
10655
20f6aaab
AS
10656#ifdef HAS_LDBL_SPRINTF_BUG
10657 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8
AS
10658 with sfio - Allen <allens@cpan.org> */
10659
10660# ifdef DBL_MAX
10661# define MY_DBL_MAX DBL_MAX
10662# else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
10663# if DOUBLESIZE >= 8
10664# define MY_DBL_MAX 1.7976931348623157E+308L
10665# else
10666# define MY_DBL_MAX 3.40282347E+38L
10667# endif
10668# endif
10669
10670# ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
10671# define MY_DBL_MAX_BUG 1L
20f6aaab 10672# else
205f51d8 10673# define MY_DBL_MAX_BUG MY_DBL_MAX
20f6aaab 10674# endif
20f6aaab 10675
205f51d8
AS
10676# ifdef DBL_MIN
10677# define MY_DBL_MIN DBL_MIN
10678# else /* XXX guessing! -Allen */
10679# if DOUBLESIZE >= 8
10680# define MY_DBL_MIN 2.2250738585072014E-308L
10681# else
10682# define MY_DBL_MIN 1.17549435E-38L
10683# endif
10684# endif
20f6aaab 10685
205f51d8
AS
10686 if ((intsize == 'q') && (c == 'f') &&
10687 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
10688 (need < DBL_DIG)) {
10689 /* it's going to be short enough that
10690 * long double precision is not needed */
10691
10692 if ((nv <= 0L) && (nv >= -0L))
10693 fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
10694 else {
10695 /* would use Perl_fp_class as a double-check but not
10696 * functional on IRIX - see perl.h comments */
10697
10698 if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
10699 /* It's within the range that a double can represent */
10700#if defined(DBL_MAX) && !defined(DBL_MIN)
10701 if ((nv >= ((long double)1/DBL_MAX)) ||
10702 (nv <= (-(long double)1/DBL_MAX)))
20f6aaab 10703#endif
205f51d8 10704 fix_ldbl_sprintf_bug = TRUE;
20f6aaab 10705 }
205f51d8
AS
10706 }
10707 if (fix_ldbl_sprintf_bug == TRUE) {
10708 double temp;
10709
10710 intsize = 0;
10711 temp = (double)nv;
10712 nv = (NV)temp;
10713 }
20f6aaab 10714 }
205f51d8
AS
10715
10716# undef MY_DBL_MAX
10717# undef MY_DBL_MAX_BUG
10718# undef MY_DBL_MIN
10719
20f6aaab
AS
10720#endif /* HAS_LDBL_SPRINTF_BUG */
10721
46fc3d4c 10722 need += 20; /* fudge factor */
80252599
GS
10723 if (PL_efloatsize < need) {
10724 Safefree(PL_efloatbuf);
10725 PL_efloatsize = need + 20; /* more fudge */
a02a5408 10726 Newx(PL_efloatbuf, PL_efloatsize, char);
7d5ea4e7 10727 PL_efloatbuf[0] = '\0';
46fc3d4c 10728 }
10729
4151a5fe
IZ
10730 if ( !(width || left || plus || alt) && fill != '0'
10731 && has_precis && intsize != 'q' ) { /* Shortcuts */
2873255c
NC
10732 /* See earlier comment about buggy Gconvert when digits,
10733 aka precis is 0 */
10734 if ( c == 'g' && precis) {
2e59c212 10735 Gconvert((NV)nv, (int)precis, 0, PL_efloatbuf);
4150c189
NC
10736 /* May return an empty string for digits==0 */
10737 if (*PL_efloatbuf) {
10738 elen = strlen(PL_efloatbuf);
4151a5fe 10739 goto float_converted;
4150c189 10740 }
4151a5fe
IZ
10741 } else if ( c == 'f' && !precis) {
10742 if ((eptr = F0convert(nv, ebuf + sizeof ebuf, &elen)))
10743 break;
10744 }
10745 }
4d84ee25
NC
10746 {
10747 char *ptr = ebuf + sizeof ebuf;
10748 *--ptr = '\0';
10749 *--ptr = c;
10750 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
9e5b023a 10751#if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
4d84ee25
NC
10752 if (intsize == 'q') {
10753 /* Copy the one or more characters in a long double
10754 * format before the 'base' ([efgEFG]) character to
10755 * the format string. */
10756 static char const prifldbl[] = PERL_PRIfldbl;
10757 char const *p = prifldbl + sizeof(prifldbl) - 3;
10758 while (p >= prifldbl) { *--ptr = *p--; }
10759 }
65202027 10760#endif
4d84ee25
NC
10761 if (has_precis) {
10762 base = precis;
10763 do { *--ptr = '0' + (base % 10); } while (base /= 10);
10764 *--ptr = '.';
10765 }
10766 if (width) {
10767 base = width;
10768 do { *--ptr = '0' + (base % 10); } while (base /= 10);
10769 }
10770 if (fill == '0')
10771 *--ptr = fill;
10772 if (left)
10773 *--ptr = '-';
10774 if (plus)
10775 *--ptr = plus;
10776 if (alt)
10777 *--ptr = '#';
10778 *--ptr = '%';
10779
10780 /* No taint. Otherwise we are in the strange situation
10781 * where printf() taints but print($float) doesn't.
10782 * --jhi */
9e5b023a 10783#if defined(HAS_LONG_DOUBLE)
4150c189 10784 elen = ((intsize == 'q')
d9fad198
JH
10785 ? my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, nv)
10786 : my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, (double)nv));
9e5b023a 10787#else
4150c189 10788 elen = my_sprintf(PL_efloatbuf, ptr, nv);
9e5b023a 10789#endif
4d84ee25 10790 }
4151a5fe 10791 float_converted:
80252599 10792 eptr = PL_efloatbuf;
46fc3d4c 10793 break;
10794
fc36a67e 10795 /* SPECIAL */
10796
10797 case 'n':
26372e71
GA
10798 if (vectorize)
10799 goto unknown;
fc36a67e 10800 i = SvCUR(sv) - origlen;
26372e71 10801 if (args) {
c635e13b 10802 switch (intsize) {
10803 case 'h': *(va_arg(*args, short*)) = i; break;
10804 default: *(va_arg(*args, int*)) = i; break;
10805 case 'l': *(va_arg(*args, long*)) = i; break;
10806 case 'V': *(va_arg(*args, IV*)) = i; break;
53f65a9e 10807 case 'q':
cf2093f6 10808#ifdef HAS_QUAD
53f65a9e
HS
10809 *(va_arg(*args, Quad_t*)) = i; break;
10810#else
10811 goto unknown;
cf2093f6 10812#endif
c635e13b 10813 }
fc36a67e 10814 }
9dd79c3f 10815 else
211dfcf1 10816 sv_setuv_mg(argsv, (UV)i);
fc36a67e 10817 continue; /* not "break" */
10818
10819 /* UNKNOWN */
10820
46fc3d4c 10821 default:
fc36a67e 10822 unknown:
041457d9
DM
10823 if (!args
10824 && (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)
10825 && ckWARN(WARN_PRINTF))
10826 {
c4420975 10827 SV * const msg = sv_newmortal();
35c1215d
NC
10828 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
10829 (PL_op->op_type == OP_PRTF) ? "" : "s");
1d1ac7bc
MHM
10830 if (fmtstart < patend) {
10831 const char * const fmtend = q < patend ? q : patend;
10832 const char * f;
10833 sv_catpvs(msg, "\"%");
10834 for (f = fmtstart; f < fmtend; f++) {
10835 if (isPRINT(*f)) {
10836 sv_catpvn(msg, f, 1);
10837 } else {
10838 Perl_sv_catpvf(aTHX_ msg,
10839 "\\%03"UVof, (UV)*f & 0xFF);
10840 }
10841 }
10842 sv_catpvs(msg, "\"");
10843 } else {
396482e1 10844 sv_catpvs(msg, "end of string");
1d1ac7bc 10845 }
be2597df 10846 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, SVfARG(msg)); /* yes, this is reentrant */
c635e13b 10847 }
fb73857a 10848
10849 /* output mangled stuff ... */
10850 if (c == '\0')
10851 --q;
46fc3d4c 10852 eptr = p;
10853 elen = q - p;
fb73857a 10854
10855 /* ... right here, because formatting flags should not apply */
10856 SvGROW(sv, SvCUR(sv) + elen + 1);
10857 p = SvEND(sv);
4459522c 10858 Copy(eptr, p, elen, char);
fb73857a 10859 p += elen;
10860 *p = '\0';
3f7c398e 10861 SvCUR_set(sv, p - SvPVX_const(sv));
58e33a90 10862 svix = osvix;
fb73857a 10863 continue; /* not "break" */
46fc3d4c 10864 }
10865
cc61b222
TS
10866 if (is_utf8 != has_utf8) {
10867 if (is_utf8) {
10868 if (SvCUR(sv))
10869 sv_utf8_upgrade(sv);
10870 }
10871 else {
10872 const STRLEN old_elen = elen;
59cd0e26 10873 SV * const nsv = newSVpvn_flags(eptr, elen, SVs_TEMP);
cc61b222
TS
10874 sv_utf8_upgrade(nsv);
10875 eptr = SvPVX_const(nsv);
10876 elen = SvCUR(nsv);
10877
10878 if (width) { /* fudge width (can't fudge elen) */
10879 width += elen - old_elen;
10880 }
10881 is_utf8 = TRUE;
10882 }
10883 }
10884
6c94ec8b 10885 have = esignlen + zeros + elen;
ed2b91d2 10886 if (have < zeros)
f1f66076 10887 Perl_croak_nocontext("%s", PL_memory_wrap);
6c94ec8b 10888
46fc3d4c 10889 need = (have > width ? have : width);
10890 gap = need - have;
10891
d2641cbd 10892 if (need >= (((STRLEN)~0) - SvCUR(sv) - dotstrlen - 1))
f1f66076 10893 Perl_croak_nocontext("%s", PL_memory_wrap);
b22c7a20 10894 SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
46fc3d4c 10895 p = SvEND(sv);
10896 if (esignlen && fill == '0') {
53c1dcc0 10897 int i;
eb160463 10898 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 10899 *p++ = esignbuf[i];
10900 }
10901 if (gap && !left) {
10902 memset(p, fill, gap);
10903 p += gap;
10904 }
10905 if (esignlen && fill != '0') {
53c1dcc0 10906 int i;
eb160463 10907 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 10908 *p++ = esignbuf[i];
10909 }
fc36a67e 10910 if (zeros) {
53c1dcc0 10911 int i;
fc36a67e 10912 for (i = zeros; i; i--)
10913 *p++ = '0';
10914 }
46fc3d4c 10915 if (elen) {
4459522c 10916 Copy(eptr, p, elen, char);
46fc3d4c 10917 p += elen;
10918 }
10919 if (gap && left) {
10920 memset(p, ' ', gap);
10921 p += gap;
10922 }
b22c7a20
GS
10923 if (vectorize) {
10924 if (veclen) {
4459522c 10925 Copy(dotstr, p, dotstrlen, char);
b22c7a20
GS
10926 p += dotstrlen;
10927 }
10928 else
10929 vectorize = FALSE; /* done iterating over vecstr */
10930 }
2cf2cfc6
A
10931 if (is_utf8)
10932 has_utf8 = TRUE;
10933 if (has_utf8)
7e2040f0 10934 SvUTF8_on(sv);
46fc3d4c 10935 *p = '\0';
3f7c398e 10936 SvCUR_set(sv, p - SvPVX_const(sv));
b22c7a20
GS
10937 if (vectorize) {
10938 esignlen = 0;
10939 goto vector;
10940 }
46fc3d4c 10941 }
3e6bd4bf 10942 SvTAINT(sv);
46fc3d4c 10943}
51371543 10944
645c22ef
DM
10945/* =========================================================================
10946
10947=head1 Cloning an interpreter
10948
10949All the macros and functions in this section are for the private use of
10950the main function, perl_clone().
10951
f2fc5c80 10952The foo_dup() functions make an exact copy of an existing foo thingy.
645c22ef
DM
10953During the course of a cloning, a hash table is used to map old addresses
10954to new addresses. The table is created and manipulated with the
10955ptr_table_* functions.
10956
10957=cut
10958
3e8320cc 10959 * =========================================================================*/
645c22ef
DM
10960
10961
1d7c1841
GS
10962#if defined(USE_ITHREADS)
10963
d4c19fe8 10964/* XXX Remove this so it doesn't have to go thru the macro and return for nothing */
1d7c1841
GS
10965#ifndef GpREFCNT_inc
10966# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
10967#endif
10968
10969
a41cc44e 10970/* Certain cases in Perl_ss_dup have been merged, by relying on the fact
3e07292d 10971 that currently av_dup, gv_dup and hv_dup are the same as sv_dup.
538f2e76
NC
10972 If this changes, please unmerge ss_dup.
10973 Likewise, sv_dup_inc_multiple() relies on this fact. */
a09252eb 10974#define sv_dup_inc_NN(s,t) SvREFCNT_inc_NN(sv_dup_inc(s,t))
502c6561 10975#define av_dup(s,t) MUTABLE_AV(sv_dup((const SV *)s,t))
a09252eb 10976#define av_dup_inc(s,t) MUTABLE_AV(sv_dup_inc((const SV *)s,t))
85fbaab2 10977#define hv_dup(s,t) MUTABLE_HV(sv_dup((const SV *)s,t))
a09252eb 10978#define hv_dup_inc(s,t) MUTABLE_HV(sv_dup_inc((const SV *)s,t))
daba3364 10979#define cv_dup(s,t) MUTABLE_CV(sv_dup((const SV *)s,t))
a09252eb 10980#define cv_dup_inc(s,t) MUTABLE_CV(sv_dup_inc((const SV *)s,t))
daba3364 10981#define io_dup(s,t) MUTABLE_IO(sv_dup((const SV *)s,t))
a09252eb 10982#define io_dup_inc(s,t) MUTABLE_IO(sv_dup_inc((const SV *)s,t))
159b6efe 10983#define gv_dup(s,t) MUTABLE_GV(sv_dup((const SV *)s,t))
a09252eb 10984#define gv_dup_inc(s,t) MUTABLE_GV(sv_dup_inc((const SV *)s,t))
6136c704
AL
10985#define SAVEPV(p) ((p) ? savepv(p) : NULL)
10986#define SAVEPVN(p,n) ((p) ? savepvn(p,n) : NULL)
8cf8f3d1 10987
199e78b7
DM
10988/* clone a parser */
10989
10990yy_parser *
66ceb532 10991Perl_parser_dup(pTHX_ const yy_parser *const proto, CLONE_PARAMS *const param)
199e78b7
DM
10992{
10993 yy_parser *parser;
10994
7918f24d
NC
10995 PERL_ARGS_ASSERT_PARSER_DUP;
10996
199e78b7
DM
10997 if (!proto)
10998 return NULL;
10999
7c197c94
DM
11000 /* look for it in the table first */
11001 parser = (yy_parser *)ptr_table_fetch(PL_ptr_table, proto);
11002 if (parser)
11003 return parser;
11004
11005 /* create anew and remember what it is */
199e78b7 11006 Newxz(parser, 1, yy_parser);
7c197c94 11007 ptr_table_store(PL_ptr_table, proto, parser);
199e78b7 11008
199e78b7
DM
11009 /* XXX these not yet duped */
11010 parser->old_parser = NULL;
11011 parser->stack = NULL;
11012 parser->ps = NULL;
11013 parser->stack_size = 0;
11014 /* XXX parser->stack->state = 0; */
11015
11016 /* XXX eventually, just Copy() most of the parser struct ? */
11017
11018 parser->lex_brackets = proto->lex_brackets;
11019 parser->lex_casemods = proto->lex_casemods;
11020 parser->lex_brackstack = savepvn(proto->lex_brackstack,
11021 (proto->lex_brackets < 120 ? 120 : proto->lex_brackets));
11022 parser->lex_casestack = savepvn(proto->lex_casestack,
11023 (proto->lex_casemods < 12 ? 12 : proto->lex_casemods));
11024 parser->lex_defer = proto->lex_defer;
11025 parser->lex_dojoin = proto->lex_dojoin;
11026 parser->lex_expect = proto->lex_expect;
11027 parser->lex_formbrack = proto->lex_formbrack;
11028 parser->lex_inpat = proto->lex_inpat;
11029 parser->lex_inwhat = proto->lex_inwhat;
11030 parser->lex_op = proto->lex_op;
11031 parser->lex_repl = sv_dup_inc(proto->lex_repl, param);
11032 parser->lex_starts = proto->lex_starts;
11033 parser->lex_stuff = sv_dup_inc(proto->lex_stuff, param);
11034 parser->multi_close = proto->multi_close;
11035 parser->multi_open = proto->multi_open;
11036 parser->multi_start = proto->multi_start;
670a9cb2 11037 parser->multi_end = proto->multi_end;
199e78b7
DM
11038 parser->pending_ident = proto->pending_ident;
11039 parser->preambled = proto->preambled;
11040 parser->sublex_info = proto->sublex_info; /* XXX not quite right */
bdc0bf6f 11041 parser->linestr = sv_dup_inc(proto->linestr, param);
53a7735b
DM
11042 parser->expect = proto->expect;
11043 parser->copline = proto->copline;
f06b5848 11044 parser->last_lop_op = proto->last_lop_op;
bc177e6b 11045 parser->lex_state = proto->lex_state;
2f9285f8 11046 parser->rsfp = fp_dup(proto->rsfp, '<', param);
5486870f
DM
11047 /* rsfp_filters entries have fake IoDIRP() */
11048 parser->rsfp_filters= av_dup_inc(proto->rsfp_filters, param);
12bd6ede
DM
11049 parser->in_my = proto->in_my;
11050 parser->in_my_stash = hv_dup(proto->in_my_stash, param);
13765c85 11051 parser->error_count = proto->error_count;
bc177e6b 11052
53a7735b 11053
f06b5848
DM
11054 parser->linestr = sv_dup_inc(proto->linestr, param);
11055
11056 {
1e05feb3
AL
11057 char * const ols = SvPVX(proto->linestr);
11058 char * const ls = SvPVX(parser->linestr);
f06b5848
DM
11059
11060 parser->bufptr = ls + (proto->bufptr >= ols ?
11061 proto->bufptr - ols : 0);
11062 parser->oldbufptr = ls + (proto->oldbufptr >= ols ?
11063 proto->oldbufptr - ols : 0);
11064 parser->oldoldbufptr= ls + (proto->oldoldbufptr >= ols ?
11065 proto->oldoldbufptr - ols : 0);
11066 parser->linestart = ls + (proto->linestart >= ols ?
11067 proto->linestart - ols : 0);
11068 parser->last_uni = ls + (proto->last_uni >= ols ?
11069 proto->last_uni - ols : 0);
11070 parser->last_lop = ls + (proto->last_lop >= ols ?
11071 proto->last_lop - ols : 0);
11072
11073 parser->bufend = ls + SvCUR(parser->linestr);
11074 }
199e78b7 11075
14047fc9
DM
11076 Copy(proto->tokenbuf, parser->tokenbuf, 256, char);
11077
2f9285f8 11078
199e78b7
DM
11079#ifdef PERL_MAD
11080 parser->endwhite = proto->endwhite;
11081 parser->faketokens = proto->faketokens;
11082 parser->lasttoke = proto->lasttoke;
11083 parser->nextwhite = proto->nextwhite;
11084 parser->realtokenstart = proto->realtokenstart;
11085 parser->skipwhite = proto->skipwhite;
11086 parser->thisclose = proto->thisclose;
11087 parser->thismad = proto->thismad;
11088 parser->thisopen = proto->thisopen;
11089 parser->thisstuff = proto->thisstuff;
11090 parser->thistoken = proto->thistoken;
11091 parser->thiswhite = proto->thiswhite;
fb205e7a
DM
11092
11093 Copy(proto->nexttoke, parser->nexttoke, 5, NEXTTOKE);
11094 parser->curforce = proto->curforce;
11095#else
11096 Copy(proto->nextval, parser->nextval, 5, YYSTYPE);
11097 Copy(proto->nexttype, parser->nexttype, 5, I32);
11098 parser->nexttoke = proto->nexttoke;
199e78b7 11099#endif
f0c5aa00
DM
11100
11101 /* XXX should clone saved_curcop here, but we aren't passed
11102 * proto_perl; so do it in perl_clone_using instead */
11103
199e78b7
DM
11104 return parser;
11105}
11106
d2d73c3e 11107
d2d73c3e 11108/* duplicate a file handle */
645c22ef 11109
1d7c1841 11110PerlIO *
3be3cdd6 11111Perl_fp_dup(pTHX_ PerlIO *const fp, const char type, CLONE_PARAMS *const param)
1d7c1841
GS
11112{
11113 PerlIO *ret;
53c1dcc0 11114
7918f24d 11115 PERL_ARGS_ASSERT_FP_DUP;
53c1dcc0 11116 PERL_UNUSED_ARG(type);
73d840c0 11117
1d7c1841
GS
11118 if (!fp)
11119 return (PerlIO*)NULL;
11120
11121 /* look for it in the table first */
11122 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
11123 if (ret)
11124 return ret;
11125
11126 /* create anew and remember what it is */
ecdeb87c 11127 ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
1d7c1841
GS
11128 ptr_table_store(PL_ptr_table, fp, ret);
11129 return ret;
11130}
11131
645c22ef
DM
11132/* duplicate a directory handle */
11133
1d7c1841 11134DIR *
60b22aca 11135Perl_dirp_dup(pTHX_ DIR *const dp, CLONE_PARAMS *const param)
1d7c1841 11136{
11a11ecf 11137 DIR *ret;
60b22aca
JD
11138
11139#ifdef HAS_FCHDIR
11a11ecf
FC
11140 DIR *pwd;
11141 register const Direntry_t *dirent;
11142 char smallbuf[256];
11143 char *name = NULL;
11144 STRLEN len = -1;
11145 long pos;
11146#endif
11147
96a5add6 11148 PERL_UNUSED_CONTEXT;
60b22aca 11149 PERL_ARGS_ASSERT_DIRP_DUP;
11a11ecf 11150
1d7c1841
GS
11151 if (!dp)
11152 return (DIR*)NULL;
60b22aca 11153
11a11ecf
FC
11154 /* look for it in the table first */
11155 ret = (DIR*)ptr_table_fetch(PL_ptr_table, dp);
11156 if (ret)
11157 return ret;
11158
60b22aca
JD
11159#ifdef HAS_FCHDIR
11160
11161 PERL_UNUSED_ARG(param);
11162
11a11ecf
FC
11163 /* create anew */
11164
11165 /* open the current directory (so we can switch back) */
11166 if (!(pwd = PerlDir_open("."))) return (DIR *)NULL;
11167
11168 /* chdir to our dir handle and open the present working directory */
11169 if (fchdir(my_dirfd(dp)) < 0 || !(ret = PerlDir_open("."))) {
11170 PerlDir_close(pwd);
11171 return (DIR *)NULL;
11172 }
11173 /* Now we should have two dir handles pointing to the same dir. */
11174
11175 /* Be nice to the calling code and chdir back to where we were. */
11176 fchdir(my_dirfd(pwd)); /* If this fails, then what? */
11177
11178 /* We have no need of the pwd handle any more. */
11179 PerlDir_close(pwd);
11180
11181#ifdef DIRNAMLEN
11182# define d_namlen(d) (d)->d_namlen
11183#else
11184# define d_namlen(d) strlen((d)->d_name)
11185#endif
11186 /* Iterate once through dp, to get the file name at the current posi-
11187 tion. Then step back. */
11188 pos = PerlDir_tell(dp);
11189 if ((dirent = PerlDir_read(dp))) {
11190 len = d_namlen(dirent);
11191 if (len <= sizeof smallbuf) name = smallbuf;
11192 else Newx(name, len, char);
11193 Move(dirent->d_name, name, len, char);
11194 }
11195 PerlDir_seek(dp, pos);
11196
11197 /* Iterate through the new dir handle, till we find a file with the
11198 right name. */
11199 if (!dirent) /* just before the end */
11200 for(;;) {
11201 pos = PerlDir_tell(ret);
11202 if (PerlDir_read(ret)) continue; /* not there yet */
11203 PerlDir_seek(ret, pos); /* step back */
11204 break;
11205 }
11206 else {
11207 const long pos0 = PerlDir_tell(ret);
11208 for(;;) {
11209 pos = PerlDir_tell(ret);
11210 if ((dirent = PerlDir_read(ret))) {
11211 if (len == d_namlen(dirent)
11212 && memEQ(name, dirent->d_name, len)) {
11213 /* found it */
11214 PerlDir_seek(ret, pos); /* step back */
11215 break;
11216 }
11217 /* else we are not there yet; keep iterating */
11218 }
11219 else { /* This is not meant to happen. The best we can do is
11220 reset the iterator to the beginning. */
11221 PerlDir_seek(ret, pos0);
11222 break;
11223 }
11224 }
11225 }
11226#undef d_namlen
11227
11228 if (name && name != smallbuf)
11229 Safefree(name);
60b22aca
JD
11230#endif
11231
11232#ifdef WIN32
11233 ret = win32_dirp_dup(dp, param);
11234#endif
11a11ecf
FC
11235
11236 /* pop it in the pointer table */
60b22aca
JD
11237 if (ret)
11238 ptr_table_store(PL_ptr_table, dp, ret);
11a11ecf
FC
11239
11240 return ret;
1d7c1841
GS
11241}
11242
ff276b08 11243/* duplicate a typeglob */
645c22ef 11244
1d7c1841 11245GP *
66ceb532 11246Perl_gp_dup(pTHX_ GP *const gp, CLONE_PARAMS *const param)
1d7c1841
GS
11247{
11248 GP *ret;
b37c2d43 11249
7918f24d
NC
11250 PERL_ARGS_ASSERT_GP_DUP;
11251
1d7c1841
GS
11252 if (!gp)
11253 return (GP*)NULL;
11254 /* look for it in the table first */
11255 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
11256 if (ret)
11257 return ret;
11258
11259 /* create anew and remember what it is */
a02a5408 11260 Newxz(ret, 1, GP);
1d7c1841
GS
11261 ptr_table_store(PL_ptr_table, gp, ret);
11262
11263 /* clone */
46d65037
NC
11264 /* ret->gp_refcnt must be 0 before any other dups are called. We're relying
11265 on Newxz() to do this for us. */
d2d73c3e
AB
11266 ret->gp_sv = sv_dup_inc(gp->gp_sv, param);
11267 ret->gp_io = io_dup_inc(gp->gp_io, param);
11268 ret->gp_form = cv_dup_inc(gp->gp_form, param);
11269 ret->gp_av = av_dup_inc(gp->gp_av, param);
11270 ret->gp_hv = hv_dup_inc(gp->gp_hv, param);
11271 ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
11272 ret->gp_cv = cv_dup_inc(gp->gp_cv, param);
1d7c1841 11273 ret->gp_cvgen = gp->gp_cvgen;
1d7c1841 11274 ret->gp_line = gp->gp_line;
566771cc 11275 ret->gp_file_hek = hek_dup(gp->gp_file_hek, param);
1d7c1841
GS
11276 return ret;
11277}
11278
645c22ef
DM
11279/* duplicate a chain of magic */
11280
1d7c1841 11281MAGIC *
b88ec9b8 11282Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS *const param)
1d7c1841 11283{
c160a186 11284 MAGIC *mgret = NULL;
0228edf6 11285 MAGIC **mgprev_p = &mgret;
7918f24d
NC
11286
11287 PERL_ARGS_ASSERT_MG_DUP;
11288
1d7c1841
GS
11289 for (; mg; mg = mg->mg_moremagic) {
11290 MAGIC *nmg;
803f2748
DM
11291
11292 if ((param->flags & CLONEf_JOIN_IN)
11293 && mg->mg_type == PERL_MAGIC_backref)
11294 /* when joining, we let the individual SVs add themselves to
11295 * backref as needed. */
11296 continue;
11297
45f7fcc8 11298 Newx(nmg, 1, MAGIC);
0228edf6
NC
11299 *mgprev_p = nmg;
11300 mgprev_p = &(nmg->mg_moremagic);
11301
45f7fcc8
NC
11302 /* There was a comment "XXX copy dynamic vtable?" but as we don't have
11303 dynamic vtables, I'm not sure why Sarathy wrote it. The comment dates
11304 from the original commit adding Perl_mg_dup() - revision 4538.
11305 Similarly there is the annotation "XXX random ptr?" next to the
11306 assignment to nmg->mg_ptr. */
11307 *nmg = *mg;
11308
288b8c02 11309 /* FIXME for plugins
45f7fcc8
NC
11310 if (nmg->mg_type == PERL_MAGIC_qr) {
11311 nmg->mg_obj = MUTABLE_SV(CALLREGDUPE((REGEXP*)nmg->mg_obj, param));
1d7c1841 11312 }
288b8c02
NC
11313 else
11314 */
5648c0ae
DM
11315 nmg->mg_obj = (nmg->mg_flags & MGf_REFCOUNTED)
11316 ? nmg->mg_type == PERL_MAGIC_backref
11317 /* The backref AV has its reference
11318 * count deliberately bumped by 1 */
11319 ? SvREFCNT_inc(av_dup_inc((const AV *)
11320 nmg->mg_obj, param))
11321 : sv_dup_inc(nmg->mg_obj, param)
11322 : sv_dup(nmg->mg_obj, param);
45f7fcc8
NC
11323
11324 if (nmg->mg_ptr && nmg->mg_type != PERL_MAGIC_regex_global) {
11325 if (nmg->mg_len > 0) {
11326 nmg->mg_ptr = SAVEPVN(nmg->mg_ptr, nmg->mg_len);
11327 if (nmg->mg_type == PERL_MAGIC_overload_table &&
11328 AMT_AMAGIC((AMT*)nmg->mg_ptr))
14befaf4 11329 {
0bcc34c2 11330 AMT * const namtp = (AMT*)nmg->mg_ptr;
538f2e76
NC
11331 sv_dup_inc_multiple((SV**)(namtp->table),
11332 (SV**)(namtp->table), NofAMmeth, param);
1d7c1841
GS
11333 }
11334 }
45f7fcc8
NC
11335 else if (nmg->mg_len == HEf_SVKEY)
11336 nmg->mg_ptr = (char*)sv_dup_inc((const SV *)nmg->mg_ptr, param);
1d7c1841 11337 }
45f7fcc8 11338 if ((nmg->mg_flags & MGf_DUP) && nmg->mg_virtual && nmg->mg_virtual->svt_dup) {
16c91539 11339 nmg->mg_virtual->svt_dup(aTHX_ nmg, param);
68795e93 11340 }
1d7c1841
GS
11341 }
11342 return mgret;
11343}
11344
4674ade5
NC
11345#endif /* USE_ITHREADS */
11346
db93c0c4
NC
11347struct ptr_tbl_arena {
11348 struct ptr_tbl_arena *next;
11349 struct ptr_tbl_ent array[1023/3]; /* as ptr_tbl_ent has 3 pointers. */
11350};
11351
645c22ef
DM
11352/* create a new pointer-mapping table */
11353
1d7c1841
GS
11354PTR_TBL_t *
11355Perl_ptr_table_new(pTHX)
11356{
11357 PTR_TBL_t *tbl;
96a5add6
AL
11358 PERL_UNUSED_CONTEXT;
11359
b3a120bf 11360 Newx(tbl, 1, PTR_TBL_t);
1d7c1841
GS
11361 tbl->tbl_max = 511;
11362 tbl->tbl_items = 0;
db93c0c4
NC
11363 tbl->tbl_arena = NULL;
11364 tbl->tbl_arena_next = NULL;
11365 tbl->tbl_arena_end = NULL;
a02a5408 11366 Newxz(tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
1d7c1841
GS
11367 return tbl;
11368}
11369
7119fd33
NC
11370#define PTR_TABLE_HASH(ptr) \
11371 ((PTR2UV(ptr) >> 3) ^ (PTR2UV(ptr) >> (3 + 7)) ^ (PTR2UV(ptr) >> (3 + 17)))
134ca3d6 11372
645c22ef
DM
11373/* map an existing pointer using a table */
11374
7bf61b54 11375STATIC PTR_TBL_ENT_t *
1eb6e4ca 11376S_ptr_table_find(PTR_TBL_t *const tbl, const void *const sv)
7918f24d 11377{
1d7c1841 11378 PTR_TBL_ENT_t *tblent;
4373e329 11379 const UV hash = PTR_TABLE_HASH(sv);
7918f24d
NC
11380
11381 PERL_ARGS_ASSERT_PTR_TABLE_FIND;
11382
1d7c1841
GS
11383 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
11384 for (; tblent; tblent = tblent->next) {
11385 if (tblent->oldval == sv)
7bf61b54 11386 return tblent;
1d7c1841 11387 }
d4c19fe8 11388 return NULL;
7bf61b54
NC
11389}
11390
11391void *
1eb6e4ca 11392Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *const tbl, const void *const sv)
7bf61b54 11393{
b0e6ae5b 11394 PTR_TBL_ENT_t const *const tblent = ptr_table_find(tbl, sv);
7918f24d
NC
11395
11396 PERL_ARGS_ASSERT_PTR_TABLE_FETCH;
96a5add6 11397 PERL_UNUSED_CONTEXT;
7918f24d 11398
d4c19fe8 11399 return tblent ? tblent->newval : NULL;
1d7c1841
GS
11400}
11401
645c22ef
DM
11402/* add a new entry to a pointer-mapping table */
11403
1d7c1841 11404void
1eb6e4ca 11405Perl_ptr_table_store(pTHX_ PTR_TBL_t *const tbl, const void *const oldsv, void *const newsv)
1d7c1841 11406{
0c9fdfe0 11407 PTR_TBL_ENT_t *tblent = ptr_table_find(tbl, oldsv);
7918f24d
NC
11408
11409 PERL_ARGS_ASSERT_PTR_TABLE_STORE;
96a5add6 11410 PERL_UNUSED_CONTEXT;
1d7c1841 11411
7bf61b54
NC
11412 if (tblent) {
11413 tblent->newval = newsv;
11414 } else {
11415 const UV entry = PTR_TABLE_HASH(oldsv) & tbl->tbl_max;
11416
db93c0c4
NC
11417 if (tbl->tbl_arena_next == tbl->tbl_arena_end) {
11418 struct ptr_tbl_arena *new_arena;
11419
11420 Newx(new_arena, 1, struct ptr_tbl_arena);
11421 new_arena->next = tbl->tbl_arena;
11422 tbl->tbl_arena = new_arena;
11423 tbl->tbl_arena_next = new_arena->array;
11424 tbl->tbl_arena_end = new_arena->array
11425 + sizeof(new_arena->array) / sizeof(new_arena->array[0]);
11426 }
11427
11428 tblent = tbl->tbl_arena_next++;
d2a0f284 11429
7bf61b54
NC
11430 tblent->oldval = oldsv;
11431 tblent->newval = newsv;
11432 tblent->next = tbl->tbl_ary[entry];
11433 tbl->tbl_ary[entry] = tblent;
11434 tbl->tbl_items++;
11435 if (tblent->next && tbl->tbl_items > tbl->tbl_max)
11436 ptr_table_split(tbl);
1d7c1841 11437 }
1d7c1841
GS
11438}
11439
645c22ef
DM
11440/* double the hash bucket size of an existing ptr table */
11441
1d7c1841 11442void
1eb6e4ca 11443Perl_ptr_table_split(pTHX_ PTR_TBL_t *const tbl)
1d7c1841
GS
11444{
11445 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
4373e329 11446 const UV oldsize = tbl->tbl_max + 1;
1d7c1841
GS
11447 UV newsize = oldsize * 2;
11448 UV i;
7918f24d
NC
11449
11450 PERL_ARGS_ASSERT_PTR_TABLE_SPLIT;
96a5add6 11451 PERL_UNUSED_CONTEXT;
1d7c1841
GS
11452
11453 Renew(ary, newsize, PTR_TBL_ENT_t*);
11454 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
11455 tbl->tbl_max = --newsize;
11456 tbl->tbl_ary = ary;
11457 for (i=0; i < oldsize; i++, ary++) {
4c9d89c5
NC
11458 PTR_TBL_ENT_t **entp = ary;
11459 PTR_TBL_ENT_t *ent = *ary;
11460 PTR_TBL_ENT_t **curentp;
11461 if (!ent)
1d7c1841
GS
11462 continue;
11463 curentp = ary + oldsize;
4c9d89c5 11464 do {
134ca3d6 11465 if ((newsize & PTR_TABLE_HASH(ent->oldval)) != i) {
1d7c1841
GS
11466 *entp = ent->next;
11467 ent->next = *curentp;
11468 *curentp = ent;
1d7c1841
GS
11469 }
11470 else
11471 entp = &ent->next;
4c9d89c5
NC
11472 ent = *entp;
11473 } while (ent);
1d7c1841
GS
11474 }
11475}
11476
645c22ef 11477/* remove all the entries from a ptr table */
5c5ade3e 11478/* Deprecated - will be removed post 5.14 */
645c22ef 11479
a0739874 11480void
1eb6e4ca 11481Perl_ptr_table_clear(pTHX_ PTR_TBL_t *const tbl)
a0739874 11482{
d5cefff9 11483 if (tbl && tbl->tbl_items) {
db93c0c4 11484 struct ptr_tbl_arena *arena = tbl->tbl_arena;
a0739874 11485
db93c0c4 11486 Zero(tbl->tbl_ary, tbl->tbl_max + 1, struct ptr_tbl_ent **);
ab1e7f95 11487
db93c0c4
NC
11488 while (arena) {
11489 struct ptr_tbl_arena *next = arena->next;
11490
11491 Safefree(arena);
11492 arena = next;
11493 };
a0739874 11494
d5cefff9 11495 tbl->tbl_items = 0;
db93c0c4
NC
11496 tbl->tbl_arena = NULL;
11497 tbl->tbl_arena_next = NULL;
11498 tbl->tbl_arena_end = NULL;
d5cefff9 11499 }
a0739874
DM
11500}
11501
645c22ef
DM
11502/* clear and free a ptr table */
11503
a0739874 11504void
1eb6e4ca 11505Perl_ptr_table_free(pTHX_ PTR_TBL_t *const tbl)
a0739874 11506{
5c5ade3e
NC
11507 struct ptr_tbl_arena *arena;
11508
a0739874
DM
11509 if (!tbl) {
11510 return;
11511 }
5c5ade3e
NC
11512
11513 arena = tbl->tbl_arena;
11514
11515 while (arena) {
11516 struct ptr_tbl_arena *next = arena->next;
11517
11518 Safefree(arena);
11519 arena = next;
11520 }
11521
a0739874
DM
11522 Safefree(tbl->tbl_ary);
11523 Safefree(tbl);
11524}
11525
4674ade5 11526#if defined(USE_ITHREADS)
5bd07a3d 11527
83841fad 11528void
1eb6e4ca 11529Perl_rvpv_dup(pTHX_ SV *const dstr, const SV *const sstr, CLONE_PARAMS *const param)
83841fad 11530{
7918f24d
NC
11531 PERL_ARGS_ASSERT_RVPV_DUP;
11532
83841fad 11533 if (SvROK(sstr)) {
803f2748
DM
11534 if (SvWEAKREF(sstr)) {
11535 SvRV_set(dstr, sv_dup(SvRV_const(sstr), param));
11536 if (param->flags & CLONEf_JOIN_IN) {
11537 /* if joining, we add any back references individually rather
11538 * than copying the whole backref array */
11539 Perl_sv_add_backref(aTHX_ SvRV(dstr), dstr);
11540 }
11541 }
11542 else
11543 SvRV_set(dstr, sv_dup_inc(SvRV_const(sstr), param));
83841fad 11544 }
3f7c398e 11545 else if (SvPVX_const(sstr)) {
83841fad
NIS
11546 /* Has something there */
11547 if (SvLEN(sstr)) {
68795e93 11548 /* Normal PV - clone whole allocated space */
3f7c398e 11549 SvPV_set(dstr, SAVEPVN(SvPVX_const(sstr), SvLEN(sstr)-1));
d3d0e6f1
NC
11550 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
11551 /* Not that normal - actually sstr is copy on write.
11552 But we are a true, independant SV, so: */
11553 SvREADONLY_off(dstr);
11554 SvFAKE_off(dstr);
11555 }
68795e93 11556 }
83841fad
NIS
11557 else {
11558 /* Special case - not normally malloced for some reason */
f7877b28
NC
11559 if (isGV_with_GP(sstr)) {
11560 /* Don't need to do anything here. */
11561 }
11562 else if ((SvREADONLY(sstr) && SvFAKE(sstr))) {
ef10be65
NC
11563 /* A "shared" PV - clone it as "shared" PV */
11564 SvPV_set(dstr,
11565 HEK_KEY(hek_dup(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)),
11566 param)));
83841fad
NIS
11567 }
11568 else {
11569 /* Some other special case - random pointer */
d2c6dc5e 11570 SvPV_set(dstr, (char *) SvPVX_const(sstr));
d3d0e6f1 11571 }
83841fad
NIS
11572 }
11573 }
11574 else {
4608196e 11575 /* Copy the NULL */
4df7f6af 11576 SvPV_set(dstr, NULL);
83841fad
NIS
11577 }
11578}
11579
538f2e76
NC
11580/* duplicate a list of SVs. source and dest may point to the same memory. */
11581static SV **
11582S_sv_dup_inc_multiple(pTHX_ SV *const *source, SV **dest,
11583 SSize_t items, CLONE_PARAMS *const param)
11584{
11585 PERL_ARGS_ASSERT_SV_DUP_INC_MULTIPLE;
11586
11587 while (items-- > 0) {
11588 *dest++ = sv_dup_inc(*source++, param);
11589 }
11590
11591 return dest;
11592}
11593
662fb8b2
NC
11594/* duplicate an SV of any type (including AV, HV etc) */
11595
d08d57ef
NC
11596static SV *
11597S_sv_dup_common(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
1d7c1841 11598{
27da23d5 11599 dVAR;
1d7c1841
GS
11600 SV *dstr;
11601
d08d57ef 11602 PERL_ARGS_ASSERT_SV_DUP_COMMON;
7918f24d 11603
bfd95973
NC
11604 if (SvTYPE(sstr) == SVTYPEMASK) {
11605#ifdef DEBUG_LEAKING_SCALARS_ABORT
11606 abort();
11607#endif
6136c704 11608 return NULL;
bfd95973 11609 }
1d7c1841 11610 /* look for it in the table first */
daba3364 11611 dstr = MUTABLE_SV(ptr_table_fetch(PL_ptr_table, sstr));
1d7c1841
GS
11612 if (dstr)
11613 return dstr;
11614
0405e91e
AB
11615 if(param->flags & CLONEf_JOIN_IN) {
11616 /** We are joining here so we don't want do clone
11617 something that is bad **/
eb86f8b3 11618 if (SvTYPE(sstr) == SVt_PVHV) {
9bde8eb0 11619 const HEK * const hvname = HvNAME_HEK(sstr);
96bafef9 11620 if (hvname) {
eb86f8b3 11621 /** don't clone stashes if they already exist **/
96bafef9
DM
11622 dstr = MUTABLE_SV(gv_stashpvn(HEK_KEY(hvname), HEK_LEN(hvname), 0));
11623 ptr_table_store(PL_ptr_table, sstr, dstr);
11624 return dstr;
11625 }
0405e91e
AB
11626 }
11627 }
11628
1d7c1841
GS
11629 /* create anew and remember what it is */
11630 new_SV(dstr);
fd0854ff
DM
11631
11632#ifdef DEBUG_LEAKING_SCALARS
11633 dstr->sv_debug_optype = sstr->sv_debug_optype;
11634 dstr->sv_debug_line = sstr->sv_debug_line;
11635 dstr->sv_debug_inpad = sstr->sv_debug_inpad;
cd676548 11636 dstr->sv_debug_parent = (SV*)sstr;
de61950a 11637 FREE_SV_DEBUG_FILE(dstr);
fd0854ff 11638 dstr->sv_debug_file = savepv(sstr->sv_debug_file);
fd0854ff
DM
11639#endif
11640
1d7c1841
GS
11641 ptr_table_store(PL_ptr_table, sstr, dstr);
11642
11643 /* clone */
11644 SvFLAGS(dstr) = SvFLAGS(sstr);
11645 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
11646 SvREFCNT(dstr) = 0; /* must be before any other dups! */
11647
11648#ifdef DEBUGGING
3f7c398e 11649 if (SvANY(sstr) && PL_watch_pvx && SvPVX_const(sstr) == PL_watch_pvx)
1d7c1841 11650 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
6c9570dc 11651 (void*)PL_watch_pvx, SvPVX_const(sstr));
1d7c1841
GS
11652#endif
11653
9660f481
DM
11654 /* don't clone objects whose class has asked us not to */
11655 if (SvOBJECT(sstr) && ! (SvFLAGS(SvSTASH(sstr)) & SVphv_CLONEABLE)) {
33de8e4a 11656 SvFLAGS(dstr) = 0;
9660f481
DM
11657 return dstr;
11658 }
11659
1d7c1841
GS
11660 switch (SvTYPE(sstr)) {
11661 case SVt_NULL:
11662 SvANY(dstr) = NULL;
11663 break;
11664 case SVt_IV:
339049b0 11665 SvANY(dstr) = (XPVIV*)((char*)&(dstr->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
4df7f6af
NC
11666 if(SvROK(sstr)) {
11667 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
11668 } else {
11669 SvIV_set(dstr, SvIVX(sstr));
11670 }
1d7c1841
GS
11671 break;
11672 case SVt_NV:
11673 SvANY(dstr) = new_XNV();
9d6ce603 11674 SvNV_set(dstr, SvNVX(sstr));
1d7c1841 11675 break;
cecf5685 11676 /* case SVt_BIND: */
662fb8b2
NC
11677 default:
11678 {
11679 /* These are all the types that need complex bodies allocating. */
662fb8b2 11680 void *new_body;
2bcc16b3
NC
11681 const svtype sv_type = SvTYPE(sstr);
11682 const struct body_details *const sv_type_details
11683 = bodies_by_type + sv_type;
662fb8b2 11684
93e68bfb 11685 switch (sv_type) {
662fb8b2 11686 default:
bb263b4e 11687 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
662fb8b2
NC
11688 break;
11689
662fb8b2 11690 case SVt_PVGV:
c22188b4
NC
11691 case SVt_PVIO:
11692 case SVt_PVFM:
11693 case SVt_PVHV:
11694 case SVt_PVAV:
662fb8b2 11695 case SVt_PVCV:
662fb8b2 11696 case SVt_PVLV:
5c35adbb 11697 case SVt_REGEXP:
662fb8b2 11698 case SVt_PVMG:
662fb8b2 11699 case SVt_PVNV:
662fb8b2 11700 case SVt_PVIV:
662fb8b2 11701 case SVt_PV:
d2a0f284 11702 assert(sv_type_details->body_size);
c22188b4 11703 if (sv_type_details->arena) {
d2a0f284 11704 new_body_inline(new_body, sv_type);
c22188b4 11705 new_body
b9502f15 11706 = (void*)((char*)new_body - sv_type_details->offset);
c22188b4
NC
11707 } else {
11708 new_body = new_NOARENA(sv_type_details);
11709 }
1d7c1841 11710 }
662fb8b2
NC
11711 assert(new_body);
11712 SvANY(dstr) = new_body;
11713
2bcc16b3 11714#ifndef PURIFY
b9502f15
NC
11715 Copy(((char*)SvANY(sstr)) + sv_type_details->offset,
11716 ((char*)SvANY(dstr)) + sv_type_details->offset,
f32993d6 11717 sv_type_details->copy, char);
2bcc16b3
NC
11718#else
11719 Copy(((char*)SvANY(sstr)),
11720 ((char*)SvANY(dstr)),
d2a0f284 11721 sv_type_details->body_size + sv_type_details->offset, char);
2bcc16b3 11722#endif
662fb8b2 11723
f7877b28 11724 if (sv_type != SVt_PVAV && sv_type != SVt_PVHV
5bb89d25
NC
11725 && !isGV_with_GP(dstr)
11726 && !(sv_type == SVt_PVIO && !(IoFLAGS(dstr) & IOf_FAKE_DIRP)))
662fb8b2
NC
11727 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
11728
11729 /* The Copy above means that all the source (unduplicated) pointers
11730 are now in the destination. We can check the flags and the
11731 pointers in either, but it's possible that there's less cache
11732 missing by always going for the destination.
11733 FIXME - instrument and check that assumption */
f32993d6 11734 if (sv_type >= SVt_PVMG) {
885ffcb3 11735 if ((sv_type == SVt_PVMG) && SvPAD_OUR(dstr)) {
73d95100 11736 SvOURSTASH_set(dstr, hv_dup_inc(SvOURSTASH(dstr), param));
e736a858 11737 } else if (SvMAGIC(dstr))
662fb8b2
NC
11738 SvMAGIC_set(dstr, mg_dup(SvMAGIC(dstr), param));
11739 if (SvSTASH(dstr))
11740 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(dstr), param));
1d7c1841 11741 }
662fb8b2 11742
f32993d6
NC
11743 /* The cast silences a GCC warning about unhandled types. */
11744 switch ((int)sv_type) {
662fb8b2
NC
11745 case SVt_PV:
11746 break;
11747 case SVt_PVIV:
11748 break;
11749 case SVt_PVNV:
11750 break;
11751 case SVt_PVMG:
11752 break;
5c35adbb 11753 case SVt_REGEXP:
288b8c02 11754 /* FIXME for plugins */
d2f13c59 11755 re_dup_guts((REGEXP*) sstr, (REGEXP*) dstr, param);
f708cfc1 11756 break;
662fb8b2
NC
11757 case SVt_PVLV:
11758 /* XXX LvTARGOFF sometimes holds PMOP* when DEBUGGING */
11759 if (LvTYPE(dstr) == 't') /* for tie: unrefcnted fake (SV**) */
11760 LvTARG(dstr) = dstr;
11761 else if (LvTYPE(dstr) == 'T') /* for tie: fake HE */
daba3364 11762 LvTARG(dstr) = MUTABLE_SV(he_dup((HE*)LvTARG(dstr), 0, param));
662fb8b2
NC
11763 else
11764 LvTARG(dstr) = sv_dup_inc(LvTARG(dstr), param);
662fb8b2 11765 case SVt_PVGV:
61e14cb4 11766 /* non-GP case already handled above */
cecf5685 11767 if(isGV_with_GP(sstr)) {
566771cc 11768 GvNAME_HEK(dstr) = hek_dup(GvNAME_HEK(dstr), param);
39cb70dc
NC
11769 /* Don't call sv_add_backref here as it's going to be
11770 created as part of the magic cloning of the symbol
27bca322
FC
11771 table--unless this is during a join and the stash
11772 is not actually being cloned. */
f7877b28
NC
11773 /* Danger Will Robinson - GvGP(dstr) isn't initialised
11774 at the point of this comment. */
39cb70dc 11775 GvSTASH(dstr) = hv_dup(GvSTASH(dstr), param);
ab95db60
DM
11776 if (param->flags & CLONEf_JOIN_IN)
11777 Perl_sv_add_backref(aTHX_ MUTABLE_SV(GvSTASH(dstr)), dstr);
f7877b28
NC
11778 GvGP(dstr) = gp_dup(GvGP(sstr), param);
11779 (void)GpREFCNT_inc(GvGP(dstr));
61e14cb4 11780 }
662fb8b2
NC
11781 break;
11782 case SVt_PVIO:
5486870f 11783 /* PL_parser->rsfp_filters entries have fake IoDIRP() */
662fb8b2
NC
11784 if(IoFLAGS(dstr) & IOf_FAKE_DIRP) {
11785 /* I have no idea why fake dirp (rsfps)
11786 should be treated differently but otherwise
11787 we end up with leaks -- sky*/
11788 IoTOP_GV(dstr) = gv_dup_inc(IoTOP_GV(dstr), param);
11789 IoFMT_GV(dstr) = gv_dup_inc(IoFMT_GV(dstr), param);
11790 IoBOTTOM_GV(dstr) = gv_dup_inc(IoBOTTOM_GV(dstr), param);
11791 } else {
11792 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(dstr), param);
11793 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(dstr), param);
11794 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(dstr), param);
100ce7e1 11795 if (IoDIRP(dstr)) {
60b22aca 11796 IoDIRP(dstr) = dirp_dup(IoDIRP(dstr), param);
100ce7e1 11797 } else {
6f207bd3 11798 NOOP;
100ce7e1
NC
11799 /* IoDIRP(dstr) is already a copy of IoDIRP(sstr) */
11800 }
6f7e8353 11801 IoIFP(dstr) = fp_dup(IoIFP(sstr), IoTYPE(dstr), param);
662fb8b2 11802 }
6f7e8353
NC
11803 if (IoOFP(dstr) == IoIFP(sstr))
11804 IoOFP(dstr) = IoIFP(dstr);
11805 else
11806 IoOFP(dstr) = fp_dup(IoOFP(dstr), IoTYPE(dstr), param);
662fb8b2
NC
11807 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(dstr));
11808 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(dstr));
11809 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(dstr));
11810 break;
11811 case SVt_PVAV:
2779b694
KB
11812 /* avoid cloning an empty array */
11813 if (AvARRAY((const AV *)sstr) && AvFILLp((const AV *)sstr) >= 0) {
662fb8b2 11814 SV **dst_ary, **src_ary;
502c6561 11815 SSize_t items = AvFILLp((const AV *)sstr) + 1;
662fb8b2 11816
502c6561
NC
11817 src_ary = AvARRAY((const AV *)sstr);
11818 Newxz(dst_ary, AvMAX((const AV *)sstr)+1, SV*);
662fb8b2 11819 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
502c6561
NC
11820 AvARRAY(MUTABLE_AV(dstr)) = dst_ary;
11821 AvALLOC((const AV *)dstr) = dst_ary;
11822 if (AvREAL((const AV *)sstr)) {
538f2e76
NC
11823 dst_ary = sv_dup_inc_multiple(src_ary, dst_ary, items,
11824 param);
662fb8b2
NC
11825 }
11826 else {
11827 while (items-- > 0)
11828 *dst_ary++ = sv_dup(*src_ary++, param);
11829 }
502c6561 11830 items = AvMAX((const AV *)sstr) - AvFILLp((const AV *)sstr);
662fb8b2
NC
11831 while (items-- > 0) {
11832 *dst_ary++ = &PL_sv_undef;
11833 }
bfcb3514 11834 }
662fb8b2 11835 else {
502c6561
NC
11836 AvARRAY(MUTABLE_AV(dstr)) = NULL;
11837 AvALLOC((const AV *)dstr) = (SV**)NULL;
2779b694
KB
11838 AvMAX( (const AV *)dstr) = -1;
11839 AvFILLp((const AV *)dstr) = -1;
b79f7545 11840 }
662fb8b2
NC
11841 break;
11842 case SVt_PVHV:
1d193675 11843 if (HvARRAY((const HV *)sstr)) {
7e265ef3
AL
11844 STRLEN i = 0;
11845 const bool sharekeys = !!HvSHAREKEYS(sstr);
11846 XPVHV * const dxhv = (XPVHV*)SvANY(dstr);
11847 XPVHV * const sxhv = (XPVHV*)SvANY(sstr);
11848 char *darray;
11849 Newx(darray, PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1)
11850 + (SvOOK(sstr) ? sizeof(struct xpvhv_aux) : 0),
11851 char);
11852 HvARRAY(dstr) = (HE**)darray;
11853 while (i <= sxhv->xhv_max) {
11854 const HE * const source = HvARRAY(sstr)[i];
11855 HvARRAY(dstr)[i] = source
11856 ? he_dup(source, sharekeys, param) : 0;
11857 ++i;
11858 }
11859 if (SvOOK(sstr)) {
7e265ef3
AL
11860 const struct xpvhv_aux * const saux = HvAUX(sstr);
11861 struct xpvhv_aux * const daux = HvAUX(dstr);
11862 /* This flag isn't copied. */
11863 /* SvOOK_on(hv) attacks the IV flags. */
11864 SvFLAGS(dstr) |= SVf_OOK;
11865
b7247a80 11866 if (saux->xhv_name_count) {
36b0d498 11867 HEK ** const sname = saux->xhv_name_u.xhvnameu_names;
78b79c77
FC
11868 const I32 count
11869 = saux->xhv_name_count < 0
11870 ? -saux->xhv_name_count
11871 : saux->xhv_name_count;
b7247a80
FC
11872 HEK **shekp = sname + count;
11873 HEK **dhekp;
15d9236d
NC
11874 Newx(daux->xhv_name_u.xhvnameu_names, count, HEK *);
11875 dhekp = daux->xhv_name_u.xhvnameu_names + count;
b7247a80
FC
11876 while (shekp-- > sname) {
11877 dhekp--;
11878 *dhekp = hek_dup(*shekp, param);
11879 }
11880 }
15d9236d
NC
11881 else {
11882 daux->xhv_name_u.xhvnameu_name
11883 = hek_dup(saux->xhv_name_u.xhvnameu_name,
11884 param);
11885 }
b7247a80 11886 daux->xhv_name_count = saux->xhv_name_count;
7e265ef3
AL
11887
11888 daux->xhv_riter = saux->xhv_riter;
11889 daux->xhv_eiter = saux->xhv_eiter
11890 ? he_dup(saux->xhv_eiter,
f2338a2e 11891 cBOOL(HvSHAREKEYS(sstr)), param) : 0;
b17f5ab7 11892 /* backref array needs refcnt=2; see sv_add_backref */
7e265ef3 11893 daux->xhv_backreferences =
ab95db60
DM
11894 (param->flags & CLONEf_JOIN_IN)
11895 /* when joining, we let the individual GVs and
11896 * CVs add themselves to backref as
11897 * needed. This avoids pulling in stuff
11898 * that isn't required, and simplifies the
11899 * case where stashes aren't cloned back
11900 * if they already exist in the parent
11901 * thread */
11902 ? NULL
11903 : saux->xhv_backreferences
5648c0ae
DM
11904 ? (SvTYPE(saux->xhv_backreferences) == SVt_PVAV)
11905 ? MUTABLE_AV(SvREFCNT_inc(
11906 sv_dup_inc((const SV *)
11907 saux->xhv_backreferences, param)))
11908 : MUTABLE_AV(sv_dup((const SV *)
11909 saux->xhv_backreferences, param))
86f55936 11910 : 0;
e1a479c5
BB
11911
11912 daux->xhv_mro_meta = saux->xhv_mro_meta
11913 ? mro_meta_dup(saux->xhv_mro_meta, param)
11914 : 0;
11915
7e265ef3 11916 /* Record stashes for possible cloning in Perl_clone(). */
605aedcc 11917 if (HvNAME(sstr))
7e265ef3 11918 av_push(param->stashes, dstr);
662fb8b2 11919 }
662fb8b2 11920 }
7e265ef3 11921 else
85fbaab2 11922 HvARRAY(MUTABLE_HV(dstr)) = NULL;
662fb8b2 11923 break;
662fb8b2 11924 case SVt_PVCV:
bb172083
NC
11925 if (!(param->flags & CLONEf_COPY_STACKS)) {
11926 CvDEPTH(dstr) = 0;
11927 }
4c74a7df 11928 /*FALLTHROUGH*/
bb172083 11929 case SVt_PVFM:
662fb8b2 11930 /* NOTE: not refcounted */
c68d9564
Z
11931 SvANY(MUTABLE_CV(dstr))->xcv_stash =
11932 hv_dup(CvSTASH(dstr), param);
ab95db60
DM
11933 if ((param->flags & CLONEf_JOIN_IN) && CvSTASH(dstr))
11934 Perl_sv_add_backref(aTHX_ MUTABLE_SV(CvSTASH(dstr)), dstr);
f352ce09
NC
11935 if (!CvISXSUB(dstr)) {
11936 OP_REFCNT_LOCK;
d04ba589 11937 CvROOT(dstr) = OpREFCNT_inc(CvROOT(dstr));
f352ce09
NC
11938 OP_REFCNT_UNLOCK;
11939 CvFILE(dstr) = SAVEPV(CvFILE(dstr));
11940 } else if (CvCONST(dstr)) {
d32faaf3 11941 CvXSUBANY(dstr).any_ptr =
daba3364 11942 sv_dup_inc((const SV *)CvXSUBANY(dstr).any_ptr, param);
662fb8b2
NC
11943 }
11944 /* don't dup if copying back - CvGV isn't refcounted, so the
11945 * duped GV may never be freed. A bit of a hack! DAPM */
b3f91e91 11946 SvANY(MUTABLE_CV(dstr))->xcv_gv =
cfc1e951 11947 CvCVGV_RC(dstr)
803f2748
DM
11948 ? gv_dup_inc(CvGV(sstr), param)
11949 : (param->flags & CLONEf_JOIN_IN)
11950 ? NULL
11951 : gv_dup(CvGV(sstr), param);
11952
d5b1589c 11953 CvPADLIST(dstr) = padlist_dup(CvPADLIST(sstr), param);
662fb8b2
NC
11954 CvOUTSIDE(dstr) =
11955 CvWEAKOUTSIDE(sstr)
11956 ? cv_dup( CvOUTSIDE(dstr), param)
11957 : cv_dup_inc(CvOUTSIDE(dstr), param);
662fb8b2 11958 break;
bfcb3514 11959 }
1d7c1841 11960 }
1d7c1841
GS
11961 }
11962
11963 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
11964 ++PL_sv_objcount;
11965
11966 return dstr;
d2d73c3e 11967 }
1d7c1841 11968
a09252eb
NC
11969SV *
11970Perl_sv_dup_inc(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
11971{
11972 PERL_ARGS_ASSERT_SV_DUP_INC;
d08d57ef
NC
11973 return sstr ? SvREFCNT_inc(sv_dup_common(sstr, param)) : NULL;
11974}
11975
11976SV *
11977Perl_sv_dup(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
11978{
11979 SV *dstr = sstr ? sv_dup_common(sstr, param) : NULL;
11980 PERL_ARGS_ASSERT_SV_DUP;
11981
04518cc3
NC
11982 /* Track every SV that (at least initially) had a reference count of 0.
11983 We need to do this by holding an actual reference to it in this array.
11984 If we attempt to cheat, turn AvREAL_off(), and store only pointers
11985 (akin to the stashes hash, and the perl stack), we come unstuck if
11986 a weak reference (or other SV legitimately SvREFCNT() == 0 for this
11987 thread) is manipulated in a CLONE method, because CLONE runs before the
11988 unreferenced array is walked to find SVs still with SvREFCNT() == 0
11989 (and fix things up by giving each a reference via the temps stack).
11990 Instead, during CLONE, if the 0-referenced SV has SvREFCNT_inc() and
11991 then SvREFCNT_dec(), it will be cleaned up (and added to the free list)
11992 before the walk of unreferenced happens and a reference to that is SV
11993 added to the temps stack. At which point we have the same SV considered
11994 to be in use, and free to be re-used. Not good.
11995 */
d08d57ef
NC
11996 if (dstr && !(param->flags & CLONEf_COPY_STACKS) && !SvREFCNT(dstr)) {
11997 assert(param->unreferenced);
04518cc3 11998 av_push(param->unreferenced, SvREFCNT_inc(dstr));
d08d57ef
NC
11999 }
12000
12001 return dstr;
a09252eb
NC
12002}
12003
645c22ef
DM
12004/* duplicate a context */
12005
1d7c1841 12006PERL_CONTEXT *
a8fc9800 12007Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
1d7c1841
GS
12008{
12009 PERL_CONTEXT *ncxs;
12010
7918f24d
NC
12011 PERL_ARGS_ASSERT_CX_DUP;
12012
1d7c1841
GS
12013 if (!cxs)
12014 return (PERL_CONTEXT*)NULL;
12015
12016 /* look for it in the table first */
12017 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
12018 if (ncxs)
12019 return ncxs;
12020
12021 /* create anew and remember what it is */
c2d565bf 12022 Newx(ncxs, max + 1, PERL_CONTEXT);
1d7c1841 12023 ptr_table_store(PL_ptr_table, cxs, ncxs);
c2d565bf 12024 Copy(cxs, ncxs, max + 1, PERL_CONTEXT);
1d7c1841
GS
12025
12026 while (ix >= 0) {
c445ea15 12027 PERL_CONTEXT * const ncx = &ncxs[ix];
c2d565bf 12028 if (CxTYPE(ncx) == CXt_SUBST) {
1d7c1841
GS
12029 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
12030 }
12031 else {
c2d565bf 12032 switch (CxTYPE(ncx)) {
1d7c1841 12033 case CXt_SUB:
c2d565bf
NC
12034 ncx->blk_sub.cv = (ncx->blk_sub.olddepth == 0
12035 ? cv_dup_inc(ncx->blk_sub.cv, param)
12036 : cv_dup(ncx->blk_sub.cv,param));
bafb2adc 12037 ncx->blk_sub.argarray = (CxHASARGS(ncx)
c2d565bf
NC
12038 ? av_dup_inc(ncx->blk_sub.argarray,
12039 param)
7d49f689 12040 : NULL);
c2d565bf
NC
12041 ncx->blk_sub.savearray = av_dup_inc(ncx->blk_sub.savearray,
12042 param);
d8d97e70 12043 ncx->blk_sub.oldcomppad = (PAD*)ptr_table_fetch(PL_ptr_table,
c2d565bf 12044 ncx->blk_sub.oldcomppad);
1d7c1841
GS
12045 break;
12046 case CXt_EVAL:
c2d565bf
NC
12047 ncx->blk_eval.old_namesv = sv_dup_inc(ncx->blk_eval.old_namesv,
12048 param);
12049 ncx->blk_eval.cur_text = sv_dup(ncx->blk_eval.cur_text, param);
1d7c1841 12050 break;
d01136d6 12051 case CXt_LOOP_LAZYSV:
d01136d6
BS
12052 ncx->blk_loop.state_u.lazysv.end
12053 = sv_dup_inc(ncx->blk_loop.state_u.lazysv.end, param);
840fe433
NC
12054 /* We are taking advantage of av_dup_inc and sv_dup_inc
12055 actually being the same function, and order equivalance of
12056 the two unions.
12057 We can assert the later [but only at run time :-(] */
12058 assert ((void *) &ncx->blk_loop.state_u.ary.ary ==
12059 (void *) &ncx->blk_loop.state_u.lazysv.cur);
3b719c58 12060 case CXt_LOOP_FOR:
d01136d6
BS
12061 ncx->blk_loop.state_u.ary.ary
12062 = av_dup_inc(ncx->blk_loop.state_u.ary.ary, param);
12063 case CXt_LOOP_LAZYIV:
3b719c58 12064 case CXt_LOOP_PLAIN:
e846cb92 12065 if (CxPADLOOP(ncx)) {
df530c37 12066 ncx->blk_loop.itervar_u.oldcomppad
e846cb92 12067 = (PAD*)ptr_table_fetch(PL_ptr_table,
df530c37 12068 ncx->blk_loop.itervar_u.oldcomppad);
e846cb92 12069 } else {
df530c37
DM
12070 ncx->blk_loop.itervar_u.gv
12071 = gv_dup((const GV *)ncx->blk_loop.itervar_u.gv,
12072 param);
e846cb92 12073 }
1d7c1841
GS
12074 break;
12075 case CXt_FORMAT:
f9c764c5
NC
12076 ncx->blk_format.cv = cv_dup(ncx->blk_format.cv, param);
12077 ncx->blk_format.gv = gv_dup(ncx->blk_format.gv, param);
12078 ncx->blk_format.dfoutgv = gv_dup_inc(ncx->blk_format.dfoutgv,
c2d565bf 12079 param);
1d7c1841
GS
12080 break;
12081 case CXt_BLOCK:
12082 case CXt_NULL:
12083 break;
12084 }
12085 }
12086 --ix;
12087 }
12088 return ncxs;
12089}
12090
645c22ef
DM
12091/* duplicate a stack info structure */
12092
1d7c1841 12093PERL_SI *
a8fc9800 12094Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
1d7c1841
GS
12095{
12096 PERL_SI *nsi;
12097
7918f24d
NC
12098 PERL_ARGS_ASSERT_SI_DUP;
12099
1d7c1841
GS
12100 if (!si)
12101 return (PERL_SI*)NULL;
12102
12103 /* look for it in the table first */
12104 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
12105 if (nsi)
12106 return nsi;
12107
12108 /* create anew and remember what it is */
a02a5408 12109 Newxz(nsi, 1, PERL_SI);
1d7c1841
GS
12110 ptr_table_store(PL_ptr_table, si, nsi);
12111
d2d73c3e 12112 nsi->si_stack = av_dup_inc(si->si_stack, param);
1d7c1841
GS
12113 nsi->si_cxix = si->si_cxix;
12114 nsi->si_cxmax = si->si_cxmax;
d2d73c3e 12115 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
1d7c1841 12116 nsi->si_type = si->si_type;
d2d73c3e
AB
12117 nsi->si_prev = si_dup(si->si_prev, param);
12118 nsi->si_next = si_dup(si->si_next, param);
1d7c1841
GS
12119 nsi->si_markoff = si->si_markoff;
12120
12121 return nsi;
12122}
12123
12124#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
12125#define TOPINT(ss,ix) ((ss)[ix].any_i32)
12126#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
12127#define TOPLONG(ss,ix) ((ss)[ix].any_long)
12128#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
12129#define TOPIV(ss,ix) ((ss)[ix].any_iv)
c6bf6a65
NC
12130#define POPUV(ss,ix) ((ss)[--(ix)].any_uv)
12131#define TOPUV(ss,ix) ((ss)[ix].any_uv)
38d8b13e
HS
12132#define POPBOOL(ss,ix) ((ss)[--(ix)].any_bool)
12133#define TOPBOOL(ss,ix) ((ss)[ix].any_bool)
1d7c1841
GS
12134#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
12135#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
12136#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
12137#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
12138#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
12139#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
12140
12141/* XXXXX todo */
12142#define pv_dup_inc(p) SAVEPV(p)
12143#define pv_dup(p) SAVEPV(p)
12144#define svp_dup_inc(p,pp) any_dup(p,pp)
12145
645c22ef
DM
12146/* map any object to the new equivent - either something in the
12147 * ptr table, or something in the interpreter structure
12148 */
12149
1d7c1841 12150void *
53c1dcc0 12151Perl_any_dup(pTHX_ void *v, const PerlInterpreter *proto_perl)
1d7c1841
GS
12152{
12153 void *ret;
12154
7918f24d
NC
12155 PERL_ARGS_ASSERT_ANY_DUP;
12156
1d7c1841
GS
12157 if (!v)
12158 return (void*)NULL;
12159
12160 /* look for it in the table first */
12161 ret = ptr_table_fetch(PL_ptr_table, v);
12162 if (ret)
12163 return ret;
12164
12165 /* see if it is part of the interpreter structure */
12166 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
acfe0abc 12167 ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
05ec9bb3 12168 else {
1d7c1841 12169 ret = v;
05ec9bb3 12170 }
1d7c1841
GS
12171
12172 return ret;
12173}
12174
645c22ef
DM
12175/* duplicate the save stack */
12176
1d7c1841 12177ANY *
a8fc9800 12178Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
1d7c1841 12179{
53d44271 12180 dVAR;
907b3e23
DM
12181 ANY * const ss = proto_perl->Isavestack;
12182 const I32 max = proto_perl->Isavestack_max;
12183 I32 ix = proto_perl->Isavestack_ix;
1d7c1841 12184 ANY *nss;
daba3364 12185 const SV *sv;
1d193675
NC
12186 const GV *gv;
12187 const AV *av;
12188 const HV *hv;
1d7c1841
GS
12189 void* ptr;
12190 int intval;
12191 long longval;
12192 GP *gp;
12193 IV iv;
b24356f5 12194 I32 i;
c4e33207 12195 char *c = NULL;
1d7c1841 12196 void (*dptr) (void*);
acfe0abc 12197 void (*dxptr) (pTHX_ void*);
1d7c1841 12198
7918f24d
NC
12199 PERL_ARGS_ASSERT_SS_DUP;
12200
a02a5408 12201 Newxz(nss, max, ANY);
1d7c1841
GS
12202
12203 while (ix > 0) {
c6bf6a65
NC
12204 const UV uv = POPUV(ss,ix);
12205 const U8 type = (U8)uv & SAVE_MASK;
12206
12207 TOPUV(nss,ix) = uv;
b24356f5 12208 switch (type) {
cdcdfc56
NC
12209 case SAVEt_CLEARSV:
12210 break;
3e07292d 12211 case SAVEt_HELEM: /* hash element */
daba3364 12212 sv = (const SV *)POPPTR(ss,ix);
3e07292d
NC
12213 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
12214 /* fall through */
1d7c1841 12215 case SAVEt_ITEM: /* normal string */
0d1db40e 12216 case SAVEt_GVSV: /* scalar slot in GV */
a41cc44e 12217 case SAVEt_SV: /* scalar reference */
daba3364 12218 sv = (const SV *)POPPTR(ss,ix);
d2d73c3e 12219 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
3e07292d
NC
12220 /* fall through */
12221 case SAVEt_FREESV:
12222 case SAVEt_MORTALIZESV:
daba3364 12223 sv = (const SV *)POPPTR(ss,ix);
d2d73c3e 12224 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 12225 break;
05ec9bb3
NIS
12226 case SAVEt_SHARED_PVREF: /* char* in shared space */
12227 c = (char*)POPPTR(ss,ix);
12228 TOPPTR(nss,ix) = savesharedpv(c);
12229 ptr = POPPTR(ss,ix);
12230 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12231 break;
1d7c1841
GS
12232 case SAVEt_GENERIC_SVREF: /* generic sv */
12233 case SAVEt_SVREF: /* scalar reference */
daba3364 12234 sv = (const SV *)POPPTR(ss,ix);
d2d73c3e 12235 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
12236 ptr = POPPTR(ss,ix);
12237 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
12238 break;
a41cc44e 12239 case SAVEt_HV: /* hash reference */
1d7c1841 12240 case SAVEt_AV: /* array reference */
daba3364 12241 sv = (const SV *) POPPTR(ss,ix);
337d28f5 12242 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
3e07292d
NC
12243 /* fall through */
12244 case SAVEt_COMPPAD:
12245 case SAVEt_NSTAB:
daba3364 12246 sv = (const SV *) POPPTR(ss,ix);
3e07292d 12247 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
12248 break;
12249 case SAVEt_INT: /* int reference */
12250 ptr = POPPTR(ss,ix);
12251 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12252 intval = (int)POPINT(ss,ix);
12253 TOPINT(nss,ix) = intval;
12254 break;
12255 case SAVEt_LONG: /* long reference */
12256 ptr = POPPTR(ss,ix);
12257 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12258 longval = (long)POPLONG(ss,ix);
12259 TOPLONG(nss,ix) = longval;
12260 break;
12261 case SAVEt_I32: /* I32 reference */
88effcc9 12262 case SAVEt_COP_ARYBASE: /* call CopARYBASE_set */
1d7c1841
GS
12263 ptr = POPPTR(ss,ix);
12264 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
1ccabee8 12265 i = POPINT(ss,ix);
1d7c1841
GS
12266 TOPINT(nss,ix) = i;
12267 break;
12268 case SAVEt_IV: /* IV reference */
12269 ptr = POPPTR(ss,ix);
12270 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12271 iv = POPIV(ss,ix);
12272 TOPIV(nss,ix) = iv;
12273 break;
a41cc44e
NC
12274 case SAVEt_HPTR: /* HV* reference */
12275 case SAVEt_APTR: /* AV* reference */
1d7c1841
GS
12276 case SAVEt_SPTR: /* SV* reference */
12277 ptr = POPPTR(ss,ix);
12278 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
daba3364 12279 sv = (const SV *)POPPTR(ss,ix);
d2d73c3e 12280 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
12281 break;
12282 case SAVEt_VPTR: /* random* reference */
12283 ptr = POPPTR(ss,ix);
12284 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
65504245 12285 /* Fall through */
994d373a 12286 case SAVEt_INT_SMALL:
89abef21 12287 case SAVEt_I32_SMALL:
c9441fce 12288 case SAVEt_I16: /* I16 reference */
6c61c2d4 12289 case SAVEt_I8: /* I8 reference */
65504245 12290 case SAVEt_BOOL:
1d7c1841
GS
12291 ptr = POPPTR(ss,ix);
12292 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12293 break;
b03d03b0 12294 case SAVEt_GENERIC_PVREF: /* generic char* */
1d7c1841
GS
12295 case SAVEt_PPTR: /* char* reference */
12296 ptr = POPPTR(ss,ix);
12297 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
12298 c = (char*)POPPTR(ss,ix);
12299 TOPPTR(nss,ix) = pv_dup(c);
12300 break;
1d7c1841
GS
12301 case SAVEt_GP: /* scalar reference */
12302 gp = (GP*)POPPTR(ss,ix);
d2d73c3e 12303 TOPPTR(nss,ix) = gp = gp_dup(gp, param);
1d7c1841 12304 (void)GpREFCNT_inc(gp);
10507e11
FC
12305 gv = (const GV *)POPPTR(ss,ix);
12306 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
b9e00b79 12307 break;
1d7c1841
GS
12308 case SAVEt_FREEOP:
12309 ptr = POPPTR(ss,ix);
12310 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
12311 /* these are assumed to be refcounted properly */
53c1dcc0 12312 OP *o;
1d7c1841
GS
12313 switch (((OP*)ptr)->op_type) {
12314 case OP_LEAVESUB:
12315 case OP_LEAVESUBLV:
12316 case OP_LEAVEEVAL:
12317 case OP_LEAVE:
12318 case OP_SCOPE:
12319 case OP_LEAVEWRITE:
e977893f
GS
12320 TOPPTR(nss,ix) = ptr;
12321 o = (OP*)ptr;
d3c72c2a 12322 OP_REFCNT_LOCK;
594cd643 12323 (void) OpREFCNT_inc(o);
d3c72c2a 12324 OP_REFCNT_UNLOCK;
1d7c1841
GS
12325 break;
12326 default:
5f66b61c 12327 TOPPTR(nss,ix) = NULL;
1d7c1841
GS
12328 break;
12329 }
12330 }
12331 else
5f66b61c 12332 TOPPTR(nss,ix) = NULL;
1d7c1841 12333 break;
3987a177
Z
12334 case SAVEt_FREECOPHH:
12335 ptr = POPPTR(ss,ix);
12336 TOPPTR(nss,ix) = cophh_copy((COPHH *)ptr);
12337 break;
1d7c1841 12338 case SAVEt_DELETE:
1d193675 12339 hv = (const HV *)POPPTR(ss,ix);
d2d73c3e 12340 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
35d4f826
NC
12341 i = POPINT(ss,ix);
12342 TOPINT(nss,ix) = i;
8e41545f
NC
12343 /* Fall through */
12344 case SAVEt_FREEPV:
1d7c1841
GS
12345 c = (char*)POPPTR(ss,ix);
12346 TOPPTR(nss,ix) = pv_dup_inc(c);
35d4f826 12347 break;
3e07292d 12348 case SAVEt_STACK_POS: /* Position on Perl stack */
1d7c1841
GS
12349 i = POPINT(ss,ix);
12350 TOPINT(nss,ix) = i;
12351 break;
12352 case SAVEt_DESTRUCTOR:
12353 ptr = POPPTR(ss,ix);
12354 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
12355 dptr = POPDPTR(ss,ix);
8141890a
JH
12356 TOPDPTR(nss,ix) = DPTR2FPTR(void (*)(void*),
12357 any_dup(FPTR2DPTR(void *, dptr),
12358 proto_perl));
1d7c1841
GS
12359 break;
12360 case SAVEt_DESTRUCTOR_X:
12361 ptr = POPPTR(ss,ix);
12362 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
12363 dxptr = POPDXPTR(ss,ix);
8141890a
JH
12364 TOPDXPTR(nss,ix) = DPTR2FPTR(void (*)(pTHX_ void*),
12365 any_dup(FPTR2DPTR(void *, dxptr),
12366 proto_perl));
1d7c1841
GS
12367 break;
12368 case SAVEt_REGCONTEXT:
12369 case SAVEt_ALLOC:
1be36ce0 12370 ix -= uv >> SAVE_TIGHT_SHIFT;
1d7c1841 12371 break;
1d7c1841 12372 case SAVEt_AELEM: /* array element */
daba3364 12373 sv = (const SV *)POPPTR(ss,ix);
d2d73c3e 12374 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
12375 i = POPINT(ss,ix);
12376 TOPINT(nss,ix) = i;
502c6561 12377 av = (const AV *)POPPTR(ss,ix);
d2d73c3e 12378 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841 12379 break;
1d7c1841
GS
12380 case SAVEt_OP:
12381 ptr = POPPTR(ss,ix);
12382 TOPPTR(nss,ix) = ptr;
12383 break;
12384 case SAVEt_HINTS:
b3ca2e83 12385 ptr = POPPTR(ss,ix);
20439bc7 12386 ptr = cophh_copy((COPHH*)ptr);
cbb1fbea 12387 TOPPTR(nss,ix) = ptr;
601cee3b
NC
12388 i = POPINT(ss,ix);
12389 TOPINT(nss,ix) = i;
a8f8b6a7 12390 if (i & HINT_LOCALIZE_HH) {
1d193675 12391 hv = (const HV *)POPPTR(ss,ix);
a8f8b6a7
NC
12392 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
12393 }
1d7c1841 12394 break;
09edbca0 12395 case SAVEt_PADSV_AND_MORTALIZE:
c3564e5c
GS
12396 longval = (long)POPLONG(ss,ix);
12397 TOPLONG(nss,ix) = longval;
12398 ptr = POPPTR(ss,ix);
12399 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
daba3364 12400 sv = (const SV *)POPPTR(ss,ix);
09edbca0 12401 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
c3564e5c 12402 break;
8bd2680e
MHM
12403 case SAVEt_SET_SVFLAGS:
12404 i = POPINT(ss,ix);
12405 TOPINT(nss,ix) = i;
12406 i = POPINT(ss,ix);
12407 TOPINT(nss,ix) = i;
daba3364 12408 sv = (const SV *)POPPTR(ss,ix);
8bd2680e
MHM
12409 TOPPTR(nss,ix) = sv_dup(sv, param);
12410 break;
5bfb7d0e
NC
12411 case SAVEt_RE_STATE:
12412 {
12413 const struct re_save_state *const old_state
12414 = (struct re_save_state *)
12415 (ss + ix - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
12416 struct re_save_state *const new_state
12417 = (struct re_save_state *)
12418 (nss + ix - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
12419
12420 Copy(old_state, new_state, 1, struct re_save_state);
12421 ix -= SAVESTACK_ALLOC_FOR_RE_SAVE_STATE;
12422
12423 new_state->re_state_bostr
12424 = pv_dup(old_state->re_state_bostr);
12425 new_state->re_state_reginput
12426 = pv_dup(old_state->re_state_reginput);
5bfb7d0e
NC
12427 new_state->re_state_regeol
12428 = pv_dup(old_state->re_state_regeol);
f0ab9afb
NC
12429 new_state->re_state_regoffs
12430 = (regexp_paren_pair*)
12431 any_dup(old_state->re_state_regoffs, proto_perl);
5bfb7d0e 12432 new_state->re_state_reglastparen
11b79775
DD
12433 = (U32*) any_dup(old_state->re_state_reglastparen,
12434 proto_perl);
5bfb7d0e 12435 new_state->re_state_reglastcloseparen
11b79775 12436 = (U32*)any_dup(old_state->re_state_reglastcloseparen,
5bfb7d0e 12437 proto_perl);
5bfb7d0e
NC
12438 /* XXX This just has to be broken. The old save_re_context
12439 code did SAVEGENERICPV(PL_reg_start_tmp);
12440 PL_reg_start_tmp is char **.
12441 Look above to what the dup code does for
12442 SAVEt_GENERIC_PVREF
12443 It can never have worked.
12444 So this is merely a faithful copy of the exiting bug: */
12445 new_state->re_state_reg_start_tmp
12446 = (char **) pv_dup((char *)
12447 old_state->re_state_reg_start_tmp);
12448 /* I assume that it only ever "worked" because no-one called
12449 (pseudo)fork while the regexp engine had re-entered itself.
12450 */
5bfb7d0e
NC
12451#ifdef PERL_OLD_COPY_ON_WRITE
12452 new_state->re_state_nrs
12453 = sv_dup(old_state->re_state_nrs, param);
12454#endif
12455 new_state->re_state_reg_magic
11b79775
DD
12456 = (MAGIC*) any_dup(old_state->re_state_reg_magic,
12457 proto_perl);
5bfb7d0e 12458 new_state->re_state_reg_oldcurpm
11b79775
DD
12459 = (PMOP*) any_dup(old_state->re_state_reg_oldcurpm,
12460 proto_perl);
5bfb7d0e 12461 new_state->re_state_reg_curpm
11b79775
DD
12462 = (PMOP*) any_dup(old_state->re_state_reg_curpm,
12463 proto_perl);
5bfb7d0e
NC
12464 new_state->re_state_reg_oldsaved
12465 = pv_dup(old_state->re_state_reg_oldsaved);
12466 new_state->re_state_reg_poscache
12467 = pv_dup(old_state->re_state_reg_poscache);
5bfb7d0e
NC
12468 new_state->re_state_reg_starttry
12469 = pv_dup(old_state->re_state_reg_starttry);
5bfb7d0e
NC
12470 break;
12471 }
68da3b2f
NC
12472 case SAVEt_COMPILE_WARNINGS:
12473 ptr = POPPTR(ss,ix);
12474 TOPPTR(nss,ix) = DUP_WARNINGS((STRLEN*)ptr);
7b6dd8c3 12475 break;
7c197c94
DM
12476 case SAVEt_PARSER:
12477 ptr = POPPTR(ss,ix);
456084a8 12478 TOPPTR(nss,ix) = parser_dup((const yy_parser*)ptr, param);
7c197c94 12479 break;
1d7c1841 12480 default:
147bc374
NC
12481 Perl_croak(aTHX_
12482 "panic: ss_dup inconsistency (%"IVdf")", (IV) type);
1d7c1841
GS
12483 }
12484 }
12485
bd81e77b
NC
12486 return nss;
12487}
12488
12489
12490/* if sv is a stash, call $class->CLONE_SKIP(), and set the SVphv_CLONEABLE
12491 * flag to the result. This is done for each stash before cloning starts,
12492 * so we know which stashes want their objects cloned */
12493
12494static void
f30de749 12495do_mark_cloneable_stash(pTHX_ SV *const sv)
bd81e77b 12496{
1d193675 12497 const HEK * const hvname = HvNAME_HEK((const HV *)sv);
bd81e77b 12498 if (hvname) {
85fbaab2 12499 GV* const cloner = gv_fetchmethod_autoload(MUTABLE_HV(sv), "CLONE_SKIP", 0);
bd81e77b
NC
12500 SvFLAGS(sv) |= SVphv_CLONEABLE; /* clone objects by default */
12501 if (cloner && GvCV(cloner)) {
12502 dSP;
12503 UV status;
12504
12505 ENTER;
12506 SAVETMPS;
12507 PUSHMARK(SP);
6e449a3a 12508 mXPUSHs(newSVhek(hvname));
bd81e77b 12509 PUTBACK;
daba3364 12510 call_sv(MUTABLE_SV(GvCV(cloner)), G_SCALAR);
bd81e77b
NC
12511 SPAGAIN;
12512 status = POPu;
12513 PUTBACK;
12514 FREETMPS;
12515 LEAVE;
12516 if (status)
12517 SvFLAGS(sv) &= ~SVphv_CLONEABLE;
12518 }
12519 }
12520}
12521
12522
12523
12524/*
12525=for apidoc perl_clone
12526
12527Create and return a new interpreter by cloning the current one.
12528
12529perl_clone takes these flags as parameters:
12530
12531CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
12532without it we only clone the data and zero the stacks,
12533with it we copy the stacks and the new perl interpreter is
12534ready to run at the exact same point as the previous one.
12535The pseudo-fork code uses COPY_STACKS while the
878090d5 12536threads->create doesn't.
bd81e77b
NC
12537
12538CLONEf_KEEP_PTR_TABLE
12539perl_clone keeps a ptr_table with the pointer of the old
12540variable as a key and the new variable as a value,
12541this allows it to check if something has been cloned and not
12542clone it again but rather just use the value and increase the
12543refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
12544the ptr_table using the function
12545C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
12546reason to keep it around is if you want to dup some of your own
12547variable who are outside the graph perl scans, example of this
12548code is in threads.xs create
12549
12550CLONEf_CLONE_HOST
12551This is a win32 thing, it is ignored on unix, it tells perls
12552win32host code (which is c++) to clone itself, this is needed on
12553win32 if you want to run two threads at the same time,
12554if you just want to do some stuff in a separate perl interpreter
12555and then throw it away and return to the original one,
12556you don't need to do anything.
12557
12558=cut
12559*/
12560
12561/* XXX the above needs expanding by someone who actually understands it ! */
12562EXTERN_C PerlInterpreter *
12563perl_clone_host(PerlInterpreter* proto_perl, UV flags);
12564
12565PerlInterpreter *
12566perl_clone(PerlInterpreter *proto_perl, UV flags)
12567{
12568 dVAR;
12569#ifdef PERL_IMPLICIT_SYS
12570
7918f24d
NC
12571 PERL_ARGS_ASSERT_PERL_CLONE;
12572
bd81e77b
NC
12573 /* perlhost.h so we need to call into it
12574 to clone the host, CPerlHost should have a c interface, sky */
12575
12576 if (flags & CLONEf_CLONE_HOST) {
12577 return perl_clone_host(proto_perl,flags);
12578 }
12579 return perl_clone_using(proto_perl, flags,
12580 proto_perl->IMem,
12581 proto_perl->IMemShared,
12582 proto_perl->IMemParse,
12583 proto_perl->IEnv,
12584 proto_perl->IStdIO,
12585 proto_perl->ILIO,
12586 proto_perl->IDir,
12587 proto_perl->ISock,
12588 proto_perl->IProc);
12589}
12590
12591PerlInterpreter *
12592perl_clone_using(PerlInterpreter *proto_perl, UV flags,
12593 struct IPerlMem* ipM, struct IPerlMem* ipMS,
12594 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
12595 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
12596 struct IPerlDir* ipD, struct IPerlSock* ipS,
12597 struct IPerlProc* ipP)
12598{
12599 /* XXX many of the string copies here can be optimized if they're
12600 * constants; they need to be allocated as common memory and just
12601 * their pointers copied. */
12602
12603 IV i;
12604 CLONE_PARAMS clone_params;
5f66b61c 12605 CLONE_PARAMS* const param = &clone_params;
bd81e77b 12606
5f66b61c 12607 PerlInterpreter * const my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
7918f24d
NC
12608
12609 PERL_ARGS_ASSERT_PERL_CLONE_USING;
bd81e77b
NC
12610#else /* !PERL_IMPLICIT_SYS */
12611 IV i;
12612 CLONE_PARAMS clone_params;
12613 CLONE_PARAMS* param = &clone_params;
5f66b61c 12614 PerlInterpreter * const my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
7918f24d
NC
12615
12616 PERL_ARGS_ASSERT_PERL_CLONE;
b59cce4c 12617#endif /* PERL_IMPLICIT_SYS */
7918f24d 12618
bd81e77b
NC
12619 /* for each stash, determine whether its objects should be cloned */
12620 S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
12621 PERL_SET_THX(my_perl);
12622
b59cce4c 12623#ifdef DEBUGGING
7e337ee0 12624 PoisonNew(my_perl, 1, PerlInterpreter);
5f66b61c
AL
12625 PL_op = NULL;
12626 PL_curcop = NULL;
bd81e77b
NC
12627 PL_markstack = 0;
12628 PL_scopestack = 0;
cbdd5331 12629 PL_scopestack_name = 0;
bd81e77b
NC
12630 PL_savestack = 0;
12631 PL_savestack_ix = 0;
12632 PL_savestack_max = -1;
12633 PL_sig_pending = 0;
b8328dae 12634 PL_parser = NULL;
bd81e77b 12635 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
02d9cd5e 12636# ifdef DEBUG_LEAKING_SCALARS
c895a371 12637 PL_sv_serial = (((UV)my_perl >> 2) & 0xfff) * 1000000;
02d9cd5e 12638# endif
b59cce4c 12639#else /* !DEBUGGING */
bd81e77b 12640 Zero(my_perl, 1, PerlInterpreter);
b59cce4c 12641#endif /* DEBUGGING */
742421a6
DM
12642
12643#ifdef PERL_IMPLICIT_SYS
12644 /* host pointers */
12645 PL_Mem = ipM;
12646 PL_MemShared = ipMS;
12647 PL_MemParse = ipMP;
12648 PL_Env = ipE;
12649 PL_StdIO = ipStd;
12650 PL_LIO = ipLIO;
12651 PL_Dir = ipD;
12652 PL_Sock = ipS;
12653 PL_Proc = ipP;
12654#endif /* PERL_IMPLICIT_SYS */
12655
bd81e77b 12656 param->flags = flags;
f7abe70b
NC
12657 /* Nothing in the core code uses this, but we make it available to
12658 extensions (using mg_dup). */
bd81e77b 12659 param->proto_perl = proto_perl;
f7abe70b
NC
12660 /* Likely nothing will use this, but it is initialised to be consistent
12661 with Perl_clone_params_new(). */
ec2fb142 12662 param->new_perl = my_perl;
d08d57ef 12663 param->unreferenced = NULL;
bd81e77b 12664
7cb608b5
NC
12665 INIT_TRACK_MEMPOOL(my_perl->Imemory_debug_header, my_perl);
12666
fdda85ca 12667 PL_body_arenas = NULL;
bd81e77b
NC
12668 Zero(&PL_body_roots, 1, PL_body_roots);
12669
bd81e77b
NC
12670 PL_sv_count = 0;
12671 PL_sv_objcount = 0;
a0714e2c
SS
12672 PL_sv_root = NULL;
12673 PL_sv_arenaroot = NULL;
bd81e77b
NC
12674
12675 PL_debug = proto_perl->Idebug;
12676
12677 PL_hash_seed = proto_perl->Ihash_seed;
12678 PL_rehash_seed = proto_perl->Irehash_seed;
12679
12680#ifdef USE_REENTRANT_API
12681 /* XXX: things like -Dm will segfault here in perlio, but doing
12682 * PERL_SET_CONTEXT(proto_perl);
12683 * breaks too many other things
12684 */
12685 Perl_reentrant_init(aTHX);
12686#endif
12687
12688 /* create SV map for pointer relocation */
12689 PL_ptr_table = ptr_table_new();
12690
12691 /* initialize these special pointers as early as possible */
12692 SvANY(&PL_sv_undef) = NULL;
12693 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
12694 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
12695 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
12696
12697 SvANY(&PL_sv_no) = new_XPVNV();
12698 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
12699 SvFLAGS(&PL_sv_no) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
12700 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
bb7a0f54 12701 SvPV_set(&PL_sv_no, savepvn(PL_No, 0));
bd81e77b
NC
12702 SvCUR_set(&PL_sv_no, 0);
12703 SvLEN_set(&PL_sv_no, 1);
12704 SvIV_set(&PL_sv_no, 0);
12705 SvNV_set(&PL_sv_no, 0);
12706 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
12707
12708 SvANY(&PL_sv_yes) = new_XPVNV();
12709 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
12710 SvFLAGS(&PL_sv_yes) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
12711 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
bb7a0f54 12712 SvPV_set(&PL_sv_yes, savepvn(PL_Yes, 1));
bd81e77b
NC
12713 SvCUR_set(&PL_sv_yes, 1);
12714 SvLEN_set(&PL_sv_yes, 2);
12715 SvIV_set(&PL_sv_yes, 1);
12716 SvNV_set(&PL_sv_yes, 1);
12717 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
12718
a1f97a07
DM
12719 /* dbargs array probably holds garbage */
12720 PL_dbargs = NULL;
7fa38291 12721
bd81e77b
NC
12722 /* create (a non-shared!) shared string table */
12723 PL_strtab = newHV();
12724 HvSHAREKEYS_off(PL_strtab);
12725 hv_ksplit(PL_strtab, HvTOTALKEYS(proto_perl->Istrtab));
12726 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
12727
12728 PL_compiling = proto_perl->Icompiling;
12729
12730 /* These two PVs will be free'd special way so must set them same way op.c does */
12731 PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
12732 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
12733
12734 PL_compiling.cop_file = savesharedpv(PL_compiling.cop_file);
12735 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
12736
12737 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
72dc9ed5 12738 PL_compiling.cop_warnings = DUP_WARNINGS(PL_compiling.cop_warnings);
20439bc7 12739 CopHINTHASH_set(&PL_compiling, cophh_copy(CopHINTHASH_get(&PL_compiling)));
907b3e23 12740 PL_curcop = (COP*)any_dup(proto_perl->Icurcop, proto_perl);
5892a4d4
NC
12741#ifdef PERL_DEBUG_READONLY_OPS
12742 PL_slabs = NULL;
12743 PL_slab_count = 0;
12744#endif
bd81e77b
NC
12745
12746 /* pseudo environmental stuff */
12747 PL_origargc = proto_perl->Iorigargc;
12748 PL_origargv = proto_perl->Iorigargv;
12749
12750 param->stashes = newAV(); /* Setup array of objects to call clone on */
842c4123
NC
12751 /* This makes no difference to the implementation, as it always pushes
12752 and shifts pointers to other SVs without changing their reference
12753 count, with the array becoming empty before it is freed. However, it
12754 makes it conceptually clear what is going on, and will avoid some
12755 work inside av.c, filling slots between AvFILL() and AvMAX() with
12756 &PL_sv_undef, and SvREFCNT_dec()ing those. */
12757 AvREAL_off(param->stashes);
bd81e77b 12758
d08d57ef
NC
12759 if (!(flags & CLONEf_COPY_STACKS)) {
12760 param->unreferenced = newAV();
d08d57ef
NC
12761 }
12762
bd81e77b
NC
12763 /* Set tainting stuff before PerlIO_debug can possibly get called */
12764 PL_tainting = proto_perl->Itainting;
12765 PL_taint_warn = proto_perl->Itaint_warn;
12766
12767#ifdef PERLIO_LAYERS
12768 /* Clone PerlIO tables as soon as we can handle general xx_dup() */
12769 PerlIO_clone(aTHX_ proto_perl, param);
12770#endif
12771
12772 PL_envgv = gv_dup(proto_perl->Ienvgv, param);
12773 PL_incgv = gv_dup(proto_perl->Iincgv, param);
12774 PL_hintgv = gv_dup(proto_perl->Ihintgv, param);
12775 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
12776 PL_diehook = sv_dup_inc(proto_perl->Idiehook, param);
12777 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param);
12778
12779 /* switches */
12780 PL_minus_c = proto_perl->Iminus_c;
12781 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel, param);
1e8125c6 12782 PL_apiversion = sv_dup_inc(proto_perl->Iapiversion, param);
bd81e77b
NC
12783 PL_localpatches = proto_perl->Ilocalpatches;
12784 PL_splitstr = proto_perl->Isplitstr;
bd81e77b
NC
12785 PL_minus_n = proto_perl->Iminus_n;
12786 PL_minus_p = proto_perl->Iminus_p;
12787 PL_minus_l = proto_perl->Iminus_l;
12788 PL_minus_a = proto_perl->Iminus_a;
bc9b29db 12789 PL_minus_E = proto_perl->Iminus_E;
bd81e77b
NC
12790 PL_minus_F = proto_perl->Iminus_F;
12791 PL_doswitches = proto_perl->Idoswitches;
12792 PL_dowarn = proto_perl->Idowarn;
bd81e77b
NC
12793 PL_sawampersand = proto_perl->Isawampersand;
12794 PL_unsafe = proto_perl->Iunsafe;
12795 PL_inplace = SAVEPV(proto_perl->Iinplace);
12796 PL_e_script = sv_dup_inc(proto_perl->Ie_script, param);
12797 PL_perldb = proto_perl->Iperldb;
12798 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
12799 PL_exit_flags = proto_perl->Iexit_flags;
12800
12801 /* magical thingies */
12802 /* XXX time(&PL_basetime) when asked for? */
12803 PL_basetime = proto_perl->Ibasetime;
12804 PL_formfeed = sv_dup(proto_perl->Iformfeed, param);
12805
12806 PL_maxsysfd = proto_perl->Imaxsysfd;
bd81e77b
NC
12807 PL_statusvalue = proto_perl->Istatusvalue;
12808#ifdef VMS
12809 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
12810#else
12811 PL_statusvalue_posix = proto_perl->Istatusvalue_posix;
12812#endif
12813 PL_encoding = sv_dup(proto_perl->Iencoding, param);
12814
76f68e9b
MHM
12815 sv_setpvs(PERL_DEBUG_PAD(0), ""); /* For regex debugging. */
12816 sv_setpvs(PERL_DEBUG_PAD(1), ""); /* ext/re needs these */
12817 sv_setpvs(PERL_DEBUG_PAD(2), ""); /* even without DEBUGGING. */
bd81e77b 12818
84da74a7 12819
f9f4320a 12820 /* RE engine related */
84da74a7
YO
12821 Zero(&PL_reg_state, 1, struct re_save_state);
12822 PL_reginterp_cnt = 0;
12823 PL_regmatch_slab = NULL;
12824
bd81e77b 12825 /* Clone the regex array */
937c6efd
NC
12826 /* ORANGE FIXME for plugins, probably in the SV dup code.
12827 newSViv(PTR2IV(CALLREGDUPE(
12828 INT2PTR(REGEXP *, SvIVX(regex)), param))))
12829 */
12830 PL_regex_padav = av_dup_inc(proto_perl->Iregex_padav, param);
bd81e77b
NC
12831 PL_regex_pad = AvARRAY(PL_regex_padav);
12832
12833 /* shortcuts to various I/O objects */
b2ea9a00 12834 PL_ofsgv = gv_dup_inc(proto_perl->Iofsgv, param);
bd81e77b
NC
12835 PL_stdingv = gv_dup(proto_perl->Istdingv, param);
12836 PL_stderrgv = gv_dup(proto_perl->Istderrgv, param);
12837 PL_defgv = gv_dup(proto_perl->Idefgv, param);
12838 PL_argvgv = gv_dup(proto_perl->Iargvgv, param);
12839 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv, param);
12840 PL_argvout_stack = av_dup_inc(proto_perl->Iargvout_stack, param);
1d7c1841 12841
bd81e77b
NC
12842 /* shortcuts to regexp stuff */
12843 PL_replgv = gv_dup(proto_perl->Ireplgv, param);
9660f481 12844
bd81e77b
NC
12845 /* shortcuts to misc objects */
12846 PL_errgv = gv_dup(proto_perl->Ierrgv, param);
9660f481 12847
bd81e77b
NC
12848 /* shortcuts to debugging objects */
12849 PL_DBgv = gv_dup(proto_perl->IDBgv, param);
12850 PL_DBline = gv_dup(proto_perl->IDBline, param);
12851 PL_DBsub = gv_dup(proto_perl->IDBsub, param);
12852 PL_DBsingle = sv_dup(proto_perl->IDBsingle, param);
12853 PL_DBtrace = sv_dup(proto_perl->IDBtrace, param);
12854 PL_DBsignal = sv_dup(proto_perl->IDBsignal, param);
9660f481 12855
bd81e77b 12856 /* symbol tables */
907b3e23
DM
12857 PL_defstash = hv_dup_inc(proto_perl->Idefstash, param);
12858 PL_curstash = hv_dup(proto_perl->Icurstash, param);
bd81e77b
NC
12859 PL_debstash = hv_dup(proto_perl->Idebstash, param);
12860 PL_globalstash = hv_dup(proto_perl->Iglobalstash, param);
12861 PL_curstname = sv_dup_inc(proto_perl->Icurstname, param);
12862
12863 PL_beginav = av_dup_inc(proto_perl->Ibeginav, param);
12864 PL_beginav_save = av_dup_inc(proto_perl->Ibeginav_save, param);
12865 PL_checkav_save = av_dup_inc(proto_perl->Icheckav_save, param);
3c10abe3
AG
12866 PL_unitcheckav = av_dup_inc(proto_perl->Iunitcheckav, param);
12867 PL_unitcheckav_save = av_dup_inc(proto_perl->Iunitcheckav_save, param);
bd81e77b
NC
12868 PL_endav = av_dup_inc(proto_perl->Iendav, param);
12869 PL_checkav = av_dup_inc(proto_perl->Icheckav, param);
12870 PL_initav = av_dup_inc(proto_perl->Iinitav, param);
12871
12872 PL_sub_generation = proto_perl->Isub_generation;
dd69841b 12873 PL_isarev = hv_dup_inc(proto_perl->Iisarev, param);
bd81e77b
NC
12874
12875 /* funky return mechanisms */
12876 PL_forkprocess = proto_perl->Iforkprocess;
12877
12878 /* subprocess state */
12879 PL_fdpid = av_dup_inc(proto_perl->Ifdpid, param);
12880
12881 /* internal state */
12882 PL_maxo = proto_perl->Imaxo;
12883 if (proto_perl->Iop_mask)
12884 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
12885 else
bd61b366 12886 PL_op_mask = NULL;
bd81e77b
NC
12887 /* PL_asserting = proto_perl->Iasserting; */
12888
12889 /* current interpreter roots */
12890 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv, param);
d3c72c2a 12891 OP_REFCNT_LOCK;
bd81e77b 12892 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
d3c72c2a 12893 OP_REFCNT_UNLOCK;
bd81e77b
NC
12894 PL_main_start = proto_perl->Imain_start;
12895 PL_eval_root = proto_perl->Ieval_root;
12896 PL_eval_start = proto_perl->Ieval_start;
12897
12898 /* runtime control stuff */
12899 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
bd81e77b
NC
12900
12901 PL_filemode = proto_perl->Ifilemode;
12902 PL_lastfd = proto_perl->Ilastfd;
12903 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
12904 PL_Argv = NULL;
bd61b366 12905 PL_Cmd = NULL;
bd81e77b 12906 PL_gensym = proto_perl->Igensym;
bd81e77b
NC
12907 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav, param);
12908 PL_laststatval = proto_perl->Ilaststatval;
12909 PL_laststype = proto_perl->Ilaststype;
a0714e2c 12910 PL_mess_sv = NULL;
bd81e77b
NC
12911
12912 PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv, param);
12913
12914 /* interpreter atexit processing */
12915 PL_exitlistlen = proto_perl->Iexitlistlen;
12916 if (PL_exitlistlen) {
12917 Newx(PL_exitlist, PL_exitlistlen, PerlExitListEntry);
12918 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
9660f481 12919 }
bd81e77b
NC
12920 else
12921 PL_exitlist = (PerlExitListEntry*)NULL;
f16dd614
DM
12922
12923 PL_my_cxt_size = proto_perl->Imy_cxt_size;
4c901e72 12924 if (PL_my_cxt_size) {
f16dd614
DM
12925 Newx(PL_my_cxt_list, PL_my_cxt_size, void *);
12926 Copy(proto_perl->Imy_cxt_list, PL_my_cxt_list, PL_my_cxt_size, void *);
53d44271 12927#ifdef PERL_GLOBAL_STRUCT_PRIVATE
bae1192d 12928 Newx(PL_my_cxt_keys, PL_my_cxt_size, const char *);
53d44271
JH
12929 Copy(proto_perl->Imy_cxt_keys, PL_my_cxt_keys, PL_my_cxt_size, char *);
12930#endif
f16dd614 12931 }
53d44271 12932 else {
f16dd614 12933 PL_my_cxt_list = (void**)NULL;
53d44271 12934#ifdef PERL_GLOBAL_STRUCT_PRIVATE
bae1192d 12935 PL_my_cxt_keys = (const char**)NULL;
53d44271
JH
12936#endif
12937 }
bd81e77b
NC
12938 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal, param);
12939 PL_custom_op_names = hv_dup_inc(proto_perl->Icustom_op_names,param);
12940 PL_custom_op_descs = hv_dup_inc(proto_perl->Icustom_op_descs,param);
1830b3d9 12941 PL_custom_ops = hv_dup_inc(proto_perl->Icustom_ops, param);
bd81e77b
NC
12942
12943 PL_profiledata = NULL;
9660f481 12944
bd81e77b 12945 PL_compcv = cv_dup(proto_perl->Icompcv, param);
9660f481 12946
bd81e77b 12947 PAD_CLONE_VARS(proto_perl, param);
9660f481 12948
bd81e77b
NC
12949#ifdef HAVE_INTERP_INTERN
12950 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
12951#endif
645c22ef 12952
bd81e77b
NC
12953 /* more statics moved here */
12954 PL_generation = proto_perl->Igeneration;
12955 PL_DBcv = cv_dup(proto_perl->IDBcv, param);
645c22ef 12956
bd81e77b
NC
12957 PL_in_clean_objs = proto_perl->Iin_clean_objs;
12958 PL_in_clean_all = proto_perl->Iin_clean_all;
6a78b4db 12959
bd81e77b
NC
12960 PL_uid = proto_perl->Iuid;
12961 PL_euid = proto_perl->Ieuid;
12962 PL_gid = proto_perl->Igid;
12963 PL_egid = proto_perl->Iegid;
12964 PL_nomemok = proto_perl->Inomemok;
12965 PL_an = proto_perl->Ian;
12966 PL_evalseq = proto_perl->Ievalseq;
12967 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
12968 PL_origalen = proto_perl->Iorigalen;
12969#ifdef PERL_USES_PL_PIDSTATUS
12970 PL_pidstatus = newHV(); /* XXX flag for cloning? */
12971#endif
12972 PL_osname = SAVEPV(proto_perl->Iosname);
12973 PL_sighandlerp = proto_perl->Isighandlerp;
6a78b4db 12974
bd81e77b 12975 PL_runops = proto_perl->Irunops;
6a78b4db 12976
199e78b7
DM
12977 PL_parser = parser_dup(proto_perl->Iparser, param);
12978
f0c5aa00
DM
12979 /* XXX this only works if the saved cop has already been cloned */
12980 if (proto_perl->Iparser) {
12981 PL_parser->saved_curcop = (COP*)any_dup(
12982 proto_perl->Iparser->saved_curcop,
12983 proto_perl);
12984 }
12985
bd81e77b
NC
12986 PL_subline = proto_perl->Isubline;
12987 PL_subname = sv_dup_inc(proto_perl->Isubname, param);
c43294b8 12988
bd81e77b
NC
12989#ifdef FCRYPT
12990 PL_cryptseen = proto_perl->Icryptseen;
12991#endif
1d7c1841 12992
bd81e77b 12993 PL_hints = proto_perl->Ihints;
1d7c1841 12994
bd81e77b 12995 PL_amagic_generation = proto_perl->Iamagic_generation;
d2d73c3e 12996
bd81e77b
NC
12997#ifdef USE_LOCALE_COLLATE
12998 PL_collation_ix = proto_perl->Icollation_ix;
12999 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
13000 PL_collation_standard = proto_perl->Icollation_standard;
13001 PL_collxfrm_base = proto_perl->Icollxfrm_base;
13002 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
13003#endif /* USE_LOCALE_COLLATE */
1d7c1841 13004
bd81e77b
NC
13005#ifdef USE_LOCALE_NUMERIC
13006 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
13007 PL_numeric_standard = proto_perl->Inumeric_standard;
13008 PL_numeric_local = proto_perl->Inumeric_local;
13009 PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
13010#endif /* !USE_LOCALE_NUMERIC */
1d7c1841 13011
bd81e77b
NC
13012 /* utf8 character classes */
13013 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum, param);
bd81e77b
NC
13014 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii, param);
13015 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha, param);
13016 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space, param);
13017 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
13018 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph, param);
13019 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit, param);
13020 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper, param);
13021 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower, param);
13022 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print, param);
13023 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct, param);
13024 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
13025 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark, param);
37e2e78e
KW
13026 PL_utf8_X_begin = sv_dup_inc(proto_perl->Iutf8_X_begin, param);
13027 PL_utf8_X_extend = sv_dup_inc(proto_perl->Iutf8_X_extend, param);
13028 PL_utf8_X_prepend = sv_dup_inc(proto_perl->Iutf8_X_prepend, param);
13029 PL_utf8_X_non_hangul = sv_dup_inc(proto_perl->Iutf8_X_non_hangul, param);
13030 PL_utf8_X_L = sv_dup_inc(proto_perl->Iutf8_X_L, param);
13031 PL_utf8_X_LV = sv_dup_inc(proto_perl->Iutf8_X_LV, param);
13032 PL_utf8_X_LVT = sv_dup_inc(proto_perl->Iutf8_X_LVT, param);
13033 PL_utf8_X_T = sv_dup_inc(proto_perl->Iutf8_X_T, param);
13034 PL_utf8_X_V = sv_dup_inc(proto_perl->Iutf8_X_V, param);
13035 PL_utf8_X_LV_LVT_V = sv_dup_inc(proto_perl->Iutf8_X_LV_LVT_V, param);
bd81e77b
NC
13036 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper, param);
13037 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle, param);
13038 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower, param);
13039 PL_utf8_tofold = sv_dup_inc(proto_perl->Iutf8_tofold, param);
13040 PL_utf8_idstart = sv_dup_inc(proto_perl->Iutf8_idstart, param);
13041 PL_utf8_idcont = sv_dup_inc(proto_perl->Iutf8_idcont, param);
1d7c1841 13042
bd81e77b
NC
13043 /* Did the locale setup indicate UTF-8? */
13044 PL_utf8locale = proto_perl->Iutf8locale;
13045 /* Unicode features (see perlrun/-C) */
13046 PL_unicode = proto_perl->Iunicode;
1d7c1841 13047
bd81e77b
NC
13048 /* Pre-5.8 signals control */
13049 PL_signals = proto_perl->Isignals;
1d7c1841 13050
bd81e77b
NC
13051 /* times() ticks per second */
13052 PL_clocktick = proto_perl->Iclocktick;
1d7c1841 13053
bd81e77b
NC
13054 /* Recursion stopper for PerlIO_find_layer */
13055 PL_in_load_module = proto_perl->Iin_load_module;
8df990a8 13056
bd81e77b
NC
13057 /* sort() routine */
13058 PL_sort_RealCmp = proto_perl->Isort_RealCmp;
e5dd39fc 13059
bd81e77b
NC
13060 /* Not really needed/useful since the reenrant_retint is "volatile",
13061 * but do it for consistency's sake. */
13062 PL_reentrant_retint = proto_perl->Ireentrant_retint;
1d7c1841 13063
bd81e77b
NC
13064 /* Hooks to shared SVs and locks. */
13065 PL_sharehook = proto_perl->Isharehook;
13066 PL_lockhook = proto_perl->Ilockhook;
13067 PL_unlockhook = proto_perl->Iunlockhook;
13068 PL_threadhook = proto_perl->Ithreadhook;
eba16661 13069 PL_destroyhook = proto_perl->Idestroyhook;
92f022bb 13070 PL_signalhook = proto_perl->Isignalhook;
1d7c1841 13071
bd81e77b
NC
13072#ifdef THREADS_HAVE_PIDS
13073 PL_ppid = proto_perl->Ippid;
13074#endif
1d7c1841 13075
bd81e77b 13076 /* swatch cache */
5c284bb0 13077 PL_last_swash_hv = NULL; /* reinits on demand */
bd81e77b
NC
13078 PL_last_swash_klen = 0;
13079 PL_last_swash_key[0]= '\0';
13080 PL_last_swash_tmps = (U8*)NULL;
13081 PL_last_swash_slen = 0;
1d7c1841 13082
bd81e77b
NC
13083 PL_glob_index = proto_perl->Iglob_index;
13084 PL_srand_called = proto_perl->Isrand_called;
05ec9bb3 13085
bd81e77b
NC
13086 if (proto_perl->Ipsig_pend) {
13087 Newxz(PL_psig_pend, SIG_SIZE, int);
13088 }
13089 else {
13090 PL_psig_pend = (int*)NULL;
13091 }
05ec9bb3 13092
d525a7b2
NC
13093 if (proto_perl->Ipsig_name) {
13094 Newx(PL_psig_name, 2 * SIG_SIZE, SV*);
13095 sv_dup_inc_multiple(proto_perl->Ipsig_name, PL_psig_name, 2 * SIG_SIZE,
538f2e76 13096 param);
d525a7b2 13097 PL_psig_ptr = PL_psig_name + SIG_SIZE;
bd81e77b
NC
13098 }
13099 else {
13100 PL_psig_ptr = (SV**)NULL;
13101 PL_psig_name = (SV**)NULL;
13102 }
05ec9bb3 13103
907b3e23 13104 /* intrpvar.h stuff */
1d7c1841 13105
bd81e77b
NC
13106 if (flags & CLONEf_COPY_STACKS) {
13107 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
907b3e23
DM
13108 PL_tmps_ix = proto_perl->Itmps_ix;
13109 PL_tmps_max = proto_perl->Itmps_max;
13110 PL_tmps_floor = proto_perl->Itmps_floor;
e92c6be8 13111 Newx(PL_tmps_stack, PL_tmps_max, SV*);
1d8a41fe
JD
13112 sv_dup_inc_multiple(proto_perl->Itmps_stack, PL_tmps_stack,
13113 PL_tmps_ix+1, param);
d2d73c3e 13114
bd81e77b 13115 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
907b3e23 13116 i = proto_perl->Imarkstack_max - proto_perl->Imarkstack;
bd81e77b 13117 Newxz(PL_markstack, i, I32);
907b3e23
DM
13118 PL_markstack_max = PL_markstack + (proto_perl->Imarkstack_max
13119 - proto_perl->Imarkstack);
13120 PL_markstack_ptr = PL_markstack + (proto_perl->Imarkstack_ptr
13121 - proto_perl->Imarkstack);
13122 Copy(proto_perl->Imarkstack, PL_markstack,
bd81e77b 13123 PL_markstack_ptr - PL_markstack + 1, I32);
d2d73c3e 13124
bd81e77b
NC
13125 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
13126 * NOTE: unlike the others! */
907b3e23
DM
13127 PL_scopestack_ix = proto_perl->Iscopestack_ix;
13128 PL_scopestack_max = proto_perl->Iscopestack_max;
bd81e77b 13129 Newxz(PL_scopestack, PL_scopestack_max, I32);
907b3e23 13130 Copy(proto_perl->Iscopestack, PL_scopestack, PL_scopestack_ix, I32);
d419787a 13131
cbdd5331
JD
13132#ifdef DEBUGGING
13133 Newxz(PL_scopestack_name, PL_scopestack_max, const char *);
13134 Copy(proto_perl->Iscopestack_name, PL_scopestack_name, PL_scopestack_ix, const char *);
13135#endif
bd81e77b 13136 /* NOTE: si_dup() looks at PL_markstack */
907b3e23 13137 PL_curstackinfo = si_dup(proto_perl->Icurstackinfo, param);
d2d73c3e 13138
bd81e77b 13139 /* PL_curstack = PL_curstackinfo->si_stack; */
907b3e23
DM
13140 PL_curstack = av_dup(proto_perl->Icurstack, param);
13141 PL_mainstack = av_dup(proto_perl->Imainstack, param);
1d7c1841 13142
bd81e77b
NC
13143 /* next PUSHs() etc. set *(PL_stack_sp+1) */
13144 PL_stack_base = AvARRAY(PL_curstack);
907b3e23
DM
13145 PL_stack_sp = PL_stack_base + (proto_perl->Istack_sp
13146 - proto_perl->Istack_base);
bd81e77b 13147 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
1d7c1841 13148
bd81e77b
NC
13149 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
13150 * NOTE: unlike the others! */
907b3e23
DM
13151 PL_savestack_ix = proto_perl->Isavestack_ix;
13152 PL_savestack_max = proto_perl->Isavestack_max;
bd81e77b
NC
13153 /*Newxz(PL_savestack, PL_savestack_max, ANY);*/
13154 PL_savestack = ss_dup(proto_perl, param);
13155 }
13156 else {
13157 init_stacks();
13158 ENTER; /* perl_destruct() wants to LEAVE; */
13159 }
1d7c1841 13160
907b3e23 13161 PL_start_env = proto_perl->Istart_env; /* XXXXXX */
bd81e77b 13162 PL_top_env = &PL_start_env;
1d7c1841 13163
907b3e23 13164 PL_op = proto_perl->Iop;
4a4c6fe3 13165
a0714e2c 13166 PL_Sv = NULL;
bd81e77b 13167 PL_Xpv = (XPV*)NULL;
24792b8d 13168 my_perl->Ina = proto_perl->Ina;
1fcf4c12 13169
907b3e23
DM
13170 PL_statbuf = proto_perl->Istatbuf;
13171 PL_statcache = proto_perl->Istatcache;
13172 PL_statgv = gv_dup(proto_perl->Istatgv, param);
13173 PL_statname = sv_dup_inc(proto_perl->Istatname, param);
bd81e77b 13174#ifdef HAS_TIMES
907b3e23 13175 PL_timesbuf = proto_perl->Itimesbuf;
bd81e77b 13176#endif
1d7c1841 13177
907b3e23
DM
13178 PL_tainted = proto_perl->Itainted;
13179 PL_curpm = proto_perl->Icurpm; /* XXX No PMOP ref count */
13180 PL_rs = sv_dup_inc(proto_perl->Irs, param);
13181 PL_last_in_gv = gv_dup(proto_perl->Ilast_in_gv, param);
907b3e23
DM
13182 PL_defoutgv = gv_dup_inc(proto_perl->Idefoutgv, param);
13183 PL_chopset = proto_perl->Ichopset; /* XXX never deallocated */
13184 PL_toptarget = sv_dup_inc(proto_perl->Itoptarget, param);
13185 PL_bodytarget = sv_dup_inc(proto_perl->Ibodytarget, param);
13186 PL_formtarget = sv_dup(proto_perl->Iformtarget, param);
13187
febb3a6d 13188 PL_restartjmpenv = proto_perl->Irestartjmpenv;
907b3e23
DM
13189 PL_restartop = proto_perl->Irestartop;
13190 PL_in_eval = proto_perl->Iin_eval;
13191 PL_delaymagic = proto_perl->Idelaymagic;
9ebf26ad 13192 PL_phase = proto_perl->Iphase;
907b3e23
DM
13193 PL_localizing = proto_perl->Ilocalizing;
13194
13195 PL_errors = sv_dup_inc(proto_perl->Ierrors, param);
4608196e 13196 PL_hv_fetch_ent_mh = NULL;
907b3e23 13197 PL_modcount = proto_perl->Imodcount;
5f66b61c 13198 PL_lastgotoprobe = NULL;
907b3e23 13199 PL_dumpindent = proto_perl->Idumpindent;
1d7c1841 13200
907b3e23
DM
13201 PL_sortcop = (OP*)any_dup(proto_perl->Isortcop, proto_perl);
13202 PL_sortstash = hv_dup(proto_perl->Isortstash, param);
13203 PL_firstgv = gv_dup(proto_perl->Ifirstgv, param);
13204 PL_secondgv = gv_dup(proto_perl->Isecondgv, param);
bd61b366 13205 PL_efloatbuf = NULL; /* reinits on demand */
bd81e77b 13206 PL_efloatsize = 0; /* reinits on demand */
d2d73c3e 13207
bd81e77b 13208 /* regex stuff */
1d7c1841 13209
bd81e77b
NC
13210 PL_screamfirst = NULL;
13211 PL_screamnext = NULL;
13212 PL_maxscream = -1; /* reinits on demand */
a0714e2c 13213 PL_lastscream = NULL;
1d7c1841 13214
1d7c1841 13215
907b3e23 13216 PL_regdummy = proto_perl->Iregdummy;
bd81e77b
NC
13217 PL_colorset = 0; /* reinits PL_colors[] */
13218 /*PL_colors[6] = {0,0,0,0,0,0};*/
1d7c1841 13219
84da74a7 13220
1d7c1841 13221
bd81e77b 13222 /* Pluggable optimizer */
907b3e23 13223 PL_peepp = proto_perl->Ipeepp;
1a0a2ba9 13224 PL_rpeepp = proto_perl->Irpeepp;
f37b8c3f
VP
13225 /* op_free() hook */
13226 PL_opfreehook = proto_perl->Iopfreehook;
1d7c1841 13227
bd81e77b 13228 PL_stashcache = newHV();
1d7c1841 13229
b7185faf 13230 PL_watchaddr = (char **) ptr_table_fetch(PL_ptr_table,
907b3e23 13231 proto_perl->Iwatchaddr);
b7185faf
DM
13232 PL_watchok = PL_watchaddr ? * PL_watchaddr : NULL;
13233 if (PL_debug && PL_watchaddr) {
13234 PerlIO_printf(Perl_debug_log,
13235 "WATCHING: %"UVxf" cloned as %"UVxf" with value %"UVxf"\n",
907b3e23 13236 PTR2UV(proto_perl->Iwatchaddr), PTR2UV(PL_watchaddr),
b7185faf
DM
13237 PTR2UV(PL_watchok));
13238 }
13239
a3e6e81e 13240 PL_registered_mros = hv_dup_inc(proto_perl->Iregistered_mros, param);
1930840b 13241 PL_blockhooks = av_dup_inc(proto_perl->Iblockhooks, param);
2726813d 13242 PL_utf8_foldclosures = hv_dup_inc(proto_perl->Iutf8_foldclosures, param);
a3e6e81e 13243
bd81e77b
NC
13244 /* Call the ->CLONE method, if it exists, for each of the stashes
13245 identified by sv_dup() above.
13246 */
13247 while(av_len(param->stashes) != -1) {
85fbaab2 13248 HV* const stash = MUTABLE_HV(av_shift(param->stashes));
bd81e77b
NC
13249 GV* const cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
13250 if (cloner && GvCV(cloner)) {
13251 dSP;
13252 ENTER;
13253 SAVETMPS;
13254 PUSHMARK(SP);
6e449a3a 13255 mXPUSHs(newSVhek(HvNAME_HEK(stash)));
bd81e77b 13256 PUTBACK;
daba3364 13257 call_sv(MUTABLE_SV(GvCV(cloner)), G_DISCARD);
bd81e77b
NC
13258 FREETMPS;
13259 LEAVE;
13260 }
1d7c1841 13261 }
1d7c1841 13262
b0b93b3c
DM
13263 if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
13264 ptr_table_free(PL_ptr_table);
13265 PL_ptr_table = NULL;
13266 }
13267
d08d57ef 13268 if (!(flags & CLONEf_COPY_STACKS)) {
e4295668 13269 unreferenced_to_tmp_stack(param->unreferenced);
d08d57ef 13270 }
b0b93b3c 13271
bd81e77b 13272 SvREFCNT_dec(param->stashes);
1d7c1841 13273
bd81e77b
NC
13274 /* orphaned? eg threads->new inside BEGIN or use */
13275 if (PL_compcv && ! SvREFCNT(PL_compcv)) {
b37c2d43 13276 SvREFCNT_inc_simple_void(PL_compcv);
bd81e77b
NC
13277 SAVEFREESV(PL_compcv);
13278 }
dd2155a4 13279
bd81e77b
NC
13280 return my_perl;
13281}
1d7c1841 13282
e4295668
NC
13283static void
13284S_unreferenced_to_tmp_stack(pTHX_ AV *const unreferenced)
13285{
13286 PERL_ARGS_ASSERT_UNREFERENCED_TO_TMP_STACK;
13287
13288 if (AvFILLp(unreferenced) > -1) {
13289 SV **svp = AvARRAY(unreferenced);
13290 SV **const last = svp + AvFILLp(unreferenced);
13291 SSize_t count = 0;
13292
13293 do {
04518cc3 13294 if (SvREFCNT(*svp) == 1)
e4295668
NC
13295 ++count;
13296 } while (++svp <= last);
13297
13298 EXTEND_MORTAL(count);
13299 svp = AvARRAY(unreferenced);
13300
13301 do {
04518cc3
NC
13302 if (SvREFCNT(*svp) == 1) {
13303 /* Our reference is the only one to this SV. This means that
13304 in this thread, the scalar effectively has a 0 reference.
13305 That doesn't work (cleanup never happens), so donate our
13306 reference to it onto the save stack. */
13307 PL_tmps_stack[++PL_tmps_ix] = *svp;
13308 } else {
13309 /* As an optimisation, because we are already walking the
13310 entire array, instead of above doing either
13311 SvREFCNT_inc(*svp) or *svp = &PL_sv_undef, we can instead
13312 release our reference to the scalar, so that at the end of
13313 the array owns zero references to the scalars it happens to
13314 point to. We are effectively converting the array from
13315 AvREAL() on to AvREAL() off. This saves the av_clear()
13316 (triggered by the SvREFCNT_dec(unreferenced) below) from
13317 walking the array a second time. */
13318 SvREFCNT_dec(*svp);
13319 }
13320
e4295668 13321 } while (++svp <= last);
04518cc3 13322 AvREAL_off(unreferenced);
e4295668
NC
13323 }
13324 SvREFCNT_dec(unreferenced);
13325}
13326
f7abe70b
NC
13327void
13328Perl_clone_params_del(CLONE_PARAMS *param)
13329{
90d4a638
NC
13330 /* This seemingly funky ordering keeps the build with PERL_GLOBAL_STRUCT
13331 happy: */
1db366cc
NC
13332 PerlInterpreter *const to = param->new_perl;
13333 dTHXa(to);
90d4a638 13334 PerlInterpreter *const was = PERL_GET_THX;
f7abe70b
NC
13335
13336 PERL_ARGS_ASSERT_CLONE_PARAMS_DEL;
13337
1db366cc
NC
13338 if (was != to) {
13339 PERL_SET_THX(to);
13340 }
f7abe70b 13341
1db366cc 13342 SvREFCNT_dec(param->stashes);
e4295668
NC
13343 if (param->unreferenced)
13344 unreferenced_to_tmp_stack(param->unreferenced);
f7abe70b 13345
1db366cc 13346 Safefree(param);
f7abe70b 13347
1db366cc
NC
13348 if (was != to) {
13349 PERL_SET_THX(was);
f7abe70b
NC
13350 }
13351}
13352
13353CLONE_PARAMS *
13354Perl_clone_params_new(PerlInterpreter *const from, PerlInterpreter *const to)
13355{
90d4a638 13356 dVAR;
f7abe70b
NC
13357 /* Need to play this game, as newAV() can call safesysmalloc(), and that
13358 does a dTHX; to get the context from thread local storage.
13359 FIXME - under PERL_CORE Newx(), Safefree() and friends should expand to
13360 a version that passes in my_perl. */
13361 PerlInterpreter *const was = PERL_GET_THX;
13362 CLONE_PARAMS *param;
f7abe70b
NC
13363
13364 PERL_ARGS_ASSERT_CLONE_PARAMS_NEW;
13365
13366 if (was != to) {
13367 PERL_SET_THX(to);
13368 }
13369
13370 /* Given that we've set the context, we can do this unshared. */
13371 Newx(param, 1, CLONE_PARAMS);
13372
13373 param->flags = 0;
13374 param->proto_perl = from;
1db366cc 13375 param->new_perl = to;
f7abe70b
NC
13376 param->stashes = (AV *)Perl_newSV_type(to, SVt_PVAV);
13377 AvREAL_off(param->stashes);
d08d57ef 13378 param->unreferenced = (AV *)Perl_newSV_type(to, SVt_PVAV);
f7abe70b 13379
f7abe70b
NC
13380 if (was != to) {
13381 PERL_SET_THX(was);
13382 }
13383 return param;
13384}
13385
bd81e77b 13386#endif /* USE_ITHREADS */
1d7c1841 13387
bd81e77b
NC
13388/*
13389=head1 Unicode Support
1d7c1841 13390
bd81e77b 13391=for apidoc sv_recode_to_utf8
1d7c1841 13392
bd81e77b
NC
13393The encoding is assumed to be an Encode object, on entry the PV
13394of the sv is assumed to be octets in that encoding, and the sv
13395will be converted into Unicode (and UTF-8).
1d7c1841 13396
bd81e77b
NC
13397If the sv already is UTF-8 (or if it is not POK), or if the encoding
13398is not a reference, nothing is done to the sv. If the encoding is not
13399an C<Encode::XS> Encoding object, bad things will happen.
13400(See F<lib/encoding.pm> and L<Encode>).
1d7c1841 13401
bd81e77b 13402The PV of the sv is returned.
1d7c1841 13403
bd81e77b 13404=cut */
1d7c1841 13405
bd81e77b
NC
13406char *
13407Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
13408{
13409 dVAR;
7918f24d
NC
13410
13411 PERL_ARGS_ASSERT_SV_RECODE_TO_UTF8;
13412
bd81e77b
NC
13413 if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
13414 SV *uni;
13415 STRLEN len;
13416 const char *s;
13417 dSP;
13418 ENTER;
13419 SAVETMPS;
13420 save_re_context();
13421 PUSHMARK(sp);
13422 EXTEND(SP, 3);
13423 XPUSHs(encoding);
13424 XPUSHs(sv);
13425/*
13426 NI-S 2002/07/09
13427 Passing sv_yes is wrong - it needs to be or'ed set of constants
13428 for Encode::XS, while UTf-8 decode (currently) assumes a true value means
13429 remove converted chars from source.
1d7c1841 13430
bd81e77b 13431 Both will default the value - let them.
1d7c1841 13432
bd81e77b
NC
13433 XPUSHs(&PL_sv_yes);
13434*/
13435 PUTBACK;
13436 call_method("decode", G_SCALAR);
13437 SPAGAIN;
13438 uni = POPs;
13439 PUTBACK;
13440 s = SvPV_const(uni, len);
13441 if (s != SvPVX_const(sv)) {
13442 SvGROW(sv, len + 1);
13443 Move(s, SvPVX(sv), len + 1, char);
13444 SvCUR_set(sv, len);
13445 }
13446 FREETMPS;
13447 LEAVE;
13448 SvUTF8_on(sv);
13449 return SvPVX(sv);
389edf32 13450 }
bd81e77b
NC
13451 return SvPOKp(sv) ? SvPVX(sv) : NULL;
13452}
1d7c1841 13453
bd81e77b
NC
13454/*
13455=for apidoc sv_cat_decode
1d7c1841 13456
bd81e77b
NC
13457The encoding is assumed to be an Encode object, the PV of the ssv is
13458assumed to be octets in that encoding and decoding the input starts
13459from the position which (PV + *offset) pointed to. The dsv will be
13460concatenated the decoded UTF-8 string from ssv. Decoding will terminate
13461when the string tstr appears in decoding output or the input ends on
13462the PV of the ssv. The value which the offset points will be modified
13463to the last input position on the ssv.
1d7c1841 13464
bd81e77b 13465Returns TRUE if the terminator was found, else returns FALSE.
1d7c1841 13466
bd81e77b
NC
13467=cut */
13468
13469bool
13470Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
13471 SV *ssv, int *offset, char *tstr, int tlen)
13472{
13473 dVAR;
13474 bool ret = FALSE;
7918f24d
NC
13475
13476 PERL_ARGS_ASSERT_SV_CAT_DECODE;
13477
bd81e77b
NC
13478 if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) {
13479 SV *offsv;
13480 dSP;
13481 ENTER;
13482 SAVETMPS;
13483 save_re_context();
13484 PUSHMARK(sp);
13485 EXTEND(SP, 6);
13486 XPUSHs(encoding);
13487 XPUSHs(dsv);
13488 XPUSHs(ssv);
6e449a3a
MHM
13489 offsv = newSViv(*offset);
13490 mXPUSHs(offsv);
13491 mXPUSHp(tstr, tlen);
bd81e77b
NC
13492 PUTBACK;
13493 call_method("cat_decode", G_SCALAR);
13494 SPAGAIN;
13495 ret = SvTRUE(TOPs);
13496 *offset = SvIV(offsv);
13497 PUTBACK;
13498 FREETMPS;
13499 LEAVE;
389edf32 13500 }
bd81e77b
NC
13501 else
13502 Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
13503 return ret;
1d7c1841 13504
bd81e77b 13505}
1d7c1841 13506
bd81e77b
NC
13507/* ---------------------------------------------------------------------
13508 *
13509 * support functions for report_uninit()
13510 */
1d7c1841 13511
bd81e77b
NC
13512/* the maxiumum size of array or hash where we will scan looking
13513 * for the undefined element that triggered the warning */
1d7c1841 13514
bd81e77b 13515#define FUV_MAX_SEARCH_SIZE 1000
1d7c1841 13516
bd81e77b
NC
13517/* Look for an entry in the hash whose value has the same SV as val;
13518 * If so, return a mortal copy of the key. */
1d7c1841 13519
bd81e77b 13520STATIC SV*
6c1b357c 13521S_find_hash_subscript(pTHX_ const HV *const hv, const SV *const val)
bd81e77b
NC
13522{
13523 dVAR;
13524 register HE **array;
13525 I32 i;
6c3182a5 13526
7918f24d
NC
13527 PERL_ARGS_ASSERT_FIND_HASH_SUBSCRIPT;
13528
bd81e77b
NC
13529 if (!hv || SvMAGICAL(hv) || !HvARRAY(hv) ||
13530 (HvTOTALKEYS(hv) > FUV_MAX_SEARCH_SIZE))
a0714e2c 13531 return NULL;
6c3182a5 13532
bd81e77b 13533 array = HvARRAY(hv);
6c3182a5 13534
bd81e77b
NC
13535 for (i=HvMAX(hv); i>0; i--) {
13536 register HE *entry;
13537 for (entry = array[i]; entry; entry = HeNEXT(entry)) {
13538 if (HeVAL(entry) != val)
13539 continue;
13540 if ( HeVAL(entry) == &PL_sv_undef ||
13541 HeVAL(entry) == &PL_sv_placeholder)
13542 continue;
13543 if (!HeKEY(entry))
a0714e2c 13544 return NULL;
bd81e77b
NC
13545 if (HeKLEN(entry) == HEf_SVKEY)
13546 return sv_mortalcopy(HeKEY_sv(entry));
a663657d 13547 return sv_2mortal(newSVhek(HeKEY_hek(entry)));
bd81e77b
NC
13548 }
13549 }
a0714e2c 13550 return NULL;
bd81e77b 13551}
6c3182a5 13552
bd81e77b
NC
13553/* Look for an entry in the array whose value has the same SV as val;
13554 * If so, return the index, otherwise return -1. */
6c3182a5 13555
bd81e77b 13556STATIC I32
6c1b357c 13557S_find_array_subscript(pTHX_ const AV *const av, const SV *const val)
bd81e77b 13558{
97aff369 13559 dVAR;
7918f24d
NC
13560
13561 PERL_ARGS_ASSERT_FIND_ARRAY_SUBSCRIPT;
13562
bd81e77b
NC
13563 if (!av || SvMAGICAL(av) || !AvARRAY(av) ||
13564 (AvFILLp(av) > FUV_MAX_SEARCH_SIZE))
13565 return -1;
57c6e6d2 13566
4a021917
AL
13567 if (val != &PL_sv_undef) {
13568 SV ** const svp = AvARRAY(av);
13569 I32 i;
13570
13571 for (i=AvFILLp(av); i>=0; i--)
13572 if (svp[i] == val)
13573 return i;
bd81e77b
NC
13574 }
13575 return -1;
13576}
15a5279a 13577
bd81e77b
NC
13578/* S_varname(): return the name of a variable, optionally with a subscript.
13579 * If gv is non-zero, use the name of that global, along with gvtype (one
13580 * of "$", "@", "%"); otherwise use the name of the lexical at pad offset
13581 * targ. Depending on the value of the subscript_type flag, return:
13582 */
bce260cd 13583
bd81e77b
NC
13584#define FUV_SUBSCRIPT_NONE 1 /* "@foo" */
13585#define FUV_SUBSCRIPT_ARRAY 2 /* "$foo[aindex]" */
13586#define FUV_SUBSCRIPT_HASH 3 /* "$foo{keyname}" */
13587#define FUV_SUBSCRIPT_WITHIN 4 /* "within @foo" */
bce260cd 13588
bd81e77b 13589STATIC SV*
6c1b357c
NC
13590S_varname(pTHX_ const GV *const gv, const char gvtype, PADOFFSET targ,
13591 const SV *const keyname, I32 aindex, int subscript_type)
bd81e77b 13592{
1d7c1841 13593
bd81e77b
NC
13594 SV * const name = sv_newmortal();
13595 if (gv) {
13596 char buffer[2];
13597 buffer[0] = gvtype;
13598 buffer[1] = 0;
1d7c1841 13599
bd81e77b 13600 /* as gv_fullname4(), but add literal '^' for $^FOO names */
66fe0623 13601
bd81e77b 13602 gv_fullname4(name, gv, buffer, 0);
1d7c1841 13603
bd81e77b
NC
13604 if ((unsigned int)SvPVX(name)[1] <= 26) {
13605 buffer[0] = '^';
13606 buffer[1] = SvPVX(name)[1] + 'A' - 1;
1d7c1841 13607
bd81e77b
NC
13608 /* Swap the 1 unprintable control character for the 2 byte pretty
13609 version - ie substr($name, 1, 1) = $buffer; */
13610 sv_insert(name, 1, 1, buffer, 2);
1d7c1841 13611 }
bd81e77b
NC
13612 }
13613 else {
289b91d9 13614 CV * const cv = find_runcv(NULL);
bd81e77b
NC
13615 SV *sv;
13616 AV *av;
1d7c1841 13617
bd81e77b 13618 if (!cv || !CvPADLIST(cv))
a0714e2c 13619 return NULL;
502c6561 13620 av = MUTABLE_AV((*av_fetch(CvPADLIST(cv), 0, FALSE)));
bd81e77b 13621 sv = *av_fetch(av, targ, FALSE);
f8503592 13622 sv_setpvn(name, SvPV_nolen_const(sv), SvCUR(sv));
bd81e77b 13623 }
1d7c1841 13624
bd81e77b 13625 if (subscript_type == FUV_SUBSCRIPT_HASH) {
561b68a9 13626 SV * const sv = newSV(0);
bd81e77b
NC
13627 *SvPVX(name) = '$';
13628 Perl_sv_catpvf(aTHX_ name, "{%s}",
13629 pv_display(sv,SvPVX_const(keyname), SvCUR(keyname), 0, 32));
13630 SvREFCNT_dec(sv);
13631 }
13632 else if (subscript_type == FUV_SUBSCRIPT_ARRAY) {
13633 *SvPVX(name) = '$';
13634 Perl_sv_catpvf(aTHX_ name, "[%"IVdf"]", (IV)aindex);
13635 }
84335ee9
NC
13636 else if (subscript_type == FUV_SUBSCRIPT_WITHIN) {
13637 /* We know that name has no magic, so can use 0 instead of SV_GMAGIC */
13638 Perl_sv_insert_flags(aTHX_ name, 0, 0, STR_WITH_LEN("within "), 0);
13639 }
1d7c1841 13640
bd81e77b
NC
13641 return name;
13642}
1d7c1841 13643
1d7c1841 13644
bd81e77b
NC
13645/*
13646=for apidoc find_uninit_var
1d7c1841 13647
bd81e77b
NC
13648Find the name of the undefined variable (if any) that caused the operator o
13649to issue a "Use of uninitialized value" warning.
13650If match is true, only return a name if it's value matches uninit_sv.
13651So roughly speaking, if a unary operator (such as OP_COS) generates a
13652warning, then following the direct child of the op may yield an
13653OP_PADSV or OP_GV that gives the name of the undefined variable. On the
13654other hand, with OP_ADD there are two branches to follow, so we only print
13655the variable name if we get an exact match.
1d7c1841 13656
bd81e77b 13657The name is returned as a mortal SV.
1d7c1841 13658
bd81e77b
NC
13659Assumes that PL_op is the op that originally triggered the error, and that
13660PL_comppad/PL_curpad points to the currently executing pad.
1d7c1841 13661
bd81e77b
NC
13662=cut
13663*/
1d7c1841 13664
bd81e77b 13665STATIC SV *
6c1b357c
NC
13666S_find_uninit_var(pTHX_ const OP *const obase, const SV *const uninit_sv,
13667 bool match)
bd81e77b
NC
13668{
13669 dVAR;
13670 SV *sv;
6c1b357c
NC
13671 const GV *gv;
13672 const OP *o, *o2, *kid;
1d7c1841 13673
bd81e77b
NC
13674 if (!obase || (match && (!uninit_sv || uninit_sv == &PL_sv_undef ||
13675 uninit_sv == &PL_sv_placeholder)))
a0714e2c 13676 return NULL;
1d7c1841 13677
bd81e77b 13678 switch (obase->op_type) {
1d7c1841 13679
bd81e77b
NC
13680 case OP_RV2AV:
13681 case OP_RV2HV:
13682 case OP_PADAV:
13683 case OP_PADHV:
13684 {
13685 const bool pad = (obase->op_type == OP_PADAV || obase->op_type == OP_PADHV);
13686 const bool hash = (obase->op_type == OP_PADHV || obase->op_type == OP_RV2HV);
13687 I32 index = 0;
a0714e2c 13688 SV *keysv = NULL;
bd81e77b 13689 int subscript_type = FUV_SUBSCRIPT_WITHIN;
1d7c1841 13690
bd81e77b
NC
13691 if (pad) { /* @lex, %lex */
13692 sv = PAD_SVl(obase->op_targ);
a0714e2c 13693 gv = NULL;
bd81e77b
NC
13694 }
13695 else {
13696 if (cUNOPx(obase)->op_first->op_type == OP_GV) {
13697 /* @global, %global */
13698 gv = cGVOPx_gv(cUNOPx(obase)->op_first);
13699 if (!gv)
13700 break;
daba3364 13701 sv = hash ? MUTABLE_SV(GvHV(gv)): MUTABLE_SV(GvAV(gv));
bd81e77b
NC
13702 }
13703 else /* @{expr}, %{expr} */
13704 return find_uninit_var(cUNOPx(obase)->op_first,
13705 uninit_sv, match);
13706 }
1d7c1841 13707
bd81e77b
NC
13708 /* attempt to find a match within the aggregate */
13709 if (hash) {
85fbaab2 13710 keysv = find_hash_subscript((const HV*)sv, uninit_sv);
bd81e77b
NC
13711 if (keysv)
13712 subscript_type = FUV_SUBSCRIPT_HASH;
13713 }
13714 else {
502c6561 13715 index = find_array_subscript((const AV *)sv, uninit_sv);
bd81e77b
NC
13716 if (index >= 0)
13717 subscript_type = FUV_SUBSCRIPT_ARRAY;
13718 }
1d7c1841 13719
bd81e77b
NC
13720 if (match && subscript_type == FUV_SUBSCRIPT_WITHIN)
13721 break;
1d7c1841 13722
bd81e77b
NC
13723 return varname(gv, hash ? '%' : '@', obase->op_targ,
13724 keysv, index, subscript_type);
13725 }
1d7c1841 13726
bd81e77b
NC
13727 case OP_PADSV:
13728 if (match && PAD_SVl(obase->op_targ) != uninit_sv)
13729 break;
a0714e2c
SS
13730 return varname(NULL, '$', obase->op_targ,
13731 NULL, 0, FUV_SUBSCRIPT_NONE);
1d7c1841 13732
bd81e77b
NC
13733 case OP_GVSV:
13734 gv = cGVOPx_gv(obase);
249534c3 13735 if (!gv || (match && GvSV(gv) != uninit_sv) || !GvSTASH(gv))
bd81e77b 13736 break;
a0714e2c 13737 return varname(gv, '$', 0, NULL, 0, FUV_SUBSCRIPT_NONE);
1d7c1841 13738
bd81e77b
NC
13739 case OP_AELEMFAST:
13740 if (obase->op_flags & OPf_SPECIAL) { /* lexical array */
13741 if (match) {
13742 SV **svp;
502c6561 13743 AV *av = MUTABLE_AV(PAD_SV(obase->op_targ));
bd81e77b
NC
13744 if (!av || SvRMAGICAL(av))
13745 break;
13746 svp = av_fetch(av, (I32)obase->op_private, FALSE);
13747 if (!svp || *svp != uninit_sv)
13748 break;
13749 }
a0714e2c
SS
13750 return varname(NULL, '$', obase->op_targ,
13751 NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
13752 }
13753 else {
13754 gv = cGVOPx_gv(obase);
13755 if (!gv)
13756 break;
13757 if (match) {
13758 SV **svp;
6c1b357c 13759 AV *const av = GvAV(gv);
bd81e77b
NC
13760 if (!av || SvRMAGICAL(av))
13761 break;
13762 svp = av_fetch(av, (I32)obase->op_private, FALSE);
13763 if (!svp || *svp != uninit_sv)
13764 break;
13765 }
13766 return varname(gv, '$', 0,
a0714e2c 13767 NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
13768 }
13769 break;
1d7c1841 13770
bd81e77b
NC
13771 case OP_EXISTS:
13772 o = cUNOPx(obase)->op_first;
13773 if (!o || o->op_type != OP_NULL ||
13774 ! (o->op_targ == OP_AELEM || o->op_targ == OP_HELEM))
13775 break;
13776 return find_uninit_var(cBINOPo->op_last, uninit_sv, match);
a2efc822 13777
bd81e77b
NC
13778 case OP_AELEM:
13779 case OP_HELEM:
13780 if (PL_op == obase)
13781 /* $a[uninit_expr] or $h{uninit_expr} */
13782 return find_uninit_var(cBINOPx(obase)->op_last, uninit_sv, match);
081fc587 13783
a0714e2c 13784 gv = NULL;
bd81e77b
NC
13785 o = cBINOPx(obase)->op_first;
13786 kid = cBINOPx(obase)->op_last;
8cf8f3d1 13787
bd81e77b 13788 /* get the av or hv, and optionally the gv */
a0714e2c 13789 sv = NULL;
bd81e77b
NC
13790 if (o->op_type == OP_PADAV || o->op_type == OP_PADHV) {
13791 sv = PAD_SV(o->op_targ);
13792 }
13793 else if ((o->op_type == OP_RV2AV || o->op_type == OP_RV2HV)
13794 && cUNOPo->op_first->op_type == OP_GV)
13795 {
13796 gv = cGVOPx_gv(cUNOPo->op_first);
13797 if (!gv)
13798 break;
daba3364
NC
13799 sv = o->op_type
13800 == OP_RV2HV ? MUTABLE_SV(GvHV(gv)) : MUTABLE_SV(GvAV(gv));
bd81e77b
NC
13801 }
13802 if (!sv)
13803 break;
13804
13805 if (kid && kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid))) {
13806 /* index is constant */
13807 if (match) {
13808 if (SvMAGICAL(sv))
13809 break;
13810 if (obase->op_type == OP_HELEM) {
85fbaab2 13811 HE* he = hv_fetch_ent(MUTABLE_HV(sv), cSVOPx_sv(kid), 0, 0);
bd81e77b
NC
13812 if (!he || HeVAL(he) != uninit_sv)
13813 break;
13814 }
13815 else {
502c6561 13816 SV * const * const svp = av_fetch(MUTABLE_AV(sv), SvIV(cSVOPx_sv(kid)), FALSE);
bd81e77b
NC
13817 if (!svp || *svp != uninit_sv)
13818 break;
13819 }
13820 }
13821 if (obase->op_type == OP_HELEM)
13822 return varname(gv, '%', o->op_targ,
13823 cSVOPx_sv(kid), 0, FUV_SUBSCRIPT_HASH);
13824 else
a0714e2c 13825 return varname(gv, '@', o->op_targ, NULL,
bd81e77b 13826 SvIV(cSVOPx_sv(kid)), FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
13827 }
13828 else {
13829 /* index is an expression;
13830 * attempt to find a match within the aggregate */
13831 if (obase->op_type == OP_HELEM) {
85fbaab2 13832 SV * const keysv = find_hash_subscript((const HV*)sv, uninit_sv);
bd81e77b
NC
13833 if (keysv)
13834 return varname(gv, '%', o->op_targ,
13835 keysv, 0, FUV_SUBSCRIPT_HASH);
13836 }
13837 else {
502c6561
NC
13838 const I32 index
13839 = find_array_subscript((const AV *)sv, uninit_sv);
bd81e77b
NC
13840 if (index >= 0)
13841 return varname(gv, '@', o->op_targ,
a0714e2c 13842 NULL, index, FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
13843 }
13844 if (match)
13845 break;
13846 return varname(gv,
13847 (o->op_type == OP_PADAV || o->op_type == OP_RV2AV)
13848 ? '@' : '%',
a0714e2c 13849 o->op_targ, NULL, 0, FUV_SUBSCRIPT_WITHIN);
f284b03f 13850 }
bd81e77b 13851 break;
dc507217 13852
bd81e77b
NC
13853 case OP_AASSIGN:
13854 /* only examine RHS */
13855 return find_uninit_var(cBINOPx(obase)->op_first, uninit_sv, match);
6d26897e 13856
bd81e77b
NC
13857 case OP_OPEN:
13858 o = cUNOPx(obase)->op_first;
13859 if (o->op_type == OP_PUSHMARK)
13860 o = o->op_sibling;
1d7c1841 13861
bd81e77b
NC
13862 if (!o->op_sibling) {
13863 /* one-arg version of open is highly magical */
a0ae6670 13864
bd81e77b
NC
13865 if (o->op_type == OP_GV) { /* open FOO; */
13866 gv = cGVOPx_gv(o);
13867 if (match && GvSV(gv) != uninit_sv)
13868 break;
13869 return varname(gv, '$', 0,
a0714e2c 13870 NULL, 0, FUV_SUBSCRIPT_NONE);
bd81e77b
NC
13871 }
13872 /* other possibilities not handled are:
13873 * open $x; or open my $x; should return '${*$x}'
13874 * open expr; should return '$'.expr ideally
13875 */
13876 break;
13877 }
13878 goto do_op;
ccfc67b7 13879
bd81e77b
NC
13880 /* ops where $_ may be an implicit arg */
13881 case OP_TRANS:
13882 case OP_SUBST:
13883 case OP_MATCH:
13884 if ( !(obase->op_flags & OPf_STACKED)) {
13885 if (uninit_sv == ((obase->op_private & OPpTARGET_MY)
13886 ? PAD_SVl(obase->op_targ)
13887 : DEFSV))
13888 {
13889 sv = sv_newmortal();
76f68e9b 13890 sv_setpvs(sv, "$_");
bd81e77b
NC
13891 return sv;
13892 }
13893 }
13894 goto do_op;
9f4817db 13895
bd81e77b
NC
13896 case OP_PRTF:
13897 case OP_PRINT:
3ef1310e 13898 case OP_SAY:
fa8d1836 13899 match = 1; /* print etc can return undef on defined args */
bd81e77b
NC
13900 /* skip filehandle as it can't produce 'undef' warning */
13901 o = cUNOPx(obase)->op_first;
13902 if ((obase->op_flags & OPf_STACKED) && o->op_type == OP_PUSHMARK)
13903 o = o->op_sibling->op_sibling;
13904 goto do_op2;
9f4817db 13905
9f4817db 13906
50edf520 13907 case OP_ENTEREVAL: /* could be eval $undef or $x='$undef'; eval $x */
bd81e77b 13908 case OP_RV2SV:
8b0dea50
DM
13909 case OP_CUSTOM: /* XS or custom code could trigger random warnings */
13910
13911 /* the following ops are capable of returning PL_sv_undef even for
13912 * defined arg(s) */
13913
13914 case OP_BACKTICK:
13915 case OP_PIPE_OP:
13916 case OP_FILENO:
13917 case OP_BINMODE:
13918 case OP_TIED:
13919 case OP_GETC:
13920 case OP_SYSREAD:
13921 case OP_SEND:
13922 case OP_IOCTL:
13923 case OP_SOCKET:
13924 case OP_SOCKPAIR:
13925 case OP_BIND:
13926 case OP_CONNECT:
13927 case OP_LISTEN:
13928 case OP_ACCEPT:
13929 case OP_SHUTDOWN:
13930 case OP_SSOCKOPT:
13931 case OP_GETPEERNAME:
13932 case OP_FTRREAD:
13933 case OP_FTRWRITE:
13934 case OP_FTREXEC:
13935 case OP_FTROWNED:
13936 case OP_FTEREAD:
13937 case OP_FTEWRITE:
13938 case OP_FTEEXEC:
13939 case OP_FTEOWNED:
13940 case OP_FTIS:
13941 case OP_FTZERO:
13942 case OP_FTSIZE:
13943 case OP_FTFILE:
13944 case OP_FTDIR:
13945 case OP_FTLINK:
13946 case OP_FTPIPE:
13947 case OP_FTSOCK:
13948 case OP_FTBLK:
13949 case OP_FTCHR:
13950 case OP_FTTTY:
13951 case OP_FTSUID:
13952 case OP_FTSGID:
13953 case OP_FTSVTX:
13954 case OP_FTTEXT:
13955 case OP_FTBINARY:
13956 case OP_FTMTIME:
13957 case OP_FTATIME:
13958 case OP_FTCTIME:
13959 case OP_READLINK:
13960 case OP_OPEN_DIR:
13961 case OP_READDIR:
13962 case OP_TELLDIR:
13963 case OP_SEEKDIR:
13964 case OP_REWINDDIR:
13965 case OP_CLOSEDIR:
13966 case OP_GMTIME:
13967 case OP_ALARM:
13968 case OP_SEMGET:
13969 case OP_GETLOGIN:
13970 case OP_UNDEF:
13971 case OP_SUBSTR:
13972 case OP_AEACH:
13973 case OP_EACH:
13974 case OP_SORT:
13975 case OP_CALLER:
13976 case OP_DOFILE:
fa8d1836
DM
13977 case OP_PROTOTYPE:
13978 case OP_NCMP:
13979 case OP_SMARTMATCH:
13980 case OP_UNPACK:
13981 case OP_SYSOPEN:
13982 case OP_SYSSEEK:
8b0dea50 13983 match = 1;
bd81e77b 13984 goto do_op;
9f4817db 13985
7697b7e7
DM
13986 case OP_ENTERSUB:
13987 case OP_GOTO:
a2fb3d36
DM
13988 /* XXX tmp hack: these two may call an XS sub, and currently
13989 XS subs don't have a SUB entry on the context stack, so CV and
13990 pad determination goes wrong, and BAD things happen. So, just
13991 don't try to determine the value under those circumstances.
7697b7e7
DM
13992 Need a better fix at dome point. DAPM 11/2007 */
13993 break;
13994
4f187fc9
VP
13995 case OP_FLIP:
13996 case OP_FLOP:
13997 {
13998 GV * const gv = gv_fetchpvs(".", GV_NOTQUAL, SVt_PV);
13999 if (gv && GvSV(gv) == uninit_sv)
14000 return newSVpvs_flags("$.", SVs_TEMP);
14001 goto do_op;
14002 }
8b0dea50 14003
cc4b8646
DM
14004 case OP_POS:
14005 /* def-ness of rval pos() is independent of the def-ness of its arg */
14006 if ( !(obase->op_flags & OPf_MOD))
14007 break;
14008
bd81e77b
NC
14009 case OP_SCHOMP:
14010 case OP_CHOMP:
14011 if (SvROK(PL_rs) && uninit_sv == SvRV(PL_rs))
84bafc02 14012 return newSVpvs_flags("${$/}", SVs_TEMP);
5f66b61c 14013 /*FALLTHROUGH*/
5d170f3a 14014
bd81e77b
NC
14015 default:
14016 do_op:
14017 if (!(obase->op_flags & OPf_KIDS))
14018 break;
14019 o = cUNOPx(obase)->op_first;
14020
14021 do_op2:
14022 if (!o)
14023 break;
f9893866 14024
bd81e77b
NC
14025 /* if all except one arg are constant, or have no side-effects,
14026 * or are optimized away, then it's unambiguous */
5f66b61c 14027 o2 = NULL;
bd81e77b 14028 for (kid=o; kid; kid = kid->op_sibling) {
e15d5972
AL
14029 if (kid) {
14030 const OPCODE type = kid->op_type;
14031 if ( (type == OP_CONST && SvOK(cSVOPx_sv(kid)))
14032 || (type == OP_NULL && ! (kid->op_flags & OPf_KIDS))
14033 || (type == OP_PUSHMARK)
bd81e77b 14034 )
bd81e77b 14035 continue;
e15d5972 14036 }
bd81e77b 14037 if (o2) { /* more than one found */
5f66b61c 14038 o2 = NULL;
bd81e77b
NC
14039 break;
14040 }
14041 o2 = kid;
14042 }
14043 if (o2)
14044 return find_uninit_var(o2, uninit_sv, match);
7a5fa8a2 14045
bd81e77b
NC
14046 /* scan all args */
14047 while (o) {
14048 sv = find_uninit_var(o, uninit_sv, 1);
14049 if (sv)
14050 return sv;
14051 o = o->op_sibling;
d0063567 14052 }
bd81e77b 14053 break;
f9893866 14054 }
a0714e2c 14055 return NULL;
9f4817db
JH
14056}
14057
220e2d4e 14058
bd81e77b
NC
14059/*
14060=for apidoc report_uninit
68795e93 14061
bd81e77b 14062Print appropriate "Use of uninitialized variable" warning
220e2d4e 14063
bd81e77b
NC
14064=cut
14065*/
220e2d4e 14066
bd81e77b 14067void
b3dbd76e 14068Perl_report_uninit(pTHX_ const SV *uninit_sv)
220e2d4e 14069{
97aff369 14070 dVAR;
bd81e77b 14071 if (PL_op) {
a0714e2c 14072 SV* varname = NULL;
bd81e77b
NC
14073 if (uninit_sv) {
14074 varname = find_uninit_var(PL_op, uninit_sv,0);
14075 if (varname)
14076 sv_insert(varname, 0, 0, " ", 1);
14077 }
14078 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
14079 varname ? SvPV_nolen_const(varname) : "",
14080 " in ", OP_DESC(PL_op));
220e2d4e 14081 }
a73e8557 14082 else
bd81e77b
NC
14083 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
14084 "", "", "");
220e2d4e 14085}
f9893866 14086
241d1a3b
NC
14087/*
14088 * Local variables:
14089 * c-indentation-style: bsd
14090 * c-basic-offset: 4
14091 * indent-tabs-mode: t
14092 * End:
14093 *
37442d52
RGS
14094 * ex: set ts=8 sts=4 sw=4 noet:
14095 */