This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Regenerate Changes.
[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
NC
356#endif
357 /* Must always set typemask because it's awlays checked in on cleanup
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
JC
546 smaller types). The recovery of the wasted space allows use of
547 small arenas for large, rare body types,
5e258f8c 548*/
5e258f8c 549struct arena_desc {
398c677b
NC
550 char *arena; /* the raw storage, allocated aligned */
551 size_t size; /* its size ~4k typ */
0a848332 552 U32 misc; /* type, and in future other things. */
5e258f8c
JC
553};
554
e6148039
NC
555struct arena_set;
556
557/* Get the maximum number of elements in set[] such that struct arena_set
558 will fit within PERL_ARENA_SIZE, which is probabably just under 4K, and
559 therefore likely to be 1 aligned memory page. */
560
561#define ARENAS_PER_SET ((PERL_ARENA_SIZE - sizeof(struct arena_set*) \
562 - 2 * sizeof(int)) / sizeof (struct arena_desc))
5e258f8c
JC
563
564struct arena_set {
565 struct arena_set* next;
0a848332
NC
566 unsigned int set_size; /* ie ARENAS_PER_SET */
567 unsigned int curr; /* index of next available arena-desc */
5e258f8c
JC
568 struct arena_desc set[ARENAS_PER_SET];
569};
570
645c22ef
DM
571/*
572=for apidoc sv_free_arenas
573
574Deallocate the memory used by all arenas. Note that all the individual SV
575heads and bodies within the arenas must already have been freed.
576
577=cut
578*/
4633a7c4 579void
864dbfa3 580Perl_sv_free_arenas(pTHX)
4633a7c4 581{
97aff369 582 dVAR;
4633a7c4
LW
583 SV* sva;
584 SV* svanext;
0a848332 585 unsigned int i;
4633a7c4
LW
586
587 /* Free arenas here, but be careful about fake ones. (We assume
588 contiguity of the fake ones with the corresponding real ones.) */
589
3280af22 590 for (sva = PL_sv_arenaroot; sva; sva = svanext) {
4633a7c4
LW
591 svanext = (SV*) SvANY(sva);
592 while (svanext && SvFAKE(svanext))
593 svanext = (SV*) SvANY(svanext);
594
595 if (!SvFAKE(sva))
1df70142 596 Safefree(sva);
4633a7c4 597 }
93e68bfb 598
5e258f8c 599 {
0a848332
NC
600 struct arena_set *aroot = (struct arena_set*) PL_body_arenas;
601
602 while (aroot) {
603 struct arena_set *current = aroot;
604 i = aroot->curr;
605 while (i--) {
5e258f8c
JC
606 assert(aroot->set[i].arena);
607 Safefree(aroot->set[i].arena);
608 }
0a848332
NC
609 aroot = aroot->next;
610 Safefree(current);
5e258f8c
JC
611 }
612 }
dc8220bf 613 PL_body_arenas = 0;
fdda85ca 614
0a848332
NC
615 i = PERL_ARENA_ROOTS_SIZE;
616 while (i--)
93e68bfb 617 PL_body_roots[i] = 0;
93e68bfb 618
43c5f42d 619 Safefree(PL_nice_chunk);
bd61b366 620 PL_nice_chunk = NULL;
3280af22
NIS
621 PL_nice_chunk_size = 0;
622 PL_sv_arenaroot = 0;
623 PL_sv_root = 0;
4633a7c4
LW
624}
625
bd81e77b
NC
626/*
627 Here are mid-level routines that manage the allocation of bodies out
628 of the various arenas. There are 5 kinds of arenas:
29489e7c 629
bd81e77b
NC
630 1. SV-head arenas, which are discussed and handled above
631 2. regular body arenas
632 3. arenas for reduced-size bodies
633 4. Hash-Entry arenas
634 5. pte arenas (thread related)
29489e7c 635
bd81e77b
NC
636 Arena types 2 & 3 are chained by body-type off an array of
637 arena-root pointers, which is indexed by svtype. Some of the
638 larger/less used body types are malloced singly, since a large
639 unused block of them is wasteful. Also, several svtypes dont have
640 bodies; the data fits into the sv-head itself. The arena-root
641 pointer thus has a few unused root-pointers (which may be hijacked
642 later for arena types 4,5)
29489e7c 643
bd81e77b
NC
644 3 differs from 2 as an optimization; some body types have several
645 unused fields in the front of the structure (which are kept in-place
646 for consistency). These bodies can be allocated in smaller chunks,
647 because the leading fields arent accessed. Pointers to such bodies
648 are decremented to point at the unused 'ghost' memory, knowing that
649 the pointers are used with offsets to the real memory.
29489e7c 650
bd81e77b
NC
651 HE, HEK arenas are managed separately, with separate code, but may
652 be merge-able later..
653
654 PTE arenas are not sv-bodies, but they share these mid-level
655 mechanics, so are considered here. The new mid-level mechanics rely
656 on the sv_type of the body being allocated, so we just reserve one
657 of the unused body-slots for PTEs, then use it in those (2) PTE
658 contexts below (line ~10k)
659*/
660
bd26d9a3 661/* get_arena(size): this creates custom-sized arenas
5e258f8c
JC
662 TBD: export properly for hv.c: S_more_he().
663*/
664void*
0a848332 665Perl_get_arena(pTHX_ size_t arena_size, U32 misc)
5e258f8c 666{
7a89be66 667 dVAR;
5e258f8c 668 struct arena_desc* adesc;
39244528 669 struct arena_set *aroot = (struct arena_set*) PL_body_arenas;
0a848332 670 unsigned int curr;
5e258f8c 671
476a1e16
JC
672 /* shouldnt need this
673 if (!arena_size) arena_size = PERL_ARENA_SIZE;
674 */
5e258f8c
JC
675
676 /* may need new arena-set to hold new arena */
39244528
NC
677 if (!aroot || aroot->curr >= aroot->set_size) {
678 struct arena_set *newroot;
5e258f8c
JC
679 Newxz(newroot, 1, struct arena_set);
680 newroot->set_size = ARENAS_PER_SET;
39244528
NC
681 newroot->next = aroot;
682 aroot = newroot;
683 PL_body_arenas = (void *) newroot;
52944de8 684 DEBUG_m(PerlIO_printf(Perl_debug_log, "new arenaset %p\n", (void*)aroot));
5e258f8c
JC
685 }
686
687 /* ok, now have arena-set with at least 1 empty/available arena-desc */
39244528
NC
688 curr = aroot->curr++;
689 adesc = &(aroot->set[curr]);
5e258f8c
JC
690 assert(!adesc->arena);
691
89086707 692 Newx(adesc->arena, arena_size, char);
5e258f8c 693 adesc->size = arena_size;
0a848332 694 adesc->misc = misc;
d67b3c53
JH
695 DEBUG_m(PerlIO_printf(Perl_debug_log, "arena %d added: %p size %"UVuf"\n",
696 curr, (void*)adesc->arena, (UV)arena_size));
5e258f8c
JC
697
698 return adesc->arena;
5e258f8c
JC
699}
700
53c1dcc0 701
bd81e77b 702/* return a thing to the free list */
29489e7c 703
bd81e77b
NC
704#define del_body(thing, root) \
705 STMT_START { \
00b6aa41 706 void ** const thing_copy = (void **)thing;\
bd81e77b
NC
707 *thing_copy = *root; \
708 *root = (void*)thing_copy; \
bd81e77b 709 } STMT_END
29489e7c 710
bd81e77b 711/*
d2a0f284
JC
712
713=head1 SV-Body Allocation
714
715Allocation of SV-bodies is similar to SV-heads, differing as follows;
716the allocation mechanism is used for many body types, so is somewhat
717more complicated, it uses arena-sets, and has no need for still-live
718SV detection.
719
720At the outermost level, (new|del)_X*V macros return bodies of the
721appropriate type. These macros call either (new|del)_body_type or
722(new|del)_body_allocated macro pairs, depending on specifics of the
723type. Most body types use the former pair, the latter pair is used to
724allocate body types with "ghost fields".
725
726"ghost fields" are fields that are unused in certain types, and
727consequently dont need to actually exist. They are declared because
728they're part of a "base type", which allows use of functions as
729methods. The simplest examples are AVs and HVs, 2 aggregate types
730which don't use the fields which support SCALAR semantics.
731
732For these types, the arenas are carved up into *_allocated size
733chunks, we thus avoid wasted memory for those unaccessed members.
734When bodies are allocated, we adjust the pointer back in memory by the
735size of the bit not allocated, so it's as if we allocated the full
736structure. (But things will all go boom if you write to the part that
737is "not there", because you'll be overwriting the last members of the
738preceding structure in memory.)
739
740We calculate the correction using the STRUCT_OFFSET macro. For
741example, if xpv_allocated is the same structure as XPV then the two
742OFFSETs sum to zero, and the pointer is unchanged. If the allocated
743structure is smaller (no initial NV actually allocated) then the net
744effect is to subtract the size of the NV from the pointer, to return a
745new pointer as if an initial NV were actually allocated.
746
747This is the same trick as was used for NV and IV bodies. Ironically it
748doesn't need to be used for NV bodies any more, because NV is now at
749the start of the structure. IV bodies don't need it either, because
750they are no longer allocated.
751
752In turn, the new_body_* allocators call S_new_body(), which invokes
753new_body_inline macro, which takes a lock, and takes a body off the
754linked list at PL_body_roots[sv_type], calling S_more_bodies() if
755necessary to refresh an empty list. Then the lock is released, and
756the body is returned.
757
758S_more_bodies calls get_arena(), and carves it up into an array of N
759bodies, which it strings into a linked list. It looks up arena-size
760and body-size from the body_details table described below, thus
761supporting the multiple body-types.
762
763If PURIFY is defined, or PERL_ARENA_SIZE=0, arenas are not used, and
764the (new|del)_X*V macros are mapped directly to malloc/free.
765
766*/
767
768/*
769
770For each sv-type, struct body_details bodies_by_type[] carries
771parameters which control these aspects of SV handling:
772
773Arena_size determines whether arenas are used for this body type, and if
774so, how big they are. PURIFY or PERL_ARENA_SIZE=0 set this field to
775zero, forcing individual mallocs and frees.
776
777Body_size determines how big a body is, and therefore how many fit into
778each arena. Offset carries the body-pointer adjustment needed for
779*_allocated body types, and is used in *_allocated macros.
780
781But its main purpose is to parameterize info needed in
782Perl_sv_upgrade(). The info here dramatically simplifies the function
783vs the implementation in 5.8.7, making it table-driven. All fields
784are used for this, except for arena_size.
785
786For the sv-types that have no bodies, arenas are not used, so those
787PL_body_roots[sv_type] are unused, and can be overloaded. In
788something of a special case, SVt_NULL is borrowed for HE arenas;
c6f8b1d0 789PL_body_roots[HE_SVSLOT=SVt_NULL] is filled by S_more_he, but the
d2a0f284 790bodies_by_type[SVt_NULL] slot is not used, as the table is not
c6f8b1d0 791available in hv.c.
d2a0f284 792
c6f8b1d0
JC
793PTEs also use arenas, but are never seen in Perl_sv_upgrade. Nonetheless,
794they get their own slot in bodies_by_type[PTE_SVSLOT =SVt_IV], so they can
795just use the same allocation semantics. At first, PTEs were also
796overloaded to a non-body sv-type, but this yielded hard-to-find malloc
797bugs, so was simplified by claiming a new slot. This choice has no
798consequence at this time.
d2a0f284 799
29489e7c
DM
800*/
801
bd81e77b 802struct body_details {
0fb58b32 803 U8 body_size; /* Size to allocate */
10666ae3 804 U8 copy; /* Size of structure to copy (may be shorter) */
0fb58b32 805 U8 offset;
10666ae3
NC
806 unsigned int type : 4; /* We have space for a sanity check. */
807 unsigned int cant_upgrade : 1; /* Cannot upgrade this type */
808 unsigned int zero_nv : 1; /* zero the NV when upgrading from this */
809 unsigned int arena : 1; /* Allocated from an arena */
810 size_t arena_size; /* Size of arena to allocate */
bd81e77b 811};
29489e7c 812
bd81e77b
NC
813#define HADNV FALSE
814#define NONV TRUE
29489e7c 815
d2a0f284 816
bd81e77b
NC
817#ifdef PURIFY
818/* With -DPURFIY we allocate everything directly, and don't use arenas.
819 This seems a rather elegant way to simplify some of the code below. */
820#define HASARENA FALSE
821#else
822#define HASARENA TRUE
823#endif
824#define NOARENA FALSE
29489e7c 825
d2a0f284
JC
826/* Size the arenas to exactly fit a given number of bodies. A count
827 of 0 fits the max number bodies into a PERL_ARENA_SIZE.block,
828 simplifying the default. If count > 0, the arena is sized to fit
829 only that many bodies, allowing arenas to be used for large, rare
830 bodies (XPVFM, XPVIO) without undue waste. The arena size is
831 limited by PERL_ARENA_SIZE, so we can safely oversize the
832 declarations.
833 */
95db5f15
MB
834#define FIT_ARENA0(body_size) \
835 ((size_t)(PERL_ARENA_SIZE / body_size) * body_size)
836#define FIT_ARENAn(count,body_size) \
837 ( count * body_size <= PERL_ARENA_SIZE) \
838 ? count * body_size \
839 : FIT_ARENA0 (body_size)
840#define FIT_ARENA(count,body_size) \
841 count \
842 ? FIT_ARENAn (count, body_size) \
843 : FIT_ARENA0 (body_size)
d2a0f284 844
bd81e77b 845/* A macro to work out the offset needed to subtract from a pointer to (say)
29489e7c 846
bd81e77b
NC
847typedef struct {
848 STRLEN xpv_cur;
849 STRLEN xpv_len;
850} xpv_allocated;
29489e7c 851
bd81e77b 852to make its members accessible via a pointer to (say)
29489e7c 853
bd81e77b
NC
854struct xpv {
855 NV xnv_nv;
856 STRLEN xpv_cur;
857 STRLEN xpv_len;
858};
29489e7c 859
bd81e77b 860*/
29489e7c 861
bd81e77b
NC
862#define relative_STRUCT_OFFSET(longer, shorter, member) \
863 (STRUCT_OFFSET(shorter, member) - STRUCT_OFFSET(longer, member))
29489e7c 864
bd81e77b
NC
865/* Calculate the length to copy. Specifically work out the length less any
866 final padding the compiler needed to add. See the comment in sv_upgrade
867 for why copying the padding proved to be a bug. */
29489e7c 868
bd81e77b
NC
869#define copy_length(type, last_member) \
870 STRUCT_OFFSET(type, last_member) \
871 + sizeof (((type*)SvANY((SV*)0))->last_member)
29489e7c 872
bd81e77b 873static const struct body_details bodies_by_type[] = {
10666ae3
NC
874 { sizeof(HE), 0, 0, SVt_NULL,
875 FALSE, NONV, NOARENA, FIT_ARENA(0, sizeof(HE)) },
d2a0f284 876
1cb9cd50 877 /* The bind placeholder pretends to be an RV for now.
c6f8b1d0 878 Also it's marked as "can't upgrade" to stop anyone using it before it's
1cb9cd50
NC
879 implemented. */
880 { 0, 0, 0, SVt_BIND, TRUE, NONV, NOARENA, 0 },
881
d2a0f284
JC
882 /* IVs are in the head, so the allocation size is 0.
883 However, the slot is overloaded for PTEs. */
884 { sizeof(struct ptr_tbl_ent), /* This is used for PTEs. */
885 sizeof(IV), /* This is used to copy out the IV body. */
10666ae3 886 STRUCT_OFFSET(XPVIV, xiv_iv), SVt_IV, FALSE, NONV,
d2a0f284
JC
887 NOARENA /* IVS don't need an arena */,
888 /* But PTEs need to know the size of their arena */
889 FIT_ARENA(0, sizeof(struct ptr_tbl_ent))
890 },
891
bd81e77b 892 /* 8 bytes on most ILP32 with IEEE doubles */
10666ae3 893 { sizeof(NV), sizeof(NV), 0, SVt_NV, FALSE, HADNV, HASARENA,
d2a0f284
JC
894 FIT_ARENA(0, sizeof(NV)) },
895
896 /* RVs are in the head now. */
10666ae3 897 { 0, 0, 0, SVt_RV, FALSE, NONV, NOARENA, 0 },
d2a0f284 898
bd81e77b 899 /* 8 bytes on most ILP32 with IEEE doubles */
d2a0f284
JC
900 { sizeof(xpv_allocated),
901 copy_length(XPV, xpv_len)
902 - relative_STRUCT_OFFSET(xpv_allocated, XPV, xpv_cur),
903 + relative_STRUCT_OFFSET(xpv_allocated, XPV, xpv_cur),
10666ae3 904 SVt_PV, FALSE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpv_allocated)) },
d2a0f284 905
bd81e77b 906 /* 12 */
d2a0f284
JC
907 { sizeof(xpviv_allocated),
908 copy_length(XPVIV, xiv_u)
909 - relative_STRUCT_OFFSET(xpviv_allocated, XPVIV, xpv_cur),
910 + relative_STRUCT_OFFSET(xpviv_allocated, XPVIV, xpv_cur),
10666ae3 911 SVt_PVIV, FALSE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpviv_allocated)) },
d2a0f284 912
bd81e77b 913 /* 20 */
10666ae3 914 { sizeof(XPVNV), copy_length(XPVNV, xiv_u), 0, SVt_PVNV, FALSE, HADNV,
d2a0f284
JC
915 HASARENA, FIT_ARENA(0, sizeof(XPVNV)) },
916
bd81e77b 917 /* 28 */
10666ae3 918 { sizeof(XPVMG), copy_length(XPVMG, xmg_stash), 0, SVt_PVMG, FALSE, HADNV,
d2a0f284
JC
919 HASARENA, FIT_ARENA(0, sizeof(XPVMG)) },
920
bd81e77b 921 /* 48 */
10666ae3 922 { sizeof(XPVGV), sizeof(XPVGV), 0, SVt_PVGV, TRUE, HADNV,
d2a0f284
JC
923 HASARENA, FIT_ARENA(0, sizeof(XPVGV)) },
924
bd81e77b 925 /* 64 */
10666ae3 926 { sizeof(XPVLV), sizeof(XPVLV), 0, SVt_PVLV, TRUE, HADNV,
d2a0f284
JC
927 HASARENA, FIT_ARENA(0, sizeof(XPVLV)) },
928
929 { sizeof(xpvav_allocated),
930 copy_length(XPVAV, xmg_stash)
931 - relative_STRUCT_OFFSET(xpvav_allocated, XPVAV, xav_fill),
932 + relative_STRUCT_OFFSET(xpvav_allocated, XPVAV, xav_fill),
9c59bb28 933 SVt_PVAV, TRUE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpvav_allocated)) },
d2a0f284
JC
934
935 { sizeof(xpvhv_allocated),
936 copy_length(XPVHV, xmg_stash)
937 - relative_STRUCT_OFFSET(xpvhv_allocated, XPVHV, xhv_fill),
938 + relative_STRUCT_OFFSET(xpvhv_allocated, XPVHV, xhv_fill),
9c59bb28 939 SVt_PVHV, TRUE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpvhv_allocated)) },
d2a0f284 940
c84c4652 941 /* 56 */
4115f141 942 { sizeof(xpvcv_allocated), sizeof(xpvcv_allocated),
c84c4652 943 + relative_STRUCT_OFFSET(xpvcv_allocated, XPVCV, xpv_cur),
10666ae3 944 SVt_PVCV, TRUE, NONV, HASARENA, FIT_ARENA(0, sizeof(xpvcv_allocated)) },
d2a0f284 945
4115f141 946 { sizeof(xpvfm_allocated), sizeof(xpvfm_allocated),
3038937b 947 + relative_STRUCT_OFFSET(xpvfm_allocated, XPVFM, xpv_cur),
10666ae3 948 SVt_PVFM, TRUE, NONV, NOARENA, FIT_ARENA(20, sizeof(xpvfm_allocated)) },
d2a0f284
JC
949
950 /* XPVIO is 84 bytes, fits 48x */
10666ae3 951 { sizeof(XPVIO), sizeof(XPVIO), 0, SVt_PVIO, TRUE, HADNV,
d2a0f284 952 HASARENA, FIT_ARENA(24, sizeof(XPVIO)) },
bd81e77b 953};
29489e7c 954
d2a0f284
JC
955#define new_body_type(sv_type) \
956 (void *)((char *)S_new_body(aTHX_ sv_type))
29489e7c 957
bd81e77b
NC
958#define del_body_type(p, sv_type) \
959 del_body(p, &PL_body_roots[sv_type])
29489e7c 960
29489e7c 961
bd81e77b 962#define new_body_allocated(sv_type) \
d2a0f284 963 (void *)((char *)S_new_body(aTHX_ sv_type) \
bd81e77b 964 - bodies_by_type[sv_type].offset)
29489e7c 965
bd81e77b
NC
966#define del_body_allocated(p, sv_type) \
967 del_body(p + bodies_by_type[sv_type].offset, &PL_body_roots[sv_type])
29489e7c 968
29489e7c 969
bd81e77b
NC
970#define my_safemalloc(s) (void*)safemalloc(s)
971#define my_safecalloc(s) (void*)safecalloc(s, 1)
972#define my_safefree(p) safefree((char*)p)
29489e7c 973
bd81e77b 974#ifdef PURIFY
29489e7c 975
bd81e77b
NC
976#define new_XNV() my_safemalloc(sizeof(XPVNV))
977#define del_XNV(p) my_safefree(p)
29489e7c 978
bd81e77b
NC
979#define new_XPVNV() my_safemalloc(sizeof(XPVNV))
980#define del_XPVNV(p) my_safefree(p)
29489e7c 981
bd81e77b
NC
982#define new_XPVAV() my_safemalloc(sizeof(XPVAV))
983#define del_XPVAV(p) my_safefree(p)
29489e7c 984
bd81e77b
NC
985#define new_XPVHV() my_safemalloc(sizeof(XPVHV))
986#define del_XPVHV(p) my_safefree(p)
29489e7c 987
bd81e77b
NC
988#define new_XPVMG() my_safemalloc(sizeof(XPVMG))
989#define del_XPVMG(p) my_safefree(p)
29489e7c 990
bd81e77b
NC
991#define new_XPVGV() my_safemalloc(sizeof(XPVGV))
992#define del_XPVGV(p) my_safefree(p)
29489e7c 993
bd81e77b 994#else /* !PURIFY */
29489e7c 995
bd81e77b
NC
996#define new_XNV() new_body_type(SVt_NV)
997#define del_XNV(p) del_body_type(p, SVt_NV)
29489e7c 998
bd81e77b
NC
999#define new_XPVNV() new_body_type(SVt_PVNV)
1000#define del_XPVNV(p) del_body_type(p, SVt_PVNV)
29489e7c 1001
bd81e77b
NC
1002#define new_XPVAV() new_body_allocated(SVt_PVAV)
1003#define del_XPVAV(p) del_body_allocated(p, SVt_PVAV)
645c22ef 1004
bd81e77b
NC
1005#define new_XPVHV() new_body_allocated(SVt_PVHV)
1006#define del_XPVHV(p) del_body_allocated(p, SVt_PVHV)
645c22ef 1007
bd81e77b
NC
1008#define new_XPVMG() new_body_type(SVt_PVMG)
1009#define del_XPVMG(p) del_body_type(p, SVt_PVMG)
645c22ef 1010
bd81e77b
NC
1011#define new_XPVGV() new_body_type(SVt_PVGV)
1012#define del_XPVGV(p) del_body_type(p, SVt_PVGV)
1d7c1841 1013
bd81e77b 1014#endif /* PURIFY */
93e68bfb 1015
bd81e77b 1016/* no arena for you! */
93e68bfb 1017
bd81e77b 1018#define new_NOARENA(details) \
d2a0f284 1019 my_safemalloc((details)->body_size + (details)->offset)
bd81e77b 1020#define new_NOARENAZ(details) \
d2a0f284
JC
1021 my_safecalloc((details)->body_size + (details)->offset)
1022
1023STATIC void *
1024S_more_bodies (pTHX_ svtype sv_type)
1025{
1026 dVAR;
1027 void ** const root = &PL_body_roots[sv_type];
96a5add6 1028 const struct body_details * const bdp = &bodies_by_type[sv_type];
d2a0f284
JC
1029 const size_t body_size = bdp->body_size;
1030 char *start;
1031 const char *end;
0b2d3faa 1032#if defined(DEBUGGING) && !defined(PERL_GLOBAL_STRUCT_PRIVATE)
23e9d66c
NC
1033 static bool done_sanity_check;
1034
0b2d3faa
JH
1035 /* PERL_GLOBAL_STRUCT_PRIVATE cannot coexist with global
1036 * variables like done_sanity_check. */
10666ae3 1037 if (!done_sanity_check) {
ea471437 1038 unsigned int i = SVt_LAST;
10666ae3
NC
1039
1040 done_sanity_check = TRUE;
1041
1042 while (i--)
1043 assert (bodies_by_type[i].type == i);
1044 }
1045#endif
1046
23e9d66c
NC
1047 assert(bdp->arena_size);
1048
0a848332 1049 start = (char*) Perl_get_arena(aTHX_ bdp->arena_size, sv_type);
d2a0f284
JC
1050
1051 end = start + bdp->arena_size - body_size;
1052
d2a0f284
JC
1053 /* computed count doesnt reflect the 1st slot reservation */
1054 DEBUG_m(PerlIO_printf(Perl_debug_log,
1055 "arena %p end %p arena-size %d type %d size %d ct %d\n",
6c9570dc 1056 (void*)start, (void*)end,
0e84aef4
JH
1057 (int)bdp->arena_size, sv_type, (int)body_size,
1058 (int)bdp->arena_size / (int)body_size));
d2a0f284
JC
1059
1060 *root = (void *)start;
1061
1062 while (start < end) {
1063 char * const next = start + body_size;
1064 *(void**) start = (void *)next;
1065 start = next;
1066 }
1067 *(void **)start = 0;
1068
1069 return *root;
1070}
1071
1072/* grab a new thing from the free list, allocating more if necessary.
1073 The inline version is used for speed in hot routines, and the
1074 function using it serves the rest (unless PURIFY).
1075*/
1076#define new_body_inline(xpv, sv_type) \
1077 STMT_START { \
1078 void ** const r3wt = &PL_body_roots[sv_type]; \
11b79775
DD
1079 xpv = (PTR_TBL_ENT_t*) (*((void **)(r3wt)) \
1080 ? *((void **)(r3wt)) : more_bodies(sv_type)); \
d2a0f284 1081 *(r3wt) = *(void**)(xpv); \
d2a0f284
JC
1082 } STMT_END
1083
1084#ifndef PURIFY
1085
1086STATIC void *
1087S_new_body(pTHX_ svtype sv_type)
1088{
1089 dVAR;
1090 void *xpv;
1091 new_body_inline(xpv, sv_type);
1092 return xpv;
1093}
1094
1095#endif
93e68bfb 1096
bd81e77b
NC
1097/*
1098=for apidoc sv_upgrade
93e68bfb 1099
bd81e77b
NC
1100Upgrade an SV to a more complex form. Generally adds a new body type to the
1101SV, then copies across as much information as possible from the old body.
1102You generally want to use the C<SvUPGRADE> macro wrapper. See also C<svtype>.
93e68bfb 1103
bd81e77b 1104=cut
93e68bfb 1105*/
93e68bfb 1106
bd81e77b 1107void
42d0e0b7 1108Perl_sv_upgrade(pTHX_ register SV *sv, svtype new_type)
cac9b346 1109{
97aff369 1110 dVAR;
bd81e77b
NC
1111 void* old_body;
1112 void* new_body;
42d0e0b7 1113 const svtype old_type = SvTYPE(sv);
d2a0f284 1114 const struct body_details *new_type_details;
bd81e77b
NC
1115 const struct body_details *const old_type_details
1116 = bodies_by_type + old_type;
cac9b346 1117
bd81e77b
NC
1118 if (new_type != SVt_PV && SvIsCOW(sv)) {
1119 sv_force_normal_flags(sv, 0);
1120 }
cac9b346 1121
bd81e77b
NC
1122 if (old_type == new_type)
1123 return;
cac9b346 1124
bd81e77b
NC
1125 if (old_type > new_type)
1126 Perl_croak(aTHX_ "sv_upgrade from type %d down to type %d",
1127 (int)old_type, (int)new_type);
cac9b346 1128
cac9b346 1129
bd81e77b 1130 old_body = SvANY(sv);
de042e1d 1131
bd81e77b
NC
1132 /* Copying structures onto other structures that have been neatly zeroed
1133 has a subtle gotcha. Consider XPVMG
cac9b346 1134
bd81e77b
NC
1135 +------+------+------+------+------+-------+-------+
1136 | NV | CUR | LEN | IV | MAGIC | STASH |
1137 +------+------+------+------+------+-------+-------+
1138 0 4 8 12 16 20 24 28
645c22ef 1139
bd81e77b
NC
1140 where NVs are aligned to 8 bytes, so that sizeof that structure is
1141 actually 32 bytes long, with 4 bytes of padding at the end:
08742458 1142
bd81e77b
NC
1143 +------+------+------+------+------+-------+-------+------+
1144 | NV | CUR | LEN | IV | MAGIC | STASH | ??? |
1145 +------+------+------+------+------+-------+-------+------+
1146 0 4 8 12 16 20 24 28 32
08742458 1147
bd81e77b 1148 so what happens if you allocate memory for this structure:
30f9da9e 1149
bd81e77b
NC
1150 +------+------+------+------+------+-------+-------+------+------+...
1151 | NV | CUR | LEN | IV | MAGIC | STASH | GP | NAME |
1152 +------+------+------+------+------+-------+-------+------+------+...
1153 0 4 8 12 16 20 24 28 32 36
bfc44f79 1154
bd81e77b
NC
1155 zero it, then copy sizeof(XPVMG) bytes on top of it? Not quite what you
1156 expect, because you copy the area marked ??? onto GP. Now, ??? may have
1157 started out as zero once, but it's quite possible that it isn't. So now,
1158 rather than a nicely zeroed GP, you have it pointing somewhere random.
1159 Bugs ensue.
bfc44f79 1160
bd81e77b
NC
1161 (In fact, GP ends up pointing at a previous GP structure, because the
1162 principle cause of the padding in XPVMG getting garbage is a copy of
6c9e42f7
NC
1163 sizeof(XPVMG) bytes from a XPVGV structure in sv_unglob. Right now
1164 this happens to be moot because XPVGV has been re-ordered, with GP
1165 no longer after STASH)
30f9da9e 1166
bd81e77b
NC
1167 So we are careful and work out the size of used parts of all the
1168 structures. */
bfc44f79 1169
bd81e77b
NC
1170 switch (old_type) {
1171 case SVt_NULL:
1172 break;
1173 case SVt_IV:
1174 if (new_type < SVt_PVIV) {
1175 new_type = (new_type == SVt_NV)
1176 ? SVt_PVNV : SVt_PVIV;
bd81e77b
NC
1177 }
1178 break;
1179 case SVt_NV:
1180 if (new_type < SVt_PVNV) {
1181 new_type = SVt_PVNV;
bd81e77b
NC
1182 }
1183 break;
1184 case SVt_RV:
1185 break;
1186 case SVt_PV:
1187 assert(new_type > SVt_PV);
1188 assert(SVt_IV < SVt_PV);
1189 assert(SVt_NV < SVt_PV);
1190 break;
1191 case SVt_PVIV:
1192 break;
1193 case SVt_PVNV:
1194 break;
1195 case SVt_PVMG:
1196 /* Because the XPVMG of PL_mess_sv isn't allocated from the arena,
1197 there's no way that it can be safely upgraded, because perl.c
1198 expects to Safefree(SvANY(PL_mess_sv)) */
1199 assert(sv != PL_mess_sv);
1200 /* This flag bit is used to mean other things in other scalar types.
1201 Given that it only has meaning inside the pad, it shouldn't be set
1202 on anything that can get upgraded. */
00b1698f 1203 assert(!SvPAD_TYPED(sv));
bd81e77b
NC
1204 break;
1205 default:
1206 if (old_type_details->cant_upgrade)
c81225bc
NC
1207 Perl_croak(aTHX_ "Can't upgrade %s (%" UVuf ") to %" UVuf,
1208 sv_reftype(sv, 0), (UV) old_type, (UV) new_type);
bd81e77b 1209 }
2fa1109b 1210 new_type_details = bodies_by_type + new_type;
645c22ef 1211
bd81e77b
NC
1212 SvFLAGS(sv) &= ~SVTYPEMASK;
1213 SvFLAGS(sv) |= new_type;
932e9ff9 1214
ab4416c0
NC
1215 /* This can't happen, as SVt_NULL is <= all values of new_type, so one of
1216 the return statements above will have triggered. */
1217 assert (new_type != SVt_NULL);
bd81e77b 1218 switch (new_type) {
bd81e77b
NC
1219 case SVt_IV:
1220 assert(old_type == SVt_NULL);
1221 SvANY(sv) = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
1222 SvIV_set(sv, 0);
1223 return;
1224 case SVt_NV:
1225 assert(old_type == SVt_NULL);
1226 SvANY(sv) = new_XNV();
1227 SvNV_set(sv, 0);
1228 return;
1229 case SVt_RV:
1230 assert(old_type == SVt_NULL);
1231 SvANY(sv) = &sv->sv_u.svu_rv;
1232 SvRV_set(sv, 0);
1233 return;
1234 case SVt_PVHV:
bd81e77b 1235 case SVt_PVAV:
d2a0f284 1236 assert(new_type_details->body_size);
c1ae03ae
NC
1237
1238#ifndef PURIFY
1239 assert(new_type_details->arena);
d2a0f284 1240 assert(new_type_details->arena_size);
c1ae03ae 1241 /* This points to the start of the allocated area. */
d2a0f284
JC
1242 new_body_inline(new_body, new_type);
1243 Zero(new_body, new_type_details->body_size, char);
c1ae03ae
NC
1244 new_body = ((char *)new_body) - new_type_details->offset;
1245#else
1246 /* We always allocated the full length item with PURIFY. To do this
1247 we fake things so that arena is false for all 16 types.. */
1248 new_body = new_NOARENAZ(new_type_details);
1249#endif
1250 SvANY(sv) = new_body;
1251 if (new_type == SVt_PVAV) {
1252 AvMAX(sv) = -1;
1253 AvFILLp(sv) = -1;
1254 AvREAL_only(sv);
1255 }
aeb18a1e 1256
bd81e77b
NC
1257 /* SVt_NULL isn't the only thing upgraded to AV or HV.
1258 The target created by newSVrv also is, and it can have magic.
1259 However, it never has SvPVX set.
1260 */
1261 if (old_type >= SVt_RV) {
1262 assert(SvPVX_const(sv) == 0);
1263 }
aeb18a1e 1264
bd81e77b 1265 if (old_type >= SVt_PVMG) {
e736a858 1266 SvMAGIC_set(sv, ((XPVMG*)old_body)->xmg_u.xmg_magic);
bd81e77b 1267 SvSTASH_set(sv, ((XPVMG*)old_body)->xmg_stash);
797c7171
NC
1268 } else {
1269 sv->sv_u.svu_array = NULL; /* or svu_hash */
bd81e77b
NC
1270 }
1271 break;
93e68bfb 1272
93e68bfb 1273
bd81e77b
NC
1274 case SVt_PVIV:
1275 /* XXX Is this still needed? Was it ever needed? Surely as there is
1276 no route from NV to PVIV, NOK can never be true */
1277 assert(!SvNOKp(sv));
1278 assert(!SvNOK(sv));
1279 case SVt_PVIO:
1280 case SVt_PVFM:
bd81e77b
NC
1281 case SVt_PVGV:
1282 case SVt_PVCV:
1283 case SVt_PVLV:
1284 case SVt_PVMG:
1285 case SVt_PVNV:
1286 case SVt_PV:
93e68bfb 1287
d2a0f284 1288 assert(new_type_details->body_size);
bd81e77b
NC
1289 /* We always allocated the full length item with PURIFY. To do this
1290 we fake things so that arena is false for all 16 types.. */
1291 if(new_type_details->arena) {
1292 /* This points to the start of the allocated area. */
d2a0f284
JC
1293 new_body_inline(new_body, new_type);
1294 Zero(new_body, new_type_details->body_size, char);
bd81e77b
NC
1295 new_body = ((char *)new_body) - new_type_details->offset;
1296 } else {
1297 new_body = new_NOARENAZ(new_type_details);
1298 }
1299 SvANY(sv) = new_body;
5e2fc214 1300
bd81e77b 1301 if (old_type_details->copy) {
f9ba3d20
NC
1302 /* There is now the potential for an upgrade from something without
1303 an offset (PVNV or PVMG) to something with one (PVCV, PVFM) */
1304 int offset = old_type_details->offset;
1305 int length = old_type_details->copy;
1306
1307 if (new_type_details->offset > old_type_details->offset) {
d4c19fe8 1308 const int difference
f9ba3d20
NC
1309 = new_type_details->offset - old_type_details->offset;
1310 offset += difference;
1311 length -= difference;
1312 }
1313 assert (length >= 0);
1314
1315 Copy((char *)old_body + offset, (char *)new_body + offset, length,
1316 char);
bd81e77b
NC
1317 }
1318
1319#ifndef NV_ZERO_IS_ALLBITS_ZERO
f2524eef 1320 /* If NV 0.0 is stores as all bits 0 then Zero() already creates a
e5ce394c
NC
1321 * correct 0.0 for us. Otherwise, if the old body didn't have an
1322 * NV slot, but the new one does, then we need to initialise the
1323 * freshly created NV slot with whatever the correct bit pattern is
1324 * for 0.0 */
e22a937e
NC
1325 if (old_type_details->zero_nv && !new_type_details->zero_nv
1326 && !isGV_with_GP(sv))
bd81e77b 1327 SvNV_set(sv, 0);
82048762 1328#endif
5e2fc214 1329
bd81e77b 1330 if (new_type == SVt_PVIO)
f2524eef 1331 IoPAGE_LEN(sv) = 60;
bd81e77b 1332 if (old_type < SVt_RV)
6136c704 1333 SvPV_set(sv, NULL);
bd81e77b
NC
1334 break;
1335 default:
afd78fd5
JH
1336 Perl_croak(aTHX_ "panic: sv_upgrade to unknown type %lu",
1337 (unsigned long)new_type);
bd81e77b 1338 }
73171d91 1339
d2a0f284
JC
1340 if (old_type_details->arena) {
1341 /* If there was an old body, then we need to free it.
1342 Note that there is an assumption that all bodies of types that
1343 can be upgraded came from arenas. Only the more complex non-
1344 upgradable types are allowed to be directly malloc()ed. */
bd81e77b
NC
1345#ifdef PURIFY
1346 my_safefree(old_body);
1347#else
1348 del_body((void*)((char*)old_body + old_type_details->offset),
1349 &PL_body_roots[old_type]);
1350#endif
1351 }
1352}
73171d91 1353
bd81e77b
NC
1354/*
1355=for apidoc sv_backoff
73171d91 1356
bd81e77b
NC
1357Remove any string offset. You should normally use the C<SvOOK_off> macro
1358wrapper instead.
73171d91 1359
bd81e77b 1360=cut
73171d91
NC
1361*/
1362
bd81e77b
NC
1363int
1364Perl_sv_backoff(pTHX_ register SV *sv)
1365{
96a5add6 1366 PERL_UNUSED_CONTEXT;
bd81e77b
NC
1367 assert(SvOOK(sv));
1368 assert(SvTYPE(sv) != SVt_PVHV);
1369 assert(SvTYPE(sv) != SVt_PVAV);
1370 if (SvIVX(sv)) {
1371 const char * const s = SvPVX_const(sv);
1372 SvLEN_set(sv, SvLEN(sv) + SvIVX(sv));
1373 SvPV_set(sv, SvPVX(sv) - SvIVX(sv));
1374 SvIV_set(sv, 0);
1375 Move(s, SvPVX(sv), SvCUR(sv)+1, char);
1376 }
1377 SvFLAGS(sv) &= ~SVf_OOK;
1378 return 0;
1379}
73171d91 1380
bd81e77b
NC
1381/*
1382=for apidoc sv_grow
73171d91 1383
bd81e77b
NC
1384Expands the character buffer in the SV. If necessary, uses C<sv_unref> and
1385upgrades the SV to C<SVt_PV>. Returns a pointer to the character buffer.
1386Use the C<SvGROW> wrapper instead.
93e68bfb 1387
bd81e77b
NC
1388=cut
1389*/
93e68bfb 1390
bd81e77b
NC
1391char *
1392Perl_sv_grow(pTHX_ register SV *sv, register STRLEN newlen)
1393{
1394 register char *s;
93e68bfb 1395
5db06880
NC
1396 if (PL_madskills && newlen >= 0x100000) {
1397 PerlIO_printf(Perl_debug_log,
1398 "Allocation too large: %"UVxf"\n", (UV)newlen);
1399 }
bd81e77b
NC
1400#ifdef HAS_64K_LIMIT
1401 if (newlen >= 0x10000) {
1402 PerlIO_printf(Perl_debug_log,
1403 "Allocation too large: %"UVxf"\n", (UV)newlen);
1404 my_exit(1);
1405 }
1406#endif /* HAS_64K_LIMIT */
1407 if (SvROK(sv))
1408 sv_unref(sv);
1409 if (SvTYPE(sv) < SVt_PV) {
1410 sv_upgrade(sv, SVt_PV);
1411 s = SvPVX_mutable(sv);
1412 }
1413 else if (SvOOK(sv)) { /* pv is offset? */
1414 sv_backoff(sv);
1415 s = SvPVX_mutable(sv);
1416 if (newlen > SvLEN(sv))
1417 newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
1418#ifdef HAS_64K_LIMIT
1419 if (newlen >= 0x10000)
1420 newlen = 0xFFFF;
1421#endif
1422 }
1423 else
1424 s = SvPVX_mutable(sv);
aeb18a1e 1425
bd81e77b
NC
1426 if (newlen > SvLEN(sv)) { /* need more room? */
1427 newlen = PERL_STRLEN_ROUNDUP(newlen);
1428 if (SvLEN(sv) && s) {
1429#ifdef MYMALLOC
1430 const STRLEN l = malloced_size((void*)SvPVX_const(sv));
1431 if (newlen <= l) {
1432 SvLEN_set(sv, l);
1433 return s;
1434 } else
1435#endif
10edeb5d 1436 s = (char*)saferealloc(s, newlen);
bd81e77b
NC
1437 }
1438 else {
10edeb5d 1439 s = (char*)safemalloc(newlen);
bd81e77b
NC
1440 if (SvPVX_const(sv) && SvCUR(sv)) {
1441 Move(SvPVX_const(sv), s, (newlen < SvCUR(sv)) ? newlen : SvCUR(sv), char);
1442 }
1443 }
1444 SvPV_set(sv, s);
1445 SvLEN_set(sv, newlen);
1446 }
1447 return s;
1448}
aeb18a1e 1449
bd81e77b
NC
1450/*
1451=for apidoc sv_setiv
932e9ff9 1452
bd81e77b
NC
1453Copies an integer into the given SV, upgrading first if necessary.
1454Does not handle 'set' magic. See also C<sv_setiv_mg>.
463ee0b2 1455
bd81e77b
NC
1456=cut
1457*/
463ee0b2 1458
bd81e77b
NC
1459void
1460Perl_sv_setiv(pTHX_ register SV *sv, IV i)
1461{
97aff369 1462 dVAR;
bd81e77b
NC
1463 SV_CHECK_THINKFIRST_COW_DROP(sv);
1464 switch (SvTYPE(sv)) {
1465 case SVt_NULL:
1466 sv_upgrade(sv, SVt_IV);
1467 break;
1468 case SVt_NV:
1469 sv_upgrade(sv, SVt_PVNV);
1470 break;
1471 case SVt_RV:
1472 case SVt_PV:
1473 sv_upgrade(sv, SVt_PVIV);
1474 break;
463ee0b2 1475
bd81e77b
NC
1476 case SVt_PVGV:
1477 case SVt_PVAV:
1478 case SVt_PVHV:
1479 case SVt_PVCV:
1480 case SVt_PVFM:
1481 case SVt_PVIO:
1482 Perl_croak(aTHX_ "Can't coerce %s to integer in %s", sv_reftype(sv,0),
1483 OP_DESC(PL_op));
42d0e0b7 1484 default: NOOP;
bd81e77b
NC
1485 }
1486 (void)SvIOK_only(sv); /* validate number */
1487 SvIV_set(sv, i);
1488 SvTAINT(sv);
1489}
932e9ff9 1490
bd81e77b
NC
1491/*
1492=for apidoc sv_setiv_mg
d33b2eba 1493
bd81e77b 1494Like C<sv_setiv>, but also handles 'set' magic.
1c846c1f 1495
bd81e77b
NC
1496=cut
1497*/
d33b2eba 1498
bd81e77b
NC
1499void
1500Perl_sv_setiv_mg(pTHX_ register SV *sv, IV i)
1501{
1502 sv_setiv(sv,i);
1503 SvSETMAGIC(sv);
1504}
727879eb 1505
bd81e77b
NC
1506/*
1507=for apidoc sv_setuv
d33b2eba 1508
bd81e77b
NC
1509Copies an unsigned integer into the given SV, upgrading first if necessary.
1510Does not handle 'set' magic. See also C<sv_setuv_mg>.
9b94d1dd 1511
bd81e77b
NC
1512=cut
1513*/
d33b2eba 1514
bd81e77b
NC
1515void
1516Perl_sv_setuv(pTHX_ register SV *sv, UV u)
1517{
1518 /* With these two if statements:
1519 u=1.49 s=0.52 cu=72.49 cs=10.64 scripts=270 tests=20865
d33b2eba 1520
bd81e77b
NC
1521 without
1522 u=1.35 s=0.47 cu=73.45 cs=11.43 scripts=270 tests=20865
1c846c1f 1523
bd81e77b
NC
1524 If you wish to remove them, please benchmark to see what the effect is
1525 */
1526 if (u <= (UV)IV_MAX) {
1527 sv_setiv(sv, (IV)u);
1528 return;
1529 }
1530 sv_setiv(sv, 0);
1531 SvIsUV_on(sv);
1532 SvUV_set(sv, u);
1533}
d33b2eba 1534
bd81e77b
NC
1535/*
1536=for apidoc sv_setuv_mg
727879eb 1537
bd81e77b 1538Like C<sv_setuv>, but also handles 'set' magic.
9b94d1dd 1539
bd81e77b
NC
1540=cut
1541*/
5e2fc214 1542
bd81e77b
NC
1543void
1544Perl_sv_setuv_mg(pTHX_ register SV *sv, UV u)
1545{
bd81e77b
NC
1546 sv_setuv(sv,u);
1547 SvSETMAGIC(sv);
1548}
5e2fc214 1549
954c1994 1550/*
bd81e77b 1551=for apidoc sv_setnv
954c1994 1552
bd81e77b
NC
1553Copies a double into the given SV, upgrading first if necessary.
1554Does not handle 'set' magic. See also C<sv_setnv_mg>.
954c1994
GS
1555
1556=cut
1557*/
1558
63f97190 1559void
bd81e77b 1560Perl_sv_setnv(pTHX_ register SV *sv, NV num)
79072805 1561{
97aff369 1562 dVAR;
bd81e77b
NC
1563 SV_CHECK_THINKFIRST_COW_DROP(sv);
1564 switch (SvTYPE(sv)) {
79072805 1565 case SVt_NULL:
79072805 1566 case SVt_IV:
bd81e77b 1567 sv_upgrade(sv, SVt_NV);
79072805 1568 break;
ed6116ce 1569 case SVt_RV:
79072805 1570 case SVt_PV:
79072805 1571 case SVt_PVIV:
bd81e77b 1572 sv_upgrade(sv, SVt_PVNV);
79072805 1573 break;
bd4b1eb5 1574
bd4b1eb5 1575 case SVt_PVGV:
bd81e77b
NC
1576 case SVt_PVAV:
1577 case SVt_PVHV:
79072805 1578 case SVt_PVCV:
bd81e77b
NC
1579 case SVt_PVFM:
1580 case SVt_PVIO:
1581 Perl_croak(aTHX_ "Can't coerce %s to number in %s", sv_reftype(sv,0),
1582 OP_NAME(PL_op));
42d0e0b7 1583 default: NOOP;
2068cd4d 1584 }
bd81e77b
NC
1585 SvNV_set(sv, num);
1586 (void)SvNOK_only(sv); /* validate number */
1587 SvTAINT(sv);
79072805
LW
1588}
1589
645c22ef 1590/*
bd81e77b 1591=for apidoc sv_setnv_mg
645c22ef 1592
bd81e77b 1593Like C<sv_setnv>, but also handles 'set' magic.
645c22ef
DM
1594
1595=cut
1596*/
1597
bd81e77b
NC
1598void
1599Perl_sv_setnv_mg(pTHX_ register SV *sv, NV num)
79072805 1600{
bd81e77b
NC
1601 sv_setnv(sv,num);
1602 SvSETMAGIC(sv);
79072805
LW
1603}
1604
bd81e77b
NC
1605/* Print an "isn't numeric" warning, using a cleaned-up,
1606 * printable version of the offending string
1607 */
954c1994 1608
bd81e77b
NC
1609STATIC void
1610S_not_a_number(pTHX_ SV *sv)
79072805 1611{
97aff369 1612 dVAR;
bd81e77b
NC
1613 SV *dsv;
1614 char tmpbuf[64];
1615 const char *pv;
94463019
JH
1616
1617 if (DO_UTF8(sv)) {
396482e1 1618 dsv = sv_2mortal(newSVpvs(""));
94463019
JH
1619 pv = sv_uni_display(dsv, sv, 10, 0);
1620 } else {
1621 char *d = tmpbuf;
551405c4 1622 const char * const limit = tmpbuf + sizeof(tmpbuf) - 8;
94463019
JH
1623 /* each *s can expand to 4 chars + "...\0",
1624 i.e. need room for 8 chars */
ecdeb87c 1625
00b6aa41
AL
1626 const char *s = SvPVX_const(sv);
1627 const char * const end = s + SvCUR(sv);
1628 for ( ; s < end && d < limit; s++ ) {
94463019
JH
1629 int ch = *s & 0xFF;
1630 if (ch & 128 && !isPRINT_LC(ch)) {
1631 *d++ = 'M';
1632 *d++ = '-';
1633 ch &= 127;
1634 }
1635 if (ch == '\n') {
1636 *d++ = '\\';
1637 *d++ = 'n';
1638 }
1639 else if (ch == '\r') {
1640 *d++ = '\\';
1641 *d++ = 'r';
1642 }
1643 else if (ch == '\f') {
1644 *d++ = '\\';
1645 *d++ = 'f';
1646 }
1647 else if (ch == '\\') {
1648 *d++ = '\\';
1649 *d++ = '\\';
1650 }
1651 else if (ch == '\0') {
1652 *d++ = '\\';
1653 *d++ = '0';
1654 }
1655 else if (isPRINT_LC(ch))
1656 *d++ = ch;
1657 else {
1658 *d++ = '^';
1659 *d++ = toCTRL(ch);
1660 }
1661 }
1662 if (s < end) {
1663 *d++ = '.';
1664 *d++ = '.';
1665 *d++ = '.';
1666 }
1667 *d = '\0';
1668 pv = tmpbuf;
a0d0e21e 1669 }
a0d0e21e 1670
533c011a 1671 if (PL_op)
9014280d 1672 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019
JH
1673 "Argument \"%s\" isn't numeric in %s", pv,
1674 OP_DESC(PL_op));
a0d0e21e 1675 else
9014280d 1676 Perl_warner(aTHX_ packWARN(WARN_NUMERIC),
94463019 1677 "Argument \"%s\" isn't numeric", pv);
a0d0e21e
LW
1678}
1679
c2988b20
NC
1680/*
1681=for apidoc looks_like_number
1682
645c22ef
DM
1683Test if the content of an SV looks like a number (or is a number).
1684C<Inf> and C<Infinity> are treated as numbers (so will not issue a
1685non-numeric warning), even if your atof() doesn't grok them.
c2988b20
NC
1686
1687=cut
1688*/
1689
1690I32
1691Perl_looks_like_number(pTHX_ SV *sv)
1692{
a3b680e6 1693 register const char *sbegin;
c2988b20
NC
1694 STRLEN len;
1695
1696 if (SvPOK(sv)) {
3f7c398e 1697 sbegin = SvPVX_const(sv);
c2988b20
NC
1698 len = SvCUR(sv);
1699 }
1700 else if (SvPOKp(sv))
83003860 1701 sbegin = SvPV_const(sv, len);
c2988b20 1702 else
e0ab1c0e 1703 return SvFLAGS(sv) & (SVf_NOK|SVp_NOK|SVf_IOK|SVp_IOK);
c2988b20
NC
1704 return grok_number(sbegin, len, NULL);
1705}
25da4f38 1706
19f6321d
NC
1707STATIC bool
1708S_glob_2number(pTHX_ GV * const gv)
180488f8
NC
1709{
1710 const U32 wasfake = SvFLAGS(gv) & SVf_FAKE;
1711 SV *const buffer = sv_newmortal();
1712
1713 /* FAKE globs can get coerced, so need to turn this off temporarily if it
1714 is on. */
1715 SvFAKE_off(gv);
1716 gv_efullname3(buffer, gv, "*");
1717 SvFLAGS(gv) |= wasfake;
1718
675c862f
AL
1719 /* We know that all GVs stringify to something that is not-a-number,
1720 so no need to test that. */
1721 if (ckWARN(WARN_NUMERIC))
1722 not_a_number(buffer);
1723 /* We just want something true to return, so that S_sv_2iuv_common
1724 can tail call us and return true. */
19f6321d 1725 return TRUE;
675c862f
AL
1726}
1727
1728STATIC char *
19f6321d 1729S_glob_2pv(pTHX_ GV * const gv, STRLEN * const len)
675c862f
AL
1730{
1731 const U32 wasfake = SvFLAGS(gv) & SVf_FAKE;
1732 SV *const buffer = sv_newmortal();
1733
1734 /* FAKE globs can get coerced, so need to turn this off temporarily if it
1735 is on. */
1736 SvFAKE_off(gv);
1737 gv_efullname3(buffer, gv, "*");
1738 SvFLAGS(gv) |= wasfake;
1739
1740 assert(SvPOK(buffer));
a6d61a6c
NC
1741 if (len) {
1742 *len = SvCUR(buffer);
1743 }
675c862f 1744 return SvPVX(buffer);
180488f8
NC
1745}
1746
25da4f38
IZ
1747/* Actually, ISO C leaves conversion of UV to IV undefined, but
1748 until proven guilty, assume that things are not that bad... */
1749
645c22ef
DM
1750/*
1751 NV_PRESERVES_UV:
1752
1753 As 64 bit platforms often have an NV that doesn't preserve all bits of
28e5dec8
JH
1754 an IV (an assumption perl has been based on to date) it becomes necessary
1755 to remove the assumption that the NV always carries enough precision to
1756 recreate the IV whenever needed, and that the NV is the canonical form.
1757 Instead, IV/UV and NV need to be given equal rights. So as to not lose
645c22ef 1758 precision as a side effect of conversion (which would lead to insanity
28e5dec8
JH
1759 and the dragon(s) in t/op/numconvert.t getting very angry) the intent is
1760 1) to distinguish between IV/UV/NV slots that have cached a valid
1761 conversion where precision was lost and IV/UV/NV slots that have a
1762 valid conversion which has lost no precision
645c22ef 1763 2) to ensure that if a numeric conversion to one form is requested that
28e5dec8
JH
1764 would lose precision, the precise conversion (or differently
1765 imprecise conversion) is also performed and cached, to prevent
1766 requests for different numeric formats on the same SV causing
1767 lossy conversion chains. (lossless conversion chains are perfectly
1768 acceptable (still))
1769
1770
1771 flags are used:
1772 SvIOKp is true if the IV slot contains a valid value
1773 SvIOK is true only if the IV value is accurate (UV if SvIOK_UV true)
1774 SvNOKp is true if the NV slot contains a valid value
1775 SvNOK is true only if the NV value is accurate
1776
1777 so
645c22ef 1778 while converting from PV to NV, check to see if converting that NV to an
28e5dec8
JH
1779 IV(or UV) would lose accuracy over a direct conversion from PV to
1780 IV(or UV). If it would, cache both conversions, return NV, but mark
1781 SV as IOK NOKp (ie not NOK).
1782
645c22ef 1783 While converting from PV to IV, check to see if converting that IV to an
28e5dec8
JH
1784 NV would lose accuracy over a direct conversion from PV to NV. If it
1785 would, cache both conversions, flag similarly.
1786
1787 Before, the SV value "3.2" could become NV=3.2 IV=3 NOK, IOK quite
1788 correctly because if IV & NV were set NV *always* overruled.
645c22ef
DM
1789 Now, "3.2" will become NV=3.2 IV=3 NOK, IOKp, because the flag's meaning
1790 changes - now IV and NV together means that the two are interchangeable:
28e5dec8 1791 SvIVX == (IV) SvNVX && SvNVX == (NV) SvIVX;
d460ef45 1792
645c22ef
DM
1793 The benefit of this is that operations such as pp_add know that if
1794 SvIOK is true for both left and right operands, then integer addition
1795 can be used instead of floating point (for cases where the result won't
1796 overflow). Before, floating point was always used, which could lead to
28e5dec8
JH
1797 loss of precision compared with integer addition.
1798
1799 * making IV and NV equal status should make maths accurate on 64 bit
1800 platforms
1801 * may speed up maths somewhat if pp_add and friends start to use
645c22ef 1802 integers when possible instead of fp. (Hopefully the overhead in
28e5dec8
JH
1803 looking for SvIOK and checking for overflow will not outweigh the
1804 fp to integer speedup)
1805 * will slow down integer operations (callers of SvIV) on "inaccurate"
1806 values, as the change from SvIOK to SvIOKp will cause a call into
1807 sv_2iv each time rather than a macro access direct to the IV slot
1808 * should speed up number->string conversion on integers as IV is
645c22ef 1809 favoured when IV and NV are equally accurate
28e5dec8
JH
1810
1811 ####################################################################
645c22ef
DM
1812 You had better be using SvIOK_notUV if you want an IV for arithmetic:
1813 SvIOK is true if (IV or UV), so you might be getting (IV)SvUV.
1814 On the other hand, SvUOK is true iff UV.
28e5dec8
JH
1815 ####################################################################
1816
645c22ef 1817 Your mileage will vary depending your CPU's relative fp to integer
28e5dec8
JH
1818 performance ratio.
1819*/
1820
1821#ifndef NV_PRESERVES_UV
645c22ef
DM
1822# define IS_NUMBER_UNDERFLOW_IV 1
1823# define IS_NUMBER_UNDERFLOW_UV 2
1824# define IS_NUMBER_IV_AND_UV 2
1825# define IS_NUMBER_OVERFLOW_IV 4
1826# define IS_NUMBER_OVERFLOW_UV 5
1827
1828/* sv_2iuv_non_preserve(): private routine for use by sv_2iv() and sv_2uv() */
28e5dec8
JH
1829
1830/* For sv_2nv these three cases are "SvNOK and don't bother casting" */
1831STATIC int
645c22ef 1832S_sv_2iuv_non_preserve(pTHX_ register SV *sv, I32 numtype)
28e5dec8 1833{
97aff369 1834 dVAR;
b57a0404 1835 PERL_UNUSED_ARG(numtype); /* Used only under DEBUGGING? */
3f7c398e 1836 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
1837 if (SvNVX(sv) < (NV)IV_MIN) {
1838 (void)SvIOKp_on(sv);
1839 (void)SvNOK_on(sv);
45977657 1840 SvIV_set(sv, IV_MIN);
28e5dec8
JH
1841 return IS_NUMBER_UNDERFLOW_IV;
1842 }
1843 if (SvNVX(sv) > (NV)UV_MAX) {
1844 (void)SvIOKp_on(sv);
1845 (void)SvNOK_on(sv);
1846 SvIsUV_on(sv);
607fa7f2 1847 SvUV_set(sv, UV_MAX);
28e5dec8
JH
1848 return IS_NUMBER_OVERFLOW_UV;
1849 }
c2988b20
NC
1850 (void)SvIOKp_on(sv);
1851 (void)SvNOK_on(sv);
1852 /* Can't use strtol etc to convert this string. (See truth table in
1853 sv_2iv */
1854 if (SvNVX(sv) <= (UV)IV_MAX) {
45977657 1855 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
1856 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
1857 SvIOK_on(sv); /* Integer is precise. NOK, IOK */
1858 } else {
1859 /* Integer is imprecise. NOK, IOKp */
1860 }
1861 return SvNVX(sv) < 0 ? IS_NUMBER_UNDERFLOW_UV : IS_NUMBER_IV_AND_UV;
1862 }
1863 SvIsUV_on(sv);
607fa7f2 1864 SvUV_set(sv, U_V(SvNVX(sv)));
c2988b20
NC
1865 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
1866 if (SvUVX(sv) == UV_MAX) {
1867 /* As we know that NVs don't preserve UVs, UV_MAX cannot
1868 possibly be preserved by NV. Hence, it must be overflow.
1869 NOK, IOKp */
1870 return IS_NUMBER_OVERFLOW_UV;
1871 }
1872 SvIOK_on(sv); /* Integer is precise. NOK, UOK */
1873 } else {
1874 /* Integer is imprecise. NOK, IOKp */
28e5dec8 1875 }
c2988b20 1876 return IS_NUMBER_OVERFLOW_IV;
28e5dec8 1877}
645c22ef
DM
1878#endif /* !NV_PRESERVES_UV*/
1879
af359546
NC
1880STATIC bool
1881S_sv_2iuv_common(pTHX_ SV *sv) {
97aff369 1882 dVAR;
af359546 1883 if (SvNOKp(sv)) {
28e5dec8
JH
1884 /* erm. not sure. *should* never get NOKp (without NOK) from sv_2nv
1885 * without also getting a cached IV/UV from it at the same time
1886 * (ie PV->NV conversion should detect loss of accuracy and cache
af359546
NC
1887 * IV or UV at same time to avoid this. */
1888 /* IV-over-UV optimisation - choose to cache IV if possible */
25da4f38
IZ
1889
1890 if (SvTYPE(sv) == SVt_NV)
1891 sv_upgrade(sv, SVt_PVNV);
1892
28e5dec8
JH
1893 (void)SvIOKp_on(sv); /* Must do this first, to clear any SvOOK */
1894 /* < not <= as for NV doesn't preserve UV, ((NV)IV_MAX+1) will almost
1895 certainly cast into the IV range at IV_MAX, whereas the correct
1896 answer is the UV IV_MAX +1. Hence < ensures that dodgy boundary
1897 cases go to UV */
cab190d4
JD
1898#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan)
1899 if (Perl_isnan(SvNVX(sv))) {
1900 SvUV_set(sv, 0);
1901 SvIsUV_on(sv);
fdbe6d7c 1902 return FALSE;
cab190d4 1903 }
cab190d4 1904#endif
28e5dec8 1905 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
45977657 1906 SvIV_set(sv, I_V(SvNVX(sv)));
28e5dec8
JH
1907 if (SvNVX(sv) == (NV) SvIVX(sv)
1908#ifndef NV_PRESERVES_UV
1909 && (((UV)1 << NV_PRESERVES_UV_BITS) >
1910 (UV)(SvIVX(sv) > 0 ? SvIVX(sv) : -SvIVX(sv)))
1911 /* Don't flag it as "accurately an integer" if the number
1912 came from a (by definition imprecise) NV operation, and
1913 we're outside the range of NV integer precision */
1914#endif
1915 ) {
1916 SvIOK_on(sv); /* Can this go wrong with rounding? NWC */
1917 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 1918 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (precise)\n",
28e5dec8
JH
1919 PTR2UV(sv),
1920 SvNVX(sv),
1921 SvIVX(sv)));
1922
1923 } else {
1924 /* IV not precise. No need to convert from PV, as NV
1925 conversion would already have cached IV if it detected
1926 that PV->IV would be better than PV->NV->IV
1927 flags already correct - don't set public IOK. */
1928 DEBUG_c(PerlIO_printf(Perl_debug_log,
7234c960 1929 "0x%"UVxf" iv(%"NVgf" => %"IVdf") (imprecise)\n",
28e5dec8
JH
1930 PTR2UV(sv),
1931 SvNVX(sv),
1932 SvIVX(sv)));
1933 }
1934 /* Can the above go wrong if SvIVX == IV_MIN and SvNVX < IV_MIN,
1935 but the cast (NV)IV_MIN rounds to a the value less (more
1936 negative) than IV_MIN which happens to be equal to SvNVX ??
1937 Analogous to 0xFFFFFFFFFFFFFFFF rounding up to NV (2**64) and
1938 NV rounding back to 0xFFFFFFFFFFFFFFFF, so UVX == UV(NVX) and
1939 (NV)UVX == NVX are both true, but the values differ. :-(
1940 Hopefully for 2s complement IV_MIN is something like
1941 0x8000000000000000 which will be exact. NWC */
d460ef45 1942 }
25da4f38 1943 else {
607fa7f2 1944 SvUV_set(sv, U_V(SvNVX(sv)));
28e5dec8
JH
1945 if (
1946 (SvNVX(sv) == (NV) SvUVX(sv))
1947#ifndef NV_PRESERVES_UV
1948 /* Make sure it's not 0xFFFFFFFFFFFFFFFF */
1949 /*&& (SvUVX(sv) != UV_MAX) irrelevant with code below */
1950 && (((UV)1 << NV_PRESERVES_UV_BITS) > SvUVX(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);
25da4f38 1957 SvIsUV_on(sv);
1c846c1f 1958 DEBUG_c(PerlIO_printf(Perl_debug_log,
57def98f 1959 "0x%"UVxf" 2iv(%"UVuf" => %"IVdf") (as unsigned)\n",
56431972 1960 PTR2UV(sv),
57def98f
JH
1961 SvUVX(sv),
1962 SvUVX(sv)));
25da4f38 1963 }
748a9306
LW
1964 }
1965 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 1966 UV value;
504618e9 1967 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
af359546 1968 /* We want to avoid a possible problem when we cache an IV/ a UV which
25da4f38 1969 may be later translated to an NV, and the resulting NV is not
c2988b20
NC
1970 the same as the direct translation of the initial string
1971 (eg 123.456 can shortcut to the IV 123 with atol(), but we must
1972 be careful to ensure that the value with the .456 is around if the
1973 NV value is requested in the future).
1c846c1f 1974
af359546 1975 This means that if we cache such an IV/a UV, we need to cache the
25da4f38 1976 NV as well. Moreover, we trade speed for space, and do not
28e5dec8 1977 cache the NV if we are sure it's not needed.
25da4f38 1978 */
16b7a9a4 1979
c2988b20
NC
1980 /* SVt_PVNV is one higher than SVt_PVIV, hence this order */
1981 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
1982 == IS_NUMBER_IN_UV) {
5e045b90 1983 /* It's definitely an integer, only upgrade to PVIV */
28e5dec8
JH
1984 if (SvTYPE(sv) < SVt_PVIV)
1985 sv_upgrade(sv, SVt_PVIV);
f7bbb42a 1986 (void)SvIOK_on(sv);
c2988b20
NC
1987 } else if (SvTYPE(sv) < SVt_PVNV)
1988 sv_upgrade(sv, SVt_PVNV);
28e5dec8 1989
f2524eef 1990 /* If NVs preserve UVs then we only use the UV value if we know that
c2988b20
NC
1991 we aren't going to call atof() below. If NVs don't preserve UVs
1992 then the value returned may have more precision than atof() will
1993 return, even though value isn't perfectly accurate. */
1994 if ((numtype & (IS_NUMBER_IN_UV
1995#ifdef NV_PRESERVES_UV
1996 | IS_NUMBER_NOT_INT
1997#endif
1998 )) == IS_NUMBER_IN_UV) {
1999 /* This won't turn off the public IOK flag if it was set above */
2000 (void)SvIOKp_on(sv);
2001
2002 if (!(numtype & IS_NUMBER_NEG)) {
2003 /* positive */;
2004 if (value <= (UV)IV_MAX) {
45977657 2005 SvIV_set(sv, (IV)value);
c2988b20 2006 } else {
af359546 2007 /* it didn't overflow, and it was positive. */
607fa7f2 2008 SvUV_set(sv, value);
c2988b20
NC
2009 SvIsUV_on(sv);
2010 }
2011 } else {
2012 /* 2s complement assumption */
2013 if (value <= (UV)IV_MIN) {
45977657 2014 SvIV_set(sv, -(IV)value);
c2988b20
NC
2015 } else {
2016 /* Too negative for an IV. This is a double upgrade, but
d1be9408 2017 I'm assuming it will be rare. */
c2988b20
NC
2018 if (SvTYPE(sv) < SVt_PVNV)
2019 sv_upgrade(sv, SVt_PVNV);
2020 SvNOK_on(sv);
2021 SvIOK_off(sv);
2022 SvIOKp_on(sv);
9d6ce603 2023 SvNV_set(sv, -(NV)value);
45977657 2024 SvIV_set(sv, IV_MIN);
c2988b20
NC
2025 }
2026 }
2027 }
2028 /* For !NV_PRESERVES_UV and IS_NUMBER_IN_UV and IS_NUMBER_NOT_INT we
2029 will be in the previous block to set the IV slot, and the next
2030 block to set the NV slot. So no else here. */
2031
2032 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2033 != IS_NUMBER_IN_UV) {
2034 /* It wasn't an (integer that doesn't overflow the UV). */
3f7c398e 2035 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8 2036
c2988b20
NC
2037 if (! numtype && ckWARN(WARN_NUMERIC))
2038 not_a_number(sv);
28e5dec8 2039
65202027 2040#if defined(USE_LONG_DOUBLE)
c2988b20
NC
2041 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%" PERL_PRIgldbl ")\n",
2042 PTR2UV(sv), SvNVX(sv)));
65202027 2043#else
1779d84d 2044 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"NVgf")\n",
c2988b20 2045 PTR2UV(sv), SvNVX(sv)));
65202027 2046#endif
28e5dec8 2047
28e5dec8 2048#ifdef NV_PRESERVES_UV
af359546
NC
2049 (void)SvIOKp_on(sv);
2050 (void)SvNOK_on(sv);
2051 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2052 SvIV_set(sv, I_V(SvNVX(sv)));
2053 if ((NV)(SvIVX(sv)) == SvNVX(sv)) {
2054 SvIOK_on(sv);
2055 } else {
6f207bd3 2056 NOOP; /* Integer is imprecise. NOK, IOKp */
af359546
NC
2057 }
2058 /* UV will not work better than IV */
2059 } else {
2060 if (SvNVX(sv) > (NV)UV_MAX) {
2061 SvIsUV_on(sv);
2062 /* Integer is inaccurate. NOK, IOKp, is UV */
2063 SvUV_set(sv, UV_MAX);
af359546
NC
2064 } else {
2065 SvUV_set(sv, U_V(SvNVX(sv)));
2066 /* 0xFFFFFFFFFFFFFFFF not an issue in here, NVs
2067 NV preservse UV so can do correct comparison. */
2068 if ((NV)(SvUVX(sv)) == SvNVX(sv)) {
2069 SvIOK_on(sv);
af359546 2070 } else {
6f207bd3 2071 NOOP; /* Integer is imprecise. NOK, IOKp, is UV */
af359546
NC
2072 }
2073 }
4b0c9573 2074 SvIsUV_on(sv);
af359546 2075 }
28e5dec8 2076#else /* NV_PRESERVES_UV */
c2988b20
NC
2077 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2078 == (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT)) {
af359546 2079 /* The IV/UV slot will have been set from value returned by
c2988b20
NC
2080 grok_number above. The NV slot has just been set using
2081 Atof. */
560b0c46 2082 SvNOK_on(sv);
c2988b20
NC
2083 assert (SvIOKp(sv));
2084 } else {
2085 if (((UV)1 << NV_PRESERVES_UV_BITS) >
2086 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
2087 /* Small enough to preserve all bits. */
2088 (void)SvIOKp_on(sv);
2089 SvNOK_on(sv);
45977657 2090 SvIV_set(sv, I_V(SvNVX(sv)));
c2988b20
NC
2091 if ((NV)(SvIVX(sv)) == SvNVX(sv))
2092 SvIOK_on(sv);
2093 /* Assumption: first non-preserved integer is < IV_MAX,
2094 this NV is in the preserved range, therefore: */
2095 if (!(U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))
2096 < (UV)IV_MAX)) {
32fdb065 2097 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
2098 }
2099 } else {
2100 /* IN_UV NOT_INT
2101 0 0 already failed to read UV.
2102 0 1 already failed to read UV.
2103 1 0 you won't get here in this case. IV/UV
2104 slot set, public IOK, Atof() unneeded.
2105 1 1 already read UV.
2106 so there's no point in sv_2iuv_non_preserve() attempting
2107 to use atol, strtol, strtoul etc. */
40a17c4c 2108 sv_2iuv_non_preserve (sv, numtype);
c2988b20
NC
2109 }
2110 }
28e5dec8 2111#endif /* NV_PRESERVES_UV */
25da4f38 2112 }
af359546
NC
2113 }
2114 else {
675c862f 2115 if (isGV_with_GP(sv))
a0933d07 2116 return glob_2number((GV *)sv);
180488f8 2117
af359546
NC
2118 if (!(SvFLAGS(sv) & SVs_PADTMP)) {
2119 if (!PL_localizing && ckWARN(WARN_UNINITIALIZED))
2120 report_uninit(sv);
2121 }
25da4f38
IZ
2122 if (SvTYPE(sv) < SVt_IV)
2123 /* Typically the caller expects that sv_any is not NULL now. */
2124 sv_upgrade(sv, SVt_IV);
af359546
NC
2125 /* Return 0 from the caller. */
2126 return TRUE;
2127 }
2128 return FALSE;
2129}
2130
2131/*
2132=for apidoc sv_2iv_flags
2133
2134Return the integer value of an SV, doing any necessary string
2135conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2136Normally used via the C<SvIV(sv)> and C<SvIVx(sv)> macros.
2137
2138=cut
2139*/
2140
2141IV
2142Perl_sv_2iv_flags(pTHX_ register SV *sv, I32 flags)
2143{
97aff369 2144 dVAR;
af359546 2145 if (!sv)
a0d0e21e 2146 return 0;
cecf5685
NC
2147 if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
2148 /* FBMs use the same flag bit as SVf_IVisUV, so must let them
50caf62e
NC
2149 cache IVs just in case. In practice it seems that they never
2150 actually anywhere accessible by user Perl code, let alone get used
2151 in anything other than a string context. */
af359546
NC
2152 if (flags & SV_GMAGIC)
2153 mg_get(sv);
2154 if (SvIOKp(sv))
2155 return SvIVX(sv);
2156 if (SvNOKp(sv)) {
2157 return I_V(SvNVX(sv));
2158 }
71c558c3
NC
2159 if (SvPOKp(sv) && SvLEN(sv)) {
2160 UV value;
2161 const int numtype
2162 = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2163
2164 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2165 == IS_NUMBER_IN_UV) {
2166 /* It's definitely an integer */
2167 if (numtype & IS_NUMBER_NEG) {
2168 if (value < (UV)IV_MIN)
2169 return -(IV)value;
2170 } else {
2171 if (value < (UV)IV_MAX)
2172 return (IV)value;
2173 }
2174 }
2175 if (!numtype) {
2176 if (ckWARN(WARN_NUMERIC))
2177 not_a_number(sv);
2178 }
2179 return I_V(Atof(SvPVX_const(sv)));
2180 }
1c7ff15e
NC
2181 if (SvROK(sv)) {
2182 goto return_rok;
af359546 2183 }
1c7ff15e
NC
2184 assert(SvTYPE(sv) >= SVt_PVMG);
2185 /* This falls through to the report_uninit inside S_sv_2iuv_common. */
4cb1ec55 2186 } else if (SvTHINKFIRST(sv)) {
af359546 2187 if (SvROK(sv)) {
1c7ff15e 2188 return_rok:
af359546
NC
2189 if (SvAMAGIC(sv)) {
2190 SV * const tmpstr=AMG_CALLun(sv,numer);
2191 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2192 return SvIV(tmpstr);
2193 }
2194 }
2195 return PTR2IV(SvRV(sv));
2196 }
2197 if (SvIsCOW(sv)) {
2198 sv_force_normal_flags(sv, 0);
2199 }
2200 if (SvREADONLY(sv) && !SvOK(sv)) {
2201 if (ckWARN(WARN_UNINITIALIZED))
2202 report_uninit(sv);
2203 return 0;
2204 }
2205 }
2206 if (!SvIOKp(sv)) {
2207 if (S_sv_2iuv_common(aTHX_ sv))
2208 return 0;
79072805 2209 }
1d7c1841
GS
2210 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2iv(%"IVdf")\n",
2211 PTR2UV(sv),SvIVX(sv)));
25da4f38 2212 return SvIsUV(sv) ? (IV)SvUVX(sv) : SvIVX(sv);
79072805
LW
2213}
2214
645c22ef 2215/*
891f9566 2216=for apidoc sv_2uv_flags
645c22ef
DM
2217
2218Return the unsigned integer value of an SV, doing any necessary string
891f9566
YST
2219conversion. If flags includes SV_GMAGIC, does an mg_get() first.
2220Normally used via the C<SvUV(sv)> and C<SvUVx(sv)> macros.
645c22ef
DM
2221
2222=cut
2223*/
2224
ff68c719 2225UV
891f9566 2226Perl_sv_2uv_flags(pTHX_ register SV *sv, I32 flags)
ff68c719 2227{
97aff369 2228 dVAR;
ff68c719 2229 if (!sv)
2230 return 0;
cecf5685
NC
2231 if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
2232 /* FBMs use the same flag bit as SVf_IVisUV, so must let them
50caf62e 2233 cache IVs just in case. */
891f9566
YST
2234 if (flags & SV_GMAGIC)
2235 mg_get(sv);
ff68c719 2236 if (SvIOKp(sv))
2237 return SvUVX(sv);
2238 if (SvNOKp(sv))
2239 return U_V(SvNVX(sv));
71c558c3
NC
2240 if (SvPOKp(sv) && SvLEN(sv)) {
2241 UV value;
2242 const int numtype
2243 = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
2244
2245 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2246 == IS_NUMBER_IN_UV) {
2247 /* It's definitely an integer */
2248 if (!(numtype & IS_NUMBER_NEG))
2249 return value;
2250 }
2251 if (!numtype) {
2252 if (ckWARN(WARN_NUMERIC))
2253 not_a_number(sv);
2254 }
2255 return U_V(Atof(SvPVX_const(sv)));
2256 }
1c7ff15e
NC
2257 if (SvROK(sv)) {
2258 goto return_rok;
3fe9a6f1 2259 }
1c7ff15e
NC
2260 assert(SvTYPE(sv) >= SVt_PVMG);
2261 /* This falls through to the report_uninit inside S_sv_2iuv_common. */
4cb1ec55 2262 } else if (SvTHINKFIRST(sv)) {
ff68c719 2263 if (SvROK(sv)) {
1c7ff15e 2264 return_rok:
deb46114
NC
2265 if (SvAMAGIC(sv)) {
2266 SV *const tmpstr = AMG_CALLun(sv,numer);
2267 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2268 return SvUV(tmpstr);
2269 }
2270 }
2271 return PTR2UV(SvRV(sv));
ff68c719 2272 }
765f542d
NC
2273 if (SvIsCOW(sv)) {
2274 sv_force_normal_flags(sv, 0);
8a818333 2275 }
0336b60e 2276 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2277 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2278 report_uninit(sv);
ff68c719 2279 return 0;
2280 }
2281 }
af359546
NC
2282 if (!SvIOKp(sv)) {
2283 if (S_sv_2iuv_common(aTHX_ sv))
2284 return 0;
ff68c719 2285 }
25da4f38 2286
1d7c1841
GS
2287 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2uv(%"UVuf")\n",
2288 PTR2UV(sv),SvUVX(sv)));
25da4f38 2289 return SvIsUV(sv) ? SvUVX(sv) : (UV)SvIVX(sv);
ff68c719 2290}
2291
645c22ef
DM
2292/*
2293=for apidoc sv_2nv
2294
2295Return the num value of an SV, doing any necessary string or integer
2296conversion, magic etc. Normally used via the C<SvNV(sv)> and C<SvNVx(sv)>
2297macros.
2298
2299=cut
2300*/
2301
65202027 2302NV
864dbfa3 2303Perl_sv_2nv(pTHX_ register SV *sv)
79072805 2304{
97aff369 2305 dVAR;
79072805
LW
2306 if (!sv)
2307 return 0.0;
cecf5685
NC
2308 if (SvGMAGICAL(sv) || (SvTYPE(sv) == SVt_PVGV && SvVALID(sv))) {
2309 /* FBMs use the same flag bit as SVf_IVisUV, so must let them
50caf62e 2310 cache IVs just in case. */
463ee0b2
LW
2311 mg_get(sv);
2312 if (SvNOKp(sv))
2313 return SvNVX(sv);
0aa395f8 2314 if ((SvPOKp(sv) && SvLEN(sv)) && !SvIOKp(sv)) {
041457d9 2315 if (!SvIOKp(sv) && ckWARN(WARN_NUMERIC) &&
504618e9 2316 !grok_number(SvPVX_const(sv), SvCUR(sv), NULL))
a0d0e21e 2317 not_a_number(sv);
3f7c398e 2318 return Atof(SvPVX_const(sv));
a0d0e21e 2319 }
25da4f38 2320 if (SvIOKp(sv)) {
1c846c1f 2321 if (SvIsUV(sv))
65202027 2322 return (NV)SvUVX(sv);
25da4f38 2323 else
65202027 2324 return (NV)SvIVX(sv);
47a72cb8
NC
2325 }
2326 if (SvROK(sv)) {
2327 goto return_rok;
2328 }
2329 assert(SvTYPE(sv) >= SVt_PVMG);
2330 /* This falls through to the report_uninit near the end of the
2331 function. */
2332 } else if (SvTHINKFIRST(sv)) {
a0d0e21e 2333 if (SvROK(sv)) {
47a72cb8 2334 return_rok:
deb46114
NC
2335 if (SvAMAGIC(sv)) {
2336 SV *const tmpstr = AMG_CALLun(sv,numer);
2337 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2338 return SvNV(tmpstr);
2339 }
2340 }
2341 return PTR2NV(SvRV(sv));
a0d0e21e 2342 }
765f542d
NC
2343 if (SvIsCOW(sv)) {
2344 sv_force_normal_flags(sv, 0);
8a818333 2345 }
0336b60e 2346 if (SvREADONLY(sv) && !SvOK(sv)) {
599cee73 2347 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2348 report_uninit(sv);
ed6116ce
LW
2349 return 0.0;
2350 }
79072805
LW
2351 }
2352 if (SvTYPE(sv) < SVt_NV) {
7e25a7e9
NC
2353 /* The logic to use SVt_PVNV if necessary is in sv_upgrade. */
2354 sv_upgrade(sv, SVt_NV);
906f284f 2355#ifdef USE_LONG_DOUBLE
097ee67d 2356 DEBUG_c({
f93f4e46 2357 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
2358 PerlIO_printf(Perl_debug_log,
2359 "0x%"UVxf" num(%" PERL_PRIgldbl ")\n",
2360 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
2361 RESTORE_NUMERIC_LOCAL();
2362 });
65202027 2363#else
572bbb43 2364 DEBUG_c({
f93f4e46 2365 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 2366 PerlIO_printf(Perl_debug_log, "0x%"UVxf" num(%"NVgf")\n",
1d7c1841 2367 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
2368 RESTORE_NUMERIC_LOCAL();
2369 });
572bbb43 2370#endif
79072805
LW
2371 }
2372 else if (SvTYPE(sv) < SVt_PVNV)
2373 sv_upgrade(sv, SVt_PVNV);
59d8ce62
NC
2374 if (SvNOKp(sv)) {
2375 return SvNVX(sv);
61604483 2376 }
59d8ce62 2377 if (SvIOKp(sv)) {
9d6ce603 2378 SvNV_set(sv, SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv));
28e5dec8
JH
2379#ifdef NV_PRESERVES_UV
2380 SvNOK_on(sv);
2381#else
2382 /* Only set the public NV OK flag if this NV preserves the IV */
2383 /* Check it's not 0xFFFFFFFFFFFFFFFF */
2384 if (SvIsUV(sv) ? ((SvUVX(sv) != UV_MAX)&&(SvUVX(sv) == U_V(SvNVX(sv))))
2385 : (SvIVX(sv) == I_V(SvNVX(sv))))
2386 SvNOK_on(sv);
2387 else
2388 SvNOKp_on(sv);
2389#endif
93a17b20 2390 }
748a9306 2391 else if (SvPOKp(sv) && SvLEN(sv)) {
c2988b20 2392 UV value;
3f7c398e 2393 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), &value);
041457d9 2394 if (!SvIOKp(sv) && !numtype && ckWARN(WARN_NUMERIC))
a0d0e21e 2395 not_a_number(sv);
28e5dec8 2396#ifdef NV_PRESERVES_UV
c2988b20
NC
2397 if ((numtype & (IS_NUMBER_IN_UV | IS_NUMBER_NOT_INT))
2398 == IS_NUMBER_IN_UV) {
5e045b90 2399 /* It's definitely an integer */
9d6ce603 2400 SvNV_set(sv, (numtype & IS_NUMBER_NEG) ? -(NV)value : (NV)value);
c2988b20 2401 } else
3f7c398e 2402 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8
JH
2403 SvNOK_on(sv);
2404#else
3f7c398e 2405 SvNV_set(sv, Atof(SvPVX_const(sv)));
28e5dec8
JH
2406 /* Only set the public NV OK flag if this NV preserves the value in
2407 the PV at least as well as an IV/UV would.
2408 Not sure how to do this 100% reliably. */
2409 /* if that shift count is out of range then Configure's test is
2410 wonky. We shouldn't be in here with NV_PRESERVES_UV_BITS ==
2411 UV_BITS */
2412 if (((UV)1 << NV_PRESERVES_UV_BITS) >
c2988b20 2413 U_V(SvNVX(sv) > 0 ? SvNVX(sv) : -SvNVX(sv))) {
28e5dec8 2414 SvNOK_on(sv); /* Definitely small enough to preserve all bits */
c2988b20
NC
2415 } else if (!(numtype & IS_NUMBER_IN_UV)) {
2416 /* Can't use strtol etc to convert this string, so don't try.
2417 sv_2iv and sv_2uv will use the NV to convert, not the PV. */
2418 SvNOK_on(sv);
2419 } else {
2420 /* value has been set. It may not be precise. */
2421 if ((numtype & IS_NUMBER_NEG) && (value > (UV)IV_MIN)) {
2422 /* 2s complement assumption for (UV)IV_MIN */
2423 SvNOK_on(sv); /* Integer is too negative. */
2424 } else {
2425 SvNOKp_on(sv);
2426 SvIOKp_on(sv);
6fa402ec 2427
c2988b20 2428 if (numtype & IS_NUMBER_NEG) {
45977657 2429 SvIV_set(sv, -(IV)value);
c2988b20 2430 } else if (value <= (UV)IV_MAX) {
45977657 2431 SvIV_set(sv, (IV)value);
c2988b20 2432 } else {
607fa7f2 2433 SvUV_set(sv, value);
c2988b20
NC
2434 SvIsUV_on(sv);
2435 }
2436
2437 if (numtype & IS_NUMBER_NOT_INT) {
2438 /* I believe that even if the original PV had decimals,
2439 they are lost beyond the limit of the FP precision.
2440 However, neither is canonical, so both only get p
2441 flags. NWC, 2000/11/25 */
2442 /* Both already have p flags, so do nothing */
2443 } else {
66a1b24b 2444 const NV nv = SvNVX(sv);
c2988b20
NC
2445 if (SvNVX(sv) < (NV)IV_MAX + 0.5) {
2446 if (SvIVX(sv) == I_V(nv)) {
2447 SvNOK_on(sv);
c2988b20 2448 } else {
c2988b20
NC
2449 /* It had no "." so it must be integer. */
2450 }
00b6aa41 2451 SvIOK_on(sv);
c2988b20
NC
2452 } else {
2453 /* between IV_MAX and NV(UV_MAX).
2454 Could be slightly > UV_MAX */
6fa402ec 2455
c2988b20
NC
2456 if (numtype & IS_NUMBER_NOT_INT) {
2457 /* UV and NV both imprecise. */
2458 } else {
66a1b24b 2459 const UV nv_as_uv = U_V(nv);
c2988b20
NC
2460
2461 if (value == nv_as_uv && SvUVX(sv) != UV_MAX) {
2462 SvNOK_on(sv);
c2988b20 2463 }
00b6aa41 2464 SvIOK_on(sv);
c2988b20
NC
2465 }
2466 }
2467 }
2468 }
2469 }
28e5dec8 2470#endif /* NV_PRESERVES_UV */
93a17b20 2471 }
79072805 2472 else {
f7877b28 2473 if (isGV_with_GP(sv)) {
19f6321d 2474 glob_2number((GV *)sv);
180488f8
NC
2475 return 0.0;
2476 }
2477
041457d9 2478 if (!PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP) && ckWARN(WARN_UNINITIALIZED))
29489e7c 2479 report_uninit(sv);
7e25a7e9
NC
2480 assert (SvTYPE(sv) >= SVt_NV);
2481 /* Typically the caller expects that sv_any is not NULL now. */
2482 /* XXX Ilya implies that this is a bug in callers that assume this
2483 and ideally should be fixed. */
a0d0e21e 2484 return 0.0;
79072805 2485 }
572bbb43 2486#if defined(USE_LONG_DOUBLE)
097ee67d 2487 DEBUG_c({
f93f4e46 2488 STORE_NUMERIC_LOCAL_SET_STANDARD();
1d7c1841
GS
2489 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2nv(%" PERL_PRIgldbl ")\n",
2490 PTR2UV(sv), SvNVX(sv));
572bbb43
GS
2491 RESTORE_NUMERIC_LOCAL();
2492 });
65202027 2493#else
572bbb43 2494 DEBUG_c({
f93f4e46 2495 STORE_NUMERIC_LOCAL_SET_STANDARD();
1779d84d 2496 PerlIO_printf(Perl_debug_log, "0x%"UVxf" 1nv(%"NVgf")\n",
1d7c1841 2497 PTR2UV(sv), SvNVX(sv));
097ee67d
JH
2498 RESTORE_NUMERIC_LOCAL();
2499 });
572bbb43 2500#endif
463ee0b2 2501 return SvNVX(sv);
79072805
LW
2502}
2503
645c22ef
DM
2504/* uiv_2buf(): private routine for use by sv_2pv_flags(): print an IV or
2505 * UV as a string towards the end of buf, and return pointers to start and
2506 * end of it.
2507 *
2508 * We assume that buf is at least TYPE_CHARS(UV) long.
2509 */
2510
864dbfa3 2511static char *
aec46f14 2512S_uiv_2buf(char *buf, IV iv, UV uv, int is_uv, char **peob)
25da4f38 2513{
25da4f38 2514 char *ptr = buf + TYPE_CHARS(UV);
823a54a3 2515 char * const ebuf = ptr;
25da4f38 2516 int sign;
25da4f38
IZ
2517
2518 if (is_uv)
2519 sign = 0;
2520 else if (iv >= 0) {
2521 uv = iv;
2522 sign = 0;
2523 } else {
2524 uv = -iv;
2525 sign = 1;
2526 }
2527 do {
eb160463 2528 *--ptr = '0' + (char)(uv % 10);
25da4f38
IZ
2529 } while (uv /= 10);
2530 if (sign)
2531 *--ptr = '-';
2532 *peob = ebuf;
2533 return ptr;
2534}
2535
645c22ef
DM
2536/*
2537=for apidoc sv_2pv_flags
2538
ff276b08 2539Returns a pointer to the string value of an SV, and sets *lp to its length.
645c22ef
DM
2540If flags includes SV_GMAGIC, does an mg_get() first. Coerces sv to a string
2541if necessary.
2542Normally invoked via the C<SvPV_flags> macro. C<sv_2pv()> and C<sv_2pv_nomg>
2543usually end up here too.
2544
2545=cut
2546*/
2547
8d6d96c1
HS
2548char *
2549Perl_sv_2pv_flags(pTHX_ register SV *sv, STRLEN *lp, I32 flags)
2550{
97aff369 2551 dVAR;
79072805 2552 register char *s;
79072805 2553
463ee0b2 2554 if (!sv) {
cdb061a3
NC
2555 if (lp)
2556 *lp = 0;
73d840c0 2557 return (char *)"";
463ee0b2 2558 }
8990e307 2559 if (SvGMAGICAL(sv)) {
8d6d96c1
HS
2560 if (flags & SV_GMAGIC)
2561 mg_get(sv);
463ee0b2 2562 if (SvPOKp(sv)) {
cdb061a3
NC
2563 if (lp)
2564 *lp = SvCUR(sv);
10516c54
NC
2565 if (flags & SV_MUTABLE_RETURN)
2566 return SvPVX_mutable(sv);
4d84ee25
NC
2567 if (flags & SV_CONST_RETURN)
2568 return (char *)SvPVX_const(sv);
463ee0b2
LW
2569 return SvPVX(sv);
2570 }
75dfc8ec
NC
2571 if (SvIOKp(sv) || SvNOKp(sv)) {
2572 char tbuf[64]; /* Must fit sprintf/Gconvert of longest IV/NV */
75dfc8ec
NC
2573 STRLEN len;
2574
2575 if (SvIOKp(sv)) {
e80fed9d 2576 len = SvIsUV(sv)
d9fad198
JH
2577 ? my_snprintf(tbuf, sizeof(tbuf), "%"UVuf, (UV)SvUVX(sv))
2578 : my_snprintf(tbuf, sizeof(tbuf), "%"IVdf, (IV)SvIVX(sv));
75dfc8ec 2579 } else {
e8ada2d0
NC
2580 Gconvert(SvNVX(sv), NV_DIG, 0, tbuf);
2581 len = strlen(tbuf);
75dfc8ec 2582 }
b5b886f0
NC
2583 assert(!SvROK(sv));
2584 {
75dfc8ec
NC
2585 dVAR;
2586
2587#ifdef FIXNEGATIVEZERO
e8ada2d0
NC
2588 if (len == 2 && tbuf[0] == '-' && tbuf[1] == '0') {
2589 tbuf[0] = '0';
2590 tbuf[1] = 0;
75dfc8ec
NC
2591 len = 1;
2592 }
2593#endif
2594 SvUPGRADE(sv, SVt_PV);
2595 if (lp)
2596 *lp = len;
2597 s = SvGROW_mutable(sv, len + 1);
2598 SvCUR_set(sv, len);
2599 SvPOKp_on(sv);
10edeb5d 2600 return (char*)memcpy(s, tbuf, len + 1);
75dfc8ec 2601 }
463ee0b2 2602 }
1c7ff15e
NC
2603 if (SvROK(sv)) {
2604 goto return_rok;
2605 }
2606 assert(SvTYPE(sv) >= SVt_PVMG);
2607 /* This falls through to the report_uninit near the end of the
2608 function. */
2609 } else if (SvTHINKFIRST(sv)) {
ed6116ce 2610 if (SvROK(sv)) {
1c7ff15e 2611 return_rok:
deb46114
NC
2612 if (SvAMAGIC(sv)) {
2613 SV *const tmpstr = AMG_CALLun(sv,string);
2614 if (tmpstr && (!SvROK(tmpstr) || (SvRV(tmpstr) != SvRV(sv)))) {
2615 /* Unwrap this: */
2616 /* char *pv = lp ? SvPV(tmpstr, *lp) : SvPV_nolen(tmpstr);
2617 */
2618
2619 char *pv;
2620 if ((SvFLAGS(tmpstr) & (SVf_POK)) == SVf_POK) {
2621 if (flags & SV_CONST_RETURN) {
2622 pv = (char *) SvPVX_const(tmpstr);
2623 } else {
2624 pv = (flags & SV_MUTABLE_RETURN)
2625 ? SvPVX_mutable(tmpstr) : SvPVX(tmpstr);
2626 }
2627 if (lp)
2628 *lp = SvCUR(tmpstr);
50adf7d2 2629 } else {
deb46114 2630 pv = sv_2pv_flags(tmpstr, lp, flags);
50adf7d2 2631 }
deb46114
NC
2632 if (SvUTF8(tmpstr))
2633 SvUTF8_on(sv);
2634 else
2635 SvUTF8_off(sv);
2636 return pv;
50adf7d2 2637 }
deb46114
NC
2638 }
2639 {
fafee734
NC
2640 STRLEN len;
2641 char *retval;
2642 char *buffer;
f9277f47 2643 MAGIC *mg;
d8eae41e
NC
2644 const SV *const referent = (SV*)SvRV(sv);
2645
2646 if (!referent) {
fafee734
NC
2647 len = 7;
2648 retval = buffer = savepvn("NULLREF", len);
042dae7a
NC
2649 } else if (SvTYPE(referent) == SVt_PVMG
2650 && ((SvFLAGS(referent) &
2651 (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG))
2652 == (SVs_OBJECT|SVs_SMG))
de8c5301
YO
2653 && (mg = mg_find(referent, PERL_MAGIC_qr)))
2654 {
2655 char *str = NULL;
2656 I32 haseval = 0;
60df1e07 2657 U32 flags = 0;
de8c5301
YO
2658 (str) = CALLREG_AS_STR(mg,lp,&flags,&haseval);
2659 if (flags & 1)
2660 SvUTF8_on(sv);
2661 else
2662 SvUTF8_off(sv);
2663 PL_reginterp_cnt += haseval;
2664 return str;
d8eae41e
NC
2665 } else {
2666 const char *const typestr = sv_reftype(referent, 0);
fafee734
NC
2667 const STRLEN typelen = strlen(typestr);
2668 UV addr = PTR2UV(referent);
2669 const char *stashname = NULL;
2670 STRLEN stashnamelen = 0; /* hush, gcc */
2671 const char *buffer_end;
d8eae41e 2672
d8eae41e 2673 if (SvOBJECT(referent)) {
fafee734
NC
2674 const HEK *const name = HvNAME_HEK(SvSTASH(referent));
2675
2676 if (name) {
2677 stashname = HEK_KEY(name);
2678 stashnamelen = HEK_LEN(name);
2679
2680 if (HEK_UTF8(name)) {
2681 SvUTF8_on(sv);
2682 } else {
2683 SvUTF8_off(sv);
2684 }
2685 } else {
2686 stashname = "__ANON__";
2687 stashnamelen = 8;
2688 }
2689 len = stashnamelen + 1 /* = */ + typelen + 3 /* (0x */
2690 + 2 * sizeof(UV) + 2 /* )\0 */;
2691 } else {
2692 len = typelen + 3 /* (0x */
2693 + 2 * sizeof(UV) + 2 /* )\0 */;
d8eae41e 2694 }
fafee734
NC
2695
2696 Newx(buffer, len, char);
2697 buffer_end = retval = buffer + len;
2698
2699 /* Working backwards */
2700 *--retval = '\0';
2701 *--retval = ')';
2702 do {
2703 *--retval = PL_hexdigit[addr & 15];
2704 } while (addr >>= 4);
2705 *--retval = 'x';
2706 *--retval = '0';
2707 *--retval = '(';
2708
2709 retval -= typelen;
2710 memcpy(retval, typestr, typelen);
2711
2712 if (stashname) {
2713 *--retval = '=';
2714 retval -= stashnamelen;
2715 memcpy(retval, stashname, stashnamelen);
2716 }
2717 /* retval may not neccesarily have reached the start of the
2718 buffer here. */
2719 assert (retval >= buffer);
2720
2721 len = buffer_end - retval - 1; /* -1 for that \0 */
c080367d 2722 }
042dae7a 2723 if (lp)
fafee734
NC
2724 *lp = len;
2725 SAVEFREEPV(buffer);
2726 return retval;
463ee0b2 2727 }
79072805 2728 }
0336b60e 2729 if (SvREADONLY(sv) && !SvOK(sv)) {
0336b60e 2730 if (ckWARN(WARN_UNINITIALIZED))
29489e7c 2731 report_uninit(sv);
cdb061a3
NC
2732 if (lp)
2733 *lp = 0;
73d840c0 2734 return (char *)"";
79072805 2735 }
79072805 2736 }
28e5dec8
JH
2737 if (SvIOK(sv) || ((SvIOKp(sv) && !SvNOKp(sv)))) {
2738 /* I'm assuming that if both IV and NV are equally valid then
2739 converting the IV is going to be more efficient */
e1ec3a88 2740 const U32 isUIOK = SvIsUV(sv);
28e5dec8
JH
2741 char buf[TYPE_CHARS(UV)];
2742 char *ebuf, *ptr;
97a130b8 2743 STRLEN len;
28e5dec8
JH
2744
2745 if (SvTYPE(sv) < SVt_PVIV)
2746 sv_upgrade(sv, SVt_PVIV);
4ea1d550 2747 ptr = uiv_2buf(buf, SvIVX(sv), SvUVX(sv), isUIOK, &ebuf);
97a130b8 2748 len = ebuf - ptr;
5902b6a9 2749 /* inlined from sv_setpvn */
97a130b8
NC
2750 s = SvGROW_mutable(sv, len + 1);
2751 Move(ptr, s, len, char);
2752 s += len;
28e5dec8 2753 *s = '\0';
28e5dec8
JH
2754 }
2755 else if (SvNOKp(sv)) {
c81271c3 2756 const int olderrno = errno;
79072805
LW
2757 if (SvTYPE(sv) < SVt_PVNV)
2758 sv_upgrade(sv, SVt_PVNV);
1c846c1f 2759 /* The +20 is pure guesswork. Configure test needed. --jhi */
5902b6a9 2760 s = SvGROW_mutable(sv, NV_DIG + 20);
c81271c3 2761 /* some Xenix systems wipe out errno here */
79072805 2762#ifdef apollo
463ee0b2 2763 if (SvNVX(sv) == 0.0)
d1307786 2764 my_strlcpy(s, "0", SvLEN(sv));
79072805
LW
2765 else
2766#endif /*apollo*/
bbce6d69 2767 {
2d4389e4 2768 Gconvert(SvNVX(sv), NV_DIG, 0, s);
bbce6d69 2769 }
79072805 2770 errno = olderrno;
a0d0e21e
LW
2771#ifdef FIXNEGATIVEZERO
2772 if (*s == '-' && s[1] == '0' && !s[2])
d1307786 2773 my_strlcpy(s, "0", SvLEN(s));
a0d0e21e 2774#endif
79072805
LW
2775 while (*s) s++;
2776#ifdef hcx
2777 if (s[-1] == '.')
46fc3d4c 2778 *--s = '\0';
79072805
LW
2779#endif
2780 }
79072805 2781 else {
675c862f 2782 if (isGV_with_GP(sv))
19f6321d 2783 return glob_2pv((GV *)sv, lp);
180488f8 2784
041457d9 2785 if (!PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP) && ckWARN(WARN_UNINITIALIZED))
29489e7c 2786 report_uninit(sv);
cdb061a3 2787 if (lp)
00b6aa41 2788 *lp = 0;
25da4f38
IZ
2789 if (SvTYPE(sv) < SVt_PV)
2790 /* Typically the caller expects that sv_any is not NULL now. */
2791 sv_upgrade(sv, SVt_PV);
73d840c0 2792 return (char *)"";
79072805 2793 }
cdb061a3 2794 {
823a54a3 2795 const STRLEN len = s - SvPVX_const(sv);
cdb061a3
NC
2796 if (lp)
2797 *lp = len;
2798 SvCUR_set(sv, len);
2799 }
79072805 2800 SvPOK_on(sv);
1d7c1841 2801 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3f7c398e 2802 PTR2UV(sv),SvPVX_const(sv)));
4d84ee25
NC
2803 if (flags & SV_CONST_RETURN)
2804 return (char *)SvPVX_const(sv);
10516c54
NC
2805 if (flags & SV_MUTABLE_RETURN)
2806 return SvPVX_mutable(sv);
463ee0b2
LW
2807 return SvPVX(sv);
2808}
2809
645c22ef 2810/*
6050d10e
JP
2811=for apidoc sv_copypv
2812
2813Copies a stringified representation of the source SV into the
2814destination SV. Automatically performs any necessary mg_get and
54f0641b 2815coercion of numeric values into strings. Guaranteed to preserve
2575c402 2816UTF8 flag even from overloaded objects. Similar in nature to
54f0641b
NIS
2817sv_2pv[_flags] but operates directly on an SV instead of just the
2818string. Mostly uses sv_2pv_flags to do its work, except when that
6050d10e
JP
2819would lose the UTF-8'ness of the PV.
2820
2821=cut
2822*/
2823
2824void
2825Perl_sv_copypv(pTHX_ SV *dsv, register SV *ssv)
2826{
446eaa42 2827 STRLEN len;
53c1dcc0 2828 const char * const s = SvPV_const(ssv,len);
cb50f42d 2829 sv_setpvn(dsv,s,len);
446eaa42 2830 if (SvUTF8(ssv))
cb50f42d 2831 SvUTF8_on(dsv);
446eaa42 2832 else
cb50f42d 2833 SvUTF8_off(dsv);
6050d10e
JP
2834}
2835
2836/*
645c22ef
DM
2837=for apidoc sv_2pvbyte
2838
2839Return a pointer to the byte-encoded representation of the SV, and set *lp
1e54db1a 2840to its length. May cause the SV to be downgraded from UTF-8 as a
645c22ef
DM
2841side-effect.
2842
2843Usually accessed via the C<SvPVbyte> macro.
2844
2845=cut
2846*/
2847
7340a771
GS
2848char *
2849Perl_sv_2pvbyte(pTHX_ register SV *sv, STRLEN *lp)
2850{
0875d2fe 2851 sv_utf8_downgrade(sv,0);
97972285 2852 return lp ? SvPV(sv,*lp) : SvPV_nolen(sv);
7340a771
GS
2853}
2854
645c22ef 2855/*
035cbb0e
RGS
2856=for apidoc sv_2pvutf8
2857
2858Return a pointer to the UTF-8-encoded representation of the SV, and set *lp
2859to its length. May cause the SV to be upgraded to UTF-8 as a side-effect.
2860
2861Usually accessed via the C<SvPVutf8> macro.
2862
2863=cut
2864*/
645c22ef 2865
7340a771
GS
2866char *
2867Perl_sv_2pvutf8(pTHX_ register SV *sv, STRLEN *lp)
2868{
035cbb0e
RGS
2869 sv_utf8_upgrade(sv);
2870 return lp ? SvPV(sv,*lp) : SvPV_nolen(sv);
7340a771 2871}
1c846c1f 2872
7ee2227d 2873
645c22ef
DM
2874/*
2875=for apidoc sv_2bool
2876
2877This function is only called on magical items, and is only used by
8cf8f3d1 2878sv_true() or its macro equivalent.
645c22ef
DM
2879
2880=cut
2881*/
2882
463ee0b2 2883bool
864dbfa3 2884Perl_sv_2bool(pTHX_ register SV *sv)
463ee0b2 2885{
97aff369 2886 dVAR;
5b295bef 2887 SvGETMAGIC(sv);
463ee0b2 2888
a0d0e21e
LW
2889 if (!SvOK(sv))
2890 return 0;
2891 if (SvROK(sv)) {
fabdb6c0
AL
2892 if (SvAMAGIC(sv)) {
2893 SV * const tmpsv = AMG_CALLun(sv,bool_);
2894 if (tmpsv && (!SvROK(tmpsv) || (SvRV(tmpsv) != SvRV(sv))))
2895 return (bool)SvTRUE(tmpsv);
2896 }
2897 return SvRV(sv) != 0;
a0d0e21e 2898 }
463ee0b2 2899 if (SvPOKp(sv)) {
53c1dcc0
AL
2900 register XPV* const Xpvtmp = (XPV*)SvANY(sv);
2901 if (Xpvtmp &&
339049b0 2902 (*sv->sv_u.svu_pv > '0' ||
11343788 2903 Xpvtmp->xpv_cur > 1 ||
339049b0 2904 (Xpvtmp->xpv_cur && *sv->sv_u.svu_pv != '0')))
463ee0b2
LW
2905 return 1;
2906 else
2907 return 0;
2908 }
2909 else {
2910 if (SvIOKp(sv))
2911 return SvIVX(sv) != 0;
2912 else {
2913 if (SvNOKp(sv))
2914 return SvNVX(sv) != 0.0;
180488f8 2915 else {
f7877b28 2916 if (isGV_with_GP(sv))
180488f8
NC
2917 return TRUE;
2918 else
2919 return FALSE;
2920 }
463ee0b2
LW
2921 }
2922 }
79072805
LW
2923}
2924
c461cf8f
JH
2925/*
2926=for apidoc sv_utf8_upgrade
2927
78ea37eb 2928Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 2929Forces the SV to string form if it is not already.
4411f3b6
NIS
2930Always sets the SvUTF8 flag to avoid future validity checks even
2931if all the bytes have hibit clear.
c461cf8f 2932
13a6c0e0
JH
2933This is not as a general purpose byte encoding to Unicode interface:
2934use the Encode extension for that.
2935
8d6d96c1
HS
2936=for apidoc sv_utf8_upgrade_flags
2937
78ea37eb 2938Converts the PV of an SV to its UTF-8-encoded form.
645c22ef 2939Forces the SV to string form if it is not already.
8d6d96c1
HS
2940Always sets the SvUTF8 flag to avoid future validity checks even
2941if all the bytes have hibit clear. If C<flags> has C<SV_GMAGIC> bit set,
2942will C<mg_get> on C<sv> if appropriate, else not. C<sv_utf8_upgrade> and
2943C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
2944
13a6c0e0
JH
2945This is not as a general purpose byte encoding to Unicode interface:
2946use the Encode extension for that.
2947
8d6d96c1
HS
2948=cut
2949*/
2950
2951STRLEN
2952Perl_sv_utf8_upgrade_flags(pTHX_ register SV *sv, I32 flags)
2953{
97aff369 2954 dVAR;
808c356f
RGS
2955 if (sv == &PL_sv_undef)
2956 return 0;
e0e62c2a
NIS
2957 if (!SvPOK(sv)) {
2958 STRLEN len = 0;
d52b7888
NC
2959 if (SvREADONLY(sv) && (SvPOKp(sv) || SvIOKp(sv) || SvNOKp(sv))) {
2960 (void) sv_2pv_flags(sv,&len, flags);
2961 if (SvUTF8(sv))
2962 return len;
2963 } else {
2964 (void) SvPV_force(sv,len);
2965 }
e0e62c2a 2966 }
4411f3b6 2967
f5cee72b 2968 if (SvUTF8(sv)) {
5fec3b1d 2969 return SvCUR(sv);
f5cee72b 2970 }
5fec3b1d 2971
765f542d
NC
2972 if (SvIsCOW(sv)) {
2973 sv_force_normal_flags(sv, 0);
db42d148
NIS
2974 }
2975
88632417 2976 if (PL_encoding && !(flags & SV_UTF8_NO_ENCODING))
799ef3cb 2977 sv_recode_to_utf8(sv, PL_encoding);
9f4817db 2978 else { /* Assume Latin-1/EBCDIC */
c4e7c712
NC
2979 /* This function could be much more efficient if we
2980 * had a FLAG in SVs to signal if there are any hibit
2981 * chars in the PV. Given that there isn't such a flag
2982 * make the loop as fast as possible. */
00b6aa41 2983 const U8 * const s = (U8 *) SvPVX_const(sv);
c4420975 2984 const U8 * const e = (U8 *) SvEND(sv);
93524f2b 2985 const U8 *t = s;
c4e7c712
NC
2986
2987 while (t < e) {
53c1dcc0 2988 const U8 ch = *t++;
00b6aa41
AL
2989 /* Check for hi bit */
2990 if (!NATIVE_IS_INVARIANT(ch)) {
2991 STRLEN len = SvCUR(sv) + 1; /* Plus the \0 */
2992 U8 * const recoded = bytes_to_utf8((U8*)s, &len);
2993
2994 SvPV_free(sv); /* No longer using what was there before. */
2995 SvPV_set(sv, (char*)recoded);
2996 SvCUR_set(sv, len - 1);
2997 SvLEN_set(sv, len); /* No longer know the real size. */
c4e7c712 2998 break;
00b6aa41 2999 }
c4e7c712
NC
3000 }
3001 /* Mark as UTF-8 even if no hibit - saves scanning loop */
3002 SvUTF8_on(sv);
560a288e 3003 }
4411f3b6 3004 return SvCUR(sv);
560a288e
GS
3005}
3006
c461cf8f
JH
3007/*
3008=for apidoc sv_utf8_downgrade
3009
78ea37eb
TS
3010Attempts to convert the PV of an SV from characters to bytes.
3011If the PV contains a character beyond byte, this conversion will fail;
3012in this case, either returns false or, if C<fail_ok> is not
c461cf8f
JH
3013true, croaks.
3014
13a6c0e0
JH
3015This is not as a general purpose Unicode to byte encoding interface:
3016use the Encode extension for that.
3017
c461cf8f
JH
3018=cut
3019*/
3020
560a288e
GS
3021bool
3022Perl_sv_utf8_downgrade(pTHX_ register SV* sv, bool fail_ok)
3023{
97aff369 3024 dVAR;
78ea37eb 3025 if (SvPOKp(sv) && SvUTF8(sv)) {
fa301091 3026 if (SvCUR(sv)) {
03cfe0ae 3027 U8 *s;
652088fc 3028 STRLEN len;
fa301091 3029
765f542d
NC
3030 if (SvIsCOW(sv)) {
3031 sv_force_normal_flags(sv, 0);
3032 }
03cfe0ae
NIS
3033 s = (U8 *) SvPV(sv, len);
3034 if (!utf8_to_bytes(s, &len)) {
fa301091
JH
3035 if (fail_ok)
3036 return FALSE;
3037 else {
3038 if (PL_op)
3039 Perl_croak(aTHX_ "Wide character in %s",
53e06cf0 3040 OP_DESC(PL_op));
fa301091
JH
3041 else
3042 Perl_croak(aTHX_ "Wide character");
3043 }
4b3603a4 3044 }
b162af07 3045 SvCUR_set(sv, len);
67e989fb 3046 }
560a288e 3047 }
ffebcc3e 3048 SvUTF8_off(sv);
560a288e
GS
3049 return TRUE;
3050}
3051
c461cf8f
JH
3052/*
3053=for apidoc sv_utf8_encode
3054
78ea37eb
TS
3055Converts the PV of an SV to UTF-8, but then turns the C<SvUTF8>
3056flag off so that it looks like octets again.
c461cf8f
JH
3057
3058=cut
3059*/
3060
560a288e
GS
3061void
3062Perl_sv_utf8_encode(pTHX_ register SV *sv)
3063{
4c94c214
NC
3064 if (SvIsCOW(sv)) {
3065 sv_force_normal_flags(sv, 0);
3066 }
3067 if (SvREADONLY(sv)) {
3068 Perl_croak(aTHX_ PL_no_modify);
3069 }
a5f5288a 3070 (void) sv_utf8_upgrade(sv);
560a288e
GS
3071 SvUTF8_off(sv);
3072}
3073
4411f3b6
NIS
3074/*
3075=for apidoc sv_utf8_decode
3076
78ea37eb
TS
3077If the PV of the SV is an octet sequence in UTF-8
3078and contains a multiple-byte character, the C<SvUTF8> flag is turned on
3079so that it looks like a character. If the PV contains only single-byte
3080characters, the C<SvUTF8> flag stays being off.
3081Scans PV for validity and returns false if the PV is invalid UTF-8.
4411f3b6
NIS
3082
3083=cut
3084*/
3085
560a288e
GS
3086bool
3087Perl_sv_utf8_decode(pTHX_ register SV *sv)
3088{
78ea37eb 3089 if (SvPOKp(sv)) {
93524f2b
NC
3090 const U8 *c;
3091 const U8 *e;
9cbac4c7 3092
645c22ef
DM
3093 /* The octets may have got themselves encoded - get them back as
3094 * bytes
3095 */
3096 if (!sv_utf8_downgrade(sv, TRUE))
560a288e
GS
3097 return FALSE;
3098
3099 /* it is actually just a matter of turning the utf8 flag on, but
3100 * we want to make sure everything inside is valid utf8 first.
3101 */
93524f2b 3102 c = (const U8 *) SvPVX_const(sv);
63cd0674 3103 if (!is_utf8_string(c, SvCUR(sv)+1))
67e989fb 3104 return FALSE;
93524f2b 3105 e = (const U8 *) SvEND(sv);
511c2ff0 3106 while (c < e) {
b64e5050 3107 const U8 ch = *c++;
c4d5f83a 3108 if (!UTF8_IS_INVARIANT(ch)) {
67e989fb
JH
3109 SvUTF8_on(sv);
3110 break;
3111 }
560a288e 3112 }
560a288e
GS
3113 }
3114 return TRUE;
3115}
3116
954c1994
GS
3117/*
3118=for apidoc sv_setsv
3119
645c22ef
DM
3120Copies the contents of the source SV C<ssv> into the destination SV
3121C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
3122function if the source SV needs to be reused. Does not handle 'set' magic.
3123Loosely speaking, it performs a copy-by-value, obliterating any previous
3124content of the destination.
3125
3126You probably want to use one of the assortment of wrappers, such as
3127C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3128C<SvSetMagicSV_nosteal>.
3129
8d6d96c1
HS
3130=for apidoc sv_setsv_flags
3131
645c22ef
DM
3132Copies the contents of the source SV C<ssv> into the destination SV
3133C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
3134function if the source SV needs to be reused. Does not handle 'set' magic.
3135Loosely speaking, it performs a copy-by-value, obliterating any previous
3136content of the destination.
3137If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
5fcdf167
NC
3138C<ssv> if appropriate, else not. If the C<flags> parameter has the
3139C<NOSTEAL> bit set then the buffers of temps will not be stolen. <sv_setsv>
3140and C<sv_setsv_nomg> are implemented in terms of this function.
645c22ef
DM
3141
3142You probably want to use one of the assortment of wrappers, such as
3143C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
3144C<SvSetMagicSV_nosteal>.
3145
3146This is the primary function for copying scalars, and most other
3147copy-ish functions and macros use this underneath.
8d6d96c1
HS
3148
3149=cut
3150*/
3151
5d0301b7 3152static void
2eb42952 3153S_glob_assign_glob(pTHX_ SV *dstr, SV *sstr, const int dtype)
5d0301b7 3154{
70cd14a1 3155 I32 mro_changes = 0; /* 1 = method, 2 = isa */
dd69841b 3156
5d0301b7
NC
3157 if (dtype != SVt_PVGV) {
3158 const char * const name = GvNAME(sstr);
3159 const STRLEN len = GvNAMELEN(sstr);
0d092c36 3160 {
f7877b28
NC
3161 if (dtype >= SVt_PV) {
3162 SvPV_free(dstr);
3163 SvPV_set(dstr, 0);
3164 SvLEN_set(dstr, 0);
3165 SvCUR_set(dstr, 0);
3166 }
0d092c36 3167 SvUPGRADE(dstr, SVt_PVGV);
dedf8e73 3168 (void)SvOK_off(dstr);
2e5b91de
NC
3169 /* FIXME - why are we doing this, then turning it off and on again
3170 below? */
3171 isGV_with_GP_on(dstr);
f7877b28 3172 }
5d0301b7
NC
3173 GvSTASH(dstr) = GvSTASH(sstr);
3174 if (GvSTASH(dstr))
3175 Perl_sv_add_backref(aTHX_ (SV*)GvSTASH(dstr), dstr);
ae8cc45f 3176 gv_name_set((GV *)dstr, name, len, GV_ADD);
5d0301b7
NC
3177 SvFAKE_on(dstr); /* can coerce to non-glob */
3178 }
3179
3180#ifdef GV_UNIQUE_CHECK
3181 if (GvUNIQUE((GV*)dstr)) {
3182 Perl_croak(aTHX_ PL_no_modify);
3183 }
3184#endif
3185
dd69841b
BB
3186 if(GvGP((GV*)sstr)) {
3187 /* If source has method cache entry, clear it */
3188 if(GvCVGEN(sstr)) {
3189 SvREFCNT_dec(GvCV(sstr));
3190 GvCV(sstr) = NULL;
3191 GvCVGEN(sstr) = 0;
3192 }
3193 /* If source has a real method, then a method is
3194 going to change */
3195 else if(GvCV((GV*)sstr)) {
70cd14a1 3196 mro_changes = 1;
dd69841b
BB
3197 }
3198 }
3199
3200 /* If dest already had a real method, that's a change as well */
70cd14a1
CB
3201 if(!mro_changes && GvGP((GV*)dstr) && GvCVu((GV*)dstr)) {
3202 mro_changes = 1;
dd69841b
BB
3203 }
3204
70cd14a1
CB
3205 if(strEQ(GvNAME((GV*)dstr),"ISA"))
3206 mro_changes = 2;
3207
f7877b28 3208 gp_free((GV*)dstr);
2e5b91de 3209 isGV_with_GP_off(dstr);
5d0301b7 3210 (void)SvOK_off(dstr);
2e5b91de 3211 isGV_with_GP_on(dstr);
dedf8e73 3212 GvINTRO_off(dstr); /* one-shot flag */
5d0301b7
NC
3213 GvGP(dstr) = gp_ref(GvGP(sstr));
3214 if (SvTAINTED(sstr))
3215 SvTAINT(dstr);
3216 if (GvIMPORTED(dstr) != GVf_IMPORTED
3217 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3218 {
3219 GvIMPORTED_on(dstr);
3220 }
3221 GvMULTI_on(dstr);
70cd14a1
CB
3222 if(mro_changes == 2) mro_isa_changed_in(GvSTASH(dstr));
3223 else if(mro_changes) mro_method_changed_in(GvSTASH(dstr));
5d0301b7
NC
3224 return;
3225}
3226
b8473700 3227static void
2eb42952 3228S_glob_assign_ref(pTHX_ SV *dstr, SV *sstr) {
b8473700
NC
3229 SV * const sref = SvREFCNT_inc(SvRV(sstr));
3230 SV *dref = NULL;
3231 const int intro = GvINTRO(dstr);
2440974c 3232 SV **location;
3386d083 3233 U8 import_flag = 0;
27242d61
NC
3234 const U32 stype = SvTYPE(sref);
3235
b8473700
NC
3236
3237#ifdef GV_UNIQUE_CHECK
3238 if (GvUNIQUE((GV*)dstr)) {
3239 Perl_croak(aTHX_ PL_no_modify);
3240 }
3241#endif
3242
3243 if (intro) {
3244 GvINTRO_off(dstr); /* one-shot flag */
3245 GvLINE(dstr) = CopLINE(PL_curcop);
3246 GvEGV(dstr) = (GV*)dstr;
3247 }
3248 GvMULTI_on(dstr);
27242d61 3249 switch (stype) {
b8473700 3250 case SVt_PVCV:
27242d61
NC
3251 location = (SV **) &GvCV(dstr);
3252 import_flag = GVf_IMPORTED_CV;
3253 goto common;
3254 case SVt_PVHV:
3255 location = (SV **) &GvHV(dstr);
3256 import_flag = GVf_IMPORTED_HV;
3257 goto common;
3258 case SVt_PVAV:
3259 location = (SV **) &GvAV(dstr);
3260 import_flag = GVf_IMPORTED_AV;
3261 goto common;
3262 case SVt_PVIO:
3263 location = (SV **) &GvIOp(dstr);
3264 goto common;
3265 case SVt_PVFM:
3266 location = (SV **) &GvFORM(dstr);
3267 default:
3268 location = &GvSV(dstr);
3269 import_flag = GVf_IMPORTED_SV;
3270 common:
b8473700 3271 if (intro) {
27242d61 3272 if (stype == SVt_PVCV) {
5f2fca8a
BB
3273 /*if (GvCVGEN(dstr) && (GvCV(dstr) != (CV*)sref || GvCVGEN(dstr))) {*/
3274 if (GvCVGEN(dstr)) {
27242d61
NC
3275 SvREFCNT_dec(GvCV(dstr));
3276 GvCV(dstr) = NULL;
3277 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
27242d61 3278 }
b8473700 3279 }
27242d61 3280 SAVEGENERICSV(*location);
b8473700
NC
3281 }
3282 else
27242d61 3283 dref = *location;
5f2fca8a 3284 if (stype == SVt_PVCV && (*location != sref || GvCVGEN(dstr))) {
27242d61 3285 CV* const cv = (CV*)*location;
b8473700
NC
3286 if (cv) {
3287 if (!GvCVGEN((GV*)dstr) &&
3288 (CvROOT(cv) || CvXSUB(cv)))
3289 {
3290 /* Redefining a sub - warning is mandatory if
3291 it was a const and its value changed. */
3292 if (CvCONST(cv) && CvCONST((CV*)sref)
3293 && cv_const_sv(cv) == cv_const_sv((CV*)sref)) {
6f207bd3 3294 NOOP;
b8473700
NC
3295 /* They are 2 constant subroutines generated from
3296 the same constant. This probably means that
3297 they are really the "same" proxy subroutine
3298 instantiated in 2 places. Most likely this is
3299 when a constant is exported twice. Don't warn.
3300 */
3301 }
3302 else if (ckWARN(WARN_REDEFINE)
3303 || (CvCONST(cv)
3304 && (!CvCONST((CV*)sref)
3305 || sv_cmp(cv_const_sv(cv),
3306 cv_const_sv((CV*)sref))))) {
3307 Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
10edeb5d
JH
3308 (const char *)
3309 (CvCONST(cv)
3310 ? "Constant subroutine %s::%s redefined"
3311 : "Subroutine %s::%s redefined"),
b8473700
NC
3312 HvNAME_get(GvSTASH((GV*)dstr)),
3313 GvENAME((GV*)dstr));
3314 }
3315 }
3316 if (!intro)
cbf82dd0
NC
3317 cv_ckproto_len(cv, (GV*)dstr,
3318 SvPOK(sref) ? SvPVX_const(sref) : NULL,
3319 SvPOK(sref) ? SvCUR(sref) : 0);
b8473700 3320 }
b8473700
NC
3321 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
3322 GvASSUMECV_on(dstr);
dd69841b 3323 if(GvSTASH(dstr)) mro_method_changed_in(GvSTASH(dstr)); /* sub foo { 1 } sub bar { 2 } *bar = \&foo */
b8473700 3324 }
2440974c 3325 *location = sref;
3386d083
NC
3326 if (import_flag && !(GvFLAGS(dstr) & import_flag)
3327 && CopSTASH_ne(PL_curcop, GvSTASH(dstr))) {
3328 GvFLAGS(dstr) |= import_flag;
b8473700
NC
3329 }
3330 break;
3331 }
b37c2d43 3332 SvREFCNT_dec(dref);
b8473700
NC
3333 if (SvTAINTED(sstr))
3334 SvTAINT(dstr);
3335 return;
3336}
3337
8d6d96c1
HS
3338void
3339Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV *sstr, I32 flags)
3340{
97aff369 3341 dVAR;
8990e307
LW
3342 register U32 sflags;
3343 register int dtype;
42d0e0b7 3344 register svtype stype;
463ee0b2 3345
79072805
LW
3346 if (sstr == dstr)
3347 return;
29f4f0ab
NC
3348
3349 if (SvIS_FREED(dstr)) {
3350 Perl_croak(aTHX_ "panic: attempt to copy value %" SVf
be2597df 3351 " to a freed scalar %p", SVfARG(sstr), (void *)dstr);
29f4f0ab 3352 }
765f542d 3353 SV_CHECK_THINKFIRST_COW_DROP(dstr);
79072805 3354 if (!sstr)
3280af22 3355 sstr = &PL_sv_undef;
29f4f0ab 3356 if (SvIS_FREED(sstr)) {
6c9570dc
MHM
3357 Perl_croak(aTHX_ "panic: attempt to copy freed scalar %p to %p",
3358 (void*)sstr, (void*)dstr);
29f4f0ab 3359 }
8990e307
LW
3360 stype = SvTYPE(sstr);
3361 dtype = SvTYPE(dstr);
79072805 3362
52944de8 3363 (void)SvAMAGIC_off(dstr);
7a5fa8a2 3364 if ( SvVOK(dstr) )
ece467f9
JP
3365 {
3366 /* need to nuke the magic */
3367 mg_free(dstr);
3368 SvRMAGICAL_off(dstr);
3369 }
9e7bc3e8 3370
463ee0b2 3371 /* There's a lot of redundancy below but we're going for speed here */
79072805 3372
8990e307 3373 switch (stype) {
79072805 3374 case SVt_NULL:
aece5585 3375 undef_sstr:
20408e3c
GS
3376 if (dtype != SVt_PVGV) {
3377 (void)SvOK_off(dstr);
3378 return;
3379 }
3380 break;
463ee0b2 3381 case SVt_IV:
aece5585
GA
3382 if (SvIOK(sstr)) {
3383 switch (dtype) {
3384 case SVt_NULL:
8990e307 3385 sv_upgrade(dstr, SVt_IV);
aece5585
GA
3386 break;
3387 case SVt_NV:
aece5585
GA
3388 case SVt_RV:
3389 case SVt_PV:
a0d0e21e 3390 sv_upgrade(dstr, SVt_PVIV);
aece5585 3391 break;
010be86b
NC
3392 case SVt_PVGV:
3393 goto end_of_first_switch;
aece5585
GA
3394 }
3395 (void)SvIOK_only(dstr);
45977657 3396 SvIV_set(dstr, SvIVX(sstr));
25da4f38
IZ
3397 if (SvIsUV(sstr))
3398 SvIsUV_on(dstr);
37c25af0
NC
3399 /* SvTAINTED can only be true if the SV has taint magic, which in
3400 turn means that the SV type is PVMG (or greater). This is the
3401 case statement for SVt_IV, so this cannot be true (whatever gcov
3402 may say). */
3403 assert(!SvTAINTED(sstr));
aece5585 3404 return;
8990e307 3405 }
aece5585
GA
3406 goto undef_sstr;
3407
463ee0b2 3408 case SVt_NV:
aece5585
GA
3409 if (SvNOK(sstr)) {
3410 switch (dtype) {
3411 case SVt_NULL:
3412 case SVt_IV:
8990e307 3413 sv_upgrade(dstr, SVt_NV);
aece5585
GA
3414 break;
3415 case SVt_RV:
3416 case SVt_PV:
3417 case SVt_PVIV:
a0d0e21e 3418 sv_upgrade(dstr, SVt_PVNV);
aece5585 3419 break;
010be86b
NC
3420 case SVt_PVGV:
3421 goto end_of_first_switch;
aece5585 3422 }
9d6ce603 3423 SvNV_set(dstr, SvNVX(sstr));
aece5585 3424 (void)SvNOK_only(dstr);
37c25af0
NC
3425 /* SvTAINTED can only be true if the SV has taint magic, which in
3426 turn means that the SV type is PVMG (or greater). This is the
3427 case statement for SVt_NV, so this cannot be true (whatever gcov
3428 may say). */
3429 assert(!SvTAINTED(sstr));
aece5585 3430 return;
8990e307 3431 }
aece5585
GA
3432 goto undef_sstr;
3433
ed6116ce 3434 case SVt_RV:
8990e307 3435 if (dtype < SVt_RV)
ed6116ce 3436 sv_upgrade(dstr, SVt_RV);
ed6116ce 3437 break;
fc36a67e 3438 case SVt_PVFM:
f8c7b90f 3439#ifdef PERL_OLD_COPY_ON_WRITE
d89fc664
NC
3440 if ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS) {
3441 if (dtype < SVt_PVIV)
3442 sv_upgrade(dstr, SVt_PVIV);
3443 break;
3444 }
3445 /* Fall through */
3446#endif
3447 case SVt_PV:
8990e307 3448 if (dtype < SVt_PV)
463ee0b2 3449 sv_upgrade(dstr, SVt_PV);
463ee0b2
LW
3450 break;
3451 case SVt_PVIV:
8990e307 3452 if (dtype < SVt_PVIV)
463ee0b2 3453 sv_upgrade(dstr, SVt_PVIV);
463ee0b2
LW
3454 break;
3455 case SVt_PVNV:
8990e307 3456 if (dtype < SVt_PVNV)
463ee0b2 3457 sv_upgrade(dstr, SVt_PVNV);
463ee0b2 3458 break;
489f7bfe 3459 default:
a3b680e6
AL
3460 {
3461 const char * const type = sv_reftype(sstr,0);
533c011a 3462 if (PL_op)
a3b680e6 3463 Perl_croak(aTHX_ "Bizarre copy of %s in %s", type, OP_NAME(PL_op));
4633a7c4 3464 else
a3b680e6
AL
3465 Perl_croak(aTHX_ "Bizarre copy of %s", type);
3466 }
4633a7c4
LW
3467 break;
3468
cecf5685 3469 /* case SVt_BIND: */
39cb70dc 3470 case SVt_PVLV:
79072805 3471 case SVt_PVGV:
cecf5685 3472 if (isGV_with_GP(sstr) && dtype <= SVt_PVGV) {
d4c19fe8 3473 glob_assign_glob(dstr, sstr, dtype);
b8c701c1 3474 return;
79072805 3475 }
cecf5685 3476 /* SvVALID means that this PVGV is playing at being an FBM. */
5f66b61c 3477 /*FALLTHROUGH*/
79072805 3478
489f7bfe 3479 case SVt_PVMG:
8d6d96c1 3480 if (SvGMAGICAL(sstr) && (flags & SV_GMAGIC)) {
973f89ab 3481 mg_get(sstr);
1d9c78c6 3482 if (SvTYPE(sstr) != stype) {
973f89ab 3483 stype = SvTYPE(sstr);
cecf5685 3484 if (isGV_with_GP(sstr) && stype == SVt_PVGV && dtype <= SVt_PVGV) {
d4c19fe8 3485 glob_assign_glob(dstr, sstr, dtype);
b8c701c1
NC
3486 return;
3487 }
973f89ab
CS
3488 }
3489 }
ded42b9f 3490 if (stype == SVt_PVLV)
862a34c6 3491 SvUPGRADE(dstr, SVt_PVNV);
ded42b9f 3492 else
42d0e0b7 3493 SvUPGRADE(dstr, (svtype)stype);
79072805 3494 }
010be86b 3495 end_of_first_switch:
79072805 3496
ff920335
NC
3497 /* dstr may have been upgraded. */
3498 dtype = SvTYPE(dstr);
8990e307
LW
3499 sflags = SvFLAGS(sstr);
3500
ba2fdce6 3501 if (dtype == SVt_PVCV || dtype == SVt_PVFM) {
85324b4d
NC
3502 /* Assigning to a subroutine sets the prototype. */
3503 if (SvOK(sstr)) {
3504 STRLEN len;
3505 const char *const ptr = SvPV_const(sstr, len);
3506
3507 SvGROW(dstr, len + 1);
3508 Copy(ptr, SvPVX(dstr), len + 1, char);
3509 SvCUR_set(dstr, len);
fcddd32e 3510 SvPOK_only(dstr);
ba2fdce6 3511 SvFLAGS(dstr) |= sflags & SVf_UTF8;
85324b4d
NC
3512 } else {
3513 SvOK_off(dstr);
3514 }
ba2fdce6
NC
3515 } else if (dtype == SVt_PVAV || dtype == SVt_PVHV) {
3516 const char * const type = sv_reftype(dstr,0);
3517 if (PL_op)
3518 Perl_croak(aTHX_ "Cannot copy to %s in %s", type, OP_NAME(PL_op));
3519 else
3520 Perl_croak(aTHX_ "Cannot copy to %s", type);
85324b4d 3521 } else if (sflags & SVf_ROK) {
cecf5685
NC
3522 if (isGV_with_GP(dstr) && dtype == SVt_PVGV
3523 && SvTYPE(SvRV(sstr)) == SVt_PVGV) {
acaa9288
NC
3524 sstr = SvRV(sstr);
3525 if (sstr == dstr) {
3526 if (GvIMPORTED(dstr) != GVf_IMPORTED
3527 && CopSTASH_ne(PL_curcop, GvSTASH(dstr)))
3528 {
3529 GvIMPORTED_on(dstr);
3530 }
3531 GvMULTI_on(dstr);
3532 return;
3533 }
d4c19fe8 3534 glob_assign_glob(dstr, sstr, dtype);
acaa9288
NC
3535 return;
3536 }
3537
8990e307 3538 if (dtype >= SVt_PV) {
b8c701c1 3539 if (dtype == SVt_PVGV) {
d4c19fe8 3540 glob_assign_ref(dstr, sstr);
b8c701c1
NC
3541 return;
3542 }
3f7c398e 3543 if (SvPVX_const(dstr)) {
8bd4d4c5 3544 SvPV_free(dstr);
b162af07
SP
3545 SvLEN_set(dstr, 0);
3546 SvCUR_set(dstr, 0);
a0d0e21e 3547 }
8990e307 3548 }
a0d0e21e 3549 (void)SvOK_off(dstr);
b162af07 3550 SvRV_set(dstr, SvREFCNT_inc(SvRV(sstr)));
96d4b0ee 3551 SvFLAGS(dstr) |= sflags & SVf_ROK;
dfd48732
NC
3552 assert(!(sflags & SVp_NOK));
3553 assert(!(sflags & SVp_IOK));
3554 assert(!(sflags & SVf_NOK));
3555 assert(!(sflags & SVf_IOK));
ed6116ce 3556 }
cecf5685 3557 else if (dtype == SVt_PVGV && isGV_with_GP(dstr)) {
c0c44674
NC
3558 if (!(sflags & SVf_OK)) {
3559 if (ckWARN(WARN_MISC))
3560 Perl_warner(aTHX_ packWARN(WARN_MISC),
3561 "Undefined value assigned to typeglob");
3562 }
3563 else {
3564 GV *gv = gv_fetchsv(sstr, GV_ADD, SVt_PVGV);
3565 if (dstr != (SV*)gv) {
3566 if (GvGP(dstr))
3567 gp_free((GV*)dstr);
3568 GvGP(dstr) = gp_ref(GvGP(gv));
3569 }
3570 }
3571 }
8990e307 3572 else if (sflags & SVp_POK) {
765f542d 3573 bool isSwipe = 0;
79072805
LW
3574
3575 /*
3576 * Check to see if we can just swipe the string. If so, it's a
3577 * possible small lose on short strings, but a big win on long ones.
3f7c398e
SP
3578 * It might even be a win on short strings if SvPVX_const(dstr)
3579 * has to be allocated and SvPVX_const(sstr) has to be freed.
34482cd6
NC
3580 * Likewise if we can set up COW rather than doing an actual copy, we
3581 * drop to the else clause, as the swipe code and the COW setup code
3582 * have much in common.
79072805
LW
3583 */
3584
120fac95
NC
3585 /* Whichever path we take through the next code, we want this true,
3586 and doing it now facilitates the COW check. */
3587 (void)SvPOK_only(dstr);
3588
765f542d 3589 if (
34482cd6
NC
3590 /* If we're already COW then this clause is not true, and if COW
3591 is allowed then we drop down to the else and make dest COW
3592 with us. If caller hasn't said that we're allowed to COW
3593 shared hash keys then we don't do the COW setup, even if the
3594 source scalar is a shared hash key scalar. */
3595 (((flags & SV_COW_SHARED_HASH_KEYS)
3596 ? (sflags & (SVf_FAKE|SVf_READONLY)) != (SVf_FAKE|SVf_READONLY)
3597 : 1 /* If making a COW copy is forbidden then the behaviour we
3598 desire is as if the source SV isn't actually already
3599 COW, even if it is. So we act as if the source flags
3600 are not COW, rather than actually testing them. */
3601 )
f8c7b90f 3602#ifndef PERL_OLD_COPY_ON_WRITE
34482cd6
NC
3603 /* The change that added SV_COW_SHARED_HASH_KEYS makes the logic
3604 when PERL_OLD_COPY_ON_WRITE is defined a little wrong.
3605 Conceptually PERL_OLD_COPY_ON_WRITE being defined should
3606 override SV_COW_SHARED_HASH_KEYS, because it means "always COW"
3607 but in turn, it's somewhat dead code, never expected to go
3608 live, but more kept as a placeholder on how to do it better
3609 in a newer implementation. */
3610 /* If we are COW and dstr is a suitable target then we drop down
3611 into the else and make dest a COW of us. */
b8f9541a
NC
3612 || (SvFLAGS(dstr) & CAN_COW_MASK) != CAN_COW_FLAGS
3613#endif
3614 )
765f542d 3615 &&
765f542d
NC
3616 !(isSwipe =
3617 (sflags & SVs_TEMP) && /* slated for free anyway? */
3618 !(sflags & SVf_OOK) && /* and not involved in OOK hack? */
5fcdf167
NC
3619 (!(flags & SV_NOSTEAL)) &&
3620 /* and we're allowed to steal temps */
765f542d
NC
3621 SvREFCNT(sstr) == 1 && /* and no other references to it? */
3622 SvLEN(sstr) && /* and really is a string */
645c22ef 3623 /* and won't be needed again, potentially */
765f542d 3624 !(PL_op && PL_op->op_type == OP_AASSIGN))
f8c7b90f 3625#ifdef PERL_OLD_COPY_ON_WRITE
cb23d5b1
NC
3626 && ((flags & SV_COW_SHARED_HASH_KEYS)
3627 ? (!((sflags & CAN_COW_MASK) == CAN_COW_FLAGS
3628 && (SvFLAGS(dstr) & CAN_COW_MASK) == CAN_COW_FLAGS
3629 && SvTYPE(sstr) >= SVt_PVIV))
3630 : 1)
765f542d
NC
3631#endif
3632 ) {
3633 /* Failed the swipe test, and it's not a shared hash key either.
3634 Have to copy the string. */
3635 STRLEN len = SvCUR(sstr);
3636 SvGROW(dstr, len + 1); /* inlined from sv_setpvn */
3f7c398e 3637 Move(SvPVX_const(sstr),SvPVX(dstr),len,char);
765f542d
NC
3638 SvCUR_set(dstr, len);
3639 *SvEND(dstr) = '\0';
765f542d 3640 } else {
f8c7b90f 3641 /* If PERL_OLD_COPY_ON_WRITE is not defined, then isSwipe will always
765f542d 3642 be true in here. */
765f542d
NC
3643 /* Either it's a shared hash key, or it's suitable for
3644 copy-on-write or we can swipe the string. */
46187eeb 3645 if (DEBUG_C_TEST) {
ed252734 3646 PerlIO_printf(Perl_debug_log, "Copy on write: sstr --> dstr\n");
e419cbc5
NC
3647 sv_dump(sstr);
3648 sv_dump(dstr);
46187eeb 3649 }
f8c7b90f 3650#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
3651 if (!isSwipe) {
3652 /* I believe I should acquire a global SV mutex if
3653 it's a COW sv (not a shared hash key) to stop
3654 it going un copy-on-write.
3655 If the source SV has gone un copy on write between up there
3656 and down here, then (assert() that) it is of the correct
3657 form to make it copy on write again */
3658 if ((sflags & (SVf_FAKE | SVf_READONLY))
3659 != (SVf_FAKE | SVf_READONLY)) {
3660 SvREADONLY_on(sstr);
3661 SvFAKE_on(sstr);
3662 /* Make the source SV into a loop of 1.
3663 (about to become 2) */
a29f6d03 3664 SV_COW_NEXT_SV_SET(sstr, sstr);
765f542d
NC
3665 }
3666 }
3667#endif
3668 /* Initial code is common. */
94010e71
NC
3669 if (SvPVX_const(dstr)) { /* we know that dtype >= SVt_PV */
3670 SvPV_free(dstr);
79072805 3671 }
765f542d 3672
765f542d
NC
3673 if (!isSwipe) {
3674 /* making another shared SV. */
3675 STRLEN cur = SvCUR(sstr);
3676 STRLEN len = SvLEN(sstr);
f8c7b90f 3677#ifdef PERL_OLD_COPY_ON_WRITE
765f542d 3678 if (len) {
b8f9541a 3679 assert (SvTYPE(dstr) >= SVt_PVIV);
765f542d
NC
3680 /* SvIsCOW_normal */
3681 /* splice us in between source and next-after-source. */
a29f6d03
NC
3682 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
3683 SV_COW_NEXT_SV_SET(sstr, dstr);
940132f3 3684 SvPV_set(dstr, SvPVX_mutable(sstr));
a604c751
NC
3685 } else
3686#endif
3687 {
765f542d 3688 /* SvIsCOW_shared_hash */
46187eeb
NC
3689 DEBUG_C(PerlIO_printf(Perl_debug_log,
3690 "Copy on write: Sharing hash\n"));
b8f9541a 3691
bdd68bc3 3692 assert (SvTYPE(dstr) >= SVt_PV);
765f542d 3693 SvPV_set(dstr,
d1db91c6 3694 HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)))));
bdd68bc3 3695 }
87a1ef3d
SP
3696 SvLEN_set(dstr, len);
3697 SvCUR_set(dstr, cur);
765f542d
NC
3698 SvREADONLY_on(dstr);
3699 SvFAKE_on(dstr);
3700 /* Relesase a global SV mutex. */
3701 }
3702 else
765f542d 3703 { /* Passes the swipe test. */
78d1e721 3704 SvPV_set(dstr, SvPVX_mutable(sstr));
765f542d
NC
3705 SvLEN_set(dstr, SvLEN(sstr));
3706 SvCUR_set(dstr, SvCUR(sstr));
3707
3708 SvTEMP_off(dstr);
3709 (void)SvOK_off(sstr); /* NOTE: nukes most SvFLAGS on sstr */
6136c704 3710 SvPV_set(sstr, NULL);
765f542d
NC
3711 SvLEN_set(sstr, 0);
3712 SvCUR_set(sstr, 0);
3713 SvTEMP_off(sstr);
3714 }
3715 }
8990e307 3716 if (sflags & SVp_NOK) {
9d6ce603 3717 SvNV_set(dstr, SvNVX(sstr));
79072805 3718 }
8990e307 3719 if (sflags & SVp_IOK) {
88555484 3720 SvOOK_off(dstr);
23525414
NC
3721 SvIV_set(dstr, SvIVX(sstr));
3722 /* Must do this otherwise some other overloaded use of 0x80000000
3723 gets confused. I guess SVpbm_VALID */
2b1c7e3e 3724 if (sflags & SVf_IVisUV)
25da4f38 3725 SvIsUV_on(dstr);
79072805 3726 }
96d4b0ee 3727 SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_NOK|SVp_NOK|SVf_UTF8);
4f2da183 3728 {
b0a11fe1 3729 const MAGIC * const smg = SvVSTRING_mg(sstr);
4f2da183
NC
3730 if (smg) {
3731 sv_magic(dstr, NULL, PERL_MAGIC_vstring,
3732 smg->mg_ptr, smg->mg_len);
3733 SvRMAGICAL_on(dstr);
3734 }
7a5fa8a2 3735 }
79072805 3736 }
5d581361 3737 else if (sflags & (SVp_IOK|SVp_NOK)) {
c2468cc7 3738 (void)SvOK_off(dstr);
96d4b0ee 3739 SvFLAGS(dstr) |= sflags & (SVf_IOK|SVp_IOK|SVf_IVisUV|SVf_NOK|SVp_NOK);
5d581361
NC
3740 if (sflags & SVp_IOK) {
3741 /* XXXX Do we want to set IsUV for IV(ROK)? Be extra safe... */
3742 SvIV_set(dstr, SvIVX(sstr));
3743 }
3332b3c1 3744 if (sflags & SVp_NOK) {
9d6ce603 3745 SvNV_set(dstr, SvNVX(sstr));
3332b3c1
JH
3746 }
3747 }
79072805 3748 else {
f7877b28 3749 if (isGV_with_GP(sstr)) {
180488f8
NC
3750 /* This stringification rule for globs is spread in 3 places.
3751 This feels bad. FIXME. */
3752 const U32 wasfake = sflags & SVf_FAKE;
3753
3754 /* FAKE globs can get coerced, so need to turn this off
3755 temporarily if it is on. */
3756 SvFAKE_off(sstr);
3757 gv_efullname3(dstr, (GV *)sstr, "*");
3758 SvFLAGS(sstr) |= wasfake;
3759 }
20408e3c
GS
3760 else
3761 (void)SvOK_off(dstr);
a0d0e21e 3762 }
27c9684d
AP
3763 if (SvTAINTED(sstr))
3764 SvTAINT(dstr);
79072805
LW
3765}
3766
954c1994
GS
3767/*
3768=for apidoc sv_setsv_mg
3769
3770Like C<sv_setsv>, but also handles 'set' magic.
3771
3772=cut
3773*/
3774
79072805 3775void
864dbfa3 3776Perl_sv_setsv_mg(pTHX_ SV *dstr, register SV *sstr)
ef50df4b
GS
3777{
3778 sv_setsv(dstr,sstr);
3779 SvSETMAGIC(dstr);
3780}
3781
f8c7b90f 3782#ifdef PERL_OLD_COPY_ON_WRITE
ed252734
NC
3783SV *
3784Perl_sv_setsv_cow(pTHX_ SV *dstr, SV *sstr)
3785{
3786 STRLEN cur = SvCUR(sstr);
3787 STRLEN len = SvLEN(sstr);
3788 register char *new_pv;
3789
3790 if (DEBUG_C_TEST) {
3791 PerlIO_printf(Perl_debug_log, "Fast copy on write: %p -> %p\n",
6c9570dc 3792 (void*)sstr, (void*)dstr);
ed252734
NC
3793 sv_dump(sstr);
3794 if (dstr)
3795 sv_dump(dstr);
3796 }
3797
3798 if (dstr) {
3799 if (SvTHINKFIRST(dstr))
3800 sv_force_normal_flags(dstr, SV_COW_DROP_PV);
3f7c398e
SP
3801 else if (SvPVX_const(dstr))
3802 Safefree(SvPVX_const(dstr));
ed252734
NC
3803 }
3804 else
3805 new_SV(dstr);
862a34c6 3806 SvUPGRADE(dstr, SVt_PVIV);
ed252734
NC
3807
3808 assert (SvPOK(sstr));
3809 assert (SvPOKp(sstr));
3810 assert (!SvIOK(sstr));
3811 assert (!SvIOKp(sstr));
3812 assert (!SvNOK(sstr));
3813 assert (!SvNOKp(sstr));
3814
3815 if (SvIsCOW(sstr)) {
3816
3817 if (SvLEN(sstr) == 0) {
3818 /* source is a COW shared hash key. */
ed252734
NC
3819 DEBUG_C(PerlIO_printf(Perl_debug_log,
3820 "Fast copy on write: Sharing hash\n"));
d1db91c6 3821 new_pv = HEK_KEY(share_hek_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr))));
ed252734
NC
3822 goto common_exit;
3823 }
3824 SV_COW_NEXT_SV_SET(dstr, SV_COW_NEXT_SV(sstr));
3825 } else {
3826 assert ((SvFLAGS(sstr) & CAN_COW_MASK) == CAN_COW_FLAGS);
862a34c6 3827 SvUPGRADE(sstr, SVt_PVIV);
ed252734
NC
3828 SvREADONLY_on(sstr);
3829 SvFAKE_on(sstr);
3830 DEBUG_C(PerlIO_printf(Perl_debug_log,
3831 "Fast copy on write: Converting sstr to COW\n"));
3832 SV_COW_NEXT_SV_SET(dstr, sstr);
3833 }
3834 SV_COW_NEXT_SV_SET(sstr, dstr);
940132f3 3835 new_pv = SvPVX_mutable(sstr);
ed252734
NC
3836
3837 common_exit:
3838 SvPV_set(dstr, new_pv);
3839 SvFLAGS(dstr) = (SVt_PVIV|SVf_POK|SVp_POK|SVf_FAKE|SVf_READONLY);
3840 if (SvUTF8(sstr))
3841 SvUTF8_on(dstr);
87a1ef3d
SP
3842 SvLEN_set(dstr, len);
3843 SvCUR_set(dstr, cur);
ed252734
NC
3844 if (DEBUG_C_TEST) {
3845 sv_dump(dstr);
3846 }
3847 return dstr;
3848}
3849#endif
3850
954c1994
GS
3851/*
3852=for apidoc sv_setpvn
3853
3854Copies a string into an SV. The C<len> parameter indicates the number of
9e09f5f2
MHM
3855bytes to be copied. If the C<ptr> argument is NULL the SV will become
3856undefined. Does not handle 'set' magic. See C<sv_setpvn_mg>.
954c1994
GS
3857
3858=cut
3859*/
3860
ef50df4b 3861void
864dbfa3 3862Perl_sv_setpvn(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
79072805 3863{
97aff369 3864 dVAR;
c6f8c383 3865 register char *dptr;
22c522df 3866
765f542d 3867 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 3868 if (!ptr) {
a0d0e21e 3869 (void)SvOK_off(sv);
463ee0b2
LW
3870 return;
3871 }
22c522df
JH
3872 else {
3873 /* len is STRLEN which is unsigned, need to copy to signed */
a3b680e6 3874 const IV iv = len;
9c5ffd7c
JH
3875 if (iv < 0)
3876 Perl_croak(aTHX_ "panic: sv_setpvn called with negative strlen");
22c522df 3877 }
862a34c6 3878 SvUPGRADE(sv, SVt_PV);
c6f8c383 3879
5902b6a9 3880 dptr = SvGROW(sv, len + 1);
c6f8c383
GA
3881 Move(ptr,dptr,len,char);
3882 dptr[len] = '\0';
79072805 3883 SvCUR_set(sv, len);
1aa99e6b 3884 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 3885 SvTAINT(sv);
79072805
LW
3886}
3887
954c1994
GS
3888/*
3889=for apidoc sv_setpvn_mg
3890
3891Like C<sv_setpvn>, but also handles 'set' magic.
3892
3893=cut
3894*/
3895
79072805 3896void
864dbfa3 3897Perl_sv_setpvn_mg(pTHX_ register SV *sv, register const char *ptr, register STRLEN len)
ef50df4b
GS
3898{
3899 sv_setpvn(sv,ptr,len);
3900 SvSETMAGIC(sv);
3901}
3902
954c1994
GS
3903/*
3904=for apidoc sv_setpv
3905
3906Copies a string into an SV. The string must be null-terminated. Does not
3907handle 'set' magic. See C<sv_setpv_mg>.
3908
3909=cut
3910*/
3911
ef50df4b 3912void
864dbfa3 3913Perl_sv_setpv(pTHX_ register SV *sv, register const char *ptr)
79072805 3914{
97aff369 3915 dVAR;
79072805
LW
3916 register STRLEN len;
3917
765f542d 3918 SV_CHECK_THINKFIRST_COW_DROP(sv);
463ee0b2 3919 if (!ptr) {
a0d0e21e 3920 (void)SvOK_off(sv);
463ee0b2
LW
3921 return;
3922 }
79072805 3923 len = strlen(ptr);
862a34c6 3924 SvUPGRADE(sv, SVt_PV);
c6f8c383 3925
79072805 3926 SvGROW(sv, len + 1);
463ee0b2 3927 Move(ptr,SvPVX(sv),len+1,char);
79072805 3928 SvCUR_set(sv, len);
1aa99e6b 3929 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2
LW
3930 SvTAINT(sv);
3931}
3932
954c1994
GS
3933/*
3934=for apidoc sv_setpv_mg
3935
3936Like C<sv_setpv>, but also handles 'set' magic.
3937
3938=cut
3939*/
3940
463ee0b2 3941void
864dbfa3 3942Perl_sv_setpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b
GS
3943{
3944 sv_setpv(sv,ptr);
3945 SvSETMAGIC(sv);
3946}
3947
954c1994 3948/*
47518d95 3949=for apidoc sv_usepvn_flags
954c1994 3950
794a0d33
JH
3951Tells an SV to use C<ptr> to find its string value. Normally the
3952string is stored inside the SV but sv_usepvn allows the SV to use an
3953outside string. The C<ptr> should point to memory that was allocated
c1c21316
NC
3954by C<malloc>. The string length, C<len>, must be supplied. By default
3955this function will realloc (i.e. move) the memory pointed to by C<ptr>,
794a0d33
JH
3956so that pointer should not be freed or used by the programmer after
3957giving it to sv_usepvn, and neither should any pointers from "behind"
c1c21316
NC
3958that pointer (e.g. ptr + 1) be used.
3959
3960If C<flags> & SV_SMAGIC is true, will call SvSETMAGIC. If C<flags> &
3961SV_HAS_TRAILING_NUL is true, then C<ptr[len]> must be NUL, and the realloc
cbf82dd0 3962will be skipped. (i.e. the buffer is actually at least 1 byte longer than
c1c21316 3963C<len>, and already meets the requirements for storing in C<SvPVX>)
954c1994
GS
3964
3965=cut
3966*/
3967
ef50df4b 3968void
47518d95 3969Perl_sv_usepvn_flags(pTHX_ SV *sv, char *ptr, STRLEN len, U32 flags)
463ee0b2 3970{
97aff369 3971 dVAR;
1936d2a7 3972 STRLEN allocate;
765f542d 3973 SV_CHECK_THINKFIRST_COW_DROP(sv);
862a34c6 3974 SvUPGRADE(sv, SVt_PV);
463ee0b2 3975 if (!ptr) {
a0d0e21e 3976 (void)SvOK_off(sv);
47518d95
NC
3977 if (flags & SV_SMAGIC)
3978 SvSETMAGIC(sv);
463ee0b2
LW
3979 return;
3980 }
3f7c398e 3981 if (SvPVX_const(sv))
8bd4d4c5 3982 SvPV_free(sv);
1936d2a7 3983
0b7042f9 3984#ifdef DEBUGGING
2e90b4cd
NC
3985 if (flags & SV_HAS_TRAILING_NUL)
3986 assert(ptr[len] == '\0');
0b7042f9 3987#endif
2e90b4cd 3988
c1c21316 3989 allocate = (flags & SV_HAS_TRAILING_NUL)
8f01dc65 3990 ? len + 1: PERL_STRLEN_ROUNDUP(len + 1);
cbf82dd0
NC
3991 if (flags & SV_HAS_TRAILING_NUL) {
3992 /* It's long enough - do nothing.
3993 Specfically Perl_newCONSTSUB is relying on this. */
3994 } else {
69d25b4f 3995#ifdef DEBUGGING
69d25b4f 3996 /* Force a move to shake out bugs in callers. */
10edeb5d 3997 char *new_ptr = (char*)safemalloc(allocate);
69d25b4f
NC
3998 Copy(ptr, new_ptr, len, char);
3999 PoisonFree(ptr,len,char);
4000 Safefree(ptr);
4001 ptr = new_ptr;
69d25b4f 4002#else
10edeb5d 4003 ptr = (char*) saferealloc (ptr, allocate);
69d25b4f 4004#endif
cbf82dd0 4005 }
f880fe2f 4006 SvPV_set(sv, ptr);
463ee0b2 4007 SvCUR_set(sv, len);
1936d2a7 4008 SvLEN_set(sv, allocate);
c1c21316 4009 if (!(flags & SV_HAS_TRAILING_NUL)) {
97a130b8 4010 ptr[len] = '\0';
c1c21316 4011 }
1aa99e6b 4012 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4013 SvTAINT(sv);
47518d95
NC
4014 if (flags & SV_SMAGIC)
4015 SvSETMAGIC(sv);
ef50df4b
GS
4016}
4017
f8c7b90f 4018#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
4019/* Need to do this *after* making the SV normal, as we need the buffer
4020 pointer to remain valid until after we've copied it. If we let go too early,
4021 another thread could invalidate it by unsharing last of the same hash key
4022 (which it can do by means other than releasing copy-on-write Svs)
4023 or by changing the other copy-on-write SVs in the loop. */
4024STATIC void
5302ffd4 4025S_sv_release_COW(pTHX_ register SV *sv, const char *pvx, SV *after)
765f542d 4026{
5302ffd4 4027 { /* this SV was SvIsCOW_normal(sv) */
765f542d 4028 /* we need to find the SV pointing to us. */
cf5629ad 4029 SV *current = SV_COW_NEXT_SV(after);
7a5fa8a2 4030
765f542d
NC
4031 if (current == sv) {
4032 /* The SV we point to points back to us (there were only two of us
4033 in the loop.)
4034 Hence other SV is no longer copy on write either. */
4035 SvFAKE_off(after);
4036 SvREADONLY_off(after);
4037 } else {
4038 /* We need to follow the pointers around the loop. */
4039 SV *next;
4040 while ((next = SV_COW_NEXT_SV(current)) != sv) {
4041 assert (next);
4042 current = next;
4043 /* don't loop forever if the structure is bust, and we have
4044 a pointer into a closed loop. */
4045 assert (current != after);
3f7c398e 4046 assert (SvPVX_const(current) == pvx);
765f542d
NC
4047 }
4048 /* Make the SV before us point to the SV after us. */
a29f6d03 4049 SV_COW_NEXT_SV_SET(current, after);
765f542d 4050 }
765f542d
NC
4051 }
4052}
765f542d 4053#endif
645c22ef
DM
4054/*
4055=for apidoc sv_force_normal_flags
4056
4057Undo various types of fakery on an SV: if the PV is a shared string, make
4058a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
765f542d
NC
4059an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
4060we do the copy, and is also used locally. If C<SV_COW_DROP_PV> is set
4061then a copy-on-write scalar drops its PV buffer (if any) and becomes
4062SvPOK_off rather than making a copy. (Used where this scalar is about to be
d3050d9d 4063set to some other value.) In addition, the C<flags> parameter gets passed to
765f542d
NC
4064C<sv_unref_flags()> when unrefing. C<sv_force_normal> calls this function
4065with flags set to 0.
645c22ef
DM
4066
4067=cut
4068*/
4069
6fc92669 4070void
840a7b70 4071Perl_sv_force_normal_flags(pTHX_ register SV *sv, U32 flags)
0f15f207 4072{
97aff369 4073 dVAR;
f8c7b90f 4074#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
4075 if (SvREADONLY(sv)) {
4076 /* At this point I believe I should acquire a global SV mutex. */
4077 if (SvFAKE(sv)) {
b64e5050 4078 const char * const pvx = SvPVX_const(sv);
a28509cc
AL
4079 const STRLEN len = SvLEN(sv);
4080 const STRLEN cur = SvCUR(sv);
5302ffd4
NC
4081 /* next COW sv in the loop. If len is 0 then this is a shared-hash
4082 key scalar, so we mustn't attempt to call SV_COW_NEXT_SV(), as
4083 we'll fail an assertion. */
4084 SV * const next = len ? SV_COW_NEXT_SV(sv) : 0;
4085
46187eeb
NC
4086 if (DEBUG_C_TEST) {
4087 PerlIO_printf(Perl_debug_log,
4088 "Copy on write: Force normal %ld\n",
4089 (long) flags);
e419cbc5 4090 sv_dump(sv);
46187eeb 4091 }
765f542d
NC
4092 SvFAKE_off(sv);
4093 SvREADONLY_off(sv);
9f653bb5 4094 /* This SV doesn't own the buffer, so need to Newx() a new one: */
6136c704 4095 SvPV_set(sv, NULL);
87a1ef3d 4096 SvLEN_set(sv, 0);
765f542d
NC
4097 if (flags & SV_COW_DROP_PV) {
4098 /* OK, so we don't need to copy our buffer. */
4099 SvPOK_off(sv);
4100 } else {
4101 SvGROW(sv, cur + 1);
4102 Move(pvx,SvPVX(sv),cur,char);
87a1ef3d 4103 SvCUR_set(sv, cur);
765f542d
NC
4104 *SvEND(sv) = '\0';
4105 }
5302ffd4
NC
4106 if (len) {
4107 sv_release_COW(sv, pvx, next);
4108 } else {
4109 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
4110 }
46187eeb 4111 if (DEBUG_C_TEST) {
e419cbc5 4112 sv_dump(sv);
46187eeb 4113 }
765f542d 4114 }
923e4eb5 4115 else if (IN_PERL_RUNTIME)
765f542d
NC
4116 Perl_croak(aTHX_ PL_no_modify);
4117 /* At this point I believe that I can drop the global SV mutex. */
4118 }
4119#else
2213622d 4120 if (SvREADONLY(sv)) {
1c846c1f 4121 if (SvFAKE(sv)) {
b64e5050 4122 const char * const pvx = SvPVX_const(sv);
66a1b24b 4123 const STRLEN len = SvCUR(sv);
10bcdfd6
NC
4124 SvFAKE_off(sv);
4125 SvREADONLY_off(sv);
bd61b366 4126 SvPV_set(sv, NULL);
66a1b24b 4127 SvLEN_set(sv, 0);
1c846c1f 4128 SvGROW(sv, len + 1);
706aa1c9 4129 Move(pvx,SvPVX(sv),len,char);
1c846c1f 4130 *SvEND(sv) = '\0';
bdd68bc3 4131 unshare_hek(SvSHARED_HEK_FROM_PV(pvx));
1c846c1f 4132 }
923e4eb5 4133 else if (IN_PERL_RUNTIME)
cea2e8a9 4134 Perl_croak(aTHX_ PL_no_modify);
0f15f207 4135 }
765f542d 4136#endif
2213622d 4137 if (SvROK(sv))
840a7b70 4138 sv_unref_flags(sv, flags);
6fc92669
GS
4139 else if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
4140 sv_unglob(sv);
0f15f207 4141}
1c846c1f 4142
645c22ef 4143/*
954c1994
GS
4144=for apidoc sv_chop
4145
1c846c1f 4146Efficient removal of characters from the beginning of the string buffer.
954c1994
GS
4147SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
4148the string buffer. The C<ptr> becomes the first character of the adjusted
645c22ef 4149string. Uses the "OOK hack".
3f7c398e 4150Beware: after this function returns, C<ptr> and SvPVX_const(sv) may no longer
31869a79 4151refer to the same chunk of data.
954c1994
GS
4152
4153=cut
4154*/
4155
79072805 4156void
f54cb97a 4157Perl_sv_chop(pTHX_ register SV *sv, register const char *ptr)
79072805
LW
4158{
4159 register STRLEN delta;
a0d0e21e 4160 if (!ptr || !SvPOKp(sv))
79072805 4161 return;
3f7c398e 4162 delta = ptr - SvPVX_const(sv);
2213622d 4163 SV_CHECK_THINKFIRST(sv);
79072805
LW
4164 if (SvTYPE(sv) < SVt_PVIV)
4165 sv_upgrade(sv,SVt_PVIV);
4166
4167 if (!SvOOK(sv)) {
50483b2c 4168 if (!SvLEN(sv)) { /* make copy of shared string */
3f7c398e 4169 const char *pvx = SvPVX_const(sv);
a28509cc 4170 const STRLEN len = SvCUR(sv);
50483b2c 4171 SvGROW(sv, len + 1);
706aa1c9 4172 Move(pvx,SvPVX(sv),len,char);
50483b2c
JD
4173 *SvEND(sv) = '\0';
4174 }
45977657 4175 SvIV_set(sv, 0);
a4bfb290
AB
4176 /* Same SvOOK_on but SvOOK_on does a SvIOK_off
4177 and we do that anyway inside the SvNIOK_off
4178 */
7a5fa8a2 4179 SvFLAGS(sv) |= SVf_OOK;
79072805 4180 }
a4bfb290 4181 SvNIOK_off(sv);
b162af07
SP
4182 SvLEN_set(sv, SvLEN(sv) - delta);
4183 SvCUR_set(sv, SvCUR(sv) - delta);
f880fe2f 4184 SvPV_set(sv, SvPVX(sv) + delta);
45977657 4185 SvIV_set(sv, SvIVX(sv) + delta);
79072805
LW
4186}
4187
954c1994
GS
4188/*
4189=for apidoc sv_catpvn
4190
4191Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
4192C<len> indicates number of bytes to copy. If the SV has the UTF-8
4193status set, then the bytes appended should be valid UTF-8.
d5ce4a7c 4194Handles 'get' magic, but not 'set' magic. See C<sv_catpvn_mg>.
954c1994 4195
8d6d96c1
HS
4196=for apidoc sv_catpvn_flags
4197
4198Concatenates the string onto the end of the string which is in the SV. The
1e54db1a
JH
4199C<len> indicates number of bytes to copy. If the SV has the UTF-8
4200status set, then the bytes appended should be valid UTF-8.
8d6d96c1
HS
4201If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
4202appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
4203in terms of this function.
4204
4205=cut
4206*/
4207
4208void
4209Perl_sv_catpvn_flags(pTHX_ register SV *dsv, register const char *sstr, register STRLEN slen, I32 flags)
4210{
97aff369 4211 dVAR;
8d6d96c1 4212 STRLEN dlen;
fabdb6c0 4213 const char * const dstr = SvPV_force_flags(dsv, dlen, flags);
8d6d96c1 4214
8d6d96c1
HS
4215 SvGROW(dsv, dlen + slen + 1);
4216 if (sstr == dstr)
3f7c398e 4217 sstr = SvPVX_const(dsv);
8d6d96c1 4218 Move(sstr, SvPVX(dsv) + dlen, slen, char);
b162af07 4219 SvCUR_set(dsv, SvCUR(dsv) + slen);
8d6d96c1
HS
4220 *SvEND(dsv) = '\0';
4221 (void)SvPOK_only_UTF8(dsv); /* validate pointer */
4222 SvTAINT(dsv);
bddd5118
NC
4223 if (flags & SV_SMAGIC)
4224 SvSETMAGIC(dsv);
79072805
LW
4225}
4226
954c1994 4227/*
954c1994
GS
4228=for apidoc sv_catsv
4229
13e8c8e3
JH
4230Concatenates the string from SV C<ssv> onto the end of the string in
4231SV C<dsv>. Modifies C<dsv> but not C<ssv>. Handles 'get' magic, but
4232not 'set' magic. See C<sv_catsv_mg>.
954c1994 4233
8d6d96c1
HS
4234=for apidoc sv_catsv_flags
4235
4236Concatenates the string from SV C<ssv> onto the end of the string in
4237SV C<dsv>. Modifies C<dsv> but not C<ssv>. If C<flags> has C<SV_GMAGIC>
4238bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
4239and C<sv_catsv_nomg> are implemented in terms of this function.
4240
4241=cut */
4242
ef50df4b 4243void
8d6d96c1 4244Perl_sv_catsv_flags(pTHX_ SV *dsv, register SV *ssv, I32 flags)
79072805 4245{
97aff369 4246 dVAR;
bddd5118 4247 if (ssv) {
00b6aa41
AL
4248 STRLEN slen;
4249 const char *spv = SvPV_const(ssv, slen);
4250 if (spv) {
bddd5118
NC
4251 /* sutf8 and dutf8 were type bool, but under USE_ITHREADS,
4252 gcc version 2.95.2 20000220 (Debian GNU/Linux) for
4253 Linux xxx 2.2.17 on sparc64 with gcc -O2, we erroneously
4254 get dutf8 = 0x20000000, (i.e. SVf_UTF8) even though
4255 dsv->sv_flags doesn't have that bit set.
4fd84b44 4256 Andy Dougherty 12 Oct 2001
bddd5118
NC
4257 */
4258 const I32 sutf8 = DO_UTF8(ssv);
4259 I32 dutf8;
13e8c8e3 4260
bddd5118
NC
4261 if (SvGMAGICAL(dsv) && (flags & SV_GMAGIC))
4262 mg_get(dsv);
4263 dutf8 = DO_UTF8(dsv);
8d6d96c1 4264
bddd5118
NC
4265 if (dutf8 != sutf8) {
4266 if (dutf8) {
4267 /* Not modifying source SV, so taking a temporary copy. */
00b6aa41 4268 SV* const csv = sv_2mortal(newSVpvn(spv, slen));
13e8c8e3 4269
bddd5118
NC
4270 sv_utf8_upgrade(csv);
4271 spv = SvPV_const(csv, slen);
4272 }
4273 else
4274 sv_utf8_upgrade_nomg(dsv);
13e8c8e3 4275 }
bddd5118 4276 sv_catpvn_nomg(dsv, spv, slen);
e84ff256 4277 }
560a288e 4278 }
bddd5118
NC
4279 if (flags & SV_SMAGIC)
4280 SvSETMAGIC(dsv);
79072805
LW
4281}
4282
954c1994 4283/*
954c1994
GS
4284=for apidoc sv_catpv
4285
4286Concatenates the string onto the end of the string which is in the SV.
1e54db1a
JH
4287If the SV has the UTF-8 status set, then the bytes appended should be
4288valid UTF-8. Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
954c1994 4289
d5ce4a7c 4290=cut */
954c1994 4291
ef50df4b 4292void
0c981600 4293Perl_sv_catpv(pTHX_ register SV *sv, register const char *ptr)
79072805 4294{
97aff369 4295 dVAR;
79072805 4296 register STRLEN len;
463ee0b2 4297 STRLEN tlen;
748a9306 4298 char *junk;
79072805 4299
0c981600 4300 if (!ptr)
79072805 4301 return;
748a9306 4302 junk = SvPV_force(sv, tlen);
0c981600 4303 len = strlen(ptr);
463ee0b2 4304 SvGROW(sv, tlen + len + 1);
0c981600 4305 if (ptr == junk)
3f7c398e 4306 ptr = SvPVX_const(sv);
0c981600 4307 Move(ptr,SvPVX(sv)+tlen,len+1,char);
b162af07 4308 SvCUR_set(sv, SvCUR(sv) + len);
d41ff1b8 4309 (void)SvPOK_only_UTF8(sv); /* validate pointer */
463ee0b2 4310 SvTAINT(sv);
79072805
LW
4311}
4312
954c1994
GS
4313/*
4314=for apidoc sv_catpv_mg
4315
4316Like C<sv_catpv>, but also handles 'set' magic.
4317
4318=cut
4319*/
4320
ef50df4b 4321void
0c981600 4322Perl_sv_catpv_mg(pTHX_ register SV *sv, register const char *ptr)
ef50df4b 4323{
0c981600 4324 sv_catpv(sv,ptr);
ef50df4b
GS
4325 SvSETMAGIC(sv);
4326}
4327
645c22ef
DM
4328/*
4329=for apidoc newSV
4330
561b68a9
SH
4331Creates a new SV. A non-zero C<len> parameter indicates the number of
4332bytes of preallocated string space the SV should have. An extra byte for a
4333trailing NUL is also reserved. (SvPOK is not set for the SV even if string
4334space is allocated.) The reference count for the new SV is set to 1.
4335
4336In 5.9.3, newSV() replaces the older NEWSV() API, and drops the first
4337parameter, I<x>, a debug aid which allowed callers to identify themselves.
4338This aid has been superseded by a new build option, PERL_MEM_LOG (see
4339L<perlhack/PERL_MEM_LOG>). The older API is still there for use in XS
4340modules supporting older perls.
645c22ef
DM
4341
4342=cut
4343*/
4344
79072805 4345SV *
864dbfa3 4346Perl_newSV(pTHX_ STRLEN len)
79072805 4347{
97aff369 4348 dVAR;
79072805 4349 register SV *sv;
1c846c1f 4350
4561caa4 4351 new_SV(sv);
79072805
LW
4352 if (len) {
4353 sv_upgrade(sv, SVt_PV);
4354 SvGROW(sv, len + 1);
4355 }
4356 return sv;
4357}
954c1994 4358/*
92110913 4359=for apidoc sv_magicext
954c1994 4360
68795e93 4361Adds magic to an SV, upgrading it if necessary. Applies the
2d8d5d5a 4362supplied vtable and returns a pointer to the magic added.
92110913 4363
2d8d5d5a
SH
4364Note that C<sv_magicext> will allow things that C<sv_magic> will not.
4365In particular, you can add magic to SvREADONLY SVs, and add more than
4366one instance of the same 'how'.
645c22ef 4367
2d8d5d5a
SH
4368If C<namlen> is greater than zero then a C<savepvn> I<copy> of C<name> is
4369stored, if C<namlen> is zero then C<name> is stored as-is and - as another
4370special case - if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
4371to contain an C<SV*> and is stored as-is with its REFCNT incremented.
92110913 4372
2d8d5d5a 4373(This is now used as a subroutine by C<sv_magic>.)
954c1994
GS
4374
4375=cut
4376*/
92110913 4377MAGIC *
53d44271 4378Perl_sv_magicext(pTHX_ SV* sv, SV* obj, int how, const MGVTBL *vtable,
92110913 4379 const char* name, I32 namlen)
79072805 4380{
97aff369 4381 dVAR;
79072805 4382 MAGIC* mg;
68795e93 4383
7a7f3e45 4384 SvUPGRADE(sv, SVt_PVMG);
a02a5408 4385 Newxz(mg, 1, MAGIC);
79072805 4386 mg->mg_moremagic = SvMAGIC(sv);
b162af07 4387 SvMAGIC_set(sv, mg);
75f9d97a 4388
05f95b08
SB
4389 /* Sometimes a magic contains a reference loop, where the sv and
4390 object refer to each other. To prevent a reference loop that
4391 would prevent such objects being freed, we look for such loops
4392 and if we find one we avoid incrementing the object refcount.
87f0b213
JH
4393
4394 Note we cannot do this to avoid self-tie loops as intervening RV must
b5ccf5f2 4395 have its REFCNT incremented to keep it in existence.
87f0b213
JH
4396
4397 */
14befaf4
DM
4398 if (!obj || obj == sv ||
4399 how == PERL_MAGIC_arylen ||
4400 how == PERL_MAGIC_qr ||
8d2f4536 4401 how == PERL_MAGIC_symtab ||
75f9d97a
JH
4402 (SvTYPE(obj) == SVt_PVGV &&
4403 (GvSV(obj) == sv || GvHV(obj) == (HV*)sv || GvAV(obj) == (AV*)sv ||
4404 GvCV(obj) == (CV*)sv || GvIOp(obj) == (IO*)sv ||
2628be26 4405 GvFORM(obj) == (CV*)sv)))
75f9d97a 4406 {
8990e307 4407 mg->mg_obj = obj;
75f9d97a 4408 }
85e6fe83 4409 else {
b37c2d43 4410 mg->mg_obj = SvREFCNT_inc_simple(obj);
85e6fe83
LW
4411 mg->mg_flags |= MGf_REFCOUNTED;
4412 }
b5ccf5f2
YST
4413
4414 /* Normal self-ties simply pass a null object, and instead of
4415 using mg_obj directly, use the SvTIED_obj macro to produce a
4416 new RV as needed. For glob "self-ties", we are tieing the PVIO
4417 with an RV obj pointing to the glob containing the PVIO. In
4418 this case, to avoid a reference loop, we need to weaken the
4419 reference.
4420 */
4421
4422 if (how == PERL_MAGIC_tiedscalar && SvTYPE(sv) == SVt_PVIO &&
4423 obj && SvROK(obj) && GvIO(SvRV(obj)) == (IO*)sv)
4424 {
4425 sv_rvweaken(obj);
4426 }
4427
79072805 4428 mg->mg_type = how;
565764a8 4429 mg->mg_len = namlen;
9cbac4c7 4430 if (name) {
92110913 4431 if (namlen > 0)
1edc1566 4432 mg->mg_ptr = savepvn(name, namlen);
c6ee37c5 4433 else if (namlen == HEf_SVKEY)
b37c2d43 4434 mg->mg_ptr = (char*)SvREFCNT_inc_simple_NN((SV*)name);
68795e93 4435 else
92110913 4436 mg->mg_ptr = (char *) name;
9cbac4c7 4437 }
53d44271 4438 mg->mg_virtual = (MGVTBL *) vtable;
68795e93 4439
92110913
NIS
4440 mg_magical(sv);
4441 if (SvGMAGICAL(sv))
4442 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
4443 return mg;
4444}
4445
4446/*
4447=for apidoc sv_magic
1c846c1f 4448
92110913
NIS
4449Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
4450then adds a new magic item of type C<how> to the head of the magic list.
4451
2d8d5d5a
SH
4452See C<sv_magicext> (which C<sv_magic> now calls) for a description of the
4453handling of the C<name> and C<namlen> arguments.
4454
4509d3fb
SB
4455You need to use C<sv_magicext> to add magic to SvREADONLY SVs and also
4456to add more than one instance of the same 'how'.
4457
92110913
NIS
4458=cut
4459*/
4460
4461void
4462Perl_sv_magic(pTHX_ register SV *sv, SV *obj, int how, const char *name, I32 namlen)
68795e93 4463{
97aff369 4464 dVAR;
53d44271 4465 const MGVTBL *vtable;
92110913 4466 MAGIC* mg;
92110913 4467
f8c7b90f 4468#ifdef PERL_OLD_COPY_ON_WRITE
765f542d
NC
4469 if (SvIsCOW(sv))
4470 sv_force_normal_flags(sv, 0);
4471#endif
92110913 4472 if (SvREADONLY(sv)) {
d8084ca5
DM
4473 if (
4474 /* its okay to attach magic to shared strings; the subsequent
4475 * upgrade to PVMG will unshare the string */
4476 !(SvFAKE(sv) && SvTYPE(sv) < SVt_PVMG)
4477
4478 && IN_PERL_RUNTIME
92110913
NIS
4479 && how != PERL_MAGIC_regex_global
4480 && how != PERL_MAGIC_bm
4481 && how != PERL_MAGIC_fm
4482 && how != PERL_MAGIC_sv
e6469971 4483 && how != PERL_MAGIC_backref
92110913
NIS
4484 )
4485 {
4486 Perl_croak(aTHX_ PL_no_modify);
4487 }
4488 }
4489 if (SvMAGICAL(sv) || (how == PERL_MAGIC_taint && SvTYPE(sv) >= SVt_PVMG)) {
4490 if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
68795e93
NIS
4491 /* sv_magic() refuses to add a magic of the same 'how' as an
4492 existing one
92110913 4493 */
2a509ed3 4494 if (how == PERL_MAGIC_taint) {
92110913 4495 mg->mg_len |= 1;
2a509ed3
NC
4496 /* Any scalar which already had taint magic on which someone
4497 (erroneously?) did SvIOK_on() or similar will now be
4498 incorrectly sporting public "OK" flags. */
4499 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
4500 }
92110913
NIS
4501 return;
4502 }
4503 }
68795e93 4504
79072805 4505 switch (how) {
14befaf4 4506 case PERL_MAGIC_sv:
92110913 4507 vtable = &PL_vtbl_sv;
79072805 4508 break;
14befaf4 4509 case PERL_MAGIC_overload:
92110913 4510 vtable = &PL_vtbl_amagic;
a0d0e21e 4511 break;
14befaf4 4512 case PERL_MAGIC_overload_elem:
92110913 4513 vtable = &PL_vtbl_amagicelem;
a0d0e21e 4514 break;
14befaf4 4515 case PERL_MAGIC_overload_table:
92110913 4516 vtable = &PL_vtbl_ovrld;
a0d0e21e 4517 break;
14befaf4 4518 case PERL_MAGIC_bm:
92110913 4519 vtable = &PL_vtbl_bm;
79072805 4520 break;
14befaf4 4521 case PERL_MAGIC_regdata:
92110913 4522 vtable = &PL_vtbl_regdata;
6cef1e77 4523 break;
14befaf4 4524 case PERL_MAGIC_regdatum:
92110913 4525 vtable = &PL_vtbl_regdatum;
6cef1e77 4526 break;
14befaf4 4527 case PERL_MAGIC_env:
92110913 4528 vtable = &PL_vtbl_env;
79072805 4529 break;
14befaf4 4530 case PERL_MAGIC_fm:
92110913 4531 vtable = &PL_vtbl_fm;
55497cff 4532 break;
14befaf4 4533 case PERL_MAGIC_envelem:
92110913 4534 vtable = &PL_vtbl_envelem;
79072805 4535 break;
14befaf4 4536 case PERL_MAGIC_regex_global:
92110913 4537 vtable = &PL_vtbl_mglob;
93a17b20 4538 break;
14befaf4 4539 case PERL_MAGIC_isa:
92110913 4540 vtable = &PL_vtbl_isa;
463ee0b2 4541 break;
14befaf4 4542 case PERL_MAGIC_isaelem:
92110913 4543 vtable = &PL_vtbl_isaelem;
463ee0b2 4544 break;
14befaf4 4545 case PERL_MAGIC_nkeys:
92110913 4546 vtable = &PL_vtbl_nkeys;
16660edb 4547 break;
14befaf4 4548 case PERL_MAGIC_dbfile:
aec46f14 4549 vtable = NULL;
93a17b20 4550 break;
14befaf4 4551 case PERL_MAGIC_dbline:
92110913 4552 vtable = &PL_vtbl_dbline;
79072805 4553 break;
36477c24 4554#ifdef USE_LOCALE_COLLATE
14befaf4 4555 case PERL_MAGIC_collxfrm:
92110913 4556 vtable = &PL_vtbl_collxfrm;
bbce6d69 4557 break;
36477c24 4558#endif /* USE_LOCALE_COLLATE */
14befaf4 4559 case PERL_MAGIC_tied:
92110913 4560 vtable = &PL_vtbl_pack;
463ee0b2 4561 break;
14befaf4
DM
4562 case PERL_MAGIC_tiedelem:
4563 case PERL_MAGIC_tiedscalar:
92110913 4564 vtable = &PL_vtbl_packelem;
463ee0b2 4565 break;
14befaf4 4566 case PERL_MAGIC_qr:
92110913 4567 vtable = &PL_vtbl_regexp;
c277df42 4568 break;
b3ca2e83
NC
4569 case PERL_MAGIC_hints:
4570 /* As this vtable is all NULL, we can reuse it. */
14befaf4 4571 case PERL_MAGIC_sig:
92110913 4572 vtable = &PL_vtbl_sig;
79072805 4573 break;
14befaf4 4574 case PERL_MAGIC_sigelem:
92110913 4575 vtable = &PL_vtbl_sigelem;
79072805 4576 break;
14befaf4 4577 case PERL_MAGIC_taint:
92110913 4578 vtable = &PL_vtbl_taint;
463ee0b2 4579 break;
14befaf4 4580 case PERL_MAGIC_uvar:
92110913 4581 vtable = &PL_vtbl_uvar;
79072805 4582 break;
14befaf4 4583 case PERL_MAGIC_vec:
92110913 4584 vtable = &PL_vtbl_vec;
79072805 4585 break;
a3874608 4586 case PERL_MAGIC_arylen_p:
bfcb3514 4587 case PERL_MAGIC_rhash:
8d2f4536 4588 case PERL_MAGIC_symtab:
ece467f9 4589 case PERL_MAGIC_vstring:
aec46f14 4590 vtable = NULL;
ece467f9 4591 break;
7e8c5dac
HS
4592 case PERL_MAGIC_utf8:
4593 vtable = &PL_vtbl_utf8;
4594 break;
14befaf4 4595 case PERL_MAGIC_substr:
92110913 4596 vtable = &PL_vtbl_substr;
79072805 4597 break;
14befaf4 4598 case PERL_MAGIC_defelem:
92110913 4599 vtable = &PL_vtbl_defelem;
5f05dabc 4600 break;
14befaf4 4601 case PERL_MAGIC_arylen:
92110913 4602 vtable = &PL_vtbl_arylen;
79072805 4603 break;
14befaf4 4604 case PERL_MAGIC_pos:
92110913 4605 vtable = &PL_vtbl_pos;
a0d0e21e 4606 break;
14befaf4 4607 case PERL_MAGIC_backref:
92110913 4608 vtable = &PL_vtbl_backref;
810b8aa5 4609 break;
b3ca2e83
NC
4610 case PERL_MAGIC_hintselem:
4611 vtable = &PL_vtbl_hintselem;
4612 break;
14befaf4
DM
4613 case PERL_MAGIC_ext:
4614 /* Reserved for use by extensions not perl internals. */
4633a7c4
LW
4615 /* Useful for attaching extension internal data to perl vars. */
4616 /* Note that multiple extensions may clash if magical scalars */
4617 /* etc holding private data from one are passed to another. */
aec46f14 4618 vtable = NULL;
a0d0e21e 4619 break;
79072805 4620 default:
14befaf4 4621 Perl_croak(aTHX_ "Don't know how to handle magic of type \\%o", how);
463ee0b2 4622 }
68795e93 4623
92110913 4624 /* Rest of work is done else where */
aec46f14 4625 mg = sv_magicext(sv,obj,how,vtable,name,namlen);
68795e93 4626
92110913
NIS
4627 switch (how) {
4628 case PERL_MAGIC_taint:
4629 mg->mg_len = 1;
4630 break;
4631 case PERL_MAGIC_ext:
4632 case PERL_MAGIC_dbfile:
4633 SvRMAGICAL_on(sv);
4634 break;
4635 }
463ee0b2
LW
4636}
4637
c461cf8f
JH
4638/*
4639=for apidoc sv_unmagic
4640
645c22ef 4641Removes all magic of type C<type> from an SV.
c461cf8f
JH
4642
4643=cut
4644*/
4645
463ee0b2 4646int
864dbfa3 4647Perl_sv_unmagic(pTHX_ SV *sv, int type)
463ee0b2
LW
4648{
4649 MAGIC* mg;
4650 MAGIC** mgp;
91bba347 4651 if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
463ee0b2 4652 return 0;
064cf529 4653 mgp = &(((XPVMG*) SvANY(sv))->xmg_u.xmg_magic);
463ee0b2
LW
4654 for (mg = *mgp; mg; mg = *mgp) {
4655 if (mg->mg_type == type) {
e1ec3a88 4656 const MGVTBL* const vtbl = mg->mg_virtual;
463ee0b2 4657 *mgp = mg->mg_moremagic;
1d7c1841 4658 if (vtbl && vtbl->svt_free)
fc0dc3b3 4659 CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
14befaf4 4660 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
92110913 4661 if (mg->mg_len > 0)
1edc1566 4662 Safefree(mg->mg_ptr);
565764a8 4663 else if (mg->mg_len == HEf_SVKEY)
1edc1566 4664 SvREFCNT_dec((SV*)mg->mg_ptr);
d2923cdd 4665 else if (mg->mg_type == PERL_MAGIC_utf8)
7e8c5dac 4666 Safefree(mg->mg_ptr);
9cbac4c7 4667 }
a0d0e21e
LW
4668 if (mg->mg_flags & MGf_REFCOUNTED)
4669 SvREFCNT_dec(mg->mg_obj);
463ee0b2
LW
4670 Safefree(mg);
4671 }
4672 else
4673 mgp = &mg->mg_moremagic;
79072805 4674 }
91bba347 4675 if (!SvMAGIC(sv)) {
463ee0b2 4676 SvMAGICAL_off(sv);
c268c2a6 4677 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
86f55936 4678 SvMAGIC_set(sv, NULL);
463ee0b2
LW
4679 }
4680
4681 return 0;
79072805
LW
4682}
4683
c461cf8f
JH
4684/*
4685=for apidoc sv_rvweaken
4686
645c22ef
DM
4687Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
4688referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
4689push a back-reference to this RV onto the array of backreferences
1e73acc8
AS
4690associated with that magic. If the RV is magical, set magic will be
4691called after the RV is cleared.
c461cf8f
JH
4692
4693=cut
4694*/
4695
810b8aa5 4696SV *
864dbfa3 4697Perl_sv_rvweaken(pTHX_ SV *sv)
810b8aa5
GS
4698{
4699 SV *tsv;
4700 if (!SvOK(sv)) /* let undefs pass */
4701 return sv;
4702 if (!SvROK(sv))
cea2e8a9 4703 Perl_croak(aTHX_ "Can't weaken a nonreference");
810b8aa5 4704 else if (SvWEAKREF(sv)) {
810b8aa5 4705 if (ckWARN(WARN_MISC))
9014280d 4706 Perl_warner(aTHX_ packWARN(WARN_MISC), "Reference is already weak");
810b8aa5
GS
4707 return sv;
4708 }
4709 tsv = SvRV(sv);
e15faf7d 4710 Perl_sv_add_backref(aTHX_ tsv, sv);
810b8aa5 4711 SvWEAKREF_on(sv);
1c846c1f 4712 SvREFCNT_dec(tsv);
810b8aa5
GS
4713 return sv;
4714}
4715
645c22ef
DM
4716/* Give tsv backref magic if it hasn't already got it, then push a
4717 * back-reference to sv onto the array associated with the backref magic.
4718 */
4719
e15faf7d
NC
4720void
4721Perl_sv_add_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5 4722{
97aff369 4723 dVAR;
810b8aa5 4724 AV *av;
86f55936
NC
4725
4726 if (SvTYPE(tsv) == SVt_PVHV) {
4727 AV **const avp = Perl_hv_backreferences_p(aTHX_ (HV*)tsv);
4728
4729 av = *avp;
4730 if (!av) {
4731 /* There is no AV in the offical place - try a fixup. */
4732 MAGIC *const mg = mg_find(tsv, PERL_MAGIC_backref);
4733
4734 if (mg) {
4735 /* Aha. They've got it stowed in magic. Bring it back. */
4736 av = (AV*)mg->mg_obj;
4737 /* Stop mg_free decreasing the refernce count. */
4738 mg->mg_obj = NULL;
4739 /* Stop mg_free even calling the destructor, given that
4740 there's no AV to free up. */
4741 mg->mg_virtual = 0;
4742 sv_unmagic(tsv, PERL_MAGIC_backref);
4743 } else {
4744 av = newAV();
4745 AvREAL_off(av);
b37c2d43 4746 SvREFCNT_inc_simple_void(av);
86f55936
NC
4747 }
4748 *avp = av;
4749 }
4750 } else {
4751 const MAGIC *const mg
4752 = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
4753 if (mg)
4754 av = (AV*)mg->mg_obj;
4755 else {
4756 av = newAV();
4757 AvREAL_off(av);
4758 sv_magic(tsv, (SV*)av, PERL_MAGIC_backref, NULL, 0);
4759 /* av now has a refcnt of 2, which avoids it getting freed
4760 * before us during global cleanup. The extra ref is removed
4761 * by magic_killbackrefs() when tsv is being freed */
4762 }
810b8aa5 4763 }
d91d49e8 4764 if (AvFILLp(av) >= AvMAX(av)) {
d91d49e8
MM
4765 av_extend(av, AvFILLp(av)+1);
4766 }
4767 AvARRAY(av)[++AvFILLp(av)] = sv; /* av_push() */
810b8aa5
GS
4768}
4769
645c22ef
DM
4770/* delete a back-reference to ourselves from the backref magic associated
4771 * with the SV we point to.
4772 */
4773
1c846c1f 4774STATIC void
e15faf7d 4775S_sv_del_backref(pTHX_ SV *tsv, SV *sv)
810b8aa5 4776{
97aff369 4777 dVAR;
86f55936 4778 AV *av = NULL;
810b8aa5
GS
4779 SV **svp;
4780 I32 i;
86f55936
NC
4781
4782 if (SvTYPE(tsv) == SVt_PVHV && SvOOK(tsv)) {
4783 av = *Perl_hv_backreferences_p(aTHX_ (HV*)tsv);
5b285ea4
NC
4784 /* We mustn't attempt to "fix up" the hash here by moving the
4785 backreference array back to the hv_aux structure, as that is stored
4786 in the main HvARRAY(), and hfreentries assumes that no-one
4787 reallocates HvARRAY() while it is running. */
86f55936
NC
4788 }
4789 if (!av) {
4790 const MAGIC *const mg
4791 = SvMAGICAL(tsv) ? mg_find(tsv, PERL_MAGIC_backref) : NULL;
4792 if (mg)
4793 av = (AV *)mg->mg_obj;
4794 }
4795 if (!av) {
e15faf7d
NC
4796 if (PL_in_clean_all)
4797 return;
cea2e8a9 4798 Perl_croak(aTHX_ "panic: del_backref");
86f55936
NC
4799 }
4800
4801 if (SvIS_FREED(av))
4802 return;
4803
810b8aa5 4804 svp = AvARRAY(av);
6a76db8b
NC
4805 /* We shouldn't be in here more than once, but for paranoia reasons lets
4806 not assume this. */
4807 for (i = AvFILLp(av); i >= 0; i--) {
4808 if (svp[i] == sv) {
4809 const SSize_t fill = AvFILLp(av);
4810 if (i != fill) {
4811 /* We weren't the last entry.
4812 An unordered list has this property that you can take the
4813 last element off the end to fill the hole, and it's still
4814 an unordered list :-)
4815 */
4816 svp[i] = svp[fill];
4817 }
a0714e2c 4818 svp[fill] = NULL;
6a76db8b
NC
4819 AvFILLp(av) = fill - 1;
4820 }
4821 }
810b8aa5
GS
4822}
4823
86f55936
NC
4824int
4825Perl_sv_kill_backrefs(pTHX_ SV *sv, AV *av)
4826{
4827 SV **svp = AvARRAY(av);
4828
4829 PERL_UNUSED_ARG(sv);
4830
4831 /* Not sure why the av can get freed ahead of its sv, but somehow it does
4832 in ext/B/t/bytecode.t test 15 (involving print <DATA>) */
4833 if (svp && !SvIS_FREED(av)) {
4834 SV *const *const last = svp + AvFILLp(av);
4835
4836 while (svp <= last) {
4837 if (*svp) {
4838 SV *const referrer = *svp;
4839 if (SvWEAKREF(referrer)) {
4840 /* XXX Should we check that it hasn't changed? */
4841 SvRV_set(referrer, 0);
4842 SvOK_off(referrer);
4843 SvWEAKREF_off(referrer);
1e73acc8 4844 SvSETMAGIC(referrer);
86f55936
NC
4845 } else if (SvTYPE(referrer) == SVt_PVGV ||
4846 SvTYPE(referrer) == SVt_PVLV) {
4847 /* You lookin' at me? */
4848 assert(GvSTASH(referrer));
4849 assert(GvSTASH(referrer) == (HV*)sv);
4850 GvSTASH(referrer) = 0;
4851 } else {
4852 Perl_croak(aTHX_
4853 "panic: magic_killbackrefs (flags=%"UVxf")",
4854 (UV)SvFLAGS(referrer));
4855 }
4856
a0714e2c 4857 *svp = NULL;
86f55936
NC
4858 }
4859 svp++;
4860 }
4861 }
4862 SvREFCNT_dec(av); /* remove extra count added by sv_add_backref() */
4863 return 0;
4864}
4865
954c1994
GS
4866/*
4867=for apidoc sv_insert
4868
4869Inserts a string at the specified offset/length within the SV. Similar to
4870the Perl substr() function.
4871
4872=cut
4873*/
4874
79072805 4875void
e1ec3a88 4876Perl_sv_insert(pTHX_ SV *bigstr, STRLEN offset, STRLEN len, const char *little, STRLEN littlelen)
79072805 4877{
97aff369 4878 dVAR;
79072805
LW
4879 register char *big;
4880 register char *mid;
4881 register char *midend;
4882 register char *bigend;
4883 register I32 i;
6ff81951 4884 STRLEN curlen;
1c846c1f 4885
79072805 4886
8990e307 4887 if (!bigstr)
cea2e8a9 4888 Perl_croak(aTHX_ "Can't modify non-existent substring");
6ff81951 4889 SvPV_force(bigstr, curlen);
60fa28ff 4890 (void)SvPOK_only_UTF8(bigstr);
6ff81951
GS
4891 if (offset + len > curlen) {
4892 SvGROW(bigstr, offset+len+1);
93524f2b 4893 Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
6ff81951
GS
4894 SvCUR_set(bigstr, offset+len);
4895 }
79072805 4896
69b47968 4897 SvTAINT(bigstr);
79072805
LW
4898 i = littlelen - len;
4899 if (i > 0) { /* string might grow */
a0d0e21e 4900 big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
79072805
LW
4901 mid = big + offset + len;
4902 midend = bigend = big + SvCUR(bigstr);
4903 bigend += i;
4904 *bigend = '\0';
4905 while (midend > mid) /* shove everything down */
4906 *--bigend = *--midend;
4907 Move(little,big+offset,littlelen,char);
b162af07 4908 SvCUR_set(bigstr, SvCUR(bigstr) + i);
79072805
LW
4909 SvSETMAGIC(bigstr);
4910 return;
4911 }
4912 else if (i == 0) {
463ee0b2 4913 Move(little,SvPVX(bigstr)+offset,len,char);
79072805
LW
4914 SvSETMAGIC(bigstr);
4915 return;
4916 }
4917
463ee0b2 4918 big = SvPVX(bigstr);
79072805
LW
4919 mid = big + offset;
4920 midend = mid + len;
4921 bigend = big + SvCUR(bigstr);
4922
4923 if (midend > bigend)
cea2e8a9 4924 Perl_croak(aTHX_ "panic: sv_insert");
79072805
LW
4925
4926 if (mid - big > bigend - midend) { /* faster to shorten from end */
4927 if (littlelen) {
4928 Move(little, mid, littlelen,char);
4929 mid += littlelen;
4930 }
4931 i = bigend - midend;
4932 if (i > 0) {
4933 Move(midend, mid, i,char);
4934 mid += i;
4935 }
4936 *mid = '\0';
4937 SvCUR_set(bigstr, mid - big);
4938 }
155aba94 4939 else if ((i = mid - big)) { /* faster from front */
79072805
LW
4940 midend -= littlelen;
4941 mid = midend;
4942 sv_chop(bigstr,midend-i);
4943 big += i;
4944 while (i--)
4945 *--midend = *--big;
4946 if (littlelen)
4947 Move(little, mid, littlelen,char);
4948 }
4949 else if (littlelen) {
4950 midend -= littlelen;
4951 sv_chop(bigstr,midend);
4952 Move(little,midend,littlelen,char);
4953 }
4954 else {
4955 sv_chop(bigstr,midend);
4956 }
4957 SvSETMAGIC(bigstr);
4958}
4959
c461cf8f
JH
4960/*
4961=for apidoc sv_replace
4962
4963Make the first argument a copy of the second, then delete the original.
645c22ef
DM
4964The target SV physically takes over ownership of the body of the source SV
4965and inherits its flags; however, the target keeps any magic it owns,
4966and any magic in the source is discarded.
ff276b08 4967Note that this is a rather specialist SV copying operation; most of the
645c22ef 4968time you'll want to use C<sv_setsv> or one of its many macro front-ends.
c461cf8f
JH
4969
4970=cut
4971*/
79072805
LW
4972
4973void
864dbfa3 4974Perl_sv_replace(pTHX_ register SV *sv, register SV *nsv)
79072805 4975{
97aff369 4976 dVAR;
a3b680e6 4977 const U32 refcnt = SvREFCNT(sv);
765f542d 4978 SV_CHECK_THINKFIRST_COW_DROP(sv);
30e5c352 4979 if (SvREFCNT(nsv) != 1) {
7437becc 4980 Perl_croak(aTHX_ "panic: reference miscount on nsv in sv_replace() (%"
30e5c352
NC
4981 UVuf " != 1)", (UV) SvREFCNT(nsv));
4982 }
93a17b20 4983 if (SvMAGICAL(sv)) {
a0d0e21e
LW
4984 if (SvMAGICAL(nsv))
4985 mg_free(nsv);
4986 else
4987 sv_upgrade(nsv, SVt_PVMG);
b162af07 4988 SvMAGIC_set(nsv, SvMAGIC(sv));
a0d0e21e 4989 SvFLAGS(nsv) |= SvMAGICAL(sv);
93a17b20 4990 SvMAGICAL_off(sv);
b162af07 4991 SvMAGIC_set(sv, NULL);
93a17b20 4992 }
79072805
LW
4993 SvREFCNT(sv) = 0;
4994 sv_clear(sv);
477f5d66 4995 assert(!SvREFCNT(sv));
fd0854ff
DM
4996#ifdef DEBUG_LEAKING_SCALARS
4997 sv->sv_flags = nsv->sv_flags;
4998 sv->sv_any = nsv->sv_any;
4999 sv->sv_refcnt = nsv->sv_refcnt;
f34d0642 5000 sv->sv_u = nsv->sv_u;
fd0854ff 5001#else
79072805 5002 StructCopy(nsv,sv,SV);
fd0854ff 5003#endif
7b2c381c
NC
5004 /* Currently could join these into one piece of pointer arithmetic, but
5005 it would be unclear. */
5006 if(SvTYPE(sv) == SVt_IV)
5007 SvANY(sv)
339049b0 5008 = (XPVIV*)((char*)&(sv->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
7b2c381c 5009 else if (SvTYPE(sv) == SVt_RV) {
339049b0 5010 SvANY(sv) = &sv->sv_u.svu_rv;
7b2c381c
NC
5011 }
5012
fd0854ff 5013
f8c7b90f 5014#ifdef PERL_OLD_COPY_ON_WRITE
d3d0e6f1
NC
5015 if (SvIsCOW_normal(nsv)) {
5016 /* We need to follow the pointers around the loop to make the
5017 previous SV point to sv, rather than nsv. */
5018 SV *next;
5019 SV *current = nsv;
5020 while ((next = SV_COW_NEXT_SV(current)) != nsv) {
5021 assert(next);
5022 current = next;
3f7c398e 5023 assert(SvPVX_const(current) == SvPVX_const(nsv));
d3d0e6f1
NC
5024 }
5025 /* Make the SV before us point to the SV after us. */
5026 if (DEBUG_C_TEST) {
5027 PerlIO_printf(Perl_debug_log, "previous is\n");
5028 sv_dump(current);
a29f6d03
NC
5029 PerlIO_printf(Perl_debug_log,
5030 "move it from 0x%"UVxf" to 0x%"UVxf"\n",
d3d0e6f1
NC
5031 (UV) SV_COW_NEXT_SV(current), (UV) sv);
5032 }
a29f6d03 5033 SV_COW_NEXT_SV_SET(current, sv);
d3d0e6f1
NC
5034 }
5035#endif
79072805 5036 SvREFCNT(sv) = refcnt;
1edc1566 5037 SvFLAGS(nsv) |= SVTYPEMASK; /* Mark as freed */
39cf41c2 5038 SvREFCNT(nsv) = 0;
463ee0b2 5039 del_SV(nsv);
79072805
LW
5040}
5041
c461cf8f
JH
5042/*
5043=for apidoc sv_clear
5044
645c22ef
DM
5045Clear an SV: call any destructors, free up any memory used by the body,
5046and free the body itself. The SV's head is I<not> freed, although
5047its type is set to all 1's so that it won't inadvertently be assumed
5048to be live during global destruction etc.
5049This function should only be called when REFCNT is zero. Most of the time
5050you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
5051instead.
c461cf8f
JH
5052
5053=cut
5054*/
5055
79072805 5056void
864dbfa3 5057Perl_sv_clear(pTHX_ register SV *sv)
79072805 5058{
27da23d5 5059 dVAR;
82bb6deb 5060 const U32 type = SvTYPE(sv);
8edfc514
NC
5061 const struct body_details *const sv_type_details
5062 = bodies_by_type + type;
dd69841b 5063 HV *stash;
82bb6deb 5064
79072805
LW
5065 assert(sv);
5066 assert(SvREFCNT(sv) == 0);
5067
d2a0f284
JC
5068 if (type <= SVt_IV) {
5069 /* See the comment in sv.h about the collusion between this early
5070 return and the overloading of the NULL and IV slots in the size
5071 table. */
82bb6deb 5072 return;
d2a0f284 5073 }
82bb6deb 5074
ed6116ce 5075 if (SvOBJECT(sv)) {
3280af22 5076 if (PL_defstash) { /* Still have a symbol table? */
39644a26 5077 dSP;
893645bd 5078 HV* stash;
d460ef45 5079 do {
b464bac0 5080 CV* destructor;
4e8e7886 5081 stash = SvSTASH(sv);
32251b26 5082 destructor = StashHANDLER(stash,DESTROY);
4e8e7886 5083 if (destructor) {
1b6737cc 5084 SV* const tmpref = newRV(sv);
5cc433a6 5085 SvREADONLY_on(tmpref); /* DESTROY() could be naughty */
4e8e7886 5086 ENTER;
e788e7d3 5087 PUSHSTACKi(PERLSI_DESTROY);
4e8e7886
GS
5088 EXTEND(SP, 2);
5089 PUSHMARK(SP);
5cc433a6 5090 PUSHs(tmpref);
4e8e7886 5091 PUTBACK;
44389ee9 5092 call_sv((SV*)destructor, G_DISCARD|G_EVAL|G_KEEPERR|G_VOID);
7a5fa8a2
NIS
5093
5094
d3acc0f7 5095 POPSTACK;
3095d977 5096 SPAGAIN;
4e8e7886 5097 LEAVE;
5cc433a6
AB
5098 if(SvREFCNT(tmpref) < 2) {
5099 /* tmpref is not kept alive! */
5100 SvREFCNT(sv)--;
b162af07 5101 SvRV_set(tmpref, NULL);
5cc433a6
AB
5102 SvROK_off(tmpref);
5103 }
5104 SvREFCNT_dec(tmpref);
4e8e7886
GS
5105 }
5106 } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
8ebc5c01 5107
6f44e0a4
JP
5108
5109 if (SvREFCNT(sv)) {
5110 if (PL_in_clean_objs)
cea2e8a9 5111 Perl_croak(aTHX_ "DESTROY created new reference to dead object '%s'",
bfcb3514 5112 HvNAME_get(stash));
6f44e0a4
JP
5113 /* DESTROY gave object new lease on life */
5114 return;
5115 }
a0d0e21e 5116 }
4e8e7886 5117
a0d0e21e 5118 if (SvOBJECT(sv)) {
4e8e7886 5119 SvREFCNT_dec(SvSTASH(sv)); /* possibly of changed persuasion */
a0d0e21e 5120 SvOBJECT_off(sv); /* Curse the object. */
82bb6deb 5121 if (type != SVt_PVIO)
3280af22 5122 --PL_sv_objcount; /* XXX Might want something more general */
a0d0e21e 5123 }
463ee0b2 5124 }
82bb6deb 5125 if (type >= SVt_PVMG) {
cecf5685 5126 if (type == SVt_PVMG && SvPAD_OUR(sv)) {
73d95100 5127 SvREFCNT_dec(SvOURSTASH(sv));
e736a858 5128 } else if (SvMAGIC(sv))
524189f1 5129 mg_free(sv);
00b1698f 5130 if (type == SVt_PVMG && SvPAD_TYPED(sv))
524189f1
JH
5131 SvREFCNT_dec(SvSTASH(sv));
5132 }
82bb6deb 5133 switch (type) {
cecf5685 5134 /* case SVt_BIND: */
8990e307 5135 case SVt_PVIO:
df0bd2f4
GS
5136 if (IoIFP(sv) &&
5137 IoIFP(sv) != PerlIO_stdin() &&
5f05dabc 5138 IoIFP(sv) != PerlIO_stdout() &&
5139 IoIFP(sv) != PerlIO_stderr())
93578b34 5140 {
f2b5be74 5141 io_close((IO*)sv, FALSE);
93578b34 5142 }
1d7c1841 5143 if (IoDIRP(sv) && !(IoFLAGS(sv) & IOf_FAKE_DIRP))
1236053a 5144 PerlDir_close(IoDIRP(sv));
1d7c1841 5145 IoDIRP(sv) = (DIR*)NULL;
8990e307
LW
5146 Safefree(IoTOP_NAME(sv));
5147 Safefree(IoFMT_NAME(sv));
5148 Safefree(IoBOTTOM_NAME(sv));
82bb6deb 5149 goto freescalar;
79072805 5150 case SVt_PVCV:
748a9306 5151 case SVt_PVFM:
85e6fe83 5152 cv_undef((CV*)sv);
a0d0e21e 5153 goto freescalar;
79072805 5154 case SVt_PVHV:
86f55936 5155 Perl_hv_kill_backrefs(aTHX_ (HV*)sv);
85e6fe83 5156 hv_undef((HV*)sv);
a0d0e21e 5157 break;
79072805 5158 case SVt_PVAV:
3f90d085
DM
5159 if (PL_comppad == (AV*)sv) {
5160 PL_comppad = NULL;
5161 PL_curpad = NULL;
5162 }
85e6fe83 5163 av_undef((AV*)sv);
a0d0e21e 5164 break;
02270b4e 5165 case SVt_PVLV:
dd28f7bb
DM
5166 if (LvTYPE(sv) == 'T') { /* for tie: return HE to pool */
5167 SvREFCNT_dec(HeKEY_sv((HE*)LvTARG(sv)));
5168 HeNEXT((HE*)LvTARG(sv)) = PL_hv_fetch_ent_mh;
5169 PL_hv_fetch_ent_mh = (HE*)LvTARG(sv);
5170 }
5171 else if (LvTYPE(sv) != 't') /* unless tie: unrefcnted fake SV** */
5172 SvREFCNT_dec(LvTARG(sv));
a0d0e21e 5173 case SVt_PVGV:
cecf5685 5174 if (isGV_with_GP(sv)) {
dd69841b
BB
5175 if(GvCVu((GV*)sv) && (stash = GvSTASH((GV*)sv)) && HvNAME_get(stash))
5176 mro_method_changed_in(stash);
cecf5685
NC
5177 gp_free((GV*)sv);
5178 if (GvNAME_HEK(sv))
5179 unshare_hek(GvNAME_HEK(sv));
dd69841b
BB
5180 /* If we're in a stash, we don't own a reference to it. However it does
5181 have a back reference to us, which needs to be cleared. */
5182 if (!SvVALID(sv) && (stash = GvSTASH(sv)))
5183 sv_del_backref((SV*)stash, sv);
cecf5685 5184 }
8571fe2f
NC
5185 /* FIXME. There are probably more unreferenced pointers to SVs in the
5186 interpreter struct that we should check and tidy in a similar
5187 fashion to this: */
5188 if ((GV*)sv == PL_last_in_gv)
5189 PL_last_in_gv = NULL;
79072805 5190 case SVt_PVMG:
79072805
LW
5191 case SVt_PVNV:
5192 case SVt_PVIV:
a0d0e21e 5193 freescalar:
5228ca4e
NC
5194 /* Don't bother with SvOOK_off(sv); as we're only going to free it. */
5195 if (SvOOK(sv)) {
93524f2b 5196 SvPV_set(sv, SvPVX_mutable(sv) - SvIVX(sv));
5228ca4e
NC
5197 /* Don't even bother with turning off the OOK flag. */
5198 }
79072805 5199 case SVt_PV:
a0d0e21e 5200 case SVt_RV:
810b8aa5 5201 if (SvROK(sv)) {
b37c2d43 5202 SV * const target = SvRV(sv);
810b8aa5 5203 if (SvWEAKREF(sv))
e15faf7d 5204 sv_del_backref(target, sv);
810b8aa5 5205 else
e15faf7d 5206 SvREFCNT_dec(target);
810b8aa5 5207 }
f8c7b90f 5208#ifdef PERL_OLD_COPY_ON_WRITE
3f7c398e 5209 else if (SvPVX_const(sv)) {
765f542d
NC
5210 if (SvIsCOW(sv)) {
5211 /* I believe I need to grab the global SV mutex here and
5212 then recheck the COW status. */
46187eeb
NC
5213 if (DEBUG_C_TEST) {
5214 PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
e419cbc5 5215 sv_dump(sv);
46187eeb 5216 }
5302ffd4
NC
5217 if (SvLEN(sv)) {
5218 sv_release_COW(sv, SvPVX_const(sv), SV_COW_NEXT_SV(sv));
5219 } else {
5220 unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
5221 }
5222
765f542d
NC
5223 /* And drop it here. */
5224 SvFAKE_off(sv);
5225 } else if (SvLEN(sv)) {
3f7c398e 5226 Safefree(SvPVX_const(sv));
765f542d
NC
5227 }
5228 }
5229#else
3f7c398e 5230 else if (SvPVX_const(sv) && SvLEN(sv))
94010e71 5231 Safefree(SvPVX_mutable(sv));
3f7c398e 5232 else if (SvPVX_const(sv) && SvREADONLY(sv) && SvFAKE(sv)) {
bdd68bc3 5233 unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
1c846c1f
NIS
5234 SvFAKE_off(sv);
5235 }
765f542d 5236#endif
79072805
LW
5237 break;
5238 case SVt_NV:
79072805
LW
5239 break;
5240 }
5241
893645bd
NC
5242 SvFLAGS(sv) &= SVf_BREAK;
5243 SvFLAGS(sv) |= SVTYPEMASK;
5244
8edfc514 5245 if (sv_type_details->arena) {
b9502f15 5246 del_body(((char *)SvANY(sv) + sv_type_details->offset),
8edfc514
NC
5247 &PL_body_roots[type]);
5248 }
d2a0f284 5249 else if (sv_type_details->body_size) {
8edfc514
NC
5250 my_safefree(SvANY(sv));
5251 }
79072805
LW
5252}
5253
645c22ef
DM
5254/*
5255=for apidoc sv_newref
5256
5257Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
5258instead.
5259
5260=cut
5261*/
5262
79072805 5263SV *
864dbfa3 5264Perl_sv_newref(pTHX_ SV *sv)
79072805 5265{
96a5add6 5266 PERL_UNUSED_CONTEXT;
463ee0b2 5267 if (sv)
4db098f4 5268 (SvREFCNT(sv))++;
79072805
LW
5269 return sv;
5270}
5271
c461cf8f
JH
5272/*
5273=for apidoc sv_free
5274
645c22ef
DM
5275Decrement an SV's reference count, and if it drops to zero, call
5276C<sv_clear> to invoke destructors and free up any memory used by
5277the body; finally, deallocate the SV's head itself.
5278Normally called via a wrapper macro C<SvREFCNT_dec>.
c461cf8f
JH
5279
5280=cut
5281*/
5282
79072805 5283void
864dbfa3 5284Perl_sv_free(pTHX_ SV *sv)
79072805 5285{
27da23d5 5286 dVAR;
79072805
LW
5287 if (!sv)
5288 return;
a0d0e21e
LW
5289 if (SvREFCNT(sv) == 0) {
5290 if (SvFLAGS(sv) & SVf_BREAK)
645c22ef
DM
5291 /* this SV's refcnt has been artificially decremented to
5292 * trigger cleanup */
a0d0e21e 5293 return;
3280af22 5294 if (PL_in_clean_all) /* All is fair */
1edc1566 5295 return;
d689ffdd
JP
5296 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5297 /* make sure SvREFCNT(sv)==0 happens very seldom */
5298 SvREFCNT(sv) = (~(U32)0)/2;
5299 return;
5300 }
41e4abd8 5301 if (ckWARN_d(WARN_INTERNAL)) {
d5dede04 5302 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
472d47bc
SB
5303 "Attempt to free unreferenced scalar: SV 0x%"UVxf
5304 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
41e4abd8
NC
5305#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
5306 Perl_dump_sv_child(aTHX_ sv);
e4c5322d
DM
5307#else
5308 #ifdef DEBUG_LEAKING_SCALARS
5309 sv_dump(sv);
5310 #endif
41e4abd8
NC
5311#endif
5312 }
79072805
LW
5313 return;
5314 }
4db098f4 5315 if (--(SvREFCNT(sv)) > 0)
8990e307 5316 return;
8c4d3c90
NC
5317 Perl_sv_free2(aTHX_ sv);
5318}
5319
5320void
5321Perl_sv_free2(pTHX_ SV *sv)
5322{
27da23d5 5323 dVAR;
463ee0b2
LW
5324#ifdef DEBUGGING
5325 if (SvTEMP(sv)) {
0453d815 5326 if (ckWARN_d(WARN_DEBUGGING))
9014280d 5327 Perl_warner(aTHX_ packWARN(WARN_DEBUGGING),
472d47bc
SB
5328 "Attempt to free temp prematurely: SV 0x%"UVxf
5329 pTHX__FORMAT, PTR2UV(sv) pTHX__VALUE);
79072805 5330 return;
79072805 5331 }
463ee0b2 5332#endif
d689ffdd
JP
5333 if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
5334 /* make sure SvREFCNT(sv)==0 happens very seldom */
5335 SvREFCNT(sv) = (~(U32)0)/2;
5336 return;
5337 }
79072805 5338 sv_clear(sv);
477f5d66
CS
5339 if (! SvREFCNT(sv))
5340 del_SV(sv);
79072805
LW
5341}
5342
954c1994
GS
5343/*
5344=for apidoc sv_len
5345
645c22ef
DM
5346Returns the length of the string in the SV. Handles magic and type
5347coercion. See also C<SvCUR>, which gives raw access to the xpv_cur slot.
954c1994
GS
5348
5349=cut
5350*/
5351
79072805 5352STRLEN
864dbfa3 5353Perl_sv_len(pTHX_ register SV *sv)
79072805 5354{
463ee0b2 5355 STRLEN len;
79072805
LW
5356
5357 if (!sv)
5358 return 0;
5359
8990e307 5360 if (SvGMAGICAL(sv))
565764a8 5361 len = mg_length(sv);
8990e307 5362 else
4d84ee25 5363 (void)SvPV_const(sv, len);
463ee0b2 5364 return len;
79072805
LW
5365}
5366
c461cf8f
JH
5367/*
5368=for apidoc sv_len_utf8
5369
5370Returns the number of characters in the string in an SV, counting wide
1e54db1a 5371UTF-8 bytes as a single character. Handles magic and type coercion.
c461cf8f
JH
5372
5373=cut
5374*/
5375
7e8c5dac
HS
5376/*
5377 * The length is cached in PERL_UTF8_magic, in the mg_len field. Also the
9564a3bd
NC
5378 * mg_ptr is used, by sv_pos_u2b() and sv_pos_b2u() - see the comments below.
5379 * (Note that the mg_len is not the length of the mg_ptr field.
5380 * This allows the cache to store the character length of the string without
5381 * needing to malloc() extra storage to attach to the mg_ptr.)
7a5fa8a2 5382 *
7e8c5dac
HS
5383 */
5384
a0ed51b3 5385STRLEN
864dbfa3 5386Perl_sv_len_utf8(pTHX_ register SV *sv)
a0ed51b3 5387{
a0ed51b3
LW
5388 if (!sv)
5389 return 0;
5390
a0ed51b3 5391 if (SvGMAGICAL(sv))
b76347f2 5392 return mg_length(sv);
a0ed51b3 5393 else
b76347f2 5394 {
26346457 5395 STRLEN len;
e62f0680 5396 const U8 *s = (U8*)SvPV_const(sv, len);
7e8c5dac 5397
26346457
NC
5398 if (PL_utf8cache) {
5399 STRLEN ulen;
5400 MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_utf8) : 0;
5401
5402 if (mg && mg->mg_len != -1) {
5403 ulen = mg->mg_len;
5404 if (PL_utf8cache < 0) {
5405 const STRLEN real = Perl_utf8_length(aTHX_ s, s + len);
5406 if (real != ulen) {
5407 /* Need to turn the assertions off otherwise we may
5408 recurse infinitely while printing error messages.
5409 */
5410 SAVEI8(PL_utf8cache);
5411 PL_utf8cache = 0;
f5992bc4
RB
5412 Perl_croak(aTHX_ "panic: sv_len_utf8 cache %"UVuf
5413 " real %"UVuf" for %"SVf,
be2597df 5414 (UV) ulen, (UV) real, SVfARG(sv));
26346457
NC
5415 }
5416 }
5417 }
5418 else {
5419 ulen = Perl_utf8_length(aTHX_ s, s + len);
5420 if (!SvREADONLY(sv)) {
5421 if (!mg) {
5422 mg = sv_magicext(sv, 0, PERL_MAGIC_utf8,
5423 &PL_vtbl_utf8, 0, 0);
5424 }
cb9e20bb 5425 assert(mg);
26346457 5426 mg->mg_len = ulen;
cb9e20bb 5427 }
cb9e20bb 5428 }
26346457 5429 return ulen;
7e8c5dac 5430 }
26346457 5431 return Perl_utf8_length(aTHX_ s, s + len);
7e8c5dac
HS
5432 }
5433}
5434
9564a3bd
NC
5435/* Walk forwards to find the byte corresponding to the passed in UTF-8
5436 offset. */
bdf30dd6 5437static STRLEN
721e86b6 5438S_sv_pos_u2b_forwards(const U8 *const start, const U8 *const send,
bdf30dd6
NC
5439 STRLEN uoffset)
5440{
5441 const U8 *s = start;
5442
5443 while (s < send && uoffset--)
5444 s += UTF8SKIP(s);
5445 if (s > send) {
5446 /* This is the existing behaviour. Possibly it should be a croak, as
5447 it's actually a bounds error */
5448 s = send;
5449 }
5450 return s - start;
5451}
5452
9564a3bd
NC
5453/* Given the length of the string in both bytes and UTF-8 characters, decide
5454 whether to walk forwards or backwards to find the byte corresponding to
5455 the passed in UTF-8 offset. */
c336ad0b 5456static STRLEN
721e86b6 5457S_sv_pos_u2b_midway(const U8 *const start, const U8 *send,
c336ad0b
NC
5458 STRLEN uoffset, STRLEN uend)
5459{
5460 STRLEN backw = uend - uoffset;
5461 if (uoffset < 2 * backw) {
25a8a4ef 5462 /* The assumption is that going forwards is twice the speed of going
c336ad0b
NC
5463 forward (that's where the 2 * backw comes from).
5464 (The real figure of course depends on the UTF-8 data.) */
721e86b6 5465 return sv_pos_u2b_forwards(start, send, uoffset);
c336ad0b
NC
5466 }
5467
5468 while (backw--) {
5469 send--;
5470 while (UTF8_IS_CONTINUATION(*send))
5471 send--;
5472 }
5473 return send - start;
5474}
5475
9564a3bd
NC
5476/* For the string representation of the given scalar, find the byte
5477 corresponding to the passed in UTF-8 offset. uoffset0 and boffset0
5478 give another position in the string, *before* the sought offset, which
5479 (which is always true, as 0, 0 is a valid pair of positions), which should
5480 help reduce the amount of linear searching.
5481 If *mgp is non-NULL, it should point to the UTF-8 cache magic, which
5482 will be used to reduce the amount of linear searching. The cache will be
5483 created if necessary, and the found value offered to it for update. */
28ccbf94
NC
5484static STRLEN
5485S_sv_pos_u2b_cached(pTHX_ SV *sv, MAGIC **mgp, const U8 *const start,
5486 const U8 *const send, STRLEN uoffset,
5487 STRLEN uoffset0, STRLEN boffset0) {
7087a21c 5488 STRLEN boffset = 0; /* Actually always set, but let's keep gcc happy. */
c336ad0b
NC
5489 bool found = FALSE;
5490
75c33c12
NC
5491 assert (uoffset >= uoffset0);
5492
c336ad0b 5493 if (SvMAGICAL(sv) && !SvREADONLY(sv) && PL_utf8cache
0905937d 5494 && (*mgp || (*mgp = mg_find(sv, PERL_MAGIC_utf8)))) {
d8b2e1f9
NC
5495 if ((*mgp)->mg_ptr) {
5496 STRLEN *cache = (STRLEN *) (*mgp)->mg_ptr;
5497 if (cache[0] == uoffset) {
5498 /* An exact match. */
5499 return cache[1];
5500 }
ab455f60
NC
5501 if (cache[2] == uoffset) {
5502 /* An exact match. */
5503 return cache[3];
5504 }
668af93f
NC
5505
5506 if (cache[0] < uoffset) {
d8b2e1f9
NC
5507 /* The cache already knows part of the way. */
5508 if (cache[0] > uoffset0) {
5509 /* The cache knows more than the passed in pair */
5510 uoffset0 = cache[0];
5511 boffset0 = cache[1];
5512 }
5513 if ((*mgp)->mg_len != -1) {
5514 /* And we know the end too. */
5515 boffset = boffset0
721e86b6 5516 + sv_pos_u2b_midway(start + boffset0, send,
d8b2e1f9
NC
5517 uoffset - uoffset0,
5518 (*mgp)->mg_len - uoffset0);
5519 } else {
5520 boffset = boffset0
721e86b6 5521 + sv_pos_u2b_forwards(start + boffset0,
d8b2e1f9
NC
5522 send, uoffset - uoffset0);
5523 }
dd7c5fd3
NC
5524 }
5525 else if (cache[2] < uoffset) {
5526 /* We're between the two cache entries. */
5527 if (cache[2] > uoffset0) {
5528 /* and the cache knows more than the passed in pair */
5529 uoffset0 = cache[2];
5530 boffset0 = cache[3];
5531 }
5532
668af93f 5533 boffset = boffset0
721e86b6 5534 + sv_pos_u2b_midway(start + boffset0,
668af93f
NC
5535 start + cache[1],
5536 uoffset - uoffset0,
5537 cache[0] - uoffset0);
dd7c5fd3
NC
5538 } else {
5539 boffset = boffset0
721e86b6 5540 + sv_pos_u2b_midway(start + boffset0,
dd7c5fd3
NC
5541 start + cache[3],
5542 uoffset - uoffset0,
5543 cache[2] - uoffset0);
d8b2e1f9 5544 }
668af93f 5545 found = TRUE;
d8b2e1f9
NC
5546 }
5547 else if ((*mgp)->mg_len != -1) {
75c33c12
NC
5548 /* If we can take advantage of a passed in offset, do so. */
5549 /* In fact, offset0 is either 0, or less than offset, so don't
5550 need to worry about the other possibility. */
5551 boffset = boffset0
721e86b6 5552 + sv_pos_u2b_midway(start + boffset0, send,
75c33c12
NC
5553 uoffset - uoffset0,
5554 (*mgp)->mg_len - uoffset0);
c336ad0b
NC
5555 found = TRUE;
5556 }
28ccbf94 5557 }
c336ad0b
NC
5558
5559 if (!found || PL_utf8cache < 0) {
75c33c12 5560 const STRLEN real_boffset
721e86b6 5561 = boffset0 + sv_pos_u2b_forwards(start + boffset0,
75c33c12
NC
5562 send, uoffset - uoffset0);
5563
c336ad0b
NC
5564 if (found && PL_utf8cache < 0) {
5565 if (real_boffset != boffset) {
5566 /* Need to turn the assertions off otherwise we may recurse
5567 infinitely while printing error messages. */
5568 SAVEI8(PL_utf8cache);
5569 PL_utf8cache = 0;
f5992bc4
RB
5570 Perl_croak(aTHX_ "panic: sv_pos_u2b_cache cache %"UVuf
5571 " real %"UVuf" for %"SVf,
be2597df 5572 (UV) boffset, (UV) real_boffset, SVfARG(sv));
c336ad0b
NC
5573 }
5574 }
5575 boffset = real_boffset;
28ccbf94 5576 }
0905937d 5577
ab455f60 5578 S_utf8_mg_pos_cache_update(aTHX_ sv, mgp, boffset, uoffset, send - start);
28ccbf94
NC
5579 return boffset;
5580}
5581
9564a3bd
NC
5582
5583/*
5584=for apidoc sv_pos_u2b
5585
5586Converts the value pointed to by offsetp from a count of UTF-8 chars from
5587the start of the string, to a count of the equivalent number of bytes; if
5588lenp is non-zero, it does the same to lenp, but this time starting from
5589the offset, rather than from the start of the string. Handles magic and
5590type coercion.
5591
5592=cut
5593*/
5594
5595/*
5596 * sv_pos_u2b() uses, like sv_pos_b2u(), the mg_ptr of the potential
5597 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
5598 * byte offsets. See also the comments of S_utf8_mg_pos_cache_update().
5599 *
5600 */
5601
a0ed51b3 5602void
864dbfa3 5603Perl_sv_pos_u2b(pTHX_ register SV *sv, I32* offsetp, I32* lenp)
a0ed51b3 5604{
245d4a47 5605 const U8 *start;
a0ed51b3
LW
5606 STRLEN len;
5607
5608 if (!sv)
5609 return;
5610
245d4a47 5611 start = (U8*)SvPV_const(sv, len);
7e8c5dac 5612 if (len) {
bdf30dd6
NC
5613 STRLEN uoffset = (STRLEN) *offsetp;
5614 const U8 * const send = start + len;
0905937d 5615 MAGIC *mg = NULL;
721e86b6 5616 const STRLEN boffset = sv_pos_u2b_cached(sv, &mg, start, send,
28ccbf94 5617 uoffset, 0, 0);
bdf30dd6
NC
5618
5619 *offsetp = (I32) boffset;
5620
5621 if (lenp) {
28ccbf94 5622 /* Convert the relative offset to absolute. */
721e86b6
AL
5623 const STRLEN uoffset2 = uoffset + (STRLEN) *lenp;
5624 const STRLEN boffset2
5625 = sv_pos_u2b_cached(sv, &mg, start, send, uoffset2,
28ccbf94 5626 uoffset, boffset) - boffset;
bdf30dd6 5627
28ccbf94 5628 *lenp = boffset2;
bdf30dd6 5629 }
7e8c5dac
HS
5630 }
5631 else {
5632 *offsetp = 0;
5633 if (lenp)
5634 *lenp = 0;
a0ed51b3 5635 }
e23c8137 5636
a0ed51b3
LW
5637 return;
5638}
5639
9564a3bd
NC
5640/* Create and update the UTF8 magic offset cache, with the proffered utf8/
5641 byte length pairing. The (byte) length of the total SV is passed in too,
5642 as blen, because for some (more esoteric) SVs, the call to SvPV_const()
5643 may not have updated SvCUR, so we can't rely on reading it directly.
5644
5645 The proffered utf8/byte length pairing isn't used if the cache already has
5646 two pairs, and swapping either for the proffered pair would increase the
5647 RMS of the intervals between known byte offsets.
5648
5649 The cache itself consists of 4 STRLEN values
5650 0: larger UTF-8 offset
5651 1: corresponding byte offset
5652 2: smaller UTF-8 offset
5653 3: corresponding byte offset
5654
5655 Unused cache pairs have the value 0, 0.
5656 Keeping the cache "backwards" means that the invariant of
5657 cache[0] >= cache[2] is maintained even with empty slots, which means that
5658 the code that uses it doesn't need to worry if only 1 entry has actually
5659 been set to non-zero. It also makes the "position beyond the end of the
5660 cache" logic much simpler, as the first slot is always the one to start
5661 from.
645c22ef 5662*/
ec07b5e0 5663static void
ab455f60
NC
5664S_utf8_mg_pos_cache_update(pTHX_ SV *sv, MAGIC **mgp, STRLEN byte, STRLEN utf8,
5665 STRLEN blen)
ec07b5e0
NC
5666{
5667 STRLEN *cache;
5668 if (SvREADONLY(sv))
5669 return;
5670
5671 if (!*mgp) {
5672 *mgp = sv_magicext(sv, 0, PERL_MAGIC_utf8, (MGVTBL*)&PL_vtbl_utf8, 0,
5673 0);
5674 (*mgp)->mg_len = -1;
5675 }
5676 assert(*mgp);
5677
5678 if (!(cache = (STRLEN *)(*mgp)->mg_ptr)) {
5679 Newxz(cache, PERL_MAGIC_UTF8_CACHESIZE * 2, STRLEN);
5680 (*mgp)->mg_ptr = (char *) cache;
5681 }
5682 assert(cache);
5683
5684 if (PL_utf8cache < 0) {
ef816a78 5685 const U8 *start = (const U8 *) SvPVX_const(sv);
6448472a 5686 const STRLEN realutf8 = utf8_length(start, start + byte);
ec07b5e0
NC
5687
5688 if (realutf8 != utf8) {
5689 /* Need to turn the assertions off otherwise we may recurse
5690 infinitely while printing error messages. */
5691 SAVEI8(PL_utf8cache);
5692 PL_utf8cache = 0;
f5992bc4 5693 Perl_croak(aTHX_ "panic: utf8_mg_pos_cache_update cache %"UVuf
be2597df 5694 " real %"UVuf" for %"SVf, (UV) utf8, (UV) realutf8, SVfARG(sv));
ec07b5e0
NC
5695 }
5696 }
ab455f60
NC
5697
5698 /* Cache is held with the later position first, to simplify the code
5699 that deals with unbounded ends. */
5700
5701 ASSERT_UTF8_CACHE(cache);
5702 if (cache[1] == 0) {
5703 /* Cache is totally empty */
5704 cache[0] = utf8;
5705 cache[1] = byte;
5706 } else if (cache[3] == 0) {
5707 if (byte > cache[1]) {
5708 /* New one is larger, so goes first. */
5709 cache[2] = cache[0];
5710 cache[3] = cache[1];
5711 cache[0] = utf8;
5712 cache[1] = byte;
5713 } else {
5714 cache[2] = utf8;
5715 cache[3] = byte;
5716 }
5717 } else {
5718#define THREEWAY_SQUARE(a,b,c,d) \
5719 ((float)((d) - (c))) * ((float)((d) - (c))) \
5720 + ((float)((c) - (b))) * ((float)((c) - (b))) \
5721 + ((float)((b) - (a))) * ((float)((b) - (a)))
5722
5723 /* Cache has 2 slots in use, and we know three potential pairs.
5724 Keep the two that give the lowest RMS distance. Do the
5725 calcualation in bytes simply because we always know the byte
5726 length. squareroot has the same ordering as the positive value,
5727 so don't bother with the actual square root. */
5728 const float existing = THREEWAY_SQUARE(0, cache[3], cache[1], blen);
5729 if (byte > cache[1]) {
5730 /* New position is after the existing pair of pairs. */
5731 const float keep_earlier
5732 = THREEWAY_SQUARE(0, cache[3], byte, blen);
5733 const float keep_later
5734 = THREEWAY_SQUARE(0, cache[1], byte, blen);
5735
5736 if (keep_later < keep_earlier) {
5737 if (keep_later < existing) {
5738 cache[2] = cache[0];
5739 cache[3] = cache[1];
5740 cache[0] = utf8;
5741 cache[1] = byte;
5742 }
5743 }
5744 else {
5745 if (keep_earlier < existing) {
5746 cache[0] = utf8;
5747 cache[1] = byte;
5748 }
5749 }
5750 }
57d7fbf1
NC
5751 else if (byte > cache[3]) {
5752 /* New position is between the existing pair of pairs. */
5753 const float keep_earlier
5754 = THREEWAY_SQUARE(0, cache[3], byte, blen);
5755 const float keep_later
5756 = THREEWAY_SQUARE(0, byte, cache[1], blen);
5757
5758 if (keep_later < keep_earlier) {
5759 if (keep_later < existing) {
5760 cache[2] = utf8;
5761 cache[3] = byte;
5762 }
5763 }
5764 else {
5765 if (keep_earlier < existing) {
5766 cache[0] = utf8;
5767 cache[1] = byte;
5768 }
5769 }
5770 }
5771 else {
5772 /* New position is before the existing pair of pairs. */
5773 const float keep_earlier
5774 = THREEWAY_SQUARE(0, byte, cache[3], blen);
5775 const float keep_later
5776 = THREEWAY_SQUARE(0, byte, cache[1], blen);
5777
5778 if (keep_later < keep_earlier) {
5779 if (keep_later < existing) {
5780 cache[2] = utf8;
5781 cache[3] = byte;
5782 }
5783 }
5784 else {
5785 if (keep_earlier < existing) {
5786 cache[0] = cache[2];
5787 cache[1] = cache[3];
5788 cache[2] = utf8;
5789 cache[3] = byte;
5790 }
5791 }
5792 }
ab455f60 5793 }
0905937d 5794 ASSERT_UTF8_CACHE(cache);
ec07b5e0
NC
5795}
5796
ec07b5e0 5797/* We already know all of the way, now we may be able to walk back. The same
25a8a4ef
NC
5798 assumption is made as in S_sv_pos_u2b_midway(), namely that walking
5799 backward is half the speed of walking forward. */
ec07b5e0
NC
5800static STRLEN
5801S_sv_pos_b2u_midway(pTHX_ const U8 *s, const U8 *const target, const U8 *end,
5802 STRLEN endu)
5803{
5804 const STRLEN forw = target - s;
5805 STRLEN backw = end - target;
5806
5807 if (forw < 2 * backw) {
6448472a 5808 return utf8_length(s, target);
ec07b5e0
NC
5809 }
5810
5811 while (end > target) {
5812 end--;
5813 while (UTF8_IS_CONTINUATION(*end)) {
5814 end--;
5815 }
5816 endu--;
5817 }
5818 return endu;
5819}
5820
9564a3bd
NC
5821/*
5822=for apidoc sv_pos_b2u
5823
5824Converts the value pointed to by offsetp from a count of bytes from the
5825start of the string, to a count of the equivalent number of UTF-8 chars.
5826Handles magic and type coercion.
5827
5828=cut
5829*/
5830
5831/*
5832 * sv_pos_b2u() uses, like sv_pos_u2b(), the mg_ptr of the potential
5833 * PERL_UTF8_magic of the sv to store the mapping between UTF-8 and
5834 * byte offsets.
5835 *
5836 */
a0ed51b3 5837void
7e8c5dac 5838Perl_sv_pos_b2u(pTHX_ register SV* sv, I32* offsetp)
a0ed51b3 5839{
83003860 5840 const U8* s;
ec07b5e0 5841 const STRLEN byte = *offsetp;
7087a21c 5842 STRLEN len = 0; /* Actually always set, but let's keep gcc happy. */
ab455f60 5843 STRLEN blen;
ec07b5e0
NC
5844 MAGIC* mg = NULL;
5845 const U8* send;
a922f900 5846 bool found = FALSE;
a0ed51b3
LW
5847
5848 if (!sv)
5849 return;
5850
ab455f60 5851 s = (const U8*)SvPV_const(sv, blen);
7e8c5dac 5852
ab455f60 5853 if (blen < byte)
ec07b5e0 5854 Perl_croak(aTHX_ "panic: sv_pos_b2u: bad byte offset");
7e8c5dac 5855
ec07b5e0 5856 send = s + byte;
a67d7df9 5857
ffca234a
NC
5858 if (SvMAGICAL(sv) && !SvREADONLY(sv) && PL_utf8cache
5859 && (mg = mg_find(sv, PERL_MAGIC_utf8))) {
5860 if (mg->mg_ptr) {
d4c19fe8 5861 STRLEN * const cache = (STRLEN *) mg->mg_ptr;
b9f984a5 5862 if (cache[1] == byte) {
ec07b5e0
NC
5863 /* An exact match. */
5864 *offsetp = cache[0];
ec07b5e0 5865 return;
7e8c5dac 5866 }
ab455f60
NC
5867 if (cache[3] == byte) {
5868 /* An exact match. */
5869 *offsetp = cache[2];
5870 return;
5871 }
668af93f
NC
5872
5873 if (cache[1] < byte) {
ec07b5e0 5874 /* We already know part of the way. */
b9f984a5
NC
5875 if (mg->mg_len != -1) {
5876 /* Actually, we know the end too. */
5877 len = cache[0]
5878 + S_sv_pos_b2u_midway(aTHX_ s + cache[1], send,
ab455f60 5879 s + blen, mg->mg_len - cache[0]);
b9f984a5 5880 } else {
6448472a 5881 len = cache[0] + utf8_length(s + cache[1], send);
b9f984a5 5882 }
7e8c5dac 5883 }
9f985e4c
NC
5884 else if (cache[3] < byte) {
5885 /* We're between the two cached pairs, so we do the calculation
5886 offset by the byte/utf-8 positions for the earlier pair,
5887 then add the utf-8 characters from the string start to
5888 there. */
5889 len = S_sv_pos_b2u_midway(aTHX_ s + cache[3], send,
5890 s + cache[1], cache[0] - cache[2])
5891 + cache[2];
5892
5893 }
5894 else { /* cache[3] > byte */
5895 len = S_sv_pos_b2u_midway(aTHX_ s, send, s + cache[3],
5896 cache[2]);
7e8c5dac 5897
7e8c5dac 5898 }
ec07b5e0 5899 ASSERT_UTF8_CACHE(cache);
a922f900 5900 found = TRUE;
ffca234a 5901 } else if (mg->mg_len != -1) {
ab455f60 5902 len = S_sv_pos_b2u_midway(aTHX_ s, send, s + blen, mg->mg_len);
a922f900 5903 found = TRUE;
7e8c5dac 5904 }
a0ed51b3 5905 }
a922f900 5906 if (!found || PL_utf8cache < 0) {
6448472a 5907 const STRLEN real_len = utf8_length(s, send);
a922f900
NC
5908
5909 if (found && PL_utf8cache < 0) {
5910 if (len != real_len) {
5911 /* Need to turn the assertions off otherwise we may recurse
5912 infinitely while printing error messages. */
5913 SAVEI8(PL_utf8cache);
5914 PL_utf8cache = 0;
f5992bc4
RB
5915 Perl_croak(aTHX_ "panic: sv_pos_b2u cache %"UVuf
5916 " real %"UVuf" for %"SVf,
be2597df 5917 (UV) len, (UV) real_len, SVfARG(sv));
a922f900
NC
5918 }
5919 }
5920 len = real_len;
ec07b5e0
NC
5921 }
5922 *offsetp = len;
5923
ab455f60 5924 S_utf8_mg_pos_cache_update(aTHX_ sv, &mg, byte, len, blen);
a0ed51b3
LW
5925}
5926
954c1994
GS
5927/*
5928=for apidoc sv_eq
5929
5930Returns a boolean indicating whether the strings in the two SVs are
645c22ef
DM
5931identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
5932coerce its args to strings if necessary.
954c1994
GS
5933
5934=cut
5935*/
5936
79072805 5937I32
e01b9e88 5938Perl_sv_eq(pTHX_ register SV *sv1, register SV *sv2)
79072805 5939{
97aff369 5940 dVAR;
e1ec3a88 5941 const char *pv1;
463ee0b2 5942 STRLEN cur1;
e1ec3a88 5943 const char *pv2;
463ee0b2 5944 STRLEN cur2;
e01b9e88 5945 I32 eq = 0;
bd61b366 5946 char *tpv = NULL;
a0714e2c 5947 SV* svrecode = NULL;
79072805 5948
e01b9e88 5949 if (!sv1) {
79072805
LW
5950 pv1 = "";
5951 cur1 = 0;
5952 }
ced497e2
YST
5953 else {
5954 /* if pv1 and pv2 are the same, second SvPV_const call may
5955 * invalidate pv1, so we may need to make a copy */
5956 if (sv1 == sv2 && (SvTHINKFIRST(sv1) || SvGMAGICAL(sv1))) {
5957 pv1 = SvPV_const(sv1, cur1);
5958 sv1 = sv_2mortal(newSVpvn(pv1, cur1));
5959 if (SvUTF8(sv2)) SvUTF8_on(sv1);
5960 }
4d84ee25 5961 pv1 = SvPV_const(sv1, cur1);
ced497e2 5962 }
79072805 5963
e01b9e88
SC
5964 if (!sv2){
5965 pv2 = "";
5966 cur2 = 0;
92d29cee 5967 }
e01b9e88 5968 else
4d84ee25 5969 pv2 = SvPV_const(sv2, cur2);
79072805 5970
cf48d248 5971 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
5972 /* Differing utf8ness.
5973 * Do not UTF8size the comparands as a side-effect. */
5974 if (PL_encoding) {
5975 if (SvUTF8(sv1)) {
553e1bcc
AT
5976 svrecode = newSVpvn(pv2, cur2);
5977 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 5978 pv2 = SvPV_const(svrecode, cur2);
799ef3cb
JH
5979 }
5980 else {
553e1bcc
AT
5981 svrecode = newSVpvn(pv1, cur1);
5982 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 5983 pv1 = SvPV_const(svrecode, cur1);
799ef3cb
JH
5984 }
5985 /* Now both are in UTF-8. */
0a1bd7ac
DM
5986 if (cur1 != cur2) {
5987 SvREFCNT_dec(svrecode);
799ef3cb 5988 return FALSE;
0a1bd7ac 5989 }
799ef3cb
JH
5990 }
5991 else {
5992 bool is_utf8 = TRUE;
5993
5994 if (SvUTF8(sv1)) {
5995 /* sv1 is the UTF-8 one,
5996 * if is equal it must be downgrade-able */
9d4ba2ae 5997 char * const pv = (char*)bytes_from_utf8((const U8*)pv1,
799ef3cb
JH
5998 &cur1, &is_utf8);
5999 if (pv != pv1)
553e1bcc 6000 pv1 = tpv = pv;
799ef3cb
JH
6001 }
6002 else {
6003 /* sv2 is the UTF-8 one,
6004 * if is equal it must be downgrade-able */
9d4ba2ae 6005 char * const pv = (char *)bytes_from_utf8((const U8*)pv2,
799ef3cb
JH
6006 &cur2, &is_utf8);
6007 if (pv != pv2)
553e1bcc 6008 pv2 = tpv = pv;
799ef3cb
JH
6009 }
6010 if (is_utf8) {
6011 /* Downgrade not possible - cannot be eq */
bf694877 6012 assert (tpv == 0);
799ef3cb
JH
6013 return FALSE;
6014 }
6015 }
cf48d248
JH
6016 }
6017
6018 if (cur1 == cur2)
765f542d 6019 eq = (pv1 == pv2) || memEQ(pv1, pv2, cur1);
e01b9e88 6020
b37c2d43 6021 SvREFCNT_dec(svrecode);
553e1bcc
AT
6022 if (tpv)
6023 Safefree(tpv);
cf48d248 6024
e01b9e88 6025 return eq;
79072805
LW
6026}
6027
954c1994
GS
6028/*
6029=for apidoc sv_cmp
6030
6031Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
6032string in C<sv1> is less than, equal to, or greater than the string in
645c22ef
DM
6033C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
6034coerce its args to strings if necessary. See also C<sv_cmp_locale>.
954c1994
GS
6035
6036=cut
6037*/
6038
79072805 6039I32
e01b9e88 6040Perl_sv_cmp(pTHX_ register SV *sv1, register SV *sv2)
79072805 6041{
97aff369 6042 dVAR;
560a288e 6043 STRLEN cur1, cur2;
e1ec3a88 6044 const char *pv1, *pv2;
bd61b366 6045 char *tpv = NULL;
cf48d248 6046 I32 cmp;
a0714e2c 6047 SV *svrecode = NULL;
560a288e 6048
e01b9e88
SC
6049 if (!sv1) {
6050 pv1 = "";
560a288e
GS
6051 cur1 = 0;
6052 }
e01b9e88 6053 else
4d84ee25 6054 pv1 = SvPV_const(sv1, cur1);
560a288e 6055
553e1bcc 6056 if (!sv2) {
e01b9e88 6057 pv2 = "";
560a288e
GS
6058 cur2 = 0;
6059 }
e01b9e88 6060 else
4d84ee25 6061 pv2 = SvPV_const(sv2, cur2);
79072805 6062
cf48d248 6063 if (cur1 && cur2 && SvUTF8(sv1) != SvUTF8(sv2) && !IN_BYTES) {
799ef3cb
JH
6064 /* Differing utf8ness.
6065 * Do not UTF8size the comparands as a side-effect. */
cf48d248 6066 if (SvUTF8(sv1)) {
799ef3cb 6067 if (PL_encoding) {
553e1bcc
AT
6068 svrecode = newSVpvn(pv2, cur2);
6069 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 6070 pv2 = SvPV_const(svrecode, cur2);
799ef3cb
JH
6071 }
6072 else {
e1ec3a88 6073 pv2 = tpv = (char*)bytes_to_utf8((const U8*)pv2, &cur2);
799ef3cb 6074 }
cf48d248
JH
6075 }
6076 else {
799ef3cb 6077 if (PL_encoding) {
553e1bcc
AT
6078 svrecode = newSVpvn(pv1, cur1);
6079 sv_recode_to_utf8(svrecode, PL_encoding);
93524f2b 6080 pv1 = SvPV_const(svrecode, cur1);
799ef3cb
JH
6081 }
6082 else {
e1ec3a88 6083 pv1 = tpv = (char*)bytes_to_utf8((const U8*)pv1, &cur1);
799ef3cb 6084 }
cf48d248
JH
6085 }
6086 }
6087
e01b9e88 6088 if (!cur1) {
cf48d248 6089 cmp = cur2 ? -1 : 0;
e01b9e88 6090 } else if (!cur2) {
cf48d248
JH
6091 cmp = 1;
6092 } else {
e1ec3a88 6093 const I32 retval = memcmp((const void*)pv1, (const void*)pv2, cur1 < cur2 ? cur1 : cur2);
e01b9e88
SC
6094
6095 if (retval) {
cf48d248 6096 cmp = retval < 0 ? -1 : 1;
e01b9e88 6097 } else if (cur1 == cur2) {
cf48d248
JH
6098 cmp = 0;
6099 } else {
6100 cmp = cur1 < cur2 ? -1 : 1;
e01b9e88 6101 }
cf48d248 6102 }
16660edb 6103
b37c2d43 6104 SvREFCNT_dec(svrecode);
553e1bcc
AT
6105 if (tpv)
6106 Safefree(tpv);
cf48d248
JH
6107
6108 return cmp;
bbce6d69 6109}
16660edb 6110
c461cf8f
JH
6111/*
6112=for apidoc sv_cmp_locale
6113
645c22ef
DM
6114Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
6115'use bytes' aware, handles get magic, and will coerce its args to strings
6116if necessary. See also C<sv_cmp_locale>. See also C<sv_cmp>.
c461cf8f
JH
6117
6118=cut
6119*/
6120
bbce6d69 6121I32
864dbfa3 6122Perl_sv_cmp_locale(pTHX_ register SV *sv1, register SV *sv2)
bbce6d69 6123{
97aff369 6124 dVAR;
36477c24 6125#ifdef USE_LOCALE_COLLATE
16660edb 6126
bbce6d69 6127 char *pv1, *pv2;
6128 STRLEN len1, len2;
6129 I32 retval;
16660edb 6130
3280af22 6131 if (PL_collation_standard)
bbce6d69 6132 goto raw_compare;
16660edb 6133
bbce6d69 6134 len1 = 0;
8ac85365 6135 pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
bbce6d69 6136 len2 = 0;
8ac85365 6137 pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
16660edb 6138
bbce6d69 6139 if (!pv1 || !len1) {
6140 if (pv2 && len2)
6141 return -1;
6142 else
6143 goto raw_compare;
6144 }
6145 else {
6146 if (!pv2 || !len2)
6147 return 1;
6148 }
16660edb 6149
bbce6d69 6150 retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
16660edb 6151
bbce6d69 6152 if (retval)
16660edb 6153 return retval < 0 ? -1 : 1;
6154
bbce6d69 6155 /*
6156 * When the result of collation is equality, that doesn't mean
6157 * that there are no differences -- some locales exclude some
6158 * characters from consideration. So to avoid false equalities,
6159 * we use the raw string as a tiebreaker.
6160 */
16660edb 6161
bbce6d69 6162 raw_compare:
5f66b61c 6163 /*FALLTHROUGH*/
16660edb 6164
36477c24 6165#endif /* USE_LOCALE_COLLATE */
16660edb 6166
bbce6d69 6167 return sv_cmp(sv1, sv2);
6168}
79072805 6169
645c22ef 6170
36477c24 6171#ifdef USE_LOCALE_COLLATE
645c22ef 6172
7a4c00b4 6173/*
645c22ef
DM
6174=for apidoc sv_collxfrm
6175
6176Add Collate Transform magic to an SV if it doesn't already have it.
6177
6178Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
6179scalar data of the variable, but transformed to such a format that a normal
6180memory comparison can be used to compare the data according to the locale
6181settings.
6182
6183=cut
6184*/
6185
bbce6d69 6186char *
864dbfa3 6187Perl_sv_collxfrm(pTHX_ SV *sv, STRLEN *nxp)
bbce6d69 6188{
97aff369 6189 dVAR;
7a4c00b4 6190 MAGIC *mg;
16660edb 6191
14befaf4 6192 mg = SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_collxfrm) : (MAGIC *) NULL;
3280af22 6193 if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
93524f2b
NC
6194 const char *s;
6195 char *xf;
bbce6d69 6196 STRLEN len, xlen;
6197
7a4c00b4 6198 if (mg)
6199 Safefree(mg->mg_ptr);
93524f2b 6200 s = SvPV_const(sv, len);
bbce6d69 6201 if ((xf = mem_collxfrm(s, len, &xlen))) {
ff0cee69 6202 if (SvREADONLY(sv)) {
6203 SAVEFREEPV(xf);
6204 *nxp = xlen;
3280af22 6205 return xf + sizeof(PL_collation_ix);
ff0cee69 6206 }
7a4c00b4 6207 if (! mg) {
d83f0a82
NC
6208#ifdef PERL_OLD_COPY_ON_WRITE
6209 if (SvIsCOW(sv))
6210 sv_force_normal_flags(sv, 0);
6211#endif
6212 mg = sv_magicext(sv, 0, PERL_MAGIC_collxfrm, &PL_vtbl_collxfrm,
6213 0, 0);
7a4c00b4 6214 assert(mg);
bbce6d69 6215 }
7a4c00b4 6216 mg->mg_ptr = xf;
565764a8 6217 mg->mg_len = xlen;
7a4c00b4 6218 }
6219 else {
ff0cee69 6220 if (mg) {
6221 mg->mg_ptr = NULL;
565764a8 6222 mg->mg_len = -1;
ff0cee69 6223 }
bbce6d69 6224 }
6225 }
7a4c00b4 6226 if (mg && mg->mg_ptr) {
565764a8 6227 *nxp = mg->mg_len;
3280af22 6228 return mg->mg_ptr + sizeof(PL_collation_ix);
bbce6d69 6229 }
6230 else {
6231 *nxp = 0;
6232 return NULL;
16660edb 6233 }
79072805
LW
6234}
6235
36477c24 6236#endif /* USE_LOCALE_COLLATE */
bbce6d69 6237
c461cf8f
JH
6238/*
6239=for apidoc sv_gets
6240
6241Get a line from the filehandle and store it into the SV, optionally
6242appending to the currently-stored string.
6243
6244=cut
6245*/
6246
79072805 6247char *
864dbfa3 6248Perl_sv_gets(pTHX_ register SV *sv, register PerlIO *fp, I32 append)
79072805 6249{
97aff369 6250 dVAR;
e1ec3a88 6251 const char *rsptr;
c07a80fd 6252 STRLEN rslen;
6253 register STDCHAR rslast;
6254 register STDCHAR *bp;
6255 register I32 cnt;
9c5ffd7c 6256 I32 i = 0;
8bfdd7d9 6257 I32 rspara = 0;
c07a80fd 6258
bc44a8a2
NC
6259 if (SvTHINKFIRST(sv))
6260 sv_force_normal_flags(sv, append ? 0 : SV_COW_DROP_PV);
765f542d
NC
6261 /* XXX. If you make this PVIV, then copy on write can copy scalars read
6262 from <>.
6263 However, perlbench says it's slower, because the existing swipe code
6264 is faster than copy on write.
6265 Swings and roundabouts. */
862a34c6 6266 SvUPGRADE(sv, SVt_PV);
99491443 6267
ff68c719 6268 SvSCREAM_off(sv);
efd8b2ba
AE
6269
6270 if (append) {
6271 if (PerlIO_isutf8(fp)) {
6272 if (!SvUTF8(sv)) {
6273 sv_utf8_upgrade_nomg(sv);
6274 sv_pos_u2b(sv,&append,0);
6275 }
6276 } else if (SvUTF8(sv)) {
561b68a9 6277 SV * const tsv = newSV(0);
efd8b2ba
AE
6278 sv_gets(tsv, fp, 0);
6279 sv_utf8_upgrade_nomg(tsv);
6280 SvCUR_set(sv,append);
6281 sv_catsv(sv,tsv);
6282 sv_free(tsv);
6283 goto return_string_or_null;
6284 }
6285 }
6286
6287 SvPOK_only(sv);
6288 if (PerlIO_isutf8(fp))
6289 SvUTF8_on(sv);
c07a80fd 6290
923e4eb5 6291 if (IN_PERL_COMPILETIME) {
8bfdd7d9
HS
6292 /* we always read code in line mode */
6293 rsptr = "\n";
6294 rslen = 1;
6295 }
6296 else if (RsSNARF(PL_rs)) {
7a5fa8a2 6297 /* If it is a regular disk file use size from stat() as estimate
acbd132f
JH
6298 of amount we are going to read -- may result in mallocing
6299 more memory than we really need if the layers below reduce
6300 the size we read (e.g. CRLF or a gzip layer).
e468d35b 6301 */
e311fd51 6302 Stat_t st;
e468d35b 6303 if (!PerlLIO_fstat(PerlIO_fileno(fp), &st) && S_ISREG(st.st_mode)) {
f54cb97a 6304 const Off_t offset = PerlIO_tell(fp);
58f1856e 6305 if (offset != (Off_t) -1 && st.st_size + append > offset) {
e468d35b
NIS
6306 (void) SvGROW(sv, (STRLEN)((st.st_size - offset) + append + 1));
6307 }
6308 }
c07a80fd 6309 rsptr = NULL;
6310 rslen = 0;
6311 }
3280af22 6312 else if (RsRECORD(PL_rs)) {
e311fd51 6313 I32 bytesread;
5b2b9c68 6314 char *buffer;
acbd132f 6315 U32 recsize;
5b2b9c68
HM
6316
6317 /* Grab the size of the record we're getting */
acbd132f 6318 recsize = SvUV(SvRV(PL_rs)); /* RsRECORD() guarantees > 0. */
e311fd51 6319 buffer = SvGROW(sv, (STRLEN)(recsize + append + 1)) + append;
5b2b9c68
HM
6320 /* Go yank in */
6321#ifdef VMS
6322 /* VMS wants read instead of fread, because fread doesn't respect */
6323 /* RMS record boundaries. This is not necessarily a good thing to be */
e468d35b
NIS
6324 /* doing, but we've got no other real choice - except avoid stdio
6325 as implementation - perhaps write a :vms layer ?
6326 */
5b2b9c68
HM
6327 bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
6328#else
6329 bytesread = PerlIO_read(fp, buffer, recsize);
6330#endif
27e6ca2d
AE
6331 if (bytesread < 0)
6332 bytesread = 0;
e311fd51 6333 SvCUR_set(sv, bytesread += append);
e670df4e 6334 buffer[bytesread] = '\0';
efd8b2ba 6335 goto return_string_or_null;
5b2b9c68 6336 }
3280af22 6337 else if (RsPARA(PL_rs)) {
c07a80fd 6338 rsptr = "\n\n";
6339 rslen = 2;
8bfdd7d9 6340 rspara = 1;
c07a80fd 6341 }
7d59b7e4
NIS
6342 else {
6343 /* Get $/ i.e. PL_rs into same encoding as stream wants */
6344 if (PerlIO_isutf8(fp)) {
6345 rsptr = SvPVutf8(PL_rs, rslen);
6346 }
6347 else {
6348 if (SvUTF8(PL_rs)) {
6349 if (!sv_utf8_downgrade(PL_rs, TRUE)) {
6350 Perl_croak(aTHX_ "Wide character in $/");
6351 }
6352 }
93524f2b 6353 rsptr = SvPV_const(PL_rs, rslen);
7d59b7e4
NIS
6354 }
6355 }
6356
c07a80fd 6357 rslast = rslen ? rsptr[rslen - 1] : '\0';
6358
8bfdd7d9 6359 if (rspara) { /* have to do this both before and after */
79072805 6360 do { /* to make sure file boundaries work right */
760ac839 6361 if (PerlIO_eof(fp))
a0d0e21e 6362 return 0;
760ac839 6363 i = PerlIO_getc(fp);
79072805 6364 if (i != '\n') {
a0d0e21e
LW
6365 if (i == -1)
6366 return 0;
760ac839 6367 PerlIO_ungetc(fp,i);
79072805
LW
6368 break;
6369 }
6370 } while (i != EOF);
6371 }
c07a80fd 6372
760ac839
LW
6373 /* See if we know enough about I/O mechanism to cheat it ! */
6374
6375 /* This used to be #ifdef test - it is made run-time test for ease
1c846c1f 6376 of abstracting out stdio interface. One call should be cheap
760ac839
LW
6377 enough here - and may even be a macro allowing compile
6378 time optimization.
6379 */
6380
6381 if (PerlIO_fast_gets(fp)) {
6382
6383 /*
6384 * We're going to steal some values from the stdio struct
6385 * and put EVERYTHING in the innermost loop into registers.
6386 */
6387 register STDCHAR *ptr;
6388 STRLEN bpx;
6389 I32 shortbuffered;
6390
16660edb 6391#if defined(VMS) && defined(PERLIO_IS_STDIO)
6392 /* An ungetc()d char is handled separately from the regular
6393 * buffer, so we getc() it back out and stuff it in the buffer.
6394 */
6395 i = PerlIO_getc(fp);
6396 if (i == EOF) return 0;
6397 *(--((*fp)->_ptr)) = (unsigned char) i;
6398 (*fp)->_cnt++;
6399#endif
c07a80fd 6400
c2960299 6401 /* Here is some breathtakingly efficient cheating */
c07a80fd 6402
a20bf0c3 6403 cnt = PerlIO_get_cnt(fp); /* get count into register */
e468d35b 6404 /* make sure we have the room */
7a5fa8a2 6405 if ((I32)(SvLEN(sv) - append) <= cnt + 1) {
e468d35b 6406 /* Not room for all of it
7a5fa8a2 6407 if we are looking for a separator and room for some
e468d35b
NIS
6408 */
6409 if (rslen && cnt > 80 && (I32)SvLEN(sv) > append) {
7a5fa8a2 6410 /* just process what we have room for */
79072805
LW
6411 shortbuffered = cnt - SvLEN(sv) + append + 1;
6412 cnt -= shortbuffered;
6413 }
6414 else {
6415 shortbuffered = 0;
bbce6d69 6416 /* remember that cnt can be negative */
eb160463 6417 SvGROW(sv, (STRLEN)(append + (cnt <= 0 ? 2 : (cnt + 1))));
79072805
LW
6418 }
6419 }
7a5fa8a2 6420 else
79072805 6421 shortbuffered = 0;
3f7c398e 6422 bp = (STDCHAR*)SvPVX_const(sv) + append; /* move these two too to registers */
a20bf0c3 6423 ptr = (STDCHAR*)PerlIO_get_ptr(fp);
16660edb 6424 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6425 "Screamer: entering, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
16660edb 6426 DEBUG_P(PerlIO_printf(Perl_debug_log,
ba7abf9d 6427 "Screamer: entering: PerlIO * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6428 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6429 PTR2UV(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
79072805
LW
6430 for (;;) {
6431 screamer:
93a17b20 6432 if (cnt > 0) {
c07a80fd 6433 if (rslen) {
760ac839
LW
6434 while (cnt > 0) { /* this | eat */
6435 cnt--;
c07a80fd 6436 if ((*bp++ = *ptr++) == rslast) /* really | dust */
6437 goto thats_all_folks; /* screams | sed :-) */
6438 }
6439 }
6440 else {
1c846c1f
NIS
6441 Copy(ptr, bp, cnt, char); /* this | eat */
6442 bp += cnt; /* screams | dust */
c07a80fd 6443 ptr += cnt; /* louder | sed :-) */
a5f75d66 6444 cnt = 0;
93a17b20 6445 }
79072805
LW
6446 }
6447
748a9306 6448 if (shortbuffered) { /* oh well, must extend */
79072805
LW
6449 cnt = shortbuffered;
6450 shortbuffered = 0;
3f7c398e 6451 bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
79072805
LW
6452 SvCUR_set(sv, bpx);
6453 SvGROW(sv, SvLEN(sv) + append + cnt + 2);
3f7c398e 6454 bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
79072805
LW
6455 continue;
6456 }
6457
16660edb 6458 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841
GS
6459 "Screamer: going to getc, ptr=%"UVuf", cnt=%ld\n",
6460 PTR2UV(ptr),(long)cnt));
cc00df79 6461 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* deregisterize cnt and ptr */
ba7abf9d 6462#if 0
16660edb 6463 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6464 "Screamer: pre: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6465 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6466 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 6467#endif
1c846c1f 6468 /* This used to call 'filbuf' in stdio form, but as that behaves like
774d564b 6469 getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
6470 another abstraction. */
760ac839 6471 i = PerlIO_getc(fp); /* get more characters */
ba7abf9d 6472#if 0
16660edb 6473 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6474 "Screamer: post: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6475 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6476 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
ba7abf9d 6477#endif
a20bf0c3
JH
6478 cnt = PerlIO_get_cnt(fp);
6479 ptr = (STDCHAR*)PerlIO_get_ptr(fp); /* reregisterize cnt and ptr */
16660edb 6480 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6481 "Screamer: after getc, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
79072805 6482
748a9306
LW
6483 if (i == EOF) /* all done for ever? */
6484 goto thats_really_all_folks;
6485
3f7c398e 6486 bpx = bp - (STDCHAR*)SvPVX_const(sv); /* box up before relocation */
79072805
LW
6487 SvCUR_set(sv, bpx);
6488 SvGROW(sv, bpx + cnt + 2);
3f7c398e 6489 bp = (STDCHAR*)SvPVX_const(sv) + bpx; /* unbox after relocation */
c07a80fd 6490
eb160463 6491 *bp++ = (STDCHAR)i; /* store character from PerlIO_getc */
79072805 6492
c07a80fd 6493 if (rslen && (STDCHAR)i == rslast) /* all done for now? */
79072805 6494 goto thats_all_folks;
79072805
LW
6495 }
6496
6497thats_all_folks:
3f7c398e 6498 if ((rslen > 1 && (STRLEN)(bp - (STDCHAR*)SvPVX_const(sv)) < rslen) ||
36477c24 6499 memNE((char*)bp - rslen, rsptr, rslen))
760ac839 6500 goto screamer; /* go back to the fray */
79072805
LW
6501thats_really_all_folks:
6502 if (shortbuffered)
6503 cnt += shortbuffered;
16660edb 6504 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6505 "Screamer: quitting, ptr=%"UVuf", cnt=%ld\n",PTR2UV(ptr),(long)cnt));
cc00df79 6506 PerlIO_set_ptrcnt(fp, (STDCHAR*)ptr, cnt); /* put these back or we're in trouble */
16660edb 6507 DEBUG_P(PerlIO_printf(Perl_debug_log,
1d7c1841 6508 "Screamer: end: FILE * thinks ptr=%"UVuf", cnt=%ld, base=%"UVuf"\n",
1c846c1f 6509 PTR2UV(PerlIO_get_ptr(fp)), (long)PerlIO_get_cnt(fp),
1d7c1841 6510 PTR2UV(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
79072805 6511 *bp = '\0';
3f7c398e 6512 SvCUR_set(sv, bp - (STDCHAR*)SvPVX_const(sv)); /* set length */
16660edb 6513 DEBUG_P(PerlIO_printf(Perl_debug_log,
fb73857a 6514 "Screamer: done, len=%ld, string=|%.*s|\n",
3f7c398e 6515 (long)SvCUR(sv),(int)SvCUR(sv),SvPVX_const(sv)));
760ac839
LW
6516 }
6517 else
79072805 6518 {
6edd2cd5 6519 /*The big, slow, and stupid way. */
27da23d5 6520#ifdef USE_HEAP_INSTEAD_OF_STACK /* Even slower way. */
cbbf8932 6521 STDCHAR *buf = NULL;
a02a5408 6522 Newx(buf, 8192, STDCHAR);
6edd2cd5 6523 assert(buf);
4d2c4e07 6524#else
6edd2cd5 6525 STDCHAR buf[8192];
4d2c4e07 6526#endif
79072805 6527
760ac839 6528screamer2:
c07a80fd 6529 if (rslen) {
00b6aa41 6530 register const STDCHAR * const bpe = buf + sizeof(buf);
760ac839 6531 bp = buf;
eb160463 6532 while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = (STDCHAR)i) != rslast && bp < bpe)
760ac839
LW
6533 ; /* keep reading */
6534 cnt = bp - buf;
c07a80fd 6535 }
6536 else {
760ac839 6537 cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
16660edb 6538 /* Accomodate broken VAXC compiler, which applies U8 cast to
6539 * both args of ?: operator, causing EOF to change into 255
6540 */
37be0adf 6541 if (cnt > 0)
cbe9e203
JH
6542 i = (U8)buf[cnt - 1];
6543 else
37be0adf 6544 i = EOF;
c07a80fd 6545 }
79072805 6546
cbe9e203
JH
6547 if (cnt < 0)
6548 cnt = 0; /* we do need to re-set the sv even when cnt <= 0 */
6549 if (append)
6550 sv_catpvn(sv, (char *) buf, cnt);
6551 else
6552 sv_setpvn(sv, (char *) buf, cnt);
c07a80fd 6553
6554 if (i != EOF && /* joy */
6555 (!rslen ||
6556 SvCUR(sv) < rslen ||
3f7c398e 6557 memNE(SvPVX_const(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
79072805
LW
6558 {
6559 append = -1;
63e4d877
CS
6560 /*
6561 * If we're reading from a TTY and we get a short read,
6562 * indicating that the user hit his EOF character, we need
6563 * to notice it now, because if we try to read from the TTY
6564 * again, the EOF condition will disappear.
6565 *
6566 * The comparison of cnt to sizeof(buf) is an optimization
6567 * that prevents unnecessary calls to feof().
6568 *
6569 * - jik 9/25/96
6570 */
bb7a0f54 6571 if (!(cnt < (I32)sizeof(buf) && PerlIO_eof(fp)))
63e4d877 6572 goto screamer2;
79072805 6573 }
6edd2cd5 6574
27da23d5 6575#ifdef USE_HEAP_INSTEAD_OF_STACK
6edd2cd5
JH
6576 Safefree(buf);
6577#endif
79072805
LW
6578 }
6579
8bfdd7d9 6580 if (rspara) { /* have to do this both before and after */
c07a80fd 6581 while (i != EOF) { /* to make sure file boundaries work right */
760ac839 6582 i = PerlIO_getc(fp);
79072805 6583 if (i != '\n') {
760ac839 6584 PerlIO_ungetc(fp,i);
79072805
LW
6585 break;
6586 }
6587 }
6588 }
c07a80fd 6589
efd8b2ba 6590return_string_or_null:
bd61b366 6591 return (SvCUR(sv) - append) ? SvPVX(sv) : NULL;
79072805
LW
6592}
6593
954c1994
GS
6594/*
6595=for apidoc sv_inc
6596
645c22ef
DM
6597Auto-increment of the value in the SV, doing string to numeric conversion
6598if necessary. Handles 'get' magic.
954c1994
GS
6599
6600=cut
6601*/
6602
79072805 6603void
864dbfa3 6604Perl_sv_inc(pTHX_ register SV *sv)
79072805 6605{
97aff369 6606 dVAR;
79072805 6607 register char *d;
463ee0b2 6608 int flags;
79072805
LW
6609
6610 if (!sv)
6611 return;
5b295bef 6612 SvGETMAGIC(sv);
ed6116ce 6613 if (SvTHINKFIRST(sv)) {
765f542d
NC
6614 if (SvIsCOW(sv))
6615 sv_force_normal_flags(sv, 0);
0f15f207 6616 if (SvREADONLY(sv)) {
923e4eb5 6617 if (IN_PERL_RUNTIME)
cea2e8a9 6618 Perl_croak(aTHX_ PL_no_modify);
0f15f207 6619 }
a0d0e21e 6620 if (SvROK(sv)) {
b5be31e9 6621 IV i;
9e7bc3e8
JD
6622 if (SvAMAGIC(sv) && AMG_CALLun(sv,inc))
6623 return;
56431972 6624 i = PTR2IV(SvRV(sv));
b5be31e9
SM
6625 sv_unref(sv);
6626 sv_setiv(sv, i);
a0d0e21e 6627 }
ed6116ce 6628 }
8990e307 6629 flags = SvFLAGS(sv);
28e5dec8
JH
6630 if ((flags & (SVp_NOK|SVp_IOK)) == SVp_NOK) {
6631 /* It's (privately or publicly) a float, but not tested as an
6632 integer, so test it to see. */
d460ef45 6633 (void) SvIV(sv);
28e5dec8
JH
6634 flags = SvFLAGS(sv);
6635 }
6636 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6637 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 6638#ifdef PERL_PRESERVE_IVUV
28e5dec8 6639 oops_its_int:
59d8ce62 6640#endif
25da4f38
IZ
6641 if (SvIsUV(sv)) {
6642 if (SvUVX(sv) == UV_MAX)
a1e868e7 6643 sv_setnv(sv, UV_MAX_P1);
25da4f38
IZ
6644 else
6645 (void)SvIOK_only_UV(sv);
607fa7f2 6646 SvUV_set(sv, SvUVX(sv) + 1);
25da4f38
IZ
6647 } else {
6648 if (SvIVX(sv) == IV_MAX)
28e5dec8 6649 sv_setuv(sv, (UV)IV_MAX + 1);
25da4f38
IZ
6650 else {
6651 (void)SvIOK_only(sv);
45977657 6652 SvIV_set(sv, SvIVX(sv) + 1);
1c846c1f 6653 }
55497cff 6654 }
79072805
LW
6655 return;
6656 }
28e5dec8
JH
6657 if (flags & SVp_NOK) {
6658 (void)SvNOK_only(sv);
9d6ce603 6659 SvNV_set(sv, SvNVX(sv) + 1.0);
28e5dec8
JH
6660 return;
6661 }
6662
3f7c398e 6663 if (!(flags & SVp_POK) || !*SvPVX_const(sv)) {
28e5dec8 6664 if ((flags & SVTYPEMASK) < SVt_PVIV)
f5282e15 6665 sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV ? SVt_PVIV : SVt_IV));
28e5dec8 6666 (void)SvIOK_only(sv);
45977657 6667 SvIV_set(sv, 1);
79072805
LW
6668 return;
6669 }
463ee0b2 6670 d = SvPVX(sv);
79072805
LW
6671 while (isALPHA(*d)) d++;
6672 while (isDIGIT(*d)) d++;
6673 if (*d) {
28e5dec8 6674#ifdef PERL_PRESERVE_IVUV
d1be9408 6675 /* Got to punt this as an integer if needs be, but we don't issue
28e5dec8
JH
6676 warnings. Probably ought to make the sv_iv_please() that does
6677 the conversion if possible, and silently. */
504618e9 6678 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
28e5dec8
JH
6679 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6680 /* Need to try really hard to see if it's an integer.
6681 9.22337203685478e+18 is an integer.
6682 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6683 so $a="9.22337203685478e+18"; $a+0; $a++
6684 needs to be the same as $a="9.22337203685478e+18"; $a++
6685 or we go insane. */
d460ef45 6686
28e5dec8
JH
6687 (void) sv_2iv(sv);
6688 if (SvIOK(sv))
6689 goto oops_its_int;
6690
6691 /* sv_2iv *should* have made this an NV */
6692 if (flags & SVp_NOK) {
6693 (void)SvNOK_only(sv);
9d6ce603 6694 SvNV_set(sv, SvNVX(sv) + 1.0);
28e5dec8
JH
6695 return;
6696 }
6697 /* I don't think we can get here. Maybe I should assert this
6698 And if we do get here I suspect that sv_setnv will croak. NWC
6699 Fall through. */
6700#if defined(USE_LONG_DOUBLE)
6701 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 6702 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8 6703#else
1779d84d 6704 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 6705 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8
JH
6706#endif
6707 }
6708#endif /* PERL_PRESERVE_IVUV */
3f7c398e 6709 sv_setnv(sv,Atof(SvPVX_const(sv)) + 1.0);
79072805
LW
6710 return;
6711 }
6712 d--;
3f7c398e 6713 while (d >= SvPVX_const(sv)) {
79072805
LW
6714 if (isDIGIT(*d)) {
6715 if (++*d <= '9')
6716 return;
6717 *(d--) = '0';
6718 }
6719 else {
9d116dd7
JH
6720#ifdef EBCDIC
6721 /* MKS: The original code here died if letters weren't consecutive.
6722 * at least it didn't have to worry about non-C locales. The
6723 * new code assumes that ('z'-'a')==('Z'-'A'), letters are
1c846c1f 6724 * arranged in order (although not consecutively) and that only
9d116dd7
JH
6725 * [A-Za-z] are accepted by isALPHA in the C locale.
6726 */
6727 if (*d != 'z' && *d != 'Z') {
6728 do { ++*d; } while (!isALPHA(*d));
6729 return;
6730 }
6731 *(d--) -= 'z' - 'a';
6732#else
79072805
LW
6733 ++*d;
6734 if (isALPHA(*d))
6735 return;
6736 *(d--) -= 'z' - 'a' + 1;
9d116dd7 6737#endif
79072805
LW
6738 }
6739 }
6740 /* oh,oh, the number grew */
6741 SvGROW(sv, SvCUR(sv) + 2);
b162af07 6742 SvCUR_set(sv, SvCUR(sv) + 1);
3f7c398e 6743 for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX_const(sv); d--)
79072805
LW
6744 *d = d[-1];
6745 if (isDIGIT(d[1]))
6746 *d = '1';
6747 else
6748 *d = d[1];
6749}
6750
954c1994
GS
6751/*
6752=for apidoc sv_dec
6753
645c22ef
DM
6754Auto-decrement of the value in the SV, doing string to numeric conversion
6755if necessary. Handles 'get' magic.
954c1994
GS
6756
6757=cut
6758*/
6759
79072805 6760void
864dbfa3 6761Perl_sv_dec(pTHX_ register SV *sv)
79072805 6762{
97aff369 6763 dVAR;
463ee0b2
LW
6764 int flags;
6765
79072805
LW
6766 if (!sv)
6767 return;
5b295bef 6768 SvGETMAGIC(sv);
ed6116ce 6769 if (SvTHINKFIRST(sv)) {
765f542d
NC
6770 if (SvIsCOW(sv))
6771 sv_force_normal_flags(sv, 0);
0f15f207 6772 if (SvREADONLY(sv)) {
923e4eb5 6773 if (IN_PERL_RUNTIME)
cea2e8a9 6774 Perl_croak(aTHX_ PL_no_modify);
0f15f207 6775 }
a0d0e21e 6776 if (SvROK(sv)) {
b5be31e9 6777 IV i;
9e7bc3e8
JD
6778 if (SvAMAGIC(sv) && AMG_CALLun(sv,dec))
6779 return;
56431972 6780 i = PTR2IV(SvRV(sv));
b5be31e9
SM
6781 sv_unref(sv);
6782 sv_setiv(sv, i);
a0d0e21e 6783 }
ed6116ce 6784 }
28e5dec8
JH
6785 /* Unlike sv_inc we don't have to worry about string-never-numbers
6786 and keeping them magic. But we mustn't warn on punting */
8990e307 6787 flags = SvFLAGS(sv);
28e5dec8
JH
6788 if ((flags & SVf_IOK) || ((flags & (SVp_IOK | SVp_NOK)) == SVp_IOK)) {
6789 /* It's publicly an integer, or privately an integer-not-float */
59d8ce62 6790#ifdef PERL_PRESERVE_IVUV
28e5dec8 6791 oops_its_int:
59d8ce62 6792#endif
25da4f38
IZ
6793 if (SvIsUV(sv)) {
6794 if (SvUVX(sv) == 0) {
6795 (void)SvIOK_only(sv);
45977657 6796 SvIV_set(sv, -1);
25da4f38
IZ
6797 }
6798 else {
6799 (void)SvIOK_only_UV(sv);
f4eee32f 6800 SvUV_set(sv, SvUVX(sv) - 1);
1c846c1f 6801 }
25da4f38
IZ
6802 } else {
6803 if (SvIVX(sv) == IV_MIN)
65202027 6804 sv_setnv(sv, (NV)IV_MIN - 1.0);
25da4f38
IZ
6805 else {
6806 (void)SvIOK_only(sv);
45977657 6807 SvIV_set(sv, SvIVX(sv) - 1);
1c846c1f 6808 }
55497cff 6809 }
6810 return;
6811 }
28e5dec8 6812 if (flags & SVp_NOK) {
9d6ce603 6813 SvNV_set(sv, SvNVX(sv) - 1.0);
28e5dec8
JH
6814 (void)SvNOK_only(sv);
6815 return;
6816 }
8990e307 6817 if (!(flags & SVp_POK)) {
ef088171
NC
6818 if ((flags & SVTYPEMASK) < SVt_PVIV)
6819 sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV) ? SVt_PVIV : SVt_IV);
6820 SvIV_set(sv, -1);
6821 (void)SvIOK_only(sv);
79072805
LW
6822 return;
6823 }
28e5dec8
JH
6824#ifdef PERL_PRESERVE_IVUV
6825 {
504618e9 6826 const int numtype = grok_number(SvPVX_const(sv), SvCUR(sv), NULL);
28e5dec8
JH
6827 if (numtype && !(numtype & IS_NUMBER_INFINITY)) {
6828 /* Need to try really hard to see if it's an integer.
6829 9.22337203685478e+18 is an integer.
6830 but "9.22337203685478e+18" + 0 is UV=9223372036854779904
6831 so $a="9.22337203685478e+18"; $a+0; $a--
6832 needs to be the same as $a="9.22337203685478e+18"; $a--
6833 or we go insane. */
d460ef45 6834
28e5dec8
JH
6835 (void) sv_2iv(sv);
6836 if (SvIOK(sv))
6837 goto oops_its_int;
6838
6839 /* sv_2iv *should* have made this an NV */
6840 if (flags & SVp_NOK) {
6841 (void)SvNOK_only(sv);
9d6ce603 6842 SvNV_set(sv, SvNVX(sv) - 1.0);
28e5dec8
JH
6843 return;
6844 }
6845 /* I don't think we can get here. Maybe I should assert this
6846 And if we do get here I suspect that sv_setnv will croak. NWC
6847 Fall through. */
6848#if defined(USE_LONG_DOUBLE)
6849 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 6850 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8 6851#else
1779d84d 6852 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 6853 SvPVX_const(sv), SvIVX(sv), SvNVX(sv)));
28e5dec8
JH
6854#endif
6855 }
6856 }
6857#endif /* PERL_PRESERVE_IVUV */
3f7c398e 6858 sv_setnv(sv,Atof(SvPVX_const(sv)) - 1.0); /* punt */
79072805
LW
6859}
6860
954c1994
GS
6861/*
6862=for apidoc sv_mortalcopy
6863
645c22ef 6864Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
d4236ebc
DM
6865The new SV is marked as mortal. It will be destroyed "soon", either by an
6866explicit call to FREETMPS, or by an implicit call at places such as
6867statement boundaries. See also C<sv_newmortal> and C<sv_2mortal>.
954c1994
GS
6868
6869=cut
6870*/
6871
79072805
LW
6872/* Make a string that will exist for the duration of the expression
6873 * evaluation. Actually, it may have to last longer than that, but
6874 * hopefully we won't free it until it has been assigned to a
6875 * permanent location. */
6876
6877SV *
864dbfa3 6878Perl_sv_mortalcopy(pTHX_ SV *oldstr)
79072805 6879{
97aff369 6880 dVAR;
463ee0b2 6881 register SV *sv;
b881518d 6882
4561caa4 6883 new_SV(sv);
79072805 6884 sv_setsv(sv,oldstr);
677b06e3
GS
6885 EXTEND_MORTAL(1);
6886 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307
LW
6887 SvTEMP_on(sv);
6888 return sv;
6889}
6890
954c1994
GS
6891/*
6892=for apidoc sv_newmortal
6893
645c22ef 6894Creates a new null SV which is mortal. The reference count of the SV is
d4236ebc
DM
6895set to 1. It will be destroyed "soon", either by an explicit call to
6896FREETMPS, or by an implicit call at places such as statement boundaries.
6897See also C<sv_mortalcopy> and C<sv_2mortal>.
954c1994
GS
6898
6899=cut
6900*/
6901
8990e307 6902SV *
864dbfa3 6903Perl_sv_newmortal(pTHX)
8990e307 6904{
97aff369 6905 dVAR;
8990e307
LW
6906 register SV *sv;
6907
4561caa4 6908 new_SV(sv);
8990e307 6909 SvFLAGS(sv) = SVs_TEMP;
677b06e3
GS
6910 EXTEND_MORTAL(1);
6911 PL_tmps_stack[++PL_tmps_ix] = sv;
79072805
LW
6912 return sv;
6913}
6914
954c1994
GS
6915/*
6916=for apidoc sv_2mortal
6917
d4236ebc
DM
6918Marks an existing SV as mortal. The SV will be destroyed "soon", either
6919by an explicit call to FREETMPS, or by an implicit call at places such as
37d2ac18
NC
6920statement boundaries. SvTEMP() is turned on which means that the SV's
6921string buffer can be "stolen" if this SV is copied. See also C<sv_newmortal>
6922and C<sv_mortalcopy>.
954c1994
GS
6923
6924=cut
6925*/
6926
79072805 6927SV *
864dbfa3 6928Perl_sv_2mortal(pTHX_ register SV *sv)
79072805 6929{
27da23d5 6930 dVAR;
79072805 6931 if (!sv)
7a5b473e 6932 return NULL;
d689ffdd 6933 if (SvREADONLY(sv) && SvIMMORTAL(sv))
11162842 6934 return sv;
677b06e3
GS
6935 EXTEND_MORTAL(1);
6936 PL_tmps_stack[++PL_tmps_ix] = sv;
8990e307 6937 SvTEMP_on(sv);
79072805
LW
6938 return sv;
6939}
6940
954c1994
GS
6941/*
6942=for apidoc newSVpv
6943
6944Creates a new SV and copies a string into it. The reference count for the
6945SV is set to 1. If C<len> is zero, Perl will compute the length using
6946strlen(). For efficiency, consider using C<newSVpvn> instead.
6947
6948=cut
6949*/
6950
79072805 6951SV *
864dbfa3 6952Perl_newSVpv(pTHX_ const char *s, STRLEN len)
79072805 6953{
97aff369 6954 dVAR;
463ee0b2 6955 register SV *sv;
79072805 6956
4561caa4 6957 new_SV(sv);
ddfa59c7 6958 sv_setpvn(sv, s, len || s == NULL ? len : strlen(s));
79072805
LW
6959 return sv;
6960}
6961
954c1994
GS
6962/*
6963=for apidoc newSVpvn
6964
6965Creates a new SV and copies a string into it. The reference count for the
1c846c1f 6966SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
954c1994 6967string. You are responsible for ensuring that the source string is at least
9e09f5f2 6968C<len> bytes long. If the C<s> argument is NULL the new SV will be undefined.
954c1994
GS
6969
6970=cut
6971*/
6972
9da1e3b5 6973SV *
864dbfa3 6974Perl_newSVpvn(pTHX_ const char *s, STRLEN len)
9da1e3b5 6975{
97aff369 6976 dVAR;
9da1e3b5
MUN
6977 register SV *sv;
6978
6979 new_SV(sv);
9da1e3b5
MUN
6980 sv_setpvn(sv,s,len);
6981 return sv;
6982}
6983
bd08039b
NC
6984
6985/*
926f8064 6986=for apidoc newSVhek
bd08039b
NC
6987
6988Creates a new SV from the hash key structure. It will generate scalars that
5aaec2b4
NC
6989point to the shared string table where possible. Returns a new (undefined)
6990SV if the hek is NULL.
bd08039b
NC
6991
6992=cut
6993*/
6994
6995SV *
c1b02ed8 6996Perl_newSVhek(pTHX_ const HEK *hek)
bd08039b 6997{
97aff369 6998 dVAR;
5aaec2b4
NC
6999 if (!hek) {
7000 SV *sv;
7001
7002 new_SV(sv);
7003 return sv;
7004 }
7005
bd08039b
NC
7006 if (HEK_LEN(hek) == HEf_SVKEY) {
7007 return newSVsv(*(SV**)HEK_KEY(hek));
7008 } else {
7009 const int flags = HEK_FLAGS(hek);
7010 if (flags & HVhek_WASUTF8) {
7011 /* Trouble :-)
7012 Andreas would like keys he put in as utf8 to come back as utf8
7013 */
7014 STRLEN utf8_len = HEK_LEN(hek);
b64e5050
AL
7015 const U8 *as_utf8 = bytes_to_utf8 ((U8*)HEK_KEY(hek), &utf8_len);
7016 SV * const sv = newSVpvn ((const char*)as_utf8, utf8_len);
bd08039b
NC
7017
7018 SvUTF8_on (sv);
7019 Safefree (as_utf8); /* bytes_to_utf8() allocates a new string */
7020 return sv;
45e34800 7021 } else if (flags & (HVhek_REHASH|HVhek_UNSHARED)) {
bd08039b
NC
7022 /* We don't have a pointer to the hv, so we have to replicate the
7023 flag into every HEK. This hv is using custom a hasing
7024 algorithm. Hence we can't return a shared string scalar, as
7025 that would contain the (wrong) hash value, and might get passed
45e34800
NC
7026 into an hv routine with a regular hash.
7027 Similarly, a hash that isn't using shared hash keys has to have
7028 the flag in every key so that we know not to try to call
7029 share_hek_kek on it. */
bd08039b 7030
b64e5050 7031 SV * const sv = newSVpvn (HEK_KEY(hek), HEK_LEN(hek));
bd08039b
NC
7032 if (HEK_UTF8(hek))
7033 SvUTF8_on (sv);
7034 return sv;
7035 }
7036 /* This will be overwhelminly the most common case. */
409dfe77
NC
7037 {
7038 /* Inline most of newSVpvn_share(), because share_hek_hek() is far
7039 more efficient than sharepvn(). */
7040 SV *sv;
7041
7042 new_SV(sv);
7043 sv_upgrade(sv, SVt_PV);
7044 SvPV_set(sv, (char *)HEK_KEY(share_hek_hek(hek)));
7045 SvCUR_set(sv, HEK_LEN(hek));
7046 SvLEN_set(sv, 0);
7047 SvREADONLY_on(sv);
7048 SvFAKE_on(sv);
7049 SvPOK_on(sv);
7050 if (HEK_UTF8(hek))
7051 SvUTF8_on(sv);
7052 return sv;
7053 }
bd08039b
NC
7054 }
7055}
7056
1c846c1f
NIS
7057/*
7058=for apidoc newSVpvn_share
7059
3f7c398e 7060Creates a new SV with its SvPVX_const pointing to a shared string in the string
645c22ef
DM
7061table. If the string does not already exist in the table, it is created
7062first. Turns on READONLY and FAKE. The string's hash is stored in the UV
7063slot of the SV; if the C<hash> parameter is non-zero, that value is used;
7064otherwise the hash is computed. The idea here is that as the string table
3f7c398e 7065is used for shared hash keys these strings will have SvPVX_const == HeKEY and
645c22ef 7066hash lookup will avoid string compare.
1c846c1f
NIS
7067
7068=cut
7069*/
7070
7071SV *
c3654f1a 7072Perl_newSVpvn_share(pTHX_ const char *src, I32 len, U32 hash)
1c846c1f 7073{
97aff369 7074 dVAR;
1c846c1f 7075 register SV *sv;
c3654f1a 7076 bool is_utf8 = FALSE;
a51caccf
NC
7077 const char *const orig_src = src;
7078
c3654f1a 7079 if (len < 0) {
77caf834 7080 STRLEN tmplen = -len;
c3654f1a 7081 is_utf8 = TRUE;
75a54232 7082 /* See the note in hv.c:hv_fetch() --jhi */
e1ec3a88 7083 src = (char*)bytes_from_utf8((const U8*)src, &tmplen, &is_utf8);
75a54232
JH
7084 len = tmplen;
7085 }
1c846c1f 7086 if (!hash)
5afd6d42 7087 PERL_HASH(hash, src, len);
1c846c1f 7088 new_SV(sv);
bdd68bc3 7089 sv_upgrade(sv, SVt_PV);
f880fe2f 7090 SvPV_set(sv, sharepvn(src, is_utf8?-len:len, hash));
b162af07 7091 SvCUR_set(sv, len);
b162af07 7092 SvLEN_set(sv, 0);
1c846c1f
NIS
7093 SvREADONLY_on(sv);
7094 SvFAKE_on(sv);
7095 SvPOK_on(sv);
c3654f1a
IH
7096 if (is_utf8)
7097 SvUTF8_on(sv);
a51caccf
NC
7098 if (src != orig_src)
7099 Safefree(src);
1c846c1f
NIS
7100 return sv;
7101}
7102
645c22ef 7103
cea2e8a9 7104#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
7105
7106/* pTHX_ magic can't cope with varargs, so this is a no-context
7107 * version of the main function, (which may itself be aliased to us).
7108 * Don't access this version directly.
7109 */
7110
46fc3d4c 7111SV *
cea2e8a9 7112Perl_newSVpvf_nocontext(const char* pat, ...)
46fc3d4c 7113{
cea2e8a9 7114 dTHX;
46fc3d4c 7115 register SV *sv;
7116 va_list args;
46fc3d4c 7117 va_start(args, pat);
c5be433b 7118 sv = vnewSVpvf(pat, &args);
46fc3d4c 7119 va_end(args);
7120 return sv;
7121}
cea2e8a9 7122#endif
46fc3d4c 7123
954c1994
GS
7124/*
7125=for apidoc newSVpvf
7126
645c22ef 7127Creates a new SV and initializes it with the string formatted like
954c1994
GS
7128C<sprintf>.
7129
7130=cut
7131*/
7132
cea2e8a9
GS
7133SV *
7134Perl_newSVpvf(pTHX_ const char* pat, ...)
7135{
7136 register SV *sv;
7137 va_list args;
cea2e8a9 7138 va_start(args, pat);
c5be433b 7139 sv = vnewSVpvf(pat, &args);
cea2e8a9
GS
7140 va_end(args);
7141 return sv;
7142}
46fc3d4c 7143
645c22ef
DM
7144/* backend for newSVpvf() and newSVpvf_nocontext() */
7145
79072805 7146SV *
c5be433b
GS
7147Perl_vnewSVpvf(pTHX_ const char* pat, va_list* args)
7148{
97aff369 7149 dVAR;
c5be433b
GS
7150 register SV *sv;
7151 new_SV(sv);
4608196e 7152 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
c5be433b
GS
7153 return sv;
7154}
7155
954c1994
GS
7156/*
7157=for apidoc newSVnv
7158
7159Creates a new SV and copies a floating point value into it.
7160The reference count for the SV is set to 1.
7161
7162=cut
7163*/
7164
c5be433b 7165SV *
65202027 7166Perl_newSVnv(pTHX_ NV n)
79072805 7167{
97aff369 7168 dVAR;
463ee0b2 7169 register SV *sv;
79072805 7170
4561caa4 7171 new_SV(sv);
79072805
LW
7172 sv_setnv(sv,n);
7173 return sv;
7174}
7175
954c1994
GS
7176/*
7177=for apidoc newSViv
7178
7179Creates a new SV and copies an integer into it. The reference count for the
7180SV is set to 1.
7181
7182=cut
7183*/
7184
79072805 7185SV *
864dbfa3 7186Perl_newSViv(pTHX_ IV i)
79072805 7187{
97aff369 7188 dVAR;
463ee0b2 7189 register SV *sv;
79072805 7190
4561caa4 7191 new_SV(sv);
79072805
LW
7192 sv_setiv(sv,i);
7193 return sv;
7194}
7195
954c1994 7196/*
1a3327fb
JH
7197=for apidoc newSVuv
7198
7199Creates a new SV and copies an unsigned integer into it.
7200The reference count for the SV is set to 1.
7201
7202=cut
7203*/
7204
7205SV *
7206Perl_newSVuv(pTHX_ UV u)
7207{
97aff369 7208 dVAR;
1a3327fb
JH
7209 register SV *sv;
7210
7211 new_SV(sv);
7212 sv_setuv(sv,u);
7213 return sv;
7214}
7215
7216/*
b9f83d2f
NC
7217=for apidoc newSV_type
7218
7219Creates a new SV, of the type specificied. The reference count for the new SV
7220is set to 1.
7221
7222=cut
7223*/
7224
7225SV *
7226Perl_newSV_type(pTHX_ svtype type)
7227{
7228 register SV *sv;
7229
7230 new_SV(sv);
7231 sv_upgrade(sv, type);
7232 return sv;
7233}
7234
7235/*
954c1994
GS
7236=for apidoc newRV_noinc
7237
7238Creates an RV wrapper for an SV. The reference count for the original
7239SV is B<not> incremented.
7240
7241=cut
7242*/
7243
2304df62 7244SV *
864dbfa3 7245Perl_newRV_noinc(pTHX_ SV *tmpRef)
2304df62 7246{
97aff369 7247 dVAR;
b9f83d2f 7248 register SV *sv = newSV_type(SVt_RV);
76e3520e 7249 SvTEMP_off(tmpRef);
b162af07 7250 SvRV_set(sv, tmpRef);
2304df62 7251 SvROK_on(sv);
2304df62
AD
7252 return sv;
7253}
7254
ff276b08 7255/* newRV_inc is the official function name to use now.
645c22ef
DM
7256 * newRV_inc is in fact #defined to newRV in sv.h
7257 */
7258
5f05dabc 7259SV *
7f466ec7 7260Perl_newRV(pTHX_ SV *sv)
5f05dabc 7261{
97aff369 7262 dVAR;
7f466ec7 7263 return newRV_noinc(SvREFCNT_inc_simple_NN(sv));
5f05dabc 7264}
5f05dabc 7265
954c1994
GS
7266/*
7267=for apidoc newSVsv
7268
7269Creates a new SV which is an exact duplicate of the original SV.
645c22ef 7270(Uses C<sv_setsv>).
954c1994
GS
7271
7272=cut
7273*/
7274
79072805 7275SV *
864dbfa3 7276Perl_newSVsv(pTHX_ register SV *old)
79072805 7277{
97aff369 7278 dVAR;
463ee0b2 7279 register SV *sv;
79072805
LW
7280
7281 if (!old)
7a5b473e 7282 return NULL;
8990e307 7283 if (SvTYPE(old) == SVTYPEMASK) {
0453d815 7284 if (ckWARN_d(WARN_INTERNAL))
9014280d 7285 Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "semi-panic: attempt to dup freed string");
a0714e2c 7286 return NULL;
79072805 7287 }
4561caa4 7288 new_SV(sv);
e90aabeb
NC
7289 /* SV_GMAGIC is the default for sv_setv()
7290 SV_NOSTEAL prevents TEMP buffers being, well, stolen, and saves games
7291 with SvTEMP_off and SvTEMP_on round a call to sv_setsv. */
7292 sv_setsv_flags(sv, old, SV_GMAGIC | SV_NOSTEAL);
463ee0b2 7293 return sv;
79072805
LW
7294}
7295
645c22ef
DM
7296/*
7297=for apidoc sv_reset
7298
7299Underlying implementation for the C<reset> Perl function.
7300Note that the perl-level function is vaguely deprecated.
7301
7302=cut
7303*/
7304
79072805 7305void
e1ec3a88 7306Perl_sv_reset(pTHX_ register const char *s, HV *stash)
79072805 7307{
27da23d5 7308 dVAR;
4802d5d7 7309 char todo[PERL_UCHAR_MAX+1];
79072805 7310
49d8d3a1
MB
7311 if (!stash)
7312 return;
7313
79072805 7314 if (!*s) { /* reset ?? searches */
aec46f14 7315 MAGIC * const mg = mg_find((SV *)stash, PERL_MAGIC_symtab);
8d2f4536 7316 if (mg) {
c2b1997a
NC
7317 const U32 count = mg->mg_len / sizeof(PMOP**);
7318 PMOP **pmp = (PMOP**) mg->mg_ptr;
7319 PMOP *const *const end = pmp + count;
7320
7321 while (pmp < end) {
c737faaf 7322#ifdef USE_ITHREADS
c2b1997a 7323 SvREADONLY_off(PL_regex_pad[(*pmp)->op_pmoffset]);
c737faaf 7324#else
c2b1997a 7325 (*pmp)->op_pmflags &= ~PMf_USED;
c737faaf 7326#endif
c2b1997a 7327 ++pmp;
8d2f4536 7328 }
79072805
LW
7329 }
7330 return;
7331 }
7332
7333 /* reset variables */
7334
7335 if (!HvARRAY(stash))
7336 return;
463ee0b2
LW
7337
7338 Zero(todo, 256, char);
79072805 7339 while (*s) {
b464bac0
AL
7340 I32 max;
7341 I32 i = (unsigned char)*s;
79072805
LW
7342 if (s[1] == '-') {
7343 s += 2;
7344 }
4802d5d7 7345 max = (unsigned char)*s++;
79072805 7346 for ( ; i <= max; i++) {
463ee0b2
LW
7347 todo[i] = 1;
7348 }
a0d0e21e 7349 for (i = 0; i <= (I32) HvMAX(stash); i++) {
b464bac0 7350 HE *entry;
79072805 7351 for (entry = HvARRAY(stash)[i];
9e35f4b3
GS
7352 entry;
7353 entry = HeNEXT(entry))
7354 {
b464bac0
AL
7355 register GV *gv;
7356 register SV *sv;
7357
1edc1566 7358 if (!todo[(U8)*HeKEY(entry)])
463ee0b2 7359 continue;
1edc1566 7360 gv = (GV*)HeVAL(entry);
79072805 7361 sv = GvSV(gv);
e203899d
NC
7362 if (sv) {
7363 if (SvTHINKFIRST(sv)) {
7364 if (!SvREADONLY(sv) && SvROK(sv))
7365 sv_unref(sv);
7366 /* XXX Is this continue a bug? Why should THINKFIRST
7367 exempt us from resetting arrays and hashes? */
7368 continue;
7369 }
7370 SvOK_off(sv);
7371 if (SvTYPE(sv) >= SVt_PV) {
7372 SvCUR_set(sv, 0);
bd61b366 7373 if (SvPVX_const(sv) != NULL)
e203899d
NC
7374 *SvPVX(sv) = '\0';
7375 SvTAINT(sv);
7376 }
79072805
LW
7377 }
7378 if (GvAV(gv)) {
7379 av_clear(GvAV(gv));
7380 }
bfcb3514 7381 if (GvHV(gv) && !HvNAME_get(GvHV(gv))) {
b0269e46
AB
7382#if defined(VMS)
7383 Perl_die(aTHX_ "Can't reset %%ENV on this system");
7384#else /* ! VMS */
463ee0b2 7385 hv_clear(GvHV(gv));
b0269e46
AB
7386# if defined(USE_ENVIRON_ARRAY)
7387 if (gv == PL_envgv)
7388 my_clearenv();
7389# endif /* USE_ENVIRON_ARRAY */
7390#endif /* VMS */
79072805
LW
7391 }
7392 }
7393 }
7394 }
7395}
7396
645c22ef
DM
7397/*
7398=for apidoc sv_2io
7399
7400Using various gambits, try to get an IO from an SV: the IO slot if its a
7401GV; or the recursive result if we're an RV; or the IO slot of the symbol
7402named after the PV if we're a string.
7403
7404=cut
7405*/
7406
46fc3d4c 7407IO*
864dbfa3 7408Perl_sv_2io(pTHX_ SV *sv)
46fc3d4c 7409{
7410 IO* io;
7411 GV* gv;
7412
7413 switch (SvTYPE(sv)) {
7414 case SVt_PVIO:
7415 io = (IO*)sv;
7416 break;
7417 case SVt_PVGV:
7418 gv = (GV*)sv;
7419 io = GvIO(gv);
7420 if (!io)
cea2e8a9 7421 Perl_croak(aTHX_ "Bad filehandle: %s", GvNAME(gv));
46fc3d4c 7422 break;
7423 default:
7424 if (!SvOK(sv))
cea2e8a9 7425 Perl_croak(aTHX_ PL_no_usym, "filehandle");
46fc3d4c 7426 if (SvROK(sv))
7427 return sv_2io(SvRV(sv));
f776e3cd 7428 gv = gv_fetchsv(sv, 0, SVt_PVIO);
46fc3d4c 7429 if (gv)
7430 io = GvIO(gv);
7431 else
7432 io = 0;
7433 if (!io)
be2597df 7434 Perl_croak(aTHX_ "Bad filehandle: %"SVf, SVfARG(sv));
46fc3d4c 7435 break;
7436 }
7437 return io;
7438}
7439
645c22ef
DM
7440/*
7441=for apidoc sv_2cv
7442
7443Using various gambits, try to get a CV from an SV; in addition, try if
7444possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
f2c0649b 7445The flags in C<lref> are passed to sv_fetchsv.
645c22ef
DM
7446
7447=cut
7448*/
7449
79072805 7450CV *
864dbfa3 7451Perl_sv_2cv(pTHX_ SV *sv, HV **st, GV **gvp, I32 lref)
79072805 7452{
27da23d5 7453 dVAR;
a0714e2c 7454 GV *gv = NULL;
601f1833 7455 CV *cv = NULL;
79072805 7456
85dec29a
NC
7457 if (!sv) {
7458 *st = NULL;
7459 *gvp = NULL;
7460 return NULL;
7461 }
79072805 7462 switch (SvTYPE(sv)) {
79072805
LW
7463 case SVt_PVCV:
7464 *st = CvSTASH(sv);
a0714e2c 7465 *gvp = NULL;
79072805
LW
7466 return (CV*)sv;
7467 case SVt_PVHV:
7468 case SVt_PVAV:
ef58ba18 7469 *st = NULL;
a0714e2c 7470 *gvp = NULL;
601f1833 7471 return NULL;
8990e307
LW
7472 case SVt_PVGV:
7473 gv = (GV*)sv;
a0d0e21e 7474 *gvp = gv;
8990e307
LW
7475 *st = GvESTASH(gv);
7476 goto fix_gv;
7477
79072805 7478 default:
5b295bef 7479 SvGETMAGIC(sv);
a0d0e21e 7480 if (SvROK(sv)) {
823a54a3 7481 SV * const *sp = &sv; /* Used in tryAMAGICunDEREF macro. */
f5284f61
IZ
7482 tryAMAGICunDEREF(to_cv);
7483
62f274bf
GS
7484 sv = SvRV(sv);
7485 if (SvTYPE(sv) == SVt_PVCV) {
7486 cv = (CV*)sv;
a0714e2c 7487 *gvp = NULL;
62f274bf
GS
7488 *st = CvSTASH(cv);
7489 return cv;
7490 }
7491 else if(isGV(sv))
7492 gv = (GV*)sv;
7493 else
cea2e8a9 7494 Perl_croak(aTHX_ "Not a subroutine reference");
a0d0e21e 7495 }
62f274bf 7496 else if (isGV(sv))
79072805
LW
7497 gv = (GV*)sv;
7498 else
7a5fd60d 7499 gv = gv_fetchsv(sv, lref, SVt_PVCV);
79072805 7500 *gvp = gv;
ef58ba18
NC
7501 if (!gv) {
7502 *st = NULL;
601f1833 7503 return NULL;
ef58ba18 7504 }
e26df76a
NC
7505 /* Some flags to gv_fetchsv mean don't really create the GV */
7506 if (SvTYPE(gv) != SVt_PVGV) {
7507 *st = NULL;
7508 return NULL;
7509 }
79072805 7510 *st = GvESTASH(gv);
8990e307 7511 fix_gv:
8ebc5c01 7512 if (lref && !GvCVu(gv)) {
4633a7c4 7513 SV *tmpsv;
748a9306 7514 ENTER;
561b68a9 7515 tmpsv = newSV(0);
bd61b366 7516 gv_efullname3(tmpsv, gv, NULL);
f6ec51f7
GS
7517 /* XXX this is probably not what they think they're getting.
7518 * It has the same effect as "sub name;", i.e. just a forward
7519 * declaration! */
774d564b 7520 newSUB(start_subparse(FALSE, 0),
4633a7c4 7521 newSVOP(OP_CONST, 0, tmpsv),
5f66b61c 7522 NULL, NULL);
748a9306 7523 LEAVE;
8ebc5c01 7524 if (!GvCVu(gv))
35c1215d 7525 Perl_croak(aTHX_ "Unable to create sub named \"%"SVf"\"",
be2597df 7526 SVfARG(sv));
8990e307 7527 }
8ebc5c01 7528 return GvCVu(gv);
79072805
LW
7529 }
7530}
7531
c461cf8f
JH
7532/*
7533=for apidoc sv_true
7534
7535Returns true if the SV has a true value by Perl's rules.
645c22ef
DM
7536Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
7537instead use an in-line version.
c461cf8f
JH
7538
7539=cut
7540*/
7541
79072805 7542I32
864dbfa3 7543Perl_sv_true(pTHX_ register SV *sv)
79072805 7544{
8990e307
LW
7545 if (!sv)
7546 return 0;
79072805 7547 if (SvPOK(sv)) {
823a54a3
AL
7548 register const XPV* const tXpv = (XPV*)SvANY(sv);
7549 if (tXpv &&
c2f1de04 7550 (tXpv->xpv_cur > 1 ||
339049b0 7551 (tXpv->xpv_cur && *sv->sv_u.svu_pv != '0')))
79072805
LW
7552 return 1;
7553 else
7554 return 0;
7555 }
7556 else {
7557 if (SvIOK(sv))
463ee0b2 7558 return SvIVX(sv) != 0;
79072805
LW
7559 else {
7560 if (SvNOK(sv))
463ee0b2 7561 return SvNVX(sv) != 0.0;
79072805 7562 else
463ee0b2 7563 return sv_2bool(sv);
79072805
LW
7564 }
7565 }
7566}
79072805 7567
645c22ef 7568/*
c461cf8f
JH
7569=for apidoc sv_pvn_force
7570
7571Get a sensible string out of the SV somehow.
645c22ef
DM
7572A private implementation of the C<SvPV_force> macro for compilers which
7573can't cope with complex macro expressions. Always use the macro instead.
c461cf8f 7574
8d6d96c1
HS
7575=for apidoc sv_pvn_force_flags
7576
7577Get a sensible string out of the SV somehow.
7578If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
7579appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
7580implemented in terms of this function.
645c22ef
DM
7581You normally want to use the various wrapper macros instead: see
7582C<SvPV_force> and C<SvPV_force_nomg>
8d6d96c1
HS
7583
7584=cut
7585*/
7586
7587char *
7588Perl_sv_pvn_force_flags(pTHX_ SV *sv, STRLEN *lp, I32 flags)
7589{
97aff369 7590 dVAR;
6fc92669 7591 if (SvTHINKFIRST(sv) && !SvROK(sv))
765f542d 7592 sv_force_normal_flags(sv, 0);
1c846c1f 7593
a0d0e21e 7594 if (SvPOK(sv)) {
13c5b33c
NC
7595 if (lp)
7596 *lp = SvCUR(sv);
a0d0e21e
LW
7597 }
7598 else {
a3b680e6 7599 char *s;
13c5b33c
NC
7600 STRLEN len;
7601
4d84ee25 7602 if (SvREADONLY(sv) && !(flags & SV_MUTABLE_RETURN)) {
b64e5050 7603 const char * const ref = sv_reftype(sv,0);
4d84ee25
NC
7604 if (PL_op)
7605 Perl_croak(aTHX_ "Can't coerce readonly %s to string in %s",
b64e5050 7606 ref, OP_NAME(PL_op));
4d84ee25 7607 else
b64e5050 7608 Perl_croak(aTHX_ "Can't coerce readonly %s to string", ref);
4d84ee25 7609 }
b64e5050 7610 if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM)
cea2e8a9 7611 Perl_croak(aTHX_ "Can't coerce %s to string in %s", sv_reftype(sv,0),
53e06cf0 7612 OP_NAME(PL_op));
b64e5050 7613 s = sv_2pv_flags(sv, &len, flags);
13c5b33c
NC
7614 if (lp)
7615 *lp = len;
7616
3f7c398e 7617 if (s != SvPVX_const(sv)) { /* Almost, but not quite, sv_setpvn() */
a0d0e21e
LW
7618 if (SvROK(sv))
7619 sv_unref(sv);
862a34c6 7620 SvUPGRADE(sv, SVt_PV); /* Never FALSE */
a0d0e21e 7621 SvGROW(sv, len + 1);
706aa1c9 7622 Move(s,SvPVX(sv),len,char);
a0d0e21e 7623 SvCUR_set(sv, len);
97a130b8 7624 SvPVX(sv)[len] = '\0';
a0d0e21e
LW
7625 }
7626 if (!SvPOK(sv)) {
7627 SvPOK_on(sv); /* validate pointer */
7628 SvTAINT(sv);
1d7c1841 7629 DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%"UVxf" 2pv(%s)\n",
3f7c398e 7630 PTR2UV(sv),SvPVX_const(sv)));
a0d0e21e
LW
7631 }
7632 }
4d84ee25 7633 return SvPVX_mutable(sv);
a0d0e21e
LW
7634}
7635
645c22ef 7636/*
645c22ef
DM
7637=for apidoc sv_pvbyten_force
7638
0feed65a 7639The backend for the C<SvPVbytex_force> macro. Always use the macro instead.
645c22ef
DM
7640
7641=cut
7642*/
7643
7340a771
GS
7644char *
7645Perl_sv_pvbyten_force(pTHX_ SV *sv, STRLEN *lp)
7646{
46ec2f14 7647 sv_pvn_force(sv,lp);
ffebcc3e 7648 sv_utf8_downgrade(sv,0);
46ec2f14
TS
7649 *lp = SvCUR(sv);
7650 return SvPVX(sv);
7340a771
GS
7651}
7652
645c22ef 7653/*
c461cf8f
JH
7654=for apidoc sv_pvutf8n_force
7655
0feed65a 7656The backend for the C<SvPVutf8x_force> macro. Always use the macro instead.
c461cf8f
JH
7657
7658=cut
7659*/
7660
7340a771
GS
7661char *
7662Perl_sv_pvutf8n_force(pTHX_ SV *sv, STRLEN *lp)
7663{
46ec2f14 7664 sv_pvn_force(sv,lp);
560a288e 7665 sv_utf8_upgrade(sv);
46ec2f14
TS
7666 *lp = SvCUR(sv);
7667 return SvPVX(sv);
7340a771
GS
7668}
7669
c461cf8f
JH
7670/*
7671=for apidoc sv_reftype
7672
7673Returns a string describing what the SV is a reference to.
7674
7675=cut
7676*/
7677
2b388283 7678const char *
bfed75c6 7679Perl_sv_reftype(pTHX_ const SV *sv, int ob)
a0d0e21e 7680{
07409e01
NC
7681 /* The fact that I don't need to downcast to char * everywhere, only in ?:
7682 inside return suggests a const propagation bug in g++. */
c86bf373 7683 if (ob && SvOBJECT(sv)) {
1b6737cc 7684 char * const name = HvNAME_get(SvSTASH(sv));
07409e01 7685 return name ? name : (char *) "__ANON__";
c86bf373 7686 }
a0d0e21e
LW
7687 else {
7688 switch (SvTYPE(sv)) {
7689 case SVt_NULL:
7690 case SVt_IV:
7691 case SVt_NV:
7692 case SVt_RV:
7693 case SVt_PV:
7694 case SVt_PVIV:
7695 case SVt_PVNV:
7696 case SVt_PVMG:
1cb0ed9b 7697 if (SvVOK(sv))
439cb1c4 7698 return "VSTRING";
a0d0e21e
LW
7699 if (SvROK(sv))
7700 return "REF";
7701 else
7702 return "SCALAR";
1cb0ed9b 7703
07409e01 7704 case SVt_PVLV: return (char *) (SvROK(sv) ? "REF"
be65207d
DM
7705 /* tied lvalues should appear to be
7706 * scalars for backwards compatitbility */
7707 : (LvTYPE(sv) == 't' || LvTYPE(sv) == 'T')
07409e01 7708 ? "SCALAR" : "LVALUE");
a0d0e21e
LW
7709 case SVt_PVAV: return "ARRAY";
7710 case SVt_PVHV: return "HASH";
7711 case SVt_PVCV: return "CODE";
7712 case SVt_PVGV: return "GLOB";
1d2dff63 7713 case SVt_PVFM: return "FORMAT";
27f9d8f3 7714 case SVt_PVIO: return "IO";
cecf5685 7715 case SVt_BIND: return "BIND";
a0d0e21e
LW
7716 default: return "UNKNOWN";
7717 }
7718 }
7719}
7720
954c1994
GS
7721/*
7722=for apidoc sv_isobject
7723
7724Returns a boolean indicating whether the SV is an RV pointing to a blessed
7725object. If the SV is not an RV, or if the object is not blessed, then this
7726will return false.
7727
7728=cut
7729*/
7730
463ee0b2 7731int
864dbfa3 7732Perl_sv_isobject(pTHX_ SV *sv)
85e6fe83 7733{
68dc0745 7734 if (!sv)
7735 return 0;
5b295bef 7736 SvGETMAGIC(sv);
85e6fe83
LW
7737 if (!SvROK(sv))
7738 return 0;
7739 sv = (SV*)SvRV(sv);
7740 if (!SvOBJECT(sv))
7741 return 0;
7742 return 1;
7743}
7744
954c1994
GS
7745/*
7746=for apidoc sv_isa
7747
7748Returns a boolean indicating whether the SV is blessed into the specified
7749class. This does not check for subtypes; use C<sv_derived_from> to verify
7750an inheritance relationship.
7751
7752=cut
7753*/
7754
85e6fe83 7755int
864dbfa3 7756Perl_sv_isa(pTHX_ SV *sv, const char *name)
463ee0b2 7757{
bfcb3514 7758 const char *hvname;
68dc0745 7759 if (!sv)
7760 return 0;
5b295bef 7761 SvGETMAGIC(sv);
ed6116ce 7762 if (!SvROK(sv))
463ee0b2 7763 return 0;
ed6116ce
LW
7764 sv = (SV*)SvRV(sv);
7765 if (!SvOBJECT(sv))
463ee0b2 7766 return 0;
bfcb3514
NC
7767 hvname = HvNAME_get(SvSTASH(sv));
7768 if (!hvname)
e27ad1f2 7769 return 0;
463ee0b2 7770
bfcb3514 7771 return strEQ(hvname, name);
463ee0b2
LW
7772}
7773
954c1994
GS
7774/*
7775=for apidoc newSVrv
7776
7777Creates a new SV for the RV, C<rv>, to point to. If C<rv> is not an RV then
7778it will be upgraded to one. If C<classname> is non-null then the new SV will
7779be blessed in the specified package. The new SV is returned and its
7780reference count is 1.
7781
7782=cut
7783*/
7784
463ee0b2 7785SV*
864dbfa3 7786Perl_newSVrv(pTHX_ SV *rv, const char *classname)
463ee0b2 7787{
97aff369 7788 dVAR;
463ee0b2
LW
7789 SV *sv;
7790
4561caa4 7791 new_SV(sv);
51cf62d8 7792
765f542d 7793 SV_CHECK_THINKFIRST_COW_DROP(rv);
52944de8 7794 (void)SvAMAGIC_off(rv);
51cf62d8 7795
0199fce9 7796 if (SvTYPE(rv) >= SVt_PVMG) {
a3b680e6 7797 const U32 refcnt = SvREFCNT(rv);
0199fce9
JD
7798 SvREFCNT(rv) = 0;
7799 sv_clear(rv);
7800 SvFLAGS(rv) = 0;
7801 SvREFCNT(rv) = refcnt;
0199fce9 7802
dc5494d2
NC
7803 sv_upgrade(rv, SVt_RV);
7804 } else if (SvROK(rv)) {
7805 SvREFCNT_dec(SvRV(rv));
7806 } else if (SvTYPE(rv) < SVt_RV)
0199fce9
JD
7807 sv_upgrade(rv, SVt_RV);
7808 else if (SvTYPE(rv) > SVt_RV) {
8bd4d4c5 7809 SvPV_free(rv);
0199fce9
JD
7810 SvCUR_set(rv, 0);
7811 SvLEN_set(rv, 0);
7812 }
51cf62d8 7813
0c34ef67 7814 SvOK_off(rv);
b162af07 7815 SvRV_set(rv, sv);
ed6116ce 7816 SvROK_on(rv);
463ee0b2 7817
a0d0e21e 7818 if (classname) {
da51bb9b 7819 HV* const stash = gv_stashpv(classname, GV_ADD);
a0d0e21e
LW
7820 (void)sv_bless(rv, stash);
7821 }
7822 return sv;
7823}
7824
954c1994
GS
7825/*
7826=for apidoc sv_setref_pv
7827
7828Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
7829argument will be upgraded to an RV. That RV will be modified to point to
7830the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
7831into the SV. The C<classname> argument indicates the package for the
bd61b366 7832blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 7833will have a reference count of 1, and the RV will be returned.
954c1994
GS
7834
7835Do not use with other Perl types such as HV, AV, SV, CV, because those
7836objects will become corrupted by the pointer copy process.
7837
7838Note that C<sv_setref_pvn> copies the string while this copies the pointer.
7839
7840=cut
7841*/
7842
a0d0e21e 7843SV*
864dbfa3 7844Perl_sv_setref_pv(pTHX_ SV *rv, const char *classname, void *pv)
a0d0e21e 7845{
97aff369 7846 dVAR;
189b2af5 7847 if (!pv) {
3280af22 7848 sv_setsv(rv, &PL_sv_undef);
189b2af5
GS
7849 SvSETMAGIC(rv);
7850 }
a0d0e21e 7851 else
56431972 7852 sv_setiv(newSVrv(rv,classname), PTR2IV(pv));
a0d0e21e
LW
7853 return rv;
7854}
7855
954c1994
GS
7856/*
7857=for apidoc sv_setref_iv
7858
7859Copies an integer into a new SV, optionally blessing the SV. The C<rv>
7860argument will be upgraded to an RV. That RV will be modified to point to
7861the new SV. The C<classname> argument indicates the package for the
bd61b366 7862blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 7863will have a reference count of 1, and the RV will be returned.
954c1994
GS
7864
7865=cut
7866*/
7867
a0d0e21e 7868SV*
864dbfa3 7869Perl_sv_setref_iv(pTHX_ SV *rv, const char *classname, IV iv)
a0d0e21e
LW
7870{
7871 sv_setiv(newSVrv(rv,classname), iv);
7872 return rv;
7873}
7874
954c1994 7875/*
e1c57cef
JH
7876=for apidoc sv_setref_uv
7877
7878Copies an unsigned integer into a new SV, optionally blessing the SV. The C<rv>
7879argument will be upgraded to an RV. That RV will be modified to point to
7880the new SV. The C<classname> argument indicates the package for the
bd61b366 7881blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 7882will have a reference count of 1, and the RV will be returned.
e1c57cef
JH
7883
7884=cut
7885*/
7886
7887SV*
7888Perl_sv_setref_uv(pTHX_ SV *rv, const char *classname, UV uv)
7889{
7890 sv_setuv(newSVrv(rv,classname), uv);
7891 return rv;
7892}
7893
7894/*
954c1994
GS
7895=for apidoc sv_setref_nv
7896
7897Copies a double into a new SV, optionally blessing the SV. The C<rv>
7898argument will be upgraded to an RV. That RV will be modified to point to
7899the new SV. The C<classname> argument indicates the package for the
bd61b366 7900blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
d34c2299 7901will have a reference count of 1, and the RV will be returned.
954c1994
GS
7902
7903=cut
7904*/
7905
a0d0e21e 7906SV*
65202027 7907Perl_sv_setref_nv(pTHX_ SV *rv, const char *classname, NV nv)
a0d0e21e
LW
7908{
7909 sv_setnv(newSVrv(rv,classname), nv);
7910 return rv;
7911}
463ee0b2 7912
954c1994
GS
7913/*
7914=for apidoc sv_setref_pvn
7915
7916Copies a string into a new SV, optionally blessing the SV. The length of the
7917string must be specified with C<n>. The C<rv> argument will be upgraded to
7918an RV. That RV will be modified to point to the new SV. The C<classname>
7919argument indicates the package for the blessing. Set C<classname> to
bd61b366 7920C<NULL> to avoid the blessing. The new SV will have a reference count
d34c2299 7921of 1, and the RV will be returned.
954c1994
GS
7922
7923Note that C<sv_setref_pv> copies the pointer while this copies the string.
7924
7925=cut
7926*/
7927
a0d0e21e 7928SV*
1b6737cc 7929Perl_sv_setref_pvn(pTHX_ SV *rv, const char *classname, const char *pv, STRLEN n)
a0d0e21e
LW
7930{
7931 sv_setpvn(newSVrv(rv,classname), pv, n);
463ee0b2
LW
7932 return rv;
7933}
7934
954c1994
GS
7935/*
7936=for apidoc sv_bless
7937
7938Blesses an SV into a specified package. The SV must be an RV. The package
7939must be designated by its stash (see C<gv_stashpv()>). The reference count
7940of the SV is unaffected.
7941
7942=cut
7943*/
7944
a0d0e21e 7945SV*
864dbfa3 7946Perl_sv_bless(pTHX_ SV *sv, HV *stash)
a0d0e21e 7947{
97aff369 7948 dVAR;
76e3520e 7949 SV *tmpRef;
a0d0e21e 7950 if (!SvROK(sv))
cea2e8a9 7951 Perl_croak(aTHX_ "Can't bless non-reference value");
76e3520e
GS
7952 tmpRef = SvRV(sv);
7953 if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
7954 if (SvREADONLY(tmpRef))
cea2e8a9 7955 Perl_croak(aTHX_ PL_no_modify);
76e3520e
GS
7956 if (SvOBJECT(tmpRef)) {
7957 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 7958 --PL_sv_objcount;
76e3520e 7959 SvREFCNT_dec(SvSTASH(tmpRef));
2e3febc6 7960 }
a0d0e21e 7961 }
76e3520e
GS
7962 SvOBJECT_on(tmpRef);
7963 if (SvTYPE(tmpRef) != SVt_PVIO)
3280af22 7964 ++PL_sv_objcount;
862a34c6 7965 SvUPGRADE(tmpRef, SVt_PVMG);
b37c2d43 7966 SvSTASH_set(tmpRef, (HV*)SvREFCNT_inc_simple(stash));
a0d0e21e 7967
2e3febc6
CS
7968 if (Gv_AMG(stash))
7969 SvAMAGIC_on(sv);
7970 else
52944de8 7971 (void)SvAMAGIC_off(sv);
a0d0e21e 7972
1edbfb88
AB
7973 if(SvSMAGICAL(tmpRef))
7974 if(mg_find(tmpRef, PERL_MAGIC_ext) || mg_find(tmpRef, PERL_MAGIC_uvar))
7975 mg_set(tmpRef);
7976
7977
ecdeb87c 7978
a0d0e21e
LW
7979 return sv;
7980}
7981
645c22ef 7982/* Downgrades a PVGV to a PVMG.
645c22ef
DM
7983 */
7984
76e3520e 7985STATIC void
cea2e8a9 7986S_sv_unglob(pTHX_ SV *sv)
a0d0e21e 7987{
97aff369 7988 dVAR;
850fabdf 7989 void *xpvmg;
dd69841b 7990 HV *stash;
b37c2d43 7991 SV * const temp = sv_newmortal();
850fabdf 7992
a0d0e21e
LW
7993 assert(SvTYPE(sv) == SVt_PVGV);
7994 SvFAKE_off(sv);
180488f8
NC
7995 gv_efullname3(temp, (GV *) sv, "*");
7996
f7877b28 7997 if (GvGP(sv)) {
dd69841b
BB
7998 if(GvCVu((GV*)sv) && (stash = GvSTASH((GV*)sv)) && HvNAME_get(stash))
7999 mro_method_changed_in(stash);
1edc1566 8000 gp_free((GV*)sv);
f7877b28 8001 }
e826b3c7 8002 if (GvSTASH(sv)) {
e15faf7d 8003 sv_del_backref((SV*)GvSTASH(sv), sv);
5c284bb0 8004 GvSTASH(sv) = NULL;
e826b3c7 8005 }
a5f75d66 8006 GvMULTI_off(sv);
acda4c6a
NC
8007 if (GvNAME_HEK(sv)) {
8008 unshare_hek(GvNAME_HEK(sv));
8009 }
2e5b91de 8010 isGV_with_GP_off(sv);
850fabdf
GS
8011
8012 /* need to keep SvANY(sv) in the right arena */
8013 xpvmg = new_XPVMG();
8014 StructCopy(SvANY(sv), xpvmg, XPVMG);
8015 del_XPVGV(SvANY(sv));
8016 SvANY(sv) = xpvmg;
8017
a0d0e21e
LW
8018 SvFLAGS(sv) &= ~SVTYPEMASK;
8019 SvFLAGS(sv) |= SVt_PVMG;
180488f8
NC
8020
8021 /* Intentionally not calling any local SET magic, as this isn't so much a
8022 set operation as merely an internal storage change. */
8023 sv_setsv_flags(sv, temp, 0);
a0d0e21e
LW
8024}
8025
954c1994 8026/*
840a7b70 8027=for apidoc sv_unref_flags
954c1994
GS
8028
8029Unsets the RV status of the SV, and decrements the reference count of
8030whatever was being referenced by the RV. This can almost be thought of
840a7b70
IZ
8031as a reversal of C<newSVrv>. The C<cflags> argument can contain
8032C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
8033(otherwise the decrementing is conditional on the reference count being
8034different from one or the reference being a readonly SV).
7889fe52 8035See C<SvROK_off>.
954c1994
GS
8036
8037=cut
8038*/
8039
ed6116ce 8040void
e15faf7d 8041Perl_sv_unref_flags(pTHX_ SV *ref, U32 flags)
ed6116ce 8042{
b64e5050 8043 SV* const target = SvRV(ref);
810b8aa5 8044
e15faf7d
NC
8045 if (SvWEAKREF(ref)) {
8046 sv_del_backref(target, ref);
8047 SvWEAKREF_off(ref);
8048 SvRV_set(ref, NULL);
810b8aa5
GS
8049 return;
8050 }
e15faf7d
NC
8051 SvRV_set(ref, NULL);
8052 SvROK_off(ref);
8053 /* You can't have a || SvREADONLY(target) here, as $a = $$a, where $a was
04ca4930 8054 assigned to as BEGIN {$a = \"Foo"} will fail. */
e15faf7d
NC
8055 if (SvREFCNT(target) != 1 || (flags & SV_IMMEDIATE_UNREF))
8056 SvREFCNT_dec(target);
840a7b70 8057 else /* XXX Hack, but hard to make $a=$a->[1] work otherwise */
e15faf7d 8058 sv_2mortal(target); /* Schedule for freeing later */
ed6116ce 8059}
8990e307 8060
840a7b70 8061/*
645c22ef
DM
8062=for apidoc sv_untaint
8063
8064Untaint an SV. Use C<SvTAINTED_off> instead.
8065=cut
8066*/
8067
bbce6d69 8068void
864dbfa3 8069Perl_sv_untaint(pTHX_ SV *sv)
bbce6d69 8070{
13f57bf8 8071 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
b64e5050 8072 MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
36477c24 8073 if (mg)
565764a8 8074 mg->mg_len &= ~1;
36477c24 8075 }
bbce6d69 8076}
8077
645c22ef
DM
8078/*
8079=for apidoc sv_tainted
8080
8081Test an SV for taintedness. Use C<SvTAINTED> instead.
8082=cut
8083*/
8084
bbce6d69 8085bool
864dbfa3 8086Perl_sv_tainted(pTHX_ SV *sv)
bbce6d69 8087{
13f57bf8 8088 if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
823a54a3 8089 const MAGIC * const mg = mg_find(sv, PERL_MAGIC_taint);
2ddb8a4f 8090 if (mg && (mg->mg_len & 1) )
36477c24 8091 return TRUE;
8092 }
8093 return FALSE;
bbce6d69 8094}
8095
09540bc3
JH
8096/*
8097=for apidoc sv_setpviv
8098
8099Copies an integer into the given SV, also updating its string value.
8100Does not handle 'set' magic. See C<sv_setpviv_mg>.
8101
8102=cut
8103*/
8104
8105void
8106Perl_sv_setpviv(pTHX_ SV *sv, IV iv)
8107{
8108 char buf[TYPE_CHARS(UV)];
8109 char *ebuf;
b64e5050 8110 char * const ptr = uiv_2buf(buf, iv, 0, 0, &ebuf);
09540bc3
JH
8111
8112 sv_setpvn(sv, ptr, ebuf - ptr);
8113}
8114
8115/*
8116=for apidoc sv_setpviv_mg
8117
8118Like C<sv_setpviv>, but also handles 'set' magic.
8119
8120=cut
8121*/
8122
8123void
8124Perl_sv_setpviv_mg(pTHX_ SV *sv, IV iv)
8125{
df7eb254 8126 sv_setpviv(sv, iv);
09540bc3
JH
8127 SvSETMAGIC(sv);
8128}
8129
cea2e8a9 8130#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8131
8132/* pTHX_ magic can't cope with varargs, so this is a no-context
8133 * version of the main function, (which may itself be aliased to us).
8134 * Don't access this version directly.
8135 */
8136
cea2e8a9
GS
8137void
8138Perl_sv_setpvf_nocontext(SV *sv, const char* pat, ...)
8139{
8140 dTHX;
8141 va_list args;
8142 va_start(args, pat);
c5be433b 8143 sv_vsetpvf(sv, pat, &args);
cea2e8a9
GS
8144 va_end(args);
8145}
8146
645c22ef
DM
8147/* pTHX_ magic can't cope with varargs, so this is a no-context
8148 * version of the main function, (which may itself be aliased to us).
8149 * Don't access this version directly.
8150 */
cea2e8a9
GS
8151
8152void
8153Perl_sv_setpvf_mg_nocontext(SV *sv, const char* pat, ...)
8154{
8155 dTHX;
8156 va_list args;
8157 va_start(args, pat);
c5be433b 8158 sv_vsetpvf_mg(sv, pat, &args);
cea2e8a9 8159 va_end(args);
cea2e8a9
GS
8160}
8161#endif
8162
954c1994
GS
8163/*
8164=for apidoc sv_setpvf
8165
bffc3d17
SH
8166Works like C<sv_catpvf> but copies the text into the SV instead of
8167appending it. Does not handle 'set' magic. See C<sv_setpvf_mg>.
954c1994
GS
8168
8169=cut
8170*/
8171
46fc3d4c 8172void
864dbfa3 8173Perl_sv_setpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 8174{
8175 va_list args;
46fc3d4c 8176 va_start(args, pat);
c5be433b 8177 sv_vsetpvf(sv, pat, &args);
46fc3d4c 8178 va_end(args);
8179}
8180
bffc3d17
SH
8181/*
8182=for apidoc sv_vsetpvf
8183
8184Works like C<sv_vcatpvf> but copies the text into the SV instead of
8185appending it. Does not handle 'set' magic. See C<sv_vsetpvf_mg>.
8186
8187Usually used via its frontend C<sv_setpvf>.
8188
8189=cut
8190*/
645c22ef 8191
c5be433b
GS
8192void
8193Perl_sv_vsetpvf(pTHX_ SV *sv, const char* pat, va_list* args)
8194{
4608196e 8195 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
c5be433b 8196}
ef50df4b 8197
954c1994
GS
8198/*
8199=for apidoc sv_setpvf_mg
8200
8201Like C<sv_setpvf>, but also handles 'set' magic.
8202
8203=cut
8204*/
8205
ef50df4b 8206void
864dbfa3 8207Perl_sv_setpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
8208{
8209 va_list args;
ef50df4b 8210 va_start(args, pat);
c5be433b 8211 sv_vsetpvf_mg(sv, pat, &args);
ef50df4b 8212 va_end(args);
c5be433b
GS
8213}
8214
bffc3d17
SH
8215/*
8216=for apidoc sv_vsetpvf_mg
8217
8218Like C<sv_vsetpvf>, but also handles 'set' magic.
8219
8220Usually used via its frontend C<sv_setpvf_mg>.
8221
8222=cut
8223*/
645c22ef 8224
c5be433b
GS
8225void
8226Perl_sv_vsetpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
8227{
4608196e 8228 sv_vsetpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
ef50df4b
GS
8229 SvSETMAGIC(sv);
8230}
8231
cea2e8a9 8232#if defined(PERL_IMPLICIT_CONTEXT)
645c22ef
DM
8233
8234/* pTHX_ magic can't cope with varargs, so this is a no-context
8235 * version of the main function, (which may itself be aliased to us).
8236 * Don't access this version directly.
8237 */
8238
cea2e8a9
GS
8239void
8240Perl_sv_catpvf_nocontext(SV *sv, const char* pat, ...)
8241{
8242 dTHX;
8243 va_list args;
8244 va_start(args, pat);
c5be433b 8245 sv_vcatpvf(sv, pat, &args);
cea2e8a9
GS
8246 va_end(args);
8247}
8248
645c22ef
DM
8249/* pTHX_ magic can't cope with varargs, so this is a no-context
8250 * version of the main function, (which may itself be aliased to us).
8251 * Don't access this version directly.
8252 */
8253
cea2e8a9
GS
8254void
8255Perl_sv_catpvf_mg_nocontext(SV *sv, const char* pat, ...)
8256{
8257 dTHX;
8258 va_list args;
8259 va_start(args, pat);
c5be433b 8260 sv_vcatpvf_mg(sv, pat, &args);
cea2e8a9 8261 va_end(args);
cea2e8a9
GS
8262}
8263#endif
8264
954c1994
GS
8265/*
8266=for apidoc sv_catpvf
8267
d5ce4a7c
GA
8268Processes its arguments like C<sprintf> and appends the formatted
8269output to an SV. If the appended data contains "wide" characters
8270(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
8271and characters >255 formatted with %c), the original SV might get
bffc3d17 8272upgraded to UTF-8. Handles 'get' magic, but not 'set' magic. See
cdd94ca7
NC
8273C<sv_catpvf_mg>. If the original SV was UTF-8, the pattern should be
8274valid UTF-8; if the original SV was bytes, the pattern should be too.
954c1994 8275
d5ce4a7c 8276=cut */
954c1994 8277
46fc3d4c 8278void
864dbfa3 8279Perl_sv_catpvf(pTHX_ SV *sv, const char* pat, ...)
46fc3d4c 8280{
8281 va_list args;
46fc3d4c 8282 va_start(args, pat);
c5be433b 8283 sv_vcatpvf(sv, pat, &args);
46fc3d4c 8284 va_end(args);
8285}
8286
bffc3d17
SH
8287/*
8288=for apidoc sv_vcatpvf
8289
8290Processes its arguments like C<vsprintf> and appends the formatted output
8291to an SV. Does not handle 'set' magic. See C<sv_vcatpvf_mg>.
8292
8293Usually used via its frontend C<sv_catpvf>.
8294
8295=cut
8296*/
645c22ef 8297
ef50df4b 8298void
c5be433b
GS
8299Perl_sv_vcatpvf(pTHX_ SV *sv, const char* pat, va_list* args)
8300{
4608196e 8301 sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
c5be433b
GS
8302}
8303
954c1994
GS
8304/*
8305=for apidoc sv_catpvf_mg
8306
8307Like C<sv_catpvf>, but also handles 'set' magic.
8308
8309=cut
8310*/
8311
c5be433b 8312void
864dbfa3 8313Perl_sv_catpvf_mg(pTHX_ SV *sv, const char* pat, ...)
ef50df4b
GS
8314{
8315 va_list args;
ef50df4b 8316 va_start(args, pat);
c5be433b 8317 sv_vcatpvf_mg(sv, pat, &args);
ef50df4b 8318 va_end(args);
c5be433b
GS
8319}
8320
bffc3d17
SH
8321/*
8322=for apidoc sv_vcatpvf_mg
8323
8324Like C<sv_vcatpvf>, but also handles 'set' magic.
8325
8326Usually used via its frontend C<sv_catpvf_mg>.
8327
8328=cut
8329*/
645c22ef 8330
c5be433b
GS
8331void
8332Perl_sv_vcatpvf_mg(pTHX_ SV *sv, const char* pat, va_list* args)
8333{
4608196e 8334 sv_vcatpvfn(sv, pat, strlen(pat), args, NULL, 0, NULL);
ef50df4b
GS
8335 SvSETMAGIC(sv);
8336}
8337
954c1994
GS
8338/*
8339=for apidoc sv_vsetpvfn
8340
bffc3d17 8341Works like C<sv_vcatpvfn> but copies the text into the SV instead of
954c1994
GS
8342appending it.
8343
bffc3d17 8344Usually used via one of its frontends C<sv_vsetpvf> and C<sv_vsetpvf_mg>.
645c22ef 8345
954c1994
GS
8346=cut
8347*/
8348
46fc3d4c 8349void
7d5ea4e7 8350Perl_sv_vsetpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 8351{
8352 sv_setpvn(sv, "", 0);
7d5ea4e7 8353 sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, maybe_tainted);
46fc3d4c 8354}
8355
2d00ba3b 8356STATIC I32
9dd79c3f 8357S_expect_number(pTHX_ char** pattern)
211dfcf1 8358{
97aff369 8359 dVAR;
211dfcf1
HS
8360 I32 var = 0;
8361 switch (**pattern) {
8362 case '1': case '2': case '3':
8363 case '4': case '5': case '6':
8364 case '7': case '8': case '9':
2fba7546
GA
8365 var = *(*pattern)++ - '0';
8366 while (isDIGIT(**pattern)) {
5f66b61c 8367 const I32 tmp = var * 10 + (*(*pattern)++ - '0');
2fba7546
GA
8368 if (tmp < var)
8369 Perl_croak(aTHX_ "Integer overflow in format string for %s", (PL_op ? OP_NAME(PL_op) : "sv_vcatpvfn"));
8370 var = tmp;
8371 }
211dfcf1
HS
8372 }
8373 return var;
8374}
211dfcf1 8375
c445ea15
AL
8376STATIC char *
8377S_F0convert(NV nv, char *endbuf, STRLEN *len)
4151a5fe 8378{
a3b680e6 8379 const int neg = nv < 0;
4151a5fe 8380 UV uv;
4151a5fe
IZ
8381
8382 if (neg)
8383 nv = -nv;
8384 if (nv < UV_MAX) {
b464bac0 8385 char *p = endbuf;
4151a5fe 8386 nv += 0.5;
028f8eaa 8387 uv = (UV)nv;
4151a5fe
IZ
8388 if (uv & 1 && uv == nv)
8389 uv--; /* Round to even */
8390 do {
a3b680e6 8391 const unsigned dig = uv % 10;
4151a5fe
IZ
8392 *--p = '0' + dig;
8393 } while (uv /= 10);
8394 if (neg)
8395 *--p = '-';
8396 *len = endbuf - p;
8397 return p;
8398 }
bd61b366 8399 return NULL;
4151a5fe
IZ
8400}
8401
8402
954c1994
GS
8403/*
8404=for apidoc sv_vcatpvfn
8405
8406Processes its arguments like C<vsprintf> and appends the formatted output
8407to an SV. Uses an array of SVs if the C style variable argument list is
8408missing (NULL). When running with taint checks enabled, indicates via
8409C<maybe_tainted> if results are untrustworthy (often due to the use of
8410locales).
8411
bffc3d17 8412Usually used via one of its frontends C<sv_vcatpvf> and C<sv_vcatpvf_mg>.
645c22ef 8413
954c1994
GS
8414=cut
8415*/
8416
8896765a
RB
8417
8418#define VECTORIZE_ARGS vecsv = va_arg(*args, SV*);\
8419 vecstr = (U8*)SvPV_const(vecsv,veclen);\
8420 vec_utf8 = DO_UTF8(vecsv);
8421
1ef29b0e
RGS
8422/* XXX maybe_tainted is never assigned to, so the doc above is lying. */
8423
46fc3d4c 8424void
7d5ea4e7 8425Perl_sv_vcatpvfn(pTHX_ SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *maybe_tainted)
46fc3d4c 8426{
97aff369 8427 dVAR;
46fc3d4c 8428 char *p;
8429 char *q;
a3b680e6 8430 const char *patend;
fc36a67e 8431 STRLEN origlen;
46fc3d4c 8432 I32 svix = 0;
27da23d5 8433 static const char nullstr[] = "(null)";
a0714e2c 8434 SV *argsv = NULL;
b464bac0
AL
8435 bool has_utf8 = DO_UTF8(sv); /* has the result utf8? */
8436 const bool pat_utf8 = has_utf8; /* the pattern is in utf8? */
a0714e2c 8437 SV *nsv = NULL;
4151a5fe
IZ
8438 /* Times 4: a decimal digit takes more than 3 binary digits.
8439 * NV_DIG: mantissa takes than many decimal digits.
8440 * Plus 32: Playing safe. */
8441 char ebuf[IV_DIG * 4 + NV_DIG + 32];
8442 /* large enough for "%#.#f" --chip */
8443 /* what about long double NVs? --jhi */
db79b45b 8444
53c1dcc0
AL
8445 PERL_UNUSED_ARG(maybe_tainted);
8446
46fc3d4c 8447 /* no matter what, this is a string now */
fc36a67e 8448 (void)SvPV_force(sv, origlen);
46fc3d4c 8449
8896765a 8450 /* special-case "", "%s", and "%-p" (SVf - see below) */
46fc3d4c 8451 if (patlen == 0)
8452 return;
0dbb1585 8453 if (patlen == 2 && pat[0] == '%' && pat[1] == 's') {
2d03de9c
AL
8454 if (args) {
8455 const char * const s = va_arg(*args, char*);
8456 sv_catpv(sv, s ? s : nullstr);
8457 }
8458 else if (svix < svmax) {
8459 sv_catsv(sv, *svargs);
2d03de9c
AL
8460 }
8461 return;
0dbb1585 8462 }
8896765a
RB
8463 if (args && patlen == 3 && pat[0] == '%' &&
8464 pat[1] == '-' && pat[2] == 'p') {
6c9570dc 8465 argsv = (SV*)va_arg(*args, void*);
8896765a 8466 sv_catsv(sv, argsv);
8896765a 8467 return;
46fc3d4c 8468 }
8469
1d917b39 8470#ifndef USE_LONG_DOUBLE
4151a5fe 8471 /* special-case "%.<number>[gf]" */
7af36d83 8472 if ( !args && patlen <= 5 && pat[0] == '%' && pat[1] == '.'
4151a5fe
IZ
8473 && (pat[patlen-1] == 'g' || pat[patlen-1] == 'f') ) {
8474 unsigned digits = 0;
8475 const char *pp;
8476
8477 pp = pat + 2;
8478 while (*pp >= '0' && *pp <= '9')
8479 digits = 10 * digits + (*pp++ - '0');
028f8eaa 8480 if (pp - pat == (int)patlen - 1) {
4151a5fe
IZ
8481 NV nv;
8482
7af36d83 8483 if (svix < svmax)
4151a5fe
IZ
8484 nv = SvNV(*svargs);
8485 else
8486 return;
8487 if (*pp == 'g') {
2873255c
NC
8488 /* Add check for digits != 0 because it seems that some
8489 gconverts are buggy in this case, and we don't yet have
8490 a Configure test for this. */
8491 if (digits && digits < sizeof(ebuf) - NV_DIG - 10) {
8492 /* 0, point, slack */
2e59c212 8493 Gconvert(nv, (int)digits, 0, ebuf);
4151a5fe
IZ
8494 sv_catpv(sv, ebuf);
8495 if (*ebuf) /* May return an empty string for digits==0 */
8496 return;
8497 }
8498 } else if (!digits) {
8499 STRLEN l;
8500
8501 if ((p = F0convert(nv, ebuf + sizeof ebuf, &l))) {
8502 sv_catpvn(sv, p, l);
8503 return;
8504 }
8505 }
8506 }
8507 }
1d917b39 8508#endif /* !USE_LONG_DOUBLE */
4151a5fe 8509
2cf2cfc6 8510 if (!args && svix < svmax && DO_UTF8(*svargs))
205f51d8 8511 has_utf8 = TRUE;
2cf2cfc6 8512
46fc3d4c 8513 patend = (char*)pat + patlen;
8514 for (p = (char*)pat; p < patend; p = q) {
8515 bool alt = FALSE;
8516 bool left = FALSE;
b22c7a20 8517 bool vectorize = FALSE;
211dfcf1 8518 bool vectorarg = FALSE;
2cf2cfc6 8519 bool vec_utf8 = FALSE;
46fc3d4c 8520 char fill = ' ';
8521 char plus = 0;
8522 char intsize = 0;
8523 STRLEN width = 0;
fc36a67e 8524 STRLEN zeros = 0;
46fc3d4c 8525 bool has_precis = FALSE;
8526 STRLEN precis = 0;
c445ea15 8527 const I32 osvix = svix;
2cf2cfc6 8528 bool is_utf8 = FALSE; /* is this item utf8? */
20f6aaab
AS
8529#ifdef HAS_LDBL_SPRINTF_BUG
8530 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8 8531 with sfio - Allen <allens@cpan.org> */
20f6aaab
AS
8532 bool fix_ldbl_sprintf_bug = FALSE;
8533#endif
205f51d8 8534
46fc3d4c 8535 char esignbuf[4];
89ebb4a3 8536 U8 utf8buf[UTF8_MAXBYTES+1];
46fc3d4c 8537 STRLEN esignlen = 0;
8538
bd61b366 8539 const char *eptr = NULL;
fc36a67e 8540 STRLEN elen = 0;
a0714e2c 8541 SV *vecsv = NULL;
4608196e 8542 const U8 *vecstr = NULL;
b22c7a20 8543 STRLEN veclen = 0;
934abaf1 8544 char c = 0;
46fc3d4c 8545 int i;
9c5ffd7c 8546 unsigned base = 0;
8c8eb53c
RB
8547 IV iv = 0;
8548 UV uv = 0;
9e5b023a
JH
8549 /* we need a long double target in case HAS_LONG_DOUBLE but
8550 not USE_LONG_DOUBLE
8551 */
35fff930 8552#if defined(HAS_LONG_DOUBLE) && LONG_DOUBLESIZE > DOUBLESIZE
9e5b023a
JH
8553 long double nv;
8554#else
65202027 8555 NV nv;
9e5b023a 8556#endif
46fc3d4c 8557 STRLEN have;
8558 STRLEN need;
8559 STRLEN gap;
7af36d83 8560 const char *dotstr = ".";
b22c7a20 8561 STRLEN dotstrlen = 1;
211dfcf1 8562 I32 efix = 0; /* explicit format parameter index */
eb3fce90 8563 I32 ewix = 0; /* explicit width index */
211dfcf1
HS
8564 I32 epix = 0; /* explicit precision index */
8565 I32 evix = 0; /* explicit vector index */
eb3fce90 8566 bool asterisk = FALSE;
46fc3d4c 8567
211dfcf1 8568 /* echo everything up to the next format specification */
46fc3d4c 8569 for (q = p; q < patend && *q != '%'; ++q) ;
8570 if (q > p) {
db79b45b
JH
8571 if (has_utf8 && !pat_utf8)
8572 sv_catpvn_utf8_upgrade(sv, p, q - p, nsv);
8573 else
8574 sv_catpvn(sv, p, q - p);
46fc3d4c 8575 p = q;
8576 }
8577 if (q++ >= patend)
8578 break;
8579
211dfcf1
HS
8580/*
8581 We allow format specification elements in this order:
8582 \d+\$ explicit format parameter index
8583 [-+ 0#]+ flags
a472f209 8584 v|\*(\d+\$)?v vector with optional (optionally specified) arg
f3583277 8585 0 flag (as above): repeated to allow "v02"
211dfcf1
HS
8586 \d+|\*(\d+\$)? width using optional (optionally specified) arg
8587 \.(\d*|\*(\d+\$)?) precision using optional (optionally specified) arg
8588 [hlqLV] size
8896765a
RB
8589 [%bcdefginopsuxDFOUX] format (mandatory)
8590*/
8591
8592 if (args) {
8593/*
8594 As of perl5.9.3, printf format checking is on by default.
8595 Internally, perl uses %p formats to provide an escape to
8596 some extended formatting. This block deals with those
8597 extensions: if it does not match, (char*)q is reset and
8598 the normal format processing code is used.
8599
8600 Currently defined extensions are:
8601 %p include pointer address (standard)
8602 %-p (SVf) include an SV (previously %_)
8603 %-<num>p include an SV with precision <num>
8604 %1p (VDf) include a v-string (as %vd)
8605 %<num>p reserved for future extensions
8606
8607 Robin Barker 2005-07-14
211dfcf1 8608*/
8896765a
RB
8609 char* r = q;
8610 bool sv = FALSE;
8611 STRLEN n = 0;
8612 if (*q == '-')
8613 sv = *q++;
c445ea15 8614 n = expect_number(&q);
8896765a
RB
8615 if (*q++ == 'p') {
8616 if (sv) { /* SVf */
8617 if (n) {
8618 precis = n;
8619 has_precis = TRUE;
8620 }
6c9570dc 8621 argsv = (SV*)va_arg(*args, void*);
4ea561bc 8622 eptr = SvPV_const(argsv, elen);
8896765a
RB
8623 if (DO_UTF8(argsv))
8624 is_utf8 = TRUE;
8625 goto string;
8626 }
8627#if vdNUMBER
8628 else if (n == vdNUMBER) { /* VDf */
8629 vectorize = TRUE;
8630 VECTORIZE_ARGS
8631 goto format_vd;
8632 }
8633#endif
8634 else if (n) {
8635 if (ckWARN_d(WARN_INTERNAL))
8636 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
8637 "internal %%<num>p might conflict with future printf extensions");
8638 }
8639 }
8640 q = r;
8641 }
8642
c445ea15 8643 if ( (width = expect_number(&q)) ) {
211dfcf1
HS
8644 if (*q == '$') {
8645 ++q;
8646 efix = width;
8647 } else {
8648 goto gotwidth;
8649 }
8650 }
8651
fc36a67e 8652 /* FLAGS */
8653
46fc3d4c 8654 while (*q) {
8655 switch (*q) {
8656 case ' ':
8657 case '+':
9911cee9
TS
8658 if (plus == '+' && *q == ' ') /* '+' over ' ' */
8659 q++;
8660 else
8661 plus = *q++;
46fc3d4c 8662 continue;
8663
8664 case '-':
8665 left = TRUE;
8666 q++;
8667 continue;
8668
8669 case '0':
8670 fill = *q++;
8671 continue;
8672
8673 case '#':
8674 alt = TRUE;
8675 q++;
8676 continue;
8677
fc36a67e 8678 default:
8679 break;
8680 }
8681 break;
8682 }
46fc3d4c 8683
211dfcf1 8684 tryasterisk:
eb3fce90 8685 if (*q == '*') {
211dfcf1 8686 q++;
c445ea15 8687 if ( (ewix = expect_number(&q)) )
211dfcf1
HS
8688 if (*q++ != '$')
8689 goto unknown;
eb3fce90 8690 asterisk = TRUE;
211dfcf1
HS
8691 }
8692 if (*q == 'v') {
eb3fce90 8693 q++;
211dfcf1
HS
8694 if (vectorize)
8695 goto unknown;
9cbac4c7 8696 if ((vectorarg = asterisk)) {
211dfcf1
HS
8697 evix = ewix;
8698 ewix = 0;
8699 asterisk = FALSE;
8700 }
8701 vectorize = TRUE;
8702 goto tryasterisk;
eb3fce90
JH
8703 }
8704
211dfcf1 8705 if (!asterisk)
858a90f9 8706 {
7a5fa8a2 8707 if( *q == '0' )
f3583277 8708 fill = *q++;
c445ea15 8709 width = expect_number(&q);
858a90f9 8710 }
211dfcf1
HS
8711
8712 if (vectorize) {
8713 if (vectorarg) {
8714 if (args)
8715 vecsv = va_arg(*args, SV*);
7ad96abb
NC
8716 else if (evix) {
8717 vecsv = (evix > 0 && evix <= svmax)
8718 ? svargs[evix-1] : &PL_sv_undef;
8719 } else {
8720 vecsv = svix < svmax ? svargs[svix++] : &PL_sv_undef;
8721 }
245d4a47 8722 dotstr = SvPV_const(vecsv, dotstrlen);
640283f5
NC
8723 /* Keep the DO_UTF8 test *after* the SvPV call, else things go
8724 bad with tied or overloaded values that return UTF8. */
211dfcf1 8725 if (DO_UTF8(vecsv))
2cf2cfc6 8726 is_utf8 = TRUE;
640283f5
NC
8727 else if (has_utf8) {
8728 vecsv = sv_mortalcopy(vecsv);
8729 sv_utf8_upgrade(vecsv);
8730 dotstr = SvPV_const(vecsv, dotstrlen);
8731 is_utf8 = TRUE;
8732 }
211dfcf1
HS
8733 }
8734 if (args) {
8896765a 8735 VECTORIZE_ARGS
eb3fce90 8736 }
7ad96abb 8737 else if (efix ? (efix > 0 && efix <= svmax) : svix < svmax) {
211dfcf1 8738 vecsv = svargs[efix ? efix-1 : svix++];
245d4a47 8739 vecstr = (U8*)SvPV_const(vecsv,veclen);
2cf2cfc6 8740 vec_utf8 = DO_UTF8(vecsv);
96b8f7ce
JP
8741
8742 /* if this is a version object, we need to convert
8743 * back into v-string notation and then let the
8744 * vectorize happen normally
d7aa5382 8745 */
96b8f7ce
JP
8746 if (sv_derived_from(vecsv, "version")) {
8747 char *version = savesvpv(vecsv);
34ba6322
SP
8748 if ( hv_exists((HV*)SvRV(vecsv), "alpha", 5 ) ) {
8749 Perl_warner(aTHX_ packWARN(WARN_INTERNAL),
8750 "vector argument not supported with alpha versions");
8751 goto unknown;
8752 }
96b8f7ce 8753 vecsv = sv_newmortal();
65b06e02 8754 scan_vstring(version, version + veclen, vecsv);
96b8f7ce
JP
8755 vecstr = (U8*)SvPV_const(vecsv, veclen);
8756 vec_utf8 = DO_UTF8(vecsv);
8757 Safefree(version);
d7aa5382 8758 }
211dfcf1
HS
8759 }
8760 else {
8761 vecstr = (U8*)"";
8762 veclen = 0;
8763 }
eb3fce90 8764 }
fc36a67e 8765
eb3fce90 8766 if (asterisk) {
fc36a67e 8767 if (args)
8768 i = va_arg(*args, int);
8769 else
eb3fce90
JH
8770 i = (ewix ? ewix <= svmax : svix < svmax) ?
8771 SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
fc36a67e 8772 left |= (i < 0);
8773 width = (i < 0) ? -i : i;
fc36a67e 8774 }
211dfcf1 8775 gotwidth:
fc36a67e 8776
8777 /* PRECISION */
46fc3d4c 8778
fc36a67e 8779 if (*q == '.') {
8780 q++;
8781 if (*q == '*') {
211dfcf1 8782 q++;
c445ea15 8783 if ( ((epix = expect_number(&q))) && (*q++ != '$') )
7b8dd722
HS
8784 goto unknown;
8785 /* XXX: todo, support specified precision parameter */
8786 if (epix)
211dfcf1 8787 goto unknown;
46fc3d4c 8788 if (args)
8789 i = va_arg(*args, int);
8790 else
eb3fce90
JH
8791 i = (ewix ? ewix <= svmax : svix < svmax)
8792 ? SvIVx(svargs[ewix ? ewix-1 : svix++]) : 0;
9911cee9
TS
8793 precis = i;
8794 has_precis = !(i < 0);
fc36a67e 8795 }
8796 else {
8797 precis = 0;
8798 while (isDIGIT(*q))
8799 precis = precis * 10 + (*q++ - '0');
9911cee9 8800 has_precis = TRUE;
fc36a67e 8801 }
fc36a67e 8802 }
46fc3d4c 8803
fc36a67e 8804 /* SIZE */
46fc3d4c 8805
fc36a67e 8806 switch (*q) {
c623ac67
GS
8807#ifdef WIN32
8808 case 'I': /* Ix, I32x, and I64x */
8809# ifdef WIN64
8810 if (q[1] == '6' && q[2] == '4') {
8811 q += 3;
8812 intsize = 'q';
8813 break;
8814 }
8815# endif
8816 if (q[1] == '3' && q[2] == '2') {
8817 q += 3;
8818 break;
8819 }
8820# ifdef WIN64
8821 intsize = 'q';
8822# endif
8823 q++;
8824 break;
8825#endif
9e5b023a 8826#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
6f9bb7fd 8827 case 'L': /* Ld */
5f66b61c 8828 /*FALLTHROUGH*/
e5c81feb 8829#ifdef HAS_QUAD
6f9bb7fd 8830 case 'q': /* qd */
9e5b023a 8831#endif
6f9bb7fd
GS
8832 intsize = 'q';
8833 q++;
8834 break;
8835#endif
fc36a67e 8836 case 'l':
9e5b023a 8837#if defined(HAS_QUAD) || defined(HAS_LONG_DOUBLE)
205f51d8 8838 if (*(q + 1) == 'l') { /* lld, llf */
fc36a67e 8839 intsize = 'q';
8840 q += 2;
46fc3d4c 8841 break;
cf2093f6 8842 }
fc36a67e 8843#endif
5f66b61c 8844 /*FALLTHROUGH*/
fc36a67e 8845 case 'h':
5f66b61c 8846 /*FALLTHROUGH*/
fc36a67e 8847 case 'V':
8848 intsize = *q++;
46fc3d4c 8849 break;
8850 }
8851
fc36a67e 8852 /* CONVERSION */
8853
211dfcf1
HS
8854 if (*q == '%') {
8855 eptr = q++;
8856 elen = 1;
26372e71
GA
8857 if (vectorize) {
8858 c = '%';
8859 goto unknown;
8860 }
211dfcf1
HS
8861 goto string;
8862 }
8863
26372e71 8864 if (!vectorize && !args) {
86c51f8b
NC
8865 if (efix) {
8866 const I32 i = efix-1;
8867 argsv = (i >= 0 && i < svmax) ? svargs[i] : &PL_sv_undef;
8868 } else {
8869 argsv = (svix >= 0 && svix < svmax)
8870 ? svargs[svix++] : &PL_sv_undef;
8871 }
863811b2 8872 }
211dfcf1 8873
46fc3d4c 8874 switch (c = *q++) {
8875
8876 /* STRINGS */
8877
46fc3d4c 8878 case 'c':
26372e71
GA
8879 if (vectorize)
8880 goto unknown;
4ea561bc 8881 uv = (args) ? va_arg(*args, int) : SvIV(argsv);
1bd104fb
JH
8882 if ((uv > 255 ||
8883 (!UNI_IS_INVARIANT(uv) && SvUTF8(sv)))
0064a8a9 8884 && !IN_BYTES) {
dfe13c55 8885 eptr = (char*)utf8buf;
9041c2e3 8886 elen = uvchr_to_utf8((U8*)eptr, uv) - utf8buf;
2cf2cfc6 8887 is_utf8 = TRUE;
7e2040f0
GS
8888 }
8889 else {
8890 c = (char)uv;
8891 eptr = &c;
8892 elen = 1;
a0ed51b3 8893 }
46fc3d4c 8894 goto string;
8895
46fc3d4c 8896 case 's':
26372e71
GA
8897 if (vectorize)
8898 goto unknown;
8899 if (args) {
fc36a67e 8900 eptr = va_arg(*args, char*);
c635e13b 8901 if (eptr)
1d7c1841
GS
8902#ifdef MACOS_TRADITIONAL
8903 /* On MacOS, %#s format is used for Pascal strings */
8904 if (alt)
8905 elen = *eptr++;
8906 else
8907#endif
c635e13b 8908 elen = strlen(eptr);
8909 else {
27da23d5 8910 eptr = (char *)nullstr;
c635e13b 8911 elen = sizeof nullstr - 1;
8912 }
46fc3d4c 8913 }
211dfcf1 8914 else {
4ea561bc 8915 eptr = SvPV_const(argsv, elen);
7e2040f0 8916 if (DO_UTF8(argsv)) {
59b61096 8917 I32 old_precis = precis;
a0ed51b3
LW
8918 if (has_precis && precis < elen) {
8919 I32 p = precis;
7e2040f0 8920 sv_pos_u2b(argsv, &p, 0); /* sticks at end */
a0ed51b3
LW
8921 precis = p;
8922 }
8923 if (width) { /* fudge width (can't fudge elen) */
59b61096
AV
8924 if (has_precis && precis < elen)
8925 width += precis - old_precis;
8926 else
8927 width += elen - sv_len_utf8(argsv);
a0ed51b3 8928 }
2cf2cfc6 8929 is_utf8 = TRUE;
a0ed51b3
LW
8930 }
8931 }
fc36a67e 8932
46fc3d4c 8933 string:
8934 if (has_precis && elen > precis)
8935 elen = precis;
8936 break;
8937
8938 /* INTEGERS */
8939
fc36a67e 8940 case 'p':
be75b157 8941 if (alt || vectorize)
c2e66d9e 8942 goto unknown;
211dfcf1 8943 uv = PTR2UV(args ? va_arg(*args, void*) : argsv);
fc36a67e 8944 base = 16;
8945 goto integer;
8946
46fc3d4c 8947 case 'D':
29fe7a80 8948#ifdef IV_IS_QUAD
22f3ae8c 8949 intsize = 'q';
29fe7a80 8950#else
46fc3d4c 8951 intsize = 'l';
29fe7a80 8952#endif
5f66b61c 8953 /*FALLTHROUGH*/
46fc3d4c 8954 case 'd':
8955 case 'i':
8896765a
RB
8956#if vdNUMBER
8957 format_vd:
8958#endif
b22c7a20 8959 if (vectorize) {
ba210ebe 8960 STRLEN ulen;
211dfcf1
HS
8961 if (!veclen)
8962 continue;
2cf2cfc6
A
8963 if (vec_utf8)
8964 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
8965 UTF8_ALLOW_ANYUV);
b22c7a20 8966 else {
e83d50c9 8967 uv = *vecstr;
b22c7a20
GS
8968 ulen = 1;
8969 }
8970 vecstr += ulen;
8971 veclen -= ulen;
e83d50c9
JP
8972 if (plus)
8973 esignbuf[esignlen++] = plus;
b22c7a20
GS
8974 }
8975 else if (args) {
46fc3d4c 8976 switch (intsize) {
8977 case 'h': iv = (short)va_arg(*args, int); break;
46fc3d4c 8978 case 'l': iv = va_arg(*args, long); break;
fc36a67e 8979 case 'V': iv = va_arg(*args, IV); break;
b10c0dba 8980 default: iv = va_arg(*args, int); break;
cf2093f6
JH
8981#ifdef HAS_QUAD
8982 case 'q': iv = va_arg(*args, Quad_t); break;
8983#endif
46fc3d4c 8984 }
8985 }
8986 else {
4ea561bc 8987 IV tiv = SvIV(argsv); /* work around GCC bug #13488 */
46fc3d4c 8988 switch (intsize) {
b10c0dba
MHM
8989 case 'h': iv = (short)tiv; break;
8990 case 'l': iv = (long)tiv; break;
8991 case 'V':
8992 default: iv = tiv; break;
cf2093f6 8993#ifdef HAS_QUAD
b10c0dba 8994 case 'q': iv = (Quad_t)tiv; break;
cf2093f6 8995#endif
46fc3d4c 8996 }
8997 }
e83d50c9
JP
8998 if ( !vectorize ) /* we already set uv above */
8999 {
9000 if (iv >= 0) {
9001 uv = iv;
9002 if (plus)
9003 esignbuf[esignlen++] = plus;
9004 }
9005 else {
9006 uv = -iv;
9007 esignbuf[esignlen++] = '-';
9008 }
46fc3d4c 9009 }
9010 base = 10;
9011 goto integer;
9012
fc36a67e 9013 case 'U':
29fe7a80 9014#ifdef IV_IS_QUAD
22f3ae8c 9015 intsize = 'q';
29fe7a80 9016#else
fc36a67e 9017 intsize = 'l';
29fe7a80 9018#endif
5f66b61c 9019 /*FALLTHROUGH*/
fc36a67e 9020 case 'u':
9021 base = 10;
9022 goto uns_integer;
9023
7ff06cc7 9024 case 'B':
4f19785b
WSI
9025 case 'b':
9026 base = 2;
9027 goto uns_integer;
9028
46fc3d4c 9029 case 'O':
29fe7a80 9030#ifdef IV_IS_QUAD
22f3ae8c 9031 intsize = 'q';
29fe7a80 9032#else
46fc3d4c 9033 intsize = 'l';
29fe7a80 9034#endif
5f66b61c 9035 /*FALLTHROUGH*/
46fc3d4c 9036 case 'o':
9037 base = 8;
9038 goto uns_integer;
9039
9040 case 'X':
46fc3d4c 9041 case 'x':
9042 base = 16;
46fc3d4c 9043
9044 uns_integer:
b22c7a20 9045 if (vectorize) {
ba210ebe 9046 STRLEN ulen;
b22c7a20 9047 vector:
211dfcf1
HS
9048 if (!veclen)
9049 continue;
2cf2cfc6
A
9050 if (vec_utf8)
9051 uv = utf8n_to_uvchr(vecstr, veclen, &ulen,
9052 UTF8_ALLOW_ANYUV);
b22c7a20 9053 else {
a05b299f 9054 uv = *vecstr;
b22c7a20
GS
9055 ulen = 1;
9056 }
9057 vecstr += ulen;
9058 veclen -= ulen;
9059 }
9060 else if (args) {
46fc3d4c 9061 switch (intsize) {
9062 case 'h': uv = (unsigned short)va_arg(*args, unsigned); break;
46fc3d4c 9063 case 'l': uv = va_arg(*args, unsigned long); break;
fc36a67e 9064 case 'V': uv = va_arg(*args, UV); break;
b10c0dba 9065 default: uv = va_arg(*args, unsigned); break;
cf2093f6 9066#ifdef HAS_QUAD
9e3321a5 9067 case 'q': uv = va_arg(*args, Uquad_t); break;
cf2093f6 9068#endif
46fc3d4c 9069 }
9070 }
9071 else {
4ea561bc 9072 UV tuv = SvUV(argsv); /* work around GCC bug #13488 */
46fc3d4c 9073 switch (intsize) {
b10c0dba
MHM
9074 case 'h': uv = (unsigned short)tuv; break;
9075 case 'l': uv = (unsigned long)tuv; break;
9076 case 'V':
9077 default: uv = tuv; break;
cf2093f6 9078#ifdef HAS_QUAD
b10c0dba 9079 case 'q': uv = (Uquad_t)tuv; break;
cf2093f6 9080#endif
46fc3d4c 9081 }
9082 }
9083
9084 integer:
4d84ee25
NC
9085 {
9086 char *ptr = ebuf + sizeof ebuf;
1387f30c
DD
9087 bool tempalt = uv ? alt : FALSE; /* Vectors can't change alt */
9088 zeros = 0;
9089
4d84ee25
NC
9090 switch (base) {
9091 unsigned dig;
9092 case 16:
14eb61ab 9093 p = (char *)((c == 'X') ? PL_hexdigit + 16 : PL_hexdigit);
4d84ee25
NC
9094 do {
9095 dig = uv & 15;
9096 *--ptr = p[dig];
9097 } while (uv >>= 4);
1387f30c 9098 if (tempalt) {
4d84ee25
NC
9099 esignbuf[esignlen++] = '0';
9100 esignbuf[esignlen++] = c; /* 'x' or 'X' */
9101 }
9102 break;
9103 case 8:
9104 do {
9105 dig = uv & 7;
9106 *--ptr = '0' + dig;
9107 } while (uv >>= 3);
9108 if (alt && *ptr != '0')
9109 *--ptr = '0';
9110 break;
9111 case 2:
9112 do {
9113 dig = uv & 1;
9114 *--ptr = '0' + dig;
9115 } while (uv >>= 1);
1387f30c 9116 if (tempalt) {
4d84ee25 9117 esignbuf[esignlen++] = '0';
7ff06cc7 9118 esignbuf[esignlen++] = c;
4d84ee25
NC
9119 }
9120 break;
9121 default: /* it had better be ten or less */
9122 do {
9123 dig = uv % base;
9124 *--ptr = '0' + dig;
9125 } while (uv /= base);
9126 break;
46fc3d4c 9127 }
4d84ee25
NC
9128 elen = (ebuf + sizeof ebuf) - ptr;
9129 eptr = ptr;
9130 if (has_precis) {
9131 if (precis > elen)
9132 zeros = precis - elen;
e6bb52fd
TS
9133 else if (precis == 0 && elen == 1 && *eptr == '0'
9134 && !(base == 8 && alt)) /* "%#.0o" prints "0" */
4d84ee25 9135 elen = 0;
9911cee9
TS
9136
9137 /* a precision nullifies the 0 flag. */
9138 if (fill == '0')
9139 fill = ' ';
eda88b6d 9140 }
c10ed8b9 9141 }
46fc3d4c 9142 break;
9143
9144 /* FLOATING POINT */
9145
fc36a67e 9146 case 'F':
9147 c = 'f'; /* maybe %F isn't supported here */
5f66b61c 9148 /*FALLTHROUGH*/
46fc3d4c 9149 case 'e': case 'E':
fc36a67e 9150 case 'f':
46fc3d4c 9151 case 'g': case 'G':
26372e71
GA
9152 if (vectorize)
9153 goto unknown;
46fc3d4c 9154
9155 /* This is evil, but floating point is even more evil */
9156
9e5b023a
JH
9157 /* for SV-style calling, we can only get NV
9158 for C-style calling, we assume %f is double;
9159 for simplicity we allow any of %Lf, %llf, %qf for long double
9160 */
9161 switch (intsize) {
9162 case 'V':
9163#if defined(USE_LONG_DOUBLE)
9164 intsize = 'q';
9165#endif
9166 break;
8a2e3f14 9167/* [perl #20339] - we should accept and ignore %lf rather than die */
00e17364 9168 case 'l':
5f66b61c 9169 /*FALLTHROUGH*/
9e5b023a
JH
9170 default:
9171#if defined(USE_LONG_DOUBLE)
9172 intsize = args ? 0 : 'q';
9173#endif
9174 break;
9175 case 'q':
9176#if defined(HAS_LONG_DOUBLE)
9177 break;
9178#else
5f66b61c 9179 /*FALLTHROUGH*/
9e5b023a
JH
9180#endif
9181 case 'h':
9e5b023a
JH
9182 goto unknown;
9183 }
9184
9185 /* now we need (long double) if intsize == 'q', else (double) */
26372e71 9186 nv = (args) ?
35fff930
JH
9187#if LONG_DOUBLESIZE > DOUBLESIZE
9188 intsize == 'q' ?
205f51d8
AS
9189 va_arg(*args, long double) :
9190 va_arg(*args, double)
35fff930 9191#else
205f51d8 9192 va_arg(*args, double)
35fff930 9193#endif
4ea561bc 9194 : SvNV(argsv);
fc36a67e 9195
9196 need = 0;
9197 if (c != 'e' && c != 'E') {
9198 i = PERL_INT_MIN;
9e5b023a
JH
9199 /* FIXME: if HAS_LONG_DOUBLE but not USE_LONG_DOUBLE this
9200 will cast our (long double) to (double) */
73b309ea 9201 (void)Perl_frexp(nv, &i);
fc36a67e 9202 if (i == PERL_INT_MIN)
cea2e8a9 9203 Perl_die(aTHX_ "panic: frexp");
c635e13b 9204 if (i > 0)
fc36a67e 9205 need = BIT_DIGITS(i);
9206 }
9207 need += has_precis ? precis : 6; /* known default */
20f6aaab 9208
fc36a67e 9209 if (need < width)
9210 need = width;
9211
20f6aaab
AS
9212#ifdef HAS_LDBL_SPRINTF_BUG
9213 /* This is to try to fix a bug with irix/nonstop-ux/powerux and
205f51d8
AS
9214 with sfio - Allen <allens@cpan.org> */
9215
9216# ifdef DBL_MAX
9217# define MY_DBL_MAX DBL_MAX
9218# else /* XXX guessing! HUGE_VAL may be defined as infinity, so not using */
9219# if DOUBLESIZE >= 8
9220# define MY_DBL_MAX 1.7976931348623157E+308L
9221# else
9222# define MY_DBL_MAX 3.40282347E+38L
9223# endif
9224# endif
9225
9226# ifdef HAS_LDBL_SPRINTF_BUG_LESS1 /* only between -1L & 1L - Allen */
9227# define MY_DBL_MAX_BUG 1L
20f6aaab 9228# else
205f51d8 9229# define MY_DBL_MAX_BUG MY_DBL_MAX
20f6aaab 9230# endif
20f6aaab 9231
205f51d8
AS
9232# ifdef DBL_MIN
9233# define MY_DBL_MIN DBL_MIN
9234# else /* XXX guessing! -Allen */
9235# if DOUBLESIZE >= 8
9236# define MY_DBL_MIN 2.2250738585072014E-308L
9237# else
9238# define MY_DBL_MIN 1.17549435E-38L
9239# endif
9240# endif
20f6aaab 9241
205f51d8
AS
9242 if ((intsize == 'q') && (c == 'f') &&
9243 ((nv < MY_DBL_MAX_BUG) && (nv > -MY_DBL_MAX_BUG)) &&
9244 (need < DBL_DIG)) {
9245 /* it's going to be short enough that
9246 * long double precision is not needed */
9247
9248 if ((nv <= 0L) && (nv >= -0L))
9249 fix_ldbl_sprintf_bug = TRUE; /* 0 is 0 - easiest */
9250 else {
9251 /* would use Perl_fp_class as a double-check but not
9252 * functional on IRIX - see perl.h comments */
9253
9254 if ((nv >= MY_DBL_MIN) || (nv <= -MY_DBL_MIN)) {
9255 /* It's within the range that a double can represent */
9256#if defined(DBL_MAX) && !defined(DBL_MIN)
9257 if ((nv >= ((long double)1/DBL_MAX)) ||
9258 (nv <= (-(long double)1/DBL_MAX)))
20f6aaab 9259#endif
205f51d8 9260 fix_ldbl_sprintf_bug = TRUE;
20f6aaab 9261 }
205f51d8
AS
9262 }
9263 if (fix_ldbl_sprintf_bug == TRUE) {
9264 double temp;
9265
9266 intsize = 0;
9267 temp = (double)nv;
9268 nv = (NV)temp;
9269 }
20f6aaab 9270 }
205f51d8
AS
9271
9272# undef MY_DBL_MAX
9273# undef MY_DBL_MAX_BUG
9274# undef MY_DBL_MIN
9275
20f6aaab
AS
9276#endif /* HAS_LDBL_SPRINTF_BUG */
9277
46fc3d4c 9278 need += 20; /* fudge factor */
80252599
GS
9279 if (PL_efloatsize < need) {
9280 Safefree(PL_efloatbuf);
9281 PL_efloatsize = need + 20; /* more fudge */
a02a5408 9282 Newx(PL_efloatbuf, PL_efloatsize, char);
7d5ea4e7 9283 PL_efloatbuf[0] = '\0';
46fc3d4c 9284 }
9285
4151a5fe
IZ
9286 if ( !(width || left || plus || alt) && fill != '0'
9287 && has_precis && intsize != 'q' ) { /* Shortcuts */
2873255c
NC
9288 /* See earlier comment about buggy Gconvert when digits,
9289 aka precis is 0 */
9290 if ( c == 'g' && precis) {
2e59c212 9291 Gconvert((NV)nv, (int)precis, 0, PL_efloatbuf);
4150c189
NC
9292 /* May return an empty string for digits==0 */
9293 if (*PL_efloatbuf) {
9294 elen = strlen(PL_efloatbuf);
4151a5fe 9295 goto float_converted;
4150c189 9296 }
4151a5fe
IZ
9297 } else if ( c == 'f' && !precis) {
9298 if ((eptr = F0convert(nv, ebuf + sizeof ebuf, &elen)))
9299 break;
9300 }
9301 }
4d84ee25
NC
9302 {
9303 char *ptr = ebuf + sizeof ebuf;
9304 *--ptr = '\0';
9305 *--ptr = c;
9306 /* FIXME: what to do if HAS_LONG_DOUBLE but not PERL_PRIfldbl? */
9e5b023a 9307#if defined(HAS_LONG_DOUBLE) && defined(PERL_PRIfldbl)
4d84ee25
NC
9308 if (intsize == 'q') {
9309 /* Copy the one or more characters in a long double
9310 * format before the 'base' ([efgEFG]) character to
9311 * the format string. */
9312 static char const prifldbl[] = PERL_PRIfldbl;
9313 char const *p = prifldbl + sizeof(prifldbl) - 3;
9314 while (p >= prifldbl) { *--ptr = *p--; }
9315 }
65202027 9316#endif
4d84ee25
NC
9317 if (has_precis) {
9318 base = precis;
9319 do { *--ptr = '0' + (base % 10); } while (base /= 10);
9320 *--ptr = '.';
9321 }
9322 if (width) {
9323 base = width;
9324 do { *--ptr = '0' + (base % 10); } while (base /= 10);
9325 }
9326 if (fill == '0')
9327 *--ptr = fill;
9328 if (left)
9329 *--ptr = '-';
9330 if (plus)
9331 *--ptr = plus;
9332 if (alt)
9333 *--ptr = '#';
9334 *--ptr = '%';
9335
9336 /* No taint. Otherwise we are in the strange situation
9337 * where printf() taints but print($float) doesn't.
9338 * --jhi */
9e5b023a 9339#if defined(HAS_LONG_DOUBLE)
4150c189 9340 elen = ((intsize == 'q')
d9fad198
JH
9341 ? my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, nv)
9342 : my_snprintf(PL_efloatbuf, PL_efloatsize, ptr, (double)nv));
9e5b023a 9343#else
4150c189 9344 elen = my_sprintf(PL_efloatbuf, ptr, nv);
9e5b023a 9345#endif
4d84ee25 9346 }
4151a5fe 9347 float_converted:
80252599 9348 eptr = PL_efloatbuf;
46fc3d4c 9349 break;
9350
fc36a67e 9351 /* SPECIAL */
9352
9353 case 'n':
26372e71
GA
9354 if (vectorize)
9355 goto unknown;
fc36a67e 9356 i = SvCUR(sv) - origlen;
26372e71 9357 if (args) {
c635e13b 9358 switch (intsize) {
9359 case 'h': *(va_arg(*args, short*)) = i; break;
9360 default: *(va_arg(*args, int*)) = i; break;
9361 case 'l': *(va_arg(*args, long*)) = i; break;
9362 case 'V': *(va_arg(*args, IV*)) = i; break;
cf2093f6
JH
9363#ifdef HAS_QUAD
9364 case 'q': *(va_arg(*args, Quad_t*)) = i; break;
9365#endif
c635e13b 9366 }
fc36a67e 9367 }
9dd79c3f 9368 else
211dfcf1 9369 sv_setuv_mg(argsv, (UV)i);
fc36a67e 9370 continue; /* not "break" */
9371
9372 /* UNKNOWN */
9373
46fc3d4c 9374 default:
fc36a67e 9375 unknown:
041457d9
DM
9376 if (!args
9377 && (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)
9378 && ckWARN(WARN_PRINTF))
9379 {
c4420975 9380 SV * const msg = sv_newmortal();
35c1215d
NC
9381 Perl_sv_setpvf(aTHX_ msg, "Invalid conversion in %sprintf: ",
9382 (PL_op->op_type == OP_PRTF) ? "" : "s");
0f4b6630 9383 if (c) {
0f4b6630 9384 if (isPRINT(c))
1c846c1f 9385 Perl_sv_catpvf(aTHX_ msg,
0f4b6630
JH
9386 "\"%%%c\"", c & 0xFF);
9387 else
9388 Perl_sv_catpvf(aTHX_ msg,
57def98f 9389 "\"%%\\%03"UVof"\"",
0f4b6630 9390 (UV)c & 0xFF);
0f4b6630 9391 } else
396482e1 9392 sv_catpvs(msg, "end of string");
be2597df 9393 Perl_warner(aTHX_ packWARN(WARN_PRINTF), "%"SVf, SVfARG(msg)); /* yes, this is reentrant */
c635e13b 9394 }
fb73857a 9395
9396 /* output mangled stuff ... */
9397 if (c == '\0')
9398 --q;
46fc3d4c 9399 eptr = p;
9400 elen = q - p;
fb73857a 9401
9402 /* ... right here, because formatting flags should not apply */
9403 SvGROW(sv, SvCUR(sv) + elen + 1);
9404 p = SvEND(sv);
4459522c 9405 Copy(eptr, p, elen, char);
fb73857a 9406 p += elen;
9407 *p = '\0';
3f7c398e 9408 SvCUR_set(sv, p - SvPVX_const(sv));
58e33a90 9409 svix = osvix;
fb73857a 9410 continue; /* not "break" */
46fc3d4c 9411 }
9412
cc61b222
TS
9413 if (is_utf8 != has_utf8) {
9414 if (is_utf8) {
9415 if (SvCUR(sv))
9416 sv_utf8_upgrade(sv);
9417 }
9418 else {
9419 const STRLEN old_elen = elen;
9420 SV * const nsv = sv_2mortal(newSVpvn(eptr, elen));
9421 sv_utf8_upgrade(nsv);
9422 eptr = SvPVX_const(nsv);
9423 elen = SvCUR(nsv);
9424
9425 if (width) { /* fudge width (can't fudge elen) */
9426 width += elen - old_elen;
9427 }
9428 is_utf8 = TRUE;
9429 }
9430 }
9431
6c94ec8b 9432 have = esignlen + zeros + elen;
ed2b91d2
GA
9433 if (have < zeros)
9434 Perl_croak_nocontext(PL_memory_wrap);
6c94ec8b 9435
46fc3d4c 9436 need = (have > width ? have : width);
9437 gap = need - have;
9438
d2641cbd
PC
9439 if (need >= (((STRLEN)~0) - SvCUR(sv) - dotstrlen - 1))
9440 Perl_croak_nocontext(PL_memory_wrap);
b22c7a20 9441 SvGROW(sv, SvCUR(sv) + need + dotstrlen + 1);
46fc3d4c 9442 p = SvEND(sv);
9443 if (esignlen && fill == '0') {
53c1dcc0 9444 int i;
eb160463 9445 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 9446 *p++ = esignbuf[i];
9447 }
9448 if (gap && !left) {
9449 memset(p, fill, gap);
9450 p += gap;
9451 }
9452 if (esignlen && fill != '0') {
53c1dcc0 9453 int i;
eb160463 9454 for (i = 0; i < (int)esignlen; i++)
46fc3d4c 9455 *p++ = esignbuf[i];
9456 }
fc36a67e 9457 if (zeros) {
53c1dcc0 9458 int i;
fc36a67e 9459 for (i = zeros; i; i--)
9460 *p++ = '0';
9461 }
46fc3d4c 9462 if (elen) {
4459522c 9463 Copy(eptr, p, elen, char);
46fc3d4c 9464 p += elen;
9465 }
9466 if (gap && left) {
9467 memset(p, ' ', gap);
9468 p += gap;
9469 }
b22c7a20
GS
9470 if (vectorize) {
9471 if (veclen) {
4459522c 9472 Copy(dotstr, p, dotstrlen, char);
b22c7a20
GS
9473 p += dotstrlen;
9474 }
9475 else
9476 vectorize = FALSE; /* done iterating over vecstr */
9477 }
2cf2cfc6
A
9478 if (is_utf8)
9479 has_utf8 = TRUE;
9480 if (has_utf8)
7e2040f0 9481 SvUTF8_on(sv);
46fc3d4c 9482 *p = '\0';
3f7c398e 9483 SvCUR_set(sv, p - SvPVX_const(sv));
b22c7a20
GS
9484 if (vectorize) {
9485 esignlen = 0;
9486 goto vector;
9487 }
46fc3d4c 9488 }
9489}
51371543 9490
645c22ef
DM
9491/* =========================================================================
9492
9493=head1 Cloning an interpreter
9494
9495All the macros and functions in this section are for the private use of
9496the main function, perl_clone().
9497
9498The foo_dup() functions make an exact copy of an existing foo thinngy.
9499During the course of a cloning, a hash table is used to map old addresses
9500to new addresses. The table is created and manipulated with the
9501ptr_table_* functions.
9502
9503=cut
9504
9505============================================================================*/
9506
9507
1d7c1841
GS
9508#if defined(USE_ITHREADS)
9509
d4c19fe8 9510/* XXX Remove this so it doesn't have to go thru the macro and return for nothing */
1d7c1841
GS
9511#ifndef GpREFCNT_inc
9512# define GpREFCNT_inc(gp) ((gp) ? (++(gp)->gp_refcnt, (gp)) : (GP*)NULL)
9513#endif
9514
9515
a41cc44e 9516/* Certain cases in Perl_ss_dup have been merged, by relying on the fact
3e07292d
NC
9517 that currently av_dup, gv_dup and hv_dup are the same as sv_dup.
9518 If this changes, please unmerge ss_dup. */
d2d73c3e 9519#define sv_dup_inc(s,t) SvREFCNT_inc(sv_dup(s,t))
7f466ec7 9520#define sv_dup_inc_NN(s,t) SvREFCNT_inc_NN(sv_dup(s,t))
d2d73c3e
AB
9521#define av_dup(s,t) (AV*)sv_dup((SV*)s,t)
9522#define av_dup_inc(s,t) (AV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9523#define hv_dup(s,t) (HV*)sv_dup((SV*)s,t)
9524#define hv_dup_inc(s,t) (HV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9525#define cv_dup(s,t) (CV*)sv_dup((SV*)s,t)
9526#define cv_dup_inc(s,t) (CV*)SvREFCNT_inc(sv_dup((SV*)s,t))
9527#define io_dup(s,t) (IO*)sv_dup((SV*)s,t)
9528#define io_dup_inc(s,t) (IO*)SvREFCNT_inc(sv_dup((SV*)s,t))
9529#define gv_dup(s,t) (GV*)sv_dup((SV*)s,t)
9530#define gv_dup_inc(s,t) (GV*)SvREFCNT_inc(sv_dup((SV*)s,t))
6136c704
AL
9531#define SAVEPV(p) ((p) ? savepv(p) : NULL)
9532#define SAVEPVN(p,n) ((p) ? savepvn(p,n) : NULL)
8cf8f3d1 9533
199e78b7
DM
9534/* clone a parser */
9535
9536yy_parser *
9537Perl_parser_dup(pTHX_ const yy_parser *proto, CLONE_PARAMS* param)
9538{
9539 yy_parser *parser;
9540
9541 if (!proto)
9542 return NULL;
9543
7c197c94
DM
9544 /* look for it in the table first */
9545 parser = (yy_parser *)ptr_table_fetch(PL_ptr_table, proto);
9546 if (parser)
9547 return parser;
9548
9549 /* create anew and remember what it is */
199e78b7 9550 Newxz(parser, 1, yy_parser);
7c197c94 9551 ptr_table_store(PL_ptr_table, proto, parser);
199e78b7
DM
9552
9553 parser->yyerrstatus = 0;
9554 parser->yychar = YYEMPTY; /* Cause a token to be read. */
9555
9556 /* XXX these not yet duped */
9557 parser->old_parser = NULL;
9558 parser->stack = NULL;
9559 parser->ps = NULL;
9560 parser->stack_size = 0;
9561 /* XXX parser->stack->state = 0; */
9562
9563 /* XXX eventually, just Copy() most of the parser struct ? */
9564
9565 parser->lex_brackets = proto->lex_brackets;
9566 parser->lex_casemods = proto->lex_casemods;
9567 parser->lex_brackstack = savepvn(proto->lex_brackstack,
9568 (proto->lex_brackets < 120 ? 120 : proto->lex_brackets));
9569 parser->lex_casestack = savepvn(proto->lex_casestack,
9570 (proto->lex_casemods < 12 ? 12 : proto->lex_casemods));
9571 parser->lex_defer = proto->lex_defer;
9572 parser->lex_dojoin = proto->lex_dojoin;
9573 parser->lex_expect = proto->lex_expect;
9574 parser->lex_formbrack = proto->lex_formbrack;
9575 parser->lex_inpat = proto->lex_inpat;
9576 parser->lex_inwhat = proto->lex_inwhat;
9577 parser->lex_op = proto->lex_op;
9578 parser->lex_repl = sv_dup_inc(proto->lex_repl, param);
9579 parser->lex_starts = proto->lex_starts;
9580 parser->lex_stuff = sv_dup_inc(proto->lex_stuff, param);
9581 parser->multi_close = proto->multi_close;
9582 parser->multi_open = proto->multi_open;
9583 parser->multi_start = proto->multi_start;
670a9cb2 9584 parser->multi_end = proto->multi_end;
199e78b7
DM
9585 parser->pending_ident = proto->pending_ident;
9586 parser->preambled = proto->preambled;
9587 parser->sublex_info = proto->sublex_info; /* XXX not quite right */
bdc0bf6f 9588 parser->linestr = sv_dup_inc(proto->linestr, param);
53a7735b
DM
9589 parser->expect = proto->expect;
9590 parser->copline = proto->copline;
f06b5848 9591 parser->last_lop_op = proto->last_lop_op;
bc177e6b 9592 parser->lex_state = proto->lex_state;
2f9285f8 9593 parser->rsfp = fp_dup(proto->rsfp, '<', param);
5486870f
DM
9594 /* rsfp_filters entries have fake IoDIRP() */
9595 parser->rsfp_filters= av_dup_inc(proto->rsfp_filters, param);
12bd6ede
DM
9596 parser->in_my = proto->in_my;
9597 parser->in_my_stash = hv_dup(proto->in_my_stash, param);
13765c85 9598 parser->error_count = proto->error_count;
bc177e6b 9599
53a7735b 9600
f06b5848
DM
9601 parser->linestr = sv_dup_inc(proto->linestr, param);
9602
9603 {
1e05feb3
AL
9604 char * const ols = SvPVX(proto->linestr);
9605 char * const ls = SvPVX(parser->linestr);
f06b5848
DM
9606
9607 parser->bufptr = ls + (proto->bufptr >= ols ?
9608 proto->bufptr - ols : 0);
9609 parser->oldbufptr = ls + (proto->oldbufptr >= ols ?
9610 proto->oldbufptr - ols : 0);
9611 parser->oldoldbufptr= ls + (proto->oldoldbufptr >= ols ?
9612 proto->oldoldbufptr - ols : 0);
9613 parser->linestart = ls + (proto->linestart >= ols ?
9614 proto->linestart - ols : 0);
9615 parser->last_uni = ls + (proto->last_uni >= ols ?
9616 proto->last_uni - ols : 0);
9617 parser->last_lop = ls + (proto->last_lop >= ols ?
9618 proto->last_lop - ols : 0);
9619
9620 parser->bufend = ls + SvCUR(parser->linestr);
9621 }
199e78b7 9622
14047fc9
DM
9623 Copy(proto->tokenbuf, parser->tokenbuf, 256, char);
9624
2f9285f8 9625
199e78b7
DM
9626#ifdef PERL_MAD
9627 parser->endwhite = proto->endwhite;
9628 parser->faketokens = proto->faketokens;
9629 parser->lasttoke = proto->lasttoke;
9630 parser->nextwhite = proto->nextwhite;
9631 parser->realtokenstart = proto->realtokenstart;
9632 parser->skipwhite = proto->skipwhite;
9633 parser->thisclose = proto->thisclose;
9634 parser->thismad = proto->thismad;
9635 parser->thisopen = proto->thisopen;
9636 parser->thisstuff = proto->thisstuff;
9637 parser->thistoken = proto->thistoken;
9638 parser->thiswhite = proto->thiswhite;
fb205e7a
DM
9639
9640 Copy(proto->nexttoke, parser->nexttoke, 5, NEXTTOKE);
9641 parser->curforce = proto->curforce;
9642#else
9643 Copy(proto->nextval, parser->nextval, 5, YYSTYPE);
9644 Copy(proto->nexttype, parser->nexttype, 5, I32);
9645 parser->nexttoke = proto->nexttoke;
199e78b7
DM
9646#endif
9647 return parser;
9648}
9649
d2d73c3e 9650
d2d73c3e 9651/* duplicate a file handle */
645c22ef 9652
1d7c1841 9653PerlIO *
a8fc9800 9654Perl_fp_dup(pTHX_ PerlIO *fp, char type, CLONE_PARAMS *param)
1d7c1841
GS
9655{
9656 PerlIO *ret;
53c1dcc0
AL
9657
9658 PERL_UNUSED_ARG(type);
73d840c0 9659
1d7c1841
GS
9660 if (!fp)
9661 return (PerlIO*)NULL;
9662
9663 /* look for it in the table first */
9664 ret = (PerlIO*)ptr_table_fetch(PL_ptr_table, fp);
9665 if (ret)
9666 return ret;
9667
9668 /* create anew and remember what it is */
ecdeb87c 9669 ret = PerlIO_fdupopen(aTHX_ fp, param, PERLIO_DUP_CLONE);
1d7c1841
GS
9670 ptr_table_store(PL_ptr_table, fp, ret);
9671 return ret;
9672}
9673
645c22ef
DM
9674/* duplicate a directory handle */
9675
1d7c1841
GS
9676DIR *
9677Perl_dirp_dup(pTHX_ DIR *dp)
9678{
96a5add6 9679 PERL_UNUSED_CONTEXT;
1d7c1841
GS
9680 if (!dp)
9681 return (DIR*)NULL;
9682 /* XXX TODO */
9683 return dp;
9684}
9685
ff276b08 9686/* duplicate a typeglob */
645c22ef 9687
1d7c1841 9688GP *
a8fc9800 9689Perl_gp_dup(pTHX_ GP *gp, CLONE_PARAMS* param)
1d7c1841
GS
9690{
9691 GP *ret;
b37c2d43 9692
1d7c1841
GS
9693 if (!gp)
9694 return (GP*)NULL;
9695 /* look for it in the table first */
9696 ret = (GP*)ptr_table_fetch(PL_ptr_table, gp);
9697 if (ret)
9698 return ret;
9699
9700 /* create anew and remember what it is */
a02a5408 9701 Newxz(ret, 1, GP);
1d7c1841
GS
9702 ptr_table_store(PL_ptr_table, gp, ret);
9703
9704 /* clone */
9705 ret->gp_refcnt = 0; /* must be before any other dups! */
d2d73c3e
AB
9706 ret->gp_sv = sv_dup_inc(gp->gp_sv, param);
9707 ret->gp_io = io_dup_inc(gp->gp_io, param);
9708 ret->gp_form = cv_dup_inc(gp->gp_form, param);
9709 ret->gp_av = av_dup_inc(gp->gp_av, param);
9710 ret->gp_hv = hv_dup_inc(gp->gp_hv, param);
9711 ret->gp_egv = gv_dup(gp->gp_egv, param);/* GvEGV is not refcounted */
9712 ret->gp_cv = cv_dup_inc(gp->gp_cv, param);
1d7c1841 9713 ret->gp_cvgen = gp->gp_cvgen;
1d7c1841 9714 ret->gp_line = gp->gp_line;
f4890806 9715 ret->gp_file_hek = hek_dup(gp->gp_file_hek, param);
1d7c1841
GS
9716 return ret;
9717}
9718
645c22ef
DM
9719/* duplicate a chain of magic */
9720
1d7c1841 9721MAGIC *
a8fc9800 9722Perl_mg_dup(pTHX_ MAGIC *mg, CLONE_PARAMS* param)
1d7c1841 9723{
cb359b41
JH
9724 MAGIC *mgprev = (MAGIC*)NULL;
9725 MAGIC *mgret;
1d7c1841
GS
9726 if (!mg)
9727 return (MAGIC*)NULL;
9728 /* look for it in the table first */
9729 mgret = (MAGIC*)ptr_table_fetch(PL_ptr_table, mg);
9730 if (mgret)
9731 return mgret;
9732
9733 for (; mg; mg = mg->mg_moremagic) {
9734 MAGIC *nmg;
a02a5408 9735 Newxz(nmg, 1, MAGIC);
cb359b41 9736 if (mgprev)
1d7c1841 9737 mgprev->mg_moremagic = nmg;
cb359b41
JH
9738 else
9739 mgret = nmg;
1d7c1841
GS
9740 nmg->mg_virtual = mg->mg_virtual; /* XXX copy dynamic vtable? */
9741 nmg->mg_private = mg->mg_private;
9742 nmg->mg_type = mg->mg_type;
9743 nmg->mg_flags = mg->mg_flags;
14befaf4 9744 if (mg->mg_type == PERL_MAGIC_qr) {
f8149455 9745 nmg->mg_obj = (SV*)CALLREGDUPE((REGEXP*)mg->mg_obj, param);
1d7c1841 9746 }
05bd4103 9747 else if(mg->mg_type == PERL_MAGIC_backref) {
d7cbc7b5
NC
9748 /* The backref AV has its reference count deliberately bumped by
9749 1. */
9750 nmg->mg_obj = SvREFCNT_inc(av_dup_inc((AV*) mg->mg_obj, param));
05bd4103 9751 }
1d7c1841
GS
9752 else {
9753 nmg->mg_obj = (mg->mg_flags & MGf_REFCOUNTED)
d2d73c3e
AB
9754 ? sv_dup_inc(mg->mg_obj, param)
9755 : sv_dup(mg->mg_obj, param);
1d7c1841
GS
9756 }
9757 nmg->mg_len = mg->mg_len;
9758 nmg->mg_ptr = mg->mg_ptr; /* XXX random ptr? */
14befaf4 9759 if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
68795e93 9760 if (mg->mg_len > 0) {
1d7c1841 9761 nmg->mg_ptr = SAVEPVN(mg->mg_ptr, mg->mg_len);
14befaf4
DM
9762 if (mg->mg_type == PERL_MAGIC_overload_table &&
9763 AMT_AMAGIC((AMT*)mg->mg_ptr))
9764 {
c445ea15 9765 const AMT * const amtp = (AMT*)mg->mg_ptr;
0bcc34c2 9766 AMT * const namtp = (AMT*)nmg->mg_ptr;
1d7c1841
GS
9767 I32 i;
9768 for (i = 1; i < NofAMmeth; i++) {
d2d73c3e 9769 namtp->table[i] = cv_dup_inc(amtp->table[i], param);
1d7c1841
GS
9770 }
9771 }
9772 }
9773 else if (mg->mg_len == HEf_SVKEY)
d2d73c3e 9774 nmg->mg_ptr = (char*)sv_dup_inc((SV*)mg->mg_ptr, param);
1d7c1841 9775 }
68795e93
NIS
9776 if ((mg->mg_flags & MGf_DUP) && mg->mg_virtual && mg->mg_virtual->svt_dup) {
9777 CALL_FPTR(nmg->mg_virtual->svt_dup)(aTHX_ nmg, param);
9778 }
1d7c1841
GS
9779 mgprev = nmg;
9780 }
9781 return mgret;
9782}
9783
4674ade5
NC
9784#endif /* USE_ITHREADS */
9785
645c22ef
DM
9786/* create a new pointer-mapping table */
9787
1d7c1841
GS
9788PTR_TBL_t *
9789Perl_ptr_table_new(pTHX)
9790{
9791 PTR_TBL_t *tbl;
96a5add6
AL
9792 PERL_UNUSED_CONTEXT;
9793
a02a5408 9794 Newxz(tbl, 1, PTR_TBL_t);
1d7c1841
GS
9795 tbl->tbl_max = 511;
9796 tbl->tbl_items = 0;
a02a5408 9797 Newxz(tbl->tbl_ary, tbl->tbl_max + 1, PTR_TBL_ENT_t*);
1d7c1841
GS
9798 return tbl;
9799}
9800
7119fd33
NC
9801#define PTR_TABLE_HASH(ptr) \
9802 ((PTR2UV(ptr) >> 3) ^ (PTR2UV(ptr) >> (3 + 7)) ^ (PTR2UV(ptr) >> (3 + 17)))
134ca3d6 9803
93e68bfb
JC
9804/*
9805 we use the PTE_SVSLOT 'reservation' made above, both here (in the
9806 following define) and at call to new_body_inline made below in
9807 Perl_ptr_table_store()
9808 */
9809
9810#define del_pte(p) del_body_type(p, PTE_SVSLOT)
32e691d0 9811
645c22ef
DM
9812/* map an existing pointer using a table */
9813
7bf61b54 9814STATIC PTR_TBL_ENT_t *
b0e6ae5b 9815S_ptr_table_find(PTR_TBL_t *tbl, const void *sv) {
1d7c1841 9816 PTR_TBL_ENT_t *tblent;
4373e329 9817 const UV hash = PTR_TABLE_HASH(sv);
1d7c1841
GS
9818 assert(tbl);
9819 tblent = tbl->tbl_ary[hash & tbl->tbl_max];
9820 for (; tblent; tblent = tblent->next) {
9821 if (tblent->oldval == sv)
7bf61b54 9822 return tblent;
1d7c1841 9823 }
d4c19fe8 9824 return NULL;
7bf61b54
NC
9825}
9826
9827void *
9828Perl_ptr_table_fetch(pTHX_ PTR_TBL_t *tbl, const void *sv)
9829{
b0e6ae5b 9830 PTR_TBL_ENT_t const *const tblent = ptr_table_find(tbl, sv);
96a5add6 9831 PERL_UNUSED_CONTEXT;
d4c19fe8 9832 return tblent ? tblent->newval : NULL;
1d7c1841
GS
9833}
9834
645c22ef
DM
9835/* add a new entry to a pointer-mapping table */
9836
1d7c1841 9837void
44f8325f 9838Perl_ptr_table_store(pTHX_ PTR_TBL_t *tbl, const void *oldsv, void *newsv)
1d7c1841 9839{
0c9fdfe0 9840 PTR_TBL_ENT_t *tblent = ptr_table_find(tbl, oldsv);
96a5add6 9841 PERL_UNUSED_CONTEXT;
1d7c1841 9842
7bf61b54
NC
9843 if (tblent) {
9844 tblent->newval = newsv;
9845 } else {
9846 const UV entry = PTR_TABLE_HASH(oldsv) & tbl->tbl_max;
9847
d2a0f284
JC
9848 new_body_inline(tblent, PTE_SVSLOT);
9849
7bf61b54
NC
9850 tblent->oldval = oldsv;
9851 tblent->newval = newsv;
9852 tblent->next = tbl->tbl_ary[entry];
9853 tbl->tbl_ary[entry] = tblent;
9854 tbl->tbl_items++;
9855 if (tblent->next && tbl->tbl_items > tbl->tbl_max)
9856 ptr_table_split(tbl);
1d7c1841 9857 }
1d7c1841
GS
9858}
9859
645c22ef
DM
9860/* double the hash bucket size of an existing ptr table */
9861
1d7c1841
GS
9862void
9863Perl_ptr_table_split(pTHX_ PTR_TBL_t *tbl)
9864{
9865 PTR_TBL_ENT_t **ary = tbl->tbl_ary;
4373e329 9866 const UV oldsize = tbl->tbl_max + 1;
1d7c1841
GS
9867 UV newsize = oldsize * 2;
9868 UV i;
96a5add6 9869 PERL_UNUSED_CONTEXT;
1d7c1841
GS
9870
9871 Renew(ary, newsize, PTR_TBL_ENT_t*);
9872 Zero(&ary[oldsize], newsize-oldsize, PTR_TBL_ENT_t*);
9873 tbl->tbl_max = --newsize;
9874 tbl->tbl_ary = ary;
9875 for (i=0; i < oldsize; i++, ary++) {
9876 PTR_TBL_ENT_t **curentp, **entp, *ent;
9877 if (!*ary)
9878 continue;
9879 curentp = ary + oldsize;
9880 for (entp = ary, ent = *ary; ent; ent = *entp) {
134ca3d6 9881 if ((newsize & PTR_TABLE_HASH(ent->oldval)) != i) {
1d7c1841
GS
9882 *entp = ent->next;
9883 ent->next = *curentp;
9884 *curentp = ent;
9885 continue;
9886 }
9887 else
9888 entp = &ent->next;
9889 }
9890 }
9891}
9892
645c22ef
DM
9893/* remove all the entries from a ptr table */
9894
a0739874
DM
9895void
9896Perl_ptr_table_clear(pTHX_ PTR_TBL_t *tbl)
9897{
d5cefff9 9898 if (tbl && tbl->tbl_items) {
c445ea15 9899 register PTR_TBL_ENT_t * const * const array = tbl->tbl_ary;
d5cefff9 9900 UV riter = tbl->tbl_max;
a0739874 9901
d5cefff9
NC
9902 do {
9903 PTR_TBL_ENT_t *entry = array[riter];
ab1e7f95 9904
d5cefff9 9905 while (entry) {
00b6aa41 9906 PTR_TBL_ENT_t * const oentry = entry;
d5cefff9
NC
9907 entry = entry->next;
9908 del_pte(oentry);
9909 }
9910 } while (riter--);
a0739874 9911
d5cefff9
NC
9912 tbl->tbl_items = 0;
9913 }
a0739874
DM
9914}
9915
645c22ef
DM
9916/* clear and free a ptr table */
9917
a0739874
DM
9918void
9919Perl_ptr_table_free(pTHX_ PTR_TBL_t *tbl)
9920{
9921 if (!tbl) {
9922 return;
9923 }
9924 ptr_table_clear(tbl);
9925 Safefree(tbl->tbl_ary);
9926 Safefree(tbl);
9927}
9928
4674ade5 9929#if defined(USE_ITHREADS)
5bd07a3d 9930
83841fad 9931void
eb86f8b3 9932Perl_rvpv_dup(pTHX_ SV *dstr, const SV *sstr, CLONE_PARAMS* param)
83841fad
NIS
9933{
9934 if (SvROK(sstr)) {
b162af07
SP
9935 SvRV_set(dstr, SvWEAKREF(sstr)
9936 ? sv_dup(SvRV(sstr), param)
9937 : sv_dup_inc(SvRV(sstr), param));
f880fe2f 9938
83841fad 9939 }
3f7c398e 9940 else if (SvPVX_const(sstr)) {
83841fad
NIS
9941 /* Has something there */
9942 if (SvLEN(sstr)) {
68795e93 9943 /* Normal PV - clone whole allocated space */
3f7c398e 9944 SvPV_set(dstr, SAVEPVN(SvPVX_const(sstr), SvLEN(sstr)-1));
d3d0e6f1
NC
9945 if (SvREADONLY(sstr) && SvFAKE(sstr)) {
9946 /* Not that normal - actually sstr is copy on write.
9947 But we are a true, independant SV, so: */
9948 SvREADONLY_off(dstr);
9949 SvFAKE_off(dstr);
9950 }
68795e93 9951 }
83841fad
NIS
9952 else {
9953 /* Special case - not normally malloced for some reason */
f7877b28
NC
9954 if (isGV_with_GP(sstr)) {
9955 /* Don't need to do anything here. */
9956 }
9957 else if ((SvREADONLY(sstr) && SvFAKE(sstr))) {
ef10be65
NC
9958 /* A "shared" PV - clone it as "shared" PV */
9959 SvPV_set(dstr,
9960 HEK_KEY(hek_dup(SvSHARED_HEK_FROM_PV(SvPVX_const(sstr)),
9961 param)));
83841fad
NIS
9962 }
9963 else {
9964 /* Some other special case - random pointer */
f880fe2f 9965 SvPV_set(dstr, SvPVX(sstr));
d3d0e6f1 9966 }
83841fad
NIS
9967 }
9968 }
9969 else {
4608196e 9970 /* Copy the NULL */
f880fe2f 9971 if (SvTYPE(dstr) == SVt_RV)
b162af07 9972 SvRV_set(dstr, NULL);
f880fe2f 9973 else
6136c704 9974 SvPV_set(dstr, NULL);
83841fad
NIS
9975 }
9976}
9977
662fb8b2
NC
9978/* duplicate an SV of any type (including AV, HV etc) */
9979
1d7c1841 9980SV *
eb86f8b3 9981Perl_sv_dup(pTHX_ const SV *sstr, CLONE_PARAMS* param)
1d7c1841 9982{
27da23d5 9983 dVAR;
1d7c1841
GS
9984 SV *dstr;
9985
9986 if (!sstr || SvTYPE(sstr) == SVTYPEMASK)
6136c704 9987 return NULL;
1d7c1841
GS
9988 /* look for it in the table first */
9989 dstr = (SV*)ptr_table_fetch(PL_ptr_table, sstr);
9990 if (dstr)
9991 return dstr;
9992
0405e91e
AB
9993 if(param->flags & CLONEf_JOIN_IN) {
9994 /** We are joining here so we don't want do clone
9995 something that is bad **/
eb86f8b3
AL
9996 if (SvTYPE(sstr) == SVt_PVHV) {
9997 const char * const hvname = HvNAME_get(sstr);
9998 if (hvname)
9999 /** don't clone stashes if they already exist **/
10000 return (SV*)gv_stashpv(hvname,0);
0405e91e
AB
10001 }
10002 }
10003
1d7c1841
GS
10004 /* create anew and remember what it is */
10005 new_SV(dstr);
fd0854ff
DM
10006
10007#ifdef DEBUG_LEAKING_SCALARS
10008 dstr->sv_debug_optype = sstr->sv_debug_optype;
10009 dstr->sv_debug_line = sstr->sv_debug_line;
10010 dstr->sv_debug_inpad = sstr->sv_debug_inpad;
10011 dstr->sv_debug_cloned = 1;
fd0854ff 10012 dstr->sv_debug_file = savepv(sstr->sv_debug_file);
fd0854ff
DM
10013#endif
10014
1d7c1841
GS
10015 ptr_table_store(PL_ptr_table, sstr, dstr);
10016
10017 /* clone */
10018 SvFLAGS(dstr) = SvFLAGS(sstr);
10019 SvFLAGS(dstr) &= ~SVf_OOK; /* don't propagate OOK hack */
10020 SvREFCNT(dstr) = 0; /* must be before any other dups! */
10021
10022#ifdef DEBUGGING
3f7c398e 10023 if (SvANY(sstr) && PL_watch_pvx && SvPVX_const(sstr) == PL_watch_pvx)
1d7c1841 10024 PerlIO_printf(Perl_debug_log, "watch at %p hit, found string \"%s\"\n",
6c9570dc 10025 (void*)PL_watch_pvx, SvPVX_const(sstr));
1d7c1841
GS
10026#endif
10027
9660f481
DM
10028 /* don't clone objects whose class has asked us not to */
10029 if (SvOBJECT(sstr) && ! (SvFLAGS(SvSTASH(sstr)) & SVphv_CLONEABLE)) {
10030 SvFLAGS(dstr) &= ~SVTYPEMASK;
10031 SvOBJECT_off(dstr);
10032 return dstr;
10033 }
10034
1d7c1841
GS
10035 switch (SvTYPE(sstr)) {
10036 case SVt_NULL:
10037 SvANY(dstr) = NULL;
10038 break;
10039 case SVt_IV:
339049b0 10040 SvANY(dstr) = (XPVIV*)((char*)&(dstr->sv_u.svu_iv) - STRUCT_OFFSET(XPVIV, xiv_iv));
45977657 10041 SvIV_set(dstr, SvIVX(sstr));
1d7c1841
GS
10042 break;
10043 case SVt_NV:
10044 SvANY(dstr) = new_XNV();
9d6ce603 10045 SvNV_set(dstr, SvNVX(sstr));
1d7c1841
GS
10046 break;
10047 case SVt_RV:
339049b0 10048 SvANY(dstr) = &(dstr->sv_u.svu_rv);
83841fad 10049 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
1d7c1841 10050 break;
cecf5685 10051 /* case SVt_BIND: */
662fb8b2
NC
10052 default:
10053 {
10054 /* These are all the types that need complex bodies allocating. */
662fb8b2 10055 void *new_body;
2bcc16b3
NC
10056 const svtype sv_type = SvTYPE(sstr);
10057 const struct body_details *const sv_type_details
10058 = bodies_by_type + sv_type;
662fb8b2 10059
93e68bfb 10060 switch (sv_type) {
662fb8b2 10061 default:
bb263b4e 10062 Perl_croak(aTHX_ "Bizarre SvTYPE [%" IVdf "]", (IV)SvTYPE(sstr));
662fb8b2
NC
10063 break;
10064
662fb8b2
NC
10065 case SVt_PVGV:
10066 if (GvUNIQUE((GV*)sstr)) {
6f207bd3 10067 NOOP; /* Do sharing here, and fall through */
662fb8b2 10068 }
c22188b4
NC
10069 case SVt_PVIO:
10070 case SVt_PVFM:
10071 case SVt_PVHV:
10072 case SVt_PVAV:
662fb8b2 10073 case SVt_PVCV:
662fb8b2 10074 case SVt_PVLV:
662fb8b2 10075 case SVt_PVMG:
662fb8b2 10076 case SVt_PVNV:
662fb8b2 10077 case SVt_PVIV:
662fb8b2 10078 case SVt_PV:
d2a0f284 10079 assert(sv_type_details->body_size);
c22188b4 10080 if (sv_type_details->arena) {
d2a0f284 10081 new_body_inline(new_body, sv_type);
c22188b4 10082 new_body
b9502f15 10083 = (void*)((char*)new_body - sv_type_details->offset);
c22188b4
NC
10084 } else {
10085 new_body = new_NOARENA(sv_type_details);
10086 }
1d7c1841 10087 }
662fb8b2
NC
10088 assert(new_body);
10089 SvANY(dstr) = new_body;
10090
2bcc16b3 10091#ifndef PURIFY
b9502f15
NC
10092 Copy(((char*)SvANY(sstr)) + sv_type_details->offset,
10093 ((char*)SvANY(dstr)) + sv_type_details->offset,
f32993d6 10094 sv_type_details->copy, char);
2bcc16b3
NC
10095#else
10096 Copy(((char*)SvANY(sstr)),
10097 ((char*)SvANY(dstr)),
d2a0f284 10098 sv_type_details->body_size + sv_type_details->offset, char);
2bcc16b3 10099#endif
662fb8b2 10100
f7877b28
NC
10101 if (sv_type != SVt_PVAV && sv_type != SVt_PVHV
10102 && !isGV_with_GP(dstr))
662fb8b2
NC
10103 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
10104
10105 /* The Copy above means that all the source (unduplicated) pointers
10106 are now in the destination. We can check the flags and the
10107 pointers in either, but it's possible that there's less cache
10108 missing by always going for the destination.
10109 FIXME - instrument and check that assumption */
f32993d6 10110 if (sv_type >= SVt_PVMG) {
885ffcb3 10111 if ((sv_type == SVt_PVMG) && SvPAD_OUR(dstr)) {
73d95100 10112 SvOURSTASH_set(dstr, hv_dup_inc(SvOURSTASH(dstr), param));
e736a858 10113 } else if (SvMAGIC(dstr))
662fb8b2
NC
10114 SvMAGIC_set(dstr, mg_dup(SvMAGIC(dstr), param));
10115 if (SvSTASH(dstr))
10116 SvSTASH_set(dstr, hv_dup_inc(SvSTASH(dstr), param));
1d7c1841 10117 }
662fb8b2 10118
f32993d6
NC
10119 /* The cast silences a GCC warning about unhandled types. */
10120 switch ((int)sv_type) {
662fb8b2
NC
10121 case SVt_PV:
10122 break;
10123 case SVt_PVIV:
10124 break;
10125 case SVt_PVNV:
10126 break;
10127 case SVt_PVMG:
10128 break;
662fb8b2
NC
10129 case SVt_PVLV:
10130 /* XXX LvTARGOFF sometimes holds PMOP* when DEBUGGING */
10131 if (LvTYPE(dstr) == 't') /* for tie: unrefcnted fake (SV**) */
10132 LvTARG(dstr) = dstr;
10133 else if (LvTYPE(dstr) == 'T') /* for tie: fake HE */
10134 LvTARG(dstr) = (SV*)he_dup((HE*)LvTARG(dstr), 0, param);
10135 else
10136 LvTARG(dstr) = sv_dup_inc(LvTARG(dstr), param);
662fb8b2 10137 case SVt_PVGV:
cecf5685
NC
10138 if(isGV_with_GP(sstr)) {
10139 if (GvNAME_HEK(dstr))
10140 GvNAME_HEK(dstr) = hek_dup(GvNAME_HEK(dstr), param);
39cb70dc
NC
10141 /* Don't call sv_add_backref here as it's going to be
10142 created as part of the magic cloning of the symbol
10143 table. */
f7877b28
NC
10144 /* Danger Will Robinson - GvGP(dstr) isn't initialised
10145 at the point of this comment. */
39cb70dc 10146 GvSTASH(dstr) = hv_dup(GvSTASH(dstr), param);
f7877b28
NC
10147 GvGP(dstr) = gp_dup(GvGP(sstr), param);
10148 (void)GpREFCNT_inc(GvGP(dstr));
10149 } else
10150 Perl_rvpv_dup(aTHX_ dstr, sstr, param);
662fb8b2
NC
10151 break;
10152 case SVt_PVIO:
10153 IoIFP(dstr) = fp_dup(IoIFP(dstr), IoTYPE(dstr), param);
10154 if (IoOFP(dstr) == IoIFP(sstr))
10155 IoOFP(dstr) = IoIFP(dstr);
10156 else
10157 IoOFP(dstr) = fp_dup(IoOFP(dstr), IoTYPE(dstr), param);
5486870f 10158 /* PL_parser->rsfp_filters entries have fake IoDIRP() */
662fb8b2
NC
10159 if(IoFLAGS(dstr) & IOf_FAKE_DIRP) {
10160 /* I have no idea why fake dirp (rsfps)
10161 should be treated differently but otherwise
10162 we end up with leaks -- sky*/
10163 IoTOP_GV(dstr) = gv_dup_inc(IoTOP_GV(dstr), param);
10164 IoFMT_GV(dstr) = gv_dup_inc(IoFMT_GV(dstr), param);
10165 IoBOTTOM_GV(dstr) = gv_dup_inc(IoBOTTOM_GV(dstr), param);
10166 } else {
10167 IoTOP_GV(dstr) = gv_dup(IoTOP_GV(dstr), param);
10168 IoFMT_GV(dstr) = gv_dup(IoFMT_GV(dstr), param);
10169 IoBOTTOM_GV(dstr) = gv_dup(IoBOTTOM_GV(dstr), param);
100ce7e1
NC
10170 if (IoDIRP(dstr)) {
10171 IoDIRP(dstr) = dirp_dup(IoDIRP(dstr));
10172 } else {
6f207bd3 10173 NOOP;
100ce7e1
NC
10174 /* IoDIRP(dstr) is already a copy of IoDIRP(sstr) */
10175 }
662fb8b2
NC
10176 }
10177 IoTOP_NAME(dstr) = SAVEPV(IoTOP_NAME(dstr));
10178 IoFMT_NAME(dstr) = SAVEPV(IoFMT_NAME(dstr));
10179 IoBOTTOM_NAME(dstr) = SAVEPV(IoBOTTOM_NAME(dstr));
10180 break;
10181 case SVt_PVAV:
10182 if (AvARRAY((AV*)sstr)) {
10183 SV **dst_ary, **src_ary;
10184 SSize_t items = AvFILLp((AV*)sstr) + 1;
10185
10186 src_ary = AvARRAY((AV*)sstr);
a02a5408 10187 Newxz(dst_ary, AvMAX((AV*)sstr)+1, SV*);
662fb8b2 10188 ptr_table_store(PL_ptr_table, src_ary, dst_ary);
9c6bc640 10189 AvARRAY((AV*)dstr) = dst_ary;
662fb8b2
NC
10190 AvALLOC((AV*)dstr) = dst_ary;
10191 if (AvREAL((AV*)sstr)) {
10192 while (items-- > 0)
10193 *dst_ary++ = sv_dup_inc(*src_ary++, param);
10194 }
10195 else {
10196 while (items-- > 0)
10197 *dst_ary++ = sv_dup(*src_ary++, param);
10198 }
10199 items = AvMAX((AV*)sstr) - AvFILLp((AV*)sstr);
10200 while (items-- > 0) {
10201 *dst_ary++ = &PL_sv_undef;
10202 }
bfcb3514 10203 }
662fb8b2 10204 else {
9c6bc640 10205 AvARRAY((AV*)dstr) = NULL;
662fb8b2 10206 AvALLOC((AV*)dstr) = (SV**)NULL;
b79f7545 10207 }
662fb8b2
NC
10208 break;
10209 case SVt_PVHV:
7e265ef3
AL
10210 if (HvARRAY((HV*)sstr)) {
10211 STRLEN i = 0;
10212 const bool sharekeys = !!HvSHAREKEYS(sstr);
10213 XPVHV * const dxhv = (XPVHV*)SvANY(dstr);
10214 XPVHV * const sxhv = (XPVHV*)SvANY(sstr);
10215 char *darray;
10216 Newx(darray, PERL_HV_ARRAY_ALLOC_BYTES(dxhv->xhv_max+1)
10217 + (SvOOK(sstr) ? sizeof(struct xpvhv_aux) : 0),
10218 char);
10219 HvARRAY(dstr) = (HE**)darray;
10220 while (i <= sxhv->xhv_max) {
10221 const HE * const source = HvARRAY(sstr)[i];
10222 HvARRAY(dstr)[i] = source
10223 ? he_dup(source, sharekeys, param) : 0;
10224 ++i;
10225 }
10226 if (SvOOK(sstr)) {
10227 HEK *hvname;
10228 const struct xpvhv_aux * const saux = HvAUX(sstr);
10229 struct xpvhv_aux * const daux = HvAUX(dstr);
10230 /* This flag isn't copied. */
10231 /* SvOOK_on(hv) attacks the IV flags. */
10232 SvFLAGS(dstr) |= SVf_OOK;
10233
10234 hvname = saux->xhv_name;
10235 daux->xhv_name = hvname ? hek_dup(hvname, param) : hvname;
10236
10237 daux->xhv_riter = saux->xhv_riter;
10238 daux->xhv_eiter = saux->xhv_eiter
10239 ? he_dup(saux->xhv_eiter,
10240 (bool)!!HvSHAREKEYS(sstr), param) : 0;
10241 daux->xhv_backreferences =
10242 saux->xhv_backreferences
86f55936 10243 ? (AV*) SvREFCNT_inc(
7e265ef3 10244 sv_dup((SV*)saux->xhv_backreferences, param))
86f55936 10245 : 0;
e1a479c5
BB
10246
10247 daux->xhv_mro_meta = saux->xhv_mro_meta
10248 ? mro_meta_dup(saux->xhv_mro_meta, param)
10249 : 0;
10250
7e265ef3
AL
10251 /* Record stashes for possible cloning in Perl_clone(). */
10252 if (hvname)
10253 av_push(param->stashes, dstr);
662fb8b2 10254 }
662fb8b2 10255 }
7e265ef3 10256 else
797c7171 10257 HvARRAY((HV*)dstr) = NULL;
662fb8b2 10258 break;
662fb8b2 10259 case SVt_PVCV:
bb172083
NC
10260 if (!(param->flags & CLONEf_COPY_STACKS)) {
10261 CvDEPTH(dstr) = 0;
10262 }
10263 case SVt_PVFM:
662fb8b2
NC
10264 /* NOTE: not refcounted */
10265 CvSTASH(dstr) = hv_dup(CvSTASH(dstr), param);
10266 OP_REFCNT_LOCK;
d04ba589
NC
10267 if (!CvISXSUB(dstr))
10268 CvROOT(dstr) = OpREFCNT_inc(CvROOT(dstr));
662fb8b2 10269 OP_REFCNT_UNLOCK;
cfae286e 10270 if (CvCONST(dstr) && CvISXSUB(dstr)) {
662fb8b2
NC
10271 CvXSUBANY(dstr).any_ptr = GvUNIQUE(CvGV(dstr)) ?
10272 SvREFCNT_inc(CvXSUBANY(dstr).any_ptr) :
10273 sv_dup_inc((SV *)CvXSUBANY(dstr).any_ptr, param);
10274 }
10275 /* don't dup if copying back - CvGV isn't refcounted, so the
10276 * duped GV may never be freed. A bit of a hack! DAPM */
10277 CvGV(dstr) = (param->flags & CLONEf_JOIN_IN) ?
a0714e2c 10278 NULL : gv_dup(CvGV(dstr), param) ;
662fb8b2
NC
10279 PAD_DUP(CvPADLIST(dstr), CvPADLIST(sstr), param);
10280 CvOUTSIDE(dstr) =
10281 CvWEAKOUTSIDE(sstr)
10282 ? cv_dup( CvOUTSIDE(dstr), param)
10283 : cv_dup_inc(CvOUTSIDE(dstr), param);
aed2304a 10284 if (!CvISXSUB(dstr))
662fb8b2
NC
10285 CvFILE(dstr) = SAVEPV(CvFILE(dstr));
10286 break;
bfcb3514 10287 }
1d7c1841 10288 }
1d7c1841
GS
10289 }
10290
10291 if (SvOBJECT(dstr) && SvTYPE(dstr) != SVt_PVIO)
10292 ++PL_sv_objcount;
10293
10294 return dstr;
d2d73c3e 10295 }
1d7c1841 10296
645c22ef
DM
10297/* duplicate a context */
10298
1d7c1841 10299PERL_CONTEXT *
a8fc9800 10300Perl_cx_dup(pTHX_ PERL_CONTEXT *cxs, I32 ix, I32 max, CLONE_PARAMS* param)
1d7c1841
GS
10301{
10302 PERL_CONTEXT *ncxs;
10303
10304 if (!cxs)
10305 return (PERL_CONTEXT*)NULL;
10306
10307 /* look for it in the table first */
10308 ncxs = (PERL_CONTEXT*)ptr_table_fetch(PL_ptr_table, cxs);
10309 if (ncxs)
10310 return ncxs;
10311
10312 /* create anew and remember what it is */
a02a5408 10313 Newxz(ncxs, max + 1, PERL_CONTEXT);
1d7c1841
GS
10314 ptr_table_store(PL_ptr_table, cxs, ncxs);
10315
10316 while (ix >= 0) {
c445ea15
AL
10317 PERL_CONTEXT * const cx = &cxs[ix];
10318 PERL_CONTEXT * const ncx = &ncxs[ix];
1d7c1841
GS
10319 ncx->cx_type = cx->cx_type;
10320 if (CxTYPE(cx) == CXt_SUBST) {
10321 Perl_croak(aTHX_ "Cloning substitution context is unimplemented");
10322 }
10323 else {
10324 ncx->blk_oldsp = cx->blk_oldsp;
10325 ncx->blk_oldcop = cx->blk_oldcop;
1d7c1841
GS
10326 ncx->blk_oldmarksp = cx->blk_oldmarksp;
10327 ncx->blk_oldscopesp = cx->blk_oldscopesp;
10328 ncx->blk_oldpm = cx->blk_oldpm;
10329 ncx->blk_gimme = cx->blk_gimme;
10330 switch (CxTYPE(cx)) {
10331 case CXt_SUB:
10332 ncx->blk_sub.cv = (cx->blk_sub.olddepth == 0
d2d73c3e
AB
10333 ? cv_dup_inc(cx->blk_sub.cv, param)
10334 : cv_dup(cx->blk_sub.cv,param));
cc8d50a7 10335 ncx->blk_sub.argarray = (cx->blk_sub.hasargs
d2d73c3e 10336 ? av_dup_inc(cx->blk_sub.argarray, param)
7d49f689 10337 : NULL);
d2d73c3e 10338 ncx->blk_sub.savearray = av_dup_inc(cx->blk_sub.savearray, param);
1d7c1841 10339 ncx->blk_sub.olddepth = cx->blk_sub.olddepth;
cc8d50a7
NC
10340 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
10341 ncx->blk_sub.lval = cx->blk_sub.lval;
f39bc417 10342 ncx->blk_sub.retop = cx->blk_sub.retop;
d8d97e70
DM
10343 ncx->blk_sub.oldcomppad = (PAD*)ptr_table_fetch(PL_ptr_table,
10344 cx->blk_sub.oldcomppad);
1d7c1841
GS
10345 break;
10346 case CXt_EVAL:
10347 ncx->blk_eval.old_in_eval = cx->blk_eval.old_in_eval;
10348 ncx->blk_eval.old_op_type = cx->blk_eval.old_op_type;
b47cad08 10349 ncx->blk_eval.old_namesv = sv_dup_inc(cx->blk_eval.old_namesv, param);
1d7c1841 10350 ncx->blk_eval.old_eval_root = cx->blk_eval.old_eval_root;
d2d73c3e 10351 ncx->blk_eval.cur_text = sv_dup(cx->blk_eval.cur_text, param);
f39bc417 10352 ncx->blk_eval.retop = cx->blk_eval.retop;
1d7c1841
GS
10353 break;
10354 case CXt_LOOP:
10355 ncx->blk_loop.label = cx->blk_loop.label;
10356 ncx->blk_loop.resetsp = cx->blk_loop.resetsp;
022eaa24 10357 ncx->blk_loop.my_op = cx->blk_loop.my_op;
1d7c1841
GS
10358 ncx->blk_loop.iterdata = (CxPADLOOP(cx)
10359 ? cx->blk_loop.iterdata
d2d73c3e 10360 : gv_dup((GV*)cx->blk_loop.iterdata, param));
f3548bdc
DM
10361 ncx->blk_loop.oldcomppad
10362 = (PAD*)ptr_table_fetch(PL_ptr_table,
10363 cx->blk_loop.oldcomppad);
d2d73c3e
AB
10364 ncx->blk_loop.itersave = sv_dup_inc(cx->blk_loop.itersave, param);
10365 ncx->blk_loop.iterlval = sv_dup_inc(cx->blk_loop.iterlval, param);
10366 ncx->blk_loop.iterary = av_dup_inc(cx->blk_loop.iterary, param);
1d7c1841
GS
10367 ncx->blk_loop.iterix = cx->blk_loop.iterix;
10368 ncx->blk_loop.itermax = cx->blk_loop.itermax;
10369 break;
10370 case CXt_FORMAT:
d2d73c3e
AB
10371 ncx->blk_sub.cv = cv_dup(cx->blk_sub.cv, param);
10372 ncx->blk_sub.gv = gv_dup(cx->blk_sub.gv, param);
10373 ncx->blk_sub.dfoutgv = gv_dup_inc(cx->blk_sub.dfoutgv, param);
cc8d50a7 10374 ncx->blk_sub.hasargs = cx->blk_sub.hasargs;
f39bc417 10375 ncx->blk_sub.retop = cx->blk_sub.retop;
1d7c1841
GS
10376 break;
10377 case CXt_BLOCK:
10378 case CXt_NULL:
10379 break;
10380 }
10381 }
10382 --ix;
10383 }
10384 return ncxs;
10385}
10386
645c22ef
DM
10387/* duplicate a stack info structure */
10388
1d7c1841 10389PERL_SI *
a8fc9800 10390Perl_si_dup(pTHX_ PERL_SI *si, CLONE_PARAMS* param)
1d7c1841
GS
10391{
10392 PERL_SI *nsi;
10393
10394 if (!si)
10395 return (PERL_SI*)NULL;
10396
10397 /* look for it in the table first */
10398 nsi = (PERL_SI*)ptr_table_fetch(PL_ptr_table, si);
10399 if (nsi)
10400 return nsi;
10401
10402 /* create anew and remember what it is */
a02a5408 10403 Newxz(nsi, 1, PERL_SI);
1d7c1841
GS
10404 ptr_table_store(PL_ptr_table, si, nsi);
10405
d2d73c3e 10406 nsi->si_stack = av_dup_inc(si->si_stack, param);
1d7c1841
GS
10407 nsi->si_cxix = si->si_cxix;
10408 nsi->si_cxmax = si->si_cxmax;
d2d73c3e 10409 nsi->si_cxstack = cx_dup(si->si_cxstack, si->si_cxix, si->si_cxmax, param);
1d7c1841 10410 nsi->si_type = si->si_type;
d2d73c3e
AB
10411 nsi->si_prev = si_dup(si->si_prev, param);
10412 nsi->si_next = si_dup(si->si_next, param);
1d7c1841
GS
10413 nsi->si_markoff = si->si_markoff;
10414
10415 return nsi;
10416}
10417
10418#define POPINT(ss,ix) ((ss)[--(ix)].any_i32)
10419#define TOPINT(ss,ix) ((ss)[ix].any_i32)
10420#define POPLONG(ss,ix) ((ss)[--(ix)].any_long)
10421#define TOPLONG(ss,ix) ((ss)[ix].any_long)
10422#define POPIV(ss,ix) ((ss)[--(ix)].any_iv)
10423#define TOPIV(ss,ix) ((ss)[ix].any_iv)
38d8b13e
HS
10424#define POPBOOL(ss,ix) ((ss)[--(ix)].any_bool)
10425#define TOPBOOL(ss,ix) ((ss)[ix].any_bool)
1d7c1841
GS
10426#define POPPTR(ss,ix) ((ss)[--(ix)].any_ptr)
10427#define TOPPTR(ss,ix) ((ss)[ix].any_ptr)
10428#define POPDPTR(ss,ix) ((ss)[--(ix)].any_dptr)
10429#define TOPDPTR(ss,ix) ((ss)[ix].any_dptr)
10430#define POPDXPTR(ss,ix) ((ss)[--(ix)].any_dxptr)
10431#define TOPDXPTR(ss,ix) ((ss)[ix].any_dxptr)
10432
10433/* XXXXX todo */
10434#define pv_dup_inc(p) SAVEPV(p)
10435#define pv_dup(p) SAVEPV(p)
10436#define svp_dup_inc(p,pp) any_dup(p,pp)
10437
645c22ef
DM
10438/* map any object to the new equivent - either something in the
10439 * ptr table, or something in the interpreter structure
10440 */
10441
1d7c1841 10442void *
53c1dcc0 10443Perl_any_dup(pTHX_ void *v, const PerlInterpreter *proto_perl)
1d7c1841
GS
10444{
10445 void *ret;
10446
10447 if (!v)
10448 return (void*)NULL;
10449
10450 /* look for it in the table first */
10451 ret = ptr_table_fetch(PL_ptr_table, v);
10452 if (ret)
10453 return ret;
10454
10455 /* see if it is part of the interpreter structure */
10456 if (v >= (void*)proto_perl && v < (void*)(proto_perl+1))
acfe0abc 10457 ret = (void*)(((char*)aTHX) + (((char*)v) - (char*)proto_perl));
05ec9bb3 10458 else {
1d7c1841 10459 ret = v;
05ec9bb3 10460 }
1d7c1841
GS
10461
10462 return ret;
10463}
10464
645c22ef
DM
10465/* duplicate the save stack */
10466
1d7c1841 10467ANY *
a8fc9800 10468Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param)
1d7c1841 10469{
53d44271 10470 dVAR;
907b3e23
DM
10471 ANY * const ss = proto_perl->Isavestack;
10472 const I32 max = proto_perl->Isavestack_max;
10473 I32 ix = proto_perl->Isavestack_ix;
1d7c1841
GS
10474 ANY *nss;
10475 SV *sv;
10476 GV *gv;
10477 AV *av;
10478 HV *hv;
10479 void* ptr;
10480 int intval;
10481 long longval;
10482 GP *gp;
10483 IV iv;
b24356f5 10484 I32 i;
c4e33207 10485 char *c = NULL;
1d7c1841 10486 void (*dptr) (void*);
acfe0abc 10487 void (*dxptr) (pTHX_ void*);
1d7c1841 10488
a02a5408 10489 Newxz(nss, max, ANY);
1d7c1841
GS
10490
10491 while (ix > 0) {
b24356f5
NC
10492 const I32 type = POPINT(ss,ix);
10493 TOPINT(nss,ix) = type;
10494 switch (type) {
3e07292d
NC
10495 case SAVEt_HELEM: /* hash element */
10496 sv = (SV*)POPPTR(ss,ix);
10497 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
10498 /* fall through */
1d7c1841 10499 case SAVEt_ITEM: /* normal string */
a41cc44e 10500 case SAVEt_SV: /* scalar reference */
1d7c1841 10501 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10502 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
3e07292d
NC
10503 /* fall through */
10504 case SAVEt_FREESV:
10505 case SAVEt_MORTALIZESV:
1d7c1841 10506 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10507 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841 10508 break;
05ec9bb3
NIS
10509 case SAVEt_SHARED_PVREF: /* char* in shared space */
10510 c = (char*)POPPTR(ss,ix);
10511 TOPPTR(nss,ix) = savesharedpv(c);
10512 ptr = POPPTR(ss,ix);
10513 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10514 break;
1d7c1841
GS
10515 case SAVEt_GENERIC_SVREF: /* generic sv */
10516 case SAVEt_SVREF: /* scalar reference */
10517 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10518 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10519 ptr = POPPTR(ss,ix);
10520 TOPPTR(nss,ix) = svp_dup_inc((SV**)ptr, proto_perl);/* XXXXX */
10521 break;
a41cc44e 10522 case SAVEt_HV: /* hash reference */
1d7c1841 10523 case SAVEt_AV: /* array reference */
11b79775 10524 sv = (SV*) POPPTR(ss,ix);
337d28f5 10525 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
3e07292d
NC
10526 /* fall through */
10527 case SAVEt_COMPPAD:
10528 case SAVEt_NSTAB:
667e2948 10529 sv = (SV*) POPPTR(ss,ix);
3e07292d 10530 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
10531 break;
10532 case SAVEt_INT: /* int reference */
10533 ptr = POPPTR(ss,ix);
10534 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10535 intval = (int)POPINT(ss,ix);
10536 TOPINT(nss,ix) = intval;
10537 break;
10538 case SAVEt_LONG: /* long reference */
10539 ptr = POPPTR(ss,ix);
10540 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
3e07292d
NC
10541 /* fall through */
10542 case SAVEt_CLEARSV:
1d7c1841
GS
10543 longval = (long)POPLONG(ss,ix);
10544 TOPLONG(nss,ix) = longval;
10545 break;
10546 case SAVEt_I32: /* I32 reference */
10547 case SAVEt_I16: /* I16 reference */
10548 case SAVEt_I8: /* I8 reference */
88effcc9 10549 case SAVEt_COP_ARYBASE: /* call CopARYBASE_set */
1d7c1841
GS
10550 ptr = POPPTR(ss,ix);
10551 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
1ccabee8 10552 i = POPINT(ss,ix);
1d7c1841
GS
10553 TOPINT(nss,ix) = i;
10554 break;
10555 case SAVEt_IV: /* IV reference */
10556 ptr = POPPTR(ss,ix);
10557 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10558 iv = POPIV(ss,ix);
10559 TOPIV(nss,ix) = iv;
10560 break;
a41cc44e
NC
10561 case SAVEt_HPTR: /* HV* reference */
10562 case SAVEt_APTR: /* AV* reference */
1d7c1841
GS
10563 case SAVEt_SPTR: /* SV* reference */
10564 ptr = POPPTR(ss,ix);
10565 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10566 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10567 TOPPTR(nss,ix) = sv_dup(sv, param);
1d7c1841
GS
10568 break;
10569 case SAVEt_VPTR: /* random* reference */
10570 ptr = POPPTR(ss,ix);
10571 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10572 ptr = POPPTR(ss,ix);
10573 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10574 break;
b03d03b0 10575 case SAVEt_GENERIC_PVREF: /* generic char* */
1d7c1841
GS
10576 case SAVEt_PPTR: /* char* reference */
10577 ptr = POPPTR(ss,ix);
10578 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10579 c = (char*)POPPTR(ss,ix);
10580 TOPPTR(nss,ix) = pv_dup(c);
10581 break;
1d7c1841
GS
10582 case SAVEt_GP: /* scalar reference */
10583 gp = (GP*)POPPTR(ss,ix);
d2d73c3e 10584 TOPPTR(nss,ix) = gp = gp_dup(gp, param);
1d7c1841
GS
10585 (void)GpREFCNT_inc(gp);
10586 gv = (GV*)POPPTR(ss,ix);
2ed3c8fc 10587 TOPPTR(nss,ix) = gv_dup_inc(gv, param);
1d7c1841 10588 break;
1d7c1841
GS
10589 case SAVEt_FREEOP:
10590 ptr = POPPTR(ss,ix);
10591 if (ptr && (((OP*)ptr)->op_private & OPpREFCOUNTED)) {
10592 /* these are assumed to be refcounted properly */
53c1dcc0 10593 OP *o;
1d7c1841
GS
10594 switch (((OP*)ptr)->op_type) {
10595 case OP_LEAVESUB:
10596 case OP_LEAVESUBLV:
10597 case OP_LEAVEEVAL:
10598 case OP_LEAVE:
10599 case OP_SCOPE:
10600 case OP_LEAVEWRITE:
e977893f
GS
10601 TOPPTR(nss,ix) = ptr;
10602 o = (OP*)ptr;
d3c72c2a 10603 OP_REFCNT_LOCK;
594cd643 10604 (void) OpREFCNT_inc(o);
d3c72c2a 10605 OP_REFCNT_UNLOCK;
1d7c1841
GS
10606 break;
10607 default:
5f66b61c 10608 TOPPTR(nss,ix) = NULL;
1d7c1841
GS
10609 break;
10610 }
10611 }
10612 else
5f66b61c 10613 TOPPTR(nss,ix) = NULL;
1d7c1841
GS
10614 break;
10615 case SAVEt_FREEPV:
10616 c = (char*)POPPTR(ss,ix);
10617 TOPPTR(nss,ix) = pv_dup_inc(c);
10618 break;
1d7c1841
GS
10619 case SAVEt_DELETE:
10620 hv = (HV*)POPPTR(ss,ix);
d2d73c3e 10621 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
1d7c1841
GS
10622 c = (char*)POPPTR(ss,ix);
10623 TOPPTR(nss,ix) = pv_dup_inc(c);
3e07292d
NC
10624 /* fall through */
10625 case SAVEt_STACK_POS: /* Position on Perl stack */
1d7c1841
GS
10626 i = POPINT(ss,ix);
10627 TOPINT(nss,ix) = i;
10628 break;
10629 case SAVEt_DESTRUCTOR:
10630 ptr = POPPTR(ss,ix);
10631 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
10632 dptr = POPDPTR(ss,ix);
8141890a
JH
10633 TOPDPTR(nss,ix) = DPTR2FPTR(void (*)(void*),
10634 any_dup(FPTR2DPTR(void *, dptr),
10635 proto_perl));
1d7c1841
GS
10636 break;
10637 case SAVEt_DESTRUCTOR_X:
10638 ptr = POPPTR(ss,ix);
10639 TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */
10640 dxptr = POPDXPTR(ss,ix);
8141890a
JH
10641 TOPDXPTR(nss,ix) = DPTR2FPTR(void (*)(pTHX_ void*),
10642 any_dup(FPTR2DPTR(void *, dxptr),
10643 proto_perl));
1d7c1841
GS
10644 break;
10645 case SAVEt_REGCONTEXT:
10646 case SAVEt_ALLOC:
10647 i = POPINT(ss,ix);
10648 TOPINT(nss,ix) = i;
10649 ix -= i;
10650 break;
1d7c1841
GS
10651 case SAVEt_AELEM: /* array element */
10652 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10653 TOPPTR(nss,ix) = sv_dup_inc(sv, param);
1d7c1841
GS
10654 i = POPINT(ss,ix);
10655 TOPINT(nss,ix) = i;
10656 av = (AV*)POPPTR(ss,ix);
d2d73c3e 10657 TOPPTR(nss,ix) = av_dup_inc(av, param);
1d7c1841 10658 break;
1d7c1841
GS
10659 case SAVEt_OP:
10660 ptr = POPPTR(ss,ix);
10661 TOPPTR(nss,ix) = ptr;
10662 break;
10663 case SAVEt_HINTS:
10664 i = POPINT(ss,ix);
10665 TOPINT(nss,ix) = i;
b3ca2e83 10666 ptr = POPPTR(ss,ix);
080ac856 10667 if (ptr) {
7b6dd8c3 10668 HINTS_REFCNT_LOCK;
080ac856 10669 ((struct refcounted_he *)ptr)->refcounted_he_refcnt++;
7b6dd8c3
NC
10670 HINTS_REFCNT_UNLOCK;
10671 }
cbb1fbea 10672 TOPPTR(nss,ix) = ptr;
a8f8b6a7
NC
10673 if (i & HINT_LOCALIZE_HH) {
10674 hv = (HV*)POPPTR(ss,ix);
10675 TOPPTR(nss,ix) = hv_dup_inc(hv, param);
10676 }
1d7c1841 10677 break;
c3564e5c
GS
10678 case SAVEt_PADSV:
10679 longval = (long)POPLONG(ss,ix);
10680 TOPLONG(nss,ix) = longval;
10681 ptr = POPPTR(ss,ix);
10682 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
10683 sv = (SV*)POPPTR(ss,ix);
d2d73c3e 10684 TOPPTR(nss,ix) = sv_dup(sv, param);
c3564e5c 10685 break;
a1bb4754 10686 case SAVEt_BOOL:
38d8b13e 10687 ptr = POPPTR(ss,ix);
b9609c01 10688 TOPPTR(nss,ix) = any_dup(ptr, proto_perl);
38d8b13e 10689 longval = (long)POPBOOL(ss,ix);
b9609c01 10690 TOPBOOL(nss,ix) = (bool)longval;
a1bb4754 10691 break;
8bd2680e
MHM
10692 case SAVEt_SET_SVFLAGS:
10693 i = POPINT(ss,ix);
10694 TOPINT(nss,ix) = i;
10695 i = POPINT(ss,ix);
10696 TOPINT(nss,ix) = i;
10697 sv = (SV*)POPPTR(ss,ix);
10698 TOPPTR(nss,ix) = sv_dup(sv, param);
10699 break;
5bfb7d0e
NC
10700 case SAVEt_RE_STATE:
10701 {
10702 const struct re_save_state *const old_state
10703 = (struct re_save_state *)
10704 (ss + ix - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
10705 struct re_save_state *const new_state
10706 = (struct re_save_state *)
10707 (nss + ix - SAVESTACK_ALLOC_FOR_RE_SAVE_STATE);
10708
10709 Copy(old_state, new_state, 1, struct re_save_state);
10710 ix -= SAVESTACK_ALLOC_FOR_RE_SAVE_STATE;
10711
10712 new_state->re_state_bostr
10713 = pv_dup(old_state->re_state_bostr);
10714 new_state->re_state_reginput
10715 = pv_dup(old_state->re_state_reginput);
5bfb7d0e
NC
10716 new_state->re_state_regeol
10717 = pv_dup(old_state->re_state_regeol);
f0ab9afb
NC
10718 new_state->re_state_regoffs
10719 = (regexp_paren_pair*)
10720 any_dup(old_state->re_state_regoffs, proto_perl);
5bfb7d0e 10721 new_state->re_state_reglastparen
11b79775
DD
10722 = (U32*) any_dup(old_state->re_state_reglastparen,
10723 proto_perl);
5bfb7d0e 10724 new_state->re_state_reglastcloseparen
11b79775 10725 = (U32*)any_dup(old_state->re_state_reglastcloseparen,
5bfb7d0e 10726 proto_perl);
5bfb7d0e
NC
10727 /* XXX This just has to be broken. The old save_re_context
10728 code did SAVEGENERICPV(PL_reg_start_tmp);
10729 PL_reg_start_tmp is char **.
10730 Look above to what the dup code does for
10731 SAVEt_GENERIC_PVREF
10732 It can never have worked.
10733 So this is merely a faithful copy of the exiting bug: */
10734 new_state->re_state_reg_start_tmp
10735 = (char **) pv_dup((char *)
10736 old_state->re_state_reg_start_tmp);
10737 /* I assume that it only ever "worked" because no-one called
10738 (pseudo)fork while the regexp engine had re-entered itself.
10739 */
5bfb7d0e
NC
10740#ifdef PERL_OLD_COPY_ON_WRITE
10741 new_state->re_state_nrs
10742 = sv_dup(old_state->re_state_nrs, param);
10743#endif
10744 new_state->re_state_reg_magic
11b79775
DD
10745 = (MAGIC*) any_dup(old_state->re_state_reg_magic,
10746 proto_perl);
5bfb7d0e 10747 new_state->re_state_reg_oldcurpm
11b79775
DD
10748 = (PMOP*) any_dup(old_state->re_state_reg_oldcurpm,
10749 proto_perl);
5bfb7d0e 10750 new_state->re_state_reg_curpm
11b79775
DD
10751 = (PMOP*) any_dup(old_state->re_state_reg_curpm,
10752 proto_perl);
5bfb7d0e
NC
10753 new_state->re_state_reg_oldsaved
10754 = pv_dup(old_state->re_state_reg_oldsaved);
10755 new_state->re_state_reg_poscache
10756 = pv_dup(old_state->re_state_reg_poscache);
5bfb7d0e
NC
10757 new_state->re_state_reg_starttry
10758 = pv_dup(old_state->re_state_reg_starttry);
5bfb7d0e
NC
10759 break;
10760 }
68da3b2f
NC
10761 case SAVEt_COMPILE_WARNINGS:
10762 ptr = POPPTR(ss,ix);
10763 TOPPTR(nss,ix) = DUP_WARNINGS((STRLEN*)ptr);
7b6dd8c3 10764 break;
7c197c94
DM
10765 case SAVEt_PARSER:
10766 ptr = POPPTR(ss,ix);
456084a8 10767 TOPPTR(nss,ix) = parser_dup((const yy_parser*)ptr, param);
7c197c94 10768 break;
1d7c1841 10769 default:
147bc374
NC
10770 Perl_croak(aTHX_
10771 "panic: ss_dup inconsistency (%"IVdf")", (IV) type);
1d7c1841
GS
10772 }
10773 }
10774
bd81e77b
NC
10775 return nss;
10776}
10777
10778
10779/* if sv is a stash, call $class->CLONE_SKIP(), and set the SVphv_CLONEABLE
10780 * flag to the result. This is done for each stash before cloning starts,
10781 * so we know which stashes want their objects cloned */
10782
10783static void
10784do_mark_cloneable_stash(pTHX_ SV *sv)
10785{
10786 const HEK * const hvname = HvNAME_HEK((HV*)sv);
10787 if (hvname) {
10788 GV* const cloner = gv_fetchmethod_autoload((HV*)sv, "CLONE_SKIP", 0);
10789 SvFLAGS(sv) |= SVphv_CLONEABLE; /* clone objects by default */
10790 if (cloner && GvCV(cloner)) {
10791 dSP;
10792 UV status;
10793
10794 ENTER;
10795 SAVETMPS;
10796 PUSHMARK(SP);
10797 XPUSHs(sv_2mortal(newSVhek(hvname)));
10798 PUTBACK;
10799 call_sv((SV*)GvCV(cloner), G_SCALAR);
10800 SPAGAIN;
10801 status = POPu;
10802 PUTBACK;
10803 FREETMPS;
10804 LEAVE;
10805 if (status)
10806 SvFLAGS(sv) &= ~SVphv_CLONEABLE;
10807 }
10808 }
10809}
10810
10811
10812
10813/*
10814=for apidoc perl_clone
10815
10816Create and return a new interpreter by cloning the current one.
10817
10818perl_clone takes these flags as parameters:
10819
10820CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
10821without it we only clone the data and zero the stacks,
10822with it we copy the stacks and the new perl interpreter is
10823ready to run at the exact same point as the previous one.
10824The pseudo-fork code uses COPY_STACKS while the
878090d5 10825threads->create doesn't.
bd81e77b
NC
10826
10827CLONEf_KEEP_PTR_TABLE
10828perl_clone keeps a ptr_table with the pointer of the old
10829variable as a key and the new variable as a value,
10830this allows it to check if something has been cloned and not
10831clone it again but rather just use the value and increase the
10832refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
10833the ptr_table using the function
10834C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
10835reason to keep it around is if you want to dup some of your own
10836variable who are outside the graph perl scans, example of this
10837code is in threads.xs create
10838
10839CLONEf_CLONE_HOST
10840This is a win32 thing, it is ignored on unix, it tells perls
10841win32host code (which is c++) to clone itself, this is needed on
10842win32 if you want to run two threads at the same time,
10843if you just want to do some stuff in a separate perl interpreter
10844and then throw it away and return to the original one,
10845you don't need to do anything.
10846
10847=cut
10848*/
10849
10850/* XXX the above needs expanding by someone who actually understands it ! */
10851EXTERN_C PerlInterpreter *
10852perl_clone_host(PerlInterpreter* proto_perl, UV flags);
10853
10854PerlInterpreter *
10855perl_clone(PerlInterpreter *proto_perl, UV flags)
10856{
10857 dVAR;
10858#ifdef PERL_IMPLICIT_SYS
10859
10860 /* perlhost.h so we need to call into it
10861 to clone the host, CPerlHost should have a c interface, sky */
10862
10863 if (flags & CLONEf_CLONE_HOST) {
10864 return perl_clone_host(proto_perl,flags);
10865 }
10866 return perl_clone_using(proto_perl, flags,
10867 proto_perl->IMem,
10868 proto_perl->IMemShared,
10869 proto_perl->IMemParse,
10870 proto_perl->IEnv,
10871 proto_perl->IStdIO,
10872 proto_perl->ILIO,
10873 proto_perl->IDir,
10874 proto_perl->ISock,
10875 proto_perl->IProc);
10876}
10877
10878PerlInterpreter *
10879perl_clone_using(PerlInterpreter *proto_perl, UV flags,
10880 struct IPerlMem* ipM, struct IPerlMem* ipMS,
10881 struct IPerlMem* ipMP, struct IPerlEnv* ipE,
10882 struct IPerlStdIO* ipStd, struct IPerlLIO* ipLIO,
10883 struct IPerlDir* ipD, struct IPerlSock* ipS,
10884 struct IPerlProc* ipP)
10885{
10886 /* XXX many of the string copies here can be optimized if they're
10887 * constants; they need to be allocated as common memory and just
10888 * their pointers copied. */
10889
10890 IV i;
10891 CLONE_PARAMS clone_params;
5f66b61c 10892 CLONE_PARAMS* const param = &clone_params;
bd81e77b 10893
5f66b61c 10894 PerlInterpreter * const my_perl = (PerlInterpreter*)(*ipM->pMalloc)(ipM, sizeof(PerlInterpreter));
bd81e77b
NC
10895 /* for each stash, determine whether its objects should be cloned */
10896 S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
10897 PERL_SET_THX(my_perl);
10898
10899# ifdef DEBUGGING
7e337ee0 10900 PoisonNew(my_perl, 1, PerlInterpreter);
5f66b61c
AL
10901 PL_op = NULL;
10902 PL_curcop = NULL;
bd81e77b
NC
10903 PL_markstack = 0;
10904 PL_scopestack = 0;
10905 PL_savestack = 0;
10906 PL_savestack_ix = 0;
10907 PL_savestack_max = -1;
10908 PL_sig_pending = 0;
b8328dae 10909 PL_parser = NULL;
bd81e77b
NC
10910 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
10911# else /* !DEBUGGING */
10912 Zero(my_perl, 1, PerlInterpreter);
10913# endif /* DEBUGGING */
10914
10915 /* host pointers */
10916 PL_Mem = ipM;
10917 PL_MemShared = ipMS;
10918 PL_MemParse = ipMP;
10919 PL_Env = ipE;
10920 PL_StdIO = ipStd;
10921 PL_LIO = ipLIO;
10922 PL_Dir = ipD;
10923 PL_Sock = ipS;
10924 PL_Proc = ipP;
10925#else /* !PERL_IMPLICIT_SYS */
10926 IV i;
10927 CLONE_PARAMS clone_params;
10928 CLONE_PARAMS* param = &clone_params;
5f66b61c 10929 PerlInterpreter * const my_perl = (PerlInterpreter*)PerlMem_malloc(sizeof(PerlInterpreter));
bd81e77b
NC
10930 /* for each stash, determine whether its objects should be cloned */
10931 S_visit(proto_perl, do_mark_cloneable_stash, SVt_PVHV, SVTYPEMASK);
10932 PERL_SET_THX(my_perl);
10933
10934# ifdef DEBUGGING
7e337ee0 10935 PoisonNew(my_perl, 1, PerlInterpreter);
5f66b61c
AL
10936 PL_op = NULL;
10937 PL_curcop = NULL;
bd81e77b
NC
10938 PL_markstack = 0;
10939 PL_scopestack = 0;
10940 PL_savestack = 0;
10941 PL_savestack_ix = 0;
10942 PL_savestack_max = -1;
10943 PL_sig_pending = 0;
b8328dae 10944 PL_parser = NULL;
bd81e77b
NC
10945 Zero(&PL_debug_pad, 1, struct perl_debug_pad);
10946# else /* !DEBUGGING */
10947 Zero(my_perl, 1, PerlInterpreter);
10948# endif /* DEBUGGING */
10949#endif /* PERL_IMPLICIT_SYS */
10950 param->flags = flags;
10951 param->proto_perl = proto_perl;
10952
7cb608b5
NC
10953 INIT_TRACK_MEMPOOL(my_perl->Imemory_debug_header, my_perl);
10954
fdda85ca 10955 PL_body_arenas = NULL;
bd81e77b
NC
10956 Zero(&PL_body_roots, 1, PL_body_roots);
10957
10958 PL_nice_chunk = NULL;
10959 PL_nice_chunk_size = 0;
10960 PL_sv_count = 0;
10961 PL_sv_objcount = 0;
a0714e2c
SS
10962 PL_sv_root = NULL;
10963 PL_sv_arenaroot = NULL;
bd81e77b
NC
10964
10965 PL_debug = proto_perl->Idebug;
10966
10967 PL_hash_seed = proto_perl->Ihash_seed;
10968 PL_rehash_seed = proto_perl->Irehash_seed;
10969
10970#ifdef USE_REENTRANT_API
10971 /* XXX: things like -Dm will segfault here in perlio, but doing
10972 * PERL_SET_CONTEXT(proto_perl);
10973 * breaks too many other things
10974 */
10975 Perl_reentrant_init(aTHX);
10976#endif
10977
10978 /* create SV map for pointer relocation */
10979 PL_ptr_table = ptr_table_new();
10980
10981 /* initialize these special pointers as early as possible */
10982 SvANY(&PL_sv_undef) = NULL;
10983 SvREFCNT(&PL_sv_undef) = (~(U32)0)/2;
10984 SvFLAGS(&PL_sv_undef) = SVf_READONLY|SVt_NULL;
10985 ptr_table_store(PL_ptr_table, &proto_perl->Isv_undef, &PL_sv_undef);
10986
10987 SvANY(&PL_sv_no) = new_XPVNV();
10988 SvREFCNT(&PL_sv_no) = (~(U32)0)/2;
10989 SvFLAGS(&PL_sv_no) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
10990 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
bb7a0f54 10991 SvPV_set(&PL_sv_no, savepvn(PL_No, 0));
bd81e77b
NC
10992 SvCUR_set(&PL_sv_no, 0);
10993 SvLEN_set(&PL_sv_no, 1);
10994 SvIV_set(&PL_sv_no, 0);
10995 SvNV_set(&PL_sv_no, 0);
10996 ptr_table_store(PL_ptr_table, &proto_perl->Isv_no, &PL_sv_no);
10997
10998 SvANY(&PL_sv_yes) = new_XPVNV();
10999 SvREFCNT(&PL_sv_yes) = (~(U32)0)/2;
11000 SvFLAGS(&PL_sv_yes) = SVp_IOK|SVf_IOK|SVp_NOK|SVf_NOK
11001 |SVp_POK|SVf_POK|SVf_READONLY|SVt_PVNV;
bb7a0f54 11002 SvPV_set(&PL_sv_yes, savepvn(PL_Yes, 1));
bd81e77b
NC
11003 SvCUR_set(&PL_sv_yes, 1);
11004 SvLEN_set(&PL_sv_yes, 2);
11005 SvIV_set(&PL_sv_yes, 1);
11006 SvNV_set(&PL_sv_yes, 1);
11007 ptr_table_store(PL_ptr_table, &proto_perl->Isv_yes, &PL_sv_yes);
11008
11009 /* create (a non-shared!) shared string table */
11010 PL_strtab = newHV();
11011 HvSHAREKEYS_off(PL_strtab);
11012 hv_ksplit(PL_strtab, HvTOTALKEYS(proto_perl->Istrtab));
11013 ptr_table_store(PL_ptr_table, proto_perl->Istrtab, PL_strtab);
11014
11015 PL_compiling = proto_perl->Icompiling;
11016
11017 /* These two PVs will be free'd special way so must set them same way op.c does */
11018 PL_compiling.cop_stashpv = savesharedpv(PL_compiling.cop_stashpv);
11019 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_stashpv, PL_compiling.cop_stashpv);
11020
11021 PL_compiling.cop_file = savesharedpv(PL_compiling.cop_file);
11022 ptr_table_store(PL_ptr_table, proto_perl->Icompiling.cop_file, PL_compiling.cop_file);
11023
11024 ptr_table_store(PL_ptr_table, &proto_perl->Icompiling, &PL_compiling);
72dc9ed5 11025 PL_compiling.cop_warnings = DUP_WARNINGS(PL_compiling.cop_warnings);
c28fe1ec 11026 if (PL_compiling.cop_hints_hash) {
cbb1fbea 11027 HINTS_REFCNT_LOCK;
c28fe1ec 11028 PL_compiling.cop_hints_hash->refcounted_he_refcnt++;
cbb1fbea
NC
11029 HINTS_REFCNT_UNLOCK;
11030 }
907b3e23 11031 PL_curcop = (COP*)any_dup(proto_perl->Icurcop, proto_perl);
5892a4d4
NC
11032#ifdef PERL_DEBUG_READONLY_OPS
11033 PL_slabs = NULL;
11034 PL_slab_count = 0;
11035#endif
bd81e77b
NC
11036
11037 /* pseudo environmental stuff */
11038 PL_origargc = proto_perl->Iorigargc;
11039 PL_origargv = proto_perl->Iorigargv;
11040
11041 param->stashes = newAV(); /* Setup array of objects to call clone on */
11042
11043 /* Set tainting stuff before PerlIO_debug can possibly get called */
11044 PL_tainting = proto_perl->Itainting;
11045 PL_taint_warn = proto_perl->Itaint_warn;
11046
11047#ifdef PERLIO_LAYERS
11048 /* Clone PerlIO tables as soon as we can handle general xx_dup() */
11049 PerlIO_clone(aTHX_ proto_perl, param);
11050#endif
11051
11052 PL_envgv = gv_dup(proto_perl->Ienvgv, param);
11053 PL_incgv = gv_dup(proto_perl->Iincgv, param);
11054 PL_hintgv = gv_dup(proto_perl->Ihintgv, param);
11055 PL_origfilename = SAVEPV(proto_perl->Iorigfilename);
11056 PL_diehook = sv_dup_inc(proto_perl->Idiehook, param);
11057 PL_warnhook = sv_dup_inc(proto_perl->Iwarnhook, param);
11058
11059 /* switches */
11060 PL_minus_c = proto_perl->Iminus_c;
11061 PL_patchlevel = sv_dup_inc(proto_perl->Ipatchlevel, param);
11062 PL_localpatches = proto_perl->Ilocalpatches;
11063 PL_splitstr = proto_perl->Isplitstr;
11064 PL_preprocess = proto_perl->Ipreprocess;
11065 PL_minus_n = proto_perl->Iminus_n;
11066 PL_minus_p = proto_perl->Iminus_p;
11067 PL_minus_l = proto_perl->Iminus_l;
11068 PL_minus_a = proto_perl->Iminus_a;
bc9b29db 11069 PL_minus_E = proto_perl->Iminus_E;
bd81e77b
NC
11070 PL_minus_F = proto_perl->Iminus_F;
11071 PL_doswitches = proto_perl->Idoswitches;
11072 PL_dowarn = proto_perl->Idowarn;
11073 PL_doextract = proto_perl->Idoextract;
11074 PL_sawampersand = proto_perl->Isawampersand;
11075 PL_unsafe = proto_perl->Iunsafe;
11076 PL_inplace = SAVEPV(proto_perl->Iinplace);
11077 PL_e_script = sv_dup_inc(proto_perl->Ie_script, param);
11078 PL_perldb = proto_perl->Iperldb;
11079 PL_perl_destruct_level = proto_perl->Iperl_destruct_level;
11080 PL_exit_flags = proto_perl->Iexit_flags;
11081
11082 /* magical thingies */
11083 /* XXX time(&PL_basetime) when asked for? */
11084 PL_basetime = proto_perl->Ibasetime;
11085 PL_formfeed = sv_dup(proto_perl->Iformfeed, param);
11086
11087 PL_maxsysfd = proto_perl->Imaxsysfd;
bd81e77b
NC
11088 PL_statusvalue = proto_perl->Istatusvalue;
11089#ifdef VMS
11090 PL_statusvalue_vms = proto_perl->Istatusvalue_vms;
11091#else
11092 PL_statusvalue_posix = proto_perl->Istatusvalue_posix;
11093#endif
11094 PL_encoding = sv_dup(proto_perl->Iencoding, param);
11095
11096 sv_setpvn(PERL_DEBUG_PAD(0), "", 0); /* For regex debugging. */
11097 sv_setpvn(PERL_DEBUG_PAD(1), "", 0); /* ext/re needs these */
11098 sv_setpvn(PERL_DEBUG_PAD(2), "", 0); /* even without DEBUGGING. */
11099
84da74a7 11100
f9f4320a 11101 /* RE engine related */
84da74a7
YO
11102 Zero(&PL_reg_state, 1, struct re_save_state);
11103 PL_reginterp_cnt = 0;
11104 PL_regmatch_slab = NULL;
11105
bd81e77b
NC
11106 /* Clone the regex array */
11107 PL_regex_padav = newAV();
11108 {
11109 const I32 len = av_len((AV*)proto_perl->Iregex_padav);
7a5b473e 11110 SV* const * const regexen = AvARRAY((AV*)proto_perl->Iregex_padav);
bd81e77b 11111 IV i;
7f466ec7 11112 av_push(PL_regex_padav, sv_dup_inc_NN(regexen[0],param));
bd81e77b 11113 for(i = 1; i <= len; i++) {
7a5b473e
AL
11114 const SV * const regex = regexen[i];
11115 SV * const sv =
11116 SvREPADTMP(regex)
11117 ? sv_dup_inc(regex, param)
11118 : SvREFCNT_inc(
f8149455 11119 newSViv(PTR2IV(CALLREGDUPE(
7a5b473e
AL
11120 INT2PTR(REGEXP *, SvIVX(regex)), param))))
11121 ;
60790534
DM
11122 if (SvFLAGS(regex) & SVf_BREAK)
11123 SvFLAGS(sv) |= SVf_BREAK; /* unrefcnted PL_curpm */
7a5b473e 11124 av_push(PL_regex_padav, sv);
bd81e77b
NC
11125 }
11126 }
11127 PL_regex_pad = AvARRAY(PL_regex_padav);
11128
11129 /* shortcuts to various I/O objects */
11130 PL_stdingv = gv_dup(proto_perl->Istdingv, param);
11131 PL_stderrgv = gv_dup(proto_perl->Istderrgv, param);
11132 PL_defgv = gv_dup(proto_perl->Idefgv, param);
11133 PL_argvgv = gv_dup(proto_perl->Iargvgv, param);
11134 PL_argvoutgv = gv_dup(proto_perl->Iargvoutgv, param);
11135 PL_argvout_stack = av_dup_inc(proto_perl->Iargvout_stack, param);
1d7c1841 11136
bd81e77b
NC
11137 /* shortcuts to regexp stuff */
11138 PL_replgv = gv_dup(proto_perl->Ireplgv, param);
9660f481 11139
bd81e77b
NC
11140 /* shortcuts to misc objects */
11141 PL_errgv = gv_dup(proto_perl->Ierrgv, param);
9660f481 11142
bd81e77b
NC
11143 /* shortcuts to debugging objects */
11144 PL_DBgv = gv_dup(proto_perl->IDBgv, param);
11145 PL_DBline = gv_dup(proto_perl->IDBline, param);
11146 PL_DBsub = gv_dup(proto_perl->IDBsub, param);
11147 PL_DBsingle = sv_dup(proto_perl->IDBsingle, param);
11148 PL_DBtrace = sv_dup(proto_perl->IDBtrace, param);
11149 PL_DBsignal = sv_dup(proto_perl->IDBsignal, param);
bd81e77b 11150 PL_dbargs = av_dup(proto_perl->Idbargs, param);
9660f481 11151
bd81e77b 11152 /* symbol tables */
907b3e23
DM
11153 PL_defstash = hv_dup_inc(proto_perl->Idefstash, param);
11154 PL_curstash = hv_dup(proto_perl->Icurstash, param);
bd81e77b
NC
11155 PL_debstash = hv_dup(proto_perl->Idebstash, param);
11156 PL_globalstash = hv_dup(proto_perl->Iglobalstash, param);
11157 PL_curstname = sv_dup_inc(proto_perl->Icurstname, param);
11158
11159 PL_beginav = av_dup_inc(proto_perl->Ibeginav, param);
11160 PL_beginav_save = av_dup_inc(proto_perl->Ibeginav_save, param);
11161 PL_checkav_save = av_dup_inc(proto_perl->Icheckav_save, param);
3c10abe3
AG
11162 PL_unitcheckav = av_dup_inc(proto_perl->Iunitcheckav, param);
11163 PL_unitcheckav_save = av_dup_inc(proto_perl->Iunitcheckav_save, param);
bd81e77b
NC
11164 PL_endav = av_dup_inc(proto_perl->Iendav, param);
11165 PL_checkav = av_dup_inc(proto_perl->Icheckav, param);
11166 PL_initav = av_dup_inc(proto_perl->Iinitav, param);
11167
11168 PL_sub_generation = proto_perl->Isub_generation;
dd69841b 11169 PL_isarev = hv_dup_inc(proto_perl->Iisarev, param);
907b3e23 11170 PL_delayedisa = hv_dup_inc(proto_perl->Idelayedisa, param);
bd81e77b
NC
11171
11172 /* funky return mechanisms */
11173 PL_forkprocess = proto_perl->Iforkprocess;
11174
11175 /* subprocess state */
11176 PL_fdpid = av_dup_inc(proto_perl->Ifdpid, param);
11177
11178 /* internal state */
11179 PL_maxo = proto_perl->Imaxo;
11180 if (proto_perl->Iop_mask)
11181 PL_op_mask = SAVEPVN(proto_perl->Iop_mask, PL_maxo);
11182 else
bd61b366 11183 PL_op_mask = NULL;
bd81e77b
NC
11184 /* PL_asserting = proto_perl->Iasserting; */
11185
11186 /* current interpreter roots */
11187 PL_main_cv = cv_dup_inc(proto_perl->Imain_cv, param);
d3c72c2a 11188 OP_REFCNT_LOCK;
bd81e77b 11189 PL_main_root = OpREFCNT_inc(proto_perl->Imain_root);
d3c72c2a 11190 OP_REFCNT_UNLOCK;
bd81e77b
NC
11191 PL_main_start = proto_perl->Imain_start;
11192 PL_eval_root = proto_perl->Ieval_root;
11193 PL_eval_start = proto_perl->Ieval_start;
11194
11195 /* runtime control stuff */
11196 PL_curcopdb = (COP*)any_dup(proto_perl->Icurcopdb, proto_perl);
bd81e77b
NC
11197
11198 PL_filemode = proto_perl->Ifilemode;
11199 PL_lastfd = proto_perl->Ilastfd;
11200 PL_oldname = proto_perl->Ioldname; /* XXX not quite right */
11201 PL_Argv = NULL;
bd61b366 11202 PL_Cmd = NULL;
bd81e77b 11203 PL_gensym = proto_perl->Igensym;
bd81e77b
NC
11204 PL_preambleav = av_dup_inc(proto_perl->Ipreambleav, param);
11205 PL_laststatval = proto_perl->Ilaststatval;
11206 PL_laststype = proto_perl->Ilaststype;
a0714e2c 11207 PL_mess_sv = NULL;
bd81e77b
NC
11208
11209 PL_ors_sv = sv_dup_inc(proto_perl->Iors_sv, param);
11210
11211 /* interpreter atexit processing */
11212 PL_exitlistlen = proto_perl->Iexitlistlen;
11213 if (PL_exitlistlen) {
11214 Newx(PL_exitlist, PL_exitlistlen, PerlExitListEntry);
11215 Copy(proto_perl->Iexitlist, PL_exitlist, PL_exitlistlen, PerlExitListEntry);
9660f481 11216 }
bd81e77b
NC
11217 else
11218 PL_exitlist = (PerlExitListEntry*)NULL;
f16dd614
DM
11219
11220 PL_my_cxt_size = proto_perl->Imy_cxt_size;
4c901e72 11221 if (PL_my_cxt_size) {
f16dd614
DM
11222 Newx(PL_my_cxt_list, PL_my_cxt_size, void *);
11223 Copy(proto_perl->Imy_cxt_list, PL_my_cxt_list, PL_my_cxt_size, void *);
53d44271 11224#ifdef PERL_GLOBAL_STRUCT_PRIVATE
bae1192d 11225 Newx(PL_my_cxt_keys, PL_my_cxt_size, const char *);
53d44271
JH
11226 Copy(proto_perl->Imy_cxt_keys, PL_my_cxt_keys, PL_my_cxt_size, char *);
11227#endif
f16dd614 11228 }
53d44271 11229 else {
f16dd614 11230 PL_my_cxt_list = (void**)NULL;
53d44271 11231#ifdef PERL_GLOBAL_STRUCT_PRIVATE
bae1192d 11232 PL_my_cxt_keys = (const char**)NULL;
53d44271
JH
11233#endif
11234 }
bd81e77b
NC
11235 PL_modglobal = hv_dup_inc(proto_perl->Imodglobal, param);
11236 PL_custom_op_names = hv_dup_inc(proto_perl->Icustom_op_names,param);
11237 PL_custom_op_descs = hv_dup_inc(proto_perl->Icustom_op_descs,param);
11238
11239 PL_profiledata = NULL;
9660f481 11240
bd81e77b 11241 PL_compcv = cv_dup(proto_perl->Icompcv, param);
9660f481 11242
bd81e77b 11243 PAD_CLONE_VARS(proto_perl, param);
9660f481 11244
bd81e77b
NC
11245#ifdef HAVE_INTERP_INTERN
11246 sys_intern_dup(&proto_perl->Isys_intern, &PL_sys_intern);
11247#endif
645c22ef 11248
bd81e77b
NC
11249 /* more statics moved here */
11250 PL_generation = proto_perl->Igeneration;
11251 PL_DBcv = cv_dup(proto_perl->IDBcv, param);
645c22ef 11252
bd81e77b
NC
11253 PL_in_clean_objs = proto_perl->Iin_clean_objs;
11254 PL_in_clean_all = proto_perl->Iin_clean_all;
6a78b4db 11255
bd81e77b
NC
11256 PL_uid = proto_perl->Iuid;
11257 PL_euid = proto_perl->Ieuid;
11258 PL_gid = proto_perl->Igid;
11259 PL_egid = proto_perl->Iegid;
11260 PL_nomemok = proto_perl->Inomemok;
11261 PL_an = proto_perl->Ian;
11262 PL_evalseq = proto_perl->Ievalseq;
11263 PL_origenviron = proto_perl->Iorigenviron; /* XXX not quite right */
11264 PL_origalen = proto_perl->Iorigalen;
11265#ifdef PERL_USES_PL_PIDSTATUS
11266 PL_pidstatus = newHV(); /* XXX flag for cloning? */
11267#endif
11268 PL_osname = SAVEPV(proto_perl->Iosname);
11269 PL_sighandlerp = proto_perl->Isighandlerp;
6a78b4db 11270
bd81e77b 11271 PL_runops = proto_perl->Irunops;
6a78b4db 11272
bd81e77b
NC
11273#ifdef CSH
11274 PL_cshlen = proto_perl->Icshlen;
11275 PL_cshname = proto_perl->Icshname; /* XXX never deallocated */
11276#endif
645c22ef 11277
199e78b7
DM
11278 PL_parser = parser_dup(proto_perl->Iparser, param);
11279
bd81e77b
NC
11280 PL_subline = proto_perl->Isubline;
11281 PL_subname = sv_dup_inc(proto_perl->Isubname, param);
c43294b8 11282
bd81e77b
NC
11283#ifdef FCRYPT
11284 PL_cryptseen = proto_perl->Icryptseen;
11285#endif
1d7c1841 11286
bd81e77b 11287 PL_hints = proto_perl->Ihints;
1d7c1841 11288
bd81e77b 11289 PL_amagic_generation = proto_perl->Iamagic_generation;
d2d73c3e 11290
bd81e77b
NC
11291#ifdef USE_LOCALE_COLLATE
11292 PL_collation_ix = proto_perl->Icollation_ix;
11293 PL_collation_name = SAVEPV(proto_perl->Icollation_name);
11294 PL_collation_standard = proto_perl->Icollation_standard;
11295 PL_collxfrm_base = proto_perl->Icollxfrm_base;
11296 PL_collxfrm_mult = proto_perl->Icollxfrm_mult;
11297#endif /* USE_LOCALE_COLLATE */
1d7c1841 11298
bd81e77b
NC
11299#ifdef USE_LOCALE_NUMERIC
11300 PL_numeric_name = SAVEPV(proto_perl->Inumeric_name);
11301 PL_numeric_standard = proto_perl->Inumeric_standard;
11302 PL_numeric_local = proto_perl->Inumeric_local;
11303 PL_numeric_radix_sv = sv_dup_inc(proto_perl->Inumeric_radix_sv, param);
11304#endif /* !USE_LOCALE_NUMERIC */
1d7c1841 11305
bd81e77b
NC
11306 /* utf8 character classes */
11307 PL_utf8_alnum = sv_dup_inc(proto_perl->Iutf8_alnum, param);
11308 PL_utf8_alnumc = sv_dup_inc(proto_perl->Iutf8_alnumc, param);
11309 PL_utf8_ascii = sv_dup_inc(proto_perl->Iutf8_ascii, param);
11310 PL_utf8_alpha = sv_dup_inc(proto_perl->Iutf8_alpha, param);
11311 PL_utf8_space = sv_dup_inc(proto_perl->Iutf8_space, param);
11312 PL_utf8_cntrl = sv_dup_inc(proto_perl->Iutf8_cntrl, param);
11313 PL_utf8_graph = sv_dup_inc(proto_perl->Iutf8_graph, param);
11314 PL_utf8_digit = sv_dup_inc(proto_perl->Iutf8_digit, param);
11315 PL_utf8_upper = sv_dup_inc(proto_perl->Iutf8_upper, param);
11316 PL_utf8_lower = sv_dup_inc(proto_perl->Iutf8_lower, param);
11317 PL_utf8_print = sv_dup_inc(proto_perl->Iutf8_print, param);
11318 PL_utf8_punct = sv_dup_inc(proto_perl->Iutf8_punct, param);
11319 PL_utf8_xdigit = sv_dup_inc(proto_perl->Iutf8_xdigit, param);
11320 PL_utf8_mark = sv_dup_inc(proto_perl->Iutf8_mark, param);
11321 PL_utf8_toupper = sv_dup_inc(proto_perl->Iutf8_toupper, param);
11322 PL_utf8_totitle = sv_dup_inc(proto_perl->Iutf8_totitle, param);
11323 PL_utf8_tolower = sv_dup_inc(proto_perl->Iutf8_tolower, param);
11324 PL_utf8_tofold = sv_dup_inc(proto_perl->Iutf8_tofold, param);
11325 PL_utf8_idstart = sv_dup_inc(proto_perl->Iutf8_idstart, param);
11326 PL_utf8_idcont = sv_dup_inc(proto_perl->Iutf8_idcont, param);
1d7c1841 11327
bd81e77b
NC
11328 /* Did the locale setup indicate UTF-8? */
11329 PL_utf8locale = proto_perl->Iutf8locale;
11330 /* Unicode features (see perlrun/-C) */
11331 PL_unicode = proto_perl->Iunicode;
1d7c1841 11332
bd81e77b
NC
11333 /* Pre-5.8 signals control */
11334 PL_signals = proto_perl->Isignals;
1d7c1841 11335
bd81e77b
NC
11336 /* times() ticks per second */
11337 PL_clocktick = proto_perl->Iclocktick;
1d7c1841 11338
bd81e77b
NC
11339 /* Recursion stopper for PerlIO_find_layer */
11340 PL_in_load_module = proto_perl->Iin_load_module;
8df990a8 11341
bd81e77b
NC
11342 /* sort() routine */
11343 PL_sort_RealCmp = proto_perl->Isort_RealCmp;
e5dd39fc 11344
bd81e77b
NC
11345 /* Not really needed/useful since the reenrant_retint is "volatile",
11346 * but do it for consistency's sake. */
11347 PL_reentrant_retint = proto_perl->Ireentrant_retint;
1d7c1841 11348
bd81e77b
NC
11349 /* Hooks to shared SVs and locks. */
11350 PL_sharehook = proto_perl->Isharehook;
11351 PL_lockhook = proto_perl->Ilockhook;
11352 PL_unlockhook = proto_perl->Iunlockhook;
11353 PL_threadhook = proto_perl->Ithreadhook;
1d7c1841 11354
bd81e77b
NC
11355#ifdef THREADS_HAVE_PIDS
11356 PL_ppid = proto_perl->Ippid;
11357#endif
1d7c1841 11358
bd81e77b 11359 /* swatch cache */
5c284bb0 11360 PL_last_swash_hv = NULL; /* reinits on demand */
bd81e77b
NC
11361 PL_last_swash_klen = 0;
11362 PL_last_swash_key[0]= '\0';
11363 PL_last_swash_tmps = (U8*)NULL;
11364 PL_last_swash_slen = 0;
1d7c1841 11365
bd81e77b
NC
11366 PL_glob_index = proto_perl->Iglob_index;
11367 PL_srand_called = proto_perl->Isrand_called;
bd61b366 11368 PL_bitcount = NULL; /* reinits on demand */
05ec9bb3 11369
bd81e77b
NC
11370 if (proto_perl->Ipsig_pend) {
11371 Newxz(PL_psig_pend, SIG_SIZE, int);
11372 }
11373 else {
11374 PL_psig_pend = (int*)NULL;
11375 }
05ec9bb3 11376
bd81e77b
NC
11377 if (proto_perl->Ipsig_ptr) {
11378 Newxz(PL_psig_ptr, SIG_SIZE, SV*);
11379 Newxz(PL_psig_name, SIG_SIZE, SV*);
11380 for (i = 1; i < SIG_SIZE; i++) {
11381 PL_psig_ptr[i] = sv_dup_inc(proto_perl->Ipsig_ptr[i], param);
11382 PL_psig_name[i] = sv_dup_inc(proto_perl->Ipsig_name[i], param);
11383 }
11384 }
11385 else {
11386 PL_psig_ptr = (SV**)NULL;
11387 PL_psig_name = (SV**)NULL;
11388 }
05ec9bb3 11389
907b3e23 11390 /* intrpvar.h stuff */
1d7c1841 11391
bd81e77b
NC
11392 if (flags & CLONEf_COPY_STACKS) {
11393 /* next allocation will be PL_tmps_stack[PL_tmps_ix+1] */
907b3e23
DM
11394 PL_tmps_ix = proto_perl->Itmps_ix;
11395 PL_tmps_max = proto_perl->Itmps_max;
11396 PL_tmps_floor = proto_perl->Itmps_floor;
bd81e77b
NC
11397 Newxz(PL_tmps_stack, PL_tmps_max, SV*);
11398 i = 0;
11399 while (i <= PL_tmps_ix) {
907b3e23 11400 PL_tmps_stack[i] = sv_dup_inc(proto_perl->Itmps_stack[i], param);
bd81e77b
NC
11401 ++i;
11402 }
d2d73c3e 11403
bd81e77b 11404 /* next PUSHMARK() sets *(PL_markstack_ptr+1) */
907b3e23 11405 i = proto_perl->Imarkstack_max - proto_perl->Imarkstack;
bd81e77b 11406 Newxz(PL_markstack, i, I32);
907b3e23
DM
11407 PL_markstack_max = PL_markstack + (proto_perl->Imarkstack_max
11408 - proto_perl->Imarkstack);
11409 PL_markstack_ptr = PL_markstack + (proto_perl->Imarkstack_ptr
11410 - proto_perl->Imarkstack);
11411 Copy(proto_perl->Imarkstack, PL_markstack,
bd81e77b 11412 PL_markstack_ptr - PL_markstack + 1, I32);
d2d73c3e 11413
bd81e77b
NC
11414 /* next push_scope()/ENTER sets PL_scopestack[PL_scopestack_ix]
11415 * NOTE: unlike the others! */
907b3e23
DM
11416 PL_scopestack_ix = proto_perl->Iscopestack_ix;
11417 PL_scopestack_max = proto_perl->Iscopestack_max;
bd81e77b 11418 Newxz(PL_scopestack, PL_scopestack_max, I32);
907b3e23 11419 Copy(proto_perl->Iscopestack, PL_scopestack, PL_scopestack_ix, I32);
d419787a 11420
bd81e77b 11421 /* NOTE: si_dup() looks at PL_markstack */
907b3e23 11422 PL_curstackinfo = si_dup(proto_perl->Icurstackinfo, param);
d2d73c3e 11423
bd81e77b 11424 /* PL_curstack = PL_curstackinfo->si_stack; */
907b3e23
DM
11425 PL_curstack = av_dup(proto_perl->Icurstack, param);
11426 PL_mainstack = av_dup(proto_perl->Imainstack, param);
1d7c1841 11427
bd81e77b
NC
11428 /* next PUSHs() etc. set *(PL_stack_sp+1) */
11429 PL_stack_base = AvARRAY(PL_curstack);
907b3e23
DM
11430 PL_stack_sp = PL_stack_base + (proto_perl->Istack_sp
11431 - proto_perl->Istack_base);
bd81e77b 11432 PL_stack_max = PL_stack_base + AvMAX(PL_curstack);
1d7c1841 11433
bd81e77b
NC
11434 /* next SSPUSHFOO() sets PL_savestack[PL_savestack_ix]
11435 * NOTE: unlike the others! */
907b3e23
DM
11436 PL_savestack_ix = proto_perl->Isavestack_ix;
11437 PL_savestack_max = proto_perl->Isavestack_max;
bd81e77b
NC
11438 /*Newxz(PL_savestack, PL_savestack_max, ANY);*/
11439 PL_savestack = ss_dup(proto_perl, param);
11440 }
11441 else {
11442 init_stacks();
11443 ENTER; /* perl_destruct() wants to LEAVE; */
34394ecd
DM
11444
11445 /* although we're not duplicating the tmps stack, we should still
11446 * add entries for any SVs on the tmps stack that got cloned by a
11447 * non-refcount means (eg a temp in @_); otherwise they will be
11448 * orphaned
11449 */
907b3e23 11450 for (i = 0; i<= proto_perl->Itmps_ix; i++) {
6136c704 11451 SV * const nsv = (SV*)ptr_table_fetch(PL_ptr_table,
907b3e23 11452 proto_perl->Itmps_stack[i]);
34394ecd
DM
11453 if (nsv && !SvREFCNT(nsv)) {
11454 EXTEND_MORTAL(1);
b37c2d43 11455 PL_tmps_stack[++PL_tmps_ix] = SvREFCNT_inc_simple(nsv);
34394ecd
DM
11456 }
11457 }
bd81e77b 11458 }
1d7c1841 11459
907b3e23 11460 PL_start_env = proto_perl->Istart_env; /* XXXXXX */
bd81e77b 11461 PL_top_env = &PL_start_env;
1d7c1841 11462
907b3e23 11463 PL_op = proto_perl->Iop;
4a4c6fe3 11464
a0714e2c 11465 PL_Sv = NULL;
bd81e77b 11466 PL_Xpv = (XPV*)NULL;
907b3e23 11467 PL_na = proto_perl->Ina;
1fcf4c12 11468
907b3e23
DM
11469 PL_statbuf = proto_perl->Istatbuf;
11470 PL_statcache = proto_perl->Istatcache;
11471 PL_statgv = gv_dup(proto_perl->Istatgv, param);
11472 PL_statname = sv_dup_inc(proto_perl->Istatname, param);
bd81e77b 11473#ifdef HAS_TIMES
907b3e23 11474 PL_timesbuf = proto_perl->Itimesbuf;
bd81e77b 11475#endif
1d7c1841 11476
907b3e23
DM
11477 PL_tainted = proto_perl->Itainted;
11478 PL_curpm = proto_perl->Icurpm; /* XXX No PMOP ref count */
11479 PL_rs = sv_dup_inc(proto_perl->Irs, param);
11480 PL_last_in_gv = gv_dup(proto_perl->Ilast_in_gv, param);
11481 PL_ofs_sv = sv_dup_inc(proto_perl->Iofs_sv, param);
11482 PL_defoutgv = gv_dup_inc(proto_perl->Idefoutgv, param);
11483 PL_chopset = proto_perl->Ichopset; /* XXX never deallocated */
11484 PL_toptarget = sv_dup_inc(proto_perl->Itoptarget, param);
11485 PL_bodytarget = sv_dup_inc(proto_perl->Ibodytarget, param);
11486 PL_formtarget = sv_dup(proto_perl->Iformtarget, param);
11487
11488 PL_restartop = proto_perl->Irestartop;
11489 PL_in_eval = proto_perl->Iin_eval;
11490 PL_delaymagic = proto_perl->Idelaymagic;
11491 PL_dirty = proto_perl->Idirty;
11492 PL_localizing = proto_perl->Ilocalizing;
11493
11494 PL_errors = sv_dup_inc(proto_perl->Ierrors, param);
4608196e 11495 PL_hv_fetch_ent_mh = NULL;
907b3e23 11496 PL_modcount = proto_perl->Imodcount;
5f66b61c 11497 PL_lastgotoprobe = NULL;
907b3e23 11498 PL_dumpindent = proto_perl->Idumpindent;
1d7c1841 11499
907b3e23
DM
11500 PL_sortcop = (OP*)any_dup(proto_perl->Isortcop, proto_perl);
11501 PL_sortstash = hv_dup(proto_perl->Isortstash, param);
11502 PL_firstgv = gv_dup(proto_perl->Ifirstgv, param);
11503 PL_secondgv = gv_dup(proto_perl->Isecondgv, param);
bd61b366 11504 PL_efloatbuf = NULL; /* reinits on demand */
bd81e77b 11505 PL_efloatsize = 0; /* reinits on demand */
d2d73c3e 11506
bd81e77b 11507 /* regex stuff */
1d7c1841 11508
bd81e77b
NC
11509 PL_screamfirst = NULL;
11510 PL_screamnext = NULL;
11511 PL_maxscream = -1; /* reinits on demand */
a0714e2c 11512 PL_lastscream = NULL;
1d7c1841 11513
1d7c1841 11514
907b3e23 11515 PL_regdummy = proto_perl->Iregdummy;
bd81e77b
NC
11516 PL_colorset = 0; /* reinits PL_colors[] */
11517 /*PL_colors[6] = {0,0,0,0,0,0};*/
1d7c1841 11518
84da74a7 11519
1d7c1841 11520
bd81e77b 11521 /* Pluggable optimizer */
907b3e23 11522 PL_peepp = proto_perl->Ipeepp;
1d7c1841 11523
bd81e77b 11524 PL_stashcache = newHV();
1d7c1841 11525
b7185faf 11526 PL_watchaddr = (char **) ptr_table_fetch(PL_ptr_table,
907b3e23 11527 proto_perl->Iwatchaddr);
b7185faf
DM
11528 PL_watchok = PL_watchaddr ? * PL_watchaddr : NULL;
11529 if (PL_debug && PL_watchaddr) {
11530 PerlIO_printf(Perl_debug_log,
11531 "WATCHING: %"UVxf" cloned as %"UVxf" with value %"UVxf"\n",
907b3e23 11532 PTR2UV(proto_perl->Iwatchaddr), PTR2UV(PL_watchaddr),
b7185faf
DM
11533 PTR2UV(PL_watchok));
11534 }
11535
bd81e77b
NC
11536 if (!(flags & CLONEf_KEEP_PTR_TABLE)) {
11537 ptr_table_free(PL_ptr_table);
11538 PL_ptr_table = NULL;
11539 }
1d7c1841 11540
bd81e77b
NC
11541 /* Call the ->CLONE method, if it exists, for each of the stashes
11542 identified by sv_dup() above.
11543 */
11544 while(av_len(param->stashes) != -1) {
11545 HV* const stash = (HV*) av_shift(param->stashes);
11546 GV* const cloner = gv_fetchmethod_autoload(stash, "CLONE", 0);
11547 if (cloner && GvCV(cloner)) {
11548 dSP;
11549 ENTER;
11550 SAVETMPS;
11551 PUSHMARK(SP);
11552 XPUSHs(sv_2mortal(newSVhek(HvNAME_HEK(stash))));
11553 PUTBACK;
11554 call_sv((SV*)GvCV(cloner), G_DISCARD);
11555 FREETMPS;
11556 LEAVE;
11557 }
1d7c1841 11558 }
1d7c1841 11559
bd81e77b 11560 SvREFCNT_dec(param->stashes);
1d7c1841 11561
bd81e77b
NC
11562 /* orphaned? eg threads->new inside BEGIN or use */
11563 if (PL_compcv && ! SvREFCNT(PL_compcv)) {
b37c2d43 11564 SvREFCNT_inc_simple_void(PL_compcv);
bd81e77b
NC
11565 SAVEFREESV(PL_compcv);
11566 }
dd2155a4 11567
bd81e77b
NC
11568 return my_perl;
11569}
1d7c1841 11570
bd81e77b 11571#endif /* USE_ITHREADS */
1d7c1841 11572
bd81e77b
NC
11573/*
11574=head1 Unicode Support
1d7c1841 11575
bd81e77b 11576=for apidoc sv_recode_to_utf8
1d7c1841 11577
bd81e77b
NC
11578The encoding is assumed to be an Encode object, on entry the PV
11579of the sv is assumed to be octets in that encoding, and the sv
11580will be converted into Unicode (and UTF-8).
1d7c1841 11581
bd81e77b
NC
11582If the sv already is UTF-8 (or if it is not POK), or if the encoding
11583is not a reference, nothing is done to the sv. If the encoding is not
11584an C<Encode::XS> Encoding object, bad things will happen.
11585(See F<lib/encoding.pm> and L<Encode>).
1d7c1841 11586
bd81e77b 11587The PV of the sv is returned.
1d7c1841 11588
bd81e77b 11589=cut */
1d7c1841 11590
bd81e77b
NC
11591char *
11592Perl_sv_recode_to_utf8(pTHX_ SV *sv, SV *encoding)
11593{
11594 dVAR;
11595 if (SvPOK(sv) && !SvUTF8(sv) && !IN_BYTES && SvROK(encoding)) {
11596 SV *uni;
11597 STRLEN len;
11598 const char *s;
11599 dSP;
11600 ENTER;
11601 SAVETMPS;
11602 save_re_context();
11603 PUSHMARK(sp);
11604 EXTEND(SP, 3);
11605 XPUSHs(encoding);
11606 XPUSHs(sv);
11607/*
11608 NI-S 2002/07/09
11609 Passing sv_yes is wrong - it needs to be or'ed set of constants
11610 for Encode::XS, while UTf-8 decode (currently) assumes a true value means
11611 remove converted chars from source.
1d7c1841 11612
bd81e77b 11613 Both will default the value - let them.
1d7c1841 11614
bd81e77b
NC
11615 XPUSHs(&PL_sv_yes);
11616*/
11617 PUTBACK;
11618 call_method("decode", G_SCALAR);
11619 SPAGAIN;
11620 uni = POPs;
11621 PUTBACK;
11622 s = SvPV_const(uni, len);
11623 if (s != SvPVX_const(sv)) {
11624 SvGROW(sv, len + 1);
11625 Move(s, SvPVX(sv), len + 1, char);
11626 SvCUR_set(sv, len);
11627 }
11628 FREETMPS;
11629 LEAVE;
11630 SvUTF8_on(sv);
11631 return SvPVX(sv);
389edf32 11632 }
bd81e77b
NC
11633 return SvPOKp(sv) ? SvPVX(sv) : NULL;
11634}
1d7c1841 11635
bd81e77b
NC
11636/*
11637=for apidoc sv_cat_decode
1d7c1841 11638
bd81e77b
NC
11639The encoding is assumed to be an Encode object, the PV of the ssv is
11640assumed to be octets in that encoding and decoding the input starts
11641from the position which (PV + *offset) pointed to. The dsv will be
11642concatenated the decoded UTF-8 string from ssv. Decoding will terminate
11643when the string tstr appears in decoding output or the input ends on
11644the PV of the ssv. The value which the offset points will be modified
11645to the last input position on the ssv.
1d7c1841 11646
bd81e77b 11647Returns TRUE if the terminator was found, else returns FALSE.
1d7c1841 11648
bd81e77b
NC
11649=cut */
11650
11651bool
11652Perl_sv_cat_decode(pTHX_ SV *dsv, SV *encoding,
11653 SV *ssv, int *offset, char *tstr, int tlen)
11654{
11655 dVAR;
11656 bool ret = FALSE;
11657 if (SvPOK(ssv) && SvPOK(dsv) && SvROK(encoding) && offset) {
11658 SV *offsv;
11659 dSP;
11660 ENTER;
11661 SAVETMPS;
11662 save_re_context();
11663 PUSHMARK(sp);
11664 EXTEND(SP, 6);
11665 XPUSHs(encoding);
11666 XPUSHs(dsv);
11667 XPUSHs(ssv);
11668 XPUSHs(offsv = sv_2mortal(newSViv(*offset)));
11669 XPUSHs(sv_2mortal(newSVpvn(tstr, tlen)));
11670 PUTBACK;
11671 call_method("cat_decode", G_SCALAR);
11672 SPAGAIN;
11673 ret = SvTRUE(TOPs);
11674 *offset = SvIV(offsv);
11675 PUTBACK;
11676 FREETMPS;
11677 LEAVE;
389edf32 11678 }
bd81e77b
NC
11679 else
11680 Perl_croak(aTHX_ "Invalid argument to sv_cat_decode");
11681 return ret;
1d7c1841 11682
bd81e77b 11683}
1d7c1841 11684
bd81e77b
NC
11685/* ---------------------------------------------------------------------
11686 *
11687 * support functions for report_uninit()
11688 */
1d7c1841 11689
bd81e77b
NC
11690/* the maxiumum size of array or hash where we will scan looking
11691 * for the undefined element that triggered the warning */
1d7c1841 11692
bd81e77b 11693#define FUV_MAX_SEARCH_SIZE 1000
1d7c1841 11694
bd81e77b
NC
11695/* Look for an entry in the hash whose value has the same SV as val;
11696 * If so, return a mortal copy of the key. */
1d7c1841 11697
bd81e77b
NC
11698STATIC SV*
11699S_find_hash_subscript(pTHX_ HV *hv, SV* val)
11700{
11701 dVAR;
11702 register HE **array;
11703 I32 i;
6c3182a5 11704
bd81e77b
NC
11705 if (!hv || SvMAGICAL(hv) || !HvARRAY(hv) ||
11706 (HvTOTALKEYS(hv) > FUV_MAX_SEARCH_SIZE))
a0714e2c 11707 return NULL;
6c3182a5 11708
bd81e77b 11709 array = HvARRAY(hv);
6c3182a5 11710
bd81e77b
NC
11711 for (i=HvMAX(hv); i>0; i--) {
11712 register HE *entry;
11713 for (entry = array[i]; entry; entry = HeNEXT(entry)) {
11714 if (HeVAL(entry) != val)
11715 continue;
11716 if ( HeVAL(entry) == &PL_sv_undef ||
11717 HeVAL(entry) == &PL_sv_placeholder)
11718 continue;
11719 if (!HeKEY(entry))
a0714e2c 11720 return NULL;
bd81e77b
NC
11721 if (HeKLEN(entry) == HEf_SVKEY)
11722 return sv_mortalcopy(HeKEY_sv(entry));
11723 return sv_2mortal(newSVpvn(HeKEY(entry), HeKLEN(entry)));
11724 }
11725 }
a0714e2c 11726 return NULL;
bd81e77b 11727}
6c3182a5 11728
bd81e77b
NC
11729/* Look for an entry in the array whose value has the same SV as val;
11730 * If so, return the index, otherwise return -1. */
6c3182a5 11731
bd81e77b
NC
11732STATIC I32
11733S_find_array_subscript(pTHX_ AV *av, SV* val)
11734{
97aff369 11735 dVAR;
bd81e77b
NC
11736 if (!av || SvMAGICAL(av) || !AvARRAY(av) ||
11737 (AvFILLp(av) > FUV_MAX_SEARCH_SIZE))
11738 return -1;
57c6e6d2 11739
4a021917
AL
11740 if (val != &PL_sv_undef) {
11741 SV ** const svp = AvARRAY(av);
11742 I32 i;
11743
11744 for (i=AvFILLp(av); i>=0; i--)
11745 if (svp[i] == val)
11746 return i;
bd81e77b
NC
11747 }
11748 return -1;
11749}
15a5279a 11750
bd81e77b
NC
11751/* S_varname(): return the name of a variable, optionally with a subscript.
11752 * If gv is non-zero, use the name of that global, along with gvtype (one
11753 * of "$", "@", "%"); otherwise use the name of the lexical at pad offset
11754 * targ. Depending on the value of the subscript_type flag, return:
11755 */
bce260cd 11756
bd81e77b
NC
11757#define FUV_SUBSCRIPT_NONE 1 /* "@foo" */
11758#define FUV_SUBSCRIPT_ARRAY 2 /* "$foo[aindex]" */
11759#define FUV_SUBSCRIPT_HASH 3 /* "$foo{keyname}" */
11760#define FUV_SUBSCRIPT_WITHIN 4 /* "within @foo" */
bce260cd 11761
bd81e77b
NC
11762STATIC SV*
11763S_varname(pTHX_ GV *gv, const char gvtype, PADOFFSET targ,
11764 SV* keyname, I32 aindex, int subscript_type)
11765{
1d7c1841 11766
bd81e77b
NC
11767 SV * const name = sv_newmortal();
11768 if (gv) {
11769 char buffer[2];
11770 buffer[0] = gvtype;
11771 buffer[1] = 0;
1d7c1841 11772
bd81e77b 11773 /* as gv_fullname4(), but add literal '^' for $^FOO names */
66fe0623 11774
bd81e77b 11775 gv_fullname4(name, gv, buffer, 0);
1d7c1841 11776
bd81e77b
NC
11777 if ((unsigned int)SvPVX(name)[1] <= 26) {
11778 buffer[0] = '^';
11779 buffer[1] = SvPVX(name)[1] + 'A' - 1;
1d7c1841 11780
bd81e77b
NC
11781 /* Swap the 1 unprintable control character for the 2 byte pretty
11782 version - ie substr($name, 1, 1) = $buffer; */
11783 sv_insert(name, 1, 1, buffer, 2);
1d7c1841 11784 }
bd81e77b
NC
11785 }
11786 else {
289b91d9 11787 CV * const cv = find_runcv(NULL);
bd81e77b
NC
11788 SV *sv;
11789 AV *av;
1d7c1841 11790
bd81e77b 11791 if (!cv || !CvPADLIST(cv))
a0714e2c 11792 return NULL;
bd81e77b
NC
11793 av = (AV*)(*av_fetch(CvPADLIST(cv), 0, FALSE));
11794 sv = *av_fetch(av, targ, FALSE);
f8503592 11795 sv_setpvn(name, SvPV_nolen_const(sv), SvCUR(sv));
bd81e77b 11796 }
1d7c1841 11797
bd81e77b 11798 if (subscript_type == FUV_SUBSCRIPT_HASH) {
561b68a9 11799 SV * const sv = newSV(0);
bd81e77b
NC
11800 *SvPVX(name) = '$';
11801 Perl_sv_catpvf(aTHX_ name, "{%s}",
11802 pv_display(sv,SvPVX_const(keyname), SvCUR(keyname), 0, 32));
11803 SvREFCNT_dec(sv);
11804 }
11805 else if (subscript_type == FUV_SUBSCRIPT_ARRAY) {
11806 *SvPVX(name) = '$';
11807 Perl_sv_catpvf(aTHX_ name, "[%"IVdf"]", (IV)aindex);
11808 }
11809 else if (subscript_type == FUV_SUBSCRIPT_WITHIN)
89529cee 11810 Perl_sv_insert(aTHX_ name, 0, 0, STR_WITH_LEN("within "));
1d7c1841 11811
bd81e77b
NC
11812 return name;
11813}
1d7c1841 11814
1d7c1841 11815
bd81e77b
NC
11816/*
11817=for apidoc find_uninit_var
1d7c1841 11818
bd81e77b
NC
11819Find the name of the undefined variable (if any) that caused the operator o
11820to issue a "Use of uninitialized value" warning.
11821If match is true, only return a name if it's value matches uninit_sv.
11822So roughly speaking, if a unary operator (such as OP_COS) generates a
11823warning, then following the direct child of the op may yield an
11824OP_PADSV or OP_GV that gives the name of the undefined variable. On the
11825other hand, with OP_ADD there are two branches to follow, so we only print
11826the variable name if we get an exact match.
1d7c1841 11827
bd81e77b 11828The name is returned as a mortal SV.
1d7c1841 11829
bd81e77b
NC
11830Assumes that PL_op is the op that originally triggered the error, and that
11831PL_comppad/PL_curpad points to the currently executing pad.
1d7c1841 11832
bd81e77b
NC
11833=cut
11834*/
1d7c1841 11835
bd81e77b
NC
11836STATIC SV *
11837S_find_uninit_var(pTHX_ OP* obase, SV* uninit_sv, bool match)
11838{
11839 dVAR;
11840 SV *sv;
11841 AV *av;
11842 GV *gv;
11843 OP *o, *o2, *kid;
1d7c1841 11844
bd81e77b
NC
11845 if (!obase || (match && (!uninit_sv || uninit_sv == &PL_sv_undef ||
11846 uninit_sv == &PL_sv_placeholder)))
a0714e2c 11847 return NULL;
1d7c1841 11848
bd81e77b 11849 switch (obase->op_type) {
1d7c1841 11850
bd81e77b
NC
11851 case OP_RV2AV:
11852 case OP_RV2HV:
11853 case OP_PADAV:
11854 case OP_PADHV:
11855 {
11856 const bool pad = (obase->op_type == OP_PADAV || obase->op_type == OP_PADHV);
11857 const bool hash = (obase->op_type == OP_PADHV || obase->op_type == OP_RV2HV);
11858 I32 index = 0;
a0714e2c 11859 SV *keysv = NULL;
bd81e77b 11860 int subscript_type = FUV_SUBSCRIPT_WITHIN;
1d7c1841 11861
bd81e77b
NC
11862 if (pad) { /* @lex, %lex */
11863 sv = PAD_SVl(obase->op_targ);
a0714e2c 11864 gv = NULL;
bd81e77b
NC
11865 }
11866 else {
11867 if (cUNOPx(obase)->op_first->op_type == OP_GV) {
11868 /* @global, %global */
11869 gv = cGVOPx_gv(cUNOPx(obase)->op_first);
11870 if (!gv)
11871 break;
11872 sv = hash ? (SV*)GvHV(gv): (SV*)GvAV(gv);
11873 }
11874 else /* @{expr}, %{expr} */
11875 return find_uninit_var(cUNOPx(obase)->op_first,
11876 uninit_sv, match);
11877 }
1d7c1841 11878
bd81e77b
NC
11879 /* attempt to find a match within the aggregate */
11880 if (hash) {
d4c19fe8 11881 keysv = find_hash_subscript((HV*)sv, uninit_sv);
bd81e77b
NC
11882 if (keysv)
11883 subscript_type = FUV_SUBSCRIPT_HASH;
11884 }
11885 else {
e15d5972 11886 index = find_array_subscript((AV*)sv, uninit_sv);
bd81e77b
NC
11887 if (index >= 0)
11888 subscript_type = FUV_SUBSCRIPT_ARRAY;
11889 }
1d7c1841 11890
bd81e77b
NC
11891 if (match && subscript_type == FUV_SUBSCRIPT_WITHIN)
11892 break;
1d7c1841 11893
bd81e77b
NC
11894 return varname(gv, hash ? '%' : '@', obase->op_targ,
11895 keysv, index, subscript_type);
11896 }
1d7c1841 11897
bd81e77b
NC
11898 case OP_PADSV:
11899 if (match && PAD_SVl(obase->op_targ) != uninit_sv)
11900 break;
a0714e2c
SS
11901 return varname(NULL, '$', obase->op_targ,
11902 NULL, 0, FUV_SUBSCRIPT_NONE);
1d7c1841 11903
bd81e77b
NC
11904 case OP_GVSV:
11905 gv = cGVOPx_gv(obase);
11906 if (!gv || (match && GvSV(gv) != uninit_sv))
11907 break;
a0714e2c 11908 return varname(gv, '$', 0, NULL, 0, FUV_SUBSCRIPT_NONE);
1d7c1841 11909
bd81e77b
NC
11910 case OP_AELEMFAST:
11911 if (obase->op_flags & OPf_SPECIAL) { /* lexical array */
11912 if (match) {
11913 SV **svp;
11914 av = (AV*)PAD_SV(obase->op_targ);
11915 if (!av || SvRMAGICAL(av))
11916 break;
11917 svp = av_fetch(av, (I32)obase->op_private, FALSE);
11918 if (!svp || *svp != uninit_sv)
11919 break;
11920 }
a0714e2c
SS
11921 return varname(NULL, '$', obase->op_targ,
11922 NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
11923 }
11924 else {
11925 gv = cGVOPx_gv(obase);
11926 if (!gv)
11927 break;
11928 if (match) {
11929 SV **svp;
11930 av = GvAV(gv);
11931 if (!av || SvRMAGICAL(av))
11932 break;
11933 svp = av_fetch(av, (I32)obase->op_private, FALSE);
11934 if (!svp || *svp != uninit_sv)
11935 break;
11936 }
11937 return varname(gv, '$', 0,
a0714e2c 11938 NULL, (I32)obase->op_private, FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
11939 }
11940 break;
1d7c1841 11941
bd81e77b
NC
11942 case OP_EXISTS:
11943 o = cUNOPx(obase)->op_first;
11944 if (!o || o->op_type != OP_NULL ||
11945 ! (o->op_targ == OP_AELEM || o->op_targ == OP_HELEM))
11946 break;
11947 return find_uninit_var(cBINOPo->op_last, uninit_sv, match);
a2efc822 11948
bd81e77b
NC
11949 case OP_AELEM:
11950 case OP_HELEM:
11951 if (PL_op == obase)
11952 /* $a[uninit_expr] or $h{uninit_expr} */
11953 return find_uninit_var(cBINOPx(obase)->op_last, uninit_sv, match);
081fc587 11954
a0714e2c 11955 gv = NULL;
bd81e77b
NC
11956 o = cBINOPx(obase)->op_first;
11957 kid = cBINOPx(obase)->op_last;
8cf8f3d1 11958
bd81e77b 11959 /* get the av or hv, and optionally the gv */
a0714e2c 11960 sv = NULL;
bd81e77b
NC
11961 if (o->op_type == OP_PADAV || o->op_type == OP_PADHV) {
11962 sv = PAD_SV(o->op_targ);
11963 }
11964 else if ((o->op_type == OP_RV2AV || o->op_type == OP_RV2HV)
11965 && cUNOPo->op_first->op_type == OP_GV)
11966 {
11967 gv = cGVOPx_gv(cUNOPo->op_first);
11968 if (!gv)
11969 break;
11970 sv = o->op_type == OP_RV2HV ? (SV*)GvHV(gv) : (SV*)GvAV(gv);
11971 }
11972 if (!sv)
11973 break;
11974
11975 if (kid && kid->op_type == OP_CONST && SvOK(cSVOPx_sv(kid))) {
11976 /* index is constant */
11977 if (match) {
11978 if (SvMAGICAL(sv))
11979 break;
11980 if (obase->op_type == OP_HELEM) {
11981 HE* he = hv_fetch_ent((HV*)sv, cSVOPx_sv(kid), 0, 0);
11982 if (!he || HeVAL(he) != uninit_sv)
11983 break;
11984 }
11985 else {
00b6aa41 11986 SV * const * const svp = av_fetch((AV*)sv, SvIV(cSVOPx_sv(kid)), FALSE);
bd81e77b
NC
11987 if (!svp || *svp != uninit_sv)
11988 break;
11989 }
11990 }
11991 if (obase->op_type == OP_HELEM)
11992 return varname(gv, '%', o->op_targ,
11993 cSVOPx_sv(kid), 0, FUV_SUBSCRIPT_HASH);
11994 else
a0714e2c 11995 return varname(gv, '@', o->op_targ, NULL,
bd81e77b 11996 SvIV(cSVOPx_sv(kid)), FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
11997 }
11998 else {
11999 /* index is an expression;
12000 * attempt to find a match within the aggregate */
12001 if (obase->op_type == OP_HELEM) {
d4c19fe8 12002 SV * const keysv = find_hash_subscript((HV*)sv, uninit_sv);
bd81e77b
NC
12003 if (keysv)
12004 return varname(gv, '%', o->op_targ,
12005 keysv, 0, FUV_SUBSCRIPT_HASH);
12006 }
12007 else {
d4c19fe8 12008 const I32 index = find_array_subscript((AV*)sv, uninit_sv);
bd81e77b
NC
12009 if (index >= 0)
12010 return varname(gv, '@', o->op_targ,
a0714e2c 12011 NULL, index, FUV_SUBSCRIPT_ARRAY);
bd81e77b
NC
12012 }
12013 if (match)
12014 break;
12015 return varname(gv,
12016 (o->op_type == OP_PADAV || o->op_type == OP_RV2AV)
12017 ? '@' : '%',
a0714e2c 12018 o->op_targ, NULL, 0, FUV_SUBSCRIPT_WITHIN);
f284b03f 12019 }
bd81e77b 12020 break;
dc507217 12021
bd81e77b
NC
12022 case OP_AASSIGN:
12023 /* only examine RHS */
12024 return find_uninit_var(cBINOPx(obase)->op_first, uninit_sv, match);
6d26897e 12025
bd81e77b
NC
12026 case OP_OPEN:
12027 o = cUNOPx(obase)->op_first;
12028 if (o->op_type == OP_PUSHMARK)
12029 o = o->op_sibling;
1d7c1841 12030
bd81e77b
NC
12031 if (!o->op_sibling) {
12032 /* one-arg version of open is highly magical */
a0ae6670 12033
bd81e77b
NC
12034 if (o->op_type == OP_GV) { /* open FOO; */
12035 gv = cGVOPx_gv(o);
12036 if (match && GvSV(gv) != uninit_sv)
12037 break;
12038 return varname(gv, '$', 0,
a0714e2c 12039 NULL, 0, FUV_SUBSCRIPT_NONE);
bd81e77b
NC
12040 }
12041 /* other possibilities not handled are:
12042 * open $x; or open my $x; should return '${*$x}'
12043 * open expr; should return '$'.expr ideally
12044 */
12045 break;
12046 }
12047 goto do_op;
ccfc67b7 12048
bd81e77b
NC
12049 /* ops where $_ may be an implicit arg */
12050 case OP_TRANS:
12051 case OP_SUBST:
12052 case OP_MATCH:
12053 if ( !(obase->op_flags & OPf_STACKED)) {
12054 if (uninit_sv == ((obase->op_private & OPpTARGET_MY)
12055 ? PAD_SVl(obase->op_targ)
12056 : DEFSV))
12057 {
12058 sv = sv_newmortal();
12059 sv_setpvn(sv, "$_", 2);
12060 return sv;
12061 }
12062 }
12063 goto do_op;
9f4817db 12064
bd81e77b
NC
12065 case OP_PRTF:
12066 case OP_PRINT:
3ef1310e 12067 case OP_SAY:
bd81e77b
NC
12068 /* skip filehandle as it can't produce 'undef' warning */
12069 o = cUNOPx(obase)->op_first;
12070 if ((obase->op_flags & OPf_STACKED) && o->op_type == OP_PUSHMARK)
12071 o = o->op_sibling->op_sibling;
12072 goto do_op2;
9f4817db 12073
9f4817db 12074
bd81e77b
NC
12075 case OP_RV2SV:
12076 case OP_CUSTOM:
12077 case OP_ENTERSUB:
12078 match = 1; /* XS or custom code could trigger random warnings */
12079 goto do_op;
9f4817db 12080
bd81e77b
NC
12081 case OP_SCHOMP:
12082 case OP_CHOMP:
12083 if (SvROK(PL_rs) && uninit_sv == SvRV(PL_rs))
396482e1 12084 return sv_2mortal(newSVpvs("${$/}"));
5f66b61c 12085 /*FALLTHROUGH*/
5d170f3a 12086
bd81e77b
NC
12087 default:
12088 do_op:
12089 if (!(obase->op_flags & OPf_KIDS))
12090 break;
12091 o = cUNOPx(obase)->op_first;
12092
12093 do_op2:
12094 if (!o)
12095 break;
f9893866 12096
bd81e77b
NC
12097 /* if all except one arg are constant, or have no side-effects,
12098 * or are optimized away, then it's unambiguous */
5f66b61c 12099 o2 = NULL;
bd81e77b 12100 for (kid=o; kid; kid = kid->op_sibling) {
e15d5972
AL
12101 if (kid) {
12102 const OPCODE type = kid->op_type;
12103 if ( (type == OP_CONST && SvOK(cSVOPx_sv(kid)))
12104 || (type == OP_NULL && ! (kid->op_flags & OPf_KIDS))
12105 || (type == OP_PUSHMARK)
bd81e77b 12106 )
bd81e77b 12107 continue;
e15d5972 12108 }
bd81e77b 12109 if (o2) { /* more than one found */
5f66b61c 12110 o2 = NULL;
bd81e77b
NC
12111 break;
12112 }
12113 o2 = kid;
12114 }
12115 if (o2)
12116 return find_uninit_var(o2, uninit_sv, match);
7a5fa8a2 12117
bd81e77b
NC
12118 /* scan all args */
12119 while (o) {
12120 sv = find_uninit_var(o, uninit_sv, 1);
12121 if (sv)
12122 return sv;
12123 o = o->op_sibling;
d0063567 12124 }
bd81e77b 12125 break;
f9893866 12126 }
a0714e2c 12127 return NULL;
9f4817db
JH
12128}
12129
220e2d4e 12130
bd81e77b
NC
12131/*
12132=for apidoc report_uninit
68795e93 12133
bd81e77b 12134Print appropriate "Use of uninitialized variable" warning
220e2d4e 12135
bd81e77b
NC
12136=cut
12137*/
220e2d4e 12138
bd81e77b
NC
12139void
12140Perl_report_uninit(pTHX_ SV* uninit_sv)
220e2d4e 12141{
97aff369 12142 dVAR;
bd81e77b 12143 if (PL_op) {
a0714e2c 12144 SV* varname = NULL;
bd81e77b
NC
12145 if (uninit_sv) {
12146 varname = find_uninit_var(PL_op, uninit_sv,0);
12147 if (varname)
12148 sv_insert(varname, 0, 0, " ", 1);
12149 }
12150 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
12151 varname ? SvPV_nolen_const(varname) : "",
12152 " in ", OP_DESC(PL_op));
220e2d4e 12153 }
a73e8557 12154 else
bd81e77b
NC
12155 Perl_warner(aTHX_ packWARN(WARN_UNINITIALIZED), PL_warn_uninit,
12156 "", "", "");
220e2d4e 12157}
f9893866 12158
241d1a3b
NC
12159/*
12160 * Local variables:
12161 * c-indentation-style: bsd
12162 * c-basic-offset: 4
12163 * indent-tabs-mode: t
12164 * End:
12165 *
37442d52
RGS
12166 * ex: set ts=8 sts=4 sw=4 noet:
12167 */