This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Sync Tie::RefHash with CPAN (1.37)
[perl5.git] / sv.c
CommitLineData
a0d0e21e 1/* sv.c
79072805 2 *
4bb101f2 3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
7272f7c1 4 * 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, by Larry Wall and others
79072805
LW
5 *
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
8 *
a0d0e21e 9 * "I wonder what the Entish is for 'yes' and 'no'," he thought.
645c22ef
DM
10 *
11 *
5e045b90
AMS
12 * This file contains the code that creates, manipulates and destroys
13 * scalar values (SVs). The other types (AV, HV, GV, etc.) reuse the
14 * structure of an SV, so their creation and destruction is handled
15 * here; higher-level functions are in av.c, hv.c, and so on. Opcode
16 * level functions (eg. substr, split, join) for each of the types are
17 * in the pp*.c files.
79072805
LW
18 */
19
20#include "EXTERN.h"
864dbfa3 21#define PERL_IN_SV_C
79072805 22#include "perl.h"
d2f185dc 23#include "regcomp.h"
79072805 24
51371543 25#define FCALL *f
2c5424a7 26
2f8ed50e
OS
27#ifdef __Lynx__
28/* Missing proto on LynxOS */
29 char *gconvert(double, int, int, char *);
30#endif
31
e23c8137 32#ifdef PERL_UTF8_CACHE_ASSERT
ab455f60 33/* if adding more checks watch out for the following tests:
e23c8137
JH
34 * t/op/index.t t/op/length.t t/op/pat.t t/op/substr.t
35 * lib/utf8.t lib/Unicode/Collate/t/index.t
36 * --jhi
37 */
6f207bd3 38# define ASSERT_UTF8_CACHE(cache) \
ab455f60
NC
39 STMT_START { if (cache) { assert((cache)[0] <= (cache)[1]); \
40 assert((cache)[2] <= (cache)[3]); \
41 assert((cache)[3] <= (cache)[1]);} \
42 } STMT_END
e23c8137 43#else
6f207bd3 44# define ASSERT_UTF8_CACHE(cache) NOOP
e23c8137
JH
45#endif
46
f8c7b90f 47#ifdef PERL_OLD_COPY_ON_WRITE
765f542d 48#define SV_COW_NEXT_SV(sv) INT2PTR(SV *,SvUVX(sv))
607fa7f2 49#define SV_COW_NEXT_SV_SET(current,next) SvUV_set(current, PTR2UV(next))
b5ccf5f2 50/* This is a pessimistic view. Scalar must be purely a read-write PV to copy-
765f542d 51 on-write. */
765f542d 52#endif
645c22ef
DM
53
54/* ============================================================================
55
56=head1 Allocation and deallocation of SVs.
57
d2a0f284
JC
58An SV (or AV, HV, etc.) is allocated in two parts: the head (struct
59sv, av, hv...) contains type and reference count information, and for
60many types, a pointer to the body (struct xrv, xpv, xpviv...), which
61contains fields specific to each type. Some types store all they need
62in the head, so don't have a body.
63
64In all but the most memory-paranoid configuations (ex: PURIFY), heads
65and bodies are allocated out of arenas, which by default are
66approximately 4K chunks of memory parcelled up into N heads or bodies.
93e68bfb
JC
67Sv-bodies are allocated by their sv-type, guaranteeing size
68consistency needed to allocate safely from arrays.
69
d2a0f284
JC
70For SV-heads, the first slot in each arena is reserved, and holds a
71link to the next arena, some flags, and a note of the number of slots.
72Snaked through each arena chain is a linked list of free items; when
73this becomes empty, an extra arena is allocated and divided up into N
74items which are threaded into the free list.
75
76SV-bodies are similar, but they use arena-sets by default, which
77separate the link and info from the arena itself, and reclaim the 1st
78slot in the arena. SV-bodies are further described later.
645c22ef
DM
79
80The following global variables are associated with arenas:
81
82 PL_sv_arenaroot pointer to list of SV arenas
83 PL_sv_root pointer to list of free SV structures
84
d2a0f284
JC
85 PL_body_arenas head of linked-list of body arenas
86 PL_body_roots[] array of pointers to list of free bodies of svtype
87 arrays are indexed by the svtype needed
93e68bfb 88
d2a0f284
JC
89A few special SV heads are not allocated from an arena, but are
90instead directly created in the interpreter structure, eg PL_sv_undef.
93e68bfb
JC
91The size of arenas can be changed from the default by setting
92PERL_ARENA_SIZE appropriately at compile time.
645c22ef
DM
93
94The SV arena serves the secondary purpose of allowing still-live SVs
95to be located and destroyed during final cleanup.
96
97At the lowest level, the macros new_SV() and del_SV() grab and free
98an SV head. (If debugging with -DD, del_SV() calls the function S_del_sv()
99to return the SV to the free list with error checking.) new_SV() calls
100more_sv() / sv_add_arena() to add an extra arena if the free list is empty.
101SVs in the free list have their SvTYPE field set to all ones.
102
ff276b08 103At the time of very final cleanup, sv_free_arenas() is called from
645c22ef 104perl_destruct() to physically free all the arenas allocated since the
6a93a7e5 105start of the interpreter.
645c22ef 106
645c22ef
DM
107The function visit() scans the SV arenas list, and calls a specified
108function for each SV it finds which is still live - ie which has an SvTYPE
109other than all 1's, and a non-zero SvREFCNT. visit() is used by the
110following functions (specified as [function that calls visit()] / [function
111called by visit() for each SV]):
112
113 sv_report_used() / do_report_used()
f2524eef 114 dump all remaining SVs (debugging aid)
645c22ef
DM
115
116 sv_clean_objs() / do_clean_objs(),do_clean_named_objs()
117 Attempt to free all objects pointed to by RVs,
118 and, unless DISABLE_DESTRUCTOR_KLUDGE is defined,
119 try to do the same for all objects indirectly
120 referenced by typeglobs too. Called once from
121 perl_destruct(), prior to calling sv_clean_all()
122 below.
123
124 sv_clean_all() / do_clean_all()
125 SvREFCNT_dec(sv) each remaining SV, possibly
126 triggering an sv_free(). It also sets the
127 SVf_BREAK flag on the SV to indicate that the
128 refcnt has been artificially lowered, and thus
129 stopping sv_free() from giving spurious warnings
130 about SVs which unexpectedly have a refcnt
131 of zero. called repeatedly from perl_destruct()
132 until there are no SVs left.
133
93e68bfb 134=head2 Arena allocator API Summary
645c22ef
DM
135
136Private API to rest of sv.c
137
138 new_SV(), del_SV(),
139
140 new_XIV(), del_XIV(),
141 new_XNV(), del_XNV(),
142 etc
143
144Public API:
145
8cf8f3d1 146 sv_report_used(), sv_clean_objs(), sv_clean_all(), sv_free_arenas()
645c22ef 147
645c22ef
DM
148=cut
149
150============================================================================ */
151
4561caa4
CS
152/*
153 * "A time to plant, and a time to uproot what was planted..."
154 */
155
77354fb4
NC
156void
157Perl_offer_nice_chunk(pTHX_ void *chunk, U32 chunk_size)
158{
97aff369 159 dVAR;
77354fb4
NC
160 void *new_chunk;
161 U32 new_chunk_size;
77354fb4
NC
162 new_chunk = (void *)(chunk);
163 new_chunk_size = (chunk_size);
164 if (new_chunk_size > PL_nice_chunk_size) {
165 Safefree(PL_nice_chunk);
166 PL_nice_chunk = (char *) new_chunk;
167 PL_nice_chunk_size = new_chunk_size;
168 } else {
169 Safefree(chunk);
170 }
77354fb4 171}
cac9b346 172
fd0854ff 173#ifdef DEBUG_LEAKING_SCALARS
22162ca8 174# define FREE_SV_DEBUG_FILE(sv) Safefree((sv)->sv_debug_file)
fd0854ff
DM
175#else
176# define FREE_SV_DEBUG_FILE(sv)
177#endif
178
48614a46
NC
179#ifdef PERL_POISON
180# define SvARENA_CHAIN(sv) ((sv)->sv_u.svu_rv)
181/* Whilst I'd love to do this, it seems that things like to check on
182 unreferenced scalars
7e337ee0 183# define POSION_SV_HEAD(sv) PoisonNew(sv, 1, struct STRUCT_SV)
48614a46 184*/
7e337ee0
JH
185# define POSION_SV_HEAD(sv) PoisonNew(&SvANY(sv), 1, void *), \
186 PoisonNew(&SvREFCNT(sv), 1, U32)
48614a46
NC
187#else
188# define SvARENA_CHAIN(sv) SvANY(sv)
189# define POSION_SV_HEAD(sv)
190#endif
191
053fc874
GS
192#define plant_SV(p) \
193 STMT_START { \
fd0854ff 194 FREE_SV_DEBUG_FILE(p); \
48614a46
NC
195 POSION_SV_HEAD(p); \
196 SvARENA_CHAIN(p) = (void *)PL_sv_root; \
053fc874
GS
197 SvFLAGS(p) = SVTYPEMASK; \
198 PL_sv_root = (p); \
199 --PL_sv_count; \
200 } STMT_END
a0d0e21e 201
053fc874
GS
202#define uproot_SV(p) \
203 STMT_START { \
204 (p) = PL_sv_root; \
bb7bbd9c 205 PL_sv_root = (SV*)SvARENA_CHAIN(p); \
053fc874
GS
206 ++PL_sv_count; \
207 } STMT_END
208
645c22ef 209
cac9b346
NC
210/* make some more SVs by adding another arena */
211
cac9b346
NC
212STATIC SV*
213S_more_sv(pTHX)
214{
97aff369 215 dVAR;
cac9b346
NC
216 SV* sv;
217
218 if (PL_nice_chunk) {
219 sv_add_arena(PL_nice_chunk, PL_nice_chunk_size, 0);
bd61b366 220 PL_nice_chunk = NULL;
cac9b346
NC
221 PL_nice_chunk_size = 0;
222 }
223 else {
224 char *chunk; /* must use New here to match call to */
d2a0f284 225 Newx(chunk,PERL_ARENA_SIZE,char); /* Safefree() in sv_free_arenas() */
2e7ed132 226 sv_add_arena(chunk, PERL_ARENA_SIZE, 0);
cac9b346
NC
227 }
228 uproot_SV(sv);
229 return sv;
230}
231
645c22ef
DM
232/* new_SV(): return a new, empty SV head */
233
eba0f806
DM
234#ifdef DEBUG_LEAKING_SCALARS
235/* provide a real function for a debugger to play with */
236STATIC SV*
237S_new_SV(pTHX)
238{
239 SV* sv;
240
eba0f806
DM
241 if (PL_sv_root)
242 uproot_SV(sv);
243 else
cac9b346 244 sv = S_more_sv(aTHX);
eba0f806
DM
245 SvANY(sv) = 0;
246 SvREFCNT(sv) = 1;
247 SvFLAGS(sv) = 0;
fd0854ff 248 sv->sv_debug_optype = PL_op ? PL_op->op_type : 0;
53a7735b
DM
249 sv->sv_debug_line = (U16) ((PL_parser && PL_parser->copline == NOLINE) ?
250 (PL_curcop ? CopLINE(PL_curcop) : 0) : PL_parser->copline);
fd0854ff
DM
251 sv->sv_debug_inpad = 0;
252 sv->sv_debug_cloned = 0;
fd0854ff 253 sv->sv_debug_file = PL_curcop ? savepv(CopFILE(PL_curcop)): NULL;
fd0854ff 254
eba0f806
DM
255 return sv;
256}
257# define new_SV(p) (p)=S_new_SV(aTHX)
258
259#else
260# define new_SV(p) \
053fc874 261 STMT_START { \
053fc874
GS
262 if (PL_sv_root) \
263 uproot_SV(p); \
264 else \
cac9b346 265 (p) = S_more_sv(aTHX); \
053fc874
GS
266 SvANY(p) = 0; \
267 SvREFCNT(p) = 1; \
268 SvFLAGS(p) = 0; \
269 } STMT_END
eba0f806 270#endif
463ee0b2 271
645c22ef
DM
272
273/* del_SV(): return an empty SV head to the free list */
274
a0d0e21e 275#ifdef DEBUGGING
4561caa4 276
053fc874
GS
277#define del_SV(p) \
278 STMT_START { \
aea4f609 279 if (DEBUG_D_TEST) \
053fc874
GS
280 del_sv(p); \
281 else \
282 plant_SV(p); \
053fc874 283 } STMT_END
a0d0e21e 284
76e3520e 285STATIC void
cea2e8a9 286S_del_sv(pTHX_ SV *p)
463ee0b2 287{
97aff369 288 dVAR;
aea4f609 289 if (DEBUG_D_TEST) {
4633a7c4 290 SV* sva;
a3b680e6 291 bool ok = 0;
3280af22 292 for (sva = PL_sv_arenaroot; sva; sva = (SV *) SvANY(sva)) {
53c1dcc0
AL
293 const SV * const sv = sva + 1;
294 const SV * const svend = &sva[SvREFCNT(sva)];
c0ff570e 295 if (p >= sv && p < svend) {
a0d0e21e 296 ok = 1;
c0ff570e
NC
297 break;
298 }
a0d0e21e
LW
299 }
300 if (!ok) {
0453d815 301 if (ckWARN_d(WARN_INTERNAL))
9014280d 302 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
472d47bc
SB
303 "Attempt to free non-arena SV: 0x%"UVxf
304 pTHX__FORMAT, PTR2UV(p) pTHX__VALUE);
a0d0e21e
LW
305 return;
306 }
307 }
4561caa4 308 plant_SV(p);
463ee0b2 309}
a0d0e21e 310
4561caa4
CS
311#else /* ! DEBUGGING */
312
313#define del_SV(p) plant_SV(p)
314
315#endif /* DEBUGGING */
463ee0b2 316
645c22ef
DM
317
318/*
ccfc67b7
JH
319=head1 SV Manipulation Functions
320
645c22ef
DM
321=for apidoc sv_add_arena
322
323Given a chunk of memory, link it to the head of the list of arenas,
324and split it into a list of free SVs.
325
326=cut
327*/
328
4633a7c4 329void
864dbfa3 330Perl_sv_add_arena(pTHX_ char *ptr, U32 size, U32 flags)
463ee0b2 331{
97aff369 332 dVAR;
0bd48802 333 SV* const sva = (SV*)ptr;
463ee0b2
LW
334 register SV* sv;
335 register SV* svend;
4633a7c4
LW
336
337 /* The first SV in an arena isn't an SV. */
3280af22 338 SvANY(sva) = (void *) PL_sv_arenaroot; /* ptr to next arena */
4633a7c4
LW
339 SvREFCNT(sva) = size / sizeof(SV); /* number of SV slots */
340 SvFLAGS(sva) = flags; /* FAKE if not to be freed */
341
3280af22
NIS
342 PL_sv_arenaroot = sva;
343 PL_sv_root = sva + 1;
4633a7c4
LW
344
345 svend = &sva[SvREFCNT(sva) - 1];
346 sv = sva + 1;
463ee0b2 347 while (sv < svend) {
48614a46 348 SvARENA_CHAIN(sv) = (void *)(SV*)(sv + 1);
03e36789 349#ifdef DEBUGGING
978b032e 350 SvREFCNT(sv) = 0;
03e36789
NC
351#endif
352 /* Must always set typemask because it's awlays checked in on cleanup
353 when the arenas are walked looking for objects. */
8990e307 354 SvFLAGS(sv) = SVTYPEMASK;
463ee0b2
LW
355 sv++;
356 }
48614a46 357 SvARENA_CHAIN(sv) = 0;
03e36789
NC
358#ifdef DEBUGGING
359 SvREFCNT(sv) = 0;
360#endif
4633a7c4
LW
361 SvFLAGS(sv) = SVTYPEMASK;
362}
363
055972dc
DM
364/* visit(): call the named function for each non-free SV in the arenas
365 * whose flags field matches the flags/mask args. */
645c22ef 366
5226ed68 367STATIC I32
055972dc 368S_visit(pTHX_ SVFUNC_t f, U32 flags, U32 mask)
8990e307 369{
97aff369 370 dVAR;
4633a7c4 371 SV* sva;
5226ed68 372 I32 visited = 0;
8990e307 373
3280af22 374 for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
53c1dcc0 375 register const SV * const svend = &sva[SvREFCNT(sva)];
a3b680e6 376 register SV* sv;
4561caa4 377 for (sv = sva + 1; sv < svend; ++sv) {
055972dc
DM
378 if (SvTYPE(sv) != SVTYPEMASK
379 && (sv->sv_flags & mask) == flags
380 && SvREFCNT(sv))
381 {
acfe0abc 382 (FCALL)(aTHX_ sv);
5226ed68
JH
383 ++visited;
384 }
8990e307
LW
385 }
386 }
5226ed68 387 return visited;
8990e307
LW
388}
389
758a08c3
JH
390#ifdef DEBUGGING
391
645c22ef
DM
392/* called by sv_report_used() for each live SV */
393
394static void
acfe0abc 395do_report_used(pTHX_ SV *sv)
645c22ef
DM
396{
397 if (SvTYPE(sv) != SVTYPEMASK) {
398 PerlIO_printf(Perl_debug_log, "****\n");
399 sv_dump(sv);
400 }
401}
758a08c3 402#endif
645c22ef
DM
403
404/*
405=for apidoc sv_report_used
406
407Dump the contents of all SVs not yet freed. (Debugging aid).
408
409=cut
410*/
411
8990e307 412void
864dbfa3 413Perl_sv_report_used(pTHX)
4561caa4 414{
ff270d3a 415#ifdef DEBUGGING
055972dc 416 visit(do_report_used, 0, 0);
96a5add6
AL
417#else
418 PERL_UNUSED_CONTEXT;
ff270d3a 419#endif
4561caa4
CS
420}
421
645c22ef
DM
422/* called by sv_clean_objs() for each live SV */
423
424static void
e15faf7d 425do_clean_objs(pTHX_ SV *ref)
645c22ef 426{
97aff369 427 dVAR;
ea724faa
NC
428 assert (SvROK(ref));
429 {
823a54a3
AL
430 SV * const target = SvRV(ref);
431 if (SvOBJECT(target)) {
432 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(ref)));
433 if (SvWEAKREF(ref)) {
434 sv_del_backref(target, ref);
435 SvWEAKREF_off(ref);
436 SvRV_set(ref, NULL);
437 } else {
438 SvROK_off(ref);
439 SvRV_set(ref, NULL);
440 SvREFCNT_dec(target);
441 }
645c22ef
DM
442 }
443 }
444
445 /* XXX Might want to check arrays, etc. */
446}
447
448/* called by sv_clean_objs() for each live SV */
449
450#ifndef DISABLE_DESTRUCTOR_KLUDGE
451static void
acfe0abc 452do_clean_named_objs(pTHX_ SV *sv)
645c22ef 453{
97aff369 454 dVAR;
ea724faa 455 assert(SvTYPE(sv) == SVt_PVGV);
d011219a
NC
456 assert(isGV_with_GP(sv));
457 if (GvGP(sv)) {
c69033f2
NC
458 if ((
459#ifdef PERL_DONT_CREATE_GVSV
460 GvSV(sv) &&
461#endif
462 SvOBJECT(GvSV(sv))) ||
645c22ef
DM
463 (GvAV(sv) && SvOBJECT(GvAV(sv))) ||
464 (GvHV(sv) && SvOBJECT(GvHV(sv))) ||
465 (GvIO(sv) && SvOBJECT(GvIO(sv))) ||
466 (GvCV(sv) && SvOBJECT(GvCV(sv))) )
467 {
468 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning named glob object:\n "), sv_dump(sv)));
ec5f3c78 469 SvFLAGS(sv) |= SVf_BREAK;
645c22ef
DM
470 SvREFCNT_dec(sv);
471 }
472 }
473}
474#endif
475
476/*
477=for apidoc sv_clean_objs
478
479Attempt to destroy all objects not yet freed
480
481=cut
482*/
483
4561caa4 484void
864dbfa3 485Perl_sv_clean_objs(pTHX)
4561caa4 486{
97aff369 487 dVAR;
3280af22 488 PL_in_clean_objs = TRUE;
055972dc 489 visit(do_clean_objs, SVf_ROK, SVf_ROK);
4561caa4 490#ifndef DISABLE_DESTRUCTOR_KLUDGE
2d0f3c12 491 /* some barnacles may yet remain, clinging to typeglobs */
d011219a 492 visit(do_clean_named_objs, SVt_PVGV|SVpgv_GP, SVTYPEMASK|SVp_POK|SVpgv_GP);
4561caa4 493#endif
3280af22 494 PL_in_clean_objs = FALSE;
4561caa4
CS
495}
496
645c22ef
DM
497/* called by sv_clean_all() for each live SV */
498
499static void
acfe0abc 500do_clean_all(pTHX_ SV *sv)
645c22ef 501{
97aff369 502 dVAR;
645c22ef
DM
503 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%"UVxf"\n", PTR2UV(sv)) ));
504 SvFLAGS(sv) |= SVf_BREAK;
505 SvREFCNT_dec(sv);
506}
507
508/*
509=for apidoc sv_clean_all
510
511Decrement the refcnt of each remaining SV, possibly triggering a
512cleanup. This function may have to be called multiple times to free
ff276b08 513SVs which are in complex self-referential hierarchies.
645c22ef
DM
514
515=cut
516*/
517
5226ed68 518I32
864dbfa3 519Perl_sv_clean_all(pTHX)
8990e307 520{
97aff369 521 dVAR;
5226ed68 522 I32 cleaned;
3280af22 523 PL_in_clean_all = TRUE;
055972dc 524 cleaned = visit(do_clean_all, 0,0);
3280af22 525 PL_in_clean_all = FALSE;
5226ed68 526 return cleaned;
8990e307 527}
463ee0b2 528
5e258f8c
JC
529/*
530 ARENASETS: a meta-arena implementation which separates arena-info
531 into struct arena_set, which contains an array of struct
532 arena_descs, each holding info for a single arena. By separating
533 the meta-info from the arena, we recover the 1st slot, formerly
534 borrowed for list management. The arena_set is about the size of an
39244528 535 arena, avoiding the needless malloc overhead of a naive linked-list.
5e258f8c
JC
536
537 The cost is 1 arena-set malloc per ~320 arena-mallocs, + the unused
538 memory in the last arena-set (1/2 on average). In trade, we get
539 back the 1st slot in each arena (ie 1.7% of a CV-arena, less for
d2a0f284
JC
540 smaller types). The recovery of the wasted space allows use of
541 small arenas for large, rare body types,
5e258f8c 542*/
5e258f8c 543struct arena_desc {
398c677b
NC
544 char *arena; /* the raw storage, allocated aligned */
545 size_t size; /* its size ~4k typ */
0a848332 546 U32 misc; /* type, and in future other things. */
5e258f8c
JC
547};
548
e6148039
NC
549struct arena_set;
550
551/* Get the maximum number of elements in set[] such that struct arena_set
552 will fit within PERL_ARENA_SIZE, which is probabably just under 4K, and
553 therefore likely to be 1 aligned memory page. */
554
555#define ARENAS_PER_SET ((PERL_ARENA_SIZE - sizeof(struct arena_set*) \
556 - 2 * sizeof(int)) / sizeof (struct arena_desc))
5e258f8c
JC
557
558struct arena_set {
559 struct arena_set* next;
0a848332
NC
560 unsigned int set_size; /* ie ARENAS_PER_SET */
561 unsigned int curr; /* index of next available arena-desc */
5e258f8c
JC
562 struct arena_desc set[ARENAS_PER_SET];
563};
564
645c22ef
DM
565/*
566=for apidoc sv_free_arenas
567
568Deallocate the memory used by all arenas. Note that all the individual SV
569heads and bodies within the arenas must already have been freed.
570
571=cut
572*/
4633a7c4 573void
864dbfa3 574Perl_sv_free_arenas(pTHX)
4633a7c4 575{
97aff369 576 dVAR;
4633a7c4
LW
577 SV* sva;
578 SV* svanext;
0a848332 579 unsigned int i;
4633a7c4
LW
580
581 /* Free arenas here, but be careful about fake ones. (We assume
582 contiguity of the fake ones with the corresponding real ones.) */
583
3280af22 584 for (sva = PL_sv_arenaroot; sva; sva = svanext) {
4633a7c4
LW
585 svanext = (SV*) SvANY(sva);
586 while (svanext && SvFAKE(svanext))
587 svanext = (SV*) SvANY(svanext);
588
589 if (!SvFAKE(sva))
1df70142 590 Safefree(sva);
4633a7c4 591 }
93e68bfb 592
5e258f8c 593 {
0a848332
NC
594 struct arena_set *aroot = (struct arena_set*) PL_body_arenas;
595
596 while (aroot) {
597 struct arena_set *current = aroot;
598 i = aroot->curr;
599 while (i--) {
5e258f8c
JC
600 assert(aroot->set[i].arena);
601 Safefree(aroot->set[i].arena);
602 }
0a848332
NC
603 aroot = aroot->next;
604 Safefree(current);
5e258f8c
JC
605 }
606 }
dc8220bf 607 PL_body_arenas = 0;
fdda85ca 608
0a848332
NC
609 i = PERL_ARENA_ROOTS_SIZE;
610 while (i--)
93e68bfb 611 PL_body_roots[i] = 0;
93e68bfb 612
43c5f42d 613 Safefree(PL_nice_chunk);
bd61b366 614 PL_nice_chunk = NULL;
3280af22
NIS
615 PL_nice_chunk_size = 0;
616 PL_sv_arenaroot = 0;
617 PL_sv_root = 0;
4633a7c4
LW
618}
619
bd81e77b
NC
620/*
621 Here are mid-level routines that manage the allocation of bodies out
622 of the various arenas. There are 5 kinds of arenas:
29489e7c 623
bd81e77b
NC
624 1. SV-head arenas, which are discussed and handled above
625 2. regular body arenas
626 3. arenas for reduced-size bodies
627 4. Hash-Entry arenas
628 5. pte arenas (thread related)
29489e7c 629
bd81e77b
NC
630 Arena types 2 & 3 are chained by body-type off an array of
631 arena-root pointers, which is indexed by svtype. Some of the
632 larger/less used body types are malloced singly, since a large
633 unused block of them is wasteful. Also, several svtypes dont have
634 bodies; the data fits into the sv-head itself. The arena-root
635 pointer thus has a few unused root-pointers (which may be hijacked
636 later for arena types 4,5)
29489e7c 637
bd81e77b
NC
638 3 differs from 2 as an optimization; some body types have several
639 unused fields in the front of the structure (which are kept in-place
640 for consistency). These bodies can be allocated in smaller chunks,
641 because the leading fields arent accessed. Pointers to such bodies
642 are decremented to point at the unused 'ghost' memory, knowing that
643 the pointers are used with offsets to the real memory.
29489e7c 644
bd81e77b
NC
645 HE, HEK arenas are managed separately, with separate code, but may
646 be merge-able later..
647
648 PTE arenas are not sv-bodies, but they share these mid-level
649 mechanics, so are considered here. The new mid-level mechanics rely
650 on the sv_type of the body being allocated, so we just reserve one
651 of the unused body-slots for PTEs, then use it in those (2) PTE
652 contexts below (line ~10k)
653*/
654
bd26d9a3 655/* get_arena(size): this creates custom-sized arenas
5e258f8c
JC
656 TBD: export properly for hv.c: S_more_he().
657*/
658void*
0a848332 659Perl_get_arena(pTHX_ size_t arena_size, U32 misc)
5e258f8c 660{
7a89be66 661 dVAR;
5e258f8c 662 struct arena_desc* adesc;
39244528 663 struct arena_set *aroot = (struct arena_set*) PL_body_arenas;
0a848332 664 unsigned int curr;
5e258f8c 665
476a1e16
JC
666 /* shouldnt need this
667 if (!arena_size) arena_size = PERL_ARENA_SIZE;
668 */
5e258f8c
JC
669
670 /* may need new arena-set to hold new arena */
39244528
NC
671 if (!aroot || aroot->curr >= aroot->set_size) {
672 struct arena_set *newroot;
5e258f8c
JC
673 Newxz(newroot, 1, struct arena_set);
674 newroot->set_size = ARENAS_PER_SET;
39244528
NC
675 newroot->next = aroot;
676 aroot = newroot;
677 PL_body_arenas = (void *) newroot;
52944de8 678 DEBUG_m(PerlIO_printf(Perl_debug_log, "new arenaset %p\n", (void*)aroot));
5e258f8c
JC
679 }
680
681 /* ok, now have arena-set with at least 1 empty/available arena-desc */
39244528
NC
682 curr = aroot->curr++;
683 adesc = &(aroot->set[curr]);
5e258f8c
JC
684 assert(!adesc->arena);
685
89086707 686 Newx(adesc->arena, arena_size, char);
5e258f8c 687 adesc->size = arena_size;
0a848332 688 adesc->misc = misc;
d67b3c53
JH
689 DEBUG_m(PerlIO_printf(Perl_debug_log, "arena %d added: %p size %"UVuf"\n",
690 curr, (void*)adesc->arena, (UV)arena_size));
5e258f8c
JC
691
692 return adesc->arena;
5e258f8c
JC
693}
694
53c1dcc0 695
bd81e77b 696/* return a thing to the free list */
29489e7c 697
bd81e77b
NC
698#define del_body(thing, root) \
699 STMT_START { \
00b6aa41 700 void ** const thing_copy = (void **)thing;\
bd81e77b
NC
701 *thing_copy = *root; \
702 *root = (void*)thing_copy; \
bd81e77b 703 } STMT_END
29489e7c 704
bd81e77b 705/*
d2a0f284
JC
706
707=head1 SV-Body Allocation
708
709Allocation of SV-bodies is similar to SV-heads, differing as follows;
710the allocation mechanism is used for many body types, so is somewhat
711more complicated, it uses arena-sets, and has no need for still-live
712SV detection.
713
714At the outermost level, (new|del)_X*V macros return bodies of the
715appropriate type. These macros call either (new|del)_body_type or
716(new|del)_body_allocated macro pairs, depending on specifics of the
717type. Most body types use the former pair, the latter pair is used to
718allocate body types with "ghost fields".
719
720"ghost fields" are fields that are unused in certain types, and
721consequently dont need to actually exist. They are declared because
722they're part of a "base type", which allows use of functions as
723methods. The simplest examples are AVs and HVs, 2 aggregate types
724which don't use the fields which support SCALAR semantics.
725
726For these types, the arenas are carved up into *_allocated size
727chunks, we thus avoid wasted memory for those unaccessed members.
728When bodies are allocated, we adjust the pointer back in memory by the
729size of the bit not allocated, so it's as if we allocated the full
730structure. (But things will all go boom if you write to the part that
731is "not there", because you'll be overwriting the last members of the
732preceding structure in memory.)
733
734We calculate the correction using the STRUCT_OFFSET macro. For
735example, if xpv_allocated is the same structure as XPV then the two
736OFFSETs sum to zero, and the pointer is unchanged. If the allocated
737structure is smaller (no initial NV actually allocated) then the net
738effect is to subtract the size of the NV from the pointer, to return a
739new pointer as if an initial NV were actually allocated.
740
741This is the same trick as was used for NV and IV bodies. Ironically it
742doesn't need to be used for NV bodies any more, because NV is now at
743the start of the structure. IV bodies don't need it either, because
744they are no longer allocated.
745
746In turn, the new_body_* allocators call S_new_body(), which invokes
747new_body_inline macro, which takes a lock, and takes a body off the
748linked list at PL_body_roots[sv_type], calling S_more_bodies() if
749necessary to refresh an empty list. Then the lock is released, and
750the body is returned.
751
752S_more_bodies calls get_arena(), and carves it up into an array of N
753bodies, which it strings into a linked list. It looks up arena-size
754and body-size from the body_details table described below, thus
755supporting the multiple body-types.
756
757If PURIFY is defined, or PERL_ARENA_SIZE=0, arenas are not used, and
758the (new|del)_X*V macros are mapped directly to malloc/free.
759
760*/
761
762/*
763
764For each sv-type, struct body_details bodies_by_type[] carries
765parameters which control these aspects of SV handling:
766
767Arena_size determines whether arenas are used for this body type, and if
768so, how big they are. PURIFY or PERL_ARENA_SIZE=0 set this field to
769zero, forcing individual mallocs and frees.
770
771Body_size determines how big a body is, and therefore how many fit into
772each arena. Offset carries the body-pointer adjustment needed for
773*_allocated body types, and is used in *_allocated macros.
774
775But its main purpose is to parameterize info needed in
776Perl_sv_upgrade(). The info here dramatically simplifies the function
777vs the implementation in 5.8.7, making it table-driven. All fields
778are used for this, except for arena_size.
779
780For the sv-types that have no bodies, arenas are not used, so those
781PL_body_roots[sv_type] are unused, and can be overloaded. In
782something of a special case, SVt_NULL is borrowed for HE arenas;
783PL_body_roots[SVt_NULL] is filled by S_more_he, but the
784bodies_by_type[SVt_NULL] slot is not used, as the table is not
785available in hv.c,
786
787PTEs also use arenas, but are never seen in Perl_sv_upgrade.
788Nonetheless, they get their own slot in bodies_by_type[SVt_NULL], so
789they can just use the same allocation semantics. At first, PTEs were
790also overloaded to a non-body sv-type, but this yielded hard-to-find
791malloc bugs, so was simplified by claiming a new slot. This choice
792has no consequence at this time.
793
29489e7c
DM
794*/
795
bd81e77b 796struct body_details {
0fb58b32 797 U8 body_size; /* Size to allocate */
10666ae3 798 U8 copy; /* Size of structure to copy (may be shorter) */
0fb58b32 799 U8 offset;
10666ae3
NC
800 unsigned int type : 4; /* We have space for a sanity check. */
801 unsigned int cant_upgrade : 1; /* Cannot upgrade this type */
802 unsigned int zero_nv : 1; /* zero the NV when upgrading from this */
803 unsigned int arena : 1; /* Allocated from an arena */
804 size_t arena_size; /* Size of arena to allocate */
bd81e77b 805};
29489e7c 806
bd81e77b
NC
807#define HADNV FALSE
808#define NONV TRUE
29489e7c 809
d2a0f284 810
bd81e77b
NC
811#ifdef PURIFY
812/* With -DPURFIY we allocate everything directly, and don't use arenas.
813 This seems a rather elegant way to simplify some of the code below. */
814#define HASARENA FALSE
815#else
816#define HASARENA TRUE
817#endif
818#define NOARENA FALSE
29489e7c 819
d2a0f284
JC
820/* Size the arenas to exactly fit a given number of bodies. A count
821 of 0 fits the max number bodies into a PERL_ARENA_SIZE.block,
822 simplifying the default. If count > 0, the arena is sized to fit
823 only that many bodies, allowing arenas to be used for large, rare
824 bodies (XPVFM, XPVIO) without undue waste. The arena size is
825 limited by PERL_ARENA_SIZE, so we can safely oversize the
826 declarations.
827 */
95db5f15
MB
828#define FIT_ARENA0(body_size) \
829 ((size_t)(PERL_ARENA_SIZE / body_size) * body_size)
830#define FIT_ARENAn(count,body_size) \
831 ( count * body_size <= PERL_ARENA_SIZE) \
832 ? count * body_size \
833 : FIT_ARENA0 (body_size)
834#define FIT_ARENA(count,body_size) \
835 count \
836 ? FIT_ARENAn (count, body_size) \
837 : FIT_ARENA0 (body_size)
d2a0f284 838
bd81e77b 839/* A macro to work out the offset needed to subtract from a pointer to (say)
29489e7c 840
bd81e77b
NC
841typedef struct {
842 STRLEN xpv_cur;
843 STRLEN xpv_len;
844} xpv_allocated;
29489e7c 845
bd81e77b 846to make its members accessible via a pointer to (say)
29489e7c 847
bd81e77b
NC
848struct xpv {
849 NV xnv_nv;
850 STRLEN xpv_cur;
851 STRLEN xpv_len;
852};
29489e7c 853
bd81e77b 854*/
29489e7c 855
bd81e77b
NC
856#define relative_STRUCT_OFFSET(longer, shorter, member) \
857 (STRUCT_OFFSET(shorter, member) - STRUCT_OFFSET(longer, member))
29489e7c 858
bd81e77b
NC
859/* Calculate the length to copy. Specifically work out the length less any
860 final padding the compiler needed to add. See the comment in sv_upgrade
861 for why copying the padding proved to be a bug. */
29489e7c 862
bd81e77b
NC
863#define copy_length(type, last_member) \
864 STRUCT_OFFSET(type, last_member) \
865 + sizeof (((type*)SvANY((SV*)0))->last_member)
29489e7c 866
bd81e77b 867static const struct body_details bodies_by_type[] = {
10666ae3
NC
868 { sizeof(HE), 0, 0, SVt_NULL,
869 FALSE, NONV, NOARENA, FIT_ARENA(0, sizeof(HE)) },
d2a0f284 870
1cb9cd50
NC
871 /* The bind placeholder pretends to be an RV for now.
872 Also it's marked as "can't upgrade" top stop anyone using it before it's
873 implemented. */
874 { 0, 0, 0, SVt_BIND, TRUE, NONV, NOARENA, 0 },
875
d2a0f284
JC
876 /* IVs are in the head, so the allocation size is 0.
877 However, the slot is overloaded for PTEs. */
878 { sizeof(struct ptr_tbl_ent), /* This is used for PTEs. */
879 sizeof(IV), /* This is used to copy out the IV body. */
10666ae3 880 STRUCT_OFFSET(XPVIV, xiv_iv), SVt_IV, FALSE, NONV,
d2a0f284
JC
881 NOARENA /* IVS don't need an arena */,
882 /* But PTEs need to know the size of their arena */
883 FIT_ARENA(0, sizeof(struct ptr_tbl_ent))
884 },
885
bd81e77b 886 /* 8 bytes on most ILP32 with IEEE doubles */
10666ae3 887 { sizeof(NV), sizeof(NV), 0, SVt_NV, FALSE, HADNV, HASARENA,
d2a0f284
JC
888 FIT_ARENA(0, sizeof(NV)) },
889
890 /* RVs are in the head now. */
10666ae3 891 { 0, 0, 0, SVt_RV, FALSE, NONV, NOARENA, 0 },
d2a0f284 892
bd81e77b 893 /* 8 bytes on most ILP32 with IEEE doubles */
d2a0f284
JC
894 { sizeof(xpv_allocated),
895 copy_length(XPV, xpv_len)
896 - relative_STRUCT_OFFSET(xpv_allocated, XPV, xpv_cur),
897 + relative_STRUCT_OFFSET(xpv_allocated, XPV, xpv_cur),
10666ae3 898 SVt_PV, FALSE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpv_allocated)) },
d2a0f284 899
bd81e77b 900 /* 12 */
d2a0f284
JC
901 { sizeof(xpviv_allocated),
902 copy_length(XPVIV, xiv_u)
903 - relative_STRUCT_OFFSET(xpviv_allocated, XPVIV, xpv_cur),
904 + relative_STRUCT_OFFSET(xpviv_allocated, XPVIV, xpv_cur),
10666ae3 905 SVt_PVIV, FALSE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpviv_allocated)) },
d2a0f284 906
bd81e77b 907 /* 20 */
10666ae3 908 { sizeof(XPVNV), copy_length(XPVNV, xiv_u), 0, SVt_PVNV, FALSE, HADNV,
d2a0f284
JC
909 HASARENA, FIT_ARENA(0, sizeof(XPVNV)) },
910
bd81e77b 911 /* 28 */
10666ae3 912 { sizeof(XPVMG), copy_length(XPVMG, xmg_stash), 0, SVt_PVMG, FALSE, HADNV,
d2a0f284
JC
913 HASARENA, FIT_ARENA(0, sizeof(XPVMG)) },
914
bd81e77b 915 /* 48 */
10666ae3 916 { sizeof(XPVGV), sizeof(XPVGV), 0, SVt_PVGV, TRUE, HADNV,
d2a0f284
JC
917 HASARENA, FIT_ARENA(0, sizeof(XPVGV)) },
918
bd81e77b 919 /* 64 */
10666ae3 920 { sizeof(XPVLV), sizeof(XPVLV), 0, SVt_PVLV, TRUE, HADNV,
d2a0f284
JC
921 HASARENA, FIT_ARENA(0, sizeof(XPVLV)) },
922
923 { sizeof(xpvav_allocated),
924 copy_length(XPVAV, xmg_stash)
925 - relative_STRUCT_OFFSET(xpvav_allocated, XPVAV, xav_fill),
926 + relative_STRUCT_OFFSET(xpvav_allocated, XPVAV, xav_fill),
9c59bb28 927 SVt_PVAV, TRUE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpvav_allocated)) },
d2a0f284
JC
928
929 { sizeof(xpvhv_allocated),
930 copy_length(XPVHV, xmg_stash)
931 - relative_STRUCT_OFFSET(xpvhv_allocated, XPVHV, xhv_fill),
932 + relative_STRUCT_OFFSET(xpvhv_allocated, XPVHV, xhv_fill),
9c59bb28 933 SVt_PVHV, TRUE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpvhv_allocated)) },
d2a0f284 934
c84c4652 935 /* 56 */
4115f141 936 { sizeof(xpvcv_allocated), sizeof(xpvcv_allocated),
c84c4652 937 + relative_STRUCT_OFFSET(xpvcv_allocated, XPVCV, xpv_cur),
10666ae3 938 SVt_PVCV, TRUE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpvcv_allocated)) },
d2a0f284 939
4115f141 940 { sizeof(xpvfm_allocated), sizeof(xpvfm_allocated),
3038937b 941 + relative_STRUCT_OFFSET(xpvfm_allocated, XPVFM, xpv_cur),
10666ae3 942 SVt_PVFM, TRUE, NONV, NOARENA, FIT_ARENA(20, sizeof(xpvfm_allocated)) },
d2a0f284
JC
943
944 /* XPVIO is 84 bytes, fits 48x */
10666ae3 945 { sizeof(XPVIO), sizeof(XPVIO), 0, SVt_PVIO, TRUE, HADNV,
d2a0f284 946 HASARENA, FIT_ARENA(24, sizeof(XPVIO)) },
bd81e77b 947};
29489e7c 948
d2a0f284
JC
949#define new_body_type(sv_type) \
950 (void *)((char *)S_new_body(aTHX_ sv_type))
29489e7c 951
bd81e77b
NC
952#define del_body_type(p, sv_type) \
953 del_body(p, &PL_body_roots[sv_type])
29489e7c 954
29489e7c 955
bd81e77b 956#define new_body_allocated(sv_type) \
d2a0f284 957 (void *)((char *)S_new_body(aTHX_ sv_type) \
bd81e77b 958 - bodies_by_type[sv_type].offset)
29489e7c 959
bd81e77b
NC
960#define del_body_allocated(p, sv_type) \
961 del_body(p + bodies_by_type[sv_type].offset, &PL_body_roots[sv_type])
29489e7c 962
29489e7c 963
bd81e77b
NC
964#define my_safemalloc(s) (void*)safemalloc(s)
965#define my_safecalloc(s) (void*)safecalloc(s, 1)
966#define my_safefree(p) safefree((char*)p)
29489e7c 967
bd81e77b 968#ifdef PURIFY
29489e7c 969
bd81e77b
NC
970#define new_XNV() my_safemalloc(sizeof(XPVNV))
971#define del_XNV(p) my_safefree(p)
29489e7c 972
bd81e77b
NC
973#define new_XPVNV() my_safemalloc(sizeof(XPVNV))
974#define del_XPVNV(p) my_safefree(p)
29489e7c 975
bd81e77b
NC
976#define new_XPVAV() my_safemalloc(sizeof(XPVAV))
977#define del_XPVAV(p) my_safefree(p)
29489e7c 978
bd81e77b
NC
979#define new_XPVHV() my_safemalloc(sizeof(XPVHV))
980#define del_XPVHV(p) my_safefree(p)
29489e7c 981
bd81e77b
NC
982#define new_XPVMG() my_safemalloc(sizeof(XPVMG))
983#define del_XPVMG(p) my_safefree(p)
29489e7c 984
bd81e77b
NC
985#define new_XPVGV() my_safemalloc(sizeof(XPVGV))
986#define del_XPVGV(p) my_safefree(p)
29489e7c 987
bd81e77b 988#else /* !PURIFY */
29489e7c 989
bd81e77b
NC
990#define new_XNV() new_body_type(SVt_NV)
991#define del_XNV(p) del_body_type(p, SVt_NV)
29489e7c 992
bd81e77b
NC
993#define new_XPVNV() new_body_type(SVt_PVNV)
994#define del_XPVNV(p) del_body_type(p, SVt_PVNV)
29489e7c 995
bd81e77b
NC
996#define new_XPVAV() new_body_allocated(SVt_PVAV)
997#define del_XPVAV(p) del_body_allocated(p, SVt_PVAV)
645c22ef 998
bd81e77b
NC
999#define new_XPVHV() new_body_allocated(SVt_PVHV)
1000#define del_XPVHV(p) del_body_allocated(p, SVt_PVHV)
645c22ef 1001
bd81e77b
NC
1002#define new_XPVMG() new_body_type(SVt_PVMG)
1003#define del_XPVMG(p) del_body_type(p, SVt_PVMG)
645c22ef 1004
bd81e77b
NC
1005#define new_XPVGV() new_body_type(SVt_PVGV)
1006#define del_XPVGV(p) del_body_type(p, SVt_PVGV)
1d7c1841 1007
bd81e77b 1008#endif /* PURIFY */
93e68bfb 1009
bd81e77b 1010/* no arena for you! */
93e68bfb 1011
bd81e77b 1012#define new_NOARENA(details) \
d2a0f284 1013 my_safemalloc((details)->body_size + (details)->offset)
bd81e77b 1014#define new_NOARENAZ(details) \
d2a0f284
JC
1015 my_safecalloc((details)->body_size + (details)->offset)
1016
1017STATIC void *
1018S_more_bodies (pTHX_ svtype sv_type)
1019{
1020 dVAR;
1021 void ** const root = &PL_body_roots[sv_type];
96a5add6 1022 const struct body_details * const bdp = &bodies_by_type[sv_type];
d2a0f284
JC
1023 const size_t body_size = bdp->body_size;
1024 char *start;
1025 const char *end;
0b2d3faa 1026#if defined(DEBUGGING) && !defined(PERL_GLOBAL_STRUCT_PRIVATE)
23e9d66c
NC
1027 static bool done_sanity_check;
1028
0b2d3faa
JH
1029 /* PERL_GLOBAL_STRUCT_PRIVATE cannot coexist with global
1030 * variables like done_sanity_check. */
10666ae3 1031 if (!done_sanity_check) {
ea471437 1032 unsigned int i = SVt_LAST;
10666ae3
NC
1033
1034 done_sanity_check = TRUE;
1035
1036 while (i--)
1037 assert (bodies_by_type[i].type == i);
1038 }
1039#endif
1040
23e9d66c
NC
1041 assert(bdp->arena_size);
1042
0a848332 1043 start = (char*) Perl_get_arena(aTHX_ bdp->arena_size, sv_type);
d2a0f284
JC
1044
1045 end = start + bdp->arena_size - body_size;
1046
d2a0f284
JC
1047 /* computed count doesnt reflect the 1st slot reservation */
1048 DEBUG_m(PerlIO_printf(Perl_debug_log,
1049 "arena %p end %p arena-size %d type %d size %d ct %d\n",
6c9570dc 1050 (void*)start, (void*)end,
0e84aef4
JH
1051 (int)bdp->arena_size, sv_type, (int)body_size,
1052 (int)bdp->arena_size / (int)body_size));
d2a0f284
JC
1053
1054 *root = (void *)start;
1055
1056 while (start < end) {
1057 char * const next = start + body_size;
1058 *(void**) start = (void *)next;
1059 start = next;
1060 }
1061 *(void **)start = 0;
1062
1063 return *root;
1064}
1065
1066/* grab a new thing from the free list, allocating more if necessary.
1067 The inline version is used for speed in hot routines, and the
1068 function using it serves the rest (unless PURIFY).
1069*/
1070#define new_body_inline(xpv, sv_type) \
1071 STMT_START { \
1072 void ** const r3wt = &PL_body_roots[sv_type]; \
11b79775
DD
1073 xpv = (PTR_TBL_ENT_t*) (*((void **)(r3wt)) \
1074 ? *((void **)(r3wt)) : more_bodies(sv_type)); \
d2a0f284 1075 *(r3wt) = *(void**)(xpv); \
d2a0f284
JC
1076 } STMT_END
1077
1078#ifndef PURIFY
1079
1080STATIC void *
1081S_new_body(pTHX_ svtype sv_type)
1082{
1083 dVAR;
1084 void *xpv;
1085 new_body_inline(xpv, sv_type);
1086 return xpv;
1087}
1088
1089#endif
93e68bfb 1090
bd81e77b
NC
1091/*
1092=for apidoc sv_upgrade
93e68bfb 1093
bd81e77b
NC
1094Upgrade an SV to a more complex form. Generally adds a new body type to the
1095SV, then copies across as much information as possible from the old body.
1096You generally want to use the C<SvUPGRADE> macro wrapper. See also C<svtype>.
93e68bfb 1097
bd81e77b 1098=cut
93e68bfb 1099*/
93e68bfb 1100
bd81e77b 1101void
42d0e0b7 1102Perl_sv_upgrade(pTHX_ register SV *sv, svtype new_type)
cac9b346 1103{
97aff369 1104 dVAR;
bd81e77b
NC
1105 void* old_body;
1106 void* new_body;
42d0e0b7 1107 const svtype old_type = SvTYPE(sv);
d2a0f284 1108 const struct body_details *new_type_details;
bd81e77b
NC
1109 const struct body_details *const old_type_details
1110 = bodies_by_type + old_type;
cac9b346 1111
bd81e77b
NC
1112 if (new_type != SVt_PV && SvIsCOW(sv)) {
1113 sv_force_normal_flags(sv, 0);
1114 }
cac9b346 1115
bd81e77b
NC
1116 if (old_type == new_type)
1117 return;
cac9b346 1118
bd81e77b
NC
1119 if (old_type > new_type)
1120 Perl_croak(aTHX_ "sv_upgrade from type %d down to type %d",
1121 (int)old_type, (int)new_type);
cac9b346 1122
cac9b346 1123
bd81e77b 1124 old_body = SvANY(sv);
de042e1d 1125
bd81e77b
NC
1126 /* Copying structures onto other structures that have been neatly zeroed
1127 has a subtle gotcha. Consider XPVMG
cac9b346 1128
bd81e77b
NC
1129 +------+------+------+------+------+-------+-------+
1130 | NV | CUR | LEN | IV | MAGIC | STASH |
1131 +------+------+------+------+------+-------+-------+
1132 0 4 8 12 16 20 24 28
645c22ef 1133
bd81e77b
NC
1134 where NVs are aligned to 8 bytes, so that sizeof that structure is
1135 actually 32 bytes long, with 4 bytes of padding at the end:
08742458 1136
bd81e77b
NC
1137 +------+------+------+------+------+-------+-------+------+
1138 | NV | CUR | LEN | IV | MAGIC | STASH | ??? |
1139 +------+------+------+------+------+-------+-------+------+
1140 0 4 8 12 16 20 24 28 32
08742458 1141
bd81e77b 1142 so what happens if you allocate memory for this structure:
30f9da9e 1143
bd81e77b
NC
1144 +------+------+------+------+------+-------+-------+------+------+...
1145 | NV | CUR | LEN | IV | MAGIC | STASH | GP | NAME |
1146 +------+------+------+------+------+-------+-------+------+------+...
1147 0 4 8 12 16 20 24 28 32 36
bfc44f79 1148
bd81e77b
NC
1149 zero it, then copy sizeof(XPVMG) bytes on top of it? Not quite what you
1150 expect, because you copy the area marked ??? onto GP. Now, ??? may have
1151 started out as zero once, but it's quite possible that it isn't. So now,
1152 rather than a nicely zeroed GP, you have it pointing somewhere random.
1153 Bugs ensue.
bfc44f79 1154
bd81e77b
NC
1155 (In fact, GP ends up pointing at a previous GP structure, because the
1156 principle cause of the padding in XPVMG getting garbage is a copy of
6c9e42f7
NC
1157 sizeof(XPVMG) bytes from a XPVGV structure in sv_unglob. Right now
1158 this happens to be moot because XPVGV has been re-ordered, with GP
1159 no longer after STASH)
30f9da9e 1160
bd81e77b
NC
1161 So we are careful and work out the size of used parts of all the
1162 structures. */
bfc44f79 1163
bd81e77b
NC
1164 switch (old_type) {
1165 case SVt_NULL:
1166 break;
1167 case SVt_IV:
1168 if (new_type < SVt_PVIV) {
1169 new_type = (new_type == SVt_NV)
1170 ? SVt_PVNV : SVt_PVIV;
bd81e77b
NC
1171 }
1172 break;
1173 case SVt_NV:
1174 if (new_type < SVt_PVNV) {
1175 new_type = SVt_PVNV;
bd81e77b
NC
1176 }
1177 break;
1178 case SVt_RV:
1179 break;
1180 case SVt_PV:
1181 assert(new_type > SVt_PV);
1182 assert(SVt_IV < SVt_PV);
1183 assert(SVt_NV < SVt_PV);
1184 break;
1185 case SVt_PVIV:
1186 break;
1187 case SVt_PVNV:
1188 break;
1189 case SVt_PVMG:
1190 /* Because the XPVMG of PL_mess_sv isn't allocated from the arena,
1191 there's no way that it can be safely upgraded, because perl.c
1192 expects to Safefree(SvANY(PL_mess_sv)) */
1193 assert(sv != PL_mess_sv);
1194 /* This flag bit is used to mean other things in other scalar types.
1195 Given that it only has meaning inside the pad, it shouldn't be set
1196 on anything that can get upgraded. */
00b1698f 1197 assert(!SvPAD_TYPED(sv));
bd81e77b
NC
1198 break;
1199 default:
1200 if (old_type_details->cant_upgrade)
c81225bc
NC
1201 Perl_croak(aTHX_ "Can't upgrade %s (%" UVuf ") to %" UVuf,
1202 sv_reftype(sv, 0), (UV) old_type, (UV) new_type);
bd81e77b 1203 }
2fa1109b 1204 new_type_details = bodies_by_type + new_type;
645c22ef 1205
bd81e77b
NC
1206 SvFLAGS(sv) &= ~SVTYPEMASK;
1207 SvFLAGS(sv) |= new_type;
932e9ff9 1208
ab4416c0
NC
1209 /* This can't happen, as SVt_NULL is <= all values of new_type, so one of
1210 the return statements above will have triggered. */
1211 assert (new_type != SVt_NULL);
bd81e77b 1212 switch (new_type) {
bd81e77b
NC
1213 case SVt_IV:
1214 assert(old_type == SVt_NULL);
1215 SvANY(sv) = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
1216 SvIV_set(sv, 0);
1217 return;
1218 case SVt_NV:
1219 assert(old_type == SVt_NULL);
1220 SvANY(sv) = new_XNV();
1221 SvNV_set(sv, 0);
1222 return;
1223 case SVt_RV:
1224 assert(old_type == SVt_NULL);
1225 SvANY(sv) = &sv->sv_u.svu_rv;
1226 SvRV_set(sv, 0);
1227 return;
1228 case SVt_PVHV:
bd81e77b 1229 case SVt_PVAV:
d2a0f284 1230 assert(new_type_details->body_size);
c1ae03ae
NC
1231
1232#ifndef PURIFY
1233 assert(new_type_details->arena);
d2a0f284 1234 assert(new_type_details->arena_size);
c1ae03ae 1235 /* This points to the start of the allocated area. */
d2a0f284
JC
1236 new_body_inline(new_body, new_type);
1237 Zero(new_body, new_type_details->body_size, char);
c1ae03ae
NC
1238 new_body = ((char *)new_body) - new_type_details->offset;
1239#else
1240 /* We always allocated the full length item with PURIFY. To do this
1241 we fake things so that arena is false for all 16 types.. */
1242 new_body = new_NOARENAZ(new_type_details);
1243#endif
1244 SvANY(sv) = new_body;
1245 if (new_type == SVt_PVAV) {
1246 AvMAX(sv) = -1;
1247 AvFILLp(sv) = -1;
1248 AvREAL_only(sv);
1249 }
aeb18a1e 1250
bd81e77b
NC
1251 /* SVt_NULL isn't the only thing upgraded to AV or HV.
1252 The target created by newSVrv also is, and it can have magic.
1253 However, it never has SvPVX set.
1254 */
1255 if (old_type >= SVt_RV) {
1256 assert(SvPVX_const(sv) == 0);
1257 }
aeb18a1e 1258
bd81e77b 1259 if (old_type >= SVt_PVMG) {
e736a858 1260 SvMAGIC_set(sv, ((XPVMG*)old_body)->xmg_u.xmg_magic);
bd81e77b 1261 SvSTASH_set(sv, ((XPVMG*)old_body)->xmg_stash);
797c7171
NC
1262 } else {
1263 sv->sv_u.svu_array = NULL; /* or svu_hash */
bd81e77b
NC
1264 }
1265 break;
93e68bfb 1266
93e68bfb 1267
bd81e77b
NC
1268 case SVt_PVIV:
1269 /* XXX Is this still needed? Was it ever needed? Surely as there is
1270 no route from NV to PVIV, NOK can never be true */
1271 assert(!SvNOKp(sv));
1272 assert(!SvNOK(sv));
1273 case SVt_PVIO:
1274 case SVt_PVFM:
bd81e77b
NC
1275 case SVt_PVGV:
1276 case SVt_PVCV:
1277 case SVt_PVLV:
1278 case SVt_PVMG:
1279 case SVt_PVNV:
1280 case SVt_PV:
93e68bfb 1281
d2a0f284 1282 assert(new_type_details->body_size);
bd81e77b
NC
1283 /* We always allocated the full length item with PURIFY. To do this
1284 we fake things so that arena is false for all 16 types.. */
1285 if(new_type_details->arena) {
1286 /* This points to the start of the allocated area. */
d2a0f284
JC
1287 new_body_inline(new_body, new_type);
1288 Zero(new_body, new_type_details->body_size, char);
bd81e77b
NC
1289 new_body = ((char *)new_body) - new_type_details->offset;
1290 } else {
1291 new_body = new_NOARENAZ(new_type_details);
1292 }
1293 SvANY(sv) = new_body;
5e2fc214 1294
bd81e77b 1295 if (old_type_details->copy) {
f9ba3d20
NC
1296 /* There is now the potential for an upgrade from something without
1297 an offset (PVNV or PVMG) to something with one (PVCV, PVFM) */
1298 int offset = old_type_details->offset;
1299 int length = old_type_details->copy;
1300
1301 if (new_type_details->offset > old_type_details->offset) {
d4c19fe8 1302 const int difference
f9ba3d20
NC
1303 = new_type_details->offset - old_type_details->offset;
1304 offset += difference;
1305 length -= difference;
1306 }
1307 assert (length >= 0);
1308
1309 Copy((char *)old_body + offset, (char *)new_body + offset, length,
1310 char);
bd81e77b
NC
1311 }
1312
1313#ifndef NV_ZERO_IS_ALLBITS_ZERO
f2524eef 1314 /* If NV 0.0 is stores as all bits 0 then Zero() already creates a
e5ce394c
NC
1315 * correct 0.0 for us. Otherwise, if the old body didn't have an
1316 * NV slot, but the new one does, then we need to initialise the
1317 * freshly created NV slot with whatever the correct bit pattern is
1318 * for 0.0 */
e22a937e
NC
1319 if (old_type_details->zero_nv && !new_type_details->zero_nv
1320 && !isGV_with_GP(sv))
bd81e77b 1321 SvNV_set(sv, 0);
82048762 1322#endif
5e2fc214 1323
bd81e77b 1324 if (new_type == SVt_PVIO)
f2524eef 1325 IoPAGE_LEN(sv) = 60;
bd81e77b 1326 if (old_type < SVt_RV)
6136c704 1327 SvPV_set(sv, NULL);
bd81e77b
NC
1328 break;
1329 default:
afd78fd5
JH
1330 Perl_croak(aTHX_ "panic: sv_upgrade to unknown type %lu",
1331 (unsigned long)new_type);
bd81e77b 1332 }
73171d91 1333
d2a0f284
JC
1334 if (old_type_details->arena) {
1335 /* If there was an old body, then we need to free it.
1336 Note that there is an assumption that all bodies of types that
1337 can be upgraded came from arenas. Only the more complex non-
1338 upgradable types are allowed to be directly malloc()ed. */
bd81e77b
NC
1339#ifdef PURIFY
1340 my_safefree(old_body);
1341#else
1342 del_body((void*)((char*)old_body + old_type_details->offset),
1343 &PL_body_roots[old_type]);
1344#endif
1345 }
1346}
73171d91 1347
bd81e77b
NC
1348/*
1349=for apidoc sv_backoff
73171d91 1350
bd81e77b
NC
1351Remove any string offset. You should normally use the C<SvOOK_off> macro
1352wrapper instead.
73171d91 1353
bd81e77b 1354=cut
73171d91
NC
1355*/
1356
bd81e77b
NC
1357int
1358Perl_sv_backoff(pTHX_ register SV *sv)
1359{
96a5add6 1360 PERL_UNUSED_CONTEXT;
bd81e77b
NC
1361 assert(SvOOK(sv));
1362 assert(SvTYPE(sv) != SVt_PVHV);
1363 assert(SvTYPE(sv) != SVt_PVAV);
1364 if (SvIVX(sv)) {
1365 const char * const s = SvPVX_const(sv);
1366 SvLEN_set(sv, SvLEN(sv) + SvIVX(sv));
1367 SvPV_set(sv, SvPVX(sv) - SvIVX(sv));
1368 SvIV_set(sv, 0);
1369 Move(s, SvPVX(sv), SvCUR(sv)+1, char);
1370 }
1371 SvFLAGS(sv) &= ~SVf_OOK;
1372 return 0;
1373}
73171d91 1374
bd81e77b
NC
1375/*
1376=for apidoc sv_grow
73171d91 1377
bd81e77b
NC
1378Expands the character buffer in the SV. If necessary, uses C<sv_unref> and
1379upgrades the SV to C<SVt_PV>. Returns a pointer to the character buffer.
1380Use the C<SvGROW> wrapper instead.
93e68bfb 1381
bd81e77b
NC
1382=cut
1383*/
93e68bfb 1384
bd81e77b
NC
1385char *
1386Perl_sv_grow(pTHX_ register SV *sv, register STRLEN newlen)
1387{
1388 register char *s;
93e68bfb 1389
5db06880
NC
1390 if (PL_madskills && newlen >= 0x100000) {
1391 PerlIO_printf(Perl_debug_log,
1392 "Allocation too large: %"UVxf"\n", (UV)newlen);
1393 }
bd81e77b
NC
1394#ifdef HAS_64K_LIMIT
1395 if (newlen >= 0x10000) {
1396 PerlIO_printf(Perl_debug_log,
1397 "Allocation too large: %"UVxf"\n", (UV)newlen);
1398 my_exit(1);
1399 }
1400#endif /* HAS_64K_LIMIT */
1401 if (SvROK(sv))
1402 sv_unref(sv);
1403 if (SvTYPE(sv) < SVt_PV) {
1404 sv_upgrade(sv, SVt_PV);
1405 s = SvPVX_mutable(sv);
1406 }
1407 else if (SvOOK(sv)) { /* pv is offset? */
1408 sv_backoff(sv);
1409 s = SvPVX_mutable(sv);
1410 if (newlen > SvLEN(sv))
1411 newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
1412#ifdef HAS_64K_LIMIT
1413 if (newlen >= 0x10000)
1414 newlen = 0xFFFF;
1415#endif
1416 }
1417 else
1418 s = SvPVX_mutable(sv);
aeb18a1e 1419
bd81e77b
NC
1420 if (newlen > SvLEN(sv)) { /* need more room? */
1421 newlen = PERL_STRLEN_ROUNDUP(newlen);
1422 if (SvLEN(sv) && s) {
1423#ifdef MYMALLOC
1424 const STRLEN l = malloced_size((void*)SvPVX_const(sv));
1425 if (newlen <= l) {
1426 SvLEN_set(sv, l);
1427 return s;
1428 } else
1429#endif
10edeb5d 1430 s = (char*)saferealloc(s, newlen);
bd81e77b
NC
1431 }
1432 else {
10edeb5d 1433 s = (char*)safemalloc(newlen);
bd81e77b
NC
1434 if (SvPVX_const(sv) && SvCUR(sv)) {
1435 Move(SvPVX_const(sv), s, (newlen < SvCUR(sv)) ? newlen : SvCUR(sv), char);
1436 }
1437 }
1438 SvPV_set(sv, s);
1439 SvLEN_set(sv, newlen);
1440 }
1441 return s;
1442}
aeb18a1e 1443
bd81e77b
NC
1444/*
1445=for apidoc sv_setiv
932e9ff9 1446
bd81e77b
NC
1447Copies an integer into the given SV, upgrading first if necessary.
1448Does not handle 'set' magic. See also C<sv_setiv_mg>.
463ee0b2 1449
bd81e77b
NC
1450=cut
1451*/
463ee0b2 1452
bd81e77b
NC
1453void
1454Perl_sv_setiv(pTHX_ register SV *sv, IV i)
1455{
97aff369 1456 dVAR;
bd81e77b
NC
1457 SV_CHECK_THINKFIRST_COW_DROP(sv);
1458 switch (SvTYPE(sv)) {
1459 case SVt_NULL:
1460 sv_upgrade(sv, SVt_IV);
1461 break;
1462 case SVt_NV:
1463 sv_upgrade(sv, SVt_PVNV);
1464 break;
1465 case SVt_RV:
1466 case SVt_PV:
1467 sv_upgrade(sv, SVt_PVIV);
1468 break;
463ee0b2 1469
bd81e77b
NC
1470 case SVt_PVGV:
1471 case SVt_PVAV:
1472 case SVt_PVHV:
1473 case SVt_PVCV:
1474 case SVt_PVFM:
1475 case SVt_PVIO:
1476 Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
1477 OP_DESC(PL_op));
42d0e0b7 1478 default: NOOP;
bd81e77b
NC
1479 }
1480 (void)SvIOK_only(sv); /* validate number */
1481 SvIV_set(sv, i);
1482 SvTAINT(sv);
1483}
932e9ff9 1484
bd81e77b
NC
1485/*
1486=for apidoc sv_setiv_mg
d33b2eba 1487
bd81e77b 1488Like C<sv_setiv>, but also handles 'set' magic.
1c846c1f 1489
bd81e77b
NC
1490=cut
1491*/
d33b2eba 1492
bd81e77b
NC
1493void
1494Perl_sv_setiv_mg(pTHX_ register SV *sv, IV i)
1495{
1496 sv_setiv(sv,i);
1497 SvSETMAGIC(sv);
1498}
727879eb 1499
bd81e77b
NC
1500/*
1501=for apidoc sv_setuv
d33b2eba 1502
bd81e77b
NC
1503Copies an unsigned integer into the given SV, upgrading first if necessary.
1504Does not handle 'set' magic. See also C<sv_setuv_mg>.
9b94d1dd 1505
bd81e77b
NC
1506=cut
1507*/
d33b2eba 1508
bd81e77b
NC
1509void
1510Perl_sv_setuv(pTHX_ register SV *sv, UV u)
1511{
1512 /* With these two if statements:
1513 u=1.49 s=0.52 cu=72.49 cs=10.64 scripts=270 tests=20865
d33b2eba 1514
bd81e77b
NC
1515 without
1516 u=1.35 s=0.47 cu=73.45 cs=11.43 scripts=270 tests=20865
1c846c1f 1517
bd81e77b
NC
1518 If you wish to remove them, please benchmark to see what the effect is
1519 */
1520 if (u <= (UV)IV_MAX) {
1521 sv_setiv(sv, (IV)u);
1522 return;
1523 }
1524 sv_setiv(sv, 0);
1525 SvIsUV_on(sv);
1526 SvUV_set(sv, u);
1527}
d33b2eba 1528
bd81e77b
NC
1529/*
1530=for apidoc sv_setuv_mg
727879eb 1531
bd81e77b 1532Like C<sv_setuv>, but also handles 'set' magic.
9b94d1dd 1533
bd81e77b
NC
1534=cut
1535*/
5e2fc214 1536
bd81e77b
NC
1537void
1538Perl_sv_setuv_mg(pTHX_ register SV *sv, UV u)
1539{
bd81e77b
NC
1540 sv_setuv(sv,u);
1541 SvSETMAGIC(sv);
1542}
5e2fc214 1543
954c1994 1544/*
bd81e77b 1545=for apidoc sv_setnv
954c1994 1546
bd81e77b
NC
1547Copies a double into the given SV, upgrading first if necessary.
1548Does not handle 'set' magic. See also C<sv_setnv_mg>.
954c1994
GS
1549
1550=cut
1551*/
1552
63f97190 1553void
bd81e77b 1554Perl_sv_setnv(pTHX_ register SV *sv, NV num)
79072805 1555{
97aff369 1556 dVAR;
bd81e77b
NC
1557 SV_CHECK_THINKFIRST_COW_DROP(sv);
1558 switch (SvTYPE(sv)) {
79072805 1559 case SVt_NULL:
79072805 1560 case SVt_IV:
bd81e77b 1561 sv_upgrade(sv, SVt_NV);
79072805 1562 break;
ed6116ce 1563 case SVt_RV:
79072805 1564 case SVt_PV:
79072805 1565 case SVt_PVIV:
bd81e77b 1566 sv_upgrade(sv, SVt_PVNV);
79072805 1567 break;
bd4b1eb5 1568
bd4b1eb5 1569 case SVt_PVGV:
bd81e77b
NC
1570 case SVt_PVAV:
1571 case SVt_PVHV:
79072805 1572 case SVt_PVCV:
bd81e77b
NC
1573 case SVt_PVFM:
1574 case SVt_PVIO:
1575 Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
1576 OP_NAME(PL_op));
42d0e0b7 1577 default: NOOP;
2068cd4d 1578 }
bd81e77b
NC
1579 SvNV_set(sv, num);
1580 (void)SvNOK_only(sv); /* validate number */
1581 SvTAINT(sv);
79072805
LW
1582}
1583
645c22ef 1584/*
bd81e77b 1585=for apidoc sv_setnv_mg
645c22ef 1586
bd81e77b 1587Like C<sv_setnv>, but also handles 'set' magic.
645c22ef
DM
1588
1589=cut
1590*/
1591
bd81e77b
NC
1592void
1593Perl_sv_setnv_mg(pTHX_ register SV *sv, NV num)
79072805 1594{
bd81e77b
NC
1595 sv_setnv(sv,num);
1596 SvSETMAGIC(sv);
79072805
LW
1597}
1598
bd81e77b
NC
1599/* Print an "isn't numeric" warning, using a cleaned-up,
1600 * printable version of the offending string
1601 */
954c1994 1602
bd81e77b
NC
1603STATIC void
1604S_not_a_number(pTHX_ SV *sv)
79072805 1605{
97aff369 1606 dVAR;
bd81e77b
NC
1607 SV *dsv;
1608 char tmpbuf[64];
1609 const char *pv;
94463019
JH
1610
1611 if (DO_UTF8(sv)) {
396482e1 1612 dsv = sv_2mortal(newSVpvs(""));
94463019
JH
1613 pv = sv_uni_display(dsv, sv, 10, 0);
1614 } else {
1615 char *d = tmpbuf;
551405c4 1616 const char * const limit = tmpbuf + sizeof(tmpbuf) - 8;
94463019
JH
1617 /* each *s can expand to 4 chars + "...\0",
1618 i.e. need room for 8 chars */
ecdeb87c 1619
00b6aa41
AL
1620 const char *s = SvPVX_const(sv);
1621 const char * const end = s + SvCUR(sv);
1622 for ( ; s < end && d < limit; s++ ) {
94463019
JH
1623 int ch = *s & 0xFF;
1624 if (ch & 128 && !isPRINT_LC(ch)) {
1625 *d++ = 'M';
1626 *d++ = '-';
1627 ch &= 127;
1628 }
1629 if (ch == '\n') {
1630 *d++ = '\\';
1631 *d++ = 'n';
1632 }
1633 else if (ch == '\r') {
1634 *d++ = '\\';
1635 *d++ = 'r';
1636 }
1637 else if (ch == '\f') {
1638 *d++ = '\\';
1639 *d++ = 'f';
1640 }
1641 else if (ch == '\\') {
1642 *d++ = '\\';
1643 *d++ = '\\';
1644 }
1645 else if (ch == '\0') {
1646 *d++ = '\\';
1647 *d++ = '0';
1648 }
1649 else if (isPRINT_LC(ch))
1650 *d++ = ch;
1651 else {
1652 *d++ = '^';
1653 *d++ = toCTRL(ch);
1654 }
1655 }
1656 if (s < end) {
1657 *d++ = '.';
1658 *d++ = '.';
1659 *d++ = '.';
1660 }
1661 *d = '\0';
1662 pv = tmpbuf;
a0d0e21e 1663 }
a0d0e21e 1664
533c011a 1665 if (PL_op)
9014280d 1666 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019
JH
1667 "Argument \"%s\" isn't numeric in %s", pv,
1668 OP_DESC(PL_op));
a0d0e21e 1669 else
9014280d 1670 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019 1671 "Argument \"%s\" isn't numeric", pv);
a0d0e21e
LW
1672}
1673
c2988b20
NC
1674/*
1675=for apidoc looks_like_number
1676
645c22ef
DM
1677Test if the content of an SV looks like a number (or is a number).
1678C<Inf> and C<Infinity> are treated as numbers (so will not issue a
1679non-numeric warning), even if your atof() doesn't grok them.
c2988b20
NC
1680
1681=cut
1682*/
1683
1684I32
1685Perl_looks_like_number(pTHX_ SV *sv)
1686{
a3b680e6 1687 register const char *sbegin;
c2988b20
NC
1688 STRLEN len;
1689
1690 if (SvPOK(sv)) {
3f7c398e 1691 sbegin = SvPVX_const(sv);
c2988b20
NC
1692 len = SvCUR(sv);
1693 }
1694 else if (SvPOKp(sv))
83003860 1695 sbegin = SvPV_const(sv, len);
c2988b20 1696 else
e0ab1c0e 1697 return SvFLAGS(sv) & (SVf_NOK|SVp_NOK|SVf_IOK|SVp_IOK);
c2988b20
NC
1698 return grok_number(sbegin, len, NULL);
1699}
25da4f38 1700
19f6321d
NC
1701STATIC bool
1702S_glob_2number(pTHX_ GV * const gv)
180488f8
NC
1703{
1704 const U32 wasfake = SvFLAGS(gv) & SVf_FAKE;
1705 SV *const buffer = sv_newmortal();
1706
1707 /* FAKE globs can get coerced, so need to turn this off temporarily if it
1708 is on. */
1709 SvFAKE_off(gv);
1710 gv_efullname3(buffer, gv, "*");
1711 SvFLAGS(gv) |= wasfake;
1712
675c862f
AL
1713 /* We know that all GVs stringify to something that is not-a-number,
1714 so no need to test that. */
1715 if (ckWARN(WARN_NUMERIC))
1716 not_a_number(buffer);
1717 /* We just want something true to return, so that S_sv_2iuv_common
1718 can tail call us and return true. */
19f6321d 1719 return TRUE;
675c862f
AL
1720}
1721
1722STATIC char *
19f6321d 1723S_glob_2pv(pTHX_ GV * const gv, STRLEN * const len)
675c862f
AL
1724{
1725 const U32 wasfake = SvFLAGS(gv) & SVf_FAKE;
1726 SV *const buffer = sv_newmortal();
1727
1728 /* FAKE globs can get coerced, so need to turn this off temporarily if it
1729 is on. */
1730 SvFAKE_off(gv);
1731 gv_efullname3(buffer, gv, "*");
1732 SvFLAGS(gv) |= wasfake;
1733
1734 assert(SvPOK(buffer));
a6d61a6c
NC
1735 if (len) {
1736 *len = SvCUR(buffer);
1737 }
675c862f 1738 return SvPVX(buffer);
180488f8
NC
1739}
1740
25da4f38
IZ
1741/* Actually, ISO C leaves conversion of UV to IV undefined, but
1742 until proven guilty, assume that things are not that bad... */
1743
645c22ef
DM
1744/*
1745 NV_PRESERVES_UV:
1746
1747 As 64 bit platforms often have an NV that doesn't preserve all bits of
28e5dec8
JH
1748 an IV (an assumption perl has been based on to date) it becomes necessary
1749 to remove the assumption that the NV always carries enough precision to
1750 recreate the IV whenever needed, and that the NV is the canonical form.
1751 Instead, IV/UV and NV need to be given equal rights. So as to not lose
645c22ef 1752 precision as a side effect of conversion (which would lead to insanity
28e5dec8
JH
1753 and the dragon(s) in t/op/numconvert.t getting very angry) the intent is
1754 1) to distinguish between IV/UV/NV slots that have cached a valid
1755 conversion where precision was lost and IV/UV/NV slots that have a
1756 valid conversion which has lost no precision
645c22ef 1757 2) to ensure that if a numeric conversion to one form is requested that
28e5dec8
JH
1758 would lose precision, the precise conversion (or differently
1759 imprecise conversion) is also performed and cached, to prevent
1760 requests for different numeric formats on the same SV causing
1761 lossy conversion chains. (lossless conversion chains are perfectly
1762 acceptable (still))
1763
1764
1765 flags are used:
1766 SvIOKp is true if the IV slot contains a valid value
1767 SvIOK is true only if the IV value is accurate (UV if SvIOK_UV true)
1768 SvNOKp is true if the NV slot contains a valid value
1769 SvNOK is true only if the NV value is accurate
1770
1771 so
645c22ef 1772 while converting from PV to NV, check to see if converting that NV to an
28e5dec8
JH
1773 IV(or UV) would lose accuracy over a direct conversion from PV to
1774 IV(or UV). If it would, cache both conversions, return NV, but mark
1775 SV as IOK NOKp (ie not NOK).
1776
645c22ef 1777 While converting from PV to IV, check to see if converting that IV to an
28e5dec8
JH
1778 NV would lose accuracy over a direct conversion from PV to NV. If it
1779 would, cache both conversions, flag similarly.
1780
1781 Before, the SV value "3.2" could become NV=3.2 IV=3 NOK, IOK quite
1782 correctly because if IV & NV were set NV *always* overruled.
645c22ef
DM
1783 Now, "3.2" will become NV=3.2 IV=3 NOK, IOKp, because the flag's meaning
1784 changes - now IV and NV together means that the two are interchangeable:
28e5dec8 1785 SvIVX == (IV) SvNVX && SvNVX == (NV) SvIVX;
d460ef45 1786
645c22ef
DM
1787 The benefit of this is that operations such as pp_add know that if
1788 SvIOK is true for both left and right operands, then integer addition
1789 can be used instead of floating point (for cases where the result won't
1790 overflow). Before, floating point was always used, which could lead to
28e5dec8
JH
1791 loss of precision compared with integer addition.
1792
1793 * making IV and NV equal status should make maths accurate on 64 bit
1794 platforms
1795 * may speed up maths somewhat if pp_add and friends start to use
645c22ef 1796 integers when possible instead of fp. (Hopefully the overhead in
28e5dec8
JH
1797 looking for SvIOK and checking for overflow will not outweigh the
1798 fp to integer speedup)
1799 * will slow down integer operations (callers of SvIV) on "inaccurate"
1800 values, as the change from SvIOK to SvIOKp will cause a call into
1801 sv_2iv each time rather than a macro access direct to the IV slot
1802 * should speed up number->string conversion on integers as IV is
645c22ef 1803 favoured when IV and NV are equally accurate
28e5dec8
JH
1804
1805 ####################################################################
645c22ef
DM
1806 You had better be using SvIOK_notUV if you want an IV for arithmetic:
1807 SvIOK is true if (IV or UV), so you might be getting (IV)SvUV.
1808 On the other hand, SvUOK is true iff UV.
28e5dec8
JH
1809 ####################################################################
1810
645c22ef 1811 Your mileage will vary depending your CPU's relative fp to integer
28e5dec8
JH
1812 performance ratio.
1813*/
1814
1815#ifndef NV_PRESERVES_UV
645c22ef
DM
1816# define IS_NUMBER_UNDERFLOW_IV 1
1817# define IS_NUMBER_UNDERFLOW_UV 2
1818# define IS_NUMBER_IV_AND_UV 2
1819# define IS_NUMBER_OVERFLOW_IV 4
1820# define IS_NUMBER_OVERFLOW_UV 5
1821
1822/* sv_2iuv_non_preserve(): private routine for use by sv_2iv() and sv_2uv() */
28e5dec8
JH
1823
1824/* For sv_2nv these three cases are "SvNOK and don't bother casting" */
1825STATIC int
645c22ef 1826S_sv_2iuv_non_preserve(pTHX_ register SV *sv, I32 numtype)
28e5dec8 1827{
97aff369 1828 dVAR;
b57a0404 1829 PERL_UNUSED_ARG(numtype); /* Used only under DEBUGGING? */
3f7c398e 1830 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
1831 if (SvNVX(sv) < (NV)IV_MIN) {
1832 (void)SvIOKp_on(sv);
1833 (void)SvNOK_on(sv);
45977657 1834 SvIV_set(sv, IV_MIN);
28e5dec8
JH
1835 return IS_NUMBER_UNDERFLOW_IV;
1836 }
1837 if (SvNVX(sv) > (NV)UV_MAX) {
1838 (void)SvIOKp_on(sv);
1839 (void)SvNOK_on(sv);
1840 SvIsUV_on(sv);
607fa7f2 1841 SvUV_set(sv, UV_MAX);
28e5dec8
JH
1842 return IS_NUMBER_OVERFLOW_UV;
1843 }
c2988b20
NC
1844 (void)SvIOKp_on(sv);
1845 (void)SvNOK_on(sv);
1846 /* Can't use strtol etc to convert this string. (See truth table in
1847 sv_2iv */
1848 if (SvNVX(sv) <= (UV)IV_MAX) {
45977657 1849 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
1850 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
1851 SvIOK_on(sv); /* Integer is precise. NOK, IOK */
1852 } else {
1853 /* Integer is imprecise. NOK, IOKp */
1854 }
1855 return SvNVX(sv) < 0 ? IS_NUMBER_UNDERFLOW_UV : IS_NUMBER_IV_AND_UV;
1856 }
1857 SvIsUV_on(sv);
607fa7f2 1858 SvUV_set(sv, U_V(SvNVX(sv)));
c2988b20
NC
1859 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
1860 if (SvUVX(sv) == UV_MAX) {
1861 /* As we know that NVs don't preserve UVs, UV_MAX cannot
1862 possibly be preserved by NV. Hence, it must be overflow.
1863 NOK, IOKp */
1864 return IS_NUMBER_OVERFLOW_UV;
1865 }
1866 SvIOK_on(sv); /* Integer is precise. NOK, UOK */
1867 } else {
1868 /* Integer is imprecise. NOK, IOKp */
28e5dec8 1869 }
c2988b20 1870 return IS_NUMBER_OVERFLOW_IV;
28e5dec8 1871}
645c22ef
DM
1872#endif /* !NV_PRESERVES_UV*/
1873
af359546
NC
1874STATIC bool
1875S_sv_2iuv_common(pTHX_ SV *sv) {
97aff369 1876 dVAR;
af359546 1877 if (SvNOKp(sv)) {
28e5dec8
JH
1878 /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
1879 * without also getting a cached IV/UV from it at the same time
1880 * (ie PV->NV conversion should detect loss of accuracy and cache
af359546
NC
1881 * IV or UV at same time to avoid this. */
1882 /* IV-over-UV optimisation - choose to cache IV if possible */
25da4f38
IZ
1883
1884 if (SvTYPE(sv) == SVt_NV)
1885 sv_upgrade(sv, SVt_PVNV);
1886
28e5dec8
JH
1887 (void)SvIOKp_on(sv); /* Must do this first, to clear any SvOOK */
1888 /* < not <= as for NV doesn't preserve UV, ((NV)IV_MAX+1) will almost
1889 certainly cast into the IV range at IV_MAX, whereas the correct
1890 answer is the UV IV_MAX +1. Hence < ensures that dodgy boundary
1891 cases go to UV */
cab190d4
JD
1892#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1893 if (Perl_isnan(SvNVX(sv))) {
1894 SvUV_set(sv, 0);
1895 SvIsUV_on(sv);
fdbe6d7c 1896 return FALSE;
cab190d4 1897 }
cab190d4 1898#endif
28e5dec8 1899 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
45977657 1900 SvIV_set(sv, I_V(SvNVX(sv)));
28e5dec8
JH
1901 if (SvNVX(sv) == (NV) SvIVX(sv)
1902#ifndef NV_PRESERVES_UV
1903 && (((UV)1 << NV_PRESERVES_UV_BITS) >
1904 (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
1905 /* Don't flag it as "accurately an integer" if the number
1906 came from a (by definition imprecise) NV operation, and
1907 we're outside the range of NV integer precision */
1908#endif
1909 ) {
1910 SvIOK_on(sv); /* Can this go wrong with rounding? NWC */
1911 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 1912 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (precise)\n",
28e5dec8
JH
1913 PTR2UV(sv),
1914 SvNVX(sv),
1915 SvIVX(sv)));
1916
1917 } else {
1918 /* IV not precise. No need to convert from PV, as NV
1919 conversion would already have cached IV if it detected
1920 that PV->IV would be better than PV->NV->IV
1921 flags already correct - don't set public IOK. */
1922 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 1923 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (imprecise)\n",
28e5dec8
JH
1924 PTR2UV(sv),
1925 SvNVX(sv),
1926 SvIVX(sv)));
1927 }
1928 /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
1929 but the cast (NV)IV_MIN rounds to a the value less (more
1930 negative) than IV_MIN which happens to be equal to SvNVX ??
1931 Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
1932 NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
1933 (NV)UVX == NVX are both true, but the values differ. :-(
1934 Hopefully for 2s complement IV_MIN is something like
1935 0x8000000000000000 which will be exact. NWC */
d460ef45 1936 }
25da4f38 1937 else {
607fa7f2 1938 SvUV_set(sv, U_V(SvNVX(sv)));
28e5dec8
JH
1939 if (
1940 (SvNVX(sv) == (NV) SvUVX(sv))
1941#ifndef NV_PRESERVES_UV
1942 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
1943 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
1944 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
1945 /* Don't flag it as "accurately an integer" if the number
1946 came from a (by definition imprecise) NV operation, and
1947 we're outside the range of NV integer precision */
1948#endif
1949 )
1950 SvIOK_on(sv);
25da4f38 1951 SvIsUV_on(sv);
1c846c1f 1952 DEBUG_c(PerlIO_printf(Perl_debug_log,
57def98f 1953 "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
56431972 1954 PTR2UV(sv),
57def98f
JH
1955 SvUVX(sv),
1956 SvUVX(sv)));
25da4f38 1957 }
748a9306
LW
1958 }
1959 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 1960 UV value;
504618e9 1961 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
af359546 1962 /* We want to avoid a possible problem when we cache an IV/ a UV which
25da4f38 1963 may be later translated to an NV, and the resulting NV is not
c2988b20
NC
1964 the same as the direct translation of the initial string
1965 (eg 123.456 can shortcut to the IV 123 with atol(), but we must
1966 be careful to ensure that the value with the .456 is around if the
1967 NV value is requested in the future).
1c846c1f 1968
af359546 1969 This means that if we cache such an IV/a UV, we need to cache the
25da4f38 1970 NV as well. Moreover, we trade speed for space, and do not
28e5dec8 1971 cache the NV if we are sure it's not needed.
25da4f38 1972 */
16b7a9a4 1973
c2988b20
NC
1974 /* SVt_PVNV is one higher than SVt_PVIV, hence this order */
1975 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
1976 == IS_NUMBER_IN_UV) {
5e045b90 1977 /* It's definitely an integer, only upgrade to PVIV */
28e5dec8
JH
1978 if (SvTYPE(sv) < SVt_PVIV)
1979 sv_upgrade(sv, SVt_PVIV);
f7bbb42a 1980 (void)SvIOK_on(sv);
c2988b20
NC
1981 } else if (SvTYPE(sv) < SVt_PVNV)
1982 sv_upgrade(sv, SVt_PVNV);
28e5dec8 1983
f2524eef 1984 /* If NVs preserve UVs then we only use the UV value if we know that
c2988b20
NC
1985 we aren't going to call atof() below. If NVs don't preserve UVs
1986 then the value returned may have more precision than atof() will
1987 return, even though value isn't perfectly accurate. */
1988 if ((numtype & (IS_NUMBER_IN_UV
1989#ifdef NV_PRESERVES_UV
1990 | IS_NUMBER_NOT_INT
1991#endif
1992 )) == IS_NUMBER_IN_UV) {
1993 /* This won't turn off the public IOK flag if it was set above */
1994 (void)SvIOKp_on(sv);
1995
1996 if (!(numtype & IS_NUMBER_NEG)) {
1997 /* positive */;
1998 if (value <= (UV)IV_MAX) {
45977657 1999 SvIV_set(sv, (IV)value);
c2988b20 2000 } else {
af359546 2001 /* it didn't overflow, and it was positive. */
607fa7f2 2002 SvUV_set(sv, value);
c2988b20
NC
2003 SvIsUV_on(sv);
2004 }
2005 } else {
2006 /* 2s complement assumption */
2007 if (value <= (UV)IV_MIN) {
45977657 2008 SvIV_set(sv, -(IV)value);
c2988b20
NC
2009 } else {
2010 /* Too negative for an IV. This is a double upgrade, but
d1be9408 2011 I'm assuming it will be rare. */
c2988b20
NC
2012 if (SvTYPE(sv) < SVt_PVNV)
2013 sv_upgrade(sv, SVt_PVNV);
2014 SvNOK_on(sv);
2015 SvIOK_off(sv);
2016 SvIOKp_on(sv);
9d6ce603 2017 SvNV_set(sv, -(NV)value);
45977657 2018 SvIV_set(sv, IV_MIN);
c2988b20
NC
2019 }
2020 }
2021 }
2022 /* For !NV_PRESERVES_UV and IS_NUMBER_IN_UV and IS_NUMBER_NOT_INT we
2023 will be in the previous block to set the IV slot, and the next
2024 block to set the NV slot. So no else here. */
2025
2026 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2027 != IS_NUMBER_IN_UV) {
2028 /* It wasn't an (integer that doesn't overflow the UV). */
3f7c398e 2029 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8 2030
c2988b20
NC
2031 if (! numtype && ckWARN(WARN_NUMERIC))
2032 not_a_number(sv);
28e5dec8 2033
65202027 2034#if defined(USE_LONG_DOUBLE)
c2988b20
NC
2035 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%" PERL_PRIgldbl ")\n",
2036 PTR2UV(sv), SvNVX(sv)));
65202027 2037#else
1779d84d 2038 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"NVgf")\n",
c2988b20 2039 PTR2UV(sv), SvNVX(sv)));
65202027 2040#endif
28e5dec8 2041
28e5dec8 2042#ifdef NV_PRESERVES_UV
af359546
NC
2043 (void)SvIOKp_on(sv);
2044 (void)SvNOK_on(sv);
2045 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2046 SvIV_set(sv, I_V(SvNVX(sv)));
2047 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2048 SvIOK_on(sv);
2049 } else {
6f207bd3 2050 NOOP; /* Integer is imprecise. NOK, IOKp */
af359546
NC
2051 }
2052 /* UV will not work better than IV */
2053 } else {
2054 if (SvNVX(sv) > (NV)UV_MAX) {
2055 SvIsUV_on(sv);
2056 /* Integer is inaccurate. NOK, IOKp, is UV */
2057 SvUV_set(sv, UV_MAX);
af359546
NC
2058 } else {
2059 SvUV_set(sv, U_V(SvNVX(sv)));
2060 /* 0xFFFFFFFFFFFFFFFF not an issue in here, NVs
2061 NV preservse UV so can do correct comparison. */
2062 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2063 SvIOK_on(sv);
af359546 2064 } else {
6f207bd3 2065 NOOP; /* Integer is imprecise. NOK, IOKp, is UV */
af359546
NC
2066 }
2067 }
4b0c9573 2068 SvIsUV_on(sv);
af359546 2069 }
28e5dec8 2070#else /* NV_PRESERVES_UV */
c2988b20
NC
2071 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2072 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
af359546 2073 /* The IV/UV slot will have been set from value returned by
c2988b20
NC
2074 grok_number above. The NV slot has just been set using
2075 Atof. */
560b0c46 2076 SvNOK_on(sv);
c2988b20
NC
2077 assert (SvIOKp(sv));
2078 } else {
2079 if (((UV)1 << NV_PRESERVES_UV_BITS) >
2080 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2081 /* Small enough to preserve all bits. */
2082 (void)SvIOKp_on(sv);
2083 SvNOK_on(sv);
45977657 2084 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
2085 if ((NV)(SvIVX(sv)) == SvNVX(sv))
2086 SvIOK_on(sv);
2087 /* Assumption: first non-preserved integer is < IV_MAX,
2088 this NV is in the preserved range, therefore: */
2089 if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
2090 < (UV)IV_MAX)) {
32fdb065 2091 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
2092 }
2093 } else {
2094 /* IN_UV NOT_INT
2095 0 0 already failed to read UV.
2096 0 1 already failed to read UV.
2097 1 0 you won't get here in this case. IV/UV
2098 slot set, public IOK, Atof() unneeded.
2099 1 1 already read UV.
2100 so there's no point in sv_2iuv_non_preserve() attempting
2101 to use atol, strtol, strtoul etc. */
40a17c4c 2102 sv_2iuv_non_preserve (sv, numtype);
c2988b20
NC
2103 }
2104 }
28e5dec8 2105#endif /* NV_PRESERVES_UV */
25da4f38 2106 }
af359546
NC
2107 }
2108 else {
675c862f 2109 if (isGV_with_GP(sv))
a0933d07 2110 return glob_2number((GV *)sv);
180488f8 2111
af359546
NC
2112 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
2113 if (!PL_localizing && ckWARN(WARN_UNINITIALIZED))
2114 report_uninit(sv);
2115 }
25da4f38
IZ
2116 if (SvTYPE(sv) < SVt_IV)
2117 /* Typically the caller expects that sv_any is not NULL now. */
2118 sv_upgrade(sv, SVt_IV);
af359546
NC
2119 /* Return 0 from the caller. */
2120 return TRUE;
2121 }
2122 return FALSE;
2123}
2124
2125/*
2126=for apidoc sv_2iv_flags
2127
2128Return the integer value of an SV, doing any necessary string
2129conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2130Normally used via the C<SvIV(sv)> and C<SvIVx(sv)> macros.
2131
2132=cut
2133*/
2134
2135IV
2136Perl_sv_2iv_flags(pTHX_ register SV *sv, I32 flags)
2137{
97aff369 2138 dVAR;
af359546 2139 if (!sv)
a0d0e21e 2140 return 0;
cecf5685
NC
2141 if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
2142 /* FBMs use the same flag bit as SVf_IVisUV, so must let them
50caf62e
NC
2143 cache IVs just in case. In practice it seems that they never
2144 actually anywhere accessible by user Perl code, let alone get used
2145 in anything other than a string context. */
af359546
NC
2146 if (flags & SV_GMAGIC)
2147 mg_get(sv);
2148 if (SvIOKp(sv))
2149 return SvIVX(sv);
2150 if (SvNOKp(sv)) {
2151 return I_V(SvNVX(sv));
2152 }
71c558c3
NC
2153 if (SvPOKp(sv) && SvLEN(sv)) {
2154 UV value;
2155 const int numtype
2156 = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2157
2158 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2159 == IS_NUMBER_IN_UV) {
2160 /* It's definitely an integer */
2161 if (numtype & IS_NUMBER_NEG) {
2162 if (value < (UV)IV_MIN)
2163 return -(IV)value;
2164 } else {
2165 if (value < (UV)IV_MAX)
2166 return (IV)value;
2167 }
2168 }
2169 if (!numtype) {
2170 if (ckWARN(WARN_NUMERIC))
2171 not_a_number(sv);
2172 }
2173 return I_V(Atof(SvPVX_const(sv)));
2174 }
1c7ff15e
NC
2175 if (SvROK(sv)) {
2176 goto return_rok;
af359546 2177 }
1c7ff15e
NC
2178 assert(SvTYPE(sv) >= SVt_PVMG);
2179 /* This falls through to the report_uninit inside S_sv_2iuv_common. */
4cb1ec55 2180 } else if (SvTHINKFIRST(sv)) {
af359546 2181 if (SvROK(sv)) {
1c7ff15e 2182 return_rok:
af359546
NC
2183 if (SvAMAGIC(sv)) {
2184 SV * const tmpstr=AMG_CALLun(sv,numer);
2185 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2186 return SvIV(tmpstr);
2187 }
2188 }
2189 return PTR2IV(SvRV(sv));
2190 }
2191 if (SvIsCOW(sv)) {
2192 sv_force_normal_flags(sv, 0);
2193 }
2194 if (SvREADONLY(sv) && !SvOK(sv)) {
2195 if (ckWARN(WARN_UNINITIALIZED))
2196 report_uninit(sv);
2197 return 0;
2198 }
2199 }
2200 if (!SvIOKp(sv)) {
2201 if (S_sv_2iuv_common(aTHX_ sv))
2202 return 0;
79072805 2203 }
1d7c1841
GS
2204 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
2205 PTR2UV(sv),SvIVX(sv)));
25da4f38 2206 return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
79072805
LW
2207}
2208
645c22ef 2209/*
891f9566 2210=for apidoc sv_2uv_flags
645c22ef
DM
2211
2212Return the unsigned integer value of an SV, doing any necessary string
891f9566
YST
2213conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2214Normally used via the C<SvUV(sv)> and C<SvUVx(sv)> macros.
645c22ef
DM
2215
2216=cut
2217*/
2218
ff68c719 2219UV
891f9566 2220Perl_sv_2uv_flags(pTHX_ register SV *sv, I32 flags)
ff68c719 2221{
97aff369 2222 dVAR;
ff68c719 2223 if (!sv)
2224 return 0;
cecf5685
NC
2225 if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
2226 /* FBMs use the same flag bit as SVf_IVisUV, so must let them
50caf62e 2227 cache IVs just in case. */
891f9566
YST
2228 if (flags & SV_GMAGIC)
2229 mg_get(sv);
ff68c719 2230 if (SvIOKp(sv))
2231 return SvUVX(sv);
2232 if (SvNOKp(sv))
2233 return U_V(SvNVX(sv));
71c558c3
NC
2234 if (SvPOKp(sv) && SvLEN(sv)) {
2235 UV value;
2236 const int numtype
2237 = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2238
2239 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2240 == IS_NUMBER_IN_UV) {
2241 /* It's definitely an integer */
2242 if (!(numtype & IS_NUMBER_NEG))
2243 return value;
2244 }
2245 if (!numtype) {
2246 if (ckWARN(WARN_NUMERIC))
2247 not_a_number(sv);
2248 }
2249 return U_V(Atof(SvPVX_const(sv)));
2250 }
1c7ff15e
NC
2251 if (SvROK(sv)) {
2252 goto return_rok;
3fe9a6f1 2253 }
1c7ff15e
NC
2254 assert(SvTYPE(sv) >= SVt_PVMG);
2255 /* This falls through to the report_uninit inside S_sv_2iuv_common. */
4cb1ec55 2256 } else if (SvTHINKFIRST(sv)) {
ff68c719 2257 if (SvROK(sv)) {
1c7ff15e 2258 return_rok:
deb46114
NC
2259 if (SvAMAGIC(sv)) {
2260 SV *const tmpstr = AMG_CALLun(sv,numer);
2261 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2262 return SvUV(tmpstr);
2263 }
2264 }
2265 return PTR2UV(SvRV(sv));
ff68c719 2266 }
765f542d
NC
2267 if (SvIsCOW(sv)) {
2268 sv_force_normal_flags(sv, 0);
8a818333 2269 }
0336b60e 2270 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2271 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2272 report_uninit(sv);
ff68c719 2273 return 0;
2274 }
2275 }
af359546
NC
2276 if (!SvIOKp(sv)) {
2277 if (S_sv_2iuv_common(aTHX_ sv))
2278 return 0;
ff68c719 2279 }
25da4f38 2280
1d7c1841
GS
2281 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
2282 PTR2UV(sv),SvUVX(sv)));
25da4f38 2283 return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
ff68c719 2284}
2285
645c22ef
DM
2286/*
2287=for apidoc sv_2nv
2288
2289Return the num value of an SV, doing any necessary string or integer
2290conversion, magic etc. Normally used via the C<SvNV(sv)> and C<SvNVx(sv)>
2291macros.
2292
2293=cut
2294*/
2295
65202027 2296NV
864dbfa3 2297Perl_sv_2nv(pTHX_ register SV *sv)
79072805 2298{
97aff369 2299 dVAR;
79072805
LW
2300 if (!sv)
2301 return 0.0;
cecf5685
NC
2302 if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
2303 /* FBMs use the same flag bit as SVf_IVisUV, so must let them
50caf62e 2304 cache IVs just in case. */
463ee0b2
LW
2305 mg_get(sv);
2306 if (SvNOKp(sv))
2307 return SvNVX(sv);
0aa395f8 2308 if ((SvPOKp(sv) && SvLEN(sv)) && !SvIOKp(sv)) {
041457d9 2309 if (!SvIOKp(sv) && ckWARN(WARN_NUMERIC) &&
504618e9 2310 !grok_number(SvPVX_const(sv), SvCUR(sv), NULL))
a0d0e21e 2311 not_a_number(sv);
3f7c398e 2312 return Atof(SvPVX_const(sv));
a0d0e21e 2313 }
25da4f38 2314 if (SvIOKp(sv)) {
1c846c1f 2315 if (SvIsUV(sv))
65202027 2316 return (NV)SvUVX(sv);
25da4f38 2317 else
65202027 2318 return (NV)SvIVX(sv);
47a72cb8
NC
2319 }
2320 if (SvROK(sv)) {
2321 goto return_rok;
2322 }
2323 assert(SvTYPE(sv) >= SVt_PVMG);
2324 /* This falls through to the report_uninit near the end of the
2325 function. */
2326 } else if (SvTHINKFIRST(sv)) {
a0d0e21e 2327 if (SvROK(sv)) {
47a72cb8 2328 return_rok:
deb46114
NC
2329 if (SvAMAGIC(sv)) {
2330 SV *const tmpstr = AMG_CALLun(sv,numer);
2331 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2332 return SvNV(tmpstr);
2333 }
2334 }
2335 return PTR2NV(SvRV(sv));
a0d0e21e 2336 }
765f542d
NC
2337 if (SvIsCOW(sv)) {
2338 sv_force_normal_flags(sv, 0);
8a818333 2339 }
0336b60e 2340 if (SvREADONLY(sv) && !SvOK(sv)) {
599cee73 2341 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2342 report_uninit(sv);
ed6116ce
LW
2343 return 0.0;
2344 }
79072805
LW
2345 }
2346 if (SvTYPE(sv) < SVt_NV) {
7e25a7e9
NC
2347 /* The logic to use SVt_PVNV if necessary is in sv_upgrade. */
2348 sv_upgrade(sv, SVt_NV);
906f284f 2349#ifdef USE_LONG_DOUBLE
097ee67d 2350 DEBUG_c({
f93f4e46 2351 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
2352 PerlIO_printf(Perl_debug_log,
2353 "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
2354 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
2355 RESTORE_NUMERIC_LOCAL();
2356 });
65202027 2357#else
572bbb43 2358 DEBUG_c({
f93f4e46 2359 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 2360 PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%"NVgf")\n",
1d7c1841 2361 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
2362 RESTORE_NUMERIC_LOCAL();
2363 });
572bbb43 2364#endif
79072805
LW
2365 }
2366 else if (SvTYPE(sv) < SVt_PVNV)
2367 sv_upgrade(sv, SVt_PVNV);
59d8ce62
NC
2368 if (SvNOKp(sv)) {
2369 return SvNVX(sv);
61604483 2370 }
59d8ce62 2371 if (SvIOKp(sv)) {
9d6ce603 2372 SvNV_set(sv, SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv));
28e5dec8
JH
2373#ifdef NV_PRESERVES_UV
2374 SvNOK_on(sv);
2375#else
2376 /* Only set the public NV OK flag if this NV preserves the IV */
2377 /* Check it's not 0xFFFFFFFFFFFFFFFF */
2378 if (SvIsUV(sv) ? ((SvUVX(sv) != UV_MAX)&&(SvUVX(sv) == U_V(SvNVX(sv))))
2379 : (SvIVX(sv) == I_V(SvNVX(sv))))
2380 SvNOK_on(sv);
2381 else
2382 SvNOKp_on(sv);
2383#endif
93a17b20 2384 }
748a9306 2385 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 2386 UV value;
3f7c398e 2387 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
041457d9 2388 if (!SvIOKp(sv) && !numtype && ckWARN(WARN_NUMERIC))
a0d0e21e 2389 not_a_number(sv);
28e5dec8 2390#ifdef NV_PRESERVES_UV
c2988b20
NC
2391 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2392 == IS_NUMBER_IN_UV) {
5e045b90 2393 /* It's definitely an integer */
9d6ce603 2394 SvNV_set(sv, (numtype & IS_NUMBER_NEG) ? -(NV)value : (NV)value);
c2988b20 2395 } else
3f7c398e 2396 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8
JH
2397 SvNOK_on(sv);
2398#else
3f7c398e 2399 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8
JH
2400 /* Only set the public NV OK flag if this NV preserves the value in
2401 the PV at least as well as an IV/UV would.
2402 Not sure how to do this 100% reliably. */
2403 /* if that shift count is out of range then Configure's test is
2404 wonky. We shouldn't be in here with NV_PRESERVES_UV_BITS ==
2405 UV_BITS */
2406 if (((UV)1 << NV_PRESERVES_UV_BITS) >
c2988b20 2407 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
28e5dec8 2408 SvNOK_on(sv); /* Definitely small enough to preserve all bits */
c2988b20
NC
2409 } else if (!(numtype & IS_NUMBER_IN_UV)) {
2410 /* Can't use strtol etc to convert this string, so don't try.
2411 sv_2iv and sv_2uv will use the NV to convert, not the PV. */
2412 SvNOK_on(sv);
2413 } else {
2414 /* value has been set. It may not be precise. */
2415 if ((numtype & IS_NUMBER_NEG) && (value > (UV)IV_MIN)) {
2416 /* 2s complement assumption for (UV)IV_MIN */
2417 SvNOK_on(sv); /* Integer is too negative. */
2418 } else {
2419 SvNOKp_on(sv);
2420 SvIOKp_on(sv);
6fa402ec 2421
c2988b20 2422 if (numtype & IS_NUMBER_NEG) {
45977657 2423 SvIV_set(sv, -(IV)value);
c2988b20 2424 } else if (value <= (UV)IV_MAX) {
45977657 2425 SvIV_set(sv, (IV)value);
c2988b20 2426 } else {
607fa7f2 2427 SvUV_set(sv, value);
c2988b20
NC
2428 SvIsUV_on(sv);
2429 }
2430
2431 if (numtype & IS_NUMBER_NOT_INT) {
2432 /* I believe that even if the original PV had decimals,
2433 they are lost beyond the limit of the FP precision.
2434 However, neither is canonical, so both only get p
2435 flags. NWC, 2000/11/25 */
2436 /* Both already have p flags, so do nothing */
2437 } else {
66a1b24b 2438 const NV nv = SvNVX(sv);
c2988b20
NC
2439 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2440 if (SvIVX(sv) == I_V(nv)) {
2441 SvNOK_on(sv);
c2988b20 2442 } else {
c2988b20
NC
2443 /* It had no "." so it must be integer. */
2444 }
00b6aa41 2445 SvIOK_on(sv);
c2988b20
NC
2446 } else {
2447 /* between IV_MAX and NV(UV_MAX).
2448 Could be slightly > UV_MAX */
6fa402ec 2449
c2988b20
NC
2450 if (numtype & IS_NUMBER_NOT_INT) {
2451 /* UV and NV both imprecise. */
2452 } else {
66a1b24b 2453 const UV nv_as_uv = U_V(nv);
c2988b20
NC
2454
2455 if (value == nv_as_uv && SvUVX(sv) != UV_MAX) {
2456 SvNOK_on(sv);
c2988b20 2457 }
00b6aa41 2458 SvIOK_on(sv);
c2988b20
NC
2459 }
2460 }
2461 }
2462 }
2463 }
28e5dec8 2464#endif /* NV_PRESERVES_UV */
93a17b20 2465 }
79072805 2466 else {
f7877b28 2467 if (isGV_with_GP(sv)) {
19f6321d 2468 glob_2number((GV *)sv);
180488f8
NC
2469 return 0.0;
2470 }
2471
041457d9 2472 if (!PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP) && ckWARN(WARN_UNINITIALIZED))
29489e7c 2473 report_uninit(sv);
7e25a7e9
NC
2474 assert (SvTYPE(sv) >= SVt_NV);
2475 /* Typically the caller expects that sv_any is not NULL now. */
2476 /* XXX Ilya implies that this is a bug in callers that assume this
2477 and ideally should be fixed. */
a0d0e21e 2478 return 0.0;
79072805 2479 }
572bbb43 2480#if defined(USE_LONG_DOUBLE)
097ee67d 2481 DEBUG_c({
f93f4e46 2482 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
2483 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
2484 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
2485 RESTORE_NUMERIC_LOCAL();
2486 });
65202027 2487#else
572bbb43 2488 DEBUG_c({
f93f4e46 2489 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 2490 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%"NVgf")\n",
1d7c1841 2491 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
2492 RESTORE_NUMERIC_LOCAL();
2493 });
572bbb43 2494#endif
463ee0b2 2495 return SvNVX(sv);
79072805
LW
2496}
2497
645c22ef
DM
2498/* uiv_2buf(): private routine for use by sv_2pv_flags(): print an IV or
2499 * UV as a string towards the end of buf, and return pointers to start and
2500 * end of it.
2501 *
2502 * We assume that buf is at least TYPE_CHARS(UV) long.
2503 */
2504
864dbfa3 2505static char *
aec46f14 2506S_uiv_2buf(char *buf, IV iv, UV uv, int is_uv, char **peob)
25da4f38 2507{
25da4f38 2508 char *ptr = buf + TYPE_CHARS(UV);
823a54a3 2509 char * const ebuf = ptr;
25da4f38 2510 int sign;
25da4f38
IZ
2511
2512 if (is_uv)
2513 sign = 0;
2514 else if (iv >= 0) {
2515 uv = iv;
2516 sign = 0;
2517 } else {
2518 uv = -iv;
2519 sign = 1;
2520 }
2521 do {
eb160463 2522 *--ptr = '0' + (char)(uv % 10);
25da4f38
IZ
2523 } while (uv /= 10);
2524 if (sign)
2525 *--ptr = '-';
2526 *peob = ebuf;
2527 return ptr;
2528}
2529
645c22ef
DM
2530/*
2531=for apidoc sv_2pv_flags
2532
ff276b08 2533Returns a pointer to the string value of an SV, and sets *lp to its length.
645c22ef
DM
2534If flags includes SV_GMAGIC, does an mg_get() first. Coerces sv to a string
2535if necessary.
2536Normally invoked via the C<SvPV_flags> macro. C<sv_2pv()> and C<sv_2pv_nomg>
2537usually end up here too.
2538
2539=cut
2540*/
2541
8d6d96c1
HS
2542char *
2543Perl_sv_2pv_flags(pTHX_ register SV *sv, STRLEN *lp, I32 flags)
2544{
97aff369 2545 dVAR;
79072805 2546 register char *s;
79072805 2547
463ee0b2 2548 if (!sv) {
cdb061a3
NC
2549 if (lp)
2550 *lp = 0;
73d840c0 2551 return (char *)"";
463ee0b2 2552 }
8990e307 2553 if (SvGMAGICAL(sv)) {
8d6d96c1
HS
2554 if (flags & SV_GMAGIC)
2555 mg_get(sv);
463ee0b2 2556 if (SvPOKp(sv)) {
cdb061a3
NC
2557 if (lp)
2558 *lp = SvCUR(sv);
10516c54
NC
2559 if (flags & SV_MUTABLE_RETURN)
2560 return SvPVX_mutable(sv);
4d84ee25
NC
2561 if (flags & SV_CONST_RETURN)
2562 return (char *)SvPVX_const(sv);
463ee0b2
LW
2563 return SvPVX(sv);
2564 }
75dfc8ec
NC
2565 if (SvIOKp(sv) || SvNOKp(sv)) {
2566 char tbuf[64]; /* Must fit sprintf/Gconvert of longest IV/NV */
75dfc8ec
NC
2567 STRLEN len;
2568
2569 if (SvIOKp(sv)) {
e80fed9d 2570 len = SvIsUV(sv)
d9fad198
JH
2571 ? my_snprintf(tbuf, sizeof(tbuf), "%"UVuf, (UV)SvUVX(sv))
2572 : my_snprintf(tbuf, sizeof(tbuf), "%"IVdf, (IV)SvIVX(sv));
75dfc8ec 2573 } else {
e8ada2d0
NC
2574 Gconvert(SvNVX(sv), NV_DIG, 0, tbuf);
2575 len = strlen(tbuf);
75dfc8ec 2576 }
b5b886f0
NC
2577 assert(!SvROK(sv));
2578 {
75dfc8ec
NC
2579 dVAR;
2580
2581#ifdef FIXNEGATIVEZERO
e8ada2d0
NC
2582 if (len == 2 && tbuf[0] == '-' && tbuf[1] == '0') {
2583 tbuf[0] = '0';
2584 tbuf[1] = 0;
75dfc8ec
NC
2585 len = 1;
2586 }
2587#endif
2588 SvUPGRADE(sv, SVt_PV);
2589 if (lp)
2590 *lp = len;
2591 s = SvGROW_mutable(sv, len + 1);
2592 SvCUR_set(sv, len);
2593 SvPOKp_on(sv);
10edeb5d 2594 return (char*)memcpy(s, tbuf, len + 1);
75dfc8ec 2595 }
463ee0b2 2596 }
1c7ff15e
NC
2597 if (SvROK(sv)) {
2598 goto return_rok;
2599 }
2600 assert(SvTYPE(sv) >= SVt_PVMG);
2601 /* This falls through to the report_uninit near the end of the
2602 function. */
2603 } else if (SvTHINKFIRST(sv)) {
ed6116ce 2604 if (SvROK(sv)) {
1c7ff15e 2605 return_rok:
deb46114
NC
2606 if (SvAMAGIC(sv)) {
2607 SV *const tmpstr = AMG_CALLun(sv,string);
2608 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2609 /* Unwrap this: */
2610 /* char *pv = lp ? SvPV(tmpstr, *lp) : SvPV_nolen(tmpstr);
2611 */
2612
2613 char *pv;
2614 if ((SvFLAGS(tmpstr) & (SVf_POK)) == SVf_POK) {
2615 if (flags & SV_CONST_RETURN) {
2616 pv = (char *) SvPVX_const(tmpstr);
2617 } else {
2618 pv = (flags & SV_MUTABLE_RETURN)
2619 ? SvPVX_mutable(tmpstr) : SvPVX(tmpstr);
2620 }
2621 if (lp)
2622 *lp = SvCUR(tmpstr);
50adf7d2 2623 } else {
deb46114 2624 pv = sv_2pv_flags(tmpstr, lp, flags);
50adf7d2 2625 }
deb46114
NC
2626 if (SvUTF8(tmpstr))
2627 SvUTF8_on(sv);
2628 else
2629 SvUTF8_off(sv);
2630 return pv;
50adf7d2 2631 }
deb46114
NC
2632 }
2633 {
fafee734
NC
2634 STRLEN len;
2635 char *retval;
2636 char *buffer;
f9277f47 2637 MAGIC *mg;
d8eae41e
NC
2638 const SV *const referent = (SV*)SvRV(sv);
2639
2640 if (!referent) {
fafee734
NC
2641 len = 7;
2642 retval = buffer = savepvn("NULLREF", len);
042dae7a
NC
2643 } else if (SvTYPE(referent) == SVt_PVMG
2644 && ((SvFLAGS(referent) &
2645 (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG))
2646 == (SVs_OBJECT|SVs_SMG))
de8c5301
YO
2647 && (mg = mg_find(referent, PERL_MAGIC_qr)))
2648 {
2649 char *str = NULL;
2650 I32 haseval = 0;
60df1e07 2651 U32 flags = 0;
de8c5301
YO
2652 (str) = CALLREG_AS_STR(mg,lp,&flags,&haseval);
2653 if (flags & 1)
2654 SvUTF8_on(sv);
2655 else
2656 SvUTF8_off(sv);
2657 PL_reginterp_cnt += haseval;
2658 return str;
d8eae41e
NC
2659 } else {
2660 const char *const typestr = sv_reftype(referent, 0);
fafee734
NC
2661 const STRLEN typelen = strlen(typestr);
2662 UV addr = PTR2UV(referent);
2663 const char *stashname = NULL;
2664 STRLEN stashnamelen = 0; /* hush, gcc */
2665 const char *buffer_end;
d8eae41e 2666
d8eae41e 2667 if (SvOBJECT(referent)) {
fafee734
NC
2668 const HEK *const name = HvNAME_HEK(SvSTASH(referent));
2669
2670 if (name) {
2671 stashname = HEK_KEY(name);
2672 stashnamelen = HEK_LEN(name);
2673
2674 if (HEK_UTF8(name)) {
2675 SvUTF8_on(sv);
2676 } else {
2677 SvUTF8_off(sv);
2678 }
2679 } else {
2680 stashname = "__ANON__";
2681 stashnamelen = 8;
2682 }
2683 len = stashnamelen + 1 /* = */ + typelen + 3 /* (0x */
2684 + 2 * sizeof(UV) + 2 /* )\0 */;
2685 } else {
2686 len = typelen + 3 /* (0x */
2687 + 2 * sizeof(UV) + 2 /* )\0 */;
d8eae41e 2688 }
fafee734
NC
2689
2690 Newx(buffer, len, char);
2691 buffer_end = retval = buffer + len;
2692
2693 /* Working backwards */
2694 *--retval = '\0';
2695 *--retval = ')';
2696 do {
2697 *--retval = PL_hexdigit[addr & 15];
2698 } while (addr >>= 4);
2699 *--retval = 'x';
2700 *--retval = '0';
2701 *--retval = '(';
2702
2703 retval -= typelen;
2704 memcpy(retval, typestr, typelen);
2705
2706 if (stashname) {
2707 *--retval = '=';
2708 retval -= stashnamelen;
2709 memcpy(retval, stashname, stashnamelen);
2710 }
2711 /* retval may not neccesarily have reached the start of the
2712 buffer here. */
2713 assert (retval >= buffer);
2714
2715 len = buffer_end - retval - 1; /* -1 for that \0 */
c080367d 2716 }
042dae7a 2717 if (lp)
fafee734
NC
2718 *lp = len;
2719 SAVEFREEPV(buffer);
2720 return retval;
463ee0b2 2721 }
79072805 2722 }
0336b60e 2723 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2724 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2725 report_uninit(sv);
cdb061a3
NC
2726 if (lp)
2727 *lp = 0;
73d840c0 2728 return (char *)"";
79072805 2729 }
79072805 2730 }
28e5dec8
JH
2731 if (SvIOK(sv) || ((SvIOKp(sv) && !SvNOKp(sv)))) {
2732 /* I'm assuming that if both IV and NV are equally valid then
2733 converting the IV is going to be more efficient */
e1ec3a88 2734 const U32 isUIOK = SvIsUV(sv);
28e5dec8
JH
2735 char buf[TYPE_CHARS(UV)];
2736 char *ebuf, *ptr;
2737
2738 if (SvTYPE(sv) < SVt_PVIV)
2739 sv_upgrade(sv, SVt_PVIV);
4ea1d550 2740 ptr = uiv_2buf(buf, SvIVX(sv), SvUVX(sv), isUIOK, &ebuf);
5902b6a9
NC
2741 /* inlined from sv_setpvn */
2742 SvGROW_mutable(sv, (STRLEN)(ebuf - ptr + 1));
4d84ee25 2743 Move(ptr,SvPVX_mutable(sv),ebuf - ptr,char);
28e5dec8
JH
2744 SvCUR_set(sv, ebuf - ptr);
2745 s = SvEND(sv);
2746 *s = '\0';
28e5dec8
JH
2747 }
2748 else if (SvNOKp(sv)) {
c81271c3 2749 const int olderrno = errno;
79072805
LW
2750 if (SvTYPE(sv) < SVt_PVNV)
2751 sv_upgrade(sv, SVt_PVNV);
1c846c1f 2752 /* The +20 is pure guesswork. Configure test needed. --jhi */
5902b6a9 2753 s = SvGROW_mutable(sv, NV_DIG + 20);
c81271c3 2754 /* some Xenix systems wipe out errno here */
79072805 2755#ifdef apollo
463ee0b2 2756 if (SvNVX(sv) == 0.0)
d1307786 2757 my_strlcpy(s, "0", SvLEN(sv));
79072805
LW
2758 else
2759#endif /*apollo*/
bbce6d69 2760 {
2d4389e4 2761 Gconvert(SvNVX(sv), NV_DIG, 0, s);
bbce6d69 2762 }
79072805 2763 errno = olderrno;
a0d0e21e
LW
2764#ifdef FIXNEGATIVEZERO
2765 if (*s == '-' && s[1] == '0' && !s[2])
d1307786 2766 my_strlcpy(s, "0", SvLEN(s));
a0d0e21e 2767#endif
79072805
LW
2768 while (*s) s++;
2769#ifdef hcx
2770 if (s[-1] == '.')
46fc3d4c 2771 *--s = '\0';
79072805
LW
2772#endif
2773 }
79072805 2774 else {
675c862f 2775 if (isGV_with_GP(sv))
19f6321d 2776 return glob_2pv((GV *)sv, lp);
180488f8 2777
041457d9 2778 if (!PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP) && ckWARN(WARN_UNINITIALIZED))
29489e7c 2779 report_uninit(sv);
cdb061a3 2780 if (lp)
00b6aa41 2781 *lp = 0;
25da4f38
IZ
2782 if (SvTYPE(sv) < SVt_PV)
2783 /* Typically the caller expects that sv_any is not NULL now. */
2784 sv_upgrade(sv, SVt_PV);
73d840c0 2785 return (char *)"";
79072805 2786 }
cdb061a3 2787 {
823a54a3 2788 const STRLEN len = s - SvPVX_const(sv);
cdb061a3
NC
2789 if (lp)
2790 *lp = len;
2791 SvCUR_set(sv, len);
2792 }
79072805 2793 SvPOK_on(sv);
1d7c1841 2794 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3f7c398e 2795 PTR2UV(sv),SvPVX_const(sv)));
4d84ee25
NC
2796 if (flags & SV_CONST_RETURN)
2797 return (char *)SvPVX_const(sv);
10516c54
NC
2798 if (flags & SV_MUTABLE_RETURN)
2799 return SvPVX_mutable(sv);
463ee0b2
LW
2800 return SvPVX(sv);
2801}
2802
645c22ef 2803/*
6050d10e
JP
2804=for apidoc sv_copypv
2805
2806Copies a stringified representation of the source SV into the
2807destination SV. Automatically performs any necessary mg_get and
54f0641b 2808coercion of numeric values into strings. Guaranteed to preserve
2575c402 2809UTF8 flag even from overloaded objects. Similar in nature to
54f0641b
NIS
2810sv_2pv[_flags] but operates directly on an SV instead of just the
2811string. Mostly uses sv_2pv_flags to do its work, except when that
6050d10e
JP
2812would lose the UTF-8'ness of the PV.
2813
2814=cut
2815*/
2816
2817void
2818Perl_sv_copypv(pTHX_ SV *dsv, register SV *ssv)
2819{
446eaa42 2820 STRLEN len;
53c1dcc0 2821 const char * const s = SvPV_const(ssv,len);
cb50f42d 2822 sv_setpvn(dsv,s,len);
446eaa42 2823 if (SvUTF8(ssv))
cb50f42d 2824 SvUTF8_on(dsv);
446eaa42 2825 else
cb50f42d 2826 SvUTF8_off(dsv);
6050d10e
JP
2827}
2828
2829/*
645c22ef
DM
2830=for apidoc sv_2pvbyte
2831
2832Return a pointer to the byte-encoded representation of the SV, and set *lp
1e54db1a 2833to its length. May cause the SV to be downgraded from UTF-8 as a
645c22ef
DM
2834side-effect.
2835
2836Usually accessed via the C<SvPVbyte> macro.
2837
2838=cut
2839*/
2840
7340a771
GS
2841char *
2842Perl_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
2843{
0875d2fe 2844 sv_utf8_downgrade(sv,0);
97972285 2845 return lp ? SvPV(sv,*lp) : SvPV_nolen(sv);
7340a771
GS
2846}
2847
645c22ef 2848/*
035cbb0e
RGS
2849=for apidoc sv_2pvutf8
2850
2851Return a pointer to the UTF-8-encoded representation of the SV, and set *lp
2852to its length. May cause the SV to be upgraded to UTF-8 as a side-effect.
2853
2854Usually accessed via the C<SvPVutf8> macro.
2855
2856=cut
2857*/
645c22ef 2858
7340a771
GS
2859char *
2860Perl_sv_2pvutf8(pTHX_ register SV *sv, STRLEN *lp)
2861{
035cbb0e
RGS
2862 sv_utf8_upgrade(sv);
2863 return lp ? SvPV(sv,*lp) : SvPV_nolen(sv);
7340a771 2864}
1c846c1f 2865
7ee2227d 2866
645c22ef
DM
2867/*
2868=for apidoc sv_2bool
2869
2870This function is only called on magical items, and is only used by
8cf8f3d1 2871sv_true() or its macro equivalent.
645c22ef
DM
2872
2873=cut
2874*/
2875
463ee0b2 2876bool
864dbfa3 2877Perl_sv_2bool(pTHX_ register SV *sv)
463ee0b2 2878{
97aff369 2879 dVAR;
5b295bef 2880 SvGETMAGIC(sv);
463ee0b2 2881
a0d0e21e
LW
2882 if (!SvOK(sv))
2883 return 0;
2884 if (SvROK(sv)) {
fabdb6c0
AL
2885 if (SvAMAGIC(sv)) {
2886 SV * const tmpsv = AMG_CALLun(sv,bool_);
2887 if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
2888 return (bool)SvTRUE(tmpsv);
2889 }
2890 return SvRV(sv) != 0;
a0d0e21e 2891 }
463ee0b2 2892 if (SvPOKp(sv)) {
53c1dcc0
AL
2893 register XPV* const Xpvtmp = (XPV*)SvANY(sv);
2894 if (Xpvtmp &&
339049b0 2895 (*sv->sv_u.svu_pv > '0' ||
11343788 2896 Xpvtmp->xpv_cur > 1 ||
339049b0 2897 (Xpvtmp->xpv_cur && *sv->sv_u.svu_pv != '0')))
463ee0b2
LW
2898 return 1;
2899 else
2900 return 0;
2901 }
2902 else {
2903 if (SvIOKp(sv))
2904 return SvIVX(sv) != 0;
2905 else {
2906 if (SvNOKp(sv))
2907 return SvNVX(sv) != 0.0;
180488f8 2908 else {
f7877b28 2909 if (isGV_with_GP(sv))
180488f8
NC
2910 return TRUE;
2911 else
2912 return FALSE;
2913 }
463ee0b2
LW
2914 }
2915 }
79072805
LW
2916}
2917
c461cf8f
JH
2918/*
2919=for apidoc sv_utf8_upgrade
2920
78ea37eb 2921Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 2922Forces the SV to string form if it is not already.
4411f3b6
NIS
2923Always sets the SvUTF8 flag to avoid future validity checks even
2924if all the bytes have hibit clear.
c461cf8f 2925
13a6c0e0
JH
2926This is not as a general purpose byte encoding to Unicode interface:
2927use the Encode extension for that.
2928
8d6d96c1
HS
2929=for apidoc sv_utf8_upgrade_flags
2930
78ea37eb 2931Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 2932Forces the SV to string form if it is not already.
8d6d96c1
HS
2933Always sets the SvUTF8 flag to avoid future validity checks even
2934if all the bytes have hibit clear. If C<flags> has C<SV_GMAGIC> bit set,
2935will C<mg_get> on C<sv> if appropriate, else not. C<sv_utf8_upgrade> and
2936C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
2937
13a6c0e0
JH
2938This is not as a general purpose byte encoding to Unicode interface:
2939use the Encode extension for that.
2940
8d6d96c1
HS
2941=cut
2942*/
2943
2944STRLEN
2945Perl_sv_utf8_upgrade_flags(pTHX_ register SV *sv, I32 flags)
2946{
97aff369 2947 dVAR;
808c356f
RGS
2948 if (sv == &PL_sv_undef)
2949 return 0;
e0e62c2a
NIS
2950 if (!SvPOK(sv)) {
2951 STRLEN len = 0;
d52b7888
NC
2952 if (SvREADONLY(sv) && (SvPOKp(sv) || SvIOKp(sv) || SvNOKp(sv))) {
2953 (void) sv_2pv_flags(sv,&len, flags);
2954 if (SvUTF8(sv))
2955 return len;
2956 } else {
2957 (void) SvPV_force(sv,len);
2958 }
e0e62c2a 2959 }
4411f3b6 2960
f5cee72b 2961 if (SvUTF8(sv)) {
5fec3b1d 2962 return SvCUR(sv);
f5cee72b 2963 }
5fec3b1d 2964
765f542d
NC
2965 if (SvIsCOW(sv)) {
2966 sv_force_normal_flags(sv, 0);
db42d148
NIS
2967 }
2968
88632417 2969 if (PL_encoding && !(flags & SV_UTF8_NO_ENCODING))
799ef3cb 2970 sv_recode_to_utf8(sv, PL_encoding);
9f4817db 2971 else { /* Assume Latin-1/EBCDIC */
c4e7c712
NC
2972 /* This function could be much more efficient if we
2973 * had a FLAG in SVs to signal if there are any hibit
2974 * chars in the PV. Given that there isn't such a flag
2975 * make the loop as fast as possible. */
00b6aa41 2976 const U8 * const s = (U8 *) SvPVX_const(sv);
c4420975 2977 const U8 * const e = (U8 *) SvEND(sv);
93524f2b 2978 const U8 *t = s;
c4e7c712
NC
2979
2980 while (t < e) {
53c1dcc0 2981 const U8 ch = *t++;
00b6aa41
AL
2982 /* Check for hi bit */
2983 if (!NATIVE_IS_INVARIANT(ch)) {
2984 STRLEN len = SvCUR(sv) + 1; /* Plus the \0 */
2985 U8 * const recoded = bytes_to_utf8((U8*)s, &len);
2986
2987 SvPV_free(sv); /* No longer using what was there before. */
2988 SvPV_set(sv, (char*)recoded);
2989 SvCUR_set(sv, len - 1);
2990 SvLEN_set(sv, len); /* No longer know the real size. */
c4e7c712 2991 break;
00b6aa41 2992 }
c4e7c712
NC
2993 }
2994 /* Mark as UTF-8 even if no hibit - saves scanning loop */
2995 SvUTF8_on(sv);
560a288e 2996 }
4411f3b6 2997 return SvCUR(sv);
560a288e
GS
2998}
2999
c461cf8f
JH
3000/*
3001=for apidoc sv_utf8_downgrade
3002
78ea37eb
TS
3003Attempts to convert the PV of an SV from characters to bytes.
3004If the PV contains a character beyond byte, this conversion will fail;
3005in this case, either returns false or, if C<fail_ok> is not
c461cf8f
JH
3006true, croaks.
3007
13a6c0e0
JH
3008This is not as a general purpose Unicode to byte encoding interface:
3009use the Encode extension for that.
3010
c461cf8f
JH
3011=cut
3012*/
3013
560a288e
GS
3014bool
3015Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
3016{
97aff369 3017 dVAR;
78ea37eb 3018 if (SvPOKp(sv) && SvUTF8(sv)) {
fa301091 3019 if (SvCUR(sv)) {
03cfe0ae 3020 U8 *s;
652088fc 3021 STRLEN len;
fa301091 3022
765f542d
NC
3023 if (SvIsCOW(sv)) {
3024 sv_force_normal_flags(sv, 0);
3025 }
03cfe0ae
NIS
3026 s = (U8 *) SvPV(sv, len);
3027 if (!utf8_to_bytes(s, &len)) {
fa301091
JH
3028 if (fail_ok)
3029 return FALSE;
3030 else {
3031 if (PL_op)
3032 Perl_croak(aTHX_ "Wide character in %s",
53e06cf0 3033 OP_DESC(PL_op));
fa301091
JH
3034 else
3035 Perl_croak(aTHX_ "Wide character");
3036 }
4b3603a4 3037 }
b162af07 3038 SvCUR_set(sv, len);
67e989fb 3039 }
560a288e 3040 }
ffebcc3e 3041 SvUTF8_off(sv);
560a288e
GS
3042 return TRUE;
3043}
3044
c461cf8f
JH
3045/*
3046=for apidoc sv_utf8_encode
3047
78ea37eb
TS
3048Converts the PV of an SV to UTF-8, but then turns the C<SvUTF8>
3049flag off so that it looks like octets again.
c461cf8f
JH
3050
3051=cut
3052*/
3053
560a288e
GS
3054void
3055Perl_sv_utf8_encode(pTHX_ register SV *sv)
3056{
4c94c214
NC
3057 if (SvIsCOW(sv)) {
3058 sv_force_normal_flags(sv, 0);
3059 }
3060 if (SvREADONLY(sv)) {
3061 Perl_croak(aTHX_ PL_no_modify);
3062 }
a5f5288a 3063 (void) sv_utf8_upgrade(sv);
560a288e
GS
3064 SvUTF8_off(sv);
3065}
3066
4411f3b6
NIS
3067/*
3068=for apidoc sv_utf8_decode
3069
78ea37eb
TS
3070If the PV of the SV is an octet sequence in UTF-8
3071and contains a multiple-byte character, the C<SvUTF8> flag is turned on
3072so that it looks like a character. If the PV contains only single-byte
3073characters, the C<SvUTF8> flag stays being off.
3074Scans PV for validity and returns false if the PV is invalid UTF-8.
4411f3b6
NIS
3075
3076=cut
3077*/
3078
560a288e
GS
3079bool
3080Perl_sv_utf8_decode(pTHX_ register SV *sv)
3081{
78ea37eb 3082 if (SvPOKp(sv)) {
93524f2b
NC
3083 const U8 *c;
3084 const U8 *e;
9cbac4c7 3085
645c22ef
DM
3086 /* The octets may have got themselves encoded - get them back as
3087 * bytes
3088 */
3089 if (!sv_utf8_downgrade(sv, TRUE))
560a288e
GS
3090 return FALSE;
3091
3092 /* it is actually just a matter of turning the utf8 flag on, but
3093 * we want to make sure everything inside is valid utf8 first.
3094 */
93524f2b 3095 c = (const U8 *) SvPVX_const(sv);
63cd0674 3096 if (!is_utf8_string(c, SvCUR(sv)+1))
67e989fb 3097 return FALSE;
93524f2b 3098 e = (const U8 *) SvEND(sv);
511c2ff0 3099 while (c < e) {
b64e5050 3100 const U8 ch = *c++;
c4d5f83a 3101 if (!UTF8_IS_INVARIANT(ch)) {
67e989fb
JH
3102 SvUTF8_on(sv);
3103 break;
3104 }
560a288e 3105 }
560a288e
GS
3106 }
3107 return TRUE;
3108}
3109
954c1994
GS
3110/*
3111=for apidoc sv_setsv
3112
645c22ef
DM
3113Copies the contents of the source SV C<ssv> into the destination SV
3114C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
3115function if the source SV needs to be reused. Does not handle 'set' magic.
3116Loosely speaking, it performs a copy-by-value, obliterating any previous
3117content of the destination.
3118
3119You probably want to use one of the assortment of wrappers, such as
3120C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3121C<SvSetMagicSV_nosteal>.
3122
8d6d96c1
HS
3123=for apidoc sv_setsv_flags
3124
645c22ef
DM
3125Copies the contents of the source SV C<ssv> into the destination SV
3126C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
3127function if the source SV needs to be reused. Does not handle 'set' magic.
3128Loosely speaking, it performs a copy-by-value, obliterating any previous
3129content of the destination.
3130If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
5fcdf167
NC
3131C<ssv> if appropriate, else not. If the C<flags> parameter has the
3132C<NOSTEAL> bit set then the buffers of temps will not be stolen. <sv_setsv>
3133and C<sv_setsv_nomg> are implemented in terms of this function.
645c22ef
DM
3134
3135You probably want to use one of the assortment of wrappers, such as
3136C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3137C<SvSetMagicSV_nosteal>.
3138
3139This is the primary function for copying scalars, and most other
3140copy-ish functions and macros use this underneath.
8d6d96c1
HS
3141
3142=cut
3143*/
3144
5d0301b7 3145static void
2eb42952 3146S_glob_assign_glob(pTHX_ SV *dstr, SV *sstr, const int dtype)
5d0301b7 3147{
dd69841b
BB
3148 I32 method_changed = 0;
3149
5d0301b7
NC
3150 if (dtype != SVt_PVGV) {
3151 const char * const name = GvNAME(sstr);
3152 const STRLEN len = GvNAMELEN(sstr);
0d092c36 3153 {
f7877b28
NC
3154 if (dtype >= SVt_PV) {
3155 SvPV_free(dstr);
3156 SvPV_set(dstr, 0);
3157 SvLEN_set(dstr, 0);
3158 SvCUR_set(dstr, 0);
3159 }
0d092c36 3160 SvUPGRADE(dstr, SVt_PVGV);
dedf8e73 3161 (void)SvOK_off(dstr);
2e5b91de
NC
3162 /* FIXME - why are we doing this, then turning it off and on again
3163 below? */
3164 isGV_with_GP_on(dstr);
f7877b28 3165 }
5d0301b7
NC
3166 GvSTASH(dstr) = GvSTASH(sstr);
3167 if (GvSTASH(dstr))
3168 Perl_sv_add_backref(aTHX_ (SV*)GvSTASH(dstr), dstr);
ae8cc45f 3169 gv_name_set((GV *)dstr, name, len, GV_ADD);
5d0301b7
NC
3170 SvFAKE_on(dstr); /* can coerce to non-glob */
3171 }
3172
3173#ifdef GV_UNIQUE_CHECK
3174 if (GvUNIQUE((GV*)dstr)) {
3175 Perl_croak(aTHX_ PL_no_modify);
3176 }
3177#endif
3178
dd69841b
BB
3179 if(GvGP((GV*)sstr)) {
3180 /* If source has method cache entry, clear it */
3181 if(GvCVGEN(sstr)) {
3182 SvREFCNT_dec(GvCV(sstr));
3183 GvCV(sstr) = NULL;
3184 GvCVGEN(sstr) = 0;
3185 }
3186 /* If source has a real method, then a method is
3187 going to change */
3188 else if(GvCV((GV*)sstr)) {
3189 method_changed = 1;
3190 }
3191 }
3192
3193 /* If dest already had a real method, that's a change as well */
3194 if(!method_changed && GvGP((GV*)dstr) && GvCVu((GV*)dstr)) {
3195 method_changed = 1;
3196 }
3197
f7877b28 3198 gp_free((GV*)dstr);
2e5b91de 3199 isGV_with_GP_off(dstr);
5d0301b7 3200 (void)SvOK_off(dstr);
2e5b91de 3201 isGV_with_GP_on(dstr);
dedf8e73 3202 GvINTRO_off(dstr); /* one-shot flag */
5d0301b7
NC
3203 GvGP(dstr) = gp_ref(GvGP(sstr));
3204 if (SvTAINTED(sstr))
3205 SvTAINT(dstr);
3206 if (GvIMPORTED(dstr) != GVf_IMPORTED
3207 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3208 {
3209 GvIMPORTED_on(dstr);
3210 }
3211 GvMULTI_on(dstr);
dd69841b 3212 if(method_changed) mro_method_changed_in(GvSTASH(dstr));
5d0301b7
NC
3213 return;
3214}
3215
b8473700 3216static void
2eb42952 3217S_glob_assign_ref(pTHX_ SV *dstr, SV *sstr) {
b8473700
NC
3218 SV * const sref = SvREFCNT_inc(SvRV(sstr));
3219 SV *dref = NULL;
3220 const int intro = GvINTRO(dstr);
2440974c 3221 SV **location;
3386d083 3222 U8 import_flag = 0;
27242d61
NC
3223 const U32 stype = SvTYPE(sref);
3224
b8473700
NC
3225
3226#ifdef GV_UNIQUE_CHECK
3227 if (GvUNIQUE((GV*)dstr)) {
3228 Perl_croak(aTHX_ PL_no_modify);
3229 }
3230#endif
3231
3232 if (intro) {
3233 GvINTRO_off(dstr); /* one-shot flag */
3234 GvLINE(dstr) = CopLINE(PL_curcop);
3235 GvEGV(dstr) = (GV*)dstr;
3236 }
3237 GvMULTI_on(dstr);
27242d61 3238 switch (stype) {
b8473700 3239 case SVt_PVCV:
27242d61
NC
3240 location = (SV **) &GvCV(dstr);
3241 import_flag = GVf_IMPORTED_CV;
3242 goto common;
3243 case SVt_PVHV:
3244 location = (SV **) &GvHV(dstr);
3245 import_flag = GVf_IMPORTED_HV;
3246 goto common;
3247 case SVt_PVAV:
3248 location = (SV **) &GvAV(dstr);
3249 import_flag = GVf_IMPORTED_AV;
3250 goto common;
3251 case SVt_PVIO:
3252 location = (SV **) &GvIOp(dstr);
3253 goto common;
3254 case SVt_PVFM:
3255 location = (SV **) &GvFORM(dstr);
3256 default:
3257 location = &GvSV(dstr);
3258 import_flag = GVf_IMPORTED_SV;
3259 common:
b8473700 3260 if (intro) {
27242d61 3261 if (stype == SVt_PVCV) {
5f2fca8a
BB
3262 /*if (GvCVGEN(dstr) && (GvCV(dstr) != (CV*)sref || GvCVGEN(dstr))) {*/
3263 if (GvCVGEN(dstr)) {
27242d61
NC
3264 SvREFCNT_dec(GvCV(dstr));
3265 GvCV(dstr) = NULL;
3266 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
27242d61 3267 }
b8473700 3268 }
27242d61 3269 SAVEGENERICSV(*location);
b8473700
NC
3270 }
3271 else
27242d61 3272 dref = *location;
5f2fca8a 3273 if (stype == SVt_PVCV && (*location != sref || GvCVGEN(dstr))) {
27242d61 3274 CV* const cv = (CV*)*location;
b8473700
NC
3275 if (cv) {
3276 if (!GvCVGEN((GV*)dstr) &&
3277 (CvROOT(cv) || CvXSUB(cv)))
3278 {
3279 /* Redefining a sub - warning is mandatory if
3280 it was a const and its value changed. */
3281 if (CvCONST(cv) && CvCONST((CV*)sref)
3282 && cv_const_sv(cv) == cv_const_sv((CV*)sref)) {
6f207bd3 3283 NOOP;
b8473700
NC
3284 /* They are 2 constant subroutines generated from
3285 the same constant. This probably means that
3286 they are really the "same" proxy subroutine
3287 instantiated in 2 places. Most likely this is
3288 when a constant is exported twice. Don't warn.
3289 */
3290 }
3291 else if (ckWARN(WARN_REDEFINE)
3292 || (CvCONST(cv)
3293 && (!CvCONST((CV*)sref)
3294 || sv_cmp(cv_const_sv(cv),
3295 cv_const_sv((CV*)sref))))) {
3296 Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
10edeb5d
JH
3297 (const char *)
3298 (CvCONST(cv)
3299 ? "Constant subroutine %s::%s redefined"
3300 : "Subroutine %s::%s redefined"),
b8473700
NC
3301 HvNAME_get(GvSTASH((GV*)dstr)),
3302 GvENAME((GV*)dstr));
3303 }
3304 }
3305 if (!intro)
cbf82dd0
NC
3306 cv_ckproto_len(cv, (GV*)dstr,
3307 SvPOK(sref) ? SvPVX_const(sref) : NULL,
3308 SvPOK(sref) ? SvCUR(sref) : 0);
b8473700 3309 }
b8473700
NC
3310 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3311 GvASSUMECV_on(dstr);
dd69841b 3312 if(GvSTASH(dstr)) mro_method_changed_in(GvSTASH(dstr)); /* sub foo { 1 } sub bar { 2 } *bar = \&foo */
b8473700 3313 }
2440974c 3314 *location = sref;
3386d083
NC
3315 if (import_flag && !(GvFLAGS(dstr) & import_flag)
3316 && CopSTASH_ne(PL_curcop, GvSTASH(dstr))) {
3317 GvFLAGS(dstr) |= import_flag;
b8473700
NC
3318 }
3319 break;
3320 }
b37c2d43 3321 SvREFCNT_dec(dref);
b8473700
NC
3322 if (SvTAINTED(sstr))
3323 SvTAINT(dstr);
3324 return;
3325}
3326
8d6d96c1
HS
3327void
3328Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags)
3329{
97aff369 3330 dVAR;
8990e307
LW
3331 register U32 sflags;
3332 register int dtype;
42d0e0b7 3333 register svtype stype;
463ee0b2 3334
79072805
LW
3335 if (sstr == dstr)
3336 return;
29f4f0ab
NC
3337
3338 if (SvIS_FREED(dstr)) {
3339 Perl_croak(aTHX_ "panic: attempt to copy value %" SVf
be2597df 3340 " to a freed scalar %p", SVfARG(sstr), (void *)dstr);
29f4f0ab 3341 }
765f542d 3342 SV_CHECK_THINKFIRST_COW_DROP(dstr);
79072805 3343 if (!sstr)
3280af22 3344 sstr = &PL_sv_undef;
29f4f0ab 3345 if (SvIS_FREED(sstr)) {
6c9570dc
MHM
3346 Perl_croak(aTHX_ "panic: attempt to copy freed scalar %p to %p",
3347 (void*)sstr, (void*)dstr);
29f4f0ab 3348 }
8990e307
LW
3349 stype = SvTYPE(sstr);
3350 dtype = SvTYPE(dstr);
79072805 3351
52944de8 3352 (void)SvAMAGIC_off(dstr);
7a5fa8a2 3353 if ( SvVOK(dstr) )
ece467f9
JP
3354 {
3355 /* need to nuke the magic */
3356 mg_free(dstr);
3357 SvRMAGICAL_off(dstr);
3358 }
9e7bc3e8 3359
463ee0b2 3360 /* There's a lot of redundancy below but we're going for speed here */
79072805 3361
8990e307 3362 switch (stype) {
79072805 3363 case SVt_NULL:
aece5585 3364 undef_sstr:
20408e3c
GS
3365 if (dtype != SVt_PVGV) {
3366 (void)SvOK_off(dstr);
3367 return;
3368 }
3369 break;
463ee0b2 3370 case SVt_IV:
aece5585
GA
3371 if (SvIOK(sstr)) {
3372 switch (dtype) {
3373 case SVt_NULL:
8990e307 3374 sv_upgrade(dstr, SVt_IV);
aece5585
GA
3375 break;
3376 case SVt_NV:
aece5585
GA
3377 case SVt_RV:
3378 case SVt_PV:
a0d0e21e 3379 sv_upgrade(dstr, SVt_PVIV);
aece5585 3380 break;
010be86b
NC
3381 case SVt_PVGV:
3382 goto end_of_first_switch;
aece5585
GA
3383 }
3384 (void)SvIOK_only(dstr);
45977657 3385 SvIV_set(dstr, SvIVX(sstr));
25da4f38
IZ
3386 if (SvIsUV(sstr))
3387 SvIsUV_on(dstr);
37c25af0
NC
3388 /* SvTAINTED can only be true if the SV has taint magic, which in
3389 turn means that the SV type is PVMG (or greater). This is the
3390 case statement for SVt_IV, so this cannot be true (whatever gcov
3391 may say). */
3392 assert(!SvTAINTED(sstr));
aece5585 3393 return;
8990e307 3394 }
aece5585
GA
3395 goto undef_sstr;
3396
463ee0b2 3397 case SVt_NV:
aece5585
GA
3398 if (SvNOK(sstr)) {
3399 switch (dtype) {
3400 case SVt_NULL:
3401 case SVt_IV:
8990e307 3402 sv_upgrade(dstr, SVt_NV);
aece5585
GA
3403 break;
3404 case SVt_RV:
3405 case SVt_PV:
3406 case SVt_PVIV:
a0d0e21e 3407 sv_upgrade(dstr, SVt_PVNV);
aece5585 3408 break;
010be86b
NC
3409 case SVt_PVGV:
3410 goto end_of_first_switch;
aece5585 3411 }
9d6ce603 3412 SvNV_set(dstr, SvNVX(sstr));
aece5585 3413 (void)SvNOK_only(dstr);
37c25af0
NC
3414 /* SvTAINTED can only be true if the SV has taint magic, which in
3415 turn means that the SV type is PVMG (or greater). This is the
3416 case statement for SVt_NV, so this cannot be true (whatever gcov
3417 may say). */
3418 assert(!SvTAINTED(sstr));
aece5585 3419 return;
8990e307 3420 }
aece5585
GA
3421 goto undef_sstr;
3422
ed6116ce 3423 case SVt_RV:
8990e307 3424 if (dtype < SVt_RV)
ed6116ce 3425 sv_upgrade(dstr, SVt_RV);
ed6116ce 3426 break;
fc36a67e 3427 case SVt_PVFM:
f8c7b90f 3428#ifdef PERL_OLD_COPY_ON_WRITE
d89fc664
NC
3429 if ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS) {
3430 if (dtype < SVt_PVIV)
3431 sv_upgrade(dstr, SVt_PVIV);
3432 break;
3433 }
3434 /* Fall through */
3435#endif
3436 case SVt_PV:
8990e307 3437 if (dtype < SVt_PV)
463ee0b2 3438 sv_upgrade(dstr, SVt_PV);
463ee0b2
LW
3439 break;
3440 case SVt_PVIV:
8990e307 3441 if (dtype < SVt_PVIV)
463ee0b2 3442 sv_upgrade(dstr, SVt_PVIV);
463ee0b2
LW
3443 break;
3444 case SVt_PVNV:
8990e307 3445 if (dtype < SVt_PVNV)
463ee0b2 3446 sv_upgrade(dstr, SVt_PVNV);
463ee0b2 3447 break;
489f7bfe 3448 default:
a3b680e6
AL
3449 {
3450 const char * const type = sv_reftype(sstr,0);
533c011a 3451 if (PL_op)
a3b680e6 3452 Perl_croak(aTHX_ "Bizarre copy of %s in %s", type, OP_NAME(PL_op));
4633a7c4 3453 else
a3b680e6
AL
3454 Perl_croak(aTHX_ "Bizarre copy of %s", type);
3455 }
4633a7c4
LW
3456 break;
3457
cecf5685 3458 /* case SVt_BIND: */
39cb70dc 3459 case SVt_PVLV:
79072805 3460 case SVt_PVGV:
cecf5685 3461 if (isGV_with_GP(sstr) && dtype <= SVt_PVGV) {
d4c19fe8 3462 glob_assign_glob(dstr, sstr, dtype);
b8c701c1 3463 return;
79072805 3464 }
cecf5685 3465 /* SvVALID means that this PVGV is playing at being an FBM. */
5f66b61c 3466 /*FALLTHROUGH*/
79072805 3467
489f7bfe 3468 case SVt_PVMG:
8d6d96c1 3469 if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
973f89ab 3470 mg_get(sstr);
1d9c78c6 3471 if (SvTYPE(sstr) != stype) {
973f89ab 3472 stype = SvTYPE(sstr);
cecf5685 3473 if (isGV_with_GP(sstr) && stype == SVt_PVGV && dtype <= SVt_PVGV) {
d4c19fe8 3474 glob_assign_glob(dstr, sstr, dtype);
b8c701c1
NC
3475 return;
3476 }
973f89ab
CS
3477 }
3478 }
ded42b9f 3479 if (stype == SVt_PVLV)
862a34c6 3480 SvUPGRADE(dstr, SVt_PVNV);
ded42b9f 3481 else
42d0e0b7 3482 SvUPGRADE(dstr, (svtype)stype);
79072805 3483 }
010be86b 3484 end_of_first_switch:
79072805 3485
ff920335
NC
3486 /* dstr may have been upgraded. */
3487 dtype = SvTYPE(dstr);
8990e307
LW
3488 sflags = SvFLAGS(sstr);
3489
ba2fdce6 3490 if (dtype == SVt_PVCV || dtype == SVt_PVFM) {
85324b4d
NC
3491 /* Assigning to a subroutine sets the prototype. */
3492 if (SvOK(sstr)) {
3493 STRLEN len;
3494 const char *const ptr = SvPV_const(sstr, len);
3495
3496 SvGROW(dstr, len + 1);
3497 Copy(ptr, SvPVX(dstr), len + 1, char);
3498 SvCUR_set(dstr, len);
fcddd32e 3499 SvPOK_only(dstr);
ba2fdce6 3500 SvFLAGS(dstr) |= sflags & SVf_UTF8;
85324b4d
NC
3501 } else {
3502 SvOK_off(dstr);
3503 }
ba2fdce6
NC
3504 } else if (dtype == SVt_PVAV || dtype == SVt_PVHV) {
3505 const char * const type = sv_reftype(dstr,0);
3506 if (PL_op)
3507 Perl_croak(aTHX_ "Cannot copy to %s in %s", type, OP_NAME(PL_op));
3508 else
3509 Perl_croak(aTHX_ "Cannot copy to %s", type);
85324b4d 3510 } else if (sflags & SVf_ROK) {
cecf5685
NC
3511 if (isGV_with_GP(dstr) && dtype == SVt_PVGV
3512 && SvTYPE(SvRV(sstr)) == SVt_PVGV) {
acaa9288
NC
3513 sstr = SvRV(sstr);
3514 if (sstr == dstr) {
3515 if (GvIMPORTED(dstr) != GVf_IMPORTED
3516 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3517 {
3518 GvIMPORTED_on(dstr);
3519 }
3520 GvMULTI_on(dstr);
3521 return;
3522 }
d4c19fe8 3523 glob_assign_glob(dstr, sstr, dtype);
acaa9288
NC
3524 return;
3525 }
3526
8990e307 3527 if (dtype >= SVt_PV) {
b8c701c1 3528 if (dtype == SVt_PVGV) {
d4c19fe8 3529 glob_assign_ref(dstr, sstr);
b8c701c1
NC
3530 return;
3531 }
3f7c398e 3532 if (SvPVX_const(dstr)) {
8bd4d4c5 3533 SvPV_free(dstr);
b162af07
SP
3534 SvLEN_set(dstr, 0);
3535 SvCUR_set(dstr, 0);
a0d0e21e 3536 }
8990e307 3537 }
a0d0e21e 3538 (void)SvOK_off(dstr);
b162af07 3539 SvRV_set(dstr, SvREFCNT_inc(SvRV(sstr)));
96d4b0ee 3540 SvFLAGS(dstr) |= sflags & SVf_ROK;
dfd48732
NC
3541 assert(!(sflags & SVp_NOK));
3542 assert(!(sflags & SVp_IOK));
3543 assert(!(sflags & SVf_NOK));
3544 assert(!(sflags & SVf_IOK));
ed6116ce 3545 }
cecf5685 3546 else if (dtype == SVt_PVGV && isGV_with_GP(dstr)) {
c0c44674
NC
3547 if (!(sflags & SVf_OK)) {
3548 if (ckWARN(WARN_MISC))
3549 Perl_warner(aTHX_ packWARN(WARN_MISC),
3550 "Undefined value assigned to typeglob");
3551 }
3552 else {
3553 GV *gv = gv_fetchsv(sstr, GV_ADD, SVt_PVGV);
3554 if (dstr != (SV*)gv) {
3555 if (GvGP(dstr))
3556 gp_free((GV*)dstr);
3557 GvGP(dstr) = gp_ref(GvGP(gv));
3558 }
3559 }
3560 }
8990e307 3561 else if (sflags & SVp_POK) {
765f542d 3562 bool isSwipe = 0;
79072805
LW
3563
3564 /*
3565 * Check to see if we can just swipe the string. If so, it's a
3566 * possible small lose on short strings, but a big win on long ones.
3f7c398e
SP
3567 * It might even be a win on short strings if SvPVX_const(dstr)
3568 * has to be allocated and SvPVX_const(sstr) has to be freed.
34482cd6
NC
3569 * Likewise if we can set up COW rather than doing an actual copy, we
3570 * drop to the else clause, as the swipe code and the COW setup code
3571 * have much in common.
79072805
LW
3572 */
3573
120fac95
NC
3574 /* Whichever path we take through the next code, we want this true,
3575 and doing it now facilitates the COW check. */
3576 (void)SvPOK_only(dstr);
3577
765f542d 3578 if (
34482cd6
NC
3579 /* If we're already COW then this clause is not true, and if COW
3580 is allowed then we drop down to the else and make dest COW
3581 with us. If caller hasn't said that we're allowed to COW
3582 shared hash keys then we don't do the COW setup, even if the
3583 source scalar is a shared hash key scalar. */
3584 (((flags & SV_COW_SHARED_HASH_KEYS)
3585 ? (sflags & (SVf_FAKE|SVf_READONLY)) != (SVf_FAKE|SVf_READONLY)
3586 : 1 /* If making a COW copy is forbidden then the behaviour we
3587 desire is as if the source SV isn't actually already
3588 COW, even if it is. So we act as if the source flags
3589 are not COW, rather than actually testing them. */
3590 )
f8c7b90f 3591#ifndef PERL_OLD_COPY_ON_WRITE
34482cd6
NC
3592 /* The change that added SV_COW_SHARED_HASH_KEYS makes the logic
3593 when PERL_OLD_COPY_ON_WRITE is defined a little wrong.
3594 Conceptually PERL_OLD_COPY_ON_WRITE being defined should
3595 override SV_COW_SHARED_HASH_KEYS, because it means "always COW"
3596 but in turn, it's somewhat dead code, never expected to go
3597 live, but more kept as a placeholder on how to do it better
3598 in a newer implementation. */
3599 /* If we are COW and dstr is a suitable target then we drop down
3600 into the else and make dest a COW of us. */
b8f9541a
NC
3601 || (SvFLAGS(dstr) & CAN_COW_MASK) != CAN_COW_FLAGS
3602#endif
3603 )
765f542d 3604 &&
765f542d
NC
3605 !(isSwipe =
3606 (sflags & SVs_TEMP) && /* slated for free anyway? */
3607 !(sflags & SVf_OOK) && /* and not involved in OOK hack? */
5fcdf167
NC
3608 (!(flags & SV_NOSTEAL)) &&
3609 /* and we're allowed to steal temps */
765f542d
NC
3610 SvREFCNT(sstr) == 1 && /* and no other references to it? */
3611 SvLEN(sstr) && /* and really is a string */
645c22ef 3612 /* and won't be needed again, potentially */
765f542d 3613 !(PL_op && PL_op->op_type == OP_AASSIGN))
f8c7b90f 3614#ifdef PERL_OLD_COPY_ON_WRITE
765f542d 3615 && !((sflags & CAN_COW_MASK) == CAN_COW_FLAGS
120fac95 3616 && (SvFLAGS(dstr) & CAN_COW_MASK) == CAN_COW_FLAGS
765f542d
NC
3617 && SvTYPE(sstr) >= SVt_PVIV)
3618#endif
3619 ) {
3620 /* Failed the swipe test, and it's not a shared hash key either.
3621 Have to copy the string. */
3622 STRLEN len = SvCUR(sstr);
3623 SvGROW(dstr, len + 1); /* inlined from sv_setpvn */
3f7c398e 3624 Move(SvPVX_const(sstr),SvPVX(dstr),len,char);
765f542d
NC
3625 SvCUR_set(dstr, len);
3626 *SvEND(dstr) = '\0';
765f542d 3627 } else {
f8c7b90f 3628 /* If PERL_OLD_COPY_ON_WRITE is not defined, then isSwipe will always
765f542d 3629 be true in here. */
765f542d
NC
3630 /* Either it's a shared hash key, or it's suitable for
3631 copy-on-write or we can swipe the string. */
46187eeb 3632 if (DEBUG_C_TEST) {
ed252734 3633 PerlIO_printf(Perl_debug_log, "Copy on write: sstr --> dstr\n");
e419cbc5
NC
3634 sv_dump(sstr);
3635 sv_dump(dstr);
46187eeb 3636 }
f8c7b90f 3637#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
3638 if (!isSwipe) {
3639 /* I believe I should acquire a global SV mutex if
3640 it's a COW sv (not a shared hash key) to stop
3641 it going un copy-on-write.
3642 If the source SV has gone un copy on write between up there
3643 and down here, then (assert() that) it is of the correct
3644 form to make it copy on write again */
3645 if ((sflags & (SVf_FAKE | SVf_READONLY))
3646 != (SVf_FAKE | SVf_READONLY)) {
3647 SvREADONLY_on(sstr);
3648 SvFAKE_on(sstr);
3649 /* Make the source SV into a loop of 1.
3650 (about to become 2) */
a29f6d03 3651 SV_COW_NEXT_SV_SET(sstr, sstr);
765f542d
NC
3652 }
3653 }
3654#endif
3655 /* Initial code is common. */
94010e71
NC
3656 if (SvPVX_const(dstr)) { /* we know that dtype >= SVt_PV */
3657 SvPV_free(dstr);
79072805 3658 }
765f542d 3659
765f542d
NC
3660 if (!isSwipe) {
3661 /* making another shared SV. */
3662 STRLEN cur = SvCUR(sstr);
3663 STRLEN len = SvLEN(sstr);
f8c7b90f 3664#ifdef PERL_OLD_COPY_ON_WRITE
765f542d 3665 if (len) {
b8f9541a 3666 assert (SvTYPE(dstr) >= SVt_PVIV);
765f542d
NC
3667 /* SvIsCOW_normal */
3668 /* splice us in between source and next-after-source. */
a29f6d03
NC
3669 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
3670 SV_COW_NEXT_SV_SET(sstr, dstr);
940132f3 3671 SvPV_set(dstr, SvPVX_mutable(sstr));
a604c751
NC
3672 } else
3673#endif
3674 {
765f542d 3675 /* SvIsCOW_shared_hash */
46187eeb
NC
3676 DEBUG_C(PerlIO_printf(Perl_debug_log,
3677 "Copy on write: Sharing hash\n"));
b8f9541a 3678
bdd68bc3 3679 assert (SvTYPE(dstr) >= SVt_PV);
765f542d 3680 SvPV_set(dstr,
d1db91c6 3681 HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)))));
bdd68bc3 3682 }
87a1ef3d
SP
3683 SvLEN_set(dstr, len);
3684 SvCUR_set(dstr, cur);
765f542d
NC
3685 SvREADONLY_on(dstr);
3686 SvFAKE_on(dstr);
3687 /* Relesase a global SV mutex. */
3688 }
3689 else
765f542d 3690 { /* Passes the swipe test. */
78d1e721 3691 SvPV_set(dstr, SvPVX_mutable(sstr));
765f542d
NC
3692 SvLEN_set(dstr, SvLEN(sstr));
3693 SvCUR_set(dstr, SvCUR(sstr));
3694
3695 SvTEMP_off(dstr);
3696 (void)SvOK_off(sstr); /* NOTE: nukes most SvFLAGS on sstr */
6136c704 3697 SvPV_set(sstr, NULL);
765f542d
NC
3698 SvLEN_set(sstr, 0);
3699 SvCUR_set(sstr, 0);
3700 SvTEMP_off(sstr);
3701 }
3702 }
8990e307 3703 if (sflags & SVp_NOK) {
9d6ce603 3704 SvNV_set(dstr, SvNVX(sstr));
79072805 3705 }
8990e307 3706 if (sflags & SVp_IOK) {
88555484 3707 SvOOK_off(dstr);
23525414
NC
3708 SvIV_set(dstr, SvIVX(sstr));
3709 /* Must do this otherwise some other overloaded use of 0x80000000
3710 gets confused. I guess SVpbm_VALID */
2b1c7e3e 3711 if (sflags & SVf_IVisUV)
25da4f38 3712 SvIsUV_on(dstr);
79072805 3713 }
96d4b0ee 3714 SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_NOK|SVp_NOK|SVf_UTF8);
4f2da183 3715 {
b0a11fe1 3716 const MAGIC * const smg = SvVSTRING_mg(sstr);
4f2da183
NC
3717 if (smg) {
3718 sv_magic(dstr, NULL, PERL_MAGIC_vstring,
3719 smg->mg_ptr, smg->mg_len);
3720 SvRMAGICAL_on(dstr);
3721 }
7a5fa8a2 3722 }
79072805 3723 }
5d581361 3724 else if (sflags & (SVp_IOK|SVp_NOK)) {
c2468cc7 3725 (void)SvOK_off(dstr);
96d4b0ee 3726 SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_IVisUV|SVf_NOK|SVp_NOK);
5d581361
NC
3727 if (sflags & SVp_IOK) {
3728 /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
3729 SvIV_set(dstr, SvIVX(sstr));
3730 }
3332b3c1 3731 if (sflags & SVp_NOK) {
9d6ce603 3732 SvNV_set(dstr, SvNVX(sstr));
3332b3c1
JH
3733 }
3734 }
79072805 3735 else {
f7877b28 3736 if (isGV_with_GP(sstr)) {
180488f8
NC
3737 /* This stringification rule for globs is spread in 3 places.
3738 This feels bad. FIXME. */
3739 const U32 wasfake = sflags & SVf_FAKE;
3740
3741 /* FAKE globs can get coerced, so need to turn this off
3742 temporarily if it is on. */
3743 SvFAKE_off(sstr);
3744 gv_efullname3(dstr, (GV *)sstr, "*");
3745 SvFLAGS(sstr) |= wasfake;
3746 }
20408e3c
GS
3747 else
3748 (void)SvOK_off(dstr);
a0d0e21e 3749 }
27c9684d
AP
3750 if (SvTAINTED(sstr))
3751 SvTAINT(dstr);
79072805
LW
3752}
3753
954c1994
GS
3754/*
3755=for apidoc sv_setsv_mg
3756
3757Like C<sv_setsv>, but also handles 'set' magic.
3758
3759=cut
3760*/
3761
79072805 3762void
864dbfa3 3763Perl_sv_setsv_mg(pTHX_ SV *dstr, register SV *sstr)
ef50df4b
GS
3764{
3765 sv_setsv(dstr,sstr);
3766 SvSETMAGIC(dstr);
3767}
3768
f8c7b90f 3769#ifdef PERL_OLD_COPY_ON_WRITE
ed252734
NC
3770SV *
3771Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
3772{
3773 STRLEN cur = SvCUR(sstr);
3774 STRLEN len = SvLEN(sstr);
3775 register char *new_pv;
3776
3777 if (DEBUG_C_TEST) {
3778 PerlIO_printf(Perl_debug_log, "Fast copy on write: %p -> %p\n",
6c9570dc 3779 (void*)sstr, (void*)dstr);
ed252734
NC
3780 sv_dump(sstr);
3781 if (dstr)
3782 sv_dump(dstr);
3783 }
3784
3785 if (dstr) {
3786 if (SvTHINKFIRST(dstr))
3787 sv_force_normal_flags(dstr, SV_COW_DROP_PV);
3f7c398e
SP
3788 else if (SvPVX_const(dstr))
3789 Safefree(SvPVX_const(dstr));
ed252734
NC
3790 }
3791 else
3792 new_SV(dstr);
862a34c6 3793 SvUPGRADE(dstr, SVt_PVIV);
ed252734
NC
3794
3795 assert (SvPOK(sstr));
3796 assert (SvPOKp(sstr));
3797 assert (!SvIOK(sstr));
3798 assert (!SvIOKp(sstr));
3799 assert (!SvNOK(sstr));
3800 assert (!SvNOKp(sstr));
3801
3802 if (SvIsCOW(sstr)) {
3803
3804 if (SvLEN(sstr) == 0) {
3805 /* source is a COW shared hash key. */
ed252734
NC
3806 DEBUG_C(PerlIO_printf(Perl_debug_log,
3807 "Fast copy on write: Sharing hash\n"));
d1db91c6 3808 new_pv = HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr))));
ed252734
NC
3809 goto common_exit;
3810 }
3811 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
3812 } else {
3813 assert ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS);
862a34c6 3814 SvUPGRADE(sstr, SVt_PVIV);
ed252734
NC
3815 SvREADONLY_on(sstr);
3816 SvFAKE_on(sstr);
3817 DEBUG_C(PerlIO_printf(Perl_debug_log,
3818 "Fast copy on write: Converting sstr to COW\n"));
3819 SV_COW_NEXT_SV_SET(dstr, sstr);
3820 }
3821 SV_COW_NEXT_SV_SET(sstr, dstr);
940132f3 3822 new_pv = SvPVX_mutable(sstr);
ed252734
NC
3823
3824 common_exit:
3825 SvPV_set(dstr, new_pv);
3826 SvFLAGS(dstr) = (SVt_PVIV|SVf_POK|SVp_POK|SVf_FAKE|SVf_READONLY);
3827 if (SvUTF8(sstr))
3828 SvUTF8_on(dstr);
87a1ef3d
SP
3829 SvLEN_set(dstr, len);
3830 SvCUR_set(dstr, cur);
ed252734
NC
3831 if (DEBUG_C_TEST) {
3832 sv_dump(dstr);
3833 }
3834 return dstr;
3835}
3836#endif
3837
954c1994
GS
3838/*
3839=for apidoc sv_setpvn
3840
3841Copies a string into an SV. The C<len> parameter indicates the number of
9e09f5f2
MHM
3842bytes to be copied. If the C<ptr> argument is NULL the SV will become
3843undefined. Does not handle 'set' magic. See C<sv_setpvn_mg>.
954c1994
GS
3844
3845=cut
3846*/
3847
ef50df4b 3848void
864dbfa3 3849Perl_sv_setpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
79072805 3850{
97aff369 3851 dVAR;
c6f8c383 3852 register char *dptr;
22c522df 3853
765f542d 3854 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 3855 if (!ptr) {
a0d0e21e 3856 (void)SvOK_off(sv);
463ee0b2
LW
3857 return;
3858 }
22c522df
JH
3859 else {
3860 /* len is STRLEN which is unsigned, need to copy to signed */
a3b680e6 3861 const IV iv = len;
9c5ffd7c
JH
3862 if (iv < 0)
3863 Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen");
22c522df 3864 }
862a34c6 3865 SvUPGRADE(sv, SVt_PV);
c6f8c383 3866
5902b6a9 3867 dptr = SvGROW(sv, len + 1);
c6f8c383
GA
3868 Move(ptr,dptr,len,char);
3869 dptr[len] = '\0';
79072805 3870 SvCUR_set(sv, len);
1aa99e6b 3871 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 3872 SvTAINT(sv);
79072805
LW
3873}
3874
954c1994
GS
3875/*
3876=for apidoc sv_setpvn_mg
3877
3878Like C<sv_setpvn>, but also handles 'set' magic.
3879
3880=cut
3881*/
3882
79072805 3883void
864dbfa3 3884Perl_sv_setpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
3885{
3886 sv_setpvn(sv,ptr,len);
3887 SvSETMAGIC(sv);
3888}
3889
954c1994
GS
3890/*
3891=for apidoc sv_setpv
3892
3893Copies a string into an SV. The string must be null-terminated. Does not
3894handle 'set' magic. See C<sv_setpv_mg>.
3895
3896=cut
3897*/
3898
ef50df4b 3899void
864dbfa3 3900Perl_sv_setpv(pTHX_ register SV *sv, register const char *ptr)
79072805 3901{
97aff369 3902 dVAR;
79072805
LW
3903 register STRLEN len;
3904
765f542d 3905 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 3906 if (!ptr) {
a0d0e21e 3907 (void)SvOK_off(sv);
463ee0b2
LW
3908 return;
3909 }
79072805 3910 len = strlen(ptr);
862a34c6 3911 SvUPGRADE(sv, SVt_PV);
c6f8c383 3912
79072805 3913 SvGROW(sv, len + 1);
463ee0b2 3914 Move(ptr,SvPVX(sv),len+1,char);
79072805 3915 SvCUR_set(sv, len);
1aa99e6b 3916 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2
LW
3917 SvTAINT(sv);
3918}
3919
954c1994
GS
3920/*
3921=for apidoc sv_setpv_mg
3922
3923Like C<sv_setpv>, but also handles 'set' magic.
3924
3925=cut
3926*/
3927
463ee0b2 3928void
864dbfa3 3929Perl_sv_setpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b
GS
3930{
3931 sv_setpv(sv,ptr);
3932 SvSETMAGIC(sv);
3933}
3934
954c1994 3935/*
47518d95 3936=for apidoc sv_usepvn_flags
954c1994 3937
794a0d33
JH
3938Tells an SV to use C<ptr> to find its string value. Normally the
3939string is stored inside the SV but sv_usepvn allows the SV to use an
3940outside string. The C<ptr> should point to memory that was allocated
c1c21316
NC
3941by C<malloc>. The string length, C<len>, must be supplied. By default
3942this function will realloc (i.e. move) the memory pointed to by C<ptr>,
794a0d33
JH
3943so that pointer should not be freed or used by the programmer after
3944giving it to sv_usepvn, and neither should any pointers from "behind"
c1c21316
NC
3945that pointer (e.g. ptr + 1) be used.
3946
3947If C<flags> & SV_SMAGIC is true, will call SvSETMAGIC. If C<flags> &
3948SV_HAS_TRAILING_NUL is true, then C<ptr[len]> must be NUL, and the realloc
cbf82dd0 3949will be skipped. (i.e. the buffer is actually at least 1 byte longer than
c1c21316 3950C<len>, and already meets the requirements for storing in C<SvPVX>)
954c1994
GS
3951
3952=cut
3953*/
3954
ef50df4b 3955void
47518d95 3956Perl_sv_usepvn_flags(pTHX_ SV *sv, char *ptr, STRLEN len, U32 flags)
463ee0b2 3957{
97aff369 3958 dVAR;
1936d2a7 3959 STRLEN allocate;
765f542d 3960 SV_CHECK_THINKFIRST_COW_DROP(sv);
862a34c6 3961 SvUPGRADE(sv, SVt_PV);
463ee0b2 3962 if (!ptr) {
a0d0e21e 3963 (void)SvOK_off(sv);
47518d95
NC
3964 if (flags & SV_SMAGIC)
3965 SvSETMAGIC(sv);
463ee0b2
LW
3966 return;
3967 }
3f7c398e 3968 if (SvPVX_const(sv))
8bd4d4c5 3969 SvPV_free(sv);
1936d2a7 3970
0b7042f9 3971#ifdef DEBUGGING
2e90b4cd
NC
3972 if (flags & SV_HAS_TRAILING_NUL)
3973 assert(ptr[len] == '\0');
0b7042f9 3974#endif
2e90b4cd 3975
c1c21316 3976 allocate = (flags & SV_HAS_TRAILING_NUL)
8f01dc65 3977 ? len + 1: PERL_STRLEN_ROUNDUP(len + 1);
cbf82dd0
NC
3978 if (flags & SV_HAS_TRAILING_NUL) {
3979 /* It's long enough - do nothing.
3980 Specfically Perl_newCONSTSUB is relying on this. */
3981 } else {
69d25b4f 3982#ifdef DEBUGGING
69d25b4f 3983 /* Force a move to shake out bugs in callers. */
10edeb5d 3984 char *new_ptr = (char*)safemalloc(allocate);
69d25b4f
NC
3985 Copy(ptr, new_ptr, len, char);
3986 PoisonFree(ptr,len,char);
3987 Safefree(ptr);
3988 ptr = new_ptr;
69d25b4f 3989#else
10edeb5d 3990 ptr = (char*) saferealloc (ptr, allocate);
69d25b4f 3991#endif
cbf82dd0 3992 }
f880fe2f 3993 SvPV_set(sv, ptr);
463ee0b2 3994 SvCUR_set(sv, len);
1936d2a7 3995 SvLEN_set(sv, allocate);
c1c21316
NC
3996 if (!(flags & SV_HAS_TRAILING_NUL)) {
3997 *SvEND(sv) = '\0';
3998 }
1aa99e6b 3999 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4000 SvTAINT(sv);
47518d95
NC
4001 if (flags & SV_SMAGIC)
4002 SvSETMAGIC(sv);
ef50df4b
GS
4003}
4004
f8c7b90f 4005#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
4006/* Need to do this *after* making the SV normal, as we need the buffer
4007 pointer to remain valid until after we've copied it. If we let go too early,
4008 another thread could invalidate it by unsharing last of the same hash key
4009 (which it can do by means other than releasing copy-on-write Svs)
4010 or by changing the other copy-on-write SVs in the loop. */
4011STATIC void
5302ffd4 4012S_sv_release_COW(pTHX_ register SV *sv, const char *pvx, SV *after)
765f542d 4013{
5302ffd4 4014 { /* this SV was SvIsCOW_normal(sv) */
765f542d 4015 /* we need to find the SV pointing to us. */
cf5629ad 4016 SV *current = SV_COW_NEXT_SV(after);
7a5fa8a2 4017
765f542d
NC
4018 if (current == sv) {
4019 /* The SV we point to points back to us (there were only two of us
4020 in the loop.)
4021 Hence other SV is no longer copy on write either. */
4022 SvFAKE_off(after);
4023 SvREADONLY_off(after);
4024 } else {
4025 /* We need to follow the pointers around the loop. */
4026 SV *next;
4027 while ((next = SV_COW_NEXT_SV(current)) != sv) {
4028 assert (next);
4029 current = next;
4030 /* don't loop forever if the structure is bust, and we have
4031 a pointer into a closed loop. */
4032 assert (current != after);
3f7c398e 4033 assert (SvPVX_const(current) == pvx);
765f542d
NC
4034 }
4035 /* Make the SV before us point to the SV after us. */
a29f6d03 4036 SV_COW_NEXT_SV_SET(current, after);
765f542d 4037 }
765f542d
NC
4038 }
4039}
765f542d 4040#endif
645c22ef
DM
4041/*
4042=for apidoc sv_force_normal_flags
4043
4044Undo various types of fakery on an SV: if the PV is a shared string, make
4045a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
765f542d
NC
4046an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
4047we do the copy, and is also used locally. If C<SV_COW_DROP_PV> is set
4048then a copy-on-write scalar drops its PV buffer (if any) and becomes
4049SvPOK_off rather than making a copy. (Used where this scalar is about to be
d3050d9d 4050set to some other value.) In addition, the C<flags> parameter gets passed to
765f542d
NC
4051C<sv_unref_flags()> when unrefing. C<sv_force_normal> calls this function
4052with flags set to 0.
645c22ef
DM
4053
4054=cut
4055*/
4056
6fc92669 4057void
840a7b70 4058Perl_sv_force_normal_flags(pTHX_ register SV *sv, U32 flags)
0f15f207 4059{
97aff369 4060 dVAR;
f8c7b90f 4061#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
4062 if (SvREADONLY(sv)) {
4063 /* At this point I believe I should acquire a global SV mutex. */
4064 if (SvFAKE(sv)) {
b64e5050 4065 const char * const pvx = SvPVX_const(sv);
a28509cc
AL
4066 const STRLEN len = SvLEN(sv);
4067 const STRLEN cur = SvCUR(sv);
5302ffd4
NC
4068 /* next COW sv in the loop. If len is 0 then this is a shared-hash
4069 key scalar, so we mustn't attempt to call SV_COW_NEXT_SV(), as
4070 we'll fail an assertion. */
4071 SV * const next = len ? SV_COW_NEXT_SV(sv) : 0;
4072
46187eeb
NC
4073 if (DEBUG_C_TEST) {
4074 PerlIO_printf(Perl_debug_log,
4075 "Copy on write: Force normal %ld\n",
4076 (long) flags);
e419cbc5 4077 sv_dump(sv);
46187eeb 4078 }
765f542d
NC
4079 SvFAKE_off(sv);
4080 SvREADONLY_off(sv);
9f653bb5 4081 /* This SV doesn't own the buffer, so need to Newx() a new one: */
6136c704 4082 SvPV_set(sv, NULL);
87a1ef3d 4083 SvLEN_set(sv, 0);
765f542d
NC
4084 if (flags & SV_COW_DROP_PV) {
4085 /* OK, so we don't need to copy our buffer. */
4086 SvPOK_off(sv);
4087 } else {
4088 SvGROW(sv, cur + 1);
4089 Move(pvx,SvPVX(sv),cur,char);
87a1ef3d 4090 SvCUR_set(sv, cur);
765f542d
NC
4091 *SvEND(sv) = '\0';
4092 }
5302ffd4
NC
4093 if (len) {
4094 sv_release_COW(sv, pvx, next);
4095 } else {
4096 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
4097 }
46187eeb 4098 if (DEBUG_C_TEST) {
e419cbc5 4099 sv_dump(sv);
46187eeb 4100 }
765f542d 4101 }
923e4eb5 4102 else if (IN_PERL_RUNTIME)
765f542d
NC
4103 Perl_croak(aTHX_ PL_no_modify);
4104 /* At this point I believe that I can drop the global SV mutex. */
4105 }
4106#else
2213622d 4107 if (SvREADONLY(sv)) {
1c846c1f 4108 if (SvFAKE(sv)) {
b64e5050 4109 const char * const pvx = SvPVX_const(sv);
66a1b24b 4110 const STRLEN len = SvCUR(sv);
10bcdfd6
NC
4111 SvFAKE_off(sv);
4112 SvREADONLY_off(sv);
bd61b366 4113 SvPV_set(sv, NULL);
66a1b24b 4114 SvLEN_set(sv, 0);
1c846c1f 4115 SvGROW(sv, len + 1);
706aa1c9 4116 Move(pvx,SvPVX(sv),len,char);
1c846c1f 4117 *SvEND(sv) = '\0';
bdd68bc3 4118 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
1c846c1f 4119 }
923e4eb5 4120 else if (IN_PERL_RUNTIME)
cea2e8a9 4121 Perl_croak(aTHX_ PL_no_modify);
0f15f207 4122 }
765f542d 4123#endif
2213622d 4124 if (SvROK(sv))
840a7b70 4125 sv_unref_flags(sv, flags);
6fc92669
GS
4126 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
4127 sv_unglob(sv);
0f15f207 4128}
1c846c1f 4129
645c22ef 4130/*
954c1994
GS
4131=for apidoc sv_chop
4132
1c846c1f 4133Efficient removal of characters from the beginning of the string buffer.
954c1994
GS
4134SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
4135the string buffer. The C<ptr> becomes the first character of the adjusted
645c22ef 4136string. Uses the "OOK hack".
3f7c398e 4137Beware: after this function returns, C<ptr> and SvPVX_const(sv) may no longer
31869a79 4138refer to the same chunk of data.
954c1994
GS
4139
4140=cut
4141*/
4142
79072805 4143void
f54cb97a 4144Perl_sv_chop(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
4145{
4146 register STRLEN delta;
a0d0e21e 4147 if (!ptr || !SvPOKp(sv))
79072805 4148 return;
3f7c398e 4149 delta = ptr - SvPVX_const(sv);
2213622d 4150 SV_CHECK_THINKFIRST(sv);
79072805
LW
4151 if (SvTYPE(sv) < SVt_PVIV)
4152 sv_upgrade(sv,SVt_PVIV);
4153
4154 if (!SvOOK(sv)) {
50483b2c 4155 if (!SvLEN(sv)) { /* make copy of shared string */
3f7c398e 4156 const char *pvx = SvPVX_const(sv);
a28509cc 4157 const STRLEN len = SvCUR(sv);
50483b2c 4158 SvGROW(sv, len + 1);
706aa1c9 4159 Move(pvx,SvPVX(sv),len,char);
50483b2c
JD
4160 *SvEND(sv) = '\0';
4161 }
45977657 4162 SvIV_set(sv, 0);
a4bfb290
AB
4163 /* Same SvOOK_on but SvOOK_on does a SvIOK_off
4164 and we do that anyway inside the SvNIOK_off
4165 */
7a5fa8a2 4166 SvFLAGS(sv) |= SVf_OOK;
79072805 4167 }
a4bfb290 4168 SvNIOK_off(sv);
b162af07
SP
4169 SvLEN_set(sv, SvLEN(sv) - delta);
4170 SvCUR_set(sv, SvCUR(sv) - delta);
f880fe2f 4171 SvPV_set(sv, SvPVX(sv) + delta);
45977657 4172 SvIV_set(sv, SvIVX(sv) + delta);
79072805
LW
4173}
4174
954c1994
GS
4175/*
4176=for apidoc sv_catpvn
4177
4178Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
4179C<len> indicates number of bytes to copy. If the SV has the UTF-8
4180status set, then the bytes appended should be valid UTF-8.
d5ce4a7c 4181Handles 'get' magic, but not 'set' magic. See C<sv_catpvn_mg>.
954c1994 4182
8d6d96c1
HS
4183=for apidoc sv_catpvn_flags
4184
4185Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
4186C<len> indicates number of bytes to copy. If the SV has the UTF-8
4187status set, then the bytes appended should be valid UTF-8.
8d6d96c1
HS
4188If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
4189appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
4190in terms of this function.
4191
4192=cut
4193*/
4194
4195void
4196Perl_sv_catpvn_flags(pTHX_ register SV *dsv, register const char *sstr, register STRLEN slen, I32 flags)
4197{
97aff369 4198 dVAR;
8d6d96c1 4199 STRLEN dlen;
fabdb6c0 4200 const char * const dstr = SvPV_force_flags(dsv, dlen, flags);
8d6d96c1 4201
8d6d96c1
HS
4202 SvGROW(dsv, dlen + slen + 1);
4203 if (sstr == dstr)
3f7c398e 4204 sstr = SvPVX_const(dsv);
8d6d96c1 4205 Move(sstr, SvPVX(dsv) + dlen, slen, char);
b162af07 4206 SvCUR_set(dsv, SvCUR(dsv) + slen);
8d6d96c1
HS
4207 *SvEND(dsv) = '\0';
4208 (void)SvPOK_only_UTF8(dsv); /* validate pointer */
4209 SvTAINT(dsv);
bddd5118
NC
4210 if (flags & SV_SMAGIC)
4211 SvSETMAGIC(dsv);
79072805
LW
4212}
4213
954c1994 4214/*
954c1994
GS
4215=for apidoc sv_catsv
4216
13e8c8e3
JH
4217Concatenates the string from SV C<ssv> onto the end of the string in
4218SV C<dsv>. Modifies C<dsv> but not C<ssv>. Handles 'get' magic, but
4219not 'set' magic. See C<sv_catsv_mg>.
954c1994 4220
8d6d96c1
HS
4221=for apidoc sv_catsv_flags
4222
4223Concatenates the string from SV C<ssv> onto the end of the string in
4224SV C<dsv>. Modifies C<dsv> but not C<ssv>. If C<flags> has C<SV_GMAGIC>
4225bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
4226and C<sv_catsv_nomg> are implemented in terms of this function.
4227
4228=cut */
4229
ef50df4b 4230void
8d6d96c1 4231Perl_sv_catsv_flags(pTHX_ SV *dsv, register SV *ssv, I32 flags)
79072805 4232{
97aff369 4233 dVAR;
bddd5118 4234 if (ssv) {
00b6aa41
AL
4235 STRLEN slen;
4236 const char *spv = SvPV_const(ssv, slen);
4237 if (spv) {
bddd5118
NC
4238 /* sutf8 and dutf8 were type bool, but under USE_ITHREADS,
4239 gcc version 2.95.2 20000220 (Debian GNU/Linux) for
4240 Linux xxx 2.2.17 on sparc64 with gcc -O2, we erroneously
4241 get dutf8 = 0x20000000, (i.e. SVf_UTF8) even though
4242 dsv->sv_flags doesn't have that bit set.
4fd84b44 4243 Andy Dougherty 12 Oct 2001
bddd5118
NC
4244 */
4245 const I32 sutf8 = DO_UTF8(ssv);
4246 I32 dutf8;
13e8c8e3 4247
bddd5118
NC
4248 if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
4249 mg_get(dsv);
4250 dutf8 = DO_UTF8(dsv);
8d6d96c1 4251
bddd5118
NC
4252 if (dutf8 != sutf8) {
4253 if (dutf8) {
4254 /* Not modifying source SV, so taking a temporary copy. */
00b6aa41 4255 SV* const csv = sv_2mortal(newSVpvn(spv, slen));
13e8c8e3 4256
bddd5118
NC
4257 sv_utf8_upgrade(csv);
4258 spv = SvPV_const(csv, slen);
4259 }
4260 else
4261 sv_utf8_upgrade_nomg(dsv);
13e8c8e3 4262 }
bddd5118 4263 sv_catpvn_nomg(dsv, spv, slen);
e84ff256 4264 }
560a288e 4265 }
bddd5118
NC
4266 if (flags & SV_SMAGIC)
4267 SvSETMAGIC(dsv);
79072805
LW
4268}
4269
954c1994 4270/*
954c1994
GS
4271=for apidoc sv_catpv
4272
4273Concatenates the string onto the end of the string which is in the SV.
1e54db1a
JH
4274If the SV has the UTF-8 status set, then the bytes appended should be
4275valid UTF-8. Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
954c1994 4276
d5ce4a7c 4277=cut */
954c1994 4278
ef50df4b 4279void
0c981600 4280Perl_sv_catpv(pTHX_ register SV *sv, register const char *ptr)
79072805 4281{
97aff369 4282 dVAR;
79072805 4283 register STRLEN len;
463ee0b2 4284 STRLEN tlen;
748a9306 4285 char *junk;
79072805 4286
0c981600 4287 if (!ptr)
79072805 4288 return;
748a9306 4289 junk = SvPV_force(sv, tlen);
0c981600 4290 len = strlen(ptr);
463ee0b2 4291 SvGROW(sv, tlen + len + 1);
0c981600 4292 if (ptr == junk)
3f7c398e 4293 ptr = SvPVX_const(sv);
0c981600 4294 Move(ptr,SvPVX(sv)+tlen,len+1,char);
b162af07 4295 SvCUR_set(sv, SvCUR(sv) + len);
d41ff1b8 4296 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4297 SvTAINT(sv);
79072805
LW
4298}
4299
954c1994
GS
4300/*
4301=for apidoc sv_catpv_mg
4302
4303Like C<sv_catpv>, but also handles 'set' magic.
4304
4305=cut
4306*/
4307
ef50df4b 4308void
0c981600 4309Perl_sv_catpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b 4310{
0c981600 4311 sv_catpv(sv,ptr);
ef50df4b
GS
4312 SvSETMAGIC(sv);
4313}
4314
645c22ef
DM
4315/*
4316=for apidoc newSV
4317
561b68a9
SH
4318Creates a new SV. A non-zero C<len> parameter indicates the number of
4319bytes of preallocated string space the SV should have. An extra byte for a
4320trailing NUL is also reserved. (SvPOK is not set for the SV even if string
4321space is allocated.) The reference count for the new SV is set to 1.
4322
4323In 5.9.3, newSV() replaces the older NEWSV() API, and drops the first
4324parameter, I<x>, a debug aid which allowed callers to identify themselves.
4325This aid has been superseded by a new build option, PERL_MEM_LOG (see
4326L<perlhack/PERL_MEM_LOG>). The older API is still there for use in XS
4327modules supporting older perls.
645c22ef
DM
4328
4329=cut
4330*/
4331
79072805 4332SV *
864dbfa3 4333Perl_newSV(pTHX_ STRLEN len)
79072805 4334{
97aff369 4335 dVAR;
79072805 4336 register SV *sv;
1c846c1f 4337
4561caa4 4338 new_SV(sv);
79072805
LW
4339 if (len) {
4340 sv_upgrade(sv, SVt_PV);
4341 SvGROW(sv, len + 1);
4342 }
4343 return sv;
4344}
954c1994 4345/*
92110913 4346=for apidoc sv_magicext
954c1994 4347
68795e93 4348Adds magic to an SV, upgrading it if necessary. Applies the
2d8d5d5a 4349supplied vtable and returns a pointer to the magic added.
92110913 4350
2d8d5d5a
SH
4351Note that C<sv_magicext> will allow things that C<sv_magic> will not.
4352In particular, you can add magic to SvREADONLY SVs, and add more than
4353one instance of the same 'how'.
645c22ef 4354
2d8d5d5a
SH
4355If C<namlen> is greater than zero then a C<savepvn> I<copy> of C<name> is
4356stored, if C<namlen> is zero then C<name> is stored as-is and - as another
4357special case - if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
4358to contain an C<SV*> and is stored as-is with its REFCNT incremented.
92110913 4359
2d8d5d5a 4360(This is now used as a subroutine by C<sv_magic>.)
954c1994
GS
4361
4362=cut
4363*/
92110913 4364MAGIC *
53d44271 4365Perl_sv_magicext(pTHX_ SV* sv, SV* obj, int how, const MGVTBL *vtable,
92110913 4366 const char* name, I32 namlen)
79072805 4367{
97aff369 4368 dVAR;
79072805 4369 MAGIC* mg;
68795e93 4370
7a7f3e45 4371 SvUPGRADE(sv, SVt_PVMG);
a02a5408 4372 Newxz(mg, 1, MAGIC);
79072805 4373 mg->mg_moremagic = SvMAGIC(sv);
b162af07 4374 SvMAGIC_set(sv, mg);
75f9d97a 4375
05f95b08
SB
4376 /* Sometimes a magic contains a reference loop, where the sv and
4377 object refer to each other. To prevent a reference loop that
4378 would prevent such objects being freed, we look for such loops
4379 and if we find one we avoid incrementing the object refcount.
87f0b213
JH
4380
4381 Note we cannot do this to avoid self-tie loops as intervening RV must
b5ccf5f2 4382 have its REFCNT incremented to keep it in existence.
87f0b213
JH
4383
4384 */
14befaf4
DM
4385 if (!obj || obj == sv ||
4386 how == PERL_MAGIC_arylen ||
4387 how == PERL_MAGIC_qr ||
8d2f4536 4388 how == PERL_MAGIC_symtab ||
75f9d97a
JH
4389 (SvTYPE(obj) == SVt_PVGV &&
4390 (GvSV(obj) == sv || GvHV(obj) == (HV*)sv || GvAV(obj) == (AV*)sv ||
4391 GvCV(obj) == (CV*)sv || GvIOp(obj) == (IO*)sv ||
2628be26 4392 GvFORM(obj) == (CV*)sv)))
75f9d97a 4393 {
8990e307 4394 mg->mg_obj = obj;
75f9d97a 4395 }
85e6fe83 4396 else {
b37c2d43 4397 mg->mg_obj = SvREFCNT_inc_simple(obj);
85e6fe83
LW
4398 mg->mg_flags |= MGf_REFCOUNTED;
4399 }
b5ccf5f2
YST
4400
4401 /* Normal self-ties simply pass a null object, and instead of
4402 using mg_obj directly, use the SvTIED_obj macro to produce a
4403 new RV as needed. For glob "self-ties", we are tieing the PVIO
4404 with an RV obj pointing to the glob containing the PVIO. In
4405 this case, to avoid a reference loop, we need to weaken the
4406 reference.
4407 */
4408
4409 if (how == PERL_MAGIC_tiedscalar && SvTYPE(sv) == SVt_PVIO &&
4410 obj && SvROK(obj) && GvIO(SvRV(obj)) == (IO*)sv)
4411 {
4412 sv_rvweaken(obj);
4413 }
4414
79072805 4415 mg->mg_type = how;
565764a8 4416 mg->mg_len = namlen;
9cbac4c7 4417 if (name) {
92110913 4418 if (namlen > 0)
1edc1566 4419 mg->mg_ptr = savepvn(name, namlen);
c6ee37c5 4420 else if (namlen == HEf_SVKEY)
b37c2d43 4421 mg->mg_ptr = (char*)SvREFCNT_inc_simple_NN((SV*)name);
68795e93 4422 else
92110913 4423 mg->mg_ptr = (char *) name;
9cbac4c7 4424 }
53d44271 4425 mg->mg_virtual = (MGVTBL *) vtable;
68795e93 4426
92110913
NIS
4427 mg_magical(sv);
4428 if (SvGMAGICAL(sv))
4429 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
4430 return mg;
4431}
4432
4433/*
4434=for apidoc sv_magic
1c846c1f 4435
92110913
NIS
4436Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
4437then adds a new magic item of type C<how> to the head of the magic list.
4438
2d8d5d5a
SH
4439See C<sv_magicext> (which C<sv_magic> now calls) for a description of the
4440handling of the C<name> and C<namlen> arguments.
4441
4509d3fb
SB
4442You need to use C<sv_magicext> to add magic to SvREADONLY SVs and also
4443to add more than one instance of the same 'how'.
4444
92110913
NIS
4445=cut
4446*/
4447
4448void
4449Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
68795e93 4450{
97aff369 4451 dVAR;
53d44271 4452 const MGVTBL *vtable;
92110913 4453 MAGIC* mg;
92110913 4454
f8c7b90f 4455#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
4456 if (SvIsCOW(sv))
4457 sv_force_normal_flags(sv, 0);
4458#endif
92110913 4459 if (SvREADONLY(sv)) {
d8084ca5
DM
4460 if (
4461 /* its okay to attach magic to shared strings; the subsequent
4462 * upgrade to PVMG will unshare the string */
4463 !(SvFAKE(sv) && SvTYPE(sv) < SVt_PVMG)
4464
4465 && IN_PERL_RUNTIME
92110913
NIS
4466 && how != PERL_MAGIC_regex_global
4467 && how != PERL_MAGIC_bm
4468 && how != PERL_MAGIC_fm
4469 && how != PERL_MAGIC_sv
e6469971 4470 && how != PERL_MAGIC_backref
92110913
NIS
4471 )
4472 {
4473 Perl_croak(aTHX_ PL_no_modify);
4474 }
4475 }
4476 if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
4477 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
68795e93
NIS
4478 /* sv_magic() refuses to add a magic of the same 'how' as an
4479 existing one
92110913 4480 */
2a509ed3 4481 if (how == PERL_MAGIC_taint) {
92110913 4482 mg->mg_len |= 1;
2a509ed3
NC
4483 /* Any scalar which already had taint magic on which someone
4484 (erroneously?) did SvIOK_on() or similar will now be
4485 incorrectly sporting public "OK" flags. */
4486 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
4487 }
92110913
NIS
4488 return;
4489 }
4490 }
68795e93 4491
79072805 4492 switch (how) {
14befaf4 4493 case PERL_MAGIC_sv:
92110913 4494 vtable = &PL_vtbl_sv;
79072805 4495 break;
14befaf4 4496 case PERL_MAGIC_overload:
92110913 4497 vtable = &PL_vtbl_amagic;
a0d0e21e 4498 break;
14befaf4 4499 case PERL_MAGIC_overload_elem:
92110913 4500 vtable = &PL_vtbl_amagicelem;
a0d0e21e 4501 break;
14befaf4 4502 case PERL_MAGIC_overload_table:
92110913 4503 vtable = &PL_vtbl_ovrld;
a0d0e21e 4504 break;
14befaf4 4505 case PERL_MAGIC_bm:
92110913 4506 vtable = &PL_vtbl_bm;
79072805 4507 break;
14befaf4 4508 case PERL_MAGIC_regdata:
92110913 4509 vtable = &PL_vtbl_regdata;
6cef1e77 4510 break;
14befaf4 4511 case PERL_MAGIC_regdatum:
92110913 4512 vtable = &PL_vtbl_regdatum;
6cef1e77 4513 break;
14befaf4 4514 case PERL_MAGIC_env:
92110913 4515 vtable = &PL_vtbl_env;
79072805 4516 break;
14befaf4 4517 case PERL_MAGIC_fm:
92110913 4518 vtable = &PL_vtbl_fm;
55497cff 4519 break;
14befaf4 4520 case PERL_MAGIC_envelem:
92110913 4521 vtable = &PL_vtbl_envelem;
79072805 4522 break;
14befaf4 4523 case PERL_MAGIC_regex_global:
92110913 4524 vtable = &PL_vtbl_mglob;
93a17b20 4525 break;
14befaf4 4526 case PERL_MAGIC_isa:
92110913 4527 vtable = &PL_vtbl_isa;
463ee0b2 4528 break;
14befaf4 4529 case PERL_MAGIC_isaelem:
92110913 4530 vtable = &PL_vtbl_isaelem;
463ee0b2 4531 break;
14befaf4 4532 case PERL_MAGIC_nkeys:
92110913 4533 vtable = &PL_vtbl_nkeys;
16660edb 4534 break;
14befaf4 4535 case PERL_MAGIC_dbfile:
aec46f14 4536 vtable = NULL;
93a17b20 4537 break;
14befaf4 4538 case PERL_MAGIC_dbline:
92110913 4539 vtable = &PL_vtbl_dbline;
79072805 4540 break;
36477c24 4541#ifdef USE_LOCALE_COLLATE
14befaf4 4542 case PERL_MAGIC_collxfrm:
92110913 4543 vtable = &PL_vtbl_collxfrm;
bbce6d69 4544 break;
36477c24 4545#endif /* USE_LOCALE_COLLATE */
14befaf4 4546 case PERL_MAGIC_tied:
92110913 4547 vtable = &PL_vtbl_pack;
463ee0b2 4548 break;
14befaf4
DM
4549 case PERL_MAGIC_tiedelem:
4550 case PERL_MAGIC_tiedscalar:
92110913 4551 vtable = &PL_vtbl_packelem;
463ee0b2 4552 break;
14befaf4 4553 case PERL_MAGIC_qr:
92110913 4554 vtable = &PL_vtbl_regexp;
c277df42 4555 break;
b3ca2e83
NC
4556 case PERL_MAGIC_hints:
4557 /* As this vtable is all NULL, we can reuse it. */
14befaf4 4558 case PERL_MAGIC_sig:
92110913 4559 vtable = &PL_vtbl_sig;
79072805 4560 break;
14befaf4 4561 case PERL_MAGIC_sigelem:
92110913 4562 vtable = &PL_vtbl_sigelem;
79072805 4563 break;
14befaf4 4564 case PERL_MAGIC_taint:
92110913 4565 vtable = &PL_vtbl_taint;
463ee0b2 4566 break;
14befaf4 4567 case PERL_MAGIC_uvar:
92110913 4568 vtable = &PL_vtbl_uvar;
79072805 4569 break;
14befaf4 4570 case PERL_MAGIC_vec:
92110913 4571 vtable = &PL_vtbl_vec;
79072805 4572 break;
a3874608 4573 case PERL_MAGIC_arylen_p:
bfcb3514 4574 case PERL_MAGIC_rhash:
8d2f4536 4575 case PERL_MAGIC_symtab:
ece467f9 4576 case PERL_MAGIC_vstring:
aec46f14 4577 vtable = NULL;
ece467f9 4578 break;
7e8c5dac
HS
4579 case PERL_MAGIC_utf8:
4580 vtable = &PL_vtbl_utf8;
4581 break;
14befaf4 4582 case PERL_MAGIC_substr:
92110913 4583 vtable = &PL_vtbl_substr;
79072805 4584 break;
14befaf4 4585 case PERL_MAGIC_defelem:
92110913 4586 vtable = &PL_vtbl_defelem;
5f05dabc 4587 break;
14befaf4 4588 case PERL_MAGIC_arylen:
92110913 4589 vtable = &PL_vtbl_arylen;
79072805 4590 break;
14befaf4 4591 case PERL_MAGIC_pos:
92110913 4592 vtable = &PL_vtbl_pos;
a0d0e21e 4593 break;
14befaf4 4594 case PERL_MAGIC_backref:
92110913 4595 vtable = &PL_vtbl_backref;
810b8aa5 4596 break;
b3ca2e83
NC
4597 case PERL_MAGIC_hintselem:
4598 vtable = &PL_vtbl_hintselem;
4599 break;
14befaf4
DM
4600 case PERL_MAGIC_ext:
4601 /* Reserved for use by extensions not perl internals. */
4633a7c4
LW
4602 /* Useful for attaching extension internal data to perl vars. */
4603 /* Note that multiple extensions may clash if magical scalars */
4604 /* etc holding private data from one are passed to another. */
aec46f14 4605 vtable = NULL;
a0d0e21e 4606 break;
79072805 4607 default:
14befaf4 4608 Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
463ee0b2 4609 }
68795e93 4610
92110913 4611 /* Rest of work is done else where */
aec46f14 4612 mg = sv_magicext(sv,obj,how,vtable,name,namlen);
68795e93 4613
92110913
NIS
4614 switch (how) {
4615 case PERL_MAGIC_taint:
4616 mg->mg_len = 1;
4617 break;
4618 case PERL_MAGIC_ext:
4619 case PERL_MAGIC_dbfile:
4620 SvRMAGICAL_on(sv);
4621 break;
4622 }
463ee0b2
LW
4623}
4624
c461cf8f
JH
4625/*
4626=for apidoc sv_unmagic
4627
645c22ef 4628Removes all magic of type C<type> from an SV.
c461cf8f
JH
4629
4630=cut
4631*/
4632
463ee0b2 4633int
864dbfa3 4634Perl_sv_unmagic(pTHX_ SV *sv, int type)
463ee0b2
LW
4635{
4636 MAGIC* mg;
4637 MAGIC** mgp;
91bba347 4638 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2 4639 return 0;
064cf529 4640 mgp = &(((XPVMG*) SvANY(sv))->xmg_u.xmg_magic);
463ee0b2
LW
4641 for (mg = *mgp; mg; mg = *mgp) {
4642 if (mg->mg_type == type) {
e1ec3a88 4643 const MGVTBL* const vtbl = mg->mg_virtual;
463ee0b2 4644 *mgp = mg->mg_moremagic;
1d7c1841 4645 if (vtbl && vtbl->svt_free)
fc0dc3b3 4646 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
14befaf4 4647 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
92110913 4648 if (mg->mg_len > 0)
1edc1566 4649 Safefree(mg->mg_ptr);
565764a8 4650 else if (mg->mg_len == HEf_SVKEY)
1edc1566 4651 SvREFCNT_dec((SV*)mg->mg_ptr);
d2923cdd 4652 else if (mg->mg_type == PERL_MAGIC_utf8)
7e8c5dac 4653 Safefree(mg->mg_ptr);
9cbac4c7 4654 }
a0d0e21e
LW
4655 if (mg->mg_flags & MGf_REFCOUNTED)
4656 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
4657 Safefree(mg);
4658 }
4659 else
4660 mgp = &mg->mg_moremagic;
79072805 4661 }
91bba347 4662 if (!SvMAGIC(sv)) {
463ee0b2 4663 SvMAGICAL_off(sv);
c268c2a6 4664 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
86f55936 4665 SvMAGIC_set(sv, NULL);
463ee0b2
LW
4666 }
4667
4668 return 0;
79072805
LW
4669}
4670
c461cf8f
JH
4671/*
4672=for apidoc sv_rvweaken
4673
645c22ef
DM
4674Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
4675referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
4676push a back-reference to this RV onto the array of backreferences
1e73acc8
AS
4677associated with that magic. If the RV is magical, set magic will be
4678called after the RV is cleared.
c461cf8f
JH
4679
4680=cut
4681*/
4682
810b8aa5 4683SV *
864dbfa3 4684Perl_sv_rvweaken(pTHX_ SV *sv)
810b8aa5
GS
4685{
4686 SV *tsv;
4687 if (!SvOK(sv)) /* let undefs pass */
4688 return sv;
4689 if (!SvROK(sv))
cea2e8a9 4690 Perl_croak(aTHX_ "Can't weaken a nonreference");
810b8aa5 4691 else if (SvWEAKREF(sv)) {
810b8aa5 4692 if (ckWARN(WARN_MISC))
9014280d 4693 Perl_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
810b8aa5
GS
4694 return sv;
4695 }
4696 tsv = SvRV(sv);
e15faf7d 4697 Perl_sv_add_backref(aTHX_ tsv, sv);
810b8aa5 4698 SvWEAKREF_on(sv);
1c846c1f 4699 SvREFCNT_dec(tsv);
810b8aa5
GS
4700 return sv;
4701}
4702
645c22ef
DM
4703/* Give tsv backref magic if it hasn't already got it, then push a
4704 * back-reference to sv onto the array associated with the backref magic.
4705 */
4706
e15faf7d
NC
4707void
4708Perl_sv_add_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5 4709{
97aff369 4710 dVAR;
810b8aa5 4711 AV *av;
86f55936
NC
4712
4713 if (SvTYPE(tsv) == SVt_PVHV) {
4714 AV **const avp = Perl_hv_backreferences_p(aTHX_ (HV*)tsv);
4715
4716 av = *avp;
4717 if (!av) {
4718 /* There is no AV in the offical place - try a fixup. */
4719 MAGIC *const mg = mg_find(tsv, PERL_MAGIC_backref);
4720
4721 if (mg) {
4722 /* Aha. They've got it stowed in magic. Bring it back. */
4723 av = (AV*)mg->mg_obj;
4724 /* Stop mg_free decreasing the refernce count. */
4725 mg->mg_obj = NULL;
4726 /* Stop mg_free even calling the destructor, given that
4727 there's no AV to free up. */
4728 mg->mg_virtual = 0;
4729 sv_unmagic(tsv, PERL_MAGIC_backref);
4730 } else {
4731 av = newAV();
4732 AvREAL_off(av);
b37c2d43 4733 SvREFCNT_inc_simple_void(av);
86f55936
NC
4734 }
4735 *avp = av;
4736 }
4737 } else {
4738 const MAGIC *const mg
4739 = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
4740 if (mg)
4741 av = (AV*)mg->mg_obj;
4742 else {
4743 av = newAV();
4744 AvREAL_off(av);
4745 sv_magic(tsv, (SV*)av, PERL_MAGIC_backref, NULL, 0);
4746 /* av now has a refcnt of 2, which avoids it getting freed
4747 * before us during global cleanup. The extra ref is removed
4748 * by magic_killbackrefs() when tsv is being freed */
4749 }
810b8aa5 4750 }
d91d49e8 4751 if (AvFILLp(av) >= AvMAX(av)) {
d91d49e8
MM
4752 av_extend(av, AvFILLp(av)+1);
4753 }
4754 AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */
810b8aa5
GS
4755}
4756
645c22ef
DM
4757/* delete a back-reference to ourselves from the backref magic associated
4758 * with the SV we point to.
4759 */
4760
1c846c1f 4761STATIC void
e15faf7d 4762S_sv_del_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5 4763{
97aff369 4764 dVAR;
86f55936 4765 AV *av = NULL;
810b8aa5
GS
4766 SV **svp;
4767 I32 i;
86f55936
NC
4768
4769 if (SvTYPE(tsv) == SVt_PVHV && SvOOK(tsv)) {
4770 av = *Perl_hv_backreferences_p(aTHX_ (HV*)tsv);
5b285ea4
NC
4771 /* We mustn't attempt to "fix up" the hash here by moving the
4772 backreference array back to the hv_aux structure, as that is stored
4773 in the main HvARRAY(), and hfreentries assumes that no-one
4774 reallocates HvARRAY() while it is running. */
86f55936
NC
4775 }
4776 if (!av) {
4777 const MAGIC *const mg
4778 = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
4779 if (mg)
4780 av = (AV *)mg->mg_obj;
4781 }
4782 if (!av) {
e15faf7d
NC
4783 if (PL_in_clean_all)
4784 return;
cea2e8a9 4785 Perl_croak(aTHX_ "panic: del_backref");
86f55936
NC
4786 }
4787
4788 if (SvIS_FREED(av))
4789 return;
4790
810b8aa5 4791 svp = AvARRAY(av);
6a76db8b
NC
4792 /* We shouldn't be in here more than once, but for paranoia reasons lets
4793 not assume this. */
4794 for (i = AvFILLp(av); i >= 0; i--) {
4795 if (svp[i] == sv) {
4796 const SSize_t fill = AvFILLp(av);
4797 if (i != fill) {
4798 /* We weren't the last entry.
4799 An unordered list has this property that you can take the
4800 last element off the end to fill the hole, and it's still
4801 an unordered list :-)
4802 */
4803 svp[i] = svp[fill];
4804 }
a0714e2c 4805 svp[fill] = NULL;
6a76db8b
NC
4806 AvFILLp(av) = fill - 1;
4807 }
4808 }
810b8aa5
GS
4809}
4810
86f55936
NC
4811int
4812Perl_sv_kill_backrefs(pTHX_ SV *sv, AV *av)
4813{
4814 SV **svp = AvARRAY(av);
4815
4816 PERL_UNUSED_ARG(sv);
4817
4818 /* Not sure why the av can get freed ahead of its sv, but somehow it does
4819 in ext/B/t/bytecode.t test 15 (involving print <DATA>) */
4820 if (svp && !SvIS_FREED(av)) {
4821 SV *const *const last = svp + AvFILLp(av);
4822
4823 while (svp <= last) {
4824 if (*svp) {
4825 SV *const referrer = *svp;
4826 if (SvWEAKREF(referrer)) {
4827 /* XXX Should we check that it hasn't changed? */
4828 SvRV_set(referrer, 0);
4829 SvOK_off(referrer);
4830 SvWEAKREF_off(referrer);
1e73acc8 4831 SvSETMAGIC(referrer);
86f55936
NC
4832 } else if (SvTYPE(referrer) == SVt_PVGV ||
4833 SvTYPE(referrer) == SVt_PVLV) {
4834 /* You lookin' at me? */
4835 assert(GvSTASH(referrer));
4836 assert(GvSTASH(referrer) == (HV*)sv);
4837 GvSTASH(referrer) = 0;
4838 } else {
4839 Perl_croak(aTHX_
4840 "panic: magic_killbackrefs (flags=%"UVxf")",
4841 (UV)SvFLAGS(referrer));
4842 }
4843
a0714e2c 4844 *svp = NULL;
86f55936
NC
4845 }
4846 svp++;
4847 }
4848 }
4849 SvREFCNT_dec(av); /* remove extra count added by sv_add_backref() */
4850 return 0;
4851}
4852
954c1994
GS
4853/*
4854=for apidoc sv_insert
4855
4856Inserts a string at the specified offset/length within the SV. Similar to
4857the Perl substr() function.
4858
4859=cut
4860*/
4861
79072805 4862void
e1ec3a88 4863Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, const char *little, STRLEN littlelen)
79072805 4864{
97aff369 4865 dVAR;
79072805
LW
4866 register char *big;
4867 register char *mid;
4868 register char *midend;
4869 register char *bigend;
4870 register I32 i;
6ff81951 4871 STRLEN curlen;
1c846c1f 4872
79072805 4873
8990e307 4874 if (!bigstr)
cea2e8a9 4875 Perl_croak(aTHX_ "Can't modify non-existent substring");
6ff81951 4876 SvPV_force(bigstr, curlen);
60fa28ff 4877 (void)SvPOK_only_UTF8(bigstr);
6ff81951
GS
4878 if (offset + len > curlen) {
4879 SvGROW(bigstr, offset+len+1);
93524f2b 4880 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
6ff81951
GS
4881 SvCUR_set(bigstr, offset+len);
4882 }
79072805 4883
69b47968 4884 SvTAINT(bigstr);
79072805
LW
4885 i = littlelen - len;
4886 if (i > 0) { /* string might grow */
a0d0e21e 4887 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
4888 mid = big + offset + len;
4889 midend = bigend = big + SvCUR(bigstr);
4890 bigend += i;
4891 *bigend = '\0';
4892 while (midend > mid) /* shove everything down */
4893 *--bigend = *--midend;
4894 Move(little,big+offset,littlelen,char);
b162af07 4895 SvCUR_set(bigstr, SvCUR(bigstr) + i);
79072805
LW
4896 SvSETMAGIC(bigstr);
4897 return;
4898 }
4899 else if (i == 0) {
463ee0b2 4900 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
4901 SvSETMAGIC(bigstr);
4902 return;
4903 }
4904
463ee0b2 4905 big = SvPVX(bigstr);
79072805
LW
4906 mid = big + offset;
4907 midend = mid + len;
4908 bigend = big + SvCUR(bigstr);
4909
4910 if (midend > bigend)
cea2e8a9 4911 Perl_croak(aTHX_ "panic: sv_insert");
79072805
LW
4912
4913 if (mid - big > bigend - midend) { /* faster to shorten from end */
4914 if (littlelen) {
4915 Move(little, mid, littlelen,char);
4916 mid += littlelen;
4917 }
4918 i = bigend - midend;
4919 if (i > 0) {
4920 Move(midend, mid, i,char);
4921 mid += i;
4922 }
4923 *mid = '\0';
4924 SvCUR_set(bigstr, mid - big);
4925 }
155aba94 4926 else if ((i = mid - big)) { /* faster from front */
79072805
LW
4927 midend -= littlelen;
4928 mid = midend;
4929 sv_chop(bigstr,midend-i);
4930 big += i;
4931 while (i--)
4932 *--midend = *--big;
4933 if (littlelen)
4934 Move(little, mid, littlelen,char);
4935 }
4936 else if (littlelen) {
4937 midend -= littlelen;
4938 sv_chop(bigstr,midend);
4939 Move(little,midend,littlelen,char);
4940 }
4941 else {
4942 sv_chop(bigstr,midend);
4943 }
4944 SvSETMAGIC(bigstr);
4945}
4946
c461cf8f
JH
4947/*
4948=for apidoc sv_replace
4949
4950Make the first argument a copy of the second, then delete the original.
645c22ef
DM
4951The target SV physically takes over ownership of the body of the source SV
4952and inherits its flags; however, the target keeps any magic it owns,
4953and any magic in the source is discarded.
ff276b08 4954Note that this is a rather specialist SV copying operation; most of the
645c22ef 4955time you'll want to use C<sv_setsv> or one of its many macro front-ends.
c461cf8f
JH
4956
4957=cut
4958*/
79072805
LW
4959
4960void
864dbfa3 4961Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
79072805 4962{
97aff369 4963 dVAR;
a3b680e6 4964 const U32 refcnt = SvREFCNT(sv);
765f542d 4965 SV_CHECK_THINKFIRST_COW_DROP(sv);
30e5c352 4966 if (SvREFCNT(nsv) != 1) {
7437becc 4967 Perl_croak(aTHX_ "panic: reference miscount on nsv in sv_replace() (%"
30e5c352
NC
4968 UVuf " != 1)", (UV) SvREFCNT(nsv));
4969 }
93a17b20 4970 if (SvMAGICAL(sv)) {
a0d0e21e
LW
4971 if (SvMAGICAL(nsv))
4972 mg_free(nsv);
4973 else
4974 sv_upgrade(nsv, SVt_PVMG);
b162af07 4975 SvMAGIC_set(nsv, SvMAGIC(sv));
a0d0e21e 4976 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20 4977 SvMAGICAL_off(sv);
b162af07 4978 SvMAGIC_set(sv, NULL);
93a17b20 4979 }
79072805
LW
4980 SvREFCNT(sv) = 0;
4981 sv_clear(sv);
477f5d66 4982 assert(!SvREFCNT(sv));
fd0854ff
DM
4983#ifdef DEBUG_LEAKING_SCALARS
4984 sv->sv_flags = nsv->sv_flags;
4985 sv->sv_any = nsv->sv_any;
4986 sv->sv_refcnt = nsv->sv_refcnt;
f34d0642 4987 sv->sv_u = nsv->sv_u;
fd0854ff 4988#else
79072805 4989 StructCopy(nsv,sv,SV);
fd0854ff 4990#endif
7b2c381c
NC
4991 /* Currently could join these into one piece of pointer arithmetic, but
4992 it would be unclear. */
4993 if(SvTYPE(sv) == SVt_IV)
4994 SvANY(sv)
339049b0 4995 = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
7b2c381c 4996 else if (SvTYPE(sv) == SVt_RV) {
339049b0 4997 SvANY(sv) = &sv->sv_u.svu_rv;
7b2c381c
NC
4998 }
4999
fd0854ff 5000
f8c7b90f 5001#ifdef PERL_OLD_COPY_ON_WRITE
d3d0e6f1
NC
5002 if (SvIsCOW_normal(nsv)) {
5003 /* We need to follow the pointers around the loop to make the
5004 previous SV point to sv, rather than nsv. */
5005 SV *next;
5006 SV *current = nsv;
5007 while ((next = SV_COW_NEXT_SV(current)) != nsv) {
5008 assert(next);
5009 current = next;
3f7c398e 5010 assert(SvPVX_const(current) == SvPVX_const(nsv));
d3d0e6f1
NC
5011 }
5012 /* Make the SV before us point to the SV after us. */
5013 if (DEBUG_C_TEST) {
5014 PerlIO_printf(Perl_debug_log, "previous is\n");
5015 sv_dump(current);
a29f6d03
NC
5016 PerlIO_printf(Perl_debug_log,
5017 "move it from 0x%"UVxf" to 0x%"UVxf"\n",
d3d0e6f1
NC
5018 (UV) SV_COW_NEXT_SV(current), (UV) sv);
5019 }
a29f6d03 5020 SV_COW_NEXT_SV_SET(current, sv);
d3d0e6f1
NC
5021 }
5022#endif
79072805 5023 SvREFCNT(sv) = refcnt;
1edc1566 5024 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
39cf41c2 5025 SvREFCNT(nsv) = 0;
463ee0b2 5026 del_SV(nsv);
79072805
LW
5027}
5028
c461cf8f
JH
5029/*
5030=for apidoc sv_clear
5031
645c22ef
DM
5032Clear an SV: call any destructors, free up any memory used by the body,
5033and free the body itself. The SV's head is I<not> freed, although
5034its type is set to all 1's so that it won't inadvertently be assumed
5035to be live during global destruction etc.
5036This function should only be called when REFCNT is zero. Most of the time
5037you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
5038instead.
c461cf8f
JH
5039
5040=cut
5041*/
5042
79072805 5043void
864dbfa3 5044Perl_sv_clear(pTHX_ register SV *sv)
79072805 5045{
27da23d5 5046 dVAR;
82bb6deb 5047 const U32 type = SvTYPE(sv);
8edfc514
NC
5048 const struct body_details *const sv_type_details
5049 = bodies_by_type + type;
dd69841b 5050 HV *stash;
82bb6deb 5051
79072805
LW
5052 assert(sv);
5053 assert(SvREFCNT(sv) == 0);
5054
d2a0f284
JC
5055 if (type <= SVt_IV) {
5056 /* See the comment in sv.h about the collusion between this early
5057 return and the overloading of the NULL and IV slots in the size
5058 table. */
82bb6deb 5059 return;
d2a0f284 5060 }
82bb6deb 5061
ed6116ce 5062 if (SvOBJECT(sv)) {
3280af22 5063 if (PL_defstash) { /* Still have a symbol table? */
39644a26 5064 dSP;
893645bd 5065 HV* stash;
d460ef45 5066 do {
b464bac0 5067 CV* destructor;
4e8e7886 5068 stash = SvSTASH(sv);
32251b26 5069 destructor = StashHANDLER(stash,DESTROY);
4e8e7886 5070 if (destructor) {
1b6737cc 5071 SV* const tmpref = newRV(sv);
5cc433a6 5072 SvREADONLY_on(tmpref); /* DESTROY() could be naughty */
4e8e7886 5073 ENTER;
e788e7d3 5074 PUSHSTACKi(PERLSI_DESTROY);
4e8e7886
GS
5075 EXTEND(SP, 2);
5076 PUSHMARK(SP);
5cc433a6 5077 PUSHs(tmpref);
4e8e7886 5078 PUTBACK;
44389ee9 5079 call_sv((SV*)destructor, G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
7a5fa8a2
NIS
5080
5081
d3acc0f7 5082 POPSTACK;
3095d977 5083 SPAGAIN;
4e8e7886 5084 LEAVE;
5cc433a6
AB
5085 if(SvREFCNT(tmpref) < 2) {
5086 /* tmpref is not kept alive! */
5087 SvREFCNT(sv)--;
b162af07 5088 SvRV_set(tmpref, NULL);
5cc433a6
AB
5089 SvROK_off(tmpref);
5090 }
5091 SvREFCNT_dec(tmpref);
4e8e7886
GS
5092 }
5093 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 5094
6f44e0a4
JP
5095
5096 if (SvREFCNT(sv)) {
5097 if (PL_in_clean_objs)
cea2e8a9 5098 Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
bfcb3514 5099 HvNAME_get(stash));
6f44e0a4
JP
5100 /* DESTROY gave object new lease on life */
5101 return;
5102 }
a0d0e21e 5103 }
4e8e7886 5104
a0d0e21e 5105 if (SvOBJECT(sv)) {
4e8e7886 5106 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
a0d0e21e 5107 SvOBJECT_off(sv); /* Curse the object. */
82bb6deb 5108 if (type != SVt_PVIO)
3280af22 5109 --PL_sv_objcount; /* XXX Might want something more general */
a0d0e21e 5110 }
463ee0b2 5111 }
82bb6deb 5112 if (type >= SVt_PVMG) {
cecf5685 5113 if (type == SVt_PVMG && SvPAD_OUR(sv)) {
73d95100 5114 SvREFCNT_dec(SvOURSTASH(sv));
e736a858 5115 } else if (SvMAGIC(sv))
524189f1 5116 mg_free(sv);
00b1698f 5117 if (type == SVt_PVMG && SvPAD_TYPED(sv))
524189f1
JH
5118 SvREFCNT_dec(SvSTASH(sv));
5119 }
82bb6deb 5120 switch (type) {
cecf5685 5121 /* case SVt_BIND: */
8990e307 5122 case SVt_PVIO:
df0bd2f4
GS
5123 if (IoIFP(sv) &&
5124 IoIFP(sv) != PerlIO_stdin() &&
5f05dabc 5125 IoIFP(sv) != PerlIO_stdout() &&
5126 IoIFP(sv) != PerlIO_stderr())
93578b34 5127 {
f2b5be74 5128 io_close((IO*)sv, FALSE);
93578b34 5129 }
1d7c1841 5130 if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
1236053a 5131 PerlDir_close(IoDIRP(sv));
1d7c1841 5132 IoDIRP(sv) = (DIR*)NULL;
8990e307
LW
5133 Safefree(IoTOP_NAME(sv));
5134 Safefree(IoFMT_NAME(sv));
5135 Safefree(IoBOTTOM_NAME(sv));
82bb6deb 5136 goto freescalar;
79072805 5137 case SVt_PVCV:
748a9306 5138 case SVt_PVFM:
85e6fe83 5139 cv_undef((CV*)sv);
a0d0e21e 5140 goto freescalar;
79072805 5141 case SVt_PVHV:
86f55936 5142 Perl_hv_kill_backrefs(aTHX_ (HV*)sv);
85e6fe83 5143 hv_undef((HV*)sv);
a0d0e21e 5144 break;
79072805 5145 case SVt_PVAV:
3f90d085
DM
5146 if (PL_comppad == (AV*)sv) {
5147 PL_comppad = NULL;
5148 PL_curpad = NULL;
5149 }
85e6fe83 5150 av_undef((AV*)sv);
a0d0e21e 5151 break;
02270b4e 5152 case SVt_PVLV:
dd28f7bb
DM
5153 if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
5154 SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv)));
5155 HeNEXT((HE*)LvTARG(sv)) = PL_hv_fetch_ent_mh;
5156 PL_hv_fetch_ent_mh = (HE*)LvTARG(sv);
5157 }
5158 else if (LvTYPE(sv) != 't') /* unless tie: unrefcnted fake SV** */
5159 SvREFCNT_dec(LvTARG(sv));
a0d0e21e 5160 case SVt_PVGV:
cecf5685 5161 if (isGV_with_GP(sv)) {
dd69841b
BB
5162 if(GvCVu((GV*)sv) && (stash = GvSTASH((GV*)sv)) && HvNAME_get(stash))
5163 mro_method_changed_in(stash);
cecf5685
NC
5164 gp_free((GV*)sv);
5165 if (GvNAME_HEK(sv))
5166 unshare_hek(GvNAME_HEK(sv));
dd69841b
BB
5167 /* If we're in a stash, we don't own a reference to it. However it does
5168 have a back reference to us, which needs to be cleared. */
5169 if (!SvVALID(sv) && (stash = GvSTASH(sv)))
5170 sv_del_backref((SV*)stash, sv);
cecf5685 5171 }
8571fe2f
NC
5172 /* FIXME. There are probably more unreferenced pointers to SVs in the
5173 interpreter struct that we should check and tidy in a similar
5174 fashion to this: */
5175 if ((GV*)sv == PL_last_in_gv)
5176 PL_last_in_gv = NULL;
79072805 5177 case SVt_PVMG:
79072805
LW
5178 case SVt_PVNV:
5179 case SVt_PVIV:
a0d0e21e 5180 freescalar:
5228ca4e
NC
5181 /* Don't bother with SvOOK_off(sv); as we're only going to free it. */
5182 if (SvOOK(sv)) {
93524f2b 5183 SvPV_set(sv, SvPVX_mutable(sv) - SvIVX(sv));
5228ca4e
NC
5184 /* Don't even bother with turning off the OOK flag. */
5185 }
79072805 5186 case SVt_PV:
a0d0e21e 5187 case SVt_RV:
810b8aa5 5188 if (SvROK(sv)) {
b37c2d43 5189 SV * const target = SvRV(sv);
810b8aa5 5190 if (SvWEAKREF(sv))
e15faf7d 5191 sv_del_backref(target, sv);
810b8aa5 5192 else
e15faf7d 5193 SvREFCNT_dec(target);
810b8aa5 5194 }
f8c7b90f 5195#ifdef PERL_OLD_COPY_ON_WRITE
3f7c398e 5196 else if (SvPVX_const(sv)) {
765f542d
NC
5197 if (SvIsCOW(sv)) {
5198 /* I believe I need to grab the global SV mutex here and
5199 then recheck the COW status. */
46187eeb
NC
5200 if (DEBUG_C_TEST) {
5201 PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
e419cbc5 5202 sv_dump(sv);
46187eeb 5203 }
5302ffd4
NC
5204 if (SvLEN(sv)) {
5205 sv_release_COW(sv, SvPVX_const(sv), SV_COW_NEXT_SV(sv));
5206 } else {
5207 unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
5208 }
5209
765f542d
NC
5210 /* And drop it here. */
5211 SvFAKE_off(sv);
5212 } else if (SvLEN(sv)) {
3f7c398e 5213 Safefree(SvPVX_const(sv));
765f542d
NC
5214 }
5215 }
5216#else
3f7c398e 5217 else if (SvPVX_const(sv) && SvLEN(sv))
94010e71 5218 Safefree(SvPVX_mutable(sv));
3f7c398e 5219 else if (SvPVX_const(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
bdd68bc3 5220 unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
1c846c1f
NIS
5221 SvFAKE_off(sv);
5222 }
765f542d 5223#endif
79072805
LW
5224 break;
5225 case SVt_NV:
79072805
LW
5226 break;
5227 }
5228
893645bd
NC
5229 SvFLAGS(sv) &= SVf_BREAK;
5230 SvFLAGS(sv) |= SVTYPEMASK;
5231
8edfc514 5232 if (sv_type_details->arena) {
b9502f15 5233 del_body(((char *)SvANY(sv) + sv_type_details->offset),
8edfc514
NC
5234 &PL_body_roots[type]);
5235 }
d2a0f284 5236 else if (sv_type_details->body_size) {
8edfc514
NC
5237 my_safefree(SvANY(sv));
5238 }
79072805
LW
5239}
5240
645c22ef
DM
5241/*
5242=for apidoc sv_newref
5243
5244Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
5245instead.
5246
5247=cut
5248*/
5249
79072805 5250SV *
864dbfa3 5251Perl_sv_newref(pTHX_ SV *sv)
79072805 5252{
96a5add6 5253 PERL_UNUSED_CONTEXT;
463ee0b2 5254 if (sv)
4db098f4 5255 (SvREFCNT(sv))++;
79072805
LW
5256 return sv;
5257}
5258
c461cf8f
JH
5259/*
5260=for apidoc sv_free
5261
645c22ef
DM
5262Decrement an SV's reference count, and if it drops to zero, call
5263C<sv_clear> to invoke destructors and free up any memory used by
5264the body; finally, deallocate the SV's head itself.
5265Normally called via a wrapper macro C<SvREFCNT_dec>.
c461cf8f
JH
5266
5267=cut
5268*/
5269
79072805 5270void
864dbfa3 5271Perl_sv_free(pTHX_ SV *sv)
79072805 5272{
27da23d5 5273 dVAR;
79072805
LW
5274 if (!sv)
5275 return;
a0d0e21e
LW
5276 if (SvREFCNT(sv) == 0) {
5277 if (SvFLAGS(sv) & SVf_BREAK)
645c22ef
DM
5278 /* this SV's refcnt has been artificially decremented to
5279 * trigger cleanup */
a0d0e21e 5280 return;
3280af22 5281 if (PL_in_clean_all) /* All is fair */
1edc1566 5282 return;
d689ffdd
JP
5283 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5284 /* make sure SvREFCNT(sv)==0 happens very seldom */
5285 SvREFCNT(sv) = (~(U32)0)/2;
5286 return;
5287 }
41e4abd8 5288 if (ckWARN_d(WARN_INTERNAL)) {
d5dede04 5289 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
472d47bc
SB
5290 "Attempt to free unreferenced scalar: SV 0x%"UVxf
5291 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
41e4abd8
NC
5292#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
5293 Perl_dump_sv_child(aTHX_ sv);
e4c5322d
DM
5294#else
5295 #ifdef DEBUG_LEAKING_SCALARS
5296 sv_dump(sv);
5297 #endif
41e4abd8
NC
5298#endif
5299 }
79072805
LW
5300 return;
5301 }
4db098f4 5302 if (--(SvREFCNT(sv)) > 0)
8990e307 5303 return;
8c4d3c90
NC
5304 Perl_sv_free2(aTHX_ sv);
5305}
5306
5307void
5308Perl_sv_free2(pTHX_ SV *sv)
5309{
27da23d5 5310 dVAR;
463ee0b2
LW
5311#ifdef DEBUGGING
5312 if (SvTEMP(sv)) {
0453d815 5313 if (ckWARN_d(WARN_DEBUGGING))
9014280d 5314 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
472d47bc
SB
5315 "Attempt to free temp prematurely: SV 0x%"UVxf
5316 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
79072805 5317 return;
79072805 5318 }
463ee0b2 5319#endif
d689ffdd
JP
5320 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5321 /* make sure SvREFCNT(sv)==0 happens very seldom */
5322 SvREFCNT(sv) = (~(U32)0)/2;
5323 return;
5324 }
79072805 5325 sv_clear(sv);
477f5d66
CS
5326 if (! SvREFCNT(sv))
5327 del_SV(sv);
79072805
LW
5328}
5329
954c1994
GS
5330/*
5331=for apidoc sv_len
5332
645c22ef
DM
5333Returns the length of the string in the SV. Handles magic and type
5334coercion. See also C<SvCUR>, which gives raw access to the xpv_cur slot.
954c1994
GS
5335
5336=cut
5337*/
5338
79072805 5339STRLEN
864dbfa3 5340Perl_sv_len(pTHX_ register SV *sv)
79072805 5341{
463ee0b2 5342 STRLEN len;
79072805
LW
5343
5344 if (!sv)
5345 return 0;
5346
8990e307 5347 if (SvGMAGICAL(sv))
565764a8 5348 len = mg_length(sv);
8990e307 5349 else
4d84ee25 5350 (void)SvPV_const(sv, len);
463ee0b2 5351 return len;
79072805
LW
5352}
5353
c461cf8f
JH
5354/*
5355=for apidoc sv_len_utf8
5356
5357Returns the number of characters in the string in an SV, counting wide
1e54db1a 5358UTF-8 bytes as a single character. Handles magic and type coercion.
c461cf8f
JH
5359
5360=cut
5361*/
5362
7e8c5dac
HS
5363/*
5364 * The length is cached in PERL_UTF8_magic, in the mg_len field. Also the
9564a3bd
NC
5365 * mg_ptr is used, by sv_pos_u2b() and sv_pos_b2u() - see the comments below.
5366 * (Note that the mg_len is not the length of the mg_ptr field.
5367 * This allows the cache to store the character length of the string without
5368 * needing to malloc() extra storage to attach to the mg_ptr.)
7a5fa8a2 5369 *
7e8c5dac
HS
5370 */
5371
a0ed51b3 5372STRLEN
864dbfa3 5373Perl_sv_len_utf8(pTHX_ register SV *sv)
a0ed51b3 5374{
a0ed51b3
LW
5375 if (!sv)
5376 return 0;
5377
a0ed51b3 5378 if (SvGMAGICAL(sv))
b76347f2 5379 return mg_length(sv);
a0ed51b3 5380 else
b76347f2 5381 {
26346457 5382 STRLEN len;
e62f0680 5383 const U8 *s = (U8*)SvPV_const(sv, len);
7e8c5dac 5384
26346457
NC
5385 if (PL_utf8cache) {
5386 STRLEN ulen;
5387 MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : 0;
5388
5389 if (mg && mg->mg_len != -1) {
5390 ulen = mg->mg_len;
5391 if (PL_utf8cache < 0) {
5392 const STRLEN real = Perl_utf8_length(aTHX_ s, s + len);
5393 if (real != ulen) {
5394 /* Need to turn the assertions off otherwise we may
5395 recurse infinitely while printing error messages.
5396 */
5397 SAVEI8(PL_utf8cache);
5398 PL_utf8cache = 0;
f5992bc4
RB
5399 Perl_croak(aTHX_ "panic: sv_len_utf8 cache %"UVuf
5400 " real %"UVuf" for %"SVf,
be2597df 5401 (UV) ulen, (UV) real, SVfARG(sv));
26346457
NC
5402 }
5403 }
5404 }
5405 else {
5406 ulen = Perl_utf8_length(aTHX_ s, s + len);
5407 if (!SvREADONLY(sv)) {
5408 if (!mg) {
5409 mg = sv_magicext(sv, 0, PERL_MAGIC_utf8,
5410 &PL_vtbl_utf8, 0, 0);
5411 }
cb9e20bb 5412 assert(mg);
26346457 5413 mg->mg_len = ulen;
cb9e20bb 5414 }
cb9e20bb 5415 }
26346457 5416 return ulen;
7e8c5dac 5417 }
26346457 5418 return Perl_utf8_length(aTHX_ s, s + len);
7e8c5dac
HS
5419 }
5420}
5421
9564a3bd
NC
5422/* Walk forwards to find the byte corresponding to the passed in UTF-8
5423 offset. */
bdf30dd6 5424static STRLEN
721e86b6 5425S_sv_pos_u2b_forwards(const U8 *const start, const U8 *const send,
bdf30dd6
NC
5426 STRLEN uoffset)
5427{
5428 const U8 *s = start;
5429
5430 while (s < send && uoffset--)
5431 s += UTF8SKIP(s);
5432 if (s > send) {
5433 /* This is the existing behaviour. Possibly it should be a croak, as
5434 it's actually a bounds error */
5435 s = send;
5436 }
5437 return s - start;
5438}
5439
9564a3bd
NC
5440/* Given the length of the string in both bytes and UTF-8 characters, decide
5441 whether to walk forwards or backwards to find the byte corresponding to
5442 the passed in UTF-8 offset. */
c336ad0b 5443static STRLEN
721e86b6 5444S_sv_pos_u2b_midway(const U8 *const start, const U8 *send,
c336ad0b
NC
5445 STRLEN uoffset, STRLEN uend)
5446{
5447 STRLEN backw = uend - uoffset;
5448 if (uoffset < 2 * backw) {
25a8a4ef 5449 /* The assumption is that going forwards is twice the speed of going
c336ad0b
NC
5450 forward (that's where the 2 * backw comes from).
5451 (The real figure of course depends on the UTF-8 data.) */
721e86b6 5452 return sv_pos_u2b_forwards(start, send, uoffset);
c336ad0b
NC
5453 }
5454
5455 while (backw--) {
5456 send--;
5457 while (UTF8_IS_CONTINUATION(*send))
5458 send--;
5459 }
5460 return send - start;
5461}
5462
9564a3bd
NC
5463/* For the string representation of the given scalar, find the byte
5464 corresponding to the passed in UTF-8 offset. uoffset0 and boffset0
5465 give another position in the string, *before* the sought offset, which
5466 (which is always true, as 0, 0 is a valid pair of positions), which should
5467 help reduce the amount of linear searching.
5468 If *mgp is non-NULL, it should point to the UTF-8 cache magic, which
5469 will be used to reduce the amount of linear searching. The cache will be
5470 created if necessary, and the found value offered to it for update. */
28ccbf94
NC
5471static STRLEN
5472S_sv_pos_u2b_cached(pTHX_ SV *sv, MAGIC **mgp, const U8 *const start,
5473 const U8 *const send, STRLEN uoffset,
5474 STRLEN uoffset0, STRLEN boffset0) {
7087a21c 5475 STRLEN boffset = 0; /* Actually always set, but let's keep gcc happy. */
c336ad0b
NC
5476 bool found = FALSE;
5477
75c33c12
NC
5478 assert (uoffset >= uoffset0);
5479
c336ad0b 5480 if (SvMAGICAL(sv) && !SvREADONLY(sv) && PL_utf8cache
0905937d 5481 && (*mgp || (*mgp = mg_find(sv, PERL_MAGIC_utf8)))) {
d8b2e1f9
NC
5482 if ((*mgp)->mg_ptr) {
5483 STRLEN *cache = (STRLEN *) (*mgp)->mg_ptr;
5484 if (cache[0] == uoffset) {
5485 /* An exact match. */
5486 return cache[1];
5487 }
ab455f60
NC
5488 if (cache[2] == uoffset) {
5489 /* An exact match. */
5490 return cache[3];
5491 }
668af93f
NC
5492
5493 if (cache[0] < uoffset) {
d8b2e1f9
NC
5494 /* The cache already knows part of the way. */
5495 if (cache[0] > uoffset0) {
5496 /* The cache knows more than the passed in pair */
5497 uoffset0 = cache[0];
5498 boffset0 = cache[1];
5499 }
5500 if ((*mgp)->mg_len != -1) {
5501 /* And we know the end too. */
5502 boffset = boffset0
721e86b6 5503 + sv_pos_u2b_midway(start + boffset0, send,
d8b2e1f9
NC
5504 uoffset - uoffset0,
5505 (*mgp)->mg_len - uoffset0);
5506 } else {
5507 boffset = boffset0
721e86b6 5508 + sv_pos_u2b_forwards(start + boffset0,
d8b2e1f9
NC
5509 send, uoffset - uoffset0);
5510 }
dd7c5fd3
NC
5511 }
5512 else if (cache[2] < uoffset) {
5513 /* We're between the two cache entries. */
5514 if (cache[2] > uoffset0) {
5515 /* and the cache knows more than the passed in pair */
5516 uoffset0 = cache[2];
5517 boffset0 = cache[3];
5518 }
5519
668af93f 5520 boffset = boffset0
721e86b6 5521 + sv_pos_u2b_midway(start + boffset0,
668af93f
NC
5522 start + cache[1],
5523 uoffset - uoffset0,
5524 cache[0] - uoffset0);
dd7c5fd3
NC
5525 } else {
5526 boffset = boffset0
721e86b6 5527 + sv_pos_u2b_midway(start + boffset0,
dd7c5fd3
NC
5528 start + cache[3],
5529 uoffset - uoffset0,
5530 cache[2] - uoffset0);
d8b2e1f9 5531 }
668af93f 5532 found = TRUE;
d8b2e1f9
NC
5533 }
5534 else if ((*mgp)->mg_len != -1) {
75c33c12
NC
5535 /* If we can take advantage of a passed in offset, do so. */
5536 /* In fact, offset0 is either 0, or less than offset, so don't
5537 need to worry about the other possibility. */
5538 boffset = boffset0
721e86b6 5539 + sv_pos_u2b_midway(start + boffset0, send,
75c33c12
NC
5540 uoffset - uoffset0,
5541 (*mgp)->mg_len - uoffset0);
c336ad0b
NC
5542 found = TRUE;
5543 }
28ccbf94 5544 }
c336ad0b
NC
5545
5546 if (!found || PL_utf8cache < 0) {
75c33c12 5547 const STRLEN real_boffset
721e86b6 5548 = boffset0 + sv_pos_u2b_forwards(start + boffset0,
75c33c12
NC
5549 send, uoffset - uoffset0);
5550
c336ad0b
NC
5551 if (found && PL_utf8cache < 0) {
5552 if (real_boffset != boffset) {
5553 /* Need to turn the assertions off otherwise we may recurse
5554 infinitely while printing error messages. */
5555 SAVEI8(PL_utf8cache);
5556 PL_utf8cache = 0;
f5992bc4
RB
5557 Perl_croak(aTHX_ "panic: sv_pos_u2b_cache cache %"UVuf
5558 " real %"UVuf" for %"SVf,
be2597df 5559 (UV) boffset, (UV) real_boffset, SVfARG(sv));
c336ad0b
NC
5560 }
5561 }
5562 boffset = real_boffset;
28ccbf94 5563 }
0905937d 5564
ab455f60 5565 S_utf8_mg_pos_cache_update(aTHX_ sv, mgp, boffset, uoffset, send - start);
28ccbf94
NC
5566 return boffset;
5567}
5568
9564a3bd
NC
5569
5570/*
5571=for apidoc sv_pos_u2b
5572
5573Converts the value pointed to by offsetp from a count of UTF-8 chars from
5574the start of the string, to a count of the equivalent number of bytes; if
5575lenp is non-zero, it does the same to lenp, but this time starting from
5576the offset, rather than from the start of the string. Handles magic and
5577type coercion.
5578
5579=cut
5580*/
5581
5582/*
5583 * sv_pos_u2b() uses, like sv_pos_b2u(), the mg_ptr of the potential
5584 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
5585 * byte offsets. See also the comments of S_utf8_mg_pos_cache_update().
5586 *
5587 */
5588
a0ed51b3 5589void
864dbfa3 5590Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
a0ed51b3 5591{
245d4a47 5592 const U8 *start;
a0ed51b3
LW
5593 STRLEN len;
5594
5595 if (!sv)
5596 return;
5597
245d4a47 5598 start = (U8*)SvPV_const(sv, len);
7e8c5dac 5599 if (len) {
bdf30dd6
NC
5600 STRLEN uoffset = (STRLEN) *offsetp;
5601 const U8 * const send = start + len;
0905937d 5602 MAGIC *mg = NULL;
721e86b6 5603 const STRLEN boffset = sv_pos_u2b_cached(sv, &mg, start, send,
28ccbf94 5604 uoffset, 0, 0);
bdf30dd6
NC
5605
5606 *offsetp = (I32) boffset;
5607
5608 if (lenp) {
28ccbf94 5609 /* Convert the relative offset to absolute. */
721e86b6
AL
5610 const STRLEN uoffset2 = uoffset + (STRLEN) *lenp;
5611 const STRLEN boffset2
5612 = sv_pos_u2b_cached(sv, &mg, start, send, uoffset2,
28ccbf94 5613 uoffset, boffset) - boffset;
bdf30dd6 5614
28ccbf94 5615 *lenp = boffset2;
bdf30dd6 5616 }
7e8c5dac
HS
5617 }
5618 else {
5619 *offsetp = 0;
5620 if (lenp)
5621 *lenp = 0;
a0ed51b3 5622 }
e23c8137 5623
a0ed51b3
LW
5624 return;
5625}
5626
9564a3bd
NC
5627/* Create and update the UTF8 magic offset cache, with the proffered utf8/
5628 byte length pairing. The (byte) length of the total SV is passed in too,
5629 as blen, because for some (more esoteric) SVs, the call to SvPV_const()
5630 may not have updated SvCUR, so we can't rely on reading it directly.
5631
5632 The proffered utf8/byte length pairing isn't used if the cache already has
5633 two pairs, and swapping either for the proffered pair would increase the
5634 RMS of the intervals between known byte offsets.
5635
5636 The cache itself consists of 4 STRLEN values
5637 0: larger UTF-8 offset
5638 1: corresponding byte offset
5639 2: smaller UTF-8 offset
5640 3: corresponding byte offset
5641
5642 Unused cache pairs have the value 0, 0.
5643 Keeping the cache "backwards" means that the invariant of
5644 cache[0] >= cache[2] is maintained even with empty slots, which means that
5645 the code that uses it doesn't need to worry if only 1 entry has actually
5646 been set to non-zero. It also makes the "position beyond the end of the
5647 cache" logic much simpler, as the first slot is always the one to start
5648 from.
645c22ef 5649*/
ec07b5e0 5650static void
ab455f60
NC
5651S_utf8_mg_pos_cache_update(pTHX_ SV *sv, MAGIC **mgp, STRLEN byte, STRLEN utf8,
5652 STRLEN blen)
ec07b5e0
NC
5653{
5654 STRLEN *cache;
5655 if (SvREADONLY(sv))
5656 return;
5657
5658 if (!*mgp) {
5659 *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, (MGVTBL*)&PL_vtbl_utf8, 0,
5660 0);
5661 (*mgp)->mg_len = -1;
5662 }
5663 assert(*mgp);
5664
5665 if (!(cache = (STRLEN *)(*mgp)->mg_ptr)) {
5666 Newxz(cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
5667 (*mgp)->mg_ptr = (char *) cache;
5668 }
5669 assert(cache);
5670
5671 if (PL_utf8cache < 0) {
ef816a78 5672 const U8 *start = (const U8 *) SvPVX_const(sv);
6448472a 5673 const STRLEN realutf8 = utf8_length(start, start + byte);
ec07b5e0
NC
5674
5675 if (realutf8 != utf8) {
5676 /* Need to turn the assertions off otherwise we may recurse
5677 infinitely while printing error messages. */
5678 SAVEI8(PL_utf8cache);
5679 PL_utf8cache = 0;
f5992bc4 5680 Perl_croak(aTHX_ "panic: utf8_mg_pos_cache_update cache %"UVuf
be2597df 5681 " real %"UVuf" for %"SVf, (UV) utf8, (UV) realutf8, SVfARG(sv));
ec07b5e0
NC
5682 }
5683 }
ab455f60
NC
5684
5685 /* Cache is held with the later position first, to simplify the code
5686 that deals with unbounded ends. */
5687
5688 ASSERT_UTF8_CACHE(cache);
5689 if (cache[1] == 0) {
5690 /* Cache is totally empty */
5691 cache[0] = utf8;
5692 cache[1] = byte;
5693 } else if (cache[3] == 0) {
5694 if (byte > cache[1]) {
5695 /* New one is larger, so goes first. */
5696 cache[2] = cache[0];
5697 cache[3] = cache[1];
5698 cache[0] = utf8;
5699 cache[1] = byte;
5700 } else {
5701 cache[2] = utf8;
5702 cache[3] = byte;
5703 }
5704 } else {
5705#define THREEWAY_SQUARE(a,b,c,d) \
5706 ((float)((d) - (c))) * ((float)((d) - (c))) \
5707 + ((float)((c) - (b))) * ((float)((c) - (b))) \
5708 + ((float)((b) - (a))) * ((float)((b) - (a)))
5709
5710 /* Cache has 2 slots in use, and we know three potential pairs.
5711 Keep the two that give the lowest RMS distance. Do the
5712 calcualation in bytes simply because we always know the byte
5713 length. squareroot has the same ordering as the positive value,
5714 so don't bother with the actual square root. */
5715 const float existing = THREEWAY_SQUARE(0, cache[3], cache[1], blen);
5716 if (byte > cache[1]) {
5717 /* New position is after the existing pair of pairs. */
5718 const float keep_earlier
5719 = THREEWAY_SQUARE(0, cache[3], byte, blen);
5720 const float keep_later
5721 = THREEWAY_SQUARE(0, cache[1], byte, blen);
5722
5723 if (keep_later < keep_earlier) {
5724 if (keep_later < existing) {
5725 cache[2] = cache[0];
5726 cache[3] = cache[1];
5727 cache[0] = utf8;
5728 cache[1] = byte;
5729 }
5730 }
5731 else {
5732 if (keep_earlier < existing) {
5733 cache[0] = utf8;
5734 cache[1] = byte;
5735 }
5736 }
5737 }
57d7fbf1
NC
5738 else if (byte > cache[3]) {
5739 /* New position is between the existing pair of pairs. */
5740 const float keep_earlier
5741 = THREEWAY_SQUARE(0, cache[3], byte, blen);
5742 const float keep_later
5743 = THREEWAY_SQUARE(0, byte, cache[1], blen);
5744
5745 if (keep_later < keep_earlier) {
5746 if (keep_later < existing) {
5747 cache[2] = utf8;
5748 cache[3] = byte;
5749 }
5750 }
5751 else {
5752 if (keep_earlier < existing) {
5753 cache[0] = utf8;
5754 cache[1] = byte;
5755 }
5756 }
5757 }
5758 else {
5759 /* New position is before the existing pair of pairs. */
5760 const float keep_earlier
5761 = THREEWAY_SQUARE(0, byte, cache[3], blen);
5762 const float keep_later
5763 = THREEWAY_SQUARE(0, byte, cache[1], blen);
5764
5765 if (keep_later < keep_earlier) {
5766 if (keep_later < existing) {
5767 cache[2] = utf8;
5768 cache[3] = byte;
5769 }
5770 }
5771 else {
5772 if (keep_earlier < existing) {
5773 cache[0] = cache[2];
5774 cache[1] = cache[3];
5775 cache[2] = utf8;
5776 cache[3] = byte;
5777 }
5778 }
5779 }
ab455f60 5780 }
0905937d 5781 ASSERT_UTF8_CACHE(cache);
ec07b5e0
NC
5782}
5783
ec07b5e0 5784/* We already know all of the way, now we may be able to walk back. The same
25a8a4ef
NC
5785 assumption is made as in S_sv_pos_u2b_midway(), namely that walking
5786 backward is half the speed of walking forward. */
ec07b5e0
NC
5787static STRLEN
5788S_sv_pos_b2u_midway(pTHX_ const U8 *s, const U8 *const target, const U8 *end,
5789 STRLEN endu)
5790{
5791 const STRLEN forw = target - s;
5792 STRLEN backw = end - target;
5793
5794 if (forw < 2 * backw) {
6448472a 5795 return utf8_length(s, target);
ec07b5e0
NC
5796 }
5797
5798 while (end > target) {
5799 end--;
5800 while (UTF8_IS_CONTINUATION(*end)) {
5801 end--;
5802 }
5803 endu--;
5804 }
5805 return endu;
5806}
5807
9564a3bd
NC
5808/*
5809=for apidoc sv_pos_b2u
5810
5811Converts the value pointed to by offsetp from a count of bytes from the
5812start of the string, to a count of the equivalent number of UTF-8 chars.
5813Handles magic and type coercion.
5814
5815=cut
5816*/
5817
5818/*
5819 * sv_pos_b2u() uses, like sv_pos_u2b(), the mg_ptr of the potential
5820 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
5821 * byte offsets.
5822 *
5823 */
a0ed51b3 5824void
7e8c5dac 5825Perl_sv_pos_b2u(pTHX_ register SV* sv, I32* offsetp)
a0ed51b3 5826{
83003860 5827 const U8* s;
ec07b5e0 5828 const STRLEN byte = *offsetp;
7087a21c 5829 STRLEN len = 0; /* Actually always set, but let's keep gcc happy. */
ab455f60 5830 STRLEN blen;
ec07b5e0
NC
5831 MAGIC* mg = NULL;
5832 const U8* send;
a922f900 5833 bool found = FALSE;
a0ed51b3
LW
5834
5835 if (!sv)
5836 return;
5837
ab455f60 5838 s = (const U8*)SvPV_const(sv, blen);
7e8c5dac 5839
ab455f60 5840 if (blen < byte)
ec07b5e0 5841 Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
7e8c5dac 5842
ec07b5e0 5843 send = s + byte;
a67d7df9 5844
ffca234a
NC
5845 if (SvMAGICAL(sv) && !SvREADONLY(sv) && PL_utf8cache
5846 && (mg = mg_find(sv, PERL_MAGIC_utf8))) {
5847 if (mg->mg_ptr) {
d4c19fe8 5848 STRLEN * const cache = (STRLEN *) mg->mg_ptr;
b9f984a5 5849 if (cache[1] == byte) {
ec07b5e0
NC
5850 /* An exact match. */
5851 *offsetp = cache[0];
ec07b5e0 5852 return;
7e8c5dac 5853 }
ab455f60
NC
5854 if (cache[3] == byte) {
5855 /* An exact match. */
5856 *offsetp = cache[2];
5857 return;
5858 }
668af93f
NC
5859
5860 if (cache[1] < byte) {
ec07b5e0 5861 /* We already know part of the way. */
b9f984a5
NC
5862 if (mg->mg_len != -1) {
5863 /* Actually, we know the end too. */
5864 len = cache[0]
5865 + S_sv_pos_b2u_midway(aTHX_ s + cache[1], send,
ab455f60 5866 s + blen, mg->mg_len - cache[0]);
b9f984a5 5867 } else {
6448472a 5868 len = cache[0] + utf8_length(s + cache[1], send);
b9f984a5 5869 }
7e8c5dac 5870 }
9f985e4c
NC
5871 else if (cache[3] < byte) {
5872 /* We're between the two cached pairs, so we do the calculation
5873 offset by the byte/utf-8 positions for the earlier pair,
5874 then add the utf-8 characters from the string start to
5875 there. */
5876 len = S_sv_pos_b2u_midway(aTHX_ s + cache[3], send,
5877 s + cache[1], cache[0] - cache[2])
5878 + cache[2];
5879
5880 }
5881 else { /* cache[3] > byte */
5882 len = S_sv_pos_b2u_midway(aTHX_ s, send, s + cache[3],
5883 cache[2]);
7e8c5dac 5884
7e8c5dac 5885 }
ec07b5e0 5886 ASSERT_UTF8_CACHE(cache);
a922f900 5887 found = TRUE;
ffca234a 5888 } else if (mg->mg_len != -1) {
ab455f60 5889 len = S_sv_pos_b2u_midway(aTHX_ s, send, s + blen, mg->mg_len);
a922f900 5890 found = TRUE;
7e8c5dac 5891 }
a0ed51b3 5892 }
a922f900 5893 if (!found || PL_utf8cache < 0) {
6448472a 5894 const STRLEN real_len = utf8_length(s, send);
a922f900
NC
5895
5896 if (found && PL_utf8cache < 0) {
5897 if (len != real_len) {
5898 /* Need to turn the assertions off otherwise we may recurse
5899 infinitely while printing error messages. */
5900 SAVEI8(PL_utf8cache);
5901 PL_utf8cache = 0;
f5992bc4
RB
5902 Perl_croak(aTHX_ "panic: sv_pos_b2u cache %"UVuf
5903 " real %"UVuf" for %"SVf,
be2597df 5904 (UV) len, (UV) real_len, SVfARG(sv));
a922f900
NC
5905 }
5906 }
5907 len = real_len;
ec07b5e0
NC
5908 }
5909 *offsetp = len;
5910
ab455f60 5911 S_utf8_mg_pos_cache_update(aTHX_ sv, &mg, byte, len, blen);
a0ed51b3
LW
5912}
5913
954c1994
GS
5914/*
5915=for apidoc sv_eq
5916
5917Returns a boolean indicating whether the strings in the two SVs are
645c22ef
DM
5918identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
5919coerce its args to strings if necessary.
954c1994
GS
5920
5921=cut
5922*/
5923
79072805 5924I32
e01b9e88 5925Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
79072805 5926{
97aff369 5927 dVAR;
e1ec3a88 5928 const char *pv1;
463ee0b2 5929 STRLEN cur1;
e1ec3a88 5930 const char *pv2;
463ee0b2 5931 STRLEN cur2;
e01b9e88 5932 I32 eq = 0;
bd61b366 5933 char *tpv = NULL;
a0714e2c 5934 SV* svrecode = NULL;
79072805 5935
e01b9e88 5936 if (!sv1) {
79072805
LW
5937 pv1 = "";
5938 cur1 = 0;
5939 }
ced497e2
YST
5940 else {
5941 /* if pv1 and pv2 are the same, second SvPV_const call may
5942 * invalidate pv1, so we may need to make a copy */
5943 if (sv1 == sv2 && (SvTHINKFIRST(sv1) || SvGMAGICAL(sv1))) {
5944 pv1 = SvPV_const(sv1, cur1);
5945 sv1 = sv_2mortal(newSVpvn(pv1, cur1));
5946 if (SvUTF8(sv2)) SvUTF8_on(sv1);
5947 }
4d84ee25 5948 pv1 = SvPV_const(sv1, cur1);
ced497e2 5949 }
79072805 5950
e01b9e88
SC
5951 if (!sv2){
5952 pv2 = "";
5953 cur2 = 0;
92d29cee 5954 }
e01b9e88 5955 else
4d84ee25 5956 pv2 = SvPV_const(sv2, cur2);
79072805 5957
cf48d248 5958 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
5959 /* Differing utf8ness.
5960 * Do not UTF8size the comparands as a side-effect. */
5961 if (PL_encoding) {
5962 if (SvUTF8(sv1)) {
553e1bcc
AT
5963 svrecode = newSVpvn(pv2, cur2);
5964 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 5965 pv2 = SvPV_const(svrecode, cur2);
799ef3cb
JH
5966 }
5967 else {
553e1bcc
AT
5968 svrecode = newSVpvn(pv1, cur1);
5969 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 5970 pv1 = SvPV_const(svrecode, cur1);
799ef3cb
JH
5971 }
5972 /* Now both are in UTF-8. */
0a1bd7ac
DM
5973 if (cur1 != cur2) {
5974 SvREFCNT_dec(svrecode);
799ef3cb 5975 return FALSE;
0a1bd7ac 5976 }
799ef3cb
JH
5977 }
5978 else {
5979 bool is_utf8 = TRUE;
5980
5981 if (SvUTF8(sv1)) {
5982 /* sv1 is the UTF-8 one,
5983 * if is equal it must be downgrade-able */
9d4ba2ae 5984 char * const pv = (char*)bytes_from_utf8((const U8*)pv1,
799ef3cb
JH
5985 &cur1, &is_utf8);
5986 if (pv != pv1)
553e1bcc 5987 pv1 = tpv = pv;
799ef3cb
JH
5988 }
5989 else {
5990 /* sv2 is the UTF-8 one,
5991 * if is equal it must be downgrade-able */
9d4ba2ae 5992 char * const pv = (char *)bytes_from_utf8((const U8*)pv2,
799ef3cb
JH
5993 &cur2, &is_utf8);
5994 if (pv != pv2)
553e1bcc 5995 pv2 = tpv = pv;
799ef3cb
JH
5996 }
5997 if (is_utf8) {
5998 /* Downgrade not possible - cannot be eq */
bf694877 5999 assert (tpv == 0);
799ef3cb
JH
6000 return FALSE;
6001 }
6002 }
cf48d248
JH
6003 }
6004
6005 if (cur1 == cur2)
765f542d 6006 eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
e01b9e88 6007
b37c2d43 6008 SvREFCNT_dec(svrecode);
553e1bcc
AT
6009 if (tpv)
6010 Safefree(tpv);
cf48d248 6011
e01b9e88 6012 return eq;
79072805
LW
6013}
6014
954c1994
GS
6015/*
6016=for apidoc sv_cmp
6017
6018Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
6019string in C<sv1> is less than, equal to, or greater than the string in
645c22ef
DM
6020C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6021coerce its args to strings if necessary. See also C<sv_cmp_locale>.
954c1994
GS
6022
6023=cut
6024*/
6025
79072805 6026I32
e01b9e88 6027Perl_sv_cmp(pTHX_ register SV *sv1, register SV *sv2)
79072805 6028{
97aff369 6029 dVAR;
560a288e 6030 STRLEN cur1, cur2;
e1ec3a88 6031 const char *pv1, *pv2;
bd61b366 6032 char *tpv = NULL;
cf48d248 6033 I32 cmp;
a0714e2c 6034 SV *svrecode = NULL;
560a288e 6035
e01b9e88
SC
6036 if (!sv1) {
6037 pv1 = "";
560a288e
GS
6038 cur1 = 0;
6039 }
e01b9e88 6040 else
4d84ee25 6041 pv1 = SvPV_const(sv1, cur1);
560a288e 6042
553e1bcc 6043 if (!sv2) {
e01b9e88 6044 pv2 = "";
560a288e
GS
6045 cur2 = 0;
6046 }
e01b9e88 6047 else
4d84ee25 6048 pv2 = SvPV_const(sv2, cur2);
79072805 6049
cf48d248 6050 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
6051 /* Differing utf8ness.
6052 * Do not UTF8size the comparands as a side-effect. */
cf48d248 6053 if (SvUTF8(sv1)) {
799ef3cb 6054 if (PL_encoding) {
553e1bcc
AT
6055 svrecode = newSVpvn(pv2, cur2);
6056 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 6057 pv2 = SvPV_const(svrecode, cur2);
799ef3cb
JH
6058 }
6059 else {
e1ec3a88 6060 pv2 = tpv = (char*)bytes_to_utf8((const U8*)pv2, &cur2);
799ef3cb 6061 }
cf48d248
JH
6062 }
6063 else {
799ef3cb 6064 if (PL_encoding) {
553e1bcc
AT
6065 svrecode = newSVpvn(pv1, cur1);
6066 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 6067 pv1 = SvPV_const(svrecode, cur1);
799ef3cb
JH
6068 }
6069 else {
e1ec3a88 6070 pv1 = tpv = (char*)bytes_to_utf8((const U8*)pv1, &cur1);
799ef3cb 6071 }
cf48d248
JH
6072 }
6073 }
6074
e01b9e88 6075 if (!cur1) {
cf48d248 6076 cmp = cur2 ? -1 : 0;
e01b9e88 6077 } else if (!cur2) {
cf48d248
JH
6078 cmp = 1;
6079 } else {
e1ec3a88 6080 const I32 retval = memcmp((const void*)pv1, (const void*)pv2, cur1 < cur2 ? cur1 : cur2);
e01b9e88
SC
6081
6082 if (retval) {
cf48d248 6083 cmp = retval < 0 ? -1 : 1;
e01b9e88 6084 } else if (cur1 == cur2) {
cf48d248
JH
6085 cmp = 0;
6086 } else {
6087 cmp = cur1 < cur2 ? -1 : 1;
e01b9e88 6088 }
cf48d248 6089 }
16660edb 6090
b37c2d43 6091 SvREFCNT_dec(svrecode);
553e1bcc
AT
6092 if (tpv)
6093 Safefree(tpv);
cf48d248
JH
6094
6095 return cmp;
bbce6d69 6096}
16660edb 6097
c461cf8f
JH
6098/*
6099=for apidoc sv_cmp_locale
6100
645c22ef
DM
6101Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
6102'use bytes' aware, handles get magic, and will coerce its args to strings
6103if necessary. See also C<sv_cmp_locale>. See also C<sv_cmp>.
c461cf8f
JH
6104
6105=cut
6106*/
6107
bbce6d69 6108I32
864dbfa3 6109Perl_sv_cmp_locale(pTHX_ register SV *sv1, register SV *sv2)
bbce6d69 6110{
97aff369 6111 dVAR;
36477c24 6112#ifdef USE_LOCALE_COLLATE
16660edb 6113
bbce6d69 6114 char *pv1, *pv2;
6115 STRLEN len1, len2;
6116 I32 retval;
16660edb 6117
3280af22 6118 if (PL_collation_standard)
bbce6d69 6119 goto raw_compare;
16660edb 6120
bbce6d69 6121 len1 = 0;
8ac85365 6122 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
bbce6d69 6123 len2 = 0;
8ac85365 6124 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
16660edb 6125
bbce6d69 6126 if (!pv1 || !len1) {
6127 if (pv2 && len2)
6128 return -1;
6129 else
6130 goto raw_compare;
6131 }
6132 else {
6133 if (!pv2 || !len2)
6134 return 1;
6135 }
16660edb 6136
bbce6d69 6137 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 6138
bbce6d69 6139 if (retval)
16660edb 6140 return retval < 0 ? -1 : 1;
6141
bbce6d69 6142 /*
6143 * When the result of collation is equality, that doesn't mean
6144 * that there are no differences -- some locales exclude some
6145 * characters from consideration. So to avoid false equalities,
6146 * we use the raw string as a tiebreaker.
6147 */
16660edb 6148
bbce6d69 6149 raw_compare:
5f66b61c 6150 /*FALLTHROUGH*/
16660edb 6151
36477c24 6152#endif /* USE_LOCALE_COLLATE */
16660edb 6153
bbce6d69 6154 return sv_cmp(sv1, sv2);
6155}
79072805 6156
645c22ef 6157
36477c24 6158#ifdef USE_LOCALE_COLLATE
645c22ef 6159
7a4c00b4 6160/*
645c22ef
DM
6161=for apidoc sv_collxfrm
6162
6163Add Collate Transform magic to an SV if it doesn't already have it.
6164
6165Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
6166scalar data of the variable, but transformed to such a format that a normal
6167memory comparison can be used to compare the data according to the locale
6168settings.
6169
6170=cut
6171*/
6172
bbce6d69 6173char *
864dbfa3 6174Perl_sv_collxfrm(pTHX_ SV *sv, STRLEN *nxp)
bbce6d69 6175{
97aff369 6176 dVAR;
7a4c00b4 6177 MAGIC *mg;
16660edb 6178
14befaf4 6179 mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
3280af22 6180 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
93524f2b
NC
6181 const char *s;
6182 char *xf;
bbce6d69 6183 STRLEN len, xlen;
6184
7a4c00b4 6185 if (mg)
6186 Safefree(mg->mg_ptr);
93524f2b 6187 s = SvPV_const(sv, len);
bbce6d69 6188 if ((xf = mem_collxfrm(s, len, &xlen))) {
ff0cee69 6189 if (SvREADONLY(sv)) {
6190 SAVEFREEPV(xf);
6191 *nxp = xlen;
3280af22 6192 return xf + sizeof(PL_collation_ix);
ff0cee69 6193 }
7a4c00b4 6194 if (! mg) {
d83f0a82
NC
6195#ifdef PERL_OLD_COPY_ON_WRITE
6196 if (SvIsCOW(sv))
6197 sv_force_normal_flags(sv, 0);
6198#endif
6199 mg = sv_magicext(sv, 0, PERL_MAGIC_collxfrm, &PL_vtbl_collxfrm,
6200 0, 0);
7a4c00b4 6201 assert(mg);
bbce6d69 6202 }
7a4c00b4 6203 mg->mg_ptr = xf;
565764a8 6204 mg->mg_len = xlen;
7a4c00b4 6205 }
6206 else {
ff0cee69 6207 if (mg) {
6208 mg->mg_ptr = NULL;
565764a8 6209 mg->mg_len = -1;
ff0cee69 6210 }
bbce6d69 6211 }
6212 }
7a4c00b4 6213 if (mg && mg->mg_ptr) {
565764a8 6214 *nxp = mg->mg_len;
3280af22 6215 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 6216 }
6217 else {
6218 *nxp = 0;
6219 return NULL;
16660edb 6220 }
79072805
LW
6221}
6222
36477c24 6223#endif /* USE_LOCALE_COLLATE */
bbce6d69 6224
c461cf8f
JH
6225/*
6226=for apidoc sv_gets
6227
6228Get a line from the filehandle and store it into the SV, optionally
6229appending to the currently-stored string.
6230
6231=cut
6232*/
6233
79072805 6234char *
864dbfa3 6235Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
79072805 6236{
97aff369 6237 dVAR;
e1ec3a88 6238 const char *rsptr;
c07a80fd 6239 STRLEN rslen;
6240 register STDCHAR rslast;
6241 register STDCHAR *bp;
6242 register I32 cnt;
9c5ffd7c 6243 I32 i = 0;
8bfdd7d9 6244 I32 rspara = 0;
c07a80fd 6245
bc44a8a2
NC
6246 if (SvTHINKFIRST(sv))
6247 sv_force_normal_flags(sv, append ? 0 : SV_COW_DROP_PV);
765f542d
NC
6248 /* XXX. If you make this PVIV, then copy on write can copy scalars read
6249 from <>.
6250 However, perlbench says it's slower, because the existing swipe code
6251 is faster than copy on write.
6252 Swings and roundabouts. */
862a34c6 6253 SvUPGRADE(sv, SVt_PV);
99491443 6254
ff68c719 6255 SvSCREAM_off(sv);
efd8b2ba
AE
6256
6257 if (append) {
6258 if (PerlIO_isutf8(fp)) {
6259 if (!SvUTF8(sv)) {
6260 sv_utf8_upgrade_nomg(sv);
6261 sv_pos_u2b(sv,&append,0);
6262 }
6263 } else if (SvUTF8(sv)) {
561b68a9 6264 SV * const tsv = newSV(0);
efd8b2ba
AE
6265 sv_gets(tsv, fp, 0);
6266 sv_utf8_upgrade_nomg(tsv);
6267 SvCUR_set(sv,append);
6268 sv_catsv(sv,tsv);
6269 sv_free(tsv);
6270 goto return_string_or_null;
6271 }
6272 }
6273
6274 SvPOK_only(sv);
6275 if (PerlIO_isutf8(fp))
6276 SvUTF8_on(sv);
c07a80fd 6277
923e4eb5 6278 if (IN_PERL_COMPILETIME) {
8bfdd7d9
HS
6279 /* we always read code in line mode */
6280 rsptr = "\n";
6281 rslen = 1;
6282 }
6283 else if (RsSNARF(PL_rs)) {
7a5fa8a2 6284 /* If it is a regular disk file use size from stat() as estimate
acbd132f
JH
6285 of amount we are going to read -- may result in mallocing
6286 more memory than we really need if the layers below reduce
6287 the size we read (e.g. CRLF or a gzip layer).
e468d35b 6288 */
e311fd51 6289 Stat_t st;
e468d35b 6290 if (!PerlLIO_fstat(PerlIO_fileno(fp), &st) && S_ISREG(st.st_mode)) {
f54cb97a 6291 const Off_t offset = PerlIO_tell(fp);
58f1856e 6292 if (offset != (Off_t) -1 && st.st_size + append > offset) {
e468d35b
NIS
6293 (void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 1));
6294 }
6295 }
c07a80fd 6296 rsptr = NULL;
6297 rslen = 0;
6298 }
3280af22 6299 else if (RsRECORD(PL_rs)) {
e311fd51 6300 I32 bytesread;
5b2b9c68 6301 char *buffer;
acbd132f 6302 U32 recsize;
5b2b9c68
HM
6303
6304 /* Grab the size of the record we're getting */
acbd132f 6305 recsize = SvUV(SvRV(PL_rs)); /* RsRECORD() guarantees > 0. */
e311fd51 6306 buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append;
5b2b9c68
HM
6307 /* Go yank in */
6308#ifdef VMS
6309 /* VMS wants read instead of fread, because fread doesn't respect */
6310 /* RMS record boundaries. This is not necessarily a good thing to be */
e468d35b
NIS
6311 /* doing, but we've got no other real choice - except avoid stdio
6312 as implementation - perhaps write a :vms layer ?
6313 */
5b2b9c68
HM
6314 bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
6315#else
6316 bytesread = PerlIO_read(fp, buffer, recsize);
6317#endif
27e6ca2d
AE
6318 if (bytesread < 0)
6319 bytesread = 0;
e311fd51 6320 SvCUR_set(sv, bytesread += append);
e670df4e 6321 buffer[bytesread] = '\0';
efd8b2ba 6322 goto return_string_or_null;
5b2b9c68 6323 }
3280af22 6324 else if (RsPARA(PL_rs)) {
c07a80fd 6325 rsptr = "\n\n";
6326 rslen = 2;
8bfdd7d9 6327 rspara = 1;
c07a80fd 6328 }
7d59b7e4
NIS
6329 else {
6330 /* Get $/ i.e. PL_rs into same encoding as stream wants */
6331 if (PerlIO_isutf8(fp)) {
6332 rsptr = SvPVutf8(PL_rs, rslen);
6333 }
6334 else {
6335 if (SvUTF8(PL_rs)) {
6336 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
6337 Perl_croak(aTHX_ "Wide character in $/");
6338 }
6339 }
93524f2b 6340 rsptr = SvPV_const(PL_rs, rslen);
7d59b7e4
NIS
6341 }
6342 }
6343
c07a80fd 6344 rslast = rslen ? rsptr[rslen - 1] : '\0';
6345
8bfdd7d9 6346 if (rspara) { /* have to do this both before and after */
79072805 6347 do { /* to make sure file boundaries work right */
760ac839 6348 if (PerlIO_eof(fp))
a0d0e21e 6349 return 0;
760ac839 6350 i = PerlIO_getc(fp);
79072805 6351 if (i != '\n') {
a0d0e21e
LW
6352 if (i == -1)
6353 return 0;
760ac839 6354 PerlIO_ungetc(fp,i);
79072805
LW
6355 break;
6356 }
6357 } while (i != EOF);
6358 }
c07a80fd 6359
760ac839
LW
6360 /* See if we know enough about I/O mechanism to cheat it ! */
6361
6362 /* This used to be #ifdef test - it is made run-time test for ease
1c846c1f 6363 of abstracting out stdio interface. One call should be cheap
760ac839
LW
6364 enough here - and may even be a macro allowing compile
6365 time optimization.
6366 */
6367
6368 if (PerlIO_fast_gets(fp)) {
6369
6370 /*
6371 * We're going to steal some values from the stdio struct
6372 * and put EVERYTHING in the innermost loop into registers.
6373 */
6374 register STDCHAR *ptr;
6375 STRLEN bpx;
6376 I32 shortbuffered;
6377
16660edb 6378#if defined(VMS) && defined(PERLIO_IS_STDIO)
6379 /* An ungetc()d char is handled separately from the regular
6380 * buffer, so we getc() it back out and stuff it in the buffer.
6381 */
6382 i = PerlIO_getc(fp);
6383 if (i == EOF) return 0;
6384 *(--((*fp)->_ptr)) = (unsigned char) i;
6385 (*fp)->_cnt++;
6386#endif
c07a80fd 6387
c2960299 6388 /* Here is some breathtakingly efficient cheating */
c07a80fd 6389
a20bf0c3 6390 cnt = PerlIO_get_cnt(fp); /* get count into register */
e468d35b 6391 /* make sure we have the room */
7a5fa8a2 6392 if ((I32)(SvLEN(sv) - append) <= cnt + 1) {
e468d35b 6393 /* Not room for all of it
7a5fa8a2 6394 if we are looking for a separator and room for some
e468d35b
NIS
6395 */
6396 if (rslen && cnt > 80 && (I32)SvLEN(sv) > append) {
7a5fa8a2 6397 /* just process what we have room for */
79072805
LW
6398 shortbuffered = cnt - SvLEN(sv) + append + 1;
6399 cnt -= shortbuffered;
6400 }
6401 else {
6402 shortbuffered = 0;
bbce6d69 6403 /* remember that cnt can be negative */
eb160463 6404 SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
79072805
LW
6405 }
6406 }
7a5fa8a2 6407 else
79072805 6408 shortbuffered = 0;
3f7c398e 6409 bp = (STDCHAR*)SvPVX_const(sv) + append; /* move these two too to registers */
a20bf0c3 6410 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 6411 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6412 "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
16660edb 6413 DEBUG_P(PerlIO_printf(Perl_debug_log,
ba7abf9d 6414 "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6415 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6416 PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
6417 for (;;) {
6418 screamer:
93a17b20 6419 if (cnt > 0) {
c07a80fd 6420 if (rslen) {
760ac839
LW
6421 while (cnt > 0) { /* this | eat */
6422 cnt--;
c07a80fd 6423 if ((*bp++ = *ptr++) == rslast) /* really | dust */
6424 goto thats_all_folks; /* screams | sed :-) */
6425 }
6426 }
6427 else {
1c846c1f
NIS
6428 Copy(ptr, bp, cnt, char); /* this | eat */
6429 bp += cnt; /* screams | dust */
c07a80fd 6430 ptr += cnt; /* louder | sed :-) */
a5f75d66 6431 cnt = 0;
93a17b20 6432 }
79072805
LW
6433 }
6434
748a9306 6435 if (shortbuffered) { /* oh well, must extend */
79072805
LW
6436 cnt = shortbuffered;
6437 shortbuffered = 0;
3f7c398e 6438 bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
79072805
LW
6439 SvCUR_set(sv, bpx);
6440 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
3f7c398e 6441 bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
79072805
LW
6442 continue;
6443 }
6444
16660edb 6445 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841
GS
6446 "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
6447 PTR2UV(ptr),(long)cnt));
cc00df79 6448 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
ba7abf9d 6449#if 0
16660edb 6450 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6451 "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6452 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6453 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 6454#endif
1c846c1f 6455 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b 6456 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
6457 another abstraction. */
760ac839 6458 i = PerlIO_getc(fp); /* get more characters */
ba7abf9d 6459#if 0
16660edb 6460 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6461 "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6462 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6463 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 6464#endif
a20bf0c3
JH
6465 cnt = PerlIO_get_cnt(fp);
6466 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
16660edb 6467 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6468 "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
79072805 6469
748a9306
LW
6470 if (i == EOF) /* all done for ever? */
6471 goto thats_really_all_folks;
6472
3f7c398e 6473 bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
79072805
LW
6474 SvCUR_set(sv, bpx);
6475 SvGROW(sv, bpx + cnt + 2);
3f7c398e 6476 bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
c07a80fd 6477
eb160463 6478 *bp++ = (STDCHAR)i; /* store character from PerlIO_getc */
79072805 6479
c07a80fd 6480 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
79072805 6481 goto thats_all_folks;
79072805
LW
6482 }
6483
6484thats_all_folks:
3f7c398e 6485 if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX_const(sv)) < rslen) ||
36477c24 6486 memNE((char*)bp - rslen, rsptr, rslen))
760ac839 6487 goto screamer; /* go back to the fray */
79072805
LW
6488thats_really_all_folks:
6489 if (shortbuffered)
6490 cnt += shortbuffered;
16660edb 6491 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6492 "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
cc00df79 6493 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* put these back or we're in trouble */
16660edb 6494 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6495 "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6496 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6497 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
79072805 6498 *bp = '\0';
3f7c398e 6499 SvCUR_set(sv, bp - (STDCHAR*)SvPVX_const(sv)); /* set length */
16660edb 6500 DEBUG_P(PerlIO_printf(Perl_debug_log,
fb73857a 6501 "Screamer: done, len=%ld, string=|%.*s|\n",
3f7c398e 6502 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX_const(sv)));
760ac839
LW
6503 }
6504 else
79072805 6505 {
6edd2cd5 6506 /*The big, slow, and stupid way. */
27da23d5 6507#ifdef USE_HEAP_INSTEAD_OF_STACK /* Even slower way. */
cbbf8932 6508 STDCHAR *buf = NULL;
a02a5408 6509 Newx(buf, 8192, STDCHAR);
6edd2cd5 6510 assert(buf);
4d2c4e07 6511#else
6edd2cd5 6512 STDCHAR buf[8192];
4d2c4e07 6513#endif
79072805 6514
760ac839 6515screamer2:
c07a80fd 6516 if (rslen) {
00b6aa41 6517 register const STDCHAR * const bpe = buf + sizeof(buf);
760ac839 6518 bp = buf;
eb160463 6519 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
760ac839
LW
6520 ; /* keep reading */
6521 cnt = bp - buf;
c07a80fd 6522 }
6523 else {
760ac839 6524 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
16660edb 6525 /* Accomodate broken VAXC compiler, which applies U8 cast to
6526 * both args of ?: operator, causing EOF to change into 255
6527 */
37be0adf 6528 if (cnt > 0)
cbe9e203
JH
6529 i = (U8)buf[cnt - 1];
6530 else
37be0adf 6531 i = EOF;
c07a80fd 6532 }
79072805 6533
cbe9e203
JH
6534 if (cnt < 0)
6535 cnt = 0; /* we do need to re-set the sv even when cnt <= 0 */
6536 if (append)
6537 sv_catpvn(sv, (char *) buf, cnt);
6538 else
6539 sv_setpvn(sv, (char *) buf, cnt);
c07a80fd 6540
6541 if (i != EOF && /* joy */
6542 (!rslen ||
6543 SvCUR(sv) < rslen ||
3f7c398e 6544 memNE(SvPVX_const(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
79072805
LW
6545 {
6546 append = -1;
63e4d877
CS
6547 /*
6548 * If we're reading from a TTY and we get a short read,
6549 * indicating that the user hit his EOF character, we need
6550 * to notice it now, because if we try to read from the TTY
6551 * again, the EOF condition will disappear.
6552 *
6553 * The comparison of cnt to sizeof(buf) is an optimization
6554 * that prevents unnecessary calls to feof().
6555 *
6556 * - jik 9/25/96
6557 */
bb7a0f54 6558 if (!(cnt < (I32)sizeof(buf) && PerlIO_eof(fp)))
63e4d877 6559 goto screamer2;
79072805 6560 }
6edd2cd5 6561
27da23d5 6562#ifdef USE_HEAP_INSTEAD_OF_STACK
6edd2cd5
JH
6563 Safefree(buf);
6564#endif
79072805
LW
6565 }
6566
8bfdd7d9 6567 if (rspara) { /* have to do this both before and after */
c07a80fd 6568 while (i != EOF) { /* to make sure file boundaries work right */
760ac839 6569 i = PerlIO_getc(fp);
79072805 6570 if (i != '\n') {
760ac839 6571 PerlIO_ungetc(fp,i);
79072805
LW
6572 break;
6573 }
6574 }
6575 }
c07a80fd 6576
efd8b2ba 6577return_string_or_null:
bd61b366 6578 return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
79072805
LW
6579}
6580
954c1994
GS
6581/*
6582=for apidoc sv_inc
6583
645c22ef
DM
6584Auto-increment of the value in the SV, doing string to numeric conversion
6585if necessary. Handles 'get' magic.
954c1994
GS
6586
6587=cut
6588*/
6589
79072805 6590void
864dbfa3 6591Perl_sv_inc(pTHX_ register SV *sv)
79072805 6592{
97aff369 6593 dVAR;
79072805 6594 register char *d;
463ee0b2 6595 int flags;
79072805
LW
6596
6597 if (!sv)
6598 return;
5b295bef 6599 SvGETMAGIC(sv);
ed6116ce 6600 if (SvTHINKFIRST(sv)) {
765f542d
NC
6601 if (SvIsCOW(sv))
6602 sv_force_normal_flags(sv, 0);
0f15f207 6603 if (SvREADONLY(sv)) {
923e4eb5 6604 if (IN_PERL_RUNTIME)
cea2e8a9 6605 Perl_croak(aTHX_ PL_no_modify);
0f15f207 6606 }
a0d0e21e 6607 if (SvROK(sv)) {
b5be31e9 6608 IV i;
9e7bc3e8
JD
6609 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
6610 return;
56431972 6611 i = PTR2IV(SvRV(sv));
b5be31e9
SM
6612 sv_unref(sv);
6613 sv_setiv(sv, i);
a0d0e21e 6614 }
ed6116ce 6615 }
8990e307 6616 flags = SvFLAGS(sv);
28e5dec8
JH
6617 if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
6618 /* It's (privately or publicly) a float, but not tested as an
6619 integer, so test it to see. */
d460ef45 6620 (void) SvIV(sv);
28e5dec8
JH
6621 flags = SvFLAGS(sv);
6622 }
6623 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6624 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 6625#ifdef PERL_PRESERVE_IVUV
28e5dec8 6626 oops_its_int:
59d8ce62 6627#endif
25da4f38
IZ
6628 if (SvIsUV(sv)) {
6629 if (SvUVX(sv) == UV_MAX)
a1e868e7 6630 sv_setnv(sv, UV_MAX_P1);
25da4f38
IZ
6631 else
6632 (void)SvIOK_only_UV(sv);
607fa7f2 6633 SvUV_set(sv, SvUVX(sv) + 1);
25da4f38
IZ
6634 } else {
6635 if (SvIVX(sv) == IV_MAX)
28e5dec8 6636 sv_setuv(sv, (UV)IV_MAX + 1);
25da4f38
IZ
6637 else {
6638 (void)SvIOK_only(sv);
45977657 6639 SvIV_set(sv, SvIVX(sv) + 1);
1c846c1f 6640 }
55497cff 6641 }
79072805
LW
6642 return;
6643 }
28e5dec8
JH
6644 if (flags & SVp_NOK) {
6645 (void)SvNOK_only(sv);
9d6ce603 6646 SvNV_set(sv, SvNVX(sv) + 1.0);
28e5dec8
JH
6647 return;
6648 }
6649
3f7c398e 6650 if (!(flags & SVp_POK) || !*SvPVX_const(sv)) {
28e5dec8 6651 if ((flags & SVTYPEMASK) < SVt_PVIV)
f5282e15 6652 sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV ? SVt_PVIV : SVt_IV));
28e5dec8 6653 (void)SvIOK_only(sv);
45977657 6654 SvIV_set(sv, 1);
79072805
LW
6655 return;
6656 }
463ee0b2 6657 d = SvPVX(sv);
79072805
LW
6658 while (isALPHA(*d)) d++;
6659 while (isDIGIT(*d)) d++;
6660 if (*d) {
28e5dec8 6661#ifdef PERL_PRESERVE_IVUV
d1be9408 6662 /* Got to punt this as an integer if needs be, but we don't issue
28e5dec8
JH
6663 warnings. Probably ought to make the sv_iv_please() that does
6664 the conversion if possible, and silently. */
504618e9 6665 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
28e5dec8
JH
6666 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6667 /* Need to try really hard to see if it's an integer.
6668 9.22337203685478e+18 is an integer.
6669 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6670 so $a="9.22337203685478e+18"; $a+0; $a++
6671 needs to be the same as $a="9.22337203685478e+18"; $a++
6672 or we go insane. */
d460ef45 6673
28e5dec8
JH
6674 (void) sv_2iv(sv);
6675 if (SvIOK(sv))
6676 goto oops_its_int;
6677
6678 /* sv_2iv *should* have made this an NV */
6679 if (flags & SVp_NOK) {
6680 (void)SvNOK_only(sv);
9d6ce603 6681 SvNV_set(sv, SvNVX(sv) + 1.0);
28e5dec8
JH
6682 return;
6683 }
6684 /* I don't think we can get here. Maybe I should assert this
6685 And if we do get here I suspect that sv_setnv will croak. NWC
6686 Fall through. */
6687#if defined(USE_LONG_DOUBLE)
6688 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 6689 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8 6690#else
1779d84d 6691 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 6692 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8
JH
6693#endif
6694 }
6695#endif /* PERL_PRESERVE_IVUV */
3f7c398e 6696 sv_setnv(sv,Atof(SvPVX_const(sv)) + 1.0);
79072805
LW
6697 return;
6698 }
6699 d--;
3f7c398e 6700 while (d >= SvPVX_const(sv)) {
79072805
LW
6701 if (isDIGIT(*d)) {
6702 if (++*d <= '9')
6703 return;
6704 *(d--) = '0';
6705 }
6706 else {
9d116dd7
JH
6707#ifdef EBCDIC
6708 /* MKS: The original code here died if letters weren't consecutive.
6709 * at least it didn't have to worry about non-C locales. The
6710 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
1c846c1f 6711 * arranged in order (although not consecutively) and that only
9d116dd7
JH
6712 * [A-Za-z] are accepted by isALPHA in the C locale.
6713 */
6714 if (*d != 'z' && *d != 'Z') {
6715 do { ++*d; } while (!isALPHA(*d));
6716 return;
6717 }
6718 *(d--) -= 'z' - 'a';
6719#else
79072805
LW
6720 ++*d;
6721 if (isALPHA(*d))
6722 return;
6723 *(d--) -= 'z' - 'a' + 1;
9d116dd7 6724#endif
79072805
LW
6725 }
6726 }
6727 /* oh,oh, the number grew */
6728 SvGROW(sv, SvCUR(sv) + 2);
b162af07 6729 SvCUR_set(sv, SvCUR(sv) + 1);
3f7c398e 6730 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX_const(sv); d--)
79072805
LW
6731 *d = d[-1];
6732 if (isDIGIT(d[1]))
6733 *d = '1';
6734 else
6735 *d = d[1];
6736}
6737
954c1994
GS
6738/*
6739=for apidoc sv_dec
6740
645c22ef
DM
6741Auto-decrement of the value in the SV, doing string to numeric conversion
6742if necessary. Handles 'get' magic.
954c1994
GS
6743
6744=cut
6745*/
6746
79072805 6747void
864dbfa3 6748Perl_sv_dec(pTHX_ register SV *sv)
79072805 6749{
97aff369 6750 dVAR;
463ee0b2
LW
6751 int flags;
6752
79072805
LW
6753 if (!sv)
6754 return;
5b295bef 6755 SvGETMAGIC(sv);
ed6116ce 6756 if (SvTHINKFIRST(sv)) {
765f542d
NC
6757 if (SvIsCOW(sv))
6758 sv_force_normal_flags(sv, 0);
0f15f207 6759 if (SvREADONLY(sv)) {
923e4eb5 6760 if (IN_PERL_RUNTIME)
cea2e8a9 6761 Perl_croak(aTHX_ PL_no_modify);
0f15f207 6762 }
a0d0e21e 6763 if (SvROK(sv)) {
b5be31e9 6764 IV i;
9e7bc3e8
JD
6765 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
6766 return;
56431972 6767 i = PTR2IV(SvRV(sv));
b5be31e9
SM
6768 sv_unref(sv);
6769 sv_setiv(sv, i);
a0d0e21e 6770 }
ed6116ce 6771 }
28e5dec8
JH
6772 /* Unlike sv_inc we don't have to worry about string-never-numbers
6773 and keeping them magic. But we mustn't warn on punting */
8990e307 6774 flags = SvFLAGS(sv);
28e5dec8
JH
6775 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6776 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 6777#ifdef PERL_PRESERVE_IVUV
28e5dec8 6778 oops_its_int:
59d8ce62 6779#endif
25da4f38
IZ
6780 if (SvIsUV(sv)) {
6781 if (SvUVX(sv) == 0) {
6782 (void)SvIOK_only(sv);
45977657 6783 SvIV_set(sv, -1);
25da4f38
IZ
6784 }
6785 else {
6786 (void)SvIOK_only_UV(sv);
f4eee32f 6787 SvUV_set(sv, SvUVX(sv) - 1);
1c846c1f 6788 }
25da4f38
IZ
6789 } else {
6790 if (SvIVX(sv) == IV_MIN)
65202027 6791 sv_setnv(sv, (NV)IV_MIN - 1.0);
25da4f38
IZ
6792 else {
6793 (void)SvIOK_only(sv);
45977657 6794 SvIV_set(sv, SvIVX(sv) - 1);
1c846c1f 6795 }
55497cff 6796 }
6797 return;
6798 }
28e5dec8 6799 if (flags & SVp_NOK) {
9d6ce603 6800 SvNV_set(sv, SvNVX(sv) - 1.0);
28e5dec8
JH
6801 (void)SvNOK_only(sv);
6802 return;
6803 }
8990e307 6804 if (!(flags & SVp_POK)) {
ef088171
NC
6805 if ((flags & SVTYPEMASK) < SVt_PVIV)
6806 sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV) ? SVt_PVIV : SVt_IV);
6807 SvIV_set(sv, -1);
6808 (void)SvIOK_only(sv);
79072805
LW
6809 return;
6810 }
28e5dec8
JH
6811#ifdef PERL_PRESERVE_IVUV
6812 {
504618e9 6813 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
28e5dec8
JH
6814 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6815 /* Need to try really hard to see if it's an integer.
6816 9.22337203685478e+18 is an integer.
6817 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6818 so $a="9.22337203685478e+18"; $a+0; $a--
6819 needs to be the same as $a="9.22337203685478e+18"; $a--
6820 or we go insane. */
d460ef45 6821
28e5dec8
JH
6822 (void) sv_2iv(sv);
6823 if (SvIOK(sv))
6824 goto oops_its_int;
6825
6826 /* sv_2iv *should* have made this an NV */
6827 if (flags & SVp_NOK) {
6828 (void)SvNOK_only(sv);
9d6ce603 6829 SvNV_set(sv, SvNVX(sv) - 1.0);
28e5dec8
JH
6830 return;
6831 }
6832 /* I don't think we can get here. Maybe I should assert this
6833 And if we do get here I suspect that sv_setnv will croak. NWC
6834 Fall through. */
6835#if defined(USE_LONG_DOUBLE)
6836 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 6837 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8 6838#else
1779d84d 6839 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 6840 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8
JH
6841#endif
6842 }
6843 }
6844#endif /* PERL_PRESERVE_IVUV */
3f7c398e 6845 sv_setnv(sv,Atof(SvPVX_const(sv)) - 1.0); /* punt */
79072805
LW
6846}
6847
954c1994
GS
6848/*
6849=for apidoc sv_mortalcopy
6850
645c22ef 6851Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
d4236ebc
DM
6852The new SV is marked as mortal. It will be destroyed "soon", either by an
6853explicit call to FREETMPS, or by an implicit call at places such as
6854statement boundaries. See also C<sv_newmortal> and C<sv_2mortal>.
954c1994
GS
6855
6856=cut
6857*/
6858
79072805
LW
6859/* Make a string that will exist for the duration of the expression
6860 * evaluation. Actually, it may have to last longer than that, but
6861 * hopefully we won't free it until it has been assigned to a
6862 * permanent location. */
6863
6864SV *
864dbfa3 6865Perl_sv_mortalcopy(pTHX_ SV *oldstr)
79072805 6866{
97aff369 6867 dVAR;
463ee0b2 6868 register SV *sv;
b881518d 6869
4561caa4 6870 new_SV(sv);
79072805 6871 sv_setsv(sv,oldstr);
677b06e3
GS
6872 EXTEND_MORTAL(1);
6873 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307
LW
6874 SvTEMP_on(sv);
6875 return sv;
6876}
6877
954c1994
GS
6878/*
6879=for apidoc sv_newmortal
6880
645c22ef 6881Creates a new null SV which is mortal. The reference count of the SV is
d4236ebc
DM
6882set to 1. It will be destroyed "soon", either by an explicit call to
6883FREETMPS, or by an implicit call at places such as statement boundaries.
6884See also C<sv_mortalcopy> and C<sv_2mortal>.
954c1994
GS
6885
6886=cut
6887*/
6888
8990e307 6889SV *
864dbfa3 6890Perl_sv_newmortal(pTHX)
8990e307 6891{
97aff369 6892 dVAR;
8990e307
LW
6893 register SV *sv;
6894
4561caa4 6895 new_SV(sv);
8990e307 6896 SvFLAGS(sv) = SVs_TEMP;
677b06e3
GS
6897 EXTEND_MORTAL(1);
6898 PL_tmps_stack[++PL_tmps_ix] = sv;
79072805
LW
6899 return sv;
6900}
6901
954c1994
GS
6902/*
6903=for apidoc sv_2mortal
6904
d4236ebc
DM
6905Marks an existing SV as mortal. The SV will be destroyed "soon", either
6906by an explicit call to FREETMPS, or by an implicit call at places such as
37d2ac18
NC
6907statement boundaries. SvTEMP() is turned on which means that the SV's
6908string buffer can be "stolen" if this SV is copied. See also C<sv_newmortal>
6909and C<sv_mortalcopy>.
954c1994
GS
6910
6911=cut
6912*/
6913
79072805 6914SV *
864dbfa3 6915Perl_sv_2mortal(pTHX_ register SV *sv)
79072805 6916{
27da23d5 6917 dVAR;
79072805 6918 if (!sv)
7a5b473e 6919 return NULL;
d689ffdd 6920 if (SvREADONLY(sv) && SvIMMORTAL(sv))
11162842 6921 return sv;
677b06e3
GS
6922 EXTEND_MORTAL(1);
6923 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307 6924 SvTEMP_on(sv);
79072805
LW
6925 return sv;
6926}
6927
954c1994
GS
6928/*
6929=for apidoc newSVpv
6930
6931Creates a new SV and copies a string into it. The reference count for the
6932SV is set to 1. If C<len> is zero, Perl will compute the length using
6933strlen(). For efficiency, consider using C<newSVpvn> instead.
6934
6935=cut
6936*/
6937
79072805 6938SV *
864dbfa3 6939Perl_newSVpv(pTHX_ const char *s, STRLEN len)
79072805 6940{
97aff369 6941 dVAR;
463ee0b2 6942 register SV *sv;
79072805 6943
4561caa4 6944 new_SV(sv);
ddfa59c7 6945 sv_setpvn(sv, s, len || s == NULL ? len : strlen(s));
79072805
LW
6946 return sv;
6947}
6948
954c1994
GS
6949/*
6950=for apidoc newSVpvn
6951
6952Creates a new SV and copies a string into it. The reference count for the
1c846c1f 6953SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
954c1994 6954string. You are responsible for ensuring that the source string is at least
9e09f5f2 6955C<len> bytes long. If the C<s> argument is NULL the new SV will be undefined.
954c1994
GS
6956
6957=cut
6958*/
6959
9da1e3b5 6960SV *
864dbfa3 6961Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
9da1e3b5 6962{
97aff369 6963 dVAR;
9da1e3b5
MUN
6964 register SV *sv;
6965
6966 new_SV(sv);
9da1e3b5
MUN
6967 sv_setpvn(sv,s,len);
6968 return sv;
6969}
6970
bd08039b
NC
6971
6972/*
926f8064 6973=for apidoc newSVhek
bd08039b
NC
6974
6975Creates a new SV from the hash key structure. It will generate scalars that
5aaec2b4
NC
6976point to the shared string table where possible. Returns a new (undefined)
6977SV if the hek is NULL.
bd08039b
NC
6978
6979=cut
6980*/
6981
6982SV *
c1b02ed8 6983Perl_newSVhek(pTHX_ const HEK *hek)
bd08039b 6984{
97aff369 6985 dVAR;
5aaec2b4
NC
6986 if (!hek) {
6987 SV *sv;
6988
6989 new_SV(sv);
6990 return sv;
6991 }
6992
bd08039b
NC
6993 if (HEK_LEN(hek) == HEf_SVKEY) {
6994 return newSVsv(*(SV**)HEK_KEY(hek));
6995 } else {
6996 const int flags = HEK_FLAGS(hek);
6997 if (flags & HVhek_WASUTF8) {
6998 /* Trouble :-)
6999 Andreas would like keys he put in as utf8 to come back as utf8
7000 */
7001 STRLEN utf8_len = HEK_LEN(hek);
b64e5050
AL
7002 const U8 *as_utf8 = bytes_to_utf8 ((U8*)HEK_KEY(hek), &utf8_len);
7003 SV * const sv = newSVpvn ((const char*)as_utf8, utf8_len);
bd08039b
NC
7004
7005 SvUTF8_on (sv);
7006 Safefree (as_utf8); /* bytes_to_utf8() allocates a new string */
7007 return sv;
45e34800 7008 } else if (flags & (HVhek_REHASH|HVhek_UNSHARED)) {
bd08039b
NC
7009 /* We don't have a pointer to the hv, so we have to replicate the
7010 flag into every HEK. This hv is using custom a hasing
7011 algorithm. Hence we can't return a shared string scalar, as
7012 that would contain the (wrong) hash value, and might get passed
45e34800
NC
7013 into an hv routine with a regular hash.
7014 Similarly, a hash that isn't using shared hash keys has to have
7015 the flag in every key so that we know not to try to call
7016 share_hek_kek on it. */
bd08039b 7017
b64e5050 7018 SV * const sv = newSVpvn (HEK_KEY(hek), HEK_LEN(hek));
bd08039b
NC
7019 if (HEK_UTF8(hek))
7020 SvUTF8_on (sv);
7021 return sv;
7022 }
7023 /* This will be overwhelminly the most common case. */
409dfe77
NC
7024 {
7025 /* Inline most of newSVpvn_share(), because share_hek_hek() is far
7026 more efficient than sharepvn(). */
7027 SV *sv;
7028
7029 new_SV(sv);
7030 sv_upgrade(sv, SVt_PV);
7031 SvPV_set(sv, (char *)HEK_KEY(share_hek_hek(hek)));
7032 SvCUR_set(sv, HEK_LEN(hek));
7033 SvLEN_set(sv, 0);
7034 SvREADONLY_on(sv);
7035 SvFAKE_on(sv);
7036 SvPOK_on(sv);
7037 if (HEK_UTF8(hek))
7038 SvUTF8_on(sv);
7039 return sv;
7040 }
bd08039b
NC
7041 }
7042}
7043
1c846c1f
NIS
7044/*
7045=for apidoc newSVpvn_share
7046
3f7c398e 7047Creates a new SV with its SvPVX_const pointing to a shared string in the string
645c22ef
DM
7048table. If the string does not already exist in the table, it is created
7049first. Turns on READONLY and FAKE. The string's hash is stored in the UV
7050slot of the SV; if the C<hash> parameter is non-zero, that value is used;
7051otherwise the hash is computed. The idea here is that as the string table
3f7c398e 7052is used for shared hash keys these strings will have SvPVX_const == HeKEY and
645c22ef 7053hash lookup will avoid string compare.
1c846c1f
NIS
7054
7055=cut
7056*/
7057
7058SV *
c3654f1a 7059Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
1c846c1f 7060{
97aff369 7061 dVAR;
1c846c1f 7062 register SV *sv;
c3654f1a 7063 bool is_utf8 = FALSE;
a51caccf
NC
7064 const char *const orig_src = src;
7065
c3654f1a 7066 if (len < 0) {
77caf834 7067 STRLEN tmplen = -len;
c3654f1a 7068 is_utf8 = TRUE;
75a54232 7069 /* See the note in hv.c:hv_fetch() --jhi */
e1ec3a88 7070 src = (char*)bytes_from_utf8((const U8*)src, &tmplen, &is_utf8);
75a54232
JH
7071 len = tmplen;
7072 }
1c846c1f 7073 if (!hash)
5afd6d42 7074 PERL_HASH(hash, src, len);
1c846c1f 7075 new_SV(sv);
bdd68bc3 7076 sv_upgrade(sv, SVt_PV);
f880fe2f 7077 SvPV_set(sv, sharepvn(src, is_utf8?-len:len, hash));
b162af07 7078 SvCUR_set(sv, len);
b162af07 7079 SvLEN_set(sv, 0);
1c846c1f
NIS
7080 SvREADONLY_on(sv);
7081 SvFAKE_on(sv);
7082 SvPOK_on(sv);
c3654f1a
IH
7083 if (is_utf8)
7084 SvUTF8_on(sv);
a51caccf
NC
7085 if (src != orig_src)
7086 Safefree(src);
1c846c1f
NIS
7087 return sv;
7088}
7089
645c22ef 7090
cea2e8a9 7091#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7092
7093/* pTHX_ magic can't cope with varargs, so this is a no-context
7094 * version of the main function, (which may itself be aliased to us).
7095 * Don't access this version directly.
7096 */
7097
46fc3d4c 7098SV *
cea2e8a9 7099Perl_newSVpvf_nocontext(const char* pat, ...)
46fc3d4c 7100{
cea2e8a9 7101 dTHX;
46fc3d4c 7102 register SV *sv;
7103 va_list args;
46fc3d4c 7104 va_start(args, pat);
c5be433b 7105 sv = vnewSVpvf(pat, &args);
46fc3d4c 7106 va_end(args);
7107 return sv;
7108}
cea2e8a9 7109#endif
46fc3d4c 7110
954c1994
GS
7111/*
7112=for apidoc newSVpvf
7113
645c22ef 7114Creates a new SV and initializes it with the string formatted like
954c1994
GS
7115C<sprintf>.
7116
7117=cut
7118*/
7119
cea2e8a9
GS
7120SV *
7121Perl_newSVpvf(pTHX_ const char* pat, ...)
7122{
7123 register SV *sv;
7124 va_list args;
cea2e8a9 7125 va_start(args, pat);
c5be433b 7126 sv = vnewSVpvf(pat, &args);
cea2e8a9
GS
7127 va_end(args);
7128 return sv;
7129}
46fc3d4c 7130
645c22ef
DM
7131/* backend for newSVpvf() and newSVpvf_nocontext() */
7132
79072805 7133SV *
c5be433b
GS
7134Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
7135{
97aff369 7136 dVAR;
c5be433b
GS
7137 register SV *sv;
7138 new_SV(sv);
4608196e 7139 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
c5be433b
GS
7140 return sv;
7141}
7142
954c1994
GS
7143/*
7144=for apidoc newSVnv
7145
7146Creates a new SV and copies a floating point value into it.
7147The reference count for the SV is set to 1.
7148
7149=cut
7150*/
7151
c5be433b 7152SV *
65202027 7153Perl_newSVnv(pTHX_ NV n)
79072805 7154{
97aff369 7155 dVAR;
463ee0b2 7156 register SV *sv;
79072805 7157
4561caa4 7158 new_SV(sv);
79072805
LW
7159 sv_setnv(sv,n);
7160 return sv;
7161}
7162
954c1994
GS
7163/*
7164=for apidoc newSViv
7165
7166Creates a new SV and copies an integer into it. The reference count for the
7167SV is set to 1.
7168
7169=cut
7170*/
7171
79072805 7172SV *
864dbfa3 7173Perl_newSViv(pTHX_ IV i)
79072805 7174{
97aff369 7175 dVAR;
463ee0b2 7176 register SV *sv;
79072805 7177
4561caa4 7178 new_SV(sv);
79072805
LW
7179 sv_setiv(sv,i);
7180 return sv;
7181}
7182
954c1994 7183/*
1a3327fb
JH
7184=for apidoc newSVuv
7185
7186Creates a new SV and copies an unsigned integer into it.
7187The reference count for the SV is set to 1.
7188
7189=cut
7190*/
7191
7192SV *
7193Perl_newSVuv(pTHX_ UV u)
7194{
97aff369 7195 dVAR;
1a3327fb
JH
7196 register SV *sv;
7197
7198 new_SV(sv);
7199 sv_setuv(sv,u);
7200 return sv;
7201}
7202
7203/*
b9f83d2f
NC
7204=for apidoc newSV_type
7205
7206Creates a new SV, of the type specificied. The reference count for the new SV
7207is set to 1.
7208
7209=cut
7210*/
7211
7212SV *
7213Perl_newSV_type(pTHX_ svtype type)
7214{
7215 register SV *sv;
7216
7217 new_SV(sv);
7218 sv_upgrade(sv, type);
7219 return sv;
7220}
7221
7222/*
954c1994
GS
7223=for apidoc newRV_noinc
7224
7225Creates an RV wrapper for an SV. The reference count for the original
7226SV is B<not> incremented.
7227
7228=cut
7229*/
7230
2304df62 7231SV *
864dbfa3 7232Perl_newRV_noinc(pTHX_ SV *tmpRef)
2304df62 7233{
97aff369 7234 dVAR;
b9f83d2f 7235 register SV *sv = newSV_type(SVt_RV);
76e3520e 7236 SvTEMP_off(tmpRef);
b162af07 7237 SvRV_set(sv, tmpRef);
2304df62 7238 SvROK_on(sv);
2304df62
AD
7239 return sv;
7240}
7241
ff276b08 7242/* newRV_inc is the official function name to use now.
645c22ef
DM
7243 * newRV_inc is in fact #defined to newRV in sv.h
7244 */
7245
5f05dabc 7246SV *
7f466ec7 7247Perl_newRV(pTHX_ SV *sv)
5f05dabc 7248{
97aff369 7249 dVAR;
7f466ec7 7250 return newRV_noinc(SvREFCNT_inc_simple_NN(sv));
5f05dabc 7251}
5f05dabc 7252
954c1994
GS
7253/*
7254=for apidoc newSVsv
7255
7256Creates a new SV which is an exact duplicate of the original SV.
645c22ef 7257(Uses C<sv_setsv>).
954c1994
GS
7258
7259=cut
7260*/
7261
79072805 7262SV *
864dbfa3 7263Perl_newSVsv(pTHX_ register SV *old)
79072805 7264{
97aff369 7265 dVAR;
463ee0b2 7266 register SV *sv;
79072805
LW
7267
7268 if (!old)
7a5b473e 7269 return NULL;
8990e307 7270 if (SvTYPE(old) == SVTYPEMASK) {
0453d815 7271 if (ckWARN_d(WARN_INTERNAL))
9014280d 7272 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
a0714e2c 7273 return NULL;
79072805 7274 }
4561caa4 7275 new_SV(sv);
e90aabeb
NC
7276 /* SV_GMAGIC is the default for sv_setv()
7277 SV_NOSTEAL prevents TEMP buffers being, well, stolen, and saves games
7278 with SvTEMP_off and SvTEMP_on round a call to sv_setsv. */
7279 sv_setsv_flags(sv, old, SV_GMAGIC | SV_NOSTEAL);
463ee0b2 7280 return sv;
79072805
LW
7281}
7282
645c22ef
DM
7283/*
7284=for apidoc sv_reset
7285
7286Underlying implementation for the C<reset> Perl function.
7287Note that the perl-level function is vaguely deprecated.
7288
7289=cut
7290*/
7291
79072805 7292void
e1ec3a88 7293Perl_sv_reset(pTHX_ register const char *s, HV *stash)
79072805 7294{
27da23d5 7295 dVAR;
4802d5d7 7296 char todo[PERL_UCHAR_MAX+1];
79072805 7297
49d8d3a1
MB
7298 if (!stash)
7299 return;
7300
79072805 7301 if (!*s) { /* reset ?? searches */
aec46f14 7302 MAGIC * const mg = mg_find((SV *)stash, PERL_MAGIC_symtab);
8d2f4536 7303 if (mg) {
c2b1997a
NC
7304 const U32 count = mg->mg_len / sizeof(PMOP**);
7305 PMOP **pmp = (PMOP**) mg->mg_ptr;
7306 PMOP *const *const end = pmp + count;
7307
7308 while (pmp < end) {
c737faaf 7309#ifdef USE_ITHREADS
c2b1997a 7310 SvREADONLY_off(PL_regex_pad[(*pmp)->op_pmoffset]);
c737faaf 7311#else
c2b1997a 7312 (*pmp)->op_pmflags &= ~PMf_USED;
c737faaf 7313#endif
c2b1997a 7314 ++pmp;
8d2f4536 7315 }
79072805
LW
7316 }
7317 return;
7318 }
7319
7320 /* reset variables */
7321
7322 if (!HvARRAY(stash))
7323 return;
463ee0b2
LW
7324
7325 Zero(todo, 256, char);
79072805 7326 while (*s) {
b464bac0
AL
7327 I32 max;
7328 I32 i = (unsigned char)*s;
79072805
LW
7329 if (s[1] == '-') {
7330 s += 2;
7331 }
4802d5d7 7332 max = (unsigned char)*s++;
79072805 7333 for ( ; i <= max; i++) {
463ee0b2
LW
7334 todo[i] = 1;
7335 }
a0d0e21e 7336 for (i = 0; i <= (I32) HvMAX(stash); i++) {
b464bac0 7337 HE *entry;
79072805 7338 for (entry = HvARRAY(stash)[i];
9e35f4b3
GS
7339 entry;
7340 entry = HeNEXT(entry))
7341 {
b464bac0
AL
7342 register GV *gv;
7343 register SV *sv;
7344
1edc1566 7345 if (!todo[(U8)*HeKEY(entry)])
463ee0b2 7346 continue;
1edc1566 7347 gv = (GV*)HeVAL(entry);
79072805 7348 sv = GvSV(gv);
e203899d
NC
7349 if (sv) {
7350 if (SvTHINKFIRST(sv)) {
7351 if (!SvREADONLY(sv) && SvROK(sv))
7352 sv_unref(sv);
7353 /* XXX Is this continue a bug? Why should THINKFIRST
7354 exempt us from resetting arrays and hashes? */
7355 continue;
7356 }
7357 SvOK_off(sv);
7358 if (SvTYPE(sv) >= SVt_PV) {
7359 SvCUR_set(sv, 0);
bd61b366 7360 if (SvPVX_const(sv) != NULL)
e203899d
NC
7361 *SvPVX(sv) = '\0';
7362 SvTAINT(sv);
7363 }
79072805
LW
7364 }
7365 if (GvAV(gv)) {
7366 av_clear(GvAV(gv));
7367 }
bfcb3514 7368 if (GvHV(gv) && !HvNAME_get(GvHV(gv))) {
b0269e46
AB
7369#if defined(VMS)
7370 Perl_die(aTHX_ "Can't reset %%ENV on this system");
7371#else /* ! VMS */
463ee0b2 7372 hv_clear(GvHV(gv));
b0269e46
AB
7373# if defined(USE_ENVIRON_ARRAY)
7374 if (gv == PL_envgv)
7375 my_clearenv();
7376# endif /* USE_ENVIRON_ARRAY */
7377#endif /* VMS */
79072805
LW
7378 }
7379 }
7380 }
7381 }
7382}
7383
645c22ef
DM
7384/*
7385=for apidoc sv_2io
7386
7387Using various gambits, try to get an IO from an SV: the IO slot if its a
7388GV; or the recursive result if we're an RV; or the IO slot of the symbol
7389named after the PV if we're a string.
7390
7391=cut
7392*/
7393
46fc3d4c 7394IO*
864dbfa3 7395Perl_sv_2io(pTHX_ SV *sv)
46fc3d4c 7396{
7397 IO* io;
7398 GV* gv;
7399
7400 switch (SvTYPE(sv)) {
7401 case SVt_PVIO:
7402 io = (IO*)sv;
7403 break;
7404 case SVt_PVGV:
7405 gv = (GV*)sv;
7406 io = GvIO(gv);
7407 if (!io)
cea2e8a9 7408 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
46fc3d4c 7409 break;
7410 default:
7411 if (!SvOK(sv))
cea2e8a9 7412 Perl_croak(aTHX_ PL_no_usym, "filehandle");
46fc3d4c 7413 if (SvROK(sv))
7414 return sv_2io(SvRV(sv));
f776e3cd 7415 gv = gv_fetchsv(sv, 0, SVt_PVIO);
46fc3d4c 7416 if (gv)
7417 io = GvIO(gv);
7418 else
7419 io = 0;
7420 if (!io)
be2597df 7421 Perl_croak(aTHX_ "Bad filehandle: %"SVf, SVfARG(sv));
46fc3d4c 7422 break;
7423 }
7424 return io;
7425}
7426
645c22ef
DM
7427/*
7428=for apidoc sv_2cv
7429
7430Using various gambits, try to get a CV from an SV; in addition, try if
7431possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
f2c0649b 7432The flags in C<lref> are passed to sv_fetchsv.
645c22ef
DM
7433
7434=cut
7435*/
7436
79072805 7437CV *
864dbfa3 7438Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
79072805 7439{
27da23d5 7440 dVAR;
a0714e2c 7441 GV *gv = NULL;
601f1833 7442 CV *cv = NULL;
79072805 7443
85dec29a
NC
7444 if (!sv) {
7445 *st = NULL;
7446 *gvp = NULL;
7447 return NULL;
7448 }
79072805 7449 switch (SvTYPE(sv)) {
79072805
LW
7450 case SVt_PVCV:
7451 *st = CvSTASH(sv);
a0714e2c 7452 *gvp = NULL;
79072805
LW
7453 return (CV*)sv;
7454 case SVt_PVHV:
7455 case SVt_PVAV:
ef58ba18 7456 *st = NULL;
a0714e2c 7457 *gvp = NULL;
601f1833 7458 return NULL;
8990e307
LW
7459 case SVt_PVGV:
7460 gv = (GV*)sv;
a0d0e21e 7461 *gvp = gv;
8990e307
LW
7462 *st = GvESTASH(gv);
7463 goto fix_gv;
7464
79072805 7465 default:
5b295bef 7466 SvGETMAGIC(sv);
a0d0e21e 7467 if (SvROK(sv)) {
823a54a3 7468 SV * const *sp = &sv; /* Used in tryAMAGICunDEREF macro. */
f5284f61
IZ
7469 tryAMAGICunDEREF(to_cv);
7470
62f274bf
GS
7471 sv = SvRV(sv);
7472 if (SvTYPE(sv) == SVt_PVCV) {
7473 cv = (CV*)sv;
a0714e2c 7474 *gvp = NULL;
62f274bf
GS
7475 *st = CvSTASH(cv);
7476 return cv;
7477 }
7478 else if(isGV(sv))
7479 gv = (GV*)sv;
7480 else
cea2e8a9 7481 Perl_croak(aTHX_ "Not a subroutine reference");
a0d0e21e 7482 }
62f274bf 7483 else if (isGV(sv))
79072805
LW
7484 gv = (GV*)sv;
7485 else
7a5fd60d 7486 gv = gv_fetchsv(sv, lref, SVt_PVCV);
79072805 7487 *gvp = gv;
ef58ba18
NC
7488 if (!gv) {
7489 *st = NULL;
601f1833 7490 return NULL;
ef58ba18 7491 }
e26df76a
NC
7492 /* Some flags to gv_fetchsv mean don't really create the GV */
7493 if (SvTYPE(gv) != SVt_PVGV) {
7494 *st = NULL;
7495 return NULL;
7496 }
79072805 7497 *st = GvESTASH(gv);
8990e307 7498 fix_gv:
8ebc5c01 7499 if (lref && !GvCVu(gv)) {
4633a7c4 7500 SV *tmpsv;
748a9306 7501 ENTER;
561b68a9 7502 tmpsv = newSV(0);
bd61b366 7503 gv_efullname3(tmpsv, gv, NULL);
f6ec51f7
GS
7504 /* XXX this is probably not what they think they're getting.
7505 * It has the same effect as "sub name;", i.e. just a forward
7506 * declaration! */
774d564b 7507 newSUB(start_subparse(FALSE, 0),
4633a7c4 7508 newSVOP(OP_CONST, 0, tmpsv),
5f66b61c 7509 NULL, NULL);
748a9306 7510 LEAVE;
8ebc5c01 7511 if (!GvCVu(gv))
35c1215d 7512 Perl_croak(aTHX_ "Unable to create sub named \"%"SVf"\"",
be2597df 7513 SVfARG(sv));
8990e307 7514 }
8ebc5c01 7515 return GvCVu(gv);
79072805
LW
7516 }
7517}
7518
c461cf8f
JH
7519/*
7520=for apidoc sv_true
7521
7522Returns true if the SV has a true value by Perl's rules.
645c22ef
DM
7523Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
7524instead use an in-line version.
c461cf8f
JH
7525
7526=cut
7527*/
7528
79072805 7529I32
864dbfa3 7530Perl_sv_true(pTHX_ register SV *sv)
79072805 7531{
8990e307
LW
7532 if (!sv)
7533 return 0;
79072805 7534 if (SvPOK(sv)) {
823a54a3
AL
7535 register const XPV* const tXpv = (XPV*)SvANY(sv);
7536 if (tXpv &&
c2f1de04 7537 (tXpv->xpv_cur > 1 ||
339049b0 7538 (tXpv->xpv_cur && *sv->sv_u.svu_pv != '0')))
79072805
LW
7539 return 1;
7540 else
7541 return 0;
7542 }
7543 else {
7544 if (SvIOK(sv))
463ee0b2 7545 return SvIVX(sv) != 0;
79072805
LW
7546 else {
7547 if (SvNOK(sv))
463ee0b2 7548 return SvNVX(sv) != 0.0;
79072805 7549 else
463ee0b2 7550 return sv_2bool(sv);
79072805
LW
7551 }
7552 }
7553}
79072805 7554
645c22ef 7555/*
c461cf8f
JH
7556=for apidoc sv_pvn_force
7557
7558Get a sensible string out of the SV somehow.
645c22ef
DM
7559A private implementation of the C<SvPV_force> macro for compilers which
7560can't cope with complex macro expressions. Always use the macro instead.
c461cf8f 7561
8d6d96c1
HS
7562=for apidoc sv_pvn_force_flags
7563
7564Get a sensible string out of the SV somehow.
7565If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
7566appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
7567implemented in terms of this function.
645c22ef
DM
7568You normally want to use the various wrapper macros instead: see
7569C<SvPV_force> and C<SvPV_force_nomg>
8d6d96c1
HS
7570
7571=cut
7572*/
7573
7574char *
7575Perl_sv_pvn_force_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
7576{
97aff369 7577 dVAR;
6fc92669 7578 if (SvTHINKFIRST(sv) && !SvROK(sv))
765f542d 7579 sv_force_normal_flags(sv, 0);
1c846c1f 7580
a0d0e21e 7581 if (SvPOK(sv)) {
13c5b33c
NC
7582 if (lp)
7583 *lp = SvCUR(sv);
a0d0e21e
LW
7584 }
7585 else {
a3b680e6 7586 char *s;
13c5b33c
NC
7587 STRLEN len;
7588
4d84ee25 7589 if (SvREADONLY(sv) && !(flags & SV_MUTABLE_RETURN)) {
b64e5050 7590 const char * const ref = sv_reftype(sv,0);
4d84ee25
NC
7591 if (PL_op)
7592 Perl_croak(aTHX_ "Can't coerce readonly %s to string in %s",
b64e5050 7593 ref, OP_NAME(PL_op));
4d84ee25 7594 else
b64e5050 7595 Perl_croak(aTHX_ "Can't coerce readonly %s to string", ref);
4d84ee25 7596 }
b64e5050 7597 if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM)
cea2e8a9 7598 Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
53e06cf0 7599 OP_NAME(PL_op));
b64e5050 7600 s = sv_2pv_flags(sv, &len, flags);
13c5b33c
NC
7601 if (lp)
7602 *lp = len;
7603
3f7c398e 7604 if (s != SvPVX_const(sv)) { /* Almost, but not quite, sv_setpvn() */
a0d0e21e
LW
7605 if (SvROK(sv))
7606 sv_unref(sv);
862a34c6 7607 SvUPGRADE(sv, SVt_PV); /* Never FALSE */
a0d0e21e 7608 SvGROW(sv, len + 1);
706aa1c9 7609 Move(s,SvPVX(sv),len,char);
a0d0e21e
LW
7610 SvCUR_set(sv, len);
7611 *SvEND(sv) = '\0';
7612 }
7613 if (!SvPOK(sv)) {
7614 SvPOK_on(sv); /* validate pointer */
7615 SvTAINT(sv);
1d7c1841 7616 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3f7c398e 7617 PTR2UV(sv),SvPVX_const(sv)));
a0d0e21e
LW
7618 }
7619 }
4d84ee25 7620 return SvPVX_mutable(sv);
a0d0e21e
LW
7621}
7622
645c22ef 7623/*
645c22ef
DM
7624=for apidoc sv_pvbyten_force
7625
0feed65a 7626The backend for the C<SvPVbytex_force> macro. Always use the macro instead.
645c22ef
DM
7627
7628=cut
7629*/
7630
7340a771
GS
7631char *
7632Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
7633{
46ec2f14 7634 sv_pvn_force(sv,lp);
ffebcc3e 7635 sv_utf8_downgrade(sv,0);
46ec2f14
TS
7636 *lp = SvCUR(sv);
7637 return SvPVX(sv);
7340a771
GS
7638}
7639
645c22ef 7640/*
c461cf8f
JH
7641=for apidoc sv_pvutf8n_force
7642
0feed65a 7643The backend for the C<SvPVutf8x_force> macro. Always use the macro instead.
c461cf8f
JH
7644
7645=cut
7646*/
7647
7340a771
GS
7648char *
7649Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
7650{
46ec2f14 7651 sv_pvn_force(sv,lp);
560a288e 7652 sv_utf8_upgrade(sv);
46ec2f14
TS
7653 *lp = SvCUR(sv);
7654 return SvPVX(sv);
7340a771
GS
7655}
7656
c461cf8f
JH
7657/*
7658=for apidoc sv_reftype
7659
7660Returns a string describing what the SV is a reference to.
7661
7662=cut
7663*/
7664
2b388283 7665const char *
bfed75c6 7666Perl_sv_reftype(pTHX_ const SV *sv, int ob)
a0d0e21e 7667{
07409e01
NC
7668 /* The fact that I don't need to downcast to char * everywhere, only in ?:
7669 inside return suggests a const propagation bug in g++. */
c86bf373 7670 if (ob && SvOBJECT(sv)) {
1b6737cc 7671 char * const name = HvNAME_get(SvSTASH(sv));
07409e01 7672 return name ? name : (char *) "__ANON__";
c86bf373 7673 }
a0d0e21e
LW
7674 else {
7675 switch (SvTYPE(sv)) {
7676 case SVt_NULL:
7677 case SVt_IV:
7678 case SVt_NV:
7679 case SVt_RV:
7680 case SVt_PV:
7681 case SVt_PVIV:
7682 case SVt_PVNV:
7683 case SVt_PVMG:
1cb0ed9b 7684 if (SvVOK(sv))
439cb1c4 7685 return "VSTRING";
a0d0e21e
LW
7686 if (SvROK(sv))
7687 return "REF";
7688 else
7689 return "SCALAR";
1cb0ed9b 7690
07409e01 7691 case SVt_PVLV: return (char *) (SvROK(sv) ? "REF"
be65207d
DM
7692 /* tied lvalues should appear to be
7693 * scalars for backwards compatitbility */
7694 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
07409e01 7695 ? "SCALAR" : "LVALUE");
a0d0e21e
LW
7696 case SVt_PVAV: return "ARRAY";
7697 case SVt_PVHV: return "HASH";
7698 case SVt_PVCV: return "CODE";
7699 case SVt_PVGV: return "GLOB";
1d2dff63 7700 case SVt_PVFM: return "FORMAT";
27f9d8f3 7701 case SVt_PVIO: return "IO";
cecf5685 7702 case SVt_BIND: return "BIND";
a0d0e21e
LW
7703 default: return "UNKNOWN";
7704 }
7705 }
7706}
7707
954c1994
GS
7708/*
7709=for apidoc sv_isobject
7710
7711Returns a boolean indicating whether the SV is an RV pointing to a blessed
7712object. If the SV is not an RV, or if the object is not blessed, then this
7713will return false.
7714
7715=cut
7716*/
7717
463ee0b2 7718int
864dbfa3 7719Perl_sv_isobject(pTHX_ SV *sv)
85e6fe83 7720{
68dc0745 7721 if (!sv)
7722 return 0;
5b295bef 7723 SvGETMAGIC(sv);
85e6fe83
LW
7724 if (!SvROK(sv))
7725 return 0;
7726 sv = (SV*)SvRV(sv);
7727 if (!SvOBJECT(sv))
7728 return 0;
7729 return 1;
7730}
7731
954c1994
GS
7732/*
7733=for apidoc sv_isa
7734
7735Returns a boolean indicating whether the SV is blessed into the specified
7736class. This does not check for subtypes; use C<sv_derived_from> to verify
7737an inheritance relationship.
7738
7739=cut
7740*/
7741
85e6fe83 7742int
864dbfa3 7743Perl_sv_isa(pTHX_ SV *sv, const char *name)
463ee0b2 7744{
bfcb3514 7745 const char *hvname;
68dc0745 7746 if (!sv)
7747 return 0;
5b295bef 7748 SvGETMAGIC(sv);
ed6116ce 7749 if (!SvROK(sv))
463ee0b2 7750 return 0;
ed6116ce
LW
7751 sv = (SV*)SvRV(sv);
7752 if (!SvOBJECT(sv))
463ee0b2 7753 return 0;
bfcb3514
NC
7754 hvname = HvNAME_get(SvSTASH(sv));
7755 if (!hvname)
e27ad1f2 7756 return 0;
463ee0b2 7757
bfcb3514 7758 return strEQ(hvname, name);
463ee0b2
LW
7759}
7760
954c1994
GS
7761/*
7762=for apidoc newSVrv
7763
7764Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
7765it will be upgraded to one. If C<classname> is non-null then the new SV will
7766be blessed in the specified package. The new SV is returned and its
7767reference count is 1.
7768
7769=cut
7770*/
7771
463ee0b2 7772SV*
864dbfa3 7773Perl_newSVrv(pTHX_ SV *rv, const char *classname)
463ee0b2 7774{
97aff369 7775 dVAR;
463ee0b2
LW
7776 SV *sv;
7777
4561caa4 7778 new_SV(sv);
51cf62d8 7779
765f542d 7780 SV_CHECK_THINKFIRST_COW_DROP(rv);
52944de8 7781 (void)SvAMAGIC_off(rv);
51cf62d8 7782
0199fce9 7783 if (SvTYPE(rv) >= SVt_PVMG) {
a3b680e6 7784 const U32 refcnt = SvREFCNT(rv);
0199fce9
JD
7785 SvREFCNT(rv) = 0;
7786 sv_clear(rv);
7787 SvFLAGS(rv) = 0;
7788 SvREFCNT(rv) = refcnt;
0199fce9 7789
dc5494d2
NC
7790 sv_upgrade(rv, SVt_RV);
7791 } else if (SvROK(rv)) {
7792 SvREFCNT_dec(SvRV(rv));
7793 } else if (SvTYPE(rv) < SVt_RV)
0199fce9
JD
7794 sv_upgrade(rv, SVt_RV);
7795 else if (SvTYPE(rv) > SVt_RV) {
8bd4d4c5 7796 SvPV_free(rv);
0199fce9
JD
7797 SvCUR_set(rv, 0);
7798 SvLEN_set(rv, 0);
7799 }
51cf62d8 7800
0c34ef67 7801 SvOK_off(rv);
b162af07 7802 SvRV_set(rv, sv);
ed6116ce 7803 SvROK_on(rv);
463ee0b2 7804
a0d0e21e 7805 if (classname) {
da51bb9b 7806 HV* const stash = gv_stashpv(classname, GV_ADD);
a0d0e21e
LW
7807 (void)sv_bless(rv, stash);
7808 }
7809 return sv;
7810}
7811
954c1994
GS
7812/*
7813=for apidoc sv_setref_pv
7814
7815Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
7816argument will be upgraded to an RV. That RV will be modified to point to
7817the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
7818into the SV. The C<classname> argument indicates the package for the
bd61b366 7819blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 7820will have a reference count of 1, and the RV will be returned.
954c1994
GS
7821
7822Do not use with other Perl types such as HV, AV, SV, CV, because those
7823objects will become corrupted by the pointer copy process.
7824
7825Note that C<sv_setref_pvn> copies the string while this copies the pointer.
7826
7827=cut
7828*/
7829
a0d0e21e 7830SV*
864dbfa3 7831Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
a0d0e21e 7832{
97aff369 7833 dVAR;
189b2af5 7834 if (!pv) {
3280af22 7835 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
7836 SvSETMAGIC(rv);
7837 }
a0d0e21e 7838 else
56431972 7839 sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
a0d0e21e
LW
7840 return rv;
7841}
7842
954c1994
GS
7843/*
7844=for apidoc sv_setref_iv
7845
7846Copies an integer into a new SV, optionally blessing the SV. The C<rv>
7847argument will be upgraded to an RV. That RV will be modified to point to
7848the new SV. The C<classname> argument indicates the package for the
bd61b366 7849blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 7850will have a reference count of 1, and the RV will be returned.
954c1994
GS
7851
7852=cut
7853*/
7854
a0d0e21e 7855SV*
864dbfa3 7856Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
a0d0e21e
LW
7857{
7858 sv_setiv(newSVrv(rv,classname), iv);
7859 return rv;
7860}
7861
954c1994 7862/*
e1c57cef
JH
7863=for apidoc sv_setref_uv
7864
7865Copies an unsigned integer into a new SV, optionally blessing the SV. The C<rv>
7866argument will be upgraded to an RV. That RV will be modified to point to
7867the new SV. The C<classname> argument indicates the package for the
bd61b366 7868blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 7869will have a reference count of 1, and the RV will be returned.
e1c57cef
JH
7870
7871=cut
7872*/
7873
7874SV*
7875Perl_sv_setref_uv(pTHX_ SV *rv, const char *classname, UV uv)
7876{
7877 sv_setuv(newSVrv(rv,classname), uv);
7878 return rv;
7879}
7880
7881/*
954c1994
GS
7882=for apidoc sv_setref_nv
7883
7884Copies a double into a new SV, optionally blessing the SV. The C<rv>
7885argument will be upgraded to an RV. That RV will be modified to point to
7886the new SV. The C<classname> argument indicates the package for the
bd61b366 7887blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 7888will have a reference count of 1, and the RV will be returned.
954c1994
GS
7889
7890=cut
7891*/
7892
a0d0e21e 7893SV*
65202027 7894Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
a0d0e21e
LW
7895{
7896 sv_setnv(newSVrv(rv,classname), nv);
7897 return rv;
7898}
463ee0b2 7899
954c1994
GS
7900/*
7901=for apidoc sv_setref_pvn
7902
7903Copies a string into a new SV, optionally blessing the SV. The length of the
7904string must be specified with C<n>. The C<rv> argument will be upgraded to
7905an RV. That RV will be modified to point to the new SV. The C<classname>
7906argument indicates the package for the blessing. Set C<classname> to
bd61b366 7907C<NULL> to avoid the blessing. The new SV will have a reference count
d34c2299 7908of 1, and the RV will be returned.
954c1994
GS
7909
7910Note that C<sv_setref_pv> copies the pointer while this copies the string.
7911
7912=cut
7913*/
7914
a0d0e21e 7915SV*
1b6737cc 7916Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, const char *pv, STRLEN n)
a0d0e21e
LW
7917{
7918 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
7919 return rv;
7920}
7921
954c1994
GS
7922/*
7923=for apidoc sv_bless
7924
7925Blesses an SV into a specified package. The SV must be an RV. The package
7926must be designated by its stash (see C<gv_stashpv()>). The reference count
7927of the SV is unaffected.
7928
7929=cut
7930*/
7931
a0d0e21e 7932SV*
864dbfa3 7933Perl_sv_bless(pTHX_ SV *sv, HV *stash)
a0d0e21e 7934{
97aff369 7935 dVAR;
76e3520e 7936 SV *tmpRef;
a0d0e21e 7937 if (!SvROK(sv))
cea2e8a9 7938 Perl_croak(aTHX_ "Can't bless non-reference value");
76e3520e
GS
7939 tmpRef = SvRV(sv);
7940 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
7941 if (SvREADONLY(tmpRef))
cea2e8a9 7942 Perl_croak(aTHX_ PL_no_modify);
76e3520e
GS
7943 if (SvOBJECT(tmpRef)) {
7944 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 7945 --PL_sv_objcount;
76e3520e 7946 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 7947 }
a0d0e21e 7948 }
76e3520e
GS
7949 SvOBJECT_on(tmpRef);
7950 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 7951 ++PL_sv_objcount;
862a34c6 7952 SvUPGRADE(tmpRef, SVt_PVMG);
b37c2d43 7953 SvSTASH_set(tmpRef, (HV*)SvREFCNT_inc_simple(stash));
a0d0e21e 7954
2e3febc6
CS
7955 if (Gv_AMG(stash))
7956 SvAMAGIC_on(sv);
7957 else
52944de8 7958 (void)SvAMAGIC_off(sv);
a0d0e21e 7959
1edbfb88
AB
7960 if(SvSMAGICAL(tmpRef))
7961 if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
7962 mg_set(tmpRef);
7963
7964
ecdeb87c 7965
a0d0e21e
LW
7966 return sv;
7967}
7968
645c22ef 7969/* Downgrades a PVGV to a PVMG.
645c22ef
DM
7970 */
7971
76e3520e 7972STATIC void
cea2e8a9 7973S_sv_unglob(pTHX_ SV *sv)
a0d0e21e 7974{
97aff369 7975 dVAR;
850fabdf 7976 void *xpvmg;
dd69841b 7977 HV *stash;
b37c2d43 7978 SV * const temp = sv_newmortal();
850fabdf 7979
a0d0e21e
LW
7980 assert(SvTYPE(sv) == SVt_PVGV);
7981 SvFAKE_off(sv);
180488f8
NC
7982 gv_efullname3(temp, (GV *) sv, "*");
7983
f7877b28 7984 if (GvGP(sv)) {
dd69841b
BB
7985 if(GvCVu((GV*)sv) && (stash = GvSTASH((GV*)sv)) && HvNAME_get(stash))
7986 mro_method_changed_in(stash);
1edc1566 7987 gp_free((GV*)sv);
f7877b28 7988 }
e826b3c7 7989 if (GvSTASH(sv)) {
e15faf7d 7990 sv_del_backref((SV*)GvSTASH(sv), sv);
5c284bb0 7991 GvSTASH(sv) = NULL;
e826b3c7 7992 }
a5f75d66 7993 GvMULTI_off(sv);
acda4c6a
NC
7994 if (GvNAME_HEK(sv)) {
7995 unshare_hek(GvNAME_HEK(sv));
7996 }
2e5b91de 7997 isGV_with_GP_off(sv);
850fabdf
GS
7998
7999 /* need to keep SvANY(sv) in the right arena */
8000 xpvmg = new_XPVMG();
8001 StructCopy(SvANY(sv), xpvmg, XPVMG);
8002 del_XPVGV(SvANY(sv));
8003 SvANY(sv) = xpvmg;
8004
a0d0e21e
LW
8005 SvFLAGS(sv) &= ~SVTYPEMASK;
8006 SvFLAGS(sv) |= SVt_PVMG;
180488f8
NC
8007
8008 /* Intentionally not calling any local SET magic, as this isn't so much a
8009 set operation as merely an internal storage change. */
8010 sv_setsv_flags(sv, temp, 0);
a0d0e21e
LW
8011}
8012
954c1994 8013/*
840a7b70 8014=for apidoc sv_unref_flags
954c1994
GS
8015
8016Unsets the RV status of the SV, and decrements the reference count of
8017whatever was being referenced by the RV. This can almost be thought of
840a7b70
IZ
8018as a reversal of C<newSVrv>. The C<cflags> argument can contain
8019C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
8020(otherwise the decrementing is conditional on the reference count being
8021different from one or the reference being a readonly SV).
7889fe52 8022See C<SvROK_off>.
954c1994
GS
8023
8024=cut
8025*/
8026
ed6116ce 8027void
e15faf7d 8028Perl_sv_unref_flags(pTHX_ SV *ref, U32 flags)
ed6116ce 8029{
b64e5050 8030 SV* const target = SvRV(ref);
810b8aa5 8031
e15faf7d
NC
8032 if (SvWEAKREF(ref)) {
8033 sv_del_backref(target, ref);
8034 SvWEAKREF_off(ref);
8035 SvRV_set(ref, NULL);
810b8aa5
GS
8036 return;
8037 }
e15faf7d
NC
8038 SvRV_set(ref, NULL);
8039 SvROK_off(ref);
8040 /* You can't have a || SvREADONLY(target) here, as $a = $$a, where $a was
04ca4930 8041 assigned to as BEGIN {$a = \"Foo"} will fail. */
e15faf7d
NC
8042 if (SvREFCNT(target) != 1 || (flags & SV_IMMEDIATE_UNREF))
8043 SvREFCNT_dec(target);
840a7b70 8044 else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
e15faf7d 8045 sv_2mortal(target); /* Schedule for freeing later */
ed6116ce 8046}
8990e307 8047
840a7b70 8048/*
645c22ef
DM
8049=for apidoc sv_untaint
8050
8051Untaint an SV. Use C<SvTAINTED_off> instead.
8052=cut
8053*/
8054
bbce6d69 8055void
864dbfa3 8056Perl_sv_untaint(pTHX_ SV *sv)
bbce6d69 8057{
13f57bf8 8058 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
b64e5050 8059 MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
36477c24 8060 if (mg)
565764a8 8061 mg->mg_len &= ~1;
36477c24 8062 }
bbce6d69 8063}
8064
645c22ef
DM
8065/*
8066=for apidoc sv_tainted
8067
8068Test an SV for taintedness. Use C<SvTAINTED> instead.
8069=cut
8070*/
8071
bbce6d69 8072bool
864dbfa3 8073Perl_sv_tainted(pTHX_ SV *sv)
bbce6d69 8074{
13f57bf8 8075 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
823a54a3 8076 const MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
2ddb8a4f 8077 if (mg && (mg->mg_len & 1) )
36477c24 8078 return TRUE;
8079 }
8080 return FALSE;
bbce6d69 8081}
8082
09540bc3
JH
8083/*
8084=for apidoc sv_setpviv
8085
8086Copies an integer into the given SV, also updating its string value.
8087Does not handle 'set' magic. See C<sv_setpviv_mg>.
8088
8089=cut
8090*/
8091
8092void
8093Perl_sv_setpviv(pTHX_ SV *sv, IV iv)
8094{
8095 char buf[TYPE_CHARS(UV)];
8096 char *ebuf;
b64e5050 8097 char * const ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
09540bc3
JH
8098
8099 sv_setpvn(sv, ptr, ebuf - ptr);
8100}
8101
8102/*
8103=for apidoc sv_setpviv_mg
8104
8105Like C<sv_setpviv>, but also handles 'set' magic.
8106
8107=cut
8108*/
8109
8110void
8111Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv)
8112{
df7eb254 8113 sv_setpviv(sv, iv);
09540bc3
JH
8114 SvSETMAGIC(sv);
8115}
8116
cea2e8a9 8117#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8118
8119/* pTHX_ magic can't cope with varargs, so this is a no-context
8120 * version of the main function, (which may itself be aliased to us).
8121 * Don't access this version directly.
8122 */
8123
cea2e8a9
GS
8124void
8125Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
8126{
8127 dTHX;
8128 va_list args;
8129 va_start(args, pat);
c5be433b 8130 sv_vsetpvf(sv, pat, &args);
cea2e8a9
GS
8131 va_end(args);
8132}
8133
645c22ef
DM
8134/* pTHX_ magic can't cope with varargs, so this is a no-context
8135 * version of the main function, (which may itself be aliased to us).
8136 * Don't access this version directly.
8137 */
cea2e8a9
GS
8138
8139void
8140Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
8141{
8142 dTHX;
8143 va_list args;
8144 va_start(args, pat);
c5be433b 8145 sv_vsetpvf_mg(sv, pat, &args);
cea2e8a9 8146 va_end(args);
cea2e8a9
GS
8147}
8148#endif
8149
954c1994
GS
8150/*
8151=for apidoc sv_setpvf
8152
bffc3d17
SH
8153Works like C<sv_catpvf> but copies the text into the SV instead of
8154appending it. Does not handle 'set' magic. See C<sv_setpvf_mg>.
954c1994
GS
8155
8156=cut
8157*/
8158
46fc3d4c 8159void
864dbfa3 8160Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 8161{
8162 va_list args;
46fc3d4c 8163 va_start(args, pat);
c5be433b 8164 sv_vsetpvf(sv, pat, &args);
46fc3d4c 8165 va_end(args);
8166}
8167
bffc3d17
SH
8168/*
8169=for apidoc sv_vsetpvf
8170
8171Works like C<sv_vcatpvf> but copies the text into the SV instead of
8172appending it. Does not handle 'set' magic. See C<sv_vsetpvf_mg>.
8173
8174Usually used via its frontend C<sv_setpvf>.
8175
8176=cut
8177*/
645c22ef 8178
c5be433b
GS
8179void
8180Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
8181{
4608196e 8182 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
c5be433b 8183}
ef50df4b 8184
954c1994
GS
8185/*
8186=for apidoc sv_setpvf_mg
8187
8188Like C<sv_setpvf>, but also handles 'set' magic.
8189
8190=cut
8191*/
8192
ef50df4b 8193void
864dbfa3 8194Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
8195{
8196 va_list args;
ef50df4b 8197 va_start(args, pat);
c5be433b 8198 sv_vsetpvf_mg(sv, pat, &args);
ef50df4b 8199 va_end(args);
c5be433b
GS
8200}
8201
bffc3d17
SH
8202/*
8203=for apidoc sv_vsetpvf_mg
8204
8205Like C<sv_vsetpvf>, but also handles 'set' magic.
8206
8207Usually used via its frontend C<sv_setpvf_mg>.
8208
8209=cut
8210*/
645c22ef 8211
c5be433b
GS
8212void
8213Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
8214{
4608196e 8215 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
ef50df4b
GS
8216 SvSETMAGIC(sv);
8217}
8218
cea2e8a9 8219#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8220
8221/* pTHX_ magic can't cope with varargs, so this is a no-context
8222 * version of the main function, (which may itself be aliased to us).
8223 * Don't access this version directly.
8224 */
8225
cea2e8a9
GS
8226void
8227Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
8228{
8229 dTHX;
8230 va_list args;
8231 va_start(args, pat);
c5be433b 8232 sv_vcatpvf(sv, pat, &args);
cea2e8a9
GS
8233 va_end(args);
8234}
8235
645c22ef
DM
8236/* pTHX_ magic can't cope with varargs, so this is a no-context
8237 * version of the main function, (which may itself be aliased to us).
8238 * Don't access this version directly.
8239 */
8240
cea2e8a9
GS
8241void
8242Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
8243{
8244 dTHX;
8245 va_list args;
8246 va_start(args, pat);
c5be433b 8247 sv_vcatpvf_mg(sv, pat, &args);
cea2e8a9 8248 va_end(args);
cea2e8a9
GS
8249}
8250#endif
8251
954c1994
GS
8252/*
8253=for apidoc sv_catpvf
8254
d5ce4a7c
GA
8255Processes its arguments like C<sprintf> and appends the formatted
8256output to an SV. If the appended data contains "wide" characters
8257(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
8258and characters >255 formatted with %c), the original SV might get
bffc3d17 8259upgraded to UTF-8. Handles 'get' magic, but not 'set' magic. See
cdd94ca7
NC
8260C<sv_catpvf_mg>. If the original SV was UTF-8, the pattern should be
8261valid UTF-8; if the original SV was bytes, the pattern should be too.
954c1994 8262
d5ce4a7c 8263=cut */
954c1994 8264
46fc3d4c 8265void
864dbfa3 8266Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 8267{
8268 va_list args;
46fc3d4c 8269 va_start(args, pat);
c5be433b 8270 sv_vcatpvf(sv, pat, &args);
46fc3d4c 8271 va_end(args);
8272}
8273
bffc3d17
SH
8274/*
8275=for apidoc sv_vcatpvf
8276
8277Processes its arguments like C<vsprintf> and appends the formatted output
8278to an SV. Does not handle 'set' magic. See C<sv_vcatpvf_mg>.
8279
8280Usually used via its frontend C<sv_catpvf>.
8281
8282=cut
8283*/
645c22ef 8284
ef50df4b 8285void
c5be433b
GS
8286Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
8287{
4608196e 8288 sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
c5be433b
GS
8289}
8290
954c1994
GS
8291/*
8292=for apidoc sv_catpvf_mg
8293
8294Like C<sv_catpvf>, but also handles 'set' magic.
8295
8296=cut
8297*/
8298
c5be433b 8299void
864dbfa3 8300Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
8301{
8302 va_list args;
ef50df4b 8303 va_start(args, pat);
c5be433b 8304 sv_vcatpvf_mg(sv, pat, &args);
ef50df4b 8305 va_end(args);
c5be433b
GS
8306}
8307
bffc3d17
SH
8308/*
8309=for apidoc sv_vcatpvf_mg
8310
8311Like C<sv_vcatpvf>, but also handles 'set' magic.
8312
8313Usually used via its frontend C<sv_catpvf_mg>.
8314
8315=cut
8316*/
645c22ef 8317
c5be433b
GS
8318void
8319Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
8320{
4608196e 8321 sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
ef50df4b
GS
8322 SvSETMAGIC(sv);
8323}
8324
954c1994
GS
8325/*
8326=for apidoc sv_vsetpvfn
8327
bffc3d17 8328Works like C<sv_vcatpvfn> but copies the text into the SV instead of
954c1994
GS
8329appending it.
8330
bffc3d17 8331Usually used via one of its frontends C<sv_vsetpvf> and C<sv_vsetpvf_mg>.
645c22ef 8332
954c1994
GS
8333=cut
8334*/
8335
46fc3d4c 8336void
7d5ea4e7 8337Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 8338{
8339 sv_setpvn(sv, "", 0);
7d5ea4e7 8340 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
46fc3d4c 8341}
8342
2d00ba3b 8343STATIC I32
9dd79c3f 8344S_expect_number(pTHX_ char** pattern)
211dfcf1 8345{
97aff369 8346 dVAR;
211dfcf1
HS
8347 I32 var = 0;
8348 switch (**pattern) {
8349 case '1': case '2': case '3':
8350 case '4': case '5': case '6':
8351 case '7': case '8': case '9':
2fba7546
GA
8352 var = *(*pattern)++ - '0';
8353 while (isDIGIT(**pattern)) {
5f66b61c 8354 const I32 tmp = var * 10 + (*(*pattern)++ - '0');
2fba7546
GA
8355 if (tmp < var)
8356 Perl_croak(aTHX_ "Integer overflow in format string for %s", (PL_op ? OP_NAME(PL_op) : "sv_vcatpvfn"));
8357 var = tmp;
8358 }
211dfcf1
HS
8359 }
8360 return var;
8361}
211dfcf1 8362
c445ea15
AL
8363STATIC char *
8364S_F0convert(NV nv, char *endbuf, STRLEN *len)
4151a5fe 8365{
a3b680e6 8366 const int neg = nv < 0;
4151a5fe 8367 UV uv;
4151a5fe
IZ
8368
8369 if (neg)
8370 nv = -nv;
8371 if (nv < UV_MAX) {
b464bac0 8372 char *p = endbuf;
4151a5fe 8373 nv += 0.5;
028f8eaa 8374 uv = (UV)nv;
4151a5fe
IZ
8375 if (uv & 1 && uv == nv)
8376 uv--; /* Round to even */
8377 do {
a3b680e6 8378 const unsigned dig = uv % 10;
4151a5fe
IZ
8379 *--p = '0' + dig;
8380 } while (uv /= 10);
8381 if (neg)
8382 *--p = '-';
8383 *len = endbuf - p;
8384 return p;
8385 }
bd61b366 8386 return NULL;
4151a5fe
IZ
8387}
8388
8389
954c1994
GS
8390/*
8391=for apidoc sv_vcatpvfn
8392
8393Processes its arguments like C<vsprintf> and appends the formatted output
8394to an SV. Uses an array of SVs if the C style variable argument list is
8395missing (NULL). When running with taint checks enabled, indicates via
8396C<maybe_tainted> if results are untrustworthy (often due to the use of
8397locales).
8398
bffc3d17 8399Usually used via one of its frontends C<sv_vcatpvf> and C<sv_vcatpvf_mg>.
645c22ef 8400
954c1994
GS
8401=cut
8402*/
8403
8896765a
RB
8404
8405#define VECTORIZE_ARGS vecsv = va_arg(*args, SV*);\
8406 vecstr = (U8*)SvPV_const(vecsv,veclen);\
8407 vec_utf8 = DO_UTF8(vecsv);
8408
1ef29b0e
RGS
8409/* XXX maybe_tainted is never assigned to, so the doc above is lying. */
8410
46fc3d4c 8411void
7d5ea4e7 8412Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 8413{
97aff369 8414 dVAR;
46fc3d4c 8415 char *p;
8416 char *q;
a3b680e6 8417 const char *patend;
fc36a67e 8418 STRLEN origlen;
46fc3d4c 8419 I32 svix = 0;
27da23d5 8420 static const char nullstr[] = "(null)";
a0714e2c 8421 SV *argsv = NULL;
b464bac0
AL
8422 bool has_utf8 = DO_UTF8(sv); /* has the result utf8? */
8423 const bool pat_utf8 = has_utf8; /* the pattern is in utf8? */
a0714e2c 8424 SV *nsv = NULL;
4151a5fe
IZ
8425 /* Times 4: a decimal digit takes more than 3 binary digits.
8426 * NV_DIG: mantissa takes than many decimal digits.
8427 * Plus 32: Playing safe. */
8428 char ebuf[IV_DIG * 4 + NV_DIG + 32];
8429 /* large enough for "%#.#f" --chip */
8430 /* what about long double NVs? --jhi */
db79b45b 8431
53c1dcc0
AL
8432 PERL_UNUSED_ARG(maybe_tainted);
8433
46fc3d4c 8434 /* no matter what, this is a string now */
fc36a67e 8435 (void)SvPV_force(sv, origlen);
46fc3d4c 8436
8896765a 8437 /* special-case "", "%s", and "%-p" (SVf - see below) */
46fc3d4c 8438 if (patlen == 0)
8439 return;
0dbb1585 8440 if (patlen == 2 && pat[0] == '%' && pat[1] == 's') {
2d03de9c
AL
8441 if (args) {
8442 const char * const s = va_arg(*args, char*);
8443 sv_catpv(sv, s ? s : nullstr);
8444 }
8445 else if (svix < svmax) {
8446 sv_catsv(sv, *svargs);
2d03de9c
AL
8447 }
8448 return;
0dbb1585 8449 }
8896765a
RB
8450 if (args && patlen == 3 && pat[0] == '%' &&
8451 pat[1] == '-' && pat[2] == 'p') {
6c9570dc 8452 argsv = (SV*)va_arg(*args, void*);
8896765a 8453 sv_catsv(sv, argsv);
8896765a 8454 return;
46fc3d4c 8455 }
8456
1d917b39 8457#ifndef USE_LONG_DOUBLE
4151a5fe 8458 /* special-case "%.<number>[gf]" */
7af36d83 8459 if ( !args && patlen <= 5 && pat[0] == '%' && pat[1] == '.'
4151a5fe
IZ
8460 && (pat[patlen-1] == 'g' || pat[patlen-1] == 'f') ) {
8461 unsigned digits = 0;
8462 const char *pp;
8463
8464 pp = pat + 2;
8465 while (*pp >= '0' && *pp <= '9')
8466 digits = 10 * digits + (*pp++ - '0');
028f8eaa 8467 if (pp - pat == (int)patlen - 1) {
4151a5fe
IZ
8468 NV nv;
8469
7af36d83 8470 if (svix < svmax)
4151a5fe
IZ
8471 nv = SvNV(*svargs);
8472 else
8473 return;
8474 if (*pp == 'g') {
2873255c
NC
8475 /* Add check for digits != 0 because it seems that some
8476 gconverts are buggy in this case, and we don't yet have
8477 a Configure test for this. */
8478 if (digits && digits < sizeof(ebuf) - NV_DIG - 10) {
8479 /* 0, point, slack */
2e59c212 8480 Gconvert(nv, (int)digits, 0, ebuf);
4151a5fe
IZ
8481 sv_catpv(sv, ebuf);
8482 if (*ebuf) /* May return an empty string for digits==0 */
8483 return;
8484 }
8485 } else if (!digits) {
8486 STRLEN l;
8487
8488 if ((p = F0convert(nv, ebuf + sizeof ebuf, &l))) {
8489 sv_catpvn(sv, p, l);
8490 return;
8491 }
8492 }
8493 }
8494 }
1d917b39 8495#endif /* !USE_LONG_DOUBLE */
4151a5fe 8496
2cf2cfc6 8497 if (!args && svix < svmax && DO_UTF8(*svargs))
205f51d8 8498 has_utf8 = TRUE;
2cf2cfc6 8499
46fc3d4c 8500 patend = (char*)pat + patlen;
8501 for (p = (char*)pat; p < patend; p = q) {
8502 bool alt = FALSE;
8503 bool left = FALSE;
b22c7a20 8504 bool vectorize = FALSE;
211dfcf1 8505 bool vectorarg = FALSE;
2cf2cfc6 8506 bool vec_utf8 = FALSE;
46fc3d4c 8507 char fill = ' ';
8508 char plus = 0;
8509 char intsize = 0;
8510 STRLEN width = 0;
fc36a67e 8511 STRLEN zeros = 0;
46fc3d4c 8512 bool has_precis = FALSE;
8513 STRLEN precis = 0;
c445ea15 8514 const I32 osvix = svix;
2cf2cfc6 8515 bool is_utf8 = FALSE; /* is this item utf8? */
20f6aaab
AS
8516#ifdef HAS_LDBL_SPRINTF_BUG
8517 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8 8518 with sfio - Allen <allens@cpan.org> */
20f6aaab
AS
8519 bool fix_ldbl_sprintf_bug = FALSE;
8520#endif
205f51d8 8521
46fc3d4c 8522 char esignbuf[4];
89ebb4a3 8523 U8 utf8buf[UTF8_MAXBYTES+1];
46fc3d4c 8524 STRLEN esignlen = 0;
8525
bd61b366 8526 const char *eptr = NULL;
fc36a67e 8527 STRLEN elen = 0;
a0714e2c 8528 SV *vecsv = NULL;
4608196e 8529 const U8 *vecstr = NULL;
b22c7a20 8530 STRLEN veclen = 0;
934abaf1 8531 char c = 0;
46fc3d4c 8532 int i;
9c5ffd7c 8533 unsigned base = 0;
8c8eb53c
RB
8534 IV iv = 0;
8535 UV uv = 0;
9e5b023a
JH
8536 /* we need a long double target in case HAS_LONG_DOUBLE but
8537 not USE_LONG_DOUBLE
8538 */
35fff930 8539#if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
9e5b023a
JH
8540 long double nv;
8541#else
65202027 8542 NV nv;
9e5b023a 8543#endif
46fc3d4c 8544 STRLEN have;
8545 STRLEN need;
8546 STRLEN gap;
7af36d83 8547 const char *dotstr = ".";
b22c7a20 8548 STRLEN dotstrlen = 1;
211dfcf1 8549 I32 efix = 0; /* explicit format parameter index */
eb3fce90 8550 I32 ewix = 0; /* explicit width index */
211dfcf1
HS
8551 I32 epix = 0; /* explicit precision index */
8552 I32 evix = 0; /* explicit vector index */
eb3fce90 8553 bool asterisk = FALSE;
46fc3d4c 8554
211dfcf1 8555 /* echo everything up to the next format specification */
46fc3d4c 8556 for (q = p; q < patend && *q != '%'; ++q) ;
8557 if (q > p) {
db79b45b
JH
8558 if (has_utf8 && !pat_utf8)
8559 sv_catpvn_utf8_upgrade(sv, p, q - p, nsv);
8560 else
8561 sv_catpvn(sv, p, q - p);
46fc3d4c 8562 p = q;
8563 }
8564 if (q++ >= patend)
8565 break;
8566
211dfcf1
HS
8567/*
8568 We allow format specification elements in this order:
8569 \d+\$ explicit format parameter index
8570 [-+ 0#]+ flags
a472f209 8571 v|\*(\d+\$)?v vector with optional (optionally specified) arg
f3583277 8572 0 flag (as above): repeated to allow "v02"
211dfcf1
HS
8573 \d+|\*(\d+\$)? width using optional (optionally specified) arg
8574 \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
8575 [hlqLV] size
8896765a
RB
8576 [%bcdefginopsuxDFOUX] format (mandatory)
8577*/
8578
8579 if (args) {
8580/*
8581 As of perl5.9.3, printf format checking is on by default.
8582 Internally, perl uses %p formats to provide an escape to
8583 some extended formatting. This block deals with those
8584 extensions: if it does not match, (char*)q is reset and
8585 the normal format processing code is used.
8586
8587 Currently defined extensions are:
8588 %p include pointer address (standard)
8589 %-p (SVf) include an SV (previously %_)
8590 %-<num>p include an SV with precision <num>
8591 %1p (VDf) include a v-string (as %vd)
8592 %<num>p reserved for future extensions
8593
8594 Robin Barker 2005-07-14
211dfcf1 8595*/
8896765a
RB
8596 char* r = q;
8597 bool sv = FALSE;
8598 STRLEN n = 0;
8599 if (*q == '-')
8600 sv = *q++;
c445ea15 8601 n = expect_number(&q);
8896765a
RB
8602 if (*q++ == 'p') {
8603 if (sv) { /* SVf */
8604 if (n) {
8605 precis = n;
8606 has_precis = TRUE;
8607 }
6c9570dc 8608 argsv = (SV*)va_arg(*args, void*);
4ea561bc 8609 eptr = SvPV_const(argsv, elen);
8896765a
RB
8610 if (DO_UTF8(argsv))
8611 is_utf8 = TRUE;
8612 goto string;
8613 }
8614#if vdNUMBER
8615 else if (n == vdNUMBER) { /* VDf */
8616 vectorize = TRUE;
8617 VECTORIZE_ARGS
8618 goto format_vd;
8619 }
8620#endif
8621 else if (n) {
8622 if (ckWARN_d(WARN_INTERNAL))
8623 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
8624 "internal %%<num>p might conflict with future printf extensions");
8625 }
8626 }
8627 q = r;
8628 }
8629
c445ea15 8630 if ( (width = expect_number(&q)) ) {
211dfcf1
HS
8631 if (*q == '$') {
8632 ++q;
8633 efix = width;
8634 } else {
8635 goto gotwidth;
8636 }
8637 }
8638
fc36a67e 8639 /* FLAGS */
8640
46fc3d4c 8641 while (*q) {
8642 switch (*q) {
8643 case ' ':
8644 case '+':
9911cee9
TS
8645 if (plus == '+' && *q == ' ') /* '+' over ' ' */
8646 q++;
8647 else
8648 plus = *q++;
46fc3d4c 8649 continue;
8650
8651 case '-':
8652 left = TRUE;
8653 q++;
8654 continue;
8655
8656 case '0':
8657 fill = *q++;
8658 continue;
8659
8660 case '#':
8661 alt = TRUE;
8662 q++;
8663 continue;
8664
fc36a67e 8665 default:
8666 break;
8667 }
8668 break;
8669 }
46fc3d4c 8670
211dfcf1 8671 tryasterisk:
eb3fce90 8672 if (*q == '*') {
211dfcf1 8673 q++;
c445ea15 8674 if ( (ewix = expect_number(&q)) )
211dfcf1
HS
8675 if (*q++ != '$')
8676 goto unknown;
eb3fce90 8677 asterisk = TRUE;
211dfcf1
HS
8678 }
8679 if (*q == 'v') {
eb3fce90 8680 q++;
211dfcf1
HS
8681 if (vectorize)
8682 goto unknown;
9cbac4c7 8683 if ((vectorarg = asterisk)) {
211dfcf1
HS
8684 evix = ewix;
8685 ewix = 0;
8686 asterisk = FALSE;
8687 }
8688 vectorize = TRUE;
8689 goto tryasterisk;
eb3fce90
JH
8690 }
8691
211dfcf1 8692 if (!asterisk)
858a90f9 8693 {
7a5fa8a2 8694 if( *q == '0' )
f3583277 8695 fill = *q++;
c445ea15 8696 width = expect_number(&q);
858a90f9 8697 }
211dfcf1
HS
8698
8699 if (vectorize) {
8700 if (vectorarg) {
8701 if (args)
8702 vecsv = va_arg(*args, SV*);
7ad96abb
NC
8703 else if (evix) {
8704 vecsv = (evix > 0 && evix <= svmax)
8705 ? svargs[evix-1] : &PL_sv_undef;
8706 } else {
8707 vecsv = svix < svmax ? svargs[svix++] : &PL_sv_undef;
8708 }
245d4a47 8709 dotstr = SvPV_const(vecsv, dotstrlen);
640283f5
NC
8710 /* Keep the DO_UTF8 test *after* the SvPV call, else things go
8711 bad with tied or overloaded values that return UTF8. */
211dfcf1 8712 if (DO_UTF8(vecsv))
2cf2cfc6 8713 is_utf8 = TRUE;
640283f5
NC
8714 else if (has_utf8) {
8715 vecsv = sv_mortalcopy(vecsv);
8716 sv_utf8_upgrade(vecsv);
8717 dotstr = SvPV_const(vecsv, dotstrlen);
8718 is_utf8 = TRUE;
8719 }
211dfcf1
HS
8720 }
8721 if (args) {
8896765a 8722 VECTORIZE_ARGS
eb3fce90 8723 }
7ad96abb 8724 else if (efix ? (efix > 0 && efix <= svmax) : svix < svmax) {
211dfcf1 8725 vecsv = svargs[efix ? efix-1 : svix++];
245d4a47 8726 vecstr = (U8*)SvPV_const(vecsv,veclen);
2cf2cfc6 8727 vec_utf8 = DO_UTF8(vecsv);
96b8f7ce
JP
8728
8729 /* if this is a version object, we need to convert
8730 * back into v-string notation and then let the
8731 * vectorize happen normally
d7aa5382 8732 */
96b8f7ce
JP
8733 if (sv_derived_from(vecsv, "version")) {
8734 char *version = savesvpv(vecsv);
34ba6322
SP
8735 if ( hv_exists((HV*)SvRV(vecsv), "alpha", 5 ) ) {
8736 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
8737 "vector argument not supported with alpha versions");
8738 goto unknown;
8739 }
96b8f7ce 8740 vecsv = sv_newmortal();
65b06e02 8741 scan_vstring(version, version + veclen, vecsv);
96b8f7ce
JP
8742 vecstr = (U8*)SvPV_const(vecsv, veclen);
8743 vec_utf8 = DO_UTF8(vecsv);
8744 Safefree(version);
d7aa5382 8745 }
211dfcf1
HS
8746 }
8747 else {
8748 vecstr = (U8*)"";
8749 veclen = 0;
8750 }
eb3fce90 8751 }
fc36a67e 8752
eb3fce90 8753 if (asterisk) {
fc36a67e 8754 if (args)
8755 i = va_arg(*args, int);
8756 else
eb3fce90
JH
8757 i = (ewix ? ewix <= svmax : svix < svmax) ?
8758 SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 8759 left |= (i < 0);
8760 width = (i < 0) ? -i : i;
fc36a67e 8761 }
211dfcf1 8762 gotwidth:
fc36a67e 8763
8764 /* PRECISION */
46fc3d4c 8765
fc36a67e 8766 if (*q == '.') {
8767 q++;
8768 if (*q == '*') {
211dfcf1 8769 q++;
c445ea15 8770 if ( ((epix = expect_number(&q))) && (*q++ != '$') )
7b8dd722
HS
8771 goto unknown;
8772 /* XXX: todo, support specified precision parameter */
8773 if (epix)
211dfcf1 8774 goto unknown;
46fc3d4c 8775 if (args)
8776 i = va_arg(*args, int);
8777 else
eb3fce90
JH
8778 i = (ewix ? ewix <= svmax : svix < svmax)
8779 ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
9911cee9
TS
8780 precis = i;
8781 has_precis = !(i < 0);
fc36a67e 8782 }
8783 else {
8784 precis = 0;
8785 while (isDIGIT(*q))
8786 precis = precis * 10 + (*q++ - '0');
9911cee9 8787 has_precis = TRUE;
fc36a67e 8788 }
fc36a67e 8789 }
46fc3d4c 8790
fc36a67e 8791 /* SIZE */
46fc3d4c 8792
fc36a67e 8793 switch (*q) {
c623ac67
GS
8794#ifdef WIN32
8795 case 'I': /* Ix, I32x, and I64x */
8796# ifdef WIN64
8797 if (q[1] == '6' && q[2] == '4') {
8798 q += 3;
8799 intsize = 'q';
8800 break;
8801 }
8802# endif
8803 if (q[1] == '3' && q[2] == '2') {
8804 q += 3;
8805 break;
8806 }
8807# ifdef WIN64
8808 intsize = 'q';
8809# endif
8810 q++;
8811 break;
8812#endif
9e5b023a 8813#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
6f9bb7fd 8814 case 'L': /* Ld */
5f66b61c 8815 /*FALLTHROUGH*/
e5c81feb 8816#ifdef HAS_QUAD
6f9bb7fd 8817 case 'q': /* qd */
9e5b023a 8818#endif
6f9bb7fd
GS
8819 intsize = 'q';
8820 q++;
8821 break;
8822#endif
fc36a67e 8823 case 'l':
9e5b023a 8824#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
205f51d8 8825 if (*(q + 1) == 'l') { /* lld, llf */
fc36a67e 8826 intsize = 'q';
8827 q += 2;
46fc3d4c 8828 break;
cf2093f6 8829 }
fc36a67e 8830#endif
5f66b61c 8831 /*FALLTHROUGH*/
fc36a67e 8832 case 'h':
5f66b61c 8833 /*FALLTHROUGH*/
fc36a67e 8834 case 'V':
8835 intsize = *q++;
46fc3d4c 8836 break;
8837 }
8838
fc36a67e 8839 /* CONVERSION */
8840
211dfcf1
HS
8841 if (*q == '%') {
8842 eptr = q++;
8843 elen = 1;
26372e71
GA
8844 if (vectorize) {
8845 c = '%';
8846 goto unknown;
8847 }
211dfcf1
HS
8848 goto string;
8849 }
8850
26372e71 8851 if (!vectorize && !args) {
86c51f8b
NC
8852 if (efix) {
8853 const I32 i = efix-1;
8854 argsv = (i >= 0 && i < svmax) ? svargs[i] : &PL_sv_undef;
8855 } else {
8856 argsv = (svix >= 0 && svix < svmax)
8857 ? svargs[svix++] : &PL_sv_undef;
8858 }
863811b2 8859 }
211dfcf1 8860
46fc3d4c 8861 switch (c = *q++) {
8862
8863 /* STRINGS */
8864
46fc3d4c 8865 case 'c':
26372e71
GA
8866 if (vectorize)
8867 goto unknown;
4ea561bc 8868 uv = (args) ? va_arg(*args, int) : SvIV(argsv);
1bd104fb
JH
8869 if ((uv > 255 ||
8870 (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
0064a8a9 8871 && !IN_BYTES) {
dfe13c55 8872 eptr = (char*)utf8buf;
9041c2e3 8873 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
2cf2cfc6 8874 is_utf8 = TRUE;
7e2040f0
GS
8875 }
8876 else {
8877 c = (char)uv;
8878 eptr = &c;
8879 elen = 1;
a0ed51b3 8880 }
46fc3d4c 8881 goto string;
8882
46fc3d4c 8883 case 's':
26372e71
GA
8884 if (vectorize)
8885 goto unknown;
8886 if (args) {
fc36a67e 8887 eptr = va_arg(*args, char*);
c635e13b 8888 if (eptr)
1d7c1841
GS
8889#ifdef MACOS_TRADITIONAL
8890 /* On MacOS, %#s format is used for Pascal strings */
8891 if (alt)
8892 elen = *eptr++;
8893 else
8894#endif
c635e13b 8895 elen = strlen(eptr);
8896 else {
27da23d5 8897 eptr = (char *)nullstr;
c635e13b 8898 elen = sizeof nullstr - 1;
8899 }
46fc3d4c 8900 }
211dfcf1 8901 else {
4ea561bc 8902 eptr = SvPV_const(argsv, elen);
7e2040f0 8903 if (DO_UTF8(argsv)) {
59b61096 8904 I32 old_precis = precis;
a0ed51b3
LW
8905 if (has_precis && precis < elen) {
8906 I32 p = precis;
7e2040f0 8907 sv_pos_u2b(argsv, &p, 0); /* sticks at end */
a0ed51b3
LW
8908 precis = p;
8909 }
8910 if (width) { /* fudge width (can't fudge elen) */
59b61096
AV
8911 if (has_precis && precis < elen)
8912 width += precis - old_precis;
8913 else
8914 width += elen - sv_len_utf8(argsv);
a0ed51b3 8915 }
2cf2cfc6 8916 is_utf8 = TRUE;
a0ed51b3
LW
8917 }
8918 }
fc36a67e 8919
46fc3d4c 8920 string:
8921 if (has_precis && elen > precis)
8922 elen = precis;
8923 break;
8924
8925 /* INTEGERS */
8926
fc36a67e 8927 case 'p':
be75b157 8928 if (alt || vectorize)
c2e66d9e 8929 goto unknown;
211dfcf1 8930 uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
fc36a67e 8931 base = 16;
8932 goto integer;
8933
46fc3d4c 8934 case 'D':
29fe7a80 8935#ifdef IV_IS_QUAD
22f3ae8c 8936 intsize = 'q';
29fe7a80 8937#else
46fc3d4c 8938 intsize = 'l';
29fe7a80 8939#endif
5f66b61c 8940 /*FALLTHROUGH*/
46fc3d4c 8941 case 'd':
8942 case 'i':
8896765a
RB
8943#if vdNUMBER
8944 format_vd:
8945#endif
b22c7a20 8946 if (vectorize) {
ba210ebe 8947 STRLEN ulen;
211dfcf1
HS
8948 if (!veclen)
8949 continue;
2cf2cfc6
A
8950 if (vec_utf8)
8951 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
8952 UTF8_ALLOW_ANYUV);
b22c7a20 8953 else {
e83d50c9 8954 uv = *vecstr;
b22c7a20
GS
8955 ulen = 1;
8956 }
8957 vecstr += ulen;
8958 veclen -= ulen;
e83d50c9
JP
8959 if (plus)
8960 esignbuf[esignlen++] = plus;
b22c7a20
GS
8961 }
8962 else if (args) {
46fc3d4c 8963 switch (intsize) {
8964 case 'h': iv = (short)va_arg(*args, int); break;
46fc3d4c 8965 case 'l': iv = va_arg(*args, long); break;
fc36a67e 8966 case 'V': iv = va_arg(*args, IV); break;
b10c0dba 8967 default: iv = va_arg(*args, int); break;
cf2093f6
JH
8968#ifdef HAS_QUAD
8969 case 'q': iv = va_arg(*args, Quad_t); break;
8970#endif
46fc3d4c 8971 }
8972 }
8973 else {
4ea561bc 8974 IV tiv = SvIV(argsv); /* work around GCC bug #13488 */
46fc3d4c 8975 switch (intsize) {
b10c0dba
MHM
8976 case 'h': iv = (short)tiv; break;
8977 case 'l': iv = (long)tiv; break;
8978 case 'V':
8979 default: iv = tiv; break;
cf2093f6 8980#ifdef HAS_QUAD
b10c0dba 8981 case 'q': iv = (Quad_t)tiv; break;
cf2093f6 8982#endif
46fc3d4c 8983 }
8984 }
e83d50c9
JP
8985 if ( !vectorize ) /* we already set uv above */
8986 {
8987 if (iv >= 0) {
8988 uv = iv;
8989 if (plus)
8990 esignbuf[esignlen++] = plus;
8991 }
8992 else {
8993 uv = -iv;
8994 esignbuf[esignlen++] = '-';
8995 }
46fc3d4c 8996 }
8997 base = 10;
8998 goto integer;
8999
fc36a67e 9000 case 'U':
29fe7a80 9001#ifdef IV_IS_QUAD
22f3ae8c 9002 intsize = 'q';
29fe7a80 9003#else
fc36a67e 9004 intsize = 'l';
29fe7a80 9005#endif
5f66b61c 9006 /*FALLTHROUGH*/
fc36a67e 9007 case 'u':
9008 base = 10;
9009 goto uns_integer;
9010
7ff06cc7 9011 case 'B':
4f19785b
WSI
9012 case 'b':
9013 base = 2;
9014 goto uns_integer;
9015
46fc3d4c 9016 case 'O':
29fe7a80 9017#ifdef IV_IS_QUAD
22f3ae8c 9018 intsize = 'q';
29fe7a80 9019#else
46fc3d4c 9020 intsize = 'l';
29fe7a80 9021#endif
5f66b61c 9022 /*FALLTHROUGH*/
46fc3d4c 9023 case 'o':
9024 base = 8;
9025 goto uns_integer;
9026
9027 case 'X':
46fc3d4c 9028 case 'x':
9029 base = 16;
46fc3d4c 9030
9031 uns_integer:
b22c7a20 9032 if (vectorize) {
ba210ebe 9033 STRLEN ulen;
b22c7a20 9034 vector:
211dfcf1
HS
9035 if (!veclen)
9036 continue;
2cf2cfc6
A
9037 if (vec_utf8)
9038 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9039 UTF8_ALLOW_ANYUV);
b22c7a20 9040 else {
a05b299f 9041 uv = *vecstr;
b22c7a20
GS
9042 ulen = 1;
9043 }
9044 vecstr += ulen;
9045 veclen -= ulen;
9046 }
9047 else if (args) {
46fc3d4c 9048 switch (intsize) {
9049 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
46fc3d4c 9050 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 9051 case 'V': uv = va_arg(*args, UV); break;
b10c0dba 9052 default: uv = va_arg(*args, unsigned); break;
cf2093f6 9053#ifdef HAS_QUAD
9e3321a5 9054 case 'q': uv = va_arg(*args, Uquad_t); break;
cf2093f6 9055#endif
46fc3d4c 9056 }
9057 }
9058 else {
4ea561bc 9059 UV tuv = SvUV(argsv); /* work around GCC bug #13488 */
46fc3d4c 9060 switch (intsize) {
b10c0dba
MHM
9061 case 'h': uv = (unsigned short)tuv; break;
9062 case 'l': uv = (unsigned long)tuv; break;
9063 case 'V':
9064 default: uv = tuv; break;
cf2093f6 9065#ifdef HAS_QUAD
b10c0dba 9066 case 'q': uv = (Uquad_t)tuv; break;
cf2093f6 9067#endif
46fc3d4c 9068 }
9069 }
9070
9071 integer:
4d84ee25
NC
9072 {
9073 char *ptr = ebuf + sizeof ebuf;
1387f30c
DD
9074 bool tempalt = uv ? alt : FALSE; /* Vectors can't change alt */
9075 zeros = 0;
9076
4d84ee25
NC
9077 switch (base) {
9078 unsigned dig;
9079 case 16:
14eb61ab 9080 p = (char *)((c == 'X') ? PL_hexdigit + 16 : PL_hexdigit);
4d84ee25
NC
9081 do {
9082 dig = uv & 15;
9083 *--ptr = p[dig];
9084 } while (uv >>= 4);
1387f30c 9085 if (tempalt) {
4d84ee25
NC
9086 esignbuf[esignlen++] = '0';
9087 esignbuf[esignlen++] = c; /* 'x' or 'X' */
9088 }
9089 break;
9090 case 8:
9091 do {
9092 dig = uv & 7;
9093 *--ptr = '0' + dig;
9094 } while (uv >>= 3);
9095 if (alt && *ptr != '0')
9096 *--ptr = '0';
9097 break;
9098 case 2:
9099 do {
9100 dig = uv & 1;
9101 *--ptr = '0' + dig;
9102 } while (uv >>= 1);
1387f30c 9103 if (tempalt) {
4d84ee25 9104 esignbuf[esignlen++] = '0';
7ff06cc7 9105 esignbuf[esignlen++] = c;
4d84ee25
NC
9106 }
9107 break;
9108 default: /* it had better be ten or less */
9109 do {
9110 dig = uv % base;
9111 *--ptr = '0' + dig;
9112 } while (uv /= base);
9113 break;
46fc3d4c 9114 }
4d84ee25
NC
9115 elen = (ebuf + sizeof ebuf) - ptr;
9116 eptr = ptr;
9117 if (has_precis) {
9118 if (precis > elen)
9119 zeros = precis - elen;
e6bb52fd
TS
9120 else if (precis == 0 && elen == 1 && *eptr == '0'
9121 && !(base == 8 && alt)) /* "%#.0o" prints "0" */
4d84ee25 9122 elen = 0;
9911cee9
TS
9123
9124 /* a precision nullifies the 0 flag. */
9125 if (fill == '0')
9126 fill = ' ';
eda88b6d 9127 }
c10ed8b9 9128 }
46fc3d4c 9129 break;
9130
9131 /* FLOATING POINT */
9132
fc36a67e 9133 case 'F':
9134 c = 'f'; /* maybe %F isn't supported here */
5f66b61c 9135 /*FALLTHROUGH*/
46fc3d4c 9136 case 'e': case 'E':
fc36a67e 9137 case 'f':
46fc3d4c 9138 case 'g': case 'G':
26372e71
GA
9139 if (vectorize)
9140 goto unknown;
46fc3d4c 9141
9142 /* This is evil, but floating point is even more evil */
9143
9e5b023a
JH
9144 /* for SV-style calling, we can only get NV
9145 for C-style calling, we assume %f is double;
9146 for simplicity we allow any of %Lf, %llf, %qf for long double
9147 */
9148 switch (intsize) {
9149 case 'V':
9150#if defined(USE_LONG_DOUBLE)
9151 intsize = 'q';
9152#endif
9153 break;
8a2e3f14 9154/* [perl #20339] - we should accept and ignore %lf rather than die */
00e17364 9155 case 'l':
5f66b61c 9156 /*FALLTHROUGH*/
9e5b023a
JH
9157 default:
9158#if defined(USE_LONG_DOUBLE)
9159 intsize = args ? 0 : 'q';
9160#endif
9161 break;
9162 case 'q':
9163#if defined(HAS_LONG_DOUBLE)
9164 break;
9165#else
5f66b61c 9166 /*FALLTHROUGH*/
9e5b023a
JH
9167#endif
9168 case 'h':
9e5b023a
JH
9169 goto unknown;
9170 }
9171
9172 /* now we need (long double) if intsize == 'q', else (double) */
26372e71 9173 nv = (args) ?
35fff930
JH
9174#if LONG_DOUBLESIZE > DOUBLESIZE
9175 intsize == 'q' ?
205f51d8
AS
9176 va_arg(*args, long double) :
9177 va_arg(*args, double)
35fff930 9178#else
205f51d8 9179 va_arg(*args, double)
35fff930 9180#endif
4ea561bc 9181 : SvNV(argsv);
fc36a67e 9182
9183 need = 0;
9184 if (c != 'e' && c != 'E') {
9185 i = PERL_INT_MIN;
9e5b023a
JH
9186 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
9187 will cast our (long double) to (double) */
73b309ea 9188 (void)Perl_frexp(nv, &i);
fc36a67e 9189 if (i == PERL_INT_MIN)
cea2e8a9 9190 Perl_die(aTHX_ "panic: frexp");
c635e13b 9191 if (i > 0)
fc36a67e 9192 need = BIT_DIGITS(i);
9193 }
9194 need += has_precis ? precis : 6; /* known default */
20f6aaab 9195
fc36a67e 9196 if (need < width)
9197 need = width;
9198
20f6aaab
AS
9199#ifdef HAS_LDBL_SPRINTF_BUG
9200 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8
AS
9201 with sfio - Allen <allens@cpan.org> */
9202
9203# ifdef DBL_MAX
9204# define MY_DBL_MAX DBL_MAX
9205# else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
9206# if DOUBLESIZE >= 8
9207# define MY_DBL_MAX 1.7976931348623157E+308L
9208# else
9209# define MY_DBL_MAX 3.40282347E+38L
9210# endif
9211# endif
9212
9213# ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
9214# define MY_DBL_MAX_BUG 1L
20f6aaab 9215# else
205f51d8 9216# define MY_DBL_MAX_BUG MY_DBL_MAX
20f6aaab 9217# endif
20f6aaab 9218
205f51d8
AS
9219# ifdef DBL_MIN
9220# define MY_DBL_MIN DBL_MIN
9221# else /* XXX guessing! -Allen */
9222# if DOUBLESIZE >= 8
9223# define MY_DBL_MIN 2.2250738585072014E-308L
9224# else
9225# define MY_DBL_MIN 1.17549435E-38L
9226# endif
9227# endif
20f6aaab 9228
205f51d8
AS
9229 if ((intsize == 'q') && (c == 'f') &&
9230 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
9231 (need < DBL_DIG)) {
9232 /* it's going to be short enough that
9233 * long double precision is not needed */
9234
9235 if ((nv <= 0L) && (nv >= -0L))
9236 fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
9237 else {
9238 /* would use Perl_fp_class as a double-check but not
9239 * functional on IRIX - see perl.h comments */
9240
9241 if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
9242 /* It's within the range that a double can represent */
9243#if defined(DBL_MAX) && !defined(DBL_MIN)
9244 if ((nv >= ((long double)1/DBL_MAX)) ||
9245 (nv <= (-(long double)1/DBL_MAX)))
20f6aaab 9246#endif
205f51d8 9247 fix_ldbl_sprintf_bug = TRUE;
20f6aaab 9248 }
205f51d8
AS
9249 }
9250 if (fix_ldbl_sprintf_bug == TRUE) {
9251 double temp;
9252
9253 intsize = 0;
9254 temp = (double)nv;
9255 nv = (NV)temp;
9256 }
20f6aaab 9257 }
205f51d8
AS
9258
9259# undef MY_DBL_MAX
9260# undef MY_DBL_MAX_BUG
9261# undef MY_DBL_MIN
9262
20f6aaab
AS
9263#endif /* HAS_LDBL_SPRINTF_BUG */
9264
46fc3d4c 9265 need += 20; /* fudge factor */
80252599
GS
9266 if (PL_efloatsize < need) {
9267 Safefree(PL_efloatbuf);
9268 PL_efloatsize = need + 20; /* more fudge */
a02a5408 9269 Newx(PL_efloatbuf, PL_efloatsize, char);
7d5ea4e7 9270 PL_efloatbuf[0] = '\0';
46fc3d4c 9271 }
9272
4151a5fe
IZ
9273 if ( !(width || left || plus || alt) && fill != '0'
9274 && has_precis && intsize != 'q' ) { /* Shortcuts */
2873255c
NC
9275 /* See earlier comment about buggy Gconvert when digits,
9276 aka precis is 0 */
9277 if ( c == 'g' && precis) {
2e59c212 9278 Gconvert((NV)nv, (int)precis, 0, PL_efloatbuf);
4150c189
NC
9279 /* May return an empty string for digits==0 */
9280 if (*PL_efloatbuf) {
9281 elen = strlen(PL_efloatbuf);
4151a5fe 9282 goto float_converted;
4150c189 9283 }
4151a5fe
IZ
9284 } else if ( c == 'f' && !precis) {
9285 if ((eptr = F0convert(nv, ebuf + sizeof ebuf, &elen)))
9286 break;
9287 }
9288 }
4d84ee25
NC
9289 {
9290 char *ptr = ebuf + sizeof ebuf;
9291 *--ptr = '\0';
9292 *--ptr = c;
9293 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
9e5b023a 9294#if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
4d84ee25
NC
9295 if (intsize == 'q') {
9296 /* Copy the one or more characters in a long double
9297 * format before the 'base' ([efgEFG]) character to
9298 * the format string. */
9299 static char const prifldbl[] = PERL_PRIfldbl;
9300 char const *p = prifldbl + sizeof(prifldbl) - 3;
9301 while (p >= prifldbl) { *--ptr = *p--; }
9302 }
65202027 9303#endif
4d84ee25
NC
9304 if (has_precis) {
9305 base = precis;
9306 do { *--ptr = '0' + (base % 10); } while (base /= 10);
9307 *--ptr = '.';
9308 }
9309 if (width) {
9310 base = width;
9311 do { *--ptr = '0' + (base % 10); } while (base /= 10);
9312 }
9313 if (fill == '0')
9314 *--ptr = fill;
9315 if (left)
9316 *--ptr = '-';
9317 if (plus)
9318 *--ptr = plus;
9319 if (alt)
9320 *--ptr = '#';
9321 *--ptr = '%';
9322
9323 /* No taint. Otherwise we are in the strange situation
9324 * where printf() taints but print($float) doesn't.
9325 * --jhi */
9e5b023a 9326#if defined(HAS_LONG_DOUBLE)
4150c189 9327 elen = ((intsize == 'q')
d9fad198
JH
9328 ? my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, nv)
9329 : my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, (double)nv));
9e5b023a 9330#else
4150c189 9331 elen = my_sprintf(PL_efloatbuf, ptr, nv);
9e5b023a 9332#endif
4d84ee25 9333 }
4151a5fe 9334 float_converted:
80252599 9335 eptr = PL_efloatbuf;
46fc3d4c 9336 break;
9337
fc36a67e 9338 /* SPECIAL */
9339
9340 case 'n':
26372e71
GA
9341 if (vectorize)
9342 goto unknown;
fc36a67e 9343 i = SvCUR(sv) - origlen;
26372e71 9344 if (args) {
c635e13b 9345 switch (intsize) {
9346 case 'h': *(va_arg(*args, short*)) = i; break;
9347 default: *(va_arg(*args, int*)) = i; break;
9348 case 'l': *(va_arg(*args, long*)) = i; break;
9349 case 'V': *(va_arg(*args, IV*)) = i; break;
cf2093f6
JH
9350#ifdef HAS_QUAD
9351 case 'q': *(va_arg(*args, Quad_t*)) = i; break;
9352#endif
c635e13b 9353 }
fc36a67e 9354 }
9dd79c3f 9355 else
211dfcf1 9356 sv_setuv_mg(argsv, (UV)i);
fc36a67e 9357 continue; /* not "break" */
9358
9359 /* UNKNOWN */
9360
46fc3d4c 9361 default:
fc36a67e 9362 unknown:
041457d9
DM
9363 if (!args
9364 && (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)
9365 && ckWARN(WARN_PRINTF))
9366 {
c4420975 9367 SV * const msg = sv_newmortal();
35c1215d
NC
9368 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
9369 (PL_op->op_type == OP_PRTF) ? "" : "s");
0f4b6630 9370 if (c) {
0f4b6630 9371 if (isPRINT(c))
1c846c1f 9372 Perl_sv_catpvf(aTHX_ msg,
0f4b6630
JH
9373 "\"%%%c\"", c & 0xFF);
9374 else
9375 Perl_sv_catpvf(aTHX_ msg,
57def98f 9376 "\"%%\\%03"UVof"\"",
0f4b6630 9377 (UV)c & 0xFF);
0f4b6630 9378 } else
396482e1 9379 sv_catpvs(msg, "end of string");
be2597df 9380 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, SVfARG(msg)); /* yes, this is reentrant */
c635e13b 9381 }
fb73857a 9382
9383 /* output mangled stuff ... */
9384 if (c == '\0')
9385 --q;
46fc3d4c 9386 eptr = p;
9387 elen = q - p;
fb73857a 9388
9389 /* ... right here, because formatting flags should not apply */
9390 SvGROW(sv, SvCUR(sv) + elen + 1);
9391 p = SvEND(sv);
4459522c 9392 Copy(eptr, p, elen, char);
fb73857a 9393 p += elen;
9394 *p = '\0';
3f7c398e 9395 SvCUR_set(sv, p - SvPVX_const(sv));
58e33a90 9396 svix = osvix;
fb73857a 9397 continue; /* not "break" */
46fc3d4c 9398 }
9399
cc61b222
TS
9400 if (is_utf8 != has_utf8) {
9401 if (is_utf8) {
9402 if (SvCUR(sv))
9403 sv_utf8_upgrade(sv);
9404 }
9405 else {
9406 const STRLEN old_elen = elen;
9407 SV * const nsv = sv_2mortal(newSVpvn(eptr, elen));
9408 sv_utf8_upgrade(nsv);
9409 eptr = SvPVX_const(nsv);
9410 elen = SvCUR(nsv);
9411
9412 if (width) { /* fudge width (can't fudge elen) */
9413 width += elen - old_elen;
9414 }
9415 is_utf8 = TRUE;
9416 }
9417 }
9418
6c94ec8b 9419 have = esignlen + zeros + elen;
ed2b91d2
GA
9420 if (have < zeros)
9421 Perl_croak_nocontext(PL_memory_wrap);
6c94ec8b 9422
46fc3d4c 9423 need = (have > width ? have : width);
9424 gap = need - have;
9425
d2641cbd
PC
9426 if (need >= (((STRLEN)~0) - SvCUR(sv) - dotstrlen - 1))
9427 Perl_croak_nocontext(PL_memory_wrap);
b22c7a20 9428 SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
46fc3d4c 9429 p = SvEND(sv);
9430 if (esignlen && fill == '0') {
53c1dcc0 9431 int i;
eb160463 9432 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 9433 *p++ = esignbuf[i];
9434 }
9435 if (gap && !left) {
9436 memset(p, fill, gap);
9437 p += gap;
9438 }
9439 if (esignlen && fill != '0') {
53c1dcc0 9440 int i;
eb160463 9441 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 9442 *p++ = esignbuf[i];
9443 }
fc36a67e 9444 if (zeros) {
53c1dcc0 9445 int i;
fc36a67e 9446 for (i = zeros; i; i--)
9447 *p++ = '0';
9448 }
46fc3d4c 9449 if (elen) {
4459522c 9450 Copy(eptr, p, elen, char);
46fc3d4c 9451 p += elen;
9452 }
9453 if (gap && left) {
9454 memset(p, ' ', gap);
9455 p += gap;
9456 }
b22c7a20
GS
9457 if (vectorize) {
9458 if (veclen) {
4459522c 9459 Copy(dotstr, p, dotstrlen, char);
b22c7a20
GS
9460 p += dotstrlen;
9461 }
9462 else
9463 vectorize = FALSE; /* done iterating over vecstr */
9464 }
2cf2cfc6
A
9465 if (is_utf8)
9466 has_utf8 = TRUE;
9467 if (has_utf8)
7e2040f0 9468 SvUTF8_on(sv);
46fc3d4c 9469 *p = '\0';
3f7c398e 9470 SvCUR_set(sv, p - SvPVX_const(sv));
b22c7a20
GS
9471 if (vectorize) {
9472 esignlen = 0;
9473 goto vector;
9474 }
46fc3d4c 9475 }
9476}
51371543 9477
645c22ef
DM
9478/* =========================================================================
9479
9480=head1 Cloning an interpreter
9481
9482All the macros and functions in this section are for the private use of
9483the main function, perl_clone().
9484
9485The foo_dup() functions make an exact copy of an existing foo thinngy.
9486During the course of a cloning, a hash table is used to map old addresses
9487to new addresses. The table is created and manipulated with the
9488ptr_table_* functions.
9489
9490=cut
9491
9492============================================================================*/
9493
9494
1d7c1841
GS
9495#if defined(USE_ITHREADS)
9496
d4c19fe8 9497/* XXX Remove this so it doesn't have to go thru the macro and return for nothing */
1d7c1841
GS
9498#ifndef GpREFCNT_inc
9499# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
9500#endif
9501
9502
a41cc44e 9503/* Certain cases in Perl_ss_dup have been merged, by relying on the fact
3e07292d
NC
9504 that currently av_dup, gv_dup and hv_dup are the same as sv_dup.
9505 If this changes, please unmerge ss_dup. */
d2d73c3e 9506#define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
7f466ec7 9507#define sv_dup_inc_NN(s,t) SvREFCNT_inc_NN(sv_dup(s,t))
d2d73c3e
AB
9508#define av_dup(s,t) (AV*)sv_dup((SV*)s,t)
9509#define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9510#define hv_dup(s,t) (HV*)sv_dup((SV*)s,t)
9511#define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9512#define cv_dup(s,t) (CV*)sv_dup((SV*)s,t)
9513#define cv_dup_inc(s,t) (CV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9514#define io_dup(s,t) (IO*)sv_dup((SV*)s,t)
9515#define io_dup_inc(s,t) (IO*)SvREFCNT_inc(sv_dup((SV*)s,t))
9516#define gv_dup(s,t) (GV*)sv_dup((SV*)s,t)
9517#define gv_dup_inc(s,t) (GV*)SvREFCNT_inc(sv_dup((SV*)s,t))
6136c704
AL
9518#define SAVEPV(p) ((p) ? savepv(p) : NULL)
9519#define SAVEPVN(p,n) ((p) ? savepvn(p,n) : NULL)
8cf8f3d1 9520
199e78b7
DM
9521/* clone a parser */
9522
9523yy_parser *
9524Perl_parser_dup(pTHX_ const yy_parser *proto, CLONE_PARAMS* param)
9525{
9526 yy_parser *parser;
9527
9528 if (!proto)
9529 return NULL;
9530
7c197c94
DM
9531 /* look for it in the table first */
9532 parser = (yy_parser *)ptr_table_fetch(PL_ptr_table, proto);
9533 if (parser)
9534 return parser;
9535
9536 /* create anew and remember what it is */
199e78b7 9537 Newxz(parser, 1, yy_parser);
7c197c94 9538 ptr_table_store(PL_ptr_table, proto, parser);
199e78b7
DM
9539
9540 parser->yyerrstatus = 0;
9541 parser->yychar = YYEMPTY; /* Cause a token to be read. */
9542
9543 /* XXX these not yet duped */
9544 parser->old_parser = NULL;
9545 parser->stack = NULL;
9546 parser->ps = NULL;
9547 parser->stack_size = 0;
9548 /* XXX parser->stack->state = 0; */
9549
9550 /* XXX eventually, just Copy() most of the parser struct ? */
9551
9552 parser->lex_brackets = proto->lex_brackets;
9553 parser->lex_casemods = proto->lex_casemods;
9554 parser->lex_brackstack = savepvn(proto->lex_brackstack,
9555 (proto->lex_brackets < 120 ? 120 : proto->lex_brackets));
9556 parser->lex_casestack = savepvn(proto->lex_casestack,
9557 (proto->lex_casemods < 12 ? 12 : proto->lex_casemods));
9558 parser->lex_defer = proto->lex_defer;
9559 parser->lex_dojoin = proto->lex_dojoin;
9560 parser->lex_expect = proto->lex_expect;
9561 parser->lex_formbrack = proto->lex_formbrack;
9562 parser->lex_inpat = proto->lex_inpat;
9563 parser->lex_inwhat = proto->lex_inwhat;
9564 parser->lex_op = proto->lex_op;
9565 parser->lex_repl = sv_dup_inc(proto->lex_repl, param);
9566 parser->lex_starts = proto->lex_starts;
9567 parser->lex_stuff = sv_dup_inc(proto->lex_stuff, param);
9568 parser->multi_close = proto->multi_close;
9569 parser->multi_open = proto->multi_open;
9570 parser->multi_start = proto->multi_start;
9571 parser->pending_ident = proto->pending_ident;
9572 parser->preambled = proto->preambled;
9573 parser->sublex_info = proto->sublex_info; /* XXX not quite right */
bdc0bf6f 9574 parser->linestr = sv_dup_inc(proto->linestr, param);
53a7735b
DM
9575 parser->expect = proto->expect;
9576 parser->copline = proto->copline;
f06b5848 9577 parser->last_lop_op = proto->last_lop_op;
bc177e6b
DM
9578 parser->lex_state = proto->lex_state;
9579
53a7735b 9580
f06b5848
DM
9581 parser->linestr = sv_dup_inc(proto->linestr, param);
9582
9583 {
9584 char *ols = SvPVX(proto->linestr);
9585 char *ls = SvPVX(parser->linestr);
9586
9587 parser->bufptr = ls + (proto->bufptr >= ols ?
9588 proto->bufptr - ols : 0);
9589 parser->oldbufptr = ls + (proto->oldbufptr >= ols ?
9590 proto->oldbufptr - ols : 0);
9591 parser->oldoldbufptr= ls + (proto->oldoldbufptr >= ols ?
9592 proto->oldoldbufptr - ols : 0);
9593 parser->linestart = ls + (proto->linestart >= ols ?
9594 proto->linestart - ols : 0);
9595 parser->last_uni = ls + (proto->last_uni >= ols ?
9596 proto->last_uni - ols : 0);
9597 parser->last_lop = ls + (proto->last_lop >= ols ?
9598 proto->last_lop - ols : 0);
9599
9600 parser->bufend = ls + SvCUR(parser->linestr);
9601 }
199e78b7
DM
9602
9603#ifdef PERL_MAD
9604 parser->endwhite = proto->endwhite;
9605 parser->faketokens = proto->faketokens;
9606 parser->lasttoke = proto->lasttoke;
9607 parser->nextwhite = proto->nextwhite;
9608 parser->realtokenstart = proto->realtokenstart;
9609 parser->skipwhite = proto->skipwhite;
9610 parser->thisclose = proto->thisclose;
9611 parser->thismad = proto->thismad;
9612 parser->thisopen = proto->thisopen;
9613 parser->thisstuff = proto->thisstuff;
9614 parser->thistoken = proto->thistoken;
9615 parser->thiswhite = proto->thiswhite;
fb205e7a
DM
9616
9617 Copy(proto->nexttoke, parser->nexttoke, 5, NEXTTOKE);
9618 parser->curforce = proto->curforce;
9619#else
9620 Copy(proto->nextval, parser->nextval, 5, YYSTYPE);
9621 Copy(proto->nexttype, parser->nexttype, 5, I32);
9622 parser->nexttoke = proto->nexttoke;
199e78b7
DM
9623#endif
9624 return parser;
9625}
9626
d2d73c3e 9627
d2d73c3e 9628/* duplicate a file handle */
645c22ef 9629
1d7c1841 9630PerlIO *
a8fc9800 9631Perl_fp_dup(pTHX_ PerlIO *fp, char type, CLONE_PARAMS *param)
1d7c1841
GS
9632{
9633 PerlIO *ret;
53c1dcc0
AL
9634
9635 PERL_UNUSED_ARG(type);
73d840c0 9636
1d7c1841
GS
9637 if (!fp)
9638 return (PerlIO*)NULL;
9639
9640 /* look for it in the table first */
9641 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
9642 if (ret)
9643 return ret;
9644
9645 /* create anew and remember what it is */
ecdeb87c 9646 ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
1d7c1841
GS
9647 ptr_table_store(PL_ptr_table, fp, ret);
9648 return ret;
9649}
9650
645c22ef
DM
9651/* duplicate a directory handle */
9652
1d7c1841
GS
9653DIR *
9654Perl_dirp_dup(pTHX_ DIR *dp)
9655{
96a5add6 9656 PERL_UNUSED_CONTEXT;
1d7c1841
GS
9657 if (!dp)
9658 return (DIR*)NULL;
9659 /* XXX TODO */
9660 return dp;
9661}
9662
ff276b08 9663/* duplicate a typeglob */
645c22ef 9664
1d7c1841 9665GP *
a8fc9800 9666Perl_gp_dup(pTHX_ GP *gp, CLONE_PARAMS* param)
1d7c1841
GS
9667{
9668 GP *ret;
b37c2d43 9669
1d7c1841
GS
9670 if (!gp)
9671 return (GP*)NULL;
9672 /* look for it in the table first */
9673 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
9674 if (ret)
9675 return ret;
9676
9677 /* create anew and remember what it is */
a02a5408 9678 Newxz(ret, 1, GP);
1d7c1841
GS
9679 ptr_table_store(PL_ptr_table, gp, ret);
9680
9681 /* clone */
9682 ret->gp_refcnt = 0; /* must be before any other dups! */
d2d73c3e
AB
9683 ret->gp_sv = sv_dup_inc(gp->gp_sv, param);
9684 ret->gp_io = io_dup_inc(gp->gp_io, param);
9685 ret->gp_form = cv_dup_inc(gp->gp_form, param);
9686 ret->gp_av = av_dup_inc(gp->gp_av, param);
9687 ret->gp_hv = hv_dup_inc(gp->gp_hv, param);
9688 ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
9689 ret->gp_cv = cv_dup_inc(gp->gp_cv, param);
1d7c1841 9690 ret->gp_cvgen = gp->gp_cvgen;
1d7c1841 9691 ret->gp_line = gp->gp_line;
f4890806 9692 ret->gp_file_hek = hek_dup(gp->gp_file_hek, param);
1d7c1841
GS
9693 return ret;
9694}
9695
645c22ef
DM
9696/* duplicate a chain of magic */
9697
1d7c1841 9698MAGIC *
a8fc9800 9699Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS* param)
1d7c1841 9700{
cb359b41
JH
9701 MAGIC *mgprev = (MAGIC*)NULL;
9702 MAGIC *mgret;
1d7c1841
GS
9703 if (!mg)
9704 return (MAGIC*)NULL;
9705 /* look for it in the table first */
9706 mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
9707 if (mgret)
9708 return mgret;
9709
9710 for (; mg; mg = mg->mg_moremagic) {
9711 MAGIC *nmg;
a02a5408 9712 Newxz(nmg, 1, MAGIC);
cb359b41 9713 if (mgprev)
1d7c1841 9714 mgprev->mg_moremagic = nmg;
cb359b41
JH
9715 else
9716 mgret = nmg;
1d7c1841
GS
9717 nmg->mg_virtual = mg->mg_virtual; /* XXX copy dynamic vtable? */
9718 nmg->mg_private = mg->mg_private;
9719 nmg->mg_type = mg->mg_type;
9720 nmg->mg_flags = mg->mg_flags;
14befaf4 9721 if (mg->mg_type == PERL_MAGIC_qr) {
f8149455 9722 nmg->mg_obj = (SV*)CALLREGDUPE((REGEXP*)mg->mg_obj, param);
1d7c1841 9723 }
05bd4103 9724 else if(mg->mg_type == PERL_MAGIC_backref) {
d7cbc7b5
NC
9725 /* The backref AV has its reference count deliberately bumped by
9726 1. */
9727 nmg->mg_obj = SvREFCNT_inc(av_dup_inc((AV*) mg->mg_obj, param));
05bd4103 9728 }
1d7c1841
GS
9729 else {
9730 nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
d2d73c3e
AB
9731 ? sv_dup_inc(mg->mg_obj, param)
9732 : sv_dup(mg->mg_obj, param);
1d7c1841
GS
9733 }
9734 nmg->mg_len = mg->mg_len;
9735 nmg->mg_ptr = mg->mg_ptr; /* XXX random ptr? */
14befaf4 9736 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
68795e93 9737 if (mg->mg_len > 0) {
1d7c1841 9738 nmg->mg_ptr = SAVEPVN(mg->mg_ptr, mg->mg_len);
14befaf4
DM
9739 if (mg->mg_type == PERL_MAGIC_overload_table &&
9740 AMT_AMAGIC((AMT*)mg->mg_ptr))
9741 {
c445ea15 9742 const AMT * const amtp = (AMT*)mg->mg_ptr;
0bcc34c2 9743 AMT * const namtp = (AMT*)nmg->mg_ptr;
1d7c1841
GS
9744 I32 i;
9745 for (i = 1; i < NofAMmeth; i++) {
d2d73c3e 9746 namtp->table[i] = cv_dup_inc(amtp->table[i], param);
1d7c1841
GS
9747 }
9748 }
9749 }
9750 else if (mg->mg_len == HEf_SVKEY)
d2d73c3e 9751 nmg->mg_ptr = (char*)sv_dup_inc((SV*)mg->mg_ptr, param);
1d7c1841 9752 }
68795e93
NIS
9753 if ((mg->mg_flags & MGf_DUP) && mg->mg_virtual && mg->mg_virtual->svt_dup) {
9754 CALL_FPTR(nmg->mg_virtual->svt_dup)(aTHX_ nmg, param);
9755 }
1d7c1841
GS
9756 mgprev = nmg;
9757 }
9758 return mgret;
9759}
9760
4674ade5
NC
9761#endif /* USE_ITHREADS */
9762
645c22ef
DM
9763/* create a new pointer-mapping table */
9764
1d7c1841
GS
9765PTR_TBL_t *
9766Perl_ptr_table_new(pTHX)
9767{
9768 PTR_TBL_t *tbl;
96a5add6
AL
9769 PERL_UNUSED_CONTEXT;
9770
a02a5408 9771 Newxz(tbl, 1, PTR_TBL_t);
1d7c1841
GS
9772 tbl->tbl_max = 511;
9773 tbl->tbl_items = 0;
a02a5408 9774 Newxz(tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
1d7c1841
GS
9775 return tbl;
9776}
9777
7119fd33
NC
9778#define PTR_TABLE_HASH(ptr) \
9779 ((PTR2UV(ptr) >> 3) ^ (PTR2UV(ptr) >> (3 + 7)) ^ (PTR2UV(ptr) >> (3 + 17)))
134ca3d6 9780
93e68bfb
JC
9781/*
9782 we use the PTE_SVSLOT 'reservation' made above, both here (in the
9783 following define) and at call to new_body_inline made below in
9784 Perl_ptr_table_store()
9785 */
9786
9787#define del_pte(p) del_body_type(p, PTE_SVSLOT)
32e691d0 9788
645c22ef
DM
9789/* map an existing pointer using a table */
9790
7bf61b54 9791STATIC PTR_TBL_ENT_t *
b0e6ae5b 9792S_ptr_table_find(PTR_TBL_t *tbl, const void *sv) {
1d7c1841 9793 PTR_TBL_ENT_t *tblent;
4373e329 9794 const UV hash = PTR_TABLE_HASH(sv);
1d7c1841
GS
9795 assert(tbl);
9796 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
9797 for (; tblent; tblent = tblent->next) {
9798 if (tblent->oldval == sv)
7bf61b54 9799 return tblent;
1d7c1841 9800 }
d4c19fe8 9801 return NULL;
7bf61b54
NC
9802}
9803
9804void *
9805Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, const void *sv)
9806{
b0e6ae5b 9807 PTR_TBL_ENT_t const *const tblent = ptr_table_find(tbl, sv);
96a5add6 9808 PERL_UNUSED_CONTEXT;
d4c19fe8 9809 return tblent ? tblent->newval : NULL;
1d7c1841
GS
9810}
9811
645c22ef
DM
9812/* add a new entry to a pointer-mapping table */
9813
1d7c1841 9814void
44f8325f 9815Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, const void *oldsv, void *newsv)
1d7c1841 9816{
0c9fdfe0 9817 PTR_TBL_ENT_t *tblent = ptr_table_find(tbl, oldsv);
96a5add6 9818 PERL_UNUSED_CONTEXT;
1d7c1841 9819
7bf61b54
NC
9820 if (tblent) {
9821 tblent->newval = newsv;
9822 } else {
9823 const UV entry = PTR_TABLE_HASH(oldsv) & tbl->tbl_max;
9824
d2a0f284
JC
9825 new_body_inline(tblent, PTE_SVSLOT);
9826
7bf61b54
NC
9827 tblent->oldval = oldsv;
9828 tblent->newval = newsv;
9829 tblent->next = tbl->tbl_ary[entry];
9830 tbl->tbl_ary[entry] = tblent;
9831 tbl->tbl_items++;
9832 if (tblent->next && tbl->tbl_items > tbl->tbl_max)
9833 ptr_table_split(tbl);
1d7c1841 9834 }
1d7c1841
GS
9835}
9836
645c22ef
DM
9837/* double the hash bucket size of an existing ptr table */
9838
1d7c1841
GS
9839void
9840Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
9841{
9842 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
4373e329 9843 const UV oldsize = tbl->tbl_max + 1;
1d7c1841
GS
9844 UV newsize = oldsize * 2;
9845 UV i;
96a5add6 9846 PERL_UNUSED_CONTEXT;
1d7c1841
GS
9847
9848 Renew(ary, newsize, PTR_TBL_ENT_t*);
9849 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
9850 tbl->tbl_max = --newsize;
9851 tbl->tbl_ary = ary;
9852 for (i=0; i < oldsize; i++, ary++) {
9853 PTR_TBL_ENT_t **curentp, **entp, *ent;
9854 if (!*ary)
9855 continue;
9856 curentp = ary + oldsize;
9857 for (entp = ary, ent = *ary; ent; ent = *entp) {
134ca3d6 9858 if ((newsize & PTR_TABLE_HASH(ent->oldval)) != i) {
1d7c1841
GS
9859 *entp = ent->next;
9860 ent->next = *curentp;
9861 *curentp = ent;
9862 continue;
9863 }
9864 else
9865 entp = &ent->next;
9866 }
9867 }
9868}
9869
645c22ef
DM
9870/* remove all the entries from a ptr table */
9871
a0739874
DM
9872void
9873Perl_ptr_table_clear(pTHX_ PTR_TBL_t *tbl)
9874{
d5cefff9 9875 if (tbl && tbl->tbl_items) {
c445ea15 9876 register PTR_TBL_ENT_t * const * const array = tbl->tbl_ary;
d5cefff9 9877 UV riter = tbl->tbl_max;
a0739874 9878
d5cefff9
NC
9879 do {
9880 PTR_TBL_ENT_t *entry = array[riter];
ab1e7f95 9881
d5cefff9 9882 while (entry) {
00b6aa41 9883 PTR_TBL_ENT_t * const oentry = entry;
d5cefff9
NC
9884 entry = entry->next;
9885 del_pte(oentry);
9886 }
9887 } while (riter--);
a0739874 9888
d5cefff9
NC
9889 tbl->tbl_items = 0;
9890 }
a0739874
DM
9891}
9892
645c22ef
DM
9893/* clear and free a ptr table */
9894
a0739874
DM
9895void
9896Perl_ptr_table_free(pTHX_ PTR_TBL_t *tbl)
9897{
9898 if (!tbl) {
9899 return;
9900 }
9901 ptr_table_clear(tbl);
9902 Safefree(tbl->tbl_ary);
9903 Safefree(tbl);
9904}
9905
4674ade5 9906#if defined(USE_ITHREADS)
5bd07a3d 9907
83841fad 9908void
eb86f8b3 9909Perl_rvpv_dup(pTHX_ SV *dstr, const SV *sstr, CLONE_PARAMS* param)
83841fad
NIS
9910{
9911 if (SvROK(sstr)) {
b162af07
SP
9912 SvRV_set(dstr, SvWEAKREF(sstr)
9913 ? sv_dup(SvRV(sstr), param)
9914 : sv_dup_inc(SvRV(sstr), param));
f880fe2f 9915
83841fad 9916 }
3f7c398e 9917 else if (SvPVX_const(sstr)) {
83841fad
NIS
9918 /* Has something there */
9919 if (SvLEN(sstr)) {
68795e93 9920 /* Normal PV - clone whole allocated space */
3f7c398e 9921 SvPV_set(dstr, SAVEPVN(SvPVX_const(sstr), SvLEN(sstr)-1));
d3d0e6f1
NC
9922 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
9923 /* Not that normal - actually sstr is copy on write.
9924 But we are a true, independant SV, so: */
9925 SvREADONLY_off(dstr);
9926 SvFAKE_off(dstr);
9927 }
68795e93 9928 }
83841fad
NIS
9929 else {
9930 /* Special case - not normally malloced for some reason */
f7877b28
NC
9931 if (isGV_with_GP(sstr)) {
9932 /* Don't need to do anything here. */
9933 }
9934 else if ((SvREADONLY(sstr) && SvFAKE(sstr))) {
ef10be65
NC
9935 /* A "shared" PV - clone it as "shared" PV */
9936 SvPV_set(dstr,
9937 HEK_KEY(hek_dup(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)),
9938 param)));
83841fad
NIS
9939 }
9940 else {
9941 /* Some other special case - random pointer */
f880fe2f 9942 SvPV_set(dstr, SvPVX(sstr));
d3d0e6f1 9943 }
83841fad
NIS
9944 }
9945 }
9946 else {
4608196e 9947 /* Copy the NULL */
f880fe2f 9948 if (SvTYPE(dstr) == SVt_RV)
b162af07 9949 SvRV_set(dstr, NULL);
f880fe2f 9950 else
6136c704 9951 SvPV_set(dstr, NULL);
83841fad
NIS
9952 }
9953}
9954
662fb8b2
NC
9955/* duplicate an SV of any type (including AV, HV etc) */
9956
1d7c1841 9957SV *
eb86f8b3 9958Perl_sv_dup(pTHX_ const SV *sstr, CLONE_PARAMS* param)
1d7c1841 9959{
27da23d5 9960 dVAR;
1d7c1841
GS
9961 SV *dstr;
9962
9963 if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
6136c704 9964 return NULL;
1d7c1841
GS
9965 /* look for it in the table first */
9966 dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
9967 if (dstr)
9968 return dstr;
9969
0405e91e
AB
9970 if(param->flags & CLONEf_JOIN_IN) {
9971 /** We are joining here so we don't want do clone
9972 something that is bad **/
eb86f8b3
AL
9973 if (SvTYPE(sstr) == SVt_PVHV) {
9974 const char * const hvname = HvNAME_get(sstr);
9975 if (hvname)
9976 /** don't clone stashes if they already exist **/
9977 return (SV*)gv_stashpv(hvname,0);
0405e91e
AB
9978 }
9979 }
9980
1d7c1841
GS
9981 /* create anew and remember what it is */
9982 new_SV(dstr);
fd0854ff
DM
9983
9984#ifdef DEBUG_LEAKING_SCALARS
9985 dstr->sv_debug_optype = sstr->sv_debug_optype;
9986 dstr->sv_debug_line = sstr->sv_debug_line;
9987 dstr->sv_debug_inpad = sstr->sv_debug_inpad;
9988 dstr->sv_debug_cloned = 1;
fd0854ff 9989 dstr->sv_debug_file = savepv(sstr->sv_debug_file);
fd0854ff
DM
9990#endif
9991
1d7c1841
GS
9992 ptr_table_store(PL_ptr_table, sstr, dstr);
9993
9994 /* clone */
9995 SvFLAGS(dstr) = SvFLAGS(sstr);
9996 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
9997 SvREFCNT(dstr) = 0; /* must be before any other dups! */
9998
9999#ifdef DEBUGGING
3f7c398e 10000 if (SvANY(sstr) && PL_watch_pvx && SvPVX_const(sstr) == PL_watch_pvx)
1d7c1841 10001 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
6c9570dc 10002 (void*)PL_watch_pvx, SvPVX_const(sstr));
1d7c1841
GS
10003#endif
10004
9660f481
DM
10005 /* don't clone objects whose class has asked us not to */
10006 if (SvOBJECT(sstr) && ! (SvFLAGS(SvSTASH(sstr)) & SVphv_CLONEABLE)) {
10007 SvFLAGS(dstr) &= ~SVTYPEMASK;
10008 SvOBJECT_off(dstr);
10009 return dstr;
10010 }
10011
1d7c1841
GS
10012 switch (SvTYPE(sstr)) {
10013 case SVt_NULL:
10014 SvANY(dstr) = NULL;
10015 break;
10016 case SVt_IV:
339049b0 10017 SvANY(dstr) = (XPVIV*)((char*)&(dstr->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
45977657 10018 SvIV_set(dstr, SvIVX(sstr));
1d7c1841
GS
10019 break;
10020 case SVt_NV:
10021 SvANY(dstr) = new_XNV();
9d6ce603 10022 SvNV_set(dstr, SvNVX(sstr));
1d7c1841
GS
10023 break;
10024 case SVt_RV:
339049b0 10025 SvANY(dstr) = &(dstr->sv_u.svu_rv);
83841fad 10026 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841 10027 break;
cecf5685 10028 /* case SVt_BIND: */
662fb8b2
NC
10029 default:
10030 {
10031 /* These are all the types that need complex bodies allocating. */
662fb8b2 10032 void *new_body;
2bcc16b3
NC
10033 const svtype sv_type = SvTYPE(sstr);
10034 const struct body_details *const sv_type_details
10035 = bodies_by_type + sv_type;
662fb8b2 10036
93e68bfb 10037 switch (sv_type) {
662fb8b2 10038 default:
bb263b4e 10039 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
662fb8b2
NC
10040 break;
10041
662fb8b2
NC
10042 case SVt_PVGV:
10043 if (GvUNIQUE((GV*)sstr)) {
6f207bd3 10044 NOOP; /* Do sharing here, and fall through */
662fb8b2 10045 }
c22188b4
NC
10046 case SVt_PVIO:
10047 case SVt_PVFM:
10048 case SVt_PVHV:
10049 case SVt_PVAV:
662fb8b2 10050 case SVt_PVCV:
662fb8b2 10051 case SVt_PVLV:
662fb8b2 10052 case SVt_PVMG:
662fb8b2 10053 case SVt_PVNV:
662fb8b2 10054 case SVt_PVIV:
662fb8b2 10055 case SVt_PV:
d2a0f284 10056 assert(sv_type_details->body_size);
c22188b4 10057 if (sv_type_details->arena) {
d2a0f284 10058 new_body_inline(new_body, sv_type);
c22188b4 10059 new_body
b9502f15 10060 = (void*)((char*)new_body - sv_type_details->offset);
c22188b4
NC
10061 } else {
10062 new_body = new_NOARENA(sv_type_details);
10063 }
1d7c1841 10064 }
662fb8b2
NC
10065 assert(new_body);
10066 SvANY(dstr) = new_body;
10067
2bcc16b3 10068#ifndef PURIFY
b9502f15
NC
10069 Copy(((char*)SvANY(sstr)) + sv_type_details->offset,
10070 ((char*)SvANY(dstr)) + sv_type_details->offset,
f32993d6 10071 sv_type_details->copy, char);
2bcc16b3
NC
10072#else
10073 Copy(((char*)SvANY(sstr)),
10074 ((char*)SvANY(dstr)),
d2a0f284 10075 sv_type_details->body_size + sv_type_details->offset, char);
2bcc16b3 10076#endif
662fb8b2 10077
f7877b28
NC
10078 if (sv_type != SVt_PVAV && sv_type != SVt_PVHV
10079 && !isGV_with_GP(dstr))
662fb8b2
NC
10080 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
10081
10082 /* The Copy above means that all the source (unduplicated) pointers
10083 are now in the destination. We can check the flags and the
10084 pointers in either, but it's possible that there's less cache
10085 missing by always going for the destination.
10086 FIXME - instrument and check that assumption */
f32993d6 10087 if (sv_type >= SVt_PVMG) {
885ffcb3 10088 if ((sv_type == SVt_PVMG) && SvPAD_OUR(dstr)) {
73d95100 10089 SvOURSTASH_set(dstr, hv_dup_inc(SvOURSTASH(dstr), param));
e736a858 10090 } else if (SvMAGIC(dstr))
662fb8b2
NC
10091 SvMAGIC_set(dstr, mg_dup(SvMAGIC(dstr), param));
10092 if (SvSTASH(dstr))
10093 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(dstr), param));
1d7c1841 10094 }
662fb8b2 10095
f32993d6
NC
10096 /* The cast silences a GCC warning about unhandled types. */
10097 switch ((int)sv_type) {
662fb8b2
NC
10098 case SVt_PV:
10099 break;
10100 case SVt_PVIV:
10101 break;
10102 case SVt_PVNV:
10103 break;
10104 case SVt_PVMG:
10105 break;
662fb8b2
NC
10106 case SVt_PVLV:
10107 /* XXX LvTARGOFF sometimes holds PMOP* when DEBUGGING */
10108 if (LvTYPE(dstr) == 't') /* for tie: unrefcnted fake (SV**) */
10109 LvTARG(dstr) = dstr;
10110 else if (LvTYPE(dstr) == 'T') /* for tie: fake HE */
10111 LvTARG(dstr) = (SV*)he_dup((HE*)LvTARG(dstr), 0, param);
10112 else
10113 LvTARG(dstr) = sv_dup_inc(LvTARG(dstr), param);
662fb8b2 10114 case SVt_PVGV:
cecf5685
NC
10115 if(isGV_with_GP(sstr)) {
10116 if (GvNAME_HEK(dstr))
10117 GvNAME_HEK(dstr) = hek_dup(GvNAME_HEK(dstr), param);
39cb70dc
NC
10118 /* Don't call sv_add_backref here as it's going to be
10119 created as part of the magic cloning of the symbol
10120 table. */
f7877b28
NC
10121 /* Danger Will Robinson - GvGP(dstr) isn't initialised
10122 at the point of this comment. */
39cb70dc 10123 GvSTASH(dstr) = hv_dup(GvSTASH(dstr), param);
f7877b28
NC
10124 GvGP(dstr) = gp_dup(GvGP(sstr), param);
10125 (void)GpREFCNT_inc(GvGP(dstr));
10126 } else
10127 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
662fb8b2
NC
10128 break;
10129 case SVt_PVIO:
10130 IoIFP(dstr) = fp_dup(IoIFP(dstr), IoTYPE(dstr), param);
10131 if (IoOFP(dstr) == IoIFP(sstr))
10132 IoOFP(dstr) = IoIFP(dstr);
10133 else
10134 IoOFP(dstr) = fp_dup(IoOFP(dstr), IoTYPE(dstr), param);
10135 /* PL_rsfp_filters entries have fake IoDIRP() */
662fb8b2
NC
10136 if(IoFLAGS(dstr) & IOf_FAKE_DIRP) {
10137 /* I have no idea why fake dirp (rsfps)
10138 should be treated differently but otherwise
10139 we end up with leaks -- sky*/
10140 IoTOP_GV(dstr) = gv_dup_inc(IoTOP_GV(dstr), param);
10141 IoFMT_GV(dstr) = gv_dup_inc(IoFMT_GV(dstr), param);
10142 IoBOTTOM_GV(dstr) = gv_dup_inc(IoBOTTOM_GV(dstr), param);
10143 } else {
10144 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(dstr), param);
10145 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(dstr), param);
10146 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(dstr), param);
100ce7e1
NC
10147 if (IoDIRP(dstr)) {
10148 IoDIRP(dstr) = dirp_dup(IoDIRP(dstr));
10149 } else {
6f207bd3 10150 NOOP;
100ce7e1
NC
10151 /* IoDIRP(dstr) is already a copy of IoDIRP(sstr) */
10152 }
662fb8b2
NC
10153 }
10154 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(dstr));
10155 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(dstr));
10156 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(dstr));
10157 break;
10158 case SVt_PVAV:
10159 if (AvARRAY((AV*)sstr)) {
10160 SV **dst_ary, **src_ary;
10161 SSize_t items = AvFILLp((AV*)sstr) + 1;
10162
10163 src_ary = AvARRAY((AV*)sstr);
a02a5408 10164 Newxz(dst_ary, AvMAX((AV*)sstr)+1, SV*);
662fb8b2 10165 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
9c6bc640 10166 AvARRAY((AV*)dstr) = dst_ary;
662fb8b2
NC
10167 AvALLOC((AV*)dstr) = dst_ary;
10168 if (AvREAL((AV*)sstr)) {
10169 while (items-- > 0)
10170 *dst_ary++ = sv_dup_inc(*src_ary++, param);
10171 }
10172 else {
10173 while (items-- > 0)
10174 *dst_ary++ = sv_dup(*src_ary++, param);
10175 }
10176 items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
10177 while (items-- > 0) {
10178 *dst_ary++ = &PL_sv_undef;
10179 }
bfcb3514 10180 }
662fb8b2 10181 else {
9c6bc640 10182 AvARRAY((AV*)dstr) = NULL;
662fb8b2 10183 AvALLOC((AV*)dstr) = (SV**)NULL;
b79f7545 10184 }
662fb8b2
NC
10185 break;
10186 case SVt_PVHV:
7e265ef3
AL
10187 if (HvARRAY((HV*)sstr)) {
10188 STRLEN i = 0;
10189 const bool sharekeys = !!HvSHAREKEYS(sstr);
10190 XPVHV * const dxhv = (XPVHV*)SvANY(dstr);
10191 XPVHV * const sxhv = (XPVHV*)SvANY(sstr);
10192 char *darray;
10193 Newx(darray, PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1)
10194 + (SvOOK(sstr) ? sizeof(struct xpvhv_aux) : 0),
10195 char);
10196 HvARRAY(dstr) = (HE**)darray;
10197 while (i <= sxhv->xhv_max) {
10198 const HE * const source = HvARRAY(sstr)[i];
10199 HvARRAY(dstr)[i] = source
10200 ? he_dup(source, sharekeys, param) : 0;
10201 ++i;
10202 }
10203 if (SvOOK(sstr)) {
10204 HEK *hvname;
10205 const struct xpvhv_aux * const saux = HvAUX(sstr);
10206 struct xpvhv_aux * const daux = HvAUX(dstr);
10207 /* This flag isn't copied. */
10208 /* SvOOK_on(hv) attacks the IV flags. */
10209 SvFLAGS(dstr) |= SVf_OOK;
10210
10211 hvname = saux->xhv_name;
10212 daux->xhv_name = hvname ? hek_dup(hvname, param) : hvname;
10213
10214 daux->xhv_riter = saux->xhv_riter;
10215 daux->xhv_eiter = saux->xhv_eiter
10216 ? he_dup(saux->xhv_eiter,
10217 (bool)!!HvSHAREKEYS(sstr), param) : 0;
10218 daux->xhv_backreferences =
10219 saux->xhv_backreferences
86f55936 10220 ? (AV*) SvREFCNT_inc(
7e265ef3 10221 sv_dup((SV*)saux->xhv_backreferences, param))
86f55936 10222 : 0;
e1a479c5
BB
10223
10224 daux->xhv_mro_meta = saux->xhv_mro_meta
10225 ? mro_meta_dup(saux->xhv_mro_meta, param)
10226 : 0;
10227
7e265ef3
AL
10228 /* Record stashes for possible cloning in Perl_clone(). */
10229 if (hvname)
10230 av_push(param->stashes, dstr);
662fb8b2 10231 }
662fb8b2 10232 }
7e265ef3 10233 else
797c7171 10234 HvARRAY((HV*)dstr) = NULL;
662fb8b2 10235 break;
662fb8b2 10236 case SVt_PVCV:
bb172083
NC
10237 if (!(param->flags & CLONEf_COPY_STACKS)) {
10238 CvDEPTH(dstr) = 0;
10239 }
10240 case SVt_PVFM:
662fb8b2
NC
10241 /* NOTE: not refcounted */
10242 CvSTASH(dstr) = hv_dup(CvSTASH(dstr), param);
10243 OP_REFCNT_LOCK;
d04ba589
NC
10244 if (!CvISXSUB(dstr))
10245 CvROOT(dstr) = OpREFCNT_inc(CvROOT(dstr));
662fb8b2 10246 OP_REFCNT_UNLOCK;
cfae286e 10247 if (CvCONST(dstr) && CvISXSUB(dstr)) {
662fb8b2
NC
10248 CvXSUBANY(dstr).any_ptr = GvUNIQUE(CvGV(dstr)) ?
10249 SvREFCNT_inc(CvXSUBANY(dstr).any_ptr) :
10250 sv_dup_inc((SV *)CvXSUBANY(dstr).any_ptr, param);
10251 }
10252 /* don't dup if copying back - CvGV isn't refcounted, so the
10253 * duped GV may never be freed. A bit of a hack! DAPM */
10254 CvGV(dstr) = (param->flags & CLONEf_JOIN_IN) ?
a0714e2c 10255 NULL : gv_dup(CvGV(dstr), param) ;
662fb8b2
NC
10256 PAD_DUP(CvPADLIST(dstr), CvPADLIST(sstr), param);
10257 CvOUTSIDE(dstr) =
10258 CvWEAKOUTSIDE(sstr)
10259 ? cv_dup( CvOUTSIDE(dstr), param)
10260 : cv_dup_inc(CvOUTSIDE(dstr), param);
aed2304a 10261 if (!CvISXSUB(dstr))
662fb8b2
NC
10262 CvFILE(dstr) = SAVEPV(CvFILE(dstr));
10263 break;
bfcb3514 10264 }
1d7c1841 10265 }
1d7c1841
GS
10266 }
10267
10268 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
10269 ++PL_sv_objcount;
10270
10271 return dstr;
d2d73c3e 10272 }
1d7c1841 10273
645c22ef
DM
10274/* duplicate a context */
10275
1d7c1841 10276PERL_CONTEXT *
a8fc9800 10277Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
1d7c1841
GS
10278{
10279 PERL_CONTEXT *ncxs;
10280
10281 if (!cxs)
10282 return (PERL_CONTEXT*)NULL;
10283
10284 /* look for it in the table first */
10285 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
10286 if (ncxs)
10287 return ncxs;
10288
10289 /* create anew and remember what it is */
a02a5408 10290 Newxz(ncxs, max + 1, PERL_CONTEXT);
1d7c1841
GS
10291 ptr_table_store(PL_ptr_table, cxs, ncxs);
10292
10293 while (ix >= 0) {
c445ea15
AL
10294 PERL_CONTEXT * const cx = &cxs[ix];
10295 PERL_CONTEXT * const ncx = &ncxs[ix];
1d7c1841
GS
10296 ncx->cx_type = cx->cx_type;
10297 if (CxTYPE(cx) == CXt_SUBST) {
10298 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
10299 }
10300 else {
10301 ncx->blk_oldsp = cx->blk_oldsp;
10302 ncx->blk_oldcop = cx->blk_oldcop;
1d7c1841
GS
10303 ncx->blk_oldmarksp = cx->blk_oldmarksp;
10304 ncx->blk_oldscopesp = cx->blk_oldscopesp;
10305 ncx->blk_oldpm = cx->blk_oldpm;
10306 ncx->blk_gimme = cx->blk_gimme;
10307 switch (CxTYPE(cx)) {
10308 case CXt_SUB:
10309 ncx->blk_sub.cv = (cx->blk_sub.olddepth == 0
d2d73c3e
AB
10310 ? cv_dup_inc(cx->blk_sub.cv, param)
10311 : cv_dup(cx->blk_sub.cv,param));
cc8d50a7 10312 ncx->blk_sub.argarray = (cx->blk_sub.hasargs
d2d73c3e 10313 ? av_dup_inc(cx->blk_sub.argarray, param)
7d49f689 10314 : NULL);
d2d73c3e 10315 ncx->blk_sub.savearray = av_dup_inc(cx->blk_sub.savearray, param);
1d7c1841 10316 ncx->blk_sub.olddepth = cx->blk_sub.olddepth;
cc8d50a7
NC
10317 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
10318 ncx->blk_sub.lval = cx->blk_sub.lval;
f39bc417 10319 ncx->blk_sub.retop = cx->blk_sub.retop;
d8d97e70
DM
10320 ncx->blk_sub.oldcomppad = (PAD*)ptr_table_fetch(PL_ptr_table,
10321 cx->blk_sub.oldcomppad);
1d7c1841
GS
10322 break;
10323 case CXt_EVAL:
10324 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
10325 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
b47cad08 10326 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv, param);
1d7c1841 10327 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
d2d73c3e 10328 ncx->blk_eval.cur_text = sv_dup(cx->blk_eval.cur_text, param);
f39bc417 10329 ncx->blk_eval.retop = cx->blk_eval.retop;
1d7c1841
GS
10330 break;
10331 case CXt_LOOP:
10332 ncx->blk_loop.label = cx->blk_loop.label;
10333 ncx->blk_loop.resetsp = cx->blk_loop.resetsp;
022eaa24 10334 ncx->blk_loop.my_op = cx->blk_loop.my_op;
1d7c1841
GS
10335 ncx->blk_loop.iterdata = (CxPADLOOP(cx)
10336 ? cx->blk_loop.iterdata
d2d73c3e 10337 : gv_dup((GV*)cx->blk_loop.iterdata, param));
f3548bdc
DM
10338 ncx->blk_loop.oldcomppad
10339 = (PAD*)ptr_table_fetch(PL_ptr_table,
10340 cx->blk_loop.oldcomppad);
d2d73c3e
AB
10341 ncx->blk_loop.itersave = sv_dup_inc(cx->blk_loop.itersave, param);
10342 ncx->blk_loop.iterlval = sv_dup_inc(cx->blk_loop.iterlval, param);
10343 ncx->blk_loop.iterary = av_dup_inc(cx->blk_loop.iterary, param);
1d7c1841
GS
10344 ncx->blk_loop.iterix = cx->blk_loop.iterix;
10345 ncx->blk_loop.itermax = cx->blk_loop.itermax;
10346 break;
10347 case CXt_FORMAT:
d2d73c3e
AB
10348 ncx->blk_sub.cv = cv_dup(cx->blk_sub.cv, param);
10349 ncx->blk_sub.gv = gv_dup(cx->blk_sub.gv, param);
10350 ncx->blk_sub.dfoutgv = gv_dup_inc(cx->blk_sub.dfoutgv, param);
cc8d50a7 10351 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
f39bc417 10352 ncx->blk_sub.retop = cx->blk_sub.retop;
1d7c1841
GS
10353 break;
10354 case CXt_BLOCK:
10355 case CXt_NULL:
10356 break;
10357 }
10358 }
10359 --ix;
10360 }
10361 return ncxs;
10362}
10363
645c22ef
DM
10364/* duplicate a stack info structure */
10365
1d7c1841 10366PERL_SI *
a8fc9800 10367Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
1d7c1841
GS
10368{
10369 PERL_SI *nsi;
10370
10371 if (!si)
10372 return (PERL_SI*)NULL;
10373
10374 /* look for it in the table first */
10375 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
10376 if (nsi)
10377 return nsi;
10378
10379 /* create anew and remember what it is */
a02a5408 10380 Newxz(nsi, 1, PERL_SI);
1d7c1841
GS
10381 ptr_table_store(PL_ptr_table, si, nsi);
10382
d2d73c3e 10383 nsi->si_stack = av_dup_inc(si->si_stack, param);
1d7c1841
GS
10384 nsi->si_cxix = si->si_cxix;
10385 nsi->si_cxmax = si->si_cxmax;
d2d73c3e 10386 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
1d7c1841 10387 nsi->si_type = si->si_type;
d2d73c3e
AB
10388 nsi->si_prev = si_dup(si->si_prev, param);
10389 nsi->si_next = si_dup(si->si_next, param);
1d7c1841
GS
10390 nsi->si_markoff = si->si_markoff;
10391
10392 return nsi;
10393}
10394
10395#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
10396#define TOPINT(ss,ix) ((ss)[ix].any_i32)
10397#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
10398#define TOPLONG(ss,ix) ((ss)[ix].any_long)
10399#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
10400#define TOPIV(ss,ix) ((ss)[ix].any_iv)
38d8b13e
HS
10401#define POPBOOL(ss,ix) ((ss)[--(ix)].any_bool)
10402#define TOPBOOL(ss,ix) ((ss)[ix].any_bool)
1d7c1841
GS
10403#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
10404#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
10405#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
10406#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
10407#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
10408#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
10409
10410/* XXXXX todo */
10411#define pv_dup_inc(p) SAVEPV(p)
10412#define pv_dup(p) SAVEPV(p)
10413#define svp_dup_inc(p,pp) any_dup(p,pp)
10414
645c22ef
DM
10415/* map any object to the new equivent - either something in the
10416 * ptr table, or something in the interpreter structure
10417 */
10418
1d7c1841 10419void *
53c1dcc0 10420Perl_any_dup(pTHX_ void *v, const PerlInterpreter *proto_perl)
1d7c1841
GS
10421{
10422 void *ret;
10423
10424 if (!v)
10425 return (void*)NULL;
10426
10427 /* look for it in the table first */
10428 ret = ptr_table_fetch(PL_ptr_table, v);
10429 if (ret)
10430 return ret;
10431
10432 /* see if it is part of the interpreter structure */
10433 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
acfe0abc 10434 ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
05ec9bb3 10435 else {
1d7c1841 10436 ret = v;
05ec9bb3 10437 }
1d7c1841
GS
10438
10439 return ret;
10440}
10441
645c22ef
DM
10442/* duplicate the save stack */
10443
1d7c1841 10444ANY *
a8fc9800 10445Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
1d7c1841 10446{
53d44271 10447 dVAR;
53c1dcc0
AL
10448 ANY * const ss = proto_perl->Tsavestack;
10449 const I32 max = proto_perl->Tsavestack_max;
10450 I32 ix = proto_perl->Tsavestack_ix;
1d7c1841
GS
10451 ANY *nss;
10452 SV *sv;
10453 GV *gv;
10454 AV *av;
10455 HV *hv;
10456 void* ptr;
10457 int intval;
10458 long longval;
10459 GP *gp;
10460 IV iv;
b24356f5 10461 I32 i;
c4e33207 10462 char *c = NULL;
1d7c1841 10463 void (*dptr) (void*);
acfe0abc 10464 void (*dxptr) (pTHX_ void*);
1d7c1841 10465
a02a5408 10466 Newxz(nss, max, ANY);
1d7c1841
GS
10467
10468 while (ix > 0) {
b24356f5
NC
10469 const I32 type = POPINT(ss,ix);
10470 TOPINT(nss,ix) = type;
10471 switch (type) {
3e07292d
NC
10472 case SAVEt_HELEM: /* hash element */
10473 sv = (SV*)POPPTR(ss,ix);
10474 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
10475 /* fall through */
1d7c1841 10476 case SAVEt_ITEM: /* normal string */
a41cc44e 10477 case SAVEt_SV: /* scalar reference */
1d7c1841 10478 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10479 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
3e07292d
NC
10480 /* fall through */
10481 case SAVEt_FREESV:
10482 case SAVEt_MORTALIZESV:
1d7c1841 10483 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10484 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10485 break;
05ec9bb3
NIS
10486 case SAVEt_SHARED_PVREF: /* char* in shared space */
10487 c = (char*)POPPTR(ss,ix);
10488 TOPPTR(nss,ix) = savesharedpv(c);
10489 ptr = POPPTR(ss,ix);
10490 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10491 break;
1d7c1841
GS
10492 case SAVEt_GENERIC_SVREF: /* generic sv */
10493 case SAVEt_SVREF: /* scalar reference */
10494 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10495 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10496 ptr = POPPTR(ss,ix);
10497 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
10498 break;
a41cc44e 10499 case SAVEt_HV: /* hash reference */
1d7c1841 10500 case SAVEt_AV: /* array reference */
11b79775 10501 sv = (SV*) POPPTR(ss,ix);
337d28f5 10502 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
3e07292d
NC
10503 /* fall through */
10504 case SAVEt_COMPPAD:
10505 case SAVEt_NSTAB:
667e2948 10506 sv = (SV*) POPPTR(ss,ix);
3e07292d 10507 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
10508 break;
10509 case SAVEt_INT: /* int reference */
10510 ptr = POPPTR(ss,ix);
10511 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10512 intval = (int)POPINT(ss,ix);
10513 TOPINT(nss,ix) = intval;
10514 break;
10515 case SAVEt_LONG: /* long reference */
10516 ptr = POPPTR(ss,ix);
10517 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
3e07292d
NC
10518 /* fall through */
10519 case SAVEt_CLEARSV:
1d7c1841
GS
10520 longval = (long)POPLONG(ss,ix);
10521 TOPLONG(nss,ix) = longval;
10522 break;
10523 case SAVEt_I32: /* I32 reference */
10524 case SAVEt_I16: /* I16 reference */
10525 case SAVEt_I8: /* I8 reference */
88effcc9 10526 case SAVEt_COP_ARYBASE: /* call CopARYBASE_set */
1d7c1841
GS
10527 ptr = POPPTR(ss,ix);
10528 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
1ccabee8 10529 i = POPINT(ss,ix);
1d7c1841
GS
10530 TOPINT(nss,ix) = i;
10531 break;
10532 case SAVEt_IV: /* IV reference */
10533 ptr = POPPTR(ss,ix);
10534 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10535 iv = POPIV(ss,ix);
10536 TOPIV(nss,ix) = iv;
10537 break;
a41cc44e
NC
10538 case SAVEt_HPTR: /* HV* reference */
10539 case SAVEt_APTR: /* AV* reference */
1d7c1841
GS
10540 case SAVEt_SPTR: /* SV* reference */
10541 ptr = POPPTR(ss,ix);
10542 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10543 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10544 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
10545 break;
10546 case SAVEt_VPTR: /* random* reference */
10547 ptr = POPPTR(ss,ix);
10548 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10549 ptr = POPPTR(ss,ix);
10550 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10551 break;
b03d03b0 10552 case SAVEt_GENERIC_PVREF: /* generic char* */
1d7c1841
GS
10553 case SAVEt_PPTR: /* char* reference */
10554 ptr = POPPTR(ss,ix);
10555 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10556 c = (char*)POPPTR(ss,ix);
10557 TOPPTR(nss,ix) = pv_dup(c);
10558 break;
1d7c1841
GS
10559 case SAVEt_GP: /* scalar reference */
10560 gp = (GP*)POPPTR(ss,ix);
d2d73c3e 10561 TOPPTR(nss,ix) = gp = gp_dup(gp, param);
1d7c1841
GS
10562 (void)GpREFCNT_inc(gp);
10563 gv = (GV*)POPPTR(ss,ix);
2ed3c8fc 10564 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841 10565 break;
1d7c1841
GS
10566 case SAVEt_FREEOP:
10567 ptr = POPPTR(ss,ix);
10568 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
10569 /* these are assumed to be refcounted properly */
53c1dcc0 10570 OP *o;
1d7c1841
GS
10571 switch (((OP*)ptr)->op_type) {
10572 case OP_LEAVESUB:
10573 case OP_LEAVESUBLV:
10574 case OP_LEAVEEVAL:
10575 case OP_LEAVE:
10576 case OP_SCOPE:
10577 case OP_LEAVEWRITE:
e977893f
GS
10578 TOPPTR(nss,ix) = ptr;
10579 o = (OP*)ptr;
d3c72c2a 10580 OP_REFCNT_LOCK;
594cd643 10581 (void) OpREFCNT_inc(o);
d3c72c2a 10582 OP_REFCNT_UNLOCK;
1d7c1841
GS
10583 break;
10584 default:
5f66b61c 10585 TOPPTR(nss,ix) = NULL;
1d7c1841
GS
10586 break;
10587 }
10588 }
10589 else
5f66b61c 10590 TOPPTR(nss,ix) = NULL;
1d7c1841
GS
10591 break;
10592 case SAVEt_FREEPV:
10593 c = (char*)POPPTR(ss,ix);
10594 TOPPTR(nss,ix) = pv_dup_inc(c);
10595 break;
1d7c1841
GS
10596 case SAVEt_DELETE:
10597 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10598 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
10599 c = (char*)POPPTR(ss,ix);
10600 TOPPTR(nss,ix) = pv_dup_inc(c);
3e07292d
NC
10601 /* fall through */
10602 case SAVEt_STACK_POS: /* Position on Perl stack */
1d7c1841
GS
10603 i = POPINT(ss,ix);
10604 TOPINT(nss,ix) = i;
10605 break;
10606 case SAVEt_DESTRUCTOR:
10607 ptr = POPPTR(ss,ix);
10608 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
10609 dptr = POPDPTR(ss,ix);
8141890a
JH
10610 TOPDPTR(nss,ix) = DPTR2FPTR(void (*)(void*),
10611 any_dup(FPTR2DPTR(void *, dptr),
10612 proto_perl));
1d7c1841
GS
10613 break;
10614 case SAVEt_DESTRUCTOR_X:
10615 ptr = POPPTR(ss,ix);
10616 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
10617 dxptr = POPDXPTR(ss,ix);
8141890a
JH
10618 TOPDXPTR(nss,ix) = DPTR2FPTR(void (*)(pTHX_ void*),
10619 any_dup(FPTR2DPTR(void *, dxptr),
10620 proto_perl));
1d7c1841
GS
10621 break;
10622 case SAVEt_REGCONTEXT:
10623 case SAVEt_ALLOC:
10624 i = POPINT(ss,ix);
10625 TOPINT(nss,ix) = i;
10626 ix -= i;
10627 break;
1d7c1841
GS
10628 case SAVEt_AELEM: /* array element */
10629 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10630 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10631 i = POPINT(ss,ix);
10632 TOPINT(nss,ix) = i;
10633 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10634 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841 10635 break;
1d7c1841
GS
10636 case SAVEt_OP:
10637 ptr = POPPTR(ss,ix);
10638 TOPPTR(nss,ix) = ptr;
10639 break;
10640 case SAVEt_HINTS:
10641 i = POPINT(ss,ix);
10642 TOPINT(nss,ix) = i;
b3ca2e83 10643 ptr = POPPTR(ss,ix);
080ac856 10644 if (ptr) {
7b6dd8c3 10645 HINTS_REFCNT_LOCK;
080ac856 10646 ((struct refcounted_he *)ptr)->refcounted_he_refcnt++;
7b6dd8c3
NC
10647 HINTS_REFCNT_UNLOCK;
10648 }
cbb1fbea 10649 TOPPTR(nss,ix) = ptr;
a8f8b6a7
NC
10650 if (i & HINT_LOCALIZE_HH) {
10651 hv = (HV*)POPPTR(ss,ix);
10652 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
10653 }
1d7c1841 10654 break;
c3564e5c
GS
10655 case SAVEt_PADSV:
10656 longval = (long)POPLONG(ss,ix);
10657 TOPLONG(nss,ix) = longval;
10658 ptr = POPPTR(ss,ix);
10659 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10660 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10661 TOPPTR(nss,ix) = sv_dup(sv, param);
c3564e5c 10662 break;
a1bb4754 10663 case SAVEt_BOOL:
38d8b13e 10664 ptr = POPPTR(ss,ix);
b9609c01 10665 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
38d8b13e 10666 longval = (long)POPBOOL(ss,ix);
b9609c01 10667 TOPBOOL(nss,ix) = (bool)longval;
a1bb4754 10668 break;
8bd2680e
MHM
10669 case SAVEt_SET_SVFLAGS:
10670 i = POPINT(ss,ix);
10671 TOPINT(nss,ix) = i;
10672 i = POPINT(ss,ix);
10673 TOPINT(nss,ix) = i;
10674 sv = (SV*)POPPTR(ss,ix);
10675 TOPPTR(nss,ix) = sv_dup(sv, param);
10676 break;
5bfb7d0e
NC
10677 case SAVEt_RE_STATE:
10678 {
10679 const struct re_save_state *const old_state
10680 = (struct re_save_state *)
10681 (ss + ix - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
10682 struct re_save_state *const new_state
10683 = (struct re_save_state *)
10684 (nss + ix - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
10685
10686 Copy(old_state, new_state, 1, struct re_save_state);
10687 ix -= SAVESTACK_ALLOC_FOR_RE_SAVE_STATE;
10688
10689 new_state->re_state_bostr
10690 = pv_dup(old_state->re_state_bostr);
10691 new_state->re_state_reginput
10692 = pv_dup(old_state->re_state_reginput);
5bfb7d0e
NC
10693 new_state->re_state_regeol
10694 = pv_dup(old_state->re_state_regeol);
f0ab9afb
NC
10695 new_state->re_state_regoffs
10696 = (regexp_paren_pair*)
10697 any_dup(old_state->re_state_regoffs, proto_perl);
5bfb7d0e 10698 new_state->re_state_reglastparen
11b79775
DD
10699 = (U32*) any_dup(old_state->re_state_reglastparen,
10700 proto_perl);
5bfb7d0e 10701 new_state->re_state_reglastcloseparen
11b79775 10702 = (U32*)any_dup(old_state->re_state_reglastcloseparen,
5bfb7d0e 10703 proto_perl);
5bfb7d0e
NC
10704 /* XXX This just has to be broken. The old save_re_context
10705 code did SAVEGENERICPV(PL_reg_start_tmp);
10706 PL_reg_start_tmp is char **.
10707 Look above to what the dup code does for
10708 SAVEt_GENERIC_PVREF
10709 It can never have worked.
10710 So this is merely a faithful copy of the exiting bug: */
10711 new_state->re_state_reg_start_tmp
10712 = (char **) pv_dup((char *)
10713 old_state->re_state_reg_start_tmp);
10714 /* I assume that it only ever "worked" because no-one called
10715 (pseudo)fork while the regexp engine had re-entered itself.
10716 */
5bfb7d0e
NC
10717#ifdef PERL_OLD_COPY_ON_WRITE
10718 new_state->re_state_nrs
10719 = sv_dup(old_state->re_state_nrs, param);
10720#endif
10721 new_state->re_state_reg_magic
11b79775
DD
10722 = (MAGIC*) any_dup(old_state->re_state_reg_magic,
10723 proto_perl);
5bfb7d0e 10724 new_state->re_state_reg_oldcurpm
11b79775
DD
10725 = (PMOP*) any_dup(old_state->re_state_reg_oldcurpm,
10726 proto_perl);
5bfb7d0e 10727 new_state->re_state_reg_curpm
11b79775
DD
10728 = (PMOP*) any_dup(old_state->re_state_reg_curpm,
10729 proto_perl);
5bfb7d0e
NC
10730 new_state->re_state_reg_oldsaved
10731 = pv_dup(old_state->re_state_reg_oldsaved);
10732 new_state->re_state_reg_poscache
10733 = pv_dup(old_state->re_state_reg_poscache);
5bfb7d0e
NC
10734 new_state->re_state_reg_starttry
10735 = pv_dup(old_state->re_state_reg_starttry);
5bfb7d0e
NC
10736 break;
10737 }
68da3b2f
NC
10738 case SAVEt_COMPILE_WARNINGS:
10739 ptr = POPPTR(ss,ix);
10740 TOPPTR(nss,ix) = DUP_WARNINGS((STRLEN*)ptr);
7b6dd8c3 10741 break;
7c197c94
DM
10742 case SAVEt_PARSER:
10743 ptr = POPPTR(ss,ix);
456084a8 10744 TOPPTR(nss,ix) = parser_dup((const yy_parser*)ptr, param);
7c197c94 10745 break;
1d7c1841 10746 default:
147bc374
NC
10747 Perl_croak(aTHX_
10748 "panic: ss_dup inconsistency (%"IVdf")", (IV) type);
1d7c1841
GS
10749 }
10750 }
10751
bd81e77b
NC
10752 return nss;
10753}
10754
10755
10756/* if sv is a stash, call $class->CLONE_SKIP(), and set the SVphv_CLONEABLE
10757 * flag to the result. This is done for each stash before cloning starts,
10758 * so we know which stashes want their objects cloned */
10759
10760static void
10761do_mark_cloneable_stash(pTHX_ SV *sv)
10762{
10763 const HEK * const hvname = HvNAME_HEK((HV*)sv);
10764 if (hvname) {
10765 GV* const cloner = gv_fetchmethod_autoload((HV*)sv, "CLONE_SKIP", 0);
10766 SvFLAGS(sv) |= SVphv_CLONEABLE; /* clone objects by default */
10767 if (cloner && GvCV(cloner)) {
10768 dSP;
10769 UV status;
10770
10771 ENTER;
10772 SAVETMPS;
10773 PUSHMARK(SP);
10774 XPUSHs(sv_2mortal(newSVhek(hvname)));
10775 PUTBACK;
10776 call_sv((SV*)GvCV(cloner), G_SCALAR);
10777 SPAGAIN;
10778 status = POPu;
10779 PUTBACK;
10780 FREETMPS;
10781 LEAVE;
10782 if (status)
10783 SvFLAGS(sv) &= ~SVphv_CLONEABLE;
10784 }
10785 }
10786}
10787
10788
10789
10790/*
10791=for apidoc perl_clone
10792
10793Create and return a new interpreter by cloning the current one.
10794
10795perl_clone takes these flags as parameters:
10796
10797CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
10798without it we only clone the data and zero the stacks,
10799with it we copy the stacks and the new perl interpreter is
10800ready to run at the exact same point as the previous one.
10801The pseudo-fork code uses COPY_STACKS while the
878090d5 10802threads->create doesn't.
bd81e77b
NC
10803
10804CLONEf_KEEP_PTR_TABLE
10805perl_clone keeps a ptr_table with the pointer of the old
10806variable as a key and the new variable as a value,
10807this allows it to check if something has been cloned and not
10808clone it again but rather just use the value and increase the
10809refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
10810the ptr_table using the function
10811C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
10812reason to keep it around is if you want to dup some of your own
10813variable who are outside the graph perl scans, example of this
10814code is in threads.xs create
10815
10816CLONEf_CLONE_HOST
10817This is a win32 thing, it is ignored on unix, it tells perls
10818win32host code (which is c++) to clone itself, this is needed on
10819win32 if you want to run two threads at the same time,
10820if you just want to do some stuff in a separate perl interpreter
10821and then throw it away and return to the original one,
10822you don't need to do anything.
10823
10824=cut
10825*/
10826
10827/* XXX the above needs expanding by someone who actually understands it ! */
10828EXTERN_C PerlInterpreter *
10829perl_clone_host(PerlInterpreter* proto_perl, UV flags);
10830
10831PerlInterpreter *
10832perl_clone(PerlInterpreter *proto_perl, UV flags)
10833{
10834 dVAR;
10835#ifdef PERL_IMPLICIT_SYS
10836
10837 /* perlhost.h so we need to call into it
10838 to clone the host, CPerlHost should have a c interface, sky */
10839
10840 if (flags & CLONEf_CLONE_HOST) {
10841 return perl_clone_host(proto_perl,flags);
10842 }
10843 return perl_clone_using(proto_perl, flags,
10844 proto_perl->IMem,
10845 proto_perl->IMemShared,
10846 proto_perl->IMemParse,
10847 proto_perl->IEnv,
10848 proto_perl->IStdIO,
10849 proto_perl->ILIO,
10850 proto_perl->IDir,
10851 proto_perl->ISock,
10852 proto_perl->IProc);
10853}
10854
10855PerlInterpreter *
10856perl_clone_using(PerlInterpreter *proto_perl, UV flags,
10857 struct IPerlMem* ipM, struct IPerlMem* ipMS,
10858 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
10859 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
10860 struct IPerlDir* ipD, struct IPerlSock* ipS,
10861 struct IPerlProc* ipP)
10862{
10863 /* XXX many of the string copies here can be optimized if they're
10864 * constants; they need to be allocated as common memory and just
10865 * their pointers copied. */
10866
10867 IV i;
10868 CLONE_PARAMS clone_params;
5f66b61c 10869 CLONE_PARAMS* const param = &clone_params;
bd81e77b 10870
5f66b61c 10871 PerlInterpreter * const my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
bd81e77b
NC
10872 /* for each stash, determine whether its objects should be cloned */
10873 S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
10874 PERL_SET_THX(my_perl);
10875
10876# ifdef DEBUGGING
7e337ee0 10877 PoisonNew(my_perl, 1, PerlInterpreter);
5f66b61c
AL
10878 PL_op = NULL;
10879 PL_curcop = NULL;
bd81e77b
NC
10880 PL_markstack = 0;
10881 PL_scopestack = 0;
10882 PL_savestack = 0;
10883 PL_savestack_ix = 0;
10884 PL_savestack_max = -1;
10885 PL_sig_pending = 0;
10886 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
10887# else /* !DEBUGGING */
10888 Zero(my_perl, 1, PerlInterpreter);
10889# endif /* DEBUGGING */
10890
10891 /* host pointers */
10892 PL_Mem = ipM;
10893 PL_MemShared = ipMS;
10894 PL_MemParse = ipMP;
10895 PL_Env = ipE;
10896 PL_StdIO = ipStd;
10897 PL_LIO = ipLIO;
10898 PL_Dir = ipD;
10899 PL_Sock = ipS;
10900 PL_Proc = ipP;
10901#else /* !PERL_IMPLICIT_SYS */
10902 IV i;
10903 CLONE_PARAMS clone_params;
10904 CLONE_PARAMS* param = &clone_params;
5f66b61c 10905 PerlInterpreter * const my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
bd81e77b
NC
10906 /* for each stash, determine whether its objects should be cloned */
10907 S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
10908 PERL_SET_THX(my_perl);
10909
10910# ifdef DEBUGGING
7e337ee0 10911 PoisonNew(my_perl, 1, PerlInterpreter);
5f66b61c
AL
10912 PL_op = NULL;
10913 PL_curcop = NULL;
bd81e77b
NC
10914 PL_markstack = 0;
10915 PL_scopestack = 0;
10916 PL_savestack = 0;
10917 PL_savestack_ix = 0;
10918 PL_savestack_max = -1;
10919 PL_sig_pending = 0;
10920 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
10921# else /* !DEBUGGING */
10922 Zero(my_perl, 1, PerlInterpreter);
10923# endif /* DEBUGGING */
10924#endif /* PERL_IMPLICIT_SYS */
10925 param->flags = flags;
10926 param->proto_perl = proto_perl;
10927
7cb608b5
NC
10928 INIT_TRACK_MEMPOOL(my_perl->Imemory_debug_header, my_perl);
10929
fdda85ca 10930 PL_body_arenas = NULL;
bd81e77b
NC
10931 Zero(&PL_body_roots, 1, PL_body_roots);
10932
10933 PL_nice_chunk = NULL;
10934 PL_nice_chunk_size = 0;
10935 PL_sv_count = 0;
10936 PL_sv_objcount = 0;
a0714e2c
SS
10937 PL_sv_root = NULL;
10938 PL_sv_arenaroot = NULL;
bd81e77b
NC
10939
10940 PL_debug = proto_perl->Idebug;
10941
10942 PL_hash_seed = proto_perl->Ihash_seed;
10943 PL_rehash_seed = proto_perl->Irehash_seed;
10944
10945#ifdef USE_REENTRANT_API
10946 /* XXX: things like -Dm will segfault here in perlio, but doing
10947 * PERL_SET_CONTEXT(proto_perl);
10948 * breaks too many other things
10949 */
10950 Perl_reentrant_init(aTHX);
10951#endif
10952
10953 /* create SV map for pointer relocation */
10954 PL_ptr_table = ptr_table_new();
10955
10956 /* initialize these special pointers as early as possible */
10957 SvANY(&PL_sv_undef) = NULL;
10958 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
10959 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
10960 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
10961
10962 SvANY(&PL_sv_no) = new_XPVNV();
10963 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
10964 SvFLAGS(&PL_sv_no) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
10965 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
bb7a0f54 10966 SvPV_set(&PL_sv_no, savepvn(PL_No, 0));
bd81e77b
NC
10967 SvCUR_set(&PL_sv_no, 0);
10968 SvLEN_set(&PL_sv_no, 1);
10969 SvIV_set(&PL_sv_no, 0);
10970 SvNV_set(&PL_sv_no, 0);
10971 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
10972
10973 SvANY(&PL_sv_yes) = new_XPVNV();
10974 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
10975 SvFLAGS(&PL_sv_yes) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
10976 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
bb7a0f54 10977 SvPV_set(&PL_sv_yes, savepvn(PL_Yes, 1));
bd81e77b
NC
10978 SvCUR_set(&PL_sv_yes, 1);
10979 SvLEN_set(&PL_sv_yes, 2);
10980 SvIV_set(&PL_sv_yes, 1);
10981 SvNV_set(&PL_sv_yes, 1);
10982 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
10983
10984 /* create (a non-shared!) shared string table */
10985 PL_strtab = newHV();
10986 HvSHAREKEYS_off(PL_strtab);
10987 hv_ksplit(PL_strtab, HvTOTALKEYS(proto_perl->Istrtab));
10988 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
10989
10990 PL_compiling = proto_perl->Icompiling;
10991
10992 /* These two PVs will be free'd special way so must set them same way op.c does */
10993 PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
10994 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
10995
10996 PL_compiling.cop_file = savesharedpv(PL_compiling.cop_file);
10997 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
10998
10999 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
72dc9ed5 11000 PL_compiling.cop_warnings = DUP_WARNINGS(PL_compiling.cop_warnings);
c28fe1ec 11001 if (PL_compiling.cop_hints_hash) {
cbb1fbea 11002 HINTS_REFCNT_LOCK;
c28fe1ec 11003 PL_compiling.cop_hints_hash->refcounted_he_refcnt++;
cbb1fbea
NC
11004 HINTS_REFCNT_UNLOCK;
11005 }
bd81e77b 11006 PL_curcop = (COP*)any_dup(proto_perl->Tcurcop, proto_perl);
5892a4d4
NC
11007#ifdef PERL_DEBUG_READONLY_OPS
11008 PL_slabs = NULL;
11009 PL_slab_count = 0;
11010#endif
bd81e77b
NC
11011
11012 /* pseudo environmental stuff */
11013 PL_origargc = proto_perl->Iorigargc;
11014 PL_origargv = proto_perl->Iorigargv;
11015
11016 param->stashes = newAV(); /* Setup array of objects to call clone on */
11017
11018 /* Set tainting stuff before PerlIO_debug can possibly get called */
11019 PL_tainting = proto_perl->Itainting;
11020 PL_taint_warn = proto_perl->Itaint_warn;
11021
11022#ifdef PERLIO_LAYERS
11023 /* Clone PerlIO tables as soon as we can handle general xx_dup() */
11024 PerlIO_clone(aTHX_ proto_perl, param);
11025#endif
11026
11027 PL_envgv = gv_dup(proto_perl->Ienvgv, param);
11028 PL_incgv = gv_dup(proto_perl->Iincgv, param);
11029 PL_hintgv = gv_dup(proto_perl->Ihintgv, param);
11030 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
11031 PL_diehook = sv_dup_inc(proto_perl->Idiehook, param);
11032 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param);
11033
11034 /* switches */
11035 PL_minus_c = proto_perl->Iminus_c;
11036 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel, param);
11037 PL_localpatches = proto_perl->Ilocalpatches;
11038 PL_splitstr = proto_perl->Isplitstr;
11039 PL_preprocess = proto_perl->Ipreprocess;
11040 PL_minus_n = proto_perl->Iminus_n;
11041 PL_minus_p = proto_perl->Iminus_p;
11042 PL_minus_l = proto_perl->Iminus_l;
11043 PL_minus_a = proto_perl->Iminus_a;
bc9b29db 11044 PL_minus_E = proto_perl->Iminus_E;
bd81e77b
NC
11045 PL_minus_F = proto_perl->Iminus_F;
11046 PL_doswitches = proto_perl->Idoswitches;
11047 PL_dowarn = proto_perl->Idowarn;
11048 PL_doextract = proto_perl->Idoextract;
11049 PL_sawampersand = proto_perl->Isawampersand;
11050 PL_unsafe = proto_perl->Iunsafe;
11051 PL_inplace = SAVEPV(proto_perl->Iinplace);
11052 PL_e_script = sv_dup_inc(proto_perl->Ie_script, param);
11053 PL_perldb = proto_perl->Iperldb;
11054 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
11055 PL_exit_flags = proto_perl->Iexit_flags;
11056
11057 /* magical thingies */
11058 /* XXX time(&PL_basetime) when asked for? */
11059 PL_basetime = proto_perl->Ibasetime;
11060 PL_formfeed = sv_dup(proto_perl->Iformfeed, param);
11061
11062 PL_maxsysfd = proto_perl->Imaxsysfd;
bd81e77b
NC
11063 PL_statusvalue = proto_perl->Istatusvalue;
11064#ifdef VMS
11065 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
11066#else
11067 PL_statusvalue_posix = proto_perl->Istatusvalue_posix;
11068#endif
11069 PL_encoding = sv_dup(proto_perl->Iencoding, param);
11070
11071 sv_setpvn(PERL_DEBUG_PAD(0), "", 0); /* For regex debugging. */
11072 sv_setpvn(PERL_DEBUG_PAD(1), "", 0); /* ext/re needs these */
11073 sv_setpvn(PERL_DEBUG_PAD(2), "", 0); /* even without DEBUGGING. */
11074
84da74a7 11075
f9f4320a 11076 /* RE engine related */
84da74a7
YO
11077 Zero(&PL_reg_state, 1, struct re_save_state);
11078 PL_reginterp_cnt = 0;
11079 PL_regmatch_slab = NULL;
11080
bd81e77b
NC
11081 /* Clone the regex array */
11082 PL_regex_padav = newAV();
11083 {
11084 const I32 len = av_len((AV*)proto_perl->Iregex_padav);
7a5b473e 11085 SV* const * const regexen = AvARRAY((AV*)proto_perl->Iregex_padav);
bd81e77b 11086 IV i;
7f466ec7 11087 av_push(PL_regex_padav, sv_dup_inc_NN(regexen[0],param));
bd81e77b 11088 for(i = 1; i <= len; i++) {
7a5b473e
AL
11089 const SV * const regex = regexen[i];
11090 SV * const sv =
11091 SvREPADTMP(regex)
11092 ? sv_dup_inc(regex, param)
11093 : SvREFCNT_inc(
f8149455 11094 newSViv(PTR2IV(CALLREGDUPE(
7a5b473e
AL
11095 INT2PTR(REGEXP *, SvIVX(regex)), param))))
11096 ;
60790534
DM
11097 if (SvFLAGS(regex) & SVf_BREAK)
11098 SvFLAGS(sv) |= SVf_BREAK; /* unrefcnted PL_curpm */
7a5b473e 11099 av_push(PL_regex_padav, sv);
bd81e77b
NC
11100 }
11101 }
11102 PL_regex_pad = AvARRAY(PL_regex_padav);
11103
11104 /* shortcuts to various I/O objects */
11105 PL_stdingv = gv_dup(proto_perl->Istdingv, param);
11106 PL_stderrgv = gv_dup(proto_perl->Istderrgv, param);
11107 PL_defgv = gv_dup(proto_perl->Idefgv, param);
11108 PL_argvgv = gv_dup(proto_perl->Iargvgv, param);
11109 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv, param);
11110 PL_argvout_stack = av_dup_inc(proto_perl->Iargvout_stack, param);
1d7c1841 11111
bd81e77b
NC
11112 /* shortcuts to regexp stuff */
11113 PL_replgv = gv_dup(proto_perl->Ireplgv, param);
9660f481 11114
bd81e77b
NC
11115 /* shortcuts to misc objects */
11116 PL_errgv = gv_dup(proto_perl->Ierrgv, param);
9660f481 11117
bd81e77b
NC
11118 /* shortcuts to debugging objects */
11119 PL_DBgv = gv_dup(proto_perl->IDBgv, param);
11120 PL_DBline = gv_dup(proto_perl->IDBline, param);
11121 PL_DBsub = gv_dup(proto_perl->IDBsub, param);
11122 PL_DBsingle = sv_dup(proto_perl->IDBsingle, param);
11123 PL_DBtrace = sv_dup(proto_perl->IDBtrace, param);
11124 PL_DBsignal = sv_dup(proto_perl->IDBsignal, param);
11125 PL_DBassertion = sv_dup(proto_perl->IDBassertion, param);
11126 PL_lineary = av_dup(proto_perl->Ilineary, param);
11127 PL_dbargs = av_dup(proto_perl->Idbargs, param);
9660f481 11128
bd81e77b
NC
11129 /* symbol tables */
11130 PL_defstash = hv_dup_inc(proto_perl->Tdefstash, param);
11131 PL_curstash = hv_dup(proto_perl->Tcurstash, param);
11132 PL_debstash = hv_dup(proto_perl->Idebstash, param);
11133 PL_globalstash = hv_dup(proto_perl->Iglobalstash, param);
11134 PL_curstname = sv_dup_inc(proto_perl->Icurstname, param);
11135
11136 PL_beginav = av_dup_inc(proto_perl->Ibeginav, param);
11137 PL_beginav_save = av_dup_inc(proto_perl->Ibeginav_save, param);
11138 PL_checkav_save = av_dup_inc(proto_perl->Icheckav_save, param);
3c10abe3
AG
11139 PL_unitcheckav = av_dup_inc(proto_perl->Iunitcheckav, param);
11140 PL_unitcheckav_save = av_dup_inc(proto_perl->Iunitcheckav_save, param);
bd81e77b
NC
11141 PL_endav = av_dup_inc(proto_perl->Iendav, param);
11142 PL_checkav = av_dup_inc(proto_perl->Icheckav, param);
11143 PL_initav = av_dup_inc(proto_perl->Iinitav, param);
11144
11145 PL_sub_generation = proto_perl->Isub_generation;
dd69841b 11146 PL_isarev = hv_dup_inc(proto_perl->Iisarev, param);
2e6d7a11 11147 PL_delayedisa = hv_dup_inc(proto_perl->Tdelayedisa, param);
bd81e77b
NC
11148
11149 /* funky return mechanisms */
11150 PL_forkprocess = proto_perl->Iforkprocess;
11151
11152 /* subprocess state */
11153 PL_fdpid = av_dup_inc(proto_perl->Ifdpid, param);
11154
11155 /* internal state */
11156 PL_maxo = proto_perl->Imaxo;
11157 if (proto_perl->Iop_mask)
11158 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
11159 else
bd61b366 11160 PL_op_mask = NULL;
bd81e77b
NC
11161 /* PL_asserting = proto_perl->Iasserting; */
11162
11163 /* current interpreter roots */
11164 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv, param);
d3c72c2a 11165 OP_REFCNT_LOCK;
bd81e77b 11166 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
d3c72c2a 11167 OP_REFCNT_UNLOCK;
bd81e77b
NC
11168 PL_main_start = proto_perl->Imain_start;
11169 PL_eval_root = proto_perl->Ieval_root;
11170 PL_eval_start = proto_perl->Ieval_start;
11171
11172 /* runtime control stuff */
11173 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
bd81e77b
NC
11174
11175 PL_filemode = proto_perl->Ifilemode;
11176 PL_lastfd = proto_perl->Ilastfd;
11177 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
11178 PL_Argv = NULL;
bd61b366 11179 PL_Cmd = NULL;
bd81e77b 11180 PL_gensym = proto_perl->Igensym;
bd81e77b
NC
11181 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav, param);
11182 PL_laststatval = proto_perl->Ilaststatval;
11183 PL_laststype = proto_perl->Ilaststype;
a0714e2c 11184 PL_mess_sv = NULL;
bd81e77b
NC
11185
11186 PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv, param);
11187
11188 /* interpreter atexit processing */
11189 PL_exitlistlen = proto_perl->Iexitlistlen;
11190 if (PL_exitlistlen) {
11191 Newx(PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11192 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
9660f481 11193 }
bd81e77b
NC
11194 else
11195 PL_exitlist = (PerlExitListEntry*)NULL;
f16dd614
DM
11196
11197 PL_my_cxt_size = proto_perl->Imy_cxt_size;
4c901e72 11198 if (PL_my_cxt_size) {
f16dd614
DM
11199 Newx(PL_my_cxt_list, PL_my_cxt_size, void *);
11200 Copy(proto_perl->Imy_cxt_list, PL_my_cxt_list, PL_my_cxt_size, void *);
53d44271 11201#ifdef PERL_GLOBAL_STRUCT_PRIVATE
bae1192d 11202 Newx(PL_my_cxt_keys, PL_my_cxt_size, const char *);
53d44271
JH
11203 Copy(proto_perl->Imy_cxt_keys, PL_my_cxt_keys, PL_my_cxt_size, char *);
11204#endif
f16dd614 11205 }
53d44271 11206 else {
f16dd614 11207 PL_my_cxt_list = (void**)NULL;
53d44271 11208#ifdef PERL_GLOBAL_STRUCT_PRIVATE
bae1192d 11209 PL_my_cxt_keys = (const char**)NULL;
53d44271
JH
11210#endif
11211 }
bd81e77b
NC
11212 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal, param);
11213 PL_custom_op_names = hv_dup_inc(proto_perl->Icustom_op_names,param);
11214 PL_custom_op_descs = hv_dup_inc(proto_perl->Icustom_op_descs,param);
11215
11216 PL_profiledata = NULL;
11217 PL_rsfp = fp_dup(proto_perl->Irsfp, '<', param);
11218 /* PL_rsfp_filters entries have fake IoDIRP() */
11219 PL_rsfp_filters = av_dup_inc(proto_perl->Irsfp_filters, param);
9660f481 11220
bd81e77b 11221 PL_compcv = cv_dup(proto_perl->Icompcv, param);
9660f481 11222
bd81e77b 11223 PAD_CLONE_VARS(proto_perl, param);
9660f481 11224
bd81e77b
NC
11225#ifdef HAVE_INTERP_INTERN
11226 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
11227#endif
645c22ef 11228
bd81e77b
NC
11229 /* more statics moved here */
11230 PL_generation = proto_perl->Igeneration;
11231 PL_DBcv = cv_dup(proto_perl->IDBcv, param);
645c22ef 11232
bd81e77b
NC
11233 PL_in_clean_objs = proto_perl->Iin_clean_objs;
11234 PL_in_clean_all = proto_perl->Iin_clean_all;
6a78b4db 11235
bd81e77b
NC
11236 PL_uid = proto_perl->Iuid;
11237 PL_euid = proto_perl->Ieuid;
11238 PL_gid = proto_perl->Igid;
11239 PL_egid = proto_perl->Iegid;
11240 PL_nomemok = proto_perl->Inomemok;
11241 PL_an = proto_perl->Ian;
11242 PL_evalseq = proto_perl->Ievalseq;
11243 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
11244 PL_origalen = proto_perl->Iorigalen;
11245#ifdef PERL_USES_PL_PIDSTATUS
11246 PL_pidstatus = newHV(); /* XXX flag for cloning? */
11247#endif
11248 PL_osname = SAVEPV(proto_perl->Iosname);
11249 PL_sighandlerp = proto_perl->Isighandlerp;
6a78b4db 11250
bd81e77b 11251 PL_runops = proto_perl->Irunops;
6a78b4db 11252
bd81e77b 11253 Copy(proto_perl->Itokenbuf, PL_tokenbuf, 256, char);
6a78b4db 11254
bd81e77b
NC
11255#ifdef CSH
11256 PL_cshlen = proto_perl->Icshlen;
11257 PL_cshname = proto_perl->Icshname; /* XXX never deallocated */
11258#endif
645c22ef 11259
199e78b7
DM
11260 PL_parser = parser_dup(proto_perl->Iparser, param);
11261
bd81e77b 11262 PL_multi_end = proto_perl->Imulti_end;
bd81e77b
NC
11263
11264 PL_error_count = proto_perl->Ierror_count;
11265 PL_subline = proto_perl->Isubline;
11266 PL_subname = sv_dup_inc(proto_perl->Isubname, param);
c43294b8 11267
bd81e77b
NC
11268 PL_in_my = proto_perl->Iin_my;
11269 PL_in_my_stash = hv_dup(proto_perl->Iin_my_stash, param);
11270#ifdef FCRYPT
11271 PL_cryptseen = proto_perl->Icryptseen;
11272#endif
1d7c1841 11273
bd81e77b 11274 PL_hints = proto_perl->Ihints;
1d7c1841 11275
bd81e77b 11276 PL_amagic_generation = proto_perl->Iamagic_generation;
d2d73c3e 11277
bd81e77b
NC
11278#ifdef USE_LOCALE_COLLATE
11279 PL_collation_ix = proto_perl->Icollation_ix;
11280 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
11281 PL_collation_standard = proto_perl->Icollation_standard;
11282 PL_collxfrm_base = proto_perl->Icollxfrm_base;
11283 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
11284#endif /* USE_LOCALE_COLLATE */
1d7c1841 11285
bd81e77b
NC
11286#ifdef USE_LOCALE_NUMERIC
11287 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
11288 PL_numeric_standard = proto_perl->Inumeric_standard;
11289 PL_numeric_local = proto_perl->Inumeric_local;
11290 PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
11291#endif /* !USE_LOCALE_NUMERIC */
1d7c1841 11292
bd81e77b
NC
11293 /* utf8 character classes */
11294 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum, param);
11295 PL_utf8_alnumc = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
11296 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii, param);
11297 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha, param);
11298 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space, param);
11299 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
11300 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph, param);
11301 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit, param);
11302 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper, param);
11303 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower, param);
11304 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print, param);
11305 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct, param);
11306 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
11307 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark, param);
11308 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper, param);
11309 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle, param);
11310 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower, param);
11311 PL_utf8_tofold = sv_dup_inc(proto_perl->Iutf8_tofold, param);
11312 PL_utf8_idstart = sv_dup_inc(proto_perl->Iutf8_idstart, param);
11313 PL_utf8_idcont = sv_dup_inc(proto_perl->Iutf8_idcont, param);
1d7c1841 11314
bd81e77b
NC
11315 /* Did the locale setup indicate UTF-8? */
11316 PL_utf8locale = proto_perl->Iutf8locale;
11317 /* Unicode features (see perlrun/-C) */
11318 PL_unicode = proto_perl->Iunicode;
1d7c1841 11319
bd81e77b
NC
11320 /* Pre-5.8 signals control */
11321 PL_signals = proto_perl->Isignals;
1d7c1841 11322
bd81e77b
NC
11323 /* times() ticks per second */
11324 PL_clocktick = proto_perl->Iclocktick;
1d7c1841 11325
bd81e77b
NC
11326 /* Recursion stopper for PerlIO_find_layer */
11327 PL_in_load_module = proto_perl->Iin_load_module;
8df990a8 11328
bd81e77b
NC
11329 /* sort() routine */
11330 PL_sort_RealCmp = proto_perl->Isort_RealCmp;
e5dd39fc 11331
bd81e77b
NC
11332 /* Not really needed/useful since the reenrant_retint is "volatile",
11333 * but do it for consistency's sake. */
11334 PL_reentrant_retint = proto_perl->Ireentrant_retint;
1d7c1841 11335
bd81e77b
NC
11336 /* Hooks to shared SVs and locks. */
11337 PL_sharehook = proto_perl->Isharehook;
11338 PL_lockhook = proto_perl->Ilockhook;
11339 PL_unlockhook = proto_perl->Iunlockhook;
11340 PL_threadhook = proto_perl->Ithreadhook;
1d7c1841 11341
bd81e77b
NC
11342 PL_runops_std = proto_perl->Irunops_std;
11343 PL_runops_dbg = proto_perl->Irunops_dbg;
1d7c1841 11344
bd81e77b
NC
11345#ifdef THREADS_HAVE_PIDS
11346 PL_ppid = proto_perl->Ippid;
11347#endif
1d7c1841 11348
bd81e77b 11349 /* swatch cache */
5c284bb0 11350 PL_last_swash_hv = NULL; /* reinits on demand */
bd81e77b
NC
11351 PL_last_swash_klen = 0;
11352 PL_last_swash_key[0]= '\0';
11353 PL_last_swash_tmps = (U8*)NULL;
11354 PL_last_swash_slen = 0;
1d7c1841 11355
bd81e77b
NC
11356 PL_glob_index = proto_perl->Iglob_index;
11357 PL_srand_called = proto_perl->Isrand_called;
bd61b366 11358 PL_bitcount = NULL; /* reinits on demand */
05ec9bb3 11359
bd81e77b
NC
11360 if (proto_perl->Ipsig_pend) {
11361 Newxz(PL_psig_pend, SIG_SIZE, int);
11362 }
11363 else {
11364 PL_psig_pend = (int*)NULL;
11365 }
05ec9bb3 11366
bd81e77b
NC
11367 if (proto_perl->Ipsig_ptr) {
11368 Newxz(PL_psig_ptr, SIG_SIZE, SV*);
11369 Newxz(PL_psig_name, SIG_SIZE, SV*);
11370 for (i = 1; i < SIG_SIZE; i++) {
11371 PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
11372 PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
11373 }
11374 }
11375 else {
11376 PL_psig_ptr = (SV**)NULL;
11377 PL_psig_name = (SV**)NULL;
11378 }
05ec9bb3 11379
bd81e77b 11380 /* thrdvar.h stuff */
1d7c1841 11381
bd81e77b
NC
11382 if (flags & CLONEf_COPY_STACKS) {
11383 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
11384 PL_tmps_ix = proto_perl->Ttmps_ix;
11385 PL_tmps_max = proto_perl->Ttmps_max;
11386 PL_tmps_floor = proto_perl->Ttmps_floor;
11387 Newxz(PL_tmps_stack, PL_tmps_max, SV*);
11388 i = 0;
11389 while (i <= PL_tmps_ix) {
11390 PL_tmps_stack[i] = sv_dup_inc(proto_perl->Ttmps_stack[i], param);
11391 ++i;
11392 }
d2d73c3e 11393
bd81e77b
NC
11394 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
11395 i = proto_perl->Tmarkstack_max - proto_perl->Tmarkstack;
11396 Newxz(PL_markstack, i, I32);
11397 PL_markstack_max = PL_markstack + (proto_perl->Tmarkstack_max
11398 - proto_perl->Tmarkstack);
11399 PL_markstack_ptr = PL_markstack + (proto_perl->Tmarkstack_ptr
11400 - proto_perl->Tmarkstack);
11401 Copy(proto_perl->Tmarkstack, PL_markstack,
11402 PL_markstack_ptr - PL_markstack + 1, I32);
d2d73c3e 11403
bd81e77b
NC
11404 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
11405 * NOTE: unlike the others! */
11406 PL_scopestack_ix = proto_perl->Tscopestack_ix;
11407 PL_scopestack_max = proto_perl->Tscopestack_max;
11408 Newxz(PL_scopestack, PL_scopestack_max, I32);
11409 Copy(proto_perl->Tscopestack, PL_scopestack, PL_scopestack_ix, I32);
d419787a 11410
bd81e77b
NC
11411 /* NOTE: si_dup() looks at PL_markstack */
11412 PL_curstackinfo = si_dup(proto_perl->Tcurstackinfo, param);
d2d73c3e 11413
bd81e77b
NC
11414 /* PL_curstack = PL_curstackinfo->si_stack; */
11415 PL_curstack = av_dup(proto_perl->Tcurstack, param);
11416 PL_mainstack = av_dup(proto_perl->Tmainstack, param);
1d7c1841 11417
bd81e77b
NC
11418 /* next PUSHs() etc. set *(PL_stack_sp+1) */
11419 PL_stack_base = AvARRAY(PL_curstack);
11420 PL_stack_sp = PL_stack_base + (proto_perl->Tstack_sp
11421 - proto_perl->Tstack_base);
11422 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
1d7c1841 11423
bd81e77b
NC
11424 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
11425 * NOTE: unlike the others! */
11426 PL_savestack_ix = proto_perl->Tsavestack_ix;
11427 PL_savestack_max = proto_perl->Tsavestack_max;
11428 /*Newxz(PL_savestack, PL_savestack_max, ANY);*/
11429 PL_savestack = ss_dup(proto_perl, param);
11430 }
11431 else {
11432 init_stacks();
11433 ENTER; /* perl_destruct() wants to LEAVE; */
34394ecd
DM
11434
11435 /* although we're not duplicating the tmps stack, we should still
11436 * add entries for any SVs on the tmps stack that got cloned by a
11437 * non-refcount means (eg a temp in @_); otherwise they will be
11438 * orphaned
11439 */
11440 for (i = 0; i<= proto_perl->Ttmps_ix; i++) {
6136c704 11441 SV * const nsv = (SV*)ptr_table_fetch(PL_ptr_table,
34394ecd
DM
11442 proto_perl->Ttmps_stack[i]);
11443 if (nsv && !SvREFCNT(nsv)) {
11444 EXTEND_MORTAL(1);
b37c2d43 11445 PL_tmps_stack[++PL_tmps_ix] = SvREFCNT_inc_simple(nsv);
34394ecd
DM
11446 }
11447 }
bd81e77b 11448 }
1d7c1841 11449
bd81e77b
NC
11450 PL_start_env = proto_perl->Tstart_env; /* XXXXXX */
11451 PL_top_env = &PL_start_env;
1d7c1841 11452
bd81e77b 11453 PL_op = proto_perl->Top;
4a4c6fe3 11454
a0714e2c 11455 PL_Sv = NULL;
bd81e77b
NC
11456 PL_Xpv = (XPV*)NULL;
11457 PL_na = proto_perl->Tna;
1fcf4c12 11458
bd81e77b
NC
11459 PL_statbuf = proto_perl->Tstatbuf;
11460 PL_statcache = proto_perl->Tstatcache;
11461 PL_statgv = gv_dup(proto_perl->Tstatgv, param);
11462 PL_statname = sv_dup_inc(proto_perl->Tstatname, param);
11463#ifdef HAS_TIMES
11464 PL_timesbuf = proto_perl->Ttimesbuf;
11465#endif
1d7c1841 11466
bd81e77b
NC
11467 PL_tainted = proto_perl->Ttainted;
11468 PL_curpm = proto_perl->Tcurpm; /* XXX No PMOP ref count */
11469 PL_rs = sv_dup_inc(proto_perl->Trs, param);
11470 PL_last_in_gv = gv_dup(proto_perl->Tlast_in_gv, param);
11471 PL_ofs_sv = sv_dup_inc(proto_perl->Tofs_sv, param);
11472 PL_defoutgv = gv_dup_inc(proto_perl->Tdefoutgv, param);
11473 PL_chopset = proto_perl->Tchopset; /* XXX never deallocated */
11474 PL_toptarget = sv_dup_inc(proto_perl->Ttoptarget, param);
11475 PL_bodytarget = sv_dup_inc(proto_perl->Tbodytarget, param);
11476 PL_formtarget = sv_dup(proto_perl->Tformtarget, param);
1d7c1841 11477
bd81e77b
NC
11478 PL_restartop = proto_perl->Trestartop;
11479 PL_in_eval = proto_perl->Tin_eval;
11480 PL_delaymagic = proto_perl->Tdelaymagic;
11481 PL_dirty = proto_perl->Tdirty;
11482 PL_localizing = proto_perl->Tlocalizing;
1d7c1841 11483
bd81e77b 11484 PL_errors = sv_dup_inc(proto_perl->Terrors, param);
4608196e 11485 PL_hv_fetch_ent_mh = NULL;
bd81e77b 11486 PL_modcount = proto_perl->Tmodcount;
5f66b61c 11487 PL_lastgotoprobe = NULL;
bd81e77b 11488 PL_dumpindent = proto_perl->Tdumpindent;
1d7c1841 11489
bd81e77b
NC
11490 PL_sortcop = (OP*)any_dup(proto_perl->Tsortcop, proto_perl);
11491 PL_sortstash = hv_dup(proto_perl->Tsortstash, param);
11492 PL_firstgv = gv_dup(proto_perl->Tfirstgv, param);
11493 PL_secondgv = gv_dup(proto_perl->Tsecondgv, param);
bd61b366 11494 PL_efloatbuf = NULL; /* reinits on demand */
bd81e77b 11495 PL_efloatsize = 0; /* reinits on demand */
d2d73c3e 11496
bd81e77b 11497 /* regex stuff */
1d7c1841 11498
bd81e77b
NC
11499 PL_screamfirst = NULL;
11500 PL_screamnext = NULL;
11501 PL_maxscream = -1; /* reinits on demand */
a0714e2c 11502 PL_lastscream = NULL;
1d7c1841 11503
1d7c1841 11504
bd81e77b 11505 PL_regdummy = proto_perl->Tregdummy;
bd81e77b
NC
11506 PL_colorset = 0; /* reinits PL_colors[] */
11507 /*PL_colors[6] = {0,0,0,0,0,0};*/
1d7c1841 11508
84da74a7 11509
1d7c1841 11510
bd81e77b
NC
11511 /* Pluggable optimizer */
11512 PL_peepp = proto_perl->Tpeepp;
1d7c1841 11513
bd81e77b 11514 PL_stashcache = newHV();
1d7c1841 11515
b7185faf
DM
11516 PL_watchaddr = (char **) ptr_table_fetch(PL_ptr_table,
11517 proto_perl->Twatchaddr);
11518 PL_watchok = PL_watchaddr ? * PL_watchaddr : NULL;
11519 if (PL_debug && PL_watchaddr) {
11520 PerlIO_printf(Perl_debug_log,
11521 "WATCHING: %"UVxf" cloned as %"UVxf" with value %"UVxf"\n",
11522 PTR2UV(proto_perl->Twatchaddr), PTR2UV(PL_watchaddr),
11523 PTR2UV(PL_watchok));
11524 }
11525
bd81e77b
NC
11526 if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
11527 ptr_table_free(PL_ptr_table);
11528 PL_ptr_table = NULL;
11529 }
1d7c1841 11530
bd81e77b
NC
11531 /* Call the ->CLONE method, if it exists, for each of the stashes
11532 identified by sv_dup() above.
11533 */
11534 while(av_len(param->stashes) != -1) {
11535 HV* const stash = (HV*) av_shift(param->stashes);
11536 GV* const cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
11537 if (cloner && GvCV(cloner)) {
11538 dSP;
11539 ENTER;
11540 SAVETMPS;
11541 PUSHMARK(SP);
11542 XPUSHs(sv_2mortal(newSVhek(HvNAME_HEK(stash))));
11543 PUTBACK;
11544 call_sv((SV*)GvCV(cloner), G_DISCARD);
11545 FREETMPS;
11546 LEAVE;
11547 }
1d7c1841 11548 }
1d7c1841 11549
bd81e77b 11550 SvREFCNT_dec(param->stashes);
1d7c1841 11551
bd81e77b
NC
11552 /* orphaned? eg threads->new inside BEGIN or use */
11553 if (PL_compcv && ! SvREFCNT(PL_compcv)) {
b37c2d43 11554 SvREFCNT_inc_simple_void(PL_compcv);
bd81e77b
NC
11555 SAVEFREESV(PL_compcv);
11556 }
dd2155a4 11557
bd81e77b
NC
11558 return my_perl;
11559}
1d7c1841 11560
bd81e77b 11561#endif /* USE_ITHREADS */
1d7c1841 11562
bd81e77b
NC
11563/*
11564=head1 Unicode Support
1d7c1841 11565
bd81e77b 11566=for apidoc sv_recode_to_utf8
1d7c1841 11567
bd81e77b
NC
11568The encoding is assumed to be an Encode object, on entry the PV
11569of the sv is assumed to be octets in that encoding, and the sv
11570will be converted into Unicode (and UTF-8).
1d7c1841 11571
bd81e77b
NC
11572If the sv already is UTF-8 (or if it is not POK), or if the encoding
11573is not a reference, nothing is done to the sv. If the encoding is not
11574an C<Encode::XS> Encoding object, bad things will happen.
11575(See F<lib/encoding.pm> and L<Encode>).
1d7c1841 11576
bd81e77b 11577The PV of the sv is returned.
1d7c1841 11578
bd81e77b 11579=cut */
1d7c1841 11580
bd81e77b
NC
11581char *
11582Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
11583{
11584 dVAR;
11585 if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
11586 SV *uni;
11587 STRLEN len;
11588 const char *s;
11589 dSP;
11590 ENTER;
11591 SAVETMPS;
11592 save_re_context();
11593 PUSHMARK(sp);
11594 EXTEND(SP, 3);
11595 XPUSHs(encoding);
11596 XPUSHs(sv);
11597/*
11598 NI-S 2002/07/09
11599 Passing sv_yes is wrong - it needs to be or'ed set of constants
11600 for Encode::XS, while UTf-8 decode (currently) assumes a true value means
11601 remove converted chars from source.
1d7c1841 11602
bd81e77b 11603 Both will default the value - let them.
1d7c1841 11604
bd81e77b
NC
11605 XPUSHs(&PL_sv_yes);
11606*/
11607 PUTBACK;
11608 call_method("decode", G_SCALAR);
11609 SPAGAIN;
11610 uni = POPs;
11611 PUTBACK;
11612 s = SvPV_const(uni, len);
11613 if (s != SvPVX_const(sv)) {
11614 SvGROW(sv, len + 1);
11615 Move(s, SvPVX(sv), len + 1, char);
11616 SvCUR_set(sv, len);
11617 }
11618 FREETMPS;
11619 LEAVE;
11620 SvUTF8_on(sv);
11621 return SvPVX(sv);
389edf32 11622 }
bd81e77b
NC
11623 return SvPOKp(sv) ? SvPVX(sv) : NULL;
11624}
1d7c1841 11625
bd81e77b
NC
11626/*
11627=for apidoc sv_cat_decode
1d7c1841 11628
bd81e77b
NC
11629The encoding is assumed to be an Encode object, the PV of the ssv is
11630assumed to be octets in that encoding and decoding the input starts
11631from the position which (PV + *offset) pointed to. The dsv will be
11632concatenated the decoded UTF-8 string from ssv. Decoding will terminate
11633when the string tstr appears in decoding output or the input ends on
11634the PV of the ssv. The value which the offset points will be modified
11635to the last input position on the ssv.
1d7c1841 11636
bd81e77b 11637Returns TRUE if the terminator was found, else returns FALSE.
1d7c1841 11638
bd81e77b
NC
11639=cut */
11640
11641bool
11642Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
11643 SV *ssv, int *offset, char *tstr, int tlen)
11644{
11645 dVAR;
11646 bool ret = FALSE;
11647 if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) {
11648 SV *offsv;
11649 dSP;
11650 ENTER;
11651 SAVETMPS;
11652 save_re_context();
11653 PUSHMARK(sp);
11654 EXTEND(SP, 6);
11655 XPUSHs(encoding);
11656 XPUSHs(dsv);
11657 XPUSHs(ssv);
11658 XPUSHs(offsv = sv_2mortal(newSViv(*offset)));
11659 XPUSHs(sv_2mortal(newSVpvn(tstr, tlen)));
11660 PUTBACK;
11661 call_method("cat_decode", G_SCALAR);
11662 SPAGAIN;
11663 ret = SvTRUE(TOPs);
11664 *offset = SvIV(offsv);
11665 PUTBACK;
11666 FREETMPS;
11667 LEAVE;
389edf32 11668 }
bd81e77b
NC
11669 else
11670 Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
11671 return ret;
1d7c1841 11672
bd81e77b 11673}
1d7c1841 11674
bd81e77b
NC
11675/* ---------------------------------------------------------------------
11676 *
11677 * support functions for report_uninit()
11678 */
1d7c1841 11679
bd81e77b
NC
11680/* the maxiumum size of array or hash where we will scan looking
11681 * for the undefined element that triggered the warning */
1d7c1841 11682
bd81e77b 11683#define FUV_MAX_SEARCH_SIZE 1000
1d7c1841 11684
bd81e77b
NC
11685/* Look for an entry in the hash whose value has the same SV as val;
11686 * If so, return a mortal copy of the key. */
1d7c1841 11687
bd81e77b
NC
11688STATIC SV*
11689S_find_hash_subscript(pTHX_ HV *hv, SV* val)
11690{
11691 dVAR;
11692 register HE **array;
11693 I32 i;
6c3182a5 11694
bd81e77b
NC
11695 if (!hv || SvMAGICAL(hv) || !HvARRAY(hv) ||
11696 (HvTOTALKEYS(hv) > FUV_MAX_SEARCH_SIZE))
a0714e2c 11697 return NULL;
6c3182a5 11698
bd81e77b 11699 array = HvARRAY(hv);
6c3182a5 11700
bd81e77b
NC
11701 for (i=HvMAX(hv); i>0; i--) {
11702 register HE *entry;
11703 for (entry = array[i]; entry; entry = HeNEXT(entry)) {
11704 if (HeVAL(entry) != val)
11705 continue;
11706 if ( HeVAL(entry) == &PL_sv_undef ||
11707 HeVAL(entry) == &PL_sv_placeholder)
11708 continue;
11709 if (!HeKEY(entry))
a0714e2c 11710 return NULL;
bd81e77b
NC
11711 if (HeKLEN(entry) == HEf_SVKEY)
11712 return sv_mortalcopy(HeKEY_sv(entry));
11713 return sv_2mortal(newSVpvn(HeKEY(entry), HeKLEN(entry)));
11714 }
11715 }
a0714e2c 11716 return NULL;
bd81e77b 11717}
6c3182a5 11718
bd81e77b
NC
11719/* Look for an entry in the array whose value has the same SV as val;
11720 * If so, return the index, otherwise return -1. */
6c3182a5 11721
bd81e77b
NC
11722STATIC I32
11723S_find_array_subscript(pTHX_ AV *av, SV* val)
11724{
97aff369 11725 dVAR;
bd81e77b
NC
11726 if (!av || SvMAGICAL(av) || !AvARRAY(av) ||
11727 (AvFILLp(av) > FUV_MAX_SEARCH_SIZE))
11728 return -1;
57c6e6d2 11729
4a021917
AL
11730 if (val != &PL_sv_undef) {
11731 SV ** const svp = AvARRAY(av);
11732 I32 i;
11733
11734 for (i=AvFILLp(av); i>=0; i--)
11735 if (svp[i] == val)
11736 return i;
bd81e77b
NC
11737 }
11738 return -1;
11739}
15a5279a 11740
bd81e77b
NC
11741/* S_varname(): return the name of a variable, optionally with a subscript.
11742 * If gv is non-zero, use the name of that global, along with gvtype (one
11743 * of "$", "@", "%"); otherwise use the name of the lexical at pad offset
11744 * targ. Depending on the value of the subscript_type flag, return:
11745 */
bce260cd 11746
bd81e77b
NC
11747#define FUV_SUBSCRIPT_NONE 1 /* "@foo" */
11748#define FUV_SUBSCRIPT_ARRAY 2 /* "$foo[aindex]" */
11749#define FUV_SUBSCRIPT_HASH 3 /* "$foo{keyname}" */
11750#define FUV_SUBSCRIPT_WITHIN 4 /* "within @foo" */
bce260cd 11751
bd81e77b
NC
11752STATIC SV*
11753S_varname(pTHX_ GV *gv, const char gvtype, PADOFFSET targ,
11754 SV* keyname, I32 aindex, int subscript_type)
11755{
1d7c1841 11756
bd81e77b
NC
11757 SV * const name = sv_newmortal();
11758 if (gv) {
11759 char buffer[2];
11760 buffer[0] = gvtype;
11761 buffer[1] = 0;
1d7c1841 11762
bd81e77b 11763 /* as gv_fullname4(), but add literal '^' for $^FOO names */
66fe0623 11764
bd81e77b 11765 gv_fullname4(name, gv, buffer, 0);
1d7c1841 11766
bd81e77b
NC
11767 if ((unsigned int)SvPVX(name)[1] <= 26) {
11768 buffer[0] = '^';
11769 buffer[1] = SvPVX(name)[1] + 'A' - 1;
1d7c1841 11770
bd81e77b
NC
11771 /* Swap the 1 unprintable control character for the 2 byte pretty
11772 version - ie substr($name, 1, 1) = $buffer; */
11773 sv_insert(name, 1, 1, buffer, 2);
1d7c1841 11774 }
bd81e77b
NC
11775 }
11776 else {
11777 U32 unused;
11778 CV * const cv = find_runcv(&unused);
11779 SV *sv;
11780 AV *av;
1d7c1841 11781
bd81e77b 11782 if (!cv || !CvPADLIST(cv))
a0714e2c 11783 return NULL;
bd81e77b
NC
11784 av = (AV*)(*av_fetch(CvPADLIST(cv), 0, FALSE));
11785 sv = *av_fetch(av, targ, FALSE);
f8503592 11786 sv_setpvn(name, SvPV_nolen_const(sv), SvCUR(sv));
bd81e77b 11787 }
1d7c1841 11788
bd81e77b 11789 if (subscript_type == FUV_SUBSCRIPT_HASH) {
561b68a9 11790 SV * const sv = newSV(0);
bd81e77b
NC
11791 *SvPVX(name) = '$';
11792 Perl_sv_catpvf(aTHX_ name, "{%s}",
11793 pv_display(sv,SvPVX_const(keyname), SvCUR(keyname), 0, 32));
11794 SvREFCNT_dec(sv);
11795 }
11796 else if (subscript_type == FUV_SUBSCRIPT_ARRAY) {
11797 *SvPVX(name) = '$';
11798 Perl_sv_catpvf(aTHX_ name, "[%"IVdf"]", (IV)aindex);
11799 }
11800 else if (subscript_type == FUV_SUBSCRIPT_WITHIN)
89529cee 11801 Perl_sv_insert(aTHX_ name, 0, 0, STR_WITH_LEN("within "));
1d7c1841 11802
bd81e77b
NC
11803 return name;
11804}
1d7c1841 11805
1d7c1841 11806
bd81e77b
NC
11807/*
11808=for apidoc find_uninit_var
1d7c1841 11809
bd81e77b
NC
11810Find the name of the undefined variable (if any) that caused the operator o
11811to issue a "Use of uninitialized value" warning.
11812If match is true, only return a name if it's value matches uninit_sv.
11813So roughly speaking, if a unary operator (such as OP_COS) generates a
11814warning, then following the direct child of the op may yield an
11815OP_PADSV or OP_GV that gives the name of the undefined variable. On the
11816other hand, with OP_ADD there are two branches to follow, so we only print
11817the variable name if we get an exact match.
1d7c1841 11818
bd81e77b 11819The name is returned as a mortal SV.
1d7c1841 11820
bd81e77b
NC
11821Assumes that PL_op is the op that originally triggered the error, and that
11822PL_comppad/PL_curpad points to the currently executing pad.
1d7c1841 11823
bd81e77b
NC
11824=cut
11825*/
1d7c1841 11826
bd81e77b
NC
11827STATIC SV *
11828S_find_uninit_var(pTHX_ OP* obase, SV* uninit_sv, bool match)
11829{
11830 dVAR;
11831 SV *sv;
11832 AV *av;
11833 GV *gv;
11834 OP *o, *o2, *kid;
1d7c1841 11835
bd81e77b
NC
11836 if (!obase || (match && (!uninit_sv || uninit_sv == &PL_sv_undef ||
11837 uninit_sv == &PL_sv_placeholder)))
a0714e2c 11838 return NULL;
1d7c1841 11839
bd81e77b 11840 switch (obase->op_type) {
1d7c1841 11841
bd81e77b
NC
11842 case OP_RV2AV:
11843 case OP_RV2HV:
11844 case OP_PADAV:
11845 case OP_PADHV:
11846 {
11847 const bool pad = (obase->op_type == OP_PADAV || obase->op_type == OP_PADHV);
11848 const bool hash = (obase->op_type == OP_PADHV || obase->op_type == OP_RV2HV);
11849 I32 index = 0;
a0714e2c 11850 SV *keysv = NULL;
bd81e77b 11851 int subscript_type = FUV_SUBSCRIPT_WITHIN;
1d7c1841 11852
bd81e77b
NC
11853 if (pad) { /* @lex, %lex */
11854 sv = PAD_SVl(obase->op_targ);
a0714e2c 11855 gv = NULL;
bd81e77b
NC
11856 }
11857 else {
11858 if (cUNOPx(obase)->op_first->op_type == OP_GV) {
11859 /* @global, %global */
11860 gv = cGVOPx_gv(cUNOPx(obase)->op_first);
11861 if (!gv)
11862 break;
11863 sv = hash ? (SV*)GvHV(gv): (SV*)GvAV(gv);
11864 }
11865 else /* @{expr}, %{expr} */
11866 return find_uninit_var(cUNOPx(obase)->op_first,
11867 uninit_sv, match);
11868 }
1d7c1841 11869
bd81e77b
NC
11870 /* attempt to find a match within the aggregate */
11871 if (hash) {
d4c19fe8 11872 keysv = find_hash_subscript((HV*)sv, uninit_sv);
bd81e77b
NC
11873 if (keysv)
11874 subscript_type = FUV_SUBSCRIPT_HASH;
11875 }
11876 else {
e15d5972 11877 index = find_array_subscript((AV*)sv, uninit_sv);
bd81e77b
NC
11878 if (index >= 0)
11879 subscript_type = FUV_SUBSCRIPT_ARRAY;
11880 }
1d7c1841 11881
bd81e77b
NC
11882 if (match && subscript_type == FUV_SUBSCRIPT_WITHIN)
11883 break;
1d7c1841 11884
bd81e77b
NC
11885 return varname(gv, hash ? '%' : '@', obase->op_targ,
11886 keysv, index, subscript_type);
11887 }
1d7c1841 11888
bd81e77b
NC
11889 case OP_PADSV:
11890 if (match && PAD_SVl(obase->op_targ) != uninit_sv)
11891 break;
a0714e2c
SS
11892 return varname(NULL, '$', obase->op_targ,
11893 NULL, 0, FUV_SUBSCRIPT_NONE);
1d7c1841 11894
bd81e77b
NC
11895 case OP_GVSV:
11896 gv = cGVOPx_gv(obase);
11897 if (!gv || (match && GvSV(gv) != uninit_sv))
11898 break;
a0714e2c 11899 return varname(gv, '$', 0, NULL, 0, FUV_SUBSCRIPT_NONE);
1d7c1841 11900
bd81e77b
NC
11901 case OP_AELEMFAST:
11902 if (obase->op_flags & OPf_SPECIAL) { /* lexical array */
11903 if (match) {
11904 SV **svp;
11905 av = (AV*)PAD_SV(obase->op_targ);
11906 if (!av || SvRMAGICAL(av))
11907 break;
11908 svp = av_fetch(av, (I32)obase->op_private, FALSE);
11909 if (!svp || *svp != uninit_sv)
11910 break;
11911 }
a0714e2c
SS
11912 return varname(NULL, '$', obase->op_targ,
11913 NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
11914 }
11915 else {
11916 gv = cGVOPx_gv(obase);
11917 if (!gv)
11918 break;
11919 if (match) {
11920 SV **svp;
11921 av = GvAV(gv);
11922 if (!av || SvRMAGICAL(av))
11923 break;
11924 svp = av_fetch(av, (I32)obase->op_private, FALSE);
11925 if (!svp || *svp != uninit_sv)
11926 break;
11927 }
11928 return varname(gv, '$', 0,
a0714e2c 11929 NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
11930 }
11931 break;
1d7c1841 11932
bd81e77b
NC
11933 case OP_EXISTS:
11934 o = cUNOPx(obase)->op_first;
11935 if (!o || o->op_type != OP_NULL ||
11936 ! (o->op_targ == OP_AELEM || o->op_targ == OP_HELEM))
11937 break;
11938 return find_uninit_var(cBINOPo->op_last, uninit_sv, match);
a2efc822 11939
bd81e77b
NC
11940 case OP_AELEM:
11941 case OP_HELEM:
11942 if (PL_op == obase)
11943 /* $a[uninit_expr] or $h{uninit_expr} */
11944 return find_uninit_var(cBINOPx(obase)->op_last, uninit_sv, match);
081fc587 11945
a0714e2c 11946 gv = NULL;
bd81e77b
NC
11947 o = cBINOPx(obase)->op_first;
11948 kid = cBINOPx(obase)->op_last;
8cf8f3d1 11949
bd81e77b 11950 /* get the av or hv, and optionally the gv */
a0714e2c 11951 sv = NULL;
bd81e77b
NC
11952 if (o->op_type == OP_PADAV || o->op_type == OP_PADHV) {
11953 sv = PAD_SV(o->op_targ);
11954 }
11955 else if ((o->op_type == OP_RV2AV || o->op_type == OP_RV2HV)
11956 && cUNOPo->op_first->op_type == OP_GV)
11957 {
11958 gv = cGVOPx_gv(cUNOPo->op_first);
11959 if (!gv)
11960 break;
11961 sv = o->op_type == OP_RV2HV ? (SV*)GvHV(gv) : (SV*)GvAV(gv);
11962 }
11963 if (!sv)
11964 break;
11965
11966 if (kid && kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid))) {
11967 /* index is constant */
11968 if (match) {
11969 if (SvMAGICAL(sv))
11970 break;
11971 if (obase->op_type == OP_HELEM) {
11972 HE* he = hv_fetch_ent((HV*)sv, cSVOPx_sv(kid), 0, 0);
11973 if (!he || HeVAL(he) != uninit_sv)
11974 break;
11975 }
11976 else {
00b6aa41 11977 SV * const * const svp = av_fetch((AV*)sv, SvIV(cSVOPx_sv(kid)), FALSE);
bd81e77b
NC
11978 if (!svp || *svp != uninit_sv)
11979 break;
11980 }
11981 }
11982 if (obase->op_type == OP_HELEM)
11983 return varname(gv, '%', o->op_targ,
11984 cSVOPx_sv(kid), 0, FUV_SUBSCRIPT_HASH);
11985 else
a0714e2c 11986 return varname(gv, '@', o->op_targ, NULL,
bd81e77b 11987 SvIV(cSVOPx_sv(kid)), FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
11988 }
11989 else {
11990 /* index is an expression;
11991 * attempt to find a match within the aggregate */
11992 if (obase->op_type == OP_HELEM) {
d4c19fe8 11993 SV * const keysv = find_hash_subscript((HV*)sv, uninit_sv);
bd81e77b
NC
11994 if (keysv)
11995 return varname(gv, '%', o->op_targ,
11996 keysv, 0, FUV_SUBSCRIPT_HASH);
11997 }
11998 else {
d4c19fe8 11999 const I32 index = find_array_subscript((AV*)sv, uninit_sv);
bd81e77b
NC
12000 if (index >= 0)
12001 return varname(gv, '@', o->op_targ,
a0714e2c 12002 NULL, index, FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
12003 }
12004 if (match)
12005 break;
12006 return varname(gv,
12007 (o->op_type == OP_PADAV || o->op_type == OP_RV2AV)
12008 ? '@' : '%',
a0714e2c 12009 o->op_targ, NULL, 0, FUV_SUBSCRIPT_WITHIN);
f284b03f 12010 }
bd81e77b 12011 break;
dc507217 12012
bd81e77b
NC
12013 case OP_AASSIGN:
12014 /* only examine RHS */
12015 return find_uninit_var(cBINOPx(obase)->op_first, uninit_sv, match);
6d26897e 12016
bd81e77b
NC
12017 case OP_OPEN:
12018 o = cUNOPx(obase)->op_first;
12019 if (o->op_type == OP_PUSHMARK)
12020 o = o->op_sibling;
1d7c1841 12021
bd81e77b
NC
12022 if (!o->op_sibling) {
12023 /* one-arg version of open is highly magical */
a0ae6670 12024
bd81e77b
NC
12025 if (o->op_type == OP_GV) { /* open FOO; */
12026 gv = cGVOPx_gv(o);
12027 if (match && GvSV(gv) != uninit_sv)
12028 break;
12029 return varname(gv, '$', 0,
a0714e2c 12030 NULL, 0, FUV_SUBSCRIPT_NONE);
bd81e77b
NC
12031 }
12032 /* other possibilities not handled are:
12033 * open $x; or open my $x; should return '${*$x}'
12034 * open expr; should return '$'.expr ideally
12035 */
12036 break;
12037 }
12038 goto do_op;
ccfc67b7 12039
bd81e77b
NC
12040 /* ops where $_ may be an implicit arg */
12041 case OP_TRANS:
12042 case OP_SUBST:
12043 case OP_MATCH:
12044 if ( !(obase->op_flags & OPf_STACKED)) {
12045 if (uninit_sv == ((obase->op_private & OPpTARGET_MY)
12046 ? PAD_SVl(obase->op_targ)
12047 : DEFSV))
12048 {
12049 sv = sv_newmortal();
12050 sv_setpvn(sv, "$_", 2);
12051 return sv;
12052 }
12053 }
12054 goto do_op;
9f4817db 12055
bd81e77b
NC
12056 case OP_PRTF:
12057 case OP_PRINT:
3ef1310e 12058 case OP_SAY:
bd81e77b
NC
12059 /* skip filehandle as it can't produce 'undef' warning */
12060 o = cUNOPx(obase)->op_first;
12061 if ((obase->op_flags & OPf_STACKED) && o->op_type == OP_PUSHMARK)
12062 o = o->op_sibling->op_sibling;
12063 goto do_op2;
9f4817db 12064
9f4817db 12065
bd81e77b
NC
12066 case OP_RV2SV:
12067 case OP_CUSTOM:
12068 case OP_ENTERSUB:
12069 match = 1; /* XS or custom code could trigger random warnings */
12070 goto do_op;
9f4817db 12071
bd81e77b
NC
12072 case OP_SCHOMP:
12073 case OP_CHOMP:
12074 if (SvROK(PL_rs) && uninit_sv == SvRV(PL_rs))
396482e1 12075 return sv_2mortal(newSVpvs("${$/}"));
5f66b61c 12076 /*FALLTHROUGH*/
5d170f3a 12077
bd81e77b
NC
12078 default:
12079 do_op:
12080 if (!(obase->op_flags & OPf_KIDS))
12081 break;
12082 o = cUNOPx(obase)->op_first;
12083
12084 do_op2:
12085 if (!o)
12086 break;
f9893866 12087
bd81e77b
NC
12088 /* if all except one arg are constant, or have no side-effects,
12089 * or are optimized away, then it's unambiguous */
5f66b61c 12090 o2 = NULL;
bd81e77b 12091 for (kid=o; kid; kid = kid->op_sibling) {
e15d5972
AL
12092 if (kid) {
12093 const OPCODE type = kid->op_type;
12094 if ( (type == OP_CONST && SvOK(cSVOPx_sv(kid)))
12095 || (type == OP_NULL && ! (kid->op_flags & OPf_KIDS))
12096 || (type == OP_PUSHMARK)
bd81e77b 12097 )
bd81e77b 12098 continue;
e15d5972 12099 }
bd81e77b 12100 if (o2) { /* more than one found */
5f66b61c 12101 o2 = NULL;
bd81e77b
NC
12102 break;
12103 }
12104 o2 = kid;
12105 }
12106 if (o2)
12107 return find_uninit_var(o2, uninit_sv, match);
7a5fa8a2 12108
bd81e77b
NC
12109 /* scan all args */
12110 while (o) {
12111 sv = find_uninit_var(o, uninit_sv, 1);
12112 if (sv)
12113 return sv;
12114 o = o->op_sibling;
d0063567 12115 }
bd81e77b 12116 break;
f9893866 12117 }
a0714e2c 12118 return NULL;
9f4817db
JH
12119}
12120
220e2d4e 12121
bd81e77b
NC
12122/*
12123=for apidoc report_uninit
68795e93 12124
bd81e77b 12125Print appropriate "Use of uninitialized variable" warning
220e2d4e 12126
bd81e77b
NC
12127=cut
12128*/
220e2d4e 12129
bd81e77b
NC
12130void
12131Perl_report_uninit(pTHX_ SV* uninit_sv)
220e2d4e 12132{
97aff369 12133 dVAR;
bd81e77b 12134 if (PL_op) {
a0714e2c 12135 SV* varname = NULL;
bd81e77b
NC
12136 if (uninit_sv) {
12137 varname = find_uninit_var(PL_op, uninit_sv,0);
12138 if (varname)
12139 sv_insert(varname, 0, 0, " ", 1);
12140 }
12141 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
12142 varname ? SvPV_nolen_const(varname) : "",
12143 " in ", OP_DESC(PL_op));
220e2d4e 12144 }
a73e8557 12145 else
bd81e77b
NC
12146 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
12147 "", "", "");
220e2d4e 12148}
f9893866 12149
241d1a3b
NC
12150/*
12151 * Local variables:
12152 * c-indentation-style: bsd
12153 * c-basic-offset: 4
12154 * indent-tabs-mode: t
12155 * End:
12156 *
37442d52
RGS
12157 * ex: set ts=8 sts=4 sw=4 noet:
12158 */