This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Upgrade to IO-Zlib-1.09.
[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;
f24aceb1
DM
249 sv->sv_debug_line = (U16) (PL_parser
250 ? PL_parser->copline == NOLINE
251 ? PL_curcop
252 ? CopLINE(PL_curcop)
253 : 0
254 : PL_parser->copline
255 : 0);
fd0854ff
DM
256 sv->sv_debug_inpad = 0;
257 sv->sv_debug_cloned = 0;
fd0854ff 258 sv->sv_debug_file = PL_curcop ? savepv(CopFILE(PL_curcop)): NULL;
fd0854ff 259
eba0f806
DM
260 return sv;
261}
262# define new_SV(p) (p)=S_new_SV(aTHX)
263
264#else
265# define new_SV(p) \
053fc874 266 STMT_START { \
053fc874
GS
267 if (PL_sv_root) \
268 uproot_SV(p); \
269 else \
cac9b346 270 (p) = S_more_sv(aTHX); \
053fc874
GS
271 SvANY(p) = 0; \
272 SvREFCNT(p) = 1; \
273 SvFLAGS(p) = 0; \
274 } STMT_END
eba0f806 275#endif
463ee0b2 276
645c22ef
DM
277
278/* del_SV(): return an empty SV head to the free list */
279
a0d0e21e 280#ifdef DEBUGGING
4561caa4 281
053fc874
GS
282#define del_SV(p) \
283 STMT_START { \
aea4f609 284 if (DEBUG_D_TEST) \
053fc874
GS
285 del_sv(p); \
286 else \
287 plant_SV(p); \
053fc874 288 } STMT_END
a0d0e21e 289
76e3520e 290STATIC void
cea2e8a9 291S_del_sv(pTHX_ SV *p)
463ee0b2 292{
97aff369 293 dVAR;
aea4f609 294 if (DEBUG_D_TEST) {
4633a7c4 295 SV* sva;
a3b680e6 296 bool ok = 0;
3280af22 297 for (sva = PL_sv_arenaroot; sva; sva = (SV *) SvANY(sva)) {
53c1dcc0
AL
298 const SV * const sv = sva + 1;
299 const SV * const svend = &sva[SvREFCNT(sva)];
c0ff570e 300 if (p >= sv && p < svend) {
a0d0e21e 301 ok = 1;
c0ff570e
NC
302 break;
303 }
a0d0e21e
LW
304 }
305 if (!ok) {
0453d815 306 if (ckWARN_d(WARN_INTERNAL))
9014280d 307 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
472d47bc
SB
308 "Attempt to free non-arena SV: 0x%"UVxf
309 pTHX__FORMAT, PTR2UV(p) pTHX__VALUE);
a0d0e21e
LW
310 return;
311 }
312 }
4561caa4 313 plant_SV(p);
463ee0b2 314}
a0d0e21e 315
4561caa4
CS
316#else /* ! DEBUGGING */
317
318#define del_SV(p) plant_SV(p)
319
320#endif /* DEBUGGING */
463ee0b2 321
645c22ef
DM
322
323/*
ccfc67b7
JH
324=head1 SV Manipulation Functions
325
645c22ef
DM
326=for apidoc sv_add_arena
327
328Given a chunk of memory, link it to the head of the list of arenas,
329and split it into a list of free SVs.
330
331=cut
332*/
333
4633a7c4 334void
864dbfa3 335Perl_sv_add_arena(pTHX_ char *ptr, U32 size, U32 flags)
463ee0b2 336{
97aff369 337 dVAR;
0bd48802 338 SV* const sva = (SV*)ptr;
463ee0b2
LW
339 register SV* sv;
340 register SV* svend;
4633a7c4
LW
341
342 /* The first SV in an arena isn't an SV. */
3280af22 343 SvANY(sva) = (void *) PL_sv_arenaroot; /* ptr to next arena */
4633a7c4
LW
344 SvREFCNT(sva) = size / sizeof(SV); /* number of SV slots */
345 SvFLAGS(sva) = flags; /* FAKE if not to be freed */
346
3280af22
NIS
347 PL_sv_arenaroot = sva;
348 PL_sv_root = sva + 1;
4633a7c4
LW
349
350 svend = &sva[SvREFCNT(sva) - 1];
351 sv = sva + 1;
463ee0b2 352 while (sv < svend) {
48614a46 353 SvARENA_CHAIN(sv) = (void *)(SV*)(sv + 1);
03e36789 354#ifdef DEBUGGING
978b032e 355 SvREFCNT(sv) = 0;
03e36789 356#endif
4b69cbe3 357 /* Must always set typemask because it's always checked in on cleanup
03e36789 358 when the arenas are walked looking for objects. */
8990e307 359 SvFLAGS(sv) = SVTYPEMASK;
463ee0b2
LW
360 sv++;
361 }
48614a46 362 SvARENA_CHAIN(sv) = 0;
03e36789
NC
363#ifdef DEBUGGING
364 SvREFCNT(sv) = 0;
365#endif
4633a7c4
LW
366 SvFLAGS(sv) = SVTYPEMASK;
367}
368
055972dc
DM
369/* visit(): call the named function for each non-free SV in the arenas
370 * whose flags field matches the flags/mask args. */
645c22ef 371
5226ed68 372STATIC I32
055972dc 373S_visit(pTHX_ SVFUNC_t f, U32 flags, U32 mask)
8990e307 374{
97aff369 375 dVAR;
4633a7c4 376 SV* sva;
5226ed68 377 I32 visited = 0;
8990e307 378
3280af22 379 for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
53c1dcc0 380 register const SV * const svend = &sva[SvREFCNT(sva)];
a3b680e6 381 register SV* sv;
4561caa4 382 for (sv = sva + 1; sv < svend; ++sv) {
055972dc
DM
383 if (SvTYPE(sv) != SVTYPEMASK
384 && (sv->sv_flags & mask) == flags
385 && SvREFCNT(sv))
386 {
acfe0abc 387 (FCALL)(aTHX_ sv);
5226ed68
JH
388 ++visited;
389 }
8990e307
LW
390 }
391 }
5226ed68 392 return visited;
8990e307
LW
393}
394
758a08c3
JH
395#ifdef DEBUGGING
396
645c22ef
DM
397/* called by sv_report_used() for each live SV */
398
399static void
acfe0abc 400do_report_used(pTHX_ SV *sv)
645c22ef
DM
401{
402 if (SvTYPE(sv) != SVTYPEMASK) {
403 PerlIO_printf(Perl_debug_log, "****\n");
404 sv_dump(sv);
405 }
406}
758a08c3 407#endif
645c22ef
DM
408
409/*
410=for apidoc sv_report_used
411
412Dump the contents of all SVs not yet freed. (Debugging aid).
413
414=cut
415*/
416
8990e307 417void
864dbfa3 418Perl_sv_report_used(pTHX)
4561caa4 419{
ff270d3a 420#ifdef DEBUGGING
055972dc 421 visit(do_report_used, 0, 0);
96a5add6
AL
422#else
423 PERL_UNUSED_CONTEXT;
ff270d3a 424#endif
4561caa4
CS
425}
426
645c22ef
DM
427/* called by sv_clean_objs() for each live SV */
428
429static void
e15faf7d 430do_clean_objs(pTHX_ SV *ref)
645c22ef 431{
97aff369 432 dVAR;
ea724faa
NC
433 assert (SvROK(ref));
434 {
823a54a3
AL
435 SV * const target = SvRV(ref);
436 if (SvOBJECT(target)) {
437 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(ref)));
438 if (SvWEAKREF(ref)) {
439 sv_del_backref(target, ref);
440 SvWEAKREF_off(ref);
441 SvRV_set(ref, NULL);
442 } else {
443 SvROK_off(ref);
444 SvRV_set(ref, NULL);
445 SvREFCNT_dec(target);
446 }
645c22ef
DM
447 }
448 }
449
450 /* XXX Might want to check arrays, etc. */
451}
452
453/* called by sv_clean_objs() for each live SV */
454
455#ifndef DISABLE_DESTRUCTOR_KLUDGE
456static void
acfe0abc 457do_clean_named_objs(pTHX_ SV *sv)
645c22ef 458{
97aff369 459 dVAR;
ea724faa 460 assert(SvTYPE(sv) == SVt_PVGV);
d011219a
NC
461 assert(isGV_with_GP(sv));
462 if (GvGP(sv)) {
c69033f2
NC
463 if ((
464#ifdef PERL_DONT_CREATE_GVSV
465 GvSV(sv) &&
466#endif
467 SvOBJECT(GvSV(sv))) ||
645c22ef
DM
468 (GvAV(sv) && SvOBJECT(GvAV(sv))) ||
469 (GvHV(sv) && SvOBJECT(GvHV(sv))) ||
9c12f1e5
RGS
470 /* In certain rare cases GvIOp(sv) can be NULL, which would make SvOBJECT(GvIO(sv)) dereference NULL. */
471 (GvIO(sv) ? (SvFLAGS(GvIOp(sv)) & SVs_OBJECT) : 0) ||
645c22ef
DM
472 (GvCV(sv) && SvOBJECT(GvCV(sv))) )
473 {
474 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning named glob object:\n "), sv_dump(sv)));
ec5f3c78 475 SvFLAGS(sv) |= SVf_BREAK;
645c22ef
DM
476 SvREFCNT_dec(sv);
477 }
478 }
479}
480#endif
481
482/*
483=for apidoc sv_clean_objs
484
485Attempt to destroy all objects not yet freed
486
487=cut
488*/
489
4561caa4 490void
864dbfa3 491Perl_sv_clean_objs(pTHX)
4561caa4 492{
97aff369 493 dVAR;
3280af22 494 PL_in_clean_objs = TRUE;
055972dc 495 visit(do_clean_objs, SVf_ROK, SVf_ROK);
4561caa4 496#ifndef DISABLE_DESTRUCTOR_KLUDGE
2d0f3c12 497 /* some barnacles may yet remain, clinging to typeglobs */
d011219a 498 visit(do_clean_named_objs, SVt_PVGV|SVpgv_GP, SVTYPEMASK|SVp_POK|SVpgv_GP);
4561caa4 499#endif
3280af22 500 PL_in_clean_objs = FALSE;
4561caa4
CS
501}
502
645c22ef
DM
503/* called by sv_clean_all() for each live SV */
504
505static void
acfe0abc 506do_clean_all(pTHX_ SV *sv)
645c22ef 507{
97aff369 508 dVAR;
645c22ef
DM
509 DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%"UVxf"\n", PTR2UV(sv)) ));
510 SvFLAGS(sv) |= SVf_BREAK;
511 SvREFCNT_dec(sv);
512}
513
514/*
515=for apidoc sv_clean_all
516
517Decrement the refcnt of each remaining SV, possibly triggering a
518cleanup. This function may have to be called multiple times to free
ff276b08 519SVs which are in complex self-referential hierarchies.
645c22ef
DM
520
521=cut
522*/
523
5226ed68 524I32
864dbfa3 525Perl_sv_clean_all(pTHX)
8990e307 526{
97aff369 527 dVAR;
5226ed68 528 I32 cleaned;
3280af22 529 PL_in_clean_all = TRUE;
055972dc 530 cleaned = visit(do_clean_all, 0,0);
3280af22 531 PL_in_clean_all = FALSE;
5226ed68 532 return cleaned;
8990e307 533}
463ee0b2 534
5e258f8c
JC
535/*
536 ARENASETS: a meta-arena implementation which separates arena-info
537 into struct arena_set, which contains an array of struct
538 arena_descs, each holding info for a single arena. By separating
539 the meta-info from the arena, we recover the 1st slot, formerly
540 borrowed for list management. The arena_set is about the size of an
39244528 541 arena, avoiding the needless malloc overhead of a naive linked-list.
5e258f8c
JC
542
543 The cost is 1 arena-set malloc per ~320 arena-mallocs, + the unused
544 memory in the last arena-set (1/2 on average). In trade, we get
545 back the 1st slot in each arena (ie 1.7% of a CV-arena, less for
d2a0f284 546 smaller types). The recovery of the wasted space allows use of
e15dad31
JC
547 small arenas for large, rare body types, by changing array* fields
548 in body_details_by_type[] below.
5e258f8c 549*/
5e258f8c 550struct arena_desc {
398c677b
NC
551 char *arena; /* the raw storage, allocated aligned */
552 size_t size; /* its size ~4k typ */
0a848332 553 U32 misc; /* type, and in future other things. */
5e258f8c
JC
554};
555
e6148039
NC
556struct arena_set;
557
558/* Get the maximum number of elements in set[] such that struct arena_set
e15dad31 559 will fit within PERL_ARENA_SIZE, which is probably just under 4K, and
e6148039
NC
560 therefore likely to be 1 aligned memory page. */
561
562#define ARENAS_PER_SET ((PERL_ARENA_SIZE - sizeof(struct arena_set*) \
563 - 2 * sizeof(int)) / sizeof (struct arena_desc))
5e258f8c
JC
564
565struct arena_set {
566 struct arena_set* next;
0a848332
NC
567 unsigned int set_size; /* ie ARENAS_PER_SET */
568 unsigned int curr; /* index of next available arena-desc */
5e258f8c
JC
569 struct arena_desc set[ARENAS_PER_SET];
570};
571
645c22ef
DM
572/*
573=for apidoc sv_free_arenas
574
575Deallocate the memory used by all arenas. Note that all the individual SV
576heads and bodies within the arenas must already have been freed.
577
578=cut
579*/
4633a7c4 580void
864dbfa3 581Perl_sv_free_arenas(pTHX)
4633a7c4 582{
97aff369 583 dVAR;
4633a7c4
LW
584 SV* sva;
585 SV* svanext;
0a848332 586 unsigned int i;
4633a7c4
LW
587
588 /* Free arenas here, but be careful about fake ones. (We assume
589 contiguity of the fake ones with the corresponding real ones.) */
590
3280af22 591 for (sva = PL_sv_arenaroot; sva; sva = svanext) {
4633a7c4
LW
592 svanext = (SV*) SvANY(sva);
593 while (svanext && SvFAKE(svanext))
594 svanext = (SV*) SvANY(svanext);
595
596 if (!SvFAKE(sva))
1df70142 597 Safefree(sva);
4633a7c4 598 }
93e68bfb 599
5e258f8c 600 {
0a848332
NC
601 struct arena_set *aroot = (struct arena_set*) PL_body_arenas;
602
603 while (aroot) {
604 struct arena_set *current = aroot;
605 i = aroot->curr;
606 while (i--) {
5e258f8c
JC
607 assert(aroot->set[i].arena);
608 Safefree(aroot->set[i].arena);
609 }
0a848332
NC
610 aroot = aroot->next;
611 Safefree(current);
5e258f8c
JC
612 }
613 }
dc8220bf 614 PL_body_arenas = 0;
fdda85ca 615
0a848332
NC
616 i = PERL_ARENA_ROOTS_SIZE;
617 while (i--)
93e68bfb 618 PL_body_roots[i] = 0;
93e68bfb 619
43c5f42d 620 Safefree(PL_nice_chunk);
bd61b366 621 PL_nice_chunk = NULL;
3280af22
NIS
622 PL_nice_chunk_size = 0;
623 PL_sv_arenaroot = 0;
624 PL_sv_root = 0;
4633a7c4
LW
625}
626
bd81e77b
NC
627/*
628 Here are mid-level routines that manage the allocation of bodies out
629 of the various arenas. There are 5 kinds of arenas:
29489e7c 630
bd81e77b
NC
631 1. SV-head arenas, which are discussed and handled above
632 2. regular body arenas
633 3. arenas for reduced-size bodies
634 4. Hash-Entry arenas
635 5. pte arenas (thread related)
29489e7c 636
bd81e77b
NC
637 Arena types 2 & 3 are chained by body-type off an array of
638 arena-root pointers, which is indexed by svtype. Some of the
639 larger/less used body types are malloced singly, since a large
640 unused block of them is wasteful. Also, several svtypes dont have
641 bodies; the data fits into the sv-head itself. The arena-root
642 pointer thus has a few unused root-pointers (which may be hijacked
643 later for arena types 4,5)
29489e7c 644
bd81e77b
NC
645 3 differs from 2 as an optimization; some body types have several
646 unused fields in the front of the structure (which are kept in-place
647 for consistency). These bodies can be allocated in smaller chunks,
648 because the leading fields arent accessed. Pointers to such bodies
649 are decremented to point at the unused 'ghost' memory, knowing that
650 the pointers are used with offsets to the real memory.
29489e7c 651
bd81e77b
NC
652 HE, HEK arenas are managed separately, with separate code, but may
653 be merge-able later..
654
655 PTE arenas are not sv-bodies, but they share these mid-level
656 mechanics, so are considered here. The new mid-level mechanics rely
657 on the sv_type of the body being allocated, so we just reserve one
658 of the unused body-slots for PTEs, then use it in those (2) PTE
659 contexts below (line ~10k)
660*/
661
bd26d9a3 662/* get_arena(size): this creates custom-sized arenas
5e258f8c
JC
663 TBD: export properly for hv.c: S_more_he().
664*/
665void*
0a848332 666Perl_get_arena(pTHX_ size_t arena_size, U32 misc)
5e258f8c 667{
7a89be66 668 dVAR;
5e258f8c 669 struct arena_desc* adesc;
39244528 670 struct arena_set *aroot = (struct arena_set*) PL_body_arenas;
0a848332 671 unsigned int curr;
5e258f8c 672
476a1e16
JC
673 /* shouldnt need this
674 if (!arena_size) arena_size = PERL_ARENA_SIZE;
675 */
5e258f8c
JC
676
677 /* may need new arena-set to hold new arena */
39244528
NC
678 if (!aroot || aroot->curr >= aroot->set_size) {
679 struct arena_set *newroot;
5e258f8c
JC
680 Newxz(newroot, 1, struct arena_set);
681 newroot->set_size = ARENAS_PER_SET;
39244528
NC
682 newroot->next = aroot;
683 aroot = newroot;
684 PL_body_arenas = (void *) newroot;
52944de8 685 DEBUG_m(PerlIO_printf(Perl_debug_log, "new arenaset %p\n", (void*)aroot));
5e258f8c
JC
686 }
687
688 /* ok, now have arena-set with at least 1 empty/available arena-desc */
39244528
NC
689 curr = aroot->curr++;
690 adesc = &(aroot->set[curr]);
5e258f8c
JC
691 assert(!adesc->arena);
692
89086707 693 Newx(adesc->arena, arena_size, char);
5e258f8c 694 adesc->size = arena_size;
0a848332 695 adesc->misc = misc;
d67b3c53
JH
696 DEBUG_m(PerlIO_printf(Perl_debug_log, "arena %d added: %p size %"UVuf"\n",
697 curr, (void*)adesc->arena, (UV)arena_size));
5e258f8c
JC
698
699 return adesc->arena;
5e258f8c
JC
700}
701
53c1dcc0 702
bd81e77b 703/* return a thing to the free list */
29489e7c 704
bd81e77b
NC
705#define del_body(thing, root) \
706 STMT_START { \
00b6aa41 707 void ** const thing_copy = (void **)thing;\
bd81e77b
NC
708 *thing_copy = *root; \
709 *root = (void*)thing_copy; \
bd81e77b 710 } STMT_END
29489e7c 711
bd81e77b 712/*
d2a0f284
JC
713
714=head1 SV-Body Allocation
715
716Allocation of SV-bodies is similar to SV-heads, differing as follows;
717the allocation mechanism is used for many body types, so is somewhat
718more complicated, it uses arena-sets, and has no need for still-live
719SV detection.
720
721At the outermost level, (new|del)_X*V macros return bodies of the
722appropriate type. These macros call either (new|del)_body_type or
723(new|del)_body_allocated macro pairs, depending on specifics of the
724type. Most body types use the former pair, the latter pair is used to
725allocate body types with "ghost fields".
726
727"ghost fields" are fields that are unused in certain types, and
728consequently dont need to actually exist. They are declared because
729they're part of a "base type", which allows use of functions as
730methods. The simplest examples are AVs and HVs, 2 aggregate types
731which don't use the fields which support SCALAR semantics.
732
733For these types, the arenas are carved up into *_allocated size
734chunks, we thus avoid wasted memory for those unaccessed members.
735When bodies are allocated, we adjust the pointer back in memory by the
736size of the bit not allocated, so it's as if we allocated the full
737structure. (But things will all go boom if you write to the part that
738is "not there", because you'll be overwriting the last members of the
739preceding structure in memory.)
740
741We calculate the correction using the STRUCT_OFFSET macro. For
742example, if xpv_allocated is the same structure as XPV then the two
743OFFSETs sum to zero, and the pointer is unchanged. If the allocated
744structure is smaller (no initial NV actually allocated) then the net
745effect is to subtract the size of the NV from the pointer, to return a
746new pointer as if an initial NV were actually allocated.
747
748This is the same trick as was used for NV and IV bodies. Ironically it
749doesn't need to be used for NV bodies any more, because NV is now at
750the start of the structure. IV bodies don't need it either, because
751they are no longer allocated.
752
753In turn, the new_body_* allocators call S_new_body(), which invokes
754new_body_inline macro, which takes a lock, and takes a body off the
755linked list at PL_body_roots[sv_type], calling S_more_bodies() if
756necessary to refresh an empty list. Then the lock is released, and
757the body is returned.
758
759S_more_bodies calls get_arena(), and carves it up into an array of N
760bodies, which it strings into a linked list. It looks up arena-size
761and body-size from the body_details table described below, thus
762supporting the multiple body-types.
763
764If PURIFY is defined, or PERL_ARENA_SIZE=0, arenas are not used, and
765the (new|del)_X*V macros are mapped directly to malloc/free.
766
767*/
768
769/*
770
771For each sv-type, struct body_details bodies_by_type[] carries
772parameters which control these aspects of SV handling:
773
774Arena_size determines whether arenas are used for this body type, and if
775so, how big they are. PURIFY or PERL_ARENA_SIZE=0 set this field to
776zero, forcing individual mallocs and frees.
777
778Body_size determines how big a body is, and therefore how many fit into
779each arena. Offset carries the body-pointer adjustment needed for
780*_allocated body types, and is used in *_allocated macros.
781
782But its main purpose is to parameterize info needed in
783Perl_sv_upgrade(). The info here dramatically simplifies the function
784vs the implementation in 5.8.7, making it table-driven. All fields
785are used for this, except for arena_size.
786
787For the sv-types that have no bodies, arenas are not used, so those
788PL_body_roots[sv_type] are unused, and can be overloaded. In
789something of a special case, SVt_NULL is borrowed for HE arenas;
c6f8b1d0 790PL_body_roots[HE_SVSLOT=SVt_NULL] is filled by S_more_he, but the
d2a0f284 791bodies_by_type[SVt_NULL] slot is not used, as the table is not
c6f8b1d0 792available in hv.c.
d2a0f284 793
c6f8b1d0
JC
794PTEs also use arenas, but are never seen in Perl_sv_upgrade. Nonetheless,
795they get their own slot in bodies_by_type[PTE_SVSLOT =SVt_IV], so they can
796just use the same allocation semantics. At first, PTEs were also
797overloaded to a non-body sv-type, but this yielded hard-to-find malloc
798bugs, so was simplified by claiming a new slot. This choice has no
799consequence at this time.
d2a0f284 800
29489e7c
DM
801*/
802
bd81e77b 803struct body_details {
0fb58b32 804 U8 body_size; /* Size to allocate */
10666ae3 805 U8 copy; /* Size of structure to copy (may be shorter) */
0fb58b32 806 U8 offset;
10666ae3
NC
807 unsigned int type : 4; /* We have space for a sanity check. */
808 unsigned int cant_upgrade : 1; /* Cannot upgrade this type */
809 unsigned int zero_nv : 1; /* zero the NV when upgrading from this */
810 unsigned int arena : 1; /* Allocated from an arena */
811 size_t arena_size; /* Size of arena to allocate */
bd81e77b 812};
29489e7c 813
bd81e77b
NC
814#define HADNV FALSE
815#define NONV TRUE
29489e7c 816
d2a0f284 817
bd81e77b
NC
818#ifdef PURIFY
819/* With -DPURFIY we allocate everything directly, and don't use arenas.
820 This seems a rather elegant way to simplify some of the code below. */
821#define HASARENA FALSE
822#else
823#define HASARENA TRUE
824#endif
825#define NOARENA FALSE
29489e7c 826
d2a0f284
JC
827/* Size the arenas to exactly fit a given number of bodies. A count
828 of 0 fits the max number bodies into a PERL_ARENA_SIZE.block,
829 simplifying the default. If count > 0, the arena is sized to fit
830 only that many bodies, allowing arenas to be used for large, rare
831 bodies (XPVFM, XPVIO) without undue waste. The arena size is
832 limited by PERL_ARENA_SIZE, so we can safely oversize the
833 declarations.
834 */
95db5f15
MB
835#define FIT_ARENA0(body_size) \
836 ((size_t)(PERL_ARENA_SIZE / body_size) * body_size)
837#define FIT_ARENAn(count,body_size) \
838 ( count * body_size <= PERL_ARENA_SIZE) \
839 ? count * body_size \
840 : FIT_ARENA0 (body_size)
841#define FIT_ARENA(count,body_size) \
842 count \
843 ? FIT_ARENAn (count, body_size) \
844 : FIT_ARENA0 (body_size)
d2a0f284 845
bd81e77b 846/* A macro to work out the offset needed to subtract from a pointer to (say)
29489e7c 847
bd81e77b
NC
848typedef struct {
849 STRLEN xpv_cur;
850 STRLEN xpv_len;
851} xpv_allocated;
29489e7c 852
bd81e77b 853to make its members accessible via a pointer to (say)
29489e7c 854
bd81e77b
NC
855struct xpv {
856 NV xnv_nv;
857 STRLEN xpv_cur;
858 STRLEN xpv_len;
859};
29489e7c 860
bd81e77b 861*/
29489e7c 862
bd81e77b
NC
863#define relative_STRUCT_OFFSET(longer, shorter, member) \
864 (STRUCT_OFFSET(shorter, member) - STRUCT_OFFSET(longer, member))
29489e7c 865
bd81e77b
NC
866/* Calculate the length to copy. Specifically work out the length less any
867 final padding the compiler needed to add. See the comment in sv_upgrade
868 for why copying the padding proved to be a bug. */
29489e7c 869
bd81e77b
NC
870#define copy_length(type, last_member) \
871 STRUCT_OFFSET(type, last_member) \
872 + sizeof (((type*)SvANY((SV*)0))->last_member)
29489e7c 873
bd81e77b 874static const struct body_details bodies_by_type[] = {
10666ae3
NC
875 { sizeof(HE), 0, 0, SVt_NULL,
876 FALSE, NONV, NOARENA, FIT_ARENA(0, sizeof(HE)) },
d2a0f284 877
1cb9cd50 878 /* The bind placeholder pretends to be an RV for now.
c6f8b1d0 879 Also it's marked as "can't upgrade" to stop anyone using it before it's
1cb9cd50
NC
880 implemented. */
881 { 0, 0, 0, SVt_BIND, TRUE, NONV, NOARENA, 0 },
882
d2a0f284
JC
883 /* IVs are in the head, so the allocation size is 0.
884 However, the slot is overloaded for PTEs. */
885 { sizeof(struct ptr_tbl_ent), /* This is used for PTEs. */
886 sizeof(IV), /* This is used to copy out the IV body. */
10666ae3 887 STRUCT_OFFSET(XPVIV, xiv_iv), SVt_IV, FALSE, NONV,
d2a0f284
JC
888 NOARENA /* IVS don't need an arena */,
889 /* But PTEs need to know the size of their arena */
890 FIT_ARENA(0, sizeof(struct ptr_tbl_ent))
891 },
892
bd81e77b 893 /* 8 bytes on most ILP32 with IEEE doubles */
10666ae3 894 { sizeof(NV), sizeof(NV), 0, SVt_NV, FALSE, HADNV, HASARENA,
d2a0f284
JC
895 FIT_ARENA(0, sizeof(NV)) },
896
bd81e77b 897 /* 8 bytes on most ILP32 with IEEE doubles */
d2a0f284
JC
898 { sizeof(xpv_allocated),
899 copy_length(XPV, xpv_len)
900 - relative_STRUCT_OFFSET(xpv_allocated, XPV, xpv_cur),
901 + relative_STRUCT_OFFSET(xpv_allocated, XPV, xpv_cur),
10666ae3 902 SVt_PV, FALSE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpv_allocated)) },
d2a0f284 903
bd81e77b 904 /* 12 */
d2a0f284
JC
905 { sizeof(xpviv_allocated),
906 copy_length(XPVIV, xiv_u)
907 - relative_STRUCT_OFFSET(xpviv_allocated, XPVIV, xpv_cur),
908 + relative_STRUCT_OFFSET(xpviv_allocated, XPVIV, xpv_cur),
10666ae3 909 SVt_PVIV, FALSE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpviv_allocated)) },
d2a0f284 910
bd81e77b 911 /* 20 */
10666ae3 912 { sizeof(XPVNV), copy_length(XPVNV, xiv_u), 0, SVt_PVNV, FALSE, HADNV,
d2a0f284
JC
913 HASARENA, FIT_ARENA(0, sizeof(XPVNV)) },
914
bd81e77b 915 /* 28 */
10666ae3 916 { sizeof(XPVMG), copy_length(XPVMG, xmg_stash), 0, SVt_PVMG, FALSE, HADNV,
d2a0f284 917 HASARENA, FIT_ARENA(0, sizeof(XPVMG)) },
4df7f6af 918
288b8c02
NC
919 /* something big */
920 { sizeof(struct regexp), sizeof(struct regexp), 0,
921 SVt_REGEXP, FALSE, HADNV, HASARENA, FIT_ARENA(0, sizeof(struct regexp))
5c35adbb 922 },
4df7f6af 923
bd81e77b 924 /* 48 */
10666ae3 925 { sizeof(XPVGV), sizeof(XPVGV), 0, SVt_PVGV, TRUE, HADNV,
d2a0f284
JC
926 HASARENA, FIT_ARENA(0, sizeof(XPVGV)) },
927
bd81e77b 928 /* 64 */
10666ae3 929 { sizeof(XPVLV), sizeof(XPVLV), 0, SVt_PVLV, TRUE, HADNV,
d2a0f284
JC
930 HASARENA, FIT_ARENA(0, sizeof(XPVLV)) },
931
932 { sizeof(xpvav_allocated),
933 copy_length(XPVAV, xmg_stash)
934 - relative_STRUCT_OFFSET(xpvav_allocated, XPVAV, xav_fill),
935 + relative_STRUCT_OFFSET(xpvav_allocated, XPVAV, xav_fill),
9c59bb28 936 SVt_PVAV, TRUE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpvav_allocated)) },
d2a0f284
JC
937
938 { sizeof(xpvhv_allocated),
939 copy_length(XPVHV, xmg_stash)
940 - relative_STRUCT_OFFSET(xpvhv_allocated, XPVHV, xhv_fill),
941 + relative_STRUCT_OFFSET(xpvhv_allocated, XPVHV, xhv_fill),
9c59bb28 942 SVt_PVHV, TRUE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpvhv_allocated)) },
d2a0f284 943
c84c4652 944 /* 56 */
4115f141 945 { sizeof(xpvcv_allocated), sizeof(xpvcv_allocated),
c84c4652 946 + relative_STRUCT_OFFSET(xpvcv_allocated, XPVCV, xpv_cur),
10666ae3 947 SVt_PVCV, TRUE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpvcv_allocated)) },
d2a0f284 948
4115f141 949 { sizeof(xpvfm_allocated), sizeof(xpvfm_allocated),
3038937b 950 + relative_STRUCT_OFFSET(xpvfm_allocated, XPVFM, xpv_cur),
10666ae3 951 SVt_PVFM, TRUE, NONV, NOARENA, FIT_ARENA(20, sizeof(xpvfm_allocated)) },
d2a0f284
JC
952
953 /* XPVIO is 84 bytes, fits 48x */
10666ae3 954 { sizeof(XPVIO), sizeof(XPVIO), 0, SVt_PVIO, TRUE, HADNV,
d2a0f284 955 HASARENA, FIT_ARENA(24, sizeof(XPVIO)) },
bd81e77b 956};
29489e7c 957
d2a0f284
JC
958#define new_body_type(sv_type) \
959 (void *)((char *)S_new_body(aTHX_ sv_type))
29489e7c 960
bd81e77b
NC
961#define del_body_type(p, sv_type) \
962 del_body(p, &PL_body_roots[sv_type])
29489e7c 963
29489e7c 964
bd81e77b 965#define new_body_allocated(sv_type) \
d2a0f284 966 (void *)((char *)S_new_body(aTHX_ sv_type) \
bd81e77b 967 - bodies_by_type[sv_type].offset)
29489e7c 968
bd81e77b
NC
969#define del_body_allocated(p, sv_type) \
970 del_body(p + bodies_by_type[sv_type].offset, &PL_body_roots[sv_type])
29489e7c 971
29489e7c 972
bd81e77b
NC
973#define my_safemalloc(s) (void*)safemalloc(s)
974#define my_safecalloc(s) (void*)safecalloc(s, 1)
975#define my_safefree(p) safefree((char*)p)
29489e7c 976
bd81e77b 977#ifdef PURIFY
29489e7c 978
bd81e77b
NC
979#define new_XNV() my_safemalloc(sizeof(XPVNV))
980#define del_XNV(p) my_safefree(p)
29489e7c 981
bd81e77b
NC
982#define new_XPVNV() my_safemalloc(sizeof(XPVNV))
983#define del_XPVNV(p) my_safefree(p)
29489e7c 984
bd81e77b
NC
985#define new_XPVAV() my_safemalloc(sizeof(XPVAV))
986#define del_XPVAV(p) my_safefree(p)
29489e7c 987
bd81e77b
NC
988#define new_XPVHV() my_safemalloc(sizeof(XPVHV))
989#define del_XPVHV(p) my_safefree(p)
29489e7c 990
bd81e77b
NC
991#define new_XPVMG() my_safemalloc(sizeof(XPVMG))
992#define del_XPVMG(p) my_safefree(p)
29489e7c 993
bd81e77b
NC
994#define new_XPVGV() my_safemalloc(sizeof(XPVGV))
995#define del_XPVGV(p) my_safefree(p)
29489e7c 996
bd81e77b 997#else /* !PURIFY */
29489e7c 998
bd81e77b
NC
999#define new_XNV() new_body_type(SVt_NV)
1000#define del_XNV(p) del_body_type(p, SVt_NV)
29489e7c 1001
bd81e77b
NC
1002#define new_XPVNV() new_body_type(SVt_PVNV)
1003#define del_XPVNV(p) del_body_type(p, SVt_PVNV)
29489e7c 1004
bd81e77b
NC
1005#define new_XPVAV() new_body_allocated(SVt_PVAV)
1006#define del_XPVAV(p) del_body_allocated(p, SVt_PVAV)
645c22ef 1007
bd81e77b
NC
1008#define new_XPVHV() new_body_allocated(SVt_PVHV)
1009#define del_XPVHV(p) del_body_allocated(p, SVt_PVHV)
645c22ef 1010
bd81e77b
NC
1011#define new_XPVMG() new_body_type(SVt_PVMG)
1012#define del_XPVMG(p) del_body_type(p, SVt_PVMG)
645c22ef 1013
bd81e77b
NC
1014#define new_XPVGV() new_body_type(SVt_PVGV)
1015#define del_XPVGV(p) del_body_type(p, SVt_PVGV)
1d7c1841 1016
bd81e77b 1017#endif /* PURIFY */
93e68bfb 1018
bd81e77b 1019/* no arena for you! */
93e68bfb 1020
bd81e77b 1021#define new_NOARENA(details) \
d2a0f284 1022 my_safemalloc((details)->body_size + (details)->offset)
bd81e77b 1023#define new_NOARENAZ(details) \
d2a0f284
JC
1024 my_safecalloc((details)->body_size + (details)->offset)
1025
1026STATIC void *
1027S_more_bodies (pTHX_ svtype sv_type)
1028{
1029 dVAR;
1030 void ** const root = &PL_body_roots[sv_type];
96a5add6 1031 const struct body_details * const bdp = &bodies_by_type[sv_type];
d2a0f284
JC
1032 const size_t body_size = bdp->body_size;
1033 char *start;
1034 const char *end;
0b2d3faa 1035#if defined(DEBUGGING) && !defined(PERL_GLOBAL_STRUCT_PRIVATE)
23e9d66c
NC
1036 static bool done_sanity_check;
1037
0b2d3faa
JH
1038 /* PERL_GLOBAL_STRUCT_PRIVATE cannot coexist with global
1039 * variables like done_sanity_check. */
10666ae3 1040 if (!done_sanity_check) {
ea471437 1041 unsigned int i = SVt_LAST;
10666ae3
NC
1042
1043 done_sanity_check = TRUE;
1044
1045 while (i--)
1046 assert (bodies_by_type[i].type == i);
1047 }
1048#endif
1049
23e9d66c
NC
1050 assert(bdp->arena_size);
1051
0a848332 1052 start = (char*) Perl_get_arena(aTHX_ bdp->arena_size, sv_type);
d2a0f284
JC
1053
1054 end = start + bdp->arena_size - body_size;
1055
d2a0f284
JC
1056 /* computed count doesnt reflect the 1st slot reservation */
1057 DEBUG_m(PerlIO_printf(Perl_debug_log,
1058 "arena %p end %p arena-size %d type %d size %d ct %d\n",
6c9570dc 1059 (void*)start, (void*)end,
0e84aef4
JH
1060 (int)bdp->arena_size, sv_type, (int)body_size,
1061 (int)bdp->arena_size / (int)body_size));
d2a0f284
JC
1062
1063 *root = (void *)start;
1064
1065 while (start < end) {
1066 char * const next = start + body_size;
1067 *(void**) start = (void *)next;
1068 start = next;
1069 }
1070 *(void **)start = 0;
1071
1072 return *root;
1073}
1074
1075/* grab a new thing from the free list, allocating more if necessary.
1076 The inline version is used for speed in hot routines, and the
1077 function using it serves the rest (unless PURIFY).
1078*/
1079#define new_body_inline(xpv, sv_type) \
1080 STMT_START { \
1081 void ** const r3wt = &PL_body_roots[sv_type]; \
11b79775
DD
1082 xpv = (PTR_TBL_ENT_t*) (*((void **)(r3wt)) \
1083 ? *((void **)(r3wt)) : more_bodies(sv_type)); \
d2a0f284 1084 *(r3wt) = *(void**)(xpv); \
d2a0f284
JC
1085 } STMT_END
1086
1087#ifndef PURIFY
1088
1089STATIC void *
1090S_new_body(pTHX_ svtype sv_type)
1091{
1092 dVAR;
1093 void *xpv;
1094 new_body_inline(xpv, sv_type);
1095 return xpv;
1096}
1097
1098#endif
93e68bfb 1099
238b27b3
NC
1100static const struct body_details fake_rv =
1101 { 0, 0, 0, SVt_IV, FALSE, NONV, NOARENA, 0 };
1102
bd81e77b
NC
1103/*
1104=for apidoc sv_upgrade
93e68bfb 1105
bd81e77b
NC
1106Upgrade an SV to a more complex form. Generally adds a new body type to the
1107SV, then copies across as much information as possible from the old body.
1108You generally want to use the C<SvUPGRADE> macro wrapper. See also C<svtype>.
93e68bfb 1109
bd81e77b 1110=cut
93e68bfb 1111*/
93e68bfb 1112
bd81e77b 1113void
42d0e0b7 1114Perl_sv_upgrade(pTHX_ register SV *sv, svtype new_type)
cac9b346 1115{
97aff369 1116 dVAR;
bd81e77b
NC
1117 void* old_body;
1118 void* new_body;
42d0e0b7 1119 const svtype old_type = SvTYPE(sv);
d2a0f284 1120 const struct body_details *new_type_details;
238b27b3 1121 const struct body_details *old_type_details
bd81e77b 1122 = bodies_by_type + old_type;
4df7f6af 1123 SV *referant = NULL;
cac9b346 1124
bd81e77b
NC
1125 if (new_type != SVt_PV && SvIsCOW(sv)) {
1126 sv_force_normal_flags(sv, 0);
1127 }
cac9b346 1128
bd81e77b
NC
1129 if (old_type == new_type)
1130 return;
cac9b346 1131
bd81e77b 1132 old_body = SvANY(sv);
de042e1d 1133
bd81e77b
NC
1134 /* Copying structures onto other structures that have been neatly zeroed
1135 has a subtle gotcha. Consider XPVMG
cac9b346 1136
bd81e77b
NC
1137 +------+------+------+------+------+-------+-------+
1138 | NV | CUR | LEN | IV | MAGIC | STASH |
1139 +------+------+------+------+------+-------+-------+
1140 0 4 8 12 16 20 24 28
645c22ef 1141
bd81e77b
NC
1142 where NVs are aligned to 8 bytes, so that sizeof that structure is
1143 actually 32 bytes long, with 4 bytes of padding at the end:
08742458 1144
bd81e77b
NC
1145 +------+------+------+------+------+-------+-------+------+
1146 | NV | CUR | LEN | IV | MAGIC | STASH | ??? |
1147 +------+------+------+------+------+-------+-------+------+
1148 0 4 8 12 16 20 24 28 32
08742458 1149
bd81e77b 1150 so what happens if you allocate memory for this structure:
30f9da9e 1151
bd81e77b
NC
1152 +------+------+------+------+------+-------+-------+------+------+...
1153 | NV | CUR | LEN | IV | MAGIC | STASH | GP | NAME |
1154 +------+------+------+------+------+-------+-------+------+------+...
1155 0 4 8 12 16 20 24 28 32 36
bfc44f79 1156
bd81e77b
NC
1157 zero it, then copy sizeof(XPVMG) bytes on top of it? Not quite what you
1158 expect, because you copy the area marked ??? onto GP. Now, ??? may have
1159 started out as zero once, but it's quite possible that it isn't. So now,
1160 rather than a nicely zeroed GP, you have it pointing somewhere random.
1161 Bugs ensue.
bfc44f79 1162
bd81e77b
NC
1163 (In fact, GP ends up pointing at a previous GP structure, because the
1164 principle cause of the padding in XPVMG getting garbage is a copy of
6c9e42f7
NC
1165 sizeof(XPVMG) bytes from a XPVGV structure in sv_unglob. Right now
1166 this happens to be moot because XPVGV has been re-ordered, with GP
1167 no longer after STASH)
30f9da9e 1168
bd81e77b
NC
1169 So we are careful and work out the size of used parts of all the
1170 structures. */
bfc44f79 1171
bd81e77b
NC
1172 switch (old_type) {
1173 case SVt_NULL:
1174 break;
1175 case SVt_IV:
4df7f6af
NC
1176 if (SvROK(sv)) {
1177 referant = SvRV(sv);
238b27b3
NC
1178 old_type_details = &fake_rv;
1179 if (new_type == SVt_NV)
1180 new_type = SVt_PVNV;
4df7f6af
NC
1181 } else {
1182 if (new_type < SVt_PVIV) {
1183 new_type = (new_type == SVt_NV)
1184 ? SVt_PVNV : SVt_PVIV;
1185 }
bd81e77b
NC
1186 }
1187 break;
1188 case SVt_NV:
1189 if (new_type < SVt_PVNV) {
1190 new_type = SVt_PVNV;
bd81e77b
NC
1191 }
1192 break;
bd81e77b
NC
1193 case SVt_PV:
1194 assert(new_type > SVt_PV);
1195 assert(SVt_IV < SVt_PV);
1196 assert(SVt_NV < SVt_PV);
1197 break;
1198 case SVt_PVIV:
1199 break;
1200 case SVt_PVNV:
1201 break;
1202 case SVt_PVMG:
1203 /* Because the XPVMG of PL_mess_sv isn't allocated from the arena,
1204 there's no way that it can be safely upgraded, because perl.c
1205 expects to Safefree(SvANY(PL_mess_sv)) */
1206 assert(sv != PL_mess_sv);
1207 /* This flag bit is used to mean other things in other scalar types.
1208 Given that it only has meaning inside the pad, it shouldn't be set
1209 on anything that can get upgraded. */
00b1698f 1210 assert(!SvPAD_TYPED(sv));
bd81e77b
NC
1211 break;
1212 default:
1213 if (old_type_details->cant_upgrade)
c81225bc
NC
1214 Perl_croak(aTHX_ "Can't upgrade %s (%" UVuf ") to %" UVuf,
1215 sv_reftype(sv, 0), (UV) old_type, (UV) new_type);
bd81e77b 1216 }
3376de98
NC
1217
1218 if (old_type > new_type)
1219 Perl_croak(aTHX_ "sv_upgrade from type %d down to type %d",
1220 (int)old_type, (int)new_type);
1221
2fa1109b 1222 new_type_details = bodies_by_type + new_type;
645c22ef 1223
bd81e77b
NC
1224 SvFLAGS(sv) &= ~SVTYPEMASK;
1225 SvFLAGS(sv) |= new_type;
932e9ff9 1226
ab4416c0
NC
1227 /* This can't happen, as SVt_NULL is <= all values of new_type, so one of
1228 the return statements above will have triggered. */
1229 assert (new_type != SVt_NULL);
bd81e77b 1230 switch (new_type) {
bd81e77b
NC
1231 case SVt_IV:
1232 assert(old_type == SVt_NULL);
1233 SvANY(sv) = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
1234 SvIV_set(sv, 0);
1235 return;
1236 case SVt_NV:
1237 assert(old_type == SVt_NULL);
1238 SvANY(sv) = new_XNV();
1239 SvNV_set(sv, 0);
1240 return;
bd81e77b 1241 case SVt_PVHV:
bd81e77b 1242 case SVt_PVAV:
d2a0f284 1243 assert(new_type_details->body_size);
c1ae03ae
NC
1244
1245#ifndef PURIFY
1246 assert(new_type_details->arena);
d2a0f284 1247 assert(new_type_details->arena_size);
c1ae03ae 1248 /* This points to the start of the allocated area. */
d2a0f284
JC
1249 new_body_inline(new_body, new_type);
1250 Zero(new_body, new_type_details->body_size, char);
c1ae03ae
NC
1251 new_body = ((char *)new_body) - new_type_details->offset;
1252#else
1253 /* We always allocated the full length item with PURIFY. To do this
1254 we fake things so that arena is false for all 16 types.. */
1255 new_body = new_NOARENAZ(new_type_details);
1256#endif
1257 SvANY(sv) = new_body;
1258 if (new_type == SVt_PVAV) {
1259 AvMAX(sv) = -1;
1260 AvFILLp(sv) = -1;
1261 AvREAL_only(sv);
64484faa 1262 if (old_type_details->body_size) {
ac572bf4
NC
1263 AvALLOC(sv) = 0;
1264 } else {
1265 /* It will have been zeroed when the new body was allocated.
1266 Lets not write to it, in case it confuses a write-back
1267 cache. */
1268 }
78ac7dd9
NC
1269 } else {
1270 assert(!SvOK(sv));
1271 SvOK_off(sv);
1272#ifndef NODEFAULT_SHAREKEYS
1273 HvSHAREKEYS_on(sv); /* key-sharing on by default */
1274#endif
1275 HvMAX(sv) = 7; /* (start with 8 buckets) */
64484faa 1276 if (old_type_details->body_size) {
78ac7dd9
NC
1277 HvFILL(sv) = 0;
1278 } else {
1279 /* It will have been zeroed when the new body was allocated.
1280 Lets not write to it, in case it confuses a write-back
1281 cache. */
1282 }
c1ae03ae 1283 }
aeb18a1e 1284
bd81e77b
NC
1285 /* SVt_NULL isn't the only thing upgraded to AV or HV.
1286 The target created by newSVrv also is, and it can have magic.
1287 However, it never has SvPVX set.
1288 */
4df7f6af
NC
1289 if (old_type == SVt_IV) {
1290 assert(!SvROK(sv));
1291 } else if (old_type >= SVt_PV) {
bd81e77b
NC
1292 assert(SvPVX_const(sv) == 0);
1293 }
aeb18a1e 1294
bd81e77b 1295 if (old_type >= SVt_PVMG) {
e736a858 1296 SvMAGIC_set(sv, ((XPVMG*)old_body)->xmg_u.xmg_magic);
bd81e77b 1297 SvSTASH_set(sv, ((XPVMG*)old_body)->xmg_stash);
797c7171
NC
1298 } else {
1299 sv->sv_u.svu_array = NULL; /* or svu_hash */
bd81e77b
NC
1300 }
1301 break;
93e68bfb 1302
93e68bfb 1303
bd81e77b
NC
1304 case SVt_PVIV:
1305 /* XXX Is this still needed? Was it ever needed? Surely as there is
1306 no route from NV to PVIV, NOK can never be true */
1307 assert(!SvNOKp(sv));
1308 assert(!SvNOK(sv));
1309 case SVt_PVIO:
1310 case SVt_PVFM:
bd81e77b
NC
1311 case SVt_PVGV:
1312 case SVt_PVCV:
1313 case SVt_PVLV:
5c35adbb 1314 case SVt_REGEXP:
bd81e77b
NC
1315 case SVt_PVMG:
1316 case SVt_PVNV:
1317 case SVt_PV:
93e68bfb 1318
d2a0f284 1319 assert(new_type_details->body_size);
bd81e77b
NC
1320 /* We always allocated the full length item with PURIFY. To do this
1321 we fake things so that arena is false for all 16 types.. */
1322 if(new_type_details->arena) {
1323 /* This points to the start of the allocated area. */
d2a0f284
JC
1324 new_body_inline(new_body, new_type);
1325 Zero(new_body, new_type_details->body_size, char);
bd81e77b
NC
1326 new_body = ((char *)new_body) - new_type_details->offset;
1327 } else {
1328 new_body = new_NOARENAZ(new_type_details);
1329 }
1330 SvANY(sv) = new_body;
5e2fc214 1331
bd81e77b 1332 if (old_type_details->copy) {
f9ba3d20
NC
1333 /* There is now the potential for an upgrade from something without
1334 an offset (PVNV or PVMG) to something with one (PVCV, PVFM) */
1335 int offset = old_type_details->offset;
1336 int length = old_type_details->copy;
1337
1338 if (new_type_details->offset > old_type_details->offset) {
d4c19fe8 1339 const int difference
f9ba3d20
NC
1340 = new_type_details->offset - old_type_details->offset;
1341 offset += difference;
1342 length -= difference;
1343 }
1344 assert (length >= 0);
1345
1346 Copy((char *)old_body + offset, (char *)new_body + offset, length,
1347 char);
bd81e77b
NC
1348 }
1349
1350#ifndef NV_ZERO_IS_ALLBITS_ZERO
f2524eef 1351 /* If NV 0.0 is stores as all bits 0 then Zero() already creates a
e5ce394c
NC
1352 * correct 0.0 for us. Otherwise, if the old body didn't have an
1353 * NV slot, but the new one does, then we need to initialise the
1354 * freshly created NV slot with whatever the correct bit pattern is
1355 * for 0.0 */
e22a937e
NC
1356 if (old_type_details->zero_nv && !new_type_details->zero_nv
1357 && !isGV_with_GP(sv))
bd81e77b 1358 SvNV_set(sv, 0);
82048762 1359#endif
5e2fc214 1360
bd81e77b 1361 if (new_type == SVt_PVIO)
f2524eef 1362 IoPAGE_LEN(sv) = 60;
4df7f6af
NC
1363 if (old_type < SVt_PV) {
1364 /* referant will be NULL unless the old type was SVt_IV emulating
1365 SVt_RV */
1366 sv->sv_u.svu_rv = referant;
1367 }
bd81e77b
NC
1368 break;
1369 default:
afd78fd5
JH
1370 Perl_croak(aTHX_ "panic: sv_upgrade to unknown type %lu",
1371 (unsigned long)new_type);
bd81e77b 1372 }
73171d91 1373
d2a0f284
JC
1374 if (old_type_details->arena) {
1375 /* If there was an old body, then we need to free it.
1376 Note that there is an assumption that all bodies of types that
1377 can be upgraded came from arenas. Only the more complex non-
1378 upgradable types are allowed to be directly malloc()ed. */
bd81e77b
NC
1379#ifdef PURIFY
1380 my_safefree(old_body);
1381#else
1382 del_body((void*)((char*)old_body + old_type_details->offset),
1383 &PL_body_roots[old_type]);
1384#endif
1385 }
1386}
73171d91 1387
bd81e77b
NC
1388/*
1389=for apidoc sv_backoff
73171d91 1390
bd81e77b
NC
1391Remove any string offset. You should normally use the C<SvOOK_off> macro
1392wrapper instead.
73171d91 1393
bd81e77b 1394=cut
73171d91
NC
1395*/
1396
bd81e77b
NC
1397int
1398Perl_sv_backoff(pTHX_ register SV *sv)
1399{
96a5add6 1400 PERL_UNUSED_CONTEXT;
bd81e77b
NC
1401 assert(SvOOK(sv));
1402 assert(SvTYPE(sv) != SVt_PVHV);
1403 assert(SvTYPE(sv) != SVt_PVAV);
1404 if (SvIVX(sv)) {
1405 const char * const s = SvPVX_const(sv);
50af2e61 1406#ifdef DEBUGGING
e04fc022 1407 /* Validate the preceding buffer's sentinels to verify that no-one is
50af2e61
NC
1408 using it. */
1409 const U8 *p = (const U8*) s;
1410 const U8 *const real_start = p - SvIVX(sv);
1411 while (p > real_start) {
1412 --p;
1413 assert (*p == (U8)PTR2UV(p));
1414 }
1415#endif
bd81e77b
NC
1416 SvLEN_set(sv, SvLEN(sv) + SvIVX(sv));
1417 SvPV_set(sv, SvPVX(sv) - SvIVX(sv));
1418 SvIV_set(sv, 0);
1419 Move(s, SvPVX(sv), SvCUR(sv)+1, char);
1420 }
1421 SvFLAGS(sv) &= ~SVf_OOK;
1422 return 0;
1423}
73171d91 1424
bd81e77b
NC
1425/*
1426=for apidoc sv_grow
73171d91 1427
bd81e77b
NC
1428Expands the character buffer in the SV. If necessary, uses C<sv_unref> and
1429upgrades the SV to C<SVt_PV>. Returns a pointer to the character buffer.
1430Use the C<SvGROW> wrapper instead.
93e68bfb 1431
bd81e77b
NC
1432=cut
1433*/
93e68bfb 1434
bd81e77b
NC
1435char *
1436Perl_sv_grow(pTHX_ register SV *sv, register STRLEN newlen)
1437{
1438 register char *s;
93e68bfb 1439
5db06880
NC
1440 if (PL_madskills && newlen >= 0x100000) {
1441 PerlIO_printf(Perl_debug_log,
1442 "Allocation too large: %"UVxf"\n", (UV)newlen);
1443 }
bd81e77b
NC
1444#ifdef HAS_64K_LIMIT
1445 if (newlen >= 0x10000) {
1446 PerlIO_printf(Perl_debug_log,
1447 "Allocation too large: %"UVxf"\n", (UV)newlen);
1448 my_exit(1);
1449 }
1450#endif /* HAS_64K_LIMIT */
1451 if (SvROK(sv))
1452 sv_unref(sv);
1453 if (SvTYPE(sv) < SVt_PV) {
1454 sv_upgrade(sv, SVt_PV);
1455 s = SvPVX_mutable(sv);
1456 }
1457 else if (SvOOK(sv)) { /* pv is offset? */
1458 sv_backoff(sv);
1459 s = SvPVX_mutable(sv);
1460 if (newlen > SvLEN(sv))
1461 newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
1462#ifdef HAS_64K_LIMIT
1463 if (newlen >= 0x10000)
1464 newlen = 0xFFFF;
1465#endif
1466 }
1467 else
1468 s = SvPVX_mutable(sv);
aeb18a1e 1469
bd81e77b
NC
1470 if (newlen > SvLEN(sv)) { /* need more room? */
1471 newlen = PERL_STRLEN_ROUNDUP(newlen);
1472 if (SvLEN(sv) && s) {
1473#ifdef MYMALLOC
1474 const STRLEN l = malloced_size((void*)SvPVX_const(sv));
1475 if (newlen <= l) {
1476 SvLEN_set(sv, l);
1477 return s;
1478 } else
1479#endif
10edeb5d 1480 s = (char*)saferealloc(s, newlen);
bd81e77b
NC
1481 }
1482 else {
10edeb5d 1483 s = (char*)safemalloc(newlen);
bd81e77b
NC
1484 if (SvPVX_const(sv) && SvCUR(sv)) {
1485 Move(SvPVX_const(sv), s, (newlen < SvCUR(sv)) ? newlen : SvCUR(sv), char);
1486 }
1487 }
1488 SvPV_set(sv, s);
1489 SvLEN_set(sv, newlen);
1490 }
1491 return s;
1492}
aeb18a1e 1493
bd81e77b
NC
1494/*
1495=for apidoc sv_setiv
932e9ff9 1496
bd81e77b
NC
1497Copies an integer into the given SV, upgrading first if necessary.
1498Does not handle 'set' magic. See also C<sv_setiv_mg>.
463ee0b2 1499
bd81e77b
NC
1500=cut
1501*/
463ee0b2 1502
bd81e77b
NC
1503void
1504Perl_sv_setiv(pTHX_ register SV *sv, IV i)
1505{
97aff369 1506 dVAR;
bd81e77b
NC
1507 SV_CHECK_THINKFIRST_COW_DROP(sv);
1508 switch (SvTYPE(sv)) {
1509 case SVt_NULL:
bd81e77b 1510 case SVt_NV:
3376de98 1511 sv_upgrade(sv, SVt_IV);
bd81e77b 1512 break;
bd81e77b
NC
1513 case SVt_PV:
1514 sv_upgrade(sv, SVt_PVIV);
1515 break;
463ee0b2 1516
bd81e77b
NC
1517 case SVt_PVGV:
1518 case SVt_PVAV:
1519 case SVt_PVHV:
1520 case SVt_PVCV:
1521 case SVt_PVFM:
1522 case SVt_PVIO:
1523 Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
1524 OP_DESC(PL_op));
42d0e0b7 1525 default: NOOP;
bd81e77b
NC
1526 }
1527 (void)SvIOK_only(sv); /* validate number */
1528 SvIV_set(sv, i);
1529 SvTAINT(sv);
1530}
932e9ff9 1531
bd81e77b
NC
1532/*
1533=for apidoc sv_setiv_mg
d33b2eba 1534
bd81e77b 1535Like C<sv_setiv>, but also handles 'set' magic.
1c846c1f 1536
bd81e77b
NC
1537=cut
1538*/
d33b2eba 1539
bd81e77b
NC
1540void
1541Perl_sv_setiv_mg(pTHX_ register SV *sv, IV i)
1542{
1543 sv_setiv(sv,i);
1544 SvSETMAGIC(sv);
1545}
727879eb 1546
bd81e77b
NC
1547/*
1548=for apidoc sv_setuv
d33b2eba 1549
bd81e77b
NC
1550Copies an unsigned integer into the given SV, upgrading first if necessary.
1551Does not handle 'set' magic. See also C<sv_setuv_mg>.
9b94d1dd 1552
bd81e77b
NC
1553=cut
1554*/
d33b2eba 1555
bd81e77b
NC
1556void
1557Perl_sv_setuv(pTHX_ register SV *sv, UV u)
1558{
1559 /* With these two if statements:
1560 u=1.49 s=0.52 cu=72.49 cs=10.64 scripts=270 tests=20865
d33b2eba 1561
bd81e77b
NC
1562 without
1563 u=1.35 s=0.47 cu=73.45 cs=11.43 scripts=270 tests=20865
1c846c1f 1564
bd81e77b
NC
1565 If you wish to remove them, please benchmark to see what the effect is
1566 */
1567 if (u <= (UV)IV_MAX) {
1568 sv_setiv(sv, (IV)u);
1569 return;
1570 }
1571 sv_setiv(sv, 0);
1572 SvIsUV_on(sv);
1573 SvUV_set(sv, u);
1574}
d33b2eba 1575
bd81e77b
NC
1576/*
1577=for apidoc sv_setuv_mg
727879eb 1578
bd81e77b 1579Like C<sv_setuv>, but also handles 'set' magic.
9b94d1dd 1580
bd81e77b
NC
1581=cut
1582*/
5e2fc214 1583
bd81e77b
NC
1584void
1585Perl_sv_setuv_mg(pTHX_ register SV *sv, UV u)
1586{
bd81e77b
NC
1587 sv_setuv(sv,u);
1588 SvSETMAGIC(sv);
1589}
5e2fc214 1590
954c1994 1591/*
bd81e77b 1592=for apidoc sv_setnv
954c1994 1593
bd81e77b
NC
1594Copies a double into the given SV, upgrading first if necessary.
1595Does not handle 'set' magic. See also C<sv_setnv_mg>.
954c1994
GS
1596
1597=cut
1598*/
1599
63f97190 1600void
bd81e77b 1601Perl_sv_setnv(pTHX_ register SV *sv, NV num)
79072805 1602{
97aff369 1603 dVAR;
bd81e77b
NC
1604 SV_CHECK_THINKFIRST_COW_DROP(sv);
1605 switch (SvTYPE(sv)) {
79072805 1606 case SVt_NULL:
79072805 1607 case SVt_IV:
bd81e77b 1608 sv_upgrade(sv, SVt_NV);
79072805
LW
1609 break;
1610 case SVt_PV:
79072805 1611 case SVt_PVIV:
bd81e77b 1612 sv_upgrade(sv, SVt_PVNV);
79072805 1613 break;
bd4b1eb5 1614
bd4b1eb5 1615 case SVt_PVGV:
bd81e77b
NC
1616 case SVt_PVAV:
1617 case SVt_PVHV:
79072805 1618 case SVt_PVCV:
bd81e77b
NC
1619 case SVt_PVFM:
1620 case SVt_PVIO:
1621 Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
1622 OP_NAME(PL_op));
42d0e0b7 1623 default: NOOP;
2068cd4d 1624 }
bd81e77b
NC
1625 SvNV_set(sv, num);
1626 (void)SvNOK_only(sv); /* validate number */
1627 SvTAINT(sv);
79072805
LW
1628}
1629
645c22ef 1630/*
bd81e77b 1631=for apidoc sv_setnv_mg
645c22ef 1632
bd81e77b 1633Like C<sv_setnv>, but also handles 'set' magic.
645c22ef
DM
1634
1635=cut
1636*/
1637
bd81e77b
NC
1638void
1639Perl_sv_setnv_mg(pTHX_ register SV *sv, NV num)
79072805 1640{
bd81e77b
NC
1641 sv_setnv(sv,num);
1642 SvSETMAGIC(sv);
79072805
LW
1643}
1644
bd81e77b
NC
1645/* Print an "isn't numeric" warning, using a cleaned-up,
1646 * printable version of the offending string
1647 */
954c1994 1648
bd81e77b
NC
1649STATIC void
1650S_not_a_number(pTHX_ SV *sv)
79072805 1651{
97aff369 1652 dVAR;
bd81e77b
NC
1653 SV *dsv;
1654 char tmpbuf[64];
1655 const char *pv;
94463019
JH
1656
1657 if (DO_UTF8(sv)) {
84bafc02 1658 dsv = newSVpvs_flags("", SVs_TEMP);
94463019
JH
1659 pv = sv_uni_display(dsv, sv, 10, 0);
1660 } else {
1661 char *d = tmpbuf;
551405c4 1662 const char * const limit = tmpbuf + sizeof(tmpbuf) - 8;
94463019
JH
1663 /* each *s can expand to 4 chars + "...\0",
1664 i.e. need room for 8 chars */
ecdeb87c 1665
00b6aa41
AL
1666 const char *s = SvPVX_const(sv);
1667 const char * const end = s + SvCUR(sv);
1668 for ( ; s < end && d < limit; s++ ) {
94463019
JH
1669 int ch = *s & 0xFF;
1670 if (ch & 128 && !isPRINT_LC(ch)) {
1671 *d++ = 'M';
1672 *d++ = '-';
1673 ch &= 127;
1674 }
1675 if (ch == '\n') {
1676 *d++ = '\\';
1677 *d++ = 'n';
1678 }
1679 else if (ch == '\r') {
1680 *d++ = '\\';
1681 *d++ = 'r';
1682 }
1683 else if (ch == '\f') {
1684 *d++ = '\\';
1685 *d++ = 'f';
1686 }
1687 else if (ch == '\\') {
1688 *d++ = '\\';
1689 *d++ = '\\';
1690 }
1691 else if (ch == '\0') {
1692 *d++ = '\\';
1693 *d++ = '0';
1694 }
1695 else if (isPRINT_LC(ch))
1696 *d++ = ch;
1697 else {
1698 *d++ = '^';
1699 *d++ = toCTRL(ch);
1700 }
1701 }
1702 if (s < end) {
1703 *d++ = '.';
1704 *d++ = '.';
1705 *d++ = '.';
1706 }
1707 *d = '\0';
1708 pv = tmpbuf;
a0d0e21e 1709 }
a0d0e21e 1710
533c011a 1711 if (PL_op)
9014280d 1712 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019
JH
1713 "Argument \"%s\" isn't numeric in %s", pv,
1714 OP_DESC(PL_op));
a0d0e21e 1715 else
9014280d 1716 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019 1717 "Argument \"%s\" isn't numeric", pv);
a0d0e21e
LW
1718}
1719
c2988b20
NC
1720/*
1721=for apidoc looks_like_number
1722
645c22ef
DM
1723Test if the content of an SV looks like a number (or is a number).
1724C<Inf> and C<Infinity> are treated as numbers (so will not issue a
1725non-numeric warning), even if your atof() doesn't grok them.
c2988b20
NC
1726
1727=cut
1728*/
1729
1730I32
1731Perl_looks_like_number(pTHX_ SV *sv)
1732{
a3b680e6 1733 register const char *sbegin;
c2988b20
NC
1734 STRLEN len;
1735
1736 if (SvPOK(sv)) {
3f7c398e 1737 sbegin = SvPVX_const(sv);
c2988b20
NC
1738 len = SvCUR(sv);
1739 }
1740 else if (SvPOKp(sv))
83003860 1741 sbegin = SvPV_const(sv, len);
c2988b20 1742 else
e0ab1c0e 1743 return SvFLAGS(sv) & (SVf_NOK|SVp_NOK|SVf_IOK|SVp_IOK);
c2988b20
NC
1744 return grok_number(sbegin, len, NULL);
1745}
25da4f38 1746
19f6321d
NC
1747STATIC bool
1748S_glob_2number(pTHX_ GV * const gv)
180488f8
NC
1749{
1750 const U32 wasfake = SvFLAGS(gv) & SVf_FAKE;
1751 SV *const buffer = sv_newmortal();
1752
1753 /* FAKE globs can get coerced, so need to turn this off temporarily if it
1754 is on. */
1755 SvFAKE_off(gv);
1756 gv_efullname3(buffer, gv, "*");
1757 SvFLAGS(gv) |= wasfake;
1758
675c862f
AL
1759 /* We know that all GVs stringify to something that is not-a-number,
1760 so no need to test that. */
1761 if (ckWARN(WARN_NUMERIC))
1762 not_a_number(buffer);
1763 /* We just want something true to return, so that S_sv_2iuv_common
1764 can tail call us and return true. */
19f6321d 1765 return TRUE;
675c862f
AL
1766}
1767
1768STATIC char *
19f6321d 1769S_glob_2pv(pTHX_ GV * const gv, STRLEN * const len)
675c862f
AL
1770{
1771 const U32 wasfake = SvFLAGS(gv) & SVf_FAKE;
1772 SV *const buffer = sv_newmortal();
1773
1774 /* FAKE globs can get coerced, so need to turn this off temporarily if it
1775 is on. */
1776 SvFAKE_off(gv);
1777 gv_efullname3(buffer, gv, "*");
1778 SvFLAGS(gv) |= wasfake;
1779
1780 assert(SvPOK(buffer));
a6d61a6c
NC
1781 if (len) {
1782 *len = SvCUR(buffer);
1783 }
675c862f 1784 return SvPVX(buffer);
180488f8
NC
1785}
1786
25da4f38
IZ
1787/* Actually, ISO C leaves conversion of UV to IV undefined, but
1788 until proven guilty, assume that things are not that bad... */
1789
645c22ef
DM
1790/*
1791 NV_PRESERVES_UV:
1792
1793 As 64 bit platforms often have an NV that doesn't preserve all bits of
28e5dec8
JH
1794 an IV (an assumption perl has been based on to date) it becomes necessary
1795 to remove the assumption that the NV always carries enough precision to
1796 recreate the IV whenever needed, and that the NV is the canonical form.
1797 Instead, IV/UV and NV need to be given equal rights. So as to not lose
645c22ef 1798 precision as a side effect of conversion (which would lead to insanity
28e5dec8
JH
1799 and the dragon(s) in t/op/numconvert.t getting very angry) the intent is
1800 1) to distinguish between IV/UV/NV slots that have cached a valid
1801 conversion where precision was lost and IV/UV/NV slots that have a
1802 valid conversion which has lost no precision
645c22ef 1803 2) to ensure that if a numeric conversion to one form is requested that
28e5dec8
JH
1804 would lose precision, the precise conversion (or differently
1805 imprecise conversion) is also performed and cached, to prevent
1806 requests for different numeric formats on the same SV causing
1807 lossy conversion chains. (lossless conversion chains are perfectly
1808 acceptable (still))
1809
1810
1811 flags are used:
1812 SvIOKp is true if the IV slot contains a valid value
1813 SvIOK is true only if the IV value is accurate (UV if SvIOK_UV true)
1814 SvNOKp is true if the NV slot contains a valid value
1815 SvNOK is true only if the NV value is accurate
1816
1817 so
645c22ef 1818 while converting from PV to NV, check to see if converting that NV to an
28e5dec8
JH
1819 IV(or UV) would lose accuracy over a direct conversion from PV to
1820 IV(or UV). If it would, cache both conversions, return NV, but mark
1821 SV as IOK NOKp (ie not NOK).
1822
645c22ef 1823 While converting from PV to IV, check to see if converting that IV to an
28e5dec8
JH
1824 NV would lose accuracy over a direct conversion from PV to NV. If it
1825 would, cache both conversions, flag similarly.
1826
1827 Before, the SV value "3.2" could become NV=3.2 IV=3 NOK, IOK quite
1828 correctly because if IV & NV were set NV *always* overruled.
645c22ef
DM
1829 Now, "3.2" will become NV=3.2 IV=3 NOK, IOKp, because the flag's meaning
1830 changes - now IV and NV together means that the two are interchangeable:
28e5dec8 1831 SvIVX == (IV) SvNVX && SvNVX == (NV) SvIVX;
d460ef45 1832
645c22ef
DM
1833 The benefit of this is that operations such as pp_add know that if
1834 SvIOK is true for both left and right operands, then integer addition
1835 can be used instead of floating point (for cases where the result won't
1836 overflow). Before, floating point was always used, which could lead to
28e5dec8
JH
1837 loss of precision compared with integer addition.
1838
1839 * making IV and NV equal status should make maths accurate on 64 bit
1840 platforms
1841 * may speed up maths somewhat if pp_add and friends start to use
645c22ef 1842 integers when possible instead of fp. (Hopefully the overhead in
28e5dec8
JH
1843 looking for SvIOK and checking for overflow will not outweigh the
1844 fp to integer speedup)
1845 * will slow down integer operations (callers of SvIV) on "inaccurate"
1846 values, as the change from SvIOK to SvIOKp will cause a call into
1847 sv_2iv each time rather than a macro access direct to the IV slot
1848 * should speed up number->string conversion on integers as IV is
645c22ef 1849 favoured when IV and NV are equally accurate
28e5dec8
JH
1850
1851 ####################################################################
645c22ef
DM
1852 You had better be using SvIOK_notUV if you want an IV for arithmetic:
1853 SvIOK is true if (IV or UV), so you might be getting (IV)SvUV.
1854 On the other hand, SvUOK is true iff UV.
28e5dec8
JH
1855 ####################################################################
1856
645c22ef 1857 Your mileage will vary depending your CPU's relative fp to integer
28e5dec8
JH
1858 performance ratio.
1859*/
1860
1861#ifndef NV_PRESERVES_UV
645c22ef
DM
1862# define IS_NUMBER_UNDERFLOW_IV 1
1863# define IS_NUMBER_UNDERFLOW_UV 2
1864# define IS_NUMBER_IV_AND_UV 2
1865# define IS_NUMBER_OVERFLOW_IV 4
1866# define IS_NUMBER_OVERFLOW_UV 5
1867
1868/* sv_2iuv_non_preserve(): private routine for use by sv_2iv() and sv_2uv() */
28e5dec8
JH
1869
1870/* For sv_2nv these three cases are "SvNOK and don't bother casting" */
1871STATIC int
645c22ef 1872S_sv_2iuv_non_preserve(pTHX_ register SV *sv, I32 numtype)
28e5dec8 1873{
97aff369 1874 dVAR;
b57a0404 1875 PERL_UNUSED_ARG(numtype); /* Used only under DEBUGGING? */
3f7c398e 1876 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
1877 if (SvNVX(sv) < (NV)IV_MIN) {
1878 (void)SvIOKp_on(sv);
1879 (void)SvNOK_on(sv);
45977657 1880 SvIV_set(sv, IV_MIN);
28e5dec8
JH
1881 return IS_NUMBER_UNDERFLOW_IV;
1882 }
1883 if (SvNVX(sv) > (NV)UV_MAX) {
1884 (void)SvIOKp_on(sv);
1885 (void)SvNOK_on(sv);
1886 SvIsUV_on(sv);
607fa7f2 1887 SvUV_set(sv, UV_MAX);
28e5dec8
JH
1888 return IS_NUMBER_OVERFLOW_UV;
1889 }
c2988b20
NC
1890 (void)SvIOKp_on(sv);
1891 (void)SvNOK_on(sv);
1892 /* Can't use strtol etc to convert this string. (See truth table in
1893 sv_2iv */
1894 if (SvNVX(sv) <= (UV)IV_MAX) {
45977657 1895 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
1896 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
1897 SvIOK_on(sv); /* Integer is precise. NOK, IOK */
1898 } else {
1899 /* Integer is imprecise. NOK, IOKp */
1900 }
1901 return SvNVX(sv) < 0 ? IS_NUMBER_UNDERFLOW_UV : IS_NUMBER_IV_AND_UV;
1902 }
1903 SvIsUV_on(sv);
607fa7f2 1904 SvUV_set(sv, U_V(SvNVX(sv)));
c2988b20
NC
1905 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
1906 if (SvUVX(sv) == UV_MAX) {
1907 /* As we know that NVs don't preserve UVs, UV_MAX cannot
1908 possibly be preserved by NV. Hence, it must be overflow.
1909 NOK, IOKp */
1910 return IS_NUMBER_OVERFLOW_UV;
1911 }
1912 SvIOK_on(sv); /* Integer is precise. NOK, UOK */
1913 } else {
1914 /* Integer is imprecise. NOK, IOKp */
28e5dec8 1915 }
c2988b20 1916 return IS_NUMBER_OVERFLOW_IV;
28e5dec8 1917}
645c22ef
DM
1918#endif /* !NV_PRESERVES_UV*/
1919
af359546
NC
1920STATIC bool
1921S_sv_2iuv_common(pTHX_ SV *sv) {
97aff369 1922 dVAR;
af359546 1923 if (SvNOKp(sv)) {
28e5dec8
JH
1924 /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
1925 * without also getting a cached IV/UV from it at the same time
1926 * (ie PV->NV conversion should detect loss of accuracy and cache
af359546
NC
1927 * IV or UV at same time to avoid this. */
1928 /* IV-over-UV optimisation - choose to cache IV if possible */
25da4f38
IZ
1929
1930 if (SvTYPE(sv) == SVt_NV)
1931 sv_upgrade(sv, SVt_PVNV);
1932
28e5dec8
JH
1933 (void)SvIOKp_on(sv); /* Must do this first, to clear any SvOOK */
1934 /* < not <= as for NV doesn't preserve UV, ((NV)IV_MAX+1) will almost
1935 certainly cast into the IV range at IV_MAX, whereas the correct
1936 answer is the UV IV_MAX +1. Hence < ensures that dodgy boundary
1937 cases go to UV */
cab190d4
JD
1938#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1939 if (Perl_isnan(SvNVX(sv))) {
1940 SvUV_set(sv, 0);
1941 SvIsUV_on(sv);
fdbe6d7c 1942 return FALSE;
cab190d4 1943 }
cab190d4 1944#endif
28e5dec8 1945 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
45977657 1946 SvIV_set(sv, I_V(SvNVX(sv)));
28e5dec8
JH
1947 if (SvNVX(sv) == (NV) SvIVX(sv)
1948#ifndef NV_PRESERVES_UV
1949 && (((UV)1 << NV_PRESERVES_UV_BITS) >
1950 (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
1951 /* Don't flag it as "accurately an integer" if the number
1952 came from a (by definition imprecise) NV operation, and
1953 we're outside the range of NV integer precision */
1954#endif
1955 ) {
1956 SvIOK_on(sv); /* Can this go wrong with rounding? NWC */
1957 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 1958 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (precise)\n",
28e5dec8
JH
1959 PTR2UV(sv),
1960 SvNVX(sv),
1961 SvIVX(sv)));
1962
1963 } else {
1964 /* IV not precise. No need to convert from PV, as NV
1965 conversion would already have cached IV if it detected
1966 that PV->IV would be better than PV->NV->IV
1967 flags already correct - don't set public IOK. */
1968 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 1969 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (imprecise)\n",
28e5dec8
JH
1970 PTR2UV(sv),
1971 SvNVX(sv),
1972 SvIVX(sv)));
1973 }
1974 /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
1975 but the cast (NV)IV_MIN rounds to a the value less (more
1976 negative) than IV_MIN which happens to be equal to SvNVX ??
1977 Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
1978 NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
1979 (NV)UVX == NVX are both true, but the values differ. :-(
1980 Hopefully for 2s complement IV_MIN is something like
1981 0x8000000000000000 which will be exact. NWC */
d460ef45 1982 }
25da4f38 1983 else {
607fa7f2 1984 SvUV_set(sv, U_V(SvNVX(sv)));
28e5dec8
JH
1985 if (
1986 (SvNVX(sv) == (NV) SvUVX(sv))
1987#ifndef NV_PRESERVES_UV
1988 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
1989 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
1990 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(sv))
1991 /* Don't flag it as "accurately an integer" if the number
1992 came from a (by definition imprecise) NV operation, and
1993 we're outside the range of NV integer precision */
1994#endif
1995 )
1996 SvIOK_on(sv);
25da4f38 1997 SvIsUV_on(sv);
1c846c1f 1998 DEBUG_c(PerlIO_printf(Perl_debug_log,
57def98f 1999 "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
56431972 2000 PTR2UV(sv),
57def98f
JH
2001 SvUVX(sv),
2002 SvUVX(sv)));
25da4f38 2003 }
748a9306
LW
2004 }
2005 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 2006 UV value;
504618e9 2007 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
af359546 2008 /* We want to avoid a possible problem when we cache an IV/ a UV which
25da4f38 2009 may be later translated to an NV, and the resulting NV is not
c2988b20
NC
2010 the same as the direct translation of the initial string
2011 (eg 123.456 can shortcut to the IV 123 with atol(), but we must
2012 be careful to ensure that the value with the .456 is around if the
2013 NV value is requested in the future).
1c846c1f 2014
af359546 2015 This means that if we cache such an IV/a UV, we need to cache the
25da4f38 2016 NV as well. Moreover, we trade speed for space, and do not
28e5dec8 2017 cache the NV if we are sure it's not needed.
25da4f38 2018 */
16b7a9a4 2019
c2988b20
NC
2020 /* SVt_PVNV is one higher than SVt_PVIV, hence this order */
2021 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2022 == IS_NUMBER_IN_UV) {
5e045b90 2023 /* It's definitely an integer, only upgrade to PVIV */
28e5dec8
JH
2024 if (SvTYPE(sv) < SVt_PVIV)
2025 sv_upgrade(sv, SVt_PVIV);
f7bbb42a 2026 (void)SvIOK_on(sv);
c2988b20
NC
2027 } else if (SvTYPE(sv) < SVt_PVNV)
2028 sv_upgrade(sv, SVt_PVNV);
28e5dec8 2029
f2524eef 2030 /* If NVs preserve UVs then we only use the UV value if we know that
c2988b20
NC
2031 we aren't going to call atof() below. If NVs don't preserve UVs
2032 then the value returned may have more precision than atof() will
2033 return, even though value isn't perfectly accurate. */
2034 if ((numtype & (IS_NUMBER_IN_UV
2035#ifdef NV_PRESERVES_UV
2036 | IS_NUMBER_NOT_INT
2037#endif
2038 )) == IS_NUMBER_IN_UV) {
2039 /* This won't turn off the public IOK flag if it was set above */
2040 (void)SvIOKp_on(sv);
2041
2042 if (!(numtype & IS_NUMBER_NEG)) {
2043 /* positive */;
2044 if (value <= (UV)IV_MAX) {
45977657 2045 SvIV_set(sv, (IV)value);
c2988b20 2046 } else {
af359546 2047 /* it didn't overflow, and it was positive. */
607fa7f2 2048 SvUV_set(sv, value);
c2988b20
NC
2049 SvIsUV_on(sv);
2050 }
2051 } else {
2052 /* 2s complement assumption */
2053 if (value <= (UV)IV_MIN) {
45977657 2054 SvIV_set(sv, -(IV)value);
c2988b20
NC
2055 } else {
2056 /* Too negative for an IV. This is a double upgrade, but
d1be9408 2057 I'm assuming it will be rare. */
c2988b20
NC
2058 if (SvTYPE(sv) < SVt_PVNV)
2059 sv_upgrade(sv, SVt_PVNV);
2060 SvNOK_on(sv);
2061 SvIOK_off(sv);
2062 SvIOKp_on(sv);
9d6ce603 2063 SvNV_set(sv, -(NV)value);
45977657 2064 SvIV_set(sv, IV_MIN);
c2988b20
NC
2065 }
2066 }
2067 }
2068 /* For !NV_PRESERVES_UV and IS_NUMBER_IN_UV and IS_NUMBER_NOT_INT we
2069 will be in the previous block to set the IV slot, and the next
2070 block to set the NV slot. So no else here. */
2071
2072 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2073 != IS_NUMBER_IN_UV) {
2074 /* It wasn't an (integer that doesn't overflow the UV). */
3f7c398e 2075 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8 2076
c2988b20
NC
2077 if (! numtype && ckWARN(WARN_NUMERIC))
2078 not_a_number(sv);
28e5dec8 2079
65202027 2080#if defined(USE_LONG_DOUBLE)
c2988b20
NC
2081 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%" PERL_PRIgldbl ")\n",
2082 PTR2UV(sv), SvNVX(sv)));
65202027 2083#else
1779d84d 2084 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"NVgf")\n",
c2988b20 2085 PTR2UV(sv), SvNVX(sv)));
65202027 2086#endif
28e5dec8 2087
28e5dec8 2088#ifdef NV_PRESERVES_UV
af359546
NC
2089 (void)SvIOKp_on(sv);
2090 (void)SvNOK_on(sv);
2091 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2092 SvIV_set(sv, I_V(SvNVX(sv)));
2093 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2094 SvIOK_on(sv);
2095 } else {
6f207bd3 2096 NOOP; /* Integer is imprecise. NOK, IOKp */
af359546
NC
2097 }
2098 /* UV will not work better than IV */
2099 } else {
2100 if (SvNVX(sv) > (NV)UV_MAX) {
2101 SvIsUV_on(sv);
2102 /* Integer is inaccurate. NOK, IOKp, is UV */
2103 SvUV_set(sv, UV_MAX);
af359546
NC
2104 } else {
2105 SvUV_set(sv, U_V(SvNVX(sv)));
2106 /* 0xFFFFFFFFFFFFFFFF not an issue in here, NVs
2107 NV preservse UV so can do correct comparison. */
2108 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2109 SvIOK_on(sv);
af359546 2110 } else {
6f207bd3 2111 NOOP; /* Integer is imprecise. NOK, IOKp, is UV */
af359546
NC
2112 }
2113 }
4b0c9573 2114 SvIsUV_on(sv);
af359546 2115 }
28e5dec8 2116#else /* NV_PRESERVES_UV */
c2988b20
NC
2117 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2118 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
af359546 2119 /* The IV/UV slot will have been set from value returned by
c2988b20
NC
2120 grok_number above. The NV slot has just been set using
2121 Atof. */
560b0c46 2122 SvNOK_on(sv);
c2988b20
NC
2123 assert (SvIOKp(sv));
2124 } else {
2125 if (((UV)1 << NV_PRESERVES_UV_BITS) >
2126 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2127 /* Small enough to preserve all bits. */
2128 (void)SvIOKp_on(sv);
2129 SvNOK_on(sv);
45977657 2130 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
2131 if ((NV)(SvIVX(sv)) == SvNVX(sv))
2132 SvIOK_on(sv);
2133 /* Assumption: first non-preserved integer is < IV_MAX,
2134 this NV is in the preserved range, therefore: */
2135 if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
2136 < (UV)IV_MAX)) {
32fdb065 2137 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
2138 }
2139 } else {
2140 /* IN_UV NOT_INT
2141 0 0 already failed to read UV.
2142 0 1 already failed to read UV.
2143 1 0 you won't get here in this case. IV/UV
2144 slot set, public IOK, Atof() unneeded.
2145 1 1 already read UV.
2146 so there's no point in sv_2iuv_non_preserve() attempting
2147 to use atol, strtol, strtoul etc. */
40a17c4c 2148 sv_2iuv_non_preserve (sv, numtype);
c2988b20
NC
2149 }
2150 }
28e5dec8 2151#endif /* NV_PRESERVES_UV */
25da4f38 2152 }
af359546
NC
2153 }
2154 else {
675c862f 2155 if (isGV_with_GP(sv))
a0933d07 2156 return glob_2number((GV *)sv);
180488f8 2157
af359546
NC
2158 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
2159 if (!PL_localizing && ckWARN(WARN_UNINITIALIZED))
2160 report_uninit(sv);
2161 }
25da4f38
IZ
2162 if (SvTYPE(sv) < SVt_IV)
2163 /* Typically the caller expects that sv_any is not NULL now. */
2164 sv_upgrade(sv, SVt_IV);
af359546
NC
2165 /* Return 0 from the caller. */
2166 return TRUE;
2167 }
2168 return FALSE;
2169}
2170
2171/*
2172=for apidoc sv_2iv_flags
2173
2174Return the integer value of an SV, doing any necessary string
2175conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2176Normally used via the C<SvIV(sv)> and C<SvIVx(sv)> macros.
2177
2178=cut
2179*/
2180
2181IV
2182Perl_sv_2iv_flags(pTHX_ register SV *sv, I32 flags)
2183{
97aff369 2184 dVAR;
af359546 2185 if (!sv)
a0d0e21e 2186 return 0;
cecf5685
NC
2187 if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
2188 /* FBMs use the same flag bit as SVf_IVisUV, so must let them
50caf62e
NC
2189 cache IVs just in case. In practice it seems that they never
2190 actually anywhere accessible by user Perl code, let alone get used
2191 in anything other than a string context. */
af359546
NC
2192 if (flags & SV_GMAGIC)
2193 mg_get(sv);
2194 if (SvIOKp(sv))
2195 return SvIVX(sv);
2196 if (SvNOKp(sv)) {
2197 return I_V(SvNVX(sv));
2198 }
71c558c3
NC
2199 if (SvPOKp(sv) && SvLEN(sv)) {
2200 UV value;
2201 const int numtype
2202 = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2203
2204 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2205 == IS_NUMBER_IN_UV) {
2206 /* It's definitely an integer */
2207 if (numtype & IS_NUMBER_NEG) {
2208 if (value < (UV)IV_MIN)
2209 return -(IV)value;
2210 } else {
2211 if (value < (UV)IV_MAX)
2212 return (IV)value;
2213 }
2214 }
2215 if (!numtype) {
2216 if (ckWARN(WARN_NUMERIC))
2217 not_a_number(sv);
2218 }
2219 return I_V(Atof(SvPVX_const(sv)));
2220 }
1c7ff15e
NC
2221 if (SvROK(sv)) {
2222 goto return_rok;
af359546 2223 }
1c7ff15e
NC
2224 assert(SvTYPE(sv) >= SVt_PVMG);
2225 /* This falls through to the report_uninit inside S_sv_2iuv_common. */
4cb1ec55 2226 } else if (SvTHINKFIRST(sv)) {
af359546 2227 if (SvROK(sv)) {
1c7ff15e 2228 return_rok:
af359546
NC
2229 if (SvAMAGIC(sv)) {
2230 SV * const tmpstr=AMG_CALLun(sv,numer);
2231 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2232 return SvIV(tmpstr);
2233 }
2234 }
2235 return PTR2IV(SvRV(sv));
2236 }
2237 if (SvIsCOW(sv)) {
2238 sv_force_normal_flags(sv, 0);
2239 }
2240 if (SvREADONLY(sv) && !SvOK(sv)) {
2241 if (ckWARN(WARN_UNINITIALIZED))
2242 report_uninit(sv);
2243 return 0;
2244 }
2245 }
2246 if (!SvIOKp(sv)) {
2247 if (S_sv_2iuv_common(aTHX_ sv))
2248 return 0;
79072805 2249 }
1d7c1841
GS
2250 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
2251 PTR2UV(sv),SvIVX(sv)));
25da4f38 2252 return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
79072805
LW
2253}
2254
645c22ef 2255/*
891f9566 2256=for apidoc sv_2uv_flags
645c22ef
DM
2257
2258Return the unsigned integer value of an SV, doing any necessary string
891f9566
YST
2259conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2260Normally used via the C<SvUV(sv)> and C<SvUVx(sv)> macros.
645c22ef
DM
2261
2262=cut
2263*/
2264
ff68c719 2265UV
891f9566 2266Perl_sv_2uv_flags(pTHX_ register SV *sv, I32 flags)
ff68c719 2267{
97aff369 2268 dVAR;
ff68c719 2269 if (!sv)
2270 return 0;
cecf5685
NC
2271 if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
2272 /* FBMs use the same flag bit as SVf_IVisUV, so must let them
50caf62e 2273 cache IVs just in case. */
891f9566
YST
2274 if (flags & SV_GMAGIC)
2275 mg_get(sv);
ff68c719 2276 if (SvIOKp(sv))
2277 return SvUVX(sv);
2278 if (SvNOKp(sv))
2279 return U_V(SvNVX(sv));
71c558c3
NC
2280 if (SvPOKp(sv) && SvLEN(sv)) {
2281 UV value;
2282 const int numtype
2283 = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2284
2285 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2286 == IS_NUMBER_IN_UV) {
2287 /* It's definitely an integer */
2288 if (!(numtype & IS_NUMBER_NEG))
2289 return value;
2290 }
2291 if (!numtype) {
2292 if (ckWARN(WARN_NUMERIC))
2293 not_a_number(sv);
2294 }
2295 return U_V(Atof(SvPVX_const(sv)));
2296 }
1c7ff15e
NC
2297 if (SvROK(sv)) {
2298 goto return_rok;
3fe9a6f1 2299 }
1c7ff15e
NC
2300 assert(SvTYPE(sv) >= SVt_PVMG);
2301 /* This falls through to the report_uninit inside S_sv_2iuv_common. */
4cb1ec55 2302 } else if (SvTHINKFIRST(sv)) {
ff68c719 2303 if (SvROK(sv)) {
1c7ff15e 2304 return_rok:
deb46114
NC
2305 if (SvAMAGIC(sv)) {
2306 SV *const tmpstr = AMG_CALLun(sv,numer);
2307 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2308 return SvUV(tmpstr);
2309 }
2310 }
2311 return PTR2UV(SvRV(sv));
ff68c719 2312 }
765f542d
NC
2313 if (SvIsCOW(sv)) {
2314 sv_force_normal_flags(sv, 0);
8a818333 2315 }
0336b60e 2316 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2317 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2318 report_uninit(sv);
ff68c719 2319 return 0;
2320 }
2321 }
af359546
NC
2322 if (!SvIOKp(sv)) {
2323 if (S_sv_2iuv_common(aTHX_ sv))
2324 return 0;
ff68c719 2325 }
25da4f38 2326
1d7c1841
GS
2327 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
2328 PTR2UV(sv),SvUVX(sv)));
25da4f38 2329 return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
ff68c719 2330}
2331
645c22ef
DM
2332/*
2333=for apidoc sv_2nv
2334
2335Return the num value of an SV, doing any necessary string or integer
2336conversion, magic etc. Normally used via the C<SvNV(sv)> and C<SvNVx(sv)>
2337macros.
2338
2339=cut
2340*/
2341
65202027 2342NV
864dbfa3 2343Perl_sv_2nv(pTHX_ register SV *sv)
79072805 2344{
97aff369 2345 dVAR;
79072805
LW
2346 if (!sv)
2347 return 0.0;
cecf5685
NC
2348 if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
2349 /* FBMs use the same flag bit as SVf_IVisUV, so must let them
50caf62e 2350 cache IVs just in case. */
463ee0b2
LW
2351 mg_get(sv);
2352 if (SvNOKp(sv))
2353 return SvNVX(sv);
0aa395f8 2354 if ((SvPOKp(sv) && SvLEN(sv)) && !SvIOKp(sv)) {
041457d9 2355 if (!SvIOKp(sv) && ckWARN(WARN_NUMERIC) &&
504618e9 2356 !grok_number(SvPVX_const(sv), SvCUR(sv), NULL))
a0d0e21e 2357 not_a_number(sv);
3f7c398e 2358 return Atof(SvPVX_const(sv));
a0d0e21e 2359 }
25da4f38 2360 if (SvIOKp(sv)) {
1c846c1f 2361 if (SvIsUV(sv))
65202027 2362 return (NV)SvUVX(sv);
25da4f38 2363 else
65202027 2364 return (NV)SvIVX(sv);
47a72cb8
NC
2365 }
2366 if (SvROK(sv)) {
2367 goto return_rok;
2368 }
2369 assert(SvTYPE(sv) >= SVt_PVMG);
2370 /* This falls through to the report_uninit near the end of the
2371 function. */
2372 } else if (SvTHINKFIRST(sv)) {
a0d0e21e 2373 if (SvROK(sv)) {
47a72cb8 2374 return_rok:
deb46114
NC
2375 if (SvAMAGIC(sv)) {
2376 SV *const tmpstr = AMG_CALLun(sv,numer);
2377 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2378 return SvNV(tmpstr);
2379 }
2380 }
2381 return PTR2NV(SvRV(sv));
a0d0e21e 2382 }
765f542d
NC
2383 if (SvIsCOW(sv)) {
2384 sv_force_normal_flags(sv, 0);
8a818333 2385 }
0336b60e 2386 if (SvREADONLY(sv) && !SvOK(sv)) {
599cee73 2387 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2388 report_uninit(sv);
ed6116ce
LW
2389 return 0.0;
2390 }
79072805
LW
2391 }
2392 if (SvTYPE(sv) < SVt_NV) {
7e25a7e9
NC
2393 /* The logic to use SVt_PVNV if necessary is in sv_upgrade. */
2394 sv_upgrade(sv, SVt_NV);
906f284f 2395#ifdef USE_LONG_DOUBLE
097ee67d 2396 DEBUG_c({
f93f4e46 2397 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
2398 PerlIO_printf(Perl_debug_log,
2399 "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
2400 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
2401 RESTORE_NUMERIC_LOCAL();
2402 });
65202027 2403#else
572bbb43 2404 DEBUG_c({
f93f4e46 2405 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 2406 PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%"NVgf")\n",
1d7c1841 2407 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
2408 RESTORE_NUMERIC_LOCAL();
2409 });
572bbb43 2410#endif
79072805
LW
2411 }
2412 else if (SvTYPE(sv) < SVt_PVNV)
2413 sv_upgrade(sv, SVt_PVNV);
59d8ce62
NC
2414 if (SvNOKp(sv)) {
2415 return SvNVX(sv);
61604483 2416 }
59d8ce62 2417 if (SvIOKp(sv)) {
9d6ce603 2418 SvNV_set(sv, SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv));
28e5dec8
JH
2419#ifdef NV_PRESERVES_UV
2420 SvNOK_on(sv);
2421#else
2422 /* Only set the public NV OK flag if this NV preserves the IV */
2423 /* Check it's not 0xFFFFFFFFFFFFFFFF */
2424 if (SvIsUV(sv) ? ((SvUVX(sv) != UV_MAX)&&(SvUVX(sv) == U_V(SvNVX(sv))))
2425 : (SvIVX(sv) == I_V(SvNVX(sv))))
2426 SvNOK_on(sv);
2427 else
2428 SvNOKp_on(sv);
2429#endif
93a17b20 2430 }
748a9306 2431 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 2432 UV value;
3f7c398e 2433 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
041457d9 2434 if (!SvIOKp(sv) && !numtype && ckWARN(WARN_NUMERIC))
a0d0e21e 2435 not_a_number(sv);
28e5dec8 2436#ifdef NV_PRESERVES_UV
c2988b20
NC
2437 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2438 == IS_NUMBER_IN_UV) {
5e045b90 2439 /* It's definitely an integer */
9d6ce603 2440 SvNV_set(sv, (numtype & IS_NUMBER_NEG) ? -(NV)value : (NV)value);
c2988b20 2441 } else
3f7c398e 2442 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8
JH
2443 SvNOK_on(sv);
2444#else
3f7c398e 2445 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8
JH
2446 /* Only set the public NV OK flag if this NV preserves the value in
2447 the PV at least as well as an IV/UV would.
2448 Not sure how to do this 100% reliably. */
2449 /* if that shift count is out of range then Configure's test is
2450 wonky. We shouldn't be in here with NV_PRESERVES_UV_BITS ==
2451 UV_BITS */
2452 if (((UV)1 << NV_PRESERVES_UV_BITS) >
c2988b20 2453 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
28e5dec8 2454 SvNOK_on(sv); /* Definitely small enough to preserve all bits */
c2988b20
NC
2455 } else if (!(numtype & IS_NUMBER_IN_UV)) {
2456 /* Can't use strtol etc to convert this string, so don't try.
2457 sv_2iv and sv_2uv will use the NV to convert, not the PV. */
2458 SvNOK_on(sv);
2459 } else {
2460 /* value has been set. It may not be precise. */
2461 if ((numtype & IS_NUMBER_NEG) && (value > (UV)IV_MIN)) {
2462 /* 2s complement assumption for (UV)IV_MIN */
2463 SvNOK_on(sv); /* Integer is too negative. */
2464 } else {
2465 SvNOKp_on(sv);
2466 SvIOKp_on(sv);
6fa402ec 2467
c2988b20 2468 if (numtype & IS_NUMBER_NEG) {
45977657 2469 SvIV_set(sv, -(IV)value);
c2988b20 2470 } else if (value <= (UV)IV_MAX) {
45977657 2471 SvIV_set(sv, (IV)value);
c2988b20 2472 } else {
607fa7f2 2473 SvUV_set(sv, value);
c2988b20
NC
2474 SvIsUV_on(sv);
2475 }
2476
2477 if (numtype & IS_NUMBER_NOT_INT) {
2478 /* I believe that even if the original PV had decimals,
2479 they are lost beyond the limit of the FP precision.
2480 However, neither is canonical, so both only get p
2481 flags. NWC, 2000/11/25 */
2482 /* Both already have p flags, so do nothing */
2483 } else {
66a1b24b 2484 const NV nv = SvNVX(sv);
c2988b20
NC
2485 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2486 if (SvIVX(sv) == I_V(nv)) {
2487 SvNOK_on(sv);
c2988b20 2488 } else {
c2988b20
NC
2489 /* It had no "." so it must be integer. */
2490 }
00b6aa41 2491 SvIOK_on(sv);
c2988b20
NC
2492 } else {
2493 /* between IV_MAX and NV(UV_MAX).
2494 Could be slightly > UV_MAX */
6fa402ec 2495
c2988b20
NC
2496 if (numtype & IS_NUMBER_NOT_INT) {
2497 /* UV and NV both imprecise. */
2498 } else {
66a1b24b 2499 const UV nv_as_uv = U_V(nv);
c2988b20
NC
2500
2501 if (value == nv_as_uv && SvUVX(sv) != UV_MAX) {
2502 SvNOK_on(sv);
c2988b20 2503 }
00b6aa41 2504 SvIOK_on(sv);
c2988b20
NC
2505 }
2506 }
2507 }
2508 }
2509 }
28e5dec8 2510#endif /* NV_PRESERVES_UV */
93a17b20 2511 }
79072805 2512 else {
f7877b28 2513 if (isGV_with_GP(sv)) {
19f6321d 2514 glob_2number((GV *)sv);
180488f8
NC
2515 return 0.0;
2516 }
2517
041457d9 2518 if (!PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP) && ckWARN(WARN_UNINITIALIZED))
29489e7c 2519 report_uninit(sv);
7e25a7e9
NC
2520 assert (SvTYPE(sv) >= SVt_NV);
2521 /* Typically the caller expects that sv_any is not NULL now. */
2522 /* XXX Ilya implies that this is a bug in callers that assume this
2523 and ideally should be fixed. */
a0d0e21e 2524 return 0.0;
79072805 2525 }
572bbb43 2526#if defined(USE_LONG_DOUBLE)
097ee67d 2527 DEBUG_c({
f93f4e46 2528 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
2529 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
2530 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
2531 RESTORE_NUMERIC_LOCAL();
2532 });
65202027 2533#else
572bbb43 2534 DEBUG_c({
f93f4e46 2535 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 2536 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%"NVgf")\n",
1d7c1841 2537 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
2538 RESTORE_NUMERIC_LOCAL();
2539 });
572bbb43 2540#endif
463ee0b2 2541 return SvNVX(sv);
79072805
LW
2542}
2543
800401ee
JH
2544/*
2545=for apidoc sv_2num
2546
2547Return an SV with the numeric value of the source SV, doing any necessary
a196a5fa
JH
2548reference or overload conversion. You must use the C<SvNUM(sv)> macro to
2549access this function.
800401ee
JH
2550
2551=cut
2552*/
2553
2554SV *
2555Perl_sv_2num(pTHX_ register SV *sv)
2556{
b9ee0594
RGS
2557 if (!SvROK(sv))
2558 return sv;
800401ee
JH
2559 if (SvAMAGIC(sv)) {
2560 SV * const tmpsv = AMG_CALLun(sv,numer);
2561 if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
2562 return sv_2num(tmpsv);
2563 }
2564 return sv_2mortal(newSVuv(PTR2UV(SvRV(sv))));
2565}
2566
645c22ef
DM
2567/* uiv_2buf(): private routine for use by sv_2pv_flags(): print an IV or
2568 * UV as a string towards the end of buf, and return pointers to start and
2569 * end of it.
2570 *
2571 * We assume that buf is at least TYPE_CHARS(UV) long.
2572 */
2573
864dbfa3 2574static char *
aec46f14 2575S_uiv_2buf(char *buf, IV iv, UV uv, int is_uv, char **peob)
25da4f38 2576{
25da4f38 2577 char *ptr = buf + TYPE_CHARS(UV);
823a54a3 2578 char * const ebuf = ptr;
25da4f38 2579 int sign;
25da4f38
IZ
2580
2581 if (is_uv)
2582 sign = 0;
2583 else if (iv >= 0) {
2584 uv = iv;
2585 sign = 0;
2586 } else {
2587 uv = -iv;
2588 sign = 1;
2589 }
2590 do {
eb160463 2591 *--ptr = '0' + (char)(uv % 10);
25da4f38
IZ
2592 } while (uv /= 10);
2593 if (sign)
2594 *--ptr = '-';
2595 *peob = ebuf;
2596 return ptr;
2597}
2598
645c22ef
DM
2599/*
2600=for apidoc sv_2pv_flags
2601
ff276b08 2602Returns a pointer to the string value of an SV, and sets *lp to its length.
645c22ef
DM
2603If flags includes SV_GMAGIC, does an mg_get() first. Coerces sv to a string
2604if necessary.
2605Normally invoked via the C<SvPV_flags> macro. C<sv_2pv()> and C<sv_2pv_nomg>
2606usually end up here too.
2607
2608=cut
2609*/
2610
8d6d96c1
HS
2611char *
2612Perl_sv_2pv_flags(pTHX_ register SV *sv, STRLEN *lp, I32 flags)
2613{
97aff369 2614 dVAR;
79072805 2615 register char *s;
79072805 2616
463ee0b2 2617 if (!sv) {
cdb061a3
NC
2618 if (lp)
2619 *lp = 0;
73d840c0 2620 return (char *)"";
463ee0b2 2621 }
8990e307 2622 if (SvGMAGICAL(sv)) {
8d6d96c1
HS
2623 if (flags & SV_GMAGIC)
2624 mg_get(sv);
463ee0b2 2625 if (SvPOKp(sv)) {
cdb061a3
NC
2626 if (lp)
2627 *lp = SvCUR(sv);
10516c54
NC
2628 if (flags & SV_MUTABLE_RETURN)
2629 return SvPVX_mutable(sv);
4d84ee25
NC
2630 if (flags & SV_CONST_RETURN)
2631 return (char *)SvPVX_const(sv);
463ee0b2
LW
2632 return SvPVX(sv);
2633 }
75dfc8ec
NC
2634 if (SvIOKp(sv) || SvNOKp(sv)) {
2635 char tbuf[64]; /* Must fit sprintf/Gconvert of longest IV/NV */
75dfc8ec
NC
2636 STRLEN len;
2637
2638 if (SvIOKp(sv)) {
e80fed9d 2639 len = SvIsUV(sv)
d9fad198
JH
2640 ? my_snprintf(tbuf, sizeof(tbuf), "%"UVuf, (UV)SvUVX(sv))
2641 : my_snprintf(tbuf, sizeof(tbuf), "%"IVdf, (IV)SvIVX(sv));
75dfc8ec 2642 } else {
e8ada2d0
NC
2643 Gconvert(SvNVX(sv), NV_DIG, 0, tbuf);
2644 len = strlen(tbuf);
75dfc8ec 2645 }
b5b886f0
NC
2646 assert(!SvROK(sv));
2647 {
75dfc8ec
NC
2648 dVAR;
2649
2650#ifdef FIXNEGATIVEZERO
e8ada2d0
NC
2651 if (len == 2 && tbuf[0] == '-' && tbuf[1] == '0') {
2652 tbuf[0] = '0';
2653 tbuf[1] = 0;
75dfc8ec
NC
2654 len = 1;
2655 }
2656#endif
2657 SvUPGRADE(sv, SVt_PV);
2658 if (lp)
2659 *lp = len;
2660 s = SvGROW_mutable(sv, len + 1);
2661 SvCUR_set(sv, len);
2662 SvPOKp_on(sv);
10edeb5d 2663 return (char*)memcpy(s, tbuf, len + 1);
75dfc8ec 2664 }
463ee0b2 2665 }
1c7ff15e
NC
2666 if (SvROK(sv)) {
2667 goto return_rok;
2668 }
2669 assert(SvTYPE(sv) >= SVt_PVMG);
2670 /* This falls through to the report_uninit near the end of the
2671 function. */
2672 } else if (SvTHINKFIRST(sv)) {
ed6116ce 2673 if (SvROK(sv)) {
1c7ff15e 2674 return_rok:
deb46114
NC
2675 if (SvAMAGIC(sv)) {
2676 SV *const tmpstr = AMG_CALLun(sv,string);
2677 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2678 /* Unwrap this: */
2679 /* char *pv = lp ? SvPV(tmpstr, *lp) : SvPV_nolen(tmpstr);
2680 */
2681
2682 char *pv;
2683 if ((SvFLAGS(tmpstr) & (SVf_POK)) == SVf_POK) {
2684 if (flags & SV_CONST_RETURN) {
2685 pv = (char *) SvPVX_const(tmpstr);
2686 } else {
2687 pv = (flags & SV_MUTABLE_RETURN)
2688 ? SvPVX_mutable(tmpstr) : SvPVX(tmpstr);
2689 }
2690 if (lp)
2691 *lp = SvCUR(tmpstr);
50adf7d2 2692 } else {
deb46114 2693 pv = sv_2pv_flags(tmpstr, lp, flags);
50adf7d2 2694 }
deb46114
NC
2695 if (SvUTF8(tmpstr))
2696 SvUTF8_on(sv);
2697 else
2698 SvUTF8_off(sv);
2699 return pv;
50adf7d2 2700 }
deb46114
NC
2701 }
2702 {
fafee734
NC
2703 STRLEN len;
2704 char *retval;
2705 char *buffer;
d8eae41e
NC
2706 const SV *const referent = (SV*)SvRV(sv);
2707
2708 if (!referent) {
fafee734
NC
2709 len = 7;
2710 retval = buffer = savepvn("NULLREF", len);
5c35adbb 2711 } else if (SvTYPE(referent) == SVt_REGEXP) {
de8c5301
YO
2712 char *str = NULL;
2713 I32 haseval = 0;
60df1e07 2714 U32 flags = 0;
5c35adbb 2715 struct magic temp;
288b8c02
NC
2716 /* FIXME - get rid of this cast away of const, or work out
2717 how to do it better. */
2718 temp.mg_obj = (SV *)referent;
5c35adbb
NC
2719 assert(temp.mg_obj);
2720 (str) = CALLREG_AS_STR(&temp,lp,&flags,&haseval);
de8c5301
YO
2721 if (flags & 1)
2722 SvUTF8_on(sv);
2723 else
2724 SvUTF8_off(sv);
2725 PL_reginterp_cnt += haseval;
2726 return str;
d8eae41e
NC
2727 } else {
2728 const char *const typestr = sv_reftype(referent, 0);
fafee734
NC
2729 const STRLEN typelen = strlen(typestr);
2730 UV addr = PTR2UV(referent);
2731 const char *stashname = NULL;
2732 STRLEN stashnamelen = 0; /* hush, gcc */
2733 const char *buffer_end;
d8eae41e 2734
d8eae41e 2735 if (SvOBJECT(referent)) {
fafee734
NC
2736 const HEK *const name = HvNAME_HEK(SvSTASH(referent));
2737
2738 if (name) {
2739 stashname = HEK_KEY(name);
2740 stashnamelen = HEK_LEN(name);
2741
2742 if (HEK_UTF8(name)) {
2743 SvUTF8_on(sv);
2744 } else {
2745 SvUTF8_off(sv);
2746 }
2747 } else {
2748 stashname = "__ANON__";
2749 stashnamelen = 8;
2750 }
2751 len = stashnamelen + 1 /* = */ + typelen + 3 /* (0x */
2752 + 2 * sizeof(UV) + 2 /* )\0 */;
2753 } else {
2754 len = typelen + 3 /* (0x */
2755 + 2 * sizeof(UV) + 2 /* )\0 */;
d8eae41e 2756 }
fafee734
NC
2757
2758 Newx(buffer, len, char);
2759 buffer_end = retval = buffer + len;
2760
2761 /* Working backwards */
2762 *--retval = '\0';
2763 *--retval = ')';
2764 do {
2765 *--retval = PL_hexdigit[addr & 15];
2766 } while (addr >>= 4);
2767 *--retval = 'x';
2768 *--retval = '0';
2769 *--retval = '(';
2770
2771 retval -= typelen;
2772 memcpy(retval, typestr, typelen);
2773
2774 if (stashname) {
2775 *--retval = '=';
2776 retval -= stashnamelen;
2777 memcpy(retval, stashname, stashnamelen);
2778 }
2779 /* retval may not neccesarily have reached the start of the
2780 buffer here. */
2781 assert (retval >= buffer);
2782
2783 len = buffer_end - retval - 1; /* -1 for that \0 */
c080367d 2784 }
042dae7a 2785 if (lp)
fafee734
NC
2786 *lp = len;
2787 SAVEFREEPV(buffer);
2788 return retval;
463ee0b2 2789 }
79072805 2790 }
0336b60e 2791 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2792 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2793 report_uninit(sv);
cdb061a3
NC
2794 if (lp)
2795 *lp = 0;
73d840c0 2796 return (char *)"";
79072805 2797 }
79072805 2798 }
28e5dec8
JH
2799 if (SvIOK(sv) || ((SvIOKp(sv) && !SvNOKp(sv)))) {
2800 /* I'm assuming that if both IV and NV are equally valid then
2801 converting the IV is going to be more efficient */
e1ec3a88 2802 const U32 isUIOK = SvIsUV(sv);
28e5dec8
JH
2803 char buf[TYPE_CHARS(UV)];
2804 char *ebuf, *ptr;
97a130b8 2805 STRLEN len;
28e5dec8
JH
2806
2807 if (SvTYPE(sv) < SVt_PVIV)
2808 sv_upgrade(sv, SVt_PVIV);
4ea1d550 2809 ptr = uiv_2buf(buf, SvIVX(sv), SvUVX(sv), isUIOK, &ebuf);
97a130b8 2810 len = ebuf - ptr;
5902b6a9 2811 /* inlined from sv_setpvn */
97a130b8
NC
2812 s = SvGROW_mutable(sv, len + 1);
2813 Move(ptr, s, len, char);
2814 s += len;
28e5dec8 2815 *s = '\0';
28e5dec8
JH
2816 }
2817 else if (SvNOKp(sv)) {
c81271c3 2818 const int olderrno = errno;
79072805
LW
2819 if (SvTYPE(sv) < SVt_PVNV)
2820 sv_upgrade(sv, SVt_PVNV);
1c846c1f 2821 /* The +20 is pure guesswork. Configure test needed. --jhi */
5902b6a9 2822 s = SvGROW_mutable(sv, NV_DIG + 20);
c81271c3 2823 /* some Xenix systems wipe out errno here */
79072805 2824#ifdef apollo
463ee0b2 2825 if (SvNVX(sv) == 0.0)
d1307786 2826 my_strlcpy(s, "0", SvLEN(sv));
79072805
LW
2827 else
2828#endif /*apollo*/
bbce6d69 2829 {
2d4389e4 2830 Gconvert(SvNVX(sv), NV_DIG, 0, s);
bbce6d69 2831 }
79072805 2832 errno = olderrno;
a0d0e21e 2833#ifdef FIXNEGATIVEZERO
20773dcd
NC
2834 if (*s == '-' && s[1] == '0' && !s[2]) {
2835 s[0] = '0';
2836 s[1] = 0;
2837 }
a0d0e21e 2838#endif
79072805
LW
2839 while (*s) s++;
2840#ifdef hcx
2841 if (s[-1] == '.')
46fc3d4c 2842 *--s = '\0';
79072805
LW
2843#endif
2844 }
79072805 2845 else {
675c862f 2846 if (isGV_with_GP(sv))
19f6321d 2847 return glob_2pv((GV *)sv, lp);
180488f8 2848
041457d9 2849 if (!PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP) && ckWARN(WARN_UNINITIALIZED))
29489e7c 2850 report_uninit(sv);
cdb061a3 2851 if (lp)
00b6aa41 2852 *lp = 0;
25da4f38
IZ
2853 if (SvTYPE(sv) < SVt_PV)
2854 /* Typically the caller expects that sv_any is not NULL now. */
2855 sv_upgrade(sv, SVt_PV);
73d840c0 2856 return (char *)"";
79072805 2857 }
cdb061a3 2858 {
823a54a3 2859 const STRLEN len = s - SvPVX_const(sv);
cdb061a3
NC
2860 if (lp)
2861 *lp = len;
2862 SvCUR_set(sv, len);
2863 }
79072805 2864 SvPOK_on(sv);
1d7c1841 2865 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3f7c398e 2866 PTR2UV(sv),SvPVX_const(sv)));
4d84ee25
NC
2867 if (flags & SV_CONST_RETURN)
2868 return (char *)SvPVX_const(sv);
10516c54
NC
2869 if (flags & SV_MUTABLE_RETURN)
2870 return SvPVX_mutable(sv);
463ee0b2
LW
2871 return SvPVX(sv);
2872}
2873
645c22ef 2874/*
6050d10e
JP
2875=for apidoc sv_copypv
2876
2877Copies a stringified representation of the source SV into the
2878destination SV. Automatically performs any necessary mg_get and
54f0641b 2879coercion of numeric values into strings. Guaranteed to preserve
2575c402 2880UTF8 flag even from overloaded objects. Similar in nature to
54f0641b
NIS
2881sv_2pv[_flags] but operates directly on an SV instead of just the
2882string. Mostly uses sv_2pv_flags to do its work, except when that
6050d10e
JP
2883would lose the UTF-8'ness of the PV.
2884
2885=cut
2886*/
2887
2888void
2889Perl_sv_copypv(pTHX_ SV *dsv, register SV *ssv)
2890{
446eaa42 2891 STRLEN len;
53c1dcc0 2892 const char * const s = SvPV_const(ssv,len);
cb50f42d 2893 sv_setpvn(dsv,s,len);
446eaa42 2894 if (SvUTF8(ssv))
cb50f42d 2895 SvUTF8_on(dsv);
446eaa42 2896 else
cb50f42d 2897 SvUTF8_off(dsv);
6050d10e
JP
2898}
2899
2900/*
645c22ef
DM
2901=for apidoc sv_2pvbyte
2902
2903Return a pointer to the byte-encoded representation of the SV, and set *lp
1e54db1a 2904to its length. May cause the SV to be downgraded from UTF-8 as a
645c22ef
DM
2905side-effect.
2906
2907Usually accessed via the C<SvPVbyte> macro.
2908
2909=cut
2910*/
2911
7340a771
GS
2912char *
2913Perl_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
2914{
0875d2fe 2915 sv_utf8_downgrade(sv,0);
97972285 2916 return lp ? SvPV(sv,*lp) : SvPV_nolen(sv);
7340a771
GS
2917}
2918
645c22ef 2919/*
035cbb0e
RGS
2920=for apidoc sv_2pvutf8
2921
2922Return a pointer to the UTF-8-encoded representation of the SV, and set *lp
2923to its length. May cause the SV to be upgraded to UTF-8 as a side-effect.
2924
2925Usually accessed via the C<SvPVutf8> macro.
2926
2927=cut
2928*/
645c22ef 2929
7340a771
GS
2930char *
2931Perl_sv_2pvutf8(pTHX_ register SV *sv, STRLEN *lp)
2932{
035cbb0e
RGS
2933 sv_utf8_upgrade(sv);
2934 return lp ? SvPV(sv,*lp) : SvPV_nolen(sv);
7340a771 2935}
1c846c1f 2936
7ee2227d 2937
645c22ef
DM
2938/*
2939=for apidoc sv_2bool
2940
2941This function is only called on magical items, and is only used by
8cf8f3d1 2942sv_true() or its macro equivalent.
645c22ef
DM
2943
2944=cut
2945*/
2946
463ee0b2 2947bool
864dbfa3 2948Perl_sv_2bool(pTHX_ register SV *sv)
463ee0b2 2949{
97aff369 2950 dVAR;
5b295bef 2951 SvGETMAGIC(sv);
463ee0b2 2952
a0d0e21e
LW
2953 if (!SvOK(sv))
2954 return 0;
2955 if (SvROK(sv)) {
fabdb6c0
AL
2956 if (SvAMAGIC(sv)) {
2957 SV * const tmpsv = AMG_CALLun(sv,bool_);
2958 if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
2959 return (bool)SvTRUE(tmpsv);
2960 }
2961 return SvRV(sv) != 0;
a0d0e21e 2962 }
463ee0b2 2963 if (SvPOKp(sv)) {
53c1dcc0
AL
2964 register XPV* const Xpvtmp = (XPV*)SvANY(sv);
2965 if (Xpvtmp &&
339049b0 2966 (*sv->sv_u.svu_pv > '0' ||
11343788 2967 Xpvtmp->xpv_cur > 1 ||
339049b0 2968 (Xpvtmp->xpv_cur && *sv->sv_u.svu_pv != '0')))
463ee0b2
LW
2969 return 1;
2970 else
2971 return 0;
2972 }
2973 else {
2974 if (SvIOKp(sv))
2975 return SvIVX(sv) != 0;
2976 else {
2977 if (SvNOKp(sv))
2978 return SvNVX(sv) != 0.0;
180488f8 2979 else {
f7877b28 2980 if (isGV_with_GP(sv))
180488f8
NC
2981 return TRUE;
2982 else
2983 return FALSE;
2984 }
463ee0b2
LW
2985 }
2986 }
79072805
LW
2987}
2988
c461cf8f
JH
2989/*
2990=for apidoc sv_utf8_upgrade
2991
78ea37eb 2992Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 2993Forces the SV to string form if it is not already.
4411f3b6
NIS
2994Always sets the SvUTF8 flag to avoid future validity checks even
2995if all the bytes have hibit clear.
c461cf8f 2996
13a6c0e0
JH
2997This is not as a general purpose byte encoding to Unicode interface:
2998use the Encode extension for that.
2999
8d6d96c1
HS
3000=for apidoc sv_utf8_upgrade_flags
3001
78ea37eb 3002Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 3003Forces the SV to string form if it is not already.
8d6d96c1
HS
3004Always sets the SvUTF8 flag to avoid future validity checks even
3005if all the bytes have hibit clear. If C<flags> has C<SV_GMAGIC> bit set,
3006will C<mg_get> on C<sv> if appropriate, else not. C<sv_utf8_upgrade> and
3007C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
3008
13a6c0e0
JH
3009This is not as a general purpose byte encoding to Unicode interface:
3010use the Encode extension for that.
3011
8d6d96c1
HS
3012=cut
3013*/
3014
3015STRLEN
3016Perl_sv_utf8_upgrade_flags(pTHX_ register SV *sv, I32 flags)
3017{
97aff369 3018 dVAR;
808c356f
RGS
3019 if (sv == &PL_sv_undef)
3020 return 0;
e0e62c2a
NIS
3021 if (!SvPOK(sv)) {
3022 STRLEN len = 0;
d52b7888
NC
3023 if (SvREADONLY(sv) && (SvPOKp(sv) || SvIOKp(sv) || SvNOKp(sv))) {
3024 (void) sv_2pv_flags(sv,&len, flags);
3025 if (SvUTF8(sv))
3026 return len;
3027 } else {
3028 (void) SvPV_force(sv,len);
3029 }
e0e62c2a 3030 }
4411f3b6 3031
f5cee72b 3032 if (SvUTF8(sv)) {
5fec3b1d 3033 return SvCUR(sv);
f5cee72b 3034 }
5fec3b1d 3035
765f542d
NC
3036 if (SvIsCOW(sv)) {
3037 sv_force_normal_flags(sv, 0);
db42d148
NIS
3038 }
3039
88632417 3040 if (PL_encoding && !(flags & SV_UTF8_NO_ENCODING))
799ef3cb 3041 sv_recode_to_utf8(sv, PL_encoding);
9f4817db 3042 else { /* Assume Latin-1/EBCDIC */
c4e7c712
NC
3043 /* This function could be much more efficient if we
3044 * had a FLAG in SVs to signal if there are any hibit
3045 * chars in the PV. Given that there isn't such a flag
3046 * make the loop as fast as possible. */
00b6aa41 3047 const U8 * const s = (U8 *) SvPVX_const(sv);
c4420975 3048 const U8 * const e = (U8 *) SvEND(sv);
93524f2b 3049 const U8 *t = s;
c4e7c712
NC
3050
3051 while (t < e) {
53c1dcc0 3052 const U8 ch = *t++;
00b6aa41
AL
3053 /* Check for hi bit */
3054 if (!NATIVE_IS_INVARIANT(ch)) {
3055 STRLEN len = SvCUR(sv) + 1; /* Plus the \0 */
3056 U8 * const recoded = bytes_to_utf8((U8*)s, &len);
3057
3058 SvPV_free(sv); /* No longer using what was there before. */
3059 SvPV_set(sv, (char*)recoded);
3060 SvCUR_set(sv, len - 1);
3061 SvLEN_set(sv, len); /* No longer know the real size. */
c4e7c712 3062 break;
00b6aa41 3063 }
c4e7c712
NC
3064 }
3065 /* Mark as UTF-8 even if no hibit - saves scanning loop */
3066 SvUTF8_on(sv);
560a288e 3067 }
4411f3b6 3068 return SvCUR(sv);
560a288e
GS
3069}
3070
c461cf8f
JH
3071/*
3072=for apidoc sv_utf8_downgrade
3073
78ea37eb
TS
3074Attempts to convert the PV of an SV from characters to bytes.
3075If the PV contains a character beyond byte, this conversion will fail;
3076in this case, either returns false or, if C<fail_ok> is not
c461cf8f
JH
3077true, croaks.
3078
13a6c0e0
JH
3079This is not as a general purpose Unicode to byte encoding interface:
3080use the Encode extension for that.
3081
c461cf8f
JH
3082=cut
3083*/
3084
560a288e
GS
3085bool
3086Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
3087{
97aff369 3088 dVAR;
78ea37eb 3089 if (SvPOKp(sv) && SvUTF8(sv)) {
fa301091 3090 if (SvCUR(sv)) {
03cfe0ae 3091 U8 *s;
652088fc 3092 STRLEN len;
fa301091 3093
765f542d
NC
3094 if (SvIsCOW(sv)) {
3095 sv_force_normal_flags(sv, 0);
3096 }
03cfe0ae
NIS
3097 s = (U8 *) SvPV(sv, len);
3098 if (!utf8_to_bytes(s, &len)) {
fa301091
JH
3099 if (fail_ok)
3100 return FALSE;
3101 else {
3102 if (PL_op)
3103 Perl_croak(aTHX_ "Wide character in %s",
53e06cf0 3104 OP_DESC(PL_op));
fa301091
JH
3105 else
3106 Perl_croak(aTHX_ "Wide character");
3107 }
4b3603a4 3108 }
b162af07 3109 SvCUR_set(sv, len);
67e989fb 3110 }
560a288e 3111 }
ffebcc3e 3112 SvUTF8_off(sv);
560a288e
GS
3113 return TRUE;
3114}
3115
c461cf8f
JH
3116/*
3117=for apidoc sv_utf8_encode
3118
78ea37eb
TS
3119Converts the PV of an SV to UTF-8, but then turns the C<SvUTF8>
3120flag off so that it looks like octets again.
c461cf8f
JH
3121
3122=cut
3123*/
3124
560a288e
GS
3125void
3126Perl_sv_utf8_encode(pTHX_ register SV *sv)
3127{
4c94c214
NC
3128 if (SvIsCOW(sv)) {
3129 sv_force_normal_flags(sv, 0);
3130 }
3131 if (SvREADONLY(sv)) {
3132 Perl_croak(aTHX_ PL_no_modify);
3133 }
a5f5288a 3134 (void) sv_utf8_upgrade(sv);
560a288e
GS
3135 SvUTF8_off(sv);
3136}
3137
4411f3b6
NIS
3138/*
3139=for apidoc sv_utf8_decode
3140
78ea37eb
TS
3141If the PV of the SV is an octet sequence in UTF-8
3142and contains a multiple-byte character, the C<SvUTF8> flag is turned on
3143so that it looks like a character. If the PV contains only single-byte
3144characters, the C<SvUTF8> flag stays being off.
3145Scans PV for validity and returns false if the PV is invalid UTF-8.
4411f3b6
NIS
3146
3147=cut
3148*/
3149
560a288e
GS
3150bool
3151Perl_sv_utf8_decode(pTHX_ register SV *sv)
3152{
78ea37eb 3153 if (SvPOKp(sv)) {
93524f2b
NC
3154 const U8 *c;
3155 const U8 *e;
9cbac4c7 3156
645c22ef
DM
3157 /* The octets may have got themselves encoded - get them back as
3158 * bytes
3159 */
3160 if (!sv_utf8_downgrade(sv, TRUE))
560a288e
GS
3161 return FALSE;
3162
3163 /* it is actually just a matter of turning the utf8 flag on, but
3164 * we want to make sure everything inside is valid utf8 first.
3165 */
93524f2b 3166 c = (const U8 *) SvPVX_const(sv);
63cd0674 3167 if (!is_utf8_string(c, SvCUR(sv)+1))
67e989fb 3168 return FALSE;
93524f2b 3169 e = (const U8 *) SvEND(sv);
511c2ff0 3170 while (c < e) {
b64e5050 3171 const U8 ch = *c++;
c4d5f83a 3172 if (!UTF8_IS_INVARIANT(ch)) {
67e989fb
JH
3173 SvUTF8_on(sv);
3174 break;
3175 }
560a288e 3176 }
560a288e
GS
3177 }
3178 return TRUE;
3179}
3180
954c1994
GS
3181/*
3182=for apidoc sv_setsv
3183
645c22ef
DM
3184Copies the contents of the source SV C<ssv> into the destination SV
3185C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
3186function if the source SV needs to be reused. Does not handle 'set' magic.
3187Loosely speaking, it performs a copy-by-value, obliterating any previous
3188content of the destination.
3189
3190You probably want to use one of the assortment of wrappers, such as
3191C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3192C<SvSetMagicSV_nosteal>.
3193
8d6d96c1
HS
3194=for apidoc sv_setsv_flags
3195
645c22ef
DM
3196Copies the contents of the source SV C<ssv> into the destination SV
3197C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
3198function if the source SV needs to be reused. Does not handle 'set' magic.
3199Loosely speaking, it performs a copy-by-value, obliterating any previous
3200content of the destination.
3201If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
5fcdf167
NC
3202C<ssv> if appropriate, else not. If the C<flags> parameter has the
3203C<NOSTEAL> bit set then the buffers of temps will not be stolen. <sv_setsv>
3204and C<sv_setsv_nomg> are implemented in terms of this function.
645c22ef
DM
3205
3206You probably want to use one of the assortment of wrappers, such as
3207C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3208C<SvSetMagicSV_nosteal>.
3209
3210This is the primary function for copying scalars, and most other
3211copy-ish functions and macros use this underneath.
8d6d96c1
HS
3212
3213=cut
3214*/
3215
5d0301b7 3216static void
2eb42952 3217S_glob_assign_glob(pTHX_ SV *dstr, SV *sstr, const int dtype)
5d0301b7 3218{
70cd14a1 3219 I32 mro_changes = 0; /* 1 = method, 2 = isa */
dd69841b 3220
5d0301b7
NC
3221 if (dtype != SVt_PVGV) {
3222 const char * const name = GvNAME(sstr);
3223 const STRLEN len = GvNAMELEN(sstr);
0d092c36 3224 {
f7877b28
NC
3225 if (dtype >= SVt_PV) {
3226 SvPV_free(dstr);
3227 SvPV_set(dstr, 0);
3228 SvLEN_set(dstr, 0);
3229 SvCUR_set(dstr, 0);
3230 }
0d092c36 3231 SvUPGRADE(dstr, SVt_PVGV);
dedf8e73 3232 (void)SvOK_off(dstr);
2e5b91de
NC
3233 /* FIXME - why are we doing this, then turning it off and on again
3234 below? */
3235 isGV_with_GP_on(dstr);
f7877b28 3236 }
5d0301b7
NC
3237 GvSTASH(dstr) = GvSTASH(sstr);
3238 if (GvSTASH(dstr))
3239 Perl_sv_add_backref(aTHX_ (SV*)GvSTASH(dstr), dstr);
ae8cc45f 3240 gv_name_set((GV *)dstr, name, len, GV_ADD);
5d0301b7
NC
3241 SvFAKE_on(dstr); /* can coerce to non-glob */
3242 }
3243
3244#ifdef GV_UNIQUE_CHECK
3245 if (GvUNIQUE((GV*)dstr)) {
3246 Perl_croak(aTHX_ PL_no_modify);
3247 }
3248#endif
3249
dd69841b
BB
3250 if(GvGP((GV*)sstr)) {
3251 /* If source has method cache entry, clear it */
3252 if(GvCVGEN(sstr)) {
3253 SvREFCNT_dec(GvCV(sstr));
3254 GvCV(sstr) = NULL;
3255 GvCVGEN(sstr) = 0;
3256 }
3257 /* If source has a real method, then a method is
3258 going to change */
3259 else if(GvCV((GV*)sstr)) {
70cd14a1 3260 mro_changes = 1;
dd69841b
BB
3261 }
3262 }
3263
3264 /* If dest already had a real method, that's a change as well */
70cd14a1
CB
3265 if(!mro_changes && GvGP((GV*)dstr) && GvCVu((GV*)dstr)) {
3266 mro_changes = 1;
dd69841b
BB
3267 }
3268
70cd14a1
CB
3269 if(strEQ(GvNAME((GV*)dstr),"ISA"))
3270 mro_changes = 2;
3271
f7877b28 3272 gp_free((GV*)dstr);
2e5b91de 3273 isGV_with_GP_off(dstr);
5d0301b7 3274 (void)SvOK_off(dstr);
2e5b91de 3275 isGV_with_GP_on(dstr);
dedf8e73 3276 GvINTRO_off(dstr); /* one-shot flag */
5d0301b7
NC
3277 GvGP(dstr) = gp_ref(GvGP(sstr));
3278 if (SvTAINTED(sstr))
3279 SvTAINT(dstr);
3280 if (GvIMPORTED(dstr) != GVf_IMPORTED
3281 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3282 {
3283 GvIMPORTED_on(dstr);
3284 }
3285 GvMULTI_on(dstr);
70cd14a1
CB
3286 if(mro_changes == 2) mro_isa_changed_in(GvSTASH(dstr));
3287 else if(mro_changes) mro_method_changed_in(GvSTASH(dstr));
5d0301b7
NC
3288 return;
3289}
3290
b8473700 3291static void
2eb42952 3292S_glob_assign_ref(pTHX_ SV *dstr, SV *sstr) {
b8473700
NC
3293 SV * const sref = SvREFCNT_inc(SvRV(sstr));
3294 SV *dref = NULL;
3295 const int intro = GvINTRO(dstr);
2440974c 3296 SV **location;
3386d083 3297 U8 import_flag = 0;
27242d61
NC
3298 const U32 stype = SvTYPE(sref);
3299
b8473700
NC
3300
3301#ifdef GV_UNIQUE_CHECK
3302 if (GvUNIQUE((GV*)dstr)) {
3303 Perl_croak(aTHX_ PL_no_modify);
3304 }
3305#endif
3306
3307 if (intro) {
3308 GvINTRO_off(dstr); /* one-shot flag */
3309 GvLINE(dstr) = CopLINE(PL_curcop);
3310 GvEGV(dstr) = (GV*)dstr;
3311 }
3312 GvMULTI_on(dstr);
27242d61 3313 switch (stype) {
b8473700 3314 case SVt_PVCV:
27242d61
NC
3315 location = (SV **) &GvCV(dstr);
3316 import_flag = GVf_IMPORTED_CV;
3317 goto common;
3318 case SVt_PVHV:
3319 location = (SV **) &GvHV(dstr);
3320 import_flag = GVf_IMPORTED_HV;
3321 goto common;
3322 case SVt_PVAV:
3323 location = (SV **) &GvAV(dstr);
3324 import_flag = GVf_IMPORTED_AV;
3325 goto common;
3326 case SVt_PVIO:
3327 location = (SV **) &GvIOp(dstr);
3328 goto common;
3329 case SVt_PVFM:
3330 location = (SV **) &GvFORM(dstr);
3331 default:
3332 location = &GvSV(dstr);
3333 import_flag = GVf_IMPORTED_SV;
3334 common:
b8473700 3335 if (intro) {
27242d61 3336 if (stype == SVt_PVCV) {
5f2fca8a
BB
3337 /*if (GvCVGEN(dstr) && (GvCV(dstr) != (CV*)sref || GvCVGEN(dstr))) {*/
3338 if (GvCVGEN(dstr)) {
27242d61
NC
3339 SvREFCNT_dec(GvCV(dstr));
3340 GvCV(dstr) = NULL;
3341 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
27242d61 3342 }
b8473700 3343 }
27242d61 3344 SAVEGENERICSV(*location);
b8473700
NC
3345 }
3346 else
27242d61 3347 dref = *location;
5f2fca8a 3348 if (stype == SVt_PVCV && (*location != sref || GvCVGEN(dstr))) {
27242d61 3349 CV* const cv = (CV*)*location;
b8473700
NC
3350 if (cv) {
3351 if (!GvCVGEN((GV*)dstr) &&
3352 (CvROOT(cv) || CvXSUB(cv)))
3353 {
3354 /* Redefining a sub - warning is mandatory if
3355 it was a const and its value changed. */
3356 if (CvCONST(cv) && CvCONST((CV*)sref)
3357 && cv_const_sv(cv) == cv_const_sv((CV*)sref)) {
6f207bd3 3358 NOOP;
b8473700
NC
3359 /* They are 2 constant subroutines generated from
3360 the same constant. This probably means that
3361 they are really the "same" proxy subroutine
3362 instantiated in 2 places. Most likely this is
3363 when a constant is exported twice. Don't warn.
3364 */
3365 }
3366 else if (ckWARN(WARN_REDEFINE)
3367 || (CvCONST(cv)
3368 && (!CvCONST((CV*)sref)
3369 || sv_cmp(cv_const_sv(cv),
3370 cv_const_sv((CV*)sref))))) {
3371 Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
10edeb5d
JH
3372 (const char *)
3373 (CvCONST(cv)
3374 ? "Constant subroutine %s::%s redefined"
3375 : "Subroutine %s::%s redefined"),
b8473700
NC
3376 HvNAME_get(GvSTASH((GV*)dstr)),
3377 GvENAME((GV*)dstr));
3378 }
3379 }
3380 if (!intro)
cbf82dd0
NC
3381 cv_ckproto_len(cv, (GV*)dstr,
3382 SvPOK(sref) ? SvPVX_const(sref) : NULL,
3383 SvPOK(sref) ? SvCUR(sref) : 0);
b8473700 3384 }
b8473700
NC
3385 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3386 GvASSUMECV_on(dstr);
dd69841b 3387 if(GvSTASH(dstr)) mro_method_changed_in(GvSTASH(dstr)); /* sub foo { 1 } sub bar { 2 } *bar = \&foo */
b8473700 3388 }
2440974c 3389 *location = sref;
3386d083
NC
3390 if (import_flag && !(GvFLAGS(dstr) & import_flag)
3391 && CopSTASH_ne(PL_curcop, GvSTASH(dstr))) {
3392 GvFLAGS(dstr) |= import_flag;
b8473700
NC
3393 }
3394 break;
3395 }
b37c2d43 3396 SvREFCNT_dec(dref);
b8473700
NC
3397 if (SvTAINTED(sstr))
3398 SvTAINT(dstr);
3399 return;
3400}
3401
8d6d96c1
HS
3402void
3403Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags)
3404{
97aff369 3405 dVAR;
8990e307
LW
3406 register U32 sflags;
3407 register int dtype;
42d0e0b7 3408 register svtype stype;
463ee0b2 3409
79072805
LW
3410 if (sstr == dstr)
3411 return;
29f4f0ab
NC
3412
3413 if (SvIS_FREED(dstr)) {
3414 Perl_croak(aTHX_ "panic: attempt to copy value %" SVf
be2597df 3415 " to a freed scalar %p", SVfARG(sstr), (void *)dstr);
29f4f0ab 3416 }
765f542d 3417 SV_CHECK_THINKFIRST_COW_DROP(dstr);
79072805 3418 if (!sstr)
3280af22 3419 sstr = &PL_sv_undef;
29f4f0ab 3420 if (SvIS_FREED(sstr)) {
6c9570dc
MHM
3421 Perl_croak(aTHX_ "panic: attempt to copy freed scalar %p to %p",
3422 (void*)sstr, (void*)dstr);
29f4f0ab 3423 }
8990e307
LW
3424 stype = SvTYPE(sstr);
3425 dtype = SvTYPE(dstr);
79072805 3426
52944de8 3427 (void)SvAMAGIC_off(dstr);
7a5fa8a2 3428 if ( SvVOK(dstr) )
ece467f9
JP
3429 {
3430 /* need to nuke the magic */
3431 mg_free(dstr);
3432 SvRMAGICAL_off(dstr);
3433 }
9e7bc3e8 3434
463ee0b2 3435 /* There's a lot of redundancy below but we're going for speed here */
79072805 3436
8990e307 3437 switch (stype) {
79072805 3438 case SVt_NULL:
aece5585 3439 undef_sstr:
20408e3c
GS
3440 if (dtype != SVt_PVGV) {
3441 (void)SvOK_off(dstr);
3442 return;
3443 }
3444 break;
463ee0b2 3445 case SVt_IV:
aece5585
GA
3446 if (SvIOK(sstr)) {
3447 switch (dtype) {
3448 case SVt_NULL:
8990e307 3449 sv_upgrade(dstr, SVt_IV);
aece5585
GA
3450 break;
3451 case SVt_NV:
aece5585 3452 case SVt_PV:
a0d0e21e 3453 sv_upgrade(dstr, SVt_PVIV);
aece5585 3454 break;
010be86b
NC
3455 case SVt_PVGV:
3456 goto end_of_first_switch;
aece5585
GA
3457 }
3458 (void)SvIOK_only(dstr);
45977657 3459 SvIV_set(dstr, SvIVX(sstr));
25da4f38
IZ
3460 if (SvIsUV(sstr))
3461 SvIsUV_on(dstr);
37c25af0
NC
3462 /* SvTAINTED can only be true if the SV has taint magic, which in
3463 turn means that the SV type is PVMG (or greater). This is the
3464 case statement for SVt_IV, so this cannot be true (whatever gcov
3465 may say). */
3466 assert(!SvTAINTED(sstr));
aece5585 3467 return;
8990e307 3468 }
4df7f6af
NC
3469 if (!SvROK(sstr))
3470 goto undef_sstr;
3471 if (dtype < SVt_PV && dtype != SVt_IV)
3472 sv_upgrade(dstr, SVt_IV);
3473 break;
aece5585 3474
463ee0b2 3475 case SVt_NV:
aece5585
GA
3476 if (SvNOK(sstr)) {
3477 switch (dtype) {
3478 case SVt_NULL:
3479 case SVt_IV:
8990e307 3480 sv_upgrade(dstr, SVt_NV);
aece5585 3481 break;
aece5585
GA
3482 case SVt_PV:
3483 case SVt_PVIV:
a0d0e21e 3484 sv_upgrade(dstr, SVt_PVNV);
aece5585 3485 break;
010be86b
NC
3486 case SVt_PVGV:
3487 goto end_of_first_switch;
aece5585 3488 }
9d6ce603 3489 SvNV_set(dstr, SvNVX(sstr));
aece5585 3490 (void)SvNOK_only(dstr);
37c25af0
NC
3491 /* SvTAINTED can only be true if the SV has taint magic, which in
3492 turn means that the SV type is PVMG (or greater). This is the
3493 case statement for SVt_NV, so this cannot be true (whatever gcov
3494 may say). */
3495 assert(!SvTAINTED(sstr));
aece5585 3496 return;
8990e307 3497 }
aece5585
GA
3498 goto undef_sstr;
3499
fc36a67e 3500 case SVt_PVFM:
f8c7b90f 3501#ifdef PERL_OLD_COPY_ON_WRITE
d89fc664
NC
3502 if ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS) {
3503 if (dtype < SVt_PVIV)
3504 sv_upgrade(dstr, SVt_PVIV);
3505 break;
3506 }
3507 /* Fall through */
3508#endif
3509 case SVt_PV:
8990e307 3510 if (dtype < SVt_PV)
463ee0b2 3511 sv_upgrade(dstr, SVt_PV);
463ee0b2
LW
3512 break;
3513 case SVt_PVIV:
8990e307 3514 if (dtype < SVt_PVIV)
463ee0b2 3515 sv_upgrade(dstr, SVt_PVIV);
463ee0b2
LW
3516 break;
3517 case SVt_PVNV:
8990e307 3518 if (dtype < SVt_PVNV)
463ee0b2 3519 sv_upgrade(dstr, SVt_PVNV);
463ee0b2 3520 break;
489f7bfe 3521 default:
a3b680e6
AL
3522 {
3523 const char * const type = sv_reftype(sstr,0);
533c011a 3524 if (PL_op)
a3b680e6 3525 Perl_croak(aTHX_ "Bizarre copy of %s in %s", type, OP_NAME(PL_op));
4633a7c4 3526 else
a3b680e6
AL
3527 Perl_croak(aTHX_ "Bizarre copy of %s", type);
3528 }
4633a7c4
LW
3529 break;
3530
cecf5685 3531 /* case SVt_BIND: */
39cb70dc 3532 case SVt_PVLV:
79072805 3533 case SVt_PVGV:
cecf5685 3534 if (isGV_with_GP(sstr) && dtype <= SVt_PVGV) {
d4c19fe8 3535 glob_assign_glob(dstr, sstr, dtype);
b8c701c1 3536 return;
79072805 3537 }
cecf5685 3538 /* SvVALID means that this PVGV is playing at being an FBM. */
5f66b61c 3539 /*FALLTHROUGH*/
79072805 3540
489f7bfe 3541 case SVt_PVMG:
8d6d96c1 3542 if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
973f89ab 3543 mg_get(sstr);
1d9c78c6 3544 if (SvTYPE(sstr) != stype) {
973f89ab 3545 stype = SvTYPE(sstr);
cecf5685 3546 if (isGV_with_GP(sstr) && stype == SVt_PVGV && dtype <= SVt_PVGV) {
d4c19fe8 3547 glob_assign_glob(dstr, sstr, dtype);
b8c701c1
NC
3548 return;
3549 }
973f89ab
CS
3550 }
3551 }
ded42b9f 3552 if (stype == SVt_PVLV)
862a34c6 3553 SvUPGRADE(dstr, SVt_PVNV);
ded42b9f 3554 else
42d0e0b7 3555 SvUPGRADE(dstr, (svtype)stype);
79072805 3556 }
010be86b 3557 end_of_first_switch:
79072805 3558
ff920335
NC
3559 /* dstr may have been upgraded. */
3560 dtype = SvTYPE(dstr);
8990e307
LW
3561 sflags = SvFLAGS(sstr);
3562
ba2fdce6 3563 if (dtype == SVt_PVCV || dtype == SVt_PVFM) {
85324b4d
NC
3564 /* Assigning to a subroutine sets the prototype. */
3565 if (SvOK(sstr)) {
3566 STRLEN len;
3567 const char *const ptr = SvPV_const(sstr, len);
3568
3569 SvGROW(dstr, len + 1);
3570 Copy(ptr, SvPVX(dstr), len + 1, char);
3571 SvCUR_set(dstr, len);
fcddd32e 3572 SvPOK_only(dstr);
ba2fdce6 3573 SvFLAGS(dstr) |= sflags & SVf_UTF8;
85324b4d
NC
3574 } else {
3575 SvOK_off(dstr);
3576 }
ba2fdce6
NC
3577 } else if (dtype == SVt_PVAV || dtype == SVt_PVHV) {
3578 const char * const type = sv_reftype(dstr,0);
3579 if (PL_op)
3580 Perl_croak(aTHX_ "Cannot copy to %s in %s", type, OP_NAME(PL_op));
3581 else
3582 Perl_croak(aTHX_ "Cannot copy to %s", type);
85324b4d 3583 } else if (sflags & SVf_ROK) {
cecf5685
NC
3584 if (isGV_with_GP(dstr) && dtype == SVt_PVGV
3585 && SvTYPE(SvRV(sstr)) == SVt_PVGV) {
acaa9288
NC
3586 sstr = SvRV(sstr);
3587 if (sstr == dstr) {
3588 if (GvIMPORTED(dstr) != GVf_IMPORTED
3589 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3590 {
3591 GvIMPORTED_on(dstr);
3592 }
3593 GvMULTI_on(dstr);
3594 return;
3595 }
d4c19fe8 3596 glob_assign_glob(dstr, sstr, dtype);
acaa9288
NC
3597 return;
3598 }
3599
8990e307 3600 if (dtype >= SVt_PV) {
fdc5b023 3601 if (dtype == SVt_PVGV && isGV_with_GP(dstr)) {
d4c19fe8 3602 glob_assign_ref(dstr, sstr);
b8c701c1
NC
3603 return;
3604 }
3f7c398e 3605 if (SvPVX_const(dstr)) {
8bd4d4c5 3606 SvPV_free(dstr);
b162af07
SP
3607 SvLEN_set(dstr, 0);
3608 SvCUR_set(dstr, 0);
a0d0e21e 3609 }
8990e307 3610 }
a0d0e21e 3611 (void)SvOK_off(dstr);
b162af07 3612 SvRV_set(dstr, SvREFCNT_inc(SvRV(sstr)));
96d4b0ee 3613 SvFLAGS(dstr) |= sflags & SVf_ROK;
dfd48732
NC
3614 assert(!(sflags & SVp_NOK));
3615 assert(!(sflags & SVp_IOK));
3616 assert(!(sflags & SVf_NOK));
3617 assert(!(sflags & SVf_IOK));
ed6116ce 3618 }
cecf5685 3619 else if (dtype == SVt_PVGV && isGV_with_GP(dstr)) {
c0c44674
NC
3620 if (!(sflags & SVf_OK)) {
3621 if (ckWARN(WARN_MISC))
3622 Perl_warner(aTHX_ packWARN(WARN_MISC),
3623 "Undefined value assigned to typeglob");
3624 }
3625 else {
3626 GV *gv = gv_fetchsv(sstr, GV_ADD, SVt_PVGV);
3627 if (dstr != (SV*)gv) {
3628 if (GvGP(dstr))
3629 gp_free((GV*)dstr);
3630 GvGP(dstr) = gp_ref(GvGP(gv));
3631 }
3632 }
3633 }
8990e307 3634 else if (sflags & SVp_POK) {
765f542d 3635 bool isSwipe = 0;
79072805
LW
3636
3637 /*
3638 * Check to see if we can just swipe the string. If so, it's a
3639 * possible small lose on short strings, but a big win on long ones.
3f7c398e
SP
3640 * It might even be a win on short strings if SvPVX_const(dstr)
3641 * has to be allocated and SvPVX_const(sstr) has to be freed.
34482cd6
NC
3642 * Likewise if we can set up COW rather than doing an actual copy, we
3643 * drop to the else clause, as the swipe code and the COW setup code
3644 * have much in common.
79072805
LW
3645 */
3646
120fac95
NC
3647 /* Whichever path we take through the next code, we want this true,
3648 and doing it now facilitates the COW check. */
3649 (void)SvPOK_only(dstr);
3650
765f542d 3651 if (
34482cd6
NC
3652 /* If we're already COW then this clause is not true, and if COW
3653 is allowed then we drop down to the else and make dest COW
3654 with us. If caller hasn't said that we're allowed to COW
3655 shared hash keys then we don't do the COW setup, even if the
3656 source scalar is a shared hash key scalar. */
3657 (((flags & SV_COW_SHARED_HASH_KEYS)
3658 ? (sflags & (SVf_FAKE|SVf_READONLY)) != (SVf_FAKE|SVf_READONLY)
3659 : 1 /* If making a COW copy is forbidden then the behaviour we
3660 desire is as if the source SV isn't actually already
3661 COW, even if it is. So we act as if the source flags
3662 are not COW, rather than actually testing them. */
3663 )
f8c7b90f 3664#ifndef PERL_OLD_COPY_ON_WRITE
34482cd6
NC
3665 /* The change that added SV_COW_SHARED_HASH_KEYS makes the logic
3666 when PERL_OLD_COPY_ON_WRITE is defined a little wrong.
3667 Conceptually PERL_OLD_COPY_ON_WRITE being defined should
3668 override SV_COW_SHARED_HASH_KEYS, because it means "always COW"
3669 but in turn, it's somewhat dead code, never expected to go
3670 live, but more kept as a placeholder on how to do it better
3671 in a newer implementation. */
3672 /* If we are COW and dstr is a suitable target then we drop down
3673 into the else and make dest a COW of us. */
b8f9541a
NC
3674 || (SvFLAGS(dstr) & CAN_COW_MASK) != CAN_COW_FLAGS
3675#endif
3676 )
765f542d 3677 &&
765f542d
NC
3678 !(isSwipe =
3679 (sflags & SVs_TEMP) && /* slated for free anyway? */
3680 !(sflags & SVf_OOK) && /* and not involved in OOK hack? */
5fcdf167
NC
3681 (!(flags & SV_NOSTEAL)) &&
3682 /* and we're allowed to steal temps */
765f542d
NC
3683 SvREFCNT(sstr) == 1 && /* and no other references to it? */
3684 SvLEN(sstr) && /* and really is a string */
645c22ef 3685 /* and won't be needed again, potentially */
765f542d 3686 !(PL_op && PL_op->op_type == OP_AASSIGN))
f8c7b90f 3687#ifdef PERL_OLD_COPY_ON_WRITE
cb23d5b1
NC
3688 && ((flags & SV_COW_SHARED_HASH_KEYS)
3689 ? (!((sflags & CAN_COW_MASK) == CAN_COW_FLAGS
3690 && (SvFLAGS(dstr) & CAN_COW_MASK) == CAN_COW_FLAGS
3691 && SvTYPE(sstr) >= SVt_PVIV))
3692 : 1)
765f542d
NC
3693#endif
3694 ) {
3695 /* Failed the swipe test, and it's not a shared hash key either.
3696 Have to copy the string. */
3697 STRLEN len = SvCUR(sstr);
3698 SvGROW(dstr, len + 1); /* inlined from sv_setpvn */
3f7c398e 3699 Move(SvPVX_const(sstr),SvPVX(dstr),len,char);
765f542d
NC
3700 SvCUR_set(dstr, len);
3701 *SvEND(dstr) = '\0';
765f542d 3702 } else {
f8c7b90f 3703 /* If PERL_OLD_COPY_ON_WRITE is not defined, then isSwipe will always
765f542d 3704 be true in here. */
765f542d
NC
3705 /* Either it's a shared hash key, or it's suitable for
3706 copy-on-write or we can swipe the string. */
46187eeb 3707 if (DEBUG_C_TEST) {
ed252734 3708 PerlIO_printf(Perl_debug_log, "Copy on write: sstr --> dstr\n");
e419cbc5
NC
3709 sv_dump(sstr);
3710 sv_dump(dstr);
46187eeb 3711 }
f8c7b90f 3712#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
3713 if (!isSwipe) {
3714 /* I believe I should acquire a global SV mutex if
3715 it's a COW sv (not a shared hash key) to stop
3716 it going un copy-on-write.
3717 If the source SV has gone un copy on write between up there
3718 and down here, then (assert() that) it is of the correct
3719 form to make it copy on write again */
3720 if ((sflags & (SVf_FAKE | SVf_READONLY))
3721 != (SVf_FAKE | SVf_READONLY)) {
3722 SvREADONLY_on(sstr);
3723 SvFAKE_on(sstr);
3724 /* Make the source SV into a loop of 1.
3725 (about to become 2) */
a29f6d03 3726 SV_COW_NEXT_SV_SET(sstr, sstr);
765f542d
NC
3727 }
3728 }
3729#endif
3730 /* Initial code is common. */
94010e71
NC
3731 if (SvPVX_const(dstr)) { /* we know that dtype >= SVt_PV */
3732 SvPV_free(dstr);
79072805 3733 }
765f542d 3734
765f542d
NC
3735 if (!isSwipe) {
3736 /* making another shared SV. */
3737 STRLEN cur = SvCUR(sstr);
3738 STRLEN len = SvLEN(sstr);
f8c7b90f 3739#ifdef PERL_OLD_COPY_ON_WRITE
765f542d 3740 if (len) {
b8f9541a 3741 assert (SvTYPE(dstr) >= SVt_PVIV);
765f542d
NC
3742 /* SvIsCOW_normal */
3743 /* splice us in between source and next-after-source. */
a29f6d03
NC
3744 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
3745 SV_COW_NEXT_SV_SET(sstr, dstr);
940132f3 3746 SvPV_set(dstr, SvPVX_mutable(sstr));
a604c751
NC
3747 } else
3748#endif
3749 {
765f542d 3750 /* SvIsCOW_shared_hash */
46187eeb
NC
3751 DEBUG_C(PerlIO_printf(Perl_debug_log,
3752 "Copy on write: Sharing hash\n"));
b8f9541a 3753
bdd68bc3 3754 assert (SvTYPE(dstr) >= SVt_PV);
765f542d 3755 SvPV_set(dstr,
d1db91c6 3756 HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)))));
bdd68bc3 3757 }
87a1ef3d
SP
3758 SvLEN_set(dstr, len);
3759 SvCUR_set(dstr, cur);
765f542d
NC
3760 SvREADONLY_on(dstr);
3761 SvFAKE_on(dstr);
3762 /* Relesase a global SV mutex. */
3763 }
3764 else
765f542d 3765 { /* Passes the swipe test. */
78d1e721 3766 SvPV_set(dstr, SvPVX_mutable(sstr));
765f542d
NC
3767 SvLEN_set(dstr, SvLEN(sstr));
3768 SvCUR_set(dstr, SvCUR(sstr));
3769
3770 SvTEMP_off(dstr);
3771 (void)SvOK_off(sstr); /* NOTE: nukes most SvFLAGS on sstr */
6136c704 3772 SvPV_set(sstr, NULL);
765f542d
NC
3773 SvLEN_set(sstr, 0);
3774 SvCUR_set(sstr, 0);
3775 SvTEMP_off(sstr);
3776 }
3777 }
8990e307 3778 if (sflags & SVp_NOK) {
9d6ce603 3779 SvNV_set(dstr, SvNVX(sstr));
79072805 3780 }
8990e307 3781 if (sflags & SVp_IOK) {
88555484 3782 SvOOK_off(dstr);
23525414
NC
3783 SvIV_set(dstr, SvIVX(sstr));
3784 /* Must do this otherwise some other overloaded use of 0x80000000
3785 gets confused. I guess SVpbm_VALID */
2b1c7e3e 3786 if (sflags & SVf_IVisUV)
25da4f38 3787 SvIsUV_on(dstr);
79072805 3788 }
96d4b0ee 3789 SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_NOK|SVp_NOK|SVf_UTF8);
4f2da183 3790 {
b0a11fe1 3791 const MAGIC * const smg = SvVSTRING_mg(sstr);
4f2da183
NC
3792 if (smg) {
3793 sv_magic(dstr, NULL, PERL_MAGIC_vstring,
3794 smg->mg_ptr, smg->mg_len);
3795 SvRMAGICAL_on(dstr);
3796 }
7a5fa8a2 3797 }
79072805 3798 }
5d581361 3799 else if (sflags & (SVp_IOK|SVp_NOK)) {
c2468cc7 3800 (void)SvOK_off(dstr);
96d4b0ee 3801 SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_IVisUV|SVf_NOK|SVp_NOK);
5d581361
NC
3802 if (sflags & SVp_IOK) {
3803 /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
3804 SvIV_set(dstr, SvIVX(sstr));
3805 }
3332b3c1 3806 if (sflags & SVp_NOK) {
9d6ce603 3807 SvNV_set(dstr, SvNVX(sstr));
3332b3c1
JH
3808 }
3809 }
79072805 3810 else {
f7877b28 3811 if (isGV_with_GP(sstr)) {
180488f8
NC
3812 /* This stringification rule for globs is spread in 3 places.
3813 This feels bad. FIXME. */
3814 const U32 wasfake = sflags & SVf_FAKE;
3815
3816 /* FAKE globs can get coerced, so need to turn this off
3817 temporarily if it is on. */
3818 SvFAKE_off(sstr);
3819 gv_efullname3(dstr, (GV *)sstr, "*");
3820 SvFLAGS(sstr) |= wasfake;
3821 }
20408e3c
GS
3822 else
3823 (void)SvOK_off(dstr);
a0d0e21e 3824 }
27c9684d
AP
3825 if (SvTAINTED(sstr))
3826 SvTAINT(dstr);
79072805
LW
3827}
3828
954c1994
GS
3829/*
3830=for apidoc sv_setsv_mg
3831
3832Like C<sv_setsv>, but also handles 'set' magic.
3833
3834=cut
3835*/
3836
79072805 3837void
864dbfa3 3838Perl_sv_setsv_mg(pTHX_ SV *dstr, register SV *sstr)
ef50df4b
GS
3839{
3840 sv_setsv(dstr,sstr);
3841 SvSETMAGIC(dstr);
3842}
3843
f8c7b90f 3844#ifdef PERL_OLD_COPY_ON_WRITE
ed252734
NC
3845SV *
3846Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
3847{
3848 STRLEN cur = SvCUR(sstr);
3849 STRLEN len = SvLEN(sstr);
3850 register char *new_pv;
3851
3852 if (DEBUG_C_TEST) {
3853 PerlIO_printf(Perl_debug_log, "Fast copy on write: %p -> %p\n",
6c9570dc 3854 (void*)sstr, (void*)dstr);
ed252734
NC
3855 sv_dump(sstr);
3856 if (dstr)
3857 sv_dump(dstr);
3858 }
3859
3860 if (dstr) {
3861 if (SvTHINKFIRST(dstr))
3862 sv_force_normal_flags(dstr, SV_COW_DROP_PV);
3f7c398e
SP
3863 else if (SvPVX_const(dstr))
3864 Safefree(SvPVX_const(dstr));
ed252734
NC
3865 }
3866 else
3867 new_SV(dstr);
862a34c6 3868 SvUPGRADE(dstr, SVt_PVIV);
ed252734
NC
3869
3870 assert (SvPOK(sstr));
3871 assert (SvPOKp(sstr));
3872 assert (!SvIOK(sstr));
3873 assert (!SvIOKp(sstr));
3874 assert (!SvNOK(sstr));
3875 assert (!SvNOKp(sstr));
3876
3877 if (SvIsCOW(sstr)) {
3878
3879 if (SvLEN(sstr) == 0) {
3880 /* source is a COW shared hash key. */
ed252734
NC
3881 DEBUG_C(PerlIO_printf(Perl_debug_log,
3882 "Fast copy on write: Sharing hash\n"));
d1db91c6 3883 new_pv = HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr))));
ed252734
NC
3884 goto common_exit;
3885 }
3886 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
3887 } else {
3888 assert ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS);
862a34c6 3889 SvUPGRADE(sstr, SVt_PVIV);
ed252734
NC
3890 SvREADONLY_on(sstr);
3891 SvFAKE_on(sstr);
3892 DEBUG_C(PerlIO_printf(Perl_debug_log,
3893 "Fast copy on write: Converting sstr to COW\n"));
3894 SV_COW_NEXT_SV_SET(dstr, sstr);
3895 }
3896 SV_COW_NEXT_SV_SET(sstr, dstr);
940132f3 3897 new_pv = SvPVX_mutable(sstr);
ed252734
NC
3898
3899 common_exit:
3900 SvPV_set(dstr, new_pv);
3901 SvFLAGS(dstr) = (SVt_PVIV|SVf_POK|SVp_POK|SVf_FAKE|SVf_READONLY);
3902 if (SvUTF8(sstr))
3903 SvUTF8_on(dstr);
87a1ef3d
SP
3904 SvLEN_set(dstr, len);
3905 SvCUR_set(dstr, cur);
ed252734
NC
3906 if (DEBUG_C_TEST) {
3907 sv_dump(dstr);
3908 }
3909 return dstr;
3910}
3911#endif
3912
954c1994
GS
3913/*
3914=for apidoc sv_setpvn
3915
3916Copies a string into an SV. The C<len> parameter indicates the number of
9e09f5f2
MHM
3917bytes to be copied. If the C<ptr> argument is NULL the SV will become
3918undefined. Does not handle 'set' magic. See C<sv_setpvn_mg>.
954c1994
GS
3919
3920=cut
3921*/
3922
ef50df4b 3923void
864dbfa3 3924Perl_sv_setpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
79072805 3925{
97aff369 3926 dVAR;
c6f8c383 3927 register char *dptr;
22c522df 3928
765f542d 3929 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 3930 if (!ptr) {
a0d0e21e 3931 (void)SvOK_off(sv);
463ee0b2
LW
3932 return;
3933 }
22c522df
JH
3934 else {
3935 /* len is STRLEN which is unsigned, need to copy to signed */
a3b680e6 3936 const IV iv = len;
9c5ffd7c
JH
3937 if (iv < 0)
3938 Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen");
22c522df 3939 }
862a34c6 3940 SvUPGRADE(sv, SVt_PV);
c6f8c383 3941
5902b6a9 3942 dptr = SvGROW(sv, len + 1);
c6f8c383
GA
3943 Move(ptr,dptr,len,char);
3944 dptr[len] = '\0';
79072805 3945 SvCUR_set(sv, len);
1aa99e6b 3946 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 3947 SvTAINT(sv);
79072805
LW
3948}
3949
954c1994
GS
3950/*
3951=for apidoc sv_setpvn_mg
3952
3953Like C<sv_setpvn>, but also handles 'set' magic.
3954
3955=cut
3956*/
3957
79072805 3958void
864dbfa3 3959Perl_sv_setpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
3960{
3961 sv_setpvn(sv,ptr,len);
3962 SvSETMAGIC(sv);
3963}
3964
954c1994
GS
3965/*
3966=for apidoc sv_setpv
3967
3968Copies a string into an SV. The string must be null-terminated. Does not
3969handle 'set' magic. See C<sv_setpv_mg>.
3970
3971=cut
3972*/
3973
ef50df4b 3974void
864dbfa3 3975Perl_sv_setpv(pTHX_ register SV *sv, register const char *ptr)
79072805 3976{
97aff369 3977 dVAR;
79072805
LW
3978 register STRLEN len;
3979
765f542d 3980 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 3981 if (!ptr) {
a0d0e21e 3982 (void)SvOK_off(sv);
463ee0b2
LW
3983 return;
3984 }
79072805 3985 len = strlen(ptr);
862a34c6 3986 SvUPGRADE(sv, SVt_PV);
c6f8c383 3987
79072805 3988 SvGROW(sv, len + 1);
463ee0b2 3989 Move(ptr,SvPVX(sv),len+1,char);
79072805 3990 SvCUR_set(sv, len);
1aa99e6b 3991 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2
LW
3992 SvTAINT(sv);
3993}
3994
954c1994
GS
3995/*
3996=for apidoc sv_setpv_mg
3997
3998Like C<sv_setpv>, but also handles 'set' magic.
3999
4000=cut
4001*/
4002
463ee0b2 4003void
864dbfa3 4004Perl_sv_setpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b
GS
4005{
4006 sv_setpv(sv,ptr);
4007 SvSETMAGIC(sv);
4008}
4009
954c1994 4010/*
47518d95 4011=for apidoc sv_usepvn_flags
954c1994 4012
794a0d33
JH
4013Tells an SV to use C<ptr> to find its string value. Normally the
4014string is stored inside the SV but sv_usepvn allows the SV to use an
4015outside string. The C<ptr> should point to memory that was allocated
c1c21316
NC
4016by C<malloc>. The string length, C<len>, must be supplied. By default
4017this function will realloc (i.e. move) the memory pointed to by C<ptr>,
794a0d33
JH
4018so that pointer should not be freed or used by the programmer after
4019giving it to sv_usepvn, and neither should any pointers from "behind"
c1c21316
NC
4020that pointer (e.g. ptr + 1) be used.
4021
4022If C<flags> & SV_SMAGIC is true, will call SvSETMAGIC. If C<flags> &
4023SV_HAS_TRAILING_NUL is true, then C<ptr[len]> must be NUL, and the realloc
cbf82dd0 4024will be skipped. (i.e. the buffer is actually at least 1 byte longer than
c1c21316 4025C<len>, and already meets the requirements for storing in C<SvPVX>)
954c1994
GS
4026
4027=cut
4028*/
4029
ef50df4b 4030void
47518d95 4031Perl_sv_usepvn_flags(pTHX_ SV *sv, char *ptr, STRLEN len, U32 flags)
463ee0b2 4032{
97aff369 4033 dVAR;
1936d2a7 4034 STRLEN allocate;
765f542d 4035 SV_CHECK_THINKFIRST_COW_DROP(sv);
862a34c6 4036 SvUPGRADE(sv, SVt_PV);
463ee0b2 4037 if (!ptr) {
a0d0e21e 4038 (void)SvOK_off(sv);
47518d95
NC
4039 if (flags & SV_SMAGIC)
4040 SvSETMAGIC(sv);
463ee0b2
LW
4041 return;
4042 }
3f7c398e 4043 if (SvPVX_const(sv))
8bd4d4c5 4044 SvPV_free(sv);
1936d2a7 4045
0b7042f9 4046#ifdef DEBUGGING
2e90b4cd
NC
4047 if (flags & SV_HAS_TRAILING_NUL)
4048 assert(ptr[len] == '\0');
0b7042f9 4049#endif
2e90b4cd 4050
c1c21316 4051 allocate = (flags & SV_HAS_TRAILING_NUL)
8f01dc65 4052 ? len + 1: PERL_STRLEN_ROUNDUP(len + 1);
cbf82dd0
NC
4053 if (flags & SV_HAS_TRAILING_NUL) {
4054 /* It's long enough - do nothing.
4055 Specfically Perl_newCONSTSUB is relying on this. */
4056 } else {
69d25b4f 4057#ifdef DEBUGGING
69d25b4f 4058 /* Force a move to shake out bugs in callers. */
10edeb5d 4059 char *new_ptr = (char*)safemalloc(allocate);
69d25b4f
NC
4060 Copy(ptr, new_ptr, len, char);
4061 PoisonFree(ptr,len,char);
4062 Safefree(ptr);
4063 ptr = new_ptr;
69d25b4f 4064#else
10edeb5d 4065 ptr = (char*) saferealloc (ptr, allocate);
69d25b4f 4066#endif
cbf82dd0 4067 }
f880fe2f 4068 SvPV_set(sv, ptr);
463ee0b2 4069 SvCUR_set(sv, len);
1936d2a7 4070 SvLEN_set(sv, allocate);
c1c21316 4071 if (!(flags & SV_HAS_TRAILING_NUL)) {
97a130b8 4072 ptr[len] = '\0';
c1c21316 4073 }
1aa99e6b 4074 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4075 SvTAINT(sv);
47518d95
NC
4076 if (flags & SV_SMAGIC)
4077 SvSETMAGIC(sv);
ef50df4b
GS
4078}
4079
f8c7b90f 4080#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
4081/* Need to do this *after* making the SV normal, as we need the buffer
4082 pointer to remain valid until after we've copied it. If we let go too early,
4083 another thread could invalidate it by unsharing last of the same hash key
4084 (which it can do by means other than releasing copy-on-write Svs)
4085 or by changing the other copy-on-write SVs in the loop. */
4086STATIC void
5302ffd4 4087S_sv_release_COW(pTHX_ register SV *sv, const char *pvx, SV *after)
765f542d 4088{
5302ffd4 4089 { /* this SV was SvIsCOW_normal(sv) */
765f542d 4090 /* we need to find the SV pointing to us. */
cf5629ad 4091 SV *current = SV_COW_NEXT_SV(after);
7a5fa8a2 4092
765f542d
NC
4093 if (current == sv) {
4094 /* The SV we point to points back to us (there were only two of us
4095 in the loop.)
4096 Hence other SV is no longer copy on write either. */
4097 SvFAKE_off(after);
4098 SvREADONLY_off(after);
4099 } else {
4100 /* We need to follow the pointers around the loop. */
4101 SV *next;
4102 while ((next = SV_COW_NEXT_SV(current)) != sv) {
4103 assert (next);
4104 current = next;
4105 /* don't loop forever if the structure is bust, and we have
4106 a pointer into a closed loop. */
4107 assert (current != after);
3f7c398e 4108 assert (SvPVX_const(current) == pvx);
765f542d
NC
4109 }
4110 /* Make the SV before us point to the SV after us. */
a29f6d03 4111 SV_COW_NEXT_SV_SET(current, after);
765f542d 4112 }
765f542d
NC
4113 }
4114}
765f542d 4115#endif
645c22ef
DM
4116/*
4117=for apidoc sv_force_normal_flags
4118
4119Undo various types of fakery on an SV: if the PV is a shared string, make
4120a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
765f542d
NC
4121an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
4122we do the copy, and is also used locally. If C<SV_COW_DROP_PV> is set
4123then a copy-on-write scalar drops its PV buffer (if any) and becomes
4124SvPOK_off rather than making a copy. (Used where this scalar is about to be
d3050d9d 4125set to some other value.) In addition, the C<flags> parameter gets passed to
765f542d
NC
4126C<sv_unref_flags()> when unrefing. C<sv_force_normal> calls this function
4127with flags set to 0.
645c22ef
DM
4128
4129=cut
4130*/
4131
6fc92669 4132void
840a7b70 4133Perl_sv_force_normal_flags(pTHX_ register SV *sv, U32 flags)
0f15f207 4134{
97aff369 4135 dVAR;
f8c7b90f 4136#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
4137 if (SvREADONLY(sv)) {
4138 /* At this point I believe I should acquire a global SV mutex. */
4139 if (SvFAKE(sv)) {
b64e5050 4140 const char * const pvx = SvPVX_const(sv);
a28509cc
AL
4141 const STRLEN len = SvLEN(sv);
4142 const STRLEN cur = SvCUR(sv);
5302ffd4
NC
4143 /* next COW sv in the loop. If len is 0 then this is a shared-hash
4144 key scalar, so we mustn't attempt to call SV_COW_NEXT_SV(), as
4145 we'll fail an assertion. */
4146 SV * const next = len ? SV_COW_NEXT_SV(sv) : 0;
4147
46187eeb
NC
4148 if (DEBUG_C_TEST) {
4149 PerlIO_printf(Perl_debug_log,
4150 "Copy on write: Force normal %ld\n",
4151 (long) flags);
e419cbc5 4152 sv_dump(sv);
46187eeb 4153 }
765f542d
NC
4154 SvFAKE_off(sv);
4155 SvREADONLY_off(sv);
9f653bb5 4156 /* This SV doesn't own the buffer, so need to Newx() a new one: */
6136c704 4157 SvPV_set(sv, NULL);
87a1ef3d 4158 SvLEN_set(sv, 0);
765f542d
NC
4159 if (flags & SV_COW_DROP_PV) {
4160 /* OK, so we don't need to copy our buffer. */
4161 SvPOK_off(sv);
4162 } else {
4163 SvGROW(sv, cur + 1);
4164 Move(pvx,SvPVX(sv),cur,char);
87a1ef3d 4165 SvCUR_set(sv, cur);
765f542d
NC
4166 *SvEND(sv) = '\0';
4167 }
5302ffd4
NC
4168 if (len) {
4169 sv_release_COW(sv, pvx, next);
4170 } else {
4171 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
4172 }
46187eeb 4173 if (DEBUG_C_TEST) {
e419cbc5 4174 sv_dump(sv);
46187eeb 4175 }
765f542d 4176 }
923e4eb5 4177 else if (IN_PERL_RUNTIME)
765f542d
NC
4178 Perl_croak(aTHX_ PL_no_modify);
4179 /* At this point I believe that I can drop the global SV mutex. */
4180 }
4181#else
2213622d 4182 if (SvREADONLY(sv)) {
1c846c1f 4183 if (SvFAKE(sv)) {
b64e5050 4184 const char * const pvx = SvPVX_const(sv);
66a1b24b 4185 const STRLEN len = SvCUR(sv);
10bcdfd6
NC
4186 SvFAKE_off(sv);
4187 SvREADONLY_off(sv);
bd61b366 4188 SvPV_set(sv, NULL);
66a1b24b 4189 SvLEN_set(sv, 0);
1c846c1f 4190 SvGROW(sv, len + 1);
706aa1c9 4191 Move(pvx,SvPVX(sv),len,char);
1c846c1f 4192 *SvEND(sv) = '\0';
bdd68bc3 4193 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
1c846c1f 4194 }
923e4eb5 4195 else if (IN_PERL_RUNTIME)
cea2e8a9 4196 Perl_croak(aTHX_ PL_no_modify);
0f15f207 4197 }
765f542d 4198#endif
2213622d 4199 if (SvROK(sv))
840a7b70 4200 sv_unref_flags(sv, flags);
6fc92669
GS
4201 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
4202 sv_unglob(sv);
0f15f207 4203}
1c846c1f 4204
645c22ef 4205/*
954c1994
GS
4206=for apidoc sv_chop
4207
1c846c1f 4208Efficient removal of characters from the beginning of the string buffer.
954c1994
GS
4209SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
4210the string buffer. The C<ptr> becomes the first character of the adjusted
645c22ef 4211string. Uses the "OOK hack".
3f7c398e 4212Beware: after this function returns, C<ptr> and SvPVX_const(sv) may no longer
31869a79 4213refer to the same chunk of data.
954c1994
GS
4214
4215=cut
4216*/
4217
79072805 4218void
f54cb97a 4219Perl_sv_chop(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
4220{
4221 register STRLEN delta;
a0d0e21e 4222 if (!ptr || !SvPOKp(sv))
79072805 4223 return;
3f7c398e 4224 delta = ptr - SvPVX_const(sv);
15895f8a
NC
4225 if (!delta) {
4226 /* Nothing to do. */
4227 return;
4228 }
50af2e61 4229 assert(ptr > SvPVX_const(sv));
2213622d 4230 SV_CHECK_THINKFIRST(sv);
79072805
LW
4231 if (SvTYPE(sv) < SVt_PVIV)
4232 sv_upgrade(sv,SVt_PVIV);
4233
4234 if (!SvOOK(sv)) {
50483b2c 4235 if (!SvLEN(sv)) { /* make copy of shared string */
3f7c398e 4236 const char *pvx = SvPVX_const(sv);
a28509cc 4237 const STRLEN len = SvCUR(sv);
50483b2c 4238 SvGROW(sv, len + 1);
706aa1c9 4239 Move(pvx,SvPVX(sv),len,char);
50483b2c
JD
4240 *SvEND(sv) = '\0';
4241 }
45977657 4242 SvIV_set(sv, 0);
a4bfb290
AB
4243 /* Same SvOOK_on but SvOOK_on does a SvIOK_off
4244 and we do that anyway inside the SvNIOK_off
4245 */
7a5fa8a2 4246 SvFLAGS(sv) |= SVf_OOK;
79072805 4247 }
a4bfb290 4248 SvNIOK_off(sv);
b162af07
SP
4249 SvLEN_set(sv, SvLEN(sv) - delta);
4250 SvCUR_set(sv, SvCUR(sv) - delta);
f880fe2f 4251 SvPV_set(sv, SvPVX(sv) + delta);
45977657 4252 SvIV_set(sv, SvIVX(sv) + delta);
50af2e61
NC
4253#ifdef DEBUGGING
4254 {
4255 /* Fill the preceding buffer with sentinals to verify that no-one is
4256 using it. */
4257 U8 *p = (U8*) SvPVX(sv);
4258 const U8 *const real_start = p - SvIVX(sv);
4259 while (p > real_start) {
4260 --p;
4261 *p = (U8)PTR2UV(p);
4262 }
4263 }
4264#endif
79072805
LW
4265}
4266
954c1994
GS
4267/*
4268=for apidoc sv_catpvn
4269
4270Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
4271C<len> indicates number of bytes to copy. If the SV has the UTF-8
4272status set, then the bytes appended should be valid UTF-8.
d5ce4a7c 4273Handles 'get' magic, but not 'set' magic. See C<sv_catpvn_mg>.
954c1994 4274
8d6d96c1
HS
4275=for apidoc sv_catpvn_flags
4276
4277Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
4278C<len> indicates number of bytes to copy. If the SV has the UTF-8
4279status set, then the bytes appended should be valid UTF-8.
8d6d96c1
HS
4280If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
4281appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
4282in terms of this function.
4283
4284=cut
4285*/
4286
4287void
4288Perl_sv_catpvn_flags(pTHX_ register SV *dsv, register const char *sstr, register STRLEN slen, I32 flags)
4289{
97aff369 4290 dVAR;
8d6d96c1 4291 STRLEN dlen;
fabdb6c0 4292 const char * const dstr = SvPV_force_flags(dsv, dlen, flags);
8d6d96c1 4293
8d6d96c1
HS
4294 SvGROW(dsv, dlen + slen + 1);
4295 if (sstr == dstr)
3f7c398e 4296 sstr = SvPVX_const(dsv);
8d6d96c1 4297 Move(sstr, SvPVX(dsv) + dlen, slen, char);
b162af07 4298 SvCUR_set(dsv, SvCUR(dsv) + slen);
8d6d96c1
HS
4299 *SvEND(dsv) = '\0';
4300 (void)SvPOK_only_UTF8(dsv); /* validate pointer */
4301 SvTAINT(dsv);
bddd5118
NC
4302 if (flags & SV_SMAGIC)
4303 SvSETMAGIC(dsv);
79072805
LW
4304}
4305
954c1994 4306/*
954c1994
GS
4307=for apidoc sv_catsv
4308
13e8c8e3
JH
4309Concatenates the string from SV C<ssv> onto the end of the string in
4310SV C<dsv>. Modifies C<dsv> but not C<ssv>. Handles 'get' magic, but
4311not 'set' magic. See C<sv_catsv_mg>.
954c1994 4312
8d6d96c1
HS
4313=for apidoc sv_catsv_flags
4314
4315Concatenates the string from SV C<ssv> onto the end of the string in
4316SV C<dsv>. Modifies C<dsv> but not C<ssv>. If C<flags> has C<SV_GMAGIC>
4317bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
4318and C<sv_catsv_nomg> are implemented in terms of this function.
4319
4320=cut */
4321
ef50df4b 4322void
8d6d96c1 4323Perl_sv_catsv_flags(pTHX_ SV *dsv, register SV *ssv, I32 flags)
79072805 4324{
97aff369 4325 dVAR;
bddd5118 4326 if (ssv) {
00b6aa41
AL
4327 STRLEN slen;
4328 const char *spv = SvPV_const(ssv, slen);
4329 if (spv) {
bddd5118
NC
4330 /* sutf8 and dutf8 were type bool, but under USE_ITHREADS,
4331 gcc version 2.95.2 20000220 (Debian GNU/Linux) for
4332 Linux xxx 2.2.17 on sparc64 with gcc -O2, we erroneously
4333 get dutf8 = 0x20000000, (i.e. SVf_UTF8) even though
4334 dsv->sv_flags doesn't have that bit set.
4fd84b44 4335 Andy Dougherty 12 Oct 2001
bddd5118
NC
4336 */
4337 const I32 sutf8 = DO_UTF8(ssv);
4338 I32 dutf8;
13e8c8e3 4339
bddd5118
NC
4340 if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
4341 mg_get(dsv);
4342 dutf8 = DO_UTF8(dsv);
8d6d96c1 4343
bddd5118
NC
4344 if (dutf8 != sutf8) {
4345 if (dutf8) {
4346 /* Not modifying source SV, so taking a temporary copy. */
59cd0e26 4347 SV* const csv = newSVpvn_flags(spv, slen, SVs_TEMP);
13e8c8e3 4348
bddd5118
NC
4349 sv_utf8_upgrade(csv);
4350 spv = SvPV_const(csv, slen);
4351 }
4352 else
4353 sv_utf8_upgrade_nomg(dsv);
13e8c8e3 4354 }
bddd5118 4355 sv_catpvn_nomg(dsv, spv, slen);
e84ff256 4356 }
560a288e 4357 }
bddd5118
NC
4358 if (flags & SV_SMAGIC)
4359 SvSETMAGIC(dsv);
79072805
LW
4360}
4361
954c1994 4362/*
954c1994
GS
4363=for apidoc sv_catpv
4364
4365Concatenates the string onto the end of the string which is in the SV.
1e54db1a
JH
4366If the SV has the UTF-8 status set, then the bytes appended should be
4367valid UTF-8. Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
954c1994 4368
d5ce4a7c 4369=cut */
954c1994 4370
ef50df4b 4371void
0c981600 4372Perl_sv_catpv(pTHX_ register SV *sv, register const char *ptr)
79072805 4373{
97aff369 4374 dVAR;
79072805 4375 register STRLEN len;
463ee0b2 4376 STRLEN tlen;
748a9306 4377 char *junk;
79072805 4378
0c981600 4379 if (!ptr)
79072805 4380 return;
748a9306 4381 junk = SvPV_force(sv, tlen);
0c981600 4382 len = strlen(ptr);
463ee0b2 4383 SvGROW(sv, tlen + len + 1);
0c981600 4384 if (ptr == junk)
3f7c398e 4385 ptr = SvPVX_const(sv);
0c981600 4386 Move(ptr,SvPVX(sv)+tlen,len+1,char);
b162af07 4387 SvCUR_set(sv, SvCUR(sv) + len);
d41ff1b8 4388 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4389 SvTAINT(sv);
79072805
LW
4390}
4391
954c1994
GS
4392/*
4393=for apidoc sv_catpv_mg
4394
4395Like C<sv_catpv>, but also handles 'set' magic.
4396
4397=cut
4398*/
4399
ef50df4b 4400void
0c981600 4401Perl_sv_catpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b 4402{
0c981600 4403 sv_catpv(sv,ptr);
ef50df4b
GS
4404 SvSETMAGIC(sv);
4405}
4406
645c22ef
DM
4407/*
4408=for apidoc newSV
4409
561b68a9
SH
4410Creates a new SV. A non-zero C<len> parameter indicates the number of
4411bytes of preallocated string space the SV should have. An extra byte for a
4412trailing NUL is also reserved. (SvPOK is not set for the SV even if string
4413space is allocated.) The reference count for the new SV is set to 1.
4414
4415In 5.9.3, newSV() replaces the older NEWSV() API, and drops the first
4416parameter, I<x>, a debug aid which allowed callers to identify themselves.
4417This aid has been superseded by a new build option, PERL_MEM_LOG (see
4418L<perlhack/PERL_MEM_LOG>). The older API is still there for use in XS
4419modules supporting older perls.
645c22ef
DM
4420
4421=cut
4422*/
4423
79072805 4424SV *
864dbfa3 4425Perl_newSV(pTHX_ STRLEN len)
79072805 4426{
97aff369 4427 dVAR;
79072805 4428 register SV *sv;
1c846c1f 4429
4561caa4 4430 new_SV(sv);
79072805
LW
4431 if (len) {
4432 sv_upgrade(sv, SVt_PV);
4433 SvGROW(sv, len + 1);
4434 }
4435 return sv;
4436}
954c1994 4437/*
92110913 4438=for apidoc sv_magicext
954c1994 4439
68795e93 4440Adds magic to an SV, upgrading it if necessary. Applies the
2d8d5d5a 4441supplied vtable and returns a pointer to the magic added.
92110913 4442
2d8d5d5a
SH
4443Note that C<sv_magicext> will allow things that C<sv_magic> will not.
4444In particular, you can add magic to SvREADONLY SVs, and add more than
4445one instance of the same 'how'.
645c22ef 4446
2d8d5d5a
SH
4447If C<namlen> is greater than zero then a C<savepvn> I<copy> of C<name> is
4448stored, if C<namlen> is zero then C<name> is stored as-is and - as another
4449special case - if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
4450to contain an C<SV*> and is stored as-is with its REFCNT incremented.
92110913 4451
2d8d5d5a 4452(This is now used as a subroutine by C<sv_magic>.)
954c1994
GS
4453
4454=cut
4455*/
92110913 4456MAGIC *
53d44271 4457Perl_sv_magicext(pTHX_ SV* sv, SV* obj, int how, const MGVTBL *vtable,
92110913 4458 const char* name, I32 namlen)
79072805 4459{
97aff369 4460 dVAR;
79072805 4461 MAGIC* mg;
68795e93 4462
7a7f3e45 4463 SvUPGRADE(sv, SVt_PVMG);
a02a5408 4464 Newxz(mg, 1, MAGIC);
79072805 4465 mg->mg_moremagic = SvMAGIC(sv);
b162af07 4466 SvMAGIC_set(sv, mg);
75f9d97a 4467
05f95b08
SB
4468 /* Sometimes a magic contains a reference loop, where the sv and
4469 object refer to each other. To prevent a reference loop that
4470 would prevent such objects being freed, we look for such loops
4471 and if we find one we avoid incrementing the object refcount.
87f0b213
JH
4472
4473 Note we cannot do this to avoid self-tie loops as intervening RV must
b5ccf5f2 4474 have its REFCNT incremented to keep it in existence.
87f0b213
JH
4475
4476 */
14befaf4
DM
4477 if (!obj || obj == sv ||
4478 how == PERL_MAGIC_arylen ||
8d2f4536 4479 how == PERL_MAGIC_symtab ||
75f9d97a
JH
4480 (SvTYPE(obj) == SVt_PVGV &&
4481 (GvSV(obj) == sv || GvHV(obj) == (HV*)sv || GvAV(obj) == (AV*)sv ||
4482 GvCV(obj) == (CV*)sv || GvIOp(obj) == (IO*)sv ||
2628be26 4483 GvFORM(obj) == (CV*)sv)))
75f9d97a 4484 {
8990e307 4485 mg->mg_obj = obj;
75f9d97a 4486 }
85e6fe83 4487 else {
b37c2d43 4488 mg->mg_obj = SvREFCNT_inc_simple(obj);
85e6fe83
LW
4489 mg->mg_flags |= MGf_REFCOUNTED;
4490 }
b5ccf5f2
YST
4491
4492 /* Normal self-ties simply pass a null object, and instead of
4493 using mg_obj directly, use the SvTIED_obj macro to produce a
4494 new RV as needed. For glob "self-ties", we are tieing the PVIO
4495 with an RV obj pointing to the glob containing the PVIO. In
4496 this case, to avoid a reference loop, we need to weaken the
4497 reference.
4498 */
4499
4500 if (how == PERL_MAGIC_tiedscalar && SvTYPE(sv) == SVt_PVIO &&
4501 obj && SvROK(obj) && GvIO(SvRV(obj)) == (IO*)sv)
4502 {
4503 sv_rvweaken(obj);
4504 }
4505
79072805 4506 mg->mg_type = how;
565764a8 4507 mg->mg_len = namlen;
9cbac4c7 4508 if (name) {
92110913 4509 if (namlen > 0)
1edc1566 4510 mg->mg_ptr = savepvn(name, namlen);
c6ee37c5 4511 else if (namlen == HEf_SVKEY)
b37c2d43 4512 mg->mg_ptr = (char*)SvREFCNT_inc_simple_NN((SV*)name);
68795e93 4513 else
92110913 4514 mg->mg_ptr = (char *) name;
9cbac4c7 4515 }
53d44271 4516 mg->mg_virtual = (MGVTBL *) vtable;
68795e93 4517
92110913
NIS
4518 mg_magical(sv);
4519 if (SvGMAGICAL(sv))
4520 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
4521 return mg;
4522}
4523
4524/*
4525=for apidoc sv_magic
1c846c1f 4526
92110913
NIS
4527Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
4528then adds a new magic item of type C<how> to the head of the magic list.
4529
2d8d5d5a
SH
4530See C<sv_magicext> (which C<sv_magic> now calls) for a description of the
4531handling of the C<name> and C<namlen> arguments.
4532
4509d3fb
SB
4533You need to use C<sv_magicext> to add magic to SvREADONLY SVs and also
4534to add more than one instance of the same 'how'.
4535
92110913
NIS
4536=cut
4537*/
4538
4539void
4540Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
68795e93 4541{
97aff369 4542 dVAR;
53d44271 4543 const MGVTBL *vtable;
92110913 4544 MAGIC* mg;
92110913 4545
f8c7b90f 4546#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
4547 if (SvIsCOW(sv))
4548 sv_force_normal_flags(sv, 0);
4549#endif
92110913 4550 if (SvREADONLY(sv)) {
d8084ca5
DM
4551 if (
4552 /* its okay to attach magic to shared strings; the subsequent
4553 * upgrade to PVMG will unshare the string */
4554 !(SvFAKE(sv) && SvTYPE(sv) < SVt_PVMG)
4555
4556 && IN_PERL_RUNTIME
92110913
NIS
4557 && how != PERL_MAGIC_regex_global
4558 && how != PERL_MAGIC_bm
4559 && how != PERL_MAGIC_fm
4560 && how != PERL_MAGIC_sv
e6469971 4561 && how != PERL_MAGIC_backref
92110913
NIS
4562 )
4563 {
4564 Perl_croak(aTHX_ PL_no_modify);
4565 }
4566 }
4567 if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
4568 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
68795e93
NIS
4569 /* sv_magic() refuses to add a magic of the same 'how' as an
4570 existing one
92110913 4571 */
2a509ed3 4572 if (how == PERL_MAGIC_taint) {
92110913 4573 mg->mg_len |= 1;
2a509ed3
NC
4574 /* Any scalar which already had taint magic on which someone
4575 (erroneously?) did SvIOK_on() or similar will now be
4576 incorrectly sporting public "OK" flags. */
4577 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
4578 }
92110913
NIS
4579 return;
4580 }
4581 }
68795e93 4582
79072805 4583 switch (how) {
14befaf4 4584 case PERL_MAGIC_sv:
92110913 4585 vtable = &PL_vtbl_sv;
79072805 4586 break;
14befaf4 4587 case PERL_MAGIC_overload:
92110913 4588 vtable = &PL_vtbl_amagic;
a0d0e21e 4589 break;
14befaf4 4590 case PERL_MAGIC_overload_elem:
92110913 4591 vtable = &PL_vtbl_amagicelem;
a0d0e21e 4592 break;
14befaf4 4593 case PERL_MAGIC_overload_table:
92110913 4594 vtable = &PL_vtbl_ovrld;
a0d0e21e 4595 break;
14befaf4 4596 case PERL_MAGIC_bm:
92110913 4597 vtable = &PL_vtbl_bm;
79072805 4598 break;
14befaf4 4599 case PERL_MAGIC_regdata:
92110913 4600 vtable = &PL_vtbl_regdata;
6cef1e77 4601 break;
14befaf4 4602 case PERL_MAGIC_regdatum:
92110913 4603 vtable = &PL_vtbl_regdatum;
6cef1e77 4604 break;
14befaf4 4605 case PERL_MAGIC_env:
92110913 4606 vtable = &PL_vtbl_env;
79072805 4607 break;
14befaf4 4608 case PERL_MAGIC_fm:
92110913 4609 vtable = &PL_vtbl_fm;
55497cff 4610 break;
14befaf4 4611 case PERL_MAGIC_envelem:
92110913 4612 vtable = &PL_vtbl_envelem;
79072805 4613 break;
14befaf4 4614 case PERL_MAGIC_regex_global:
92110913 4615 vtable = &PL_vtbl_mglob;
93a17b20 4616 break;
14befaf4 4617 case PERL_MAGIC_isa:
92110913 4618 vtable = &PL_vtbl_isa;
463ee0b2 4619 break;
14befaf4 4620 case PERL_MAGIC_isaelem:
92110913 4621 vtable = &PL_vtbl_isaelem;
463ee0b2 4622 break;
14befaf4 4623 case PERL_MAGIC_nkeys:
92110913 4624 vtable = &PL_vtbl_nkeys;
16660edb 4625 break;
14befaf4 4626 case PERL_MAGIC_dbfile:
aec46f14 4627 vtable = NULL;
93a17b20 4628 break;
14befaf4 4629 case PERL_MAGIC_dbline:
92110913 4630 vtable = &PL_vtbl_dbline;
79072805 4631 break;
36477c24 4632#ifdef USE_LOCALE_COLLATE
14befaf4 4633 case PERL_MAGIC_collxfrm:
92110913 4634 vtable = &PL_vtbl_collxfrm;
bbce6d69 4635 break;
36477c24 4636#endif /* USE_LOCALE_COLLATE */
14befaf4 4637 case PERL_MAGIC_tied:
92110913 4638 vtable = &PL_vtbl_pack;
463ee0b2 4639 break;
14befaf4
DM
4640 case PERL_MAGIC_tiedelem:
4641 case PERL_MAGIC_tiedscalar:
92110913 4642 vtable = &PL_vtbl_packelem;
463ee0b2 4643 break;
14befaf4 4644 case PERL_MAGIC_qr:
92110913 4645 vtable = &PL_vtbl_regexp;
c277df42 4646 break;
b3ca2e83
NC
4647 case PERL_MAGIC_hints:
4648 /* As this vtable is all NULL, we can reuse it. */
14befaf4 4649 case PERL_MAGIC_sig:
92110913 4650 vtable = &PL_vtbl_sig;
79072805 4651 break;
14befaf4 4652 case PERL_MAGIC_sigelem:
92110913 4653 vtable = &PL_vtbl_sigelem;
79072805 4654 break;
14befaf4 4655 case PERL_MAGIC_taint:
92110913 4656 vtable = &PL_vtbl_taint;
463ee0b2 4657 break;
14befaf4 4658 case PERL_MAGIC_uvar:
92110913 4659 vtable = &PL_vtbl_uvar;
79072805 4660 break;
14befaf4 4661 case PERL_MAGIC_vec:
92110913 4662 vtable = &PL_vtbl_vec;
79072805 4663 break;
a3874608 4664 case PERL_MAGIC_arylen_p:
bfcb3514 4665 case PERL_MAGIC_rhash:
8d2f4536 4666 case PERL_MAGIC_symtab:
ece467f9 4667 case PERL_MAGIC_vstring:
aec46f14 4668 vtable = NULL;
ece467f9 4669 break;
7e8c5dac
HS
4670 case PERL_MAGIC_utf8:
4671 vtable = &PL_vtbl_utf8;
4672 break;
14befaf4 4673 case PERL_MAGIC_substr:
92110913 4674 vtable = &PL_vtbl_substr;
79072805 4675 break;
14befaf4 4676 case PERL_MAGIC_defelem:
92110913 4677 vtable = &PL_vtbl_defelem;
5f05dabc 4678 break;
14befaf4 4679 case PERL_MAGIC_arylen:
92110913 4680 vtable = &PL_vtbl_arylen;
79072805 4681 break;
14befaf4 4682 case PERL_MAGIC_pos:
92110913 4683 vtable = &PL_vtbl_pos;
a0d0e21e 4684 break;
14befaf4 4685 case PERL_MAGIC_backref:
92110913 4686 vtable = &PL_vtbl_backref;
810b8aa5 4687 break;
b3ca2e83
NC
4688 case PERL_MAGIC_hintselem:
4689 vtable = &PL_vtbl_hintselem;
4690 break;
14befaf4
DM
4691 case PERL_MAGIC_ext:
4692 /* Reserved for use by extensions not perl internals. */
4633a7c4
LW
4693 /* Useful for attaching extension internal data to perl vars. */
4694 /* Note that multiple extensions may clash if magical scalars */
4695 /* etc holding private data from one are passed to another. */
aec46f14 4696 vtable = NULL;
a0d0e21e 4697 break;
79072805 4698 default:
14befaf4 4699 Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
463ee0b2 4700 }
68795e93 4701
92110913 4702 /* Rest of work is done else where */
aec46f14 4703 mg = sv_magicext(sv,obj,how,vtable,name,namlen);
68795e93 4704
92110913
NIS
4705 switch (how) {
4706 case PERL_MAGIC_taint:
4707 mg->mg_len = 1;
4708 break;
4709 case PERL_MAGIC_ext:
4710 case PERL_MAGIC_dbfile:
4711 SvRMAGICAL_on(sv);
4712 break;
4713 }
463ee0b2
LW
4714}
4715
c461cf8f
JH
4716/*
4717=for apidoc sv_unmagic
4718
645c22ef 4719Removes all magic of type C<type> from an SV.
c461cf8f
JH
4720
4721=cut
4722*/
4723
463ee0b2 4724int
864dbfa3 4725Perl_sv_unmagic(pTHX_ SV *sv, int type)
463ee0b2
LW
4726{
4727 MAGIC* mg;
4728 MAGIC** mgp;
91bba347 4729 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2 4730 return 0;
064cf529 4731 mgp = &(((XPVMG*) SvANY(sv))->xmg_u.xmg_magic);
463ee0b2
LW
4732 for (mg = *mgp; mg; mg = *mgp) {
4733 if (mg->mg_type == type) {
e1ec3a88 4734 const MGVTBL* const vtbl = mg->mg_virtual;
463ee0b2 4735 *mgp = mg->mg_moremagic;
1d7c1841 4736 if (vtbl && vtbl->svt_free)
fc0dc3b3 4737 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
14befaf4 4738 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
92110913 4739 if (mg->mg_len > 0)
1edc1566 4740 Safefree(mg->mg_ptr);
565764a8 4741 else if (mg->mg_len == HEf_SVKEY)
1edc1566 4742 SvREFCNT_dec((SV*)mg->mg_ptr);
d2923cdd 4743 else if (mg->mg_type == PERL_MAGIC_utf8)
7e8c5dac 4744 Safefree(mg->mg_ptr);
9cbac4c7 4745 }
a0d0e21e
LW
4746 if (mg->mg_flags & MGf_REFCOUNTED)
4747 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
4748 Safefree(mg);
4749 }
4750 else
4751 mgp = &mg->mg_moremagic;
79072805 4752 }
91bba347 4753 if (!SvMAGIC(sv)) {
463ee0b2 4754 SvMAGICAL_off(sv);
c268c2a6 4755 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
86f55936 4756 SvMAGIC_set(sv, NULL);
463ee0b2
LW
4757 }
4758
4759 return 0;
79072805
LW
4760}
4761
c461cf8f
JH
4762/*
4763=for apidoc sv_rvweaken
4764
645c22ef
DM
4765Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
4766referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
4767push a back-reference to this RV onto the array of backreferences
1e73acc8
AS
4768associated with that magic. If the RV is magical, set magic will be
4769called after the RV is cleared.
c461cf8f
JH
4770
4771=cut
4772*/
4773
810b8aa5 4774SV *
864dbfa3 4775Perl_sv_rvweaken(pTHX_ SV *sv)
810b8aa5
GS
4776{
4777 SV *tsv;
4778 if (!SvOK(sv)) /* let undefs pass */
4779 return sv;
4780 if (!SvROK(sv))
cea2e8a9 4781 Perl_croak(aTHX_ "Can't weaken a nonreference");
810b8aa5 4782 else if (SvWEAKREF(sv)) {
810b8aa5 4783 if (ckWARN(WARN_MISC))
9014280d 4784 Perl_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
810b8aa5
GS
4785 return sv;
4786 }
4787 tsv = SvRV(sv);
e15faf7d 4788 Perl_sv_add_backref(aTHX_ tsv, sv);
810b8aa5 4789 SvWEAKREF_on(sv);
1c846c1f 4790 SvREFCNT_dec(tsv);
810b8aa5
GS
4791 return sv;
4792}
4793
645c22ef
DM
4794/* Give tsv backref magic if it hasn't already got it, then push a
4795 * back-reference to sv onto the array associated with the backref magic.
4796 */
4797
e15faf7d
NC
4798void
4799Perl_sv_add_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5 4800{
97aff369 4801 dVAR;
810b8aa5 4802 AV *av;
86f55936
NC
4803
4804 if (SvTYPE(tsv) == SVt_PVHV) {
4805 AV **const avp = Perl_hv_backreferences_p(aTHX_ (HV*)tsv);
4806
4807 av = *avp;
4808 if (!av) {
4809 /* There is no AV in the offical place - try a fixup. */
4810 MAGIC *const mg = mg_find(tsv, PERL_MAGIC_backref);
4811
4812 if (mg) {
4813 /* Aha. They've got it stowed in magic. Bring it back. */
4814 av = (AV*)mg->mg_obj;
4815 /* Stop mg_free decreasing the refernce count. */
4816 mg->mg_obj = NULL;
4817 /* Stop mg_free even calling the destructor, given that
4818 there's no AV to free up. */
4819 mg->mg_virtual = 0;
4820 sv_unmagic(tsv, PERL_MAGIC_backref);
4821 } else {
4822 av = newAV();
4823 AvREAL_off(av);
b37c2d43 4824 SvREFCNT_inc_simple_void(av);
86f55936
NC
4825 }
4826 *avp = av;
4827 }
4828 } else {
4829 const MAGIC *const mg
4830 = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
4831 if (mg)
4832 av = (AV*)mg->mg_obj;
4833 else {
4834 av = newAV();
4835 AvREAL_off(av);
4836 sv_magic(tsv, (SV*)av, PERL_MAGIC_backref, NULL, 0);
4837 /* av now has a refcnt of 2, which avoids it getting freed
4838 * before us during global cleanup. The extra ref is removed
4839 * by magic_killbackrefs() when tsv is being freed */
4840 }
810b8aa5 4841 }
d91d49e8 4842 if (AvFILLp(av) >= AvMAX(av)) {
d91d49e8
MM
4843 av_extend(av, AvFILLp(av)+1);
4844 }
4845 AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */
810b8aa5
GS
4846}
4847
645c22ef
DM
4848/* delete a back-reference to ourselves from the backref magic associated
4849 * with the SV we point to.
4850 */
4851
1c846c1f 4852STATIC void
e15faf7d 4853S_sv_del_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5 4854{
97aff369 4855 dVAR;
86f55936 4856 AV *av = NULL;
810b8aa5
GS
4857 SV **svp;
4858 I32 i;
86f55936
NC
4859
4860 if (SvTYPE(tsv) == SVt_PVHV && SvOOK(tsv)) {
4861 av = *Perl_hv_backreferences_p(aTHX_ (HV*)tsv);
5b285ea4
NC
4862 /* We mustn't attempt to "fix up" the hash here by moving the
4863 backreference array back to the hv_aux structure, as that is stored
4864 in the main HvARRAY(), and hfreentries assumes that no-one
4865 reallocates HvARRAY() while it is running. */
86f55936
NC
4866 }
4867 if (!av) {
4868 const MAGIC *const mg
4869 = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
4870 if (mg)
4871 av = (AV *)mg->mg_obj;
4872 }
4873 if (!av) {
e15faf7d
NC
4874 if (PL_in_clean_all)
4875 return;
cea2e8a9 4876 Perl_croak(aTHX_ "panic: del_backref");
86f55936
NC
4877 }
4878
4879 if (SvIS_FREED(av))
4880 return;
4881
810b8aa5 4882 svp = AvARRAY(av);
6a76db8b
NC
4883 /* We shouldn't be in here more than once, but for paranoia reasons lets
4884 not assume this. */
4885 for (i = AvFILLp(av); i >= 0; i--) {
4886 if (svp[i] == sv) {
4887 const SSize_t fill = AvFILLp(av);
4888 if (i != fill) {
4889 /* We weren't the last entry.
4890 An unordered list has this property that you can take the
4891 last element off the end to fill the hole, and it's still
4892 an unordered list :-)
4893 */
4894 svp[i] = svp[fill];
4895 }
a0714e2c 4896 svp[fill] = NULL;
6a76db8b
NC
4897 AvFILLp(av) = fill - 1;
4898 }
4899 }
810b8aa5
GS
4900}
4901
86f55936
NC
4902int
4903Perl_sv_kill_backrefs(pTHX_ SV *sv, AV *av)
4904{
4905 SV **svp = AvARRAY(av);
4906
4907 PERL_UNUSED_ARG(sv);
4908
4909 /* Not sure why the av can get freed ahead of its sv, but somehow it does
4910 in ext/B/t/bytecode.t test 15 (involving print <DATA>) */
4911 if (svp && !SvIS_FREED(av)) {
4912 SV *const *const last = svp + AvFILLp(av);
4913
4914 while (svp <= last) {
4915 if (*svp) {
4916 SV *const referrer = *svp;
4917 if (SvWEAKREF(referrer)) {
4918 /* XXX Should we check that it hasn't changed? */
4919 SvRV_set(referrer, 0);
4920 SvOK_off(referrer);
4921 SvWEAKREF_off(referrer);
1e73acc8 4922 SvSETMAGIC(referrer);
86f55936
NC
4923 } else if (SvTYPE(referrer) == SVt_PVGV ||
4924 SvTYPE(referrer) == SVt_PVLV) {
4925 /* You lookin' at me? */
4926 assert(GvSTASH(referrer));
4927 assert(GvSTASH(referrer) == (HV*)sv);
4928 GvSTASH(referrer) = 0;
4929 } else {
4930 Perl_croak(aTHX_
4931 "panic: magic_killbackrefs (flags=%"UVxf")",
4932 (UV)SvFLAGS(referrer));
4933 }
4934
a0714e2c 4935 *svp = NULL;
86f55936
NC
4936 }
4937 svp++;
4938 }
4939 }
4940 SvREFCNT_dec(av); /* remove extra count added by sv_add_backref() */
4941 return 0;
4942}
4943
954c1994
GS
4944/*
4945=for apidoc sv_insert
4946
4947Inserts a string at the specified offset/length within the SV. Similar to
4948the Perl substr() function.
4949
4950=cut
4951*/
4952
79072805 4953void
e1ec3a88 4954Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, const char *little, STRLEN littlelen)
79072805 4955{
97aff369 4956 dVAR;
79072805
LW
4957 register char *big;
4958 register char *mid;
4959 register char *midend;
4960 register char *bigend;
4961 register I32 i;
6ff81951 4962 STRLEN curlen;
1c846c1f 4963
79072805 4964
8990e307 4965 if (!bigstr)
cea2e8a9 4966 Perl_croak(aTHX_ "Can't modify non-existent substring");
6ff81951 4967 SvPV_force(bigstr, curlen);
60fa28ff 4968 (void)SvPOK_only_UTF8(bigstr);
6ff81951
GS
4969 if (offset + len > curlen) {
4970 SvGROW(bigstr, offset+len+1);
93524f2b 4971 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
6ff81951
GS
4972 SvCUR_set(bigstr, offset+len);
4973 }
79072805 4974
69b47968 4975 SvTAINT(bigstr);
79072805
LW
4976 i = littlelen - len;
4977 if (i > 0) { /* string might grow */
a0d0e21e 4978 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
4979 mid = big + offset + len;
4980 midend = bigend = big + SvCUR(bigstr);
4981 bigend += i;
4982 *bigend = '\0';
4983 while (midend > mid) /* shove everything down */
4984 *--bigend = *--midend;
4985 Move(little,big+offset,littlelen,char);
b162af07 4986 SvCUR_set(bigstr, SvCUR(bigstr) + i);
79072805
LW
4987 SvSETMAGIC(bigstr);
4988 return;
4989 }
4990 else if (i == 0) {
463ee0b2 4991 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
4992 SvSETMAGIC(bigstr);
4993 return;
4994 }
4995
463ee0b2 4996 big = SvPVX(bigstr);
79072805
LW
4997 mid = big + offset;
4998 midend = mid + len;
4999 bigend = big + SvCUR(bigstr);
5000
5001 if (midend > bigend)
cea2e8a9 5002 Perl_croak(aTHX_ "panic: sv_insert");
79072805
LW
5003
5004 if (mid - big > bigend - midend) { /* faster to shorten from end */
5005 if (littlelen) {
5006 Move(little, mid, littlelen,char);
5007 mid += littlelen;
5008 }
5009 i = bigend - midend;
5010 if (i > 0) {
5011 Move(midend, mid, i,char);
5012 mid += i;
5013 }
5014 *mid = '\0';
5015 SvCUR_set(bigstr, mid - big);
5016 }
155aba94 5017 else if ((i = mid - big)) { /* faster from front */
79072805
LW
5018 midend -= littlelen;
5019 mid = midend;
0d3c21b0 5020 Move(big, midend - i, i, char);
79072805 5021 sv_chop(bigstr,midend-i);
79072805
LW
5022 if (littlelen)
5023 Move(little, mid, littlelen,char);
5024 }
5025 else if (littlelen) {
5026 midend -= littlelen;
5027 sv_chop(bigstr,midend);
5028 Move(little,midend,littlelen,char);
5029 }
5030 else {
5031 sv_chop(bigstr,midend);
5032 }
5033 SvSETMAGIC(bigstr);
5034}
5035
c461cf8f
JH
5036/*
5037=for apidoc sv_replace
5038
5039Make the first argument a copy of the second, then delete the original.
645c22ef
DM
5040The target SV physically takes over ownership of the body of the source SV
5041and inherits its flags; however, the target keeps any magic it owns,
5042and any magic in the source is discarded.
ff276b08 5043Note that this is a rather specialist SV copying operation; most of the
645c22ef 5044time you'll want to use C<sv_setsv> or one of its many macro front-ends.
c461cf8f
JH
5045
5046=cut
5047*/
79072805
LW
5048
5049void
864dbfa3 5050Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
79072805 5051{
97aff369 5052 dVAR;
a3b680e6 5053 const U32 refcnt = SvREFCNT(sv);
765f542d 5054 SV_CHECK_THINKFIRST_COW_DROP(sv);
30e5c352 5055 if (SvREFCNT(nsv) != 1) {
7437becc 5056 Perl_croak(aTHX_ "panic: reference miscount on nsv in sv_replace() (%"
30e5c352
NC
5057 UVuf " != 1)", (UV) SvREFCNT(nsv));
5058 }
93a17b20 5059 if (SvMAGICAL(sv)) {
a0d0e21e
LW
5060 if (SvMAGICAL(nsv))
5061 mg_free(nsv);
5062 else
5063 sv_upgrade(nsv, SVt_PVMG);
b162af07 5064 SvMAGIC_set(nsv, SvMAGIC(sv));
a0d0e21e 5065 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20 5066 SvMAGICAL_off(sv);
b162af07 5067 SvMAGIC_set(sv, NULL);
93a17b20 5068 }
79072805
LW
5069 SvREFCNT(sv) = 0;
5070 sv_clear(sv);
477f5d66 5071 assert(!SvREFCNT(sv));
fd0854ff
DM
5072#ifdef DEBUG_LEAKING_SCALARS
5073 sv->sv_flags = nsv->sv_flags;
5074 sv->sv_any = nsv->sv_any;
5075 sv->sv_refcnt = nsv->sv_refcnt;
f34d0642 5076 sv->sv_u = nsv->sv_u;
fd0854ff 5077#else
79072805 5078 StructCopy(nsv,sv,SV);
fd0854ff 5079#endif
4df7f6af 5080 if(SvTYPE(sv) == SVt_IV) {
7b2c381c 5081 SvANY(sv)
339049b0 5082 = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
7b2c381c
NC
5083 }
5084
fd0854ff 5085
f8c7b90f 5086#ifdef PERL_OLD_COPY_ON_WRITE
d3d0e6f1
NC
5087 if (SvIsCOW_normal(nsv)) {
5088 /* We need to follow the pointers around the loop to make the
5089 previous SV point to sv, rather than nsv. */
5090 SV *next;
5091 SV *current = nsv;
5092 while ((next = SV_COW_NEXT_SV(current)) != nsv) {
5093 assert(next);
5094 current = next;
3f7c398e 5095 assert(SvPVX_const(current) == SvPVX_const(nsv));
d3d0e6f1
NC
5096 }
5097 /* Make the SV before us point to the SV after us. */
5098 if (DEBUG_C_TEST) {
5099 PerlIO_printf(Perl_debug_log, "previous is\n");
5100 sv_dump(current);
a29f6d03
NC
5101 PerlIO_printf(Perl_debug_log,
5102 "move it from 0x%"UVxf" to 0x%"UVxf"\n",
d3d0e6f1
NC
5103 (UV) SV_COW_NEXT_SV(current), (UV) sv);
5104 }
a29f6d03 5105 SV_COW_NEXT_SV_SET(current, sv);
d3d0e6f1
NC
5106 }
5107#endif
79072805 5108 SvREFCNT(sv) = refcnt;
1edc1566 5109 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
39cf41c2 5110 SvREFCNT(nsv) = 0;
463ee0b2 5111 del_SV(nsv);
79072805
LW
5112}
5113
c461cf8f
JH
5114/*
5115=for apidoc sv_clear
5116
645c22ef
DM
5117Clear an SV: call any destructors, free up any memory used by the body,
5118and free the body itself. The SV's head is I<not> freed, although
5119its type is set to all 1's so that it won't inadvertently be assumed
5120to be live during global destruction etc.
5121This function should only be called when REFCNT is zero. Most of the time
5122you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
5123instead.
c461cf8f
JH
5124
5125=cut
5126*/
5127
79072805 5128void
864dbfa3 5129Perl_sv_clear(pTHX_ register SV *sv)
79072805 5130{
27da23d5 5131 dVAR;
82bb6deb 5132 const U32 type = SvTYPE(sv);
8edfc514
NC
5133 const struct body_details *const sv_type_details
5134 = bodies_by_type + type;
dd69841b 5135 HV *stash;
82bb6deb 5136
79072805
LW
5137 assert(sv);
5138 assert(SvREFCNT(sv) == 0);
ceb531cd 5139 assert(SvTYPE(sv) != SVTYPEMASK);
79072805 5140
d2a0f284
JC
5141 if (type <= SVt_IV) {
5142 /* See the comment in sv.h about the collusion between this early
5143 return and the overloading of the NULL and IV slots in the size
5144 table. */
4df7f6af
NC
5145 if (SvROK(sv)) {
5146 SV * const target = SvRV(sv);
5147 if (SvWEAKREF(sv))
5148 sv_del_backref(target, sv);
5149 else
5150 SvREFCNT_dec(target);
5151 }
5152 SvFLAGS(sv) &= SVf_BREAK;
5153 SvFLAGS(sv) |= SVTYPEMASK;
82bb6deb 5154 return;
d2a0f284 5155 }
82bb6deb 5156
ed6116ce 5157 if (SvOBJECT(sv)) {
eba16661
JH
5158 if (PL_defstash && /* Still have a symbol table? */
5159 SvDESTROYABLE(sv))
5160 {
39644a26 5161 dSP;
893645bd 5162 HV* stash;
d460ef45 5163 do {
b464bac0 5164 CV* destructor;
4e8e7886 5165 stash = SvSTASH(sv);
32251b26 5166 destructor = StashHANDLER(stash,DESTROY);
4e8e7886 5167 if (destructor) {
1b6737cc 5168 SV* const tmpref = newRV(sv);
5cc433a6 5169 SvREADONLY_on(tmpref); /* DESTROY() could be naughty */
4e8e7886 5170 ENTER;
e788e7d3 5171 PUSHSTACKi(PERLSI_DESTROY);
4e8e7886
GS
5172 EXTEND(SP, 2);
5173 PUSHMARK(SP);
5cc433a6 5174 PUSHs(tmpref);
4e8e7886 5175 PUTBACK;
44389ee9 5176 call_sv((SV*)destructor, G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
7a5fa8a2
NIS
5177
5178
d3acc0f7 5179 POPSTACK;
3095d977 5180 SPAGAIN;
4e8e7886 5181 LEAVE;
5cc433a6
AB
5182 if(SvREFCNT(tmpref) < 2) {
5183 /* tmpref is not kept alive! */
5184 SvREFCNT(sv)--;
b162af07 5185 SvRV_set(tmpref, NULL);
5cc433a6
AB
5186 SvROK_off(tmpref);
5187 }
5188 SvREFCNT_dec(tmpref);
4e8e7886
GS
5189 }
5190 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 5191
6f44e0a4
JP
5192
5193 if (SvREFCNT(sv)) {
5194 if (PL_in_clean_objs)
cea2e8a9 5195 Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
bfcb3514 5196 HvNAME_get(stash));
6f44e0a4
JP
5197 /* DESTROY gave object new lease on life */
5198 return;
5199 }
a0d0e21e 5200 }
4e8e7886 5201
a0d0e21e 5202 if (SvOBJECT(sv)) {
4e8e7886 5203 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
a0d0e21e 5204 SvOBJECT_off(sv); /* Curse the object. */
82bb6deb 5205 if (type != SVt_PVIO)
3280af22 5206 --PL_sv_objcount; /* XXX Might want something more general */
a0d0e21e 5207 }
463ee0b2 5208 }
82bb6deb 5209 if (type >= SVt_PVMG) {
cecf5685 5210 if (type == SVt_PVMG && SvPAD_OUR(sv)) {
73d95100 5211 SvREFCNT_dec(SvOURSTASH(sv));
e736a858 5212 } else if (SvMAGIC(sv))
524189f1 5213 mg_free(sv);
00b1698f 5214 if (type == SVt_PVMG && SvPAD_TYPED(sv))
524189f1
JH
5215 SvREFCNT_dec(SvSTASH(sv));
5216 }
82bb6deb 5217 switch (type) {
cecf5685 5218 /* case SVt_BIND: */
8990e307 5219 case SVt_PVIO:
df0bd2f4
GS
5220 if (IoIFP(sv) &&
5221 IoIFP(sv) != PerlIO_stdin() &&
5f05dabc 5222 IoIFP(sv) != PerlIO_stdout() &&
5223 IoIFP(sv) != PerlIO_stderr())
93578b34 5224 {
f2b5be74 5225 io_close((IO*)sv, FALSE);
93578b34 5226 }
1d7c1841 5227 if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
1236053a 5228 PerlDir_close(IoDIRP(sv));
1d7c1841 5229 IoDIRP(sv) = (DIR*)NULL;
8990e307
LW
5230 Safefree(IoTOP_NAME(sv));
5231 Safefree(IoFMT_NAME(sv));
5232 Safefree(IoBOTTOM_NAME(sv));
82bb6deb 5233 goto freescalar;
5c35adbb 5234 case SVt_REGEXP:
288b8c02
NC
5235 /* FIXME for plugins */
5236 pregfree2(sv);
5c35adbb 5237 goto freescalar;
79072805 5238 case SVt_PVCV:
748a9306 5239 case SVt_PVFM:
85e6fe83 5240 cv_undef((CV*)sv);
a0d0e21e 5241 goto freescalar;
79072805 5242 case SVt_PVHV:
86f55936 5243 Perl_hv_kill_backrefs(aTHX_ (HV*)sv);
85e6fe83 5244 hv_undef((HV*)sv);
a0d0e21e 5245 break;
79072805 5246 case SVt_PVAV:
3f90d085
DM
5247 if (PL_comppad == (AV*)sv) {
5248 PL_comppad = NULL;
5249 PL_curpad = NULL;
5250 }
85e6fe83 5251 av_undef((AV*)sv);
a0d0e21e 5252 break;
02270b4e 5253 case SVt_PVLV:
dd28f7bb
DM
5254 if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
5255 SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv)));
5256 HeNEXT((HE*)LvTARG(sv)) = PL_hv_fetch_ent_mh;
5257 PL_hv_fetch_ent_mh = (HE*)LvTARG(sv);
5258 }
5259 else if (LvTYPE(sv) != 't') /* unless tie: unrefcnted fake SV** */
5260 SvREFCNT_dec(LvTARG(sv));
a0d0e21e 5261 case SVt_PVGV:
cecf5685 5262 if (isGV_with_GP(sv)) {
dd69841b
BB
5263 if(GvCVu((GV*)sv) && (stash = GvSTASH((GV*)sv)) && HvNAME_get(stash))
5264 mro_method_changed_in(stash);
cecf5685
NC
5265 gp_free((GV*)sv);
5266 if (GvNAME_HEK(sv))
5267 unshare_hek(GvNAME_HEK(sv));
dd69841b
BB
5268 /* If we're in a stash, we don't own a reference to it. However it does
5269 have a back reference to us, which needs to be cleared. */
5270 if (!SvVALID(sv) && (stash = GvSTASH(sv)))
5271 sv_del_backref((SV*)stash, sv);
cecf5685 5272 }
8571fe2f
NC
5273 /* FIXME. There are probably more unreferenced pointers to SVs in the
5274 interpreter struct that we should check and tidy in a similar
5275 fashion to this: */
5276 if ((GV*)sv == PL_last_in_gv)
5277 PL_last_in_gv = NULL;
79072805 5278 case SVt_PVMG:
79072805
LW
5279 case SVt_PVNV:
5280 case SVt_PVIV:
a0d0e21e 5281 freescalar:
5228ca4e
NC
5282 /* Don't bother with SvOOK_off(sv); as we're only going to free it. */
5283 if (SvOOK(sv)) {
93524f2b 5284 SvPV_set(sv, SvPVX_mutable(sv) - SvIVX(sv));
5228ca4e
NC
5285 /* Don't even bother with turning off the OOK flag. */
5286 }
79072805 5287 case SVt_PV:
810b8aa5 5288 if (SvROK(sv)) {
b37c2d43 5289 SV * const target = SvRV(sv);
810b8aa5 5290 if (SvWEAKREF(sv))
e15faf7d 5291 sv_del_backref(target, sv);
810b8aa5 5292 else
e15faf7d 5293 SvREFCNT_dec(target);
810b8aa5 5294 }
f8c7b90f 5295#ifdef PERL_OLD_COPY_ON_WRITE
3f7c398e 5296 else if (SvPVX_const(sv)) {
765f542d
NC
5297 if (SvIsCOW(sv)) {
5298 /* I believe I need to grab the global SV mutex here and
5299 then recheck the COW status. */
46187eeb
NC
5300 if (DEBUG_C_TEST) {
5301 PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
e419cbc5 5302 sv_dump(sv);
46187eeb 5303 }
5302ffd4
NC
5304 if (SvLEN(sv)) {
5305 sv_release_COW(sv, SvPVX_const(sv), SV_COW_NEXT_SV(sv));
5306 } else {
5307 unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
5308 }
5309
765f542d
NC
5310 /* And drop it here. */
5311 SvFAKE_off(sv);
5312 } else if (SvLEN(sv)) {
3f7c398e 5313 Safefree(SvPVX_const(sv));
765f542d
NC
5314 }
5315 }
5316#else
3f7c398e 5317 else if (SvPVX_const(sv) && SvLEN(sv))
94010e71 5318 Safefree(SvPVX_mutable(sv));
3f7c398e 5319 else if (SvPVX_const(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
bdd68bc3 5320 unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
1c846c1f
NIS
5321 SvFAKE_off(sv);
5322 }
765f542d 5323#endif
79072805
LW
5324 break;
5325 case SVt_NV:
79072805
LW
5326 break;
5327 }
5328
893645bd
NC
5329 SvFLAGS(sv) &= SVf_BREAK;
5330 SvFLAGS(sv) |= SVTYPEMASK;
5331
8edfc514 5332 if (sv_type_details->arena) {
b9502f15 5333 del_body(((char *)SvANY(sv) + sv_type_details->offset),
8edfc514
NC
5334 &PL_body_roots[type]);
5335 }
d2a0f284 5336 else if (sv_type_details->body_size) {
8edfc514
NC
5337 my_safefree(SvANY(sv));
5338 }
79072805
LW
5339}
5340
645c22ef
DM
5341/*
5342=for apidoc sv_newref
5343
5344Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
5345instead.
5346
5347=cut
5348*/
5349
79072805 5350SV *
864dbfa3 5351Perl_sv_newref(pTHX_ SV *sv)
79072805 5352{
96a5add6 5353 PERL_UNUSED_CONTEXT;
463ee0b2 5354 if (sv)
4db098f4 5355 (SvREFCNT(sv))++;
79072805
LW
5356 return sv;
5357}
5358
c461cf8f
JH
5359/*
5360=for apidoc sv_free
5361
645c22ef
DM
5362Decrement an SV's reference count, and if it drops to zero, call
5363C<sv_clear> to invoke destructors and free up any memory used by
5364the body; finally, deallocate the SV's head itself.
5365Normally called via a wrapper macro C<SvREFCNT_dec>.
c461cf8f
JH
5366
5367=cut
5368*/
5369
79072805 5370void
864dbfa3 5371Perl_sv_free(pTHX_ SV *sv)
79072805 5372{
27da23d5 5373 dVAR;
79072805
LW
5374 if (!sv)
5375 return;
a0d0e21e
LW
5376 if (SvREFCNT(sv) == 0) {
5377 if (SvFLAGS(sv) & SVf_BREAK)
645c22ef
DM
5378 /* this SV's refcnt has been artificially decremented to
5379 * trigger cleanup */
a0d0e21e 5380 return;
3280af22 5381 if (PL_in_clean_all) /* All is fair */
1edc1566 5382 return;
d689ffdd
JP
5383 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5384 /* make sure SvREFCNT(sv)==0 happens very seldom */
5385 SvREFCNT(sv) = (~(U32)0)/2;
5386 return;
5387 }
41e4abd8 5388 if (ckWARN_d(WARN_INTERNAL)) {
d5dede04 5389 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
472d47bc
SB
5390 "Attempt to free unreferenced scalar: SV 0x%"UVxf
5391 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
41e4abd8
NC
5392#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
5393 Perl_dump_sv_child(aTHX_ sv);
e4c5322d
DM
5394#else
5395 #ifdef DEBUG_LEAKING_SCALARS
5396 sv_dump(sv);
5397 #endif
41e4abd8
NC
5398#endif
5399 }
79072805
LW
5400 return;
5401 }
4db098f4 5402 if (--(SvREFCNT(sv)) > 0)
8990e307 5403 return;
8c4d3c90
NC
5404 Perl_sv_free2(aTHX_ sv);
5405}
5406
5407void
5408Perl_sv_free2(pTHX_ SV *sv)
5409{
27da23d5 5410 dVAR;
463ee0b2
LW
5411#ifdef DEBUGGING
5412 if (SvTEMP(sv)) {
0453d815 5413 if (ckWARN_d(WARN_DEBUGGING))
9014280d 5414 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
472d47bc
SB
5415 "Attempt to free temp prematurely: SV 0x%"UVxf
5416 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
79072805 5417 return;
79072805 5418 }
463ee0b2 5419#endif
d689ffdd
JP
5420 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5421 /* make sure SvREFCNT(sv)==0 happens very seldom */
5422 SvREFCNT(sv) = (~(U32)0)/2;
5423 return;
5424 }
79072805 5425 sv_clear(sv);
477f5d66
CS
5426 if (! SvREFCNT(sv))
5427 del_SV(sv);
79072805
LW
5428}
5429
954c1994
GS
5430/*
5431=for apidoc sv_len
5432
645c22ef
DM
5433Returns the length of the string in the SV. Handles magic and type
5434coercion. See also C<SvCUR>, which gives raw access to the xpv_cur slot.
954c1994
GS
5435
5436=cut
5437*/
5438
79072805 5439STRLEN
864dbfa3 5440Perl_sv_len(pTHX_ register SV *sv)
79072805 5441{
463ee0b2 5442 STRLEN len;
79072805
LW
5443
5444 if (!sv)
5445 return 0;
5446
8990e307 5447 if (SvGMAGICAL(sv))
565764a8 5448 len = mg_length(sv);
8990e307 5449 else
4d84ee25 5450 (void)SvPV_const(sv, len);
463ee0b2 5451 return len;
79072805
LW
5452}
5453
c461cf8f
JH
5454/*
5455=for apidoc sv_len_utf8
5456
5457Returns the number of characters in the string in an SV, counting wide
1e54db1a 5458UTF-8 bytes as a single character. Handles magic and type coercion.
c461cf8f
JH
5459
5460=cut
5461*/
5462
7e8c5dac
HS
5463/*
5464 * The length is cached in PERL_UTF8_magic, in the mg_len field. Also the
9564a3bd
NC
5465 * mg_ptr is used, by sv_pos_u2b() and sv_pos_b2u() - see the comments below.
5466 * (Note that the mg_len is not the length of the mg_ptr field.
5467 * This allows the cache to store the character length of the string without
5468 * needing to malloc() extra storage to attach to the mg_ptr.)
7a5fa8a2 5469 *
7e8c5dac
HS
5470 */
5471
a0ed51b3 5472STRLEN
864dbfa3 5473Perl_sv_len_utf8(pTHX_ register SV *sv)
a0ed51b3 5474{
a0ed51b3
LW
5475 if (!sv)
5476 return 0;
5477
a0ed51b3 5478 if (SvGMAGICAL(sv))
b76347f2 5479 return mg_length(sv);
a0ed51b3 5480 else
b76347f2 5481 {
26346457 5482 STRLEN len;
e62f0680 5483 const U8 *s = (U8*)SvPV_const(sv, len);
7e8c5dac 5484
26346457
NC
5485 if (PL_utf8cache) {
5486 STRLEN ulen;
fe5bfecd 5487 MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : NULL;
26346457
NC
5488
5489 if (mg && mg->mg_len != -1) {
5490 ulen = mg->mg_len;
5491 if (PL_utf8cache < 0) {
5492 const STRLEN real = Perl_utf8_length(aTHX_ s, s + len);
5493 if (real != ulen) {
5494 /* Need to turn the assertions off otherwise we may
5495 recurse infinitely while printing error messages.
5496 */
5497 SAVEI8(PL_utf8cache);
5498 PL_utf8cache = 0;
f5992bc4
RB
5499 Perl_croak(aTHX_ "panic: sv_len_utf8 cache %"UVuf
5500 " real %"UVuf" for %"SVf,
be2597df 5501 (UV) ulen, (UV) real, SVfARG(sv));
26346457
NC
5502 }
5503 }
5504 }
5505 else {
5506 ulen = Perl_utf8_length(aTHX_ s, s + len);
5507 if (!SvREADONLY(sv)) {
5508 if (!mg) {
5509 mg = sv_magicext(sv, 0, PERL_MAGIC_utf8,
5510 &PL_vtbl_utf8, 0, 0);
5511 }
cb9e20bb 5512 assert(mg);
26346457 5513 mg->mg_len = ulen;
cb9e20bb 5514 }
cb9e20bb 5515 }
26346457 5516 return ulen;
7e8c5dac 5517 }
26346457 5518 return Perl_utf8_length(aTHX_ s, s + len);
7e8c5dac
HS
5519 }
5520}
5521
9564a3bd
NC
5522/* Walk forwards to find the byte corresponding to the passed in UTF-8
5523 offset. */
bdf30dd6 5524static STRLEN
721e86b6 5525S_sv_pos_u2b_forwards(const U8 *const start, const U8 *const send,
bdf30dd6
NC
5526 STRLEN uoffset)
5527{
5528 const U8 *s = start;
5529
5530 while (s < send && uoffset--)
5531 s += UTF8SKIP(s);
5532 if (s > send) {
5533 /* This is the existing behaviour. Possibly it should be a croak, as
5534 it's actually a bounds error */
5535 s = send;
5536 }
5537 return s - start;
5538}
5539
9564a3bd
NC
5540/* Given the length of the string in both bytes and UTF-8 characters, decide
5541 whether to walk forwards or backwards to find the byte corresponding to
5542 the passed in UTF-8 offset. */
c336ad0b 5543static STRLEN
721e86b6 5544S_sv_pos_u2b_midway(const U8 *const start, const U8 *send,
c336ad0b
NC
5545 STRLEN uoffset, STRLEN uend)
5546{
5547 STRLEN backw = uend - uoffset;
5548 if (uoffset < 2 * backw) {
25a8a4ef 5549 /* The assumption is that going forwards is twice the speed of going
c336ad0b
NC
5550 forward (that's where the 2 * backw comes from).
5551 (The real figure of course depends on the UTF-8 data.) */
721e86b6 5552 return sv_pos_u2b_forwards(start, send, uoffset);
c336ad0b
NC
5553 }
5554
5555 while (backw--) {
5556 send--;
5557 while (UTF8_IS_CONTINUATION(*send))
5558 send--;
5559 }
5560 return send - start;
5561}
5562
9564a3bd
NC
5563/* For the string representation of the given scalar, find the byte
5564 corresponding to the passed in UTF-8 offset. uoffset0 and boffset0
5565 give another position in the string, *before* the sought offset, which
5566 (which is always true, as 0, 0 is a valid pair of positions), which should
5567 help reduce the amount of linear searching.
5568 If *mgp is non-NULL, it should point to the UTF-8 cache magic, which
5569 will be used to reduce the amount of linear searching. The cache will be
5570 created if necessary, and the found value offered to it for update. */
28ccbf94
NC
5571static STRLEN
5572S_sv_pos_u2b_cached(pTHX_ SV *sv, MAGIC **mgp, const U8 *const start,
5573 const U8 *const send, STRLEN uoffset,
5574 STRLEN uoffset0, STRLEN boffset0) {
7087a21c 5575 STRLEN boffset = 0; /* Actually always set, but let's keep gcc happy. */
c336ad0b
NC
5576 bool found = FALSE;
5577
75c33c12
NC
5578 assert (uoffset >= uoffset0);
5579
c336ad0b 5580 if (SvMAGICAL(sv) && !SvREADONLY(sv) && PL_utf8cache
0905937d 5581 && (*mgp || (*mgp = mg_find(sv, PERL_MAGIC_utf8)))) {
d8b2e1f9
NC
5582 if ((*mgp)->mg_ptr) {
5583 STRLEN *cache = (STRLEN *) (*mgp)->mg_ptr;
5584 if (cache[0] == uoffset) {
5585 /* An exact match. */
5586 return cache[1];
5587 }
ab455f60
NC
5588 if (cache[2] == uoffset) {
5589 /* An exact match. */
5590 return cache[3];
5591 }
668af93f
NC
5592
5593 if (cache[0] < uoffset) {
d8b2e1f9
NC
5594 /* The cache already knows part of the way. */
5595 if (cache[0] > uoffset0) {
5596 /* The cache knows more than the passed in pair */
5597 uoffset0 = cache[0];
5598 boffset0 = cache[1];
5599 }
5600 if ((*mgp)->mg_len != -1) {
5601 /* And we know the end too. */
5602 boffset = boffset0
721e86b6 5603 + sv_pos_u2b_midway(start + boffset0, send,
d8b2e1f9
NC
5604 uoffset - uoffset0,
5605 (*mgp)->mg_len - uoffset0);
5606 } else {
5607 boffset = boffset0
721e86b6 5608 + sv_pos_u2b_forwards(start + boffset0,
d8b2e1f9
NC
5609 send, uoffset - uoffset0);
5610 }
dd7c5fd3
NC
5611 }
5612 else if (cache[2] < uoffset) {
5613 /* We're between the two cache entries. */
5614 if (cache[2] > uoffset0) {
5615 /* and the cache knows more than the passed in pair */
5616 uoffset0 = cache[2];
5617 boffset0 = cache[3];
5618 }
5619
668af93f 5620 boffset = boffset0
721e86b6 5621 + sv_pos_u2b_midway(start + boffset0,
668af93f
NC
5622 start + cache[1],
5623 uoffset - uoffset0,
5624 cache[0] - uoffset0);
dd7c5fd3
NC
5625 } else {
5626 boffset = boffset0
721e86b6 5627 + sv_pos_u2b_midway(start + boffset0,
dd7c5fd3
NC
5628 start + cache[3],
5629 uoffset - uoffset0,
5630 cache[2] - uoffset0);
d8b2e1f9 5631 }
668af93f 5632 found = TRUE;
d8b2e1f9
NC
5633 }
5634 else if ((*mgp)->mg_len != -1) {
75c33c12
NC
5635 /* If we can take advantage of a passed in offset, do so. */
5636 /* In fact, offset0 is either 0, or less than offset, so don't
5637 need to worry about the other possibility. */
5638 boffset = boffset0
721e86b6 5639 + sv_pos_u2b_midway(start + boffset0, send,
75c33c12
NC
5640 uoffset - uoffset0,
5641 (*mgp)->mg_len - uoffset0);
c336ad0b
NC
5642 found = TRUE;
5643 }
28ccbf94 5644 }
c336ad0b
NC
5645
5646 if (!found || PL_utf8cache < 0) {
75c33c12 5647 const STRLEN real_boffset
721e86b6 5648 = boffset0 + sv_pos_u2b_forwards(start + boffset0,
75c33c12
NC
5649 send, uoffset - uoffset0);
5650
c336ad0b
NC
5651 if (found && PL_utf8cache < 0) {
5652 if (real_boffset != boffset) {
5653 /* Need to turn the assertions off otherwise we may recurse
5654 infinitely while printing error messages. */
5655 SAVEI8(PL_utf8cache);
5656 PL_utf8cache = 0;
f5992bc4
RB
5657 Perl_croak(aTHX_ "panic: sv_pos_u2b_cache cache %"UVuf
5658 " real %"UVuf" for %"SVf,
be2597df 5659 (UV) boffset, (UV) real_boffset, SVfARG(sv));
c336ad0b
NC
5660 }
5661 }
5662 boffset = real_boffset;
28ccbf94 5663 }
0905937d 5664
ab455f60 5665 S_utf8_mg_pos_cache_update(aTHX_ sv, mgp, boffset, uoffset, send - start);
28ccbf94
NC
5666 return boffset;
5667}
5668
9564a3bd
NC
5669
5670/*
5671=for apidoc sv_pos_u2b
5672
5673Converts the value pointed to by offsetp from a count of UTF-8 chars from
5674the start of the string, to a count of the equivalent number of bytes; if
5675lenp is non-zero, it does the same to lenp, but this time starting from
5676the offset, rather than from the start of the string. Handles magic and
5677type coercion.
5678
5679=cut
5680*/
5681
5682/*
5683 * sv_pos_u2b() uses, like sv_pos_b2u(), the mg_ptr of the potential
5684 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
5685 * byte offsets. See also the comments of S_utf8_mg_pos_cache_update().
5686 *
5687 */
5688
a0ed51b3 5689void
864dbfa3 5690Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
a0ed51b3 5691{
245d4a47 5692 const U8 *start;
a0ed51b3
LW
5693 STRLEN len;
5694
5695 if (!sv)
5696 return;
5697
245d4a47 5698 start = (U8*)SvPV_const(sv, len);
7e8c5dac 5699 if (len) {
bdf30dd6
NC
5700 STRLEN uoffset = (STRLEN) *offsetp;
5701 const U8 * const send = start + len;
0905937d 5702 MAGIC *mg = NULL;
721e86b6 5703 const STRLEN boffset = sv_pos_u2b_cached(sv, &mg, start, send,
28ccbf94 5704 uoffset, 0, 0);
bdf30dd6
NC
5705
5706 *offsetp = (I32) boffset;
5707
5708 if (lenp) {
28ccbf94 5709 /* Convert the relative offset to absolute. */
721e86b6
AL
5710 const STRLEN uoffset2 = uoffset + (STRLEN) *lenp;
5711 const STRLEN boffset2
5712 = sv_pos_u2b_cached(sv, &mg, start, send, uoffset2,
28ccbf94 5713 uoffset, boffset) - boffset;
bdf30dd6 5714
28ccbf94 5715 *lenp = boffset2;
bdf30dd6 5716 }
7e8c5dac
HS
5717 }
5718 else {
5719 *offsetp = 0;
5720 if (lenp)
5721 *lenp = 0;
a0ed51b3 5722 }
e23c8137 5723
a0ed51b3
LW
5724 return;
5725}
5726
9564a3bd
NC
5727/* Create and update the UTF8 magic offset cache, with the proffered utf8/
5728 byte length pairing. The (byte) length of the total SV is passed in too,
5729 as blen, because for some (more esoteric) SVs, the call to SvPV_const()
5730 may not have updated SvCUR, so we can't rely on reading it directly.
5731
5732 The proffered utf8/byte length pairing isn't used if the cache already has
5733 two pairs, and swapping either for the proffered pair would increase the
5734 RMS of the intervals between known byte offsets.
5735
5736 The cache itself consists of 4 STRLEN values
5737 0: larger UTF-8 offset
5738 1: corresponding byte offset
5739 2: smaller UTF-8 offset
5740 3: corresponding byte offset
5741
5742 Unused cache pairs have the value 0, 0.
5743 Keeping the cache "backwards" means that the invariant of
5744 cache[0] >= cache[2] is maintained even with empty slots, which means that
5745 the code that uses it doesn't need to worry if only 1 entry has actually
5746 been set to non-zero. It also makes the "position beyond the end of the
5747 cache" logic much simpler, as the first slot is always the one to start
5748 from.
645c22ef 5749*/
ec07b5e0 5750static void
ab455f60
NC
5751S_utf8_mg_pos_cache_update(pTHX_ SV *sv, MAGIC **mgp, STRLEN byte, STRLEN utf8,
5752 STRLEN blen)
ec07b5e0
NC
5753{
5754 STRLEN *cache;
5755 if (SvREADONLY(sv))
5756 return;
5757
5758 if (!*mgp) {
5759 *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, (MGVTBL*)&PL_vtbl_utf8, 0,
5760 0);
5761 (*mgp)->mg_len = -1;
5762 }
5763 assert(*mgp);
5764
5765 if (!(cache = (STRLEN *)(*mgp)->mg_ptr)) {
5766 Newxz(cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
5767 (*mgp)->mg_ptr = (char *) cache;
5768 }
5769 assert(cache);
5770
5771 if (PL_utf8cache < 0) {
ef816a78 5772 const U8 *start = (const U8 *) SvPVX_const(sv);
6448472a 5773 const STRLEN realutf8 = utf8_length(start, start + byte);
ec07b5e0
NC
5774
5775 if (realutf8 != utf8) {
5776 /* Need to turn the assertions off otherwise we may recurse
5777 infinitely while printing error messages. */
5778 SAVEI8(PL_utf8cache);
5779 PL_utf8cache = 0;
f5992bc4 5780 Perl_croak(aTHX_ "panic: utf8_mg_pos_cache_update cache %"UVuf
be2597df 5781 " real %"UVuf" for %"SVf, (UV) utf8, (UV) realutf8, SVfARG(sv));
ec07b5e0
NC
5782 }
5783 }
ab455f60
NC
5784
5785 /* Cache is held with the later position first, to simplify the code
5786 that deals with unbounded ends. */
5787
5788 ASSERT_UTF8_CACHE(cache);
5789 if (cache[1] == 0) {
5790 /* Cache is totally empty */
5791 cache[0] = utf8;
5792 cache[1] = byte;
5793 } else if (cache[3] == 0) {
5794 if (byte > cache[1]) {
5795 /* New one is larger, so goes first. */
5796 cache[2] = cache[0];
5797 cache[3] = cache[1];
5798 cache[0] = utf8;
5799 cache[1] = byte;
5800 } else {
5801 cache[2] = utf8;
5802 cache[3] = byte;
5803 }
5804 } else {
5805#define THREEWAY_SQUARE(a,b,c,d) \
5806 ((float)((d) - (c))) * ((float)((d) - (c))) \
5807 + ((float)((c) - (b))) * ((float)((c) - (b))) \
5808 + ((float)((b) - (a))) * ((float)((b) - (a)))
5809
5810 /* Cache has 2 slots in use, and we know three potential pairs.
5811 Keep the two that give the lowest RMS distance. Do the
5812 calcualation in bytes simply because we always know the byte
5813 length. squareroot has the same ordering as the positive value,
5814 so don't bother with the actual square root. */
5815 const float existing = THREEWAY_SQUARE(0, cache[3], cache[1], blen);
5816 if (byte > cache[1]) {
5817 /* New position is after the existing pair of pairs. */
5818 const float keep_earlier
5819 = THREEWAY_SQUARE(0, cache[3], byte, blen);
5820 const float keep_later
5821 = THREEWAY_SQUARE(0, cache[1], byte, blen);
5822
5823 if (keep_later < keep_earlier) {
5824 if (keep_later < existing) {
5825 cache[2] = cache[0];
5826 cache[3] = cache[1];
5827 cache[0] = utf8;
5828 cache[1] = byte;
5829 }
5830 }
5831 else {
5832 if (keep_earlier < existing) {
5833 cache[0] = utf8;
5834 cache[1] = byte;
5835 }
5836 }
5837 }
57d7fbf1
NC
5838 else if (byte > cache[3]) {
5839 /* New position is between the existing pair of pairs. */
5840 const float keep_earlier
5841 = THREEWAY_SQUARE(0, cache[3], byte, blen);
5842 const float keep_later
5843 = THREEWAY_SQUARE(0, byte, cache[1], blen);
5844
5845 if (keep_later < keep_earlier) {
5846 if (keep_later < existing) {
5847 cache[2] = utf8;
5848 cache[3] = byte;
5849 }
5850 }
5851 else {
5852 if (keep_earlier < existing) {
5853 cache[0] = utf8;
5854 cache[1] = byte;
5855 }
5856 }
5857 }
5858 else {
5859 /* New position is before the existing pair of pairs. */
5860 const float keep_earlier
5861 = THREEWAY_SQUARE(0, byte, cache[3], blen);
5862 const float keep_later
5863 = THREEWAY_SQUARE(0, byte, cache[1], blen);
5864
5865 if (keep_later < keep_earlier) {
5866 if (keep_later < existing) {
5867 cache[2] = utf8;
5868 cache[3] = byte;
5869 }
5870 }
5871 else {
5872 if (keep_earlier < existing) {
5873 cache[0] = cache[2];
5874 cache[1] = cache[3];
5875 cache[2] = utf8;
5876 cache[3] = byte;
5877 }
5878 }
5879 }
ab455f60 5880 }
0905937d 5881 ASSERT_UTF8_CACHE(cache);
ec07b5e0
NC
5882}
5883
ec07b5e0 5884/* We already know all of the way, now we may be able to walk back. The same
25a8a4ef
NC
5885 assumption is made as in S_sv_pos_u2b_midway(), namely that walking
5886 backward is half the speed of walking forward. */
ec07b5e0
NC
5887static STRLEN
5888S_sv_pos_b2u_midway(pTHX_ const U8 *s, const U8 *const target, const U8 *end,
5889 STRLEN endu)
5890{
5891 const STRLEN forw = target - s;
5892 STRLEN backw = end - target;
5893
5894 if (forw < 2 * backw) {
6448472a 5895 return utf8_length(s, target);
ec07b5e0
NC
5896 }
5897
5898 while (end > target) {
5899 end--;
5900 while (UTF8_IS_CONTINUATION(*end)) {
5901 end--;
5902 }
5903 endu--;
5904 }
5905 return endu;
5906}
5907
9564a3bd
NC
5908/*
5909=for apidoc sv_pos_b2u
5910
5911Converts the value pointed to by offsetp from a count of bytes from the
5912start of the string, to a count of the equivalent number of UTF-8 chars.
5913Handles magic and type coercion.
5914
5915=cut
5916*/
5917
5918/*
5919 * sv_pos_b2u() uses, like sv_pos_u2b(), the mg_ptr of the potential
5920 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
5921 * byte offsets.
5922 *
5923 */
a0ed51b3 5924void
7e8c5dac 5925Perl_sv_pos_b2u(pTHX_ register SV* sv, I32* offsetp)
a0ed51b3 5926{
83003860 5927 const U8* s;
ec07b5e0 5928 const STRLEN byte = *offsetp;
7087a21c 5929 STRLEN len = 0; /* Actually always set, but let's keep gcc happy. */
ab455f60 5930 STRLEN blen;
ec07b5e0
NC
5931 MAGIC* mg = NULL;
5932 const U8* send;
a922f900 5933 bool found = FALSE;
a0ed51b3
LW
5934
5935 if (!sv)
5936 return;
5937
ab455f60 5938 s = (const U8*)SvPV_const(sv, blen);
7e8c5dac 5939
ab455f60 5940 if (blen < byte)
ec07b5e0 5941 Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
7e8c5dac 5942
ec07b5e0 5943 send = s + byte;
a67d7df9 5944
ffca234a
NC
5945 if (SvMAGICAL(sv) && !SvREADONLY(sv) && PL_utf8cache
5946 && (mg = mg_find(sv, PERL_MAGIC_utf8))) {
5947 if (mg->mg_ptr) {
d4c19fe8 5948 STRLEN * const cache = (STRLEN *) mg->mg_ptr;
b9f984a5 5949 if (cache[1] == byte) {
ec07b5e0
NC
5950 /* An exact match. */
5951 *offsetp = cache[0];
ec07b5e0 5952 return;
7e8c5dac 5953 }
ab455f60
NC
5954 if (cache[3] == byte) {
5955 /* An exact match. */
5956 *offsetp = cache[2];
5957 return;
5958 }
668af93f
NC
5959
5960 if (cache[1] < byte) {
ec07b5e0 5961 /* We already know part of the way. */
b9f984a5
NC
5962 if (mg->mg_len != -1) {
5963 /* Actually, we know the end too. */
5964 len = cache[0]
5965 + S_sv_pos_b2u_midway(aTHX_ s + cache[1], send,
ab455f60 5966 s + blen, mg->mg_len - cache[0]);
b9f984a5 5967 } else {
6448472a 5968 len = cache[0] + utf8_length(s + cache[1], send);
b9f984a5 5969 }
7e8c5dac 5970 }
9f985e4c
NC
5971 else if (cache[3] < byte) {
5972 /* We're between the two cached pairs, so we do the calculation
5973 offset by the byte/utf-8 positions for the earlier pair,
5974 then add the utf-8 characters from the string start to
5975 there. */
5976 len = S_sv_pos_b2u_midway(aTHX_ s + cache[3], send,
5977 s + cache[1], cache[0] - cache[2])
5978 + cache[2];
5979
5980 }
5981 else { /* cache[3] > byte */
5982 len = S_sv_pos_b2u_midway(aTHX_ s, send, s + cache[3],
5983 cache[2]);
7e8c5dac 5984
7e8c5dac 5985 }
ec07b5e0 5986 ASSERT_UTF8_CACHE(cache);
a922f900 5987 found = TRUE;
ffca234a 5988 } else if (mg->mg_len != -1) {
ab455f60 5989 len = S_sv_pos_b2u_midway(aTHX_ s, send, s + blen, mg->mg_len);
a922f900 5990 found = TRUE;
7e8c5dac 5991 }
a0ed51b3 5992 }
a922f900 5993 if (!found || PL_utf8cache < 0) {
6448472a 5994 const STRLEN real_len = utf8_length(s, send);
a922f900
NC
5995
5996 if (found && PL_utf8cache < 0) {
5997 if (len != real_len) {
5998 /* Need to turn the assertions off otherwise we may recurse
5999 infinitely while printing error messages. */
6000 SAVEI8(PL_utf8cache);
6001 PL_utf8cache = 0;
f5992bc4
RB
6002 Perl_croak(aTHX_ "panic: sv_pos_b2u cache %"UVuf
6003 " real %"UVuf" for %"SVf,
be2597df 6004 (UV) len, (UV) real_len, SVfARG(sv));
a922f900
NC
6005 }
6006 }
6007 len = real_len;
ec07b5e0
NC
6008 }
6009 *offsetp = len;
6010
ab455f60 6011 S_utf8_mg_pos_cache_update(aTHX_ sv, &mg, byte, len, blen);
a0ed51b3
LW
6012}
6013
954c1994
GS
6014/*
6015=for apidoc sv_eq
6016
6017Returns a boolean indicating whether the strings in the two SVs are
645c22ef
DM
6018identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6019coerce its args to strings if necessary.
954c1994
GS
6020
6021=cut
6022*/
6023
79072805 6024I32
e01b9e88 6025Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
79072805 6026{
97aff369 6027 dVAR;
e1ec3a88 6028 const char *pv1;
463ee0b2 6029 STRLEN cur1;
e1ec3a88 6030 const char *pv2;
463ee0b2 6031 STRLEN cur2;
e01b9e88 6032 I32 eq = 0;
bd61b366 6033 char *tpv = NULL;
a0714e2c 6034 SV* svrecode = NULL;
79072805 6035
e01b9e88 6036 if (!sv1) {
79072805
LW
6037 pv1 = "";
6038 cur1 = 0;
6039 }
ced497e2
YST
6040 else {
6041 /* if pv1 and pv2 are the same, second SvPV_const call may
6042 * invalidate pv1, so we may need to make a copy */
6043 if (sv1 == sv2 && (SvTHINKFIRST(sv1) || SvGMAGICAL(sv1))) {
6044 pv1 = SvPV_const(sv1, cur1);
59cd0e26 6045 sv1 = newSVpvn_flags(pv1, cur1, SVs_TEMP | SvUTF8(sv2));
ced497e2 6046 }
4d84ee25 6047 pv1 = SvPV_const(sv1, cur1);
ced497e2 6048 }
79072805 6049
e01b9e88
SC
6050 if (!sv2){
6051 pv2 = "";
6052 cur2 = 0;
92d29cee 6053 }
e01b9e88 6054 else
4d84ee25 6055 pv2 = SvPV_const(sv2, cur2);
79072805 6056
cf48d248 6057 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
6058 /* Differing utf8ness.
6059 * Do not UTF8size the comparands as a side-effect. */
6060 if (PL_encoding) {
6061 if (SvUTF8(sv1)) {
553e1bcc
AT
6062 svrecode = newSVpvn(pv2, cur2);
6063 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 6064 pv2 = SvPV_const(svrecode, cur2);
799ef3cb
JH
6065 }
6066 else {
553e1bcc
AT
6067 svrecode = newSVpvn(pv1, cur1);
6068 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 6069 pv1 = SvPV_const(svrecode, cur1);
799ef3cb
JH
6070 }
6071 /* Now both are in UTF-8. */
0a1bd7ac
DM
6072 if (cur1 != cur2) {
6073 SvREFCNT_dec(svrecode);
799ef3cb 6074 return FALSE;
0a1bd7ac 6075 }
799ef3cb
JH
6076 }
6077 else {
6078 bool is_utf8 = TRUE;
6079
6080 if (SvUTF8(sv1)) {
6081 /* sv1 is the UTF-8 one,
6082 * if is equal it must be downgrade-able */
9d4ba2ae 6083 char * const pv = (char*)bytes_from_utf8((const U8*)pv1,
799ef3cb
JH
6084 &cur1, &is_utf8);
6085 if (pv != pv1)
553e1bcc 6086 pv1 = tpv = pv;
799ef3cb
JH
6087 }
6088 else {
6089 /* sv2 is the UTF-8 one,
6090 * if is equal it must be downgrade-able */
9d4ba2ae 6091 char * const pv = (char *)bytes_from_utf8((const U8*)pv2,
799ef3cb
JH
6092 &cur2, &is_utf8);
6093 if (pv != pv2)
553e1bcc 6094 pv2 = tpv = pv;
799ef3cb
JH
6095 }
6096 if (is_utf8) {
6097 /* Downgrade not possible - cannot be eq */
bf694877 6098 assert (tpv == 0);
799ef3cb
JH
6099 return FALSE;
6100 }
6101 }
cf48d248
JH
6102 }
6103
6104 if (cur1 == cur2)
765f542d 6105 eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
e01b9e88 6106
b37c2d43 6107 SvREFCNT_dec(svrecode);
553e1bcc
AT
6108 if (tpv)
6109 Safefree(tpv);
cf48d248 6110
e01b9e88 6111 return eq;
79072805
LW
6112}
6113
954c1994
GS
6114/*
6115=for apidoc sv_cmp
6116
6117Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
6118string in C<sv1> is less than, equal to, or greater than the string in
645c22ef
DM
6119C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6120coerce its args to strings if necessary. See also C<sv_cmp_locale>.
954c1994
GS
6121
6122=cut
6123*/
6124
79072805 6125I32
e01b9e88 6126Perl_sv_cmp(pTHX_ register SV *sv1, register SV *sv2)
79072805 6127{
97aff369 6128 dVAR;
560a288e 6129 STRLEN cur1, cur2;
e1ec3a88 6130 const char *pv1, *pv2;
bd61b366 6131 char *tpv = NULL;
cf48d248 6132 I32 cmp;
a0714e2c 6133 SV *svrecode = NULL;
560a288e 6134
e01b9e88
SC
6135 if (!sv1) {
6136 pv1 = "";
560a288e
GS
6137 cur1 = 0;
6138 }
e01b9e88 6139 else
4d84ee25 6140 pv1 = SvPV_const(sv1, cur1);
560a288e 6141
553e1bcc 6142 if (!sv2) {
e01b9e88 6143 pv2 = "";
560a288e
GS
6144 cur2 = 0;
6145 }
e01b9e88 6146 else
4d84ee25 6147 pv2 = SvPV_const(sv2, cur2);
79072805 6148
cf48d248 6149 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
6150 /* Differing utf8ness.
6151 * Do not UTF8size the comparands as a side-effect. */
cf48d248 6152 if (SvUTF8(sv1)) {
799ef3cb 6153 if (PL_encoding) {
553e1bcc
AT
6154 svrecode = newSVpvn(pv2, cur2);
6155 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 6156 pv2 = SvPV_const(svrecode, cur2);
799ef3cb
JH
6157 }
6158 else {
e1ec3a88 6159 pv2 = tpv = (char*)bytes_to_utf8((const U8*)pv2, &cur2);
799ef3cb 6160 }
cf48d248
JH
6161 }
6162 else {
799ef3cb 6163 if (PL_encoding) {
553e1bcc
AT
6164 svrecode = newSVpvn(pv1, cur1);
6165 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 6166 pv1 = SvPV_const(svrecode, cur1);
799ef3cb
JH
6167 }
6168 else {
e1ec3a88 6169 pv1 = tpv = (char*)bytes_to_utf8((const U8*)pv1, &cur1);
799ef3cb 6170 }
cf48d248
JH
6171 }
6172 }
6173
e01b9e88 6174 if (!cur1) {
cf48d248 6175 cmp = cur2 ? -1 : 0;
e01b9e88 6176 } else if (!cur2) {
cf48d248
JH
6177 cmp = 1;
6178 } else {
e1ec3a88 6179 const I32 retval = memcmp((const void*)pv1, (const void*)pv2, cur1 < cur2 ? cur1 : cur2);
e01b9e88
SC
6180
6181 if (retval) {
cf48d248 6182 cmp = retval < 0 ? -1 : 1;
e01b9e88 6183 } else if (cur1 == cur2) {
cf48d248
JH
6184 cmp = 0;
6185 } else {
6186 cmp = cur1 < cur2 ? -1 : 1;
e01b9e88 6187 }
cf48d248 6188 }
16660edb 6189
b37c2d43 6190 SvREFCNT_dec(svrecode);
553e1bcc
AT
6191 if (tpv)
6192 Safefree(tpv);
cf48d248
JH
6193
6194 return cmp;
bbce6d69 6195}
16660edb 6196
c461cf8f
JH
6197/*
6198=for apidoc sv_cmp_locale
6199
645c22ef
DM
6200Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
6201'use bytes' aware, handles get magic, and will coerce its args to strings
6202if necessary. See also C<sv_cmp_locale>. See also C<sv_cmp>.
c461cf8f
JH
6203
6204=cut
6205*/
6206
bbce6d69 6207I32
864dbfa3 6208Perl_sv_cmp_locale(pTHX_ register SV *sv1, register SV *sv2)
bbce6d69 6209{
97aff369 6210 dVAR;
36477c24 6211#ifdef USE_LOCALE_COLLATE
16660edb 6212
bbce6d69 6213 char *pv1, *pv2;
6214 STRLEN len1, len2;
6215 I32 retval;
16660edb 6216
3280af22 6217 if (PL_collation_standard)
bbce6d69 6218 goto raw_compare;
16660edb 6219
bbce6d69 6220 len1 = 0;
8ac85365 6221 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
bbce6d69 6222 len2 = 0;
8ac85365 6223 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
16660edb 6224
bbce6d69 6225 if (!pv1 || !len1) {
6226 if (pv2 && len2)
6227 return -1;
6228 else
6229 goto raw_compare;
6230 }
6231 else {
6232 if (!pv2 || !len2)
6233 return 1;
6234 }
16660edb 6235
bbce6d69 6236 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 6237
bbce6d69 6238 if (retval)
16660edb 6239 return retval < 0 ? -1 : 1;
6240
bbce6d69 6241 /*
6242 * When the result of collation is equality, that doesn't mean
6243 * that there are no differences -- some locales exclude some
6244 * characters from consideration. So to avoid false equalities,
6245 * we use the raw string as a tiebreaker.
6246 */
16660edb 6247
bbce6d69 6248 raw_compare:
5f66b61c 6249 /*FALLTHROUGH*/
16660edb 6250
36477c24 6251#endif /* USE_LOCALE_COLLATE */
16660edb 6252
bbce6d69 6253 return sv_cmp(sv1, sv2);
6254}
79072805 6255
645c22ef 6256
36477c24 6257#ifdef USE_LOCALE_COLLATE
645c22ef 6258
7a4c00b4 6259/*
645c22ef
DM
6260=for apidoc sv_collxfrm
6261
6262Add Collate Transform magic to an SV if it doesn't already have it.
6263
6264Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
6265scalar data of the variable, but transformed to such a format that a normal
6266memory comparison can be used to compare the data according to the locale
6267settings.
6268
6269=cut
6270*/
6271
bbce6d69 6272char *
864dbfa3 6273Perl_sv_collxfrm(pTHX_ SV *sv, STRLEN *nxp)
bbce6d69 6274{
97aff369 6275 dVAR;
7a4c00b4 6276 MAGIC *mg;
16660edb 6277
14befaf4 6278 mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
3280af22 6279 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
93524f2b
NC
6280 const char *s;
6281 char *xf;
bbce6d69 6282 STRLEN len, xlen;
6283
7a4c00b4 6284 if (mg)
6285 Safefree(mg->mg_ptr);
93524f2b 6286 s = SvPV_const(sv, len);
bbce6d69 6287 if ((xf = mem_collxfrm(s, len, &xlen))) {
ff0cee69 6288 if (SvREADONLY(sv)) {
6289 SAVEFREEPV(xf);
6290 *nxp = xlen;
3280af22 6291 return xf + sizeof(PL_collation_ix);
ff0cee69 6292 }
7a4c00b4 6293 if (! mg) {
d83f0a82
NC
6294#ifdef PERL_OLD_COPY_ON_WRITE
6295 if (SvIsCOW(sv))
6296 sv_force_normal_flags(sv, 0);
6297#endif
6298 mg = sv_magicext(sv, 0, PERL_MAGIC_collxfrm, &PL_vtbl_collxfrm,
6299 0, 0);
7a4c00b4 6300 assert(mg);
bbce6d69 6301 }
7a4c00b4 6302 mg->mg_ptr = xf;
565764a8 6303 mg->mg_len = xlen;
7a4c00b4 6304 }
6305 else {
ff0cee69 6306 if (mg) {
6307 mg->mg_ptr = NULL;
565764a8 6308 mg->mg_len = -1;
ff0cee69 6309 }
bbce6d69 6310 }
6311 }
7a4c00b4 6312 if (mg && mg->mg_ptr) {
565764a8 6313 *nxp = mg->mg_len;
3280af22 6314 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 6315 }
6316 else {
6317 *nxp = 0;
6318 return NULL;
16660edb 6319 }
79072805
LW
6320}
6321
36477c24 6322#endif /* USE_LOCALE_COLLATE */
bbce6d69 6323
c461cf8f
JH
6324/*
6325=for apidoc sv_gets
6326
6327Get a line from the filehandle and store it into the SV, optionally
6328appending to the currently-stored string.
6329
6330=cut
6331*/
6332
79072805 6333char *
864dbfa3 6334Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
79072805 6335{
97aff369 6336 dVAR;
e1ec3a88 6337 const char *rsptr;
c07a80fd 6338 STRLEN rslen;
6339 register STDCHAR rslast;
6340 register STDCHAR *bp;
6341 register I32 cnt;
9c5ffd7c 6342 I32 i = 0;
8bfdd7d9 6343 I32 rspara = 0;
c07a80fd 6344
bc44a8a2
NC
6345 if (SvTHINKFIRST(sv))
6346 sv_force_normal_flags(sv, append ? 0 : SV_COW_DROP_PV);
765f542d
NC
6347 /* XXX. If you make this PVIV, then copy on write can copy scalars read
6348 from <>.
6349 However, perlbench says it's slower, because the existing swipe code
6350 is faster than copy on write.
6351 Swings and roundabouts. */
862a34c6 6352 SvUPGRADE(sv, SVt_PV);
99491443 6353
ff68c719 6354 SvSCREAM_off(sv);
efd8b2ba
AE
6355
6356 if (append) {
6357 if (PerlIO_isutf8(fp)) {
6358 if (!SvUTF8(sv)) {
6359 sv_utf8_upgrade_nomg(sv);
6360 sv_pos_u2b(sv,&append,0);
6361 }
6362 } else if (SvUTF8(sv)) {
561b68a9 6363 SV * const tsv = newSV(0);
efd8b2ba
AE
6364 sv_gets(tsv, fp, 0);
6365 sv_utf8_upgrade_nomg(tsv);
6366 SvCUR_set(sv,append);
6367 sv_catsv(sv,tsv);
6368 sv_free(tsv);
6369 goto return_string_or_null;
6370 }
6371 }
6372
6373 SvPOK_only(sv);
6374 if (PerlIO_isutf8(fp))
6375 SvUTF8_on(sv);
c07a80fd 6376
923e4eb5 6377 if (IN_PERL_COMPILETIME) {
8bfdd7d9
HS
6378 /* we always read code in line mode */
6379 rsptr = "\n";
6380 rslen = 1;
6381 }
6382 else if (RsSNARF(PL_rs)) {
7a5fa8a2 6383 /* If it is a regular disk file use size from stat() as estimate
acbd132f
JH
6384 of amount we are going to read -- may result in mallocing
6385 more memory than we really need if the layers below reduce
6386 the size we read (e.g. CRLF or a gzip layer).
e468d35b 6387 */
e311fd51 6388 Stat_t st;
e468d35b 6389 if (!PerlLIO_fstat(PerlIO_fileno(fp), &st) && S_ISREG(st.st_mode)) {
f54cb97a 6390 const Off_t offset = PerlIO_tell(fp);
58f1856e 6391 if (offset != (Off_t) -1 && st.st_size + append > offset) {
e468d35b
NIS
6392 (void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 1));
6393 }
6394 }
c07a80fd 6395 rsptr = NULL;
6396 rslen = 0;
6397 }
3280af22 6398 else if (RsRECORD(PL_rs)) {
e311fd51 6399 I32 bytesread;
5b2b9c68 6400 char *buffer;
acbd132f 6401 U32 recsize;
5b2b9c68
HM
6402
6403 /* Grab the size of the record we're getting */
acbd132f 6404 recsize = SvUV(SvRV(PL_rs)); /* RsRECORD() guarantees > 0. */
e311fd51 6405 buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append;
5b2b9c68
HM
6406 /* Go yank in */
6407#ifdef VMS
6408 /* VMS wants read instead of fread, because fread doesn't respect */
6409 /* RMS record boundaries. This is not necessarily a good thing to be */
e468d35b
NIS
6410 /* doing, but we've got no other real choice - except avoid stdio
6411 as implementation - perhaps write a :vms layer ?
6412 */
5b2b9c68
HM
6413 bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
6414#else
6415 bytesread = PerlIO_read(fp, buffer, recsize);
6416#endif
27e6ca2d
AE
6417 if (bytesread < 0)
6418 bytesread = 0;
e311fd51 6419 SvCUR_set(sv, bytesread += append);
e670df4e 6420 buffer[bytesread] = '\0';
efd8b2ba 6421 goto return_string_or_null;
5b2b9c68 6422 }
3280af22 6423 else if (RsPARA(PL_rs)) {
c07a80fd 6424 rsptr = "\n\n";
6425 rslen = 2;
8bfdd7d9 6426 rspara = 1;
c07a80fd 6427 }
7d59b7e4
NIS
6428 else {
6429 /* Get $/ i.e. PL_rs into same encoding as stream wants */
6430 if (PerlIO_isutf8(fp)) {
6431 rsptr = SvPVutf8(PL_rs, rslen);
6432 }
6433 else {
6434 if (SvUTF8(PL_rs)) {
6435 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
6436 Perl_croak(aTHX_ "Wide character in $/");
6437 }
6438 }
93524f2b 6439 rsptr = SvPV_const(PL_rs, rslen);
7d59b7e4
NIS
6440 }
6441 }
6442
c07a80fd 6443 rslast = rslen ? rsptr[rslen - 1] : '\0';
6444
8bfdd7d9 6445 if (rspara) { /* have to do this both before and after */
79072805 6446 do { /* to make sure file boundaries work right */
760ac839 6447 if (PerlIO_eof(fp))
a0d0e21e 6448 return 0;
760ac839 6449 i = PerlIO_getc(fp);
79072805 6450 if (i != '\n') {
a0d0e21e
LW
6451 if (i == -1)
6452 return 0;
760ac839 6453 PerlIO_ungetc(fp,i);
79072805
LW
6454 break;
6455 }
6456 } while (i != EOF);
6457 }
c07a80fd 6458
760ac839
LW
6459 /* See if we know enough about I/O mechanism to cheat it ! */
6460
6461 /* This used to be #ifdef test - it is made run-time test for ease
1c846c1f 6462 of abstracting out stdio interface. One call should be cheap
760ac839
LW
6463 enough here - and may even be a macro allowing compile
6464 time optimization.
6465 */
6466
6467 if (PerlIO_fast_gets(fp)) {
6468
6469 /*
6470 * We're going to steal some values from the stdio struct
6471 * and put EVERYTHING in the innermost loop into registers.
6472 */
6473 register STDCHAR *ptr;
6474 STRLEN bpx;
6475 I32 shortbuffered;
6476
16660edb 6477#if defined(VMS) && defined(PERLIO_IS_STDIO)
6478 /* An ungetc()d char is handled separately from the regular
6479 * buffer, so we getc() it back out and stuff it in the buffer.
6480 */
6481 i = PerlIO_getc(fp);
6482 if (i == EOF) return 0;
6483 *(--((*fp)->_ptr)) = (unsigned char) i;
6484 (*fp)->_cnt++;
6485#endif
c07a80fd 6486
c2960299 6487 /* Here is some breathtakingly efficient cheating */
c07a80fd 6488
a20bf0c3 6489 cnt = PerlIO_get_cnt(fp); /* get count into register */
e468d35b 6490 /* make sure we have the room */
7a5fa8a2 6491 if ((I32)(SvLEN(sv) - append) <= cnt + 1) {
e468d35b 6492 /* Not room for all of it
7a5fa8a2 6493 if we are looking for a separator and room for some
e468d35b
NIS
6494 */
6495 if (rslen && cnt > 80 && (I32)SvLEN(sv) > append) {
7a5fa8a2 6496 /* just process what we have room for */
79072805
LW
6497 shortbuffered = cnt - SvLEN(sv) + append + 1;
6498 cnt -= shortbuffered;
6499 }
6500 else {
6501 shortbuffered = 0;
bbce6d69 6502 /* remember that cnt can be negative */
eb160463 6503 SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
79072805
LW
6504 }
6505 }
7a5fa8a2 6506 else
79072805 6507 shortbuffered = 0;
3f7c398e 6508 bp = (STDCHAR*)SvPVX_const(sv) + append; /* move these two too to registers */
a20bf0c3 6509 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 6510 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6511 "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
16660edb 6512 DEBUG_P(PerlIO_printf(Perl_debug_log,
ba7abf9d 6513 "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6514 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6515 PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
6516 for (;;) {
6517 screamer:
93a17b20 6518 if (cnt > 0) {
c07a80fd 6519 if (rslen) {
760ac839
LW
6520 while (cnt > 0) { /* this | eat */
6521 cnt--;
c07a80fd 6522 if ((*bp++ = *ptr++) == rslast) /* really | dust */
6523 goto thats_all_folks; /* screams | sed :-) */
6524 }
6525 }
6526 else {
1c846c1f
NIS
6527 Copy(ptr, bp, cnt, char); /* this | eat */
6528 bp += cnt; /* screams | dust */
c07a80fd 6529 ptr += cnt; /* louder | sed :-) */
a5f75d66 6530 cnt = 0;
93a17b20 6531 }
79072805
LW
6532 }
6533
748a9306 6534 if (shortbuffered) { /* oh well, must extend */
79072805
LW
6535 cnt = shortbuffered;
6536 shortbuffered = 0;
3f7c398e 6537 bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
79072805
LW
6538 SvCUR_set(sv, bpx);
6539 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
3f7c398e 6540 bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
79072805
LW
6541 continue;
6542 }
6543
16660edb 6544 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841
GS
6545 "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
6546 PTR2UV(ptr),(long)cnt));
cc00df79 6547 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
ba7abf9d 6548#if 0
16660edb 6549 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6550 "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6551 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6552 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 6553#endif
1c846c1f 6554 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b 6555 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
6556 another abstraction. */
760ac839 6557 i = PerlIO_getc(fp); /* get more characters */
ba7abf9d 6558#if 0
16660edb 6559 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6560 "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6561 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6562 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 6563#endif
a20bf0c3
JH
6564 cnt = PerlIO_get_cnt(fp);
6565 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
16660edb 6566 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6567 "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
79072805 6568
748a9306
LW
6569 if (i == EOF) /* all done for ever? */
6570 goto thats_really_all_folks;
6571
3f7c398e 6572 bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
79072805
LW
6573 SvCUR_set(sv, bpx);
6574 SvGROW(sv, bpx + cnt + 2);
3f7c398e 6575 bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
c07a80fd 6576
eb160463 6577 *bp++ = (STDCHAR)i; /* store character from PerlIO_getc */
79072805 6578
c07a80fd 6579 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
79072805 6580 goto thats_all_folks;
79072805
LW
6581 }
6582
6583thats_all_folks:
3f7c398e 6584 if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX_const(sv)) < rslen) ||
36477c24 6585 memNE((char*)bp - rslen, rsptr, rslen))
760ac839 6586 goto screamer; /* go back to the fray */
79072805
LW
6587thats_really_all_folks:
6588 if (shortbuffered)
6589 cnt += shortbuffered;
16660edb 6590 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6591 "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
cc00df79 6592 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* put these back or we're in trouble */
16660edb 6593 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6594 "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6595 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6596 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
79072805 6597 *bp = '\0';
3f7c398e 6598 SvCUR_set(sv, bp - (STDCHAR*)SvPVX_const(sv)); /* set length */
16660edb 6599 DEBUG_P(PerlIO_printf(Perl_debug_log,
fb73857a 6600 "Screamer: done, len=%ld, string=|%.*s|\n",
3f7c398e 6601 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX_const(sv)));
760ac839
LW
6602 }
6603 else
79072805 6604 {
6edd2cd5 6605 /*The big, slow, and stupid way. */
27da23d5 6606#ifdef USE_HEAP_INSTEAD_OF_STACK /* Even slower way. */
cbbf8932 6607 STDCHAR *buf = NULL;
a02a5408 6608 Newx(buf, 8192, STDCHAR);
6edd2cd5 6609 assert(buf);
4d2c4e07 6610#else
6edd2cd5 6611 STDCHAR buf[8192];
4d2c4e07 6612#endif
79072805 6613
760ac839 6614screamer2:
c07a80fd 6615 if (rslen) {
00b6aa41 6616 register const STDCHAR * const bpe = buf + sizeof(buf);
760ac839 6617 bp = buf;
eb160463 6618 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
760ac839
LW
6619 ; /* keep reading */
6620 cnt = bp - buf;
c07a80fd 6621 }
6622 else {
760ac839 6623 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
16660edb 6624 /* Accomodate broken VAXC compiler, which applies U8 cast to
6625 * both args of ?: operator, causing EOF to change into 255
6626 */
37be0adf 6627 if (cnt > 0)
cbe9e203
JH
6628 i = (U8)buf[cnt - 1];
6629 else
37be0adf 6630 i = EOF;
c07a80fd 6631 }
79072805 6632
cbe9e203
JH
6633 if (cnt < 0)
6634 cnt = 0; /* we do need to re-set the sv even when cnt <= 0 */
6635 if (append)
6636 sv_catpvn(sv, (char *) buf, cnt);
6637 else
6638 sv_setpvn(sv, (char *) buf, cnt);
c07a80fd 6639
6640 if (i != EOF && /* joy */
6641 (!rslen ||
6642 SvCUR(sv) < rslen ||
3f7c398e 6643 memNE(SvPVX_const(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
79072805
LW
6644 {
6645 append = -1;
63e4d877
CS
6646 /*
6647 * If we're reading from a TTY and we get a short read,
6648 * indicating that the user hit his EOF character, we need
6649 * to notice it now, because if we try to read from the TTY
6650 * again, the EOF condition will disappear.
6651 *
6652 * The comparison of cnt to sizeof(buf) is an optimization
6653 * that prevents unnecessary calls to feof().
6654 *
6655 * - jik 9/25/96
6656 */
bb7a0f54 6657 if (!(cnt < (I32)sizeof(buf) && PerlIO_eof(fp)))
63e4d877 6658 goto screamer2;
79072805 6659 }
6edd2cd5 6660
27da23d5 6661#ifdef USE_HEAP_INSTEAD_OF_STACK
6edd2cd5
JH
6662 Safefree(buf);
6663#endif
79072805
LW
6664 }
6665
8bfdd7d9 6666 if (rspara) { /* have to do this both before and after */
c07a80fd 6667 while (i != EOF) { /* to make sure file boundaries work right */
760ac839 6668 i = PerlIO_getc(fp);
79072805 6669 if (i != '\n') {
760ac839 6670 PerlIO_ungetc(fp,i);
79072805
LW
6671 break;
6672 }
6673 }
6674 }
c07a80fd 6675
efd8b2ba 6676return_string_or_null:
bd61b366 6677 return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
79072805
LW
6678}
6679
954c1994
GS
6680/*
6681=for apidoc sv_inc
6682
645c22ef
DM
6683Auto-increment of the value in the SV, doing string to numeric conversion
6684if necessary. Handles 'get' magic.
954c1994
GS
6685
6686=cut
6687*/
6688
79072805 6689void
864dbfa3 6690Perl_sv_inc(pTHX_ register SV *sv)
79072805 6691{
97aff369 6692 dVAR;
79072805 6693 register char *d;
463ee0b2 6694 int flags;
79072805
LW
6695
6696 if (!sv)
6697 return;
5b295bef 6698 SvGETMAGIC(sv);
ed6116ce 6699 if (SvTHINKFIRST(sv)) {
765f542d
NC
6700 if (SvIsCOW(sv))
6701 sv_force_normal_flags(sv, 0);
0f15f207 6702 if (SvREADONLY(sv)) {
923e4eb5 6703 if (IN_PERL_RUNTIME)
cea2e8a9 6704 Perl_croak(aTHX_ PL_no_modify);
0f15f207 6705 }
a0d0e21e 6706 if (SvROK(sv)) {
b5be31e9 6707 IV i;
9e7bc3e8
JD
6708 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
6709 return;
56431972 6710 i = PTR2IV(SvRV(sv));
b5be31e9
SM
6711 sv_unref(sv);
6712 sv_setiv(sv, i);
a0d0e21e 6713 }
ed6116ce 6714 }
8990e307 6715 flags = SvFLAGS(sv);
28e5dec8
JH
6716 if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
6717 /* It's (privately or publicly) a float, but not tested as an
6718 integer, so test it to see. */
d460ef45 6719 (void) SvIV(sv);
28e5dec8
JH
6720 flags = SvFLAGS(sv);
6721 }
6722 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6723 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 6724#ifdef PERL_PRESERVE_IVUV
28e5dec8 6725 oops_its_int:
59d8ce62 6726#endif
25da4f38
IZ
6727 if (SvIsUV(sv)) {
6728 if (SvUVX(sv) == UV_MAX)
a1e868e7 6729 sv_setnv(sv, UV_MAX_P1);
25da4f38
IZ
6730 else
6731 (void)SvIOK_only_UV(sv);
607fa7f2 6732 SvUV_set(sv, SvUVX(sv) + 1);
25da4f38
IZ
6733 } else {
6734 if (SvIVX(sv) == IV_MAX)
28e5dec8 6735 sv_setuv(sv, (UV)IV_MAX + 1);
25da4f38
IZ
6736 else {
6737 (void)SvIOK_only(sv);
45977657 6738 SvIV_set(sv, SvIVX(sv) + 1);
1c846c1f 6739 }
55497cff 6740 }
79072805
LW
6741 return;
6742 }
28e5dec8
JH
6743 if (flags & SVp_NOK) {
6744 (void)SvNOK_only(sv);
9d6ce603 6745 SvNV_set(sv, SvNVX(sv) + 1.0);
28e5dec8
JH
6746 return;
6747 }
6748
3f7c398e 6749 if (!(flags & SVp_POK) || !*SvPVX_const(sv)) {
28e5dec8 6750 if ((flags & SVTYPEMASK) < SVt_PVIV)
f5282e15 6751 sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV ? SVt_PVIV : SVt_IV));
28e5dec8 6752 (void)SvIOK_only(sv);
45977657 6753 SvIV_set(sv, 1);
79072805
LW
6754 return;
6755 }
463ee0b2 6756 d = SvPVX(sv);
79072805
LW
6757 while (isALPHA(*d)) d++;
6758 while (isDIGIT(*d)) d++;
6759 if (*d) {
28e5dec8 6760#ifdef PERL_PRESERVE_IVUV
d1be9408 6761 /* Got to punt this as an integer if needs be, but we don't issue
28e5dec8
JH
6762 warnings. Probably ought to make the sv_iv_please() that does
6763 the conversion if possible, and silently. */
504618e9 6764 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
28e5dec8
JH
6765 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6766 /* Need to try really hard to see if it's an integer.
6767 9.22337203685478e+18 is an integer.
6768 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6769 so $a="9.22337203685478e+18"; $a+0; $a++
6770 needs to be the same as $a="9.22337203685478e+18"; $a++
6771 or we go insane. */
d460ef45 6772
28e5dec8
JH
6773 (void) sv_2iv(sv);
6774 if (SvIOK(sv))
6775 goto oops_its_int;
6776
6777 /* sv_2iv *should* have made this an NV */
6778 if (flags & SVp_NOK) {
6779 (void)SvNOK_only(sv);
9d6ce603 6780 SvNV_set(sv, SvNVX(sv) + 1.0);
28e5dec8
JH
6781 return;
6782 }
6783 /* I don't think we can get here. Maybe I should assert this
6784 And if we do get here I suspect that sv_setnv will croak. NWC
6785 Fall through. */
6786#if defined(USE_LONG_DOUBLE)
6787 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 6788 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8 6789#else
1779d84d 6790 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 6791 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8
JH
6792#endif
6793 }
6794#endif /* PERL_PRESERVE_IVUV */
3f7c398e 6795 sv_setnv(sv,Atof(SvPVX_const(sv)) + 1.0);
79072805
LW
6796 return;
6797 }
6798 d--;
3f7c398e 6799 while (d >= SvPVX_const(sv)) {
79072805
LW
6800 if (isDIGIT(*d)) {
6801 if (++*d <= '9')
6802 return;
6803 *(d--) = '0';
6804 }
6805 else {
9d116dd7
JH
6806#ifdef EBCDIC
6807 /* MKS: The original code here died if letters weren't consecutive.
6808 * at least it didn't have to worry about non-C locales. The
6809 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
1c846c1f 6810 * arranged in order (although not consecutively) and that only
9d116dd7
JH
6811 * [A-Za-z] are accepted by isALPHA in the C locale.
6812 */
6813 if (*d != 'z' && *d != 'Z') {
6814 do { ++*d; } while (!isALPHA(*d));
6815 return;
6816 }
6817 *(d--) -= 'z' - 'a';
6818#else
79072805
LW
6819 ++*d;
6820 if (isALPHA(*d))
6821 return;
6822 *(d--) -= 'z' - 'a' + 1;
9d116dd7 6823#endif
79072805
LW
6824 }
6825 }
6826 /* oh,oh, the number grew */
6827 SvGROW(sv, SvCUR(sv) + 2);
b162af07 6828 SvCUR_set(sv, SvCUR(sv) + 1);
3f7c398e 6829 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX_const(sv); d--)
79072805
LW
6830 *d = d[-1];
6831 if (isDIGIT(d[1]))
6832 *d = '1';
6833 else
6834 *d = d[1];
6835}
6836
954c1994
GS
6837/*
6838=for apidoc sv_dec
6839
645c22ef
DM
6840Auto-decrement of the value in the SV, doing string to numeric conversion
6841if necessary. Handles 'get' magic.
954c1994
GS
6842
6843=cut
6844*/
6845
79072805 6846void
864dbfa3 6847Perl_sv_dec(pTHX_ register SV *sv)
79072805 6848{
97aff369 6849 dVAR;
463ee0b2
LW
6850 int flags;
6851
79072805
LW
6852 if (!sv)
6853 return;
5b295bef 6854 SvGETMAGIC(sv);
ed6116ce 6855 if (SvTHINKFIRST(sv)) {
765f542d
NC
6856 if (SvIsCOW(sv))
6857 sv_force_normal_flags(sv, 0);
0f15f207 6858 if (SvREADONLY(sv)) {
923e4eb5 6859 if (IN_PERL_RUNTIME)
cea2e8a9 6860 Perl_croak(aTHX_ PL_no_modify);
0f15f207 6861 }
a0d0e21e 6862 if (SvROK(sv)) {
b5be31e9 6863 IV i;
9e7bc3e8
JD
6864 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
6865 return;
56431972 6866 i = PTR2IV(SvRV(sv));
b5be31e9
SM
6867 sv_unref(sv);
6868 sv_setiv(sv, i);
a0d0e21e 6869 }
ed6116ce 6870 }
28e5dec8
JH
6871 /* Unlike sv_inc we don't have to worry about string-never-numbers
6872 and keeping them magic. But we mustn't warn on punting */
8990e307 6873 flags = SvFLAGS(sv);
28e5dec8
JH
6874 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6875 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 6876#ifdef PERL_PRESERVE_IVUV
28e5dec8 6877 oops_its_int:
59d8ce62 6878#endif
25da4f38
IZ
6879 if (SvIsUV(sv)) {
6880 if (SvUVX(sv) == 0) {
6881 (void)SvIOK_only(sv);
45977657 6882 SvIV_set(sv, -1);
25da4f38
IZ
6883 }
6884 else {
6885 (void)SvIOK_only_UV(sv);
f4eee32f 6886 SvUV_set(sv, SvUVX(sv) - 1);
1c846c1f 6887 }
25da4f38
IZ
6888 } else {
6889 if (SvIVX(sv) == IV_MIN)
65202027 6890 sv_setnv(sv, (NV)IV_MIN - 1.0);
25da4f38
IZ
6891 else {
6892 (void)SvIOK_only(sv);
45977657 6893 SvIV_set(sv, SvIVX(sv) - 1);
1c846c1f 6894 }
55497cff 6895 }
6896 return;
6897 }
28e5dec8 6898 if (flags & SVp_NOK) {
9d6ce603 6899 SvNV_set(sv, SvNVX(sv) - 1.0);
28e5dec8
JH
6900 (void)SvNOK_only(sv);
6901 return;
6902 }
8990e307 6903 if (!(flags & SVp_POK)) {
ef088171
NC
6904 if ((flags & SVTYPEMASK) < SVt_PVIV)
6905 sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV) ? SVt_PVIV : SVt_IV);
6906 SvIV_set(sv, -1);
6907 (void)SvIOK_only(sv);
79072805
LW
6908 return;
6909 }
28e5dec8
JH
6910#ifdef PERL_PRESERVE_IVUV
6911 {
504618e9 6912 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
28e5dec8
JH
6913 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6914 /* Need to try really hard to see if it's an integer.
6915 9.22337203685478e+18 is an integer.
6916 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6917 so $a="9.22337203685478e+18"; $a+0; $a--
6918 needs to be the same as $a="9.22337203685478e+18"; $a--
6919 or we go insane. */
d460ef45 6920
28e5dec8
JH
6921 (void) sv_2iv(sv);
6922 if (SvIOK(sv))
6923 goto oops_its_int;
6924
6925 /* sv_2iv *should* have made this an NV */
6926 if (flags & SVp_NOK) {
6927 (void)SvNOK_only(sv);
9d6ce603 6928 SvNV_set(sv, SvNVX(sv) - 1.0);
28e5dec8
JH
6929 return;
6930 }
6931 /* I don't think we can get here. Maybe I should assert this
6932 And if we do get here I suspect that sv_setnv will croak. NWC
6933 Fall through. */
6934#if defined(USE_LONG_DOUBLE)
6935 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 6936 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8 6937#else
1779d84d 6938 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 6939 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8
JH
6940#endif
6941 }
6942 }
6943#endif /* PERL_PRESERVE_IVUV */
3f7c398e 6944 sv_setnv(sv,Atof(SvPVX_const(sv)) - 1.0); /* punt */
79072805
LW
6945}
6946
954c1994
GS
6947/*
6948=for apidoc sv_mortalcopy
6949
645c22ef 6950Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
d4236ebc
DM
6951The new SV is marked as mortal. It will be destroyed "soon", either by an
6952explicit call to FREETMPS, or by an implicit call at places such as
6953statement boundaries. See also C<sv_newmortal> and C<sv_2mortal>.
954c1994
GS
6954
6955=cut
6956*/
6957
79072805
LW
6958/* Make a string that will exist for the duration of the expression
6959 * evaluation. Actually, it may have to last longer than that, but
6960 * hopefully we won't free it until it has been assigned to a
6961 * permanent location. */
6962
6963SV *
864dbfa3 6964Perl_sv_mortalcopy(pTHX_ SV *oldstr)
79072805 6965{
97aff369 6966 dVAR;
463ee0b2 6967 register SV *sv;
b881518d 6968
4561caa4 6969 new_SV(sv);
79072805 6970 sv_setsv(sv,oldstr);
677b06e3
GS
6971 EXTEND_MORTAL(1);
6972 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307
LW
6973 SvTEMP_on(sv);
6974 return sv;
6975}
6976
954c1994
GS
6977/*
6978=for apidoc sv_newmortal
6979
645c22ef 6980Creates a new null SV which is mortal. The reference count of the SV is
d4236ebc
DM
6981set to 1. It will be destroyed "soon", either by an explicit call to
6982FREETMPS, or by an implicit call at places such as statement boundaries.
6983See also C<sv_mortalcopy> and C<sv_2mortal>.
954c1994
GS
6984
6985=cut
6986*/
6987
8990e307 6988SV *
864dbfa3 6989Perl_sv_newmortal(pTHX)
8990e307 6990{
97aff369 6991 dVAR;
8990e307
LW
6992 register SV *sv;
6993
4561caa4 6994 new_SV(sv);
8990e307 6995 SvFLAGS(sv) = SVs_TEMP;
677b06e3
GS
6996 EXTEND_MORTAL(1);
6997 PL_tmps_stack[++PL_tmps_ix] = sv;
79072805
LW
6998 return sv;
6999}
7000
59cd0e26
NC
7001
7002/*
7003=for apidoc newSVpvn_flags
7004
7005Creates a new SV and copies a string into it. The reference count for the
7006SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
7007string. You are responsible for ensuring that the source string is at least
7008C<len> bytes long. If the C<s> argument is NULL the new SV will be undefined.
7009Currently the only flag bits accepted are C<SVf_UTF8> and C<SVs_TEMP>.
7010If C<SVs_TEMP> is set, then C<sv2mortal()> is called on the result before
7011returning. If C<SVf_UTF8> is set, then it will be set on the new SV.
7012C<newSVpvn_utf8()> is a convenience wrapper for this function, defined as
7013
7014 #define newSVpvn_utf8(s, len, u) \
7015 newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0)
7016
7017=cut
7018*/
7019
7020SV *
7021Perl_newSVpvn_flags(pTHX_ const char *s, STRLEN len, U32 flags)
7022{
7023 dVAR;
7024 register SV *sv;
7025
7026 /* All the flags we don't support must be zero.
7027 And we're new code so I'm going to assert this from the start. */
7028 assert(!(flags & ~(SVf_UTF8|SVs_TEMP)));
7029 new_SV(sv);
7030 sv_setpvn(sv,s,len);
7031 SvFLAGS(sv) |= (flags & SVf_UTF8);
7032 return (flags & SVs_TEMP) ? sv_2mortal(sv) : sv;
7033}
7034
954c1994
GS
7035/*
7036=for apidoc sv_2mortal
7037
d4236ebc
DM
7038Marks an existing SV as mortal. The SV will be destroyed "soon", either
7039by an explicit call to FREETMPS, or by an implicit call at places such as
37d2ac18
NC
7040statement boundaries. SvTEMP() is turned on which means that the SV's
7041string buffer can be "stolen" if this SV is copied. See also C<sv_newmortal>
7042and C<sv_mortalcopy>.
954c1994
GS
7043
7044=cut
7045*/
7046
79072805 7047SV *
864dbfa3 7048Perl_sv_2mortal(pTHX_ register SV *sv)
79072805 7049{
27da23d5 7050 dVAR;
79072805 7051 if (!sv)
7a5b473e 7052 return NULL;
d689ffdd 7053 if (SvREADONLY(sv) && SvIMMORTAL(sv))
11162842 7054 return sv;
677b06e3
GS
7055 EXTEND_MORTAL(1);
7056 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307 7057 SvTEMP_on(sv);
79072805
LW
7058 return sv;
7059}
7060
954c1994
GS
7061/*
7062=for apidoc newSVpv
7063
7064Creates a new SV and copies a string into it. The reference count for the
7065SV is set to 1. If C<len> is zero, Perl will compute the length using
7066strlen(). For efficiency, consider using C<newSVpvn> instead.
7067
7068=cut
7069*/
7070
79072805 7071SV *
864dbfa3 7072Perl_newSVpv(pTHX_ const char *s, STRLEN len)
79072805 7073{
97aff369 7074 dVAR;
463ee0b2 7075 register SV *sv;
79072805 7076
4561caa4 7077 new_SV(sv);
ddfa59c7 7078 sv_setpvn(sv, s, len || s == NULL ? len : strlen(s));
79072805
LW
7079 return sv;
7080}
7081
954c1994
GS
7082/*
7083=for apidoc newSVpvn
7084
7085Creates a new SV and copies a string into it. The reference count for the
1c846c1f 7086SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
954c1994 7087string. You are responsible for ensuring that the source string is at least
9e09f5f2 7088C<len> bytes long. If the C<s> argument is NULL the new SV will be undefined.
954c1994
GS
7089
7090=cut
7091*/
7092
9da1e3b5 7093SV *
864dbfa3 7094Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
9da1e3b5 7095{
97aff369 7096 dVAR;
9da1e3b5
MUN
7097 register SV *sv;
7098
7099 new_SV(sv);
9da1e3b5
MUN
7100 sv_setpvn(sv,s,len);
7101 return sv;
7102}
7103
740cce10 7104/*
926f8064 7105=for apidoc newSVhek
bd08039b
NC
7106
7107Creates a new SV from the hash key structure. It will generate scalars that
5aaec2b4
NC
7108point to the shared string table where possible. Returns a new (undefined)
7109SV if the hek is NULL.
bd08039b
NC
7110
7111=cut
7112*/
7113
7114SV *
c1b02ed8 7115Perl_newSVhek(pTHX_ const HEK *hek)
bd08039b 7116{
97aff369 7117 dVAR;
5aaec2b4
NC
7118 if (!hek) {
7119 SV *sv;
7120
7121 new_SV(sv);
7122 return sv;
7123 }
7124
bd08039b
NC
7125 if (HEK_LEN(hek) == HEf_SVKEY) {
7126 return newSVsv(*(SV**)HEK_KEY(hek));
7127 } else {
7128 const int flags = HEK_FLAGS(hek);
7129 if (flags & HVhek_WASUTF8) {
7130 /* Trouble :-)
7131 Andreas would like keys he put in as utf8 to come back as utf8
7132 */
7133 STRLEN utf8_len = HEK_LEN(hek);
b64e5050
AL
7134 const U8 *as_utf8 = bytes_to_utf8 ((U8*)HEK_KEY(hek), &utf8_len);
7135 SV * const sv = newSVpvn ((const char*)as_utf8, utf8_len);
bd08039b
NC
7136
7137 SvUTF8_on (sv);
7138 Safefree (as_utf8); /* bytes_to_utf8() allocates a new string */
7139 return sv;
45e34800 7140 } else if (flags & (HVhek_REHASH|HVhek_UNSHARED)) {
bd08039b
NC
7141 /* We don't have a pointer to the hv, so we have to replicate the
7142 flag into every HEK. This hv is using custom a hasing
7143 algorithm. Hence we can't return a shared string scalar, as
7144 that would contain the (wrong) hash value, and might get passed
45e34800
NC
7145 into an hv routine with a regular hash.
7146 Similarly, a hash that isn't using shared hash keys has to have
7147 the flag in every key so that we know not to try to call
7148 share_hek_kek on it. */
bd08039b 7149
b64e5050 7150 SV * const sv = newSVpvn (HEK_KEY(hek), HEK_LEN(hek));
bd08039b
NC
7151 if (HEK_UTF8(hek))
7152 SvUTF8_on (sv);
7153 return sv;
7154 }
7155 /* This will be overwhelminly the most common case. */
409dfe77
NC
7156 {
7157 /* Inline most of newSVpvn_share(), because share_hek_hek() is far
7158 more efficient than sharepvn(). */
7159 SV *sv;
7160
7161 new_SV(sv);
7162 sv_upgrade(sv, SVt_PV);
7163 SvPV_set(sv, (char *)HEK_KEY(share_hek_hek(hek)));
7164 SvCUR_set(sv, HEK_LEN(hek));
7165 SvLEN_set(sv, 0);
7166 SvREADONLY_on(sv);
7167 SvFAKE_on(sv);
7168 SvPOK_on(sv);
7169 if (HEK_UTF8(hek))
7170 SvUTF8_on(sv);
7171 return sv;
7172 }
bd08039b
NC
7173 }
7174}
7175
1c846c1f
NIS
7176/*
7177=for apidoc newSVpvn_share
7178
3f7c398e 7179Creates a new SV with its SvPVX_const pointing to a shared string in the string
645c22ef 7180table. If the string does not already exist in the table, it is created
758fcfc1
VP
7181first. Turns on READONLY and FAKE. If the C<hash> parameter is non-zero, that
7182value is used; otherwise the hash is computed. The string's hash can be later
7183be retrieved from the SV with the C<SvSHARED_HASH()> macro. The idea here is
7184that as the string table is used for shared hash keys these strings will have
7185SvPVX_const == HeKEY and hash lookup will avoid string compare.
1c846c1f
NIS
7186
7187=cut
7188*/
7189
7190SV *
c3654f1a 7191Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
1c846c1f 7192{
97aff369 7193 dVAR;
1c846c1f 7194 register SV *sv;
c3654f1a 7195 bool is_utf8 = FALSE;
a51caccf
NC
7196 const char *const orig_src = src;
7197
c3654f1a 7198 if (len < 0) {
77caf834 7199 STRLEN tmplen = -len;
c3654f1a 7200 is_utf8 = TRUE;
75a54232 7201 /* See the note in hv.c:hv_fetch() --jhi */
e1ec3a88 7202 src = (char*)bytes_from_utf8((const U8*)src, &tmplen, &is_utf8);
75a54232
JH
7203 len = tmplen;
7204 }
1c846c1f 7205 if (!hash)
5afd6d42 7206 PERL_HASH(hash, src, len);
1c846c1f 7207 new_SV(sv);
bdd68bc3 7208 sv_upgrade(sv, SVt_PV);
f880fe2f 7209 SvPV_set(sv, sharepvn(src, is_utf8?-len:len, hash));
b162af07 7210 SvCUR_set(sv, len);
b162af07 7211 SvLEN_set(sv, 0);
1c846c1f
NIS
7212 SvREADONLY_on(sv);
7213 SvFAKE_on(sv);
7214 SvPOK_on(sv);
c3654f1a
IH
7215 if (is_utf8)
7216 SvUTF8_on(sv);
a51caccf
NC
7217 if (src != orig_src)
7218 Safefree(src);
1c846c1f
NIS
7219 return sv;
7220}
7221
645c22ef 7222
cea2e8a9 7223#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7224
7225/* pTHX_ magic can't cope with varargs, so this is a no-context
7226 * version of the main function, (which may itself be aliased to us).
7227 * Don't access this version directly.
7228 */
7229
46fc3d4c 7230SV *
cea2e8a9 7231Perl_newSVpvf_nocontext(const char* pat, ...)
46fc3d4c 7232{
cea2e8a9 7233 dTHX;
46fc3d4c 7234 register SV *sv;
7235 va_list args;
46fc3d4c 7236 va_start(args, pat);
c5be433b 7237 sv = vnewSVpvf(pat, &args);
46fc3d4c 7238 va_end(args);
7239 return sv;
7240}
cea2e8a9 7241#endif
46fc3d4c 7242
954c1994
GS
7243/*
7244=for apidoc newSVpvf
7245
645c22ef 7246Creates a new SV and initializes it with the string formatted like
954c1994
GS
7247C<sprintf>.
7248
7249=cut
7250*/
7251
cea2e8a9
GS
7252SV *
7253Perl_newSVpvf(pTHX_ const char* pat, ...)
7254{
7255 register SV *sv;
7256 va_list args;
cea2e8a9 7257 va_start(args, pat);
c5be433b 7258 sv = vnewSVpvf(pat, &args);
cea2e8a9
GS
7259 va_end(args);
7260 return sv;
7261}
46fc3d4c 7262
645c22ef
DM
7263/* backend for newSVpvf() and newSVpvf_nocontext() */
7264
79072805 7265SV *
c5be433b
GS
7266Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
7267{
97aff369 7268 dVAR;
c5be433b
GS
7269 register SV *sv;
7270 new_SV(sv);
4608196e 7271 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
c5be433b
GS
7272 return sv;
7273}
7274
954c1994
GS
7275/*
7276=for apidoc newSVnv
7277
7278Creates a new SV and copies a floating point value into it.
7279The reference count for the SV is set to 1.
7280
7281=cut
7282*/
7283
c5be433b 7284SV *
65202027 7285Perl_newSVnv(pTHX_ NV n)
79072805 7286{
97aff369 7287 dVAR;
463ee0b2 7288 register SV *sv;
79072805 7289
4561caa4 7290 new_SV(sv);
79072805
LW
7291 sv_setnv(sv,n);
7292 return sv;
7293}
7294
954c1994
GS
7295/*
7296=for apidoc newSViv
7297
7298Creates a new SV and copies an integer into it. The reference count for the
7299SV is set to 1.
7300
7301=cut
7302*/
7303
79072805 7304SV *
864dbfa3 7305Perl_newSViv(pTHX_ IV i)
79072805 7306{
97aff369 7307 dVAR;
463ee0b2 7308 register SV *sv;
79072805 7309
4561caa4 7310 new_SV(sv);
79072805
LW
7311 sv_setiv(sv,i);
7312 return sv;
7313}
7314
954c1994 7315/*
1a3327fb
JH
7316=for apidoc newSVuv
7317
7318Creates a new SV and copies an unsigned integer into it.
7319The reference count for the SV is set to 1.
7320
7321=cut
7322*/
7323
7324SV *
7325Perl_newSVuv(pTHX_ UV u)
7326{
97aff369 7327 dVAR;
1a3327fb
JH
7328 register SV *sv;
7329
7330 new_SV(sv);
7331 sv_setuv(sv,u);
7332 return sv;
7333}
7334
7335/*
b9f83d2f
NC
7336=for apidoc newSV_type
7337
c41f7ed2 7338Creates a new SV, of the type specified. The reference count for the new SV
b9f83d2f
NC
7339is set to 1.
7340
7341=cut
7342*/
7343
7344SV *
7345Perl_newSV_type(pTHX_ svtype type)
7346{
7347 register SV *sv;
7348
7349 new_SV(sv);
7350 sv_upgrade(sv, type);
7351 return sv;
7352}
7353
7354/*
954c1994
GS
7355=for apidoc newRV_noinc
7356
7357Creates an RV wrapper for an SV. The reference count for the original
7358SV is B<not> incremented.
7359
7360=cut
7361*/
7362
2304df62 7363SV *
864dbfa3 7364Perl_newRV_noinc(pTHX_ SV *tmpRef)
2304df62 7365{
97aff369 7366 dVAR;
4df7f6af 7367 register SV *sv = newSV_type(SVt_IV);
76e3520e 7368 SvTEMP_off(tmpRef);
b162af07 7369 SvRV_set(sv, tmpRef);
2304df62 7370 SvROK_on(sv);
2304df62
AD
7371 return sv;
7372}
7373
ff276b08 7374/* newRV_inc is the official function name to use now.
645c22ef
DM
7375 * newRV_inc is in fact #defined to newRV in sv.h
7376 */
7377
5f05dabc 7378SV *
7f466ec7 7379Perl_newRV(pTHX_ SV *sv)
5f05dabc 7380{
97aff369 7381 dVAR;
7f466ec7 7382 return newRV_noinc(SvREFCNT_inc_simple_NN(sv));
5f05dabc 7383}
5f05dabc 7384
954c1994
GS
7385/*
7386=for apidoc newSVsv
7387
7388Creates a new SV which is an exact duplicate of the original SV.
645c22ef 7389(Uses C<sv_setsv>).
954c1994
GS
7390
7391=cut
7392*/
7393
79072805 7394SV *
864dbfa3 7395Perl_newSVsv(pTHX_ register SV *old)
79072805 7396{
97aff369 7397 dVAR;
463ee0b2 7398 register SV *sv;
79072805
LW
7399
7400 if (!old)
7a5b473e 7401 return NULL;
8990e307 7402 if (SvTYPE(old) == SVTYPEMASK) {
0453d815 7403 if (ckWARN_d(WARN_INTERNAL))
9014280d 7404 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
a0714e2c 7405 return NULL;
79072805 7406 }
4561caa4 7407 new_SV(sv);
e90aabeb
NC
7408 /* SV_GMAGIC is the default for sv_setv()
7409 SV_NOSTEAL prevents TEMP buffers being, well, stolen, and saves games
7410 with SvTEMP_off and SvTEMP_on round a call to sv_setsv. */
7411 sv_setsv_flags(sv, old, SV_GMAGIC | SV_NOSTEAL);
463ee0b2 7412 return sv;
79072805
LW
7413}
7414
645c22ef
DM
7415/*
7416=for apidoc sv_reset
7417
7418Underlying implementation for the C<reset> Perl function.
7419Note that the perl-level function is vaguely deprecated.
7420
7421=cut
7422*/
7423
79072805 7424void
e1ec3a88 7425Perl_sv_reset(pTHX_ register const char *s, HV *stash)
79072805 7426{
27da23d5 7427 dVAR;
4802d5d7 7428 char todo[PERL_UCHAR_MAX+1];
79072805 7429
49d8d3a1
MB
7430 if (!stash)
7431 return;
7432
79072805 7433 if (!*s) { /* reset ?? searches */
aec46f14 7434 MAGIC * const mg = mg_find((SV *)stash, PERL_MAGIC_symtab);
8d2f4536 7435 if (mg) {
c2b1997a
NC
7436 const U32 count = mg->mg_len / sizeof(PMOP**);
7437 PMOP **pmp = (PMOP**) mg->mg_ptr;
7438 PMOP *const *const end = pmp + count;
7439
7440 while (pmp < end) {
c737faaf 7441#ifdef USE_ITHREADS
c2b1997a 7442 SvREADONLY_off(PL_regex_pad[(*pmp)->op_pmoffset]);
c737faaf 7443#else
c2b1997a 7444 (*pmp)->op_pmflags &= ~PMf_USED;
c737faaf 7445#endif
c2b1997a 7446 ++pmp;
8d2f4536 7447 }
79072805
LW
7448 }
7449 return;
7450 }
7451
7452 /* reset variables */
7453
7454 if (!HvARRAY(stash))
7455 return;
463ee0b2
LW
7456
7457 Zero(todo, 256, char);
79072805 7458 while (*s) {
b464bac0
AL
7459 I32 max;
7460 I32 i = (unsigned char)*s;
79072805
LW
7461 if (s[1] == '-') {
7462 s += 2;
7463 }
4802d5d7 7464 max = (unsigned char)*s++;
79072805 7465 for ( ; i <= max; i++) {
463ee0b2
LW
7466 todo[i] = 1;
7467 }
a0d0e21e 7468 for (i = 0; i <= (I32) HvMAX(stash); i++) {
b464bac0 7469 HE *entry;
79072805 7470 for (entry = HvARRAY(stash)[i];
9e35f4b3
GS
7471 entry;
7472 entry = HeNEXT(entry))
7473 {
b464bac0
AL
7474 register GV *gv;
7475 register SV *sv;
7476
1edc1566 7477 if (!todo[(U8)*HeKEY(entry)])
463ee0b2 7478 continue;
1edc1566 7479 gv = (GV*)HeVAL(entry);
79072805 7480 sv = GvSV(gv);
e203899d
NC
7481 if (sv) {
7482 if (SvTHINKFIRST(sv)) {
7483 if (!SvREADONLY(sv) && SvROK(sv))
7484 sv_unref(sv);
7485 /* XXX Is this continue a bug? Why should THINKFIRST
7486 exempt us from resetting arrays and hashes? */
7487 continue;
7488 }
7489 SvOK_off(sv);
7490 if (SvTYPE(sv) >= SVt_PV) {
7491 SvCUR_set(sv, 0);
bd61b366 7492 if (SvPVX_const(sv) != NULL)
e203899d
NC
7493 *SvPVX(sv) = '\0';
7494 SvTAINT(sv);
7495 }
79072805
LW
7496 }
7497 if (GvAV(gv)) {
7498 av_clear(GvAV(gv));
7499 }
bfcb3514 7500 if (GvHV(gv) && !HvNAME_get(GvHV(gv))) {
b0269e46
AB
7501#if defined(VMS)
7502 Perl_die(aTHX_ "Can't reset %%ENV on this system");
7503#else /* ! VMS */
463ee0b2 7504 hv_clear(GvHV(gv));
b0269e46
AB
7505# if defined(USE_ENVIRON_ARRAY)
7506 if (gv == PL_envgv)
7507 my_clearenv();
7508# endif /* USE_ENVIRON_ARRAY */
7509#endif /* VMS */
79072805
LW
7510 }
7511 }
7512 }
7513 }
7514}
7515
645c22ef
DM
7516/*
7517=for apidoc sv_2io
7518
7519Using various gambits, try to get an IO from an SV: the IO slot if its a
7520GV; or the recursive result if we're an RV; or the IO slot of the symbol
7521named after the PV if we're a string.
7522
7523=cut
7524*/
7525
46fc3d4c 7526IO*
864dbfa3 7527Perl_sv_2io(pTHX_ SV *sv)
46fc3d4c 7528{
7529 IO* io;
7530 GV* gv;
7531
7532 switch (SvTYPE(sv)) {
7533 case SVt_PVIO:
7534 io = (IO*)sv;
7535 break;
7536 case SVt_PVGV:
7537 gv = (GV*)sv;
7538 io = GvIO(gv);
7539 if (!io)
cea2e8a9 7540 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
46fc3d4c 7541 break;
7542 default:
7543 if (!SvOK(sv))
cea2e8a9 7544 Perl_croak(aTHX_ PL_no_usym, "filehandle");
46fc3d4c 7545 if (SvROK(sv))
7546 return sv_2io(SvRV(sv));
f776e3cd 7547 gv = gv_fetchsv(sv, 0, SVt_PVIO);
46fc3d4c 7548 if (gv)
7549 io = GvIO(gv);
7550 else
7551 io = 0;
7552 if (!io)
be2597df 7553 Perl_croak(aTHX_ "Bad filehandle: %"SVf, SVfARG(sv));
46fc3d4c 7554 break;
7555 }
7556 return io;
7557}
7558
645c22ef
DM
7559/*
7560=for apidoc sv_2cv
7561
7562Using various gambits, try to get a CV from an SV; in addition, try if
7563possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
f2c0649b 7564The flags in C<lref> are passed to sv_fetchsv.
645c22ef
DM
7565
7566=cut
7567*/
7568
79072805 7569CV *
864dbfa3 7570Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
79072805 7571{
27da23d5 7572 dVAR;
a0714e2c 7573 GV *gv = NULL;
601f1833 7574 CV *cv = NULL;
79072805 7575
85dec29a
NC
7576 if (!sv) {
7577 *st = NULL;
7578 *gvp = NULL;
7579 return NULL;
7580 }
79072805 7581 switch (SvTYPE(sv)) {
79072805
LW
7582 case SVt_PVCV:
7583 *st = CvSTASH(sv);
a0714e2c 7584 *gvp = NULL;
79072805
LW
7585 return (CV*)sv;
7586 case SVt_PVHV:
7587 case SVt_PVAV:
ef58ba18 7588 *st = NULL;
a0714e2c 7589 *gvp = NULL;
601f1833 7590 return NULL;
8990e307
LW
7591 case SVt_PVGV:
7592 gv = (GV*)sv;
a0d0e21e 7593 *gvp = gv;
8990e307
LW
7594 *st = GvESTASH(gv);
7595 goto fix_gv;
7596
79072805 7597 default:
5b295bef 7598 SvGETMAGIC(sv);
a0d0e21e 7599 if (SvROK(sv)) {
823a54a3 7600 SV * const *sp = &sv; /* Used in tryAMAGICunDEREF macro. */
f5284f61
IZ
7601 tryAMAGICunDEREF(to_cv);
7602
62f274bf
GS
7603 sv = SvRV(sv);
7604 if (SvTYPE(sv) == SVt_PVCV) {
7605 cv = (CV*)sv;
a0714e2c 7606 *gvp = NULL;
62f274bf
GS
7607 *st = CvSTASH(cv);
7608 return cv;
7609 }
7610 else if(isGV(sv))
7611 gv = (GV*)sv;
7612 else
cea2e8a9 7613 Perl_croak(aTHX_ "Not a subroutine reference");
a0d0e21e 7614 }
62f274bf 7615 else if (isGV(sv))
79072805
LW
7616 gv = (GV*)sv;
7617 else
7a5fd60d 7618 gv = gv_fetchsv(sv, lref, SVt_PVCV);
79072805 7619 *gvp = gv;
ef58ba18
NC
7620 if (!gv) {
7621 *st = NULL;
601f1833 7622 return NULL;
ef58ba18 7623 }
e26df76a
NC
7624 /* Some flags to gv_fetchsv mean don't really create the GV */
7625 if (SvTYPE(gv) != SVt_PVGV) {
7626 *st = NULL;
7627 return NULL;
7628 }
79072805 7629 *st = GvESTASH(gv);
8990e307 7630 fix_gv:
8ebc5c01 7631 if (lref && !GvCVu(gv)) {
4633a7c4 7632 SV *tmpsv;
748a9306 7633 ENTER;
561b68a9 7634 tmpsv = newSV(0);
bd61b366 7635 gv_efullname3(tmpsv, gv, NULL);
f6ec51f7
GS
7636 /* XXX this is probably not what they think they're getting.
7637 * It has the same effect as "sub name;", i.e. just a forward
7638 * declaration! */
774d564b 7639 newSUB(start_subparse(FALSE, 0),
4633a7c4 7640 newSVOP(OP_CONST, 0, tmpsv),
5f66b61c 7641 NULL, NULL);
748a9306 7642 LEAVE;
8ebc5c01 7643 if (!GvCVu(gv))
35c1215d 7644 Perl_croak(aTHX_ "Unable to create sub named \"%"SVf"\"",
be2597df 7645 SVfARG(sv));
8990e307 7646 }
8ebc5c01 7647 return GvCVu(gv);
79072805
LW
7648 }
7649}
7650
c461cf8f
JH
7651/*
7652=for apidoc sv_true
7653
7654Returns true if the SV has a true value by Perl's rules.
645c22ef
DM
7655Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
7656instead use an in-line version.
c461cf8f
JH
7657
7658=cut
7659*/
7660
79072805 7661I32
864dbfa3 7662Perl_sv_true(pTHX_ register SV *sv)
79072805 7663{
8990e307
LW
7664 if (!sv)
7665 return 0;
79072805 7666 if (SvPOK(sv)) {
823a54a3
AL
7667 register const XPV* const tXpv = (XPV*)SvANY(sv);
7668 if (tXpv &&
c2f1de04 7669 (tXpv->xpv_cur > 1 ||
339049b0 7670 (tXpv->xpv_cur && *sv->sv_u.svu_pv != '0')))
79072805
LW
7671 return 1;
7672 else
7673 return 0;
7674 }
7675 else {
7676 if (SvIOK(sv))
463ee0b2 7677 return SvIVX(sv) != 0;
79072805
LW
7678 else {
7679 if (SvNOK(sv))
463ee0b2 7680 return SvNVX(sv) != 0.0;
79072805 7681 else
463ee0b2 7682 return sv_2bool(sv);
79072805
LW
7683 }
7684 }
7685}
79072805 7686
645c22ef 7687/*
c461cf8f
JH
7688=for apidoc sv_pvn_force
7689
7690Get a sensible string out of the SV somehow.
645c22ef
DM
7691A private implementation of the C<SvPV_force> macro for compilers which
7692can't cope with complex macro expressions. Always use the macro instead.
c461cf8f 7693
8d6d96c1
HS
7694=for apidoc sv_pvn_force_flags
7695
7696Get a sensible string out of the SV somehow.
7697If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
7698appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
7699implemented in terms of this function.
645c22ef
DM
7700You normally want to use the various wrapper macros instead: see
7701C<SvPV_force> and C<SvPV_force_nomg>
8d6d96c1
HS
7702
7703=cut
7704*/
7705
7706char *
7707Perl_sv_pvn_force_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
7708{
97aff369 7709 dVAR;
6fc92669 7710 if (SvTHINKFIRST(sv) && !SvROK(sv))
765f542d 7711 sv_force_normal_flags(sv, 0);
1c846c1f 7712
a0d0e21e 7713 if (SvPOK(sv)) {
13c5b33c
NC
7714 if (lp)
7715 *lp = SvCUR(sv);
a0d0e21e
LW
7716 }
7717 else {
a3b680e6 7718 char *s;
13c5b33c
NC
7719 STRLEN len;
7720
4d84ee25 7721 if (SvREADONLY(sv) && !(flags & SV_MUTABLE_RETURN)) {
b64e5050 7722 const char * const ref = sv_reftype(sv,0);
4d84ee25
NC
7723 if (PL_op)
7724 Perl_croak(aTHX_ "Can't coerce readonly %s to string in %s",
b64e5050 7725 ref, OP_NAME(PL_op));
4d84ee25 7726 else
b64e5050 7727 Perl_croak(aTHX_ "Can't coerce readonly %s to string", ref);
4d84ee25 7728 }
1f257c95
NC
7729 if ((SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM)
7730 || isGV_with_GP(sv))
cea2e8a9 7731 Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
53e06cf0 7732 OP_NAME(PL_op));
b64e5050 7733 s = sv_2pv_flags(sv, &len, flags);
13c5b33c
NC
7734 if (lp)
7735 *lp = len;
7736
3f7c398e 7737 if (s != SvPVX_const(sv)) { /* Almost, but not quite, sv_setpvn() */
a0d0e21e
LW
7738 if (SvROK(sv))
7739 sv_unref(sv);
862a34c6 7740 SvUPGRADE(sv, SVt_PV); /* Never FALSE */
a0d0e21e 7741 SvGROW(sv, len + 1);
706aa1c9 7742 Move(s,SvPVX(sv),len,char);
a0d0e21e 7743 SvCUR_set(sv, len);
97a130b8 7744 SvPVX(sv)[len] = '\0';
a0d0e21e
LW
7745 }
7746 if (!SvPOK(sv)) {
7747 SvPOK_on(sv); /* validate pointer */
7748 SvTAINT(sv);
1d7c1841 7749 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3f7c398e 7750 PTR2UV(sv),SvPVX_const(sv)));
a0d0e21e
LW
7751 }
7752 }
4d84ee25 7753 return SvPVX_mutable(sv);
a0d0e21e
LW
7754}
7755
645c22ef 7756/*
645c22ef
DM
7757=for apidoc sv_pvbyten_force
7758
0feed65a 7759The backend for the C<SvPVbytex_force> macro. Always use the macro instead.
645c22ef
DM
7760
7761=cut
7762*/
7763
7340a771
GS
7764char *
7765Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
7766{
46ec2f14 7767 sv_pvn_force(sv,lp);
ffebcc3e 7768 sv_utf8_downgrade(sv,0);
46ec2f14
TS
7769 *lp = SvCUR(sv);
7770 return SvPVX(sv);
7340a771
GS
7771}
7772
645c22ef 7773/*
c461cf8f
JH
7774=for apidoc sv_pvutf8n_force
7775
0feed65a 7776The backend for the C<SvPVutf8x_force> macro. Always use the macro instead.
c461cf8f
JH
7777
7778=cut
7779*/
7780
7340a771
GS
7781char *
7782Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
7783{
46ec2f14 7784 sv_pvn_force(sv,lp);
560a288e 7785 sv_utf8_upgrade(sv);
46ec2f14
TS
7786 *lp = SvCUR(sv);
7787 return SvPVX(sv);
7340a771
GS
7788}
7789
c461cf8f
JH
7790/*
7791=for apidoc sv_reftype
7792
7793Returns a string describing what the SV is a reference to.
7794
7795=cut
7796*/
7797
2b388283 7798const char *
bfed75c6 7799Perl_sv_reftype(pTHX_ const SV *sv, int ob)
a0d0e21e 7800{
07409e01
NC
7801 /* The fact that I don't need to downcast to char * everywhere, only in ?:
7802 inside return suggests a const propagation bug in g++. */
c86bf373 7803 if (ob && SvOBJECT(sv)) {
1b6737cc 7804 char * const name = HvNAME_get(SvSTASH(sv));
07409e01 7805 return name ? name : (char *) "__ANON__";
c86bf373 7806 }
a0d0e21e
LW
7807 else {
7808 switch (SvTYPE(sv)) {
7809 case SVt_NULL:
7810 case SVt_IV:
7811 case SVt_NV:
a0d0e21e
LW
7812 case SVt_PV:
7813 case SVt_PVIV:
7814 case SVt_PVNV:
7815 case SVt_PVMG:
1cb0ed9b 7816 if (SvVOK(sv))
439cb1c4 7817 return "VSTRING";
a0d0e21e
LW
7818 if (SvROK(sv))
7819 return "REF";
7820 else
7821 return "SCALAR";
1cb0ed9b 7822
07409e01 7823 case SVt_PVLV: return (char *) (SvROK(sv) ? "REF"
be65207d
DM
7824 /* tied lvalues should appear to be
7825 * scalars for backwards compatitbility */
7826 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
07409e01 7827 ? "SCALAR" : "LVALUE");
a0d0e21e
LW
7828 case SVt_PVAV: return "ARRAY";
7829 case SVt_PVHV: return "HASH";
7830 case SVt_PVCV: return "CODE";
7831 case SVt_PVGV: return "GLOB";
1d2dff63 7832 case SVt_PVFM: return "FORMAT";
27f9d8f3 7833 case SVt_PVIO: return "IO";
cecf5685 7834 case SVt_BIND: return "BIND";
5c35adbb 7835 case SVt_REGEXP: return "Regexp"; /* FIXME? to "REGEXP" */
a0d0e21e
LW
7836 default: return "UNKNOWN";
7837 }
7838 }
7839}
7840
954c1994
GS
7841/*
7842=for apidoc sv_isobject
7843
7844Returns a boolean indicating whether the SV is an RV pointing to a blessed
7845object. If the SV is not an RV, or if the object is not blessed, then this
7846will return false.
7847
7848=cut
7849*/
7850
463ee0b2 7851int
864dbfa3 7852Perl_sv_isobject(pTHX_ SV *sv)
85e6fe83 7853{
68dc0745 7854 if (!sv)
7855 return 0;
5b295bef 7856 SvGETMAGIC(sv);
85e6fe83
LW
7857 if (!SvROK(sv))
7858 return 0;
7859 sv = (SV*)SvRV(sv);
7860 if (!SvOBJECT(sv))
7861 return 0;
7862 return 1;
7863}
7864
954c1994
GS
7865/*
7866=for apidoc sv_isa
7867
7868Returns a boolean indicating whether the SV is blessed into the specified
7869class. This does not check for subtypes; use C<sv_derived_from> to verify
7870an inheritance relationship.
7871
7872=cut
7873*/
7874
85e6fe83 7875int
864dbfa3 7876Perl_sv_isa(pTHX_ SV *sv, const char *name)
463ee0b2 7877{
bfcb3514 7878 const char *hvname;
68dc0745 7879 if (!sv)
7880 return 0;
5b295bef 7881 SvGETMAGIC(sv);
ed6116ce 7882 if (!SvROK(sv))
463ee0b2 7883 return 0;
ed6116ce
LW
7884 sv = (SV*)SvRV(sv);
7885 if (!SvOBJECT(sv))
463ee0b2 7886 return 0;
bfcb3514
NC
7887 hvname = HvNAME_get(SvSTASH(sv));
7888 if (!hvname)
e27ad1f2 7889 return 0;
463ee0b2 7890
bfcb3514 7891 return strEQ(hvname, name);
463ee0b2
LW
7892}
7893
954c1994
GS
7894/*
7895=for apidoc newSVrv
7896
7897Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
7898it will be upgraded to one. If C<classname> is non-null then the new SV will
7899be blessed in the specified package. The new SV is returned and its
7900reference count is 1.
7901
7902=cut
7903*/
7904
463ee0b2 7905SV*
864dbfa3 7906Perl_newSVrv(pTHX_ SV *rv, const char *classname)
463ee0b2 7907{
97aff369 7908 dVAR;
463ee0b2
LW
7909 SV *sv;
7910
4561caa4 7911 new_SV(sv);
51cf62d8 7912
765f542d 7913 SV_CHECK_THINKFIRST_COW_DROP(rv);
52944de8 7914 (void)SvAMAGIC_off(rv);
51cf62d8 7915
0199fce9 7916 if (SvTYPE(rv) >= SVt_PVMG) {
a3b680e6 7917 const U32 refcnt = SvREFCNT(rv);
0199fce9
JD
7918 SvREFCNT(rv) = 0;
7919 sv_clear(rv);
7920 SvFLAGS(rv) = 0;
7921 SvREFCNT(rv) = refcnt;
0199fce9 7922
4df7f6af 7923 sv_upgrade(rv, SVt_IV);
dc5494d2
NC
7924 } else if (SvROK(rv)) {
7925 SvREFCNT_dec(SvRV(rv));
43230e26
NC
7926 } else {
7927 prepare_SV_for_RV(rv);
0199fce9 7928 }
51cf62d8 7929
0c34ef67 7930 SvOK_off(rv);
b162af07 7931 SvRV_set(rv, sv);
ed6116ce 7932 SvROK_on(rv);
463ee0b2 7933
a0d0e21e 7934 if (classname) {
da51bb9b 7935 HV* const stash = gv_stashpv(classname, GV_ADD);
a0d0e21e
LW
7936 (void)sv_bless(rv, stash);
7937 }
7938 return sv;
7939}
7940
954c1994
GS
7941/*
7942=for apidoc sv_setref_pv
7943
7944Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
7945argument will be upgraded to an RV. That RV will be modified to point to
7946the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
7947into the SV. The C<classname> argument indicates the package for the
bd61b366 7948blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 7949will have a reference count of 1, and the RV will be returned.
954c1994
GS
7950
7951Do not use with other Perl types such as HV, AV, SV, CV, because those
7952objects will become corrupted by the pointer copy process.
7953
7954Note that C<sv_setref_pvn> copies the string while this copies the pointer.
7955
7956=cut
7957*/
7958
a0d0e21e 7959SV*
864dbfa3 7960Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
a0d0e21e 7961{
97aff369 7962 dVAR;
189b2af5 7963 if (!pv) {
3280af22 7964 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
7965 SvSETMAGIC(rv);
7966 }
a0d0e21e 7967 else
56431972 7968 sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
a0d0e21e
LW
7969 return rv;
7970}
7971
954c1994
GS
7972/*
7973=for apidoc sv_setref_iv
7974
7975Copies an integer into a new SV, optionally blessing the SV. The C<rv>
7976argument will be upgraded to an RV. That RV will be modified to point to
7977the new SV. The C<classname> argument indicates the package for the
bd61b366 7978blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 7979will have a reference count of 1, and the RV will be returned.
954c1994
GS
7980
7981=cut
7982*/
7983
a0d0e21e 7984SV*
864dbfa3 7985Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
a0d0e21e
LW
7986{
7987 sv_setiv(newSVrv(rv,classname), iv);
7988 return rv;
7989}
7990
954c1994 7991/*
e1c57cef
JH
7992=for apidoc sv_setref_uv
7993
7994Copies an unsigned integer into a new SV, optionally blessing the SV. The C<rv>
7995argument will be upgraded to an RV. That RV will be modified to point to
7996the new SV. The C<classname> argument indicates the package for the
bd61b366 7997blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 7998will have a reference count of 1, and the RV will be returned.
e1c57cef
JH
7999
8000=cut
8001*/
8002
8003SV*
8004Perl_sv_setref_uv(pTHX_ SV *rv, const char *classname, UV uv)
8005{
8006 sv_setuv(newSVrv(rv,classname), uv);
8007 return rv;
8008}
8009
8010/*
954c1994
GS
8011=for apidoc sv_setref_nv
8012
8013Copies a double into a new SV, optionally blessing the SV. The C<rv>
8014argument will be upgraded to an RV. That RV will be modified to point to
8015the new SV. The C<classname> argument indicates the package for the
bd61b366 8016blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 8017will have a reference count of 1, and the RV will be returned.
954c1994
GS
8018
8019=cut
8020*/
8021
a0d0e21e 8022SV*
65202027 8023Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
a0d0e21e
LW
8024{
8025 sv_setnv(newSVrv(rv,classname), nv);
8026 return rv;
8027}
463ee0b2 8028
954c1994
GS
8029/*
8030=for apidoc sv_setref_pvn
8031
8032Copies a string into a new SV, optionally blessing the SV. The length of the
8033string must be specified with C<n>. The C<rv> argument will be upgraded to
8034an RV. That RV will be modified to point to the new SV. The C<classname>
8035argument indicates the package for the blessing. Set C<classname> to
bd61b366 8036C<NULL> to avoid the blessing. The new SV will have a reference count
d34c2299 8037of 1, and the RV will be returned.
954c1994
GS
8038
8039Note that C<sv_setref_pv> copies the pointer while this copies the string.
8040
8041=cut
8042*/
8043
a0d0e21e 8044SV*
1b6737cc 8045Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, const char *pv, STRLEN n)
a0d0e21e
LW
8046{
8047 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
8048 return rv;
8049}
8050
954c1994
GS
8051/*
8052=for apidoc sv_bless
8053
8054Blesses an SV into a specified package. The SV must be an RV. The package
8055must be designated by its stash (see C<gv_stashpv()>). The reference count
8056of the SV is unaffected.
8057
8058=cut
8059*/
8060
a0d0e21e 8061SV*
864dbfa3 8062Perl_sv_bless(pTHX_ SV *sv, HV *stash)
a0d0e21e 8063{
97aff369 8064 dVAR;
76e3520e 8065 SV *tmpRef;
a0d0e21e 8066 if (!SvROK(sv))
cea2e8a9 8067 Perl_croak(aTHX_ "Can't bless non-reference value");
76e3520e
GS
8068 tmpRef = SvRV(sv);
8069 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
e0744413
NC
8070 if (SvIsCOW(tmpRef))
8071 sv_force_normal_flags(tmpRef, 0);
76e3520e 8072 if (SvREADONLY(tmpRef))
cea2e8a9 8073 Perl_croak(aTHX_ PL_no_modify);
76e3520e
GS
8074 if (SvOBJECT(tmpRef)) {
8075 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 8076 --PL_sv_objcount;
76e3520e 8077 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 8078 }
a0d0e21e 8079 }
76e3520e
GS
8080 SvOBJECT_on(tmpRef);
8081 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 8082 ++PL_sv_objcount;
862a34c6 8083 SvUPGRADE(tmpRef, SVt_PVMG);
b37c2d43 8084 SvSTASH_set(tmpRef, (HV*)SvREFCNT_inc_simple(stash));
a0d0e21e 8085
2e3febc6
CS
8086 if (Gv_AMG(stash))
8087 SvAMAGIC_on(sv);
8088 else
52944de8 8089 (void)SvAMAGIC_off(sv);
a0d0e21e 8090
1edbfb88
AB
8091 if(SvSMAGICAL(tmpRef))
8092 if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
8093 mg_set(tmpRef);
8094
8095
ecdeb87c 8096
a0d0e21e
LW
8097 return sv;
8098}
8099
645c22ef 8100/* Downgrades a PVGV to a PVMG.
645c22ef
DM
8101 */
8102
76e3520e 8103STATIC void
cea2e8a9 8104S_sv_unglob(pTHX_ SV *sv)
a0d0e21e 8105{
97aff369 8106 dVAR;
850fabdf 8107 void *xpvmg;
dd69841b 8108 HV *stash;
b37c2d43 8109 SV * const temp = sv_newmortal();
850fabdf 8110
a0d0e21e
LW
8111 assert(SvTYPE(sv) == SVt_PVGV);
8112 SvFAKE_off(sv);
180488f8
NC
8113 gv_efullname3(temp, (GV *) sv, "*");
8114
f7877b28 8115 if (GvGP(sv)) {
dd69841b
BB
8116 if(GvCVu((GV*)sv) && (stash = GvSTASH((GV*)sv)) && HvNAME_get(stash))
8117 mro_method_changed_in(stash);
1edc1566 8118 gp_free((GV*)sv);
f7877b28 8119 }
e826b3c7 8120 if (GvSTASH(sv)) {
e15faf7d 8121 sv_del_backref((SV*)GvSTASH(sv), sv);
5c284bb0 8122 GvSTASH(sv) = NULL;
e826b3c7 8123 }
a5f75d66 8124 GvMULTI_off(sv);
acda4c6a
NC
8125 if (GvNAME_HEK(sv)) {
8126 unshare_hek(GvNAME_HEK(sv));
8127 }
2e5b91de 8128 isGV_with_GP_off(sv);
850fabdf
GS
8129
8130 /* need to keep SvANY(sv) in the right arena */
8131 xpvmg = new_XPVMG();
8132 StructCopy(SvANY(sv), xpvmg, XPVMG);
8133 del_XPVGV(SvANY(sv));
8134 SvANY(sv) = xpvmg;
8135
a0d0e21e
LW
8136 SvFLAGS(sv) &= ~SVTYPEMASK;
8137 SvFLAGS(sv) |= SVt_PVMG;
180488f8
NC
8138
8139 /* Intentionally not calling any local SET magic, as this isn't so much a
8140 set operation as merely an internal storage change. */
8141 sv_setsv_flags(sv, temp, 0);
a0d0e21e
LW
8142}
8143
954c1994 8144/*
840a7b70 8145=for apidoc sv_unref_flags
954c1994
GS
8146
8147Unsets the RV status of the SV, and decrements the reference count of
8148whatever was being referenced by the RV. This can almost be thought of
840a7b70
IZ
8149as a reversal of C<newSVrv>. The C<cflags> argument can contain
8150C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
8151(otherwise the decrementing is conditional on the reference count being
8152different from one or the reference being a readonly SV).
7889fe52 8153See C<SvROK_off>.
954c1994
GS
8154
8155=cut
8156*/
8157
ed6116ce 8158void
e15faf7d 8159Perl_sv_unref_flags(pTHX_ SV *ref, U32 flags)
ed6116ce 8160{
b64e5050 8161 SV* const target = SvRV(ref);
810b8aa5 8162
e15faf7d
NC
8163 if (SvWEAKREF(ref)) {
8164 sv_del_backref(target, ref);
8165 SvWEAKREF_off(ref);
8166 SvRV_set(ref, NULL);
810b8aa5
GS
8167 return;
8168 }
e15faf7d
NC
8169 SvRV_set(ref, NULL);
8170 SvROK_off(ref);
8171 /* You can't have a || SvREADONLY(target) here, as $a = $$a, where $a was
04ca4930 8172 assigned to as BEGIN {$a = \"Foo"} will fail. */
e15faf7d
NC
8173 if (SvREFCNT(target) != 1 || (flags & SV_IMMEDIATE_UNREF))
8174 SvREFCNT_dec(target);
840a7b70 8175 else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
e15faf7d 8176 sv_2mortal(target); /* Schedule for freeing later */
ed6116ce 8177}
8990e307 8178
840a7b70 8179/*
645c22ef
DM
8180=for apidoc sv_untaint
8181
8182Untaint an SV. Use C<SvTAINTED_off> instead.
8183=cut
8184*/
8185
bbce6d69 8186void
864dbfa3 8187Perl_sv_untaint(pTHX_ SV *sv)
bbce6d69 8188{
13f57bf8 8189 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
b64e5050 8190 MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
36477c24 8191 if (mg)
565764a8 8192 mg->mg_len &= ~1;
36477c24 8193 }
bbce6d69 8194}
8195
645c22ef
DM
8196/*
8197=for apidoc sv_tainted
8198
8199Test an SV for taintedness. Use C<SvTAINTED> instead.
8200=cut
8201*/
8202
bbce6d69 8203bool
864dbfa3 8204Perl_sv_tainted(pTHX_ SV *sv)
bbce6d69 8205{
13f57bf8 8206 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
823a54a3 8207 const MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
2ddb8a4f 8208 if (mg && (mg->mg_len & 1) )
36477c24 8209 return TRUE;
8210 }
8211 return FALSE;
bbce6d69 8212}
8213
09540bc3
JH
8214/*
8215=for apidoc sv_setpviv
8216
8217Copies an integer into the given SV, also updating its string value.
8218Does not handle 'set' magic. See C<sv_setpviv_mg>.
8219
8220=cut
8221*/
8222
8223void
8224Perl_sv_setpviv(pTHX_ SV *sv, IV iv)
8225{
8226 char buf[TYPE_CHARS(UV)];
8227 char *ebuf;
b64e5050 8228 char * const ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
09540bc3
JH
8229
8230 sv_setpvn(sv, ptr, ebuf - ptr);
8231}
8232
8233/*
8234=for apidoc sv_setpviv_mg
8235
8236Like C<sv_setpviv>, but also handles 'set' magic.
8237
8238=cut
8239*/
8240
8241void
8242Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv)
8243{
df7eb254 8244 sv_setpviv(sv, iv);
09540bc3
JH
8245 SvSETMAGIC(sv);
8246}
8247
cea2e8a9 8248#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8249
8250/* pTHX_ magic can't cope with varargs, so this is a no-context
8251 * version of the main function, (which may itself be aliased to us).
8252 * Don't access this version directly.
8253 */
8254
cea2e8a9
GS
8255void
8256Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
8257{
8258 dTHX;
8259 va_list args;
8260 va_start(args, pat);
c5be433b 8261 sv_vsetpvf(sv, pat, &args);
cea2e8a9
GS
8262 va_end(args);
8263}
8264
645c22ef
DM
8265/* pTHX_ magic can't cope with varargs, so this is a no-context
8266 * version of the main function, (which may itself be aliased to us).
8267 * Don't access this version directly.
8268 */
cea2e8a9
GS
8269
8270void
8271Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
8272{
8273 dTHX;
8274 va_list args;
8275 va_start(args, pat);
c5be433b 8276 sv_vsetpvf_mg(sv, pat, &args);
cea2e8a9 8277 va_end(args);
cea2e8a9
GS
8278}
8279#endif
8280
954c1994
GS
8281/*
8282=for apidoc sv_setpvf
8283
bffc3d17
SH
8284Works like C<sv_catpvf> but copies the text into the SV instead of
8285appending it. Does not handle 'set' magic. See C<sv_setpvf_mg>.
954c1994
GS
8286
8287=cut
8288*/
8289
46fc3d4c 8290void
864dbfa3 8291Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 8292{
8293 va_list args;
46fc3d4c 8294 va_start(args, pat);
c5be433b 8295 sv_vsetpvf(sv, pat, &args);
46fc3d4c 8296 va_end(args);
8297}
8298
bffc3d17
SH
8299/*
8300=for apidoc sv_vsetpvf
8301
8302Works like C<sv_vcatpvf> but copies the text into the SV instead of
8303appending it. Does not handle 'set' magic. See C<sv_vsetpvf_mg>.
8304
8305Usually used via its frontend C<sv_setpvf>.
8306
8307=cut
8308*/
645c22ef 8309
c5be433b
GS
8310void
8311Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
8312{
4608196e 8313 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
c5be433b 8314}
ef50df4b 8315
954c1994
GS
8316/*
8317=for apidoc sv_setpvf_mg
8318
8319Like C<sv_setpvf>, but also handles 'set' magic.
8320
8321=cut
8322*/
8323
ef50df4b 8324void
864dbfa3 8325Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
8326{
8327 va_list args;
ef50df4b 8328 va_start(args, pat);
c5be433b 8329 sv_vsetpvf_mg(sv, pat, &args);
ef50df4b 8330 va_end(args);
c5be433b
GS
8331}
8332
bffc3d17
SH
8333/*
8334=for apidoc sv_vsetpvf_mg
8335
8336Like C<sv_vsetpvf>, but also handles 'set' magic.
8337
8338Usually used via its frontend C<sv_setpvf_mg>.
8339
8340=cut
8341*/
645c22ef 8342
c5be433b
GS
8343void
8344Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
8345{
4608196e 8346 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
ef50df4b
GS
8347 SvSETMAGIC(sv);
8348}
8349
cea2e8a9 8350#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8351
8352/* pTHX_ magic can't cope with varargs, so this is a no-context
8353 * version of the main function, (which may itself be aliased to us).
8354 * Don't access this version directly.
8355 */
8356
cea2e8a9
GS
8357void
8358Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
8359{
8360 dTHX;
8361 va_list args;
8362 va_start(args, pat);
c5be433b 8363 sv_vcatpvf(sv, pat, &args);
cea2e8a9
GS
8364 va_end(args);
8365}
8366
645c22ef
DM
8367/* pTHX_ magic can't cope with varargs, so this is a no-context
8368 * version of the main function, (which may itself be aliased to us).
8369 * Don't access this version directly.
8370 */
8371
cea2e8a9
GS
8372void
8373Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
8374{
8375 dTHX;
8376 va_list args;
8377 va_start(args, pat);
c5be433b 8378 sv_vcatpvf_mg(sv, pat, &args);
cea2e8a9 8379 va_end(args);
cea2e8a9
GS
8380}
8381#endif
8382
954c1994
GS
8383/*
8384=for apidoc sv_catpvf
8385
d5ce4a7c
GA
8386Processes its arguments like C<sprintf> and appends the formatted
8387output to an SV. If the appended data contains "wide" characters
8388(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
8389and characters >255 formatted with %c), the original SV might get
bffc3d17 8390upgraded to UTF-8. Handles 'get' magic, but not 'set' magic. See
cdd94ca7
NC
8391C<sv_catpvf_mg>. If the original SV was UTF-8, the pattern should be
8392valid UTF-8; if the original SV was bytes, the pattern should be too.
954c1994 8393
d5ce4a7c 8394=cut */
954c1994 8395
46fc3d4c 8396void
864dbfa3 8397Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 8398{
8399 va_list args;
46fc3d4c 8400 va_start(args, pat);
c5be433b 8401 sv_vcatpvf(sv, pat, &args);
46fc3d4c 8402 va_end(args);
8403}
8404
bffc3d17
SH
8405/*
8406=for apidoc sv_vcatpvf
8407
8408Processes its arguments like C<vsprintf> and appends the formatted output
8409to an SV. Does not handle 'set' magic. See C<sv_vcatpvf_mg>.
8410
8411Usually used via its frontend C<sv_catpvf>.
8412
8413=cut
8414*/
645c22ef 8415
ef50df4b 8416void
c5be433b
GS
8417Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
8418{
4608196e 8419 sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
c5be433b
GS
8420}
8421
954c1994
GS
8422/*
8423=for apidoc sv_catpvf_mg
8424
8425Like C<sv_catpvf>, but also handles 'set' magic.
8426
8427=cut
8428*/
8429
c5be433b 8430void
864dbfa3 8431Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
8432{
8433 va_list args;
ef50df4b 8434 va_start(args, pat);
c5be433b 8435 sv_vcatpvf_mg(sv, pat, &args);
ef50df4b 8436 va_end(args);
c5be433b
GS
8437}
8438
bffc3d17
SH
8439/*
8440=for apidoc sv_vcatpvf_mg
8441
8442Like C<sv_vcatpvf>, but also handles 'set' magic.
8443
8444Usually used via its frontend C<sv_catpvf_mg>.
8445
8446=cut
8447*/
645c22ef 8448
c5be433b
GS
8449void
8450Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
8451{
4608196e 8452 sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
ef50df4b
GS
8453 SvSETMAGIC(sv);
8454}
8455
954c1994
GS
8456/*
8457=for apidoc sv_vsetpvfn
8458
bffc3d17 8459Works like C<sv_vcatpvfn> but copies the text into the SV instead of
954c1994
GS
8460appending it.
8461
bffc3d17 8462Usually used via one of its frontends C<sv_vsetpvf> and C<sv_vsetpvf_mg>.
645c22ef 8463
954c1994
GS
8464=cut
8465*/
8466
46fc3d4c 8467void
7d5ea4e7 8468Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 8469{
8470 sv_setpvn(sv, "", 0);
7d5ea4e7 8471 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
46fc3d4c 8472}
8473
2d00ba3b 8474STATIC I32
9dd79c3f 8475S_expect_number(pTHX_ char** pattern)
211dfcf1 8476{
97aff369 8477 dVAR;
211dfcf1
HS
8478 I32 var = 0;
8479 switch (**pattern) {
8480 case '1': case '2': case '3':
8481 case '4': case '5': case '6':
8482 case '7': case '8': case '9':
2fba7546
GA
8483 var = *(*pattern)++ - '0';
8484 while (isDIGIT(**pattern)) {
5f66b61c 8485 const I32 tmp = var * 10 + (*(*pattern)++ - '0');
2fba7546
GA
8486 if (tmp < var)
8487 Perl_croak(aTHX_ "Integer overflow in format string for %s", (PL_op ? OP_NAME(PL_op) : "sv_vcatpvfn"));
8488 var = tmp;
8489 }
211dfcf1
HS
8490 }
8491 return var;
8492}
211dfcf1 8493
c445ea15
AL
8494STATIC char *
8495S_F0convert(NV nv, char *endbuf, STRLEN *len)
4151a5fe 8496{
a3b680e6 8497 const int neg = nv < 0;
4151a5fe 8498 UV uv;
4151a5fe
IZ
8499
8500 if (neg)
8501 nv = -nv;
8502 if (nv < UV_MAX) {
b464bac0 8503 char *p = endbuf;
4151a5fe 8504 nv += 0.5;
028f8eaa 8505 uv = (UV)nv;
4151a5fe
IZ
8506 if (uv & 1 && uv == nv)
8507 uv--; /* Round to even */
8508 do {
a3b680e6 8509 const unsigned dig = uv % 10;
4151a5fe
IZ
8510 *--p = '0' + dig;
8511 } while (uv /= 10);
8512 if (neg)
8513 *--p = '-';
8514 *len = endbuf - p;
8515 return p;
8516 }
bd61b366 8517 return NULL;
4151a5fe
IZ
8518}
8519
8520
954c1994
GS
8521/*
8522=for apidoc sv_vcatpvfn
8523
8524Processes its arguments like C<vsprintf> and appends the formatted output
8525to an SV. Uses an array of SVs if the C style variable argument list is
8526missing (NULL). When running with taint checks enabled, indicates via
8527C<maybe_tainted> if results are untrustworthy (often due to the use of
8528locales).
8529
bffc3d17 8530Usually used via one of its frontends C<sv_vcatpvf> and C<sv_vcatpvf_mg>.
645c22ef 8531
954c1994
GS
8532=cut
8533*/
8534
8896765a
RB
8535
8536#define VECTORIZE_ARGS vecsv = va_arg(*args, SV*);\
8537 vecstr = (U8*)SvPV_const(vecsv,veclen);\
8538 vec_utf8 = DO_UTF8(vecsv);
8539
1ef29b0e
RGS
8540/* XXX maybe_tainted is never assigned to, so the doc above is lying. */
8541
46fc3d4c 8542void
7d5ea4e7 8543Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 8544{
97aff369 8545 dVAR;
46fc3d4c 8546 char *p;
8547 char *q;
a3b680e6 8548 const char *patend;
fc36a67e 8549 STRLEN origlen;
46fc3d4c 8550 I32 svix = 0;
27da23d5 8551 static const char nullstr[] = "(null)";
a0714e2c 8552 SV *argsv = NULL;
b464bac0
AL
8553 bool has_utf8 = DO_UTF8(sv); /* has the result utf8? */
8554 const bool pat_utf8 = has_utf8; /* the pattern is in utf8? */
a0714e2c 8555 SV *nsv = NULL;
4151a5fe
IZ
8556 /* Times 4: a decimal digit takes more than 3 binary digits.
8557 * NV_DIG: mantissa takes than many decimal digits.
8558 * Plus 32: Playing safe. */
8559 char ebuf[IV_DIG * 4 + NV_DIG + 32];
8560 /* large enough for "%#.#f" --chip */
8561 /* what about long double NVs? --jhi */
db79b45b 8562
53c1dcc0
AL
8563 PERL_UNUSED_ARG(maybe_tainted);
8564
46fc3d4c 8565 /* no matter what, this is a string now */
fc36a67e 8566 (void)SvPV_force(sv, origlen);
46fc3d4c 8567
8896765a 8568 /* special-case "", "%s", and "%-p" (SVf - see below) */
46fc3d4c 8569 if (patlen == 0)
8570 return;
0dbb1585 8571 if (patlen == 2 && pat[0] == '%' && pat[1] == 's') {
2d03de9c
AL
8572 if (args) {
8573 const char * const s = va_arg(*args, char*);
8574 sv_catpv(sv, s ? s : nullstr);
8575 }
8576 else if (svix < svmax) {
8577 sv_catsv(sv, *svargs);
2d03de9c
AL
8578 }
8579 return;
0dbb1585 8580 }
8896765a
RB
8581 if (args && patlen == 3 && pat[0] == '%' &&
8582 pat[1] == '-' && pat[2] == 'p') {
6c9570dc 8583 argsv = (SV*)va_arg(*args, void*);
8896765a 8584 sv_catsv(sv, argsv);
8896765a 8585 return;
46fc3d4c 8586 }
8587
1d917b39 8588#ifndef USE_LONG_DOUBLE
4151a5fe 8589 /* special-case "%.<number>[gf]" */
7af36d83 8590 if ( !args && patlen <= 5 && pat[0] == '%' && pat[1] == '.'
4151a5fe
IZ
8591 && (pat[patlen-1] == 'g' || pat[patlen-1] == 'f') ) {
8592 unsigned digits = 0;
8593 const char *pp;
8594
8595 pp = pat + 2;
8596 while (*pp >= '0' && *pp <= '9')
8597 digits = 10 * digits + (*pp++ - '0');
028f8eaa 8598 if (pp - pat == (int)patlen - 1) {
4151a5fe
IZ
8599 NV nv;
8600
7af36d83 8601 if (svix < svmax)
4151a5fe
IZ
8602 nv = SvNV(*svargs);
8603 else
8604 return;
8605 if (*pp == 'g') {
2873255c
NC
8606 /* Add check for digits != 0 because it seems that some
8607 gconverts are buggy in this case, and we don't yet have
8608 a Configure test for this. */
8609 if (digits && digits < sizeof(ebuf) - NV_DIG - 10) {
8610 /* 0, point, slack */
2e59c212 8611 Gconvert(nv, (int)digits, 0, ebuf);
4151a5fe
IZ
8612 sv_catpv(sv, ebuf);
8613 if (*ebuf) /* May return an empty string for digits==0 */
8614 return;
8615 }
8616 } else if (!digits) {
8617 STRLEN l;
8618
8619 if ((p = F0convert(nv, ebuf + sizeof ebuf, &l))) {
8620 sv_catpvn(sv, p, l);
8621 return;
8622 }
8623 }
8624 }
8625 }
1d917b39 8626#endif /* !USE_LONG_DOUBLE */
4151a5fe 8627
2cf2cfc6 8628 if (!args && svix < svmax && DO_UTF8(*svargs))
205f51d8 8629 has_utf8 = TRUE;
2cf2cfc6 8630
46fc3d4c 8631 patend = (char*)pat + patlen;
8632 for (p = (char*)pat; p < patend; p = q) {
8633 bool alt = FALSE;
8634 bool left = FALSE;
b22c7a20 8635 bool vectorize = FALSE;
211dfcf1 8636 bool vectorarg = FALSE;
2cf2cfc6 8637 bool vec_utf8 = FALSE;
46fc3d4c 8638 char fill = ' ';
8639 char plus = 0;
8640 char intsize = 0;
8641 STRLEN width = 0;
fc36a67e 8642 STRLEN zeros = 0;
46fc3d4c 8643 bool has_precis = FALSE;
8644 STRLEN precis = 0;
c445ea15 8645 const I32 osvix = svix;
2cf2cfc6 8646 bool is_utf8 = FALSE; /* is this item utf8? */
20f6aaab
AS
8647#ifdef HAS_LDBL_SPRINTF_BUG
8648 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8 8649 with sfio - Allen <allens@cpan.org> */
20f6aaab
AS
8650 bool fix_ldbl_sprintf_bug = FALSE;
8651#endif
205f51d8 8652
46fc3d4c 8653 char esignbuf[4];
89ebb4a3 8654 U8 utf8buf[UTF8_MAXBYTES+1];
46fc3d4c 8655 STRLEN esignlen = 0;
8656
bd61b366 8657 const char *eptr = NULL;
fc36a67e 8658 STRLEN elen = 0;
a0714e2c 8659 SV *vecsv = NULL;
4608196e 8660 const U8 *vecstr = NULL;
b22c7a20 8661 STRLEN veclen = 0;
934abaf1 8662 char c = 0;
46fc3d4c 8663 int i;
9c5ffd7c 8664 unsigned base = 0;
8c8eb53c
RB
8665 IV iv = 0;
8666 UV uv = 0;
9e5b023a
JH
8667 /* we need a long double target in case HAS_LONG_DOUBLE but
8668 not USE_LONG_DOUBLE
8669 */
35fff930 8670#if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
9e5b023a
JH
8671 long double nv;
8672#else
65202027 8673 NV nv;
9e5b023a 8674#endif
46fc3d4c 8675 STRLEN have;
8676 STRLEN need;
8677 STRLEN gap;
7af36d83 8678 const char *dotstr = ".";
b22c7a20 8679 STRLEN dotstrlen = 1;
211dfcf1 8680 I32 efix = 0; /* explicit format parameter index */
eb3fce90 8681 I32 ewix = 0; /* explicit width index */
211dfcf1
HS
8682 I32 epix = 0; /* explicit precision index */
8683 I32 evix = 0; /* explicit vector index */
eb3fce90 8684 bool asterisk = FALSE;
46fc3d4c 8685
211dfcf1 8686 /* echo everything up to the next format specification */
46fc3d4c 8687 for (q = p; q < patend && *q != '%'; ++q) ;
8688 if (q > p) {
db79b45b
JH
8689 if (has_utf8 && !pat_utf8)
8690 sv_catpvn_utf8_upgrade(sv, p, q - p, nsv);
8691 else
8692 sv_catpvn(sv, p, q - p);
46fc3d4c 8693 p = q;
8694 }
8695 if (q++ >= patend)
8696 break;
8697
211dfcf1
HS
8698/*
8699 We allow format specification elements in this order:
8700 \d+\$ explicit format parameter index
8701 [-+ 0#]+ flags
a472f209 8702 v|\*(\d+\$)?v vector with optional (optionally specified) arg
f3583277 8703 0 flag (as above): repeated to allow "v02"
211dfcf1
HS
8704 \d+|\*(\d+\$)? width using optional (optionally specified) arg
8705 \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
8706 [hlqLV] size
8896765a
RB
8707 [%bcdefginopsuxDFOUX] format (mandatory)
8708*/
8709
8710 if (args) {
8711/*
8712 As of perl5.9.3, printf format checking is on by default.
8713 Internally, perl uses %p formats to provide an escape to
8714 some extended formatting. This block deals with those
8715 extensions: if it does not match, (char*)q is reset and
8716 the normal format processing code is used.
8717
8718 Currently defined extensions are:
8719 %p include pointer address (standard)
8720 %-p (SVf) include an SV (previously %_)
8721 %-<num>p include an SV with precision <num>
8896765a
RB
8722 %<num>p reserved for future extensions
8723
8724 Robin Barker 2005-07-14
f46d31f2
RB
8725
8726 %1p (VDf) removed. RMB 2007-10-19
211dfcf1 8727*/
8896765a
RB
8728 char* r = q;
8729 bool sv = FALSE;
8730 STRLEN n = 0;
8731 if (*q == '-')
8732 sv = *q++;
c445ea15 8733 n = expect_number(&q);
8896765a
RB
8734 if (*q++ == 'p') {
8735 if (sv) { /* SVf */
8736 if (n) {
8737 precis = n;
8738 has_precis = TRUE;
8739 }
6c9570dc 8740 argsv = (SV*)va_arg(*args, void*);
4ea561bc 8741 eptr = SvPV_const(argsv, elen);
8896765a
RB
8742 if (DO_UTF8(argsv))
8743 is_utf8 = TRUE;
8744 goto string;
8745 }
8896765a
RB
8746 else if (n) {
8747 if (ckWARN_d(WARN_INTERNAL))
8748 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
8749 "internal %%<num>p might conflict with future printf extensions");
8750 }
8751 }
8752 q = r;
8753 }
8754
c445ea15 8755 if ( (width = expect_number(&q)) ) {
211dfcf1
HS
8756 if (*q == '$') {
8757 ++q;
8758 efix = width;
8759 } else {
8760 goto gotwidth;
8761 }
8762 }
8763
fc36a67e 8764 /* FLAGS */
8765
46fc3d4c 8766 while (*q) {
8767 switch (*q) {
8768 case ' ':
8769 case '+':
9911cee9
TS
8770 if (plus == '+' && *q == ' ') /* '+' over ' ' */
8771 q++;
8772 else
8773 plus = *q++;
46fc3d4c 8774 continue;
8775
8776 case '-':
8777 left = TRUE;
8778 q++;
8779 continue;
8780
8781 case '0':
8782 fill = *q++;
8783 continue;
8784
8785 case '#':
8786 alt = TRUE;
8787 q++;
8788 continue;
8789
fc36a67e 8790 default:
8791 break;
8792 }
8793 break;
8794 }
46fc3d4c 8795
211dfcf1 8796 tryasterisk:
eb3fce90 8797 if (*q == '*') {
211dfcf1 8798 q++;
c445ea15 8799 if ( (ewix = expect_number(&q)) )
211dfcf1
HS
8800 if (*q++ != '$')
8801 goto unknown;
eb3fce90 8802 asterisk = TRUE;
211dfcf1
HS
8803 }
8804 if (*q == 'v') {
eb3fce90 8805 q++;
211dfcf1
HS
8806 if (vectorize)
8807 goto unknown;
9cbac4c7 8808 if ((vectorarg = asterisk)) {
211dfcf1
HS
8809 evix = ewix;
8810 ewix = 0;
8811 asterisk = FALSE;
8812 }
8813 vectorize = TRUE;
8814 goto tryasterisk;
eb3fce90
JH
8815 }
8816
211dfcf1 8817 if (!asterisk)
858a90f9 8818 {
7a5fa8a2 8819 if( *q == '0' )
f3583277 8820 fill = *q++;
c445ea15 8821 width = expect_number(&q);
858a90f9 8822 }
211dfcf1
HS
8823
8824 if (vectorize) {
8825 if (vectorarg) {
8826 if (args)
8827 vecsv = va_arg(*args, SV*);
7ad96abb
NC
8828 else if (evix) {
8829 vecsv = (evix > 0 && evix <= svmax)
8830 ? svargs[evix-1] : &PL_sv_undef;
8831 } else {
8832 vecsv = svix < svmax ? svargs[svix++] : &PL_sv_undef;
8833 }
245d4a47 8834 dotstr = SvPV_const(vecsv, dotstrlen);
640283f5
NC
8835 /* Keep the DO_UTF8 test *after* the SvPV call, else things go
8836 bad with tied or overloaded values that return UTF8. */
211dfcf1 8837 if (DO_UTF8(vecsv))
2cf2cfc6 8838 is_utf8 = TRUE;
640283f5
NC
8839 else if (has_utf8) {
8840 vecsv = sv_mortalcopy(vecsv);
8841 sv_utf8_upgrade(vecsv);
8842 dotstr = SvPV_const(vecsv, dotstrlen);
8843 is_utf8 = TRUE;
8844 }
211dfcf1
HS
8845 }
8846 if (args) {
8896765a 8847 VECTORIZE_ARGS
eb3fce90 8848 }
7ad96abb 8849 else if (efix ? (efix > 0 && efix <= svmax) : svix < svmax) {
211dfcf1 8850 vecsv = svargs[efix ? efix-1 : svix++];
245d4a47 8851 vecstr = (U8*)SvPV_const(vecsv,veclen);
2cf2cfc6 8852 vec_utf8 = DO_UTF8(vecsv);
96b8f7ce
JP
8853
8854 /* if this is a version object, we need to convert
8855 * back into v-string notation and then let the
8856 * vectorize happen normally
d7aa5382 8857 */
96b8f7ce
JP
8858 if (sv_derived_from(vecsv, "version")) {
8859 char *version = savesvpv(vecsv);
34ba6322
SP
8860 if ( hv_exists((HV*)SvRV(vecsv), "alpha", 5 ) ) {
8861 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
8862 "vector argument not supported with alpha versions");
8863 goto unknown;
8864 }
96b8f7ce 8865 vecsv = sv_newmortal();
65b06e02 8866 scan_vstring(version, version + veclen, vecsv);
96b8f7ce
JP
8867 vecstr = (U8*)SvPV_const(vecsv, veclen);
8868 vec_utf8 = DO_UTF8(vecsv);
8869 Safefree(version);
d7aa5382 8870 }
211dfcf1
HS
8871 }
8872 else {
8873 vecstr = (U8*)"";
8874 veclen = 0;
8875 }
eb3fce90 8876 }
fc36a67e 8877
eb3fce90 8878 if (asterisk) {
fc36a67e 8879 if (args)
8880 i = va_arg(*args, int);
8881 else
eb3fce90
JH
8882 i = (ewix ? ewix <= svmax : svix < svmax) ?
8883 SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 8884 left |= (i < 0);
8885 width = (i < 0) ? -i : i;
fc36a67e 8886 }
211dfcf1 8887 gotwidth:
fc36a67e 8888
8889 /* PRECISION */
46fc3d4c 8890
fc36a67e 8891 if (*q == '.') {
8892 q++;
8893 if (*q == '*') {
211dfcf1 8894 q++;
c445ea15 8895 if ( ((epix = expect_number(&q))) && (*q++ != '$') )
7b8dd722
HS
8896 goto unknown;
8897 /* XXX: todo, support specified precision parameter */
8898 if (epix)
211dfcf1 8899 goto unknown;
46fc3d4c 8900 if (args)
8901 i = va_arg(*args, int);
8902 else
eb3fce90
JH
8903 i = (ewix ? ewix <= svmax : svix < svmax)
8904 ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
9911cee9
TS
8905 precis = i;
8906 has_precis = !(i < 0);
fc36a67e 8907 }
8908 else {
8909 precis = 0;
8910 while (isDIGIT(*q))
8911 precis = precis * 10 + (*q++ - '0');
9911cee9 8912 has_precis = TRUE;
fc36a67e 8913 }
fc36a67e 8914 }
46fc3d4c 8915
fc36a67e 8916 /* SIZE */
46fc3d4c 8917
fc36a67e 8918 switch (*q) {
c623ac67
GS
8919#ifdef WIN32
8920 case 'I': /* Ix, I32x, and I64x */
8921# ifdef WIN64
8922 if (q[1] == '6' && q[2] == '4') {
8923 q += 3;
8924 intsize = 'q';
8925 break;
8926 }
8927# endif
8928 if (q[1] == '3' && q[2] == '2') {
8929 q += 3;
8930 break;
8931 }
8932# ifdef WIN64
8933 intsize = 'q';
8934# endif
8935 q++;
8936 break;
8937#endif
9e5b023a 8938#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
6f9bb7fd 8939 case 'L': /* Ld */
5f66b61c 8940 /*FALLTHROUGH*/
e5c81feb 8941#ifdef HAS_QUAD
6f9bb7fd 8942 case 'q': /* qd */
9e5b023a 8943#endif
6f9bb7fd
GS
8944 intsize = 'q';
8945 q++;
8946 break;
8947#endif
fc36a67e 8948 case 'l':
9e5b023a 8949#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
205f51d8 8950 if (*(q + 1) == 'l') { /* lld, llf */
fc36a67e 8951 intsize = 'q';
8952 q += 2;
46fc3d4c 8953 break;
cf2093f6 8954 }
fc36a67e 8955#endif
5f66b61c 8956 /*FALLTHROUGH*/
fc36a67e 8957 case 'h':
5f66b61c 8958 /*FALLTHROUGH*/
fc36a67e 8959 case 'V':
8960 intsize = *q++;
46fc3d4c 8961 break;
8962 }
8963
fc36a67e 8964 /* CONVERSION */
8965
211dfcf1
HS
8966 if (*q == '%') {
8967 eptr = q++;
8968 elen = 1;
26372e71
GA
8969 if (vectorize) {
8970 c = '%';
8971 goto unknown;
8972 }
211dfcf1
HS
8973 goto string;
8974 }
8975
26372e71 8976 if (!vectorize && !args) {
86c51f8b
NC
8977 if (efix) {
8978 const I32 i = efix-1;
8979 argsv = (i >= 0 && i < svmax) ? svargs[i] : &PL_sv_undef;
8980 } else {
8981 argsv = (svix >= 0 && svix < svmax)
8982 ? svargs[svix++] : &PL_sv_undef;
8983 }
863811b2 8984 }
211dfcf1 8985
46fc3d4c 8986 switch (c = *q++) {
8987
8988 /* STRINGS */
8989
46fc3d4c 8990 case 'c':
26372e71
GA
8991 if (vectorize)
8992 goto unknown;
4ea561bc 8993 uv = (args) ? va_arg(*args, int) : SvIV(argsv);
1bd104fb
JH
8994 if ((uv > 255 ||
8995 (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
0064a8a9 8996 && !IN_BYTES) {
dfe13c55 8997 eptr = (char*)utf8buf;
9041c2e3 8998 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
2cf2cfc6 8999 is_utf8 = TRUE;
7e2040f0
GS
9000 }
9001 else {
9002 c = (char)uv;
9003 eptr = &c;
9004 elen = 1;
a0ed51b3 9005 }
46fc3d4c 9006 goto string;
9007
46fc3d4c 9008 case 's':
26372e71
GA
9009 if (vectorize)
9010 goto unknown;
9011 if (args) {
fc36a67e 9012 eptr = va_arg(*args, char*);
c635e13b 9013 if (eptr)
1d7c1841
GS
9014#ifdef MACOS_TRADITIONAL
9015 /* On MacOS, %#s format is used for Pascal strings */
9016 if (alt)
9017 elen = *eptr++;
9018 else
9019#endif
c635e13b 9020 elen = strlen(eptr);
9021 else {
27da23d5 9022 eptr = (char *)nullstr;
c635e13b 9023 elen = sizeof nullstr - 1;
9024 }
46fc3d4c 9025 }
211dfcf1 9026 else {
4ea561bc 9027 eptr = SvPV_const(argsv, elen);
7e2040f0 9028 if (DO_UTF8(argsv)) {
59b61096 9029 I32 old_precis = precis;
a0ed51b3
LW
9030 if (has_precis && precis < elen) {
9031 I32 p = precis;
7e2040f0 9032 sv_pos_u2b(argsv, &p, 0); /* sticks at end */
a0ed51b3
LW
9033 precis = p;
9034 }
9035 if (width) { /* fudge width (can't fudge elen) */
59b61096
AV
9036 if (has_precis && precis < elen)
9037 width += precis - old_precis;
9038 else
9039 width += elen - sv_len_utf8(argsv);
a0ed51b3 9040 }
2cf2cfc6 9041 is_utf8 = TRUE;
a0ed51b3
LW
9042 }
9043 }
fc36a67e 9044
46fc3d4c 9045 string:
9046 if (has_precis && elen > precis)
9047 elen = precis;
9048 break;
9049
9050 /* INTEGERS */
9051
fc36a67e 9052 case 'p':
be75b157 9053 if (alt || vectorize)
c2e66d9e 9054 goto unknown;
211dfcf1 9055 uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
fc36a67e 9056 base = 16;
9057 goto integer;
9058
46fc3d4c 9059 case 'D':
29fe7a80 9060#ifdef IV_IS_QUAD
22f3ae8c 9061 intsize = 'q';
29fe7a80 9062#else
46fc3d4c 9063 intsize = 'l';
29fe7a80 9064#endif
5f66b61c 9065 /*FALLTHROUGH*/
46fc3d4c 9066 case 'd':
9067 case 'i':
8896765a
RB
9068#if vdNUMBER
9069 format_vd:
9070#endif
b22c7a20 9071 if (vectorize) {
ba210ebe 9072 STRLEN ulen;
211dfcf1
HS
9073 if (!veclen)
9074 continue;
2cf2cfc6
A
9075 if (vec_utf8)
9076 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9077 UTF8_ALLOW_ANYUV);
b22c7a20 9078 else {
e83d50c9 9079 uv = *vecstr;
b22c7a20
GS
9080 ulen = 1;
9081 }
9082 vecstr += ulen;
9083 veclen -= ulen;
e83d50c9
JP
9084 if (plus)
9085 esignbuf[esignlen++] = plus;
b22c7a20
GS
9086 }
9087 else if (args) {
46fc3d4c 9088 switch (intsize) {
9089 case 'h': iv = (short)va_arg(*args, int); break;
46fc3d4c 9090 case 'l': iv = va_arg(*args, long); break;
fc36a67e 9091 case 'V': iv = va_arg(*args, IV); break;
b10c0dba 9092 default: iv = va_arg(*args, int); break;
cf2093f6
JH
9093#ifdef HAS_QUAD
9094 case 'q': iv = va_arg(*args, Quad_t); break;
9095#endif
46fc3d4c 9096 }
9097 }
9098 else {
4ea561bc 9099 IV tiv = SvIV(argsv); /* work around GCC bug #13488 */
46fc3d4c 9100 switch (intsize) {
b10c0dba
MHM
9101 case 'h': iv = (short)tiv; break;
9102 case 'l': iv = (long)tiv; break;
9103 case 'V':
9104 default: iv = tiv; break;
cf2093f6 9105#ifdef HAS_QUAD
b10c0dba 9106 case 'q': iv = (Quad_t)tiv; break;
cf2093f6 9107#endif
46fc3d4c 9108 }
9109 }
e83d50c9
JP
9110 if ( !vectorize ) /* we already set uv above */
9111 {
9112 if (iv >= 0) {
9113 uv = iv;
9114 if (plus)
9115 esignbuf[esignlen++] = plus;
9116 }
9117 else {
9118 uv = -iv;
9119 esignbuf[esignlen++] = '-';
9120 }
46fc3d4c 9121 }
9122 base = 10;
9123 goto integer;
9124
fc36a67e 9125 case 'U':
29fe7a80 9126#ifdef IV_IS_QUAD
22f3ae8c 9127 intsize = 'q';
29fe7a80 9128#else
fc36a67e 9129 intsize = 'l';
29fe7a80 9130#endif
5f66b61c 9131 /*FALLTHROUGH*/
fc36a67e 9132 case 'u':
9133 base = 10;
9134 goto uns_integer;
9135
7ff06cc7 9136 case 'B':
4f19785b
WSI
9137 case 'b':
9138 base = 2;
9139 goto uns_integer;
9140
46fc3d4c 9141 case 'O':
29fe7a80 9142#ifdef IV_IS_QUAD
22f3ae8c 9143 intsize = 'q';
29fe7a80 9144#else
46fc3d4c 9145 intsize = 'l';
29fe7a80 9146#endif
5f66b61c 9147 /*FALLTHROUGH*/
46fc3d4c 9148 case 'o':
9149 base = 8;
9150 goto uns_integer;
9151
9152 case 'X':
46fc3d4c 9153 case 'x':
9154 base = 16;
46fc3d4c 9155
9156 uns_integer:
b22c7a20 9157 if (vectorize) {
ba210ebe 9158 STRLEN ulen;
b22c7a20 9159 vector:
211dfcf1
HS
9160 if (!veclen)
9161 continue;
2cf2cfc6
A
9162 if (vec_utf8)
9163 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9164 UTF8_ALLOW_ANYUV);
b22c7a20 9165 else {
a05b299f 9166 uv = *vecstr;
b22c7a20
GS
9167 ulen = 1;
9168 }
9169 vecstr += ulen;
9170 veclen -= ulen;
9171 }
9172 else if (args) {
46fc3d4c 9173 switch (intsize) {
9174 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
46fc3d4c 9175 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 9176 case 'V': uv = va_arg(*args, UV); break;
b10c0dba 9177 default: uv = va_arg(*args, unsigned); break;
cf2093f6 9178#ifdef HAS_QUAD
9e3321a5 9179 case 'q': uv = va_arg(*args, Uquad_t); break;
cf2093f6 9180#endif
46fc3d4c 9181 }
9182 }
9183 else {
4ea561bc 9184 UV tuv = SvUV(argsv); /* work around GCC bug #13488 */
46fc3d4c 9185 switch (intsize) {
b10c0dba
MHM
9186 case 'h': uv = (unsigned short)tuv; break;
9187 case 'l': uv = (unsigned long)tuv; break;
9188 case 'V':
9189 default: uv = tuv; break;
cf2093f6 9190#ifdef HAS_QUAD
b10c0dba 9191 case 'q': uv = (Uquad_t)tuv; break;
cf2093f6 9192#endif
46fc3d4c 9193 }
9194 }
9195
9196 integer:
4d84ee25
NC
9197 {
9198 char *ptr = ebuf + sizeof ebuf;
1387f30c
DD
9199 bool tempalt = uv ? alt : FALSE; /* Vectors can't change alt */
9200 zeros = 0;
9201
4d84ee25
NC
9202 switch (base) {
9203 unsigned dig;
9204 case 16:
14eb61ab 9205 p = (char *)((c == 'X') ? PL_hexdigit + 16 : PL_hexdigit);
4d84ee25
NC
9206 do {
9207 dig = uv & 15;
9208 *--ptr = p[dig];
9209 } while (uv >>= 4);
1387f30c 9210 if (tempalt) {
4d84ee25
NC
9211 esignbuf[esignlen++] = '0';
9212 esignbuf[esignlen++] = c; /* 'x' or 'X' */
9213 }
9214 break;
9215 case 8:
9216 do {
9217 dig = uv & 7;
9218 *--ptr = '0' + dig;
9219 } while (uv >>= 3);
9220 if (alt && *ptr != '0')
9221 *--ptr = '0';
9222 break;
9223 case 2:
9224 do {
9225 dig = uv & 1;
9226 *--ptr = '0' + dig;
9227 } while (uv >>= 1);
1387f30c 9228 if (tempalt) {
4d84ee25 9229 esignbuf[esignlen++] = '0';
7ff06cc7 9230 esignbuf[esignlen++] = c;
4d84ee25
NC
9231 }
9232 break;
9233 default: /* it had better be ten or less */
9234 do {
9235 dig = uv % base;
9236 *--ptr = '0' + dig;
9237 } while (uv /= base);
9238 break;
46fc3d4c 9239 }
4d84ee25
NC
9240 elen = (ebuf + sizeof ebuf) - ptr;
9241 eptr = ptr;
9242 if (has_precis) {
9243 if (precis > elen)
9244 zeros = precis - elen;
e6bb52fd
TS
9245 else if (precis == 0 && elen == 1 && *eptr == '0'
9246 && !(base == 8 && alt)) /* "%#.0o" prints "0" */
4d84ee25 9247 elen = 0;
9911cee9
TS
9248
9249 /* a precision nullifies the 0 flag. */
9250 if (fill == '0')
9251 fill = ' ';
eda88b6d 9252 }
c10ed8b9 9253 }
46fc3d4c 9254 break;
9255
9256 /* FLOATING POINT */
9257
fc36a67e 9258 case 'F':
9259 c = 'f'; /* maybe %F isn't supported here */
5f66b61c 9260 /*FALLTHROUGH*/
46fc3d4c 9261 case 'e': case 'E':
fc36a67e 9262 case 'f':
46fc3d4c 9263 case 'g': case 'G':
26372e71
GA
9264 if (vectorize)
9265 goto unknown;
46fc3d4c 9266
9267 /* This is evil, but floating point is even more evil */
9268
9e5b023a
JH
9269 /* for SV-style calling, we can only get NV
9270 for C-style calling, we assume %f is double;
9271 for simplicity we allow any of %Lf, %llf, %qf for long double
9272 */
9273 switch (intsize) {
9274 case 'V':
9275#if defined(USE_LONG_DOUBLE)
9276 intsize = 'q';
9277#endif
9278 break;
8a2e3f14 9279/* [perl #20339] - we should accept and ignore %lf rather than die */
00e17364 9280 case 'l':
5f66b61c 9281 /*FALLTHROUGH*/
9e5b023a
JH
9282 default:
9283#if defined(USE_LONG_DOUBLE)
9284 intsize = args ? 0 : 'q';
9285#endif
9286 break;
9287 case 'q':
9288#if defined(HAS_LONG_DOUBLE)
9289 break;
9290#else
5f66b61c 9291 /*FALLTHROUGH*/
9e5b023a
JH
9292#endif
9293 case 'h':
9e5b023a
JH
9294 goto unknown;
9295 }
9296
9297 /* now we need (long double) if intsize == 'q', else (double) */
26372e71 9298 nv = (args) ?
35fff930
JH
9299#if LONG_DOUBLESIZE > DOUBLESIZE
9300 intsize == 'q' ?
205f51d8
AS
9301 va_arg(*args, long double) :
9302 va_arg(*args, double)
35fff930 9303#else
205f51d8 9304 va_arg(*args, double)
35fff930 9305#endif
4ea561bc 9306 : SvNV(argsv);
fc36a67e 9307
9308 need = 0;
3952c29a
NC
9309 /* nv * 0 will be NaN for NaN, +Inf and -Inf, and 0 for anything
9310 else. frexp() has some unspecified behaviour for those three */
9311 if (c != 'e' && c != 'E' && (nv * 0) == 0) {
fc36a67e 9312 i = PERL_INT_MIN;
9e5b023a
JH
9313 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
9314 will cast our (long double) to (double) */
73b309ea 9315 (void)Perl_frexp(nv, &i);
fc36a67e 9316 if (i == PERL_INT_MIN)
cea2e8a9 9317 Perl_die(aTHX_ "panic: frexp");
c635e13b 9318 if (i > 0)
fc36a67e 9319 need = BIT_DIGITS(i);
9320 }
9321 need += has_precis ? precis : 6; /* known default */
20f6aaab 9322
fc36a67e 9323 if (need < width)
9324 need = width;
9325
20f6aaab
AS
9326#ifdef HAS_LDBL_SPRINTF_BUG
9327 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8
AS
9328 with sfio - Allen <allens@cpan.org> */
9329
9330# ifdef DBL_MAX
9331# define MY_DBL_MAX DBL_MAX
9332# else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
9333# if DOUBLESIZE >= 8
9334# define MY_DBL_MAX 1.7976931348623157E+308L
9335# else
9336# define MY_DBL_MAX 3.40282347E+38L
9337# endif
9338# endif
9339
9340# ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
9341# define MY_DBL_MAX_BUG 1L
20f6aaab 9342# else
205f51d8 9343# define MY_DBL_MAX_BUG MY_DBL_MAX
20f6aaab 9344# endif
20f6aaab 9345
205f51d8
AS
9346# ifdef DBL_MIN
9347# define MY_DBL_MIN DBL_MIN
9348# else /* XXX guessing! -Allen */
9349# if DOUBLESIZE >= 8
9350# define MY_DBL_MIN 2.2250738585072014E-308L
9351# else
9352# define MY_DBL_MIN 1.17549435E-38L
9353# endif
9354# endif
20f6aaab 9355
205f51d8
AS
9356 if ((intsize == 'q') && (c == 'f') &&
9357 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
9358 (need < DBL_DIG)) {
9359 /* it's going to be short enough that
9360 * long double precision is not needed */
9361
9362 if ((nv <= 0L) && (nv >= -0L))
9363 fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
9364 else {
9365 /* would use Perl_fp_class as a double-check but not
9366 * functional on IRIX - see perl.h comments */
9367
9368 if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
9369 /* It's within the range that a double can represent */
9370#if defined(DBL_MAX) && !defined(DBL_MIN)
9371 if ((nv >= ((long double)1/DBL_MAX)) ||
9372 (nv <= (-(long double)1/DBL_MAX)))
20f6aaab 9373#endif
205f51d8 9374 fix_ldbl_sprintf_bug = TRUE;
20f6aaab 9375 }
205f51d8
AS
9376 }
9377 if (fix_ldbl_sprintf_bug == TRUE) {
9378 double temp;
9379
9380 intsize = 0;
9381 temp = (double)nv;
9382 nv = (NV)temp;
9383 }
20f6aaab 9384 }
205f51d8
AS
9385
9386# undef MY_DBL_MAX
9387# undef MY_DBL_MAX_BUG
9388# undef MY_DBL_MIN
9389
20f6aaab
AS
9390#endif /* HAS_LDBL_SPRINTF_BUG */
9391
46fc3d4c 9392 need += 20; /* fudge factor */
80252599
GS
9393 if (PL_efloatsize < need) {
9394 Safefree(PL_efloatbuf);
9395 PL_efloatsize = need + 20; /* more fudge */
a02a5408 9396 Newx(PL_efloatbuf, PL_efloatsize, char);
7d5ea4e7 9397 PL_efloatbuf[0] = '\0';
46fc3d4c 9398 }
9399
4151a5fe
IZ
9400 if ( !(width || left || plus || alt) && fill != '0'
9401 && has_precis && intsize != 'q' ) { /* Shortcuts */
2873255c
NC
9402 /* See earlier comment about buggy Gconvert when digits,
9403 aka precis is 0 */
9404 if ( c == 'g' && precis) {
2e59c212 9405 Gconvert((NV)nv, (int)precis, 0, PL_efloatbuf);
4150c189
NC
9406 /* May return an empty string for digits==0 */
9407 if (*PL_efloatbuf) {
9408 elen = strlen(PL_efloatbuf);
4151a5fe 9409 goto float_converted;
4150c189 9410 }
4151a5fe
IZ
9411 } else if ( c == 'f' && !precis) {
9412 if ((eptr = F0convert(nv, ebuf + sizeof ebuf, &elen)))
9413 break;
9414 }
9415 }
4d84ee25
NC
9416 {
9417 char *ptr = ebuf + sizeof ebuf;
9418 *--ptr = '\0';
9419 *--ptr = c;
9420 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
9e5b023a 9421#if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
4d84ee25
NC
9422 if (intsize == 'q') {
9423 /* Copy the one or more characters in a long double
9424 * format before the 'base' ([efgEFG]) character to
9425 * the format string. */
9426 static char const prifldbl[] = PERL_PRIfldbl;
9427 char const *p = prifldbl + sizeof(prifldbl) - 3;
9428 while (p >= prifldbl) { *--ptr = *p--; }
9429 }
65202027 9430#endif
4d84ee25
NC
9431 if (has_precis) {
9432 base = precis;
9433 do { *--ptr = '0' + (base % 10); } while (base /= 10);
9434 *--ptr = '.';
9435 }
9436 if (width) {
9437 base = width;
9438 do { *--ptr = '0' + (base % 10); } while (base /= 10);
9439 }
9440 if (fill == '0')
9441 *--ptr = fill;
9442 if (left)
9443 *--ptr = '-';
9444 if (plus)
9445 *--ptr = plus;
9446 if (alt)
9447 *--ptr = '#';
9448 *--ptr = '%';
9449
9450 /* No taint. Otherwise we are in the strange situation
9451 * where printf() taints but print($float) doesn't.
9452 * --jhi */
9e5b023a 9453#if defined(HAS_LONG_DOUBLE)
4150c189 9454 elen = ((intsize == 'q')
d9fad198
JH
9455 ? my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, nv)
9456 : my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, (double)nv));
9e5b023a 9457#else
4150c189 9458 elen = my_sprintf(PL_efloatbuf, ptr, nv);
9e5b023a 9459#endif
4d84ee25 9460 }
4151a5fe 9461 float_converted:
80252599 9462 eptr = PL_efloatbuf;
46fc3d4c 9463 break;
9464
fc36a67e 9465 /* SPECIAL */
9466
9467 case 'n':
26372e71
GA
9468 if (vectorize)
9469 goto unknown;
fc36a67e 9470 i = SvCUR(sv) - origlen;
26372e71 9471 if (args) {
c635e13b 9472 switch (intsize) {
9473 case 'h': *(va_arg(*args, short*)) = i; break;
9474 default: *(va_arg(*args, int*)) = i; break;
9475 case 'l': *(va_arg(*args, long*)) = i; break;
9476 case 'V': *(va_arg(*args, IV*)) = i; break;
cf2093f6
JH
9477#ifdef HAS_QUAD
9478 case 'q': *(va_arg(*args, Quad_t*)) = i; break;
9479#endif
c635e13b 9480 }
fc36a67e 9481 }
9dd79c3f 9482 else
211dfcf1 9483 sv_setuv_mg(argsv, (UV)i);
fc36a67e 9484 continue; /* not "break" */
9485
9486 /* UNKNOWN */
9487
46fc3d4c 9488 default:
fc36a67e 9489 unknown:
041457d9
DM
9490 if (!args
9491 && (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)
9492 && ckWARN(WARN_PRINTF))
9493 {
c4420975 9494 SV * const msg = sv_newmortal();
35c1215d
NC
9495 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
9496 (PL_op->op_type == OP_PRTF) ? "" : "s");
0f4b6630 9497 if (c) {
0f4b6630 9498 if (isPRINT(c))
1c846c1f 9499 Perl_sv_catpvf(aTHX_ msg,
0f4b6630
JH
9500 "\"%%%c\"", c & 0xFF);
9501 else
9502 Perl_sv_catpvf(aTHX_ msg,
57def98f 9503 "\"%%\\%03"UVof"\"",
0f4b6630 9504 (UV)c & 0xFF);
0f4b6630 9505 } else
396482e1 9506 sv_catpvs(msg, "end of string");
be2597df 9507 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, SVfARG(msg)); /* yes, this is reentrant */
c635e13b 9508 }
fb73857a 9509
9510 /* output mangled stuff ... */
9511 if (c == '\0')
9512 --q;
46fc3d4c 9513 eptr = p;
9514 elen = q - p;
fb73857a 9515
9516 /* ... right here, because formatting flags should not apply */
9517 SvGROW(sv, SvCUR(sv) + elen + 1);
9518 p = SvEND(sv);
4459522c 9519 Copy(eptr, p, elen, char);
fb73857a 9520 p += elen;
9521 *p = '\0';
3f7c398e 9522 SvCUR_set(sv, p - SvPVX_const(sv));
58e33a90 9523 svix = osvix;
fb73857a 9524 continue; /* not "break" */
46fc3d4c 9525 }
9526
cc61b222
TS
9527 if (is_utf8 != has_utf8) {
9528 if (is_utf8) {
9529 if (SvCUR(sv))
9530 sv_utf8_upgrade(sv);
9531 }
9532 else {
9533 const STRLEN old_elen = elen;
59cd0e26 9534 SV * const nsv = newSVpvn_flags(eptr, elen, SVs_TEMP);
cc61b222
TS
9535 sv_utf8_upgrade(nsv);
9536 eptr = SvPVX_const(nsv);
9537 elen = SvCUR(nsv);
9538
9539 if (width) { /* fudge width (can't fudge elen) */
9540 width += elen - old_elen;
9541 }
9542 is_utf8 = TRUE;
9543 }
9544 }
9545
6c94ec8b 9546 have = esignlen + zeros + elen;
ed2b91d2
GA
9547 if (have < zeros)
9548 Perl_croak_nocontext(PL_memory_wrap);
6c94ec8b 9549
46fc3d4c 9550 need = (have > width ? have : width);
9551 gap = need - have;
9552
d2641cbd
PC
9553 if (need >= (((STRLEN)~0) - SvCUR(sv) - dotstrlen - 1))
9554 Perl_croak_nocontext(PL_memory_wrap);
b22c7a20 9555 SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
46fc3d4c 9556 p = SvEND(sv);
9557 if (esignlen && fill == '0') {
53c1dcc0 9558 int i;
eb160463 9559 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 9560 *p++ = esignbuf[i];
9561 }
9562 if (gap && !left) {
9563 memset(p, fill, gap);
9564 p += gap;
9565 }
9566 if (esignlen && fill != '0') {
53c1dcc0 9567 int i;
eb160463 9568 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 9569 *p++ = esignbuf[i];
9570 }
fc36a67e 9571 if (zeros) {
53c1dcc0 9572 int i;
fc36a67e 9573 for (i = zeros; i; i--)
9574 *p++ = '0';
9575 }
46fc3d4c 9576 if (elen) {
4459522c 9577 Copy(eptr, p, elen, char);
46fc3d4c 9578 p += elen;
9579 }
9580 if (gap && left) {
9581 memset(p, ' ', gap);
9582 p += gap;
9583 }
b22c7a20
GS
9584 if (vectorize) {
9585 if (veclen) {
4459522c 9586 Copy(dotstr, p, dotstrlen, char);
b22c7a20
GS
9587 p += dotstrlen;
9588 }
9589 else
9590 vectorize = FALSE; /* done iterating over vecstr */
9591 }
2cf2cfc6
A
9592 if (is_utf8)
9593 has_utf8 = TRUE;
9594 if (has_utf8)
7e2040f0 9595 SvUTF8_on(sv);
46fc3d4c 9596 *p = '\0';
3f7c398e 9597 SvCUR_set(sv, p - SvPVX_const(sv));
b22c7a20
GS
9598 if (vectorize) {
9599 esignlen = 0;
9600 goto vector;
9601 }
46fc3d4c 9602 }
9603}
51371543 9604
645c22ef
DM
9605/* =========================================================================
9606
9607=head1 Cloning an interpreter
9608
9609All the macros and functions in this section are for the private use of
9610the main function, perl_clone().
9611
f2fc5c80 9612The foo_dup() functions make an exact copy of an existing foo thingy.
645c22ef
DM
9613During the course of a cloning, a hash table is used to map old addresses
9614to new addresses. The table is created and manipulated with the
9615ptr_table_* functions.
9616
9617=cut
9618
9619============================================================================*/
9620
9621
1d7c1841
GS
9622#if defined(USE_ITHREADS)
9623
d4c19fe8 9624/* XXX Remove this so it doesn't have to go thru the macro and return for nothing */
1d7c1841
GS
9625#ifndef GpREFCNT_inc
9626# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
9627#endif
9628
9629
a41cc44e 9630/* Certain cases in Perl_ss_dup have been merged, by relying on the fact
3e07292d
NC
9631 that currently av_dup, gv_dup and hv_dup are the same as sv_dup.
9632 If this changes, please unmerge ss_dup. */
d2d73c3e 9633#define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
7f466ec7 9634#define sv_dup_inc_NN(s,t) SvREFCNT_inc_NN(sv_dup(s,t))
d2d73c3e
AB
9635#define av_dup(s,t) (AV*)sv_dup((SV*)s,t)
9636#define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9637#define hv_dup(s,t) (HV*)sv_dup((SV*)s,t)
9638#define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9639#define cv_dup(s,t) (CV*)sv_dup((SV*)s,t)
9640#define cv_dup_inc(s,t) (CV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9641#define io_dup(s,t) (IO*)sv_dup((SV*)s,t)
9642#define io_dup_inc(s,t) (IO*)SvREFCNT_inc(sv_dup((SV*)s,t))
9643#define gv_dup(s,t) (GV*)sv_dup((SV*)s,t)
9644#define gv_dup_inc(s,t) (GV*)SvREFCNT_inc(sv_dup((SV*)s,t))
6136c704
AL
9645#define SAVEPV(p) ((p) ? savepv(p) : NULL)
9646#define SAVEPVN(p,n) ((p) ? savepvn(p,n) : NULL)
8cf8f3d1 9647
199e78b7
DM
9648/* clone a parser */
9649
9650yy_parser *
9651Perl_parser_dup(pTHX_ const yy_parser *proto, CLONE_PARAMS* param)
9652{
9653 yy_parser *parser;
9654
9655 if (!proto)
9656 return NULL;
9657
7c197c94
DM
9658 /* look for it in the table first */
9659 parser = (yy_parser *)ptr_table_fetch(PL_ptr_table, proto);
9660 if (parser)
9661 return parser;
9662
9663 /* create anew and remember what it is */
199e78b7 9664 Newxz(parser, 1, yy_parser);
7c197c94 9665 ptr_table_store(PL_ptr_table, proto, parser);
199e78b7
DM
9666
9667 parser->yyerrstatus = 0;
9668 parser->yychar = YYEMPTY; /* Cause a token to be read. */
9669
9670 /* XXX these not yet duped */
9671 parser->old_parser = NULL;
9672 parser->stack = NULL;
9673 parser->ps = NULL;
9674 parser->stack_size = 0;
9675 /* XXX parser->stack->state = 0; */
9676
9677 /* XXX eventually, just Copy() most of the parser struct ? */
9678
9679 parser->lex_brackets = proto->lex_brackets;
9680 parser->lex_casemods = proto->lex_casemods;
9681 parser->lex_brackstack = savepvn(proto->lex_brackstack,
9682 (proto->lex_brackets < 120 ? 120 : proto->lex_brackets));
9683 parser->lex_casestack = savepvn(proto->lex_casestack,
9684 (proto->lex_casemods < 12 ? 12 : proto->lex_casemods));
9685 parser->lex_defer = proto->lex_defer;
9686 parser->lex_dojoin = proto->lex_dojoin;
9687 parser->lex_expect = proto->lex_expect;
9688 parser->lex_formbrack = proto->lex_formbrack;
9689 parser->lex_inpat = proto->lex_inpat;
9690 parser->lex_inwhat = proto->lex_inwhat;
9691 parser->lex_op = proto->lex_op;
9692 parser->lex_repl = sv_dup_inc(proto->lex_repl, param);
9693 parser->lex_starts = proto->lex_starts;
9694 parser->lex_stuff = sv_dup_inc(proto->lex_stuff, param);
9695 parser->multi_close = proto->multi_close;
9696 parser->multi_open = proto->multi_open;
9697 parser->multi_start = proto->multi_start;
670a9cb2 9698 parser->multi_end = proto->multi_end;
199e78b7
DM
9699 parser->pending_ident = proto->pending_ident;
9700 parser->preambled = proto->preambled;
9701 parser->sublex_info = proto->sublex_info; /* XXX not quite right */
bdc0bf6f 9702 parser->linestr = sv_dup_inc(proto->linestr, param);
53a7735b
DM
9703 parser->expect = proto->expect;
9704 parser->copline = proto->copline;
f06b5848 9705 parser->last_lop_op = proto->last_lop_op;
bc177e6b 9706 parser->lex_state = proto->lex_state;
2f9285f8 9707 parser->rsfp = fp_dup(proto->rsfp, '<', param);
5486870f
DM
9708 /* rsfp_filters entries have fake IoDIRP() */
9709 parser->rsfp_filters= av_dup_inc(proto->rsfp_filters, param);
12bd6ede
DM
9710 parser->in_my = proto->in_my;
9711 parser->in_my_stash = hv_dup(proto->in_my_stash, param);
13765c85 9712 parser->error_count = proto->error_count;
bc177e6b 9713
53a7735b 9714
f06b5848
DM
9715 parser->linestr = sv_dup_inc(proto->linestr, param);
9716
9717 {
1e05feb3
AL
9718 char * const ols = SvPVX(proto->linestr);
9719 char * const ls = SvPVX(parser->linestr);
f06b5848
DM
9720
9721 parser->bufptr = ls + (proto->bufptr >= ols ?
9722 proto->bufptr - ols : 0);
9723 parser->oldbufptr = ls + (proto->oldbufptr >= ols ?
9724 proto->oldbufptr - ols : 0);
9725 parser->oldoldbufptr= ls + (proto->oldoldbufptr >= ols ?
9726 proto->oldoldbufptr - ols : 0);
9727 parser->linestart = ls + (proto->linestart >= ols ?
9728 proto->linestart - ols : 0);
9729 parser->last_uni = ls + (proto->last_uni >= ols ?
9730 proto->last_uni - ols : 0);
9731 parser->last_lop = ls + (proto->last_lop >= ols ?
9732 proto->last_lop - ols : 0);
9733
9734 parser->bufend = ls + SvCUR(parser->linestr);
9735 }
199e78b7 9736
14047fc9
DM
9737 Copy(proto->tokenbuf, parser->tokenbuf, 256, char);
9738
2f9285f8 9739
199e78b7
DM
9740#ifdef PERL_MAD
9741 parser->endwhite = proto->endwhite;
9742 parser->faketokens = proto->faketokens;
9743 parser->lasttoke = proto->lasttoke;
9744 parser->nextwhite = proto->nextwhite;
9745 parser->realtokenstart = proto->realtokenstart;
9746 parser->skipwhite = proto->skipwhite;
9747 parser->thisclose = proto->thisclose;
9748 parser->thismad = proto->thismad;
9749 parser->thisopen = proto->thisopen;
9750 parser->thisstuff = proto->thisstuff;
9751 parser->thistoken = proto->thistoken;
9752 parser->thiswhite = proto->thiswhite;
fb205e7a
DM
9753
9754 Copy(proto->nexttoke, parser->nexttoke, 5, NEXTTOKE);
9755 parser->curforce = proto->curforce;
9756#else
9757 Copy(proto->nextval, parser->nextval, 5, YYSTYPE);
9758 Copy(proto->nexttype, parser->nexttype, 5, I32);
9759 parser->nexttoke = proto->nexttoke;
199e78b7
DM
9760#endif
9761 return parser;
9762}
9763
d2d73c3e 9764
d2d73c3e 9765/* duplicate a file handle */
645c22ef 9766
1d7c1841 9767PerlIO *
a8fc9800 9768Perl_fp_dup(pTHX_ PerlIO *fp, char type, CLONE_PARAMS *param)
1d7c1841
GS
9769{
9770 PerlIO *ret;
53c1dcc0
AL
9771
9772 PERL_UNUSED_ARG(type);
73d840c0 9773
1d7c1841
GS
9774 if (!fp)
9775 return (PerlIO*)NULL;
9776
9777 /* look for it in the table first */
9778 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
9779 if (ret)
9780 return ret;
9781
9782 /* create anew and remember what it is */
ecdeb87c 9783 ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
1d7c1841
GS
9784 ptr_table_store(PL_ptr_table, fp, ret);
9785 return ret;
9786}
9787
645c22ef
DM
9788/* duplicate a directory handle */
9789
1d7c1841
GS
9790DIR *
9791Perl_dirp_dup(pTHX_ DIR *dp)
9792{
96a5add6 9793 PERL_UNUSED_CONTEXT;
1d7c1841
GS
9794 if (!dp)
9795 return (DIR*)NULL;
9796 /* XXX TODO */
9797 return dp;
9798}
9799
ff276b08 9800/* duplicate a typeglob */
645c22ef 9801
1d7c1841 9802GP *
a8fc9800 9803Perl_gp_dup(pTHX_ GP *gp, CLONE_PARAMS* param)
1d7c1841
GS
9804{
9805 GP *ret;
b37c2d43 9806
1d7c1841
GS
9807 if (!gp)
9808 return (GP*)NULL;
9809 /* look for it in the table first */
9810 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
9811 if (ret)
9812 return ret;
9813
9814 /* create anew and remember what it is */
a02a5408 9815 Newxz(ret, 1, GP);
1d7c1841
GS
9816 ptr_table_store(PL_ptr_table, gp, ret);
9817
9818 /* clone */
9819 ret->gp_refcnt = 0; /* must be before any other dups! */
d2d73c3e
AB
9820 ret->gp_sv = sv_dup_inc(gp->gp_sv, param);
9821 ret->gp_io = io_dup_inc(gp->gp_io, param);
9822 ret->gp_form = cv_dup_inc(gp->gp_form, param);
9823 ret->gp_av = av_dup_inc(gp->gp_av, param);
9824 ret->gp_hv = hv_dup_inc(gp->gp_hv, param);
9825 ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
9826 ret->gp_cv = cv_dup_inc(gp->gp_cv, param);
1d7c1841 9827 ret->gp_cvgen = gp->gp_cvgen;
1d7c1841 9828 ret->gp_line = gp->gp_line;
f4890806 9829 ret->gp_file_hek = hek_dup(gp->gp_file_hek, param);
1d7c1841
GS
9830 return ret;
9831}
9832
645c22ef
DM
9833/* duplicate a chain of magic */
9834
1d7c1841 9835MAGIC *
a8fc9800 9836Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS* param)
1d7c1841 9837{
cb359b41
JH
9838 MAGIC *mgprev = (MAGIC*)NULL;
9839 MAGIC *mgret;
1d7c1841
GS
9840 if (!mg)
9841 return (MAGIC*)NULL;
9842 /* look for it in the table first */
9843 mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
9844 if (mgret)
9845 return mgret;
9846
9847 for (; mg; mg = mg->mg_moremagic) {
9848 MAGIC *nmg;
a02a5408 9849 Newxz(nmg, 1, MAGIC);
cb359b41 9850 if (mgprev)
1d7c1841 9851 mgprev->mg_moremagic = nmg;
cb359b41
JH
9852 else
9853 mgret = nmg;
1d7c1841
GS
9854 nmg->mg_virtual = mg->mg_virtual; /* XXX copy dynamic vtable? */
9855 nmg->mg_private = mg->mg_private;
9856 nmg->mg_type = mg->mg_type;
9857 nmg->mg_flags = mg->mg_flags;
288b8c02 9858 /* FIXME for plugins
14befaf4 9859 if (mg->mg_type == PERL_MAGIC_qr) {
f8149455 9860 nmg->mg_obj = (SV*)CALLREGDUPE((REGEXP*)mg->mg_obj, param);
1d7c1841 9861 }
288b8c02
NC
9862 else
9863 */
9864 if(mg->mg_type == PERL_MAGIC_backref) {
d7cbc7b5
NC
9865 /* The backref AV has its reference count deliberately bumped by
9866 1. */
9867 nmg->mg_obj = SvREFCNT_inc(av_dup_inc((AV*) mg->mg_obj, param));
05bd4103 9868 }
1d7c1841
GS
9869 else {
9870 nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
d2d73c3e
AB
9871 ? sv_dup_inc(mg->mg_obj, param)
9872 : sv_dup(mg->mg_obj, param);
1d7c1841
GS
9873 }
9874 nmg->mg_len = mg->mg_len;
9875 nmg->mg_ptr = mg->mg_ptr; /* XXX random ptr? */
14befaf4 9876 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
68795e93 9877 if (mg->mg_len > 0) {
1d7c1841 9878 nmg->mg_ptr = SAVEPVN(mg->mg_ptr, mg->mg_len);
14befaf4
DM
9879 if (mg->mg_type == PERL_MAGIC_overload_table &&
9880 AMT_AMAGIC((AMT*)mg->mg_ptr))
9881 {
c445ea15 9882 const AMT * const amtp = (AMT*)mg->mg_ptr;
0bcc34c2 9883 AMT * const namtp = (AMT*)nmg->mg_ptr;
1d7c1841
GS
9884 I32 i;
9885 for (i = 1; i < NofAMmeth; i++) {
d2d73c3e 9886 namtp->table[i] = cv_dup_inc(amtp->table[i], param);
1d7c1841
GS
9887 }
9888 }
9889 }
9890 else if (mg->mg_len == HEf_SVKEY)
d2d73c3e 9891 nmg->mg_ptr = (char*)sv_dup_inc((SV*)mg->mg_ptr, param);
1d7c1841 9892 }
68795e93
NIS
9893 if ((mg->mg_flags & MGf_DUP) && mg->mg_virtual && mg->mg_virtual->svt_dup) {
9894 CALL_FPTR(nmg->mg_virtual->svt_dup)(aTHX_ nmg, param);
9895 }
1d7c1841
GS
9896 mgprev = nmg;
9897 }
9898 return mgret;
9899}
9900
4674ade5
NC
9901#endif /* USE_ITHREADS */
9902
645c22ef
DM
9903/* create a new pointer-mapping table */
9904
1d7c1841
GS
9905PTR_TBL_t *
9906Perl_ptr_table_new(pTHX)
9907{
9908 PTR_TBL_t *tbl;
96a5add6
AL
9909 PERL_UNUSED_CONTEXT;
9910
a02a5408 9911 Newxz(tbl, 1, PTR_TBL_t);
1d7c1841
GS
9912 tbl->tbl_max = 511;
9913 tbl->tbl_items = 0;
a02a5408 9914 Newxz(tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
1d7c1841
GS
9915 return tbl;
9916}
9917
7119fd33
NC
9918#define PTR_TABLE_HASH(ptr) \
9919 ((PTR2UV(ptr) >> 3) ^ (PTR2UV(ptr) >> (3 + 7)) ^ (PTR2UV(ptr) >> (3 + 17)))
134ca3d6 9920
93e68bfb
JC
9921/*
9922 we use the PTE_SVSLOT 'reservation' made above, both here (in the
9923 following define) and at call to new_body_inline made below in
9924 Perl_ptr_table_store()
9925 */
9926
9927#define del_pte(p) del_body_type(p, PTE_SVSLOT)
32e691d0 9928
645c22ef
DM
9929/* map an existing pointer using a table */
9930
7bf61b54 9931STATIC PTR_TBL_ENT_t *
b0e6ae5b 9932S_ptr_table_find(PTR_TBL_t *tbl, const void *sv) {
1d7c1841 9933 PTR_TBL_ENT_t *tblent;
4373e329 9934 const UV hash = PTR_TABLE_HASH(sv);
1d7c1841
GS
9935 assert(tbl);
9936 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
9937 for (; tblent; tblent = tblent->next) {
9938 if (tblent->oldval == sv)
7bf61b54 9939 return tblent;
1d7c1841 9940 }
d4c19fe8 9941 return NULL;
7bf61b54
NC
9942}
9943
9944void *
9945Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, const void *sv)
9946{
b0e6ae5b 9947 PTR_TBL_ENT_t const *const tblent = ptr_table_find(tbl, sv);
96a5add6 9948 PERL_UNUSED_CONTEXT;
d4c19fe8 9949 return tblent ? tblent->newval : NULL;
1d7c1841
GS
9950}
9951
645c22ef
DM
9952/* add a new entry to a pointer-mapping table */
9953
1d7c1841 9954void
44f8325f 9955Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, const void *oldsv, void *newsv)
1d7c1841 9956{
0c9fdfe0 9957 PTR_TBL_ENT_t *tblent = ptr_table_find(tbl, oldsv);
96a5add6 9958 PERL_UNUSED_CONTEXT;
1d7c1841 9959
7bf61b54
NC
9960 if (tblent) {
9961 tblent->newval = newsv;
9962 } else {
9963 const UV entry = PTR_TABLE_HASH(oldsv) & tbl->tbl_max;
9964
d2a0f284
JC
9965 new_body_inline(tblent, PTE_SVSLOT);
9966
7bf61b54
NC
9967 tblent->oldval = oldsv;
9968 tblent->newval = newsv;
9969 tblent->next = tbl->tbl_ary[entry];
9970 tbl->tbl_ary[entry] = tblent;
9971 tbl->tbl_items++;
9972 if (tblent->next && tbl->tbl_items > tbl->tbl_max)
9973 ptr_table_split(tbl);
1d7c1841 9974 }
1d7c1841
GS
9975}
9976
645c22ef
DM
9977/* double the hash bucket size of an existing ptr table */
9978
1d7c1841
GS
9979void
9980Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
9981{
9982 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
4373e329 9983 const UV oldsize = tbl->tbl_max + 1;
1d7c1841
GS
9984 UV newsize = oldsize * 2;
9985 UV i;
96a5add6 9986 PERL_UNUSED_CONTEXT;
1d7c1841
GS
9987
9988 Renew(ary, newsize, PTR_TBL_ENT_t*);
9989 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
9990 tbl->tbl_max = --newsize;
9991 tbl->tbl_ary = ary;
9992 for (i=0; i < oldsize; i++, ary++) {
9993 PTR_TBL_ENT_t **curentp, **entp, *ent;
9994 if (!*ary)
9995 continue;
9996 curentp = ary + oldsize;
9997 for (entp = ary, ent = *ary; ent; ent = *entp) {
134ca3d6 9998 if ((newsize & PTR_TABLE_HASH(ent->oldval)) != i) {
1d7c1841
GS
9999 *entp = ent->next;
10000 ent->next = *curentp;
10001 *curentp = ent;
10002 continue;
10003 }
10004 else
10005 entp = &ent->next;
10006 }
10007 }
10008}
10009
645c22ef
DM
10010/* remove all the entries from a ptr table */
10011
a0739874
DM
10012void
10013Perl_ptr_table_clear(pTHX_ PTR_TBL_t *tbl)
10014{
d5cefff9 10015 if (tbl && tbl->tbl_items) {
c445ea15 10016 register PTR_TBL_ENT_t * const * const array = tbl->tbl_ary;
d5cefff9 10017 UV riter = tbl->tbl_max;
a0739874 10018
d5cefff9
NC
10019 do {
10020 PTR_TBL_ENT_t *entry = array[riter];
ab1e7f95 10021
d5cefff9 10022 while (entry) {
00b6aa41 10023 PTR_TBL_ENT_t * const oentry = entry;
d5cefff9
NC
10024 entry = entry->next;
10025 del_pte(oentry);
10026 }
10027 } while (riter--);
a0739874 10028
d5cefff9
NC
10029 tbl->tbl_items = 0;
10030 }
a0739874
DM
10031}
10032
645c22ef
DM
10033/* clear and free a ptr table */
10034
a0739874
DM
10035void
10036Perl_ptr_table_free(pTHX_ PTR_TBL_t *tbl)
10037{
10038 if (!tbl) {
10039 return;
10040 }
10041 ptr_table_clear(tbl);
10042 Safefree(tbl->tbl_ary);
10043 Safefree(tbl);
10044}
10045
4674ade5 10046#if defined(USE_ITHREADS)
5bd07a3d 10047
83841fad 10048void
eb86f8b3 10049Perl_rvpv_dup(pTHX_ SV *dstr, const SV *sstr, CLONE_PARAMS* param)
83841fad
NIS
10050{
10051 if (SvROK(sstr)) {
b162af07
SP
10052 SvRV_set(dstr, SvWEAKREF(sstr)
10053 ? sv_dup(SvRV(sstr), param)
10054 : sv_dup_inc(SvRV(sstr), param));
f880fe2f 10055
83841fad 10056 }
3f7c398e 10057 else if (SvPVX_const(sstr)) {
83841fad
NIS
10058 /* Has something there */
10059 if (SvLEN(sstr)) {
68795e93 10060 /* Normal PV - clone whole allocated space */
3f7c398e 10061 SvPV_set(dstr, SAVEPVN(SvPVX_const(sstr), SvLEN(sstr)-1));
d3d0e6f1
NC
10062 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
10063 /* Not that normal - actually sstr is copy on write.
10064 But we are a true, independant SV, so: */
10065 SvREADONLY_off(dstr);
10066 SvFAKE_off(dstr);
10067 }
68795e93 10068 }
83841fad
NIS
10069 else {
10070 /* Special case - not normally malloced for some reason */
f7877b28
NC
10071 if (isGV_with_GP(sstr)) {
10072 /* Don't need to do anything here. */
10073 }
10074 else if ((SvREADONLY(sstr) && SvFAKE(sstr))) {
ef10be65
NC
10075 /* A "shared" PV - clone it as "shared" PV */
10076 SvPV_set(dstr,
10077 HEK_KEY(hek_dup(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)),
10078 param)));
83841fad
NIS
10079 }
10080 else {
10081 /* Some other special case - random pointer */
f880fe2f 10082 SvPV_set(dstr, SvPVX(sstr));
d3d0e6f1 10083 }
83841fad
NIS
10084 }
10085 }
10086 else {
4608196e 10087 /* Copy the NULL */
4df7f6af 10088 SvPV_set(dstr, NULL);
83841fad
NIS
10089 }
10090}
10091
662fb8b2
NC
10092/* duplicate an SV of any type (including AV, HV etc) */
10093
1d7c1841 10094SV *
eb86f8b3 10095Perl_sv_dup(pTHX_ const SV *sstr, CLONE_PARAMS* param)
1d7c1841 10096{
27da23d5 10097 dVAR;
1d7c1841
GS
10098 SV *dstr;
10099
10100 if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
6136c704 10101 return NULL;
1d7c1841
GS
10102 /* look for it in the table first */
10103 dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
10104 if (dstr)
10105 return dstr;
10106
0405e91e
AB
10107 if(param->flags & CLONEf_JOIN_IN) {
10108 /** We are joining here so we don't want do clone
10109 something that is bad **/
eb86f8b3 10110 if (SvTYPE(sstr) == SVt_PVHV) {
9bde8eb0 10111 const HEK * const hvname = HvNAME_HEK(sstr);
eb86f8b3
AL
10112 if (hvname)
10113 /** don't clone stashes if they already exist **/
9bde8eb0 10114 return (SV*)gv_stashpvn(HEK_KEY(hvname), HEK_LEN(hvname), 0);
0405e91e
AB
10115 }
10116 }
10117
1d7c1841
GS
10118 /* create anew and remember what it is */
10119 new_SV(dstr);
fd0854ff
DM
10120
10121#ifdef DEBUG_LEAKING_SCALARS
10122 dstr->sv_debug_optype = sstr->sv_debug_optype;
10123 dstr->sv_debug_line = sstr->sv_debug_line;
10124 dstr->sv_debug_inpad = sstr->sv_debug_inpad;
10125 dstr->sv_debug_cloned = 1;
fd0854ff 10126 dstr->sv_debug_file = savepv(sstr->sv_debug_file);
fd0854ff
DM
10127#endif
10128
1d7c1841
GS
10129 ptr_table_store(PL_ptr_table, sstr, dstr);
10130
10131 /* clone */
10132 SvFLAGS(dstr) = SvFLAGS(sstr);
10133 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
10134 SvREFCNT(dstr) = 0; /* must be before any other dups! */
10135
10136#ifdef DEBUGGING
3f7c398e 10137 if (SvANY(sstr) && PL_watch_pvx && SvPVX_const(sstr) == PL_watch_pvx)
1d7c1841 10138 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
6c9570dc 10139 (void*)PL_watch_pvx, SvPVX_const(sstr));
1d7c1841
GS
10140#endif
10141
9660f481
DM
10142 /* don't clone objects whose class has asked us not to */
10143 if (SvOBJECT(sstr) && ! (SvFLAGS(SvSTASH(sstr)) & SVphv_CLONEABLE)) {
33de8e4a 10144 SvFLAGS(dstr) = 0;
9660f481
DM
10145 return dstr;
10146 }
10147
1d7c1841
GS
10148 switch (SvTYPE(sstr)) {
10149 case SVt_NULL:
10150 SvANY(dstr) = NULL;
10151 break;
10152 case SVt_IV:
339049b0 10153 SvANY(dstr) = (XPVIV*)((char*)&(dstr->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
4df7f6af
NC
10154 if(SvROK(sstr)) {
10155 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
10156 } else {
10157 SvIV_set(dstr, SvIVX(sstr));
10158 }
1d7c1841
GS
10159 break;
10160 case SVt_NV:
10161 SvANY(dstr) = new_XNV();
9d6ce603 10162 SvNV_set(dstr, SvNVX(sstr));
1d7c1841 10163 break;
cecf5685 10164 /* case SVt_BIND: */
662fb8b2
NC
10165 default:
10166 {
10167 /* These are all the types that need complex bodies allocating. */
662fb8b2 10168 void *new_body;
2bcc16b3
NC
10169 const svtype sv_type = SvTYPE(sstr);
10170 const struct body_details *const sv_type_details
10171 = bodies_by_type + sv_type;
662fb8b2 10172
93e68bfb 10173 switch (sv_type) {
662fb8b2 10174 default:
bb263b4e 10175 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
662fb8b2
NC
10176 break;
10177
662fb8b2
NC
10178 case SVt_PVGV:
10179 if (GvUNIQUE((GV*)sstr)) {
6f207bd3 10180 NOOP; /* Do sharing here, and fall through */
662fb8b2 10181 }
c22188b4
NC
10182 case SVt_PVIO:
10183 case SVt_PVFM:
10184 case SVt_PVHV:
10185 case SVt_PVAV:
662fb8b2 10186 case SVt_PVCV:
662fb8b2 10187 case SVt_PVLV:
5c35adbb 10188 case SVt_REGEXP:
662fb8b2 10189 case SVt_PVMG:
662fb8b2 10190 case SVt_PVNV:
662fb8b2 10191 case SVt_PVIV:
662fb8b2 10192 case SVt_PV:
d2a0f284 10193 assert(sv_type_details->body_size);
c22188b4 10194 if (sv_type_details->arena) {
d2a0f284 10195 new_body_inline(new_body, sv_type);
c22188b4 10196 new_body
b9502f15 10197 = (void*)((char*)new_body - sv_type_details->offset);
c22188b4
NC
10198 } else {
10199 new_body = new_NOARENA(sv_type_details);
10200 }
1d7c1841 10201 }
662fb8b2
NC
10202 assert(new_body);
10203 SvANY(dstr) = new_body;
10204
2bcc16b3 10205#ifndef PURIFY
b9502f15
NC
10206 Copy(((char*)SvANY(sstr)) + sv_type_details->offset,
10207 ((char*)SvANY(dstr)) + sv_type_details->offset,
f32993d6 10208 sv_type_details->copy, char);
2bcc16b3
NC
10209#else
10210 Copy(((char*)SvANY(sstr)),
10211 ((char*)SvANY(dstr)),
d2a0f284 10212 sv_type_details->body_size + sv_type_details->offset, char);
2bcc16b3 10213#endif
662fb8b2 10214
f7877b28
NC
10215 if (sv_type != SVt_PVAV && sv_type != SVt_PVHV
10216 && !isGV_with_GP(dstr))
662fb8b2
NC
10217 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
10218
10219 /* The Copy above means that all the source (unduplicated) pointers
10220 are now in the destination. We can check the flags and the
10221 pointers in either, but it's possible that there's less cache
10222 missing by always going for the destination.
10223 FIXME - instrument and check that assumption */
f32993d6 10224 if (sv_type >= SVt_PVMG) {
885ffcb3 10225 if ((sv_type == SVt_PVMG) && SvPAD_OUR(dstr)) {
73d95100 10226 SvOURSTASH_set(dstr, hv_dup_inc(SvOURSTASH(dstr), param));
e736a858 10227 } else if (SvMAGIC(dstr))
662fb8b2
NC
10228 SvMAGIC_set(dstr, mg_dup(SvMAGIC(dstr), param));
10229 if (SvSTASH(dstr))
10230 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(dstr), param));
1d7c1841 10231 }
662fb8b2 10232
f32993d6
NC
10233 /* The cast silences a GCC warning about unhandled types. */
10234 switch ((int)sv_type) {
662fb8b2
NC
10235 case SVt_PV:
10236 break;
10237 case SVt_PVIV:
10238 break;
10239 case SVt_PVNV:
10240 break;
10241 case SVt_PVMG:
10242 break;
5c35adbb 10243 case SVt_REGEXP:
288b8c02
NC
10244 /* FIXME for plugins */
10245 re_dup_guts(sstr, dstr, param);
f708cfc1 10246 break;
662fb8b2
NC
10247 case SVt_PVLV:
10248 /* XXX LvTARGOFF sometimes holds PMOP* when DEBUGGING */
10249 if (LvTYPE(dstr) == 't') /* for tie: unrefcnted fake (SV**) */
10250 LvTARG(dstr) = dstr;
10251 else if (LvTYPE(dstr) == 'T') /* for tie: fake HE */
10252 LvTARG(dstr) = (SV*)he_dup((HE*)LvTARG(dstr), 0, param);
10253 else
10254 LvTARG(dstr) = sv_dup_inc(LvTARG(dstr), param);
662fb8b2 10255 case SVt_PVGV:
cecf5685
NC
10256 if(isGV_with_GP(sstr)) {
10257 if (GvNAME_HEK(dstr))
10258 GvNAME_HEK(dstr) = hek_dup(GvNAME_HEK(dstr), param);
39cb70dc
NC
10259 /* Don't call sv_add_backref here as it's going to be
10260 created as part of the magic cloning of the symbol
10261 table. */
f7877b28
NC
10262 /* Danger Will Robinson - GvGP(dstr) isn't initialised
10263 at the point of this comment. */
39cb70dc 10264 GvSTASH(dstr) = hv_dup(GvSTASH(dstr), param);
f7877b28
NC
10265 GvGP(dstr) = gp_dup(GvGP(sstr), param);
10266 (void)GpREFCNT_inc(GvGP(dstr));
10267 } else
10268 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
662fb8b2
NC
10269 break;
10270 case SVt_PVIO:
10271 IoIFP(dstr) = fp_dup(IoIFP(dstr), IoTYPE(dstr), param);
10272 if (IoOFP(dstr) == IoIFP(sstr))
10273 IoOFP(dstr) = IoIFP(dstr);
10274 else
10275 IoOFP(dstr) = fp_dup(IoOFP(dstr), IoTYPE(dstr), param);
5486870f 10276 /* PL_parser->rsfp_filters entries have fake IoDIRP() */
662fb8b2
NC
10277 if(IoFLAGS(dstr) & IOf_FAKE_DIRP) {
10278 /* I have no idea why fake dirp (rsfps)
10279 should be treated differently but otherwise
10280 we end up with leaks -- sky*/
10281 IoTOP_GV(dstr) = gv_dup_inc(IoTOP_GV(dstr), param);
10282 IoFMT_GV(dstr) = gv_dup_inc(IoFMT_GV(dstr), param);
10283 IoBOTTOM_GV(dstr) = gv_dup_inc(IoBOTTOM_GV(dstr), param);
10284 } else {
10285 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(dstr), param);
10286 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(dstr), param);
10287 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(dstr), param);
100ce7e1
NC
10288 if (IoDIRP(dstr)) {
10289 IoDIRP(dstr) = dirp_dup(IoDIRP(dstr));
10290 } else {
6f207bd3 10291 NOOP;
100ce7e1
NC
10292 /* IoDIRP(dstr) is already a copy of IoDIRP(sstr) */
10293 }
662fb8b2
NC
10294 }
10295 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(dstr));
10296 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(dstr));
10297 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(dstr));
10298 break;
10299 case SVt_PVAV:
10300 if (AvARRAY((AV*)sstr)) {
10301 SV **dst_ary, **src_ary;
10302 SSize_t items = AvFILLp((AV*)sstr) + 1;
10303
10304 src_ary = AvARRAY((AV*)sstr);
a02a5408 10305 Newxz(dst_ary, AvMAX((AV*)sstr)+1, SV*);
662fb8b2 10306 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
9c6bc640 10307 AvARRAY((AV*)dstr) = dst_ary;
662fb8b2
NC
10308 AvALLOC((AV*)dstr) = dst_ary;
10309 if (AvREAL((AV*)sstr)) {
10310 while (items-- > 0)
10311 *dst_ary++ = sv_dup_inc(*src_ary++, param);
10312 }
10313 else {
10314 while (items-- > 0)
10315 *dst_ary++ = sv_dup(*src_ary++, param);
10316 }
10317 items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
10318 while (items-- > 0) {
10319 *dst_ary++ = &PL_sv_undef;
10320 }
bfcb3514 10321 }
662fb8b2 10322 else {
9c6bc640 10323 AvARRAY((AV*)dstr) = NULL;
662fb8b2 10324 AvALLOC((AV*)dstr) = (SV**)NULL;
b79f7545 10325 }
662fb8b2
NC
10326 break;
10327 case SVt_PVHV:
7e265ef3
AL
10328 if (HvARRAY((HV*)sstr)) {
10329 STRLEN i = 0;
10330 const bool sharekeys = !!HvSHAREKEYS(sstr);
10331 XPVHV * const dxhv = (XPVHV*)SvANY(dstr);
10332 XPVHV * const sxhv = (XPVHV*)SvANY(sstr);
10333 char *darray;
10334 Newx(darray, PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1)
10335 + (SvOOK(sstr) ? sizeof(struct xpvhv_aux) : 0),
10336 char);
10337 HvARRAY(dstr) = (HE**)darray;
10338 while (i <= sxhv->xhv_max) {
10339 const HE * const source = HvARRAY(sstr)[i];
10340 HvARRAY(dstr)[i] = source
10341 ? he_dup(source, sharekeys, param) : 0;
10342 ++i;
10343 }
10344 if (SvOOK(sstr)) {
10345 HEK *hvname;
10346 const struct xpvhv_aux * const saux = HvAUX(sstr);
10347 struct xpvhv_aux * const daux = HvAUX(dstr);
10348 /* This flag isn't copied. */
10349 /* SvOOK_on(hv) attacks the IV flags. */
10350 SvFLAGS(dstr) |= SVf_OOK;
10351
10352 hvname = saux->xhv_name;
10353 daux->xhv_name = hvname ? hek_dup(hvname, param) : hvname;
10354
10355 daux->xhv_riter = saux->xhv_riter;
10356 daux->xhv_eiter = saux->xhv_eiter
10357 ? he_dup(saux->xhv_eiter,
10358 (bool)!!HvSHAREKEYS(sstr), param) : 0;
10359 daux->xhv_backreferences =
10360 saux->xhv_backreferences
86f55936 10361 ? (AV*) SvREFCNT_inc(
7e265ef3 10362 sv_dup((SV*)saux->xhv_backreferences, param))
86f55936 10363 : 0;
e1a479c5
BB
10364
10365 daux->xhv_mro_meta = saux->xhv_mro_meta
10366 ? mro_meta_dup(saux->xhv_mro_meta, param)
10367 : 0;
10368
7e265ef3
AL
10369 /* Record stashes for possible cloning in Perl_clone(). */
10370 if (hvname)
10371 av_push(param->stashes, dstr);
662fb8b2 10372 }
662fb8b2 10373 }
7e265ef3 10374 else
797c7171 10375 HvARRAY((HV*)dstr) = NULL;
662fb8b2 10376 break;
662fb8b2 10377 case SVt_PVCV:
bb172083
NC
10378 if (!(param->flags & CLONEf_COPY_STACKS)) {
10379 CvDEPTH(dstr) = 0;
10380 }
10381 case SVt_PVFM:
662fb8b2
NC
10382 /* NOTE: not refcounted */
10383 CvSTASH(dstr) = hv_dup(CvSTASH(dstr), param);
10384 OP_REFCNT_LOCK;
d04ba589
NC
10385 if (!CvISXSUB(dstr))
10386 CvROOT(dstr) = OpREFCNT_inc(CvROOT(dstr));
662fb8b2 10387 OP_REFCNT_UNLOCK;
cfae286e 10388 if (CvCONST(dstr) && CvISXSUB(dstr)) {
662fb8b2
NC
10389 CvXSUBANY(dstr).any_ptr = GvUNIQUE(CvGV(dstr)) ?
10390 SvREFCNT_inc(CvXSUBANY(dstr).any_ptr) :
10391 sv_dup_inc((SV *)CvXSUBANY(dstr).any_ptr, param);
10392 }
10393 /* don't dup if copying back - CvGV isn't refcounted, so the
10394 * duped GV may never be freed. A bit of a hack! DAPM */
10395 CvGV(dstr) = (param->flags & CLONEf_JOIN_IN) ?
a0714e2c 10396 NULL : gv_dup(CvGV(dstr), param) ;
662fb8b2
NC
10397 PAD_DUP(CvPADLIST(dstr), CvPADLIST(sstr), param);
10398 CvOUTSIDE(dstr) =
10399 CvWEAKOUTSIDE(sstr)
10400 ? cv_dup( CvOUTSIDE(dstr), param)
10401 : cv_dup_inc(CvOUTSIDE(dstr), param);
aed2304a 10402 if (!CvISXSUB(dstr))
662fb8b2
NC
10403 CvFILE(dstr) = SAVEPV(CvFILE(dstr));
10404 break;
bfcb3514 10405 }
1d7c1841 10406 }
1d7c1841
GS
10407 }
10408
10409 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
10410 ++PL_sv_objcount;
10411
10412 return dstr;
d2d73c3e 10413 }
1d7c1841 10414
645c22ef
DM
10415/* duplicate a context */
10416
1d7c1841 10417PERL_CONTEXT *
a8fc9800 10418Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
1d7c1841
GS
10419{
10420 PERL_CONTEXT *ncxs;
10421
10422 if (!cxs)
10423 return (PERL_CONTEXT*)NULL;
10424
10425 /* look for it in the table first */
10426 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
10427 if (ncxs)
10428 return ncxs;
10429
10430 /* create anew and remember what it is */
a02a5408 10431 Newxz(ncxs, max + 1, PERL_CONTEXT);
1d7c1841
GS
10432 ptr_table_store(PL_ptr_table, cxs, ncxs);
10433
10434 while (ix >= 0) {
c445ea15
AL
10435 PERL_CONTEXT * const cx = &cxs[ix];
10436 PERL_CONTEXT * const ncx = &ncxs[ix];
1d7c1841
GS
10437 ncx->cx_type = cx->cx_type;
10438 if (CxTYPE(cx) == CXt_SUBST) {
10439 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
10440 }
10441 else {
10442 ncx->blk_oldsp = cx->blk_oldsp;
10443 ncx->blk_oldcop = cx->blk_oldcop;
1d7c1841
GS
10444 ncx->blk_oldmarksp = cx->blk_oldmarksp;
10445 ncx->blk_oldscopesp = cx->blk_oldscopesp;
10446 ncx->blk_oldpm = cx->blk_oldpm;
10447 ncx->blk_gimme = cx->blk_gimme;
10448 switch (CxTYPE(cx)) {
10449 case CXt_SUB:
10450 ncx->blk_sub.cv = (cx->blk_sub.olddepth == 0
d2d73c3e
AB
10451 ? cv_dup_inc(cx->blk_sub.cv, param)
10452 : cv_dup(cx->blk_sub.cv,param));
cc8d50a7 10453 ncx->blk_sub.argarray = (cx->blk_sub.hasargs
d2d73c3e 10454 ? av_dup_inc(cx->blk_sub.argarray, param)
7d49f689 10455 : NULL);
d2d73c3e 10456 ncx->blk_sub.savearray = av_dup_inc(cx->blk_sub.savearray, param);
1d7c1841 10457 ncx->blk_sub.olddepth = cx->blk_sub.olddepth;
cc8d50a7
NC
10458 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
10459 ncx->blk_sub.lval = cx->blk_sub.lval;
f39bc417 10460 ncx->blk_sub.retop = cx->blk_sub.retop;
d8d97e70
DM
10461 ncx->blk_sub.oldcomppad = (PAD*)ptr_table_fetch(PL_ptr_table,
10462 cx->blk_sub.oldcomppad);
1d7c1841
GS
10463 break;
10464 case CXt_EVAL:
10465 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
10466 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
b47cad08 10467 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv, param);
1d7c1841 10468 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
d2d73c3e 10469 ncx->blk_eval.cur_text = sv_dup(cx->blk_eval.cur_text, param);
f39bc417 10470 ncx->blk_eval.retop = cx->blk_eval.retop;
1d7c1841
GS
10471 break;
10472 case CXt_LOOP:
10473 ncx->blk_loop.label = cx->blk_loop.label;
10474 ncx->blk_loop.resetsp = cx->blk_loop.resetsp;
022eaa24 10475 ncx->blk_loop.my_op = cx->blk_loop.my_op;
1d7c1841
GS
10476 ncx->blk_loop.iterdata = (CxPADLOOP(cx)
10477 ? cx->blk_loop.iterdata
d2d73c3e 10478 : gv_dup((GV*)cx->blk_loop.iterdata, param));
f3548bdc
DM
10479 ncx->blk_loop.oldcomppad
10480 = (PAD*)ptr_table_fetch(PL_ptr_table,
10481 cx->blk_loop.oldcomppad);
d2d73c3e
AB
10482 ncx->blk_loop.itersave = sv_dup_inc(cx->blk_loop.itersave, param);
10483 ncx->blk_loop.iterlval = sv_dup_inc(cx->blk_loop.iterlval, param);
10484 ncx->blk_loop.iterary = av_dup_inc(cx->blk_loop.iterary, param);
1d7c1841
GS
10485 ncx->blk_loop.iterix = cx->blk_loop.iterix;
10486 ncx->blk_loop.itermax = cx->blk_loop.itermax;
10487 break;
10488 case CXt_FORMAT:
d2d73c3e
AB
10489 ncx->blk_sub.cv = cv_dup(cx->blk_sub.cv, param);
10490 ncx->blk_sub.gv = gv_dup(cx->blk_sub.gv, param);
10491 ncx->blk_sub.dfoutgv = gv_dup_inc(cx->blk_sub.dfoutgv, param);
cc8d50a7 10492 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
f39bc417 10493 ncx->blk_sub.retop = cx->blk_sub.retop;
1d7c1841
GS
10494 break;
10495 case CXt_BLOCK:
10496 case CXt_NULL:
10497 break;
10498 }
10499 }
10500 --ix;
10501 }
10502 return ncxs;
10503}
10504
645c22ef
DM
10505/* duplicate a stack info structure */
10506
1d7c1841 10507PERL_SI *
a8fc9800 10508Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
1d7c1841
GS
10509{
10510 PERL_SI *nsi;
10511
10512 if (!si)
10513 return (PERL_SI*)NULL;
10514
10515 /* look for it in the table first */
10516 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
10517 if (nsi)
10518 return nsi;
10519
10520 /* create anew and remember what it is */
a02a5408 10521 Newxz(nsi, 1, PERL_SI);
1d7c1841
GS
10522 ptr_table_store(PL_ptr_table, si, nsi);
10523
d2d73c3e 10524 nsi->si_stack = av_dup_inc(si->si_stack, param);
1d7c1841
GS
10525 nsi->si_cxix = si->si_cxix;
10526 nsi->si_cxmax = si->si_cxmax;
d2d73c3e 10527 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
1d7c1841 10528 nsi->si_type = si->si_type;
d2d73c3e
AB
10529 nsi->si_prev = si_dup(si->si_prev, param);
10530 nsi->si_next = si_dup(si->si_next, param);
1d7c1841
GS
10531 nsi->si_markoff = si->si_markoff;
10532
10533 return nsi;
10534}
10535
10536#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
10537#define TOPINT(ss,ix) ((ss)[ix].any_i32)
10538#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
10539#define TOPLONG(ss,ix) ((ss)[ix].any_long)
10540#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
10541#define TOPIV(ss,ix) ((ss)[ix].any_iv)
38d8b13e
HS
10542#define POPBOOL(ss,ix) ((ss)[--(ix)].any_bool)
10543#define TOPBOOL(ss,ix) ((ss)[ix].any_bool)
1d7c1841
GS
10544#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
10545#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
10546#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
10547#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
10548#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
10549#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
10550
10551/* XXXXX todo */
10552#define pv_dup_inc(p) SAVEPV(p)
10553#define pv_dup(p) SAVEPV(p)
10554#define svp_dup_inc(p,pp) any_dup(p,pp)
10555
645c22ef
DM
10556/* map any object to the new equivent - either something in the
10557 * ptr table, or something in the interpreter structure
10558 */
10559
1d7c1841 10560void *
53c1dcc0 10561Perl_any_dup(pTHX_ void *v, const PerlInterpreter *proto_perl)
1d7c1841
GS
10562{
10563 void *ret;
10564
10565 if (!v)
10566 return (void*)NULL;
10567
10568 /* look for it in the table first */
10569 ret = ptr_table_fetch(PL_ptr_table, v);
10570 if (ret)
10571 return ret;
10572
10573 /* see if it is part of the interpreter structure */
10574 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
acfe0abc 10575 ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
05ec9bb3 10576 else {
1d7c1841 10577 ret = v;
05ec9bb3 10578 }
1d7c1841
GS
10579
10580 return ret;
10581}
10582
645c22ef
DM
10583/* duplicate the save stack */
10584
1d7c1841 10585ANY *
a8fc9800 10586Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
1d7c1841 10587{
53d44271 10588 dVAR;
907b3e23
DM
10589 ANY * const ss = proto_perl->Isavestack;
10590 const I32 max = proto_perl->Isavestack_max;
10591 I32 ix = proto_perl->Isavestack_ix;
1d7c1841
GS
10592 ANY *nss;
10593 SV *sv;
10594 GV *gv;
10595 AV *av;
10596 HV *hv;
10597 void* ptr;
10598 int intval;
10599 long longval;
10600 GP *gp;
10601 IV iv;
b24356f5 10602 I32 i;
c4e33207 10603 char *c = NULL;
1d7c1841 10604 void (*dptr) (void*);
acfe0abc 10605 void (*dxptr) (pTHX_ void*);
1d7c1841 10606
a02a5408 10607 Newxz(nss, max, ANY);
1d7c1841
GS
10608
10609 while (ix > 0) {
b24356f5
NC
10610 const I32 type = POPINT(ss,ix);
10611 TOPINT(nss,ix) = type;
10612 switch (type) {
3e07292d
NC
10613 case SAVEt_HELEM: /* hash element */
10614 sv = (SV*)POPPTR(ss,ix);
10615 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
10616 /* fall through */
1d7c1841 10617 case SAVEt_ITEM: /* normal string */
a41cc44e 10618 case SAVEt_SV: /* scalar reference */
1d7c1841 10619 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10620 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
3e07292d
NC
10621 /* fall through */
10622 case SAVEt_FREESV:
10623 case SAVEt_MORTALIZESV:
1d7c1841 10624 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10625 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10626 break;
05ec9bb3
NIS
10627 case SAVEt_SHARED_PVREF: /* char* in shared space */
10628 c = (char*)POPPTR(ss,ix);
10629 TOPPTR(nss,ix) = savesharedpv(c);
10630 ptr = POPPTR(ss,ix);
10631 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10632 break;
1d7c1841
GS
10633 case SAVEt_GENERIC_SVREF: /* generic sv */
10634 case SAVEt_SVREF: /* scalar reference */
10635 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10636 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10637 ptr = POPPTR(ss,ix);
10638 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
10639 break;
a41cc44e 10640 case SAVEt_HV: /* hash reference */
1d7c1841 10641 case SAVEt_AV: /* array reference */
11b79775 10642 sv = (SV*) POPPTR(ss,ix);
337d28f5 10643 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
3e07292d
NC
10644 /* fall through */
10645 case SAVEt_COMPPAD:
10646 case SAVEt_NSTAB:
667e2948 10647 sv = (SV*) POPPTR(ss,ix);
3e07292d 10648 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
10649 break;
10650 case SAVEt_INT: /* int reference */
10651 ptr = POPPTR(ss,ix);
10652 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10653 intval = (int)POPINT(ss,ix);
10654 TOPINT(nss,ix) = intval;
10655 break;
10656 case SAVEt_LONG: /* long reference */
10657 ptr = POPPTR(ss,ix);
10658 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
3e07292d
NC
10659 /* fall through */
10660 case SAVEt_CLEARSV:
1d7c1841
GS
10661 longval = (long)POPLONG(ss,ix);
10662 TOPLONG(nss,ix) = longval;
10663 break;
10664 case SAVEt_I32: /* I32 reference */
10665 case SAVEt_I16: /* I16 reference */
10666 case SAVEt_I8: /* I8 reference */
88effcc9 10667 case SAVEt_COP_ARYBASE: /* call CopARYBASE_set */
1d7c1841
GS
10668 ptr = POPPTR(ss,ix);
10669 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
1ccabee8 10670 i = POPINT(ss,ix);
1d7c1841
GS
10671 TOPINT(nss,ix) = i;
10672 break;
10673 case SAVEt_IV: /* IV reference */
10674 ptr = POPPTR(ss,ix);
10675 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10676 iv = POPIV(ss,ix);
10677 TOPIV(nss,ix) = iv;
10678 break;
a41cc44e
NC
10679 case SAVEt_HPTR: /* HV* reference */
10680 case SAVEt_APTR: /* AV* reference */
1d7c1841
GS
10681 case SAVEt_SPTR: /* SV* reference */
10682 ptr = POPPTR(ss,ix);
10683 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10684 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10685 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
10686 break;
10687 case SAVEt_VPTR: /* random* reference */
10688 ptr = POPPTR(ss,ix);
10689 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10690 ptr = POPPTR(ss,ix);
10691 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10692 break;
b03d03b0 10693 case SAVEt_GENERIC_PVREF: /* generic char* */
1d7c1841
GS
10694 case SAVEt_PPTR: /* char* reference */
10695 ptr = POPPTR(ss,ix);
10696 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10697 c = (char*)POPPTR(ss,ix);
10698 TOPPTR(nss,ix) = pv_dup(c);
10699 break;
1d7c1841
GS
10700 case SAVEt_GP: /* scalar reference */
10701 gp = (GP*)POPPTR(ss,ix);
d2d73c3e 10702 TOPPTR(nss,ix) = gp = gp_dup(gp, param);
1d7c1841
GS
10703 (void)GpREFCNT_inc(gp);
10704 gv = (GV*)POPPTR(ss,ix);
2ed3c8fc 10705 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841 10706 break;
1d7c1841
GS
10707 case SAVEt_FREEOP:
10708 ptr = POPPTR(ss,ix);
10709 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
10710 /* these are assumed to be refcounted properly */
53c1dcc0 10711 OP *o;
1d7c1841
GS
10712 switch (((OP*)ptr)->op_type) {
10713 case OP_LEAVESUB:
10714 case OP_LEAVESUBLV:
10715 case OP_LEAVEEVAL:
10716 case OP_LEAVE:
10717 case OP_SCOPE:
10718 case OP_LEAVEWRITE:
e977893f
GS
10719 TOPPTR(nss,ix) = ptr;
10720 o = (OP*)ptr;
d3c72c2a 10721 OP_REFCNT_LOCK;
594cd643 10722 (void) OpREFCNT_inc(o);
d3c72c2a 10723 OP_REFCNT_UNLOCK;
1d7c1841
GS
10724 break;
10725 default:
5f66b61c 10726 TOPPTR(nss,ix) = NULL;
1d7c1841
GS
10727 break;
10728 }
10729 }
10730 else
5f66b61c 10731 TOPPTR(nss,ix) = NULL;
1d7c1841
GS
10732 break;
10733 case SAVEt_FREEPV:
10734 c = (char*)POPPTR(ss,ix);
10735 TOPPTR(nss,ix) = pv_dup_inc(c);
10736 break;
1d7c1841
GS
10737 case SAVEt_DELETE:
10738 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10739 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
10740 c = (char*)POPPTR(ss,ix);
10741 TOPPTR(nss,ix) = pv_dup_inc(c);
3e07292d
NC
10742 /* fall through */
10743 case SAVEt_STACK_POS: /* Position on Perl stack */
1d7c1841
GS
10744 i = POPINT(ss,ix);
10745 TOPINT(nss,ix) = i;
10746 break;
10747 case SAVEt_DESTRUCTOR:
10748 ptr = POPPTR(ss,ix);
10749 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
10750 dptr = POPDPTR(ss,ix);
8141890a
JH
10751 TOPDPTR(nss,ix) = DPTR2FPTR(void (*)(void*),
10752 any_dup(FPTR2DPTR(void *, dptr),
10753 proto_perl));
1d7c1841
GS
10754 break;
10755 case SAVEt_DESTRUCTOR_X:
10756 ptr = POPPTR(ss,ix);
10757 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
10758 dxptr = POPDXPTR(ss,ix);
8141890a
JH
10759 TOPDXPTR(nss,ix) = DPTR2FPTR(void (*)(pTHX_ void*),
10760 any_dup(FPTR2DPTR(void *, dxptr),
10761 proto_perl));
1d7c1841
GS
10762 break;
10763 case SAVEt_REGCONTEXT:
10764 case SAVEt_ALLOC:
10765 i = POPINT(ss,ix);
10766 TOPINT(nss,ix) = i;
10767 ix -= i;
10768 break;
1d7c1841
GS
10769 case SAVEt_AELEM: /* array element */
10770 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10771 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10772 i = POPINT(ss,ix);
10773 TOPINT(nss,ix) = i;
10774 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10775 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841 10776 break;
1d7c1841
GS
10777 case SAVEt_OP:
10778 ptr = POPPTR(ss,ix);
10779 TOPPTR(nss,ix) = ptr;
10780 break;
10781 case SAVEt_HINTS:
10782 i = POPINT(ss,ix);
10783 TOPINT(nss,ix) = i;
b3ca2e83 10784 ptr = POPPTR(ss,ix);
080ac856 10785 if (ptr) {
7b6dd8c3 10786 HINTS_REFCNT_LOCK;
080ac856 10787 ((struct refcounted_he *)ptr)->refcounted_he_refcnt++;
7b6dd8c3
NC
10788 HINTS_REFCNT_UNLOCK;
10789 }
cbb1fbea 10790 TOPPTR(nss,ix) = ptr;
a8f8b6a7
NC
10791 if (i & HINT_LOCALIZE_HH) {
10792 hv = (HV*)POPPTR(ss,ix);
10793 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
10794 }
1d7c1841 10795 break;
c3564e5c
GS
10796 case SAVEt_PADSV:
10797 longval = (long)POPLONG(ss,ix);
10798 TOPLONG(nss,ix) = longval;
10799 ptr = POPPTR(ss,ix);
10800 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10801 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10802 TOPPTR(nss,ix) = sv_dup(sv, param);
c3564e5c 10803 break;
a1bb4754 10804 case SAVEt_BOOL:
38d8b13e 10805 ptr = POPPTR(ss,ix);
b9609c01 10806 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
38d8b13e 10807 longval = (long)POPBOOL(ss,ix);
b9609c01 10808 TOPBOOL(nss,ix) = (bool)longval;
a1bb4754 10809 break;
8bd2680e
MHM
10810 case SAVEt_SET_SVFLAGS:
10811 i = POPINT(ss,ix);
10812 TOPINT(nss,ix) = i;
10813 i = POPINT(ss,ix);
10814 TOPINT(nss,ix) = i;
10815 sv = (SV*)POPPTR(ss,ix);
10816 TOPPTR(nss,ix) = sv_dup(sv, param);
10817 break;
5bfb7d0e
NC
10818 case SAVEt_RE_STATE:
10819 {
10820 const struct re_save_state *const old_state
10821 = (struct re_save_state *)
10822 (ss + ix - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
10823 struct re_save_state *const new_state
10824 = (struct re_save_state *)
10825 (nss + ix - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
10826
10827 Copy(old_state, new_state, 1, struct re_save_state);
10828 ix -= SAVESTACK_ALLOC_FOR_RE_SAVE_STATE;
10829
10830 new_state->re_state_bostr
10831 = pv_dup(old_state->re_state_bostr);
10832 new_state->re_state_reginput
10833 = pv_dup(old_state->re_state_reginput);
5bfb7d0e
NC
10834 new_state->re_state_regeol
10835 = pv_dup(old_state->re_state_regeol);
f0ab9afb
NC
10836 new_state->re_state_regoffs
10837 = (regexp_paren_pair*)
10838 any_dup(old_state->re_state_regoffs, proto_perl);
5bfb7d0e 10839 new_state->re_state_reglastparen
11b79775
DD
10840 = (U32*) any_dup(old_state->re_state_reglastparen,
10841 proto_perl);
5bfb7d0e 10842 new_state->re_state_reglastcloseparen
11b79775 10843 = (U32*)any_dup(old_state->re_state_reglastcloseparen,
5bfb7d0e 10844 proto_perl);
5bfb7d0e
NC
10845 /* XXX This just has to be broken. The old save_re_context
10846 code did SAVEGENERICPV(PL_reg_start_tmp);
10847 PL_reg_start_tmp is char **.
10848 Look above to what the dup code does for
10849 SAVEt_GENERIC_PVREF
10850 It can never have worked.
10851 So this is merely a faithful copy of the exiting bug: */
10852 new_state->re_state_reg_start_tmp
10853 = (char **) pv_dup((char *)
10854 old_state->re_state_reg_start_tmp);
10855 /* I assume that it only ever "worked" because no-one called
10856 (pseudo)fork while the regexp engine had re-entered itself.
10857 */
5bfb7d0e
NC
10858#ifdef PERL_OLD_COPY_ON_WRITE
10859 new_state->re_state_nrs
10860 = sv_dup(old_state->re_state_nrs, param);
10861#endif
10862 new_state->re_state_reg_magic
11b79775
DD
10863 = (MAGIC*) any_dup(old_state->re_state_reg_magic,
10864 proto_perl);
5bfb7d0e 10865 new_state->re_state_reg_oldcurpm
11b79775
DD
10866 = (PMOP*) any_dup(old_state->re_state_reg_oldcurpm,
10867 proto_perl);
5bfb7d0e 10868 new_state->re_state_reg_curpm
11b79775
DD
10869 = (PMOP*) any_dup(old_state->re_state_reg_curpm,
10870 proto_perl);
5bfb7d0e
NC
10871 new_state->re_state_reg_oldsaved
10872 = pv_dup(old_state->re_state_reg_oldsaved);
10873 new_state->re_state_reg_poscache
10874 = pv_dup(old_state->re_state_reg_poscache);
5bfb7d0e
NC
10875 new_state->re_state_reg_starttry
10876 = pv_dup(old_state->re_state_reg_starttry);
5bfb7d0e
NC
10877 break;
10878 }
68da3b2f
NC
10879 case SAVEt_COMPILE_WARNINGS:
10880 ptr = POPPTR(ss,ix);
10881 TOPPTR(nss,ix) = DUP_WARNINGS((STRLEN*)ptr);
7b6dd8c3 10882 break;
7c197c94
DM
10883 case SAVEt_PARSER:
10884 ptr = POPPTR(ss,ix);
456084a8 10885 TOPPTR(nss,ix) = parser_dup((const yy_parser*)ptr, param);
7c197c94 10886 break;
1d7c1841 10887 default:
147bc374
NC
10888 Perl_croak(aTHX_
10889 "panic: ss_dup inconsistency (%"IVdf")", (IV) type);
1d7c1841
GS
10890 }
10891 }
10892
bd81e77b
NC
10893 return nss;
10894}
10895
10896
10897/* if sv is a stash, call $class->CLONE_SKIP(), and set the SVphv_CLONEABLE
10898 * flag to the result. This is done for each stash before cloning starts,
10899 * so we know which stashes want their objects cloned */
10900
10901static void
10902do_mark_cloneable_stash(pTHX_ SV *sv)
10903{
10904 const HEK * const hvname = HvNAME_HEK((HV*)sv);
10905 if (hvname) {
10906 GV* const cloner = gv_fetchmethod_autoload((HV*)sv, "CLONE_SKIP", 0);
10907 SvFLAGS(sv) |= SVphv_CLONEABLE; /* clone objects by default */
10908 if (cloner && GvCV(cloner)) {
10909 dSP;
10910 UV status;
10911
10912 ENTER;
10913 SAVETMPS;
10914 PUSHMARK(SP);
6e449a3a 10915 mXPUSHs(newSVhek(hvname));
bd81e77b
NC
10916 PUTBACK;
10917 call_sv((SV*)GvCV(cloner), G_SCALAR);
10918 SPAGAIN;
10919 status = POPu;
10920 PUTBACK;
10921 FREETMPS;
10922 LEAVE;
10923 if (status)
10924 SvFLAGS(sv) &= ~SVphv_CLONEABLE;
10925 }
10926 }
10927}
10928
10929
10930
10931/*
10932=for apidoc perl_clone
10933
10934Create and return a new interpreter by cloning the current one.
10935
10936perl_clone takes these flags as parameters:
10937
10938CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
10939without it we only clone the data and zero the stacks,
10940with it we copy the stacks and the new perl interpreter is
10941ready to run at the exact same point as the previous one.
10942The pseudo-fork code uses COPY_STACKS while the
878090d5 10943threads->create doesn't.
bd81e77b
NC
10944
10945CLONEf_KEEP_PTR_TABLE
10946perl_clone keeps a ptr_table with the pointer of the old
10947variable as a key and the new variable as a value,
10948this allows it to check if something has been cloned and not
10949clone it again but rather just use the value and increase the
10950refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
10951the ptr_table using the function
10952C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
10953reason to keep it around is if you want to dup some of your own
10954variable who are outside the graph perl scans, example of this
10955code is in threads.xs create
10956
10957CLONEf_CLONE_HOST
10958This is a win32 thing, it is ignored on unix, it tells perls
10959win32host code (which is c++) to clone itself, this is needed on
10960win32 if you want to run two threads at the same time,
10961if you just want to do some stuff in a separate perl interpreter
10962and then throw it away and return to the original one,
10963you don't need to do anything.
10964
10965=cut
10966*/
10967
10968/* XXX the above needs expanding by someone who actually understands it ! */
10969EXTERN_C PerlInterpreter *
10970perl_clone_host(PerlInterpreter* proto_perl, UV flags);
10971
10972PerlInterpreter *
10973perl_clone(PerlInterpreter *proto_perl, UV flags)
10974{
10975 dVAR;
10976#ifdef PERL_IMPLICIT_SYS
10977
10978 /* perlhost.h so we need to call into it
10979 to clone the host, CPerlHost should have a c interface, sky */
10980
10981 if (flags & CLONEf_CLONE_HOST) {
10982 return perl_clone_host(proto_perl,flags);
10983 }
10984 return perl_clone_using(proto_perl, flags,
10985 proto_perl->IMem,
10986 proto_perl->IMemShared,
10987 proto_perl->IMemParse,
10988 proto_perl->IEnv,
10989 proto_perl->IStdIO,
10990 proto_perl->ILIO,
10991 proto_perl->IDir,
10992 proto_perl->ISock,
10993 proto_perl->IProc);
10994}
10995
10996PerlInterpreter *
10997perl_clone_using(PerlInterpreter *proto_perl, UV flags,
10998 struct IPerlMem* ipM, struct IPerlMem* ipMS,
10999 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
11000 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
11001 struct IPerlDir* ipD, struct IPerlSock* ipS,
11002 struct IPerlProc* ipP)
11003{
11004 /* XXX many of the string copies here can be optimized if they're
11005 * constants; they need to be allocated as common memory and just
11006 * their pointers copied. */
11007
11008 IV i;
11009 CLONE_PARAMS clone_params;
5f66b61c 11010 CLONE_PARAMS* const param = &clone_params;
bd81e77b 11011
5f66b61c 11012 PerlInterpreter * const my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
bd81e77b
NC
11013 /* for each stash, determine whether its objects should be cloned */
11014 S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
11015 PERL_SET_THX(my_perl);
11016
11017# ifdef DEBUGGING
7e337ee0 11018 PoisonNew(my_perl, 1, PerlInterpreter);
5f66b61c
AL
11019 PL_op = NULL;
11020 PL_curcop = NULL;
bd81e77b
NC
11021 PL_markstack = 0;
11022 PL_scopestack = 0;
11023 PL_savestack = 0;
11024 PL_savestack_ix = 0;
11025 PL_savestack_max = -1;
11026 PL_sig_pending = 0;
b8328dae 11027 PL_parser = NULL;
bd81e77b
NC
11028 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
11029# else /* !DEBUGGING */
11030 Zero(my_perl, 1, PerlInterpreter);
11031# endif /* DEBUGGING */
11032
11033 /* host pointers */
11034 PL_Mem = ipM;
11035 PL_MemShared = ipMS;
11036 PL_MemParse = ipMP;
11037 PL_Env = ipE;
11038 PL_StdIO = ipStd;
11039 PL_LIO = ipLIO;
11040 PL_Dir = ipD;
11041 PL_Sock = ipS;
11042 PL_Proc = ipP;
11043#else /* !PERL_IMPLICIT_SYS */
11044 IV i;
11045 CLONE_PARAMS clone_params;
11046 CLONE_PARAMS* param = &clone_params;
5f66b61c 11047 PerlInterpreter * const my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
bd81e77b
NC
11048 /* for each stash, determine whether its objects should be cloned */
11049 S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
11050 PERL_SET_THX(my_perl);
11051
11052# ifdef DEBUGGING
7e337ee0 11053 PoisonNew(my_perl, 1, PerlInterpreter);
5f66b61c
AL
11054 PL_op = NULL;
11055 PL_curcop = NULL;
bd81e77b
NC
11056 PL_markstack = 0;
11057 PL_scopestack = 0;
11058 PL_savestack = 0;
11059 PL_savestack_ix = 0;
11060 PL_savestack_max = -1;
11061 PL_sig_pending = 0;
b8328dae 11062 PL_parser = NULL;
bd81e77b
NC
11063 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
11064# else /* !DEBUGGING */
11065 Zero(my_perl, 1, PerlInterpreter);
11066# endif /* DEBUGGING */
11067#endif /* PERL_IMPLICIT_SYS */
11068 param->flags = flags;
11069 param->proto_perl = proto_perl;
11070
7cb608b5
NC
11071 INIT_TRACK_MEMPOOL(my_perl->Imemory_debug_header, my_perl);
11072
fdda85ca 11073 PL_body_arenas = NULL;
bd81e77b
NC
11074 Zero(&PL_body_roots, 1, PL_body_roots);
11075
11076 PL_nice_chunk = NULL;
11077 PL_nice_chunk_size = 0;
11078 PL_sv_count = 0;
11079 PL_sv_objcount = 0;
a0714e2c
SS
11080 PL_sv_root = NULL;
11081 PL_sv_arenaroot = NULL;
bd81e77b
NC
11082
11083 PL_debug = proto_perl->Idebug;
11084
11085 PL_hash_seed = proto_perl->Ihash_seed;
11086 PL_rehash_seed = proto_perl->Irehash_seed;
11087
11088#ifdef USE_REENTRANT_API
11089 /* XXX: things like -Dm will segfault here in perlio, but doing
11090 * PERL_SET_CONTEXT(proto_perl);
11091 * breaks too many other things
11092 */
11093 Perl_reentrant_init(aTHX);
11094#endif
11095
11096 /* create SV map for pointer relocation */
11097 PL_ptr_table = ptr_table_new();
11098
11099 /* initialize these special pointers as early as possible */
11100 SvANY(&PL_sv_undef) = NULL;
11101 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
11102 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
11103 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
11104
11105 SvANY(&PL_sv_no) = new_XPVNV();
11106 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
11107 SvFLAGS(&PL_sv_no) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
11108 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
bb7a0f54 11109 SvPV_set(&PL_sv_no, savepvn(PL_No, 0));
bd81e77b
NC
11110 SvCUR_set(&PL_sv_no, 0);
11111 SvLEN_set(&PL_sv_no, 1);
11112 SvIV_set(&PL_sv_no, 0);
11113 SvNV_set(&PL_sv_no, 0);
11114 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
11115
11116 SvANY(&PL_sv_yes) = new_XPVNV();
11117 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
11118 SvFLAGS(&PL_sv_yes) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
11119 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
bb7a0f54 11120 SvPV_set(&PL_sv_yes, savepvn(PL_Yes, 1));
bd81e77b
NC
11121 SvCUR_set(&PL_sv_yes, 1);
11122 SvLEN_set(&PL_sv_yes, 2);
11123 SvIV_set(&PL_sv_yes, 1);
11124 SvNV_set(&PL_sv_yes, 1);
11125 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
11126
11127 /* create (a non-shared!) shared string table */
11128 PL_strtab = newHV();
11129 HvSHAREKEYS_off(PL_strtab);
11130 hv_ksplit(PL_strtab, HvTOTALKEYS(proto_perl->Istrtab));
11131 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
11132
11133 PL_compiling = proto_perl->Icompiling;
11134
11135 /* These two PVs will be free'd special way so must set them same way op.c does */
11136 PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
11137 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
11138
11139 PL_compiling.cop_file = savesharedpv(PL_compiling.cop_file);
11140 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
11141
11142 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
72dc9ed5 11143 PL_compiling.cop_warnings = DUP_WARNINGS(PL_compiling.cop_warnings);
c28fe1ec 11144 if (PL_compiling.cop_hints_hash) {
cbb1fbea 11145 HINTS_REFCNT_LOCK;
c28fe1ec 11146 PL_compiling.cop_hints_hash->refcounted_he_refcnt++;
cbb1fbea
NC
11147 HINTS_REFCNT_UNLOCK;
11148 }
907b3e23 11149 PL_curcop = (COP*)any_dup(proto_perl->Icurcop, proto_perl);
5892a4d4
NC
11150#ifdef PERL_DEBUG_READONLY_OPS
11151 PL_slabs = NULL;
11152 PL_slab_count = 0;
11153#endif
bd81e77b
NC
11154
11155 /* pseudo environmental stuff */
11156 PL_origargc = proto_perl->Iorigargc;
11157 PL_origargv = proto_perl->Iorigargv;
11158
11159 param->stashes = newAV(); /* Setup array of objects to call clone on */
11160
11161 /* Set tainting stuff before PerlIO_debug can possibly get called */
11162 PL_tainting = proto_perl->Itainting;
11163 PL_taint_warn = proto_perl->Itaint_warn;
11164
11165#ifdef PERLIO_LAYERS
11166 /* Clone PerlIO tables as soon as we can handle general xx_dup() */
11167 PerlIO_clone(aTHX_ proto_perl, param);
11168#endif
11169
11170 PL_envgv = gv_dup(proto_perl->Ienvgv, param);
11171 PL_incgv = gv_dup(proto_perl->Iincgv, param);
11172 PL_hintgv = gv_dup(proto_perl->Ihintgv, param);
11173 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
11174 PL_diehook = sv_dup_inc(proto_perl->Idiehook, param);
11175 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param);
11176
11177 /* switches */
11178 PL_minus_c = proto_perl->Iminus_c;
11179 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel, param);
11180 PL_localpatches = proto_perl->Ilocalpatches;
11181 PL_splitstr = proto_perl->Isplitstr;
11182 PL_preprocess = proto_perl->Ipreprocess;
11183 PL_minus_n = proto_perl->Iminus_n;
11184 PL_minus_p = proto_perl->Iminus_p;
11185 PL_minus_l = proto_perl->Iminus_l;
11186 PL_minus_a = proto_perl->Iminus_a;
bc9b29db 11187 PL_minus_E = proto_perl->Iminus_E;
bd81e77b
NC
11188 PL_minus_F = proto_perl->Iminus_F;
11189 PL_doswitches = proto_perl->Idoswitches;
11190 PL_dowarn = proto_perl->Idowarn;
11191 PL_doextract = proto_perl->Idoextract;
11192 PL_sawampersand = proto_perl->Isawampersand;
11193 PL_unsafe = proto_perl->Iunsafe;
11194 PL_inplace = SAVEPV(proto_perl->Iinplace);
11195 PL_e_script = sv_dup_inc(proto_perl->Ie_script, param);
11196 PL_perldb = proto_perl->Iperldb;
11197 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
11198 PL_exit_flags = proto_perl->Iexit_flags;
11199
11200 /* magical thingies */
11201 /* XXX time(&PL_basetime) when asked for? */
11202 PL_basetime = proto_perl->Ibasetime;
11203 PL_formfeed = sv_dup(proto_perl->Iformfeed, param);
11204
11205 PL_maxsysfd = proto_perl->Imaxsysfd;
bd81e77b
NC
11206 PL_statusvalue = proto_perl->Istatusvalue;
11207#ifdef VMS
11208 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
11209#else
11210 PL_statusvalue_posix = proto_perl->Istatusvalue_posix;
11211#endif
11212 PL_encoding = sv_dup(proto_perl->Iencoding, param);
11213
11214 sv_setpvn(PERL_DEBUG_PAD(0), "", 0); /* For regex debugging. */
11215 sv_setpvn(PERL_DEBUG_PAD(1), "", 0); /* ext/re needs these */
11216 sv_setpvn(PERL_DEBUG_PAD(2), "", 0); /* even without DEBUGGING. */
11217
84da74a7 11218
f9f4320a 11219 /* RE engine related */
84da74a7
YO
11220 Zero(&PL_reg_state, 1, struct re_save_state);
11221 PL_reginterp_cnt = 0;
11222 PL_regmatch_slab = NULL;
11223
bd81e77b
NC
11224 /* Clone the regex array */
11225 PL_regex_padav = newAV();
11226 {
11227 const I32 len = av_len((AV*)proto_perl->Iregex_padav);
7a5b473e 11228 SV* const * const regexen = AvARRAY((AV*)proto_perl->Iregex_padav);
bd81e77b 11229 IV i;
7f466ec7 11230 av_push(PL_regex_padav, sv_dup_inc_NN(regexen[0],param));
bd81e77b 11231 for(i = 1; i <= len; i++) {
7a5b473e 11232 const SV * const regex = regexen[i];
288b8c02
NC
11233 /* FIXME for plugins
11234 newSViv(PTR2IV(CALLREGDUPE(
11235 INT2PTR(REGEXP *, SvIVX(regex)), param))))
11236 */
11237 /* And while we're at it, can we FIXME on the whole hiding
11238 pointer inside an IV hack? */
7a5b473e
AL
11239 SV * const sv =
11240 SvREPADTMP(regex)
11241 ? sv_dup_inc(regex, param)
11242 : SvREFCNT_inc(
288b8c02 11243 newSViv(PTR2IV(sv_dup_inc(INT2PTR(REGEXP *, SvIVX(regex)), param))))
7a5b473e 11244 ;
60790534
DM
11245 if (SvFLAGS(regex) & SVf_BREAK)
11246 SvFLAGS(sv) |= SVf_BREAK; /* unrefcnted PL_curpm */
7a5b473e 11247 av_push(PL_regex_padav, sv);
bd81e77b
NC
11248 }
11249 }
11250 PL_regex_pad = AvARRAY(PL_regex_padav);
11251
11252 /* shortcuts to various I/O objects */
11253 PL_stdingv = gv_dup(proto_perl->Istdingv, param);
11254 PL_stderrgv = gv_dup(proto_perl->Istderrgv, param);
11255 PL_defgv = gv_dup(proto_perl->Idefgv, param);
11256 PL_argvgv = gv_dup(proto_perl->Iargvgv, param);
11257 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv, param);
11258 PL_argvout_stack = av_dup_inc(proto_perl->Iargvout_stack, param);
1d7c1841 11259
bd81e77b
NC
11260 /* shortcuts to regexp stuff */
11261 PL_replgv = gv_dup(proto_perl->Ireplgv, param);
9660f481 11262
bd81e77b
NC
11263 /* shortcuts to misc objects */
11264 PL_errgv = gv_dup(proto_perl->Ierrgv, param);
9660f481 11265
bd81e77b
NC
11266 /* shortcuts to debugging objects */
11267 PL_DBgv = gv_dup(proto_perl->IDBgv, param);
11268 PL_DBline = gv_dup(proto_perl->IDBline, param);
11269 PL_DBsub = gv_dup(proto_perl->IDBsub, param);
11270 PL_DBsingle = sv_dup(proto_perl->IDBsingle, param);
11271 PL_DBtrace = sv_dup(proto_perl->IDBtrace, param);
11272 PL_DBsignal = sv_dup(proto_perl->IDBsignal, param);
bd81e77b 11273 PL_dbargs = av_dup(proto_perl->Idbargs, param);
9660f481 11274
bd81e77b 11275 /* symbol tables */
907b3e23
DM
11276 PL_defstash = hv_dup_inc(proto_perl->Idefstash, param);
11277 PL_curstash = hv_dup(proto_perl->Icurstash, param);
bd81e77b
NC
11278 PL_debstash = hv_dup(proto_perl->Idebstash, param);
11279 PL_globalstash = hv_dup(proto_perl->Iglobalstash, param);
11280 PL_curstname = sv_dup_inc(proto_perl->Icurstname, param);
11281
11282 PL_beginav = av_dup_inc(proto_perl->Ibeginav, param);
11283 PL_beginav_save = av_dup_inc(proto_perl->Ibeginav_save, param);
11284 PL_checkav_save = av_dup_inc(proto_perl->Icheckav_save, param);
3c10abe3
AG
11285 PL_unitcheckav = av_dup_inc(proto_perl->Iunitcheckav, param);
11286 PL_unitcheckav_save = av_dup_inc(proto_perl->Iunitcheckav_save, param);
bd81e77b
NC
11287 PL_endav = av_dup_inc(proto_perl->Iendav, param);
11288 PL_checkav = av_dup_inc(proto_perl->Icheckav, param);
11289 PL_initav = av_dup_inc(proto_perl->Iinitav, param);
11290
11291 PL_sub_generation = proto_perl->Isub_generation;
dd69841b 11292 PL_isarev = hv_dup_inc(proto_perl->Iisarev, param);
bd81e77b
NC
11293
11294 /* funky return mechanisms */
11295 PL_forkprocess = proto_perl->Iforkprocess;
11296
11297 /* subprocess state */
11298 PL_fdpid = av_dup_inc(proto_perl->Ifdpid, param);
11299
11300 /* internal state */
11301 PL_maxo = proto_perl->Imaxo;
11302 if (proto_perl->Iop_mask)
11303 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
11304 else
bd61b366 11305 PL_op_mask = NULL;
bd81e77b
NC
11306 /* PL_asserting = proto_perl->Iasserting; */
11307
11308 /* current interpreter roots */
11309 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv, param);
d3c72c2a 11310 OP_REFCNT_LOCK;
bd81e77b 11311 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
d3c72c2a 11312 OP_REFCNT_UNLOCK;
bd81e77b
NC
11313 PL_main_start = proto_perl->Imain_start;
11314 PL_eval_root = proto_perl->Ieval_root;
11315 PL_eval_start = proto_perl->Ieval_start;
11316
11317 /* runtime control stuff */
11318 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
bd81e77b
NC
11319
11320 PL_filemode = proto_perl->Ifilemode;
11321 PL_lastfd = proto_perl->Ilastfd;
11322 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
11323 PL_Argv = NULL;
bd61b366 11324 PL_Cmd = NULL;
bd81e77b 11325 PL_gensym = proto_perl->Igensym;
bd81e77b
NC
11326 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav, param);
11327 PL_laststatval = proto_perl->Ilaststatval;
11328 PL_laststype = proto_perl->Ilaststype;
a0714e2c 11329 PL_mess_sv = NULL;
bd81e77b
NC
11330
11331 PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv, param);
11332
11333 /* interpreter atexit processing */
11334 PL_exitlistlen = proto_perl->Iexitlistlen;
11335 if (PL_exitlistlen) {
11336 Newx(PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11337 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
9660f481 11338 }
bd81e77b
NC
11339 else
11340 PL_exitlist = (PerlExitListEntry*)NULL;
f16dd614
DM
11341
11342 PL_my_cxt_size = proto_perl->Imy_cxt_size;
4c901e72 11343 if (PL_my_cxt_size) {
f16dd614
DM
11344 Newx(PL_my_cxt_list, PL_my_cxt_size, void *);
11345 Copy(proto_perl->Imy_cxt_list, PL_my_cxt_list, PL_my_cxt_size, void *);
53d44271 11346#ifdef PERL_GLOBAL_STRUCT_PRIVATE
bae1192d 11347 Newx(PL_my_cxt_keys, PL_my_cxt_size, const char *);
53d44271
JH
11348 Copy(proto_perl->Imy_cxt_keys, PL_my_cxt_keys, PL_my_cxt_size, char *);
11349#endif
f16dd614 11350 }
53d44271 11351 else {
f16dd614 11352 PL_my_cxt_list = (void**)NULL;
53d44271 11353#ifdef PERL_GLOBAL_STRUCT_PRIVATE
bae1192d 11354 PL_my_cxt_keys = (const char**)NULL;
53d44271
JH
11355#endif
11356 }
bd81e77b
NC
11357 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal, param);
11358 PL_custom_op_names = hv_dup_inc(proto_perl->Icustom_op_names,param);
11359 PL_custom_op_descs = hv_dup_inc(proto_perl->Icustom_op_descs,param);
11360
11361 PL_profiledata = NULL;
9660f481 11362
bd81e77b 11363 PL_compcv = cv_dup(proto_perl->Icompcv, param);
9660f481 11364
bd81e77b 11365 PAD_CLONE_VARS(proto_perl, param);
9660f481 11366
bd81e77b
NC
11367#ifdef HAVE_INTERP_INTERN
11368 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
11369#endif
645c22ef 11370
bd81e77b
NC
11371 /* more statics moved here */
11372 PL_generation = proto_perl->Igeneration;
11373 PL_DBcv = cv_dup(proto_perl->IDBcv, param);
645c22ef 11374
bd81e77b
NC
11375 PL_in_clean_objs = proto_perl->Iin_clean_objs;
11376 PL_in_clean_all = proto_perl->Iin_clean_all;
6a78b4db 11377
bd81e77b
NC
11378 PL_uid = proto_perl->Iuid;
11379 PL_euid = proto_perl->Ieuid;
11380 PL_gid = proto_perl->Igid;
11381 PL_egid = proto_perl->Iegid;
11382 PL_nomemok = proto_perl->Inomemok;
11383 PL_an = proto_perl->Ian;
11384 PL_evalseq = proto_perl->Ievalseq;
11385 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
11386 PL_origalen = proto_perl->Iorigalen;
11387#ifdef PERL_USES_PL_PIDSTATUS
11388 PL_pidstatus = newHV(); /* XXX flag for cloning? */
11389#endif
11390 PL_osname = SAVEPV(proto_perl->Iosname);
11391 PL_sighandlerp = proto_perl->Isighandlerp;
6a78b4db 11392
bd81e77b 11393 PL_runops = proto_perl->Irunops;
6a78b4db 11394
199e78b7
DM
11395 PL_parser = parser_dup(proto_perl->Iparser, param);
11396
bd81e77b
NC
11397 PL_subline = proto_perl->Isubline;
11398 PL_subname = sv_dup_inc(proto_perl->Isubname, param);
c43294b8 11399
bd81e77b
NC
11400#ifdef FCRYPT
11401 PL_cryptseen = proto_perl->Icryptseen;
11402#endif
1d7c1841 11403
bd81e77b 11404 PL_hints = proto_perl->Ihints;
1d7c1841 11405
bd81e77b 11406 PL_amagic_generation = proto_perl->Iamagic_generation;
d2d73c3e 11407
bd81e77b
NC
11408#ifdef USE_LOCALE_COLLATE
11409 PL_collation_ix = proto_perl->Icollation_ix;
11410 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
11411 PL_collation_standard = proto_perl->Icollation_standard;
11412 PL_collxfrm_base = proto_perl->Icollxfrm_base;
11413 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
11414#endif /* USE_LOCALE_COLLATE */
1d7c1841 11415
bd81e77b
NC
11416#ifdef USE_LOCALE_NUMERIC
11417 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
11418 PL_numeric_standard = proto_perl->Inumeric_standard;
11419 PL_numeric_local = proto_perl->Inumeric_local;
11420 PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
11421#endif /* !USE_LOCALE_NUMERIC */
1d7c1841 11422
bd81e77b
NC
11423 /* utf8 character classes */
11424 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum, param);
11425 PL_utf8_alnumc = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
11426 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii, param);
11427 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha, param);
11428 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space, param);
11429 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
11430 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph, param);
11431 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit, param);
11432 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper, param);
11433 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower, param);
11434 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print, param);
11435 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct, param);
11436 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
11437 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark, param);
11438 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper, param);
11439 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle, param);
11440 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower, param);
11441 PL_utf8_tofold = sv_dup_inc(proto_perl->Iutf8_tofold, param);
11442 PL_utf8_idstart = sv_dup_inc(proto_perl->Iutf8_idstart, param);
11443 PL_utf8_idcont = sv_dup_inc(proto_perl->Iutf8_idcont, param);
1d7c1841 11444
bd81e77b
NC
11445 /* Did the locale setup indicate UTF-8? */
11446 PL_utf8locale = proto_perl->Iutf8locale;
11447 /* Unicode features (see perlrun/-C) */
11448 PL_unicode = proto_perl->Iunicode;
1d7c1841 11449
bd81e77b
NC
11450 /* Pre-5.8 signals control */
11451 PL_signals = proto_perl->Isignals;
1d7c1841 11452
bd81e77b
NC
11453 /* times() ticks per second */
11454 PL_clocktick = proto_perl->Iclocktick;
1d7c1841 11455
bd81e77b
NC
11456 /* Recursion stopper for PerlIO_find_layer */
11457 PL_in_load_module = proto_perl->Iin_load_module;
8df990a8 11458
bd81e77b
NC
11459 /* sort() routine */
11460 PL_sort_RealCmp = proto_perl->Isort_RealCmp;
e5dd39fc 11461
bd81e77b
NC
11462 /* Not really needed/useful since the reenrant_retint is "volatile",
11463 * but do it for consistency's sake. */
11464 PL_reentrant_retint = proto_perl->Ireentrant_retint;
1d7c1841 11465
bd81e77b
NC
11466 /* Hooks to shared SVs and locks. */
11467 PL_sharehook = proto_perl->Isharehook;
11468 PL_lockhook = proto_perl->Ilockhook;
11469 PL_unlockhook = proto_perl->Iunlockhook;
11470 PL_threadhook = proto_perl->Ithreadhook;
eba16661 11471 PL_destroyhook = proto_perl->Idestroyhook;
1d7c1841 11472
bd81e77b
NC
11473#ifdef THREADS_HAVE_PIDS
11474 PL_ppid = proto_perl->Ippid;
11475#endif
1d7c1841 11476
bd81e77b 11477 /* swatch cache */
5c284bb0 11478 PL_last_swash_hv = NULL; /* reinits on demand */
bd81e77b
NC
11479 PL_last_swash_klen = 0;
11480 PL_last_swash_key[0]= '\0';
11481 PL_last_swash_tmps = (U8*)NULL;
11482 PL_last_swash_slen = 0;
1d7c1841 11483
bd81e77b
NC
11484 PL_glob_index = proto_perl->Iglob_index;
11485 PL_srand_called = proto_perl->Isrand_called;
bd61b366 11486 PL_bitcount = NULL; /* reinits on demand */
05ec9bb3 11487
bd81e77b
NC
11488 if (proto_perl->Ipsig_pend) {
11489 Newxz(PL_psig_pend, SIG_SIZE, int);
11490 }
11491 else {
11492 PL_psig_pend = (int*)NULL;
11493 }
05ec9bb3 11494
bd81e77b
NC
11495 if (proto_perl->Ipsig_ptr) {
11496 Newxz(PL_psig_ptr, SIG_SIZE, SV*);
11497 Newxz(PL_psig_name, SIG_SIZE, SV*);
11498 for (i = 1; i < SIG_SIZE; i++) {
11499 PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
11500 PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
11501 }
11502 }
11503 else {
11504 PL_psig_ptr = (SV**)NULL;
11505 PL_psig_name = (SV**)NULL;
11506 }
05ec9bb3 11507
907b3e23 11508 /* intrpvar.h stuff */
1d7c1841 11509
bd81e77b
NC
11510 if (flags & CLONEf_COPY_STACKS) {
11511 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
907b3e23
DM
11512 PL_tmps_ix = proto_perl->Itmps_ix;
11513 PL_tmps_max = proto_perl->Itmps_max;
11514 PL_tmps_floor = proto_perl->Itmps_floor;
bd81e77b
NC
11515 Newxz(PL_tmps_stack, PL_tmps_max, SV*);
11516 i = 0;
11517 while (i <= PL_tmps_ix) {
907b3e23 11518 PL_tmps_stack[i] = sv_dup_inc(proto_perl->Itmps_stack[i], param);
bd81e77b
NC
11519 ++i;
11520 }
d2d73c3e 11521
bd81e77b 11522 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
907b3e23 11523 i = proto_perl->Imarkstack_max - proto_perl->Imarkstack;
bd81e77b 11524 Newxz(PL_markstack, i, I32);
907b3e23
DM
11525 PL_markstack_max = PL_markstack + (proto_perl->Imarkstack_max
11526 - proto_perl->Imarkstack);
11527 PL_markstack_ptr = PL_markstack + (proto_perl->Imarkstack_ptr
11528 - proto_perl->Imarkstack);
11529 Copy(proto_perl->Imarkstack, PL_markstack,
bd81e77b 11530 PL_markstack_ptr - PL_markstack + 1, I32);
d2d73c3e 11531
bd81e77b
NC
11532 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
11533 * NOTE: unlike the others! */
907b3e23
DM
11534 PL_scopestack_ix = proto_perl->Iscopestack_ix;
11535 PL_scopestack_max = proto_perl->Iscopestack_max;
bd81e77b 11536 Newxz(PL_scopestack, PL_scopestack_max, I32);
907b3e23 11537 Copy(proto_perl->Iscopestack, PL_scopestack, PL_scopestack_ix, I32);
d419787a 11538
bd81e77b 11539 /* NOTE: si_dup() looks at PL_markstack */
907b3e23 11540 PL_curstackinfo = si_dup(proto_perl->Icurstackinfo, param);
d2d73c3e 11541
bd81e77b 11542 /* PL_curstack = PL_curstackinfo->si_stack; */
907b3e23
DM
11543 PL_curstack = av_dup(proto_perl->Icurstack, param);
11544 PL_mainstack = av_dup(proto_perl->Imainstack, param);
1d7c1841 11545
bd81e77b
NC
11546 /* next PUSHs() etc. set *(PL_stack_sp+1) */
11547 PL_stack_base = AvARRAY(PL_curstack);
907b3e23
DM
11548 PL_stack_sp = PL_stack_base + (proto_perl->Istack_sp
11549 - proto_perl->Istack_base);
bd81e77b 11550 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
1d7c1841 11551
bd81e77b
NC
11552 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
11553 * NOTE: unlike the others! */
907b3e23
DM
11554 PL_savestack_ix = proto_perl->Isavestack_ix;
11555 PL_savestack_max = proto_perl->Isavestack_max;
bd81e77b
NC
11556 /*Newxz(PL_savestack, PL_savestack_max, ANY);*/
11557 PL_savestack = ss_dup(proto_perl, param);
11558 }
11559 else {
11560 init_stacks();
11561 ENTER; /* perl_destruct() wants to LEAVE; */
34394ecd
DM
11562
11563 /* although we're not duplicating the tmps stack, we should still
11564 * add entries for any SVs on the tmps stack that got cloned by a
11565 * non-refcount means (eg a temp in @_); otherwise they will be
11566 * orphaned
11567 */
907b3e23 11568 for (i = 0; i<= proto_perl->Itmps_ix; i++) {
6136c704 11569 SV * const nsv = (SV*)ptr_table_fetch(PL_ptr_table,
907b3e23 11570 proto_perl->Itmps_stack[i]);
34394ecd
DM
11571 if (nsv && !SvREFCNT(nsv)) {
11572 EXTEND_MORTAL(1);
b37c2d43 11573 PL_tmps_stack[++PL_tmps_ix] = SvREFCNT_inc_simple(nsv);
34394ecd
DM
11574 }
11575 }
bd81e77b 11576 }
1d7c1841 11577
907b3e23 11578 PL_start_env = proto_perl->Istart_env; /* XXXXXX */
bd81e77b 11579 PL_top_env = &PL_start_env;
1d7c1841 11580
907b3e23 11581 PL_op = proto_perl->Iop;
4a4c6fe3 11582
a0714e2c 11583 PL_Sv = NULL;
bd81e77b 11584 PL_Xpv = (XPV*)NULL;
24792b8d 11585 my_perl->Ina = proto_perl->Ina;
1fcf4c12 11586
907b3e23
DM
11587 PL_statbuf = proto_perl->Istatbuf;
11588 PL_statcache = proto_perl->Istatcache;
11589 PL_statgv = gv_dup(proto_perl->Istatgv, param);
11590 PL_statname = sv_dup_inc(proto_perl->Istatname, param);
bd81e77b 11591#ifdef HAS_TIMES
907b3e23 11592 PL_timesbuf = proto_perl->Itimesbuf;
bd81e77b 11593#endif
1d7c1841 11594
907b3e23
DM
11595 PL_tainted = proto_perl->Itainted;
11596 PL_curpm = proto_perl->Icurpm; /* XXX No PMOP ref count */
11597 PL_rs = sv_dup_inc(proto_perl->Irs, param);
11598 PL_last_in_gv = gv_dup(proto_perl->Ilast_in_gv, param);
11599 PL_ofs_sv = sv_dup_inc(proto_perl->Iofs_sv, param);
11600 PL_defoutgv = gv_dup_inc(proto_perl->Idefoutgv, param);
11601 PL_chopset = proto_perl->Ichopset; /* XXX never deallocated */
11602 PL_toptarget = sv_dup_inc(proto_perl->Itoptarget, param);
11603 PL_bodytarget = sv_dup_inc(proto_perl->Ibodytarget, param);
11604 PL_formtarget = sv_dup(proto_perl->Iformtarget, param);
11605
11606 PL_restartop = proto_perl->Irestartop;
11607 PL_in_eval = proto_perl->Iin_eval;
11608 PL_delaymagic = proto_perl->Idelaymagic;
11609 PL_dirty = proto_perl->Idirty;
11610 PL_localizing = proto_perl->Ilocalizing;
11611
11612 PL_errors = sv_dup_inc(proto_perl->Ierrors, param);
4608196e 11613 PL_hv_fetch_ent_mh = NULL;
907b3e23 11614 PL_modcount = proto_perl->Imodcount;
5f66b61c 11615 PL_lastgotoprobe = NULL;
907b3e23 11616 PL_dumpindent = proto_perl->Idumpindent;
1d7c1841 11617
907b3e23
DM
11618 PL_sortcop = (OP*)any_dup(proto_perl->Isortcop, proto_perl);
11619 PL_sortstash = hv_dup(proto_perl->Isortstash, param);
11620 PL_firstgv = gv_dup(proto_perl->Ifirstgv, param);
11621 PL_secondgv = gv_dup(proto_perl->Isecondgv, param);
bd61b366 11622 PL_efloatbuf = NULL; /* reinits on demand */
bd81e77b 11623 PL_efloatsize = 0; /* reinits on demand */
d2d73c3e 11624
bd81e77b 11625 /* regex stuff */
1d7c1841 11626
bd81e77b
NC
11627 PL_screamfirst = NULL;
11628 PL_screamnext = NULL;
11629 PL_maxscream = -1; /* reinits on demand */
a0714e2c 11630 PL_lastscream = NULL;
1d7c1841 11631
1d7c1841 11632
907b3e23 11633 PL_regdummy = proto_perl->Iregdummy;
bd81e77b
NC
11634 PL_colorset = 0; /* reinits PL_colors[] */
11635 /*PL_colors[6] = {0,0,0,0,0,0};*/
1d7c1841 11636
84da74a7 11637
1d7c1841 11638
bd81e77b 11639 /* Pluggable optimizer */
907b3e23 11640 PL_peepp = proto_perl->Ipeepp;
1d7c1841 11641
bd81e77b 11642 PL_stashcache = newHV();
1d7c1841 11643
b7185faf 11644 PL_watchaddr = (char **) ptr_table_fetch(PL_ptr_table,
907b3e23 11645 proto_perl->Iwatchaddr);
b7185faf
DM
11646 PL_watchok = PL_watchaddr ? * PL_watchaddr : NULL;
11647 if (PL_debug && PL_watchaddr) {
11648 PerlIO_printf(Perl_debug_log,
11649 "WATCHING: %"UVxf" cloned as %"UVxf" with value %"UVxf"\n",
907b3e23 11650 PTR2UV(proto_perl->Iwatchaddr), PTR2UV(PL_watchaddr),
b7185faf
DM
11651 PTR2UV(PL_watchok));
11652 }
11653
bd81e77b
NC
11654 if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
11655 ptr_table_free(PL_ptr_table);
11656 PL_ptr_table = NULL;
11657 }
1d7c1841 11658
bd81e77b
NC
11659 /* Call the ->CLONE method, if it exists, for each of the stashes
11660 identified by sv_dup() above.
11661 */
11662 while(av_len(param->stashes) != -1) {
11663 HV* const stash = (HV*) av_shift(param->stashes);
11664 GV* const cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
11665 if (cloner && GvCV(cloner)) {
11666 dSP;
11667 ENTER;
11668 SAVETMPS;
11669 PUSHMARK(SP);
6e449a3a 11670 mXPUSHs(newSVhek(HvNAME_HEK(stash)));
bd81e77b
NC
11671 PUTBACK;
11672 call_sv((SV*)GvCV(cloner), G_DISCARD);
11673 FREETMPS;
11674 LEAVE;
11675 }
1d7c1841 11676 }
1d7c1841 11677
bd81e77b 11678 SvREFCNT_dec(param->stashes);
1d7c1841 11679
bd81e77b
NC
11680 /* orphaned? eg threads->new inside BEGIN or use */
11681 if (PL_compcv && ! SvREFCNT(PL_compcv)) {
b37c2d43 11682 SvREFCNT_inc_simple_void(PL_compcv);
bd81e77b
NC
11683 SAVEFREESV(PL_compcv);
11684 }
dd2155a4 11685
bd81e77b
NC
11686 return my_perl;
11687}
1d7c1841 11688
bd81e77b 11689#endif /* USE_ITHREADS */
1d7c1841 11690
bd81e77b
NC
11691/*
11692=head1 Unicode Support
1d7c1841 11693
bd81e77b 11694=for apidoc sv_recode_to_utf8
1d7c1841 11695
bd81e77b
NC
11696The encoding is assumed to be an Encode object, on entry the PV
11697of the sv is assumed to be octets in that encoding, and the sv
11698will be converted into Unicode (and UTF-8).
1d7c1841 11699
bd81e77b
NC
11700If the sv already is UTF-8 (or if it is not POK), or if the encoding
11701is not a reference, nothing is done to the sv. If the encoding is not
11702an C<Encode::XS> Encoding object, bad things will happen.
11703(See F<lib/encoding.pm> and L<Encode>).
1d7c1841 11704
bd81e77b 11705The PV of the sv is returned.
1d7c1841 11706
bd81e77b 11707=cut */
1d7c1841 11708
bd81e77b
NC
11709char *
11710Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
11711{
11712 dVAR;
11713 if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
11714 SV *uni;
11715 STRLEN len;
11716 const char *s;
11717 dSP;
11718 ENTER;
11719 SAVETMPS;
11720 save_re_context();
11721 PUSHMARK(sp);
11722 EXTEND(SP, 3);
11723 XPUSHs(encoding);
11724 XPUSHs(sv);
11725/*
11726 NI-S 2002/07/09
11727 Passing sv_yes is wrong - it needs to be or'ed set of constants
11728 for Encode::XS, while UTf-8 decode (currently) assumes a true value means
11729 remove converted chars from source.
1d7c1841 11730
bd81e77b 11731 Both will default the value - let them.
1d7c1841 11732
bd81e77b
NC
11733 XPUSHs(&PL_sv_yes);
11734*/
11735 PUTBACK;
11736 call_method("decode", G_SCALAR);
11737 SPAGAIN;
11738 uni = POPs;
11739 PUTBACK;
11740 s = SvPV_const(uni, len);
11741 if (s != SvPVX_const(sv)) {
11742 SvGROW(sv, len + 1);
11743 Move(s, SvPVX(sv), len + 1, char);
11744 SvCUR_set(sv, len);
11745 }
11746 FREETMPS;
11747 LEAVE;
11748 SvUTF8_on(sv);
11749 return SvPVX(sv);
389edf32 11750 }
bd81e77b
NC
11751 return SvPOKp(sv) ? SvPVX(sv) : NULL;
11752}
1d7c1841 11753
bd81e77b
NC
11754/*
11755=for apidoc sv_cat_decode
1d7c1841 11756
bd81e77b
NC
11757The encoding is assumed to be an Encode object, the PV of the ssv is
11758assumed to be octets in that encoding and decoding the input starts
11759from the position which (PV + *offset) pointed to. The dsv will be
11760concatenated the decoded UTF-8 string from ssv. Decoding will terminate
11761when the string tstr appears in decoding output or the input ends on
11762the PV of the ssv. The value which the offset points will be modified
11763to the last input position on the ssv.
1d7c1841 11764
bd81e77b 11765Returns TRUE if the terminator was found, else returns FALSE.
1d7c1841 11766
bd81e77b
NC
11767=cut */
11768
11769bool
11770Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
11771 SV *ssv, int *offset, char *tstr, int tlen)
11772{
11773 dVAR;
11774 bool ret = FALSE;
11775 if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) {
11776 SV *offsv;
11777 dSP;
11778 ENTER;
11779 SAVETMPS;
11780 save_re_context();
11781 PUSHMARK(sp);
11782 EXTEND(SP, 6);
11783 XPUSHs(encoding);
11784 XPUSHs(dsv);
11785 XPUSHs(ssv);
6e449a3a
MHM
11786 offsv = newSViv(*offset);
11787 mXPUSHs(offsv);
11788 mXPUSHp(tstr, tlen);
bd81e77b
NC
11789 PUTBACK;
11790 call_method("cat_decode", G_SCALAR);
11791 SPAGAIN;
11792 ret = SvTRUE(TOPs);
11793 *offset = SvIV(offsv);
11794 PUTBACK;
11795 FREETMPS;
11796 LEAVE;
389edf32 11797 }
bd81e77b
NC
11798 else
11799 Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
11800 return ret;
1d7c1841 11801
bd81e77b 11802}
1d7c1841 11803
bd81e77b
NC
11804/* ---------------------------------------------------------------------
11805 *
11806 * support functions for report_uninit()
11807 */
1d7c1841 11808
bd81e77b
NC
11809/* the maxiumum size of array or hash where we will scan looking
11810 * for the undefined element that triggered the warning */
1d7c1841 11811
bd81e77b 11812#define FUV_MAX_SEARCH_SIZE 1000
1d7c1841 11813
bd81e77b
NC
11814/* Look for an entry in the hash whose value has the same SV as val;
11815 * If so, return a mortal copy of the key. */
1d7c1841 11816
bd81e77b
NC
11817STATIC SV*
11818S_find_hash_subscript(pTHX_ HV *hv, SV* val)
11819{
11820 dVAR;
11821 register HE **array;
11822 I32 i;
6c3182a5 11823
bd81e77b
NC
11824 if (!hv || SvMAGICAL(hv) || !HvARRAY(hv) ||
11825 (HvTOTALKEYS(hv) > FUV_MAX_SEARCH_SIZE))
a0714e2c 11826 return NULL;
6c3182a5 11827
bd81e77b 11828 array = HvARRAY(hv);
6c3182a5 11829
bd81e77b
NC
11830 for (i=HvMAX(hv); i>0; i--) {
11831 register HE *entry;
11832 for (entry = array[i]; entry; entry = HeNEXT(entry)) {
11833 if (HeVAL(entry) != val)
11834 continue;
11835 if ( HeVAL(entry) == &PL_sv_undef ||
11836 HeVAL(entry) == &PL_sv_placeholder)
11837 continue;
11838 if (!HeKEY(entry))
a0714e2c 11839 return NULL;
bd81e77b
NC
11840 if (HeKLEN(entry) == HEf_SVKEY)
11841 return sv_mortalcopy(HeKEY_sv(entry));
a663657d 11842 return sv_2mortal(newSVhek(HeKEY_hek(entry)));
bd81e77b
NC
11843 }
11844 }
a0714e2c 11845 return NULL;
bd81e77b 11846}
6c3182a5 11847
bd81e77b
NC
11848/* Look for an entry in the array whose value has the same SV as val;
11849 * If so, return the index, otherwise return -1. */
6c3182a5 11850
bd81e77b
NC
11851STATIC I32
11852S_find_array_subscript(pTHX_ AV *av, SV* val)
11853{
97aff369 11854 dVAR;
bd81e77b
NC
11855 if (!av || SvMAGICAL(av) || !AvARRAY(av) ||
11856 (AvFILLp(av) > FUV_MAX_SEARCH_SIZE))
11857 return -1;
57c6e6d2 11858
4a021917
AL
11859 if (val != &PL_sv_undef) {
11860 SV ** const svp = AvARRAY(av);
11861 I32 i;
11862
11863 for (i=AvFILLp(av); i>=0; i--)
11864 if (svp[i] == val)
11865 return i;
bd81e77b
NC
11866 }
11867 return -1;
11868}
15a5279a 11869
bd81e77b
NC
11870/* S_varname(): return the name of a variable, optionally with a subscript.
11871 * If gv is non-zero, use the name of that global, along with gvtype (one
11872 * of "$", "@", "%"); otherwise use the name of the lexical at pad offset
11873 * targ. Depending on the value of the subscript_type flag, return:
11874 */
bce260cd 11875
bd81e77b
NC
11876#define FUV_SUBSCRIPT_NONE 1 /* "@foo" */
11877#define FUV_SUBSCRIPT_ARRAY 2 /* "$foo[aindex]" */
11878#define FUV_SUBSCRIPT_HASH 3 /* "$foo{keyname}" */
11879#define FUV_SUBSCRIPT_WITHIN 4 /* "within @foo" */
bce260cd 11880
bd81e77b
NC
11881STATIC SV*
11882S_varname(pTHX_ GV *gv, const char gvtype, PADOFFSET targ,
11883 SV* keyname, I32 aindex, int subscript_type)
11884{
1d7c1841 11885
bd81e77b
NC
11886 SV * const name = sv_newmortal();
11887 if (gv) {
11888 char buffer[2];
11889 buffer[0] = gvtype;
11890 buffer[1] = 0;
1d7c1841 11891
bd81e77b 11892 /* as gv_fullname4(), but add literal '^' for $^FOO names */
66fe0623 11893
bd81e77b 11894 gv_fullname4(name, gv, buffer, 0);
1d7c1841 11895
bd81e77b
NC
11896 if ((unsigned int)SvPVX(name)[1] <= 26) {
11897 buffer[0] = '^';
11898 buffer[1] = SvPVX(name)[1] + 'A' - 1;
1d7c1841 11899
bd81e77b
NC
11900 /* Swap the 1 unprintable control character for the 2 byte pretty
11901 version - ie substr($name, 1, 1) = $buffer; */
11902 sv_insert(name, 1, 1, buffer, 2);
1d7c1841 11903 }
bd81e77b
NC
11904 }
11905 else {
289b91d9 11906 CV * const cv = find_runcv(NULL);
bd81e77b
NC
11907 SV *sv;
11908 AV *av;
1d7c1841 11909
bd81e77b 11910 if (!cv || !CvPADLIST(cv))
a0714e2c 11911 return NULL;
bd81e77b
NC
11912 av = (AV*)(*av_fetch(CvPADLIST(cv), 0, FALSE));
11913 sv = *av_fetch(av, targ, FALSE);
f8503592 11914 sv_setpvn(name, SvPV_nolen_const(sv), SvCUR(sv));
bd81e77b 11915 }
1d7c1841 11916
bd81e77b 11917 if (subscript_type == FUV_SUBSCRIPT_HASH) {
561b68a9 11918 SV * const sv = newSV(0);
bd81e77b
NC
11919 *SvPVX(name) = '$';
11920 Perl_sv_catpvf(aTHX_ name, "{%s}",
11921 pv_display(sv,SvPVX_const(keyname), SvCUR(keyname), 0, 32));
11922 SvREFCNT_dec(sv);
11923 }
11924 else if (subscript_type == FUV_SUBSCRIPT_ARRAY) {
11925 *SvPVX(name) = '$';
11926 Perl_sv_catpvf(aTHX_ name, "[%"IVdf"]", (IV)aindex);
11927 }
11928 else if (subscript_type == FUV_SUBSCRIPT_WITHIN)
89529cee 11929 Perl_sv_insert(aTHX_ name, 0, 0, STR_WITH_LEN("within "));
1d7c1841 11930
bd81e77b
NC
11931 return name;
11932}
1d7c1841 11933
1d7c1841 11934
bd81e77b
NC
11935/*
11936=for apidoc find_uninit_var
1d7c1841 11937
bd81e77b
NC
11938Find the name of the undefined variable (if any) that caused the operator o
11939to issue a "Use of uninitialized value" warning.
11940If match is true, only return a name if it's value matches uninit_sv.
11941So roughly speaking, if a unary operator (such as OP_COS) generates a
11942warning, then following the direct child of the op may yield an
11943OP_PADSV or OP_GV that gives the name of the undefined variable. On the
11944other hand, with OP_ADD there are two branches to follow, so we only print
11945the variable name if we get an exact match.
1d7c1841 11946
bd81e77b 11947The name is returned as a mortal SV.
1d7c1841 11948
bd81e77b
NC
11949Assumes that PL_op is the op that originally triggered the error, and that
11950PL_comppad/PL_curpad points to the currently executing pad.
1d7c1841 11951
bd81e77b
NC
11952=cut
11953*/
1d7c1841 11954
bd81e77b
NC
11955STATIC SV *
11956S_find_uninit_var(pTHX_ OP* obase, SV* uninit_sv, bool match)
11957{
11958 dVAR;
11959 SV *sv;
11960 AV *av;
11961 GV *gv;
11962 OP *o, *o2, *kid;
1d7c1841 11963
bd81e77b
NC
11964 if (!obase || (match && (!uninit_sv || uninit_sv == &PL_sv_undef ||
11965 uninit_sv == &PL_sv_placeholder)))
a0714e2c 11966 return NULL;
1d7c1841 11967
bd81e77b 11968 switch (obase->op_type) {
1d7c1841 11969
bd81e77b
NC
11970 case OP_RV2AV:
11971 case OP_RV2HV:
11972 case OP_PADAV:
11973 case OP_PADHV:
11974 {
11975 const bool pad = (obase->op_type == OP_PADAV || obase->op_type == OP_PADHV);
11976 const bool hash = (obase->op_type == OP_PADHV || obase->op_type == OP_RV2HV);
11977 I32 index = 0;
a0714e2c 11978 SV *keysv = NULL;
bd81e77b 11979 int subscript_type = FUV_SUBSCRIPT_WITHIN;
1d7c1841 11980
bd81e77b
NC
11981 if (pad) { /* @lex, %lex */
11982 sv = PAD_SVl(obase->op_targ);
a0714e2c 11983 gv = NULL;
bd81e77b
NC
11984 }
11985 else {
11986 if (cUNOPx(obase)->op_first->op_type == OP_GV) {
11987 /* @global, %global */
11988 gv = cGVOPx_gv(cUNOPx(obase)->op_first);
11989 if (!gv)
11990 break;
11991 sv = hash ? (SV*)GvHV(gv): (SV*)GvAV(gv);
11992 }
11993 else /* @{expr}, %{expr} */
11994 return find_uninit_var(cUNOPx(obase)->op_first,
11995 uninit_sv, match);
11996 }
1d7c1841 11997
bd81e77b
NC
11998 /* attempt to find a match within the aggregate */
11999 if (hash) {
d4c19fe8 12000 keysv = find_hash_subscript((HV*)sv, uninit_sv);
bd81e77b
NC
12001 if (keysv)
12002 subscript_type = FUV_SUBSCRIPT_HASH;
12003 }
12004 else {
e15d5972 12005 index = find_array_subscript((AV*)sv, uninit_sv);
bd81e77b
NC
12006 if (index >= 0)
12007 subscript_type = FUV_SUBSCRIPT_ARRAY;
12008 }
1d7c1841 12009
bd81e77b
NC
12010 if (match && subscript_type == FUV_SUBSCRIPT_WITHIN)
12011 break;
1d7c1841 12012
bd81e77b
NC
12013 return varname(gv, hash ? '%' : '@', obase->op_targ,
12014 keysv, index, subscript_type);
12015 }
1d7c1841 12016
bd81e77b
NC
12017 case OP_PADSV:
12018 if (match && PAD_SVl(obase->op_targ) != uninit_sv)
12019 break;
a0714e2c
SS
12020 return varname(NULL, '$', obase->op_targ,
12021 NULL, 0, FUV_SUBSCRIPT_NONE);
1d7c1841 12022
bd81e77b
NC
12023 case OP_GVSV:
12024 gv = cGVOPx_gv(obase);
12025 if (!gv || (match && GvSV(gv) != uninit_sv))
12026 break;
a0714e2c 12027 return varname(gv, '$', 0, NULL, 0, FUV_SUBSCRIPT_NONE);
1d7c1841 12028
bd81e77b
NC
12029 case OP_AELEMFAST:
12030 if (obase->op_flags & OPf_SPECIAL) { /* lexical array */
12031 if (match) {
12032 SV **svp;
12033 av = (AV*)PAD_SV(obase->op_targ);
12034 if (!av || SvRMAGICAL(av))
12035 break;
12036 svp = av_fetch(av, (I32)obase->op_private, FALSE);
12037 if (!svp || *svp != uninit_sv)
12038 break;
12039 }
a0714e2c
SS
12040 return varname(NULL, '$', obase->op_targ,
12041 NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
12042 }
12043 else {
12044 gv = cGVOPx_gv(obase);
12045 if (!gv)
12046 break;
12047 if (match) {
12048 SV **svp;
12049 av = GvAV(gv);
12050 if (!av || SvRMAGICAL(av))
12051 break;
12052 svp = av_fetch(av, (I32)obase->op_private, FALSE);
12053 if (!svp || *svp != uninit_sv)
12054 break;
12055 }
12056 return varname(gv, '$', 0,
a0714e2c 12057 NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
12058 }
12059 break;
1d7c1841 12060
bd81e77b
NC
12061 case OP_EXISTS:
12062 o = cUNOPx(obase)->op_first;
12063 if (!o || o->op_type != OP_NULL ||
12064 ! (o->op_targ == OP_AELEM || o->op_targ == OP_HELEM))
12065 break;
12066 return find_uninit_var(cBINOPo->op_last, uninit_sv, match);
a2efc822 12067
bd81e77b
NC
12068 case OP_AELEM:
12069 case OP_HELEM:
12070 if (PL_op == obase)
12071 /* $a[uninit_expr] or $h{uninit_expr} */
12072 return find_uninit_var(cBINOPx(obase)->op_last, uninit_sv, match);
081fc587 12073
a0714e2c 12074 gv = NULL;
bd81e77b
NC
12075 o = cBINOPx(obase)->op_first;
12076 kid = cBINOPx(obase)->op_last;
8cf8f3d1 12077
bd81e77b 12078 /* get the av or hv, and optionally the gv */
a0714e2c 12079 sv = NULL;
bd81e77b
NC
12080 if (o->op_type == OP_PADAV || o->op_type == OP_PADHV) {
12081 sv = PAD_SV(o->op_targ);
12082 }
12083 else if ((o->op_type == OP_RV2AV || o->op_type == OP_RV2HV)
12084 && cUNOPo->op_first->op_type == OP_GV)
12085 {
12086 gv = cGVOPx_gv(cUNOPo->op_first);
12087 if (!gv)
12088 break;
12089 sv = o->op_type == OP_RV2HV ? (SV*)GvHV(gv) : (SV*)GvAV(gv);
12090 }
12091 if (!sv)
12092 break;
12093
12094 if (kid && kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid))) {
12095 /* index is constant */
12096 if (match) {
12097 if (SvMAGICAL(sv))
12098 break;
12099 if (obase->op_type == OP_HELEM) {
12100 HE* he = hv_fetch_ent((HV*)sv, cSVOPx_sv(kid), 0, 0);
12101 if (!he || HeVAL(he) != uninit_sv)
12102 break;
12103 }
12104 else {
00b6aa41 12105 SV * const * const svp = av_fetch((AV*)sv, SvIV(cSVOPx_sv(kid)), FALSE);
bd81e77b
NC
12106 if (!svp || *svp != uninit_sv)
12107 break;
12108 }
12109 }
12110 if (obase->op_type == OP_HELEM)
12111 return varname(gv, '%', o->op_targ,
12112 cSVOPx_sv(kid), 0, FUV_SUBSCRIPT_HASH);
12113 else
a0714e2c 12114 return varname(gv, '@', o->op_targ, NULL,
bd81e77b 12115 SvIV(cSVOPx_sv(kid)), FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
12116 }
12117 else {
12118 /* index is an expression;
12119 * attempt to find a match within the aggregate */
12120 if (obase->op_type == OP_HELEM) {
d4c19fe8 12121 SV * const keysv = find_hash_subscript((HV*)sv, uninit_sv);
bd81e77b
NC
12122 if (keysv)
12123 return varname(gv, '%', o->op_targ,
12124 keysv, 0, FUV_SUBSCRIPT_HASH);
12125 }
12126 else {
d4c19fe8 12127 const I32 index = find_array_subscript((AV*)sv, uninit_sv);
bd81e77b
NC
12128 if (index >= 0)
12129 return varname(gv, '@', o->op_targ,
a0714e2c 12130 NULL, index, FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
12131 }
12132 if (match)
12133 break;
12134 return varname(gv,
12135 (o->op_type == OP_PADAV || o->op_type == OP_RV2AV)
12136 ? '@' : '%',
a0714e2c 12137 o->op_targ, NULL, 0, FUV_SUBSCRIPT_WITHIN);
f284b03f 12138 }
bd81e77b 12139 break;
dc507217 12140
bd81e77b
NC
12141 case OP_AASSIGN:
12142 /* only examine RHS */
12143 return find_uninit_var(cBINOPx(obase)->op_first, uninit_sv, match);
6d26897e 12144
bd81e77b
NC
12145 case OP_OPEN:
12146 o = cUNOPx(obase)->op_first;
12147 if (o->op_type == OP_PUSHMARK)
12148 o = o->op_sibling;
1d7c1841 12149
bd81e77b
NC
12150 if (!o->op_sibling) {
12151 /* one-arg version of open is highly magical */
a0ae6670 12152
bd81e77b
NC
12153 if (o->op_type == OP_GV) { /* open FOO; */
12154 gv = cGVOPx_gv(o);
12155 if (match && GvSV(gv) != uninit_sv)
12156 break;
12157 return varname(gv, '$', 0,
a0714e2c 12158 NULL, 0, FUV_SUBSCRIPT_NONE);
bd81e77b
NC
12159 }
12160 /* other possibilities not handled are:
12161 * open $x; or open my $x; should return '${*$x}'
12162 * open expr; should return '$'.expr ideally
12163 */
12164 break;
12165 }
12166 goto do_op;
ccfc67b7 12167
bd81e77b
NC
12168 /* ops where $_ may be an implicit arg */
12169 case OP_TRANS:
12170 case OP_SUBST:
12171 case OP_MATCH:
12172 if ( !(obase->op_flags & OPf_STACKED)) {
12173 if (uninit_sv == ((obase->op_private & OPpTARGET_MY)
12174 ? PAD_SVl(obase->op_targ)
12175 : DEFSV))
12176 {
12177 sv = sv_newmortal();
12178 sv_setpvn(sv, "$_", 2);
12179 return sv;
12180 }
12181 }
12182 goto do_op;
9f4817db 12183
bd81e77b
NC
12184 case OP_PRTF:
12185 case OP_PRINT:
3ef1310e 12186 case OP_SAY:
bd81e77b
NC
12187 /* skip filehandle as it can't produce 'undef' warning */
12188 o = cUNOPx(obase)->op_first;
12189 if ((obase->op_flags & OPf_STACKED) && o->op_type == OP_PUSHMARK)
12190 o = o->op_sibling->op_sibling;
12191 goto do_op2;
9f4817db 12192
9f4817db 12193
bd81e77b
NC
12194 case OP_RV2SV:
12195 case OP_CUSTOM:
bd81e77b
NC
12196 match = 1; /* XS or custom code could trigger random warnings */
12197 goto do_op;
9f4817db 12198
7697b7e7
DM
12199 case OP_ENTERSUB:
12200 case OP_GOTO:
a2fb3d36
DM
12201 /* XXX tmp hack: these two may call an XS sub, and currently
12202 XS subs don't have a SUB entry on the context stack, so CV and
12203 pad determination goes wrong, and BAD things happen. So, just
12204 don't try to determine the value under those circumstances.
7697b7e7
DM
12205 Need a better fix at dome point. DAPM 11/2007 */
12206 break;
12207
cc4b8646
DM
12208 case OP_POS:
12209 /* def-ness of rval pos() is independent of the def-ness of its arg */
12210 if ( !(obase->op_flags & OPf_MOD))
12211 break;
12212
bd81e77b
NC
12213 case OP_SCHOMP:
12214 case OP_CHOMP:
12215 if (SvROK(PL_rs) && uninit_sv == SvRV(PL_rs))
84bafc02 12216 return newSVpvs_flags("${$/}", SVs_TEMP);
5f66b61c 12217 /*FALLTHROUGH*/
5d170f3a 12218
bd81e77b
NC
12219 default:
12220 do_op:
12221 if (!(obase->op_flags & OPf_KIDS))
12222 break;
12223 o = cUNOPx(obase)->op_first;
12224
12225 do_op2:
12226 if (!o)
12227 break;
f9893866 12228
bd81e77b
NC
12229 /* if all except one arg are constant, or have no side-effects,
12230 * or are optimized away, then it's unambiguous */
5f66b61c 12231 o2 = NULL;
bd81e77b 12232 for (kid=o; kid; kid = kid->op_sibling) {
e15d5972
AL
12233 if (kid) {
12234 const OPCODE type = kid->op_type;
12235 if ( (type == OP_CONST && SvOK(cSVOPx_sv(kid)))
12236 || (type == OP_NULL && ! (kid->op_flags & OPf_KIDS))
12237 || (type == OP_PUSHMARK)
bd81e77b 12238 )
bd81e77b 12239 continue;
e15d5972 12240 }
bd81e77b 12241 if (o2) { /* more than one found */
5f66b61c 12242 o2 = NULL;
bd81e77b
NC
12243 break;
12244 }
12245 o2 = kid;
12246 }
12247 if (o2)
12248 return find_uninit_var(o2, uninit_sv, match);
7a5fa8a2 12249
bd81e77b
NC
12250 /* scan all args */
12251 while (o) {
12252 sv = find_uninit_var(o, uninit_sv, 1);
12253 if (sv)
12254 return sv;
12255 o = o->op_sibling;
d0063567 12256 }
bd81e77b 12257 break;
f9893866 12258 }
a0714e2c 12259 return NULL;
9f4817db
JH
12260}
12261
220e2d4e 12262
bd81e77b
NC
12263/*
12264=for apidoc report_uninit
68795e93 12265
bd81e77b 12266Print appropriate "Use of uninitialized variable" warning
220e2d4e 12267
bd81e77b
NC
12268=cut
12269*/
220e2d4e 12270
bd81e77b
NC
12271void
12272Perl_report_uninit(pTHX_ SV* uninit_sv)
220e2d4e 12273{
97aff369 12274 dVAR;
bd81e77b 12275 if (PL_op) {
a0714e2c 12276 SV* varname = NULL;
bd81e77b
NC
12277 if (uninit_sv) {
12278 varname = find_uninit_var(PL_op, uninit_sv,0);
12279 if (varname)
12280 sv_insert(varname, 0, 0, " ", 1);
12281 }
12282 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
12283 varname ? SvPV_nolen_const(varname) : "",
12284 " in ", OP_DESC(PL_op));
220e2d4e 12285 }
a73e8557 12286 else
bd81e77b
NC
12287 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
12288 "", "", "");
220e2d4e 12289}
f9893866 12290
241d1a3b
NC
12291/*
12292 * Local variables:
12293 * c-indentation-style: bsd
12294 * c-basic-offset: 4
12295 * indent-tabs-mode: t
12296 * End:
12297 *
37442d52
RGS
12298 * ex: set ts=8 sts=4 sw=4 noet:
12299 */